Hi all:
I use DM8168, and I have met a problem of pcie bus.
My system often print the follow information :
dx83xx_ioctl DXT_IOCWDevice32 BAR0 offset = 0x162d2638, 434456, base = 0xd3000000
dx83xx_setMbar iowrite32 value 0xf62d2630 address = 0xd5330400,
Unhandled fault: Precise External Abort on non-linefetch (0x1028) at 0xd5330400
Internal error: : 1028 1
last sysfs file: /sys/devices/virtual/seed_gpio/seed_gpio/dev
Modules linked in: seed_gpio dxt fpgaDrv
CPU: 0 Not tainted (2.6.37+ #3)
PC is at dx83xx_setMbar+0x14c/0x168 [dxt]
LR is at dx83xx_setMbar+0x104/0x168 [dxt]
pc : [<bf0066cc>] lr : [<bf006684>] psr: a0000013
sp : c3b6be78 ip : c3b6be78 fp : c3b6bea4
r10: 00000000 r9 : c3b6a000 r8 : f62d2630
r7 : 00000000 r6 : c5a81a00 r5 : 00000004 r4 : cde15000
r3 : d5330400 r2 : c04fdad4 r1 : 005b65ea r0 : d5330400
Flags: NzCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user
Control: 10c5387d Table: 8e768019 DAC: 00000015
Process app_c131_dm8168 (pid: 137, stack limit = 0xc3b6a2e8)
Stack: (0xc3b6be78 to 0xc3b6c000)
be60: c03a0318 20000000
be80: cde15000 000a21b8 c5a81a00 c5a81a0c 00000000 00000000 c3b6befc c3b6bea8
bea0: bf0076d4 bf00658c d3000000 00000001 00072a0c 00000000 c3b6a000 00000002
bec0: c3b6bf54 c3b6bed0 c009a4a4 c009893c ffffffff 00000000 ce34ab00 00000009
bee0: 000a21b8 00000009 00000000 00000000 c3b6bf74 c3b6bf00 c00d94f0 bf006ee8
bf00: 00000000 00989680 c3b6bf84 c3b6bf18 c008f814 c03a13ac 0000c350 00000000
bf20: 009959d0 00000000 00000002 00000000 fffffffe 00000000 c3b6bf6c c3b6a000
bf40: c3b6bf64 c3b6bf50 c007fc10 cdde3e80 cdde3e80 000a21b8 410c6415 00000009
bf60: 00000000 c3b6a000 c3b6bfa4 c3b6bf78 c00d95bc c00d902c 409f8560 00000001
bf80: 00004007 00000000 162d2638 409f8718 00000036 c004b568 00000000 c3b6bfa8
bfa0: c004b3c0 c00d9570 00000000 162d2638 00000009 410c6415 000a21b8 00000058
bfc0: 00000000 162d2638 409f8718 00000036 000923e8 0000162d 00000016 00162d26
bfe0: 000a21b8 409f8498 00055d68 4845e1cc 20000010 00000009 00000000 00000000
Backtrace:
[<bf006580>] (dx83xx_setMbar+0x0/0x168 [dxt]) from [<bf0076d4>] (dx83xx_ioctl+0x7f8/0x179c [dxt])
[<bf006edc>] (dx83xx_ioctl+0x0/0x179c [dxt]) from [<c00d94f0>] (do_vfs_ioctl+0x4d0/0x544)
[<c00d9020>] (do_vfs_ioctl+0x0/0x544) from [<c00d95bc>] (sys_ioctl+0x58/0x7c)
r9:c3b6a000 r8:00000000 r7:00000009 r6:410c6415 r5:000a21b8
r4:cdde3e80
[<c00d9564>] (sys_ioctl+0x0/0x7c) from [<c004b3c0>] (ret_fast_syscall+0x0/0x30)
r8:c004b568 r7:00000036 r6:409f8718 r5:162d2638 r4:00000000
Code: ea000005 e5943094 e2833833 e2833b01 (e7933107)
--[ end trace 8c2d5207179531d9 ]--
DXT_WAIT_DMA_INT, get a wrong int sem
FPGA DEBUG: FPGA VMA close.
Fpga Driver closed
the code is :
static void dx83xx_setMbar( struct dx83xx_driver *drv, unsigned long mbar, unsigned long *maddr)
{
unsigned int bar;
unsigned char *bar_data;
unsigned int rxb;
unsigned int ctl;
unsigned int addr = *maddr;
int i;
bar_data = (unsigned char *)&bar;
#ifdef CONFIG_PPC64
for (i=0; i<4; i++)
pci_read_config_byte(drv->dev, PCI_BASE_ADDRESS_0+(mbar*4)+3-i, &bar_data[i]);
#else
for (i=0; i<4; i++)
pci_read_config_byte(drv->dev, PCI_BASE_ADDRESS_0+(mbar*4)+i, &bar_data[i]);
#endif
//WDC_PciReadCfg ( dx->hDev, PCI_BASE_ADDRESS_0 + mbar*sizeof( unsigned int), &bar, 4);
bar &= ~BAR_MASK;
addr &= ~BAR_MASK;
// use CBUS( ) to set ctl
if (CBUS(*maddr)) ctl=1; //register
else ctl=0; // memory
rxb = (~bar+1) + addr + ctl;
//printk(KERN_ALERT "dx83xx_setMbar iowrite32 value 0x%x address = 0x%x, \n", rxb,(void __iomem *) (drv->dxt.kernel_addr[CBAR] + PCIEA_RX_BASE_0(PCIEA_OFF) +mbar*4));
iowrite32(rxb, (void __iomem *) (drv->dxt.kernel_addr[CBAR] + PCIEA_RX_BASE_0(PCIEA_OFF) +mbar*4) );
*maddr &= BAR_MASK;
rxb = ioread32((void __iomem *) (drv->dxt.kernel_addr[CBAR] + PCIEA_RX_BASE_0(PCIEA_OFF) +mbar*4) ); //flush after write
}
Who can help me?