[PATCH] drm/i915/gvt: Add support for PCIe extended configuration space

Laszlo Ersek lersek at redhat.com
Wed Aug 23 09:37:25 UTC 2017


Hi,

On 08/23/17 08:08, changbin.du at intel.com wrote:
> From: Changbin Du <changbin.du at intel.com>
> 
> IGD is PCIe device and has extended configuration space. Checking
> the binary dump, we can see we have Caps located out of PCI compatible
> Configuration Space range.
> 
> 0x000: 86 80 12 19 17 04 10 00 06 00 00 03 00 00 00 00
> 0x010: 04 00 00 10 08 00 00 00 0c 00 00 00 08 00 00 00
> 0x020: 00 00 00 00 00 00 00 00 00 00 00 00 28 10 b9 06
> 0x030: 00 f8 ff ff 40 00 00 00 00 00 00 00 0b 01 00 00
> 0x040: 09 70 0c 01 71 26 01 62 c8 00 04 84 00 00 00 00
> 0x050: c1 00 00 00 39 00 00 00 00 00 00 00 01 00 00 a2
> 0x060: 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00
> 0x070: 10 ac 92 00 00 80 00 10 00 00 00 00 00 00 00 00
> 0x080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
> 0x090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
> 0x0a0: 00 00 00 00 00 00 00 00 00 00 00 00 05 d0 01 00
> 0x0b0: 18 00 e0 fe 00 00 00 00 00 00 00 00 00 00 00 00
> 0x0c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
> 0x0d0: 01 00 22 00 00 80 00 00 00 00 00 00 00 00 00 00
> 0x0e0: 00 00 00 00 00 00 00 00 00 80 00 00 00 00 00 00
> 0x0f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
> 0x100: 1b 00 01 20 02 14 00 00 00 00 00 00 00 00 00 00
> ...
> 
> Currently, we only emulate the PCI compatible Configuration Space.
> This is okay if we attach vGPU to PCI bus. But when we attach to
> a PCI Express bus (when Qemu emulates a Intel Q35 chipset which has
> PCIe slot), it will not work. Extended Configuration Space is required
> for a PCIe device.
> 
> This patch extended the virtual configuration space from 256 bytes
> to 4KB bytes. So we are to be a *real* PCIe device. And for the
> Extended CapList we keep same to physical GPU.
> 
> Cc: Laszlo Ersek <lersek at redhat.com>
> Signed-off-by: Changbin Du <changbin.du at intel.com>
> ---
>  drivers/gpu/drm/i915/gvt/cfg_space.c | 4 ++--
>  drivers/gpu/drm/i915/gvt/gvt.c       | 2 +-
>  drivers/gpu/drm/i915/gvt/gvt.h       | 3 +--
>  drivers/gpu/drm/i915/gvt/kvmgt.c     | 2 +-
>  4 files changed, 5 insertions(+), 6 deletions(-)

Assuming I can find the time to test this, which kernel tree (git URL)
and branch should I apply the patch to?

Thanks,
Laszlo

> diff --git a/drivers/gpu/drm/i915/gvt/cfg_space.c b/drivers/gpu/drm/i915/gvt/cfg_space.c
> index ce71b58..ab19545 100644
> --- a/drivers/gpu/drm/i915/gvt/cfg_space.c
> +++ b/drivers/gpu/drm/i915/gvt/cfg_space.c
> @@ -101,7 +101,7 @@ int intel_vgpu_emulate_cfg_read(struct intel_vgpu *vgpu, unsigned int offset,
>  	if (WARN_ON(bytes > 4))
>  		return -EINVAL;
>  
> -	if (WARN_ON(offset + bytes > INTEL_GVT_MAX_CFG_SPACE_SZ))
> +	if (WARN_ON(offset + bytes > vgpu->gvt->device_info.cfg_space_size))
>  		return -EINVAL;
>  
>  	memcpy(p_data, vgpu_cfg_space(vgpu) + offset, bytes);
> @@ -289,7 +289,7 @@ int intel_vgpu_emulate_cfg_write(struct intel_vgpu *vgpu, unsigned int offset,
>  	if (WARN_ON(bytes > 4))
>  		return -EINVAL;
>  
> -	if (WARN_ON(offset + bytes > INTEL_GVT_MAX_CFG_SPACE_SZ))
> +	if (WARN_ON(offset + bytes > vgpu->gvt->device_info.cfg_space_size))
>  		return -EINVAL;
>  
>  	/* First check if it's PCI_COMMAND */
> diff --git a/drivers/gpu/drm/i915/gvt/gvt.c b/drivers/gpu/drm/i915/gvt/gvt.c
> index c27c683..aaa347f 100644
> --- a/drivers/gpu/drm/i915/gvt/gvt.c
> +++ b/drivers/gpu/drm/i915/gvt/gvt.c
> @@ -111,7 +111,7 @@ static void init_device_info(struct intel_gvt *gvt)
>  	if (IS_BROADWELL(gvt->dev_priv) || IS_SKYLAKE(gvt->dev_priv)
>  		|| IS_KABYLAKE(gvt->dev_priv)) {
>  		info->max_support_vgpus = 8;
> -		info->cfg_space_size = 256;
> +		info->cfg_space_size = PCI_CFG_SPACE_EXP_SIZE;
>  		info->mmio_size = 2 * 1024 * 1024;
>  		info->mmio_bar = 0;
>  		info->gtt_start_offset = 8 * 1024 * 1024;
> diff --git a/drivers/gpu/drm/i915/gvt/gvt.h b/drivers/gpu/drm/i915/gvt/gvt.h
> index 2fe22e1..c096526 100644
> --- a/drivers/gpu/drm/i915/gvt/gvt.h
> +++ b/drivers/gpu/drm/i915/gvt/gvt.h
> @@ -100,7 +100,6 @@ struct intel_vgpu_mmio {
>  	bool disable_warn_untrack;
>  };
>  
> -#define INTEL_GVT_MAX_CFG_SPACE_SZ 256
>  #define INTEL_GVT_MAX_BAR_NUM 4
>  
>  struct intel_vgpu_pci_bar {
> @@ -109,7 +108,7 @@ struct intel_vgpu_pci_bar {
>  };
>  
>  struct intel_vgpu_cfg_space {
> -	unsigned char virtual_cfg_space[INTEL_GVT_MAX_CFG_SPACE_SZ];
> +	unsigned char virtual_cfg_space[PCI_CFG_SPACE_EXP_SIZE];
>  	struct intel_vgpu_pci_bar bar[INTEL_GVT_MAX_BAR_NUM];
>  };
>  
> diff --git a/drivers/gpu/drm/i915/gvt/kvmgt.c b/drivers/gpu/drm/i915/gvt/kvmgt.c
> index ae65268..9606092 100644
> --- a/drivers/gpu/drm/i915/gvt/kvmgt.c
> +++ b/drivers/gpu/drm/i915/gvt/kvmgt.c
> @@ -978,7 +978,7 @@ static long intel_vgpu_ioctl(struct mdev_device *mdev, unsigned int cmd,
>  		switch (info.index) {
>  		case VFIO_PCI_CONFIG_REGION_INDEX:
>  			info.offset = VFIO_PCI_INDEX_TO_OFFSET(info.index);
> -			info.size = INTEL_GVT_MAX_CFG_SPACE_SZ;
> +			info.size = vgpu->gvt->device_info.cfg_space_size;
>  			info.flags = VFIO_REGION_INFO_FLAG_READ |
>  				     VFIO_REGION_INFO_FLAG_WRITE;
>  			break;
> 



More information about the intel-gvt-dev mailing list