drm/nouveau/gpuobj: type-safe accessor macros
authorBen Skeggs <bskeggs@redhat.com>
Thu, 20 Aug 2015 04:54:14 +0000 (14:54 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Fri, 28 Aug 2015 02:40:27 +0000 (12:40 +1000)
These require an explicit struct nvkm_gpuobj pointer, unlike the previous
macros which take a void *, and work with any nvkm_object.

New semantics require acquiring/releasing a gpuobj before accessing them,
which will be made use of in later patches to greatly reduce the overhead
of accesses, particularly when a direct mmio mapping of the object is not
available (suspend/resume, out of ioremap() space, and on GK20A).

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/include/nvkm/core/gpuobj.h

index aa98520fa265752bdafa28f13f7b1b967cd13e83..0dd216c055f671aeea18b2e4d6d023267e00b328 100644 (file)
@@ -60,4 +60,20 @@ int  _nvkm_gpuobj_init(struct nvkm_object *);
 int  _nvkm_gpuobj_fini(struct nvkm_object *, bool);
 u32  _nvkm_gpuobj_rd32(struct nvkm_object *, u64);
 void _nvkm_gpuobj_wr32(struct nvkm_object *, u64, u32);
+
+/* accessor macros - kmap()/done() must bracket use of the other accessor
+ * macros to guarantee correct behaviour across all chipsets
+ */
+#define nvkm_kmap(o) do {                                                      \
+       struct nvkm_gpuobj *_gpuobj = (o);                                     \
+       (void)_gpuobj;                                                         \
+} while(0)
+#define nvkm_ro32(o,a)   nv_ofuncs(o)->rd32(&(o)->object, (a))
+#define nvkm_wo32(o,a,d) nv_ofuncs(o)->wr32(&(o)->object, (a), (d))
+#define nvkm_mo32(o,a,m,d) ({                                                  \
+       u32 _addr = (a), _data = nvkm_ro32((o), _addr);                        \
+       nvkm_wo32((o), _addr, (_data & ~(m)) | (d));                           \
+       _data;                                                                 \
+})
+#define nvkm_done(o) nvkm_kmap(o)
 #endif