On Tue, 12 Oct 2021, Dave Airlie <airl...@gmail.com> wrote:
> From: Dave Airlie <airl...@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 <airl...@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

Reply via email to