tools: Add new function to get gsi from dev

On PVH dom0, when passthrough a device to domU, QEMU and xl tools
want to use gsi number to do pirq mapping, see QEMU code
xen_pt_realize->xc_physdev_map_pirq, and xl code
pci_add_dm_done->xc_physdev_map_pirq, but in current codes, the gsi
number is got from file /sys/bus/pci/devices/<sbdf>/irq, that is
wrong, because irq is not equal with gsi, they are in different
spaces, so pirq mapping fails.

And in current codes, there is no method to get gsi for userspace.
For above purpose, add new function to get gsi, and the
corresponding ioctl is implemented on linux kernel side.

Signed-off-by: Jiqian Chen <Jiqian.Chen@amd.com>
Signed-off-by: Huang Rui <ray.huang@amd.com>
Signed-off-by: Chen Jiqian <Jiqian.Chen@amd.com>
Reviewed-by: Anthony PERARD <anthony.perard@vates.tech>
This commit is contained in:
Jiqian Chen authored and Jan Beulich committed 2024-09-30 10:13:46 +02:00
1 parent d6e9a2aab3
commit b93e5981d2
7 files changed
+53

No files matched your search

+7
View File
@@ -95,6 +95,11 @@ typedef struct privcmd_mmap_resource {
__u64 addr;
} privcmd_mmap_resource_t;
typedef struct privcmd_pcidev_get_gsi {
__u32 sbdf;
__u32 gsi;
} privcmd_pcidev_get_gsi_t;
/*
* @cmd: IOCTL_PRIVCMD_HYPERCALL
* @arg: &privcmd_hypercall_t
@@ -114,6 +119,8 @@ typedef struct privcmd_mmap_resource {
_IOC(_IOC_NONE, 'P', 6, sizeof(domid_t))
#define IOCTL_PRIVCMD_MMAP_RESOURCE \
_IOC(_IOC_NONE, 'P', 7, sizeof(privcmd_mmap_resource_t))
#define IOCTL_PRIVCMD_PCIDEV_GET_GSI \
_IOC(_IOC_NONE, 'P', 10, sizeof(privcmd_pcidev_get_gsi_t))
#define IOCTL_PRIVCMD_UNIMPLEMENTED \
_IOC(_IOC_NONE, 'P', 0xFF, 0)
+2
View File
@@ -1642,6 +1642,8 @@ int xc_physdev_unmap_pirq(xc_interface *xch,
uint32_t domid,
int pirq);
int xc_pcidev_get_gsi(xc_interface *xch, uint32_t sbdf);
/*
* LOGGING AND ERROR REPORTING
*/
+6
View File
@@ -60,6 +60,12 @@ void *xc_memalign(xc_interface *xch, size_t alignment, size_t size)
return ptr;
}
int xc_pcidev_get_gsi(xc_interface *xch, uint32_t sbdf)
{
errno = ENOSYS;
return -1;
}
/*
* Local variables:
* mode: C
+20
View File
@@ -66,6 +66,26 @@ void *xc_memalign(xc_interface *xch, size_t alignment, size_t size)
return ptr;
}
int xc_pcidev_get_gsi(xc_interface *xch, uint32_t sbdf)
{
int ret;
privcmd_pcidev_get_gsi_t dev_gsi = {
.sbdf = sbdf,
.gsi = 0,
};
ret = ioctl(xencall_fd(xch->xcall),
IOCTL_PRIVCMD_PCIDEV_GET_GSI, &dev_gsi);
if (ret < 0) {
PERROR("Failed to get gsi from dev");
} else {
ret = dev_gsi.gsi;
}
return ret;
}
/*
* Local variables:
* mode: C
+6
View File
@@ -47,6 +47,12 @@ void *xc_memalign(xc_interface *xch, size_t alignment, size_t size)
return memalign(alignment, size);
}
int xc_pcidev_get_gsi(xc_interface *xch, uint32_t sbdf)
{
errno = ENOSYS;
return -1;
}
/*
* Local variables:
* mode: C
+6
View File
@@ -63,6 +63,12 @@ void *xc_memalign(xc_interface *xch, size_t alignment, size_t size)
return valloc(size);
}
int xc_pcidev_get_gsi(xc_interface *xch, uint32_t sbdf)
{
errno = ENOSYS;
return -1;
}
/*
* Local variables:
* mode: C
+6
View File
@@ -32,6 +32,12 @@ void *xc_memalign(xc_interface *xch, size_t alignment, size_t size)
return memalign(alignment, size);
}
int xc_pcidev_get_gsi(xc_interface *xch, uint32_t sbdf)
{
errno = ENOSYS;
return -1;
}
/*
* Local variables:
* mode: C
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.