Skip to content

Commit

Permalink
m68k: mac: Fix reboot hang on Mac IIci
Browse files Browse the repository at this point in the history
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: 1da177e ("Linux-2.6.12-rc2")
Signed-off-by: Finn Thain <[email protected]>
Reviewed-by: Geert Uytterhoeven <[email protected]>
Link: https://lore.kernel.org/r/480ebd1249d229c6dc1f3f1c6d599b8505483fd8.1714797072.git.fthain@linux-m68k.org
Signed-off-by: Geert Uytterhoeven <[email protected]>
  • Loading branch information
fthain authored and geertu committed May 8, 2024
1 parent da89ce4 commit 265a3b3
Showing 1 changed file with 18 additions and 18 deletions.
36 changes: 18 additions & 18 deletions arch/m68k/mac/misc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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 */
Expand Down

0 comments on commit 265a3b3

Please sign in to comment.