Commit b244ffa1 authored by Zhenyu Wang's avatar Zhenyu Wang

drm/i915/gvt: Fix drm_format_mod value for vGPU plane

Physical plane's tiling mode value is given directly as
drm_format_mod for plane query, which is not correct fourcc
code. Fix it by using correct intel tiling fourcc mod definition.

Current qemu seems also doesn't correctly utilize drm_format_mod
for plane object setting. Anyway this is required to fix the usage.

v3: use DRM_FORMAT_MOD_LINEAR, fix comment

v2: Fix missed old 'tiled' use for stride calculation

Fixes: e546e281 ("drm/i915/gvt: Dmabuf support for GVT-g")
Cc: Tina Zhang <tina.zhang@intel.com>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: Colin Xu <Colin.Xu@intel.com>
Reviewed-by: default avatarColin Xu <Colin.Xu@intel.com>
Signed-off-by: default avatarZhenyu Wang <zhenyuw@linux.intel.com>
parent b2b599fb
...@@ -170,20 +170,22 @@ static struct drm_i915_gem_object *vgpu_create_gem(struct drm_device *dev, ...@@ -170,20 +170,22 @@ static struct drm_i915_gem_object *vgpu_create_gem(struct drm_device *dev,
unsigned int tiling_mode = 0; unsigned int tiling_mode = 0;
unsigned int stride = 0; unsigned int stride = 0;
switch (info->drm_format_mod << 10) { switch (info->drm_format_mod) {
case PLANE_CTL_TILED_LINEAR: case DRM_FORMAT_MOD_LINEAR:
tiling_mode = I915_TILING_NONE; tiling_mode = I915_TILING_NONE;
break; break;
case PLANE_CTL_TILED_X: case I915_FORMAT_MOD_X_TILED:
tiling_mode = I915_TILING_X; tiling_mode = I915_TILING_X;
stride = info->stride; stride = info->stride;
break; break;
case PLANE_CTL_TILED_Y: case I915_FORMAT_MOD_Y_TILED:
case I915_FORMAT_MOD_Yf_TILED:
tiling_mode = I915_TILING_Y; tiling_mode = I915_TILING_Y;
stride = info->stride; stride = info->stride;
break; break;
default: default:
gvt_dbg_core("not supported tiling mode\n"); gvt_dbg_core("invalid drm_format_mod %llx for tiling\n",
info->drm_format_mod);
} }
obj->tiling_and_stride = tiling_mode | stride; obj->tiling_and_stride = tiling_mode | stride;
} else { } else {
...@@ -222,7 +224,24 @@ static int vgpu_get_plane_info(struct drm_device *dev, ...@@ -222,7 +224,24 @@ static int vgpu_get_plane_info(struct drm_device *dev,
info->height = p.height; info->height = p.height;
info->stride = p.stride; info->stride = p.stride;
info->drm_format = p.drm_format; info->drm_format = p.drm_format;
info->drm_format_mod = p.tiled;
switch (p.tiled) {
case PLANE_CTL_TILED_LINEAR:
info->drm_format_mod = DRM_FORMAT_MOD_LINEAR;
break;
case PLANE_CTL_TILED_X:
info->drm_format_mod = I915_FORMAT_MOD_X_TILED;
break;
case PLANE_CTL_TILED_Y:
info->drm_format_mod = I915_FORMAT_MOD_Y_TILED;
break;
case PLANE_CTL_TILED_YF:
info->drm_format_mod = I915_FORMAT_MOD_Yf_TILED;
break;
default:
gvt_vgpu_err("invalid tiling mode: %x\n", p.tiled);
}
info->size = (((p.stride * p.height * p.bpp) / 8) + info->size = (((p.stride * p.height * p.bpp) / 8) +
(PAGE_SIZE - 1)) >> PAGE_SHIFT; (PAGE_SIZE - 1)) >> PAGE_SHIFT;
} else if (plane_id == DRM_PLANE_TYPE_CURSOR) { } else if (plane_id == DRM_PLANE_TYPE_CURSOR) {
......
...@@ -220,8 +220,7 @@ int intel_vgpu_decode_primary_plane(struct intel_vgpu *vgpu, ...@@ -220,8 +220,7 @@ int intel_vgpu_decode_primary_plane(struct intel_vgpu *vgpu,
if (IS_SKYLAKE(dev_priv) if (IS_SKYLAKE(dev_priv)
|| IS_KABYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)
|| IS_BROXTON(dev_priv)) { || IS_BROXTON(dev_priv)) {
plane->tiled = (val & PLANE_CTL_TILED_MASK) >> plane->tiled = val & PLANE_CTL_TILED_MASK;
_PLANE_CTL_TILED_SHIFT;
fmt = skl_format_to_drm( fmt = skl_format_to_drm(
val & PLANE_CTL_FORMAT_MASK, val & PLANE_CTL_FORMAT_MASK,
val & PLANE_CTL_ORDER_RGBX, val & PLANE_CTL_ORDER_RGBX,
...@@ -260,7 +259,7 @@ int intel_vgpu_decode_primary_plane(struct intel_vgpu *vgpu, ...@@ -260,7 +259,7 @@ int intel_vgpu_decode_primary_plane(struct intel_vgpu *vgpu,
return -EINVAL; return -EINVAL;
} }
plane->stride = intel_vgpu_get_stride(vgpu, pipe, (plane->tiled << 10), plane->stride = intel_vgpu_get_stride(vgpu, pipe, plane->tiled,
(IS_SKYLAKE(dev_priv) (IS_SKYLAKE(dev_priv)
|| IS_KABYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)
|| IS_BROXTON(dev_priv)) ? || IS_BROXTON(dev_priv)) ?
......
...@@ -101,7 +101,7 @@ struct intel_gvt; ...@@ -101,7 +101,7 @@ struct intel_gvt;
/* color space conversion and gamma correction are not included */ /* color space conversion and gamma correction are not included */
struct intel_vgpu_primary_plane_format { struct intel_vgpu_primary_plane_format {
u8 enabled; /* plane is enabled */ u8 enabled; /* plane is enabled */
u8 tiled; /* X-tiled */ u32 tiled; /* tiling mode: linear, X-tiled, Y tiled, etc */
u8 bpp; /* bits per pixel */ u8 bpp; /* bits per pixel */
u32 hw_format; /* format field in the PRI_CTL register */ u32 hw_format; /* format field in the PRI_CTL register */
u32 drm_format; /* format in DRM definition */ u32 drm_format; /* format in DRM definition */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment