[Intel-gfx] [PATCH 6/8] drm/i915/display: refactor fbdev pin/unpin out into functions.
Jani Nikula
jani.nikula at intel.com
Tue Oct 12 17:25:17 UTC 2021
On Tue, 12 Oct 2021, Dave Airlie <airlied at gmail.com> wrote:
> From: Dave Airlie <airlied at redhat.com>
>
> This just cleans up the calls a bit.
I get an uneasy feeling about the changes in the error paths here. The
happy day scenario looks fine.
>
> Signed-off-by: Dave Airlie <airlied at redhat.com>
> ---
> drivers/gpu/drm/i915/display/intel_fbdev.c | 64 +++++++++++++---------
> 1 file changed, 38 insertions(+), 26 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.c b/drivers/gpu/drm/i915/display/intel_fbdev.c
> index adc3a81be9f7..7ac9348d20c5 100644
> --- a/drivers/gpu/drm/i915/display/intel_fbdev.c
> +++ b/drivers/gpu/drm/i915/display/intel_fbdev.c
> @@ -171,6 +171,35 @@ static int intelfb_alloc(struct drm_fb_helper *helper,
> return 0;
> }
>
> +static int intel_fbdev_pin_and_fence(struct drm_i915_private *dev_priv,
> + struct intel_fbdev *ifbdev,
> + void **vaddr)
> +{
> + const struct i915_ggtt_view view = {
> + .type = I915_GGTT_VIEW_NORMAL,
> + };
> + ifbdev->vma = intel_pin_and_fence_fb_obj(&ifbdev->fb->base, false,
> + &view, false, &ifbdev->vma_flags);
> +
> + if (IS_ERR(ifbdev->vma)) {
> + return PTR_ERR(ifbdev->vma);
ifbdev->vma remains non-NULL error pointer.
> + }
> +
> + *vaddr = i915_vma_pin_iomap(ifbdev->vma);
> + if (IS_ERR(*vaddr)) {
> + drm_err(&dev_priv->drm,
> + "Failed to remap framebuffer into virtual memory\n");
> + return PTR_ERR(vaddr);
Old error path would do unpin here.
> + }
> + return 0;
> +}
> +
> +static void intel_fbdev_unpin(struct intel_fbdev *ifbdev)
> +{
> + if (ifbdev->vma)
> + intel_unpin_fb_vma(ifbdev->vma, ifbdev->vma_flags);
> +}
> +
> static int intelfb_create(struct drm_fb_helper *helper,
> struct drm_fb_helper_surface_size *sizes)
> {
> @@ -181,13 +210,8 @@ static int intelfb_create(struct drm_fb_helper *helper,
> struct drm_i915_private *dev_priv = to_i915(dev);
> struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
> struct i915_ggtt *ggtt = &dev_priv->ggtt;
> - const struct i915_ggtt_view view = {
> - .type = I915_GGTT_VIEW_NORMAL,
> - };
> intel_wakeref_t wakeref;
> struct fb_info *info;
> - struct i915_vma *vma;
> - unsigned long flags = 0;
> bool prealloc = false;
> void __iomem *vaddr;
> struct drm_i915_gem_object *obj;
> @@ -224,10 +248,8 @@ static int intelfb_create(struct drm_fb_helper *helper,
> * This also validates that any existing fb inherited from the
> * BIOS is suitable for own access.
> */
> - vma = intel_pin_and_fence_fb_obj(&ifbdev->fb->base, false,
> - &view, false, &flags);
> - if (IS_ERR(vma)) {
> - ret = PTR_ERR(vma);
> + ret = intel_fbdev_pin_and_fence(dev_priv, ifbdev, &vaddr);
> + if (ret) {
> goto out_unlock;
> }
>
> @@ -261,19 +283,12 @@ static int intelfb_create(struct drm_fb_helper *helper,
>
> /* Our framebuffer is the entirety of fbdev's system memory */
> info->fix.smem_start =
> - (unsigned long)(ggtt->gmadr.start + vma->node.start);
> - info->fix.smem_len = vma->node.size;
> + (unsigned long)(ggtt->gmadr.start + ifbdev->vma->node.start);
> + info->fix.smem_len = ifbdev->vma->node.size;
> }
>
> - vaddr = i915_vma_pin_iomap(vma);
> - if (IS_ERR(vaddr)) {
> - drm_err(&dev_priv->drm,
> - "Failed to remap framebuffer into virtual memory\n");
> - ret = PTR_ERR(vaddr);
> - goto out_unpin;
> - }
> info->screen_base = vaddr;
> - info->screen_size = vma->node.size;
> + info->screen_size = ifbdev->vma->node.size;
>
> drm_fb_helper_fill_info(info, &ifbdev->helper, sizes);
>
> @@ -281,23 +296,21 @@ static int intelfb_create(struct drm_fb_helper *helper,
> * If the object is stolen however, it will be full of whatever
> * garbage was left in there.
> */
> - if (!i915_gem_object_is_shmem(vma->obj) && !prealloc)
> + if (!i915_gem_object_is_shmem(ifbdev->vma->obj) && !prealloc)
> memset_io(info->screen_base, 0, info->screen_size);
>
> /* Use default scratch pixmap (info->pixmap.flags = FB_PIXMAP_SYSTEM) */
>
> drm_dbg_kms(&dev_priv->drm, "allocated %dx%d fb: 0x%08x\n",
> ifbdev->fb->base.width, ifbdev->fb->base.height,
> - i915_ggtt_offset(vma));
> - ifbdev->vma = vma;
> - ifbdev->vma_flags = flags;
Old code assigns these only on success.
I'm not insisting on making changes, but I guess I need to be told it
doesn't matter.
BR,
Jani.
> + i915_ggtt_offset(ifbdev->vma));
>
> intel_runtime_pm_put(&dev_priv->runtime_pm, wakeref);
> vga_switcheroo_client_fb_set(pdev, info);
> return 0;
>
> out_unpin:
> - intel_unpin_fb_vma(vma, flags);
> + intel_fbdev_unpin(ifbdev);
> out_unlock:
> intel_runtime_pm_put(&dev_priv->runtime_pm, wakeref);
> return ret;
> @@ -316,8 +329,7 @@ static void intel_fbdev_destroy(struct intel_fbdev *ifbdev)
>
> drm_fb_helper_fini(&ifbdev->helper);
>
> - if (ifbdev->vma)
> - intel_unpin_fb_vma(ifbdev->vma, ifbdev->vma_flags);
> + intel_fbdev_unpin(ifbdev);
>
> if (ifbdev->fb)
> drm_framebuffer_remove(&ifbdev->fb->base);
--
Jani Nikula, Intel Open Source Graphics Center
More information about the Intel-gfx
mailing list