Skip to content

Commit 70b8ea1

Browse files
committed
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: Dave Airlie <[email protected]> From: CK Hu <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/1583373069.364.4.camel@mtksdaap41
2 parents 755d7a9 + 3d2ed43 commit 70b8ea1

File tree

3 files changed

+28
-10
lines changed

3 files changed

+28
-10
lines changed

drivers/gpu/drm/mediatek/mtk_drm_crtc.c

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,7 @@ static void mtk_drm_crtc_hw_config(struct mtk_drm_crtc *mtk_crtc)
486486
}
487487
#if IS_REACHABLE(CONFIG_MTK_CMDQ)
488488
if (mtk_crtc->cmdq_client) {
489+
mbox_flush(mtk_crtc->cmdq_client->chan, 2000);
489490
cmdq_handle = cmdq_pkt_create(mtk_crtc->cmdq_client, PAGE_SIZE);
490491
cmdq_pkt_clear_event(cmdq_handle, mtk_crtc->cmdq_event);
491492
cmdq_pkt_wfe(cmdq_handle, mtk_crtc->cmdq_event);
@@ -636,10 +637,18 @@ static const struct drm_crtc_helper_funcs mtk_crtc_helper_funcs = {
636637

637638
static int mtk_drm_crtc_init(struct drm_device *drm,
638639
struct mtk_drm_crtc *mtk_crtc,
639-
struct drm_plane *primary,
640-
struct drm_plane *cursor, unsigned int pipe)
640+
unsigned int pipe)
641641
{
642-
int ret;
642+
struct drm_plane *primary = NULL;
643+
struct drm_plane *cursor = NULL;
644+
int i, ret;
645+
646+
for (i = 0; i < mtk_crtc->layer_nr; i++) {
647+
if (mtk_crtc->planes[i].type == DRM_PLANE_TYPE_PRIMARY)
648+
primary = &mtk_crtc->planes[i];
649+
else if (mtk_crtc->planes[i].type == DRM_PLANE_TYPE_CURSOR)
650+
cursor = &mtk_crtc->planes[i];
651+
}
643652

644653
ret = drm_crtc_init_with_planes(drm, &mtk_crtc->base, primary, cursor,
645654
&mtk_crtc_funcs, NULL);
@@ -689,11 +698,12 @@ static int mtk_drm_crtc_num_comp_planes(struct mtk_drm_crtc *mtk_crtc,
689698
}
690699

691700
static inline
692-
enum drm_plane_type mtk_drm_crtc_plane_type(unsigned int plane_idx)
701+
enum drm_plane_type mtk_drm_crtc_plane_type(unsigned int plane_idx,
702+
unsigned int num_planes)
693703
{
694704
if (plane_idx == 0)
695705
return DRM_PLANE_TYPE_PRIMARY;
696-
else if (plane_idx == 1)
706+
else if (plane_idx == (num_planes - 1))
697707
return DRM_PLANE_TYPE_CURSOR;
698708
else
699709
return DRM_PLANE_TYPE_OVERLAY;
@@ -712,7 +722,8 @@ static int mtk_drm_crtc_init_comp_planes(struct drm_device *drm_dev,
712722
ret = mtk_plane_init(drm_dev,
713723
&mtk_crtc->planes[mtk_crtc->layer_nr],
714724
BIT(pipe),
715-
mtk_drm_crtc_plane_type(mtk_crtc->layer_nr),
725+
mtk_drm_crtc_plane_type(mtk_crtc->layer_nr,
726+
num_planes),
716727
mtk_ddp_comp_supported_rotations(comp));
717728
if (ret)
718729
return ret;
@@ -807,9 +818,7 @@ int mtk_drm_crtc_create(struct drm_device *drm_dev,
807818
return ret;
808819
}
809820

810-
ret = mtk_drm_crtc_init(drm_dev, mtk_crtc, &mtk_crtc->planes[0],
811-
mtk_crtc->layer_nr > 1 ? &mtk_crtc->planes[1] :
812-
NULL, pipe);
821+
ret = mtk_drm_crtc_init(drm_dev, mtk_crtc, pipe);
813822
if (ret < 0)
814823
return ret;
815824

@@ -828,7 +837,8 @@ int mtk_drm_crtc_create(struct drm_device *drm_dev,
828837
drm_crtc_index(&mtk_crtc->base));
829838
mtk_crtc->cmdq_client = NULL;
830839
}
831-
ret = of_property_read_u32_index(dev->of_node, "mediatek,gce-events",
840+
ret = of_property_read_u32_index(priv->mutex_node,
841+
"mediatek,gce-events",
832842
drm_crtc_index(&mtk_crtc->base),
833843
&mtk_crtc->cmdq_event);
834844
if (ret)

drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -471,6 +471,7 @@ int mtk_ddp_comp_init(struct device *dev, struct device_node *node,
471471
/* Only DMA capable components need the LARB property */
472472
comp->larb_dev = NULL;
473473
if (type != MTK_DISP_OVL &&
474+
type != MTK_DISP_OVL_2L &&
474475
type != MTK_DISP_RDMA &&
475476
type != MTK_DISP_WDMA)
476477
return 0;

drivers/gpu/drm/mediatek/mtk_drm_plane.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ static int mtk_plane_atomic_async_check(struct drm_plane *plane,
8080
struct drm_plane_state *state)
8181
{
8282
struct drm_crtc_state *crtc_state;
83+
int ret;
8384

8485
if (plane != state->crtc->cursor)
8586
return -EINVAL;
@@ -90,6 +91,11 @@ static int mtk_plane_atomic_async_check(struct drm_plane *plane,
9091
if (!plane->state->fb)
9192
return -EINVAL;
9293

94+
ret = mtk_drm_crtc_plane_check(state->crtc, plane,
95+
to_mtk_plane_state(state));
96+
if (ret)
97+
return ret;
98+
9399
if (state->state)
94100
crtc_state = drm_atomic_get_existing_crtc_state(state->state,
95101
state->crtc);
@@ -115,6 +121,7 @@ static void mtk_plane_atomic_async_update(struct drm_plane *plane,
115121
plane->state->src_y = new_state->src_y;
116122
plane->state->src_h = new_state->src_h;
117123
plane->state->src_w = new_state->src_w;
124+
swap(plane->state->fb, new_state->fb);
118125
state->pending.async_dirty = true;
119126

120127
mtk_drm_crtc_async_update(new_state->crtc, plane, new_state);

0 commit comments

Comments
 (0)