--- a/sys/dev/drm/i915/intel_pm.c +++ b/sys/dev/drm/i915/intel_pm.c @@ -3820,7 +3820,7 @@ static u16 intel_get_ddb_size(struct drm_i915_private *dev_priv, const struct intel_crtc_state *cstate, - const unsigned int total_data_rate, + const uint64_t total_data_rate, const int num_active, struct skl_ddb_allocation *ddb) { @@ -3852,7 +3852,7 @@ static void skl_ddb_get_pipe_allocation_limits(struct drm_device *dev, const struct intel_crtc_state *cstate, - const unsigned int total_data_rate, + const uint64_t total_data_rate, struct skl_ddb_allocation *ddb, struct skl_ddb_entry *alloc, /* out */ int *num_active /* out */) @@ -4175,7 +4175,7 @@ return 0; } -static unsigned int +static uint64_t skl_plane_relative_data_rate(const struct intel_crtc_state *cstate, const struct drm_plane_state *pstate, const int plane) @@ -4187,6 +4187,7 @@ struct drm_framebuffer *fb; u32 format; uint_fixed_16_16_t down_scale_amount; + uint64_t rate; if (!intel_pstate->base.visible) return 0; @@ -4213,11 +4214,14 @@ height /= 2; } - data_rate = width * height * fb->format->cpp[plane]; + data_rate = width * height; down_scale_amount = skl_plane_downscale_amount(cstate, intel_pstate); - return mul_round_up_u32_fixed16(data_rate, down_scale_amount); + rate = mul_round_up_u32_fixed16(data_rate, down_scale_amount); + rate *= fb->format->cpp[plane]; + + return rate; } /* @@ -4225,16 +4229,16 @@ * a 8192x4096@32bpp framebuffer: * 3 * 4096 * 8192 * 4 < 2^32 */ -static unsigned int +static uint64_t skl_get_total_relative_data_rate(struct intel_crtc_state *intel_cstate, - unsigned int *plane_data_rate, - unsigned int *uv_plane_data_rate) + uint64_t *plane_data_rate, + uint64_t *uv_plane_data_rate) { struct drm_crtc_state *cstate = &intel_cstate->base; struct drm_atomic_state *state = cstate->state; struct drm_plane *plane; const struct drm_plane_state *pstate; - unsigned int total_data_rate = 0; + uint64_t total_data_rate = 0; if (WARN_ON(!state)) return 0; @@ -4242,7 +4246,7 @@ /* Calculate and cache data rate for each plane */ drm_atomic_crtc_state_for_each_plane_state(plane, pstate, cstate) { enum plane_id plane_id = to_intel_plane(plane)->id; - unsigned int rate; + uint64_t rate; /* packed/y */ rate = skl_plane_relative_data_rate(intel_cstate, @@ -4361,11 +4365,11 @@ uint16_t alloc_size, start; uint16_t minimum[I915_MAX_PLANES] = {}; uint16_t uv_minimum[I915_MAX_PLANES] = {}; - unsigned int total_data_rate; + uint64_t total_data_rate; enum plane_id plane_id; int num_active; - unsigned int plane_data_rate[I915_MAX_PLANES] = {}; - unsigned int uv_plane_data_rate[I915_MAX_PLANES] = {}; + uint64_t plane_data_rate[I915_MAX_PLANES] = {}; + uint64_t uv_plane_data_rate[I915_MAX_PLANES] = {}; uint16_t total_min_blocks = 0; /* Clear the partitioning for disabled planes. */ @@ -4424,7 +4428,7 @@ start = alloc->start; for_each_plane_id_on_crtc(intel_crtc, plane_id) { - unsigned int data_rate, uv_data_rate; + uint64_t data_rate, uv_data_rate; uint16_t plane_blocks, uv_plane_blocks; if (plane_id == PLANE_CURSOR)