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

Configure Feed

Select the types of activity you want to include in your feed.

drm/fbdev-shmem: Support struct drm_driver.fbdev_probe

Rework fbdev probing to support fbdev_probe in struct drm_driver
and reimplement the old fb_probe callback on top of it. Provide an
initializer macro for struct drm_driver that sets the callback
according to the kernel configuration.

This change allows the common fbdev client to run on top of SHMEM-
based DRM drivers.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240924071734.98201-50-tzimmermann@suse.de

+47 -24
+36 -24
drivers/gpu/drm/drm_fbdev_shmem.c
··· 108 108 static int drm_fbdev_shmem_helper_fb_probe(struct drm_fb_helper *fb_helper, 109 109 struct drm_fb_helper_surface_size *sizes) 110 110 { 111 + return drm_fbdev_shmem_driver_fbdev_probe(fb_helper, sizes); 112 + } 113 + 114 + static int drm_fbdev_shmem_helper_fb_dirty(struct drm_fb_helper *helper, 115 + struct drm_clip_rect *clip) 116 + { 117 + struct drm_device *dev = helper->dev; 118 + int ret; 119 + 120 + /* Call damage handlers only if necessary */ 121 + if (!(clip->x1 < clip->x2 && clip->y1 < clip->y2)) 122 + return 0; 123 + 124 + if (helper->fb->funcs->dirty) { 125 + ret = helper->fb->funcs->dirty(helper->fb, NULL, 0, 0, clip, 1); 126 + if (drm_WARN_ONCE(dev, ret, "Dirty helper failed: ret=%d\n", ret)) 127 + return ret; 128 + } 129 + 130 + return 0; 131 + } 132 + 133 + static const struct drm_fb_helper_funcs drm_fbdev_shmem_helper_funcs = { 134 + .fb_probe = drm_fbdev_shmem_helper_fb_probe, 135 + .fb_dirty = drm_fbdev_shmem_helper_fb_dirty, 136 + }; 137 + 138 + /* 139 + * struct drm_driver 140 + */ 141 + 142 + int drm_fbdev_shmem_driver_fbdev_probe(struct drm_fb_helper *fb_helper, 143 + struct drm_fb_helper_surface_size *sizes) 144 + { 111 145 struct drm_client_dev *client = &fb_helper->client; 112 146 struct drm_device *dev = fb_helper->dev; 113 147 struct drm_client_buffer *buffer; ··· 173 139 goto err_drm_client_buffer_delete; 174 140 } 175 141 142 + fb_helper->funcs = &drm_fbdev_shmem_helper_funcs; 176 143 fb_helper->buffer = buffer; 177 144 fb_helper->fb = fb; 178 145 ··· 217 182 drm_client_framebuffer_delete(buffer); 218 183 return ret; 219 184 } 220 - 221 - static int drm_fbdev_shmem_helper_fb_dirty(struct drm_fb_helper *helper, 222 - struct drm_clip_rect *clip) 223 - { 224 - struct drm_device *dev = helper->dev; 225 - int ret; 226 - 227 - /* Call damage handlers only if necessary */ 228 - if (!(clip->x1 < clip->x2 && clip->y1 < clip->y2)) 229 - return 0; 230 - 231 - if (helper->fb->funcs->dirty) { 232 - ret = helper->fb->funcs->dirty(helper->fb, NULL, 0, 0, clip, 1); 233 - if (drm_WARN_ONCE(dev, ret, "Dirty helper failed: ret=%d\n", ret)) 234 - return ret; 235 - } 236 - 237 - return 0; 238 - } 239 - 240 - static const struct drm_fb_helper_funcs drm_fbdev_shmem_helper_funcs = { 241 - .fb_probe = drm_fbdev_shmem_helper_fb_probe, 242 - .fb_dirty = drm_fbdev_shmem_helper_fb_dirty, 243 - }; 185 + EXPORT_SYMBOL(drm_fbdev_shmem_driver_fbdev_probe); 244 186 245 187 /* 246 188 * struct drm_client_funcs
+11
include/drm/drm_fbdev_shmem.h
··· 4 4 #define DRM_FBDEV_SHMEM_H 5 5 6 6 struct drm_device; 7 + struct drm_fb_helper; 8 + struct drm_fb_helper_surface_size; 7 9 8 10 #ifdef CONFIG_DRM_FBDEV_EMULATION 11 + int drm_fbdev_shmem_driver_fbdev_probe(struct drm_fb_helper *fb_helper, 12 + struct drm_fb_helper_surface_size *sizes); 13 + 14 + #define DRM_FBDEV_SHMEM_DRIVER_OPS \ 15 + .fbdev_probe = drm_fbdev_shmem_driver_fbdev_probe 16 + 9 17 void drm_fbdev_shmem_setup(struct drm_device *dev, unsigned int preferred_bpp); 10 18 #else 11 19 static inline void drm_fbdev_shmem_setup(struct drm_device *dev, unsigned int preferred_bpp) 12 20 { } 21 + 22 + #define DRM_FBDEV_SHMEM_DRIVER_OPS \ 23 + .fbdev_probe = NULL 13 24 #endif 14 25 15 26 #endif