diff options
author | Alex Deucher <alexdeucher@gmail.com> | 2014-04-11 11:21:50 -0400 |
---|---|---|
committer | Christian König <christian.koenig@amd.com> | 2014-04-17 07:59:51 -0400 |
commit | 277babc374f6ecab6af182554f5d9f35a7768755 (patch) | |
tree | 42a04a287ef21ba2d89a749bc2dc21ca4306b2f3 | |
parent | 1ebe92802eaf0569784dce843bc28a78842d236c (diff) |
drm/radeon: add support for newer mc ucode on CI (v2)
Fixes mclk stability on certain asics.
v2: print out mc firmware version used and size
bug:
https://bugs.freedesktop.org/show_bug.cgi?id=75992
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Cc: stable@vger.kernel.org
-rw-r--r-- | drivers/gpu/drm/radeon/cik.c | 26 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_ucode.h | 4 |
2 files changed, 20 insertions, 10 deletions
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c index 745143c2358f..7e430450bac0 100644 --- a/drivers/gpu/drm/radeon/cik.c +++ b/drivers/gpu/drm/radeon/cik.c | |||
@@ -38,6 +38,7 @@ MODULE_FIRMWARE("radeon/BONAIRE_me.bin"); | |||
38 | MODULE_FIRMWARE("radeon/BONAIRE_ce.bin"); | 38 | MODULE_FIRMWARE("radeon/BONAIRE_ce.bin"); |
39 | MODULE_FIRMWARE("radeon/BONAIRE_mec.bin"); | 39 | MODULE_FIRMWARE("radeon/BONAIRE_mec.bin"); |
40 | MODULE_FIRMWARE("radeon/BONAIRE_mc.bin"); | 40 | MODULE_FIRMWARE("radeon/BONAIRE_mc.bin"); |
41 | MODULE_FIRMWARE("radeon/BONAIRE_mc2.bin"); | ||
41 | MODULE_FIRMWARE("radeon/BONAIRE_rlc.bin"); | 42 | MODULE_FIRMWARE("radeon/BONAIRE_rlc.bin"); |
42 | MODULE_FIRMWARE("radeon/BONAIRE_sdma.bin"); | 43 | MODULE_FIRMWARE("radeon/BONAIRE_sdma.bin"); |
43 | MODULE_FIRMWARE("radeon/BONAIRE_smc.bin"); | 44 | MODULE_FIRMWARE("radeon/BONAIRE_smc.bin"); |
@@ -46,6 +47,7 @@ MODULE_FIRMWARE("radeon/HAWAII_me.bin"); | |||
46 | MODULE_FIRMWARE("radeon/HAWAII_ce.bin"); | 47 | MODULE_FIRMWARE("radeon/HAWAII_ce.bin"); |
47 | MODULE_FIRMWARE("radeon/HAWAII_mec.bin"); | 48 | MODULE_FIRMWARE("radeon/HAWAII_mec.bin"); |
48 | MODULE_FIRMWARE("radeon/HAWAII_mc.bin"); | 49 | MODULE_FIRMWARE("radeon/HAWAII_mc.bin"); |
50 | MODULE_FIRMWARE("radeon/HAWAII_mc2.bin"); | ||
49 | MODULE_FIRMWARE("radeon/HAWAII_rlc.bin"); | 51 | MODULE_FIRMWARE("radeon/HAWAII_rlc.bin"); |
50 | MODULE_FIRMWARE("radeon/HAWAII_sdma.bin"); | 52 | MODULE_FIRMWARE("radeon/HAWAII_sdma.bin"); |
51 | MODULE_FIRMWARE("radeon/HAWAII_smc.bin"); | 53 | MODULE_FIRMWARE("radeon/HAWAII_smc.bin"); |
@@ -1703,7 +1705,7 @@ int ci_mc_load_microcode(struct radeon_device *rdev) | |||
1703 | const __be32 *fw_data; | 1705 | const __be32 *fw_data; |
1704 | u32 running, blackout = 0; | 1706 | u32 running, blackout = 0; |
1705 | u32 *io_mc_regs; | 1707 | u32 *io_mc_regs; |
1706 | int i, ucode_size, regs_size; | 1708 | int i, regs_size, ucode_size = rdev->mc_fw->size / 4; |
1707 | 1709 | ||
1708 | if (!rdev->mc_fw) | 1710 | if (!rdev->mc_fw) |
1709 | return -EINVAL; | 1711 | return -EINVAL; |
@@ -1711,12 +1713,10 @@ int ci_mc_load_microcode(struct radeon_device *rdev) | |||
1711 | switch (rdev->family) { | 1713 | switch (rdev->family) { |
1712 | case CHIP_BONAIRE: | 1714 | case CHIP_BONAIRE: |
1713 | io_mc_regs = (u32 *)&bonaire_io_mc_regs; | 1715 | io_mc_regs = (u32 *)&bonaire_io_mc_regs; |
1714 | ucode_size = CIK_MC_UCODE_SIZE; | ||
1715 | regs_size = BONAIRE_IO_MC_REGS_SIZE; | 1716 | regs_size = BONAIRE_IO_MC_REGS_SIZE; |
1716 | break; | 1717 | break; |
1717 | case CHIP_HAWAII: | 1718 | case CHIP_HAWAII: |
1718 | io_mc_regs = (u32 *)&hawaii_io_mc_regs; | 1719 | io_mc_regs = (u32 *)&hawaii_io_mc_regs; |
1719 | ucode_size = HAWAII_MC_UCODE_SIZE; | ||
1720 | regs_size = HAWAII_IO_MC_REGS_SIZE; | 1720 | regs_size = HAWAII_IO_MC_REGS_SIZE; |
1721 | break; | 1721 | break; |
1722 | default: | 1722 | default: |
@@ -1783,7 +1783,7 @@ static int cik_init_microcode(struct radeon_device *rdev) | |||
1783 | const char *chip_name; | 1783 | const char *chip_name; |
1784 | size_t pfp_req_size, me_req_size, ce_req_size, | 1784 | size_t pfp_req_size, me_req_size, ce_req_size, |
1785 | mec_req_size, rlc_req_size, mc_req_size = 0, | 1785 | mec_req_size, rlc_req_size, mc_req_size = 0, |
1786 | sdma_req_size, smc_req_size = 0; | 1786 | sdma_req_size, smc_req_size = 0, mc2_req_size = 0; |
1787 | char fw_name[30]; | 1787 | char fw_name[30]; |
1788 | int err; | 1788 | int err; |
1789 | 1789 | ||
@@ -1797,7 +1797,8 @@ static int cik_init_microcode(struct radeon_device *rdev) | |||
1797 | ce_req_size = CIK_CE_UCODE_SIZE * 4; | 1797 | ce_req_size = CIK_CE_UCODE_SIZE * 4; |
1798 | mec_req_size = CIK_MEC_UCODE_SIZE * 4; | 1798 | mec_req_size = CIK_MEC_UCODE_SIZE * 4; |
1799 | rlc_req_size = BONAIRE_RLC_UCODE_SIZE * 4; | 1799 | rlc_req_size = BONAIRE_RLC_UCODE_SIZE * 4; |
1800 | mc_req_size = CIK_MC_UCODE_SIZE * 4; | 1800 | mc_req_size = BONAIRE_MC_UCODE_SIZE * 4; |
1801 | mc2_req_size = BONAIRE_MC2_UCODE_SIZE * 4; | ||
1801 | sdma_req_size = CIK_SDMA_UCODE_SIZE * 4; | 1802 | sdma_req_size = CIK_SDMA_UCODE_SIZE * 4; |
1802 | smc_req_size = ALIGN(BONAIRE_SMC_UCODE_SIZE, 4); | 1803 | smc_req_size = ALIGN(BONAIRE_SMC_UCODE_SIZE, 4); |
1803 | break; | 1804 | break; |
@@ -1809,6 +1810,7 @@ static int cik_init_microcode(struct radeon_device *rdev) | |||
1809 | mec_req_size = CIK_MEC_UCODE_SIZE * 4; | 1810 | mec_req_size = CIK_MEC_UCODE_SIZE * 4; |
1810 | rlc_req_size = BONAIRE_RLC_UCODE_SIZE * 4; | 1811 | rlc_req_size = BONAIRE_RLC_UCODE_SIZE * 4; |
1811 | mc_req_size = HAWAII_MC_UCODE_SIZE * 4; | 1812 | mc_req_size = HAWAII_MC_UCODE_SIZE * 4; |
1813 | mc2_req_size = HAWAII_MC2_UCODE_SIZE * 4; | ||
1812 | sdma_req_size = CIK_SDMA_UCODE_SIZE * 4; | 1814 | sdma_req_size = CIK_SDMA_UCODE_SIZE * 4; |
1813 | smc_req_size = ALIGN(HAWAII_SMC_UCODE_SIZE, 4); | 1815 | smc_req_size = ALIGN(HAWAII_SMC_UCODE_SIZE, 4); |
1814 | break; | 1816 | break; |
@@ -1904,16 +1906,22 @@ static int cik_init_microcode(struct radeon_device *rdev) | |||
1904 | 1906 | ||
1905 | /* No SMC, MC ucode on APUs */ | 1907 | /* No SMC, MC ucode on APUs */ |
1906 | if (!(rdev->flags & RADEON_IS_IGP)) { | 1908 | if (!(rdev->flags & RADEON_IS_IGP)) { |
1907 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name); | 1909 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc2.bin", chip_name); |
1908 | err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev); | 1910 | err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev); |
1909 | if (err) | 1911 | if (err) { |
1910 | goto out; | 1912 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name); |
1911 | if (rdev->mc_fw->size != mc_req_size) { | 1913 | err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev); |
1914 | if (err) | ||
1915 | goto out; | ||
1916 | } | ||
1917 | if ((rdev->mc_fw->size != mc_req_size) && | ||
1918 | (rdev->mc_fw->size != mc2_req_size)){ | ||
1912 | printk(KERN_ERR | 1919 | printk(KERN_ERR |
1913 | "cik_mc: Bogus length %zu in firmware \"%s\"\n", | 1920 | "cik_mc: Bogus length %zu in firmware \"%s\"\n", |
1914 | rdev->mc_fw->size, fw_name); | 1921 | rdev->mc_fw->size, fw_name); |
1915 | err = -EINVAL; | 1922 | err = -EINVAL; |
1916 | } | 1923 | } |
1924 | DRM_INFO("%s: %zu bytes\n", fw_name, rdev->mc_fw->size); | ||
1917 | 1925 | ||
1918 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name); | 1926 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name); |
1919 | err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev); | 1927 | err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev); |
diff --git a/drivers/gpu/drm/radeon/radeon_ucode.h b/drivers/gpu/drm/radeon/radeon_ucode.h index f4155484b395..58d12938c0b8 100644 --- a/drivers/gpu/drm/radeon/radeon_ucode.h +++ b/drivers/gpu/drm/radeon/radeon_ucode.h | |||
@@ -61,8 +61,10 @@ | |||
61 | #define PITCAIRN_MC_UCODE_SIZE 7775 | 61 | #define PITCAIRN_MC_UCODE_SIZE 7775 |
62 | #define VERDE_MC_UCODE_SIZE 7875 | 62 | #define VERDE_MC_UCODE_SIZE 7875 |
63 | #define OLAND_MC_UCODE_SIZE 7863 | 63 | #define OLAND_MC_UCODE_SIZE 7863 |
64 | #define CIK_MC_UCODE_SIZE 7866 | 64 | #define BONAIRE_MC_UCODE_SIZE 7866 |
65 | #define BONAIRE_MC2_UCODE_SIZE 7948 | ||
65 | #define HAWAII_MC_UCODE_SIZE 7933 | 66 | #define HAWAII_MC_UCODE_SIZE 7933 |
67 | #define HAWAII_MC2_UCODE_SIZE 8091 | ||
66 | 68 | ||
67 | /* SDMA */ | 69 | /* SDMA */ |
68 | #define CIK_SDMA_UCODE_SIZE 1050 | 70 | #define CIK_SDMA_UCODE_SIZE 1050 |