Version 1, this version, adds sysfs tear-down on rmmod. Show IP discovery in sysfs. See the commit message for the layout format. For instance, on a Sienna Cichlid, the layout looks like this: $tree /sys/class/drm/card0/device/ip_discovery/ /sys/class/drm/card0/device/ip_discovery/ └── die └── 0 ├── 1 │ └── 0 │ ├── base_addr │ ├── hw_id │ ├── major │ ├── minor │ ├── num_base_addresses │ ├── num_instance │ └── revision ├── 108 │ └── 0 │ ├── base_addr │ ├── hw_id │ ├── major │ ├── minor │ ├── num_base_addresses │ ├── num_instance │ └── revision ├── 11 │ └── 0 │ ├── base_addr │ ├── hw_id │ ├── major │ ├── minor │ ├── num_base_addresses │ ├── num_instance │ └── revision ├── 12 │ ├── 0 │ │ ├── base_addr │ │ ├── hw_id │ │ ├── major │ │ ├── minor │ │ ├── num_base_addresses │ │ ├── num_instance │ │ └── revision │ └── 1 │ ├── base_addr │ ├── hw_id │ ├── major │ ├── minor │ ├── num_base_addresses │ ├── num_instance │ └── revision ├── 128 │ └── 0 │ ├── base_addr │ ├── hw_id │ ├── major │ ├── minor │ ├── num_base_addresses │ ├── num_instance │ └── revision ├── 150 │ ├── 0 │ │ ├── base_addr │ │ ├── hw_id │ │ ├── major │ │ ├── minor │ │ ├── num_base_addresses │ │ ├── num_instance │ │ └── revision │ ├── 1 │ │ ├── base_addr │ │ ├── hw_id │ │ ├── major │ │ ├── minor │ │ ├── num_base_addresses │ │ ├── num_instance │ │ └── revision │ ├── 2 │ │ ├── base_addr │ │ ├── hw_id │ │ ├── major │ │ ├── minor │ │ ├── num_base_addresses │ │ ├── num_instance │ │ └── revision │ ├── 3 │ │ ├── base_addr │ │ ├── hw_id │ │ ├── major │ │ ├── minor │ │ ├── num_base_addresses │ │ ├── num_instance │ │ └── revision │ ├── 4 │ │ ├── base_addr │ │ ├── hw_id │ │ ├── major │ │ ├── minor │ │ ├── num_base_addresses │ │ ├── num_instance │ │ └── revision │ ├── 5 │ │ ├── base_addr │ │ ├── hw_id │ │ ├── major │ │ ├── minor │ │ ├── num_base_addresses │ │ ├── num_instance │ │ └── revision │ ├── 6 │ │ ├── base_addr │ │ ├── hw_id │ │ ├── major │ │ ├── minor │ │ ├── num_base_addresses │ │ ├── num_instance │ │ └── revision │ └── 7 │ ├── base_addr │ ├── hw_id │ ├── major │ ├── minor │ ├── num_base_addresses │ ├── num_instance │ └── revision ├── 170 │ └── 0 │ ├── base_addr │ ├── hw_id │ ├── major │ ├── minor │ ├── num_base_addresses │ ├── num_instance │ └── revision ├── 200 │ ├── 0 │ │ ├── base_addr │ │ ├── hw_id │ │ ├── major │ │ ├── minor │ │ ├── num_base_addresses │ │ ├── num_instance │ │ └── revision │ └── 1 │ ├── base_addr │ ├── hw_id │ ├── major │ ├── minor │ ├── num_base_addresses │ ├── num_instance │ └── revision ├── 255 │ └── 0 │ ├── base_addr │ ├── hw_id │ ├── major │ ├── minor │ ├── num_base_addresses │ ├── num_instance │ └── revision ├── 271 │ └── 0 │ ├── base_addr │ ├── hw_id │ ├── major │ ├── minor │ ├── num_base_addresses │ ├── num_instance │ └── revision ├── 3 │ └── 0 │ ├── base_addr │ ├── hw_id │ ├── major │ ├── minor │ ├── num_base_addresses │ ├── num_instance │ └── revision ├── 34 │ └── 0 │ ├── base_addr │ ├── hw_id │ ├── major │ ├── minor │ ├── num_base_addresses │ ├── num_instance │ └── revision ├── 35 │ └── 0 │ ├── base_addr │ ├── hw_id │ ├── major │ ├── minor │ ├── num_base_addresses │ ├── num_instance │ └── revision ├── 36 │ └── 0 │ ├── base_addr │ ├── hw_id │ ├── major │ ├── minor │ ├── num_base_addresses │ ├── num_instance │ └── revision ├── 37 │ └── 0 │ ├── base_addr │ ├── hw_id │ ├── major │ ├── minor │ ├── num_base_addresses │ ├── num_instance │ └── revision ├── 4 │ └── 0 │ ├── base_addr │ ├── hw_id │ ├── major │ ├── minor │ ├── num_base_addresses │ ├── num_instance │ └── revision ├── 40 │ └── 0 │ ├── base_addr │ ├── hw_id │ ├── major │ ├── minor │ ├── num_base_addresses │ ├── num_instance │ └── revision ├── 41 │ └── 0 │ ├── base_addr │ ├── hw_id │ ├── major │ ├── minor │ ├── num_base_addresses │ ├── num_instance │ └── revision ├── 42 │ └── 0 │ ├── base_addr │ ├── hw_id │ ├── major │ ├── minor │ ├── num_base_addresses │ ├── num_instance │ └── revision ├── 43 │ └── 0 │ ├── base_addr │ ├── hw_id │ ├── major │ ├── minor │ ├── num_base_addresses │ ├── num_instance │ └── revision ├── 46 │ └── 0 │ ├── base_addr │ ├── hw_id │ ├── major │ ├── minor │ ├── num_base_addresses │ ├── num_instance │ └── revision ├── 47 │ └── 0 │ ├── base_addr │ ├── hw_id │ ├── major │ ├── minor │ ├── num_base_addresses │ ├── num_instance │ └── revision ├── 49 │ └── 0 │ ├── base_addr │ ├── hw_id │ ├── major │ ├── minor │ ├── num_base_addresses │ ├── num_instance │ └── revision ├── 5 │ └── 0 │ ├── base_addr │ ├── hw_id │ ├── major │ ├── minor │ ├── num_base_addresses │ ├── num_instance │ └── revision ├── 6 │ ├── 0 │ │ ├── base_addr │ │ ├── hw_id │ │ ├── major │ │ ├── minor │ │ ├── num_base_addresses │ │ ├── num_instance │ │ └── revision │ ├── 1 │ │ ├── base_addr │ │ ├── hw_id │ │ ├── major │ │ ├── minor │ │ ├── num_base_addresses │ │ ├── num_instance │ │ └── revision │ ├── 2 │ │ ├── base_addr │ │ ├── hw_id │ │ ├── major │ │ ├── minor │ │ ├── num_base_addresses │ │ ├── num_instance │ │ └── revision │ ├── 3 │ │ ├── base_addr │ │ ├── hw_id │ │ ├── major │ │ ├── minor │ │ ├── num_base_addresses │ │ ├── num_instance │ │ └── revision │ ├── 4 │ │ ├── base_addr │ │ ├── hw_id │ │ ├── major │ │ ├── minor │ │ ├── num_base_addresses │ │ ├── num_instance │ │ └── revision │ ├── 5 │ │ ├── base_addr │ │ ├── hw_id │ │ ├── major │ │ ├── minor │ │ ├── num_base_addresses │ │ ├── num_instance │ │ └── revision │ ├── 6 │ │ ├── base_addr │ │ ├── hw_id │ │ ├── major │ │ ├── minor │ │ ├── num_base_addresses │ │ ├── num_instance │ │ └── revision │ ├── 7 │ │ ├── base_addr │ │ ├── hw_id │ │ ├── major │ │ ├── minor │ │ ├── num_base_addresses │ │ ├── num_instance │ │ └── revision │ ├── 8 │ │ ├── base_addr │ │ ├── hw_id │ │ ├── major │ │ ├── minor │ │ ├── num_base_addresses │ │ ├── num_instance │ │ └── revision │ └── 9 │ ├── base_addr │ ├── hw_id │ ├── major │ ├── minor │ ├── num_base_addresses │ ├── num_instance │ └── revision ├── 66 │ └── 0 │ ├── base_addr │ ├── hw_id │ ├── major │ ├── minor │ ├── num_base_addresses │ ├── num_instance │ └── revision ├── 68 │ └── 0 │ ├── base_addr │ ├── hw_id │ ├── major │ ├── minor │ ├── num_base_addresses │ ├── num_instance │ └── revision ├── 69 │ └── 0 │ ├── base_addr │ ├── hw_id │ ├── major │ ├── minor │ ├── num_base_addresses │ ├── num_instance │ └── revision ├── 70 │ └── 0 │ ├── base_addr │ ├── hw_id │ ├── major │ ├── minor │ ├── num_base_addresses │ ├── num_instance │ └── revision ├── 80 │ ├── 0 │ │ ├── base_addr │ │ ├── hw_id │ │ ├── major │ │ ├── minor │ │ ├── num_base_addresses │ │ ├── num_instance │ │ └── revision │ ├── 1 │ │ ├── base_addr │ │ ├── hw_id │ │ ├── major │ │ ├── minor │ │ ├── num_base_addresses │ │ ├── num_instance │ │ └── revision │ ├── 2 │ │ ├── base_addr │ │ ├── hw_id │ │ ├── major │ │ ├── minor │ │ ├── num_base_addresses │ │ ├── num_instance │ │ └── revision │ ├── 3 │ │ ├── base_addr │ │ ├── hw_id │ │ ├── major │ │ ├── minor │ │ ├── num_base_addresses │ │ ├── num_instance │ │ └── revision │ └── 4 │ ├── base_addr │ ├── hw_id │ ├── major │ ├── minor │ ├── num_base_addresses │ ├── num_instance │ └── revision ├── ATHUB -> 35 ├── CLKA -> 6 ├── CLKB -> 47 ├── DBGU_NBIO -> 36 ├── DF -> 46 ├── DFX -> 37 ├── DFX_DAP -> 49 ├── DMU -> 271 ├── FUSE -> 5 ├── GC -> 11 ├── HDP -> 41 ├── MMHUB -> 34 ├── MP0 -> 255 ├── MP1 -> 1 ├── NBIF -> 108 ├── num_ips ├── OSSSYS -> 40 ├── PCIE -> 70 ├── PCS -> 80 ├── SDMA0 -> 42 ├── SDMA1 -> 43 ├── SDMA2 -> 68 ├── SDMA3 -> 69 ├── SMUIO -> 4 ├── SYSTEMHUB -> 128 ├── THM -> 3 ├── UMC -> 150 ├── USB -> 170 ├── UVD -> 12 ├── WAFLC -> 66 └── XGMI -> 200 114 directories, 365 files $_ "num_ips" shows the total number of IPs, as this count exists by the same name in the binary data. Typycal contents of IP attributes is, $head /sys/class/drm/card0/device/ip_discovery/die/0/GC/0/* ==> /sys/class/drm/card0/device/ip_discovery/die/0/GC/0/base_addr <== 0x00001260 0x0000A000 0x0001C000 0x02402C00 ==> /sys/class/drm/card0/device/ip_discovery/die/0/GC/0/hw_id <== 11 ==> /sys/class/drm/card0/device/ip_discovery/die/0/GC/0/major <== 10 ==> /sys/class/drm/card0/device/ip_discovery/die/0/GC/0/minor <== 3 ==> /sys/class/drm/card0/device/ip_discovery/die/0/GC/0/num_base_addresses <== 4 ==> /sys/class/drm/card0/device/ip_discovery/die/0/GC/0/num_instance <== 0 ==> /sys/class/drm/card0/device/ip_discovery/die/0/GC/0/revision <== 0 $_ Luben Tuikov (1): drm/amdgpu: Show IP discovery in sysfs Cc: Alex Deucher <Alexander.Deucher@xxxxxxx> Cc: Tom StDenis <tom.stdenis@xxxxxxx> drivers/gpu/drm/amd/amdgpu/amdgpu.h | 4 + drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c | 486 ++++++++++++++++++ 2 files changed, 490 insertions(+) base-commit: ff7951de1a24615706ca2533e27170961ce11f27 -- 2.35.0.3.gb23dac905b