* [PATCH 1/3] drm/radeon: add support for newer mc ucode on SI
@ 2014-04-11 14:52 Alex Deucher
2014-04-11 14:52 ` [PATCH 2/3] drm/radeon: add support for newer mc ucode on CI Alex Deucher
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Alex Deucher @ 2014-04-11 14:52 UTC (permalink / raw)
To: dri-devel, deathsimple; +Cc: Alex Deucher, stable
May fix stability issues with some newer cards.
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Cc: stable@vger.kernel.org
---
drivers/gpu/drm/radeon/radeon_ucode.h | 3 +++
drivers/gpu/drm/radeon/si.c | 34 +++++++++++++++++++++-------------
2 files changed, 24 insertions(+), 13 deletions(-)
diff --git a/drivers/gpu/drm/radeon/radeon_ucode.h b/drivers/gpu/drm/radeon/radeon_ucode.h
index a77cd27..f415548 100644
--- a/drivers/gpu/drm/radeon/radeon_ucode.h
+++ b/drivers/gpu/drm/radeon/radeon_ucode.h
@@ -57,6 +57,9 @@
#define BTC_MC_UCODE_SIZE 6024
#define CAYMAN_MC_UCODE_SIZE 6037
#define SI_MC_UCODE_SIZE 7769
+#define TAHITI_MC_UCODE_SIZE 7808
+#define PITCAIRN_MC_UCODE_SIZE 7775
+#define VERDE_MC_UCODE_SIZE 7875
#define OLAND_MC_UCODE_SIZE 7863
#define CIK_MC_UCODE_SIZE 7866
#define HAWAII_MC_UCODE_SIZE 7933
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c
index d589475..7675247 100644
--- a/drivers/gpu/drm/radeon/si.c
+++ b/drivers/gpu/drm/radeon/si.c
@@ -39,30 +39,35 @@ MODULE_FIRMWARE("radeon/TAHITI_pfp.bin");
MODULE_FIRMWARE("radeon/TAHITI_me.bin");
MODULE_FIRMWARE("radeon/TAHITI_ce.bin");
MODULE_FIRMWARE("radeon/TAHITI_mc.bin");
+MODULE_FIRMWARE("radeon/TAHITI_mc2.bin");
MODULE_FIRMWARE("radeon/TAHITI_rlc.bin");
MODULE_FIRMWARE("radeon/TAHITI_smc.bin");
MODULE_FIRMWARE("radeon/PITCAIRN_pfp.bin");
MODULE_FIRMWARE("radeon/PITCAIRN_me.bin");
MODULE_FIRMWARE("radeon/PITCAIRN_ce.bin");
MODULE_FIRMWARE("radeon/PITCAIRN_mc.bin");
+MODULE_FIRMWARE("radeon/PITCAIRN_mc2.bin");
MODULE_FIRMWARE("radeon/PITCAIRN_rlc.bin");
MODULE_FIRMWARE("radeon/PITCAIRN_smc.bin");
MODULE_FIRMWARE("radeon/VERDE_pfp.bin");
MODULE_FIRMWARE("radeon/VERDE_me.bin");
MODULE_FIRMWARE("radeon/VERDE_ce.bin");
MODULE_FIRMWARE("radeon/VERDE_mc.bin");
+MODULE_FIRMWARE("radeon/VERDE_mc2.bin");
MODULE_FIRMWARE("radeon/VERDE_rlc.bin");
MODULE_FIRMWARE("radeon/VERDE_smc.bin");
MODULE_FIRMWARE("radeon/OLAND_pfp.bin");
MODULE_FIRMWARE("radeon/OLAND_me.bin");
MODULE_FIRMWARE("radeon/OLAND_ce.bin");
MODULE_FIRMWARE("radeon/OLAND_mc.bin");
+MODULE_FIRMWARE("radeon/OLAND_mc2.bin");
MODULE_FIRMWARE("radeon/OLAND_rlc.bin");
MODULE_FIRMWARE("radeon/OLAND_smc.bin");
MODULE_FIRMWARE("radeon/HAINAN_pfp.bin");
MODULE_FIRMWARE("radeon/HAINAN_me.bin");
MODULE_FIRMWARE("radeon/HAINAN_ce.bin");
MODULE_FIRMWARE("radeon/HAINAN_mc.bin");
+MODULE_FIRMWARE("radeon/HAINAN_mc2.bin");
MODULE_FIRMWARE("radeon/HAINAN_rlc.bin");
MODULE_FIRMWARE("radeon/HAINAN_smc.bin");
@@ -1467,7 +1472,7 @@ int si_mc_load_microcode(struct radeon_device *rdev)
const __be32 *fw_data;
u32 running, blackout = 0;
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)
return -EINVAL;
@@ -1475,28 +1480,23 @@ int si_mc_load_microcode(struct radeon_device *rdev)
switch (rdev->family) {
case CHIP_TAHITI:
io_mc_regs = (u32 *)&tahiti_io_mc_regs;
- ucode_size = SI_MC_UCODE_SIZE;
regs_size = TAHITI_IO_MC_REGS_SIZE;
break;
case CHIP_PITCAIRN:
io_mc_regs = (u32 *)&pitcairn_io_mc_regs;
- ucode_size = SI_MC_UCODE_SIZE;
regs_size = TAHITI_IO_MC_REGS_SIZE;
break;
case CHIP_VERDE:
default:
io_mc_regs = (u32 *)&verde_io_mc_regs;
- ucode_size = SI_MC_UCODE_SIZE;
regs_size = TAHITI_IO_MC_REGS_SIZE;
break;
case CHIP_OLAND:
io_mc_regs = (u32 *)&oland_io_mc_regs;
- ucode_size = OLAND_MC_UCODE_SIZE;
regs_size = TAHITI_IO_MC_REGS_SIZE;
break;
case CHIP_HAINAN:
io_mc_regs = (u32 *)&hainan_io_mc_regs;
- ucode_size = OLAND_MC_UCODE_SIZE;
regs_size = TAHITI_IO_MC_REGS_SIZE;
break;
}
@@ -1552,7 +1552,7 @@ static int si_init_microcode(struct radeon_device *rdev)
const char *chip_name;
const char *rlc_chip_name;
size_t pfp_req_size, me_req_size, ce_req_size, rlc_req_size, mc_req_size;
- size_t smc_req_size;
+ size_t smc_req_size, mc2_req_size;
char fw_name[30];
int err;
@@ -1567,6 +1567,7 @@ static int si_init_microcode(struct radeon_device *rdev)
ce_req_size = SI_CE_UCODE_SIZE * 4;
rlc_req_size = SI_RLC_UCODE_SIZE * 4;
mc_req_size = SI_MC_UCODE_SIZE * 4;
+ mc2_req_size = TAHITI_MC_UCODE_SIZE * 4;
smc_req_size = ALIGN(TAHITI_SMC_UCODE_SIZE, 4);
break;
case CHIP_PITCAIRN:
@@ -1577,6 +1578,7 @@ static int si_init_microcode(struct radeon_device *rdev)
ce_req_size = SI_CE_UCODE_SIZE * 4;
rlc_req_size = SI_RLC_UCODE_SIZE * 4;
mc_req_size = SI_MC_UCODE_SIZE * 4;
+ mc2_req_size = PITCAIRN_MC_UCODE_SIZE * 4;
smc_req_size = ALIGN(PITCAIRN_SMC_UCODE_SIZE, 4);
break;
case CHIP_VERDE:
@@ -1587,6 +1589,7 @@ static int si_init_microcode(struct radeon_device *rdev)
ce_req_size = SI_CE_UCODE_SIZE * 4;
rlc_req_size = SI_RLC_UCODE_SIZE * 4;
mc_req_size = SI_MC_UCODE_SIZE * 4;
+ mc2_req_size = VERDE_MC_UCODE_SIZE * 4;
smc_req_size = ALIGN(VERDE_SMC_UCODE_SIZE, 4);
break;
case CHIP_OLAND:
@@ -1596,7 +1599,7 @@ static int si_init_microcode(struct radeon_device *rdev)
me_req_size = SI_PM4_UCODE_SIZE * 4;
ce_req_size = SI_CE_UCODE_SIZE * 4;
rlc_req_size = SI_RLC_UCODE_SIZE * 4;
- mc_req_size = OLAND_MC_UCODE_SIZE * 4;
+ mc_req_size = mc2_req_size = OLAND_MC_UCODE_SIZE * 4;
smc_req_size = ALIGN(OLAND_SMC_UCODE_SIZE, 4);
break;
case CHIP_HAINAN:
@@ -1606,7 +1609,7 @@ static int si_init_microcode(struct radeon_device *rdev)
me_req_size = SI_PM4_UCODE_SIZE * 4;
ce_req_size = SI_CE_UCODE_SIZE * 4;
rlc_req_size = SI_RLC_UCODE_SIZE * 4;
- mc_req_size = OLAND_MC_UCODE_SIZE * 4;
+ mc_req_size = mc2_req_size = OLAND_MC_UCODE_SIZE * 4;
smc_req_size = ALIGN(HAINAN_SMC_UCODE_SIZE, 4);
break;
default: BUG();
@@ -1659,11 +1662,16 @@ static int si_init_microcode(struct radeon_device *rdev)
err = -EINVAL;
}
- 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);
- if (err)
- goto out;
- if (rdev->mc_fw->size != mc_req_size) {
+ if (err) {
+ snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name);
+ 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
"si_mc: Bogus length %zu in firmware \"%s\"\n",
rdev->mc_fw->size, fw_name);
--
1.8.3.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 2/3] drm/radeon: add support for newer mc ucode on CI
2014-04-11 14:52 [PATCH 1/3] drm/radeon: add support for newer mc ucode on SI Alex Deucher
@ 2014-04-11 14:52 ` Alex Deucher
2014-04-11 14:52 ` [PATCH 3/3] drm/radeon: re-enable mclk dpm on R7 260X asics Alex Deucher
2014-04-11 15:03 ` [PATCH 1/3] drm/radeon: add support for newer mc ucode on SI Christian König
2 siblings, 0 replies; 5+ messages in thread
From: Alex Deucher @ 2014-04-11 14:52 UTC (permalink / raw)
To: dri-devel, deathsimple; +Cc: Alex Deucher, stable
Fixes mclk stability on certain asics.
bug:
https://bugs.freedesktop.org/show_bug.cgi?id=75992
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Cc: stable@vger.kernel.org
---
drivers/gpu/drm/radeon/cik.c | 25 ++++++++++++++++---------
drivers/gpu/drm/radeon/radeon_ucode.h | 4 +++-
2 files changed, 19 insertions(+), 10 deletions(-)
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c
index 0ae991d..ab36839 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");
MODULE_FIRMWARE("radeon/BONAIRE_ce.bin");
MODULE_FIRMWARE("radeon/BONAIRE_mec.bin");
MODULE_FIRMWARE("radeon/BONAIRE_mc.bin");
+MODULE_FIRMWARE("radeon/BONAIRE_mc2.bin");
MODULE_FIRMWARE("radeon/BONAIRE_rlc.bin");
MODULE_FIRMWARE("radeon/BONAIRE_sdma.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_mec.bin");
MODULE_FIRMWARE("radeon/HAWAII_mc.bin");
+MODULE_FIRMWARE("radeon/HAWAII_mc2.bin");
MODULE_FIRMWARE("radeon/HAWAII_rlc.bin");
MODULE_FIRMWARE("radeon/HAWAII_sdma.bin");
MODULE_FIRMWARE("radeon/HAWAII_smc.bin");
@@ -1703,7 +1705,7 @@ int ci_mc_load_microcode(struct radeon_device *rdev)
const __be32 *fw_data;
u32 running, blackout = 0;
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)
return -EINVAL;
@@ -1711,12 +1713,10 @@ int ci_mc_load_microcode(struct radeon_device *rdev)
switch (rdev->family) {
case CHIP_BONAIRE:
io_mc_regs = (u32 *)&bonaire_io_mc_regs;
- ucode_size = CIK_MC_UCODE_SIZE;
regs_size = BONAIRE_IO_MC_REGS_SIZE;
break;
case CHIP_HAWAII:
io_mc_regs = (u32 *)&hawaii_io_mc_regs;
- ucode_size = HAWAII_MC_UCODE_SIZE;
regs_size = HAWAII_IO_MC_REGS_SIZE;
break;
default:
@@ -1783,7 +1783,7 @@ static int cik_init_microcode(struct radeon_device *rdev)
const char *chip_name;
size_t pfp_req_size, me_req_size, ce_req_size,
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];
int err;
@@ -1797,7 +1797,8 @@ static int cik_init_microcode(struct radeon_device *rdev)
ce_req_size = CIK_CE_UCODE_SIZE * 4;
mec_req_size = CIK_MEC_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;
smc_req_size = ALIGN(BONAIRE_SMC_UCODE_SIZE, 4);
break;
@@ -1809,6 +1810,7 @@ static int cik_init_microcode(struct radeon_device *rdev)
mec_req_size = CIK_MEC_UCODE_SIZE * 4;
rlc_req_size = BONAIRE_RLC_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;
smc_req_size = ALIGN(HAWAII_SMC_UCODE_SIZE, 4);
break;
@@ -1904,11 +1906,16 @@ static int cik_init_microcode(struct radeon_device *rdev)
/* No SMC, MC ucode on APUs */
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);
- if (err)
- goto out;
- if (rdev->mc_fw->size != mc_req_size) {
+ if (err) {
+ snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name);
+ 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
"cik_mc: Bogus length %zu in firmware \"%s\"\n",
rdev->mc_fw->size, fw_name);
diff --git a/drivers/gpu/drm/radeon/radeon_ucode.h b/drivers/gpu/drm/radeon/radeon_ucode.h
index f415548..58d1293 100644
--- a/drivers/gpu/drm/radeon/radeon_ucode.h
+++ b/drivers/gpu/drm/radeon/radeon_ucode.h
@@ -61,8 +61,10 @@
#define PITCAIRN_MC_UCODE_SIZE 7775
#define VERDE_MC_UCODE_SIZE 7875
#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_MC2_UCODE_SIZE 8091
/* SDMA */
#define CIK_SDMA_UCODE_SIZE 1050
--
1.8.3.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 3/3] drm/radeon: re-enable mclk dpm on R7 260X asics
2014-04-11 14:52 [PATCH 1/3] drm/radeon: add support for newer mc ucode on SI Alex Deucher
2014-04-11 14:52 ` [PATCH 2/3] drm/radeon: add support for newer mc ucode on CI Alex Deucher
@ 2014-04-11 14:52 ` Alex Deucher
2014-04-11 15:03 ` [PATCH 1/3] drm/radeon: add support for newer mc ucode on SI Christian König
2 siblings, 0 replies; 5+ messages in thread
From: Alex Deucher @ 2014-04-11 14:52 UTC (permalink / raw)
To: dri-devel, deathsimple; +Cc: Alex Deucher, stable
If the new mc ucode is available.
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Cc: stable@vger.kernel.org
---
drivers/gpu/drm/radeon/ci_dpm.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/radeon/ci_dpm.c b/drivers/gpu/drm/radeon/ci_dpm.c
index 18e91ee..10dae41 100644
--- a/drivers/gpu/drm/radeon/ci_dpm.c
+++ b/drivers/gpu/drm/radeon/ci_dpm.c
@@ -21,8 +21,10 @@
*
*/
+#include <linux/firmware.h>
#include "drmP.h"
#include "radeon.h"
+#include "radeon_ucode.h"
#include "cikd.h"
#include "r600_dpm.h"
#include "ci_dpm.h"
@@ -5147,9 +5149,11 @@ int ci_dpm_init(struct radeon_device *rdev)
pi->mclk_dpm_key_disabled = 0;
pi->pcie_dpm_key_disabled = 0;
- /* mclk dpm is unstable on some R7 260X cards */
- if (rdev->pdev->device == 0x6658)
+ /* mclk dpm is unstable on some R7 260X cards with the old mc ucode */
+ if ((rdev->pdev->device == 0x6658) &&
+ (rdev->mc_fw->size == (BONAIRE_MC_UCODE_SIZE * 4))) {
pi->mclk_dpm_key_disabled = 1;
+ }
pi->caps_sclk_ds = true;
--
1.8.3.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 1/3] drm/radeon: add support for newer mc ucode on SI
2014-04-11 14:52 [PATCH 1/3] drm/radeon: add support for newer mc ucode on SI Alex Deucher
2014-04-11 14:52 ` [PATCH 2/3] drm/radeon: add support for newer mc ucode on CI Alex Deucher
2014-04-11 14:52 ` [PATCH 3/3] drm/radeon: re-enable mclk dpm on R7 260X asics Alex Deucher
@ 2014-04-11 15:03 ` Christian König
2014-04-11 15:05 ` Deucher, Alexander
2 siblings, 1 reply; 5+ messages in thread
From: Christian König @ 2014-04-11 15:03 UTC (permalink / raw)
To: Alex Deucher, dri-devel; +Cc: Alex Deucher, stable
Am 11.04.2014 16:52, schrieb Alex Deucher:
> May fix stability issues with some newer cards.
>
> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
> Cc: stable@vger.kernel.org
Why adding *_mc2.bin for the MC firmware? To distinct if people have the
new or the old firmware?
If that's the case I would rather print the firmware size or CRC code
somewhere in the logs.
Christian.
> ---
> drivers/gpu/drm/radeon/radeon_ucode.h | 3 +++
> drivers/gpu/drm/radeon/si.c | 34 +++++++++++++++++++++-------------
> 2 files changed, 24 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/gpu/drm/radeon/radeon_ucode.h b/drivers/gpu/drm/radeon/radeon_ucode.h
> index a77cd27..f415548 100644
> --- a/drivers/gpu/drm/radeon/radeon_ucode.h
> +++ b/drivers/gpu/drm/radeon/radeon_ucode.h
> @@ -57,6 +57,9 @@
> #define BTC_MC_UCODE_SIZE 6024
> #define CAYMAN_MC_UCODE_SIZE 6037
> #define SI_MC_UCODE_SIZE 7769
> +#define TAHITI_MC_UCODE_SIZE 7808
> +#define PITCAIRN_MC_UCODE_SIZE 7775
> +#define VERDE_MC_UCODE_SIZE 7875
> #define OLAND_MC_UCODE_SIZE 7863
> #define CIK_MC_UCODE_SIZE 7866
> #define HAWAII_MC_UCODE_SIZE 7933
> diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c
> index d589475..7675247 100644
> --- a/drivers/gpu/drm/radeon/si.c
> +++ b/drivers/gpu/drm/radeon/si.c
> @@ -39,30 +39,35 @@ MODULE_FIRMWARE("radeon/TAHITI_pfp.bin");
> MODULE_FIRMWARE("radeon/TAHITI_me.bin");
> MODULE_FIRMWARE("radeon/TAHITI_ce.bin");
> MODULE_FIRMWARE("radeon/TAHITI_mc.bin");
> +MODULE_FIRMWARE("radeon/TAHITI_mc2.bin");
> MODULE_FIRMWARE("radeon/TAHITI_rlc.bin");
> MODULE_FIRMWARE("radeon/TAHITI_smc.bin");
> MODULE_FIRMWARE("radeon/PITCAIRN_pfp.bin");
> MODULE_FIRMWARE("radeon/PITCAIRN_me.bin");
> MODULE_FIRMWARE("radeon/PITCAIRN_ce.bin");
> MODULE_FIRMWARE("radeon/PITCAIRN_mc.bin");
> +MODULE_FIRMWARE("radeon/PITCAIRN_mc2.bin");
> MODULE_FIRMWARE("radeon/PITCAIRN_rlc.bin");
> MODULE_FIRMWARE("radeon/PITCAIRN_smc.bin");
> MODULE_FIRMWARE("radeon/VERDE_pfp.bin");
> MODULE_FIRMWARE("radeon/VERDE_me.bin");
> MODULE_FIRMWARE("radeon/VERDE_ce.bin");
> MODULE_FIRMWARE("radeon/VERDE_mc.bin");
> +MODULE_FIRMWARE("radeon/VERDE_mc2.bin");
> MODULE_FIRMWARE("radeon/VERDE_rlc.bin");
> MODULE_FIRMWARE("radeon/VERDE_smc.bin");
> MODULE_FIRMWARE("radeon/OLAND_pfp.bin");
> MODULE_FIRMWARE("radeon/OLAND_me.bin");
> MODULE_FIRMWARE("radeon/OLAND_ce.bin");
> MODULE_FIRMWARE("radeon/OLAND_mc.bin");
> +MODULE_FIRMWARE("radeon/OLAND_mc2.bin");
> MODULE_FIRMWARE("radeon/OLAND_rlc.bin");
> MODULE_FIRMWARE("radeon/OLAND_smc.bin");
> MODULE_FIRMWARE("radeon/HAINAN_pfp.bin");
> MODULE_FIRMWARE("radeon/HAINAN_me.bin");
> MODULE_FIRMWARE("radeon/HAINAN_ce.bin");
> MODULE_FIRMWARE("radeon/HAINAN_mc.bin");
> +MODULE_FIRMWARE("radeon/HAINAN_mc2.bin");
> MODULE_FIRMWARE("radeon/HAINAN_rlc.bin");
> MODULE_FIRMWARE("radeon/HAINAN_smc.bin");
>
> @@ -1467,7 +1472,7 @@ int si_mc_load_microcode(struct radeon_device *rdev)
> const __be32 *fw_data;
> u32 running, blackout = 0;
> 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)
> return -EINVAL;
> @@ -1475,28 +1480,23 @@ int si_mc_load_microcode(struct radeon_device *rdev)
> switch (rdev->family) {
> case CHIP_TAHITI:
> io_mc_regs = (u32 *)&tahiti_io_mc_regs;
> - ucode_size = SI_MC_UCODE_SIZE;
> regs_size = TAHITI_IO_MC_REGS_SIZE;
> break;
> case CHIP_PITCAIRN:
> io_mc_regs = (u32 *)&pitcairn_io_mc_regs;
> - ucode_size = SI_MC_UCODE_SIZE;
> regs_size = TAHITI_IO_MC_REGS_SIZE;
> break;
> case CHIP_VERDE:
> default:
> io_mc_regs = (u32 *)&verde_io_mc_regs;
> - ucode_size = SI_MC_UCODE_SIZE;
> regs_size = TAHITI_IO_MC_REGS_SIZE;
> break;
> case CHIP_OLAND:
> io_mc_regs = (u32 *)&oland_io_mc_regs;
> - ucode_size = OLAND_MC_UCODE_SIZE;
> regs_size = TAHITI_IO_MC_REGS_SIZE;
> break;
> case CHIP_HAINAN:
> io_mc_regs = (u32 *)&hainan_io_mc_regs;
> - ucode_size = OLAND_MC_UCODE_SIZE;
> regs_size = TAHITI_IO_MC_REGS_SIZE;
> break;
> }
> @@ -1552,7 +1552,7 @@ static int si_init_microcode(struct radeon_device *rdev)
> const char *chip_name;
> const char *rlc_chip_name;
> size_t pfp_req_size, me_req_size, ce_req_size, rlc_req_size, mc_req_size;
> - size_t smc_req_size;
> + size_t smc_req_size, mc2_req_size;
> char fw_name[30];
> int err;
>
> @@ -1567,6 +1567,7 @@ static int si_init_microcode(struct radeon_device *rdev)
> ce_req_size = SI_CE_UCODE_SIZE * 4;
> rlc_req_size = SI_RLC_UCODE_SIZE * 4;
> mc_req_size = SI_MC_UCODE_SIZE * 4;
> + mc2_req_size = TAHITI_MC_UCODE_SIZE * 4;
> smc_req_size = ALIGN(TAHITI_SMC_UCODE_SIZE, 4);
> break;
> case CHIP_PITCAIRN:
> @@ -1577,6 +1578,7 @@ static int si_init_microcode(struct radeon_device *rdev)
> ce_req_size = SI_CE_UCODE_SIZE * 4;
> rlc_req_size = SI_RLC_UCODE_SIZE * 4;
> mc_req_size = SI_MC_UCODE_SIZE * 4;
> + mc2_req_size = PITCAIRN_MC_UCODE_SIZE * 4;
> smc_req_size = ALIGN(PITCAIRN_SMC_UCODE_SIZE, 4);
> break;
> case CHIP_VERDE:
> @@ -1587,6 +1589,7 @@ static int si_init_microcode(struct radeon_device *rdev)
> ce_req_size = SI_CE_UCODE_SIZE * 4;
> rlc_req_size = SI_RLC_UCODE_SIZE * 4;
> mc_req_size = SI_MC_UCODE_SIZE * 4;
> + mc2_req_size = VERDE_MC_UCODE_SIZE * 4;
> smc_req_size = ALIGN(VERDE_SMC_UCODE_SIZE, 4);
> break;
> case CHIP_OLAND:
> @@ -1596,7 +1599,7 @@ static int si_init_microcode(struct radeon_device *rdev)
> me_req_size = SI_PM4_UCODE_SIZE * 4;
> ce_req_size = SI_CE_UCODE_SIZE * 4;
> rlc_req_size = SI_RLC_UCODE_SIZE * 4;
> - mc_req_size = OLAND_MC_UCODE_SIZE * 4;
> + mc_req_size = mc2_req_size = OLAND_MC_UCODE_SIZE * 4;
> smc_req_size = ALIGN(OLAND_SMC_UCODE_SIZE, 4);
> break;
> case CHIP_HAINAN:
> @@ -1606,7 +1609,7 @@ static int si_init_microcode(struct radeon_device *rdev)
> me_req_size = SI_PM4_UCODE_SIZE * 4;
> ce_req_size = SI_CE_UCODE_SIZE * 4;
> rlc_req_size = SI_RLC_UCODE_SIZE * 4;
> - mc_req_size = OLAND_MC_UCODE_SIZE * 4;
> + mc_req_size = mc2_req_size = OLAND_MC_UCODE_SIZE * 4;
> smc_req_size = ALIGN(HAINAN_SMC_UCODE_SIZE, 4);
> break;
> default: BUG();
> @@ -1659,11 +1662,16 @@ static int si_init_microcode(struct radeon_device *rdev)
> err = -EINVAL;
> }
>
> - 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);
> - if (err)
> - goto out;
> - if (rdev->mc_fw->size != mc_req_size) {
> + if (err) {
> + snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name);
> + 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
> "si_mc: Bogus length %zu in firmware \"%s\"\n",
> rdev->mc_fw->size, fw_name);
^ permalink raw reply [flat|nested] 5+ messages in thread
* RE: [PATCH 1/3] drm/radeon: add support for newer mc ucode on SI
2014-04-11 15:03 ` [PATCH 1/3] drm/radeon: add support for newer mc ucode on SI Christian König
@ 2014-04-11 15:05 ` Deucher, Alexander
0 siblings, 0 replies; 5+ messages in thread
From: Deucher, Alexander @ 2014-04-11 15:05 UTC (permalink / raw)
To: Christian König, Alex Deucher, dri-devel; +Cc: stable
> -----Original Message-----
> From: Christian König [mailto:deathsimple@vodafone.de]
> Sent: Friday, April 11, 2014 11:03 AM
> To: Alex Deucher; dri-devel@lists.freedesktop.org
> Cc: Deucher, Alexander; stable@vger.kernel.org
> Subject: Re: [PATCH 1/3] drm/radeon: add support for newer mc ucode on SI
>
> Am 11.04.2014 16:52, schrieb Alex Deucher:
> > May fix stability issues with some newer cards.
> >
> > Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
> > Cc: stable@vger.kernel.org
>
> Why adding *_mc2.bin for the MC firmware? To distinct if people have the
> new or the old firmware?
To make sure I don't break old kernels mixed with new firmware. E.g., is a user updated their ucode, but not their kernel, it would fail due to the firmware being the wrong size.
>
> If that's the case I would rather print the firmware size or CRC code
> somewhere in the logs.
I'll add that and respin.
Alex
>
> Christian.
>
> > ---
> > drivers/gpu/drm/radeon/radeon_ucode.h | 3 +++
> > drivers/gpu/drm/radeon/si.c | 34 +++++++++++++++++++++---------
> ----
> > 2 files changed, 24 insertions(+), 13 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/radeon/radeon_ucode.h
> b/drivers/gpu/drm/radeon/radeon_ucode.h
> > index a77cd27..f415548 100644
> > --- a/drivers/gpu/drm/radeon/radeon_ucode.h
> > +++ b/drivers/gpu/drm/radeon/radeon_ucode.h
> > @@ -57,6 +57,9 @@
> > #define BTC_MC_UCODE_SIZE 6024
> > #define CAYMAN_MC_UCODE_SIZE 6037
> > #define SI_MC_UCODE_SIZE 7769
> > +#define TAHITI_MC_UCODE_SIZE 7808
> > +#define PITCAIRN_MC_UCODE_SIZE 7775
> > +#define VERDE_MC_UCODE_SIZE 7875
> > #define OLAND_MC_UCODE_SIZE 7863
> > #define CIK_MC_UCODE_SIZE 7866
> > #define HAWAII_MC_UCODE_SIZE 7933
> > diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c
> > index d589475..7675247 100644
> > --- a/drivers/gpu/drm/radeon/si.c
> > +++ b/drivers/gpu/drm/radeon/si.c
> > @@ -39,30 +39,35 @@ MODULE_FIRMWARE("radeon/TAHITI_pfp.bin");
> > MODULE_FIRMWARE("radeon/TAHITI_me.bin");
> > MODULE_FIRMWARE("radeon/TAHITI_ce.bin");
> > MODULE_FIRMWARE("radeon/TAHITI_mc.bin");
> > +MODULE_FIRMWARE("radeon/TAHITI_mc2.bin");
> > MODULE_FIRMWARE("radeon/TAHITI_rlc.bin");
> > MODULE_FIRMWARE("radeon/TAHITI_smc.bin");
> > MODULE_FIRMWARE("radeon/PITCAIRN_pfp.bin");
> > MODULE_FIRMWARE("radeon/PITCAIRN_me.bin");
> > MODULE_FIRMWARE("radeon/PITCAIRN_ce.bin");
> > MODULE_FIRMWARE("radeon/PITCAIRN_mc.bin");
> > +MODULE_FIRMWARE("radeon/PITCAIRN_mc2.bin");
> > MODULE_FIRMWARE("radeon/PITCAIRN_rlc.bin");
> > MODULE_FIRMWARE("radeon/PITCAIRN_smc.bin");
> > MODULE_FIRMWARE("radeon/VERDE_pfp.bin");
> > MODULE_FIRMWARE("radeon/VERDE_me.bin");
> > MODULE_FIRMWARE("radeon/VERDE_ce.bin");
> > MODULE_FIRMWARE("radeon/VERDE_mc.bin");
> > +MODULE_FIRMWARE("radeon/VERDE_mc2.bin");
> > MODULE_FIRMWARE("radeon/VERDE_rlc.bin");
> > MODULE_FIRMWARE("radeon/VERDE_smc.bin");
> > MODULE_FIRMWARE("radeon/OLAND_pfp.bin");
> > MODULE_FIRMWARE("radeon/OLAND_me.bin");
> > MODULE_FIRMWARE("radeon/OLAND_ce.bin");
> > MODULE_FIRMWARE("radeon/OLAND_mc.bin");
> > +MODULE_FIRMWARE("radeon/OLAND_mc2.bin");
> > MODULE_FIRMWARE("radeon/OLAND_rlc.bin");
> > MODULE_FIRMWARE("radeon/OLAND_smc.bin");
> > MODULE_FIRMWARE("radeon/HAINAN_pfp.bin");
> > MODULE_FIRMWARE("radeon/HAINAN_me.bin");
> > MODULE_FIRMWARE("radeon/HAINAN_ce.bin");
> > MODULE_FIRMWARE("radeon/HAINAN_mc.bin");
> > +MODULE_FIRMWARE("radeon/HAINAN_mc2.bin");
> > MODULE_FIRMWARE("radeon/HAINAN_rlc.bin");
> > MODULE_FIRMWARE("radeon/HAINAN_smc.bin");
> >
> > @@ -1467,7 +1472,7 @@ int si_mc_load_microcode(struct radeon_device
> *rdev)
> > const __be32 *fw_data;
> > u32 running, blackout = 0;
> > 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)
> > return -EINVAL;
> > @@ -1475,28 +1480,23 @@ int si_mc_load_microcode(struct
> radeon_device *rdev)
> > switch (rdev->family) {
> > case CHIP_TAHITI:
> > io_mc_regs = (u32 *)&tahiti_io_mc_regs;
> > - ucode_size = SI_MC_UCODE_SIZE;
> > regs_size = TAHITI_IO_MC_REGS_SIZE;
> > break;
> > case CHIP_PITCAIRN:
> > io_mc_regs = (u32 *)&pitcairn_io_mc_regs;
> > - ucode_size = SI_MC_UCODE_SIZE;
> > regs_size = TAHITI_IO_MC_REGS_SIZE;
> > break;
> > case CHIP_VERDE:
> > default:
> > io_mc_regs = (u32 *)&verde_io_mc_regs;
> > - ucode_size = SI_MC_UCODE_SIZE;
> > regs_size = TAHITI_IO_MC_REGS_SIZE;
> > break;
> > case CHIP_OLAND:
> > io_mc_regs = (u32 *)&oland_io_mc_regs;
> > - ucode_size = OLAND_MC_UCODE_SIZE;
> > regs_size = TAHITI_IO_MC_REGS_SIZE;
> > break;
> > case CHIP_HAINAN:
> > io_mc_regs = (u32 *)&hainan_io_mc_regs;
> > - ucode_size = OLAND_MC_UCODE_SIZE;
> > regs_size = TAHITI_IO_MC_REGS_SIZE;
> > break;
> > }
> > @@ -1552,7 +1552,7 @@ static int si_init_microcode(struct radeon_device
> *rdev)
> > const char *chip_name;
> > const char *rlc_chip_name;
> > size_t pfp_req_size, me_req_size, ce_req_size, rlc_req_size,
> mc_req_size;
> > - size_t smc_req_size;
> > + size_t smc_req_size, mc2_req_size;
> > char fw_name[30];
> > int err;
> >
> > @@ -1567,6 +1567,7 @@ static int si_init_microcode(struct radeon_device
> *rdev)
> > ce_req_size = SI_CE_UCODE_SIZE * 4;
> > rlc_req_size = SI_RLC_UCODE_SIZE * 4;
> > mc_req_size = SI_MC_UCODE_SIZE * 4;
> > + mc2_req_size = TAHITI_MC_UCODE_SIZE * 4;
> > smc_req_size = ALIGN(TAHITI_SMC_UCODE_SIZE, 4);
> > break;
> > case CHIP_PITCAIRN:
> > @@ -1577,6 +1578,7 @@ static int si_init_microcode(struct radeon_device
> *rdev)
> > ce_req_size = SI_CE_UCODE_SIZE * 4;
> > rlc_req_size = SI_RLC_UCODE_SIZE * 4;
> > mc_req_size = SI_MC_UCODE_SIZE * 4;
> > + mc2_req_size = PITCAIRN_MC_UCODE_SIZE * 4;
> > smc_req_size = ALIGN(PITCAIRN_SMC_UCODE_SIZE, 4);
> > break;
> > case CHIP_VERDE:
> > @@ -1587,6 +1589,7 @@ static int si_init_microcode(struct radeon_device
> *rdev)
> > ce_req_size = SI_CE_UCODE_SIZE * 4;
> > rlc_req_size = SI_RLC_UCODE_SIZE * 4;
> > mc_req_size = SI_MC_UCODE_SIZE * 4;
> > + mc2_req_size = VERDE_MC_UCODE_SIZE * 4;
> > smc_req_size = ALIGN(VERDE_SMC_UCODE_SIZE, 4);
> > break;
> > case CHIP_OLAND:
> > @@ -1596,7 +1599,7 @@ static int si_init_microcode(struct radeon_device
> *rdev)
> > me_req_size = SI_PM4_UCODE_SIZE * 4;
> > ce_req_size = SI_CE_UCODE_SIZE * 4;
> > rlc_req_size = SI_RLC_UCODE_SIZE * 4;
> > - mc_req_size = OLAND_MC_UCODE_SIZE * 4;
> > + mc_req_size = mc2_req_size = OLAND_MC_UCODE_SIZE * 4;
> > smc_req_size = ALIGN(OLAND_SMC_UCODE_SIZE, 4);
> > break;
> > case CHIP_HAINAN:
> > @@ -1606,7 +1609,7 @@ static int si_init_microcode(struct radeon_device
> *rdev)
> > me_req_size = SI_PM4_UCODE_SIZE * 4;
> > ce_req_size = SI_CE_UCODE_SIZE * 4;
> > rlc_req_size = SI_RLC_UCODE_SIZE * 4;
> > - mc_req_size = OLAND_MC_UCODE_SIZE * 4;
> > + mc_req_size = mc2_req_size = OLAND_MC_UCODE_SIZE * 4;
> > smc_req_size = ALIGN(HAINAN_SMC_UCODE_SIZE, 4);
> > break;
> > default: BUG();
> > @@ -1659,11 +1662,16 @@ static int si_init_microcode(struct
> radeon_device *rdev)
> > err = -EINVAL;
> > }
> >
> > - 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);
> > - if (err)
> > - goto out;
> > - if (rdev->mc_fw->size != mc_req_size) {
> > + if (err) {
> > + snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin",
> chip_name);
> > + 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
> > "si_mc: Bogus length %zu in firmware \"%s\"\n",
> > rdev->mc_fw->size, fw_name);
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2014-04-11 15:05 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-04-11 14:52 [PATCH 1/3] drm/radeon: add support for newer mc ucode on SI Alex Deucher
2014-04-11 14:52 ` [PATCH 2/3] drm/radeon: add support for newer mc ucode on CI Alex Deucher
2014-04-11 14:52 ` [PATCH 3/3] drm/radeon: re-enable mclk dpm on R7 260X asics Alex Deucher
2014-04-11 15:03 ` [PATCH 1/3] drm/radeon: add support for newer mc ucode on SI Christian König
2014-04-11 15:05 ` Deucher, Alexander
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.