162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* Copyright (C) 2005-2006 by Texas Instruments */ 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci#ifndef _CPPI_DMA_H_ 562306a36Sopenharmony_ci#define _CPPI_DMA_H_ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include <linux/slab.h> 862306a36Sopenharmony_ci#include <linux/list.h> 962306a36Sopenharmony_ci#include <linux/errno.h> 1062306a36Sopenharmony_ci#include <linux/dmapool.h> 1162306a36Sopenharmony_ci#include <linux/dmaengine.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include "musb_core.h" 1462306a36Sopenharmony_ci#include "musb_dma.h" 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci/* CPPI RX/TX state RAM */ 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_cistruct cppi_tx_stateram { 1962306a36Sopenharmony_ci u32 tx_head; /* "DMA packet" head descriptor */ 2062306a36Sopenharmony_ci u32 tx_buf; 2162306a36Sopenharmony_ci u32 tx_current; /* current descriptor */ 2262306a36Sopenharmony_ci u32 tx_buf_current; 2362306a36Sopenharmony_ci u32 tx_info; /* flags, remaining buflen */ 2462306a36Sopenharmony_ci u32 tx_rem_len; 2562306a36Sopenharmony_ci u32 tx_dummy; /* unused */ 2662306a36Sopenharmony_ci u32 tx_complete; 2762306a36Sopenharmony_ci}; 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_cistruct cppi_rx_stateram { 3062306a36Sopenharmony_ci u32 rx_skipbytes; 3162306a36Sopenharmony_ci u32 rx_head; 3262306a36Sopenharmony_ci u32 rx_sop; /* "DMA packet" head descriptor */ 3362306a36Sopenharmony_ci u32 rx_current; /* current descriptor */ 3462306a36Sopenharmony_ci u32 rx_buf_current; 3562306a36Sopenharmony_ci u32 rx_len_len; 3662306a36Sopenharmony_ci u32 rx_cnt_cnt; 3762306a36Sopenharmony_ci u32 rx_complete; 3862306a36Sopenharmony_ci}; 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci/* hw_options bits in CPPI buffer descriptors */ 4162306a36Sopenharmony_ci#define CPPI_SOP_SET ((u32)(1 << 31)) 4262306a36Sopenharmony_ci#define CPPI_EOP_SET ((u32)(1 << 30)) 4362306a36Sopenharmony_ci#define CPPI_OWN_SET ((u32)(1 << 29)) /* owned by cppi */ 4462306a36Sopenharmony_ci#define CPPI_EOQ_MASK ((u32)(1 << 28)) 4562306a36Sopenharmony_ci#define CPPI_ZERO_SET ((u32)(1 << 23)) /* rx saw zlp; tx issues one */ 4662306a36Sopenharmony_ci#define CPPI_RXABT_MASK ((u32)(1 << 19)) /* need more rx buffers */ 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci#define CPPI_RECV_PKTLEN_MASK 0xFFFF 4962306a36Sopenharmony_ci#define CPPI_BUFFER_LEN_MASK 0xFFFF 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci#define CPPI_TEAR_READY ((u32)(1 << 31)) 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci/* CPPI data structure definitions */ 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci#define CPPI_DESCRIPTOR_ALIGN 16 /* bytes; 5-dec docs say 4-byte align */ 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_cistruct cppi_descriptor { 5862306a36Sopenharmony_ci /* hardware overlay */ 5962306a36Sopenharmony_ci u32 hw_next; /* next buffer descriptor Pointer */ 6062306a36Sopenharmony_ci u32 hw_bufp; /* i/o buffer pointer */ 6162306a36Sopenharmony_ci u32 hw_off_len; /* buffer_offset16, buffer_length16 */ 6262306a36Sopenharmony_ci u32 hw_options; /* flags: SOP, EOP etc*/ 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci struct cppi_descriptor *next; 6562306a36Sopenharmony_ci dma_addr_t dma; /* address of this descriptor */ 6662306a36Sopenharmony_ci u32 buflen; /* for RX: original buffer length */ 6762306a36Sopenharmony_ci} __attribute__ ((aligned(CPPI_DESCRIPTOR_ALIGN))); 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_cistruct cppi; 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci/* CPPI Channel Control structure */ 7362306a36Sopenharmony_cistruct cppi_channel { 7462306a36Sopenharmony_ci struct dma_channel channel; 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci /* back pointer to the DMA controller structure */ 7762306a36Sopenharmony_ci struct cppi *controller; 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci /* which direction of which endpoint? */ 8062306a36Sopenharmony_ci struct musb_hw_ep *hw_ep; 8162306a36Sopenharmony_ci bool transmit; 8262306a36Sopenharmony_ci u8 index; 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci /* DMA modes: RNDIS or "transparent" */ 8562306a36Sopenharmony_ci u8 is_rndis; 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci /* book keeping for current transfer request */ 8862306a36Sopenharmony_ci dma_addr_t buf_dma; 8962306a36Sopenharmony_ci u32 buf_len; 9062306a36Sopenharmony_ci u32 maxpacket; 9162306a36Sopenharmony_ci u32 offset; /* dma requested */ 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci void __iomem *state_ram; /* CPPI state */ 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci struct cppi_descriptor *freelist; 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci /* BD management fields */ 9862306a36Sopenharmony_ci struct cppi_descriptor *head; 9962306a36Sopenharmony_ci struct cppi_descriptor *tail; 10062306a36Sopenharmony_ci struct cppi_descriptor *last_processed; 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci /* use tx_complete in host role to track endpoints waiting for 10362306a36Sopenharmony_ci * FIFONOTEMPTY to clear. 10462306a36Sopenharmony_ci */ 10562306a36Sopenharmony_ci struct list_head tx_complete; 10662306a36Sopenharmony_ci}; 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci/* CPPI DMA controller object */ 10962306a36Sopenharmony_cistruct cppi { 11062306a36Sopenharmony_ci struct dma_controller controller; 11162306a36Sopenharmony_ci void __iomem *mregs; /* Mentor regs */ 11262306a36Sopenharmony_ci void __iomem *tibase; /* TI/CPPI regs */ 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci int irq; 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ci struct cppi_channel tx[4]; 11762306a36Sopenharmony_ci struct cppi_channel rx[4]; 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci struct dma_pool *pool; 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ci struct list_head tx_complete; 12262306a36Sopenharmony_ci}; 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_cistruct cppi41_dma_channel { 12562306a36Sopenharmony_ci struct dma_channel channel; 12662306a36Sopenharmony_ci struct cppi41_dma_controller *controller; 12762306a36Sopenharmony_ci struct musb_hw_ep *hw_ep; 12862306a36Sopenharmony_ci struct dma_chan *dc; 12962306a36Sopenharmony_ci dma_cookie_t cookie; 13062306a36Sopenharmony_ci u8 port_num; 13162306a36Sopenharmony_ci u8 is_tx; 13262306a36Sopenharmony_ci u8 is_allocated; 13362306a36Sopenharmony_ci u8 usb_toggle; 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci dma_addr_t buf_addr; 13662306a36Sopenharmony_ci u32 total_len; 13762306a36Sopenharmony_ci u32 prog_len; 13862306a36Sopenharmony_ci u32 transferred; 13962306a36Sopenharmony_ci u32 packet_sz; 14062306a36Sopenharmony_ci struct list_head tx_check; 14162306a36Sopenharmony_ci int tx_zlp; 14262306a36Sopenharmony_ci}; 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci#endif /* end of ifndef _CPPI_DMA_H_ */ 145