On Fri, Oct 10, 2025 at 11:11 AM Lijo Lazar <[email protected]> wrote:
>
> Add amdgpu_discovery_info structure to keep all discovery related
> information.
>
> Signed-off-by: Lijo Lazar <[email protected]>
> ---
>
> v2: Remove superfluous discovery_ prefix for members (Alex)
>
>  drivers/gpu/drm/amd/amdgpu/amdgpu.h           |  10 +-
>  drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c   |   7 +-
>  drivers/gpu/drm/amd/amdgpu/amdgpu_device.c    |   4 +-
>  drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c | 192 ++++++++++--------
>  drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.h |  11 +
>  drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c       |   2 +-
>  6 files changed, 129 insertions(+), 97 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> index 9cbc8648f837..f52b783a8eb6 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> @@ -839,8 +839,6 @@ struct amd_powerplay {
>         const struct amd_pm_funcs *pp_funcs;
>  };
>
> -struct ip_discovery_top;
> -
>  /* polaris10 kickers */
>  #define ASICID_IS_P20(did, rid)                (((did == 0x67DF) && \
>                                          ((rid == 0xE3) || \
> @@ -972,8 +970,7 @@ struct amdgpu_device {
>         struct notifier_block           acpi_nb;
>         struct notifier_block           pm_nb;
>         struct amdgpu_i2c_chan          *i2c_bus[AMDGPU_MAX_I2C_BUS];
> -       struct debugfs_blob_wrapper     debugfs_vbios_blob;
> -       struct debugfs_blob_wrapper     debugfs_discovery_blob;
> +       struct debugfs_blob_wrapper debugfs_vbios_blob;
>         struct mutex                    srbm_mutex;
>         /* GRBM index mutex. Protects concurrent access to GRBM index */
>         struct mutex                    grbm_idx_mutex;
> @@ -1063,6 +1060,9 @@ struct amdgpu_device {
>                 u32                     log2_max_MBps;
>         } mm_stats;
>
> +       /* discovery*/
> +       struct amdgpu_discovery_info discovery;
> +
>         /* display */
>         bool                            enable_virtual_display;
>         struct amdgpu_vkms_output       *amdgpu_vkms_output;
> @@ -1265,8 +1265,6 @@ struct amdgpu_device {
>
>         struct list_head                ras_list;
>
> -       struct ip_discovery_top         *ip_top;
> -
>         struct amdgpu_reset_domain      *reset_domain;
>
>         struct mutex                    benchmark_mutex;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
> index a70651050acf..f45926abea67 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
> @@ -2123,10 +2123,9 @@ int amdgpu_debugfs_init(struct amdgpu_device *adev)
>         debugfs_create_blob("amdgpu_vbios", 0444, root,
>                             &adev->debugfs_vbios_blob);
>
> -       adev->debugfs_discovery_blob.data = adev->mman.discovery_bin;
> -       adev->debugfs_discovery_blob.size = adev->mman.discovery_tmr_size;
> -       debugfs_create_blob("amdgpu_discovery", 0444, root,
> -                           &adev->debugfs_discovery_blob);
> +       if (adev->discovery.debugfs_blob.size)
> +               debugfs_create_blob("amdgpu_discovery", 0444, root,
> +                                   &adev->discovery.debugfs_blob);
>
>         return 0;
>  }
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> index f3d42c5b1547..57f3c4373c90 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> @@ -2626,7 +2626,7 @@ static int amdgpu_device_parse_gpu_info_fw(struct 
> amdgpu_device *adev)
>                 chip_name = "arcturus";
>                 break;
>         case CHIP_NAVI12:
> -               if (adev->mman.discovery_bin)
> +               if (adev->discovery.size)

I think it's probably ok here, but it does change the semantics.

>                         return 0;
>                 chip_name = "navi12";
>                 break;
> @@ -5038,7 +5038,7 @@ void amdgpu_device_fini_sw(struct amdgpu_device *adev)
>
>         if (IS_ENABLED(CONFIG_PERF_EVENTS))
>                 amdgpu_pmu_fini(adev);
> -       if (adev->mman.discovery_bin)
> +       if (adev->discovery.size)

Shouldn't we check for .bin here? amdgpu_discovery_fini() handling
freeing that memory.

Alex

>                 amdgpu_discovery_fini(adev);
>
>         amdgpu_reset_put_reset_domain(adev->reset_domain);
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
> index 73401f0aeb34..02b661232db8 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c
> @@ -254,9 +254,9 @@ static int 
> amdgpu_discovery_read_binary_from_sysmem(struct amdgpu_device *adev,
>         pos = tmr_offset + tmr_size - DISCOVERY_TMR_OFFSET;
>
>         /* This region is read-only and reserved from system use */
> -       discv_regn = memremap(pos, adev->mman.discovery_tmr_size, 
> MEMREMAP_WC);
> +       discv_regn = memremap(pos, adev->discovery.size, MEMREMAP_WC);
>         if (discv_regn) {
> -               memcpy(binary, discv_regn, adev->mman.discovery_tmr_size);
> +               memcpy(binary, discv_regn, adev->discovery.size);
>                 memunmap(discv_regn);
>                 return 0;
>         }
> @@ -301,7 +301,7 @@ static int amdgpu_discovery_read_binary_from_mem(struct 
> amdgpu_device *adev,
>         if (sz_valid) {
>                 uint64_t pos = vram_size - DISCOVERY_TMR_OFFSET;
>                 amdgpu_device_vram_access(adev, pos, (uint32_t *)binary,
> -                                         adev->mman.discovery_tmr_size, 
> false);
> +                                         adev->discovery.size, false);
>         } else {
>                 ret = amdgpu_discovery_read_binary_from_sysmem(adev, binary);
>         }
> @@ -389,6 +389,7 @@ static void amdgpu_discovery_harvest_config_quirk(struct 
> amdgpu_device *adev)
>  static int amdgpu_discovery_verify_npsinfo(struct amdgpu_device *adev,
>                                            struct binary_header *bhdr)
>  {
> +       uint8_t *discovery_bin = adev->discovery.bin;
>         struct table_info *info;
>         uint16_t checksum;
>         uint16_t offset;
> @@ -398,14 +399,14 @@ static int amdgpu_discovery_verify_npsinfo(struct 
> amdgpu_device *adev,
>         checksum = le16_to_cpu(info->checksum);
>
>         struct nps_info_header *nhdr =
> -               (struct nps_info_header *)(adev->mman.discovery_bin + offset);
> +               (struct nps_info_header *)(discovery_bin + offset);
>
>         if (le32_to_cpu(nhdr->table_id) != NPS_INFO_TABLE_ID) {
>                 dev_dbg(adev->dev, "invalid ip discovery nps info table 
> id\n");
>                 return -EINVAL;
>         }
>
> -       if (!amdgpu_discovery_verify_checksum(adev->mman.discovery_bin + 
> offset,
> +       if (!amdgpu_discovery_verify_checksum(discovery_bin + offset,
>                                               le32_to_cpu(nhdr->size_bytes),
>                                               checksum)) {
>                 dev_dbg(adev->dev, "invalid nps info data table checksum\n");
> @@ -447,49 +448,53 @@ static int amdgpu_discovery_init(struct amdgpu_device 
> *adev)
>  {
>         struct table_info *info;
>         struct binary_header *bhdr;
> +       uint8_t *discovery_bin;
>         const char *fw_name;
>         uint16_t offset;
>         uint16_t size;
>         uint16_t checksum;
>         int r;
>
> -       adev->mman.discovery_tmr_size = DISCOVERY_TMR_SIZE;
> -       adev->mman.discovery_bin = kzalloc(adev->mman.discovery_tmr_size, 
> GFP_KERNEL);
> -       if (!adev->mman.discovery_bin)
> +       adev->discovery.bin = kzalloc(DISCOVERY_TMR_SIZE, GFP_KERNEL);
> +       if (!adev->discovery.bin)
>                 return -ENOMEM;
> +       adev->discovery.size = DISCOVERY_TMR_SIZE;
> +       adev->discovery.debugfs_blob.data = adev->discovery.bin;
> +       adev->discovery.debugfs_blob.size = adev->discovery.size;
>
> +       discovery_bin = adev->discovery.bin;
>         /* Read from file if it is the preferred option */
>         fw_name = amdgpu_discovery_get_fw_name(adev);
>         if (fw_name != NULL) {
>                 drm_dbg(&adev->ddev, "use ip discovery information from 
> file");
> -               r = amdgpu_discovery_read_binary_from_file(adev, 
> adev->mman.discovery_bin, fw_name);
> +               r = amdgpu_discovery_read_binary_from_file(adev, 
> discovery_bin,
> +                                                          fw_name);
>                 if (r)
>                         goto out;
>         } else {
>                 drm_dbg(&adev->ddev, "use ip discovery information from 
> memory");
> -               r = amdgpu_discovery_read_binary_from_mem(
> -                       adev, adev->mman.discovery_bin);
> +               r = amdgpu_discovery_read_binary_from_mem(adev, 
> discovery_bin);
>                 if (r)
>                         goto out;
>         }
>
>         /* check the ip discovery binary signature */
> -       if 
> (!amdgpu_discovery_verify_binary_signature(adev->mman.discovery_bin)) {
> +       if (!amdgpu_discovery_verify_binary_signature(discovery_bin)) {
>                 dev_err(adev->dev,
>                         "get invalid ip discovery binary signature\n");
>                 r = -EINVAL;
>                 goto out;
>         }
>
> -       bhdr = (struct binary_header *)adev->mman.discovery_bin;
> +       bhdr = (struct binary_header *)discovery_bin;
>
>         offset = offsetof(struct binary_header, binary_checksum) +
>                 sizeof(bhdr->binary_checksum);
>         size = le16_to_cpu(bhdr->binary_size) - offset;
>         checksum = le16_to_cpu(bhdr->binary_checksum);
>
> -       if (!amdgpu_discovery_verify_checksum(adev->mman.discovery_bin + 
> offset,
> -                                             size, checksum)) {
> +       if (!amdgpu_discovery_verify_checksum(discovery_bin + offset, size,
> +                                             checksum)) {
>                 dev_err(adev->dev, "invalid ip discovery binary checksum\n");
>                 r = -EINVAL;
>                 goto out;
> @@ -501,15 +506,16 @@ static int amdgpu_discovery_init(struct amdgpu_device 
> *adev)
>
>         if (offset) {
>                 struct ip_discovery_header *ihdr =
> -                       (struct ip_discovery_header 
> *)(adev->mman.discovery_bin + offset);
> +                       (struct ip_discovery_header *)(discovery_bin + 
> offset);
>                 if (le32_to_cpu(ihdr->signature) != 
> DISCOVERY_TABLE_SIGNATURE) {
>                         dev_err(adev->dev, "invalid ip discovery data table 
> signature\n");
>                         r = -EINVAL;
>                         goto out;
>                 }
>
> -               if 
> (!amdgpu_discovery_verify_checksum(adev->mman.discovery_bin + offset,
> -                                                     
> le16_to_cpu(ihdr->size), checksum)) {
> +               if (!amdgpu_discovery_verify_checksum(discovery_bin + offset,
> +                                                     le16_to_cpu(ihdr->size),
> +                                                     checksum)) {
>                         dev_err(adev->dev, "invalid ip discovery data table 
> checksum\n");
>                         r = -EINVAL;
>                         goto out;
> @@ -522,7 +528,7 @@ static int amdgpu_discovery_init(struct amdgpu_device 
> *adev)
>
>         if (offset) {
>                 struct gpu_info_header *ghdr =
> -                       (struct gpu_info_header *)(adev->mman.discovery_bin + 
> offset);
> +                       (struct gpu_info_header *)(discovery_bin + offset);
>
>                 if (le32_to_cpu(ghdr->table_id) != GC_TABLE_ID) {
>                         dev_err(adev->dev, "invalid ip discovery gc table 
> id\n");
> @@ -530,8 +536,9 @@ static int amdgpu_discovery_init(struct amdgpu_device 
> *adev)
>                         goto out;
>                 }
>
> -               if 
> (!amdgpu_discovery_verify_checksum(adev->mman.discovery_bin + offset,
> -                                                     
> le32_to_cpu(ghdr->size), checksum)) {
> +               if (!amdgpu_discovery_verify_checksum(discovery_bin + offset,
> +                                                     le32_to_cpu(ghdr->size),
> +                                                     checksum)) {
>                         dev_err(adev->dev, "invalid gc data table 
> checksum\n");
>                         r = -EINVAL;
>                         goto out;
> @@ -544,7 +551,7 @@ static int amdgpu_discovery_init(struct amdgpu_device 
> *adev)
>
>         if (offset) {
>                 struct harvest_info_header *hhdr =
> -                       (struct harvest_info_header 
> *)(adev->mman.discovery_bin + offset);
> +                       (struct harvest_info_header *)(discovery_bin + 
> offset);
>
>                 if (le32_to_cpu(hhdr->signature) != HARVEST_TABLE_SIGNATURE) {
>                         dev_err(adev->dev, "invalid ip discovery harvest 
> table signature\n");
> @@ -552,8 +559,9 @@ static int amdgpu_discovery_init(struct amdgpu_device 
> *adev)
>                         goto out;
>                 }
>
> -               if 
> (!amdgpu_discovery_verify_checksum(adev->mman.discovery_bin + offset,
> -                                                     sizeof(struct 
> harvest_table), checksum)) {
> +               if (!amdgpu_discovery_verify_checksum(
> +                           discovery_bin + offset,
> +                           sizeof(struct harvest_table), checksum)) {
>                         dev_err(adev->dev, "invalid harvest data table 
> checksum\n");
>                         r = -EINVAL;
>                         goto out;
> @@ -566,7 +574,7 @@ static int amdgpu_discovery_init(struct amdgpu_device 
> *adev)
>
>         if (offset) {
>                 struct vcn_info_header *vhdr =
> -                       (struct vcn_info_header *)(adev->mman.discovery_bin + 
> offset);
> +                       (struct vcn_info_header *)(discovery_bin + offset);
>
>                 if (le32_to_cpu(vhdr->table_id) != VCN_INFO_TABLE_ID) {
>                         dev_err(adev->dev, "invalid ip discovery vcn table 
> id\n");
> @@ -574,8 +582,9 @@ static int amdgpu_discovery_init(struct amdgpu_device 
> *adev)
>                         goto out;
>                 }
>
> -               if 
> (!amdgpu_discovery_verify_checksum(adev->mman.discovery_bin + offset,
> -                                                     
> le32_to_cpu(vhdr->size_bytes), checksum)) {
> +               if (!amdgpu_discovery_verify_checksum(
> +                           discovery_bin + offset,
> +                           le32_to_cpu(vhdr->size_bytes), checksum)) {
>                         dev_err(adev->dev, "invalid vcn data table 
> checksum\n");
>                         r = -EINVAL;
>                         goto out;
> @@ -588,7 +597,7 @@ static int amdgpu_discovery_init(struct amdgpu_device 
> *adev)
>
>         if (0 && offset) {
>                 struct mall_info_header *mhdr =
> -                       (struct mall_info_header *)(adev->mman.discovery_bin 
> + offset);
> +                       (struct mall_info_header *)(discovery_bin + offset);
>
>                 if (le32_to_cpu(mhdr->table_id) != MALL_INFO_TABLE_ID) {
>                         dev_err(adev->dev, "invalid ip discovery mall table 
> id\n");
> @@ -596,8 +605,9 @@ static int amdgpu_discovery_init(struct amdgpu_device 
> *adev)
>                         goto out;
>                 }
>
> -               if 
> (!amdgpu_discovery_verify_checksum(adev->mman.discovery_bin + offset,
> -                                                     
> le32_to_cpu(mhdr->size_bytes), checksum)) {
> +               if (!amdgpu_discovery_verify_checksum(
> +                           discovery_bin + offset,
> +                           le32_to_cpu(mhdr->size_bytes), checksum)) {
>                         dev_err(adev->dev, "invalid mall data table 
> checksum\n");
>                         r = -EINVAL;
>                         goto out;
> @@ -607,8 +617,8 @@ static int amdgpu_discovery_init(struct amdgpu_device 
> *adev)
>         return 0;
>
>  out:
> -       kfree(adev->mman.discovery_bin);
> -       adev->mman.discovery_bin = NULL;
> +       kfree(adev->discovery.bin);
> +       adev->discovery.bin = NULL;
>         if ((amdgpu_discovery != 2) &&
>             (RREG32(mmIP_DISCOVERY_VERSION) == 4))
>                 amdgpu_ras_query_boot_status(adev, 4);
> @@ -620,8 +630,8 @@ static void amdgpu_discovery_sysfs_fini(struct 
> amdgpu_device *adev);
>  void amdgpu_discovery_fini(struct amdgpu_device *adev)
>  {
>         amdgpu_discovery_sysfs_fini(adev);
> -       kfree(adev->mman.discovery_bin);
> -       adev->mman.discovery_bin = NULL;
> +       kfree(adev->discovery.bin);
> +       adev->discovery.bin = NULL;
>  }
>
>  static int amdgpu_discovery_validate_ip(struct amdgpu_device *adev,
> @@ -646,6 +656,7 @@ static int amdgpu_discovery_validate_ip(struct 
> amdgpu_device *adev,
>  static void amdgpu_discovery_read_harvest_bit_per_ip(struct amdgpu_device 
> *adev,
>                                                 uint32_t *vcn_harvest_count)
>  {
> +       uint8_t *discovery_bin = adev->discovery.bin;
>         struct binary_header *bhdr;
>         struct ip_discovery_header *ihdr;
>         struct die_header *dhdr;
> @@ -655,21 +666,21 @@ static void 
> amdgpu_discovery_read_harvest_bit_per_ip(struct amdgpu_device *adev,
>         uint8_t inst;
>         int i, j;
>
> -       bhdr = (struct binary_header *)adev->mman.discovery_bin;
> -       ihdr = (struct ip_discovery_header *)(adev->mman.discovery_bin +
> -                       le16_to_cpu(bhdr->table_list[IP_DISCOVERY].offset));
> +       bhdr = (struct binary_header *)discovery_bin;
> +       ihdr = (struct ip_discovery_header
> +                       *)(discovery_bin +
> +                          
> le16_to_cpu(bhdr->table_list[IP_DISCOVERY].offset));
>         num_dies = le16_to_cpu(ihdr->num_dies);
>
>         /* scan harvest bit of all IP data structures */
>         for (i = 0; i < num_dies; i++) {
>                 die_offset = le16_to_cpu(ihdr->die_info[i].die_offset);
> -               dhdr = (struct die_header *)(adev->mman.discovery_bin + 
> die_offset);
> +               dhdr = (struct die_header *)(discovery_bin + die_offset);
>                 num_ips = le16_to_cpu(dhdr->num_ips);
>                 ip_offset = die_offset + sizeof(*dhdr);
>
>                 for (j = 0; j < num_ips; j++) {
> -                       ip = (struct ip *)(adev->mman.discovery_bin +
> -                                          ip_offset);
> +                       ip = (struct ip *)(discovery_bin + ip_offset);
>                         inst = ip->number_instance;
>                         hw_id = le16_to_cpu(ip->hw_id);
>                         if (amdgpu_discovery_validate_ip(adev, inst, hw_id))
> @@ -711,13 +722,14 @@ static void 
> amdgpu_discovery_read_from_harvest_table(struct amdgpu_device *adev,
>                                                      uint32_t 
> *vcn_harvest_count,
>                                                      uint32_t 
> *umc_harvest_count)
>  {
> +       uint8_t *discovery_bin = adev->discovery.bin;
>         struct binary_header *bhdr;
>         struct harvest_table *harvest_info;
>         u16 offset;
>         int i;
>         uint32_t umc_harvest_config = 0;
>
> -       bhdr = (struct binary_header *)adev->mman.discovery_bin;
> +       bhdr = (struct binary_header *)discovery_bin;
>         offset = le16_to_cpu(bhdr->table_list[HARVEST_INFO].offset);
>
>         if (!offset) {
> @@ -725,7 +737,7 @@ static void 
> amdgpu_discovery_read_from_harvest_table(struct amdgpu_device *adev,
>                 return;
>         }
>
> -       harvest_info = (struct harvest_table *)(adev->mman.discovery_bin + 
> offset);
> +       harvest_info = (struct harvest_table *)(discovery_bin + offset);
>
>         for (i = 0; i < 32; i++) {
>                 if (le16_to_cpu(harvest_info->list[i].hw_id) == 0)
> @@ -1021,8 +1033,8 @@ static void ip_disc_release(struct kobject *kobj)
>                                                        kobj);
>         struct amdgpu_device *adev = ip_top->adev;
>
> -       adev->ip_top = NULL;
>         kfree(ip_top);
> +       adev->discovery.ip_top = NULL;
>  }
>
>  static uint8_t amdgpu_discovery_get_harvest_info(struct amdgpu_device *adev,
> @@ -1060,6 +1072,7 @@ static int amdgpu_discovery_sysfs_ips(struct 
> amdgpu_device *adev,
>                                       const size_t _ip_offset, const int 
> num_ips,
>                                       bool reg_base_64)
>  {
> +       uint8_t *discovery_bin = adev->discovery.bin;
>         int ii, jj, kk, res;
>         uint16_t hw_id;
>         uint8_t inst;
> @@ -1077,7 +1090,7 @@ static int amdgpu_discovery_sysfs_ips(struct 
> amdgpu_device *adev,
>                         struct ip_v4 *ip;
>                         struct ip_hw_instance *ip_hw_instance;
>
> -                       ip = (struct ip_v4 *)(adev->mman.discovery_bin + 
> ip_offset);
> +                       ip = (struct ip_v4 *)(discovery_bin + ip_offset);
>                         inst = ip->instance_number;
>                         hw_id = le16_to_cpu(ip->hw_id);
>                         if (amdgpu_discovery_validate_ip(adev, inst, hw_id) ||
> @@ -1164,17 +1177,20 @@ static int amdgpu_discovery_sysfs_ips(struct 
> amdgpu_device *adev,
>
>  static int amdgpu_discovery_sysfs_recurse(struct amdgpu_device *adev)
>  {
> +       struct ip_discovery_top *ip_top = adev->discovery.ip_top;
> +       uint8_t *discovery_bin = adev->discovery.bin;
>         struct binary_header *bhdr;
>         struct ip_discovery_header *ihdr;
>         struct die_header *dhdr;
> -       struct kset *die_kset = &adev->ip_top->die_kset;
> +       struct kset *die_kset = &ip_top->die_kset;
>         u16 num_dies, die_offset, num_ips;
>         size_t ip_offset;
>         int ii, res;
>
> -       bhdr = (struct binary_header *)adev->mman.discovery_bin;
> -       ihdr = (struct ip_discovery_header *)(adev->mman.discovery_bin +
> -                                             
> le16_to_cpu(bhdr->table_list[IP_DISCOVERY].offset));
> +       bhdr = (struct binary_header *)discovery_bin;
> +       ihdr = (struct ip_discovery_header
> +                       *)(discovery_bin +
> +                          
> le16_to_cpu(bhdr->table_list[IP_DISCOVERY].offset));
>         num_dies = le16_to_cpu(ihdr->num_dies);
>
>         DRM_DEBUG("number of dies: %d\n", num_dies);
> @@ -1183,7 +1199,7 @@ static int amdgpu_discovery_sysfs_recurse(struct 
> amdgpu_device *adev)
>                 struct ip_die_entry *ip_die_entry;
>
>                 die_offset = le16_to_cpu(ihdr->die_info[ii].die_offset);
> -               dhdr = (struct die_header *)(adev->mman.discovery_bin + 
> die_offset);
> +               dhdr = (struct die_header *)(discovery_bin + die_offset);
>                 num_ips = le16_to_cpu(dhdr->num_ips);
>                 ip_offset = die_offset + sizeof(*dhdr);
>
> @@ -1217,30 +1233,32 @@ static int amdgpu_discovery_sysfs_recurse(struct 
> amdgpu_device *adev)
>
>  static int amdgpu_discovery_sysfs_init(struct amdgpu_device *adev)
>  {
> +       uint8_t *discovery_bin = adev->discovery.bin;
> +       struct ip_discovery_top *ip_top;
>         struct kset *die_kset;
>         int res, ii;
>
> -       if (!adev->mman.discovery_bin)
> +       if (!discovery_bin)
>                 return -EINVAL;
>
> -       adev->ip_top = kzalloc(sizeof(*adev->ip_top), GFP_KERNEL);
> -       if (!adev->ip_top)
> +       ip_top = kzalloc(sizeof(*ip_top), GFP_KERNEL);
> +       if (!ip_top)
>                 return -ENOMEM;
>
> -       adev->ip_top->adev = adev;
> -
> -       res = kobject_init_and_add(&adev->ip_top->kobj, &ip_discovery_ktype,
> +       ip_top->adev = adev;
> +       adev->discovery.ip_top = ip_top;
> +       res = kobject_init_and_add(&ip_top->kobj, &ip_discovery_ktype,
>                                    &adev->dev->kobj, "ip_discovery");
>         if (res) {
>                 DRM_ERROR("Couldn't init and add ip_discovery/");
>                 goto Err;
>         }
>
> -       die_kset = &adev->ip_top->die_kset;
> +       die_kset = &ip_top->die_kset;
>         kobject_set_name(&die_kset->kobj, "%s", "die");
> -       die_kset->kobj.parent = &adev->ip_top->kobj;
> +       die_kset->kobj.parent = &ip_top->kobj;
>         die_kset->kobj.ktype = &die_kobj_ktype;
> -       res = kset_register(&adev->ip_top->die_kset);
> +       res = kset_register(&ip_top->die_kset);
>         if (res) {
>                 DRM_ERROR("Couldn't register die_kset");
>                 goto Err;
> @@ -1254,7 +1272,7 @@ static int amdgpu_discovery_sysfs_init(struct 
> amdgpu_device *adev)
>
>         return res;
>  Err:
> -       kobject_put(&adev->ip_top->kobj);
> +       kobject_put(&ip_top->kobj);
>         return res;
>  }
>
> @@ -1299,10 +1317,11 @@ static void amdgpu_discovery_sysfs_die_free(struct 
> ip_die_entry *ip_die_entry)
>
>  static void amdgpu_discovery_sysfs_fini(struct amdgpu_device *adev)
>  {
> +       struct ip_discovery_top *ip_top = adev->discovery.ip_top;
>         struct list_head *el, *tmp;
>         struct kset *die_kset;
>
> -       die_kset = &adev->ip_top->die_kset;
> +       die_kset = &ip_top->die_kset;
>         spin_lock(&die_kset->list_lock);
>         list_for_each_prev_safe(el, tmp, &die_kset->list) {
>                 list_del_init(el);
> @@ -1311,8 +1330,8 @@ static void amdgpu_discovery_sysfs_fini(struct 
> amdgpu_device *adev)
>                 spin_lock(&die_kset->list_lock);
>         }
>         spin_unlock(&die_kset->list_lock);
> -       kobject_put(&adev->ip_top->die_kset.kobj);
> -       kobject_put(&adev->ip_top->kobj);
> +       kobject_put(&ip_top->die_kset.kobj);
> +       kobject_put(&ip_top->kobj);
>  }
>
>  /* ================================================== */
> @@ -1323,6 +1342,7 @@ static int amdgpu_discovery_reg_base_init(struct 
> amdgpu_device *adev)
>         struct binary_header *bhdr;
>         struct ip_discovery_header *ihdr;
>         struct die_header *dhdr;
> +       uint8_t *discovery_bin;
>         struct ip_v4 *ip;
>         uint16_t die_offset;
>         uint16_t ip_offset;
> @@ -1338,22 +1358,23 @@ static int amdgpu_discovery_reg_base_init(struct 
> amdgpu_device *adev)
>         r = amdgpu_discovery_init(adev);
>         if (r)
>                 return r;
> -
> +       discovery_bin = adev->discovery.bin;
>         wafl_ver = 0;
>         adev->gfx.xcc_mask = 0;
>         adev->sdma.sdma_mask = 0;
>         adev->vcn.inst_mask = 0;
>         adev->jpeg.inst_mask = 0;
> -       bhdr = (struct binary_header *)adev->mman.discovery_bin;
> -       ihdr = (struct ip_discovery_header *)(adev->mman.discovery_bin +
> -                       le16_to_cpu(bhdr->table_list[IP_DISCOVERY].offset));
> +       bhdr = (struct binary_header *)discovery_bin;
> +       ihdr = (struct ip_discovery_header
> +                       *)(discovery_bin +
> +                          
> le16_to_cpu(bhdr->table_list[IP_DISCOVERY].offset));
>         num_dies = le16_to_cpu(ihdr->num_dies);
>
>         DRM_DEBUG("number of dies: %d\n", num_dies);
>
>         for (i = 0; i < num_dies; i++) {
>                 die_offset = le16_to_cpu(ihdr->die_info[i].die_offset);
> -               dhdr = (struct die_header *)(adev->mman.discovery_bin + 
> die_offset);
> +               dhdr = (struct die_header *)(discovery_bin + die_offset);
>                 num_ips = le16_to_cpu(dhdr->num_ips);
>                 ip_offset = die_offset + sizeof(*dhdr);
>
> @@ -1367,7 +1388,7 @@ static int amdgpu_discovery_reg_base_init(struct 
> amdgpu_device *adev)
>                                 le16_to_cpu(dhdr->die_id), num_ips);
>
>                 for (j = 0; j < num_ips; j++) {
> -                       ip = (struct ip_v4 *)(adev->mman.discovery_bin + 
> ip_offset);
> +                       ip = (struct ip_v4 *)(discovery_bin + ip_offset);
>
>                         inst = ip->instance_number;
>                         hw_id = le16_to_cpu(ip->hw_id);
> @@ -1517,16 +1538,16 @@ static int amdgpu_discovery_reg_base_init(struct 
> amdgpu_device *adev)
>
>  static void amdgpu_discovery_harvest_ip(struct amdgpu_device *adev)
>  {
> +       uint8_t *discovery_bin = adev->discovery.bin;
>         struct ip_discovery_header *ihdr;
>         struct binary_header *bhdr;
>         int vcn_harvest_count = 0;
>         int umc_harvest_count = 0;
>         uint16_t offset, ihdr_ver;
>
> -       bhdr = (struct binary_header *)adev->mman.discovery_bin;
> +       bhdr = (struct binary_header *)discovery_bin;
>         offset = le16_to_cpu(bhdr->table_list[IP_DISCOVERY].offset);
> -       ihdr = (struct ip_discovery_header *)(adev->mman.discovery_bin +
> -                                             offset);
> +       ihdr = (struct ip_discovery_header *)(discovery_bin + offset);
>         ihdr_ver = le16_to_cpu(ihdr->version);
>         /*
>          * Harvest table does not fit Navi1x and legacy GPUs,
> @@ -1573,22 +1594,23 @@ union gc_info {
>
>  static int amdgpu_discovery_get_gfx_info(struct amdgpu_device *adev)
>  {
> +       uint8_t *discovery_bin = adev->discovery.bin;
>         struct binary_header *bhdr;
>         union gc_info *gc_info;
>         u16 offset;
>
> -       if (!adev->mman.discovery_bin) {
> +       if (!discovery_bin) {
>                 DRM_ERROR("ip discovery uninitialized\n");
>                 return -EINVAL;
>         }
>
> -       bhdr = (struct binary_header *)adev->mman.discovery_bin;
> +       bhdr = (struct binary_header *)discovery_bin;
>         offset = le16_to_cpu(bhdr->table_list[GC].offset);
>
>         if (!offset)
>                 return 0;
>
> -       gc_info = (union gc_info *)(adev->mman.discovery_bin + offset);
> +       gc_info = (union gc_info *)(discovery_bin + offset);
>
>         switch (le16_to_cpu(gc_info->v1.header.version_major)) {
>         case 1:
> @@ -1681,24 +1703,25 @@ union mall_info {
>
>  static int amdgpu_discovery_get_mall_info(struct amdgpu_device *adev)
>  {
> +       uint8_t *discovery_bin = adev->discovery.bin;
>         struct binary_header *bhdr;
>         union mall_info *mall_info;
>         u32 u, mall_size_per_umc, m_s_present, half_use;
>         u64 mall_size;
>         u16 offset;
>
> -       if (!adev->mman.discovery_bin) {
> +       if (!discovery_bin) {
>                 DRM_ERROR("ip discovery uninitialized\n");
>                 return -EINVAL;
>         }
>
> -       bhdr = (struct binary_header *)adev->mman.discovery_bin;
> +       bhdr = (struct binary_header *)discovery_bin;
>         offset = le16_to_cpu(bhdr->table_list[MALL_INFO].offset);
>
>         if (!offset)
>                 return 0;
>
> -       mall_info = (union mall_info *)(adev->mman.discovery_bin + offset);
> +       mall_info = (union mall_info *)(discovery_bin + offset);
>
>         switch (le16_to_cpu(mall_info->v1.header.version_major)) {
>         case 1:
> @@ -1737,12 +1760,13 @@ union vcn_info {
>
>  static int amdgpu_discovery_get_vcn_info(struct amdgpu_device *adev)
>  {
> +       uint8_t *discovery_bin = adev->discovery.bin;
>         struct binary_header *bhdr;
>         union vcn_info *vcn_info;
>         u16 offset;
>         int v;
>
> -       if (!adev->mman.discovery_bin) {
> +       if (!discovery_bin) {
>                 DRM_ERROR("ip discovery uninitialized\n");
>                 return -EINVAL;
>         }
> @@ -1757,13 +1781,13 @@ static int amdgpu_discovery_get_vcn_info(struct 
> amdgpu_device *adev)
>                 return -EINVAL;
>         }
>
> -       bhdr = (struct binary_header *)adev->mman.discovery_bin;
> +       bhdr = (struct binary_header *)discovery_bin;
>         offset = le16_to_cpu(bhdr->table_list[VCN_INFO].offset);
>
>         if (!offset)
>                 return 0;
>
> -       vcn_info = (union vcn_info *)(adev->mman.discovery_bin + offset);
> +       vcn_info = (union vcn_info *)(discovery_bin + offset);
>
>         switch (le16_to_cpu(vcn_info->v1.header.version_major)) {
>         case 1:
> @@ -1823,6 +1847,7 @@ int amdgpu_discovery_get_nps_info(struct amdgpu_device 
> *adev,
>                                   struct amdgpu_gmc_memrange **ranges,
>                                   int *range_cnt, bool refresh)
>  {
> +       uint8_t *discovery_bin = adev->discovery.bin;
>         struct amdgpu_gmc_memrange *mem_ranges;
>         struct binary_header *bhdr;
>         union nps_info *nps_info;
> @@ -1839,13 +1864,13 @@ int amdgpu_discovery_get_nps_info(struct 
> amdgpu_device *adev,
>                         return r;
>                 nps_info = &nps_data;
>         } else {
> -               if (!adev->mman.discovery_bin) {
> +               if (!discovery_bin) {
>                         dev_err(adev->dev,
>                                 "fetch mem range failed, ip discovery 
> uninitialized\n");
>                         return -EINVAL;
>                 }
>
> -               bhdr = (struct binary_header *)adev->mman.discovery_bin;
> +               bhdr = (struct binary_header *)discovery_bin;
>                 offset = le16_to_cpu(bhdr->table_list[NPS_INFO].offset);
>
>                 if (!offset)
> @@ -1855,8 +1880,7 @@ int amdgpu_discovery_get_nps_info(struct amdgpu_device 
> *adev,
>                 if (amdgpu_discovery_verify_npsinfo(adev, bhdr))
>                         return -ENOENT;
>
> -               nps_info =
> -                       (union nps_info *)(adev->mman.discovery_bin + offset);
> +               nps_info = (union nps_info *)(discovery_bin + offset);
>         }
>
>         switch (le16_to_cpu(nps_info->v1.header.version_major)) {
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.h 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.h
> index b44d56465c5b..b1eec3af3c4a 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.h
> @@ -24,9 +24,20 @@
>  #ifndef __AMDGPU_DISCOVERY__
>  #define __AMDGPU_DISCOVERY__
>
> +#include <linux/debugfs.h>
> +
>  #define DISCOVERY_TMR_SIZE      (10 << 10)
>  #define DISCOVERY_TMR_OFFSET    (64 << 10)
>
> +struct ip_discovery_top;
> +
> +struct amdgpu_discovery_info {
> +       struct debugfs_blob_wrapper debugfs_blob;
> +       struct ip_discovery_top *ip_top;
> +       uint32_t size;
> +       uint8_t *bin;
> +};
> +
>  void amdgpu_discovery_fini(struct amdgpu_device *adev);
>  int amdgpu_discovery_set_ip_blocks(struct amdgpu_device *adev);
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> index d13d28a5923c..5bf6bb3b2faa 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> @@ -1955,7 +1955,7 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)
>          * If IP discovery enabled, a block of memory should be
>          * reserved for IP discovey.
>          */
> -       if (adev->mman.discovery_bin) {
> +       if (adev->discovery.bin) {
>                 r = amdgpu_ttm_reserve_tmr(adev);
>                 if (r)
>                         return r;
> --
> 2.49.0
>

Reply via email to