[PATCH v2 5/8] iommu/amd: Add support for device id user input

Dheeraj Kumar Srivastava posted 8 patches 1 year, 3 months ago
There is a newer version of this series
[PATCH v2 5/8] iommu/amd: Add support for device id user input
Posted by Dheeraj Kumar Srivastava 1 year, 3 months ago
Device id user input is needed for dumping IOMMU data structures like
device table, IRT etc in AMD IOMMU debugfs.

eg.
1. # echo 0000:01:00.0 > /sys/kernel/debug/iommu/amd/devid
   # cat /sys/kernel/debug/iommu/amd/devid
   Output : 0000:01:00.0

2. # echo 01:00.0 > /sys/kernel/debug/iommu/amd/devid
   # cat /sys/kernel/debug/iommu/amd/devid
   Output : 0000:01:00.0

Signed-off-by: Dheeraj Kumar Srivastava <dheerajkumar.srivastava@amd.com>
---
 drivers/iommu/amd/debugfs.c | 78 +++++++++++++++++++++++++++++++++++++
 1 file changed, 78 insertions(+)

diff --git a/drivers/iommu/amd/debugfs.c b/drivers/iommu/amd/debugfs.c
index 1b989d45257f..74c88a80c6d0 100644
--- a/drivers/iommu/amd/debugfs.c
+++ b/drivers/iommu/amd/debugfs.c
@@ -16,9 +16,11 @@ static struct dentry *amd_iommu_debugfs;
 
 #define	MAX_NAME_LEN	20
 #define	OFS_IN_SZ	8
+#define	DEVID_IN_SZ	16
 
 static int mmio_offset = -1;
 static int cap_offset = -1;
+static int sbdf = -1;
 
 static ssize_t iommu_mmio_write(struct file *filp, const char __user *ubuf,
 				size_t cnt, loff_t *ppos)
@@ -149,6 +151,80 @@ static int iommu_cmdbuf_show(struct seq_file *m, void *unused)
 }
 DEFINE_SHOW_ATTRIBUTE(iommu_cmdbuf);
 
+static ssize_t devid_write(struct file *filp, const char __user *ubuf,
+			   size_t cnt, loff_t *ppos)
+{
+	struct amd_iommu_pci_seg *pci_seg;
+	int seg, bus, slot, func;
+	struct amd_iommu *iommu;
+	char *srcid_ptr;
+	u16 devid;
+	int i;
+
+	sbdf = -1;
+
+	if (cnt >= DEVID_IN_SZ)
+		return -EINVAL;
+
+	srcid_ptr = memdup_user_nul(ubuf, cnt);
+	if (IS_ERR(srcid_ptr))
+		return PTR_ERR(srcid_ptr);
+
+	i = sscanf(srcid_ptr, "%x:%x:%x.%x", &seg, &bus, &slot, &func);
+	if (i != 4) {
+		i = sscanf(srcid_ptr, "%x:%x.%x", &bus, &slot, &func);
+		if (i != 3) {
+			kfree(srcid_ptr);
+			return -EINVAL;
+		}
+		seg = 0;
+	}
+
+	devid = PCI_DEVID(bus, PCI_DEVFN(slot, func));
+
+	/* Check if user device id input is a valid input */
+	for_each_pci_segment(pci_seg) {
+		if (pci_seg->id != seg)
+			continue;
+		if (devid > pci_seg->last_bdf) {
+			kfree(srcid_ptr);
+			return -EINVAL;
+		}
+		iommu = pci_seg->rlookup_table[devid];
+		if (!iommu) {
+			kfree(srcid_ptr);
+			return -ENODEV;
+		}
+		break;
+	}
+
+	if (pci_seg->id != seg) {
+		kfree(srcid_ptr);
+		return -EINVAL;
+	}
+
+	sbdf = PCI_SEG_DEVID_TO_SBDF(seg, devid);
+
+	kfree(srcid_ptr);
+
+	return cnt;
+}
+
+static int devid_show(struct seq_file *m, void *unused)
+{
+	u16 devid;
+
+	if (sbdf >= 0) {
+		devid = PCI_SBDF_TO_DEVID(sbdf);
+		seq_printf(m, "%04x:%02x:%02x:%x\n", PCI_SBDF_TO_SEGID(sbdf),
+			   PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid));
+	} else
+		seq_puts(m, "No or Invalid input provided\n");
+
+	return 0;
+}
+DEFINE_SHOW_STORE_ATTRIBUTE(devid);
+
 void amd_iommu_debugfs_setup(void)
 {
 	struct amd_iommu *iommu;
@@ -171,4 +247,6 @@ void amd_iommu_debugfs_setup(void)
 		debugfs_create_file("cmdbuf", 0444, iommu->debugfs, iommu,
 				    &iommu_cmdbuf_fops);
 	}
+	debugfs_create_file("devid", 0644, amd_iommu_debugfs, NULL,
+			    &devid_fops);
 }
-- 
2.25.1
Re: [PATCH v2 5/8] iommu/amd: Add support for device id user input
Posted by Bjorn Helgaas 1 year, 2 months ago
On Wed, Nov 06, 2024 at 01:16:36PM +0530, Dheeraj Kumar Srivastava wrote:
> Device id user input is needed for dumping IOMMU data structures like
> device table, IRT etc in AMD IOMMU debugfs.
> 
> eg.
> 1. # echo 0000:01:00.0 > /sys/kernel/debug/iommu/amd/devid
>    # cat /sys/kernel/debug/iommu/amd/devid
>    Output : 0000:01:00.0
> 
> 2. # echo 01:00.0 > /sys/kernel/debug/iommu/amd/devid
>    # cat /sys/kernel/debug/iommu/amd/devid
>    Output : 0000:01:00.0

The corresponding Intel IOMMU debugfs support encodes the BDF in the
pathname, e.g.,

  /sys/kernel/debug/iommu/intel/<bdf>/domain_translation_struct

Can you do the same?  I think it would be nicer to use a similar
style, and it would also make the code simpler.

Bjorn
Re: [PATCH v2 5/8] iommu/amd: Add support for device id user input
Posted by Srivastava, Dheeraj Kumar 1 year ago
On 11/27/2024 2:32 AM, Bjorn Helgaas wrote:
> On Wed, Nov 06, 2024 at 01:16:36PM +0530, Dheeraj Kumar Srivastava wrote:
>> Device id user input is needed for dumping IOMMU data structures like
>> device table, IRT etc in AMD IOMMU debugfs.
>>
>> eg.
>> 1. # echo 0000:01:00.0 > /sys/kernel/debug/iommu/amd/devid
>>     # cat /sys/kernel/debug/iommu/amd/devid
>>     Output : 0000:01:00.0
>>
>> 2. # echo 01:00.0 > /sys/kernel/debug/iommu/amd/devid
>>     # cat /sys/kernel/debug/iommu/amd/devid
>>     Output : 0000:01:00.0
> 
> The corresponding Intel IOMMU debugfs support encodes the BDF in the
> pathname, e.g.,
> 
>    /sys/kernel/debug/iommu/intel/<bdf>/domain_translation_struct
> 
> Can you do the same?  I think it would be nicer to use a similar
> style, and it would also make the code simpler.
> 

Hi, Yeah i do agree with your suggestion. But lets keep this as open 
question about how we want the interface to be and get more suggestions 
on this one. Will reiterate with all other changes suggested.


Regards
Dheeraj

> Bjorn