drm/mali-dp: Rotated planes need a larger pitch size.
Rotated planes need a pitch size that is aligned to 8 bytes for older DP500 and DP550 and at least 64 bytes for DP650. Replace the malidp_hw_pitch_valid() function with one that calculates the correct pitch alignment to take into account rotation. Signed-off-by: Liviu Dudau <liviu.dudau@arm.com>
This commit is contained in:
parent
963976cfe9
commit
fcad73b9b1
|
@ -285,10 +285,16 @@ void malidp_se_irq_fini(struct drm_device *drm);
|
|||
u8 malidp_hw_get_format_id(const struct malidp_hw_regmap *map,
|
||||
u8 layer_id, u32 format);
|
||||
|
||||
static inline bool malidp_hw_pitch_valid(struct malidp_hw_device *hwdev,
|
||||
unsigned int pitch)
|
||||
static inline u8 malidp_hw_get_pitch_align(struct malidp_hw_device *hwdev, bool rotated)
|
||||
{
|
||||
return !(pitch & (hwdev->hw->map.bus_align_bytes - 1));
|
||||
/*
|
||||
* only hardware that cannot do 8 bytes bus alignments have further
|
||||
* constraints on rotated planes
|
||||
*/
|
||||
if (hwdev->hw->map.bus_align_bytes == 8)
|
||||
return 8;
|
||||
else
|
||||
return hwdev->hw->map.bus_align_bytes << (rotated ? 2 : 0);
|
||||
}
|
||||
|
||||
/* U16.16 */
|
||||
|
|
|
@ -175,6 +175,7 @@ static int malidp_de_plane_check(struct drm_plane *plane,
|
|||
{
|
||||
struct malidp_plane *mp = to_malidp_plane(plane);
|
||||
struct malidp_plane_state *ms = to_malidp_plane_state(state);
|
||||
bool rotated = state->rotation & MALIDP_ROTATED_MASK;
|
||||
struct drm_framebuffer *fb;
|
||||
int i, ret;
|
||||
|
||||
|
@ -191,7 +192,8 @@ static int malidp_de_plane_check(struct drm_plane *plane,
|
|||
|
||||
ms->n_planes = fb->format->num_planes;
|
||||
for (i = 0; i < ms->n_planes; i++) {
|
||||
if (!malidp_hw_pitch_valid(mp->hwdev, fb->pitches[i])) {
|
||||
u8 alignment = malidp_hw_get_pitch_align(mp->hwdev, rotated);
|
||||
if (fb->pitches[i] & (alignment - 1)) {
|
||||
DRM_DEBUG_KMS("Invalid pitch %u for plane %d\n",
|
||||
fb->pitches[i], i);
|
||||
return -EINVAL;
|
||||
|
|
Loading…
Reference in New Issue