Version 2, this version, integrates community feedback. Version 1, 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/DMU/0/* ==> /sys/class/drm/card0/device/ip_discovery/die/0/DMU/0/base_addr <== 0x00000012 0x000000C0 0x000034C0 0x00009000 0x02403C00 ==> /sys/class/drm/card0/device/ip_discovery/die/0/DMU/0/hw_id <== 271 ==> /sys/class/drm/card0/device/ip_discovery/die/0/DMU/0/major <== 3 ==> /sys/class/drm/card0/device/ip_discovery/die/0/DMU/0/minor <== 0 ==> /sys/class/drm/card0/device/ip_discovery/die/0/DMU/0/num_base_addresses <== 5 ==> /sys/class/drm/card0/device/ip_discovery/die/0/DMU/0/num_instance <== 0 ==> /sys/class/drm/card0/device/ip_discovery/die/0/DMU/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> Signed-off-by: Luben Tuikov <luben.tuikov@xxxxxxx> drivers/gpu/drm/amd/amdgpu/amdgpu.h | 4 + drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c | 493 ++++++++++++++++++ 2 files changed, 497 insertions(+) base-commit: 5c0feae0fd9dc4095b4fae81a82932597b36a760 -- 2.35.0.3.gb23dac905b