1 #ifndef __NVKM_DEVICE_H__ 2 #define __NVKM_DEVICE_H__ 3 #include <core/event.h> 4 #include <core/object.h> 5 6 enum nvkm_devidx { 7 NVKM_SUBDEV_PCI, 8 NVKM_SUBDEV_VBIOS, 9 NVKM_SUBDEV_DEVINIT, 10 NVKM_SUBDEV_IBUS, 11 NVKM_SUBDEV_GPIO, 12 NVKM_SUBDEV_I2C, 13 NVKM_SUBDEV_FUSE, 14 NVKM_SUBDEV_MXM, 15 NVKM_SUBDEV_MC, 16 NVKM_SUBDEV_BUS, 17 NVKM_SUBDEV_TIMER, 18 NVKM_SUBDEV_FB, 19 NVKM_SUBDEV_LTC, 20 NVKM_SUBDEV_INSTMEM, 21 NVKM_SUBDEV_MMU, 22 NVKM_SUBDEV_BAR, 23 NVKM_SUBDEV_PMU, 24 NVKM_SUBDEV_VOLT, 25 NVKM_SUBDEV_THERM, 26 NVKM_SUBDEV_CLK, 27 28 NVKM_ENGINE_DMAOBJ, 29 NVKM_ENGINE_IFB, 30 NVKM_ENGINE_FIFO, 31 NVKM_ENGINE_SW, 32 NVKM_ENGINE_GR, 33 NVKM_ENGINE_MPEG, 34 NVKM_ENGINE_ME, 35 NVKM_ENGINE_VP, 36 NVKM_ENGINE_CIPHER, 37 NVKM_ENGINE_BSP, 38 NVKM_ENGINE_MSPPP, 39 NVKM_ENGINE_CE0, 40 NVKM_ENGINE_CE1, 41 NVKM_ENGINE_CE2, 42 NVKM_ENGINE_VIC, 43 NVKM_ENGINE_MSENC, 44 NVKM_ENGINE_DISP, 45 NVKM_ENGINE_PM, 46 NVKM_ENGINE_MSVLD, 47 NVKM_ENGINE_SEC, 48 NVKM_ENGINE_MSPDEC, 49 50 NVKM_SUBDEV_NR 51 }; 52 53 enum nvkm_device_type { 54 NVKM_DEVICE_PCI, 55 NVKM_DEVICE_AGP, 56 NVKM_DEVICE_PCIE, 57 NVKM_DEVICE_TEGRA, 58 }; 59 60 struct nvkm_device { 61 const struct nvkm_device_func *func; 62 const struct nvkm_device_quirk *quirk; 63 struct device *dev; 64 enum nvkm_device_type type; 65 u64 handle; 66 const char *name; 67 const char *cfgopt; 68 const char *dbgopt; 69 70 struct list_head head; 71 struct mutex mutex; 72 int refcount; 73 74 void __iomem *pri; 75 76 struct nvkm_event event; 77 78 u64 disable_mask; 79 u32 debug; 80 81 const struct nvkm_device_chip *chip; 82 enum { 83 NV_04 = 0x04, 84 NV_10 = 0x10, 85 NV_11 = 0x11, 86 NV_20 = 0x20, 87 NV_30 = 0x30, 88 NV_40 = 0x40, 89 NV_50 = 0x50, 90 NV_C0 = 0xc0, 91 NV_E0 = 0xe0, 92 GM100 = 0x110, 93 } card_type; 94 u32 chipset; 95 u8 chiprev; 96 u32 crystal; 97 98 struct { 99 struct notifier_block nb; 100 } acpi; 101 102 struct nvkm_bar *bar; 103 struct nvkm_bios *bios; 104 struct nvkm_bus *bus; 105 struct nvkm_clk *clk; 106 struct nvkm_devinit *devinit; 107 struct nvkm_fb *fb; 108 struct nvkm_fuse *fuse; 109 struct nvkm_gpio *gpio; 110 struct nvkm_i2c *i2c; 111 struct nvkm_subdev *ibus; 112 struct nvkm_instmem *imem; 113 struct nvkm_ltc *ltc; 114 struct nvkm_mc *mc; 115 struct nvkm_mmu *mmu; 116 struct nvkm_subdev *mxm; 117 struct nvkm_pci *pci; 118 struct nvkm_pmu *pmu; 119 struct nvkm_therm *therm; 120 struct nvkm_timer *timer; 121 struct nvkm_volt *volt; 122 123 struct nvkm_engine *bsp; 124 struct nvkm_engine *ce[3]; 125 struct nvkm_engine *cipher; 126 struct nvkm_disp *disp; 127 struct nvkm_dma *dma; 128 struct nvkm_fifo *fifo; 129 struct nvkm_gr *gr; 130 struct nvkm_engine *ifb; 131 struct nvkm_engine *me; 132 struct nvkm_engine *mpeg; 133 struct nvkm_engine *msenc; 134 struct nvkm_engine *mspdec; 135 struct nvkm_engine *msppp; 136 struct nvkm_engine *msvld; 137 struct nvkm_pm *pm; 138 struct nvkm_engine *sec; 139 struct nvkm_sw *sw; 140 struct nvkm_engine *vic; 141 struct nvkm_engine *vp; 142 }; 143 144 struct nvkm_subdev *nvkm_device_subdev(struct nvkm_device *, int index); 145 struct nvkm_engine *nvkm_device_engine(struct nvkm_device *, int index); 146 147 struct nvkm_device_func { 148 struct nvkm_device_pci *(*pci)(struct nvkm_device *); 149 struct nvkm_device_tegra *(*tegra)(struct nvkm_device *); 150 void *(*dtor)(struct nvkm_device *); 151 int (*preinit)(struct nvkm_device *); 152 int (*init)(struct nvkm_device *); 153 void (*fini)(struct nvkm_device *, bool suspend); 154 resource_size_t (*resource_addr)(struct nvkm_device *, unsigned bar); 155 resource_size_t (*resource_size)(struct nvkm_device *, unsigned bar); 156 bool cpu_coherent; 157 }; 158 159 struct nvkm_device_quirk { 160 u8 tv_pin_mask; 161 u8 tv_gpio; 162 }; 163 164 struct nvkm_device_chip { 165 const char *name; 166 167 int (*bar )(struct nvkm_device *, int idx, struct nvkm_bar **); 168 int (*bios )(struct nvkm_device *, int idx, struct nvkm_bios **); 169 int (*bus )(struct nvkm_device *, int idx, struct nvkm_bus **); 170 int (*clk )(struct nvkm_device *, int idx, struct nvkm_clk **); 171 int (*devinit)(struct nvkm_device *, int idx, struct nvkm_devinit **); 172 int (*fb )(struct nvkm_device *, int idx, struct nvkm_fb **); 173 int (*fuse )(struct nvkm_device *, int idx, struct nvkm_fuse **); 174 int (*gpio )(struct nvkm_device *, int idx, struct nvkm_gpio **); 175 int (*i2c )(struct nvkm_device *, int idx, struct nvkm_i2c **); 176 int (*ibus )(struct nvkm_device *, int idx, struct nvkm_subdev **); 177 int (*imem )(struct nvkm_device *, int idx, struct nvkm_instmem **); 178 int (*ltc )(struct nvkm_device *, int idx, struct nvkm_ltc **); 179 int (*mc )(struct nvkm_device *, int idx, struct nvkm_mc **); 180 int (*mmu )(struct nvkm_device *, int idx, struct nvkm_mmu **); 181 int (*mxm )(struct nvkm_device *, int idx, struct nvkm_subdev **); 182 int (*pci )(struct nvkm_device *, int idx, struct nvkm_pci **); 183 int (*pmu )(struct nvkm_device *, int idx, struct nvkm_pmu **); 184 int (*therm )(struct nvkm_device *, int idx, struct nvkm_therm **); 185 int (*timer )(struct nvkm_device *, int idx, struct nvkm_timer **); 186 int (*volt )(struct nvkm_device *, int idx, struct nvkm_volt **); 187 188 int (*bsp )(struct nvkm_device *, int idx, struct nvkm_engine **); 189 int (*ce[3] )(struct nvkm_device *, int idx, struct nvkm_engine **); 190 int (*cipher )(struct nvkm_device *, int idx, struct nvkm_engine **); 191 int (*disp )(struct nvkm_device *, int idx, struct nvkm_disp **); 192 int (*dma )(struct nvkm_device *, int idx, struct nvkm_dma **); 193 int (*fifo )(struct nvkm_device *, int idx, struct nvkm_fifo **); 194 int (*gr )(struct nvkm_device *, int idx, struct nvkm_gr **); 195 int (*ifb )(struct nvkm_device *, int idx, struct nvkm_engine **); 196 int (*me )(struct nvkm_device *, int idx, struct nvkm_engine **); 197 int (*mpeg )(struct nvkm_device *, int idx, struct nvkm_engine **); 198 int (*msenc )(struct nvkm_device *, int idx, struct nvkm_engine **); 199 int (*mspdec )(struct nvkm_device *, int idx, struct nvkm_engine **); 200 int (*msppp )(struct nvkm_device *, int idx, struct nvkm_engine **); 201 int (*msvld )(struct nvkm_device *, int idx, struct nvkm_engine **); 202 int (*pm )(struct nvkm_device *, int idx, struct nvkm_pm **); 203 int (*sec )(struct nvkm_device *, int idx, struct nvkm_engine **); 204 int (*sw )(struct nvkm_device *, int idx, struct nvkm_sw **); 205 int (*vic )(struct nvkm_device *, int idx, struct nvkm_engine **); 206 int (*vp )(struct nvkm_device *, int idx, struct nvkm_engine **); 207 }; 208 209 struct nvkm_device *nvkm_device_find(u64 name); 210 int nvkm_device_list(u64 *name, int size); 211 212 /* privileged register interface accessor macros */ 213 #define nvkm_rd08(d,a) ioread8((d)->pri + (a)) 214 #define nvkm_rd16(d,a) ioread16_native((d)->pri + (a)) 215 #define nvkm_rd32(d,a) ioread32_native((d)->pri + (a)) 216 #define nvkm_wr08(d,a,v) iowrite8((v), (d)->pri + (a)) 217 #define nvkm_wr16(d,a,v) iowrite16_native((v), (d)->pri + (a)) 218 #define nvkm_wr32(d,a,v) iowrite32_native((v), (d)->pri + (a)) 219 #define nvkm_mask(d,a,m,v) ({ \ 220 struct nvkm_device *_device = (d); \ 221 u32 _addr = (a), _temp = nvkm_rd32(_device, _addr); \ 222 nvkm_wr32(_device, _addr, (_temp & ~(m)) | (v)); \ 223 _temp; \ 224 }) 225 226 void nvkm_device_del(struct nvkm_device **); 227 228 struct nvkm_device_oclass { 229 int (*ctor)(struct nvkm_device *, const struct nvkm_oclass *, 230 void *data, u32 size, struct nvkm_object **); 231 struct nvkm_sclass base; 232 }; 233 234 extern const struct nvkm_sclass nvkm_udevice_sclass; 235 236 /* device logging */ 237 #define nvdev_printk_(d,l,p,f,a...) do { \ 238 struct nvkm_device *_device = (d); \ 239 if (_device->debug >= (l)) \ 240 dev_##p(_device->dev, f, ##a); \ 241 } while(0) 242 #define nvdev_printk(d,l,p,f,a...) nvdev_printk_((d), NV_DBG_##l, p, f, ##a) 243 #define nvdev_fatal(d,f,a...) nvdev_printk((d), FATAL, crit, f, ##a) 244 #define nvdev_error(d,f,a...) nvdev_printk((d), ERROR, err, f, ##a) 245 #define nvdev_warn(d,f,a...) nvdev_printk((d), WARN, notice, f, ##a) 246 #define nvdev_info(d,f,a...) nvdev_printk((d), INFO, info, f, ##a) 247 #define nvdev_debug(d,f,a...) nvdev_printk((d), DEBUG, info, f, ##a) 248 #define nvdev_trace(d,f,a...) nvdev_printk((d), TRACE, info, f, ##a) 249 #define nvdev_spam(d,f,a...) nvdev_printk((d), SPAM, dbg, f, ##a) 250 #endif 251