📄 ppc4xx_dma.h
字号:
#define SET_DMA_PRIORITY(x) (((x)&0x00800001)) /* DMA Channel Priority */#define DMA_PRIORITY_MASK 0x00800001#define PRIORITY_LOW 0x00000000#define PRIORITY_MID_LOW 0x00000001#define PRIORITY_MID_HIGH 0x00800000#define PRIORITY_HIGH 0x00800001#define GET_DMA_PRIORITY(x) (((((x)&DMA_PRIORITY_MASK) &0x00800000) >> 22 ) | (((x)&DMA_PRIORITY_MASK) &0x00000001))#define DMA_CS0 (1<<31) /* Terminal Count has been reached */#define DMA_CS1 (1<<30)#define DMA_CS2 (1<<29)#define DMA_CS3 (1<<28)#define DMA_TS0 (1<<27) /* End of Transfer has been requested */#define DMA_TS1 (1<<26)#define DMA_TS2 (1<<25)#define DMA_TS3 (1<<24)#define DMA_CH0_ERR (1<<23) /* DMA Chanel 0 Error */#define DMA_CH1_ERR (1<<22)#define DMA_CH2_ERR (1<<21)#define DMA_CH3_ERR (1<<20)#define DMA_CT0 (1<<19) /* Chained transfere */#define DMA_IN_DMA_REQ0 (1<<18) /* Internal DMA Request is pending */#define DMA_IN_DMA_REQ1 (1<<17)#define DMA_IN_DMA_REQ2 (1<<16)#define DMA_IN_DMA_REQ3 (1<<15)#define DMA_EXT_DMA_REQ0 (1<<14) /* External DMA Request is pending */#define DMA_EXT_DMA_REQ1 (1<<13)#define DMA_EXT_DMA_REQ2 (1<<12)#define DMA_EXT_DMA_REQ3 (1<<11)#define DMA_CH0_BUSY (1<<10) /* DMA Channel 0 Busy */#define DMA_CH1_BUSY (1<<9)#define DMA_CH2_BUSY (1<<8)#define DMA_CH3_BUSY (1<<7)#define DMA_CT1 (1<<6) /* Chained transfere */#define DMA_CT2 (1<<5)#define DMA_CT3 (1<<4)#define DMA_CH_ENABLE (1<<7)#define SET_DMA_CH(x) (((x)&0x1)<<7)#define GET_DMA_CH(x) (((x)&DMA_CH_ENABLE)>>7)/* STBx25xxx dma unique *//* enable device port on a dma channel * example ext 0 on dma 1 */#define SSP0_RECV 15#define SSP0_XMIT 14#define EXT_DMA_0 12#define SC1_XMIT 11#define SC1_RECV 10#define EXT_DMA_2 9#define EXT_DMA_3 8#define SERIAL2_XMIT 7#define SERIAL2_RECV 6#define SC0_XMIT 5#define SC0_RECV 4#define SERIAL1_XMIT 3#define SERIAL1_RECV 2#define SERIAL0_XMIT 1#define SERIAL0_RECV 0#define DMA_CHAN_0 1#define DMA_CHAN_1 2#define DMA_CHAN_2 3#define DMA_CHAN_3 4/* end STBx25xx *//* * Bit 30 must be one for Redwoods, otherwise transfers may receive errors. */#define DMA_CR_MB0 0x2#define SET_DMA_CONTROL \ (SET_DMA_CIE_ENABLE(p_init->int_enable) | /* interrupt enable */ \ SET_DMA_ETD(p_init->etd_output) | /* end of transfer pin */ \ SET_DMA_TCE(p_init->tce_enable) | /* terminal count enable */ \ SET_DMA_PL(p_init->pl) | /* peripheral location */ \ SET_DMA_DAI(p_init->dai) | /* dest addr increment */ \ SET_DMA_SAI(p_init->sai) | /* src addr increment */ \ SET_DMA_PRIORITY(p_init->cp) | /* channel priority */ \ SET_DMA_PW(p_init->pwidth) | /* peripheral/bus width */ \ SET_DMA_PSC(p_init->psc) | /* peripheral setup cycles */ \ SET_DMA_PWC(p_init->pwc) | /* peripheral wait cycles */ \ SET_DMA_PHC(p_init->phc) | /* peripheral hold cycles */ \ SET_DMA_TCD(p_init->tcd_disable) | /* TC chain mode disable */ \ SET_DMA_ECE(p_init->ece_enable) | /* ECE chanin mode enable */ \ SET_DMA_CH(p_init->ch_enable) | /* Chain enable */ \ DMA_CR_MB0 /* must be one */)#define GET_DMA_POLARITY(chan) chan#endiftypedef struct { unsigned short in_use; /* set when channel is being used, clr when * available. */ /* * Valid polarity settings: * DMAReq_ActiveLow(n) * DMAAck_ActiveLow(n) * EOT_ActiveLow(n) * * n is 0 to max dma chans */ unsigned int polarity; char buffer_enable; /* Boolean: buffer enable */ char tce_enable; /* Boolean: terminal count enable */ char etd_output; /* Boolean: eot pin is a tc output */ char pce; /* Boolean: parity check enable */ /* * Peripheral location: * INTERNAL_PERIPHERAL (UART0 on the 405GP) * EXTERNAL_PERIPHERAL */ char pl; /* internal/external peripheral */ /* * Valid pwidth settings: * PW_8 * PW_16 * PW_32 * PW_64 */ unsigned int pwidth; char dai; /* Boolean: dst address increment */ char sai; /* Boolean: src address increment */ /* * Valid psc settings: 0-3 */ unsigned int psc; /* Peripheral Setup Cycles */ /* * Valid pwc settings: * 0-63 */ unsigned int pwc; /* Peripheral Wait Cycles */ /* * Valid phc settings: * 0-7 */ unsigned int phc; /* Peripheral Hold Cycles */ /* * Valid cp (channel priority) settings: * PRIORITY_LOW * PRIORITY_MID_LOW * PRIORITY_MID_HIGH * PRIORITY_HIGH */ unsigned int cp; /* channel priority */ /* * Valid pf (memory read prefetch) settings: * * PREFETCH_1 * PREFETCH_2 * PREFETCH_4 */ unsigned int pf; /* memory read prefetch */ /* * Boolean: channel interrupt enable * NOTE: for sgl transfers, only the last descriptor will be setup to * interrupt. */ char int_enable; char shift; /* easy access to byte_count shift, based on */ /* the width of the channel */ uint32_t control; /* channel control word */ /* These variabled are used ONLY in single dma transfers */ unsigned int mode; /* transfer mode */ phys_addr_t addr; char ce; /* channel enable */#ifdef CONFIG_STB03xxx char ch_enable; char tcd_disable; char ece_enable; char td; /* transfer direction */#endif} ppc_dma_ch_t;/* * PPC44x DMA implementations have a slightly different * descriptor layout. Probably moved about due to the * change to 64-bit addresses and link pointer. I don't * know why they didn't just leave control_count after * the dst_addr. */#ifdef PPC4xx_DMA_64BITtypedef struct { uint32_t control; uint32_t control_count; phys_addr_t src_addr; phys_addr_t dst_addr; phys_addr_t next;} ppc_sgl_t;#elsetypedef struct { uint32_t control; phys_addr_t src_addr; phys_addr_t dst_addr; uint32_t control_count; uint32_t next;} ppc_sgl_t;#endiftypedef struct { unsigned int dmanr; uint32_t control; /* channel ctrl word; loaded from each descrptr */ uint32_t sgl_control; /* LK, TCI, ETI, and ERI bits in sgl descriptor */ dma_addr_t dma_addr; /* dma (physical) address of this list */ ppc_sgl_t *phead; dma_addr_t phead_dma; ppc_sgl_t *ptail; dma_addr_t ptail_dma;} sgl_list_info_t;typedef struct { phys_addr_t *src_addr; phys_addr_t *dst_addr; phys_addr_t dma_src_addr; phys_addr_t dma_dst_addr;} pci_alloc_desc_t;extern ppc_dma_ch_t dma_channels[];/* * The DMA API are in ppc4xx_dma.c and ppc4xx_sgdma.c */extern int ppc4xx_init_dma_channel(unsigned int, ppc_dma_ch_t *);extern int ppc4xx_get_channel_config(unsigned int, ppc_dma_ch_t *);extern int ppc4xx_set_channel_priority(unsigned int, unsigned int);extern unsigned int ppc4xx_get_peripheral_width(unsigned int);extern void ppc4xx_set_sg_addr(int, phys_addr_t);extern int ppc4xx_add_dma_sgl(sgl_handle_t, phys_addr_t, phys_addr_t, unsigned int);extern void ppc4xx_enable_dma_sgl(sgl_handle_t);extern void ppc4xx_disable_dma_sgl(sgl_handle_t);extern int ppc4xx_get_dma_sgl_residue(sgl_handle_t, phys_addr_t *, phys_addr_t *);extern int ppc4xx_delete_dma_sgl_element(sgl_handle_t, phys_addr_t *, phys_addr_t *);extern int ppc4xx_alloc_dma_handle(sgl_handle_t *, unsigned int, unsigned int);extern void ppc4xx_free_dma_handle(sgl_handle_t);extern int ppc4xx_get_dma_status(void);extern void ppc4xx_set_src_addr(int dmanr, phys_addr_t src_addr);extern void ppc4xx_set_dst_addr(int dmanr, phys_addr_t dst_addr);extern void ppc4xx_enable_dma(unsigned int dmanr);extern void ppc4xx_disable_dma(unsigned int dmanr);extern void ppc4xx_set_dma_count(unsigned int dmanr, unsigned int count);extern int ppc4xx_get_dma_residue(unsigned int dmanr);extern void ppc4xx_set_dma_addr2(unsigned int dmanr, phys_addr_t src_dma_addr, phys_addr_t dst_dma_addr);extern int ppc4xx_enable_dma_interrupt(unsigned int dmanr);extern int ppc4xx_disable_dma_interrupt(unsigned int dmanr);extern int ppc4xx_clr_dma_status(unsigned int dmanr);extern int ppc4xx_map_dma_port(unsigned int dmanr, unsigned int ocp_dma,short dma_chan);extern int ppc4xx_disable_dma_port(unsigned int dmanr, unsigned int ocp_dma,short dma_chan);extern int ppc4xx_set_dma_mode(unsigned int dmanr, unsigned int mode);/* These are in kernel/dma.c: *//* reserve a DMA channel */extern int request_dma(unsigned int dmanr, const char *device_id);/* release it again */extern void free_dma(unsigned int dmanr);#endif#endif /* __KERNEL__ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -