|
@@ -587,6 +587,7 @@ static int gfx_v8_0_init_microcode(struct amdgpu_device *adev)
|
|
int err;
|
|
int err;
|
|
struct amdgpu_firmware_info *info = NULL;
|
|
struct amdgpu_firmware_info *info = NULL;
|
|
const struct common_firmware_header *header = NULL;
|
|
const struct common_firmware_header *header = NULL;
|
|
|
|
+ const struct gfx_firmware_header_v1_0 *cp_hdr;
|
|
|
|
|
|
DRM_DEBUG("\n");
|
|
DRM_DEBUG("\n");
|
|
|
|
|
|
@@ -611,6 +612,9 @@ static int gfx_v8_0_init_microcode(struct amdgpu_device *adev)
|
|
err = amdgpu_ucode_validate(adev->gfx.pfp_fw);
|
|
err = amdgpu_ucode_validate(adev->gfx.pfp_fw);
|
|
if (err)
|
|
if (err)
|
|
goto out;
|
|
goto out;
|
|
|
|
+ cp_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.pfp_fw->data;
|
|
|
|
+ adev->gfx.pfp_fw_version = le32_to_cpu(cp_hdr->header.ucode_version);
|
|
|
|
+ adev->gfx.pfp_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version);
|
|
|
|
|
|
snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me.bin", chip_name);
|
|
snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_me.bin", chip_name);
|
|
err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
|
|
err = request_firmware(&adev->gfx.me_fw, fw_name, adev->dev);
|
|
@@ -619,6 +623,9 @@ static int gfx_v8_0_init_microcode(struct amdgpu_device *adev)
|
|
err = amdgpu_ucode_validate(adev->gfx.me_fw);
|
|
err = amdgpu_ucode_validate(adev->gfx.me_fw);
|
|
if (err)
|
|
if (err)
|
|
goto out;
|
|
goto out;
|
|
|
|
+ cp_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.me_fw->data;
|
|
|
|
+ adev->gfx.me_fw_version = le32_to_cpu(cp_hdr->header.ucode_version);
|
|
|
|
+ adev->gfx.me_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version);
|
|
|
|
|
|
snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce.bin", chip_name);
|
|
snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ce.bin", chip_name);
|
|
err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
|
|
err = request_firmware(&adev->gfx.ce_fw, fw_name, adev->dev);
|
|
@@ -627,12 +634,18 @@ static int gfx_v8_0_init_microcode(struct amdgpu_device *adev)
|
|
err = amdgpu_ucode_validate(adev->gfx.ce_fw);
|
|
err = amdgpu_ucode_validate(adev->gfx.ce_fw);
|
|
if (err)
|
|
if (err)
|
|
goto out;
|
|
goto out;
|
|
|
|
+ cp_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.ce_fw->data;
|
|
|
|
+ adev->gfx.ce_fw_version = le32_to_cpu(cp_hdr->header.ucode_version);
|
|
|
|
+ adev->gfx.ce_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version);
|
|
|
|
|
|
snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc.bin", chip_name);
|
|
snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc.bin", chip_name);
|
|
err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev);
|
|
err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev);
|
|
if (err)
|
|
if (err)
|
|
goto out;
|
|
goto out;
|
|
err = amdgpu_ucode_validate(adev->gfx.rlc_fw);
|
|
err = amdgpu_ucode_validate(adev->gfx.rlc_fw);
|
|
|
|
+ cp_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.rlc_fw->data;
|
|
|
|
+ adev->gfx.rlc_fw_version = le32_to_cpu(cp_hdr->header.ucode_version);
|
|
|
|
+ adev->gfx.rlc_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version);
|
|
|
|
|
|
snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec.bin", chip_name);
|
|
snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec.bin", chip_name);
|
|
err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev);
|
|
err = request_firmware(&adev->gfx.mec_fw, fw_name, adev->dev);
|
|
@@ -641,6 +654,9 @@ static int gfx_v8_0_init_microcode(struct amdgpu_device *adev)
|
|
err = amdgpu_ucode_validate(adev->gfx.mec_fw);
|
|
err = amdgpu_ucode_validate(adev->gfx.mec_fw);
|
|
if (err)
|
|
if (err)
|
|
goto out;
|
|
goto out;
|
|
|
|
+ cp_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec_fw->data;
|
|
|
|
+ adev->gfx.mec_fw_version = le32_to_cpu(cp_hdr->header.ucode_version);
|
|
|
|
+ adev->gfx.mec_feature_version = le32_to_cpu(cp_hdr->ucode_feature_version);
|
|
|
|
|
|
snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec2.bin", chip_name);
|
|
snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_mec2.bin", chip_name);
|
|
err = request_firmware(&adev->gfx.mec2_fw, fw_name, adev->dev);
|
|
err = request_firmware(&adev->gfx.mec2_fw, fw_name, adev->dev);
|
|
@@ -648,6 +664,12 @@ static int gfx_v8_0_init_microcode(struct amdgpu_device *adev)
|
|
err = amdgpu_ucode_validate(adev->gfx.mec2_fw);
|
|
err = amdgpu_ucode_validate(adev->gfx.mec2_fw);
|
|
if (err)
|
|
if (err)
|
|
goto out;
|
|
goto out;
|
|
|
|
+ cp_hdr = (const struct gfx_firmware_header_v1_0 *)
|
|
|
|
+ adev->gfx.mec2_fw->data;
|
|
|
|
+ adev->gfx.mec2_fw_version = le32_to_cpu(
|
|
|
|
+ cp_hdr->header.ucode_version);
|
|
|
|
+ adev->gfx.mec2_feature_version = le32_to_cpu(
|
|
|
|
+ cp_hdr->ucode_feature_version);
|
|
} else {
|
|
} else {
|
|
err = 0;
|
|
err = 0;
|
|
adev->gfx.mec2_fw = NULL;
|
|
adev->gfx.mec2_fw = NULL;
|
|
@@ -1983,6 +2005,7 @@ static void gfx_v8_0_gpu_init(struct amdgpu_device *adev)
|
|
adev->gfx.config.max_shader_engines = 1;
|
|
adev->gfx.config.max_shader_engines = 1;
|
|
adev->gfx.config.max_tile_pipes = 2;
|
|
adev->gfx.config.max_tile_pipes = 2;
|
|
adev->gfx.config.max_sh_per_se = 1;
|
|
adev->gfx.config.max_sh_per_se = 1;
|
|
|
|
+ adev->gfx.config.max_backends_per_se = 2;
|
|
|
|
|
|
switch (adev->pdev->revision) {
|
|
switch (adev->pdev->revision) {
|
|
case 0xc4:
|
|
case 0xc4:
|
|
@@ -1991,7 +2014,6 @@ static void gfx_v8_0_gpu_init(struct amdgpu_device *adev)
|
|
case 0xcc:
|
|
case 0xcc:
|
|
/* B10 */
|
|
/* B10 */
|
|
adev->gfx.config.max_cu_per_sh = 8;
|
|
adev->gfx.config.max_cu_per_sh = 8;
|
|
- adev->gfx.config.max_backends_per_se = 2;
|
|
|
|
break;
|
|
break;
|
|
case 0xc5:
|
|
case 0xc5:
|
|
case 0x81:
|
|
case 0x81:
|
|
@@ -2000,14 +2022,12 @@ static void gfx_v8_0_gpu_init(struct amdgpu_device *adev)
|
|
case 0xcd:
|
|
case 0xcd:
|
|
/* B8 */
|
|
/* B8 */
|
|
adev->gfx.config.max_cu_per_sh = 6;
|
|
adev->gfx.config.max_cu_per_sh = 6;
|
|
- adev->gfx.config.max_backends_per_se = 2;
|
|
|
|
break;
|
|
break;
|
|
case 0xc6:
|
|
case 0xc6:
|
|
case 0xca:
|
|
case 0xca:
|
|
case 0xce:
|
|
case 0xce:
|
|
/* B6 */
|
|
/* B6 */
|
|
adev->gfx.config.max_cu_per_sh = 6;
|
|
adev->gfx.config.max_cu_per_sh = 6;
|
|
- adev->gfx.config.max_backends_per_se = 2;
|
|
|
|
break;
|
|
break;
|
|
case 0xc7:
|
|
case 0xc7:
|
|
case 0x87:
|
|
case 0x87:
|
|
@@ -2015,7 +2035,6 @@ static void gfx_v8_0_gpu_init(struct amdgpu_device *adev)
|
|
default:
|
|
default:
|
|
/* B4 */
|
|
/* B4 */
|
|
adev->gfx.config.max_cu_per_sh = 4;
|
|
adev->gfx.config.max_cu_per_sh = 4;
|
|
- adev->gfx.config.max_backends_per_se = 1;
|
|
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -2275,7 +2294,6 @@ static int gfx_v8_0_rlc_load_microcode(struct amdgpu_device *adev)
|
|
|
|
|
|
hdr = (const struct rlc_firmware_header_v2_0 *)adev->gfx.rlc_fw->data;
|
|
hdr = (const struct rlc_firmware_header_v2_0 *)adev->gfx.rlc_fw->data;
|
|
amdgpu_ucode_print_rlc_hdr(&hdr->header);
|
|
amdgpu_ucode_print_rlc_hdr(&hdr->header);
|
|
- adev->gfx.rlc_fw_version = le32_to_cpu(hdr->header.ucode_version);
|
|
|
|
|
|
|
|
fw_data = (const __le32 *)(adev->gfx.rlc_fw->data +
|
|
fw_data = (const __le32 *)(adev->gfx.rlc_fw->data +
|
|
le32_to_cpu(hdr->header.ucode_array_offset_bytes));
|
|
le32_to_cpu(hdr->header.ucode_array_offset_bytes));
|
|
@@ -2361,12 +2379,6 @@ static int gfx_v8_0_cp_gfx_load_microcode(struct amdgpu_device *adev)
|
|
amdgpu_ucode_print_gfx_hdr(&pfp_hdr->header);
|
|
amdgpu_ucode_print_gfx_hdr(&pfp_hdr->header);
|
|
amdgpu_ucode_print_gfx_hdr(&ce_hdr->header);
|
|
amdgpu_ucode_print_gfx_hdr(&ce_hdr->header);
|
|
amdgpu_ucode_print_gfx_hdr(&me_hdr->header);
|
|
amdgpu_ucode_print_gfx_hdr(&me_hdr->header);
|
|
- adev->gfx.pfp_fw_version = le32_to_cpu(pfp_hdr->header.ucode_version);
|
|
|
|
- adev->gfx.ce_fw_version = le32_to_cpu(ce_hdr->header.ucode_version);
|
|
|
|
- adev->gfx.me_fw_version = le32_to_cpu(me_hdr->header.ucode_version);
|
|
|
|
- adev->gfx.me_feature_version = le32_to_cpu(me_hdr->ucode_feature_version);
|
|
|
|
- adev->gfx.ce_feature_version = le32_to_cpu(ce_hdr->ucode_feature_version);
|
|
|
|
- adev->gfx.pfp_feature_version = le32_to_cpu(pfp_hdr->ucode_feature_version);
|
|
|
|
|
|
|
|
gfx_v8_0_cp_gfx_enable(adev, false);
|
|
gfx_v8_0_cp_gfx_enable(adev, false);
|
|
|
|
|
|
@@ -2622,7 +2634,6 @@ static int gfx_v8_0_cp_compute_load_microcode(struct amdgpu_device *adev)
|
|
|
|
|
|
mec_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec_fw->data;
|
|
mec_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec_fw->data;
|
|
amdgpu_ucode_print_gfx_hdr(&mec_hdr->header);
|
|
amdgpu_ucode_print_gfx_hdr(&mec_hdr->header);
|
|
- adev->gfx.mec_fw_version = le32_to_cpu(mec_hdr->header.ucode_version);
|
|
|
|
|
|
|
|
fw_data = (const __le32 *)
|
|
fw_data = (const __le32 *)
|
|
(adev->gfx.mec_fw->data +
|
|
(adev->gfx.mec_fw->data +
|
|
@@ -2641,7 +2652,6 @@ static int gfx_v8_0_cp_compute_load_microcode(struct amdgpu_device *adev)
|
|
|
|
|
|
mec2_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec2_fw->data;
|
|
mec2_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec2_fw->data;
|
|
amdgpu_ucode_print_gfx_hdr(&mec2_hdr->header);
|
|
amdgpu_ucode_print_gfx_hdr(&mec2_hdr->header);
|
|
- adev->gfx.mec2_fw_version = le32_to_cpu(mec2_hdr->header.ucode_version);
|
|
|
|
|
|
|
|
fw_data = (const __le32 *)
|
|
fw_data = (const __le32 *)
|
|
(adev->gfx.mec2_fw->data +
|
|
(adev->gfx.mec2_fw->data +
|