|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen staging] AMD/IOMMU: Make ioapic_sbdf and hpet_sbdf contain pci_sbdf_t
commit 6f323b323f829c67cec12a1d04ba93f3a1a6f7da
Author: Andrii Sultanov <sultanovandriy@xxxxxxxxx>
AuthorDate: Tue Jul 22 16:20:56 2025 +0200
Commit: Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Tue Jul 22 16:20:56 2025 +0200
AMD/IOMMU: Make ioapic_sbdf and hpet_sbdf contain pci_sbdf_t
Following a similar change to amd_iommu struct, make two more structs
take pci_sbdf_t directly instead of seg and bdf separately. This lets us
drop several conversions from the latter to the former and simplifies
several comparisons and assignments.
Bloat-o-meter reports:
add/remove: 0/0 grow/shrink: 1/10 up/down: 256/-320 (-64)
Function old new delta
_einittext 22092 22348 +256
parse_ivrs_hpet 248 245 -3
amd_iommu_detect_one_acpi 876 868 -8
iov_supports_xt 275 264 -11
amd_iommu_read_ioapic_from_ire 344 332 -12
amd_setup_hpet_msi 237 224 -13
amd_iommu_ioapic_update_ire 575 555 -20
reserve_unity_map_for_device 453 424 -29
_hvm_dpci_msi_eoi 160 128 -32
amd_iommu_get_supported_ivhd_type 86 30 -56
parse_ivrs_table 3966 3830 -136
Signed-off-by: Andrii Sultanov <sultanovandriy@xxxxxxxxx>
Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
---
xen/drivers/passthrough/amd/iommu.h | 5 ++--
xen/drivers/passthrough/amd/iommu_acpi.c | 40 +++++++++++++----------------
xen/drivers/passthrough/amd/iommu_intr.c | 43 ++++++++++++++++----------------
3 files changed, 41 insertions(+), 47 deletions(-)
diff --git a/xen/drivers/passthrough/amd/iommu.h
b/xen/drivers/passthrough/amd/iommu.h
index 2599800e6a..52f748310b 100644
--- a/xen/drivers/passthrough/amd/iommu.h
+++ b/xen/drivers/passthrough/amd/iommu.h
@@ -262,7 +262,7 @@ int cf_check amd_setup_hpet_msi(struct msi_desc *msi_desc);
void cf_check amd_iommu_dump_intremap_tables(unsigned char key);
extern struct ioapic_sbdf {
- u16 bdf, seg;
+ pci_sbdf_t sbdf;
u8 id;
bool cmdline;
u16 *pin_2_idx;
@@ -273,7 +273,8 @@ unsigned int ioapic_id_to_index(unsigned int apic_id);
unsigned int get_next_ioapic_sbdf_index(void);
extern struct hpet_sbdf {
- u16 bdf, seg, id;
+ pci_sbdf_t sbdf;
+ uint16_t id;
enum {
HPET_NONE,
HPET_CMDL,
diff --git a/xen/drivers/passthrough/amd/iommu_acpi.c
b/xen/drivers/passthrough/amd/iommu_acpi.c
index a9c5432e86..39ae637959 100644
--- a/xen/drivers/passthrough/amd/iommu_acpi.c
+++ b/xen/drivers/passthrough/amd/iommu_acpi.c
@@ -707,8 +707,7 @@ static int __init cf_check parse_ivrs_ioapic(const char
*str)
}
}
- ioapic_sbdf[idx].bdf = PCI_BDF(bus, dev, func);
- ioapic_sbdf[idx].seg = seg;
+ ioapic_sbdf[idx].sbdf = PCI_SBDF(seg, bus, dev, func);
ioapic_sbdf[idx].id = id;
ioapic_sbdf[idx].cmdline = true;
@@ -734,8 +733,7 @@ static int __init cf_check parse_ivrs_hpet(const char *str)
return -EINVAL;
hpet_sbdf.id = id;
- hpet_sbdf.bdf = PCI_BDF(bus, dev, func);
- hpet_sbdf.seg = seg;
+ hpet_sbdf.sbdf = PCI_SBDF(seg, bus, dev, func);
hpet_sbdf.init = HPET_CMDL;
return 0;
@@ -746,8 +744,9 @@ static u16 __init parse_ivhd_device_special(
const struct acpi_ivrs_device8c *special, u16 seg,
u16 header_length, u16 block_length, struct amd_iommu *iommu)
{
- u16 dev_length, bdf;
+ uint16_t dev_length;
unsigned int apic, idx;
+ pci_sbdf_t sbdf;
dev_length = sizeof(*special);
if ( header_length < (block_length + dev_length) )
@@ -756,16 +755,16 @@ static u16 __init parse_ivhd_device_special(
return 0;
}
- bdf = special->used_id;
- if ( bdf >= ivrs_bdf_entries )
+ sbdf = PCI_SBDF(seg, special->used_id);
+ if ( sbdf.bdf >= ivrs_bdf_entries )
{
- AMD_IOMMU_ERROR("IVHD: invalid Device_Entry Dev_Id %#x\n", bdf);
+ AMD_IOMMU_ERROR("IVHD: invalid Device_Entry Dev_Id %#x\n", sbdf.bdf);
return 0;
}
AMD_IOMMU_DEBUG("IVHD Special: %pp variety %#x handle %#x\n",
- &PCI_SBDF(seg, bdf), special->variety, special->handle);
- add_ivrs_mapping_entry(bdf, bdf, special->header.data_setting, 0, true,
+ &sbdf, special->variety, special->handle);
+ add_ivrs_mapping_entry(sbdf.bdf, sbdf.bdf, special->header.data_setting,
0, true,
iommu);
switch ( special->variety )
@@ -780,8 +779,7 @@ static u16 __init parse_ivhd_device_special(
*/
for ( idx = 0; idx < nr_ioapic_sbdf; idx++ )
{
- if ( ioapic_sbdf[idx].bdf == bdf &&
- ioapic_sbdf[idx].seg == seg &&
+ if ( ioapic_sbdf[idx].sbdf.sbdf == sbdf.sbdf &&
ioapic_sbdf[idx].cmdline )
break;
}
@@ -790,7 +788,7 @@ static u16 __init parse_ivhd_device_special(
AMD_IOMMU_DEBUG("IVHD: Command line override present for IO-APIC
%#x"
"(IVRS: %#x devID %pp)\n",
ioapic_sbdf[idx].id, special->handle,
- &PCI_SBDF(seg, bdf));
+ &sbdf);
break;
}
@@ -805,8 +803,7 @@ static u16 __init parse_ivhd_device_special(
special->handle);
else if ( idx != MAX_IO_APICS && ioapic_sbdf[idx].pin_2_idx )
{
- if ( ioapic_sbdf[idx].bdf == bdf &&
- ioapic_sbdf[idx].seg == seg )
+ if ( ioapic_sbdf[idx].sbdf.sbdf == sbdf.sbdf )
AMD_IOMMU_WARN("IVHD: duplicate IO-APIC %#x entries\n",
special->handle);
else
@@ -827,8 +824,7 @@ static u16 __init parse_ivhd_device_special(
}
/* set device id of ioapic */
- ioapic_sbdf[idx].bdf = bdf;
- ioapic_sbdf[idx].seg = seg;
+ ioapic_sbdf[idx].sbdf = sbdf;
ioapic_sbdf[idx].id = special->handle;
ioapic_sbdf[idx].pin_2_idx = xmalloc_array(
@@ -862,13 +858,12 @@ static u16 __init parse_ivhd_device_special(
AMD_IOMMU_DEBUG("IVHD: Command line override present for HPET %#x "
"(IVRS: %#x devID %pp)\n",
hpet_sbdf.id, special->handle,
- &PCI_SBDF(seg, bdf));
+ &sbdf);
break;
case HPET_NONE:
/* set device id of hpet */
hpet_sbdf.id = special->handle;
- hpet_sbdf.bdf = bdf;
- hpet_sbdf.seg = seg;
+ hpet_sbdf.sbdf = sbdf;
hpet_sbdf.init = HPET_IVHD;
break;
default:
@@ -1139,9 +1134,8 @@ static int __init cf_check parse_ivrs_table(struct
acpi_table_header *table)
return -ENXIO;
}
- if ( !ioapic_sbdf[idx].seg &&
- /* SB IO-APIC is always on this device in AMD systems. */
- ioapic_sbdf[idx].bdf == PCI_BDF(0, 0x14, 0) )
+ /* SB IO-APIC is always on this device in AMD systems. */
+ if ( ioapic_sbdf[idx].sbdf.sbdf == PCI_SBDF(0, 0, 0x14, 0).sbdf )
sb_ioapic = 1;
if ( ioapic_sbdf[idx].pin_2_idx )
diff --git a/xen/drivers/passthrough/amd/iommu_intr.c
b/xen/drivers/passthrough/amd/iommu_intr.c
index 25bf25904e..7dae89bcc0 100644
--- a/xen/drivers/passthrough/amd/iommu_intr.c
+++ b/xen/drivers/passthrough/amd/iommu_intr.c
@@ -323,7 +323,8 @@ void cf_check amd_iommu_ioapic_update_ire(
unsigned int apic, unsigned int pin, uint64_t rte)
{
struct IO_APIC_route_entry new_rte;
- int seg, bdf, rc;
+ pci_sbdf_t sbdf;
+ int rc;
struct amd_iommu *iommu;
unsigned int idx;
@@ -335,20 +336,19 @@ void cf_check amd_iommu_ioapic_update_ire(
new_rte.raw = rte;
/* get device id of ioapic devices */
- bdf = ioapic_sbdf[idx].bdf;
- seg = ioapic_sbdf[idx].seg;
- iommu = find_iommu_for_device(PCI_SBDF(seg, bdf));
+ sbdf = ioapic_sbdf[idx].sbdf;
+ iommu = find_iommu_for_device(sbdf);
if ( !iommu )
{
AMD_IOMMU_WARN("failed to find IOMMU for IO-APIC @ %04x:%04x\n",
- seg, bdf);
+ sbdf.seg, sbdf.bdf);
__ioapic_write_entry(apic, pin, true, new_rte);
return;
}
/* Update interrupt remapping entry */
rc = update_intremap_entry_from_ioapic(
- bdf, iommu, &new_rte,
+ sbdf.bdf, iommu, &new_rte,
&ioapic_sbdf[idx].pin_2_idx[pin]);
if ( rc )
@@ -369,7 +369,8 @@ unsigned int cf_check amd_iommu_read_ioapic_from_ire(
unsigned int offset;
unsigned int val = __io_apic_read(apic, reg);
unsigned int pin = (reg - 0x10) / 2;
- uint16_t seg, bdf, req_id;
+ pci_sbdf_t sbdf;
+ uint16_t req_id;
const struct amd_iommu *iommu;
union irte_ptr entry;
@@ -381,12 +382,11 @@ unsigned int cf_check amd_iommu_read_ioapic_from_ire(
if ( offset >= INTREMAP_MAX_ENTRIES )
return val;
- seg = ioapic_sbdf[idx].seg;
- bdf = ioapic_sbdf[idx].bdf;
- iommu = find_iommu_for_device(PCI_SBDF(seg, bdf));
+ sbdf = ioapic_sbdf[idx].sbdf;
+ iommu = find_iommu_for_device(sbdf);
if ( !iommu )
return val;
- req_id = get_intremap_requestor_id(seg, bdf);
+ req_id = get_intremap_requestor_id(sbdf.seg, sbdf.bdf);
entry = get_intremap_entry(iommu, req_id, offset);
if ( !(reg & 1) )
@@ -515,15 +515,15 @@ int cf_check amd_iommu_msi_msg_update_ire(
struct msi_desc *msi_desc, struct msi_msg *msg)
{
struct pci_dev *pdev = msi_desc->dev;
- int bdf, seg, rc;
+ pci_sbdf_t sbdf;
+ int rc;
struct amd_iommu *iommu;
unsigned int i, nr = 1;
u32 data;
- bdf = pdev ? pdev->sbdf.bdf : hpet_sbdf.bdf;
- seg = pdev ? pdev->seg : hpet_sbdf.seg;
+ sbdf = pdev ? pdev->sbdf : hpet_sbdf.sbdf;
- iommu = _find_iommu_for_device(PCI_SBDF(seg, bdf));
+ iommu = _find_iommu_for_device(sbdf);
if ( IS_ERR_OR_NULL(iommu) )
return PTR_ERR(iommu);
@@ -532,7 +532,7 @@ int cf_check amd_iommu_msi_msg_update_ire(
if ( msi_desc->remap_index >= 0 && !msg )
{
- update_intremap_entry_from_msi_msg(iommu, bdf, nr,
+ update_intremap_entry_from_msi_msg(iommu, sbdf.bdf, nr,
&msi_desc->remap_index,
NULL, NULL);
@@ -543,7 +543,7 @@ int cf_check amd_iommu_msi_msg_update_ire(
if ( !msg )
return 0;
- rc = update_intremap_entry_from_msi_msg(iommu, bdf, nr,
+ rc = update_intremap_entry_from_msi_msg(iommu, sbdf.bdf, nr,
&msi_desc->remap_index,
msg, &data);
if ( rc >= 0 )
@@ -660,8 +660,7 @@ bool __init cf_check iov_supports_xt(void)
if ( idx == MAX_IO_APICS )
return false;
- if ( !find_iommu_for_device(PCI_SBDF(ioapic_sbdf[idx].seg,
- ioapic_sbdf[idx].bdf)) )
+ if ( !find_iommu_for_device(ioapic_sbdf[idx].sbdf) )
{
AMD_IOMMU_WARN("no IOMMU for IO-APIC %#x (ID %x)\n",
apic, IO_APIC_ID(apic));
@@ -690,14 +689,14 @@ int __init cf_check amd_setup_hpet_msi(struct msi_desc
*msi_desc)
return -ENODEV;
}
- iommu = find_iommu_for_device(PCI_SBDF(hpet_sbdf.seg, hpet_sbdf.bdf));
+ iommu = find_iommu_for_device(hpet_sbdf.sbdf);
if ( !iommu )
return -ENXIO;
- lock = get_intremap_lock(hpet_sbdf.seg, hpet_sbdf.bdf);
+ lock = get_intremap_lock(hpet_sbdf.sbdf.seg, hpet_sbdf.sbdf.bdf);
spin_lock_irqsave(lock, flags);
- msi_desc->remap_index = alloc_intremap_entry(iommu, hpet_sbdf.bdf, 1);
+ msi_desc->remap_index = alloc_intremap_entry(iommu, hpet_sbdf.sbdf.bdf, 1);
if ( msi_desc->remap_index >= INTREMAP_MAX_ENTRIES )
{
msi_desc->remap_index = -1;
--
generated by git-patchbot for /home/xen/git/xen.git#staging
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |