aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Deucher <alexdeucher@gmail.com>2014-04-11 11:21:50 -0400
committerChristian König <christian.koenig@amd.com>2014-04-17 07:59:51 -0400
commit277babc374f6ecab6af182554f5d9f35a7768755 (patch)
tree42a04a287ef21ba2d89a749bc2dc21ca4306b2f3
parent1ebe92802eaf0569784dce843bc28a78842d236c (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.c26
-rw-r--r--drivers/gpu/drm/radeon/radeon_ucode.h4
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");
38MODULE_FIRMWARE("radeon/BONAIRE_ce.bin"); 38MODULE_FIRMWARE("radeon/BONAIRE_ce.bin");
39MODULE_FIRMWARE("radeon/BONAIRE_mec.bin"); 39MODULE_FIRMWARE("radeon/BONAIRE_mec.bin");
40MODULE_FIRMWARE("radeon/BONAIRE_mc.bin"); 40MODULE_FIRMWARE("radeon/BONAIRE_mc.bin");
41MODULE_FIRMWARE("radeon/BONAIRE_mc2.bin");
41MODULE_FIRMWARE("radeon/BONAIRE_rlc.bin"); 42MODULE_FIRMWARE("radeon/BONAIRE_rlc.bin");
42MODULE_FIRMWARE("radeon/BONAIRE_sdma.bin"); 43MODULE_FIRMWARE("radeon/BONAIRE_sdma.bin");
43MODULE_FIRMWARE("radeon/BONAIRE_smc.bin"); 44MODULE_FIRMWARE("radeon/BONAIRE_smc.bin");
@@ -46,6 +47,7 @@ MODULE_FIRMWARE("radeon/HAWAII_me.bin");
46MODULE_FIRMWARE("radeon/HAWAII_ce.bin"); 47MODULE_FIRMWARE("radeon/HAWAII_ce.bin");
47MODULE_FIRMWARE("radeon/HAWAII_mec.bin"); 48MODULE_FIRMWARE("radeon/HAWAII_mec.bin");
48MODULE_FIRMWARE("radeon/HAWAII_mc.bin"); 49MODULE_FIRMWARE("radeon/HAWAII_mc.bin");
50MODULE_FIRMWARE("radeon/HAWAII_mc2.bin");
49MODULE_FIRMWARE("radeon/HAWAII_rlc.bin"); 51MODULE_FIRMWARE("radeon/HAWAII_rlc.bin");
50MODULE_FIRMWARE("radeon/HAWAII_sdma.bin"); 52MODULE_FIRMWARE("radeon/HAWAII_sdma.bin");
51MODULE_FIRMWARE("radeon/HAWAII_smc.bin"); 53MODULE_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