1 #ifndef __NVKM_FALCON_H__ 2 #define __NVKM_FALCON_H__ 3 #define nvkm_falcon(p) container_of((p), struct nvkm_falcon, engine) 4 #include <core/engine.h> 5 struct nvkm_fifo_chan; 6 7 enum nvkm_falcon_dmaidx { 8 FALCON_DMAIDX_UCODE = 0, 9 FALCON_DMAIDX_VIRT = 1, 10 FALCON_DMAIDX_PHYS_VID = 2, 11 FALCON_DMAIDX_PHYS_SYS_COH = 3, 12 FALCON_DMAIDX_PHYS_SYS_NCOH = 4, 13 }; 14 15 struct nvkm_falcon { 16 const struct nvkm_falcon_func *func; 17 const struct nvkm_subdev *owner; 18 const char *name; 19 u32 addr; 20 21 struct mutex mutex; 22 const struct nvkm_subdev *user; 23 24 u8 version; 25 u8 secret; 26 bool debug; 27 28 struct nvkm_memory *core; 29 bool external; 30 31 struct { 32 u32 limit; 33 u32 *data; 34 u32 size; 35 u8 ports; 36 } code; 37 38 struct { 39 u32 limit; 40 u32 *data; 41 u32 size; 42 u8 ports; 43 } data; 44 45 struct nvkm_engine engine; 46 }; 47 48 int nvkm_falcon_v1_new(struct nvkm_subdev *owner, const char *name, u32 addr, 49 struct nvkm_falcon **); 50 void nvkm_falcon_del(struct nvkm_falcon **); 51 int nvkm_falcon_get(struct nvkm_falcon *, const struct nvkm_subdev *); 52 void nvkm_falcon_put(struct nvkm_falcon *, const struct nvkm_subdev *); 53 54 int nvkm_falcon_new_(const struct nvkm_falcon_func *, struct nvkm_device *, 55 int index, bool enable, u32 addr, struct nvkm_engine **); 56 57 struct nvkm_falcon_func { 58 struct { 59 u32 *data; 60 u32 size; 61 } code; 62 struct { 63 u32 *data; 64 u32 size; 65 } data; 66 void (*init)(struct nvkm_falcon *); 67 void (*intr)(struct nvkm_falcon *, struct nvkm_fifo_chan *); 68 void (*load_imem)(struct nvkm_falcon *, void *, u32, u32, u16, u8, bool); 69 void (*load_dmem)(struct nvkm_falcon *, void *, u32, u32, u8); 70 void (*read_dmem)(struct nvkm_falcon *, u32, u32, u8, void *); 71 void (*bind_context)(struct nvkm_falcon *, struct nvkm_gpuobj *); 72 int (*wait_for_halt)(struct nvkm_falcon *, u32); 73 int (*clear_interrupt)(struct nvkm_falcon *, u32); 74 void (*set_start_addr)(struct nvkm_falcon *, u32 start_addr); 75 void (*start)(struct nvkm_falcon *); 76 int (*enable)(struct nvkm_falcon *falcon); 77 void (*disable)(struct nvkm_falcon *falcon); 78 79 struct nvkm_sclass sclass[]; 80 }; 81 82 static inline u32 83 nvkm_falcon_rd32(struct nvkm_falcon *falcon, u32 addr) 84 { 85 return nvkm_rd32(falcon->owner->device, falcon->addr + addr); 86 } 87 88 static inline void 89 nvkm_falcon_wr32(struct nvkm_falcon *falcon, u32 addr, u32 data) 90 { 91 nvkm_wr32(falcon->owner->device, falcon->addr + addr, data); 92 } 93 94 static inline u32 95 nvkm_falcon_mask(struct nvkm_falcon *falcon, u32 addr, u32 mask, u32 val) 96 { 97 struct nvkm_device *device = falcon->owner->device; 98 99 return nvkm_mask(device, falcon->addr + addr, mask, val); 100 } 101 102 void nvkm_falcon_load_imem(struct nvkm_falcon *, void *, u32, u32, u16, u8, 103 bool); 104 void nvkm_falcon_load_dmem(struct nvkm_falcon *, void *, u32, u32, u8); 105 void nvkm_falcon_read_dmem(struct nvkm_falcon *, u32, u32, u8, void *); 106 void nvkm_falcon_bind_context(struct nvkm_falcon *, struct nvkm_gpuobj *); 107 void nvkm_falcon_set_start_addr(struct nvkm_falcon *, u32); 108 void nvkm_falcon_start(struct nvkm_falcon *); 109 int nvkm_falcon_wait_for_halt(struct nvkm_falcon *, u32); 110 int nvkm_falcon_clear_interrupt(struct nvkm_falcon *, u32); 111 int nvkm_falcon_enable(struct nvkm_falcon *); 112 void nvkm_falcon_disable(struct nvkm_falcon *); 113 int nvkm_falcon_reset(struct nvkm_falcon *); 114 115 #endif 116