[PATCH v2] drm/i915/gvt: Support BAR0 8-byte reads/writes
Zhenyu Wang
zhenyuw at linux.intel.com
Fri Feb 2 06:27:08 UTC 2018
On 2018.02.02 10:37:08 +0800, Tina Zhang wrote:
> GGTT is in BAR0 with 8 bytes aligned. With a qemu patch (commit:
> 38d49e8c1523d97d2191190d3f7b4ce7a0ab5aa3), VFIO can use 8-byte reads/
> writes to access it.
>
> This patch is to support the 8-byte GGTT reads/writes.
>
> Ideally, we would like to support 8-byte reads/writes for the total BAR0.
> But it needs more work for handling 8-byte MMIO reads/writes.
>
> This patch can fix the issue caused by partial updating GGTT entry, during
> guest booting up.
>
> v2:
> - Limit to GGTT entry. (Zhenyu)
>
> Signed-off-by: Tina Zhang <tina.zhang at intel.com>
> ---
> drivers/gpu/drm/i915/gvt/kvmgt.c | 51 ++++++++++++++++++++++++++++++++++++++--
> 1 file changed, 49 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/gvt/kvmgt.c b/drivers/gpu/drm/i915/gvt/kvmgt.c
> index f4d5aad..6a90794 100644
> --- a/drivers/gpu/drm/i915/gvt/kvmgt.c
> +++ b/drivers/gpu/drm/i915/gvt/kvmgt.c
> @@ -708,16 +708,47 @@ static ssize_t intel_vgpu_rw(struct mdev_device *mdev, char *buf,
> return ret == 0 ? count : ret;
> }
>
> +static bool gtt_entry(struct mdev_device *mdev, loff_t *ppos)
> +{
> + struct intel_vgpu *vgpu = mdev_get_drvdata(mdev);
> + struct intel_gvt *gvt = vgpu->gvt;
> + int offset;
> +
> + offset = (u64)(*ppos & VFIO_PCI_OFFSET_MASK) -
> + (*(u64 *)(vgpu_cfg_space(vgpu) + PCI_BASE_ADDRESS_0) &
> + ~GENMASK(3, 0));
> +
Use intel_vgpu_get_bar_gpa(vgpu, PCI_BASE_ADDRESS_0)?
> + return (offset >= gvt->device_info.gtt_start_offset &&
> + offset < gvt->device_info.gtt_start_offset + gvt_ggtt_sz(gvt)) ?
> + true : false;
> +}
> +
> static ssize_t intel_vgpu_read(struct mdev_device *mdev, char __user *buf,
> size_t count, loff_t *ppos)
> {
> unsigned int done = 0;
> + unsigned int index = VFIO_PCI_OFFSET_TO_INDEX(*ppos);
> int ret;
>
> while (count) {
> size_t filled;
>
> - if (count >= 4 && !(*ppos % 4)) {
> + /* Only support GGTT entry 8 bytes read */
> + if (count >= 8 && !(*ppos % 8) &&
> + (index == VFIO_PCI_BAR0_REGION_INDEX) &&
> + gtt_entry(mdev, ppos)) {
Combine bar0 index and gtt offset in one check function for 8b access?
And after this one, could you pick up duplicate code cleanup for this or Changbin can refresh?
> + u64 val;
> +
> + ret = intel_vgpu_rw(mdev, (char *)&val, sizeof(val),
> + ppos, false);
> + if (ret <= 0)
> + goto read_err;
> +
> + if (copy_to_user(buf, &val, sizeof(val)))
> + goto read_err;
> +
> + filled = 8;
> + } else if (count >= 4 && !(*ppos % 4)) {
> u32 val;
>
> ret = intel_vgpu_rw(mdev, (char *)&val, sizeof(val),
> @@ -772,12 +803,28 @@ static ssize_t intel_vgpu_write(struct mdev_device *mdev,
> size_t count, loff_t *ppos)
> {
> unsigned int done = 0;
> + unsigned int index = VFIO_PCI_OFFSET_TO_INDEX(*ppos);
> int ret;
>
> while (count) {
> size_t filled;
>
> - if (count >= 4 && !(*ppos % 4)) {
> + /* Only support GGTT entry 8 bytes write */
> + if (count >= 8 && !(*ppos % 8) &&
> + (index == VFIO_PCI_BAR0_REGION_INDEX) &&
> + gtt_entry(mdev, ppos)) {
> + u64 val;
> +
> + if (copy_from_user(&val, buf, sizeof(val)))
> + goto write_err;
> +
> + ret = intel_vgpu_rw(mdev, (char *)&val, sizeof(val),
> + ppos, true);
> + if (ret <= 0)
> + goto write_err;
> +
> + filled = 8;
> + } else if (count >= 4 && !(*ppos % 4)) {
> u32 val;
>
> if (copy_from_user(&val, buf, sizeof(val)))
> --
> 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/20180202/7ea5bbb7/attachment.sig>
More information about the intel-gvt-dev
mailing list