• Home
  • Raw
  • Download

Lines Matching +full:hdr +full:- +full:engine

5  * Copyright (C) 2006-2007 Sylvain Munaut <tnt@246tNt.com>
7 * ( by Andrey Volkov <avolkov@varma-el.com> )
8 * Copyright (C) 2003-2004 MontaVista, Software, Inc.
30 #define DRIVER_NAME "bestcomm-core"
34 { .compatible = "fsl,mpc5200-sram", },
35 { .compatible = "mpc5200-sram", },
52 int i, tasknum = -1; in bcom_task_alloc()
60 spin_lock(&bcom_eng->lock); in bcom_task_alloc()
63 if (!bcom_eng->tdt[i].stop) { /* we use stop as a marker */ in bcom_task_alloc()
64 bcom_eng->tdt[i].stop = 0xfffffffful; /* dummy addr */ in bcom_task_alloc()
69 spin_unlock(&bcom_eng->lock); in bcom_task_alloc()
79 tsk->tasknum = tasknum; in bcom_task_alloc()
81 tsk->priv = (void*)tsk + sizeof(struct bcom_task); in bcom_task_alloc()
84 tsk->irq = irq_of_parse_and_map(bcom_eng->ofnode, tsk->tasknum); in bcom_task_alloc()
85 if (!tsk->irq) in bcom_task_alloc()
90 tsk->cookie = kmalloc_array(bd_count, sizeof(void *), in bcom_task_alloc()
92 if (!tsk->cookie) in bcom_task_alloc()
95 tsk->bd = bcom_sram_alloc(bd_count * bd_size, 4, &tsk->bd_pa); in bcom_task_alloc()
96 if (!tsk->bd) in bcom_task_alloc()
98 memset_io(tsk->bd, 0x00, bd_count * bd_size); in bcom_task_alloc()
100 tsk->num_bd = bd_count; in bcom_task_alloc()
101 tsk->bd_size = bd_size; in bcom_task_alloc()
108 if (tsk->irq) in bcom_task_alloc()
109 irq_dispose_mapping(tsk->irq); in bcom_task_alloc()
110 bcom_sram_free(tsk->bd); in bcom_task_alloc()
111 kfree(tsk->cookie); in bcom_task_alloc()
115 bcom_eng->tdt[tasknum].stop = 0; in bcom_task_alloc()
125 bcom_disable_task(tsk->tasknum); in bcom_task_free()
128 bcom_eng->tdt[tsk->tasknum].start = 0; in bcom_task_free()
129 bcom_eng->tdt[tsk->tasknum].stop = 0; in bcom_task_free()
132 irq_dispose_mapping(tsk->irq); in bcom_task_free()
133 bcom_sram_free(tsk->bd); in bcom_task_free()
134 kfree(tsk->cookie); in bcom_task_free()
142 struct bcom_task_header *hdr = (struct bcom_task_header *)task_image; in bcom_load_image() local
148 if (hdr->magic != BCOM_TASK_MAGIC) { in bcom_load_image()
151 return -EINVAL; in bcom_load_image()
157 return -EINVAL; in bcom_load_image()
161 tdt = &bcom_eng->tdt[task]; in bcom_load_image()
163 if (tdt->start) { in bcom_load_image()
165 if (hdr->desc_size != bcom_task_num_descs(task)) { in bcom_load_image()
170 hdr->desc_size, in bcom_load_image()
172 return -EINVAL; in bcom_load_image()
177 desc = bcom_sram_alloc(hdr->desc_size * sizeof(u32), 4, &start_pa); in bcom_load_image()
179 return -ENOMEM; in bcom_load_image()
181 tdt->start = start_pa; in bcom_load_image()
182 tdt->stop = start_pa + ((hdr->desc_size-1) * sizeof(u32)); in bcom_load_image()
192 desc_src = (u32 *)(hdr + 1); in bcom_load_image()
193 var_src = desc_src + hdr->desc_size; in bcom_load_image()
194 inc_src = var_src + hdr->var_size; in bcom_load_image()
196 memcpy_toio(desc, desc_src, hdr->desc_size * sizeof(u32)); in bcom_load_image()
197 memcpy_toio(var + hdr->first_var, var_src, hdr->var_size * sizeof(u32)); in bcom_load_image()
198 memcpy_toio(inc, inc_src, hdr->inc_size * sizeof(u32)); in bcom_load_image()
239 bcom_enable_task(tsk->tasknum); in bcom_enable()
246 bcom_disable_task(tsk->tasknum); in bcom_disable()
252 /* Engine init/cleanup */
258 0xa0045670, /* FDT[48] - load_acc() */
259 0x80045670, /* FDT[49] - unload_acc() */
260 0x21800000, /* FDT[50] - and() */
261 0x21e00000, /* FDT[51] - or() */
262 0x21500000, /* FDT[52] - xor() */
263 0x21400000, /* FDT[53] - andn() */
264 0x21500000, /* FDT[54] - not() */
265 0x20400000, /* FDT[55] - add() */
266 0x20500000, /* FDT[56] - sub() */
267 0x20800000, /* FDT[57] - lsh() */
268 0x20a00000, /* FDT[58] - rsh() */
269 0xc0170000, /* FDT[59] - crc8() */
270 0xc0145670, /* FDT[60] - crc16() */
271 0xc0345670, /* FDT[61] - crc32() */
272 0xa0076540, /* FDT[62] - endian32() */
273 0xa0000760, /* FDT[63] - endian16() */
289 bcom_eng->tdt = bcom_sram_alloc(tdt_size, sizeof(u32), &tdt_pa); in bcom_engine_init()
290 bcom_eng->ctx = bcom_sram_alloc(ctx_size, BCOM_CTX_ALIGN, &ctx_pa); in bcom_engine_init()
291 bcom_eng->var = bcom_sram_alloc(var_size, BCOM_VAR_ALIGN, &var_pa); in bcom_engine_init()
292 bcom_eng->fdt = bcom_sram_alloc(fdt_size, BCOM_FDT_ALIGN, &fdt_pa); in bcom_engine_init()
294 if (!bcom_eng->tdt || !bcom_eng->ctx || !bcom_eng->var || !bcom_eng->fdt) { in bcom_engine_init()
295 printk(KERN_ERR "DMA: SRAM alloc failed in engine init !\n"); in bcom_engine_init()
297 bcom_sram_free(bcom_eng->tdt); in bcom_engine_init()
298 bcom_sram_free(bcom_eng->ctx); in bcom_engine_init()
299 bcom_sram_free(bcom_eng->var); in bcom_engine_init()
300 bcom_sram_free(bcom_eng->fdt); in bcom_engine_init()
302 return -ENOMEM; in bcom_engine_init()
305 memset_io(bcom_eng->tdt, 0x00, tdt_size); in bcom_engine_init()
306 memset_io(bcom_eng->ctx, 0x00, ctx_size); in bcom_engine_init()
307 memset_io(bcom_eng->var, 0x00, var_size); in bcom_engine_init()
308 memset_io(bcom_eng->fdt, 0x00, fdt_size); in bcom_engine_init()
311 memcpy_toio(&bcom_eng->fdt[48], fdt_ops, sizeof(fdt_ops)); in bcom_engine_init()
316 out_be16(&bcom_eng->regs->tcr[task], 0); in bcom_engine_init()
317 out_8(&bcom_eng->regs->ipr[task], 0); in bcom_engine_init()
319 bcom_eng->tdt[task].context = ctx_pa; in bcom_engine_init()
320 bcom_eng->tdt[task].var = var_pa; in bcom_engine_init()
321 bcom_eng->tdt[task].fdt = fdt_pa; in bcom_engine_init()
327 out_be32(&bcom_eng->regs->taskBar, tdt_pa); in bcom_engine_init()
330 out_8(&bcom_eng->regs->ipr[BCOM_INITIATOR_ALWAYS], BCOM_IPR_ALWAYS); in bcom_engine_init()
337 spin_lock_init(&bcom_eng->lock); in bcom_engine_init()
350 out_be16(&bcom_eng->regs->tcr[task], 0); in bcom_engine_cleanup()
351 out_8(&bcom_eng->regs->ipr[task], 0); in bcom_engine_cleanup()
354 out_be32(&bcom_eng->regs->taskBar, 0ul); in bcom_engine_cleanup()
357 bcom_sram_free(bcom_eng->tdt); in bcom_engine_cleanup()
358 bcom_sram_free(bcom_eng->ctx); in bcom_engine_cleanup()
359 bcom_sram_free(bcom_eng->var); in bcom_engine_cleanup()
360 bcom_sram_free(bcom_eng->fdt); in bcom_engine_cleanup()
379 of_node_get(op->dev.of_node); in mpc52xx_bcom_probe()
386 rv = -ENODEV; in mpc52xx_bcom_probe()
401 rv = -ENOMEM; in mpc52xx_bcom_probe()
406 bcom_eng->ofnode = op->dev.of_node; in mpc52xx_bcom_probe()
409 if (of_address_to_resource(op->dev.of_node, 0, &res_bcom)) { in mpc52xx_bcom_probe()
412 rv = -EINVAL; in mpc52xx_bcom_probe()
420 rv = -EBUSY; in mpc52xx_bcom_probe()
424 bcom_eng->regs_base = res_bcom.start; in mpc52xx_bcom_probe()
425 bcom_eng->regs = ioremap(res_bcom.start, sizeof(struct mpc52xx_sdma)); in mpc52xx_bcom_probe()
426 if (!bcom_eng->regs) { in mpc52xx_bcom_probe()
429 rv = -ENOMEM; in mpc52xx_bcom_probe()
439 printk(KERN_INFO "DMA: MPC52xx BestComm engine @%08lx ok !\n", in mpc52xx_bcom_probe()
440 (long)bcom_eng->regs_base); in mpc52xx_bcom_probe()
446 iounmap(bcom_eng->regs); in mpc52xx_bcom_probe()
453 of_node_put(op->dev.of_node); in mpc52xx_bcom_probe()
463 /* Clean up the engine */ in mpc52xx_bcom_remove()
470 iounmap(bcom_eng->regs); in mpc52xx_bcom_remove()
471 release_mem_region(bcom_eng->regs_base, sizeof(struct mpc52xx_sdma)); in mpc52xx_bcom_remove()
474 of_node_put(bcom_eng->ofnode); in mpc52xx_bcom_remove()
484 { .compatible = "fsl,mpc5200-bestcomm", },
485 { .compatible = "mpc5200-bestcomm", },
526 MODULE_AUTHOR("Andrey Volkov <avolkov@varma-el.com>");