drm/i915/scaler: Refactor max_scale computation

Refactor max scaling factor computation into a reusable
function for scalers.

--v2:
- Add missing comment. [Ankit]

Signed-off-by: Mitul Golani <mitulkumar.ajitkumar.golani@intel.com>
Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20250120172209.188488-4-mitulkumar.ajitkumar.golani@intel.com
This commit is contained in:
Mitul Golani
2025-01-20 22:52:04 +05:30
committed by Ankit Nautiyal
parent f42da9aa86
commit cabb162f7b

View File

@@ -319,6 +319,44 @@ static int intel_allocate_scaler(struct intel_crtc_scaler_state *scaler_state,
return -1;
}
static void
calculate_max_scale(struct intel_crtc *crtc,
bool is_yuv_semiplanar,
int scaler_id,
int *max_hscale, int *max_vscale)
{
struct intel_display *display = to_intel_display(crtc);
/*
* FIXME: When two scalers are needed, but only one of
* them needs to downscale, we should make sure that
* the one that needs downscaling support is assigned
* as the first scaler, so we don't reject downscaling
* unnecessarily.
*/
if (DISPLAY_VER(display) >= 14) {
/*
* On versions 14 and up, only the first
* scaler supports a vertical scaling factor
* of more than 1.0, while a horizontal
* scaling factor of 3.0 is supported.
*/
*max_hscale = 0x30000 - 1;
if (scaler_id == 0)
*max_vscale = 0x30000 - 1;
else
*max_vscale = 0x10000;
} else if (DISPLAY_VER(display) >= 10 || !is_yuv_semiplanar) {
*max_hscale = 0x30000 - 1;
*max_vscale = 0x30000 - 1;
} else {
*max_hscale = 0x20000 - 1;
*max_vscale = 0x20000 - 1;
}
}
static int intel_atomic_setup_scaler(struct intel_crtc_state *crtc_state,
int num_scalers_need, struct intel_crtc *crtc,
const char *name, int idx,
@@ -388,35 +426,9 @@ static int intel_atomic_setup_scaler(struct intel_crtc_state *crtc_state,
const struct drm_rect *dst = &plane_state->uapi.dst;
int hscale, vscale, max_vscale, max_hscale;
/*
* FIXME: When two scalers are needed, but only one of
* them needs to downscale, we should make sure that
* the one that needs downscaling support is assigned
* as the first scaler, so we don't reject downscaling
* unnecessarily.
*/
if (DISPLAY_VER(display) >= 14) {
/*
* On versions 14 and up, only the first
* scaler supports a vertical scaling factor
* of more than 1.0, while a horizontal
* scaling factor of 3.0 is supported.
*/
max_hscale = 0x30000 - 1;
if (*scaler_id == 0)
max_vscale = 0x30000 - 1;
else
max_vscale = 0x10000;
} else if (DISPLAY_VER(display) >= 10 ||
!intel_format_info_is_yuv_semiplanar(fb->format, fb->modifier)) {
max_hscale = 0x30000 - 1;
max_vscale = 0x30000 - 1;
} else {
max_hscale = 0x20000 - 1;
max_vscale = 0x20000 - 1;
}
calculate_max_scale(crtc,
intel_format_info_is_yuv_semiplanar(fb->format, fb->modifier),
*scaler_id, &max_hscale, &max_vscale);
/*
* FIXME: We should change the if-else block above to