[Nouveau] [PATCH 4/4] drm/nouveau: change FB map to simple ioremap

Dave Airlie airlied at gmail.com
Sun Jul 26 04:03:44 PDT 2009


On Sat, Jul 25, 2009 at 10:29 PM, Pekka Paalanen<pq at iki.fi> wrote:
> Remove the use of drm_local_map for the FB mapping and replace it with
> the equivalent ioremap.

I don't think FBs are ioremapped normally with addmap, unless nouveau
does something different here. Generally ioremapping the whole framebuffer
is considered a bad idea as ioremap on 32-bit x86 is limited.

Dave.

>
> Macros nv_[rw]f32() are changed into inline functions and the 'dev'
> argument is explicit.
>
> Macros nv_[rw]v32() are removed as unused.
>
> Signed-off-by: Pekka Paalanen <pq at iki.fi>
> ---
>  drivers/gpu/drm/nouveau/nouveau_drv.h   |   17 ++++++++++++-----
>  drivers/gpu/drm/nouveau/nouveau_hw.c    |   16 ++++++++--------
>  drivers/gpu/drm/nouveau/nouveau_state.c |   12 +++++-------
>  3 files changed, 25 insertions(+), 20 deletions(-)
>
> diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h
> index 4d53129..74f835f 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_drv.h
> +++ b/drivers/gpu/drm/nouveau/nouveau_drv.h
> @@ -448,7 +448,7 @@ struct drm_nouveau_private {
>        int flags;
>
>        void __iomem *mmio;
> -       struct drm_local_map *fb;
> +       void __iomem *fb;
>        struct drm_local_map *ramin;
>
>        struct work_struct irq_work;
> @@ -998,10 +998,17 @@ static inline void nv_wr08(struct drm_device *dev, unsigned reg, u8 val)
>                                                 (mask), (val))
>
>  /* VRAM access */
> -#define nv_rf32(reg) nv_in32(fb, (reg))
> -#define nv_wf32(reg,val) nv_out32(fb, (reg), (val))
> -#define nv_rv32(reg) nv_rf32(reg)
> -#define nv_wv32(reg,val) nv_wf32(reg, val)
> +static inline u32 nv_rf32(struct drm_device *dev, unsigned reg)
> +{
> +       struct drm_nouveau_private *dev_priv = dev->dev_private;
> +       return ioread32_native(dev_priv->fb + reg);
> +}
> +
> +static inline void nv_wf32(struct drm_device *dev, unsigned reg, u32 val)
> +{
> +       struct drm_nouveau_private *dev_priv = dev->dev_private;
> +       iowrite32_native(val, dev_priv->fb + reg);
> +}
>
>  /* PRAMIN access */
>  #define nv_ri32(reg) nv_in32(ramin, (reg))
> diff --git a/drivers/gpu/drm/nouveau/nouveau_hw.c b/drivers/gpu/drm/nouveau/nouveau_hw.c
> index f3cd10d..295b876 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_hw.c
> +++ b/drivers/gpu/drm/nouveau/nouveau_hw.c
> @@ -578,36 +578,36 @@ nouveau_hw_save_vga_fonts(struct drm_device *dev, bool save)
>        NVWriteVgaGr(dev, 0, NV_VIO_GX_READ_MAP_INDEX, 0x0);
>        for (i = 0; i < 16384; i++)
>                if (save)
> -                       dev_priv->saved_vga_font[0][i] = nv_rf32(i * 4);
> +                       dev_priv->saved_vga_font[0][i] = nv_rf32(dev, i * 4);
>                else
> -                       nv_wf32(i * 4, dev_priv->saved_vga_font[0][i]);
> +                       nv_wf32(dev, i * 4, dev_priv->saved_vga_font[0][i]);
>
>        /* store font in plane 1 */
>        NVWriteVgaSeq(dev, 0, NV_VIO_SR_PLANE_MASK_INDEX, 0x2);
>        NVWriteVgaGr(dev, 0, NV_VIO_GX_READ_MAP_INDEX, 0x1);
>        for (i = 0; i < 16384; i++)
>                if (save)
> -                       dev_priv->saved_vga_font[1][i] = nv_rf32(i * 4);
> +                       dev_priv->saved_vga_font[1][i] = nv_rf32(dev, i * 4);
>                else
> -                       nv_wf32(i * 4, dev_priv->saved_vga_font[1][i]);
> +                       nv_wf32(dev, i * 4, dev_priv->saved_vga_font[1][i]);
>
>        /* store font in plane 2 */
>        NVWriteVgaSeq(dev, 0, NV_VIO_SR_PLANE_MASK_INDEX, 0x4);
>        NVWriteVgaGr(dev, 0, NV_VIO_GX_READ_MAP_INDEX, 0x2);
>        for (i = 0; i < 16384; i++)
>                if (save)
> -                       dev_priv->saved_vga_font[2][i] = nv_rf32(i * 4);
> +                       dev_priv->saved_vga_font[2][i] = nv_rf32(dev, i * 4);
>                else
> -                       nv_wf32(i * 4, dev_priv->saved_vga_font[2][i]);
> +                       nv_wf32(dev, i * 4, dev_priv->saved_vga_font[2][i]);
>
>        /* store font in plane 3 */
>        NVWriteVgaSeq(dev, 0, NV_VIO_SR_PLANE_MASK_INDEX, 0x8);
>        NVWriteVgaGr(dev, 0, NV_VIO_GX_READ_MAP_INDEX, 0x3);
>        for (i = 0; i < 16384; i++)
>                if (save)
> -                       dev_priv->saved_vga_font[3][i] = nv_rf32(i * 4);
> +                       dev_priv->saved_vga_font[3][i] = nv_rf32(dev, i * 4);
>                else
> -                       nv_wf32(i * 4, dev_priv->saved_vga_font[3][i]);
> +                       nv_wf32(dev, i * 4, dev_priv->saved_vga_font[3][i]);
>
>        /* restore control regs */
>        NVWritePRMVIO(dev, 0, NV_PRMVIO_MISC__WRITE, misc);
> diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c
> index b70ec33..3a6cabf 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_state.c
> +++ b/drivers/gpu/drm/nouveau/nouveau_state.c
> @@ -579,12 +579,10 @@ int nouveau_load(struct drm_device *dev, unsigned long flags)
>        }
>
>        /* map first 64KiB of VRAM, holds VGA fonts etc */
> -       ret = drm_addmap(dev, drm_get_resource_start(dev, 1), 65536,
> -                        _DRM_REGISTERS, _DRM_READ_ONLY | _DRM_DRIVER,
> -                        &dev_priv->fb);
> -       if (ret) {
> -               NV_ERROR(dev, "Failed to map FB BAR: %d\n", ret);
> -               return ret;
> +       dev_priv->fb = ioremap(pci_resource_start(dev->pdev, 1), 65536);
> +       if (!dev_priv->fb) {
> +               NV_ERROR(dev, "Failed to map FB BAR\n");
> +               return -ENOMEM;
>        }
>
>  #if defined(__powerpc__)
> @@ -656,7 +654,7 @@ int nouveau_unload(struct drm_device *dev)
>
>        iounmap(dev_priv->mmio);
>        drm_rmmap(dev, dev_priv->ramin);
> -       drm_rmmap(dev, dev_priv->fb);
> +       iounmap(dev_priv->fb);
>
>        kfree(dev_priv);
>        dev->dev_private = NULL;
> --
> 1.6.3.3
>
> _______________________________________________
> Nouveau mailing list
> Nouveau at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/nouveau
>


More information about the Nouveau mailing list