RE: [PATCH v8 3/6] drm/i915/gvt: Frame buffer decoder support for GVT-g
>-Original Message- >From: Zhenyu Wang [mailto:zhen...@linux.intel.com] >Sent: Wednesday, June 14, 2017 5:39 PM >To: Chen, Xiaoguang >Cc: alex.william...@redhat.com; kra...@redhat.com; ch...@chris-wilson.co.uk; >intel-...@lists.freedesktop.org; linux-kernel@vger.kernel.org; >zhen...@linux.intel.com; Lv, Zhiyuan ; intel-gvt- >d...@lists.freedesktop.org; Wang, Zhi A ; Tian, Kevin > >Subject: Re: [PATCH v8 3/6] drm/i915/gvt: Frame buffer decoder support for GVT- >g > >On 2017.06.09 14:50:39 +0800, Xiaoguang Chen wrote: >> decode frambuffer attributes of primary, cursor and sprite plane >> >> Signed-off-by: Xiaoguang Chen > >... > >> +/** >> + * intel_vgpu_decode_primary_plane - Decode primary plane >> + * @vgpu: input vgpu >> + * @plane: primary plane to save decoded info >> + * This function is called for decoding plane >> + * >> + * Returns: >> + * 0 on success, non-zero if failed. >> + */ >> +int intel_vgpu_decode_primary_plane(struct intel_vgpu *vgpu, >> +struct intel_vgpu_primary_plane_format *plane) { >> +u32 val, fmt; >> +struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv; >> +int pipe; >> + >> +pipe = get_active_pipe(vgpu); >> +if (pipe >= I915_MAX_PIPES) >> +return -ENODEV; >> + >> +val = vgpu_vreg(vgpu, DSPCNTR(pipe)); >> +plane->enabled = !!(val & DISPLAY_PLANE_ENABLE); >> +if (!plane->enabled) >> +return -ENODEV; >> + >> +if (IS_SKYLAKE(dev_priv)) { >> +plane->tiled = (val & PLANE_CTL_TILED_MASK) >> >> +_PLANE_CTL_TILED_SHIFT; >> +fmt = skl_format_to_drm( >> +val & PLANE_CTL_FORMAT_MASK, >> +val & PLANE_CTL_ORDER_RGBX, >> +val & PLANE_CTL_ALPHA_MASK, >> +val & PLANE_CTL_YUV422_ORDER_MASK); >> +plane->bpp = skl_pixel_formats[fmt].bpp; >> +plane->drm_format = skl_pixel_formats[fmt].drm_format; >> +} else { >> +plane->tiled = !!(val & DISPPLANE_TILED); >> +fmt = (val & DISPPLANE_PIXFORMAT_MASK) >> >_PRI_PLANE_FMT_SHIFT; >> +plane->bpp = bdw_pixel_formats[fmt].bpp; >> +plane->drm_format = bdw_pixel_formats[fmt].drm_format; >> +} >> + >> +if (!skl_pixel_formats[fmt].bpp && !bdw_pixel_formats[fmt].bpp) { >> +gvt_vgpu_err("Non-supported pixel format (0x%x)\n", fmt); >> +return -EINVAL; >> +} > >Is this correct? shouldn't be plane->bpp as last time comment? Yes. But use plane->bpp is more concisely. Will change. > >> diff --git a/include/uapi/drm/drm_fourcc.h >> b/include/uapi/drm/drm_fourcc.h index 55e3010..400759f 100644 >> --- a/include/uapi/drm/drm_fourcc.h >> +++ b/include/uapi/drm/drm_fourcc.h >> @@ -161,6 +161,12 @@ extern "C" { >> #define DRM_FORMAT_YUV444 fourcc_code('Y', 'U', '2', '4') /* non- >subsampled Cb (1) and Cr (2) planes */ >> #define DRM_FORMAT_YVU444 fourcc_code('Y', 'V', '2', '4') /* non- >subsampled Cr (1) and Cb (2) planes */ >> >> +/* >> + * Intel GVT-g plane format definition */ #define >> +DRM_FORMAT_XRGB161616_GVT fourcc_code('X', 'R', '4', '8') /* [63:0] >> +x:R:G:B 16:16:16:16 little endian */ #define >> +DRM_FORMAT_XBGR161616_GVT fourcc_code('X', 'B', '4', '8') /* [63:0] >> +x:B:G:R 16:16:16:16 little endian */ >> + >> > >This should be a seperate patch and not need GVT postfix for format definition. OK. > >-- >Open Source Technology Center, Intel ltd. > >$gpg --keyserver wwwkeys.pgp.net --recv-keys 4D781827
Re: [PATCH v8 3/6] drm/i915/gvt: Frame buffer decoder support for GVT-g
On 2017.06.09 14:50:39 +0800, Xiaoguang Chen wrote: > decode frambuffer attributes of primary, cursor and sprite plane > > Signed-off-by: Xiaoguang Chen ... > +/** > + * intel_vgpu_decode_primary_plane - Decode primary plane > + * @vgpu: input vgpu > + * @plane: primary plane to save decoded info > + * This function is called for decoding plane > + * > + * Returns: > + * 0 on success, non-zero if failed. > + */ > +int intel_vgpu_decode_primary_plane(struct intel_vgpu *vgpu, > + struct intel_vgpu_primary_plane_format *plane) > +{ > + u32 val, fmt; > + struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv; > + int pipe; > + > + pipe = get_active_pipe(vgpu); > + if (pipe >= I915_MAX_PIPES) > + return -ENODEV; > + > + val = vgpu_vreg(vgpu, DSPCNTR(pipe)); > + plane->enabled = !!(val & DISPLAY_PLANE_ENABLE); > + if (!plane->enabled) > + return -ENODEV; > + > + if (IS_SKYLAKE(dev_priv)) { > + plane->tiled = (val & PLANE_CTL_TILED_MASK) >> > + _PLANE_CTL_TILED_SHIFT; > + fmt = skl_format_to_drm( > + val & PLANE_CTL_FORMAT_MASK, > + val & PLANE_CTL_ORDER_RGBX, > + val & PLANE_CTL_ALPHA_MASK, > + val & PLANE_CTL_YUV422_ORDER_MASK); > + plane->bpp = skl_pixel_formats[fmt].bpp; > + plane->drm_format = skl_pixel_formats[fmt].drm_format; > + } else { > + plane->tiled = !!(val & DISPPLANE_TILED); > + fmt = (val & DISPPLANE_PIXFORMAT_MASK) >> _PRI_PLANE_FMT_SHIFT; > + plane->bpp = bdw_pixel_formats[fmt].bpp; > + plane->drm_format = bdw_pixel_formats[fmt].drm_format; > + } > + > + if (!skl_pixel_formats[fmt].bpp && !bdw_pixel_formats[fmt].bpp) { > + gvt_vgpu_err("Non-supported pixel format (0x%x)\n", fmt); > + return -EINVAL; > + } Is this correct? shouldn't be plane->bpp as last time comment? > diff --git a/include/uapi/drm/drm_fourcc.h b/include/uapi/drm/drm_fourcc.h > index 55e3010..400759f 100644 > --- a/include/uapi/drm/drm_fourcc.h > +++ b/include/uapi/drm/drm_fourcc.h > @@ -161,6 +161,12 @@ extern "C" { > #define DRM_FORMAT_YUV444fourcc_code('Y', 'U', '2', '4') /* > non-subsampled Cb (1) and Cr (2) planes */ > #define DRM_FORMAT_YVU444fourcc_code('Y', 'V', '2', '4') /* > non-subsampled Cr (1) and Cb (2) planes */ > > +/* > + * Intel GVT-g plane format definition > + */ > +#define DRM_FORMAT_XRGB161616_GVT fourcc_code('X', 'R', '4', '8') /* [63:0] > x:R:G:B 16:16:16:16 little endian */ > +#define DRM_FORMAT_XBGR161616_GVT fourcc_code('X', 'B', '4', '8') /* [63:0] > x:B:G:R 16:16:16:16 little endian */ > + > This should be a seperate patch and not need GVT postfix for format definition. -- Open Source Technology Center, Intel ltd. $gpg --keyserver wwwkeys.pgp.net --recv-keys 4D781827 signature.asc Description: PGP signature
[PATCH v8 3/6] drm/i915/gvt: Frame buffer decoder support for GVT-g
decode frambuffer attributes of primary, cursor and sprite plane Signed-off-by: Xiaoguang Chen --- drivers/gpu/drm/i915/gvt/Makefile | 3 +- drivers/gpu/drm/i915/gvt/display.c| 2 +- drivers/gpu/drm/i915/gvt/display.h| 2 + drivers/gpu/drm/i915/gvt/fb_decoder.c | 425 ++ drivers/gpu/drm/i915/gvt/fb_decoder.h | 171 ++ drivers/gpu/drm/i915/gvt/gvt.h| 1 + include/uapi/drm/drm_fourcc.h | 6 + 7 files changed, 608 insertions(+), 2 deletions(-) create mode 100644 drivers/gpu/drm/i915/gvt/fb_decoder.c create mode 100644 drivers/gpu/drm/i915/gvt/fb_decoder.h diff --git a/drivers/gpu/drm/i915/gvt/Makefile b/drivers/gpu/drm/i915/gvt/Makefile index b123c20..192ca26 100644 --- a/drivers/gpu/drm/i915/gvt/Makefile +++ b/drivers/gpu/drm/i915/gvt/Makefile @@ -1,7 +1,8 @@ GVT_DIR := gvt GVT_SOURCE := gvt.o aperture_gm.o handlers.o vgpu.o trace_points.o firmware.o \ interrupt.o gtt.o cfg_space.o opregion.o mmio.o display.o edid.o \ - execlist.o scheduler.o sched_policy.o render.o cmd_parser.o + execlist.o scheduler.o sched_policy.o render.o cmd_parser.o \ + fb_decoder.o ccflags-y += -I$(src) -I$(src)/$(GVT_DIR) -Wall i915-y += $(addprefix $(GVT_DIR)/, $(GVT_SOURCE)) diff --git a/drivers/gpu/drm/i915/gvt/display.c b/drivers/gpu/drm/i915/gvt/display.c index e0261fc..f5f63c5 100644 --- a/drivers/gpu/drm/i915/gvt/display.c +++ b/drivers/gpu/drm/i915/gvt/display.c @@ -67,7 +67,7 @@ static int edp_pipe_is_enabled(struct intel_vgpu *vgpu) return 1; } -static int pipe_is_enabled(struct intel_vgpu *vgpu, int pipe) +int pipe_is_enabled(struct intel_vgpu *vgpu, int pipe) { struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv; diff --git a/drivers/gpu/drm/i915/gvt/display.h b/drivers/gpu/drm/i915/gvt/display.h index d73de22..b46b868 100644 --- a/drivers/gpu/drm/i915/gvt/display.h +++ b/drivers/gpu/drm/i915/gvt/display.h @@ -179,4 +179,6 @@ int intel_vgpu_init_display(struct intel_vgpu *vgpu, u64 resolution); void intel_vgpu_reset_display(struct intel_vgpu *vgpu); void intel_vgpu_clean_display(struct intel_vgpu *vgpu); +int pipe_is_enabled(struct intel_vgpu *vgpu, int pipe); + #endif diff --git a/drivers/gpu/drm/i915/gvt/fb_decoder.c b/drivers/gpu/drm/i915/gvt/fb_decoder.c new file mode 100644 index 000..beac70b --- /dev/null +++ b/drivers/gpu/drm/i915/gvt/fb_decoder.c @@ -0,0 +1,425 @@ +/* + * Copyright(c) 2011-2016 Intel Corporation. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Authors: + *Kevin Tian + * + * Contributors: + *Bing Niu + *Xu Han + *Ping Gao + *Xiaoguang Chen + *Yang Liu + * + */ + +#include +#include "i915_drv.h" +#include "gvt.h" + +#define PRIMARY_FORMAT_NUM 16 +struct pixel_format { + int drm_format; /* Pixel format in DRM definition */ + int bpp;/* Bits per pixel, 0 indicates invalid */ + char *desc; /* The description */ +}; + +/* non-supported format has bpp default to 0 */ +static struct pixel_format bdw_pixel_formats[PRIMARY_FORMAT_NUM] = { + [0x2] = {DRM_FORMAT_C8, 8, "8-bit Indexed"}, + [0x5] = {DRM_FORMAT_RGB565, 16, "16-bit BGRX (5:6:5 MSB-R:G:B)"}, + [0x6] = {DRM_FORMAT_XRGB, 32, + "32-bit BGRX (8:8:8:8 MSB-X:R:G:B)"}, + [0x8] = {DRM_FORMAT_XBGR2101010, 32, + "32-bit RGBX (2:10:10:10 MSB-X:B:G:R)"}, + [0xa] = {DRM_FORMAT_XRGB2101010, 32, + "32-bit BGRX (2:10:10:10 MSB-X:R:G:B)"}, + [0xc] = {DRM_FORMAT_XRGB161616_GVT, 64, + "64-bit RGBX Floating Point(16:16:16:16 MSB-X:B:G:R)"}, + [0xe] = {DRM_FORMAT_XBGR, 32, + "32-bit RGBX (8:8:8:8 MSB-X:B:G:R)"}, +}; + +/* non-supported format has bpp def