summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRonald G. Minnich <rminnich@gmail.com>2009-09-17 00:28:29 +0000
committerRonald G. Minnich <rminnich@gmail.com>2009-09-17 00:28:29 +0000
commitb796a06cc6daa6cc7ee379fb64faa854f06556ff (patch)
tree586c07875a8b7f350f7eeff388dcc08092ef21b4
parent3f76a567953764d56eb50065577955c8b2db11f1 (diff)
This is a patch for killing IPMI on the s1850 -- or at least geting the BMC
out of the way of the serial port. Tested extensively in user mode. Works and gets the BMC out of my way, which is good, because there are few more useless things than IPMI and the BMC. The BMC, all by itself, is the cause of most of our problems in booting and talking to these nodes. Signed-off-by: Ronald G. Minnich <rminnich@gmail.com> Acked-by: Peter Stuge <peter@stuge.se> git-svn-id: svn://svn.coreboot.org/coreboot/trunk@4640 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
-rw-r--r--src/mainboard/dell/s1850/auto.c102
1 files changed, 102 insertions, 0 deletions
diff --git a/src/mainboard/dell/s1850/auto.c b/src/mainboard/dell/s1850/auto.c
index a32df1ec4d..0e07300856 100644
--- a/src/mainboard/dell/s1850/auto.c
+++ b/src/mainboard/dell/s1850/auto.c
@@ -74,6 +74,107 @@ static inline int spd_read_byte(unsigned device, unsigned address)
#include "sdram/generic_sdram.c"
+/* IPMI garbage. This is all test stuff, if it really works we'll move it somewhere
+ */
+
+#define nftransport 0xc
+
+#define OBF 0
+#define IBF 1
+
+#define ipmidata 0xca0
+#define ipmicsr 0xca4
+
+
+static inline void ibfzero(void)
+{
+ while(inb(ipmicsr) & (1<<IBF))
+ ;
+}
+static inline void clearobf(void)
+{
+ (void) inb(ipmidata);
+}
+
+static inline void waitobf(void)
+{
+ while((inb(ipmicsr) & (1<<OBF)) == 0)
+ ;
+}
+/* quite possibly the stupidest interface ever designed. */
+static inline void first_cmd_byte(unsigned char byte)
+{
+ ibfzero();
+ clearobf();
+ outb(0x61, ipmicsr);
+ ibfzero();
+ clearobf();
+ outb(byte, ipmidata);
+}
+
+static inline void next_cmd_byte(unsigned char byte)
+{
+
+ ibfzero();
+ clearobf();
+ outb(byte, ipmidata);
+}
+
+static inline void last_cmd_byte(unsigned char byte)
+{
+ outb(0x62, ipmicsr);
+
+ ibfzero();
+ clearobf();
+ outb(byte, ipmidata);
+}
+
+static inline void read_response_byte(void)
+{
+ int val = -1;
+ if ((inb(ipmicsr)>>6) != 1)
+ return;
+
+ ibfzero();
+ waitobf();
+ val = inb(ipmidata);
+ outb(0x68, ipmidata);
+
+ /* see if it is done */
+ if ((inb(ipmicsr)>>6) != 1){
+ /* wait for the dummy read. Which describes this protocol */
+ waitobf();
+ (void)inb(ipmidata);
+ }
+}
+
+static inline void ipmidelay(void)
+{
+ int i;
+ for(i = 0; i < 1000; i++) {
+ inb(0x80);
+ }
+}
+
+static inline void bmc_foad(void)
+{
+ unsigned char c;
+ /* be safe; make sure it is really ready */
+ while ((inb(ipmicsr)>>6)) {
+ outb(0x60, ipmicsr);
+ inb(ipmidata);
+ }
+ first_cmd_byte(nftransport << 2);
+ ipmidelay();
+ next_cmd_byte(0x12);
+ ipmidelay();
+ next_cmd_byte(2);
+ ipmidelay();
+ last_cmd_byte(3);
+ ipmidelay();
+}
+
+/* end IPMI garbage */
static void main(unsigned long bist)
{
/*
@@ -100,6 +201,7 @@ static void main(unsigned long bist)
}
}
/* Setup the console */
+ bmc_foad();
outb(0x87,0x2e);
outb(0x87,0x2e);
pnp_write_config(CONSOLE_SERIAL_DEV, 0x24, 0x84 | (1 << 6));