<!--

	The SGML source of the BootPrompt-Howto
	=====================================

	Maintained by Paul Gortmaker.

	Modification Date: Aug 15, 1995

	(Don't forget to update the reference to the current kernel version
	in the Introduction section, and the date/version in the abstract!)

	The "==" are because two dashes together inside an SGML comment 
	will crash it.  :-(

	History:

	1) August 1995 == Still no comprehensive list of kernel arguments
	   for users to look up existence/usage info. So I hacked this up, 
	   having experience with the linuxdoc-sgml stuff from the 
	   Ethernet-HowTo. (Of course the most up-to-date list is the kernel 
	   itself, but that does not lend itself well to beginners.) 

-->

<!doctype linuxdoc system>

<article>

<title>Linux BootPrompt-Howto
<author>Paul Gortmaker, Editor.
<date>v1.01, 18 August 1995

<abstract>
	This is the BootPrompt-Howto, which is a compilation of all the
	possible boot time arguments that can be passed to the Linux
	kernel at boot time. This includes all kernel and device parameters.
	An overview of some of the popular software used to boot Linux
	kernels is included.
</abstract>

<toc>

<sect>Introduction<label id="main-intro">
<p>

	The kernel has a limited capability to accept information at
	boot in the form of a `command line', similar to an argument
	list you would give to a program. In general this is used to 
	supply the kernel with information about hardware parameters
	that the kernel would not be able to determine on its own, or
	to avoid/override the values that the kernel would otherwise
	detect.

	However, if you just copy a kernel image directly to a floppy,
	(e.g. <tt> cp zImage /dev/fd0</tt>) then
	you are not given a chance to specify any arguments to that
	kernel. So most Linux users will use software like <em/LILO/
	or <em/loadlin/ that takes care of handing these arguments 
	to the kernel, and then booting it.

	This present revision covers distribution kernels up to and 
	including v1.2.13. Information pertaining to development
	kernels up to version 1.3.18 is also documented.

	The BootPrompt-Howto is edited and maintained by:
<quote>
	Paul Gortmaker, <tt/Paul.Gortmaker@anu.edu.au/
</quote>


<sect1>Disclaimer and Copyright<label id="copyright">
<p>

	This document is <em/not/ gospel. However, it is probably the most
	up to date info that you will be able to find. Nobody is responsible
	for what happens to your hardware but yourself. If your
	hardware goes up in smoke (...nearly impossible!)
	I take no responsibility. ie. THE AUTHOR IS NOT RESPONSIBLE
	FOR ANY DAMAGES INCURRED DUE TO ACTIONS TAKEN BASED ON THE
	INFORMATION INCLUDED IN THIS DOCUMENT.

	This document is Copyright (c) 1995 by 
	Paul Gortmaker. Permission is granted to make and distribute
	verbatim copies of this manual provided the copyright notice
	and this permission notice are preserved on all copies.

	Permission is granted to copy and distribute modified versions
	of this document under the conditions for verbatim copying,
	provided that this copyright notice is included exactly as in
	the original, and that the entire resulting derived work is
	distributed under the terms of a permission notice identical
	to this one.

	Permission is granted to copy and distribute translations
	of this document into another language, under the above
	conditions for modified versions.

	If you are intending to incorporate this document into a
	published work, please contact me, and I will make an effort
	to ensure that you have the most up to date information
	available. In the past, out of date versions of the Linux
	howto documents have been published, which caused the developers
	undue grief from being plagued with questions that were already
	answered in the up to date versions.

<sect1>Related Documentation<label id="other_docs">
<p>

	The most up-to-date documentation will always be the kernel
	source itself. Hold on! Don't get scared. You don't need to
	know any programming to read the comments in the source files.
	For example, if you were looking for what arguments could be
	passed to the AHA1542 SCSI driver, then you would go to the
	<tt>linux/drivers/scsi</tt> directory, and look at the
	file <tt/aha1542.c/ -- and within the first 100 lines, you
	would find a plain english description of the boot time arguments
	that the 1542 driver accepts.

	If you have figured out what boot-args you intend to use, and
	now want to know how to get that information to the kernel, then
	look at the documentation that comes with the software that you
	use to boot the kernel (e.g. LILO or loadlin).

<sect1>The Linux Newsgroups<label id="news">
<p>

	If you have questions about passing boot arguments to the 
	kernel, please READ this document first. If this and the
	related documentation mentioned above does not answer your
	question(s) then you can try the Linux newsgroups.

	General questions on how to configure your system
	should be directed to comp.os.linux.setup.
	We ask that you <em/please/ respect this general guideline 
	for content, and don't cross-post your request to other groups.

<sect1>New Versions of this Document<label id="new-doc">
<p>

	New versions of this document can be retrieved via anonymous
	FTP from sunsite.unc.edu, in /pub/Linux/docs/HOWTO/* and various
	Linux ftp mirror sites. Updates will be made
	as new information / drivers becomes available. If this copy
	that you are reading is more than 3 months old, it is either out of
	date, or it means that I have been lazy and haven't updated it.
	This document was produced by using the SGML system that was
	specifically set up for the Linux Howto project, and there are
	various output formats available, including, postscript, dvi,
	ascii, html, and soon TeXinfo.

	I would recommend viewing it in the html (via a WWW browser) or the
	Postscript/dvi format. Both of these contain cross-references
	that are lost in the ascii translation.

	If you want to get the official copy off sunsite, here is URL.

	<url url="http://sunsite.unc.edu/mdw/HOWTO/BootPrompt-HOWTO.html"
		name="BootPrompt-HOWTO">

	If minor additions and changes have been made, you can view the 
	latest working copy from this URL.

	<url url="http://rsphy1.anu.edu.au/&tilde;gpg109/BootPrompt-HOWTO.html"
		name="Working Copy">

<sect>Overview of Boot Prompt Arguments<label id="oview">
<p>
	
	This section gives some examples of software that can be used
	to pass kernel boot-time arguments to the kernel itself.
	It also gives you an idea of how the arguments are processed,
	what limitations there are on the boot args, and how they filter
	down to each appropriate device that they are intended for.

<sect1>LILO (LInux LOader)<label id="lilo">
<p>

	The LILO program (LInux LOader) written by Werner Almesberger
	is the most commonly used. It has the ability to boot
	various kernels, and stores the configuration information
	in a plain text file. Most distributions ship with LILO
	as the default boot-loader. LILO can boot DOS, OS/2 Linux,
	FreeBSD, etc. without any difficulties, and is quite flexible.

	LILO ships with excellent documentation, and for the purposes
	of boot args discussed here, the LILO <tt/append=/ command
	is of significant importance.

<sect1>LoadLin<label id="loadlin">
<p>

	The other commonly used Linux loader is `LoadLin' which is
	a DOS program that has the capability to launch a Linux
	kernel from the DOS prompt (with boot-args) assuming that
	certain resources are available. This is good for people
	that use DOS and want to launch into Linux from DOS. 

	It is also very useful if you have certain hardware which relies
	on the supplied DOS driver to put the hardware into a known
	state. A common example is `SoundBlaster Compatible' sound
	cards that require the DOS driver to twiddle a few mystical
	registers to put the card into a SB compatible mode. Booting
	DOS with the supplied driver, and then loading Linux from
	the DOS prompt with loadlin avoids the reset of the card that
	happens if one rebooted instead. Thus the card is left in a
	Sb compatible mode and hence is useable under Linux.

	There are also other programs that can be used to boot Linux.
	For a complete list, please look at the programs available
	on your local Linux ftp mirror, under <tt>system/Linux-boot/</tt>.

<sect1>The ``rdev'' utility<label id="rdev">
<p>

	There are a few of the kernel boot parameters that have their
	default values stored in various bytes in the kernel image itself.
	There is a utility called <tt/rdev/ that is installed on most
	systems that knows where these values are, and how to change them.
	It can also change things that have no kernel boot argument 
	equivalent, such as the default video mode used.

	The rdev utility is usually also aliased to swapdev, ramsize,
	vidmode and rootflags. These are the five things that rdev
	can change, those being the root device, the swap device, 
	the RAM disk size, the default video mode, and the 	
	readonly/readwrite setting of root device.

	More information on <tt/rdev/ can be found by typing
	<tt/rdev -h/ or by reading the supplied man page.

<sect1>How the Kernel Sorts the Arguments
<p>

	Most of the boot args take the form of:
<code>
	name&lsqb;=value_1&rsqb;&lsqb,value_2&rsqb;...&lsqb,value_11&rsqb
</code>

	where `name' is a unique keyword that is used to identify
	what part of the kernel the associated values (if any) are to be
	given to. Multiple boot args are just a space separated list
	of the above format. Note the limit of 11 is real, as the
	present code only handles 11 comma separated parameters per
	keyword. (However, you can re-use the same keyword with 
	up to an additional 11 parameters in unusually complicated
	situations, assuming the setup function supports it.)

	Most of the sorting goes on in <tt>linux/init/main.c</tt>.
	First, the kernel ckecks to see if the argument is any of
	the special arguments `root=', `ro', `rw', or `debug'.
	The meaning of these special arguments is described further
	on in the document.

	Then it walks a list of	setup functions (contained in the
	<tt/bootsetups/ array) to see if the specified
	argument string (such as `foo') has been associated with a
	setup function (`foo_setup()') for a particular 
	device or part of the kernel. If you
	passed the kernel the line <tt>foo=3,4,5,6</tt> then the
	kernel would search the <tt/bootsetups/ array to see if
	`foo' was registered. If it was, then it would call the 
	setup function associated with `foo' (foo_setup())
	and hand it the arguments
	3, 4, 5 and 6 as given on the kernel command line.

<sect1>Setting Environment Variables.
<p>

	Anything of the form `foo=bar' that is not accepted as a 
	setup funtion as described above is then interpreted as an 
	environment variable to be set. A (useless?) example would
	be to use `TERM=vt100' as a boot argument.

<sect1>Passing Arguments to `init'
<p>

	Any remaining arguments that were not picked up by the
	kernel and were not interpreted as environment variables
	are then passed onto process one, which is usually the
	<tt/init/ program. The most common argument that is passed to 
	the <tt/init/ process is the word <em/single/ which instructs 
	<tt/init/ to boot the computer in single user mode, and not
	launch all the usual daemons. Check the manual page for the
	version of <tt/init/ installed on your system to see what
	arguments it accepts.

<sect>General Non-Device Specific Boot Args<label id="general">
<p>

	These are the boot arguments that are not related to any
	specific device or peripheral. They are instead related to 
	certain internal kernel parameters.

<sect1>The `no387' Argument
<p>

	Some i387 coprocessor chips have bugs that show up when 
	used in 32 bit protected mode. For example, some of the
	early ULSI-387 chips would cause solid lockups while
	performing floating point calculations. Using the `no387'
	boot arg causes Linux to ignore the maths coprocessor
	even if you have one. Of course you must then have your
	kernel compiled with math emulation support!

<sect1>The `no-hlt' Argument
<p>

	The i386 (and sucessors thereof) family of CPUs have a
	`hlt' instruction which tells the CPU that nothing is
	going to happen until an external device (keyboard, modem,
	disk, etc.) calls upon the CPU to do a task. This allows the
	CPU to enter a `low-power' mode where it sits like a zombie
	until an external device wakes it up (usually via an interrupt).
	Some of the early i486DX-100 chips had a problem  with the 
	`hlt' instruction, in that they couldn't reliably return to
	operating mode after this instruction was used. Using the
	`no-hlt' instruction tells Linux to just run an infinite loop
	when there is nothing else to do, and to <em/not/ halt your
	CPU when there is no activity. This allows people with these
	broken chips to use Linux, although they would be well advised
	to seek a replacement through a warranty where possible.

<sect1>The `root=' Argument
<p>

	This argument tells the kernel what device is to be used as
	the root filesystem while booting. The default of this setting
	is the value of the root device of the system that 
	the kernel was built on.
	For example, if the kernel in question was built on a system
	that used `/dev/hda1' as the root partition, then the default
	root device would be `/dev/hda1'.  To override this default
	value, and select the second floppy drive as the root device,
	one would use `root=/dev/fd1'.

	Valid root devices are partitions on any of the following
	disk devices: 

	(1) /dev/hdaN to /dev/hddN, which is partition N on ST-506 
	compatible disk `a to d'.

	(2) /dev/sdaN to /dev/sdeN, which is partition N on SCSI
	compatible disk `a to e'.

	(3) /dev/xdaN to /dev/xdbN, which is partition N on XT
	compatible disk `a to b'.

	(4) /dev/fdN, which is floppy disk drive number N. Having
	N=0 would be the DOS `A:' drive, and N=1 would be `B:'.

	The more awkward and less portable numeric specification
	of the above possible root devices in major/minor format is 
	also accepted. (e.g. /dev/sda3 is major 8, minor 3, so you
	could use <tt/root=0x803/ as an alternative.)

	This is one of the few kernel boot arguments that has its
	default stored in the kernel image, and which can thus
	be altered with the <tt/rdev/ utility.
	

<sect1>The `ro' Argument
<p>

	When the kernel boots, it needs a root filesystem to read
	basic things off of. This is the root filesystem that is
	mounted at boot. However, if the root filesystem is mounted
	with write access, you can not reliably check the filesystem
	integrity with half-written files in progress. The `ro'
	option tells the kernel to mount the root filesystem as
	`readonly' so that any filesystem consistency check programs
	(fsck) can safely assume that there are no half-written 
	files in progress while performing the check. No programs
	or processes can write to files on the filesystem in
	question until it is `remounted' as read/write capable.

	This is one of the few kernel boot arguments that has its
	default stored in the kernel image, and which can thus
	be altered with the <tt/rdev/ utility.
	
<sect1>The `rw' Argument
<p>

	This is the exact opposite of the above, in that it tells the
	kernel to mount the root filesytem as read/write. The default 
	is to mount the root filesystem as read/write anyways. Do not
	run any `fsck' type programs on a filesystem that is mounted
	read/write.

	The same value stored in the image file mentioned above is
	also used for this parameter, accesible via <tt/rdev/.

<sect1>The `debug' Argument
<p>

	The kernel communicates important (and not-so important)
	messages to the operator via the <tt/printk()/ function.
	If the message is considered important, the <tt/printk()/
	function will put a copy on the present console as well
	as handing it off to the <tt/klogd()/ facility so that it
	gets logged to disk. The reason for printing important
	messages to the console as well as logging them to disk is
	because under unfortunate circumstances (e.g. a disk failure)
	the message won't make it to disk and will be lost.

	The threshold for what is and what isn't considered important
	is set by the <tt/console_loglevel/ variable. The default is
	to log anything more important than <tt/DEBUG/ (level 7) to
	the console. (These levels are defined in the include file
	<tt/kernel.h/) Specifying <tt/debug/ as a boot argument will
	set the console loglevel to 10, so that <em/all/ kernel
	messages appear on the console.

	The console loglevel can usually also be set at run time via
	an option to the <tt/klogd()/ program. Check the man page
	for the version installed on your system to see how to do this.

<sect1>The `reserve=' Argument
<p>

	This is used to <em/protect/ I/O port regions from probes.
	The form of the command is:

<tscreen>
	reserve=iobase,extent&lsqb;,iobase,extent&rsqb;...
</tscreen>

	In some machines it may be necessary to prevent device drivers from
	checking for devices (auto-probing) in a specific region. This may be
	because of poorly designed hardware that causes the boot to <em/freeze/
	(such as some ethercards), hardware that is mistakenly identified,
	hardware whose state is changed by an earlier probe, or merely
	hardware you don't want the kernel to initialize.

	The <tt/reserve/ boot-time argument addresses this problem by specifying
	an I/O port region that shouldn't be probed. That region is reserved
	in the kernel's port registration table as if a device has already
	been found in that region. Note that this mechanism shouldn't be
	necessary on most machines. Only when there is a problem or special
	case would it be necessary to use this.

	The I/O ports in the specified region are protected against
	device probes. This was put in to be used when some driver was
	hanging on a NE2000, or misidentifying some other device 
	as its own.  A correct device driver shouldn't probe a reserved 
	region, unless another boot argument explicitly specifies that 
	it do so.  This implies that <tt/reserve/ will most often be used 
	with some other boot argument. Hence if you specify a <tt/reserve/ 
	region to protect a specific device, you must generally specify 
	an explicit probe for that device. Most drivers ignore the port 
	registration table if they are given an explicit address.

	For example, the boot line

<code>
	reserve=0x300,32  blah=0x300
</code>

	keeps all device drivers except the driver for `blah' from 
	probing 0x300-0x31f.

	As usual with boot-time specifiers there is an 11 parameter limit,
	thus you can only specify 5 reserved regions per <tt/reserve/ keyword.
	Multiple <tt/reserve/ specifiers will work if you have an unusually
	complicated request.

<sect1>The `ramdisk=' Argument
<p>

	This specifies the size in kB of the optional RAM disk device.
	For example, if one wished to have a root filesystem on a 1.44MB
	floppy loaded into the RAM disk device, they would use:

<code>
	ramdisk=1440
</code>

	This is one of the few kernel boot arguments that has its
	default stored in the kernel image, and which can thus
	be altered with the <tt/rdev/ utility.

<sect1>The `mem=' Argument
<p>

	The original BIOS call defined in the PC specification  that
	returns the amount of installed memory was only designed to
	be able to report up to 64MB. (Yes, another lack of foresight,
	just like the 1024 cylinder disks... sigh.) Linux uses this
	BIOS call at boot to determine how much memory is installed.
	If you have more than 64MB of RAM installed, you can use this
	boot arg to tell Linux how much memory you have.
	Here is a quote from Linus on usage of the `mem=' parameter.

	``The kernel will accept any `mem=xx' parameter you give it, and if 
	it turns out that you lied to it, it will crash horribly sooner or 
	later.  The parameter indicates the highest addressable RAM address, 
	so `mem=0x1000000' means you have 16MB of memory, for example.  For 
	a 96MB machine this would be `mem=0x6000000'.

	NOTE NOTE NOTE: some machines might use the top of memory for BIOS 
	cacheing or whatever, so you might not actually have up to the full 
	96MB addressable.  The reverse is also true: some chipsets will map 
	the physical memory that is covered by the BIOS area into the area 
	just past the top of memory, so the top-of-mem might actually be
	96MB + 384kB for example.  If you tell linux that it has more memory 
	than it actually does have, bad things will happen: maybe not at 
	once, but surely eventually.''

	Note that the argument does not have to be in hex, and the 
	suffixes `k' and `M' (case insensitive) can be used to specify
	kilobytes and Megabytes, respectively. (A `k' will cause a 10 bit
	shift on your value, and a `M' will cause a 20 bit shift.)
	The above warning still holds, in that a 96MB machine may
	work with <tt/mem=97920k/ but fail with either <tt/mem=98304k/ or
	<tt/mem=96M/.

<sect>Boot Arguments for SCSI Peripherals.
<p>

	This section contains the descriptions of the boot args that
	are used for passing information about the installed SCSI
	host adapters, and SCSI devices.

	General notation for this section: 

	<tt/iobase/ -- the first I/O port that the SCSI host occupies.
	These are specified in hexidecimal notation, and usually lie
	in the range from <tt/0x200/ to <tt/0x3ff/.

	<tt/irq/ -- the hardware interrupt that the card is configured
	to use. Valid values will be dependant on the card in question,
	but will usually be 5, 7, 9, 10, 11, 12, and 15. The other 
	values are usually used for common preipherals like IDE hard
	disks, floppies, serial ports, etc.

	<tt/scsi-id/ -- the ID that the host adapter uses to identify
	itself on the SCSI bus. Only some host adapters allow you to
	change this value, as most have it permanently specified 
	internally. The usual default value is seven, but the Seagate
	and Future Domain TMC-950 boards use six.

	<tt/parity/ -- whether the SCSI host adapter expects the attached
	devices to supply a parity value with all information exchanges.
	Specifying a one indicates parity checking is enabled, and a
	zero disables parity checking. Again, not all adapters will
	support selection of parity behaviour as a boot argument.

<sect1>Maximum Probed LUNs (`max_scsi_luns=')
<p>

	Each SCSI device can have a number of `sub-devices' contained
	within itself. The most common example is one of the new
	SCSI CD-ROMs that handle more than one disk at a time.
	Each CD is addressed as a `Logical Unit Number' (LUN) of
	that particular device. But most devices, such as hard disks,
	tape drives and such are only one device, and will be
	assigned to LUN zero.

	The problem arises with single LUN devices with bad firmware.
	Some poorly designed SCSI devices (old and unfortunately new) 
	can not handle being probed for LUNs not equal to zero. They
	will respond by locking up, and possibly taking the whole
	SCSI bus down with them.

	Newer kernels have the configuration option that allows you
	to set the maximum number of probed LUNs. The default is to
	only probe LUN zero, to avoid the problem described above.

	To specify the number of probed LUNs at boot, one enters
	`max_scsi_luns=n' as a boot arg, where n is a number between 
	one and eight. To avoid problems as described above, one would
	use n=1 to avoid upsetting such broken devices

<sect1>Parameters for SCSI Tape drives (`st=')
<p>
	Some boot time configuration of the SCSI tape driver can
	be achieved by using the following:

<code>
	st=buf_size&lsqb;,write_threshold&lsqb;,max_bufs&rsqb;&rsqb;
</code>

	The fisrt two numbers are specified in units of kB.
	The default <tt/buf_size/ is 32kB, and the maximum size
	that can be specified is a ridiculous 16384kB.
	The <tt/write_threshold/ is the value at which the buffer is
	committed to tape, with a default value of 30kB.
	The maximum number of buffers varies with the number of drives
	detected, and has a default of two. An example usage would be:

<code>
	st=32,30,2
</code>

	Full details can be found in the <tt/README.st/ file that is
	in the <tt/scsi/ directory of the kernel source tree.

<sect1>Adaptec aha151x, aha152x, aic6260, aic6360, SB16-SCSI (`aha152x=')
<p>

	The aha numbers refer to cards and the aic numbers refer to
	the actual SCSI chip on these type of cards, including the
	Soundblaster-16 SCSI.

	The probe code for these SCSI hosts looks for an installed BIOS,
	and if none is present, the probe will not find your card. Then
	you will have to use a boot arg of the form:

<code>
	 aha152x=iobase&lsqb;,irq&lsqb;,scsi-id&lsqb;,reconnect&lsqb;,parity&rsqb;&rsqb;&rsqb;&rsqb;
</code>

	Note that if the driver was compiled with debugging enabled,
	a sixth value can be specified to set the debug level.

	All the parameters are as described at the top of this section,
	and the <tt/reconnect/ value will allow device disconnect/reconnect
	if a non-zero value is used. An example usage is as follows:

<code>
	aha152x=0x340,11,7,1
</code>

	Note that the parameters must be specified in order, meaning that
	if you want to specify a parity setting, then you will have to
	specify an iobase, irq, scsi-id and reconnect value as well.

<sect1>Adaptec aha154x (`aha1542=')
<p>

	These are the aha154x series cards. The aha1542 series cards
	have an i82077 floppy controller onboard, while the aha1540
	series cards do not. These are busmastering cards, and have
	parameters to set the ``fairness'' that is used to share the
	bus with other devices. The boot arg looks like the following.

<code>
	aha1542=iobase&lsqb;,buson,busoff&lsqb;,dmaspeed&rsqb;&rsqb;
</code>

	Valid <tt/iobase/ values are usually one of:
	<tt/0x130, 0x134, 0x230, 0x234, 0x330, 0x334/.
	Clone cards may permit other values.

	The <tt/buson, busoff/ values refer to the number of microseconds
	that the card dominates the ISA bus. The defaults are 11us on, and
	4us off, so that other cards (such as an ISA LANCE Ethernet card)
	have a chance to get access to the ISA bus.

	The <tt/dmaspeed/ value refers to the rate (in MB/s) at which the 
	DMA (Direct Memory Access) transfers proceed at. The default is
	5MB/s. Newer revision cards allow you to select this value as part
	of the soft-configuration, older cards use jumpers. You can use
	values up to 10MB/s assuming that your motherboard is capable of
	handling it. Experiment with caution if using values over 5MB/s.

<sect1>Adaptec aha274x, aha284x, aic7xxx (`aic7xxx=')
<p>

	These boards can accept an argument of the form:

<code>
	aic7xxx=extended,no_reset
</code>

	The <tt/extended/ value, if non-zero, indicates that extended
	translation for large disks is enabled. The <tt/no_reset/
	value, if non-zero, tells the driver not to reset the SCSI bus
	when setting up the host adaptor at boot.
	
<sect1>BusLogic SCSI Hosts (`buslogic=')
<p>

	At present, the buslogic driver accepts only one parameter,
	that being the I/O base. It expects that to be one of the
	following valid values:
	<tt/0x130, 0x134, 0x230, 0x234, 0x330, 0x334/.

<sect1>Future Domain TMC-8xx, TMC-950 (`tmc8xx=')
<p>

	The probe code for these SCSI hosts looks for an installed BIOS,
	and if none is present, the probe will not find your card. Or,
	if the signature string of your BIOS is not recognised then it
	will also not be found. In either case, you will then have to use a 
	boot arg of the form:

<code>
	tmc8xx=mem_base,irq
</code>

	The <tt/mem_base/ value is the value of the memory mapped
	I/O region that the card uses. This will usually be one of
	the following values:
        <tt/0xc8000, 0xca000, 0xcc000, 0xce000, 0xdc000, 0xde000/.

<sect1>Pro Audio Spectrum (`pas16=')
<p>

	The PAS16 uses a NC5380 SCSI chip, and newer models support
	jumper-less configuration. The boot arg is of the form:

<code>
	pas16=iobase,irq
</code>

	The only difference is that you can specify an IRQ value of
	255, which will tell the driver to work without using interrupts,
	albeit at a performance loss. The <tt/iobase/ is usually <tt/0x388/.

<sect1>Seagate ST-0x (`st0x=')
<p>

	The probe code for these SCSI hosts looks for an installed BIOS,
	and if none is present, the probe will not find your card. Or,
	if the signature string of your BIOS is not recognised then it
	will also not be found. In either case, you will then have to use a 
	boot arg of the form:

<code>
	st0x=mem_base,irq
</code>

	The <tt/mem_base/ value is the value of the memory mapped
	I/O region that the card uses. This will usually be one of
	the following values:
        <tt/0xc8000, 0xca000, 0xcc000, 0xce000, 0xdc000, 0xde000/.

<sect1>Trantor T128 (`t128=')
<p>

	These cards are also based on the NCR5380 chip, and accept
	the following options:

<code>
	t128=mem_base,irq
</code>

	The valid values for <tt/mem_base/ are as follows:
	<tt/0xcc000, 0xc8000, 0xdc000, 0xd8000/.

<sect1>Cards that don't Accept Boot Args
<p>

	At present, the following SCSI cards do not make use of any
	boot-time parameters. In some cases, you can <em/hard-wire/
	values by directly editing the driver itself, if required.

	Always IN2000,
	Adaptec aha1740, 
	EATA-DMA, EATA-PIO, 
	Future Domain 16xx, 
	NCR5380 (generic),
	NCR53c7xx to NCR53c8xx, 
	Qlogic,
	Ultrastor (incl. u?4f), 
	Western Digital wd7000,

<sect>Hard Disks
<p>

	This section lists all the boot args associated with standard
	MFM/RLL, ST-506, XT, and IDE disk drive devices.
	Note that both the IDE and the generic ST-506 HD driver
	both accept the `hd=' option.

<sect1>IDE Disk/CD-ROM Driver Parameters
<p>

	The IDE driver accepts a number of parameters, which range
	from disk geometry specifications, to 
	support for broken controller chips. Drive specific
	options are specified by using one of:

	`hda=', `hdb=', `hdc=', or `hdd='.

	Non-drive specific options are specified with the prefix
	`hd='. Note that using a drive specific prefix for a
	non-drive specific option will still work, and the option
	will just be applied as expected.

	Also note that `hd=' can be used to refer to the next unspecified
	drive in the (a, b, c, d) sequence.
	For the following discussions, the `hd=' option will be cited
	for brevity. Please consult the file <tt/README.ide/ in the
	<tt>linux/drivers/block</tt> directory if more information is
	required.

<sect2>The `hd=cyls,heads,sects&lsqb;,wpcom&lsqb;,irq&rsqb;&rsqb;' options
<p>

	These options are used to specify the physical geometry of 
	the disk. Only the first three values are required. The
	cylinder/head/sectors values will be those used by <tt/fdisk/.
	The write precompensation value is ignored for IDE disks.
	The IRQ value specified will be the IRQ used for the interface
	that the drive resides on, and is not really a drive specific
	parameter.

<sect2>The `hd=serialize' option
<p>

	The dual IDE interface CMD-640 chip is broken as designed 
	such that when drives on the secondary interface are used at
	the same time as drives on the primary interface, it will
	corrupt your data. Using this option tells the driver to
	make sure that both interfaces are never used at the same
	time. If you only have up to two drives, both on the primary
	interface, then you don't need to use this option.

<sect2>The `hd=dtc2278' option
<p>

	This option tells the driver that you have a DTC-2278D
	IDE interface. The driver then tries to do DTC specific
	operations to enable the second interface and to enable
	faster transfer modes.

<sect2>The `hd=noprobe' option
<p>
	If a particular drive (e.g. old IDE drive) has problems
	that are a result of being probed, this option can be
	used to disable the probe. An example usage could be:

<code>
	hdb=noprobe hdb=1166,7,17
</code>

	which would disable the probe, but still specify the drive
	geometry so that it would be registered as a valid block
	device, and hence useable.

<sect2>The `hd=nowerr' option
<p>

	Some drives apparently have the WRERR_STAT bit stuck on
	permanently. This enables a work-around for these broken
	devices.

<sect2>The `hd=cdrom' option
<p>

	This tells the IDE driver that there is an ATAPI compatible
	CD-ROM attached in place of a normal IDE hard disk. In most
	cases the CD-ROM is identified automatically, but if it
	isn't then this may help.

<sect1>Standard ST-506 Disk Driver Options (`hd=')
<p>

	The standard disk driver can accept geometry arguments for
	the disks similar to the IDE driver. Note however that it
	only expects three values (C/H/S) -- any more or any less
	and it will silently ignore you. Also, it only accepts
	`hd=' as an argument, i.e. `hda=', `hdb=' and so on are
	not valid here. The format is as follows:

<code>
	hd=cyls,heads,sects
</code>

	If there are two disks installed, the above is repeated
	with the geometry parameters of the second disk.

<sect1>XT Disk Driver Options (`xd=')
<p>

	If you are unfortunate enough to be using one of these old
	8 bit cards that move data at a whopping 125kB/s then here
	is the scoop.  The probe code for these cards looks for an installed 
	BIOS, and if none is present, the probe will not find your card. Or,
	if the signature string of your BIOS is not recognised then it
	will also not be found. In either case, you will then have to use a 
	boot arg of the form:

<code>
	xd=type,irq,iobase,dma_chan
</code>

	The <tt/type/ value specifies the particular manufacturer of the
	card, and are as follows: 0=generic; 1=DTC; 2,3,4=Western Digital,
	5,6,7=Seagate; 8=OMTI. The only difference between multiple types
	from the same manufacturer is the BIOS string used for detection,
	which is not used if the type is specified.

	The <tt/xd_setup()/ function does no checking on the values, and
	assumes that you entered all four values. Don't disappoint it.
	Here is an example usage for a WD1002 controller with the BIOS
	disabled/removed, using the `default' XT controller parameters:

<code>
	xd=2,5,0x320,3
</code>

<sect>CD-ROMs (Non-SCSI/ATAPI/IDE)
<p>

	This section lists all the possible boot args pertaining to
	CD-ROM devices. Note that this does not include SCSI or
	IDE/ATAPI CD-ROMs. See the appropriate section(s) for those
	types of CD-ROMs.

<sect1>The Aztech Interface (`aztcd=')
<p>

	The syntax for this type of card is:

<code>
	aztcd=iobase&lsqb;,magic_number&rsqb;
</code>

	If you set the <tt/magic_number/ to <tt/0x79/ then the driver
	will try and run anyway in the event of an unknown firmware
	version. All other values are ignored.

<sect1>The CDU-31A and CDU-33A Sony Interface (`cdu31a=')
<p>

	This CD-ROM interface is found on some of the Pro Audio
	Spectrum sound cards, and other Sony supplied interface cards.
	The syntax is as follows:

<code>
	cdu31a=iobase,&lsqb;irq&lsqb;,is_pas_card&rsqb;&rsqb;
</code>

	Specifying an IRQ value of zero tells the driver that hardware
	interrupts aren't supported (as on some PAS cards). If your
	card supports interrupts, you should use them as it cuts down
	on the CPU usage of the driver.

	The `is_pas_card' should be entered as `PAS' if using a
	Pro Audio Spectrum card, and otherwise it should not be
	specified at all.

<sect1>The CDU-535 Sony Interface (`sonycd535=')
<p>

	The syntax for this CD-ROM interface is:

<code>
	sonycd535=iobase&lsqb;,irq&rsqb;
</code>

	A zero can be used for the I/O base as a `placeholder'
	if one wishes to specify an IRQ value.

<sect1>The GoldStar Interface (`gscd=')
<p>

	The syntax for this CD-ROM interface is:

<code>
	gscd=iobase
</code>

<sect1>The Mitsumi Standard Interface (`mcd=')
<p>

	The syntax for this CD-ROM interface is:

<code>
	mcd=iobase,&lsqb;irq&lsqb;,wait_value&rsqb;&rsqb;
</code>

	The <tt/wait_value/ is used as an internal timeout value
	for people who are having problems with their drive, and
	may or may not be implemented depending on a compile time
	<tt/DEFINE/.

<sect1>The Mitsumi XA/MultiSession Interface (`mcdx=')
<p>

	At present this `experimental' driver has a setup function, 
	but no parameters are implemented yet (as of 1.3.15).
	This is for the same hardware as above, but the driver
	has extended features.

<sect1>The Optics Storage Interface (`optcd=')
<p>

	The syntax for this type of card is:

<code>
	optcd=iobase
</code>

<sect1>The Phillips CM206 Interface (`cm206=')
<p>

	The syntax for this type of card is:

<code>
	cm206=&lsqb;iobase&rsqb;&lsqb;,irq&rsqb;
</code>

	The driver assumes numbers between 3 and 11 are IRQ values,
	and numbers between <tt/0x300/ and <tt/0x370/ are I/O ports,
	so you can specify one, or both numbers, in any order.
	It also accepts `cm206=auto' to enable autoprobing.
	
<sect1>The Sanyo Interface (`sjcd=')
<p>

	The syntax for this type of card is:

<code>
	sjcd=iobase&lsqb;,irq&lsqb;,dma_channel&rsqb;&rsqb;
</code>

<sect1>The SoundBlaster Pro Interface (`sbpcd=')
<p>

	The syntax for this type of card is:

<code>
	sbpcd=iobase,type
</code>

	where <tt/type/ is one of the following (case sensitive)
	strings: `SoundBlaster', `LaserMate', or `SPEA'.
	The I/O base is that of the CD-ROM interface, and <em/not/
	that of the sound portion of the card.

<sect>Other Hardware Devices
<p>

	Any other devices that didn't fit into any of the above categories
	got lumped together here.

<sect1>Ethernet Devices (`ether=')
<p>
	Different drivers make use of different parameters, but they all
	at least share having an IRQ, an I/O port base value, and
	a name. In its most generic form, it looks something like this:

<code>
	ether=irq,iobase&lsqb;,param_1&lsqb;,param_2,...param_8&rsqb;&rsqb;&rsqb;,name
</code>
	
	The first non-numeric argument is taken as the name.  
	The <tt/param_n/ values (if applicable) usually have
	different meanings for each different card/driver.
	Typical <tt/param_n/ values are used to specify things
	like shared memory address, interface selection, DMA
	channel and the like.

	The most common use of this parameter is to force probing
	for a second ethercard, as the default is to only probe
	for one. This can be accomplished with a simple:

<code>
	ether=0,0,eth1
</code>

	Note that the values of zero for the IRQ and I/O base in the
	above example tell the driver(s) to autoprobe.

	Note that the Ethernet-HowTo has complete and extensive
	documentation on using multiple cards and on the card/driver
	specific implementation of the <tt/param_n/ values
	where used. Interested readers should refer to the section
	in that document on their particular card for more complete 
	information.

<sect1>The Floppy Disk Driver (`floppy=')
<p>

	There are many floppy driver options, and they are all listed in
	<tt/README.fd/ in <tt>linux/drivers/block</tt>. This information
	is taken directly from that file.
	

<sect2>floppy=mask,allowed_drive_mask         
<p>

	Sets the bitmask of allowed drives to <tt/mask/. By default, only units
	0 and 1 of each floppy controller are allowed. This is done because
	certain non-standard hardware (ASUS PCI motherboards) mess up the
	keyboard when accessing units 2 or 3. This option is somewhat
	obsoleted by the cmos option.

<sect2>floppy=all_drives
<p>

	Sets the bitmask of allowed drives to all drives. Use this if you have
	more than two drives connected to a floppy controller.

<sect2>floppy=asus_pci
<p>

	Sets the bitmask to allow only units 0 and 1. (The default)

<sect2>floppy=daring
<p>

	Tells the floppy driver that you have a well behaved floppy controller.
	This allows more efficient and smoother operation, but may fail on
	certain controllers. This may speed up certain operations.

<sect2>floppy=0,daring
<p>

	Tells the floppy driver that your floppy controller should be used
	with caution.

<sect2>floppy=one_fdc
<p>

	Tells the floppy driver that you have only floppy controller (default)

<sect2>floppy=two_fdc <em/or/ floppy=address,two_fdc
<p>

	Tells the floppy driver that you have two floppy controllers. The
	second floppy controller is assumed to be at address. If address
	is not given, 0x370 is assumed.

<sect2>floppy=thinkpad
<p>

	Tells the floppy driver that you have a Thinkpad. Thinkpads use an
	inverted convention for the disk change line.

<sect2>floppy=0,thinkpad
<p>

	Tells the floppy driver that you don't have a Thinkpad.

<sect2>floppy=drive,type,cmos
<p>

	Sets the cmos type of <tt/drive/ to <tt/type/. 
	Additionally, this drive is
	allowed in the bitmask. This is useful if you have more than two
	floppy drives (only two can be described in the physical cmos), or if
	your BIOS uses non-standard CMOS types. 
	Setting the CMOS to 0 for the first two drives (default) makes the
	floppy driver read the physical cmos for those drives.

<sect2>floppy=unexpected_interrupts
<p>

	Print a warning message when an unexpected interrupt is received 
	(default behaviour)

<sect2>floppy=no_unexpected_interrupts <em/or/ floppy=L40SX
<p>

	Don't print a message when an unexpected interrupt is received. This
	is needed on IBM L40SX laptops in certain video modes. (There seems
	to be an interaction between video and floppy. The unexpected interrupts
	only affect performance, and can safely be ignored.)


<sect1>The Sound Driver (`sound=')
<p>

	The sound driver can also accept boot args to override the
	compiled in values. This is not recommended, as it is
	rather complex. It is described in the <tt/Readme.Linux/
	file, in <tt>linux/drivers/sound</tt>. It accepts a boot arg
	of the form:

<code>
	sound=device1&lsqb;,device2&lsqb;,device3...&lsqb;,device11&rsqb;&rsqb;&rsqb;
</code>

	where each <tt/deviceN/ value is of the following format
	<tt/0xTaaaId/ and the bytes are used as follows:

	T - device type: 1=FM, 2=SB, 3=PAS, 4=GUS, 5=MPU401, 6=SB16, 7=SB16-MPU401

	aaa - I/O address in hex.

	I - interrupt line in hex (i.e 10=a, 11=b, ...)

	d - DMA channel.

	As you can see it gets pretty messy, and you are better off to
	compile in your own personal values as recommended. Using a boot
	arg of `sound=0' will disable the sound driver entirely.

<sect1>The Bus Mouse Driver (`bmouse=')
<p>

	The busmouse driver only accepts one parameter, that being
	the hardware IRQ value to be used.

<sect>Closing
<p>

	If you have found any glaring typos, or outdated info in this
	document, please let me know. It is easy to overlook stuff.

	Thanks,

	Paul Gortmaker, <tt/Paul.Gortmaker@anu.edu.au/

</article>
