* Re: Status of PCI-PCI bridge on UMAX S900
[not found] <j-jvNB.A.O4F.4jrR6@murphy>
@ 2000-12-27 10:06 ` Benjamin Herrenschmidt
2000-12-27 23:12 ` jingai
2000-12-28 4:05 ` jingai
0 siblings, 2 replies; 8+ messages in thread
From: Benjamin Herrenschmidt @ 2000-12-27 10:06 UTC (permalink / raw)
To: jingai, debian-powerpc, linuxppc-dev
>Hello, I am just curious if anyone is working on getting the PCI-PCI
>bridge code working for the UMAX S900 (similar to 9500, but
>obviously different enough to break the code). The problem is this:
>all cards not in slots 1-2 are assigned an IRQ of 1, which is
>obviously wrong. I'm not sure why slot 3 does not work, however,
>unless the code just thinks the PCI bridge *is* slot 3 (which it does
>appear to be that way).
>
>If no one is currently attempting to fix it, but someone would like to,
>here is all of the relevant info I can think of. Thanks in advance for
>any help.
I had no time to fix that yet. email me in a couple of weeks, I'll have
finished moving and my boxes will be back up.
Note that it's not similar to the 9500, the 9500 has 2 host bridges while
you have only one with a PCI<->PCI bridge, the interrupt problem appear
to be specific to this configuration on an oldworld machine.
If you want to give it a look by yourself, the code that gets the
interrupt numbers is in arch/ppc/prom.c. Look at the bits that use the
"AAPL,interrupt" property and modify it slightly so that when it can't
find it, it looks for the parent.
Ben.
** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Re: Status of PCI-PCI bridge on UMAX S900
2000-12-27 10:06 ` Status of PCI-PCI bridge on UMAX S900 Benjamin Herrenschmidt
@ 2000-12-27 23:12 ` jingai
2000-12-28 4:05 ` jingai
1 sibling, 0 replies; 8+ messages in thread
From: jingai @ 2000-12-27 23:12 UTC (permalink / raw)
To: Benjamin Herrenschmidt; +Cc: debian-powerpc
> >Hello, I am just curious if anyone is working on getting the PCI-PCI
> >bridge code working for the UMAX S900
>
> [...snip...]
>
> I had no time to fix that yet. email me in a couple of weeks, I'll have
> finished moving and my boxes will be back up.
Ok, np.
> Note that it's not similar to the 9500, the 9500 has 2 host bridges while
> you have only one with a PCI<->PCI bridge, the interrupt problem appear
> to be specific to this configuration on an oldworld machine.
Ahh, ok, I was under the impression that the 9500 also had p2p bridge,
didn't know it actually had two host controllers...
> If you want to give it a look by yourself, the code that gets the
> interrupt numbers is in arch/ppc/prom.c. Look at the bits that use the
> "AAPL,interrupt" property and modify it slightly so that when it can't
> find it, it looks for the parent.
Ok, here is where you can call me stupid :) I just did have a long look
over the code, but bear in mind, this is the first time I've really looked
at any of the PPC-specific code (or much of any of it for that matter).
Here is what I tried, which didn't work, so maybe you could give me
a few more hints:
(this is repeated for every instance)
ip = (int *) get_property(np, "AAPL,interrupts", &l);
if (ip == 0)
ip = (int *) get_property(np, "interrupts", &l);
++ if (ip == 0)
++ ip = (int *) get_property(np, "interrupt-parent", &l);
I also tried:
++ if (ip == 0)
++ ip = (int *) get_property(npi->parent, "AAPL,interrupts", &l);
Forgive me for my ignorance, but as I said, this is my first time even
looking at it :)
TIA for any help,
jonathan
** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Re: Status of PCI-PCI bridge on UMAX S900
2000-12-27 10:06 ` Status of PCI-PCI bridge on UMAX S900 Benjamin Herrenschmidt
2000-12-27 23:12 ` jingai
@ 2000-12-28 4:05 ` jingai
2000-12-28 14:13 ` Chas Williams
1 sibling, 1 reply; 8+ messages in thread
From: jingai @ 2000-12-28 4:05 UTC (permalink / raw)
To: Benjamin Herrenschmidt; +Cc: debian-powerpc
> >Hello, I am just curious if anyone is working on getting the PCI-PCI
> >bridge code working for the UMAX S900...
>
> If you want to give it a look by yourself, the code that gets the
> interrupt numbers is in arch/ppc/prom.c. Look at the bits that use the
> "AAPL,interrupt" property and modify it slightly so that when it can't
> find it, it looks for the parent.
Ok, I've given it a more thorough looksee, and here is what I have done:
--- prom.c Wed Dec 27 22:54:42 2000
+++ prom.c.old Wed Dec 27 22:04:15 2000
@@ -1566,10 +1566,6 @@
ip = (int *) get_property(np, "AAPL,interrupts", &l);
if (ip == 0)
ip = (int *) get_property(np, "interrupts", &l);
- /* JSL: HACK FOR UMAX S900 PCI-PCI BRIDGE (DECchip 21052)
- */
- if (ip == 0 && np->parent != NULL)
- ip = (int *) get_property(np->parent, "AAPL,interrupts", &l);
if (ip != 0) {
np->intrs = (struct interrupt_info *) mem_start;
np->n_intrs = l / sizeof(int);
I have verified that the code I added is in fact called when it probes the
two
cards in slots 3 and 4; however, *ip == 1 for both cards. It seems as
though
the IRQ info cannot be retrieved from AAPL,interrupts, or it is just
incorrect.
I did try *manually* setting the IRQs for these cards to 25 and 26, which
as I expected, did not work... (it appears to have the same effect as
when they are set to 1, considering that is also incorrect).
If it might help, the card in slot 4 is my second ethernet card (used for
my LAN -- internal is used for DSL), and it *does* work a little --
here is output from ping:
PING 192.168.1.2 (192.168.1.2): 56 data bytes
64 bytes from 192.168.1.2: icmp_seq=0 ttl=255 time=7648.2 ms
64 bytes from 192.168.1.2: icmp_seq=1 ttl=255 time=6656.9 ms
64 bytes from 192.168.1.2: icmp_seq=2 ttl=255 time=5657.2 ms
64 bytes from 192.168.1.2: icmp_seq=3 ttl=255 time=4654.8 ms
64 bytes from 192.168.1.2: icmp_seq=4 ttl=255 time=3657.5 ms
64 bytes from 192.168.1.2: icmp_seq=5 ttl=255 time=2656.7 ms
64 bytes from 192.168.1.2: icmp_seq=6 ttl=255 time=1657.8 ms
64 bytes from 192.168.1.2: icmp_seq=7 ttl=255 time=657.9 ms
--- 192.168.1.2 ping statistics ---
11 packets transmitted, 8 packets received, 27% packet loss
round-trip min/avg/max = 657.9/4155.8/7648.2 ms
As you might notice, 7648.2ms is pretty bad for a machine in the
next room :) Not to mention the 27% packet loss..
Anyway, I think I am stepping out of my bounds here now... hopefully
this is enough information for someone to give me some more pointers
on where I should look..
/me really wishes he were a kernel guru right now :)
TIA,
Jonathan
** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Status of PCI-PCI bridge on UMAX S900
2000-12-28 4:05 ` jingai
@ 2000-12-28 14:13 ` Chas Williams
0 siblings, 0 replies; 8+ messages in thread
From: Chas Williams @ 2000-12-28 14:13 UTC (permalink / raw)
To: jingai; +Cc: Benjamin Herrenschmidt, debian-powerpc, linuxppc-dev
just a short followup to the message i sent to debian-powerpc, i applied the
following diff and was able to move my usb board to the other side of the
umax/s900 bridge w/o any ill effect:
--- prom.c.000 Thu Dec 28 08:43:12 2000
+++ prom.c Thu Dec 28 09:06:16 2000
@@ -1563,8 +1563,8 @@
}
ip = (int *) get_property(np, "AAPL,interrupts", &l);
- if (ip == 0)
- ip = (int *) get_property(np, "interrupts", &l);
+ if (ip == 0 && np->parent != NULL)
+ ip = (int *) get_property(np->parent, "AAPL,interrupts", &l);
if (ip != 0) {
np->intrs = (struct interrupt_info *) mem_start;
np->n_intrs = l / sizeof(int);
lspci, now shows:
01:00.0 VGA compatible controller: ATI Technologies Inc Rage 128 RE (prog-if 00 [VGA])
Subsystem: Unknown device b530:0408
Flags: bus master, stepping, medium devsel, latency 32, IRQ 25
Memory at 84000000 (32-bit, prefetchable) [size=64M]
I/O ports at 1000 [size=256]
Memory at 80804000 (32-bit, non-prefetchable) [size=16K]
Expansion ROM at 80820000 [disabled] [size=128K]
Capabilities: <available only to root>
01:01.0 USB Controller: OPTi Inc. 82C861 (rev 10) (prog-if 10 [OHCI])
Subsystem: OPTi Inc.: Unknown device c861
Flags: bus master, medium devsel, latency 32, IRQ 25
Memory at 80800000 (32-bit, non-prefetchable) [size=4K]
on a related, note, shouldnt the 'right' code be:
ip = (int *) get_property(np, "interrupts", &l);
if (ip > 0)
{
/* find and assign interrupt -- see above */
}
pci boards should only get an interrupt if they have the interrupt property
(which seems to be the number of interrupts, not the interrupt number)
** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Re: Status of PCI-PCI bridge on UMAX S900
@ 2000-12-29 0:16 jingai
0 siblings, 0 replies; 8+ messages in thread
From: jingai @ 2000-12-29 0:16 UTC (permalink / raw)
To: debian-powerpc, linuxppc-dev
> just a short followup to the message i sent to debian-powerpc, i applied
> the following diff and was able to move my usb board to the other side of
the
>
> umax/s900 bridge w/o any ill effect:
>
> --- prom.c.000 Thu Dec 28 08:43:12 2000
> +++ prom.c Thu Dec 28 09:06:16 2000
> @@ -1563,8 +1563,8 @@
> }
>
> ip = (int *) get_property(np, "AAPL,interrupts", &l);
> - if (ip == 0)
> - ip = (int *) get_property(np, "interrupts", &l);
> + if (ip == 0 && np->parent != NULL)
> + ip = (int *) get_property(np->parent, "AAPL,interrupts",
> &l);
> if (ip != 0) {
> np->intrs = (struct interrupt_info *) mem_start;
> np->n_intrs = l / sizeof(int);
Doh! I didn't even think to check if the second get_property() call
was returning > 0.. this fixes it! Thanks bunches for spotting that!
> on a related, note, shouldnt the 'right' code be:
>
> ip = (int *) get_property(np, "interrupts", &l);
> if (ip > 0)
> {
> /* find and assign interrupt -- see above */
> }
>
> pci boards should only get an interrupt if they have the interrupt
> property (which seems to be the number of interrupts, not the interrupt
number)
Seems correct to me, but I'm no kernel guru, so I'll let someone else
answer
authoritatively.
-j
** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Re: Status of PCI-PCI bridge on UMAX S900
2001-01-04 20:41 ` Benjamin Herrenschmidt
@ 2001-01-04 22:48 ` jingai
0 siblings, 0 replies; 8+ messages in thread
From: jingai @ 2001-01-04 22:48 UTC (permalink / raw)
To: Benjamin Herrenschmidt; +Cc: linuxppc-dev
> The "interrupts" property can have various meanings depending on the OF
> version, I suggest you don't mess with it. Just check that if you find no
> AAPL,interrupts, and that pmac_newworld == 0, then look for parent
> AAPL,interrupts.
So, then does the following patch seem valid? If so, I'd appreciate it if
others with different macs (newworld and oldworld) could try it and let
me know if it breaks anything...
..and if not, how would one go about getting this into the official trees?
--- prom.c.old Wed Jan 3 20:31:59 2001
+++ prom.c Thu Jan 4 17:44:02 2001
@@ -1564,8 +1564,15 @@
}
ip = (int *) get_property(np, "AAPL,interrupts", &l);
- if (ip == 0)
+ if (ip == 0) {
+ /* hack to force a look at the parent node for interrupts on
+ * oldworld macs with funky PCI<->PCI bridges (ie, UMAX S900)
+ */
+ if (!pmac_newworld && np->parent != NULL)
+ ip = (int *) get_property(np->parent, "AAPL,interrupts",
&l);
+ else
ip = (int *) get_property(np, "interrupts", &l);
+ }
if (ip != 0) {
np->intrs = (struct interrupt_info *) mem_start;
np->n_intrs = l / sizeof(int);
@@ -1617,8 +1624,15 @@
return mem_start;
ip = (int *) get_property(np, "AAPL,interrupts", &l);
- if (ip == 0)
+ if (ip == 0) {
+ /* hack to force a look at the parent node for interrupts on
+ * oldworld macs with funky PCI<->PCI bridges (ie, UMAX S900)
+ */
+ if (!pmac_newworld && np->parent != NULL)
+ ip = (int *) get_property(np->parent, "AAPL,interrupts",
&l);
+ else
ip = (int *) get_property(np, "interrupts", &l);
+ }
if (ip != 0) {
np->intrs = (struct interrupt_info *) mem_start;
np->n_intrs = l / sizeof(int);
@@ -1774,8 +1788,15 @@
return mem_start;
ip = (int *) get_property(np, "AAPL,interrupts", &l);
- if (ip == 0)
+ if (ip == 0) {
+ /* hack to force a look at the parent node for interrupts on
+ * oldworld macs with funky PCI<->PCI bridges (ie, UMAX S900)
+ */
+ if (!pmac_newworld && np->parent != NULL)
+ ip = (int *) get_property(np->parent, "AAPL,interrupts",
&l);
+ else
ip = (int *) get_property(np, "interrupts", &l);
+ }
if (ip != 0) {
np->intrs = (struct interrupt_info *) mem_start;
np->n_intrs = l / sizeof(int);
** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Re: Status of PCI-PCI bridge on UMAX S900
2001-01-04 22:53 David Edelsohn
@ 2001-01-05 12:58 ` jingai
2001-01-05 14:24 ` Benjamin Herrenschmidt
0 siblings, 1 reply; 8+ messages in thread
From: jingai @ 2001-01-05 12:58 UTC (permalink / raw)
To: David Edelsohn; +Cc: linuxppc-dev
> Do you only need to look at the immediate parent and not the
> entire ancestor tree?
My guess would be probably, to be thorough. But I'm no kernel
expert, so anyone else have any comments?
Although (again just guessing), I don't think many (if any) systems
will have more than one PCI controller, or more than one bridge
chip for that matter...
Regards,
Jonathan
** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Re: Status of PCI-PCI bridge on UMAX S900
2001-01-05 12:58 ` jingai
@ 2001-01-05 14:24 ` Benjamin Herrenschmidt
0 siblings, 0 replies; 8+ messages in thread
From: Benjamin Herrenschmidt @ 2001-01-05 14:24 UTC (permalink / raw)
To: jingai; +Cc: David Edelsohn, linuxppc-dev
>
>My guess would be probably, to be thorough. But I'm no kernel
>expert, so anyone else have any comments?
>
>Although (again just guessing), I don't think many (if any) systems
>will have more than one PCI controller, or more than one bridge
>chip for that matter...
The best solution is probably to cleanup the current parsing mecanism in
prom.c to clearly separate the 3 cases:
- Real OF with interrupt tree (CHRP, newworld mac booting via OF). This
one is already more or less separate.
- OldWorld macs (booted either via OF or BootX/miBoot)
- Newworld macs booted via BootX/miBoot
Only the second case should iterate the AAPL,interrupts parents, and in
this case, all parents should be iterated up to the top of the tree in
case of cascaded bridges. For now, your patch may be enough, I'll look
into cleaning all that up myself. The only "tricky" case is NewWorld macs
booted via BootX/miBoot. Those machine should use the OF interrupt tree.
Unfortunately, MacOS screws it up (we no longer have access to the
phandle's, and so can't follow the interrupt-parent links). So we rely on
other types of infos left by MacOS, but those seem to occasionally be
different on older newworld macs and core99 machines.
Ben.
** Sent via the linuxppc-dev mail list. See http://lists.linuxppc.org/
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2001-01-05 14:24 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <j-jvNB.A.O4F.4jrR6@murphy>
2000-12-27 10:06 ` Status of PCI-PCI bridge on UMAX S900 Benjamin Herrenschmidt
2000-12-27 23:12 ` jingai
2000-12-28 4:05 ` jingai
2000-12-28 14:13 ` Chas Williams
2000-12-29 0:16 jingai
-- strict thread matches above, loose matches on Subject: below --
2001-01-04 19:19 Tibor Pausz
2001-01-04 20:41 ` Benjamin Herrenschmidt
2001-01-04 22:48 ` jingai
2001-01-04 22:53 David Edelsohn
2001-01-05 12:58 ` jingai
2001-01-05 14:24 ` Benjamin Herrenschmidt
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).