Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 277babc3 authored by Alex Deucher's avatar Alex Deucher Committed by Christian König
Browse files

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: default avatarAlex Deucher <alexander.deucher@amd.com>
Cc: stable@vger.kernel.org
parent 1ebe9280
Loading
Loading
Loading
Loading
+17 −9
Original line number Original line Diff line number Diff line
@@ -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_mc2.bin", chip_name);
		err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev);
		if (err) {
			snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name);
			snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.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;
				goto out;
		if (rdev->mc_fw->size != mc_req_size) {
		}
		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);
+3 −1
Original line number Original line Diff line number Diff line
@@ -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