drm/i915: Compute config and mode valid changes for ultrajoiner

Implement required changes for mode validation and compute config,
to support Ultrajoiner.

v2:
-Drop changes for HDMI.
-Separate out DSC changes into another patch.
v3: Fix check in can_ultrajoiner. (Ankit)
v4:
-Unify helper to check joiner requirement. (Ville)
-Split patches for ultrajoiner changes for max dsc slices and compressed
bpp.(Ankit)
v5: Fix check for joiner. (Ville)

Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240930163549.416410-12-ankit.k.nautiyal@intel.com
This commit is contained in:
Stanislav Lisovskiy 2024-09-30 22:05:47 +05:30 committed by Ankit Nautiyal
parent f84be3b3f8
commit 988d9e5fdd

View File

@ -1307,26 +1307,38 @@ intel_dp_mode_valid_downstream(struct intel_connector *connector,
}
static
bool intel_dp_needs_bigjoiner(struct intel_dp *intel_dp,
struct intel_connector *connector,
int hdisplay, int clock)
bool intel_dp_needs_joiner(struct intel_dp *intel_dp,
struct intel_connector *connector,
int hdisplay, int clock,
int num_joined_pipes)
{
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
if (!intel_dp_has_joiner(intel_dp))
return false;
return clock > i915->display.cdclk.max_dotclk_freq || hdisplay > 5120;
num_joined_pipes /= 2;
return clock > num_joined_pipes * i915->display.cdclk.max_dotclk_freq ||
hdisplay > num_joined_pipes * 5120;
}
int intel_dp_num_joined_pipes(struct intel_dp *intel_dp,
struct intel_connector *connector,
int hdisplay, int clock)
{
struct intel_display *display = to_intel_display(intel_dp);
struct drm_i915_private *i915 = to_i915(display->drm);
if (connector->force_joined_pipes)
return connector->force_joined_pipes;
if (intel_dp_needs_bigjoiner(intel_dp, connector, hdisplay, clock))
if (HAS_ULTRAJOINER(i915) &&
intel_dp_needs_joiner(intel_dp, connector, hdisplay, clock, 4))
return 4;
if ((HAS_BIGJOINER(i915) || HAS_UNCOMPRESSED_JOINER(i915)) &&
intel_dp_needs_joiner(intel_dp, connector, hdisplay, clock, 2))
return 2;
return 1;
@ -2532,8 +2544,10 @@ bool intel_dp_joiner_needs_dsc(struct drm_i915_private *i915,
* Pipe joiner needs compression up to display 12 due to bandwidth
* limitation. DG2 onwards pipe joiner can be enabled without
* compression.
* Ultrajoiner always needs compression.
*/
return !HAS_UNCOMPRESSED_JOINER(i915) && num_joined_pipes == 2;
return (!HAS_UNCOMPRESSED_JOINER(i915) && num_joined_pipes == 2) ||
num_joined_pipes == 4;
}
static int