Commit 70b8ea1a authored by Dave Airlie's avatar Dave Airlie

Merge tag 'mediatek-drm-fixes-5.6' of...

Merge tag 'mediatek-drm-fixes-5.6' of https://github.com/ckhu-mediatek/linux.git-tags into drm-fixes

Mediatek DRM Fixes for Linux 5.6
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>

From: CK Hu <ck.hu@mediatek.com>
Link: https://patchwork.freedesktop.org/patch/msgid/1583373069.364.4.camel@mtksdaap41
parents 755d7a92 3d2ed431
...@@ -486,6 +486,7 @@ static void mtk_drm_crtc_hw_config(struct mtk_drm_crtc *mtk_crtc) ...@@ -486,6 +486,7 @@ static void mtk_drm_crtc_hw_config(struct mtk_drm_crtc *mtk_crtc)
} }
#if IS_REACHABLE(CONFIG_MTK_CMDQ) #if IS_REACHABLE(CONFIG_MTK_CMDQ)
if (mtk_crtc->cmdq_client) { if (mtk_crtc->cmdq_client) {
mbox_flush(mtk_crtc->cmdq_client->chan, 2000);
cmdq_handle = cmdq_pkt_create(mtk_crtc->cmdq_client, PAGE_SIZE); cmdq_handle = cmdq_pkt_create(mtk_crtc->cmdq_client, PAGE_SIZE);
cmdq_pkt_clear_event(cmdq_handle, mtk_crtc->cmdq_event); cmdq_pkt_clear_event(cmdq_handle, mtk_crtc->cmdq_event);
cmdq_pkt_wfe(cmdq_handle, mtk_crtc->cmdq_event); cmdq_pkt_wfe(cmdq_handle, mtk_crtc->cmdq_event);
...@@ -636,10 +637,18 @@ static const struct drm_crtc_helper_funcs mtk_crtc_helper_funcs = { ...@@ -636,10 +637,18 @@ static const struct drm_crtc_helper_funcs mtk_crtc_helper_funcs = {
static int mtk_drm_crtc_init(struct drm_device *drm, static int mtk_drm_crtc_init(struct drm_device *drm,
struct mtk_drm_crtc *mtk_crtc, struct mtk_drm_crtc *mtk_crtc,
struct drm_plane *primary, unsigned int pipe)
struct drm_plane *cursor, unsigned int pipe)
{ {
int ret; struct drm_plane *primary = NULL;
struct drm_plane *cursor = NULL;
int i, ret;
for (i = 0; i < mtk_crtc->layer_nr; i++) {
if (mtk_crtc->planes[i].type == DRM_PLANE_TYPE_PRIMARY)
primary = &mtk_crtc->planes[i];
else if (mtk_crtc->planes[i].type == DRM_PLANE_TYPE_CURSOR)
cursor = &mtk_crtc->planes[i];
}
ret = drm_crtc_init_with_planes(drm, &mtk_crtc->base, primary, cursor, ret = drm_crtc_init_with_planes(drm, &mtk_crtc->base, primary, cursor,
&mtk_crtc_funcs, NULL); &mtk_crtc_funcs, NULL);
...@@ -689,11 +698,12 @@ static int mtk_drm_crtc_num_comp_planes(struct mtk_drm_crtc *mtk_crtc, ...@@ -689,11 +698,12 @@ static int mtk_drm_crtc_num_comp_planes(struct mtk_drm_crtc *mtk_crtc,
} }
static inline static inline
enum drm_plane_type mtk_drm_crtc_plane_type(unsigned int plane_idx) enum drm_plane_type mtk_drm_crtc_plane_type(unsigned int plane_idx,
unsigned int num_planes)
{ {
if (plane_idx == 0) if (plane_idx == 0)
return DRM_PLANE_TYPE_PRIMARY; return DRM_PLANE_TYPE_PRIMARY;
else if (plane_idx == 1) else if (plane_idx == (num_planes - 1))
return DRM_PLANE_TYPE_CURSOR; return DRM_PLANE_TYPE_CURSOR;
else else
return DRM_PLANE_TYPE_OVERLAY; return DRM_PLANE_TYPE_OVERLAY;
...@@ -712,7 +722,8 @@ static int mtk_drm_crtc_init_comp_planes(struct drm_device *drm_dev, ...@@ -712,7 +722,8 @@ static int mtk_drm_crtc_init_comp_planes(struct drm_device *drm_dev,
ret = mtk_plane_init(drm_dev, ret = mtk_plane_init(drm_dev,
&mtk_crtc->planes[mtk_crtc->layer_nr], &mtk_crtc->planes[mtk_crtc->layer_nr],
BIT(pipe), BIT(pipe),
mtk_drm_crtc_plane_type(mtk_crtc->layer_nr), mtk_drm_crtc_plane_type(mtk_crtc->layer_nr,
num_planes),
mtk_ddp_comp_supported_rotations(comp)); mtk_ddp_comp_supported_rotations(comp));
if (ret) if (ret)
return ret; return ret;
...@@ -807,9 +818,7 @@ int mtk_drm_crtc_create(struct drm_device *drm_dev, ...@@ -807,9 +818,7 @@ int mtk_drm_crtc_create(struct drm_device *drm_dev,
return ret; return ret;
} }
ret = mtk_drm_crtc_init(drm_dev, mtk_crtc, &mtk_crtc->planes[0], ret = mtk_drm_crtc_init(drm_dev, mtk_crtc, pipe);
mtk_crtc->layer_nr > 1 ? &mtk_crtc->planes[1] :
NULL, pipe);
if (ret < 0) if (ret < 0)
return ret; return ret;
...@@ -828,7 +837,8 @@ int mtk_drm_crtc_create(struct drm_device *drm_dev, ...@@ -828,7 +837,8 @@ int mtk_drm_crtc_create(struct drm_device *drm_dev,
drm_crtc_index(&mtk_crtc->base)); drm_crtc_index(&mtk_crtc->base));
mtk_crtc->cmdq_client = NULL; mtk_crtc->cmdq_client = NULL;
} }
ret = of_property_read_u32_index(dev->of_node, "mediatek,gce-events", ret = of_property_read_u32_index(priv->mutex_node,
"mediatek,gce-events",
drm_crtc_index(&mtk_crtc->base), drm_crtc_index(&mtk_crtc->base),
&mtk_crtc->cmdq_event); &mtk_crtc->cmdq_event);
if (ret) if (ret)
......
...@@ -471,6 +471,7 @@ int mtk_ddp_comp_init(struct device *dev, struct device_node *node, ...@@ -471,6 +471,7 @@ int mtk_ddp_comp_init(struct device *dev, struct device_node *node,
/* Only DMA capable components need the LARB property */ /* Only DMA capable components need the LARB property */
comp->larb_dev = NULL; comp->larb_dev = NULL;
if (type != MTK_DISP_OVL && if (type != MTK_DISP_OVL &&
type != MTK_DISP_OVL_2L &&
type != MTK_DISP_RDMA && type != MTK_DISP_RDMA &&
type != MTK_DISP_WDMA) type != MTK_DISP_WDMA)
return 0; return 0;
......
...@@ -80,6 +80,7 @@ static int mtk_plane_atomic_async_check(struct drm_plane *plane, ...@@ -80,6 +80,7 @@ static int mtk_plane_atomic_async_check(struct drm_plane *plane,
struct drm_plane_state *state) struct drm_plane_state *state)
{ {
struct drm_crtc_state *crtc_state; struct drm_crtc_state *crtc_state;
int ret;
if (plane != state->crtc->cursor) if (plane != state->crtc->cursor)
return -EINVAL; return -EINVAL;
...@@ -90,6 +91,11 @@ static int mtk_plane_atomic_async_check(struct drm_plane *plane, ...@@ -90,6 +91,11 @@ static int mtk_plane_atomic_async_check(struct drm_plane *plane,
if (!plane->state->fb) if (!plane->state->fb)
return -EINVAL; return -EINVAL;
ret = mtk_drm_crtc_plane_check(state->crtc, plane,
to_mtk_plane_state(state));
if (ret)
return ret;
if (state->state) if (state->state)
crtc_state = drm_atomic_get_existing_crtc_state(state->state, crtc_state = drm_atomic_get_existing_crtc_state(state->state,
state->crtc); state->crtc);
...@@ -115,6 +121,7 @@ static void mtk_plane_atomic_async_update(struct drm_plane *plane, ...@@ -115,6 +121,7 @@ static void mtk_plane_atomic_async_update(struct drm_plane *plane,
plane->state->src_y = new_state->src_y; plane->state->src_y = new_state->src_y;
plane->state->src_h = new_state->src_h; plane->state->src_h = new_state->src_h;
plane->state->src_w = new_state->src_w; plane->state->src_w = new_state->src_w;
swap(plane->state->fb, new_state->fb);
state->pending.async_dirty = true; state->pending.async_dirty = true;
mtk_drm_crtc_async_update(new_state->crtc, plane, new_state); mtk_drm_crtc_async_update(new_state->crtc, plane, new_state);
......
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