descs_com.h (3363B)
1/* SPDX-License-Identifier: GPL-2.0-only */ 2/******************************************************************************* 3 Header File to describe Normal/enhanced descriptor functions used for RING 4 and CHAINED modes. 5 6 Copyright(C) 2011 STMicroelectronics Ltd 7 8 It defines all the functions used to handle the normal/enhanced 9 descriptors in case of the DMA is configured to work in chained or 10 in ring mode. 11 12 13 Author: Giuseppe Cavallaro <peppe.cavallaro@st.com> 14*******************************************************************************/ 15 16#ifndef __DESC_COM_H__ 17#define __DESC_COM_H__ 18 19/* Specific functions used for Ring mode */ 20 21/* Enhanced descriptors */ 22static inline void ehn_desc_rx_set_on_ring(struct dma_desc *p, int end, 23 int bfsize) 24{ 25 if (bfsize == BUF_SIZE_16KiB) 26 p->des1 |= cpu_to_le32((BUF_SIZE_8KiB 27 << ERDES1_BUFFER2_SIZE_SHIFT) 28 & ERDES1_BUFFER2_SIZE_MASK); 29 30 if (end) 31 p->des1 |= cpu_to_le32(ERDES1_END_RING); 32} 33 34static inline void enh_desc_end_tx_desc_on_ring(struct dma_desc *p, int end) 35{ 36 if (end) 37 p->des0 |= cpu_to_le32(ETDES0_END_RING); 38 else 39 p->des0 &= cpu_to_le32(~ETDES0_END_RING); 40} 41 42static inline void enh_set_tx_desc_len_on_ring(struct dma_desc *p, int len) 43{ 44 if (unlikely(len > BUF_SIZE_4KiB)) { 45 p->des1 |= cpu_to_le32((((len - BUF_SIZE_4KiB) 46 << ETDES1_BUFFER2_SIZE_SHIFT) 47 & ETDES1_BUFFER2_SIZE_MASK) | (BUF_SIZE_4KiB 48 & ETDES1_BUFFER1_SIZE_MASK)); 49 } else 50 p->des1 |= cpu_to_le32((len & ETDES1_BUFFER1_SIZE_MASK)); 51} 52 53/* Normal descriptors */ 54static inline void ndesc_rx_set_on_ring(struct dma_desc *p, int end, int bfsize) 55{ 56 if (bfsize >= BUF_SIZE_2KiB) { 57 int bfsize2; 58 59 bfsize2 = min(bfsize - BUF_SIZE_2KiB + 1, BUF_SIZE_2KiB - 1); 60 p->des1 |= cpu_to_le32((bfsize2 << RDES1_BUFFER2_SIZE_SHIFT) 61 & RDES1_BUFFER2_SIZE_MASK); 62 } 63 64 if (end) 65 p->des1 |= cpu_to_le32(RDES1_END_RING); 66} 67 68static inline void ndesc_end_tx_desc_on_ring(struct dma_desc *p, int end) 69{ 70 if (end) 71 p->des1 |= cpu_to_le32(TDES1_END_RING); 72 else 73 p->des1 &= cpu_to_le32(~TDES1_END_RING); 74} 75 76static inline void norm_set_tx_desc_len_on_ring(struct dma_desc *p, int len) 77{ 78 if (unlikely(len > BUF_SIZE_2KiB)) { 79 unsigned int buffer1 = (BUF_SIZE_2KiB - 1) 80 & TDES1_BUFFER1_SIZE_MASK; 81 p->des1 |= cpu_to_le32((((len - buffer1) 82 << TDES1_BUFFER2_SIZE_SHIFT) 83 & TDES1_BUFFER2_SIZE_MASK) | buffer1); 84 } else 85 p->des1 |= cpu_to_le32((len & TDES1_BUFFER1_SIZE_MASK)); 86} 87 88/* Specific functions used for Chain mode */ 89 90/* Enhanced descriptors */ 91static inline void ehn_desc_rx_set_on_chain(struct dma_desc *p) 92{ 93 p->des1 |= cpu_to_le32(ERDES1_SECOND_ADDRESS_CHAINED); 94} 95 96static inline void enh_desc_end_tx_desc_on_chain(struct dma_desc *p) 97{ 98 p->des0 |= cpu_to_le32(ETDES0_SECOND_ADDRESS_CHAINED); 99} 100 101static inline void enh_set_tx_desc_len_on_chain(struct dma_desc *p, int len) 102{ 103 p->des1 |= cpu_to_le32(len & ETDES1_BUFFER1_SIZE_MASK); 104} 105 106/* Normal descriptors */ 107static inline void ndesc_rx_set_on_chain(struct dma_desc *p, int end) 108{ 109 p->des1 |= cpu_to_le32(RDES1_SECOND_ADDRESS_CHAINED); 110} 111 112static inline void ndesc_tx_set_on_chain(struct dma_desc *p) 113{ 114 p->des1 |= cpu_to_le32(TDES1_SECOND_ADDRESS_CHAINED); 115} 116 117static inline void norm_set_tx_desc_len_on_chain(struct dma_desc *p, int len) 118{ 119 p->des1 |= cpu_to_le32(len & TDES1_BUFFER1_SIZE_MASK); 120} 121#endif /* __DESC_COM_H__ */