const struct skl_wm_level *wm,
u64 data_rate)
{
- u16 extra;
+ u16 extra = 0;
- extra = min_t(u16, iter->size,
- DIV64_U64_ROUND_UP(iter->size * data_rate, iter->data_rate));
- iter->size -= extra;
- iter->data_rate -= data_rate;
+ if (data_rate) {
+ extra = min_t(u16, iter->size,
+ DIV64_U64_ROUND_UP(iter->size * data_rate,
+ iter->data_rate));
+ iter->size -= extra;
+ iter->data_rate -= data_rate;
+ }
return wm->min_ddb_alloc + extra;
}
skl_ddb_entry_init(&crtc_state->wm.skl.plane_ddb_y[PLANE_CURSOR],
alloc->end - iter.total[PLANE_CURSOR], alloc->end);
- if (iter.data_rate == 0)
- return 0;
-
/*
* Find the highest watermark level for which we can satisfy the block
* requirement of active planes.
return -EINVAL;
}
+ /* avoid the WARN later when we don't allocate any extra DDB */
+ if (iter.data_rate == 0)
+ iter.size = 0;
+
/*
* Grant each plane the blocks it requires at the highest achievable
* watermark level, plus an extra share of the leftover blocks
if (plane_id == PLANE_CURSOR)
continue;
- /*
- * We've accounted for all active planes; remaining planes are
- * all disabled.
- */
- if (iter.data_rate == 0)
- break;
-
iter.total[plane_id] =
skl_allocate_plane_ddb(&iter, &wm->wm[level],
crtc_state->plane_data_rate[plane_id]);
- if (iter.data_rate == 0)
- break;
-
iter.uv_total[plane_id] =
skl_allocate_plane_ddb(&iter, &wm->uv_wm[level],
crtc_state->uv_plane_data_rate[plane_id]);