[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