1ef454717SKhoronzhuk, Ivan /* 2ef454717SKhoronzhuk, Ivan * Multicore Navigator definitions 3ef454717SKhoronzhuk, Ivan * 4ef454717SKhoronzhuk, Ivan * (C) Copyright 2012-2014 5ef454717SKhoronzhuk, Ivan * Texas Instruments Incorporated, <www.ti.com> 6ef454717SKhoronzhuk, Ivan * 7ef454717SKhoronzhuk, Ivan * SPDX-License-Identifier: GPL-2.0+ 8ef454717SKhoronzhuk, Ivan */ 9ef454717SKhoronzhuk, Ivan 10ef454717SKhoronzhuk, Ivan #ifndef _KEYSTONE_NAV_H_ 11ef454717SKhoronzhuk, Ivan #define _KEYSTONE_NAV_H_ 12ef454717SKhoronzhuk, Ivan 13ef454717SKhoronzhuk, Ivan #include <asm/arch/hardware.h> 14ef454717SKhoronzhuk, Ivan #include <asm/io.h> 15ef454717SKhoronzhuk, Ivan 16ef454717SKhoronzhuk, Ivan #define QM_OK 0 17ef454717SKhoronzhuk, Ivan #define QM_ERR -1 18ef454717SKhoronzhuk, Ivan #define QM_DESC_TYPE_HOST 0 19ef454717SKhoronzhuk, Ivan #define QM_DESC_PSINFO_IN_DESCR 0 20ef454717SKhoronzhuk, Ivan #define QM_DESC_DEFAULT_DESCINFO (QM_DESC_TYPE_HOST << 30) | \ 21ef454717SKhoronzhuk, Ivan (QM_DESC_PSINFO_IN_DESCR << 22) 22ef454717SKhoronzhuk, Ivan 23ef454717SKhoronzhuk, Ivan /* Packet Info */ 24ef454717SKhoronzhuk, Ivan #define QM_DESC_PINFO_EPIB 1 25ef454717SKhoronzhuk, Ivan #define QM_DESC_PINFO_RETURN_OWN 1 26ef454717SKhoronzhuk, Ivan #define QM_DESC_DEFAULT_PINFO (QM_DESC_PINFO_EPIB << 31) | \ 27ef454717SKhoronzhuk, Ivan (QM_DESC_PINFO_RETURN_OWN << 15) 28ef454717SKhoronzhuk, Ivan 29ef454717SKhoronzhuk, Ivan struct qm_cfg_reg { 30ef454717SKhoronzhuk, Ivan u32 revision; 31ef454717SKhoronzhuk, Ivan u32 __pad1; 32ef454717SKhoronzhuk, Ivan u32 divert; 33ef454717SKhoronzhuk, Ivan u32 link_ram_base0; 34ef454717SKhoronzhuk, Ivan u32 link_ram_size0; 35ef454717SKhoronzhuk, Ivan u32 link_ram_base1; 36ef454717SKhoronzhuk, Ivan u32 link_ram_size1; 37ef454717SKhoronzhuk, Ivan u32 link_ram_base2; 38ef454717SKhoronzhuk, Ivan u32 starvation[0]; 39ef454717SKhoronzhuk, Ivan }; 40ef454717SKhoronzhuk, Ivan 41ef454717SKhoronzhuk, Ivan struct descr_mem_setup_reg { 42ef454717SKhoronzhuk, Ivan u32 base_addr; 43ef454717SKhoronzhuk, Ivan u32 start_idx; 44ef454717SKhoronzhuk, Ivan u32 desc_reg_size; 45ef454717SKhoronzhuk, Ivan u32 _res0; 46ef454717SKhoronzhuk, Ivan }; 47ef454717SKhoronzhuk, Ivan 48ef454717SKhoronzhuk, Ivan struct qm_reg_queue { 49ef454717SKhoronzhuk, Ivan u32 entry_count; 50ef454717SKhoronzhuk, Ivan u32 byte_count; 51ef454717SKhoronzhuk, Ivan u32 packet_size; 52ef454717SKhoronzhuk, Ivan u32 ptr_size_thresh; 53ef454717SKhoronzhuk, Ivan }; 54ef454717SKhoronzhuk, Ivan 55ef454717SKhoronzhuk, Ivan struct qm_config { 56ef454717SKhoronzhuk, Ivan /* QM module addresses */ 57ef454717SKhoronzhuk, Ivan u32 stat_cfg; /* status and config */ 58ef454717SKhoronzhuk, Ivan struct qm_reg_queue *queue; /* management region */ 59ef454717SKhoronzhuk, Ivan u32 mngr_vbusm; /* management region (VBUSM) */ 60ef454717SKhoronzhuk, Ivan u32 i_lram; /* internal linking RAM */ 61ef454717SKhoronzhuk, Ivan struct qm_reg_queue *proxy; 62ef454717SKhoronzhuk, Ivan u32 status_ram; 63ef454717SKhoronzhuk, Ivan struct qm_cfg_reg *mngr_cfg; 64ef454717SKhoronzhuk, Ivan /* Queue manager config region */ 65ef454717SKhoronzhuk, Ivan u32 intd_cfg; /* QMSS INTD config region */ 66ef454717SKhoronzhuk, Ivan struct descr_mem_setup_reg *desc_mem; 67ef454717SKhoronzhuk, Ivan /* descritor memory setup region*/ 68ef454717SKhoronzhuk, Ivan u32 region_num; 69ef454717SKhoronzhuk, Ivan u32 pdsp_cmd; /* PDSP1 command interface */ 70ef454717SKhoronzhuk, Ivan u32 pdsp_ctl; /* PDSP1 control registers */ 71ef454717SKhoronzhuk, Ivan u32 pdsp_iram; 72ef454717SKhoronzhuk, Ivan /* QM configuration parameters */ 73ef454717SKhoronzhuk, Ivan 74ef454717SKhoronzhuk, Ivan u32 qpool_num; /* */ 75ef454717SKhoronzhuk, Ivan }; 76ef454717SKhoronzhuk, Ivan 77ef454717SKhoronzhuk, Ivan struct qm_host_desc { 78ef454717SKhoronzhuk, Ivan u32 desc_info; 79ef454717SKhoronzhuk, Ivan u32 tag_info; 80ef454717SKhoronzhuk, Ivan u32 packet_info; 81ef454717SKhoronzhuk, Ivan u32 buff_len; 82ef454717SKhoronzhuk, Ivan u32 buff_ptr; 83ef454717SKhoronzhuk, Ivan u32 next_bdptr; 84ef454717SKhoronzhuk, Ivan u32 orig_buff_len; 85ef454717SKhoronzhuk, Ivan u32 orig_buff_ptr; 86ef454717SKhoronzhuk, Ivan u32 timestamp; 87ef454717SKhoronzhuk, Ivan u32 swinfo[3]; 88ef454717SKhoronzhuk, Ivan u32 ps_data[20]; 89ef454717SKhoronzhuk, Ivan }; 90ef454717SKhoronzhuk, Ivan 91ef454717SKhoronzhuk, Ivan #define HDESC_NUM 256 92ef454717SKhoronzhuk, Ivan 93ef454717SKhoronzhuk, Ivan int qm_init(void); 94ef454717SKhoronzhuk, Ivan void qm_close(void); 95ef454717SKhoronzhuk, Ivan void qm_push(struct qm_host_desc *hd, u32 qnum); 96ef454717SKhoronzhuk, Ivan struct qm_host_desc *qm_pop(u32 qnum); 97ef454717SKhoronzhuk, Ivan 98ef454717SKhoronzhuk, Ivan void qm_buff_push(struct qm_host_desc *hd, u32 qnum, 99ef454717SKhoronzhuk, Ivan void *buff_ptr, u32 buff_len); 100ef454717SKhoronzhuk, Ivan 101ef454717SKhoronzhuk, Ivan struct qm_host_desc *qm_pop_from_free_pool(void); 102ef454717SKhoronzhuk, Ivan void queue_close(u32 qnum); 103ef454717SKhoronzhuk, Ivan 104ef454717SKhoronzhuk, Ivan /* 105ef454717SKhoronzhuk, Ivan * DMA API 106ef454717SKhoronzhuk, Ivan */ 107ef454717SKhoronzhuk, Ivan #define CPDMA_REG_VAL_MAKE_RX_FLOW_A(einfo, psinfo, rxerr, desc, \ 108ef454717SKhoronzhuk, Ivan psloc, sopoff, qmgr, qnum) \ 109ef454717SKhoronzhuk, Ivan (((einfo & 1) << 30) | \ 110ef454717SKhoronzhuk, Ivan ((psinfo & 1) << 29) | \ 111ef454717SKhoronzhuk, Ivan ((rxerr & 1) << 28) | \ 112ef454717SKhoronzhuk, Ivan ((desc & 3) << 26) | \ 113ef454717SKhoronzhuk, Ivan ((psloc & 1) << 25) | \ 114ef454717SKhoronzhuk, Ivan ((sopoff & 0x1ff) << 16) | \ 115ef454717SKhoronzhuk, Ivan ((qmgr & 3) << 12) | \ 116ef454717SKhoronzhuk, Ivan ((qnum & 0xfff) << 0)) 117ef454717SKhoronzhuk, Ivan 118ef454717SKhoronzhuk, Ivan #define CPDMA_REG_VAL_MAKE_RX_FLOW_D(fd0qm, fd0qnum, fd1qm, fd1qnum) \ 119ef454717SKhoronzhuk, Ivan (((fd0qm & 3) << 28) | \ 120ef454717SKhoronzhuk, Ivan ((fd0qnum & 0xfff) << 16) | \ 121ef454717SKhoronzhuk, Ivan ((fd1qm & 3) << 12) | \ 122ef454717SKhoronzhuk, Ivan ((fd1qnum & 0xfff) << 0)) 123ef454717SKhoronzhuk, Ivan 124ef454717SKhoronzhuk, Ivan #define CPDMA_CHAN_A_ENABLE ((u32)1 << 31) 125ef454717SKhoronzhuk, Ivan #define CPDMA_CHAN_A_TDOWN (1 << 30) 126ef454717SKhoronzhuk, Ivan #define TDOWN_TIMEOUT_COUNT 100 127ef454717SKhoronzhuk, Ivan 128ef454717SKhoronzhuk, Ivan struct global_ctl_regs { 129ef454717SKhoronzhuk, Ivan u32 revision; 130ef454717SKhoronzhuk, Ivan u32 perf_control; 131ef454717SKhoronzhuk, Ivan u32 emulation_control; 132ef454717SKhoronzhuk, Ivan u32 priority_control; 133ef454717SKhoronzhuk, Ivan u32 qm_base_addr[4]; 134ef454717SKhoronzhuk, Ivan }; 135ef454717SKhoronzhuk, Ivan 136ef454717SKhoronzhuk, Ivan struct tx_chan_regs { 137ef454717SKhoronzhuk, Ivan u32 cfg_a; 138ef454717SKhoronzhuk, Ivan u32 cfg_b; 139ef454717SKhoronzhuk, Ivan u32 res[6]; 140ef454717SKhoronzhuk, Ivan }; 141ef454717SKhoronzhuk, Ivan 142ef454717SKhoronzhuk, Ivan struct rx_chan_regs { 143ef454717SKhoronzhuk, Ivan u32 cfg_a; 144ef454717SKhoronzhuk, Ivan u32 res[7]; 145ef454717SKhoronzhuk, Ivan }; 146ef454717SKhoronzhuk, Ivan 147ef454717SKhoronzhuk, Ivan struct rx_flow_regs { 148ef454717SKhoronzhuk, Ivan u32 control; 149ef454717SKhoronzhuk, Ivan u32 tags; 150ef454717SKhoronzhuk, Ivan u32 tag_sel; 151ef454717SKhoronzhuk, Ivan u32 fdq_sel[2]; 152ef454717SKhoronzhuk, Ivan u32 thresh[3]; 153ef454717SKhoronzhuk, Ivan }; 154ef454717SKhoronzhuk, Ivan 155ef454717SKhoronzhuk, Ivan struct pktdma_cfg { 156ef454717SKhoronzhuk, Ivan struct global_ctl_regs *global; 157ef454717SKhoronzhuk, Ivan struct tx_chan_regs *tx_ch; 158ef454717SKhoronzhuk, Ivan u32 tx_ch_num; 159ef454717SKhoronzhuk, Ivan struct rx_chan_regs *rx_ch; 160ef454717SKhoronzhuk, Ivan u32 rx_ch_num; 161ef454717SKhoronzhuk, Ivan u32 *tx_sched; 162ef454717SKhoronzhuk, Ivan struct rx_flow_regs *rx_flows; 163ef454717SKhoronzhuk, Ivan u32 rx_flow_num; 164ef454717SKhoronzhuk, Ivan 165ef454717SKhoronzhuk, Ivan u32 rx_free_q; 166ef454717SKhoronzhuk, Ivan u32 rx_rcv_q; 167ef454717SKhoronzhuk, Ivan u32 tx_snd_q; 168ef454717SKhoronzhuk, Ivan 169ef454717SKhoronzhuk, Ivan u32 rx_flow; /* flow that is used for RX */ 170ef454717SKhoronzhuk, Ivan }; 171ef454717SKhoronzhuk, Ivan 172*9ea9021aSKhoronzhuk, Ivan extern struct pktdma_cfg netcp_pktdma; 173*9ea9021aSKhoronzhuk, Ivan 174ef454717SKhoronzhuk, Ivan /* 175ef454717SKhoronzhuk, Ivan * packet dma user allocates memory for rx buffers 176ef454717SKhoronzhuk, Ivan * and describe it in the following structure 177ef454717SKhoronzhuk, Ivan */ 178ef454717SKhoronzhuk, Ivan struct rx_buff_desc { 179ef454717SKhoronzhuk, Ivan u8 *buff_ptr; 180ef454717SKhoronzhuk, Ivan u32 num_buffs; 181ef454717SKhoronzhuk, Ivan u32 buff_len; 182ef454717SKhoronzhuk, Ivan u32 rx_flow; 183ef454717SKhoronzhuk, Ivan }; 184ef454717SKhoronzhuk, Ivan 185*9ea9021aSKhoronzhuk, Ivan int ksnav_close(struct pktdma_cfg *pktdma); 186*9ea9021aSKhoronzhuk, Ivan int ksnav_init(struct pktdma_cfg *pktdma, struct rx_buff_desc *rx_buffers); 187*9ea9021aSKhoronzhuk, Ivan int ksnav_send(struct pktdma_cfg *pktdma, u32 *pkt, int num_bytes, u32 swinfo2); 188*9ea9021aSKhoronzhuk, Ivan void *ksnav_recv(struct pktdma_cfg *pktdma, u32 **pkt, int *num_bytes); 189*9ea9021aSKhoronzhuk, Ivan void ksnav_release_rxhd(struct pktdma_cfg *pktdma, void *hd); 190ef454717SKhoronzhuk, Ivan 191ef454717SKhoronzhuk, Ivan #endif /* _KEYSTONE_NAV_H_ */ 192