Commit 6e2a3b66 authored by Gustavo Padovan's avatar Gustavo Padovan Committed by Inki Dae

drm/exynos: preset zpos value for overlay planes

Usually userspace don't want to have two overlay planes on the same zpos
so this change assign a different zpos for each plane. Before this change
a zpos of value zero was created for all planes so the userspace had to
set up the zpos of every plane it wanted to use.

Also all places that were storing zpos positions are now unsigned int.
Signed-off-by: default avatarGustavo Padovan <gustavo.padovan@collabora.co.uk>
Signed-off-by: default avatarInki Dae <inki.dae@samsung.com>
parent 7ee14cdc
...@@ -378,7 +378,7 @@ static void decon_win_set_colkey(struct decon_context *ctx, unsigned int win) ...@@ -378,7 +378,7 @@ static void decon_win_set_colkey(struct decon_context *ctx, unsigned int win)
* @protect: 1 to protect (disable updates) * @protect: 1 to protect (disable updates)
*/ */
static void decon_shadow_protect_win(struct decon_context *ctx, static void decon_shadow_protect_win(struct decon_context *ctx,
int win, bool protect) unsigned int win, bool protect)
{ {
u32 bits, val; u32 bits, val;
...@@ -392,12 +392,12 @@ static void decon_shadow_protect_win(struct decon_context *ctx, ...@@ -392,12 +392,12 @@ static void decon_shadow_protect_win(struct decon_context *ctx,
writel(val, ctx->regs + SHADOWCON); writel(val, ctx->regs + SHADOWCON);
} }
static void decon_win_commit(struct exynos_drm_crtc *crtc, int zpos) static void decon_win_commit(struct exynos_drm_crtc *crtc, unsigned int win)
{ {
struct decon_context *ctx = crtc->ctx; struct decon_context *ctx = crtc->ctx;
struct drm_display_mode *mode = &crtc->base.mode; struct drm_display_mode *mode = &crtc->base.mode;
struct exynos_drm_plane *plane; struct exynos_drm_plane *plane;
int padding, win = zpos; int padding;
unsigned long val, alpha; unsigned long val, alpha;
unsigned int last_x; unsigned int last_x;
unsigned int last_y; unsigned int last_y;
...@@ -405,9 +405,6 @@ static void decon_win_commit(struct exynos_drm_crtc *crtc, int zpos) ...@@ -405,9 +405,6 @@ static void decon_win_commit(struct exynos_drm_crtc *crtc, int zpos)
if (ctx->suspended) if (ctx->suspended)
return; return;
if (win == DEFAULT_ZPOS)
win = ctx->default_win;
if (win < 0 || win >= WINDOWS_NR) if (win < 0 || win >= WINDOWS_NR)
return; return;
...@@ -513,16 +510,12 @@ static void decon_win_commit(struct exynos_drm_crtc *crtc, int zpos) ...@@ -513,16 +510,12 @@ static void decon_win_commit(struct exynos_drm_crtc *crtc, int zpos)
plane->enabled = true; plane->enabled = true;
} }
static void decon_win_disable(struct exynos_drm_crtc *crtc, int zpos) static void decon_win_disable(struct exynos_drm_crtc *crtc, unsigned int win)
{ {
struct decon_context *ctx = crtc->ctx; struct decon_context *ctx = crtc->ctx;
struct exynos_drm_plane *plane; struct exynos_drm_plane *plane;
int win = zpos;
u32 val; u32 val;
if (win == DEFAULT_ZPOS)
win = ctx->default_win;
if (win < 0 || win >= WINDOWS_NR) if (win < 0 || win >= WINDOWS_NR)
return; return;
...@@ -764,7 +757,8 @@ static int decon_bind(struct device *dev, struct device *master, void *data) ...@@ -764,7 +757,8 @@ static int decon_bind(struct device *dev, struct device *master, void *data)
struct drm_device *drm_dev = data; struct drm_device *drm_dev = data;
struct exynos_drm_plane *exynos_plane; struct exynos_drm_plane *exynos_plane;
enum drm_plane_type type; enum drm_plane_type type;
int zpos, ret; unsigned int zpos;
int ret;
ret = decon_ctx_initialize(ctx, drm_dev); ret = decon_ctx_initialize(ctx, drm_dev);
if (ret) { if (ret) {
...@@ -776,7 +770,7 @@ static int decon_bind(struct device *dev, struct device *master, void *data) ...@@ -776,7 +770,7 @@ static int decon_bind(struct device *dev, struct device *master, void *data)
type = (zpos == ctx->default_win) ? DRM_PLANE_TYPE_PRIMARY : type = (zpos == ctx->default_win) ? DRM_PLANE_TYPE_PRIMARY :
DRM_PLANE_TYPE_OVERLAY; DRM_PLANE_TYPE_OVERLAY;
ret = exynos_plane_init(drm_dev, &ctx->planes[zpos], ret = exynos_plane_init(drm_dev, &ctx->planes[zpos],
1 << ctx->pipe, type); 1 << ctx->pipe, type, zpos);
if (ret) if (ret)
return ret; return ret;
} }
......
...@@ -21,7 +21,6 @@ ...@@ -21,7 +21,6 @@
#define MAX_CRTC 3 #define MAX_CRTC 3
#define MAX_PLANE 5 #define MAX_PLANE 5
#define MAX_FB_BUFFER 4 #define MAX_FB_BUFFER 4
#define DEFAULT_ZPOS -1
#define to_exynos_crtc(x) container_of(x, struct exynos_drm_crtc, base) #define to_exynos_crtc(x) container_of(x, struct exynos_drm_crtc, base)
#define to_exynos_plane(x) container_of(x, struct exynos_drm_plane, base) #define to_exynos_plane(x) container_of(x, struct exynos_drm_plane, base)
...@@ -104,7 +103,7 @@ struct exynos_drm_plane { ...@@ -104,7 +103,7 @@ struct exynos_drm_plane {
unsigned int pitch; unsigned int pitch;
uint32_t pixel_format; uint32_t pixel_format;
dma_addr_t dma_addr[MAX_FB_BUFFER]; dma_addr_t dma_addr[MAX_FB_BUFFER];
int zpos; unsigned int zpos;
unsigned int index_color; unsigned int index_color;
bool default_win:1; bool default_win:1;
...@@ -189,8 +188,8 @@ struct exynos_drm_crtc_ops { ...@@ -189,8 +188,8 @@ struct exynos_drm_crtc_ops {
int (*enable_vblank)(struct exynos_drm_crtc *crtc); int (*enable_vblank)(struct exynos_drm_crtc *crtc);
void (*disable_vblank)(struct exynos_drm_crtc *crtc); void (*disable_vblank)(struct exynos_drm_crtc *crtc);
void (*wait_for_vblank)(struct exynos_drm_crtc *crtc); void (*wait_for_vblank)(struct exynos_drm_crtc *crtc);
void (*win_commit)(struct exynos_drm_crtc *crtc, int zpos); void (*win_commit)(struct exynos_drm_crtc *crtc, unsigned int zpos);
void (*win_disable)(struct exynos_drm_crtc *crtc, int zpos); void (*win_disable)(struct exynos_drm_crtc *crtc, unsigned int zpos);
void (*te_handler)(struct exynos_drm_crtc *crtc); void (*te_handler)(struct exynos_drm_crtc *crtc);
}; };
......
...@@ -597,7 +597,7 @@ static void fimd_win_set_colkey(struct fimd_context *ctx, unsigned int win) ...@@ -597,7 +597,7 @@ static void fimd_win_set_colkey(struct fimd_context *ctx, unsigned int win)
* @protect: 1 to protect (disable updates) * @protect: 1 to protect (disable updates)
*/ */
static void fimd_shadow_protect_win(struct fimd_context *ctx, static void fimd_shadow_protect_win(struct fimd_context *ctx,
int win, bool protect) unsigned int win, bool protect)
{ {
u32 reg, bits, val; u32 reg, bits, val;
...@@ -617,11 +617,10 @@ static void fimd_shadow_protect_win(struct fimd_context *ctx, ...@@ -617,11 +617,10 @@ static void fimd_shadow_protect_win(struct fimd_context *ctx,
writel(val, ctx->regs + reg); writel(val, ctx->regs + reg);
} }
static void fimd_win_commit(struct exynos_drm_crtc *crtc, int zpos) static void fimd_win_commit(struct exynos_drm_crtc *crtc, unsigned int win)
{ {
struct fimd_context *ctx = crtc->ctx; struct fimd_context *ctx = crtc->ctx;
struct exynos_drm_plane *plane; struct exynos_drm_plane *plane;
int win = zpos;
dma_addr_t dma_addr; dma_addr_t dma_addr;
unsigned long val, size, offset; unsigned long val, size, offset;
unsigned int last_x, last_y, buf_offsize, line_size; unsigned int last_x, last_y, buf_offsize, line_size;
...@@ -629,9 +628,6 @@ static void fimd_win_commit(struct exynos_drm_crtc *crtc, int zpos) ...@@ -629,9 +628,6 @@ static void fimd_win_commit(struct exynos_drm_crtc *crtc, int zpos)
if (ctx->suspended) if (ctx->suspended)
return; return;
if (win == DEFAULT_ZPOS)
win = ctx->default_win;
if (win < 0 || win >= WINDOWS_NR) if (win < 0 || win >= WINDOWS_NR)
return; return;
...@@ -737,14 +733,10 @@ static void fimd_win_commit(struct exynos_drm_crtc *crtc, int zpos) ...@@ -737,14 +733,10 @@ static void fimd_win_commit(struct exynos_drm_crtc *crtc, int zpos)
atomic_set(&ctx->win_updated, 1); atomic_set(&ctx->win_updated, 1);
} }
static void fimd_win_disable(struct exynos_drm_crtc *crtc, int zpos) static void fimd_win_disable(struct exynos_drm_crtc *crtc, unsigned int win)
{ {
struct fimd_context *ctx = crtc->ctx; struct fimd_context *ctx = crtc->ctx;
struct exynos_drm_plane *plane; struct exynos_drm_plane *plane;
int win = zpos;
if (win == DEFAULT_ZPOS)
win = ctx->default_win;
if (win < 0 || win >= WINDOWS_NR) if (win < 0 || win >= WINDOWS_NR)
return; return;
...@@ -1007,7 +999,8 @@ static int fimd_bind(struct device *dev, struct device *master, void *data) ...@@ -1007,7 +999,8 @@ static int fimd_bind(struct device *dev, struct device *master, void *data)
struct exynos_drm_private *priv = drm_dev->dev_private; struct exynos_drm_private *priv = drm_dev->dev_private;
struct exynos_drm_plane *exynos_plane; struct exynos_drm_plane *exynos_plane;
enum drm_plane_type type; enum drm_plane_type type;
int zpos, ret; unsigned int zpos;
int ret;
ctx->drm_dev = drm_dev; ctx->drm_dev = drm_dev;
ctx->pipe = priv->pipe++; ctx->pipe = priv->pipe++;
...@@ -1016,7 +1009,7 @@ static int fimd_bind(struct device *dev, struct device *master, void *data) ...@@ -1016,7 +1009,7 @@ static int fimd_bind(struct device *dev, struct device *master, void *data)
type = (zpos == ctx->default_win) ? DRM_PLANE_TYPE_PRIMARY : type = (zpos == ctx->default_win) ? DRM_PLANE_TYPE_PRIMARY :
DRM_PLANE_TYPE_OVERLAY; DRM_PLANE_TYPE_OVERLAY;
ret = exynos_plane_init(drm_dev, &ctx->planes[zpos], ret = exynos_plane_init(drm_dev, &ctx->planes[zpos],
1 << ctx->pipe, type); 1 << ctx->pipe, type, zpos);
if (ret) if (ret)
return ret; return ret;
} }
......
...@@ -207,7 +207,8 @@ static struct drm_plane_funcs exynos_plane_funcs = { ...@@ -207,7 +207,8 @@ static struct drm_plane_funcs exynos_plane_funcs = {
.set_property = exynos_plane_set_property, .set_property = exynos_plane_set_property,
}; };
static void exynos_plane_attach_zpos_property(struct drm_plane *plane) static void exynos_plane_attach_zpos_property(struct drm_plane *plane,
unsigned int zpos)
{ {
struct drm_device *dev = plane->dev; struct drm_device *dev = plane->dev;
struct exynos_drm_private *dev_priv = dev->dev_private; struct exynos_drm_private *dev_priv = dev->dev_private;
...@@ -223,12 +224,13 @@ static void exynos_plane_attach_zpos_property(struct drm_plane *plane) ...@@ -223,12 +224,13 @@ static void exynos_plane_attach_zpos_property(struct drm_plane *plane)
dev_priv->plane_zpos_property = prop; dev_priv->plane_zpos_property = prop;
} }
drm_object_attach_property(&plane->base, prop, 0); drm_object_attach_property(&plane->base, prop, zpos);
} }
int exynos_plane_init(struct drm_device *dev, int exynos_plane_init(struct drm_device *dev,
struct exynos_drm_plane *exynos_plane, struct exynos_drm_plane *exynos_plane,
unsigned long possible_crtcs, enum drm_plane_type type) unsigned long possible_crtcs, enum drm_plane_type type,
unsigned int zpos)
{ {
int err; int err;
...@@ -240,10 +242,10 @@ int exynos_plane_init(struct drm_device *dev, ...@@ -240,10 +242,10 @@ int exynos_plane_init(struct drm_device *dev,
return err; return err;
} }
if (type == DRM_PLANE_TYPE_PRIMARY) exynos_plane->zpos = zpos;
exynos_plane->zpos = DEFAULT_ZPOS;
else if (type == DRM_PLANE_TYPE_OVERLAY)
exynos_plane_attach_zpos_property(&exynos_plane->base); exynos_plane_attach_zpos_property(&exynos_plane->base, zpos);
return 0; return 0;
} }
...@@ -22,4 +22,5 @@ int exynos_update_plane(struct drm_plane *plane, struct drm_crtc *crtc, ...@@ -22,4 +22,5 @@ int exynos_update_plane(struct drm_plane *plane, struct drm_crtc *crtc,
uint32_t src_w, uint32_t src_h); uint32_t src_w, uint32_t src_h);
int exynos_plane_init(struct drm_device *dev, int exynos_plane_init(struct drm_device *dev,
struct exynos_drm_plane *exynos_plane, struct exynos_drm_plane *exynos_plane,
unsigned long possible_crtcs, enum drm_plane_type type); unsigned long possible_crtcs, enum drm_plane_type type,
unsigned int zpos);
...@@ -117,18 +117,14 @@ static void vidi_disable_vblank(struct exynos_drm_crtc *crtc) ...@@ -117,18 +117,14 @@ static void vidi_disable_vblank(struct exynos_drm_crtc *crtc)
ctx->vblank_on = false; ctx->vblank_on = false;
} }
static void vidi_win_commit(struct exynos_drm_crtc *crtc, int zpos) static void vidi_win_commit(struct exynos_drm_crtc *crtc, unsigned int win)
{ {
struct vidi_context *ctx = crtc->ctx; struct vidi_context *ctx = crtc->ctx;
struct exynos_drm_plane *plane; struct exynos_drm_plane *plane;
int win = zpos;
if (ctx->suspended) if (ctx->suspended)
return; return;
if (win == DEFAULT_ZPOS)
win = ctx->default_win;
if (win < 0 || win >= WINDOWS_NR) if (win < 0 || win >= WINDOWS_NR)
return; return;
...@@ -142,14 +138,10 @@ static void vidi_win_commit(struct exynos_drm_crtc *crtc, int zpos) ...@@ -142,14 +138,10 @@ static void vidi_win_commit(struct exynos_drm_crtc *crtc, int zpos)
schedule_work(&ctx->work); schedule_work(&ctx->work);
} }
static void vidi_win_disable(struct exynos_drm_crtc *crtc, int zpos) static void vidi_win_disable(struct exynos_drm_crtc *crtc, unsigned int win)
{ {
struct vidi_context *ctx = crtc->ctx; struct vidi_context *ctx = crtc->ctx;
struct exynos_drm_plane *plane; struct exynos_drm_plane *plane;
int win = zpos;
if (win == DEFAULT_ZPOS)
win = ctx->default_win;
if (win < 0 || win >= WINDOWS_NR) if (win < 0 || win >= WINDOWS_NR)
return; return;
...@@ -472,7 +464,8 @@ static int vidi_bind(struct device *dev, struct device *master, void *data) ...@@ -472,7 +464,8 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
struct drm_device *drm_dev = data; struct drm_device *drm_dev = data;
struct exynos_drm_plane *exynos_plane; struct exynos_drm_plane *exynos_plane;
enum drm_plane_type type; enum drm_plane_type type;
int zpos, ret; unsigned int zpos;
int ret;
vidi_ctx_initialize(ctx, drm_dev); vidi_ctx_initialize(ctx, drm_dev);
...@@ -480,7 +473,7 @@ static int vidi_bind(struct device *dev, struct device *master, void *data) ...@@ -480,7 +473,7 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
type = (zpos == ctx->default_win) ? DRM_PLANE_TYPE_PRIMARY : type = (zpos == ctx->default_win) ? DRM_PLANE_TYPE_PRIMARY :
DRM_PLANE_TYPE_OVERLAY; DRM_PLANE_TYPE_OVERLAY;
ret = exynos_plane_init(drm_dev, &ctx->planes[zpos], ret = exynos_plane_init(drm_dev, &ctx->planes[zpos],
1 << ctx->pipe, type); 1 << ctx->pipe, type, zpos);
if (ret) if (ret)
return ret; return ret;
} }
......
...@@ -898,10 +898,9 @@ static void mixer_disable_vblank(struct exynos_drm_crtc *crtc) ...@@ -898,10 +898,9 @@ static void mixer_disable_vblank(struct exynos_drm_crtc *crtc)
mixer_reg_writemask(res, MXR_INT_EN, 0, MXR_INT_EN_VSYNC); mixer_reg_writemask(res, MXR_INT_EN, 0, MXR_INT_EN_VSYNC);
} }
static void mixer_win_commit(struct exynos_drm_crtc *crtc, int zpos) static void mixer_win_commit(struct exynos_drm_crtc *crtc, unsigned int win)
{ {
struct mixer_context *mixer_ctx = crtc->ctx; struct mixer_context *mixer_ctx = crtc->ctx;
int win = zpos == DEFAULT_ZPOS ? MIXER_DEFAULT_WIN : zpos;
DRM_DEBUG_KMS("win: %d\n", win); DRM_DEBUG_KMS("win: %d\n", win);
...@@ -920,11 +919,10 @@ static void mixer_win_commit(struct exynos_drm_crtc *crtc, int zpos) ...@@ -920,11 +919,10 @@ static void mixer_win_commit(struct exynos_drm_crtc *crtc, int zpos)
mixer_ctx->planes[win].enabled = true; mixer_ctx->planes[win].enabled = true;
} }
static void mixer_win_disable(struct exynos_drm_crtc *crtc, int zpos) static void mixer_win_disable(struct exynos_drm_crtc *crtc, unsigned int win)
{ {
struct mixer_context *mixer_ctx = crtc->ctx; struct mixer_context *mixer_ctx = crtc->ctx;
struct mixer_resources *res = &mixer_ctx->mixer_res; struct mixer_resources *res = &mixer_ctx->mixer_res;
int win = zpos == DEFAULT_ZPOS ? MIXER_DEFAULT_WIN : zpos;
unsigned long flags; unsigned long flags;
DRM_DEBUG_KMS("win: %d\n", win); DRM_DEBUG_KMS("win: %d\n", win);
...@@ -1179,7 +1177,8 @@ static int mixer_bind(struct device *dev, struct device *manager, void *data) ...@@ -1179,7 +1177,8 @@ static int mixer_bind(struct device *dev, struct device *manager, void *data)
struct drm_device *drm_dev = data; struct drm_device *drm_dev = data;
struct exynos_drm_plane *exynos_plane; struct exynos_drm_plane *exynos_plane;
enum drm_plane_type type; enum drm_plane_type type;
int zpos, ret; unsigned int zpos;
int ret;
ret = mixer_initialize(ctx, drm_dev); ret = mixer_initialize(ctx, drm_dev);
if (ret) if (ret)
...@@ -1189,7 +1188,7 @@ static int mixer_bind(struct device *dev, struct device *manager, void *data) ...@@ -1189,7 +1188,7 @@ static int mixer_bind(struct device *dev, struct device *manager, void *data)
type = (zpos == MIXER_DEFAULT_WIN) ? DRM_PLANE_TYPE_PRIMARY : type = (zpos == MIXER_DEFAULT_WIN) ? DRM_PLANE_TYPE_PRIMARY :
DRM_PLANE_TYPE_OVERLAY; DRM_PLANE_TYPE_OVERLAY;
ret = exynos_plane_init(drm_dev, &ctx->planes[zpos], ret = exynos_plane_init(drm_dev, &ctx->planes[zpos],
1 << ctx->pipe, type); 1 << ctx->pipe, type, zpos);
if (ret) if (ret)
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