int msm_gem_dumb_create(struct drm_file *file, struct drm_device *dev, struct drm_mode_create_dumb *args) { args->pitch = align_pitch(args->width, args->bpp); args->size = PAGE_ALIGN(args->pitch * args->height); return msm_gem_new_handle(dev, file, args->size, MSM_BO_SCANOUT | MSM_BO_WC, &args->handle); }
struct drm_framebuffer *omap_framebuffer_init(struct drm_device *dev, struct drm_mode_fb_cmd *mode_cmd, struct drm_gem_object *bo) { struct omap_framebuffer *omap_fb; struct drm_framebuffer *fb = NULL; int size, ret; DBG("create framebuffer: dev=%p, mode_cmd=%p (%dx%d@%d)", dev, mode_cmd, mode_cmd->width, mode_cmd->height, mode_cmd->bpp); /* in case someone tries to feed us a completely bogus stride: */ mode_cmd->pitch = align_pitch(mode_cmd->pitch, mode_cmd->width, mode_cmd->bpp); omap_fb = kzalloc(sizeof(*omap_fb), GFP_KERNEL); if (!omap_fb) { dev_err(dev->dev, "could not allocate fb\n"); goto fail; } fb = &omap_fb->base; ret = drm_framebuffer_init(dev, fb, &omap_framebuffer_funcs); if (ret) { dev_err(dev->dev, "framebuffer init failed: %d\n", ret); goto fail; } DBG("create: FB ID: %d (%p)", fb->base.id, fb); size = PAGE_ALIGN(mode_cmd->pitch * mode_cmd->height); if (bo) { DBG("using existing %d byte buffer (needed %d)", bo->size, size); if (size > bo->size) { dev_err(dev->dev, "provided buffer object is too small!\n"); goto fail; } } else { /* for convenience of all the various callers who don't want * to be bothered to allocate their own buffer.. */ union omap_gem_size gsize = { .bytes = size, }; DBG("allocating %d bytes for fb %d", size, dev->primary->index); bo = omap_gem_new(dev, gsize, OMAP_BO_SCANOUT | OMAP_BO_WC); if (!bo) { dev_err(dev->dev, "failed to allocate buffer object\n"); goto fail; } } omap_fb->bo = bo; omap_fb->size = size; if (omap_gem_get_paddr(bo, &omap_fb->paddr, true)) { dev_err(dev->dev, "could not map (paddr)!\n"); goto fail; } drm_helper_mode_fill_fb_struct(fb, mode_cmd); return fb; fail: if (fb) { omap_framebuffer_destroy(fb); } return NULL; }