Commit 4fdbc678 authored by Benjamin Gaignard's avatar Benjamin Gaignard

drm: sti: add HQVDP plane

High Quality Video Data Plane is hardware IP dedicated
to video rendering. Compare to GPD (graphic planes) it
have better scaler capabilities.

HQVDP use VID layer to push data into hardware compositor
without going into DDR. From data flow point of view HQVDP
and VID are nested so HQVPD update/disable VID.
Signed-off-by: default avatarBenjamin Gaignard <benjamin.gaignard@linaro.org>
parent 96006a77
...@@ -83,6 +83,22 @@ sti-hda: ...@@ -83,6 +83,22 @@ sti-hda:
- clock-names: names of the clocks listed in clocks property in the same - clock-names: names of the clocks listed in clocks property in the same
order. order.
sti-hqvdp:
must be a child of sti-display-subsystem
Required properties:
- compatible: "st,stih<chip>-hqvdp"
- reg: Physical base address of the IP registers and length of memory mapped region.
- clocks: from common clock binding: handle hardware IP needed clocks, the
number of clocks may depend of the SoC type.
See ../clocks/clock-bindings.txt for details.
- clock-names: names of the clocks listed in clocks property in the same
order.
- resets: resets to be used by the device
See ../reset/reset.txt for details.
- reset-names: names of the resets listed in resets property in the same
order.
- st,vtg: phandle on vtg main device node.
Example: Example:
/ { / {
...@@ -183,6 +199,16 @@ Example: ...@@ -183,6 +199,16 @@ Example:
clocks = <&clockgen_c_vcc CLK_S_PIX_HD>, <&clockgen_c_vcc CLK_S_HDDAC>; clocks = <&clockgen_c_vcc CLK_S_PIX_HD>, <&clockgen_c_vcc CLK_S_HDDAC>;
}; };
}; };
sti-hqvdp@9c000000 {
compatible = "st,stih407-hqvdp";
reg = <0x9C00000 0x100000>;
clock-names = "hqvdp", "pix_main";
clocks = <&clk_s_c0_flexgen CLK_MAIN_DISP>, <&clk_s_d2_flexgen CLK_PIX_MAIN_DISP>;
reset-names = "hqvdp";
resets = <&softreset STIH407_HDQVDP_SOFTRESET>;
st,vtg = <&vtg_main>;
};
}; };
... ...
}; };
...@@ -5,6 +5,7 @@ config DRM_STI ...@@ -5,6 +5,7 @@ config DRM_STI
select DRM_KMS_HELPER select DRM_KMS_HELPER
select DRM_GEM_CMA_HELPER select DRM_GEM_CMA_HELPER
select DRM_KMS_CMA_HELPER select DRM_KMS_CMA_HELPER
select FW_LOADER_USER_HELPER_FALLBACK
help help
Choose this option to enable DRM on STM stiH41x chipset Choose this option to enable DRM on STM stiH41x chipset
......
...@@ -19,4 +19,5 @@ obj-$(CONFIG_DRM_STI) = \ ...@@ -19,4 +19,5 @@ obj-$(CONFIG_DRM_STI) = \
sti_hda.o \ sti_hda.o \
sti_tvout.o \ sti_tvout.o \
sticompositor.o \ sticompositor.o \
sti_hqvdp.o \
sti_drm_drv.o sti_drm_drv.o
...@@ -122,6 +122,7 @@ static int sti_compositor_bind(struct device *dev, struct device *master, ...@@ -122,6 +122,7 @@ static int sti_compositor_bind(struct device *dev, struct device *master,
plane++; plane++;
break; break;
case STI_BCK: case STI_BCK:
case STI_VDP:
break; break;
} }
......
...@@ -148,7 +148,8 @@ sti_drm_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *mode, ...@@ -148,7 +148,8 @@ sti_drm_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *mode,
w = crtc->primary->fb->width - x; w = crtc->primary->fb->width - x;
h = crtc->primary->fb->height - y; h = crtc->primary->fb->height - y;
return sti_layer_prepare(layer, crtc->primary->fb, &crtc->mode, return sti_layer_prepare(layer, crtc,
crtc->primary->fb, &crtc->mode,
mixer->id, 0, 0, w, h, x, y, w, h); mixer->id, 0, 0, w, h, x, y, w, h);
} }
...@@ -175,7 +176,8 @@ static int sti_drm_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y, ...@@ -175,7 +176,8 @@ static int sti_drm_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
w = crtc->primary->fb->width - crtc->x; w = crtc->primary->fb->width - crtc->x;
h = crtc->primary->fb->height - crtc->y; h = crtc->primary->fb->height - crtc->y;
ret = sti_layer_prepare(layer, crtc->primary->fb, &crtc->mode, ret = sti_layer_prepare(layer, crtc,
crtc->primary->fb, &crtc->mode,
mixer->id, 0, 0, w, h, mixer->id, 0, 0, w, h,
crtc->x, crtc->y, w, h); crtc->x, crtc->y, w, h);
if (ret) { if (ret) {
......
...@@ -45,7 +45,8 @@ sti_drm_update_plane(struct drm_plane *plane, struct drm_crtc *crtc, ...@@ -45,7 +45,8 @@ sti_drm_update_plane(struct drm_plane *plane, struct drm_crtc *crtc,
} }
/* src_x are in 16.16 format. */ /* src_x are in 16.16 format. */
res = sti_layer_prepare(layer, fb, &crtc->mode, mixer->id, res = sti_layer_prepare(layer, crtc, fb,
&crtc->mode, mixer->id,
crtc_x, crtc_y, crtc_w, crtc_h, crtc_x, crtc_y, crtc_w, crtc_h,
src_x >> 16, src_y >> 16, src_x >> 16, src_y >> 16,
src_w >> 16, src_h >> 16); src_w >> 16, src_h >> 16);
......
This diff is collapsed.
/*
* Copyright (C) STMicroelectronics SA 2014
* Authors: Fabien Dessenne <fabien.dessenne@st.com> for STMicroelectronics.
* License terms: GNU General Public License (GPL), version 2
*/
#ifndef _STI_HQVDP_H_
#define _STI_HQVDP_H_
struct sti_layer *sti_hqvdp_create(struct device *dev);
#endif
This diff is collapsed.
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "sti_compositor.h" #include "sti_compositor.h"
#include "sti_cursor.h" #include "sti_cursor.h"
#include "sti_gdp.h" #include "sti_gdp.h"
#include "sti_hqvdp.h"
#include "sti_layer.h" #include "sti_layer.h"
#include "sti_vid.h" #include "sti_vid.h"
...@@ -33,6 +34,8 @@ const char *sti_layer_to_str(struct sti_layer *layer) ...@@ -33,6 +34,8 @@ const char *sti_layer_to_str(struct sti_layer *layer)
return "VID1"; return "VID1";
case STI_CURSOR: case STI_CURSOR:
return "CURSOR"; return "CURSOR";
case STI_HQVDP_0:
return "HQVDP0";
default: default:
return "<UNKNOWN LAYER>"; return "<UNKNOWN LAYER>";
} }
...@@ -54,6 +57,9 @@ struct sti_layer *sti_layer_create(struct device *dev, int desc, ...@@ -54,6 +57,9 @@ struct sti_layer *sti_layer_create(struct device *dev, int desc,
case STI_CUR: case STI_CUR:
layer = sti_cursor_create(dev); layer = sti_cursor_create(dev);
break; break;
case STI_VDP:
layer = sti_hqvdp_create(dev);
break;
} }
if (!layer) { if (!layer) {
...@@ -72,7 +78,9 @@ struct sti_layer *sti_layer_create(struct device *dev, int desc, ...@@ -72,7 +78,9 @@ struct sti_layer *sti_layer_create(struct device *dev, int desc,
return layer; return layer;
} }
int sti_layer_prepare(struct sti_layer *layer, struct drm_framebuffer *fb, int sti_layer_prepare(struct sti_layer *layer,
struct drm_crtc *crtc,
struct drm_framebuffer *fb,
struct drm_display_mode *mode, int mixer_id, struct drm_display_mode *mode, int mixer_id,
int dest_x, int dest_y, int dest_w, int dest_h, int dest_x, int dest_y, int dest_w, int dest_h,
int src_x, int src_y, int src_w, int src_h) int src_x, int src_y, int src_w, int src_h)
...@@ -92,6 +100,7 @@ int sti_layer_prepare(struct sti_layer *layer, struct drm_framebuffer *fb, ...@@ -92,6 +100,7 @@ int sti_layer_prepare(struct sti_layer *layer, struct drm_framebuffer *fb,
return 1; return 1;
} }
layer->crtc = crtc;
layer->fb = fb; layer->fb = fb;
layer->mode = mode; layer->mode = mode;
layer->mixer_id = mixer_id; layer->mixer_id = mixer_id;
......
...@@ -22,7 +22,8 @@ enum sti_layer_type { ...@@ -22,7 +22,8 @@ enum sti_layer_type {
STI_GDP = 1 << STI_LAYER_TYPE_SHIFT, STI_GDP = 1 << STI_LAYER_TYPE_SHIFT,
STI_VID = 2 << STI_LAYER_TYPE_SHIFT, STI_VID = 2 << STI_LAYER_TYPE_SHIFT,
STI_CUR = 3 << STI_LAYER_TYPE_SHIFT, STI_CUR = 3 << STI_LAYER_TYPE_SHIFT,
STI_BCK = 4 << STI_LAYER_TYPE_SHIFT STI_BCK = 4 << STI_LAYER_TYPE_SHIFT,
STI_VDP = 5 << STI_LAYER_TYPE_SHIFT
}; };
enum sti_layer_id_of_type { enum sti_layer_id_of_type {
...@@ -39,6 +40,7 @@ enum sti_layer_desc { ...@@ -39,6 +40,7 @@ enum sti_layer_desc {
STI_GDP_3 = STI_GDP | STI_ID_3, STI_GDP_3 = STI_GDP | STI_ID_3,
STI_VID_0 = STI_VID | STI_ID_0, STI_VID_0 = STI_VID | STI_ID_0,
STI_VID_1 = STI_VID | STI_ID_1, STI_VID_1 = STI_VID | STI_ID_1,
STI_HQVDP_0 = STI_VDP | STI_ID_0,
STI_CURSOR = STI_CUR, STI_CURSOR = STI_CUR,
STI_BACK = STI_BCK STI_BACK = STI_BCK
}; };
...@@ -67,6 +69,7 @@ struct sti_layer_funcs { ...@@ -67,6 +69,7 @@ struct sti_layer_funcs {
* *
* @plane: drm plane it is bound to (if any) * @plane: drm plane it is bound to (if any)
* @fb: drm fb it is bound to * @fb: drm fb it is bound to
* @crtc: crtc it is bound to
* @mode: display mode * @mode: display mode
* @desc: layer type & id * @desc: layer type & id
* @device: driver device * @device: driver device
...@@ -88,6 +91,7 @@ struct sti_layer_funcs { ...@@ -88,6 +91,7 @@ struct sti_layer_funcs {
struct sti_layer { struct sti_layer {
struct drm_plane plane; struct drm_plane plane;
struct drm_framebuffer *fb; struct drm_framebuffer *fb;
struct drm_crtc *crtc;
struct drm_display_mode *mode; struct drm_display_mode *mode;
enum sti_layer_desc desc; enum sti_layer_desc desc;
struct device *dev; struct device *dev;
...@@ -109,7 +113,9 @@ struct sti_layer { ...@@ -109,7 +113,9 @@ struct sti_layer {
struct sti_layer *sti_layer_create(struct device *dev, int desc, struct sti_layer *sti_layer_create(struct device *dev, int desc,
void __iomem *baseaddr); void __iomem *baseaddr);
int sti_layer_prepare(struct sti_layer *layer, struct drm_framebuffer *fb, int sti_layer_prepare(struct sti_layer *layer,
struct drm_crtc *crtc,
struct drm_framebuffer *fb,
struct drm_display_mode *mode, struct drm_display_mode *mode,
int mixer_id, int mixer_id,
int dest_x, int dest_y, int dest_x, int dest_y,
......
...@@ -123,6 +123,7 @@ int sti_mixer_set_layer_depth(struct sti_mixer *mixer, struct sti_layer *layer) ...@@ -123,6 +123,7 @@ int sti_mixer_set_layer_depth(struct sti_mixer *mixer, struct sti_layer *layer)
layer_id = GAM_DEPTH_GDP3_ID; layer_id = GAM_DEPTH_GDP3_ID;
break; break;
case STI_VID_0: case STI_VID_0:
case STI_HQVDP_0:
layer_id = GAM_DEPTH_VID0_ID; layer_id = GAM_DEPTH_VID0_ID;
break; break;
case STI_VID_1: case STI_VID_1:
...@@ -189,6 +190,7 @@ static u32 sti_mixer_get_layer_mask(struct sti_layer *layer) ...@@ -189,6 +190,7 @@ static u32 sti_mixer_get_layer_mask(struct sti_layer *layer)
case STI_GDP_3: case STI_GDP_3:
return GAM_CTL_GDP3_MASK; return GAM_CTL_GDP3_MASK;
case STI_VID_0: case STI_VID_0:
case STI_HQVDP_0:
return GAM_CTL_VID0_MASK; return GAM_CTL_VID0_MASK;
case STI_VID_1: case STI_VID_1:
return GAM_CTL_VID1_MASK; return GAM_CTL_VID1_MASK;
......
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