diff options
author | Stefan Reinauer <stefan.reinauer@coreboot.org> | 2015-05-05 13:10:04 -0700 |
---|---|---|
committer | Stefan Reinauer <stefan.reinauer@coreboot.org> | 2015-05-06 19:09:47 +0200 |
commit | 4d8b843d3740cc90c98f181d49f0d4a67cb0a1b7 (patch) | |
tree | 19306425b170975b5317a63a84b0e6f4b94b5f40 /documentation/RFC | |
parent | 29ed46caccd5cea8401c5d133895fa3a9d6f5030 (diff) | |
download | coreboot-4d8b843d3740cc90c98f181d49f0d4a67cb0a1b7.tar.xz |
Rename documentation -> Documentation
In order to be closer to the Linux kernel source tree
structure, rename documentation to Documentation.
Change-Id: I8690f666638ef352d201bd3c3dc1923b0d24cb12
Signed-off-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
Reviewed-on: http://review.coreboot.org/10110
Tested-by: build bot (Jenkins)
Reviewed-by: Patrick Georgi <pgeorgi@google.com>
Diffstat (limited to 'documentation/RFC')
-rw-r--r-- | documentation/RFC/chip.tex | 266 | ||||
-rw-r--r-- | documentation/RFC/config.tex | 291 |
2 files changed, 0 insertions, 557 deletions
diff --git a/documentation/RFC/chip.tex b/documentation/RFC/chip.tex deleted file mode 100644 index 5e366b8461..0000000000 --- a/documentation/RFC/chip.tex +++ /dev/null @@ -1,266 +0,0 @@ - RFC for the chip specification architecture - -\begin{abstract} -At the end of this document is the original message that motivated the -change. -\end{abstract} - -\section{Scope} -This document defines how LinuxBIOS programmers can specify chips that -are used, specified, and initalized. The current scope is for superio -chips, but the architecture should allow for specification of other chips such -as southbridges. Multiple chips of same or different type are supported. - -\section{Goals} -The goals of the new chip architecture are these: -\begin{itemize} -\item seperate implementation details from specification in the Config file -(translation: no more C code in Config files) -\item make the specification easier for people to use and understand -\item remove private details of a given chip to the chip file as much -as possible -\item allow unique register-set-specifiers for each chip -\end{itemize} - -\section{Specification in the Config file} -The specification looks like this: -\begin{verbatim} -chip <name> [path=<path>] ["<configuration>"] -\end{verbatim} -The name is in the standard LinuxBIOS form of type/vendor/name, e.g. -"southbridge/intel/piix4e" or "superio/ite/it8671f". The class of the -chip is derived from the first pathname component of the name, and the chip -configuration is derived from the following components. - -The path defines the access mechanism to the chip. -It is optional. If present, it overrides the default path to the chip. - -The configuration defines chip-specific configuration details, and is also -optional. Note that an empty configuration will leave the chip with -no enabled resources. This may be desirable in some cases. - -\section{Results of specifying a chip} - -When one or more chips are specified, the data about the chips -is saved until the entire file is parsed. At this point, the config tool -creates a file in the build directory called chip.c This file contains -a common struct containing information about -each individual chip and an array of pointers to these structures. - -For each chip, there are two structures. The structures contain control -information for the chip, and register initialization information. The -names of the structures are derived by ``flattening'' the chip name, -as in the current linuxbios. For example, superio/ite/xyz uses -two structs, one called superio_ite_xyz_control and one called -superio_ite_xyz_init. The control struct is initialized from the -chip name and path information, and has a pointer to the -config struct. The config struct is initialized from the quote string - -\begin{verbatim} -From rminnich@lanl.gov Fri May 16 10:34:13 2003 -Date: Tue, 13 May 2003 08:11:46 -0600 (MDT) -From: ron minnich <rminnich@lanl.gov> -To: linuxbios@clustermatic.org -Subject: RFC:new superio proposal - -Abstract: - The superio architecture for linuxbios has worked for the last 2 -years but is being stretched to the limit by the changes in superio chips. -The architecture depended on superio resources being relatively constant -between chips, but this assumption no longer holds. In this document we -propose several alternatives and solicit comments. - -Overview: -The superio architecture in linuxbios was developed over time, and -modified as circumstances required. In the beginning it was relatively -simple and assumed only one superio per mainboard. The latest version -allows an arbitrary number of superios per mainboard, and allows complete -specification of the superio base I/O address along with the specification -of reasonable default valures for both the base I/O address and the -superio parameters such as serial enable, baud rate, and so on. - -Specification of superio control parameters is done by a configuration -line such as: - -nsuperio sis/950 com1={1} floppy=1 lpt=1 - -This fragment sets the superio type to sis/950; sets com1, floppy, and lpt -to enabled; and leaves the defaults to com1 (baud rate, etc.) to the -default values. - -While it is not obvious, these configuration parameters are fragments of a -C initializer. The initializers are used to build a statically initialized -structure of this type: - -struct superio { - struct superio_control *super; // the ops for the device. - unsigned int port; // if non-zero, overrides the default port - // com ports. This is not done as an array (yet). - // We think it's easier to set up from python if it is not an - // array. - struct com_ports com1, com2, com3, com4; - // DMA, if it exists. - struct lpt_ports lpt1, lpt2; - /* flags for each device type. Unsigned int. */ - // low order bit ALWAYS means enable. Next bit means to enable - // LPT is in transition, so we leave this here for the moment. - // The winbond chips really stretched the way this works. - // so many functions! - unsigned int ide, floppy, lpt; - unsigned int keyboard, cir, game; - unsigned int gpio1, gpio2, gpio3; - unsigned int acpi,hwmonitor; -}; - -These structures are, in turn, created and statically initialized by a -config-tool-generated structure that defines all the superios. This file -is called nsuperio.c, is created for each mainboard you build, only -appears in the build directory, and looks like this: - -=== -extern struct superio_control superio_winbond_w83627hf_control; - -struct superio superio_winbond_w83627hf= { - &superio_winbond_w83627hf_control, - .com1={1}, .com2={1}, .floppy=1, .lpt=1, .keyboard=1, .hwmonitor=1}; - -struct superio *all_superio[] = {&superio_winbond_w83627hf, -}; - -unsigned long nsuperio = 1; -=== - -This example shows a board with one superio (nsuperio). The superio -consists of a winbond w83627hf, with com1, com2, floppy, lpt, keyboard, -and hwmonitor enabled. Note that this structure also allows for -over-riding the default superio base, although that capability is rarely -used. - -The control structure is used to define how to access the superio for -purposes of control. It looks like this: -=== -struct superio_control { - void (*pre_pci_init)(struct superio *s); - void (*init)(struct superio *s); - void (*finishup)(struct superio *s); - unsigned int defaultport; /* the defaultport. Can be overridden - * by commands in config - */ - // This is the print name for debugging - char *name; -}; -=== - -There are three methods for stages of hardwaremain. First is pre_pci_init -(for chips like the acer southbridge that require you to enable some -resources BEFORE pci scan); init, called during the 'middle' phase of -hardwaremain; and finishup, called before the payload is loaded. - -This approach was inspired by and borrows heavily on the Plan 9 kernel -configuration tools. - -The problem: - -When the first version of the superio structure came out it was much -smaller. It has grown and in the limit this structure is the union of all -possibly superio chips. Obviously, in the long term, this is not -practical: we can not anticipate all possible superio chips for all time. - -The common PC BIOS solution to this type of problem is to continue with -binary structures but add version numbers to them, so that all code that -uses a given structure has to check the version number. Personally, I find -this grotesque and would rather not work this way. - -Using textual strings for configuration is something I find far more -attractive. Plan 9 has shown that this approach has no real limits and -suffices for configuration tasks. The Linux kernel does more limited use -of strings for configuration, but still depends on them. Strings are -easier to read and work with than binary structures, and more important, a -lot easier to deal with when things start going wrong. - -The proposed solution: - -What follows are three possible ideas for specifying superio resources and -their settings. - -A common part of the new idea is to eliminate the common superio -structure, due to the many variations in chips, and make it invisible -outside a given superio source file -- the superio structure is now -private to a given superio. Thus, sis/950/superio.c would contain its own -superio structure definitions, and also might contain more than once -instance of these structures (consider a board with 2 sis 950 chips). - -The control structure would change as follows: -struct superio_control { - int (*create)(struct superio *s); - void (*pre_pci_init)(struct superio *s); - void (*init)(struct superio *s); - void (*finishup)(struct superio *s); - unsigned int defaultport; /* the defaultport. Can be overridden - * by commands in config - */ - // This is the print name for debugging - char *name; -}; - -I.e. we add a new function for creating the superio. - -Communication of superio settings from linuxbios to the superio would be -via textual strings. The superio structure becomes this: - -struct superio { - struct superio_control *super; // the ops for the device. - unsigned int port; // if non-zero, overrides the default port - struct configuration *config; -}; - - -So now the question becomes, what is the configuration structure? -There are several choices. The simplest, from my point of view, are -keyword-value pairs: -struct configuration { - const char *keyword; - const char *value; -}; - -These get filled in by the config tool as before. The linuxbios libary can -then provide a generic parsing function for the superios to use. - -The remaining question is how should the superio command look in -freebios2? - -superio sis/950 "com1=115200,8n1 lpt=1 com2=9600" - -or - -superio sis/950 "com1baud=115200 lpt=1 com1chars=8n1" - -or - -superio sis/950 ((com1 115200 8n1) (lpt 1)) - -So, my questions: - -1. Does this new scheme look workable. If not, what needs to change? -2. What should the 'struct configuration' be? does keyword/value work? -3. what should the superio command look like? - -Comments welcome. - -I'd like to adopt this "RFC" approach for freebios2 as much as we can. -There was a lot of give-and-take in the early days of linuxbios about -structure and it proved useful. There's a lot that will start happening in -freebios2 now, and we need to try to make sure it will work for everyone. - -Those of you who are doing mainboards, please look at freebios2 and see -how it looks for you. There's a lot of good work that has been done (not -by me so far, thanks Eric and Stefan), and more that needs to be done. -Consider trying out romcc as an "assembly code killer". See how it fits -together and if you can work with it or need changes. Bring comments back -to this list. - -thanks - -ron - -\end{verbatim} diff --git a/documentation/RFC/config.tex b/documentation/RFC/config.tex deleted file mode 100644 index 6d6c433025..0000000000 --- a/documentation/RFC/config.tex +++ /dev/null @@ -1,291 +0,0 @@ - New config language for LinuxBIOS - -\begin{abstract} -We describe the new configuration language for LinuxBIOS. -\end{abstract} - -\section{Scope} -This document defines the new configuration language for LinuxBIOS. - -\section{Goals} -The goals of the new language are these: -\begin{itemize} -\item Simplified Makefiles so people can see what is set -\item Move from the regular-expression-based language to something -a bit more comprehensible and flexible -\item make the specification easier for people to use and understand -\item allow unique register-set-specifiers for each chip -\item allow generic register-set-specifiers for each chip -\item generate static initialization code, as needed, for the -specifiers. -\end{itemize} - -\section{Language} -Here is the new language. It is very similar to the old one, differing -in only a few respects. It borrows heavily from Greg Watson's suggestions. - -I am presenting it in a pseudo-BNF in the hopes it will be easier. Things -in '' are keywords; things in ``'' are strings in the actual text. -\begin{verbatim} -#exprs are composed of factor or factor + factor etc. -expr ::= factor ( ``+'' factor | ``-'' factor | )* -#factors are term or term * term or term / term or ... -factor ::= term ( ``*'' term | ``/'' term | ... )* -# -unary-op ::= ``!'' ID -# term is a number, hexnumber, ID, unary-op, or a full-blown expression -term ::= NUM | XNUM | ID | unary-op | ``(`` expr ``)'' - -# Option command. Can be an expression or quote-string. -# Options are used in the config tool itself (in expressions and 'if') -# and are also passed to the C compiler when building linuxbios. -# It is an error to have two option commands in a file. -# It is an error to have an option command after the ID has been used -# in an expression (i.e. 'set after used' is an error) -option ::= 'option' ID '=' (``value'' | term) - -# Default command. The ID is set to this value if no option command -# is scanned. -# Multiple defaults for an ID will produce warning, but not errors. -# It is OK to scan a default command after use of an ID. -# Options always over-ride defaults. -default ::= 'default' ID '=' (``value'' | term) - -# the mainboard, southbridge, northbridge commands -# cause sourcing of Config.lb files as in the old config tool -# as parts are sourced, a device tree is built. The structure -# of the tree is determined by the structure of the components -# as they are specified. To attach a superio to a southbridge, for -# example, one would do this: -# southbridge acer/5432 -# superio nsc/123 -# end -# end -# the tool generates static initializers for this hierarchy. - -# add C code to the current component (motherboard, etc. ) -# to initialise the component-INDEPENDENT structure members -init ::= 'init' ``CODE'' - -# add C code to the current component (motherboard, etc. ) -# to initialise the component-DEPENDENT structure members -register ::= 'register' ``CODE'' - - -# mainboard command -# statements in this block will set variables controlling the mainboard, -# and will also place components (northbridge etc.) in the device tree -# under this mainboard -mainboard ::= 'mainboard' PATH (statements)* 'end' - -# standard linuxbios commands -southbridge ::= 'southbridge' PATH (statemnts)* 'end' -northbridge ::= 'northbridge' PATH (statemnts)* 'end' -superio ::= 'superio PATH (statemnts)* 'end' -cpu ::= 'cpu' PATH (statemnts)* 'end' -arch ::= 'arch' PATH (statemnts)* 'end' - -# files for building linuxbios -# include a file in crt0.S -mainboardinit ::= 'mainboardinit' PATH - -# object file -object ::= 'object' PATH -# driver objects are just built into the image in a different way -driver ::= 'driver' PATH - -# Use the Config.lb file in the PATH -dir ::= 'dir' PATH - -# add a file to the set of ldscript files -ldscript ::= 'ldscript' PATH - -# dependencies or actions for the makerule command -dep ::= 'dep' ``dependency-string'' -act ::= 'act' ``actions'' -depsacts ::= (dep | act)* -# set up a makerule -# -makerule ::= 'makerule' PATH depsacts - -#defines for use in makefiles only -# note usable in the config tool, not passed to cc -makedefine ::= 'makedefine' ``RAWTEXT'' - -# add an action to an existing make rule -addaction ::= 'addaction' PATH ``ACTION'' - -# statements -statement ::= - option - | default - | cpu - | arch - | northbridge - | southbridge - | superio - | object - | driver - | mainboardinit - | makerule - | makedefine - | addaction - | init - | register - | iif - | dir - | ldscript - -statements ::= (statement)* - -# target directory specification -target ::= 'target' PATH - -# and the whole thing -board ::= target (option)* mainboard - -\end{verbatim} - -\subsubsection{Command definitions} -\subsubsubsection{option} -\subsubsubsection{default} -\subsubsubsection{cpu} -\subsubsubsection{arch} -\subsubsubsection{northbridge} -\subsubsubsection{southbridge} -\subsubsubsection{superio} -\subsubsubsection{object} -\subsubsubsection{driver} -\subsubsubsection{mainboardinit} -\subsubsubsection{makerule} -\subsubsubsection{makedefine} -\subsubsubsection{addaction} -\subsubsubsection{init} -\subsubsubsection{register} -\subsubsubsection{iif} -\subsubsubsection{dir} -\subsubsubsection{ldscript} - - -A sample file: - -\begin{verbatim} -target x - -# over-ride the default rom size in the mainboard file -option CONFIG_ROM_SIZE=1024*1024 -mainboard amd/solo -end - -\end{verbatim} - -Sample mainboard file -\begin{verbatim} -# -### -### Set all of the defaults for an x86 architecture -### -arch i386 end -cpu k8 end -# -option CONFIG_DEBUG=1 -default CONFIG_USE_FALLBACK_IMAGE=1 -option A=(1+2) -option B=0xa -# -### -### Build our 16 bit and 32 bit linuxBIOS entry code -### -mainboardinit cpu/i386/entry16.inc -mainboardinit cpu/i386/entry32.inc -ldscript cpu/i386/entry16.lds -ldscript cpu/i386/entry32.lds -# -### -### Build our reset vector (This is where linuxBIOS is entered) -### -if CONFIG_USE_FALLBACK_IMAGE - mainboardinit cpu/i386/reset16.inc - ldscript cpu/i386/reset16.lds -else - mainboardinit cpu/i386/reset32.inc - ldscript cpu/i386/reset32.lds -end -. -. -. -if CONFIG_USE_FALLBACK_IMAGE mainboardinit arch/i386/lib/noop_failover.inc end -# -### -### Romcc output -### -#makerule ./failover.E dep "$(CONFIG_MAINBOARD)/failover.c" act "$(CPP) -I$(TOP)/src $(CPPFLAGS) $(CONFIG_MAINBOARD)/failover.c > ./failever.E" -#makerule ./failover.inc dep "./romcc ./failover.E" act "./romcc -O ./failover.E > failover.inc" -#mainboardinit ./failover.inc -makerule ./auto.E dep "$(CONFIG_MAINBOARD)/auto.c" act "$(CPP) -I$(TOP)/src -$(ROMCCPPFLAGS) $(CPPFLAGS) $(CONFIG_MAINBOARD)/auto.c > ./auto.E" -makerule ./auto.inc dep "./romcc ./auto.E" act "./romcc -O ./auto.E > auto.inc" -mainboardinit ./auto.inc -# -### -### Include the secondary Configuration files -### -northbridge amd/amdk8 -end -southbridge amd/amd8111 -end -#mainboardinit arch/i386/smp/secondary.inc -superio nsc/pc87360 - register "com1={1} com2={0} floppy=1 lpt=1 keyboard=1" -end -dir /pc80 -##dir /src/superio/winbond/w83627hf -cpu p5 end -cpu p6 end -cpu k7 end -cpu k8 end -# -### -### Build the objects we have code for in this directory. -### -##object mainboard.o -driver mainboard.o -object static_devices.o -if CONFIG_HAVE_MP_TABLE object mptable.o end -if CONFIG_HAVE_PIRQ_TABLE object irq_tables.o end -### Location of the DIMM EEPROMS on the SMBUS -### This is fixed into a narrow range by the DIMM package standard. -### -option SMBUS_MEM_DEVICE_START=(0xa << 3) -option SMBUS_MEM_DEVICE_END=(SMBUS_MEM_DEVICE_START +1) -option SMBUS_MEM_DEVICE_INC=1 -# -### The linuxBIOS bootloader. -### -option CONFIG_PAYLOAD_SIZE = (CONFIG_ROM_SECTION_SIZE - CONFIG_ROM_IMAGE_SIZE) -option CONFIG_ROM_PAYLOAD_START = (0xffffffff - CONFIG_ROM_SIZE + CONFIG_ROM_SECTION_OFFSET + 1) -# - -\end{verbatim} - -I've found the output of the new tool to be easier to -handle. Makefile.settings looks like this, for example: -\begin{verbatim} -TOP:=/home/rminnich/src/yapps2/freebios2 -TARGET_DIR:=x -export CONFIG_MAINBOARD:=/home/rminnich/src/yapps2/freebios2/src/mainboard/amd/solo -export CONFIG_ARCH:=i386 -export CONFIG_RAMBASE:=0x4000 -export CONFIG_ROM_IMAGE_SIZE:=65535 -export CONFIG_PAYLOAD_SIZE:=131073 -export CONFIG_MAX_CPUS:=1 -export CONFIG_HEAP_SIZE:=8192 -export CONFIG_STACK_SIZE:=8192 -export CONFIG_MEMORY_HOLE:=0 -export COREBOOT_VERSION:=1.1.0 -export CC:=$(CONFIG_CROSS_COMPILE)gcc - -\end{verbatim} - -In other words, instead of expressions, we see the values. It's easier to -deal with. - |