@@ -765,7 +765,7 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
struct drm_rect *dst = &plane_state->dst;
unsigned int rotation = plane_state->rotation;
struct drm_rect clip = {};
- int hscale, vscale;
+ int hscale, vscale, ret;
WARN_ON(plane_state->crtc && plane_state->crtc != crtc_state->crtc);
@@ -791,9 +791,9 @@ int drm_atomic_helper_check_plane_state(struct drm_plane_state *plane_state,
drm_rect_rotate(src, fb->width << 16, fb->height << 16, rotation);
/* Check scaling */
- hscale = drm_rect_calc_hscale(src, dst, min_scale, max_scale);
- vscale = drm_rect_calc_vscale(src, dst, min_scale, max_scale);
- if (hscale < 0 || vscale < 0) {
+ ret = drm_rect_calc_hscale(src, dst, min_scale, max_scale, &hscale);
+ ret |= drm_rect_calc_vscale(src, dst, min_scale, max_scale, &vscale);
+ if (ret) {
DRM_DEBUG_KMS("Invalid scaling of plane\n");
drm_rect_debug_print("src: ", &plane_state->src, true);
drm_rect_debug_print("dst: ", &plane_state->dst, false);
@@ -145,6 +145,7 @@ static int drm_calc_scale(int src, int dst)
* @dst: destination window rectangle
* @min_hscale: minimum allowed horizontal scaling factor
* @max_hscale: maximum allowed horizontal scaling factor
+ * @hscale: calculated horizontal scaling factor
*
* Calculate the horizontal scaling factor as
* (@src width) / (@dst width).
@@ -154,23 +155,25 @@ static int drm_calc_scale(int src, int dst)
* pessimistic limit calculation.
*
* RETURNS:
- * The horizontal scaling factor, or errno of out of limits.
+ * Zero on success, or errno on out of limits.
*/
int drm_rect_calc_hscale(const struct drm_rect *src,
const struct drm_rect *dst,
- int min_hscale, int max_hscale)
+ int min_hscale, int max_hscale,
+ int *hscale)
{
int src_w = drm_rect_width(src);
int dst_w = drm_rect_width(dst);
- int hscale = drm_calc_scale(src_w, dst_w);
- if (hscale < 0 || dst_w == 0)
- return hscale;
+ *hscale = drm_calc_scale(src_w, dst_w);
- if (hscale < min_hscale || hscale > max_hscale)
+ if (*hscale < 0 || dst_w == 0)
+ return *hscale;
+
+ if (*hscale < min_hscale || *hscale > max_hscale)
return -ERANGE;
- return hscale;
+ return 0;
}
EXPORT_SYMBOL(drm_rect_calc_hscale);
@@ -180,6 +183,7 @@ EXPORT_SYMBOL(drm_rect_calc_hscale);
* @dst: destination window rectangle
* @min_vscale: minimum allowed vertical scaling factor
* @max_vscale: maximum allowed vertical scaling factor
+ * @hscale: calculated vertical scaling factor
*
* Calculate the vertical scaling factor as
* (@src height) / (@dst height).
@@ -189,23 +193,25 @@ EXPORT_SYMBOL(drm_rect_calc_hscale);
* pessimistic limit calculation.
*
* RETURNS:
- * The vertical scaling factor, or errno of out of limits.
+ * Zero on success, or errno on out of limits.
*/
int drm_rect_calc_vscale(const struct drm_rect *src,
const struct drm_rect *dst,
- int min_vscale, int max_vscale)
+ int min_vscale, int max_vscale,
+ int *vscale)
{
int src_h = drm_rect_height(src);
int dst_h = drm_rect_height(dst);
- int vscale = drm_calc_scale(src_h, dst_h);
- if (vscale < 0 || dst_h == 0)
- return vscale;
+ *vscale = drm_calc_scale(src_h, dst_h);
+
+ if (*vscale < 0 || dst_h == 0)
+ return *vscale;
- if (vscale < min_vscale || vscale > max_vscale)
+ if (*vscale < min_vscale || *vscale > max_vscale)
return -ERANGE;
- return vscale;
+ return 0;
}
EXPORT_SYMBOL(drm_rect_calc_vscale);
@@ -361,12 +361,12 @@ skl_program_scaler(struct intel_plane *plane,
u16 y_vphase, uv_rgb_vphase;
int hscale, vscale;
- hscale = drm_rect_calc_hscale(&plane_state->base.src,
- &plane_state->base.dst,
- 0, INT_MAX);
- vscale = drm_rect_calc_vscale(&plane_state->base.src,
- &plane_state->base.dst,
- 0, INT_MAX);
+ drm_rect_calc_hscale(&plane_state->base.src,
+ &plane_state->base.dst,
+ 0, INT_MAX, &hscale);
+ drm_rect_calc_vscale(&plane_state->base.src,
+ &plane_state->base.dst,
+ 0, INT_MAX, &vscale);
/* TODO: handle sub-pixel coordinates */
if (drm_format_info_is_yuv_semiplanar(fb->format) &&
@@ -658,7 +658,7 @@ int dpu_plane_validate_multirect_v2(struct dpu_multirect_plane_states *plane)
}
for (i = 0; i < R_MAX; i++) {
- int width_threshold;
+ int width_threshold, ret, hscale, vscale;
pstate[i] = to_dpu_plane_state(drm_state[i]);
dpu_plane[i] = to_dpu_plane(drm_state[i]->plane);
@@ -676,8 +676,10 @@ int dpu_plane_validate_multirect_v2(struct dpu_multirect_plane_states *plane)
dst[i] = drm_plane_state_dest(drm_state[i]);
- if (drm_rect_calc_hscale(&src[i], &dst[i], 1, 1) != 1 ||
- drm_rect_calc_vscale(&src[i], &dst[i], 1, 1) != 1) {
+ ret = drm_rect_calc_hscale(&src[i], &dst[i], 1, 1, &hscale);
+ ret |= drm_rect_calc_vscale(&src[i], &dst[i], 1, 1, &vscale);
+
+ if (ret || hscale != 1 || vscale != 1) {
DPU_ERROR_PLANE(dpu_plane[i],
"scaling is not supported in multirect mode\n");
return -EINVAL;
@@ -178,10 +178,12 @@ bool drm_rect_clip_scaled(struct drm_rect *src, struct drm_rect *dst,
const struct drm_rect *clip);
int drm_rect_calc_hscale(const struct drm_rect *src,
const struct drm_rect *dst,
- int min_hscale, int max_hscale);
+ int min_hscale, int max_hscale,
+ int *hscale);
int drm_rect_calc_vscale(const struct drm_rect *src,
const struct drm_rect *dst,
- int min_vscale, int max_vscale);
+ int min_vscale, int max_vscale,
+ int *vscale);
void drm_rect_debug_print(const char *prefix,
const struct drm_rect *r, bool fixed_point);
void drm_rect_rotate(struct drm_rect *r,