Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
This commit is contained in:
commit
7022b15e2a
|
@ -27,6 +27,7 @@ TAGS
|
||||||
vmlinux*
|
vmlinux*
|
||||||
!vmlinux.lds.S
|
!vmlinux.lds.S
|
||||||
System.map
|
System.map
|
||||||
|
Module.markers
|
||||||
Module.symvers
|
Module.symvers
|
||||||
!.gitignore
|
!.gitignore
|
||||||
|
|
||||||
|
@ -40,6 +41,7 @@ include/linux/autoconf.h
|
||||||
include/linux/compile.h
|
include/linux/compile.h
|
||||||
include/linux/version.h
|
include/linux/version.h
|
||||||
include/linux/utsrelease.h
|
include/linux/utsrelease.h
|
||||||
|
include/linux/bounds.h
|
||||||
|
|
||||||
# stgit generated dirs
|
# stgit generated dirs
|
||||||
patches-*
|
patches-*
|
||||||
|
|
1
.mailmap
1
.mailmap
|
@ -88,6 +88,7 @@ Rudolf Marek <R.Marek@sh.cvut.cz>
|
||||||
Rui Saraiva <rmps@joel.ist.utl.pt>
|
Rui Saraiva <rmps@joel.ist.utl.pt>
|
||||||
Sachin P Sant <ssant@in.ibm.com>
|
Sachin P Sant <ssant@in.ibm.com>
|
||||||
Sam Ravnborg <sam@mars.ravnborg.org>
|
Sam Ravnborg <sam@mars.ravnborg.org>
|
||||||
|
S.Çağlar Onur <caglar@pardus.org.tr>
|
||||||
Simon Kelley <simon@thekelleys.org.uk>
|
Simon Kelley <simon@thekelleys.org.uk>
|
||||||
Stéphane Witzmann <stephane.witzmann@ubpmes.univ-bpclermont.fr>
|
Stéphane Witzmann <stephane.witzmann@ubpmes.univ-bpclermont.fr>
|
||||||
Stephen Hemminger <shemminger@osdl.org>
|
Stephen Hemminger <shemminger@osdl.org>
|
||||||
|
|
8
CREDITS
8
CREDITS
|
@ -403,6 +403,8 @@ D: Linux CD and Support Giveaway List
|
||||||
N: Erik Inge Bolsø
|
N: Erik Inge Bolsø
|
||||||
E: knan@mo.himolde.no
|
E: knan@mo.himolde.no
|
||||||
D: Misc kernel hacks
|
D: Misc kernel hacks
|
||||||
|
D: Updated PC speaker driver for 2.3
|
||||||
|
S: Norway
|
||||||
|
|
||||||
N: Andreas E. Bombe
|
N: Andreas E. Bombe
|
||||||
E: andreas.bombe@munich.netsurf.de
|
E: andreas.bombe@munich.netsurf.de
|
||||||
|
@ -3116,6 +3118,12 @@ S: Post Office Box 64132
|
||||||
S: Sunnyvale, California 94088-4132
|
S: Sunnyvale, California 94088-4132
|
||||||
S: USA
|
S: USA
|
||||||
|
|
||||||
|
N: Stas Sergeev
|
||||||
|
E: stsp@users.sourceforge.net
|
||||||
|
D: PCM PC-Speaker driver
|
||||||
|
D: misc fixes
|
||||||
|
S: Russia
|
||||||
|
|
||||||
N: Simon Shapiro
|
N: Simon Shapiro
|
||||||
E: shimon@i-Connect.Net
|
E: shimon@i-Connect.Net
|
||||||
W: http://www.-i-Connect.Net/~shimon
|
W: http://www.-i-Connect.Net/~shimon
|
||||||
|
|
|
@ -329,8 +329,6 @@ sgi-visws.txt
|
||||||
- short blurb on the SGI Visual Workstations.
|
- short blurb on the SGI Visual Workstations.
|
||||||
sh/
|
sh/
|
||||||
- directory with info on porting Linux to a new architecture.
|
- directory with info on porting Linux to a new architecture.
|
||||||
smart-config.txt
|
|
||||||
- description of the Smart Config makefile feature.
|
|
||||||
sound/
|
sound/
|
||||||
- directory with info on sound card support.
|
- directory with info on sound card support.
|
||||||
sparc/
|
sparc/
|
||||||
|
|
|
@ -0,0 +1,212 @@
|
||||||
|
What: /sys/class/ubi/
|
||||||
|
Date: July 2006
|
||||||
|
KernelVersion: 2.6.22
|
||||||
|
Contact: Artem Bityutskiy <dedekind@infradead.org>
|
||||||
|
Description:
|
||||||
|
The ubi/ class sub-directory belongs to the UBI subsystem and
|
||||||
|
provides general UBI information, per-UBI device information
|
||||||
|
and per-UBI volume information.
|
||||||
|
|
||||||
|
What: /sys/class/ubi/version
|
||||||
|
Date: July 2006
|
||||||
|
KernelVersion: 2.6.22
|
||||||
|
Contact: Artem Bityutskiy <dedekind@infradead.org>
|
||||||
|
Description:
|
||||||
|
This file contains version of the latest supported UBI on-media
|
||||||
|
format. Currently it is 1, and there is no plan to change this.
|
||||||
|
However, if in the future UBI needs on-flash format changes
|
||||||
|
which cannot be done in a compatible manner, a new format
|
||||||
|
version will be added. So this is a mechanism for possible
|
||||||
|
future backward-compatible (but forward-incompatible)
|
||||||
|
improvements.
|
||||||
|
|
||||||
|
What: /sys/class/ubiX/
|
||||||
|
Date: July 2006
|
||||||
|
KernelVersion: 2.6.22
|
||||||
|
Contact: Artem Bityutskiy <dedekind@infradead.org>
|
||||||
|
Description:
|
||||||
|
The /sys/class/ubi0, /sys/class/ubi1, etc directories describe
|
||||||
|
UBI devices (UBI device 0, 1, etc). They contain general UBI
|
||||||
|
device information and per UBI volume information (each UBI
|
||||||
|
device may have many UBI volumes)
|
||||||
|
|
||||||
|
What: /sys/class/ubi/ubiX/avail_eraseblocks
|
||||||
|
Date: July 2006
|
||||||
|
KernelVersion: 2.6.22
|
||||||
|
Contact: Artem Bityutskiy <dedekind@infradead.org>
|
||||||
|
Description:
|
||||||
|
Amount of available logical eraseblock. For example, one may
|
||||||
|
create a new UBI volume which has this amount of logical
|
||||||
|
eraseblocks.
|
||||||
|
|
||||||
|
What: /sys/class/ubi/ubiX/bad_peb_count
|
||||||
|
Date: July 2006
|
||||||
|
KernelVersion: 2.6.22
|
||||||
|
Contact: Artem Bityutskiy <dedekind@infradead.org>
|
||||||
|
Description:
|
||||||
|
Count of bad physical eraseblocks on the underlying MTD device.
|
||||||
|
|
||||||
|
What: /sys/class/ubi/ubiX/bgt_enabled
|
||||||
|
Date: July 2006
|
||||||
|
KernelVersion: 2.6.22
|
||||||
|
Contact: Artem Bityutskiy <dedekind@infradead.org>
|
||||||
|
Description:
|
||||||
|
Contains ASCII "0\n" if the UBI background thread is disabled,
|
||||||
|
and ASCII "1\n" if it is enabled.
|
||||||
|
|
||||||
|
What: /sys/class/ubi/ubiX/dev
|
||||||
|
Date: July 2006
|
||||||
|
KernelVersion: 2.6.22
|
||||||
|
Contact: Artem Bityutskiy <dedekind@infradead.org>
|
||||||
|
Description:
|
||||||
|
Major and minor numbers of the character device corresponding
|
||||||
|
to this UBI device (in <major>:<minor> format).
|
||||||
|
|
||||||
|
What: /sys/class/ubi/ubiX/eraseblock_size
|
||||||
|
Date: July 2006
|
||||||
|
KernelVersion: 2.6.22
|
||||||
|
Contact: Artem Bityutskiy <dedekind@infradead.org>
|
||||||
|
Description:
|
||||||
|
Maximum logical eraseblock size this UBI device may provide. UBI
|
||||||
|
volumes may have smaller logical eraseblock size because of their
|
||||||
|
alignment.
|
||||||
|
|
||||||
|
What: /sys/class/ubi/ubiX/max_ec
|
||||||
|
Date: July 2006
|
||||||
|
KernelVersion: 2.6.22
|
||||||
|
Contact: Artem Bityutskiy <dedekind@infradead.org>
|
||||||
|
Description:
|
||||||
|
Maximum physical eraseblock erase counter value.
|
||||||
|
|
||||||
|
What: /sys/class/ubi/ubiX/max_vol_count
|
||||||
|
Date: July 2006
|
||||||
|
KernelVersion: 2.6.22
|
||||||
|
Contact: Artem Bityutskiy <dedekind@infradead.org>
|
||||||
|
Description:
|
||||||
|
Maximum number of volumes which this UBI device may have.
|
||||||
|
|
||||||
|
What: /sys/class/ubi/ubiX/min_io_size
|
||||||
|
Date: July 2006
|
||||||
|
KernelVersion: 2.6.22
|
||||||
|
Contact: Artem Bityutskiy <dedekind@infradead.org>
|
||||||
|
Description:
|
||||||
|
Minimum input/output unit size. All the I/O may only be done
|
||||||
|
in fractions of the contained number.
|
||||||
|
|
||||||
|
What: /sys/class/ubi/ubiX/mtd_num
|
||||||
|
Date: January 2008
|
||||||
|
KernelVersion: 2.6.25
|
||||||
|
Contact: Artem Bityutskiy <dedekind@infradead.org>
|
||||||
|
Description:
|
||||||
|
Number of the underlying MTD device.
|
||||||
|
|
||||||
|
What: /sys/class/ubi/ubiX/reserved_for_bad
|
||||||
|
Date: July 2006
|
||||||
|
KernelVersion: 2.6.22
|
||||||
|
Contact: Artem Bityutskiy <dedekind@infradead.org>
|
||||||
|
Description:
|
||||||
|
Number of physical eraseblocks reserved for bad block handling.
|
||||||
|
|
||||||
|
What: /sys/class/ubi/ubiX/total_eraseblocks
|
||||||
|
Date: July 2006
|
||||||
|
KernelVersion: 2.6.22
|
||||||
|
Contact: Artem Bityutskiy <dedekind@infradead.org>
|
||||||
|
Description:
|
||||||
|
Total number of good (not marked as bad) physical eraseblocks on
|
||||||
|
the underlying MTD device.
|
||||||
|
|
||||||
|
What: /sys/class/ubi/ubiX/volumes_count
|
||||||
|
Date: July 2006
|
||||||
|
KernelVersion: 2.6.22
|
||||||
|
Contact: Artem Bityutskiy <dedekind@infradead.org>
|
||||||
|
Description:
|
||||||
|
Count of volumes on this UBI device.
|
||||||
|
|
||||||
|
What: /sys/class/ubi/ubiX/ubiX_Y/
|
||||||
|
Date: July 2006
|
||||||
|
KernelVersion: 2.6.22
|
||||||
|
Contact: Artem Bityutskiy <dedekind@infradead.org>
|
||||||
|
Description:
|
||||||
|
The /sys/class/ubi/ubiX/ubiX_0/, /sys/class/ubi/ubiX/ubiX_1/,
|
||||||
|
etc directories describe UBI volumes on UBI device X (volumes
|
||||||
|
0, 1, etc).
|
||||||
|
|
||||||
|
What: /sys/class/ubi/ubiX/ubiX_Y/alignment
|
||||||
|
Date: July 2006
|
||||||
|
KernelVersion: 2.6.22
|
||||||
|
Contact: Artem Bityutskiy <dedekind@infradead.org>
|
||||||
|
Description:
|
||||||
|
Volume alignment - the value the logical eraseblock size of
|
||||||
|
this volume has to be aligned on. For example, 2048 means that
|
||||||
|
logical eraseblock size is multiple of 2048. In other words,
|
||||||
|
volume logical eraseblock size is UBI device logical eraseblock
|
||||||
|
size aligned to the alignment value.
|
||||||
|
|
||||||
|
What: /sys/class/ubi/ubiX/ubiX_Y/corrupted
|
||||||
|
Date: July 2006
|
||||||
|
KernelVersion: 2.6.22
|
||||||
|
Contact: Artem Bityutskiy <dedekind@infradead.org>
|
||||||
|
Description:
|
||||||
|
Contains ASCII "0\n" if the UBI volume is OK, and ASCII "1\n"
|
||||||
|
if it is corrupted (e.g., due to an interrupted volume update).
|
||||||
|
|
||||||
|
What: /sys/class/ubi/ubiX/ubiX_Y/data_bytes
|
||||||
|
Date: July 2006
|
||||||
|
KernelVersion: 2.6.22
|
||||||
|
Contact: Artem Bityutskiy <dedekind@infradead.org>
|
||||||
|
Description:
|
||||||
|
The amount of data this volume contains. This value makes sense
|
||||||
|
only for static volumes, and for dynamic volume it equivalent
|
||||||
|
to the total volume size in bytes.
|
||||||
|
|
||||||
|
What: /sys/class/ubi/ubiX/ubiX_Y/dev
|
||||||
|
Date: July 2006
|
||||||
|
KernelVersion: 2.6.22
|
||||||
|
Contact: Artem Bityutskiy <dedekind@infradead.org>
|
||||||
|
Description:
|
||||||
|
Major and minor numbers of the character device corresponding
|
||||||
|
to this UBI volume (in <major>:<minor> format).
|
||||||
|
|
||||||
|
What: /sys/class/ubi/ubiX/ubiX_Y/name
|
||||||
|
Date: July 2006
|
||||||
|
KernelVersion: 2.6.22
|
||||||
|
Contact: Artem Bityutskiy <dedekind@infradead.org>
|
||||||
|
Description:
|
||||||
|
Volume name.
|
||||||
|
|
||||||
|
What: /sys/class/ubi/ubiX/ubiX_Y/reserved_ebs
|
||||||
|
Date: July 2006
|
||||||
|
KernelVersion: 2.6.22
|
||||||
|
Contact: Artem Bityutskiy <dedekind@infradead.org>
|
||||||
|
Description:
|
||||||
|
Count of physical eraseblock reserved for this volume.
|
||||||
|
Equivalent to the volume size in logical eraseblocks.
|
||||||
|
|
||||||
|
What: /sys/class/ubi/ubiX/ubiX_Y/type
|
||||||
|
Date: July 2006
|
||||||
|
KernelVersion: 2.6.22
|
||||||
|
Contact: Artem Bityutskiy <dedekind@infradead.org>
|
||||||
|
Description:
|
||||||
|
Volume type. Contains ASCII "dynamic\n" for dynamic volumes and
|
||||||
|
"static\n" for static volumes.
|
||||||
|
|
||||||
|
What: /sys/class/ubi/ubiX/ubiX_Y/upd_marker
|
||||||
|
Date: July 2006
|
||||||
|
KernelVersion: 2.6.22
|
||||||
|
Contact: Artem Bityutskiy <dedekind@infradead.org>
|
||||||
|
Description:
|
||||||
|
Contains ASCII "0\n" if the update marker is not set for this
|
||||||
|
volume, and "1\n" if it is set. The update marker is set when
|
||||||
|
volume update starts, and cleaned when it ends. So the presence
|
||||||
|
of the update marker indicates that the volume is being updated
|
||||||
|
at the moment of the update was interrupted. The later may be
|
||||||
|
checked using the "corrupted" sysfs file.
|
||||||
|
|
||||||
|
What: /sys/class/ubi/ubiX/ubiX_Y/usable_eb_size
|
||||||
|
Date: July 2006
|
||||||
|
KernelVersion: 2.6.22
|
||||||
|
Contact: Artem Bityutskiy <dedekind@infradead.org>
|
||||||
|
Description:
|
||||||
|
Logical eraseblock size of this volume. Equivalent to logical
|
||||||
|
eraseblock size of the device aligned on the volume alignment
|
||||||
|
value.
|
|
@ -0,0 +1,46 @@
|
||||||
|
What: /sys/class/bdi/<bdi>/
|
||||||
|
Date: January 2008
|
||||||
|
Contact: Peter Zijlstra <a.p.zijlstra@chello.nl>
|
||||||
|
Description:
|
||||||
|
|
||||||
|
Provide a place in sysfs for the backing_dev_info object. This allows
|
||||||
|
setting and retrieving various BDI specific variables.
|
||||||
|
|
||||||
|
The <bdi> identifier can be either of the following:
|
||||||
|
|
||||||
|
MAJOR:MINOR
|
||||||
|
|
||||||
|
Device number for block devices, or value of st_dev on
|
||||||
|
non-block filesystems which provide their own BDI, such as NFS
|
||||||
|
and FUSE.
|
||||||
|
|
||||||
|
default
|
||||||
|
|
||||||
|
The default backing dev, used for non-block device backed
|
||||||
|
filesystems which do not provide their own BDI.
|
||||||
|
|
||||||
|
Files under /sys/class/bdi/<bdi>/
|
||||||
|
---------------------------------
|
||||||
|
|
||||||
|
read_ahead_kb (read-write)
|
||||||
|
|
||||||
|
Size of the read-ahead window in kilobytes
|
||||||
|
|
||||||
|
min_ratio (read-write)
|
||||||
|
|
||||||
|
Under normal circumstances each device is given a part of the
|
||||||
|
total write-back cache that relates to its current average
|
||||||
|
writeout speed in relation to the other devices.
|
||||||
|
|
||||||
|
The 'min_ratio' parameter allows assigning a minimum
|
||||||
|
percentage of the write-back cache to a particular device.
|
||||||
|
For example, this is useful for providing a minimum QoS.
|
||||||
|
|
||||||
|
max_ratio (read-write)
|
||||||
|
|
||||||
|
Allows limiting a particular device to use not more than the
|
||||||
|
given percentage of the write-back cache. This is useful in
|
||||||
|
situations where we want to avoid one device taking all or
|
||||||
|
most of the write-back cache. For example in case of an NFS
|
||||||
|
mount that is prone to get stuck, or a FUSE mount which cannot
|
||||||
|
be trusted to play fair.
|
|
@ -145,7 +145,7 @@ Part Ic - DMA addressing limitations
|
||||||
int
|
int
|
||||||
dma_supported(struct device *dev, u64 mask)
|
dma_supported(struct device *dev, u64 mask)
|
||||||
int
|
int
|
||||||
pci_dma_supported(struct device *dev, u64 mask)
|
pci_dma_supported(struct pci_dev *hwdev, u64 mask)
|
||||||
|
|
||||||
Checks to see if the device can support DMA to the memory described by
|
Checks to see if the device can support DMA to the memory described by
|
||||||
mask.
|
mask.
|
||||||
|
@ -189,7 +189,7 @@ dma_addr_t
|
||||||
dma_map_single(struct device *dev, void *cpu_addr, size_t size,
|
dma_map_single(struct device *dev, void *cpu_addr, size_t size,
|
||||||
enum dma_data_direction direction)
|
enum dma_data_direction direction)
|
||||||
dma_addr_t
|
dma_addr_t
|
||||||
pci_map_single(struct device *dev, void *cpu_addr, size_t size,
|
pci_map_single(struct pci_dev *hwdev, void *cpu_addr, size_t size,
|
||||||
int direction)
|
int direction)
|
||||||
|
|
||||||
Maps a piece of processor virtual memory so it can be accessed by the
|
Maps a piece of processor virtual memory so it can be accessed by the
|
||||||
|
@ -395,6 +395,71 @@ Notes: You must do this:
|
||||||
|
|
||||||
See also dma_map_single().
|
See also dma_map_single().
|
||||||
|
|
||||||
|
dma_addr_t
|
||||||
|
dma_map_single_attrs(struct device *dev, void *cpu_addr, size_t size,
|
||||||
|
enum dma_data_direction dir,
|
||||||
|
struct dma_attrs *attrs)
|
||||||
|
|
||||||
|
void
|
||||||
|
dma_unmap_single_attrs(struct device *dev, dma_addr_t dma_addr,
|
||||||
|
size_t size, enum dma_data_direction dir,
|
||||||
|
struct dma_attrs *attrs)
|
||||||
|
|
||||||
|
int
|
||||||
|
dma_map_sg_attrs(struct device *dev, struct scatterlist *sgl,
|
||||||
|
int nents, enum dma_data_direction dir,
|
||||||
|
struct dma_attrs *attrs)
|
||||||
|
|
||||||
|
void
|
||||||
|
dma_unmap_sg_attrs(struct device *dev, struct scatterlist *sgl,
|
||||||
|
int nents, enum dma_data_direction dir,
|
||||||
|
struct dma_attrs *attrs)
|
||||||
|
|
||||||
|
The four functions above are just like the counterpart functions
|
||||||
|
without the _attrs suffixes, except that they pass an optional
|
||||||
|
struct dma_attrs*.
|
||||||
|
|
||||||
|
struct dma_attrs encapsulates a set of "dma attributes". For the
|
||||||
|
definition of struct dma_attrs see linux/dma-attrs.h.
|
||||||
|
|
||||||
|
The interpretation of dma attributes is architecture-specific, and
|
||||||
|
each attribute should be documented in Documentation/DMA-attributes.txt.
|
||||||
|
|
||||||
|
If struct dma_attrs* is NULL, the semantics of each of these
|
||||||
|
functions is identical to those of the corresponding function
|
||||||
|
without the _attrs suffix. As a result dma_map_single_attrs()
|
||||||
|
can generally replace dma_map_single(), etc.
|
||||||
|
|
||||||
|
As an example of the use of the *_attrs functions, here's how
|
||||||
|
you could pass an attribute DMA_ATTR_FOO when mapping memory
|
||||||
|
for DMA:
|
||||||
|
|
||||||
|
#include <linux/dma-attrs.h>
|
||||||
|
/* DMA_ATTR_FOO should be defined in linux/dma-attrs.h and
|
||||||
|
* documented in Documentation/DMA-attributes.txt */
|
||||||
|
...
|
||||||
|
|
||||||
|
DEFINE_DMA_ATTRS(attrs);
|
||||||
|
dma_set_attr(DMA_ATTR_FOO, &attrs);
|
||||||
|
....
|
||||||
|
n = dma_map_sg_attrs(dev, sg, nents, DMA_TO_DEVICE, &attr);
|
||||||
|
....
|
||||||
|
|
||||||
|
Architectures that care about DMA_ATTR_FOO would check for its
|
||||||
|
presence in their implementations of the mapping and unmapping
|
||||||
|
routines, e.g.:
|
||||||
|
|
||||||
|
void whizco_dma_map_sg_attrs(struct device *dev, dma_addr_t dma_addr,
|
||||||
|
size_t size, enum dma_data_direction dir,
|
||||||
|
struct dma_attrs *attrs)
|
||||||
|
{
|
||||||
|
....
|
||||||
|
int foo = dma_get_attr(DMA_ATTR_FOO, attrs);
|
||||||
|
....
|
||||||
|
if (foo)
|
||||||
|
/* twizzle the frobnozzle */
|
||||||
|
....
|
||||||
|
|
||||||
|
|
||||||
Part II - Advanced dma_ usage
|
Part II - Advanced dma_ usage
|
||||||
-----------------------------
|
-----------------------------
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
DMA attributes
|
||||||
|
==============
|
||||||
|
|
||||||
|
This document describes the semantics of the DMA attributes that are
|
||||||
|
defined in linux/dma-attrs.h.
|
||||||
|
|
||||||
|
DMA_ATTR_WRITE_BARRIER
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
DMA_ATTR_WRITE_BARRIER is a (write) barrier attribute for DMA. DMA
|
||||||
|
to a memory region with the DMA_ATTR_WRITE_BARRIER attribute forces
|
||||||
|
all pending DMA writes to complete, and thus provides a mechanism to
|
||||||
|
strictly order DMA from a device across all intervening busses and
|
||||||
|
bridges. This barrier is not specific to a particular type of
|
||||||
|
interconnect, it applies to the system as a whole, and so its
|
||||||
|
implementation must account for the idiosyncracies of the system all
|
||||||
|
the way from the DMA device to memory.
|
||||||
|
|
||||||
|
As an example of a situation where DMA_ATTR_WRITE_BARRIER would be
|
||||||
|
useful, suppose that a device does a DMA write to indicate that data is
|
||||||
|
ready and available in memory. The DMA of the "completion indication"
|
||||||
|
could race with data DMA. Mapping the memory used for completion
|
||||||
|
indications with DMA_ATTR_WRITE_BARRIER would prevent the race.
|
||||||
|
|
|
@ -315,11 +315,11 @@ you should do:
|
||||||
|
|
||||||
dma_addr_t dma_handle;
|
dma_addr_t dma_handle;
|
||||||
|
|
||||||
cpu_addr = pci_alloc_consistent(dev, size, &dma_handle);
|
cpu_addr = pci_alloc_consistent(pdev, size, &dma_handle);
|
||||||
|
|
||||||
where dev is a struct pci_dev *. You should pass NULL for PCI like buses
|
where pdev is a struct pci_dev *. This may be called in interrupt context.
|
||||||
where devices don't have struct pci_dev (like ISA, EISA). This may be
|
You should use dma_alloc_coherent (see DMA-API.txt) for buses
|
||||||
called in interrupt context.
|
where devices don't have struct pci_dev (like ISA, EISA).
|
||||||
|
|
||||||
This argument is needed because the DMA translations may be bus
|
This argument is needed because the DMA translations may be bus
|
||||||
specific (and often is private to the bus which the device is attached
|
specific (and often is private to the bus which the device is attached
|
||||||
|
@ -332,7 +332,7 @@ __get_free_pages (but takes size instead of a page order). If your
|
||||||
driver needs regions sized smaller than a page, you may prefer using
|
driver needs regions sized smaller than a page, you may prefer using
|
||||||
the pci_pool interface, described below.
|
the pci_pool interface, described below.
|
||||||
|
|
||||||
The consistent DMA mapping interfaces, for non-NULL dev, will by
|
The consistent DMA mapping interfaces, for non-NULL pdev, will by
|
||||||
default return a DMA address which is SAC (Single Address Cycle)
|
default return a DMA address which is SAC (Single Address Cycle)
|
||||||
addressable. Even if the device indicates (via PCI dma mask) that it
|
addressable. Even if the device indicates (via PCI dma mask) that it
|
||||||
may address the upper 32-bits and thus perform DAC cycles, consistent
|
may address the upper 32-bits and thus perform DAC cycles, consistent
|
||||||
|
@ -354,9 +354,9 @@ buffer you receive will not cross a 64K boundary.
|
||||||
|
|
||||||
To unmap and free such a DMA region, you call:
|
To unmap and free such a DMA region, you call:
|
||||||
|
|
||||||
pci_free_consistent(dev, size, cpu_addr, dma_handle);
|
pci_free_consistent(pdev, size, cpu_addr, dma_handle);
|
||||||
|
|
||||||
where dev, size are the same as in the above call and cpu_addr and
|
where pdev, size are the same as in the above call and cpu_addr and
|
||||||
dma_handle are the values pci_alloc_consistent returned to you.
|
dma_handle are the values pci_alloc_consistent returned to you.
|
||||||
This function may not be called in interrupt context.
|
This function may not be called in interrupt context.
|
||||||
|
|
||||||
|
@ -371,9 +371,9 @@ Create a pci_pool like this:
|
||||||
|
|
||||||
struct pci_pool *pool;
|
struct pci_pool *pool;
|
||||||
|
|
||||||
pool = pci_pool_create(name, dev, size, align, alloc);
|
pool = pci_pool_create(name, pdev, size, align, alloc);
|
||||||
|
|
||||||
The "name" is for diagnostics (like a kmem_cache name); dev and size
|
The "name" is for diagnostics (like a kmem_cache name); pdev and size
|
||||||
are as above. The device's hardware alignment requirement for this
|
are as above. The device's hardware alignment requirement for this
|
||||||
type of data is "align" (which is expressed in bytes, and must be a
|
type of data is "align" (which is expressed in bytes, and must be a
|
||||||
power of two). If your device has no boundary crossing restrictions,
|
power of two). If your device has no boundary crossing restrictions,
|
||||||
|
@ -472,11 +472,11 @@ To map a single region, you do:
|
||||||
void *addr = buffer->ptr;
|
void *addr = buffer->ptr;
|
||||||
size_t size = buffer->len;
|
size_t size = buffer->len;
|
||||||
|
|
||||||
dma_handle = pci_map_single(dev, addr, size, direction);
|
dma_handle = pci_map_single(pdev, addr, size, direction);
|
||||||
|
|
||||||
and to unmap it:
|
and to unmap it:
|
||||||
|
|
||||||
pci_unmap_single(dev, dma_handle, size, direction);
|
pci_unmap_single(pdev, dma_handle, size, direction);
|
||||||
|
|
||||||
You should call pci_unmap_single when the DMA activity is finished, e.g.
|
You should call pci_unmap_single when the DMA activity is finished, e.g.
|
||||||
from the interrupt which told you that the DMA transfer is done.
|
from the interrupt which told you that the DMA transfer is done.
|
||||||
|
@ -493,17 +493,17 @@ Specifically:
|
||||||
unsigned long offset = buffer->offset;
|
unsigned long offset = buffer->offset;
|
||||||
size_t size = buffer->len;
|
size_t size = buffer->len;
|
||||||
|
|
||||||
dma_handle = pci_map_page(dev, page, offset, size, direction);
|
dma_handle = pci_map_page(pdev, page, offset, size, direction);
|
||||||
|
|
||||||
...
|
...
|
||||||
|
|
||||||
pci_unmap_page(dev, dma_handle, size, direction);
|
pci_unmap_page(pdev, dma_handle, size, direction);
|
||||||
|
|
||||||
Here, "offset" means byte offset within the given page.
|
Here, "offset" means byte offset within the given page.
|
||||||
|
|
||||||
With scatterlists, you map a region gathered from several regions by:
|
With scatterlists, you map a region gathered from several regions by:
|
||||||
|
|
||||||
int i, count = pci_map_sg(dev, sglist, nents, direction);
|
int i, count = pci_map_sg(pdev, sglist, nents, direction);
|
||||||
struct scatterlist *sg;
|
struct scatterlist *sg;
|
||||||
|
|
||||||
for_each_sg(sglist, sg, count, i) {
|
for_each_sg(sglist, sg, count, i) {
|
||||||
|
@ -527,7 +527,7 @@ accessed sg->address and sg->length as shown above.
|
||||||
|
|
||||||
To unmap a scatterlist, just call:
|
To unmap a scatterlist, just call:
|
||||||
|
|
||||||
pci_unmap_sg(dev, sglist, nents, direction);
|
pci_unmap_sg(pdev, sglist, nents, direction);
|
||||||
|
|
||||||
Again, make sure DMA activity has already finished.
|
Again, make sure DMA activity has already finished.
|
||||||
|
|
||||||
|
@ -550,11 +550,11 @@ correct copy of the DMA buffer.
|
||||||
So, firstly, just map it with pci_map_{single,sg}, and after each DMA
|
So, firstly, just map it with pci_map_{single,sg}, and after each DMA
|
||||||
transfer call either:
|
transfer call either:
|
||||||
|
|
||||||
pci_dma_sync_single_for_cpu(dev, dma_handle, size, direction);
|
pci_dma_sync_single_for_cpu(pdev, dma_handle, size, direction);
|
||||||
|
|
||||||
or:
|
or:
|
||||||
|
|
||||||
pci_dma_sync_sg_for_cpu(dev, sglist, nents, direction);
|
pci_dma_sync_sg_for_cpu(pdev, sglist, nents, direction);
|
||||||
|
|
||||||
as appropriate.
|
as appropriate.
|
||||||
|
|
||||||
|
@ -562,7 +562,7 @@ Then, if you wish to let the device get at the DMA area again,
|
||||||
finish accessing the data with the cpu, and then before actually
|
finish accessing the data with the cpu, and then before actually
|
||||||
giving the buffer to the hardware call either:
|
giving the buffer to the hardware call either:
|
||||||
|
|
||||||
pci_dma_sync_single_for_device(dev, dma_handle, size, direction);
|
pci_dma_sync_single_for_device(pdev, dma_handle, size, direction);
|
||||||
|
|
||||||
or:
|
or:
|
||||||
|
|
||||||
|
@ -739,7 +739,7 @@ failure can be determined by:
|
||||||
|
|
||||||
dma_addr_t dma_handle;
|
dma_addr_t dma_handle;
|
||||||
|
|
||||||
dma_handle = pci_map_single(dev, addr, size, direction);
|
dma_handle = pci_map_single(pdev, addr, size, direction);
|
||||||
if (pci_dma_mapping_error(dma_handle)) {
|
if (pci_dma_mapping_error(dma_handle)) {
|
||||||
/*
|
/*
|
||||||
* reduce current DMA mapping usage,
|
* reduce current DMA mapping usage,
|
||||||
|
|
|
@ -12,7 +12,7 @@ DOCBOOKS := wanbook.xml z8530book.xml mcabook.xml videobook.xml \
|
||||||
kernel-api.xml filesystems.xml lsm.xml usb.xml kgdb.xml \
|
kernel-api.xml filesystems.xml lsm.xml usb.xml kgdb.xml \
|
||||||
gadget.xml libata.xml mtdnand.xml librs.xml rapidio.xml \
|
gadget.xml libata.xml mtdnand.xml librs.xml rapidio.xml \
|
||||||
genericirq.xml s390-drivers.xml uio-howto.xml scsi.xml \
|
genericirq.xml s390-drivers.xml uio-howto.xml scsi.xml \
|
||||||
mac80211.xml
|
mac80211.xml debugobjects.xml
|
||||||
|
|
||||||
###
|
###
|
||||||
# The build process is as follows (targets):
|
# The build process is as follows (targets):
|
||||||
|
@ -187,8 +187,11 @@ quiet_cmd_fig2png = FIG2PNG $@
|
||||||
|
|
||||||
###
|
###
|
||||||
# Rule to convert a .c file to inline XML documentation
|
# Rule to convert a .c file to inline XML documentation
|
||||||
|
gen_xml = :
|
||||||
|
quiet_gen_xml = echo ' GEN $@'
|
||||||
|
silent_gen_xml = :
|
||||||
%.xml: %.c
|
%.xml: %.c
|
||||||
@echo ' GEN $@'
|
@$($(quiet)gen_xml)
|
||||||
@( \
|
@( \
|
||||||
echo "<programlisting>"; \
|
echo "<programlisting>"; \
|
||||||
expand --tabs=8 < $< | \
|
expand --tabs=8 < $< | \
|
||||||
|
|
|
@ -0,0 +1,391 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
|
||||||
|
"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" []>
|
||||||
|
|
||||||
|
<book id="debug-objects-guide">
|
||||||
|
<bookinfo>
|
||||||
|
<title>Debug objects life time</title>
|
||||||
|
|
||||||
|
<authorgroup>
|
||||||
|
<author>
|
||||||
|
<firstname>Thomas</firstname>
|
||||||
|
<surname>Gleixner</surname>
|
||||||
|
<affiliation>
|
||||||
|
<address>
|
||||||
|
<email>tglx@linutronix.de</email>
|
||||||
|
</address>
|
||||||
|
</affiliation>
|
||||||
|
</author>
|
||||||
|
</authorgroup>
|
||||||
|
|
||||||
|
<copyright>
|
||||||
|
<year>2008</year>
|
||||||
|
<holder>Thomas Gleixner</holder>
|
||||||
|
</copyright>
|
||||||
|
|
||||||
|
<legalnotice>
|
||||||
|
<para>
|
||||||
|
This documentation is free software; you can redistribute
|
||||||
|
it and/or modify it under the terms of the GNU General Public
|
||||||
|
License version 2 as published by the Free Software Foundation.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
This program is distributed in the hope that it will be
|
||||||
|
useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||||
|
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
See the GNU General Public License for more details.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
You should have received a copy of the GNU General Public
|
||||||
|
License along with this program; if not, write to the Free
|
||||||
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||||
|
MA 02111-1307 USA
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
For more details see the file COPYING in the source
|
||||||
|
distribution of Linux.
|
||||||
|
</para>
|
||||||
|
</legalnotice>
|
||||||
|
</bookinfo>
|
||||||
|
|
||||||
|
<toc></toc>
|
||||||
|
|
||||||
|
<chapter id="intro">
|
||||||
|
<title>Introduction</title>
|
||||||
|
<para>
|
||||||
|
debugobjects is a generic infrastructure to track the life time
|
||||||
|
of kernel objects and validate the operations on those.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
debugobjects is useful to check for the following error patterns:
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem><para>Activation of uninitialized objects</para></listitem>
|
||||||
|
<listitem><para>Initialization of active objects</para></listitem>
|
||||||
|
<listitem><para>Usage of freed/destroyed objects</para></listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
debugobjects is not changing the data structure of the real
|
||||||
|
object so it can be compiled in with a minimal runtime impact
|
||||||
|
and enabled on demand with a kernel command line option.
|
||||||
|
</para>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="howto">
|
||||||
|
<title>Howto use debugobjects</title>
|
||||||
|
<para>
|
||||||
|
A kernel subsystem needs to provide a data structure which
|
||||||
|
describes the object type and add calls into the debug code at
|
||||||
|
appropriate places. The data structure to describe the object
|
||||||
|
type needs at minimum the name of the object type. Optional
|
||||||
|
functions can and should be provided to fixup detected problems
|
||||||
|
so the kernel can continue to work and the debug information can
|
||||||
|
be retrieved from a live system instead of hard core debugging
|
||||||
|
with serial consoles and stack trace transcripts from the
|
||||||
|
monitor.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
The debug calls provided by debugobjects are:
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem><para>debug_object_init</para></listitem>
|
||||||
|
<listitem><para>debug_object_init_on_stack</para></listitem>
|
||||||
|
<listitem><para>debug_object_activate</para></listitem>
|
||||||
|
<listitem><para>debug_object_deactivate</para></listitem>
|
||||||
|
<listitem><para>debug_object_destroy</para></listitem>
|
||||||
|
<listitem><para>debug_object_free</para></listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
Each of these functions takes the address of the real object and
|
||||||
|
a pointer to the object type specific debug description
|
||||||
|
structure.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Each detected error is reported in the statistics and a limited
|
||||||
|
number of errors are printk'ed including a full stack trace.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
The statistics are available via debugfs/debug_objects/stats.
|
||||||
|
They provide information about the number of warnings and the
|
||||||
|
number of successful fixups along with information about the
|
||||||
|
usage of the internal tracking objects and the state of the
|
||||||
|
internal tracking objects pool.
|
||||||
|
</para>
|
||||||
|
</chapter>
|
||||||
|
<chapter id="debugfunctions">
|
||||||
|
<title>Debug functions</title>
|
||||||
|
<sect1 id="prototypes">
|
||||||
|
<title>Debug object function reference</title>
|
||||||
|
!Elib/debugobjects.c
|
||||||
|
</sect1>
|
||||||
|
<sect1 id="debug_object_init">
|
||||||
|
<title>debug_object_init</title>
|
||||||
|
<para>
|
||||||
|
This function is called whenever the initialization function
|
||||||
|
of a real object is called.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
When the real object is already tracked by debugobjects it is
|
||||||
|
checked, whether the object can be initialized. Initializing
|
||||||
|
is not allowed for active and destroyed objects. When
|
||||||
|
debugobjects detects an error, then it calls the fixup_init
|
||||||
|
function of the object type description structure if provided
|
||||||
|
by the caller. The fixup function can correct the problem
|
||||||
|
before the real initialization of the object happens. E.g. it
|
||||||
|
can deactivate an active object in order to prevent damage to
|
||||||
|
the subsystem.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
When the real object is not yet tracked by debugobjects,
|
||||||
|
debugobjects allocates a tracker object for the real object
|
||||||
|
and sets the tracker object state to ODEBUG_STATE_INIT. It
|
||||||
|
verifies that the object is not on the callers stack. If it is
|
||||||
|
on the callers stack then a limited number of warnings
|
||||||
|
including a full stack trace is printk'ed. The calling code
|
||||||
|
must use debug_object_init_on_stack() and remove the object
|
||||||
|
before leaving the function which allocated it. See next
|
||||||
|
section.
|
||||||
|
</para>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="debug_object_init_on_stack">
|
||||||
|
<title>debug_object_init_on_stack</title>
|
||||||
|
<para>
|
||||||
|
This function is called whenever the initialization function
|
||||||
|
of a real object which resides on the stack is called.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
When the real object is already tracked by debugobjects it is
|
||||||
|
checked, whether the object can be initialized. Initializing
|
||||||
|
is not allowed for active and destroyed objects. When
|
||||||
|
debugobjects detects an error, then it calls the fixup_init
|
||||||
|
function of the object type description structure if provided
|
||||||
|
by the caller. The fixup function can correct the problem
|
||||||
|
before the real initialization of the object happens. E.g. it
|
||||||
|
can deactivate an active object in order to prevent damage to
|
||||||
|
the subsystem.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
When the real object is not yet tracked by debugobjects
|
||||||
|
debugobjects allocates a tracker object for the real object
|
||||||
|
and sets the tracker object state to ODEBUG_STATE_INIT. It
|
||||||
|
verifies that the object is on the callers stack.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
An object which is on the stack must be removed from the
|
||||||
|
tracker by calling debug_object_free() before the function
|
||||||
|
which allocates the object returns. Otherwise we keep track of
|
||||||
|
stale objects.
|
||||||
|
</para>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="debug_object_activate">
|
||||||
|
<title>debug_object_activate</title>
|
||||||
|
<para>
|
||||||
|
This function is called whenever the activation function of a
|
||||||
|
real object is called.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
When the real object is already tracked by debugobjects it is
|
||||||
|
checked, whether the object can be activated. Activating is
|
||||||
|
not allowed for active and destroyed objects. When
|
||||||
|
debugobjects detects an error, then it calls the
|
||||||
|
fixup_activate function of the object type description
|
||||||
|
structure if provided by the caller. The fixup function can
|
||||||
|
correct the problem before the real activation of the object
|
||||||
|
happens. E.g. it can deactivate an active object in order to
|
||||||
|
prevent damage to the subsystem.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
When the real object is not yet tracked by debugobjects then
|
||||||
|
the fixup_activate function is called if available. This is
|
||||||
|
necessary to allow the legitimate activation of statically
|
||||||
|
allocated and initialized objects. The fixup function checks
|
||||||
|
whether the object is valid and calls the debug_objects_init()
|
||||||
|
function to initialize the tracking of this object.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
When the activation is legitimate, then the state of the
|
||||||
|
associated tracker object is set to ODEBUG_STATE_ACTIVE.
|
||||||
|
</para>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="debug_object_deactivate">
|
||||||
|
<title>debug_object_deactivate</title>
|
||||||
|
<para>
|
||||||
|
This function is called whenever the deactivation function of
|
||||||
|
a real object is called.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
When the real object is tracked by debugobjects it is checked,
|
||||||
|
whether the object can be deactivated. Deactivating is not
|
||||||
|
allowed for untracked or destroyed objects.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
When the deactivation is legitimate, then the state of the
|
||||||
|
associated tracker object is set to ODEBUG_STATE_INACTIVE.
|
||||||
|
</para>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="debug_object_destroy">
|
||||||
|
<title>debug_object_destroy</title>
|
||||||
|
<para>
|
||||||
|
This function is called to mark an object destroyed. This is
|
||||||
|
useful to prevent the usage of invalid objects, which are
|
||||||
|
still available in memory: either statically allocated objects
|
||||||
|
or objects which are freed later.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
When the real object is tracked by debugobjects it is checked,
|
||||||
|
whether the object can be destroyed. Destruction is not
|
||||||
|
allowed for active and destroyed objects. When debugobjects
|
||||||
|
detects an error, then it calls the fixup_destroy function of
|
||||||
|
the object type description structure if provided by the
|
||||||
|
caller. The fixup function can correct the problem before the
|
||||||
|
real destruction of the object happens. E.g. it can deactivate
|
||||||
|
an active object in order to prevent damage to the subsystem.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
When the destruction is legitimate, then the state of the
|
||||||
|
associated tracker object is set to ODEBUG_STATE_DESTROYED.
|
||||||
|
</para>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="debug_object_free">
|
||||||
|
<title>debug_object_free</title>
|
||||||
|
<para>
|
||||||
|
This function is called before an object is freed.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
When the real object is tracked by debugobjects it is checked,
|
||||||
|
whether the object can be freed. Free is not allowed for
|
||||||
|
active objects. When debugobjects detects an error, then it
|
||||||
|
calls the fixup_free function of the object type description
|
||||||
|
structure if provided by the caller. The fixup function can
|
||||||
|
correct the problem before the real free of the object
|
||||||
|
happens. E.g. it can deactivate an active object in order to
|
||||||
|
prevent damage to the subsystem.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Note that debug_object_free removes the object from the
|
||||||
|
tracker. Later usage of the object is detected by the other
|
||||||
|
debug checks.
|
||||||
|
</para>
|
||||||
|
</sect1>
|
||||||
|
</chapter>
|
||||||
|
<chapter id="fixupfunctions">
|
||||||
|
<title>Fixup functions</title>
|
||||||
|
<sect1 id="debug_obj_descr">
|
||||||
|
<title>Debug object type description structure</title>
|
||||||
|
!Iinclude/linux/debugobjects.h
|
||||||
|
</sect1>
|
||||||
|
<sect1 id="fixup_init">
|
||||||
|
<title>fixup_init</title>
|
||||||
|
<para>
|
||||||
|
This function is called from the debug code whenever a problem
|
||||||
|
in debug_object_init is detected. The function takes the
|
||||||
|
address of the object and the state which is currently
|
||||||
|
recorded in the tracker.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Called from debug_object_init when the object state is:
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem><para>ODEBUG_STATE_ACTIVE</para></listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
The function returns 1 when the fixup was successful,
|
||||||
|
otherwise 0. The return value is used to update the
|
||||||
|
statistics.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Note, that the function needs to call the debug_object_init()
|
||||||
|
function again, after the damage has been repaired in order to
|
||||||
|
keep the state consistent.
|
||||||
|
</para>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="fixup_activate">
|
||||||
|
<title>fixup_activate</title>
|
||||||
|
<para>
|
||||||
|
This function is called from the debug code whenever a problem
|
||||||
|
in debug_object_activate is detected.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Called from debug_object_activate when the object state is:
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem><para>ODEBUG_STATE_NOTAVAILABLE</para></listitem>
|
||||||
|
<listitem><para>ODEBUG_STATE_ACTIVE</para></listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
The function returns 1 when the fixup was successful,
|
||||||
|
otherwise 0. The return value is used to update the
|
||||||
|
statistics.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Note that the function needs to call the debug_object_activate()
|
||||||
|
function again after the damage has been repaired in order to
|
||||||
|
keep the state consistent.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
The activation of statically initialized objects is a special
|
||||||
|
case. When debug_object_activate() has no tracked object for
|
||||||
|
this object address then fixup_activate() is called with
|
||||||
|
object state ODEBUG_STATE_NOTAVAILABLE. The fixup function
|
||||||
|
needs to check whether this is a legitimate case of a
|
||||||
|
statically initialized object or not. In case it is it calls
|
||||||
|
debug_object_init() and debug_object_activate() to make the
|
||||||
|
object known to the tracker and marked active. In this case
|
||||||
|
the function should return 0 because this is not a real fixup.
|
||||||
|
</para>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="fixup_destroy">
|
||||||
|
<title>fixup_destroy</title>
|
||||||
|
<para>
|
||||||
|
This function is called from the debug code whenever a problem
|
||||||
|
in debug_object_destroy is detected.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Called from debug_object_destroy when the object state is:
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem><para>ODEBUG_STATE_ACTIVE</para></listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
The function returns 1 when the fixup was successful,
|
||||||
|
otherwise 0. The return value is used to update the
|
||||||
|
statistics.
|
||||||
|
</para>
|
||||||
|
</sect1>
|
||||||
|
<sect1 id="fixup_free">
|
||||||
|
<title>fixup_free</title>
|
||||||
|
<para>
|
||||||
|
This function is called from the debug code whenever a problem
|
||||||
|
in debug_object_free is detected. Further it can be called
|
||||||
|
from the debug checks in kfree/vfree, when an active object is
|
||||||
|
detected from the debug_check_no_obj_freed() sanity checks.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Called from debug_object_free() or debug_check_no_obj_freed()
|
||||||
|
when the object state is:
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem><para>ODEBUG_STATE_ACTIVE</para></listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
The function returns 1 when the fixup was successful,
|
||||||
|
otherwise 0. The return value is used to update the
|
||||||
|
statistics.
|
||||||
|
</para>
|
||||||
|
</sect1>
|
||||||
|
</chapter>
|
||||||
|
<chapter id="bugs">
|
||||||
|
<title>Known Bugs And Assumptions</title>
|
||||||
|
<para>
|
||||||
|
None (knock on wood).
|
||||||
|
</para>
|
||||||
|
</chapter>
|
||||||
|
</book>
|
|
@ -119,7 +119,7 @@ X!Ilib/string.c
|
||||||
!Elib/string.c
|
!Elib/string.c
|
||||||
</sect1>
|
</sect1>
|
||||||
<sect1><title>Bit Operations</title>
|
<sect1><title>Bit Operations</title>
|
||||||
!Iinclude/asm-x86/bitops_32.h
|
!Iinclude/asm-x86/bitops.h
|
||||||
</sect1>
|
</sect1>
|
||||||
</chapter>
|
</chapter>
|
||||||
|
|
||||||
|
@ -645,4 +645,58 @@ X!Idrivers/video/console/fonts.c
|
||||||
!Edrivers/i2c/i2c-core.c
|
!Edrivers/i2c/i2c-core.c
|
||||||
</chapter>
|
</chapter>
|
||||||
|
|
||||||
|
<chapter id="clk">
|
||||||
|
<title>Clock Framework</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
The clock framework defines programming interfaces to support
|
||||||
|
software management of the system clock tree.
|
||||||
|
This framework is widely used with System-On-Chip (SOC) platforms
|
||||||
|
to support power management and various devices which may need
|
||||||
|
custom clock rates.
|
||||||
|
Note that these "clocks" don't relate to timekeeping or real
|
||||||
|
time clocks (RTCs), each of which have separate frameworks.
|
||||||
|
These <structname>struct clk</structname> instances may be used
|
||||||
|
to manage for example a 96 MHz signal that is used to shift bits
|
||||||
|
into and out of peripherals or busses, or otherwise trigger
|
||||||
|
synchronous state machine transitions in system hardware.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Power management is supported by explicit software clock gating:
|
||||||
|
unused clocks are disabled, so the system doesn't waste power
|
||||||
|
changing the state of transistors that aren't in active use.
|
||||||
|
On some systems this may be backed by hardware clock gating,
|
||||||
|
where clocks are gated without being disabled in software.
|
||||||
|
Sections of chips that are powered but not clocked may be able
|
||||||
|
to retain their last state.
|
||||||
|
This low power state is often called a <emphasis>retention
|
||||||
|
mode</emphasis>.
|
||||||
|
This mode still incurs leakage currents, especially with finer
|
||||||
|
circuit geometries, but for CMOS circuits power is mostly used
|
||||||
|
by clocked state changes.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Power-aware drivers only enable their clocks when the device
|
||||||
|
they manage is in active use. Also, system sleep states often
|
||||||
|
differ according to which clock domains are active: while a
|
||||||
|
"standby" state may allow wakeup from several active domains, a
|
||||||
|
"mem" (suspend-to-RAM) state may require a more wholesale shutdown
|
||||||
|
of clocks derived from higher speed PLLs and oscillators, limiting
|
||||||
|
the number of possible wakeup event sources. A driver's suspend
|
||||||
|
method may need to be aware of system-specific clock constraints
|
||||||
|
on the target sleep state.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Some platforms support programmable clock generators. These
|
||||||
|
can be used by external chips of various kinds, such as other
|
||||||
|
CPUs, multimedia codecs, and devices with strict requirements
|
||||||
|
for interface clocking.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
!Iinclude/linux/clk.h
|
||||||
|
</chapter>
|
||||||
|
|
||||||
</book>
|
</book>
|
||||||
|
|
|
@ -72,7 +72,7 @@
|
||||||
kgdb is a source level debugger for linux kernel. It is used along
|
kgdb is a source level debugger for linux kernel. It is used along
|
||||||
with gdb to debug a linux kernel. The expectation is that gdb can
|
with gdb to debug a linux kernel. The expectation is that gdb can
|
||||||
be used to "break in" to the kernel to inspect memory, variables
|
be used to "break in" to the kernel to inspect memory, variables
|
||||||
and look through a cal stack information similar to what an
|
and look through call stack information similar to what an
|
||||||
application developer would use gdb for. It is possible to place
|
application developer would use gdb for. It is possible to place
|
||||||
breakpoints in kernel code and perform some limited execution
|
breakpoints in kernel code and perform some limited execution
|
||||||
stepping.
|
stepping.
|
||||||
|
@ -93,8 +93,10 @@
|
||||||
<chapter id="CompilingAKernel">
|
<chapter id="CompilingAKernel">
|
||||||
<title>Compiling a kernel</title>
|
<title>Compiling a kernel</title>
|
||||||
<para>
|
<para>
|
||||||
To enable <symbol>CONFIG_KGDB</symbol>, look under the "Kernel debugging"
|
To enable <symbol>CONFIG_KGDB</symbol> you should first turn on
|
||||||
and then select "KGDB: kernel debugging with remote gdb".
|
"Prompt for development and/or incomplete code/drivers"
|
||||||
|
(CONFIG_EXPERIMENTAL) in "General setup", then under the
|
||||||
|
"Kernel debugging" select "KGDB: kernel debugging with remote gdb".
|
||||||
</para>
|
</para>
|
||||||
<para>
|
<para>
|
||||||
Next you should choose one of more I/O drivers to interconnect debugging
|
Next you should choose one of more I/O drivers to interconnect debugging
|
||||||
|
|
|
@ -133,7 +133,6 @@
|
||||||
!Idrivers/rapidio/rio-sysfs.c
|
!Idrivers/rapidio/rio-sysfs.c
|
||||||
</sect1>
|
</sect1>
|
||||||
<sect1 id="PPC32_support"><title>PPC32 support</title>
|
<sect1 id="PPC32_support"><title>PPC32 support</title>
|
||||||
!Iarch/powerpc/kernel/rio.c
|
|
||||||
!Earch/powerpc/sysdev/fsl_rio.c
|
!Earch/powerpc/sysdev/fsl_rio.c
|
||||||
!Iarch/powerpc/sysdev/fsl_rio.c
|
!Iarch/powerpc/sysdev/fsl_rio.c
|
||||||
</sect1>
|
</sect1>
|
||||||
|
|
|
@ -249,9 +249,11 @@ process is as follows:
|
||||||
release a new -rc kernel every week.
|
release a new -rc kernel every week.
|
||||||
- Process continues until the kernel is considered "ready", the
|
- Process continues until the kernel is considered "ready", the
|
||||||
process should last around 6 weeks.
|
process should last around 6 weeks.
|
||||||
- A list of known regressions present in each -rc release is
|
- Known regressions in each release are periodically posted to the
|
||||||
tracked at the following URI:
|
linux-kernel mailing list. The goal is to reduce the length of
|
||||||
http://kernelnewbies.org/known_regressions
|
that list to zero before declaring the kernel to be "ready," but, in
|
||||||
|
the real world, a small number of regressions often remain at
|
||||||
|
release time.
|
||||||
|
|
||||||
It is worth mentioning what Andrew Morton wrote on the linux-kernel
|
It is worth mentioning what Andrew Morton wrote on the linux-kernel
|
||||||
mailing list about kernel releases:
|
mailing list about kernel releases:
|
||||||
|
@ -261,7 +263,7 @@ mailing list about kernel releases:
|
||||||
|
|
||||||
2.6.x.y -stable kernel tree
|
2.6.x.y -stable kernel tree
|
||||||
---------------------------
|
---------------------------
|
||||||
Kernels with 4 digit versions are -stable kernels. They contain
|
Kernels with 4-part versions are -stable kernels. They contain
|
||||||
relatively small and critical fixes for security problems or significant
|
relatively small and critical fixes for security problems or significant
|
||||||
regressions discovered in a given 2.6.x kernel.
|
regressions discovered in a given 2.6.x kernel.
|
||||||
|
|
||||||
|
@ -273,7 +275,10 @@ If no 2.6.x.y kernel is available, then the highest numbered 2.6.x
|
||||||
kernel is the current stable kernel.
|
kernel is the current stable kernel.
|
||||||
|
|
||||||
2.6.x.y are maintained by the "stable" team <stable@kernel.org>, and are
|
2.6.x.y are maintained by the "stable" team <stable@kernel.org>, and are
|
||||||
released almost every other week.
|
released as needs dictate. The normal release period is approximately
|
||||||
|
two weeks, but it can be longer if there are no pressing problems. A
|
||||||
|
security-related problem, instead, can cause a release to happen almost
|
||||||
|
instantly.
|
||||||
|
|
||||||
The file Documentation/stable_kernel_rules.txt in the kernel tree
|
The file Documentation/stable_kernel_rules.txt in the kernel tree
|
||||||
documents what kinds of changes are acceptable for the -stable tree, and
|
documents what kinds of changes are acceptable for the -stable tree, and
|
||||||
|
@ -298,7 +303,9 @@ a while Andrew or the subsystem maintainer pushes it on to Linus for
|
||||||
inclusion in mainline.
|
inclusion in mainline.
|
||||||
|
|
||||||
It is heavily encouraged that all new patches get tested in the -mm tree
|
It is heavily encouraged that all new patches get tested in the -mm tree
|
||||||
before they are sent to Linus for inclusion in the main kernel tree.
|
before they are sent to Linus for inclusion in the main kernel tree. Code
|
||||||
|
which does not make an appearance in -mm before the opening of the merge
|
||||||
|
window will prove hard to merge into the mainline.
|
||||||
|
|
||||||
These kernels are not appropriate for use on systems that are supposed
|
These kernels are not appropriate for use on systems that are supposed
|
||||||
to be stable and they are more risky to run than any of the other
|
to be stable and they are more risky to run than any of the other
|
||||||
|
@ -354,11 +361,12 @@ Here is a list of some of the different kernel trees available:
|
||||||
- SCSI, James Bottomley <James.Bottomley@SteelEye.com>
|
- SCSI, James Bottomley <James.Bottomley@SteelEye.com>
|
||||||
git.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git
|
git.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git
|
||||||
|
|
||||||
|
- x86, Ingo Molnar <mingo@elte.hu>
|
||||||
|
git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-x86.git
|
||||||
|
|
||||||
quilt trees:
|
quilt trees:
|
||||||
- USB, PCI, Driver Core, and I2C, Greg Kroah-Hartman <gregkh@suse.de>
|
- USB, Driver Core, and I2C, Greg Kroah-Hartman <gregkh@suse.de>
|
||||||
kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
|
kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
|
||||||
- x86-64, partly i386, Andi Kleen <ak@suse.de>
|
|
||||||
ftp.firstfloor.org:/pub/ak/x86_64/quilt/
|
|
||||||
|
|
||||||
Other kernel trees can be found listed at http://git.kernel.org/ and in
|
Other kernel trees can be found listed at http://git.kernel.org/ and in
|
||||||
the MAINTAINERS file.
|
the MAINTAINERS file.
|
||||||
|
@ -392,8 +400,8 @@ If you want to be advised of the future bug reports, you can subscribe to the
|
||||||
bugme-new mailing list (only new bug reports are mailed here) or to the
|
bugme-new mailing list (only new bug reports are mailed here) or to the
|
||||||
bugme-janitor mailing list (every change in the bugzilla is mailed here)
|
bugme-janitor mailing list (every change in the bugzilla is mailed here)
|
||||||
|
|
||||||
http://lists.osdl.org/mailman/listinfo/bugme-new
|
http://lists.linux-foundation.org/mailman/listinfo/bugme-new
|
||||||
http://lists.osdl.org/mailman/listinfo/bugme-janitors
|
http://lists.linux-foundation.org/mailman/listinfo/bugme-janitors
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
S3C24XX NAND Support
|
||||||
|
====================
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
------------
|
||||||
|
|
||||||
|
Small Page NAND
|
||||||
|
---------------
|
||||||
|
|
||||||
|
The driver uses a 512 byte (1 page) ECC code for this setup. The
|
||||||
|
ECC code is not directly compatible with the default kernel ECC
|
||||||
|
code, so the driver enforces its own OOB layout and ECC parameters
|
||||||
|
|
||||||
|
Large Page NAND
|
||||||
|
---------------
|
||||||
|
|
||||||
|
The driver is capable of handling NAND flash with a 2KiB page
|
||||||
|
size, with support for hardware ECC generation and correction.
|
||||||
|
|
||||||
|
Unlike the 512byte page mode, the driver generates ECC data for
|
||||||
|
each 256 byte block in an 2KiB page. This means that more than
|
||||||
|
one error in a page can be rectified. It also means that the
|
||||||
|
OOB layout remains the default kernel layout for these flashes.
|
||||||
|
|
||||||
|
|
||||||
|
Document Author
|
||||||
|
---------------
|
||||||
|
|
||||||
|
Ben Dooks, Copyright 2007 Simtec Electronics
|
||||||
|
|
|
@ -156,6 +156,8 @@ NAND
|
||||||
controller. If there are any problems the latest linux-mtd
|
controller. If there are any problems the latest linux-mtd
|
||||||
code can be found from http://www.linux-mtd.infradead.org/
|
code can be found from http://www.linux-mtd.infradead.org/
|
||||||
|
|
||||||
|
For more information see Documentation/arm/Samsung-S3C24XX/NAND.txt
|
||||||
|
|
||||||
|
|
||||||
Serial
|
Serial
|
||||||
------
|
------
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
Linux Braille Console
|
||||||
|
|
||||||
|
To get early boot messages on a braille device (before userspace screen
|
||||||
|
readers can start), you first need to compile the support for the usual serial
|
||||||
|
console (see serial-console.txt), and for braille device (in Device Drivers -
|
||||||
|
Accessibility).
|
||||||
|
|
||||||
|
Then you need to specify a console=brl, option on the kernel command line, the
|
||||||
|
format is:
|
||||||
|
|
||||||
|
console=brl,serial_options...
|
||||||
|
|
||||||
|
where serial_options... are the same as described in serial-console.txt
|
||||||
|
|
||||||
|
So for instance you can use console=brl,ttyS0 if the braille device is connected
|
||||||
|
to the first serial port, and console=brl,ttyS0,115200 to override the baud rate
|
||||||
|
to 115200, etc.
|
||||||
|
|
||||||
|
By default, the braille device will just show the last kernel message (console
|
||||||
|
mode). To review previous messages, press the Insert key to switch to the VT
|
||||||
|
review mode. In review mode, the arrow keys permit to browse in the VT content,
|
||||||
|
page up/down keys go at the top/bottom of the screen, and the home key goes back
|
||||||
|
to the cursor, hence providing very basic screen reviewing facility.
|
||||||
|
|
||||||
|
Sound feedback can be obtained by adding the braille_console.sound=1 kernel
|
||||||
|
parameter.
|
||||||
|
|
||||||
|
For simplicity, only one braille console can be enabled, other uses of
|
||||||
|
console=brl,... will be discarded. Also note that it does not interfere with
|
||||||
|
the console selection mecanism described in serial-console.txt
|
||||||
|
|
||||||
|
For now, only the VisioBraille device is supported.
|
||||||
|
|
||||||
|
Samuel Thibault <samuel.thibault@ens-lyon.org>
|
|
@ -500,8 +500,7 @@ post-attachment activity that requires memory allocations or blocking.
|
||||||
|
|
||||||
void fork(struct cgroup_subsy *ss, struct task_struct *task)
|
void fork(struct cgroup_subsy *ss, struct task_struct *task)
|
||||||
|
|
||||||
Called when a task is forked into a cgroup. Also called during
|
Called when a task is forked into a cgroup.
|
||||||
registration for all existing tasks.
|
|
||||||
|
|
||||||
void exit(struct cgroup_subsys *ss, struct task_struct *task)
|
void exit(struct cgroup_subsys *ss, struct task_struct *task)
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
Device Whitelist Controller
|
||||||
|
|
||||||
|
1. Description:
|
||||||
|
|
||||||
|
Implement a cgroup to track and enforce open and mknod restrictions
|
||||||
|
on device files. A device cgroup associates a device access
|
||||||
|
whitelist with each cgroup. A whitelist entry has 4 fields.
|
||||||
|
'type' is a (all), c (char), or b (block). 'all' means it applies
|
||||||
|
to all types and all major and minor numbers. Major and minor are
|
||||||
|
either an integer or * for all. Access is a composition of r
|
||||||
|
(read), w (write), and m (mknod).
|
||||||
|
|
||||||
|
The root device cgroup starts with rwm to 'all'. A child device
|
||||||
|
cgroup gets a copy of the parent. Administrators can then remove
|
||||||
|
devices from the whitelist or add new entries. A child cgroup can
|
||||||
|
never receive a device access which is denied its parent. However
|
||||||
|
when a device access is removed from a parent it will not also be
|
||||||
|
removed from the child(ren).
|
||||||
|
|
||||||
|
2. User Interface
|
||||||
|
|
||||||
|
An entry is added using devices.allow, and removed using
|
||||||
|
devices.deny. For instance
|
||||||
|
|
||||||
|
echo 'c 1:3 mr' > /cgroups/1/devices.allow
|
||||||
|
|
||||||
|
allows cgroup 1 to read and mknod the device usually known as
|
||||||
|
/dev/null. Doing
|
||||||
|
|
||||||
|
echo a > /cgroups/1/devices.deny
|
||||||
|
|
||||||
|
will remove the default 'a *:* mrw' entry.
|
||||||
|
|
||||||
|
3. Security
|
||||||
|
|
||||||
|
Any task can move itself between cgroups. This clearly won't
|
||||||
|
suffice, but we can decide the best way to adequately restrict
|
||||||
|
movement as people get some experience with this. We may just want
|
||||||
|
to require CAP_SYS_ADMIN, which at least is a separate bit from
|
||||||
|
CAP_MKNOD. We may want to just refuse moving to a cgroup which
|
||||||
|
isn't a descendent of the current one. Or we may want to use
|
||||||
|
CAP_MAC_ADMIN, since we really are trying to lock down root.
|
||||||
|
|
||||||
|
CAP_SYS_ADMIN is needed to modify the whitelist or move another
|
||||||
|
task to a new cgroup. (Again we'll probably want to change that).
|
||||||
|
|
||||||
|
A cgroup may not be granted more permissions than the cgroup's
|
||||||
|
parent has.
|
|
@ -0,0 +1,181 @@
|
||||||
|
|
||||||
|
The Resource Counter
|
||||||
|
|
||||||
|
The resource counter, declared at include/linux/res_counter.h,
|
||||||
|
is supposed to facilitate the resource management by controllers
|
||||||
|
by providing common stuff for accounting.
|
||||||
|
|
||||||
|
This "stuff" includes the res_counter structure and routines
|
||||||
|
to work with it.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1. Crucial parts of the res_counter structure
|
||||||
|
|
||||||
|
a. unsigned long long usage
|
||||||
|
|
||||||
|
The usage value shows the amount of a resource that is consumed
|
||||||
|
by a group at a given time. The units of measurement should be
|
||||||
|
determined by the controller that uses this counter. E.g. it can
|
||||||
|
be bytes, items or any other unit the controller operates on.
|
||||||
|
|
||||||
|
b. unsigned long long max_usage
|
||||||
|
|
||||||
|
The maximal value of the usage over time.
|
||||||
|
|
||||||
|
This value is useful when gathering statistical information about
|
||||||
|
the particular group, as it shows the actual resource requirements
|
||||||
|
for a particular group, not just some usage snapshot.
|
||||||
|
|
||||||
|
c. unsigned long long limit
|
||||||
|
|
||||||
|
The maximal allowed amount of resource to consume by the group. In
|
||||||
|
case the group requests for more resources, so that the usage value
|
||||||
|
would exceed the limit, the resource allocation is rejected (see
|
||||||
|
the next section).
|
||||||
|
|
||||||
|
d. unsigned long long failcnt
|
||||||
|
|
||||||
|
The failcnt stands for "failures counter". This is the number of
|
||||||
|
resource allocation attempts that failed.
|
||||||
|
|
||||||
|
c. spinlock_t lock
|
||||||
|
|
||||||
|
Protects changes of the above values.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
2. Basic accounting routines
|
||||||
|
|
||||||
|
a. void res_counter_init(struct res_counter *rc)
|
||||||
|
|
||||||
|
Initializes the resource counter. As usual, should be the first
|
||||||
|
routine called for a new counter.
|
||||||
|
|
||||||
|
b. int res_counter_charge[_locked]
|
||||||
|
(struct res_counter *rc, unsigned long val)
|
||||||
|
|
||||||
|
When a resource is about to be allocated it has to be accounted
|
||||||
|
with the appropriate resource counter (controller should determine
|
||||||
|
which one to use on its own). This operation is called "charging".
|
||||||
|
|
||||||
|
This is not very important which operation - resource allocation
|
||||||
|
or charging - is performed first, but
|
||||||
|
* if the allocation is performed first, this may create a
|
||||||
|
temporary resource over-usage by the time resource counter is
|
||||||
|
charged;
|
||||||
|
* if the charging is performed first, then it should be uncharged
|
||||||
|
on error path (if the one is called).
|
||||||
|
|
||||||
|
c. void res_counter_uncharge[_locked]
|
||||||
|
(struct res_counter *rc, unsigned long val)
|
||||||
|
|
||||||
|
When a resource is released (freed) it should be de-accounted
|
||||||
|
from the resource counter it was accounted to. This is called
|
||||||
|
"uncharging".
|
||||||
|
|
||||||
|
The _locked routines imply that the res_counter->lock is taken.
|
||||||
|
|
||||||
|
|
||||||
|
2.1 Other accounting routines
|
||||||
|
|
||||||
|
There are more routines that may help you with common needs, like
|
||||||
|
checking whether the limit is reached or resetting the max_usage
|
||||||
|
value. They are all declared in include/linux/res_counter.h.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
3. Analyzing the resource counter registrations
|
||||||
|
|
||||||
|
a. If the failcnt value constantly grows, this means that the counter's
|
||||||
|
limit is too tight. Either the group is misbehaving and consumes too
|
||||||
|
many resources, or the configuration is not suitable for the group
|
||||||
|
and the limit should be increased.
|
||||||
|
|
||||||
|
b. The max_usage value can be used to quickly tune the group. One may
|
||||||
|
set the limits to maximal values and either load the container with
|
||||||
|
a common pattern or leave one for a while. After this the max_usage
|
||||||
|
value shows the amount of memory the container would require during
|
||||||
|
its common activity.
|
||||||
|
|
||||||
|
Setting the limit a bit above this value gives a pretty good
|
||||||
|
configuration that works in most of the cases.
|
||||||
|
|
||||||
|
c. If the max_usage is much less than the limit, but the failcnt value
|
||||||
|
is growing, then the group tries to allocate a big chunk of resource
|
||||||
|
at once.
|
||||||
|
|
||||||
|
d. If the max_usage is much less than the limit, but the failcnt value
|
||||||
|
is 0, then this group is given too high limit, that it does not
|
||||||
|
require. It is better to lower the limit a bit leaving more resource
|
||||||
|
for other groups.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
4. Communication with the control groups subsystem (cgroups)
|
||||||
|
|
||||||
|
All the resource controllers that are using cgroups and resource counters
|
||||||
|
should provide files (in the cgroup filesystem) to work with the resource
|
||||||
|
counter fields. They are recommended to adhere to the following rules:
|
||||||
|
|
||||||
|
a. File names
|
||||||
|
|
||||||
|
Field name File name
|
||||||
|
---------------------------------------------------
|
||||||
|
usage usage_in_<unit_of_measurement>
|
||||||
|
max_usage max_usage_in_<unit_of_measurement>
|
||||||
|
limit limit_in_<unit_of_measurement>
|
||||||
|
failcnt failcnt
|
||||||
|
lock no file :)
|
||||||
|
|
||||||
|
b. Reading from file should show the corresponding field value in the
|
||||||
|
appropriate format.
|
||||||
|
|
||||||
|
c. Writing to file
|
||||||
|
|
||||||
|
Field Expected behavior
|
||||||
|
----------------------------------
|
||||||
|
usage prohibited
|
||||||
|
max_usage reset to usage
|
||||||
|
limit set the limit
|
||||||
|
failcnt reset to zero
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
5. Usage example
|
||||||
|
|
||||||
|
a. Declare a task group (take a look at cgroups subsystem for this) and
|
||||||
|
fold a res_counter into it
|
||||||
|
|
||||||
|
struct my_group {
|
||||||
|
struct res_counter res;
|
||||||
|
|
||||||
|
<other fields>
|
||||||
|
}
|
||||||
|
|
||||||
|
b. Put hooks in resource allocation/release paths
|
||||||
|
|
||||||
|
int alloc_something(...)
|
||||||
|
{
|
||||||
|
if (res_counter_charge(res_counter_ptr, amount) < 0)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
<allocate the resource and return to the caller>
|
||||||
|
}
|
||||||
|
|
||||||
|
void release_something(...)
|
||||||
|
{
|
||||||
|
res_counter_uncharge(res_counter_ptr, amount);
|
||||||
|
|
||||||
|
<release the resource>
|
||||||
|
}
|
||||||
|
|
||||||
|
In order to keep the usage value self-consistent, both the
|
||||||
|
"res_counter_ptr" and the "amount" in release_something() should be
|
||||||
|
the same as they were in the alloc_something() when the releasing
|
||||||
|
resource was allocated.
|
||||||
|
|
||||||
|
c. Provide the way to read res_counter values and set them (the cgroups
|
||||||
|
still can help with it).
|
||||||
|
|
||||||
|
c. Compile and run :)
|
|
@ -154,6 +154,11 @@ scaling_governor, and by "echoing" the name of another
|
||||||
that some governors won't load - they only
|
that some governors won't load - they only
|
||||||
work on some specific architectures or
|
work on some specific architectures or
|
||||||
processors.
|
processors.
|
||||||
|
|
||||||
|
cpuinfo_cur_freq : Current speed of the CPU, in KHz.
|
||||||
|
|
||||||
|
scaling_available_frequencies : List of available frequencies, in KHz.
|
||||||
|
|
||||||
scaling_min_freq and
|
scaling_min_freq and
|
||||||
scaling_max_freq show the current "policy limits" (in
|
scaling_max_freq show the current "policy limits" (in
|
||||||
kHz). By echoing new values into these
|
kHz). By echoing new values into these
|
||||||
|
@ -162,6 +167,15 @@ scaling_max_freq show the current "policy limits" (in
|
||||||
first set scaling_max_freq, then
|
first set scaling_max_freq, then
|
||||||
scaling_min_freq.
|
scaling_min_freq.
|
||||||
|
|
||||||
|
affected_cpus : List of CPUs that require software coordination
|
||||||
|
of frequency.
|
||||||
|
|
||||||
|
related_cpus : List of CPUs that need some sort of frequency
|
||||||
|
coordination, whether software or hardware.
|
||||||
|
|
||||||
|
scaling_driver : Hardware driver for cpufreq.
|
||||||
|
|
||||||
|
scaling_cur_freq : Current frequency of the CPU, in KHz.
|
||||||
|
|
||||||
If you have selected the "userspace" governor which allows you to
|
If you have selected the "userspace" governor which allows you to
|
||||||
set the CPU operating frequency to a specific value, you can read out
|
set the CPU operating frequency to a specific value, you can read out
|
||||||
|
|
|
@ -171,6 +171,7 @@ files describing that cpuset:
|
||||||
- memory_migrate flag: if set, move pages to cpusets nodes
|
- memory_migrate flag: if set, move pages to cpusets nodes
|
||||||
- cpu_exclusive flag: is cpu placement exclusive?
|
- cpu_exclusive flag: is cpu placement exclusive?
|
||||||
- mem_exclusive flag: is memory placement exclusive?
|
- mem_exclusive flag: is memory placement exclusive?
|
||||||
|
- mem_hardwall flag: is memory allocation hardwalled
|
||||||
- memory_pressure: measure of how much paging pressure in cpuset
|
- memory_pressure: measure of how much paging pressure in cpuset
|
||||||
|
|
||||||
In addition, the root cpuset only has the following file:
|
In addition, the root cpuset only has the following file:
|
||||||
|
@ -222,17 +223,18 @@ If a cpuset is cpu or mem exclusive, no other cpuset, other than
|
||||||
a direct ancestor or descendent, may share any of the same CPUs or
|
a direct ancestor or descendent, may share any of the same CPUs or
|
||||||
Memory Nodes.
|
Memory Nodes.
|
||||||
|
|
||||||
A cpuset that is mem_exclusive restricts kernel allocations for
|
A cpuset that is mem_exclusive *or* mem_hardwall is "hardwalled",
|
||||||
page, buffer and other data commonly shared by the kernel across
|
i.e. it restricts kernel allocations for page, buffer and other data
|
||||||
multiple users. All cpusets, whether mem_exclusive or not, restrict
|
commonly shared by the kernel across multiple users. All cpusets,
|
||||||
allocations of memory for user space. This enables configuring a
|
whether hardwalled or not, restrict allocations of memory for user
|
||||||
system so that several independent jobs can share common kernel data,
|
space. This enables configuring a system so that several independent
|
||||||
such as file system pages, while isolating each jobs user allocation in
|
jobs can share common kernel data, such as file system pages, while
|
||||||
its own cpuset. To do this, construct a large mem_exclusive cpuset to
|
isolating each job's user allocation in its own cpuset. To do this,
|
||||||
hold all the jobs, and construct child, non-mem_exclusive cpusets for
|
construct a large mem_exclusive cpuset to hold all the jobs, and
|
||||||
each individual job. Only a small amount of typical kernel memory,
|
construct child, non-mem_exclusive cpusets for each individual job.
|
||||||
such as requests from interrupt handlers, is allowed to be taken
|
Only a small amount of typical kernel memory, such as requests from
|
||||||
outside even a mem_exclusive cpuset.
|
interrupt handlers, is allowed to be taken outside even a
|
||||||
|
mem_exclusive cpuset.
|
||||||
|
|
||||||
|
|
||||||
1.5 What is memory_pressure ?
|
1.5 What is memory_pressure ?
|
||||||
|
@ -707,7 +709,7 @@ Now you want to do something with this cpuset.
|
||||||
|
|
||||||
In this directory you can find several files:
|
In this directory you can find several files:
|
||||||
# ls
|
# ls
|
||||||
cpus cpu_exclusive mems mem_exclusive tasks
|
cpus cpu_exclusive mems mem_exclusive mem_hardwall tasks
|
||||||
|
|
||||||
Reading them will give you information about the state of this cpuset:
|
Reading them will give you information about the state of this cpuset:
|
||||||
the CPUs and Memory Nodes it can use, the processes that are using
|
the CPUs and Memory Nodes it can use, the processes that are using
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
dm-crypt
|
||||||
|
=========
|
||||||
|
|
||||||
|
Device-Mapper's "crypt" target provides transparent encryption of block devices
|
||||||
|
using the kernel crypto API.
|
||||||
|
|
||||||
|
Parameters: <cipher> <key> <iv_offset> <device path> <offset>
|
||||||
|
|
||||||
|
<cipher>
|
||||||
|
Encryption cipher and an optional IV generation mode.
|
||||||
|
(In format cipher-chainmode-ivopts:ivmode).
|
||||||
|
Examples:
|
||||||
|
des
|
||||||
|
aes-cbc-essiv:sha256
|
||||||
|
twofish-ecb
|
||||||
|
|
||||||
|
/proc/crypto contains supported crypto modes
|
||||||
|
|
||||||
|
<key>
|
||||||
|
Key used for encryption. It is encoded as a hexadecimal number.
|
||||||
|
You can only use key sizes that are valid for the selected cipher.
|
||||||
|
|
||||||
|
<iv_offset>
|
||||||
|
The IV offset is a sector count that is added to the sector number
|
||||||
|
before creating the IV.
|
||||||
|
|
||||||
|
<device path>
|
||||||
|
This is the device that is going to be used as backend and contains the
|
||||||
|
encrypted data. You can specify it as a path like /dev/xxx or a device
|
||||||
|
number <major>:<minor>.
|
||||||
|
|
||||||
|
<offset>
|
||||||
|
Starting sector within the device where the encrypted data begins.
|
||||||
|
|
||||||
|
Example scripts
|
||||||
|
===============
|
||||||
|
LUKS (Linux Unified Key Setup) is now the preferred way to set up disk
|
||||||
|
encryption with dm-crypt using the 'cryptsetup' utility, see
|
||||||
|
http://luks.endorphin.org/
|
||||||
|
|
||||||
|
[[
|
||||||
|
#!/bin/sh
|
||||||
|
# Create a crypt device using dmsetup
|
||||||
|
dmsetup create crypt1 --table "0 `blockdev --getsize $1` crypt aes-cbc-essiv:sha256 babebabebabebabebabebabebabebabe 0 $1 0"
|
||||||
|
]]
|
||||||
|
|
||||||
|
[[
|
||||||
|
#!/bin/sh
|
||||||
|
# Create a crypt device using cryptsetup and LUKS header with default cipher
|
||||||
|
cryptsetup luksFormat $1
|
||||||
|
cryptsetup luksOpen $1 crypt1
|
||||||
|
]]
|
|
@ -141,6 +141,7 @@ mkprep
|
||||||
mktables
|
mktables
|
||||||
mktree
|
mktree
|
||||||
modpost
|
modpost
|
||||||
|
modules.order
|
||||||
modversions.h*
|
modversions.h*
|
||||||
offset.h
|
offset.h
|
||||||
offsets.h
|
offsets.h
|
||||||
|
@ -171,6 +172,7 @@ sm_tbl*
|
||||||
split-include
|
split-include
|
||||||
tags
|
tags
|
||||||
tftpboot.img
|
tftpboot.img
|
||||||
|
timeconst.h
|
||||||
times.h*
|
times.h*
|
||||||
tkparse
|
tkparse
|
||||||
trix_boot.h
|
trix_boot.h
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
[This file is cloned from VesaFB/aty128fb]
|
||||||
|
|
||||||
|
What is gxfb?
|
||||||
|
=================
|
||||||
|
|
||||||
|
This is a graphics framebuffer driver for AMD Geode GX2 based processors.
|
||||||
|
|
||||||
|
Advantages:
|
||||||
|
|
||||||
|
* No need to use AMD's VSA code (or other VESA emulation layer) in the
|
||||||
|
BIOS.
|
||||||
|
* It provides a nice large console (128 cols + 48 lines with 1024x768)
|
||||||
|
without using tiny, unreadable fonts.
|
||||||
|
* You can run XF68_FBDev on top of /dev/fb0
|
||||||
|
* Most important: boot logo :-)
|
||||||
|
|
||||||
|
Disadvantages:
|
||||||
|
|
||||||
|
* graphic mode is slower than text mode...
|
||||||
|
|
||||||
|
|
||||||
|
How to use it?
|
||||||
|
==============
|
||||||
|
|
||||||
|
Switching modes is done using gxfb.mode_option=<resolution>... boot
|
||||||
|
parameter or using `fbset' program.
|
||||||
|
|
||||||
|
See Documentation/fb/modedb.txt for more information on modedb
|
||||||
|
resolutions.
|
||||||
|
|
||||||
|
|
||||||
|
X11
|
||||||
|
===
|
||||||
|
|
||||||
|
XF68_FBDev should generally work fine, but it is non-accelerated.
|
||||||
|
|
||||||
|
|
||||||
|
Configuration
|
||||||
|
=============
|
||||||
|
|
||||||
|
You can pass kernel command line options to gxfb with gxfb.<option>.
|
||||||
|
For example, gxfb.mode_option=800x600@75.
|
||||||
|
Accepted options:
|
||||||
|
|
||||||
|
mode_option - specify the video mode. Of the form
|
||||||
|
<x>x<y>[-<bpp>][@<refresh>]
|
||||||
|
vram - size of video ram (normally auto-detected)
|
||||||
|
vt_switch - enable vt switching during suspend/resume. The vt
|
||||||
|
switch is slow, but harmless.
|
||||||
|
|
||||||
|
--
|
||||||
|
Andres Salomon <dilinger@debian.org>
|
|
@ -14,6 +14,8 @@ graphics devices. These would include:
|
||||||
Intel 915GM
|
Intel 915GM
|
||||||
Intel 945G
|
Intel 945G
|
||||||
Intel 945GM
|
Intel 945GM
|
||||||
|
Intel 965G
|
||||||
|
Intel 965GM
|
||||||
|
|
||||||
B. List of available options
|
B. List of available options
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
[This file is cloned from VesaFB/aty128fb]
|
||||||
|
|
||||||
|
What is lxfb?
|
||||||
|
=================
|
||||||
|
|
||||||
|
This is a graphics framebuffer driver for AMD Geode LX based processors.
|
||||||
|
|
||||||
|
Advantages:
|
||||||
|
|
||||||
|
* No need to use AMD's VSA code (or other VESA emulation layer) in the
|
||||||
|
BIOS.
|
||||||
|
* It provides a nice large console (128 cols + 48 lines with 1024x768)
|
||||||
|
without using tiny, unreadable fonts.
|
||||||
|
* You can run XF68_FBDev on top of /dev/fb0
|
||||||
|
* Most important: boot logo :-)
|
||||||
|
|
||||||
|
Disadvantages:
|
||||||
|
|
||||||
|
* graphic mode is slower than text mode...
|
||||||
|
|
||||||
|
|
||||||
|
How to use it?
|
||||||
|
==============
|
||||||
|
|
||||||
|
Switching modes is done using lxfb.mode_option=<resolution>... boot
|
||||||
|
parameter or using `fbset' program.
|
||||||
|
|
||||||
|
See Documentation/fb/modedb.txt for more information on modedb
|
||||||
|
resolutions.
|
||||||
|
|
||||||
|
|
||||||
|
X11
|
||||||
|
===
|
||||||
|
|
||||||
|
XF68_FBDev should generally work fine, but it is non-accelerated.
|
||||||
|
|
||||||
|
|
||||||
|
Configuration
|
||||||
|
=============
|
||||||
|
|
||||||
|
You can pass kernel command line options to lxfb with lxfb.<option>.
|
||||||
|
For example, lxfb.mode_option=800x600@75.
|
||||||
|
Accepted options:
|
||||||
|
|
||||||
|
mode_option - specify the video mode. Of the form
|
||||||
|
<x>x<y>[-<bpp>][@<refresh>]
|
||||||
|
vram - size of video ram (normally auto-detected)
|
||||||
|
vt_switch - enable vt switching during suspend/resume. The vt
|
||||||
|
switch is slow, but harmless.
|
||||||
|
|
||||||
|
--
|
||||||
|
Andres Salomon <dilinger@debian.org>
|
|
@ -1,7 +1,7 @@
|
||||||
Metronomefb
|
Metronomefb
|
||||||
-----------
|
-----------
|
||||||
Maintained by Jaya Kumar <jayakumar.lkml.gmail.com>
|
Maintained by Jaya Kumar <jayakumar.lkml.gmail.com>
|
||||||
Last revised: Nov 20, 2007
|
Last revised: Mar 10, 2008
|
||||||
|
|
||||||
Metronomefb is a driver for the Metronome display controller. The controller
|
Metronomefb is a driver for the Metronome display controller. The controller
|
||||||
is from E-Ink Corporation. It is intended to be used to drive the E-Ink
|
is from E-Ink Corporation. It is intended to be used to drive the E-Ink
|
||||||
|
@ -11,20 +11,18 @@ display media here http://www.e-ink.com/products/matrix/metronome.html .
|
||||||
Metronome is interfaced to the host CPU through the AMLCD interface. The
|
Metronome is interfaced to the host CPU through the AMLCD interface. The
|
||||||
host CPU generates the control information and the image in a framebuffer
|
host CPU generates the control information and the image in a framebuffer
|
||||||
which is then delivered to the AMLCD interface by a host specific method.
|
which is then delivered to the AMLCD interface by a host specific method.
|
||||||
Currently, that's implemented for the PXA's LCDC controller. The display and
|
The display and error status are each pulled through individual GPIOs.
|
||||||
error status are each pulled through individual GPIOs.
|
|
||||||
|
|
||||||
Metronomefb was written for the PXA255/gumstix/lyre combination and
|
Metronomefb is platform independent and depends on a board specific driver
|
||||||
therefore currently has board set specific code in it. If other boards based on
|
to do all physical IO work. Currently, an example is implemented for the
|
||||||
other architectures are available, then the host specific code can be separated
|
PXA board used in the AM-200 EPD devkit. This example is am200epd.c
|
||||||
and abstracted out.
|
|
||||||
|
|
||||||
Metronomefb requires waveform information which is delivered via the AMLCD
|
Metronomefb requires waveform information which is delivered via the AMLCD
|
||||||
interface to the metronome controller. The waveform information is expected to
|
interface to the metronome controller. The waveform information is expected to
|
||||||
be delivered from userspace via the firmware class interface. The waveform file
|
be delivered from userspace via the firmware class interface. The waveform file
|
||||||
can be compressed as long as your udev or hotplug script is aware of the need
|
can be compressed as long as your udev or hotplug script is aware of the need
|
||||||
to uncompress it before delivering it. metronomefb will ask for waveform.wbf
|
to uncompress it before delivering it. metronomefb will ask for metronome.wbf
|
||||||
which would typically go into /lib/firmware/waveform.wbf depending on your
|
which would typically go into /lib/firmware/metronome.wbf depending on your
|
||||||
udev/hotplug setup. I have only tested with a single waveform file which was
|
udev/hotplug setup. I have only tested with a single waveform file which was
|
||||||
originally labeled 23P01201_60_WT0107_MTC. I do not know what it stands for.
|
originally labeled 23P01201_60_WT0107_MTC. I do not know what it stands for.
|
||||||
Caution should be exercised when manipulating the waveform as there may be
|
Caution should be exercised when manipulating the waveform as there may be
|
||||||
|
|
|
@ -125,8 +125,12 @@ There may be more modes.
|
||||||
amifb - Amiga chipset frame buffer
|
amifb - Amiga chipset frame buffer
|
||||||
aty128fb - ATI Rage128 / Pro frame buffer
|
aty128fb - ATI Rage128 / Pro frame buffer
|
||||||
atyfb - ATI Mach64 frame buffer
|
atyfb - ATI Mach64 frame buffer
|
||||||
|
pm2fb - Permedia 2/2V frame buffer
|
||||||
|
pm3fb - Permedia 3 frame buffer
|
||||||
|
sstfb - Voodoo 1/2 (SST1) chipset frame buffer
|
||||||
tdfxfb - 3D Fx frame buffer
|
tdfxfb - 3D Fx frame buffer
|
||||||
tridentfb - Trident (Cyber)blade chipset frame buffer
|
tridentfb - Trident (Cyber)blade chipset frame buffer
|
||||||
|
vt8623fb - VIA 8623 frame buffer
|
||||||
|
|
||||||
BTW, only a few drivers use this at the moment. Others are to follow
|
BTW, only a few drivers use this at the moment. Others are to follow
|
||||||
(feel free to send patches).
|
(feel free to send patches).
|
||||||
|
|
|
@ -128,15 +128,6 @@ Who: Arjan van de Ven <arjan@linux.intel.com>
|
||||||
|
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
||||||
What: vm_ops.nopage
|
|
||||||
When: Soon, provided in-kernel callers have been converted
|
|
||||||
Why: This interface is replaced by vm_ops.fault, but it has been around
|
|
||||||
forever, is used by a lot of drivers, and doesn't cost much to
|
|
||||||
maintain.
|
|
||||||
Who: Nick Piggin <npiggin@suse.de>
|
|
||||||
|
|
||||||
---------------------------
|
|
||||||
|
|
||||||
What: PHYSDEVPATH, PHYSDEVBUS, PHYSDEVDRIVER in the uevent environment
|
What: PHYSDEVPATH, PHYSDEVBUS, PHYSDEVDRIVER in the uevent environment
|
||||||
When: October 2008
|
When: October 2008
|
||||||
Why: The stacking of class devices makes these values misleading and
|
Why: The stacking of class devices makes these values misleading and
|
||||||
|
@ -147,6 +138,24 @@ Who: Kay Sievers <kay.sievers@suse.de>
|
||||||
|
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
||||||
|
What: find_task_by_pid
|
||||||
|
When: 2.6.26
|
||||||
|
Why: With pid namespaces, calling this funciton will return the
|
||||||
|
wrong task when called from inside a namespace.
|
||||||
|
|
||||||
|
The best way to save a task pid and find a task by this
|
||||||
|
pid later, is to find this task's struct pid pointer (or get
|
||||||
|
it directly from the task) and call pid_task() later.
|
||||||
|
|
||||||
|
If someone really needs to get a task by its pid_t, then
|
||||||
|
he most likely needs the find_task_by_vpid() to get the
|
||||||
|
task from the same namespace as the current task is in, but
|
||||||
|
this may be not so in general.
|
||||||
|
|
||||||
|
Who: Pavel Emelyanov <xemul@openvz.org>
|
||||||
|
|
||||||
|
---------------------------
|
||||||
|
|
||||||
What: ACPI procfs interface
|
What: ACPI procfs interface
|
||||||
When: July 2008
|
When: July 2008
|
||||||
Why: ACPI sysfs conversion should be finished by January 2008.
|
Why: ACPI sysfs conversion should be finished by January 2008.
|
||||||
|
|
|
@ -511,7 +511,6 @@ prototypes:
|
||||||
void (*open)(struct vm_area_struct*);
|
void (*open)(struct vm_area_struct*);
|
||||||
void (*close)(struct vm_area_struct*);
|
void (*close)(struct vm_area_struct*);
|
||||||
int (*fault)(struct vm_area_struct*, struct vm_fault *);
|
int (*fault)(struct vm_area_struct*, struct vm_fault *);
|
||||||
struct page *(*nopage)(struct vm_area_struct*, unsigned long, int *);
|
|
||||||
int (*page_mkwrite)(struct vm_area_struct *, struct page *);
|
int (*page_mkwrite)(struct vm_area_struct *, struct page *);
|
||||||
|
|
||||||
locking rules:
|
locking rules:
|
||||||
|
@ -519,7 +518,6 @@ locking rules:
|
||||||
open: no yes
|
open: no yes
|
||||||
close: no yes
|
close: no yes
|
||||||
fault: no yes
|
fault: no yes
|
||||||
nopage: no yes
|
|
||||||
page_mkwrite: no yes no
|
page_mkwrite: no yes no
|
||||||
|
|
||||||
->page_mkwrite() is called when a previously read-only page is
|
->page_mkwrite() is called when a previously read-only page is
|
||||||
|
@ -537,4 +535,3 @@ NULL.
|
||||||
|
|
||||||
ipc/shm.c::shm_delete() - may need BKL.
|
ipc/shm.c::shm_delete() - may need BKL.
|
||||||
->read() and ->write() in many drivers are (probably) missing BKL.
|
->read() and ->write() in many drivers are (probably) missing BKL.
|
||||||
drivers/sgi/char/graphics.c::sgi_graphics_nopage() - may need BKL.
|
|
||||||
|
|
|
@ -0,0 +1,256 @@
|
||||||
|
################################################################################
|
||||||
|
# #
|
||||||
|
# NFS/RDMA README #
|
||||||
|
# #
|
||||||
|
################################################################################
|
||||||
|
|
||||||
|
Author: NetApp and Open Grid Computing
|
||||||
|
Date: April 15, 2008
|
||||||
|
|
||||||
|
Table of Contents
|
||||||
|
~~~~~~~~~~~~~~~~~
|
||||||
|
- Overview
|
||||||
|
- Getting Help
|
||||||
|
- Installation
|
||||||
|
- Check RDMA and NFS Setup
|
||||||
|
- NFS/RDMA Setup
|
||||||
|
|
||||||
|
Overview
|
||||||
|
~~~~~~~~
|
||||||
|
|
||||||
|
This document describes how to install and setup the Linux NFS/RDMA client
|
||||||
|
and server software.
|
||||||
|
|
||||||
|
The NFS/RDMA client was first included in Linux 2.6.24. The NFS/RDMA server
|
||||||
|
was first included in the following release, Linux 2.6.25.
|
||||||
|
|
||||||
|
In our testing, we have obtained excellent performance results (full 10Gbit
|
||||||
|
wire bandwidth at minimal client CPU) under many workloads. The code passes
|
||||||
|
the full Connectathon test suite and operates over both Infiniband and iWARP
|
||||||
|
RDMA adapters.
|
||||||
|
|
||||||
|
Getting Help
|
||||||
|
~~~~~~~~~~~~
|
||||||
|
|
||||||
|
If you get stuck, you can ask questions on the
|
||||||
|
|
||||||
|
nfs-rdma-devel@lists.sourceforge.net
|
||||||
|
|
||||||
|
mailing list.
|
||||||
|
|
||||||
|
Installation
|
||||||
|
~~~~~~~~~~~~
|
||||||
|
|
||||||
|
These instructions are a step by step guide to building a machine for
|
||||||
|
use with NFS/RDMA.
|
||||||
|
|
||||||
|
- Install an RDMA device
|
||||||
|
|
||||||
|
Any device supported by the drivers in drivers/infiniband/hw is acceptable.
|
||||||
|
|
||||||
|
Testing has been performed using several Mellanox-based IB cards, the
|
||||||
|
Ammasso AMS1100 iWARP adapter, and the Chelsio cxgb3 iWARP adapter.
|
||||||
|
|
||||||
|
- Install a Linux distribution and tools
|
||||||
|
|
||||||
|
The first kernel release to contain both the NFS/RDMA client and server was
|
||||||
|
Linux 2.6.25 Therefore, a distribution compatible with this and subsequent
|
||||||
|
Linux kernel release should be installed.
|
||||||
|
|
||||||
|
The procedures described in this document have been tested with
|
||||||
|
distributions from Red Hat's Fedora Project (http://fedora.redhat.com/).
|
||||||
|
|
||||||
|
- Install nfs-utils-1.1.1 or greater on the client
|
||||||
|
|
||||||
|
An NFS/RDMA mount point can only be obtained by using the mount.nfs
|
||||||
|
command in nfs-utils-1.1.1 or greater. To see which version of mount.nfs
|
||||||
|
you are using, type:
|
||||||
|
|
||||||
|
> /sbin/mount.nfs -V
|
||||||
|
|
||||||
|
If the version is less than 1.1.1 or the command does not exist,
|
||||||
|
then you will need to install the latest version of nfs-utils.
|
||||||
|
|
||||||
|
Download the latest package from:
|
||||||
|
|
||||||
|
http://www.kernel.org/pub/linux/utils/nfs
|
||||||
|
|
||||||
|
Uncompress the package and follow the installation instructions.
|
||||||
|
|
||||||
|
If you will not be using GSS and NFSv4, the installation process
|
||||||
|
can be simplified by disabling these features when running configure:
|
||||||
|
|
||||||
|
> ./configure --disable-gss --disable-nfsv4
|
||||||
|
|
||||||
|
For more information on this see the package's README and INSTALL files.
|
||||||
|
|
||||||
|
After building the nfs-utils package, there will be a mount.nfs binary in
|
||||||
|
the utils/mount directory. This binary can be used to initiate NFS v2, v3,
|
||||||
|
or v4 mounts. To initiate a v4 mount, the binary must be called mount.nfs4.
|
||||||
|
The standard technique is to create a symlink called mount.nfs4 to mount.nfs.
|
||||||
|
|
||||||
|
NOTE: mount.nfs and therefore nfs-utils-1.1.1 or greater is only needed
|
||||||
|
on the NFS client machine. You do not need this specific version of
|
||||||
|
nfs-utils on the server. Furthermore, only the mount.nfs command from
|
||||||
|
nfs-utils-1.1.1 is needed on the client.
|
||||||
|
|
||||||
|
- Install a Linux kernel with NFS/RDMA
|
||||||
|
|
||||||
|
The NFS/RDMA client and server are both included in the mainline Linux
|
||||||
|
kernel version 2.6.25 and later. This and other versions of the 2.6 Linux
|
||||||
|
kernel can be found at:
|
||||||
|
|
||||||
|
ftp://ftp.kernel.org/pub/linux/kernel/v2.6/
|
||||||
|
|
||||||
|
Download the sources and place them in an appropriate location.
|
||||||
|
|
||||||
|
- Configure the RDMA stack
|
||||||
|
|
||||||
|
Make sure your kernel configuration has RDMA support enabled. Under
|
||||||
|
Device Drivers -> InfiniBand support, update the kernel configuration
|
||||||
|
to enable InfiniBand support [NOTE: the option name is misleading. Enabling
|
||||||
|
InfiniBand support is required for all RDMA devices (IB, iWARP, etc.)].
|
||||||
|
|
||||||
|
Enable the appropriate IB HCA support (mlx4, mthca, ehca, ipath, etc.) or
|
||||||
|
iWARP adapter support (amso, cxgb3, etc.).
|
||||||
|
|
||||||
|
If you are using InfiniBand, be sure to enable IP-over-InfiniBand support.
|
||||||
|
|
||||||
|
- Configure the NFS client and server
|
||||||
|
|
||||||
|
Your kernel configuration must also have NFS file system support and/or
|
||||||
|
NFS server support enabled. These and other NFS related configuration
|
||||||
|
options can be found under File Systems -> Network File Systems.
|
||||||
|
|
||||||
|
- Build, install, reboot
|
||||||
|
|
||||||
|
The NFS/RDMA code will be enabled automatically if NFS and RDMA
|
||||||
|
are turned on. The NFS/RDMA client and server are configured via the hidden
|
||||||
|
SUNRPC_XPRT_RDMA config option that depends on SUNRPC and INFINIBAND. The
|
||||||
|
value of SUNRPC_XPRT_RDMA will be:
|
||||||
|
|
||||||
|
- N if either SUNRPC or INFINIBAND are N, in this case the NFS/RDMA client
|
||||||
|
and server will not be built
|
||||||
|
- M if both SUNRPC and INFINIBAND are on (M or Y) and at least one is M,
|
||||||
|
in this case the NFS/RDMA client and server will be built as modules
|
||||||
|
- Y if both SUNRPC and INFINIBAND are Y, in this case the NFS/RDMA client
|
||||||
|
and server will be built into the kernel
|
||||||
|
|
||||||
|
Therefore, if you have followed the steps above and turned no NFS and RDMA,
|
||||||
|
the NFS/RDMA client and server will be built.
|
||||||
|
|
||||||
|
Build a new kernel, install it, boot it.
|
||||||
|
|
||||||
|
Check RDMA and NFS Setup
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Before configuring the NFS/RDMA software, it is a good idea to test
|
||||||
|
your new kernel to ensure that the kernel is working correctly.
|
||||||
|
In particular, it is a good idea to verify that the RDMA stack
|
||||||
|
is functioning as expected and standard NFS over TCP/IP and/or UDP/IP
|
||||||
|
is working properly.
|
||||||
|
|
||||||
|
- Check RDMA Setup
|
||||||
|
|
||||||
|
If you built the RDMA components as modules, load them at
|
||||||
|
this time. For example, if you are using a Mellanox Tavor/Sinai/Arbel
|
||||||
|
card:
|
||||||
|
|
||||||
|
> modprobe ib_mthca
|
||||||
|
> modprobe ib_ipoib
|
||||||
|
|
||||||
|
If you are using InfiniBand, make sure there is a Subnet Manager (SM)
|
||||||
|
running on the network. If your IB switch has an embedded SM, you can
|
||||||
|
use it. Otherwise, you will need to run an SM, such as OpenSM, on one
|
||||||
|
of your end nodes.
|
||||||
|
|
||||||
|
If an SM is running on your network, you should see the following:
|
||||||
|
|
||||||
|
> cat /sys/class/infiniband/driverX/ports/1/state
|
||||||
|
4: ACTIVE
|
||||||
|
|
||||||
|
where driverX is mthca0, ipath5, ehca3, etc.
|
||||||
|
|
||||||
|
To further test the InfiniBand software stack, use IPoIB (this
|
||||||
|
assumes you have two IB hosts named host1 and host2):
|
||||||
|
|
||||||
|
host1> ifconfig ib0 a.b.c.x
|
||||||
|
host2> ifconfig ib0 a.b.c.y
|
||||||
|
host1> ping a.b.c.y
|
||||||
|
host2> ping a.b.c.x
|
||||||
|
|
||||||
|
For other device types, follow the appropriate procedures.
|
||||||
|
|
||||||
|
- Check NFS Setup
|
||||||
|
|
||||||
|
For the NFS components enabled above (client and/or server),
|
||||||
|
test their functionality over standard Ethernet using TCP/IP or UDP/IP.
|
||||||
|
|
||||||
|
NFS/RDMA Setup
|
||||||
|
~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
We recommend that you use two machines, one to act as the client and
|
||||||
|
one to act as the server.
|
||||||
|
|
||||||
|
One time configuration:
|
||||||
|
|
||||||
|
- On the server system, configure the /etc/exports file and
|
||||||
|
start the NFS/RDMA server.
|
||||||
|
|
||||||
|
Exports entries with the following formats have been tested:
|
||||||
|
|
||||||
|
/vol0 192.168.0.47(fsid=0,rw,async,insecure,no_root_squash)
|
||||||
|
/vol0 192.168.0.0/255.255.255.0(fsid=0,rw,async,insecure,no_root_squash)
|
||||||
|
|
||||||
|
The IP address(es) is(are) the client's IPoIB address for an InfiniBand HCA or the
|
||||||
|
cleint's iWARP address(es) for an RNIC.
|
||||||
|
|
||||||
|
NOTE: The "insecure" option must be used because the NFS/RDMA client does not
|
||||||
|
use a reserved port.
|
||||||
|
|
||||||
|
Each time a machine boots:
|
||||||
|
|
||||||
|
- Load and configure the RDMA drivers
|
||||||
|
|
||||||
|
For InfiniBand using a Mellanox adapter:
|
||||||
|
|
||||||
|
> modprobe ib_mthca
|
||||||
|
> modprobe ib_ipoib
|
||||||
|
> ifconfig ib0 a.b.c.d
|
||||||
|
|
||||||
|
NOTE: use unique addresses for the client and server
|
||||||
|
|
||||||
|
- Start the NFS server
|
||||||
|
|
||||||
|
If the NFS/RDMA server was built as a module (CONFIG_SUNRPC_XPRT_RDMA=m in kernel config),
|
||||||
|
load the RDMA transport module:
|
||||||
|
|
||||||
|
> modprobe svcrdma
|
||||||
|
|
||||||
|
Regardless of how the server was built (module or built-in), start the server:
|
||||||
|
|
||||||
|
> /etc/init.d/nfs start
|
||||||
|
|
||||||
|
or
|
||||||
|
|
||||||
|
> service nfs start
|
||||||
|
|
||||||
|
Instruct the server to listen on the RDMA transport:
|
||||||
|
|
||||||
|
> echo rdma 2050 > /proc/fs/nfsd/portlist
|
||||||
|
|
||||||
|
- On the client system
|
||||||
|
|
||||||
|
If the NFS/RDMA client was built as a module (CONFIG_SUNRPC_XPRT_RDMA=m in kernel config),
|
||||||
|
load the RDMA client module:
|
||||||
|
|
||||||
|
> modprobe xprtrdma.ko
|
||||||
|
|
||||||
|
Regardless of how the client was built (module or built-in), issue the mount.nfs command:
|
||||||
|
|
||||||
|
> /path/to/your/mount.nfs <IPoIB-server-name-or-address>:/<export> /mnt -i -o rdma,port=2050
|
||||||
|
|
||||||
|
To verify that the mount is using RDMA, run "cat /proc/mounts" and check the
|
||||||
|
"proto" field for the given mount.
|
||||||
|
|
||||||
|
Congratulations! You're using NFS/RDMA!
|
|
@ -43,6 +43,7 @@ Table of Contents
|
||||||
2.13 /proc/<pid>/oom_score - Display current oom-killer score
|
2.13 /proc/<pid>/oom_score - Display current oom-killer score
|
||||||
2.14 /proc/<pid>/io - Display the IO accounting fields
|
2.14 /proc/<pid>/io - Display the IO accounting fields
|
||||||
2.15 /proc/<pid>/coredump_filter - Core dump filtering settings
|
2.15 /proc/<pid>/coredump_filter - Core dump filtering settings
|
||||||
|
2.16 /proc/<pid>/mountinfo - Information about mounts
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
Preface
|
Preface
|
||||||
|
@ -462,11 +463,17 @@ SwapTotal: 0 kB
|
||||||
SwapFree: 0 kB
|
SwapFree: 0 kB
|
||||||
Dirty: 968 kB
|
Dirty: 968 kB
|
||||||
Writeback: 0 kB
|
Writeback: 0 kB
|
||||||
|
AnonPages: 861800 kB
|
||||||
Mapped: 280372 kB
|
Mapped: 280372 kB
|
||||||
Slab: 684068 kB
|
Slab: 284364 kB
|
||||||
|
SReclaimable: 159856 kB
|
||||||
|
SUnreclaim: 124508 kB
|
||||||
|
PageTables: 24448 kB
|
||||||
|
NFS_Unstable: 0 kB
|
||||||
|
Bounce: 0 kB
|
||||||
|
WritebackTmp: 0 kB
|
||||||
CommitLimit: 7669796 kB
|
CommitLimit: 7669796 kB
|
||||||
Committed_AS: 100056 kB
|
Committed_AS: 100056 kB
|
||||||
PageTables: 24448 kB
|
|
||||||
VmallocTotal: 112216 kB
|
VmallocTotal: 112216 kB
|
||||||
VmallocUsed: 428 kB
|
VmallocUsed: 428 kB
|
||||||
VmallocChunk: 111088 kB
|
VmallocChunk: 111088 kB
|
||||||
|
@ -502,8 +509,17 @@ VmallocChunk: 111088 kB
|
||||||
on the disk
|
on the disk
|
||||||
Dirty: Memory which is waiting to get written back to the disk
|
Dirty: Memory which is waiting to get written back to the disk
|
||||||
Writeback: Memory which is actively being written back to the disk
|
Writeback: Memory which is actively being written back to the disk
|
||||||
|
AnonPages: Non-file backed pages mapped into userspace page tables
|
||||||
Mapped: files which have been mmaped, such as libraries
|
Mapped: files which have been mmaped, such as libraries
|
||||||
Slab: in-kernel data structures cache
|
Slab: in-kernel data structures cache
|
||||||
|
SReclaimable: Part of Slab, that might be reclaimed, such as caches
|
||||||
|
SUnreclaim: Part of Slab, that cannot be reclaimed on memory pressure
|
||||||
|
PageTables: amount of memory dedicated to the lowest level of page
|
||||||
|
tables.
|
||||||
|
NFS_Unstable: NFS pages sent to the server, but not yet committed to stable
|
||||||
|
storage
|
||||||
|
Bounce: Memory used for block device "bounce buffers"
|
||||||
|
WritebackTmp: Memory used by FUSE for temporary writeback buffers
|
||||||
CommitLimit: Based on the overcommit ratio ('vm.overcommit_ratio'),
|
CommitLimit: Based on the overcommit ratio ('vm.overcommit_ratio'),
|
||||||
this is the total amount of memory currently available to
|
this is the total amount of memory currently available to
|
||||||
be allocated on the system. This limit is only adhered to
|
be allocated on the system. This limit is only adhered to
|
||||||
|
@ -530,8 +546,6 @@ Committed_AS: The amount of memory presently allocated on the system.
|
||||||
above) will not be permitted. This is useful if one needs
|
above) will not be permitted. This is useful if one needs
|
||||||
to guarantee that processes will not fail due to lack of
|
to guarantee that processes will not fail due to lack of
|
||||||
memory once that memory has been successfully allocated.
|
memory once that memory has been successfully allocated.
|
||||||
PageTables: amount of memory dedicated to the lowest level of page
|
|
||||||
tables.
|
|
||||||
VmallocTotal: total size of vmalloc memory area
|
VmallocTotal: total size of vmalloc memory area
|
||||||
VmallocUsed: amount of vmalloc area which is used
|
VmallocUsed: amount of vmalloc area which is used
|
||||||
VmallocChunk: largest contigious block of vmalloc area which is free
|
VmallocChunk: largest contigious block of vmalloc area which is free
|
||||||
|
@ -2348,4 +2362,41 @@ For example:
|
||||||
$ echo 0x7 > /proc/self/coredump_filter
|
$ echo 0x7 > /proc/self/coredump_filter
|
||||||
$ ./some_program
|
$ ./some_program
|
||||||
|
|
||||||
|
2.16 /proc/<pid>/mountinfo - Information about mounts
|
||||||
|
--------------------------------------------------------
|
||||||
|
|
||||||
|
This file contains lines of the form:
|
||||||
|
|
||||||
|
36 35 98:0 /mnt1 /mnt2 rw,noatime master:1 - ext3 /dev/root rw,errors=continue
|
||||||
|
(1)(2)(3) (4) (5) (6) (7) (8) (9) (10) (11)
|
||||||
|
|
||||||
|
(1) mount ID: unique identifier of the mount (may be reused after umount)
|
||||||
|
(2) parent ID: ID of parent (or of self for the top of the mount tree)
|
||||||
|
(3) major:minor: value of st_dev for files on filesystem
|
||||||
|
(4) root: root of the mount within the filesystem
|
||||||
|
(5) mount point: mount point relative to the process's root
|
||||||
|
(6) mount options: per mount options
|
||||||
|
(7) optional fields: zero or more fields of the form "tag[:value]"
|
||||||
|
(8) separator: marks the end of the optional fields
|
||||||
|
(9) filesystem type: name of filesystem of the form "type[.subtype]"
|
||||||
|
(10) mount source: filesystem specific information or "none"
|
||||||
|
(11) super options: per super block options
|
||||||
|
|
||||||
|
Parsers should ignore all unrecognised optional fields. Currently the
|
||||||
|
possible optional fields are:
|
||||||
|
|
||||||
|
shared:X mount is shared in peer group X
|
||||||
|
master:X mount is slave to peer group X
|
||||||
|
propagate_from:X mount is slave and receives propagation from peer group X (*)
|
||||||
|
unbindable mount is unbindable
|
||||||
|
|
||||||
|
(*) X is the closest dominant peer group under the process's root. If
|
||||||
|
X is the immediate master of the mount, or if there's no dominant peer
|
||||||
|
group under the same root, then only the "master:X" field is present
|
||||||
|
and not the "propagate_from:X" field.
|
||||||
|
|
||||||
|
For more information on mount propagation see:
|
||||||
|
|
||||||
|
Documentation/filesystems/sharedsubtree.txt
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
|
|
|
@ -122,8 +122,7 @@ stop() is the place to free it.
|
||||||
}
|
}
|
||||||
|
|
||||||
Finally, the show() function should format the object currently pointed to
|
Finally, the show() function should format the object currently pointed to
|
||||||
by the iterator for output. It should return zero, or an error code if
|
by the iterator for output. The example module's show() function is:
|
||||||
something goes wrong. The example module's show() function is:
|
|
||||||
|
|
||||||
static int ct_seq_show(struct seq_file *s, void *v)
|
static int ct_seq_show(struct seq_file *s, void *v)
|
||||||
{
|
{
|
||||||
|
@ -132,6 +131,12 @@ something goes wrong. The example module's show() function is:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
If all is well, the show() function should return zero. A negative error
|
||||||
|
code in the usual manner indicates that something went wrong; it will be
|
||||||
|
passed back to user space. This function can also return SEQ_SKIP, which
|
||||||
|
causes the current item to be skipped; if the show() function has already
|
||||||
|
generated output before returning SEQ_SKIP, that output will be dropped.
|
||||||
|
|
||||||
We will look at seq_printf() in a moment. But first, the definition of the
|
We will look at seq_printf() in a moment. But first, the definition of the
|
||||||
seq_file iterator is finished by creating a seq_operations structure with
|
seq_file iterator is finished by creating a seq_operations structure with
|
||||||
the four functions we have just defined:
|
the four functions we have just defined:
|
||||||
|
@ -182,12 +187,18 @@ The first two output a single character and a string, just like one would
|
||||||
expect. seq_escape() is like seq_puts(), except that any character in s
|
expect. seq_escape() is like seq_puts(), except that any character in s
|
||||||
which is in the string esc will be represented in octal form in the output.
|
which is in the string esc will be represented in octal form in the output.
|
||||||
|
|
||||||
There is also a function for printing filenames:
|
There is also a pair of functions for printing filenames:
|
||||||
|
|
||||||
int seq_path(struct seq_file *m, struct path *path, char *esc);
|
int seq_path(struct seq_file *m, struct path *path, char *esc);
|
||||||
|
int seq_path_root(struct seq_file *m, struct path *path,
|
||||||
|
struct path *root, char *esc)
|
||||||
|
|
||||||
Here, path indicates the file of interest, and esc is a set of characters
|
Here, path indicates the file of interest, and esc is a set of characters
|
||||||
which should be escaped in the output.
|
which should be escaped in the output. A call to seq_path() will output
|
||||||
|
the path relative to the current process's filesystem root. If a different
|
||||||
|
root is desired, it can be used with seq_path_root(). Note that, if it
|
||||||
|
turns out that path cannot be reached from root, the value of root will be
|
||||||
|
changed in seq_file_root() to a root which *does* work.
|
||||||
|
|
||||||
|
|
||||||
Making it all work
|
Making it all work
|
||||||
|
|
|
@ -92,6 +92,18 @@ NodeList format is a comma-separated list of decimal numbers and ranges,
|
||||||
a range being two hyphen-separated decimal numbers, the smallest and
|
a range being two hyphen-separated decimal numbers, the smallest and
|
||||||
largest node numbers in the range. For example, mpol=bind:0-3,5,7,9-15
|
largest node numbers in the range. For example, mpol=bind:0-3,5,7,9-15
|
||||||
|
|
||||||
|
NUMA memory allocation policies have optional flags that can be used in
|
||||||
|
conjunction with their modes. These optional flags can be specified
|
||||||
|
when tmpfs is mounted by appending them to the mode before the NodeList.
|
||||||
|
See Documentation/vm/numa_memory_policy.txt for a list of all available
|
||||||
|
memory allocation policy mode flags.
|
||||||
|
|
||||||
|
=static is equivalent to MPOL_F_STATIC_NODES
|
||||||
|
=relative is equivalent to MPOL_F_RELATIVE_NODES
|
||||||
|
|
||||||
|
For example, mpol=bind=static:NodeList, is the equivalent of an
|
||||||
|
allocation policy of MPOL_BIND | MPOL_F_STATIC_NODES.
|
||||||
|
|
||||||
Note that trying to mount a tmpfs with an mpol option will fail if the
|
Note that trying to mount a tmpfs with an mpol option will fail if the
|
||||||
running kernel does not support NUMA; and will fail if its nodelist
|
running kernel does not support NUMA; and will fail if its nodelist
|
||||||
specifies a node which is not online. If your system relies on that
|
specifies a node which is not online. If your system relies on that
|
||||||
|
|
|
@ -17,6 +17,21 @@ dmask=### -- The permission mask for the directory.
|
||||||
fmask=### -- The permission mask for files.
|
fmask=### -- The permission mask for files.
|
||||||
The default is the umask of current process.
|
The default is the umask of current process.
|
||||||
|
|
||||||
|
allow_utime=### -- This option controls the permission check of mtime/atime.
|
||||||
|
|
||||||
|
20 - If current process is in group of file's group ID,
|
||||||
|
you can change timestamp.
|
||||||
|
2 - Other users can change timestamp.
|
||||||
|
|
||||||
|
The default is set from `dmask' option. (If the directory is
|
||||||
|
writable, utime(2) is also allowed. I.e. ~dmask & 022)
|
||||||
|
|
||||||
|
Normally utime(2) checks current process is owner of
|
||||||
|
the file, or it has CAP_FOWNER capability. But FAT
|
||||||
|
filesystem doesn't have uid/gid on disk, so normal
|
||||||
|
check is too unflexible. With this option you can
|
||||||
|
relax it.
|
||||||
|
|
||||||
codepage=### -- Sets the codepage number for converting to shortname
|
codepage=### -- Sets the codepage number for converting to shortname
|
||||||
characters on FAT filesystem.
|
characters on FAT filesystem.
|
||||||
By default, FAT_DEFAULT_CODEPAGE setting is used.
|
By default, FAT_DEFAULT_CODEPAGE setting is used.
|
||||||
|
|
|
@ -107,6 +107,16 @@ type of GPIO controller, and on one particular board 80-95 with an FPGA.
|
||||||
The numbers need not be contiguous; either of those platforms could also
|
The numbers need not be contiguous; either of those platforms could also
|
||||||
use numbers 2000-2063 to identify GPIOs in a bank of I2C GPIO expanders.
|
use numbers 2000-2063 to identify GPIOs in a bank of I2C GPIO expanders.
|
||||||
|
|
||||||
|
If you want to initialize a structure with an invalid GPIO number, use
|
||||||
|
some negative number (perhaps "-EINVAL"); that will never be valid. To
|
||||||
|
test if a number could reference a GPIO, you may use this predicate:
|
||||||
|
|
||||||
|
int gpio_is_valid(int number);
|
||||||
|
|
||||||
|
A number that's not valid will be rejected by calls which may request
|
||||||
|
or free GPIOs (see below). Other numbers may also be rejected; for
|
||||||
|
example, a number might be valid but unused on a given board.
|
||||||
|
|
||||||
Whether a platform supports multiple GPIO controllers is currently a
|
Whether a platform supports multiple GPIO controllers is currently a
|
||||||
platform-specific implementation issue.
|
platform-specific implementation issue.
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,8 @@ Known Issues
|
||||||
------------
|
------------
|
||||||
|
|
||||||
On some systems (Asus), the BIOS is known to interfere with the driver
|
On some systems (Asus), the BIOS is known to interfere with the driver
|
||||||
and cause read errors. The driver will retry a given number of times
|
and cause read errors. Or maybe the W83L785TS-S chip is simply unreliable,
|
||||||
|
we don't really know. The driver will retry a given number of times
|
||||||
(5 by default) and then give up, returning the old value (or 0 if
|
(5 by default) and then give up, returning the old value (or 0 if
|
||||||
there is no old value). It seems to work well enough so that you should
|
there is no old value). It seems to work well enough so that you should
|
||||||
not notice anything. Thanks to James Bolt for helping test this feature.
|
not notice anything. Thanks to James Bolt for helping test this feature.
|
||||||
|
|
|
@ -164,7 +164,8 @@ I2C device drivers using this binding model work just like any other
|
||||||
kind of driver in Linux: they provide a probe() method to bind to
|
kind of driver in Linux: they provide a probe() method to bind to
|
||||||
those devices, and a remove() method to unbind.
|
those devices, and a remove() method to unbind.
|
||||||
|
|
||||||
static int foo_probe(struct i2c_client *client);
|
static int foo_probe(struct i2c_client *client,
|
||||||
|
const struct i2c_device_id *id);
|
||||||
static int foo_remove(struct i2c_client *client);
|
static int foo_remove(struct i2c_client *client);
|
||||||
|
|
||||||
Remember that the i2c_driver does not create those client handles. The
|
Remember that the i2c_driver does not create those client handles. The
|
||||||
|
|
|
@ -40,8 +40,18 @@ Protocol 2.05: (Kernel 2.6.20) Make protected mode kernel relocatable.
|
||||||
Introduce relocatable_kernel and kernel_alignment fields.
|
Introduce relocatable_kernel and kernel_alignment fields.
|
||||||
|
|
||||||
Protocol 2.06: (Kernel 2.6.22) Added a field that contains the size of
|
Protocol 2.06: (Kernel 2.6.22) Added a field that contains the size of
|
||||||
the boot command line
|
the boot command line.
|
||||||
|
|
||||||
|
Protocol 2.07: (Kernel 2.6.24) Added paravirtualised boot protocol.
|
||||||
|
Introduced hardware_subarch and hardware_subarch_data
|
||||||
|
and KEEP_SEGMENTS flag in load_flags.
|
||||||
|
|
||||||
|
Protocol 2.08: (Kernel 2.6.26) Added crc32 checksum and ELF format
|
||||||
|
payload. Introduced payload_offset and payload length
|
||||||
|
fields to aid in locating the payload.
|
||||||
|
|
||||||
|
Protocol 2.09: (Kernel 2.6.26) Added a field of 64-bit physical
|
||||||
|
pointer to single linked list of struct setup_data.
|
||||||
|
|
||||||
**** MEMORY LAYOUT
|
**** MEMORY LAYOUT
|
||||||
|
|
||||||
|
@ -172,6 +182,8 @@ Offset Proto Name Meaning
|
||||||
0240/8 2.07+ hardware_subarch_data Subarchitecture-specific data
|
0240/8 2.07+ hardware_subarch_data Subarchitecture-specific data
|
||||||
0248/4 2.08+ payload_offset Offset of kernel payload
|
0248/4 2.08+ payload_offset Offset of kernel payload
|
||||||
024C/4 2.08+ payload_length Length of kernel payload
|
024C/4 2.08+ payload_length Length of kernel payload
|
||||||
|
0250/8 2.09+ setup_data 64-bit physical pointer to linked list
|
||||||
|
of struct setup_data
|
||||||
|
|
||||||
(1) For backwards compatibility, if the setup_sects field contains 0, the
|
(1) For backwards compatibility, if the setup_sects field contains 0, the
|
||||||
real value is 4.
|
real value is 4.
|
||||||
|
@ -572,6 +584,28 @@ command line is entered using the following protocol:
|
||||||
covered by setup_move_size, so you may need to adjust this
|
covered by setup_move_size, so you may need to adjust this
|
||||||
field.
|
field.
|
||||||
|
|
||||||
|
Field name: setup_data
|
||||||
|
Type: write (obligatory)
|
||||||
|
Offset/size: 0x250/8
|
||||||
|
Protocol: 2.09+
|
||||||
|
|
||||||
|
The 64-bit physical pointer to NULL terminated single linked list of
|
||||||
|
struct setup_data. This is used to define a more extensible boot
|
||||||
|
parameters passing mechanism. The definition of struct setup_data is
|
||||||
|
as follow:
|
||||||
|
|
||||||
|
struct setup_data {
|
||||||
|
u64 next;
|
||||||
|
u32 type;
|
||||||
|
u32 len;
|
||||||
|
u8 data[0];
|
||||||
|
};
|
||||||
|
|
||||||
|
Where, the next is a 64-bit physical pointer to the next node of
|
||||||
|
linked list, the next field of the last node is 0; the type is used
|
||||||
|
to identify the contents of data; the len is the length of data
|
||||||
|
field; the data holds the real payload.
|
||||||
|
|
||||||
|
|
||||||
**** MEMORY LAYOUT OF THE REAL-MODE CODE
|
**** MEMORY LAYOUT OF THE REAL-MODE CODE
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,82 @@
|
||||||
|
Currently, kvm module in EXPERIMENTAL stage on IA64. This means that
|
||||||
|
interfaces are not stable enough to use. So, plase had better don't run
|
||||||
|
critical applications in virtual machine. We will try our best to make it
|
||||||
|
strong in future versions!
|
||||||
|
Guide: How to boot up guests on kvm/ia64
|
||||||
|
|
||||||
|
This guide is to describe how to enable kvm support for IA-64 systems.
|
||||||
|
|
||||||
|
1. Get the kvm source from git.kernel.org.
|
||||||
|
Userspace source:
|
||||||
|
git clone git://git.kernel.org/pub/scm/virt/kvm/kvm-userspace.git
|
||||||
|
Kernel Source:
|
||||||
|
git clone git://git.kernel.org/pub/scm/linux/kernel/git/xiantao/kvm-ia64.git
|
||||||
|
|
||||||
|
2. Compile the source code.
|
||||||
|
2.1 Compile userspace code:
|
||||||
|
(1)cd ./kvm-userspace
|
||||||
|
(2)./configure
|
||||||
|
(3)cd kernel
|
||||||
|
(4)make sync LINUX= $kernel_dir (kernel_dir is the directory of kernel source.)
|
||||||
|
(5)cd ..
|
||||||
|
(6)make qemu
|
||||||
|
(7)cd qemu; make install
|
||||||
|
|
||||||
|
2.2 Compile kernel source code:
|
||||||
|
(1) cd ./$kernel_dir
|
||||||
|
(2) Make menuconfig
|
||||||
|
(3) Enter into virtualization option, and choose kvm.
|
||||||
|
(4) make
|
||||||
|
(5) Once (4) done, make modules_install
|
||||||
|
(6) Make initrd, and use new kernel to reboot up host machine.
|
||||||
|
(7) Once (6) done, cd $kernel_dir/arch/ia64/kvm
|
||||||
|
(8) insmod kvm.ko; insmod kvm-intel.ko
|
||||||
|
|
||||||
|
Note: For step 2, please make sure that host page size == TARGET_PAGE_SIZE of qemu, otherwise, may fail.
|
||||||
|
|
||||||
|
3. Get Guest Firmware named as Flash.fd, and put it under right place:
|
||||||
|
(1) If you have the guest firmware (binary) released by Intel Corp for Xen, use it directly.
|
||||||
|
|
||||||
|
(2) If you have no firmware at hand, Please download its source from
|
||||||
|
hg clone http://xenbits.xensource.com/ext/efi-vfirmware.hg
|
||||||
|
you can get the firmware's binary in the directory of efi-vfirmware.hg/binaries.
|
||||||
|
|
||||||
|
(3) Rename the firware you owned to Flash.fd, and copy it to /usr/local/share/qemu
|
||||||
|
|
||||||
|
4. Boot up Linux or Windows guests:
|
||||||
|
4.1 Create or install a image for guest boot. If you have xen experience, it should be easy.
|
||||||
|
|
||||||
|
4.2 Boot up guests use the following command.
|
||||||
|
/usr/local/bin/qemu-system-ia64 -smp xx -m 512 -hda $your_image
|
||||||
|
(xx is the number of virtual processors for the guest, now the maximum value is 4)
|
||||||
|
|
||||||
|
5. Known possibile issue on some platforms with old Firmware.
|
||||||
|
|
||||||
|
If meet strange host crashe issues, try to solve it through either of the following ways:
|
||||||
|
|
||||||
|
(1): Upgrade your Firmware to the latest one.
|
||||||
|
|
||||||
|
(2): Applying the below patch to kernel source.
|
||||||
|
diff --git a/arch/ia64/kernel/pal.S b/arch/ia64/kernel/pal.S
|
||||||
|
index 0b53344..f02b0f7 100644
|
||||||
|
--- a/arch/ia64/kernel/pal.S
|
||||||
|
+++ b/arch/ia64/kernel/pal.S
|
||||||
|
@@ -84,7 +84,8 @@ GLOBAL_ENTRY(ia64_pal_call_static)
|
||||||
|
mov ar.pfs = loc1
|
||||||
|
mov rp = loc0
|
||||||
|
;;
|
||||||
|
- srlz.d // seralize restoration of psr.l
|
||||||
|
+ srlz.i // seralize restoration of psr.l
|
||||||
|
+ ;;
|
||||||
|
br.ret.sptk.many b0
|
||||||
|
END(ia64_pal_call_static)
|
||||||
|
|
||||||
|
6. Bug report:
|
||||||
|
If you found any issues when use kvm/ia64, Please post the bug info to kvm-ia64-devel mailing list.
|
||||||
|
https://lists.sourceforge.net/lists/listinfo/kvm-ia64-devel/
|
||||||
|
|
||||||
|
Thanks for your interest! Let's work together, and make kvm/ia64 stronger and stronger!
|
||||||
|
|
||||||
|
|
||||||
|
Xiantao Zhang <xiantao.zhang@intel.com>
|
||||||
|
2008.3.10
|
|
@ -1,146 +1,65 @@
|
||||||
/*
|
IDE ATAPI streaming tape driver.
|
||||||
* IDE ATAPI streaming tape driver.
|
|
||||||
*
|
This driver is a part of the Linux ide driver.
|
||||||
* This driver is a part of the Linux ide driver.
|
|
||||||
*
|
The driver, in co-operation with ide.c, basically traverses the
|
||||||
* The driver, in co-operation with ide.c, basically traverses the
|
request-list for the block device interface. The character device
|
||||||
* request-list for the block device interface. The character device
|
interface, on the other hand, creates new requests, adds them
|
||||||
* interface, on the other hand, creates new requests, adds them
|
to the request-list of the block device, and waits for their completion.
|
||||||
* to the request-list of the block device, and waits for their completion.
|
|
||||||
*
|
The block device major and minor numbers are determined from the
|
||||||
* Pipelined operation mode is now supported on both reads and writes.
|
tape's relative position in the ide interfaces, as explained in ide.c.
|
||||||
*
|
|
||||||
* The block device major and minor numbers are determined from the
|
The character device interface consists of the following devices:
|
||||||
* tape's relative position in the ide interfaces, as explained in ide.c.
|
|
||||||
*
|
ht0 major 37, minor 0 first IDE tape, rewind on close.
|
||||||
* The character device interface consists of the following devices:
|
ht1 major 37, minor 1 second IDE tape, rewind on close.
|
||||||
*
|
...
|
||||||
* ht0 major 37, minor 0 first IDE tape, rewind on close.
|
nht0 major 37, minor 128 first IDE tape, no rewind on close.
|
||||||
* ht1 major 37, minor 1 second IDE tape, rewind on close.
|
nht1 major 37, minor 129 second IDE tape, no rewind on close.
|
||||||
* ...
|
...
|
||||||
* nht0 major 37, minor 128 first IDE tape, no rewind on close.
|
|
||||||
* nht1 major 37, minor 129 second IDE tape, no rewind on close.
|
The general magnetic tape commands compatible interface, as defined by
|
||||||
* ...
|
include/linux/mtio.h, is accessible through the character device.
|
||||||
*
|
|
||||||
* The general magnetic tape commands compatible interface, as defined by
|
General ide driver configuration options, such as the interrupt-unmask
|
||||||
* include/linux/mtio.h, is accessible through the character device.
|
flag, can be configured by issuing an ioctl to the block device interface,
|
||||||
*
|
as any other ide device.
|
||||||
* General ide driver configuration options, such as the interrupt-unmask
|
|
||||||
* flag, can be configured by issuing an ioctl to the block device interface,
|
Our own ide-tape ioctl's can be issued to either the block device or
|
||||||
* as any other ide device.
|
the character device interface.
|
||||||
*
|
|
||||||
* Our own ide-tape ioctl's can be issued to either the block device or
|
Maximal throughput with minimal bus load will usually be achieved in the
|
||||||
* the character device interface.
|
following scenario:
|
||||||
*
|
|
||||||
* Maximal throughput with minimal bus load will usually be achieved in the
|
1. ide-tape is operating in the pipelined operation mode.
|
||||||
* following scenario:
|
2. No buffering is performed by the user backup program.
|
||||||
*
|
|
||||||
* 1. ide-tape is operating in the pipelined operation mode.
|
Testing was done with a 2 GB CONNER CTMA 4000 IDE ATAPI Streaming Tape Drive.
|
||||||
* 2. No buffering is performed by the user backup program.
|
|
||||||
*
|
Here are some words from the first releases of hd.c, which are quoted
|
||||||
* Testing was done with a 2 GB CONNER CTMA 4000 IDE ATAPI Streaming Tape Drive.
|
in ide.c and apply here as well:
|
||||||
*
|
|
||||||
* Here are some words from the first releases of hd.c, which are quoted
|
| Special care is recommended. Have Fun!
|
||||||
* in ide.c and apply here as well:
|
|
||||||
*
|
Possible improvements:
|
||||||
* | Special care is recommended. Have Fun!
|
|
||||||
*
|
1. Support for the ATAPI overlap protocol.
|
||||||
*
|
|
||||||
* An overview of the pipelined operation mode.
|
In order to maximize bus throughput, we currently use the DSC
|
||||||
*
|
overlap method which enables ide.c to service requests from the
|
||||||
* In the pipelined write mode, we will usually just add requests to our
|
other device while the tape is busy executing a command. The
|
||||||
* pipeline and return immediately, before we even start to service them. The
|
DSC overlap method involves polling the tape's status register
|
||||||
* user program will then have enough time to prepare the next request while
|
for the DSC bit, and servicing the other device while the tape
|
||||||
* we are still busy servicing previous requests. In the pipelined read mode,
|
isn't ready.
|
||||||
* the situation is similar - we add read-ahead requests into the pipeline,
|
|
||||||
* before the user even requested them.
|
In the current QIC development standard (December 1995),
|
||||||
*
|
it is recommended that new tape drives will *in addition*
|
||||||
* The pipeline can be viewed as a "safety net" which will be activated when
|
implement the ATAPI overlap protocol, which is used for the
|
||||||
* the system load is high and prevents the user backup program from keeping up
|
same purpose - efficient use of the IDE bus, but is interrupt
|
||||||
* with the current tape speed. At this point, the pipeline will get
|
driven and thus has much less CPU overhead.
|
||||||
* shorter and shorter but the tape will still be streaming at the same speed.
|
|
||||||
* Assuming we have enough pipeline stages, the system load will hopefully
|
ATAPI overlap is likely to be supported in most new ATAPI
|
||||||
* decrease before the pipeline is completely empty, and the backup program
|
devices, including new ATAPI cdroms, and thus provides us
|
||||||
* will be able to "catch up" and refill the pipeline again.
|
a method by which we can achieve higher throughput when
|
||||||
*
|
sharing a (fast) ATA-2 disk with any (slow) new ATAPI device.
|
||||||
* When using the pipelined mode, it would be best to disable any type of
|
|
||||||
* buffering done by the user program, as ide-tape already provides all the
|
|
||||||
* benefits in the kernel, where it can be done in a more efficient way.
|
|
||||||
* As we will usually not block the user program on a request, the most
|
|
||||||
* efficient user code will then be a simple read-write-read-... cycle.
|
|
||||||
* Any additional logic will usually just slow down the backup process.
|
|
||||||
*
|
|
||||||
* Using the pipelined mode, I get a constant over 400 KBps throughput,
|
|
||||||
* which seems to be the maximum throughput supported by my tape.
|
|
||||||
*
|
|
||||||
* However, there are some downfalls:
|
|
||||||
*
|
|
||||||
* 1. We use memory (for data buffers) in proportional to the number
|
|
||||||
* of pipeline stages (each stage is about 26 KB with my tape).
|
|
||||||
* 2. In the pipelined write mode, we cheat and postpone error codes
|
|
||||||
* to the user task. In read mode, the actual tape position
|
|
||||||
* will be a bit further than the last requested block.
|
|
||||||
*
|
|
||||||
* Concerning (1):
|
|
||||||
*
|
|
||||||
* 1. We allocate stages dynamically only when we need them. When
|
|
||||||
* we don't need them, we don't consume additional memory. In
|
|
||||||
* case we can't allocate stages, we just manage without them
|
|
||||||
* (at the expense of decreased throughput) so when Linux is
|
|
||||||
* tight in memory, we will not pose additional difficulties.
|
|
||||||
*
|
|
||||||
* 2. The maximum number of stages (which is, in fact, the maximum
|
|
||||||
* amount of memory) which we allocate is limited by the compile
|
|
||||||
* time parameter IDETAPE_MAX_PIPELINE_STAGES.
|
|
||||||
*
|
|
||||||
* 3. The maximum number of stages is a controlled parameter - We
|
|
||||||
* don't start from the user defined maximum number of stages
|
|
||||||
* but from the lower IDETAPE_MIN_PIPELINE_STAGES (again, we
|
|
||||||
* will not even allocate this amount of stages if the user
|
|
||||||
* program can't handle the speed). We then implement a feedback
|
|
||||||
* loop which checks if the pipeline is empty, and if it is, we
|
|
||||||
* increase the maximum number of stages as necessary until we
|
|
||||||
* reach the optimum value which just manages to keep the tape
|
|
||||||
* busy with minimum allocated memory or until we reach
|
|
||||||
* IDETAPE_MAX_PIPELINE_STAGES.
|
|
||||||
*
|
|
||||||
* Concerning (2):
|
|
||||||
*
|
|
||||||
* In pipelined write mode, ide-tape can not return accurate error codes
|
|
||||||
* to the user program since we usually just add the request to the
|
|
||||||
* pipeline without waiting for it to be serviced. In case an error
|
|
||||||
* occurs, I will report it on the next user request.
|
|
||||||
*
|
|
||||||
* In the pipelined read mode, subsequent read requests or forward
|
|
||||||
* filemark spacing will perform correctly, as we preserve all blocks
|
|
||||||
* and filemarks which we encountered during our excess read-ahead.
|
|
||||||
*
|
|
||||||
* For accurate tape positioning and error reporting, disabling
|
|
||||||
* pipelined mode might be the best option.
|
|
||||||
*
|
|
||||||
* You can enable/disable/tune the pipelined operation mode by adjusting
|
|
||||||
* the compile time parameters below.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* Possible improvements.
|
|
||||||
*
|
|
||||||
* 1. Support for the ATAPI overlap protocol.
|
|
||||||
*
|
|
||||||
* In order to maximize bus throughput, we currently use the DSC
|
|
||||||
* overlap method which enables ide.c to service requests from the
|
|
||||||
* other device while the tape is busy executing a command. The
|
|
||||||
* DSC overlap method involves polling the tape's status register
|
|
||||||
* for the DSC bit, and servicing the other device while the tape
|
|
||||||
* isn't ready.
|
|
||||||
*
|
|
||||||
* In the current QIC development standard (December 1995),
|
|
||||||
* it is recommended that new tape drives will *in addition*
|
|
||||||
* implement the ATAPI overlap protocol, which is used for the
|
|
||||||
* same purpose - efficient use of the IDE bus, but is interrupt
|
|
||||||
* driven and thus has much less CPU overhead.
|
|
||||||
*
|
|
||||||
* ATAPI overlap is likely to be supported in most new ATAPI
|
|
||||||
* devices, including new ATAPI cdroms, and thus provides us
|
|
||||||
* a method by which we can achieve higher throughput when
|
|
||||||
* sharing a (fast) ATA-2 disk with any (slow) new ATAPI device.
|
|
||||||
*/
|
|
||||||
|
|
|
@ -82,27 +82,26 @@ Drives are normally found by auto-probing and/or examining the CMOS/BIOS data.
|
||||||
For really weird situations, the apparent (fdisk) geometry can also be specified
|
For really weird situations, the apparent (fdisk) geometry can also be specified
|
||||||
on the kernel "command line" using LILO. The format of such lines is:
|
on the kernel "command line" using LILO. The format of such lines is:
|
||||||
|
|
||||||
hdx=cyls,heads,sects
|
ide_core.chs=[interface_number.device_number]:cyls,heads,sects
|
||||||
or hdx=cdrom
|
or ide_core.cdrom=[interface_number.device_number]
|
||||||
|
|
||||||
where hdx can be any of hda through hdh, Three values are required
|
For example:
|
||||||
(cyls,heads,sects). For example:
|
|
||||||
|
|
||||||
hdc=1050,32,64 hdd=cdrom
|
ide_core.chs=1.0:1050,32,64 ide_core.cdrom=1.1
|
||||||
|
|
||||||
either {hda,hdb} or {hdc,hdd}. The results of successful auto-probing may
|
The results of successful auto-probing may override the physical geometry/irq
|
||||||
override the physical geometry/irq specified, though the "original" geometry
|
specified, though the "original" geometry may be retained as the "logical"
|
||||||
may be retained as the "logical" geometry for partitioning purposes (fdisk).
|
geometry for partitioning purposes (fdisk).
|
||||||
|
|
||||||
If the auto-probing during boot time confuses a drive (ie. the drive works
|
If the auto-probing during boot time confuses a drive (ie. the drive works
|
||||||
with hd.c but not with ide.c), then an command line option may be specified
|
with hd.c but not with ide.c), then an command line option may be specified
|
||||||
for each drive for which you'd like the drive to skip the hardware
|
for each drive for which you'd like the drive to skip the hardware
|
||||||
probe/identification sequence. For example:
|
probe/identification sequence. For example:
|
||||||
|
|
||||||
hdb=noprobe
|
ide_core.noprobe=0.1
|
||||||
or
|
or
|
||||||
hdc=768,16,32
|
ide_core.chs=1.0:768,16,32
|
||||||
hdc=noprobe
|
ide_core.noprobe=1.0
|
||||||
|
|
||||||
Note that when only one IDE device is attached to an interface, it should be
|
Note that when only one IDE device is attached to an interface, it should be
|
||||||
jumpered as "single" or "master", *not* "slave". Many folks have had
|
jumpered as "single" or "master", *not* "slave". Many folks have had
|
||||||
|
@ -118,9 +117,9 @@ If for some reason your cdrom drive is *not* found at boot time, you can force
|
||||||
the probe to look harder by supplying a kernel command line parameter
|
the probe to look harder by supplying a kernel command line parameter
|
||||||
via LILO, such as:
|
via LILO, such as:
|
||||||
|
|
||||||
hdc=cdrom /* hdc = "master" on second interface */
|
ide_core.cdrom=1.0 /* "master" on second interface (hdc) */
|
||||||
or
|
or
|
||||||
hdd=cdrom /* hdd = "slave" on second interface */
|
ide_core.cdrom=1.1 /* "slave" on second interface (hdd) */
|
||||||
|
|
||||||
For example, a GW2000 system might have a hard drive on the primary
|
For example, a GW2000 system might have a hard drive on the primary
|
||||||
interface (/dev/hda) and an IDE cdrom drive on the secondary interface
|
interface (/dev/hda) and an IDE cdrom drive on the secondary interface
|
||||||
|
@ -174,9 +173,7 @@ to /etc/modprobe.conf.
|
||||||
|
|
||||||
When ide.c is used as a module, you can pass command line parameters to the
|
When ide.c is used as a module, you can pass command line parameters to the
|
||||||
driver using the "options=" keyword to insmod, while replacing any ',' with
|
driver using the "options=" keyword to insmod, while replacing any ',' with
|
||||||
';'. For example:
|
';'.
|
||||||
|
|
||||||
insmod ide.o options="hda=nodma hdb=nodma"
|
|
||||||
|
|
||||||
|
|
||||||
================================================================================
|
================================================================================
|
||||||
|
@ -184,57 +181,6 @@ driver using the "options=" keyword to insmod, while replacing any ',' with
|
||||||
Summary of ide driver parameters for kernel command line
|
Summary of ide driver parameters for kernel command line
|
||||||
--------------------------------------------------------
|
--------------------------------------------------------
|
||||||
|
|
||||||
"hdx=" is recognized for all "x" from "a" to "u", such as "hdc".
|
|
||||||
|
|
||||||
"idex=" is recognized for all "x" from "0" to "9", such as "ide1".
|
|
||||||
|
|
||||||
"hdx=noprobe" : drive may be present, but do not probe for it
|
|
||||||
|
|
||||||
"hdx=none" : drive is NOT present, ignore cmos and do not probe
|
|
||||||
|
|
||||||
"hdx=nowerr" : ignore the WRERR_STAT bit on this drive
|
|
||||||
|
|
||||||
"hdx=cdrom" : drive is present, and is a cdrom drive
|
|
||||||
|
|
||||||
"hdx=cyl,head,sect" : disk drive is present, with specified geometry
|
|
||||||
|
|
||||||
"hdx=autotune" : driver will attempt to tune interface speed
|
|
||||||
to the fastest PIO mode supported,
|
|
||||||
if possible for this drive only.
|
|
||||||
Not fully supported by all chipset types,
|
|
||||||
and quite likely to cause trouble with
|
|
||||||
older/odd IDE drives.
|
|
||||||
|
|
||||||
"hdx=nodma" : disallow DMA
|
|
||||||
|
|
||||||
"idebus=xx" : inform IDE driver of VESA/PCI bus speed in MHz,
|
|
||||||
where "xx" is between 20 and 66 inclusive,
|
|
||||||
used when tuning chipset PIO modes.
|
|
||||||
For PCI bus, 25 is correct for a P75 system,
|
|
||||||
30 is correct for P90,P120,P180 systems,
|
|
||||||
and 33 is used for P100,P133,P166 systems.
|
|
||||||
If in doubt, use idebus=33 for PCI.
|
|
||||||
As for VLB, it is safest to not specify it.
|
|
||||||
Bigger values are safer than smaller ones.
|
|
||||||
|
|
||||||
"idex=serialize" : do not overlap operations on idex. Please note
|
|
||||||
that you will have to specify this option for
|
|
||||||
both the respective primary and secondary channel
|
|
||||||
to take effect.
|
|
||||||
|
|
||||||
"idex=reset" : reset interface after probe
|
|
||||||
|
|
||||||
"idex=ata66" : informs the interface that it has an 80c cable
|
|
||||||
for chipsets that are ATA-66 capable, but the
|
|
||||||
ability to bit test for detection is currently
|
|
||||||
unknown.
|
|
||||||
|
|
||||||
"ide=doubler" : probe/support IDE doublers on Amiga
|
|
||||||
|
|
||||||
There may be more options than shown -- use the source, Luke!
|
|
||||||
|
|
||||||
Everything else is rejected with a "BAD OPTION" message.
|
|
||||||
|
|
||||||
For legacy IDE VLB host drivers (ali14xx/dtc2278/ht6560b/qd65xx/umc8672)
|
For legacy IDE VLB host drivers (ali14xx/dtc2278/ht6560b/qd65xx/umc8672)
|
||||||
you need to explicitly enable probing by using "probe" kernel parameter,
|
you need to explicitly enable probing by using "probe" kernel parameter,
|
||||||
i.e. to enable probing for ALI M14xx chipsets (ali14xx host driver) use:
|
i.e. to enable probing for ALI M14xx chipsets (ali14xx host driver) use:
|
||||||
|
@ -251,6 +197,33 @@ are detected automatically).
|
||||||
You also need to use "probe" kernel parameter for ide-4drives driver
|
You also need to use "probe" kernel parameter for ide-4drives driver
|
||||||
(support for IDE generic chipset with four drives on one port).
|
(support for IDE generic chipset with four drives on one port).
|
||||||
|
|
||||||
|
To enable support for IDE doublers on Amiga use "doubler" kernel parameter
|
||||||
|
for gayle host driver (i.e. "gayle.doubler" if the driver is built-in).
|
||||||
|
|
||||||
|
To force ignoring cable detection (this should be needed only if you're using
|
||||||
|
short 40-wires cable which cannot be automatically detected - if this is not
|
||||||
|
a case please report it as a bug instead) use "ignore_cable" kernel parameter:
|
||||||
|
|
||||||
|
* "ide_core.ignore_cable=[interface_number]" boot option if IDE is built-in
|
||||||
|
(i.e. "ide_core.ignore_cable=1" to force ignoring cable for "ide1")
|
||||||
|
|
||||||
|
* "ignore_cable=[interface_number]" module parameter (for ide_core module)
|
||||||
|
if IDE is compiled as module
|
||||||
|
|
||||||
|
Other kernel parameters for ide_core are:
|
||||||
|
|
||||||
|
* "nodma=[interface_number.device_number]" to disallow DMA for a device
|
||||||
|
|
||||||
|
* "noflush=[interface_number.device_number]" to disable flush requests
|
||||||
|
|
||||||
|
* "noprobe=[interface_number.device_number]" to skip probing
|
||||||
|
|
||||||
|
* "nowerr=[interface_number.device_number]" to ignore the WRERR_STAT bit
|
||||||
|
|
||||||
|
* "cdrom=[interface_number.device_number]" to force device as a CD-ROM
|
||||||
|
|
||||||
|
* "chs=[interface_number.device_number]" to force device as a disk (using CHS)
|
||||||
|
|
||||||
================================================================================
|
================================================================================
|
||||||
|
|
||||||
Some Terminology
|
Some Terminology
|
||||||
|
|
|
@ -183,6 +183,8 @@ Code Seq# Include File Comments
|
||||||
0xAC 00-1F linux/raw.h
|
0xAC 00-1F linux/raw.h
|
||||||
0xAD 00 Netfilter device in development:
|
0xAD 00 Netfilter device in development:
|
||||||
<mailto:rusty@rustcorp.com.au>
|
<mailto:rusty@rustcorp.com.au>
|
||||||
|
0xAE all linux/kvm.h Kernel-based Virtual Machine
|
||||||
|
<mailto:kvm-devel@lists.sourceforge.net>
|
||||||
0xB0 all RATIO devices in development:
|
0xB0 all RATIO devices in development:
|
||||||
<mailto:vgo@ratio.de>
|
<mailto:vgo@ratio.de>
|
||||||
0xB1 00-1F PPPoX <mailto:mostrows@styx.uwaterloo.ca>
|
0xB1 00-1F PPPoX <mailto:mostrows@styx.uwaterloo.ca>
|
||||||
|
|
|
@ -104,14 +104,15 @@ applicable everywhere (see syntax).
|
||||||
Reverse dependencies can only be used with boolean or tristate
|
Reverse dependencies can only be used with boolean or tristate
|
||||||
symbols.
|
symbols.
|
||||||
Note:
|
Note:
|
||||||
select is evil.... select will by brute force set a symbol
|
select should be used with care. select will force
|
||||||
equal to 'y' without visiting the dependencies. So abusing
|
a symbol to a value without visiting the dependencies.
|
||||||
select you are able to select a symbol FOO even if FOO depends
|
By abusing select you are able to select a symbol FOO even
|
||||||
on BAR that is not set. In general use select only for
|
if FOO depends on BAR that is not set.
|
||||||
non-visible symbols (no prompts anywhere) and for symbols with
|
In general use select only for non-visible symbols
|
||||||
no dependencies. That will limit the usefulness but on the
|
(no prompts anywhere) and for symbols with no dependencies.
|
||||||
other hand avoid the illegal configurations all over. kconfig
|
That will limit the usefulness but on the other hand avoid
|
||||||
should one day warn about such things.
|
the illegal configurations all over.
|
||||||
|
kconfig should one day warn about such things.
|
||||||
|
|
||||||
- numerical ranges: "range" <symbol> <symbol> ["if" <expr>]
|
- numerical ranges: "range" <symbol> <symbol> ["if" <expr>]
|
||||||
This allows to limit the range of possible input values for int
|
This allows to limit the range of possible input values for int
|
||||||
|
@ -376,27 +377,3 @@ config FOO
|
||||||
|
|
||||||
limits FOO to module (=m) or disabled (=n).
|
limits FOO to module (=m) or disabled (=n).
|
||||||
|
|
||||||
|
|
||||||
Build limited by a third config symbol which may be =y or =m
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
A common idiom that we see (and sometimes have problems with) is this:
|
|
||||||
|
|
||||||
When option C in B (module or subsystem) uses interfaces from A (module
|
|
||||||
or subsystem), and both A and B are tristate (could be =y or =m if they
|
|
||||||
were independent of each other, but they aren't), then we need to limit
|
|
||||||
C such that it cannot be built statically if A is built as a loadable
|
|
||||||
module. (C already depends on B, so there is no dependency issue to
|
|
||||||
take care of here.)
|
|
||||||
|
|
||||||
If A is linked statically into the kernel image, C can be built
|
|
||||||
statically or as loadable module(s). However, if A is built as loadable
|
|
||||||
module(s), then C must be restricted to loadable module(s) also. This
|
|
||||||
can be expressed in kconfig language as:
|
|
||||||
|
|
||||||
config C
|
|
||||||
depends on A = y || A = B
|
|
||||||
|
|
||||||
or for real examples, use this command in a kernel tree:
|
|
||||||
|
|
||||||
$ find . -name Kconfig\* | xargs grep -ns "depends on.*=.*||.*=" | grep -v orig
|
|
||||||
|
|
||||||
|
|
|
@ -486,7 +486,7 @@ Module.symvers contains a list of all exported symbols from a kernel build.
|
||||||
Sometimes, an external module uses exported symbols from another
|
Sometimes, an external module uses exported symbols from another
|
||||||
external module. Kbuild needs to have full knowledge on all symbols
|
external module. Kbuild needs to have full knowledge on all symbols
|
||||||
to avoid spitting out warnings about undefined symbols.
|
to avoid spitting out warnings about undefined symbols.
|
||||||
Two solutions exist to let kbuild know all symbols of more than
|
Three solutions exist to let kbuild know all symbols of more than
|
||||||
one external module.
|
one external module.
|
||||||
The method with a top-level kbuild file is recommended but may be
|
The method with a top-level kbuild file is recommended but may be
|
||||||
impractical in certain situations.
|
impractical in certain situations.
|
||||||
|
@ -523,6 +523,13 @@ Module.symvers contains a list of all exported symbols from a kernel build.
|
||||||
containing the sum of all symbols defined and not part of the
|
containing the sum of all symbols defined and not part of the
|
||||||
kernel.
|
kernel.
|
||||||
|
|
||||||
|
Use make variable KBUILD_EXTRA_SYMBOLS in the Makefile
|
||||||
|
If it is impractical to copy Module.symvers from another
|
||||||
|
module, you can assign a space separated list of files to
|
||||||
|
KBUILD_EXTRA_SYMBOLS in your Makfile. These files will be
|
||||||
|
loaded by modpost during the initialisation of its symbol
|
||||||
|
tables.
|
||||||
|
|
||||||
=== 8. Tips & Tricks
|
=== 8. Tips & Tricks
|
||||||
|
|
||||||
--- 8.1 Testing for CONFIG_FOO_BAR
|
--- 8.1 Testing for CONFIG_FOO_BAR
|
||||||
|
|
|
@ -245,6 +245,8 @@ The syntax is:
|
||||||
crashkernel=<range1>:<size1>[,<range2>:<size2>,...][@offset]
|
crashkernel=<range1>:<size1>[,<range2>:<size2>,...][@offset]
|
||||||
range=start-[end]
|
range=start-[end]
|
||||||
|
|
||||||
|
'start' is inclusive and 'end' is exclusive.
|
||||||
|
|
||||||
For example:
|
For example:
|
||||||
|
|
||||||
crashkernel=512M-2G:64M,2G-:128M
|
crashkernel=512M-2G:64M,2G-:128M
|
||||||
|
@ -253,10 +255,11 @@ This would mean:
|
||||||
|
|
||||||
1) if the RAM is smaller than 512M, then don't reserve anything
|
1) if the RAM is smaller than 512M, then don't reserve anything
|
||||||
(this is the "rescue" case)
|
(this is the "rescue" case)
|
||||||
2) if the RAM size is between 512M and 2G, then reserve 64M
|
2) if the RAM size is between 512M and 2G (exclusive), then reserve 64M
|
||||||
3) if the RAM size is larger than 2G, then reserve 128M
|
3) if the RAM size is larger than 2G, then reserve 128M
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Boot into System Kernel
|
Boot into System Kernel
|
||||||
=======================
|
=======================
|
||||||
|
|
||||||
|
|
|
@ -496,6 +496,11 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||||
switching to the matching ttyS device later. The
|
switching to the matching ttyS device later. The
|
||||||
options are the same as for ttyS, above.
|
options are the same as for ttyS, above.
|
||||||
|
|
||||||
|
If the device connected to the port is not a TTY but a braille
|
||||||
|
device, prepend "brl," before the device type, for instance
|
||||||
|
console=brl,ttyS0
|
||||||
|
For now, only VisioBraille is supported.
|
||||||
|
|
||||||
earlycon= [KNL] Output early console device and options.
|
earlycon= [KNL] Output early console device and options.
|
||||||
uart[8250],io,<addr>[,options]
|
uart[8250],io,<addr>[,options]
|
||||||
uart[8250],mmio,<addr>[,options]
|
uart[8250],mmio,<addr>[,options]
|
||||||
|
@ -556,6 +561,8 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||||
1 will print _a lot_ more information - normally
|
1 will print _a lot_ more information - normally
|
||||||
only useful to kernel developers.
|
only useful to kernel developers.
|
||||||
|
|
||||||
|
debug_objects [KNL] Enable object debugging
|
||||||
|
|
||||||
decnet.addr= [HW,NET]
|
decnet.addr= [HW,NET]
|
||||||
Format: <area>[,<node>]
|
Format: <area>[,<node>]
|
||||||
See also Documentation/networking/decnet.txt.
|
See also Documentation/networking/decnet.txt.
|
||||||
|
@ -627,8 +634,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||||
eata= [HW,SCSI]
|
eata= [HW,SCSI]
|
||||||
|
|
||||||
edd= [EDD]
|
edd= [EDD]
|
||||||
Format: {"of[f]" | "sk[ipmbr]"}
|
Format: {"off" | "on" | "skip[mbr]"}
|
||||||
See comment in arch/i386/boot/edd.S
|
|
||||||
|
|
||||||
eisa_irq_edge= [PARISC,HW]
|
eisa_irq_edge= [PARISC,HW]
|
||||||
See header of drivers/parisc/eisa.c.
|
See header of drivers/parisc/eisa.c.
|
||||||
|
@ -772,10 +778,6 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||||
Format: ide=nodma or ide=doubler
|
Format: ide=nodma or ide=doubler
|
||||||
See Documentation/ide/ide.txt.
|
See Documentation/ide/ide.txt.
|
||||||
|
|
||||||
ide?= [HW] (E)IDE subsystem
|
|
||||||
Format: ide?=ata66 or chipset specific parameters.
|
|
||||||
See Documentation/ide/ide.txt.
|
|
||||||
|
|
||||||
idebus= [HW] (E)IDE subsystem - VLB/PCI bus speed
|
idebus= [HW] (E)IDE subsystem - VLB/PCI bus speed
|
||||||
See Documentation/ide/ide.txt.
|
See Documentation/ide/ide.txt.
|
||||||
|
|
||||||
|
@ -1092,9 +1094,6 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||||
mac5380= [HW,SCSI] Format:
|
mac5380= [HW,SCSI] Format:
|
||||||
<can_queue>,<cmd_per_lun>,<sg_tablesize>,<hostid>,<use_tags>
|
<can_queue>,<cmd_per_lun>,<sg_tablesize>,<hostid>,<use_tags>
|
||||||
|
|
||||||
mac53c9x= [HW,SCSI] Format:
|
|
||||||
<num_esps>,<disconnect>,<nosync>,<can_queue>,<cmd_per_lun>,<sg_tablesize>,<hostid>,<use_tags>
|
|
||||||
|
|
||||||
machvec= [IA64] Force the use of a particular machine-vector
|
machvec= [IA64] Force the use of a particular machine-vector
|
||||||
(machvec) in a generic kernel.
|
(machvec) in a generic kernel.
|
||||||
Example: machvec=hpzx1_swiotlb
|
Example: machvec=hpzx1_swiotlb
|
||||||
|
@ -1393,6 +1392,13 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||||
|
|
||||||
nr_uarts= [SERIAL] maximum number of UARTs to be registered.
|
nr_uarts= [SERIAL] maximum number of UARTs to be registered.
|
||||||
|
|
||||||
|
olpc_ec_timeout= [OLPC] ms delay when issuing EC commands
|
||||||
|
Rather than timing out after 20 ms if an EC
|
||||||
|
command is not properly ACKed, override the length
|
||||||
|
of the timeout. We have interrupts disabled while
|
||||||
|
waiting for the ACK, so if this is set too high
|
||||||
|
interrupts *may* be lost!
|
||||||
|
|
||||||
opl3= [HW,OSS]
|
opl3= [HW,OSS]
|
||||||
Format: <io>
|
Format: <io>
|
||||||
|
|
||||||
|
@ -1516,6 +1522,8 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||||
This is normally done in pci_enable_device(),
|
This is normally done in pci_enable_device(),
|
||||||
so this option is a temporary workaround
|
so this option is a temporary workaround
|
||||||
for broken drivers that don't call it.
|
for broken drivers that don't call it.
|
||||||
|
skip_isa_align [X86] do not align io start addr, so can
|
||||||
|
handle more pci cards
|
||||||
firmware [ARM] Do not re-enumerate the bus but instead
|
firmware [ARM] Do not re-enumerate the bus but instead
|
||||||
just use the configuration from the
|
just use the configuration from the
|
||||||
bootloader. This is currently used on
|
bootloader. This is currently used on
|
||||||
|
|
|
@ -11,26 +11,29 @@ request_key*():
|
||||||
|
|
||||||
struct key *request_key(const struct key_type *type,
|
struct key *request_key(const struct key_type *type,
|
||||||
const char *description,
|
const char *description,
|
||||||
const char *callout_string);
|
const char *callout_info);
|
||||||
|
|
||||||
or:
|
or:
|
||||||
|
|
||||||
struct key *request_key_with_auxdata(const struct key_type *type,
|
struct key *request_key_with_auxdata(const struct key_type *type,
|
||||||
const char *description,
|
const char *description,
|
||||||
const char *callout_string,
|
const char *callout_info,
|
||||||
|
size_t callout_len,
|
||||||
void *aux);
|
void *aux);
|
||||||
|
|
||||||
or:
|
or:
|
||||||
|
|
||||||
struct key *request_key_async(const struct key_type *type,
|
struct key *request_key_async(const struct key_type *type,
|
||||||
const char *description,
|
const char *description,
|
||||||
const char *callout_string);
|
const char *callout_info,
|
||||||
|
size_t callout_len);
|
||||||
|
|
||||||
or:
|
or:
|
||||||
|
|
||||||
struct key *request_key_async_with_auxdata(const struct key_type *type,
|
struct key *request_key_async_with_auxdata(const struct key_type *type,
|
||||||
const char *description,
|
const char *description,
|
||||||
const char *callout_string,
|
const char *callout_info,
|
||||||
|
size_t callout_len,
|
||||||
void *aux);
|
void *aux);
|
||||||
|
|
||||||
Or by userspace invoking the request_key system call:
|
Or by userspace invoking the request_key system call:
|
||||||
|
|
|
@ -170,7 +170,8 @@ The key service provides a number of features besides keys:
|
||||||
amount of description and payload space that can be consumed.
|
amount of description and payload space that can be consumed.
|
||||||
|
|
||||||
The user can view information on this and other statistics through procfs
|
The user can view information on this and other statistics through procfs
|
||||||
files.
|
files. The root user may also alter the quota limits through sysctl files
|
||||||
|
(see the section "New procfs files").
|
||||||
|
|
||||||
Process-specific and thread-specific keyrings are not counted towards a
|
Process-specific and thread-specific keyrings are not counted towards a
|
||||||
user's quota.
|
user's quota.
|
||||||
|
@ -329,6 +330,27 @@ about the status of the key service:
|
||||||
<bytes>/<max> Key size quota
|
<bytes>/<max> Key size quota
|
||||||
|
|
||||||
|
|
||||||
|
Four new sysctl files have been added also for the purpose of controlling the
|
||||||
|
quota limits on keys:
|
||||||
|
|
||||||
|
(*) /proc/sys/kernel/keys/root_maxkeys
|
||||||
|
/proc/sys/kernel/keys/root_maxbytes
|
||||||
|
|
||||||
|
These files hold the maximum number of keys that root may have and the
|
||||||
|
maximum total number of bytes of data that root may have stored in those
|
||||||
|
keys.
|
||||||
|
|
||||||
|
(*) /proc/sys/kernel/keys/maxkeys
|
||||||
|
/proc/sys/kernel/keys/maxbytes
|
||||||
|
|
||||||
|
These files hold the maximum number of keys that each non-root user may
|
||||||
|
have and the maximum total number of bytes of data that each of those
|
||||||
|
users may have stored in their keys.
|
||||||
|
|
||||||
|
Root may alter these by writing each new limit as a decimal number string to
|
||||||
|
the appropriate file.
|
||||||
|
|
||||||
|
|
||||||
===============================
|
===============================
|
||||||
USERSPACE SYSTEM CALL INTERFACE
|
USERSPACE SYSTEM CALL INTERFACE
|
||||||
===============================
|
===============================
|
||||||
|
@ -711,6 +733,27 @@ The keyctl syscall functions are:
|
||||||
The assumed authoritative key is inherited across fork and exec.
|
The assumed authoritative key is inherited across fork and exec.
|
||||||
|
|
||||||
|
|
||||||
|
(*) Get the LSM security context attached to a key.
|
||||||
|
|
||||||
|
long keyctl(KEYCTL_GET_SECURITY, key_serial_t key, char *buffer,
|
||||||
|
size_t buflen)
|
||||||
|
|
||||||
|
This function returns a string that represents the LSM security context
|
||||||
|
attached to a key in the buffer provided.
|
||||||
|
|
||||||
|
Unless there's an error, it always returns the amount of data it could
|
||||||
|
produce, even if that's too big for the buffer, but it won't copy more
|
||||||
|
than requested to userspace. If the buffer pointer is NULL then no copy
|
||||||
|
will take place.
|
||||||
|
|
||||||
|
A NUL character is included at the end of the string if the buffer is
|
||||||
|
sufficiently big. This is included in the returned count. If no LSM is
|
||||||
|
in force then an empty string will be returned.
|
||||||
|
|
||||||
|
A process must have view permission on the key for this function to be
|
||||||
|
successful.
|
||||||
|
|
||||||
|
|
||||||
===============
|
===============
|
||||||
KERNEL SERVICES
|
KERNEL SERVICES
|
||||||
===============
|
===============
|
||||||
|
@ -771,7 +814,7 @@ payload contents" for more information.
|
||||||
|
|
||||||
struct key *request_key(const struct key_type *type,
|
struct key *request_key(const struct key_type *type,
|
||||||
const char *description,
|
const char *description,
|
||||||
const char *callout_string);
|
const char *callout_info);
|
||||||
|
|
||||||
This is used to request a key or keyring with a description that matches
|
This is used to request a key or keyring with a description that matches
|
||||||
the description specified according to the key type's match function. This
|
the description specified according to the key type's match function. This
|
||||||
|
@ -793,24 +836,28 @@ payload contents" for more information.
|
||||||
|
|
||||||
struct key *request_key_with_auxdata(const struct key_type *type,
|
struct key *request_key_with_auxdata(const struct key_type *type,
|
||||||
const char *description,
|
const char *description,
|
||||||
const char *callout_string,
|
const void *callout_info,
|
||||||
|
size_t callout_len,
|
||||||
void *aux);
|
void *aux);
|
||||||
|
|
||||||
This is identical to request_key(), except that the auxiliary data is
|
This is identical to request_key(), except that the auxiliary data is
|
||||||
passed to the key_type->request_key() op if it exists.
|
passed to the key_type->request_key() op if it exists, and the callout_info
|
||||||
|
is a blob of length callout_len, if given (the length may be 0).
|
||||||
|
|
||||||
|
|
||||||
(*) A key can be requested asynchronously by calling one of:
|
(*) A key can be requested asynchronously by calling one of:
|
||||||
|
|
||||||
struct key *request_key_async(const struct key_type *type,
|
struct key *request_key_async(const struct key_type *type,
|
||||||
const char *description,
|
const char *description,
|
||||||
const char *callout_string);
|
const void *callout_info,
|
||||||
|
size_t callout_len);
|
||||||
|
|
||||||
or:
|
or:
|
||||||
|
|
||||||
struct key *request_key_async_with_auxdata(const struct key_type *type,
|
struct key *request_key_async_with_auxdata(const struct key_type *type,
|
||||||
const char *description,
|
const char *description,
|
||||||
const char *callout_string,
|
const char *callout_info,
|
||||||
|
size_t callout_len,
|
||||||
void *aux);
|
void *aux);
|
||||||
|
|
||||||
which are asynchronous equivalents of request_key() and
|
which are asynchronous equivalents of request_key() and
|
||||||
|
|
|
@ -37,6 +37,11 @@ registration function such as register_kprobe() specifies where
|
||||||
the probe is to be inserted and what handler is to be called when
|
the probe is to be inserted and what handler is to be called when
|
||||||
the probe is hit.
|
the probe is hit.
|
||||||
|
|
||||||
|
There are also register_/unregister_*probes() functions for batch
|
||||||
|
registration/unregistration of a group of *probes. These functions
|
||||||
|
can speed up unregistration process when you have to unregister
|
||||||
|
a lot of probes at once.
|
||||||
|
|
||||||
The next three subsections explain how the different types of
|
The next three subsections explain how the different types of
|
||||||
probes work. They explain certain things that you'll need to
|
probes work. They explain certain things that you'll need to
|
||||||
know in order to make the best use of Kprobes -- e.g., the
|
know in order to make the best use of Kprobes -- e.g., the
|
||||||
|
@ -190,10 +195,11 @@ code mapping.
|
||||||
4. API Reference
|
4. API Reference
|
||||||
|
|
||||||
The Kprobes API includes a "register" function and an "unregister"
|
The Kprobes API includes a "register" function and an "unregister"
|
||||||
function for each type of probe. Here are terse, mini-man-page
|
function for each type of probe. The API also includes "register_*probes"
|
||||||
specifications for these functions and the associated probe handlers
|
and "unregister_*probes" functions for (un)registering arrays of probes.
|
||||||
that you'll write. See the files in the samples/kprobes/ sub-directory
|
Here are terse, mini-man-page specifications for these functions and
|
||||||
for examples.
|
the associated probe handlers that you'll write. See the files in the
|
||||||
|
samples/kprobes/ sub-directory for examples.
|
||||||
|
|
||||||
4.1 register_kprobe
|
4.1 register_kprobe
|
||||||
|
|
||||||
|
@ -319,6 +325,43 @@ void unregister_kretprobe(struct kretprobe *rp);
|
||||||
Removes the specified probe. The unregister function can be called
|
Removes the specified probe. The unregister function can be called
|
||||||
at any time after the probe has been registered.
|
at any time after the probe has been registered.
|
||||||
|
|
||||||
|
NOTE:
|
||||||
|
If the functions find an incorrect probe (ex. an unregistered probe),
|
||||||
|
they clear the addr field of the probe.
|
||||||
|
|
||||||
|
4.5 register_*probes
|
||||||
|
|
||||||
|
#include <linux/kprobes.h>
|
||||||
|
int register_kprobes(struct kprobe **kps, int num);
|
||||||
|
int register_kretprobes(struct kretprobe **rps, int num);
|
||||||
|
int register_jprobes(struct jprobe **jps, int num);
|
||||||
|
|
||||||
|
Registers each of the num probes in the specified array. If any
|
||||||
|
error occurs during registration, all probes in the array, up to
|
||||||
|
the bad probe, are safely unregistered before the register_*probes
|
||||||
|
function returns.
|
||||||
|
- kps/rps/jps: an array of pointers to *probe data structures
|
||||||
|
- num: the number of the array entries.
|
||||||
|
|
||||||
|
NOTE:
|
||||||
|
You have to allocate(or define) an array of pointers and set all
|
||||||
|
of the array entries before using these functions.
|
||||||
|
|
||||||
|
4.6 unregister_*probes
|
||||||
|
|
||||||
|
#include <linux/kprobes.h>
|
||||||
|
void unregister_kprobes(struct kprobe **kps, int num);
|
||||||
|
void unregister_kretprobes(struct kretprobe **rps, int num);
|
||||||
|
void unregister_jprobes(struct jprobe **jps, int num);
|
||||||
|
|
||||||
|
Removes each of the num probes in the specified array at once.
|
||||||
|
|
||||||
|
NOTE:
|
||||||
|
If the functions find some incorrect probes (ex. unregistered
|
||||||
|
probes) in the specified array, they clear the addr field of those
|
||||||
|
incorrect probes. However, other probes in the array are
|
||||||
|
unregistered correctly.
|
||||||
|
|
||||||
5. Kprobes Features and Limitations
|
5. Kprobes Features and Limitations
|
||||||
|
|
||||||
Kprobes allows multiple probes at the same address. Currently,
|
Kprobes allows multiple probes at the same address. Currently,
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
ThinkPad ACPI Extras Driver
|
ThinkPad ACPI Extras Driver
|
||||||
|
|
||||||
Version 0.19
|
Version 0.20
|
||||||
January 06th, 2008
|
April 09th, 2008
|
||||||
|
|
||||||
Borislav Deianov <borislav@users.sf.net>
|
Borislav Deianov <borislav@users.sf.net>
|
||||||
Henrique de Moraes Holschuh <hmh@hmh.eng.br>
|
Henrique de Moraes Holschuh <hmh@hmh.eng.br>
|
||||||
|
@ -18,6 +18,11 @@ This driver used to be named ibm-acpi until kernel 2.6.21 and release
|
||||||
moved to the drivers/misc tree and renamed to thinkpad-acpi for kernel
|
moved to the drivers/misc tree and renamed to thinkpad-acpi for kernel
|
||||||
2.6.22, and release 0.14.
|
2.6.22, and release 0.14.
|
||||||
|
|
||||||
|
The driver is named "thinkpad-acpi". In some places, like module
|
||||||
|
names, "thinkpad_acpi" is used because of userspace issues.
|
||||||
|
|
||||||
|
"tpacpi" is used as a shorthand where "thinkpad-acpi" would be too
|
||||||
|
long due to length limitations on some Linux kernel versions.
|
||||||
|
|
||||||
Status
|
Status
|
||||||
------
|
------
|
||||||
|
@ -571,6 +576,47 @@ netlink interface and the input layer interface, and don't bother at all
|
||||||
with hotkey_report_mode.
|
with hotkey_report_mode.
|
||||||
|
|
||||||
|
|
||||||
|
Brightness hotkey notes:
|
||||||
|
|
||||||
|
These are the current sane choices for brightness key mapping in
|
||||||
|
thinkpad-acpi:
|
||||||
|
|
||||||
|
For IBM and Lenovo models *without* ACPI backlight control (the ones on
|
||||||
|
which thinkpad-acpi will autoload its backlight interface by default,
|
||||||
|
and on which ACPI video does not export a backlight interface):
|
||||||
|
|
||||||
|
1. Don't enable or map the brightness hotkeys in thinkpad-acpi, as
|
||||||
|
these older firmware versions unfortunately won't respect the hotkey
|
||||||
|
mask for brightness keys anyway, and always reacts to them. This
|
||||||
|
usually work fine, unless X.org drivers are doing something to block
|
||||||
|
the BIOS. In that case, use (3) below. This is the default mode of
|
||||||
|
operation.
|
||||||
|
|
||||||
|
2. Enable the hotkeys, but map them to something else that is NOT
|
||||||
|
KEY_BRIGHTNESS_UP/DOWN or any other keycode that would cause
|
||||||
|
userspace to try to change the backlight level, and use that as an
|
||||||
|
on-screen-display hint.
|
||||||
|
|
||||||
|
3. IF AND ONLY IF X.org drivers find a way to block the firmware from
|
||||||
|
automatically changing the brightness, enable the hotkeys and map
|
||||||
|
them to KEY_BRIGHTNESS_UP and KEY_BRIGHTNESS_DOWN, and feed that to
|
||||||
|
something that calls xbacklight. thinkpad-acpi will not be able to
|
||||||
|
change brightness in that case either, so you should disable its
|
||||||
|
backlight interface.
|
||||||
|
|
||||||
|
For Lenovo models *with* ACPI backlight control:
|
||||||
|
|
||||||
|
1. Load up ACPI video and use that. ACPI video will report ACPI
|
||||||
|
events for brightness change keys. Do not mess with thinkpad-acpi
|
||||||
|
defaults in this case. thinkpad-acpi should not have anything to do
|
||||||
|
with backlight events in a scenario where ACPI video is loaded:
|
||||||
|
brightness hotkeys must be disabled, and the backlight interface is
|
||||||
|
to be kept disabled as well. This is the default mode of operation.
|
||||||
|
|
||||||
|
2. Do *NOT* load up ACPI video, enable the hotkeys in thinkpad-acpi,
|
||||||
|
and map them to KEY_BRIGHTNESS_UP and KEY_BRIGHTNESS_DOWN. Process
|
||||||
|
these keys on userspace somehow (e.g. by calling xbacklight).
|
||||||
|
|
||||||
Bluetooth
|
Bluetooth
|
||||||
---------
|
---------
|
||||||
|
|
||||||
|
@ -647,16 +693,31 @@ while others are still having problems. For more information:
|
||||||
|
|
||||||
https://bugs.freedesktop.org/show_bug.cgi?id=2000
|
https://bugs.freedesktop.org/show_bug.cgi?id=2000
|
||||||
|
|
||||||
ThinkLight control -- /proc/acpi/ibm/light
|
ThinkLight control
|
||||||
------------------------------------------
|
------------------
|
||||||
|
|
||||||
The current status of the ThinkLight can be found in this file. A few
|
procfs: /proc/acpi/ibm/light
|
||||||
models which do not make the status available will show it as
|
sysfs attributes: as per LED class, for the "tpacpi::thinklight" LED
|
||||||
"unknown". The available commands are:
|
|
||||||
|
procfs notes:
|
||||||
|
|
||||||
|
The ThinkLight status can be read and set through the procfs interface. A
|
||||||
|
few models which do not make the status available will show the ThinkLight
|
||||||
|
status as "unknown". The available commands are:
|
||||||
|
|
||||||
echo on > /proc/acpi/ibm/light
|
echo on > /proc/acpi/ibm/light
|
||||||
echo off > /proc/acpi/ibm/light
|
echo off > /proc/acpi/ibm/light
|
||||||
|
|
||||||
|
sysfs notes:
|
||||||
|
|
||||||
|
The ThinkLight sysfs interface is documented by the LED class
|
||||||
|
documentation, in Documentation/leds-class.txt. The ThinkLight LED name
|
||||||
|
is "tpacpi::thinklight".
|
||||||
|
|
||||||
|
Due to limitations in the sysfs LED class, if the status of the thinklight
|
||||||
|
cannot be read or if it is unknown, thinkpad-acpi will report it as "off".
|
||||||
|
It is impossible to know if the status returned through sysfs is valid.
|
||||||
|
|
||||||
Docking / undocking -- /proc/acpi/ibm/dock
|
Docking / undocking -- /proc/acpi/ibm/dock
|
||||||
------------------------------------------
|
------------------------------------------
|
||||||
|
|
||||||
|
@ -815,28 +876,63 @@ The cmos command interface is prone to firmware split-brain problems, as
|
||||||
in newer ThinkPads it is just a compatibility layer. Do not use it, it is
|
in newer ThinkPads it is just a compatibility layer. Do not use it, it is
|
||||||
exported just as a debug tool.
|
exported just as a debug tool.
|
||||||
|
|
||||||
LED control -- /proc/acpi/ibm/led
|
LED control
|
||||||
---------------------------------
|
-----------
|
||||||
|
|
||||||
Some of the LED indicators can be controlled through this feature. The
|
procfs: /proc/acpi/ibm/led
|
||||||
available commands are:
|
sysfs attributes: as per LED class, see below for names
|
||||||
|
|
||||||
echo '<led number> on' >/proc/acpi/ibm/led
|
Some of the LED indicators can be controlled through this feature. On
|
||||||
echo '<led number> off' >/proc/acpi/ibm/led
|
some older ThinkPad models, it is possible to query the status of the
|
||||||
echo '<led number> blink' >/proc/acpi/ibm/led
|
LED indicators as well. Newer ThinkPads cannot query the real status
|
||||||
|
of the LED indicators.
|
||||||
|
|
||||||
The <led number> range is 0 to 7. The set of LEDs that can be
|
procfs notes:
|
||||||
controlled varies from model to model. Here is the mapping on the X40:
|
|
||||||
|
The available commands are:
|
||||||
|
|
||||||
|
echo '<LED number> on' >/proc/acpi/ibm/led
|
||||||
|
echo '<LED number> off' >/proc/acpi/ibm/led
|
||||||
|
echo '<LED number> blink' >/proc/acpi/ibm/led
|
||||||
|
|
||||||
|
The <LED number> range is 0 to 7. The set of LEDs that can be
|
||||||
|
controlled varies from model to model. Here is the common ThinkPad
|
||||||
|
mapping:
|
||||||
|
|
||||||
0 - power
|
0 - power
|
||||||
1 - battery (orange)
|
1 - battery (orange)
|
||||||
2 - battery (green)
|
2 - battery (green)
|
||||||
3 - UltraBase
|
3 - UltraBase/dock
|
||||||
4 - UltraBay
|
4 - UltraBay
|
||||||
|
5 - UltraBase battery slot
|
||||||
|
6 - (unknown)
|
||||||
7 - standby
|
7 - standby
|
||||||
|
|
||||||
All of the above can be turned on and off and can be made to blink.
|
All of the above can be turned on and off and can be made to blink.
|
||||||
|
|
||||||
|
sysfs notes:
|
||||||
|
|
||||||
|
The ThinkPad LED sysfs interface is described in detail by the LED class
|
||||||
|
documentation, in Documentation/leds-class.txt.
|
||||||
|
|
||||||
|
The leds are named (in LED ID order, from 0 to 7):
|
||||||
|
"tpacpi::power", "tpacpi:orange:batt", "tpacpi:green:batt",
|
||||||
|
"tpacpi::dock_active", "tpacpi::bay_active", "tpacpi::dock_batt",
|
||||||
|
"tpacpi::unknown_led", "tpacpi::standby".
|
||||||
|
|
||||||
|
Due to limitations in the sysfs LED class, if the status of the LED
|
||||||
|
indicators cannot be read due to an error, thinkpad-acpi will report it as
|
||||||
|
a brightness of zero (same as LED off).
|
||||||
|
|
||||||
|
If the thinkpad firmware doesn't support reading the current status,
|
||||||
|
trying to read the current LED brightness will just return whatever
|
||||||
|
brightness was last written to that attribute.
|
||||||
|
|
||||||
|
These LEDs can blink using hardware acceleration. To request that a
|
||||||
|
ThinkPad indicator LED should blink in hardware accelerated mode, use the
|
||||||
|
"timer" trigger, and leave the delay_on and delay_off parameters set to
|
||||||
|
zero (to request hardware acceleration autodetection).
|
||||||
|
|
||||||
ACPI sounds -- /proc/acpi/ibm/beep
|
ACPI sounds -- /proc/acpi/ibm/beep
|
||||||
----------------------------------
|
----------------------------------
|
||||||
|
|
||||||
|
@ -1090,6 +1186,15 @@ it there will be the following attributes:
|
||||||
dim the display.
|
dim the display.
|
||||||
|
|
||||||
|
|
||||||
|
WARNING:
|
||||||
|
|
||||||
|
Whatever you do, do NOT ever call thinkpad-acpi backlight-level change
|
||||||
|
interface and the ACPI-based backlight level change interface
|
||||||
|
(available on newer BIOSes, and driven by the Linux ACPI video driver)
|
||||||
|
at the same time. The two will interact in bad ways, do funny things,
|
||||||
|
and maybe reduce the life of the backlight lamps by needlessly kicking
|
||||||
|
its level up and down at every change.
|
||||||
|
|
||||||
Volume control -- /proc/acpi/ibm/volume
|
Volume control -- /proc/acpi/ibm/volume
|
||||||
---------------------------------------
|
---------------------------------------
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,12 @@ optimises away.
|
||||||
|
|
||||||
Complex triggers whilst available to all LEDs have LED specific
|
Complex triggers whilst available to all LEDs have LED specific
|
||||||
parameters and work on a per LED basis. The timer trigger is an example.
|
parameters and work on a per LED basis. The timer trigger is an example.
|
||||||
|
The timer trigger will periodically change the LED brightness between
|
||||||
|
LED_OFF and the current brightness setting. The "on" and "off" time can
|
||||||
|
be specified via /sys/class/leds/<device>/delay_{on,off} in milliseconds.
|
||||||
|
You can change the brightness value of a LED independently of the timer
|
||||||
|
trigger. However, if you set the brightness value to LED_OFF it will
|
||||||
|
also disable the timer trigger.
|
||||||
|
|
||||||
You can change triggers in a similar manner to the way an IO scheduler
|
You can change triggers in a similar manner to the way an IO scheduler
|
||||||
is chosen (via /sys/class/leds/<device>/trigger). Trigger specific
|
is chosen (via /sys/class/leds/<device>/trigger). Trigger specific
|
||||||
|
@ -63,9 +69,9 @@ value if it is called with *delay_on==0 && *delay_off==0 parameters. In
|
||||||
this case the driver should give back the chosen value through delay_on
|
this case the driver should give back the chosen value through delay_on
|
||||||
and delay_off parameters to the leds subsystem.
|
and delay_off parameters to the leds subsystem.
|
||||||
|
|
||||||
Any call to the brightness_set() callback function should cancel the
|
Setting the brightness to zero with brightness_set() callback function
|
||||||
previously programmed hardware blinking function so setting the brightness
|
should completely turn off the LED and cancel the previously programmed
|
||||||
to 0 can also cancel the blinking of the LED.
|
hardware blinking function, if any.
|
||||||
|
|
||||||
|
|
||||||
Known Issues
|
Known Issues
|
||||||
|
|
|
@ -131,6 +131,9 @@ struct device
|
||||||
/* Any queues attached to this device */
|
/* Any queues attached to this device */
|
||||||
struct virtqueue *vq;
|
struct virtqueue *vq;
|
||||||
|
|
||||||
|
/* Handle status being finalized (ie. feature bits stable). */
|
||||||
|
void (*ready)(struct device *me);
|
||||||
|
|
||||||
/* Device-specific data. */
|
/* Device-specific data. */
|
||||||
void *priv;
|
void *priv;
|
||||||
};
|
};
|
||||||
|
@ -925,24 +928,40 @@ static void enable_fd(int fd, struct virtqueue *vq)
|
||||||
write(waker_fd, &vq->dev->fd, sizeof(vq->dev->fd));
|
write(waker_fd, &vq->dev->fd, sizeof(vq->dev->fd));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* When the Guest asks us to reset a device, it's is fairly easy. */
|
/* When the Guest tells us they updated the status field, we handle it. */
|
||||||
static void reset_device(struct device *dev)
|
static void update_device_status(struct device *dev)
|
||||||
{
|
{
|
||||||
struct virtqueue *vq;
|
struct virtqueue *vq;
|
||||||
|
|
||||||
verbose("Resetting device %s\n", dev->name);
|
/* This is a reset. */
|
||||||
/* Clear the status. */
|
if (dev->desc->status == 0) {
|
||||||
dev->desc->status = 0;
|
verbose("Resetting device %s\n", dev->name);
|
||||||
|
|
||||||
/* Clear any features they've acked. */
|
/* Clear any features they've acked. */
|
||||||
memset(get_feature_bits(dev) + dev->desc->feature_len, 0,
|
memset(get_feature_bits(dev) + dev->desc->feature_len, 0,
|
||||||
dev->desc->feature_len);
|
dev->desc->feature_len);
|
||||||
|
|
||||||
/* Zero out the virtqueues. */
|
/* Zero out the virtqueues. */
|
||||||
for (vq = dev->vq; vq; vq = vq->next) {
|
for (vq = dev->vq; vq; vq = vq->next) {
|
||||||
memset(vq->vring.desc, 0,
|
memset(vq->vring.desc, 0,
|
||||||
vring_size(vq->config.num, getpagesize()));
|
vring_size(vq->config.num, getpagesize()));
|
||||||
vq->last_avail_idx = 0;
|
vq->last_avail_idx = 0;
|
||||||
|
}
|
||||||
|
} else if (dev->desc->status & VIRTIO_CONFIG_S_FAILED) {
|
||||||
|
warnx("Device %s configuration FAILED", dev->name);
|
||||||
|
} else if (dev->desc->status & VIRTIO_CONFIG_S_DRIVER_OK) {
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
verbose("Device %s OK: offered", dev->name);
|
||||||
|
for (i = 0; i < dev->desc->feature_len; i++)
|
||||||
|
verbose(" %08x", get_feature_bits(dev)[i]);
|
||||||
|
verbose(", accepted");
|
||||||
|
for (i = 0; i < dev->desc->feature_len; i++)
|
||||||
|
verbose(" %08x", get_feature_bits(dev)
|
||||||
|
[dev->desc->feature_len+i]);
|
||||||
|
|
||||||
|
if (dev->ready)
|
||||||
|
dev->ready(dev);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -954,9 +973,9 @@ static void handle_output(int fd, unsigned long addr)
|
||||||
|
|
||||||
/* Check each device and virtqueue. */
|
/* Check each device and virtqueue. */
|
||||||
for (i = devices.dev; i; i = i->next) {
|
for (i = devices.dev; i; i = i->next) {
|
||||||
/* Notifications to device descriptors reset the device. */
|
/* Notifications to device descriptors update device status. */
|
||||||
if (from_guest_phys(addr) == i->desc) {
|
if (from_guest_phys(addr) == i->desc) {
|
||||||
reset_device(i);
|
update_device_status(i);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1170,6 +1189,7 @@ static struct device *new_device(const char *name, u16 type, int fd,
|
||||||
dev->handle_input = handle_input;
|
dev->handle_input = handle_input;
|
||||||
dev->name = name;
|
dev->name = name;
|
||||||
dev->vq = NULL;
|
dev->vq = NULL;
|
||||||
|
dev->ready = NULL;
|
||||||
|
|
||||||
/* Append to device list. Prepending to a single-linked list is
|
/* Append to device list. Prepending to a single-linked list is
|
||||||
* easier, but the user expects the devices to be arranged on the bus
|
* easier, but the user expects the devices to be arranged on the bus
|
||||||
|
@ -1398,7 +1418,7 @@ static bool service_io(struct device *dev)
|
||||||
struct vblk_info *vblk = dev->priv;
|
struct vblk_info *vblk = dev->priv;
|
||||||
unsigned int head, out_num, in_num, wlen;
|
unsigned int head, out_num, in_num, wlen;
|
||||||
int ret;
|
int ret;
|
||||||
struct virtio_blk_inhdr *in;
|
u8 *in;
|
||||||
struct virtio_blk_outhdr *out;
|
struct virtio_blk_outhdr *out;
|
||||||
struct iovec iov[dev->vq->vring.num];
|
struct iovec iov[dev->vq->vring.num];
|
||||||
off64_t off;
|
off64_t off;
|
||||||
|
@ -1416,7 +1436,7 @@ static bool service_io(struct device *dev)
|
||||||
head, out_num, in_num);
|
head, out_num, in_num);
|
||||||
|
|
||||||
out = convert(&iov[0], struct virtio_blk_outhdr);
|
out = convert(&iov[0], struct virtio_blk_outhdr);
|
||||||
in = convert(&iov[out_num+in_num-1], struct virtio_blk_inhdr);
|
in = convert(&iov[out_num+in_num-1], u8);
|
||||||
off = out->sector * 512;
|
off = out->sector * 512;
|
||||||
|
|
||||||
/* The block device implements "barriers", where the Guest indicates
|
/* The block device implements "barriers", where the Guest indicates
|
||||||
|
@ -1430,7 +1450,7 @@ static bool service_io(struct device *dev)
|
||||||
* It'd be nice if we supported eject, for example, but we don't. */
|
* It'd be nice if we supported eject, for example, but we don't. */
|
||||||
if (out->type & VIRTIO_BLK_T_SCSI_CMD) {
|
if (out->type & VIRTIO_BLK_T_SCSI_CMD) {
|
||||||
fprintf(stderr, "Scsi commands unsupported\n");
|
fprintf(stderr, "Scsi commands unsupported\n");
|
||||||
in->status = VIRTIO_BLK_S_UNSUPP;
|
*in = VIRTIO_BLK_S_UNSUPP;
|
||||||
wlen = sizeof(*in);
|
wlen = sizeof(*in);
|
||||||
} else if (out->type & VIRTIO_BLK_T_OUT) {
|
} else if (out->type & VIRTIO_BLK_T_OUT) {
|
||||||
/* Write */
|
/* Write */
|
||||||
|
@ -1453,7 +1473,7 @@ static bool service_io(struct device *dev)
|
||||||
errx(1, "Write past end %llu+%u", off, ret);
|
errx(1, "Write past end %llu+%u", off, ret);
|
||||||
}
|
}
|
||||||
wlen = sizeof(*in);
|
wlen = sizeof(*in);
|
||||||
in->status = (ret >= 0 ? VIRTIO_BLK_S_OK : VIRTIO_BLK_S_IOERR);
|
*in = (ret >= 0 ? VIRTIO_BLK_S_OK : VIRTIO_BLK_S_IOERR);
|
||||||
} else {
|
} else {
|
||||||
/* Read */
|
/* Read */
|
||||||
|
|
||||||
|
@ -1466,10 +1486,10 @@ static bool service_io(struct device *dev)
|
||||||
verbose("READ from sector %llu: %i\n", out->sector, ret);
|
verbose("READ from sector %llu: %i\n", out->sector, ret);
|
||||||
if (ret >= 0) {
|
if (ret >= 0) {
|
||||||
wlen = sizeof(*in) + ret;
|
wlen = sizeof(*in) + ret;
|
||||||
in->status = VIRTIO_BLK_S_OK;
|
*in = VIRTIO_BLK_S_OK;
|
||||||
} else {
|
} else {
|
||||||
wlen = sizeof(*in);
|
wlen = sizeof(*in);
|
||||||
in->status = VIRTIO_BLK_S_IOERR;
|
*in = VIRTIO_BLK_S_IOERR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -450,3 +450,9 @@ These currently include
|
||||||
there are upper and lower limits (32768, 16). Default is 128.
|
there are upper and lower limits (32768, 16). Default is 128.
|
||||||
strip_cache_active (currently raid5 only)
|
strip_cache_active (currently raid5 only)
|
||||||
number of active entries in the stripe cache
|
number of active entries in the stripe cache
|
||||||
|
preread_bypass_threshold (currently raid5 only)
|
||||||
|
number of times a stripe requiring preread will be bypassed by
|
||||||
|
a stripe that does not require preread. For fairness defaults
|
||||||
|
to 1. Setting this to 0 disables bypass accounting and
|
||||||
|
requires preread stripes to wait until all full-width stripe-
|
||||||
|
writes are complete. Valid values are 0 to stripe_cache_size.
|
||||||
|
|
|
@ -46,8 +46,6 @@ Two files are introduced:
|
||||||
|
|
||||||
a) 'include/asm-mips/mach-au1x00/au1xxx_ide.h'
|
a) 'include/asm-mips/mach-au1x00/au1xxx_ide.h'
|
||||||
containes : struct _auide_hwif
|
containes : struct _auide_hwif
|
||||||
struct drive_list_entry dma_white_list
|
|
||||||
struct drive_list_entry dma_black_list
|
|
||||||
timing parameters for PIO mode 0/1/2/3/4
|
timing parameters for PIO mode 0/1/2/3/4
|
||||||
timing parameters for MWDMA 0/1/2
|
timing parameters for MWDMA 0/1/2
|
||||||
|
|
||||||
|
@ -63,12 +61,6 @@ Four configs variables are introduced:
|
||||||
CONFIG_BLK_DEV_IDE_AU1XXX_SEQTS_PER_RQ - maximum transfer size
|
CONFIG_BLK_DEV_IDE_AU1XXX_SEQTS_PER_RQ - maximum transfer size
|
||||||
per descriptor
|
per descriptor
|
||||||
|
|
||||||
If MWDMA is enabled and the connected hard disc is not on the white list, the
|
|
||||||
kernel switches to a "safe mwdma mode" at boot time. In this mode the IDE
|
|
||||||
performance is substantial slower then in full speed mwdma. In this case
|
|
||||||
please add your hard disc to the white list (follow instruction from 'ADD NEW
|
|
||||||
HARD DISC TO WHITE OR BLACK LIST' section).
|
|
||||||
|
|
||||||
|
|
||||||
SUPPORTED IDE MODES
|
SUPPORTED IDE MODES
|
||||||
-------------------
|
-------------------
|
||||||
|
@ -120,44 +112,6 @@ CONFIG_IDEDMA_AUTO=y
|
||||||
Also undefine 'IDE_AU1XXX_BURSTMODE' in 'drivers/ide/mips/au1xxx-ide.c' to
|
Also undefine 'IDE_AU1XXX_BURSTMODE' in 'drivers/ide/mips/au1xxx-ide.c' to
|
||||||
disable the burst support on DBDMA controller.
|
disable the burst support on DBDMA controller.
|
||||||
|
|
||||||
ADD NEW HARD DISC TO WHITE OR BLACK LIST
|
|
||||||
----------------------------------------
|
|
||||||
|
|
||||||
Step 1 : detect the model name of your hard disc
|
|
||||||
|
|
||||||
a) connect your hard disc to the AU1XXX
|
|
||||||
|
|
||||||
b) boot your kernel and get the hard disc model.
|
|
||||||
|
|
||||||
Example boot log:
|
|
||||||
|
|
||||||
--snipped--
|
|
||||||
Uniform Multi-Platform E-IDE driver Revision: 7.00alpha2
|
|
||||||
ide: Assuming 50MHz system bus speed for PIO modes; override with idebus=xx
|
|
||||||
Au1xxx IDE(builtin) configured for MWDMA2
|
|
||||||
Probing IDE interface ide0...
|
|
||||||
hda: Maxtor 6E040L0, ATA DISK drive
|
|
||||||
ide0 at 0xac800000-0xac800007,0xac8001c0 on irq 64
|
|
||||||
hda: max request size: 64KiB
|
|
||||||
hda: 80293248 sectors (41110 MB) w/2048KiB Cache, CHS=65535/16/63, (U)DMA
|
|
||||||
--snipped--
|
|
||||||
|
|
||||||
In this example 'Maxtor 6E040L0'.
|
|
||||||
|
|
||||||
Step 2 : edit 'include/asm-mips/mach-au1x00/au1xxx_ide.h'
|
|
||||||
|
|
||||||
Add your hard disc to the dma_white_list or dma_black_list structur.
|
|
||||||
|
|
||||||
Step 3 : Recompile the kernel
|
|
||||||
|
|
||||||
Enable MWDMA support in the kernel configuration. Recompile the kernel and
|
|
||||||
reboot.
|
|
||||||
|
|
||||||
Step 4 : Tests
|
|
||||||
|
|
||||||
If you have add a hard disc to the white list, please run some stress tests
|
|
||||||
for verification.
|
|
||||||
|
|
||||||
|
|
||||||
ACKNOWLEDGMENTS
|
ACKNOWLEDGMENTS
|
||||||
---------------
|
---------------
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
|
|
||||||
-------
|
-------
|
||||||
PHY Abstraction Layer
|
PHY Abstraction Layer
|
||||||
(Updated 2006-11-30)
|
(Updated 2008-04-08)
|
||||||
|
|
||||||
Purpose
|
Purpose
|
||||||
|
|
||||||
|
@ -291,3 +291,39 @@ Writing a PHY driver
|
||||||
Feel free to look at the Marvell, Cicada, and Davicom drivers in
|
Feel free to look at the Marvell, Cicada, and Davicom drivers in
|
||||||
drivers/net/phy/ for examples (the lxt and qsemi drivers have
|
drivers/net/phy/ for examples (the lxt and qsemi drivers have
|
||||||
not been tested as of this writing)
|
not been tested as of this writing)
|
||||||
|
|
||||||
|
Board Fixups
|
||||||
|
|
||||||
|
Sometimes the specific interaction between the platform and the PHY requires
|
||||||
|
special handling. For instance, to change where the PHY's clock input is,
|
||||||
|
or to add a delay to account for latency issues in the data path. In order
|
||||||
|
to support such contingencies, the PHY Layer allows platform code to register
|
||||||
|
fixups to be run when the PHY is brought up (or subsequently reset).
|
||||||
|
|
||||||
|
When the PHY Layer brings up a PHY it checks to see if there are any fixups
|
||||||
|
registered for it, matching based on UID (contained in the PHY device's phy_id
|
||||||
|
field) and the bus identifier (contained in phydev->dev.bus_id). Both must
|
||||||
|
match, however two constants, PHY_ANY_ID and PHY_ANY_UID, are provided as
|
||||||
|
wildcards for the bus ID and UID, respectively.
|
||||||
|
|
||||||
|
When a match is found, the PHY layer will invoke the run function associated
|
||||||
|
with the fixup. This function is passed a pointer to the phy_device of
|
||||||
|
interest. It should therefore only operate on that PHY.
|
||||||
|
|
||||||
|
The platform code can either register the fixup using phy_register_fixup():
|
||||||
|
|
||||||
|
int phy_register_fixup(const char *phy_id,
|
||||||
|
u32 phy_uid, u32 phy_uid_mask,
|
||||||
|
int (*run)(struct phy_device *));
|
||||||
|
|
||||||
|
Or using one of the two stubs, phy_register_fixup_for_uid() and
|
||||||
|
phy_register_fixup_for_id():
|
||||||
|
|
||||||
|
int phy_register_fixup_for_uid(u32 phy_uid, u32 phy_uid_mask,
|
||||||
|
int (*run)(struct phy_device *));
|
||||||
|
int phy_register_fixup_for_id(const char *phy_id,
|
||||||
|
int (*run)(struct phy_device *));
|
||||||
|
|
||||||
|
The stubs set one of the two matching criteria, and set the other one to
|
||||||
|
match anything.
|
||||||
|
|
||||||
|
|
|
@ -253,6 +253,10 @@ characters, each representing a particular tainted value.
|
||||||
|
|
||||||
8: 'D' if the kernel has died recently, i.e. there was an OOPS or BUG.
|
8: 'D' if the kernel has died recently, i.e. there was an OOPS or BUG.
|
||||||
|
|
||||||
|
9: 'A' if the ACPI table has been overridden.
|
||||||
|
|
||||||
|
10: 'W' if a warning has previously been issued by the kernel.
|
||||||
|
|
||||||
The primary reason for the 'Tainted: ' string is to tell kernel
|
The primary reason for the 'Tainted: ' string is to tell kernel
|
||||||
debuggers if this is a clean kernel or if anything unusual has
|
debuggers if this is a clean kernel or if anything unusual has
|
||||||
occurred. Tainting is permanent: even if an offending module is
|
occurred. Tainting is permanent: even if an offending module is
|
||||||
|
|
|
@ -2601,6 +2601,17 @@ platforms are moved over to use the flattened-device-tree model.
|
||||||
differ between different families. May be
|
differ between different families. May be
|
||||||
'virtex2p', 'virtex4', or 'virtex5'.
|
'virtex2p', 'virtex4', or 'virtex5'.
|
||||||
|
|
||||||
|
vi) Xilinx Uart 16550
|
||||||
|
|
||||||
|
Xilinx UART 16550 devices are very similar to the NS16550 but with
|
||||||
|
different register spacing and an offset from the base address.
|
||||||
|
|
||||||
|
Requred properties:
|
||||||
|
- clock-frequency : Frequency of the clock input
|
||||||
|
- reg-offset : A value of 3 is required
|
||||||
|
- reg-shift : A value of 2 is required
|
||||||
|
|
||||||
|
|
||||||
p) Freescale Synchronous Serial Interface
|
p) Freescale Synchronous Serial Interface
|
||||||
|
|
||||||
The SSI is a serial device that communicates with audio codecs. It can
|
The SSI is a serial device that communicates with audio codecs. It can
|
||||||
|
@ -2825,6 +2836,39 @@ platforms are moved over to use the flattened-device-tree model.
|
||||||
big-endian;
|
big-endian;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
r) Freescale Display Interface Unit
|
||||||
|
|
||||||
|
The Freescale DIU is a LCD controller, with proper hardware, it can also
|
||||||
|
drive DVI monitors.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
- compatible : should be "fsl-diu".
|
||||||
|
- reg : should contain at least address and length of the DIU register
|
||||||
|
set.
|
||||||
|
- Interrupts : one DIU interrupt should be describe here.
|
||||||
|
|
||||||
|
Example (MPC8610HPCD)
|
||||||
|
display@2c000 {
|
||||||
|
compatible = "fsl,diu";
|
||||||
|
reg = <0x2c000 100>;
|
||||||
|
interrupts = <72 2>;
|
||||||
|
interrupt-parent = <&mpic>;
|
||||||
|
};
|
||||||
|
|
||||||
|
s) Freescale on board FPGA
|
||||||
|
|
||||||
|
This is the memory-mapped registers for on board FPGA.
|
||||||
|
|
||||||
|
Required properities:
|
||||||
|
- compatible : should be "fsl,fpga-pixis".
|
||||||
|
- reg : should contain the address and the lenght of the FPPGA register
|
||||||
|
set.
|
||||||
|
|
||||||
|
Example (MPC8610HPCD)
|
||||||
|
board-control@e8000000 {
|
||||||
|
compatible = "fsl,fpga-pixis";
|
||||||
|
reg = <0xe8000000 32>;
|
||||||
|
};
|
||||||
|
|
||||||
VII - Marvell Discovery mv64[345]6x System Controller chips
|
VII - Marvell Discovery mv64[345]6x System Controller chips
|
||||||
===========================================================
|
===========================================================
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
Hollis Blanchard <hollisb@us.ibm.com>
|
||||||
|
15 Apr 2008
|
||||||
|
|
||||||
|
Various notes on the implementation of KVM for PowerPC 440:
|
||||||
|
|
||||||
|
To enforce isolation, host userspace, guest kernel, and guest userspace all
|
||||||
|
run at user privilege level. Only the host kernel runs in supervisor mode.
|
||||||
|
Executing privileged instructions in the guest traps into KVM (in the host
|
||||||
|
kernel), where we decode and emulate them. Through this technique, unmodified
|
||||||
|
440 Linux kernels can be run (slowly) as guests. Future performance work will
|
||||||
|
focus on reducing the overhead and frequency of these traps.
|
||||||
|
|
||||||
|
The usual code flow is started from userspace invoking an "run" ioctl, which
|
||||||
|
causes KVM to switch into guest context. We use IVPR to hijack the host
|
||||||
|
interrupt vectors while running the guest, which allows us to direct all
|
||||||
|
interrupts to kvmppc_handle_interrupt(). At this point, we could either
|
||||||
|
- handle the interrupt completely (e.g. emulate "mtspr SPRG0"), or
|
||||||
|
- let the host interrupt handler run (e.g. when the decrementer fires), or
|
||||||
|
- return to host userspace (e.g. when the guest performs device MMIO)
|
||||||
|
|
||||||
|
Address spaces: We take advantage of the fact that Linux doesn't use the AS=1
|
||||||
|
address space (in host or guest), which gives us virtual address space to use
|
||||||
|
for guest mappings. While the guest is running, the host kernel remains mapped
|
||||||
|
in AS=0, but the guest can only use AS=1 mappings.
|
||||||
|
|
||||||
|
TLB entries: The TLB entries covering the host linear mapping remain
|
||||||
|
present while running the guest. This reduces the overhead of lightweight
|
||||||
|
exits, which are handled by KVM running in the host kernel. We keep three
|
||||||
|
copies of the TLB:
|
||||||
|
- guest TLB: contents of the TLB as the guest sees it
|
||||||
|
- shadow TLB: the TLB that is actually in hardware while guest is running
|
||||||
|
- host TLB: to restore TLB state when context switching guest -> host
|
||||||
|
When a TLB miss occurs because a mapping was not present in the shadow TLB,
|
||||||
|
but was present in the guest TLB, KVM handles the fault without invoking the
|
||||||
|
guest. Large guest pages are backed by multiple 4KB shadow pages through this
|
||||||
|
mechanism.
|
||||||
|
|
||||||
|
IO: MMIO and DCR accesses are emulated by userspace. We use virtio for network
|
||||||
|
and block IO, so those drivers must be enabled in the guest. It's possible
|
||||||
|
that some qemu device emulation (e.g. e1000 or rtl8139) may also work with
|
||||||
|
little effort.
|
|
@ -186,6 +186,12 @@ Recommended soc5200 child nodes; populate as needed for your board
|
||||||
name device_type compatible Description
|
name device_type compatible Description
|
||||||
---- ----------- ---------- -----------
|
---- ----------- ---------- -----------
|
||||||
gpt@<addr> gpt fsl,mpc5200-gpt General purpose timers
|
gpt@<addr> gpt fsl,mpc5200-gpt General purpose timers
|
||||||
|
gpt@<addr> gpt fsl,mpc5200-gpt-gpio General purpose
|
||||||
|
timers in GPIO mode
|
||||||
|
gpio@<addr> fsl,mpc5200-gpio MPC5200 simple gpio
|
||||||
|
controller
|
||||||
|
gpio@<addr> fsl,mpc5200-gpio-wkup MPC5200 wakeup gpio
|
||||||
|
controller
|
||||||
rtc@<addr> rtc mpc5200-rtc Real time clock
|
rtc@<addr> rtc mpc5200-rtc Real time clock
|
||||||
mscan@<addr> mscan mpc5200-mscan CAN bus controller
|
mscan@<addr> mscan mpc5200-mscan CAN bus controller
|
||||||
pci@<addr> pci mpc5200-pci PCI bridge
|
pci@<addr> pci mpc5200-pci PCI bridge
|
||||||
|
@ -225,6 +231,23 @@ PSC in i2s mode: The mpc5200 and mpc5200b PSCs are not compatible when in
|
||||||
i2s mode. An 'mpc5200b-psc-i2s' node cannot include 'mpc5200-psc-i2s' in the
|
i2s mode. An 'mpc5200b-psc-i2s' node cannot include 'mpc5200-psc-i2s' in the
|
||||||
compatible field.
|
compatible field.
|
||||||
|
|
||||||
|
7) GPIO controller nodes
|
||||||
|
Each GPIO controller node should have the empty property gpio-controller and
|
||||||
|
#gpio-cells set to 2. First cell is the GPIO number which is interpreted
|
||||||
|
according to the bit numbers in the GPIO control registers. The second cell
|
||||||
|
is for flags which is currently unsused.
|
||||||
|
|
||||||
|
8) FEC nodes
|
||||||
|
The FEC node can specify one of the following properties to configure
|
||||||
|
the MII link:
|
||||||
|
"fsl,7-wire-mode" - An empty property that specifies the link uses 7-wire
|
||||||
|
mode instead of MII
|
||||||
|
"current-speed" - Specifies that the MII should be configured for a fixed
|
||||||
|
speed. This property should contain two cells. The
|
||||||
|
first cell specifies the speed in Mbps and the second
|
||||||
|
should be '0' for half duplex and '1' for full duplex
|
||||||
|
"phy-handle" - Contains a phandle to an Ethernet PHY.
|
||||||
|
|
||||||
IV - Extra Notes
|
IV - Extra Notes
|
||||||
================
|
================
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,125 @@
|
||||||
|
*** BIG FAT WARNING ***
|
||||||
|
The kvm module is currently in EXPERIMENTAL state for s390. This means that
|
||||||
|
the interface to the module is not yet considered to remain stable. Thus, be
|
||||||
|
prepared that we keep breaking your userspace application and guest
|
||||||
|
compatibility over and over again until we feel happy with the result. Make sure
|
||||||
|
your guest kernel, your host kernel, and your userspace launcher are in a
|
||||||
|
consistent state.
|
||||||
|
|
||||||
|
This Documentation describes the unique ioctl calls to /dev/kvm, the resulting
|
||||||
|
kvm-vm file descriptors, and the kvm-vcpu file descriptors that differ from x86.
|
||||||
|
|
||||||
|
1. ioctl calls to /dev/kvm
|
||||||
|
KVM does support the following ioctls on s390 that are common with other
|
||||||
|
architectures and do behave the same:
|
||||||
|
KVM_GET_API_VERSION
|
||||||
|
KVM_CREATE_VM (*) see note
|
||||||
|
KVM_CHECK_EXTENSION
|
||||||
|
KVM_GET_VCPU_MMAP_SIZE
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
* KVM_CREATE_VM may fail on s390, if the calling process has multiple
|
||||||
|
threads and has not called KVM_S390_ENABLE_SIE before.
|
||||||
|
|
||||||
|
In addition, on s390 the following architecture specific ioctls are supported:
|
||||||
|
ioctl: KVM_S390_ENABLE_SIE
|
||||||
|
args: none
|
||||||
|
see also: include/linux/kvm.h
|
||||||
|
This call causes the kernel to switch on PGSTE in the user page table. This
|
||||||
|
operation is needed in order to run a virtual machine, and it requires the
|
||||||
|
calling process to be single-threaded. Note that the first call to KVM_CREATE_VM
|
||||||
|
will implicitly try to switch on PGSTE if the user process has not called
|
||||||
|
KVM_S390_ENABLE_SIE before. User processes that want to launch multiple threads
|
||||||
|
before creating a virtual machine have to call KVM_S390_ENABLE_SIE, or will
|
||||||
|
observe an error calling KVM_CREATE_VM. Switching on PGSTE is a one-time
|
||||||
|
operation, is not reversible, and will persist over the entire lifetime of
|
||||||
|
the calling process. It does not have any user-visible effect other than a small
|
||||||
|
performance penalty.
|
||||||
|
|
||||||
|
2. ioctl calls to the kvm-vm file descriptor
|
||||||
|
KVM does support the following ioctls on s390 that are common with other
|
||||||
|
architectures and do behave the same:
|
||||||
|
KVM_CREATE_VCPU
|
||||||
|
KVM_SET_USER_MEMORY_REGION (*) see note
|
||||||
|
KVM_GET_DIRTY_LOG (**) see note
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
* kvm does only allow exactly one memory slot on s390, which has to start
|
||||||
|
at guest absolute address zero and at a user address that is aligned on any
|
||||||
|
page boundary. This hardware "limitation" allows us to have a few unique
|
||||||
|
optimizations. The memory slot doesn't have to be filled
|
||||||
|
with memory actually, it may contain sparse holes. That said, with different
|
||||||
|
user memory layout this does still allow a large flexibility when
|
||||||
|
doing the guest memory setup.
|
||||||
|
** KVM_GET_DIRTY_LOG doesn't work properly yet. The user will receive an empty
|
||||||
|
log. This ioctl call is only needed for guest migration, and we intend to
|
||||||
|
implement this one in the future.
|
||||||
|
|
||||||
|
In addition, on s390 the following architecture specific ioctls for the kvm-vm
|
||||||
|
file descriptor are supported:
|
||||||
|
ioctl: KVM_S390_INTERRUPT
|
||||||
|
args: struct kvm_s390_interrupt *
|
||||||
|
see also: include/linux/kvm.h
|
||||||
|
This ioctl is used to submit a floating interrupt for a virtual machine.
|
||||||
|
Floating interrupts may be delivered to any virtual cpu in the configuration.
|
||||||
|
Only some interrupt types defined in include/linux/kvm.h make sense when
|
||||||
|
submitted as floating interrupts. The following interrupts are not considered
|
||||||
|
to be useful as floating interrupts, and a call to inject them will result in
|
||||||
|
-EINVAL error code: program interrupts and interprocessor signals. Valid
|
||||||
|
floating interrupts are:
|
||||||
|
KVM_S390_INT_VIRTIO
|
||||||
|
KVM_S390_INT_SERVICE
|
||||||
|
|
||||||
|
3. ioctl calls to the kvm-vcpu file descriptor
|
||||||
|
KVM does support the following ioctls on s390 that are common with other
|
||||||
|
architectures and do behave the same:
|
||||||
|
KVM_RUN
|
||||||
|
KVM_GET_REGS
|
||||||
|
KVM_SET_REGS
|
||||||
|
KVM_GET_SREGS
|
||||||
|
KVM_SET_SREGS
|
||||||
|
KVM_GET_FPU
|
||||||
|
KVM_SET_FPU
|
||||||
|
|
||||||
|
In addition, on s390 the following architecture specific ioctls for the
|
||||||
|
kvm-vcpu file descriptor are supported:
|
||||||
|
ioctl: KVM_S390_INTERRUPT
|
||||||
|
args: struct kvm_s390_interrupt *
|
||||||
|
see also: include/linux/kvm.h
|
||||||
|
This ioctl is used to submit an interrupt for a specific virtual cpu.
|
||||||
|
Only some interrupt types defined in include/linux/kvm.h make sense when
|
||||||
|
submitted for a specific cpu. The following interrupts are not considered
|
||||||
|
to be useful, and a call to inject them will result in -EINVAL error code:
|
||||||
|
service processor calls and virtio interrupts. Valid interrupt types are:
|
||||||
|
KVM_S390_PROGRAM_INT
|
||||||
|
KVM_S390_SIGP_STOP
|
||||||
|
KVM_S390_RESTART
|
||||||
|
KVM_S390_SIGP_SET_PREFIX
|
||||||
|
KVM_S390_INT_EMERGENCY
|
||||||
|
|
||||||
|
ioctl: KVM_S390_STORE_STATUS
|
||||||
|
args: unsigned long
|
||||||
|
see also: include/linux/kvm.h
|
||||||
|
This ioctl stores the state of the cpu at the guest real address given as
|
||||||
|
argument, unless one of the following values defined in include/linux/kvm.h
|
||||||
|
is given as arguement:
|
||||||
|
KVM_S390_STORE_STATUS_NOADDR - the CPU stores its status to the save area in
|
||||||
|
absolute lowcore as defined by the principles of operation
|
||||||
|
KVM_S390_STORE_STATUS_PREFIXED - the CPU stores its status to the save area in
|
||||||
|
its prefix page just like the dump tool that comes with zipl. This is useful
|
||||||
|
to create a system dump for use with lkcdutils or crash.
|
||||||
|
|
||||||
|
ioctl: KVM_S390_SET_INITIAL_PSW
|
||||||
|
args: struct kvm_s390_psw *
|
||||||
|
see also: include/linux/kvm.h
|
||||||
|
This ioctl can be used to set the processor status word (psw) of a stopped cpu
|
||||||
|
prior to running it with KVM_RUN. Note that this call is not required to modify
|
||||||
|
the psw during sie intercepts that fall back to userspace because struct kvm_run
|
||||||
|
does contain the psw, and this value is evaluated during reentry of KVM_RUN
|
||||||
|
after the intercept exit was recognized.
|
||||||
|
|
||||||
|
ioctl: KVM_S390_INITIAL_RESET
|
||||||
|
args: none
|
||||||
|
see also: include/linux/kvm.h
|
||||||
|
This ioctl can be used to perform an initial cpu reset as defined by the
|
||||||
|
principles of operation. The target cpu has to be in stopped state.
|
|
@ -1,165 +0,0 @@
|
||||||
Goals, Design and Implementation of the
|
|
||||||
new ultra-scalable O(1) scheduler
|
|
||||||
|
|
||||||
|
|
||||||
This is an edited version of an email Ingo Molnar sent to
|
|
||||||
lkml on 4 Jan 2002. It describes the goals, design, and
|
|
||||||
implementation of Ingo's new ultra-scalable O(1) scheduler.
|
|
||||||
Last Updated: 18 April 2002.
|
|
||||||
|
|
||||||
|
|
||||||
Goal
|
|
||||||
====
|
|
||||||
|
|
||||||
The main goal of the new scheduler is to keep all the good things we know
|
|
||||||
and love about the current Linux scheduler:
|
|
||||||
|
|
||||||
- good interactive performance even during high load: if the user
|
|
||||||
types or clicks then the system must react instantly and must execute
|
|
||||||
the user tasks smoothly, even during considerable background load.
|
|
||||||
|
|
||||||
- good scheduling/wakeup performance with 1-2 runnable processes.
|
|
||||||
|
|
||||||
- fairness: no process should stay without any timeslice for any
|
|
||||||
unreasonable amount of time. No process should get an unjustly high
|
|
||||||
amount of CPU time.
|
|
||||||
|
|
||||||
- priorities: less important tasks can be started with lower priority,
|
|
||||||
more important tasks with higher priority.
|
|
||||||
|
|
||||||
- SMP efficiency: no CPU should stay idle if there is work to do.
|
|
||||||
|
|
||||||
- SMP affinity: processes which run on one CPU should stay affine to
|
|
||||||
that CPU. Processes should not bounce between CPUs too frequently.
|
|
||||||
|
|
||||||
- plus additional scheduler features: RT scheduling, CPU binding.
|
|
||||||
|
|
||||||
and the goal is also to add a few new things:
|
|
||||||
|
|
||||||
- fully O(1) scheduling. Are you tired of the recalculation loop
|
|
||||||
blowing the L1 cache away every now and then? Do you think the goodness
|
|
||||||
loop is taking a bit too long to finish if there are lots of runnable
|
|
||||||
processes? This new scheduler takes no prisoners: wakeup(), schedule(),
|
|
||||||
the timer interrupt are all O(1) algorithms. There is no recalculation
|
|
||||||
loop. There is no goodness loop either.
|
|
||||||
|
|
||||||
- 'perfect' SMP scalability. With the new scheduler there is no 'big'
|
|
||||||
runqueue_lock anymore - it's all per-CPU runqueues and locks - two
|
|
||||||
tasks on two separate CPUs can wake up, schedule and context-switch
|
|
||||||
completely in parallel, without any interlocking. All
|
|
||||||
scheduling-relevant data is structured for maximum scalability.
|
|
||||||
|
|
||||||
- better SMP affinity. The old scheduler has a particular weakness that
|
|
||||||
causes the random bouncing of tasks between CPUs if/when higher
|
|
||||||
priority/interactive tasks, this was observed and reported by many
|
|
||||||
people. The reason is that the timeslice recalculation loop first needs
|
|
||||||
every currently running task to consume its timeslice. But when this
|
|
||||||
happens on eg. an 8-way system, then this property starves an
|
|
||||||
increasing number of CPUs from executing any process. Once the last
|
|
||||||
task that has a timeslice left has finished using up that timeslice,
|
|
||||||
the recalculation loop is triggered and other CPUs can start executing
|
|
||||||
tasks again - after having idled around for a number of timer ticks.
|
|
||||||
The more CPUs, the worse this effect.
|
|
||||||
|
|
||||||
Furthermore, this same effect causes the bouncing effect as well:
|
|
||||||
whenever there is such a 'timeslice squeeze' of the global runqueue,
|
|
||||||
idle processors start executing tasks which are not affine to that CPU.
|
|
||||||
(because the affine tasks have finished off their timeslices already.)
|
|
||||||
|
|
||||||
The new scheduler solves this problem by distributing timeslices on a
|
|
||||||
per-CPU basis, without having any global synchronization or
|
|
||||||
recalculation.
|
|
||||||
|
|
||||||
- batch scheduling. A significant proportion of computing-intensive tasks
|
|
||||||
benefit from batch-scheduling, where timeslices are long and processes
|
|
||||||
are roundrobin scheduled. The new scheduler does such batch-scheduling
|
|
||||||
of the lowest priority tasks - so nice +19 jobs will get
|
|
||||||
'batch-scheduled' automatically. With this scheduler, nice +19 jobs are
|
|
||||||
in essence SCHED_IDLE, from an interactiveness point of view.
|
|
||||||
|
|
||||||
- handle extreme loads more smoothly, without breakdown and scheduling
|
|
||||||
storms.
|
|
||||||
|
|
||||||
- O(1) RT scheduling. For those RT folks who are paranoid about the
|
|
||||||
O(nr_running) property of the goodness loop and the recalculation loop.
|
|
||||||
|
|
||||||
- run fork()ed children before the parent. Andrea has pointed out the
|
|
||||||
advantages of this a few months ago, but patches for this feature
|
|
||||||
do not work with the old scheduler as well as they should,
|
|
||||||
because idle processes often steal the new child before the fork()ing
|
|
||||||
CPU gets to execute it.
|
|
||||||
|
|
||||||
|
|
||||||
Design
|
|
||||||
======
|
|
||||||
|
|
||||||
The core of the new scheduler contains the following mechanisms:
|
|
||||||
|
|
||||||
- *two* priority-ordered 'priority arrays' per CPU. There is an 'active'
|
|
||||||
array and an 'expired' array. The active array contains all tasks that
|
|
||||||
are affine to this CPU and have timeslices left. The expired array
|
|
||||||
contains all tasks which have used up their timeslices - but this array
|
|
||||||
is kept sorted as well. The active and expired array is not accessed
|
|
||||||
directly, it's accessed through two pointers in the per-CPU runqueue
|
|
||||||
structure. If all active tasks are used up then we 'switch' the two
|
|
||||||
pointers and from now on the ready-to-go (former-) expired array is the
|
|
||||||
active array - and the empty active array serves as the new collector
|
|
||||||
for expired tasks.
|
|
||||||
|
|
||||||
- there is a 64-bit bitmap cache for array indices. Finding the highest
|
|
||||||
priority task is thus a matter of two x86 BSFL bit-search instructions.
|
|
||||||
|
|
||||||
the split-array solution enables us to have an arbitrary number of active
|
|
||||||
and expired tasks, and the recalculation of timeslices can be done
|
|
||||||
immediately when the timeslice expires. Because the arrays are always
|
|
||||||
access through the pointers in the runqueue, switching the two arrays can
|
|
||||||
be done very quickly.
|
|
||||||
|
|
||||||
this is a hybride priority-list approach coupled with roundrobin
|
|
||||||
scheduling and the array-switch method of distributing timeslices.
|
|
||||||
|
|
||||||
- there is a per-task 'load estimator'.
|
|
||||||
|
|
||||||
one of the toughest things to get right is good interactive feel during
|
|
||||||
heavy system load. While playing with various scheduler variants i found
|
|
||||||
that the best interactive feel is achieved not by 'boosting' interactive
|
|
||||||
tasks, but by 'punishing' tasks that want to use more CPU time than there
|
|
||||||
is available. This method is also much easier to do in an O(1) fashion.
|
|
||||||
|
|
||||||
to establish the actual 'load' the task contributes to the system, a
|
|
||||||
complex-looking but pretty accurate method is used: there is a 4-entry
|
|
||||||
'history' ringbuffer of the task's activities during the last 4 seconds.
|
|
||||||
This ringbuffer is operated without much overhead. The entries tell the
|
|
||||||
scheduler a pretty accurate load-history of the task: has it used up more
|
|
||||||
CPU time or less during the past N seconds. [the size '4' and the interval
|
|
||||||
of 4x 1 seconds was found by lots of experimentation - this part is
|
|
||||||
flexible and can be changed in both directions.]
|
|
||||||
|
|
||||||
the penalty a task gets for generating more load than the CPU can handle
|
|
||||||
is a priority decrease - there is a maximum amount to this penalty
|
|
||||||
relative to their static priority, so even fully CPU-bound tasks will
|
|
||||||
observe each other's priorities, and will share the CPU accordingly.
|
|
||||||
|
|
||||||
the SMP load-balancer can be extended/switched with additional parallel
|
|
||||||
computing and cache hierarchy concepts: NUMA scheduling, multi-core CPUs
|
|
||||||
can be supported easily by changing the load-balancer. Right now it's
|
|
||||||
tuned for my SMP systems.
|
|
||||||
|
|
||||||
i skipped the prev->mm == next->mm advantage - no workload i know of shows
|
|
||||||
any sensitivity to this. It can be added back by sacrificing O(1)
|
|
||||||
schedule() [the current and one-lower priority list can be searched for a
|
|
||||||
that->mm == current->mm condition], but costs a fair number of cycles
|
|
||||||
during a number of important workloads, so i wanted to avoid this as much
|
|
||||||
as possible.
|
|
||||||
|
|
||||||
- the SMP idle-task startup code was still racy and the new scheduler
|
|
||||||
triggered this. So i streamlined the idle-setup code a bit. We do not call
|
|
||||||
into schedule() before all processors have started up fully and all idle
|
|
||||||
threads are in place.
|
|
||||||
|
|
||||||
- the patch also cleans up a number of aspects of sched.c - moves code
|
|
||||||
into other areas of the kernel where it's appropriate, and simplifies
|
|
||||||
certain code paths and data constructs. As a result, the new scheduler's
|
|
||||||
code is smaller than the old one.
|
|
||||||
|
|
||||||
Ingo
|
|
|
@ -1,3 +1,25 @@
|
||||||
|
1 Release Date : Mon. March 10 11:02:31 PDT 2008 -
|
||||||
|
(emaild-id:megaraidlinux@lsi.com)
|
||||||
|
Sumant Patro
|
||||||
|
Bo Yang
|
||||||
|
|
||||||
|
2 Current Version : 00.00.03.20-RC1
|
||||||
|
3 Older Version : 00.00.03.16
|
||||||
|
|
||||||
|
1. Rollback the sense info implementation
|
||||||
|
Sense buffer ptr data type in the ioctl path is reverted back
|
||||||
|
to u32 * as in previous versions of driver.
|
||||||
|
|
||||||
|
2. Fixed the driver frame count.
|
||||||
|
When Driver sent wrong frame count to firmware. As this
|
||||||
|
particular command is sent to drive, FW is seeing continuous
|
||||||
|
chip resets and so the command will timeout.
|
||||||
|
|
||||||
|
3. Add the new controller(1078DE) support to the driver
|
||||||
|
and Increase the max_wait to 60 from 10 in the controller
|
||||||
|
operational status. With this max_wait increase, driver will
|
||||||
|
make sure the FW will finish the pending cmd for KDUMP case.
|
||||||
|
|
||||||
1 Release Date : Thur. Nov. 07 16:30:43 PST 2007 -
|
1 Release Date : Thur. Nov. 07 16:30:43 PST 2007 -
|
||||||
(emaild-id:megaraidlinux@lsi.com)
|
(emaild-id:megaraidlinux@lsi.com)
|
||||||
Sumant Patro
|
Sumant Patro
|
||||||
|
|
|
@ -1,98 +0,0 @@
|
||||||
Smart CONFIG_* Dependencies
|
|
||||||
1 August 1999
|
|
||||||
|
|
||||||
Michael Chastain <mec@shout.net>
|
|
||||||
Werner Almesberger <almesber@lrc.di.epfl.ch>
|
|
||||||
Martin von Loewis <martin@mira.isdn.cs.tu-berlin.de>
|
|
||||||
|
|
||||||
Here is the problem:
|
|
||||||
|
|
||||||
Suppose that drivers/net/foo.c has the following lines:
|
|
||||||
|
|
||||||
#include <linux/config.h>
|
|
||||||
|
|
||||||
...
|
|
||||||
|
|
||||||
#ifdef CONFIG_FOO_AUTOFROB
|
|
||||||
/* Code for auto-frobbing */
|
|
||||||
#else
|
|
||||||
/* Manual frobbing only */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
...
|
|
||||||
|
|
||||||
#ifdef CONFIG_FOO_MODEL_TWO
|
|
||||||
/* Code for model two */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
Now suppose the user (the person building kernels) reconfigures the
|
|
||||||
kernel to change some unrelated setting. This will regenerate the
|
|
||||||
file include/linux/autoconf.h, which will cause include/linux/config.h
|
|
||||||
to be out of date, which will cause drivers/net/foo.c to be recompiled.
|
|
||||||
|
|
||||||
Most kernel sources, perhaps 80% of them, have at least one CONFIG_*
|
|
||||||
dependency somewhere. So changing _any_ CONFIG_* setting requires
|
|
||||||
almost _all_ of the kernel to be recompiled.
|
|
||||||
|
|
||||||
Here is the solution:
|
|
||||||
|
|
||||||
We've made the dependency generator, mkdep.c, smarter. Instead of
|
|
||||||
generating this dependency:
|
|
||||||
|
|
||||||
drivers/net/foo.c: include/linux/config.h
|
|
||||||
|
|
||||||
It now generates these dependencies:
|
|
||||||
|
|
||||||
drivers/net/foo.c: \
|
|
||||||
include/config/foo/autofrob.h \
|
|
||||||
include/config/foo/model/two.h
|
|
||||||
|
|
||||||
So drivers/net/foo.c depends only on the CONFIG_* lines that
|
|
||||||
it actually uses.
|
|
||||||
|
|
||||||
A new program, split-include.c, runs at the beginning of
|
|
||||||
compilation (make bzImage or make zImage). split-include reads
|
|
||||||
include/linux/autoconf.h and updates the include/config/ tree,
|
|
||||||
writing one file per option. It updates only the files for options
|
|
||||||
that have changed.
|
|
||||||
|
|
||||||
Flag Dependencies
|
|
||||||
|
|
||||||
Martin Von Loewis contributed another feature to this patch:
|
|
||||||
'flag dependencies'. The idea is that a .o file depends on
|
|
||||||
the compilation flags used to build it. The file foo.o has
|
|
||||||
its flags stored in .flags.foo.o.
|
|
||||||
|
|
||||||
Suppose the user changes the foo driver from resident to modular.
|
|
||||||
'make' will notice that the current foo.o was not compiled with
|
|
||||||
-DMODULE and will recompile foo.c.
|
|
||||||
|
|
||||||
All .o files made from C source have flag dependencies. So do .o
|
|
||||||
files made with ld, and .a files made with ar. However, .o files
|
|
||||||
made from assembly source do not have flag dependencies (nobody
|
|
||||||
needs this yet, but it would be good to fix).
|
|
||||||
|
|
||||||
Per-source-file Flags
|
|
||||||
|
|
||||||
Flag dependencies also work with per-source-file flags.
|
|
||||||
You can specify compilation flags for individual source files
|
|
||||||
like this:
|
|
||||||
|
|
||||||
CFLAGS_foo.o = -DSPECIAL_FOO_DEFINE
|
|
||||||
|
|
||||||
This helps clean up drivers/net/Makefile, drivers/scsi/Makefile,
|
|
||||||
and several other Makefiles.
|
|
||||||
|
|
||||||
Credit
|
|
||||||
|
|
||||||
Werner Almesberger had the original idea and wrote the first
|
|
||||||
version of this patch.
|
|
||||||
|
|
||||||
Michael Chastain picked it up and continued development. He is
|
|
||||||
now the principal author and maintainer. Please report any bugs
|
|
||||||
to him.
|
|
||||||
|
|
||||||
Martin von Loewis wrote flag dependencies, with some modifications
|
|
||||||
by Michael Chastain.
|
|
||||||
|
|
||||||
Thanks to all of the beta testers.
|
|
|
@ -284,6 +284,13 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||||
control correctly. If you have problems regarding this, try
|
control correctly. If you have problems regarding this, try
|
||||||
another ALSA compliant mixer (alsamixer works).
|
another ALSA compliant mixer (alsamixer works).
|
||||||
|
|
||||||
|
Module snd-aw2
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Module for Audiowerk2 sound card
|
||||||
|
|
||||||
|
This module supports multiple cards.
|
||||||
|
|
||||||
Module snd-azt2320
|
Module snd-azt2320
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
|
@ -788,6 +795,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||||
lg-lw LG LW20/LW25 laptop
|
lg-lw LG LW20/LW25 laptop
|
||||||
tcl TCL S700
|
tcl TCL S700
|
||||||
clevo Clevo laptops (m520G, m665n)
|
clevo Clevo laptops (m520G, m665n)
|
||||||
|
medion Medion Rim 2150
|
||||||
test for testing/debugging purpose, almost all controls can be
|
test for testing/debugging purpose, almost all controls can be
|
||||||
adjusted. Appearing only when compiled with
|
adjusted. Appearing only when compiled with
|
||||||
$CONFIG_SND_DEBUG=y
|
$CONFIG_SND_DEBUG=y
|
||||||
|
@ -818,19 +826,25 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||||
hippo_1 Hippo (Benq) with jack detection
|
hippo_1 Hippo (Benq) with jack detection
|
||||||
sony-assamd Sony ASSAMD
|
sony-assamd Sony ASSAMD
|
||||||
ultra Samsung Q1 Ultra Vista model
|
ultra Samsung Q1 Ultra Vista model
|
||||||
|
lenovo-3000 Lenovo 3000 y410
|
||||||
basic fixed pin assignment w/o SPDIF
|
basic fixed pin assignment w/o SPDIF
|
||||||
auto auto-config reading BIOS (default)
|
auto auto-config reading BIOS (default)
|
||||||
|
|
||||||
ALC268
|
ALC267/268
|
||||||
|
quanta-il1 Quanta IL1 mini-notebook
|
||||||
3stack 3-stack model
|
3stack 3-stack model
|
||||||
toshiba Toshiba A205
|
toshiba Toshiba A205
|
||||||
acer Acer laptops
|
acer Acer laptops
|
||||||
dell Dell OEM laptops (Vostro 1200)
|
dell Dell OEM laptops (Vostro 1200)
|
||||||
|
zepto Zepto laptops
|
||||||
test for testing/debugging purpose, almost all controls can
|
test for testing/debugging purpose, almost all controls can
|
||||||
adjusted. Appearing only when compiled with
|
adjusted. Appearing only when compiled with
|
||||||
$CONFIG_SND_DEBUG=y
|
$CONFIG_SND_DEBUG=y
|
||||||
auto auto-config reading BIOS (default)
|
auto auto-config reading BIOS (default)
|
||||||
|
|
||||||
|
ALC269
|
||||||
|
basic Basic preset
|
||||||
|
|
||||||
ALC662
|
ALC662
|
||||||
3stack-dig 3-stack (2-channel) with SPDIF
|
3stack-dig 3-stack (2-channel) with SPDIF
|
||||||
3stack-6ch 3-stack (6-channel)
|
3stack-6ch 3-stack (6-channel)
|
||||||
|
@ -871,10 +885,11 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||||
lenovo-nb0763 Lenovo NB0763
|
lenovo-nb0763 Lenovo NB0763
|
||||||
lenovo-ms7195-dig Lenovo MS7195
|
lenovo-ms7195-dig Lenovo MS7195
|
||||||
haier-w66 Haier W66
|
haier-w66 Haier W66
|
||||||
6stack-hp HP machines with 6stack (Nettle boards)
|
|
||||||
3stack-hp HP machines with 3stack (Lucknow, Samba boards)
|
3stack-hp HP machines with 3stack (Lucknow, Samba boards)
|
||||||
6stack-dell Dell machines with 6stack (Inspiron 530)
|
6stack-dell Dell machines with 6stack (Inspiron 530)
|
||||||
mitac Mitac 8252D
|
mitac Mitac 8252D
|
||||||
|
clevo-m720 Clevo M720 laptop series
|
||||||
|
fujitsu-pi2515 Fujitsu AMILO Pi2515
|
||||||
auto auto-config reading BIOS (default)
|
auto auto-config reading BIOS (default)
|
||||||
|
|
||||||
ALC861/660
|
ALC861/660
|
||||||
|
@ -911,6 +926,12 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||||
3stack 3-stack mode (default)
|
3stack 3-stack mode (default)
|
||||||
6stack 6-stack mode
|
6stack 6-stack mode
|
||||||
|
|
||||||
|
AD1884A / AD1883 / AD1984A / AD1984B
|
||||||
|
desktop 3-stack desktop (default)
|
||||||
|
laptop laptop with HP jack sensing
|
||||||
|
mobile mobile devices with HP jack sensing
|
||||||
|
thinkpad Lenovo Thinkpad X300
|
||||||
|
|
||||||
AD1884
|
AD1884
|
||||||
N/A
|
N/A
|
||||||
|
|
||||||
|
@ -936,7 +957,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||||
laptop-automute 2-channel with EAPD and HP-automute (Lenovo N100)
|
laptop-automute 2-channel with EAPD and HP-automute (Lenovo N100)
|
||||||
ultra 2-channel with EAPD (Samsung Ultra tablet PC)
|
ultra 2-channel with EAPD (Samsung Ultra tablet PC)
|
||||||
|
|
||||||
AD1988
|
AD1988/AD1988B/AD1989A/AD1989B
|
||||||
6stack 6-jack
|
6stack 6-jack
|
||||||
6stack-dig ditto with SPDIF
|
6stack-dig ditto with SPDIF
|
||||||
3stack 3-jack
|
3stack 3-jack
|
||||||
|
@ -979,6 +1000,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||||
dell-m26 Dell Inspiron 1501
|
dell-m26 Dell Inspiron 1501
|
||||||
dell-m27 Dell Inspiron E1705/9400
|
dell-m27 Dell Inspiron E1705/9400
|
||||||
gateway Gateway laptops with EAPD control
|
gateway Gateway laptops with EAPD control
|
||||||
|
panasonic Panasonic CF-74
|
||||||
|
|
||||||
STAC9205/9254
|
STAC9205/9254
|
||||||
ref Reference board
|
ref Reference board
|
||||||
|
@ -1017,6 +1039,16 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||||
3stack D965 3stack
|
3stack D965 3stack
|
||||||
5stack D965 5stack + SPDIF
|
5stack D965 5stack + SPDIF
|
||||||
dell-3stack Dell Dimension E520
|
dell-3stack Dell Dimension E520
|
||||||
|
dell-bios Fixes with Dell BIOS setup
|
||||||
|
|
||||||
|
STAC92HD71B*
|
||||||
|
ref Reference board
|
||||||
|
dell-m4-1 Dell desktops
|
||||||
|
dell-m4-2 Dell desktops
|
||||||
|
|
||||||
|
STAC92HD73*
|
||||||
|
ref Reference board
|
||||||
|
dell-m6 Dell desktops
|
||||||
|
|
||||||
STAC9872
|
STAC9872
|
||||||
vaio Setup for VAIO FE550G/SZ110
|
vaio Setup for VAIO FE550G/SZ110
|
||||||
|
@ -1590,6 +1622,16 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||||
|
|
||||||
Power management is _not_ supported.
|
Power management is _not_ supported.
|
||||||
|
|
||||||
|
Module snd-pcsp
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
Module for internal PC-Speaker.
|
||||||
|
|
||||||
|
nforce_wa - enable NForce chipset workaround. Expect bad sound.
|
||||||
|
|
||||||
|
This module supports system beeps, some kind of PCM playback and
|
||||||
|
even a few mixer controls.
|
||||||
|
|
||||||
Module snd-pcxhr
|
Module snd-pcxhr
|
||||||
----------------
|
----------------
|
||||||
|
|
||||||
|
|
|
@ -126,8 +126,8 @@ NOTES:
|
||||||
FULL DUPLEX CHARACTER DEVICE API
|
FULL DUPLEX CHARACTER DEVICE API
|
||||||
================================
|
================================
|
||||||
|
|
||||||
See the sample program below for one example showing the use of the full
|
See the spidev_fdx.c sample program for one example showing the use of the
|
||||||
duplex programming interface. (Although it doesn't perform a full duplex
|
full duplex programming interface. (Although it doesn't perform a full duplex
|
||||||
transfer.) The model is the same as that used in the kernel spi_sync()
|
transfer.) The model is the same as that used in the kernel spi_sync()
|
||||||
request; the individual transfers offer the same capabilities as are
|
request; the individual transfers offer the same capabilities as are
|
||||||
available to kernel drivers (except that it's not asynchronous).
|
available to kernel drivers (except that it's not asynchronous).
|
||||||
|
@ -141,167 +141,3 @@ and bitrate for each transfer segment.)
|
||||||
|
|
||||||
To make a full duplex request, provide both rx_buf and tx_buf for the
|
To make a full duplex request, provide both rx_buf and tx_buf for the
|
||||||
same transfer. It's even OK if those are the same buffer.
|
same transfer. It's even OK if those are the same buffer.
|
||||||
|
|
||||||
|
|
||||||
SAMPLE PROGRAM
|
|
||||||
==============
|
|
||||||
|
|
||||||
-------------------------------- CUT HERE
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include <sys/ioctl.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
|
|
||||||
#include <linux/types.h>
|
|
||||||
#include <linux/spi/spidev.h>
|
|
||||||
|
|
||||||
|
|
||||||
static int verbose;
|
|
||||||
|
|
||||||
static void do_read(int fd, int len)
|
|
||||||
{
|
|
||||||
unsigned char buf[32], *bp;
|
|
||||||
int status;
|
|
||||||
|
|
||||||
/* read at least 2 bytes, no more than 32 */
|
|
||||||
if (len < 2)
|
|
||||||
len = 2;
|
|
||||||
else if (len > sizeof(buf))
|
|
||||||
len = sizeof(buf);
|
|
||||||
memset(buf, 0, sizeof buf);
|
|
||||||
|
|
||||||
status = read(fd, buf, len);
|
|
||||||
if (status < 0) {
|
|
||||||
perror("read");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (status != len) {
|
|
||||||
fprintf(stderr, "short read\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("read(%2d, %2d): %02x %02x,", len, status,
|
|
||||||
buf[0], buf[1]);
|
|
||||||
status -= 2;
|
|
||||||
bp = buf + 2;
|
|
||||||
while (status-- > 0)
|
|
||||||
printf(" %02x", *bp++);
|
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void do_msg(int fd, int len)
|
|
||||||
{
|
|
||||||
struct spi_ioc_transfer xfer[2];
|
|
||||||
unsigned char buf[32], *bp;
|
|
||||||
int status;
|
|
||||||
|
|
||||||
memset(xfer, 0, sizeof xfer);
|
|
||||||
memset(buf, 0, sizeof buf);
|
|
||||||
|
|
||||||
if (len > sizeof buf)
|
|
||||||
len = sizeof buf;
|
|
||||||
|
|
||||||
buf[0] = 0xaa;
|
|
||||||
xfer[0].tx_buf = (__u64) buf;
|
|
||||||
xfer[0].len = 1;
|
|
||||||
|
|
||||||
xfer[1].rx_buf = (__u64) buf;
|
|
||||||
xfer[1].len = len;
|
|
||||||
|
|
||||||
status = ioctl(fd, SPI_IOC_MESSAGE(2), xfer);
|
|
||||||
if (status < 0) {
|
|
||||||
perror("SPI_IOC_MESSAGE");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("response(%2d, %2d): ", len, status);
|
|
||||||
for (bp = buf; len; len--)
|
|
||||||
printf(" %02x", *bp++);
|
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void dumpstat(const char *name, int fd)
|
|
||||||
{
|
|
||||||
__u8 mode, lsb, bits;
|
|
||||||
__u32 speed;
|
|
||||||
|
|
||||||
if (ioctl(fd, SPI_IOC_RD_MODE, &mode) < 0) {
|
|
||||||
perror("SPI rd_mode");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (ioctl(fd, SPI_IOC_RD_LSB_FIRST, &lsb) < 0) {
|
|
||||||
perror("SPI rd_lsb_fist");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits) < 0) {
|
|
||||||
perror("SPI bits_per_word");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed) < 0) {
|
|
||||||
perror("SPI max_speed_hz");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("%s: spi mode %d, %d bits %sper word, %d Hz max\n",
|
|
||||||
name, mode, bits, lsb ? "(lsb first) " : "", speed);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
int c;
|
|
||||||
int readcount = 0;
|
|
||||||
int msglen = 0;
|
|
||||||
int fd;
|
|
||||||
const char *name;
|
|
||||||
|
|
||||||
while ((c = getopt(argc, argv, "hm:r:v")) != EOF) {
|
|
||||||
switch (c) {
|
|
||||||
case 'm':
|
|
||||||
msglen = atoi(optarg);
|
|
||||||
if (msglen < 0)
|
|
||||||
goto usage;
|
|
||||||
continue;
|
|
||||||
case 'r':
|
|
||||||
readcount = atoi(optarg);
|
|
||||||
if (readcount < 0)
|
|
||||||
goto usage;
|
|
||||||
continue;
|
|
||||||
case 'v':
|
|
||||||
verbose++;
|
|
||||||
continue;
|
|
||||||
case 'h':
|
|
||||||
case '?':
|
|
||||||
usage:
|
|
||||||
fprintf(stderr,
|
|
||||||
"usage: %s [-h] [-m N] [-r N] /dev/spidevB.D\n",
|
|
||||||
argv[0]);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((optind + 1) != argc)
|
|
||||||
goto usage;
|
|
||||||
name = argv[optind];
|
|
||||||
|
|
||||||
fd = open(name, O_RDWR);
|
|
||||||
if (fd < 0) {
|
|
||||||
perror("open");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
dumpstat(name, fd);
|
|
||||||
|
|
||||||
if (msglen)
|
|
||||||
do_msg(fd, msglen);
|
|
||||||
|
|
||||||
if (readcount)
|
|
||||||
do_read(fd, readcount);
|
|
||||||
|
|
||||||
close(fd);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
|
@ -0,0 +1,158 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
#include <linux/types.h>
|
||||||
|
#include <linux/spi/spidev.h>
|
||||||
|
|
||||||
|
|
||||||
|
static int verbose;
|
||||||
|
|
||||||
|
static void do_read(int fd, int len)
|
||||||
|
{
|
||||||
|
unsigned char buf[32], *bp;
|
||||||
|
int status;
|
||||||
|
|
||||||
|
/* read at least 2 bytes, no more than 32 */
|
||||||
|
if (len < 2)
|
||||||
|
len = 2;
|
||||||
|
else if (len > sizeof(buf))
|
||||||
|
len = sizeof(buf);
|
||||||
|
memset(buf, 0, sizeof buf);
|
||||||
|
|
||||||
|
status = read(fd, buf, len);
|
||||||
|
if (status < 0) {
|
||||||
|
perror("read");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (status != len) {
|
||||||
|
fprintf(stderr, "short read\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("read(%2d, %2d): %02x %02x,", len, status,
|
||||||
|
buf[0], buf[1]);
|
||||||
|
status -= 2;
|
||||||
|
bp = buf + 2;
|
||||||
|
while (status-- > 0)
|
||||||
|
printf(" %02x", *bp++);
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void do_msg(int fd, int len)
|
||||||
|
{
|
||||||
|
struct spi_ioc_transfer xfer[2];
|
||||||
|
unsigned char buf[32], *bp;
|
||||||
|
int status;
|
||||||
|
|
||||||
|
memset(xfer, 0, sizeof xfer);
|
||||||
|
memset(buf, 0, sizeof buf);
|
||||||
|
|
||||||
|
if (len > sizeof buf)
|
||||||
|
len = sizeof buf;
|
||||||
|
|
||||||
|
buf[0] = 0xaa;
|
||||||
|
xfer[0].tx_buf = (__u64) buf;
|
||||||
|
xfer[0].len = 1;
|
||||||
|
|
||||||
|
xfer[1].rx_buf = (__u64) buf;
|
||||||
|
xfer[1].len = len;
|
||||||
|
|
||||||
|
status = ioctl(fd, SPI_IOC_MESSAGE(2), xfer);
|
||||||
|
if (status < 0) {
|
||||||
|
perror("SPI_IOC_MESSAGE");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("response(%2d, %2d): ", len, status);
|
||||||
|
for (bp = buf; len; len--)
|
||||||
|
printf(" %02x", *bp++);
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dumpstat(const char *name, int fd)
|
||||||
|
{
|
||||||
|
__u8 mode, lsb, bits;
|
||||||
|
__u32 speed;
|
||||||
|
|
||||||
|
if (ioctl(fd, SPI_IOC_RD_MODE, &mode) < 0) {
|
||||||
|
perror("SPI rd_mode");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (ioctl(fd, SPI_IOC_RD_LSB_FIRST, &lsb) < 0) {
|
||||||
|
perror("SPI rd_lsb_fist");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits) < 0) {
|
||||||
|
perror("SPI bits_per_word");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed) < 0) {
|
||||||
|
perror("SPI max_speed_hz");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("%s: spi mode %d, %d bits %sper word, %d Hz max\n",
|
||||||
|
name, mode, bits, lsb ? "(lsb first) " : "", speed);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
int c;
|
||||||
|
int readcount = 0;
|
||||||
|
int msglen = 0;
|
||||||
|
int fd;
|
||||||
|
const char *name;
|
||||||
|
|
||||||
|
while ((c = getopt(argc, argv, "hm:r:v")) != EOF) {
|
||||||
|
switch (c) {
|
||||||
|
case 'm':
|
||||||
|
msglen = atoi(optarg);
|
||||||
|
if (msglen < 0)
|
||||||
|
goto usage;
|
||||||
|
continue;
|
||||||
|
case 'r':
|
||||||
|
readcount = atoi(optarg);
|
||||||
|
if (readcount < 0)
|
||||||
|
goto usage;
|
||||||
|
continue;
|
||||||
|
case 'v':
|
||||||
|
verbose++;
|
||||||
|
continue;
|
||||||
|
case 'h':
|
||||||
|
case '?':
|
||||||
|
usage:
|
||||||
|
fprintf(stderr,
|
||||||
|
"usage: %s [-h] [-m N] [-r N] /dev/spidevB.D\n",
|
||||||
|
argv[0]);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((optind + 1) != argc)
|
||||||
|
goto usage;
|
||||||
|
name = argv[optind];
|
||||||
|
|
||||||
|
fd = open(name, O_RDWR);
|
||||||
|
if (fd < 0) {
|
||||||
|
perror("open");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
dumpstat(name, fd);
|
||||||
|
|
||||||
|
if (msglen)
|
||||||
|
do_msg(fd, msglen);
|
||||||
|
|
||||||
|
if (readcount)
|
||||||
|
do_read(fd, readcount);
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -85,6 +85,8 @@ On all - write a character to /proc/sysrq-trigger. e.g.:
|
||||||
'k' - Secure Access Key (SAK) Kills all programs on the current virtual
|
'k' - Secure Access Key (SAK) Kills all programs on the current virtual
|
||||||
console. NOTE: See important comments below in SAK section.
|
console. NOTE: See important comments below in SAK section.
|
||||||
|
|
||||||
|
'l' - Shows a stack backtrace for all active CPUs.
|
||||||
|
|
||||||
'm' - Will dump current memory info to your console.
|
'm' - Will dump current memory info to your console.
|
||||||
|
|
||||||
'n' - Used to make RT tasks nice-able
|
'n' - Used to make RT tasks nice-able
|
||||||
|
|
|
@ -108,10 +108,12 @@ and throttle appropriate devices.
|
||||||
RO read only value
|
RO read only value
|
||||||
RW read/write value
|
RW read/write value
|
||||||
|
|
||||||
All thermal sysfs attributes will be represented under /sys/class/thermal
|
Thermal sysfs attributes will be represented under /sys/class/thermal.
|
||||||
|
Hwmon sysfs I/F extension is also available under /sys/class/hwmon
|
||||||
|
if hwmon is compiled in or built as a module.
|
||||||
|
|
||||||
Thermal zone device sys I/F, created once it's registered:
|
Thermal zone device sys I/F, created once it's registered:
|
||||||
|thermal_zone[0-*]:
|
/sys/class/thermal/thermal_zone[0-*]:
|
||||||
|-----type: Type of the thermal zone
|
|-----type: Type of the thermal zone
|
||||||
|-----temp: Current temperature
|
|-----temp: Current temperature
|
||||||
|-----mode: Working mode of the thermal zone
|
|-----mode: Working mode of the thermal zone
|
||||||
|
@ -119,7 +121,7 @@ Thermal zone device sys I/F, created once it's registered:
|
||||||
|-----trip_point_[0-*]_type: Trip point type
|
|-----trip_point_[0-*]_type: Trip point type
|
||||||
|
|
||||||
Thermal cooling device sys I/F, created once it's registered:
|
Thermal cooling device sys I/F, created once it's registered:
|
||||||
|cooling_device[0-*]:
|
/sys/class/thermal/cooling_device[0-*]:
|
||||||
|-----type : Type of the cooling device(processor/fan/...)
|
|-----type : Type of the cooling device(processor/fan/...)
|
||||||
|-----max_state: Maximum cooling state of the cooling device
|
|-----max_state: Maximum cooling state of the cooling device
|
||||||
|-----cur_state: Current cooling state of the cooling device
|
|-----cur_state: Current cooling state of the cooling device
|
||||||
|
@ -130,10 +132,19 @@ They represent the relationship between a thermal zone and its associated coolin
|
||||||
They are created/removed for each
|
They are created/removed for each
|
||||||
thermal_zone_bind_cooling_device/thermal_zone_unbind_cooling_device successful execution.
|
thermal_zone_bind_cooling_device/thermal_zone_unbind_cooling_device successful execution.
|
||||||
|
|
||||||
|thermal_zone[0-*]
|
/sys/class/thermal/thermal_zone[0-*]
|
||||||
|-----cdev[0-*]: The [0-*]th cooling device in the current thermal zone
|
|-----cdev[0-*]: The [0-*]th cooling device in the current thermal zone
|
||||||
|-----cdev[0-*]_trip_point: Trip point that cdev[0-*] is associated with
|
|-----cdev[0-*]_trip_point: Trip point that cdev[0-*] is associated with
|
||||||
|
|
||||||
|
Besides the thermal zone device sysfs I/F and cooling device sysfs I/F,
|
||||||
|
the generic thermal driver also creates a hwmon sysfs I/F for each _type_ of
|
||||||
|
thermal zone device. E.g. the generic thermal driver registers one hwmon class device
|
||||||
|
and build the associated hwmon sysfs I/F for all the registered ACPI thermal zones.
|
||||||
|
/sys/class/hwmon/hwmon[0-*]:
|
||||||
|
|-----name: The type of the thermal zone devices.
|
||||||
|
|-----temp[1-*]_input: The current temperature of thermal zone [1-*].
|
||||||
|
|-----temp[1-*]_critical: The critical trip point of thermal zone [1-*].
|
||||||
|
Please read Documentation/hwmon/sysfs-interface for additional information.
|
||||||
|
|
||||||
***************************
|
***************************
|
||||||
* Thermal zone attributes *
|
* Thermal zone attributes *
|
||||||
|
@ -141,7 +152,10 @@ thermal_zone_bind_cooling_device/thermal_zone_unbind_cooling_device successful e
|
||||||
|
|
||||||
type Strings which represent the thermal zone type.
|
type Strings which represent the thermal zone type.
|
||||||
This is given by thermal zone driver as part of registration.
|
This is given by thermal zone driver as part of registration.
|
||||||
Eg: "ACPI thermal zone" indicates it's a ACPI thermal device
|
Eg: "acpitz" indicates it's an ACPI thermal device.
|
||||||
|
In order to keep it consistent with hwmon sys attribute,
|
||||||
|
this should be a short, lowercase string,
|
||||||
|
not containing spaces nor dashes.
|
||||||
RO
|
RO
|
||||||
Required
|
Required
|
||||||
|
|
||||||
|
@ -218,7 +232,7 @@ the sys I/F structure will be built like this:
|
||||||
/sys/class/thermal:
|
/sys/class/thermal:
|
||||||
|
|
||||||
|thermal_zone1:
|
|thermal_zone1:
|
||||||
|-----type: ACPI thermal zone
|
|-----type: acpitz
|
||||||
|-----temp: 37000
|
|-----temp: 37000
|
||||||
|-----mode: kernel
|
|-----mode: kernel
|
||||||
|-----trip_point_0_temp: 100000
|
|-----trip_point_0_temp: 100000
|
||||||
|
@ -243,3 +257,10 @@ the sys I/F structure will be built like this:
|
||||||
|-----type: Fan
|
|-----type: Fan
|
||||||
|-----max_state: 2
|
|-----max_state: 2
|
||||||
|-----cur_state: 0
|
|-----cur_state: 0
|
||||||
|
|
||||||
|
/sys/class/hwmon:
|
||||||
|
|
||||||
|
|hwmon0:
|
||||||
|
|-----name: acpitz
|
||||||
|
|-----temp1_input: 37000
|
||||||
|
|-----temp1_crit: 100000
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
What is anchor?
|
||||||
|
===============
|
||||||
|
|
||||||
|
A USB driver needs to support some callbacks requiring
|
||||||
|
a driver to cease all IO to an interface. To do so, a
|
||||||
|
driver has to keep track of the URBs it has submitted
|
||||||
|
to know they've all completed or to call usb_kill_urb
|
||||||
|
for them. The anchor is a data structure takes care of
|
||||||
|
keeping track of URBs and provides methods to deal with
|
||||||
|
multiple URBs.
|
||||||
|
|
||||||
|
Allocation and Initialisation
|
||||||
|
=============================
|
||||||
|
|
||||||
|
There's no API to allocate an anchor. It is simply declared
|
||||||
|
as struct usb_anchor. init_usb_anchor() must be called to
|
||||||
|
initialise the data structure.
|
||||||
|
|
||||||
|
Deallocation
|
||||||
|
============
|
||||||
|
|
||||||
|
Once it has no more URBs associated with it, the anchor can be
|
||||||
|
freed with normal memory management operations.
|
||||||
|
|
||||||
|
Association and disassociation of URBs with anchors
|
||||||
|
===================================================
|
||||||
|
|
||||||
|
An association of URBs to an anchor is made by an explicit
|
||||||
|
call to usb_anchor_urb(). The association is maintained until
|
||||||
|
an URB is finished by (successfull) completion. Thus disassociation
|
||||||
|
is automatic. A function is provided to forcibly finish (kill)
|
||||||
|
all URBs associated with an anchor.
|
||||||
|
Furthermore, disassociation can be made with usb_unanchor_urb()
|
||||||
|
|
||||||
|
Operations on multitudes of URBs
|
||||||
|
================================
|
||||||
|
|
||||||
|
usb_kill_anchored_urbs()
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
This function kills all URBs associated with an anchor. The URBs
|
||||||
|
are called in the reverse temporal order they were submitted.
|
||||||
|
This way no data can be reordered.
|
||||||
|
|
||||||
|
usb_wait_anchor_empty_timeout()
|
||||||
|
-------------------------------
|
||||||
|
|
||||||
|
This function waits for all URBs associated with an anchor to finish
|
||||||
|
or a timeout, whichever comes first. Its return value will tell you
|
||||||
|
whether the timeout was reached.
|
|
@ -0,0 +1,132 @@
|
||||||
|
What callbacks will usbcore do?
|
||||||
|
===============================
|
||||||
|
|
||||||
|
Usbcore will call into a driver through callbacks defined in the driver
|
||||||
|
structure and through the completion handler of URBs a driver submits.
|
||||||
|
Only the former are in the scope of this document. These two kinds of
|
||||||
|
callbacks are completely independent of each other. Information on the
|
||||||
|
completion callback can be found in Documentation/usb/URB.txt.
|
||||||
|
|
||||||
|
The callbacks defined in the driver structure are:
|
||||||
|
|
||||||
|
1. Hotplugging callbacks:
|
||||||
|
|
||||||
|
* @probe: Called to see if the driver is willing to manage a particular
|
||||||
|
* interface on a device.
|
||||||
|
* @disconnect: Called when the interface is no longer accessible, usually
|
||||||
|
* because its device has been (or is being) disconnected or the
|
||||||
|
* driver module is being unloaded.
|
||||||
|
|
||||||
|
2. Odd backdoor through usbfs:
|
||||||
|
|
||||||
|
* @ioctl: Used for drivers that want to talk to userspace through
|
||||||
|
* the "usbfs" filesystem. This lets devices provide ways to
|
||||||
|
* expose information to user space regardless of where they
|
||||||
|
* do (or don't) show up otherwise in the filesystem.
|
||||||
|
|
||||||
|
3. Power management (PM) callbacks:
|
||||||
|
|
||||||
|
* @suspend: Called when the device is going to be suspended.
|
||||||
|
* @resume: Called when the device is being resumed.
|
||||||
|
* @reset_resume: Called when the suspended device has been reset instead
|
||||||
|
* of being resumed.
|
||||||
|
|
||||||
|
4. Device level operations:
|
||||||
|
|
||||||
|
* @pre_reset: Called when the device is about to be reset.
|
||||||
|
* @post_reset: Called after the device has been reset
|
||||||
|
|
||||||
|
The ioctl interface (2) should be used only if you have a very good
|
||||||
|
reason. Sysfs is preferred these days. The PM callbacks are covered
|
||||||
|
separately in Documentation/usb/power-management.txt.
|
||||||
|
|
||||||
|
Calling conventions
|
||||||
|
===================
|
||||||
|
|
||||||
|
All callbacks are mutually exclusive. There's no need for locking
|
||||||
|
against other USB callbacks. All callbacks are called from a task
|
||||||
|
context. You may sleep. However, it is important that all sleeps have a
|
||||||
|
small fixed upper limit in time. In particular you must not call out to
|
||||||
|
user space and await results.
|
||||||
|
|
||||||
|
Hotplugging callbacks
|
||||||
|
=====================
|
||||||
|
|
||||||
|
These callbacks are intended to associate and disassociate a driver with
|
||||||
|
an interface. A driver's bond to an interface is exclusive.
|
||||||
|
|
||||||
|
The probe() callback
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
int (*probe) (struct usb_interface *intf,
|
||||||
|
const struct usb_device_id *id);
|
||||||
|
|
||||||
|
Accept or decline an interface. If you accept the device return 0,
|
||||||
|
otherwise -ENODEV or -ENXIO. Other error codes should be used only if a
|
||||||
|
genuine error occurred during initialisation which prevented a driver
|
||||||
|
from accepting a device that would else have been accepted.
|
||||||
|
You are strongly encouraged to use usbcore'sfacility,
|
||||||
|
usb_set_intfdata(), to associate a data structure with an interface, so
|
||||||
|
that you know which internal state and identity you associate with a
|
||||||
|
particular interface. The device will not be suspended and you may do IO
|
||||||
|
to the interface you are called for and endpoint 0 of the device. Device
|
||||||
|
initialisation that doesn't take too long is a good idea here.
|
||||||
|
|
||||||
|
The disconnect() callback
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
void (*disconnect) (struct usb_interface *intf);
|
||||||
|
|
||||||
|
This callback is a signal to break any connection with an interface.
|
||||||
|
You are not allowed any IO to a device after returning from this
|
||||||
|
callback. You also may not do any other operation that may interfere
|
||||||
|
with another driver bound the interface, eg. a power management
|
||||||
|
operation.
|
||||||
|
If you are called due to a physical disconnection, all your URBs will be
|
||||||
|
killed by usbcore. Note that in this case disconnect will be called some
|
||||||
|
time after the physical disconnection. Thus your driver must be prepared
|
||||||
|
to deal with failing IO even prior to the callback.
|
||||||
|
|
||||||
|
Device level callbacks
|
||||||
|
======================
|
||||||
|
|
||||||
|
pre_reset
|
||||||
|
---------
|
||||||
|
|
||||||
|
int (*pre_reset)(struct usb_interface *intf);
|
||||||
|
|
||||||
|
Another driver or user space is triggering a reset on the device which
|
||||||
|
contains the interface passed as an argument. Cease IO and save any
|
||||||
|
device state you need to restore.
|
||||||
|
|
||||||
|
If you need to allocate memory here, use GFP_NOIO or GFP_ATOMIC, if you
|
||||||
|
are in atomic context.
|
||||||
|
|
||||||
|
post_reset
|
||||||
|
----------
|
||||||
|
|
||||||
|
int (*post_reset)(struct usb_interface *intf);
|
||||||
|
|
||||||
|
The reset has completed. Restore any saved device state and begin
|
||||||
|
using the device again.
|
||||||
|
|
||||||
|
If you need to allocate memory here, use GFP_NOIO or GFP_ATOMIC, if you
|
||||||
|
are in atomic context.
|
||||||
|
|
||||||
|
Call sequences
|
||||||
|
==============
|
||||||
|
|
||||||
|
No callbacks other than probe will be invoked for an interface
|
||||||
|
that isn't bound to your driver.
|
||||||
|
|
||||||
|
Probe will never be called for an interface bound to a driver.
|
||||||
|
Hence following a successful probe, disconnect will be called
|
||||||
|
before there is another probe for the same interface.
|
||||||
|
|
||||||
|
Once your driver is bound to an interface, disconnect can be
|
||||||
|
called at any time except in between pre_reset and post_reset.
|
||||||
|
pre_reset is always followed by post_reset, even if the reset
|
||||||
|
failed or the device has been unplugged.
|
||||||
|
|
||||||
|
suspend is always followed by one of: resume, reset_resume, or
|
||||||
|
disconnect.
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
Alan Stern <stern@rowland.harvard.edu>
|
Alan Stern <stern@rowland.harvard.edu>
|
||||||
|
|
||||||
September 2, 2006 (Updated May 29, 2007)
|
September 2, 2006 (Updated February 25, 2008)
|
||||||
|
|
||||||
|
|
||||||
What is the problem?
|
What is the problem?
|
||||||
|
@ -65,9 +65,10 @@ much better.)
|
||||||
|
|
||||||
What is the solution?
|
What is the solution?
|
||||||
|
|
||||||
Setting CONFIG_USB_PERSIST will cause the kernel to work around these
|
The kernel includes a feature called USB-persist. It tries to work
|
||||||
issues. It enables a mode in which the core USB device data
|
around these issues by allowing the core USB device data structures to
|
||||||
structures are allowed to persist across a power-session disruption.
|
persist across a power-session disruption.
|
||||||
|
|
||||||
It works like this. If the kernel sees that a USB host controller is
|
It works like this. If the kernel sees that a USB host controller is
|
||||||
not in the expected state during resume (i.e., if the controller was
|
not in the expected state during resume (i.e., if the controller was
|
||||||
reset or otherwise had lost power) then it applies a persistence check
|
reset or otherwise had lost power) then it applies a persistence check
|
||||||
|
@ -80,28 +81,30 @@ re-enumeration shows that the device now attached to that port has the
|
||||||
same descriptors as before, including the Vendor and Product IDs, then
|
same descriptors as before, including the Vendor and Product IDs, then
|
||||||
the kernel continues to use the same device structure. In effect, the
|
the kernel continues to use the same device structure. In effect, the
|
||||||
kernel treats the device as though it had merely been reset instead of
|
kernel treats the device as though it had merely been reset instead of
|
||||||
unplugged.
|
unplugged. The same thing happens if the host controller is in the
|
||||||
|
expected state but a USB device was unplugged and then replugged.
|
||||||
|
|
||||||
If no device is now attached to the port, or if the descriptors are
|
If no device is now attached to the port, or if the descriptors are
|
||||||
different from what the kernel remembers, then the treatment is what
|
different from what the kernel remembers, then the treatment is what
|
||||||
you would expect. The kernel destroys the old device structure and
|
you would expect. The kernel destroys the old device structure and
|
||||||
behaves as though the old device had been unplugged and a new device
|
behaves as though the old device had been unplugged and a new device
|
||||||
plugged in, just as it would without the CONFIG_USB_PERSIST option.
|
plugged in.
|
||||||
|
|
||||||
The end result is that the USB device remains available and usable.
|
The end result is that the USB device remains available and usable.
|
||||||
Filesystem mounts and memory mappings are unaffected, and the world is
|
Filesystem mounts and memory mappings are unaffected, and the world is
|
||||||
now a good and happy place.
|
now a good and happy place.
|
||||||
|
|
||||||
Note that even when CONFIG_USB_PERSIST is set, the "persist" feature
|
Note that the "USB-persist" feature will be applied only to those
|
||||||
will be applied only to those devices for which it is enabled. You
|
devices for which it is enabled. You can enable the feature by doing
|
||||||
can enable the feature by doing (as root):
|
(as root):
|
||||||
|
|
||||||
echo 1 >/sys/bus/usb/devices/.../power/persist
|
echo 1 >/sys/bus/usb/devices/.../power/persist
|
||||||
|
|
||||||
where the "..." should be filled in the with the device's ID. Disable
|
where the "..." should be filled in the with the device's ID. Disable
|
||||||
the feature by writing 0 instead of 1. For hubs the feature is
|
the feature by writing 0 instead of 1. For hubs the feature is
|
||||||
automatically and permanently enabled, so you only have to worry about
|
automatically and permanently enabled and the power/persist file
|
||||||
setting it for devices where it really matters.
|
doesn't even exist, so you only have to worry about setting it for
|
||||||
|
devices where it really matters.
|
||||||
|
|
||||||
|
|
||||||
Is this the best solution?
|
Is this the best solution?
|
||||||
|
@ -112,19 +115,19 @@ centralized Logical Volume Manager. Such a solution would allow you
|
||||||
to plug in a USB flash device, create a persistent volume associated
|
to plug in a USB flash device, create a persistent volume associated
|
||||||
with it, unplug the flash device, plug it back in later, and still
|
with it, unplug the flash device, plug it back in later, and still
|
||||||
have the same persistent volume associated with the device. As such
|
have the same persistent volume associated with the device. As such
|
||||||
it would be more far-reaching than CONFIG_USB_PERSIST.
|
it would be more far-reaching than USB-persist.
|
||||||
|
|
||||||
On the other hand, writing a persistent volume manager would be a big
|
On the other hand, writing a persistent volume manager would be a big
|
||||||
job and using it would require significant input from the user. This
|
job and using it would require significant input from the user. This
|
||||||
solution is much quicker and easier -- and it exists now, a giant
|
solution is much quicker and easier -- and it exists now, a giant
|
||||||
point in its favor!
|
point in its favor!
|
||||||
|
|
||||||
Furthermore, the USB_PERSIST option applies to _all_ USB devices, not
|
Furthermore, the USB-persist feature applies to _all_ USB devices, not
|
||||||
just mass-storage devices. It might turn out to be equally useful for
|
just mass-storage devices. It might turn out to be equally useful for
|
||||||
other device types, such as network interfaces.
|
other device types, such as network interfaces.
|
||||||
|
|
||||||
|
|
||||||
WARNING: Using CONFIG_USB_PERSIST can be dangerous!!
|
WARNING: USB-persist can be dangerous!!
|
||||||
|
|
||||||
When recovering an interrupted power session the kernel does its best
|
When recovering an interrupted power session the kernel does its best
|
||||||
to make sure the USB device hasn't been changed; that is, the same
|
to make sure the USB device hasn't been changed; that is, the same
|
||||||
|
@ -133,10 +136,10 @@ aren't guaranteed to be 100% accurate.
|
||||||
|
|
||||||
If you replace one USB device with another of the same type (same
|
If you replace one USB device with another of the same type (same
|
||||||
manufacturer, same IDs, and so on) there's an excellent chance the
|
manufacturer, same IDs, and so on) there's an excellent chance the
|
||||||
kernel won't detect the change. Serial numbers and other strings are
|
kernel won't detect the change. The serial number string and other
|
||||||
not compared. In many cases it wouldn't help if they were, because
|
descriptors are compared with the kernel's stored values, but this
|
||||||
manufacturers frequently omit serial numbers entirely in their
|
might not help since manufacturers frequently omit serial numbers
|
||||||
devices.
|
entirely in their devices.
|
||||||
|
|
||||||
Furthermore it's quite possible to leave a USB device exactly the same
|
Furthermore it's quite possible to leave a USB device exactly the same
|
||||||
while changing its media. If you replace the flash memory card in a
|
while changing its media. If you replace the flash memory card in a
|
||||||
|
@ -152,5 +155,5 @@ but yourself.
|
||||||
YOU HAVE BEEN WARNED! USE AT YOUR OWN RISK!
|
YOU HAVE BEEN WARNED! USE AT YOUR OWN RISK!
|
||||||
|
|
||||||
That having been said, most of the time there shouldn't be any trouble
|
That having been said, most of the time there shouldn't be any trouble
|
||||||
at all. The "persist" feature can be extremely useful. Make the most
|
at all. The USB-persist feature can be extremely useful. Make the
|
||||||
of it.
|
most of it.
|
||||||
|
|
|
@ -192,12 +192,9 @@ Keyspan USA-series Serial Adapters
|
||||||
|
|
||||||
FTDI Single Port Serial Driver
|
FTDI Single Port Serial Driver
|
||||||
|
|
||||||
This is a single port DB-25 serial adapter. More information about this
|
This is a single port DB-25 serial adapter.
|
||||||
device and the Linux driver can be found at:
|
|
||||||
http://reality.sgi.com/bryder_wellington/ftdi_sio/
|
|
||||||
|
|
||||||
For any questions or problems with this driver, please contact Bill Ryder
|
For any questions or problems with this driver, please contact Bill Ryder.
|
||||||
at bryder@sgi.com
|
|
||||||
|
|
||||||
|
|
||||||
ZyXEL omni.net lcd plus ISDN TA
|
ZyXEL omni.net lcd plus ISDN TA
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
0 -> Unknown board (au0828)
|
||||||
|
1 -> Hauppauge HVR950Q (au0828) [2040:7200]
|
||||||
|
2 -> Hauppauge HVR850 (au0828) [2040:7240]
|
||||||
|
3 -> DViCO FusionHDTV USB (au0828) [0fe9:d620]
|
|
@ -148,3 +148,5 @@
|
||||||
147 -> VoodooTV 200 (USA) [121a:3000]
|
147 -> VoodooTV 200 (USA) [121a:3000]
|
||||||
148 -> DViCO FusionHDTV 2 [dbc0:d200]
|
148 -> DViCO FusionHDTV 2 [dbc0:d200]
|
||||||
149 -> Typhoon TV-Tuner PCI (50684)
|
149 -> Typhoon TV-Tuner PCI (50684)
|
||||||
|
150 -> Geovision GV-600 [008a:763c]
|
||||||
|
151 -> Kozumi KTV-01C
|
||||||
|
|
|
@ -5,3 +5,6 @@
|
||||||
4 -> DViCO FusionHDTV5 Express [18ac:d500]
|
4 -> DViCO FusionHDTV5 Express [18ac:d500]
|
||||||
5 -> Hauppauge WinTV-HVR1500Q [0070:7790,0070:7797]
|
5 -> Hauppauge WinTV-HVR1500Q [0070:7790,0070:7797]
|
||||||
6 -> Hauppauge WinTV-HVR1500 [0070:7710,0070:7717]
|
6 -> Hauppauge WinTV-HVR1500 [0070:7710,0070:7717]
|
||||||
|
7 -> Hauppauge WinTV-HVR1200 [0070:71d1]
|
||||||
|
8 -> Hauppauge WinTV-HVR1700 [0070:8101]
|
||||||
|
9 -> Hauppauge WinTV-HVR1400 [0070:8010]
|
||||||
|
|
|
@ -57,3 +57,12 @@
|
||||||
56 -> Hauppauge WinTV-HVR1300 DVB-T/Hybrid MPEG Encoder [0070:9600,0070:9601,0070:9602]
|
56 -> Hauppauge WinTV-HVR1300 DVB-T/Hybrid MPEG Encoder [0070:9600,0070:9601,0070:9602]
|
||||||
57 -> ADS Tech Instant Video PCI [1421:0390]
|
57 -> ADS Tech Instant Video PCI [1421:0390]
|
||||||
58 -> Pinnacle PCTV HD 800i [11bd:0051]
|
58 -> Pinnacle PCTV HD 800i [11bd:0051]
|
||||||
|
59 -> DViCO FusionHDTV 5 PCI nano [18ac:d530]
|
||||||
|
60 -> Pinnacle Hybrid PCTV [12ab:1788]
|
||||||
|
61 -> Winfast TV2000 XP Global [107d:6f18]
|
||||||
|
62 -> PowerColor Real Angel 330 [14f1:ea3d]
|
||||||
|
63 -> Geniatech X8000-MT DVBT [14f1:8852]
|
||||||
|
64 -> DViCO FusionHDTV DVB-T PRO [18ac:db30]
|
||||||
|
65 -> DViCO FusionHDTV 7 Gold [18ac:d610]
|
||||||
|
66 -> Prolink Pixelview MPEG 8000GT [1554:4935]
|
||||||
|
67 -> Kworld PlusTV HD PCI 120 (ATSC 120) [17de:08c1]
|
||||||
|
|
|
@ -25,8 +25,8 @@
|
||||||
24 -> KNC One TV-Station DVR [1894:a006]
|
24 -> KNC One TV-Station DVR [1894:a006]
|
||||||
25 -> ASUS TV-FM 7133 [1043:4843]
|
25 -> ASUS TV-FM 7133 [1043:4843]
|
||||||
26 -> Pinnacle PCTV Stereo (saa7134) [11bd:002b]
|
26 -> Pinnacle PCTV Stereo (saa7134) [11bd:002b]
|
||||||
27 -> Manli MuchTV M-TV002/Behold TV 403 FM
|
27 -> Manli MuchTV M-TV002
|
||||||
28 -> Manli MuchTV M-TV001/Behold TV 401
|
28 -> Manli MuchTV M-TV001
|
||||||
29 -> Nagase Sangyo TransGear 3000TV [1461:050c]
|
29 -> Nagase Sangyo TransGear 3000TV [1461:050c]
|
||||||
30 -> Elitegroup ECS TVP3XP FM1216 Tuner Card(PAL-BG,FM) [1019:4cb4]
|
30 -> Elitegroup ECS TVP3XP FM1216 Tuner Card(PAL-BG,FM) [1019:4cb4]
|
||||||
31 -> Elitegroup ECS TVP3XP FM1236 Tuner Card (NTSC,FM) [1019:4cb5]
|
31 -> Elitegroup ECS TVP3XP FM1236 Tuner Card (NTSC,FM) [1019:4cb5]
|
||||||
|
@ -128,6 +128,16 @@
|
||||||
127 -> Beholder BeholdTV 507 FM/RDS / BeholdTV 509 FM [0000:5071,0000:507B,5ace:5070,5ace:5090]
|
127 -> Beholder BeholdTV 507 FM/RDS / BeholdTV 509 FM [0000:5071,0000:507B,5ace:5070,5ace:5090]
|
||||||
128 -> Beholder BeholdTV Columbus TVFM [0000:5201]
|
128 -> Beholder BeholdTV Columbus TVFM [0000:5201]
|
||||||
129 -> Beholder BeholdTV 607 / BeholdTV 609 [5ace:6070,5ace:6071,5ace:6072,5ace:6073,5ace:6090,5ace:6091,5ace:6092,5ace:6093]
|
129 -> Beholder BeholdTV 607 / BeholdTV 609 [5ace:6070,5ace:6071,5ace:6072,5ace:6073,5ace:6090,5ace:6091,5ace:6092,5ace:6093]
|
||||||
130 -> Beholder BeholdTV M6 / BeholdTV M6 Extra [5ace:6190,5ace:6193]
|
130 -> Beholder BeholdTV M6 / BeholdTV M6 Extra [5ace:6190,5ace:6193,5ace:6191]
|
||||||
131 -> Twinhan Hybrid DTV-DVB 3056 PCI [1822:0022]
|
131 -> Twinhan Hybrid DTV-DVB 3056 PCI [1822:0022]
|
||||||
132 -> Genius TVGO AM11MCE
|
132 -> Genius TVGO AM11MCE
|
||||||
|
133 -> NXP Snake DVB-S reference design
|
||||||
|
134 -> Medion/Creatix CTX953 Hybrid [16be:0010]
|
||||||
|
135 -> MSI TV@nywhere A/D v1.1 [1462:8625]
|
||||||
|
136 -> AVerMedia Cardbus TV/Radio (E506R) [1461:f436]
|
||||||
|
137 -> AVerMedia Hybrid TV/Radio (A16D) [1461:f936]
|
||||||
|
138 -> Avermedia M115 [1461:a836]
|
||||||
|
139 -> Compro VideoMate T750 [185b:c900]
|
||||||
|
140 -> Avermedia DVB-S Pro A700 [1461:a7a1]
|
||||||
|
141 -> Avermedia DVB-S Hybrid+FM A700 [1461:a7a2]
|
||||||
|
142 -> Beholder BeholdTV H6 [5ace:6290]
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
Some notes regarding the cx18 driver for the Conexant CX23418 MPEG
|
||||||
|
encoder chip:
|
||||||
|
|
||||||
|
1) The only hardware currently supported is the Hauppauge HVR-1600.
|
||||||
|
|
||||||
|
2) Some people have problems getting the i2c bus to work. Cause unknown.
|
||||||
|
The symptom is that the eeprom cannot be read and the card is
|
||||||
|
unusable.
|
||||||
|
|
||||||
|
3) The audio from the analog tuner is mono only. Probably caused by
|
||||||
|
incorrect audio register information in the datasheet. We are
|
||||||
|
waiting for updated information from Conexant.
|
||||||
|
|
||||||
|
4) VBI (raw or sliced) has not yet been implemented.
|
||||||
|
|
||||||
|
5) MPEG indexing is not yet implemented.
|
||||||
|
|
||||||
|
6) The driver is still a bit rough around the edges, this should
|
||||||
|
improve over time.
|
||||||
|
|
||||||
|
|
||||||
|
Firmware:
|
||||||
|
|
||||||
|
The firmware needs to be extracted from the Windows Hauppauge HVR-1600
|
||||||
|
driver, available here:
|
||||||
|
|
||||||
|
http://hauppauge.lightpath.net/software/install_cd/hauppauge_cd_3.4d1.zip
|
||||||
|
|
||||||
|
Unzip, then copy the following files to the firmware directory
|
||||||
|
and rename them as follows:
|
||||||
|
|
||||||
|
Drivers/Driver18/hcw18apu.rom -> v4l-cx23418-apu.fw
|
||||||
|
Drivers/Driver18/hcw18enc.rom -> v4l-cx23418-cpu.fw
|
||||||
|
Drivers/Driver18/hcw18mlC.rom -> v4l-cx23418-dig.fw
|
|
@ -686,11 +686,11 @@ sub main_firmware($$$$)
|
||||||
write_hunk(812664, 192);
|
write_hunk(812664, 192);
|
||||||
|
|
||||||
#
|
#
|
||||||
# Firmware 58, type: SCODE FW HAS IF (0x60000000), IF = 4.50 MHz id: NTSC/M Jp (0000000000002000), size: 192
|
# Firmware 58, type: SCODE FW MTS LCD NOGD MONO IF HAS IF (0x6002b004), IF = 4.50 MHz id: NTSC PAL/M PAL/N (000000000000b700), size: 192
|
||||||
#
|
#
|
||||||
|
|
||||||
write_le32(0x60000000); # Type
|
write_le32(0x6002b004); # Type
|
||||||
write_le64(0x00000000, 0x00002000); # ID
|
write_le64(0x00000000, 0x0000b700); # ID
|
||||||
write_le16(4500); # IF
|
write_le16(4500); # IF
|
||||||
write_le32(192); # Size
|
write_le32(192); # Size
|
||||||
write_hunk(807672, 192);
|
write_hunk(807672, 192);
|
||||||
|
@ -706,10 +706,10 @@ sub main_firmware($$$$)
|
||||||
write_hunk(807864, 192);
|
write_hunk(807864, 192);
|
||||||
|
|
||||||
#
|
#
|
||||||
# Firmware 60, type: SCODE FW DTV78 ZARLINK456 HAS IF (0x62000100), IF = 4.76 MHz id: (0000000000000000), size: 192
|
# Firmware 60, type: SCODE FW DTV6 QAM DTV7 DTV78 DTV8 ZARLINK456 HAS IF (0x620003e0), IF = 4.76 MHz id: (0000000000000000), size: 192
|
||||||
#
|
#
|
||||||
|
|
||||||
write_le32(0x62000100); # Type
|
write_le32(0x620003e0); # Type
|
||||||
write_le64(0x00000000, 0x00000000); # ID
|
write_le64(0x00000000, 0x00000000); # ID
|
||||||
write_le16(4760); # IF
|
write_le16(4760); # IF
|
||||||
write_le32(192); # Size
|
write_le32(192); # Size
|
||||||
|
@ -726,30 +726,30 @@ sub main_firmware($$$$)
|
||||||
write_hunk(811512, 192);
|
write_hunk(811512, 192);
|
||||||
|
|
||||||
#
|
#
|
||||||
# Firmware 62, type: SCODE FW DTV7 ZARLINK456 HAS IF (0x62000080), IF = 5.26 MHz id: (0000000000000000), size: 192
|
# Firmware 62, type: SCODE FW HAS IF (0x60000000), IF = 5.26 MHz id: (0000000000000000), size: 192
|
||||||
#
|
#
|
||||||
|
|
||||||
write_le32(0x62000080); # Type
|
write_le32(0x60000000); # Type
|
||||||
write_le64(0x00000000, 0x00000000); # ID
|
write_le64(0x00000000, 0x00000000); # ID
|
||||||
write_le16(5260); # IF
|
write_le16(5260); # IF
|
||||||
write_le32(192); # Size
|
write_le32(192); # Size
|
||||||
write_hunk(810552, 192);
|
write_hunk(810552, 192);
|
||||||
|
|
||||||
#
|
#
|
||||||
# Firmware 63, type: SCODE FW MONO HAS IF (0x60008000), IF = 5.32 MHz id: PAL/BG NICAM/B (0000000800000007), size: 192
|
# Firmware 63, type: SCODE FW MONO HAS IF (0x60008000), IF = 5.32 MHz id: PAL/BG A2 NICAM (0000000f00000007), size: 192
|
||||||
#
|
#
|
||||||
|
|
||||||
write_le32(0x60008000); # Type
|
write_le32(0x60008000); # Type
|
||||||
write_le64(0x00000008, 0x00000007); # ID
|
write_le64(0x0000000f, 0x00000007); # ID
|
||||||
write_le16(5320); # IF
|
write_le16(5320); # IF
|
||||||
write_le32(192); # Size
|
write_le32(192); # Size
|
||||||
write_hunk(810744, 192);
|
write_hunk(810744, 192);
|
||||||
|
|
||||||
#
|
#
|
||||||
# Firmware 64, type: SCODE FW DTV8 CHINA HAS IF (0x64000200), IF = 5.40 MHz id: (0000000000000000), size: 192
|
# Firmware 64, type: SCODE FW DTV7 DTV78 DTV8 DIBCOM52 CHINA HAS IF (0x65000380), IF = 5.40 MHz id: (0000000000000000), size: 192
|
||||||
#
|
#
|
||||||
|
|
||||||
write_le32(0x64000200); # Type
|
write_le32(0x65000380); # Type
|
||||||
write_le64(0x00000000, 0x00000000); # ID
|
write_le64(0x00000000, 0x00000000); # ID
|
||||||
write_le16(5400); # IF
|
write_le16(5400); # IF
|
||||||
write_le32(192); # Size
|
write_le32(192); # Size
|
||||||
|
@ -766,50 +766,50 @@ sub main_firmware($$$$)
|
||||||
write_hunk(809592, 192);
|
write_hunk(809592, 192);
|
||||||
|
|
||||||
#
|
#
|
||||||
# Firmware 66, type: SCODE FW HAS IF (0x60000000), IF = 5.64 MHz id: PAL/BG A2/B (0000000200000007), size: 192
|
# Firmware 66, type: SCODE FW HAS IF (0x60000000), IF = 5.64 MHz id: PAL/BG A2 (0000000300000007), size: 192
|
||||||
#
|
#
|
||||||
|
|
||||||
write_le32(0x60000000); # Type
|
write_le32(0x60000000); # Type
|
||||||
write_le64(0x00000002, 0x00000007); # ID
|
write_le64(0x00000003, 0x00000007); # ID
|
||||||
write_le16(5640); # IF
|
write_le16(5640); # IF
|
||||||
write_le32(192); # Size
|
write_le32(192); # Size
|
||||||
write_hunk(808440, 192);
|
write_hunk(808440, 192);
|
||||||
|
|
||||||
#
|
#
|
||||||
# Firmware 67, type: SCODE FW HAS IF (0x60000000), IF = 5.74 MHz id: PAL/BG NICAM/B (0000000800000007), size: 192
|
# Firmware 67, type: SCODE FW HAS IF (0x60000000), IF = 5.74 MHz id: PAL/BG NICAM (0000000c00000007), size: 192
|
||||||
#
|
#
|
||||||
|
|
||||||
write_le32(0x60000000); # Type
|
write_le32(0x60000000); # Type
|
||||||
write_le64(0x00000008, 0x00000007); # ID
|
write_le64(0x0000000c, 0x00000007); # ID
|
||||||
write_le16(5740); # IF
|
write_le16(5740); # IF
|
||||||
write_le32(192); # Size
|
write_le32(192); # Size
|
||||||
write_hunk(808632, 192);
|
write_hunk(808632, 192);
|
||||||
|
|
||||||
#
|
#
|
||||||
# Firmware 68, type: SCODE FW DTV7 DIBCOM52 HAS IF (0x61000080), IF = 5.90 MHz id: (0000000000000000), size: 192
|
# Firmware 68, type: SCODE FW HAS IF (0x60000000), IF = 5.90 MHz id: (0000000000000000), size: 192
|
||||||
#
|
#
|
||||||
|
|
||||||
write_le32(0x61000080); # Type
|
write_le32(0x60000000); # Type
|
||||||
write_le64(0x00000000, 0x00000000); # ID
|
write_le64(0x00000000, 0x00000000); # ID
|
||||||
write_le16(5900); # IF
|
write_le16(5900); # IF
|
||||||
write_le32(192); # Size
|
write_le32(192); # Size
|
||||||
write_hunk(810360, 192);
|
write_hunk(810360, 192);
|
||||||
|
|
||||||
#
|
#
|
||||||
# Firmware 69, type: SCODE FW MONO HAS IF (0x60008000), IF = 6.00 MHz id: PAL/I (0000000000000010), size: 192
|
# Firmware 69, type: SCODE FW MONO HAS IF (0x60008000), IF = 6.00 MHz id: PAL/DK PAL/I SECAM/K3 SECAM/L SECAM/Lc NICAM (0000000c04c000f0), size: 192
|
||||||
#
|
#
|
||||||
|
|
||||||
write_le32(0x60008000); # Type
|
write_le32(0x60008000); # Type
|
||||||
write_le64(0x00000000, 0x00000010); # ID
|
write_le64(0x0000000c, 0x04c000f0); # ID
|
||||||
write_le16(6000); # IF
|
write_le16(6000); # IF
|
||||||
write_le32(192); # Size
|
write_le32(192); # Size
|
||||||
write_hunk(808824, 192);
|
write_hunk(808824, 192);
|
||||||
|
|
||||||
#
|
#
|
||||||
# Firmware 70, type: SCODE FW DTV6 QAM F6MHZ HAS IF (0x68000060), IF = 6.20 MHz id: (0000000000000000), size: 192
|
# Firmware 70, type: SCODE FW DTV6 QAM ATSC LG60 F6MHZ HAS IF (0x68050060), IF = 6.20 MHz id: (0000000000000000), size: 192
|
||||||
#
|
#
|
||||||
|
|
||||||
write_le32(0x68000060); # Type
|
write_le32(0x68050060); # Type
|
||||||
write_le64(0x00000000, 0x00000000); # ID
|
write_le64(0x00000000, 0x00000000); # ID
|
||||||
write_le16(6200); # IF
|
write_le16(6200); # IF
|
||||||
write_le32(192); # Size
|
write_le32(192); # Size
|
||||||
|
@ -846,11 +846,11 @@ sub main_firmware($$$$)
|
||||||
write_hunk(809208, 192);
|
write_hunk(809208, 192);
|
||||||
|
|
||||||
#
|
#
|
||||||
# Firmware 74, type: SCODE FW MONO HAS IF (0x60008000), IF = 6.50 MHz id: SECAM/K3 (0000000004000000), size: 192
|
# Firmware 74, type: SCODE FW MONO HAS IF (0x60008000), IF = 6.50 MHz id: PAL/DK SECAM/K3 SECAM/L NICAM (0000000c044000e0), size: 192
|
||||||
#
|
#
|
||||||
|
|
||||||
write_le32(0x60008000); # Type
|
write_le32(0x60008000); # Type
|
||||||
write_le64(0x00000000, 0x04000000); # ID
|
write_le64(0x0000000c, 0x044000e0); # ID
|
||||||
write_le16(6500); # IF
|
write_le16(6500); # IF
|
||||||
write_le32(192); # Size
|
write_le32(192); # Size
|
||||||
write_hunk(811128, 192);
|
write_hunk(811128, 192);
|
||||||
|
|
|
@ -135,77 +135,58 @@ most general to most specific:
|
||||||
|
|
||||||
Components of Memory Policies
|
Components of Memory Policies
|
||||||
|
|
||||||
A Linux memory policy is a tuple consisting of a "mode" and an optional set
|
A Linux memory policy consists of a "mode", optional mode flags, and an
|
||||||
of nodes. The mode determine the behavior of the policy, while the
|
optional set of nodes. The mode determines the behavior of the policy,
|
||||||
optional set of nodes can be viewed as the arguments to the behavior.
|
the optional mode flags determine the behavior of the mode, and the
|
||||||
|
optional set of nodes can be viewed as the arguments to the policy
|
||||||
|
behavior.
|
||||||
|
|
||||||
Internally, memory policies are implemented by a reference counted
|
Internally, memory policies are implemented by a reference counted
|
||||||
structure, struct mempolicy. Details of this structure will be discussed
|
structure, struct mempolicy. Details of this structure will be discussed
|
||||||
in context, below, as required to explain the behavior.
|
in context, below, as required to explain the behavior.
|
||||||
|
|
||||||
Note: in some functions AND in the struct mempolicy itself, the mode
|
|
||||||
is called "policy". However, to avoid confusion with the policy tuple,
|
|
||||||
this document will continue to use the term "mode".
|
|
||||||
|
|
||||||
Linux memory policy supports the following 4 behavioral modes:
|
Linux memory policy supports the following 4 behavioral modes:
|
||||||
|
|
||||||
Default Mode--MPOL_DEFAULT: The behavior specified by this mode is
|
Default Mode--MPOL_DEFAULT: This mode is only used in the memory
|
||||||
context or scope dependent.
|
policy APIs. Internally, MPOL_DEFAULT is converted to the NULL
|
||||||
|
memory policy in all policy scopes. Any existing non-default policy
|
||||||
|
will simply be removed when MPOL_DEFAULT is specified. As a result,
|
||||||
|
MPOL_DEFAULT means "fall back to the next most specific policy scope."
|
||||||
|
|
||||||
As mentioned in the Policy Scope section above, during normal
|
For example, a NULL or default task policy will fall back to the
|
||||||
system operation, the System Default Policy is hard coded to
|
system default policy. A NULL or default vma policy will fall
|
||||||
contain the Default mode.
|
back to the task policy.
|
||||||
|
|
||||||
In this context, default mode means "local" allocation--that is
|
When specified in one of the memory policy APIs, the Default mode
|
||||||
attempt to allocate the page from the node associated with the cpu
|
does not use the optional set of nodes.
|
||||||
where the fault occurs. If the "local" node has no memory, or the
|
|
||||||
node's memory can be exhausted [no free pages available], local
|
|
||||||
allocation will "fallback to"--attempt to allocate pages from--
|
|
||||||
"nearby" nodes, in order of increasing "distance".
|
|
||||||
|
|
||||||
Implementation detail -- subject to change: "Fallback" uses
|
It is an error for the set of nodes specified for this policy to
|
||||||
a per node list of sibling nodes--called zonelists--built at
|
be non-empty.
|
||||||
boot time, or when nodes or memory are added or removed from
|
|
||||||
the system [memory hotplug]. These per node zonelist are
|
|
||||||
constructed with nodes in order of increasing distance based
|
|
||||||
on information provided by the platform firmware.
|
|
||||||
|
|
||||||
When a task/process policy or a shared policy contains the Default
|
|
||||||
mode, this also means "local allocation", as described above.
|
|
||||||
|
|
||||||
In the context of a VMA, Default mode means "fall back to task
|
|
||||||
policy"--which may or may not specify Default mode. Thus, Default
|
|
||||||
mode can not be counted on to mean local allocation when used
|
|
||||||
on a non-shared region of the address space. However, see
|
|
||||||
MPOL_PREFERRED below.
|
|
||||||
|
|
||||||
The Default mode does not use the optional set of nodes.
|
|
||||||
|
|
||||||
MPOL_BIND: This mode specifies that memory must come from the
|
MPOL_BIND: This mode specifies that memory must come from the
|
||||||
set of nodes specified by the policy.
|
set of nodes specified by the policy. Memory will be allocated from
|
||||||
|
the node in the set with sufficient free memory that is closest to
|
||||||
The memory policy APIs do not specify an order in which the nodes
|
the node where the allocation takes place.
|
||||||
will be searched. However, unlike "local allocation", the Bind
|
|
||||||
policy does not consider the distance between the nodes. Rather,
|
|
||||||
allocations will fallback to the nodes specified by the policy in
|
|
||||||
order of numeric node id. Like everything in Linux, this is subject
|
|
||||||
to change.
|
|
||||||
|
|
||||||
MPOL_PREFERRED: This mode specifies that the allocation should be
|
MPOL_PREFERRED: This mode specifies that the allocation should be
|
||||||
attempted from the single node specified in the policy. If that
|
attempted from the single node specified in the policy. If that
|
||||||
allocation fails, the kernel will search other nodes, exactly as
|
allocation fails, the kernel will search other nodes, in order of
|
||||||
it would for a local allocation that started at the preferred node
|
increasing distance from the preferred node based on information
|
||||||
in increasing distance from the preferred node. "Local" allocation
|
provided by the platform firmware.
|
||||||
policy can be viewed as a Preferred policy that starts at the node
|
|
||||||
containing the cpu where the allocation takes place.
|
containing the cpu where the allocation takes place.
|
||||||
|
|
||||||
Internally, the Preferred policy uses a single node--the
|
Internally, the Preferred policy uses a single node--the
|
||||||
preferred_node member of struct mempolicy. A "distinguished
|
preferred_node member of struct mempolicy. When the internal
|
||||||
value of this preferred_node, currently '-1', is interpreted
|
mode flag MPOL_F_LOCAL is set, the preferred_node is ignored and
|
||||||
as "the node containing the cpu where the allocation takes
|
the policy is interpreted as local allocation. "Local" allocation
|
||||||
place"--local allocation. This is the way to specify
|
policy can be viewed as a Preferred policy that starts at the node
|
||||||
local allocation for a specific range of addresses--i.e. for
|
containing the cpu where the allocation takes place.
|
||||||
VMA policies.
|
|
||||||
|
It is possible for the user to specify that local allocation is
|
||||||
|
always preferred by passing an empty nodemask with this mode.
|
||||||
|
If an empty nodemask is passed, the policy cannot use the
|
||||||
|
MPOL_F_STATIC_NODES or MPOL_F_RELATIVE_NODES flags described
|
||||||
|
below.
|
||||||
|
|
||||||
MPOL_INTERLEAVED: This mode specifies that page allocations be
|
MPOL_INTERLEAVED: This mode specifies that page allocations be
|
||||||
interleaved, on a page granularity, across the nodes specified in
|
interleaved, on a page granularity, across the nodes specified in
|
||||||
|
@ -231,6 +212,154 @@ Components of Memory Policies
|
||||||
the temporary interleaved system default policy works in this
|
the temporary interleaved system default policy works in this
|
||||||
mode.
|
mode.
|
||||||
|
|
||||||
|
Linux memory policy supports the following optional mode flags:
|
||||||
|
|
||||||
|
MPOL_F_STATIC_NODES: This flag specifies that the nodemask passed by
|
||||||
|
the user should not be remapped if the task or VMA's set of allowed
|
||||||
|
nodes changes after the memory policy has been defined.
|
||||||
|
|
||||||
|
Without this flag, anytime a mempolicy is rebound because of a
|
||||||
|
change in the set of allowed nodes, the node (Preferred) or
|
||||||
|
nodemask (Bind, Interleave) is remapped to the new set of
|
||||||
|
allowed nodes. This may result in nodes being used that were
|
||||||
|
previously undesired.
|
||||||
|
|
||||||
|
With this flag, if the user-specified nodes overlap with the
|
||||||
|
nodes allowed by the task's cpuset, then the memory policy is
|
||||||
|
applied to their intersection. If the two sets of nodes do not
|
||||||
|
overlap, the Default policy is used.
|
||||||
|
|
||||||
|
For example, consider a task that is attached to a cpuset with
|
||||||
|
mems 1-3 that sets an Interleave policy over the same set. If
|
||||||
|
the cpuset's mems change to 3-5, the Interleave will now occur
|
||||||
|
over nodes 3, 4, and 5. With this flag, however, since only node
|
||||||
|
3 is allowed from the user's nodemask, the "interleave" only
|
||||||
|
occurs over that node. If no nodes from the user's nodemask are
|
||||||
|
now allowed, the Default behavior is used.
|
||||||
|
|
||||||
|
MPOL_F_STATIC_NODES cannot be combined with the
|
||||||
|
MPOL_F_RELATIVE_NODES flag. It also cannot be used for
|
||||||
|
MPOL_PREFERRED policies that were created with an empty nodemask
|
||||||
|
(local allocation).
|
||||||
|
|
||||||
|
MPOL_F_RELATIVE_NODES: This flag specifies that the nodemask passed
|
||||||
|
by the user will be mapped relative to the set of the task or VMA's
|
||||||
|
set of allowed nodes. The kernel stores the user-passed nodemask,
|
||||||
|
and if the allowed nodes changes, then that original nodemask will
|
||||||
|
be remapped relative to the new set of allowed nodes.
|
||||||
|
|
||||||
|
Without this flag (and without MPOL_F_STATIC_NODES), anytime a
|
||||||
|
mempolicy is rebound because of a change in the set of allowed
|
||||||
|
nodes, the node (Preferred) or nodemask (Bind, Interleave) is
|
||||||
|
remapped to the new set of allowed nodes. That remap may not
|
||||||
|
preserve the relative nature of the user's passed nodemask to its
|
||||||
|
set of allowed nodes upon successive rebinds: a nodemask of
|
||||||
|
1,3,5 may be remapped to 7-9 and then to 1-3 if the set of
|
||||||
|
allowed nodes is restored to its original state.
|
||||||
|
|
||||||
|
With this flag, the remap is done so that the node numbers from
|
||||||
|
the user's passed nodemask are relative to the set of allowed
|
||||||
|
nodes. In other words, if nodes 0, 2, and 4 are set in the user's
|
||||||
|
nodemask, the policy will be effected over the first (and in the
|
||||||
|
Bind or Interleave case, the third and fifth) nodes in the set of
|
||||||
|
allowed nodes. The nodemask passed by the user represents nodes
|
||||||
|
relative to task or VMA's set of allowed nodes.
|
||||||
|
|
||||||
|
If the user's nodemask includes nodes that are outside the range
|
||||||
|
of the new set of allowed nodes (for example, node 5 is set in
|
||||||
|
the user's nodemask when the set of allowed nodes is only 0-3),
|
||||||
|
then the remap wraps around to the beginning of the nodemask and,
|
||||||
|
if not already set, sets the node in the mempolicy nodemask.
|
||||||
|
|
||||||
|
For example, consider a task that is attached to a cpuset with
|
||||||
|
mems 2-5 that sets an Interleave policy over the same set with
|
||||||
|
MPOL_F_RELATIVE_NODES. If the cpuset's mems change to 3-7, the
|
||||||
|
interleave now occurs over nodes 3,5-6. If the cpuset's mems
|
||||||
|
then change to 0,2-3,5, then the interleave occurs over nodes
|
||||||
|
0,3,5.
|
||||||
|
|
||||||
|
Thanks to the consistent remapping, applications preparing
|
||||||
|
nodemasks to specify memory policies using this flag should
|
||||||
|
disregard their current, actual cpuset imposed memory placement
|
||||||
|
and prepare the nodemask as if they were always located on
|
||||||
|
memory nodes 0 to N-1, where N is the number of memory nodes the
|
||||||
|
policy is intended to manage. Let the kernel then remap to the
|
||||||
|
set of memory nodes allowed by the task's cpuset, as that may
|
||||||
|
change over time.
|
||||||
|
|
||||||
|
MPOL_F_RELATIVE_NODES cannot be combined with the
|
||||||
|
MPOL_F_STATIC_NODES flag. It also cannot be used for
|
||||||
|
MPOL_PREFERRED policies that were created with an empty nodemask
|
||||||
|
(local allocation).
|
||||||
|
|
||||||
|
MEMORY POLICY REFERENCE COUNTING
|
||||||
|
|
||||||
|
To resolve use/free races, struct mempolicy contains an atomic reference
|
||||||
|
count field. Internal interfaces, mpol_get()/mpol_put() increment and
|
||||||
|
decrement this reference count, respectively. mpol_put() will only free
|
||||||
|
the structure back to the mempolicy kmem cache when the reference count
|
||||||
|
goes to zero.
|
||||||
|
|
||||||
|
When a new memory policy is allocated, it's reference count is initialized
|
||||||
|
to '1', representing the reference held by the task that is installing the
|
||||||
|
new policy. When a pointer to a memory policy structure is stored in another
|
||||||
|
structure, another reference is added, as the task's reference will be dropped
|
||||||
|
on completion of the policy installation.
|
||||||
|
|
||||||
|
During run-time "usage" of the policy, we attempt to minimize atomic operations
|
||||||
|
on the reference count, as this can lead to cache lines bouncing between cpus
|
||||||
|
and NUMA nodes. "Usage" here means one of the following:
|
||||||
|
|
||||||
|
1) querying of the policy, either by the task itself [using the get_mempolicy()
|
||||||
|
API discussed below] or by another task using the /proc/<pid>/numa_maps
|
||||||
|
interface.
|
||||||
|
|
||||||
|
2) examination of the policy to determine the policy mode and associated node
|
||||||
|
or node lists, if any, for page allocation. This is considered a "hot
|
||||||
|
path". Note that for MPOL_BIND, the "usage" extends across the entire
|
||||||
|
allocation process, which may sleep during page reclaimation, because the
|
||||||
|
BIND policy nodemask is used, by reference, to filter ineligible nodes.
|
||||||
|
|
||||||
|
We can avoid taking an extra reference during the usages listed above as
|
||||||
|
follows:
|
||||||
|
|
||||||
|
1) we never need to get/free the system default policy as this is never
|
||||||
|
changed nor freed, once the system is up and running.
|
||||||
|
|
||||||
|
2) for querying the policy, we do not need to take an extra reference on the
|
||||||
|
target task's task policy nor vma policies because we always acquire the
|
||||||
|
task's mm's mmap_sem for read during the query. The set_mempolicy() and
|
||||||
|
mbind() APIs [see below] always acquire the mmap_sem for write when
|
||||||
|
installing or replacing task or vma policies. Thus, there is no possibility
|
||||||
|
of a task or thread freeing a policy while another task or thread is
|
||||||
|
querying it.
|
||||||
|
|
||||||
|
3) Page allocation usage of task or vma policy occurs in the fault path where
|
||||||
|
we hold them mmap_sem for read. Again, because replacing the task or vma
|
||||||
|
policy requires that the mmap_sem be held for write, the policy can't be
|
||||||
|
freed out from under us while we're using it for page allocation.
|
||||||
|
|
||||||
|
4) Shared policies require special consideration. One task can replace a
|
||||||
|
shared memory policy while another task, with a distinct mmap_sem, is
|
||||||
|
querying or allocating a page based on the policy. To resolve this
|
||||||
|
potential race, the shared policy infrastructure adds an extra reference
|
||||||
|
to the shared policy during lookup while holding a spin lock on the shared
|
||||||
|
policy management structure. This requires that we drop this extra
|
||||||
|
reference when we're finished "using" the policy. We must drop the
|
||||||
|
extra reference on shared policies in the same query/allocation paths
|
||||||
|
used for non-shared policies. For this reason, shared policies are marked
|
||||||
|
as such, and the extra reference is dropped "conditionally"--i.e., only
|
||||||
|
for shared policies.
|
||||||
|
|
||||||
|
Because of this extra reference counting, and because we must lookup
|
||||||
|
shared policies in a tree structure under spinlock, shared policies are
|
||||||
|
more expensive to use in the page allocation path. This is expecially
|
||||||
|
true for shared policies on shared memory regions shared by tasks running
|
||||||
|
on different NUMA nodes. This extra overhead can be avoided by always
|
||||||
|
falling back to task or system default policy for shared memory regions,
|
||||||
|
or by prefaulting the entire shared memory region into memory and locking
|
||||||
|
it down. However, this might not be appropriate for all applications.
|
||||||
|
|
||||||
MEMORY POLICY APIs
|
MEMORY POLICY APIs
|
||||||
|
|
||||||
Linux supports 3 system calls for controlling memory policy. These APIS
|
Linux supports 3 system calls for controlling memory policy. These APIS
|
||||||
|
@ -251,7 +380,9 @@ Set [Task] Memory Policy:
|
||||||
Set's the calling task's "task/process memory policy" to mode
|
Set's the calling task's "task/process memory policy" to mode
|
||||||
specified by the 'mode' argument and the set of nodes defined
|
specified by the 'mode' argument and the set of nodes defined
|
||||||
by 'nmask'. 'nmask' points to a bit mask of node ids containing
|
by 'nmask'. 'nmask' points to a bit mask of node ids containing
|
||||||
at least 'maxnode' ids.
|
at least 'maxnode' ids. Optional mode flags may be passed by
|
||||||
|
combining the 'mode' argument with the flag (for example:
|
||||||
|
MPOL_INTERLEAVE | MPOL_F_STATIC_NODES).
|
||||||
|
|
||||||
See the set_mempolicy(2) man page for more details
|
See the set_mempolicy(2) man page for more details
|
||||||
|
|
||||||
|
@ -303,29 +434,19 @@ MEMORY POLICIES AND CPUSETS
|
||||||
Memory policies work within cpusets as described above. For memory policies
|
Memory policies work within cpusets as described above. For memory policies
|
||||||
that require a node or set of nodes, the nodes are restricted to the set of
|
that require a node or set of nodes, the nodes are restricted to the set of
|
||||||
nodes whose memories are allowed by the cpuset constraints. If the nodemask
|
nodes whose memories are allowed by the cpuset constraints. If the nodemask
|
||||||
specified for the policy contains nodes that are not allowed by the cpuset, or
|
specified for the policy contains nodes that are not allowed by the cpuset and
|
||||||
the intersection of the set of nodes specified for the policy and the set of
|
MPOL_F_RELATIVE_NODES is not used, the intersection of the set of nodes
|
||||||
nodes with memory is the empty set, the policy is considered invalid
|
specified for the policy and the set of nodes with memory is used. If the
|
||||||
and cannot be installed.
|
result is the empty set, the policy is considered invalid and cannot be
|
||||||
|
installed. If MPOL_F_RELATIVE_NODES is used, the policy's nodes are mapped
|
||||||
|
onto and folded into the task's set of allowed nodes as previously described.
|
||||||
|
|
||||||
The interaction of memory policies and cpusets can be problematic for a
|
The interaction of memory policies and cpusets can be problematic when tasks
|
||||||
couple of reasons:
|
in two cpusets share access to a memory region, such as shared memory segments
|
||||||
|
created by shmget() of mmap() with the MAP_ANONYMOUS and MAP_SHARED flags, and
|
||||||
1) the memory policy APIs take physical node id's as arguments. As mentioned
|
any of the tasks install shared policy on the region, only nodes whose
|
||||||
above, it is illegal to specify nodes that are not allowed in the cpuset.
|
memories are allowed in both cpusets may be used in the policies. Obtaining
|
||||||
The application must query the allowed nodes using the get_mempolicy()
|
this information requires "stepping outside" the memory policy APIs to use the
|
||||||
API with the MPOL_F_MEMS_ALLOWED flag to determine the allowed nodes and
|
cpuset information and requires that one know in what cpusets other task might
|
||||||
restrict itself to those nodes. However, the resources available to a
|
be attaching to the shared region. Furthermore, if the cpusets' allowed
|
||||||
cpuset can be changed by the system administrator, or a workload manager
|
memory sets are disjoint, "local" allocation is the only valid policy.
|
||||||
application, at any time. So, a task may still get errors attempting to
|
|
||||||
specify policy nodes, and must query the allowed memories again.
|
|
||||||
|
|
||||||
2) when tasks in two cpusets share access to a memory region, such as shared
|
|
||||||
memory segments created by shmget() of mmap() with the MAP_ANONYMOUS and
|
|
||||||
MAP_SHARED flags, and any of the tasks install shared policy on the region,
|
|
||||||
only nodes whose memories are allowed in both cpusets may be used in the
|
|
||||||
policies. Obtaining this information requires "stepping outside" the
|
|
||||||
memory policy APIs to use the cpuset information and requires that one
|
|
||||||
know in what cpusets other task might be attaching to the shared region.
|
|
||||||
Furthermore, if the cpusets' allowed memory sets are disjoint, "local"
|
|
||||||
allocation is the only valid policy.
|
|
||||||
|
|
|
@ -31,14 +31,14 @@ struct slabinfo {
|
||||||
int hwcache_align, object_size, objs_per_slab;
|
int hwcache_align, object_size, objs_per_slab;
|
||||||
int sanity_checks, slab_size, store_user, trace;
|
int sanity_checks, slab_size, store_user, trace;
|
||||||
int order, poison, reclaim_account, red_zone;
|
int order, poison, reclaim_account, red_zone;
|
||||||
unsigned long partial, objects, slabs;
|
unsigned long partial, objects, slabs, objects_partial, objects_total;
|
||||||
unsigned long alloc_fastpath, alloc_slowpath;
|
unsigned long alloc_fastpath, alloc_slowpath;
|
||||||
unsigned long free_fastpath, free_slowpath;
|
unsigned long free_fastpath, free_slowpath;
|
||||||
unsigned long free_frozen, free_add_partial, free_remove_partial;
|
unsigned long free_frozen, free_add_partial, free_remove_partial;
|
||||||
unsigned long alloc_from_partial, alloc_slab, free_slab, alloc_refill;
|
unsigned long alloc_from_partial, alloc_slab, free_slab, alloc_refill;
|
||||||
unsigned long cpuslab_flush, deactivate_full, deactivate_empty;
|
unsigned long cpuslab_flush, deactivate_full, deactivate_empty;
|
||||||
unsigned long deactivate_to_head, deactivate_to_tail;
|
unsigned long deactivate_to_head, deactivate_to_tail;
|
||||||
unsigned long deactivate_remote_frees;
|
unsigned long deactivate_remote_frees, order_fallback;
|
||||||
int numa[MAX_NODES];
|
int numa[MAX_NODES];
|
||||||
int numa_partial[MAX_NODES];
|
int numa_partial[MAX_NODES];
|
||||||
} slabinfo[MAX_SLABS];
|
} slabinfo[MAX_SLABS];
|
||||||
|
@ -293,7 +293,7 @@ int line = 0;
|
||||||
void first_line(void)
|
void first_line(void)
|
||||||
{
|
{
|
||||||
if (show_activity)
|
if (show_activity)
|
||||||
printf("Name Objects Alloc Free %%Fast\n");
|
printf("Name Objects Alloc Free %%Fast Fallb O\n");
|
||||||
else
|
else
|
||||||
printf("Name Objects Objsize Space "
|
printf("Name Objects Objsize Space "
|
||||||
"Slabs/Part/Cpu O/S O %%Fr %%Ef Flg\n");
|
"Slabs/Part/Cpu O/S O %%Fr %%Ef Flg\n");
|
||||||
|
@ -540,7 +540,8 @@ void slabcache(struct slabinfo *s)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
store_size(size_str, slab_size(s));
|
store_size(size_str, slab_size(s));
|
||||||
snprintf(dist_str, 40, "%lu/%lu/%d", s->slabs, s->partial, s->cpu_slabs);
|
snprintf(dist_str, 40, "%lu/%lu/%d", s->slabs - s->cpu_slabs,
|
||||||
|
s->partial, s->cpu_slabs);
|
||||||
|
|
||||||
if (!line++)
|
if (!line++)
|
||||||
first_line();
|
first_line();
|
||||||
|
@ -572,11 +573,12 @@ void slabcache(struct slabinfo *s)
|
||||||
total_alloc = s->alloc_fastpath + s->alloc_slowpath;
|
total_alloc = s->alloc_fastpath + s->alloc_slowpath;
|
||||||
total_free = s->free_fastpath + s->free_slowpath;
|
total_free = s->free_fastpath + s->free_slowpath;
|
||||||
|
|
||||||
printf("%-21s %8ld %8ld %8ld %3ld %3ld \n",
|
printf("%-21s %8ld %10ld %10ld %3ld %3ld %5ld %1d\n",
|
||||||
s->name, s->objects,
|
s->name, s->objects,
|
||||||
total_alloc, total_free,
|
total_alloc, total_free,
|
||||||
total_alloc ? (s->alloc_fastpath * 100 / total_alloc) : 0,
|
total_alloc ? (s->alloc_fastpath * 100 / total_alloc) : 0,
|
||||||
total_free ? (s->free_fastpath * 100 / total_free) : 0);
|
total_free ? (s->free_fastpath * 100 / total_free) : 0,
|
||||||
|
s->order_fallback, s->order);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
printf("%-21s %8ld %7d %8s %14s %4d %1d %3ld %3ld %s\n",
|
printf("%-21s %8ld %7d %8s %14s %4d %1d %3ld %3ld %s\n",
|
||||||
|
@ -776,7 +778,6 @@ void totals(void)
|
||||||
unsigned long used;
|
unsigned long used;
|
||||||
unsigned long long wasted;
|
unsigned long long wasted;
|
||||||
unsigned long long objwaste;
|
unsigned long long objwaste;
|
||||||
long long objects_in_partial_slabs;
|
|
||||||
unsigned long percentage_partial_slabs;
|
unsigned long percentage_partial_slabs;
|
||||||
unsigned long percentage_partial_objs;
|
unsigned long percentage_partial_objs;
|
||||||
|
|
||||||
|
@ -790,18 +791,11 @@ void totals(void)
|
||||||
wasted = size - used;
|
wasted = size - used;
|
||||||
objwaste = s->slab_size - s->object_size;
|
objwaste = s->slab_size - s->object_size;
|
||||||
|
|
||||||
objects_in_partial_slabs = s->objects -
|
|
||||||
(s->slabs - s->partial - s ->cpu_slabs) *
|
|
||||||
s->objs_per_slab;
|
|
||||||
|
|
||||||
if (objects_in_partial_slabs < 0)
|
|
||||||
objects_in_partial_slabs = 0;
|
|
||||||
|
|
||||||
percentage_partial_slabs = s->partial * 100 / s->slabs;
|
percentage_partial_slabs = s->partial * 100 / s->slabs;
|
||||||
if (percentage_partial_slabs > 100)
|
if (percentage_partial_slabs > 100)
|
||||||
percentage_partial_slabs = 100;
|
percentage_partial_slabs = 100;
|
||||||
|
|
||||||
percentage_partial_objs = objects_in_partial_slabs * 100
|
percentage_partial_objs = s->objects_partial * 100
|
||||||
/ s->objects;
|
/ s->objects;
|
||||||
|
|
||||||
if (percentage_partial_objs > 100)
|
if (percentage_partial_objs > 100)
|
||||||
|
@ -823,8 +817,8 @@ void totals(void)
|
||||||
min_objects = s->objects;
|
min_objects = s->objects;
|
||||||
if (used < min_used)
|
if (used < min_used)
|
||||||
min_used = used;
|
min_used = used;
|
||||||
if (objects_in_partial_slabs < min_partobj)
|
if (s->objects_partial < min_partobj)
|
||||||
min_partobj = objects_in_partial_slabs;
|
min_partobj = s->objects_partial;
|
||||||
if (percentage_partial_slabs < min_ppart)
|
if (percentage_partial_slabs < min_ppart)
|
||||||
min_ppart = percentage_partial_slabs;
|
min_ppart = percentage_partial_slabs;
|
||||||
if (percentage_partial_objs < min_ppartobj)
|
if (percentage_partial_objs < min_ppartobj)
|
||||||
|
@ -848,8 +842,8 @@ void totals(void)
|
||||||
max_objects = s->objects;
|
max_objects = s->objects;
|
||||||
if (used > max_used)
|
if (used > max_used)
|
||||||
max_used = used;
|
max_used = used;
|
||||||
if (objects_in_partial_slabs > max_partobj)
|
if (s->objects_partial > max_partobj)
|
||||||
max_partobj = objects_in_partial_slabs;
|
max_partobj = s->objects_partial;
|
||||||
if (percentage_partial_slabs > max_ppart)
|
if (percentage_partial_slabs > max_ppart)
|
||||||
max_ppart = percentage_partial_slabs;
|
max_ppart = percentage_partial_slabs;
|
||||||
if (percentage_partial_objs > max_ppartobj)
|
if (percentage_partial_objs > max_ppartobj)
|
||||||
|
@ -864,7 +858,7 @@ void totals(void)
|
||||||
|
|
||||||
total_objects += s->objects;
|
total_objects += s->objects;
|
||||||
total_used += used;
|
total_used += used;
|
||||||
total_partobj += objects_in_partial_slabs;
|
total_partobj += s->objects_partial;
|
||||||
total_ppart += percentage_partial_slabs;
|
total_ppart += percentage_partial_slabs;
|
||||||
total_ppartobj += percentage_partial_objs;
|
total_ppartobj += percentage_partial_objs;
|
||||||
|
|
||||||
|
@ -1160,6 +1154,8 @@ void read_slab_dir(void)
|
||||||
slab->hwcache_align = get_obj("hwcache_align");
|
slab->hwcache_align = get_obj("hwcache_align");
|
||||||
slab->object_size = get_obj("object_size");
|
slab->object_size = get_obj("object_size");
|
||||||
slab->objects = get_obj("objects");
|
slab->objects = get_obj("objects");
|
||||||
|
slab->objects_partial = get_obj("objects_partial");
|
||||||
|
slab->objects_total = get_obj("objects_total");
|
||||||
slab->objs_per_slab = get_obj("objs_per_slab");
|
slab->objs_per_slab = get_obj("objs_per_slab");
|
||||||
slab->order = get_obj("order");
|
slab->order = get_obj("order");
|
||||||
slab->partial = get_obj("partial");
|
slab->partial = get_obj("partial");
|
||||||
|
@ -1193,6 +1189,7 @@ void read_slab_dir(void)
|
||||||
slab->deactivate_to_head = get_obj("deactivate_to_head");
|
slab->deactivate_to_head = get_obj("deactivate_to_head");
|
||||||
slab->deactivate_to_tail = get_obj("deactivate_to_tail");
|
slab->deactivate_to_tail = get_obj("deactivate_to_tail");
|
||||||
slab->deactivate_remote_frees = get_obj("deactivate_remote_frees");
|
slab->deactivate_remote_frees = get_obj("deactivate_remote_frees");
|
||||||
|
slab->order_fallback = get_obj("order_fallback");
|
||||||
chdir("..");
|
chdir("..");
|
||||||
if (slab->name[0] == ':')
|
if (slab->name[0] == ':')
|
||||||
alias_targets++;
|
alias_targets++;
|
||||||
|
|
62
Kbuild
62
Kbuild
|
@ -1,26 +1,61 @@
|
||||||
#
|
#
|
||||||
# Kbuild for top-level directory of the kernel
|
# Kbuild for top-level directory of the kernel
|
||||||
# This file takes care of the following:
|
# This file takes care of the following:
|
||||||
# 1) Generate asm-offsets.h
|
# 1) Generate bounds.h
|
||||||
# 2) Check for missing system calls
|
# 2) Generate asm-offsets.h (may need bounds.h)
|
||||||
|
# 3) Check for missing system calls
|
||||||
|
|
||||||
#####
|
#####
|
||||||
# 1) Generate asm-offsets.h
|
# 1) Generate bounds.h
|
||||||
|
|
||||||
|
bounds-file := include/linux/bounds.h
|
||||||
|
|
||||||
|
always := $(bounds-file)
|
||||||
|
targets := $(bounds-file) kernel/bounds.s
|
||||||
|
|
||||||
|
quiet_cmd_bounds = GEN $@
|
||||||
|
define cmd_bounds
|
||||||
|
(set -e; \
|
||||||
|
echo "#ifndef __LINUX_BOUNDS_H__"; \
|
||||||
|
echo "#define __LINUX_BOUNDS_H__"; \
|
||||||
|
echo "/*"; \
|
||||||
|
echo " * DO NOT MODIFY."; \
|
||||||
|
echo " *"; \
|
||||||
|
echo " * This file was generated by Kbuild"; \
|
||||||
|
echo " *"; \
|
||||||
|
echo " */"; \
|
||||||
|
echo ""; \
|
||||||
|
sed -ne $(sed-y) $<; \
|
||||||
|
echo ""; \
|
||||||
|
echo "#endif" ) > $@
|
||||||
|
endef
|
||||||
|
|
||||||
|
# We use internal kbuild rules to avoid the "is up to date" message from make
|
||||||
|
kernel/bounds.s: kernel/bounds.c FORCE
|
||||||
|
$(Q)mkdir -p $(dir $@)
|
||||||
|
$(call if_changed_dep,cc_s_c)
|
||||||
|
|
||||||
|
$(obj)/$(bounds-file): kernel/bounds.s Kbuild
|
||||||
|
$(Q)mkdir -p $(dir $@)
|
||||||
|
$(call cmd,bounds)
|
||||||
|
|
||||||
|
#####
|
||||||
|
# 2) Generate asm-offsets.h
|
||||||
#
|
#
|
||||||
|
|
||||||
offsets-file := include/asm-$(SRCARCH)/asm-offsets.h
|
offsets-file := include/asm-$(SRCARCH)/asm-offsets.h
|
||||||
|
|
||||||
always := $(offsets-file)
|
always += $(offsets-file)
|
||||||
targets := $(offsets-file)
|
targets += $(offsets-file)
|
||||||
targets += arch/$(SRCARCH)/kernel/asm-offsets.s
|
targets += arch/$(SRCARCH)/kernel/asm-offsets.s
|
||||||
clean-files := $(addprefix $(objtree)/,$(targets))
|
|
||||||
|
|
||||||
# Default sed regexp - multiline due to syntax constraints
|
# Default sed regexp - multiline due to syntax constraints
|
||||||
define sed-y
|
define sed-y
|
||||||
"/^->/{s:^->\([^ ]*\) [\$$#]*\([^ ]*\) \(.*\):#define \1 \2 /* \3 */:; s:->::; p;}"
|
"/^->/{s:->#\(.*\):/* \1 */:; \
|
||||||
|
s:^->\([^ ]*\) [\$$#]*\([^ ]*\) \(.*\):#define \1 \2 /* \3 */:; \
|
||||||
|
s:->::; p;}"
|
||||||
endef
|
endef
|
||||||
# Override default regexp for specific architectures
|
|
||||||
sed-$(CONFIG_MIPS) := "/^@@@/{s/^@@@//; s/ \#.*\$$//; p;}"
|
|
||||||
|
|
||||||
quiet_cmd_offsets = GEN $@
|
quiet_cmd_offsets = GEN $@
|
||||||
define cmd_offsets
|
define cmd_offsets
|
||||||
|
@ -40,7 +75,8 @@ define cmd_offsets
|
||||||
endef
|
endef
|
||||||
|
|
||||||
# We use internal kbuild rules to avoid the "is up to date" message from make
|
# We use internal kbuild rules to avoid the "is up to date" message from make
|
||||||
arch/$(SRCARCH)/kernel/asm-offsets.s: arch/$(SRCARCH)/kernel/asm-offsets.c FORCE
|
arch/$(SRCARCH)/kernel/asm-offsets.s: arch/$(SRCARCH)/kernel/asm-offsets.c \
|
||||||
|
$(obj)/$(bounds-file) FORCE
|
||||||
$(Q)mkdir -p $(dir $@)
|
$(Q)mkdir -p $(dir $@)
|
||||||
$(call if_changed_dep,cc_s_c)
|
$(call if_changed_dep,cc_s_c)
|
||||||
|
|
||||||
|
@ -49,7 +85,7 @@ $(obj)/$(offsets-file): arch/$(SRCARCH)/kernel/asm-offsets.s Kbuild
|
||||||
$(call cmd,offsets)
|
$(call cmd,offsets)
|
||||||
|
|
||||||
#####
|
#####
|
||||||
# 2) Check for missing system calls
|
# 3) Check for missing system calls
|
||||||
#
|
#
|
||||||
|
|
||||||
quiet_cmd_syscalls = CALL $<
|
quiet_cmd_syscalls = CALL $<
|
||||||
|
@ -58,3 +94,7 @@ quiet_cmd_syscalls = CALL $<
|
||||||
PHONY += missing-syscalls
|
PHONY += missing-syscalls
|
||||||
missing-syscalls: scripts/checksyscalls.sh FORCE
|
missing-syscalls: scripts/checksyscalls.sh FORCE
|
||||||
$(call cmd,syscalls)
|
$(call cmd,syscalls)
|
||||||
|
|
||||||
|
# Delete all targets during make clean
|
||||||
|
clean-files := $(addprefix $(objtree)/,$(targets))
|
||||||
|
|
||||||
|
|
227
MAINTAINERS
227
MAINTAINERS
|
@ -752,11 +752,13 @@ W: http://atmelwlandriver.sourceforge.net/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
AUDIT SUBSYSTEM
|
AUDIT SUBSYSTEM
|
||||||
P: David Woodhouse
|
P: Al Viro
|
||||||
M: dwmw2@infradead.org
|
M: viro@zeniv.linux.org.uk
|
||||||
|
P: Eric Paris
|
||||||
|
M: eparis@redhat.com
|
||||||
L: linux-audit@redhat.com (subscribers-only)
|
L: linux-audit@redhat.com (subscribers-only)
|
||||||
W: http://people.redhat.com/sgrubb/audit/
|
W: http://people.redhat.com/sgrubb/audit/
|
||||||
T: git kernel.org:/pub/scm/linux/kernel/git/dwmw2/audit-2.6.git
|
T: git git.kernel.org/pub/scm/linux/kernel/git/viro/audit-current.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
AUXILIARY DISPLAY DRIVERS
|
AUXILIARY DISPLAY DRIVERS
|
||||||
|
@ -1037,7 +1039,7 @@ P: Urs Thuermann
|
||||||
M: urs.thuermann@volkswagen.de
|
M: urs.thuermann@volkswagen.de
|
||||||
P: Oliver Hartkopp
|
P: Oliver Hartkopp
|
||||||
M: oliver.hartkopp@volkswagen.de
|
M: oliver.hartkopp@volkswagen.de
|
||||||
L: socketcan-core@lists.berlios.de
|
L: socketcan-core@lists.berlios.de (subscribers-only)
|
||||||
W: http://developer.berlios.de/projects/socketcan/
|
W: http://developer.berlios.de/projects/socketcan/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
@ -1106,6 +1108,12 @@ M: kernel@wantstofly.org
|
||||||
L: linux-usb@vger.kernel.org
|
L: linux-usb@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
CIRRUS LOGIC CS4270 SOUND DRIVER
|
||||||
|
P: Timur Tabi
|
||||||
|
M: timur@freescale.com
|
||||||
|
L: alsa-devel@alsa-project.org
|
||||||
|
S: Supported
|
||||||
|
|
||||||
CIRRUS LOGIC CS4280/CS461x SOUNDDRIVER
|
CIRRUS LOGIC CS4280/CS461x SOUNDDRIVER
|
||||||
P: Cirrus Logic Corporation (kernel 2.2 driver)
|
P: Cirrus Logic Corporation (kernel 2.2 driver)
|
||||||
M: Cirrus Logic Corporation, Thomas Woller <twoller@crystal.cirrus.com>
|
M: Cirrus Logic Corporation, Thomas Woller <twoller@crystal.cirrus.com>
|
||||||
|
@ -1188,9 +1196,9 @@ S: Maintained
|
||||||
|
|
||||||
CPUSETS
|
CPUSETS
|
||||||
P: Paul Jackson
|
P: Paul Jackson
|
||||||
P: Simon Derr
|
P: Paul Menage
|
||||||
M: pj@sgi.com
|
M: pj@sgi.com
|
||||||
M: simon.derr@bull.net
|
M: menage@google.com
|
||||||
L: linux-kernel@vger.kernel.org
|
L: linux-kernel@vger.kernel.org
|
||||||
W: http://www.bullopensource.org/cpuset/
|
W: http://www.bullopensource.org/cpuset/
|
||||||
S: Supported
|
S: Supported
|
||||||
|
@ -1525,6 +1533,13 @@ L: bluesmoke-devel@lists.sourceforge.net
|
||||||
W: bluesmoke.sourceforge.net
|
W: bluesmoke.sourceforge.net
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
EEEPC LAPTOP EXTRAS DRIVER
|
||||||
|
P: Corentin Chary
|
||||||
|
M: corentincj@iksaif.net
|
||||||
|
L: acpi4asus-user@lists.sourceforge.net
|
||||||
|
W: http://sourceforge.net/projects/acpi4asus
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
EEPRO100 NETWORK DRIVER
|
EEPRO100 NETWORK DRIVER
|
||||||
P: Andrey V. Savochkin
|
P: Andrey V. Savochkin
|
||||||
M: saw@saw.sw.com.sg
|
M: saw@saw.sw.com.sg
|
||||||
|
@ -1542,6 +1557,14 @@ M: raisch@de.ibm.com
|
||||||
L: general@lists.openfabrics.org
|
L: general@lists.openfabrics.org
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
|
EMBEDDED LINUX
|
||||||
|
P: Paul Gortmaker
|
||||||
|
M: paul.gortmaker@windriver.com
|
||||||
|
P David Woodhouse
|
||||||
|
M: dwmw2@infradead.org
|
||||||
|
L: linux-embedded@vger.kernel.org
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
EMULEX LPFC FC SCSI DRIVER
|
EMULEX LPFC FC SCSI DRIVER
|
||||||
P: James Smart
|
P: James Smart
|
||||||
M: james.smart@emulex.com
|
M: james.smart@emulex.com
|
||||||
|
@ -1628,6 +1651,12 @@ L: linuxppc-dev@ozlabs.org
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
FREESCALE QUICC ENGINE LIBRARY
|
||||||
|
P: Timur Tabi
|
||||||
|
M: timur@freescale.com
|
||||||
|
L: linuxppc-dev@ozlabs.org
|
||||||
|
S: Supported
|
||||||
|
|
||||||
FREESCALE HIGHSPEED USB DEVICE DRIVER
|
FREESCALE HIGHSPEED USB DEVICE DRIVER
|
||||||
P: Li Yang
|
P: Li Yang
|
||||||
M: leoli@freescale.com
|
M: leoli@freescale.com
|
||||||
|
@ -1642,6 +1671,19 @@ L: netdev@vger.kernel.org
|
||||||
L: linuxppc-dev@ozlabs.org
|
L: linuxppc-dev@ozlabs.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
FREESCALE QUICC ENGINE UCC UART DRIVER
|
||||||
|
P: Timur Tabi
|
||||||
|
M: timur@freescale.com
|
||||||
|
L: linuxppc-dev@ozlabs.org
|
||||||
|
S: Supported
|
||||||
|
|
||||||
|
FREESCALE SOC SOUND DRIVERS
|
||||||
|
P: Timur Tabi
|
||||||
|
M: timur@freescale.com
|
||||||
|
L: alsa-devel@alsa-project.org
|
||||||
|
L: linuxppc-dev@ozlabs.org
|
||||||
|
S: Supported
|
||||||
|
|
||||||
FILE LOCKING (flock() and fcntl()/lockf())
|
FILE LOCKING (flock() and fcntl()/lockf())
|
||||||
P: Matthew Wilcox
|
P: Matthew Wilcox
|
||||||
M: matthew@wil.cx
|
M: matthew@wil.cx
|
||||||
|
@ -2304,6 +2346,13 @@ L: kvm-devel@lists.sourceforge.net
|
||||||
W: kvm.sourceforge.net
|
W: kvm.sourceforge.net
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
|
KERNEL VIRTUAL MACHINE (KVM) FOR POWERPC
|
||||||
|
P: Hollis Blanchard
|
||||||
|
M: hollisb@us.ibm.com
|
||||||
|
L: kvm-ppc-devel@lists.sourceforge.net
|
||||||
|
W: kvm.sourceforge.net
|
||||||
|
S: Supported
|
||||||
|
|
||||||
KERNEL VIRTUAL MACHINE For Itanium(KVM/IA64)
|
KERNEL VIRTUAL MACHINE For Itanium(KVM/IA64)
|
||||||
P: Anthony Xu
|
P: Anthony Xu
|
||||||
M: anthony.xu@intel.com
|
M: anthony.xu@intel.com
|
||||||
|
@ -2313,6 +2362,16 @@ L: kvm-ia64-devel@lists.sourceforge.net
|
||||||
W: kvm.sourceforge.net
|
W: kvm.sourceforge.net
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
|
KERNEL VIRTUAL MACHINE for s390 (KVM/s390)
|
||||||
|
P: Carsten Otte
|
||||||
|
M: cotte@de.ibm.com
|
||||||
|
P: Christian Borntraeger
|
||||||
|
M: borntraeger@de.ibm.com
|
||||||
|
M: linux390@de.ibm.com
|
||||||
|
L: linux-s390@vger.kernel.org
|
||||||
|
W: http://www.ibm.com/developerworks/linux/linux390/
|
||||||
|
S: Supported
|
||||||
|
|
||||||
KEXEC
|
KEXEC
|
||||||
P: Eric Biederman
|
P: Eric Biederman
|
||||||
M: ebiederm@xmission.com
|
M: ebiederm@xmission.com
|
||||||
|
@ -2558,12 +2617,10 @@ W: http://www.tazenda.demon.co.uk/phil/linux-hp
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
MAC80211
|
MAC80211
|
||||||
P: Michael Wu
|
|
||||||
M: flamingice@sourmilk.net
|
|
||||||
P: Johannes Berg
|
P: Johannes Berg
|
||||||
M: johannes@sipsolutions.net
|
M: johannes@sipsolutions.net
|
||||||
P: Jiri Benc
|
P: Michael Wu
|
||||||
M: jbenc@suse.cz
|
M: flamingice@sourmilk.net
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
W: http://linuxwireless.org/
|
W: http://linuxwireless.org/
|
||||||
T: git kernel.org:/pub/scm/linux/kernel/git/linville/wireless-2.6.git
|
T: git kernel.org:/pub/scm/linux/kernel/git/linville/wireless-2.6.git
|
||||||
|
@ -2654,7 +2711,7 @@ P: David Howells
|
||||||
M: dhowells@redhat.com
|
M: dhowells@redhat.com
|
||||||
P: Koichi Yasutake
|
P: Koichi Yasutake
|
||||||
M: yasutake.koichi@jp.panasonic.com
|
M: yasutake.koichi@jp.panasonic.com
|
||||||
L: linux-am33-list@redhat.com
|
L: linux-am33-list@redhat.com (moderated for non-subscribers)
|
||||||
W: ftp://ftp.redhat.com/pub/redhat/gnupro/AM33/
|
W: ftp://ftp.redhat.com/pub/redhat/gnupro/AM33/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
@ -2717,7 +2774,7 @@ M: rubini@ipvvis.unipv.it
|
||||||
L: linux-kernel@vger.kernel.org
|
L: linux-kernel@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
MOXA SMARTIO/INDUSTIO SERIAL CARD (MXSER 2.0)
|
MOXA SMARTIO/INDUSTIO/INTELLIO SERIAL CARD
|
||||||
P: Jiri Slaby
|
P: Jiri Slaby
|
||||||
M: jirislaby@gmail.com
|
M: jirislaby@gmail.com
|
||||||
L: linux-kernel@vger.kernel.org
|
L: linux-kernel@vger.kernel.org
|
||||||
|
@ -3073,7 +3130,8 @@ PCI SUBSYSTEM
|
||||||
P: Jesse Barnes
|
P: Jesse Barnes
|
||||||
M: jbarnes@virtuousgeek.org
|
M: jbarnes@virtuousgeek.org
|
||||||
L: linux-kernel@vger.kernel.org
|
L: linux-kernel@vger.kernel.org
|
||||||
L: linux-pci@atrey.karlin.mff.cuni.cz
|
L: linux-pci@vger.kernel.org
|
||||||
|
T: git kernel.org:/pub/scm/linux/kernel/git/jbarnes/pci-2.6.git
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
PCI HOTPLUG CORE
|
PCI HOTPLUG CORE
|
||||||
|
@ -3534,6 +3592,13 @@ M: pfg@sgi.com
|
||||||
L: linux-ia64@vger.kernel.org
|
L: linux-ia64@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
|
SFC NETWORK DRIVER
|
||||||
|
P: Steve Hodgson
|
||||||
|
P: Ben Hutchings
|
||||||
|
P: Robert Stonehouse
|
||||||
|
M: linux-net-drivers@solarflare.com
|
||||||
|
S: Supported
|
||||||
|
|
||||||
SGI VISUAL WORKSTATION 320 AND 540
|
SGI VISUAL WORKSTATION 320 AND 540
|
||||||
P: Andrey Panin
|
P: Andrey Panin
|
||||||
M: pazke@donpac.ru
|
M: pazke@donpac.ru
|
||||||
|
@ -3700,42 +3765,6 @@ M: chrisw@sous-sol.org
|
||||||
L: stable@kernel.org
|
L: stable@kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
TPM DEVICE DRIVER
|
|
||||||
P: Kylene Hall
|
|
||||||
M: tpmdd-devel@lists.sourceforge.net
|
|
||||||
W: http://tpmdd.sourceforge.net
|
|
||||||
P: Marcel Selhorst
|
|
||||||
M: tpm@selhorst.net
|
|
||||||
W: http://www.prosec.rub.de/tpm/
|
|
||||||
L: tpmdd-devel@lists.sourceforge.net
|
|
||||||
S: Maintained
|
|
||||||
|
|
||||||
Telecom Clock Driver for MCPL0010
|
|
||||||
P: Mark Gross
|
|
||||||
M: mark.gross@intel.com
|
|
||||||
S: Supported
|
|
||||||
|
|
||||||
TENSILICA XTENSA PORT (xtensa):
|
|
||||||
P: Chris Zankel
|
|
||||||
M: chris@zankel.net
|
|
||||||
S: Maintained
|
|
||||||
|
|
||||||
THINKPAD ACPI EXTRAS DRIVER
|
|
||||||
P: Henrique de Moraes Holschuh
|
|
||||||
M: ibm-acpi@hmh.eng.br
|
|
||||||
L: ibm-acpi-devel@lists.sourceforge.net
|
|
||||||
W: http://ibm-acpi.sourceforge.net
|
|
||||||
W: http://thinkwiki.org/wiki/Ibm-acpi
|
|
||||||
T: git repo.or.cz/linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git
|
|
||||||
S: Maintained
|
|
||||||
|
|
||||||
UltraSPARC (sparc64):
|
|
||||||
P: David S. Miller
|
|
||||||
M: davem@davemloft.net
|
|
||||||
L: sparclinux@vger.kernel.org
|
|
||||||
T: git kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6.git
|
|
||||||
S: Maintained
|
|
||||||
|
|
||||||
SHARP LH SUPPORT (LH7952X & LH7A40X)
|
SHARP LH SUPPORT (LH7952X & LH7A40X)
|
||||||
P: Marc Singer
|
P: Marc Singer
|
||||||
M: elf@buici.com
|
M: elf@buici.com
|
||||||
|
@ -3832,6 +3861,12 @@ P: Christoph Hellwig
|
||||||
M: hch@infradead.org
|
M: hch@infradead.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
TASKSTATS STATISTICS INTERFACE
|
||||||
|
P: Shailabh Nagar
|
||||||
|
M: nagar@watson.ibm.com
|
||||||
|
L: linux-kernel@vger.kernel.org
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
TC CLASSIFIER
|
TC CLASSIFIER
|
||||||
P: Jamal Hadi Salim
|
P: Jamal Hadi Salim
|
||||||
M: hadi@cyberus.ca
|
M: hadi@cyberus.ca
|
||||||
|
@ -3854,6 +3889,25 @@ M: andy@greyhouse.net
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
|
Telecom Clock Driver for MCPL0010
|
||||||
|
P: Mark Gross
|
||||||
|
M: mark.gross@intel.com
|
||||||
|
S: Supported
|
||||||
|
|
||||||
|
TENSILICA XTENSA PORT (xtensa):
|
||||||
|
P: Chris Zankel
|
||||||
|
M: chris@zankel.net
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
|
THINKPAD ACPI EXTRAS DRIVER
|
||||||
|
P: Henrique de Moraes Holschuh
|
||||||
|
M: ibm-acpi@hmh.eng.br
|
||||||
|
L: ibm-acpi-devel@lists.sourceforge.net
|
||||||
|
W: http://ibm-acpi.sourceforge.net
|
||||||
|
W: http://thinkwiki.org/wiki/Ibm-acpi
|
||||||
|
T: git repo.or.cz/linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
TI FLASH MEDIA INTERFACE DRIVER
|
TI FLASH MEDIA INTERFACE DRIVER
|
||||||
P: Alex Dubov
|
P: Alex Dubov
|
||||||
M: oakad@yahoo.com
|
M: oakad@yahoo.com
|
||||||
|
@ -3871,12 +3925,6 @@ P: Deepak Saxena
|
||||||
M: dsaxena@plexity.net
|
M: dsaxena@plexity.net
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
TASKSTATS STATISTICS INTERFACE
|
|
||||||
P: Shailabh Nagar
|
|
||||||
M: nagar@watson.ibm.com
|
|
||||||
L: linux-kernel@vger.kernel.org
|
|
||||||
S: Maintained
|
|
||||||
|
|
||||||
TIPC NETWORK LAYER
|
TIPC NETWORK LAYER
|
||||||
P: Per Liden
|
P: Per Liden
|
||||||
M: per.liden@ericsson.com
|
M: per.liden@ericsson.com
|
||||||
|
@ -3910,6 +3958,16 @@ L: tlinux-users@tce.toshiba-dme.co.jp
|
||||||
W: http://www.buzzard.org.uk/toshiba/
|
W: http://www.buzzard.org.uk/toshiba/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
TPM DEVICE DRIVER
|
||||||
|
P: Kylene Hall
|
||||||
|
M: tpmdd-devel@lists.sourceforge.net
|
||||||
|
W: http://tpmdd.sourceforge.net
|
||||||
|
P: Marcel Selhorst
|
||||||
|
M: tpm@selhorst.net
|
||||||
|
W: http://www.prosec.rub.de/tpm/
|
||||||
|
L: tpmdd-devel@lists.sourceforge.net
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
TRIDENT 4DWAVE/SIS 7018 PCI AUDIO CORE
|
TRIDENT 4DWAVE/SIS 7018 PCI AUDIO CORE
|
||||||
P: Muli Ben-Yehuda
|
P: Muli Ben-Yehuda
|
||||||
M: mulix@mulix.org
|
M: mulix@mulix.org
|
||||||
|
@ -3922,6 +3980,12 @@ M: trivial@kernel.org
|
||||||
L: linux-kernel@vger.kernel.org
|
L: linux-kernel@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
TTY LAYER
|
||||||
|
P: Alan Cox
|
||||||
|
M: alan@lxorguk.ukuu.org.uk
|
||||||
|
L: linux-kernel@vger.kernel.org
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
TULIP NETWORK DRIVERS
|
TULIP NETWORK DRIVERS
|
||||||
P: Grant Grundler
|
P: Grant Grundler
|
||||||
M: grundler@parisc-linux.org
|
M: grundler@parisc-linux.org
|
||||||
|
@ -3987,6 +4051,12 @@ L: linux-usb@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
W: http://www.kroah.com/linux-usb/
|
W: http://www.kroah.com/linux-usb/
|
||||||
|
|
||||||
|
USB CYPRESS C67X00 DRIVER
|
||||||
|
P: Peter Korsgaard
|
||||||
|
M: jacmet@sunsite.dk
|
||||||
|
L: linux-usb@vger.kernel.org
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
USB DAVICOM DM9601 DRIVER
|
USB DAVICOM DM9601 DRIVER
|
||||||
P: Peter Korsgaard
|
P: Peter Korsgaard
|
||||||
M: jacmet@sunsite.dk
|
M: jacmet@sunsite.dk
|
||||||
|
@ -4090,6 +4160,20 @@ L: linux-usb@vger.kernel.org
|
||||||
W: http://www.chello.nl/~j.vreeken/se401/
|
W: http://www.chello.nl/~j.vreeken/se401/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
USB SERIAL BELKIN F5U103 DRIVER
|
||||||
|
P: William Greathouse
|
||||||
|
M: wgreathouse@smva.com
|
||||||
|
L: linux-usb@vger.kernel.org
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
|
USB SERIAL CYPRESS M8 DRIVER
|
||||||
|
P: Lonnie Mendez
|
||||||
|
M: dignome@gmail.com
|
||||||
|
L: linux-usb@vger.kernel.org
|
||||||
|
S: Maintained
|
||||||
|
W: http://geocities.com/i0xox0i
|
||||||
|
W: http://firstlight.net/cvs
|
||||||
|
|
||||||
USB SERIAL CYBERJACK DRIVER
|
USB SERIAL CYBERJACK DRIVER
|
||||||
P: Matthias Bruestle and Harald Welte
|
P: Matthias Bruestle and Harald Welte
|
||||||
M: support@reiner-sct.com
|
M: support@reiner-sct.com
|
||||||
|
@ -4109,20 +4193,6 @@ M: gregkh@suse.de
|
||||||
L: linux-usb@vger.kernel.org
|
L: linux-usb@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
USB SERIAL BELKIN F5U103 DRIVER
|
|
||||||
P: William Greathouse
|
|
||||||
M: wgreathouse@smva.com
|
|
||||||
L: linux-usb@vger.kernel.org
|
|
||||||
S: Maintained
|
|
||||||
|
|
||||||
USB SERIAL CYPRESS M8 DRIVER
|
|
||||||
P: Lonnie Mendez
|
|
||||||
M: dignome@gmail.com
|
|
||||||
L: linux-usb@vger.kernel.org
|
|
||||||
S: Maintained
|
|
||||||
W: http://geocities.com/i0xox0i
|
|
||||||
W: http://firstlight.net/cvs
|
|
||||||
|
|
||||||
USB SERIAL EMPEG EMPEG-CAR MARK I/II DRIVER
|
USB SERIAL EMPEG EMPEG-CAR MARK I/II DRIVER
|
||||||
P: Gary Brubaker
|
P: Gary Brubaker
|
||||||
M: xavyer@ix.netcom.com
|
M: xavyer@ix.netcom.com
|
||||||
|
@ -4225,7 +4295,7 @@ M: gregkh@suse.de
|
||||||
L: linux-kernel@vger.kernel.org
|
L: linux-kernel@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
FAT/VFAT/MSDOS FILESYSTEM:
|
VFAT/FAT/MSDOS FILESYSTEM:
|
||||||
P: OGAWA Hirofumi
|
P: OGAWA Hirofumi
|
||||||
M: hirofumi@mail.parknet.co.jp
|
M: hirofumi@mail.parknet.co.jp
|
||||||
L: linux-kernel@vger.kernel.org
|
L: linux-kernel@vger.kernel.org
|
||||||
|
@ -4270,6 +4340,13 @@ M: dushistov@mail.ru
|
||||||
L: linux-kernel@vger.kernel.org
|
L: linux-kernel@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
UltraSPARC (sparc64):
|
||||||
|
P: David S. Miller
|
||||||
|
M: davem@davemloft.net
|
||||||
|
L: sparclinux@vger.kernel.org
|
||||||
|
T: git kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6.git
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
USB DIAMOND RIO500 DRIVER
|
USB DIAMOND RIO500 DRIVER
|
||||||
P: Cesar Miquel
|
P: Cesar Miquel
|
||||||
M: miquel@df.uba.ar
|
M: miquel@df.uba.ar
|
||||||
|
@ -4358,6 +4435,16 @@ L: linux-wireless@vger.kernel.org
|
||||||
W: http://oops.ghostprotocols.net:81/blog
|
W: http://oops.ghostprotocols.net:81/blog
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
WM97XX TOUCHSCREEN DRIVERS
|
||||||
|
P: Mark Brown
|
||||||
|
M: broonie@opensource.wolfsonmicro.com
|
||||||
|
P: Liam Girdwood
|
||||||
|
M: liam.girdwood@wolfsonmicro.com
|
||||||
|
L: linux-input@vger.kernel.org
|
||||||
|
T: git git://opensource.wolfsonmicro.com/linux-2.6-touch
|
||||||
|
W: http://opensource.wolfsonmicro.com/node/7
|
||||||
|
S: Supported
|
||||||
|
|
||||||
X.25 NETWORK LAYER
|
X.25 NETWORK LAYER
|
||||||
P: Henner Eisen
|
P: Henner Eisen
|
||||||
M: eis@baty.hanse.de
|
M: eis@baty.hanse.de
|
||||||
|
|
46
Makefile
46
Makefile
|
@ -1,7 +1,7 @@
|
||||||
VERSION = 2
|
VERSION = 2
|
||||||
PATCHLEVEL = 6
|
PATCHLEVEL = 6
|
||||||
SUBLEVEL = 25
|
SUBLEVEL = 26
|
||||||
EXTRAVERSION =
|
EXTRAVERSION = -rc1
|
||||||
NAME = Funky Weasel is Jiggy wit it
|
NAME = Funky Weasel is Jiggy wit it
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
@ -507,6 +507,10 @@ else
|
||||||
KBUILD_CFLAGS += -O2
|
KBUILD_CFLAGS += -O2
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifneq (CONFIG_FRAME_WARN,0)
|
||||||
|
KBUILD_CFLAGS += $(call cc-option,-Wframe-larger-than=${CONFIG_FRAME_WARN})
|
||||||
|
endif
|
||||||
|
|
||||||
# Force gcc to behave correct even for buggy distributions
|
# Force gcc to behave correct even for buggy distributions
|
||||||
# Arch Makefiles may override this setting
|
# Arch Makefiles may override this setting
|
||||||
KBUILD_CFLAGS += $(call cc-option, -fno-stack-protector)
|
KBUILD_CFLAGS += $(call cc-option, -fno-stack-protector)
|
||||||
|
@ -790,7 +794,7 @@ endif # ifdef CONFIG_KALLSYMS
|
||||||
quiet_cmd_vmlinux-modpost = LD $@
|
quiet_cmd_vmlinux-modpost = LD $@
|
||||||
cmd_vmlinux-modpost = $(LD) $(LDFLAGS) -r -o $@ \
|
cmd_vmlinux-modpost = $(LD) $(LDFLAGS) -r -o $@ \
|
||||||
$(vmlinux-init) --start-group $(vmlinux-main) --end-group \
|
$(vmlinux-init) --start-group $(vmlinux-main) --end-group \
|
||||||
$(filter-out $(vmlinux-init) $(vmlinux-main) $(vmlinux-lds) FORCE ,$^)
|
$(filter-out $(vmlinux-init) $(vmlinux-main) FORCE ,$^)
|
||||||
define rule_vmlinux-modpost
|
define rule_vmlinux-modpost
|
||||||
:
|
:
|
||||||
+$(call cmd,vmlinux-modpost)
|
+$(call cmd,vmlinux-modpost)
|
||||||
|
@ -814,7 +818,9 @@ endif
|
||||||
ifdef CONFIG_KALLSYMS
|
ifdef CONFIG_KALLSYMS
|
||||||
.tmp_vmlinux1: vmlinux.o
|
.tmp_vmlinux1: vmlinux.o
|
||||||
endif
|
endif
|
||||||
vmlinux.o: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) FORCE
|
|
||||||
|
modpost-init := $(filter-out init/built-in.o, $(vmlinux-init))
|
||||||
|
vmlinux.o: $(modpost-init) $(vmlinux-main) FORCE
|
||||||
$(call if_changed_rule,vmlinux-modpost)
|
$(call if_changed_rule,vmlinux-modpost)
|
||||||
|
|
||||||
# The actual objects are generated when descending,
|
# The actual objects are generated when descending,
|
||||||
|
@ -1170,8 +1176,10 @@ rpm: include/config/kernel.release FORCE
|
||||||
# Brief documentation of the typical targets used
|
# Brief documentation of the typical targets used
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
boards := $(wildcard $(srctree)/arch/$(ARCH)/configs/*_defconfig)
|
boards := $(wildcard $(srctree)/arch/$(SRCARCH)/configs/*_defconfig)
|
||||||
boards := $(notdir $(boards))
|
boards := $(notdir $(boards))
|
||||||
|
board-dirs := $(dir $(wildcard $(srctree)/arch/$(SRCARCH)/configs/*/*_defconfig))
|
||||||
|
board-dirs := $(sort $(notdir $(board-dirs:/=)))
|
||||||
|
|
||||||
help:
|
help:
|
||||||
@echo 'Cleaning targets:'
|
@echo 'Cleaning targets:'
|
||||||
|
@ -1217,14 +1225,19 @@ help:
|
||||||
@echo 'Documentation targets:'
|
@echo 'Documentation targets:'
|
||||||
@$(MAKE) -f $(srctree)/Documentation/DocBook/Makefile dochelp
|
@$(MAKE) -f $(srctree)/Documentation/DocBook/Makefile dochelp
|
||||||
@echo ''
|
@echo ''
|
||||||
@echo 'Architecture specific targets ($(ARCH)):'
|
@echo 'Architecture specific targets ($(SRCARCH)):'
|
||||||
@$(if $(archhelp),$(archhelp),\
|
@$(if $(archhelp),$(archhelp),\
|
||||||
echo ' No architecture specific help defined for $(ARCH)')
|
echo ' No architecture specific help defined for $(SRCARCH)')
|
||||||
@echo ''
|
@echo ''
|
||||||
@$(if $(boards), \
|
@$(if $(boards), \
|
||||||
$(foreach b, $(boards), \
|
$(foreach b, $(boards), \
|
||||||
printf " %-24s - Build for %s\\n" $(b) $(subst _defconfig,,$(b));) \
|
printf " %-24s - Build for %s\\n" $(b) $(subst _defconfig,,$(b));) \
|
||||||
echo '')
|
echo '')
|
||||||
|
@$(if $(board-dirs), \
|
||||||
|
$(foreach b, $(board-dirs), \
|
||||||
|
printf " %-16s - Show %s-specific targets\\n" help-$(b) $(b);) \
|
||||||
|
printf " %-16s - Show all of the above\\n" help-boards; \
|
||||||
|
echo '')
|
||||||
|
|
||||||
@echo ' make V=0|1 [targets] 0 => quiet build (default), 1 => verbose build'
|
@echo ' make V=0|1 [targets] 0 => quiet build (default), 1 => verbose build'
|
||||||
@echo ' make V=2 [targets] 2 => give reason for rebuild of target'
|
@echo ' make V=2 [targets] 2 => give reason for rebuild of target'
|
||||||
|
@ -1236,6 +1249,20 @@ help:
|
||||||
@echo 'For further info see the ./README file'
|
@echo 'For further info see the ./README file'
|
||||||
|
|
||||||
|
|
||||||
|
help-board-dirs := $(addprefix help-,$(board-dirs))
|
||||||
|
|
||||||
|
help-boards: $(help-board-dirs)
|
||||||
|
|
||||||
|
boards-per-dir = $(notdir $(wildcard $(srctree)/arch/$(SRCARCH)/configs/$*/*_defconfig))
|
||||||
|
|
||||||
|
$(help-board-dirs): help-%:
|
||||||
|
@echo 'Architecture specific targets ($(SRCARCH) $*):'
|
||||||
|
@$(if $(boards-per-dir), \
|
||||||
|
$(foreach b, $(boards-per-dir), \
|
||||||
|
printf " %-24s - Build for %s\\n" $*/$(b) $(subst _defconfig,,$(b));) \
|
||||||
|
echo '')
|
||||||
|
|
||||||
|
|
||||||
# Documentation targets
|
# Documentation targets
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
%docs: scripts_basic FORCE
|
%docs: scripts_basic FORCE
|
||||||
|
@ -1396,7 +1423,7 @@ define xtags
|
||||||
$(all-kconfigs) | xargs $1 -a \
|
$(all-kconfigs) | xargs $1 -a \
|
||||||
--langdef=kconfig \
|
--langdef=kconfig \
|
||||||
--language-force=kconfig \
|
--language-force=kconfig \
|
||||||
--regex-kconfig='/^[[:blank:]]*config[[:blank:]]+([[:alnum:]_]+)/\1/'; \
|
--regex-kconfig='/^[[:blank:]]*(menu|)config[[:blank:]]+([[:alnum:]_]+)/\2/'; \
|
||||||
$(all-defconfigs) | xargs -r $1 -a \
|
$(all-defconfigs) | xargs -r $1 -a \
|
||||||
--langdef=dotconfig \
|
--langdef=dotconfig \
|
||||||
--language-force=dotconfig \
|
--language-force=dotconfig \
|
||||||
|
@ -1404,7 +1431,7 @@ define xtags
|
||||||
elif $1 --version 2>&1 | grep -iq emacs; then \
|
elif $1 --version 2>&1 | grep -iq emacs; then \
|
||||||
$(all-sources) | xargs $1 -a; \
|
$(all-sources) | xargs $1 -a; \
|
||||||
$(all-kconfigs) | xargs $1 -a \
|
$(all-kconfigs) | xargs $1 -a \
|
||||||
--regex='/^[ \t]*config[ \t]+\([a-zA-Z0-9_]+\)/\1/'; \
|
--regex='/^[ \t]*(menu|)config[ \t]+\([a-zA-Z0-9_]+\)/\2/'; \
|
||||||
$(all-defconfigs) | xargs -r $1 -a \
|
$(all-defconfigs) | xargs -r $1 -a \
|
||||||
--regex='/^#?[ \t]?\(CONFIG_[a-zA-Z0-9_]+\)/\1/'; \
|
--regex='/^#?[ \t]?\(CONFIG_[a-zA-Z0-9_]+\)/\1/'; \
|
||||||
else \
|
else \
|
||||||
|
@ -1539,7 +1566,6 @@ quiet_cmd_rmfiles = $(if $(wildcard $(rm-files)),CLEAN $(wildcard $(rm-files))
|
||||||
cmd_rmfiles = rm -f $(rm-files)
|
cmd_rmfiles = rm -f $(rm-files)
|
||||||
|
|
||||||
# Run depmod only if we have System.map and depmod is executable
|
# Run depmod only if we have System.map and depmod is executable
|
||||||
# and we build for the host arch
|
|
||||||
quiet_cmd_depmod = DEPMOD $(KERNELRELEASE)
|
quiet_cmd_depmod = DEPMOD $(KERNELRELEASE)
|
||||||
cmd_depmod = \
|
cmd_depmod = \
|
||||||
if [ -r System.map -a -x $(DEPMOD) ]; then \
|
if [ -r System.map -a -x $(DEPMOD) ]; then \
|
||||||
|
|
|
@ -36,3 +36,6 @@ config HAVE_KPROBES
|
||||||
|
|
||||||
config HAVE_KRETPROBES
|
config HAVE_KRETPROBES
|
||||||
def_bool n
|
def_bool n
|
||||||
|
|
||||||
|
config HAVE_DMA_ATTRS
|
||||||
|
def_bool n
|
||||||
|
|
|
@ -8,13 +8,9 @@
|
||||||
#include <linux/stddef.h>
|
#include <linux/stddef.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/ptrace.h>
|
#include <linux/ptrace.h>
|
||||||
|
#include <linux/kbuild.h>
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
|
|
||||||
#define DEFINE(sym, val) \
|
|
||||||
asm volatile("\n->" #sym " %0 " #val : : "i" (val))
|
|
||||||
|
|
||||||
#define BLANK() asm volatile("\n->" : : )
|
|
||||||
|
|
||||||
void foo(void)
|
void foo(void)
|
||||||
{
|
{
|
||||||
DEFINE(TI_TASK, offsetof(struct thread_info, task));
|
DEFINE(TI_TASK, offsetof(struct thread_info, task));
|
||||||
|
|
|
@ -994,7 +994,7 @@ marvel_agp_configure(alpha_agp_info *agp)
|
||||||
* rate, but warn the user.
|
* rate, but warn the user.
|
||||||
*/
|
*/
|
||||||
printk("%s: unknown PLL setting RNGB=%lx (PLL6_CTL=%016lx)\n",
|
printk("%s: unknown PLL setting RNGB=%lx (PLL6_CTL=%016lx)\n",
|
||||||
__FUNCTION__, IO7_PLL_RNGB(agp_pll), agp_pll);
|
__func__, IO7_PLL_RNGB(agp_pll), agp_pll);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1044,13 +1044,13 @@ marvel_agp_translate(alpha_agp_info *agp, dma_addr_t addr)
|
||||||
|
|
||||||
if (addr < agp->aperture.bus_base ||
|
if (addr < agp->aperture.bus_base ||
|
||||||
addr >= agp->aperture.bus_base + agp->aperture.size) {
|
addr >= agp->aperture.bus_base + agp->aperture.size) {
|
||||||
printk("%s: addr out of range\n", __FUNCTION__);
|
printk("%s: addr out of range\n", __func__);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
pte = aper->arena->ptes[baddr >> PAGE_SHIFT];
|
pte = aper->arena->ptes[baddr >> PAGE_SHIFT];
|
||||||
if (!(pte & 1)) {
|
if (!(pte & 1)) {
|
||||||
printk("%s: pte not valid\n", __FUNCTION__);
|
printk("%s: pte not valid\n", __func__);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
return (pte >> 1) << PAGE_SHIFT;
|
return (pte >> 1) << PAGE_SHIFT;
|
||||||
|
|
|
@ -336,10 +336,7 @@ t2_direct_map_window1(unsigned long base, unsigned long length)
|
||||||
|
|
||||||
#if DEBUG_PRINT_FINAL_SETTINGS
|
#if DEBUG_PRINT_FINAL_SETTINGS
|
||||||
printk("%s: setting WBASE1=0x%lx WMASK1=0x%lx TBASE1=0x%lx\n",
|
printk("%s: setting WBASE1=0x%lx WMASK1=0x%lx TBASE1=0x%lx\n",
|
||||||
__FUNCTION__,
|
__func__, *(vulp)T2_WBASE1, *(vulp)T2_WMASK1, *(vulp)T2_TBASE1);
|
||||||
*(vulp)T2_WBASE1,
|
|
||||||
*(vulp)T2_WMASK1,
|
|
||||||
*(vulp)T2_TBASE1);
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -366,10 +363,7 @@ t2_sg_map_window2(struct pci_controller *hose,
|
||||||
|
|
||||||
#if DEBUG_PRINT_FINAL_SETTINGS
|
#if DEBUG_PRINT_FINAL_SETTINGS
|
||||||
printk("%s: setting WBASE2=0x%lx WMASK2=0x%lx TBASE2=0x%lx\n",
|
printk("%s: setting WBASE2=0x%lx WMASK2=0x%lx TBASE2=0x%lx\n",
|
||||||
__FUNCTION__,
|
__func__, *(vulp)T2_WBASE2, *(vulp)T2_WMASK2, *(vulp)T2_TBASE2);
|
||||||
*(vulp)T2_WBASE2,
|
|
||||||
*(vulp)T2_WMASK2,
|
|
||||||
*(vulp)T2_TBASE2);
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -377,15 +371,15 @@ static void __init
|
||||||
t2_save_configuration(void)
|
t2_save_configuration(void)
|
||||||
{
|
{
|
||||||
#if DEBUG_PRINT_INITIAL_SETTINGS
|
#if DEBUG_PRINT_INITIAL_SETTINGS
|
||||||
printk("%s: HAE_1 was 0x%lx\n", __FUNCTION__, srm_hae); /* HW is 0 */
|
printk("%s: HAE_1 was 0x%lx\n", __func__, srm_hae); /* HW is 0 */
|
||||||
printk("%s: HAE_2 was 0x%lx\n", __FUNCTION__, *(vulp)T2_HAE_2);
|
printk("%s: HAE_2 was 0x%lx\n", __func__, *(vulp)T2_HAE_2);
|
||||||
printk("%s: HAE_3 was 0x%lx\n", __FUNCTION__, *(vulp)T2_HAE_3);
|
printk("%s: HAE_3 was 0x%lx\n", __func__, *(vulp)T2_HAE_3);
|
||||||
printk("%s: HAE_4 was 0x%lx\n", __FUNCTION__, *(vulp)T2_HAE_4);
|
printk("%s: HAE_4 was 0x%lx\n", __func__, *(vulp)T2_HAE_4);
|
||||||
printk("%s: HBASE was 0x%lx\n", __FUNCTION__, *(vulp)T2_HBASE);
|
printk("%s: HBASE was 0x%lx\n", __func__, *(vulp)T2_HBASE);
|
||||||
|
|
||||||
printk("%s: WBASE1=0x%lx WMASK1=0x%lx TBASE1=0x%lx\n", __FUNCTION__,
|
printk("%s: WBASE1=0x%lx WMASK1=0x%lx TBASE1=0x%lx\n", __func__,
|
||||||
*(vulp)T2_WBASE1, *(vulp)T2_WMASK1, *(vulp)T2_TBASE1);
|
*(vulp)T2_WBASE1, *(vulp)T2_WMASK1, *(vulp)T2_TBASE1);
|
||||||
printk("%s: WBASE2=0x%lx WMASK2=0x%lx TBASE2=0x%lx\n", __FUNCTION__,
|
printk("%s: WBASE2=0x%lx WMASK2=0x%lx TBASE2=0x%lx\n", __func__,
|
||||||
*(vulp)T2_WBASE2, *(vulp)T2_WMASK2, *(vulp)T2_TBASE2);
|
*(vulp)T2_WBASE2, *(vulp)T2_WMASK2, *(vulp)T2_TBASE2);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -365,21 +365,21 @@ void __init
|
||||||
titan_init_arch(void)
|
titan_init_arch(void)
|
||||||
{
|
{
|
||||||
#if 0
|
#if 0
|
||||||
printk("%s: titan_init_arch()\n", __FUNCTION__);
|
printk("%s: titan_init_arch()\n", __func__);
|
||||||
printk("%s: CChip registers:\n", __FUNCTION__);
|
printk("%s: CChip registers:\n", __func__);
|
||||||
printk("%s: CSR_CSC 0x%lx\n", __FUNCTION__, TITAN_cchip->csc.csr);
|
printk("%s: CSR_CSC 0x%lx\n", __func__, TITAN_cchip->csc.csr);
|
||||||
printk("%s: CSR_MTR 0x%lx\n", __FUNCTION__, TITAN_cchip->mtr.csr);
|
printk("%s: CSR_MTR 0x%lx\n", __func__, TITAN_cchip->mtr.csr);
|
||||||
printk("%s: CSR_MISC 0x%lx\n", __FUNCTION__, TITAN_cchip->misc.csr);
|
printk("%s: CSR_MISC 0x%lx\n", __func__, TITAN_cchip->misc.csr);
|
||||||
printk("%s: CSR_DIM0 0x%lx\n", __FUNCTION__, TITAN_cchip->dim0.csr);
|
printk("%s: CSR_DIM0 0x%lx\n", __func__, TITAN_cchip->dim0.csr);
|
||||||
printk("%s: CSR_DIM1 0x%lx\n", __FUNCTION__, TITAN_cchip->dim1.csr);
|
printk("%s: CSR_DIM1 0x%lx\n", __func__, TITAN_cchip->dim1.csr);
|
||||||
printk("%s: CSR_DIR0 0x%lx\n", __FUNCTION__, TITAN_cchip->dir0.csr);
|
printk("%s: CSR_DIR0 0x%lx\n", __func__, TITAN_cchip->dir0.csr);
|
||||||
printk("%s: CSR_DIR1 0x%lx\n", __FUNCTION__, TITAN_cchip->dir1.csr);
|
printk("%s: CSR_DIR1 0x%lx\n", __func__, TITAN_cchip->dir1.csr);
|
||||||
printk("%s: CSR_DRIR 0x%lx\n", __FUNCTION__, TITAN_cchip->drir.csr);
|
printk("%s: CSR_DRIR 0x%lx\n", __func__, TITAN_cchip->drir.csr);
|
||||||
|
|
||||||
printk("%s: DChip registers:\n", __FUNCTION__);
|
printk("%s: DChip registers:\n", __func__);
|
||||||
printk("%s: CSR_DSC 0x%lx\n", __FUNCTION__, TITAN_dchip->dsc.csr);
|
printk("%s: CSR_DSC 0x%lx\n", __func__, TITAN_dchip->dsc.csr);
|
||||||
printk("%s: CSR_STR 0x%lx\n", __FUNCTION__, TITAN_dchip->str.csr);
|
printk("%s: CSR_STR 0x%lx\n", __func__, TITAN_dchip->str.csr);
|
||||||
printk("%s: CSR_DREV 0x%lx\n", __FUNCTION__, TITAN_dchip->drev.csr);
|
printk("%s: CSR_DREV 0x%lx\n", __func__, TITAN_dchip->drev.csr);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
boot_cpuid = __hard_smp_processor_id();
|
boot_cpuid = __hard_smp_processor_id();
|
||||||
|
@ -700,13 +700,13 @@ titan_agp_translate(alpha_agp_info *agp, dma_addr_t addr)
|
||||||
|
|
||||||
if (addr < agp->aperture.bus_base ||
|
if (addr < agp->aperture.bus_base ||
|
||||||
addr >= agp->aperture.bus_base + agp->aperture.size) {
|
addr >= agp->aperture.bus_base + agp->aperture.size) {
|
||||||
printk("%s: addr out of range\n", __FUNCTION__);
|
printk("%s: addr out of range\n", __func__);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
pte = aper->arena->ptes[baddr >> PAGE_SHIFT];
|
pte = aper->arena->ptes[baddr >> PAGE_SHIFT];
|
||||||
if (!(pte & 1)) {
|
if (!(pte & 1)) {
|
||||||
printk("%s: pte not valid\n", __FUNCTION__);
|
printk("%s: pte not valid\n", __func__);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -241,8 +241,6 @@ tsunami_probe_write(volatile unsigned long *vaddr)
|
||||||
#define tsunami_probe_read(ADDR) 1
|
#define tsunami_probe_read(ADDR) 1
|
||||||
#endif /* NXM_MACHINE_CHECKS_ON_TSUNAMI */
|
#endif /* NXM_MACHINE_CHECKS_ON_TSUNAMI */
|
||||||
|
|
||||||
#define FN __FUNCTION__
|
|
||||||
|
|
||||||
static void __init
|
static void __init
|
||||||
tsunami_init_one_pchip(tsunami_pchip *pchip, int index)
|
tsunami_init_one_pchip(tsunami_pchip *pchip, int index)
|
||||||
{
|
{
|
||||||
|
@ -383,27 +381,27 @@ tsunami_init_arch(void)
|
||||||
/* NXMs just don't matter to Tsunami--unless they make it
|
/* NXMs just don't matter to Tsunami--unless they make it
|
||||||
choke completely. */
|
choke completely. */
|
||||||
tmp = (unsigned long)(TSUNAMI_cchip - 1);
|
tmp = (unsigned long)(TSUNAMI_cchip - 1);
|
||||||
printk("%s: probing bogus address: 0x%016lx\n", FN, bogus_addr);
|
printk("%s: probing bogus address: 0x%016lx\n", __func__, bogus_addr);
|
||||||
printk("\tprobe %s\n",
|
printk("\tprobe %s\n",
|
||||||
tsunami_probe_write((unsigned long *)bogus_addr)
|
tsunami_probe_write((unsigned long *)bogus_addr)
|
||||||
? "succeeded" : "failed");
|
? "succeeded" : "failed");
|
||||||
#endif /* NXM_MACHINE_CHECKS_ON_TSUNAMI */
|
#endif /* NXM_MACHINE_CHECKS_ON_TSUNAMI */
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
printk("%s: CChip registers:\n", FN);
|
printk("%s: CChip registers:\n", __func__);
|
||||||
printk("%s: CSR_CSC 0x%lx\n", FN, TSUNAMI_cchip->csc.csr);
|
printk("%s: CSR_CSC 0x%lx\n", __func__, TSUNAMI_cchip->csc.csr);
|
||||||
printk("%s: CSR_MTR 0x%lx\n", FN, TSUNAMI_cchip.mtr.csr);
|
printk("%s: CSR_MTR 0x%lx\n", __func__, TSUNAMI_cchip.mtr.csr);
|
||||||
printk("%s: CSR_MISC 0x%lx\n", FN, TSUNAMI_cchip->misc.csr);
|
printk("%s: CSR_MISC 0x%lx\n", __func__, TSUNAMI_cchip->misc.csr);
|
||||||
printk("%s: CSR_DIM0 0x%lx\n", FN, TSUNAMI_cchip->dim0.csr);
|
printk("%s: CSR_DIM0 0x%lx\n", __func__, TSUNAMI_cchip->dim0.csr);
|
||||||
printk("%s: CSR_DIM1 0x%lx\n", FN, TSUNAMI_cchip->dim1.csr);
|
printk("%s: CSR_DIM1 0x%lx\n", __func__, TSUNAMI_cchip->dim1.csr);
|
||||||
printk("%s: CSR_DIR0 0x%lx\n", FN, TSUNAMI_cchip->dir0.csr);
|
printk("%s: CSR_DIR0 0x%lx\n", __func__, TSUNAMI_cchip->dir0.csr);
|
||||||
printk("%s: CSR_DIR1 0x%lx\n", FN, TSUNAMI_cchip->dir1.csr);
|
printk("%s: CSR_DIR1 0x%lx\n", __func__, TSUNAMI_cchip->dir1.csr);
|
||||||
printk("%s: CSR_DRIR 0x%lx\n", FN, TSUNAMI_cchip->drir.csr);
|
printk("%s: CSR_DRIR 0x%lx\n", __func__, TSUNAMI_cchip->drir.csr);
|
||||||
|
|
||||||
printk("%s: DChip registers:\n");
|
printk("%s: DChip registers:\n");
|
||||||
printk("%s: CSR_DSC 0x%lx\n", FN, TSUNAMI_dchip->dsc.csr);
|
printk("%s: CSR_DSC 0x%lx\n", __func__, TSUNAMI_dchip->dsc.csr);
|
||||||
printk("%s: CSR_STR 0x%lx\n", FN, TSUNAMI_dchip->str.csr);
|
printk("%s: CSR_STR 0x%lx\n", __func__, TSUNAMI_dchip->str.csr);
|
||||||
printk("%s: CSR_DREV 0x%lx\n", FN, TSUNAMI_dchip->drev.csr);
|
printk("%s: CSR_DREV 0x%lx\n", __func__, TSUNAMI_dchip->drev.csr);
|
||||||
#endif
|
#endif
|
||||||
/* With multiple PCI busses, we play with I/O as physical addrs. */
|
/* With multiple PCI busses, we play with I/O as physical addrs. */
|
||||||
ioport_resource.end = ~0UL;
|
ioport_resource.end = ~0UL;
|
||||||
|
|
|
@ -120,6 +120,12 @@ module_frob_arch_sections(Elf64_Ehdr *hdr, Elf64_Shdr *sechdrs,
|
||||||
|
|
||||||
nsyms = symtab->sh_size / sizeof(Elf64_Sym);
|
nsyms = symtab->sh_size / sizeof(Elf64_Sym);
|
||||||
chains = kcalloc(nsyms, sizeof(struct got_entry), GFP_KERNEL);
|
chains = kcalloc(nsyms, sizeof(struct got_entry), GFP_KERNEL);
|
||||||
|
if (!chains) {
|
||||||
|
printk(KERN_ERR
|
||||||
|
"module %s: no memory for symbol chain buffer\n",
|
||||||
|
me->name);
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
got->sh_size = 0;
|
got->sh_size = 0;
|
||||||
got->sh_addralign = 8;
|
got->sh_addralign = 8;
|
||||||
|
|
|
@ -75,6 +75,7 @@ osf_set_program_attributes(unsigned long text_start, unsigned long text_len,
|
||||||
lock_kernel();
|
lock_kernel();
|
||||||
mm = current->mm;
|
mm = current->mm;
|
||||||
mm->end_code = bss_start + bss_len;
|
mm->end_code = bss_start + bss_len;
|
||||||
|
mm->start_brk = bss_start + bss_len;
|
||||||
mm->brk = bss_start + bss_len;
|
mm->brk = bss_start + bss_len;
|
||||||
#if 0
|
#if 0
|
||||||
printk("set_program_attributes(%lx %lx %lx %lx)\n",
|
printk("set_program_attributes(%lx %lx %lx %lx)\n",
|
||||||
|
@ -980,27 +981,18 @@ asmlinkage int
|
||||||
osf_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp,
|
osf_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp,
|
||||||
struct timeval32 __user *tvp)
|
struct timeval32 __user *tvp)
|
||||||
{
|
{
|
||||||
fd_set_bits fds;
|
s64 timeout = MAX_SCHEDULE_TIMEOUT;
|
||||||
char *bits;
|
|
||||||
size_t size;
|
|
||||||
long timeout;
|
|
||||||
int ret = -EINVAL;
|
|
||||||
struct fdtable *fdt;
|
|
||||||
int max_fds;
|
|
||||||
|
|
||||||
timeout = MAX_SCHEDULE_TIMEOUT;
|
|
||||||
if (tvp) {
|
if (tvp) {
|
||||||
time_t sec, usec;
|
time_t sec, usec;
|
||||||
|
|
||||||
if (!access_ok(VERIFY_READ, tvp, sizeof(*tvp))
|
if (!access_ok(VERIFY_READ, tvp, sizeof(*tvp))
|
||||||
|| __get_user(sec, &tvp->tv_sec)
|
|| __get_user(sec, &tvp->tv_sec)
|
||||||
|| __get_user(usec, &tvp->tv_usec)) {
|
|| __get_user(usec, &tvp->tv_usec)) {
|
||||||
ret = -EFAULT;
|
return -EFAULT;
|
||||||
goto out_nofds;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sec < 0 || usec < 0)
|
if (sec < 0 || usec < 0)
|
||||||
goto out_nofds;
|
return -EINVAL;
|
||||||
|
|
||||||
if ((unsigned long) sec < MAX_SELECT_SECONDS) {
|
if ((unsigned long) sec < MAX_SELECT_SECONDS) {
|
||||||
timeout = (usec + 1000000/HZ - 1) / (1000000/HZ);
|
timeout = (usec + 1000000/HZ - 1) / (1000000/HZ);
|
||||||
|
@ -1008,60 +1000,8 @@ osf_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
rcu_read_lock();
|
|
||||||
fdt = files_fdtable(current->files);
|
|
||||||
max_fds = fdt->max_fds;
|
|
||||||
rcu_read_unlock();
|
|
||||||
if (n < 0 || n > max_fds)
|
|
||||||
goto out_nofds;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We need 6 bitmaps (in/out/ex for both incoming and outgoing),
|
|
||||||
* since we used fdset we need to allocate memory in units of
|
|
||||||
* long-words.
|
|
||||||
*/
|
|
||||||
ret = -ENOMEM;
|
|
||||||
size = FDS_BYTES(n);
|
|
||||||
bits = kmalloc(6 * size, GFP_KERNEL);
|
|
||||||
if (!bits)
|
|
||||||
goto out_nofds;
|
|
||||||
fds.in = (unsigned long *) bits;
|
|
||||||
fds.out = (unsigned long *) (bits + size);
|
|
||||||
fds.ex = (unsigned long *) (bits + 2*size);
|
|
||||||
fds.res_in = (unsigned long *) (bits + 3*size);
|
|
||||||
fds.res_out = (unsigned long *) (bits + 4*size);
|
|
||||||
fds.res_ex = (unsigned long *) (bits + 5*size);
|
|
||||||
|
|
||||||
if ((ret = get_fd_set(n, inp->fds_bits, fds.in)) ||
|
|
||||||
(ret = get_fd_set(n, outp->fds_bits, fds.out)) ||
|
|
||||||
(ret = get_fd_set(n, exp->fds_bits, fds.ex)))
|
|
||||||
goto out;
|
|
||||||
zero_fd_set(n, fds.res_in);
|
|
||||||
zero_fd_set(n, fds.res_out);
|
|
||||||
zero_fd_set(n, fds.res_ex);
|
|
||||||
|
|
||||||
ret = do_select(n, &fds, &timeout);
|
|
||||||
|
|
||||||
/* OSF does not copy back the remaining time. */
|
/* OSF does not copy back the remaining time. */
|
||||||
|
return core_sys_select(n, inp, outp, exp, &timeout);
|
||||||
if (ret < 0)
|
|
||||||
goto out;
|
|
||||||
if (!ret) {
|
|
||||||
ret = -ERESTARTNOHAND;
|
|
||||||
if (signal_pending(current))
|
|
||||||
goto out;
|
|
||||||
ret = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (set_fd_set(n, inp->fds_bits, fds.res_in) ||
|
|
||||||
set_fd_set(n, outp->fds_bits, fds.res_out) ||
|
|
||||||
set_fd_set(n, exp->fds_bits, fds.res_ex))
|
|
||||||
ret = -EFAULT;
|
|
||||||
|
|
||||||
out:
|
|
||||||
kfree(bits);
|
|
||||||
out_nofds:
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct rusage32 {
|
struct rusage32 {
|
||||||
|
|
|
@ -71,25 +71,13 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82378, quirk_i
|
||||||
static void __init
|
static void __init
|
||||||
quirk_cypress(struct pci_dev *dev)
|
quirk_cypress(struct pci_dev *dev)
|
||||||
{
|
{
|
||||||
/* The Notorious Cy82C693 chip. */
|
|
||||||
|
|
||||||
/* The Cypress IDE controller doesn't support native mode, but it
|
|
||||||
has programmable addresses of IDE command/control registers.
|
|
||||||
This violates PCI specifications, confuses the IDE subsystem and
|
|
||||||
causes resource conflicts between the primary HD_CMD register and
|
|
||||||
the floppy controller. Ugh. Fix that. */
|
|
||||||
if (dev->class >> 8 == PCI_CLASS_STORAGE_IDE) {
|
|
||||||
dev->resource[0].flags = 0;
|
|
||||||
dev->resource[1].flags = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The Cypress bridge responds on the PCI bus in the address range
|
/* The Cypress bridge responds on the PCI bus in the address range
|
||||||
0xffff0000-0xffffffff (conventional x86 BIOS ROM). There is no
|
0xffff0000-0xffffffff (conventional x86 BIOS ROM). There is no
|
||||||
way to turn this off. The bridge also supports several extended
|
way to turn this off. The bridge also supports several extended
|
||||||
BIOS ranges (disabled after power-up), and some consoles do turn
|
BIOS ranges (disabled after power-up), and some consoles do turn
|
||||||
them on. So if we use a large direct-map window, or a large SG
|
them on. So if we use a large direct-map window, or a large SG
|
||||||
window, we must avoid the entire 0xfff00000-0xffffffff region. */
|
window, we must avoid the entire 0xfff00000-0xffffffff region. */
|
||||||
else if (dev->class >> 8 == PCI_CLASS_BRIDGE_ISA) {
|
if (dev->class >> 8 == PCI_CLASS_BRIDGE_ISA) {
|
||||||
if (__direct_map_base + __direct_map_size >= 0xfff00000UL)
|
if (__direct_map_base + __direct_map_size >= 0xfff00000UL)
|
||||||
__direct_map_size = 0xfff00000UL - __direct_map_base;
|
__direct_map_size = 0xfff00000UL - __direct_map_base;
|
||||||
else {
|
else {
|
||||||
|
@ -220,7 +208,7 @@ pdev_save_srm_config(struct pci_dev *dev)
|
||||||
|
|
||||||
tmp = kmalloc(sizeof(*tmp), GFP_KERNEL);
|
tmp = kmalloc(sizeof(*tmp), GFP_KERNEL);
|
||||||
if (!tmp) {
|
if (!tmp) {
|
||||||
printk(KERN_ERR "%s: kmalloc() failed!\n", __FUNCTION__);
|
printk(KERN_ERR "%s: kmalloc() failed!\n", __func__);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
tmp->next = srm_saved_configs;
|
tmp->next = srm_saved_configs;
|
||||||
|
@ -391,7 +379,7 @@ pcibios_set_master(struct pci_dev *dev)
|
||||||
pci_write_config_byte(dev, PCI_LATENCY_TIMER, 64);
|
pci_write_config_byte(dev, PCI_LATENCY_TIMER, 64);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init
|
void __init
|
||||||
pcibios_claim_one_bus(struct pci_bus *b)
|
pcibios_claim_one_bus(struct pci_bus *b)
|
||||||
{
|
{
|
||||||
struct pci_dev *dev;
|
struct pci_dev *dev;
|
||||||
|
@ -405,7 +393,8 @@ pcibios_claim_one_bus(struct pci_bus *b)
|
||||||
|
|
||||||
if (r->parent || !r->start || !r->flags)
|
if (r->parent || !r->start || !r->flags)
|
||||||
continue;
|
continue;
|
||||||
pci_claim_resource(dev, i);
|
if (pci_probe_only || (r->flags & IORESOURCE_PCI_FIXED))
|
||||||
|
pci_claim_resource(dev, i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -444,8 +433,7 @@ common_init_pci(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pci_probe_only)
|
pcibios_claim_console_setup();
|
||||||
pcibios_claim_console_setup();
|
|
||||||
|
|
||||||
pci_assign_unassigned_resources();
|
pci_assign_unassigned_resources();
|
||||||
pci_fixup_irqs(alpha_mv.pci_swizzle, alpha_mv.pci_map_irq);
|
pci_fixup_irqs(alpha_mv.pci_swizzle, alpha_mv.pci_map_irq);
|
||||||
|
@ -526,8 +514,8 @@ sys_pciconfig_iobase(long which, unsigned long bus, unsigned long dfn)
|
||||||
|
|
||||||
void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen)
|
void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen)
|
||||||
{
|
{
|
||||||
unsigned long start = pci_resource_start(dev, bar);
|
resource_size_t start = pci_resource_start(dev, bar);
|
||||||
unsigned long len = pci_resource_len(dev, bar);
|
resource_size_t len = pci_resource_len(dev, bar);
|
||||||
unsigned long flags = pci_resource_flags(dev, bar);
|
unsigned long flags = pci_resource_flags(dev, bar);
|
||||||
|
|
||||||
if (!len || !start)
|
if (!len || !start)
|
||||||
|
|
|
@ -79,25 +79,21 @@ iommu_arena_new_node(int nid, struct pci_controller *hose, dma_addr_t base,
|
||||||
|
|
||||||
#ifdef CONFIG_DISCONTIGMEM
|
#ifdef CONFIG_DISCONTIGMEM
|
||||||
|
|
||||||
if (!NODE_DATA(nid) ||
|
arena = alloc_bootmem_node(NODE_DATA(nid), sizeof(*arena));
|
||||||
(NULL == (arena = alloc_bootmem_node(NODE_DATA(nid),
|
if (!NODE_DATA(nid) || !arena) {
|
||||||
sizeof(*arena))))) {
|
printk("%s: couldn't allocate arena from node %d\n"
|
||||||
printk("%s: couldn't allocate arena from node %d\n"
|
" falling back to system-wide allocation\n",
|
||||||
" falling back to system-wide allocation\n",
|
__func__, nid);
|
||||||
__FUNCTION__, nid);
|
arena = alloc_bootmem(sizeof(*arena));
|
||||||
arena = alloc_bootmem(sizeof(*arena));
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (!NODE_DATA(nid) ||
|
arena->ptes = __alloc_bootmem_node(NODE_DATA(nid), mem_size, align, 0);
|
||||||
(NULL == (arena->ptes = __alloc_bootmem_node(NODE_DATA(nid),
|
if (!NODE_DATA(nid) || !arena->ptes) {
|
||||||
mem_size,
|
printk("%s: couldn't allocate arena ptes from node %d\n"
|
||||||
align,
|
" falling back to system-wide allocation\n",
|
||||||
0)))) {
|
__func__, nid);
|
||||||
printk("%s: couldn't allocate arena ptes from node %d\n"
|
arena->ptes = __alloc_bootmem(mem_size, align, 0);
|
||||||
" falling back to system-wide allocation\n",
|
}
|
||||||
__FUNCTION__, nid);
|
|
||||||
arena->ptes = __alloc_bootmem(mem_size, align, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
#else /* CONFIG_DISCONTIGMEM */
|
#else /* CONFIG_DISCONTIGMEM */
|
||||||
|
|
||||||
|
|
|
@ -755,7 +755,7 @@ smp_call_function_on_cpu (void (*func) (void *info), void *info, int retry,
|
||||||
if (atomic_read(&data.unstarted_count) > 0) {
|
if (atomic_read(&data.unstarted_count) > 0) {
|
||||||
long start_time = jiffies;
|
long start_time = jiffies;
|
||||||
printk(KERN_ERR "%s: initial timeout -- trying long wait\n",
|
printk(KERN_ERR "%s: initial timeout -- trying long wait\n",
|
||||||
__FUNCTION__);
|
__func__);
|
||||||
timeout = jiffies + 30 * HZ;
|
timeout = jiffies + 30 * HZ;
|
||||||
while (atomic_read(&data.unstarted_count) > 0
|
while (atomic_read(&data.unstarted_count) > 0
|
||||||
&& time_before(jiffies, timeout))
|
&& time_before(jiffies, timeout))
|
||||||
|
@ -764,7 +764,7 @@ smp_call_function_on_cpu (void (*func) (void *info), void *info, int retry,
|
||||||
long delta = jiffies - start_time;
|
long delta = jiffies - start_time;
|
||||||
printk(KERN_ERR
|
printk(KERN_ERR
|
||||||
"%s: response %ld.%ld seconds into long wait\n",
|
"%s: response %ld.%ld seconds into long wait\n",
|
||||||
__FUNCTION__, delta / HZ,
|
__func__, delta / HZ,
|
||||||
(100 * (delta - ((delta / HZ) * HZ))) / HZ);
|
(100 * (delta - ((delta / HZ) * HZ))) / HZ);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -199,7 +199,7 @@ srm_env_init(void)
|
||||||
printk(KERN_INFO "%s: This Alpha system doesn't "
|
printk(KERN_INFO "%s: This Alpha system doesn't "
|
||||||
"know about SRM (or you've booted "
|
"know about SRM (or you've booted "
|
||||||
"SRM->MILO->Linux, which gets "
|
"SRM->MILO->Linux, which gets "
|
||||||
"misdetected)...\n", __FUNCTION__);
|
"misdetected)...\n", __func__);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -259,7 +259,7 @@ alcor_init_pci(void)
|
||||||
if (dev && dev->devfn == PCI_DEVFN(6,0)) {
|
if (dev && dev->devfn == PCI_DEVFN(6,0)) {
|
||||||
alpha_mv.sys.cia.gru_int_req_bits = XLT_GRU_INT_REQ_BITS;
|
alpha_mv.sys.cia.gru_int_req_bits = XLT_GRU_INT_REQ_BITS;
|
||||||
printk(KERN_INFO "%s: Detected AS500 or XLT motherboard.\n",
|
printk(KERN_INFO "%s: Detected AS500 or XLT motherboard.\n",
|
||||||
__FUNCTION__);
|
__func__);
|
||||||
}
|
}
|
||||||
pci_dev_put(dev);
|
pci_dev_put(dev);
|
||||||
}
|
}
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue