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

drm/msm: add helper to allocate stolen fb

We'll later want to re-use this for state-readback when bootloader
enables display, so that we can create an fb for the initial
plane->state->fb.

Signed-off-by: Rob Clark <robdclark@gmail.com>

+50 -28
+2
drivers/gpu/drm/msm/msm_drv.h
··· 256 256 const struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos); 257 257 struct drm_framebuffer *msm_framebuffer_create(struct drm_device *dev, 258 258 struct drm_file *file, const struct drm_mode_fb_cmd2 *mode_cmd); 259 + struct drm_framebuffer * msm_alloc_stolen_fb(struct drm_device *dev, 260 + int w, int h, int p, uint32_t format); 259 261 260 262 struct drm_fb_helper *msm_fbdev_init(struct drm_device *dev); 261 263 void msm_fbdev_free(struct drm_device *dev);
+41
drivers/gpu/drm/msm/msm_fb.c
··· 20 20 21 21 #include "msm_drv.h" 22 22 #include "msm_kms.h" 23 + #include "msm_gem.h" 23 24 24 25 struct msm_framebuffer { 25 26 struct drm_framebuffer base; ··· 237 236 kfree(msm_fb); 238 237 239 238 return ERR_PTR(ret); 239 + } 240 + 241 + struct drm_framebuffer * 242 + msm_alloc_stolen_fb(struct drm_device *dev, int w, int h, int p, uint32_t format) 243 + { 244 + struct drm_mode_fb_cmd2 mode_cmd = { 245 + .pixel_format = format, 246 + .width = w, 247 + .height = h, 248 + .pitches = { p }, 249 + }; 250 + struct drm_gem_object *bo; 251 + struct drm_framebuffer *fb; 252 + int size; 253 + 254 + /* allocate backing bo */ 255 + size = mode_cmd.pitches[0] * mode_cmd.height; 256 + DBG("allocating %d bytes for fb %d", size, dev->primary->index); 257 + bo = msm_gem_new(dev, size, MSM_BO_SCANOUT | MSM_BO_WC | MSM_BO_STOLEN); 258 + if (IS_ERR(bo)) { 259 + dev_warn(dev->dev, "could not allocate stolen bo\n"); 260 + /* try regular bo: */ 261 + bo = msm_gem_new(dev, size, MSM_BO_SCANOUT | MSM_BO_WC); 262 + } 263 + if (IS_ERR(bo)) { 264 + dev_err(dev->dev, "failed to allocate buffer object\n"); 265 + return ERR_CAST(bo); 266 + } 267 + 268 + fb = msm_framebuffer_init(dev, &mode_cmd, &bo); 269 + if (IS_ERR(fb)) { 270 + dev_err(dev->dev, "failed to allocate fb\n"); 271 + /* note: if fb creation failed, we can't rely on fb destroy 272 + * to unref the bo: 273 + */ 274 + drm_gem_object_unreference_unlocked(bo); 275 + return ERR_CAST(fb); 276 + } 277 + 278 + return fb; 240 279 }
+7 -28
drivers/gpu/drm/msm/msm_fbdev.c
··· 19 19 #include <drm/drm_fb_helper.h> 20 20 21 21 #include "msm_drv.h" 22 - #include "msm_gem.h" 23 22 #include "msm_kms.h" 24 23 25 24 extern int msm_gem_mmap_obj(struct drm_gem_object *obj, ··· 76 77 struct drm_framebuffer *fb = NULL; 77 78 struct drm_gem_object *bo; 78 79 struct fb_info *fbi = NULL; 79 - struct drm_mode_fb_cmd2 mode_cmd = {0}; 80 80 uint64_t paddr; 81 - int ret, size; 81 + uint32_t format; 82 + int ret, pitch; 83 + 84 + format = drm_mode_legacy_fb_format(sizes->surface_bpp, sizes->surface_depth); 82 85 83 86 DBG("create fbdev: %dx%d@%d (%dx%d)", sizes->surface_width, 84 87 sizes->surface_height, sizes->surface_bpp, 85 88 sizes->fb_width, sizes->fb_height); 86 89 87 - mode_cmd.pixel_format = drm_mode_legacy_fb_format(sizes->surface_bpp, 88 - sizes->surface_depth); 90 + pitch = align_pitch(sizes->surface_width, sizes->surface_bpp); 91 + fb = msm_alloc_stolen_fb(dev, sizes->surface_width, 92 + sizes->surface_height, pitch, format); 89 93 90 - mode_cmd.width = sizes->surface_width; 91 - mode_cmd.height = sizes->surface_height; 92 - 93 - mode_cmd.pitches[0] = align_pitch( 94 - mode_cmd.width, sizes->surface_bpp); 95 - 96 - /* allocate backing bo */ 97 - size = mode_cmd.pitches[0] * mode_cmd.height; 98 - DBG("allocating %d bytes for fb %d", size, dev->primary->index); 99 - bo = msm_gem_new(dev, size, MSM_BO_SCANOUT | 100 - MSM_BO_WC | MSM_BO_STOLEN); 101 - if (IS_ERR(bo)) { 102 - ret = PTR_ERR(bo); 103 - bo = NULL; 104 - dev_err(dev->dev, "failed to allocate buffer object: %d\n", ret); 105 - goto fail; 106 - } 107 - 108 - fb = msm_framebuffer_init(dev, &mode_cmd, &bo); 109 94 if (IS_ERR(fb)) { 110 95 dev_err(dev->dev, "failed to allocate fb\n"); 111 - /* note: if fb creation failed, we can't rely on fb destroy 112 - * to unref the bo: 113 - */ 114 - drm_gem_object_unreference_unlocked(bo); 115 96 ret = PTR_ERR(fb); 116 97 goto fail; 117 98 }