diff options
Diffstat (limited to 'drivers/gpu/drm')
| -rw-r--r-- | drivers/gpu/drm/sti/sti_drm_plane.c | 23 | ||||
| -rw-r--r-- | drivers/gpu/drm/sti/sti_mixer.c | 19 | ||||
| -rw-r--r-- | drivers/gpu/drm/sti/sti_mixer.h | 2 |
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) */ | ||
| 18 | enum sti_layer_desc sti_layer_default_zorder[] = { | 19 | enum 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 | |||
| 29 | static int | 28 | static int |
| 30 | sti_drm_update_plane(struct drm_plane *plane, struct drm_crtc *crtc, | 29 | sti_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 | ||
| 194 | static void sti_drm_plane_attach_zorder_property(struct drm_plane *plane, | 193 | static 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 | ||
| 216 | struct drm_plane *sti_drm_plane_init(struct drm_device *dev, | 213 | struct 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 | ||
| 104 | int sti_mixer_set_layer_depth(struct sti_mixer *mixer, struct sti_layer *layer) | 104 | int 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, | |||
| 49 | void sti_mixer_set_background_status(struct sti_mixer *mixer, bool enable); | 49 | void 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 |
