Skip to content

Commit 9ca8261

Browse files
lsgunthjoergroedel
authored andcommitted
iommu/vt-d: Add helper to set an IRTE to verify only the bus number
The current code uses set_irte_sid() with SVT_VERIFY_BUS and PCI_DEVID to set the SID value. However, this is very confusing because, with SVT_VERIFY_BUS, the SID value is not a PCI devfn address, but the start and end bus numbers to match against. According to the Intel Virtualization Technology for Directed I/O Architecture Specification, Rev. 3.0, page 9-36: The most significant 8-bits of the SID field contains the Startbus#, and the least significant 8-bits of the SID field contains the Endbus#. Interrupt requests that reference this IRTE must have a requester-id whose bus# (most significant 8-bits of requester-id) has a value equal to or within the Startbus# to Endbus# range. So to make this more clear, introduce a new set_irte_verify_bus() that explicitly takes a start bus and end bus so that we can stop abusing the PCI_DEVID macro. This helper function will be called a second time in an subsequent patch. Signed-off-by: Logan Gunthorpe <logang@deltatee.com> Cc: David Woodhouse <dwmw2@infradead.org> Cc: Joerg Roedel <joro@8bytes.org> Cc: Jacob Pan <jacob.jun.pan@linux.intel.com> Signed-off-by: Joerg Roedel <jroedel@suse.de>
1 parent f096d66 commit 9ca8261

File tree

1 file changed

+14
-3
lines changed

1 file changed

+14
-3
lines changed

drivers/iommu/intel_irq_remapping.c

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,18 @@ static void set_irte_sid(struct irte *irte, unsigned int svt,
294294
irte->sid = sid;
295295
}
296296

297+
/*
298+
* Set an IRTE to match only the bus number. Interrupt requests that reference
299+
* this IRTE must have a requester-id whose bus number is between or equal
300+
* to the start_bus and end_bus arguments.
301+
*/
302+
static void set_irte_verify_bus(struct irte *irte, unsigned int start_bus,
303+
unsigned int end_bus)
304+
{
305+
set_irte_sid(irte, SVT_VERIFY_BUS, SQ_ALL_16,
306+
(start_bus << 8) | end_bus);
307+
}
308+
297309
static int set_ioapic_sid(struct irte *irte, int apic)
298310
{
299311
int i;
@@ -391,9 +403,8 @@ static int set_msi_sid(struct irte *irte, struct pci_dev *dev)
391403
* original device.
392404
*/
393405
if (PCI_BUS_NUM(data.alias) != data.pdev->bus->number)
394-
set_irte_sid(irte, SVT_VERIFY_BUS, SQ_ALL_16,
395-
PCI_DEVID(PCI_BUS_NUM(data.alias),
396-
dev->bus->number));
406+
set_irte_verify_bus(irte, PCI_BUS_NUM(data.alias),
407+
dev->bus->number);
397408
else if (data.pdev->bus->number != dev->bus->number)
398409
set_irte_sid(irte, SVT_VERIFY_SID_SQ, SQ_ALL_16, data.alias);
399410
else

0 commit comments

Comments
 (0)