Merge tag 'iommu-updates-v6.9' of git://git.kernel.org/pub/scm/linux/kernel/git/joro...
[linux-2.6-microblaze.git] / Documentation / ABI / testing / debugfs-intel-iommu
diff --git a/Documentation/ABI/testing/debugfs-intel-iommu b/Documentation/ABI/testing/debugfs-intel-iommu
new file mode 100644 (file)
index 0000000..2ab8464
--- /dev/null
@@ -0,0 +1,276 @@
+What:          /sys/kernel/debug/iommu/intel/iommu_regset
+Date:          December 2023
+Contact:       Jingqi Liu <Jingqi.liu@intel.com>
+Description:
+               This file dumps all the register contents for each IOMMU device.
+
+               Example in Kabylake:
+
+               ::
+
+                $ sudo cat /sys/kernel/debug/iommu/intel/iommu_regset
+
+                IOMMU: dmar0 Register Base Address: 26be37000
+
+                Name                    Offset          Contents
+                VER                     0x00            0x0000000000000010
+                GCMD                    0x18            0x0000000000000000
+                GSTS                    0x1c            0x00000000c7000000
+                FSTS                    0x34            0x0000000000000000
+                FECTL                   0x38            0x0000000000000000
+
+                [...]
+
+                IOMMU: dmar1 Register Base Address: fed90000
+
+                Name                    Offset          Contents
+                VER                     0x00            0x0000000000000010
+                GCMD                    0x18            0x0000000000000000
+                GSTS                    0x1c            0x00000000c7000000
+                FSTS                    0x34            0x0000000000000000
+                FECTL                   0x38            0x0000000000000000
+
+                [...]
+
+                IOMMU: dmar2 Register Base Address: fed91000
+
+                Name                    Offset          Contents
+                VER                     0x00            0x0000000000000010
+                GCMD                    0x18            0x0000000000000000
+                GSTS                    0x1c            0x00000000c7000000
+                FSTS                    0x34            0x0000000000000000
+                FECTL                   0x38            0x0000000000000000
+
+                [...]
+
+What:          /sys/kernel/debug/iommu/intel/ir_translation_struct
+Date:          December 2023
+Contact:       Jingqi Liu <Jingqi.liu@intel.com>
+Description:
+               This file dumps the table entries for Interrupt
+               remapping and Interrupt posting.
+
+               Example in Kabylake:
+
+               ::
+
+                $ sudo cat /sys/kernel/debug/iommu/intel/ir_translation_struct
+
+                Remapped Interrupt supported on IOMMU: dmar0
+                IR table address:100900000
+
+                Entry SrcID   DstID    Vct IRTE_high           IRTE_low
+                0     00:0a.0 00000080 24  0000000000040050    000000800024000d
+                1     00:0a.0 00000001 ef  0000000000040050    0000000100ef000d
+
+                Remapped Interrupt supported on IOMMU: dmar1
+                IR table address:100300000
+                Entry SrcID   DstID    Vct IRTE_high           IRTE_low
+                0     00:02.0 00000002 26  0000000000040010    000000020026000d
+
+                [...]
+
+                ****
+
+                Posted Interrupt supported on IOMMU: dmar0
+                IR table address:100900000
+                Entry SrcID   PDA_high PDA_low  Vct IRTE_high          IRTE_low
+
+What:          /sys/kernel/debug/iommu/intel/dmar_translation_struct
+Date:          December 2023
+Contact:       Jingqi Liu <Jingqi.liu@intel.com>
+Description:
+               This file dumps Intel IOMMU DMA remapping tables, such
+               as root table, context table, PASID directory and PASID
+               table entries in debugfs. For legacy mode, it doesn't
+               support PASID, and hence PASID field is defaulted to
+               '-1' and other PASID related fields are invalid.
+
+               Example in Kabylake:
+
+               ::
+
+                $ sudo cat /sys/kernel/debug/iommu/intel/dmar_translation_struct
+
+                IOMMU dmar1: Root Table Address: 0x103027000
+                B.D.F   Root_entry
+                00:02.0 0x0000000000000000:0x000000010303e001
+
+                Context_entry
+                0x0000000000000102:0x000000010303f005
+
+                PASID   PASID_table_entry
+                -1      0x0000000000000000:0x0000000000000000:0x0000000000000000
+
+                IOMMU dmar0: Root Table Address: 0x103028000
+                B.D.F   Root_entry
+                00:0a.0 0x0000000000000000:0x00000001038a7001
+
+                Context_entry
+                0x0000000000000000:0x0000000103220e7d
+
+                PASID   PASID_table_entry
+                0       0x0000000000000000:0x0000000000800002:0x00000001038a5089
+
+                [...]
+
+What:          /sys/kernel/debug/iommu/intel/invalidation_queue
+Date:          December 2023
+Contact:       Jingqi Liu <Jingqi.liu@intel.com>
+Description:
+               This file exports invalidation queue internals of each
+               IOMMU device.
+
+               Example in Kabylake:
+
+               ::
+
+                $ sudo cat /sys/kernel/debug/iommu/intel/invalidation_queue
+
+                Invalidation queue on IOMMU: dmar0
+                Base: 0x10022e000      Head: 20        Tail: 20
+                Index          qw0                    qw1                     qw2
+                    0   0000000000000014        0000000000000000        0000000000000000
+                    1   0000000200000025        0000000100059c04        0000000000000000
+                    2   0000000000000014        0000000000000000        0000000000000000
+
+                               qw3                  status
+                        0000000000000000        0000000000000000
+                        0000000000000000        0000000000000000
+                        0000000000000000        0000000000000000
+
+                [...]
+
+                Invalidation queue on IOMMU: dmar1
+                Base: 0x10026e000      Head: 32        Tail: 32
+                Index           qw0                     qw1                   status
+                    0   0000000000000004        0000000000000000         0000000000000000
+                    1   0000000200000025        0000000100059804         0000000000000000
+                    2   0000000000000011        0000000000000000         0000000000000000
+
+                [...]
+
+What:          /sys/kernel/debug/iommu/intel/dmar_perf_latency
+Date:          December 2023
+Contact:       Jingqi Liu <Jingqi.liu@intel.com>
+Description:
+               This file is used to control and show counts of
+               execution time ranges for various types per DMAR.
+
+               Firstly, write a value to
+               /sys/kernel/debug/iommu/intel/dmar_perf_latency
+               to enable sampling.
+
+               The possible values are as follows:
+
+               * 0 - disable sampling all latency data
+
+               * 1 - enable sampling IOTLB invalidation latency data
+
+               * 2 - enable sampling devTLB invalidation latency data
+
+               * 3 - enable sampling intr entry cache invalidation latency data
+
+               Next, read /sys/kernel/debug/iommu/intel/dmar_perf_latency gives
+               a snapshot of sampling result of all enabled monitors.
+
+               Examples in Kabylake:
+
+               ::
+
+                1) Disable sampling all latency data:
+
+                $ sudo echo 0 > /sys/kernel/debug/iommu/intel/dmar_perf_latency
+
+                2) Enable sampling IOTLB invalidation latency data
+
+                $ sudo echo 1 > /sys/kernel/debug/iommu/intel/dmar_perf_latency
+
+                $ sudo cat /sys/kernel/debug/iommu/intel/dmar_perf_latency
+
+                IOMMU: dmar0 Register Base Address: 26be37000
+                                <0.1us   0.1us-1us    1us-10us  10us-100us   100us-1ms
+                inv_iotlb           0           0           0           0           0
+
+                                1ms-10ms      >=10ms     min(us)     max(us) average(us)
+                inv_iotlb           0           0           0           0           0
+
+                [...]
+
+                IOMMU: dmar2 Register Base Address: fed91000
+                                <0.1us   0.1us-1us    1us-10us  10us-100us   100us-1ms
+                inv_iotlb           0           0          18           0           0
+
+                                1ms-10ms      >=10ms     min(us)     max(us) average(us)
+                inv_iotlb           0           0           2           2           2
+
+                3) Enable sampling devTLB invalidation latency data
+
+                $ sudo echo 2 > /sys/kernel/debug/iommu/intel/dmar_perf_latency
+
+                $ sudo cat /sys/kernel/debug/iommu/intel/dmar_perf_latency
+
+                IOMMU: dmar0 Register Base Address: 26be37000
+                                <0.1us   0.1us-1us    1us-10us  10us-100us   100us-1ms
+                inv_devtlb           0           0           0           0           0
+
+                                >=10ms     min(us)     max(us) average(us)
+                inv_devtlb           0           0           0           0
+
+                [...]
+
+What:          /sys/kernel/debug/iommu/intel/<bdf>/domain_translation_struct
+Date:          December 2023
+Contact:       Jingqi Liu <Jingqi.liu@intel.com>
+Description:
+               This file dumps a specified page table of Intel IOMMU
+               in legacy mode or scalable mode.
+
+               For a device that only supports legacy mode, dump its
+               page table by the debugfs file in the debugfs device
+               directory. e.g.
+               /sys/kernel/debug/iommu/intel/0000:00:02.0/domain_translation_struct.
+
+               For a device that supports scalable mode, dump the
+               page table of specified pasid by the debugfs file in
+               the debugfs pasid directory. e.g.
+               /sys/kernel/debug/iommu/intel/0000:00:02.0/1/domain_translation_struct.
+
+               Examples in Kabylake:
+
+               ::
+
+                1) Dump the page table of device "0000:00:02.0" that only supports legacy mode.
+
+                $ sudo cat /sys/kernel/debug/iommu/intel/0000:00:02.0/domain_translation_struct
+
+                Device 0000:00:02.0 @0x1017f8000
+                IOVA_PFN                PML5E                   PML4E
+                0x000000008d800 |       0x0000000000000000      0x00000001017f9003
+                0x000000008d801 |       0x0000000000000000      0x00000001017f9003
+                0x000000008d802 |       0x0000000000000000      0x00000001017f9003
+
+                PDPE                    PDE                     PTE
+                0x00000001017fa003      0x00000001017fb003      0x000000008d800003
+                0x00000001017fa003      0x00000001017fb003      0x000000008d801003
+                0x00000001017fa003      0x00000001017fb003      0x000000008d802003
+
+                [...]
+
+                2) Dump the page table of device "0000:00:0a.0" with PASID "1" that
+                supports scalable mode.
+
+                $ sudo cat /sys/kernel/debug/iommu/intel/0000:00:0a.0/1/domain_translation_struct
+
+                Device 0000:00:0a.0 with pasid 1 @0x10c112000
+                IOVA_PFN                PML5E                   PML4E
+                0x0000000000000 |       0x0000000000000000      0x000000010df93003
+                0x0000000000001 |       0x0000000000000000      0x000000010df93003
+                0x0000000000002 |       0x0000000000000000      0x000000010df93003
+
+                PDPE                    PDE                     PTE
+                0x0000000106ae6003      0x0000000104b38003      0x0000000147c00803
+                0x0000000106ae6003      0x0000000104b38003      0x0000000147c01803
+                0x0000000106ae6003      0x0000000104b38003      0x0000000147c02803
+
+                [...]