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
>