* [PATCH v7 0/4] Add dynamic connector selection mechanism
@ 2023-07-27 16:41 Jason-JH.Lin
2023-07-27 16:41 ` [PATCH v7 1/4] drm/mediatek: Add mmsys_dev_num to mt8188 vdosys0 driver data Jason-JH.Lin
` (3 more replies)
0 siblings, 4 replies; 22+ messages in thread
From: Jason-JH.Lin @ 2023-07-27 16:41 UTC (permalink / raw)
To: Chun-Kuang Hu, AngeloGioacchino Del Regno
Cc: Matthias Brugger, Jason-ch Chen, Johnson Wang, Jason-JH . Lin,
Singo Chang, Nancy Lin, Shawn Sung, dri-devel, linux-mediatek,
linux-arm-kernel, linux-kernel,
Project_Global_Chrome_Upstream_Group
To support DSI and eDP as main display connector without modifying
mtk-drm driver, we add the dynamic connector selection mechanism.
Change in v7:
1. separate 2 fixes patch from v6.
2. remove unnecessary null checking and variable.
3. move ddp_comp checking to crtc create.
Change in v6:
1. remove max_ddp_comp_nr.
Change in v5:
1. Change conn_routes array to single component enum id.
Change in v4:
1. Change variable naming from conn_route_num to num_conn_routes.
2. Change he encoder_index function return valuew from int to unsigned int.
Change in v3:
1. Change max_num comparison statement to max().
Change in v2:
1. rebase on linux-next: next-20230426
2. Fix alphabetical order and max_num condition check problem.
Change in v1:
1. based on mediatek-drm maintainer's tree / mediatek-drm-next branch:
https://git.kernel.org/pub/scm/linux/kernel/git/chunkuang.hu/linux.git/log/?h=mediatek-drm-next
Jason-JH.Lin (4):
drm/mediatek: Add mmsys_dev_num to mt8188 vdosys0 driver data
drm/mediatek: Fix using wrong drm private data to bind mediatek-drm
drm/mediatek: Add ability to support dynamic connector selection
drm/mediatek: Add DSI support for mt8188 vdosys0
drivers/gpu/drm/mediatek/mtk_disp_drv.h | 2 +
drivers/gpu/drm/mediatek/mtk_dpi.c | 9 +++
drivers/gpu/drm/mediatek/mtk_drm_crtc.c | 75 ++++++++++++++++++++-
drivers/gpu/drm/mediatek/mtk_drm_crtc.h | 5 +-
drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c | 27 ++++++++
drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h | 8 +++
drivers/gpu/drm/mediatek/mtk_drm_drv.c | 38 +++++++++--
drivers/gpu/drm/mediatek/mtk_drm_drv.h | 7 ++
drivers/gpu/drm/mediatek/mtk_dsi.c | 9 +++
9 files changed, 171 insertions(+), 9 deletions(-)
--
2.18.0
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 22+ messages in thread
* [PATCH v7 1/4] drm/mediatek: Add mmsys_dev_num to mt8188 vdosys0 driver data
2023-07-27 16:41 [PATCH v7 0/4] Add dynamic connector selection mechanism Jason-JH.Lin
@ 2023-07-27 16:41 ` Jason-JH.Lin
2023-07-28 7:53 ` CK Hu (胡俊光)
2023-07-28 8:11 ` AngeloGioacchino Del Regno
2023-07-27 16:41 ` [PATCH v7 2/4] drm/mediatek: Fix using wrong drm private data to bind mediatek-drm Jason-JH.Lin
` (2 subsequent siblings)
3 siblings, 2 replies; 22+ messages in thread
From: Jason-JH.Lin @ 2023-07-27 16:41 UTC (permalink / raw)
To: Chun-Kuang Hu, AngeloGioacchino Del Regno
Cc: Matthias Brugger, Jason-ch Chen, Johnson Wang, Jason-JH . Lin,
Singo Chang, Nancy Lin, Shawn Sung, dri-devel, linux-mediatek,
linux-arm-kernel, linux-kernel,
Project_Global_Chrome_Upstream_Group
Add missing mmsys_dev_num to mt8188 vdosys0 driver data.
Fixes: 54b48080278a ("drm/mediatek: Add mediatek-drm of vdosys0 support for mt8188")
Signed-off-by: Jason-JH.Lin <jason-jh.lin@mediatek.com>
---
drivers/gpu/drm/mediatek/mtk_drm_drv.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
index 6dcb4ba2466c..249c9fd6347e 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
+++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
@@ -287,6 +287,7 @@ static const struct mtk_mmsys_driver_data mt8186_mmsys_driver_data = {
static const struct mtk_mmsys_driver_data mt8188_vdosys0_driver_data = {
.main_path = mt8188_mtk_ddp_main,
.main_len = ARRAY_SIZE(mt8188_mtk_ddp_main),
+ .mmsys_dev_num = 1,
};
static const struct mtk_mmsys_driver_data mt8192_mmsys_driver_data = {
--
2.18.0
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH v7 2/4] drm/mediatek: Fix using wrong drm private data to bind mediatek-drm
2023-07-27 16:41 [PATCH v7 0/4] Add dynamic connector selection mechanism Jason-JH.Lin
2023-07-27 16:41 ` [PATCH v7 1/4] drm/mediatek: Add mmsys_dev_num to mt8188 vdosys0 driver data Jason-JH.Lin
@ 2023-07-27 16:41 ` Jason-JH.Lin
2023-07-28 8:03 ` CK Hu (胡俊光)
` (2 more replies)
2023-07-27 16:41 ` [PATCH v7 3/4] drm/mediatek: Add ability to support dynamic connector selection Jason-JH.Lin
2023-07-27 16:41 ` [PATCH v7 4/4] drm/mediatek: Add DSI support for mt8188 vdosys0 Jason-JH.Lin
3 siblings, 3 replies; 22+ messages in thread
From: Jason-JH.Lin @ 2023-07-27 16:41 UTC (permalink / raw)
To: Chun-Kuang Hu, AngeloGioacchino Del Regno
Cc: Matthias Brugger, Jason-ch Chen, Johnson Wang, Jason-JH . Lin,
Singo Chang, Nancy Lin, Shawn Sung, dri-devel, linux-mediatek,
linux-arm-kernel, linux-kernel,
Project_Global_Chrome_Upstream_Group
Add checking the length of each data path before assigning drm private
data into all_drm_priv array.
Fixes: 1ef7ed48356c ("drm/mediatek: Modify mediatek-drm for mt8195 multi mmsys support")
Signed-off-by: Jason-JH.Lin <jason-jh.lin@mediatek.com>
---
drivers/gpu/drm/mediatek/mtk_drm_drv.c | 16 +++++++++++++---
1 file changed, 13 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
index 249c9fd6347e..d2fb1fb4e682 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
+++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
@@ -351,6 +351,7 @@ static bool mtk_drm_get_all_drm_priv(struct device *dev)
{
struct mtk_drm_private *drm_priv = dev_get_drvdata(dev);
struct mtk_drm_private *all_drm_priv[MAX_CRTC];
+ struct mtk_drm_private *temp_drm_priv;
struct device_node *phandle = dev->parent->of_node;
const struct of_device_id *of_id;
struct device_node *node;
@@ -373,9 +374,18 @@ static bool mtk_drm_get_all_drm_priv(struct device *dev)
if (!drm_dev || !dev_get_drvdata(drm_dev))
continue;
- all_drm_priv[cnt] = dev_get_drvdata(drm_dev);
- if (all_drm_priv[cnt] && all_drm_priv[cnt]->mtk_drm_bound)
- cnt++;
+ temp_drm_priv = dev_get_drvdata(drm_dev);
+ if (temp_drm_priv) {
+ if (temp_drm_priv->mtk_drm_bound)
+ cnt++;
+
+ if (temp_drm_priv->data->main_len)
+ all_drm_priv[0] = temp_drm_priv;
+ else if (temp_drm_priv->data->ext_len)
+ all_drm_priv[1] = temp_drm_priv;
+ else if (temp_drm_priv->data->third_len)
+ all_drm_priv[2] = temp_drm_priv;
+ }
}
if (drm_priv->data->mmsys_dev_num == cnt) {
--
2.18.0
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH v7 3/4] drm/mediatek: Add ability to support dynamic connector selection
2023-07-27 16:41 [PATCH v7 0/4] Add dynamic connector selection mechanism Jason-JH.Lin
2023-07-27 16:41 ` [PATCH v7 1/4] drm/mediatek: Add mmsys_dev_num to mt8188 vdosys0 driver data Jason-JH.Lin
2023-07-27 16:41 ` [PATCH v7 2/4] drm/mediatek: Fix using wrong drm private data to bind mediatek-drm Jason-JH.Lin
@ 2023-07-27 16:41 ` Jason-JH.Lin
2023-07-28 8:11 ` AngeloGioacchino Del Regno
` (2 more replies)
2023-07-27 16:41 ` [PATCH v7 4/4] drm/mediatek: Add DSI support for mt8188 vdosys0 Jason-JH.Lin
3 siblings, 3 replies; 22+ messages in thread
From: Jason-JH.Lin @ 2023-07-27 16:41 UTC (permalink / raw)
To: Chun-Kuang Hu, AngeloGioacchino Del Regno
Cc: Matthias Brugger, Jason-ch Chen, Johnson Wang, Jason-JH . Lin,
Singo Chang, Nancy Lin, Shawn Sung, dri-devel, linux-mediatek,
linux-arm-kernel, linux-kernel,
Project_Global_Chrome_Upstream_Group, Nathan Lu
1. Move output drm connector from each ddp_path array to connector array.
2. Add dynamic select available connector flow in crtc create and enable.
Signed-off-by: Nancy Lin <nancy.lin@mediatek.com>
Signed-off-by: Nathan Lu <nathan.lu@mediatek.com>
Signed-off-by: Jason-JH.Lin <jason-jh.lin@mediatek.com>
---
drivers/gpu/drm/mediatek/mtk_disp_drv.h | 1 +
drivers/gpu/drm/mediatek/mtk_dpi.c | 9 +++
drivers/gpu/drm/mediatek/mtk_drm_crtc.c | 75 ++++++++++++++++++++-
drivers/gpu/drm/mediatek/mtk_drm_crtc.h | 5 +-
drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c | 26 +++++++
drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h | 8 +++
drivers/gpu/drm/mediatek/mtk_drm_drv.c | 20 ++++--
drivers/gpu/drm/mediatek/mtk_drm_drv.h | 7 ++
8 files changed, 145 insertions(+), 6 deletions(-)
diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
index 2254038519e1..5f07037670e9 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
+++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
@@ -44,6 +44,7 @@ void mtk_dither_set_common(void __iomem *regs, struct cmdq_client_reg *cmdq_reg,
void mtk_dpi_start(struct device *dev);
void mtk_dpi_stop(struct device *dev);
+unsigned int mtk_dpi_encoder_index(struct device *dev);
void mtk_dsi_ddp_start(struct device *dev);
void mtk_dsi_ddp_stop(struct device *dev);
diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c b/drivers/gpu/drm/mediatek/mtk_dpi.c
index 948a53f1f4b3..e58783a9d92c 100644
--- a/drivers/gpu/drm/mediatek/mtk_dpi.c
+++ b/drivers/gpu/drm/mediatek/mtk_dpi.c
@@ -782,6 +782,15 @@ void mtk_dpi_stop(struct device *dev)
mtk_dpi_power_off(dpi);
}
+unsigned int mtk_dpi_encoder_index(struct device *dev)
+{
+ struct mtk_dpi *dpi = dev_get_drvdata(dev);
+ unsigned int encoder_index = drm_encoder_index(&dpi->encoder);
+
+ dev_dbg(dev, "encoder index:%d", encoder_index);
+ return encoder_index;
+}
+
static int mtk_dpi_bind(struct device *dev, struct device *master, void *data)
{
struct mtk_dpi *dpi = dev_get_drvdata(dev);
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
index d40142842f85..f1f99a8da9eb 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
+++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
@@ -62,6 +62,8 @@ struct mtk_drm_crtc {
struct mtk_mutex *mutex;
unsigned int ddp_comp_nr;
struct mtk_ddp_comp **ddp_comp;
+ unsigned int num_conn_routes;
+ const struct mtk_drm_route *conn_routes;
/* lock for display hardware access */
struct mutex hw_lock;
@@ -649,6 +651,50 @@ static void mtk_drm_crtc_disable_vblank(struct drm_crtc *crtc)
mtk_ddp_comp_disable_vblank(comp);
}
+static int mtk_drm_crtc_update_output(struct drm_crtc *crtc,
+ struct drm_atomic_state *state)
+{
+ const struct mtk_drm_route *conn_routes;
+ int crtc_index = drm_crtc_index(crtc);
+ int i;
+ struct device *dev;
+ struct drm_crtc_state *crtc_state = state->crtcs[crtc_index].new_state;
+ struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc);
+ struct mtk_drm_private *priv = crtc->dev->dev_private;
+ unsigned int comp_id;
+ unsigned int encoder_mask = crtc_state->encoder_mask;
+
+ if (!mtk_crtc->num_conn_routes)
+ return 0;
+
+ priv = priv->all_drm_private[crtc_index];
+ dev = priv->dev;
+
+ dev_dbg(dev, "connector change:%d, encoder mask0x%x for crtc%d",
+ crtc_state->connectors_changed, encoder_mask, crtc_index);
+
+ if (!crtc_state->connectors_changed)
+ return 0;
+
+ conn_routes = mtk_crtc->conn_routes;
+ for (i = 0; i < mtk_crtc->num_conn_routes; i++) {
+ comp_id = conn_routes[i].route_ddp;
+ if (priv->comp_node[comp_id] &&
+ encoder_mask & BIT(priv->ddp_comp[comp_id].encoder_index)) {
+ struct mtk_ddp_comp *comp = &priv->ddp_comp[comp_id];
+
+ mtk_crtc->ddp_comp[mtk_crtc->ddp_comp_nr - 1] = comp;
+ dev_dbg(dev, "Add comp_id: %d at path index %d\n",
+ comp->id, mtk_crtc->ddp_comp_nr - 1);
+ break;
+ }
+ }
+
+ dev_dbg(dev, "Update total comp num:%d", mtk_crtc->ddp_comp_nr);
+
+ return 0;
+}
+
int mtk_drm_crtc_plane_check(struct drm_crtc *crtc, struct drm_plane *plane,
struct mtk_plane_state *state)
{
@@ -681,6 +727,12 @@ static void mtk_drm_crtc_atomic_enable(struct drm_crtc *crtc,
DRM_DEBUG_DRIVER("%s %d\n", __func__, crtc->base.id);
+ ret = mtk_drm_crtc_update_output(crtc, state);
+ if (ret < 0) {
+ DRM_DEV_ERROR(comp->dev, "Failed to update crtc output: %d\n", ret);
+ return;
+ }
+
ret = pm_runtime_resume_and_get(comp->dev);
if (ret < 0) {
DRM_DEV_ERROR(comp->dev, "Failed to enable power domain: %d\n", ret);
@@ -886,7 +938,8 @@ struct device *mtk_drm_crtc_dma_dev_get(struct drm_crtc *crtc)
int mtk_drm_crtc_create(struct drm_device *drm_dev,
const unsigned int *path, unsigned int path_len,
- int priv_data_index)
+ int priv_data_index, const struct mtk_drm_route *conn_routes,
+ unsigned int num_conn_routes)
{
struct mtk_drm_private *priv = drm_dev->dev_private;
struct device *dev = drm_dev->dev;
@@ -937,6 +990,26 @@ int mtk_drm_crtc_create(struct drm_device *drm_dev,
mtk_crtc->mmsys_dev = priv->mmsys_dev;
mtk_crtc->ddp_comp_nr = path_len;
+ if (conn_routes) {
+ struct device_node *node;
+ struct mtk_ddp_comp *comp;
+ unsigned int comp_id;
+
+ for (i = 0; i < num_conn_routes; i++) {
+ comp_id = conn_routes[i].route_ddp;
+ node = priv->comp_node[comp_id];
+ comp = &priv->ddp_comp[comp_id];
+ if (!comp) {
+ dev_err(dev, "Component %pOF not initialized\n", node);
+ return -ENODEV;
+ }
+ mtk_ddp_comp_encoder_index_set(comp);
+ }
+
+ mtk_crtc->num_conn_routes = num_conn_routes;
+ mtk_crtc->conn_routes = conn_routes;
+ mtk_crtc->ddp_comp_nr++;
+ }
mtk_crtc->ddp_comp = devm_kmalloc_array(dev, mtk_crtc->ddp_comp_nr,
sizeof(*mtk_crtc->ddp_comp),
GFP_KERNEL);
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.h b/drivers/gpu/drm/mediatek/mtk_drm_crtc.h
index 3e9046993d09..3c224595fa71 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.h
+++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.h
@@ -8,6 +8,7 @@
#include <drm/drm_crtc.h>
#include "mtk_drm_ddp_comp.h"
+#include "mtk_drm_drv.h"
#include "mtk_drm_plane.h"
#define MTK_LUT_SIZE 512
@@ -18,7 +19,9 @@ void mtk_drm_crtc_commit(struct drm_crtc *crtc);
int mtk_drm_crtc_create(struct drm_device *drm_dev,
const unsigned int *path,
unsigned int path_len,
- int priv_data_index);
+ int priv_data_index,
+ const struct mtk_drm_route *conn_routes,
+ unsigned int num_conn_routes);
int mtk_drm_crtc_plane_check(struct drm_crtc *crtc, struct drm_plane *plane,
struct mtk_plane_state *state);
void mtk_drm_crtc_async_update(struct drm_crtc *crtc, struct drm_plane *plane,
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
index f114da4d36a9..bc7b0a0c20db 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
+++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
@@ -304,6 +304,7 @@ static const struct mtk_ddp_comp_funcs ddp_dither = {
static const struct mtk_ddp_comp_funcs ddp_dpi = {
.start = mtk_dpi_start,
.stop = mtk_dpi_stop,
+ .encoder_index = mtk_dpi_encoder_index,
};
static const struct mtk_ddp_comp_funcs ddp_dsc = {
@@ -507,6 +508,25 @@ static bool mtk_drm_find_comp_in_ddp(struct device *dev,
return false;
}
+static int mtk_drm_find_comp_in_ddp_conn_path(struct device *dev,
+ const struct mtk_drm_route *routes,
+ unsigned int routes_num,
+ struct mtk_ddp_comp *ddp_comp)
+{
+ unsigned int i;
+
+ if (!routes)
+ return 0;
+
+ for (i = 0; i < routes_num; i++)
+ if (dev == ddp_comp[routes[i].route_ddp].dev)
+ return BIT(routes[i].crtc_id);
+
+ DRM_INFO("Failed to find comp in ddp connector table\n");
+
+ return 0;
+}
+
int mtk_ddp_comp_get_id(struct device_node *node,
enum mtk_ddp_comp_type comp_type)
{
@@ -538,6 +558,12 @@ unsigned int mtk_drm_find_possible_crtc_by_comp(struct drm_device *drm,
private->data->third_len, private->ddp_comp))
ret = BIT(2);
else
+ ret = mtk_drm_find_comp_in_ddp_conn_path(dev,
+ private->data->conn_routes,
+ private->data->num_conn_routes,
+ private->ddp_comp);
+
+ if (ret == 0)
DRM_INFO("Failed to find comp in ddp table\n");
return ret;
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h
index febcaeef16a1..8428baca70f4 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h
+++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h
@@ -80,6 +80,7 @@ struct mtk_ddp_comp_funcs {
void (*disconnect)(struct device *dev, struct device *mmsys_dev, unsigned int next);
void (*add)(struct device *dev, struct mtk_mutex *mutex);
void (*remove)(struct device *dev, struct mtk_mutex *mutex);
+ unsigned int (*encoder_index)(struct device *dev);
};
struct mtk_ddp_comp {
@@ -87,6 +88,7 @@ struct mtk_ddp_comp {
int irq;
unsigned int id;
const struct mtk_ddp_comp_funcs *funcs;
+ unsigned int encoder_index;
};
static inline int mtk_ddp_comp_clk_enable(struct mtk_ddp_comp *comp)
@@ -275,6 +277,12 @@ static inline bool mtk_ddp_comp_disconnect(struct mtk_ddp_comp *comp, struct dev
return false;
}
+static inline void mtk_ddp_comp_encoder_index_set(struct mtk_ddp_comp *comp)
+{
+ if (comp->funcs && comp->funcs->encoder_index)
+ comp->encoder_index = comp->funcs->encoder_index(comp->dev);
+}
+
int mtk_ddp_comp_get_id(struct device_node *node,
enum mtk_ddp_comp_type comp_type);
unsigned int mtk_drm_find_possible_crtc_by_comp(struct drm_device *drm,
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
index d2fb1fb4e682..ecd113f9908c 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
+++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
@@ -185,7 +185,10 @@ static const unsigned int mt8188_mtk_ddp_main[] = {
DDP_COMPONENT_GAMMA,
DDP_COMPONENT_POSTMASK0,
DDP_COMPONENT_DITHER0,
- DDP_COMPONENT_DP_INTF0,
+};
+
+static const struct mtk_drm_route mt8188_mtk_ddp_main_routes[] = {
+ {0, DDP_COMPONENT_DP_INTF0},
};
static const unsigned int mt8192_mtk_ddp_main[] = {
@@ -287,6 +290,8 @@ static const struct mtk_mmsys_driver_data mt8186_mmsys_driver_data = {
static const struct mtk_mmsys_driver_data mt8188_vdosys0_driver_data = {
.main_path = mt8188_mtk_ddp_main,
.main_len = ARRAY_SIZE(mt8188_mtk_ddp_main),
+ .conn_routes = mt8188_mtk_ddp_main_routes,
+ .num_conn_routes = ARRAY_SIZE(mt8188_mtk_ddp_main_routes),
.mmsys_dev_num = 1,
};
@@ -419,6 +424,11 @@ static bool mtk_drm_find_mmsys_comp(struct mtk_drm_private *private, int comp_id
if (drv_data->third_path[i] == comp_id)
return true;
+ if (drv_data->num_conn_routes)
+ for (i = 0; i < drv_data->num_conn_routes; i++)
+ if (drv_data->conn_routes[i].route_ddp == comp_id)
+ return true;
+
return false;
}
@@ -477,21 +487,23 @@ static int mtk_drm_kms_init(struct drm_device *drm)
if (i == 0 && priv_n->data->main_len) {
ret = mtk_drm_crtc_create(drm, priv_n->data->main_path,
- priv_n->data->main_len, j);
+ priv_n->data->main_len, j,
+ priv_n->data->conn_routes,
+ priv_n->data->num_conn_routes);
if (ret)
goto err_component_unbind;
continue;
} else if (i == 1 && priv_n->data->ext_len) {
ret = mtk_drm_crtc_create(drm, priv_n->data->ext_path,
- priv_n->data->ext_len, j);
+ priv_n->data->ext_len, j, NULL, 0);
if (ret)
goto err_component_unbind;
continue;
} else if (i == 2 && priv_n->data->third_len) {
ret = mtk_drm_crtc_create(drm, priv_n->data->third_path,
- priv_n->data->third_len, j);
+ priv_n->data->third_len, j, NULL, 0);
if (ret)
goto err_component_unbind;
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.h b/drivers/gpu/drm/mediatek/mtk_drm_drv.h
index eb2fd45941f0..39697a591046 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_drv.h
+++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.h
@@ -22,6 +22,11 @@ struct drm_fb_helper;
struct drm_property;
struct regmap;
+struct mtk_drm_route {
+ const unsigned int crtc_id;
+ const unsigned int route_ddp;
+};
+
struct mtk_mmsys_driver_data {
const unsigned int *main_path;
unsigned int main_len;
@@ -29,6 +34,8 @@ struct mtk_mmsys_driver_data {
unsigned int ext_len;
const unsigned int *third_path;
unsigned int third_len;
+ const struct mtk_drm_route *conn_routes;
+ unsigned int num_conn_routes;
bool shadow_register;
unsigned int mmsys_id;
--
2.18.0
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [PATCH v7 4/4] drm/mediatek: Add DSI support for mt8188 vdosys0
2023-07-27 16:41 [PATCH v7 0/4] Add dynamic connector selection mechanism Jason-JH.Lin
` (2 preceding siblings ...)
2023-07-27 16:41 ` [PATCH v7 3/4] drm/mediatek: Add ability to support dynamic connector selection Jason-JH.Lin
@ 2023-07-27 16:41 ` Jason-JH.Lin
2023-07-28 8:14 ` AngeloGioacchino Del Regno
3 siblings, 1 reply; 22+ messages in thread
From: Jason-JH.Lin @ 2023-07-27 16:41 UTC (permalink / raw)
To: Chun-Kuang Hu, AngeloGioacchino Del Regno
Cc: Matthias Brugger, Jason-ch Chen, Johnson Wang, Jason-JH . Lin,
Singo Chang, Nancy Lin, Shawn Sung, dri-devel, linux-mediatek,
linux-arm-kernel, linux-kernel,
Project_Global_Chrome_Upstream_Group, Nathan Lu
Add DSI as main display output for mt8188 vdosys0.
Signed-off-by: Nathan Lu <nathan.lu@mediatek.com>
Signed-off-by: Jason-JH.Lin <jason-jh.lin@mediatek.com>
Reviewed-by: Matthias Brugger <matthias.bgg@gmail.com>
---
drivers/gpu/drm/mediatek/mtk_disp_drv.h | 1 +
drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c | 1 +
drivers/gpu/drm/mediatek/mtk_drm_drv.c | 1 +
drivers/gpu/drm/mediatek/mtk_dsi.c | 9 +++++++++
4 files changed, 12 insertions(+)
diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
index 5f07037670e9..fdaa21b6a9da 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
+++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
@@ -48,6 +48,7 @@ unsigned int mtk_dpi_encoder_index(struct device *dev);
void mtk_dsi_ddp_start(struct device *dev);
void mtk_dsi_ddp_stop(struct device *dev);
+unsigned int mtk_dsi_encoder_index(struct device *dev);
int mtk_gamma_clk_enable(struct device *dev);
void mtk_gamma_clk_disable(struct device *dev);
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
index bc7b0a0c20db..e6a7a0b9de6c 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
+++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
@@ -318,6 +318,7 @@ static const struct mtk_ddp_comp_funcs ddp_dsc = {
static const struct mtk_ddp_comp_funcs ddp_dsi = {
.start = mtk_dsi_ddp_start,
.stop = mtk_dsi_ddp_stop,
+ .encoder_index = mtk_dsi_encoder_index,
};
static const struct mtk_ddp_comp_funcs ddp_gamma = {
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
index ecd113f9908c..9b7ca8d35f71 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
+++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
@@ -189,6 +189,7 @@ static const unsigned int mt8188_mtk_ddp_main[] = {
static const struct mtk_drm_route mt8188_mtk_ddp_main_routes[] = {
{0, DDP_COMPONENT_DP_INTF0},
+ {0, DDP_COMPONENT_DSI0},
};
static const unsigned int mt8192_mtk_ddp_main[] = {
diff --git a/drivers/gpu/drm/mediatek/mtk_dsi.c b/drivers/gpu/drm/mediatek/mtk_dsi.c
index 7d5250351193..62d5362916a5 100644
--- a/drivers/gpu/drm/mediatek/mtk_dsi.c
+++ b/drivers/gpu/drm/mediatek/mtk_dsi.c
@@ -865,6 +865,15 @@ static int mtk_dsi_encoder_init(struct drm_device *drm, struct mtk_dsi *dsi)
return ret;
}
+unsigned int mtk_dsi_encoder_index(struct device *dev)
+{
+ struct mtk_dsi *dsi = dev_get_drvdata(dev);
+ unsigned int encoder_index = drm_encoder_index(&dsi->encoder);
+
+ dev_dbg(dev, "encoder index:%d", encoder_index);
+ return encoder_index;
+}
+
static int mtk_dsi_bind(struct device *dev, struct device *master, void *data)
{
int ret;
--
2.18.0
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: [PATCH v7 1/4] drm/mediatek: Add mmsys_dev_num to mt8188 vdosys0 driver data
2023-07-27 16:41 ` [PATCH v7 1/4] drm/mediatek: Add mmsys_dev_num to mt8188 vdosys0 driver data Jason-JH.Lin
@ 2023-07-28 7:53 ` CK Hu (胡俊光)
2023-07-28 8:11 ` AngeloGioacchino Del Regno
1 sibling, 0 replies; 22+ messages in thread
From: CK Hu (胡俊光) @ 2023-07-28 7:53 UTC (permalink / raw)
To: Jason-JH Lin (林睿祥), chunkuang.hu@kernel.org,
angelogioacchino.delregno@collabora.com
Cc: linux-kernel@vger.kernel.org,
Singo Chang (張興國),
Johnson Wang (王聖鑫),
Jason-ch Chen (陳建豪),
Shawn Sung (宋孝謙),
linux-mediatek@lists.infradead.org,
Nancy Lin (林欣螢),
dri-devel@lists.freedesktop.org,
Project_Global_Chrome_Upstream_Group,
linux-arm-kernel@lists.infradead.org, matthias.bgg@gmail.com
Hi, Jason:
On Fri, 2023-07-28 at 00:41 +0800, Jason-JH.Lin wrote:
> Add missing mmsys_dev_num to mt8188 vdosys0 driver data.
Reviewed-by: CK Hu <ck.hu@mediatek.com>
>
> Fixes: 54b48080278a ("drm/mediatek: Add mediatek-drm of vdosys0
> support for mt8188")
> Signed-off-by: Jason-JH.Lin <jason-jh.lin@mediatek.com>
> ---
> drivers/gpu/drm/mediatek/mtk_drm_drv.c | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> index 6dcb4ba2466c..249c9fd6347e 100644
> --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> @@ -287,6 +287,7 @@ static const struct mtk_mmsys_driver_data
> mt8186_mmsys_driver_data = {
> static const struct mtk_mmsys_driver_data mt8188_vdosys0_driver_data
> = {
> .main_path = mt8188_mtk_ddp_main,
> .main_len = ARRAY_SIZE(mt8188_mtk_ddp_main),
> + .mmsys_dev_num = 1,
> };
>
> static const struct mtk_mmsys_driver_data mt8192_mmsys_driver_data =
> {
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v7 2/4] drm/mediatek: Fix using wrong drm private data to bind mediatek-drm
2023-07-27 16:41 ` [PATCH v7 2/4] drm/mediatek: Fix using wrong drm private data to bind mediatek-drm Jason-JH.Lin
@ 2023-07-28 8:03 ` CK Hu (胡俊光)
2023-07-28 8:11 ` AngeloGioacchino Del Regno
2023-07-28 8:47 ` Eugen Hristev
2 siblings, 0 replies; 22+ messages in thread
From: CK Hu (胡俊光) @ 2023-07-28 8:03 UTC (permalink / raw)
To: Jason-JH Lin (林睿祥), chunkuang.hu@kernel.org,
angelogioacchino.delregno@collabora.com
Cc: linux-kernel@vger.kernel.org,
Singo Chang (張興國),
Johnson Wang (王聖鑫),
Jason-ch Chen (陳建豪),
Shawn Sung (宋孝謙),
linux-mediatek@lists.infradead.org,
Nancy Lin (林欣螢),
dri-devel@lists.freedesktop.org,
Project_Global_Chrome_Upstream_Group,
linux-arm-kernel@lists.infradead.org, matthias.bgg@gmail.com
Hi, Jason:
On Fri, 2023-07-28 at 00:41 +0800, Jason-JH.Lin wrote:
> Add checking the length of each data path before assigning drm
> private
> data into all_drm_priv array.
Reviewed-by: CK Hu <ck.hu@mediatek.com>
>
> Fixes: 1ef7ed48356c ("drm/mediatek: Modify mediatek-drm for mt8195
> multi mmsys support")
> Signed-off-by: Jason-JH.Lin <jason-jh.lin@mediatek.com>
> ---
> drivers/gpu/drm/mediatek/mtk_drm_drv.c | 16 +++++++++++++---
> 1 file changed, 13 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> index 249c9fd6347e..d2fb1fb4e682 100644
> --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> @@ -351,6 +351,7 @@ static bool mtk_drm_get_all_drm_priv(struct
> device *dev)
> {
> struct mtk_drm_private *drm_priv = dev_get_drvdata(dev);
> struct mtk_drm_private *all_drm_priv[MAX_CRTC];
> + struct mtk_drm_private *temp_drm_priv;
> struct device_node *phandle = dev->parent->of_node;
> const struct of_device_id *of_id;
> struct device_node *node;
> @@ -373,9 +374,18 @@ static bool mtk_drm_get_all_drm_priv(struct
> device *dev)
> if (!drm_dev || !dev_get_drvdata(drm_dev))
> continue;
>
> - all_drm_priv[cnt] = dev_get_drvdata(drm_dev);
> - if (all_drm_priv[cnt] && all_drm_priv[cnt]-
> >mtk_drm_bound)
> - cnt++;
> + temp_drm_priv = dev_get_drvdata(drm_dev);
> + if (temp_drm_priv) {
> + if (temp_drm_priv->mtk_drm_bound)
> + cnt++;
> +
> + if (temp_drm_priv->data->main_len)
> + all_drm_priv[0] = temp_drm_priv;
> + else if (temp_drm_priv->data->ext_len)
> + all_drm_priv[1] = temp_drm_priv;
> + else if (temp_drm_priv->data->third_len)
> + all_drm_priv[2] = temp_drm_priv;
> + }
> }
>
> if (drm_priv->data->mmsys_dev_num == cnt) {
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v7 1/4] drm/mediatek: Add mmsys_dev_num to mt8188 vdosys0 driver data
2023-07-27 16:41 ` [PATCH v7 1/4] drm/mediatek: Add mmsys_dev_num to mt8188 vdosys0 driver data Jason-JH.Lin
2023-07-28 7:53 ` CK Hu (胡俊光)
@ 2023-07-28 8:11 ` AngeloGioacchino Del Regno
1 sibling, 0 replies; 22+ messages in thread
From: AngeloGioacchino Del Regno @ 2023-07-28 8:11 UTC (permalink / raw)
To: Jason-JH.Lin, Chun-Kuang Hu
Cc: Matthias Brugger, Jason-ch Chen, Johnson Wang, Singo Chang,
Nancy Lin, Shawn Sung, dri-devel, linux-mediatek,
linux-arm-kernel, linux-kernel,
Project_Global_Chrome_Upstream_Group
Il 27/07/23 18:41, Jason-JH.Lin ha scritto:
> Add missing mmsys_dev_num to mt8188 vdosys0 driver data.
>
> Fixes: 54b48080278a ("drm/mediatek: Add mediatek-drm of vdosys0 support for mt8188")
> Signed-off-by: Jason-JH.Lin <jason-jh.lin@mediatek.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v7 2/4] drm/mediatek: Fix using wrong drm private data to bind mediatek-drm
2023-07-27 16:41 ` [PATCH v7 2/4] drm/mediatek: Fix using wrong drm private data to bind mediatek-drm Jason-JH.Lin
2023-07-28 8:03 ` CK Hu (胡俊光)
@ 2023-07-28 8:11 ` AngeloGioacchino Del Regno
2023-07-28 8:47 ` Eugen Hristev
2 siblings, 0 replies; 22+ messages in thread
From: AngeloGioacchino Del Regno @ 2023-07-28 8:11 UTC (permalink / raw)
To: Jason-JH.Lin, Chun-Kuang Hu
Cc: Matthias Brugger, Jason-ch Chen, Johnson Wang, Singo Chang,
Nancy Lin, Shawn Sung, dri-devel, linux-mediatek,
linux-arm-kernel, linux-kernel,
Project_Global_Chrome_Upstream_Group
Il 27/07/23 18:41, Jason-JH.Lin ha scritto:
> Add checking the length of each data path before assigning drm private
> data into all_drm_priv array.
>
> Fixes: 1ef7ed48356c ("drm/mediatek: Modify mediatek-drm for mt8195 multi mmsys support")
> Signed-off-by: Jason-JH.Lin <jason-jh.lin@mediatek.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v7 3/4] drm/mediatek: Add ability to support dynamic connector selection
2023-07-27 16:41 ` [PATCH v7 3/4] drm/mediatek: Add ability to support dynamic connector selection Jason-JH.Lin
@ 2023-07-28 8:11 ` AngeloGioacchino Del Regno
2023-07-31 9:37 ` Jason-JH Lin (林睿祥)
2023-07-28 9:56 ` CK Hu (胡俊光)
2023-07-31 6:37 ` CK Hu (胡俊光)
2 siblings, 1 reply; 22+ messages in thread
From: AngeloGioacchino Del Regno @ 2023-07-28 8:11 UTC (permalink / raw)
To: Jason-JH.Lin, Chun-Kuang Hu
Cc: Matthias Brugger, Jason-ch Chen, Johnson Wang, Singo Chang,
Nancy Lin, Shawn Sung, dri-devel, linux-mediatek,
linux-arm-kernel, linux-kernel,
Project_Global_Chrome_Upstream_Group, Nathan Lu
Il 27/07/23 18:41, Jason-JH.Lin ha scritto:
> 1. Move output drm connector from each ddp_path array to connector array.
> 2. Add dynamic select available connector flow in crtc create and enable.
>
> Signed-off-by: Nancy Lin <nancy.lin@mediatek.com>
> Signed-off-by: Nathan Lu <nathan.lu@mediatek.com>
> Signed-off-by: Jason-JH.Lin <jason-jh.lin@mediatek.com>
> ---
> drivers/gpu/drm/mediatek/mtk_disp_drv.h | 1 +
> drivers/gpu/drm/mediatek/mtk_dpi.c | 9 +++
> drivers/gpu/drm/mediatek/mtk_drm_crtc.c | 75 ++++++++++++++++++++-
> drivers/gpu/drm/mediatek/mtk_drm_crtc.h | 5 +-
> drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c | 26 +++++++
> drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h | 8 +++
> drivers/gpu/drm/mediatek/mtk_drm_drv.c | 20 ++++--
> drivers/gpu/drm/mediatek/mtk_drm_drv.h | 7 ++
> 8 files changed, 145 insertions(+), 6 deletions(-)
>
..snip..
> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
> index f114da4d36a9..bc7b0a0c20db 100644
> --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
> +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
> @@ -304,6 +304,7 @@ static const struct mtk_ddp_comp_funcs ddp_dither = {
> static const struct mtk_ddp_comp_funcs ddp_dpi = {
> .start = mtk_dpi_start,
> .stop = mtk_dpi_stop,
> + .encoder_index = mtk_dpi_encoder_index,
> };
>
> static const struct mtk_ddp_comp_funcs ddp_dsc = {
> @@ -507,6 +508,25 @@ static bool mtk_drm_find_comp_in_ddp(struct device *dev,
> return false;
> }
>
> +static int mtk_drm_find_comp_in_ddp_conn_path(struct device *dev,
> + const struct mtk_drm_route *routes,
> + unsigned int routes_num,
`num_routes` would be more readable.
> + struct mtk_ddp_comp *ddp_comp)
> +{
> + unsigned int i;
> +
> + if (!routes)
> + return 0;
if (!routes)
return -EINVAL;
> +
> + for (i = 0; i < routes_num; i++)
> + if (dev == ddp_comp[routes[i].route_ddp].dev)
> + return BIT(routes[i].crtc_id);
> +
> + DRM_INFO("Failed to find comp in ddp connector table\n");
This print is redundant.
> +
> + return 0;
return -ENODEV;
> +}
> +
> int mtk_ddp_comp_get_id(struct device_node *node,
> enum mtk_ddp_comp_type comp_type)
> {
> @@ -538,6 +558,12 @@ unsigned int mtk_drm_find_possible_crtc_by_comp(struct drm_device *drm,
> private->data->third_len, private->ddp_comp))
> ret = BIT(2);
> else
> + ret = mtk_drm_find_comp_in_ddp_conn_path(dev,
> + private->data->conn_routes,
> + private->data->num_conn_routes,
> + private->ddp_comp);
> +
> + if (ret == 0)
if (ret < 0)
> DRM_INFO("Failed to find comp in ddp table\n");
>
> return ret;
Regards,
Angelo
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v7 4/4] drm/mediatek: Add DSI support for mt8188 vdosys0
2023-07-27 16:41 ` [PATCH v7 4/4] drm/mediatek: Add DSI support for mt8188 vdosys0 Jason-JH.Lin
@ 2023-07-28 8:14 ` AngeloGioacchino Del Regno
2023-07-31 16:08 ` Jason-JH Lin (林睿祥)
0 siblings, 1 reply; 22+ messages in thread
From: AngeloGioacchino Del Regno @ 2023-07-28 8:14 UTC (permalink / raw)
To: Jason-JH.Lin, Chun-Kuang Hu
Cc: Matthias Brugger, Jason-ch Chen, Johnson Wang, Singo Chang,
Nancy Lin, Shawn Sung, dri-devel, linux-mediatek,
linux-arm-kernel, linux-kernel,
Project_Global_Chrome_Upstream_Group, Nathan Lu
Il 27/07/23 18:41, Jason-JH.Lin ha scritto:
> Add DSI as main display output for mt8188 vdosys0.
>
I would split this commit in two:
1. drm/mediatek: dsi: Support dynamic connector selection
2. drm/mediatek: Support DSI on MT8188 VDOSYS0
Where the first one sets up the mtk_dsi driver for .encoder_index(), and
where the second one is a one-liner simply adding `{0, DDP_COMPONENT_DSI0},`
to the MT8188 main routes array.
The reason is that if you split it like that, whoever reads the commit history
will immediately understand how to add dynamic connector selection to a MTK DRM
driver, and how to perform the SoC-specific connection....
Please!
Thanks,
Angelo
> Signed-off-by: Nathan Lu <nathan.lu@mediatek.com>
> Signed-off-by: Jason-JH.Lin <jason-jh.lin@mediatek.com>
> Reviewed-by: Matthias Brugger <matthias.bgg@gmail.com>
> ---
> drivers/gpu/drm/mediatek/mtk_disp_drv.h | 1 +
> drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c | 1 +
> drivers/gpu/drm/mediatek/mtk_drm_drv.c | 1 +
> drivers/gpu/drm/mediatek/mtk_dsi.c | 9 +++++++++
> 4 files changed, 12 insertions(+)
>
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> index 5f07037670e9..fdaa21b6a9da 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> @@ -48,6 +48,7 @@ unsigned int mtk_dpi_encoder_index(struct device *dev);
>
> void mtk_dsi_ddp_start(struct device *dev);
> void mtk_dsi_ddp_stop(struct device *dev);
> +unsigned int mtk_dsi_encoder_index(struct device *dev);
>
> int mtk_gamma_clk_enable(struct device *dev);
> void mtk_gamma_clk_disable(struct device *dev);
> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
> index bc7b0a0c20db..e6a7a0b9de6c 100644
> --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
> +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
> @@ -318,6 +318,7 @@ static const struct mtk_ddp_comp_funcs ddp_dsc = {
> static const struct mtk_ddp_comp_funcs ddp_dsi = {
> .start = mtk_dsi_ddp_start,
> .stop = mtk_dsi_ddp_stop,
> + .encoder_index = mtk_dsi_encoder_index,
> };
>
> static const struct mtk_ddp_comp_funcs ddp_gamma = {
> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> index ecd113f9908c..9b7ca8d35f71 100644
> --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> @@ -189,6 +189,7 @@ static const unsigned int mt8188_mtk_ddp_main[] = {
>
> static const struct mtk_drm_route mt8188_mtk_ddp_main_routes[] = {
> {0, DDP_COMPONENT_DP_INTF0},
> + {0, DDP_COMPONENT_DSI0},
> };
>
> static const unsigned int mt8192_mtk_ddp_main[] = {
> diff --git a/drivers/gpu/drm/mediatek/mtk_dsi.c b/drivers/gpu/drm/mediatek/mtk_dsi.c
> index 7d5250351193..62d5362916a5 100644
> --- a/drivers/gpu/drm/mediatek/mtk_dsi.c
> +++ b/drivers/gpu/drm/mediatek/mtk_dsi.c
> @@ -865,6 +865,15 @@ static int mtk_dsi_encoder_init(struct drm_device *drm, struct mtk_dsi *dsi)
> return ret;
> }
>
> +unsigned int mtk_dsi_encoder_index(struct device *dev)
> +{
> + struct mtk_dsi *dsi = dev_get_drvdata(dev);
> + unsigned int encoder_index = drm_encoder_index(&dsi->encoder);
> +
> + dev_dbg(dev, "encoder index:%d", encoder_index);
> + return encoder_index;
> +}
> +
> static int mtk_dsi_bind(struct device *dev, struct device *master, void *data)
> {
> int ret;
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v7 2/4] drm/mediatek: Fix using wrong drm private data to bind mediatek-drm
2023-07-27 16:41 ` [PATCH v7 2/4] drm/mediatek: Fix using wrong drm private data to bind mediatek-drm Jason-JH.Lin
2023-07-28 8:03 ` CK Hu (胡俊光)
2023-07-28 8:11 ` AngeloGioacchino Del Regno
@ 2023-07-28 8:47 ` Eugen Hristev
2023-07-31 8:21 ` Jason-JH Lin (林睿祥)
2 siblings, 1 reply; 22+ messages in thread
From: Eugen Hristev @ 2023-07-28 8:47 UTC (permalink / raw)
To: Jason-JH.Lin, Chun-Kuang Hu, AngeloGioacchino Del Regno
Cc: Matthias Brugger, Jason-ch Chen, Johnson Wang, Singo Chang,
Nancy Lin, Shawn Sung, dri-devel, linux-mediatek,
linux-arm-kernel, linux-kernel,
Project_Global_Chrome_Upstream_Group
Hi,
On 7/27/23 19:41, Jason-JH.Lin wrote:
> Add checking the length of each data path before assigning drm private
> data into all_drm_priv array.
>
> Fixes: 1ef7ed48356c ("drm/mediatek: Modify mediatek-drm for mt8195 multi mmsys support")
> Signed-off-by: Jason-JH.Lin <jason-jh.lin@mediatek.com>
> ---
> drivers/gpu/drm/mediatek/mtk_drm_drv.c | 16 +++++++++++++---
> 1 file changed, 13 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> index 249c9fd6347e..d2fb1fb4e682 100644
> --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> @@ -351,6 +351,7 @@ static bool mtk_drm_get_all_drm_priv(struct device *dev)
> {
> struct mtk_drm_private *drm_priv = dev_get_drvdata(dev);
> struct mtk_drm_private *all_drm_priv[MAX_CRTC];
> + struct mtk_drm_private *temp_drm_priv;
> struct device_node *phandle = dev->parent->of_node;
> const struct of_device_id *of_id;
> struct device_node *node;
> @@ -373,9 +374,18 @@ static bool mtk_drm_get_all_drm_priv(struct device *dev)
> if (!drm_dev || !dev_get_drvdata(drm_dev))
> continue;
>
> - all_drm_priv[cnt] = dev_get_drvdata(drm_dev);
> - if (all_drm_priv[cnt] && all_drm_priv[cnt]->mtk_drm_bound)
> - cnt++;
> + temp_drm_priv = dev_get_drvdata(drm_dev);
> + if (temp_drm_priv) {
> + if (temp_drm_priv->mtk_drm_bound)
> + cnt++;
> +
> + if (temp_drm_priv->data->main_len)
> + all_drm_priv[0] = temp_drm_priv;
> + else if (temp_drm_priv->data->ext_len)
> + all_drm_priv[1] = temp_drm_priv;
> + else if (temp_drm_priv->data->third_len)
> + all_drm_priv[2] = temp_drm_priv;
> + }
Previously the code was assigning stuff into all_drm_priv[cnt] and
incrementing it.
With your change, it assigns to all_drm_priv[0], [1], [2]. Is this what
you intended ?
If this loop has second run, you will reassign to all_drm_priv again ?
I would expect you to take `cnt` into account.
Also, is it expected that all_drm_priv has holes in the array ?
Eugen
> }
>
> if (drm_priv->data->mmsys_dev_num == cnt) {
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v7 3/4] drm/mediatek: Add ability to support dynamic connector selection
2023-07-27 16:41 ` [PATCH v7 3/4] drm/mediatek: Add ability to support dynamic connector selection Jason-JH.Lin
2023-07-28 8:11 ` AngeloGioacchino Del Regno
@ 2023-07-28 9:56 ` CK Hu (胡俊光)
2023-07-31 10:08 ` Jason-JH Lin (林睿祥)
2023-07-31 6:37 ` CK Hu (胡俊光)
2 siblings, 1 reply; 22+ messages in thread
From: CK Hu (胡俊光) @ 2023-07-28 9:56 UTC (permalink / raw)
To: Jason-JH Lin (林睿祥), chunkuang.hu@kernel.org,
angelogioacchino.delregno@collabora.com
Cc: linux-kernel@vger.kernel.org,
Singo Chang (張興國),
Johnson Wang (王聖鑫),
Jason-ch Chen (陳建豪),
Shawn Sung (宋孝謙),
linux-mediatek@lists.infradead.org,
Nancy Lin (林欣螢),
dri-devel@lists.freedesktop.org,
Project_Global_Chrome_Upstream_Group,
Nathan Lu (呂東霖),
linux-arm-kernel@lists.infradead.org, matthias.bgg@gmail.com
Hi, Jason:
On Fri, 2023-07-28 at 00:41 +0800, Jason-JH.Lin wrote:
> 1. Move output drm connector from each ddp_path array to connector
> array.
> 2. Add dynamic select available connector flow in crtc create and
> enable.
>
> Signed-off-by: Nancy Lin <nancy.lin@mediatek.com>
> Signed-off-by: Nathan Lu <nathan.lu@mediatek.com>
> Signed-off-by: Jason-JH.Lin <jason-jh.lin@mediatek.com>
> ---
> drivers/gpu/drm/mediatek/mtk_disp_drv.h | 1 +
> drivers/gpu/drm/mediatek/mtk_dpi.c | 9 +++
> drivers/gpu/drm/mediatek/mtk_drm_crtc.c | 75
> ++++++++++++++++++++-
> drivers/gpu/drm/mediatek/mtk_drm_crtc.h | 5 +-
> drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c | 26 +++++++
> drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h | 8 +++
> drivers/gpu/drm/mediatek/mtk_drm_drv.c | 20 ++++--
> drivers/gpu/drm/mediatek/mtk_drm_drv.h | 7 ++
> 8 files changed, 145 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> index 2254038519e1..5f07037670e9 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> @@ -44,6 +44,7 @@ void mtk_dither_set_common(void __iomem *regs,
> struct cmdq_client_reg *cmdq_reg,
>
> void mtk_dpi_start(struct device *dev);
> void mtk_dpi_stop(struct device *dev);
> +unsigned int mtk_dpi_encoder_index(struct device *dev);
>
> void mtk_dsi_ddp_start(struct device *dev);
> void mtk_dsi_ddp_stop(struct device *dev);
> diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c
> b/drivers/gpu/drm/mediatek/mtk_dpi.c
> index 948a53f1f4b3..e58783a9d92c 100644
> --- a/drivers/gpu/drm/mediatek/mtk_dpi.c
> +++ b/drivers/gpu/drm/mediatek/mtk_dpi.c
> @@ -782,6 +782,15 @@ void mtk_dpi_stop(struct device *dev)
> mtk_dpi_power_off(dpi);
> }
>
> +unsigned int mtk_dpi_encoder_index(struct device *dev)
> +{
> + struct mtk_dpi *dpi = dev_get_drvdata(dev);
> + unsigned int encoder_index = drm_encoder_index(&dpi->encoder);
> +
> + dev_dbg(dev, "encoder index:%d", encoder_index);
> + return encoder_index;
> +}
I would like to separate this part with the dsi part to a patch of "Add
mtk_ddp_comp_function encoder_index".
> +
> static int mtk_dpi_bind(struct device *dev, struct device *master,
> void *data)
> {
> struct mtk_dpi *dpi = dev_get_drvdata(dev);
> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
> b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
> index d40142842f85..f1f99a8da9eb 100644
> --- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
> +++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
> @@ -62,6 +62,8 @@ struct mtk_drm_crtc {
> struct mtk_mutex *mutex;
> unsigned int ddp_comp_nr;
> struct mtk_ddp_comp **ddp_comp;
> + unsigned int num_conn_routes;
> + const struct mtk_drm_route *conn_routes;
>
> /* lock for display hardware access */
> struct mutex hw_lock;
> @@ -649,6 +651,50 @@ static void mtk_drm_crtc_disable_vblank(struct
> drm_crtc *crtc)
> mtk_ddp_comp_disable_vblank(comp);
> }
>
> +static int mtk_drm_crtc_update_output(struct drm_crtc *crtc,
> + struct drm_atomic_state *state)
> +{
> + const struct mtk_drm_route *conn_routes;
> + int crtc_index = drm_crtc_index(crtc);
> + int i;
> + struct device *dev;
> + struct drm_crtc_state *crtc_state = state-
> >crtcs[crtc_index].new_state;
> + struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc);
> + struct mtk_drm_private *priv = crtc->dev->dev_private;
> + unsigned int comp_id;
> + unsigned int encoder_mask = crtc_state->encoder_mask;
> +
> + if (!mtk_crtc->num_conn_routes)
> + return 0;
> +
> + priv = priv->all_drm_private[crtc_index];
> + dev = priv->dev;
> +
> + dev_dbg(dev, "connector change:%d, encoder mask0x%x for
> crtc%d",
> + crtc_state->connectors_changed, encoder_mask,
> crtc_index);
> +
> + if (!crtc_state->connectors_changed)
> + return 0;
Move this checking to the top of this function.
> +
> + conn_routes = mtk_crtc->conn_routes;
> + for (i = 0; i < mtk_crtc->num_conn_routes; i++) {
> + comp_id = conn_routes[i].route_ddp;
conn_routes is used only once here, so drop conn_routes and
comp_id = mtk_crtc->conn_routes[i].route_ddp;
> + if (priv->comp_node[comp_id] &&
The checking of priv->comp_mode[comp_id] is done in
mtk_drm_crtc_create(), so this checking is redundant.
> + encoder_mask & BIT(priv-
> >ddp_comp[comp_id].encoder_index)) {
> + struct mtk_ddp_comp *comp = &priv-
> >ddp_comp[comp_id];
> +
> + mtk_crtc->ddp_comp[mtk_crtc->ddp_comp_nr - 1] =
> comp;
> + dev_dbg(dev, "Add comp_id: %d at path index
> %d\n",
> + comp->id, mtk_crtc->ddp_comp_nr - 1);
> + break;
> + }
> + }
I think this for-loop could be simplified by ffs(encoder_mask).
Regards,
CK
> +
> + dev_dbg(dev, "Update total comp num:%d", mtk_crtc-
> >ddp_comp_nr);
> +
> + return 0;
> +}
> +
> int mtk_drm_crtc_plane_check(struct drm_crtc *crtc, struct drm_plane
> *plane,
> struct mtk_plane_state *state)
> {
> @@ -681,6 +727,12 @@ static void mtk_drm_crtc_atomic_enable(struct
> drm_crtc *crtc,
>
> DRM_DEBUG_DRIVER("%s %d\n", __func__, crtc->base.id);
>
> + ret = mtk_drm_crtc_update_output(crtc, state);
> + if (ret < 0) {
> + DRM_DEV_ERROR(comp->dev, "Failed to update crtc output:
> %d\n", ret);
> + return;
> + }
> +
> ret = pm_runtime_resume_and_get(comp->dev);
> if (ret < 0) {
> DRM_DEV_ERROR(comp->dev, "Failed to enable power
> domain: %d\n", ret);
> @@ -886,7 +938,8 @@ struct device *mtk_drm_crtc_dma_dev_get(struct
> drm_crtc *crtc)
>
> int mtk_drm_crtc_create(struct drm_device *drm_dev,
> const unsigned int *path, unsigned int
> path_len,
> - int priv_data_index)
> + int priv_data_index, const struct mtk_drm_route
> *conn_routes,
> + unsigned int num_conn_routes)
> {
> struct mtk_drm_private *priv = drm_dev->dev_private;
> struct device *dev = drm_dev->dev;
> @@ -937,6 +990,26 @@ int mtk_drm_crtc_create(struct drm_device
> *drm_dev,
>
> mtk_crtc->mmsys_dev = priv->mmsys_dev;
> mtk_crtc->ddp_comp_nr = path_len;
> + if (conn_routes) {
> + struct device_node *node;
> + struct mtk_ddp_comp *comp;
> + unsigned int comp_id;
> +
> + for (i = 0; i < num_conn_routes; i++) {
> + comp_id = conn_routes[i].route_ddp;
> + node = priv->comp_node[comp_id];
> + comp = &priv->ddp_comp[comp_id];
> + if (!comp) {
> + dev_err(dev, "Component %pOF not
> initialized\n", node);
> + return -ENODEV;
> + }
> + mtk_ddp_comp_encoder_index_set(comp);
> + }
> +
> + mtk_crtc->num_conn_routes = num_conn_routes;
> + mtk_crtc->conn_routes = conn_routes;
> + mtk_crtc->ddp_comp_nr++;
> + }
> mtk_crtc->ddp_comp = devm_kmalloc_array(dev, mtk_crtc-
> >ddp_comp_nr,
> sizeof(*mtk_crtc-
> >ddp_comp),
> GFP_KERNEL);
> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.h
> b/drivers/gpu/drm/mediatek/mtk_drm_crtc.h
> index 3e9046993d09..3c224595fa71 100644
> --- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.h
> +++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.h
> @@ -8,6 +8,7 @@
>
> #include <drm/drm_crtc.h>
> #include "mtk_drm_ddp_comp.h"
> +#include "mtk_drm_drv.h"
> #include "mtk_drm_plane.h"
>
> #define MTK_LUT_SIZE 512
> @@ -18,7 +19,9 @@ void mtk_drm_crtc_commit(struct drm_crtc *crtc);
> int mtk_drm_crtc_create(struct drm_device *drm_dev,
> const unsigned int *path,
> unsigned int path_len,
> - int priv_data_index);
> + int priv_data_index,
> + const struct mtk_drm_route *conn_routes,
> + unsigned int num_conn_routes);
> int mtk_drm_crtc_plane_check(struct drm_crtc *crtc, struct drm_plane
> *plane,
> struct mtk_plane_state *state);
> void mtk_drm_crtc_async_update(struct drm_crtc *crtc, struct
> drm_plane *plane,
> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
> b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
> index f114da4d36a9..bc7b0a0c20db 100644
> --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
> +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
> @@ -304,6 +304,7 @@ static const struct mtk_ddp_comp_funcs ddp_dither
> = {
> static const struct mtk_ddp_comp_funcs ddp_dpi = {
> .start = mtk_dpi_start,
> .stop = mtk_dpi_stop,
> + .encoder_index = mtk_dpi_encoder_index,
> };
>
> static const struct mtk_ddp_comp_funcs ddp_dsc = {
> @@ -507,6 +508,25 @@ static bool mtk_drm_find_comp_in_ddp(struct
> device *dev,
> return false;
> }
>
> +static int mtk_drm_find_comp_in_ddp_conn_path(struct device *dev,
> + const struct
> mtk_drm_route *routes,
> + unsigned int routes_num,
> + struct mtk_ddp_comp
> *ddp_comp)
> +{
> + unsigned int i;
> +
> + if (!routes)
> + return 0;
> +
> + for (i = 0; i < routes_num; i++)
> + if (dev == ddp_comp[routes[i].route_ddp].dev)
> + return BIT(routes[i].crtc_id);
> +
> + DRM_INFO("Failed to find comp in ddp connector table\n");
> +
> + return 0;
> +}
> +
> int mtk_ddp_comp_get_id(struct device_node *node,
> enum mtk_ddp_comp_type comp_type)
> {
> @@ -538,6 +558,12 @@ unsigned int
> mtk_drm_find_possible_crtc_by_comp(struct drm_device *drm,
> private->data->third_len,
> private->ddp_comp))
> ret = BIT(2);
> else
> + ret = mtk_drm_find_comp_in_ddp_conn_path(dev,
> + private->data-
> >conn_routes,
> + private->data-
> >num_conn_routes,
> + private-
> >ddp_comp);
> +
> + if (ret == 0)
> DRM_INFO("Failed to find comp in ddp table\n");
>
> return ret;
> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h
> b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h
> index febcaeef16a1..8428baca70f4 100644
> --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h
> +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h
> @@ -80,6 +80,7 @@ struct mtk_ddp_comp_funcs {
> void (*disconnect)(struct device *dev, struct device
> *mmsys_dev, unsigned int next);
> void (*add)(struct device *dev, struct mtk_mutex *mutex);
> void (*remove)(struct device *dev, struct mtk_mutex *mutex);
> + unsigned int (*encoder_index)(struct device *dev);
> };
>
> struct mtk_ddp_comp {
> @@ -87,6 +88,7 @@ struct mtk_ddp_comp {
> int irq;
> unsigned int id;
> const struct mtk_ddp_comp_funcs *funcs;
> + unsigned int encoder_index;
> };
>
> static inline int mtk_ddp_comp_clk_enable(struct mtk_ddp_comp *comp)
> @@ -275,6 +277,12 @@ static inline bool
> mtk_ddp_comp_disconnect(struct mtk_ddp_comp *comp, struct dev
> return false;
> }
>
> +static inline void mtk_ddp_comp_encoder_index_set(struct
> mtk_ddp_comp *comp)
> +{
> + if (comp->funcs && comp->funcs->encoder_index)
> + comp->encoder_index = comp->funcs->encoder_index(comp-
> >dev);
> +}
> +
> int mtk_ddp_comp_get_id(struct device_node *node,
> enum mtk_ddp_comp_type comp_type);
> unsigned int mtk_drm_find_possible_crtc_by_comp(struct drm_device
> *drm,
> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> index d2fb1fb4e682..ecd113f9908c 100644
> --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> @@ -185,7 +185,10 @@ static const unsigned int mt8188_mtk_ddp_main[]
> = {
> DDP_COMPONENT_GAMMA,
> DDP_COMPONENT_POSTMASK0,
> DDP_COMPONENT_DITHER0,
> - DDP_COMPONENT_DP_INTF0,
> +};
> +
> +static const struct mtk_drm_route mt8188_mtk_ddp_main_routes[] = {
> + {0, DDP_COMPONENT_DP_INTF0},
> };
>
> static const unsigned int mt8192_mtk_ddp_main[] = {
> @@ -287,6 +290,8 @@ static const struct mtk_mmsys_driver_data
> mt8186_mmsys_driver_data = {
> static const struct mtk_mmsys_driver_data mt8188_vdosys0_driver_data
> = {
> .main_path = mt8188_mtk_ddp_main,
> .main_len = ARRAY_SIZE(mt8188_mtk_ddp_main),
> + .conn_routes = mt8188_mtk_ddp_main_routes,
> + .num_conn_routes = ARRAY_SIZE(mt8188_mtk_ddp_main_routes),
> .mmsys_dev_num = 1,
> };
>
> @@ -419,6 +424,11 @@ static bool mtk_drm_find_mmsys_comp(struct
> mtk_drm_private *private, int comp_id
> if (drv_data->third_path[i] == comp_id)
> return true;
>
> + if (drv_data->num_conn_routes)
> + for (i = 0; i < drv_data->num_conn_routes; i++)
> + if (drv_data->conn_routes[i].route_ddp ==
> comp_id)
> + return true;
> +
> return false;
> }
>
> @@ -477,21 +487,23 @@ static int mtk_drm_kms_init(struct drm_device
> *drm)
>
> if (i == 0 && priv_n->data->main_len) {
> ret = mtk_drm_crtc_create(drm, priv_n-
> >data->main_path,
> - priv_n->data-
> >main_len, j);
> + priv_n->data-
> >main_len, j,
> + priv_n->data-
> >conn_routes,
> + priv_n->data-
> >num_conn_routes);
> if (ret)
> goto err_component_unbind;
>
> continue;
> } else if (i == 1 && priv_n->data->ext_len) {
> ret = mtk_drm_crtc_create(drm, priv_n-
> >data->ext_path,
> - priv_n->data-
> >ext_len, j);
> + priv_n->data-
> >ext_len, j, NULL, 0);
> if (ret)
> goto err_component_unbind;
>
> continue;
> } else if (i == 2 && priv_n->data->third_len) {
> ret = mtk_drm_crtc_create(drm, priv_n-
> >data->third_path,
> - priv_n->data-
> >third_len, j);
> + priv_n->data-
> >third_len, j, NULL, 0);
> if (ret)
> goto err_component_unbind;
>
> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.h
> b/drivers/gpu/drm/mediatek/mtk_drm_drv.h
> index eb2fd45941f0..39697a591046 100644
> --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.h
> +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.h
> @@ -22,6 +22,11 @@ struct drm_fb_helper;
> struct drm_property;
> struct regmap;
>
> +struct mtk_drm_route {
> + const unsigned int crtc_id;
> + const unsigned int route_ddp;
> +};
> +
> struct mtk_mmsys_driver_data {
> const unsigned int *main_path;
> unsigned int main_len;
> @@ -29,6 +34,8 @@ struct mtk_mmsys_driver_data {
> unsigned int ext_len;
> const unsigned int *third_path;
> unsigned int third_len;
> + const struct mtk_drm_route *conn_routes;
> + unsigned int num_conn_routes;
>
> bool shadow_register;
> unsigned int mmsys_id;
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v7 3/4] drm/mediatek: Add ability to support dynamic connector selection
2023-07-27 16:41 ` [PATCH v7 3/4] drm/mediatek: Add ability to support dynamic connector selection Jason-JH.Lin
2023-07-28 8:11 ` AngeloGioacchino Del Regno
2023-07-28 9:56 ` CK Hu (胡俊光)
@ 2023-07-31 6:37 ` CK Hu (胡俊光)
2023-08-02 5:59 ` Jason-JH Lin (林睿祥)
2 siblings, 1 reply; 22+ messages in thread
From: CK Hu (胡俊光) @ 2023-07-31 6:37 UTC (permalink / raw)
To: Jason-JH Lin (林睿祥), chunkuang.hu@kernel.org,
angelogioacchino.delregno@collabora.com
Cc: linux-kernel@vger.kernel.org,
Singo Chang (張興國),
Johnson Wang (王聖鑫),
Jason-ch Chen (陳建豪),
Shawn Sung (宋孝謙),
linux-mediatek@lists.infradead.org,
Nancy Lin (林欣螢),
dri-devel@lists.freedesktop.org,
Project_Global_Chrome_Upstream_Group,
Nathan Lu (呂東霖),
linux-arm-kernel@lists.infradead.org, matthias.bgg@gmail.com
Hi, Jason:
On Fri, 2023-07-28 at 00:41 +0800, Jason-JH.Lin wrote:
> 1. Move output drm connector from each ddp_path array to connector
> array.
> 2. Add dynamic select available connector flow in crtc create and
> enable.
>
> Signed-off-by: Nancy Lin <nancy.lin@mediatek.com>
> Signed-off-by: Nathan Lu <nathan.lu@mediatek.com>
> Signed-off-by: Jason-JH.Lin <jason-jh.lin@mediatek.com>
> ---
> drivers/gpu/drm/mediatek/mtk_disp_drv.h | 1 +
> drivers/gpu/drm/mediatek/mtk_dpi.c | 9 +++
> drivers/gpu/drm/mediatek/mtk_drm_crtc.c | 75
> ++++++++++++++++++++-
> drivers/gpu/drm/mediatek/mtk_drm_crtc.h | 5 +-
> drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c | 26 +++++++
> drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h | 8 +++
> drivers/gpu/drm/mediatek/mtk_drm_drv.c | 20 ++++--
> drivers/gpu/drm/mediatek/mtk_drm_drv.h | 7 ++
> 8 files changed, 145 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> index 2254038519e1..5f07037670e9 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> @@ -44,6 +44,7 @@ void mtk_dither_set_common(void __iomem *regs,
> struct cmdq_client_reg *cmdq_reg,
>
> void mtk_dpi_start(struct device *dev);
> void mtk_dpi_stop(struct device *dev);
> +unsigned int mtk_dpi_encoder_index(struct device *dev);
>
> void mtk_dsi_ddp_start(struct device *dev);
> void mtk_dsi_ddp_stop(struct device *dev);
> diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c
> b/drivers/gpu/drm/mediatek/mtk_dpi.c
> index 948a53f1f4b3..e58783a9d92c 100644
> --- a/drivers/gpu/drm/mediatek/mtk_dpi.c
> +++ b/drivers/gpu/drm/mediatek/mtk_dpi.c
> @@ -782,6 +782,15 @@ void mtk_dpi_stop(struct device *dev)
> mtk_dpi_power_off(dpi);
> }
>
> +unsigned int mtk_dpi_encoder_index(struct device *dev)
> +{
> + struct mtk_dpi *dpi = dev_get_drvdata(dev);
> + unsigned int encoder_index = drm_encoder_index(&dpi->encoder);
> +
> + dev_dbg(dev, "encoder index:%d", encoder_index);
> + return encoder_index;
> +}
> +
> static int mtk_dpi_bind(struct device *dev, struct device *master,
> void *data)
> {
> struct mtk_dpi *dpi = dev_get_drvdata(dev);
> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
> b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
> index d40142842f85..f1f99a8da9eb 100644
> --- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
> +++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
> @@ -62,6 +62,8 @@ struct mtk_drm_crtc {
> struct mtk_mutex *mutex;
> unsigned int ddp_comp_nr;
> struct mtk_ddp_comp **ddp_comp;
> + unsigned int num_conn_routes;
> + const struct mtk_drm_route *conn_routes;
>
> /* lock for display hardware access */
> struct mutex hw_lock;
> @@ -649,6 +651,50 @@ static void mtk_drm_crtc_disable_vblank(struct
> drm_crtc *crtc)
> mtk_ddp_comp_disable_vblank(comp);
> }
>
> +static int mtk_drm_crtc_update_output(struct drm_crtc *crtc,
> + struct drm_atomic_state *state)
this function always return 0, so let the return type void.
> +{
> + const struct mtk_drm_route *conn_routes;
> + int crtc_index = drm_crtc_index(crtc);
> + int i;
> + struct device *dev;
> + struct drm_crtc_state *crtc_state = state-
> >crtcs[crtc_index].new_state;
> + struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc);
> + struct mtk_drm_private *priv = crtc->dev->dev_private;
> + unsigned int comp_id;
> + unsigned int encoder_mask = crtc_state->encoder_mask;
> +
> + if (!mtk_crtc->num_conn_routes)
> + return 0;
> +
> + priv = priv->all_drm_private[crtc_index];
> + dev = priv->dev;
> +
> + dev_dbg(dev, "connector change:%d, encoder mask0x%x for
> crtc%d",
> + crtc_state->connectors_changed, encoder_mask,
> crtc_index);
> +
> + if (!crtc_state->connectors_changed)
> + return 0;
> +
> + conn_routes = mtk_crtc->conn_routes;
> + for (i = 0; i < mtk_crtc->num_conn_routes; i++) {
> + comp_id = conn_routes[i].route_ddp;
> + if (priv->comp_node[comp_id] &&
> + encoder_mask & BIT(priv-
> >ddp_comp[comp_id].encoder_index)) {
> + struct mtk_ddp_comp *comp = &priv-
> >ddp_comp[comp_id];
> +
> + mtk_crtc->ddp_comp[mtk_crtc->ddp_comp_nr - 1] =
> comp;
> + dev_dbg(dev, "Add comp_id: %d at path index
> %d\n",
> + comp->id, mtk_crtc->ddp_comp_nr - 1);
> + break;
> + }
> + }
> +
> + dev_dbg(dev, "Update total comp num:%d", mtk_crtc-
> >ddp_comp_nr);
> +
> + return 0;
> +}
> +
> int mtk_drm_crtc_plane_check(struct drm_crtc *crtc, struct drm_plane
> *plane,
> struct mtk_plane_state *state)
> {
> @@ -681,6 +727,12 @@ static void mtk_drm_crtc_atomic_enable(struct
> drm_crtc *crtc,
>
> DRM_DEBUG_DRIVER("%s %d\n", __func__, crtc->base.id);
>
> + ret = mtk_drm_crtc_update_output(crtc, state);
> + if (ret < 0) {
> + DRM_DEV_ERROR(comp->dev, "Failed to update crtc output:
> %d\n", ret);
> + return;
> + }
> +
> ret = pm_runtime_resume_and_get(comp->dev);
> if (ret < 0) {
> DRM_DEV_ERROR(comp->dev, "Failed to enable power
> domain: %d\n", ret);
> @@ -886,7 +938,8 @@ struct device *mtk_drm_crtc_dma_dev_get(struct
> drm_crtc *crtc)
>
> int mtk_drm_crtc_create(struct drm_device *drm_dev,
> const unsigned int *path, unsigned int
> path_len,
> - int priv_data_index)
> + int priv_data_index, const struct mtk_drm_route
> *conn_routes,
> + unsigned int num_conn_routes)
> {
> struct mtk_drm_private *priv = drm_dev->dev_private;
> struct device *dev = drm_dev->dev;
> @@ -937,6 +990,26 @@ int mtk_drm_crtc_create(struct drm_device
> *drm_dev,
>
> mtk_crtc->mmsys_dev = priv->mmsys_dev;
> mtk_crtc->ddp_comp_nr = path_len;
> + if (conn_routes) {
> + struct device_node *node;
> + struct mtk_ddp_comp *comp;
> + unsigned int comp_id;
> +
> + for (i = 0; i < num_conn_routes; i++) {
> + comp_id = conn_routes[i].route_ddp;
> + node = priv->comp_node[comp_id];
> + comp = &priv->ddp_comp[comp_id];
> + if (!comp) {
> + dev_err(dev, "Component %pOF not
> initialized\n", node);
> + return -ENODEV;
> + }
> + mtk_ddp_comp_encoder_index_set(comp);
> + }
move this device initialization checking after the device
initialization checking of priv->comp_node[].
> +
> + mtk_crtc->num_conn_routes = num_conn_routes;
> + mtk_crtc->conn_routes = conn_routes;
> + mtk_crtc->ddp_comp_nr++;
You add ddp_comp_nr here, but later many for-loop would access
ddp_comp[ddp_comp_nr - 1]. This is an invalid access. You may increase
ddp_comp_nr in the end of this function.
Regards,
CK
> + }
> mtk_crtc->ddp_comp = devm_kmalloc_array(dev, mtk_crtc-
> >ddp_comp_nr,
> sizeof(*mtk_crtc-
> >ddp_comp),
> GFP_KERNEL);
> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.h
> b/drivers/gpu/drm/mediatek/mtk_drm_crtc.h
> index 3e9046993d09..3c224595fa71 100644
> --- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.h
> +++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.h
> @@ -8,6 +8,7 @@
>
> #include <drm/drm_crtc.h>
> #include "mtk_drm_ddp_comp.h"
> +#include "mtk_drm_drv.h"
> #include "mtk_drm_plane.h"
>
> #define MTK_LUT_SIZE 512
> @@ -18,7 +19,9 @@ void mtk_drm_crtc_commit(struct drm_crtc *crtc);
> int mtk_drm_crtc_create(struct drm_device *drm_dev,
> const unsigned int *path,
> unsigned int path_len,
> - int priv_data_index);
> + int priv_data_index,
> + const struct mtk_drm_route *conn_routes,
> + unsigned int num_conn_routes);
> int mtk_drm_crtc_plane_check(struct drm_crtc *crtc, struct drm_plane
> *plane,
> struct mtk_plane_state *state);
> void mtk_drm_crtc_async_update(struct drm_crtc *crtc, struct
> drm_plane *plane,
> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
> b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
> index f114da4d36a9..bc7b0a0c20db 100644
> --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
> +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
> @@ -304,6 +304,7 @@ static const struct mtk_ddp_comp_funcs ddp_dither
> = {
> static const struct mtk_ddp_comp_funcs ddp_dpi = {
> .start = mtk_dpi_start,
> .stop = mtk_dpi_stop,
> + .encoder_index = mtk_dpi_encoder_index,
> };
>
> static const struct mtk_ddp_comp_funcs ddp_dsc = {
> @@ -507,6 +508,25 @@ static bool mtk_drm_find_comp_in_ddp(struct
> device *dev,
> return false;
> }
>
> +static int mtk_drm_find_comp_in_ddp_conn_path(struct device *dev,
> + const struct
> mtk_drm_route *routes,
> + unsigned int routes_num,
> + struct mtk_ddp_comp
> *ddp_comp)
> +{
> + unsigned int i;
> +
> + if (!routes)
> + return 0;
> +
> + for (i = 0; i < routes_num; i++)
> + if (dev == ddp_comp[routes[i].route_ddp].dev)
> + return BIT(routes[i].crtc_id);
> +
> + DRM_INFO("Failed to find comp in ddp connector table\n");
> +
> + return 0;
> +}
> +
> int mtk_ddp_comp_get_id(struct device_node *node,
> enum mtk_ddp_comp_type comp_type)
> {
> @@ -538,6 +558,12 @@ unsigned int
> mtk_drm_find_possible_crtc_by_comp(struct drm_device *drm,
> private->data->third_len,
> private->ddp_comp))
> ret = BIT(2);
> else
> + ret = mtk_drm_find_comp_in_ddp_conn_path(dev,
> + private->data-
> >conn_routes,
> + private->data-
> >num_conn_routes,
> + private-
> >ddp_comp);
> +
> + if (ret == 0)
> DRM_INFO("Failed to find comp in ddp table\n");
>
> return ret;
> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h
> b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h
> index febcaeef16a1..8428baca70f4 100644
> --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h
> +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h
> @@ -80,6 +80,7 @@ struct mtk_ddp_comp_funcs {
> void (*disconnect)(struct device *dev, struct device
> *mmsys_dev, unsigned int next);
> void (*add)(struct device *dev, struct mtk_mutex *mutex);
> void (*remove)(struct device *dev, struct mtk_mutex *mutex);
> + unsigned int (*encoder_index)(struct device *dev);
> };
>
> struct mtk_ddp_comp {
> @@ -87,6 +88,7 @@ struct mtk_ddp_comp {
> int irq;
> unsigned int id;
> const struct mtk_ddp_comp_funcs *funcs;
> + unsigned int encoder_index;
> };
>
> static inline int mtk_ddp_comp_clk_enable(struct mtk_ddp_comp *comp)
> @@ -275,6 +277,12 @@ static inline bool
> mtk_ddp_comp_disconnect(struct mtk_ddp_comp *comp, struct dev
> return false;
> }
>
> +static inline void mtk_ddp_comp_encoder_index_set(struct
> mtk_ddp_comp *comp)
> +{
> + if (comp->funcs && comp->funcs->encoder_index)
> + comp->encoder_index = comp->funcs->encoder_index(comp-
> >dev);
> +}
> +
> int mtk_ddp_comp_get_id(struct device_node *node,
> enum mtk_ddp_comp_type comp_type);
> unsigned int mtk_drm_find_possible_crtc_by_comp(struct drm_device
> *drm,
> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> index d2fb1fb4e682..ecd113f9908c 100644
> --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> @@ -185,7 +185,10 @@ static const unsigned int mt8188_mtk_ddp_main[]
> = {
> DDP_COMPONENT_GAMMA,
> DDP_COMPONENT_POSTMASK0,
> DDP_COMPONENT_DITHER0,
> - DDP_COMPONENT_DP_INTF0,
> +};
> +
> +static const struct mtk_drm_route mt8188_mtk_ddp_main_routes[] = {
> + {0, DDP_COMPONENT_DP_INTF0},
> };
>
> static const unsigned int mt8192_mtk_ddp_main[] = {
> @@ -287,6 +290,8 @@ static const struct mtk_mmsys_driver_data
> mt8186_mmsys_driver_data = {
> static const struct mtk_mmsys_driver_data mt8188_vdosys0_driver_data
> = {
> .main_path = mt8188_mtk_ddp_main,
> .main_len = ARRAY_SIZE(mt8188_mtk_ddp_main),
> + .conn_routes = mt8188_mtk_ddp_main_routes,
> + .num_conn_routes = ARRAY_SIZE(mt8188_mtk_ddp_main_routes),
> .mmsys_dev_num = 1,
> };
>
> @@ -419,6 +424,11 @@ static bool mtk_drm_find_mmsys_comp(struct
> mtk_drm_private *private, int comp_id
> if (drv_data->third_path[i] == comp_id)
> return true;
>
> + if (drv_data->num_conn_routes)
> + for (i = 0; i < drv_data->num_conn_routes; i++)
> + if (drv_data->conn_routes[i].route_ddp ==
> comp_id)
> + return true;
> +
> return false;
> }
>
> @@ -477,21 +487,23 @@ static int mtk_drm_kms_init(struct drm_device
> *drm)
>
> if (i == 0 && priv_n->data->main_len) {
> ret = mtk_drm_crtc_create(drm, priv_n-
> >data->main_path,
> - priv_n->data-
> >main_len, j);
> + priv_n->data-
> >main_len, j,
> + priv_n->data-
> >conn_routes,
> + priv_n->data-
> >num_conn_routes);
> if (ret)
> goto err_component_unbind;
>
> continue;
> } else if (i == 1 && priv_n->data->ext_len) {
> ret = mtk_drm_crtc_create(drm, priv_n-
> >data->ext_path,
> - priv_n->data-
> >ext_len, j);
> + priv_n->data-
> >ext_len, j, NULL, 0);
> if (ret)
> goto err_component_unbind;
>
> continue;
> } else if (i == 2 && priv_n->data->third_len) {
> ret = mtk_drm_crtc_create(drm, priv_n-
> >data->third_path,
> - priv_n->data-
> >third_len, j);
> + priv_n->data-
> >third_len, j, NULL, 0);
> if (ret)
> goto err_component_unbind;
>
> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.h
> b/drivers/gpu/drm/mediatek/mtk_drm_drv.h
> index eb2fd45941f0..39697a591046 100644
> --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.h
> +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.h
> @@ -22,6 +22,11 @@ struct drm_fb_helper;
> struct drm_property;
> struct regmap;
>
> +struct mtk_drm_route {
> + const unsigned int crtc_id;
> + const unsigned int route_ddp;
> +};
> +
> struct mtk_mmsys_driver_data {
> const unsigned int *main_path;
> unsigned int main_len;
> @@ -29,6 +34,8 @@ struct mtk_mmsys_driver_data {
> unsigned int ext_len;
> const unsigned int *third_path;
> unsigned int third_len;
> + const struct mtk_drm_route *conn_routes;
> + unsigned int num_conn_routes;
>
> bool shadow_register;
> unsigned int mmsys_id;
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v7 2/4] drm/mediatek: Fix using wrong drm private data to bind mediatek-drm
2023-07-28 8:47 ` Eugen Hristev
@ 2023-07-31 8:21 ` Jason-JH Lin (林睿祥)
2023-07-31 8:32 ` Eugen Hristev
0 siblings, 1 reply; 22+ messages in thread
From: Jason-JH Lin (林睿祥) @ 2023-07-31 8:21 UTC (permalink / raw)
To: chunkuang.hu@kernel.org, angelogioacchino.delregno@collabora.com,
eugen.hristev@collabora.com
Cc: linux-mediatek@lists.infradead.org,
Singo Chang (張興國),
Johnson Wang (王聖鑫),
Jason-ch Chen (陳建豪),
Shawn Sung (宋孝謙),
linux-kernel@vger.kernel.org,
Nancy Lin (林欣螢),
dri-devel@lists.freedesktop.org,
Project_Global_Chrome_Upstream_Group,
linux-arm-kernel@lists.infradead.org, matthias.bgg@gmail.com
Hi Eugen,
Thanks for the reviews.
On Fri, 2023-07-28 at 11:47 +0300, Eugen Hristev wrote:
> Hi,
>
> On 7/27/23 19:41, Jason-JH.Lin wrote:
> > Add checking the length of each data path before assigning drm
> > private
> > data into all_drm_priv array.
> >
> > Fixes: 1ef7ed48356c ("drm/mediatek: Modify mediatek-drm for mt8195
> > multi mmsys support")
> > Signed-off-by: Jason-JH.Lin <jason-jh.lin@mediatek.com>
> > ---
> > drivers/gpu/drm/mediatek/mtk_drm_drv.c | 16 +++++++++++++---
> > 1 file changed, 13 insertions(+), 3 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> > b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> > index 249c9fd6347e..d2fb1fb4e682 100644
> > --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> > +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> > @@ -351,6 +351,7 @@ static bool mtk_drm_get_all_drm_priv(struct
> > device *dev)
> > {
> > struct mtk_drm_private *drm_priv = dev_get_drvdata(dev);
> > struct mtk_drm_private *all_drm_priv[MAX_CRTC];
> > + struct mtk_drm_private *temp_drm_priv;
> > struct device_node *phandle = dev->parent->of_node;
> > const struct of_device_id *of_id;
> > struct device_node *node;
> > @@ -373,9 +374,18 @@ static bool mtk_drm_get_all_drm_priv(struct
> > device *dev)
> > if (!drm_dev || !dev_get_drvdata(drm_dev))
> > continue;
> >
> > - all_drm_priv[cnt] = dev_get_drvdata(drm_dev);
> > - if (all_drm_priv[cnt] && all_drm_priv[cnt]-
> > >mtk_drm_bound)
> > - cnt++;
> > + temp_drm_priv = dev_get_drvdata(drm_dev);
> > + if (temp_drm_priv) {
> > + if (temp_drm_priv->mtk_drm_bound)
> > + cnt++;
> > +
> > + if (temp_drm_priv->data->main_len)
> > + all_drm_priv[0] = temp_drm_priv;
> > + else if (temp_drm_priv->data->ext_len)
> > + all_drm_priv[1] = temp_drm_priv;
> > + else if (temp_drm_priv->data->third_len)
> > + all_drm_priv[2] = temp_drm_priv;
> > + }
>
> Previously the code was assigning stuff into all_drm_priv[cnt] and
> incrementing it.
> With your change, it assigns to all_drm_priv[0], [1], [2]. Is this
> what
> you intended ?
Because dev_get_drvdata(drm_dev) will get the driver data by drm_dev.
Each drm_dev represents a display path.
e,g.
drm_dev of "mediatek,mt8195-vdosys0" represents main path.
drm_dev of "mediatek,mt8195-vdosys1" represents ext path.
So we want to make sure all_drm_priv[] store the private data in
the order of display path, such as:
all_drm_priv[0] = the private data of main display
all_drm_priv[1] = the private data of ext display
all_drm_priv[2] = the private data of third display
> If this loop has second run, you will reassign to all_drm_priv again
> ?
Because the previous code will store all_drm_priv[] in the order of
mtk_drm_bind() was called.
If drm_dev of ext path bound earlier than drm_dev of main path,
all_drm_priv[] in mtk_drm_get_all_drm_priv() may be re-assigned like
this:
all_drm_priv[0]->all_drm_priv[0] = private data of ext path
all_drm_priv[1]->all_drm_priv[0] = private data of ext path
all_drm_priv[0]->all_drm_priv[1] = private data of main path
all_drm_priv[1]->all_drm_priv[1] = private data of main path
But we expect all_drm_priv[] be re-assigned like this:
all_drm_priv[0]->all_drm_priv[0] = private data of main path
all_drm_priv[1]->all_drm_priv[0] = private data of main path
all_drm_priv[0]->all_drm_priv[1] = private data of ext path
all_drm_priv[1]->all_drm_priv[1] = private data of ext path
> I would expect you to take `cnt` into account.
> Also, is it expected that all_drm_priv has holes in the array ?
Each drm_dev will only called mtk_drm_bind() once, so all holes
will be filled after all drm_dev has called mtk_drm_bind().
Do you agree with this statement? :)
Regards,
Jason-JH.Lin
>
> Eugen
>
>
>
> > }
> >
> > if (drm_priv->data->mmsys_dev_num == cnt) {
>
>
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v7 2/4] drm/mediatek: Fix using wrong drm private data to bind mediatek-drm
2023-07-31 8:21 ` Jason-JH Lin (林睿祥)
@ 2023-07-31 8:32 ` Eugen Hristev
2023-08-02 7:05 ` Jason-JH Lin (林睿祥)
0 siblings, 1 reply; 22+ messages in thread
From: Eugen Hristev @ 2023-07-31 8:32 UTC (permalink / raw)
To: Jason-JH Lin (林睿祥), chunkuang.hu@kernel.org,
angelogioacchino.delregno@collabora.com
Cc: linux-mediatek@lists.infradead.org,
Singo Chang (張興國),
Johnson Wang (王聖鑫),
Jason-ch Chen (陳建豪),
Shawn Sung (宋孝謙),
linux-kernel@vger.kernel.org,
Nancy Lin (林欣螢),
dri-devel@lists.freedesktop.org,
Project_Global_Chrome_Upstream_Group,
linux-arm-kernel@lists.infradead.org, matthias.bgg@gmail.com
On 7/31/23 11:21, Jason-JH Lin (林睿祥) wrote:
> Hi Eugen,
>
> Thanks for the reviews.
>
> On Fri, 2023-07-28 at 11:47 +0300, Eugen Hristev wrote:
>> Hi,
>>
>> On 7/27/23 19:41, Jason-JH.Lin wrote:
>>> Add checking the length of each data path before assigning drm
>>> private
>>> data into all_drm_priv array.
>>>
>>> Fixes: 1ef7ed48356c ("drm/mediatek: Modify mediatek-drm for mt8195
>>> multi mmsys support")
>>> Signed-off-by: Jason-JH.Lin <jason-jh.lin@mediatek.com>
>>> ---
>>> drivers/gpu/drm/mediatek/mtk_drm_drv.c | 16 +++++++++++++---
>>> 1 file changed, 13 insertions(+), 3 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
>>> b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
>>> index 249c9fd6347e..d2fb1fb4e682 100644
>>> --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
>>> +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
>>> @@ -351,6 +351,7 @@ static bool mtk_drm_get_all_drm_priv(struct
>>> device *dev)
>>> {
>>> struct mtk_drm_private *drm_priv = dev_get_drvdata(dev);
>>> struct mtk_drm_private *all_drm_priv[MAX_CRTC];
>>> + struct mtk_drm_private *temp_drm_priv;
>>> struct device_node *phandle = dev->parent->of_node;
>>> const struct of_device_id *of_id;
>>> struct device_node *node;
>>> @@ -373,9 +374,18 @@ static bool mtk_drm_get_all_drm_priv(struct
>>> device *dev)
>>> if (!drm_dev || !dev_get_drvdata(drm_dev))
>>> continue;
>>>
>>> - all_drm_priv[cnt] = dev_get_drvdata(drm_dev);
>>> - if (all_drm_priv[cnt] && all_drm_priv[cnt]-
>>>> mtk_drm_bound)
>>> - cnt++;
>>> + temp_drm_priv = dev_get_drvdata(drm_dev);
>>> + if (temp_drm_priv) {
>>> + if (temp_drm_priv->mtk_drm_bound)
>>> + cnt++;
>>> +
>>> + if (temp_drm_priv->data->main_len)
>>> + all_drm_priv[0] = temp_drm_priv;
>>> + else if (temp_drm_priv->data->ext_len)
>>> + all_drm_priv[1] = temp_drm_priv;
>>> + else if (temp_drm_priv->data->third_len)
>>> + all_drm_priv[2] = temp_drm_priv;
>>> + }
>>
>> Previously the code was assigning stuff into all_drm_priv[cnt] and
>> incrementing it.
>> With your change, it assigns to all_drm_priv[0], [1], [2]. Is this
>> what
>> you intended ?
>
> Because dev_get_drvdata(drm_dev) will get the driver data by drm_dev.
> Each drm_dev represents a display path.
> e,g.
> drm_dev of "mediatek,mt8195-vdosys0" represents main path.
> drm_dev of "mediatek,mt8195-vdosys1" represents ext path.
>
> So we want to make sure all_drm_priv[] store the private data in
> the order of display path, such as:
> all_drm_priv[0] = the private data of main display
> all_drm_priv[1] = the private data of ext display
> all_drm_priv[2] = the private data of third display
If you have such a hard requirement for keeping elements in an array,
you are better having
drm_priv_main_display
drm_priv_ext_display
drm_priv_third_display
Keeping them indexed in a three elements array by having no logical
connection between the number [0,1,2] and the actual displays that you
want to save is a bit confusing.
One other option which I don't know if it's better or not is to have
macros to hide your indexed approach:
all_drm_priv[MAIN_DISPLAY] ...
etc.
>
>> If this loop has second run, you will reassign to all_drm_priv again
>> ?
>
> Because the previous code will store all_drm_priv[] in the order of
> mtk_drm_bind() was called.
>
> If drm_dev of ext path bound earlier than drm_dev of main path,
> all_drm_priv[] in mtk_drm_get_all_drm_priv() may be re-assigned like
> this:
> all_drm_priv[0]->all_drm_priv[0] = private data of ext path
> all_drm_priv[1]->all_drm_priv[0] = private data of ext path
> all_drm_priv[0]->all_drm_priv[1] = private data of main path
> all_drm_priv[1]->all_drm_priv[1] = private data of main path
>
> But we expect all_drm_priv[] be re-assigned like this:
> all_drm_priv[0]->all_drm_priv[0] = private data of main path
> all_drm_priv[1]->all_drm_priv[0] = private data of main path
> all_drm_priv[0]->all_drm_priv[1] = private data of ext path
> all_drm_priv[1]->all_drm_priv[1] = private data of ext path
This expectation does not appear to be really enforced in your code.
You have a driver that keeps an array with all_drm_priv[], in which
you can have main path or ext path. Then it's natural that they might
have whichever order in the array you are placing them into.
If you have a hard enforced order of keeping elements in your array,
then an indexed array is not the best option here.
You can either: move to a different type of array , with macros for
indexes into the array, or, store a second array/field which keeps the
index in which you saved each element.
This is just my opinion , by looking at your code.
>
>> I would expect you to take `cnt` into account.
>> Also, is it expected that all_drm_priv has holes in the array ?
>
> Each drm_dev will only called mtk_drm_bind() once, so all holes
> will be filled after all drm_dev has called mtk_drm_bind().
>
> Do you agree with this statement? :)
At the moment I cannot agree nor disagree, I don't know the code well
enough. But what I can say, is that you should not rely on future calls
of the function to fill up your array correctly.
>
> Regards,
> Jason-JH.Lin
>
>>
>> Eugen
>>
>>
>>
>>> }
>>>
>>> if (drm_priv->data->mmsys_dev_num == cnt) {
>>
>>
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v7 3/4] drm/mediatek: Add ability to support dynamic connector selection
2023-07-28 8:11 ` AngeloGioacchino Del Regno
@ 2023-07-31 9:37 ` Jason-JH Lin (林睿祥)
0 siblings, 0 replies; 22+ messages in thread
From: Jason-JH Lin (林睿祥) @ 2023-07-31 9:37 UTC (permalink / raw)
To: angelogioacchino.delregno@collabora.com, chunkuang.hu@kernel.org
Cc: linux-mediatek@lists.infradead.org,
Singo Chang (張興國),
Johnson Wang (王聖鑫),
Jason-ch Chen (陳建豪),
Shawn Sung (宋孝謙),
linux-kernel@vger.kernel.org,
Nancy Lin (林欣螢),
dri-devel@lists.freedesktop.org,
Project_Global_Chrome_Upstream_Group,
Nathan Lu (呂東霖),
linux-arm-kernel@lists.infradead.org, matthias.bgg@gmail.com
Hi Angelo,
Thanks for the reviews.
On Fri, 2023-07-28 at 10:11 +0200, AngeloGioacchino Del Regno wrote:
> Il 27/07/23 18:41, Jason-JH.Lin ha scritto:
> > 1. Move output drm connector from each ddp_path array to connector
> > array.
> > 2. Add dynamic select available connector flow in crtc create and
> > enable.
> >
> > Signed-off-by: Nancy Lin <nancy.lin@mediatek.com>
> > Signed-off-by: Nathan Lu <nathan.lu@mediatek.com>
> > Signed-off-by: Jason-JH.Lin <jason-jh.lin@mediatek.com>
> > ---
> > drivers/gpu/drm/mediatek/mtk_disp_drv.h | 1 +
> > drivers/gpu/drm/mediatek/mtk_dpi.c | 9 +++
> > drivers/gpu/drm/mediatek/mtk_drm_crtc.c | 75
> > ++++++++++++++++++++-
> > drivers/gpu/drm/mediatek/mtk_drm_crtc.h | 5 +-
> > drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c | 26 +++++++
> > drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h | 8 +++
> > drivers/gpu/drm/mediatek/mtk_drm_drv.c | 20 ++++--
> > drivers/gpu/drm/mediatek/mtk_drm_drv.h | 7 ++
> > 8 files changed, 145 insertions(+), 6 deletions(-)
> >
>
> ..snip..
>
> > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
> > b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
> > index f114da4d36a9..bc7b0a0c20db 100644
> > --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
> > +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
> > @@ -304,6 +304,7 @@ static const struct mtk_ddp_comp_funcs
> > ddp_dither = {
> > static const struct mtk_ddp_comp_funcs ddp_dpi = {
> > .start = mtk_dpi_start,
> > .stop = mtk_dpi_stop,
> > + .encoder_index = mtk_dpi_encoder_index,
> > };
> >
> > static const struct mtk_ddp_comp_funcs ddp_dsc = {
> > @@ -507,6 +508,25 @@ static bool mtk_drm_find_comp_in_ddp(struct
> > device *dev,
> > return false;
> > }
> >
> > +static int mtk_drm_find_comp_in_ddp_conn_path(struct device *dev,
> > + const struct
> > mtk_drm_route *routes,
> > + unsigned int routes_num,
>
> `num_routes` would be more readable.
OK, I'll change this naming.
>
> > + struct mtk_ddp_comp
> > *ddp_comp)
> > +{
> > + unsigned int i;
> > +
> > + if (!routes)
> > + return 0;
>
> if (!routes)
> return -EINVAL;
OK, I'll change it.
>
> > +
> > + for (i = 0; i < routes_num; i++)
> > + if (dev == ddp_comp[routes[i].route_ddp].dev)
> > + return BIT(routes[i].crtc_id);
> > +
> > + DRM_INFO("Failed to find comp in ddp connector table\n");
>
> This print is redundant.
OK, I'll remove this print.
>
> > +
> > + return 0;
>
> return -ENODEV;
OK, I'll change it.
>
> > +}
> > +
> > int mtk_ddp_comp_get_id(struct device_node *node,
> > enum mtk_ddp_comp_type comp_type)
> > {
> > @@ -538,6 +558,12 @@ unsigned int
> > mtk_drm_find_possible_crtc_by_comp(struct drm_device *drm,
> > private->data->third_len,
> > private->ddp_comp))
> > ret = BIT(2);
> > else
> > + ret = mtk_drm_find_comp_in_ddp_conn_path(dev,
> > + private->data-
> > >conn_routes,
> > + private->data-
> > >num_conn_routes,
> > + private-
> > >ddp_comp);
> > +
> > + if (ret == 0)
>
> if (ret < 0)
>
> > DRM_INFO("Failed to find comp in ddp table\n");
The return value of mtk_drm_find_possible_crtc_by_comp() is `unsigned
int` and it will be assigned to `unsigned int ` dpi-
>encoder.possible_crtcs in mtk_dpi_bind() directly.
So we should reassign ret to 0 when ret < 0.
I would like to change to:
if (ret <= 0) {
DRM_INFO("Failed to find comp in ddp table, ret=%d\n", ret);
ret = 0;
}
Regards,
Jason-JH.Lin
> >
> > return ret;
>
> Regards,
> Angelo
>
>
>
>
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v7 3/4] drm/mediatek: Add ability to support dynamic connector selection
2023-07-28 9:56 ` CK Hu (胡俊光)
@ 2023-07-31 10:08 ` Jason-JH Lin (林睿祥)
2023-07-31 10:27 ` CK Hu (胡俊光)
0 siblings, 1 reply; 22+ messages in thread
From: Jason-JH Lin (林睿祥) @ 2023-07-31 10:08 UTC (permalink / raw)
To: CK Hu (胡俊光), chunkuang.hu@kernel.org,
angelogioacchino.delregno@collabora.com
Cc: linux-kernel@vger.kernel.org, linux-mediatek@lists.infradead.org,
Singo Chang (張興國),
Johnson Wang (王聖鑫),
Jason-ch Chen (陳建豪),
Shawn Sung (宋孝謙),
Nancy Lin (林欣螢),
dri-devel@lists.freedesktop.org,
Project_Global_Chrome_Upstream_Group,
Nathan Lu (呂東霖),
linux-arm-kernel@lists.infradead.org, matthias.bgg@gmail.com
Hi CK,
Thanks for the reviews.
On Fri, 2023-07-28 at 09:56 +0000, CK Hu (胡俊光) wrote:
> Hi, Jason:
>
> On Fri, 2023-07-28 at 00:41 +0800, Jason-JH.Lin wrote:
> > 1. Move output drm connector from each ddp_path array to connector
> > array.
> > 2. Add dynamic select available connector flow in crtc create and
> > enable.
> >
> > Signed-off-by: Nancy Lin <nancy.lin@mediatek.com>
> > Signed-off-by: Nathan Lu <nathan.lu@mediatek.com>
> > Signed-off-by: Jason-JH.Lin <jason-jh.lin@mediatek.com>
> > ---
> > drivers/gpu/drm/mediatek/mtk_disp_drv.h | 1 +
> > drivers/gpu/drm/mediatek/mtk_dpi.c | 9 +++
> > drivers/gpu/drm/mediatek/mtk_drm_crtc.c | 75
> > ++++++++++++++++++++-
> > drivers/gpu/drm/mediatek/mtk_drm_crtc.h | 5 +-
> > drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c | 26 +++++++
> > drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h | 8 +++
> > drivers/gpu/drm/mediatek/mtk_drm_drv.c | 20 ++++--
> > drivers/gpu/drm/mediatek/mtk_drm_drv.h | 7 ++
> > 8 files changed, 145 insertions(+), 6 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > index 2254038519e1..5f07037670e9 100644
> > --- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > +++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > @@ -44,6 +44,7 @@ void mtk_dither_set_common(void __iomem *regs,
> > struct cmdq_client_reg *cmdq_reg,
> >
> > void mtk_dpi_start(struct device *dev);
> > void mtk_dpi_stop(struct device *dev);
> > +unsigned int mtk_dpi_encoder_index(struct device *dev);
> >
> > void mtk_dsi_ddp_start(struct device *dev);
> > void mtk_dsi_ddp_stop(struct device *dev);
> > diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c
> > b/drivers/gpu/drm/mediatek/mtk_dpi.c
> > index 948a53f1f4b3..e58783a9d92c 100644
> > --- a/drivers/gpu/drm/mediatek/mtk_dpi.c
> > +++ b/drivers/gpu/drm/mediatek/mtk_dpi.c
> > @@ -782,6 +782,15 @@ void mtk_dpi_stop(struct device *dev)
> > mtk_dpi_power_off(dpi);
> > }
> >
> > +unsigned int mtk_dpi_encoder_index(struct device *dev)
> > +{
> > + struct mtk_dpi *dpi = dev_get_drvdata(dev);
> > + unsigned int encoder_index = drm_encoder_index(&dpi->encoder);
> > +
> > + dev_dbg(dev, "encoder index:%d", encoder_index);
> > + return encoder_index;
> > +}
>
> I would like to separate this part with the dsi part to a patch of
> "Add
> mtk_ddp_comp_function encoder_index".
OK, I'll separate this part to another "Add mtk_ddp_comp_function
encoder_index" patch.
>
> > +
> > static int mtk_dpi_bind(struct device *dev, struct device *master,
> > void *data)
> > {
> > struct mtk_dpi *dpi = dev_get_drvdata(dev);
> > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
> > b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
> > index d40142842f85..f1f99a8da9eb 100644
> > --- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
> > +++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
> > @@ -62,6 +62,8 @@ struct mtk_drm_crtc {
> > struct mtk_mutex *mutex;
> > unsigned int ddp_comp_nr;
> > struct mtk_ddp_comp **ddp_comp;
> > + unsigned int num_conn_routes;
> > + const struct mtk_drm_route *conn_routes;
> >
> > /* lock for display hardware access */
> > struct mutex hw_lock;
> > @@ -649,6 +651,50 @@ static void mtk_drm_crtc_disable_vblank(struct
> > drm_crtc *crtc)
> > mtk_ddp_comp_disable_vblank(comp);
> > }
> >
> > +static int mtk_drm_crtc_update_output(struct drm_crtc *crtc,
> > + struct drm_atomic_state *state)
> > +{
> > + const struct mtk_drm_route *conn_routes;
> > + int crtc_index = drm_crtc_index(crtc);
> > + int i;
> > + struct device *dev;
> > + struct drm_crtc_state *crtc_state = state-
> > > crtcs[crtc_index].new_state;
> >
> > + struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc);
> > + struct mtk_drm_private *priv = crtc->dev->dev_private;
> > + unsigned int comp_id;
> > + unsigned int encoder_mask = crtc_state->encoder_mask;
> > +
> > + if (!mtk_crtc->num_conn_routes)
> > + return 0;
> > +
> > + priv = priv->all_drm_private[crtc_index];
> > + dev = priv->dev;
> > +
> > + dev_dbg(dev, "connector change:%d, encoder mask0x%x for
> > crtc%d",
> > + crtc_state->connectors_changed, encoder_mask,
> > crtc_index);
> > +
> > + if (!crtc_state->connectors_changed)
> > + return 0;
>
> Move this checking to the top of this function.
OK, I'll move this.
>
> > +
> > + conn_routes = mtk_crtc->conn_routes;
> > + for (i = 0; i < mtk_crtc->num_conn_routes; i++) {
> > + comp_id = conn_routes[i].route_ddp;
>
> conn_routes is used only once here, so drop conn_routes and
>
> comp_id = mtk_crtc->conn_routes[i].route_ddp;
>
OK, I'll drop conn_routes here.
> > + if (priv->comp_node[comp_id] &&
>
> The checking of priv->comp_mode[comp_id] is done in
> mtk_drm_crtc_create(), so this checking is redundant.
OK, I'll remove this.
> > + encoder_mask & BIT(priv-
> > > ddp_comp[comp_id].encoder_index)) {
> >
> > + struct mtk_ddp_comp *comp = &priv-
> > > ddp_comp[comp_id];
> >
> > +
> > + mtk_crtc->ddp_comp[mtk_crtc->ddp_comp_nr - 1] =
> > comp;
> > + dev_dbg(dev, "Add comp_id: %d at path index
> > %d\n",
> > + comp->id, mtk_crtc->ddp_comp_nr - 1);
> > + break;
> > + }
> > + }
>
> I think this for-loop could be simplified by ffs(encoder_mask).
It seems to simplify this statement only?
From:
if (encoder_mask & BIT(priv->ddp_comp[comp_id].encoder_index))
To:
if (ffs(encoder_mask) == priv->ddp_comp[comp_id].encoder_index)
Regards,
Jason-JH.Lin
> Regards,
> CK
+
+ dev_dbg(dev, "Update total comp num:%d", mtk_crtc-
ddp_comp_nr);
+
+ return 0;
+}
+
int mtk_drm_crtc_plane_check(struct drm_crtc *crtc, struct drm_plane
*plane,
struct mtk_plane_state *state)
{
@@ -681,6 +727,12 @@ static void mtk_drm_crtc_atomic_enable(struct
drm_crtc *crtc,
DRM_DEBUG_DRIVER("%s %d\n", __func__, crtc->base.id);
+ ret = mtk_drm_crtc_update_output(crtc, state);
+ if (ret < 0) {
+ DRM_DEV_ERROR(comp->dev, "Failed to update crtc output:
%d\n", ret);
+ return;
+ }
+
ret = pm_runtime_resume_and_get(comp->dev);
if (ret < 0) {
DRM_DEV_ERROR(comp->dev, "Failed to enable power
domain: %d\n", ret);
@@ -886,7 +938,8 @@ struct device *mtk_drm_crtc_dma_dev_get(struct
drm_crtc *crtc)
int mtk_drm_crtc_create(struct drm_device *drm_dev,
const unsigned int *path, unsigned int
path_len,
- int priv_data_index)
+ int priv_data_index, const struct mtk_drm_route
*conn_routes,
+ unsigned int num_conn_routes)
{
struct mtk_drm_private *priv = drm_dev->dev_private;
struct device *dev = drm_dev->dev;
@@ -937,6 +990,26 @@ int mtk_drm_crtc_create(struct drm_device
*drm_dev,
mtk_crtc->mmsys_dev = priv->mmsys_dev;
mtk_crtc->ddp_comp_nr = path_len;
+ if (conn_routes) {
+ struct device_node *node;
+ struct mtk_ddp_comp *comp;
+ unsigned int comp_id;
+
+ for (i = 0; i < num_conn_routes; i++) {
+ comp_id = conn_routes[i].route_ddp;
+ node = priv->comp_node[comp_id];
+ comp = &priv->ddp_comp[comp_id];
+ if (!comp) {
+ dev_err(dev, "Component %pOF not
initialized\n", node);
+ return -ENODEV;
+ }
+ mtk_ddp_comp_encoder_index_set(comp);
+ }
+
+ mtk_crtc->num_conn_routes = num_conn_routes;
+ mtk_crtc->conn_routes = conn_routes;
+ mtk_crtc->ddp_comp_nr++;
+ }
mtk_crtc->ddp_comp = devm_kmalloc_array(dev, mtk_crtc-
ddp_comp_nr,
sizeof(*mtk_crtc-
ddp_comp),
GFP_KERNEL);
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.h
b/drivers/gpu/drm/mediatek/mtk_drm_crtc.h
index 3e9046993d09..3c224595fa71 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.h
+++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.h
@@ -8,6 +8,7 @@
#include <drm/drm_crtc.h>
#include "mtk_drm_ddp_comp.h"
+#include "mtk_drm_drv.h"
#include "mtk_drm_plane.h"
#define MTK_LUT_SIZE 512
@@ -18,7 +19,9 @@ void mtk_drm_crtc_commit(struct drm_crtc *crtc);
int mtk_drm_crtc_create(struct drm_device *drm_dev,
const unsigned int *path,
unsigned int path_len,
- int priv_data_index);
+ int priv_data_index,
+ const struct mtk_drm_route *conn_routes,
+ unsigned int num_conn_routes);
int mtk_drm_crtc_plane_check(struct drm_crtc *crtc, struct drm_plane
*plane,
struct mtk_plane_state *state);
void mtk_drm_crtc_async_update(struct drm_crtc *crtc, struct
drm_plane *plane,
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
index f114da4d36a9..bc7b0a0c20db 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
+++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
@@ -304,6 +304,7 @@ static const struct mtk_ddp_comp_funcs ddp_dither
= {
static const struct mtk_ddp_comp_funcs ddp_dpi = {
.start = mtk_dpi_start,
.stop = mtk_dpi_stop,
+ .encoder_index = mtk_dpi_encoder_index,
};
static const struct mtk_ddp_comp_funcs ddp_dsc = {
@@ -507,6 +508,25 @@ static bool mtk_drm_find_comp_in_ddp(struct
device *dev,
return false;
}
+static int mtk_drm_find_comp_in_ddp_conn_path(struct device *dev,
+ const struct
mtk_drm_route *routes,
+ unsigned int routes_num,
+ struct mtk_ddp_comp
*ddp_comp)
+{
+ unsigned int i;
+
+ if (!routes)
+ return 0;
+
+ for (i = 0; i < routes_num; i++)
+ if (dev == ddp_comp[routes[i].route_ddp].dev)
+ return BIT(routes[i].crtc_id);
+
+ DRM_INFO("Failed to find comp in ddp connector table\n");
+
+ return 0;
+}
+
int mtk_ddp_comp_get_id(struct device_node *node,
enum mtk_ddp_comp_type comp_type)
{
@@ -538,6 +558,12 @@ unsigned int
mtk_drm_find_possible_crtc_by_comp(struct drm_device *drm,
private->data->third_len,
private->ddp_comp))
ret = BIT(2);
else
+ ret = mtk_drm_find_comp_in_ddp_conn_path(dev,
+ private->data-
conn_routes,
+ private->data-
num_conn_routes,
+ private-
ddp_comp);
+
+ if (ret == 0)
DRM_INFO("Failed to find comp in ddp table\n");
return ret;
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h
b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h
index febcaeef16a1..8428baca70f4 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h
+++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h
@@ -80,6 +80,7 @@ struct mtk_ddp_comp_funcs {
void (*disconnect)(struct device *dev, struct device
*mmsys_dev, unsigned int next);
void (*add)(struct device *dev, struct mtk_mutex *mutex);
void (*remove)(struct device *dev, struct mtk_mutex *mutex);
+ unsigned int (*encoder_index)(struct device *dev);
};
struct mtk_ddp_comp {
@@ -87,6 +88,7 @@ struct mtk_ddp_comp {
int irq;
unsigned int id;
const struct mtk_ddp_comp_funcs *funcs;
+ unsigned int encoder_index;
};
static inline int mtk_ddp_comp_clk_enable(struct mtk_ddp_comp *comp)
@@ -275,6 +277,12 @@ static inline bool
mtk_ddp_comp_disconnect(struct mtk_ddp_comp *comp, struct dev
return false;
}
+static inline void mtk_ddp_comp_encoder_index_set(struct
mtk_ddp_comp *comp)
+{
+ if (comp->funcs && comp->funcs->encoder_index)
+ comp->encoder_index = comp->funcs->encoder_index(comp-
dev);
+}
+
int mtk_ddp_comp_get_id(struct device_node *node,
enum mtk_ddp_comp_type comp_type);
unsigned int mtk_drm_find_possible_crtc_by_comp(struct drm_device
*drm,
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
index d2fb1fb4e682..ecd113f9908c 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
+++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
@@ -185,7 +185,10 @@ static const unsigned int mt8188_mtk_ddp_main[]
= {
DDP_COMPONENT_GAMMA,
DDP_COMPONENT_POSTMASK0,
DDP_COMPONENT_DITHER0,
- DDP_COMPONENT_DP_INTF0,
+};
+
+static const struct mtk_drm_route mt8188_mtk_ddp_main_routes[] = {
+ {0, DDP_COMPONENT_DP_INTF0},
};
static const unsigned int mt8192_mtk_ddp_main[] = {
@@ -287,6 +290,8 @@ static const struct mtk_mmsys_driver_data
mt8186_mmsys_driver_data = {
static const struct mtk_mmsys_driver_data mt8188_vdosys0_driver_data
= {
.main_path = mt8188_mtk_ddp_main,
.main_len = ARRAY_SIZE(mt8188_mtk_ddp_main),
+ .conn_routes = mt8188_mtk_ddp_main_routes,
+ .num_conn_routes = ARRAY_SIZE(mt8188_mtk_ddp_main_routes),
.mmsys_dev_num = 1,
};
@@ -419,6 +424,11 @@ static bool mtk_drm_find_mmsys_comp(struct
mtk_drm_private *private, int comp_id
if (drv_data->third_path[i] == comp_id)
return true;
+ if (drv_data->num_conn_routes)
+ for (i = 0; i < drv_data->num_conn_routes; i++)
+ if (drv_data->conn_routes[i].route_ddp ==
comp_id)
+ return true;
+
return false;
}
@@ -477,21 +487,23 @@ static int mtk_drm_kms_init(struct drm_device
*drm)
if (i == 0 && priv_n->data->main_len) {
ret = mtk_drm_crtc_create(drm, priv_n-
data->main_path,
- priv_n->data-
main_len, j);
+ priv_n->data-
main_len, j,
+ priv_n->data-
conn_routes,
+ priv_n->data-
num_conn_routes);
if (ret)
goto err_component_unbind;
continue;
} else if (i == 1 && priv_n->data->ext_len) {
ret = mtk_drm_crtc_create(drm, priv_n-
data->ext_path,
- priv_n->data-
ext_len, j);
+ priv_n->data-
ext_len, j, NULL, 0);
if (ret)
goto err_component_unbind;
continue;
} else if (i == 2 && priv_n->data->third_len) {
ret = mtk_drm_crtc_create(drm, priv_n-
data->third_path,
- priv_n->data-
third_len, j);
+ priv_n->data-
third_len, j, NULL, 0);
if (ret)
goto err_component_unbind;
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.h
b/drivers/gpu/drm/mediatek/mtk_drm_drv.h
index eb2fd45941f0..39697a591046 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_drv.h
+++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.h
@@ -22,6 +22,11 @@ struct drm_fb_helper;
struct drm_property;
struct regmap;
+struct mtk_drm_route {
+ const unsigned int crtc_id;
+ const unsigned int route_ddp;
+};
+
struct mtk_mmsys_driver_data {
const unsigned int *main_path;
unsigned int main_len;
@@ -29,6 +34,8 @@ struct mtk_mmsys_driver_data {
unsigned int ext_len;
const unsigned int *third_path;
unsigned int third_len;
+ const struct mtk_drm_route *conn_routes;
+ unsigned int num_conn_routes;
bool shadow_register;
unsigned int mmsys_id;
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: [PATCH v7 3/4] drm/mediatek: Add ability to support dynamic connector selection
2023-07-31 10:08 ` Jason-JH Lin (林睿祥)
@ 2023-07-31 10:27 ` CK Hu (胡俊光)
0 siblings, 0 replies; 22+ messages in thread
From: CK Hu (胡俊光) @ 2023-07-31 10:27 UTC (permalink / raw)
To: Jason-JH Lin (林睿祥), chunkuang.hu@kernel.org,
angelogioacchino.delregno@collabora.com
Cc: linux-kernel@vger.kernel.org, linux-mediatek@lists.infradead.org,
Singo Chang (張興國),
Johnson Wang (王聖鑫),
Jason-ch Chen (陳建豪),
Shawn Sung (宋孝謙),
Nancy Lin (林欣螢),
dri-devel@lists.freedesktop.org,
Project_Global_Chrome_Upstream_Group,
Nathan Lu (呂東霖),
linux-arm-kernel@lists.infradead.org, matthias.bgg@gmail.com
Hi, Jason:
On Mon, 2023-07-31 at 10:08 +0000, Jason-JH Lin (林睿祥) wrote:
> Hi CK,
>
> Thanks for the reviews.
>
> On Fri, 2023-07-28 at 09:56 +0000, CK Hu (胡俊光) wrote:
> > Hi, Jason:
> >
> > On Fri, 2023-07-28 at 00:41 +0800, Jason-JH.Lin wrote:
> > > 1. Move output drm connector from each ddp_path array to
> > > connector
> > > array.
> > > 2. Add dynamic select available connector flow in crtc create and
> > > enable.
> > >
> > > Signed-off-by: Nancy Lin <nancy.lin@mediatek.com>
> > > Signed-off-by: Nathan Lu <nathan.lu@mediatek.com>
> > > Signed-off-by: Jason-JH.Lin <jason-jh.lin@mediatek.com>
> > > ---
> > > drivers/gpu/drm/mediatek/mtk_disp_drv.h | 1 +
> > > drivers/gpu/drm/mediatek/mtk_dpi.c | 9 +++
> > > drivers/gpu/drm/mediatek/mtk_drm_crtc.c | 75
> > > ++++++++++++++++++++-
> > > drivers/gpu/drm/mediatek/mtk_drm_crtc.h | 5 +-
> > > drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c | 26 +++++++
> > > drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h | 8 +++
> > > drivers/gpu/drm/mediatek/mtk_drm_drv.c | 20 ++++--
> > > drivers/gpu/drm/mediatek/mtk_drm_drv.h | 7 ++
> > > 8 files changed, 145 insertions(+), 6 deletions(-)
> > >
> > >
[snip]
>
> >
> > > +
> > > + conn_routes = mtk_crtc->conn_routes;
> > > + for (i = 0; i < mtk_crtc->num_conn_routes; i++) {
> > > + comp_id = conn_routes[i].route_ddp;
> >
> > conn_routes is used only once here, so drop conn_routes and
> >
> > comp_id = mtk_crtc->conn_routes[i].route_ddp;
> >
>
> OK, I'll drop conn_routes here.
>
> > > + if (priv->comp_node[comp_id] &&
> >
> > The checking of priv->comp_mode[comp_id] is done in
> > mtk_drm_crtc_create(), so this checking is redundant.
>
> OK, I'll remove this.
>
> > > + encoder_mask & BIT(priv-
> > > > ddp_comp[comp_id].encoder_index)) {
> > >
> > > + struct mtk_ddp_comp *comp = &priv-
> > > > ddp_comp[comp_id];
> > >
> > > +
> > > + mtk_crtc->ddp_comp[mtk_crtc->ddp_comp_nr - 1] =
> > > comp;
> > > + dev_dbg(dev, "Add comp_id: %d at path index
> > > %d\n",
> > > + comp->id, mtk_crtc->ddp_comp_nr - 1);
> > > + break;
> > > + }
> > > + }
> >
> > I think this for-loop could be simplified by ffs(encoder_mask).
>
> It seems to simplify this statement only?
>
> From:
> if (encoder_mask & BIT(priv->ddp_comp[comp_id].encoder_index))
>
> To:
> if (ffs(encoder_mask) == priv->ddp_comp[comp_id].encoder_index)
Sorry, I've a mistake that I assume that encoder_index increase in the
order of conn_routes[], but it's not. So just ignore this comment.
Regards,
CK
>
>
> Regards,
> Jason-JH.Lin
>
>
> > Regards,
> > CK
>
> +
> + dev_dbg(dev, "Update total comp num:%d", mtk_crtc-
> ddp_comp_nr);
>
> +
> + return 0;
> +}
> +
> int mtk_drm_crtc_plane_check(struct drm_crtc *crtc, struct drm_plane
> *plane,
> struct mtk_plane_state *state)
> {
> @@ -681,6 +727,12 @@ static void mtk_drm_crtc_atomic_enable(struct
> drm_crtc *crtc,
>
> DRM_DEBUG_DRIVER("%s %d\n", __func__, crtc->base.id);
>
> + ret = mtk_drm_crtc_update_output(crtc, state);
> + if (ret < 0) {
> + DRM_DEV_ERROR(comp->dev, "Failed to update crtc output:
> %d\n", ret);
> + return;
> + }
> +
> ret = pm_runtime_resume_and_get(comp->dev);
> if (ret < 0) {
> DRM_DEV_ERROR(comp->dev, "Failed to enable power
> domain: %d\n", ret);
> @@ -886,7 +938,8 @@ struct device *mtk_drm_crtc_dma_dev_get(struct
> drm_crtc *crtc)
>
> int mtk_drm_crtc_create(struct drm_device *drm_dev,
> const unsigned int *path, unsigned int
> path_len,
> - int priv_data_index)
> + int priv_data_index, const struct mtk_drm_route
> *conn_routes,
> + unsigned int num_conn_routes)
> {
> struct mtk_drm_private *priv = drm_dev->dev_private;
> struct device *dev = drm_dev->dev;
> @@ -937,6 +990,26 @@ int mtk_drm_crtc_create(struct drm_device
> *drm_dev,
>
> mtk_crtc->mmsys_dev = priv->mmsys_dev;
> mtk_crtc->ddp_comp_nr = path_len;
> + if (conn_routes) {
> + struct device_node *node;
> + struct mtk_ddp_comp *comp;
> + unsigned int comp_id;
> +
> + for (i = 0; i < num_conn_routes; i++) {
> + comp_id = conn_routes[i].route_ddp;
> + node = priv->comp_node[comp_id];
> + comp = &priv->ddp_comp[comp_id];
> + if (!comp) {
> + dev_err(dev, "Component %pOF not
> initialized\n", node);
> + return -ENODEV;
> + }
> + mtk_ddp_comp_encoder_index_set(comp);
> + }
> +
> + mtk_crtc->num_conn_routes = num_conn_routes;
> + mtk_crtc->conn_routes = conn_routes;
> + mtk_crtc->ddp_comp_nr++;
> + }
> mtk_crtc->ddp_comp = devm_kmalloc_array(dev, mtk_crtc-
> ddp_comp_nr,
>
> sizeof(*mtk_crtc-
> ddp_comp),
>
> GFP_KERNEL);
> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.h
> b/drivers/gpu/drm/mediatek/mtk_drm_crtc.h
> index 3e9046993d09..3c224595fa71 100644
> --- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.h
> +++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.h
> @@ -8,6 +8,7 @@
>
> #include <drm/drm_crtc.h>
> #include "mtk_drm_ddp_comp.h"
> +#include "mtk_drm_drv.h"
> #include "mtk_drm_plane.h"
>
> #define MTK_LUT_SIZE 512
> @@ -18,7 +19,9 @@ void mtk_drm_crtc_commit(struct drm_crtc *crtc);
> int mtk_drm_crtc_create(struct drm_device *drm_dev,
> const unsigned int *path,
> unsigned int path_len,
> - int priv_data_index);
> + int priv_data_index,
> + const struct mtk_drm_route *conn_routes,
> + unsigned int num_conn_routes);
> int mtk_drm_crtc_plane_check(struct drm_crtc *crtc, struct drm_plane
> *plane,
> struct mtk_plane_state *state);
> void mtk_drm_crtc_async_update(struct drm_crtc *crtc, struct
> drm_plane *plane,
> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
> b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
> index f114da4d36a9..bc7b0a0c20db 100644
> --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
> +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
> @@ -304,6 +304,7 @@ static const struct mtk_ddp_comp_funcs ddp_dither
> = {
> static const struct mtk_ddp_comp_funcs ddp_dpi = {
> .start = mtk_dpi_start,
> .stop = mtk_dpi_stop,
> + .encoder_index = mtk_dpi_encoder_index,
> };
>
> static const struct mtk_ddp_comp_funcs ddp_dsc = {
> @@ -507,6 +508,25 @@ static bool mtk_drm_find_comp_in_ddp(struct
> device *dev,
> return false;
> }
>
> +static int mtk_drm_find_comp_in_ddp_conn_path(struct device *dev,
> + const struct
> mtk_drm_route *routes,
> + unsigned int routes_num,
> + struct mtk_ddp_comp
> *ddp_comp)
> +{
> + unsigned int i;
> +
> + if (!routes)
> + return 0;
> +
> + for (i = 0; i < routes_num; i++)
> + if (dev == ddp_comp[routes[i].route_ddp].dev)
> + return BIT(routes[i].crtc_id);
> +
> + DRM_INFO("Failed to find comp in ddp connector table\n");
> +
> + return 0;
> +}
> +
> int mtk_ddp_comp_get_id(struct device_node *node,
> enum mtk_ddp_comp_type comp_type)
> {
> @@ -538,6 +558,12 @@ unsigned int
> mtk_drm_find_possible_crtc_by_comp(struct drm_device *drm,
> private->data->third_len,
> private->ddp_comp))
> ret = BIT(2);
> else
> + ret = mtk_drm_find_comp_in_ddp_conn_path(dev,
> + private->data-
> conn_routes,
>
> + private->data-
> num_conn_routes,
>
> + private-
> ddp_comp);
>
> +
> + if (ret == 0)
> DRM_INFO("Failed to find comp in ddp table\n");
>
> return ret;
> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h
> b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h
> index febcaeef16a1..8428baca70f4 100644
> --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h
> +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h
> @@ -80,6 +80,7 @@ struct mtk_ddp_comp_funcs {
> void (*disconnect)(struct device *dev, struct device
> *mmsys_dev, unsigned int next);
> void (*add)(struct device *dev, struct mtk_mutex *mutex);
> void (*remove)(struct device *dev, struct mtk_mutex *mutex);
> + unsigned int (*encoder_index)(struct device *dev);
> };
>
> struct mtk_ddp_comp {
> @@ -87,6 +88,7 @@ struct mtk_ddp_comp {
> int irq;
> unsigned int id;
> const struct mtk_ddp_comp_funcs *funcs;
> + unsigned int encoder_index;
> };
>
> static inline int mtk_ddp_comp_clk_enable(struct mtk_ddp_comp *comp)
> @@ -275,6 +277,12 @@ static inline bool
> mtk_ddp_comp_disconnect(struct mtk_ddp_comp *comp, struct dev
> return false;
> }
>
> +static inline void mtk_ddp_comp_encoder_index_set(struct
> mtk_ddp_comp *comp)
> +{
> + if (comp->funcs && comp->funcs->encoder_index)
> + comp->encoder_index = comp->funcs->encoder_index(comp-
> dev);
>
> +}
> +
> int mtk_ddp_comp_get_id(struct device_node *node,
> enum mtk_ddp_comp_type comp_type);
> unsigned int mtk_drm_find_possible_crtc_by_comp(struct drm_device
> *drm,
> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> index d2fb1fb4e682..ecd113f9908c 100644
> --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> @@ -185,7 +185,10 @@ static const unsigned int mt8188_mtk_ddp_main[]
> = {
> DDP_COMPONENT_GAMMA,
> DDP_COMPONENT_POSTMASK0,
> DDP_COMPONENT_DITHER0,
> - DDP_COMPONENT_DP_INTF0,
> +};
> +
> +static const struct mtk_drm_route mt8188_mtk_ddp_main_routes[] = {
> + {0, DDP_COMPONENT_DP_INTF0},
> };
>
> static const unsigned int mt8192_mtk_ddp_main[] = {
> @@ -287,6 +290,8 @@ static const struct mtk_mmsys_driver_data
> mt8186_mmsys_driver_data = {
> static const struct mtk_mmsys_driver_data mt8188_vdosys0_driver_data
> = {
> .main_path = mt8188_mtk_ddp_main,
> .main_len = ARRAY_SIZE(mt8188_mtk_ddp_main),
> + .conn_routes = mt8188_mtk_ddp_main_routes,
> + .num_conn_routes = ARRAY_SIZE(mt8188_mtk_ddp_main_routes),
> .mmsys_dev_num = 1,
> };
>
> @@ -419,6 +424,11 @@ static bool mtk_drm_find_mmsys_comp(struct
> mtk_drm_private *private, int comp_id
> if (drv_data->third_path[i] == comp_id)
> return true;
>
> + if (drv_data->num_conn_routes)
> + for (i = 0; i < drv_data->num_conn_routes; i++)
> + if (drv_data->conn_routes[i].route_ddp ==
> comp_id)
> + return true;
> +
> return false;
> }
>
> @@ -477,21 +487,23 @@ static int mtk_drm_kms_init(struct drm_device
> *drm)
>
> if (i == 0 && priv_n->data->main_len) {
> ret = mtk_drm_crtc_create(drm, priv_n-
> data->main_path,
>
> - priv_n->data-
> main_len, j);
>
> + priv_n->data-
> main_len, j,
>
> + priv_n->data-
> conn_routes,
>
> + priv_n->data-
> num_conn_routes);
>
> if (ret)
> goto err_component_unbind;
>
> continue;
> } else if (i == 1 && priv_n->data->ext_len) {
> ret = mtk_drm_crtc_create(drm, priv_n-
> data->ext_path,
>
> - priv_n->data-
> ext_len, j);
>
> + priv_n->data-
> ext_len, j, NULL, 0);
>
> if (ret)
> goto err_component_unbind;
>
> continue;
> } else if (i == 2 && priv_n->data->third_len) {
> ret = mtk_drm_crtc_create(drm, priv_n-
> data->third_path,
>
> - priv_n->data-
> third_len, j);
>
> + priv_n->data-
> third_len, j, NULL, 0);
>
> if (ret)
> goto err_component_unbind;
>
> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.h
> b/drivers/gpu/drm/mediatek/mtk_drm_drv.h
> index eb2fd45941f0..39697a591046 100644
> --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.h
> +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.h
> @@ -22,6 +22,11 @@ struct drm_fb_helper;
> struct drm_property;
> struct regmap;
>
> +struct mtk_drm_route {
> + const unsigned int crtc_id;
> + const unsigned int route_ddp;
> +};
> +
> struct mtk_mmsys_driver_data {
> const unsigned int *main_path;
> unsigned int main_len;
> @@ -29,6 +34,8 @@ struct mtk_mmsys_driver_data {
> unsigned int ext_len;
> const unsigned int *third_path;
> unsigned int third_len;
> + const struct mtk_drm_route *conn_routes;
> + unsigned int num_conn_routes;
>
> bool shadow_register;
> unsigned int mmsys_id;
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v7 4/4] drm/mediatek: Add DSI support for mt8188 vdosys0
2023-07-28 8:14 ` AngeloGioacchino Del Regno
@ 2023-07-31 16:08 ` Jason-JH Lin (林睿祥)
0 siblings, 0 replies; 22+ messages in thread
From: Jason-JH Lin (林睿祥) @ 2023-07-31 16:08 UTC (permalink / raw)
To: angelogioacchino.delregno@collabora.com, chunkuang.hu@kernel.org
Cc: linux-mediatek@lists.infradead.org,
Singo Chang (張興國),
Johnson Wang (王聖鑫),
Jason-ch Chen (陳建豪),
Shawn Sung (宋孝謙),
linux-kernel@vger.kernel.org,
Nancy Lin (林欣螢),
dri-devel@lists.freedesktop.org,
Project_Global_Chrome_Upstream_Group,
Nathan Lu (呂東霖),
linux-arm-kernel@lists.infradead.org, matthias.bgg@gmail.com
Hi Angelo,
Thanks for the reviews.
On Fri, 2023-07-28 at 10:14 +0200, AngeloGioacchino Del Regno wrote:
> Il 27/07/23 18:41, Jason-JH.Lin ha scritto:
> > Add DSI as main display output for mt8188 vdosys0.
> >
>
> I would split this commit in two:
>
> 1. drm/mediatek: dsi: Support dynamic connector selection
> 2. drm/mediatek: Support DSI on MT8188 VDOSYS0
>
OK, I'll separate this commit like this.
Regards,
Jason-JH.Lin
> Where the first one sets up the mtk_dsi driver for .encoder_index(),
> and
> where the second one is a one-liner simply adding `{0,
> DDP_COMPONENT_DSI0},`
> to the MT8188 main routes array.
>
> The reason is that if you split it like that, whoever reads the
> commit history
> will immediately understand how to add dynamic connector selection to
> a MTK DRM
> driver, and how to perform the SoC-specific connection....
>
> Please!
>
> Thanks,
> Angelo
>
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v7 3/4] drm/mediatek: Add ability to support dynamic connector selection
2023-07-31 6:37 ` CK Hu (胡俊光)
@ 2023-08-02 5:59 ` Jason-JH Lin (林睿祥)
0 siblings, 0 replies; 22+ messages in thread
From: Jason-JH Lin (林睿祥) @ 2023-08-02 5:59 UTC (permalink / raw)
To: CK Hu (胡俊光), chunkuang.hu@kernel.org,
angelogioacchino.delregno@collabora.com
Cc: linux-kernel@vger.kernel.org, linux-mediatek@lists.infradead.org,
Singo Chang (張興國),
Johnson Wang (王聖鑫),
Jason-ch Chen (陳建豪),
Shawn Sung (宋孝謙),
Nancy Lin (林欣螢),
dri-devel@lists.freedesktop.org,
Project_Global_Chrome_Upstream_Group,
Nathan Lu (呂東霖),
linux-arm-kernel@lists.infradead.org, matthias.bgg@gmail.com
Hi CK,
Thanks for the reviews.
On Mon, 2023-07-31 at 06:37 +0000, CK Hu (胡俊光) wrote:
> Hi, Jason:
>
> On Fri, 2023-07-28 at 00:41 +0800, Jason-JH.Lin wrote:
> > 1. Move output drm connector from each ddp_path array to connector
> > array.
> > 2. Add dynamic select available connector flow in crtc create and
> > enable.
> >
> > Signed-off-by: Nancy Lin <nancy.lin@mediatek.com>
> > Signed-off-by: Nathan Lu <nathan.lu@mediatek.com>
> > Signed-off-by: Jason-JH.Lin <jason-jh.lin@mediatek.com>
> > ---
> > drivers/gpu/drm/mediatek/mtk_disp_drv.h | 1 +
> > drivers/gpu/drm/mediatek/mtk_dpi.c | 9 +++
> > drivers/gpu/drm/mediatek/mtk_drm_crtc.c | 75
> > ++++++++++++++++++++-
> > drivers/gpu/drm/mediatek/mtk_drm_crtc.h | 5 +-
> > drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c | 26 +++++++
> > drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h | 8 +++
> > drivers/gpu/drm/mediatek/mtk_drm_drv.c | 20 ++++--
> > drivers/gpu/drm/mediatek/mtk_drm_drv.h | 7 ++
> > 8 files changed, 145 insertions(+), 6 deletions(-)
> >
snip...
> > +static int mtk_drm_crtc_update_output(struct drm_crtc *crtc,
> > + struct drm_atomic_state *state)
>
> this function always return 0, so let the return type void.
>
OK, I'll change to void.
> > +{
> > + const struct mtk_drm_route *conn_routes;
> > + int crtc_index = drm_crtc_index(crtc);
> > + int i;
> > + struct device *dev;
> > + struct drm_crtc_state *crtc_state = state-
> > > crtcs[crtc_index].new_state;
> >
> > + struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc);
> > + struct mtk_drm_private *priv = crtc->dev->dev_private;
> > + unsigned int comp_id;
> > + unsigned int encoder_mask = crtc_state->encoder_mask;
> > +
> > + if (!mtk_crtc->num_conn_routes)
> > + return 0;
> > +
> > + priv = priv->all_drm_private[crtc_index];
> > + dev = priv->dev;
> > +
> > + dev_dbg(dev, "connector change:%d, encoder mask0x%x for
> > crtc%d",
> > + crtc_state->connectors_changed, encoder_mask,
> > crtc_index);
> > +
> > + if (!crtc_state->connectors_changed)
> > + return 0;
> > +
> > + conn_routes = mtk_crtc->conn_routes;
> > + for (i = 0; i < mtk_crtc->num_conn_routes; i++) {
> > + comp_id = conn_routes[i].route_ddp;
> > + if (priv->comp_node[comp_id] &&
See mtk_drm_crtc_create() reply below first, then see the reply here:
Since we could have invalid encoder_index = -1 assigned in
mtk_drm_crtc_create(), I'll add an encoder_index >= 0 condition here.
> > + encoder_mask & BIT(priv-
> > > ddp_comp[comp_id].encoder_index)) {
> >
> > + struct mtk_ddp_comp *comp = &priv-
> > > ddp_comp[comp_id];
> >
> > +
> > + mtk_crtc->ddp_comp[mtk_crtc->ddp_comp_nr - 1] =
> > comp;
> > + dev_dbg(dev, "Add comp_id: %d at path index
> > %d\n",
> > + comp->id, mtk_crtc->ddp_comp_nr - 1);
> > + break;
> > + }
> > + }
> > +
> > + dev_dbg(dev, "Update total comp num:%d", mtk_crtc-
> > > ddp_comp_nr);
> >
> > +
> > + return 0;
> > +}
> > +
snip...
> > int mtk_drm_crtc_create(struct drm_device *drm_dev,
> > const unsigned int *path, unsigned int
> > path_len,
> > - int priv_data_index)
> > + int priv_data_index, const struct mtk_drm_route
> > *conn_routes,
> > + unsigned int num_conn_routes)
> > {
> > struct mtk_drm_private *priv = drm_dev->dev_private;
> > struct device *dev = drm_dev->dev;
> > @@ -937,6 +990,26 @@ int mtk_drm_crtc_create(struct drm_device
> > *drm_dev,
> >
> > mtk_crtc->mmsys_dev = priv->mmsys_dev;
> > mtk_crtc->ddp_comp_nr = path_len;
> > + if (conn_routes) {
> > + struct device_node *node;
> > + struct mtk_ddp_comp *comp;
> > + unsigned int comp_id;
> > +
> > + for (i = 0; i < num_conn_routes; i++) {
> > + comp_id = conn_routes[i].route_ddp;
> > + node = priv->comp_node[comp_id];
> > + comp = &priv->ddp_comp[comp_id];
> > + if (!comp) {
> > + dev_err(dev, "Component %pOF not
> > initialized\n", node);
> > + return -ENODEV;
> > + }
> > + mtk_ddp_comp_encoder_index_set(comp);
> > + }
>
> move this device initialization checking after the device
> initialization checking of priv->comp_node[].
>
I found that we should give the invalid encoder_index to each ddp_comp,
if comp->dev doesn't exist.
Otherwise, their encoder_index will be set as 0, which is the valid bit
to encoder_mask in mtk_drm_update_output().
So I'll move this device initialization checking before
mtk_ddp_comp_encoder_index_set(comp) and set encoder_index = -1 when
device checking is failed.
> > +
> > + mtk_crtc->num_conn_routes = num_conn_routes;
> > + mtk_crtc->conn_routes = conn_routes;
> > + mtk_crtc->ddp_comp_nr++;
>
> You add ddp_comp_nr here, but later many for-loop would access
> ddp_comp[ddp_comp_nr - 1]. This is an invalid access. You may
> increase
> ddp_comp_nr in the end of this function.
>
OK, I will move this conn_routes statement to the end of this function.
Regards
Jason-JH.Lin
> Regards,
> CK
>
> > + }
> > mtk_crtc->ddp_comp = devm_kmalloc_array(dev, mtk_crtc-
> > > ddp_comp_nr,
> >
> > sizeof(*mtk_crtc-
> > > ddp_comp),
> >
> > GFP_KERNEL);
> > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.h
> > b/drivers/gpu/drm/mediatek/mtk_drm_crtc.h
> > index 3e9046993d09..3c224595fa71 100644
> > --- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.h
> > +++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.h
> > @@ -8,6 +8,7 @@
> >
> > #include <drm/drm_crtc.h>
> > #include "mtk_drm_ddp_comp.h"
> > +#include "mtk_drm_drv.h"
> > #include "mtk_drm_plane.h"
> >
> > #define MTK_LUT_SIZE 512
> > @@ -18,7 +19,9 @@ void mtk_drm_crtc_commit(struct drm_crtc *crtc);
> > int mtk_drm_crtc_create(struct drm_device *drm_dev,
> > const unsigned int *path,
> > unsigned int path_len,
> > - int priv_data_index);
> > + int priv_data_index,
> > + const struct mtk_drm_route *conn_routes,
> > + unsigned int num_conn_routes);
> > int mtk_drm_crtc_plane_check(struct drm_crtc *crtc, struct
> > drm_plane
> > *plane,
> > struct mtk_plane_state *state);
> > void mtk_drm_crtc_async_update(struct drm_crtc *crtc, struct
> > drm_plane *plane,
> > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
> > b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
> > index f114da4d36a9..bc7b0a0c20db 100644
> > --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
> > +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
> > @@ -304,6 +304,7 @@ static const struct mtk_ddp_comp_funcs
> > ddp_dither
> > = {
> > static const struct mtk_ddp_comp_funcs ddp_dpi = {
> > .start = mtk_dpi_start,
> > .stop = mtk_dpi_stop,
> > + .encoder_index = mtk_dpi_encoder_index,
> > };
> >
> > static const struct mtk_ddp_comp_funcs ddp_dsc = {
> > @@ -507,6 +508,25 @@ static bool mtk_drm_find_comp_in_ddp(struct
> > device *dev,
> > return false;
> > }
> >
> > +static int mtk_drm_find_comp_in_ddp_conn_path(struct device *dev,
> > + const struct
> > mtk_drm_route *routes,
> > + unsigned int routes_num,
> > + struct mtk_ddp_comp
> > *ddp_comp)
> > +{
> > + unsigned int i;
> > +
> > + if (!routes)
> > + return 0;
> > +
> > + for (i = 0; i < routes_num; i++)
> > + if (dev == ddp_comp[routes[i].route_ddp].dev)
> > + return BIT(routes[i].crtc_id);
> > +
> > + DRM_INFO("Failed to find comp in ddp connector table\n");
> > +
> > + return 0;
> > +}
> > +
> > int mtk_ddp_comp_get_id(struct device_node *node,
> > enum mtk_ddp_comp_type comp_type)
> > {
> > @@ -538,6 +558,12 @@ unsigned int
> > mtk_drm_find_possible_crtc_by_comp(struct drm_device *drm,
> > private->data->third_len,
> > private->ddp_comp))
> > ret = BIT(2);
> > else
> > + ret = mtk_drm_find_comp_in_ddp_conn_path(dev,
> > + private->data-
> > > conn_routes,
> >
> > + private->data-
> > > num_conn_routes,
> >
> > + private-
> > > ddp_comp);
> >
> > +
> > + if (ret == 0)
> > DRM_INFO("Failed to find comp in ddp table\n");
> >
> > return ret;
> > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h
> > b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h
> > index febcaeef16a1..8428baca70f4 100644
> > --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h
> > +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h
> > @@ -80,6 +80,7 @@ struct mtk_ddp_comp_funcs {
> > void (*disconnect)(struct device *dev, struct device
> > *mmsys_dev, unsigned int next);
> > void (*add)(struct device *dev, struct mtk_mutex *mutex);
> > void (*remove)(struct device *dev, struct mtk_mutex *mutex);
> > + unsigned int (*encoder_index)(struct device *dev);
> > };
> >
> > struct mtk_ddp_comp {
> > @@ -87,6 +88,7 @@ struct mtk_ddp_comp {
> > int irq;
> > unsigned int id;
> > const struct mtk_ddp_comp_funcs *funcs;
> > + unsigned int encoder_index;
> > };
> >
> > static inline int mtk_ddp_comp_clk_enable(struct mtk_ddp_comp
> > *comp)
> > @@ -275,6 +277,12 @@ static inline bool
> > mtk_ddp_comp_disconnect(struct mtk_ddp_comp *comp, struct dev
> > return false;
> > }
> >
> > +static inline void mtk_ddp_comp_encoder_index_set(struct
> > mtk_ddp_comp *comp)
> > +{
> > + if (comp->funcs && comp->funcs->encoder_index)
> > + comp->encoder_index = comp->funcs->encoder_index(comp-
> > > dev);
> >
> > +}
> > +
> > int mtk_ddp_comp_get_id(struct device_node *node,
> > enum mtk_ddp_comp_type comp_type);
> > unsigned int mtk_drm_find_possible_crtc_by_comp(struct drm_device
> > *drm,
> > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> > b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> > index d2fb1fb4e682..ecd113f9908c 100644
> > --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> > +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> > @@ -185,7 +185,10 @@ static const unsigned int
> > mt8188_mtk_ddp_main[]
> > = {
> > DDP_COMPONENT_GAMMA,
> > DDP_COMPONENT_POSTMASK0,
> > DDP_COMPONENT_DITHER0,
> > - DDP_COMPONENT_DP_INTF0,
> > +};
> > +
> > +static const struct mtk_drm_route mt8188_mtk_ddp_main_routes[] = {
> > + {0, DDP_COMPONENT_DP_INTF0},
> > };
> >
> > static const unsigned int mt8192_mtk_ddp_main[] = {
> > @@ -287,6 +290,8 @@ static const struct mtk_mmsys_driver_data
> > mt8186_mmsys_driver_data = {
> > static const struct mtk_mmsys_driver_data
> > mt8188_vdosys0_driver_data
> > = {
> > .main_path = mt8188_mtk_ddp_main,
> > .main_len = ARRAY_SIZE(mt8188_mtk_ddp_main),
> > + .conn_routes = mt8188_mtk_ddp_main_routes,
> > + .num_conn_routes = ARRAY_SIZE(mt8188_mtk_ddp_main_routes),
> > .mmsys_dev_num = 1,
> > };
> >
> > @@ -419,6 +424,11 @@ static bool mtk_drm_find_mmsys_comp(struct
> > mtk_drm_private *private, int comp_id
> > if (drv_data->third_path[i] == comp_id)
> > return true;
> >
> > + if (drv_data->num_conn_routes)
> > + for (i = 0; i < drv_data->num_conn_routes; i++)
> > + if (drv_data->conn_routes[i].route_ddp ==
> > comp_id)
> > + return true;
> > +
> > return false;
> > }
> >
> > @@ -477,21 +487,23 @@ static int mtk_drm_kms_init(struct drm_device
> > *drm)
> >
> > if (i == 0 && priv_n->data->main_len) {
> > ret = mtk_drm_crtc_create(drm, priv_n-
> > > data->main_path,
> >
> > - priv_n->data-
> > > main_len, j);
> >
> > + priv_n->data-
> > > main_len, j,
> >
> > + priv_n->data-
> > > conn_routes,
> >
> > + priv_n->data-
> > > num_conn_routes);
> >
> > if (ret)
> > goto err_component_unbind;
> >
> > continue;
> > } else if (i == 1 && priv_n->data->ext_len) {
> > ret = mtk_drm_crtc_create(drm, priv_n-
> > > data->ext_path,
> >
> > - priv_n->data-
> > > ext_len, j);
> >
> > + priv_n->data-
> > > ext_len, j, NULL, 0);
> >
> > if (ret)
> > goto err_component_unbind;
> >
> > continue;
> > } else if (i == 2 && priv_n->data->third_len) {
> > ret = mtk_drm_crtc_create(drm, priv_n-
> > > data->third_path,
> >
> > - priv_n->data-
> > > third_len, j);
> >
> > + priv_n->data-
> > > third_len, j, NULL, 0);
> >
> > if (ret)
> > goto err_component_unbind;
> >
> > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.h
> > b/drivers/gpu/drm/mediatek/mtk_drm_drv.h
> > index eb2fd45941f0..39697a591046 100644
> > --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.h
> > +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.h
> > @@ -22,6 +22,11 @@ struct drm_fb_helper;
> > struct drm_property;
> > struct regmap;
> >
> > +struct mtk_drm_route {
> > + const unsigned int crtc_id;
> > + const unsigned int route_ddp;
> > +};
> > +
> > struct mtk_mmsys_driver_data {
> > const unsigned int *main_path;
> > unsigned int main_len;
> > @@ -29,6 +34,8 @@ struct mtk_mmsys_driver_data {
> > unsigned int ext_len;
> > const unsigned int *third_path;
> > unsigned int third_len;
> > + const struct mtk_drm_route *conn_routes;
> > + unsigned int num_conn_routes;
> >
> > bool shadow_register;
> > unsigned int mmsys_id;
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [PATCH v7 2/4] drm/mediatek: Fix using wrong drm private data to bind mediatek-drm
2023-07-31 8:32 ` Eugen Hristev
@ 2023-08-02 7:05 ` Jason-JH Lin (林睿祥)
0 siblings, 0 replies; 22+ messages in thread
From: Jason-JH Lin (林睿祥) @ 2023-08-02 7:05 UTC (permalink / raw)
To: chunkuang.hu@kernel.org, angelogioacchino.delregno@collabora.com,
eugen.hristev@collabora.com
Cc: linux-mediatek@lists.infradead.org, linux-kernel@vger.kernel.org,
Singo Chang (張興國),
Johnson Wang (王聖鑫),
Jason-ch Chen (陳建豪),
Shawn Sung (宋孝謙),
Nancy Lin (林欣螢),
dri-devel@lists.freedesktop.org,
Project_Global_Chrome_Upstream_Group,
linux-arm-kernel@lists.infradead.org, matthias.bgg@gmail.com
Hi Eugen,
On Mon, 2023-07-31 at 11:32 +0300, Eugen Hristev wrote:
> On 7/31/23 11:21, Jason-JH Lin (林睿祥) wrote:
> > Hi Eugen,
> >
> > Thanks for the reviews.
> >
snip...
> > > > + if (temp_drm_priv->data->main_len)
> > > > + all_drm_priv[0] =
> > > > temp_drm_priv;
> > > > + else if (temp_drm_priv->data->ext_len)
> > > > + all_drm_priv[1] =
> > > > temp_drm_priv;
> > > > + else if (temp_drm_priv->data-
> > > > >third_len)
> > > > + all_drm_priv[2] =
> > > > temp_drm_priv;
> > > > + }
> > >
> > > Previously the code was assigning stuff into all_drm_priv[cnt]
> > > and
> > > incrementing it.
> > > With your change, it assigns to all_drm_priv[0], [1], [2]. Is
> > > this
> > > what
> > > you intended ?
> >
> > Because dev_get_drvdata(drm_dev) will get the driver data by
> > drm_dev.
> > Each drm_dev represents a display path.
> > e,g.
> > drm_dev of "mediatek,mt8195-vdosys0" represents main path.
> > drm_dev of "mediatek,mt8195-vdosys1" represents ext path.
> >
> > So we want to make sure all_drm_priv[] store the private data in
> > the order of display path, such as:
> > all_drm_priv[0] = the private data of main display
> > all_drm_priv[1] = the private data of ext display
> > all_drm_priv[2] = the private data of third display
>
> If you have such a hard requirement for keeping elements in an
> array,
> you are better having
> drm_priv_main_display
> drm_priv_ext_display
> drm_priv_third_display
>
> Keeping them indexed in a three elements array by having no logical
> connection between the number [0,1,2] and the actual displays that
> you
> want to save is a bit confusing.
>
Yes, I think it was a bit confusing.
But we don't know which drm_priv will go into this function first and
we want to store all drm_priv into the same array.
So it has come to this.
> One other option which I don't know if it's better or not is to have
> macros to hide your indexed approach:
> all_drm_priv[MAIN_DISPLAY] ...
> etc.
>
Thanks for your advice.
I'll try to use macros to make it better and more readable.
> >
> >
> > > If this loop has second run, you will reassign to all_drm_priv
> > > again
> > > ?
> >
> > Because the previous code will store all_drm_priv[] in the order of
> > mtk_drm_bind() was called.
> >
> > If drm_dev of ext path bound earlier than drm_dev of main path,
> > all_drm_priv[] in mtk_drm_get_all_drm_priv() may be re-assigned
> > like
> > this:
> > all_drm_priv[0]->all_drm_priv[0] = private data of ext path
> > all_drm_priv[1]->all_drm_priv[0] = private data of ext path
> > all_drm_priv[0]->all_drm_priv[1] = private data of main path
> > all_drm_priv[1]->all_drm_priv[1] = private data of main path
> >
> > But we expect all_drm_priv[] be re-assigned like this:
> > all_drm_priv[0]->all_drm_priv[0] = private data of main path
> > all_drm_priv[1]->all_drm_priv[0] = private data of main path
> > all_drm_priv[0]->all_drm_priv[1] = private data of ext path
> > all_drm_priv[1]->all_drm_priv[1] = private data of ext path
>
> This expectation does not appear to be really enforced in your code.
> You have a driver that keeps an array with all_drm_priv[], in which
> you can have main path or ext path. Then it's natural that they
> might
> have whichever order in the array you are placing them into.
> If you have a hard enforced order of keeping elements in your array,
> then an indexed array is not the best option here.
> You can either: move to a different type of array , with macros for
> indexes into the array, or, store a second array/field which keeps
> the
> index in which you saved each element.
>
> This is just my opinion , by looking at your code.
>
There is another statement in mtk_drm_kms_init() like this:
for (i = 0; i < MAX_CRTC; i++) {
for (j = 0; j< private->data->mmsys_dev_num; j++) {
priv_n = private->all_drm_private[j];
if (i == 0 && priv_n->data->main_len) {
...
} else if (i == 1 && priv_n->data->ext_len) {
...
} else if (i == 2 && priv_n->data->third_len) {
...
}
}
}
So we need to make sure that each element in all_drm_priv[] has only
one path data:
all_drm_priv[0] has main_path data only
all_drm_priv[1] has ext_path data only
all_drm_priv[2] has third_path data only
I think it would take quite a bit of effort to change this array usage.
> > > I would expect you to take `cnt` into account.
> > > Also, is it expected that all_drm_priv has holes in the array ?
> >
> > Each drm_dev will only called mtk_drm_bind() once, so all holes
> > will be filled after all drm_dev has called mtk_drm_bind().
> >
> > Do you agree with this statement? :)
>
> At the moment I cannot agree nor disagree, I don't know the code
> well
> enough. But what I can say, is that you should not rely on future
> calls
> of the function to fill up your array correctly.
>
I agree with your opinion, but at the moment, I just want to fix the
issue first by having a less modification.
I'll try to use macros to replace the array index and I'll add more
description into commit message to express the current limitation in
mtk_drm_kms_init().
Thanks again~
Regards,
Jason-JH.Lin
> >
> > Regards,
> > Jason-JH.Lin
> >
> > >
> > > Eugen
> > >
> > >
> > >
> > > > }
> > > >
> > > > if (drm_priv->data->mmsys_dev_num == cnt) {
> > >
> > >
>
>
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
^ permalink raw reply [flat|nested] 22+ messages in thread
end of thread, other threads:[~2023-08-02 7:06 UTC | newest]
Thread overview: 22+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-07-27 16:41 [PATCH v7 0/4] Add dynamic connector selection mechanism Jason-JH.Lin
2023-07-27 16:41 ` [PATCH v7 1/4] drm/mediatek: Add mmsys_dev_num to mt8188 vdosys0 driver data Jason-JH.Lin
2023-07-28 7:53 ` CK Hu (胡俊光)
2023-07-28 8:11 ` AngeloGioacchino Del Regno
2023-07-27 16:41 ` [PATCH v7 2/4] drm/mediatek: Fix using wrong drm private data to bind mediatek-drm Jason-JH.Lin
2023-07-28 8:03 ` CK Hu (胡俊光)
2023-07-28 8:11 ` AngeloGioacchino Del Regno
2023-07-28 8:47 ` Eugen Hristev
2023-07-31 8:21 ` Jason-JH Lin (林睿祥)
2023-07-31 8:32 ` Eugen Hristev
2023-08-02 7:05 ` Jason-JH Lin (林睿祥)
2023-07-27 16:41 ` [PATCH v7 3/4] drm/mediatek: Add ability to support dynamic connector selection Jason-JH.Lin
2023-07-28 8:11 ` AngeloGioacchino Del Regno
2023-07-31 9:37 ` Jason-JH Lin (林睿祥)
2023-07-28 9:56 ` CK Hu (胡俊光)
2023-07-31 10:08 ` Jason-JH Lin (林睿祥)
2023-07-31 10:27 ` CK Hu (胡俊光)
2023-07-31 6:37 ` CK Hu (胡俊光)
2023-08-02 5:59 ` Jason-JH Lin (林睿祥)
2023-07-27 16:41 ` [PATCH v7 4/4] drm/mediatek: Add DSI support for mt8188 vdosys0 Jason-JH.Lin
2023-07-28 8:14 ` AngeloGioacchino Del Regno
2023-07-31 16:08 ` Jason-JH Lin (林睿祥)
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).