2003-11-07 22:14:49

by daz

[permalink] [raw]
Subject: Exception on host-PCI-bridge master-abort

Items: custom PCI card, master-abort on host-PCI bridge, i386 PC, kernel
2.4.18

Hi,
I'm developing i386 linux drivers for a custom PCI card basically built
on
a programmable FPGA.

Every time I re-program the FPGA (without re-booting the PC), the PCI
configuration regs of the card are resetted, which makes memory and I/O
aperture of the card disappearing from the PCI bus.

By calling pci_restore_state() I restore the proper configuration, but
unfortunately sometimes I'm not fast enough, and the PC issues a read or
write requests when the card is still wrong configured.
In such bad situation the PC freezes!

From the PCI spec, if a card does not respond, after a small timeout
a
master-abort situation will accour.

It will be desiderable having, e.g. a CPU exception when the host-PCI
bridge fails with a master-abort.
By putting a pci_restore_state() call in the exception handler I could solve
the problem.

Digging in the kernel code I didn't found a way for doing that.
No PCI bridge for PC seems having such a feature. Isn't it?

Using a ARM Integrator platform instead of a PC, the solution seems easy.
The V3 PCI controller is programmed to rise an exception when a master-abort
accurs (v3_fault() in arch/arm/mach-integrator/pci_v3.c).

Please could you suggest me a way for getting this exception on PC?

Currently I'm using a PC with SIS620 chipset, but if you know solutions
related with different chipsets, I'm ready to change MB.

Regards
Antonio Borneo
[email protected]


__________________________________________________________________
Tiscali ADSL SENZA CANONE, paghi solo quello che consumi!
Navighi a 1,5 euro all'ora e il modem e' gratis! Abbonati subito.
http://point.tiscali.it/Adsl/prodotti/senzacanone/




2003-11-10 09:34:22

by Adrian Cox

[permalink] [raw]
Subject: Re: Exception on host-PCI-bridge master-abort

On Fri, 2003-11-07 at 19:34, [email protected] wrote:

> I'm developing i386 linux drivers for a custom PCI card basically built
> on
> a programmable FPGA.
>
> Every time I re-program the FPGA (without re-booting the PC), the PCI
> configuration regs of the card are resetted, which makes memory and I/O
> aperture of the card disappearing from the PCI bus.
>
> By calling pci_restore_state() I restore the proper configuration, but
> unfortunately sometimes I'm not fast enough, and the PC issues a read or
> write requests when the card is still wrong configured.
> In such bad situation the PC freezes!

I've dealt with cards like that, but without that sort of problem.
Here's some things to think about:

1) Linux should not issue read or write requests to PCI devices
randomly. If the request is directed to your card, are you sure that it
isn't coming from your own driver code? If so, fix your driver.

2) If the fatal access is to another device, then does your device pass
through an intermediate state where it corrupts accesses to other cards
on the same bus? If so, you need to use a PCI-PCI bridge to put it on a
bus by itself.

3) If it's a new custom card, worry about electrical issues. Maybe the
FPGA configuration fails sometimes.

- Adrian Cox
http://www.humboldt.co.uk/