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
This commit is contained in:
parent
1ebe92802e
commit
277babc374
|
@ -38,6 +38,7 @@ MODULE_FIRMWARE("radeon/BONAIRE_me.bin");
|
||||||
MODULE_FIRMWARE("radeon/BONAIRE_ce.bin");
|
MODULE_FIRMWARE("radeon/BONAIRE_ce.bin");
|
||||||
MODULE_FIRMWARE("radeon/BONAIRE_mec.bin");
|
MODULE_FIRMWARE("radeon/BONAIRE_mec.bin");
|
||||||
MODULE_FIRMWARE("radeon/BONAIRE_mc.bin");
|
MODULE_FIRMWARE("radeon/BONAIRE_mc.bin");
|
||||||
|
MODULE_FIRMWARE("radeon/BONAIRE_mc2.bin");
|
||||||
MODULE_FIRMWARE("radeon/BONAIRE_rlc.bin");
|
MODULE_FIRMWARE("radeon/BONAIRE_rlc.bin");
|
||||||
MODULE_FIRMWARE("radeon/BONAIRE_sdma.bin");
|
MODULE_FIRMWARE("radeon/BONAIRE_sdma.bin");
|
||||||
MODULE_FIRMWARE("radeon/BONAIRE_smc.bin");
|
MODULE_FIRMWARE("radeon/BONAIRE_smc.bin");
|
||||||
|
@ -46,6 +47,7 @@ MODULE_FIRMWARE("radeon/HAWAII_me.bin");
|
||||||
MODULE_FIRMWARE("radeon/HAWAII_ce.bin");
|
MODULE_FIRMWARE("radeon/HAWAII_ce.bin");
|
||||||
MODULE_FIRMWARE("radeon/HAWAII_mec.bin");
|
MODULE_FIRMWARE("radeon/HAWAII_mec.bin");
|
||||||
MODULE_FIRMWARE("radeon/HAWAII_mc.bin");
|
MODULE_FIRMWARE("radeon/HAWAII_mc.bin");
|
||||||
|
MODULE_FIRMWARE("radeon/HAWAII_mc2.bin");
|
||||||
MODULE_FIRMWARE("radeon/HAWAII_rlc.bin");
|
MODULE_FIRMWARE("radeon/HAWAII_rlc.bin");
|
||||||
MODULE_FIRMWARE("radeon/HAWAII_sdma.bin");
|
MODULE_FIRMWARE("radeon/HAWAII_sdma.bin");
|
||||||
MODULE_FIRMWARE("radeon/HAWAII_smc.bin");
|
MODULE_FIRMWARE("radeon/HAWAII_smc.bin");
|
||||||
|
@ -1703,7 +1705,7 @@ int ci_mc_load_microcode(struct radeon_device *rdev)
|
||||||
const __be32 *fw_data;
|
const __be32 *fw_data;
|
||||||
u32 running, blackout = 0;
|
u32 running, blackout = 0;
|
||||||
u32 *io_mc_regs;
|
u32 *io_mc_regs;
|
||||||
int i, ucode_size, regs_size;
|
int i, regs_size, ucode_size = rdev->mc_fw->size / 4;
|
||||||
|
|
||||||
if (!rdev->mc_fw)
|
if (!rdev->mc_fw)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -1711,12 +1713,10 @@ int ci_mc_load_microcode(struct radeon_device *rdev)
|
||||||
switch (rdev->family) {
|
switch (rdev->family) {
|
||||||
case CHIP_BONAIRE:
|
case CHIP_BONAIRE:
|
||||||
io_mc_regs = (u32 *)&bonaire_io_mc_regs;
|
io_mc_regs = (u32 *)&bonaire_io_mc_regs;
|
||||||
ucode_size = CIK_MC_UCODE_SIZE;
|
|
||||||
regs_size = BONAIRE_IO_MC_REGS_SIZE;
|
regs_size = BONAIRE_IO_MC_REGS_SIZE;
|
||||||
break;
|
break;
|
||||||
case CHIP_HAWAII:
|
case CHIP_HAWAII:
|
||||||
io_mc_regs = (u32 *)&hawaii_io_mc_regs;
|
io_mc_regs = (u32 *)&hawaii_io_mc_regs;
|
||||||
ucode_size = HAWAII_MC_UCODE_SIZE;
|
|
||||||
regs_size = HAWAII_IO_MC_REGS_SIZE;
|
regs_size = HAWAII_IO_MC_REGS_SIZE;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -1783,7 +1783,7 @@ static int cik_init_microcode(struct radeon_device *rdev)
|
||||||
const char *chip_name;
|
const char *chip_name;
|
||||||
size_t pfp_req_size, me_req_size, ce_req_size,
|
size_t pfp_req_size, me_req_size, ce_req_size,
|
||||||
mec_req_size, rlc_req_size, mc_req_size = 0,
|
mec_req_size, rlc_req_size, mc_req_size = 0,
|
||||||
sdma_req_size, smc_req_size = 0;
|
sdma_req_size, smc_req_size = 0, mc2_req_size = 0;
|
||||||
char fw_name[30];
|
char fw_name[30];
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
@ -1797,7 +1797,8 @@ static int cik_init_microcode(struct radeon_device *rdev)
|
||||||
ce_req_size = CIK_CE_UCODE_SIZE * 4;
|
ce_req_size = CIK_CE_UCODE_SIZE * 4;
|
||||||
mec_req_size = CIK_MEC_UCODE_SIZE * 4;
|
mec_req_size = CIK_MEC_UCODE_SIZE * 4;
|
||||||
rlc_req_size = BONAIRE_RLC_UCODE_SIZE * 4;
|
rlc_req_size = BONAIRE_RLC_UCODE_SIZE * 4;
|
||||||
mc_req_size = CIK_MC_UCODE_SIZE * 4;
|
mc_req_size = BONAIRE_MC_UCODE_SIZE * 4;
|
||||||
|
mc2_req_size = BONAIRE_MC2_UCODE_SIZE * 4;
|
||||||
sdma_req_size = CIK_SDMA_UCODE_SIZE * 4;
|
sdma_req_size = CIK_SDMA_UCODE_SIZE * 4;
|
||||||
smc_req_size = ALIGN(BONAIRE_SMC_UCODE_SIZE, 4);
|
smc_req_size = ALIGN(BONAIRE_SMC_UCODE_SIZE, 4);
|
||||||
break;
|
break;
|
||||||
|
@ -1809,6 +1810,7 @@ static int cik_init_microcode(struct radeon_device *rdev)
|
||||||
mec_req_size = CIK_MEC_UCODE_SIZE * 4;
|
mec_req_size = CIK_MEC_UCODE_SIZE * 4;
|
||||||
rlc_req_size = BONAIRE_RLC_UCODE_SIZE * 4;
|
rlc_req_size = BONAIRE_RLC_UCODE_SIZE * 4;
|
||||||
mc_req_size = HAWAII_MC_UCODE_SIZE * 4;
|
mc_req_size = HAWAII_MC_UCODE_SIZE * 4;
|
||||||
|
mc2_req_size = HAWAII_MC2_UCODE_SIZE * 4;
|
||||||
sdma_req_size = CIK_SDMA_UCODE_SIZE * 4;
|
sdma_req_size = CIK_SDMA_UCODE_SIZE * 4;
|
||||||
smc_req_size = ALIGN(HAWAII_SMC_UCODE_SIZE, 4);
|
smc_req_size = ALIGN(HAWAII_SMC_UCODE_SIZE, 4);
|
||||||
break;
|
break;
|
||||||
|
@ -1904,16 +1906,22 @@ static int cik_init_microcode(struct radeon_device *rdev)
|
||||||
|
|
||||||
/* No SMC, MC ucode on APUs */
|
/* No SMC, MC ucode on APUs */
|
||||||
if (!(rdev->flags & RADEON_IS_IGP)) {
|
if (!(rdev->flags & RADEON_IS_IGP)) {
|
||||||
snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name);
|
snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc2.bin", chip_name);
|
||||||
err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev);
|
err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev);
|
||||||
if (err)
|
if (err) {
|
||||||
goto out;
|
snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name);
|
||||||
if (rdev->mc_fw->size != mc_req_size) {
|
err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev);
|
||||||
|
if (err)
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
if ((rdev->mc_fw->size != mc_req_size) &&
|
||||||
|
(rdev->mc_fw->size != mc2_req_size)){
|
||||||
printk(KERN_ERR
|
printk(KERN_ERR
|
||||||
"cik_mc: Bogus length %zu in firmware \"%s\"\n",
|
"cik_mc: Bogus length %zu in firmware \"%s\"\n",
|
||||||
rdev->mc_fw->size, fw_name);
|
rdev->mc_fw->size, fw_name);
|
||||||
err = -EINVAL;
|
err = -EINVAL;
|
||||||
}
|
}
|
||||||
|
DRM_INFO("%s: %zu bytes\n", fw_name, rdev->mc_fw->size);
|
||||||
|
|
||||||
snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name);
|
snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name);
|
||||||
err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev);
|
err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev);
|
||||||
|
|
|
@ -61,8 +61,10 @@
|
||||||
#define PITCAIRN_MC_UCODE_SIZE 7775
|
#define PITCAIRN_MC_UCODE_SIZE 7775
|
||||||
#define VERDE_MC_UCODE_SIZE 7875
|
#define VERDE_MC_UCODE_SIZE 7875
|
||||||
#define OLAND_MC_UCODE_SIZE 7863
|
#define OLAND_MC_UCODE_SIZE 7863
|
||||||
#define CIK_MC_UCODE_SIZE 7866
|
#define BONAIRE_MC_UCODE_SIZE 7866
|
||||||
|
#define BONAIRE_MC2_UCODE_SIZE 7948
|
||||||
#define HAWAII_MC_UCODE_SIZE 7933
|
#define HAWAII_MC_UCODE_SIZE 7933
|
||||||
|
#define HAWAII_MC2_UCODE_SIZE 8091
|
||||||
|
|
||||||
/* SDMA */
|
/* SDMA */
|
||||||
#define CIK_SDMA_UCODE_SIZE 1050
|
#define CIK_SDMA_UCODE_SIZE 1050
|
||||||
|
|
Loading…
Reference in New Issue