Lines Matching full:udma

71 static void al_udma_set_defaults(struct al_udma *udma)  in al_udma_set_defaults()  argument
73 uint8_t rev_id = udma->rev_id; in al_udma_set_defaults()
75 if (udma->type == UDMA_TX) { in al_udma_set_defaults()
77 (struct unit_regs*)udma->udma_regs; in al_udma_set_defaults()
80 * This allows the UDMA to have 16 outstanding writes */ in al_udma_set_defaults()
93 if (udma->type == UDMA_RX) { in al_udma_set_defaults()
95 &udma->udma_regs->s2m.s2m_comp.cfg_application_ack, 0); in al_udma_set_defaults()
103 * @param udma_q udma queue data structure
112 if (udma_q->udma->type == UDMA_TX) { in al_udma_q_config()
126 * @param udma_q udma queue data structure
135 if (udma_q->udma->type == UDMA_TX) in al_udma_q_config_compl()
155 if (udma_q->udma->type == UDMA_RX) { in al_udma_q_config_compl()
157 &udma_q->udma->udma_regs->s2m.s2m_comp.cfg_1c); in al_udma_q_config_compl()
162 al_reg_write32(&udma_q->udma->udma_regs->s2m.s2m_comp.cfg_1c in al_udma_q_config_compl()
171 * @param udma_q udma queue data structure
204 * enable/disable udma queue
206 * @param udma_q udma queue data structure
231 * Initialize the udma engine
233 int al_udma_init(struct al_udma *udma, struct al_udma_params *udma_params) in al_udma_init() argument
237 al_assert(udma); in al_udma_init()
240 al_err("udma: invalid num_of_queues parameter\n"); in al_udma_init()
244 udma->type = udma_params->type; in al_udma_init()
245 udma->num_of_queues = udma_params->num_of_queues; in al_udma_init()
246 udma->gen_regs = &udma_params->udma_regs_base->gen; in al_udma_init()
248 if (udma->type == UDMA_TX) in al_udma_init()
249 udma->udma_regs = (union udma_regs *)&udma_params->udma_regs_base->m2s; in al_udma_init()
251 udma->udma_regs = (union udma_regs *)&udma_params->udma_regs_base->s2m; in al_udma_init()
253 udma->rev_id = al_udma_get_revision(udma_params->udma_regs_base); in al_udma_init()
256 udma->name = ""; in al_udma_init()
258 udma->name = udma_params->name; in al_udma_init()
260 udma->state = UDMA_DISABLE; in al_udma_init()
262 udma->udma_q[i].status = AL_QUEUE_NOT_INITIALIZED; in al_udma_init()
265 al_udma_set_defaults(udma); in al_udma_init()
266 al_dbg("udma [%s] initialized. base %p\n", udma->name, in al_udma_init()
267 udma->udma_regs); in al_udma_init()
272 * Initialize the udma queue data structure
274 int al_udma_q_init(struct al_udma *udma, uint32_t qid, in al_udma_q_init() argument
279 al_assert(udma); in al_udma_q_init()
282 if (qid >= udma->num_of_queues) { in al_udma_q_init()
283 al_err("udma: invalid queue id (%d)\n", qid); in al_udma_q_init()
287 if (udma->udma_q[qid].status == AL_QUEUE_ENABLED) { in al_udma_q_init()
288 al_err("udma: queue (%d) already enabled!\n", qid); in al_udma_q_init()
293 al_err("udma: queue (%d) size too small\n", qid); in al_udma_q_init()
298 al_err("udma: queue (%d) size too large\n", qid); in al_udma_q_init()
303 al_err("udma: queue (%d) size (%d) must be power of 2\n", in al_udma_q_init()
308 udma_q = &udma->udma_q[qid]; in al_udma_q_init()
310 if (udma->type == UDMA_TX) in al_udma_q_init()
312 &udma->udma_regs->m2s.m2s_q[qid]; in al_udma_q_init()
315 &udma->udma_regs->s2m.s2m_q[qid]; in al_udma_q_init()
341 udma_q->udma = udma; in al_udma_q_init()
352 al_dbg("udma [%s %d]: %s q init. size 0x%x\n" in al_udma_q_init()
354 udma_q->udma->name, udma_q->qid, in al_udma_q_init()
355 udma->type == UDMA_TX ? "Tx" : "Rx", in al_udma_q_init()
368 * Reset a udma queue
398 al_err("udma [%s %d]: %s timeout waiting for prefetch and " in al_udma_q_reset()
399 "scheduler disable\n", udma_q->udma->name, udma_q->qid, in al_udma_q_reset()
421 al_err("udma [%s %d]: %s timeout waiting for dcp==crhp\n", in al_udma_q_reset()
422 udma_q->udma->name, udma_q->qid, __func__); in al_udma_q_reset()
427 if (udma_q->udma->type == UDMA_TX) in al_udma_q_reset()
440 int al_udma_q_handle_get(struct al_udma *udma, uint32_t qid, in al_udma_q_handle_get() argument
444 al_assert(udma); in al_udma_q_handle_get()
447 if (unlikely(qid >= udma->num_of_queues)) { in al_udma_q_handle_get()
448 al_err("udma [%s]: invalid queue id (%d)\n", udma->name, qid); in al_udma_q_handle_get()
451 *q_handle = &udma->udma_q[qid]; in al_udma_q_handle_get()
456 * Change the UDMA's state
458 int al_udma_state_set(struct al_udma *udma, enum al_udma_state state) in al_udma_state_set() argument
462 al_assert(udma != NULL); in al_udma_state_set()
463 if (state == udma->state) in al_udma_state_set()
464 al_dbg("udma [%s]: requested state identical to " in al_udma_state_set()
465 "current state (%d)\n", udma->name, state); in al_udma_state_set()
467 al_dbg("udma [%s]: change state from (%s) to (%s)\n", in al_udma_state_set()
468 udma->name, al_udma_states_name[udma->state], in al_udma_state_set()
483 al_err("udma: invalid state (%d)\n", state); in al_udma_state_set()
487 if (udma->type == UDMA_TX) in al_udma_state_set()
488 al_reg_write32(&udma->udma_regs->m2s.m2s.change_state, reg); in al_udma_state_set()
490 al_reg_write32(&udma->udma_regs->s2m.s2m.change_state, reg); in al_udma_state_set()
492 udma->state = state; in al_udma_state_set()
497 * return the current UDMA hardware state
499 enum al_udma_state al_udma_state_get(struct al_udma *udma) in al_udma_state_get() argument
507 if (udma->type == UDMA_TX) in al_udma_state_get()
508 state_reg = al_reg_read32(&udma->udma_regs->m2s.m2s.state); in al_udma_state_get()
510 state_reg = al_reg_read32(&udma->udma_regs->s2m.s2m.state); in al_udma_state_get()
595 al_dbg("udma [%s %d]: packet completed. first desc %p (ixd 0x%x)" in al_udma_cdesc_packet_get()
596 " descs %d\n", udma_q->udma->name, udma_q->qid, *cdesc, in al_udma_cdesc_packet_get()
602 /** @} end of UDMA group */