From 43225bc8042b32d52b31c788daee1e42bd1fa28e Mon Sep 17 00:00:00 2001 From: "Ronald G. Minnich" Date: Tue, 22 Nov 2005 00:07:02 +0000 Subject: EPIA-M fixup git-svn-id: svn://svn.coreboot.org/coreboot/trunk@2090 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1 --- HOWTO/EPIA-M-howto | 593 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 593 insertions(+) create mode 100644 HOWTO/EPIA-M-howto (limited to 'HOWTO') diff --git a/HOWTO/EPIA-M-howto b/HOWTO/EPIA-M-howto new file mode 100644 index 0000000000..275cc91444 --- /dev/null +++ b/HOWTO/EPIA-M-howto @@ -0,0 +1,593 @@ + +This HOWTO contains instructions for using LinuxBIOSv2 on the VIA EPIA-M and MII +mini-itx based motherboards. + +Version 1.0 initial write for LinuxBIOSv2 by Nick Barker + +Using materials and inspiration from +- EPIA HOWTO for freebios/linuxbios by Mark Wilkinson +- Based on the K7SEM HOWTO by Brenden Bixler, +- which is based on the Sis 630 HOWTO by Ron Minnich. +- Getting Started with freebios2 - a mail posting by Jay Miller + +Unfortunately, there is a step in this HOWTO that could be hazardous. The +hazards include (but are not limited to) + 1) destroying your motherboard + 2) hurting yourself + 3) killing yourself + +Because of these hazards, you must take full responsibility if you +decide to install LinuxBIOSv2 following these procedures. Neither the +author of this HOWTO or any organisation or individual associated with +the LinuxBIOSv2 project can be held responsible for any adverse consequences +of your attempt to follow these procedures. + +WARNING: We assume you've built kernels, know how to open up your PC, +and how to yank the flash part out while power is on and put in a +different part. There is NO WARRANTY, express or implied, with this +software. In fact, if you don't know what you're doing, and you get +careless, you're going to end up with a nice paperweight instead of a +motherboard, an emergency room bill, or a funeral service. + + YOU HAVE BEEN WARNED. + +Additional information available at: http://www.linuxbios.org/ + +Linux distribution: Most modern distributions are supported. + +Other software notes: You MUST have 'as' version 2.9.5 or later. + You MUST have 'gcc' version other than 2.96. + + +Pre-requisites +-------------- + +Before you start there are a few things which you need to arrange: + +Since you are going to be re-programming the flash rom on the mainboard, and +it is likely that you first few attempts / images will not be right, then +you need a way of restoring a known working bios onto a board which is otherwise +dead. + +Recommended: you might want to get a Bios Saviour (RD1-PL) - this is +a handy little piggy-back flash chip that saves you destroying the original +flash image. This howto assumes that you have this device, though other methods +and devices exist for programming flash roms. + +LinuxBIOSv2 sends debugging output through the first serial port. You might want +to arrange a null modem serial cable for connecting this serial port to a +second computer running a terminal emulation program. I use 'microcom' which +is simple and allows all output to be captured into a file for later analysis. +The port is set up to use 115200 baud, 8bit, No parity, 1 stop bit. + +Under LinuxBIOSv2 you have a choice of 'payloads'. The payload is the program +which LinuxBIOSv2 hands over to once it has finished initialising everything +on the mainboard at boot time. The payload is included in the flash rom along +with LinuxBIOSv2, and usually its function is to locate and load the operating +system. The 2 most common payloads are FILO, for booting Linux off an IDE +disk, and Etherboot for booting a diskless workstation accross a network. +This howto assumes the use of FILO. + +A vga bios image. LinuxBIOS2v2 uses the vga bios of the original Via BIOS to +initialise the vga. It is not directly downloadable, but you can capture it from +a system running with the original bios, so you might as well capture it now: + dd if=/dev/mem of=/video.bios.bin \ + bs=1 count=65536 skip=790528 + + +Getting Going +------------- + +The steps for loading LinuxBIOSv2 are simple: +1) Get Linux installed on your machine. +2) Download and install LinuxBIOSv2 sources. +3) Understand how to flash your rom. +4) Download, Configure and build the FILO payload +5) Configure and build LinuxBIOSv2. +6) Burn the LinuxBIOSv2 image to the flash. +7) Reset the machine -- did it work? + +Options Once it has booted + i) Speeding up the boot + ii) Enhancing ACPI support +iii) On EPIA-MII, booting the computer from on-board compact flash + + +Step 1) + Get Linux installed on your LinuxBIOSv2 machine. + Don't forget to note which partition is / (/dev/hda3 etc.) + + +Step 2) + Grab the LinuxBIOSv2 source. + cd to the directory you want the source tree to be. + + Note: this will create a sub directory called LinuxBIOSv2 which contains + the LinuxBIOSv2 source code + + Download the latest code for LinuxBIOSv2 from the downloads page at + http://www.linuxbios.org + + + having expanded the tarball, cd into the LinuxBIOSv2 directory and browse around. + The top level directory includes: + + 'src' - where all of the source files for LinuxBIOSv2 are located. + 'targets' - where all of the platform specific configuration files + for each platform supported by LinuxBIOSv2 are kept, and + where the build files and build process occur. + 'util' - where various utilities required for the build process + and debugging are kept. + + + Hereafter, this howto refers to directory locations relative to these directories, + unless an absolute pathlist is given. + +Step 3) + Whilst getting LinuxBIOSv2 going on your EPIA-M, you are almost + certainly going to be re-programming the flash rom several times, and + there is a very high probability that at one of these stages you will + get a flash rom that fails to boot your mainboard into Linux. + + Before we proceed any further, it is absolutley vital that you have + worked out how to program the flash chip, and how you are going to + get back to your original bios when things go wrong. Otherwise you + will end up with a very expensive paper weight as described earlier. + + You can use a professional Data I/O burner, or you can be foolhardy + and simply re-program the flash part of a running machine. However + whilst getting going a BIOS SAVIOUR RD1-PL is a very inexpensive + but effective device for ensuring that you always have a working + BIOS to hand. + + The bios saviour is a little device which plugs into the flash rom + socket of the motherboard, and the original flash rom then plugs into + the bios saviour. The bios saviour includes a second flash rom chip, + and either of these chips can be selected as the active chip by a + simple supplied electrical switch mounted on flying leads. Make + sure that this switch is clearly visible, so that you know which + chip you are booting from, and which chip you are about to re-program. + + Decide which chip you are going to use for LinuxBIOSv2, and which chip + you are going to keep the original working bios in, and mark them + clearly on this switch. + + In the 'util/flash_and_burn' directory is the source for the 'flash_rom' + utility, which is great for re-programming the flash chips on the + EPIA-M / MII. Once you have built this utility: + + Make sure that it can detect both flash chips on the bios saviour: + with switch set to chip 1 run 'flash_rom' + flash rom should search through a list of known flash rom + device types until it finds the type of the original chip + from your EPIA-M, and report what it has found. + + with the switch set to chip 2, run 'flash_rom' again and confirm + that it can 'see' the second flash chip. + + If your are lucky, the actual part number of the 2 chips may + be different, which you can use just prior to re-programming + a chip to make sure you are programming the right chip. + + Make sure that you can read / write and verify a flash chip: + with switch set to 1 (original BIOS) run + 'flash_rom -r original.rom' + this should read the contents of the original bios into the + file original.rom + + confirm that the newly read file matches the original bios + 'flash_rom -v original.rom' + + set the switch to 2 + confirm if you can that flash_rom 'sees' the second chip + 'flash_rom' - and look for the detected device type + + write the known good bios to the second chip with + 'flash_rom -w original.bios' + + verify that it has written correctly + 'flash_rom -v original.rom' + + with switch left at position 2, reboot the machine and make + sure that it comes up corectly. If it does then you now have + a working flash programming environment. If it does not, then + set the switch back to 1, reboot the machine, and investigate + further. + +Step 4) + Download FILO from http://felixx.tsn.or.jp/~ts1/filo, and expand + + In the FILO source directory, type 'make' + + The first invocation of make builds the default Config file, which + should be edited to meet your needs. In particular look at the line: + + "AUTOBOOT_FILE ...." + + and make sure that it looks sensible for your setup. The line + AUTOBOOT_FILE "hda1:/vmlinuz root=/dev/hda2 console=ttyS0,115200" + reads as: + - find a linux os image on device hda partion 1 called vmlinuz, + - load this image + - execute the image passing kernel command line parameters of: + "root=/dev/hda2 console=ttyS0,115200" + + after editing Config, type 'make' again, and this will build the file + 'filo.elf' which is the payload we will be using. + + Copy this file to somewhere which the LinuxBIOSv2 makefile can easily + find it. I just tend to keep it in the root directory though I'm sure + others will condem me for that practise: + 'cp filo.elf /' + + Make sure that you have compiled a kernel bzImage, and copied it to + the file location you identified in the FILO Config file. + + +Step 5) + The next step is to create the build environment for the epia-m. This + step creates the appropriate makefiles and build directories for the + epia-m. + + 'cd targets' + './buildtarget via/epia-m' + + This step will create a subdirectory in the targets/via/epia-m + directory called epia-m, which is the build directory for LinuxBIOSv2. + + The main configuration file for the epia-m is in + 'targets/via/epia-m/Config.lb' + + If you need to make any changes to the configuration, for example you wish to + locate filo.elf in a place other than '/filo.elf', or during the more advanced + steps of this HOWTO, then these changes are made to this file. + + You need to re-run the './buildtartegt via/epia-m' after any such change. + + The directory 'targets/via/epia-m' contains other sample Config.lb files, any + of which can be copied through to Config.lb in order to become the current + configuration. + + Once you have your Config.lb set up to your needs, and the build environment + created with './buildtarget', it is time to build a rom image. + + Change directory into the build directory 'targets/via/epia-m/epia-m' + + The configuration as set up by the buildtarget process will create a LinuxBIOS + which is exactly 196608 bytes long, which is exactly 64K bytes short of what + needs to go into the 256K flash rom. The other 64K is for your vga bios + which is simply merged with the linuxbios image. The easiest way to make this + happen is to edit the Makefile and change the line + + cat fallback/linuxbios.rom > linuxbios.rom + + to + + cat /video.bios.bin fallback/linuxbios.rom >linuxbios.rom + + Note: the above order of merging the files together is critical + + You will need to remember to make this change every time after you have run + the buildtarget program. + + Type 'make', and wait for the build process to complete. + + If all went well, then you should find a file 'linuxbios.rom' in your + current directory. Check that it is 262144 bytes long - i.e. exactly the right + size for the flash rom chip in your EPIA-M / MII. + + + +Step 6) + NOTE: BE ADVISED THAT THIS STEP CAN KILL YOUR MOTHERBOARD ! + IF YOU DO NOT HAVE A MEANS OF RECOVERING FROM FLASHING YOUR BIOS, + YOU MAY/WILL BE LEFT WITH A DEAD MACHINE. + + + Assuming that you are using a Bios Saviour, make sure that the switch is set + to the position for your LinuxBIOSv2 image. + + Type 'flash_rom' to make sure it can see the flash chip, and verify its type if + possible. + + Only once you are happy that you are about to re-programme the desired chip, type + 'flash_rom -w linuxbios.rom', and wait the few seconds it takes to program it. + + Once it has finished, verify that the chip was re-rogrammed correctly - type + 'flash_rom -v linuxbios.rom' + + + +Step 7) + Power cycle the machine. LinuxBIOSv2 should come up in a few seconds. + + With a connection to the serial port set at 115200, you should see LinuxBIOSv2 + come up, launch FILO, and if you have a timeout set in FILO, then it may be + waiting for you to confirm its boot command line. + + As long as you have this command line set up correctly, and an os image in the + right place, then FILO should proceed to boot into your Linux os. + + If you do, CONGRATULATIONS ! It WORKED ! Pat yourself on the back, + why not try the optional steps now ? + + If you don't, time to start capturing the output of the serial port + and talking to the linuxbios mailing list. + + +Optional steps - for use only if step 7 was successfull. + +OK so now we have a BIOS which boots your computer fully into the operating system, and +depending upon your needs that may be all that you want. However LinuxBIOSv2 has a few more +tricks up its sleeve should you find yourself hungry for more. + +Speeding up the boot +-------------------- + +Linuxbios sends its debugging output to the first serial port and, depending upon the amount of debug +output selected, can be the limiting factor in the speed with which it boots your computer - regardless +of whether you have anything attached to the serial port. + +Linuxbios uses the notion of debug levels to control what is sent to the serial port. These levels +range from 0 to 9 with 0 being the least verbose and 9 being the most verbose. + +These levels are defined in the Config.lb file described earlier. To reduce the output set: + option MAXIMUM_CONSOLE_LOGLEVEL=8 + option DEFAULT_CONSOLE_LOGLEVEL=8 +to lower values. + +Next you will have to run 'buildtarget' again to propagate the effects of the config change. +Then edit your Makefile again to include your video bios in the final merging. + +Then run 'make clean' followed by 'make'. + + +Advanced ACPI +------------- + + LinuxBIOSv2 now supports ACPI on the epia-m and epia-m II. In particular the interrupt + processing in Linux can be done through ACPI, and crude power management support + is provided. This includes software power off, and power management events from the + power button. + + It is possible to enhance this behaviour to provide the full capabilities of the + original BIOS, which includes different sleep levels and wake from these levels + upon certain events. This is achieved by using a 'grabbed' copy of the ACPI + Differentiated System Descriptor Table or DSDT from the original BIOS. + + For copyright reasons this table cannot be included with the source distribution + of LinuxBIOSv2. + + + You MUST have 'iasl' - Intel's ACPI Asl compiler for Unix/Linux - + http://developer.intel.com/technology/iapc/acpi/downloads.htm. + + + To replace the LinuxBIOSv2 DSDT with the grabbed one from the original BIOS: + + - Start the computer using the original BIOS, and make sure that you + have ACPI set up in the kernel that you are running + + - Grab the DSDT table - 'cat /proc/acpi/dsdt >dsdt.aml' + - Convert to asl code - 'iasl -d dsdt.aml' (creates dsdt.dsl) + - Convert it to a C hex table - 'iasl -tc dsdt.dsl' (creates dsdt.hex) + - Replace the file 'src/mainboard/via/epia-m/dsdt.c with dsdt.hex + + Now re-build LinuxBIOSv2, re-program the flash and power cycle. + + If you wish to return to the LinuxBIOSv2 DSDT, then the original file dsdt.asl can be converted + into a C hex file using 'iasl -tc dsdt.asl' + + + +Boot from Onboard Compact Flash (MII only) +------------------------------------------ + + LinuxBIOSv2 now supports the onboard compact flash on the MII as an IDE drive, + and it is possible to boot directly from this drive using the following steps. + + The first step is to get Filo or whatever payload you are using to recognise + and use this device. + + In order that the pcmcia subsystem of the Linux kernel can correctly configure + the device later on in the boot process the CF is set up with its I/O + registers in a contiguous block of 16 bytes at 0x1e0 through 0x1ef. Unfortunately + this is not a standard IDE address which is why we need to 'fix' filo to use it. + (Actually it is half of the address range used by IDE4, and so we need to + be careful to tell the kernel not to probe that address - more on that later). + + The first step is to change the filo Config file. + 1) Comment out SUPPORT_PCI=1. This line instructs filo to search for PCI based IDE + adapters only, and the CF is not attached to a PCI based IDE controller. + 2) Add the following two lines somewhere in the Config file: + IDE2_CMD = 0x1e0 + IDE2_CNTRL =0x1ec + + + The second step is to modify the file drivers/ide.c in the filo source directory. + Find the function 'find_ide_controller_compat' and change it to look like + + static int find_ide_controller_compat(struct controller *ctrl, int index) + { + if (index >= IDE_MAX_CONTROLLERS) + return -1; + #ifdef IDE2_CMD + if(index == 2){ + ctrl->cmd_base = IDE2_CMD; + ctrl->ctrl_base = IDE2_CNTRL; + return 0; + } + #endif + ctrl->cmd_base = ide_base[index]; + ctrl->ctrl_base = ide_base[index] + IDE_REG_EXTENDED_OFFSET; + return 0; + } + Filo will now recognise the CF as the first device on the third IDE controller + (i.e. ide2), and can be referred to as 'hde' + + + The next step is to create an initrd file for your Linux kernel. What? Why? + The CF socket on your MII is hardwired to the PCMCIA controller and for all intents + and purposes it is a PCMCIA device. This means that once Linux boots it will be under + the control of the pcmcia manager. Now according to the pcmcia-utils documentation, + the pcmcia manager is intended to control and configure devices on an already + running system. Yet if we need the CF to be the root device, it needs to be mounted + very early on in the boot sequence, before the stage where pcmcia devices would normally + be configured. The answer is to use an initrd file to get the pcmcia manager running early + for the CF. If you are unfamiliar with initrd then 'man initrd' will give you more background. + + + The easiest way to create an initrd is to use the script 'mkcfinitrd' which is at the bottom + of this howto. This is a tailored version of the 'pcinitrd' script from the pcmcia-utils package. + Make sure that 'ash' is available on your system as this is the tiny shell programme used during + the initrd phase of booting. + + It is worth mounting the initrd generated, and looking over it to make sure that + it contains all of the modules necessary to load and initialise the CF. It does not + need drivers for whatever you use in the pcmcia socket, as that can be initialised + later on in the boot process as before. + + Finally gzip the file created, and move it alongside your kernel. + + Next adjust your FILO command line to pick things up from the CF. My linux command + line in filo looks like: + + AUTOBOOT_FILE = "hde:/vmlinuz initrd=hde:/initrd.gz root=/dev/hde console=tty0 ide4=noprobe" + + The ide4=noprobe option is required to stop the kernel from probing the address used + by the CF. As this address is half that used as the standard address for a fifth (i.e. ide4) + controller, the kernel hangs whilst trying to initialise this device if this option + is not given. + + Finally make sure that you have copied the necessary files onto your CF, and re-boot + your computer. + + + +******************* mkcfinitrd script ************************************** +#!/bin/sh +# +# Utility for constructing CF initrd for Epia-MII CF Boot +# +# Copyright (C) 2005 Nick Barker -- nick.barker9@btinternet.com +# +# Based on pcinitrd +# Copyright (C) 1999 David A. Hinds -- dahinds@users.sourceforge.net + +SIZE=2400 +MODULES="pcmcia/pcmcia_core.o pcmcia/ds.o pcmcia/yenta_socket.o" +BLK="kernel/drivers/ide/legacy/ide-cs.o" +KERNEL=`uname -r` +MODDIR=/lib/modules/$KERNEL +BIN="bin/mount bin/umount sbin/insmod sbin/cardmgr" +LIB=`ls /lib/libc.so.? | sort | tail -1` +ETC="/etc/ld.so.cache /etc/pcmcia/config /etc/pcmcia/config.opts" +DEV="/dev/console /dev/null /dev/ram /dev/tty1 /dev/tty2 /dev/tty3 /dev/tty4" +MNT=/tmp/initrd.mnt + +# name of the initrd file to make +TARGET=/tmp/initrd + +fail() +{ + umount $MNT + rmdir $MNT + exit 1 +} +trap fail SIGTERM SIGINT + +strip_cp() +{ + if [ -d $3 ] ; then + DEST=$3/`basename $2` + else + DEST=$3 + fi + strip $1 --verbose -o $DEST $2 | sed -e 's/([^ ]*)//g' || fail +} + +mkdir --verbose $MNT || exit 1 + +echo "Creating filesystem on $TARGET" +if [ -b $TARGET ] ; then + rm $TARGET || fail +fi + +dd if=$ROOT/dev/zero of=$TARGET bs=1k count=$SIZE +echo "y" | mke2fs $TARGET $SIZE >/dev/null || fail +mount --verbose -t ext2 -o loop $TARGET $MNT || fail + + +rm -rf $MNT/lost+found +echo "Creating Directories on $TARGET" +for DIR in bin dev etc lib proc tmp mnt ; do + mkdir --verbose $MNT/$DIR || fail +done +for DIR in block misc fs net pcmcia ; do + mkdir --verbose $MNT/lib/$DIR || fail +done + +echo "Copying Files to $TARGET" +for F in $DEV ; do + cp -a --verbose /$F $MNT/dev || fail +done +if [ -e /dev/systty ] ; then + cp -a --verbose /dev/systty $MNT/dev || fail +fi + +for F in $BIN ; do + strip_cp --strip-all /$F $MNT/bin +done +strip_cp --strip-all /bin/ash $MNT/bin/sh + +for F in $LIB ; do + strip_cp --strip-debug /$F $MNT/lib +done +cp --verbose /lib/ld-linux.so.? $MNT/lib || fail + +for F in $ETC ; do + cp --verbose /$F $MNT/etc || fail +done +for F in scsi network ftl ide memory serial ; do + touch $MNT/etc/$F ; chmod +x $MNT/etc/$F +done + +for MOD in $MODULES ; do + strip_cp --strip-debug $MODDIR/$MOD $MNT/lib/$MOD +done + +strip_cp --strip-debug $MODDIR/$BLK $MNT/lib/block/ide-cs.o + +echo "Creating linuxrc startup script" +cat > $MNT/linuxrc <<- 'EOF' + #!/bin/sh + + mount -t proc /proc /proc + + echo "" + echo "==== initrd: starting PCMCIA services ====" + echo "" + PC=/lib/pcmcia + insmod $PC/pcmcia_core.o + insmod $PC/yenta_socket.o + insmod $PC/ds.o + insmod /lib/block/ide-cs.o + if [ "$DEBUG" != "" ] ; then V=-v ; fi + cardmgr $V -q -o -c /etc -m /lib -s /tmp/stab -p /tmp/pid + umount /proc + echo "" + + if [ "$DEBUG" != "" ] ; then + /bin/sh < /dev/console + fi +EOF +chmod +x $MNT/linuxrc + +df -P $MNT | awk '/tmp/ { printf "%dK/%dK used\n",$3,$2 }' +umount $VERBOSE $MNT +rmdir $MNT +echo "Finished $TARGET" +echo "Now gzip $TARGET to create final initrd.gz" +exit 0 + +*************************** end mkcfinitrd *********************************** \ No newline at end of file -- cgit v1.2.3