On Wed, Sep 18, 2024 at 08:13:40PM +0530, Ankit Nautiyal wrote:
> From: Stanislav Lisovskiy <[email protected]>
> 
> Add changes to DSC which are required for Ultrajoiner.
> 
> v2:
> -Use correct helper for setting bits for bigjoiner secondary. (Ankit)
> -Use primary/secondary instead of master/slave. (Suraj)
> v3: Add the ultrajoiner helpers and use it for setting ultrajoiner
> bits (Ankit)
> v4: Use num_vdsc_instances *= num_joined_pipes (Ville)
> 
> Signed-off-by: Stanislav Lisovskiy <[email protected]>
> Signed-off-by: Ankit Nautiyal <[email protected]>
> ---
>  drivers/gpu/drm/i915/display/intel_display.c | 21 +++++++++++++++++
>  drivers/gpu/drm/i915/display/intel_display.h |  2 ++
>  drivers/gpu/drm/i915/display/intel_vdsc.c    | 24 ++++++++++++++++++--
>  3 files changed, 45 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display.c 
> b/drivers/gpu/drm/i915/display/intel_display.c
> index 65119c26ec88..044f91359c42 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> @@ -314,6 +314,27 @@ u8 _intel_modeset_secondary_pipes(const struct 
> intel_crtc_state *crtc_state)
>       return bigjoiner_secondary_pipes(crtc_state);
>  }
>  
> +bool intel_crtc_is_ultrajoiner(const struct intel_crtc_state *crtc_state)
> +{
> +     return intel_crtc_num_joined_pipes(crtc_state) >= 4;
> +}
> +
> +static u8 ultrajoiner_primary_pipes(const struct intel_crtc_state 
> *crtc_state)
> +{
> +     if (!intel_crtc_is_ultrajoiner(crtc_state))
> +             return 0;
> +
> +     return crtc_state->joiner_pipes & (0b00010001 << 
> joiner_primary_pipe(crtc_state));
> +}
> +
> +bool intel_crtc_is_ultrajoiner_primary(const struct intel_crtc_state 
> *crtc_state)
> +{
> +     struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
> +
> +     return intel_crtc_is_ultrajoiner(crtc_state) &&
> +            BIT(crtc->pipe) & ultrajoiner_primary_pipes(crtc_state);
> +}
> +
>  u8 intel_crtc_joiner_secondary_pipes(const struct intel_crtc_state 
> *crtc_state)
>  {
>       if (crtc_state->joiner_pipes)
> diff --git a/drivers/gpu/drm/i915/display/intel_display.h 
> b/drivers/gpu/drm/i915/display/intel_display.h
> index 783562dc013b..6f470ffc61ea 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.h
> +++ b/drivers/gpu/drm/i915/display/intel_display.h
> @@ -442,6 +442,8 @@ bool intel_crtc_is_joiner_secondary(const struct 
> intel_crtc_state *crtc_state);
>  bool intel_crtc_is_joiner_primary(const struct intel_crtc_state *crtc_state);
>  bool intel_crtc_is_bigjoiner_primary(const struct intel_crtc_state 
> *crtc_state);
>  bool intel_crtc_is_bigjoiner_secondary(const struct intel_crtc_state 
> *crtc_state);
> +bool intel_crtc_is_ultrajoiner(const struct intel_crtc_state *crtc_state);
> +bool intel_crtc_is_ultrajoiner_primary(const struct intel_crtc_state 
> *crtc_state);
>  u8 intel_crtc_joiner_secondary_pipes(const struct intel_crtc_state 
> *crtc_state);
>  u8 _intel_modeset_primary_pipes(const struct intel_crtc_state *crtc_state);
>  u8 _intel_modeset_secondary_pipes(const struct intel_crtc_state *crtc_state);
> diff --git a/drivers/gpu/drm/i915/display/intel_vdsc.c 
> b/drivers/gpu/drm/i915/display/intel_vdsc.c
> index 8158e3702ed5..990abac12779 100644
> --- a/drivers/gpu/drm/i915/display/intel_vdsc.c
> +++ b/drivers/gpu/drm/i915/display/intel_vdsc.c
> @@ -379,9 +379,9 @@ static int intel_dsc_get_vdsc_per_pipe(const struct 
> intel_crtc_state *crtc_state
>  int intel_dsc_get_num_vdsc_instances(const struct intel_crtc_state 
> *crtc_state)
>  {
>       int num_vdsc_instances = intel_dsc_get_vdsc_per_pipe(crtc_state);
> +     int num_joined_pipes = intel_crtc_num_joined_pipes(crtc_state);
>  
> -     if (crtc_state->joiner_pipes)
> -             num_vdsc_instances *= 2;
> +     num_vdsc_instances *= num_joined_pipes;
>  
>       return num_vdsc_instances;
>  }
> @@ -751,6 +751,14 @@ void intel_uncompressed_joiner_enable(const struct 
> intel_crtc_state *crtc_state)
>       }
>  }
>  
> +static bool intel_crtc_ultrajoiner_enable_needed(const struct 
> intel_crtc_state *crtc_state)
> +{
> +     struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
> +
> +     return intel_crtc_is_ultrajoiner(crtc_state) &&
> +            crtc->pipe != PIPE_D;
> +}

For this I think we want a function similar to your
ultrajoiner_primary_pipes(), just with a 0b01110111 mask.

> +
>  void intel_dsc_enable(const struct intel_crtc_state *crtc_state)
>  {
>       struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
> @@ -770,7 +778,19 @@ void intel_dsc_enable(const struct intel_crtc_state 
> *crtc_state)
>               dss_ctl1_val |= JOINER_ENABLE;
>       }
>       if (crtc_state->joiner_pipes) {
> +             /*
> +              * This bit doesn't seem to follow primary/secondary logic or
> +              * any other logic, so lets just add helper function to
> +              * at least hide this hassle..
> +              */
> +             if (intel_crtc_ultrajoiner_enable_needed(crtc_state))
> +                     dss_ctl1_val |= ULTRA_JOINER_ENABLE;
> +
> +             if (intel_crtc_is_ultrajoiner_primary(crtc_state))
> +                     dss_ctl1_val |= PRIMARY_ULTRA_JOINER_ENABLE;
> +
>               dss_ctl1_val |= BIG_JOINER_ENABLE;
> +
>               if (intel_crtc_is_bigjoiner_primary(crtc_state))
>                       dss_ctl1_val |= PRIMARY_BIG_JOINER_ENABLE;
>       }
> -- 
> 2.45.2

-- 
Ville Syrjälä
Intel

Reply via email to