vxworks to qnx, help

hi. everyone!

I’m porting and rewrite device driver source code AMDXRC II Lite for
vxworks to qnx6.30

//PCI 9080

I have problem in this part of source code:


version: vxworks




static unsigned long pci_bar_addresses[]={
PCI_CFG_BASE_ADDRESS_0,
PCI_CFG_BASE_ADDRESS_1,
PCI_CFG_BASE_ADDRESS_2,
PCI_CFG_BASE_ADDRESS_3,
PCI_CFG_BASE_ADDRESS_4,
PCI_CFG_BASE_ADDRESS_5,
0
};

typedef struct _pci_dev {
os_uint16 vendor;
os_uint16 device;
os_uint16 subsystem_vendor;
os_uint16 subsystem_device;
int irq;
char rev;
struct {
os_uint32 start;
os_uint32 end;
os_uint32 flags;
} resource[DEVICE_COUNT_RESOURCE];
} pci_dev;

#define PCI_FIND_DEVICE pciFindDevice
#define PCI_CONFIG_IN_BYTE pciConfigInByte
#define PCI_CONFIG_IN_WORD pciConfigInWord
#define PCI_CONFIG_IN_LONG pciConfigInLong
#define PCI_CONFIG_OUT_LONG pciConfigOutLong


int i=0;
int index=0;
int instance;
int bus=0,dev=0,fun=0,curr,mask,size;
short vid,did;
int j;
char irql,rev;
pci_dev pci_device;
os_dbgprint(0, (“pci_reg_devices:
entered\n”));

if (PCI_FIND_DEVICE(vendor, device, instance, &bus,
&dev, &fun)!= ERROR)
{
instance ++;
#ifdef FRC690
bus = LONSWAP(bus);
dev = LONSWAP(dev);
fun = LONSWAP(fun);
#endif
pciConfigInWord(bus, dev,);
PCI_CONFIG_IN_WORD( bus, dev,
fun,PCI_CFG_SUB_VENDER_ID,&vid);
PCI_CONFIG_IN_WORD( bus, dev, fun,
PCI_CFG_SUB_SYSTEM_ID,&did );

if
((vid==subvendor)&&(did==subdevice))

{
/* Found Device*/
pci_device.vendor = pci_tbl_.vendor;
pci_device.device = pci_tbl.device;
pci_device.subsystem_vendor=vid;
pci_device.subsystem_device=did;
for (j=0;pci_bar_addresses[j];j++)
{
int lock;
PCI_CONFIG_IN_LONG( bus, dev, fun,
pci_bar_addresses[j], &curr );
lock=intLock();
PCI_CONFIG_OUT_LONG( bus, dev, fun,
pci_bar_addresses[j], ~0 );
PCI_CONFIG_IN_LONG( bus, dev, fun,
pci_bar_addresses[j], &mask );
PCI_CONFIG_OUT_LONG( bus, dev, fun,
pci_bar_addresses[j], curr);
intUnlock(lock);
if (!mask)
continue;

if (curr & PCI_BASE_IO)
{
pci_device.resource[j].flags = 1;
curr &= PCI_IOBASE_MASK;
mask &=PCI_IOBASE_MASK;
}
else
{
pci_device.resource[j].flags = 0;
curr &= PCI_MEMBASE_MASK;
mask&=PCI_MEMBASE_MASK;
}

#ifdef MCP750
curr+=PCI_MSTR_MEM_LOCAL - PCI_MSTR_MEM_BUS;
#endif
pci_device.resource[j].start = curr;
pci_device.resource[j].end =
curr+(~mask+1)-1;

}
PCI_CONFIG_IN_BYTE( bus, dev, fun,
PCI_CFG_DEV_INT_LINE, &irql );
pci_device.irq = (int) irql;

os_dbgprint(0, (“irql:
i=%d\n”,pci_device.irq));

PCI_CONFIG_IN_BYTE( bus, dev, fun,
PCI_CFG_REVISION, &rev );
pci_device.rev = (int) rev;

PCI_CONFIG_IN_LONG( bus, dev, fun, 4, &curr
);
printf(“PCI Command/Status =
%8x\n”,curr);

//
init_board(&pci_device,index,XRC_ON_PCI_BUS);
index++;
}



\


my version


[code:1:cc01594649]

static unsigned long pci_bar_addresses[]={
0x10 ,
0x14 ,
0x18 ,
0x1c ,
0x20 ,
0x24 ,
0
};


#define PCI_FIND_DEVICE pci_find_device
#define PCI_CONFIG_IN_BYTE pci_read_config8
#define PCI_CONFIG_IN_WORD pci_read_config16
#define PCI_CONFIG_IN_LONG pci_read_config32
#define PCI_CONFIG_OUT_LONG pci_write_config32
\

int i=0;
int index=0;
int instance;
uint32_t bus,dev,fun,curr,mask,size,dev_fun;
short vid,did;
int j;
uint8_t irql,rev;
pci_dev pci_device;

bus= 0; dev= 0; fun= 0; curr= 0; mask= 0; size= 0; dev_fun = 0;

os_dbgprint(0, (“pci_reg_devices:
entered\n”));

instance=0;
if( PCI_FIND_DEVICE(pci_tbl.device,
pci_tbl.vendor, instance,&bus,
&dev_fun)!=PCI_DEVICE_NOT_FOUND)
{
instance++;
PCI_CONFIG_IN_WORD( bus, dev_fun, 0x2E,1, &did
); //sub system ID
PCI_CONFIG_IN_WORD( bus, dev_fun, 0x2C,1,&vid );
//sub system vendor ID

dev = (dev_fun&0xf8 )>>3 ;
fun = dev_fun&0x07 ;

if (
(vid==subvendor)&&(did==subdevice) )
{
/* Found Device*/
os_dbgprint(0, (“Found Device
\n”));
pci_device.vendor = pci_tbl.vendor;
pci_device.device = pci_tbl.device;
pci_device.subsystem_vendor=vid;
pci_device.subsystem_device=did;

for (j=0;pci_bar_addresses[j];j++)
{
PCI_CONFIG_IN_LONG( bus, dev_fun,
pci_bar_addresses[j], 1,&curr );
data = ~data;
PCI_CONFIG_OUT_LONG( bus, dev_fun,
pci_bar_addresses[j],1,&data );
PCI_CONFIG_IN_LONG( bus, dev_fun,
pci_bar_addresses[j], 1,&mask );
PCI_CONFIG_OUT_LONG( bus, dev_fun,
pci_bar_addresses[j],1,&curr);

if (!mask)
continue;

/* if (curr & PCI_BASE_IO)
<----???
{
pci_device.resource[j].flags = 1;
curr &= PCI_IOBASE_MASK; <-----??
mask &=PCI_IOBASE_MASK;
}
else
{
pci_device.resource[j].flags = 0;
curr &= PCI_MEMBASE_MASK;
<-----???
mask&=PCI_MEMBASE_MASK;
}
/
#ifdef MCP750
curr+=PCI_MSTR_MEM_LOCAL - PCI_MSTR_MEM_BUS;
#endif
pci_device.resource[j].start = curr;
pci_device.resource[j].end =
curr+(~mask+1)-1;

}
PCI_CONFIG_IN_BYTE( bus, dev_fun, 0x3C,1, &irql
); //Interrupt Line
pci_device.irq = (int)irql;

os_dbgprint(0, (“irql:
i=%d\n”,pci_device.irq));

PCI_CONFIG_IN_BYTE( bus, dev_fun, 0x08,1, &rev
); //Revision ID
pci_device.rev = (int) rev;

PCI_CONFIG_IN_LONG( inf.BusNumber, inf.DevFunc,
0x4, 1, &curr ); //Command
os_dbgprint(0 ,(“PCI Command/Status =
%8x\n”,curr) );

//
init_board(&pci_device,index,XRC_ON_PCI_BUS);
index++;
}

}

[/code:1:cc01594649]


my problem is in this part:

/
if (curr & PCI_BASE_IO)
{
pci_device.resource[j].flags = 1;
curr &= PCI_IOBASE_MASK;
mask &=PCI_IOBASE_MASK;
}
else
{
pci_device.resource[j].flags = 0;
curr &= PCI_MEMBASE_MASK;
mask&=PCI_MEMBASE_MASK;
}
*/

PCI_BASE_IO ???
PCI_IOBASE_MASK ???
PCI_MEMBASE_MASK ???

can you tell me what can i do?, or what are the values of these
PCI_BASE …

help me please!!

thanks!.

i’m sorry if my english is bad, i’m learning._

Hi,

do not try to port this vxWorks driver code line by line.
This many pci config space accesses are only needed under vxWorks,
because the absolutely bad API design of vxWorks does not support you
with the sizes of the pci bars.
Try to to get some qnx sample-code and/or look at the QNX API docu.
Than write the pci attach code from scratch or use some QNX sample code,
to identify your pci device on the bus.

-Michael

stjosue schrieb:

hi. everyone!

I’m porting and rewrite device driver source code AMDXRC II Lite for
vxworks to qnx6.30

//PCI 9080

I have problem in this part of source code:


version: vxworks




static unsigned long pci_bar_addresses[]={
PCI_CFG_BASE_ADDRESS_0,
PCI_CFG_BASE_ADDRESS_1,
PCI_CFG_BASE_ADDRESS_2,
PCI_CFG_BASE_ADDRESS_3,
PCI_CFG_BASE_ADDRESS_4,
PCI_CFG_BASE_ADDRESS_5,
0
};

typedef struct _pci_dev {
os_uint16 vendor;
os_uint16 device;
os_uint16 subsystem_vendor;
os_uint16 subsystem_device;
int irq;
char rev;
struct {
os_uint32 start;
os_uint32 end;
os_uint32 flags;
} resource[DEVICE_COUNT_RESOURCE];
} pci_dev;

#define PCI_FIND_DEVICE pciFindDevice
#define PCI_CONFIG_IN_BYTE pciConfigInByte
#define PCI_CONFIG_IN_WORD pciConfigInWord
#define PCI_CONFIG_IN_LONG pciConfigInLong
#define PCI_CONFIG_OUT_LONG pciConfigOutLong


int i=0;
int index=0;
int instance;
int bus=0,dev=0,fun=0,curr,mask,size;
short vid,did;
int j;
char irql,rev;
pci_dev pci_device;
os_dbgprint(0, (“pci_reg_devices:
entered\n”));

if (PCI_FIND_DEVICE(vendor, device, instance, &bus,
&dev, &fun)!= ERROR)
{
instance ++;
#ifdef FRC690
bus = LONSWAP(bus);
dev = LONSWAP(dev);
fun = LONSWAP(fun);
#endif
pciConfigInWord(bus, dev,);
PCI_CONFIG_IN_WORD( bus, dev,
fun,PCI_CFG_SUB_VENDER_ID,&vid);
PCI_CONFIG_IN_WORD( bus, dev, fun,
PCI_CFG_SUB_SYSTEM_ID,&did );

if
((vid==subvendor)&&(did==subdevice))

{
/* Found Device*/
pci_device.vendor = pci_tbl> _.vendor;
pci_device.device = pci_tbl> .device;
pci_device.subsystem_vendor=vid;
pci_device.subsystem_device=did;
for (j=0;pci_bar_addresses[j];j++)
{
int lock;
PCI_CONFIG_IN_LONG( bus, dev, fun,
pci_bar_addresses[j], &curr );
lock=intLock();
PCI_CONFIG_OUT_LONG( bus, dev, fun,
pci_bar_addresses[j], ~0 );
PCI_CONFIG_IN_LONG( bus, dev, fun,
pci_bar_addresses[j], &mask );
PCI_CONFIG_OUT_LONG( bus, dev, fun,
pci_bar_addresses[j], curr);
intUnlock(lock);
if (!mask)
continue;

if (curr & PCI_BASE_IO)
{
pci_device.resource[j].flags = 1;
curr &= PCI_IOBASE_MASK;
mask &=PCI_IOBASE_MASK;
}
else
{
pci_device.resource[j].flags = 0;
curr &= PCI_MEMBASE_MASK;
mask&=PCI_MEMBASE_MASK;
}

#ifdef MCP750
curr+=PCI_MSTR_MEM_LOCAL - PCI_MSTR_MEM_BUS;
#endif
pci_device.resource[j].start = curr;
pci_device.resource[j].end =
curr+(~mask+1)-1;

}
PCI_CONFIG_IN_BYTE( bus, dev, fun,
PCI_CFG_DEV_INT_LINE, &irql );
pci_device.irq = (int) irql;

os_dbgprint(0, (“irql:
i=%d\n”,pci_device.irq));

PCI_CONFIG_IN_BYTE( bus, dev, fun,
PCI_CFG_REVISION, &rev );
pci_device.rev = (int) rev;

PCI_CONFIG_IN_LONG( bus, dev, fun, 4, &curr
);
printf(“PCI Command/Status =
%8x\n”,curr);

//
init_board(&pci_device,index,XRC_ON_PCI_BUS);
index++;
}



\


my version


[code:1:cc01594649]

static unsigned long pci_bar_addresses[]={
0x10 ,
0x14 ,
0x18 ,
0x1c ,
0x20 ,
0x24 ,
0
};


#define PCI_FIND_DEVICE pci_find_device
#define PCI_CONFIG_IN_BYTE pci_read_config8
#define PCI_CONFIG_IN_WORD pci_read_config16
#define PCI_CONFIG_IN_LONG pci_read_config32
#define PCI_CONFIG_OUT_LONG pci_write_config32
\

int i=0;
int index=0;
int instance;
uint32_t bus,dev,fun,curr,mask,size,dev_fun;
short vid,did;
int j;
uint8_t irql,rev;
pci_dev pci_device;

bus= 0; dev= 0; fun= 0; curr= 0; mask= 0; size= 0; dev_fun = 0;

os_dbgprint(0, (“pci_reg_devices:
entered\n”));

instance=0;
if( PCI_FIND_DEVICE(pci_tbl> .device,
pci_tbl> .vendor, instance,&bus,
&dev_fun)!=PCI_DEVICE_NOT_FOUND)
{
instance++;
PCI_CONFIG_IN_WORD( bus, dev_fun, 0x2E,1, &did
); //sub system ID
PCI_CONFIG_IN_WORD( bus, dev_fun, 0x2C,1,&vid );
//sub system vendor ID

dev = (dev_fun&0xf8 )>>3 ;
fun = dev_fun&0x07 ;

if (
(vid==subvendor)&&(did==subdevice) )
{
/* Found Device*/
os_dbgprint(0, (“Found Device
\n”));
pci_device.vendor = pci_tbl> .vendor;
pci_device.device = pci_tbl> .device;
pci_device.subsystem_vendor=vid;
pci_device.subsystem_device=did;

for (j=0;pci_bar_addresses[j];j++)
{
PCI_CONFIG_IN_LONG( bus, dev_fun,
pci_bar_addresses[j], 1,&curr );
data = ~data;
PCI_CONFIG_OUT_LONG( bus, dev_fun,
pci_bar_addresses[j],1,&data );
PCI_CONFIG_IN_LONG( bus, dev_fun,
pci_bar_addresses[j], 1,&mask );
PCI_CONFIG_OUT_LONG( bus, dev_fun,
pci_bar_addresses[j],1,&curr);

if (!mask)
continue;

/* if (curr & PCI_BASE_IO)
----???
{
pci_device.resource[j].flags = 1;
curr &= PCI_IOBASE_MASK; <-----??
mask &=PCI_IOBASE_MASK;
}
else
{
pci_device.resource[j].flags = 0;
curr &= PCI_MEMBASE_MASK;
-----???
mask&=PCI_MEMBASE_MASK;
}
/
#ifdef MCP750
curr+=PCI_MSTR_MEM_LOCAL - PCI_MSTR_MEM_BUS;
#endif
pci_device.resource[j].start = curr;
pci_device.resource[j].end =
curr+(~mask+1)-1;

}
PCI_CONFIG_IN_BYTE( bus, dev_fun, 0x3C,1, &irql
); //Interrupt Line
pci_device.irq = (int)irql;

os_dbgprint(0, (“irql:
i=%d\n”,pci_device.irq));

PCI_CONFIG_IN_BYTE( bus, dev_fun, 0x08,1, &rev
); //Revision ID
pci_device.rev = (int) rev;

PCI_CONFIG_IN_LONG( inf.BusNumber, inf.DevFunc,
0x4, 1, &curr ); //Command
os_dbgprint(0 ,(“PCI Command/Status =
%8x\n”,curr) );

//
init_board(&pci_device,index,XRC_ON_PCI_BUS);
index++;
}

}

[/code:1:cc01594649]


my problem is in this part:

/
if (curr & PCI_BASE_IO)
{
pci_device.resource[j].flags = 1;
curr &= PCI_IOBASE_MASK;
mask &=PCI_IOBASE_MASK;
}
else
{
pci_device.resource[j].flags = 0;
curr &= PCI_MEMBASE_MASK;
mask&=PCI_MEMBASE_MASK;
}
*/

PCI_BASE_IO ???
PCI_IOBASE_MASK ???
PCI_MEMBASE_MASK ???

can you tell me what can i do?, or what are the values of these
PCI_BASE …

help me please!!

thanks!.

i’m sorry if my english is bad, i’m learning._