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

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=67876Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 761bfb99
...@@ -794,9 +794,13 @@ int ni_init_microcode(struct radeon_device *rdev) ...@@ -794,9 +794,13 @@ int ni_init_microcode(struct radeon_device *rdev)
if ((rdev->family >= CHIP_BARTS) && (rdev->family <= CHIP_CAYMAN)) { if ((rdev->family >= CHIP_BARTS) && (rdev->family <= CHIP_CAYMAN)) {
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);
if (err) if (err) {
goto out; printk(KERN_ERR
if (rdev->smc_fw->size != smc_req_size) { "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 printk(KERN_ERR
"ni_mc: Bogus length %zu in firmware \"%s\"\n", "ni_mc: Bogus length %zu in firmware \"%s\"\n",
rdev->mc_fw->size, fw_name); rdev->mc_fw->size, fw_name);
......
...@@ -2299,9 +2299,13 @@ int r600_init_microcode(struct radeon_device *rdev) ...@@ -2299,9 +2299,13 @@ int r600_init_microcode(struct radeon_device *rdev)
if ((rdev->family >= CHIP_RV770) && (rdev->family <= CHIP_HEMLOCK)) { if ((rdev->family >= CHIP_RV770) && (rdev->family <= CHIP_HEMLOCK)) {
snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", smc_chip_name); snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", smc_chip_name);
err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev); err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev);
if (err) if (err) {
goto out; printk(KERN_ERR
if (rdev->smc_fw->size != smc_req_size) { "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 printk(KERN_ERR
"smc: Bogus length %zu in firmware \"%s\"\n", "smc: Bogus length %zu in firmware \"%s\"\n",
rdev->smc_fw->size, fw_name); rdev->smc_fw->size, fw_name);
......
...@@ -1176,9 +1176,13 @@ int radeon_pm_init(struct radeon_device *rdev) ...@@ -1176,9 +1176,13 @@ int radeon_pm_init(struct radeon_device *rdev)
case CHIP_VERDE: case CHIP_VERDE:
case CHIP_OLAND: case CHIP_OLAND:
case CHIP_HAINAN: case CHIP_HAINAN:
/* DPM requires the RLC */ /* DPM requires the RLC, RV770+ dGPU requires SMC */
if (!rdev->rlc_fw) if (!rdev->rlc_fw)
rdev->pm.pm_method = PM_METHOD_PROFILE; 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) else if (radeon_dpm == 1)
rdev->pm.pm_method = PM_METHOD_DPM; rdev->pm.pm_method = PM_METHOD_DPM;
else else
......
...@@ -1663,9 +1663,13 @@ static int si_init_microcode(struct radeon_device *rdev) ...@@ -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); 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);
if (err) if (err) {
goto out; printk(KERN_ERR
if (rdev->smc_fw->size != smc_req_size) { "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 printk(KERN_ERR
"si_smc: Bogus length %zu in firmware \"%s\"\n", "si_smc: Bogus length %zu in firmware \"%s\"\n",
rdev->smc_fw->size, fw_name); rdev->smc_fw->size, fw_name);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment