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 | 329 +++++++++++++++---------------- 4 files changed, 177 insertions(+), 166 deletions(-)
New commits: commit dec626a7182ab230fafaa526af7fcbb8afe78cf7 Author: Kevin Brace <kevinbr...@gmx.com> Date: Wed Aug 16 22:46:28 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 7477ab54b15e..6accbb2ea894 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 * @@ -1047,91 +1047,108 @@ 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; + int size, cpp; + int ret = 0; - /* Already exist */ - if (helper->fb) - return ret; + DRM_DEBUG_KMS("Entered %s.\n", __func__); - via_fb = kzalloc(sizeof(*via_fb), GFP_KERNEL); - if (!via_fb) { - return -ENOMEM; - } - - 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 = drm_fb_helper_alloc_fbi(helper); + if (IS_ERR(info)) { + ret = PTR_ERR(info); + goto out_err; + } + + info->par = via_fbdev; + info->skip_vt_switch = true; - drm_helper_mode_fill_fb_struct(dev, &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(dev, 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; + + 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.format->depth); - ret = 1; + drm_fb_helper_fill_fix(info, fb->pitches[0], fb->format->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; } @@ -1168,104 +1185,93 @@ 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 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; + struct via_device *dev_priv = dev->dev_private; + struct via_framebuffer_device *via_fbdev; + int bpp_sel = 32; + int ret = 0; - dev->mode_config.funcs = (void *)&via_mode_funcs; + DRM_DEBUG_KMS("Entered %s.\n", __func__); - info = framebuffer_alloc(sizeof(*helper), dev->dev); - if (!info) { - DRM_ERROR("allocate fb_info error\n"); - return ret; + dev->mode_config.funcs = &via_mode_funcs; + + via_fbdev = kzalloc(sizeof(struct via_framebuffer_device), + GFP_KERNEL); + if (!via_fbdev) { + ret = -ENOMEM; + goto exit; } - helper = info->par; - helper->base.fbdev = info; - drm_fb_helper_prepare(dev, &helper->base, &via_fb_helper_funcs); + dev_priv->via_fbdev = via_fbdev; - 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; + drm_fb_helper_prepare(dev, &via_fbdev->helper, + &via_drm_fb_helper_funcs); - 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; + ret = drm_fb_helper_init(dev, &via_fbdev->helper, + dev->mode_config.num_connector); + if (ret) { + goto free_fbdev; + } - /* Should be based on the crtc color map size */ - ret = fb_alloc_cmap(&info->cmap, 256, 0); - if (ret) - goto out_err; + ret = drm_fb_helper_single_add_all_connectors(&via_fbdev->helper); + if (ret) { + goto free_fb_helper; + } - ret = drm_fb_helper_init(dev, &helper->base, - dev->mode_config.num_connector); + ret = drm_fb_helper_initial_config(&via_fbdev->helper, bpp_sel); 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); + 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__); + + if (!fb_helper) { + goto exit; + } - ttmfb = container_of(helper, struct ttm_fb_helper, base); - info = helper->fbdev; + 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__); } commit e57182879bc978e271a1ef0f75f098feb9d1708b Author: Kevin Brace <kevinbr...@gmx.com> Date: Wed Aug 16 21:10:03 2017 -0700 Rename viafb_ops to via_fb_ops Signed-off-by: Kevin Brace <kevinbr...@gmx.com> diff --git a/drivers/gpu/drm/openchrome/via_fb.c b/drivers/gpu/drm/openchrome/via_fb.c index e7adf59e43e4..7477ab54b15e 100644 --- a/drivers/gpu/drm/openchrome/via_fb.c +++ b/drivers/gpu/drm/openchrome/via_fb.c @@ -1029,6 +1029,20 @@ int drmfb_helper_pan_display(struct fb_var_screeninfo *var, return ret; } +static struct fb_ops via_fb_ops = { + .owner = THIS_MODULE, + .fb_check_var = drm_fb_helper_check_var, + .fb_set_par = drm_fb_helper_set_par, + .fb_fillrect = cfb_fillrect, + .fb_copyarea = cfb_copyarea, + .fb_imageblit = cfb_imageblit, + .fb_pan_display = drmfb_helper_pan_display, + .fb_blank = drm_fb_helper_blank, + .fb_setcmap = drm_fb_helper_setcmap, + .fb_debug_enter = drm_fb_helper_debug_enter, + .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) @@ -1160,20 +1174,6 @@ static struct drm_fb_helper_funcs via_fb_helper_funcs = { .fb_probe = via_fb_probe, }; -static struct fb_ops viafb_ops = { - .owner = THIS_MODULE, - .fb_check_var = drm_fb_helper_check_var, - .fb_set_par = drm_fb_helper_set_par, - .fb_fillrect = cfb_fillrect, - .fb_copyarea = cfb_copyarea, - .fb_imageblit = cfb_imageblit, - .fb_pan_display = drmfb_helper_pan_display, - .fb_blank = drm_fb_helper_blank, - .fb_setcmap = drm_fb_helper_setcmap, - .fb_debug_enter = drm_fb_helper_debug_enter, - .fb_debug_leave = drm_fb_helper_debug_leave, -}; - int via_fbdev_init(struct drm_device *dev, struct drm_fb_helper **ptr) { @@ -1196,7 +1196,7 @@ via_fbdev_init(struct drm_device *dev, struct drm_fb_helper **ptr) strcpy(info->fix.id, dev->driver->name); strcat(info->fix.id, "drmfb"); info->flags = FBINFO_DEFAULT | FBINFO_CAN_FORCE_OUTPUT; - info->fbops = &viafb_ops; + info->fbops = &via_fb_ops; info->pixmap.size = 64*1024; info->pixmap.buf_align = 8; commit 1dc9cb950bbce1be91c9d5477e45f76e13b665d5 Author: Kevin Brace <kevinbr...@gmx.com> Date: Wed Aug 16 21:05:42 2017 -0700 Move drmfb_helper_pan_display to another part of the file Signed-off-by: Kevin Brace <kevinbr...@gmx.com> diff --git a/drivers/gpu/drm/openchrome/via_fb.c b/drivers/gpu/drm/openchrome/via_fb.c index b554a2e69c78..e7adf59e43e4 100644 --- a/drivers/gpu/drm/openchrome/via_fb.c +++ b/drivers/gpu/drm/openchrome/via_fb.c @@ -990,6 +990,45 @@ static const struct drm_mode_config_funcs via_mode_funcs = { .output_poll_changed = via_output_poll_changed }; +int drmfb_helper_pan_display(struct fb_var_screeninfo *var, + struct fb_info *info) +{ + struct drm_fb_helper *fb_helper = info->par; + struct drm_crtc_helper_funcs *crtc_funcs; + struct drm_device *dev = fb_helper->dev; + struct drm_mode_set *modeset; + struct drm_crtc *crtc; + int ret = -ENXIO, i; + + mutex_lock(&dev->mode_config.mutex); + for (i = 0; i < fb_helper->crtc_count; i++) { + crtc = fb_helper->crtc_info[i].mode_set.crtc; + crtc_funcs = crtc->helper_private; + + if (!crtc_funcs->mode_set_base) + continue; + + modeset = &fb_helper->crtc_info[i].mode_set; + modeset->x = var->xoffset; + modeset->y = var->yoffset; + + if (modeset->num_connectors) { + ret = crtc_funcs->mode_set_base(crtc, modeset->x, + modeset->y, + crtc->primary->fb); + if (!ret) { + info->flags |= FBINFO_HWACCEL_YPAN; + info->var.xoffset = var->xoffset; + info->var.yoffset = var->yoffset; + } + } + } + if (ret) + info->flags &= ~FBINFO_HWACCEL_YPAN; + mutex_unlock(&dev->mode_config.mutex); + return ret; +} + static int via_fb_probe(struct drm_fb_helper *helper, struct drm_fb_helper_surface_size *sizes) @@ -1121,46 +1160,6 @@ static struct drm_fb_helper_funcs via_fb_helper_funcs = { .fb_probe = via_fb_probe, }; -int -drmfb_helper_pan_display(struct fb_var_screeninfo *var, - struct fb_info *info) -{ - struct drm_fb_helper *fb_helper = info->par; - struct drm_crtc_helper_funcs *crtc_funcs; - struct drm_device *dev = fb_helper->dev; - struct drm_mode_set *modeset; - struct drm_crtc *crtc; - int ret = -ENXIO, i; - - mutex_lock(&dev->mode_config.mutex); - for (i = 0; i < fb_helper->crtc_count; i++) { - crtc = fb_helper->crtc_info[i].mode_set.crtc; - crtc_funcs = crtc->helper_private; - - if (!crtc_funcs->mode_set_base) - continue; - - modeset = &fb_helper->crtc_info[i].mode_set; - modeset->x = var->xoffset; - modeset->y = var->yoffset; - - if (modeset->num_connectors) { - ret = crtc_funcs->mode_set_base(crtc, modeset->x, - modeset->y, - crtc->primary->fb); - if (!ret) { - info->flags |= FBINFO_HWACCEL_YPAN; - info->var.xoffset = var->xoffset; - info->var.yoffset = var->yoffset; - } - } - } - if (ret) - info->flags &= ~FBINFO_HWACCEL_YPAN; - mutex_unlock(&dev->mode_config.mutex); - return ret; -} - static struct fb_ops viafb_ops = { .owner = THIS_MODULE, .fb_check_var = drm_fb_helper_check_var, _______________________________________________ Openchrome-devel mailing list Openchrome-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/openchrome-devel