Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/omapdrm: Remove struct drm_fb_helper from struct omap_fbdev.

Store instances of drm_fb_helper and struct omap_fbdev separately.
This will allow omapdrm to use the common fbdev client, which allocates
its own instance of struct drm_fb_helper.

There is at most one instance of each per DRM device, so both can be
referenced directly from the omap and DRM device structures. A later
patchset might rework the common fbdev client to allow for storing
both, drm_fb_helper and omap_fbdev, together in the same place.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Acked-by: Javier Martinez Canillas <javierm@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240924071734.98201-80-tzimmermann@suse.de

+26 -19
+3
drivers/gpu/drm/omapdrm/omap_drv.h
··· 32 32 #define MODULE_NAME "omapdrm" 33 33 34 34 struct omap_drm_usergart; 35 + struct omap_fbdev; 35 36 36 37 struct omap_drm_pipeline { 37 38 struct drm_crtc *crtc; ··· 98 97 99 98 /* memory bandwidth limit if it is needed on the platform */ 100 99 unsigned int max_bandwidth; 100 + 101 + struct omap_fbdev *fbdev; 101 102 }; 102 103 103 104
+23 -19
drivers/gpu/drm/omapdrm/omap_fbdev.c
··· 13 13 #include <drm/drm_fourcc.h> 14 14 #include <drm/drm_framebuffer.h> 15 15 #include <drm/drm_gem_framebuffer_helper.h> 16 + #include <drm/drm_managed.h> 16 17 #include <drm/drm_util.h> 17 18 18 19 #include "omap_drv.h" ··· 27 26 * fbdev funcs, to implement legacy fbdev interface on top of drm driver 28 27 */ 29 28 30 - #define to_omap_fbdev(x) container_of(x, struct omap_fbdev, base) 31 - 32 29 struct omap_fbdev { 33 - struct drm_fb_helper base; 30 + struct drm_device *dev; 34 31 bool ywrap_enabled; 35 32 36 33 /* for deferred dmm roll when getting called in atomic ctx */ ··· 40 41 static void pan_worker(struct work_struct *work) 41 42 { 42 43 struct omap_fbdev *fbdev = container_of(work, struct omap_fbdev, work); 43 - struct drm_fb_helper *helper = &fbdev->base; 44 + struct drm_fb_helper *helper = fbdev->dev->fb_helper; 44 45 struct fb_info *fbi = helper->info; 45 46 struct drm_gem_object *bo = drm_gem_fb_get_obj(helper->fb, 0); 46 47 int npages; ··· 54 55 drm_fb_helper_damage_range, 55 56 drm_fb_helper_damage_area) 56 57 57 - static int omap_fbdev_pan_display(struct fb_var_screeninfo *var, 58 - struct fb_info *fbi) 58 + static int omap_fbdev_pan_display(struct fb_var_screeninfo *var, struct fb_info *fbi) 59 59 { 60 60 struct drm_fb_helper *helper = get_fb(fbi); 61 - struct omap_fbdev *fbdev = to_omap_fbdev(helper); 61 + struct omap_drm_private *priv; 62 + struct omap_fbdev *fbdev; 62 63 63 64 if (!helper) 64 65 goto fallback; 65 66 67 + priv = helper->dev->dev_private; 68 + fbdev = priv->fbdev; 69 + 66 70 if (!fbdev->ywrap_enabled) 67 71 goto fallback; 68 72 69 - if (drm_can_sleep()) { 73 + if (drm_can_sleep()) 70 74 pan_worker(&fbdev->work); 71 - } else { 72 - struct omap_drm_private *priv = helper->dev->dev_private; 75 + else 73 76 queue_work(priv->wq, &fbdev->work); 74 - } 75 77 76 78 return 0; 77 79 ··· 92 92 struct drm_fb_helper *helper = info->par; 93 93 struct drm_framebuffer *fb = helper->fb; 94 94 struct drm_gem_object *bo = drm_gem_fb_get_obj(fb, 0); 95 - struct omap_fbdev *fbdev = to_omap_fbdev(helper); 96 95 97 96 DBG(); 98 97 ··· 103 104 104 105 drm_client_release(&helper->client); 105 106 drm_fb_helper_unprepare(helper); 106 - kfree(fbdev); 107 + kfree(helper); 107 108 } 108 109 109 110 /* ··· 127 128 static int omap_fbdev_create(struct drm_fb_helper *helper, 128 129 struct drm_fb_helper_surface_size *sizes) 129 130 { 130 - struct omap_fbdev *fbdev = to_omap_fbdev(helper); 131 131 struct drm_device *dev = helper->dev; 132 132 struct omap_drm_private *priv = dev->dev_private; 133 + struct omap_fbdev *fbdev = priv->fbdev; 133 134 struct drm_framebuffer *fb = NULL; 134 135 union omap_gem_size gsize; 135 136 struct fb_info *fbi = NULL; ··· 337 338 338 339 void omap_fbdev_setup(struct drm_device *dev) 339 340 { 341 + struct omap_drm_private *priv = dev->dev_private; 340 342 struct omap_fbdev *fbdev; 341 343 struct drm_fb_helper *helper; 342 344 int ret; ··· 345 345 drm_WARN(dev, !dev->registered, "Device has not been registered.\n"); 346 346 drm_WARN(dev, dev->fb_helper, "fb_helper is already set!\n"); 347 347 348 - fbdev = kzalloc(sizeof(*fbdev), GFP_KERNEL); 348 + fbdev = drmm_kzalloc(dev, sizeof(*fbdev), GFP_KERNEL); 349 349 if (!fbdev) 350 350 return; 351 - helper = &fbdev->base; 351 + fbdev->dev = dev; 352 + INIT_WORK(&fbdev->work, pan_worker); 352 353 354 + priv->fbdev = fbdev; 355 + 356 + helper = kzalloc(sizeof(*helper), GFP_KERNEL); 357 + if (!helper) 358 + return; 353 359 drm_fb_helper_prepare(dev, helper, 32, &omap_fb_helper_funcs); 354 360 355 361 ret = drm_client_init(dev, &helper->client, "fbdev", &omap_fbdev_client_funcs); 356 362 if (ret) 357 363 goto err_drm_client_init; 358 - 359 - INIT_WORK(&fbdev->work, pan_worker); 360 364 361 365 drm_client_register(&helper->client); 362 366 ··· 368 364 369 365 err_drm_client_init: 370 366 drm_fb_helper_unprepare(helper); 371 - kfree(fbdev); 367 + kfree(helper); 372 368 }