i5000: enforce hard reset

Not doing a hard reset leaves the BOFL0 register cleared, which
prevents the BSP selection from working. To make sure we start
with known values, use the SPAD0 register for soft reset detection.
If there's a value other than 0, do a hard reset.

Change-Id: I390e3208084cfd32d73cce439ddf2bc9d4436a62
Signed-off-by: Sven Schnelle <svens@stackframe.org>
Reviewed-on: http://review.coreboot.org/1103
Tested-by: build bot (Jenkins)
This commit is contained in:
Sven Schnelle
2012-06-17 14:23:35 +02:00
parent ec6f043c25
commit 1a7a7e610e

View File

@@ -2,6 +2,26 @@
movl %eax, %ebp movl %eax, %ebp
/* check if SPAD0 is cleared. If yes, it means this was a hard reset */
movl $0x800080d0, %eax
movw $0xcf8, %dx
outl %eax, %dx
addw $4, %dx
inl %dx, %eax
cmp $0, %eax
je no_reset
/* perform hard reset */
movw $0xcf9, %dx
movw $0x06, %ax
outw %ax, %dx
loop0: hlt
jmp loop
no_reset:
/* Read the semaphore register of i5000 (BOFL0). /* Read the semaphore register of i5000 (BOFL0).
If it returns zero, it means there was already If it returns zero, it means there was already
another read by another CPU */ another read by another CPU */
@@ -25,5 +45,14 @@
loop: hlt loop: hlt
jmp loop jmp loop
1: /* Restore BIST */ 1: /* set magic value for soft reset detection */
movl $0x800080d0, %eax
movw $0xcf8, %dx
outl %eax, %dx
addw $4, %dx
movl $0x12345678, %eax
outl %eax, %dx
/* Restore BIST */
mov %ebp, %eax mov %ebp, %eax