345 lines
9.8 KiB
C
345 lines
9.8 KiB
C
|
#ifndef I2O_H
|
||
|
#define I2O_H
|
||
|
/*********************************************************
|
||
|
*
|
||
|
* copyright @ Motorola, 1999
|
||
|
*********************************************************/
|
||
|
|
||
|
#define I2O_REG_OFFSET 0x0004
|
||
|
|
||
|
#define PCI_CFG_CLA 0x0B
|
||
|
#define PCI_CFG_SCL 0x0A
|
||
|
#define PCI_CFG_PIC 0x09
|
||
|
|
||
|
#define I2O_IMR0 0x0050
|
||
|
#define I2O_IMR1 0x0054
|
||
|
#define I2O_OMR0 0x0058
|
||
|
#define I2O_OMR1 0x005C
|
||
|
|
||
|
#define I2O_ODBR 0x0060
|
||
|
#define I2O_IDBR 0x0068
|
||
|
|
||
|
#define I2O_OMISR 0x0030
|
||
|
#define I2O_OMIMR 0x0034
|
||
|
#define I2O_IMISR 0x0100
|
||
|
#define I2O_IMIMR 0x0104
|
||
|
|
||
|
/* accessable to PCI master but local processor */
|
||
|
#define I2O_IFQPR 0x0040
|
||
|
#define I2O_OFQPR 0x0044
|
||
|
|
||
|
/* accessable to local processor */
|
||
|
#define I2O_IFHPR 0x0120
|
||
|
#define I2O_IFTPR 0x0128
|
||
|
#define I2O_IPHPR 0x0130
|
||
|
#define I2O_IPTPR 0x0138
|
||
|
#define I2O_OFHPR 0x0140
|
||
|
#define I2O_OFTPR 0x0148
|
||
|
#define I2O_OPHPR 0x0150
|
||
|
#define I2O_OPTPR 0x0158
|
||
|
#define I2O_MUCR 0x0164
|
||
|
#define I2O_QBAR 0x0170
|
||
|
|
||
|
#define I2O_NUM_MSG 2
|
||
|
|
||
|
typedef enum _i2o_status
|
||
|
{
|
||
|
I2OSUCCESS = 0,
|
||
|
I2OINVALID,
|
||
|
I2OMSGINVALID,
|
||
|
I2ODBINVALID,
|
||
|
I2OQUEINVALID,
|
||
|
I2OQUEEMPTY,
|
||
|
I2OQUEFULL,
|
||
|
I2ONOEVENT,
|
||
|
} I2OSTATUS;
|
||
|
|
||
|
typedef enum _queue_size
|
||
|
{
|
||
|
QSIZE_4K = 0x02,
|
||
|
QSIZE_8K = 0x04,
|
||
|
QSIZE_16K = 0x08,
|
||
|
QSIZE_32K = 0x10,
|
||
|
QSIZe_64K = 0x20,
|
||
|
} QUEUE_SIZE;
|
||
|
|
||
|
typedef enum _location
|
||
|
{
|
||
|
LOCAL = 0, /* used by local processor to access its own on board device,
|
||
|
local processor's eumbbar is required */
|
||
|
REMOTE, /* used by PCI master to access the devices on its PCI device,
|
||
|
device's pcsrbar is required */
|
||
|
} LOCATION;
|
||
|
|
||
|
/* door bell */
|
||
|
typedef enum _i2o_in_db
|
||
|
{
|
||
|
IN_DB = 1,
|
||
|
MC, /* machine check */
|
||
|
} I2O_IN_DB;
|
||
|
|
||
|
/* I2O PCI configuration identification */
|
||
|
typedef struct _i2o_iop
|
||
|
{
|
||
|
unsigned int base_class : 8;
|
||
|
unsigned int sub_class : 8;
|
||
|
unsigned int prg_code : 8;
|
||
|
} I2OIOP;
|
||
|
|
||
|
/* I2O Outbound Message Interrupt Status Register */
|
||
|
typedef struct _i2o_om_stat
|
||
|
{
|
||
|
unsigned int rsvd0 : 26;
|
||
|
unsigned int opqi : 1;
|
||
|
unsigned int rsvd1 : 1;
|
||
|
unsigned int odi : 1;
|
||
|
unsigned int rsvd2 : 1;
|
||
|
unsigned int om1i : 1;
|
||
|
unsigned int om0i : 1;
|
||
|
} I2OOMSTAT;
|
||
|
|
||
|
/* I2O inbound Message Interrupt Status Register */
|
||
|
typedef struct _i2o_im_stat
|
||
|
{
|
||
|
unsigned int rsvd0 : 23;
|
||
|
unsigned int ofoi : 1;
|
||
|
unsigned int ipoi : 1;
|
||
|
unsigned int rsvd1 : 1;
|
||
|
unsigned int ipqi : 1;
|
||
|
unsigned int mci : 1;
|
||
|
unsigned int idi : 1;
|
||
|
unsigned int rsvd2 : 1;
|
||
|
unsigned int im1i : 1;
|
||
|
unsigned int im0i : 1;
|
||
|
} I2OIMSTAT;
|
||
|
|
||
|
/**
|
||
|
Enable the interrupt associated with in/out bound msg
|
||
|
|
||
|
Inbound message interrupt generated by PCI master and serviced by local processor
|
||
|
local processor needs to enable its inbound interrupts it wants to handle (LOCAL)
|
||
|
|
||
|
Outbound message interrupt generated by local processor and serviced by PCI master
|
||
|
PCI master needs to enable the devices' outbound interrupts it wants to handle (REMOTE)
|
||
|
**/
|
||
|
extern I2OSTATUS I2OMsgEnable( LOCATION, /* REMOTE/LOCAL */
|
||
|
unsigned int base, /* pcsrbar/eumbbar */
|
||
|
unsigned char n ); /* b'1' - msg 0
|
||
|
* b'10'- msg 1
|
||
|
* b'11'- both
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
Disable the interrupt associated with in/out bound msg
|
||
|
|
||
|
local processor needs to disable its inbound interrupts it is not interested (LOCAL)
|
||
|
|
||
|
PCI master needs to disable outbound interrupts of devices it is not interested (REMOTE)
|
||
|
**/
|
||
|
extern I2OSTATUS I2OMsgDisable( LOCATION, /* REMOTE/LOCAL */
|
||
|
unsigned int base, /* pcsrbar/eumbbar */
|
||
|
unsigned char n ); /* b'1' - msg 0
|
||
|
* b'10'- msg 1
|
||
|
* b'11'- both
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
Read the msg register either from local inbound msg 0/1,
|
||
|
or an outbound msg 0/1 of devices.
|
||
|
|
||
|
If it is not local, pcsrbar must be passed to the function.
|
||
|
Otherwise eumbbar is passed.
|
||
|
|
||
|
If it is remote, outbound msg of the device is read.
|
||
|
Otherwise local inbound msg is read.
|
||
|
**/
|
||
|
extern I2OSTATUS I2OMsgGet ( LOCATION, /* REMOTE/LOCAL */
|
||
|
unsigned int base, /*pcsrbar/eumbbar */
|
||
|
unsigned int n, /* 0 or 1 */
|
||
|
unsigned int *msg );
|
||
|
|
||
|
/**
|
||
|
Write to nth Msg register either on local outbound msg 0/1,
|
||
|
or aninbound msg 0/1 of devices
|
||
|
|
||
|
If it is not local, pcsrbar must be passed to the function.
|
||
|
Otherwise eumbbar is passed.
|
||
|
|
||
|
If it is remote, inbound msg on the device is written.
|
||
|
Otherwise local outbound msg is written.
|
||
|
**/
|
||
|
extern I2OSTATUS I2OMsgPost( LOCATION, /* REMOTE/LOCAL */
|
||
|
unsigned int base, /*pcsrbar/eumbbar */
|
||
|
unsigned int n, /* 0 or 1 */
|
||
|
unsigned int msg );
|
||
|
|
||
|
/**
|
||
|
Enable the In/Out DoorBell Interrupt
|
||
|
|
||
|
InDoorBell interrupt is generated by PCI master and serviced by local processor
|
||
|
local processor needs to enable its inbound doorbell interrupts it wants to handle
|
||
|
|
||
|
OutDoorbell interrupt is generated by local processor and serviced by PCI master
|
||
|
PCI master needs to enable outbound doorbell interrupts of the devices it wants to handle
|
||
|
**/
|
||
|
extern I2OSTATUS I2ODBEnable( LOCATION, /* REMOTE/LOCAL */
|
||
|
unsigned int base, /* pcsrbar/eumbbar */
|
||
|
unsigned int in_db );/* when LOCAL, I2O_IN_DB, MC, I2O_IN_DB|MC */
|
||
|
|
||
|
/**
|
||
|
Disable the In/Out DoorBell Interrupt
|
||
|
|
||
|
local processor needs to disable its inbound doorbell interrupts it is not interested
|
||
|
|
||
|
PCI master needs to disable outbound doorbell interrupts of devices it is not interested
|
||
|
|
||
|
**/
|
||
|
extern I2OSTATUS I2ODBDisable( LOCATION, /* REMOTE/LOCAL */
|
||
|
unsigned int base, /* pcsrbar/eumbbar */
|
||
|
unsigned int in_db ); /* when LOCAL, I2O_IN_DB, MC, I2O_IN_DB|MC */
|
||
|
|
||
|
/**
|
||
|
Read a local indoorbell register, or an outdoorbell of devices.
|
||
|
Reading a doorbell register, the register will be cleared.
|
||
|
|
||
|
If it is not local, pcsrbar must be passed to the function.
|
||
|
Otherwise eumbbar is passed.
|
||
|
|
||
|
If it is remote, outdoorbell register on the device is read.
|
||
|
Otherwise local in doorbell is read
|
||
|
**/
|
||
|
extern unsigned int I2ODBGet( LOCATION, /* REMOTE/LOCAL */
|
||
|
unsigned int base); /* pcsrbar/eumbbar */
|
||
|
|
||
|
/**
|
||
|
Write to a local outdoorbell register, or an indoorbell register of devices.
|
||
|
|
||
|
If it is not local, pcsrbar must be passed to the function.
|
||
|
Otherwise eumbbar is passed.
|
||
|
|
||
|
If it is remote, in doorbell register on the device is written.
|
||
|
Otherwise local out doorbell is written
|
||
|
**/
|
||
|
extern void I2ODBPost( LOCATION, /* REMOTE/LOCAL */
|
||
|
unsigned int base, /* pcsrbar/eumbbar */
|
||
|
unsigned int msg ); /* in / out */
|
||
|
|
||
|
/**
|
||
|
Read the outbound msg unit interrupt status of devices. Reading an interrupt status register,
|
||
|
the register will be cleared.
|
||
|
|
||
|
The outbound interrupt status is AND with the outbound
|
||
|
interrupt mask. The result is returned.
|
||
|
|
||
|
PCI master must pass the pcsrbar to the function.
|
||
|
**/
|
||
|
extern I2OSTATUS I2OOutMsgStatGet( unsigned int pcsrbar, I2OOMSTAT * );
|
||
|
|
||
|
/**
|
||
|
Read the inbound msg unit interrupt status. Reading an interrupt status register,
|
||
|
the register will be cleared.
|
||
|
|
||
|
The inbound interrupt status is AND with the inbound
|
||
|
interrupt mask. The result is returned.
|
||
|
|
||
|
Local process must pass its eumbbar to the function.
|
||
|
**/
|
||
|
extern I2OSTATUS I2OInMsgStatGet( unsigned int eumbbar, I2OIMSTAT * );
|
||
|
|
||
|
/**
|
||
|
Configure the I2O FIFO, including QBAR, IFHPR/IFTPR,IPHPR/IPTPR,OFHPR/OFTPR, OPHPR/OPTPR,
|
||
|
MUCR.
|
||
|
**/
|
||
|
extern I2OSTATUS I2OFIFOInit( unsigned int eumbbar,
|
||
|
QUEUE_SIZE,
|
||
|
unsigned int qba);/* queue base address that must be aligned at 1M */
|
||
|
/**
|
||
|
Enable the circular queue
|
||
|
**/
|
||
|
extern I2OSTATUS I2OFIFOEnable( unsigned int eumbbar );
|
||
|
|
||
|
/**
|
||
|
Disable the circular queue
|
||
|
**/
|
||
|
extern void I2OFIFODisable( unsigned int eumbbar );
|
||
|
|
||
|
/**
|
||
|
Enable the circular queue interrupt
|
||
|
PCI master enables outbound FIFO interrupt of device
|
||
|
Device enables its inbound FIFO interrupt
|
||
|
**/
|
||
|
extern void I2OFIFOIntEnable( LOCATION, unsigned int base );
|
||
|
|
||
|
/**
|
||
|
Disable the circular queue interrupt
|
||
|
PCI master disables outbound FIFO interrupt of device
|
||
|
Device disables its inbound FIFO interrupt
|
||
|
**/
|
||
|
extern void I2OFIFOIntDisable( LOCATION, unsigned int base );
|
||
|
|
||
|
/**
|
||
|
Enable the circular queue overflow interrupt
|
||
|
**/
|
||
|
extern void I2OFIFOOverflowIntEnable( unsigned int eumbbar );
|
||
|
|
||
|
/**
|
||
|
Disable the circular queue overflow interrupt
|
||
|
**/
|
||
|
extern void I2OFIFOOverflowIntDisable( unsigned int eumbbar );
|
||
|
|
||
|
/**
|
||
|
Allocate a free msg frame from free FIFO.
|
||
|
|
||
|
PCI Master allocates a free msg frame through inbound queue port of device(IFQPR)
|
||
|
while local processor allocates a free msg frame from outbound free queue(OFTPR)
|
||
|
|
||
|
Unless both free queues are initialized, allocating a free MF will return 0xffffffff
|
||
|
**/
|
||
|
extern I2OSTATUS I2OFIFOAlloc( LOCATION,
|
||
|
unsigned int base,
|
||
|
void **pMsg);
|
||
|
/**
|
||
|
Free a used msg frame back to free queue
|
||
|
PCI Master frees a MFA through outbound queue port of device(OFQPR)
|
||
|
while local processor frees a MFA into its inbound free queue(IFHPR)
|
||
|
|
||
|
Used msg frame does not need to be recycled in the order they
|
||
|
read
|
||
|
|
||
|
This function has to be called by PCI master to initialize Inbound free queue
|
||
|
and by device to initialize Outbound free queue before I2OFIFOAlloc can be used.
|
||
|
**/
|
||
|
extern I2OSTATUS I2OFIFOFree( LOCATION,
|
||
|
unsigned int base,
|
||
|
void *pMsg );
|
||
|
|
||
|
/**
|
||
|
Post a msg into FIFO
|
||
|
PCI Master posts a msg through inbound queue port of device(IFQPR)
|
||
|
while local processor post a msg into its outbound post queue(OPHPR)
|
||
|
|
||
|
The total number of msg must be less than the max size of the queue
|
||
|
Otherwise queue overflow interrupt will assert.
|
||
|
**/
|
||
|
extern I2OSTATUS I2OFIFOPost( LOCATION,
|
||
|
unsigned int base,
|
||
|
void *pMsg );
|
||
|
|
||
|
/**
|
||
|
Read a msg from FIFO
|
||
|
PCI Master reads a msg through outbound queue port of device(OFQPR)
|
||
|
while local processor reads a msg from its inbound post queue(IPTPR)
|
||
|
**/
|
||
|
extern I2OSTATUS I2OFIFOGet( LOCATION,
|
||
|
unsigned int base,
|
||
|
void **pMsg );
|
||
|
|
||
|
/**
|
||
|
Get the I2O PCI configuration identification register
|
||
|
**/
|
||
|
extern I2OSTATUS I2OPCIConfigGet( LOCATION,
|
||
|
unsigned int base,
|
||
|
I2OIOP *);
|
||
|
|
||
|
#endif
|