@@ -268,7 +268,13 @@ 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;
+ union {
+ struct {
+ uint16_t bdf;
+ uint16_t seg;
+ };
+ pci_sbdf_t sbdf;
+ };
u8 id;
bool cmdline;
u16 *pin_2_idx;
@@ -279,7 +285,14 @@ 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;
+ union {
+ struct {
+ uint16_t bdf;
+ uint16_t seg;
+ };
+ pci_sbdf_t sbdf;
+ };
+ uint16_t id;
enum {
HPET_NONE,
HPET_CMDL,
@@ -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,18 @@ 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);
+ AMD_IOMMU_WARN("failed to find IOMMU for IO-APIC @ %pp\n", &sbdf);
__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 +368,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 +381,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 +514,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 +531,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 +542,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 +659,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,7 +688,7 @@ 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;
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. Signed-off-by: Andrii Sultanov <sultanovandriy@gmail.com> --- This particular commit does not have any effect on code size: add/remove: 0/0 grow/shrink: 2/6 up/down: 96/-96 (0) Function old new delta _einittext 22092 22156 +64 _hvm_dpci_msi_eoi 133 165 +32 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 amd_iommu_get_supported_ivhd_type 86 54 -32 So we don't have to take it - but imho it significantly simplifies source code and makes it more readable. Changes in V2: * Split single commit into several patches * Change the format specifier to %pp in amd_iommu_ioapic_update_ire --- xen/drivers/passthrough/amd/iommu.h | 17 ++++++++-- xen/drivers/passthrough/amd/iommu_intr.c | 40 +++++++++++------------- 2 files changed, 34 insertions(+), 23 deletions(-)