18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci/* Copyright (C) 2005-2006 by Texas Instruments */ 38c2ecf20Sopenharmony_ci 48c2ecf20Sopenharmony_ci#ifndef _CPPI_DMA_H_ 58c2ecf20Sopenharmony_ci#define _CPPI_DMA_H_ 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#include <linux/slab.h> 88c2ecf20Sopenharmony_ci#include <linux/list.h> 98c2ecf20Sopenharmony_ci#include <linux/errno.h> 108c2ecf20Sopenharmony_ci#include <linux/dmapool.h> 118c2ecf20Sopenharmony_ci#include <linux/dmaengine.h> 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci#include "musb_core.h" 148c2ecf20Sopenharmony_ci#include "musb_dma.h" 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci/* CPPI RX/TX state RAM */ 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_cistruct cppi_tx_stateram { 198c2ecf20Sopenharmony_ci u32 tx_head; /* "DMA packet" head descriptor */ 208c2ecf20Sopenharmony_ci u32 tx_buf; 218c2ecf20Sopenharmony_ci u32 tx_current; /* current descriptor */ 228c2ecf20Sopenharmony_ci u32 tx_buf_current; 238c2ecf20Sopenharmony_ci u32 tx_info; /* flags, remaining buflen */ 248c2ecf20Sopenharmony_ci u32 tx_rem_len; 258c2ecf20Sopenharmony_ci u32 tx_dummy; /* unused */ 268c2ecf20Sopenharmony_ci u32 tx_complete; 278c2ecf20Sopenharmony_ci}; 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_cistruct cppi_rx_stateram { 308c2ecf20Sopenharmony_ci u32 rx_skipbytes; 318c2ecf20Sopenharmony_ci u32 rx_head; 328c2ecf20Sopenharmony_ci u32 rx_sop; /* "DMA packet" head descriptor */ 338c2ecf20Sopenharmony_ci u32 rx_current; /* current descriptor */ 348c2ecf20Sopenharmony_ci u32 rx_buf_current; 358c2ecf20Sopenharmony_ci u32 rx_len_len; 368c2ecf20Sopenharmony_ci u32 rx_cnt_cnt; 378c2ecf20Sopenharmony_ci u32 rx_complete; 388c2ecf20Sopenharmony_ci}; 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci/* hw_options bits in CPPI buffer descriptors */ 418c2ecf20Sopenharmony_ci#define CPPI_SOP_SET ((u32)(1 << 31)) 428c2ecf20Sopenharmony_ci#define CPPI_EOP_SET ((u32)(1 << 30)) 438c2ecf20Sopenharmony_ci#define CPPI_OWN_SET ((u32)(1 << 29)) /* owned by cppi */ 448c2ecf20Sopenharmony_ci#define CPPI_EOQ_MASK ((u32)(1 << 28)) 458c2ecf20Sopenharmony_ci#define CPPI_ZERO_SET ((u32)(1 << 23)) /* rx saw zlp; tx issues one */ 468c2ecf20Sopenharmony_ci#define CPPI_RXABT_MASK ((u32)(1 << 19)) /* need more rx buffers */ 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci#define CPPI_RECV_PKTLEN_MASK 0xFFFF 498c2ecf20Sopenharmony_ci#define CPPI_BUFFER_LEN_MASK 0xFFFF 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ci#define CPPI_TEAR_READY ((u32)(1 << 31)) 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ci/* CPPI data structure definitions */ 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci#define CPPI_DESCRIPTOR_ALIGN 16 /* bytes; 5-dec docs say 4-byte align */ 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_cistruct cppi_descriptor { 588c2ecf20Sopenharmony_ci /* hardware overlay */ 598c2ecf20Sopenharmony_ci u32 hw_next; /* next buffer descriptor Pointer */ 608c2ecf20Sopenharmony_ci u32 hw_bufp; /* i/o buffer pointer */ 618c2ecf20Sopenharmony_ci u32 hw_off_len; /* buffer_offset16, buffer_length16 */ 628c2ecf20Sopenharmony_ci u32 hw_options; /* flags: SOP, EOP etc*/ 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_ci struct cppi_descriptor *next; 658c2ecf20Sopenharmony_ci dma_addr_t dma; /* address of this descriptor */ 668c2ecf20Sopenharmony_ci u32 buflen; /* for RX: original buffer length */ 678c2ecf20Sopenharmony_ci} __attribute__ ((aligned(CPPI_DESCRIPTOR_ALIGN))); 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_cistruct cppi; 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_ci/* CPPI Channel Control structure */ 738c2ecf20Sopenharmony_cistruct cppi_channel { 748c2ecf20Sopenharmony_ci struct dma_channel channel; 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_ci /* back pointer to the DMA controller structure */ 778c2ecf20Sopenharmony_ci struct cppi *controller; 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_ci /* which direction of which endpoint? */ 808c2ecf20Sopenharmony_ci struct musb_hw_ep *hw_ep; 818c2ecf20Sopenharmony_ci bool transmit; 828c2ecf20Sopenharmony_ci u8 index; 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_ci /* DMA modes: RNDIS or "transparent" */ 858c2ecf20Sopenharmony_ci u8 is_rndis; 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_ci /* book keeping for current transfer request */ 888c2ecf20Sopenharmony_ci dma_addr_t buf_dma; 898c2ecf20Sopenharmony_ci u32 buf_len; 908c2ecf20Sopenharmony_ci u32 maxpacket; 918c2ecf20Sopenharmony_ci u32 offset; /* dma requested */ 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_ci void __iomem *state_ram; /* CPPI state */ 948c2ecf20Sopenharmony_ci 958c2ecf20Sopenharmony_ci struct cppi_descriptor *freelist; 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_ci /* BD management fields */ 988c2ecf20Sopenharmony_ci struct cppi_descriptor *head; 998c2ecf20Sopenharmony_ci struct cppi_descriptor *tail; 1008c2ecf20Sopenharmony_ci struct cppi_descriptor *last_processed; 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_ci /* use tx_complete in host role to track endpoints waiting for 1038c2ecf20Sopenharmony_ci * FIFONOTEMPTY to clear. 1048c2ecf20Sopenharmony_ci */ 1058c2ecf20Sopenharmony_ci struct list_head tx_complete; 1068c2ecf20Sopenharmony_ci}; 1078c2ecf20Sopenharmony_ci 1088c2ecf20Sopenharmony_ci/* CPPI DMA controller object */ 1098c2ecf20Sopenharmony_cistruct cppi { 1108c2ecf20Sopenharmony_ci struct dma_controller controller; 1118c2ecf20Sopenharmony_ci void __iomem *mregs; /* Mentor regs */ 1128c2ecf20Sopenharmony_ci void __iomem *tibase; /* TI/CPPI regs */ 1138c2ecf20Sopenharmony_ci 1148c2ecf20Sopenharmony_ci int irq; 1158c2ecf20Sopenharmony_ci 1168c2ecf20Sopenharmony_ci struct cppi_channel tx[4]; 1178c2ecf20Sopenharmony_ci struct cppi_channel rx[4]; 1188c2ecf20Sopenharmony_ci 1198c2ecf20Sopenharmony_ci struct dma_pool *pool; 1208c2ecf20Sopenharmony_ci 1218c2ecf20Sopenharmony_ci struct list_head tx_complete; 1228c2ecf20Sopenharmony_ci}; 1238c2ecf20Sopenharmony_ci 1248c2ecf20Sopenharmony_ci/* CPPI IRQ handler */ 1258c2ecf20Sopenharmony_ciextern irqreturn_t cppi_interrupt(int, void *); 1268c2ecf20Sopenharmony_ci 1278c2ecf20Sopenharmony_cistruct cppi41_dma_channel { 1288c2ecf20Sopenharmony_ci struct dma_channel channel; 1298c2ecf20Sopenharmony_ci struct cppi41_dma_controller *controller; 1308c2ecf20Sopenharmony_ci struct musb_hw_ep *hw_ep; 1318c2ecf20Sopenharmony_ci struct dma_chan *dc; 1328c2ecf20Sopenharmony_ci dma_cookie_t cookie; 1338c2ecf20Sopenharmony_ci u8 port_num; 1348c2ecf20Sopenharmony_ci u8 is_tx; 1358c2ecf20Sopenharmony_ci u8 is_allocated; 1368c2ecf20Sopenharmony_ci u8 usb_toggle; 1378c2ecf20Sopenharmony_ci 1388c2ecf20Sopenharmony_ci dma_addr_t buf_addr; 1398c2ecf20Sopenharmony_ci u32 total_len; 1408c2ecf20Sopenharmony_ci u32 prog_len; 1418c2ecf20Sopenharmony_ci u32 transferred; 1428c2ecf20Sopenharmony_ci u32 packet_sz; 1438c2ecf20Sopenharmony_ci struct list_head tx_check; 1448c2ecf20Sopenharmony_ci int tx_zlp; 1458c2ecf20Sopenharmony_ci}; 1468c2ecf20Sopenharmony_ci 1478c2ecf20Sopenharmony_ci#endif /* end of ifndef _CPPI_DMA_H_ */ 148