Remove drm_nouveau_private::fb member and map the piece of VRAM only when accessing VGA fonts.
Collect copied code into the static function nouveau_vga_font_io(). Signed-off-by: Pekka Paalanen <[email protected]> --- drivers/gpu/drm/nouveau/nouveau_drv.h | 17 ------- drivers/gpu/drm/nouveau/nouveau_hw.c | 75 +++++++++++++++---------------- drivers/gpu/drm/nouveau/nouveau_state.c | 8 --- 3 files changed, 37 insertions(+), 63 deletions(-) diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h index 5477dc0..c6143b8 100644 --- a/drivers/gpu/drm/nouveau/nouveau_drv.h +++ b/drivers/gpu/drm/nouveau/nouveau_drv.h @@ -461,7 +461,6 @@ struct drm_nouveau_private { int flags; void __iomem *mmio; - void __iomem *fb; void __iomem *ramin; uint32_t ramin_size; @@ -1014,22 +1013,6 @@ static inline void nv_wr08(struct drm_device *dev, unsigned reg, u8 val) #define nv_wait(reg,mask,val) nouveau_wait_until(dev, 2000000000ULL, (reg), \ (mask), (val)) -/* - * VRAM access for the first 64kB - * see nouveau_state.c - */ -static inline u32 nv_rf32(struct drm_device *dev, unsigned offset) -{ - struct drm_nouveau_private *dev_priv = dev->dev_private; - return ioread32_native(dev_priv->fb + offset); -} - -static inline void nv_wf32(struct drm_device *dev, unsigned offset, u32 val) -{ - struct drm_nouveau_private *dev_priv = dev->dev_private; - iowrite32_native(val, dev_priv->fb + offset); -} - /* PRAMIN access */ static inline u32 nv_ri32(struct drm_device *dev, unsigned offset) { diff --git a/drivers/gpu/drm/nouveau/nouveau_hw.c b/drivers/gpu/drm/nouveau/nouveau_hw.c index 295b876..6f55f55 100644 --- a/drivers/gpu/drm/nouveau/nouveau_hw.c +++ b/drivers/gpu/drm/nouveau/nouveau_hw.c @@ -537,13 +537,33 @@ nouveau_hw_fix_bad_vpll(struct drm_device *dev, int head) * vga font save/restore */ +static void nouveau_vga_font_io(struct drm_device *dev, + void __iomem *iovram, + bool save, unsigned plane) +{ + struct drm_nouveau_private *dev_priv = dev->dev_private; + unsigned i; + + NVWriteVgaSeq(dev, 0, NV_VIO_SR_PLANE_MASK_INDEX, 1 << plane); + NVWriteVgaGr(dev, 0, NV_VIO_GX_READ_MAP_INDEX, plane); + for (i = 0; i < 16384; i++) { + if (save) { + dev_priv->saved_vga_font[plane][i] = + ioread32_native(iovram + i * 4); + } else { + iowrite32_native(dev_priv->saved_vga_font[plane][i], + iovram + i * 4); + } + } +} + void nouveau_hw_save_vga_fonts(struct drm_device *dev, bool save) { - struct drm_nouveau_private *dev_priv = dev->dev_private; uint8_t misc, gr4, gr5, gr6, seq2, seq4; bool graphicsmode; - int i; + unsigned plane; + void __iomem *iovram; if (nv_two_heads(dev)) NVSetOwner(dev, 0); @@ -552,10 +572,19 @@ nouveau_hw_save_vga_fonts(struct drm_device *dev, bool save) graphicsmode = NVReadVgaAttr(dev, 0, NV_CIO_AR_MODE_INDEX) & 1; NVSetEnablePalette(dev, 0, false); - if (graphicsmode) /* graphics mode => framebuffer => no need to save */ + if (graphicsmode) /* graphics mode => framebuffer => no need to save */ return; NV_INFO(dev, "%sing VGA fonts\n", save ? "Sav" : "Restor"); + + /* map first 64KiB of VRAM, holds VGA fonts etc */ + iovram = ioremap(pci_resource_start(dev->pdev, 1), 65536); + if (!iovram) { + NV_ERROR(dev, "Failed to map VRAM, " + "cannot save/restore VGA fonts.\n"); + return; + } + if (nv_two_heads(dev)) NVBlankScreen(dev, 1, true); NVBlankScreen(dev, 0, true); @@ -573,41 +602,9 @@ nouveau_hw_save_vga_fonts(struct drm_device *dev, bool save) NVWriteVgaGr(dev, 0, NV_VIO_GX_MODE_INDEX, 0x0); NVWriteVgaGr(dev, 0, NV_VIO_GX_MISC_INDEX, 0x5); - /* store font in plane 0 */ - NVWriteVgaSeq(dev, 0, NV_VIO_SR_PLANE_MASK_INDEX, 0x1); - 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(dev, i * 4); - else - 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(dev, i * 4); - else - 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(dev, i * 4); - else - 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(dev, i * 4); - else - nv_wf32(dev, i * 4, dev_priv->saved_vga_font[3][i]); + /* store font in planes 0..3 */ + for (plane = 0; plane < 4; plane++) + nouveau_vga_font_io(dev, iovram, save, plane); /* restore control regs */ NVWritePRMVIO(dev, 0, NV_PRMVIO_MISC__WRITE, misc); @@ -620,6 +617,8 @@ nouveau_hw_save_vga_fonts(struct drm_device *dev, bool save) if (nv_two_heads(dev)) NVBlankScreen(dev, 1, false); NVBlankScreen(dev, 0, false); + + iounmap(iovram); } /* diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c index 93d14f3..ace8beb 100644 --- a/drivers/gpu/drm/nouveau/nouveau_state.c +++ b/drivers/gpu/drm/nouveau/nouveau_state.c @@ -590,13 +590,6 @@ int nouveau_load(struct drm_device *dev, unsigned long flags) } } - /* map first 64KiB of VRAM, holds VGA fonts etc */ - 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; - } - nouveau_OF_copy_vbios_to_ramin(dev); /* Special flags */ @@ -648,7 +641,6 @@ int nouveau_unload(struct drm_device *dev) iounmap(dev_priv->mmio); iounmap(dev_priv->ramin); - iounmap(dev_priv->fb); kfree(dev_priv); dev->dev_private = NULL; -- 1.6.3.3 _______________________________________________ Nouveau mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/nouveau
