Lines Matching refs:dpmaif_ctrl
58 static void t7xx_dpmaif_enable_irq(struct dpmaif_ctrl *dpmaif_ctrl) in t7xx_dpmaif_enable_irq() argument
63 for (i = 0; i < ARRAY_SIZE(dpmaif_ctrl->isr_para); i++) { in t7xx_dpmaif_enable_irq()
64 isr_para = &dpmaif_ctrl->isr_para[i]; in t7xx_dpmaif_enable_irq()
65 t7xx_pcie_mac_set_int(dpmaif_ctrl->t7xx_dev, isr_para->pcie_int); in t7xx_dpmaif_enable_irq()
69 static void t7xx_dpmaif_disable_irq(struct dpmaif_ctrl *dpmaif_ctrl) in t7xx_dpmaif_disable_irq() argument
74 for (i = 0; i < ARRAY_SIZE(dpmaif_ctrl->isr_para); i++) { in t7xx_dpmaif_disable_irq()
75 isr_para = &dpmaif_ctrl->isr_para[i]; in t7xx_dpmaif_disable_irq()
76 t7xx_pcie_mac_clear_int(dpmaif_ctrl->t7xx_dev, isr_para->pcie_int); in t7xx_dpmaif_disable_irq()
82 struct dpmaif_ctrl *dpmaif_ctrl = isr_para->dpmaif_ctrl; in t7xx_dpmaif_irq_cb() local
84 struct device *dev = dpmaif_ctrl->dev; in t7xx_dpmaif_irq_cb()
89 hw_info = &dpmaif_ctrl->hw_info; in t7xx_dpmaif_irq_cb()
96 t7xx_pcie_mac_clear_int_status(dpmaif_ctrl->t7xx_dev, isr_para->pcie_int); in t7xx_dpmaif_irq_cb()
101 t7xx_dpmaif_irq_tx_done(dpmaif_ctrl, intr_status.intr_queues[i]); in t7xx_dpmaif_irq_cb()
133 t7xx_dpmaif_irq_rx_done(dpmaif_ctrl, intr_status.intr_queues[i]); in t7xx_dpmaif_irq_cb()
146 struct dpmaif_ctrl *dpmaif_ctrl; in t7xx_dpmaif_isr_handler() local
148 dpmaif_ctrl = isr_para->dpmaif_ctrl; in t7xx_dpmaif_isr_handler()
149 if (dpmaif_ctrl->state != DPMAIF_STATE_PWRON) { in t7xx_dpmaif_isr_handler()
150 dev_err(dpmaif_ctrl->dev, "Interrupt received before initializing DPMAIF\n"); in t7xx_dpmaif_isr_handler()
154 t7xx_pcie_mac_clear_int(dpmaif_ctrl->t7xx_dev, isr_para->pcie_int); in t7xx_dpmaif_isr_handler()
156 t7xx_pcie_mac_set_int(dpmaif_ctrl->t7xx_dev, isr_para->pcie_int); in t7xx_dpmaif_isr_handler()
160 static void t7xx_dpmaif_isr_parameter_init(struct dpmaif_ctrl *dpmaif_ctrl) in t7xx_dpmaif_isr_parameter_init() argument
165 dpmaif_ctrl->rxq_int_mapping[DPF_RX_QNO0] = DPMAIF_INT; in t7xx_dpmaif_isr_parameter_init()
166 dpmaif_ctrl->rxq_int_mapping[DPF_RX_QNO1] = DPMAIF2_INT; in t7xx_dpmaif_isr_parameter_init()
169 isr_para = &dpmaif_ctrl->isr_para[i]; in t7xx_dpmaif_isr_parameter_init()
170 isr_para->dpmaif_ctrl = dpmaif_ctrl; in t7xx_dpmaif_isr_parameter_init()
172 isr_para->pcie_int = dpmaif_ctrl->rxq_int_mapping[i]; in t7xx_dpmaif_isr_parameter_init()
176 static void t7xx_dpmaif_register_pcie_irq(struct dpmaif_ctrl *dpmaif_ctrl) in t7xx_dpmaif_register_pcie_irq() argument
178 struct t7xx_pci_dev *t7xx_dev = dpmaif_ctrl->t7xx_dev; in t7xx_dpmaif_register_pcie_irq()
183 t7xx_dpmaif_isr_parameter_init(dpmaif_ctrl); in t7xx_dpmaif_register_pcie_irq()
186 isr_para = &dpmaif_ctrl->isr_para[i]; in t7xx_dpmaif_register_pcie_irq()
199 static int t7xx_dpmaif_rxtx_sw_allocs(struct dpmaif_ctrl *dpmaif_ctrl) in t7xx_dpmaif_rxtx_sw_allocs() argument
205 ret = t7xx_dpmaif_bat_alloc(dpmaif_ctrl, &dpmaif_ctrl->bat_req, BAT_TYPE_NORMAL); in t7xx_dpmaif_rxtx_sw_allocs()
207 dev_err(dpmaif_ctrl->dev, "Failed to allocate normal BAT table: %d\n", ret); in t7xx_dpmaif_rxtx_sw_allocs()
211 ret = t7xx_dpmaif_bat_alloc(dpmaif_ctrl, &dpmaif_ctrl->bat_frag, BAT_TYPE_FRAG); in t7xx_dpmaif_rxtx_sw_allocs()
213 dev_err(dpmaif_ctrl->dev, "Failed to allocate frag BAT table: %d\n", ret); in t7xx_dpmaif_rxtx_sw_allocs()
218 rx_q = &dpmaif_ctrl->rxq[rx_idx]; in t7xx_dpmaif_rxtx_sw_allocs()
220 rx_q->dpmaif_ctrl = dpmaif_ctrl; in t7xx_dpmaif_rxtx_sw_allocs()
227 tx_q = &dpmaif_ctrl->txq[tx_idx]; in t7xx_dpmaif_rxtx_sw_allocs()
229 tx_q->dpmaif_ctrl = dpmaif_ctrl; in t7xx_dpmaif_rxtx_sw_allocs()
235 ret = t7xx_dpmaif_tx_thread_init(dpmaif_ctrl); in t7xx_dpmaif_rxtx_sw_allocs()
237 dev_err(dpmaif_ctrl->dev, "Failed to start TX thread\n"); in t7xx_dpmaif_rxtx_sw_allocs()
241 ret = t7xx_dpmaif_bat_rel_wq_alloc(dpmaif_ctrl); in t7xx_dpmaif_rxtx_sw_allocs()
248 t7xx_dpmaif_tx_thread_rel(dpmaif_ctrl); in t7xx_dpmaif_rxtx_sw_allocs()
252 tx_q = &dpmaif_ctrl->txq[i]; in t7xx_dpmaif_rxtx_sw_allocs()
258 rx_q = &dpmaif_ctrl->rxq[i]; in t7xx_dpmaif_rxtx_sw_allocs()
262 t7xx_dpmaif_bat_free(dpmaif_ctrl, &dpmaif_ctrl->bat_frag); in t7xx_dpmaif_rxtx_sw_allocs()
265 t7xx_dpmaif_bat_free(dpmaif_ctrl, &dpmaif_ctrl->bat_req); in t7xx_dpmaif_rxtx_sw_allocs()
270 static void t7xx_dpmaif_sw_release(struct dpmaif_ctrl *dpmaif_ctrl) in t7xx_dpmaif_sw_release() argument
276 t7xx_dpmaif_tx_thread_rel(dpmaif_ctrl); in t7xx_dpmaif_sw_release()
277 t7xx_dpmaif_bat_wq_rel(dpmaif_ctrl); in t7xx_dpmaif_sw_release()
280 tx_q = &dpmaif_ctrl->txq[i]; in t7xx_dpmaif_sw_release()
285 rx_q = &dpmaif_ctrl->rxq[i]; in t7xx_dpmaif_sw_release()
290 static int t7xx_dpmaif_start(struct dpmaif_ctrl *dpmaif_ctrl) in t7xx_dpmaif_start() argument
292 struct dpmaif_hw_info *hw_info = &dpmaif_ctrl->hw_info; in t7xx_dpmaif_start()
299 if (dpmaif_ctrl->state == DPMAIF_STATE_PWRON) in t7xx_dpmaif_start()
305 rxq = &dpmaif_ctrl->rxq[i]; in t7xx_dpmaif_start()
318 bitmap_zero(dpmaif_ctrl->bat_req.bat_bitmap, dpmaif_ctrl->bat_req.bat_size_cnt); in t7xx_dpmaif_start()
319 buf_cnt = dpmaif_ctrl->bat_req.bat_size_cnt - 1; in t7xx_dpmaif_start()
320 ret = t7xx_dpmaif_rx_buf_alloc(dpmaif_ctrl, &dpmaif_ctrl->bat_req, 0, buf_cnt, true); in t7xx_dpmaif_start()
322 dev_err(dpmaif_ctrl->dev, "Failed to allocate RX buffer: %d\n", ret); in t7xx_dpmaif_start()
326 buf_cnt = dpmaif_ctrl->bat_frag.bat_size_cnt - 1; in t7xx_dpmaif_start()
327 ret = t7xx_dpmaif_rx_frag_alloc(dpmaif_ctrl, &dpmaif_ctrl->bat_frag, buf_cnt, true); in t7xx_dpmaif_start()
329 dev_err(dpmaif_ctrl->dev, "Failed to allocate frag RX buffer: %d\n", ret); in t7xx_dpmaif_start()
334 txq = &dpmaif_ctrl->txq[i]; in t7xx_dpmaif_start()
343 dev_err(dpmaif_ctrl->dev, "Failed to initialize DPMAIF HW: %d\n", ret); in t7xx_dpmaif_start()
357 dpmaif_ctrl->state = DPMAIF_STATE_PWRON; in t7xx_dpmaif_start()
358 t7xx_dpmaif_enable_irq(dpmaif_ctrl); in t7xx_dpmaif_start()
359 wake_up(&dpmaif_ctrl->tx_wq); in t7xx_dpmaif_start()
363 t7xx_dpmaif_bat_free(rxq->dpmaif_ctrl, rxq->bat_frag); in t7xx_dpmaif_start()
366 t7xx_dpmaif_bat_free(rxq->dpmaif_ctrl, rxq->bat_req); in t7xx_dpmaif_start()
371 static void t7xx_dpmaif_stop_sw(struct dpmaif_ctrl *dpmaif_ctrl) in t7xx_dpmaif_stop_sw() argument
373 t7xx_dpmaif_tx_stop(dpmaif_ctrl); in t7xx_dpmaif_stop_sw()
374 t7xx_dpmaif_rx_stop(dpmaif_ctrl); in t7xx_dpmaif_stop_sw()
377 static void t7xx_dpmaif_stop_hw(struct dpmaif_ctrl *dpmaif_ctrl) in t7xx_dpmaif_stop_hw() argument
379 t7xx_dpmaif_hw_stop_all_txq(&dpmaif_ctrl->hw_info); in t7xx_dpmaif_stop_hw()
380 t7xx_dpmaif_hw_stop_all_rxq(&dpmaif_ctrl->hw_info); in t7xx_dpmaif_stop_hw()
383 static int t7xx_dpmaif_stop(struct dpmaif_ctrl *dpmaif_ctrl) in t7xx_dpmaif_stop() argument
385 if (!dpmaif_ctrl->dpmaif_sw_init_done) { in t7xx_dpmaif_stop()
386 dev_err(dpmaif_ctrl->dev, "dpmaif SW init fail\n"); in t7xx_dpmaif_stop()
390 if (dpmaif_ctrl->state == DPMAIF_STATE_PWROFF) in t7xx_dpmaif_stop()
393 t7xx_dpmaif_disable_irq(dpmaif_ctrl); in t7xx_dpmaif_stop()
394 dpmaif_ctrl->state = DPMAIF_STATE_PWROFF; in t7xx_dpmaif_stop()
395 t7xx_dpmaif_stop_sw(dpmaif_ctrl); in t7xx_dpmaif_stop()
396 t7xx_dpmaif_tx_clear(dpmaif_ctrl); in t7xx_dpmaif_stop()
397 t7xx_dpmaif_rx_clear(dpmaif_ctrl); in t7xx_dpmaif_stop()
403 struct dpmaif_ctrl *dpmaif_ctrl = param; in t7xx_dpmaif_suspend() local
405 t7xx_dpmaif_tx_stop(dpmaif_ctrl); in t7xx_dpmaif_suspend()
406 t7xx_dpmaif_hw_stop_all_txq(&dpmaif_ctrl->hw_info); in t7xx_dpmaif_suspend()
407 t7xx_dpmaif_hw_stop_all_rxq(&dpmaif_ctrl->hw_info); in t7xx_dpmaif_suspend()
408 t7xx_dpmaif_disable_irq(dpmaif_ctrl); in t7xx_dpmaif_suspend()
409 t7xx_dpmaif_rx_stop(dpmaif_ctrl); in t7xx_dpmaif_suspend()
413 static void t7xx_dpmaif_unmask_dlq_intr(struct dpmaif_ctrl *dpmaif_ctrl) in t7xx_dpmaif_unmask_dlq_intr() argument
418 t7xx_dpmaif_dlq_unmask_rx_done(&dpmaif_ctrl->hw_info, qno); in t7xx_dpmaif_unmask_dlq_intr()
421 static void t7xx_dpmaif_start_txrx_qs(struct dpmaif_ctrl *dpmaif_ctrl) in t7xx_dpmaif_start_txrx_qs() argument
428 txq = &dpmaif_ctrl->txq[que_cnt]; in t7xx_dpmaif_start_txrx_qs()
433 rxq = &dpmaif_ctrl->rxq[que_cnt]; in t7xx_dpmaif_start_txrx_qs()
440 struct dpmaif_ctrl *dpmaif_ctrl = param; in t7xx_dpmaif_resume() local
442 if (!dpmaif_ctrl) in t7xx_dpmaif_resume()
445 t7xx_dpmaif_start_txrx_qs(dpmaif_ctrl); in t7xx_dpmaif_resume()
446 t7xx_dpmaif_enable_irq(dpmaif_ctrl); in t7xx_dpmaif_resume()
447 t7xx_dpmaif_unmask_dlq_intr(dpmaif_ctrl); in t7xx_dpmaif_resume()
448 t7xx_dpmaif_start_hw(&dpmaif_ctrl->hw_info); in t7xx_dpmaif_resume()
449 wake_up(&dpmaif_ctrl->tx_wq); in t7xx_dpmaif_resume()
453 static int t7xx_dpmaif_pm_entity_init(struct dpmaif_ctrl *dpmaif_ctrl) in t7xx_dpmaif_pm_entity_init() argument
455 struct md_pm_entity *dpmaif_pm_entity = &dpmaif_ctrl->dpmaif_pm_entity; in t7xx_dpmaif_pm_entity_init()
464 dpmaif_pm_entity->entity_param = dpmaif_ctrl; in t7xx_dpmaif_pm_entity_init()
466 ret = t7xx_pci_pm_entity_register(dpmaif_ctrl->t7xx_dev, dpmaif_pm_entity); in t7xx_dpmaif_pm_entity_init()
468 dev_err(dpmaif_ctrl->dev, "dpmaif register pm_entity fail\n"); in t7xx_dpmaif_pm_entity_init()
473 static int t7xx_dpmaif_pm_entity_release(struct dpmaif_ctrl *dpmaif_ctrl) in t7xx_dpmaif_pm_entity_release() argument
475 struct md_pm_entity *dpmaif_pm_entity = &dpmaif_ctrl->dpmaif_pm_entity; in t7xx_dpmaif_pm_entity_release()
478 ret = t7xx_pci_pm_entity_unregister(dpmaif_ctrl->t7xx_dev, dpmaif_pm_entity); in t7xx_dpmaif_pm_entity_release()
480 dev_err(dpmaif_ctrl->dev, "dpmaif register pm_entity fail\n"); in t7xx_dpmaif_pm_entity_release()
485 int t7xx_dpmaif_md_state_callback(struct dpmaif_ctrl *dpmaif_ctrl, enum md_state state) in t7xx_dpmaif_md_state_callback() argument
491 ret = t7xx_dpmaif_start(dpmaif_ctrl); in t7xx_dpmaif_md_state_callback()
495 ret = t7xx_dpmaif_stop(dpmaif_ctrl); in t7xx_dpmaif_md_state_callback()
499 ret = t7xx_dpmaif_stop(dpmaif_ctrl); in t7xx_dpmaif_md_state_callback()
503 t7xx_dpmaif_stop_hw(dpmaif_ctrl); in t7xx_dpmaif_md_state_callback()
526 struct dpmaif_ctrl *t7xx_dpmaif_hif_init(struct t7xx_pci_dev *t7xx_dev, in t7xx_dpmaif_hif_init()
530 struct dpmaif_ctrl *dpmaif_ctrl; in t7xx_dpmaif_hif_init() local
536 dpmaif_ctrl = devm_kzalloc(dev, sizeof(*dpmaif_ctrl), GFP_KERNEL); in t7xx_dpmaif_hif_init()
537 if (!dpmaif_ctrl) in t7xx_dpmaif_hif_init()
540 dpmaif_ctrl->t7xx_dev = t7xx_dev; in t7xx_dpmaif_hif_init()
541 dpmaif_ctrl->callbacks = callbacks; in t7xx_dpmaif_hif_init()
542 dpmaif_ctrl->dev = dev; in t7xx_dpmaif_hif_init()
543 dpmaif_ctrl->dpmaif_sw_init_done = false; in t7xx_dpmaif_hif_init()
544 dpmaif_ctrl->hw_info.dev = dev; in t7xx_dpmaif_hif_init()
545 dpmaif_ctrl->hw_info.pcie_base = t7xx_dev->base_addr.pcie_ext_reg_base - in t7xx_dpmaif_hif_init()
548 ret = t7xx_dpmaif_pm_entity_init(dpmaif_ctrl); in t7xx_dpmaif_hif_init()
552 t7xx_dpmaif_register_pcie_irq(dpmaif_ctrl); in t7xx_dpmaif_hif_init()
553 t7xx_dpmaif_disable_irq(dpmaif_ctrl); in t7xx_dpmaif_hif_init()
555 ret = t7xx_dpmaif_rxtx_sw_allocs(dpmaif_ctrl); in t7xx_dpmaif_hif_init()
557 t7xx_dpmaif_pm_entity_release(dpmaif_ctrl); in t7xx_dpmaif_hif_init()
562 dpmaif_ctrl->dpmaif_sw_init_done = true; in t7xx_dpmaif_hif_init()
563 return dpmaif_ctrl; in t7xx_dpmaif_hif_init()
566 void t7xx_dpmaif_hif_exit(struct dpmaif_ctrl *dpmaif_ctrl) in t7xx_dpmaif_hif_exit() argument
568 if (dpmaif_ctrl->dpmaif_sw_init_done) { in t7xx_dpmaif_hif_exit()
569 t7xx_dpmaif_stop(dpmaif_ctrl); in t7xx_dpmaif_hif_exit()
570 t7xx_dpmaif_pm_entity_release(dpmaif_ctrl); in t7xx_dpmaif_hif_exit()
571 t7xx_dpmaif_sw_release(dpmaif_ctrl); in t7xx_dpmaif_hif_exit()
572 dpmaif_ctrl->dpmaif_sw_init_done = false; in t7xx_dpmaif_hif_exit()