[coreboot] [PATCH 2/2] SerialICE patch
Tadas Slotkus
devtadas at gmail.com
Mon Jul 4 20:48:36 CEST 2011
Add serial init function example to use coreboot early serial funcions
Add selection which cpuid or msr functions to use (coreboot's or
serialice's)
Addapt for coreboot
Signed-off-by: Tadas Slotkus <devtadas at gmail.com>
---
src/arch/x86/SerialICE/io.h | 8 +++---
src/arch/x86/SerialICE/serial.c | 23 ++++++++++++---------
src/arch/x86/SerialICE/serialice.c | 39
++++++++++++++++++++++++-----------
3 files changed, 44 insertions(+), 26 deletions(-)
diff --git a/src/arch/x86/SerialICE/io.h b/src/arch/x86/SerialICE/io.h
index a47feef..efc0fe6 100644
--- a/src/arch/x86/SerialICE/io.h
+++ b/src/arch/x86/SerialICE/io.h
@@ -21,7 +21,7 @@
#define IO_H
/* Memory functions */
-
+#if 0
static inline u8 read8(unsigned long addr)
{
return *((volatile u8 *)(addr));
@@ -125,8 +125,8 @@ static inline u32 inl(u16 port)
/* MSR functions */
typedef struct { u32 lo, hi; } msr_t;
-
-static inline msr_t rdmsr(u32 index, u32 key)
+#endif
+static inline msr_t _rdmsr(u32 index, u32 key)
{
msr_t result;
__asm__ __volatile__ (
@@ -137,7 +137,7 @@ static inline msr_t rdmsr(u32 index, u32 key)
return result;
}
-static inline void wrmsr(u32 index, msr_t msr, u32 key)
+static inline void _wrmsr(u32 index, msr_t msr, u32 key)
{
__asm__ __volatile__ (
"wrmsr"
diff --git a/src/arch/x86/SerialICE/serial.c
b/src/arch/x86/SerialICE/serial.c
index 9aaecb6..1181aff 100644
--- a/src/arch/x86/SerialICE/serial.c
+++ b/src/arch/x86/SerialICE/serial.c
@@ -17,6 +17,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
02110-1301 USA
*/
+#if 0
/* Data */
#define UART_RBR 0x00
#define UART_TBR 0x00
@@ -34,22 +35,23 @@
#define UART_LSR 0x05
#define UART_MSR 0x06
#define UART_SCR 0x07
-
+#endif
/* SIO functions */
+/* Early serial includes and defines */
+#include <device/pnp_def.h>
+#include <superio/winbond/w83977tf/early_serial.c>
+#define SERIAL_DEV PNP_DEV(0x3f0, W83977TF_SP1)
+#include <console/console.h>
+
+#define sio_putc __console_tx_byte
+#define sio_getc __console_rx_byte
static void sio_init(void)
{
- int divisor = 115200 / SIO_SPEED;
- int lcs = 3;
- outb(0x00, SIO_PORT + UART_IER);
- outb(0x01, SIO_PORT + UART_FCR);
- outb(0x03, SIO_PORT + UART_MCR);
- outb(0x80 | lcs, SIO_PORT + UART_LCR);
- outb(divisor & 0xff, SIO_PORT + UART_DLL);
- outb((divisor >> 8) & 0xff, SIO_PORT + UART_DLM);
- outb(lcs, SIO_PORT + UART_LCR);
+ w83977tf_enable_serial(SERIAL_DEV, CONFIG_TTYS0_BASE);
}
+#if 0
static void sio_putc(u8 data)
{
while (!(inb(SIO_PORT + UART_LSR) & 0x20)) ;
@@ -69,6 +71,7 @@ static u8 sio_getc(void)
#endif
return val;
}
+#endif
/* SIO helpers */
diff --git a/src/arch/x86/SerialICE/serialice.c
b/src/arch/x86/SerialICE/serialice.c
index 35531dc..a503cb9 100644
--- a/src/arch/x86/SerialICE/serialice.c
+++ b/src/arch/x86/SerialICE/serialice.c
@@ -18,15 +18,27 @@
*/
#include <types.h>
-#include <serialice.h>
-#include <io.h>
+
+//#define use_coreboot_stuff 1
+#ifdef use_coreboot_stuff
+#include <arch/cpu.h>
+#include <cpu/x86/msr.h>
+#define _rdmsr(addr, key) rdmsr(addr)
+#define _wrmsr(addr, msr, key) wrmsr(addr, msr)
+#define cpuid_eax(eax, ecx) cpuid_eax(eax)
+#define cpuid_ebx(eax, ecx) cpuid_ebx(eax)
+#define cpuid_ecx(eax, ecx) cpuid_ecx(eax)
+#define cpuid_edx(eax, ecx) cpuid_edx(eax)
+#else
+#include "io.h"
+#endif
/* SIO functions */
#include "serial.c"
/* Hardware specific functions */
-#include "chipset.c"
+//#include "chipset.c"
/* Accessor functions */
@@ -123,7 +135,7 @@ static void serialice_read_msr(void)
sio_putc('\r'); sio_putc('\n');
- msr = rdmsr(addr, key);
+ msr = _rdmsr(addr, key);
sio_put32(msr.hi);
sio_putc('.');
sio_put32(msr.lo);
@@ -146,7 +158,7 @@ static void serialice_write_msr(void)
#ifdef __ROMCC__
/* Cheat to avoid register outage */
- wrmsr(addr, msr, 0x9c5a203a);
+ _wrmsr(addr, msr, 0x9c5a203a);
#else
wrmsr(addr, msr, key);
#endif
@@ -191,21 +203,22 @@ static void serialice_mainboard(void)
sio_putc('\r'); sio_putc('\n');
/* must be defined in mainboard/<boardname>.c */
- sio_putstring(boardname);
+// sio_putstring(boardname);
}
static void serialice_version(void)
{
- sio_putstring("\nSerialICE v" VERSION " (" __DATE__ ")\n");
+// sio_putstring("\nSerialICE v" VERSION " (" __DATE__ ")\n");
}
-int main(void)
+int serialice_main(void)
{
- chipset_init();
+// chipset_init();
sio_init();
+ console_init();
+// serialice_version();
- serialice_version();
while(1) {
u16 c;
@@ -246,12 +259,14 @@ int main(void)
case (('v' << 8)|'i'): // Read version info *vi
serialice_version();
break;
+ case (('q' << 8)|'i'): // quit *qi
+ goto quits;
+ break;
default:
sio_putstring("ERROR\n");
break;
}
}
-
- // Never get here:
+quits:
return 0;
}
--
1.7.0.4
More information about the coreboot
mailing list