[Nouveau] [PATCH 3/4] drm/nouveau: io{read,write}32_native API
Pekka Paalanen
pq at iki.fi
Sat Jul 25 05:29:06 PDT 2009
Try to clean up the register accessor definitions by defining
io{read,write}32_native API, which does not byteswap, and rewrite all
accessors to use it.
As a consequence, readl/writel calls are changed to ioread32/iowrite32
also on x86. It adds a tiny overhead, since they are generic IO
functions, but the overhead should be diminishing as compared to access
over PCI bus.
All 16-bit accessors are removed as unused.
Signed-off-by: Pekka Paalanen <pq at iki.fi>
---
drivers/gpu/drm/nouveau/nouveau_drv.h | 58 +++++++++++----------------------
1 files changed, 19 insertions(+), 39 deletions(-)
diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h
index 7a37559..4d53129 100644
--- a/drivers/gpu/drm/nouveau/nouveau_drv.h
+++ b/drivers/gpu/drm/nouveau/nouveau_drv.h
@@ -947,71 +947,51 @@ extern int nouveau_gem_ioctl_cpu_fini(struct drm_device *, void *,
extern int nouveau_gem_ioctl_info(struct drm_device *, void *,
struct drm_file *);
-#define NVDEV ((struct drm_nouveau_private *)dev->dev_private)
+#ifndef ioread32_native
#ifdef __BIG_ENDIAN
+#define ioread32_native ioread32be
+#define iowrite32_native iowrite32be
+#else /* def __BIG_ENDIAN */
+#define ioread32_native ioread32
+#define iowrite32_native iowrite32
+#endif /* def __BIG_ENDIAN else */
+#endif /* !ioread32_native */
+
+#define NVDEV ((struct drm_nouveau_private *)dev->dev_private)
#define nv_out32(map, reg, val) \
- iowrite32be((val), (void __iomem *)NVDEV->map->handle + (reg))
-#define nv_out16(map, reg, val) \
- iowrite16be((val), (void __iomem *)NVDEV->map->handle + (reg))
+ iowrite32_native((val), (void __iomem *)NVDEV->map->handle + (reg))
#define nv_in32(map, reg) \
- ioread32be((void __iomem *)NVDEV->map->handle + (reg))
-#define nv_in16(map, reg) \
- ioread16be((void __iomem *)NVDEV->map->handle + (reg))
-#else
-#define nv_out32(map, reg, val) DRM_WRITE32(NVDEV->map, (reg), (val))
-#define nv_out16(map, reg, val) DRM_WRITE16(NVDEV->map, (reg), (val))
-#define nv_in32(map, reg) DRM_READ32(NVDEV->map, (reg))
-#define nv_in16(map, reg) DRM_READ16(NVDEV->map, (reg))
-#endif
+ ioread32_native((void __iomem *)NVDEV->map->handle + (reg))
/* channel control reg access */
-#ifdef __BIG_ENDIAN
#define nvchan_wr32(reg, val) \
- iowrite32be((val), (void __iomem *)chan->user->handle + (reg))
-#define nvchan_rd32(reg) ioread32be((void __iomem *)chan->user->handle + (reg))
-#else
-#define nvchan_wr32(reg, val) DRM_WRITE32(chan->user, (reg), (val))
-#define nvchan_rd32(reg) DRM_READ32(chan->user, (reg))
-#endif
-
+ iowrite32_native((val), (void __iomem *)chan->user->handle + (reg))
+#define nvchan_rd32(reg) \
+ ioread32_native((void __iomem *)chan->user->handle + (reg))
/* register access */
-#ifdef __BIG_ENDIAN
-static inline u32 nv_rd32(struct drm_device *dev, unsigned reg)
-{
- struct drm_nouveau_private *dev_priv = dev->dev_private;
- return ioread32be(dev_priv->mmio + reg);
-}
-
-static inline void nv_wr32(struct drm_device *dev, unsigned reg, u32 val)
-{
- struct drm_nouveau_private *dev_priv = dev->dev_private;
- iowrite32be(val, dev_priv->mmio + reg);
-}
-#else
static inline u32 nv_rd32(struct drm_device *dev, unsigned reg)
{
struct drm_nouveau_private *dev_priv = dev->dev_private;
- return readl(dev_priv->mmio + reg);
+ return ioread32_native(dev_priv->mmio + reg);
}
static inline void nv_wr32(struct drm_device *dev, unsigned reg, u32 val)
{
struct drm_nouveau_private *dev_priv = dev->dev_private;
- writel(val, dev_priv->mmio + reg);
+ iowrite32_native(val, dev_priv->mmio + reg);
}
-#endif /* not __BIG_ENDIAN */
static inline u8 nv_rd08(struct drm_device *dev, unsigned reg)
{
struct drm_nouveau_private *dev_priv = dev->dev_private;
- return readb(dev_priv->mmio + reg);
+ return ioread8(dev_priv->mmio + reg);
}
static inline void nv_wr08(struct drm_device *dev, unsigned reg, u8 val)
{
struct drm_nouveau_private *dev_priv = dev->dev_private;
- writeb(val, dev_priv->mmio + reg);
+ iowrite8(val, dev_priv->mmio + reg);
}
#define nv_wait(reg,mask,val) nouveau_wait_until(dev, 2000000000ULL, (reg), \
--
1.6.3.3
More information about the Nouveau
mailing list