[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