/*
 * (C) Copyright 2003
 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
 *
 * This file is based on code
 * (C) Copyright Motorola, Inc., 2000
 *
 * odin smartdma header file
 */

#ifndef __MPC5XXX_SDMA_H
#define __MPC5XXX_SDMA_H

#include <common.h>
#include <mpc5xxx.h>

/* Task number assignment */
#define FEC_RECV_TASK_NO            0
#define FEC_XMIT_TASK_NO            1

/*---------------------------------------------------------------------*/

/* Stuff for Ethernet Tx/Rx tasks                                      */

/*---------------------------------------------------------------------*/

/* Layout of Ethernet controller Parameter SRAM area:
----------------------------------------------------------------
0x00: TBD_BASE, base address of TX BD ring
0x04: TBD_NEXT, address of next TX BD to be processed
0x08: RBD_BASE, base address of RX BD ring
0x0C: RBD_NEXT, address of next RX BD to be processed
---------------------------------------------------------------
ALL PARAMETERS ARE ALL LONGWORDS (FOUR BYTES EACH).
*/

/* base address of SRAM area to store parameters used by Ethernet tasks */
#define FEC_PARAM_BASE		(MPC5XXX_SRAM + 0x0800)

/* base address of SRAM area for buffer descriptors */
#define FEC_BD_BASE		(MPC5XXX_SRAM + 0x0820)

/*---------------------------------------------------------------------*/

/* common shortcuts  used  by driver C code                            */

/*---------------------------------------------------------------------*/

/* Disable SmartDMA task */
#define SDMA_TASK_DISABLE(tasknum)                     \
{                                                      \
    volatile ushort *tcr = (ushort *)(MPC5XXX_SDMA + 0x0000001c + 2 * tasknum); \
    *tcr = (*tcr) & (~0x8000);                         \
}

/* Enable SmartDMA task */
#define SDMA_TASK_ENABLE(tasknum)                      \
{                                                      \
    volatile ushort *tcr = (ushort *) (MPC5XXX_SDMA + 0x0000001c + 2 * tasknum); \
    *tcr = (*tcr)  | 0x8000;                           \
}

/* Enable interrupt */
#define SDMA_INT_ENABLE(tasknum)                       \
{                                                      \
    struct mpc5xxx_sdma *sdma = (struct mpc5xxx_sdma *)MPC5XXX_SDMA; \
    sdma->IntMask &= ~(1 << tasknum);                  \
}

/* Disable interrupt */
#define SDMA_INT_DISABLE(tasknum)   \
{                                                      \
    struct mpc5xxx_sdma *sdma = (struct mpc5xxx_sdma *)MPC5XXX_SDMA; \
    sdma->IntMask |= (1 << tasknum);                   \
}


/* Clear interrupt pending bits */
#define SDMA_CLEAR_IEVENT(tasknum)  \
{                                                      \
    struct mpc5xxx_sdma *sdma = (struct mpc5xxx_sdma *)MPC5XXX_SDMA; \
    sdma->IntPend = (1 << tasknum);                    \
}

/* get interrupt pending bit of a task */
#define SDMA_GET_PENDINGBIT(tasknum)                   \
	((*(vu_long *)(MPC5XXX_SDMA + 0x14)) & (1<<(tasknum)))

/* get interrupt mask bit of a task */
#define SDMA_GET_MASKBIT(tasknum)                      \
	((*(vu_long *)(MPC5XXX_SDMA + 0x18)) & (1<<(tasknum)))

#endif	/* __MPC5XXX_SDMA_H */