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

Commit 8a53fa23 authored by Alex Deucher's avatar Alex Deucher
Browse files

drm/radeon: make missing smc ucode non-fatal

The smc ucode is required for dpm (dynamic power
management), but if it's missing just skip dpm setup
and don't disable acceleration.

Should fix:
https://bugs.freedesktop.org/show_bug.cgi?id=67876



Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 761bfb99
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -794,9 +794,13 @@ int ni_init_microcode(struct radeon_device *rdev)
	if ((rdev->family >= CHIP_BARTS) && (rdev->family <= CHIP_CAYMAN)) {
		snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name);
		err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev);
		if (err)
			goto out;
		if (rdev->smc_fw->size != smc_req_size) {
		if (err) {
			printk(KERN_ERR
			       "smc: error loading firmware \"%s\"\n",
			       fw_name);
			release_firmware(rdev->smc_fw);
			rdev->smc_fw = NULL;
		} else if (rdev->smc_fw->size != smc_req_size) {
			printk(KERN_ERR
			       "ni_mc: Bogus length %zu in firmware \"%s\"\n",
			       rdev->mc_fw->size, fw_name);
+7 −3
Original line number Diff line number Diff line
@@ -2299,9 +2299,13 @@ int r600_init_microcode(struct radeon_device *rdev)
	if ((rdev->family >= CHIP_RV770) && (rdev->family <= CHIP_HEMLOCK)) {
		snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", smc_chip_name);
		err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev);
		if (err)
			goto out;
		if (rdev->smc_fw->size != smc_req_size) {
		if (err) {
			printk(KERN_ERR
			       "smc: error loading firmware \"%s\"\n",
			       fw_name);
			release_firmware(rdev->smc_fw);
			rdev->smc_fw = NULL;
		} else if (rdev->smc_fw->size != smc_req_size) {
			printk(KERN_ERR
			       "smc: Bogus length %zu in firmware \"%s\"\n",
			       rdev->smc_fw->size, fw_name);
+5 −1
Original line number Diff line number Diff line
@@ -1176,9 +1176,13 @@ int radeon_pm_init(struct radeon_device *rdev)
	case CHIP_VERDE:
	case CHIP_OLAND:
	case CHIP_HAINAN:
		/* DPM requires the RLC */
		/* DPM requires the RLC, RV770+ dGPU requires SMC */
		if (!rdev->rlc_fw)
			rdev->pm.pm_method = PM_METHOD_PROFILE;
		else if ((rdev->family >= CHIP_RV770) &&
			 (!(rdev->flags & RADEON_IS_IGP)) &&
			 (!rdev->smc_fw))
			rdev->pm.pm_method = PM_METHOD_PROFILE;
		else if (radeon_dpm == 1)
			rdev->pm.pm_method = PM_METHOD_DPM;
		else
+7 −3
Original line number Diff line number Diff line
@@ -1663,9 +1663,13 @@ static int si_init_microcode(struct radeon_device *rdev)

	snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name);
	err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev);
	if (err)
		goto out;
	if (rdev->smc_fw->size != smc_req_size) {
	if (err) {
		printk(KERN_ERR
		       "smc: error loading firmware \"%s\"\n",
		       fw_name);
		release_firmware(rdev->smc_fw);
		rdev->smc_fw = NULL;
	} else if (rdev->smc_fw->size != smc_req_size) {
		printk(KERN_ERR
		       "si_smc: Bogus length %zu in firmware \"%s\"\n",
		       rdev->smc_fw->size, fw_name);