Skip to content

Commit

Permalink
drm/sti: fix dynamic z-ordering
Browse files Browse the repository at this point in the history
Apply the plane depth when the plane is updated.
If the depth is different from the previous plane update,
the register controlling the plane depth is cleaned and updated
with the new depth.

Signed-off-by: Vincent Abriou <vincent.abriou@st.com>
Reviewed-by: Benjamin Gaignard <benjamin.gaignard@linaro.org>
  • Loading branch information
Vincent Abriou authored and Benjamin Gaignard committed Aug 3, 2015
1 parent 53bdcf5 commit bf60b29
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 20 deletions.
23 changes: 9 additions & 14 deletions drivers/gpu/drm/sti/sti_drm_plane.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,17 +15,16 @@
#include "sti_drm_plane.h"
#include "sti_vtg.h"

/* (Background) < GDP0 < GDP1 < VID0 < VID1 < GDP2 < GDP3 < (ForeGround) */
enum sti_layer_desc sti_layer_default_zorder[] = {
STI_GDP_0,
STI_VID_0,
STI_GDP_1,
STI_VID_0,
STI_VID_1,
STI_GDP_2,
STI_GDP_3,
};

/* (Background) < GDP0 < VID0 < GDP1 < VID1 < GDP2 < GDP3 < (ForeGround) */

static int
sti_drm_update_plane(struct drm_plane *plane, struct drm_crtc *crtc,
struct drm_framebuffer *fb, int crtc_x, int crtc_y,
Expand Down Expand Up @@ -191,8 +190,7 @@ static const struct drm_plane_helper_funcs sti_drm_plane_helpers_funcs = {
.atomic_disable = sti_drm_plane_atomic_disable,
};

static void sti_drm_plane_attach_zorder_property(struct drm_plane *plane,
uint64_t default_val)
static void sti_drm_plane_attach_zorder_property(struct drm_plane *plane)
{
struct drm_device *dev = plane->dev;
struct sti_drm_private *private = dev->dev_private;
Expand All @@ -201,16 +199,15 @@ static void sti_drm_plane_attach_zorder_property(struct drm_plane *plane,

prop = private->plane_zorder_property;
if (!prop) {
prop = drm_property_create_range(dev, 0, "zpos", 0,
GAM_MIXER_NB_DEPTH_LEVEL - 1);
prop = drm_property_create_range(dev, 0, "zpos", 1,
GAM_MIXER_NB_DEPTH_LEVEL);
if (!prop)
return;

private->plane_zorder_property = prop;
}

drm_object_attach_property(&plane->base, prop, default_val);
layer->zorder = default_val;
drm_object_attach_property(&plane->base, prop, layer->zorder);
}

struct drm_plane *sti_drm_plane_init(struct drm_device *dev,
Expand All @@ -219,7 +216,6 @@ struct drm_plane *sti_drm_plane_init(struct drm_device *dev,
enum drm_plane_type type)
{
int err, i;
uint64_t default_zorder = 0;

err = drm_universal_plane_init(dev, &layer->plane, possible_crtcs,
&sti_drm_plane_funcs,
Expand All @@ -236,15 +232,14 @@ struct drm_plane *sti_drm_plane_init(struct drm_device *dev,
if (sti_layer_default_zorder[i] == layer->desc)
break;

default_zorder = i + 1;
layer->zorder = i + 1;

if (type == DRM_PLANE_TYPE_OVERLAY)
sti_drm_plane_attach_zorder_property(&layer->plane,
default_zorder);
sti_drm_plane_attach_zorder_property(&layer->plane);

DRM_DEBUG_DRIVER("drm plane:%d mapped to %s with zorder:%llu\n",
layer->plane.base.id,
sti_layer_to_str(layer), default_zorder);
sti_layer_to_str(layer), layer->zorder);

return &layer->plane;
}
Expand Down
19 changes: 14 additions & 5 deletions drivers/gpu/drm/sti/sti_mixer.c
Original file line number Diff line number Diff line change
Expand Up @@ -103,10 +103,11 @@ static void sti_mixer_set_background_area(struct sti_mixer *mixer,

int sti_mixer_set_layer_depth(struct sti_mixer *mixer, struct sti_layer *layer)
{
int layer_id = 0, depth = layer->zorder;
int layer_id, depth = layer->zorder;
unsigned int i;
u32 mask, val;

if (depth >= GAM_MIXER_NB_DEPTH_LEVEL)
if ((depth < 1) || (depth > GAM_MIXER_NB_DEPTH_LEVEL))
return 1;

switch (layer->desc) {
Expand Down Expand Up @@ -136,15 +137,23 @@ int sti_mixer_set_layer_depth(struct sti_mixer *mixer, struct sti_layer *layer)
DRM_ERROR("Unknown layer %d\n", layer->desc);
return 1;
}
mask = GAM_DEPTH_MASK_ID << (3 * depth);
layer_id = layer_id << (3 * depth);

/* Search if a previous depth was already assigned to the layer */
val = sti_mixer_reg_read(mixer, GAM_MIXER_CRB);
for (i = 0; i < GAM_MIXER_NB_DEPTH_LEVEL; i++) {
mask = GAM_DEPTH_MASK_ID << (3 * i);
if ((val & mask) == layer_id << (3 * i))
break;
}

mask |= GAM_DEPTH_MASK_ID << (3 * (depth - 1));
layer_id = layer_id << (3 * (depth - 1));

DRM_DEBUG_DRIVER("%s %s depth=%d\n", sti_mixer_to_str(mixer),
sti_layer_to_str(layer), depth);
dev_dbg(mixer->dev, "GAM_MIXER_CRB val 0x%x mask 0x%x\n",
layer_id, mask);

val = sti_mixer_reg_read(mixer, GAM_MIXER_CRB);
val &= ~mask;
val |= layer_id;
sti_mixer_reg_write(mixer, GAM_MIXER_CRB, val);
Expand Down
2 changes: 1 addition & 1 deletion drivers/gpu/drm/sti/sti_mixer.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ int sti_mixer_active_video_area(struct sti_mixer *mixer,
void sti_mixer_set_background_status(struct sti_mixer *mixer, bool enable);

/* depth in Cross-bar control = z order */
#define GAM_MIXER_NB_DEPTH_LEVEL 7
#define GAM_MIXER_NB_DEPTH_LEVEL 6

#define STI_MIXER_MAIN 0
#define STI_MIXER_AUX 1
Expand Down

0 comments on commit bf60b29

Please sign in to comment.