2014-03-17 17:52:36 -05:00
/* Altera TSE SGDMA and MSGDMA Linux driver
* Copyright ( C ) 2014 Altera Corporation . All rights reserved
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms and conditions of the GNU General Public License ,
* version 2 , as published by the Free Software Foundation .
*
* This program is distributed in the hope it will be useful , but WITHOUT
* ANY WARRANTY ; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE . See the GNU General Public License for
* more details .
*
* You should have received a copy of the GNU General Public License along with
* this program . If not , see < http : //www.gnu.org/licenses/>.
*/
# ifndef __ALTERA_SGDMAHW_H__
# define __ALTERA_SGDMAHW_H__
/* SGDMA descriptor structure */
struct sgdma_descrip {
2014-05-14 14:38:36 -05:00
u32 raddr ; /* address of data to be read */
u32 pad1 ;
u32 waddr ;
u32 pad2 ;
u32 next ;
u32 pad3 ;
u16 bytes ;
u8 rburst ;
u8 wburst ;
u16 bytes_xferred ; /* 16 bits, bytes xferred */
2014-03-17 17:52:36 -05:00
/* bit 0: error
* bit 1 : length error
* bit 2 : crc error
* bit 3 : truncated error
* bit 4 : phy error
* bit 5 : collision error
* bit 6 : reserved
* bit 7 : status eop for recv case
*/
2014-05-14 14:38:36 -05:00
u8 status ;
2014-03-17 17:52:36 -05:00
/* bit 0: eop
* bit 1 : read_fixed
* bit 2 : write fixed
* bits 3 , 4 , 5 , 6 : Channel ( always 0 )
* bit 7 : hardware owned
*/
2014-05-14 14:38:36 -05:00
u8 control ;
2014-03-17 17:52:36 -05:00
} __packed ;
# define SGDMA_STATUS_ERR BIT(0)
# define SGDMA_STATUS_LENGTH_ERR BIT(1)
# define SGDMA_STATUS_CRC_ERR BIT(2)
# define SGDMA_STATUS_TRUNC_ERR BIT(3)
# define SGDMA_STATUS_PHY_ERR BIT(4)
# define SGDMA_STATUS_COLL_ERR BIT(5)
# define SGDMA_STATUS_EOP BIT(7)
# define SGDMA_CONTROL_EOP BIT(0)
# define SGDMA_CONTROL_RD_FIXED BIT(1)
# define SGDMA_CONTROL_WR_FIXED BIT(2)
/* Channel is always 0, so just zero initialize it */
# define SGDMA_CONTROL_HW_OWNED BIT(7)
/* SGDMA register space */
struct sgdma_csr {
/* bit 0: error
* bit 1 : eop
* bit 2 : descriptor completed
* bit 3 : chain completed
* bit 4 : busy
* remainder reserved
*/
u32 status ;
u32 pad1 [ 3 ] ;
/* bit 0: interrupt on error
* bit 1 : interrupt on eop
* bit 2 : interrupt after every descriptor
* bit 3 : interrupt after last descrip in a chain
* bit 4 : global interrupt enable
* bit 5 : starts descriptor processing
* bit 6 : stop core on dma error
* bit 7 : interrupt on max descriptors
* bits 8 - 15 : max descriptors to generate interrupt
* bit 16 : Software reset
* bit 17 : clears owned by hardware if 0 , does not clear otherwise
* bit 18 : enables descriptor polling mode
* bit 19 - 26 : clocks before polling again
* bit 27 - 30 : reserved
* bit 31 : clear interrupt
*/
u32 control ;
u32 pad2 [ 3 ] ;
u32 next_descrip ;
u32 pad3 [ 3 ] ;
} ;
2014-05-14 14:38:36 -05:00
# define sgdma_csroffs(a) (offsetof(struct sgdma_csr, a))
# define sgdma_descroffs(a) (offsetof(struct sgdma_descrip, a))
2014-03-17 17:52:36 -05:00
# define SGDMA_STSREG_ERR BIT(0) /* Error */
# define SGDMA_STSREG_EOP BIT(1) /* EOP */
# define SGDMA_STSREG_DESCRIP BIT(2) /* Descriptor completed */
# define SGDMA_STSREG_CHAIN BIT(3) /* Chain completed */
# define SGDMA_STSREG_BUSY BIT(4) /* Controller busy */
# define SGDMA_CTRLREG_IOE BIT(0) /* Interrupt on error */
# define SGDMA_CTRLREG_IOEOP BIT(1) /* Interrupt on EOP */
# define SGDMA_CTRLREG_IDESCRIP BIT(2) /* Interrupt after every descriptor */
# define SGDMA_CTRLREG_ILASTD BIT(3) /* Interrupt after last descriptor */
# define SGDMA_CTRLREG_INTEN BIT(4) /* Global Interrupt enable */
# define SGDMA_CTRLREG_START BIT(5) /* starts descriptor processing */
# define SGDMA_CTRLREG_STOPERR BIT(6) /* stop on dma error */
# define SGDMA_CTRLREG_INTMAX BIT(7) /* Interrupt on max descriptors */
# define SGDMA_CTRLREG_RESET BIT(16) /* Software reset */
# define SGDMA_CTRLREG_COBHW BIT(17) /* Clears owned by hardware */
# define SGDMA_CTRLREG_POLL BIT(18) /* enables descriptor polling mode */
# define SGDMA_CTRLREG_CLRINT BIT(31) /* Clears interrupt */
# endif /* __ALTERA_SGDMAHW_H__ */