Author: blueswirl
Date: 2007-12-29 19:38:16 +0100 (Sat, 29 Dec 2007)
New Revision: 183
Modified:
openbios-devel/arch/sparc32/entry.S
Log:
Print a message and halt if Sun4c or Sun4d
Modified: openbios-devel/arch/sparc32/entry.S
===================================================================
--- openbios-devel/arch/sparc32/entry.S 2007-12-25 08:26:21 UTC (rev 182)
+++ openbios-devel/arch/sparc32/entry.S 2007-12-29 18:38:16 UTC (rev 183)
@@ -19,6 +19,14 @@
#define PHYS_SS10_EEPROM 0xf1200000
#define PHYS_SS10_INTR0 0xf1400000
+#define PHYS_SS2_EEPROM 0xf2000000
+#define PHYS_SS2_INTR0 0xf5000000
+#define SER_ADDR2 0xf1000004
+
+#define PHYS_SS1000_EEPROM 0x00280000
+#define PHYS_SS1000_SBI 0x02800000
+#define SER_ADDR1000 0x00200004
+
#define WRITE_PAUSE nop; nop; nop; /* Have to do this after %wim/%psr chg */
.globl entry, _entry
@@ -95,27 +103,23 @@
jmp %g2 ! jump to kernel
sta %g1, [%g0] ASI_M_MMUREGS ! enable mmu
-bad_nvram:
- ! Unknown machine, freeze
- b bad_nvram
- nop
ss10:
set PHYS_SS10_EEPROM, %g1
lduba [%g1] ASI_M_CTL, %g2
cmp %g2, 'Q'
- bne bad_nvram
+ bne ss2
inc %g1
lduba [%g1] ASI_M_CTL, %g2
cmp %g2, 'E'
- bne bad_nvram
+ bne ss2
inc %g1
lduba [%g1] ASI_M_CTL, %g2
cmp %g2, 'M'
- bne bad_nvram
+ bne ss2
inc %g1
lduba [%g1] ASI_M_CTL, %g2
cmp %g2, 'U'
- bne bad_nvram
+ bne ss2
! Ok, this is SS-10 or SS-600MP
set PHYS_SS10_EEPROM + SPARC_MACHINE_ID, %g1
@@ -159,6 +163,52 @@
jmp %g2 ! jump to kernel
sta %g1, [%g0] ASI_M_MMUREGS ! enable mmu
+ss2:
+ set PHYS_SS2_EEPROM, %g1
+ lduba [%g1] ASI_M_BYPASS, %g2
+ cmp %g2, 'Q'
+ bne ss1000
+ inc %g1
+ lduba [%g1] ASI_M_BYPASS, %g2
+ cmp %g2, 'E'
+ bne ss1000
+ inc %g1
+ lduba [%g1] ASI_M_BYPASS, %g2
+ cmp %g2, 'M'
+ bne ss1000
+ inc %g1
+ lduba [%g1] ASI_M_BYPASS, %g2
+ cmp %g2, 'U'
+ bne ss1000
+
+ ! Ok, this is SS-2
+ set ss2_error, %o2
+ b ss2_ss1000_halt
+ nop
+
+ss1000:
+ set PHYS_SS1000_EEPROM, %g1
+ lduba [%g1] ASI_M_CTL, %g2
+ cmp %g2, 'Q'
+ bne bad_nvram
+ inc %g1
+ lduba [%g1] ASI_M_CTL, %g2
+ cmp %g2, 'E'
+ bne bad_nvram
+ inc %g1
+ lduba [%g1] ASI_M_CTL, %g2
+ cmp %g2, 'M'
+ bne bad_nvram
+ inc %g1
+ lduba [%g1] ASI_M_CTL, %g2
+ cmp %g2, 'U'
+ bne bad_nvram
+
+ ! Ok, this is SS-1000 or SS-2000
+ set ss1000_error, %o2
+ b ss2_ss1000_halt
+ nop
+
first_cpu:
/* Create temporary page tables and map the ROM area to end of
RAM. This will be done properly in iommu.c later. */
@@ -338,3 +388,32 @@
ret
nop
+ss2_ss1000_halt:
+ set SER_ADDR2, %o0
+ set SER_ADDR1000, %o1
+ mov 0x05, %o3 /* Reg 5, TXCTRL2 */
+ stba %o3, [%o0] ASI_M_BYPASS
+ stba %o3, [%o1] ASI_M_CTL
+ mov 0x68, %o3 /* 8 bits, Tx enabled */
+ stba %o3, [%o0] ASI_M_BYPASS
+ stba %o3, [%o1] ASI_M_CTL
+ add %o0, 2, %o0
+ add %o1, 2, %o1
+
+1: lduba [%o2] ASI_M_KERNELTXT, %o3
+ cmp %o3, 0
+ be 2f
+ nop
+ stba %o3, [%o0] ASI_M_BYPASS
+ stba %o3, [%o1] ASI_M_CTL
+ b 1b
+ inc %o2
+bad_nvram:
+2: b 2b
+ nop
+
+ .section .rodata
+ss2_error:
+ .string "Sun4c machines are not supported by OpenBIOS yet, freezing\r\n"
+ss1000_error:
+ .string "Sun4d machines are not supported by OpenBIOS yet, freezing\r\n"