1#ifndef __NVKM_SUBDEV_H__ 2#define __NVKM_SUBDEV_H__ 3#include <core/object.h> 4#include <core/devidx.h> 5 6#define NV_SUBDEV_(sub,var) (NV_SUBDEV_CLASS | ((var) << 8) | (sub)) 7#define NV_SUBDEV(name,var) NV_SUBDEV_(NVDEV_SUBDEV_##name, (var)) 8 9struct nvkm_subdev { 10 struct nvkm_object object; 11 struct mutex mutex; 12 const char *name; 13 void __iomem *mmio; 14 u32 debug; 15 u32 unit; 16 17 void (*intr)(struct nvkm_subdev *); 18}; 19 20static inline struct nvkm_subdev * 21nv_subdev(void *obj) 22{ 23#if CONFIG_NOUVEAU_DEBUG >= NV_DBG_PARANOIA 24 if (unlikely(!nv_iclass(obj, NV_SUBDEV_CLASS))) 25 nv_assert("BAD CAST -> NvSubDev, %08x", nv_hclass(obj)); 26#endif 27 return obj; 28} 29 30static inline int 31nv_subidx(struct nvkm_subdev *subdev) 32{ 33 return nv_hclass(subdev) & 0xff; 34} 35 36struct nvkm_subdev *nvkm_subdev(void *obj, int idx); 37 38#define nvkm_subdev_create(p,e,o,v,s,f,d) \ 39 nvkm_subdev_create_((p), (e), (o), (v), (s), (f), \ 40 sizeof(**d),(void **)d) 41 42int nvkm_subdev_create_(struct nvkm_object *, struct nvkm_object *, 43 struct nvkm_oclass *, u32 pclass, 44 const char *sname, const char *fname, 45 int size, void **); 46void nvkm_subdev_destroy(struct nvkm_subdev *); 47int nvkm_subdev_init(struct nvkm_subdev *); 48int nvkm_subdev_fini(struct nvkm_subdev *, bool suspend); 49void nvkm_subdev_reset(struct nvkm_object *); 50 51void _nvkm_subdev_dtor(struct nvkm_object *); 52int _nvkm_subdev_init(struct nvkm_object *); 53int _nvkm_subdev_fini(struct nvkm_object *, bool suspend); 54 55#define s_printk(s,l,f,a...) do { \ 56 if ((s)->debug >= OS_DBG_##l) { \ 57 nv_printk((s)->base.parent, (s)->name, l, f, ##a); \ 58 } \ 59} while(0) 60 61static inline u8 62nv_rd08(void *obj, u32 addr) 63{ 64 struct nvkm_subdev *subdev = nv_subdev(obj); 65 u8 data = ioread8(subdev->mmio + addr); 66 nv_spam(subdev, "nv_rd08 0x%06x 0x%02x\n", addr, data); 67 return data; 68} 69 70static inline u16 71nv_rd16(void *obj, u32 addr) 72{ 73 struct nvkm_subdev *subdev = nv_subdev(obj); 74 u16 data = ioread16_native(subdev->mmio + addr); 75 nv_spam(subdev, "nv_rd16 0x%06x 0x%04x\n", addr, data); 76 return data; 77} 78 79static inline u32 80nv_rd32(void *obj, u32 addr) 81{ 82 struct nvkm_subdev *subdev = nv_subdev(obj); 83 u32 data = ioread32_native(subdev->mmio + addr); 84 nv_spam(subdev, "nv_rd32 0x%06x 0x%08x\n", addr, data); 85 return data; 86} 87 88static inline void 89nv_wr08(void *obj, u32 addr, u8 data) 90{ 91 struct nvkm_subdev *subdev = nv_subdev(obj); 92 nv_spam(subdev, "nv_wr08 0x%06x 0x%02x\n", addr, data); 93 iowrite8(data, subdev->mmio + addr); 94} 95 96static inline void 97nv_wr16(void *obj, u32 addr, u16 data) 98{ 99 struct nvkm_subdev *subdev = nv_subdev(obj); 100 nv_spam(subdev, "nv_wr16 0x%06x 0x%04x\n", addr, data); 101 iowrite16_native(data, subdev->mmio + addr); 102} 103 104static inline void 105nv_wr32(void *obj, u32 addr, u32 data) 106{ 107 struct nvkm_subdev *subdev = nv_subdev(obj); 108 nv_spam(subdev, "nv_wr32 0x%06x 0x%08x\n", addr, data); 109 iowrite32_native(data, subdev->mmio + addr); 110} 111 112static inline u32 113nv_mask(void *obj, u32 addr, u32 mask, u32 data) 114{ 115 u32 temp = nv_rd32(obj, addr); 116 nv_wr32(obj, addr, (temp & ~mask) | data); 117 return temp; 118} 119#endif 120