[PATCH 1/2] drm/i915/gvt: Add mmio iterator intel_gvt_for_each_tracked_mmio()

Zhenyu Wang zhenyuw at linux.intel.com
Fri Oct 20 09:06:43 UTC 2017


On 2017.10.17 10:00:40 +0800, changbin.du at intel.com wrote:
> From: Changbin Du <changbin.du at intel.com>
> 
> This patch add a function intel_gvt_for_each_tracked_mmio() to
> iterate each tracked mmio. The caller don't be aware of how the
> tracked mmios are presented internally.
> 
> Signed-off-by: Changbin Du <changbin.du at intel.com>
> ---
>  drivers/gpu/drm/i915/gvt/firmware.c | 30 +++++++++++++++---------------
>  drivers/gpu/drm/i915/gvt/handlers.c | 34 ++++++++++++++++++++++++++++++++++
>  drivers/gpu/drm/i915/gvt/mmio.h     |  4 ++++
>  3 files changed, 53 insertions(+), 15 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/gvt/firmware.c b/drivers/gpu/drm/i915/gvt/firmware.c
> index a26c170..c1e84f5 100644
> --- a/drivers/gpu/drm/i915/gvt/firmware.c
> +++ b/drivers/gpu/drm/i915/gvt/firmware.c
> @@ -66,20 +66,28 @@ static struct bin_attribute firmware_attr = {
>  	.mmap = NULL,
>  };
>  
> -static int expose_firmware_sysfs(struct intel_gvt *gvt)
> +static int mmio_snapshot_handler(struct intel_gvt *gvt, u32 offset, void *data)
>  {
>  	struct drm_i915_private *dev_priv = gvt->dev_priv;
> +
> +	*(u32 *)(data + offset) = I915_READ_NOTRACE(_MMIO(offset));
> +	return 0;
> +}
> +
> +static void snapshot_hw_mmio_registers(struct intel_gvt *gvt, void *buf)
> +{
> +	intel_gvt_for_each_tracked_mmio(gvt, mmio_snapshot_handler, buf);
> +}

Might not need extra function but just use new helper below.

> +
> +static int expose_firmware_sysfs(struct intel_gvt *gvt)
> +{
>  	struct intel_gvt_device_info *info = &gvt->device_info;
>  	struct pci_dev *pdev = gvt->dev_priv->drm.pdev;
> -	struct intel_gvt_mmio_info *e;
> -	struct gvt_mmio_block *block = gvt->mmio.mmio_block;
> -	int num = gvt->mmio.num_mmio_block;
>  	struct gvt_firmware_header *h;
>  	void *firmware;
>  	void *p;
>  	unsigned long size, crc32_start;
> -	int i, j;
> -	int ret;
> +	int i, ret;
>  
>  	size = sizeof(*h) + info->mmio_size + info->cfg_space_size;
>  	firmware = vzalloc(size);
> @@ -104,15 +112,7 @@ static int expose_firmware_sysfs(struct intel_gvt *gvt)
>  
>  	p = firmware + h->mmio_offset;
>  
> -	hash_for_each(gvt->mmio.mmio_info_table, i, e, node)
> -		*(u32 *)(p + e->offset) = I915_READ_NOTRACE(_MMIO(e->offset));
> -
> -	for (i = 0; i < num; i++, block++) {
> -		for (j = 0; j < block->size; j += 4)
> -			*(u32 *)(p + INTEL_GVT_MMIO_OFFSET(block->offset) + j) =
> -				I915_READ_NOTRACE(_MMIO(INTEL_GVT_MMIO_OFFSET(
> -							block->offset) + j));
> -	}
> +	snapshot_hw_mmio_registers(gvt, p);
>  
>  	memcpy(gvt->firmware.mmio, p, info->mmio_size);
>  
> diff --git a/drivers/gpu/drm/i915/gvt/handlers.c b/drivers/gpu/drm/i915/gvt/handlers.c
> index 0fa61a7..b505a08 100644
> --- a/drivers/gpu/drm/i915/gvt/handlers.c
> +++ b/drivers/gpu/drm/i915/gvt/handlers.c
> @@ -2984,6 +2984,40 @@ int intel_gvt_setup_mmio_info(struct intel_gvt *gvt)
>  	return ret;
>  }
>  
> +/**
> + * intel_gvt_for_each_tracked_mmio - iterate each tracked mmio
> + * @gvt: a GVT device
> + * @handler: the handler
> + * @data: private data given to handler
> + *
> + * Returns:
> + * Zero on success, negative error code if failed.
> + */
> +int intel_gvt_for_each_tracked_mmio(struct intel_gvt *gvt,
> +	int (*handler)(struct intel_gvt *gvt, u32 offset, void *data),
> +	void *data)
> +{
> +	struct gvt_mmio_block *block = gvt->mmio.mmio_block;
> +	struct intel_gvt_mmio_info *e;
> +	int i, j, ret;
> +
> +	hash_for_each(gvt->mmio.mmio_info_table, i, e, node) {
> +		ret = handler(gvt, e->offset, data);
> +		if (ret)
> +			return ret;
> +	}
> +
> +	for (i = 0; i < gvt->mmio.num_mmio_block; i++, block++) {
> +		for (j = 0; j < block->size; j += 4) {
> +			ret = handler(gvt,
> +				INTEL_GVT_MMIO_OFFSET(block->offset) + j,
> +				data);
> +			if (ret)
> +				return ret;
> +		}
> +	}
> +	return 0;
> +}
>  
>  /**
>   * intel_vgpu_default_mmio_read - default MMIO read handler
> diff --git a/drivers/gpu/drm/i915/gvt/mmio.h b/drivers/gpu/drm/i915/gvt/mmio.h
> index 32cd64d..379aac4 100644
> --- a/drivers/gpu/drm/i915/gvt/mmio.h
> +++ b/drivers/gpu/drm/i915/gvt/mmio.h
> @@ -70,6 +70,10 @@ bool intel_gvt_match_device(struct intel_gvt *gvt, unsigned long device);
>  
>  int intel_gvt_setup_mmio_info(struct intel_gvt *gvt);
>  void intel_gvt_clean_mmio_info(struct intel_gvt *gvt);
> +int intel_gvt_for_each_tracked_mmio(struct intel_gvt *gvt,
> +	int (*handler)(struct intel_gvt *gvt, u32 offset, void *data),
> +	void *data);
> +
>  
>  #define INTEL_GVT_MMIO_OFFSET(reg) ({ \
>  	typeof(reg) __reg = reg; \
> -- 
> 2.7.4
> 
> _______________________________________________
> intel-gvt-dev mailing list
> intel-gvt-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gvt-dev

-- 
Open Source Technology Center, Intel ltd.

$gpg --keyserver wwwkeys.pgp.net --recv-keys 4D781827
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 195 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/intel-gvt-dev/attachments/20171020/146ae499/attachment.sig>


More information about the intel-gvt-dev mailing list