blaze: Create a nyan_blaze mainboard, copied from nyan_big
[coreboot.git] / documentation / CorebootBuildingGuide.tex
blob5b3eacf7783a35de260636a6bd63655980f90936
2 % This document is released under the GPL
3 % Initially written by Stefan Reinauer, <stepan@coresystems.de>
6 \documentclass[titlepage,12pt]{article}
7 \usepackage{a4}
8 \usepackage{graphicx}
9 \usepackage{url}
10 \usepackage[pdftex]{hyperref}
11 % \usepackage{makeidx}
12 % \makeindex
14 \hypersetup{
15 urlbordercolor={1 1 1},
16 menubordercolor={1 1 1},
17 linkbordercolor={1 1 1},
18 colorlinks=false,
19 % pdfpagemode=None, % PDF-Viewer starts without TOC
20 % pdfstartview=FitH,
21 pdftitle={coreboot on AMD64},
22 pdfauthor={Stefan Reinauer},
23 pdfsubject={coreboot configuration and build process},
24 pdfkeywords={coreboot, Opteron, AMD64, configuration, Build}
28 % \newcommand{\sh}[1]{\begin{verbatim}\texttt{#1}\end{verbatim}}
29 % \newcommand{\prog}[1]{\textit{#1}}
31 \setlength{\parindent}{0pt}
33 \title{coreboot on AMD64}
34 \author{Stefan Reinauer $<$stepan@coresystems.de$>$}
35 \date{April 19th, 2009}
37 \begin{document}
39 \maketitle
41 \thispagestyle{empty}
43 \tableofcontents
45 \newpage
48 % 1 Abstract
51 \section{Abstract}
53 This document targets porting coreboot to new mainboards and creating
54 custom firmware images using coreboot. It describes how to build
55 coreboot images for the AMD64 platform, including hypertransport
56 configuration and pertinent utilities. If you are missing information or
57 find errors in the following descriptions, contact
58 \href{mailto:stepan@coresystems.de}{\textit{Stefan Reinauer $<$stepan@coresystems.de$>$}}
62 % 2 Changes
65 \section{Changes}
66 \begin{itemize}
67 \item 2009/04/19 replace LinuxBIOS with coreboot
68 \item 2004/06/02 url and language fixes from Ken Fuchs $<$kfuchs@winternet.com$>$
69 \item 2004/02/10 acpi and option rom updates
70 \item 2003/11/18 initial release
71 \end{itemize}
76 % 3 What is coreboot
79 \section{What is coreboot?}
81 coreboot aims to replace the normal BIOS found on x86, AMD64, PPC,
82 Alpha, and other machines with a Linux kernel that can boot Linux from a cold
83 start. The startup code of an average coreboot port is about 500 lines of
84 assembly and 5000 lines of C. It executes 16 instructions to get into 32bit
85 protected mode and then performs DRAM and other hardware initializations
86 required before Linux can take over.
88 The projects primary motivation initially was maintenance of large
89 clusters. Not surprisingly interest and contributions have come from
90 people with varying backgrounds. Nowadays a large and growing number of
91 Systems can be booted with coreboot, including embedded systems,
92 Desktop PCs and Servers.
95 % 4 Build Requirements
98 \section{Build Requirements}
99 To build coreboot for AMD64 from the sources you need a recent Linux
100 system for x86 or AMD64. SUSE Linux 8.2 or 9.0 are known to work fine.
101 The following toolchain is recommended:
103 \begin{itemize}
104 \item GCC 3.3.1
105 \item binutils 2.14.90.0.5
106 \item Python 2.3
107 \item CVS 1.11.6
108 \end{itemize}
110 \textbf{NOTE:} Later versions should also work. Prior versions might lead to problems.
112 \newpage
115 % 5 Getting the Sources
118 \section{Getting the Sources}
120 The latest coreboot sources are available via subversion. The subversion
121 repository is maintained at SourceForge.net (the project name is
122 \emph{FreeBIOS}). First you should create a directory for your
123 coreboot trees:
125 { \small
126 \begin{verbatim}
127 $ mkdir coreboot
128 $ cd coreboot
129 \end{verbatim}
132 You can get the entire source tree via SVN:
134 { \small
135 \begin{verbatim}
136 $ svn co svn://coreboot.org/repos/trunk/coreboot-v2
137 \end{verbatim}
140 Once the source tree is checked out, it can be updated with:
142 { \small
143 \begin{verbatim}
144 % svn update
145 \end{verbatim}
148 For the case your corporate firewall blocks port 3690 (subversion) we set up a
149 snapshot site that keeps the last few hundred source code revisions. It
150 is available at \url{http://qa.coreboot.org/}.
151 Due to major structural enhancements to \hbox{coreboot}, AMD64 support
152 is only available in the \texttt{coreboot-v2} tree. This tree reflects (as
153 of November 2003) coreboot version 1.1.5 and will lead to coreboot 2.0
154 when finished. Most x86 hardware is currently only supported by the
155 coreboot 1.0 tree.
158 % 6 coreboot configuration overview
161 \section{coreboot configuration overview}
162 To support a large variety of existing hardware coreboot allows for a
163 lot of configuration options that can be tweaked in several ways:
165 \begin{itemize}
166 \item
167 Firmware image specific configuration options can be set in the image
168 configuration file which is usually found in
169 \texttt{coreboot-v2/targets/$<$vendor$>$/$<$mainboard$>$/}. Such
170 options are the default amount of output verbosity during bootup, image
171 size, use of fallback mechanisms, firmware image size and payloads
172 (Linux Kernel, Bootloader...) The default configuration file name is
173 \texttt{Config.lb}, but coreboot allows multiple configurations to
174 reside in that directory.
176 \item Mainboard specific configuration options can be set in the
177 mainboard configuration file placed in
178 \texttt{coreboot-v2/src/mainboard/$<$vendor$>$/$<$mainboard$>$}. The
179 mainboard configuration file is always called \texttt{Config.lb}. It
180 contains information on the onboard components of the mainboard like
181 CPU type, northbridge, southbridge, hypertransport configuration and
182 SuperIO configuration. This configuration file also allows to include
183 addon code to hook into the coreboot initialization mechanism at
184 basically any point.
186 \end{itemize}
188 This document describes different approaches of changing and configuring the
189 coreboot source tree when building for AMD64.
192 % 7 Building coreboot
195 \section{Building coreboot}
196 One of the design goals for building coreboot was to keep object files
197 out of the source tree in a separate place. This is mandatory for
198 building parallel coreboot images for several distinct mainboards
199 and/or platforms. Therefore building coreboot consists of two steps:
200 \begin{itemize}
201 \item
202 creating a build tree which holds all files automatically created by the
203 configuration utility and the object files
204 \item
205 compiling the coreboot code and creating a flashable firmware image.
206 \end{itemize}
208 The first of these two steps is accomplished by the \texttt{buildtarget}
209 script found in \texttt{coreboot-v2/targets/}. To build coreboot for
210 instance for the AMD Solo Athlon64 mainboard enter:
212 \begin{verbatim}
213 % cd coreboot-v2/targets
214 % ./buildtarget amd/solo
215 \end{verbatim}
217 This will create a directory containing a Makefile and other software
218 components needed for this build. The directory name is defined in the
219 firmware image specific configuration file. In the case of AMD's Solo
220 mainboard the default directory resides in
221 \texttt{coreboot-v2/targets/amd/solo/solo}. To build the coreboot image, do
223 \begin{verbatim}
224 % cd amd/solo/solo
225 % make
226 \end{verbatim}
228 The coreboot image filename is specified in the firmware image specific
229 configuration file. The default filename for AMD's Solo mainboard is
230 \texttt{solo.rom}.
233 % 8 Programming coreboot to flash memory
236 \section{Programming coreboot to flash memory}
237 The image resulting from a coreboot build can be directly programmed to
238 a flash device, either using a hardware flash programmer or by using the
239 Linux flash driver devbios or mtd. This document assumes that you use a
240 hardware flash programmer. If you are interested in doing in-system
241 software flash programming, find detailed information:
243 \begin{itemize}
244 \item \url{http://www.openbios.org/development/devbios.html} (/dev/bios)
245 \item \url{http://www.linux-mtd.infradead.org/} (Memory Technology Device Subsystem MTD)
246 \end{itemize}
248 \newpage
251 % 9 coreboot configuration
254 \section{coreboot configuration}
255 The following chapters will cope with configuring coreboot. All
256 configuration files share some basic rules
257 \begin{itemize}
258 \item
259 The default configuration file name in coreboot is \texttt{Config.lb}.
260 \item
261 All variables used in a configuration file have to be declared in this
262 file with \texttt{uses VARNAME} before usage.
263 \item
264 Comments can be added on a new line by using the comment identifier
265 \texttt{\#} at the beginning of the line.
266 \item
267 coreboot distinguishes between statements and options. Statements cause
268 the coreboot configuration mechanism to act, whereas options set
269 variables that are used by the build scripts or source code.
270 \item
271 Default configuration values can be set in the mainboard configuration
272 files (keyword default)
273 \item
274 Option overrides to the default configuration can only be specified in
275 the build target configuration file
276 \texttt{coreboot-v2/targets/$<$vendor$>$/$<$mainboard$>$/Config.lb}
277 (keyword option)
278 \end{itemize}
280 \subsection{Common Configuration Statements}
282 \begin{itemize}
284 \item \begin{verbatim}uses\end{verbatim}
286 All local configuration variables have to be declared before they can be
287 used. Example:
288 \begin{verbatim}
289 uses CONFIG_ROM_IMAGE_SIZE
290 \end{verbatim}
292 \textbf{NOTE:} Only configuration variables known to the configuration
293 system can be used in configuration files. coreboot checks
294 \texttt{coreboot-v2/src/config/Options.lb} to see whether a configuration
295 variable is known.
297 \item \begin{verbatim}default\end{verbatim}
299 The \texttt{default} statement is used to set a configuration variable
300 with an overridable default value. It is commonly used in mainboard
301 configuration files.
303 Example:
305 \begin{verbatim}
306 default CONFIG_ROM_IMAGE_SIZE=0x10000
307 \end{verbatim}
309 It is also possible to assign the value of one configuration variable to
310 another one, i.e.:
312 \begin{verbatim}
313 default CONFIG_FALLBACK_SIZE=CONFIG_ROM_SIZE
314 \end{verbatim}
316 Also, simple expressions are allowed:
318 \begin{verbatim}
319 default CONFIG_FALLBACK_SIZE=(CONFIG_ROM_SIZE - NORMAL_SIZE)
320 \end{verbatim}
322 If an option contains a string, this string has to be protected with
323 quotation marks:
325 \begin{verbatim}
326 default CC="gcc -m32"
327 \end{verbatim}
329 \item \begin{verbatim}option\end{verbatim}
331 The \texttt{option} statement basically behaves identically to the
332 \texttt{default} statement. But unlike default it can only be used in
333 build target configuration files
334 (\texttt{coreboot-v2/targets/$<$vendor$>$/$<$mainboard$>$}). The option
335 statement allows either to set new options or to override default values
336 set with the default statement in a mainboard configuration file.
337 Syntax and application are the same as with default.
339 \end{itemize}
341 \subsection{Firmware image specific configuration}
342 coreboot allows to create different firmware images for the same
343 hardware. Such images can differ in the amount of output they produce,
344 the payload, the number of subimages they consist of etc.
346 The firmware image specific configuration file can be found in \\
347 \texttt{coreboot-v2/targets/$<$vendor$>$/<mainboard$>$}.
349 \subsubsection{Firmware image specific keywords}
350 In addition to the above described keywords the following statements are
351 available in firmware image specific configuration files:
353 \begin{itemize}
354 \item \begin{verbatim}romimage\end{verbatim}
356 The \texttt{romimage} definition describes a single rom build within the
357 final coreboot image. Normally there are two romimage definitions per
358 coreboot build: \texttt{normal} and \texttt{fallback}.
360 Each \texttt{romimage} section needs to specify a mainboard directory and a
361 payload. The mainboard directory contains the mainboard specific
362 configuration file and source code. It is specified relatively to
363 \texttt{coreboot-v2/src/mainboard}. The payload definition is an absolute
364 path to a static elf binary (i.e Linux kernel or etherboot)
366 \begin{verbatim}
367 romimage "normal"
368 option CONFIG_USE_FALLBACK_IMAGE=0
369 option CONFIG_ROM_IMAGE_SIZE=0x10000
370 option COREBOOT_EXTRA_VERSION=".0Normal"
371 mainboard amd/solo
372 payload /suse/stepan/tg3ide_
373 disk.zelf
375 \end{verbatim}
377 \item \begin{verbatim}buildrom\end{verbatim}
379 The \texttt{buildrom} statement is used to determine which of the
380 coreboot image builds (created using \texttt{romimage}) are packed
381 together to the final coreboot image. It also specifies the order of
382 the images and the final image size:
384 \begin{verbatim}
385 buildrom ./solo.rom CONFIG_ROM_SIZE "normal" "fallback"
386 \end{verbatim}
388 \end{itemize}
391 \subsubsection{Firmware image configuration options}
392 In addition to the definitions described above there are a number of
393 commonly used options. Configuration options set in the firmware image
394 specific configuration file can override default selections from the
395 Mainboard specific configuration. See above examples about
396 option on how to set them.
398 \begin{itemize}
400 \item \begin{verbatim}CC\end{verbatim}
402 Target C Compiler. Default is \texttt{\$(CROSS\_COMPILE)gcc}. Set to
403 \texttt{gcc -m32} for compiling AMD64 coreboot images on an AMD64
404 machine.
406 \item \begin{verbatim}CONFIG_CHIP_CONFIGURE \end{verbatim}
408 Use new \textit{chip\_configure} method for configuring (nonpci)
409 devices. Set to \texttt{1} for all AMD64 mainboards.
411 \item \begin{verbatim}CONFIG_DEFAULT_CONSOLE_LOGLEVEL\end{verbatim}
413 Console will log at this level unless changed. Default is \texttt{7},
414 minimum is \texttt{0}, maximum is \texttt{10}.
416 \item \begin{verbatim}CONFIG_CONSOLE_SERIAL8250\end{verbatim}
418 Log messages to 8250 uart based serial console. Default is \texttt{0}
419 (don't log to serial console). This value should be set to \texttt{1}
420 for all AMD64 builds.
422 \item \begin{verbatim}CONFIG_ROM_SIZE\end{verbatim}
424 Size of final ROM image. This option has no default value.
426 \item \begin{verbatim}CONFIG_FALLBACK_SIZE\end{verbatim}
428 Fallback image size. Defaults to \texttt{65536} bytes. \textbf{NOTE:}
429 This does not include the fallback payload.
431 \item \begin{verbatim}CONFIG_HAVE_OPTION_TABLE\end{verbatim}
433 Export CMOS option table. Default is \texttt{0}. Set to \texttt{1} if
434 your mainboard has CMOS memory and you want to use it to store
435 coreboot parameters (Loglevel, serial line speed, ...)
437 \item \begin{verbatim}CONFIG_ROM_PAYLOAD\end{verbatim}
439 Boot image is located in ROM (as opposed to \texttt{CONFIG\_IDE\_PAYLOAD}, which
440 will boot from an IDE disk)
442 \item \begin{verbatim}CONFIG_HAVE_FALLBACK_BOOT\end{verbatim}
444 Set to \texttt{1} if fallback booting is required. Defaults to
445 \texttt{0}.
447 \end{itemize}
450 The following options should be used within a romimage section:
452 \begin{itemize}
454 \item \begin{verbatim}CONFIG_USE_FALLBACK_IMAGE\end{verbatim}
456 Set to \texttt{1} to build a fallback image. Defaults to \texttt{0}
458 \item \begin{verbatim}CONFIG_ROM_IMAGE_SIZE\end{verbatim}
460 Default image size. Defaults to \texttt{65535} bytes.
462 \item \begin{verbatim}COREBOOT_EXTRA_VERSION\end{verbatim}
464 coreboot extra version. This option has an empty string as default. Set
465 to any string to add an extra version string to your coreboot build.
467 \end{itemize}
469 \newpage
471 \subsection{Mainboard specific configuration}
473 Mainboard specific configuration files describe the onboard
474 mainboard components, i.e. bridges, number and type of CPUs. They also
475 contain rules for building the low level start code which is translated
476 using romcc and/or the GNU assembler. This code enables caches and
477 registers, early mtrr settings, fallback mechanisms, dram init and
478 possibly more.
480 \textbf{NOTE:} The \texttt{option} keyword can not be used in mainboard
481 specific configuration files. Options shall instead be set using the
482 \texttt{default} keyword so that they can be overridden by the image
483 specific configuration files if needed.
485 \subsubsection{Mainboard specific keywords}
487 The following statements are used in mainboard specific configuration
488 files:
490 \begin{itemize}
491 \item \begin{verbatim}arch\end{verbatim}
493 Sets the CPU architecture. This should be \texttt{i386} for AMD64 boards.\\
494 Example:
496 \begin{verbatim}
497 arch i386 end
498 \end{verbatim}
500 \item \begin{verbatim}cpu\end{verbatim}
502 The cpu statement is needed once per possibly available CPU. In a
503 one-node system, write:
505 \begin{verbatim}
506 cpu k8 "cpu0" end
507 \end{verbatim}
509 \item \begin{verbatim}driver\end{verbatim}
511 The \texttt{driver} keyword adds an object file to the driver section of a
512 coreboot image. This means it can be used by the PCI device
513 initialization code. Example:
515 \begin{verbatim}
516 driver mainboard.o
517 \end{verbatim}
519 \item \begin{verbatim}object\end{verbatim}
521 The \texttt{object} keyword adds an object file to the coreboot image.
522 Per default the object file will be compiled from a \texttt{.c} file
523 with the same name. Symbols defined in such an object file can be used
524 in other object files and drivers. Example:
526 \begin{verbatim}
527 object reset.o
528 \end{verbatim}
530 \item \begin{verbatim}makerule\end{verbatim}
532 This keyword can be used to extend the existing file creation rules
533 during the build process. This is useful if external utilities have to
534 be used for the build. coreboot on AMD64 uses romcc for it's early
535 startup code placed in auto.c.
537 To tell the configuration mechanism how to build \texttt{romcc} files,
540 \begin{verbatim}
541 makerule ./auto.E
542 depends "$(CONFIG_MAINBOARD)/auto.c option_table.h ./romcc"
543 action "./romcc -E -mcpu=k8 -O2 -I$(TOP)/src -I. $(CPPFLAGS) \
544 $(CONFIG_MAINBOARD)/auto.c -o $@"
546 makerule ./auto.inc
547 depends "$(CONFIG_MAINBOARD)/auto.c option_table.h ./romcc"
548 action "./romcc -mcpu=k8 -O2 -I$(TOP)/src -I. $(CPPFLAGS) \
549 $(CONFIG_MAINBOARD)/auto.c -o $@"
551 \end{verbatim}
553 Each \texttt{makerule} section contains file dependencies (using the
554 texttt{depends} keyword) and an action that is taken when the dependencies
555 are satisfied (using the \texttt{action} keyword).
557 \item \begin{verbatim}mainboardinit\end{verbatim}
559 With the mainboardinit keyword it's possible to include assembler code
560 directly into the coreboot image. This is used for early infrastructure
561 initialization, i.e. to switch to protected mode. Example:
563 \begin{verbatim}
564 mainboardinit cpu/i386/entry16.inc
565 \end{verbatim}
567 \item \begin{verbatim}ldscript\end{verbatim}
569 The GNU linker ld is used to link object files together to a coreboot
570 ROM image.
572 Since it is a lot more comfortable and flexible to use the GNU linker
573 with linker scripts (ldscripts) than to create complex command line
574 calls, coreboot features including linker scripts to control image
575 creation. Example:
577 \begin{verbatim}
578 ldscript /cpu/i386/entry16.lds
579 \end{verbatim}
582 \item \begin{verbatim}dir\end{verbatim}
584 coreboot reuses as much code between the different ports as possible.
585 To achieve this, commonly used code can be stored in a separate
586 directory. For a new mainboard, it is enough to know that the code in
587 that directory can be used as is.
589 coreboot will also read a \texttt{Config.lb} file stored in that
590 directory. This happens with:
592 \begin{verbatim}
593 dir /pc80
594 \end{verbatim}
597 \item \begin{verbatim}config\end{verbatim}
599 This keyword is needed by the new chip configuration scheme. Should be
600 used as:
602 \begin{verbatim}
603 config chip.h
604 \end{verbatim}
606 \item \begin{verbatim}register\end{verbatim}
607 The \texttt{register} keyword can occur in any section, passing
608 additional \\
609 parameters to the code handling the associated device.
610 Example:
612 \begin{verbatim}
613 register "com1" = "{1, 0, 0x3f8, 4}"
614 \end{verbatim}
616 \item \begin{verbatim}northbridge\end{verbatim}
618 The \texttt{northbridge} keyword describes a system northbridge. Some
619 systems, like AMD64, can have more than one northbridge, i.e. one per
620 CPU node. Each northbridge is described by the path to the northbridge
621 code in coreboot (relative to \texttt{coreboot-v2/src/northbridge}), i.e.
622 \texttt{amd/amdk8} and a unique name (i.e \texttt{mc0}) \\
623 Example:
625 \begin{verbatim}
626 northbridge amd/amdk8 "mc0"
627 [..]
629 \end{verbatim}
631 \item \begin{verbatim}southbridge\end{verbatim}
633 To simplify the handling of bus bridges in a coreboot system, all
634 bridges available in a system that are not northbridges (i.e AGP, IO,
635 PCIX) are seen as southbridges.
637 Since from the CPUs point of view any southbridge is connected via the
638 northbridge, a southbridge section is declared within the northbridge
639 section of the north bridge it is attached to.
641 Like the northbridge, any other bridge is described by the path to it's
642 driver code, and a unique name. If the described bridge is a
643 hypertransport device, the northbridge's hypertransport link it connects
644 to can be specified using the \texttt{link} keyword. Example:
646 \begin{verbatim}
647 northbridge amd/amdk8 "mc0"
648 [..]
649 southbridge amd/amd8111 "amd8111" link 0
650 [..]
652 [..]
654 \end{verbatim}
656 \item \begin{verbatim}pci\end{verbatim}
658 The \texttt{pci} keyword can only occur within a \texttt{northbridge} or
659 \texttt{southbridge} section. It is used to describe the PCI devices
660 that are provided by the bridge. Generally all bridge sections have a
661 couple of \texttt{pci} keywords.
663 The first occurrence of the \texttt{pci} keyword tells coreboot where
664 the bridge devices start, relative to the PCI configuration space used
665 by the bridge. The following occurences of the \texttt{pci} keyword
666 describe the provided devices.
668 Adding the option \texttt{on} or \texttt{off} to a PCI device will
669 enable or disable this device. This feature can be used if some bridge
670 devices are not wired to hardware outputs and thus are not used.
672 Example:
674 \begin{verbatim}
675 northbridge amd/amdk8 "mc1"
676 pci 0:19.0
677 pci 0:19.0
678 pci 0:19.0
679 pci 0:19.1
680 pci 0:19.2
681 pci 0:19.3
683 \end{verbatim}
687 \begin{verbatim}
688 southbridge amd/amd8111 "amd8111" link 0
689 pci 0:0.0
690 pci 0:1.0 on
691 pci 0:1.1 on
692 pci 0:1.2 on
693 pci 0:1.3 on
694 pci 0:1.5 off
695 pci 0:1.6 off
696 pci 1:0.0 on
697 pci 1:0.1 on
698 pci 1:0.2 on
699 pci 1:1.0 off
700 [..]
702 \end{verbatim}
704 \item \begin{verbatim}superio\end{verbatim}
706 SuperIO devices are basically handled like brigdes. They are taking
707 their driver code from \texttt{coreboot-v2/src/superio/}. They don't
708 provide a PCI compatible configuration interface, but instead are ISA
709 PnP devices. Normally they are connected to a southbridge. If this is
710 the case, the \texttt{superio} section will be a subsection of the
711 \texttt{southbridge} section of the southbridge it is connected to.
712 Example:
714 \begin{verbatim}
715 superio nsc/pc87360 link 1
716 pnp 2e.0
717 pnp 2e.1
718 pnp 2e.2
719 pnp 2e.3
720 pnp 2e.4
721 pnp 2e.5
722 pnp 2e.6
723 pnp 2e.7
724 pnp 2e.8
725 pnp 2e.9
726 pnp 2e.a
727 register "com1" = "{1, 0, 0x3f8, 4}"
728 register "lpt" = "{1}"
730 \end{verbatim}
732 \end{itemize}
734 \newpage
736 \subsubsection{Mainboard specific configuration options}
738 The following options are commonly used in mainboard specific
739 configuration files.
741 They should be set using the \texttt{default} keyword:
743 \begin{itemize}
745 \item \begin{verbatim}CONFIG_HAVE_HARD_RESET\end{verbatim}
747 If set to \texttt{1}, this option defines that there is a hard reset
748 function for this mainboard. This option is not defined per default.
750 \item \begin{verbatim}CONFIG_HAVE_PIRQ_TABLE\end{verbatim}
752 If set to \texttt{1}, this option defines that there is an IRQ Table for
753 this mainboard. This option is not defined per default.
755 \item \begin{verbatim}CONFIG_IRQ_SLOT_COUNT\end{verbatim}
757 Number of IRQ slots. This option is not defined per default.
759 \item \begin{verbatim}CONFIG_HAVE_MP_TABLE\end{verbatim}
761 Define this option to build an MP table (v1.4). The default is not to
762 build an MP table.
764 \item \begin{verbatim}CONFIG_HAVE_OPTION_TABLE\end{verbatim}
766 Define this option to export a CMOS option table. The default is not to
767 export a CMOS option table.
769 \item \begin{verbatim}CONFIG_SMP\end{verbatim}
771 Set this option to \texttt{1} if the mainboard supports symmetric
772 multiprocessing (SMP). This option defaults to \texttt{0} (no SMP).
774 \item \begin{verbatim}CONFIG_MAX_CPUS\end{verbatim}
776 If \begin{verbatim}CONFIG_SMP\end{verbatim} is set, this option defines
777 the maximum number of CPUs (i.e. the number of CPU sockets) in the
778 system. Defaults to \texttt{1}.
780 \item \begin{verbatim}CONFIG_IOAPIC\end{verbatim}
782 Set this option to \texttt{1} to enable IOAPIC support. This is
783 mandatory if you want to boot a 64bit Linux kernel on an AMD64 system.
785 \item \begin{verbatim}CONFIG_STACK_SIZE\end{verbatim}
787 coreboot stack size. The size of the function call stack defaults to
788 \texttt{0x2000} (8k).
790 \item \begin{verbatim}CONFIG_HEAP_SIZE\end{verbatim}
792 coreboot heap size. The heap is used when coreboot allocates memory
793 with malloc(). The default heap size is \texttt{0x2000}, but AMD64 boards
794 generally set it to \texttt{0x4000} (16k)
796 \item \begin{verbatim}CONFIG_XIP_ROM_BASE\end{verbatim}
798 Start address of area to cache during coreboot execution directly from
799 ROM.
801 \item \begin{verbatim}CONFIG_XIP_ROM_SIZE\end{verbatim}
803 Size of area to cache during coreboot execution directly from ROM
805 \item \begin{verbatim}CONFIG_COMPRESS\end{verbatim}
807 Set this option to \texttt{1} for a compressed image. If set to
808 \texttt{0}, the image is bigger but will start slightly faster (since no
809 decompression is needed).
811 \end{itemize}
814 \newpage
817 % 10. Tweaking the source code
820 \section{Tweaking the source code}
821 Besides configuring the existing code it is sometimes necessary or
822 desirable to tweak certain parts of coreboot by direct changes to the
823 code. This chapter covers some possible enhancements and changes that
824 are needed when porting coreboot to a new mainboard or just come
825 handy now and then.
827 \subsection{Hypertransport configuration}
828 Before coreboot is able to activate all CPUs and detect bridges
829 attached to these CPUs (and thus, see all devices attached to the
830 system) it has to initialize the coherent hypertransport devices.
832 The current algorithms to do coherent hypertransport initialization are
833 not fully, automatically evaluating the hypertransport chain graph.
834 Therefore the code needs to be adapted when porting coreboot to a new
835 AMD64 mainboard. An example arrangement of hypertransport devices
836 looks like this:
838 \begin{figure}[htb]
839 \centering
840 \includegraphics[scale=1.0]{hypertransport.pdf}
841 \caption{Example: Hypertransport Link Connections}
842 \label{fix:hypertransport}
843 \end{figure}
845 Each hypertransport device has one to three hypertransport links that
846 are used for device interconnection. These links are called LDT$[$012$]$, or
847 accordingly UP, ACROSS, DOWN. Communication between the hypertransport
848 devices can be freely routed, honoring the physical wiring. Teaching the
849 coherent hypertransport initialization algorithm this wiring happens in
850 two steps.
852 \newpage
854 \begin{enumerate}
855 \item Setting outgoing connections
856 The algorithm needs to know which outgoing port of a CPU node is
857 connected to the directly succeeding node. This is done in
858 \texttt{coreboot-v2/src/mainboard/$<$vendor$>$/$<$mainboard$>$/auto.c}
859 with a number of preprocessor defines (one define for two-node systems,
860 three defines for four-node systems).
862 The ports in question are flagged with a circle in the graph for
863 illustration. For the example graph above (all outgoing connections are
864 realized using LDT1/ACROSS) the defines are:
866 \begin{verbatim}
867 #define CONNECTION_0_1 ACROSS
868 #define CONNECTION_0_2 ACROSS
869 #define CONNECTION_1_3 ACROSS
870 \end{verbatim}
872 \item Describing routing information between CPUs.
874 There are basically three different message types for hypertransport
875 communication:
876 \begin{enumerate}
877 \item request packages
878 \item response packages
879 \item broadcast packages
880 \end{enumerate}
882 These three message types are routed using different hypertransport
883 ports. The routing information is written to the AMD K8 routing table.
884 In an Nnode system this routing table consists of 3*N*N entries , one
885 for each message type and for each possible CPU --> CPU communication. For
886 simplicity coreboot keeps the 3 routing entries for each CPU --> CPU
887 communication in one machine word. The routing table of each node looks
888 like this:
890 \begin{verbatim}
891 /* Routing Table for Node i
893 * F0: 0x40, 0x44, 0x48, 0x4c, 0x50, 0x54, 0x58, 0x5c
894 * i: 0, 1, 2, 3, 4, 5, 6, 7
896 * [ 0: 3] Request Route
897 * [0] Route to this node
898 * [1] Route to Link 0
899 * [2] Route to Link 1
900 * [3] Route to Link 2
901 * [11: 8] Response Route
902 * [0] Route to this node
903 * [1] Route to Link 0
904 * [2] Route to Link 1
905 * [3] Route to Link 2
906 * [19:16] Broadcast route
907 * [0] Route to this node
908 * [1] Route to Link 0
909 * [2] Route to Link 1
910 * [3] Route to Link 2
912 \end{verbatim}
914 The routing table is passed to the coherent hypertransport
915 initialization algorithm by defining a function called
916 \texttt{generate\_row()} in \texttt{auto.c}:
918 \begin{verbatim}
919 static unsigned int generate_row
920 (uint8_t node, uint8_t row, uint8_t maxnodes)
921 \end{verbatim}
923 This function is trivial if there is only one CPU in the system, since
924 no routing has to be done:
926 \begin{verbatim}
927 static unsigned int generate_row
928 (uint8_t node, uint8_t row, uint8_t maxnodes)
930 return 0x00010101; /* default row entry */
932 \end{verbatim}
934 On a two-node system things look slightly more complicated. Since the
935 coherent hypertransport initialization algorithm works by consecutively
936 enabling CPUs, it contains routing information for driving the system
937 with one node and two nodes:
939 \begin{verbatim}
940 static unsigned int generate_row
941 (uint8_t node, uint8_t row, uint8_t maxnodes)
943 uint32_t ret=0x00010101; /* default row entry */
944 static const unsigned int rows_2p[2][2] = {
945 { 0x00050101, 0x00010404 },
946 { 0x00010404, 0x00050101 }
948 if(maxnodes>2) maxnodes=2;
949 if (!(node>=maxnodes || row>=maxnodes)) {
950 ret=rows_2p[node][row];
952 return ret;
954 \end{verbatim}
956 Systems with four nodes have to contain routing information for one, two
957 and four-node setups:
959 \begin{verbatim}
960 static unsigned int generate_row
961 (uint8_t node, uint8_t row, uint8_t maxnodes)
963 uint32_t ret=0x00010101; /* default row entry */
964 static const unsigned int rows_2p[2][2] = {
965 { 0x00030101, 0x00010202 },
966 { 0x00010202, 0x00030101 }
968 static const unsigned int rows_4p[4][4] = {
969 { 0x00070101, 0x00010202, 0x00030404, 0x00010204 },
970 { 0x00010202, 0x000b0101, 0x00010208, 0x00030808 },
971 { 0x00030808, 0x00010208, 0x000b0101, 0x00010202 },
972 { 0x00010204, 0x00030404, 0x00010202, 0x00070101 }
974 if (!(node>=maxnodes || row>=maxnodes)) {
975 if (maxnodes==2)
976 ret=rows_2p[node][row];
977 if (maxnodes==4)
978 ret=rows_4p[node][row];
980 return ret;
982 \end{verbatim}
983 \end{enumerate}
985 \subsection{DRAM configuration}
986 Setting up the RAM controller(s) is probably the most complex part of
987 coreboot. Basically coreboot serially initializes all RAM controllers
988 in the system, using SPDROM (serial presence detect) data to set
989 timings, size and other properties. The SPD data is usually read
990 utilizing the I2C SMBUS interface of the southbridge.
992 There is one central data structure that describes the RAM controllers
993 available on an AMD64 system and the associated devices:
995 \begin{verbatim}
996 struct mem_controller {
997 unsigned node_id;
998 device_t f0, f1, f2, f3;
999 uint8_t channel0[4];
1000 uint8_t channel1[4];
1002 \end{verbatim}
1004 Available mainboard implementations and CPUs create the need to add
1005 special setup code to RAM initialization in a number of places.
1006 coreboot provides hooks to easily add code in these places without
1007 having to change the generic code. Whether these hooks have to be used
1008 depends on the mainboard design. In many cases the functions executed
1009 by the hooks just carry out trivial default settings or they are even
1010 empty.
1012 Some mainboard/CPU combinations need to trigger an additional memory
1013 controller reset before the memory can be initialized properly. This is,
1014 for example, used to get memory working on preC stepping AMD64
1015 processors. coreboot provides two hooks for triggering onboard memory
1016 reset logic:
1018 \begin{itemize}
1019 \item \begin{verbatim}static void memreset_setup(void)\end{verbatim}
1020 \item \begin{verbatim}static void memreset(int controllers, const struct
1021 mem_controller *ctrl)\end{verbatim}
1022 \end{itemize}
1024 Some mainboards utilize an SMBUS hub or possibly other mechanisms to
1025 allow using a large number of SPDROMs and thus ram sockets. The result
1026 is that only the SPDROM information of one cpu node is visible at a
1027 time. The following function, defined in \texttt{auto.c}, is called every time
1028 before a memory controller is initialized and gets the memory controller
1029 information of the next controller as a parameter:
1031 \begin{verbatim}
1032 static inline void activate_spd_rom (const struct mem_controller *ctrl)
1033 \end{verbatim}
1035 The way SMBUS hub information is coded into the \texttt{mem\_controller}
1036 structure is mainboard implementation specific and not
1037 described here. See \texttt{coreboot-v2/src/mainboard/amd/quartet/auto.c}
1038 for an example.
1040 coreboot folks have agreed on SPD data being the central information
1041 source for RAM specific information. But not all mainboards/RAM
1042 modules feature a physical SPD ROM. To still allow an easy to use SPD
1043 driven setup, there is a hook that abstracts reading the SPD ROM
1044 ingredients that are used by the memory initialization mechanism:
1046 \begin{verbatim}
1047 static inline int spd_read_byte(unsigned device, unsigned address)
1048 \end{verbatim}
1050 This function, defined in \texttt{auto.c}, directly maps it's calls to
1051 \texttt{smbus\_read\_byte()} calls if SPD ROM information is read via
1052 the I2C SMBUS:
1054 \begin{verbatim}
1055 static inline int spd_read_byte(unsigned device, unsigned address)
1057 return smbus_read_byte(device & 0xff, address);
1059 \end{verbatim}
1061 If there is no SPD ROM available in the system design, this function
1062 keeps an array of SPD ROM information hard coded per logical RAM module.
1063 It returns the faked' SPD ROM information using device and address
1064 as indices to this array.
1067 \subsection {IRQ Tables}
1069 Mainboards that provide an IRQ table should have the following two
1070 variables set in their \texttt{Config.lb} file:
1072 \begin{verbatim}
1073 default CONFIG_HAVE_PIRQ_TABLE=1
1074 default CONFIG_IRQ_SLOT_COUNT=7
1075 \end{verbatim}
1077 This will make coreboot look for the file \\
1078 \texttt{coreboot-v2/src/mainboard/<vendor>/<mainboard>/irq\_tables.c} which
1079 contains the source code definition of the IRQ table. coreboot corrects
1080 small inconsistencies in the IRQ table during startup (checksum and
1081 number of entries), but it is not yet writing IRQ tables in a completely
1082 dynamic way.
1084 \textbf{NOTE:} To get Linux to understand and actually use the IRQ
1085 table, it is not always a good idea to specify the vendor and device id
1086 of the actually present interrupt router device. Linux 2.4 for example
1087 does not know about the interrupt router of the AMD8111 southbridge. In
1088 such cases it is advised to choose the vendor/device id of a compatible
1089 device that is supported by the Linux kernel. In case of the AMD8111
1090 interrupt router it is advised to specify the AMD768/Opus interrupt
1091 controller instead (vendor id=\texttt{0x1022}, device id=\texttt{0x7443})
1093 \subsection {MP Tables}
1095 coreboot contains code to create MP tables conforming the
1096 Multiprocessor Specification V1.4. To include an MP Table in a coreboot
1097 image, the following configuration variables have to be set (in the
1098 mainboard specific configuration file
1099 \texttt{coreboot-v2/src/mainboard/<vendor><mainboard>/Config.lb}):
1101 \begin{verbatim}
1102 default CONFIG_SMP=1
1103 default CONFIG_MAX_CPUS=1 # 2,4,..
1104 default CONFIG_HAVE_MP_TABLE=1
1105 \end{verbatim}
1107 coreboot will then look for a function for setting up the MP table in
1108 the file \texttt{coreboot-v2/src/mainboard<vendor>/<mainboard>/mptable.c}:
1110 \begin{verbatim}
1111 void *smp_write_config_table(void *v, unsigned long * processor_map)
1112 \end{verbatim}
1114 MP Table generation is still somewhat static, i.e. changing the bus
1115 numbering will force
1116 you to adopt the code in mptable.c. This is subject to change in future
1117 revisions.
1119 \subsection {ACPI Tables}
1121 There is initial ACPI support in coreboot now. Currently the only gain with
1122 this is the ability to use HPET timers in Linux. To achieve this, there is a
1123 framework that can generate the following tables:
1124 \begin{itemize}
1125 \item RSDP
1126 \item RSDT
1127 \item MADT
1128 \item HPET
1129 \end{itemize}
1131 To enable ACPI in your coreboot build, add the following lines to your
1132 configuration files:
1133 \begin{verbatim}
1134 uses CONFIG_HAVE_ACPI_TABLES
1135 [..]
1136 option CONFIG_HAVE_ACPI_TABLES=1
1137 \end{verbatim}
1139 To keep Linux doing it's pci ressource allocation based on IRQ tables and MP
1140 tables, you have to specify the kernel parameter \texttt{pci=noacpi} otherwise
1141 your PCI devices won't get interrupts.
1142 It's likely that more ACPI support will follow, when there is need for certain
1143 features.
1145 \subsection{POST}
1146 coreboot has three different methods of handling POST codes. They can
1147 be triggered using configuration file options.
1148 \begin{itemize}
1149 \item
1150 \emph{Ignore POST completely}. No early code debugging is possible with
1151 this setting. Set the configuration variable \texttt{NO\_POST} to
1152 \texttt{1} to switch off all POST handling in coreboot.
1153 \item
1154 \emph{Normal IO port 80 POST}. This is the default behavior of
1155 coreboot. No configuration variables have to be set. To be able to see
1156 port 80 POST output, you need a POST expansion card for ISA or PCI. Port
1157 80 POST allows simple debugging without any other output method
1158 available (serial interface or VGA display)
1159 \item
1160 \emph{Serial POST}.
1161 This option allows to push POST messages to the serial interface instead
1162 of using IO ports. \textbf{NOTE:} The serial interface has to be
1163 initialized before serial POST can work. To use serial POST, set the
1164 configuration variable \texttt{CONFIG\_SERIAL\_POST} to the value 1.
1165 \end{itemize}
1168 \subsection{HDT Debugging}
1169 If you are debugging your coreboot code with a Hardware Debug Tool
1170 (HDT), you can find the source code line for a given physical EIP
1171 address as follows: Look the address up in the file linuxbios.map. Then
1172 search the label Lxx in the file auto.inc created by romcc. The original
1173 source code file and line number is mentioned in auto.inc.
1176 \subsection{Device Drivers}
1177 With only a few data structures coreboot features a simple but flexible
1178 device driver interface. This interface is not intended for autonomously
1179 driving the devices but to initialize all system components so that they
1180 can be used by the booted operating system.
1182 Since nowadays most systems are PCI centric, the data structures used
1183 are tuned towards (onboard and expansion bus) PCI devices. Each driver
1184 consists of at least two structures.
1186 The \texttt{pci\_driver} structure maps PCI vendor/device id pairs to a
1187 second structure that describes a set of functions that together
1188 initialize and operate the device:
1190 \begin{verbatim}
1191 static void adaptec_scsi_init(struct device *dev)
1193 [..]
1195 static struct device_operations lsi_scsi_ops = {
1196 .read_resources = pci_dev_read_resources,
1197 .set_resources = pci_dev_set_resources,
1198 .enable_resources = pci_dev_enable_resources,
1199 .init = lsi_scsi_init,
1200 .scan_bus = 0,
1202 static const struct pci_driver lsi_scsi_driver __pci_driver = {
1203 .ops = &lsi_scsi_ops,
1204 .vendor = 0xXXXX,
1205 .device = 0xXXXX,
1207 \end{verbatim}
1209 By separating the two structures above, M:N relations between compatible
1210 devices and drivers can be described. The driver source code containing
1211 above data structures and code have to be added to a coreboot image
1212 using the driver keyword in the mainboard specific configuration file \\
1213 \texttt{coreboot-v2/src/mainboard/<vendor>/<mainboard>/Config.lb}:
1215 \begin{verbatim}
1216 driver lsi_scsi.o
1217 \end{verbatim}
1219 \subsection{Bus Bridges}
1221 Currently all bridges supported in the coreboot-v2 tree are transparent
1222 bridges. This means, once the bridge is initialized, it's remote devices
1223 are visible on one of the PCI buses without special probing. coreboot
1224 supports also bridges that are nontransparent. The driver support code
1225 can provide a \texttt{scan\_bus} function to scan devices behind the bridge.
1227 \subsection{CPU Reset}
1228 When changing speed and width of hypertransport chain connections
1229 coreboot has to either assert an LDTSTOP or a reset to make the changes
1230 become active. Additionally Linux can do a firmware reset, if coreboot
1231 provides the needed infrastructure. To use this capability, define the
1232 option \texttt{CONFIG\_HAVE\_HARD\_RESET} and add an object file specifying the
1233 reset code in your mainboard specific configuration file
1234 \texttt{coreboot-v2/src/mainboard/$<$vendor$>$/$<$mainboard$>$/Config.lb}:
1236 \begin{verbatim}
1237 default CONFIG_HAVE_HARD_RESET=1
1238 object reset.o
1239 \end{verbatim}
1241 The C source file \texttt{reset.c} (resulting in \texttt{reset.o}
1242 during compilation) shall define the following function to take care
1243 of the system reset:
1245 \begin{verbatim}
1246 void hard_reset(void);
1247 \end{verbatim}
1249 See \texttt{coreboot-v2/src/mainboard/arima/hdama/reset.c} for an example
1250 implementation.
1252 \newpage
1255 % 11. coreboot Internals
1258 \section{coreboot Internals}
1259 This chapter covers some of the internal structures and algorithms of
1260 coreboot that have not been mentioned so far.
1262 \subsection{Code Flow}
1264 \begin{figure}[htb]
1265 \centering
1266 \includegraphics[scale=0.7]{codeflow.pdf}
1267 \caption{coreboot rough Code Flow}
1268 \label{fix:codeflow}
1269 \end{figure}
1271 \newpage
1273 \subsection{Fallback mechanism}
1274 coreboot provides a mechanism to pack two different coreboot builds
1275 within one coreboot ROM image. Using the system CMOS memory coreboot
1276 determines whether the last boot with a default image succeeded and
1277 boots a failsafe image on failure. This allows insystem testing without
1278 the risk to render the system unusable. See
1279 \texttt{coreboot-v2/src/mainboard/arima/hdama/failover.c} for example
1280 code. The fallback mechanism can be used with the \texttt{cmos\_util}.
1282 \subsection{(Un) Supported Standards}
1283 coreboot supports the following standards
1284 \begin{itemize}
1285 \item Multiprocessing Specification (MPSPEC) 1.4
1286 \item IRQ Tables (PIRQ)
1287 \item ACPI (initial support on AMD64)
1288 \item Elf Booting
1289 \end{itemize}
1290 However, the following standards are not supported until now, and will
1291 probably not be supported in future revisions:
1292 \begin{itemize}
1293 \item APM
1294 \end{itemize}
1296 \subsection{coreboot table}
1297 coreboot stores information about the system in a data structure called
1298 the coreboot table. This table can be read under Linux using the tool
1299 nvramtool from the Lawrence Livermore National Laboratory.
1301 Get more information about lxbios and the utility itself at
1302 \url{http://www.llnl.gov/linux/lxbios/lxbios.html}
1304 \subsection{ROMCC limitations}
1305 ROMCC, part of the coreboot project, is a C compiler that translates to
1306 completely rommable code. This means the resulting code does not need
1307 any memory to work. This is one of the major improvements in coreboot
1308 V2, since it allows almost all code to be written in C. DRAM
1309 initialization can be factored and reused more easily among mainboards
1310 and platforms.
1312 Since no memory is available during this early initialization point,
1313 romcc has to map all used variables in registers for the time being.
1314 Same applies for their stack usage. Generally the less registers are
1315 used up by the algorithms, the better code can be factored, resulting in
1316 a smaller object size. Since getting the best register usage is an NP
1317 hard problem, some heuristics are used to get reasonable translation
1318 time. If you run out of registers during compilation, try to refactor
1319 your code.
1321 \subsection{CMOS handling}
1322 coreboot can use the mainboard's CMOS memory to store information
1323 defined in a data structure called the CMOS table . This information
1324 contains serial line speed, fallback boot control, output verbosity,
1325 default boot device, ECC control, and more. It can be easily enhanced by
1326 enhancing the CMOS table. This table, if present, is found at
1327 \texttt{coreboot-v2/src/mainboard/$<$vendor$>$/$<$mainboard$>$/cmos.layout}.
1328 It describes the available options, their possible values and their
1329 position within the CMOS memory. The layout file looks as follows:
1330 \begin{verbatim}
1331 # startbit length config configID name
1332 [..]
1333 392 3 e 5 baud_rate
1334 [..]
1336 # configid value human readable description
1337 5 0 115200
1338 5 1 57600
1339 5 2 38400
1340 5 3 19200
1341 5 4 9600
1342 5 5 4800
1343 5 6 2400
1344 5 7 1200
1346 \end{verbatim}
1348 To change CMOS values from a running Linux system, use the
1349 \texttt{cmos\_util}, provided by Linux Networks as part of the coreboot
1350 utilities suite. Get it at
1351 \textit{ftp://ftp.lnxi.com/pub/linuxbios/utilities/}
1353 \subsection {Booting Payloads}
1354 coreboot can load a payload binary from a Flash device or IDE. This
1355 payload can be a boot loader, like FILO or Etherboot, a kernel image, or
1356 any other static ELF binary. If you specify a bzImage as the payload,
1357 the cbfs utility will figure out how to create a coreboot payload from it.
1359 \subsection{Kernel on dhcp/tftp}
1361 One possible scenario during testing is that you keep your kernel (or
1362 any additional payload) on a different machine on the network. This can
1363 quickly be done using a DHCP and TFTP server.
1365 Use for example following \texttt{/etc/dhcpd.conf} (adapt to your
1366 network):
1368 \begin{verbatim}
1369 subnet 192.168.1.0 netmask 255.255.255.0 {
1370 range 192.168.1.0 192.168.1.31;
1371 option broadcastaddress 192.168.1.255;
1374 ddnsupdatestyle adhoc;
1376 host hammer12 {
1377 hardware ethernet 00:04:76:EA:64:31;
1378 fixedaddress 192.168.1.24;
1379 filename "vmlinuz.elf";
1381 \end{verbatim}
1384 Additionally you have to run a \texttt{tftp} server. You can start one
1385 using \texttt{inetd}. To do this, you have to remove the comment from
1386 the following line in \texttt{/etc/inetd.conf}:
1388 \begin{verbatim}
1389 tftp dgram udp wait root /usr/sbin/in.tftpd in.tftpd -s /tftpboot
1390 \end{verbatim}
1392 Then put your kernel image \texttt{vmlinuz.elf} in \texttt{/tftpboot} on
1393 the \texttt{tftp} server.
1396 \newpage
1399 % 12. Advanced Device Initialization Mechanisms
1402 \section{Advanced Device Initialization Mechanisms}
1404 Like software, today's hardware is getting more and more complex. To
1405 stay flexible many hardware vendors start breaking hardware
1406 compatibility to old standards like VGA. Thus, VGA is still supported by
1407 most cards, but emulation has to be enabled by the firmware for the
1408 device to operate properly. Also, many expansion cards are small
1409 discrete systems that have to initialize attached ram, download
1410 controller firmware and similar. Without this initialization, an
1411 operating system can not take advantage of the hardware, so there needs
1412 to be a way to address this issue. There are several alternatives:
1414 \subsection{Native coreboot Support}
1416 For some devices (ie Trident Cyberblade 3d) there is native coreboot
1417 support This means there is a small driver bound to the PCI id of the
1418 device that is called after PCI device ressources are allotted.
1420 PROs:
1421 \begin{itemize}
1422 \item open source
1423 \item minimal driver
1424 \item early control
1425 \end{itemize}
1427 CONs:
1428 \begin{itemize}
1429 \item need an additional driver
1430 \item viable for onboard devices only
1431 \item not flexible for pci cards
1432 \end{itemize}
1434 \subsection{Using Native Linux Support}
1436 A simple way of getting a whole lot of drivers available for coreboot
1437 is to reuse Linux drivers by putting a Linux kernel to flash. This
1438 works, because no drivers are needed to get the Linux kernel (as opposed
1439 to store the kernel on a harddisk connected to isa/scsi/raid storage)
1441 PROs:
1442 \begin{itemize}
1443 \item large number of open source drivers
1444 \end{itemize}
1446 CONs:
1447 \begin{itemize}
1448 \item need Linux in Flash (BLOAT!)
1449 \item drivers expect devices to be initialized (LSI1020/1030)
1450 \item Linux only
1451 \item large flash needed (4MBit minimum, normal operations 8+ MBit)
1452 \end{itemize}
1455 \subsection{Running X86 Option ROMs}
1457 Especially SCSI/RAID controllers and graphics adapters come with a
1458 special option rom. This option rom usually contains x86 binary code
1459 that uses a legacy PCBIOS interface for device interaction. If this code
1460 gets executed, the device becomes operable in Linux and other operating
1461 systems.
1463 PROs:
1464 \begin{itemize}
1465 \item really flexible
1466 \item no need for additional drivers on firmware layer
1467 \item large number of supported devices
1468 \end{itemize}
1470 CONs:
1471 \begin{itemize}
1472 \item non-x86 platforms need complex emulation
1473 \item x86 platforms need legacy API
1474 \item outdated concept
1475 \end{itemize}
1478 \subsection{Running Open Firmware Option ROMs}
1480 Some PCI devices come with open firmware option roms. These devices are
1481 normally found in computers from SUN, Apple or IBM. Open Firmware is a
1482 instruction set architecture independent firmware standard that allows
1483 device specific initialization using simple, small, but flexible
1484 bytecode that runs with minimal footprint on all architectures that have
1485 an Open Firmware implementation.
1487 There is a free Open Firmware implementation available, called OpenBIOS,
1488 that runs on top of coreboot. See www.openbios.org
1490 PROs:
1491 \begin{itemize}
1492 \item architecture independence
1493 \item small footprint
1494 \item clean concept, less bugs
1495 \end{itemize}
1497 CONs:
1498 \begin{itemize}
1499 \item only small number of devices come with OpenFirmware capable option roms
1500 \end{itemize}
1503 % 13 image types
1506 \section{Image types}
1507 There used to be one image type for coreboot, as described above. Since this paper was written (2004) there have been many changes. First, the name
1508 was changed to coreboot, for many reasons. Second, Cache As Ram support (CAR)
1509 was added for many AMD CPUs, which both simplified and complicated things. Simplification came with the removal of romcc; complication came with the addition of new ways to build.
1511 There are two big additions to the build process and, furthermore, more than two new CONFIG variables to control them.
1513 \begin{itemize}
1514 \item \begin{verbatim}CONFIG_USE_DCACHE_RAM\end{verbatim}
1516 Set to \texttt{1} to use Cache As Ram (CAR). Defaults to \texttt{0}
1518 \end{itemize}
1520 Before going over the new image types, derived from v3, we will quickly review the standard v2 image types. We are hoping this review will
1521 aid comprehension.
1523 A coreboot rom file consists of one or more \textit{images}. All images consist of a part that runs in ROM, and a part that runs in RAM. The RAM can be in compressed form and is decompressed when needed by the ROM code. The main function of the ROM code is to get memory working. Both ROM and RAM consist of a very small amount of assembly code and mostly C code.
1525 \subsection{romcc images (from emulation/qemu)}
1526 ROMCC images are so-called because C code for the ROM part is compiled with romcc. romcc is an optimizing C compiler which compiles one, and only
1527 one file; to get more than one file, one must include the C code via include statements. The main ROM code .c file is usually called auto.c.
1528 \subsubsection{How it is built}
1529 Romcc compiles auto.c to produce auto.inc. auto.inc is included in the main crt0.S, which is then preprocessed to produce crt0.s. The inclusion of files into crt0.S is controlled by the CONFIG\_CRT0\_INCLUDES variable. crt0.s is then assembled.
1531 File for the ram part are compiled in a conventional manner.
1533 The final step is linking. The use of named sections is used very heavily in coreboot to control where different bits of code go. The reset vector must go in the top 16 bytes. The start portion of the ROM code must go in the top 64K bytes, since most chipsets only enable this much ROM at startup time. Here is a quick look at a typical image:
1534 \begin{verbatim}
1535 [Nr] Name Type Addr Off Size ES Flg Lk Inf Al
1536 [ 0] NULL 00000000 000000 000000 00 0 0 0
1537 [ 1] .ram PROGBITS ffff0000 001000 005893 00 WA 0 0 1
1538 [ 2] .rom PROGBITS ffff5893 006893 00029d 00 AX 0 0 16
1539 [ 3] .reset PROGBITS fffffff0 006ff0 000010 00 A 0 0 1
1540 [ 4] .id PROGBITS ffffffd1 006fd1 00001f 00 A 0 0 1
1541 [ 5] .shstrtab STRTAB 00000000 007000 000030 00 0 0 1
1542 [ 6] .symtab SYMTAB 00000000 007170 000c30 10 7 37 4
1543 [ 7] .strtab STRTAB 00000000 007da0 000bfd 00 0 0 1
1544 \end{verbatim}
1546 The only sections that get loaded into a ROM are the Allocated ones. We can see the .ram, .rom, .reset and .id sections.
1547 \subsubsection{layout}
1548 As we mentioned, the ROM file consists of multiple images. In the basic file, there are two full coreboot rom images. The build sequence for each is the same, and in fact the ldscript.ld files are almost identical. The only difference is in a few makefile variables, generated by the config tool.
1550 \begin{itemize}
1551 \item CONFIG\_PAYLOAD\_SIZE. Each image may have a different payload size.
1552 \item CONFIG\_ROMBASE Each image must have a different base in rom.
1553 \item CONFIG\_RESET Unclear what this is used for.
1554 \item CONFIG\_EXCEPTION\_VECTORS where an optional IDT might go.
1555 \item CONFIG\_USE\_OPTION\_TABLE if set, an option table section will be linked in.
1556 \item CONFIG\_ROM\_PAYLOAD\_START This is the soon-to-be-deprecated way of locating a payload. cbfs eliminates this.
1557 \item CONFIG\_USE\_FALLBACK\_IMAGE Whether this is a fallback or normal image
1558 \item CONFIG\_ROM\_SECTION\_SIZE Essentially, the payload size. Soon to be deprecated.
1559 \item CONFIG\_ROM\_IMAGE\_SIZE Size of this image (i.e. fallback or normal image)
1560 \item CONFIG\_ROM\_SIZE Total size of the ROM
1561 \item CONFIG\_XIP\_RAM\_BASE The start of eXecute In Place code. XIP allows for not copying code to ram, but just running it from ROM.
1562 \end{itemize}
1564 Each image (normal or fallback) is built completely independently and does not get linked to the other. They are assembled into one ROM image by the (soon to be deprecated) buildrom tool, or by the cbfs tool.
1566 \subsubsection{boot sequence}
1567 We boot and start at fffffff0. We then jump to the entry point at \_start. \_start does some machine init and an lgdt and jumps to \_\_protected\_start, at which point we are in protected mode. The code does a bit more machine setup and then starts executing the romcc code.
1569 If fallback has been built in, some setup needs to be done. On some machines, it is extensive. Full rom decoding must be enabled. This may in turn require additional PCI setup to enable decoding to be enabled (!). To decided which image to use, hardware registers (cold boot on the Opteron) or CMOS are checked. Finally, once the image to use has been decided, a jmp is performed, viz:
1570 \begin{verbatim}
1571 /* This is the primary cpu how should I boot? */
1572 else if (do_normal_boot()) {
1573 goto normal_image;
1575 else {
1576 goto fallback_image;
1578 normal_image:
1579 __asm__ volatile ("jmp __normal_image"
1580 : /* outputs */
1581 : "a" (bist), "b" (cpu_init_detectedx) /* inputs */
1584 fallback_image:
1585 #if CONFIG_HAVE_FAILOVER_BOOT==1
1586 __asm__ volatile ("jmp __fallback_image"
1587 : /* outputs */
1588 : "a" (bist), "b" (cpu_init_detectedx) /* inputs */
1590 #endif
1592 \end{verbatim}
1593 How does the fallback image get the symbol for normal entry? Via magic in the ldscript.ld -- remember, the images are not linked to each other.
1594 Finally, we can see this in the Config.lb for most mainboards:
1595 \begin{verbatim}
1596 if CONFIG_USE_FALLBACK_IMAGE
1597 mainboardinit cpu/x86/16bit/reset16.inc
1598 ldscript /cpu/x86/16bit/reset16.lds
1599 else
1600 mainboardinit cpu/x86/32bit/reset32.inc
1601 ldscript /cpu/x86/32bit/reset32.lds
1603 \end{verbatim}
1604 What does this mean? the non-fallback image has a 32-bit entry point; fallback has a 16-bit entry point. The reason for this is that some code from fallback always runs, so as to pick fallback or normal; but the normal is always called from 32-bit code.
1605 \subsection{car images (from lippert/roadrunner-lx)}
1606 CAR images in their simplest form are modified romcc images. The file is usually cache\_as\_ram\_auto.c. C inclusion is still used. The main difference is in the build sequence. The compiler command line is a very slight changed: instead of using romcc to generate an auto.inc include file, gcc us used. Then, two perl scripts are used to rename the .text and .data sections to .rom.text and .rom.data respectively.
1607 \subsubsection{How it is built}
1608 The build is almost identical to the romcc build. Since the auto.inc file exists, it can be included as before. The crt0\_includes.h file has one addition: a file that enables CAR, in this case it is \textit{src/cpu/amd/model\_lx/cache\_as\_ram.inc}.
1609 \subsubsection{layout}
1610 No significant change from romcc code.
1611 \subsubsection{boot sequence}
1612 No significant change from romcc code, except that the CAR code has to set up a stack.
1614 \subsection{car + CONFIG\_USE\_INIT images (new emulation/qemu}
1615 This type of image makes more use of the C compiler. In this type of image, in fact,
1616 seperate compilation is possible but is not always used. Oddly enough, this option is only used in PPC boards. That said, we need to move to this way of building. Including C code is poor style.
1617 \subsubsection{How it is built}
1618 There is a make variable, INIT-OBJECTS, that for all our other targets is empty. In this type of build, INIT-OBJECTS is a list of C files that are created from the config tool initobject command. Again, with INIT-OBJECTS we can finally stop including .c files and go with seperate compilation.
1619 \subsubsection{layout}
1620 No significant change from romcc code.
1621 \subsubsection{boot sequence}
1622 No significant change from romcc code, except that the CAR code has to set up a stack.
1624 \subsubsection{layout}
1625 No significant change from romcc code.
1626 \subsubsection{boot sequence}
1627 No significant change from romcc code, except that the CAR code has to set up a stack.
1628 \subsection{failover}
1629 Failover is the newest way to lay out a ROM. The choice of which image to run is removed from the fallback image and moved into a small, standalone piece of code. The code is simple enough to show here:
1630 \begin{verbatim}
1631 static unsigned long main(unsigned long bist)
1633 if (do_normal_boot())
1634 goto normal_image;
1635 else
1636 goto fallback_image;
1638 normal_image:
1639 __asm__ __volatile__("jmp __normal_image" : : "a" (bist) : );
1641 cpu_reset:
1642 __asm__ __volatile__("jmp __cpu_reset" : : "a" (bist) : );
1644 fallback_image:
1645 return bist;
1648 \end{verbatim}
1649 Some motherboards have a more complex bus structure (e.g. Opteron). In those cases, the failover can be more complex, as it requires some hardware initialization to work correctly. As of this writing (April 2009), these boards have their own failover:
1650 \begin{quote}
1651 ./src/mainboard/iei/nova4899r/failover.c
1652 ./src/mainboard/emulation/qemu-x86/failover.c
1653 ./src/mainboard/supermicro/x6dhr\_ig/failover.c
1654 ./src/mainboard/supermicro/x6dai\_g/failover.c
1655 ./src/mainboard/supermicro/x6dhe\_g2/failover.c
1656 ./src/mainboard/supermicro/x6dhr\_ig2/failover.c
1657 ./src/mainboard/supermicro/x6dhe\_g/failover.c
1658 ./src/mainboard/dell/s1850/failover.c
1659 ./src/mainboard/intel/xe7501devkit/failover.c
1660 ./src/mainboard/intel/jarrell/failover.c
1661 ./src/mainboard/olpc/btest/failover.c
1662 ./src/mainboard/olpc/rev\_a/failover.c
1663 ./src/mainboard/via/epia-m/failover.c
1664 \end{quote}
1665 Here is one of the more complicated ones:
1666 \begin{verbatim}
1667 static unsigned long main(unsigned long bist)
1669 /* Did just the cpu reset? */
1670 if (memory_initialized()) {
1671 if (last_boot_normal()) {
1672 goto normal_image;
1673 } else {
1674 goto cpu_reset;
1678 /* This is the primary cpu how should I boot? */
1679 else if (do_normal_boot()) {
1680 goto normal_image;
1682 else {
1683 goto fallback_image;
1685 normal_image:
1686 asm volatile ("jmp __normal_image"
1687 : /* outputs */
1688 : "a" (bist) /* inputs */
1689 : /* clobbers */
1691 cpu_reset:
1692 asm volatile ("jmp __cpu_reset"
1693 : /* outputs */
1694 : "a"(bist) /* inputs */
1695 : /* clobbers */
1697 fallback_image:
1698 return bist;
1701 \end{verbatim}
1702 They're not that different, in fact. So why are there different copies all over the tree? Simple: code inclusion. Most of the failover.c are different because they include different bits of code. Here is a key reason for killing C code inclusion in the tree.
1703 \subsubsection{How it is built}
1704 There two additional config variables:
1705 \begin{itemize}
1706 \item HAVE\_FAILOVER\_IMAGE Has to be defined when certain files are included.
1707 \item USE\_FAILOVER\_IMAGE Enables the use of the failover image
1708 \end{itemize}
1709 Confusingly enough, almost all the uses of these two variables are either nested or both required to be set, e.g.
1710 The fallback and normal builds are the same. The target config has a new clause that looks like this:
1711 \begin{verbatim}
1712 romimage "failover"
1713 option CONFIG_USE_FAILOVER_IMAGE=1
1714 option CONFIG_USE_FALLBACK_IMAGE=0
1715 option CONFIG_ROM_IMAGE_SIZE=CONFIG_FAILOVER_SIZE
1716 option CONFIG_XIP_ROM_SIZE=CONFIG_FAILOVER_SIZE
1717 option COREBOOT_EXTRA_VERSION="\$(shell cat ../../VERSION)\_Failover"
1719 \end{verbatim}
1720 This new section uses some constructs not yet discussed in detail. XIP\_ROM\_SIZE just refers to the
1721 fact that the failover code is eXecute In Place, i.e. not copied to RAM. Of course, the ROM part of normal/fallback is as well, so the usage of XIP here is somewhat confusing. Finally, the USE\_FAILOVER\_IMAGE variable is set, which changes code compilation in a few places. If we just consider non-mainbard files, there are:
1722 \begin{verbatim}
1723 src/cpu/amd/car/cache_as_ram.inc
1724 src/arch/i386/Config.lb
1725 \end{verbatim}
1726 For the cache\_as\_ram.inc file, the changes relate to the fact that failover code sets up CAR, so that fallback code need not.
1728 For the Config.lb, several aspects of build change.
1729 When USE\_FAILOVER\_IMAGE, entry into both normal and fallback bios images is via a 32-bit entry point (when not defined, entry into fallback is a 16-entry point at the power-on reset vector).
1730 \subsubsection{layout}
1731 Failover.c becomes the new bootblock at the top of memory. It calls either normal or fallback. The address of normal and fallback is determined by ldscript magic.
1732 \subsubsection{boot sequence}
1733 failover.c tests a few variables and the calls the normal or fallback payload depending on those variables; usually they are CMOS settings.
1734 \subsection{Proposed new image forat}
1735 The new image format will use seperate compilation -- no C code included! -- on all files.
1737 The new design has a few key goals:
1738 \begin{itemize}
1739 \item Always use a bootblock (currently called failover).
1740 The name failover.c, being utterly obscure, will not be used; instead, we will name the file bootblock.c. Instead of having a different copy for each mainboard, we can have just one copy.
1741 \item Always use seperate compilation
1742 \item Always use printk etc. in the ROM code
1743 \item (longer term) from the bootblock, always use cbfs to locate the normal/fallback etc. code. This code will be XIP.
1744 \end{itemize}
1746 \subsubsection{How it is built}
1747 For now, since we are still using the config tool, we'll need a new command: bootblockobject, which creates a list of files to be included in the bootblock. Not a lot else will have to change. We are going to move to using the v3 CAR code assembly code (one or two files at most, instead of many) and, instead of the thicket of little ldscript files, one ldscript file. This strategy is subject to modification as events dictate.
1748 \subsubsection{layout}
1749 Almost the same, for now, as the current failover code.
1750 \subsubsection{boot sequence}
1752 % 14 Glossary
1755 \section{Glossary}
1756 \begin{itemize}
1757 \item payload
1759 coreboot only cares about low level machine initialization, but also has
1760 very simple mechanisms to boot a file either from FLASHROM or IDE. That
1761 file, possibly a Linux Kernel, a boot loader or Etherboot, are called
1762 payload, since it is the first software executed that does not cope with
1763 pure initialization.
1765 \item flash device
1767 Flash devices are commonly used in all different computers since unlike
1768 ROMs they can be electronically erased and reprogrammed.
1769 \end{itemize}
1771 \newpage
1774 % 14 Bibliography
1777 \section{Bibliography}
1778 \subsection{Additional Papers on coreboot}
1780 \begin{itemize}
1781 \item
1782 \textit{\url{http://www.coreboot.org/Documentation}}
1783 \item
1784 \textit{\url{http://www.lysator.liu.se/upplysning/fa/linuxbios.pdf}}
1785 \item
1786 \textit{\url{http://portal.acm.org/citation.cfm?id=512627}}
1787 \end{itemize}
1789 \subsection {Links}
1791 \begin{itemize}
1792 \item Etherboot: \textit{\url{http://www.etherboot.org/}}
1793 \item Filo: \textit{\url{http://www.coreboot.org/FILO}}
1794 \item OpenBIOS: \textit{\url{http://www.openbios.org/}}
1795 \end{itemize}
1797 \end{document}