@@ -21,9 +21,10 @@ static const struct drm_framebuffer_funcs armada_fb_funcs = {
struct armada_framebuffer *armada_framebuffer_create(struct drm_device *dev,
const struct drm_mode_fb_cmd2 *mode, struct armada_gem_object *obj)
{
+ const struct drm_format_info *info = drm_get_format_info(dev, mode);
struct armada_framebuffer *dfb;
uint8_t format, config;
- int ret;
+ int ret, i;
switch (mode->pixel_format) {
#define FMT(drm, fmt, mod) \
@@ -63,7 +64,8 @@ struct armada_framebuffer *armada_framebuffer_create(struct drm_device *dev,
dfb->fmt = format;
dfb->mod = config;
- dfb->fb.obj[0] = &obj->obj;
+ for (i = 0; i < info->num_planes; i++)
+ dfb->fb.obj[i] = &obj->obj;
drm_helper_mode_fill_fb_struct(dev, &dfb->fb, mode);
@@ -79,7 +81,8 @@ struct armada_framebuffer *armada_framebuffer_create(struct drm_device *dev,
* the above call, but the caller will drop their reference
* to it. Hence we need to take our own reference.
*/
- drm_gem_object_get(&obj->obj);
+ for (i = 0; i < info->num_planes; i++)
+ drm_gem_object_get(&obj->obj);
return dfb;
}
This driver uses a single GEM object even when there are multiple planes. Starting with commit 746b9c62cc86 ("drm/gem: Ignore color planes that are unused by framebuffer format"), multiple plane support was broken on armada because the object pointers for the additional planes were empty and drm_gem_plane_helper_prepare_fb was returning -EINVAL. Restore functionality by pointing to the same GEM object on all planes. Signed-off-by: Doug Brown <doug@schmorgal.com> --- drivers/gpu/drm/armada/armada_fb.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)