Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 27 Dec 1998 15:44:03 +0100
From:      Stefan Esser <se@mi.uni-koeln.de>
To:        Mike Smith <mike@smith.net.au>, "Daniel O'Connor" <doconnor@gsoft.com.au>
Cc:        freebsd-hackers@FreeBSD.ORG, Stefan Esser <se@FreeBSD.ORG>
Subject:   Re: PCI IRQ mappings
Message-ID:  <19981227154403.B490@mi.uni-koeln.de>
In-Reply-To: <199812210521.VAA49288@dingo.cdrom.com>; from Mike Smith on Sun, Dec 20, 1998 at 09:21:25PM -0800
References:  <XFMail.981221155051.doconnor@gsoft.com.au> <199812210521.VAA49288@dingo.cdrom.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On 1998-12-20 21:21 -0800, Mike Smith <mike@smith.net.au> wrote:
> > This is a VM86 thing then? :)
> 
> That's the easiest way to do it.  I get the impression that you should 
> be able to call the PCI BIOS from 32-bit mode as well, but I don't have 
> the documentation to hand. 

I have the documentation and once looked into adding functions that
give access to just those IRQ routing functions. (You may remember
the mails we exchanged on that topic.) But I found the call interface 
to be quite messy, and it just didn't seem useful enough.


Well, regarding the problem with PCI cards which fail to share 
their interrupts:

What you get from the BIOS is information on the IRQs that are 
assigned to groups of Int pins of the PCI slots. You can only
change the vector used by each such group. Typically IntA of one
PCI slot is connected to IntB of the neighbour slot (see the mail 
list archives for further information, this has been discussed 
too often already ;-).

What this means, is that you probably can't re-assign IRQs in 
such a way, that different devices share interrupts then before,
since this is a hardware feature of your main-board. You can 
just assign a different IRQ to a whole group of your devices.

I have seen drivers that don't look perfectly right if used with
shared interrupts. This may be true for the Lance driver, for
example, which started as an ISA-only driver and did not need to
support shared interrupts, then. The problem is with chips that
need a state-changing command to be issued just to read the ISR.
In the case of the Lance there is an "register address" register,
which must be written in order to read the ISR. If the driver has
just set that address register to point to some register to 
operate on (and knows the chip can't possibly issue an interrupt
right now, since it is not active, and thus that address register
won't be changed by the interrupt handler), then polling for the
actual source of the interrupt request may still change that 
address register and thus void the assumption!

We need to know, which driver fails with shared interrupts.

The best bet to resolve the problem quickly most probably is to
re-shuffle PCI cards until the interrupts are only shared between
devices/drivers that tolerate this. (All should, of course!)

Regards, STefan

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?19981227154403.B490>