<pre>
Hi Matthias,

Thanks for the reviews.

On Thu, 2023-04-27 at 14:17 +0200, Matthias Brugger wrote:
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
>
>
> On 27/04/2023 10:40, 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 | 112
> > +++++++++++++++++++-
> > 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 | 44 ++++++--
> > drivers/gpu/drm/mediatek/mtk_drm_drv.h | 8 ++
> > 8 files changed, 203 insertions(+), 11 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > index 2254038519e1..72c57442f965 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);
> > +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..765fc976e41f 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);
> > }
> >
> > +int mtk_dpi_encoder_index(struct device *dev)
> > +{
> > + struct mtk_dpi *dpi = dev_get_drvdata(dev);
> > + 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..2bafd377dcf4 100644
> > --- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
> > +++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
> > @@ -60,8 +60,12 @@ struct mtk_drm_crtc {
> > struct device *mmsys_dev;
> > struct device *dma_dev;
> > struct mtk_mutex *mutex;
> > + unsigned int ddp_comp_nr_ori;
> > + unsigned int max_ddp_comp_nr;
> > unsigned int ddp_comp_nr;
> > struct mtk_ddp_comp **ddp_comp;
> > + unsigned int conn_route_nr;
> > + const struct mtk_drm_route *conn_routes;
> >
> > /* lock for display hardware access */
> > struct mutex hw_lock;
> > @@ -649,6 +653,85 @@ static void mtk_drm_crtc_disable_vblank(struct
> > drm_crtc *crtc)
> > mtk_ddp_comp_disable_vblank(comp);
> > }
> >
> > +static unsigned int mtk_drm_crtc_max_num_route_comp(struct
> > mtk_drm_crtc *mtk_crtc)
> > +{
> > + unsigned int max_num = 0;
> > + unsigned int i;
> > +
> > + if (!mtk_crtc->conn_route_nr)
> > + return 0;
> > +
> > + for (i = 0; i < mtk_crtc->conn_route_nr; i++)
> > + if (max_num < mtk_crtc->conn_routes[i].route_len)
> > + max_num = mtk_crtc->conn_routes[i].route_len;
>
> max_num = max(mtk_crtc->conn_routes[i].route_len, max_num);
>
> Regards,
> Matthias
>

OK, I'll change this at the next version.

Regards,
Jason-JH.Lin

> > +
> > + return max_num;
> > +}
> > +
> > +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;
> > + unsigned int route_len = 0, route_index = 0;
> > +
> > + if (!mtk_crtc->conn_route_nr)
> > + 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->conn_route_nr; i++) {
> > + route_len = conn_routes[i].route_len;
> > + if (route_len > 0) {
> > + comp_id = conn_routes[i].route_ddp[route_len
> > - 1];
> > + if (priv->comp_node[comp_id]) {
> > + if ((1 << priv-
> > >ddp_comp[comp_id].encoder_index) == encoder_mask) {
> > + route_index = i;
> > + break;
> > + }
> > + }
> > + }
> > + }
> > +
> > + for (i = 0; i < route_len; i++) {
> > + struct mtk_ddp_comp *comp;
> > + struct device_node *node;
> > +
> > + comp_id = conn_routes[route_index].route_ddp[i];
> > + 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_crtc->ddp_comp[mtk_crtc->ddp_comp_nr_ori + i] =
> > comp;
> > + dev_dbg(dev, "Add comp_id: %d at path index %d\n",
> > + comp->id, mtk_crtc->ddp_comp_nr_ori + i);
> > + }
> > +
> > + mtk_crtc->ddp_comp_nr = mtk_crtc->ddp_comp_nr_ori +
> > route_len;
> > + 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 +764,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 +975,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 conn_routes_num)
> > {
> > struct mtk_drm_private *priv = drm_dev->dev_private;
> > struct device *dev = drm_dev->dev;
> > @@ -898,6 +988,7 @@ int mtk_drm_crtc_create(struct drm_device
> > *drm_dev,
> > uint gamma_lut_size = 0;
> > struct drm_crtc *tmp;
> > int crtc_i = 0;
> > + unsigned int route_len = 0, max_route_comp_num = 0;
> >
> > if (!path)
> > return 0;
> > @@ -937,7 +1028,24 @@ int mtk_drm_crtc_create(struct drm_device
> > *drm_dev,
> >
> > mtk_crtc->mmsys_dev = priv->mmsys_dev;
> > mtk_crtc->ddp_comp_nr = path_len;
> > - mtk_crtc->ddp_comp = devm_kmalloc_array(dev, mtk_crtc-
> > >ddp_comp_nr,
> > + mtk_crtc->ddp_comp_nr_ori = path_len;
> > + if (conn_routes) {
> > + unsigned int comp_id;
> > +
> > + for (i = 0; i < conn_routes_num; i++) {
> > + route_len = conn_routes[i].route_len;
> > + if (route_len > 0) {
> > + comp_id =
> > conn_routes[i].route_ddp[route_len - 1];
> > + mtk_ddp_comp_encoder_index_set(&priv-
> > >ddp_comp[comp_id]);
> > + }
> > + }
> > +
> > + mtk_crtc->conn_route_nr = conn_routes_num;
> > + mtk_crtc->conn_routes = conn_routes;
> > + }
> > + max_route_comp_num =
> > mtk_drm_crtc_max_num_route_comp(mtk_crtc);
> > + mtk_crtc->max_ddp_comp_nr = mtk_crtc->ddp_comp_nr +
> > max_route_comp_num;
> > + mtk_crtc->ddp_comp = devm_kmalloc_array(dev, mtk_crtc-
> > >max_ddp_comp_nr,
> > sizeof(*mtk_crtc-
> > >ddp_comp),
> > GFP_KERNEL);
> > if (!mtk_crtc->ddp_comp)
> > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.h
> > b/drivers/gpu/drm/mediatek/mtk_drm_crtc.h
> > index 3e9046993d09..672b9c7afee6 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 conn_routes_num);
> > 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..fe20ce26b19f 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,26 @@ 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 (mtk_drm_find_comp_in_ddp(dev,
> > routes[i].route_ddp,
> > + routes[i].route_len,
> > ddp_comp))
> > + 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 +559,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->conn_routes_num,
> > + 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..1c1d670cfe41 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);
> > + 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;
> > + 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 6dcb4ba2466c..d8c49614a107 100644
> > --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> > +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> > @@ -185,7 +185,14 @@ static const unsigned int
> > mt8188_mtk_ddp_main[] = {
> > DDP_COMPONENT_GAMMA,
> > DDP_COMPONENT_POSTMASK0,
> > DDP_COMPONENT_DITHER0,
> > - DDP_COMPONENT_DP_INTF0,
> > +};
> > +
> > +static const unsigned int mt8188_mtk_ddp_main_routes_0[] = {
> > + DDP_COMPONENT_DP_INTF0
> > +};
> > +
> > +static const struct mtk_drm_route mt8188_mtk_ddp_main_routes[] = {
> > + {0, ARRAY_SIZE(mt8188_mtk_ddp_main_routes_0),
> > mt8188_mtk_ddp_main_routes_0},
> > };
> >
> > static const unsigned int mt8192_mtk_ddp_main[] = {
> > @@ -287,6 +294,9 @@ 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,
> > + .conn_routes_num = ARRAY_SIZE(mt8188_mtk_ddp_main_routes),
> > + .mmsys_dev_num = 1,
> > };
> >
> > static const struct mtk_mmsys_driver_data
> > mt8192_mmsys_driver_data = {
> > @@ -350,6 +360,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;
> > @@ -372,9 +383,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) {
> > @@ -391,7 +411,7 @@ static bool mtk_drm_get_all_drm_priv(struct
> > device *dev)
> > static bool mtk_drm_find_mmsys_comp(struct mtk_drm_private
> > *private, int comp_id)
> > {
> > const struct mtk_mmsys_driver_data *drv_data = private->data;
> > - int i;
> > + int i, j;
> >
> > if (drv_data->main_path)
> > for (i = 0; i < drv_data->main_len; i++)
> > @@ -408,6 +428,12 @@ 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->conn_routes_num)
> > + for (i = 0; i < drv_data->conn_routes_num; i++)
> > + for (j = 0; j < drv_data-
> > >conn_routes[i].route_len; j++)
> > + if (drv_data-
> > >conn_routes[i].route_ddp[j] == comp_id)
> > + return true;
> > +
> > return false;
> > }
> >
> > @@ -466,21 +492,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->conn_routes_num);
> > 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..8dca68ea1b94 100644
> > --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.h
> > +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.h
> > @@ -22,6 +22,12 @@ struct drm_fb_helper;
> > struct drm_property;
> > struct regmap;
> >
> > +struct mtk_drm_route {
> > + const unsigned int crtc_id;
> > + const unsigned int route_len;
> > + const unsigned int *route_ddp;
> > +};
> > +
> > struct mtk_mmsys_driver_data {
> > const unsigned int *main_path;
> > unsigned int main_len;
> > @@ -29,6 +35,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 conn_routes_num;
> >
> > bool shadow_register;
> > unsigned int mmsys_id;

</pre><!--type:text--><!--{--><pre>************* MEDIATEK Confidentiality Notice ********************
The information contained in this e-mail message (including any 
attachments) may be confidential, proprietary, privileged, or otherwise
exempt from disclosure under applicable laws. It is intended to be 
conveyed only to the designated recipient(s). Any use, dissemination, 
distribution, printing, retaining or copying of this e-mail (including its 
attachments) by unintended recipient(s) is strictly prohibited and may 
be unlawful. If you are not an intended recipient of this e-mail, or believe 
that you have received this e-mail in error, please notify the sender 
immediately (by replying to this e-mail), delete any and all copies of 
this e-mail (including any attachments) from your system, and do not
disclose the content of this e-mail to any other person. Thank you!
</pre><!--}-->