#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
