Commit 8ee90c5c authored by Finn Thain's avatar Finn Thain Committed by Geert Uytterhoeven

m68k/mac: Disentangle VIA/RBV and NuBus initialization

The Nubus subsystem should not be concerned with differences between VIA,
RBV and OSS platforms. It should be portable across Macs and PowerMacs.
This goal has implications for the initialization code relating to bus
locking and slot interrupts.

During Nubus initialization, bus transactions are "unlocked": on VIA2 and
RBV machines, via_nubus_init() sets a bit in the via2[gBufB] register to
allow bus-mastering Nubus cards to arbitrate for the bus. This happens
upon subsys_initcall(nubus_init). But because nubus_init() has no effect
on card state, this sequence is arbitrary.

Moreover, when Penguin is used to boot Linux, the bus is already unlocked
when Linux starts. On OSS machines there's no attempt to unlock Nubus
transactions at all. (Maybe there's no benefit on that platform or maybe
no-one knows how.)

All of this demonstrates that there's no benefit in locking out
bus-mastering cards, as yet. (If the need arises, we could lock the bus
for the duration of a timing-critical operation.) NetBSD unlocks the
Nubus early (at VIA initialization) and we can do the same.

via_nubus_init() is also responsible for some VIA interrupt setup that
should happen earlier than subsys_initcall(nubus_init). And actually, the
Nubus subsystem need not be involved with slot interrupts: SLOT2IRQ
works fine because Nubus slot IRQs are geographically assigned
(regardless of platform).

For certain platforms with PDS slots, some Nubus IRQs may be platform
IRQs and this is not something that the NuBus subsystem should worry
about. So let's invoke via_nubus_init() earlier and make the platform
responsible for bus unlocking and interrupt setup instead of the NuBus
subsystem.
Tested-by: default avatarStan Johnson <userm57@yahoo.com>
Signed-off-by: default avatarFinn Thain <fthain@telegraphics.com.au>
Signed-off-by: default avatarGeert Uytterhoeven <geert@linux-m68k.org>
parent 7a0bb442
...@@ -51,14 +51,6 @@ void __init oss_init(void) ...@@ -51,14 +51,6 @@ void __init oss_init(void)
oss->irq_level[i] = 0; oss->irq_level[i] = 0;
} }
/*
* Initialize OSS for Nubus access
*/
void __init oss_nubus_init(void)
{
}
/* /*
* Handle miscellaneous OSS interrupts. * Handle miscellaneous OSS interrupts.
*/ */
......
...@@ -106,6 +106,7 @@ static int gIER,gIFR,gBufA,gBufB; ...@@ -106,6 +106,7 @@ static int gIER,gIFR,gBufA,gBufB;
static u8 nubus_disabled; static u8 nubus_disabled;
void via_debug_dump(void); void via_debug_dump(void);
static void via_nubus_init(void);
/* /*
* Initialize the VIAs * Initialize the VIAs
...@@ -238,6 +239,8 @@ void __init via_init(void) ...@@ -238,6 +239,8 @@ void __init via_init(void)
via2[vACR] &= ~0x03; /* disable port A & B latches */ via2[vACR] &= ~0x03; /* disable port A & B latches */
} }
via_nubus_init();
/* Everything below this point is VIA2 only... */ /* Everything below this point is VIA2 only... */
if (rbv_present) if (rbv_present)
...@@ -359,7 +362,7 @@ int via_get_cache_disable(void) ...@@ -359,7 +362,7 @@ int via_get_cache_disable(void)
* Initialize VIA2 for Nubus access * Initialize VIA2 for Nubus access
*/ */
void __init via_nubus_init(void) static void __init via_nubus_init(void)
{ {
/* unlock nubus transactions */ /* unlock nubus transactions */
......
...@@ -18,11 +18,6 @@ ...@@ -18,11 +18,6 @@
#include <asm/setup.h> #include <asm/setup.h>
#include <asm/page.h> #include <asm/page.h>
#include <asm/hwtest.h> #include <asm/hwtest.h>
#include <asm/mac_via.h>
#include <asm/mac_oss.h>
extern void via_nubus_init(void);
extern void oss_nubus_init(void);
/* Constants */ /* Constants */
...@@ -840,14 +835,6 @@ static int __init nubus_init(void) ...@@ -840,14 +835,6 @@ static int __init nubus_init(void)
if (!MACH_IS_MAC) if (!MACH_IS_MAC)
return 0; return 0;
/* Initialize the NuBus interrupts */
if (oss_present) {
oss_nubus_init();
} else {
via_nubus_init();
}
/* And probe */
pr_info("NuBus: Scanning NuBus slots.\n"); pr_info("NuBus: Scanning NuBus slots.\n");
nubus_devices = NULL; nubus_devices = NULL;
nubus_boards = NULL; nubus_boards = NULL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment