]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
drm/i915/gvt: Deliver guest cursor hotspot info
authorTina Zhang <tina.zhang@intel.com>
Mon, 14 May 2018 05:59:18 +0000 (13:59 +0800)
committerZhenyu Wang <zhenyuw@linux.intel.com>
Wed, 16 May 2018 03:12:27 +0000 (11:12 +0800)
Guest OS driver uses PV info registers to deliver cursor hotspot info
to host. This patch is used to get cursor hotspot info from virtual
registers and deliver it to host userspace.

v4->v5:
- remove CI warning.

v3->v4:
- return UINT_MAX when x_hot/y_hot is invalid. (Zhenyu)
- correct version.

v2->v3:
- add validate_hotspot(). (Zhenyu)

v1->v2:
- name as cursor_x_hot/cursor_y_hot. (Zhenyu)
- use i915_reg_t definition instead of magic numbers. (Zhenyu)

Signed-off-by: Tina Zhang <tina.zhang@intel.com>
Cc: Zhenyu Wang <zhenyuw@linux.intel.com>
Cc: Zhi Wang <zhi.a.wang@intel.com>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
drivers/gpu/drm/i915/gvt/dmabuf.c
drivers/gpu/drm/i915/gvt/fb_decoder.c
drivers/gpu/drm/i915/gvt/handlers.c
drivers/gpu/drm/i915/gvt/vgpu.c
drivers/gpu/drm/i915/i915_pvinfo.h

index 6f4f8e941fc200aa66972be703a811c17fff93d8..d2eb2f7754b9f12c505df6fdc9a7092a914febf4 100644 (file)
@@ -192,6 +192,14 @@ static struct drm_i915_gem_object *vgpu_create_gem(struct drm_device *dev,
        return obj;
 }
 
+static bool validate_hotspot(struct intel_vgpu_cursor_plane_format *c)
+{
+       if (c && c->x_hot <= c->width && c->y_hot <= c->height)
+               return true;
+       else
+               return false;
+}
+
 static int vgpu_get_plane_info(struct drm_device *dev,
                struct intel_vgpu *vgpu,
                struct intel_vgpu_fb_info *info,
@@ -229,12 +237,14 @@ static int vgpu_get_plane_info(struct drm_device *dev,
                info->x_pos = c.x_pos;
                info->y_pos = c.y_pos;
 
-               /* The invalid cursor hotspot value is delivered to host
-                * until we find a way to get the cursor hotspot info of
-                * guest OS.
-                */
-               info->x_hot = UINT_MAX;
-               info->y_hot = UINT_MAX;
+               if (validate_hotspot(&c)) {
+                       info->x_hot = c.x_hot;
+                       info->y_hot = c.y_hot;
+               } else {
+                       info->x_hot = UINT_MAX;
+                       info->y_hot = UINT_MAX;
+               }
+
                info->size = (((info->stride * c.height * c.bpp) / 8)
                                + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
        } else {
index 1c120683e9588c5a1d379c370e2760234f2d3ab1..5e7468bd1b36846bb60a4179ee316f5f9cdf0d99 100644 (file)
@@ -36,6 +36,7 @@
 #include <uapi/drm/drm_fourcc.h>
 #include "i915_drv.h"
 #include "gvt.h"
+#include "i915_pvinfo.h"
 
 #define PRIMARY_FORMAT_NUM     16
 struct pixel_format {
@@ -384,6 +385,8 @@ int intel_vgpu_decode_cursor_plane(struct intel_vgpu *vgpu,
        plane->y_pos = (val & _CURSOR_POS_Y_MASK) >> _CURSOR_POS_Y_SHIFT;
        plane->y_sign = (val & _CURSOR_SIGN_Y_MASK) >> _CURSOR_SIGN_Y_SHIFT;
 
+       plane->x_hot = vgpu_vreg_t(vgpu, vgtif_reg(cursor_x_hot));
+       plane->y_hot = vgpu_vreg_t(vgpu, vgtif_reg(cursor_y_hot));
        return 0;
 }
 
index 4b6532fb789a21d55505c0321c98708b5a290e45..d5e206661048466c69078d349ed30bf73cf02654 100644 (file)
@@ -1204,8 +1204,8 @@ static int pvinfo_mmio_write(struct intel_vgpu *vgpu, unsigned int offset,
                ret = handle_g2v_notification(vgpu, data);
                break;
        /* add xhot and yhot to handled list to avoid error log */
-       case 0x78830:
-       case 0x78834:
+       case _vgtif_reg(cursor_x_hot):
+       case _vgtif_reg(cursor_y_hot):
        case _vgtif_reg(pdp[0].lo):
        case _vgtif_reg(pdp[0].hi):
        case _vgtif_reg(pdp[1].lo):
index 2e0a02a80fe4d2b2473fcd060329086dc620bd05..bf75300c1ec16466791a4ae081979802681994e5 100644 (file)
@@ -58,6 +58,9 @@ void populate_pvinfo_page(struct intel_vgpu *vgpu)
 
        vgpu_vreg_t(vgpu, vgtif_reg(avail_rs.fence_num)) = vgpu_fence_sz(vgpu);
 
+       vgpu_vreg_t(vgpu, vgtif_reg(cursor_x_hot)) = UINT_MAX;
+       vgpu_vreg_t(vgpu, vgtif_reg(cursor_y_hot)) = UINT_MAX;
+
        gvt_dbg_core("Populate PVINFO PAGE for vGPU %d\n", vgpu->id);
        gvt_dbg_core("aperture base [GMADR] 0x%llx size 0x%llx\n",
                vgpu_aperture_gmadr_base(vgpu), vgpu_aperture_sz(vgpu));
index 195203f298dfcfdc03f91b529af65f8e6337aad9..d61914a1175665eb2acbe58a13b8603b92b21790 100644 (file)
@@ -93,7 +93,10 @@ struct vgt_if {
        u32 rsv5[4];
 
        u32 g2v_notify;
-       u32 rsv6[7];
+       u32 rsv6[5];
+
+       u32 cursor_x_hot;
+       u32 cursor_y_hot;
 
        struct {
                u32 lo;