327 lines
10 KiB
C
327 lines
10 KiB
C
#ifndef DMA_H
|
|
#define DMA_H
|
|
/*******************************************************
|
|
*
|
|
* copyright @ Motorola 1999
|
|
*
|
|
*******************************************************/
|
|
#define NUM_DMA_REG 7
|
|
#define DMA_MR_REG 0
|
|
#define DMA_SR_REG 1
|
|
#define DMA_CDAR_REG 2
|
|
#define DMA_SAR_REG 3
|
|
#define DMA_DAR_REG 4
|
|
#define DMA_BCR_REG 5
|
|
#define DMA_NDAR_REG 6
|
|
|
|
typedef enum _dmastatus
|
|
{
|
|
DMASUCCESS = 0x1000,
|
|
DMALMERROR,
|
|
DMAPERROR,
|
|
DMACHNBUSY,
|
|
DMAEOSINT,
|
|
DMAEOCAINT,
|
|
DMAINVALID,
|
|
DMANOEVENT,
|
|
} DMAStatus;
|
|
|
|
typedef enum _location
|
|
{
|
|
LOCAL = 0, /* local processor accesses on board DMA,
|
|
local processor's eumbbar is required */
|
|
REMOTE = 1, /* PCI master accesses DMA on I/O board,
|
|
I/O processor's pcsrbar is required */
|
|
} LOCATION;
|
|
|
|
typedef enum dma_mr_bit
|
|
{
|
|
IRQS = 0x00080000,
|
|
PDE = 0x00040000,
|
|
DAHTS = 0x00030000,
|
|
SAHTS = 0x0000c000,
|
|
DAHE = 0x00002000,
|
|
SAHE = 0x00001000,
|
|
PRC = 0x00000c00,
|
|
EIE = 0x00000080,
|
|
EOTIE = 0x00000040,
|
|
DL = 0x00000008,
|
|
CTM = 0x00000004,
|
|
CC = 0x00000002,
|
|
CS = 0x00000001,
|
|
} DMA_MR_BIT;
|
|
|
|
typedef enum dma_sr_bit
|
|
{
|
|
LME = 0x00000080,
|
|
PE = 0x00000010,
|
|
CB = 0x00000004,
|
|
EOSI = 0x00000002,
|
|
EOCAI = 0x00000001,
|
|
} DMA_SR_BIT;
|
|
|
|
/* structure for DMA Mode Register */
|
|
typedef struct _dma_mr
|
|
{
|
|
unsigned int reserved0 : 12;
|
|
unsigned int irqs : 1;
|
|
unsigned int pde : 1;
|
|
unsigned int dahts : 2;
|
|
unsigned int sahts : 2;
|
|
unsigned int dahe : 1;
|
|
unsigned int sahe : 1;
|
|
unsigned int prc : 2;
|
|
unsigned int reserved1 : 1;
|
|
unsigned int eie : 1;
|
|
unsigned int eotie : 1;
|
|
unsigned int reserved2 : 3;
|
|
unsigned int dl : 1;
|
|
unsigned int ctm : 1;
|
|
/* if chaining mode is enabled, any time, user can modify the
|
|
* descriptor and does not need to halt the current DMA transaction.
|
|
* Set CC bit, enable DMA to process the modified descriptors
|
|
* Hardware will clear this bit each time, DMA starts.
|
|
*/
|
|
unsigned int cc : 1;
|
|
/* cs bit has dua role, halt the current DMA transaction and
|
|
* (re)start DMA transaction. In chaining mode, if the descriptor
|
|
* needs modification, cs bit shall be used not the cc bit.
|
|
* Hardware will not set/clear this bit each time DMA transaction
|
|
* stops or starts. Software shall do it.
|
|
*
|
|
* cs bit shall not be used to halt chaining DMA transaction for
|
|
* modifying the descriptor. That is the role of CC bit.
|
|
*/
|
|
unsigned int cs : 1;
|
|
} DMA_MR;
|
|
|
|
/* structure for DMA Status register */
|
|
typedef struct _dma_sr
|
|
{
|
|
unsigned int reserved0 : 24;
|
|
unsigned int lme : 1;
|
|
unsigned int reserved1 : 2;
|
|
unsigned int pe : 1;
|
|
unsigned int reserved2 : 1;
|
|
unsigned int cb : 1;
|
|
unsigned int eosi : 1;
|
|
unsigned int eocai : 1;
|
|
} DMA_SR;
|
|
|
|
/* structure for DMA current descriptor address register */
|
|
typedef struct _dma_cdar
|
|
{
|
|
unsigned int cda : 27;
|
|
unsigned int snen : 1;
|
|
unsigned int eosie : 1;
|
|
unsigned int ctt : 2;
|
|
unsigned int eotd : 1;
|
|
} DMA_CDAR;
|
|
|
|
/* structure for DMA byte count register */
|
|
typedef struct _dma_bcr
|
|
{
|
|
unsigned int reserved : 6;
|
|
unsigned int bcr : 26;
|
|
} DMA_BCR;
|
|
|
|
/* structure for DMA Next Descriptor Address register */
|
|
typedef struct _dma_ndar
|
|
{
|
|
unsigned int nda : 27;
|
|
unsigned int ndsnen : 1;
|
|
unsigned int ndeosie: 1;
|
|
unsigned int ndctt : 2;
|
|
unsigned int eotd : 1;
|
|
} DMA_NDAR;
|
|
|
|
/* structure for DMA current transaction info */
|
|
typedef struct _dma_curr
|
|
{
|
|
unsigned int src_addr;
|
|
unsigned int dest_addr;
|
|
unsigned int byte_cnt;
|
|
} DMA_CURR;
|
|
|
|
/************************* Kernel API********************
|
|
* Kernel APIs are used to interface with O.S. kernel.
|
|
* They are the functions required by O.S. kernel to
|
|
* provide I/O service.
|
|
********************************************************/
|
|
|
|
/**************DMA Device Control Functions ********/
|
|
|
|
/**
|
|
* Note:
|
|
*
|
|
* In all following functions, the host (KAHLUA) processor has a
|
|
* choice of accessing on board local DMA (LOCAL),
|
|
* or DMA on a distributed KAHLUA (REMOTE). In either case,
|
|
* the caller shall pass the configured embedded utility memory
|
|
* block base address relative to the DMA. If LOCAL DMA is used,
|
|
* this parameter shall be EUMBBAR, if REMOTE is used, the
|
|
* parameter shall be the corresponding PCSRBAR.
|
|
**/
|
|
|
|
/**************************************************************
|
|
* function: DMA_Get_Stat
|
|
*
|
|
* description: return the content of status register of
|
|
* the given DMA channel
|
|
* if error, return DMAINVALID. Otherwise return
|
|
* DMASUCCESS.
|
|
*
|
|
**************************************************************/
|
|
static DMAStatus DMA_Get_Stat( LOCATION, unsigned int eumbbar, unsigned int channel, DMA_SR * );
|
|
|
|
/**************************************************************
|
|
* function: DMA_Get_Mode
|
|
*
|
|
* description: return the content of mode register of the
|
|
* given DMA channel
|
|
* if error, return DMAINVALID. Otherwise return DMASUCCESS.
|
|
*
|
|
**************************************************************/
|
|
static DMAStatus DMA_Get_Mode( LOCATION, unsigned int eumbbar, unsigned int channel, DMA_MR * );
|
|
|
|
/**************************************************************
|
|
* function: DMA_Set_Mode
|
|
*
|
|
* description: Set a new mode to a given DMA channel
|
|
* return DMASUCCESS if success, otherwise return DMACHNINVALID
|
|
*
|
|
* note: It is not a good idea of changing the DMA mode during
|
|
* the middle of a transaction.
|
|
**************************************************************/
|
|
static DMAStatus DMA_Set_Mode( LOCATION, unsigned int eumbbar, unsigned int channel, DMA_MR mode );
|
|
|
|
/*************************************************************
|
|
* function: DMA_ISR
|
|
*
|
|
* description: DMA interrupt service routine
|
|
* return DMAStatus based on the status
|
|
*
|
|
*************************************************************/
|
|
static DMAStatus DMA_ISR( unsigned int eumbbar,
|
|
unsigned int channel,
|
|
DMAStatus (*lme_func)( unsigned int, unsigned int, DMAStatus ),
|
|
DMAStatus (*pe_func) ( unsigned int, unsigned int, DMAStatus ),
|
|
DMAStatus (*eosi_func)( unsigned int, unsigned int, DMAStatus ),
|
|
DMAStatus (*eocai_func)(unsigned int, unsigned int, DMAStatus ));
|
|
|
|
static DMAStatus dma_error_func( unsigned int, unsigned int, DMAStatus );
|
|
|
|
/********************* DMA I/O function ********************/
|
|
|
|
/************************************************************
|
|
* function: DMA_Start
|
|
*
|
|
* description: start a given DMA channel transaction
|
|
* return DMASUCCESS if success, otherwise return DMACHNINVALID
|
|
*
|
|
* note: this function will clear DMA_MR(CC) first, then
|
|
* set DMA_MR(CC).
|
|
***********************************************************/
|
|
static DMAStatus DMA_Start( LOCATION, unsigned int eumbbar,unsigned int channel );
|
|
|
|
/***********************************************************
|
|
* function: DMA_Halt
|
|
*
|
|
* description: halt the current dma transaction on the specified
|
|
* channel.
|
|
* return DMASUCCESS if success, otherwise return DMACHNINVALID
|
|
*
|
|
* note: if the specified DMA channel is idle, nothing happens
|
|
*************************************************************/
|
|
static DMAStatus DMA_Halt( LOCATION, unsigned int eumbbar,unsigned int channel );
|
|
|
|
/*************************************************************
|
|
* function: DMA_Chn_Cnt
|
|
*
|
|
* description: set the DMA_MR(CC) bit for a given channel
|
|
* that is in chaining mode.
|
|
* return DMASUCCESS if successfule, otherwise return DMACHNINVALID
|
|
*
|
|
* note: if the given channel is not in chaining mode, nothing
|
|
* happen.
|
|
*
|
|
*************************************************************/
|
|
static DMAStatus DMA_Chn_Cnt( LOCATION, unsigned int eumbbar,unsigned int channel );
|
|
|
|
/*********************** App. API ***************************
|
|
* App. API are the APIs Kernel provides for the application
|
|
* level program
|
|
************************************************************/
|
|
/**************************************************************
|
|
* function: DMA_Bld_Curr
|
|
*
|
|
* description: set current src, dest, byte count registers
|
|
* according to the desp for a given channel
|
|
*
|
|
* if the given channel is busy, no change made,
|
|
* return DMACHNBUSY.
|
|
*
|
|
* otherwise return DMASUCCESS.
|
|
*
|
|
* note:
|
|
**************************************************************/
|
|
static DMAStatus DMA_Bld_Curr( LOCATION,
|
|
unsigned int eumbbar,
|
|
unsigned int channel,
|
|
DMA_CURR desp );
|
|
|
|
/**************************************************************
|
|
* function: DMA_Poke_Curr
|
|
*
|
|
* description: poke the current src, dest, byte count registers
|
|
* for a given channel.
|
|
*
|
|
* return DMASUCCESS if no error otherwise return DMACHNERROR
|
|
*
|
|
* note: Due to the undeterministic parallelism, in chaining
|
|
* mode, the value returned by this function shall
|
|
* be taken as reference when the query is made rather
|
|
* than the absolute snapshot when the value is returned.
|
|
**************************************************************/
|
|
static DMAStatus DMA_Poke_Curr( LOCATION,
|
|
unsigned int eumbbar,
|
|
unsigned int channel,
|
|
DMA_CURR* desp );
|
|
|
|
/**************************************************************
|
|
* function: DMA_Bld_Desp
|
|
*
|
|
* description: set current descriptor address register
|
|
* according to the desp for a given channel
|
|
*
|
|
* if the given channel is busy return DMACHNBUSY
|
|
* and no change made, otherwise return DMASUCCESS.
|
|
*
|
|
* note:
|
|
**************************************************************/
|
|
static DMAStatus DMA_Bld_Desp( LOCATION host,
|
|
unsigned int eumbbar,
|
|
unsigned int channel,
|
|
DMA_CDAR desp );
|
|
|
|
/**************************************************************
|
|
* function: DMA_Poke_Desp
|
|
*
|
|
* description: poke the current descriptor address register
|
|
* for a given channel
|
|
*
|
|
* return DMASUCCESS if no error otherwise return
|
|
* DMAINVALID
|
|
*
|
|
* note: Due to the undeterministic parallellism of DMA operation,
|
|
* the value returned by this function shall be taken as
|
|
* the most recently used descriptor when the last time
|
|
* DMA starts a chaining mode operation.
|
|
**************************************************************/
|
|
static DMAStatus DMA_Poke_Desp( LOCATION,
|
|
unsigned int eumbbar,
|
|
unsigned int channel,
|
|
DMA_CDAR *desp );
|
|
|
|
#endif
|