aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r--drivers/gpu/drm/sti/sti_drm_plane.c23
-rw-r--r--drivers/gpu/drm/sti/sti_mixer.c19
-rw-r--r--drivers/gpu/drm/sti/sti_mixer.h2
3 files changed, 24 insertions, 20 deletions
diff --git a/drivers/gpu/drm/sti/sti_drm_plane.c b/drivers/gpu/drm/sti/sti_drm_plane.c
index 64d4ed43dda3..5427bc28f205 100644
--- a/drivers/gpu/drm/sti/sti_drm_plane.c
+++ b/drivers/gpu/drm/sti/sti_drm_plane.c
@@ -15,17 +15,16 @@
15#include "sti_drm_plane.h" 15#include "sti_drm_plane.h"
16#include "sti_vtg.h" 16#include "sti_vtg.h"
17 17
18/* (Background) < GDP0 < GDP1 < VID0 < VID1 < GDP2 < GDP3 < (ForeGround) */
18enum sti_layer_desc sti_layer_default_zorder[] = { 19enum sti_layer_desc sti_layer_default_zorder[] = {
19 STI_GDP_0, 20 STI_GDP_0,
20 STI_VID_0,
21 STI_GDP_1, 21 STI_GDP_1,
22 STI_VID_0,
22 STI_VID_1, 23 STI_VID_1,
23 STI_GDP_2, 24 STI_GDP_2,
24 STI_GDP_3, 25 STI_GDP_3,
25}; 26};
26 27
27/* (Background) < GDP0 < VID0 < GDP1 < VID1 < GDP2 < GDP3 < (ForeGround) */
28
29static int 28static int
30sti_drm_update_plane(struct drm_plane *plane, struct drm_crtc *crtc, 29sti_drm_update_plane(struct drm_plane *plane, struct drm_crtc *crtc,
31 struct drm_framebuffer *fb, int crtc_x, int crtc_y, 30 struct drm_framebuffer *fb, int crtc_x, int crtc_y,
@@ -191,8 +190,7 @@ static const struct drm_plane_helper_funcs sti_drm_plane_helpers_funcs = {
191 .atomic_disable = sti_drm_plane_atomic_disable, 190 .atomic_disable = sti_drm_plane_atomic_disable,
192}; 191};
193 192
194static void sti_drm_plane_attach_zorder_property(struct drm_plane *plane, 193static void sti_drm_plane_attach_zorder_property(struct drm_plane *plane)
195 uint64_t default_val)
196{ 194{
197 struct drm_device *dev = plane->dev; 195 struct drm_device *dev = plane->dev;
198 struct sti_drm_private *private = dev->dev_private; 196 struct sti_drm_private *private = dev->dev_private;
@@ -201,16 +199,15 @@ static void sti_drm_plane_attach_zorder_property(struct drm_plane *plane,
201 199
202 prop = private->plane_zorder_property; 200 prop = private->plane_zorder_property;
203 if (!prop) { 201 if (!prop) {
204 prop = drm_property_create_range(dev, 0, "zpos", 0, 202 prop = drm_property_create_range(dev, 0, "zpos", 1,
205 GAM_MIXER_NB_DEPTH_LEVEL - 1); 203 GAM_MIXER_NB_DEPTH_LEVEL);
206 if (!prop) 204 if (!prop)
207 return; 205 return;
208 206
209 private->plane_zorder_property = prop; 207 private->plane_zorder_property = prop;
210 } 208 }
211 209
212 drm_object_attach_property(&plane->base, prop, default_val); 210 drm_object_attach_property(&plane->base, prop, layer->zorder);
213 layer->zorder = default_val;
214} 211}
215 212
216struct drm_plane *sti_drm_plane_init(struct drm_device *dev, 213struct drm_plane *sti_drm_plane_init(struct drm_device *dev,
@@ -219,7 +216,6 @@ struct drm_plane *sti_drm_plane_init(struct drm_device *dev,
219 enum drm_plane_type type) 216 enum drm_plane_type type)
220{ 217{
221 int err, i; 218 int err, i;
222 uint64_t default_zorder = 0;
223 219
224 err = drm_universal_plane_init(dev, &layer->plane, possible_crtcs, 220 err = drm_universal_plane_init(dev, &layer->plane, possible_crtcs,
225 &sti_drm_plane_funcs, 221 &sti_drm_plane_funcs,
@@ -236,15 +232,14 @@ struct drm_plane *sti_drm_plane_init(struct drm_device *dev,
236 if (sti_layer_default_zorder[i] == layer->desc) 232 if (sti_layer_default_zorder[i] == layer->desc)
237 break; 233 break;
238 234
239 default_zorder = i + 1; 235 layer->zorder = i + 1;
240 236
241 if (type == DRM_PLANE_TYPE_OVERLAY) 237 if (type == DRM_PLANE_TYPE_OVERLAY)
242 sti_drm_plane_attach_zorder_property(&layer->plane, 238 sti_drm_plane_attach_zorder_property(&layer->plane);
243 default_zorder);
244 239
245 DRM_DEBUG_DRIVER("drm plane:%d mapped to %s with zorder:%llu\n", 240 DRM_DEBUG_DRIVER("drm plane:%d mapped to %s with zorder:%llu\n",
246 layer->plane.base.id, 241 layer->plane.base.id,
247 sti_layer_to_str(layer), default_zorder); 242 sti_layer_to_str(layer), layer->zorder);
248 243
249 return &layer->plane; 244 return &layer->plane;
250} 245}
diff --git a/drivers/gpu/drm/sti/sti_mixer.c b/drivers/gpu/drm/sti/sti_mixer.c
index 13a4b84deab6..61a2048cf5d6 100644
--- a/drivers/gpu/drm/sti/sti_mixer.c
+++ b/drivers/gpu/drm/sti/sti_mixer.c
@@ -103,10 +103,11 @@ static void sti_mixer_set_background_area(struct sti_mixer *mixer,
103 103
104int sti_mixer_set_layer_depth(struct sti_mixer *mixer, struct sti_layer *layer) 104int sti_mixer_set_layer_depth(struct sti_mixer *mixer, struct sti_layer *layer)
105{ 105{
106 int layer_id = 0, depth = layer->zorder; 106 int layer_id, depth = layer->zorder;
107 unsigned int i;
107 u32 mask, val; 108 u32 mask, val;
108 109
109 if (depth >= GAM_MIXER_NB_DEPTH_LEVEL) 110 if ((depth < 1) || (depth > GAM_MIXER_NB_DEPTH_LEVEL))
110 return 1; 111 return 1;
111 112
112 switch (layer->desc) { 113 switch (layer->desc) {
@@ -136,15 +137,23 @@ int sti_mixer_set_layer_depth(struct sti_mixer *mixer, struct sti_layer *layer)
136 DRM_ERROR("Unknown layer %d\n", layer->desc); 137 DRM_ERROR("Unknown layer %d\n", layer->desc);
137 return 1; 138 return 1;
138 } 139 }
139 mask = GAM_DEPTH_MASK_ID << (3 * depth); 140
140 layer_id = layer_id << (3 * depth); 141 /* Search if a previous depth was already assigned to the layer */
142 val = sti_mixer_reg_read(mixer, GAM_MIXER_CRB);
143 for (i = 0; i < GAM_MIXER_NB_DEPTH_LEVEL; i++) {
144 mask = GAM_DEPTH_MASK_ID << (3 * i);
145 if ((val & mask) == layer_id << (3 * i))
146 break;
147 }
148
149 mask |= GAM_DEPTH_MASK_ID << (3 * (depth - 1));
150 layer_id = layer_id << (3 * (depth - 1));
141 151
142 DRM_DEBUG_DRIVER("%s %s depth=%d\n", sti_mixer_to_str(mixer), 152 DRM_DEBUG_DRIVER("%s %s depth=%d\n", sti_mixer_to_str(mixer),
143 sti_layer_to_str(layer), depth); 153 sti_layer_to_str(layer), depth);
144 dev_dbg(mixer->dev, "GAM_MIXER_CRB val 0x%x mask 0x%x\n", 154 dev_dbg(mixer->dev, "GAM_MIXER_CRB val 0x%x mask 0x%x\n",
145 layer_id, mask); 155 layer_id, mask);
146 156
147 val = sti_mixer_reg_read(mixer, GAM_MIXER_CRB);
148 val &= ~mask; 157 val &= ~mask;
149 val |= layer_id; 158 val |= layer_id;
150 sti_mixer_reg_write(mixer, GAM_MIXER_CRB, val); 159 sti_mixer_reg_write(mixer, GAM_MIXER_CRB, val);
diff --git a/drivers/gpu/drm/sti/sti_mixer.h b/drivers/gpu/drm/sti/sti_mixer.h
index b97282182908..eb663f65f814 100644
--- a/drivers/gpu/drm/sti/sti_mixer.h
+++ b/drivers/gpu/drm/sti/sti_mixer.h
@@ -49,7 +49,7 @@ int sti_mixer_active_video_area(struct sti_mixer *mixer,
49void sti_mixer_set_background_status(struct sti_mixer *mixer, bool enable); 49void sti_mixer_set_background_status(struct sti_mixer *mixer, bool enable);
50 50
51/* depth in Cross-bar control = z order */ 51/* depth in Cross-bar control = z order */
52#define GAM_MIXER_NB_DEPTH_LEVEL 7 52#define GAM_MIXER_NB_DEPTH_LEVEL 6
53 53
54#define STI_MIXER_MAIN 0 54#define STI_MIXER_MAIN 0
55#define STI_MIXER_AUX 1 55#define STI_MIXER_AUX 1