EPIA-M serial port 1/2 baud rate insanity

Dave Ashley linuxbios at xdr.com
Thu Dec 18 13:31:01 CET 2003


Here is what I did to integrate this into linuxbios. I
created the following file
src/mainboard/via/epia-m/smbusenable.inc
/* Useful macros PCIBUS, and SMBUS functions for getting DRAM going. */
/* courtesy Eric Biederman of linuxnetworx.com */

#define CS_WRITE_BYTE(addr, byte) \
        movl $addr, %eax        ; \
        movl $byte, %edx        ; \
        PCI_WRITE_CONFIG_BYTE

#define CS_WRITE_WORD(addr, word) \
        movl $addr, %eax        ; \
        movl $word, %ecx        ; \
        PCI_WRITE_CONFIG_WORD

#define CS_WRITE_LONG(addr, dword) \
        movl $addr, %eax        ; \
        movl $dword, %ecx       ; \
        PCI_WRITE_CONFIG_DWORD

#define DEVFN(device, function) (((device) << 3) + (function))
#ifndef CONFIG_ADDR
#define CONFIG_ADDR(bus,devfn,where) (((bus) << 16) | ((devfn) << 8) | (where))
#endif

/* generic SMB routines that work for many systems. The only one that might
 * not work is the enable_smbus. 
 * you have to define PM_FUNCTION for this to work. 
 */#define SMBUS_IO_BASE 0xf00
#define SMBHSTSTAT 0
#define SMBHSTCTL  2
#define SMBHSTCMD  3
#define SMBHSTADD  4
#define SMBHSTDAT0 5
#define SMBHSTDAT1 6
#define SMBBLKDAT  7

/* (DA) Lines added to get this to compile */
#define PM_DEVFN CONFIG_ADDR(0,0x11*8,0)
#define DRAM_CONFIG_PORT 0x5a
#define SMBUS_MEM_DEVICE_0 0x50
#define LAST_SMBUS_MEM_DEVICE  SMBUS_MEM_DEVICE_0
#define REGISTERED_DRAM_REGISTER $0x69
#define REGISTERED_DRAM $0x2d
#define NONREGISTERED_DRAM $0


        /* put the SMBUS at port 0xf00 + enable*/
        CS_WRITE_WORD(PM_DEVFN+ 0xd0, SMBUS_IO_BASE|1)   /* iobase addr */
        CS_WRITE_BYTE(PM_DEVFN + 0xd2, (0x4 << 1) | 1)      /* smbus enable */
        CS_WRITE_WORD(PM_DEVFN + 0x4, 1)                    /* iospace enable */

/* The VT1211 serial port needs 48 mhz clock, on power up it is getting
   only 24 mhz, there is some mysterious device on the smbus that can
   fix this...this code below does it. */


#define MYOUTB(val, port) movb val, %al; movw port, %dx ; outb %al, %dx

#define  I2C_TRANS_CMD          0x40
#define  CLOCK_SLAVE_ADDRESS    0x69

        MYOUTB( $0xff, $(SMBUS_IO_BASE+SMBHSTSTAT))
        MYOUTB( $0x7f, $(SMBUS_IO_BASE+SMBHSTDAT0))
        MYOUTB( $0x83, $(SMBUS_IO_BASE+SMBHSTCMD))
        MYOUTB( $(CLOCK_SLAVE_ADDRESS<<1), $(SMBUS_IO_BASE+SMBHSTADD))
        MYOUTB( $(8 | I2C_TRANS_CMD), $(SMBUS_IO_BASE+SMBHSTCTL))
        movw $(SMBUS_IO_BASE+SMBHSTSTAT), %dx
smbwait1:
        inb %dx, %al
        and  $1, %al
        jnz smbwait1


----- Now in src/mainboard/via/epia-m/Config we need to include the above
file, so it ends up looking like this:
mainboardinit mainboard/via/epia-m/smbusenable.inc
mainboardinit superio/via/vt1211/setup_serial.inc
mainboardinit pc80/serial.inc


-Dave



More information about the coreboot mailing list