]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
drm/amd: Load VCN microcode during early_init
authorMario Limonciello <mario.limonciello@amd.com>
Wed, 28 Dec 2022 07:26:12 +0000 (01:26 -0600)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 9 Jan 2023 22:02:18 +0000 (17:02 -0500)
Simplifies the code so that all VCN versions will get the firmware
name from `amdgpu_ucode_ip_version_decode` and then use this filename
to load microcode as part of the early_init process.

Reviewed-by: Lijo Lazar <lijo.lazar@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h
drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c

index cd35eab1f048417331faa6c7202647e08190aee9..a7eae84c7bf75aea01664bbd3c66debf7d5999c2 100644 (file)
@@ -80,10 +80,24 @@ MODULE_FIRMWARE(FIRMWARE_VCN4_0_4);
 
 static void amdgpu_vcn_idle_work_handler(struct work_struct *work);
 
+int amdgpu_vcn_early_init(struct amdgpu_device *adev)
+{
+       char ucode_prefix[30];
+       char fw_name[40];
+       int r;
+
+       amdgpu_ucode_ip_version_decode(adev, UVD_HWIP, ucode_prefix, sizeof(ucode_prefix));
+       snprintf(fw_name, sizeof(fw_name), "amdgpu/%s.bin", ucode_prefix);
+       r = amdgpu_ucode_request(adev, &adev->vcn.fw, fw_name);
+       if (r)
+               amdgpu_ucode_release(&adev->vcn.fw);
+
+       return r;
+}
+
 int amdgpu_vcn_sw_init(struct amdgpu_device *adev)
 {
        unsigned long bo_size;
-       const char *fw_name;
        const struct common_firmware_header *hdr;
        unsigned char fw_check;
        unsigned int fw_shared_size, log_offset;
@@ -99,46 +113,27 @@ int amdgpu_vcn_sw_init(struct amdgpu_device *adev)
        switch (adev->ip_versions[UVD_HWIP][0]) {
        case IP_VERSION(1, 0, 0):
        case IP_VERSION(1, 0, 1):
-               if (adev->apu_flags & AMD_APU_IS_RAVEN2)
-                       fw_name = FIRMWARE_RAVEN2;
-               else if (adev->apu_flags & AMD_APU_IS_PICASSO)
-                       fw_name = FIRMWARE_PICASSO;
-               else
-                       fw_name = FIRMWARE_RAVEN;
-               break;
        case IP_VERSION(2, 5, 0):
-               fw_name = FIRMWARE_ARCTURUS;
                if ((adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) &&
                    (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG))
                        adev->vcn.indirect_sram = true;
                break;
        case IP_VERSION(2, 2, 0):
-               if (adev->apu_flags & AMD_APU_IS_RENOIR)
-                       fw_name = FIRMWARE_RENOIR;
-               else
-                       fw_name = FIRMWARE_GREEN_SARDINE;
-
                if ((adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) &&
                    (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG))
                        adev->vcn.indirect_sram = true;
                break;
        case IP_VERSION(2, 6, 0):
-               fw_name = FIRMWARE_ALDEBARAN;
                if ((adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) &&
                    (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG))
                        adev->vcn.indirect_sram = true;
                break;
        case IP_VERSION(2, 0, 0):
-               fw_name = FIRMWARE_NAVI10;
                if ((adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) &&
                    (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG))
                        adev->vcn.indirect_sram = true;
                break;
        case IP_VERSION(2, 0, 2):
-               if (adev->asic_type == CHIP_NAVI12)
-                       fw_name = FIRMWARE_NAVI12;
-               else
-                       fw_name = FIRMWARE_NAVI14;
                if ((adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) &&
                    (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG))
                        adev->vcn.indirect_sram = true;
@@ -146,58 +141,46 @@ int amdgpu_vcn_sw_init(struct amdgpu_device *adev)
        case IP_VERSION(3, 0, 0):
        case IP_VERSION(3, 0, 64):
        case IP_VERSION(3, 0, 192):
-               if (adev->ip_versions[GC_HWIP][0] == IP_VERSION(10, 3, 0))
-                       fw_name = FIRMWARE_SIENNA_CICHLID;
-               else
-                       fw_name = FIRMWARE_NAVY_FLOUNDER;
                if ((adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) &&
                    (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG))
                        adev->vcn.indirect_sram = true;
                break;
        case IP_VERSION(3, 0, 2):
-               fw_name = FIRMWARE_VANGOGH;
                if ((adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) &&
                    (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG))
                        adev->vcn.indirect_sram = true;
                break;
        case IP_VERSION(3, 0, 16):
-               fw_name = FIRMWARE_DIMGREY_CAVEFISH;
                if ((adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) &&
                    (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG))
                        adev->vcn.indirect_sram = true;
                break;
        case IP_VERSION(3, 0, 33):
-               fw_name = FIRMWARE_BEIGE_GOBY;
                if ((adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) &&
                    (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG))
                        adev->vcn.indirect_sram = true;
                break;
        case IP_VERSION(3, 1, 1):
-               fw_name = FIRMWARE_YELLOW_CARP;
                if ((adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) &&
                    (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG))
                        adev->vcn.indirect_sram = true;
                break;
        case IP_VERSION(3, 1, 2):
-               fw_name = FIRMWARE_VCN_3_1_2;
                if ((adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) &&
                    (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG))
                        adev->vcn.indirect_sram = true;
                break;
        case IP_VERSION(4, 0, 0):
-               fw_name = FIRMWARE_VCN4_0_0;
                if ((adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) &&
                        (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG))
                        adev->vcn.indirect_sram = true;
                break;
        case IP_VERSION(4, 0, 2):
-               fw_name = FIRMWARE_VCN4_0_2;
                if ((adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) &&
                        (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG))
                        adev->vcn.indirect_sram = true;
                break;
        case IP_VERSION(4, 0, 4):
-               fw_name = FIRMWARE_VCN4_0_4;
                if ((adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) &&
                        (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG))
                        adev->vcn.indirect_sram = true;
@@ -206,12 +189,6 @@ int amdgpu_vcn_sw_init(struct amdgpu_device *adev)
                return -EINVAL;
        }
 
-       r = amdgpu_ucode_request(adev, &adev->vcn.fw, fw_name);
-       if (r) {
-               amdgpu_ucode_release(&adev->vcn.fw);
-               return r;
-       }
-
        hdr = (const struct common_firmware_header *)adev->vcn.fw->data;
        adev->vcn.fw_version = le32_to_cpu(hdr->ucode_version);
 
index dbb8d68a30c61040c9115d7d0ce2b43018f6ec4f..d3e2af902907822256ff4d84dbd044e11f52b5f9 100644 (file)
@@ -369,6 +369,7 @@ enum vcn_ring_type {
        VCN_UNIFIED_RING,
 };
 
+int amdgpu_vcn_early_init(struct amdgpu_device *adev);
 int amdgpu_vcn_sw_init(struct amdgpu_device *adev);
 int amdgpu_vcn_sw_fini(struct amdgpu_device *adev);
 int amdgpu_vcn_suspend(struct amdgpu_device *adev);
index f0fbcda76f5e398e40464b1a3b949160056d6d5e..c305b2cb8490cab2ad1a68843d24efc009c38bf6 100644 (file)
@@ -57,11 +57,12 @@ static void vcn_v1_0_idle_work_handler(struct work_struct *work);
 static void vcn_v1_0_ring_begin_use(struct amdgpu_ring *ring);
 
 /**
- * vcn_v1_0_early_init - set function pointers
+ * vcn_v1_0_early_init - set function pointers and load microcode
  *
  * @handle: amdgpu_device pointer
  *
  * Set ring and irq function pointers
+ * Load microcode from filesystem
  */
 static int vcn_v1_0_early_init(void *handle)
 {
@@ -75,7 +76,7 @@ static int vcn_v1_0_early_init(void *handle)
 
        jpeg_v1_0_early_init(handle);
 
-       return 0;
+       return amdgpu_vcn_early_init(adev);
 }
 
 /**
index 08871bad9994a25888787a5d0c0997b431067180..4b4cd88414e092e64df5bdc0e707bc90936aeee8 100644 (file)
@@ -62,11 +62,12 @@ static int vcn_v2_0_pause_dpg_mode(struct amdgpu_device *adev,
                                int inst_idx, struct dpg_pause_state *new_state);
 static int vcn_v2_0_start_sriov(struct amdgpu_device *adev);
 /**
- * vcn_v2_0_early_init - set function pointers
+ * vcn_v2_0_early_init - set function pointers and load microcode
  *
  * @handle: amdgpu_device pointer
  *
  * Set ring and irq function pointers
+ * Load microcode from filesystem
  */
 static int vcn_v2_0_early_init(void *handle)
 {
@@ -81,7 +82,7 @@ static int vcn_v2_0_early_init(void *handle)
        vcn_v2_0_set_enc_ring_funcs(adev);
        vcn_v2_0_set_irq_funcs(adev);
 
-       return 0;
+       return amdgpu_vcn_early_init(adev);
 }
 
 /**
index ec87b00f2e052b7d0f50ca374e3d359c416128ba..b0b0e69c6a94389acc9746c0f6b89c8a6ada6fdc 100644 (file)
@@ -71,11 +71,12 @@ static int amdgpu_ih_clientid_vcns[] = {
 };
 
 /**
- * vcn_v2_5_early_init - set function pointers
+ * vcn_v2_5_early_init - set function pointers and load microcode
  *
  * @handle: amdgpu_device pointer
  *
  * Set ring and irq function pointers
+ * Load microcode from filesystem
  */
 static int vcn_v2_5_early_init(void *handle)
 {
@@ -107,7 +108,7 @@ static int vcn_v2_5_early_init(void *handle)
        vcn_v2_5_set_irq_funcs(adev);
        vcn_v2_5_set_ras_funcs(adev);
 
-       return 0;
+       return amdgpu_vcn_early_init(adev);
 }
 
 /**
index 9c8b5fd9903720253c9464380864a3a16ec26a64..bd228512424a53b5d250d83fcbb50d0545941622 100644 (file)
@@ -78,11 +78,12 @@ static void vcn_v3_0_dec_ring_set_wptr(struct amdgpu_ring *ring);
 static void vcn_v3_0_enc_ring_set_wptr(struct amdgpu_ring *ring);
 
 /**
- * vcn_v3_0_early_init - set function pointers
+ * vcn_v3_0_early_init - set function pointers and load microcode
  *
  * @handle: amdgpu_device pointer
  *
  * Set ring and irq function pointers
+ * Load microcode from filesystem
  */
 static int vcn_v3_0_early_init(void *handle)
 {
@@ -109,7 +110,7 @@ static int vcn_v3_0_early_init(void *handle)
        vcn_v3_0_set_enc_ring_funcs(adev);
        vcn_v3_0_set_irq_funcs(adev);
 
-       return 0;
+       return amdgpu_vcn_early_init(adev);
 }
 
 /**
index 1e2b22299975ffba902ec00a9ed8d6a84d2b6494..a79b6088374b13e967ed6864016d1386ae2a4810 100644 (file)
@@ -68,11 +68,12 @@ static void vcn_v4_0_unified_ring_set_wptr(struct amdgpu_ring *ring);
 static void vcn_v4_0_set_ras_funcs(struct amdgpu_device *adev);
 
 /**
- * vcn_v4_0_early_init - set function pointers
+ * vcn_v4_0_early_init - set function pointers and load microcode
  *
  * @handle: amdgpu_device pointer
  *
  * Set ring and irq function pointers
+ * Load microcode from filesystem
  */
 static int vcn_v4_0_early_init(void *handle)
 {
@@ -88,7 +89,7 @@ static int vcn_v4_0_early_init(void *handle)
        vcn_v4_0_set_irq_funcs(adev);
        vcn_v4_0_set_ras_funcs(adev);
 
-       return 0;
+       return amdgpu_vcn_early_init(adev);
 }
 
 /**