Skip to content

Commit 1ef7ed4

Browse files
Nancy.LinChun-Kuang Hu
Nancy.Lin
authored and
Chun-Kuang Hu
committed
drm/mediatek: Modify mediatek-drm for mt8195 multi mmsys support
MT8195 have two mmsys. Modify drm for MT8195 multi-mmsys support. The two mmsys (vdosys0 and vdosys1) will bring up two drm drivers, only one drm driver register as the drm device. Each drm driver binds its own component. The last bind drm driver allocates and registers the drm device to drm core. Each crtc path is created with the corresponding drm driver data. Signed-off-by: Nancy.Lin <nancy.lin@mediatek.com> Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> Tested-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> Tested-by: Bo-Chen Chen <rex-bc.chen@mediatek.com> Tested-by: Nícolas F. R. A. Prado <nfraprado@collabora.com> Link: https://patchwork.kernel.org/project/linux-mediatek/patch/20230321121859.2355-6-nancy.lin@mediatek.com/ Signed-off-by: Chun-Kuang Hu <chunkuang.hu@kernel.org>
1 parent cb1d6bc commit 1ef7ed4

File tree

4 files changed

+245
-88
lines changed

4 files changed

+245
-88
lines changed

Diff for: drivers/gpu/drm/mediatek/mtk_drm_crtc.c

+15-9
Original file line numberDiff line numberDiff line change
@@ -876,21 +876,28 @@ struct device *mtk_drm_crtc_dma_dev_get(struct drm_crtc *crtc)
876876
}
877877

878878
int mtk_drm_crtc_create(struct drm_device *drm_dev,
879-
const enum mtk_ddp_comp_id *path, unsigned int path_len)
879+
const enum mtk_ddp_comp_id *path, unsigned int path_len,
880+
int priv_data_index)
880881
{
881882
struct mtk_drm_private *priv = drm_dev->dev_private;
882883
struct device *dev = drm_dev->dev;
883884
struct mtk_drm_crtc *mtk_crtc;
884885
unsigned int num_comp_planes = 0;
885-
int pipe = priv->num_pipes;
886886
int ret;
887887
int i;
888888
bool has_ctm = false;
889889
uint gamma_lut_size = 0;
890+
struct drm_crtc *tmp;
891+
int crtc_i = 0;
890892

891893
if (!path)
892894
return 0;
893895

896+
priv = priv->all_drm_private[priv_data_index];
897+
898+
drm_for_each_crtc(tmp, drm_dev)
899+
crtc_i++;
900+
894901
for (i = 0; i < path_len; i++) {
895902
enum mtk_ddp_comp_id comp_id = path[i];
896903
struct device_node *node;
@@ -902,7 +909,7 @@ int mtk_drm_crtc_create(struct drm_device *drm_dev,
902909
if (!node) {
903910
dev_info(dev,
904911
"Not creating crtc %d because component %d is disabled or missing\n",
905-
pipe, comp_id);
912+
crtc_i, comp_id);
906913
return 0;
907914
}
908915

@@ -960,7 +967,7 @@ int mtk_drm_crtc_create(struct drm_device *drm_dev,
960967

961968
for (i = 0; i < mtk_crtc->ddp_comp_nr; i++) {
962969
ret = mtk_drm_crtc_init_comp_planes(drm_dev, mtk_crtc, i,
963-
pipe);
970+
crtc_i);
964971
if (ret)
965972
return ret;
966973
}
@@ -972,24 +979,23 @@ int mtk_drm_crtc_create(struct drm_device *drm_dev,
972979
*/
973980
mtk_crtc->dma_dev = mtk_ddp_comp_dma_dev_get(&priv->ddp_comp[path[0]]);
974981

975-
ret = mtk_drm_crtc_init(drm_dev, mtk_crtc, pipe);
982+
ret = mtk_drm_crtc_init(drm_dev, mtk_crtc, crtc_i);
976983
if (ret < 0)
977984
return ret;
978985

979986
if (gamma_lut_size)
980987
drm_mode_crtc_set_gamma_size(&mtk_crtc->base, gamma_lut_size);
981988
drm_crtc_enable_color_mgmt(&mtk_crtc->base, 0, has_ctm, gamma_lut_size);
982-
priv->num_pipes++;
983989
mutex_init(&mtk_crtc->hw_lock);
984990

985991
#if IS_REACHABLE(CONFIG_MTK_CMDQ)
992+
i = priv->mbox_index++;
986993
mtk_crtc->cmdq_client.client.dev = mtk_crtc->mmsys_dev;
987994
mtk_crtc->cmdq_client.client.tx_block = false;
988995
mtk_crtc->cmdq_client.client.knows_txdone = true;
989996
mtk_crtc->cmdq_client.client.rx_callback = ddp_cmdq_cb;
990997
mtk_crtc->cmdq_client.chan =
991-
mbox_request_channel(&mtk_crtc->cmdq_client.client,
992-
drm_crtc_index(&mtk_crtc->base));
998+
mbox_request_channel(&mtk_crtc->cmdq_client.client, i);
993999
if (IS_ERR(mtk_crtc->cmdq_client.chan)) {
9941000
dev_dbg(dev, "mtk_crtc %d failed to create mailbox client, writing register by CPU now\n",
9951001
drm_crtc_index(&mtk_crtc->base));
@@ -999,7 +1005,7 @@ int mtk_drm_crtc_create(struct drm_device *drm_dev,
9991005
if (mtk_crtc->cmdq_client.chan) {
10001006
ret = of_property_read_u32_index(priv->mutex_node,
10011007
"mediatek,gce-events",
1002-
drm_crtc_index(&mtk_crtc->base),
1008+
i,
10031009
&mtk_crtc->cmdq_event);
10041010
if (ret) {
10051011
dev_dbg(dev, "mtk_crtc %d failed to get mediatek,gce-events property\n",

Diff for: drivers/gpu/drm/mediatek/mtk_drm_crtc.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717
void mtk_drm_crtc_commit(struct drm_crtc *crtc);
1818
int mtk_drm_crtc_create(struct drm_device *drm_dev,
1919
const enum mtk_ddp_comp_id *path,
20-
unsigned int path_len);
20+
unsigned int path_len,
21+
int priv_data_index);
2122
int mtk_drm_crtc_plane_check(struct drm_crtc *crtc, struct drm_plane *plane,
2223
struct mtk_plane_state *state);
2324
void mtk_drm_crtc_async_update(struct drm_crtc *crtc, struct drm_plane *plane,

0 commit comments

Comments
 (0)