Merge branch 'master' of /pub/scm/linux/kernel/git/torvalds/linux-2.6
This commit is contained in:
Коммит
a815752ac0
|
@ -41,6 +41,7 @@ include/linux/autoconf.h
|
|||
include/linux/compile.h
|
||||
include/linux/version.h
|
||||
include/linux/utsrelease.h
|
||||
include/linux/bounds.h
|
||||
|
||||
# stgit generated dirs
|
||||
patches-*
|
||||
|
|
1
.mailmap
1
.mailmap
|
@ -88,6 +88,7 @@ Rudolf Marek <R.Marek@sh.cvut.cz>
|
|||
Rui Saraiva <rmps@joel.ist.utl.pt>
|
||||
Sachin P Sant <ssant@in.ibm.com>
|
||||
Sam Ravnborg <sam@mars.ravnborg.org>
|
||||
S.Çağlar Onur <caglar@pardus.org.tr>
|
||||
Simon Kelley <simon@thekelleys.org.uk>
|
||||
Stéphane Witzmann <stephane.witzmann@ubpmes.univ-bpclermont.fr>
|
||||
Stephen Hemminger <shemminger@osdl.org>
|
||||
|
|
|
@ -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
|
||||
dma_supported(struct device *dev, u64 mask)
|
||||
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
|
||||
mask.
|
||||
|
@ -189,7 +189,7 @@ dma_addr_t
|
|||
dma_map_single(struct device *dev, void *cpu_addr, size_t size,
|
||||
enum dma_data_direction direction)
|
||||
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)
|
||||
|
||||
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().
|
||||
|
||||
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
|
||||
-----------------------------
|
||||
|
|
|
@ -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;
|
||||
|
||||
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 devices don't have struct pci_dev (like ISA, EISA). This may be
|
||||
called in interrupt context.
|
||||
where pdev is a struct pci_dev *. This may be called in interrupt context.
|
||||
You should use dma_alloc_coherent (see DMA-API.txt) for buses
|
||||
where devices don't have struct pci_dev (like ISA, EISA).
|
||||
|
||||
This argument is needed because the DMA translations may be bus
|
||||
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
|
||||
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)
|
||||
addressable. Even if the device indicates (via PCI dma mask) that it
|
||||
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:
|
||||
|
||||
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.
|
||||
This function may not be called in interrupt context.
|
||||
|
||||
|
@ -371,9 +371,9 @@ Create a pci_pool like this:
|
|||
|
||||
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
|
||||
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,
|
||||
|
@ -472,11 +472,11 @@ To map a single region, you do:
|
|||
void *addr = buffer->ptr;
|
||||
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:
|
||||
|
||||
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.
|
||||
from the interrupt which told you that the DMA transfer is done.
|
||||
|
@ -493,17 +493,17 @@ Specifically:
|
|||
unsigned long offset = buffer->offset;
|
||||
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.
|
||||
|
||||
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;
|
||||
|
||||
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:
|
||||
|
||||
pci_unmap_sg(dev, sglist, nents, direction);
|
||||
pci_unmap_sg(pdev, sglist, nents, direction);
|
||||
|
||||
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
|
||||
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:
|
||||
|
||||
pci_dma_sync_sg_for_cpu(dev, sglist, nents, direction);
|
||||
pci_dma_sync_sg_for_cpu(pdev, sglist, nents, direction);
|
||||
|
||||
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
|
||||
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:
|
||||
|
||||
|
@ -739,7 +739,7 @@ failure can be determined by:
|
|||
|
||||
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)) {
|
||||
/*
|
||||
* 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 \
|
||||
gadget.xml libata.xml mtdnand.xml librs.xml rapidio.xml \
|
||||
genericirq.xml s390-drivers.xml uio-howto.xml scsi.xml \
|
||||
mac80211.xml
|
||||
mac80211.xml debugobjects.xml
|
||||
|
||||
###
|
||||
# The build process is as follows (targets):
|
||||
|
|
|
@ -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>
|
|
@ -72,7 +72,7 @@
|
|||
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
|
||||
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
|
||||
breakpoints in kernel code and perform some limited execution
|
||||
stepping.
|
||||
|
@ -93,8 +93,10 @@
|
|||
<chapter id="CompilingAKernel">
|
||||
<title>Compiling a kernel</title>
|
||||
<para>
|
||||
To enable <symbol>CONFIG_KGDB</symbol>, look under the "Kernel debugging"
|
||||
and then select "KGDB: kernel debugging with remote gdb".
|
||||
To enable <symbol>CONFIG_KGDB</symbol> you should first turn on
|
||||
"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>
|
||||
Next you should choose one of more I/O drivers to interconnect debugging
|
||||
|
|
|
@ -133,7 +133,6 @@
|
|||
!Idrivers/rapidio/rio-sysfs.c
|
||||
</sect1>
|
||||
<sect1 id="PPC32_support"><title>PPC32 support</title>
|
||||
!Iarch/powerpc/kernel/rio.c
|
||||
!Earch/powerpc/sysdev/fsl_rio.c
|
||||
!Iarch/powerpc/sysdev/fsl_rio.c
|
||||
</sect1>
|
||||
|
|
|
@ -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)
|
||||
|
||||
Called when a task is forked into a cgroup. Also called during
|
||||
registration for all existing tasks.
|
||||
Called when a task is forked into a cgroup.
|
||||
|
||||
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
|
||||
work on some specific architectures or
|
||||
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_max_freq show the current "policy limits" (in
|
||||
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
|
||||
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
|
||||
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
|
||||
- cpu_exclusive flag: is cpu 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
|
||||
|
||||
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
|
||||
Memory Nodes.
|
||||
|
||||
A cpuset that is mem_exclusive restricts kernel allocations for
|
||||
page, buffer and other data commonly shared by the kernel across
|
||||
multiple users. All cpusets, whether mem_exclusive or not, restrict
|
||||
allocations of memory for user space. This enables configuring a
|
||||
system so that several independent jobs can share common kernel data,
|
||||
such as file system pages, while isolating each jobs user allocation in
|
||||
its own cpuset. To do this, construct a large mem_exclusive cpuset to
|
||||
hold all the jobs, and construct child, non-mem_exclusive cpusets for
|
||||
each individual job. Only a small amount of typical kernel memory,
|
||||
such as requests from interrupt handlers, is allowed to be taken
|
||||
outside even a mem_exclusive cpuset.
|
||||
A cpuset that is mem_exclusive *or* mem_hardwall is "hardwalled",
|
||||
i.e. it restricts kernel allocations for page, buffer and other data
|
||||
commonly shared by the kernel across multiple users. All cpusets,
|
||||
whether hardwalled or not, restrict allocations of memory for user
|
||||
space. This enables configuring a system so that several independent
|
||||
jobs can share common kernel data, such as file system pages, while
|
||||
isolating each job's user allocation in its own cpuset. To do this,
|
||||
construct a large mem_exclusive cpuset to hold all the jobs, and
|
||||
construct child, non-mem_exclusive cpusets for each individual job.
|
||||
Only a small amount of typical kernel memory, such as requests from
|
||||
interrupt handlers, is allowed to be taken outside even a
|
||||
mem_exclusive cpuset.
|
||||
|
||||
|
||||
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:
|
||||
# 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:
|
||||
the CPUs and Memory Nodes it can use, the processes that are using
|
||||
|
|
|
@ -141,6 +141,7 @@ mkprep
|
|||
mktables
|
||||
mktree
|
||||
modpost
|
||||
modules.order
|
||||
modversions.h*
|
||||
offset.h
|
||||
offsets.h
|
||||
|
@ -171,6 +172,7 @@ sm_tbl*
|
|||
split-include
|
||||
tags
|
||||
tftpboot.img
|
||||
timeconst.h
|
||||
times.h*
|
||||
tkparse
|
||||
trix_boot.h
|
||||
|
|
|
@ -138,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
|
||||
When: July 2008
|
||||
Why: ACPI sysfs conversion should be finished by January 2008.
|
||||
|
|
|
@ -463,11 +463,17 @@ SwapTotal: 0 kB
|
|||
SwapFree: 0 kB
|
||||
Dirty: 968 kB
|
||||
Writeback: 0 kB
|
||||
AnonPages: 861800 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
|
||||
Committed_AS: 100056 kB
|
||||
PageTables: 24448 kB
|
||||
VmallocTotal: 112216 kB
|
||||
VmallocUsed: 428 kB
|
||||
VmallocChunk: 111088 kB
|
||||
|
@ -503,8 +509,17 @@ VmallocChunk: 111088 kB
|
|||
on 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
|
||||
AnonPages: Non-file backed pages mapped into userspace page tables
|
||||
Mapped: files which have been mmaped, such as libraries
|
||||
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'),
|
||||
this is the total amount of memory currently available to
|
||||
be allocated on the system. This limit is only adhered to
|
||||
|
@ -531,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
|
||||
to guarantee that processes will not fail due to lack of
|
||||
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
|
||||
VmallocUsed: amount of vmalloc area which is used
|
||||
VmallocChunk: largest contigious block of vmalloc area which is free
|
||||
|
|
|
@ -33,7 +33,8 @@ Known Issues
|
|||
------------
|
||||
|
||||
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
|
||||
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.
|
||||
|
|
|
@ -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
|
||||
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);
|
||||
|
||||
Remember that the i2c_driver does not create those client handles. The
|
||||
|
|
|
@ -40,9 +40,17 @@ Protocol 2.05: (Kernel 2.6.20) Make protected mode kernel relocatable.
|
|||
Introduce relocatable_kernel and kernel_alignment fields.
|
||||
|
||||
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.09: (kernel 2.6.26) Added a field of 64-bit physical
|
||||
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
|
||||
|
|
|
@ -104,14 +104,15 @@ applicable everywhere (see syntax).
|
|||
Reverse dependencies can only be used with boolean or tristate
|
||||
symbols.
|
||||
Note:
|
||||
select is evil.... select will by brute force set a symbol
|
||||
equal to 'y' without visiting the dependencies. So abusing
|
||||
select you are able to select a symbol FOO even if FOO depends
|
||||
on BAR that is not set. In general use select only for
|
||||
non-visible symbols (no prompts anywhere) and for symbols with
|
||||
no dependencies. That will limit the usefulness but on the
|
||||
other hand avoid the illegal configurations all over. kconfig
|
||||
should one day warn about such things.
|
||||
select should be used with care. select will force
|
||||
a symbol to a value without visiting the dependencies.
|
||||
By abusing select you are able to select a symbol FOO even
|
||||
if FOO depends on BAR that is not set.
|
||||
In general use select only for non-visible symbols
|
||||
(no prompts anywhere) and for symbols with no dependencies.
|
||||
That will limit the usefulness but on the other hand avoid
|
||||
the illegal configurations all over.
|
||||
kconfig should one day warn about such things.
|
||||
|
||||
- numerical ranges: "range" <symbol> <symbol> ["if" <expr>]
|
||||
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).
|
||||
|
||||
|
||||
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
|
||||
|
||||
|
|
|
@ -245,6 +245,8 @@ The syntax is:
|
|||
crashkernel=<range1>:<size1>[,<range2>:<size2>,...][@offset]
|
||||
range=start-[end]
|
||||
|
||||
'start' is inclusive and 'end' is exclusive.
|
||||
|
||||
For example:
|
||||
|
||||
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
|
||||
(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
|
||||
|
||||
|
||||
|
||||
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
|
||||
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.
|
||||
uart[8250],io,<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
|
||||
only useful to kernel developers.
|
||||
|
||||
debug_objects [KNL] Enable object debugging
|
||||
|
||||
decnet.addr= [HW,NET]
|
||||
Format: <area>[,<node>]
|
||||
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]
|
||||
|
||||
edd= [EDD]
|
||||
Format: {"of[f]" | "sk[ipmbr]"}
|
||||
See comment in arch/i386/boot/edd.S
|
||||
Format: {"off" | "on" | "skip[mbr]"}
|
||||
|
||||
eisa_irq_edge= [PARISC,HW]
|
||||
See header of drivers/parisc/eisa.c.
|
||||
|
@ -1088,9 +1094,6 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
mac5380= [HW,SCSI] Format:
|
||||
<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) in a generic kernel.
|
||||
Example: machvec=hpzx1_swiotlb
|
||||
|
@ -1389,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.
|
||||
|
||||
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]
|
||||
Format: <io>
|
||||
|
||||
|
@ -1512,6 +1522,8 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
This is normally done in pci_enable_device(),
|
||||
so this option is a temporary workaround
|
||||
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
|
||||
just use the configuration from the
|
||||
bootloader. This is currently used on
|
||||
|
|
|
@ -11,26 +11,29 @@ request_key*():
|
|||
|
||||
struct key *request_key(const struct key_type *type,
|
||||
const char *description,
|
||||
const char *callout_string);
|
||||
const char *callout_info);
|
||||
|
||||
or:
|
||||
|
||||
struct key *request_key_with_auxdata(const struct key_type *type,
|
||||
const char *description,
|
||||
const char *callout_string,
|
||||
const char *callout_info,
|
||||
size_t callout_len,
|
||||
void *aux);
|
||||
|
||||
or:
|
||||
|
||||
struct key *request_key_async(const struct key_type *type,
|
||||
const char *description,
|
||||
const char *callout_string);
|
||||
const char *callout_info,
|
||||
size_t callout_len);
|
||||
|
||||
or:
|
||||
|
||||
struct key *request_key_async_with_auxdata(const struct key_type *type,
|
||||
const char *description,
|
||||
const char *callout_string,
|
||||
const char *callout_info,
|
||||
size_t callout_len,
|
||||
void *aux);
|
||||
|
||||
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.
|
||||
|
||||
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
|
||||
user's quota.
|
||||
|
@ -329,6 +330,27 @@ about the status of the key service:
|
|||
<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
|
||||
===============================
|
||||
|
@ -711,6 +733,27 @@ The keyctl syscall functions are:
|
|||
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
|
||||
===============
|
||||
|
@ -771,7 +814,7 @@ payload contents" for more information.
|
|||
|
||||
struct key *request_key(const struct key_type *type,
|
||||
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
|
||||
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,
|
||||
const char *description,
|
||||
const char *callout_string,
|
||||
const void *callout_info,
|
||||
size_t callout_len,
|
||||
void *aux);
|
||||
|
||||
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:
|
||||
|
||||
struct key *request_key_async(const struct key_type *type,
|
||||
const char *description,
|
||||
const char *callout_string);
|
||||
const void *callout_info,
|
||||
size_t callout_len);
|
||||
|
||||
or:
|
||||
|
||||
struct key *request_key_async_with_auxdata(const struct key_type *type,
|
||||
const char *description,
|
||||
const char *callout_string,
|
||||
const char *callout_info,
|
||||
size_t callout_len,
|
||||
void *aux);
|
||||
|
||||
which are asynchronous equivalents of request_key() and
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
ThinkPad ACPI Extras Driver
|
||||
|
||||
Version 0.19
|
||||
January 06th, 2008
|
||||
Version 0.20
|
||||
April 09th, 2008
|
||||
|
||||
Borislav Deianov <borislav@users.sf.net>
|
||||
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
|
||||
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
|
||||
------
|
||||
|
@ -571,6 +576,47 @@ netlink interface and the input layer interface, and don't bother at all
|
|||
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
|
||||
---------
|
||||
|
||||
|
@ -647,16 +693,31 @@ while others are still having problems. For more information:
|
|||
|
||||
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
|
||||
models which do not make the status available will show it as
|
||||
"unknown". The available commands are:
|
||||
procfs: /proc/acpi/ibm/light
|
||||
sysfs attributes: as per LED class, for the "tpacpi::thinklight" LED
|
||||
|
||||
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 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
|
||||
------------------------------------------
|
||||
|
||||
|
@ -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
|
||||
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
|
||||
available commands are:
|
||||
procfs: /proc/acpi/ibm/led
|
||||
sysfs attributes: as per LED class, see below for names
|
||||
|
||||
echo '<led number> on' >/proc/acpi/ibm/led
|
||||
echo '<led number> off' >/proc/acpi/ibm/led
|
||||
echo '<led number> blink' >/proc/acpi/ibm/led
|
||||
Some of the LED indicators can be controlled through this feature. On
|
||||
some older ThinkPad models, it is possible to query the status of the
|
||||
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
|
||||
controlled varies from model to model. Here is the mapping on the X40:
|
||||
procfs notes:
|
||||
|
||||
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
|
||||
1 - battery (orange)
|
||||
2 - battery (green)
|
||||
3 - UltraBase
|
||||
3 - UltraBase/dock
|
||||
4 - UltraBay
|
||||
5 - UltraBase battery slot
|
||||
6 - (unknown)
|
||||
7 - standby
|
||||
|
||||
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
|
||||
----------------------------------
|
||||
|
||||
|
@ -1090,6 +1186,15 @@ it there will be the following attributes:
|
|||
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
|
||||
---------------------------------------
|
||||
|
||||
|
|
|
@ -131,6 +131,9 @@ struct device
|
|||
/* Any queues attached to this device */
|
||||
struct virtqueue *vq;
|
||||
|
||||
/* Handle status being finalized (ie. feature bits stable). */
|
||||
void (*ready)(struct device *me);
|
||||
|
||||
/* Device-specific data. */
|
||||
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));
|
||||
}
|
||||
|
||||
/* When the Guest asks us to reset a device, it's is fairly easy. */
|
||||
static void reset_device(struct device *dev)
|
||||
/* When the Guest tells us they updated the status field, we handle it. */
|
||||
static void update_device_status(struct device *dev)
|
||||
{
|
||||
struct virtqueue *vq;
|
||||
|
||||
verbose("Resetting device %s\n", dev->name);
|
||||
/* Clear the status. */
|
||||
dev->desc->status = 0;
|
||||
/* This is a reset. */
|
||||
if (dev->desc->status == 0) {
|
||||
verbose("Resetting device %s\n", dev->name);
|
||||
|
||||
/* Clear any features they've acked. */
|
||||
memset(get_feature_bits(dev) + dev->desc->feature_len, 0,
|
||||
dev->desc->feature_len);
|
||||
/* Clear any features they've acked. */
|
||||
memset(get_feature_bits(dev) + dev->desc->feature_len, 0,
|
||||
dev->desc->feature_len);
|
||||
|
||||
/* Zero out the virtqueues. */
|
||||
for (vq = dev->vq; vq; vq = vq->next) {
|
||||
memset(vq->vring.desc, 0,
|
||||
vring_size(vq->config.num, getpagesize()));
|
||||
vq->last_avail_idx = 0;
|
||||
/* Zero out the virtqueues. */
|
||||
for (vq = dev->vq; vq; vq = vq->next) {
|
||||
memset(vq->vring.desc, 0,
|
||||
vring_size(vq->config.num, getpagesize()));
|
||||
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. */
|
||||
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) {
|
||||
reset_device(i);
|
||||
update_device_status(i);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1170,6 +1189,7 @@ static struct device *new_device(const char *name, u16 type, int fd,
|
|||
dev->handle_input = handle_input;
|
||||
dev->name = name;
|
||||
dev->vq = NULL;
|
||||
dev->ready = NULL;
|
||||
|
||||
/* Append to device list. Prepending to a single-linked list is
|
||||
* 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;
|
||||
unsigned int head, out_num, in_num, wlen;
|
||||
int ret;
|
||||
struct virtio_blk_inhdr *in;
|
||||
u8 *in;
|
||||
struct virtio_blk_outhdr *out;
|
||||
struct iovec iov[dev->vq->vring.num];
|
||||
off64_t off;
|
||||
|
@ -1416,7 +1436,7 @@ static bool service_io(struct device *dev)
|
|||
head, out_num, in_num);
|
||||
|
||||
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;
|
||||
|
||||
/* 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. */
|
||||
if (out->type & VIRTIO_BLK_T_SCSI_CMD) {
|
||||
fprintf(stderr, "Scsi commands unsupported\n");
|
||||
in->status = VIRTIO_BLK_S_UNSUPP;
|
||||
*in = VIRTIO_BLK_S_UNSUPP;
|
||||
wlen = sizeof(*in);
|
||||
} else if (out->type & VIRTIO_BLK_T_OUT) {
|
||||
/* Write */
|
||||
|
@ -1453,7 +1473,7 @@ static bool service_io(struct device *dev)
|
|||
errx(1, "Write past end %llu+%u", off, ret);
|
||||
}
|
||||
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 {
|
||||
/* Read */
|
||||
|
||||
|
@ -1466,10 +1486,10 @@ static bool service_io(struct device *dev)
|
|||
verbose("READ from sector %llu: %i\n", out->sector, ret);
|
||||
if (ret >= 0) {
|
||||
wlen = sizeof(*in) + ret;
|
||||
in->status = VIRTIO_BLK_S_OK;
|
||||
*in = VIRTIO_BLK_S_OK;
|
||||
} else {
|
||||
wlen = sizeof(*in);
|
||||
in->status = VIRTIO_BLK_S_IOERR;
|
||||
*in = VIRTIO_BLK_S_IOERR;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
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
|
||||
debuggers if this is a clean kernel or if anything unusual has
|
||||
occurred. Tainting is permanent: even if an offending module is
|
||||
|
|
|
@ -186,6 +186,12 @@ Recommended soc5200 child nodes; populate as needed for your board
|
|||
name device_type compatible Description
|
||||
---- ----------- ---------- -----------
|
||||
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
|
||||
mscan@<addr> mscan mpc5200-mscan CAN bus controller
|
||||
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
|
||||
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
|
||||
================
|
||||
|
||||
|
|
|
@ -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 -
|
||||
(emaild-id:megaraidlinux@lsi.com)
|
||||
Sumant Patro
|
||||
|
|
|
@ -795,6 +795,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
|||
lg-lw LG LW20/LW25 laptop
|
||||
tcl TCL S700
|
||||
clevo Clevo laptops (m520G, m665n)
|
||||
medion Medion Rim 2150
|
||||
test for testing/debugging purpose, almost all controls can be
|
||||
adjusted. Appearing only when compiled with
|
||||
$CONFIG_SND_DEBUG=y
|
||||
|
|
|
@ -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
|
||||
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.
|
||||
|
||||
'n' - Used to make RT tasks nice-able
|
||||
|
|
|
@ -108,10 +108,12 @@ and throttle appropriate devices.
|
|||
RO read only 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[0-*]:
|
||||
/sys/class/thermal/thermal_zone[0-*]:
|
||||
|-----type: Type of the thermal zone
|
||||
|-----temp: Current temperature
|
||||
|-----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
|
||||
|
||||
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/...)
|
||||
|-----max_state: Maximum 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
|
||||
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-*]_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 *
|
||||
|
@ -141,7 +152,10 @@ thermal_zone_bind_cooling_device/thermal_zone_unbind_cooling_device successful e
|
|||
|
||||
type Strings which represent the thermal zone type.
|
||||
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
|
||||
Required
|
||||
|
||||
|
@ -218,7 +232,7 @@ the sys I/F structure will be built like this:
|
|||
/sys/class/thermal:
|
||||
|
||||
|thermal_zone1:
|
||||
|-----type: ACPI thermal zone
|
||||
|-----type: acpitz
|
||||
|-----temp: 37000
|
||||
|-----mode: kernel
|
||||
|-----trip_point_0_temp: 100000
|
||||
|
@ -243,3 +257,10 @@ the sys I/F structure will be built like this:
|
|||
|-----type: Fan
|
||||
|-----max_state: 2
|
||||
|-----cur_state: 0
|
||||
|
||||
/sys/class/hwmon:
|
||||
|
||||
|hwmon0:
|
||||
|-----name: acpitz
|
||||
|-----temp1_input: 37000
|
||||
|-----temp1_crit: 100000
|
||||
|
|
|
@ -128,7 +128,7 @@
|
|||
127 -> Beholder BeholdTV 507 FM/RDS / BeholdTV 509 FM [0000:5071,0000:507B,5ace:5070,5ace:5090]
|
||||
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]
|
||||
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]
|
||||
132 -> Genius TVGO AM11MCE
|
||||
133 -> NXP Snake DVB-S reference design
|
||||
|
@ -140,3 +140,4 @@
|
|||
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
|
|
@ -31,14 +31,14 @@ struct slabinfo {
|
|||
int hwcache_align, object_size, objs_per_slab;
|
||||
int sanity_checks, slab_size, store_user, trace;
|
||||
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 free_fastpath, free_slowpath;
|
||||
unsigned long free_frozen, free_add_partial, free_remove_partial;
|
||||
unsigned long alloc_from_partial, alloc_slab, free_slab, alloc_refill;
|
||||
unsigned long cpuslab_flush, deactivate_full, deactivate_empty;
|
||||
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_partial[MAX_NODES];
|
||||
} slabinfo[MAX_SLABS];
|
||||
|
@ -293,7 +293,7 @@ int line = 0;
|
|||
void first_line(void)
|
||||
{
|
||||
if (show_activity)
|
||||
printf("Name Objects Alloc Free %%Fast\n");
|
||||
printf("Name Objects Alloc Free %%Fast Fallb O\n");
|
||||
else
|
||||
printf("Name Objects Objsize Space "
|
||||
"Slabs/Part/Cpu O/S O %%Fr %%Ef Flg\n");
|
||||
|
@ -540,7 +540,8 @@ void slabcache(struct slabinfo *s)
|
|||
return;
|
||||
|
||||
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++)
|
||||
first_line();
|
||||
|
@ -572,11 +573,12 @@ void slabcache(struct slabinfo *s)
|
|||
total_alloc = s->alloc_fastpath + s->alloc_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,
|
||||
total_alloc, total_free,
|
||||
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
|
||||
printf("%-21s %8ld %7d %8s %14s %4d %1d %3ld %3ld %s\n",
|
||||
|
@ -776,7 +778,6 @@ void totals(void)
|
|||
unsigned long used;
|
||||
unsigned long long wasted;
|
||||
unsigned long long objwaste;
|
||||
long long objects_in_partial_slabs;
|
||||
unsigned long percentage_partial_slabs;
|
||||
unsigned long percentage_partial_objs;
|
||||
|
||||
|
@ -790,18 +791,11 @@ void totals(void)
|
|||
wasted = size - used;
|
||||
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;
|
||||
if (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;
|
||||
|
||||
if (percentage_partial_objs > 100)
|
||||
|
@ -823,8 +817,8 @@ void totals(void)
|
|||
min_objects = s->objects;
|
||||
if (used < min_used)
|
||||
min_used = used;
|
||||
if (objects_in_partial_slabs < min_partobj)
|
||||
min_partobj = objects_in_partial_slabs;
|
||||
if (s->objects_partial < min_partobj)
|
||||
min_partobj = s->objects_partial;
|
||||
if (percentage_partial_slabs < min_ppart)
|
||||
min_ppart = percentage_partial_slabs;
|
||||
if (percentage_partial_objs < min_ppartobj)
|
||||
|
@ -848,8 +842,8 @@ void totals(void)
|
|||
max_objects = s->objects;
|
||||
if (used > max_used)
|
||||
max_used = used;
|
||||
if (objects_in_partial_slabs > max_partobj)
|
||||
max_partobj = objects_in_partial_slabs;
|
||||
if (s->objects_partial > max_partobj)
|
||||
max_partobj = s->objects_partial;
|
||||
if (percentage_partial_slabs > max_ppart)
|
||||
max_ppart = percentage_partial_slabs;
|
||||
if (percentage_partial_objs > max_ppartobj)
|
||||
|
@ -864,7 +858,7 @@ void totals(void)
|
|||
|
||||
total_objects += s->objects;
|
||||
total_used += used;
|
||||
total_partobj += objects_in_partial_slabs;
|
||||
total_partobj += s->objects_partial;
|
||||
total_ppart += percentage_partial_slabs;
|
||||
total_ppartobj += percentage_partial_objs;
|
||||
|
||||
|
@ -1160,6 +1154,8 @@ void read_slab_dir(void)
|
|||
slab->hwcache_align = get_obj("hwcache_align");
|
||||
slab->object_size = get_obj("object_size");
|
||||
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->order = get_obj("order");
|
||||
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_tail = get_obj("deactivate_to_tail");
|
||||
slab->deactivate_remote_frees = get_obj("deactivate_remote_frees");
|
||||
slab->order_fallback = get_obj("order_fallback");
|
||||
chdir("..");
|
||||
if (slab->name[0] == ':')
|
||||
alias_targets++;
|
||||
|
|
169
MAINTAINERS
169
MAINTAINERS
|
@ -752,11 +752,13 @@ W: http://atmelwlandriver.sourceforge.net/
|
|||
S: Maintained
|
||||
|
||||
AUDIT SUBSYSTEM
|
||||
P: David Woodhouse
|
||||
M: dwmw2@infradead.org
|
||||
P: Al Viro
|
||||
M: viro@zeniv.linux.org.uk
|
||||
P: Eric Paris
|
||||
M: eparis@redhat.com
|
||||
L: linux-audit@redhat.com (subscribers-only)
|
||||
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
|
||||
|
||||
AUXILIARY DISPLAY DRIVERS
|
||||
|
@ -1037,7 +1039,7 @@ P: Urs Thuermann
|
|||
M: urs.thuermann@volkswagen.de
|
||||
P: Oliver Hartkopp
|
||||
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/
|
||||
S: Maintained
|
||||
|
||||
|
@ -1194,9 +1196,9 @@ S: Maintained
|
|||
|
||||
CPUSETS
|
||||
P: Paul Jackson
|
||||
P: Simon Derr
|
||||
P: Paul Menage
|
||||
M: pj@sgi.com
|
||||
M: simon.derr@bull.net
|
||||
M: menage@google.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
W: http://www.bullopensource.org/cpuset/
|
||||
S: Supported
|
||||
|
@ -1531,6 +1533,13 @@ L: bluesmoke-devel@lists.sourceforge.net
|
|||
W: bluesmoke.sourceforge.net
|
||||
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
|
||||
P: Andrey V. Savochkin
|
||||
M: saw@saw.sw.com.sg
|
||||
|
@ -1548,6 +1557,14 @@ M: raisch@de.ibm.com
|
|||
L: general@lists.openfabrics.org
|
||||
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
|
||||
P: James Smart
|
||||
M: james.smart@emulex.com
|
||||
|
@ -2694,7 +2711,7 @@ P: David Howells
|
|||
M: dhowells@redhat.com
|
||||
P: Koichi Yasutake
|
||||
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/
|
||||
S: Maintained
|
||||
|
||||
|
@ -2757,7 +2774,7 @@ M: rubini@ipvvis.unipv.it
|
|||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
MOXA SMARTIO/INDUSTIO SERIAL CARD (MXSER 2.0)
|
||||
MOXA SMARTIO/INDUSTIO/INTELLIO SERIAL CARD
|
||||
P: Jiri Slaby
|
||||
M: jirislaby@gmail.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
|
@ -3113,7 +3130,8 @@ PCI SUBSYSTEM
|
|||
P: Jesse Barnes
|
||||
M: jbarnes@virtuousgeek.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
|
||||
|
||||
PCI HOTPLUG CORE
|
||||
|
@ -3574,6 +3592,13 @@ M: pfg@sgi.com
|
|||
L: linux-ia64@vger.kernel.org
|
||||
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
|
||||
P: Andrey Panin
|
||||
M: pazke@donpac.ru
|
||||
|
@ -3740,42 +3765,6 @@ M: chrisw@sous-sol.org
|
|||
L: stable@kernel.org
|
||||
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)
|
||||
P: Marc Singer
|
||||
M: elf@buici.com
|
||||
|
@ -3872,6 +3861,12 @@ P: Christoph Hellwig
|
|||
M: hch@infradead.org
|
||||
S: Maintained
|
||||
|
||||
TASKSTATS STATISTICS INTERFACE
|
||||
P: Shailabh Nagar
|
||||
M: nagar@watson.ibm.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
TC CLASSIFIER
|
||||
P: Jamal Hadi Salim
|
||||
M: hadi@cyberus.ca
|
||||
|
@ -3894,6 +3889,25 @@ M: andy@greyhouse.net
|
|||
L: netdev@vger.kernel.org
|
||||
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
|
||||
P: Alex Dubov
|
||||
M: oakad@yahoo.com
|
||||
|
@ -3911,12 +3925,6 @@ P: Deepak Saxena
|
|||
M: dsaxena@plexity.net
|
||||
S: Maintained
|
||||
|
||||
TASKSTATS STATISTICS INTERFACE
|
||||
P: Shailabh Nagar
|
||||
M: nagar@watson.ibm.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
TIPC NETWORK LAYER
|
||||
P: Per Liden
|
||||
M: per.liden@ericsson.com
|
||||
|
@ -3950,6 +3958,16 @@ L: tlinux-users@tce.toshiba-dme.co.jp
|
|||
W: http://www.buzzard.org.uk/toshiba/
|
||||
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
|
||||
P: Muli Ben-Yehuda
|
||||
M: mulix@mulix.org
|
||||
|
@ -3962,6 +3980,12 @@ M: trivial@kernel.org
|
|||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
TTY LAYER
|
||||
P: Alan Cox
|
||||
M: alan@lxorguk.ukuu.org.uk
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
TULIP NETWORK DRIVERS
|
||||
P: Grant Grundler
|
||||
M: grundler@parisc-linux.org
|
||||
|
@ -4027,6 +4051,12 @@ L: linux-usb@vger.kernel.org
|
|||
S: Maintained
|
||||
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
|
||||
P: Peter Korsgaard
|
||||
M: jacmet@sunsite.dk
|
||||
|
@ -4130,6 +4160,20 @@ L: linux-usb@vger.kernel.org
|
|||
W: http://www.chello.nl/~j.vreeken/se401/
|
||||
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
|
||||
P: Matthias Bruestle and Harald Welte
|
||||
M: support@reiner-sct.com
|
||||
|
@ -4149,20 +4193,6 @@ M: gregkh@suse.de
|
|||
L: linux-usb@vger.kernel.org
|
||||
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
|
||||
P: Gary Brubaker
|
||||
M: xavyer@ix.netcom.com
|
||||
|
@ -4265,7 +4295,7 @@ M: gregkh@suse.de
|
|||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
FAT/VFAT/MSDOS FILESYSTEM:
|
||||
VFAT/FAT/MSDOS FILESYSTEM:
|
||||
P: OGAWA Hirofumi
|
||||
M: hirofumi@mail.parknet.co.jp
|
||||
L: linux-kernel@vger.kernel.org
|
||||
|
@ -4310,6 +4340,13 @@ M: dushistov@mail.ru
|
|||
L: linux-kernel@vger.kernel.org
|
||||
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
|
||||
P: Cesar Miquel
|
||||
M: miquel@df.uba.ar
|
||||
|
|
37
Makefile
37
Makefile
|
@ -1,7 +1,7 @@
|
|||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 25
|
||||
EXTRAVERSION =
|
||||
SUBLEVEL = 26
|
||||
EXTRAVERSION = -rc1
|
||||
NAME = Funky Weasel is Jiggy wit it
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
@ -794,7 +794,7 @@ endif # ifdef CONFIG_KALLSYMS
|
|||
quiet_cmd_vmlinux-modpost = LD $@
|
||||
cmd_vmlinux-modpost = $(LD) $(LDFLAGS) -r -o $@ \
|
||||
$(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
|
||||
:
|
||||
+$(call cmd,vmlinux-modpost)
|
||||
|
@ -818,7 +818,9 @@ endif
|
|||
ifdef CONFIG_KALLSYMS
|
||||
.tmp_vmlinux1: vmlinux.o
|
||||
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)
|
||||
|
||||
# The actual objects are generated when descending,
|
||||
|
@ -1174,8 +1176,10 @@ rpm: include/config/kernel.release FORCE
|
|||
# Brief documentation of the typical targets used
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
boards := $(wildcard $(srctree)/arch/$(ARCH)/configs/*_defconfig)
|
||||
boards := $(wildcard $(srctree)/arch/$(SRCARCH)/configs/*_defconfig)
|
||||
boards := $(notdir $(boards))
|
||||
board-dirs := $(dir $(wildcard $(srctree)/arch/$(SRCARCH)/configs/*/*_defconfig))
|
||||
board-dirs := $(sort $(notdir $(board-dirs:/=)))
|
||||
|
||||
help:
|
||||
@echo 'Cleaning targets:'
|
||||
|
@ -1221,14 +1225,19 @@ help:
|
|||
@echo 'Documentation targets:'
|
||||
@$(MAKE) -f $(srctree)/Documentation/DocBook/Makefile dochelp
|
||||
@echo ''
|
||||
@echo 'Architecture specific targets ($(ARCH)):'
|
||||
@echo 'Architecture specific targets ($(SRCARCH)):'
|
||||
@$(if $(archhelp),$(archhelp),\
|
||||
echo ' No architecture specific help defined for $(ARCH)')
|
||||
echo ' No architecture specific help defined for $(SRCARCH)')
|
||||
@echo ''
|
||||
@$(if $(boards), \
|
||||
$(foreach b, $(boards), \
|
||||
printf " %-24s - Build for %s\\n" $(b) $(subst _defconfig,,$(b));) \
|
||||
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=2 [targets] 2 => give reason for rebuild of target'
|
||||
|
@ -1240,6 +1249,20 @@ help:
|
|||
@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
|
||||
# ---------------------------------------------------------------------------
|
||||
%docs: scripts_basic FORCE
|
||||
|
|
|
@ -36,3 +36,6 @@ config HAVE_KPROBES
|
|||
|
||||
config HAVE_KRETPROBES
|
||||
def_bool n
|
||||
|
||||
config HAVE_DMA_ATTRS
|
||||
def_bool n
|
||||
|
|
|
@ -8,13 +8,9 @@
|
|||
#include <linux/stddef.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/ptrace.h>
|
||||
#include <linux/kbuild.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)
|
||||
{
|
||||
DEFINE(TI_TASK, offsetof(struct thread_info, task));
|
||||
|
|
|
@ -981,27 +981,18 @@ asmlinkage int
|
|||
osf_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp,
|
||||
struct timeval32 __user *tvp)
|
||||
{
|
||||
fd_set_bits fds;
|
||||
char *bits;
|
||||
size_t size;
|
||||
long timeout;
|
||||
int ret = -EINVAL;
|
||||
struct fdtable *fdt;
|
||||
int max_fds;
|
||||
|
||||
timeout = MAX_SCHEDULE_TIMEOUT;
|
||||
s64 timeout = MAX_SCHEDULE_TIMEOUT;
|
||||
if (tvp) {
|
||||
time_t sec, usec;
|
||||
|
||||
if (!access_ok(VERIFY_READ, tvp, sizeof(*tvp))
|
||||
|| __get_user(sec, &tvp->tv_sec)
|
||||
|| __get_user(usec, &tvp->tv_usec)) {
|
||||
ret = -EFAULT;
|
||||
goto out_nofds;
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
if (sec < 0 || usec < 0)
|
||||
goto out_nofds;
|
||||
return -EINVAL;
|
||||
|
||||
if ((unsigned long) sec < MAX_SELECT_SECONDS) {
|
||||
timeout = (usec + 1000000/HZ - 1) / (1000000/HZ);
|
||||
|
@ -1009,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. */
|
||||
|
||||
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;
|
||||
return core_sys_select(n, inp, outp, exp, &timeout);
|
||||
}
|
||||
|
||||
struct rusage32 {
|
||||
|
|
|
@ -514,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)
|
||||
{
|
||||
unsigned long start = pci_resource_start(dev, bar);
|
||||
unsigned long len = pci_resource_len(dev, bar);
|
||||
resource_size_t start = pci_resource_start(dev, bar);
|
||||
resource_size_t len = pci_resource_len(dev, bar);
|
||||
unsigned long flags = pci_resource_flags(dev, bar);
|
||||
|
||||
if (!len || !start)
|
||||
|
|
|
@ -8,6 +8,7 @@ mainmenu "Linux Kernel Configuration"
|
|||
config ARM
|
||||
bool
|
||||
default y
|
||||
select HAVE_IDE
|
||||
select RTC_LIB
|
||||
select SYS_SUPPORTS_APM_EMULATION
|
||||
select HAVE_OPROFILE
|
||||
|
@ -223,7 +224,6 @@ config ARCH_CLPS7500
|
|||
select TIMER_ACORN
|
||||
select ISA
|
||||
select NO_IOPORT
|
||||
select HAVE_IDE
|
||||
help
|
||||
Support for the Cirrus Logic PS7500FE system-on-a-chip.
|
||||
|
||||
|
@ -236,7 +236,6 @@ config ARCH_CO285
|
|||
bool "Co-EBSA285"
|
||||
select FOOTBRIDGE
|
||||
select FOOTBRIDGE_ADDIN
|
||||
select HAVE_IDE
|
||||
help
|
||||
Support for Intel's EBSA285 companion chip.
|
||||
|
||||
|
@ -262,7 +261,6 @@ config ARCH_EP93XX
|
|||
config ARCH_FOOTBRIDGE
|
||||
bool "FootBridge"
|
||||
select FOOTBRIDGE
|
||||
select HAVE_IDE
|
||||
help
|
||||
Support for systems based on the DC21285 companion chip
|
||||
("FootBridge"), such as the Simtec CATS and the Rebel NetWinder.
|
||||
|
@ -301,7 +299,6 @@ config ARCH_IOP32X
|
|||
depends on MMU
|
||||
select PLAT_IOP
|
||||
select PCI
|
||||
select HAVE_IDE
|
||||
help
|
||||
Support for Intel's 80219 and IOP32X (XScale) family of
|
||||
processors.
|
||||
|
@ -311,14 +308,12 @@ config ARCH_IOP33X
|
|||
depends on MMU
|
||||
select PLAT_IOP
|
||||
select PCI
|
||||
select HAVE_IDE
|
||||
help
|
||||
Support for Intel's IOP33X (XScale) family of processors.
|
||||
|
||||
config ARCH_IXP23XX
|
||||
bool "IXP23XX-based"
|
||||
depends on MMU
|
||||
select HAVE_IDE
|
||||
select PCI
|
||||
help
|
||||
Support for Intel's IXP23xx (XScale) family of processors.
|
||||
|
@ -336,14 +331,12 @@ config ARCH_IXP4XX
|
|||
select GENERIC_GPIO
|
||||
select GENERIC_TIME
|
||||
select GENERIC_CLOCKEVENTS
|
||||
select HAVE_IDE
|
||||
help
|
||||
Support for Intel's IXP4XX (XScale) family of processors.
|
||||
|
||||
config ARCH_L7200
|
||||
bool "LinkUp-L7200"
|
||||
select FIQ
|
||||
select HAVE_IDE
|
||||
help
|
||||
Say Y here if you intend to run this kernel on a LinkUp Systems
|
||||
L7200 Software Development Board which uses an ARM720T processor.
|
||||
|
@ -400,7 +393,6 @@ config ARCH_PXA
|
|||
depends on MMU
|
||||
select ARCH_MTD_XIP
|
||||
select GENERIC_GPIO
|
||||
select HAVE_IDE
|
||||
select HAVE_GPIO_LIB
|
||||
select GENERIC_TIME
|
||||
select GENERIC_CLOCKEVENTS
|
||||
|
@ -416,7 +408,6 @@ config ARCH_RPC
|
|||
select ARCH_MAY_HAVE_PC_FDC
|
||||
select ISA_DMA_API
|
||||
select NO_IOPORT
|
||||
select HAVE_IDE
|
||||
help
|
||||
On the Acorn Risc-PC, Linux can support the internal IDE disk and
|
||||
CD-ROM interface, serial and parallel port, and the floppy drive.
|
||||
|
@ -432,7 +423,6 @@ config ARCH_SA1100
|
|||
select GENERIC_TIME
|
||||
select GENERIC_CLOCKEVENTS
|
||||
select TICK_ONESHOT
|
||||
select HAVE_IDE
|
||||
select HAVE_GPIO_LIB
|
||||
help
|
||||
Support for StrongARM 11x0 based boards.
|
||||
|
@ -440,7 +430,6 @@ config ARCH_SA1100
|
|||
config ARCH_S3C2410
|
||||
bool "Samsung S3C2410, S3C2412, S3C2413, S3C2440, S3C2442, S3C2443"
|
||||
select GENERIC_GPIO
|
||||
select HAVE_IDE
|
||||
help
|
||||
Samsung S3C2410X CPU based systems, such as the Simtec Electronics
|
||||
BAST (<http://www.simtec.co.uk/products/EB110ITX/>), the IPAQ 1940 or
|
||||
|
@ -448,7 +437,6 @@ config ARCH_S3C2410
|
|||
|
||||
config ARCH_SHARK
|
||||
bool "Shark"
|
||||
select HAVE_IDE
|
||||
select ISA
|
||||
select ISA_DMA
|
||||
select PCI
|
||||
|
@ -458,7 +446,6 @@ config ARCH_SHARK
|
|||
|
||||
config ARCH_LH7A40X
|
||||
bool "Sharp LH7A40X"
|
||||
select HAVE_IDE
|
||||
help
|
||||
Say Y here for systems based on one of the Sharp LH7A40X
|
||||
System on a Chip processors. These CPUs include an ARM922T
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.25-rc3
|
||||
# Sun Mar 9 06:33:33 2008
|
||||
# Linux kernel version: 2.6.25
|
||||
# Sun Apr 20 00:29:49 2008
|
||||
#
|
||||
CONFIG_ARM=y
|
||||
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
|
||||
|
@ -51,7 +51,8 @@ CONFIG_FAIR_GROUP_SCHED=y
|
|||
# CONFIG_RT_GROUP_SCHED is not set
|
||||
CONFIG_USER_SCHED=y
|
||||
# CONFIG_CGROUP_SCHED is not set
|
||||
# CONFIG_SYSFS_DEPRECATED is not set
|
||||
CONFIG_SYSFS_DEPRECATED=y
|
||||
CONFIG_SYSFS_DEPRECATED_V2=y
|
||||
# CONFIG_RELAY is not set
|
||||
# CONFIG_NAMESPACES is not set
|
||||
# CONFIG_BLK_DEV_INITRD is not set
|
||||
|
@ -85,6 +86,7 @@ CONFIG_SLAB=y
|
|||
CONFIG_HAVE_OPROFILE=y
|
||||
# CONFIG_KPROBES is not set
|
||||
CONFIG_HAVE_KPROBES=y
|
||||
CONFIG_HAVE_KRETPROBES=y
|
||||
CONFIG_PROC_PAGE_MONITOR=y
|
||||
CONFIG_SLABINFO=y
|
||||
CONFIG_RT_MUTEXES=y
|
||||
|
@ -115,7 +117,6 @@ CONFIG_IOSCHED_NOOP=y
|
|||
CONFIG_DEFAULT_NOOP=y
|
||||
CONFIG_DEFAULT_IOSCHED="noop"
|
||||
CONFIG_CLASSIC_RCU=y
|
||||
# CONFIG_PREEMPT_RCU is not set
|
||||
|
||||
#
|
||||
# System Type
|
||||
|
@ -320,8 +321,6 @@ CONFIG_TCP_CONG_CUBIC=y
|
|||
CONFIG_DEFAULT_TCP_CONG="cubic"
|
||||
# CONFIG_TCP_MD5SIG is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_INET6_XFRM_TUNNEL is not set
|
||||
# CONFIG_INET6_TUNNEL is not set
|
||||
# CONFIG_NETWORK_SECMARK is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
# CONFIG_IP_DCCP is not set
|
||||
|
@ -383,7 +382,6 @@ CONFIG_IEEE80211=m
|
|||
CONFIG_IEEE80211_CRYPT_WEP=m
|
||||
# CONFIG_IEEE80211_CRYPT_CCMP is not set
|
||||
# CONFIG_IEEE80211_CRYPT_TKIP is not set
|
||||
# CONFIG_IEEE80211_SOFTMAC is not set
|
||||
# CONFIG_RFKILL is not set
|
||||
# CONFIG_NET_9P is not set
|
||||
|
||||
|
@ -503,7 +501,7 @@ CONFIG_IDE_MAX_HWIFS=2
|
|||
CONFIG_BLK_DEV_IDE=m
|
||||
|
||||
#
|
||||
# Please see Documentation/ide.txt for help/info on IDE drives
|
||||
# Please see Documentation/ide/ide.txt for help/info on IDE drives
|
||||
#
|
||||
# CONFIG_BLK_DEV_IDE_SATA is not set
|
||||
CONFIG_BLK_DEV_IDEDISK=m
|
||||
|
@ -518,10 +516,9 @@ CONFIG_IDE_PROC_FS=y
|
|||
#
|
||||
# IDE chipset support/bugfixes
|
||||
#
|
||||
CONFIG_IDE_GENERIC=m
|
||||
# CONFIG_BLK_DEV_PLATFORM is not set
|
||||
# CONFIG_BLK_DEV_IDEDMA is not set
|
||||
CONFIG_IDE_ARCH_OBSOLETE_INIT=y
|
||||
# CONFIG_BLK_DEV_HD_ONLY is not set
|
||||
# CONFIG_BLK_DEV_HD is not set
|
||||
|
||||
#
|
||||
|
@ -562,6 +559,7 @@ CONFIG_NETDEV_10000=y
|
|||
#
|
||||
# CONFIG_WLAN_PRE80211 is not set
|
||||
# CONFIG_WLAN_80211 is not set
|
||||
# CONFIG_IWLWIFI_LEDS is not set
|
||||
# CONFIG_NET_PCMCIA is not set
|
||||
# CONFIG_WAN is not set
|
||||
# CONFIG_PPP is not set
|
||||
|
@ -707,6 +705,8 @@ CONFIG_SSB_POSSIBLE=y
|
|||
#
|
||||
# CONFIG_MFD_SM501 is not set
|
||||
# CONFIG_MFD_ASIC3 is not set
|
||||
# CONFIG_HTC_EGPIO is not set
|
||||
# CONFIG_HTC_PASIC3 is not set
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
|
@ -745,6 +745,7 @@ CONFIG_FB_TILEBLITTING=y
|
|||
CONFIG_FB_PXA=y
|
||||
CONFIG_FB_PXA_PARAMETERS=y
|
||||
CONFIG_FB_MBX=m
|
||||
# CONFIG_FB_METRONOME is not set
|
||||
CONFIG_FB_VIRTUAL=m
|
||||
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
|
||||
|
||||
|
@ -891,7 +892,6 @@ CONFIG_RTC_LIB=y
|
|||
# CONFIG_JFS_FS is not set
|
||||
# CONFIG_FS_POSIX_ACL is not set
|
||||
# CONFIG_XFS_FS is not set
|
||||
# CONFIG_GFS2_FS is not set
|
||||
# CONFIG_OCFS2_FS is not set
|
||||
# CONFIG_DNOTIFY is not set
|
||||
CONFIG_INOTIFY=y
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#include <asm/thread_info.h>
|
||||
#include <asm/memory.h>
|
||||
#include <asm/procinfo.h>
|
||||
#include <linux/kbuild.h>
|
||||
|
||||
/*
|
||||
* Make sure that the compiler and target are compatible.
|
||||
|
@ -35,13 +36,6 @@
|
|||
#error Known good compilers: 3.3
|
||||
#endif
|
||||
|
||||
/* Use marker if you need to separate the values later */
|
||||
|
||||
#define DEFINE(sym, val) \
|
||||
asm volatile("\n->" #sym " %0 " #val : : "i" (val))
|
||||
|
||||
#define BLANK() asm volatile("\n->" : : )
|
||||
|
||||
int main(void)
|
||||
{
|
||||
DEFINE(TSK_ACTIVE_MM, offsetof(struct task_struct, active_mm));
|
||||
|
|
|
@ -35,7 +35,7 @@ create_proc_entries(void)
|
|||
{
|
||||
struct proc_dir_entry* tags_entry;
|
||||
|
||||
tags_entry = create_proc_read_entry("atags", 0400, &proc_root, read_buffer, &tags_buffer);
|
||||
tags_entry = create_proc_read_entry("atags", 0400, NULL, read_buffer, &tags_buffer);
|
||||
if (!tags_entry)
|
||||
return -ENOMEM;
|
||||
|
||||
|
|
|
@ -37,6 +37,7 @@
|
|||
#include <linux/mm.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/mutex.h>
|
||||
|
@ -723,17 +724,14 @@ unsigned int __ecard_address(ecard_t *ec, card_type_t type, card_speed_t speed)
|
|||
return address;
|
||||
}
|
||||
|
||||
static int ecard_prints(char *buffer, ecard_t *ec)
|
||||
static int ecard_prints(struct seq_file *m, ecard_t *ec)
|
||||
{
|
||||
char *start = buffer;
|
||||
|
||||
buffer += sprintf(buffer, " %d: %s ", ec->slot_no,
|
||||
ec->easi ? "EASI" : " ");
|
||||
seq_printf(m, " %d: %s ", ec->slot_no, ec->easi ? "EASI" : " ");
|
||||
|
||||
if (ec->cid.id == 0) {
|
||||
struct in_chunk_dir incd;
|
||||
|
||||
buffer += sprintf(buffer, "[%04X:%04X] ",
|
||||
seq_printf(m, "[%04X:%04X] ",
|
||||
ec->cid.manufacturer, ec->cid.product);
|
||||
|
||||
if (!ec->card_desc && ec->cid.cd &&
|
||||
|
@ -744,43 +742,43 @@ static int ecard_prints(char *buffer, ecard_t *ec)
|
|||
strcpy((char *)ec->card_desc, incd.d.string);
|
||||
}
|
||||
|
||||
buffer += sprintf(buffer, "%s\n", ec->card_desc ? ec->card_desc : "*unknown*");
|
||||
seq_printf(m, "%s\n", ec->card_desc ? ec->card_desc : "*unknown*");
|
||||
} else
|
||||
buffer += sprintf(buffer, "Simple card %d\n", ec->cid.id);
|
||||
seq_printf(m, "Simple card %d\n", ec->cid.id);
|
||||
|
||||
return buffer - start;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_ecard_dev_info(char *buf, char **start, off_t pos, int count)
|
||||
static int ecard_devices_proc_show(struct seq_file *m, void *v)
|
||||
{
|
||||
ecard_t *ec = cards;
|
||||
off_t at = 0;
|
||||
int len, cnt;
|
||||
|
||||
cnt = 0;
|
||||
while (ec && count > cnt) {
|
||||
len = ecard_prints(buf, ec);
|
||||
at += len;
|
||||
if (at >= pos) {
|
||||
if (!*start) {
|
||||
*start = buf + (pos - (at - len));
|
||||
cnt = at - pos;
|
||||
} else
|
||||
cnt += len;
|
||||
buf += len;
|
||||
}
|
||||
while (ec) {
|
||||
ecard_prints(m, ec);
|
||||
ec = ec->next;
|
||||
}
|
||||
return (count > cnt) ? cnt : count;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ecard_devices_proc_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, ecard_devices_proc_show, NULL);
|
||||
}
|
||||
|
||||
static const struct file_operations bus_ecard_proc_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = ecard_devices_proc_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
static struct proc_dir_entry *proc_bus_ecard_dir = NULL;
|
||||
|
||||
static void ecard_proc_init(void)
|
||||
{
|
||||
proc_bus_ecard_dir = proc_mkdir("ecard", proc_bus);
|
||||
create_proc_info_entry("devices", 0, proc_bus_ecard_dir,
|
||||
get_ecard_dev_info);
|
||||
proc_bus_ecard_dir = proc_mkdir("bus/ecard", NULL);
|
||||
proc_create("devices", 0, proc_bus_ecard_dir, &bus_ecard_proc_fops);
|
||||
}
|
||||
|
||||
#define ec_set_resource(ec,nr,st,sz) \
|
||||
|
|
|
@ -1176,7 +1176,7 @@ space_cccc_001x(kprobe_opcode_t insn, struct arch_specific_insn *asi)
|
|||
* *S (bit 20) updates condition codes
|
||||
* ADC/SBC/RSC reads the C flag
|
||||
*/
|
||||
insn &= 0xfff00ff0; /* Rn = r0, Rd = r0 */
|
||||
insn &= 0xfff00fff; /* Rn = r0, Rd = r0 */
|
||||
asi->insn[0] = insn;
|
||||
asi->insn_handler = (insn & (1 << 20)) ? /* S-bit */
|
||||
emulate_alu_imm_rwflags : emulate_alu_imm_rflags;
|
||||
|
|
|
@ -66,7 +66,7 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p)
|
|||
return -ENOMEM;
|
||||
for (is = 0; is < MAX_INSN_SIZE; ++is)
|
||||
p->ainsn.insn[is] = tmp_insn[is];
|
||||
flush_insns(&p->ainsn.insn, MAX_INSN_SIZE);
|
||||
flush_insns(p->ainsn.insn, MAX_INSN_SIZE);
|
||||
break;
|
||||
|
||||
case INSN_GOOD_NO_SLOT: /* instruction doesn't need insn slot */
|
||||
|
|
|
@ -34,23 +34,6 @@ extern unsigned long do_mremap(unsigned long addr, unsigned long old_len,
|
|||
unsigned long new_len, unsigned long flags,
|
||||
unsigned long new_addr);
|
||||
|
||||
/*
|
||||
* sys_pipe() is the normal C calling standard for creating
|
||||
* a pipe. It's not the way unix traditionally does this, though.
|
||||
*/
|
||||
asmlinkage int sys_pipe(unsigned long __user *fildes)
|
||||
{
|
||||
int fd[2];
|
||||
int error;
|
||||
|
||||
error = do_pipe(fd);
|
||||
if (!error) {
|
||||
if (copy_to_user(fildes, fd, 2*sizeof(int)))
|
||||
error = -EFAULT;
|
||||
}
|
||||
return error;
|
||||
}
|
||||
|
||||
/* common code for old and new mmaps */
|
||||
inline long do_mmap2(
|
||||
unsigned long addr, unsigned long len,
|
||||
|
|
|
@ -246,7 +246,7 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data)
|
|||
}
|
||||
|
||||
mmc0_data = *data;
|
||||
at91_clock_associate("mci0_clk", &at91cap9_mmc1_device.dev, "mci_clk");
|
||||
at91_clock_associate("mci0_clk", &at91cap9_mmc0_device.dev, "mci_clk");
|
||||
platform_device_register(&at91cap9_mmc0_device);
|
||||
} else { /* MCI1 */
|
||||
/* CLK */
|
||||
|
|
|
@ -308,7 +308,7 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data)
|
|||
}
|
||||
|
||||
mmc0_data = *data;
|
||||
at91_clock_associate("mci0_clk", &at91sam9263_mmc1_device.dev, "mci_clk");
|
||||
at91_clock_associate("mci0_clk", &at91sam9263_mmc0_device.dev, "mci_clk");
|
||||
platform_device_register(&at91sam9263_mmc0_device);
|
||||
} else { /* MCI1 */
|
||||
/* CLK */
|
||||
|
|
|
@ -79,8 +79,7 @@ static struct at91_udc_data __initdata csb337_udc_data = {
|
|||
|
||||
static struct i2c_board_info __initdata csb337_i2c_devices[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("rtc-ds1307", 0x68),
|
||||
.type = "ds1307",
|
||||
I2C_BOARD_INFO("ds1307", 0x68),
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -132,8 +132,7 @@ static struct i2c_board_info __initdata dk_i2c_devices[] = {
|
|||
I2C_BOARD_INFO("x9429", 0x28),
|
||||
},
|
||||
{
|
||||
I2C_BOARD_INFO("at24c", 0x50),
|
||||
.type = "24c1024",
|
||||
I2C_BOARD_INFO("24c1024", 0x50),
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -93,8 +93,7 @@ static struct at91_mmc_data __initdata eb9200_mmc_data = {
|
|||
|
||||
static struct i2c_board_info __initdata eb9200_i2c_devices[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("at24c", 0x50),
|
||||
.type = "24c512",
|
||||
I2C_BOARD_INFO("24c512", 0x50),
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -61,6 +61,15 @@ static inline void sdram_selfrefresh_enable(void)
|
|||
#else
|
||||
#include <asm/arch/at91sam9_sdramc.h>
|
||||
|
||||
#ifdef CONFIG_ARCH_AT91SAM9263
|
||||
/*
|
||||
* FIXME either or both the SDRAM controllers (EB0, EB1) might be in use;
|
||||
* handle those cases both here and in the Suspend-To-RAM support.
|
||||
*/
|
||||
#define AT91_SDRAMC AT91_SDRAMC0
|
||||
#warning Assuming EB1 SDRAM controller is *NOT* used
|
||||
#endif
|
||||
|
||||
static u32 saved_lpr;
|
||||
|
||||
static inline void sdram_selfrefresh_enable(void)
|
||||
|
@ -75,11 +84,6 @@ static inline void sdram_selfrefresh_enable(void)
|
|||
|
||||
#define sdram_selfrefresh_disable() at91_sys_write(AT91_SDRAMC_LPR, saved_lpr)
|
||||
|
||||
/*
|
||||
* FIXME: The AT91SAM9263 has a second EBI controller which may have
|
||||
* additional SDRAM. pm_slowclock.S will require a similar fix.
|
||||
*/
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
|
|
@ -311,11 +311,7 @@ static const struct file_operations proc_davinci_ck_operations = {
|
|||
|
||||
static int __init davinci_ck_proc_init(void)
|
||||
{
|
||||
struct proc_dir_entry *entry;
|
||||
|
||||
entry = create_proc_entry("davinci_clocks", 0, NULL);
|
||||
if (entry)
|
||||
entry->proc_fops = &proc_davinci_ck_operations;
|
||||
proc_create("davinci_clocks", 0, NULL, &proc_davinci_ck_operations);
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
|
|
@ -50,8 +50,7 @@ static struct sys_timer em7210_timer = {
|
|||
*/
|
||||
static struct i2c_board_info __initdata em7210_i2c_devices[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("rtc-rs5c372", 0x32),
|
||||
.type = "rs5c372a",
|
||||
I2C_BOARD_INFO("rs5c372a", 0x32),
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -176,12 +176,10 @@ static struct f75375s_platform_data glantank_f75375s = {
|
|||
|
||||
static struct i2c_board_info __initdata glantank_i2c_devices[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("rtc-rs5c372", 0x32),
|
||||
.type = "rs5c372a",
|
||||
I2C_BOARD_INFO("rs5c372a", 0x32),
|
||||
},
|
||||
{
|
||||
I2C_BOARD_INFO("f75375", 0x2e),
|
||||
.type = "f75375",
|
||||
.platform_data = &glantank_f75375s,
|
||||
},
|
||||
};
|
||||
|
|
|
@ -208,12 +208,10 @@ static struct f75375s_platform_data n2100_f75375s = {
|
|||
|
||||
static struct i2c_board_info __initdata n2100_i2c_devices[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("rtc-rs5c372", 0x32),
|
||||
.type = "rs5c372b",
|
||||
I2C_BOARD_INFO("rs5c372b", 0x32),
|
||||
},
|
||||
{
|
||||
I2C_BOARD_INFO("f75375", 0x2e),
|
||||
.type = "f75375",
|
||||
.platform_data = &n2100_f75375s,
|
||||
},
|
||||
};
|
||||
|
|
|
@ -65,7 +65,7 @@ static struct platform_device dsmg600_i2c_gpio = {
|
|||
|
||||
static struct i2c_board_info __initdata dsmg600_i2c_board_info [] = {
|
||||
{
|
||||
I2C_BOARD_INFO("rtc-pcf8563", 0x51),
|
||||
I2C_BOARD_INFO("pcf8563", 0x51),
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -448,7 +448,9 @@ int npe_send_message(struct npe *npe, const void *msg, const char *what)
|
|||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
#if DEBUG_MSG > 1
|
||||
debug_msg(npe, "Sending a message took %i cycles\n", cycles);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -484,7 +486,9 @@ int npe_recv_message(struct npe *npe, void *msg, const char *what)
|
|||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
#if DEBUG_MSG > 1
|
||||
debug_msg(npe, "Receiving a message took %i cycles\n", cycles);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -184,6 +184,8 @@ void qmgr_release_queue(unsigned int queue)
|
|||
case 3: mask[0] = 0xFF; break;
|
||||
}
|
||||
|
||||
mask[1] = mask[2] = mask[3] = 0;
|
||||
|
||||
while (addr--)
|
||||
shift_mask(mask);
|
||||
|
||||
|
|
|
@ -54,7 +54,7 @@ static struct platform_device nas100d_flash = {
|
|||
|
||||
static struct i2c_board_info __initdata nas100d_i2c_board_info [] = {
|
||||
{
|
||||
I2C_BOARD_INFO("rtc-pcf8563", 0x51),
|
||||
I2C_BOARD_INFO("pcf8563", 0x51),
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -57,7 +57,7 @@ static struct i2c_gpio_platform_data nslu2_i2c_gpio_data = {
|
|||
|
||||
static struct i2c_board_info __initdata nslu2_i2c_board_info [] = {
|
||||
{
|
||||
I2C_BOARD_INFO("rtc-x1205", 0x6f),
|
||||
I2C_BOARD_INFO("x1205", 0x6f),
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -351,11 +351,9 @@ static void __init h2_init_smc91x(void)
|
|||
static struct i2c_board_info __initdata h2_i2c_board_info[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("tps65010", 0x48),
|
||||
.type = "tps65010",
|
||||
.irq = OMAP_GPIO_IRQ(58),
|
||||
}, {
|
||||
I2C_BOARD_INFO("isp1301_omap", 0x2d),
|
||||
.type = "isp1301_omap",
|
||||
.irq = OMAP_GPIO_IRQ(2),
|
||||
},
|
||||
};
|
||||
|
|
|
@ -473,8 +473,7 @@ static struct omap_board_config_kernel h3_config[] __initdata = {
|
|||
|
||||
static struct i2c_board_info __initdata h3_i2c_board_info[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("tps65010", 0x48),
|
||||
.type = "tps65013",
|
||||
I2C_BOARD_INFO("tps65013", 0x48),
|
||||
/* .irq = OMAP_GPIO_IRQ(??), */
|
||||
},
|
||||
};
|
||||
|
|
|
@ -254,7 +254,6 @@ static struct tps65010_board tps_board = {
|
|||
static struct i2c_board_info __initdata osk_i2c_board_info[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("tps65010", 0x48),
|
||||
.type = "tps65010",
|
||||
.irq = OMAP_GPIO_IRQ(OMAP_MPUIO(1)),
|
||||
.platform_data = &tps_board,
|
||||
|
||||
|
|
|
@ -19,14 +19,14 @@
|
|||
|
||||
/*
|
||||
* The Orion has fully programable address map. There's a separate address
|
||||
* map for each of the device _master_ interfaces, e.g. CPU, PCI, PCIE, USB,
|
||||
* map for each of the device _master_ interfaces, e.g. CPU, PCI, PCIe, USB,
|
||||
* Gigabit Ethernet, DMA/XOR engines, etc. Each interface has its own
|
||||
* address decode windows that allow it to access any of the Orion resources.
|
||||
*
|
||||
* CPU address decoding --
|
||||
* Linux assumes that it is the boot loader that already setup the access to
|
||||
* DDR and internal registers.
|
||||
* Setup access to PCI and PCI-E IO/MEM space is issued by this file.
|
||||
* Setup access to PCI and PCIe IO/MEM space is issued by this file.
|
||||
* Setup access to various devices located on the device bus interface (e.g.
|
||||
* flashes, RTC, etc) should be issued by machine-setup.c according to
|
||||
* specific board population (by using orion5x_setup_*_win()).
|
||||
|
|
|
@ -132,7 +132,7 @@ static struct platform_device orion5x_uart = {
|
|||
static struct resource orion5x_ehci0_resources[] = {
|
||||
{
|
||||
.start = ORION5X_USB0_PHYS_BASE,
|
||||
.end = ORION5X_USB0_PHYS_BASE + SZ_4K,
|
||||
.end = ORION5X_USB0_PHYS_BASE + SZ_4K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
|
@ -145,7 +145,7 @@ static struct resource orion5x_ehci0_resources[] = {
|
|||
static struct resource orion5x_ehci1_resources[] = {
|
||||
{
|
||||
.start = ORION5X_USB1_PHYS_BASE,
|
||||
.end = ORION5X_USB1_PHYS_BASE + SZ_4K,
|
||||
.end = ORION5X_USB1_PHYS_BASE + SZ_4K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
|
@ -317,7 +317,7 @@ struct sys_timer orion5x_timer = {
|
|||
****************************************************************************/
|
||||
|
||||
/*
|
||||
* Identify device ID and rev from PCIE configuration header space '0'.
|
||||
* Identify device ID and rev from PCIe configuration header space '0'.
|
||||
*/
|
||||
static void __init orion5x_id(u32 *dev, u32 *rev, char **dev_name)
|
||||
{
|
||||
|
|
|
@ -33,10 +33,9 @@ struct pci_sys_data;
|
|||
struct pci_bus;
|
||||
|
||||
void orion5x_pcie_id(u32 *dev, u32 *rev);
|
||||
int orion5x_pcie_local_bus_nr(void);
|
||||
int orion5x_pci_local_bus_nr(void);
|
||||
int orion5x_pci_sys_setup(int nr, struct pci_sys_data *sys);
|
||||
struct pci_bus *orion5x_pci_sys_scan_bus(int nr, struct pci_sys_data *sys);
|
||||
int orion5x_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin);
|
||||
|
||||
/*
|
||||
* Valid GPIO pins according to MPP setup, used by machine-setup.
|
||||
|
|
|
@ -241,14 +241,17 @@ void __init db88f5281_pci_preinit(void)
|
|||
|
||||
static int __init db88f5281_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
/*
|
||||
* PCIE IRQ is connected internally (not GPIO)
|
||||
*/
|
||||
if (dev->bus->number == orion5x_pcie_local_bus_nr())
|
||||
return IRQ_ORION5X_PCIE0_INT;
|
||||
int irq;
|
||||
|
||||
/*
|
||||
* PCI IRQs are connected via GPIOs
|
||||
* Check for devices with hard-wired IRQs.
|
||||
*/
|
||||
irq = orion5x_pci_map_irq(dev, slot, pin);
|
||||
if (irq != -1)
|
||||
return irq;
|
||||
|
||||
/*
|
||||
* PCI IRQs are connected via GPIOs.
|
||||
*/
|
||||
switch (slot - DB88F5281_PCI_SLOT0_OFFS) {
|
||||
case 0:
|
||||
|
@ -292,9 +295,7 @@ static struct mv643xx_eth_platform_data db88f5281_eth_data = {
|
|||
* RTC DS1339 on I2C bus
|
||||
****************************************************************************/
|
||||
static struct i2c_board_info __initdata db88f5281_i2c_rtc = {
|
||||
.driver_name = "rtc-ds1307",
|
||||
.type = "ds1339",
|
||||
.addr = 0x68,
|
||||
I2C_BOARD_INFO("ds1339", 0x68),
|
||||
};
|
||||
|
||||
/*****************************************************************************
|
||||
|
|
|
@ -43,11 +43,16 @@
|
|||
|
||||
static int __init dns323_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
/* PCI-E */
|
||||
if (dev->bus->number == orion5x_pcie_local_bus_nr())
|
||||
return IRQ_ORION5X_PCIE0_INT;
|
||||
int irq;
|
||||
|
||||
pr_err("%s: requested mapping for unknown bus\n", __func__);
|
||||
/*
|
||||
* Check for devices with hard-wired IRQs.
|
||||
*/
|
||||
irq = orion5x_pci_map_irq(dev, slot, pin);
|
||||
if (irq != -1)
|
||||
return irq;
|
||||
|
||||
pr_err("%s: requested mapping for unknown device\n", __func__);
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
@ -220,19 +225,16 @@ static struct platform_device *dns323_plat_devices[] __initdata = {
|
|||
static struct i2c_board_info __initdata dns323_i2c_devices[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("g760a", 0x3e),
|
||||
.type = "g760a",
|
||||
},
|
||||
#if 0
|
||||
/* this entry requires the new-style driver model lm75 driver,
|
||||
* for the meantime "insmod lm75.ko force_lm75=0,0x48" is needed */
|
||||
{
|
||||
I2C_BOARD_INFO("lm75", 0x48),
|
||||
.type = "g751",
|
||||
I2C_BOARD_INFO("g751", 0x48),
|
||||
},
|
||||
#endif
|
||||
{
|
||||
I2C_BOARD_INFO("rtc-m41t80", 0x68),
|
||||
.type = "m41t80",
|
||||
I2C_BOARD_INFO("m41t80", 0x68),
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -253,9 +255,9 @@ static void __init dns323_init(void)
|
|||
*/
|
||||
orion5x_setup_dev_boot_win(DNS323_NOR_BOOT_BASE, DNS323_NOR_BOOT_SIZE);
|
||||
|
||||
/* DNS-323 has a Marvell 88X7042 SATA controller attached via PCIE
|
||||
/* DNS-323 has a Marvell 88X7042 SATA controller attached via PCIe
|
||||
*
|
||||
* Open a special address decode windows for the PCIE WA.
|
||||
* Open a special address decode windows for the PCIe WA.
|
||||
*/
|
||||
orion5x_setup_pcie_wa_win(ORION5X_PCIE_WA_PHYS_BASE,
|
||||
ORION5X_PCIE_WA_SIZE);
|
||||
|
|
|
@ -120,13 +120,19 @@ static struct platform_device kurobox_pro_nor_flash = {
|
|||
|
||||
static int __init kurobox_pro_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
int irq;
|
||||
|
||||
/*
|
||||
* Check for devices with hard-wired IRQs.
|
||||
*/
|
||||
irq = orion5x_pci_map_irq(dev, slot, pin);
|
||||
if (irq != -1)
|
||||
return irq;
|
||||
|
||||
/*
|
||||
* PCI isn't used on the Kuro
|
||||
*/
|
||||
if (dev->bus->number == orion5x_pcie_local_bus_nr())
|
||||
return IRQ_ORION5X_PCIE0_INT;
|
||||
else
|
||||
printk(KERN_ERR "kurobox_pro_pci_map_irq failed, unknown bus\n");
|
||||
printk(KERN_ERR "kurobox_pro_pci_map_irq failed, unknown bus\n");
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
@ -162,9 +168,7 @@ static struct mv643xx_eth_platform_data kurobox_pro_eth_data = {
|
|||
* RTC 5C372a on I2C bus
|
||||
****************************************************************************/
|
||||
static struct i2c_board_info __initdata kurobox_pro_i2c_rtc = {
|
||||
.driver_name = "rtc-rs5c372",
|
||||
.type = "rs5c372a",
|
||||
.addr = 0x32,
|
||||
I2C_BOARD_INFO("rs5c372a", 0x32),
|
||||
};
|
||||
|
||||
/*****************************************************************************
|
||||
|
@ -193,7 +197,7 @@ static void __init kurobox_pro_init(void)
|
|||
orion5x_setup_dev0_win(KUROBOX_PRO_NAND_BASE, KUROBOX_PRO_NAND_SIZE);
|
||||
|
||||
/*
|
||||
* Open a special address decode windows for the PCIE WA.
|
||||
* Open a special address decode windows for the PCIe WA.
|
||||
*/
|
||||
orion5x_setup_pcie_wa_win(ORION5X_PCIE_WA_PHYS_BASE,
|
||||
ORION5X_PCIE_WA_SIZE);
|
||||
|
|
|
@ -41,11 +41,6 @@ void __init orion5x_pcie_id(u32 *dev, u32 *rev)
|
|||
*rev = orion_pcie_rev(PCIE_BASE);
|
||||
}
|
||||
|
||||
int __init orion5x_pcie_local_bus_nr(void)
|
||||
{
|
||||
return orion_pcie_get_local_bus_nr(PCIE_BASE);
|
||||
}
|
||||
|
||||
static int pcie_valid_config(int bus, int dev)
|
||||
{
|
||||
/*
|
||||
|
@ -269,7 +264,7 @@ static int __init pcie_setup(struct pci_sys_data *sys)
|
|||
*/
|
||||
static DEFINE_SPINLOCK(orion5x_pci_lock);
|
||||
|
||||
int orion5x_pci_local_bus_nr(void)
|
||||
static int orion5x_pci_local_bus_nr(void)
|
||||
{
|
||||
u32 conf = orion5x_read(PCI_P2P_CONF);
|
||||
return((conf & PCI_P2P_BUS_MASK) >> PCI_P2P_BUS_OFFS);
|
||||
|
@ -557,3 +552,16 @@ struct pci_bus __init *orion5x_pci_sys_scan_bus(int nr, struct pci_sys_data *sys
|
|||
|
||||
return bus;
|
||||
}
|
||||
|
||||
int __init orion5x_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
int bus = dev->bus->number;
|
||||
|
||||
/*
|
||||
* PCIe endpoint?
|
||||
*/
|
||||
if (bus < orion5x_pci_local_bus_nr())
|
||||
return IRQ_ORION5X_PCIE0_INT;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
|
|
@ -172,11 +172,14 @@ void __init rd88f5182_pci_preinit(void)
|
|||
|
||||
static int __init rd88f5182_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
int irq;
|
||||
|
||||
/*
|
||||
* PCI-E isn't used on the RD2
|
||||
* Check for devices with hard-wired IRQs.
|
||||
*/
|
||||
if (dev->bus->number == orion5x_pcie_local_bus_nr())
|
||||
return IRQ_ORION5X_PCIE0_INT;
|
||||
irq = orion5x_pci_map_irq(dev, slot, pin);
|
||||
if (irq != -1)
|
||||
return irq;
|
||||
|
||||
/*
|
||||
* PCI IRQs are connected via GPIOs
|
||||
|
@ -224,9 +227,7 @@ static struct mv643xx_eth_platform_data rd88f5182_eth_data = {
|
|||
* RTC DS1338 on I2C bus
|
||||
****************************************************************************/
|
||||
static struct i2c_board_info __initdata rd88f5182_i2c_rtc = {
|
||||
.driver_name = "rtc-ds1307",
|
||||
.type = "ds1338",
|
||||
.addr = 0x68,
|
||||
I2C_BOARD_INFO("ds1338", 0x68),
|
||||
};
|
||||
|
||||
/*****************************************************************************
|
||||
|
@ -259,7 +260,7 @@ static void __init rd88f5182_init(void)
|
|||
orion5x_setup_dev1_win(RD88F5182_NOR_BASE, RD88F5182_NOR_SIZE);
|
||||
|
||||
/*
|
||||
* Open a special address decode windows for the PCIE WA.
|
||||
* Open a special address decode windows for the PCIe WA.
|
||||
*/
|
||||
orion5x_setup_pcie_wa_win(ORION5X_PCIE_WA_PHYS_BASE,
|
||||
ORION5X_PCIE_WA_SIZE);
|
||||
|
|
|
@ -141,14 +141,17 @@ void __init qnap_ts209_pci_preinit(void)
|
|||
|
||||
static int __init qnap_ts209_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
/*
|
||||
* PCIE IRQ is connected internally (not GPIO)
|
||||
*/
|
||||
if (dev->bus->number == orion5x_pcie_local_bus_nr())
|
||||
return IRQ_ORION5X_PCIE0_INT;
|
||||
int irq;
|
||||
|
||||
/*
|
||||
* PCI IRQs are connected via GPIOs
|
||||
* Check for devices with hard-wired IRQs.
|
||||
*/
|
||||
irq = orion5x_pci_map_irq(dev, slot, pin);
|
||||
if (irq != -1)
|
||||
return irq;
|
||||
|
||||
/*
|
||||
* PCI IRQs are connected via GPIOs.
|
||||
*/
|
||||
switch (slot - QNAP_TS209_PCI_SLOT0_OFFS) {
|
||||
case 0:
|
||||
|
@ -276,8 +279,7 @@ static void __init ts209_find_mac_addr(void)
|
|||
#define TS209_RTC_GPIO 3
|
||||
|
||||
static struct i2c_board_info __initdata qnap_ts209_i2c_rtc = {
|
||||
.driver_name = "rtc-s35390a",
|
||||
.addr = 0x30,
|
||||
I2C_BOARD_INFO("s35390a", 0x30),
|
||||
.irq = 0,
|
||||
};
|
||||
|
||||
|
@ -373,7 +375,7 @@ static void __init qnap_ts209_init(void)
|
|||
QNAP_TS209_NOR_BOOT_SIZE);
|
||||
|
||||
/*
|
||||
* Open a special address decode windows for the PCIE WA.
|
||||
* Open a special address decode windows for the PCIe WA.
|
||||
*/
|
||||
orion5x_setup_pcie_wa_win(ORION5X_PCIE_WA_PHYS_BASE,
|
||||
ORION5X_PCIE_WA_SIZE);
|
||||
|
|
|
@ -5,9 +5,9 @@
|
|||
# Common support (must be linked before board specific support)
|
||||
obj-y += clock.o devices.o generic.o irq.o dma.o \
|
||||
time.o gpio.o
|
||||
obj-$(CONFIG_PXA25x) += pxa25x.o mfp-pxa2xx.o
|
||||
obj-$(CONFIG_PXA27x) += pxa27x.o mfp-pxa2xx.o
|
||||
obj-$(CONFIG_PXA3xx) += pxa3xx.o mfp-pxa3xx.o smemc.o
|
||||
obj-$(CONFIG_PXA25x) += mfp-pxa2xx.o pxa25x.o
|
||||
obj-$(CONFIG_PXA27x) += mfp-pxa2xx.o pxa27x.o
|
||||
obj-$(CONFIG_PXA3xx) += mfp-pxa3xx.o pxa3xx.o smemc.o
|
||||
obj-$(CONFIG_CPU_PXA300) += pxa300.o
|
||||
obj-$(CONFIG_CPU_PXA320) += pxa320.o
|
||||
|
||||
|
|
|
@ -90,11 +90,6 @@ static struct map_desc standard_io_desc[] __initdata = {
|
|||
.pfn = __phys_to_pfn(0x40000000),
|
||||
.length = 0x02000000,
|
||||
.type = MT_DEVICE
|
||||
}, { /* LCD */
|
||||
.virtual = 0xf4000000,
|
||||
.pfn = __phys_to_pfn(0x44000000),
|
||||
.length = 0x00100000,
|
||||
.type = MT_DEVICE
|
||||
}, { /* Mem Ctl */
|
||||
.virtual = 0xf6000000,
|
||||
.pfn = __phys_to_pfn(0x48000000),
|
||||
|
|
|
@ -40,6 +40,7 @@
|
|||
|
||||
#include <asm/arch/pxa-regs.h>
|
||||
#include <asm/arch/pxa2xx-regs.h>
|
||||
#include <asm/arch/pxa2xx-gpio.h>
|
||||
|
||||
#include "generic.h"
|
||||
|
||||
|
|
|
@ -301,8 +301,7 @@ static struct pxafb_mode_info tpo_tdo24mtea1_modes[] = {
|
|||
static struct pxafb_mach_info littleton_lcd_info = {
|
||||
.modes = tpo_tdo24mtea1_modes,
|
||||
.num_modes = 2,
|
||||
.lccr0 = LCCR0_Act,
|
||||
.lccr3 = LCCR3_HSP | LCCR3_VSP,
|
||||
.lcd_conn = LCD_COLOR_TFT_16BPP,
|
||||
.pxafb_lcd_power = littleton_lcd_power,
|
||||
};
|
||||
|
||||
|
|
|
@ -395,8 +395,8 @@ static struct pxafb_mach_info sharp_lm8v31 = {
|
|||
.num_modes = 1,
|
||||
.cmap_inverse = 0,
|
||||
.cmap_static = 0,
|
||||
.lccr0 = LCCR0_SDS,
|
||||
.lccr3 = LCCR3_PCP | LCCR3_Acb(255),
|
||||
.lcd_conn = LCD_COLOR_DSTN_16BPP | LCD_PCLK_EDGE_FALL |
|
||||
LCD_AC_BIAS_FREQ(255);
|
||||
};
|
||||
|
||||
#define MMC_POLL_RATE msecs_to_jiffies(1000)
|
||||
|
|
|
@ -114,6 +114,14 @@ static unsigned long magician_pin_config[] = {
|
|||
GPIO82_CIF_DD_5,
|
||||
GPIO84_CIF_FV,
|
||||
GPIO85_CIF_LV,
|
||||
|
||||
/* Magician specific input GPIOs */
|
||||
GPIO9_GPIO, /* unknown */
|
||||
GPIO10_GPIO, /* GSM_IRQ */
|
||||
GPIO13_GPIO, /* CPLD_IRQ */
|
||||
GPIO107_GPIO, /* DS1WM_IRQ */
|
||||
GPIO108_GPIO, /* GSM_READY */
|
||||
GPIO115_GPIO, /* nPEN_IRQ */
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -438,7 +446,7 @@ static struct pasic3_led pasic3_leds[] = {
|
|||
|
||||
static struct platform_device pasic3;
|
||||
|
||||
static struct pasic3_leds_machinfo __devinit pasic3_leds_info = {
|
||||
static struct pasic3_leds_machinfo pasic3_leds_info = {
|
||||
.num_leds = ARRAY_SIZE(pasic3_leds),
|
||||
.power_gpio = EGPIO_MAGICIAN_LED_POWER,
|
||||
.leds = pasic3_leds,
|
||||
|
@ -543,9 +551,28 @@ static struct platform_device power_supply = {
|
|||
static int magician_mci_init(struct device *dev,
|
||||
irq_handler_t detect_irq, void *data)
|
||||
{
|
||||
return request_irq(IRQ_MAGICIAN_SD, detect_irq,
|
||||
int err;
|
||||
|
||||
err = request_irq(IRQ_MAGICIAN_SD, detect_irq,
|
||||
IRQF_DISABLED | IRQF_SAMPLE_RANDOM,
|
||||
"MMC card detect", data);
|
||||
if (err)
|
||||
goto err_request_irq;
|
||||
err = gpio_request(EGPIO_MAGICIAN_SD_POWER, "SD_POWER");
|
||||
if (err)
|
||||
goto err_request_power;
|
||||
err = gpio_request(EGPIO_MAGICIAN_nSD_READONLY, "nSD_READONLY");
|
||||
if (err)
|
||||
goto err_request_readonly;
|
||||
|
||||
return 0;
|
||||
|
||||
err_request_readonly:
|
||||
gpio_free(EGPIO_MAGICIAN_SD_POWER);
|
||||
err_request_power:
|
||||
free_irq(IRQ_MAGICIAN_SD, data);
|
||||
err_request_irq:
|
||||
return err;
|
||||
}
|
||||
|
||||
static void magician_mci_setpower(struct device *dev, unsigned int vdd)
|
||||
|
@ -562,6 +589,8 @@ static int magician_mci_get_ro(struct device *dev)
|
|||
|
||||
static void magician_mci_exit(struct device *dev, void *data)
|
||||
{
|
||||
gpio_free(EGPIO_MAGICIAN_nSD_READONLY);
|
||||
gpio_free(EGPIO_MAGICIAN_SD_POWER);
|
||||
free_irq(IRQ_MAGICIAN_SD, data);
|
||||
}
|
||||
|
||||
|
@ -643,28 +672,42 @@ static void __init magician_init(void)
|
|||
{
|
||||
void __iomem *cpld;
|
||||
int lcd_select;
|
||||
int err;
|
||||
|
||||
gpio_request(GPIO13_MAGICIAN_CPLD_IRQ, "CPLD_IRQ");
|
||||
gpio_request(GPIO107_MAGICIAN_DS1WM_IRQ, "DS1WM_IRQ");
|
||||
|
||||
pxa2xx_mfp_config(ARRAY_AND_SIZE(magician_pin_config));
|
||||
|
||||
platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
|
||||
err = gpio_request(GPIO83_MAGICIAN_nIR_EN, "nIR_EN");
|
||||
if (!err) {
|
||||
gpio_direction_output(GPIO83_MAGICIAN_nIR_EN, 1);
|
||||
pxa_set_ficp_info(&magician_ficp_info);
|
||||
}
|
||||
pxa_set_i2c_info(NULL);
|
||||
pxa_set_mci_info(&magician_mci_info);
|
||||
pxa_set_ohci_info(&magician_ohci_info);
|
||||
pxa_set_ficp_info(&magician_ficp_info);
|
||||
|
||||
/* Check LCD type we have */
|
||||
cpld = ioremap_nocache(PXA_CS3_PHYS, 0x1000);
|
||||
if (cpld) {
|
||||
u8 board_id = __raw_readb(cpld+0x14);
|
||||
iounmap(cpld);
|
||||
system_rev = board_id & 0x7;
|
||||
lcd_select = board_id & 0x8;
|
||||
iounmap(cpld);
|
||||
pr_info("LCD type: %s\n", lcd_select ? "Samsung" : "Toppoly");
|
||||
if (lcd_select && (system_rev < 3))
|
||||
pxa_gpio_mode(GPIO75_MAGICIAN_SAMSUNG_POWER_MD);
|
||||
pxa_gpio_mode(GPIO104_MAGICIAN_LCD_POWER_1_MD);
|
||||
pxa_gpio_mode(GPIO105_MAGICIAN_LCD_POWER_2_MD);
|
||||
pxa_gpio_mode(GPIO106_MAGICIAN_LCD_POWER_3_MD);
|
||||
if (lcd_select && (system_rev < 3)) {
|
||||
gpio_request(GPIO75_MAGICIAN_SAMSUNG_POWER, "SAMSUNG_POWER");
|
||||
gpio_direction_output(GPIO75_MAGICIAN_SAMSUNG_POWER, 0);
|
||||
}
|
||||
gpio_request(GPIO104_MAGICIAN_LCD_POWER_1, "LCD_POWER_1");
|
||||
gpio_request(GPIO105_MAGICIAN_LCD_POWER_2, "LCD_POWER_2");
|
||||
gpio_request(GPIO106_MAGICIAN_LCD_POWER_3, "LCD_POWER_3");
|
||||
gpio_direction_output(GPIO104_MAGICIAN_LCD_POWER_1, 0);
|
||||
gpio_direction_output(GPIO105_MAGICIAN_LCD_POWER_2, 0);
|
||||
gpio_direction_output(GPIO106_MAGICIAN_LCD_POWER_3, 0);
|
||||
set_pxa_fb_info(lcd_select ? &samsung_info : &toppoly_info);
|
||||
} else
|
||||
pr_err("LCD detection: CPLD mapping failed\n");
|
||||
|
|
|
@ -434,8 +434,7 @@ static struct pxafb_mode_info toshiba_ltm035a776c_mode = {
|
|||
|
||||
static struct pxafb_mach_info mainstone_pxafb_info = {
|
||||
.num_modes = 1,
|
||||
.lccr0 = LCCR0_Act,
|
||||
.lccr3 = LCCR3_PCP,
|
||||
.lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
|
||||
};
|
||||
|
||||
static int mainstone_mci_init(struct device *dev, irq_handler_t mstone_detect_int, void *data)
|
||||
|
|
|
@ -320,16 +320,13 @@ static struct soc_camera_link iclink[] = {
|
|||
static struct i2c_board_info __initdata pcm990_i2c_devices[] = {
|
||||
{
|
||||
/* Must initialize before the camera(s) */
|
||||
I2C_BOARD_INFO("pca953x", 0x41),
|
||||
.type = "pca9536",
|
||||
I2C_BOARD_INFO("pca9536", 0x41),
|
||||
.platform_data = &pca9536_data,
|
||||
}, {
|
||||
I2C_BOARD_INFO("mt9v022", 0x48),
|
||||
.type = "mt9v022",
|
||||
.platform_data = &iclink[0], /* With extender */
|
||||
}, {
|
||||
I2C_BOARD_INFO("mt9m001", 0x5d),
|
||||
.type = "mt9m001",
|
||||
.platform_data = &iclink[0], /* With extender */
|
||||
},
|
||||
};
|
||||
|
|
|
@ -46,8 +46,8 @@ int pxa_pm_enter(suspend_state_t state)
|
|||
sleep_save_checksum += sleep_save[i];
|
||||
}
|
||||
|
||||
/* Clear sleep reset status */
|
||||
RCSR = RCSR_SMR;
|
||||
/* Clear reset status */
|
||||
RCSR = RCSR_HWR | RCSR_WDR | RCSR_SMR | RCSR_GPR;
|
||||
|
||||
/* *** go zzz *** */
|
||||
pxa_cpu_pm_fns->enter(state);
|
||||
|
|
|
@ -486,6 +486,8 @@ static int pxa3xx_set_wake(unsigned int irq, unsigned int on)
|
|||
case IRQ_MMC3:
|
||||
mask = ADXER_MFP_GEN12;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
local_irq_save(flags);
|
||||
|
|
|
@ -97,8 +97,7 @@ static struct pxafb_mode_info toshiba_ltm04c380k_mode = {
|
|||
|
||||
static struct pxafb_mach_info zylonite_toshiba_lcd_info = {
|
||||
.num_modes = 1,
|
||||
.lccr0 = LCCR0_Act,
|
||||
.lccr3 = LCCR3_PCP,
|
||||
.lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
|
||||
.pxafb_backlight_power = zylonite_backlight_power,
|
||||
};
|
||||
|
||||
|
@ -134,8 +133,7 @@ static struct pxafb_mode_info sharp_ls037_modes[] = {
|
|||
static struct pxafb_mach_info zylonite_sharp_lcd_info = {
|
||||
.modes = sharp_ls037_modes,
|
||||
.num_modes = 2,
|
||||
.lccr0 = LCCR0_Act,
|
||||
.lccr3 = LCCR3_PCP | LCCR3_HSP | LCCR3_VSP,
|
||||
.lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
|
||||
.pxafb_backlight_power = zylonite_backlight_power,
|
||||
};
|
||||
|
||||
|
|
|
@ -372,7 +372,7 @@ config CPU_FEROCEON
|
|||
select CPU_PABRT_NOIFAR
|
||||
select CPU_CACHE_VIVT
|
||||
select CPU_CP15_MMU
|
||||
select CPU_COPY_V4WB if MMU
|
||||
select CPU_COPY_FEROCEON if MMU
|
||||
select CPU_TLB_V4WBI if MMU
|
||||
|
||||
config CPU_FEROCEON_OLD_ID
|
||||
|
@ -523,6 +523,9 @@ config CPU_COPY_V4WT
|
|||
config CPU_COPY_V4WB
|
||||
bool
|
||||
|
||||
config CPU_COPY_FEROCEON
|
||||
bool
|
||||
|
||||
config CPU_COPY_V6
|
||||
bool
|
||||
|
||||
|
@ -658,7 +661,7 @@ config CPU_DCACHE_SIZE
|
|||
|
||||
config CPU_DCACHE_WRITETHROUGH
|
||||
bool "Force write through D-cache"
|
||||
depends on (CPU_ARM740T || CPU_ARM920T || CPU_ARM922T || CPU_ARM925T || CPU_ARM926T || CPU_ARM940T || CPU_ARM946E || CPU_ARM1020 || CPU_FEROCEON) && !CPU_DCACHE_DISABLE
|
||||
depends on (CPU_ARM740T || CPU_ARM920T || CPU_ARM922T || CPU_ARM925T || CPU_ARM926T || CPU_ARM940T || CPU_ARM946E || CPU_ARM1020) && !CPU_DCACHE_DISABLE
|
||||
default y if CPU_ARM925T
|
||||
help
|
||||
Say Y here to use the data cache in writethrough mode. Unless you
|
||||
|
|
|
@ -36,6 +36,7 @@ obj-$(CONFIG_CPU_CACHE_V7) += cache-v7.o
|
|||
obj-$(CONFIG_CPU_COPY_V3) += copypage-v3.o
|
||||
obj-$(CONFIG_CPU_COPY_V4WT) += copypage-v4wt.o
|
||||
obj-$(CONFIG_CPU_COPY_V4WB) += copypage-v4wb.o
|
||||
obj-$(CONFIG_CPU_COPY_FEROCEON) += copypage-feroceon.o
|
||||
obj-$(CONFIG_CPU_COPY_V6) += copypage-v6.o context.o
|
||||
obj-$(CONFIG_CPU_SA1100) += copypage-v4mc.o
|
||||
obj-$(CONFIG_CPU_XSCALE) += copypage-xscale.o
|
||||
|
|
|
@ -0,0 +1,95 @@
|
|||
/*
|
||||
* linux/arch/arm/lib/copypage-feroceon.S
|
||||
*
|
||||
* Copyright (C) 2008 Marvell Semiconductors
|
||||
*
|
||||
* This program 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.
|
||||
*
|
||||
* This handles copy_user_page and clear_user_page on Feroceon
|
||||
* more optimally than the generic implementations.
|
||||
*/
|
||||
#include <linux/linkage.h>
|
||||
#include <linux/init.h>
|
||||
#include <asm/asm-offsets.h>
|
||||
|
||||
.text
|
||||
.align 5
|
||||
|
||||
ENTRY(feroceon_copy_user_page)
|
||||
stmfd sp!, {r4-r9, lr}
|
||||
mov ip, #PAGE_SZ
|
||||
1: mov lr, r1
|
||||
ldmia r1!, {r2 - r9}
|
||||
pld [lr, #32]
|
||||
pld [lr, #64]
|
||||
pld [lr, #96]
|
||||
pld [lr, #128]
|
||||
pld [lr, #160]
|
||||
pld [lr, #192]
|
||||
pld [lr, #224]
|
||||
stmia r0, {r2 - r9}
|
||||
ldmia r1!, {r2 - r9}
|
||||
mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line
|
||||
add r0, r0, #32
|
||||
stmia r0, {r2 - r9}
|
||||
ldmia r1!, {r2 - r9}
|
||||
mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line
|
||||
add r0, r0, #32
|
||||
stmia r0, {r2 - r9}
|
||||
ldmia r1!, {r2 - r9}
|
||||
mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line
|
||||
add r0, r0, #32
|
||||
stmia r0, {r2 - r9}
|
||||
ldmia r1!, {r2 - r9}
|
||||
mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line
|
||||
add r0, r0, #32
|
||||
stmia r0, {r2 - r9}
|
||||
ldmia r1!, {r2 - r9}
|
||||
mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line
|
||||
add r0, r0, #32
|
||||
stmia r0, {r2 - r9}
|
||||
ldmia r1!, {r2 - r9}
|
||||
mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line
|
||||
add r0, r0, #32
|
||||
stmia r0, {r2 - r9}
|
||||
ldmia r1!, {r2 - r9}
|
||||
mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line
|
||||
add r0, r0, #32
|
||||
stmia r0, {r2 - r9}
|
||||
subs ip, ip, #(32 * 8)
|
||||
mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line
|
||||
add r0, r0, #32
|
||||
bne 1b
|
||||
mcr p15, 0, ip, c7, c10, 4 @ drain WB
|
||||
ldmfd sp!, {r4-r9, pc}
|
||||
|
||||
.align 5
|
||||
|
||||
ENTRY(feroceon_clear_user_page)
|
||||
stmfd sp!, {r4-r7, lr}
|
||||
mov r1, #PAGE_SZ/32
|
||||
mov r2, #0
|
||||
mov r3, #0
|
||||
mov r4, #0
|
||||
mov r5, #0
|
||||
mov r6, #0
|
||||
mov r7, #0
|
||||
mov ip, #0
|
||||
mov lr, #0
|
||||
1: stmia r0, {r2-r7, ip, lr}
|
||||
subs r1, r1, #1
|
||||
mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D line
|
||||
add r0, r0, #32
|
||||
bne 1b
|
||||
mcr p15, 0, r1, c7, c10, 4 @ drain WB
|
||||
ldmfd sp!, {r4-r7, pc}
|
||||
|
||||
__INITDATA
|
||||
|
||||
.type feroceon_user_fns, #object
|
||||
ENTRY(feroceon_user_fns)
|
||||
.long feroceon_clear_user_page
|
||||
.long feroceon_copy_user_page
|
||||
.size feroceon_user_fns, . - feroceon_user_fns
|
|
@ -26,8 +26,8 @@ EXPORT_SYMBOL(ioport_unmap);
|
|||
#ifdef CONFIG_PCI
|
||||
void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen)
|
||||
{
|
||||
unsigned long start = pci_resource_start(dev, bar);
|
||||
unsigned long len = pci_resource_len(dev, bar);
|
||||
resource_size_t start = pci_resource_start(dev, bar);
|
||||
resource_size_t len = pci_resource_len(dev, bar);
|
||||
unsigned long flags = pci_resource_flags(dev, bar);
|
||||
|
||||
if (!len || !start)
|
||||
|
|
|
@ -35,6 +35,7 @@ extern pgd_t swapper_pg_dir[PTRS_PER_PGD];
|
|||
* zero-initialized data and COW.
|
||||
*/
|
||||
struct page *empty_zero_page;
|
||||
EXPORT_SYMBOL(empty_zero_page);
|
||||
|
||||
/*
|
||||
* The pmd table for the upper-most set of pages.
|
||||
|
|
|
@ -93,7 +93,7 @@ ENTRY(cpu_feroceon_reset)
|
|||
*
|
||||
* Called with IRQs disabled
|
||||
*/
|
||||
.align 10
|
||||
.align 5
|
||||
ENTRY(cpu_feroceon_do_idle)
|
||||
mov r0, #0
|
||||
mcr p15, 0, r0, c7, c10, 4 @ Drain write buffer
|
||||
|
@ -106,6 +106,7 @@ ENTRY(cpu_feroceon_do_idle)
|
|||
* Clean and invalidate all cache entries in a particular
|
||||
* address space.
|
||||
*/
|
||||
.align 5
|
||||
ENTRY(feroceon_flush_user_cache_all)
|
||||
/* FALLTHROUGH */
|
||||
|
||||
|
@ -118,12 +119,8 @@ ENTRY(feroceon_flush_kern_cache_all)
|
|||
mov r2, #VM_EXEC
|
||||
mov ip, #0
|
||||
__flush_whole_cache:
|
||||
#ifdef CONFIG_CPU_DCACHE_WRITETHROUGH
|
||||
mcr p15, 0, ip, c7, c6, 0 @ invalidate D cache
|
||||
#else
|
||||
1: mrc p15, 0, r15, c7, c14, 3 @ test,clean,invalidate
|
||||
bne 1b
|
||||
#endif
|
||||
tst r2, #VM_EXEC
|
||||
mcrne p15, 0, ip, c7, c5, 0 @ invalidate I cache
|
||||
mcrne p15, 0, ip, c7, c10, 4 @ drain WB
|
||||
|
@ -139,27 +136,19 @@ __flush_whole_cache:
|
|||
* - end - end address (exclusive)
|
||||
* - flags - vm_flags describing address space
|
||||
*/
|
||||
.align 5
|
||||
ENTRY(feroceon_flush_user_cache_range)
|
||||
mov ip, #0
|
||||
sub r3, r1, r0 @ calculate total size
|
||||
cmp r3, #CACHE_DLIMIT
|
||||
bgt __flush_whole_cache
|
||||
1: tst r2, #VM_EXEC
|
||||
#ifdef CONFIG_CPU_DCACHE_WRITETHROUGH
|
||||
mcr p15, 0, r0, c7, c6, 1 @ invalidate D entry
|
||||
mcrne p15, 0, r0, c7, c5, 1 @ invalidate I entry
|
||||
add r0, r0, #CACHE_DLINESIZE
|
||||
mcr p15, 0, r0, c7, c6, 1 @ invalidate D entry
|
||||
mcrne p15, 0, r0, c7, c5, 1 @ invalidate I entry
|
||||
add r0, r0, #CACHE_DLINESIZE
|
||||
#else
|
||||
mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D entry
|
||||
mcrne p15, 0, r0, c7, c5, 1 @ invalidate I entry
|
||||
add r0, r0, #CACHE_DLINESIZE
|
||||
mcr p15, 0, r0, c7, c14, 1 @ clean and invalidate D entry
|
||||
mcrne p15, 0, r0, c7, c5, 1 @ invalidate I entry
|
||||
add r0, r0, #CACHE_DLINESIZE
|
||||
#endif
|
||||
cmp r0, r1
|
||||
blo 1b
|
||||
tst r2, #VM_EXEC
|
||||
|
@ -176,6 +165,7 @@ ENTRY(feroceon_flush_user_cache_range)
|
|||
* - start - virtual start address
|
||||
* - end - virtual end address
|
||||
*/
|
||||
.align 5
|
||||
ENTRY(feroceon_coherent_kern_range)
|
||||
/* FALLTHROUGH */
|
||||
|
||||
|
@ -207,6 +197,7 @@ ENTRY(feroceon_coherent_user_range)
|
|||
*
|
||||
* - addr - page aligned address
|
||||
*/
|
||||
.align 5
|
||||
ENTRY(feroceon_flush_kern_dcache_page)
|
||||
add r1, r0, #PAGE_SZ
|
||||
1: mcr p15, 0, r0, c7, c14, 1 @ clean+invalidate D entry
|
||||
|
@ -231,13 +222,12 @@ ENTRY(feroceon_flush_kern_dcache_page)
|
|||
*
|
||||
* (same as v4wb)
|
||||
*/
|
||||
.align 5
|
||||
ENTRY(feroceon_dma_inv_range)
|
||||
#ifndef CONFIG_CPU_DCACHE_WRITETHROUGH
|
||||
tst r0, #CACHE_DLINESIZE - 1
|
||||
mcrne p15, 0, r0, c7, c10, 1 @ clean D entry
|
||||
tst r1, #CACHE_DLINESIZE - 1
|
||||
mcrne p15, 0, r1, c7, c10, 1 @ clean D entry
|
||||
#endif
|
||||
bic r0, r0, #CACHE_DLINESIZE - 1
|
||||
1: mcr p15, 0, r0, c7, c6, 1 @ invalidate D entry
|
||||
add r0, r0, #CACHE_DLINESIZE
|
||||
|
@ -256,14 +246,13 @@ ENTRY(feroceon_dma_inv_range)
|
|||
*
|
||||
* (same as v4wb)
|
||||
*/
|
||||
.align 5
|
||||
ENTRY(feroceon_dma_clean_range)
|
||||
#ifndef CONFIG_CPU_DCACHE_WRITETHROUGH
|
||||
bic r0, r0, #CACHE_DLINESIZE - 1
|
||||
1: mcr p15, 0, r0, c7, c10, 1 @ clean D entry
|
||||
add r0, r0, #CACHE_DLINESIZE
|
||||
cmp r0, r1
|
||||
blo 1b
|
||||
#endif
|
||||
mcr p15, 0, r0, c7, c10, 4 @ drain WB
|
||||
mov pc, lr
|
||||
|
||||
|
@ -275,14 +264,10 @@ ENTRY(feroceon_dma_clean_range)
|
|||
* - start - virtual start address
|
||||
* - end - virtual end address
|
||||
*/
|
||||
.align 5
|
||||
ENTRY(feroceon_dma_flush_range)
|
||||
bic r0, r0, #CACHE_DLINESIZE - 1
|
||||
1:
|
||||
#ifndef CONFIG_CPU_DCACHE_WRITETHROUGH
|
||||
mcr p15, 0, r0, c7, c14, 1 @ clean+invalidate D entry
|
||||
#else
|
||||
mcr p15, 0, r0, c7, c10, 1 @ clean D entry
|
||||
#endif
|
||||
1: mcr p15, 0, r0, c7, c14, 1 @ clean+invalidate D entry
|
||||
add r0, r0, #CACHE_DLINESIZE
|
||||
cmp r0, r1
|
||||
blo 1b
|
||||
|
@ -300,13 +285,12 @@ ENTRY(feroceon_cache_fns)
|
|||
.long feroceon_dma_clean_range
|
||||
.long feroceon_dma_flush_range
|
||||
|
||||
.align 5
|
||||
ENTRY(cpu_feroceon_dcache_clean_area)
|
||||
#ifndef CONFIG_CPU_DCACHE_WRITETHROUGH
|
||||
1: mcr p15, 0, r0, c7, c10, 1 @ clean D entry
|
||||
add r0, r0, #CACHE_DLINESIZE
|
||||
subs r1, r1, #CACHE_DLINESIZE
|
||||
bhi 1b
|
||||
#endif
|
||||
mcr p15, 0, r0, c7, c10, 4 @ drain WB
|
||||
mov pc, lr
|
||||
|
||||
|
@ -323,13 +307,9 @@ ENTRY(cpu_feroceon_dcache_clean_area)
|
|||
ENTRY(cpu_feroceon_switch_mm)
|
||||
#ifdef CONFIG_MMU
|
||||
mov ip, #0
|
||||
#ifdef CONFIG_CPU_DCACHE_WRITETHROUGH
|
||||
mcr p15, 0, ip, c7, c6, 0 @ invalidate D cache
|
||||
#else
|
||||
@ && 'Clean & Invalidate whole DCache'
|
||||
1: mrc p15, 0, r15, c7, c14, 3 @ test,clean,invalidate
|
||||
bne 1b
|
||||
#endif
|
||||
mcr p15, 0, ip, c7, c5, 0 @ invalidate I cache
|
||||
mcr p15, 0, ip, c7, c10, 4 @ drain WB
|
||||
mcr p15, 0, r0, c2, c0, 0 @ load page table pointer
|
||||
|
@ -362,16 +342,9 @@ ENTRY(cpu_feroceon_set_pte_ext)
|
|||
tst r1, #L_PTE_PRESENT | L_PTE_YOUNG @ Present and Young?
|
||||
movne r2, #0
|
||||
|
||||
#ifdef CONFIG_CPU_DCACHE_WRITETHROUGH
|
||||
eor r3, r2, #0x0a @ C & small page?
|
||||
tst r3, #0x0b
|
||||
biceq r2, r2, #4
|
||||
#endif
|
||||
str r2, [r0] @ hardware version
|
||||
mov r0, r0
|
||||
#ifndef CONFIG_CPU_DCACHE_WRITETHROUGH
|
||||
mcr p15, 0, r0, c7, c10, 1 @ clean D entry
|
||||
#endif
|
||||
mcr p15, 0, r0, c7, c10, 4 @ drain WB
|
||||
#endif
|
||||
mov pc, lr
|
||||
|
@ -387,20 +360,11 @@ __feroceon_setup:
|
|||
mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef CONFIG_CPU_DCACHE_WRITETHROUGH
|
||||
mov r0, #4 @ disable write-back on caches explicitly
|
||||
mcr p15, 7, r0, c15, c0, 0
|
||||
#endif
|
||||
|
||||
adr r5, feroceon_crval
|
||||
ldmia r5, {r5, r6}
|
||||
mrc p15, 0, r0, c1, c0 @ get control register v4
|
||||
bic r0, r0, r5
|
||||
orr r0, r0, r6
|
||||
#ifdef CONFIG_CPU_CACHE_ROUND_ROBIN
|
||||
orr r0, r0, #0x4000 @ .1.. .... .... ....
|
||||
#endif
|
||||
mov pc, lr
|
||||
.size __feroceon_setup, . - __feroceon_setup
|
||||
|
||||
|
@ -476,7 +440,7 @@ __feroceon_old_id_proc_info:
|
|||
.long cpu_feroceon_name
|
||||
.long feroceon_processor_functions
|
||||
.long v4wbi_tlb_fns
|
||||
.long v4wb_user_fns
|
||||
.long feroceon_user_fns
|
||||
.long feroceon_cache_fns
|
||||
.size __feroceon_old_id_proc_info, . - __feroceon_old_id_proc_info
|
||||
#endif
|
||||
|
@ -502,6 +466,6 @@ __feroceon_proc_info:
|
|||
.long cpu_feroceon_name
|
||||
.long feroceon_processor_functions
|
||||
.long v4wbi_tlb_fns
|
||||
.long v4wb_user_fns
|
||||
.long feroceon_user_fns
|
||||
.long feroceon_cache_fns
|
||||
.size __feroceon_proc_info, . - __feroceon_proc_info
|
||||
|
|
|
@ -51,7 +51,7 @@
|
|||
/*
|
||||
* MPCore SCU event monitor support
|
||||
*/
|
||||
#define SCU_EVENTMONITORS_VA_BASE __io_address(REALVIEW_MPCORE_SCU_BASE + 0x10)
|
||||
#define SCU_EVENTMONITORS_VA_BASE __io_address(REALVIEW_EB11MP_SCU_BASE + 0x10)
|
||||
|
||||
/*
|
||||
* Bitmask of used SCU counters
|
||||
|
@ -80,7 +80,7 @@ static irqreturn_t scu_em_interrupt(int irq, void *arg)
|
|||
struct eventmonitor __iomem *emc = SCU_EVENTMONITORS_VA_BASE;
|
||||
unsigned int cnt;
|
||||
|
||||
cnt = irq - IRQ_PMU_SCU0;
|
||||
cnt = irq - IRQ_EB11MP_PMU_SCU0;
|
||||
oprofile_add_sample(get_irq_regs(), SCU_COUNTER(cnt));
|
||||
scu_reset_counter(emc, cnt);
|
||||
|
||||
|
@ -119,10 +119,10 @@ static int scu_start(void)
|
|||
*/
|
||||
for (i = 0; i < NUM_SCU_COUNTERS; i++) {
|
||||
if (scu_em_used & (1 << i)) {
|
||||
ret = request_irq(IRQ_PMU_SCU0 + i, scu_em_interrupt, IRQF_DISABLED, "SCU PMU", NULL);
|
||||
ret = request_irq(IRQ_EB11MP_PMU_SCU0 + i, scu_em_interrupt, IRQF_DISABLED, "SCU PMU", NULL);
|
||||
if (ret) {
|
||||
printk(KERN_ERR "oprofile: unable to request IRQ%u for SCU Event Monitor\n",
|
||||
IRQ_PMU_SCU0 + i);
|
||||
IRQ_EB11MP_PMU_SCU0 + i);
|
||||
goto err_free_scu;
|
||||
}
|
||||
}
|
||||
|
@ -153,7 +153,7 @@ static int scu_start(void)
|
|||
|
||||
err_free_scu:
|
||||
while (i--)
|
||||
free_irq(IRQ_PMU_SCU0 + i, NULL);
|
||||
free_irq(IRQ_EB11MP_PMU_SCU0 + i, NULL);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -175,7 +175,7 @@ static void scu_stop(void)
|
|||
for (i = 0; i < NUM_SCU_COUNTERS; i++) {
|
||||
if (scu_em_used & (1 << i)) {
|
||||
scu_reset_counter(emc, i);
|
||||
free_irq(IRQ_PMU_SCU0 + i, NULL);
|
||||
free_irq(IRQ_EB11MP_PMU_SCU0 + i, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -225,10 +225,10 @@ static int em_setup_ctrs(void)
|
|||
}
|
||||
|
||||
static int arm11_irqs[] = {
|
||||
[0] = IRQ_PMU_CPU0,
|
||||
[1] = IRQ_PMU_CPU1,
|
||||
[2] = IRQ_PMU_CPU2,
|
||||
[3] = IRQ_PMU_CPU3
|
||||
[0] = IRQ_EB11MP_PMU_CPU0,
|
||||
[1] = IRQ_EB11MP_PMU_CPU1,
|
||||
[2] = IRQ_EB11MP_PMU_CPU2,
|
||||
[3] = IRQ_EB11MP_PMU_CPU3
|
||||
};
|
||||
|
||||
static int em_start(void)
|
||||
|
@ -273,22 +273,22 @@ static int em_setup(void)
|
|||
/*
|
||||
* Send SCU PMU interrupts to the "owner" CPU.
|
||||
*/
|
||||
em_route_irq(IRQ_PMU_SCU0, 0);
|
||||
em_route_irq(IRQ_PMU_SCU1, 0);
|
||||
em_route_irq(IRQ_PMU_SCU2, 1);
|
||||
em_route_irq(IRQ_PMU_SCU3, 1);
|
||||
em_route_irq(IRQ_PMU_SCU4, 2);
|
||||
em_route_irq(IRQ_PMU_SCU5, 2);
|
||||
em_route_irq(IRQ_PMU_SCU6, 3);
|
||||
em_route_irq(IRQ_PMU_SCU7, 3);
|
||||
em_route_irq(IRQ_EB11MP_PMU_SCU0, 0);
|
||||
em_route_irq(IRQ_EB11MP_PMU_SCU1, 0);
|
||||
em_route_irq(IRQ_EB11MP_PMU_SCU2, 1);
|
||||
em_route_irq(IRQ_EB11MP_PMU_SCU3, 1);
|
||||
em_route_irq(IRQ_EB11MP_PMU_SCU4, 2);
|
||||
em_route_irq(IRQ_EB11MP_PMU_SCU5, 2);
|
||||
em_route_irq(IRQ_EB11MP_PMU_SCU6, 3);
|
||||
em_route_irq(IRQ_EB11MP_PMU_SCU7, 3);
|
||||
|
||||
/*
|
||||
* Send CP15 PMU interrupts to the owner CPU.
|
||||
*/
|
||||
em_route_irq(IRQ_PMU_CPU0, 0);
|
||||
em_route_irq(IRQ_PMU_CPU1, 1);
|
||||
em_route_irq(IRQ_PMU_CPU2, 2);
|
||||
em_route_irq(IRQ_PMU_CPU3, 3);
|
||||
em_route_irq(IRQ_EB11MP_PMU_CPU0, 0);
|
||||
em_route_irq(IRQ_EB11MP_PMU_CPU1, 1);
|
||||
em_route_irq(IRQ_EB11MP_PMU_CPU2, 2);
|
||||
em_route_irq(IRQ_EB11MP_PMU_CPU3, 3);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -5,14 +5,7 @@
|
|||
*/
|
||||
|
||||
#include <linux/thread_info.h>
|
||||
|
||||
#define DEFINE(sym, val) \
|
||||
asm volatile("\n->" #sym " %0 " #val : : "i" (val))
|
||||
|
||||
#define BLANK() asm volatile("\n->" : : )
|
||||
|
||||
#define OFFSET(sym, str, mem) \
|
||||
DEFINE(sym, offsetof(struct str, mem));
|
||||
#include <linux/kbuild.h>
|
||||
|
||||
void foo(void)
|
||||
{
|
||||
|
|
|
@ -14,19 +14,6 @@
|
|||
#include <asm/mman.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
asmlinkage int sys_pipe(unsigned long __user *filedes)
|
||||
{
|
||||
int fd[2];
|
||||
int error;
|
||||
|
||||
error = do_pipe(fd);
|
||||
if (!error) {
|
||||
if (copy_to_user(filedes, fd, sizeof(fd)))
|
||||
error = -EFAULT;
|
||||
}
|
||||
return error;
|
||||
}
|
||||
|
||||
asmlinkage long sys_mmap2(unsigned long addr, unsigned long len,
|
||||
unsigned long prot, unsigned long flags,
|
||||
unsigned long fd, off_t offset)
|
||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче