[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.