mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-13 14:14:37 +00:00
drm/nouveau/gpuobj: type-safe accessor macros
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>
This commit is contained in:
parent
9ccdc76006
commit
384af9acea
1 changed files with 16 additions and 0 deletions
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue