Re: [Freedreno] [PATCH v4 07/19] drm/msm/dpu: drop zero features from dpu_mdp_cfg data

2023-07-02 Thread Abhinav Kumar




On 6/19/2023 2:25 PM, Dmitry Baryshkov wrote:

Drop useless zero assignments to the dpu_mdp_cfg::features field.

Reviewed-by: Marijn Suijten 
Tested-by: Marijn Suijten 
Signed-off-by: Dmitry Baryshkov 
---


Reviewed-by: Abhinav Kumar 


Re: [Freedreno] [PATCH v4 06/19] drm/msm/dpu: expand .clk_ctrls definitions

2023-07-02 Thread Abhinav Kumar




On 6/19/2023 2:25 PM, Dmitry Baryshkov wrote:

Use more standard initialisation for .clk_ctrls definitions. Define a
single .clk_ctrls field and use array init inside.

Reviewed-by: Marijn Suijten 
Tested-by: Marijn Suijten 
Signed-off-by: Dmitry Baryshkov 
---


Reviewed-by: Abhinav Kumar 


Re: [Freedreno] [PATCH v4 05/19] drm/msm/dpu: drop enum dpu_mdp and MDP_TOP value

2023-07-02 Thread Abhinav Kumar




On 6/19/2023 2:25 PM, Dmitry Baryshkov wrote:

Since there is always just a single MDP_TOP instance, drop the enum
dpu_mdp and corresponding index value.

Reviewed-by: Marijn Suijten 
Tested-by: Marijn Suijten 
Signed-off-by: Dmitry Baryshkov 
---


Reviewed-by: Abhinav Kumar 


Re: [Freedreno] [PATCH v4 04/19] drm/msm/dpu: drop dpu_mdss_cfg::mdp_count field

2023-07-02 Thread Abhinav Kumar




On 6/19/2023 2:25 PM, Dmitry Baryshkov wrote:

There is always a single MDP TOP block. Drop the mdp_count field and
stop declaring dpu_mdp_cfg instances as arrays.

Tested-by: Marijn Suijten 
Signed-off-by: Dmitry Baryshkov 
---


The change drops mdp_count and stops using the array which is fine and I 
will support that.


But looking at the pattern I saw while using core_revision, both 
DPU_MDP_VSYNC_SEL and DPU_MDP_AUDIO_SELECT can also be dropped from the 
catalog in favor of using core_revision.


Hence for that, I request you not to stop passing dpu_mdss_cfg to 
dpu_hw_mdptop_init as that has the necessary information of core_revision.



  .../msm/disp/dpu1/catalog/dpu_3_0_msm8998.h   |  7 +---
  .../msm/disp/dpu1/catalog/dpu_4_0_sdm845.h|  7 +---
  .../msm/disp/dpu1/catalog/dpu_5_0_sm8150.h|  7 +---
  .../msm/disp/dpu1/catalog/dpu_5_1_sc8180x.h   |  7 +---
  .../msm/disp/dpu1/catalog/dpu_6_0_sm8250.h|  7 +---
  .../msm/disp/dpu1/catalog/dpu_6_2_sc7180.h|  7 +---
  .../msm/disp/dpu1/catalog/dpu_6_3_sm6115.h|  7 +---
  .../msm/disp/dpu1/catalog/dpu_6_4_sm6350.h|  7 +---
  .../msm/disp/dpu1/catalog/dpu_6_5_qcm2290.h   |  7 +---
  .../msm/disp/dpu1/catalog/dpu_6_9_sm6375.h|  7 +---
  .../msm/disp/dpu1/catalog/dpu_7_0_sm8350.h|  7 +---
  .../msm/disp/dpu1/catalog/dpu_7_2_sc7280.h|  7 +---
  .../msm/disp/dpu1/catalog/dpu_8_0_sc8280xp.h  |  7 +---
  .../msm/disp/dpu1/catalog/dpu_8_1_sm8450.h|  7 +---
  .../msm/disp/dpu1/catalog/dpu_9_0_sm8550.h|  7 +---
  .../gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h|  1 -
  drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.c| 38 +++
  drivers/gpu/drm/msm/disp/dpu1/dpu_hw_top.h|  8 ++--
  drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c   |  4 +-
  19 files changed, 41 insertions(+), 115 deletions(-)

diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_3_0_msm8998.h 
b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_3_0_msm8998.h
index be0514bf27ec..e0d2ee48d733 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_3_0_msm8998.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_3_0_msm8998.h
@@ -26,8 +26,7 @@ static const struct dpu_ubwc_cfg msm8998_ubwc_cfg = {
.highest_bank_bit = 0x2,
  };
  
-static const struct dpu_mdp_cfg msm8998_mdp[] = {

-   {
+static const struct dpu_mdp_cfg msm8998_mdp = {
.name = "top_0", .id = MDP_TOP,
.base = 0x0, .len = 0x458,
.features = BIT(DPU_MDP_VSYNC_SEL),
@@ -41,7 +40,6 @@ static const struct dpu_mdp_cfg msm8998_mdp[] = {
.clk_ctrls[DPU_CLK_CTRL_DMA3] = { .reg_off = 0x2c4, .bit_off = 12 },
.clk_ctrls[DPU_CLK_CTRL_CURSOR0] = { .reg_off = 0x3a8, .bit_off = 16 },
.clk_ctrls[DPU_CLK_CTRL_CURSOR1] = { .reg_off = 0x3b0, .bit_off = 16 },
-   },
  };
  
  static const struct dpu_ctl_cfg msm8998_ctl[] = {

@@ -192,8 +190,7 @@ static const struct dpu_perf_cfg msm8998_perf_data = {
  const struct dpu_mdss_cfg dpu_msm8998_cfg = {
.caps = _dpu_caps,
.ubwc = _ubwc_cfg,
-   .mdp_count = ARRAY_SIZE(msm8998_mdp),
-   .mdp = msm8998_mdp,
+   .mdp = _mdp,
.ctl_count = ARRAY_SIZE(msm8998_ctl),
.ctl = msm8998_ctl,
.sspp_count = ARRAY_SIZE(msm8998_sspp),
diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_4_0_sdm845.h 
b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_4_0_sdm845.h
index b33472625fcb..72295d5a10dc 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_4_0_sdm845.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_4_0_sdm845.h
@@ -26,8 +26,7 @@ static const struct dpu_ubwc_cfg sdm845_ubwc_cfg = {
.highest_bank_bit = 0x2,
  };
  
-static const struct dpu_mdp_cfg sdm845_mdp[] = {

-   {
+static const struct dpu_mdp_cfg sdm845_mdp = {
.name = "top_0", .id = MDP_TOP,
.base = 0x0, .len = 0x45c,
.features = BIT(DPU_MDP_AUDIO_SELECT) | BIT(DPU_MDP_VSYNC_SEL),
@@ -39,7 +38,6 @@ static const struct dpu_mdp_cfg sdm845_mdp[] = {
.clk_ctrls[DPU_CLK_CTRL_DMA1] = { .reg_off = 0x2b4, .bit_off = 8 },
.clk_ctrls[DPU_CLK_CTRL_DMA2] = { .reg_off = 0x2bc, .bit_off = 8 },
.clk_ctrls[DPU_CLK_CTRL_DMA3] = { .reg_off = 0x2c4, .bit_off = 8 },
-   },
  };
  
  static const struct dpu_ctl_cfg sdm845_ctl[] = {

@@ -196,8 +194,7 @@ static const struct dpu_perf_cfg sdm845_perf_data = {
  const struct dpu_mdss_cfg dpu_sdm845_cfg = {
.caps = _dpu_caps,
.ubwc = _ubwc_cfg,
-   .mdp_count = ARRAY_SIZE(sdm845_mdp),
-   .mdp = sdm845_mdp,
+   .mdp = _mdp,
.ctl_count = ARRAY_SIZE(sdm845_ctl),
.ctl = sdm845_ctl,
.sspp_count = ARRAY_SIZE(sdm845_sspp),
diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_0_sm8150.h 
b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_0_sm8150.h
index 64ed10da1b73..418312b164b8 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_0_sm8150.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_0_sm8150.h
@@ -26,8 +26,7 @@ static const struct dpu_ubwc_cfg sm8150_ubwc_cfg = {

Re: [Freedreno] [PATCH v4 03/19] drm/msm/dpu: simplify peer LM handling

2023-07-02 Thread Abhinav Kumar




On 7/2/2023 6:36 PM, Dmitry Baryshkov wrote:

On Mon, 3 Jul 2023 at 04:34, Abhinav Kumar  wrote:




On 6/19/2023 2:25 PM, Dmitry Baryshkov wrote:

For each LM there is at max 1 peer LM which can be driven by the same
CTL, so there no need to have a mask instead of just an ID of the peer
LM.



The change is ok but the wording seems incorrect. Are you implying that
only LM0 and LM1 can be used for CTL0 and so-on? Because thats how this
is implying.

So any LM can be used with any CTL. Its just that each LM has only one
peer. No need to mention anything about CTL.


Please correct me if I am wrong, with pre-active CTL, each CTL could
drive any single LM or a fixed LM pair. That's what was meant here.
Would it be better if I rephrase the commit message in this way?



hmmm, even that could be misleading. Quad LM can be possible in newer 
chipsets.


Thats why I am hesitant to bring CTL into the mix. The binding is 
between LMs and not LM and CTL.





Reviewed-by: Marijn Suijten 
Tested-by: Marijn Suijten 
Signed-off-by: Dmitry Baryshkov 
---
   .../gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c|  2 +-
   .../gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h|  4 +--
   drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c| 34 +++
   3 files changed, 15 insertions(+), 25 deletions(-)

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
index 0de507d4d7b7..30fb5b1f3966 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
@@ -394,7 +394,7 @@ static const struct dpu_sspp_sub_blks qcm2290_dma_sblk_0 = 
_DMA_SBLK("8", 1);
   .features = _fmask, \
   .sblk = _sblk, \
   .pingpong = _pp, \
- .lm_pair_mask = (1 << _lmpair), \
+ .lm_pair = _lmpair, \
   .dspp = _dspp \
   }

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h
index b860784ade72..b07caa4b867e 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h
@@ -554,14 +554,14 @@ struct dpu_sspp_cfg {
* @features   bit mask identifying sub-blocks/features
* @sblk:  LM Sub-blocks information
* @pingpong:  ID of connected PingPong, PINGPONG_NONE if unsupported
- * @lm_pair_mask:  Bitmask of LMs that can be controlled by same CTL
+ * @lm_pair:   ID of LM that can be controlled by same CTL
*/
   struct dpu_lm_cfg {
   DPU_HW_BLK_INFO;
   const struct dpu_lm_sub_blks *sblk;
   u32 pingpong;
   u32 dspp;
- unsigned long lm_pair_mask;
+ unsigned long lm_pair;
   };

   /**
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c
index 471842bbb950..e333f4eeafc1 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c
@@ -253,28 +253,19 @@ static bool _dpu_rm_needs_split_display(const struct 
msm_display_topology *top)
   }

   /**
- * _dpu_rm_check_lm_peer - check if a mixer is a peer of the primary
+ * _dpu_rm_get_lm_peer - get the id of a mixer which is a peer of the primary
* @rm: dpu resource manager handle
* @primary_idx: index of primary mixer in rm->mixer_blks[]
- * @peer_idx: index of other mixer in rm->mixer_blks[]
- * Return: true if rm->mixer_blks[peer_idx] is a peer of
- *  rm->mixer_blks[primary_idx]
*/
-static bool _dpu_rm_check_lm_peer(struct dpu_rm *rm, int primary_idx,
- int peer_idx)
+static int _dpu_rm_get_lm_peer(struct dpu_rm *rm, int primary_idx)
   {
   const struct dpu_lm_cfg *prim_lm_cfg;
- const struct dpu_lm_cfg *peer_cfg;

   prim_lm_cfg = to_dpu_hw_mixer(rm->mixer_blks[primary_idx])->cap;
- peer_cfg = to_dpu_hw_mixer(rm->mixer_blks[peer_idx])->cap;

- if (!test_bit(peer_cfg->id, _lm_cfg->lm_pair_mask)) {
- DPU_DEBUG("lm %d not peer of lm %d\n", peer_cfg->id,
- peer_cfg->id);
- return false;
- }
- return true;
+ if (prim_lm_cfg->lm_pair >= LM_0 && prim_lm_cfg->lm_pair < LM_MAX)
+ return prim_lm_cfg->lm_pair - LM_0;
+ return -EINVAL;
   }

   /**
@@ -351,7 +342,7 @@ static int _dpu_rm_reserve_lms(struct dpu_rm *rm,
   int lm_idx[MAX_BLOCKS];
   int pp_idx[MAX_BLOCKS];
   int dspp_idx[MAX_BLOCKS] = {0};
- int i, j, lm_count = 0;
+ int i, lm_count = 0;

   if (!reqs->topology.num_lm) {
   DPU_ERROR("invalid number of lm: %d\n", reqs->topology.num_lm);
@@ -376,16 +367,15 @@ static int _dpu_rm_reserve_lms(struct dpu_rm *rm,
   ++lm_count;

   /* Valid primary mixer found, find matching peers */
- for (j = i + 1; j < ARRAY_SIZE(rm->mixer_blks) &&
- lm_count < reqs->topology.num_lm; j++) {
- if (!rm->mixer_blks[j])
+ if (lm_count < reqs->topology.num_lm) {
+ 

Re: [Freedreno] [PATCH v4 03/19] drm/msm/dpu: simplify peer LM handling

2023-07-02 Thread Dmitry Baryshkov
On Mon, 3 Jul 2023 at 04:34, Abhinav Kumar  wrote:
>
>
>
> On 6/19/2023 2:25 PM, Dmitry Baryshkov wrote:
> > For each LM there is at max 1 peer LM which can be driven by the same
> > CTL, so there no need to have a mask instead of just an ID of the peer
> > LM.
> >
>
> The change is ok but the wording seems incorrect. Are you implying that
> only LM0 and LM1 can be used for CTL0 and so-on? Because thats how this
> is implying.
>
> So any LM can be used with any CTL. Its just that each LM has only one
> peer. No need to mention anything about CTL.

Please correct me if I am wrong, with pre-active CTL, each CTL could
drive any single LM or a fixed LM pair. That's what was meant here.
Would it be better if I rephrase the commit message in this way?

>
> > Reviewed-by: Marijn Suijten 
> > Tested-by: Marijn Suijten 
> > Signed-off-by: Dmitry Baryshkov 
> > ---
> >   .../gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c|  2 +-
> >   .../gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h|  4 +--
> >   drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c| 34 +++
> >   3 files changed, 15 insertions(+), 25 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c 
> > b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
> > index 0de507d4d7b7..30fb5b1f3966 100644
> > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
> > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
> > @@ -394,7 +394,7 @@ static const struct dpu_sspp_sub_blks 
> > qcm2290_dma_sblk_0 = _DMA_SBLK("8", 1);
> >   .features = _fmask, \
> >   .sblk = _sblk, \
> >   .pingpong = _pp, \
> > - .lm_pair_mask = (1 << _lmpair), \
> > + .lm_pair = _lmpair, \
> >   .dspp = _dspp \
> >   }
> >
> > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h 
> > b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h
> > index b860784ade72..b07caa4b867e 100644
> > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h
> > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h
> > @@ -554,14 +554,14 @@ struct dpu_sspp_cfg {
> >* @features   bit mask identifying sub-blocks/features
> >* @sblk:  LM Sub-blocks information
> >* @pingpong:  ID of connected PingPong, PINGPONG_NONE if 
> > unsupported
> > - * @lm_pair_mask:  Bitmask of LMs that can be controlled by same CTL
> > + * @lm_pair:   ID of LM that can be controlled by same CTL
> >*/
> >   struct dpu_lm_cfg {
> >   DPU_HW_BLK_INFO;
> >   const struct dpu_lm_sub_blks *sblk;
> >   u32 pingpong;
> >   u32 dspp;
> > - unsigned long lm_pair_mask;
> > + unsigned long lm_pair;
> >   };
> >
> >   /**
> > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c 
> > b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c
> > index 471842bbb950..e333f4eeafc1 100644
> > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c
> > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c
> > @@ -253,28 +253,19 @@ static bool _dpu_rm_needs_split_display(const struct 
> > msm_display_topology *top)
> >   }
> >
> >   /**
> > - * _dpu_rm_check_lm_peer - check if a mixer is a peer of the primary
> > + * _dpu_rm_get_lm_peer - get the id of a mixer which is a peer of the 
> > primary
> >* @rm: dpu resource manager handle
> >* @primary_idx: index of primary mixer in rm->mixer_blks[]
> > - * @peer_idx: index of other mixer in rm->mixer_blks[]
> > - * Return: true if rm->mixer_blks[peer_idx] is a peer of
> > - *  rm->mixer_blks[primary_idx]
> >*/
> > -static bool _dpu_rm_check_lm_peer(struct dpu_rm *rm, int primary_idx,
> > - int peer_idx)
> > +static int _dpu_rm_get_lm_peer(struct dpu_rm *rm, int primary_idx)
> >   {
> >   const struct dpu_lm_cfg *prim_lm_cfg;
> > - const struct dpu_lm_cfg *peer_cfg;
> >
> >   prim_lm_cfg = to_dpu_hw_mixer(rm->mixer_blks[primary_idx])->cap;
> > - peer_cfg = to_dpu_hw_mixer(rm->mixer_blks[peer_idx])->cap;
> >
> > - if (!test_bit(peer_cfg->id, _lm_cfg->lm_pair_mask)) {
> > - DPU_DEBUG("lm %d not peer of lm %d\n", peer_cfg->id,
> > - peer_cfg->id);
> > - return false;
> > - }
> > - return true;
> > + if (prim_lm_cfg->lm_pair >= LM_0 && prim_lm_cfg->lm_pair < LM_MAX)
> > + return prim_lm_cfg->lm_pair - LM_0;
> > + return -EINVAL;
> >   }
> >
> >   /**
> > @@ -351,7 +342,7 @@ static int _dpu_rm_reserve_lms(struct dpu_rm *rm,
> >   int lm_idx[MAX_BLOCKS];
> >   int pp_idx[MAX_BLOCKS];
> >   int dspp_idx[MAX_BLOCKS] = {0};
> > - int i, j, lm_count = 0;
> > + int i, lm_count = 0;
> >
> >   if (!reqs->topology.num_lm) {
> >   DPU_ERROR("invalid number of lm: %d\n", 
> > reqs->topology.num_lm);
> > @@ -376,16 +367,15 @@ static int _dpu_rm_reserve_lms(struct dpu_rm *rm,
> >   ++lm_count;
> >
> >   /* Valid primary mixer found, find matching peers */
> > - for (j = i + 1; j < ARRAY_SIZE(rm->mixer_blks) &&
> > -

Re: [Freedreno] [PATCH v4 03/19] drm/msm/dpu: simplify peer LM handling

2023-07-02 Thread Abhinav Kumar




On 6/19/2023 2:25 PM, Dmitry Baryshkov wrote:

For each LM there is at max 1 peer LM which can be driven by the same
CTL, so there no need to have a mask instead of just an ID of the peer
LM.



The change is ok but the wording seems incorrect. Are you implying that 
only LM0 and LM1 can be used for CTL0 and so-on? Because thats how this 
is implying.


So any LM can be used with any CTL. Its just that each LM has only one 
peer. No need to mention anything about CTL.



Reviewed-by: Marijn Suijten 
Tested-by: Marijn Suijten 
Signed-off-by: Dmitry Baryshkov 
---
  .../gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c|  2 +-
  .../gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h|  4 +--
  drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c| 34 +++
  3 files changed, 15 insertions(+), 25 deletions(-)

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
index 0de507d4d7b7..30fb5b1f3966 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
@@ -394,7 +394,7 @@ static const struct dpu_sspp_sub_blks qcm2290_dma_sblk_0 = 
_DMA_SBLK("8", 1);
.features = _fmask, \
.sblk = _sblk, \
.pingpong = _pp, \
-   .lm_pair_mask = (1 << _lmpair), \
+   .lm_pair = _lmpair, \
.dspp = _dspp \
}
  
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h

index b860784ade72..b07caa4b867e 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h
@@ -554,14 +554,14 @@ struct dpu_sspp_cfg {
   * @features   bit mask identifying sub-blocks/features
   * @sblk:  LM Sub-blocks information
   * @pingpong:  ID of connected PingPong, PINGPONG_NONE if unsupported
- * @lm_pair_mask:  Bitmask of LMs that can be controlled by same CTL
+ * @lm_pair:   ID of LM that can be controlled by same CTL
   */
  struct dpu_lm_cfg {
DPU_HW_BLK_INFO;
const struct dpu_lm_sub_blks *sblk;
u32 pingpong;
u32 dspp;
-   unsigned long lm_pair_mask;
+   unsigned long lm_pair;
  };
  
  /**

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c
index 471842bbb950..e333f4eeafc1 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c
@@ -253,28 +253,19 @@ static bool _dpu_rm_needs_split_display(const struct 
msm_display_topology *top)
  }
  
  /**

- * _dpu_rm_check_lm_peer - check if a mixer is a peer of the primary
+ * _dpu_rm_get_lm_peer - get the id of a mixer which is a peer of the primary
   * @rm: dpu resource manager handle
   * @primary_idx: index of primary mixer in rm->mixer_blks[]
- * @peer_idx: index of other mixer in rm->mixer_blks[]
- * Return: true if rm->mixer_blks[peer_idx] is a peer of
- *  rm->mixer_blks[primary_idx]
   */
-static bool _dpu_rm_check_lm_peer(struct dpu_rm *rm, int primary_idx,
-   int peer_idx)
+static int _dpu_rm_get_lm_peer(struct dpu_rm *rm, int primary_idx)
  {
const struct dpu_lm_cfg *prim_lm_cfg;
-   const struct dpu_lm_cfg *peer_cfg;
  
  	prim_lm_cfg = to_dpu_hw_mixer(rm->mixer_blks[primary_idx])->cap;

-   peer_cfg = to_dpu_hw_mixer(rm->mixer_blks[peer_idx])->cap;
  
-	if (!test_bit(peer_cfg->id, _lm_cfg->lm_pair_mask)) {

-   DPU_DEBUG("lm %d not peer of lm %d\n", peer_cfg->id,
-   peer_cfg->id);
-   return false;
-   }
-   return true;
+   if (prim_lm_cfg->lm_pair >= LM_0 && prim_lm_cfg->lm_pair < LM_MAX)
+   return prim_lm_cfg->lm_pair - LM_0;
+   return -EINVAL;
  }
  
  /**

@@ -351,7 +342,7 @@ static int _dpu_rm_reserve_lms(struct dpu_rm *rm,
int lm_idx[MAX_BLOCKS];
int pp_idx[MAX_BLOCKS];
int dspp_idx[MAX_BLOCKS] = {0};
-   int i, j, lm_count = 0;
+   int i, lm_count = 0;
  
  	if (!reqs->topology.num_lm) {

DPU_ERROR("invalid number of lm: %d\n", reqs->topology.num_lm);
@@ -376,16 +367,15 @@ static int _dpu_rm_reserve_lms(struct dpu_rm *rm,
++lm_count;
  
  		/* Valid primary mixer found, find matching peers */

-   for (j = i + 1; j < ARRAY_SIZE(rm->mixer_blks) &&
-   lm_count < reqs->topology.num_lm; j++) {
-   if (!rm->mixer_blks[j])
+   if (lm_count < reqs->topology.num_lm) {
+   int j = _dpu_rm_get_lm_peer(rm, i);
+
+   /* ignore the peer if there is an error or if the peer 
was already processed */
+   if (j < 0 || j < i)
continue;
  
-			if (!_dpu_rm_check_lm_peer(rm, i, j)) {

-   DPU_DEBUG("lm %d not peer of lm %d\n", LM_0 + j,
-   LM_0 + i);
+   if 

Re: [Freedreno] [PATCH v4 02/19] drm/msm/dpu: always use MSM_DP/DSI_CONTROLLER_n

2023-07-02 Thread Abhinav Kumar




On 6/19/2023 2:25 PM, Dmitry Baryshkov wrote:

In several catalog entries we did not use existing MSM_DP_CONTROLLER_n
constants. Fill them in. Also use freshly defined MSM_DSI_CONTROLLER_n
for DSI interfaces.

Reviewed-by: Marijn Suijten 
Tested-by: Marijn Suijten 
Signed-off-by: Dmitry Baryshkov 
---


Reviewed-by: Abhinav Kumar 


[Freedreno] [PATCH 12/13] drm/msm: make fb debugfs file available only in KMS case

2023-07-02 Thread Dmitry Baryshkov
Don't register the 'fb' debugfs file, if there is no KMS (and so no
framebuffers).

Signed-off-by: Dmitry Baryshkov 
---
 drivers/gpu/drm/msm/msm_debugfs.c | 9 -
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/msm/msm_debugfs.c 
b/drivers/gpu/drm/msm/msm_debugfs.c
index 06fc632fd6f9..04d304eed223 100644
--- a/drivers/gpu/drm/msm/msm_debugfs.c
+++ b/drivers/gpu/drm/msm/msm_debugfs.c
@@ -266,6 +266,9 @@ static int msm_fb_show(struct seq_file *m, void *arg)
 static struct drm_info_list msm_debugfs_list[] = {
{"gem", msm_gem_show},
{ "mm", msm_mm_show },
+};
+
+static struct drm_info_list msm_kms_debugfs_list[] = {
{ "fb", msm_fb_show },
 };
 
@@ -314,9 +317,13 @@ void msm_debugfs_init(struct drm_minor *minor)
debugfs_create_file("gpu", S_IRUSR, minor->debugfs_root,
dev, _gpu_fops);
 
-   if (priv->kms)
+   if (priv->kms) {
+   drm_debugfs_create_files(msm_kms_debugfs_list,
+ARRAY_SIZE(msm_kms_debugfs_list),
+minor->debugfs_root, minor);
debugfs_create_file("kms", S_IRUSR, minor->debugfs_root,
dev, _kms_fops);
+   }
 
debugfs_create_u32("hangcheck_period_ms", 0600, minor->debugfs_root,
>hangcheck_period);
-- 
2.39.2



[Freedreno] [PATCH 13/13] drm/msm: carve out KMS code from msm_drv.c

2023-07-02 Thread Dmitry Baryshkov
The msm_drv.c contains generic code intermixed with KMS handling code.
Move all KMS-related code to a separate msm_kms.c file, cleaning up init
code while doing this move. This also prevents msm driver from registering
modesetting / atomic interfaces in the headless case.

Signed-off-by: Dmitry Baryshkov 
---
 drivers/gpu/drm/msm/Makefile  |   1 +
 drivers/gpu/drm/msm/msm_drv.c | 347 ++
 drivers/gpu/drm/msm/msm_kms.c | 345 +
 drivers/gpu/drm/msm/msm_kms.h |   3 +
 4 files changed, 366 insertions(+), 330 deletions(-)
 create mode 100644 drivers/gpu/drm/msm/msm_kms.c

diff --git a/drivers/gpu/drm/msm/Makefile b/drivers/gpu/drm/msm/Makefile
index 8d02d8c33069..49671364fdcf 100644
--- a/drivers/gpu/drm/msm/Makefile
+++ b/drivers/gpu/drm/msm/Makefile
@@ -106,6 +106,7 @@ msm-y += \
msm_gpu_devfreq.o \
msm_io_utils.o \
msm_iommu.o \
+   msm_kms.o \
msm_perf.o \
msm_rd.o \
msm_ringbuffer.o \
diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c
index 6b734be17f3f..73a063f507ee 100644
--- a/drivers/gpu/drm/msm/msm_drv.c
+++ b/drivers/gpu/drm/msm/msm_drv.c
@@ -6,30 +6,17 @@
  */
 
 #include 
-#include 
-#include 
 #include 
-#include 
 #include 
-#include 
 
-#include 
-#include 
 #include 
 #include 
 #include 
-#include 
 #include 
-#include 
 
-#include "disp/msm_disp_snapshot.h"
 #include "msm_drv.h"
 #include "msm_debugfs.h"
-#include "msm_fence.h"
-#include "msm_gem.h"
-#include "msm_gpu.h"
 #include "msm_kms.h"
-#include "msm_mmu.h"
 #include "adreno/adreno_gpu.h"
 
 /*
@@ -56,16 +43,6 @@
 
 static void msm_deinit_vram(struct drm_device *ddev);
 
-static const struct drm_mode_config_funcs mode_config_funcs = {
-   .fb_create = msm_framebuffer_create,
-   .atomic_check = msm_atomic_check,
-   .atomic_commit = drm_atomic_helper_commit,
-};
-
-static const struct drm_mode_config_helper_funcs mode_config_helper_funcs = {
-   .atomic_commit_tail = msm_atomic_commit_tail,
-};
-
 static char *vram = "16m";
 MODULE_PARM_DESC(vram, "Configure VRAM size (for devices without 
IOMMU/GPUMMU)");
 module_param(vram, charp, 0);
@@ -83,125 +60,11 @@ DECLARE_FAULT_ATTR(fail_gem_alloc);
 DECLARE_FAULT_ATTR(fail_gem_iova);
 #endif
 
-static irqreturn_t msm_irq(int irq, void *arg)
-{
-   struct drm_device *dev = arg;
-   struct msm_drm_private *priv = dev->dev_private;
-   struct msm_kms *kms = priv->kms;
-
-   BUG_ON(!kms);
-
-   return kms->funcs->irq(kms);
-}
-
-static void msm_irq_preinstall(struct drm_device *dev)
-{
-   struct msm_drm_private *priv = dev->dev_private;
-   struct msm_kms *kms = priv->kms;
-
-   BUG_ON(!kms);
-
-   kms->funcs->irq_preinstall(kms);
-}
-
-static int msm_irq_postinstall(struct drm_device *dev)
-{
-   struct msm_drm_private *priv = dev->dev_private;
-   struct msm_kms *kms = priv->kms;
-
-   BUG_ON(!kms);
-
-   if (kms->funcs->irq_postinstall)
-   return kms->funcs->irq_postinstall(kms);
-
-   return 0;
-}
-
-static int msm_irq_install(struct drm_device *dev, unsigned int irq)
-{
-   struct msm_drm_private *priv = dev->dev_private;
-   struct msm_kms *kms = priv->kms;
-   int ret;
-
-   if (irq == IRQ_NOTCONNECTED)
-   return -ENOTCONN;
-
-   msm_irq_preinstall(dev);
-
-   ret = request_irq(irq, msm_irq, 0, dev->driver->name, dev);
-   if (ret)
-   return ret;
-
-   kms->irq_requested = true;
-
-   ret = msm_irq_postinstall(dev);
-   if (ret) {
-   free_irq(irq, dev);
-   return ret;
-   }
-
-   return 0;
-}
-
-static void msm_irq_uninstall(struct drm_device *dev)
-{
-   struct msm_drm_private *priv = dev->dev_private;
-   struct msm_kms *kms = priv->kms;
-
-   kms->funcs->irq_uninstall(kms);
-   if (kms->irq_requested)
-   free_irq(kms->irq, dev);
-}
-
-struct msm_vblank_work {
-   struct work_struct work;
-   int crtc_id;
-   bool enable;
-   struct msm_drm_private *priv;
-};
-
-static void vblank_ctrl_worker(struct work_struct *work)
-{
-   struct msm_vblank_work *vbl_work = container_of(work,
-   struct msm_vblank_work, work);
-   struct msm_drm_private *priv = vbl_work->priv;
-   struct msm_kms *kms = priv->kms;
-
-   if (vbl_work->enable)
-   kms->funcs->enable_vblank(kms, priv->crtcs[vbl_work->crtc_id]);
-   else
-   kms->funcs->disable_vblank(kms, priv->crtcs[vbl_work->crtc_id]);
-
-   kfree(vbl_work);
-}
-
-static int vblank_ctrl_queue_work(struct msm_drm_private *priv,
-   int crtc_id, bool enable)
-{
-   struct msm_vblank_work *vbl_work;
-
-   vbl_work = kzalloc(sizeof(*vbl_work), GFP_ATOMIC);
-   if (!vbl_work)
-   return -ENOMEM;
-
-   INIT_WORK(_work->work, 

[Freedreno] [PATCH 11/13] drm/msm: only register 'kms' debug file if KMS is used

2023-07-02 Thread Dmitry Baryshkov
There is little point in having the empty debugfs file which always
returns -ENODEV. Change this file to be created only if KMS is actually
used.

Signed-off-by: Dmitry Baryshkov 
---
 drivers/gpu/drm/msm/msm_debugfs.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/msm/msm_debugfs.c 
b/drivers/gpu/drm/msm/msm_debugfs.c
index a0a936f80ae3..06fc632fd6f9 100644
--- a/drivers/gpu/drm/msm/msm_debugfs.c
+++ b/drivers/gpu/drm/msm/msm_debugfs.c
@@ -314,8 +314,9 @@ void msm_debugfs_init(struct drm_minor *minor)
debugfs_create_file("gpu", S_IRUSR, minor->debugfs_root,
dev, _gpu_fops);
 
-   debugfs_create_file("kms", S_IRUSR, minor->debugfs_root,
-   dev, _kms_fops);
+   if (priv->kms)
+   debugfs_create_file("kms", S_IRUSR, minor->debugfs_root,
+   dev, _kms_fops);
 
debugfs_create_u32("hangcheck_period_ms", 0600, minor->debugfs_root,
>hangcheck_period);
-- 
2.39.2



[Freedreno] [PATCH 09/13] drm/msm: rename msm_drv_shutdown() to msm_kms_shutdown()

2023-07-02 Thread Dmitry Baryshkov
The msm_drv_shutdown function should only be used in the KMS case.
Rename it accordingly.

Signed-off-by: Dmitry Baryshkov 
---
 drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c  | 2 +-
 drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c | 2 +-
 drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c | 2 +-
 drivers/gpu/drm/msm/msm_drv.c| 2 +-
 drivers/gpu/drm/msm/msm_drv.h| 2 +-
 5 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
index 8a5249907f53..993799c0945e 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
@@ -1320,7 +1320,7 @@ MODULE_DEVICE_TABLE(of, dpu_dt_match);
 static struct platform_driver dpu_driver = {
.probe = dpu_dev_probe,
.remove = dpu_dev_remove,
-   .shutdown = msm_drv_shutdown,
+   .shutdown = msm_kms_shutdown,
.driver = {
.name = "msm_dpu",
.of_match_table = dpu_dt_match,
diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c 
b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
index 302f3d10a464..e35d450492f1 100644
--- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
+++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
@@ -572,7 +572,7 @@ MODULE_DEVICE_TABLE(of, mdp4_dt_match);
 static struct platform_driver mdp4_platform_driver = {
.probe  = mdp4_probe,
.remove = mdp4_remove,
-   .shutdown   = msm_drv_shutdown,
+   .shutdown   = msm_kms_shutdown,
.driver = {
.name   = "mdp4",
.of_match_table = mdp4_dt_match,
diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c 
b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
index 7572e8616961..edd4e68b6e3a 100644
--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
+++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
@@ -976,7 +976,7 @@ MODULE_DEVICE_TABLE(of, mdp5_dt_match);
 static struct platform_driver mdp5_driver = {
.probe = mdp5_dev_probe,
.remove = mdp5_dev_remove,
-   .shutdown = msm_drv_shutdown,
+   .shutdown = msm_kms_shutdown,
.driver = {
.name = "msm_mdp",
.of_match_table = mdp5_dt_match,
diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c
index 971c008e82cb..e929da9360e4 100644
--- a/drivers/gpu/drm/msm/msm_drv.c
+++ b/drivers/gpu/drm/msm/msm_drv.c
@@ -1281,7 +1281,7 @@ static int msm_pdev_remove(struct platform_device *pdev)
return 0;
 }
 
-void msm_drv_shutdown(struct platform_device *pdev)
+void msm_kms_shutdown(struct platform_device *pdev)
 {
struct msm_drm_private *priv = platform_get_drvdata(pdev);
struct drm_device *drm = priv ? priv->dev : NULL;
diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
index 67450dccc5a6..17f22b283c30 100644
--- a/drivers/gpu/drm/msm/msm_drv.h
+++ b/drivers/gpu/drm/msm/msm_drv.h
@@ -561,7 +561,7 @@ void msm_kms_pm_complete(struct device *dev);
 int msm_drv_probe(struct device *dev,
int (*kms_init)(struct drm_device *dev),
struct msm_kms *kms);
-void msm_drv_shutdown(struct platform_device *pdev);
+void msm_kms_shutdown(struct platform_device *pdev);
 
 
 #endif /* __MSM_DRV_H__ */
-- 
2.39.2



[Freedreno] [PATCH 07/13] drm/msm: rename msm_pm_prepare/complete to note the KMS nature

2023-07-02 Thread Dmitry Baryshkov
Rename the msm_pm_prepare() and msm_pm_complete() to
msm_kms_pm_prepare() and msm_kms_pm_complete() consequently.

Signed-off-by: Dmitry Baryshkov 
---
 drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c  | 4 ++--
 drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c | 4 ++--
 drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c | 4 ++--
 drivers/gpu/drm/msm/msm_drv.c| 4 ++--
 drivers/gpu/drm/msm/msm_drv.h| 4 ++--
 5 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
index 5b04c37c102f..8a5249907f53 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
@@ -1293,8 +1293,8 @@ static const struct dev_pm_ops dpu_pm_ops = {
SET_RUNTIME_PM_OPS(dpu_runtime_suspend, dpu_runtime_resume, NULL)
SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend,
pm_runtime_force_resume)
-   .prepare = msm_pm_prepare,
-   .complete = msm_pm_complete,
+   .prepare = msm_kms_pm_prepare,
+   .complete = msm_kms_pm_complete,
 };
 
 static const struct of_device_id dpu_dt_match[] = {
diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c 
b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
index a3f1da3382e8..302f3d10a464 100644
--- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
+++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
@@ -501,8 +501,8 @@ static int mdp4_kms_init(struct drm_device *dev)
 }
 
 static const struct dev_pm_ops mdp4_pm_ops = {
-   .prepare = msm_pm_prepare,
-   .complete = msm_pm_complete,
+   .prepare = msm_kms_pm_prepare,
+   .complete = msm_kms_pm_complete,
 };
 
 static int mdp4_probe(struct platform_device *pdev)
diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c 
b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
index 52f176e08690..7572e8616961 100644
--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
+++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
@@ -961,8 +961,8 @@ static __maybe_unused int mdp5_runtime_resume(struct device 
*dev)
 
 static const struct dev_pm_ops mdp5_pm_ops = {
SET_RUNTIME_PM_OPS(mdp5_runtime_suspend, mdp5_runtime_resume, NULL)
-   .prepare = msm_pm_prepare,
-   .complete = msm_pm_complete,
+   .prepare = msm_kms_pm_prepare,
+   .complete = msm_kms_pm_complete,
 };
 
 static const struct of_device_id mdp5_dt_match[] = {
diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c
index a85eb7b21061..ee27837516fc 100644
--- a/drivers/gpu/drm/msm/msm_drv.c
+++ b/drivers/gpu/drm/msm/msm_drv.c
@@ -1101,7 +1101,7 @@ static const struct drm_driver msm_driver = {
.patchlevel = MSM_VERSION_PATCHLEVEL,
 };
 
-int msm_pm_prepare(struct device *dev)
+int msm_kms_pm_prepare(struct device *dev)
 {
struct msm_drm_private *priv = dev_get_drvdata(dev);
struct drm_device *ddev = priv ? priv->dev : NULL;
@@ -1112,7 +1112,7 @@ int msm_pm_prepare(struct device *dev)
return drm_mode_config_helper_suspend(ddev);
 }
 
-void msm_pm_complete(struct device *dev)
+void msm_kms_pm_complete(struct device *dev)
 {
struct msm_drm_private *priv = dev_get_drvdata(dev);
struct drm_device *ddev = priv ? priv->dev : NULL;
diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
index deb5ee236a2a..67450dccc5a6 100644
--- a/drivers/gpu/drm/msm/msm_drv.h
+++ b/drivers/gpu/drm/msm/msm_drv.h
@@ -555,8 +555,8 @@ static inline unsigned long timeout_to_jiffies(const 
ktime_t *timeout)
 
 extern const struct component_master_ops msm_drm_ops;
 
-int msm_pm_prepare(struct device *dev);
-void msm_pm_complete(struct device *dev);
+int msm_kms_pm_prepare(struct device *dev);
+void msm_kms_pm_complete(struct device *dev);
 
 int msm_drv_probe(struct device *dev,
int (*kms_init)(struct drm_device *dev),
-- 
2.39.2



[Freedreno] [PATCH 10/13] drm/msm: switch to drmm_mode_config_init()

2023-07-02 Thread Dmitry Baryshkov
Switch to drmm_mode_config_init() instead of drm_mode_config_init().
Drop drm_mode_config_cleanup() calls.

Signed-off-by: Dmitry Baryshkov 
---
 drivers/gpu/drm/msm/msm_drv.c | 11 +--
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c
index e929da9360e4..6b734be17f3f 100644
--- a/drivers/gpu/drm/msm/msm_drv.c
+++ b/drivers/gpu/drm/msm/msm_drv.c
@@ -238,8 +238,6 @@ static int msm_drm_uninit(struct device *dev)
if (kms)
msm_disp_snapshot_destroy(ddev);
 
-   drm_mode_config_cleanup(ddev);
-
if (kms) {
pm_runtime_get_sync(dev);
msm_irq_uninstall(ddev);
@@ -439,11 +437,13 @@ static int msm_drm_init(struct device *dev, const struct 
drm_driver *drv)
might_lock(>lru.lock);
fs_reclaim_release(GFP_KERNEL);
 
-   drm_mode_config_init(ddev);
+   ret = drmm_mode_config_init(ddev);
+   if (ret)
+   goto err_destroy_wq;
 
ret = msm_init_vram(ddev);
if (ret)
-   goto err_cleanup_mode_config;
+   goto err_destroy_wq;
 
dma_set_max_seg_size(dev, UINT_MAX);
 
@@ -551,8 +551,7 @@ static int msm_drm_init(struct device *dev, const struct 
drm_driver *drv)
 
 err_deinit_vram:
msm_deinit_vram(ddev);
-err_cleanup_mode_config:
-   drm_mode_config_cleanup(ddev);
+err_destroy_wq:
destroy_workqueue(priv->wq);
 err_put_dev:
drm_dev_put(ddev);
-- 
2.39.2



[Freedreno] [PATCH 08/13] drm/msm: remove shutdown callback from msm_platform_driver

2023-07-02 Thread Dmitry Baryshkov
The msm_drv_shutdown only makes sense for the KMS-enabled devices, while
msm_platform_driver is only used in the headless case. Remove the
shutdown callback from the driver structure.

Signed-off-by: Dmitry Baryshkov 
---
 drivers/gpu/drm/msm/msm_drv.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c
index ee27837516fc..971c008e82cb 100644
--- a/drivers/gpu/drm/msm/msm_drv.c
+++ b/drivers/gpu/drm/msm/msm_drv.c
@@ -1300,7 +1300,6 @@ void msm_drv_shutdown(struct platform_device *pdev)
 static struct platform_driver msm_platform_driver = {
.probe  = msm_pdev_probe,
.remove = msm_pdev_remove,
-   .shutdown   = msm_drv_shutdown,
.driver = {
.name   = "msm",
},
-- 
2.39.2



[Freedreno] [PATCH 05/13] drm/msm: remove msm_drm_private::bridges field

2023-07-02 Thread Dmitry Baryshkov
As all output devices have switched to devm_drm_bridge_add(), we can
drop the bridges array from struct msm_drm_private.

Signed-off-by: Dmitry Baryshkov 
---
 drivers/gpu/drm/msm/msm_drv.c | 4 
 drivers/gpu/drm/msm/msm_drv.h | 3 ---
 2 files changed, 7 deletions(-)

diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c
index f06a06ab26fa..9fe789a546f5 100644
--- a/drivers/gpu/drm/msm/msm_drv.c
+++ b/drivers/gpu/drm/msm/msm_drv.c
@@ -240,10 +240,6 @@ static int msm_drm_uninit(struct device *dev)
 
drm_mode_config_cleanup(ddev);
 
-   for (i = 0; i < priv->num_bridges; i++)
-   drm_bridge_remove(priv->bridges[i]);
-   priv->num_bridges = 0;
-
if (kms) {
pm_runtime_get_sync(dev);
msm_irq_uninstall(ddev);
diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
index 6787bd302dfa..deb5ee236a2a 100644
--- a/drivers/gpu/drm/msm/msm_drv.h
+++ b/drivers/gpu/drm/msm/msm_drv.h
@@ -202,9 +202,6 @@ struct msm_drm_private {
 
struct msm_drm_thread event_thread[MAX_CRTCS];
 
-   unsigned int num_bridges;
-   struct drm_bridge *bridges[MAX_BRIDGES];
-
/* VRAM carveout, used when no IOMMU: */
struct {
unsigned long size;
-- 
2.39.2



[Freedreno] [PATCH 06/13] drm/msm: drop pm ops from the headless msm driver

2023-07-02 Thread Dmitry Baryshkov
The msm_pm_prepare()/msm_pm_complete() only make sense for the
KMS-enabled devices, they have priv->kms guards inside. Drop global
msm_pm_ops, which were used only by the headless msm device.

Signed-off-by: Dmitry Baryshkov 
---
 drivers/gpu/drm/msm/msm_drv.c | 6 --
 1 file changed, 6 deletions(-)

diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c
index 9fe789a546f5..a85eb7b21061 100644
--- a/drivers/gpu/drm/msm/msm_drv.c
+++ b/drivers/gpu/drm/msm/msm_drv.c
@@ -1123,11 +1123,6 @@ void msm_pm_complete(struct device *dev)
drm_mode_config_helper_resume(ddev);
 }
 
-static const struct dev_pm_ops msm_pm_ops = {
-   .prepare = msm_pm_prepare,
-   .complete = msm_pm_complete,
-};
-
 /*
  * Componentized driver support:
  */
@@ -1308,7 +1303,6 @@ static struct platform_driver msm_platform_driver = {
.shutdown   = msm_drv_shutdown,
.driver = {
.name   = "msm",
-   .pm = _pm_ops,
},
 };
 
-- 
2.39.2



[Freedreno] [PATCH 02/13] drm/msm/hdmi: switch to devm_drm_bridge_add()

2023-07-02 Thread Dmitry Baryshkov
Make MSM HDMI driver use devm_drm_bridge_add() instead of plain
drm_bridge_add(). As the driver doesn't require any additional cleanup,
stop adding created bridge to the priv->bridges array.

Signed-off-by: Dmitry Baryshkov 
---
 drivers/gpu/drm/msm/hdmi/hdmi.c| 22 +--
 drivers/gpu/drm/msm/hdmi/hdmi.h|  5 ++---
 drivers/gpu/drm/msm/hdmi/hdmi_bridge.c | 30 --
 drivers/gpu/drm/msm/hdmi/hdmi_hpd.c|  3 +--
 4 files changed, 17 insertions(+), 43 deletions(-)

diff --git a/drivers/gpu/drm/msm/hdmi/hdmi.c b/drivers/gpu/drm/msm/hdmi/hdmi.c
index 3132105a2a43..1967d88d93a1 100644
--- a/drivers/gpu/drm/msm/hdmi/hdmi.c
+++ b/drivers/gpu/drm/msm/hdmi/hdmi.c
@@ -158,24 +158,16 @@ static int msm_hdmi_init(struct hdmi *hdmi)
 int msm_hdmi_modeset_init(struct hdmi *hdmi,
struct drm_device *dev, struct drm_encoder *encoder)
 {
-   struct msm_drm_private *priv = dev->dev_private;
int ret;
 
-   if (priv->num_bridges == ARRAY_SIZE(priv->bridges)) {
-   DRM_DEV_ERROR(dev->dev, "too many bridges\n");
-   return -ENOSPC;
-   }
-
hdmi->dev = dev;
hdmi->encoder = encoder;
 
hdmi_audio_infoframe_init(>audio.infoframe);
 
-   hdmi->bridge = msm_hdmi_bridge_init(hdmi);
-   if (IS_ERR(hdmi->bridge)) {
-   ret = PTR_ERR(hdmi->bridge);
+   ret = msm_hdmi_bridge_init(hdmi);
+   if (ret) {
DRM_DEV_ERROR(dev->dev, "failed to create HDMI bridge: %d\n", 
ret);
-   hdmi->bridge = NULL;
goto fail;
}
 
@@ -213,16 +205,9 @@ int msm_hdmi_modeset_init(struct hdmi *hdmi,
goto fail;
}
 
-   priv->bridges[priv->num_bridges++]   = hdmi->bridge;
-
return 0;
 
 fail:
-   /* bridge is normally destroyed by drm: */
-   if (hdmi->bridge) {
-   msm_hdmi_bridge_destroy(hdmi->bridge);
-   hdmi->bridge = NULL;
-   }
if (hdmi->connector) {
hdmi->connector->funcs->destroy(hdmi->connector);
hdmi->connector = NULL;
@@ -393,6 +378,9 @@ static void msm_hdmi_unbind(struct device *dev, struct 
device *master,
if (priv->hdmi->audio_pdev)
platform_device_unregister(priv->hdmi->audio_pdev);
 
+   if (priv->hdmi->bridge)
+   msm_hdmi_hpd_disable(priv->hdmi);
+
msm_hdmi_destroy(priv->hdmi);
priv->hdmi = NULL;
}
diff --git a/drivers/gpu/drm/msm/hdmi/hdmi.h b/drivers/gpu/drm/msm/hdmi/hdmi.h
index e8dbee50637f..ec5786440391 100644
--- a/drivers/gpu/drm/msm/hdmi/hdmi.h
+++ b/drivers/gpu/drm/msm/hdmi/hdmi.h
@@ -224,14 +224,13 @@ void msm_hdmi_audio_set_sample_rate(struct hdmi *hdmi, 
int rate);
  * hdmi bridge:
  */
 
-struct drm_bridge *msm_hdmi_bridge_init(struct hdmi *hdmi);
-void msm_hdmi_bridge_destroy(struct drm_bridge *bridge);
+int msm_hdmi_bridge_init(struct hdmi *hdmi);
 
 void msm_hdmi_hpd_irq(struct drm_bridge *bridge);
 enum drm_connector_status msm_hdmi_bridge_detect(
struct drm_bridge *bridge);
 int msm_hdmi_hpd_enable(struct drm_bridge *bridge);
-void msm_hdmi_hpd_disable(struct hdmi_bridge *hdmi_bridge);
+void msm_hdmi_hpd_disable(struct hdmi *hdmi);
 
 /*
  * i2c adapter for ddc:
diff --git a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c 
b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c
index 9b1391d27ed3..0b7a6a56677e 100644
--- a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c
+++ b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c
@@ -11,14 +11,6 @@
 #include "msm_kms.h"
 #include "hdmi.h"
 
-void msm_hdmi_bridge_destroy(struct drm_bridge *bridge)
-{
-   struct hdmi_bridge *hdmi_bridge = to_hdmi_bridge(bridge);
-
-   msm_hdmi_hpd_disable(hdmi_bridge);
-   drm_bridge_remove(bridge);
-}
-
 static void msm_hdmi_power_on(struct drm_bridge *bridge)
 {
struct drm_device *dev = bridge->dev;
@@ -317,7 +309,7 @@ msm_hdmi_hotplug_work(struct work_struct *work)
 }
 
 /* initialize bridge */
-struct drm_bridge *msm_hdmi_bridge_init(struct hdmi *hdmi)
+int msm_hdmi_bridge_init(struct hdmi *hdmi)
 {
struct drm_bridge *bridge = NULL;
struct hdmi_bridge *hdmi_bridge;
@@ -325,10 +317,8 @@ struct drm_bridge *msm_hdmi_bridge_init(struct hdmi *hdmi)
 
hdmi_bridge = devm_kzalloc(hdmi->dev->dev,
sizeof(*hdmi_bridge), GFP_KERNEL);
-   if (!hdmi_bridge) {
-   ret = -ENOMEM;
-   goto fail;
-   }
+   if (!hdmi_bridge)
+   return -ENOMEM;
 
hdmi_bridge->hdmi = hdmi;
INIT_WORK(_bridge->hpd_work, msm_hdmi_hotplug_work);
@@ -341,17 +331,15 @@ struct drm_bridge *msm_hdmi_bridge_init(struct hdmi *hdmi)
DRM_BRIDGE_OP_DETECT |
DRM_BRIDGE_OP_EDID;
 
-   drm_bridge_add(bridge);
+   ret = devm_drm_bridge_add(>pdev->dev, bridge);
+   if (ret)
+   return ret;
 
ret = 

[Freedreno] [PATCH 04/13] drm/msm/dp: switch to devm_drm_bridge_add()

2023-07-02 Thread Dmitry Baryshkov
Make MSM DP driver use devm_drm_bridge_add() instead of plain
drm_bridge_add(). As the driver doesn't require any additional cleanup,
stop adding created bridge to the priv->bridges array.

Signed-off-by: Dmitry Baryshkov 
---
 drivers/gpu/drm/msm/dp/dp_display.c |  9 ++---
 drivers/gpu/drm/msm/dp/dp_drm.c | 21 +
 drivers/gpu/drm/msm/dp/dp_drm.h |  2 +-
 3 files changed, 16 insertions(+), 16 deletions(-)

diff --git a/drivers/gpu/drm/msm/dp/dp_display.c 
b/drivers/gpu/drm/msm/dp/dp_display.c
index 1267e3dbcb1a..7fa245629251 100644
--- a/drivers/gpu/drm/msm/dp/dp_display.c
+++ b/drivers/gpu/drm/msm/dp/dp_display.c
@@ -1540,7 +1540,6 @@ static int dp_display_get_next_bridge(struct msm_dp *dp)
 int msm_dp_modeset_init(struct msm_dp *dp_display, struct drm_device *dev,
struct drm_encoder *encoder)
 {
-   struct msm_drm_private *priv = dev->dev_private;
struct dp_display_private *dp_priv;
int ret;
 
@@ -1558,17 +1557,13 @@ int msm_dp_modeset_init(struct msm_dp *dp_display, 
struct drm_device *dev,
if (ret)
return ret;
 
-   dp_display->bridge = dp_bridge_init(dp_display, dev, encoder);
-   if (IS_ERR(dp_display->bridge)) {
-   ret = PTR_ERR(dp_display->bridge);
+   ret = dp_bridge_init(dp_display, dev, encoder);
+   if (ret) {
DRM_DEV_ERROR(dev->dev,
"failed to create dp bridge: %d\n", ret);
-   dp_display->bridge = NULL;
return ret;
}
 
-   priv->bridges[priv->num_bridges++] = dp_display->bridge;
-
dp_display->connector = dp_drm_connector_init(dp_display, encoder);
if (IS_ERR(dp_display->connector)) {
ret = PTR_ERR(dp_display->connector);
diff --git a/drivers/gpu/drm/msm/dp/dp_drm.c b/drivers/gpu/drm/msm/dp/dp_drm.c
index 785d76639497..284ff7df058a 100644
--- a/drivers/gpu/drm/msm/dp/dp_drm.c
+++ b/drivers/gpu/drm/msm/dp/dp_drm.c
@@ -272,7 +272,7 @@ static const struct drm_bridge_funcs edp_bridge_ops = {
.atomic_check = edp_bridge_atomic_check,
 };
 
-struct drm_bridge *dp_bridge_init(struct msm_dp *dp_display, struct drm_device 
*dev,
+int dp_bridge_init(struct msm_dp *dp_display, struct drm_device *dev,
struct drm_encoder *encoder)
 {
int rc;
@@ -281,7 +281,7 @@ struct drm_bridge *dp_bridge_init(struct msm_dp 
*dp_display, struct drm_device *
 
dp_bridge = devm_kzalloc(dev->dev, sizeof(*dp_bridge), GFP_KERNEL);
if (!dp_bridge)
-   return ERR_PTR(-ENOMEM);
+   return -ENOMEM;
 
dp_bridge->dp_display = dp_display;
 
@@ -307,14 +307,18 @@ struct drm_bridge *dp_bridge_init(struct msm_dp 
*dp_display, struct drm_device *
DRM_BRIDGE_OP_MODES;
}
 
-   drm_bridge_add(bridge);
+   rc = devm_drm_bridge_add(_display->pdev->dev, bridge);
+   if (rc) {
+   DRM_ERROR("failed to add bridge, rc=%d\n", rc);
+
+   return rc;
+   }
 
rc = drm_bridge_attach(encoder, bridge, NULL, 
DRM_BRIDGE_ATTACH_NO_CONNECTOR);
if (rc) {
DRM_ERROR("failed to attach bridge, rc=%d\n", rc);
-   drm_bridge_remove(bridge);
 
-   return ERR_PTR(rc);
+   return rc;
}
 
if (dp_display->next_bridge) {
@@ -323,12 +327,13 @@ struct drm_bridge *dp_bridge_init(struct msm_dp 
*dp_display, struct drm_device *
DRM_BRIDGE_ATTACH_NO_CONNECTOR);
if (rc < 0) {
DRM_ERROR("failed to attach panel bridge: %d\n", rc);
-   drm_bridge_remove(bridge);
-   return ERR_PTR(rc);
+   return rc;
}
}
 
-   return bridge;
+   dp_display->bridge = bridge;
+
+   return 0;
 }
 
 /* connector initialization */
diff --git a/drivers/gpu/drm/msm/dp/dp_drm.h b/drivers/gpu/drm/msm/dp/dp_drm.h
index afe79b85e183..b3d684db2383 100644
--- a/drivers/gpu/drm/msm/dp/dp_drm.h
+++ b/drivers/gpu/drm/msm/dp/dp_drm.h
@@ -20,7 +20,7 @@ struct msm_dp_bridge {
 #define to_dp_bridge(x) container_of((x), struct msm_dp_bridge, bridge)
 
 struct drm_connector *dp_drm_connector_init(struct msm_dp *dp_display, struct 
drm_encoder *encoder);
-struct drm_bridge *dp_bridge_init(struct msm_dp *dp_display, struct drm_device 
*dev,
+int dp_bridge_init(struct msm_dp *dp_display, struct drm_device *dev,
struct drm_encoder *encoder);
 
 void dp_bridge_atomic_enable(struct drm_bridge *drm_bridge,
-- 
2.39.2



[Freedreno] [PATCH 03/13] drm/msm/dp: move pdev from struct dp_display_private to struct msm_dp

2023-07-02 Thread Dmitry Baryshkov
The dp_drm needs accessing the DP's platform device. Move pdev to the
public structure.

Signed-off-by: Dmitry Baryshkov 
---
 drivers/gpu/drm/msm/dp/dp_display.c | 25 -
 drivers/gpu/drm/msm/dp/dp_display.h |  1 +
 2 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/drivers/gpu/drm/msm/dp/dp_display.c 
b/drivers/gpu/drm/msm/dp/dp_display.c
index 76f13954015b..1267e3dbcb1a 100644
--- a/drivers/gpu/drm/msm/dp/dp_display.c
+++ b/drivers/gpu/drm/msm/dp/dp_display.c
@@ -88,7 +88,6 @@ struct dp_display_private {
bool audio_supported;
 
struct drm_device *drm_dev;
-   struct platform_device *pdev;
struct dentry *root;
 
struct dp_parser  *parser;
@@ -603,7 +602,7 @@ static int dp_hpd_plug_handle(struct dp_display_private 
*dp, u32 data)
return 0;
}
 
-   ret = dp_display_usbpd_configure_cb(>pdev->dev);
+   ret = dp_display_usbpd_configure_cb(>dp_display.pdev->dev);
if (ret) {  /* link train failed */
dp->hpd_state = ST_DISCONNECTED;
} else {
@@ -651,7 +650,7 @@ static int dp_hpd_unplug_handle(struct dp_display_private 
*dp, u32 data)
if (dp->link->sink_count == 0) {
dp_display_host_phy_exit(dp);
}
-   dp_display_notify_disconnect(>pdev->dev);
+   dp_display_notify_disconnect(>dp_display.pdev->dev);
mutex_unlock(>event_mutex);
return 0;
} else if (state == ST_DISCONNECT_PENDING) {
@@ -661,7 +660,7 @@ static int dp_hpd_unplug_handle(struct dp_display_private 
*dp, u32 data)
dp_ctrl_off_link(dp->ctrl);
dp_display_host_phy_exit(dp);
dp->hpd_state = ST_DISCONNECTED;
-   dp_display_notify_disconnect(>pdev->dev);
+   dp_display_notify_disconnect(>dp_display.pdev->dev);
mutex_unlock(>event_mutex);
return 0;
}
@@ -670,7 +669,7 @@ static int dp_hpd_unplug_handle(struct dp_display_private 
*dp, u32 data)
 * We don't need separate work for disconnect as
 * connect/attention interrupts are disabled
 */
-   dp_display_notify_disconnect(>pdev->dev);
+   dp_display_notify_disconnect(>dp_display.pdev->dev);
 
if (state == ST_DISPLAY_OFF) {
dp->hpd_state = ST_DISCONNECTED;
@@ -712,7 +711,7 @@ static int dp_irq_hpd_handle(struct dp_display_private *dp, 
u32 data)
return 0;
}
 
-   dp_display_usbpd_attention_cb(>pdev->dev);
+   dp_display_usbpd_attention_cb(>dp_display.pdev->dev);
 
drm_dbg_dp(dp->drm_dev, "After, type=%d hpd_state=%d\n",
dp->dp_display.connector_type, state);
@@ -733,12 +732,12 @@ static void dp_display_deinit_sub_modules(struct 
dp_display_private *dp)
 static int dp_init_sub_modules(struct dp_display_private *dp)
 {
int rc = 0;
-   struct device *dev = >pdev->dev;
+   struct device *dev = >dp_display.pdev->dev;
struct dp_panel_in panel_in = {
.dev = dev,
};
 
-   dp->parser = dp_parser_get(dp->pdev);
+   dp->parser = dp_parser_get(dp->dp_display.pdev);
if (IS_ERR(dp->parser)) {
rc = PTR_ERR(dp->parser);
DRM_ERROR("failed to initialize parser, rc = %d\n", rc);
@@ -799,7 +798,7 @@ static int dp_init_sub_modules(struct dp_display_private 
*dp)
goto error_ctrl;
}
 
-   dp->audio = dp_audio_get(dp->pdev, dp->panel, dp->catalog);
+   dp->audio = dp_audio_get(dp->dp_display.pdev, dp->panel, dp->catalog);
if (IS_ERR(dp->audio)) {
rc = PTR_ERR(dp->audio);
pr_err("failed to initialize audio, rc = %d\n", rc);
@@ -1205,7 +1204,7 @@ int dp_display_request_irq(struct msm_dp *dp_display)
 
dp = container_of(dp_display, struct dp_display_private, dp_display);
 
-   dp->irq = irq_of_parse_and_map(dp->pdev->dev.of_node, 0);
+   dp->irq = irq_of_parse_and_map(dp->dp_display.pdev->dev.of_node, 0);
if (!dp->irq) {
DRM_ERROR("failed to get irq\n");
return -EINVAL;
@@ -1261,7 +1260,7 @@ static int dp_display_probe(struct platform_device *pdev)
if (!desc)
return -EINVAL;
 
-   dp->pdev = pdev;
+   dp->dp_display.pdev = pdev;
dp->name = "drm_dp";
dp->id = desc->id;
dp->dp_display.connector_type = desc->connector_type;
@@ -1469,7 +1468,7 @@ void msm_dp_debugfs_init(struct msm_dp *dp_display, 
struct drm_minor *minor)
int rc;
 
dp = container_of(dp_display, struct dp_display_private, dp_display);
-   dev = >pdev->dev;
+   dev = >dp_display.pdev->dev;
 
dp->debug = dp_debug_get(dev, dp->panel,
dp->link, dp->dp_display.connector,
@@ -1489,7 +1488,7 @@ static int dp_display_get_next_bridge(struct msm_dp *dp)
 

[Freedreno] [PATCH 01/13] drm/msm/dsi: switch to devm_drm_bridge_add()

2023-07-02 Thread Dmitry Baryshkov
Make MSM DSI driver use devm_drm_bridge_add() instead of plain
drm_bridge_add(). As the driver doesn't require any additional cleanup,
stop adding created bridge to the priv->bridges array.

Signed-off-by: Dmitry Baryshkov 
---
 drivers/gpu/drm/msm/dsi/dsi.c | 28 +
 drivers/gpu/drm/msm/dsi/dsi.h |  3 +--
 drivers/gpu/drm/msm/dsi/dsi_manager.c | 30 +--
 3 files changed, 16 insertions(+), 45 deletions(-)

diff --git a/drivers/gpu/drm/msm/dsi/dsi.c b/drivers/gpu/drm/msm/dsi/dsi.c
index baab79ab6e74..61c369494719 100644
--- a/drivers/gpu/drm/msm/dsi/dsi.c
+++ b/drivers/gpu/drm/msm/dsi/dsi.c
@@ -212,20 +212,14 @@ void __exit msm_dsi_unregister(void)
 int msm_dsi_modeset_init(struct msm_dsi *msm_dsi, struct drm_device *dev,
 struct drm_encoder *encoder)
 {
-   struct msm_drm_private *priv = dev->dev_private;
int ret;
 
-   if (priv->num_bridges == ARRAY_SIZE(priv->bridges)) {
-   DRM_DEV_ERROR(dev->dev, "too many bridges\n");
-   return -ENOSPC;
-   }
-
msm_dsi->dev = dev;
 
ret = msm_dsi_host_modeset_init(msm_dsi->host, dev);
if (ret) {
DRM_DEV_ERROR(dev->dev, "failed to modeset init host: %d\n", 
ret);
-   goto fail;
+   return ret;
}
 
if (msm_dsi_is_bonded_dsi(msm_dsi) &&
@@ -239,32 +233,20 @@ int msm_dsi_modeset_init(struct msm_dsi *msm_dsi, struct 
drm_device *dev,
 
msm_dsi->encoder = encoder;
 
-   msm_dsi->bridge = msm_dsi_manager_bridge_init(msm_dsi->id);
-   if (IS_ERR(msm_dsi->bridge)) {
-   ret = PTR_ERR(msm_dsi->bridge);
+   ret = msm_dsi_manager_bridge_init(msm_dsi);
+   if (ret) {
DRM_DEV_ERROR(dev->dev, "failed to create dsi bridge: %d\n", 
ret);
-   msm_dsi->bridge = NULL;
-   goto fail;
+   return ret;
}
 
ret = msm_dsi_manager_ext_bridge_init(msm_dsi->id);
if (ret) {
DRM_DEV_ERROR(dev->dev,
"failed to create dsi connector: %d\n", ret);
-   goto fail;
+   return ret;
}
 
-   priv->bridges[priv->num_bridges++]   = msm_dsi->bridge;
-
return 0;
-fail:
-   /* bridge/connector are normally destroyed by drm: */
-   if (msm_dsi->bridge) {
-   msm_dsi_manager_bridge_destroy(msm_dsi->bridge);
-   msm_dsi->bridge = NULL;
-   }
-
-   return ret;
 }
 
 void msm_dsi_snapshot(struct msm_disp_state *disp_state, struct msm_dsi 
*msm_dsi)
diff --git a/drivers/gpu/drm/msm/dsi/dsi.h b/drivers/gpu/drm/msm/dsi/dsi.h
index bd3763a5d723..df2bd774909b 100644
--- a/drivers/gpu/drm/msm/dsi/dsi.h
+++ b/drivers/gpu/drm/msm/dsi/dsi.h
@@ -56,8 +56,7 @@ struct msm_dsi {
 };
 
 /* dsi manager */
-struct drm_bridge *msm_dsi_manager_bridge_init(u8 id);
-void msm_dsi_manager_bridge_destroy(struct drm_bridge *bridge);
+int msm_dsi_manager_bridge_init(struct msm_dsi *msm_dsi);
 int msm_dsi_manager_ext_bridge_init(u8 id);
 int msm_dsi_manager_cmd_xfer(int id, const struct mipi_dsi_msg *msg);
 bool msm_dsi_manager_cmd_xfer_trigger(int id, u32 dma_base, u32 len);
diff --git a/drivers/gpu/drm/msm/dsi/dsi_manager.c 
b/drivers/gpu/drm/msm/dsi/dsi_manager.c
index 28b8012a21f2..17aa19bb6510 100644
--- a/drivers/gpu/drm/msm/dsi/dsi_manager.c
+++ b/drivers/gpu/drm/msm/dsi/dsi_manager.c
@@ -466,9 +466,8 @@ static const struct drm_bridge_funcs dsi_mgr_bridge_funcs = 
{
 };
 
 /* initialize bridge */
-struct drm_bridge *msm_dsi_manager_bridge_init(u8 id)
+int msm_dsi_manager_bridge_init(struct msm_dsi *msm_dsi)
 {
-   struct msm_dsi *msm_dsi = dsi_mgr_get_dsi(id);
struct drm_bridge *bridge = NULL;
struct dsi_bridge *dsi_bridge;
struct drm_encoder *encoder;
@@ -476,31 +475,27 @@ struct drm_bridge *msm_dsi_manager_bridge_init(u8 id)
 
dsi_bridge = devm_kzalloc(msm_dsi->dev->dev,
sizeof(*dsi_bridge), GFP_KERNEL);
-   if (!dsi_bridge) {
-   ret = -ENOMEM;
-   goto fail;
-   }
+   if (!dsi_bridge)
+   return -ENOMEM;
 
-   dsi_bridge->id = id;
+   dsi_bridge->id = msm_dsi->id;
 
encoder = msm_dsi->encoder;
 
bridge = _bridge->base;
bridge->funcs = _mgr_bridge_funcs;
 
-   drm_bridge_add(bridge);
+   ret = devm_drm_bridge_add(_dsi->pdev->dev, bridge);
+   if (ret)
+   return ret;
 
ret = drm_bridge_attach(encoder, bridge, NULL, 0);
if (ret)
-   goto fail;
+   return ret;
 
-   return bridge;
+   msm_dsi->bridge = bridge;
 
-fail:
-   if (bridge)
-   msm_dsi_manager_bridge_destroy(bridge);
-
-   return ERR_PTR(ret);
+   return 0;
 }
 
 int msm_dsi_manager_ext_bridge_init(u8 id)
@@ -557,11 +552,6 @@ int msm_dsi_manager_ext_bridge_init(u8 id)
return 0;
 }
 

[Freedreno] [PATCH 00/13] drm/msm: move KMS code from msm_drv.c

2023-07-02 Thread Dmitry Baryshkov
Currently both msm_drm_init() and msm_drm_uninit() functions are trying
to handle both normal and headless Adreno cases. This results in a
suboptimal code, since headless case still gets modesetting and atomic
interfaces enabled. Two mentioned functions are a spaghetti of
`if (priv->kms)' conditional code.

Move all KMS-related code (not limiting the init / teardown path) from
msm_drv.c to msm_kms.c, making it more self-contained. This also
disables ATOMIC and MODESET features for the headless case.

Dependencies: [1]
[1] https://patchwork.freedesktop.org/series/105392/

Dmitry Baryshkov (13):
  drm/msm/dsi: switch to devm_drm_bridge_add()
  drm/msm/hdmi: switch to devm_drm_bridge_add()
  drm/msm/dp: move pdev from struct dp_display_private to struct msm_dp
  drm/msm/dp: switch to devm_drm_bridge_add()
  drm/msm: remove msm_drm_private::bridges field
  drm/msm: drop pm ops from the headless msm driver
  drm/msm: rename msm_pm_prepare/complete to note the KMS nature
  drm/msm: remove shutdown callback from msm_platform_driver
  drm/msm: rename msm_drv_shutdown() to msm_kms_shutdown()
  drm/msm: switch to drmm_mode_config_init()
  drm/msm: only register 'kms' debug file if KMS is used
  drm/msm: make fb debugfs file available only in KMS case
  drm/msm: carve out KMS code from msm_drv.c

 drivers/gpu/drm/msm/Makefile |   1 +
 drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c  |   6 +-
 drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c |   6 +-
 drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c |   6 +-
 drivers/gpu/drm/msm/dp/dp_display.c  |  34 +--
 drivers/gpu/drm/msm/dp/dp_display.h  |   1 +
 drivers/gpu/drm/msm/dp/dp_drm.c  |  21 +-
 drivers/gpu/drm/msm/dp/dp_drm.h  |   2 +-
 drivers/gpu/drm/msm/dsi/dsi.c|  28 +-
 drivers/gpu/drm/msm/dsi/dsi.h|   3 +-
 drivers/gpu/drm/msm/dsi/dsi_manager.c|  30 +-
 drivers/gpu/drm/msm/hdmi/hdmi.c  |  22 +-
 drivers/gpu/drm/msm/hdmi/hdmi.h  |   5 +-
 drivers/gpu/drm/msm/hdmi/hdmi_bridge.c   |  30 +-
 drivers/gpu/drm/msm/hdmi/hdmi_hpd.c  |   3 +-
 drivers/gpu/drm/msm/msm_debugfs.c|  12 +-
 drivers/gpu/drm/msm/msm_drv.c| 363 ++-
 drivers/gpu/drm/msm/msm_drv.h|   9 +-
 drivers/gpu/drm/msm/msm_kms.c| 345 +
 drivers/gpu/drm/msm/msm_kms.h|   3 +
 20 files changed, 452 insertions(+), 478 deletions(-)
 create mode 100644 drivers/gpu/drm/msm/msm_kms.c

-- 
2.39.2



[Freedreno] [PATCH v3 4/4] drm/msm/mdp5: move resource allocation to the _probe function

2023-07-02 Thread Dmitry Baryshkov
To let the probe function bail early if any of the resources is
unavailable, move resource allocattion from kms_init directly to the
probe callback.

Reviewed-by: Abhinav Kumar 
Signed-off-by: Dmitry Baryshkov 
---
 drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c | 100 ++-
 1 file changed, 44 insertions(+), 56 deletions(-)

diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c 
b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
index 83a5b3bd09d9..52f176e08690 100644
--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
+++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
@@ -554,20 +554,16 @@ static int mdp5_kms_init(struct drm_device *dev)
struct platform_device *pdev;
struct mdp5_kms *mdp5_kms;
struct mdp5_cfg *config;
-   struct msm_kms *kms;
+   struct msm_kms *kms = priv->kms;
struct msm_gem_address_space *aspace;
-   int irq, i, ret;
+   int i, ret;
 
ret = mdp5_init(to_platform_device(dev->dev), dev);
if (ret)
return ret;
 
-   /* priv->kms would have been populated by the MDP5 driver */
-   kms = priv->kms;
-   if (!kms)
-   return -ENOMEM;
-
mdp5_kms = to_mdp5_kms(to_mdp_kms(kms));
+
pdev = mdp5_kms->pdev;
 
ret = mdp_kms_init(_kms->base, _funcs);
@@ -576,15 +572,6 @@ static int mdp5_kms_init(struct drm_device *dev)
goto fail;
}
 
-   irq = irq_of_parse_and_map(pdev->dev.of_node, 0);
-   if (!irq) {
-   ret = -EINVAL;
-   DRM_DEV_ERROR(>dev, "failed to get irq\n");
-   goto fail;
-   }
-
-   kms->irq = irq;
-
config = mdp5_cfg_get_config(mdp5_kms->cfg);
 
/* make sure things are off before attaching iommu (bootloader could
@@ -787,60 +774,23 @@ static int interface_init(struct mdp5_kms *mdp5_kms)
 static int mdp5_init(struct platform_device *pdev, struct drm_device *dev)
 {
struct msm_drm_private *priv = dev->dev_private;
-   struct mdp5_kms *mdp5_kms;
+   struct mdp5_kms *mdp5_kms = to_mdp5_kms(to_mdp_kms(priv->kms));
struct mdp5_cfg *config;
u32 major, minor;
int ret;
 
-   mdp5_kms = devm_kzalloc(>dev, sizeof(*mdp5_kms), GFP_KERNEL);
-   if (!mdp5_kms) {
-   ret = -ENOMEM;
-   goto fail;
-   }
-
-   spin_lock_init(_kms->resource_lock);
-
mdp5_kms->dev = dev;
-   mdp5_kms->pdev = pdev;
 
ret = mdp5_global_obj_init(mdp5_kms);
if (ret)
goto fail;
 
-   mdp5_kms->mmio = msm_ioremap(pdev, "mdp_phys");
-   if (IS_ERR(mdp5_kms->mmio)) {
-   ret = PTR_ERR(mdp5_kms->mmio);
-   goto fail;
-   }
-
-   /* mandatory clocks: */
-   ret = get_clk(pdev, _kms->axi_clk, "bus", true);
-   if (ret)
-   goto fail;
-   ret = get_clk(pdev, _kms->ahb_clk, "iface", true);
-   if (ret)
-   goto fail;
-   ret = get_clk(pdev, _kms->core_clk, "core", true);
-   if (ret)
-   goto fail;
-   ret = get_clk(pdev, _kms->vsync_clk, "vsync", true);
-   if (ret)
-   goto fail;
-
-   /* optional clocks: */
-   get_clk(pdev, _kms->lut_clk, "lut", false);
-   get_clk(pdev, _kms->tbu_clk, "tbu", false);
-   get_clk(pdev, _kms->tbu_rt_clk, "tbu_rt", false);
-
/* we need to set a default rate before enabling.  Set a safe
 * rate first, then figure out hw revision, and then set a
 * more optimal rate:
 */
clk_set_rate(mdp5_kms->core_clk, 2);
 
-   /* set uninit-ed kms */
-   priv->kms = _kms->base.base;
-
pm_runtime_enable(>dev);
mdp5_kms->rpm_enabled = true;
 
@@ -931,15 +881,53 @@ static int mdp5_setup_interconnect(struct platform_device 
*pdev)
 
 static int mdp5_dev_probe(struct platform_device *pdev)
 {
-   int ret;
+   struct mdp5_kms *mdp5_kms;
+   int ret, irq;
 
DBG("");
 
+   mdp5_kms = devm_kzalloc(>dev, sizeof(*mdp5_kms), GFP_KERNEL);
+   if (!mdp5_kms)
+   return -ENOMEM;
+
ret = mdp5_setup_interconnect(pdev);
if (ret)
return ret;
 
-   return msm_drv_probe(>dev, mdp5_kms_init, NULL);
+   mdp5_kms->pdev = pdev;
+
+   spin_lock_init(_kms->resource_lock);
+
+   mdp5_kms->mmio = msm_ioremap(pdev, "mdp_phys");
+   if (IS_ERR(mdp5_kms->mmio))
+   return PTR_ERR(mdp5_kms->mmio);
+
+   /* mandatory clocks: */
+   ret = get_clk(pdev, _kms->axi_clk, "bus", true);
+   if (ret)
+   return ret;
+   ret = get_clk(pdev, _kms->ahb_clk, "iface", true);
+   if (ret)
+   return ret;
+   ret = get_clk(pdev, _kms->core_clk, "core", true);
+   if (ret)
+   return ret;
+   ret = get_clk(pdev, _kms->vsync_clk, "vsync", true);
+   if (ret)
+   return ret;
+
+   /* optional clocks: */
+   get_clk(pdev, _kms->lut_clk, 

[Freedreno] [PATCH v3 3/4] drm/msm/mdp4: move resource allocation to the _probe function

2023-07-02 Thread Dmitry Baryshkov
To let the probe function bail early if any of the resources is
unavailable, move resource allocattion from kms_init directly to the
probe callback. While we are at it, replace irq_of_parse_and_map() with
platform_get_irq().

Reviewed-by: Abhinav Kumar 
Signed-off-by: Dmitry Baryshkov 
---
 drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c | 107 +++
 1 file changed, 51 insertions(+), 56 deletions(-)

diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c 
b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
index e57a1e5f9da0..a3f1da3382e8 100644
--- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
+++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
@@ -135,8 +135,6 @@ static void mdp4_destroy(struct msm_kms *kms)
pm_runtime_disable(dev);
 
mdp_kms_destroy(_kms->base);
-
-   kfree(mdp4_kms);
 }
 
 static const struct mdp_kms_funcs kms_funcs = {
@@ -380,57 +378,27 @@ static int mdp4_kms_init(struct drm_device *dev)
 {
struct platform_device *pdev = to_platform_device(dev->dev);
struct msm_drm_private *priv = dev->dev_private;
-   struct mdp4_kms *mdp4_kms;
+   struct mdp4_kms *mdp4_kms = to_mdp4_kms(to_mdp_kms(priv->kms));
struct msm_kms *kms = NULL;
struct msm_mmu *mmu;
struct msm_gem_address_space *aspace;
-   int irq, ret;
+   int ret;
u32 major, minor;
unsigned long max_clk;
 
/* TODO: Chips that aren't apq8064 have a 200 Mhz max_clk */
max_clk = 27000;
 
-   mdp4_kms = kzalloc(sizeof(*mdp4_kms), GFP_KERNEL);
-   if (!mdp4_kms) {
-   DRM_DEV_ERROR(dev->dev, "failed to allocate kms\n");
-   return -ENOMEM;
-   }
-
ret = mdp_kms_init(_kms->base, _funcs);
if (ret) {
DRM_DEV_ERROR(dev->dev, "failed to init kms\n");
goto fail;
}
 
-   priv->kms = _kms->base.base;
kms = priv->kms;
 
mdp4_kms->dev = dev;
 
-   mdp4_kms->mmio = msm_ioremap(pdev, NULL);
-   if (IS_ERR(mdp4_kms->mmio)) {
-   ret = PTR_ERR(mdp4_kms->mmio);
-   goto fail;
-   }
-
-   irq = platform_get_irq(pdev, 0);
-   if (irq < 0) {
-   ret = irq;
-   DRM_DEV_ERROR(dev->dev, "failed to get irq: %d\n", ret);
-   goto fail;
-   }
-
-   kms->irq = irq;
-
-   /* NOTE: driver for this regulator still missing upstream.. use
-* _get_exclusive() and ignore the error if it does not exist
-* (and hope that the bootloader left it on for us)
-*/
-   mdp4_kms->vdd = devm_regulator_get_exclusive(>dev, "vdd");
-   if (IS_ERR(mdp4_kms->vdd))
-   mdp4_kms->vdd = NULL;
-
if (mdp4_kms->vdd) {
ret = regulator_enable(mdp4_kms->vdd);
if (ret) {
@@ -439,24 +407,6 @@ static int mdp4_kms_init(struct drm_device *dev)
}
}
 
-   mdp4_kms->clk = devm_clk_get(>dev, "core_clk");
-   if (IS_ERR(mdp4_kms->clk)) {
-   DRM_DEV_ERROR(dev->dev, "failed to get core_clk\n");
-   ret = PTR_ERR(mdp4_kms->clk);
-   goto fail;
-   }
-
-   mdp4_kms->pclk = devm_clk_get(>dev, "iface_clk");
-   if (IS_ERR(mdp4_kms->pclk))
-   mdp4_kms->pclk = NULL;
-
-   mdp4_kms->axi_clk = devm_clk_get(>dev, "bus_clk");
-   if (IS_ERR(mdp4_kms->axi_clk)) {
-   DRM_DEV_ERROR(dev->dev, "failed to get axi_clk\n");
-   ret = PTR_ERR(mdp4_kms->axi_clk);
-   goto fail;
-   }
-
clk_set_rate(mdp4_kms->clk, max_clk);
 
read_mdp_hw_revision(mdp4_kms, , );
@@ -471,10 +421,9 @@ static int mdp4_kms_init(struct drm_device *dev)
mdp4_kms->rev = minor;
 
if (mdp4_kms->rev >= 2) {
-   mdp4_kms->lut_clk = devm_clk_get(>dev, "lut_clk");
-   if (IS_ERR(mdp4_kms->lut_clk)) {
+   if (!mdp4_kms->lut_clk) {
DRM_DEV_ERROR(dev->dev, "failed to get lut_clk\n");
-   ret = PTR_ERR(mdp4_kms->lut_clk);
+   ret = -ENODEV;
goto fail;
}
clk_set_rate(mdp4_kms->lut_clk, max_clk);
@@ -558,7 +507,53 @@ static const struct dev_pm_ops mdp4_pm_ops = {
 
 static int mdp4_probe(struct platform_device *pdev)
 {
-   return msm_drv_probe(>dev, mdp4_kms_init, NULL);
+   struct device *dev = >dev;
+   struct mdp4_kms *mdp4_kms;
+   int irq;
+
+   mdp4_kms = devm_kzalloc(dev, sizeof(*mdp4_kms), GFP_KERNEL);
+   if (!mdp4_kms)
+   return dev_err_probe(dev, -ENOMEM, "failed to allocate kms\n");
+
+   mdp4_kms->mmio = msm_ioremap(pdev, NULL);
+   if (IS_ERR(mdp4_kms->mmio))
+   return PTR_ERR(mdp4_kms->mmio);
+
+   irq = platform_get_irq(pdev, 0);
+   if (irq < 0)
+   return dev_err_probe(dev, irq, "failed to get irq\n");
+
+   mdp4_kms->base.base.irq = irq;
+
+   

[Freedreno] [PATCH v3 1/4] drm/msm: allow passing struct msm_kms to msm_drv_probe()

2023-07-02 Thread Dmitry Baryshkov
In preparation of moving resource allocation to the probe time, allow
MSM KMS drivers to pass struct msm_kms pointer via msm_drv_probe().

Signed-off-by: Dmitry Baryshkov 
---
 drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c  | 2 +-
 drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c | 2 +-
 drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c | 2 +-
 drivers/gpu/drm/msm/msm_drv.c| 6 --
 drivers/gpu/drm/msm/msm_drv.h| 3 ++-
 5 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
index aa8499de1b9f..61716625c172 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
@@ -1236,7 +1236,7 @@ static int dpu_kms_init(struct drm_device *ddev)
 
 static int dpu_dev_probe(struct platform_device *pdev)
 {
-   return msm_drv_probe(>dev, dpu_kms_init);
+   return msm_drv_probe(>dev, dpu_kms_init, NULL);
 }
 
 static int dpu_dev_remove(struct platform_device *pdev)
diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c 
b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
index 6e37072ed302..e57a1e5f9da0 100644
--- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
+++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
@@ -558,7 +558,7 @@ static const struct dev_pm_ops mdp4_pm_ops = {
 
 static int mdp4_probe(struct platform_device *pdev)
 {
-   return msm_drv_probe(>dev, mdp4_kms_init);
+   return msm_drv_probe(>dev, mdp4_kms_init, NULL);
 }
 
 static int mdp4_remove(struct platform_device *pdev)
diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c 
b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
index 323079cfd698..83a5b3bd09d9 100644
--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
+++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c
@@ -939,7 +939,7 @@ static int mdp5_dev_probe(struct platform_device *pdev)
if (ret)
return ret;
 
-   return msm_drv_probe(>dev, mdp5_kms_init);
+   return msm_drv_probe(>dev, mdp5_kms_init, NULL);
 }
 
 static int mdp5_dev_remove(struct platform_device *pdev)
diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c
index 891eff8433a9..f06a06ab26fa 100644
--- a/drivers/gpu/drm/msm/msm_drv.c
+++ b/drivers/gpu/drm/msm/msm_drv.c
@@ -1233,7 +1233,8 @@ const struct component_master_ops msm_drm_ops = {
 };
 
 int msm_drv_probe(struct device *master_dev,
-   int (*kms_init)(struct drm_device *dev))
+   int (*kms_init)(struct drm_device *dev),
+   struct msm_kms *kms)
 {
struct msm_drm_private *priv;
struct component_match *match = NULL;
@@ -1243,6 +1244,7 @@ int msm_drv_probe(struct device *master_dev,
if (!priv)
return -ENOMEM;
 
+   priv->kms = kms;
priv->kms_init = kms_init;
dev_set_drvdata(master_dev, priv);
 
@@ -1278,7 +1280,7 @@ int msm_drv_probe(struct device *master_dev,
 
 static int msm_pdev_probe(struct platform_device *pdev)
 {
-   return msm_drv_probe(>dev, NULL);
+   return msm_drv_probe(>dev, NULL, NULL);
 }
 
 static int msm_pdev_remove(struct platform_device *pdev)
diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
index e13a8cbd61c9..6787bd302dfa 100644
--- a/drivers/gpu/drm/msm/msm_drv.h
+++ b/drivers/gpu/drm/msm/msm_drv.h
@@ -562,7 +562,8 @@ int msm_pm_prepare(struct device *dev);
 void msm_pm_complete(struct device *dev);
 
 int msm_drv_probe(struct device *dev,
-   int (*kms_init)(struct drm_device *dev));
+   int (*kms_init)(struct drm_device *dev),
+   struct msm_kms *kms);
 void msm_drv_shutdown(struct platform_device *pdev);
 
 
-- 
2.39.2



[Freedreno] [PATCH v3 2/4] drm/msm/dpu: move resource allocation to the _probe function

2023-07-02 Thread Dmitry Baryshkov
To let the probe function bail early if any of the resources is
unavailable, move resource allocattion from kms_init directly to the
probe callback. While we are at it, replace irq_of_parse_and_map() with
platform_get_irq().

Signed-off-by: Dmitry Baryshkov 
---
 drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 121 
 1 file changed, 61 insertions(+), 60 deletions(-)

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c 
b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
index 61716625c172..5b04c37c102f 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
@@ -388,8 +388,7 @@ static int dpu_kms_parse_data_bus_icc_path(struct dpu_kms 
*dpu_kms)
 {
struct icc_path *path0;
struct icc_path *path1;
-   struct drm_device *dev = dpu_kms->dev;
-   struct device *dpu_dev = dev->dev;
+   struct device *dpu_dev = _kms->pdev->dev;
 
path0 = msm_icc_get(dpu_dev, "mdp0-mem");
path1 = msm_icc_get(dpu_dev, "mdp1-mem");
@@ -1035,30 +1034,6 @@ static int dpu_kms_hw_init(struct msm_kms *kms)
 
atomic_set(_kms->bandwidth_ref, 0);
 
-   dpu_kms->mmio = msm_ioremap(dpu_kms->pdev, "mdp");
-   if (IS_ERR(dpu_kms->mmio)) {
-   rc = PTR_ERR(dpu_kms->mmio);
-   DPU_ERROR("mdp register memory map failed: %d\n", rc);
-   dpu_kms->mmio = NULL;
-   goto error;
-   }
-   DRM_DEBUG("mapped dpu address space @%pK\n", dpu_kms->mmio);
-
-   dpu_kms->vbif[VBIF_RT] = msm_ioremap(dpu_kms->pdev, "vbif");
-   if (IS_ERR(dpu_kms->vbif[VBIF_RT])) {
-   rc = PTR_ERR(dpu_kms->vbif[VBIF_RT]);
-   DPU_ERROR("vbif register memory map failed: %d\n", rc);
-   dpu_kms->vbif[VBIF_RT] = NULL;
-   goto error;
-   }
-   dpu_kms->vbif[VBIF_NRT] = msm_ioremap_quiet(dpu_kms->pdev, "vbif_nrt");
-   if (IS_ERR(dpu_kms->vbif[VBIF_NRT])) {
-   dpu_kms->vbif[VBIF_NRT] = NULL;
-   DPU_DEBUG("VBIF NRT is not defined");
-   }
-
-   dpu_kms_parse_data_bus_icc_path(dpu_kms);
-
rc = pm_runtime_resume_and_get(_kms->pdev->dev);
if (rc < 0)
goto error;
@@ -1178,33 +1153,11 @@ static int dpu_kms_init(struct drm_device *ddev)
struct msm_drm_private *priv = ddev->dev_private;
struct device *dev = ddev->dev;
struct platform_device *pdev = to_platform_device(dev);
-   struct dpu_kms *dpu_kms;
-   int irq;
+   struct dpu_kms *dpu_kms = to_dpu_kms(priv->kms);
struct dev_pm_opp *opp;
int ret = 0;
unsigned long max_freq = ULONG_MAX;
 
-   dpu_kms = devm_kzalloc(>dev, sizeof(*dpu_kms), GFP_KERNEL);
-   if (!dpu_kms)
-   return -ENOMEM;
-
-   ret = devm_pm_opp_set_clkname(dev, "core");
-   if (ret)
-   return ret;
-   /* OPP table is optional */
-   ret = devm_pm_opp_of_add_table(dev);
-   if (ret && ret != -ENODEV) {
-   dev_err(dev, "invalid OPP table in device tree\n");
-   return ret;
-   }
-
-   ret = devm_clk_bulk_get_all(>dev, _kms->clocks);
-   if (ret < 0) {
-   DPU_ERROR("failed to parse clocks, ret=%d\n", ret);
-   return ret;
-   }
-   dpu_kms->num_clocks = ret;
-
opp = dev_pm_opp_find_freq_floor(dev, _freq);
if (!IS_ERR(opp))
dev_pm_opp_put(opp);
@@ -1217,26 +1170,74 @@ static int dpu_kms_init(struct drm_device *ddev)
return ret;
}
dpu_kms->dev = ddev;
-   dpu_kms->pdev = pdev;
 
pm_runtime_enable(>dev);
dpu_kms->rpm_enabled = true;
 
-   priv->kms = _kms->base;
-
-   irq = irq_of_parse_and_map(dpu_kms->pdev->dev.of_node, 0);
-   if (!irq) {
-   DPU_ERROR("failed to get irq\n");
-   return -EINVAL;
-   }
-   dpu_kms->base.irq = irq;
-
return 0;
 }
 
 static int dpu_dev_probe(struct platform_device *pdev)
 {
-   return msm_drv_probe(>dev, dpu_kms_init, NULL);
+   struct device *dev = >dev;
+   struct dpu_kms *dpu_kms;
+   int irq;
+   int ret = 0;
+
+   dpu_kms = devm_kzalloc(dev, sizeof(*dpu_kms), GFP_KERNEL);
+   if (!dpu_kms)
+   return -ENOMEM;
+
+   dpu_kms->pdev = pdev;
+
+   ret = devm_pm_opp_set_clkname(dev, "core");
+   if (ret)
+   return ret;
+   /* OPP table is optional */
+   ret = devm_pm_opp_of_add_table(dev);
+   if (ret && ret != -ENODEV)
+   return dev_err_probe(dev, ret, "invalid OPP table in device 
tree\n");
+
+   ret = devm_clk_bulk_get_all(>dev, _kms->clocks);
+   if (ret < 0)
+   return dev_err_probe(dev, ret, "failed to parse clocks\n");
+
+   dpu_kms->num_clocks = ret;
+
+   irq = platform_get_irq(pdev, 0);
+   if (irq < 0)
+   return dev_err_probe(dev, irq, "failed to get irq\n");
+
+   dpu_kms->base.irq = irq;

[Freedreno] [PATCH v3 0/4] drm/msm: move resource allocation to the _probe function

2023-07-02 Thread Dmitry Baryshkov
This patchset was left untouched for almost a year. Let's reiterate it
in attempt to solve the long-standing issue.

As discussed several times on IRC, move display subdriver resource
allocation from kms_init to probe time to let it bail early.

Changes since v2:
- Move even more resource allocation in the DPU init path.

Changes since v1:
- Dropped the applied patch
- Picked in the patch to pass msm_kms pointer via msm_drv_probe()

Dmitry Baryshkov (4):
  drm/msm: allow passing struct msm_kms to msm_drv_probe()
  drm/msm/dpu: move resource allocation to the _probe function
  drm/msm/mdp4: move resource allocation to the _probe function
  drm/msm/mdp5: move resource allocation to the _probe function

 drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c  | 121 ---
 drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c | 107 ++--
 drivers/gpu/drm/msm/disp/mdp5/mdp5_kms.c | 100 +--
 drivers/gpu/drm/msm/msm_drv.c|   6 +-
 drivers/gpu/drm/msm/msm_drv.h|   3 +-
 5 files changed, 162 insertions(+), 175 deletions(-)

-- 
2.39.2



[Freedreno] [PATCH] dt-bindings: cleanup DTS example whitespaces

2023-07-02 Thread Krzysztof Kozlowski
The DTS code coding style expects spaces around '=' sign.

Signed-off-by: Krzysztof Kozlowski 

---

Rob,

Maybe this could go via your tree? Rebased on your for-next:
v6.4-rc2-45-gf0ac35049606
---
 .../bindings/arm/arm,coresight-cti.yaml| 18 +-
 .../bindings/arm/keystone/ti,sci.yaml  |  8 
 .../devicetree/bindings/display/msm/gmu.yaml   |  2 +-
 .../display/panel/samsung,s6e8aa0.yaml |  2 +-
 .../display/rockchip/rockchip-vop.yaml |  4 ++--
 .../bindings/iio/adc/ti,adc108s102.yaml|  2 +-
 .../bindings/media/renesas,rzg2l-cru.yaml  |  4 ++--
 .../devicetree/bindings/media/renesas,vin.yaml |  4 ++--
 .../devicetree/bindings/mtd/mtd-physmap.yaml   |  2 +-
 .../bindings/net/mediatek-dwmac.yaml   |  2 +-
 .../bindings/perf/amlogic,g12-ddr-pmu.yaml |  4 ++--
 .../bindings/phy/mediatek,dsi-phy.yaml |  2 +-
 .../remoteproc/amlogic,meson-mx-ao-arc.yaml|  2 +-
 .../devicetree/bindings/usb/mediatek,mtu3.yaml |  2 +-
 .../devicetree/bindings/usb/ti,am62-usb.yaml   |  2 +-
 15 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/Documentation/devicetree/bindings/arm/arm,coresight-cti.yaml 
b/Documentation/devicetree/bindings/arm/arm,coresight-cti.yaml
index 0c5b875cb654..d6c84b6e7fe6 100644
--- a/Documentation/devicetree/bindings/arm/arm,coresight-cti.yaml
+++ b/Documentation/devicetree/bindings/arm/arm,coresight-cti.yaml
@@ -287,7 +287,7 @@ examples:
 arm,trig-in-sigs = <0 1>;
 arm,trig-in-types = ;
-arm,trig-out-sigs=<0 1 2 >;
+arm,trig-out-sigs = <0 1 2 >;
 arm,trig-out-types = ;
@@ -309,24 +309,24 @@ examples:
 
   trig-conns@0 {
 reg = <0>;
-arm,trig-in-sigs=<0>;
-arm,trig-in-types=;
-arm,trig-out-sigs=<0>;
-arm,trig-out-types=;
+arm,trig-in-sigs = <0>;
+arm,trig-in-types = ;
+arm,trig-out-sigs = <0>;
+arm,trig-out-types = ;
 arm,trig-conn-name = "sys_profiler";
   };
 
   trig-conns@1 {
 reg = <1>;
-arm,trig-out-sigs=<2 3>;
-arm,trig-out-types=;
+arm,trig-out-sigs = <2 3>;
+arm,trig-out-types = ;
 arm,trig-conn-name = "watchdog";
   };
 
   trig-conns@2 {
 reg = <2>;
-arm,trig-in-sigs=<1 6>;
-arm,trig-in-types=;
+arm,trig-in-sigs = <1 6>;
+arm,trig-in-types = ;
 arm,trig-conn-name = "g_counter";
   };
 };
diff --git a/Documentation/devicetree/bindings/arm/keystone/ti,sci.yaml 
b/Documentation/devicetree/bindings/arm/keystone/ti,sci.yaml
index 91b96065f7df..86b59de7707e 100644
--- a/Documentation/devicetree/bindings/arm/keystone/ti,sci.yaml
+++ b/Documentation/devicetree/bindings/arm/keystone/ti,sci.yaml
@@ -96,8 +96,8 @@ examples:
   compatible = "ti,k2g-sci";
   ti,system-reboot-controller;
   mbox-names = "rx", "tx";
-  mboxes= < 5 2>,
-  < 0 0>;
+  mboxes = < 5 2>,
+   < 0 0>;
   reg-names = "debug_messages";
   reg = <0x02921800 0x800>;
 };
@@ -107,8 +107,8 @@ examples:
   compatible = "ti,k2g-sci";
   ti,host-id = <12>;
   mbox-names = "rx", "tx";
-  mboxes= <_proxy_main 11>,
-  <_proxy_main 13>;
+  mboxes = <_proxy_main 11>,
+   <_proxy_main 13>;
   reg-names = "debug_messages";
   reg = <0x44083000 0x1000>;
 
diff --git a/Documentation/devicetree/bindings/display/msm/gmu.yaml 
b/Documentation/devicetree/bindings/display/msm/gmu.yaml
index 029d72822d8b..65b02c7a1211 100644
--- a/Documentation/devicetree/bindings/display/msm/gmu.yaml
+++ b/Documentation/devicetree/bindings/display/msm/gmu.yaml
@@ -225,7 +225,7 @@ examples:
 #include 
 
 gmu: gmu@506a000 {
-compatible="qcom,adreno-gmu-630.2", "qcom,adreno-gmu";
+compatible = "qcom,adreno-gmu-630.2", "qcom,adreno-gmu";
 
 reg = <0x506a000 0x3>,
   <0xb28 0x1>,
diff --git 
a/Documentation/devicetree/bindings/display/panel/samsung,s6e8aa0.yaml 
b/Documentation/devicetree/bindings/display/panel/samsung,s6e8aa0.yaml
index 1cdc91b3439f..200fbf1c74a0 100644
--- a/Documentation/devicetree/bindings/display/panel/samsung,s6e8aa0.yaml
+++ b/Documentation/devicetree/bindings/display/panel/samsung,s6e8aa0.yaml
@@ -74,7 +74,7 @@ examples:
 vdd3-supply = <_reg>;
 vci-supply = <_reg>;
 reset-gpios = < 5 0>;
-power-on-delay= <50>;
+power-on-delay = <50>;
 reset-delay = <100>;
 init-delay = <100>;
 panel-width-mm = <58>;
diff --git 
a/Documentation/devicetree/bindings/display/rockchip/rockchip-vop.yaml 
b/Documentation/devicetree/bindings/display/rockchip/rockchip-vop.yaml
index 6f43d885c9b3..df61cb5f5c54 100644
--- a/Documentation/devicetree/bindings/display/rockchip/rockchip-vop.yaml
+++ b/Documentation/devicetree/bindings/display/rockchip/rockchip-vop.yaml

Re: [Freedreno] [PATCH v2] drm/msm/adreno: Assign revn to A635

2023-07-02 Thread Rob Clark
On Sun, Jul 2, 2023 at 7:34 AM Dmitry Baryshkov
 wrote:
>
> On 02/07/2023 17:31, Rob Clark wrote:
> > On Sat, Jul 1, 2023 at 5:24 PM Dmitry Baryshkov
> >  wrote:
> >>
> >> On Sat, 1 Jul 2023 at 18:50, Rob Clark  wrote:
> >>>
> >>> On Fri, Jun 30, 2023 at 4:12 PM Konrad Dybcio  
> >>> wrote:
> 
>  Recently, a WARN_ON() was introduced to ensure that revn is filled before
>  adreno_is_aXYZ is called. This however doesn't work very well when revn 
>  is
>  0 by design (such as for A635). Fill it in as a stopgap solution for
>  -fixes.
> 
>  Fixes: cc943f43ece7 ("drm/msm/adreno: warn if chip revn is verified 
>  before being set")
>  Signed-off-by: Konrad Dybcio 
>  ---
>  Changes in v2:
>  - add fixes
>  - Link to v1: 
>  https://lore.kernel.org/r/20230628-topic-a635-v1-1-5056e09c0...@linaro.org
>  ---
>    drivers/gpu/drm/msm/adreno/adreno_device.c | 1 +
>    1 file changed, 1 insertion(+)
> 
>  diff --git a/drivers/gpu/drm/msm/adreno/adreno_device.c 
>  b/drivers/gpu/drm/msm/adreno/adreno_device.c
>  index cb94cfd137a8..8ea7eae9fc52 100644
>  --- a/drivers/gpu/drm/msm/adreno/adreno_device.c
>  +++ b/drivers/gpu/drm/msm/adreno/adreno_device.c
>  @@ -345,6 +345,7 @@ static const struct adreno_info gpulist[] = {
>   .address_space_size = SZ_16G,
>   }, {
>   .rev = ADRENO_REV(6, 3, 5, ANY_ID),
>  +   .revn = 635,
>   .fw = {
>   [ADRENO_FW_SQE] = "a660_sqe.fw",
>   [ADRENO_FW_GMU] = "a660_gmu.bin",
> 
> >>>
> >>> hmm, I realized a problem with this, it would change what
> >>> MSM_PARAM_GPU_ID and more importantly MSM_PARAM_CHIP_ID return..  The
> >>> former should be "harmless", although it isn't a good idea for uabi
> >>> changes to be a side effect of a fix.  The latter is more problematic.
> >>
> >> I'd say MSM_PARAM_GPU_ID is broken for 635 anyway (won't it return 0
> >> in this case)?
> >> So the new value should be correct.
> >
> > no, it is very much intentional that GPU_ID returns 0 for newer GPUs,
> > userspace should be matching on CHIP_ID.  (Also, we should be moving
> > away from trying to infer generation/etc from CHIP_ID.. userspace is
> > farther ahead of the kernel on this.)
>
> Thanks for the explanation. So in theory we can change this to always
> return 0? Or must we keep it to keep UABI / compatibility?
>
> I'm trying to understand if we can drop revn at all.

I'm not sure how likely it is that someone would try a very old mesa
with a new kernel, but that combo would break if we dropped revn
completely and returned 0 for GPU_ID.  But I would like to move away
from using revn internally.  (And probably move away from the patch-id
wildcard matching, and instead just explicitly list all known patch-id
values so we can start treating CHIP_ID as just an opaque identifier.)

BR,
-R

>
> >
> >> But more importantly, why are we exporting speedbin in
> >> MSM_PARAM_CHIP_ID only if there is no revn? And why are we exporting
> >> the speedbin at all as a part of CHIP_ID?
> >
> > Basically just being paranoid about not changing uabi.  It probably
> > would be ok to export the speedbin for all, but I'd have to double
> > check mesa version history.
>
> Thanks!
>
> >
> > BR,
> > -R
> >
> >>>
> >>> I think I'm leaning more towards reverting commit cc943f43ece7
> >>> ("drm/msm/adreno: warn if chip revn is verified before being set") for
> >>> -fixes.  I'm still thinking about options for a longer term fix.
> >>>
> >>> BR,
> >>> -R
> >>>
> >>>
>  ---
>  base-commit: 5c875096d59010cee4e00da1f9c7bdb07a025dc2
>  change-id: 20230628-topic-a635-1b3c2c987417
> 
>  Best regards,
>  --
>  Konrad Dybcio 
> 
> >>
> >>
> >>
> >> --
> >> With best wishes
> >> Dmitry
>
> --
> With best wishes
> Dmitry
>


Re: [Freedreno] [PATCH v2] drm/msm/adreno: Assign revn to A635

2023-07-02 Thread Dmitry Baryshkov

On 02/07/2023 17:31, Rob Clark wrote:

On Sat, Jul 1, 2023 at 5:24 PM Dmitry Baryshkov
 wrote:


On Sat, 1 Jul 2023 at 18:50, Rob Clark  wrote:


On Fri, Jun 30, 2023 at 4:12 PM Konrad Dybcio  wrote:


Recently, a WARN_ON() was introduced to ensure that revn is filled before
adreno_is_aXYZ is called. This however doesn't work very well when revn is
0 by design (such as for A635). Fill it in as a stopgap solution for
-fixes.

Fixes: cc943f43ece7 ("drm/msm/adreno: warn if chip revn is verified before being 
set")
Signed-off-by: Konrad Dybcio 
---
Changes in v2:
- add fixes
- Link to v1: 
https://lore.kernel.org/r/20230628-topic-a635-v1-1-5056e09c0...@linaro.org
---
  drivers/gpu/drm/msm/adreno/adreno_device.c | 1 +
  1 file changed, 1 insertion(+)

diff --git a/drivers/gpu/drm/msm/adreno/adreno_device.c 
b/drivers/gpu/drm/msm/adreno/adreno_device.c
index cb94cfd137a8..8ea7eae9fc52 100644
--- a/drivers/gpu/drm/msm/adreno/adreno_device.c
+++ b/drivers/gpu/drm/msm/adreno/adreno_device.c
@@ -345,6 +345,7 @@ static const struct adreno_info gpulist[] = {
 .address_space_size = SZ_16G,
 }, {
 .rev = ADRENO_REV(6, 3, 5, ANY_ID),
+   .revn = 635,
 .fw = {
 [ADRENO_FW_SQE] = "a660_sqe.fw",
 [ADRENO_FW_GMU] = "a660_gmu.bin",



hmm, I realized a problem with this, it would change what
MSM_PARAM_GPU_ID and more importantly MSM_PARAM_CHIP_ID return..  The
former should be "harmless", although it isn't a good idea for uabi
changes to be a side effect of a fix.  The latter is more problematic.


I'd say MSM_PARAM_GPU_ID is broken for 635 anyway (won't it return 0
in this case)?
So the new value should be correct.


no, it is very much intentional that GPU_ID returns 0 for newer GPUs,
userspace should be matching on CHIP_ID.  (Also, we should be moving
away from trying to infer generation/etc from CHIP_ID.. userspace is
farther ahead of the kernel on this.)


Thanks for the explanation. So in theory we can change this to always 
return 0? Or must we keep it to keep UABI / compatibility?


I'm trying to understand if we can drop revn at all.





But more importantly, why are we exporting speedbin in
MSM_PARAM_CHIP_ID only if there is no revn? And why are we exporting
the speedbin at all as a part of CHIP_ID?


Basically just being paranoid about not changing uabi.  It probably
would be ok to export the speedbin for all, but I'd have to double
check mesa version history.


Thanks!



BR,
-R



I think I'm leaning more towards reverting commit cc943f43ece7
("drm/msm/adreno: warn if chip revn is verified before being set") for
-fixes.  I'm still thinking about options for a longer term fix.

BR,
-R



---
base-commit: 5c875096d59010cee4e00da1f9c7bdb07a025dc2
change-id: 20230628-topic-a635-1b3c2c987417

Best regards,
--
Konrad Dybcio 





--
With best wishes
Dmitry


--
With best wishes
Dmitry



Re: [Freedreno] [PATCH v2] drm/msm/adreno: Assign revn to A635

2023-07-02 Thread Rob Clark
On Sat, Jul 1, 2023 at 5:24 PM Dmitry Baryshkov
 wrote:
>
> On Sat, 1 Jul 2023 at 18:50, Rob Clark  wrote:
> >
> > On Fri, Jun 30, 2023 at 4:12 PM Konrad Dybcio  
> > wrote:
> > >
> > > Recently, a WARN_ON() was introduced to ensure that revn is filled before
> > > adreno_is_aXYZ is called. This however doesn't work very well when revn is
> > > 0 by design (such as for A635). Fill it in as a stopgap solution for
> > > -fixes.
> > >
> > > Fixes: cc943f43ece7 ("drm/msm/adreno: warn if chip revn is verified 
> > > before being set")
> > > Signed-off-by: Konrad Dybcio 
> > > ---
> > > Changes in v2:
> > > - add fixes
> > > - Link to v1: 
> > > https://lore.kernel.org/r/20230628-topic-a635-v1-1-5056e09c0...@linaro.org
> > > ---
> > >  drivers/gpu/drm/msm/adreno/adreno_device.c | 1 +
> > >  1 file changed, 1 insertion(+)
> > >
> > > diff --git a/drivers/gpu/drm/msm/adreno/adreno_device.c 
> > > b/drivers/gpu/drm/msm/adreno/adreno_device.c
> > > index cb94cfd137a8..8ea7eae9fc52 100644
> > > --- a/drivers/gpu/drm/msm/adreno/adreno_device.c
> > > +++ b/drivers/gpu/drm/msm/adreno/adreno_device.c
> > > @@ -345,6 +345,7 @@ static const struct adreno_info gpulist[] = {
> > > .address_space_size = SZ_16G,
> > > }, {
> > > .rev = ADRENO_REV(6, 3, 5, ANY_ID),
> > > +   .revn = 635,
> > > .fw = {
> > > [ADRENO_FW_SQE] = "a660_sqe.fw",
> > > [ADRENO_FW_GMU] = "a660_gmu.bin",
> > >
> >
> > hmm, I realized a problem with this, it would change what
> > MSM_PARAM_GPU_ID and more importantly MSM_PARAM_CHIP_ID return..  The
> > former should be "harmless", although it isn't a good idea for uabi
> > changes to be a side effect of a fix.  The latter is more problematic.
>
> I'd say MSM_PARAM_GPU_ID is broken for 635 anyway (won't it return 0
> in this case)?
> So the new value should be correct.

no, it is very much intentional that GPU_ID returns 0 for newer GPUs,
userspace should be matching on CHIP_ID.  (Also, we should be moving
away from trying to infer generation/etc from CHIP_ID.. userspace is
farther ahead of the kernel on this.)

> But more importantly, why are we exporting speedbin in
> MSM_PARAM_CHIP_ID only if there is no revn? And why are we exporting
> the speedbin at all as a part of CHIP_ID?

Basically just being paranoid about not changing uabi.  It probably
would be ok to export the speedbin for all, but I'd have to double
check mesa version history.

BR,
-R

> >
> > I think I'm leaning more towards reverting commit cc943f43ece7
> > ("drm/msm/adreno: warn if chip revn is verified before being set") for
> > -fixes.  I'm still thinking about options for a longer term fix.
> >
> > BR,
> > -R
> >
> >
> > > ---
> > > base-commit: 5c875096d59010cee4e00da1f9c7bdb07a025dc2
> > > change-id: 20230628-topic-a635-1b3c2c987417
> > >
> > > Best regards,
> > > --
> > > Konrad Dybcio 
> > >
>
>
>
> --
> With best wishes
> Dmitry