Skip to content

Commit c0a8e44

Browse files
committed
drm/radeon: Pass along the format info from .fb_create() to drm_helper_mode_fill_fb_struct()
Plumb the format info from .fb_create() all the way to drm_helper_mode_fill_fb_struct() to avoid the redundant lookup. For the fbdev case a manual drm_get_format_info() lookup is needed. The patch is based on the driver parts of the patchset at Link: below, which missed converting the radeon driver. Due to the absence of this change in the patchset at Link:, after the Fixed: commit below, radeon_framebuffer_init() -> drm_helper_mode_fill_fb_struct() set drm_framebuffer::format incorrectly to NULL, which lead to the !fb->format WARN() in drm_framebuffer_init() and causing framebuffer creation to fail. This patch fixes both of these issues. v2: Amend the commit log mentioning the functional issues the patch fixes. (Tomi) Cc: Ville Syrjälä <[email protected]> Cc: Alex Deucher <[email protected]> Cc: Christian König <[email protected]> Cc: Thomas Zimmermann <[email protected]> Cc: Maarten Lankhorst <[email protected]> Cc: Maxime Ripard <[email protected]> Cc: [email protected] Cc: Tomi Valkeinen <[email protected]> Fixes: 41ab92d ("drm: Make passing of format info to drm_helper_mode_fill_fb_struct() mandatory") Link: https://lore.kernel.org/all/[email protected] Acked-by: Alex Deucher <[email protected]> Tested-by: Linux Kernel Functional Testing <[email protected]> Signed-off-by: Imre Deak <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent d2b524c commit c0a8e44

File tree

3 files changed

+11
-7
lines changed

3 files changed

+11
-7
lines changed

drivers/gpu/drm/radeon/radeon_display.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1297,12 +1297,13 @@ static const struct drm_framebuffer_funcs radeon_fb_funcs = {
12971297
int
12981298
radeon_framebuffer_init(struct drm_device *dev,
12991299
struct drm_framebuffer *fb,
1300+
const struct drm_format_info *info,
13001301
const struct drm_mode_fb_cmd2 *mode_cmd,
13011302
struct drm_gem_object *obj)
13021303
{
13031304
int ret;
13041305
fb->obj[0] = obj;
1305-
drm_helper_mode_fill_fb_struct(dev, fb, NULL, mode_cmd);
1306+
drm_helper_mode_fill_fb_struct(dev, fb, info, mode_cmd);
13061307
ret = drm_framebuffer_init(dev, fb, &radeon_fb_funcs);
13071308
if (ret) {
13081309
fb->obj[0] = NULL;
@@ -1341,7 +1342,7 @@ radeon_user_framebuffer_create(struct drm_device *dev,
13411342
return ERR_PTR(-ENOMEM);
13421343
}
13431344

1344-
ret = radeon_framebuffer_init(dev, fb, mode_cmd, obj);
1345+
ret = radeon_framebuffer_init(dev, fb, info, mode_cmd, obj);
13451346
if (ret) {
13461347
kfree(fb);
13471348
drm_gem_object_put(obj);

drivers/gpu/drm/radeon/radeon_fbdev.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,10 @@ static void radeon_fbdev_destroy_pinned_object(struct drm_gem_object *gobj)
5353
}
5454

5555
static int radeon_fbdev_create_pinned_object(struct drm_fb_helper *fb_helper,
56+
const struct drm_format_info *info,
5657
struct drm_mode_fb_cmd2 *mode_cmd,
5758
struct drm_gem_object **gobj_p)
5859
{
59-
const struct drm_format_info *info;
6060
struct radeon_device *rdev = fb_helper->dev->dev_private;
6161
struct drm_gem_object *gobj = NULL;
6262
struct radeon_bo *rbo = NULL;
@@ -67,8 +67,6 @@ static int radeon_fbdev_create_pinned_object(struct drm_fb_helper *fb_helper,
6767
int height = mode_cmd->height;
6868
u32 cpp;
6969

70-
info = drm_get_format_info(rdev_to_drm(rdev), mode_cmd->pixel_format,
71-
mode_cmd->modifier[0]);
7270
cpp = info->cpp[0];
7371

7472
/* need to align pitch with crtc limits */
@@ -206,6 +204,7 @@ int radeon_fbdev_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
206204
struct drm_fb_helper_surface_size *sizes)
207205
{
208206
struct radeon_device *rdev = fb_helper->dev->dev_private;
207+
const struct drm_format_info *format_info;
209208
struct drm_mode_fb_cmd2 mode_cmd = { };
210209
struct fb_info *info;
211210
struct drm_gem_object *gobj;
@@ -224,7 +223,9 @@ int radeon_fbdev_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
224223
mode_cmd.pixel_format = drm_mode_legacy_fb_format(sizes->surface_bpp,
225224
sizes->surface_depth);
226225

227-
ret = radeon_fbdev_create_pinned_object(fb_helper, &mode_cmd, &gobj);
226+
format_info = drm_get_format_info(rdev_to_drm(rdev), mode_cmd.pixel_format,
227+
mode_cmd.modifier[0]);
228+
ret = radeon_fbdev_create_pinned_object(fb_helper, format_info, &mode_cmd, &gobj);
228229
if (ret) {
229230
DRM_ERROR("failed to create fbcon object %d\n", ret);
230231
return ret;
@@ -236,7 +237,7 @@ int radeon_fbdev_driver_fbdev_probe(struct drm_fb_helper *fb_helper,
236237
ret = -ENOMEM;
237238
goto err_radeon_fbdev_destroy_pinned_object;
238239
}
239-
ret = radeon_framebuffer_init(rdev_to_drm(rdev), fb, &mode_cmd, gobj);
240+
ret = radeon_framebuffer_init(rdev_to_drm(rdev), fb, format_info, &mode_cmd, gobj);
240241
if (ret) {
241242
DRM_ERROR("failed to initialize framebuffer %d\n", ret);
242243
goto err_kfree;

drivers/gpu/drm/radeon/radeon_mode.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040

4141
struct drm_fb_helper;
4242
struct drm_fb_helper_surface_size;
43+
struct drm_format_info;
4344

4445
struct edid;
4546
struct drm_edid;
@@ -890,6 +891,7 @@ extern void
890891
radeon_combios_encoder_dpms_scratch_regs(struct drm_encoder *encoder, bool on);
891892
int radeon_framebuffer_init(struct drm_device *dev,
892893
struct drm_framebuffer *rfb,
894+
const struct drm_format_info *info,
893895
const struct drm_mode_fb_cmd2 *mode_cmd,
894896
struct drm_gem_object *obj);
895897

0 commit comments

Comments
 (0)