Lines Matching refs:falcon
29 nvkm_falcon_dma(struct nvkm_falcon *falcon, enum nvkm_falcon_mem *mem_type, u32 *mem_base) in nvkm_falcon_dma() argument
32 case IMEM: return falcon->func->imem_dma; in nvkm_falcon_dma()
33 case DMEM: return falcon->func->dmem_dma; in nvkm_falcon_dma()
40 nvkm_falcon_dma_wr(struct nvkm_falcon *falcon, const u8 *img, u64 dma_addr, u32 dma_base, in nvkm_falcon_dma_wr() argument
43 const struct nvkm_falcon_func_dma *dma = nvkm_falcon_dma(falcon, &mem_type, &mem_base); in nvkm_falcon_dma_wr()
58 FLCN_DBG(falcon, "%s %08x <- %08x bytes at %08x (%010llx %08x)", in nvkm_falcon_dma_wr()
63 ret = dma->init(falcon, dma_addr, dmalen, mem_type, sec, &cmd); in nvkm_falcon_dma_wr()
71 dma->xfer(falcon, dst, src - dma_start, cmd); in nvkm_falcon_dma_wr()
73 if (img && nvkm_printk_ok(falcon->owner, falcon->user, NV_DBG_TRACE)) { in nvkm_falcon_dma_wr()
88 if (nvkm_msec(falcon->owner->device, 2000, in nvkm_falcon_dma_wr()
89 if (dma->done(falcon)) in nvkm_falcon_dma_wr()
105 nvkm_falcon_pio(struct nvkm_falcon *falcon, enum nvkm_falcon_mem *mem_type, u32 *mem_base) in nvkm_falcon_pio() argument
109 return falcon->func->imem_pio; in nvkm_falcon_pio()
111 if (!falcon->func->emem_addr || *mem_base < falcon->func->emem_addr) in nvkm_falcon_pio()
112 return falcon->func->dmem_pio; in nvkm_falcon_pio()
114 *mem_base -= falcon->func->emem_addr; in nvkm_falcon_pio()
117 return falcon->func->emem_pio; in nvkm_falcon_pio()
124 nvkm_falcon_pio_rd(struct nvkm_falcon *falcon, u8 port, enum nvkm_falcon_mem mem_type, u32 mem_base, in nvkm_falcon_pio_rd() argument
127 const struct nvkm_falcon_func_pio *pio = nvkm_falcon_pio(falcon, &mem_type, &mem_base); in nvkm_falcon_pio_rd()
134 FLCN_DBG(falcon, "%s %08x -> %08x bytes at %08x", type, mem_base, len, img_base); in nvkm_falcon_pio_rd()
138 pio->rd_init(falcon, port, mem_base); in nvkm_falcon_pio_rd()
141 pio->rd(falcon, port, img, xfer_len); in nvkm_falcon_pio_rd()
143 if (nvkm_printk_ok(falcon->owner, falcon->user, NV_DBG_TRACE)) { in nvkm_falcon_pio_rd()
159 nvkm_falcon_pio_wr(struct nvkm_falcon *falcon, const u8 *img, u32 img_base, u8 port, in nvkm_falcon_pio_wr() argument
162 const struct nvkm_falcon_func_pio *pio = nvkm_falcon_pio(falcon, &mem_type, &mem_base); in nvkm_falcon_pio_wr()
169 FLCN_DBG(falcon, "%s %08x <- %08x bytes at %08x", type, mem_base, len, img_base); in nvkm_falcon_pio_wr()
173 pio->wr_init(falcon, port, sec, mem_base); in nvkm_falcon_pio_wr()
176 pio->wr(falcon, port, img, xfer_len, tag++); in nvkm_falcon_pio_wr()
178 if (nvkm_printk_ok(falcon->owner, falcon->user, NV_DBG_TRACE)) { in nvkm_falcon_pio_wr()
196 nvkm_falcon_load_imem(struct nvkm_falcon *falcon, void *data, u32 start, in nvkm_falcon_load_imem() argument
199 if (secure && !falcon->secret) { in nvkm_falcon_load_imem()
200 nvkm_warn(falcon->user, in nvkm_falcon_load_imem()
205 falcon->func->load_imem(falcon, data, start, size, tag, port, in nvkm_falcon_load_imem()
210 nvkm_falcon_load_dmem(struct nvkm_falcon *falcon, void *data, u32 start, in nvkm_falcon_load_dmem() argument
213 mutex_lock(&falcon->dmem_mutex); in nvkm_falcon_load_dmem()
215 falcon->func->load_dmem(falcon, data, start, size, port); in nvkm_falcon_load_dmem()
217 mutex_unlock(&falcon->dmem_mutex); in nvkm_falcon_load_dmem()
221 nvkm_falcon_start(struct nvkm_falcon *falcon) in nvkm_falcon_start() argument
223 falcon->func->start(falcon); in nvkm_falcon_start()
227 nvkm_falcon_reset(struct nvkm_falcon *falcon) in nvkm_falcon_reset() argument
231 ret = falcon->func->disable(falcon); in nvkm_falcon_reset()
235 return nvkm_falcon_enable(falcon); in nvkm_falcon_reset()
239 nvkm_falcon_oneinit(struct nvkm_falcon *falcon) in nvkm_falcon_oneinit() argument
241 const struct nvkm_falcon_func *func = falcon->func; in nvkm_falcon_oneinit()
242 const struct nvkm_subdev *subdev = falcon->owner; in nvkm_falcon_oneinit()
245 if (!falcon->addr) { in nvkm_falcon_oneinit()
246 falcon->addr = nvkm_top_addr(subdev->device, subdev->type, subdev->inst); in nvkm_falcon_oneinit()
247 if (WARN_ON(!falcon->addr)) in nvkm_falcon_oneinit()
251 reg = nvkm_falcon_rd32(falcon, 0x12c); in nvkm_falcon_oneinit()
252 falcon->version = reg & 0xf; in nvkm_falcon_oneinit()
253 falcon->secret = (reg >> 4) & 0x3; in nvkm_falcon_oneinit()
254 falcon->code.ports = (reg >> 8) & 0xf; in nvkm_falcon_oneinit()
255 falcon->data.ports = (reg >> 12) & 0xf; in nvkm_falcon_oneinit()
257 reg = nvkm_falcon_rd32(falcon, 0x108); in nvkm_falcon_oneinit()
258 falcon->code.limit = (reg & 0x1ff) << 8; in nvkm_falcon_oneinit()
259 falcon->data.limit = (reg & 0x3fe00) >> 1; in nvkm_falcon_oneinit()
262 u32 val = nvkm_falcon_rd32(falcon, func->debug); in nvkm_falcon_oneinit()
263 falcon->debug = (val >> 20) & 0x1; in nvkm_falcon_oneinit()
270 nvkm_falcon_put(struct nvkm_falcon *falcon, struct nvkm_subdev *user) in nvkm_falcon_put() argument
272 if (unlikely(!falcon)) in nvkm_falcon_put()
275 mutex_lock(&falcon->mutex); in nvkm_falcon_put()
276 if (falcon->user == user) { in nvkm_falcon_put()
277 nvkm_debug(falcon->user, "released %s falcon\n", falcon->name); in nvkm_falcon_put()
278 falcon->user = NULL; in nvkm_falcon_put()
280 mutex_unlock(&falcon->mutex); in nvkm_falcon_put()
284 nvkm_falcon_get(struct nvkm_falcon *falcon, struct nvkm_subdev *user) in nvkm_falcon_get() argument
288 mutex_lock(&falcon->mutex); in nvkm_falcon_get()
289 if (falcon->user) { in nvkm_falcon_get()
291 falcon->name, falcon->user->name); in nvkm_falcon_get()
292 mutex_unlock(&falcon->mutex); in nvkm_falcon_get()
296 nvkm_debug(user, "acquired %s falcon\n", falcon->name); in nvkm_falcon_get()
297 if (!falcon->oneinit) in nvkm_falcon_get()
298 ret = nvkm_falcon_oneinit(falcon); in nvkm_falcon_get()
299 falcon->user = user; in nvkm_falcon_get()
300 mutex_unlock(&falcon->mutex); in nvkm_falcon_get()
305 nvkm_falcon_dtor(struct nvkm_falcon *falcon) in nvkm_falcon_dtor() argument
312 struct nvkm_falcon *falcon) in nvkm_falcon_ctor() argument
314 falcon->func = func; in nvkm_falcon_ctor()
315 falcon->owner = subdev; in nvkm_falcon_ctor()
316 falcon->name = name; in nvkm_falcon_ctor()
317 falcon->addr = addr; in nvkm_falcon_ctor()
318 falcon->addr2 = func->addr2; in nvkm_falcon_ctor()
319 mutex_init(&falcon->mutex); in nvkm_falcon_ctor()
320 mutex_init(&falcon->dmem_mutex); in nvkm_falcon_ctor()