|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 1/2] qemu-xen: Pass through, utility functions
On Tue, 31 Jan 2012, Jean Guyader wrote:
> Add a function to map a specific bar into a pt_dev.
>
> Add a function that gets called everytime the bar of a pass
> through device gets remap.
>
> Signed-off-by: Jean Guyader <jean.guyader@xxxxxxxxxxxxx>
> ---
> hw/pass-through.c | 34 ++++++++++++++++++++++++++++++++++
> hw/pass-through.h | 3 +++
> hw/pt-graphics.c | 7 +++++++
> 3 files changed, 44 insertions(+), 0 deletions(-)
Could you please send inline patches in the future?
> diff --git a/hw/pass-through.c b/hw/pass-through.c
> index dbe8804..1bdb223 100644
> --- a/hw/pass-through.c
> +++ b/hw/pass-through.c
> @@ -93,6 +93,7 @@
> #include <unistd.h>
> #include <sys/ioctl.h>
> #include <assert.h>
> +#include <sys/mman.h>
>
> extern int gfx_passthru;
> int igd_passthru = 0;
> @@ -1155,6 +1156,9 @@ static void pt_iomem_map(PCIDevice *d, int i, uint32_t
> e_phys, uint32_t e_size,
> if ( e_size == 0 )
> return;
>
> + if (assigned_device->pci_dev->device_class == 0x0300)
> + pt_graphic_bar_remap(assigned_device, i, first_map,
> DPCI_ADD_MAPPING);
> +
> if ( !first_map && old_ebase != -1 )
> {
> if ( has_msix_mapping(assigned_device, i) )
Wouldn't it be better if we move this into _pt_iomem_helper?
> @@ -1969,6 +1973,9 @@ static void pt_unregister_regions(struct pt_dev
> *assigned_device)
> if ( type == PCI_ADDRESS_SPACE_MEM ||
> type == PCI_ADDRESS_SPACE_MEM_PREFETCH )
> {
> + if (assigned_device->pci_dev->device_class == 0x0300)
> + pt_graphic_bar_remap(assigned_device, i, 0,
> DPCI_REMOVE_MAPPING);
> +
> ret = xc_domain_memory_mapping(xc_handle, domid,
> assigned_device->bases[i].e_physbase >> XC_PAGE_SHIFT,
> assigned_device->bases[i].access.maddr >> XC_PAGE_SHIFT,
>
> @@ -2101,6 +2108,33 @@ int pt_pci_host_write(struct pci_dev *pci_dev, u32
> addr, u32 val, int len)
> return ret;
> }
>
> +int pt_pci_host_map_bar(struct pt_dev *pt_dev, int bar)
> +{
> + int fd;
> + struct stat s;
> + uint8_t *map;
> +
> + char filename[1024];
> +
> + snprintf(filename, 1024,
> "/sys/bus/pci/devices/0000:%02x:%02x.%01x/resource%d",
> + pt_dev->pci_dev->bus,
> + pt_dev->pci_dev->dev,
> + pt_dev->pci_dev->func,
> + bar);
> + fd = open(filename, O_RDWR | O_SYNC);
> + if (fd < 0)
> + return fd;
> + fstat(fd, &s);
> +
> + map = mmap(0, s.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
> + if (map != MAP_FAILED)
> + {
> + pt_dev->bases[bar].map = map;
> + return 0;
> + }
> + return errno;
> +}
> +
> /* parse BAR */
> static int pt_bar_reg_parse(
> struct pt_dev *ptdev, struct pt_reg_info_tbl *reg)
> diff --git a/hw/pass-through.h b/hw/pass-through.h
> index 884139c..26e6ff1 100644
> --- a/hw/pass-through.h
> +++ b/hw/pass-through.h
> @@ -170,6 +170,7 @@ struct pt_region {
> uint64_t pio_base;
> uint64_t u;
> } access;
> + uint8_t *map;
> };
>
> struct pt_msi_info {
> @@ -414,6 +415,7 @@ uint8_t pci_intx(struct pt_dev *ptdev);
> struct pci_dev *pt_pci_get_dev(int bus, int dev, int func);
> u32 pt_pci_host_read(struct pci_dev *pci_dev, u32 addr, int len);
> int pt_pci_host_write(struct pci_dev *pci_dev, u32 addr, u32 val, int len);
> +int pt_pci_host_map_bar(struct pt_dev *pt_dev, int bar);
> void intel_pch_init(PCIBus *bus);
> int register_vga_regions(struct pt_dev *real_device);
> int unregister_vga_regions(struct pt_dev *real_device);
> @@ -422,6 +424,7 @@ PCIBus *intel_pci_bridge_init(PCIBus *bus, int devfn,
> uint16_t vid,
> uint16_t did, const char *name, uint16_t revision);
> void igd_pci_write(PCIDevice *pci_dev, uint32_t config_addr, uint32_t val,
> int len);
> uint32_t igd_pci_read(PCIDevice *pci_dev, uint32_t config_addr, int len);
> +void pt_graphic_bar_remap(struct pt_dev *real_device, int bar, int
> first_map, int map);
rename "int map" to "int op" for clarity
>
> #endif /* __PASSTHROUGH_H__ */
>
> diff --git a/hw/pt-graphics.c b/hw/pt-graphics.c
> index fec7390..5d5e5da 100644
> --- a/hw/pt-graphics.c
> +++ b/hw/pt-graphics.c
> @@ -94,6 +94,13 @@ uint32_t igd_pci_read(PCIDevice *pci_dev, uint32_t
> config_addr, int len)
> }
>
> /*
> + * Callback whenever a bar get remapped
> + */
> +void pt_graphic_bar_remap(struct pt_dev *real_device, int bar, int
> first_map, int map)
> +{
> +}
> +
> +/*
> * register VGA resources for the domain with assigned gfx
> */
> int register_vga_regions(struct pt_dev *real_device)
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |