⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2o.h

📁 MPC8241:本程序是freescale的824*系列的BSP源程序
💻 H
字号:
#ifndef I2O_H#define I2O_H/*************************************************************************** *     Copyright Motorola, Inc. 1989-2001 ALL RIGHTS RESERVED * *  $ID:$ * * You are hereby granted a copyright license to use, modify, and * distribute the SOFTWARE, also know as DINK32 (Dynamic Interactive Nano  * Kernel for 32-bit processors) solely in conjunction with the development  * and marketing of your products which use and incorporate microprocessors  * which implement the PowerPC(TM) architecture manufactured by  * Motorola and provided you comply with all of the following restrictions  * i) this entire notice is retained without alteration in any * modified and/or redistributed versions, and  * ii) that such modified versions are clearly identified as such.  * No licenses are granted by implication, estoppel or * otherwise under any patents or trademarks of Motorola, Inc. *  * The SOFTWARE is provided on an "AS IS" basis and without warranty. To * the maximum extent permitted by applicable law, MOTOROLA DISCLAIMS ALL * WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING IMPLIED WARRANTIES OF * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE AND ANY WARRANTY  * AGAINST INFRINGEMENT WITH REGARD TO THE SOFTWARE  * (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY ACCOMPANYING  * WRITTEN MATERIALS. *  * To the maximum extent permitted by applicable law, IN NO EVENT SHALL * MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING WITHOUT  * LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS  * INTERRUPTION, LOSS OF BUSINESS INFORMATION, * OR OTHER PECUNIARY LOSS) ARISING OF THE USE OR INABILITY TO USE THE * SOFTWARE. * Motorola assumes no responsibility for the maintenance and support of * the SOFTWARE. ************************************************************************/#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 2typedef 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{    LOCALA = 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;extern void I2O_ISR_host();extern void I2O_ISR_agent();/** 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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -