Commit d8a4ef25 authored by Laurent Pinchart's avatar Laurent Pinchart

drm: rcar-du: Store V4L2 fourcc in rcar_du_format_info structure

The mapping between DRM and V4L2 fourcc's is stored in two separate
tables in rcar_du_vsp.c. In order to make it reusable to implement
writeback support, move it to the rcar_du_format_info structure.
Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Reviewed-by: default avatarKieran Bingham <kieran.bingham+renesas@ideasonboard.com>
parent 12a85f99
...@@ -34,60 +34,70 @@ ...@@ -34,60 +34,70 @@
static const struct rcar_du_format_info rcar_du_format_infos[] = { static const struct rcar_du_format_info rcar_du_format_infos[] = {
{ {
.fourcc = DRM_FORMAT_RGB565, .fourcc = DRM_FORMAT_RGB565,
.v4l2 = V4L2_PIX_FMT_RGB565,
.bpp = 16, .bpp = 16,
.planes = 1, .planes = 1,
.pnmr = PnMR_SPIM_TP | PnMR_DDDF_16BPP, .pnmr = PnMR_SPIM_TP | PnMR_DDDF_16BPP,
.edf = PnDDCR4_EDF_NONE, .edf = PnDDCR4_EDF_NONE,
}, { }, {
.fourcc = DRM_FORMAT_ARGB1555, .fourcc = DRM_FORMAT_ARGB1555,
.v4l2 = V4L2_PIX_FMT_ARGB555,
.bpp = 16, .bpp = 16,
.planes = 1, .planes = 1,
.pnmr = PnMR_SPIM_ALP | PnMR_DDDF_ARGB, .pnmr = PnMR_SPIM_ALP | PnMR_DDDF_ARGB,
.edf = PnDDCR4_EDF_NONE, .edf = PnDDCR4_EDF_NONE,
}, { }, {
.fourcc = DRM_FORMAT_XRGB1555, .fourcc = DRM_FORMAT_XRGB1555,
.v4l2 = V4L2_PIX_FMT_XRGB555,
.bpp = 16, .bpp = 16,
.planes = 1, .planes = 1,
.pnmr = PnMR_SPIM_ALP | PnMR_DDDF_ARGB, .pnmr = PnMR_SPIM_ALP | PnMR_DDDF_ARGB,
.edf = PnDDCR4_EDF_NONE, .edf = PnDDCR4_EDF_NONE,
}, { }, {
.fourcc = DRM_FORMAT_XRGB8888, .fourcc = DRM_FORMAT_XRGB8888,
.v4l2 = V4L2_PIX_FMT_XBGR32,
.bpp = 32, .bpp = 32,
.planes = 1, .planes = 1,
.pnmr = PnMR_SPIM_TP | PnMR_DDDF_16BPP, .pnmr = PnMR_SPIM_TP | PnMR_DDDF_16BPP,
.edf = PnDDCR4_EDF_RGB888, .edf = PnDDCR4_EDF_RGB888,
}, { }, {
.fourcc = DRM_FORMAT_ARGB8888, .fourcc = DRM_FORMAT_ARGB8888,
.v4l2 = V4L2_PIX_FMT_ABGR32,
.bpp = 32, .bpp = 32,
.planes = 1, .planes = 1,
.pnmr = PnMR_SPIM_ALP | PnMR_DDDF_16BPP, .pnmr = PnMR_SPIM_ALP | PnMR_DDDF_16BPP,
.edf = PnDDCR4_EDF_ARGB8888, .edf = PnDDCR4_EDF_ARGB8888,
}, { }, {
.fourcc = DRM_FORMAT_UYVY, .fourcc = DRM_FORMAT_UYVY,
.v4l2 = V4L2_PIX_FMT_UYVY,
.bpp = 16, .bpp = 16,
.planes = 1, .planes = 1,
.pnmr = PnMR_SPIM_TP_OFF | PnMR_DDDF_YC, .pnmr = PnMR_SPIM_TP_OFF | PnMR_DDDF_YC,
.edf = PnDDCR4_EDF_NONE, .edf = PnDDCR4_EDF_NONE,
}, { }, {
.fourcc = DRM_FORMAT_YUYV, .fourcc = DRM_FORMAT_YUYV,
.v4l2 = V4L2_PIX_FMT_YUYV,
.bpp = 16, .bpp = 16,
.planes = 1, .planes = 1,
.pnmr = PnMR_SPIM_TP_OFF | PnMR_DDDF_YC, .pnmr = PnMR_SPIM_TP_OFF | PnMR_DDDF_YC,
.edf = PnDDCR4_EDF_NONE, .edf = PnDDCR4_EDF_NONE,
}, { }, {
.fourcc = DRM_FORMAT_NV12, .fourcc = DRM_FORMAT_NV12,
.v4l2 = V4L2_PIX_FMT_NV12M,
.bpp = 12, .bpp = 12,
.planes = 2, .planes = 2,
.pnmr = PnMR_SPIM_TP_OFF | PnMR_DDDF_YC, .pnmr = PnMR_SPIM_TP_OFF | PnMR_DDDF_YC,
.edf = PnDDCR4_EDF_NONE, .edf = PnDDCR4_EDF_NONE,
}, { }, {
.fourcc = DRM_FORMAT_NV21, .fourcc = DRM_FORMAT_NV21,
.v4l2 = V4L2_PIX_FMT_NV21M,
.bpp = 12, .bpp = 12,
.planes = 2, .planes = 2,
.pnmr = PnMR_SPIM_TP_OFF | PnMR_DDDF_YC, .pnmr = PnMR_SPIM_TP_OFF | PnMR_DDDF_YC,
.edf = PnDDCR4_EDF_NONE, .edf = PnDDCR4_EDF_NONE,
}, { }, {
.fourcc = DRM_FORMAT_NV16, .fourcc = DRM_FORMAT_NV16,
.v4l2 = V4L2_PIX_FMT_NV16M,
.bpp = 16, .bpp = 16,
.planes = 2, .planes = 2,
.pnmr = PnMR_SPIM_TP_OFF | PnMR_DDDF_YC, .pnmr = PnMR_SPIM_TP_OFF | PnMR_DDDF_YC,
...@@ -99,62 +109,77 @@ static const struct rcar_du_format_info rcar_du_format_infos[] = { ...@@ -99,62 +109,77 @@ static const struct rcar_du_format_info rcar_du_format_infos[] = {
*/ */
{ {
.fourcc = DRM_FORMAT_RGB332, .fourcc = DRM_FORMAT_RGB332,
.v4l2 = V4L2_PIX_FMT_RGB332,
.bpp = 8, .bpp = 8,
.planes = 1, .planes = 1,
}, { }, {
.fourcc = DRM_FORMAT_ARGB4444, .fourcc = DRM_FORMAT_ARGB4444,
.v4l2 = V4L2_PIX_FMT_ARGB444,
.bpp = 16, .bpp = 16,
.planes = 1, .planes = 1,
}, { }, {
.fourcc = DRM_FORMAT_XRGB4444, .fourcc = DRM_FORMAT_XRGB4444,
.v4l2 = V4L2_PIX_FMT_XRGB444,
.bpp = 16, .bpp = 16,
.planes = 1, .planes = 1,
}, { }, {
.fourcc = DRM_FORMAT_BGR888, .fourcc = DRM_FORMAT_BGR888,
.v4l2 = V4L2_PIX_FMT_RGB24,
.bpp = 24, .bpp = 24,
.planes = 1, .planes = 1,
}, { }, {
.fourcc = DRM_FORMAT_RGB888, .fourcc = DRM_FORMAT_RGB888,
.v4l2 = V4L2_PIX_FMT_BGR24,
.bpp = 24, .bpp = 24,
.planes = 1, .planes = 1,
}, { }, {
.fourcc = DRM_FORMAT_BGRA8888, .fourcc = DRM_FORMAT_BGRA8888,
.v4l2 = V4L2_PIX_FMT_ARGB32,
.bpp = 32, .bpp = 32,
.planes = 1, .planes = 1,
}, { }, {
.fourcc = DRM_FORMAT_BGRX8888, .fourcc = DRM_FORMAT_BGRX8888,
.v4l2 = V4L2_PIX_FMT_XRGB32,
.bpp = 32, .bpp = 32,
.planes = 1, .planes = 1,
}, { }, {
.fourcc = DRM_FORMAT_YVYU, .fourcc = DRM_FORMAT_YVYU,
.v4l2 = V4L2_PIX_FMT_YVYU,
.bpp = 16, .bpp = 16,
.planes = 1, .planes = 1,
}, { }, {
.fourcc = DRM_FORMAT_NV61, .fourcc = DRM_FORMAT_NV61,
.v4l2 = V4L2_PIX_FMT_NV61M,
.bpp = 16, .bpp = 16,
.planes = 2, .planes = 2,
}, { }, {
.fourcc = DRM_FORMAT_YUV420, .fourcc = DRM_FORMAT_YUV420,
.v4l2 = V4L2_PIX_FMT_YUV420M,
.bpp = 12, .bpp = 12,
.planes = 3, .planes = 3,
}, { }, {
.fourcc = DRM_FORMAT_YVU420, .fourcc = DRM_FORMAT_YVU420,
.v4l2 = V4L2_PIX_FMT_YVU420M,
.bpp = 12, .bpp = 12,
.planes = 3, .planes = 3,
}, { }, {
.fourcc = DRM_FORMAT_YUV422, .fourcc = DRM_FORMAT_YUV422,
.v4l2 = V4L2_PIX_FMT_YUV422M,
.bpp = 16, .bpp = 16,
.planes = 3, .planes = 3,
}, { }, {
.fourcc = DRM_FORMAT_YVU422, .fourcc = DRM_FORMAT_YVU422,
.v4l2 = V4L2_PIX_FMT_YVU422M,
.bpp = 16, .bpp = 16,
.planes = 3, .planes = 3,
}, { }, {
.fourcc = DRM_FORMAT_YUV444, .fourcc = DRM_FORMAT_YUV444,
.v4l2 = V4L2_PIX_FMT_YUV444M,
.bpp = 24, .bpp = 24,
.planes = 3, .planes = 3,
}, { }, {
.fourcc = DRM_FORMAT_YVU444, .fourcc = DRM_FORMAT_YVU444,
.v4l2 = V4L2_PIX_FMT_YVU444M,
.bpp = 24, .bpp = 24,
.planes = 3, .planes = 3,
}, },
......
...@@ -19,6 +19,7 @@ struct rcar_du_device; ...@@ -19,6 +19,7 @@ struct rcar_du_device;
struct rcar_du_format_info { struct rcar_du_format_info {
u32 fourcc; u32 fourcc;
u32 v4l2;
unsigned int bpp; unsigned int bpp;
unsigned int planes; unsigned int planes;
unsigned int pnmr; unsigned int pnmr;
......
...@@ -110,8 +110,7 @@ void rcar_du_vsp_atomic_flush(struct rcar_du_crtc *crtc) ...@@ -110,8 +110,7 @@ void rcar_du_vsp_atomic_flush(struct rcar_du_crtc *crtc)
vsp1_du_atomic_flush(crtc->vsp->vsp, crtc->vsp_pipe, &cfg); vsp1_du_atomic_flush(crtc->vsp->vsp, crtc->vsp_pipe, &cfg);
} }
/* Keep the two tables in sync. */ static const u32 rcar_du_vsp_formats[] = {
static const u32 formats_kms[] = {
DRM_FORMAT_RGB332, DRM_FORMAT_RGB332,
DRM_FORMAT_ARGB4444, DRM_FORMAT_ARGB4444,
DRM_FORMAT_XRGB4444, DRM_FORMAT_XRGB4444,
...@@ -139,40 +138,13 @@ static const u32 formats_kms[] = { ...@@ -139,40 +138,13 @@ static const u32 formats_kms[] = {
DRM_FORMAT_YVU444, DRM_FORMAT_YVU444,
}; };
static const u32 formats_v4l2[] = {
V4L2_PIX_FMT_RGB332,
V4L2_PIX_FMT_ARGB444,
V4L2_PIX_FMT_XRGB444,
V4L2_PIX_FMT_ARGB555,
V4L2_PIX_FMT_XRGB555,
V4L2_PIX_FMT_RGB565,
V4L2_PIX_FMT_RGB24,
V4L2_PIX_FMT_BGR24,
V4L2_PIX_FMT_ARGB32,
V4L2_PIX_FMT_XRGB32,
V4L2_PIX_FMT_ABGR32,
V4L2_PIX_FMT_XBGR32,
V4L2_PIX_FMT_UYVY,
V4L2_PIX_FMT_YUYV,
V4L2_PIX_FMT_YVYU,
V4L2_PIX_FMT_NV12M,
V4L2_PIX_FMT_NV21M,
V4L2_PIX_FMT_NV16M,
V4L2_PIX_FMT_NV61M,
V4L2_PIX_FMT_YUV420M,
V4L2_PIX_FMT_YVU420M,
V4L2_PIX_FMT_YUV422M,
V4L2_PIX_FMT_YVU422M,
V4L2_PIX_FMT_YUV444M,
V4L2_PIX_FMT_YVU444M,
};
static void rcar_du_vsp_plane_setup(struct rcar_du_vsp_plane *plane) static void rcar_du_vsp_plane_setup(struct rcar_du_vsp_plane *plane)
{ {
struct rcar_du_vsp_plane_state *state = struct rcar_du_vsp_plane_state *state =
to_rcar_vsp_plane_state(plane->plane.state); to_rcar_vsp_plane_state(plane->plane.state);
struct rcar_du_crtc *crtc = to_rcar_crtc(state->state.crtc); struct rcar_du_crtc *crtc = to_rcar_crtc(state->state.crtc);
struct drm_framebuffer *fb = plane->plane.state->fb; struct drm_framebuffer *fb = plane->plane.state->fb;
const struct rcar_du_format_info *format;
struct vsp1_du_atomic_config cfg = { struct vsp1_du_atomic_config cfg = {
.pixelformat = 0, .pixelformat = 0,
.pitch = fb->pitches[0], .pitch = fb->pitches[0],
...@@ -195,12 +167,8 @@ static void rcar_du_vsp_plane_setup(struct rcar_du_vsp_plane *plane) ...@@ -195,12 +167,8 @@ static void rcar_du_vsp_plane_setup(struct rcar_du_vsp_plane *plane)
cfg.mem[i] = sg_dma_address(state->sg_tables[i].sgl) cfg.mem[i] = sg_dma_address(state->sg_tables[i].sgl)
+ fb->offsets[i]; + fb->offsets[i];
for (i = 0; i < ARRAY_SIZE(formats_kms); ++i) { format = rcar_du_format_info(state->format->fourcc);
if (formats_kms[i] == state->format->fourcc) { cfg.pixelformat = format->v4l2;
cfg.pixelformat = formats_v4l2[i];
break;
}
}
vsp1_du_atomic_update(plane->vsp->vsp, crtc->vsp_pipe, vsp1_du_atomic_update(plane->vsp->vsp, crtc->vsp_pipe,
plane->index, &cfg); plane->index, &cfg);
...@@ -395,8 +363,8 @@ int rcar_du_vsp_init(struct rcar_du_vsp *vsp, struct device_node *np, ...@@ -395,8 +363,8 @@ int rcar_du_vsp_init(struct rcar_du_vsp *vsp, struct device_node *np,
ret = drm_universal_plane_init(rcdu->ddev, &plane->plane, crtcs, ret = drm_universal_plane_init(rcdu->ddev, &plane->plane, crtcs,
&rcar_du_vsp_plane_funcs, &rcar_du_vsp_plane_funcs,
formats_kms, rcar_du_vsp_formats,
ARRAY_SIZE(formats_kms), ARRAY_SIZE(rcar_du_vsp_formats),
NULL, type, NULL); NULL, type, NULL);
if (ret < 0) if (ret < 0)
return ret; return ret;
......
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