Calling mac_reset() on a Mac IIci does reset the system, but what
follows is a POST failure that requires a manual reset to resolve.
Avoid that by using the 68030 asm implementation instead of the C
implementation.
Apparently the SE/30 has a similar problem as it has used the asm
implementation since before git. This patch extends that solution to
other systems with a similar ROM.
After this patch, the only systems still using the C implementation are
68040 systems where adb_type is either MAC_ADB_IOP or MAC_ADB_II. This
implies a 1 MiB Quadra ROM.
This now includes the Quadra 900/950, which previously fell through to
the "should never get here" catch-all.
Reported-and-tested-by: Stan Johnson <[email protected]>
Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
Signed-off-by: Finn Thain <[email protected]>
---
Tested on Mac IIci & IIfx, Quadra 630 & 650, Daystar Mac II, QEMU.
Some corner cases remain problematic. For example, a stock Mac II or
a Mac IIci with a 68040 accelerator will still use the C routine, because
mac_reset() lacks an asm implementation for '020 and '040 systems.
However, amiga_reset(), atari_reset() and mac_reset() do have a lot in
common, which suggests that a generic asm reset function parameterized by
final JMP location may be a useful refactoring. This would provide the
'020 and '040 handling missing here and could potentially replace
hp300_reset(), dn_dummy_reset() and q40_reset().
---
arch/m68k/mac/misc.c | 36 ++++++++++++++++++------------------
1 file changed, 18 insertions(+), 18 deletions(-)
diff --git a/arch/m68k/mac/misc.c b/arch/m68k/mac/misc.c
index 4c8f8cbfa05f..e7f0f72c1b36 100644
--- a/arch/m68k/mac/misc.c
+++ b/arch/m68k/mac/misc.c
@@ -453,30 +453,18 @@ void mac_poweroff(void)
void mac_reset(void)
{
- if (macintosh_config->adb_type == MAC_ADB_II &&
- macintosh_config->ident != MAC_MODEL_SE30) {
- /* need ROMBASE in booter */
- /* indeed, plus need to MAP THE ROM !! */
-
- if (mac_bi_data.rombase == 0)
- mac_bi_data.rombase = 0x40800000;
-
- /* works on some */
- rom_reset = (void *) (mac_bi_data.rombase + 0xa);
-
- local_irq_disable();
- rom_reset();
#ifdef CONFIG_ADB_CUDA
- } else if (macintosh_config->adb_type == MAC_ADB_EGRET ||
- macintosh_config->adb_type == MAC_ADB_CUDA) {
+ if (macintosh_config->adb_type == MAC_ADB_EGRET ||
+ macintosh_config->adb_type == MAC_ADB_CUDA) {
cuda_restart();
+ } else
#endif
#ifdef CONFIG_ADB_PMU
- } else if (macintosh_config->adb_type == MAC_ADB_PB2) {
+ if (macintosh_config->adb_type == MAC_ADB_PB2) {
pmu_restart();
+ } else
#endif
- } else if (CPU_IS_030) {
-
+ if (CPU_IS_030) {
/* 030-specific reset routine. The idea is general, but the
* specific registers to reset are '030-specific. Until I
* have a non-030 machine, I can't test anything else.
@@ -524,6 +512,18 @@ void mac_reset(void)
"jmp %/a0@\n\t" /* jump to the reset vector */
".chip 68k"
: : "r" (offset), "a" (rombase) : "a0");
+ } else {
+ /* need ROMBASE in booter */
+ /* indeed, plus need to MAP THE ROM !! */
+
+ if (mac_bi_data.rombase == 0)
+ mac_bi_data.rombase = 0x40800000;
+
+ /* works on some */
+ rom_reset = (void *)(mac_bi_data.rombase + 0xa);
+
+ local_irq_disable();
+ rom_reset();
}
/* should never get here */
--
2.39.3
On Sat, May 4, 2024 at 6:43 AM Finn Thain <[email protected]> wrote:
> Calling mac_reset() on a Mac IIci does reset the system, but what
> follows is a POST failure that requires a manual reset to resolve.
> Avoid that by using the 68030 asm implementation instead of the C
> implementation.
>
> Apparently the SE/30 has a similar problem as it has used the asm
> implementation since before git. This patch extends that solution to
> other systems with a similar ROM.
>
> After this patch, the only systems still using the C implementation are
> 68040 systems where adb_type is either MAC_ADB_IOP or MAC_ADB_II. This
> implies a 1 MiB Quadra ROM.
>
> This now includes the Quadra 900/950, which previously fell through to
> the "should never get here" catch-all.
>
> Reported-and-tested-by: Stan Johnson <[email protected]>
> Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
> Signed-off-by: Finn Thain <[email protected]>
> ---
> Tested on Mac IIci & IIfx, Quadra 630 & 650, Daystar Mac II, QEMU.
>
> Some corner cases remain problematic. For example, a stock Mac II or
> a Mac IIci with a 68040 accelerator will still use the C routine, because
> mac_reset() lacks an asm implementation for '020 and '040 systems.
LGTM, so
Reviewed-by: Geert Uytterhoeven <[email protected]>
i.e. will queue in the m68k tree for v6.10.
> However, amiga_reset(), atari_reset() and mac_reset() do have a lot in
> common, which suggests that a generic asm reset function parameterized by
> final JMP location may be a useful refactoring. This would provide the
> '020 and '040 handling missing here and could potentially replace
> hp300_reset(), dn_dummy_reset() and q40_reset().
Sounds like a good idea!
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68korg
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds