drivers/gpu/drm/openchrome/via_display.c | 4 drivers/gpu/drm/openchrome/via_display.h | 2 drivers/gpu/drm/openchrome/via_drv.h | 8 - drivers/gpu/drm/openchrome/via_fb.c | 234 ++++++++++++++++--------------- 4 files changed, 131 insertions(+), 117 deletions(-)
New commits: commit 2a8d575de6efbd6cb31d6367f46d09ef5d231c6c Author: Kevin Brace <kevinbr...@gmx.com> Date: Sat Aug 26 21:16:00 2017 -0700 Major rewrite of FB initialization code Signed-off-by: Kevin Brace <kevinbr...@gmx.com> diff --git a/drivers/gpu/drm/openchrome/via_display.c b/drivers/gpu/drm/openchrome/via_display.c index e22113436b0b..e6f87131cda6 100644 --- a/drivers/gpu/drm/openchrome/via_display.c +++ b/drivers/gpu/drm/openchrome/via_display.c @@ -537,8 +537,8 @@ via_modeset_init(struct drm_device *dev) break; } - /* Set up the framebuffer device */ - ret = via_fbdev_init(dev, &dev_priv->helper); + /* Initialize the frame buffer device. */ + ret = via_fbdev_init(dev); if (ret) { goto exit; } diff --git a/drivers/gpu/drm/openchrome/via_display.h b/drivers/gpu/drm/openchrome/via_display.h index 802d7100ac14..4e8ab52f1d43 100644 --- a/drivers/gpu/drm/openchrome/via_display.h +++ b/drivers/gpu/drm/openchrome/via_display.h @@ -143,7 +143,7 @@ extern u32 via_get_clk_value(struct drm_device *dev, u32 clk); extern void via_set_vclock(struct drm_crtc *crtc, u32 clk); /* framebuffers */ -extern int via_fbdev_init(struct drm_device *dev, struct drm_fb_helper **ptr); +extern int via_fbdev_init(struct drm_device *dev); extern void via_framebuffer_fini(struct drm_device *dev); /* crtc */ diff --git a/drivers/gpu/drm/openchrome/via_drv.h b/drivers/gpu/drm/openchrome/via_drv.h index 565e7562224d..5bf9e2bffb16 100644 --- a/drivers/gpu/drm/openchrome/via_drv.h +++ b/drivers/gpu/drm/openchrome/via_drv.h @@ -126,6 +126,12 @@ struct via_framebuffer { struct drm_gem_object *gem_obj; }; +struct via_framebuffer_device { + struct drm_fb_helper helper; + struct ttm_bo_kmap_obj kmap; + struct via_framebuffer via_fb; +}; + enum via_engine { VIA_ENG_H1 = 0, VIA_ENG_H2, @@ -146,7 +152,7 @@ struct via_device { struct ttm_bo_kmap_obj gart; struct ttm_bo_kmap_obj vq; - struct drm_fb_helper *helper; + struct via_framebuffer_device *via_fbdev; u8 vram_type; unsigned long long vram_start; unsigned int vram_size; diff --git a/drivers/gpu/drm/openchrome/via_fb.c b/drivers/gpu/drm/openchrome/via_fb.c index 49de88037ae5..feab2833d25f 100644 --- a/drivers/gpu/drm/openchrome/via_fb.c +++ b/drivers/gpu/drm/openchrome/via_fb.c @@ -948,7 +948,7 @@ via_output_poll_changed(struct drm_device *dev) { struct via_device *dev_priv = dev->dev_private; - drm_fb_helper_hotplug_event(dev_priv->helper); + drm_fb_helper_hotplug_event(&dev_priv->via_fbdev->helper); } static struct drm_framebuffer * @@ -1043,93 +1043,111 @@ static struct fb_ops via_fb_ops = { .fb_debug_leave = drm_fb_helper_debug_leave, }; -static int -via_fb_probe(struct drm_fb_helper *helper, - struct drm_fb_helper_surface_size *sizes) +static int via_fb_probe(struct drm_fb_helper *helper, + struct drm_fb_helper_surface_size *sizes) { - struct ttm_fb_helper *ttmfb = container_of(helper, struct ttm_fb_helper, base); + struct drm_device *dev = helper->dev; struct via_device *dev_priv = helper->dev->dev_private; - struct ttm_bo_kmap_obj *kmap = &ttmfb->kmap; + struct via_framebuffer_device *via_fbdev = container_of(helper, + struct via_framebuffer_device, helper); + struct ttm_bo_kmap_obj *kmap = &via_fbdev->kmap; + struct via_framebuffer *via_fb = &via_fbdev->via_fb; + struct drm_framebuffer *fb = &via_fbdev->via_fb.fb; struct fb_info *info = helper->fbdev; - struct via_framebuffer *via_fb; struct drm_gem_object *gem_obj; struct drm_mode_fb_cmd2 mode_cmd; struct apertures_struct *ap; - int size, ret = 0; - - /* Already exist */ - if (helper->fb) - return ret; + int size, cpp; + int ret = 0; - via_fb = kzalloc(sizeof(*via_fb), GFP_KERNEL); - if (!via_fb) { - return -ENOMEM; - } + DRM_DEBUG_KMS("Entered %s.\n", __func__); - mode_cmd.height = sizes->surface_height; mode_cmd.width = sizes->surface_width; - mode_cmd.pixel_format = drm_mode_legacy_fb_format(sizes->surface_bpp, - sizes->surface_depth); - mode_cmd.pitches[0] = (mode_cmd.width * sizes->surface_bpp >> 3); + mode_cmd.height = sizes->surface_height; + mode_cmd.pixel_format = drm_mode_legacy_fb_format( + sizes->surface_bpp, + sizes->surface_depth); + cpp = drm_format_plane_cpp(mode_cmd.pixel_format, 0); + mode_cmd.pitches[0] = (mode_cmd.width * cpp); mode_cmd.pitches[0] = round_up(mode_cmd.pitches[0], 16); size = mode_cmd.pitches[0] * mode_cmd.height; size = ALIGN(size, PAGE_SIZE); - gem_obj = ttm_gem_create(helper->dev, &dev_priv->bdev, ttm_bo_type_kernel, - TTM_PL_FLAG_VRAM, false, 1, PAGE_SIZE, size); + gem_obj = ttm_gem_create(helper->dev, &dev_priv->bdev, + ttm_bo_type_kernel, TTM_PL_FLAG_VRAM, + false, 1, PAGE_SIZE, size); if (unlikely(IS_ERR(gem_obj))) { ret = PTR_ERR(gem_obj); goto out_err; } kmap->bo = ttm_gem_mapping(gem_obj); - if (kmap->bo == NULL) + if (!kmap->bo) { goto out_err; + } ret = via_bo_pin(kmap->bo, kmap); - if (unlikely(ret)) + if (unlikely(ret)) { goto out_err; + } + + info = framebuffer_alloc(0, dev->dev); + if (IS_ERR(info)) { + ret = PTR_ERR(info); + goto out_err; + } + + info->par = via_fbdev; - drm_helper_mode_fill_fb_struct(&via_fb->fb, &mode_cmd); - ret = drm_framebuffer_init(helper->dev, &via_fb->fb, &via_fb_funcs); - if (unlikely(ret)) + drm_helper_mode_fill_fb_struct(fb, &mode_cmd); + ret = drm_framebuffer_init(helper->dev, fb, &via_fb_funcs); + if (unlikely(ret)) { goto out_err; + } via_fb->gem_obj = gem_obj; - ttmfb->base.fb = &via_fb->fb; + via_fbdev->helper.fb = fb; + via_fbdev->helper.fbdev = info; + + strcpy(info->fix.id, dev->driver->name); + strcat(info->fix.id, "drmfb"); + + info->fbops = &via_fb_ops; info->fix.smem_start = kmap->bo->mem.bus.base + kmap->bo->mem.bus.offset; - info->fix.smem_len = info->screen_size = size; + info->fix.smem_len = size; info->screen_base = kmap->virtual; + info->screen_size = size; - /* setup aperture base/size for takeover (vesafb, efifb etc) */ + /* Setup aperture base / size for takeover (i.e., vesafb). */ ap = alloc_apertures(1); if (!ap) { - drm_framebuffer_cleanup(&via_fb->fb); + drm_framebuffer_cleanup(fb); goto out_err; } - ap->ranges[0].size = kmap->bo->bdev->man[kmap->bo->mem.mem_type].size; + + ap->ranges[0].size = kmap->bo->bdev-> + man[kmap->bo->mem.mem_type].size; ap->ranges[0].base = kmap->bo->mem.bus.base; info->apertures = ap; - drm_fb_helper_fill_var(info, helper, sizes->fb_width, sizes->fb_height); - drm_fb_helper_fill_fix(info, via_fb->fb.pitches[0], via_fb->fb.depth); - ret = 1; + drm_fb_helper_fill_fix(info, fb->pitches[0], fb->depth); + drm_fb_helper_fill_var(info, helper, + sizes->fb_width, sizes->fb_height); + goto exit; out_err: - if (ret < 0) { - if (kmap->bo) { - via_bo_unpin(kmap->bo, kmap); - ttm_bo_unref(&kmap->bo); - } - - if (gem_obj) { - drm_gem_object_unreference_unlocked(gem_obj); - via_fb->gem_obj = NULL; - } + if (kmap->bo) { + via_bo_unpin(kmap->bo, kmap); + ttm_bo_unref(&kmap->bo); + } - kfree(via_fb); + if (gem_obj) { + drm_gem_object_unreference_unlocked(gem_obj); + via_fb->gem_obj = NULL; } +exit: + DRM_DEBUG_KMS("Exiting %s.\n", __func__); return ret; } @@ -1166,104 +1184,94 @@ via_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green, *blue = b_base[regno]; } -static struct drm_fb_helper_funcs via_fb_helper_funcs = { +static const struct drm_fb_helper_funcs via_drm_fb_helper_funcs = { .gamma_set = via_fb_gamma_set, .gamma_get = via_fb_gamma_get, .fb_probe = via_fb_probe, }; -int -via_fbdev_init(struct drm_device *dev, struct drm_fb_helper **ptr) +int via_fbdev_init(struct drm_device *dev) { - struct ttm_fb_helper *helper; - struct fb_info *info; - int ret = -ENOMEM; - - dev->mode_config.funcs = (void *)&via_mode_funcs; + struct via_device *dev_priv = dev->dev_private; + struct via_framebuffer_device *via_fbdev; + int bpp_sel = 32; + int ret = 0; - info = framebuffer_alloc(sizeof(*helper), dev->dev); - if (!info) { - DRM_ERROR("allocate fb_info error\n"); - return ret; - } + DRM_DEBUG_KMS("Entered %s.\n", __func__); - helper = info->par; - helper->base.fbdev = info; - drm_fb_helper_prepare(dev, &helper->base, &via_fb_helper_funcs); + dev->mode_config.funcs = &via_mode_funcs; - strcpy(info->fix.id, dev->driver->name); - strcat(info->fix.id, "drmfb"); - info->flags = FBINFO_DEFAULT | FBINFO_CAN_FORCE_OUTPUT; - info->fbops = &via_fb_ops; + via_fbdev = kzalloc(sizeof(struct via_framebuffer_device), + GFP_KERNEL); + if (!via_fbdev) { + ret = -ENOMEM; + goto exit; + } - info->pixmap.size = 64*1024; - info->pixmap.buf_align = 8; - info->pixmap.access_align = 32; - info->pixmap.flags = FB_PIXMAP_SYSTEM; - info->pixmap.scan_align = 1; + dev_priv->via_fbdev = via_fbdev; - /* Should be based on the crtc color map size */ - ret = fb_alloc_cmap(&info->cmap, 256, 0); - if (ret) - goto out_err; + drm_fb_helper_prepare(dev, &via_fbdev->helper, + &via_drm_fb_helper_funcs); + ret = drm_fb_helper_init(dev, &via_fbdev->helper, + dev->num_crtcs, + dev->mode_config.num_connector); + if (ret) { + goto free_fbdev; + } - ret = drm_fb_helper_init(dev, &helper->base, dev->num_crtcs, - dev->mode_config.num_connector); + ret = drm_fb_helper_single_add_all_connectors(&via_fbdev->helper); if (ret) { - fb_dealloc_cmap(&info->cmap); - goto out_err; + goto free_fb_helper; } - drm_fb_helper_single_add_all_connectors(&helper->base); drm_helper_disable_unused_functions(dev); - drm_fb_helper_initial_config(&helper->base, 32); - *ptr = (struct drm_fb_helper *) helper; -out_err: - if (ret) - framebuffer_release(info); + ret = drm_fb_helper_initial_config(&via_fbdev->helper, bpp_sel); + if (ret) { + goto free_fb_helper; + } + + goto exit; +free_fb_helper: + drm_fb_helper_fini(&via_fbdev->helper); +free_fbdev: + kfree(via_fbdev); +exit: + DRM_DEBUG_KMS("Exiting %s.\n", __func__); return ret; } -void -via_framebuffer_fini(struct drm_device *dev) +void via_framebuffer_fini(struct drm_device *dev) { struct via_device *dev_priv = dev->dev_private; - struct drm_fb_helper *helper = dev_priv->helper; - struct ttm_fb_helper *ttmfb; - struct drm_gem_object *gem_obj; - struct via_framebuffer *via_fb = - container_of(helper->fb, struct via_framebuffer, fb); + struct drm_fb_helper *fb_helper = &dev_priv->via_fbdev->helper; + struct via_framebuffer *via_fb = &dev_priv->via_fbdev->via_fb; struct fb_info *info; - if (!helper) - return; + DRM_DEBUG_KMS("Entered %s.\n", __func__); - ttmfb = container_of(helper, struct ttm_fb_helper, base); - info = helper->fbdev; + if (!fb_helper) { + goto exit; + } + + info = fb_helper->fbdev; if (info) { unregister_framebuffer(info); - if (info->cmap.len) - fb_dealloc_cmap(&info->cmap); kfree(info->apertures); - framebuffer_release(info); - helper->fbdev = NULL; - } - - ttmfb = container_of(helper, struct ttm_fb_helper, base); - if (ttmfb->kmap.bo) { - via_bo_unpin(ttmfb->kmap.bo, &ttmfb->kmap); - ttm_bo_unref(&ttmfb->kmap.bo); + fb_helper->fbdev = NULL; } - gem_obj = via_fb->gem_obj; - if (gem_obj) { - drm_gem_object_unreference_unlocked(gem_obj); + if (via_fb->gem_obj) { + drm_gem_object_unreference_unlocked(via_fb->gem_obj); via_fb->gem_obj = NULL; } - drm_fb_helper_fini(helper); - drm_framebuffer_cleanup(helper->fb); - kfree(dev_priv->helper); - dev_priv->helper = NULL; + drm_fb_helper_fini(&dev_priv->via_fbdev->helper); + drm_framebuffer_cleanup(&dev_priv->via_fbdev->via_fb.fb); + if (dev_priv->via_fbdev) { + kfree(dev_priv->via_fbdev); + dev_priv->via_fbdev = NULL; + } +exit: + DRM_DEBUG_KMS("Exiting %s.\n", __func__); } _______________________________________________ Openchrome-devel mailing list Openchrome-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/openchrome-devel