skl_ddb_allocation: Respect the minimum number of blocks

Signed-off-by: Damien Lespiau <damien.lespiau@intel.com>
This commit is contained in:
Damien Lespiau 2014-10-15 23:13:30 +01:00
parent 7296e09ee7
commit cba3088619

View File

@ -224,6 +224,7 @@ skl_allocate_pipe_ddb(struct drm_crtc *crtc,
enum pipe pipe = intel_crtc->pipe; enum pipe pipe = intel_crtc->pipe;
struct skl_ddb_entry alloc; struct skl_ddb_entry alloc;
uint16_t alloc_size, start, cursor_blocks; uint16_t alloc_size, start, cursor_blocks;
uint16_t minimum[I915_MAX_PLANES];
unsigned int total_data_rate; unsigned int total_data_rate;
int plane; int plane;
@ -242,9 +243,21 @@ skl_allocate_pipe_ddb(struct drm_crtc *crtc,
alloc_size -= cursor_blocks; alloc_size -= cursor_blocks;
alloc.end -= cursor_blocks; alloc.end -= cursor_blocks;
/* 1. Allocate the mininum required blocks for each active plane */
for_each_plane(pipe, plane) {
const struct intel_plane_wm_parameters *p;
p = &params->plane[plane];
if (!p->enabled)
continue;
minimum[plane] = 8;
alloc_size -= minimum[plane];
}
/* /*
* Each active plane get a portion of the remaining space, in * 2. Distribute the remaining space in proportion to the amount of
* proportion to the amount of data they need to fetch from memory. * data each plane needs to fetch from memory.
* *
* FIXME: we may not allocate every single block here. * FIXME: we may not allocate every single block here.
*/ */
@ -266,8 +279,9 @@ skl_allocate_pipe_ddb(struct drm_crtc *crtc,
* promote the expression to 64 bits to avoid overflowing, the * promote the expression to 64 bits to avoid overflowing, the
* result is < available as data_rate / total_data_rate < 1 * result is < available as data_rate / total_data_rate < 1
*/ */
plane_blocks = div_u64((uint64_t)alloc_size * data_rate, plane_blocks = minimum[plane];
total_data_rate); plane_blocks += div_u64((uint64_t)alloc_size * data_rate,
total_data_rate);
ddb->plane[pipe][plane].start = start; ddb->plane[pipe][plane].start = start;
ddb->plane[pipe][plane].end = start + plane_blocks; ddb->plane[pipe][plane].end = start + plane_blocks;