Merge with /home/shaggy/git/linus-clean/

This commit is contained in:
Dave Kleikamp 2006-03-14 17:05:45 -06:00
commit c5111f504d
2235 changed files with 51805 additions and 34961 deletions

View File

@ -3101,7 +3101,7 @@ S: Minto, NSW, 2566
S: Australia S: Australia
N: Stephen Smalley N: Stephen Smalley
E: sds@epoch.ncsc.mil E: sds@tycho.nsa.gov
D: portions of the Linux Security Module (LSM) framework and security modules D: portions of the Linux Security Module (LSM) framework and security modules
N: Chris Smith N: Chris Smith
@ -3643,11 +3643,9 @@ S: Cambridge. CB1 7EG
S: England S: England
N: Chris Wright N: Chris Wright
E: chrisw@osdl.org E: chrisw@sous-sol.org
D: hacking on LSM framework and security modules. D: hacking on LSM framework and security modules.
S: c/o OSDL S: Portland, OR
S: 12725 SW Millikan Way, Suite 400
S: Beaverton, OR 97005
S: USA S: USA
N: Michal Wronski N: Michal Wronski

View File

@ -90,16 +90,20 @@ at OLS. The resulting abundance of RCU patches was presented the
following year [McKenney02a], and use of RCU in dcache was first following year [McKenney02a], and use of RCU in dcache was first
described that same year [Linder02a]. described that same year [Linder02a].
Also in 2002, Michael [Michael02b,Michael02a] presented techniques Also in 2002, Michael [Michael02b,Michael02a] presented "hazard-pointer"
that defer the destruction of data structures to simplify non-blocking techniques that defer the destruction of data structures to simplify
synchronization (wait-free synchronization, lock-free synchronization, non-blocking synchronization (wait-free synchronization, lock-free
and obstruction-free synchronization are all examples of non-blocking synchronization, and obstruction-free synchronization are all examples of
synchronization). In particular, this technique eliminates locking, non-blocking synchronization). In particular, this technique eliminates
reduces contention, reduces memory latency for readers, and parallelizes locking, reduces contention, reduces memory latency for readers, and
pipeline stalls and memory latency for writers. However, these parallelizes pipeline stalls and memory latency for writers. However,
techniques still impose significant read-side overhead in the form of these techniques still impose significant read-side overhead in the
memory barriers. Researchers at Sun worked along similar lines in the form of memory barriers. Researchers at Sun worked along similar lines
same timeframe [HerlihyLM02,HerlihyLMS03]. in the same timeframe [HerlihyLM02,HerlihyLMS03]. These techniques
can be thought of as inside-out reference counts, where the count is
represented by the number of hazard pointers referencing a given data
structure (rather than the more conventional counter field within the
data structure itself).
In 2003, the K42 group described how RCU could be used to create In 2003, the K42 group described how RCU could be used to create
hot-pluggable implementations of operating-system functions. Later that hot-pluggable implementations of operating-system functions. Later that
@ -113,7 +117,6 @@ number of operating-system kernels [PaulEdwardMcKenneyPhD], a paper
describing how to make RCU safe for soft-realtime applications [Sarma04c], describing how to make RCU safe for soft-realtime applications [Sarma04c],
and a paper describing SELinux performance with RCU [JamesMorris04b]. and a paper describing SELinux performance with RCU [JamesMorris04b].
2005 has seen further adaptation of RCU to realtime use, permitting 2005 has seen further adaptation of RCU to realtime use, permitting
preemption of RCU realtime critical sections [PaulMcKenney05a, preemption of RCU realtime critical sections [PaulMcKenney05a,
PaulMcKenney05b]. PaulMcKenney05b].

View File

@ -177,3 +177,9 @@ over a rather long period of time, but improvements are always welcome!
If you want to wait for some of these other things, you might If you want to wait for some of these other things, you might
instead need to use synchronize_irq() or synchronize_sched(). instead need to use synchronize_irq() or synchronize_sched().
12. Any lock acquired by an RCU callback must be acquired elsewhere
with irq disabled, e.g., via spin_lock_irqsave(). Failing to
disable irq on a given acquisition of that lock will result in
deadlock as soon as the RCU callback happens to interrupt that
acquisition's critical section.

View File

@ -232,7 +232,7 @@ entry does not exist. For this to be helpful, the search function must
return holding the per-entry spinlock, as ipc_lock() does in fact do. return holding the per-entry spinlock, as ipc_lock() does in fact do.
Quick Quiz: Why does the search function need to return holding the Quick Quiz: Why does the search function need to return holding the
per-entry lock for this deleted-flag technique to be helpful? per-entry lock for this deleted-flag technique to be helpful?
If the system-call audit module were to ever need to reject stale data, If the system-call audit module were to ever need to reject stale data,
one way to accomplish this would be to add a "deleted" flag and a "lock" one way to accomplish this would be to add a "deleted" flag and a "lock"
@ -275,8 +275,8 @@ flag under the spinlock as follows:
{ {
struct audit_entry *e; struct audit_entry *e;
/* Do not use the _rcu iterator here, since this is the only /* Do not need to use the _rcu iterator here, since this
* deletion routine. */ * is the only deletion routine. */
list_for_each_entry(e, list, list) { list_for_each_entry(e, list, list) {
if (!audit_compare_rule(rule, &e->rule)) { if (!audit_compare_rule(rule, &e->rule)) {
spin_lock(&e->lock); spin_lock(&e->lock);
@ -304,9 +304,12 @@ function to reject newly deleted data.
Answer to Quick Quiz Answer to Quick Quiz
Why does the search function need to return holding the per-entry
lock for this deleted-flag technique to be helpful?
If the search function drops the per-entry lock before returning, then If the search function drops the per-entry lock before returning,
the caller will be processing stale data in any case. If it is really then the caller will be processing stale data in any case. If it
OK to be processing stale data, then you don't need a "deleted" flag. is really OK to be processing stale data, then you don't need a
If processing stale data really is a problem, then you need to hold the "deleted" flag. If processing stale data really is a problem,
per-entry lock across all of the code that uses the value looked up. then you need to hold the per-entry lock across all of the code
that uses the value that was returned.

View File

@ -111,6 +111,11 @@ o What are all these files in this directory?
You are reading it! You are reading it!
rcuref.txt
Describes how to combine use of reference counts
with RCU.
whatisRCU.txt whatisRCU.txt
Overview of how the RCU implementation works. Along Overview of how the RCU implementation works. Along

View File

@ -1,7 +1,7 @@
Refcounter design for elements of lists/arrays protected by RCU. Reference-count design for elements of lists/arrays protected by RCU.
Refcounting on elements of lists which are protected by traditional Reference counting on elements of lists which are protected by traditional
reader/writer spinlocks or semaphores are straight forward as in: reader/writer spinlocks or semaphores are straightforward:
1. 2. 1. 2.
add() search_and_reference() add() search_and_reference()
@ -28,12 +28,12 @@ release_referenced() delete()
... ...
} }
If this list/array is made lock free using rcu as in changing the If this list/array is made lock free using RCU as in changing the
write_lock in add() and delete() to spin_lock and changing read_lock write_lock() in add() and delete() to spin_lock and changing read_lock
in search_and_reference to rcu_read_lock(), the atomic_get in in search_and_reference to rcu_read_lock(), the atomic_get in
search_and_reference could potentially hold reference to an element which search_and_reference could potentially hold reference to an element which
has already been deleted from the list/array. atomic_inc_not_zero takes has already been deleted from the list/array. Use atomic_inc_not_zero()
care of this scenario. search_and_reference should look as; in this scenario as follows:
1. 2. 1. 2.
add() search_and_reference() add() search_and_reference()
@ -51,17 +51,16 @@ add() search_and_reference()
release_referenced() delete() release_referenced() delete()
{ { { {
... write_lock(&list_lock); ... write_lock(&list_lock);
atomic_dec(&el->rc, relfunc) ... if (atomic_dec_and_test(&el->rc)) ...
... delete_element call_rcu(&el->head, el_free); delete_element
} write_unlock(&list_lock); ... write_unlock(&list_lock);
... } ...
if (atomic_dec_and_test(&el->rc)) if (atomic_dec_and_test(&el->rc))
call_rcu(&el->head, el_free); call_rcu(&el->head, el_free);
... ...
} }
Sometimes, reference to the element need to be obtained in the Sometimes, a reference to the element needs to be obtained in the
update (write) stream. In such cases, atomic_inc_not_zero might be an update (write) stream. In such cases, atomic_inc_not_zero() might be
overkill since the spinlock serialising list updates are held. atomic_inc overkill, since we hold the update-side spinlock. One might instead
is to be used in such cases. use atomic_inc() in such cases.

View File

@ -200,10 +200,11 @@ rcu_assign_pointer()
the new value, and also executes any memory-barrier instructions the new value, and also executes any memory-barrier instructions
required for a given CPU architecture. required for a given CPU architecture.
Perhaps more important, it serves to document which pointers Perhaps just as important, it serves to document (1) which
are protected by RCU. That said, rcu_assign_pointer() is most pointers are protected by RCU and (2) the point at which a
frequently used indirectly, via the _rcu list-manipulation given structure becomes accessible to other CPUs. That said,
primitives such as list_add_rcu(). rcu_assign_pointer() is most frequently used indirectly, via
the _rcu list-manipulation primitives such as list_add_rcu().
rcu_dereference() rcu_dereference()
@ -258,9 +259,11 @@ rcu_dereference()
locking. locking.
As with rcu_assign_pointer(), an important function of As with rcu_assign_pointer(), an important function of
rcu_dereference() is to document which pointers are protected rcu_dereference() is to document which pointers are protected by
by RCU. And, again like rcu_assign_pointer(), rcu_dereference() RCU, in particular, flagging a pointer that is subject to changing
is typically used indirectly, via the _rcu list-manipulation at any time, including immediately after the rcu_dereference().
And, again like rcu_assign_pointer(), rcu_dereference() is
typically used indirectly, via the _rcu list-manipulation
primitives, such as list_for_each_entry_rcu(). primitives, such as list_for_each_entry_rcu().
The following diagram shows how each API communicates among the The following diagram shows how each API communicates among the
@ -327,7 +330,7 @@ for specialized uses, but are relatively uncommon.
3. WHAT ARE SOME EXAMPLE USES OF CORE RCU API? 3. WHAT ARE SOME EXAMPLE USES OF CORE RCU API?
This section shows a simple use of the core RCU API to protect a This section shows a simple use of the core RCU API to protect a
global pointer to a dynamically allocated structure. More typical global pointer to a dynamically allocated structure. More-typical
uses of RCU may be found in listRCU.txt, arrayRCU.txt, and NMI-RCU.txt. uses of RCU may be found in listRCU.txt, arrayRCU.txt, and NMI-RCU.txt.
struct foo { struct foo {
@ -410,6 +413,8 @@ o Use synchronize_rcu() -after- removing a data element from an
data item. data item.
See checklist.txt for additional rules to follow when using RCU. See checklist.txt for additional rules to follow when using RCU.
And again, more-typical uses of RCU may be found in listRCU.txt,
arrayRCU.txt, and NMI-RCU.txt.
4. WHAT IF MY UPDATING THREAD CANNOT BLOCK? 4. WHAT IF MY UPDATING THREAD CANNOT BLOCK?
@ -513,7 +518,7 @@ production-quality implementation, and see:
for papers describing the Linux kernel RCU implementation. The OLS'01 for papers describing the Linux kernel RCU implementation. The OLS'01
and OLS'02 papers are a good introduction, and the dissertation provides and OLS'02 papers are a good introduction, and the dissertation provides
more details on the current implementation. more details on the current implementation as of early 2004.
5A. "TOY" IMPLEMENTATION #1: LOCKING 5A. "TOY" IMPLEMENTATION #1: LOCKING
@ -768,7 +773,6 @@ RCU pointer/list traversal:
rcu_dereference rcu_dereference
list_for_each_rcu (to be deprecated in favor of list_for_each_rcu (to be deprecated in favor of
list_for_each_entry_rcu) list_for_each_entry_rcu)
list_for_each_safe_rcu (deprecated, not used)
list_for_each_entry_rcu list_for_each_entry_rcu
list_for_each_continue_rcu (to be deprecated in favor of new list_for_each_continue_rcu (to be deprecated in favor of new
list_for_each_entry_continue_rcu) list_for_each_entry_continue_rcu)
@ -807,7 +811,8 @@ Quick Quiz #1: Why is this argument naive? How could a deadlock
Answer: Consider the following sequence of events: Answer: Consider the following sequence of events:
1. CPU 0 acquires some unrelated lock, call it 1. CPU 0 acquires some unrelated lock, call it
"problematic_lock". "problematic_lock", disabling irq via
spin_lock_irqsave().
2. CPU 1 enters synchronize_rcu(), write-acquiring 2. CPU 1 enters synchronize_rcu(), write-acquiring
rcu_gp_mutex. rcu_gp_mutex.
@ -894,7 +899,7 @@ Answer: Just as PREEMPT_RT permits preemption of spinlock
ACKNOWLEDGEMENTS ACKNOWLEDGEMENTS
My thanks to the people who helped make this human-readable, including My thanks to the people who helped make this human-readable, including
Jon Walpole, Josh Triplett, Serge Hallyn, and Suzanne Wood. Jon Walpole, Josh Triplett, Serge Hallyn, Suzanne Wood, and Alan Stern.
For more information, see http://www.rdrop.com/users/paulmck/RCU. For more information, see http://www.rdrop.com/users/paulmck/RCU.

View File

@ -11,6 +11,8 @@
Joel Schopp <jschopp@austin.ibm.com> Joel Schopp <jschopp@austin.ibm.com>
ia64/x86_64: ia64/x86_64:
Ashok Raj <ashok.raj@intel.com> Ashok Raj <ashok.raj@intel.com>
s390:
Heiko Carstens <heiko.carstens@de.ibm.com>
Authors: Ashok Raj <ashok.raj@intel.com> Authors: Ashok Raj <ashok.raj@intel.com>
Lots of feedback: Nathan Lynch <nathanl@austin.ibm.com>, Lots of feedback: Nathan Lynch <nathanl@austin.ibm.com>,
@ -44,9 +46,28 @@ maxcpus=n Restrict boot time cpus to n. Say if you have 4 cpus, using
maxcpus=2 will only boot 2. You can choose to bring the maxcpus=2 will only boot 2. You can choose to bring the
other cpus later online, read FAQ's for more info. other cpus later online, read FAQ's for more info.
additional_cpus=n [x86_64 only] use this to limit hotpluggable cpus. additional_cpus*=n Use this to limit hotpluggable cpus. This option sets
This option sets cpu_possible_map = cpu_present_map + additional_cpus
cpu_possible_map = cpu_present_map + additional_cpus
(*) Option valid only for following architectures
- x86_64, ia64, s390
ia64 and x86_64 use the number of disabled local apics in ACPI tables MADT
to determine the number of potentially hot-pluggable cpus. The implementation
should only rely on this to count the #of cpus, but *MUST* not rely on the
apicid values in those tables for disabled apics. In the event BIOS doesnt
mark such hot-pluggable cpus as disabled entries, one could use this
parameter "additional_cpus=x" to represent those cpus in the cpu_possible_map.
s390 uses the number of cpus it detects at IPL time to also the number of bits
in cpu_possible_map. If it is desired to add additional cpus at a later time
the number should be specified using this option or the possible_cpus option.
possible_cpus=n [s390 only] use this to set hotpluggable cpus.
This option sets possible_cpus bits in
cpu_possible_map. Thus keeping the numbers of bits set
constant even if the machine gets rebooted.
This option overrides additional_cpus.
CPU maps and such CPU maps and such
----------------- -----------------

View File

@ -0,0 +1,41 @@
Export cpu topology info by sysfs. Items (attributes) are similar
to /proc/cpuinfo.
1) /sys/devices/system/cpu/cpuX/topology/physical_package_id:
represent the physical package id of cpu X;
2) /sys/devices/system/cpu/cpuX/topology/core_id:
represent the cpu core id to cpu X;
3) /sys/devices/system/cpu/cpuX/topology/thread_siblings:
represent the thread siblings to cpu X in the same core;
4) /sys/devices/system/cpu/cpuX/topology/core_siblings:
represent the thread siblings to cpu X in the same physical package;
To implement it in an architecture-neutral way, a new source file,
driver/base/topology.c, is to export the 5 attributes.
If one architecture wants to support this feature, it just needs to
implement 4 defines, typically in file include/asm-XXX/topology.h.
The 4 defines are:
#define topology_physical_package_id(cpu)
#define topology_core_id(cpu)
#define topology_thread_siblings(cpu)
#define topology_core_siblings(cpu)
The type of **_id is int.
The type of siblings is cpumask_t.
To be consistent on all architectures, the 4 attributes should have
deafult values if their values are unavailable. Below is the rule.
1) physical_package_id: If cpu has no physical package id, -1 is the
default value.
2) core_id: If cpu doesn't support multi-core, its core id is 0.
3) thread_siblings: Just include itself, if the cpu doesn't support
HT/multi-thread.
4) core_siblings: Just include itself, if the cpu doesn't support
multi-core and HT/Multi-thread.
So be careful when declaring the 4 defines in include/asm-XXX/topology.h.
If an attribute isn't defined on an architecture, it won't be exported.

View File

@ -1,50 +1,43 @@
The Linux Kernel Device Model The Linux Kernel Device Model
Patrick Mochel <mochel@osdl.org> Patrick Mochel <mochel@digitalimplant.org>
26 August 2002 Drafted 26 August 2002
Updated 31 January 2006
Overview Overview
~~~~~~~~ ~~~~~~~~
This driver model is a unification of all the current, disparate driver models The Linux Kernel Driver Model is a unification of all the disparate driver
that are currently in the kernel. It is intended to augment the models that were previously used in the kernel. It is intended to augment the
bus-specific drivers for bridges and devices by consolidating a set of data bus-specific drivers for bridges and devices by consolidating a set of data
and operations into globally accessible data structures. and operations into globally accessible data structures.
Current driver models implement some sort of tree-like structure (sometimes Traditional driver models implemented some sort of tree-like structure
just a list) for the devices they control. But, there is no linkage between (sometimes just a list) for the devices they control. There wasn't any
the different bus types. uniformity across the different bus types.
A common data structure can provide this linkage with little overhead: when a The current driver model provides a comon, uniform data model for describing
bus driver discovers a particular device, it can insert it into the global a bus and the devices that can appear under the bus. The unified bus
tree as well as its local tree. In fact, the local tree becomes just a subset model includes a set of common attributes which all busses carry, and a set
of the global tree. of common callbacks, such as device discovery during bus probing, bus
shutdown, bus power management, etc.
Common data fields can also be moved out of the local bus models into the
global model. Some of the manipulations of these fields can also be
consolidated. Most likely, manipulation functions will become a set
of helper functions, which the bus drivers wrap around to include any
bus-specific items.
The common device and bridge interface currently reflects the goals of the
modern PC: namely the ability to do seamless Plug and Play, power management,
and hot plug. (The model dictated by Intel and Microsoft (read: ACPI) ensures
us that any device in the system may fit any of these criteria.)
In reality, not every bus will be able to support such operations. But, most
buses will support a majority of those operations, and all future buses will.
In other words, a bus that doesn't support an operation is the exception,
instead of the other way around.
The common device and bridge interface reflects the goals of the modern
computer: namely the ability to do seamless device "plug and play", power
management, and hot plug. In particular, the model dictated by Intel and
Microsoft (namely ACPI) ensures that almost every device on almost any bus
on an x86-compatible system can work within this paradigm. Of course,
not every bus is able to support all such operations, although most
buses support a most of those operations.
Downstream Access Downstream Access
~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~
Common data fields have been moved out of individual bus layers into a common Common data fields have been moved out of individual bus layers into a common
data structure. But, these fields must still be accessed by the bus layers, data structure. These fields must still be accessed by the bus layers,
and sometimes by the device-specific drivers. and sometimes by the device-specific drivers.
Other bus layers are encouraged to do what has been done for the PCI layer. Other bus layers are encouraged to do what has been done for the PCI layer.
@ -53,7 +46,7 @@ struct pci_dev now looks like this:
struct pci_dev { struct pci_dev {
... ...
struct device device; struct device dev;
}; };
Note first that it is statically allocated. This means only one allocation on Note first that it is statically allocated. This means only one allocation on
@ -64,9 +57,9 @@ the two.
The PCI bus layer freely accesses the fields of struct device. It knows about The PCI bus layer freely accesses the fields of struct device. It knows about
the structure of struct pci_dev, and it should know the structure of struct the structure of struct pci_dev, and it should know the structure of struct
device. PCI devices that have been converted generally do not touch the fields device. Individual PCI device drivers that have been converted the the current
of struct device. More precisely, device-specific drivers should not touch driver model generally do not and should not touch the fields of struct device,
fields of struct device unless there is a strong compelling reason to do so. unless there is a strong compelling reason to do so.
This abstraction is prevention of unnecessary pain during transitional phases. This abstraction is prevention of unnecessary pain during transitional phases.
If the name of the field changes or is removed, then every downstream driver If the name of the field changes or is removed, then every downstream driver

View File

@ -111,4 +111,8 @@ source: linux/Documentation/video4linux/CARDLIST.bttv
If you have problems with this please do ask on the mailing list. If you have problems with this please do ask on the mailing list.
-- --
Authors: Richard Walker, Jamie Honan, Michael Hunold, Manu Abraham Authors: Richard Walker,
Jamie Honan,
Michael Hunold,
Manu Abraham,
Michael Krufky

View File

@ -148,3 +148,44 @@ Why: The 8250 serial driver now has the ability to deal with the differences
brother on Alchemy SOCs. The loss of features is not considered an brother on Alchemy SOCs. The loss of features is not considered an
issue. issue.
Who: Ralf Baechle <ralf@linux-mips.org> Who: Ralf Baechle <ralf@linux-mips.org>
---------------------------
What: Legacy /proc/pci interface (PCI_LEGACY_PROC)
When: March 2006
Why: deprecated since 2.5.53 in favor of lspci(8)
Who: Adrian Bunk <bunk@stusta.de>
---------------------------
What: pci_module_init(driver)
When: January 2007
Why: Is replaced by pci_register_driver(pci_driver).
Who: Richard Knutsson <ricknu-0@student.ltu.se> and Greg Kroah-Hartman <gregkh@suse.de>
---------------------------
What: I2C interface of the it87 driver
When: January 2007
Why: The ISA interface is faster and should be always available. The I2C
probing is also known to cause trouble in at least one case (see
bug #5889.)
Who: Jean Delvare <khali@linux-fr.org>
---------------------------
What: mount/umount uevents
When: February 2007
Why: These events are not correct, and do not properly let userspace know
when a file system has been mounted or unmounted. Userspace should
poll the /proc/mounts file instead to detect this properly.
Who: Greg Kroah-Hartman <gregkh@suse.de>
---------------------------
What: Support for NEC DDB5074 and DDB5476 evaluation boards.
When: June 2006
Why: Board specific code doesn't build anymore since ~2.6.0 and no
users have complained indicating there is no more need for these
boards. This should really be considered a last call.
Who: Ralf Baechle <ralf@linux-mips.org>

View File

@ -320,6 +320,7 @@ static struct config_item_type simple_children_type = {
.ct_item_ops = &simple_children_item_ops, .ct_item_ops = &simple_children_item_ops,
.ct_group_ops = &simple_children_group_ops, .ct_group_ops = &simple_children_group_ops,
.ct_attrs = simple_children_attrs, .ct_attrs = simple_children_attrs,
.ct_owner = THIS_MODULE,
}; };
static struct configfs_subsystem simple_children_subsys = { static struct configfs_subsystem simple_children_subsys = {
@ -403,6 +404,7 @@ static struct config_item_type group_children_type = {
.ct_item_ops = &group_children_item_ops, .ct_item_ops = &group_children_item_ops,
.ct_group_ops = &group_children_group_ops, .ct_group_ops = &group_children_group_ops,
.ct_attrs = group_children_attrs, .ct_attrs = group_children_attrs,
.ct_owner = THIS_MODULE,
}; };
static struct configfs_subsystem group_children_subsys = { static struct configfs_subsystem group_children_subsys = {

View File

@ -457,6 +457,12 @@ ChangeLog
Note, a technical ChangeLog aimed at kernel hackers is in fs/ntfs/ChangeLog. Note, a technical ChangeLog aimed at kernel hackers is in fs/ntfs/ChangeLog.
2.1.26:
- Implement support for sector sizes above 512 bytes (up to the maximum
supported by NTFS which is 4096 bytes).
- Enhance support for NTFS volumes which were supported by Windows but
not by Linux due to invalid attribute list attribute flags.
- A few minor updates and bug fixes.
2.1.25: 2.1.25:
- Write support is now extended with write(2) being able to both - Write support is now extended with write(2) being able to both
overwrite existing file data and to extend files. Also, if a write overwrite existing file data and to extend files. Also, if a write

View File

@ -35,6 +35,7 @@ Features which OCFS2 does not support yet:
be cluster coherent. be cluster coherent.
- quotas - quotas
- cluster aware flock - cluster aware flock
- cluster aware lockf
- Directory change notification (F_NOTIFY) - Directory change notification (F_NOTIFY)
- Distributed Caching (F_SETLEASE/F_GETLEASE/break_lease) - Distributed Caching (F_SETLEASE/F_GETLEASE/break_lease)
- POSIX ACLs - POSIX ACLs

View File

@ -79,15 +79,27 @@ that instance in a system with many cpus making intensive use of it.
tmpfs has a mount option to set the NUMA memory allocation policy for tmpfs has a mount option to set the NUMA memory allocation policy for
all files in that instance: all files in that instance (if CONFIG_NUMA is enabled) - which can be
mpol=interleave prefers to allocate memory from each node in turn adjusted on the fly via 'mount -o remount ...'
mpol=default prefers to allocate memory from the local node
mpol=bind prefers to allocate from mpol_nodelist
mpol=preferred prefers to allocate from first node in mpol_nodelist
The following mount option is used in conjunction with mpol=interleave, mpol=default prefers to allocate memory from the local node
mpol=bind or mpol=preferred: mpol=prefer:Node prefers to allocate memory from the given Node
mpol_nodelist: nodelist suitable for parsing with nodelist_parse. mpol=bind:NodeList allocates memory only from nodes in NodeList
mpol=interleave prefers to allocate from each node in turn
mpol=interleave:NodeList allocates from each node of NodeList in turn
NodeList format is a comma-separated list of decimal numbers and ranges,
a range being two hyphen-separated decimal numbers, the smallest and
largest node numbers in the range. For example, mpol=bind:0-3,5,7,9-15
Note that trying to mount a tmpfs with an mpol option will fail if the
running kernel does not support NUMA; and will fail if its nodelist
specifies a node >= MAX_NUMNODES. If your system relies on that tmpfs
being mounted, but from time to time runs a kernel built without NUMA
capability (perhaps a safe recovery kernel), or configured to support
fewer nodes, then it is advisable to omit the mpol option from automatic
mount options. It can be added later, when the tmpfs is already mounted
on MountPoint, by 'mount -o remount,mpol=Policy:NodeList MountPoint'.
To specify the initial root directory you can use the following mount To specify the initial root directory you can use the following mount
@ -109,4 +121,4 @@ RAM/SWAP in 10240 inodes and it is only accessible by root.
Author: Author:
Christoph Rohland <cr@sap.com>, 1.12.01 Christoph Rohland <cr@sap.com>, 1.12.01
Updated: Updated:
Hugh Dickins <hugh@veritas.com>, 13 March 2005 Hugh Dickins <hugh@veritas.com>, 19 February 2006

View File

@ -57,8 +57,6 @@ OPTIONS
port=n port to connect to on the remote server port=n port to connect to on the remote server
timeout=n request timeouts (in ms) (default 60000ms)
noextend force legacy mode (no 9P2000.u semantics) noextend force legacy mode (no 9P2000.u semantics)
uid attempt to mount as a particular uid uid attempt to mount as a particular uid
@ -74,10 +72,16 @@ OPTIONS
RESOURCES RESOURCES
========= =========
The Linux version of the 9P server, along with some client-side utilities The Linux version of the 9P server is now maintained under the npfs project
can be found at http://v9fs.sf.net (along with a CVS repository of the on sourceforge (http://sourceforge.net/projects/npfs).
development branch of this module). There are user and developer mailing
lists here, as well as a bug-tracker. There are user and developer mailing lists available through the v9fs project
on sourceforge (http://sourceforge.net/projects/v9fs).
News and other information is maintained on SWiK (http://swik.net/v9fs).
Bug reports may be issued through the kernel.org bugzilla
(http://bugzilla.kernel.org)
For more information on the Plan 9 Operating System check out For more information on the Plan 9 Operating System check out
http://plan9.bell-labs.com/plan9 http://plan9.bell-labs.com/plan9

View File

@ -0,0 +1,234 @@
=================================
INTERNAL KERNEL ABI FOR FR-V ARCH
=================================
The internal FRV kernel ABI is not quite the same as the userspace ABI. A number of the registers
are used for special purposed, and the ABI is not consistent between modules vs core, and MMU vs
no-MMU.
This partly stems from the fact that FRV CPUs do not have a separate supervisor stack pointer, and
most of them do not have any scratch registers, thus requiring at least one general purpose
register to be clobbered in such an event. Also, within the kernel core, it is possible to simply
jump or call directly between functions using a relative offset. This cannot be extended to modules
for the displacement is likely to be too far. Thus in modules the address of a function to call
must be calculated in a register and then used, requiring two extra instructions.
This document has the following sections:
(*) System call register ABI
(*) CPU operating modes
(*) Internal kernel-mode register ABI
(*) Internal debug-mode register ABI
(*) Virtual interrupt handling
========================
SYSTEM CALL REGISTER ABI
========================
When a system call is made, the following registers are effective:
REGISTERS CALL RETURN
=============== ======================= =======================
GR7 System call number Preserved
GR8 Syscall arg #1 Return value
GR9-GR13 Syscall arg #2-6 Preserved
===================
CPU OPERATING MODES
===================
The FR-V CPU has three basic operating modes. In order of increasing capability:
(1) User mode.
Basic userspace running mode.
(2) Kernel mode.
Normal kernel mode. There are many additional control registers available that may be
accessed in this mode, in addition to all the stuff available to user mode. This has two
submodes:
(a) Exceptions enabled (PSR.T == 1).
Exceptions will invoke the appropriate normal kernel mode handler. On entry to the
handler, the PSR.T bit will be cleared.
(b) Exceptions disabled (PSR.T == 0).
No exceptions or interrupts may happen. Any mandatory exceptions will cause the CPU to
halt unless the CPU is told to jump into debug mode instead.
(3) Debug mode.
No exceptions may happen in this mode. Memory protection and management exceptions will be
flagged for later consideration, but the exception handler won't be invoked. Debugging traps
such as hardware breakpoints and watchpoints will be ignored. This mode is entered only by
debugging events obtained from the other two modes.
All kernel mode registers may be accessed, plus a few extra debugging specific registers.
=================================
INTERNAL KERNEL-MODE REGISTER ABI
=================================
There are a number of permanent register assignments that are set up by entry.S in the exception
prologue. Note that there is a complete set of exception prologues for each of user->kernel
transition and kernel->kernel transition. There are also user->debug and kernel->debug mode
transition prologues.
REGISTER FLAVOUR USE
=============== ======= ====================================================
GR1 Supervisor stack pointer
GR15 Current thread info pointer
GR16 GP-Rel base register for small data
GR28 Current exception frame pointer (__frame)
GR29 Current task pointer (current)
GR30 Destroyed by kernel mode entry
GR31 NOMMU Destroyed by debug mode entry
GR31 MMU Destroyed by TLB miss kernel mode entry
CCR.ICC2 Virtual interrupt disablement tracking
CCCR.CC3 Cleared by exception prologue (atomic op emulation)
SCR0 MMU See mmu-layout.txt.
SCR1 MMU See mmu-layout.txt.
SCR2 MMU Save for EAR0 (destroyed by icache insns in debug mode)
SCR3 MMU Save for GR31 during debug exceptions
DAMR/IAMR NOMMU Fixed memory protection layout.
DAMR/IAMR MMU See mmu-layout.txt.
Certain registers are also used or modified across function calls:
REGISTER CALL RETURN
=============== =============================== ===============================
GR0 Fixed Zero -
GR2 Function call frame pointer
GR3 Special Preserved
GR3-GR7 - Clobbered
GR8 Function call arg #1 Return value (or clobbered)
GR9 Function call arg #2 Return value MSW (or clobbered)
GR10-GR13 Function call arg #3-#6 Clobbered
GR14 - Clobbered
GR15-GR16 Special Preserved
GR17-GR27 - Preserved
GR28-GR31 Special Only accessed explicitly
LR Return address after CALL Clobbered
CCR/CCCR - Mostly Clobbered
================================
INTERNAL DEBUG-MODE REGISTER ABI
================================
This is the same as the kernel-mode register ABI for functions calls. The difference is that in
debug-mode there's a different stack and a different exception frame. Almost all the global
registers from kernel-mode (including the stack pointer) may be changed.
REGISTER FLAVOUR USE
=============== ======= ====================================================
GR1 Debug stack pointer
GR16 GP-Rel base register for small data
GR31 Current debug exception frame pointer (__debug_frame)
SCR3 MMU Saved value of GR31
Note that debug mode is able to interfere with the kernel's emulated atomic ops, so it must be
exceedingly careful not to do any that would interact with the main kernel in this regard. Hence
the debug mode code (gdbstub) is almost completely self-contained. The only external code used is
the sprintf family of functions.
Futhermore, break.S is so complicated because single-step mode does not switch off on entry to an
exception. That means unless manually disabled, single-stepping will blithely go on stepping into
things like interrupts. See gdbstub.txt for more information.
==========================
VIRTUAL INTERRUPT HANDLING
==========================
Because accesses to the PSR is so slow, and to disable interrupts we have to access it twice (once
to read and once to write), we don't actually disable interrupts at all if we don't have to. What
we do instead is use the ICC2 condition code flags to note virtual disablement, such that if we
then do take an interrupt, we note the flag, really disable interrupts, set another flag and resume
execution at the point the interrupt happened. Setting condition flags as a side effect of an
arithmetic or logical instruction is really fast. This use of the ICC2 only occurs within the
kernel - it does not affect userspace.
The flags we use are:
(*) CCR.ICC2.Z [Zero flag]
Set to virtually disable interrupts, clear when interrupts are virtually enabled. Can be
modified by logical instructions without affecting the Carry flag.
(*) CCR.ICC2.C [Carry flag]
Clear to indicate hardware interrupts are really disabled, set otherwise.
What happens is this:
(1) Normal kernel-mode operation.
ICC2.Z is 0, ICC2.C is 1.
(2) An interrupt occurs. The exception prologue examines ICC2.Z and determines that nothing needs
doing. This is done simply with an unlikely BEQ instruction.
(3) The interrupts are disabled (local_irq_disable)
ICC2.Z is set to 1.
(4) If interrupts were then re-enabled (local_irq_enable):
ICC2.Z would be set to 0.
A TIHI #2 instruction (trap #2 if condition HI - Z==0 && C==0) would be used to trap if
interrupts were now virtually enabled, but physically disabled - which they're not, so the
trap isn't taken. The kernel would then be back to state (1).
(5) An interrupt occurs. The exception prologue examines ICC2.Z and determines that the interrupt
shouldn't actually have happened. It jumps aside, and there disabled interrupts by setting
PSR.PIL to 14 and then it clears ICC2.C.
(6) If interrupts were then saved and disabled again (local_irq_save):
ICC2.Z would be shifted into the save variable and masked off (giving a 1).
ICC2.Z would then be set to 1 (thus unchanged), and ICC2.C would be unaffected (ie: 0).
(7) If interrupts were then restored from state (6) (local_irq_restore):
ICC2.Z would be set to indicate the result of XOR'ing the saved value (ie: 1) with 1, which
gives a result of 0 - thus leaving ICC2.Z set.
ICC2.C would remain unaffected (ie: 0).
A TIHI #2 instruction would be used to again assay the current state, but this would do
nothing as Z==1.
(8) If interrupts were then enabled (local_irq_enable):
ICC2.Z would be cleared. ICC2.C would be left unaffected. Both flags would now be 0.
A TIHI #2 instruction again issued to assay the current state would then trap as both Z==0
[interrupts virtually enabled] and C==0 [interrupts really disabled] would then be true.
(9) The trap #2 handler would simply enable hardware interrupts (set PSR.PIL to 0), set ICC2.C to
1 and return.
(10) Immediately upon returning, the pending interrupt would be taken.
(11) The interrupt handler would take the path of actually processing the interrupt (ICC2.Z is
clear, BEQ fails as per step (2)).
(12) The interrupt handler would then set ICC2.C to 1 since hardware interrupts are definitely
enabled - or else the kernel wouldn't be here.
(13) On return from the interrupt handler, things would be back to state (1).
This trap (#2) is only available in kernel mode. In user mode it will result in SIGILL.

105
Documentation/hwmon/f71805f Normal file
View File

@ -0,0 +1,105 @@
Kernel driver f71805f
=====================
Supported chips:
* Fintek F71805F/FG
Prefix: 'f71805f'
Addresses scanned: none, address read from Super I/O config space
Datasheet: Provided by Fintek on request
Author: Jean Delvare <khali@linux-fr.org>
Thanks to Denis Kieft from Barracuda Networks for the donation of a
test system (custom Jetway K8M8MS motherboard, with CPU and RAM) and
for providing initial documentation.
Thanks to Kris Chen from Fintek for answering technical questions and
providing additional documentation.
Thanks to Chris Lin from Jetway for providing wiring schematics and
anwsering technical questions.
Description
-----------
The Fintek F71805F/FG Super I/O chip includes complete hardware monitoring
capabilities. It can monitor up to 9 voltages (counting its own power
source), 3 fans and 3 temperature sensors.
This chip also has fan controlling features, using either DC or PWM, in
three different modes (one manual, two automatic). The driver doesn't
support these features yet.
The driver assumes that no more than one chip is present, which seems
reasonable.
Voltage Monitoring
------------------
Voltages are sampled by an 8-bit ADC with a LSB of 8 mV. The supported
range is thus from 0 to 2.040 V. Voltage values outside of this range
need external resistors. An exception is in0, which is used to monitor
the chip's own power source (+3.3V), and is divided internally by a
factor 2.
The two LSB of the voltage limit registers are not used (always 0), so
you can only set the limits in steps of 32 mV (before scaling).
The wirings and resistor values suggested by Fintek are as follow:
pin expected
name use R1 R2 divider raw val.
in0 VCC VCC3.3V int. int. 2.00 1.65 V
in1 VIN1 VTT1.2V 10K - 1.00 1.20 V
in2 VIN2 VRAM 100K 100K 2.00 ~1.25 V (1)
in3 VIN3 VCHIPSET 47K 100K 1.47 2.24 V (2)
in4 VIN4 VCC5V 200K 47K 5.25 0.95 V
in5 VIN5 +12V 200K 20K 11.00 1.05 V
in6 VIN6 VCC1.5V 10K - 1.00 1.50 V
in7 VIN7 VCORE 10K - 1.00 ~1.40 V (1)
in8 VIN8 VSB5V 200K 47K 1.00 0.95 V
(1) Depends on your hardware setup.
(2) Obviously not correct, swapping R1 and R2 would make more sense.
These values can be used as hints at best, as motherboard manufacturers
are free to use a completely different setup. As a matter of fact, the
Jetway K8M8MS uses a significantly different setup. You will have to
find out documentation about your own motherboard, and edit sensors.conf
accordingly.
Each voltage measured has associated low and high limits, each of which
triggers an alarm when crossed.
Fan Monitoring
--------------
Fan rotation speeds are reported as 12-bit values from a gated clock
signal. Speeds down to 366 RPM can be measured. There is no theoretical
high limit, but values over 6000 RPM seem to cause problem. The effective
resolution is much lower than you would expect, the step between different
register values being 10 rather than 1.
The chip assumes 2 pulse-per-revolution fans.
An alarm is triggered if the rotation speed drops below a programmable
limit or is too low to be measured.
Temperature Monitoring
----------------------
Temperatures are reported in degrees Celsius. Each temperature measured
has a high limit, those crossing triggers an alarm. There is an associated
hysteresis value, below which the temperature has to drop before the
alarm is cleared.
All temperature channels are external, there is no embedded temperature
sensor. Each channel can be used for connecting either a thermal diode
or a thermistor. The driver reports the currently selected mode, but
doesn't allow changing it. In theory, the BIOS should have configured
everything properly.

View File

@ -9,7 +9,7 @@ Supported chips:
http://www.ite.com.tw/ http://www.ite.com.tw/
* IT8712F * IT8712F
Prefix: 'it8712' Prefix: 'it8712'
Addresses scanned: I2C 0x28 - 0x2f Addresses scanned: I2C 0x2d
from Super I/O config space (8 I/O ports) from Super I/O config space (8 I/O ports)
Datasheet: Publicly available at the ITE website Datasheet: Publicly available at the ITE website
http://www.ite.com.tw/ http://www.ite.com.tw/

View File

@ -179,11 +179,12 @@ temp[1-*]_auto_point[1-*]_temp_hyst
**************** ****************
temp[1-3]_type Sensor type selection. temp[1-3]_type Sensor type selection.
Integers 1, 2, 3 or thermistor Beta value (3435) Integers 1 to 4 or thermistor Beta value (typically 3435)
Read/Write. Read/Write.
1: PII/Celeron Diode 1: PII/Celeron Diode
2: 3904 transistor 2: 3904 transistor
3: thermal diode 3: thermal diode
4: thermistor (default/unknown Beta)
Not all types are supported by all chips Not all types are supported by all chips
temp[1-4]_max Temperature max value. temp[1-4]_max Temperature max value.
@ -261,6 +262,21 @@ alarms Alarm bitmask.
of individual bits. of individual bits.
Bits are defined in kernel/include/sensors.h. Bits are defined in kernel/include/sensors.h.
alarms_in Alarm bitmask relative to in (voltage) channels
Read only
A '1' bit means an alarm, LSB corresponds to in0 and so on
Prefered to 'alarms' for newer chips
alarms_fan Alarm bitmask relative to fan channels
Read only
A '1' bit means an alarm, LSB corresponds to fan1 and so on
Prefered to 'alarms' for newer chips
alarms_temp Alarm bitmask relative to temp (temperature) channels
Read only
A '1' bit means an alarm, LSB corresponds to temp1 and so on
Prefered to 'alarms' for newer chips
beep_enable Beep/interrupt enable beep_enable Beep/interrupt enable
0 to disable. 0 to disable.
1 to enable. 1 to enable.

View File

@ -36,6 +36,10 @@ Module Parameters
(default is 1) (default is 1)
Use 'init=0' to bypass initializing the chip. Use 'init=0' to bypass initializing the chip.
Try this if your computer crashes when you load the module. Try this if your computer crashes when you load the module.
* reset: int
(default is 0)
The driver used to reset the chip on load, but does no more. Use
'reset=1' to restore the old behavior. Report if you need to do this.
Description Description
----------- -----------

View File

@ -7,7 +7,7 @@ Supported adapters:
Any combination of these host bridges: Any combination of these host bridges:
645, 645DX (aka 646), 648, 650, 651, 655, 735, 745, 746 645, 645DX (aka 646), 648, 650, 651, 655, 735, 745, 746
and these south bridges: and these south bridges:
961, 962, 963(L) 961, 962, 963(L)
Author: Mark M. Hoffman <mhoffman@lightlink.com> Author: Mark M. Hoffman <mhoffman@lightlink.com>
@ -29,7 +29,7 @@ The command "lspci" as root should produce something like these lines:
or perhaps this... or perhaps this...
00:00.0 Host bridge: Silicon Integrated Systems [SiS]: Unknown device 0645 00:00.0 Host bridge: Silicon Integrated Systems [SiS]: Unknown device 0645
00:02.0 ISA bridge: Silicon Integrated Systems [SiS]: Unknown device 0961 00:02.0 ISA bridge: Silicon Integrated Systems [SiS]: Unknown device 0961
00:02.1 SMBus: Silicon Integrated Systems [SiS]: Unknown device 0016 00:02.1 SMBus: Silicon Integrated Systems [SiS]: Unknown device 0016

View File

@ -45,10 +45,10 @@ How to extract the documentation
If you just want to read the ready-made books on the various If you just want to read the ready-made books on the various
subsystems (see Documentation/DocBook/*.tmpl), just type 'make subsystems (see Documentation/DocBook/*.tmpl), just type 'make
psdocs', or 'make pdfdocs', or 'make htmldocs', depending on your psdocs', or 'make pdfdocs', or 'make htmldocs', depending on your
preference. If you would rather read a different format, you can type preference. If you would rather read a different format, you can type
'make sgmldocs' and then use DocBook tools to convert 'make sgmldocs' and then use DocBook tools to convert
Documentation/DocBook/*.sgml to a format of your choice (for example, Documentation/DocBook/*.sgml to a format of your choice (for example,
'db2html ...' if 'make htmldocs' was not defined). 'db2html ...' if 'make htmldocs' was not defined).
If you want to see man pages instead, you can do this: If you want to see man pages instead, you can do this:
@ -124,6 +124,36 @@ patterns, which are highlighted appropriately.
Take a look around the source tree for examples. Take a look around the source tree for examples.
kernel-doc for structs, unions, enums, and typedefs
---------------------------------------------------
Beside functions you can also write documentation for structs, unions,
enums and typedefs. Instead of the function name you must write the name
of the declaration; the struct/union/enum/typedef must always precede
the name. Nesting of declarations is not supported.
Use the argument mechanism to document members or constants.
Inside a struct description, you can use the "private:" and "public:"
comment tags. Structure fields that are inside a "private:" area
are not listed in the generated output documentation.
Example:
/**
* struct my_struct - short description
* @a: first member
* @b: second member
*
* Longer description
*/
struct my_struct {
int a;
int b;
/* private: */
int c;
};
How to make new SGML template files How to make new SGML template files
----------------------------------- -----------------------------------
@ -147,4 +177,3 @@ documentation, in <filename>, for the functions listed.
Tim. Tim.
*/ <twaugh@redhat.com> */ <twaugh@redhat.com>

View File

@ -335,6 +335,12 @@ running once the system is up.
timesource is not avalible, it defaults to PIT. timesource is not avalible, it defaults to PIT.
Format: { pit | tsc | cyclone | pmtmr } Format: { pit | tsc | cyclone | pmtmr }
disable_8254_timer
enable_8254_timer
[IA32/X86_64] Disable/Enable interrupt 0 timer routing
over the 8254 in addition to over the IO-APIC. The
kernel tries to set a sensible default.
hpet= [IA-32,HPET] option to disable HPET and use PIT. hpet= [IA-32,HPET] option to disable HPET and use PIT.
Format: disable Format: disable
@ -452,6 +458,11 @@ running once the system is up.
eata= [HW,SCSI] eata= [HW,SCSI]
ec_intr= [HW,ACPI] ACPI Embedded Controller interrupt mode
Format: <int>
0: polling mode
non-0: interrupt mode (default)
eda= [HW,PS2] eda= [HW,PS2]
edb= [HW,PS2] edb= [HW,PS2]
@ -1029,6 +1040,8 @@ running once the system is up.
nomce [IA-32] Machine Check Exception nomce [IA-32] Machine Check Exception
nomca [IA-64] Disable machine check abort handling
noresidual [PPC] Don't use residual data on PReP machines. noresidual [PPC] Don't use residual data on PReP machines.
noresume [SWSUSP] Disables resume and restores original swap noresume [SWSUSP] Disables resume and restores original swap
@ -1128,6 +1141,8 @@ running once the system is up.
Mechanism 1. Mechanism 1.
conf2 [IA-32] Force use of PCI Configuration conf2 [IA-32] Force use of PCI Configuration
Mechanism 2. Mechanism 2.
nommconf [IA-32,X86_64] Disable use of MMCONFIG for PCI
Configuration
nosort [IA-32] Don't sort PCI devices according to nosort [IA-32] Don't sort PCI devices according to
order given by the PCI BIOS. This sorting is order given by the PCI BIOS. This sorting is
done to get a device order compatible with done to get a device order compatible with
@ -1275,6 +1290,19 @@ running once the system is up.
New name for the ramdisk parameter. New name for the ramdisk parameter.
See Documentation/ramdisk.txt. See Documentation/ramdisk.txt.
rcu.blimit= [KNL,BOOT] Set maximum number of finished
RCU callbacks to process in one batch.
rcu.qhimark= [KNL,BOOT] Set threshold of queued
RCU callbacks over which batch limiting is disabled.
rcu.qlowmark= [KNL,BOOT] Set threshold of queued
RCU callbacks below which batch limiting is re-enabled.
rcu.rsinterval= [KNL,BOOT,SMP] Set the number of additional
RCU callbacks to queued before forcing reschedule
on all cpus.
rdinit= [KNL] rdinit= [KNL]
Format: <full_path> Format: <full_path>
Run specified binary instead of /init from the ramdisk, Run specified binary instead of /init from the ramdisk,
@ -1631,6 +1659,9 @@ running once the system is up.
Format: Format:
<irq>,<irq_mask>,<io>,<full_duplex>,<do_sound>,<lockup_hack>[,<irq2>[,<irq3>[,<irq4>]]] <irq>,<irq_mask>,<io>,<full_duplex>,<do_sound>,<lockup_hack>[,<irq2>[,<irq3>[,<irq4>]]]
norandmaps Don't use address space randomization
Equivalent to echo 0 > /proc/sys/kernel/randomize_va_space
______________________________________________________________________ ______________________________________________________________________
Changelog: Changelog:

View File

@ -136,17 +136,20 @@ Kprobes, jprobes, and return probes are implemented on the following
architectures: architectures:
- i386 - i386
- x86_64 (AMD-64, E64MT) - x86_64 (AMD-64, EM64T)
- ppc64 - ppc64
- ia64 (Support for probes on certain instruction types is still in progress.) - ia64 (Does not support probes on instruction slot1.)
- sparc64 (Return probes not yet implemented.) - sparc64 (Return probes not yet implemented.)
3. Configuring Kprobes 3. Configuring Kprobes
When configuring the kernel using make menuconfig/xconfig/oldconfig, When configuring the kernel using make menuconfig/xconfig/oldconfig,
ensure that CONFIG_KPROBES is set to "y". Under "Kernel hacking", ensure that CONFIG_KPROBES is set to "y". Under "Instrumentation
look for "Kprobes". You may have to enable "Kernel debugging" Support", look for "Kprobes".
(CONFIG_DEBUG_KERNEL) before you can enable Kprobes.
So that you can load and unload Kprobes-based instrumentation modules,
make sure "Loadable module support" (CONFIG_MODULES) and "Module
unloading" (CONFIG_MODULE_UNLOAD) are set to "y".
You may also want to ensure that CONFIG_KALLSYMS and perhaps even You may also want to ensure that CONFIG_KALLSYMS and perhaps even
CONFIG_KALLSYMS_ALL are set to "y", since kallsyms_lookup_name() CONFIG_KALLSYMS_ALL are set to "y", since kallsyms_lookup_name()
@ -262,18 +265,18 @@ at any time after the probe has been registered.
5. Kprobes Features and Limitations 5. Kprobes Features and Limitations
As of Linux v2.6.12, Kprobes allows multiple probes at the same Kprobes allows multiple probes at the same address. Currently,
address. Currently, however, there cannot be multiple jprobes on however, there cannot be multiple jprobes on the same function at
the same function at the same time. the same time.
In general, you can install a probe anywhere in the kernel. In general, you can install a probe anywhere in the kernel.
In particular, you can probe interrupt handlers. Known exceptions In particular, you can probe interrupt handlers. Known exceptions
are discussed in this section. are discussed in this section.
For obvious reasons, it's a bad idea to install a probe in The register_*probe functions will return -EINVAL if you attempt
the code that implements Kprobes (mostly kernel/kprobes.c and to install a probe in the code that implements Kprobes (mostly
arch/*/kernel/kprobes.c). A patch in the v2.6.13 timeframe instructs kernel/kprobes.c and arch/*/kernel/kprobes.c, but also functions such
Kprobes to reject such requests. as do_page_fault and notifier_call_chain).
If you install a probe in an inline-able function, Kprobes makes If you install a probe in an inline-able function, Kprobes makes
no attempt to chase down all inline instances of the function and no attempt to chase down all inline instances of the function and
@ -290,18 +293,14 @@ from the accidental ones. Don't drink and probe.
Kprobes makes no attempt to prevent probe handlers from stepping on Kprobes makes no attempt to prevent probe handlers from stepping on
each other -- e.g., probing printk() and then calling printk() from a each other -- e.g., probing printk() and then calling printk() from a
probe handler. As of Linux v2.6.12, if a probe handler hits a probe, probe handler. If a probe handler hits a probe, that second probe's
that second probe's handlers won't be run in that instance. handlers won't be run in that instance, and the kprobe.nmissed member
of the second probe will be incremented.
In Linux v2.6.12 and previous versions, Kprobes' data structures are As of Linux v2.6.15-rc1, multiple handlers (or multiple instances of
protected by a single lock that is held during probe registration and the same handler) may run concurrently on different CPUs.
unregistration and while handlers are run. Thus, no two handlers
can run simultaneously. To improve scalability on SMP systems,
this restriction will probably be removed soon, in which case
multiple handlers (or multiple instances of the same handler) may
run concurrently on different CPUs. Code your handlers accordingly.
Kprobes does not use semaphores or allocate memory except during Kprobes does not use mutexes or allocate memory except during
registration and unregistration. registration and unregistration.
Probe handlers are run with preemption disabled. Depending on the Probe handlers are run with preemption disabled. Depending on the
@ -316,11 +315,18 @@ address instead of the real return address for kretprobed functions.
(As far as we can tell, __builtin_return_address() is used only (As far as we can tell, __builtin_return_address() is used only
for instrumentation and error reporting.) for instrumentation and error reporting.)
If the number of times a function is called does not match the If the number of times a function is called does not match the number
number of times it returns, registering a return probe on that of times it returns, registering a return probe on that function may
function may produce undesirable results. We have the do_exit() produce undesirable results. We have the do_exit() case covered.
and do_execve() cases covered. do_fork() is not an issue. We're do_execve() and do_fork() are not an issue. We're unaware of other
unaware of other specific cases where this could be a problem. specific cases where this could be a problem.
If, upon entry to or exit from a function, the CPU is running on
a stack other than that of the current task, registering a return
probe on that function may produce undesirable results. For this
reason, Kprobes doesn't support return probes (or kprobes or jprobes)
on the x86_64 version of __switch_to(); the registration functions
return -EINVAL.
6. Probe Overhead 6. Probe Overhead
@ -347,14 +353,12 @@ k = 0.77 usec; j = 1.31; r = 1.26; kr = 1.45; jr = 1.99
7. TODO 7. TODO
a. SystemTap (http://sourceware.org/systemtap): Work in progress a. SystemTap (http://sourceware.org/systemtap): Provides a simplified
to provide a simplified programming interface for probe-based programming interface for probe-based instrumentation. Try it out.
instrumentation. b. Kernel return probes for sparc64.
b. Improved SMP scalability: Currently, work is in progress to handle c. Support for other architectures.
multiple kprobes in parallel. d. User-space probes.
c. Kernel return probes for sparc64. e. Watchpoint probes (which fire on data references).
d. Support for other architectures.
e. User-space probes.
8. Kprobes Example 8. Kprobes Example
@ -411,8 +415,7 @@ int init_module(void)
printk("Couldn't find %s to plant kprobe\n", "do_fork"); printk("Couldn't find %s to plant kprobe\n", "do_fork");
return -1; return -1;
} }
ret = register_kprobe(&kp); if ((ret = register_kprobe(&kp) < 0)) {
if (ret < 0) {
printk("register_kprobe failed, returned %d\n", ret); printk("register_kprobe failed, returned %d\n", ret);
return -1; return -1;
} }

View File

@ -95,11 +95,13 @@ CONFIG_BLK_DEV_IDEDMA_PCI=y
CONFIG_IDEDMA_PCI_AUTO=y CONFIG_IDEDMA_PCI_AUTO=y
CONFIG_BLK_DEV_IDE_AU1XXX=y CONFIG_BLK_DEV_IDE_AU1XXX=y
CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA=y CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA=y
CONFIG_BLK_DEV_IDE_AU1XXX_BURSTABLE_ON=y
CONFIG_BLK_DEV_IDE_AU1XXX_SEQTS_PER_RQ=128 CONFIG_BLK_DEV_IDE_AU1XXX_SEQTS_PER_RQ=128
CONFIG_BLK_DEV_IDEDMA=y CONFIG_BLK_DEV_IDEDMA=y
CONFIG_IDEDMA_AUTO=y CONFIG_IDEDMA_AUTO=y
Also define 'IDE_AU1XXX_BURSTMODE' in 'drivers/ide/mips/au1xxx-ide.c' to enable
the burst support on DBDMA controller.
If the used system need the USB support enable the following kernel configs for If the used system need the USB support enable the following kernel configs for
high IDE to USB throughput. high IDE to USB throughput.
@ -115,6 +117,8 @@ CONFIG_BLK_DEV_IDE_AU1XXX_SEQTS_PER_RQ=128
CONFIG_BLK_DEV_IDEDMA=y CONFIG_BLK_DEV_IDEDMA=y
CONFIG_IDEDMA_AUTO=y CONFIG_IDEDMA_AUTO=y
Also undefine 'IDE_AU1XXX_BURSTMODE' in 'drivers/ide/mips/au1xxx-ide.c' to
disable the burst support on DBDMA controller.
ADD NEW HARD DISC TO WHITE OR BLACK LIST ADD NEW HARD DISC TO WHITE OR BLACK LIST
---------------------------------------- ----------------------------------------

View File

@ -427,6 +427,23 @@ icmp_ignore_bogus_error_responses - BOOLEAN
will avoid log file clutter. will avoid log file clutter.
Default: FALSE Default: FALSE
icmp_errors_use_inbound_ifaddr - BOOLEAN
If zero, icmp error messages are sent with the primary address of
the exiting interface.
If non-zero, the message will be sent with the primary address of
the interface that received the packet that caused the icmp error.
This is the behaviour network many administrators will expect from
a router. And it can make debugging complicated network layouts
much easier.
Note that if no primary address exists for the interface selected,
then the primary address of the first non-loopback interface that
has one will be used regarldess of this setting.
Default: 0
igmp_max_memberships - INTEGER igmp_max_memberships - INTEGER
Change the maximum number of multicast groups we can subscribe to. Change the maximum number of multicast groups we can subscribe to.
Default: 20 Default: 20

View File

@ -1068,7 +1068,7 @@ SYNOPSIS
struct parport_operations { struct parport_operations {
... ...
void (*write_status) (struct parport *port, unsigned char s); void (*write_control) (struct parport *port, unsigned char s);
... ...
}; };
@ -1097,9 +1097,9 @@ SYNOPSIS
struct parport_operations { struct parport_operations {
... ...
void (*frob_control) (struct parport *port, unsigned char (*frob_control) (struct parport *port,
unsigned char mask, unsigned char mask,
unsigned char val); unsigned char val);
... ...
}; };

View File

@ -1,246 +1,396 @@
PCI Error Recovery PCI Error Recovery
------------------ ------------------
May 31, 2005 February 2, 2006
Current document maintainer: Current document maintainer:
Linas Vepstas <linas@austin.ibm.com> Linas Vepstas <linas@austin.ibm.com>
Some PCI bus controllers are able to detect certain "hard" PCI errors Many PCI bus controllers are able to detect a variety of hardware
on the bus, such as parity errors on the data and address busses, as PCI errors on the bus, such as parity errors on the data and address
well as SERR and PERR errors. These chipsets are then able to disable busses, as well as SERR and PERR errors. Some of the more advanced
I/O to/from the affected device, so that, for example, a bad DMA chipsets are able to deal with these errors; these include PCI-E chipsets,
address doesn't end up corrupting system memory. These same chipsets and the PCI-host bridges found on IBM Power4 and Power5-based pSeries
are also able to reset the affected PCI device, and return it to boxes. A typical action taken is to disconnect the affected device,
working condition. This document describes a generic API form halting all I/O to it. The goal of a disconnection is to avoid system
performing error recovery. corruption; for example, to halt system memory corruption due to DMA's
to "wild" addresses. Typically, a reconnection mechanism is also
offered, so that the affected PCI device(s) are reset and put back
into working condition. The reset phase requires coordination
between the affected device drivers and the PCI controller chip.
This document describes a generic API for notifying device drivers
of a bus disconnection, and then performing error recovery.
This API is currently implemented in the 2.6.16 and later kernels.
The core idea is that after a PCI error has been detected, there must Reporting and recovery is performed in several steps. First, when
be a way for the kernel to coordinate with all affected device drivers a PCI hardware error has resulted in a bus disconnect, that event
so that the pci card can be made operational again, possibly after is reported as soon as possible to all affected device drivers,
performing a full electrical #RST of the PCI card. The API below including multiple instances of a device driver on multi-function
provides a generic API for device drivers to be notified of PCI cards. This allows device drivers to avoid deadlocking in spinloops,
errors, and to be notified of, and respond to, a reset sequence. waiting for some i/o-space register to change, when it never will.
It also gives the drivers a chance to defer incoming I/O as
needed.
Preliminary sketch of API, cut-n-pasted-n-modified email from Next, recovery is performed in several stages. Most of the complexity
Ben Herrenschmidt, circa 5 april 2005 is forced by the need to handle multi-function devices, that is,
devices that have multiple device drivers associated with them.
In the first stage, each driver is allowed to indicate what type
of reset it desires, the choices being a simple re-enabling of I/O
or requesting a hard reset (a full electrical #RST of the PCI card).
If any driver requests a full reset, that is what will be done.
After a full reset and/or a re-enabling of I/O, all drivers are
again notified, so that they may then perform any device setup/config
that may be required. After these have all completed, a final
"resume normal operations" event is sent out.
The biggest reason for choosing a kernel-based implementation rather
than a user-space implementation was the need to deal with bus
disconnects of PCI devices attached to storage media, and, in particular,
disconnects from devices holding the root file system. If the root
file system is disconnected, a user-space mechanism would have to go
through a large number of contortions to complete recovery. Almost all
of the current Linux file systems are not tolerant of disconnection
from/reconnection to their underlying block device. By contrast,
bus errors are easy to manage in the device driver. Indeed, most
device drivers already handle very similar recovery procedures;
for example, the SCSI-generic layer already provides significant
mechanisms for dealing with SCSI bus errors and SCSI bus resets.
Detailed Design
---------------
Design and implementation details below, based on a chain of
public email discussions with Ben Herrenschmidt, circa 5 April 2005.
The error recovery API support is exposed to the driver in the form of The error recovery API support is exposed to the driver in the form of
a structure of function pointers pointed to by a new field in struct a structure of function pointers pointed to by a new field in struct
pci_driver. The absence of this pointer in pci_driver denotes an pci_driver. A driver that fails to provide the structure is "non-aware",
"non-aware" driver, behaviour on these is platform dependant. and the actual recovery steps taken are platform dependent. The
Platforms like ppc64 can try to simulate pci hotplug remove/add. arch/powerpc implementation will simulate a PCI hotplug remove/add.
The definition of "pci_error_token" is not covered here. It is based on
Seto's work on the synchronous error detection. We still need to define
functions for extracting infos out of an opaque error token. This is
separate from this API.
This structure has the form: This structure has the form:
struct pci_error_handlers struct pci_error_handlers
{ {
int (*error_detected)(struct pci_dev *dev, pci_error_token error); int (*error_detected)(struct pci_dev *dev, enum pci_channel_state);
int (*mmio_enabled)(struct pci_dev *dev); int (*mmio_enabled)(struct pci_dev *dev);
int (*resume)(struct pci_dev *dev);
int (*link_reset)(struct pci_dev *dev); int (*link_reset)(struct pci_dev *dev);
int (*slot_reset)(struct pci_dev *dev); int (*slot_reset)(struct pci_dev *dev);
void (*resume)(struct pci_dev *dev);
}; };
A driver doesn't have to implement all of these callbacks. The The possible channel states are:
only mandatory one is error_detected(). If a callback is not enum pci_channel_state {
implemented, the corresponding feature is considered unsupported. pci_channel_io_normal, /* I/O channel is in normal state */
For example, if mmio_enabled() and resume() aren't there, then the pci_channel_io_frozen, /* I/O to channel is blocked */
driver is assumed as not doing any direct recovery and requires pci_channel_io_perm_failure, /* PCI card is dead */
};
Possible return values are:
enum pci_ers_result {
PCI_ERS_RESULT_NONE, /* no result/none/not supported in device driver */
PCI_ERS_RESULT_CAN_RECOVER, /* Device driver can recover without slot reset */
PCI_ERS_RESULT_NEED_RESET, /* Device driver wants slot to be reset. */
PCI_ERS_RESULT_DISCONNECT, /* Device has completely failed, is unrecoverable */
PCI_ERS_RESULT_RECOVERED, /* Device driver is fully recovered and operational */
};
A driver does not have to implement all of these callbacks; however,
if it implements any, it must implement error_detected(). If a callback
is not implemented, the corresponding feature is considered unsupported.
For example, if mmio_enabled() and resume() aren't there, then it
is assumed that the driver is not doing any direct recovery and requires
a reset. If link_reset() is not implemented, the card is assumed as a reset. If link_reset() is not implemented, the card is assumed as
not caring about link resets, in which case, if recover is supported, not care about link resets. Typically a driver will want to know about
the core can try recover (but not slot_reset() unless it really did a slot_reset().
reset the slot). If slot_reset() is not supported, link_reset() can
be called instead on a slot reset.
At first, the call will always be : The actual steps taken by a platform to recover from a PCI error
event will be platform-dependent, but will follow the general
sequence described below.
1) error_detected() STEP 0: Error Event
-------------------
PCI bus error is detect by the PCI hardware. On powerpc, the slot
is isolated, in that all I/O is blocked: all reads return 0xffffffff,
all writes are ignored.
Error detected. This is sent once after an error has been detected. At
this point, the device might not be accessible anymore depending on the STEP 1: Notification
platform (the slot will be isolated on ppc64). The driver may already --------------------
have "noticed" the error because of a failing IO, but this is the proper Platform calls the error_detected() callback on every instance of
"synchronisation point", that is, it gives a chance to the driver to every driver affected by the error.
cleanup, waiting for pending stuff (timers, whatever, etc...) to
complete; it can take semaphores, schedule, etc... everything but touch At this point, the device might not be accessible anymore, depending on
the device. Within this function and after it returns, the driver the platform (the slot will be isolated on powerpc). The driver may
already have "noticed" the error because of a failing I/O, but this
is the proper "synchronization point", that is, it gives the driver
a chance to cleanup, waiting for pending stuff (timers, whatever, etc...)
to complete; it can take semaphores, schedule, etc... everything but
touch the device. Within this function and after it returns, the driver
shouldn't do any new IOs. Called in task context. This is sort of a shouldn't do any new IOs. Called in task context. This is sort of a
"quiesce" point. See note about interrupts at the end of this doc. "quiesce" point. See note about interrupts at the end of this doc.
Result codes: All drivers participating in this system must implement this call.
- PCIERR_RESULT_CAN_RECOVER: The driver must return one of the following result codes:
Driever returns this if it thinks it might be able to recover - PCI_ERS_RESULT_CAN_RECOVER:
Driver returns this if it thinks it might be able to recover
the HW by just banging IOs or if it wants to be given the HW by just banging IOs or if it wants to be given
a chance to extract some diagnostic informations (see a chance to extract some diagnostic information (see
below). mmio_enable, below).
- PCIERR_RESULT_NEED_RESET: - PCI_ERS_RESULT_NEED_RESET:
Driver returns this if it thinks it can't recover unless the Driver returns this if it can't recover without a hard
slot is reset. slot reset.
- PCIERR_RESULT_DISCONNECT: - PCI_ERS_RESULT_DISCONNECT:
Return this if driver thinks it won't recover at all, Driver returns this if it doesn't want to recover at all.
(this will detach the driver ? or just leave it
dangling ? to be decided)
So at this point, we have called error_detected() for all drivers The next step taken will depend on the result codes returned by the
on the segment that had the error. On ppc64, the slot is isolated. What drivers.
happens now typically depends on the result from the drivers. If all
drivers on the segment/slot return PCIERR_RESULT_CAN_RECOVER, we would
re-enable IOs on the slot (or do nothing special if the platform doesn't
isolate slots) and call 2). If not and we can reset slots, we go to 4),
if neither, we have a dead slot. If it's an hotplug slot, we might
"simulate" reset by triggering HW unplug/replug though.
>>> Current ppc64 implementation assumes that a device driver will If all drivers on the segment/slot return PCI_ERS_RESULT_CAN_RECOVER,
>>> *not* schedule or semaphore in this routine; the current ppc64 then the platform should re-enable IOs on the slot (or do nothing in
particular, if the platform doesn't isolate slots), and recovery
proceeds to STEP 2 (MMIO Enable).
If any driver requested a slot reset (by returning PCI_ERS_RESULT_NEED_RESET),
then recovery proceeds to STEP 4 (Slot Reset).
If the platform is unable to recover the slot, the next step
is STEP 6 (Permanent Failure).
>>> The current powerpc implementation assumes that a device driver will
>>> *not* schedule or semaphore in this routine; the current powerpc
>>> implementation uses one kernel thread to notify all devices; >>> implementation uses one kernel thread to notify all devices;
>>> thus, of one device sleeps/schedules, all devices are affected. >>> thus, if one device sleeps/schedules, all devices are affected.
>>> Doing better requires complex multi-threaded logic in the error >>> Doing better requires complex multi-threaded logic in the error
>>> recovery implementation (e.g. waiting for all notification threads >>> recovery implementation (e.g. waiting for all notification threads
>>> to "join" before proceeding with recovery.) This seems excessively >>> to "join" before proceeding with recovery.) This seems excessively
>>> complex and not worth implementing. >>> complex and not worth implementing.
>>> The current ppc64 implementation doesn't much care if the device >>> The current powerpc implementation doesn't much care if the device
>>> attempts i/o at this point, or not. I/O's will fail, returning >>> attempts I/O at this point, or not. I/O's will fail, returning
>>> a value of 0xff on read, and writes will be dropped. If the device >>> a value of 0xff on read, and writes will be dropped. If the device
>>> driver attempts more than 10K I/O's to a frozen adapter, it will >>> driver attempts more than 10K I/O's to a frozen adapter, it will
>>> assume that the device driver has gone into an infinite loop, and >>> assume that the device driver has gone into an infinite loop, and
>>> it will panic the the kernel. >>> it will panic the the kernel. There doesn't seem to be any other
>>> way of stopping a device driver that insists on spinning on I/O.
2) mmio_enabled() STEP 2: MMIO Enabled
-------------------
The platform re-enables MMIO to the device (but typically not the
DMA), and then calls the mmio_enabled() callback on all affected
device drivers.
This is the "early recovery" call. IOs are allowed again, but DMA is This is the "early recovery" call. IOs are allowed again, but DMA is
not (hrm... to be discussed, I prefer not), with some restrictions. This not (hrm... to be discussed, I prefer not), with some restrictions. This
is NOT a callback for the driver to start operations again, only to is NOT a callback for the driver to start operations again, only to
peek/poke at the device, extract diagnostic information, if any, and peek/poke at the device, extract diagnostic information, if any, and
eventually do things like trigger a device local reset or some such, eventually do things like trigger a device local reset or some such,
but not restart operations. This is sent if all drivers on a segment but not restart operations. This is callback is made if all drivers on
agree that they can try to recover and no automatic link reset was a segment agree that they can try to recover and if no automatic link reset
performed by the HW. If the platform can't just re-enable IOs without was performed by the HW. If the platform can't just re-enable IOs without
a slot reset or a link reset, it doesn't call this callback and goes a slot reset or a link reset, it wont call this callback, and instead
directly to 3) or 4). All IOs should be done _synchronously_ from will have gone directly to STEP 3 (Link Reset) or STEP 4 (Slot Reset)
within this callback, errors triggered by them will be returned via
the normal pci_check_whatever() api, no new error_detected() callback
will be issued due to an error happening here. However, such an error
might cause IOs to be re-blocked for the whole segment, and thus
invalidate the recovery that other devices on the same segment might
have done, forcing the whole segment into one of the next states,
that is link reset or slot reset.
Result codes: >>> The following is proposed; no platform implements this yet:
- PCIERR_RESULT_RECOVERED >>> Proposal: All I/O's should be done _synchronously_ from within
>>> this callback, errors triggered by them will be returned via
>>> the normal pci_check_whatever() API, no new error_detected()
>>> callback will be issued due to an error happening here. However,
>>> such an error might cause IOs to be re-blocked for the whole
>>> segment, and thus invalidate the recovery that other devices
>>> on the same segment might have done, forcing the whole segment
>>> into one of the next states, that is, link reset or slot reset.
The driver should return one of the following result codes:
- PCI_ERS_RESULT_RECOVERED
Driver returns this if it thinks the device is fully Driver returns this if it thinks the device is fully
functionnal and thinks it is ready to start functional and thinks it is ready to start
normal driver operations again. There is no normal driver operations again. There is no
guarantee that the driver will actually be guarantee that the driver will actually be
allowed to proceed, as another driver on the allowed to proceed, as another driver on the
same segment might have failed and thus triggered a same segment might have failed and thus triggered a
slot reset on platforms that support it. slot reset on platforms that support it.
- PCIERR_RESULT_NEED_RESET - PCI_ERS_RESULT_NEED_RESET
Driver returns this if it thinks the device is not Driver returns this if it thinks the device is not
recoverable in it's current state and it needs a slot recoverable in it's current state and it needs a slot
reset to proceed. reset to proceed.
- PCIERR_RESULT_DISCONNECT - PCI_ERS_RESULT_DISCONNECT
Same as above. Total failure, no recovery even after Same as above. Total failure, no recovery even after
reset driver dead. (To be defined more precisely) reset driver dead. (To be defined more precisely)
>>> The current ppc64 implementation does not implement this callback. The next step taken depends on the results returned by the drivers.
If all drivers returned PCI_ERS_RESULT_RECOVERED, then the platform
proceeds to either STEP3 (Link Reset) or to STEP 5 (Resume Operations).
3) link_reset() If any driver returned PCI_ERS_RESULT_NEED_RESET, then the platform
proceeds to STEP 4 (Slot Reset)
This is called after the link has been reset. This is typically >>> The current powerpc implementation does not implement this callback.
a PCI Express specific state at this point and is done whenever a
non-fatal error has been detected that can be "solved" by resetting
the link. This call informs the driver of the reset and the driver STEP 3: Link Reset
should check if the device appears to be in working condition. ------------------
This function acts a bit like 2) mmio_enabled(), in that the driver The platform resets the link, and then calls the link_reset() callback
is not supposed to restart normal driver I/O operations right away. on all affected device drivers. This is a PCI-Express specific state
Instead, it should just "probe" the device to check it's recoverability and is done whenever a non-fatal error has been detected that can be
status. If all is right, then the core will call resume() once all "solved" by resetting the link. This call informs the driver of the
drivers have ack'd link_reset(). reset and the driver should check to see if the device appears to be
in working condition.
The driver is not supposed to restart normal driver I/O operations
at this point. It should limit itself to "probing" the device to
check it's recoverability status. If all is right, then the platform
will call resume() once all drivers have ack'd link_reset().
Result codes: Result codes:
(identical to mmio_enabled) (identical to STEP 3 (MMIO Enabled)
>>> The current ppc64 implementation does not implement this callback. The platform then proceeds to either STEP 4 (Slot Reset) or STEP 5
(Resume Operations).
4) slot_reset() >>> The current powerpc implementation does not implement this callback.
This is called after the slot has been soft or hard reset by the
platform. A soft reset consists of asserting the adapter #RST line STEP 4: Slot Reset
and then restoring the PCI BARs and PCI configuration header. If the ------------------
platform supports PCI hotplug, then it might instead perform a hard The platform performs a soft or hard reset of the device, and then
reset by toggling power on the slot off/on. This call gives drivers calls the slot_reset() callback.
the chance to re-initialize the hardware (re-download firmware, etc.),
but drivers shouldn't restart normal I/O processing operations at A soft reset consists of asserting the adapter #RST line and then
this point. (See note about interrupts; interrupts aren't guaranteed restoring the PCI BAR's and PCI configuration header to a state
to be delivered until the resume() callback has been called). If all that is equivalent to what it would be after a fresh system
device drivers report success on this callback, the patform will call power-on followed by power-on BIOS/system firmware initialization.
resume() to complete the error handling and let the driver restart If the platform supports PCI hotplug, then the reset might be
normal I/O processing. performed by toggling the slot electrical power off/on.
It is important for the platform to restore the PCI config space
to the "fresh poweron" state, rather than the "last state". After
a slot reset, the device driver will almost always use its standard
device initialization routines, and an unusual config space setup
may result in hung devices, kernel panics, or silent data corruption.
This call gives drivers the chance to re-initialize the hardware
(re-download firmware, etc.). At this point, the driver may assume
that he card is in a fresh state and is fully functional. In
particular, interrupt generation should work normally.
Drivers should not yet restart normal I/O processing operations
at this point. If all device drivers report success on this
callback, the platform will call resume() to complete the sequence,
and let the driver restart normal I/O processing.
A driver can still return a critical failure for this function if A driver can still return a critical failure for this function if
it can't get the device operational after reset. If the platform it can't get the device operational after reset. If the platform
previously tried a soft reset, it migh now try a hard reset (power previously tried a soft reset, it might now try a hard reset (power
cycle) and then call slot_reset() again. It the device still can't cycle) and then call slot_reset() again. It the device still can't
be recovered, there is nothing more that can be done; the platform be recovered, there is nothing more that can be done; the platform
will typically report a "permanent failure" in such a case. The will typically report a "permanent failure" in such a case. The
device will be considered "dead" in this case. device will be considered "dead" in this case.
Drivers for multi-function cards will need to coordinate among
themselves as to which driver instance will perform any "one-shot"
or global device initialization. For example, the Symbios sym53cxx2
driver performs device init only from PCI function 0:
+ if (PCI_FUNC(pdev->devfn) == 0)
+ sym_reset_scsi_bus(np, 0);
Result codes: Result codes:
- PCIERR_RESULT_DISCONNECT - PCI_ERS_RESULT_DISCONNECT
Same as above. Same as above.
>>> The current ppc64 implementation does not try a power-cycle reset Platform proceeds either to STEP 5 (Resume Operations) or STEP 6 (Permanent
>>> if the driver returned PCIERR_RESULT_DISCONNECT. However, it should. Failure).
5) resume() >>> The current powerpc implementation does not currently try a
>>> power-cycle reset if the driver returned PCI_ERS_RESULT_DISCONNECT.
>>> However, it probably should.
This is called if all drivers on the segment have returned
PCIERR_RESULT_RECOVERED from one of the 3 prevous callbacks.
That basically tells the driver to restart activity, tht everything
is back and running. No result code is taken into account here. If
a new error happens, it will restart a new error handling process.
That's it. I think this covers all the possibilities. The way those STEP 5: Resume Operations
callbacks are called is platform policy. A platform with no slot reset -------------------------
capability for example may want to just "ignore" drivers that can't The platform will call the resume() callback on all affected device
drivers if all drivers on the segment have returned
PCI_ERS_RESULT_RECOVERED from one of the 3 previous callbacks.
The goal of this callback is to tell the driver to restart activity,
that everything is back and running. This callback does not return
a result code.
At this point, if a new error happens, the platform will restart
a new error recovery sequence.
STEP 6: Permanent Failure
-------------------------
A "permanent failure" has occurred, and the platform cannot recover
the device. The platform will call error_detected() with a
pci_channel_state value of pci_channel_io_perm_failure.
The device driver should, at this point, assume the worst. It should
cancel all pending I/O, refuse all new I/O, returning -EIO to
higher layers. The device driver should then clean up all of its
memory and remove itself from kernel operations, much as it would
during system shutdown.
The platform will typically notify the system operator of the
permanent failure in some way. If the device is hotplug-capable,
the operator will probably want to remove and replace the device.
Note, however, not all failures are truly "permanent". Some are
caused by over-heating, some by a poorly seated card. Many
PCI error events are caused by software bugs, e.g. DMA's to
wild addresses or bogus split transactions due to programming
errors. See the discussion in powerpc/eeh-pci-error-recovery.txt
for additional detail on real-life experience of the causes of
software errors.
Conclusion; General Remarks
---------------------------
The way those callbacks are called is platform policy. A platform with
no slot reset capability may want to just "ignore" drivers that can't
recover (disconnect them) and try to let other cards on the same segment recover (disconnect them) and try to let other cards on the same segment
recover. Keep in mind that in most real life cases, though, there will recover. Keep in mind that in most real life cases, though, there will
be only one driver per segment. be only one driver per segment.
Now, there is a note about interrupts. If you get an interrupt and your Now, a note about interrupts. If you get an interrupt and your
device is dead or has been isolated, there is a problem :) device is dead or has been isolated, there is a problem :)
The current policy is to turn this into a platform policy.
After much thinking, I decided to leave that to the platform. That is, That is, the recovery API only requires that:
the recovery API only precies that:
- There is no guarantee that interrupt delivery can proceed from any - There is no guarantee that interrupt delivery can proceed from any
device on the segment starting from the error detection and until the device on the segment starting from the error detection and until the
restart callback is sent, at which point interrupts are expected to be resume callback is sent, at which point interrupts are expected to be
fully operational. fully operational.
- There is no guarantee that interrupt delivery is stopped, that is, ad - There is no guarantee that interrupt delivery is stopped, that is,
river that gets an interrupts after detecting an error, or that detects a driver that gets an interrupt after detecting an error, or that detects
and error within the interrupt handler such that it prevents proper an error within the interrupt handler such that it prevents proper
ack'ing of the interrupt (and thus removal of the source) should just ack'ing of the interrupt (and thus removal of the source) should just
return IRQ_NOTHANDLED. It's up to the platform to deal with taht return IRQ_NOTHANDLED. It's up to the platform to deal with that
condition, typically by masking the irq source during the duration of condition, typically by masking the IRQ source during the duration of
the error handling. It is expected that the platform "knows" which the error handling. It is expected that the platform "knows" which
interrupts are routed to error-management capable slots and can deal interrupts are routed to error-management capable slots and can deal
with temporarily disabling that irq number during error processing (this with temporarily disabling that IRQ number during error processing (this
isn't terribly complex). That means some IRQ latency for other devices isn't terribly complex). That means some IRQ latency for other devices
sharing the interrupt, but there is simply no other way. High end sharing the interrupt, but there is simply no other way. High end
platforms aren't supposed to share interrupts between many devices platforms aren't supposed to share interrupts between many devices
anyway :) anyway :)
>>> Implementation details for the powerpc platform are discussed in
>>> the file Documentation/powerpc/eeh-pci-error-recovery.txt
Revised: 31 May 2005 Linas Vepstas <linas@austin.ibm.com> >>> As of this writing, there are six device drivers with patches
>>> implementing error recovery. Not all of these patches are in
>>> mainline yet. These may be used as "examples":
>>>
>>> drivers/scsi/ipr.c
>>> drivers/scsi/sym53cxx_2
>>> drivers/next/e100.c
>>> drivers/net/e1000
>>> drivers/net/ixgb
>>> drivers/net/s2io.c
The End
-------

View File

@ -44,7 +44,7 @@ it.
/sys/power/image_size controls the size of the image created by /sys/power/image_size controls the size of the image created by
the suspend-to-disk mechanism. It can be written a string the suspend-to-disk mechanism. It can be written a string
representing a non-negative integer that will be used as an upper representing a non-negative integer that will be used as an upper
limit of the image size, in megabytes. The suspend-to-disk mechanism will limit of the image size, in bytes. The suspend-to-disk mechanism will
do its best to ensure the image size will not exceed that number. However, do its best to ensure the image size will not exceed that number. However,
if this turns out to be impossible, it will try to suspend anyway using the if this turns out to be impossible, it will try to suspend anyway using the
smallest image possible. In particular, if "0" is written to this file, the smallest image possible. In particular, if "0" is written to this file, the

View File

@ -27,7 +27,7 @@ echo shutdown > /sys/power/disk; echo disk > /sys/power/state
echo platform > /sys/power/disk; echo disk > /sys/power/state echo platform > /sys/power/disk; echo disk > /sys/power/state
If you want to limit the suspend image size to N megabytes, do If you want to limit the suspend image size to N bytes, do
echo N > /sys/power/image_size echo N > /sys/power/image_size

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,47 @@
1 Release Date : Wed Feb 03 14:31:44 PST 2006 - Sumant Patro <Sumant.Patro@lsil.com>
2 Current Version : 00.00.02.04
3 Older Version : 00.00.02.04
i. Support for 1078 type (ppc IOP) controller, device id : 0x60 added.
During initialization, depending on the device id, the template members
are initialized with function pointers specific to the ppc or
xscale controllers.
-Sumant Patro <Sumant.Patro@lsil.com>
1 Release Date : Fri Feb 03 14:16:25 PST 2006 - Sumant Patro
<Sumant.Patro@lsil.com>
2 Current Version : 00.00.02.04
3 Older Version : 00.00.02.02
i. Register 16 byte CDB capability with scsi midlayer
"Ths patch properly registers the 16 byte command length capability of the
megaraid_sas controlled hardware with the scsi midlayer. All megaraid_sas
hardware supports 16 byte CDB's."
-Joshua Giles <joshua_giles@dell.com>
1 Release Date : Mon Jan 23 14:09:01 PST 2006 - Sumant Patro <Sumant.Patro@lsil.com>
2 Current Version : 00.00.02.02
3 Older Version : 00.00.02.01
i. New template defined to represent each family of controllers (identified by processor used).
The template will have defintions that will be initialised to appropritae values for a specific family of controllers. The template definition has four function pointers. During driver initialisation the function pointers will be set based on the controller family type. This change is done to support new controllers that has different processors and thus different register set.
-Sumant Patro <Sumant.Patro@lsil.com>
1 Release Date : Mon Dec 19 14:36:26 PST 2005 - Sumant Patro <Sumant.Patro@lsil.com>
2 Current Version : 00.00.02.00-rc4
3 Older Version : 00.00.02.01
i. Code reorganized to remove code duplication in megasas_build_cmd.
"There's a lot of duplicate code megasas_build_cmd. Move that out of the different codepathes and merge the reminder of megasas_build_cmd into megasas_queue_command"
- Christoph Hellwig <hch@lst.de>
ii. Defined MEGASAS_IOC_FIRMWARE32 for code paths that handles 32 bit applications in 64 bit systems.
"MEGASAS_IOC_FIRMWARE can't be redefined if CONFIG_COMPAT is set, we need to define a MEGASAS_IOC_FIRMWARE32 define so native binaries continue to work"
- Christoph Hellwig <hch@lst.de>

View File

@ -1,5 +1,5 @@
==================================================================== ====================================================================
= Adaptec Ultra320 Family Manager Set v1.3.11 = = Adaptec Ultra320 Family Manager Set =
= = = =
= README for = = README for =
= The Linux Operating System = = The Linux Operating System =
@ -63,6 +63,11 @@ The following information is available in this file:
68-pin) 68-pin)
2. Version History 2. Version History
3.0 (December 1st, 2005)
- Updated driver to use SCSI transport class infrastructure
- Upported sequencer and core fixes from adaptec released
version 2.0.15 of the driver.
1.3.11 (July 11, 2003) 1.3.11 (July 11, 2003)
- Fix several deadlock issues. - Fix several deadlock issues.
- Add 29320ALP and 39320B Id's. - Add 29320ALP and 39320B Id's.
@ -194,7 +199,7 @@ The following information is available in this file:
supported) supported)
- Support for the PCI-X standard up to 133MHz - Support for the PCI-X standard up to 133MHz
- Support for the PCI v2.2 standard - Support for the PCI v2.2 standard
- Domain Validation - Domain Validation
2.2. Operating System Support: 2.2. Operating System Support:
- Redhat Linux 7.2, 7.3, 8.0, Advanced Server 2.1 - Redhat Linux 7.2, 7.3, 8.0, Advanced Server 2.1
@ -411,77 +416,53 @@ The following information is available in this file:
http://www.adaptec.com. http://www.adaptec.com.
5. Contacting Adaptec 5. Adaptec Customer Support
A Technical Support Identification (TSID) Number is required for A Technical Support Identification (TSID) Number is required for
Adaptec technical support. Adaptec technical support.
- The 12-digit TSID can be found on the white barcode-type label - The 12-digit TSID can be found on the white barcode-type label
included inside the box with your product. The TSID helps us included inside the box with your product. The TSID helps us
provide more efficient service by accurately identifying your provide more efficient service by accurately identifying your
product and support status. product and support status.
Support Options Support Options
- Search the Adaptec Support Knowledgebase (ASK) at - Search the Adaptec Support Knowledgebase (ASK) at
http://ask.adaptec.com for articles, troubleshooting tips, and http://ask.adaptec.com for articles, troubleshooting tips, and
frequently asked questions for your product. frequently asked questions about your product.
- For support via Email, submit your question to Adaptec's - For support via Email, submit your question to Adaptec's
Technical Support Specialists at http://ask.adaptec.com. Technical Support Specialists at http://ask.adaptec.com/.
North America North America
- Visit our Web site at http://www.adaptec.com. - Visit our Web site at http://www.adaptec.com/.
- To speak with a Fibre Channel/RAID/External Storage Technical - For information about Adaptec's support options, call
Support Specialist, call 1-321-207-2000, 408-957-2550, 24 hours a day, 7 days a week.
Hours: Monday-Friday, 3:00 A.M. to 5:00 P.M., PST. - To speak with a Technical Support Specialist,
(Not open on holidays) * For hardware products, call 408-934-7274,
- For Technical Support in all other technologies including Monday to Friday, 3:00 am to 5:00 pm, PDT.
SCSI, call 1-408-934-7274, * For RAID and Fibre Channel products, call 321-207-2000,
Hours: Monday-Friday, 6:00 A.M. to 5:00 P.M., PST. Monday to Friday, 3:00 am to 5:00 pm, PDT.
(Not open on holidays) To expedite your service, have your computer with you.
- For after hours support, call 1-800-416-8066 ($99/call, - To order Adaptec products, including accessories and cables,
$149/call on holidays) call 408-957-7274. To order cables online go to
- To order Adaptec products including software and cables, call http://www.adaptec.com/buy-cables/.
1-800-442-7274 or 1-408-957-7274. You can also visit our
online store at http://www.adaptecstore.com
Europe Europe
- Visit our Web site at http://www.adaptec-europe.com. - Visit our Web site at http://www.adaptec-europe.com/.
- English and French: To speak with a Technical Support - To speak with a Technical Support Specialist, call, or email,
Specialist, call one of the following numbers: * German: +49 89 4366 5522, Monday-Friday, 9:00-17:00 CET,
- English: +32-2-352-3470 http://ask-de.adaptec.com/.
- French: +32-2-352-3460 * French: +49 89 4366 5533, Monday-Friday, 9:00-17:00 CET,
Hours: Monday-Thursday, 10:00 to 12:30, 13:30 to 17:30 CET http://ask-fr.adaptec.com/.
Friday, 10:00 to 12:30, 13:30 to 16:30 CET * English: +49 89 4366 5544, Monday-Friday, 9:00-17:00 GMT,
- German: To speak with a Technical Support Specialist, http://ask.adaptec.com/.
call +49-89-456-40660 - You can order Adaptec cables online at
Hours: Monday-Thursday, 09:30 to 12:30, 13:30 to 16:30 CET http://www.adaptec.com/buy-cables/.
Friday, 09:30 to 12:30, 13:30 to 15:00 CET
- To order Adaptec products, including accessories and cables:
- UK: +0800-96-65-26 or fax +0800-731-02-95
- Other European countries: +32-11-300-379
Australia and New Zealand
- Visit our Web site at http://www.adaptec.com.au.
- To speak with a Technical Support Specialist, call
+612-9416-0698
Hours: Monday-Friday, 10:00 A.M. to 4:30 P.M., EAT
(Not open on holidays)
Japan Japan
- Visit our web site at http://www.adaptec.co.jp/.
- To speak with a Technical Support Specialist, call - To speak with a Technical Support Specialist, call
+81-3-5308-6120 +81 3 5308 6120, Monday-Friday, 9:00 a.m. to 12:00 p.m.,
Hours: Monday-Friday, 9:00 a.m. to 12:00 p.m., 1:00 p.m. to 1:00 p.m. to 6:00 p.m.
6:00 p.m. TSC
Hong Kong and China
- To speak with a Technical Support Specialist, call
+852-2869-7200
Hours: Monday-Friday, 10:00 to 17:00.
- Fax Technical Support at +852-2869-7100.
Singapore
- To speak with a Technical Support Specialist, call
+65-245-7470
Hours: Monday-Friday, 10:00 to 17:00.
- Fax Technical Support at +852-2869-7100
------------------------------------------------------------------- -------------------------------------------------------------------
/* /*

View File

@ -309,81 +309,57 @@ The following information is available in this file:
----------------------------------------------------------------- -----------------------------------------------------------------
Example: Example:
'options aic7xxx aic7xxx=verbose,no_probe,tag_info:{{},{,,10}},seltime:1" 'options aic7xxx aic7xxx=verbose,no_probe,tag_info:{{},{,,10}},seltime:1'
enables verbose logging, Disable EISA/VLB probing, enables verbose logging, Disable EISA/VLB probing,
and set tag depth on Controller 1/Target 2 to 10 tags. and set tag depth on Controller 1/Target 2 to 10 tags.
3. Contacting Adaptec 4. Adaptec Customer Support
A Technical Support Identification (TSID) Number is required for A Technical Support Identification (TSID) Number is required for
Adaptec technical support. Adaptec technical support.
- The 12-digit TSID can be found on the white barcode-type label - The 12-digit TSID can be found on the white barcode-type label
included inside the box with your product. The TSID helps us included inside the box with your product. The TSID helps us
provide more efficient service by accurately identifying your provide more efficient service by accurately identifying your
product and support status. product and support status.
Support Options Support Options
- Search the Adaptec Support Knowledgebase (ASK) at - Search the Adaptec Support Knowledgebase (ASK) at
http://ask.adaptec.com for articles, troubleshooting tips, and http://ask.adaptec.com for articles, troubleshooting tips, and
frequently asked questions for your product. frequently asked questions about your product.
- For support via Email, submit your question to Adaptec's - For support via Email, submit your question to Adaptec's
Technical Support Specialists at http://ask.adaptec.com. Technical Support Specialists at http://ask.adaptec.com/.
North America North America
- Visit our Web site at http://www.adaptec.com. - Visit our Web site at http://www.adaptec.com/.
- To speak with a Fibre Channel/RAID/External Storage Technical - For information about Adaptec's support options, call
Support Specialist, call 1-321-207-2000, 408-957-2550, 24 hours a day, 7 days a week.
Hours: Monday-Friday, 3:00 A.M. to 5:00 P.M., PST. - To speak with a Technical Support Specialist,
(Not open on holidays) * For hardware products, call 408-934-7274,
- For Technical Support in all other technologies including Monday to Friday, 3:00 am to 5:00 pm, PDT.
SCSI, call 1-408-934-7274, * For RAID and Fibre Channel products, call 321-207-2000,
Hours: Monday-Friday, 6:00 A.M. to 5:00 P.M., PST. Monday to Friday, 3:00 am to 5:00 pm, PDT.
(Not open on holidays) To expedite your service, have your computer with you.
- For after hours support, call 1-800-416-8066 ($99/call, - To order Adaptec products, including accessories and cables,
$149/call on holidays) call 408-957-7274. To order cables online go to
- To order Adaptec products including software and cables, call http://www.adaptec.com/buy-cables/.
1-800-442-7274 or 1-408-957-7274. You can also visit our
online store at http://www.adaptecstore.com
Europe Europe
- Visit our Web site at http://www.adaptec-europe.com. - Visit our Web site at http://www.adaptec-europe.com/.
- English and French: To speak with a Technical Support - To speak with a Technical Support Specialist, call, or email,
Specialist, call one of the following numbers: * German: +49 89 4366 5522, Monday-Friday, 9:00-17:00 CET,
- English: +32-2-352-3470 http://ask-de.adaptec.com/.
- French: +32-2-352-3460 * French: +49 89 4366 5533, Monday-Friday, 9:00-17:00 CET,
Hours: Monday-Thursday, 10:00 to 12:30, 13:30 to 17:30 CET http://ask-fr.adaptec.com/.
Friday, 10:00 to 12:30, 13:30 to 16:30 CET * English: +49 89 4366 5544, Monday-Friday, 9:00-17:00 GMT,
- German: To speak with a Technical Support Specialist, http://ask.adaptec.com/.
call +49-89-456-40660 - You can order Adaptec cables online at
Hours: Monday-Thursday, 09:30 to 12:30, 13:30 to 16:30 CET http://www.adaptec.com/buy-cables/.
Friday, 09:30 to 12:30, 13:30 to 15:00 CET
- To order Adaptec products, including accessories and cables:
- UK: +0800-96-65-26 or fax +0800-731-02-95
- Other European countries: +32-11-300-379
Australia and New Zealand
- Visit our Web site at http://www.adaptec.com.au.
- To speak with a Technical Support Specialist, call
+612-9416-0698
Hours: Monday-Friday, 10:00 A.M. to 4:30 P.M., EAT
(Not open on holidays)
Japan Japan
- Visit our web site at http://www.adaptec.co.jp/.
- To speak with a Technical Support Specialist, call - To speak with a Technical Support Specialist, call
+81-3-5308-6120 +81 3 5308 6120, Monday-Friday, 9:00 a.m. to 12:00 p.m.,
Hours: Monday-Friday, 9:00 a.m. to 12:00 p.m., 1:00 p.m. to 1:00 p.m. to 6:00 p.m.
6:00 p.m. TSC
Hong Kong and China
- To speak with a Technical Support Specialist, call
+852-2869-7200
Hours: Monday-Friday, 10:00 to 17:00.
- Fax Technical Support at +852-2869-7100.
Singapore
- To speak with a Technical Support Specialist, call
+65-245-7470
Hours: Monday-Friday, 10:00 to 17:00.
- Fax Technical Support at +852-2869-7100
------------------------------------------------------------------- -------------------------------------------------------------------
/* /*

View File

@ -837,8 +837,10 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
Module for AC'97 motherboards from Intel and compatibles. Module for AC'97 motherboards from Intel and compatibles.
* Intel i810/810E, i815, i820, i830, i84x, MX440 * Intel i810/810E, i815, i820, i830, i84x, MX440
ICH5, ICH6, ICH7, ESB2
* SiS 7012 (SiS 735) * SiS 7012 (SiS 735)
* NVidia NForce, NForce2 * NVidia NForce, NForce2, NForce3, MCP04, CK804
CK8, CK8S, MCP501
* AMD AMD768, AMD8111 * AMD AMD768, AMD8111
* ALi m5455 * ALi m5455
@ -868,6 +870,12 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
-------------------- --------------------
Module for Intel ICH (i8x0) chipset MC97 modems. Module for Intel ICH (i8x0) chipset MC97 modems.
* Intel i810/810E, i815, i820, i830, i84x, MX440
ICH5, ICH6, ICH7
* SiS 7013 (SiS 735)
* NVidia NForce, NForce2, NForce2s, NForce3
* AMD AMD8111
* ALi m5455
ac97_clock - AC'97 codec clock base (0 = auto-detect) ac97_clock - AC'97 codec clock base (0 = auto-detect)

View File

@ -5206,14 +5206,14 @@ struct _snd_pcm_runtime {
You need to pass the <function>snd_dma_pci_data(pci)</function>, You need to pass the <function>snd_dma_pci_data(pci)</function>,
where pci is the struct <structname>pci_dev</structname> pointer where pci is the struct <structname>pci_dev</structname> pointer
of the chip as well. of the chip as well.
The <type>snd_sg_buf_t</type> instance is created as The <type>struct snd_sg_buf</type> instance is created as
substream-&gt;dma_private. You can cast substream-&gt;dma_private. You can cast
the pointer like: the pointer like:
<informalexample> <informalexample>
<programlisting> <programlisting>
<![CDATA[ <![CDATA[
struct snd_sg_buf *sgbuf = (struct snd_sg_buf_t*)substream->dma_private; struct snd_sg_buf *sgbuf = (struct snd_sg_buf *)substream->dma_private;
]]> ]]>
</programlisting> </programlisting>
</informalexample> </informalexample>

View File

@ -12,13 +12,20 @@ You can make this adapter from an old printer cable and solder things
directly to the Butterfly. Or (if you have the parts and skills) you directly to the Butterfly. Or (if you have the parts and skills) you
can come up with something fancier, providing ciruit protection to the can come up with something fancier, providing ciruit protection to the
Butterfly and the printer port, or with a better power supply than two Butterfly and the printer port, or with a better power supply than two
signal pins from the printer port. signal pins from the printer port. Or for that matter, you can use
similar cables to talk to many AVR boards, even a breadboard.
This is more powerful than "ISP programming" cables since it lets kernel
SPI protocol drivers interact with the AVR, and could even let the AVR
issue interrupts to them. Later, your protocol driver should work
easily with a "real SPI controller", instead of this bitbanger.
The first cable connections will hook Linux up to one SPI bus, with the The first cable connections will hook Linux up to one SPI bus, with the
AVR and a DataFlash chip; and to the AVR reset line. This is all you AVR and a DataFlash chip; and to the AVR reset line. This is all you
need to reflash the firmware, and the pins are the standard Atmel "ISP" need to reflash the firmware, and the pins are the standard Atmel "ISP"
connector pins (used also on non-Butterfly AVR boards). connector pins (used also on non-Butterfly AVR boards). On the parport
side this is like "sp12" programming cables.
Signal Butterfly Parport (DB-25) Signal Butterfly Parport (DB-25)
------ --------- --------------- ------ --------- ---------------
@ -40,10 +47,14 @@ by clearing PORTB.[0-3]); (b) configure the mtd_dataflash driver; and
SELECT = J400.PB0/nSS = pin 17/C3,nSELECT SELECT = J400.PB0/nSS = pin 17/C3,nSELECT
GND = J400.GND = pin 24/GND GND = J400.GND = pin 24/GND
The "USI" controller, using J405, can be used for a second SPI bus. That Or you could flash firmware making the AVR into an SPI slave (keeping the
would let you talk to the AVR over SPI, running firmware that makes it act DataFlash in reset) and tweak the spi_butterfly driver to make it bind to
as an SPI slave, while letting either Linux or the AVR use the DataFlash. the driver for your custom SPI-based protocol.
There are plenty of spare parport pins to wire this one up, such as:
The "USI" controller, using J405, can also be used for a second SPI bus.
That would let you talk to the AVR using custom SPI-with-USI firmware,
while letting either Linux or the AVR use the DataFlash. There are plenty
of spare parport pins to wire this one up, such as:
Signal Butterfly Parport (DB-25) Signal Butterfly Parport (DB-25)
------ --------- --------------- ------ --------- ---------------

View File

@ -16,6 +16,7 @@ before actually making adjustments.
Currently, these files might (depending on your configuration) Currently, these files might (depending on your configuration)
show up in /proc/sys/kernel: show up in /proc/sys/kernel:
- acpi_video_flags
- acct - acct
- core_pattern - core_pattern
- core_uses_pid - core_uses_pid
@ -57,6 +58,15 @@ show up in /proc/sys/kernel:
============================================================== ==============================================================
acpi_video_flags:
flags
See Doc*/kernel/power/video.txt, it allows mode of video boot to be
set during run time.
==============================================================
acct: acct:
highwater lowwater frequency highwater lowwater frequency

View File

@ -28,6 +28,7 @@ Currently, these files are in /proc/sys/vm:
- block_dump - block_dump
- drop-caches - drop-caches
- zone_reclaim_mode - zone_reclaim_mode
- zone_reclaim_interval
============================================================== ==============================================================
@ -126,15 +127,54 @@ the high water marks for each per cpu page list.
zone_reclaim_mode: zone_reclaim_mode:
This is set during bootup to 1 if it is determined that pages from Zone_reclaim_mode allows to set more or less agressive approaches to
remote zones will cause a significant performance reduction. The reclaim memory when a zone runs out of memory. If it is set to zero then no
zone reclaim occurs. Allocations will be satisfied from other zones / nodes
in the system.
This is value ORed together of
1 = Zone reclaim on
2 = Zone reclaim writes dirty pages out
4 = Zone reclaim swaps pages
8 = Also do a global slab reclaim pass
zone_reclaim_mode is set during bootup to 1 if it is determined that pages
from remote zones will cause a measurable performance reduction. The
page allocator will then reclaim easily reusable pages (those page page allocator will then reclaim easily reusable pages (those page
cache pages that are currently not used) before going off node. cache pages that are currently not used) before allocating off node pages.
The user can override this setting. It may be beneficial to switch It may be beneficial to switch off zone reclaim if the system is
off zone reclaim if the system is used for a file server and all used for a file server and all of memory should be used for caching files
of memory should be used for caching files from disk. from disk. In that case the caching effect is more important than
data locality.
It may be beneficial to switch this on if one wants to do zone Allowing zone reclaim to write out pages stops processes that are
reclaim regardless of the numa distances in the system. writing large amounts of data from dirtying pages on other nodes. Zone
reclaim will write out dirty pages if a zone fills up and so effectively
throttle the process. This may decrease the performance of a single process
since it cannot use all of system memory to buffer the outgoing writes
anymore but it preserve the memory on other nodes so that the performance
of other processes running on other nodes will not be affected.
Allowing regular swap effectively restricts allocations to the local
node unless explicitly overridden by memory policies or cpuset
configurations.
It may be advisable to allow slab reclaim if the system makes heavy
use of files and builds up large slab caches. However, the slab
shrink operation is global, may take a long time and free slabs
in all nodes of the system.
================================================================
zone_reclaim_interval:
The time allowed for off node allocations after zone reclaim
has failed to reclaim enough pages to allow a local allocation.
Time is set in seconds and set by default to 30 seconds.
Reduce the interval if undesired off node allocations occur. However, too
frequent scans will have a negative impact onoff node allocation performance.

295
Documentation/unshare.txt Normal file
View File

@ -0,0 +1,295 @@
unshare system call:
--------------------
This document describes the new system call, unshare. The document
provides an overview of the feature, why it is needed, how it can
be used, its interface specification, design, implementation and
how it can be tested.
Change Log:
-----------
version 0.1 Initial document, Janak Desai (janak@us.ibm.com), Jan 11, 2006
Contents:
---------
1) Overview
2) Benefits
3) Cost
4) Requirements
5) Functional Specification
6) High Level Design
7) Low Level Design
8) Test Specification
9) Future Work
1) Overview
-----------
Most legacy operating system kernels support an abstraction of threads
as multiple execution contexts within a process. These kernels provide
special resources and mechanisms to maintain these "threads". The Linux
kernel, in a clever and simple manner, does not make distinction
between processes and "threads". The kernel allows processes to share
resources and thus they can achieve legacy "threads" behavior without
requiring additional data structures and mechanisms in the kernel. The
power of implementing threads in this manner comes not only from
its simplicity but also from allowing application programmers to work
outside the confinement of all-or-nothing shared resources of legacy
threads. On Linux, at the time of thread creation using the clone system
call, applications can selectively choose which resources to share
between threads.
unshare system call adds a primitive to the Linux thread model that
allows threads to selectively 'unshare' any resources that were being
shared at the time of their creation. unshare was conceptualized by
Al Viro in the August of 2000, on the Linux-Kernel mailing list, as part
of the discussion on POSIX threads on Linux. unshare augments the
usefulness of Linux threads for applications that would like to control
shared resources without creating a new process. unshare is a natural
addition to the set of available primitives on Linux that implement
the concept of process/thread as a virtual machine.
2) Benefits
-----------
unshare would be useful to large application frameworks such as PAM
where creating a new process to control sharing/unsharing of process
resources is not possible. Since namespaces are shared by default
when creating a new process using fork or clone, unshare can benefit
even non-threaded applications if they have a need to disassociate
from default shared namespace. The following lists two use-cases
where unshare can be used.
2.1 Per-security context namespaces
-----------------------------------
unshare can be used to implement polyinstantiated directories using
the kernel's per-process namespace mechanism. Polyinstantiated directories,
such as per-user and/or per-security context instance of /tmp, /var/tmp or
per-security context instance of a user's home directory, isolate user
processes when working with these directories. Using unshare, a PAM
module can easily setup a private namespace for a user at login.
Polyinstantiated directories are required for Common Criteria certification
with Labeled System Protection Profile, however, with the availability
of shared-tree feature in the Linux kernel, even regular Linux systems
can benefit from setting up private namespaces at login and
polyinstantiating /tmp, /var/tmp and other directories deemed
appropriate by system administrators.
2.2 unsharing of virtual memory and/or open files
-------------------------------------------------
Consider a client/server application where the server is processing
client requests by creating processes that share resources such as
virtual memory and open files. Without unshare, the server has to
decide what needs to be shared at the time of creating the process
which services the request. unshare allows the server an ability to
disassociate parts of the context during the servicing of the
request. For large and complex middleware application frameworks, this
ability to unshare after the process was created can be very
useful.
3) Cost
-------
In order to not duplicate code and to handle the fact that unshare
works on an active task (as opposed to clone/fork working on a newly
allocated inactive task) unshare had to make minor reorganizational
changes to copy_* functions utilized by clone/fork system call.
There is a cost associated with altering existing, well tested and
stable code to implement a new feature that may not get exercised
extensively in the beginning. However, with proper design and code
review of the changes and creation of an unshare test for the LTP
the benefits of this new feature can exceed its cost.
4) Requirements
---------------
unshare reverses sharing that was done using clone(2) system call,
so unshare should have a similar interface as clone(2). That is,
since flags in clone(int flags, void *stack) specifies what should
be shared, similar flags in unshare(int flags) should specify
what should be unshared. Unfortunately, this may appear to invert
the meaning of the flags from the way they are used in clone(2).
However, there was no easy solution that was less confusing and that
allowed incremental context unsharing in future without an ABI change.
unshare interface should accommodate possible future addition of
new context flags without requiring a rebuild of old applications.
If and when new context flags are added, unshare design should allow
incremental unsharing of those resources on an as needed basis.
5) Functional Specification
---------------------------
NAME
unshare - disassociate parts of the process execution context
SYNOPSIS
#include <sched.h>
int unshare(int flags);
DESCRIPTION
unshare allows a process to disassociate parts of its execution
context that are currently being shared with other processes. Part
of execution context, such as the namespace, is shared by default
when a new process is created using fork(2), while other parts,
such as the virtual memory, open file descriptors, etc, may be
shared by explicit request to share them when creating a process
using clone(2).
The main use of unshare is to allow a process to control its
shared execution context without creating a new process.
The flags argument specifies one or bitwise-or'ed of several of
the following constants.
CLONE_FS
If CLONE_FS is set, file system information of the caller
is disassociated from the shared file system information.
CLONE_FILES
If CLONE_FILES is set, the file descriptor table of the
caller is disassociated from the shared file descriptor
table.
CLONE_NEWNS
If CLONE_NEWNS is set, the namespace of the caller is
disassociated from the shared namespace.
CLONE_VM
If CLONE_VM is set, the virtual memory of the caller is
disassociated from the shared virtual memory.
RETURN VALUE
On success, zero returned. On failure, -1 is returned and errno is
ERRORS
EPERM CLONE_NEWNS was specified by a non-root process (process
without CAP_SYS_ADMIN).
ENOMEM Cannot allocate sufficient memory to copy parts of caller's
context that need to be unshared.
EINVAL Invalid flag was specified as an argument.
CONFORMING TO
The unshare() call is Linux-specific and should not be used
in programs intended to be portable.
SEE ALSO
clone(2), fork(2)
6) High Level Design
--------------------
Depending on the flags argument, the unshare system call allocates
appropriate process context structures, populates it with values from
the current shared version, associates newly duplicated structures
with the current task structure and releases corresponding shared
versions. Helper functions of clone (copy_*) could not be used
directly by unshare because of the following two reasons.
1) clone operates on a newly allocated not-yet-active task
structure, where as unshare operates on the current active
task. Therefore unshare has to take appropriate task_lock()
before associating newly duplicated context structures
2) unshare has to allocate and duplicate all context structures
that are being unshared, before associating them with the
current task and releasing older shared structures. Failure
do so will create race conditions and/or oops when trying
to backout due to an error. Consider the case of unsharing
both virtual memory and namespace. After successfully unsharing
vm, if the system call encounters an error while allocating
new namespace structure, the error return code will have to
reverse the unsharing of vm. As part of the reversal the
system call will have to go back to older, shared, vm
structure, which may not exist anymore.
Therefore code from copy_* functions that allocated and duplicated
current context structure was moved into new dup_* functions. Now,
copy_* functions call dup_* functions to allocate and duplicate
appropriate context structures and then associate them with the
task structure that is being constructed. unshare system call on
the other hand performs the following:
1) Check flags to force missing, but implied, flags
2) For each context structure, call the corresponding unshare
helper function to allocate and duplicate a new context
structure, if the appropriate bit is set in the flags argument.
3) If there is no error in allocation and duplication and there
are new context structures then lock the current task structure,
associate new context structures with the current task structure,
and release the lock on the current task structure.
4) Appropriately release older, shared, context structures.
7) Low Level Design
-------------------
Implementation of unshare can be grouped in the following 4 different
items:
a) Reorganization of existing copy_* functions
b) unshare system call service function
c) unshare helper functions for each different process context
d) Registration of system call number for different architectures
7.1) Reorganization of copy_* functions
Each copy function such as copy_mm, copy_namespace, copy_files,
etc, had roughly two components. The first component allocated
and duplicated the appropriate structure and the second component
linked it to the task structure passed in as an argument to the copy
function. The first component was split into its own function.
These dup_* functions allocated and duplicated the appropriate
context structure. The reorganized copy_* functions invoked
their corresponding dup_* functions and then linked the newly
duplicated structures to the task structure with which the
copy function was called.
7.2) unshare system call service function
* Check flags
Force implied flags. If CLONE_THREAD is set force CLONE_VM.
If CLONE_VM is set, force CLONE_SIGHAND. If CLONE_SIGHAND is
set and signals are also being shared, force CLONE_THREAD. If
CLONE_NEWNS is set, force CLONE_FS.
* For each context flag, invoke the corresponding unshare_*
helper routine with flags passed into the system call and a
reference to pointer pointing the new unshared structure
* If any new structures are created by unshare_* helper
functions, take the task_lock() on the current task,
modify appropriate context pointers, and release the
task lock.
* For all newly unshared structures, release the corresponding
older, shared, structures.
7.3) unshare_* helper functions
For unshare_* helpers corresponding to CLONE_SYSVSEM, CLONE_SIGHAND,
and CLONE_THREAD, return -EINVAL since they are not implemented yet.
For others, check the flag value to see if the unsharing is
required for that structure. If it is, invoke the corresponding
dup_* function to allocate and duplicate the structure and return
a pointer to it.
7.4) Appropriately modify architecture specific code to register the
the new system call.
8) Test Specification
---------------------
The test for unshare should test the following:
1) Valid flags: Test to check that clone flags for signal and
signal handlers, for which unsharing is not implemented
yet, return -EINVAL.
2) Missing/implied flags: Test to make sure that if unsharing
namespace without specifying unsharing of filesystem, correctly
unshares both namespace and filesystem information.
3) For each of the four (namespace, filesystem, files and vm)
supported unsharing, verify that the system call correctly
unshares the appropriate structure. Verify that unsharing
them individually as well as in combination with each
other works as expected.
4) Concurrent execution: Use shared memory segments and futex on
an address in the shm segment to synchronize execution of
about 10 threads. Have a couple of threads execute execve,
a couple _exit and the rest unshare with different combination
of flags. Verify that unsharing is performed as expected and
that there are no oops or hangs.
9) Future Work
--------------
The current implementation of unshare does not allow unsharing of
signals and signal handlers. Signals are complex to begin with and
to unshare signals and/or signal handlers of a currently running
process is even more complex. If in the future there is a specific
need to allow unsharing of signals and/or signal handlers, it can
be incrementally added to unshare without affecting legacy
applications using unshare.

View File

@ -0,0 +1,306 @@
ET61X[12]51 PC Camera Controllers
Driver for Linux
=================================
- Documentation -
Index
=====
1. Copyright
2. Disclaimer
3. License
4. Overview and features
5. Module dependencies
6. Module loading
7. Module parameters
8. Optional device control through "sysfs"
9. Supported devices
10. Notes for V4L2 application developers
11. Contact information
1. Copyright
============
Copyright (C) 2006 by Luca Risolia <luca.risolia@studio.unibo.it>
2. Disclaimer
=============
Etoms is a trademark of Etoms Electronics Corp.
This software is not developed or sponsored by Etoms Electronics.
3. License
==========
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
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.
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., 675 Mass Ave, Cambridge, MA 02139, USA.
4. Overview and features
========================
This driver supports the video interface of the devices mounting the ET61X151
or ET61X251 PC Camera Controllers.
It's worth to note that Etoms Electronics has never collaborated with the
author during the development of this project; despite several requests,
Etoms Electronics also refused to release enough detailed specifications of
the video compression engine.
The driver relies on the Video4Linux2 and USB core modules. It has been
designed to run properly on SMP systems as well.
The latest version of the ET61X[12]51 driver can be found at the following URL:
http://www.linux-projects.org/
Some of the features of the driver are:
- full compliance with the Video4Linux2 API (see also "Notes for V4L2
application developers" paragraph);
- available mmap or read/poll methods for video streaming through isochronous
data transfers;
- automatic detection of image sensor;
- support for any window resolutions and optional panning within the maximum
pixel area of image sensor;
- image downscaling with arbitrary scaling factors from 1 and 2 in both
directions (see "Notes for V4L2 application developers" paragraph);
- two different video formats for uncompressed or compressed data in low or
high compression quality (see also "Notes for V4L2 application developers"
paragraph);
- full support for the capabilities of every possible image sensors that can
be connected to the ET61X[12]51 bridges, including, for istance, red, green,
blue and global gain adjustments and exposure control (see "Supported
devices" paragraph for details);
- use of default color settings for sunlight conditions;
- dynamic I/O interface for both ET61X[12]51 and image sensor control (see
"Optional device control through 'sysfs'" paragraph);
- dynamic driver control thanks to various module parameters (see "Module
parameters" paragraph);
- up to 64 cameras can be handled at the same time; they can be connected and
disconnected from the host many times without turning off the computer, if
the system supports hotplugging;
- no known bugs.
5. Module dependencies
======================
For it to work properly, the driver needs kernel support for Video4Linux and
USB.
The following options of the kernel configuration file must be enabled and
corresponding modules must be compiled:
# Multimedia devices
#
CONFIG_VIDEO_DEV=m
To enable advanced debugging functionality on the device through /sysfs:
# Multimedia devices
#
CONFIG_VIDEO_ADV_DEBUG=y
# USB support
#
CONFIG_USB=m
In addition, depending on the hardware being used, the modules below are
necessary:
# USB Host Controller Drivers
#
CONFIG_USB_EHCI_HCD=m
CONFIG_USB_UHCI_HCD=m
CONFIG_USB_OHCI_HCD=m
And finally:
# USB Multimedia devices
#
CONFIG_USB_ET61X251=m
6. Module loading
=================
To use the driver, it is necessary to load the "et61x251" module into memory
after every other module required: "videodev", "usbcore" and, depending on
the USB host controller you have, "ehci-hcd", "uhci-hcd" or "ohci-hcd".
Loading can be done as shown below:
[root@localhost home]# modprobe et61x251
At this point the devices should be recognized. You can invoke "dmesg" to
analyze kernel messages and verify that the loading process has gone well:
[user@localhost home]$ dmesg
7. Module parameters
====================
Module parameters are listed below:
-------------------------------------------------------------------------------
Name: video_nr
Type: short array (min = 0, max = 64)
Syntax: <-1|n[,...]>
Description: Specify V4L2 minor mode number:
-1 = use next available
n = use minor number n
You can specify up to 64 cameras this way.
For example:
video_nr=-1,2,-1 would assign minor number 2 to the second
registered camera and use auto for the first one and for every
other camera.
Default: -1
-------------------------------------------------------------------------------
Name: force_munmap
Type: bool array (min = 0, max = 64)
Syntax: <0|1[,...]>
Description: Force the application to unmap previously mapped buffer memory
before calling any VIDIOC_S_CROP or VIDIOC_S_FMT ioctl's. Not
all the applications support this feature. This parameter is
specific for each detected camera.
0 = do not force memory unmapping
1 = force memory unmapping (save memory)
Default: 0
-------------------------------------------------------------------------------
Name: debug
Type: ushort
Syntax: <n>
Description: Debugging information level, from 0 to 3:
0 = none (use carefully)
1 = critical errors
2 = significant informations
3 = more verbose messages
Level 3 is useful for testing only, when only one device
is used at the same time. It also shows some more informations
about the hardware being detected. This module parameter can be
changed at runtime thanks to the /sys filesystem interface.
Default: 2
-------------------------------------------------------------------------------
8. Optional device control through "sysfs"
==========================================
If the kernel has been compiled with the CONFIG_VIDEO_ADV_DEBUG option enabled,
it is possible to read and write both the ET61X[12]51 and the image sensor
registers by using the "sysfs" filesystem interface.
There are four files in the /sys/class/video4linux/videoX directory for each
registered camera: "reg", "val", "i2c_reg" and "i2c_val". The first two files
control the ET61X[12]51 bridge, while the other two control the sensor chip.
"reg" and "i2c_reg" hold the values of the current register index where the
following reading/writing operations are addressed at through "val" and
"i2c_val". Their use is not intended for end-users, unless you know what you
are doing. Remember that you must be logged in as root before writing to them.
As an example, suppose we were to want to read the value contained in the
register number 1 of the sensor register table - which is usually the product
identifier - of the camera registered as "/dev/video0":
[root@localhost #] cd /sys/class/video4linux/video0
[root@localhost #] echo 1 > i2c_reg
[root@localhost #] cat i2c_val
Note that if the sensor registers can not be read, "cat" will fail.
To avoid race conditions, all the I/O accesses to the files are serialized.
9. Supported devices
====================
None of the names of the companies as well as their products will be mentioned
here. They have never collaborated with the author, so no advertising.
From the point of view of a driver, what unambiguously identify a device are
its vendor and product USB identifiers. Below is a list of known identifiers of
devices mounting the ET61X[12]51 PC camera controllers:
Vendor ID Product ID
--------- ----------
0x102c 0x6151
0x102c 0x6251
0x102c 0x6253
0x102c 0x6254
0x102c 0x6255
0x102c 0x6256
0x102c 0x6257
0x102c 0x6258
0x102c 0x6259
0x102c 0x625a
0x102c 0x625b
0x102c 0x625c
0x102c 0x625d
0x102c 0x625e
0x102c 0x625f
0x102c 0x6260
0x102c 0x6261
0x102c 0x6262
0x102c 0x6263
0x102c 0x6264
0x102c 0x6265
0x102c 0x6266
0x102c 0x6267
0x102c 0x6268
0x102c 0x6269
The following image sensors are supported:
Model Manufacturer
----- ------------
TAS5130D1B Taiwan Advanced Sensor Corporation
All the available control settings of each image sensor are supported through
the V4L2 interface.
10. Notes for V4L2 application developers
========================================
This driver follows the V4L2 API specifications. In particular, it enforces two
rules:
- exactly one I/O method, either "mmap" or "read", is associated with each
file descriptor. Once it is selected, the application must close and reopen the
device to switch to the other I/O method;
- although it is not mandatory, previously mapped buffer memory should always
be unmapped before calling any "VIDIOC_S_CROP" or "VIDIOC_S_FMT" ioctl's.
The same number of buffers as before will be allocated again to match the size
of the new video frames, so you have to map the buffers again before any I/O
attempts on them.
Consistently with the hardware limits, this driver also supports image
downscaling with arbitrary scaling factors from 1 and 2 in both directions.
However, the V4L2 API specifications don't correctly define how the scaling
factor can be chosen arbitrarily by the "negotiation" of the "source" and
"target" rectangles. To work around this flaw, we have added the convention
that, during the negotiation, whenever the "VIDIOC_S_CROP" ioctl is issued, the
scaling factor is restored to 1.
This driver supports two different video formats: the first one is the "8-bit
Sequential Bayer" format and can be used to obtain uncompressed video data
from the device through the current I/O method, while the second one provides
"raw" compressed video data (without frame headers not related to the
compressed data). The current compression quality may vary from 0 to 1 and can
be selected or queried thanks to the VIDIOC_S_JPEGCOMP and VIDIOC_G_JPEGCOMP
V4L2 ioctl's.
11. Contact information
=======================
The author may be contacted by e-mail at <luca.risolia@studio.unibo.it>.
GPG/PGP encrypted e-mail's are accepted. The GPG key ID of the author is
'FCE635A4'; the public 1024-bit key should be available at any keyserver;
the fingerprint is: '88E8 F32F 7244 68BA 3958 5D40 99DA 5D2A FCE6 35A4'.

View File

@ -17,16 +17,15 @@ Index
7. Module parameters 7. Module parameters
8. Optional device control through "sysfs" 8. Optional device control through "sysfs"
9. Supported devices 9. Supported devices
10. How to add plug-in's for new image sensors 10. Notes for V4L2 application developers
11. Notes for V4L2 application developers 11. Video frame formats
12. Video frame formats 12. Contact information
13. Contact information 13. Credits
14. Credits
1. Copyright 1. Copyright
============ ============
Copyright (C) 2004-2005 by Luca Risolia <luca.risolia@studio.unibo.it> Copyright (C) 2004-2006 by Luca Risolia <luca.risolia@studio.unibo.it>
2. Disclaimer 2. Disclaimer
@ -54,9 +53,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
4. Overview and features 4. Overview and features
======================== ========================
This driver attempts to support the video and audio streaming capabilities of This driver attempts to support the video interface of the devices mounting the
the devices mounting the SONiX SN9C101, SN9C102 and SN9C103 PC Camera SONiX SN9C101, SN9C102 and SN9C103 PC Camera Controllers.
Controllers.
It's worth to note that SONiX has never collaborated with the author during the It's worth to note that SONiX has never collaborated with the author during the
development of this project, despite several requests for enough detailed development of this project, despite several requests for enough detailed
@ -78,6 +76,7 @@ Some of the features of the driver are:
- available mmap or read/poll methods for video streaming through isochronous - available mmap or read/poll methods for video streaming through isochronous
data transfers; data transfers;
- automatic detection of image sensor; - automatic detection of image sensor;
- support for built-in microphone interface;
- support for any window resolutions and optional panning within the maximum - support for any window resolutions and optional panning within the maximum
pixel area of image sensor; pixel area of image sensor;
- image downscaling with arbitrary scaling factors from 1, 2 and 4 in both - image downscaling with arbitrary scaling factors from 1, 2 and 4 in both
@ -96,7 +95,7 @@ Some of the features of the driver are:
parameters" paragraph); parameters" paragraph);
- up to 64 cameras can be handled at the same time; they can be connected and - up to 64 cameras can be handled at the same time; they can be connected and
disconnected from the host many times without turning off the computer, if disconnected from the host many times without turning off the computer, if
your system supports hotplugging; the system supports hotplugging;
- no known bugs. - no known bugs.
@ -112,6 +111,12 @@ corresponding modules must be compiled:
# #
CONFIG_VIDEO_DEV=m CONFIG_VIDEO_DEV=m
To enable advanced debugging functionality on the device through /sysfs:
# Multimedia devices
#
CONFIG_VIDEO_ADV_DEBUG=y
# USB support # USB support
# #
CONFIG_USB=m CONFIG_USB=m
@ -125,6 +130,21 @@ necessary:
CONFIG_USB_UHCI_HCD=m CONFIG_USB_UHCI_HCD=m
CONFIG_USB_OHCI_HCD=m CONFIG_USB_OHCI_HCD=m
The SN9C103 controller also provides a built-in microphone interface. It is
supported by the USB Audio driver thanks to the ALSA API:
# Sound
#
CONFIG_SOUND=y
# Advanced Linux Sound Architecture
#
CONFIG_SND=m
# USB devices
#
CONFIG_SND_USB_AUDIO=m
And finally: And finally:
# USB Multimedia devices # USB Multimedia devices
@ -153,7 +173,7 @@ analyze kernel messages and verify that the loading process has gone well:
Module parameters are listed below: Module parameters are listed below:
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Name: video_nr Name: video_nr
Type: int array (min = 0, max = 64) Type: short array (min = 0, max = 64)
Syntax: <-1|n[,...]> Syntax: <-1|n[,...]>
Description: Specify V4L2 minor mode number: Description: Specify V4L2 minor mode number:
-1 = use next available -1 = use next available
@ -165,19 +185,19 @@ Description: Specify V4L2 minor mode number:
other camera. other camera.
Default: -1 Default: -1
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Name: force_munmap; Name: force_munmap
Type: bool array (min = 0, max = 64) Type: bool array (min = 0, max = 64)
Syntax: <0|1[,...]> Syntax: <0|1[,...]>
Description: Force the application to unmap previously mapped buffer memory Description: Force the application to unmap previously mapped buffer memory
before calling any VIDIOC_S_CROP or VIDIOC_S_FMT ioctl's. Not before calling any VIDIOC_S_CROP or VIDIOC_S_FMT ioctl's. Not
all the applications support this feature. This parameter is all the applications support this feature. This parameter is
specific for each detected camera. specific for each detected camera.
0 = do not force memory unmapping" 0 = do not force memory unmapping
1 = force memory unmapping (save memory)" 1 = force memory unmapping (save memory)
Default: 0 Default: 0
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Name: debug Name: debug
Type: int Type: ushort
Syntax: <n> Syntax: <n>
Description: Debugging information level, from 0 to 3: Description: Debugging information level, from 0 to 3:
0 = none (use carefully) 0 = none (use carefully)
@ -187,14 +207,15 @@ Description: Debugging information level, from 0 to 3:
Level 3 is useful for testing only, when only one device Level 3 is useful for testing only, when only one device
is used. It also shows some more informations about the is used. It also shows some more informations about the
hardware being detected. This parameter can be changed at hardware being detected. This parameter can be changed at
runtime thanks to the /sys filesystem. runtime thanks to the /sys filesystem interface.
Default: 2 Default: 2
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
8. Optional device control through "sysfs" [1] 8. Optional device control through "sysfs" [1]
========================================== ==========================================
It is possible to read and write both the SN9C10x and the image sensor If the kernel has been compiled with the CONFIG_VIDEO_ADV_DEBUG option enabled,
it is possible to read and write both the SN9C10x and the image sensor
registers by using the "sysfs" filesystem interface. registers by using the "sysfs" filesystem interface.
Every time a supported device is recognized, a write-only file named "green" is Every time a supported device is recognized, a write-only file named "green" is
@ -236,7 +257,7 @@ serialized.
The sysfs interface also provides the "frame_header" entry, which exports the The sysfs interface also provides the "frame_header" entry, which exports the
frame header of the most recent requested and captured video frame. The header frame header of the most recent requested and captured video frame. The header
is 12-bytes long and is appended to every video frame by the SN9C10x is always 18-bytes long and is appended to every video frame by the SN9C10x
controllers. As an example, this additional information can be used by the user controllers. As an example, this additional information can be used by the user
application for implementing auto-exposure features via software. application for implementing auto-exposure features via software.
@ -250,7 +271,8 @@ Byte # Value Description
0x03 0xC4 Frame synchronisation pattern. 0x03 0xC4 Frame synchronisation pattern.
0x04 0xC4 Frame synchronisation pattern. 0x04 0xC4 Frame synchronisation pattern.
0x05 0x96 Frame synchronisation pattern. 0x05 0x96 Frame synchronisation pattern.
0x06 0x00 or 0x01 Unknown meaning. The exact value depends on the chip. 0x06 0xXX Unknown meaning. The exact value depends on the chip;
possible values are 0x00, 0x01 and 0x20.
0x07 0xXX Variable value, whose bits are ff00uzzc, where ff is a 0x07 0xXX Variable value, whose bits are ff00uzzc, where ff is a
frame counter, u is unknown, zz is a size indicator frame counter, u is unknown, zz is a size indicator
(00 = VGA, 01 = SIF, 10 = QSIF) and c stands for (00 = VGA, 01 = SIF, 10 = QSIF) and c stands for
@ -267,12 +289,23 @@ Byte # Value Description
times the area outside of the specified AE area. For times the area outside of the specified AE area. For
images that are not pure white, the value scales down images that are not pure white, the value scales down
according to relative whiteness. according to relative whiteness.
according to relative whiteness.
The following bytes are used by the SN9C103 bridge only:
0x0C 0xXX Unknown meaning
0x0D 0xXX Unknown meaning
0x0E 0xXX Unknown meaning
0x0F 0xXX Unknown meaning
0x10 0xXX Unknown meaning
0x11 0xXX Unknown meaning
The AE area (sx, sy, ex, ey) in the active window can be set by programming the The AE area (sx, sy, ex, ey) in the active window can be set by programming the
registers 0x1c, 0x1d, 0x1e and 0x1f of the SN9C10x controllers, where one unit registers 0x1c, 0x1d, 0x1e and 0x1f of the SN9C10x controllers, where one unit
corresponds to 32 pixels. corresponds to 32 pixels.
[1] The frame header has been documented by Bertrik Sikken. [1] Part of the meaning of the frame header has been documented by Bertrik
Sikken.
9. Supported devices 9. Supported devices
@ -298,6 +331,7 @@ Vendor ID Product ID
0x0c45 0x602b 0x0c45 0x602b
0x0c45 0x602c 0x0c45 0x602c
0x0c45 0x602d 0x0c45 0x602d
0x0c45 0x602e
0x0c45 0x6030 0x0c45 0x6030
0x0c45 0x6080 0x0c45 0x6080
0x0c45 0x6082 0x0c45 0x6082
@ -348,18 +382,7 @@ appreciated. Non-available hardware will not be supported by the author of this
driver. driver.
10. How to add plug-in's for new image sensors 10. Notes for V4L2 application developers
==============================================
It should be easy to write plug-in's for new sensors by using the small API
that has been created for this purpose, which is present in "sn9c102_sensor.h"
(documentation is included there). As an example, have a look at the code in
"sn9c102_pas106b.c", which uses the mentioned interface.
At the moment, possible unsupported image sensors are: CIS-VF10 (VGA),
OV7620 (VGA), OV7630 (VGA).
11. Notes for V4L2 application developers
========================================= =========================================
This driver follows the V4L2 API specifications. In particular, it enforces two This driver follows the V4L2 API specifications. In particular, it enforces two
rules: rules:
@ -394,7 +417,7 @@ initialized (as described in the documentation of the API for the image sensors
supplied by this driver). supplied by this driver).
12. Video frame formats [1] 11. Video frame formats [1]
======================= =======================
The SN9C10x PC Camera Controllers can send images in two possible video The SN9C10x PC Camera Controllers can send images in two possible video
formats over the USB: either native "Sequential RGB Bayer" or Huffman formats over the USB: either native "Sequential RGB Bayer" or Huffman
@ -455,7 +478,7 @@ The following Huffman codes have been found:
documented by Bertrik Sikken. documented by Bertrik Sikken.
13. Contact information 12. Contact information
======================= =======================
The author may be contacted by e-mail at <luca.risolia@studio.unibo.it>. The author may be contacted by e-mail at <luca.risolia@studio.unibo.it>.
@ -464,7 +487,7 @@ GPG/PGP encrypted e-mail's are accepted. The GPG key ID of the author is
the fingerprint is: '88E8 F32F 7244 68BA 3958 5D40 99DA 5D2A FCE6 35A4'. the fingerprint is: '88E8 F32F 7244 68BA 3958 5D40 99DA 5D2A FCE6 35A4'.
14. Credits 13. Credits
=========== ===========
Many thanks to following persons for their contribute (listed in alphabetical Many thanks to following persons for their contribute (listed in alphabetical
order): order):
@ -480,5 +503,5 @@ order):
- Bertrik Sikken, who reverse-engineered and documented the Huffman compression - Bertrik Sikken, who reverse-engineered and documented the Huffman compression
algorithm used in the SN9C10x controllers and implemented the first decoder; algorithm used in the SN9C10x controllers and implemented the first decoder;
- Mizuno Takafumi for the donation of a webcam; - Mizuno Takafumi for the donation of a webcam;
- An "anonymous" donator (who didn't want his name to be revealed) for the - an "anonymous" donator (who didn't want his name to be revealed) for the
donation of a webcam. donation of a webcam.

View File

@ -57,16 +57,12 @@ based cameras should be supported as well.
The driver is divided into two modules: the basic one, "w9968cf", is needed for The driver is divided into two modules: the basic one, "w9968cf", is needed for
the supported devices to work; the second one, "w9968cf-vpp", is an optional the supported devices to work; the second one, "w9968cf-vpp", is an optional
module, which provides some useful video post-processing functions like video module, which provides some useful video post-processing functions like video
decoding, up-scaling and colour conversions. Once the driver is installed, decoding, up-scaling and colour conversions.
every time an application tries to open a recognized device, "w9968cf" checks
the presence of the "w9968cf-vpp" module and loads it automatically by default.
Please keep in mind that official kernels do not include the second module for Note that the official kernels do neither include nor support the second
performance purposes. However it is always recommended to download and install module for performance purposes. Therefore, it is always recommended to
the latest and complete release of the driver, replacing the existing one, if download and install the latest and complete release of the driver,
present: it will be still even possible not to load the "w9968cf-vpp" module at replacing the existing one, if present.
all, if you ever want to. Another important missing feature of the version in
the official Linux 2.4 kernels is the writeable /proc filesystem interface.
The latest and full-featured version of the W996[87]CF driver can be found at: The latest and full-featured version of the W996[87]CF driver can be found at:
http://www.linux-projects.org. Please refer to the documentation included in http://www.linux-projects.org. Please refer to the documentation included in
@ -201,22 +197,6 @@ Note: The kernel must be compiled with the CONFIG_KMOD option
enabled for the 'ovcamchip' module to be loaded and for enabled for the 'ovcamchip' module to be loaded and for
this parameter to be present. this parameter to be present.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Name: vppmod_load
Type: bool
Syntax: <0|1>
Description: Automatic 'w9968cf-vpp' module loading: 0 disabled, 1 enabled.
If enabled, every time an application attempts to open a
camera, 'insmod' searches for the video post-processing module
in the system and loads it automatically (if present).
The optional 'w9968cf-vpp' module adds extra image manipulation
capabilities to the 'w9968cf' module,like software up-scaling,
colour conversions and video decompression for very high frame
rates.
Default: 1
Note: The kernel must be compiled with the CONFIG_KMOD option
enabled for the 'w9968cf-vpp' module to be loaded and for
this parameter to be present.
-------------------------------------------------------------------------------
Name: simcams Name: simcams
Type: int Type: int
Syntax: <n> Syntax: <n>

View File

@ -42,4 +42,4 @@
41 -> Hauppauge WinTV-HVR1100 DVB-T/Hybrid (Low Profile) [0070:9800,0070:9802] 41 -> Hauppauge WinTV-HVR1100 DVB-T/Hybrid (Low Profile) [0070:9800,0070:9802]
42 -> digitalnow DNTV Live! DVB-T Pro [1822:0025] 42 -> digitalnow DNTV Live! DVB-T Pro [1822:0025]
43 -> KWorld/VStream XPert DVB-T with cx22702 [17de:08a1] 43 -> KWorld/VStream XPert DVB-T with cx22702 [17de:08a1]
44 -> DViCO FusionHDTV DVB-T Dual Digital [18ac:db50] 44 -> DViCO FusionHDTV DVB-T Dual Digital [18ac:db50,18ac:db54]

View File

@ -1,7 +1,7 @@
0 -> UNKNOWN/GENERIC 0 -> UNKNOWN/GENERIC
1 -> Proteus Pro [philips reference design] [1131:2001,1131:2001] 1 -> Proteus Pro [philips reference design] [1131:2001,1131:2001]
2 -> LifeView FlyVIDEO3000 [5168:0138,4e42:0138] 2 -> LifeView FlyVIDEO3000 [5168:0138,4e42:0138]
3 -> LifeView FlyVIDEO2000 [5168:0138] 3 -> LifeView/Typhoon FlyVIDEO2000 [5168:0138,4e42:0138]
4 -> EMPRESS [1131:6752] 4 -> EMPRESS [1131:6752]
5 -> SKNet Monster TV [1131:4e85] 5 -> SKNet Monster TV [1131:4e85]
6 -> Tevion MD 9717 6 -> Tevion MD 9717
@ -13,7 +13,7 @@
12 -> Medion 7134 [16be:0003] 12 -> Medion 7134 [16be:0003]
13 -> Typhoon TV+Radio 90031 13 -> Typhoon TV+Radio 90031
14 -> ELSA EX-VISION 300TV [1048:226b] 14 -> ELSA EX-VISION 300TV [1048:226b]
15 -> ELSA EX-VISION 500TV [1048:226b] 15 -> ELSA EX-VISION 500TV [1048:226a]
16 -> ASUS TV-FM 7134 [1043:4842,1043:4830,1043:4840] 16 -> ASUS TV-FM 7134 [1043:4842,1043:4830,1043:4840]
17 -> AOPEN VA1000 POWER [1131:7133] 17 -> AOPEN VA1000 POWER [1131:7133]
18 -> BMK MPEX No Tuner 18 -> BMK MPEX No Tuner
@ -53,12 +53,12 @@
52 -> AverMedia AverTV/305 [1461:2108] 52 -> AverMedia AverTV/305 [1461:2108]
53 -> ASUS TV-FM 7135 [1043:4845] 53 -> ASUS TV-FM 7135 [1043:4845]
54 -> LifeView FlyTV Platinum FM [5168:0214,1489:0214] 54 -> LifeView FlyTV Platinum FM [5168:0214,1489:0214]
55 -> LifeView FlyDVB-T DUO [5168:0502,5168:0306] 55 -> LifeView FlyDVB-T DUO [5168:0306]
56 -> Avermedia AVerTV 307 [1461:a70a] 56 -> Avermedia AVerTV 307 [1461:a70a]
57 -> Avermedia AVerTV GO 007 FM [1461:f31f] 57 -> Avermedia AVerTV GO 007 FM [1461:f31f]
58 -> ADS Tech Instant TV (saa7135) [1421:0350,1421:0351,1421:0370,1421:1370] 58 -> ADS Tech Instant TV (saa7135) [1421:0350,1421:0351,1421:0370,1421:1370]
59 -> Kworld/Tevion V-Stream Xpert TV PVR7134 59 -> Kworld/Tevion V-Stream Xpert TV PVR7134
60 -> Typhoon DVB-T Duo Digital/Analog Cardbus [4e42:0502] 60 -> LifeView/Typhoon FlyDVB-T Duo Cardbus [5168:0502,4e42:0502]
61 -> Philips TOUGH DVB-T reference design [1131:2004] 61 -> Philips TOUGH DVB-T reference design [1131:2004]
62 -> Compro VideoMate TV Gold+II 62 -> Compro VideoMate TV Gold+II
63 -> Kworld Xpert TV PVR7134 63 -> Kworld Xpert TV PVR7134
@ -75,7 +75,7 @@
74 -> LifeView FlyTV Platinum Mini2 [14c0:1212] 74 -> LifeView FlyTV Platinum Mini2 [14c0:1212]
75 -> AVerMedia AVerTVHD MCE A180 [1461:1044] 75 -> AVerMedia AVerTVHD MCE A180 [1461:1044]
76 -> SKNet MonsterTV Mobile [1131:4ee9] 76 -> SKNet MonsterTV Mobile [1131:4ee9]
77 -> Pinnacle PCTV 110i (saa7133) [11bd:002e] 77 -> Pinnacle PCTV 40i/50i/110i (saa7133) [11bd:002e]
78 -> ASUSTeK P7131 Dual [1043:4862] 78 -> ASUSTeK P7131 Dual [1043:4862]
79 -> Sedna/MuchTV PC TV Cardbus TV/Radio (ITO25 Rev:2B) 79 -> Sedna/MuchTV PC TV Cardbus TV/Radio (ITO25 Rev:2B)
80 -> ASUS Digimatrix TV [1043:0210] 80 -> ASUS Digimatrix TV [1043:0210]

View File

@ -0,0 +1,129 @@
Page migration
--------------
Page migration allows the moving of the physical location of pages between
nodes in a numa system while the process is running. This means that the
virtual addresses that the process sees do not change. However, the
system rearranges the physical location of those pages.
The main intend of page migration is to reduce the latency of memory access
by moving pages near to the processor where the process accessing that memory
is running.
Page migration allows a process to manually relocate the node on which its
pages are located through the MF_MOVE and MF_MOVE_ALL options while setting
a new memory policy. The pages of process can also be relocated
from another process using the sys_migrate_pages() function call. The
migrate_pages function call takes two sets of nodes and moves pages of a
process that are located on the from nodes to the destination nodes.
Manual migration is very useful if for example the scheduler has relocated
a process to a processor on a distant node. A batch scheduler or an
administrator may detect the situation and move the pages of the process
nearer to the new processor. At some point in the future we may have
some mechanism in the scheduler that will automatically move the pages.
Larger installations usually partition the system using cpusets into
sections of nodes. Paul Jackson has equipped cpusets with the ability to
move pages when a task is moved to another cpuset. This allows automatic
control over locality of a process. If a task is moved to a new cpuset
then also all its pages are moved with it so that the performance of the
process does not sink dramatically (as is the case today).
Page migration allows the preservation of the relative location of pages
within a group of nodes for all migration techniques which will preserve a
particular memory allocation pattern generated even after migrating a
process. This is necessary in order to preserve the memory latencies.
Processes will run with similar performance after migration.
Page migration occurs in several steps. First a high level
description for those trying to use migrate_pages() and then
a low level description of how the low level details work.
A. Use of migrate_pages()
-------------------------
1. Remove pages from the LRU.
Lists of pages to be migrated are generated by scanning over
pages and moving them into lists. This is done by
calling isolate_lru_page() or __isolate_lru_page().
Calling isolate_lru_page increases the references to the page
so that it cannot vanish under us.
2. Generate a list of newly allocates page to move the contents
of the first list to.
3. The migrate_pages() function is called which attempts
to do the migration. It returns the moved pages in the
list specified as the third parameter and the failed
migrations in the fourth parameter. The first parameter
will contain the pages that could still be retried.
4. The leftover pages of various types are returned
to the LRU using putback_to_lru_pages() or otherwise
disposed of. The pages will still have the refcount as
increased by isolate_lru_pages()!
B. Operation of migrate_pages()
--------------------------------
migrate_pages does several passes over its list of pages. A page is moved
if all references to a page are removable at the time.
Steps:
1. Lock the page to be migrated
2. Insure that writeback is complete.
3. Make sure that the page has assigned swap cache entry if
it is an anonyous page. The swap cache reference is necessary
to preserve the information contain in the page table maps.
4. Prep the new page that we want to move to. It is locked
and set to not being uptodate so that all accesses to the new
page immediately lock while we are moving references.
5. All the page table references to the page are either dropped (file backed)
or converted to swap references (anonymous pages). This should decrease the
reference count.
6. The radix tree lock is taken
7. The refcount of the page is examined and we back out if references remain
otherwise we know that we are the only one referencing this page.
8. The radix tree is checked and if it does not contain the pointer to this
page then we back out.
9. The mapping is checked. If the mapping is gone then a truncate action may
be in progress and we back out.
10. The new page is prepped with some settings from the old page so that accesses
to the new page will be discovered to have the correct settings.
11. The radix tree is changed to point to the new page.
12. The reference count of the old page is dropped because the reference has now
been removed.
13. The radix tree lock is dropped.
14. The page contents are copied to the new page.
15. The remaining page flags are copied to the new page.
16. The old page flags are cleared to indicate that the page does
not use any information anymore.
17. Queued up writeback on the new page is triggered.
18. If swap pte's were generated for the page then remove them again.
19. The locks are dropped from the old and new page.
20. The new page is moved to the LRU.
Christoph Lameter, December 19, 2005.

View File

@ -40,6 +40,22 @@ APICs
no_timer_check Don't check the IO-APIC timer. This can work around no_timer_check Don't check the IO-APIC timer. This can work around
problems with incorrect timer initialization on some boards. problems with incorrect timer initialization on some boards.
apicmaintimer Run time keeping from the local APIC timer instead
of using the PIT/HPET interrupt for this. This is useful
when the PIT/HPET interrupts are unreliable.
noapicmaintimer Don't do time keeping using the APIC timer.
Useful when this option was auto selected, but doesn't work.
apicpmtimer
Do APIC timer calibration using the pmtimer. Implies
apicmaintimer. Useful when your PIT timer is totally
broken.
disable_8254_timer / enable_8254_timer
Enable interrupt 0 timer routing over the 8254 in addition to over
the IO-APIC. The kernel tries to set a sensible default.
Early Console Early Console
syntax: earlyprintk=vga syntax: earlyprintk=vga

View File

@ -540,7 +540,8 @@ S: Supported
BTTV VIDEO4LINUX DRIVER BTTV VIDEO4LINUX DRIVER
P: Mauro Carvalho Chehab P: Mauro Carvalho Chehab
M: mchehab@brturbo.com.br M: mchehab@infradead.org
M: v4l-dvb-maintainer@linuxtv.org
L: video4linux-list@redhat.com L: video4linux-list@redhat.com
W: http://linuxtv.org W: http://linuxtv.org
T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/v4l-dvb.git T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/v4l-dvb.git
@ -557,7 +558,8 @@ S: Supported
CONFIGFS CONFIGFS
P: Joel Becker P: Joel Becker
M: Joel Becker <joel.becker@oracle.com> M: joel.becker@oracle.com
L: linux-kernel@vger.kernel.org
S: Supported S: Supported
CIRRUS LOGIC GENERIC FBDEV DRIVER CIRRUS LOGIC GENERIC FBDEV DRIVER
@ -836,11 +838,11 @@ S: Maintained
DVB SUBSYSTEM AND DRIVERS DVB SUBSYSTEM AND DRIVERS
P: LinuxTV.org Project P: LinuxTV.org Project
M: linux-dvb-maintainer@linuxtv.org M: v4l-dvb-maintainer@linuxtv.org
L: linux-dvb@linuxtv.org (subscription required) L: linux-dvb@linuxtv.org (subscription required)
W: http://linuxtv.org/ W: http://linuxtv.org/
T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/v4l-dvb.git T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/v4l-dvb.git
S: Supported S: Maintained
EATA-DMA SCSI DRIVER EATA-DMA SCSI DRIVER
P: Michael Neuffer P: Michael Neuffer
@ -928,6 +930,12 @@ M: sct@redhat.com, akpm@osdl.org, adilger@clusterfs.com
L: ext3-users@redhat.com L: ext3-users@redhat.com
S: Maintained S: Maintained
F71805F HARDWARE MONITORING DRIVER
P: Jean Delvare
M: khali@linux-fr.org
L: lm-sensors@lm-sensors.org
S: Maintained
FARSYNC SYNCHRONOUS DRIVER FARSYNC SYNCHRONOUS DRIVER
P: Kevin Curtis P: Kevin Curtis
M: kevin.curtis@farsite.co.uk M: kevin.curtis@farsite.co.uk
@ -1176,8 +1184,8 @@ T: git kernel.org:/pub/scm/linux/kernel/git/aegl/linux-2.6.git
S: Maintained S: Maintained
SN-IA64 (Itanium) SUB-PLATFORM SN-IA64 (Itanium) SUB-PLATFORM
P: Greg Edwards P: Jes Sorensen
M: edwardsg@sgi.com M: jes@sgi.com
L: linux-altix@sgi.com L: linux-altix@sgi.com
L: linux-ia64@vger.kernel.org L: linux-ia64@vger.kernel.org
W: http://www.sgi.com/altix W: http://www.sgi.com/altix
@ -1623,8 +1631,8 @@ S: Supported
LINUX SECURITY MODULE (LSM) FRAMEWORK LINUX SECURITY MODULE (LSM) FRAMEWORK
P: Chris Wright P: Chris Wright
M: chrisw@osdl.org M: chrisw@sous-sol.org
L: linux-security-module@wirex.com L: linux-security-module@vger.kernel.org
W: http://lsm.immunix.org W: http://lsm.immunix.org
T: git kernel.org:/pub/scm/linux/kernel/git/chrisw/lsm-2.6.git T: git kernel.org:/pub/scm/linux/kernel/git/chrisw/lsm-2.6.git
S: Supported S: Supported
@ -1984,7 +1992,6 @@ M: philb@gnu.org
P: Tim Waugh P: Tim Waugh
M: tim@cyberelk.net M: tim@cyberelk.net
P: David Campbell P: David Campbell
M: campbell@torque.net
P: Andrea Arcangeli P: Andrea Arcangeli
M: andrea@suse.de M: andrea@suse.de
L: linux-parport@lists.infradead.org L: linux-parport@lists.infradead.org
@ -2224,7 +2231,23 @@ P: Martin Schwidefsky
M: schwidefsky@de.ibm.com M: schwidefsky@de.ibm.com
M: linux390@de.ibm.com M: linux390@de.ibm.com
L: linux-390@vm.marist.edu L: linux-390@vm.marist.edu
W: http://oss.software.ibm.com/developerworks/opensource/linux390 W: http://www.ibm.com/developerworks/linux/linux390/
S: Supported
S390 NETWORK DRIVERS
P: Frank Pavlic
M: fpavlic@de.ibm.com
M: linux390@de.ibm.com
L: linux-390@vm.marist.edu
W: http://www.ibm.com/developerworks/linux/linux390/
S: Supported
S390 ZFCP DRIVER
P: Andreas Herrmann
M: aherrman@de.ibm.com
M: linux390@de.ibm.com
L: linux-390@vm.marist.edu
W: http://www.ibm.com/developerworks/linux/linux390/
S: Supported S: Supported
SAA7146 VIDEO4LINUX-2 DRIVER SAA7146 VIDEO4LINUX-2 DRIVER
@ -2298,7 +2321,7 @@ S: Supported
SELINUX SECURITY MODULE SELINUX SECURITY MODULE
P: Stephen Smalley P: Stephen Smalley
M: sds@epoch.ncsc.mil M: sds@tycho.nsa.gov
P: James Morris P: James Morris
M: jmorris@namei.org M: jmorris@namei.org
L: linux-kernel@vger.kernel.org (kernel issues) L: linux-kernel@vger.kernel.org (kernel issues)
@ -2673,6 +2696,14 @@ M: dbrownell@users.sourceforge.net
L: linux-usb-devel@lists.sourceforge.net L: linux-usb-devel@lists.sourceforge.net
S: Maintained S: Maintained
USB ET61X[12]51 DRIVER
P: Luca Risolia
M: luca.risolia@studio.unibo.it
L: linux-usb-devel@lists.sourceforge.net
L: video4linux-list@redhat.com
W: http://www.linux-projects.org
S: Maintained
USB HID/HIDBP DRIVERS USB HID/HIDBP DRIVERS
P: Vojtech Pavlik P: Vojtech Pavlik
M: vojtech@suse.cz M: vojtech@suse.cz
@ -2836,6 +2867,7 @@ USB SN9C10x DRIVER
P: Luca Risolia P: Luca Risolia
M: luca.risolia@studio.unibo.it M: luca.risolia@studio.unibo.it
L: linux-usb-devel@lists.sourceforge.net L: linux-usb-devel@lists.sourceforge.net
L: video4linux-list@redhat.com
W: http://www.linux-projects.org W: http://www.linux-projects.org
S: Maintained S: Maintained
@ -2865,6 +2897,7 @@ USB W996[87]CF DRIVER
P: Luca Risolia P: Luca Risolia
M: luca.risolia@studio.unibo.it M: luca.risolia@studio.unibo.it
L: linux-usb-devel@lists.sourceforge.net L: linux-usb-devel@lists.sourceforge.net
L: video4linux-list@redhat.com
W: http://www.linux-projects.org W: http://www.linux-projects.org
S: Maintained S: Maintained
@ -2946,7 +2979,8 @@ S: Maintained
VIDEO FOR LINUX VIDEO FOR LINUX
P: Mauro Carvalho Chehab P: Mauro Carvalho Chehab
M: mchehab@brturbo.com.br M: mchehab@infradead.org
M: v4l-dvb-maintainer@linuxtv.org
L: video4linux-list@redhat.com L: video4linux-list@redhat.com
W: http://linuxtv.org W: http://linuxtv.org
T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/v4l-dvb.git T: git kernel.org:/pub/scm/linux/kernel/git/mchehab/v4l-dvb.git

View File

@ -1,7 +1,7 @@
VERSION = 2 VERSION = 2
PATCHLEVEL = 6 PATCHLEVEL = 6
SUBLEVEL = 16 SUBLEVEL = 16
EXTRAVERSION =-rc1 EXTRAVERSION =-rc6
NAME=Sliding Snow Leopard NAME=Sliding Snow Leopard
# *DOCUMENTATION* # *DOCUMENTATION*
@ -106,13 +106,12 @@ KBUILD_OUTPUT := $(shell cd $(KBUILD_OUTPUT) && /bin/pwd)
$(if $(KBUILD_OUTPUT),, \ $(if $(KBUILD_OUTPUT),, \
$(error output directory "$(saved-output)" does not exist)) $(error output directory "$(saved-output)" does not exist))
.PHONY: $(MAKECMDGOALS) cdbuilddir .PHONY: $(MAKECMDGOALS)
$(MAKECMDGOALS) _all: cdbuilddir
cdbuilddir: $(filter-out _all,$(MAKECMDGOALS)) _all:
$(if $(KBUILD_VERBOSE:1=),@)$(MAKE) -C $(KBUILD_OUTPUT) \ $(if $(KBUILD_VERBOSE:1=),@)$(MAKE) -C $(KBUILD_OUTPUT) \
KBUILD_SRC=$(CURDIR) \ KBUILD_SRC=$(CURDIR) \
KBUILD_EXTMOD="$(KBUILD_EXTMOD)" -f $(CURDIR)/Makefile $(MAKECMDGOALS) KBUILD_EXTMOD="$(KBUILD_EXTMOD)" -f $(CURDIR)/Makefile $@
# Leave processing to above invocation of make # Leave processing to above invocation of make
skip-makefile := 1 skip-makefile := 1
@ -442,7 +441,7 @@ export KBUILD_DEFCONFIG
config %config: scripts_basic outputmakefile FORCE config %config: scripts_basic outputmakefile FORCE
$(Q)mkdir -p include/linux $(Q)mkdir -p include/linux
$(Q)$(MAKE) $(build)=scripts/kconfig $@ $(Q)$(MAKE) $(build)=scripts/kconfig $@
$(Q)$(MAKE) .kernelrelease $(Q)$(MAKE) -C $(srctree) KBUILD_SRC= .kernelrelease
else else
# =========================================================================== # ===========================================================================
@ -906,7 +905,7 @@ define filechk_version.h
) )
endef endef
include/linux/version.h: $(srctree)/Makefile .config FORCE include/linux/version.h: $(srctree)/Makefile .config .kernelrelease FORCE
$(call filechk,version.h) $(call filechk,version.h)
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------

View File

@ -28,6 +28,7 @@ void foo(void)
DEFINE(TASK_GID, offsetof(struct task_struct, gid)); DEFINE(TASK_GID, offsetof(struct task_struct, gid));
DEFINE(TASK_EGID, offsetof(struct task_struct, egid)); DEFINE(TASK_EGID, offsetof(struct task_struct, egid));
DEFINE(TASK_REAL_PARENT, offsetof(struct task_struct, real_parent)); DEFINE(TASK_REAL_PARENT, offsetof(struct task_struct, real_parent));
DEFINE(TASK_GROUP_LEADER, offsetof(struct task_struct, group_leader));
DEFINE(TASK_TGID, offsetof(struct task_struct, tgid)); DEFINE(TASK_TGID, offsetof(struct task_struct, tgid));
BLANK(); BLANK();

View File

@ -879,17 +879,19 @@ sys_getxpid:
/* See linux/kernel/timer.c sys_getppid for discussion /* See linux/kernel/timer.c sys_getppid for discussion
about this loop. */ about this loop. */
ldq $3, TASK_REAL_PARENT($2) ldq $3, TASK_GROUP_LEADER($2)
1: ldl $1, TASK_TGID($3) ldq $4, TASK_REAL_PARENT($3)
ldl $0, TASK_TGID($2)
1: ldl $1, TASK_TGID($4)
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
mov $3, $4 mov $4, $5
mb mb
ldq $3, TASK_REAL_PARENT($2) ldq $3, TASK_GROUP_LEADER($2)
cmpeq $3, $4, $4 ldq $4, TASK_REAL_PARENT($3)
beq $4, 1b cmpeq $4, $5, $5
beq $5, 1b
#endif #endif
stq $1, 80($sp) stq $1, 80($sp)
ldl $0, TASK_TGID($2)
ret ret
.end sys_getxpid .end sys_getxpid

View File

@ -68,34 +68,32 @@ show_interrupts(struct seq_file *p, void *v)
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
int j; int j;
#endif #endif
int i = *(loff_t *) v; int irq = *(loff_t *) v;
struct irqaction * action; struct irqaction * action;
unsigned long flags; unsigned long flags;
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
if (i == 0) { if (irq == 0) {
seq_puts(p, " "); seq_puts(p, " ");
for (i = 0; i < NR_CPUS; i++) for_each_online_cpu(j)
if (cpu_online(i)) seq_printf(p, "CPU%d ", j);
seq_printf(p, "CPU%d ", i);
seq_putc(p, '\n'); seq_putc(p, '\n');
} }
#endif #endif
if (i < ACTUAL_NR_IRQS) { if (irq < ACTUAL_NR_IRQS) {
spin_lock_irqsave(&irq_desc[i].lock, flags); spin_lock_irqsave(&irq_desc[irq].lock, flags);
action = irq_desc[i].action; action = irq_desc[irq].action;
if (!action) if (!action)
goto unlock; goto unlock;
seq_printf(p, "%3d: ",i); seq_printf(p, "%3d: ", irq);
#ifndef CONFIG_SMP #ifndef CONFIG_SMP
seq_printf(p, "%10u ", kstat_irqs(i)); seq_printf(p, "%10u ", kstat_irqs(irq));
#else #else
for (j = 0; j < NR_CPUS; j++) for_each_online_cpu(j)
if (cpu_online(j)) seq_printf(p, "%10u ", kstat_cpu(j).irqs[irq]);
seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]);
#endif #endif
seq_printf(p, " %14s", irq_desc[i].handler->typename); seq_printf(p, " %14s", irq_desc[irq].handler->typename);
seq_printf(p, " %c%s", seq_printf(p, " %c%s",
(action->flags & SA_INTERRUPT)?'+':' ', (action->flags & SA_INTERRUPT)?'+':' ',
action->name); action->name);
@ -108,13 +106,12 @@ show_interrupts(struct seq_file *p, void *v)
seq_putc(p, '\n'); seq_putc(p, '\n');
unlock: unlock:
spin_unlock_irqrestore(&irq_desc[i].lock, flags); spin_unlock_irqrestore(&irq_desc[irq].lock, flags);
} else if (i == ACTUAL_NR_IRQS) { } else if (irq == ACTUAL_NR_IRQS) {
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
seq_puts(p, "IPI: "); seq_puts(p, "IPI: ");
for (i = 0; i < NR_CPUS; i++) for_each_online_cpu(j)
if (cpu_online(i)) seq_printf(p, "%10lu ", cpu_data[j].ipi_count);
seq_printf(p, "%10lu ", cpu_data[i].ipi_count);
seq_putc(p, '\n'); seq_putc(p, '\n');
#endif #endif
seq_printf(p, "ERR: %10lu\n", irq_err_count); seq_printf(p, "ERR: %10lu\n", irq_err_count);
@ -122,7 +119,6 @@ unlock:
return 0; return 0;
} }
/* /*
* handle_irq handles all normal device IRQ's (the special * handle_irq handles all normal device IRQ's (the special
* SMP cross-CPU interrupts have their own specific * SMP cross-CPU interrupts have their own specific
@ -155,8 +151,13 @@ handle_irq(int irq, struct pt_regs * regs)
} }
irq_enter(); irq_enter();
/*
* __do_IRQ() must be called with IPL_MAX. Note that we do not
* explicitly enable interrupts afterwards - some MILO PALcode
* (namely LX164 one) seems to have severe problems with RTI
* at IPL 0.
*/
local_irq_disable(); local_irq_disable();
__do_IRQ(irq, regs); __do_IRQ(irq, regs);
local_irq_enable();
irq_exit(); irq_exit();
} }

View File

@ -73,9 +73,6 @@ cpumask_t cpu_online_map;
EXPORT_SYMBOL(cpu_online_map); EXPORT_SYMBOL(cpu_online_map);
/* cpus reported in the hwrpb */
static unsigned long hwrpb_cpu_present_mask __initdata = 0;
int smp_num_probed; /* Internal processor count */ int smp_num_probed; /* Internal processor count */
int smp_num_cpus = 1; /* Number that came online. */ int smp_num_cpus = 1; /* Number that came online. */
@ -442,7 +439,7 @@ setup_smp(void)
if ((cpu->flags & 0x1cc) == 0x1cc) { if ((cpu->flags & 0x1cc) == 0x1cc) {
smp_num_probed++; smp_num_probed++;
/* Assume here that "whami" == index */ /* Assume here that "whami" == index */
hwrpb_cpu_present_mask |= (1UL << i); cpu_set(i, cpu_possible_map);
cpu->pal_revision = boot_cpu_palrev; cpu->pal_revision = boot_cpu_palrev;
} }
@ -453,12 +450,12 @@ setup_smp(void)
} }
} else { } else {
smp_num_probed = 1; smp_num_probed = 1;
hwrpb_cpu_present_mask = (1UL << boot_cpuid); cpu_set(boot_cpuid, cpu_possible_map);
} }
cpu_present_mask = cpumask_of_cpu(boot_cpuid); cpu_present_mask = cpumask_of_cpu(boot_cpuid);
printk(KERN_INFO "SMP: %d CPUs probed -- cpu_present_mask = %lx\n", printk(KERN_INFO "SMP: %d CPUs probed -- cpu_present_mask = %lx\n",
smp_num_probed, hwrpb_cpu_present_mask); smp_num_probed, cpu_possible_map.bits[0]);
} }
/* /*
@ -467,8 +464,6 @@ setup_smp(void)
void __init void __init
smp_prepare_cpus(unsigned int max_cpus) smp_prepare_cpus(unsigned int max_cpus)
{ {
int cpu_count, i;
/* Take care of some initial bookkeeping. */ /* Take care of some initial bookkeeping. */
memset(ipi_data, 0, sizeof(ipi_data)); memset(ipi_data, 0, sizeof(ipi_data));
@ -486,19 +481,7 @@ smp_prepare_cpus(unsigned int max_cpus)
printk(KERN_INFO "SMP starting up secondaries.\n"); printk(KERN_INFO "SMP starting up secondaries.\n");
cpu_count = 1; smp_num_cpus = smp_num_probed;
for (i = 0; (i < NR_CPUS) && (cpu_count < max_cpus); i++) {
if (i == boot_cpuid)
continue;
if (((hwrpb_cpu_present_mask >> i) & 1) == 0)
continue;
cpu_set(i, cpu_possible_map);
cpu_count++;
}
smp_num_cpus = cpu_count;
} }
void __devinit void __devinit

View File

@ -10,9 +10,9 @@ config ARM
default y default y
help help
The ARM series is a line of low-power-consumption RISC chip designs The ARM series is a line of low-power-consumption RISC chip designs
licensed by ARM ltd and targeted at embedded applications and licensed by ARM Ltd and targeted at embedded applications and
handhelds such as the Compaq IPAQ. ARM-based PCs are no longer handhelds such as the Compaq IPAQ. ARM-based PCs are no longer
manufactured, but legacy ARM-based PC hardware remains popular in manufactured, but legacy ARM-based PC hardware remains popular in
Europe. There is an ARM Linux project with a web page at Europe. There is an ARM Linux project with a web page at
<http://www.arm.linux.org.uk/>. <http://www.arm.linux.org.uk/>.
@ -69,57 +69,77 @@ config GENERIC_ISA_DMA
config FIQ config FIQ
bool bool
config ARCH_MTD_XIP
bool
source "init/Kconfig" source "init/Kconfig"
menu "System Type" menu "System Type"
choice choice
prompt "ARM system type" prompt "ARM system type"
default ARCH_RPC default ARCH_VERSATILE
config ARCH_CLPS7500 config ARCH_CLPS7500
bool "Cirrus-CL-PS7500FE" bool "Cirrus-CL-PS7500FE"
select TIMER_ACORN select TIMER_ACORN
select ISA select ISA
help
Support for the Cirrus Logic PS7500FE system-on-a-chip.
config ARCH_CLPS711X config ARCH_CLPS711X
bool "CLPS711x/EP721x-based" bool "CLPS711x/EP721x-based"
help
Support for Cirrus Logic 711x/721x based boards.
config ARCH_CO285 config ARCH_CO285
bool "Co-EBSA285" bool "Co-EBSA285"
select FOOTBRIDGE select FOOTBRIDGE
select FOOTBRIDGE_ADDIN select FOOTBRIDGE_ADDIN
help
Support for Intel's EBSA285 companion chip.
config ARCH_EBSA110 config ARCH_EBSA110
bool "EBSA-110" bool "EBSA-110"
select ISA select ISA
help help
This is an evaluation board for the StrongARM processor available This is an evaluation board for the StrongARM processor available
from Digital. It has limited hardware on-board, including an onboard from Digital. It has limited hardware on-board, including an
Ethernet interface, two PCMCIA sockets, two serial ports and a Ethernet interface, two PCMCIA sockets, two serial ports and a
parallel port. parallel port.
config ARCH_FOOTBRIDGE config ARCH_FOOTBRIDGE
bool "FootBridge" bool "FootBridge"
select FOOTBRIDGE select FOOTBRIDGE
help
Support for systems based on the DC21285 companion chip
("FootBridge"), such as the Simtec CATS and the Rebel NetWinder.
config ARCH_INTEGRATOR config ARCH_INTEGRATOR
bool "Integrator" bool "Integrator"
select ARM_AMBA select ARM_AMBA
select ICST525 select ICST525
help
Support for ARM's Integrator platform.
config ARCH_IOP3XX config ARCH_IOP3XX
bool "IOP3xx-based" bool "IOP3xx-based"
select PCI select PCI
help
Support for Intel's IOP3XX (XScale) family of processors.
config ARCH_IXP4XX config ARCH_IXP4XX
bool "IXP4xx-based" bool "IXP4xx-based"
select DMABOUNCE select DMABOUNCE
select PCI select PCI
help
Support for Intel's IXP4XX (XScale) family of processors.
config ARCH_IXP2000 config ARCH_IXP2000
bool "IXP2400/2800-based" bool "IXP2400/2800-based"
select PCI select PCI
help
Support for Intel's IXP2400/2800 (XScale) family of processors.
config ARCH_L7200 config ARCH_L7200
bool "LinkUp-L7200" bool "LinkUp-L7200"
@ -136,6 +156,9 @@ config ARCH_L7200
config ARCH_PXA config ARCH_PXA
bool "PXA2xx-based" bool "PXA2xx-based"
select ARCH_MTD_XIP
help
Support for Intel's PXA2XX processor line.
config ARCH_RPC config ARCH_RPC
bool "RiscPC" bool "RiscPC"
@ -152,19 +175,25 @@ config ARCH_SA1100
bool "SA1100-based" bool "SA1100-based"
select ISA select ISA
select ARCH_DISCONTIGMEM_ENABLE select ARCH_DISCONTIGMEM_ENABLE
select ARCH_MTD_XIP
help
Support for StrongARM 11x0 based boards.
config ARCH_S3C2410 config ARCH_S3C2410
bool "Samsung S3C2410" bool "Samsung S3C2410"
help help
Samsung S3C2410X CPU based systems, such as the Simtec Electronics Samsung S3C2410X CPU based systems, such as the Simtec Electronics
BAST (<http://www.simtec.co.uk/products/EB110ITX/>), the IPAQ 1940 or BAST (<http://www.simtec.co.uk/products/EB110ITX/>), the IPAQ 1940 or
the Samsung SMDK2410 development board (and derviatives). the Samsung SMDK2410 development board (and derivatives).
config ARCH_SHARK config ARCH_SHARK
bool "Shark" bool "Shark"
select ISA select ISA
select ISA_DMA select ISA_DMA
select PCI select PCI
help
Support for the StrongARM based Digital DNARD machine, also known
as "Shark" (<http://www.shark-linux.de/shark.html>).
config ARCH_LH7A40X config ARCH_LH7A40X
bool "Sharp LH7A40X" bool "Sharp LH7A40X"
@ -176,6 +205,8 @@ config ARCH_LH7A40X
config ARCH_OMAP config ARCH_OMAP
bool "TI OMAP" bool "TI OMAP"
help
Support for TI's OMAP platform (OMAP1 and OMAP2).
config ARCH_VERSATILE config ARCH_VERSATILE
bool "Versatile" bool "Versatile"
@ -194,6 +225,8 @@ config ARCH_REALVIEW
config ARCH_IMX config ARCH_IMX
bool "IMX" bool "IMX"
help
Support for Motorola's i.MX family of processors (MX1, MXL).
config ARCH_H720X config ARCH_H720X
bool "Hynix-HMS720x-based" bool "Hynix-HMS720x-based"
@ -210,8 +243,8 @@ config ARCH_AAEC2000
config ARCH_AT91RM9200 config ARCH_AT91RM9200
bool "AT91RM9200" bool "AT91RM9200"
help help
Say Y here if you intend to run this kernel on an AT91RM9200-based Say Y here if you intend to run this kernel on an Atmel
board. AT91RM9200-based board.
endchoice endchoice
@ -417,8 +450,8 @@ config AEABI
To use this you need GCC version 4.0.0 or later. To use this you need GCC version 4.0.0 or later.
config OABI_COMPAT config OABI_COMPAT
bool "Allow old ABI binaries to run with this kernel" bool "Allow old ABI binaries to run with this kernel (EXPERIMENTAL)"
depends on AEABI depends on AEABI && EXPERIMENTAL
default y default y
help help
This option preserves the old syscall interface along with the This option preserves the old syscall interface along with the
@ -766,6 +799,8 @@ source "drivers/i2c/Kconfig"
source "drivers/spi/Kconfig" source "drivers/spi/Kconfig"
source "drivers/w1/Kconfig"
source "drivers/hwmon/Kconfig" source "drivers/hwmon/Kconfig"
#source "drivers/l3/Kconfig" #source "drivers/l3/Kconfig"

View File

@ -128,19 +128,27 @@ EXPORT_SYMBOL(rtc_tm_to_time);
/* /*
* Calculate the next alarm time given the requested alarm time mask * Calculate the next alarm time given the requested alarm time mask
* and the current time. * and the current time.
*
* FIXME: for now, we just copy the alarm time because we're lazy (and
* is therefore buggy - setting a 10am alarm at 8pm will not result in
* the alarm triggering.)
*/ */
void rtc_next_alarm_time(struct rtc_time *next, struct rtc_time *now, struct rtc_time *alrm) void rtc_next_alarm_time(struct rtc_time *next, struct rtc_time *now, struct rtc_time *alrm)
{ {
unsigned long next_time;
unsigned long now_time;
next->tm_year = now->tm_year; next->tm_year = now->tm_year;
next->tm_mon = now->tm_mon; next->tm_mon = now->tm_mon;
next->tm_mday = now->tm_mday; next->tm_mday = now->tm_mday;
next->tm_hour = alrm->tm_hour; next->tm_hour = alrm->tm_hour;
next->tm_min = alrm->tm_min; next->tm_min = alrm->tm_min;
next->tm_sec = alrm->tm_sec; next->tm_sec = alrm->tm_sec;
rtc_tm_to_time(now, &now_time);
rtc_tm_to_time(next, &next_time);
if (next_time < now_time) {
/* Advance one day */
next_time += 60 * 60 * 24;
rtc_time_to_tm(next_time, next);
}
} }
static inline int rtc_read_time(struct rtc_ops *ops, struct rtc_time *tm) static inline int rtc_read_time(struct rtc_ops *ops, struct rtc_time *tm)

View File

@ -85,7 +85,6 @@ CONFIG_DEFAULT_IOSCHED="anticipatory"
# CONFIG_ARCH_CLPS711X is not set # CONFIG_ARCH_CLPS711X is not set
# CONFIG_ARCH_CO285 is not set # CONFIG_ARCH_CO285 is not set
# CONFIG_ARCH_EBSA110 is not set # CONFIG_ARCH_EBSA110 is not set
# CONFIG_ARCH_CAMELOT is not set
# CONFIG_ARCH_FOOTBRIDGE is not set # CONFIG_ARCH_FOOTBRIDGE is not set
# CONFIG_ARCH_INTEGRATOR is not set # CONFIG_ARCH_INTEGRATOR is not set
# CONFIG_ARCH_IOP3XX is not set # CONFIG_ARCH_IOP3XX is not set

View File

@ -85,7 +85,6 @@ CONFIG_DEFAULT_IOSCHED="anticipatory"
# CONFIG_ARCH_CLPS711X is not set # CONFIG_ARCH_CLPS711X is not set
# CONFIG_ARCH_CO285 is not set # CONFIG_ARCH_CO285 is not set
# CONFIG_ARCH_EBSA110 is not set # CONFIG_ARCH_EBSA110 is not set
# CONFIG_ARCH_CAMELOT is not set
# CONFIG_ARCH_FOOTBRIDGE is not set # CONFIG_ARCH_FOOTBRIDGE is not set
# CONFIG_ARCH_INTEGRATOR is not set # CONFIG_ARCH_INTEGRATOR is not set
# CONFIG_ARCH_IOP3XX is not set # CONFIG_ARCH_IOP3XX is not set

View File

@ -14,8 +14,7 @@ CONFIG_GENERIC_IOMAP=y
# Code maturity level options # Code maturity level options
# #
CONFIG_EXPERIMENTAL=y CONFIG_EXPERIMENTAL=y
# CONFIG_CLEAN_COMPILE is not set CONFIG_CLEAN_COMPILE=y
CONFIG_BROKEN=y
CONFIG_BROKEN_ON_SMP=y CONFIG_BROKEN_ON_SMP=y
# #
@ -360,7 +359,6 @@ CONFIG_BLK_DEV_IDE_BAST=y
# #
# IEEE 1394 (FireWire) support # IEEE 1394 (FireWire) support
# #
# CONFIG_IEEE1394 is not set
# #
# I2O device support # I2O device support
@ -781,7 +779,6 @@ CONFIG_SYSFS=y
# CONFIG_DEVFS_FS is not set # CONFIG_DEVFS_FS is not set
# CONFIG_DEVPTS_FS_XATTR is not set # CONFIG_DEVPTS_FS_XATTR is not set
# CONFIG_TMPFS is not set # CONFIG_TMPFS is not set
# CONFIG_HUGETLBFS is not set
# CONFIG_HUGETLB_PAGE is not set # CONFIG_HUGETLB_PAGE is not set
CONFIG_RAMFS=y CONFIG_RAMFS=y

View File

@ -13,8 +13,7 @@ CONFIG_GENERIC_CALIBRATE_DELAY=y
# Code maturity level options # Code maturity level options
# #
CONFIG_EXPERIMENTAL=y CONFIG_EXPERIMENTAL=y
# CONFIG_CLEAN_COMPILE is not set CONFIG_CLEAN_COMPILE=y
CONFIG_BROKEN=y
CONFIG_BROKEN_ON_SMP=y CONFIG_BROKEN_ON_SMP=y
CONFIG_LOCK_KERNEL=y CONFIG_LOCK_KERNEL=y
CONFIG_INIT_ENV_ARG_LIMIT=32 CONFIG_INIT_ENV_ARG_LIMIT=32
@ -308,9 +307,7 @@ CONFIG_MTD_CFI_I2=y
# CONFIG_MTD_ROM is not set # CONFIG_MTD_ROM is not set
# CONFIG_MTD_ABSENT is not set # CONFIG_MTD_ABSENT is not set
CONFIG_MTD_OBSOLETE_CHIPS=y CONFIG_MTD_OBSOLETE_CHIPS=y
# CONFIG_MTD_AMDSTD is not set
CONFIG_MTD_SHARP=y CONFIG_MTD_SHARP=y
# CONFIG_MTD_JEDEC is not set
# #
# Mapping drivers for chip access # Mapping drivers for chip access
@ -396,7 +393,6 @@ CONFIG_ATA_OVER_ETH=m
# #
# IEEE 1394 (FireWire) support # IEEE 1394 (FireWire) support
# #
# CONFIG_IEEE1394 is not set
# #
# I2O device support # I2O device support
@ -741,7 +737,6 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
CONFIG_PROC_FS=y CONFIG_PROC_FS=y
CONFIG_SYSFS=y CONFIG_SYSFS=y
CONFIG_TMPFS=y CONFIG_TMPFS=y
# CONFIG_HUGETLBFS is not set
# CONFIG_HUGETLB_PAGE is not set # CONFIG_HUGETLB_PAGE is not set
CONFIG_RAMFS=y CONFIG_RAMFS=y
# CONFIG_RELAYFS_FS is not set # CONFIG_RELAYFS_FS is not set

View File

@ -85,7 +85,6 @@ CONFIG_DEFAULT_IOSCHED="anticipatory"
# CONFIG_ARCH_CLPS711X is not set # CONFIG_ARCH_CLPS711X is not set
# CONFIG_ARCH_CO285 is not set # CONFIG_ARCH_CO285 is not set
# CONFIG_ARCH_EBSA110 is not set # CONFIG_ARCH_EBSA110 is not set
# CONFIG_ARCH_CAMELOT is not set
# CONFIG_ARCH_FOOTBRIDGE is not set # CONFIG_ARCH_FOOTBRIDGE is not set
# CONFIG_ARCH_INTEGRATOR is not set # CONFIG_ARCH_INTEGRATOR is not set
# CONFIG_ARCH_IOP3XX is not set # CONFIG_ARCH_IOP3XX is not set

View File

@ -85,7 +85,6 @@ CONFIG_DEFAULT_IOSCHED="anticipatory"
# CONFIG_ARCH_CLPS711X is not set # CONFIG_ARCH_CLPS711X is not set
# CONFIG_ARCH_CO285 is not set # CONFIG_ARCH_CO285 is not set
# CONFIG_ARCH_EBSA110 is not set # CONFIG_ARCH_EBSA110 is not set
# CONFIG_ARCH_CAMELOT is not set
# CONFIG_ARCH_FOOTBRIDGE is not set # CONFIG_ARCH_FOOTBRIDGE is not set
# CONFIG_ARCH_INTEGRATOR is not set # CONFIG_ARCH_INTEGRATOR is not set
# CONFIG_ARCH_IOP3XX is not set # CONFIG_ARCH_IOP3XX is not set

View File

@ -171,7 +171,7 @@ CONFIG_ALIGNMENT_TRAP=y
# #
CONFIG_ZBOOT_ROM_TEXT=0x0 CONFIG_ZBOOT_ROM_TEXT=0x0
CONFIG_ZBOOT_ROM_BSS=0x0 CONFIG_ZBOOT_ROM_BSS=0x0
CONFIG_CMDLINE="console=ttyS0,57600 root=/dev/nfs ip=bootp mem=64M@0x0 pci=firmware" CONFIG_CMDLINE="console=ttyS0,57600 root=/dev/nfs ip=bootp mem=64M@0x0"
# CONFIG_XIP_KERNEL is not set # CONFIG_XIP_KERNEL is not set
# #

View File

@ -172,7 +172,7 @@ CONFIG_ALIGNMENT_TRAP=y
# #
CONFIG_ZBOOT_ROM_TEXT=0x0 CONFIG_ZBOOT_ROM_TEXT=0x0
CONFIG_ZBOOT_ROM_BSS=0x0 CONFIG_ZBOOT_ROM_BSS=0x0
CONFIG_CMDLINE="console=ttyS0,57600 root=/dev/nfs ip=bootp mem=64M@0x0 pci=firmware" CONFIG_CMDLINE="console=ttyS0,57600 root=/dev/nfs ip=bootp mem=64M@0x0"
# CONFIG_XIP_KERNEL is not set # CONFIG_XIP_KERNEL is not set
# #

View File

@ -172,7 +172,7 @@ CONFIG_ALIGNMENT_TRAP=y
# #
CONFIG_ZBOOT_ROM_TEXT=0x0 CONFIG_ZBOOT_ROM_TEXT=0x0
CONFIG_ZBOOT_ROM_BSS=0x0 CONFIG_ZBOOT_ROM_BSS=0x0
CONFIG_CMDLINE="console=ttyS0,115200 root=/dev/nfs ip=bootp mem=64M@0x0 pci=firmware" CONFIG_CMDLINE="console=ttyS0,115200 root=/dev/nfs ip=bootp mem=64M@0x0"
# CONFIG_XIP_KERNEL is not set # CONFIG_XIP_KERNEL is not set
# #

View File

@ -172,7 +172,7 @@ CONFIG_ALIGNMENT_TRAP=y
# #
CONFIG_ZBOOT_ROM_TEXT=0x0 CONFIG_ZBOOT_ROM_TEXT=0x0
CONFIG_ZBOOT_ROM_BSS=0x0 CONFIG_ZBOOT_ROM_BSS=0x0
CONFIG_CMDLINE="console=ttyS0,115200 root=/dev/nfs ip=bootp mem=64M@0x0 pci=firmware ixdp2x01_clock=50000000" CONFIG_CMDLINE="console=ttyS0,115200 root=/dev/nfs ip=bootp mem=64M@0x0"
# CONFIG_XIP_KERNEL is not set # CONFIG_XIP_KERNEL is not set
# #

View File

@ -1,11 +1,10 @@
# #
# Automatically generated make config: don't edit # Automatically generated make config: don't edit
# Linux kernel version: 2.6.15-rc1 # Linux kernel version: 2.6.16-rc2
# Sun Nov 13 17:41:24 2005 # Mon Feb 6 11:17:23 2006
# #
CONFIG_ARM=y CONFIG_ARM=y
CONFIG_MMU=y CONFIG_MMU=y
CONFIG_UID16=y
CONFIG_RWSEM_GENERIC_SPINLOCK=y CONFIG_RWSEM_GENERIC_SPINLOCK=y
CONFIG_GENERIC_CALIBRATE_DELAY=y CONFIG_GENERIC_CALIBRATE_DELAY=y
@ -13,8 +12,7 @@ CONFIG_GENERIC_CALIBRATE_DELAY=y
# Code maturity level options # Code maturity level options
# #
CONFIG_EXPERIMENTAL=y CONFIG_EXPERIMENTAL=y
# CONFIG_CLEAN_COMPILE is not set CONFIG_CLEAN_COMPILE=y
CONFIG_BROKEN=y
CONFIG_BROKEN_ON_SMP=y CONFIG_BROKEN_ON_SMP=y
CONFIG_INIT_ENV_ARG_LIMIT=32 CONFIG_INIT_ENV_ARG_LIMIT=32
@ -29,27 +27,31 @@ CONFIG_SYSVIPC=y
# CONFIG_BSD_PROCESS_ACCT is not set # CONFIG_BSD_PROCESS_ACCT is not set
CONFIG_SYSCTL=y CONFIG_SYSCTL=y
# CONFIG_AUDIT is not set # CONFIG_AUDIT is not set
# CONFIG_HOTPLUG is not set
CONFIG_KOBJECT_UEVENT=y
# CONFIG_IKCONFIG is not set # CONFIG_IKCONFIG is not set
CONFIG_INITRAMFS_SOURCE="" CONFIG_INITRAMFS_SOURCE=""
CONFIG_UID16=y
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
# CONFIG_EMBEDDED is not set # CONFIG_EMBEDDED is not set
CONFIG_KALLSYMS=y CONFIG_KALLSYMS=y
# CONFIG_KALLSYMS_ALL is not set # CONFIG_KALLSYMS_ALL is not set
# CONFIG_KALLSYMS_EXTRA_PASS is not set # CONFIG_KALLSYMS_EXTRA_PASS is not set
CONFIG_HOTPLUG=y
CONFIG_PRINTK=y CONFIG_PRINTK=y
CONFIG_BUG=y CONFIG_BUG=y
CONFIG_ELF_CORE=y
CONFIG_BASE_FULL=y CONFIG_BASE_FULL=y
CONFIG_FUTEX=y CONFIG_FUTEX=y
CONFIG_EPOLL=y CONFIG_EPOLL=y
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
CONFIG_SHMEM=y CONFIG_SHMEM=y
CONFIG_CC_ALIGN_FUNCTIONS=0 CONFIG_CC_ALIGN_FUNCTIONS=0
CONFIG_CC_ALIGN_LABELS=0 CONFIG_CC_ALIGN_LABELS=0
CONFIG_CC_ALIGN_LOOPS=0 CONFIG_CC_ALIGN_LOOPS=0
CONFIG_CC_ALIGN_JUMPS=0 CONFIG_CC_ALIGN_JUMPS=0
CONFIG_SLAB=y
# CONFIG_TINY_SHMEM is not set # CONFIG_TINY_SHMEM is not set
CONFIG_BASE_SMALL=0 CONFIG_BASE_SMALL=0
# CONFIG_SLOB is not set
CONFIG_OBSOLETE_INTERMODULE=y
# #
# Loadable module support # Loadable module support
@ -103,6 +105,7 @@ CONFIG_ARCH_S3C2410=y
# CONFIG_ARCH_IMX is not set # CONFIG_ARCH_IMX is not set
# CONFIG_ARCH_H720X is not set # CONFIG_ARCH_H720X is not set
# CONFIG_ARCH_AAEC2000 is not set # CONFIG_ARCH_AAEC2000 is not set
# CONFIG_ARCH_AT91RM9200 is not set
# #
# S3C24XX Implementations # S3C24XX Implementations
@ -161,7 +164,6 @@ CONFIG_CPU_TLB_V4WBI=y
# Bus support # Bus support
# #
CONFIG_ISA=y CONFIG_ISA=y
CONFIG_ISA_DMA_API=y
# #
# PCCARD (PCMCIA/CardBus) support # PCCARD (PCMCIA/CardBus) support
@ -173,6 +175,7 @@ CONFIG_ISA_DMA_API=y
# #
# CONFIG_PREEMPT is not set # CONFIG_PREEMPT is not set
# CONFIG_NO_IDLE_HZ is not set # CONFIG_NO_IDLE_HZ is not set
# CONFIG_AEABI is not set
# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set # CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
CONFIG_SELECT_MEMORY_MODEL=y CONFIG_SELECT_MEMORY_MODEL=y
CONFIG_FLATMEM_MANUAL=y CONFIG_FLATMEM_MANUAL=y
@ -215,6 +218,8 @@ CONFIG_BINFMT_AOUT=y
# Power management options # Power management options
# #
CONFIG_PM=y CONFIG_PM=y
CONFIG_PM_LEGACY=y
# CONFIG_PM_DEBUG is not set
CONFIG_APM=y CONFIG_APM=y
# #
@ -260,6 +265,11 @@ CONFIG_TCP_CONG_BIC=y
# SCTP Configuration (EXPERIMENTAL) # SCTP Configuration (EXPERIMENTAL)
# #
# CONFIG_IP_SCTP is not set # CONFIG_IP_SCTP is not set
#
# TIPC Configuration (EXPERIMENTAL)
#
# CONFIG_TIPC is not set
# CONFIG_ATM is not set # CONFIG_ATM is not set
# CONFIG_BRIDGE is not set # CONFIG_BRIDGE is not set
# CONFIG_VLAN_8021Q is not set # CONFIG_VLAN_8021Q is not set
@ -277,7 +287,6 @@ CONFIG_TCP_CONG_BIC=y
# QoS and/or fair queueing # QoS and/or fair queueing
# #
# CONFIG_NET_SCHED is not set # CONFIG_NET_SCHED is not set
# CONFIG_NET_CLS_ROUTE is not set
# #
# Network testing # Network testing
@ -300,6 +309,11 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
# CONFIG_FW_LOADER is not set # CONFIG_FW_LOADER is not set
# CONFIG_DEBUG_DRIVER is not set # CONFIG_DEBUG_DRIVER is not set
#
# Connector - unified userspace <-> kernelspace linker
#
# CONFIG_CONNECTOR is not set
# #
# Memory Technology Devices (MTD) # Memory Technology Devices (MTD)
# #
@ -413,8 +427,6 @@ CONFIG_PARPORT_1284=y
# #
# Block devices # Block devices
# #
# CONFIG_BLK_DEV_XD is not set
# CONFIG_PARIDE is not set
# CONFIG_BLK_DEV_COW_COMMON is not set # CONFIG_BLK_DEV_COW_COMMON is not set
CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP=y
# CONFIG_BLK_DEV_CRYPTOLOOP is not set # CONFIG_BLK_DEV_CRYPTOLOOP is not set
@ -473,7 +485,6 @@ CONFIG_BLK_DEV_IDE_BAST=y
# #
# IEEE 1394 (FireWire) support # IEEE 1394 (FireWire) support
# #
# CONFIG_IEEE1394 is not set
# #
# I2O device support # I2O device support
@ -504,7 +515,6 @@ CONFIG_NETDEVICES=y
CONFIG_NET_ETHERNET=y CONFIG_NET_ETHERNET=y
CONFIG_MII=y CONFIG_MII=y
# CONFIG_NET_VENDOR_3COM is not set # CONFIG_NET_VENDOR_3COM is not set
# CONFIG_LANCE is not set
# CONFIG_NET_VENDOR_SMC is not set # CONFIG_NET_VENDOR_SMC is not set
# CONFIG_SMC91X is not set # CONFIG_SMC91X is not set
CONFIG_DM9000=y CONFIG_DM9000=y
@ -609,11 +619,11 @@ CONFIG_SERIAL_NONSTANDARD=y
# CONFIG_ROCKETPORT is not set # CONFIG_ROCKETPORT is not set
# CONFIG_CYCLADES is not set # CONFIG_CYCLADES is not set
# CONFIG_DIGIEPCA is not set # CONFIG_DIGIEPCA is not set
# CONFIG_ESPSERIAL is not set
# CONFIG_MOXA_INTELLIO is not set # CONFIG_MOXA_INTELLIO is not set
# CONFIG_MOXA_SMARTIO is not set # CONFIG_MOXA_SMARTIO is not set
# CONFIG_ISI is not set # CONFIG_ISI is not set
# CONFIG_SYNCLINKMP is not set # CONFIG_SYNCLINKMP is not set
# CONFIG_SYNCLINK_GT is not set
# CONFIG_N_HDLC is not set # CONFIG_N_HDLC is not set
# CONFIG_RISCOM8 is not set # CONFIG_RISCOM8 is not set
# CONFIG_SPECIALIX is not set # CONFIG_SPECIALIX is not set
@ -627,6 +637,7 @@ CONFIG_SERIAL_NONSTANDARD=y
CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_8250_NR_UARTS=8 CONFIG_SERIAL_8250_NR_UARTS=8
CONFIG_SERIAL_8250_RUNTIME_UARTS=4
CONFIG_SERIAL_8250_EXTENDED=y CONFIG_SERIAL_8250_EXTENDED=y
CONFIG_SERIAL_8250_MANY_PORTS=y CONFIG_SERIAL_8250_MANY_PORTS=y
CONFIG_SERIAL_8250_SHARE_IRQ=y CONFIG_SERIAL_8250_SHARE_IRQ=y
@ -689,6 +700,7 @@ CONFIG_S3C2410_RTC=y
# #
# TPM devices # TPM devices
# #
# CONFIG_TCG_TPM is not set
# CONFIG_TELCLOCK is not set # CONFIG_TELCLOCK is not set
# #
@ -732,6 +744,12 @@ CONFIG_SENSORS_EEPROM=m
# CONFIG_I2C_DEBUG_BUS is not set # CONFIG_I2C_DEBUG_BUS is not set
# CONFIG_I2C_DEBUG_CHIP is not set # CONFIG_I2C_DEBUG_CHIP is not set
#
# SPI support
#
# CONFIG_SPI is not set
# CONFIG_SPI_MASTER is not set
# #
# Hardware Monitoring support # Hardware Monitoring support
# #
@ -865,6 +883,7 @@ CONFIG_FS_MBCACHE=y
# CONFIG_JFS_FS is not set # CONFIG_JFS_FS is not set
# CONFIG_FS_POSIX_ACL is not set # CONFIG_FS_POSIX_ACL is not set
# CONFIG_XFS_FS is not set # CONFIG_XFS_FS is not set
# CONFIG_OCFS2_FS is not set
# CONFIG_MINIX_FS is not set # CONFIG_MINIX_FS is not set
CONFIG_ROMFS_FS=y CONFIG_ROMFS_FS=y
CONFIG_INOTIFY=y CONFIG_INOTIFY=y
@ -896,10 +915,10 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
CONFIG_PROC_FS=y CONFIG_PROC_FS=y
CONFIG_SYSFS=y CONFIG_SYSFS=y
# CONFIG_TMPFS is not set # CONFIG_TMPFS is not set
# CONFIG_HUGETLBFS is not set
# CONFIG_HUGETLB_PAGE is not set # CONFIG_HUGETLB_PAGE is not set
CONFIG_RAMFS=y CONFIG_RAMFS=y
# CONFIG_RELAYFS_FS is not set # CONFIG_RELAYFS_FS is not set
# CONFIG_CONFIGFS_FS is not set
# #
# Miscellaneous filesystems # Miscellaneous filesystems
@ -968,6 +987,7 @@ CONFIG_SOLARIS_X86_PARTITION=y
# CONFIG_SGI_PARTITION is not set # CONFIG_SGI_PARTITION is not set
# CONFIG_ULTRIX_PARTITION is not set # CONFIG_ULTRIX_PARTITION is not set
# CONFIG_SUN_PARTITION is not set # CONFIG_SUN_PARTITION is not set
# CONFIG_KARMA_PARTITION is not set
# CONFIG_EFI_PARTITION is not set # CONFIG_EFI_PARTITION is not set
# #
@ -1023,12 +1043,13 @@ CONFIG_NLS_DEFAULT="iso8859-1"
# Kernel hacking # Kernel hacking
# #
# CONFIG_PRINTK_TIME is not set # CONFIG_PRINTK_TIME is not set
CONFIG_DEBUG_KERNEL=y
CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ=y
CONFIG_DEBUG_KERNEL=y
CONFIG_LOG_BUF_SHIFT=16 CONFIG_LOG_BUF_SHIFT=16
CONFIG_DETECT_SOFTLOCKUP=y CONFIG_DETECT_SOFTLOCKUP=y
# CONFIG_SCHEDSTATS is not set # CONFIG_SCHEDSTATS is not set
# CONFIG_DEBUG_SLAB is not set # CONFIG_DEBUG_SLAB is not set
CONFIG_DEBUG_MUTEXES=y
# CONFIG_DEBUG_SPINLOCK is not set # CONFIG_DEBUG_SPINLOCK is not set
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set # CONFIG_DEBUG_SPINLOCK_SLEEP is not set
# CONFIG_DEBUG_KOBJECT is not set # CONFIG_DEBUG_KOBJECT is not set
@ -1037,6 +1058,7 @@ CONFIG_DEBUG_INFO=y
# CONFIG_DEBUG_FS is not set # CONFIG_DEBUG_FS is not set
# CONFIG_DEBUG_VM is not set # CONFIG_DEBUG_VM is not set
CONFIG_FRAME_POINTER=y CONFIG_FRAME_POINTER=y
CONFIG_FORCED_INLINING=y
# CONFIG_RCU_TORTURE_TEST is not set # CONFIG_RCU_TORTURE_TEST is not set
CONFIG_DEBUG_USER=y CONFIG_DEBUG_USER=y
# CONFIG_DEBUG_WAITQ is not set # CONFIG_DEBUG_WAITQ is not set

View File

@ -57,7 +57,9 @@ int main(void)
DEFINE(TI_TP_VALUE, offsetof(struct thread_info, tp_value)); DEFINE(TI_TP_VALUE, offsetof(struct thread_info, tp_value));
DEFINE(TI_FPSTATE, offsetof(struct thread_info, fpstate)); DEFINE(TI_FPSTATE, offsetof(struct thread_info, fpstate));
DEFINE(TI_VFPSTATE, offsetof(struct thread_info, vfpstate)); DEFINE(TI_VFPSTATE, offsetof(struct thread_info, vfpstate));
DEFINE(TI_IWMMXT_STATE, (offsetof(struct thread_info, fpstate)+4)&~7); #ifdef CONFIG_IWMMXT
DEFINE(TI_IWMMXT_STATE, offsetof(struct thread_info, fpstate.iwmmxt));
#endif
BLANK(); BLANK();
DEFINE(S_R0, offsetof(struct pt_regs, ARM_r0)); DEFINE(S_R0, offsetof(struct pt_regs, ARM_r0));
DEFINE(S_R1, offsetof(struct pt_regs, ARM_r1)); DEFINE(S_R1, offsetof(struct pt_regs, ARM_r1));

View File

@ -7,337 +7,334 @@
* it under the terms of the GNU General Public License version 2 as * it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation. * published by the Free Software Foundation.
* *
* This file is included twice in entry-common.S * This file is included thrice in entry-common.S
*/ */
#ifndef NR_syscalls /* 0 */ CALL(sys_restart_syscall)
#define NR_syscalls 328 CALL(sys_exit)
#else CALL(sys_fork_wrapper)
CALL(sys_read)
100: CALL(sys_write)
/* 0 */ .long sys_restart_syscall /* 5 */ CALL(sys_open)
.long sys_exit CALL(sys_close)
.long sys_fork_wrapper CALL(sys_ni_syscall) /* was sys_waitpid */
.long sys_read CALL(sys_creat)
.long sys_write CALL(sys_link)
/* 5 */ .long sys_open /* 10 */ CALL(sys_unlink)
.long sys_close CALL(sys_execve_wrapper)
.long sys_ni_syscall /* was sys_waitpid */ CALL(sys_chdir)
.long sys_creat CALL(OBSOLETE(sys_time)) /* used by libc4 */
.long sys_link CALL(sys_mknod)
/* 10 */ .long sys_unlink /* 15 */ CALL(sys_chmod)
.long sys_execve_wrapper CALL(sys_lchown16)
.long sys_chdir CALL(sys_ni_syscall) /* was sys_break */
.long OBSOLETE(sys_time) /* used by libc4 */ CALL(sys_ni_syscall) /* was sys_stat */
.long sys_mknod CALL(sys_lseek)
/* 15 */ .long sys_chmod /* 20 */ CALL(sys_getpid)
.long sys_lchown16 CALL(sys_mount)
.long sys_ni_syscall /* was sys_break */ CALL(OBSOLETE(sys_oldumount)) /* used by libc4 */
.long sys_ni_syscall /* was sys_stat */ CALL(sys_setuid16)
.long sys_lseek CALL(sys_getuid16)
/* 20 */ .long sys_getpid /* 25 */ CALL(OBSOLETE(sys_stime))
.long sys_mount CALL(sys_ptrace)
.long OBSOLETE(sys_oldumount) /* used by libc4 */ CALL(OBSOLETE(sys_alarm)) /* used by libc4 */
.long sys_setuid16 CALL(sys_ni_syscall) /* was sys_fstat */
.long sys_getuid16 CALL(sys_pause)
/* 25 */ .long OBSOLETE(sys_stime) /* 30 */ CALL(OBSOLETE(sys_utime)) /* used by libc4 */
.long sys_ptrace CALL(sys_ni_syscall) /* was sys_stty */
.long OBSOLETE(sys_alarm) /* used by libc4 */ CALL(sys_ni_syscall) /* was sys_getty */
.long sys_ni_syscall /* was sys_fstat */ CALL(sys_access)
.long sys_pause CALL(sys_nice)
/* 30 */ .long OBSOLETE(sys_utime) /* used by libc4 */ /* 35 */ CALL(sys_ni_syscall) /* was sys_ftime */
.long sys_ni_syscall /* was sys_stty */ CALL(sys_sync)
.long sys_ni_syscall /* was sys_getty */ CALL(sys_kill)
.long sys_access CALL(sys_rename)
.long sys_nice CALL(sys_mkdir)
/* 35 */ .long sys_ni_syscall /* was sys_ftime */ /* 40 */ CALL(sys_rmdir)
.long sys_sync CALL(sys_dup)
.long sys_kill CALL(sys_pipe)
.long sys_rename CALL(sys_times)
.long sys_mkdir CALL(sys_ni_syscall) /* was sys_prof */
/* 40 */ .long sys_rmdir /* 45 */ CALL(sys_brk)
.long sys_dup CALL(sys_setgid16)
.long sys_pipe CALL(sys_getgid16)
.long sys_times CALL(sys_ni_syscall) /* was sys_signal */
.long sys_ni_syscall /* was sys_prof */ CALL(sys_geteuid16)
/* 45 */ .long sys_brk /* 50 */ CALL(sys_getegid16)
.long sys_setgid16 CALL(sys_acct)
.long sys_getgid16 CALL(sys_umount)
.long sys_ni_syscall /* was sys_signal */ CALL(sys_ni_syscall) /* was sys_lock */
.long sys_geteuid16 CALL(sys_ioctl)
/* 50 */ .long sys_getegid16 /* 55 */ CALL(sys_fcntl)
.long sys_acct CALL(sys_ni_syscall) /* was sys_mpx */
.long sys_umount CALL(sys_setpgid)
.long sys_ni_syscall /* was sys_lock */ CALL(sys_ni_syscall) /* was sys_ulimit */
.long sys_ioctl CALL(sys_ni_syscall) /* was sys_olduname */
/* 55 */ .long sys_fcntl /* 60 */ CALL(sys_umask)
.long sys_ni_syscall /* was sys_mpx */ CALL(sys_chroot)
.long sys_setpgid CALL(sys_ustat)
.long sys_ni_syscall /* was sys_ulimit */ CALL(sys_dup2)
.long sys_ni_syscall /* was sys_olduname */ CALL(sys_getppid)
/* 60 */ .long sys_umask /* 65 */ CALL(sys_getpgrp)
.long sys_chroot CALL(sys_setsid)
.long sys_ustat CALL(sys_sigaction)
.long sys_dup2 CALL(sys_ni_syscall) /* was sys_sgetmask */
.long sys_getppid CALL(sys_ni_syscall) /* was sys_ssetmask */
/* 65 */ .long sys_getpgrp /* 70 */ CALL(sys_setreuid16)
.long sys_setsid CALL(sys_setregid16)
.long sys_sigaction CALL(sys_sigsuspend_wrapper)
.long sys_ni_syscall /* was sys_sgetmask */ CALL(sys_sigpending)
.long sys_ni_syscall /* was sys_ssetmask */ CALL(sys_sethostname)
/* 70 */ .long sys_setreuid16 /* 75 */ CALL(sys_setrlimit)
.long sys_setregid16 CALL(OBSOLETE(sys_old_getrlimit)) /* used by libc4 */
.long sys_sigsuspend_wrapper CALL(sys_getrusage)
.long sys_sigpending CALL(sys_gettimeofday)
.long sys_sethostname CALL(sys_settimeofday)
/* 75 */ .long sys_setrlimit /* 80 */ CALL(sys_getgroups16)
.long OBSOLETE(sys_old_getrlimit) /* used by libc4 */ CALL(sys_setgroups16)
.long sys_getrusage CALL(OBSOLETE(old_select)) /* used by libc4 */
.long sys_gettimeofday CALL(sys_symlink)
.long sys_settimeofday CALL(sys_ni_syscall) /* was sys_lstat */
/* 80 */ .long sys_getgroups16 /* 85 */ CALL(sys_readlink)
.long sys_setgroups16 CALL(sys_uselib)
.long OBSOLETE(old_select) /* used by libc4 */ CALL(sys_swapon)
.long sys_symlink CALL(sys_reboot)
.long sys_ni_syscall /* was sys_lstat */ CALL(OBSOLETE(old_readdir)) /* used by libc4 */
/* 85 */ .long sys_readlink /* 90 */ CALL(OBSOLETE(old_mmap)) /* used by libc4 */
.long sys_uselib CALL(sys_munmap)
.long sys_swapon CALL(sys_truncate)
.long sys_reboot CALL(sys_ftruncate)
.long OBSOLETE(old_readdir) /* used by libc4 */ CALL(sys_fchmod)
/* 90 */ .long OBSOLETE(old_mmap) /* used by libc4 */ /* 95 */ CALL(sys_fchown16)
.long sys_munmap CALL(sys_getpriority)
.long sys_truncate CALL(sys_setpriority)
.long sys_ftruncate CALL(sys_ni_syscall) /* was sys_profil */
.long sys_fchmod CALL(sys_statfs)
/* 95 */ .long sys_fchown16 /* 100 */ CALL(sys_fstatfs)
.long sys_getpriority CALL(sys_ni_syscall)
.long sys_setpriority CALL(OBSOLETE(ABI(sys_socketcall, sys_oabi_socketcall)))
.long sys_ni_syscall /* was sys_profil */ CALL(sys_syslog)
.long sys_statfs CALL(sys_setitimer)
/* 100 */ .long sys_fstatfs /* 105 */ CALL(sys_getitimer)
.long sys_ni_syscall CALL(sys_newstat)
.long OBSOLETE(sys_socketcall) CALL(sys_newlstat)
.long sys_syslog CALL(sys_newfstat)
.long sys_setitimer CALL(sys_ni_syscall) /* was sys_uname */
/* 105 */ .long sys_getitimer /* 110 */ CALL(sys_ni_syscall) /* was sys_iopl */
.long sys_newstat CALL(sys_vhangup)
.long sys_newlstat CALL(sys_ni_syscall)
.long sys_newfstat CALL(OBSOLETE(sys_syscall)) /* call a syscall */
.long sys_ni_syscall /* was sys_uname */ CALL(sys_wait4)
/* 110 */ .long sys_ni_syscall /* was sys_iopl */ /* 115 */ CALL(sys_swapoff)
.long sys_vhangup CALL(sys_sysinfo)
.long sys_ni_syscall CALL(OBSOLETE(ABI(sys_ipc, sys_oabi_ipc)))
.long OBSOLETE(sys_syscall) /* call a syscall */ CALL(sys_fsync)
.long sys_wait4 CALL(sys_sigreturn_wrapper)
/* 115 */ .long sys_swapoff /* 120 */ CALL(sys_clone_wrapper)
.long sys_sysinfo CALL(sys_setdomainname)
.long OBSOLETE(ABI(sys_ipc, sys_oabi_ipc)) CALL(sys_newuname)
.long sys_fsync CALL(sys_ni_syscall)
.long sys_sigreturn_wrapper CALL(sys_adjtimex)
/* 120 */ .long sys_clone_wrapper /* 125 */ CALL(sys_mprotect)
.long sys_setdomainname CALL(sys_sigprocmask)
.long sys_newuname CALL(sys_ni_syscall) /* was sys_create_module */
.long sys_ni_syscall CALL(sys_init_module)
.long sys_adjtimex CALL(sys_delete_module)
/* 125 */ .long sys_mprotect /* 130 */ CALL(sys_ni_syscall) /* was sys_get_kernel_syms */
.long sys_sigprocmask CALL(sys_quotactl)
.long sys_ni_syscall /* was sys_create_module */ CALL(sys_getpgid)
.long sys_init_module CALL(sys_fchdir)
.long sys_delete_module CALL(sys_bdflush)
/* 130 */ .long sys_ni_syscall /* was sys_get_kernel_syms */ /* 135 */ CALL(sys_sysfs)
.long sys_quotactl CALL(sys_personality)
.long sys_getpgid CALL(sys_ni_syscall) /* CALL(_sys_afs_syscall) */
.long sys_fchdir CALL(sys_setfsuid16)
.long sys_bdflush CALL(sys_setfsgid16)
/* 135 */ .long sys_sysfs /* 140 */ CALL(sys_llseek)
.long sys_personality CALL(sys_getdents)
.long sys_ni_syscall /* .long _sys_afs_syscall */ CALL(sys_select)
.long sys_setfsuid16 CALL(sys_flock)
.long sys_setfsgid16 CALL(sys_msync)
/* 140 */ .long sys_llseek /* 145 */ CALL(sys_readv)
.long sys_getdents CALL(sys_writev)
.long sys_select CALL(sys_getsid)
.long sys_flock CALL(sys_fdatasync)
.long sys_msync CALL(sys_sysctl)
/* 145 */ .long sys_readv /* 150 */ CALL(sys_mlock)
.long sys_writev CALL(sys_munlock)
.long sys_getsid CALL(sys_mlockall)
.long sys_fdatasync CALL(sys_munlockall)
.long sys_sysctl CALL(sys_sched_setparam)
/* 150 */ .long sys_mlock /* 155 */ CALL(sys_sched_getparam)
.long sys_munlock CALL(sys_sched_setscheduler)
.long sys_mlockall CALL(sys_sched_getscheduler)
.long sys_munlockall CALL(sys_sched_yield)
.long sys_sched_setparam CALL(sys_sched_get_priority_max)
/* 155 */ .long sys_sched_getparam /* 160 */ CALL(sys_sched_get_priority_min)
.long sys_sched_setscheduler CALL(sys_sched_rr_get_interval)
.long sys_sched_getscheduler CALL(sys_nanosleep)
.long sys_sched_yield CALL(sys_arm_mremap)
.long sys_sched_get_priority_max CALL(sys_setresuid16)
/* 160 */ .long sys_sched_get_priority_min /* 165 */ CALL(sys_getresuid16)
.long sys_sched_rr_get_interval CALL(sys_ni_syscall)
.long sys_nanosleep CALL(sys_ni_syscall) /* was sys_query_module */
.long sys_arm_mremap CALL(sys_poll)
.long sys_setresuid16 CALL(sys_nfsservctl)
/* 165 */ .long sys_getresuid16 /* 170 */ CALL(sys_setresgid16)
.long sys_ni_syscall CALL(sys_getresgid16)
.long sys_ni_syscall /* was sys_query_module */ CALL(sys_prctl)
.long sys_poll CALL(sys_rt_sigreturn_wrapper)
.long sys_nfsservctl CALL(sys_rt_sigaction)
/* 170 */ .long sys_setresgid16 /* 175 */ CALL(sys_rt_sigprocmask)
.long sys_getresgid16 CALL(sys_rt_sigpending)
.long sys_prctl CALL(sys_rt_sigtimedwait)
.long sys_rt_sigreturn_wrapper CALL(sys_rt_sigqueueinfo)
.long sys_rt_sigaction CALL(sys_rt_sigsuspend_wrapper)
/* 175 */ .long sys_rt_sigprocmask /* 180 */ CALL(ABI(sys_pread64, sys_oabi_pread64))
.long sys_rt_sigpending CALL(ABI(sys_pwrite64, sys_oabi_pwrite64))
.long sys_rt_sigtimedwait CALL(sys_chown16)
.long sys_rt_sigqueueinfo CALL(sys_getcwd)
.long sys_rt_sigsuspend_wrapper CALL(sys_capget)
/* 180 */ .long ABI(sys_pread64, sys_oabi_pread64) /* 185 */ CALL(sys_capset)
.long ABI(sys_pwrite64, sys_oabi_pwrite64) CALL(sys_sigaltstack_wrapper)
.long sys_chown16 CALL(sys_sendfile)
.long sys_getcwd CALL(sys_ni_syscall)
.long sys_capget CALL(sys_ni_syscall)
/* 185 */ .long sys_capset /* 190 */ CALL(sys_vfork_wrapper)
.long sys_sigaltstack_wrapper CALL(sys_getrlimit)
.long sys_sendfile CALL(sys_mmap2)
.long sys_ni_syscall CALL(ABI(sys_truncate64, sys_oabi_truncate64))
.long sys_ni_syscall CALL(ABI(sys_ftruncate64, sys_oabi_ftruncate64))
/* 190 */ .long sys_vfork_wrapper /* 195 */ CALL(ABI(sys_stat64, sys_oabi_stat64))
.long sys_getrlimit CALL(ABI(sys_lstat64, sys_oabi_lstat64))
.long sys_mmap2 CALL(ABI(sys_fstat64, sys_oabi_fstat64))
.long ABI(sys_truncate64, sys_oabi_truncate64) CALL(sys_lchown)
.long ABI(sys_ftruncate64, sys_oabi_ftruncate64) CALL(sys_getuid)
/* 195 */ .long ABI(sys_stat64, sys_oabi_stat64) /* 200 */ CALL(sys_getgid)
.long ABI(sys_lstat64, sys_oabi_lstat64) CALL(sys_geteuid)
.long ABI(sys_fstat64, sys_oabi_fstat64) CALL(sys_getegid)
.long sys_lchown CALL(sys_setreuid)
.long sys_getuid CALL(sys_setregid)
/* 200 */ .long sys_getgid /* 205 */ CALL(sys_getgroups)
.long sys_geteuid CALL(sys_setgroups)
.long sys_getegid CALL(sys_fchown)
.long sys_setreuid CALL(sys_setresuid)
.long sys_setregid CALL(sys_getresuid)
/* 205 */ .long sys_getgroups /* 210 */ CALL(sys_setresgid)
.long sys_setgroups CALL(sys_getresgid)
.long sys_fchown CALL(sys_chown)
.long sys_setresuid CALL(sys_setuid)
.long sys_getresuid CALL(sys_setgid)
/* 210 */ .long sys_setresgid /* 215 */ CALL(sys_setfsuid)
.long sys_getresgid CALL(sys_setfsgid)
.long sys_chown CALL(sys_getdents64)
.long sys_setuid CALL(sys_pivot_root)
.long sys_setgid CALL(sys_mincore)
/* 215 */ .long sys_setfsuid /* 220 */ CALL(sys_madvise)
.long sys_setfsgid CALL(ABI(sys_fcntl64, sys_oabi_fcntl64))
.long sys_getdents64 CALL(sys_ni_syscall) /* TUX */
.long sys_pivot_root CALL(sys_ni_syscall)
.long sys_mincore CALL(sys_gettid)
/* 220 */ .long sys_madvise /* 225 */ CALL(ABI(sys_readahead, sys_oabi_readahead))
.long ABI(sys_fcntl64, sys_oabi_fcntl64) CALL(sys_setxattr)
.long sys_ni_syscall /* TUX */ CALL(sys_lsetxattr)
.long sys_ni_syscall CALL(sys_fsetxattr)
.long sys_gettid CALL(sys_getxattr)
/* 225 */ .long ABI(sys_readahead, sys_oabi_readahead) /* 230 */ CALL(sys_lgetxattr)
.long sys_setxattr CALL(sys_fgetxattr)
.long sys_lsetxattr CALL(sys_listxattr)
.long sys_fsetxattr CALL(sys_llistxattr)
.long sys_getxattr CALL(sys_flistxattr)
/* 230 */ .long sys_lgetxattr /* 235 */ CALL(sys_removexattr)
.long sys_fgetxattr CALL(sys_lremovexattr)
.long sys_listxattr CALL(sys_fremovexattr)
.long sys_llistxattr CALL(sys_tkill)
.long sys_flistxattr CALL(sys_sendfile64)
/* 235 */ .long sys_removexattr /* 240 */ CALL(sys_futex)
.long sys_lremovexattr CALL(sys_sched_setaffinity)
.long sys_fremovexattr CALL(sys_sched_getaffinity)
.long sys_tkill CALL(sys_io_setup)
.long sys_sendfile64 CALL(sys_io_destroy)
/* 240 */ .long sys_futex /* 245 */ CALL(sys_io_getevents)
.long sys_sched_setaffinity CALL(sys_io_submit)
.long sys_sched_getaffinity CALL(sys_io_cancel)
.long sys_io_setup CALL(sys_exit_group)
.long sys_io_destroy CALL(sys_lookup_dcookie)
/* 245 */ .long sys_io_getevents /* 250 */ CALL(sys_epoll_create)
.long sys_io_submit CALL(ABI(sys_epoll_ctl, sys_oabi_epoll_ctl))
.long sys_io_cancel CALL(ABI(sys_epoll_wait, sys_oabi_epoll_wait))
.long sys_exit_group CALL(sys_remap_file_pages)
.long sys_lookup_dcookie CALL(sys_ni_syscall) /* sys_set_thread_area */
/* 250 */ .long sys_epoll_create /* 255 */ CALL(sys_ni_syscall) /* sys_get_thread_area */
.long ABI(sys_epoll_ctl, sys_oabi_epoll_ctl) CALL(sys_set_tid_address)
.long ABI(sys_epoll_wait, sys_oabi_epoll_wait) CALL(sys_timer_create)
.long sys_remap_file_pages CALL(sys_timer_settime)
.long sys_ni_syscall /* sys_set_thread_area */ CALL(sys_timer_gettime)
/* 255 */ .long sys_ni_syscall /* sys_get_thread_area */ /* 260 */ CALL(sys_timer_getoverrun)
.long sys_set_tid_address CALL(sys_timer_delete)
.long sys_timer_create CALL(sys_clock_settime)
.long sys_timer_settime CALL(sys_clock_gettime)
.long sys_timer_gettime CALL(sys_clock_getres)
/* 260 */ .long sys_timer_getoverrun /* 265 */ CALL(sys_clock_nanosleep)
.long sys_timer_delete CALL(sys_statfs64_wrapper)
.long sys_clock_settime CALL(sys_fstatfs64_wrapper)
.long sys_clock_gettime CALL(sys_tgkill)
.long sys_clock_getres CALL(sys_utimes)
/* 265 */ .long sys_clock_nanosleep /* 270 */ CALL(sys_arm_fadvise64_64)
.long sys_statfs64_wrapper CALL(sys_pciconfig_iobase)
.long sys_fstatfs64_wrapper CALL(sys_pciconfig_read)
.long sys_tgkill CALL(sys_pciconfig_write)
.long sys_utimes CALL(sys_mq_open)
/* 270 */ .long sys_arm_fadvise64_64 /* 275 */ CALL(sys_mq_unlink)
.long sys_pciconfig_iobase CALL(sys_mq_timedsend)
.long sys_pciconfig_read CALL(sys_mq_timedreceive)
.long sys_pciconfig_write CALL(sys_mq_notify)
.long sys_mq_open CALL(sys_mq_getsetattr)
/* 275 */ .long sys_mq_unlink /* 280 */ CALL(sys_waitid)
.long sys_mq_timedsend CALL(sys_socket)
.long sys_mq_timedreceive CALL(ABI(sys_bind, sys_oabi_bind))
.long sys_mq_notify CALL(ABI(sys_connect, sys_oabi_connect))
.long sys_mq_getsetattr CALL(sys_listen)
/* 280 */ .long sys_waitid /* 285 */ CALL(sys_accept)
.long sys_socket CALL(sys_getsockname)
.long sys_bind CALL(sys_getpeername)
.long sys_connect CALL(sys_socketpair)
.long sys_listen CALL(sys_send)
/* 285 */ .long sys_accept /* 290 */ CALL(ABI(sys_sendto, sys_oabi_sendto))
.long sys_getsockname CALL(sys_recv)
.long sys_getpeername CALL(sys_recvfrom)
.long sys_socketpair CALL(sys_shutdown)
.long sys_send CALL(sys_setsockopt)
/* 290 */ .long sys_sendto /* 295 */ CALL(sys_getsockopt)
.long sys_recv CALL(ABI(sys_sendmsg, sys_oabi_sendmsg))
.long sys_recvfrom CALL(sys_recvmsg)
.long sys_shutdown CALL(ABI(sys_semop, sys_oabi_semop))
.long sys_setsockopt CALL(sys_semget)
/* 295 */ .long sys_getsockopt /* 300 */ CALL(sys_semctl)
.long sys_sendmsg CALL(sys_msgsnd)
.long sys_recvmsg CALL(sys_msgrcv)
.long ABI(sys_semop, sys_oabi_semop) CALL(sys_msgget)
.long sys_semget CALL(sys_msgctl)
/* 300 */ .long sys_semctl /* 305 */ CALL(sys_shmat)
.long sys_msgsnd CALL(sys_shmdt)
.long sys_msgrcv CALL(sys_shmget)
.long sys_msgget CALL(sys_shmctl)
.long sys_msgctl CALL(sys_add_key)
/* 305 */ .long sys_shmat /* 310 */ CALL(sys_request_key)
.long sys_shmdt CALL(sys_keyctl)
.long sys_shmget CALL(ABI(sys_semtimedop, sys_oabi_semtimedop))
.long sys_shmctl /* vserver */ CALL(sys_ni_syscall)
.long sys_add_key CALL(sys_ioprio_set)
/* 310 */ .long sys_request_key /* 315 */ CALL(sys_ioprio_get)
.long sys_keyctl CALL(sys_inotify_init)
.long ABI(sys_semtimedop, sys_oabi_semtimedop) CALL(sys_inotify_add_watch)
/* vserver */ .long sys_ni_syscall CALL(sys_inotify_rm_watch)
.long sys_ioprio_set CALL(sys_mbind)
/* 315 */ .long sys_ioprio_get /* 320 */ CALL(sys_get_mempolicy)
.long sys_inotify_init CALL(sys_set_mempolicy)
.long sys_inotify_add_watch #ifndef syscalls_counted
.long sys_inotify_rm_watch .equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls
.long sys_mbind #define syscalls_counted
/* 320 */ .long sys_get_mempolicy
.long sys_set_mempolicy
.rept NR_syscalls - (. - 100b) / 4
.long sys_ni_syscall
.endr
#endif #endif
.rept syscalls_padding
CALL(sys_ni_syscall)
.endr

View File

@ -333,9 +333,13 @@ __pabt_svc:
@ from the exception stack @ from the exception stack
#if __LINUX_ARM_ARCH__ < 6 && !defined(CONFIG_NEEDS_SYSCALL_FOR_CMPXCHG) #if __LINUX_ARM_ARCH__ < 6 && !defined(CONFIG_NEEDS_SYSCALL_FOR_CMPXCHG)
#ifndef CONFIG_MMU
#warning "NPTL on non MMU needs fixing"
#else
@ make sure our user space atomic helper is aborted @ make sure our user space atomic helper is aborted
cmp r2, #TASK_SIZE cmp r2, #TASK_SIZE
bichs r3, r3, #PSR_Z_BIT bichs r3, r3, #PSR_Z_BIT
#endif
#endif #endif
@ @
@ -562,7 +566,7 @@ ENTRY(__switch_to)
ldr r6, [r2, #TI_CPU_DOMAIN]! ldr r6, [r2, #TI_CPU_DOMAIN]!
#endif #endif
#if __LINUX_ARM_ARCH__ >= 6 #if __LINUX_ARM_ARCH__ >= 6
#ifdef CONFIG_CPU_MPCORE #ifdef CONFIG_CPU_32v6K
clrex clrex
#else #else
strex r5, r4, [ip] @ Clear exclusive monitor strex r5, r4, [ip] @ Clear exclusive monitor
@ -705,7 +709,12 @@ __kuser_memory_barrier: @ 0xffff0fa0
* The C flag is also set if *ptr was changed to allow for assembly * The C flag is also set if *ptr was changed to allow for assembly
* optimization in the calling code. * optimization in the calling code.
* *
* Note: this routine already includes memory barriers as needed. * Notes:
*
* - This routine already includes memory barriers as needed.
*
* - A failure might be transient, i.e. it is possible, although unlikely,
* that "failure" be returned even if *ptr == oldval.
* *
* For example, a user space atomic_add implementation could look like this: * For example, a user space atomic_add implementation could look like this:
* *
@ -756,12 +765,18 @@ __kuser_cmpxchg: @ 0xffff0fc0
* exception happening just after the str instruction which would * exception happening just after the str instruction which would
* clear the Z flag although the exchange was done. * clear the Z flag although the exchange was done.
*/ */
#ifdef CONFIG_MMU
teq ip, ip @ set Z flag teq ip, ip @ set Z flag
ldr ip, [r2] @ load current val ldr ip, [r2] @ load current val
add r3, r2, #1 @ prepare store ptr add r3, r2, #1 @ prepare store ptr
teqeq ip, r0 @ compare with oldval if still allowed teqeq ip, r0 @ compare with oldval if still allowed
streq r1, [r3, #-1]! @ store newval if still allowed streq r1, [r3, #-1]! @ store newval if still allowed
subs r0, r2, r3 @ if r2 == r3 the str occured subs r0, r2, r3 @ if r2 == r3 the str occured
#else
#warning "NPTL on non MMU needs fixing"
mov r0, #-1
adds r0, r0, #0
#endif
mov pc, lr mov pc, lr
#else #else

View File

@ -87,7 +87,11 @@ ENTRY(ret_from_fork)
b ret_slow_syscall b ret_slow_syscall
.equ NR_syscalls,0
#define CALL(x) .equ NR_syscalls,NR_syscalls+1
#include "calls.S" #include "calls.S"
#undef CALL
#define CALL(x) .long x
/*============================================================================= /*=============================================================================
* SWI handler * SWI handler

View File

@ -610,15 +610,12 @@ static int ptrace_setfpregs(struct task_struct *tsk, void __user *ufp)
static int ptrace_getwmmxregs(struct task_struct *tsk, void __user *ufp) static int ptrace_getwmmxregs(struct task_struct *tsk, void __user *ufp)
{ {
struct thread_info *thread = task_thread_info(tsk); struct thread_info *thread = task_thread_info(tsk);
void *ptr = &thread->fpstate;
if (!test_ti_thread_flag(thread, TIF_USING_IWMMXT)) if (!test_ti_thread_flag(thread, TIF_USING_IWMMXT))
return -ENODATA; return -ENODATA;
iwmmxt_task_disable(thread); /* force it to ram */ iwmmxt_task_disable(thread); /* force it to ram */
/* The iWMMXt state is stored doubleword-aligned. */ return copy_to_user(ufp, &thread->fpstate.iwmmxt, IWMMXT_SIZE)
if (((long) ptr) & 4) ? -EFAULT : 0;
ptr += 4;
return copy_to_user(ufp, ptr, 0x98) ? -EFAULT : 0;
} }
/* /*
@ -627,15 +624,12 @@ static int ptrace_getwmmxregs(struct task_struct *tsk, void __user *ufp)
static int ptrace_setwmmxregs(struct task_struct *tsk, void __user *ufp) static int ptrace_setwmmxregs(struct task_struct *tsk, void __user *ufp)
{ {
struct thread_info *thread = task_thread_info(tsk); struct thread_info *thread = task_thread_info(tsk);
void *ptr = &thread->fpstate;
if (!test_ti_thread_flag(thread, TIF_USING_IWMMXT)) if (!test_ti_thread_flag(thread, TIF_USING_IWMMXT))
return -EACCES; return -EACCES;
iwmmxt_task_release(thread); /* force a reload */ iwmmxt_task_release(thread); /* force a reload */
/* The iWMMXt state is stored doubleword-aligned. */ return copy_from_user(&thead->fpstate.iwmmxt, ufp, IWMMXT_SIZE)
if (((long) ptr) & 4) ? -EFAULT : 0;
ptr += 4;
return copy_from_user(ptr, ufp, 0x98) ? -EFAULT : 0;
} }
#endif #endif

View File

@ -23,6 +23,7 @@
#include <linux/root_dev.h> #include <linux/root_dev.h>
#include <linux/cpu.h> #include <linux/cpu.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/smp.h>
#include <asm/cpu.h> #include <asm/cpu.h>
#include <asm/elf.h> #include <asm/elf.h>
@ -771,6 +772,10 @@ void __init setup_arch(char **cmdline_p)
paging_init(&meminfo, mdesc); paging_init(&meminfo, mdesc);
request_standard_resources(&meminfo, mdesc); request_standard_resources(&meminfo, mdesc);
#ifdef CONFIG_SMP
smp_init_cpus();
#endif
cpu_init(); cpu_init();
/* /*

View File

@ -338,7 +338,6 @@ void __init smp_prepare_boot_cpu(void)
per_cpu(cpu_data, cpu).idle = current; per_cpu(cpu_data, cpu).idle = current;
cpu_set(cpu, cpu_possible_map);
cpu_set(cpu, cpu_present_map); cpu_set(cpu, cpu_present_map);
cpu_set(cpu, cpu_online_map); cpu_set(cpu, cpu_online_map);
} }

View File

@ -59,6 +59,17 @@
* struct sembuf loses its padding with EABI. Since arrays of them are * struct sembuf loses its padding with EABI. Since arrays of them are
* used they have to be copyed to remove the padding. Compatibility wrappers * used they have to be copyed to remove the padding. Compatibility wrappers
* provided below. * provided below.
*
* sys_bind:
* sys_connect:
* sys_sendmsg:
* sys_sendto:
* sys_socketcall:
*
* struct sockaddr_un loses its padding with EABI. Since the size of the
* structure is used as a validation test in unix_mkname(), we need to
* change the length argument to 110 whenever it is 112. Compatibility
* wrappers provided below.
*/ */
#include <linux/syscalls.h> #include <linux/syscalls.h>
@ -67,6 +78,8 @@
#include <linux/fcntl.h> #include <linux/fcntl.h>
#include <linux/eventpoll.h> #include <linux/eventpoll.h>
#include <linux/sem.h> #include <linux/sem.h>
#include <linux/socket.h>
#include <linux/net.h>
#include <asm/ipc.h> #include <asm/ipc.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
@ -337,3 +350,91 @@ asmlinkage int sys_oabi_ipc(uint call, int first, int second, int third,
return sys_ipc(call, first, second, third, ptr, fifth); return sys_ipc(call, first, second, third, ptr, fifth);
} }
} }
asmlinkage long sys_oabi_bind(int fd, struct sockaddr __user *addr, int addrlen)
{
sa_family_t sa_family;
if (addrlen == 112 &&
get_user(sa_family, &addr->sa_family) == 0 &&
sa_family == AF_UNIX)
addrlen = 110;
return sys_bind(fd, addr, addrlen);
}
asmlinkage long sys_oabi_connect(int fd, struct sockaddr __user *addr, int addrlen)
{
sa_family_t sa_family;
if (addrlen == 112 &&
get_user(sa_family, &addr->sa_family) == 0 &&
sa_family == AF_UNIX)
addrlen = 110;
return sys_connect(fd, addr, addrlen);
}
asmlinkage long sys_oabi_sendto(int fd, void __user *buff,
size_t len, unsigned flags,
struct sockaddr __user *addr,
int addrlen)
{
sa_family_t sa_family;
if (addrlen == 112 &&
get_user(sa_family, &addr->sa_family) == 0 &&
sa_family == AF_UNIX)
addrlen = 110;
return sys_sendto(fd, buff, len, flags, addr, addrlen);
}
asmlinkage long sys_oabi_sendmsg(int fd, struct msghdr __user *msg, unsigned flags)
{
struct sockaddr __user *addr;
int msg_namelen;
sa_family_t sa_family;
if (msg &&
get_user(msg_namelen, &msg->msg_namelen) == 0 &&
msg_namelen == 112 &&
get_user(addr, &msg->msg_name) == 0 &&
get_user(sa_family, &addr->sa_family) == 0 &&
sa_family == AF_UNIX)
{
/*
* HACK ALERT: there is a limit to how much backward bending
* we should do for what is actually a transitional
* compatibility layer. This already has known flaws with
* a few ioctls that we don't intend to fix. Therefore
* consider this blatent hack as another one... and take care
* to run for cover. In most cases it will "just work fine".
* If it doesn't, well, tough.
*/
put_user(110, &msg->msg_namelen);
}
return sys_sendmsg(fd, msg, flags);
}
asmlinkage long sys_oabi_socketcall(int call, unsigned long __user *args)
{
unsigned long r = -EFAULT, a[6];
switch (call) {
case SYS_BIND:
if (copy_from_user(a, args, 3 * sizeof(long)) == 0)
r = sys_oabi_bind(a[0], (struct sockaddr __user *)a[1], a[2]);
break;
case SYS_CONNECT:
if (copy_from_user(a, args, 3 * sizeof(long)) == 0)
r = sys_oabi_connect(a[0], (struct sockaddr __user *)a[1], a[2]);
break;
case SYS_SENDTO:
if (copy_from_user(a, args, 6 * sizeof(long)) == 0)
r = sys_oabi_sendto(a[0], (void __user *)a[1], a[2], a[3],
(struct sockaddr __user *)a[4], a[5]);
break;
case SYS_SENDMSG:
if (copy_from_user(a, args, 3 * sizeof(long)) == 0)
r = sys_oabi_sendmsg(a[0], (struct msghdr __user *)a[1], a[2]);
break;
default:
r = sys_socketcall(call, args);
}
return r;
}

View File

@ -422,12 +422,14 @@ static int timer_dyn_tick_disable(void)
void timer_dyn_reprogram(void) void timer_dyn_reprogram(void)
{ {
struct dyn_tick_timer *dyn_tick = system_timer->dyn_tick; struct dyn_tick_timer *dyn_tick = system_timer->dyn_tick;
unsigned long next, seq;
if (dyn_tick) { if (dyn_tick && (dyn_tick->state & DYN_TICK_ENABLED)) {
write_seqlock(&xtime_lock); next = next_timer_interrupt();
if (dyn_tick->state & DYN_TICK_ENABLED) do {
seq = read_seqbegin(&xtime_lock);
dyn_tick->reprogram(next_timer_interrupt() - jiffies); dyn_tick->reprogram(next_timer_interrupt() - jiffies);
write_sequnlock(&xtime_lock); } while (read_seqretry(&xtime_lock, seq));
} }
} }

View File

@ -19,6 +19,7 @@
#include <linux/personality.h> #include <linux/personality.h>
#include <linux/ptrace.h> #include <linux/ptrace.h>
#include <linux/kallsyms.h> #include <linux/kallsyms.h>
#include <linux/delay.h>
#include <linux/init.h> #include <linux/init.h>
#include <asm/atomic.h> #include <asm/atomic.h>
@ -231,6 +232,13 @@ NORET_TYPE void die(const char *str, struct pt_regs *regs, int err)
__die(str, err, thread, regs); __die(str, err, thread, regs);
bust_spinlocks(0); bust_spinlocks(0);
spin_unlock_irq(&die_lock); spin_unlock_irq(&die_lock);
if (panic_on_oops) {
printk(KERN_EMERG "Fatal exception: panic in 5 seconds\n");
ssleep(5);
panic("Fatal exception");
}
do_exit(SIGSEGV); do_exit(SIGSEGV);
} }

View File

@ -29,8 +29,8 @@ ENTRY(__aeabi_lmul)
mul xh, yl, xh mul xh, yl, xh
mla xh, xl, yh, xh mla xh, xl, yh, xh
mov ip, xl, asr #16 mov ip, xl, lsr #16
mov yh, yl, asr #16 mov yh, yl, lsr #16
bic xl, xl, ip, lsl #16 bic xl, xl, ip, lsl #16
bic yl, yl, yh, lsl #16 bic yl, yl, yh, lsl #16
mla xh, yh, ip, xh mla xh, yh, ip, xh

View File

@ -100,8 +100,10 @@ void __init at91_add_device_udc(struct at91_udc_data *data)
at91_set_gpio_input(data->vbus_pin, 0); at91_set_gpio_input(data->vbus_pin, 0);
at91_set_deglitch(data->vbus_pin, 1); at91_set_deglitch(data->vbus_pin, 1);
} }
if (data->pullup_pin) if (data->pullup_pin) {
at91_set_gpio_output(data->pullup_pin, 0); at91_set_gpio_output(data->pullup_pin, 0);
at91_set_multi_drive(data->pullup_pin, 1);
}
udc_data = *data; udc_data = *data;
platform_device_register(&at91rm9200_udc_device); platform_device_register(&at91rm9200_udc_device);

View File

@ -159,6 +159,23 @@ int __init_or_module at91_set_deglitch(unsigned pin, int is_on)
} }
EXPORT_SYMBOL(at91_set_deglitch); EXPORT_SYMBOL(at91_set_deglitch);
/*
* enable/disable the multi-driver; This is only valid for output and
* allows the output pin to run as an open collector output.
*/
int __init_or_module at91_set_multi_drive(unsigned pin, int is_on)
{
void __iomem *pio = pin_to_controller(pin);
unsigned mask = pin_to_mask(pin);
if (!pio)
return -EINVAL;
__raw_writel(mask, pio + (is_on ? PIO_MDER : PIO_MDDR));
return 0;
}
EXPORT_SYMBOL(at91_set_multi_drive);
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
@ -257,8 +274,18 @@ static void gpio_irq_handler(unsigned irq, struct irqdesc *desc, struct pt_regs
gpio = &irq_desc[pin]; gpio = &irq_desc[pin];
while (isr) { while (isr) {
if (isr & 1) if (isr & 1) {
gpio->handle(pin, gpio, regs); if (unlikely(gpio->disable_depth)) {
/*
* The core ARM interrupt handler lazily disables IRQs so
* another IRQ must be generated before it actually gets
* here to be disabled on the GPIO controller.
*/
gpio_irq_mask(pin);
}
else
gpio->handle(pin, gpio, regs);
}
pin++; pin++;
gpio++; gpio++;
isr >>= 1; isr >>= 1;

View File

@ -24,6 +24,8 @@ config ARCH_CEIVA
config ARCH_CLEP7312 config ARCH_CLEP7312
bool "CLEP7312" bool "CLEP7312"
help
Boards based on the Cirrus Logic 7212/7312 chips.
config ARCH_EDB7211 config ARCH_EDB7211
bool "EDB7211" bool "EDB7211"

View File

@ -27,7 +27,6 @@
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include "generic.h" #include "generic.h"
#include <asm/serial.h>
static struct resource cs89x0_resources[] = { static struct resource cs89x0_resources[] = {
[0] = { [0] = {

View File

@ -469,7 +469,9 @@ static void cp_clcd_enable(struct clcd_fb *fb)
if (fb->fb.var.bits_per_pixel <= 8) if (fb->fb.var.bits_per_pixel <= 8)
val = CM_CTRL_LCDMUXSEL_VGA_8421BPP; val = CM_CTRL_LCDMUXSEL_VGA_8421BPP;
else if (fb->fb.var.bits_per_pixel <= 16) else if (fb->fb.var.bits_per_pixel <= 16)
val = CM_CTRL_LCDMUXSEL_VGA_16BPP; val = CM_CTRL_LCDMUXSEL_VGA_16BPP
| CM_CTRL_LCDEN0 | CM_CTRL_LCDEN1
| CM_CTRL_STATIC1 | CM_CTRL_STATIC2;
else else
val = 0; /* no idea for this, don't trust the docs */ val = 0; /* no idea for this, don't trust the docs */

View File

@ -140,6 +140,18 @@ static void __init poke_milo(void)
mb(); mb();
} }
/*
* Initialise the CPU possible map early - this describes the CPUs
* which may be present or become present in the system.
*/
void __init smp_init_cpus(void)
{
unsigned int i, ncores = get_core_count();
for (i = 0; i < ncores; i++)
cpu_set(i, cpu_possible_map);
}
void __init smp_prepare_cpus(unsigned int max_cpus) void __init smp_prepare_cpus(unsigned int max_cpus)
{ {
unsigned int ncores = get_core_count(); unsigned int ncores = get_core_count();
@ -176,14 +188,11 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
max_cpus = ncores; max_cpus = ncores;
/* /*
* Initialise the possible/present maps. * Initialise the present map, which describes the set of CPUs
* cpu_possible_map describes the set of CPUs which may be present * actually populated at the present time.
* cpu_present_map describes the set of CPUs populated
*/ */
for (i = 0; i < max_cpus; i++) { for (i = 0; i < max_cpus; i++)
cpu_set(i, cpu_possible_map);
cpu_set(i, cpu_present_map); cpu_set(i, cpu_present_map);
}
/* /*
* Do we need any more CPUs? If so, then let them know where * Do we need any more CPUs? If so, then let them know where

View File

@ -13,7 +13,6 @@
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/config.h> #include <linux/config.h>
#include <linux/init.h>
#include <linux/major.h> #include <linux/major.h>
#include <linux/fs.h> #include <linux/fs.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>

View File

@ -12,7 +12,6 @@
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/config.h> #include <linux/config.h>
#include <linux/init.h>
#include <linux/major.h> #include <linux/major.h>
#include <linux/fs.h> #include <linux/fs.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>

View File

@ -106,6 +106,7 @@ static void __init enp2611_pci_preinit(void)
{ {
ixp2000_reg_write(IXP2000_PCI_ADDR_EXT, 0x00100000); ixp2000_reg_write(IXP2000_PCI_ADDR_EXT, 0x00100000);
ixp2000_pci_preinit(); ixp2000_pci_preinit();
pcibios_setup("firmware");
} }
static inline int enp2611_pci_valid_device(struct pci_bus *bus, static inline int enp2611_pci_valid_device(struct pci_bus *bus,

View File

@ -68,6 +68,7 @@ void __init ixdp2400_pci_preinit(void)
{ {
ixp2000_reg_write(IXP2000_PCI_ADDR_EXT, 0x00100000); ixp2000_reg_write(IXP2000_PCI_ADDR_EXT, 0x00100000);
ixp2000_pci_preinit(); ixp2000_pci_preinit();
pcibios_setup("firmware");
} }
int ixdp2400_pci_setup(int nr, struct pci_sys_data *sys) int ixdp2400_pci_setup(int nr, struct pci_sys_data *sys)

View File

@ -212,6 +212,7 @@ void __init ixdp2x01_pci_preinit(void)
{ {
ixp2000_reg_write(IXP2000_PCI_ADDR_EXT, 0x00000000); ixp2000_reg_write(IXP2000_PCI_ADDR_EXT, 0x00000000);
ixp2000_pci_preinit(); ixp2000_pci_preinit();
pcibios_setup("firmware");
} }
#define DEVPIN(dev, pin) ((pin) | ((dev) << 3)) #define DEVPIN(dev, pin) ((pin) | ((dev) << 3))
@ -299,7 +300,9 @@ struct hw_pci ixdp2x01_pci __initdata = {
int __init ixdp2x01_pci_init(void) int __init ixdp2x01_pci_init(void)
{ {
pci_common_init(&ixdp2x01_pci); if (machine_is_ixdp2401() || machine_is_ixdp2801())
pci_common_init(&ixdp2x01_pci);
return 0; return 0;
} }

View File

@ -8,11 +8,9 @@ menu "Intel IXP4xx Implementation Options"
comment "IXP4xx Platforms" comment "IXP4xx Platforms"
# This entry is placed on top because otherwise it would have
# been shown as a submenu.
config MACH_NSLU2 config MACH_NSLU2
bool bool
prompt "NSLU2" if !(MACH_IXDP465 || MACH_IXDPG425 || ARCH_IXDP425 || ARCH_ADI_COYOTE || ARCH_AVILA || ARCH_IXCDP1100 || ARCH_PRPMC1100 || MACH_GTWX5715) prompt "Linksys NSLU2"
help help
Say 'Y' here if you want your kernel to support Linksys's Say 'Y' here if you want your kernel to support Linksys's
NSLU2 NAS device. For more information on this platform, NSLU2 NAS device. For more information on this platform,

View File

@ -111,24 +111,30 @@ static int ixp4xx_set_irq_type(unsigned int irq, unsigned int type)
if (line < 0) if (line < 0)
return -EINVAL; return -EINVAL;
if (type & IRQT_BOTHEDGE) { switch (type){
case IRQT_BOTHEDGE:
int_style = IXP4XX_GPIO_STYLE_TRANSITIONAL; int_style = IXP4XX_GPIO_STYLE_TRANSITIONAL;
irq_type = IXP4XX_IRQ_EDGE; irq_type = IXP4XX_IRQ_EDGE;
} else if (type & IRQT_RISING) { break;
case IRQT_RISING:
int_style = IXP4XX_GPIO_STYLE_RISING_EDGE; int_style = IXP4XX_GPIO_STYLE_RISING_EDGE;
irq_type = IXP4XX_IRQ_EDGE; irq_type = IXP4XX_IRQ_EDGE;
} else if (type & IRQT_FALLING) { break;
case IRQT_FALLING:
int_style = IXP4XX_GPIO_STYLE_FALLING_EDGE; int_style = IXP4XX_GPIO_STYLE_FALLING_EDGE;
irq_type = IXP4XX_IRQ_EDGE; irq_type = IXP4XX_IRQ_EDGE;
} else if (type & IRQT_HIGH) { break;
case IRQT_HIGH:
int_style = IXP4XX_GPIO_STYLE_ACTIVE_HIGH; int_style = IXP4XX_GPIO_STYLE_ACTIVE_HIGH;
irq_type = IXP4XX_IRQ_LEVEL; irq_type = IXP4XX_IRQ_LEVEL;
} else if (type & IRQT_LOW) { break;
case IRQT_LOW:
int_style = IXP4XX_GPIO_STYLE_ACTIVE_LOW; int_style = IXP4XX_GPIO_STYLE_ACTIVE_LOW;
irq_type = IXP4XX_IRQ_LEVEL; irq_type = IXP4XX_IRQ_LEVEL;
} else break;
default:
return -EINVAL; return -EINVAL;
}
ixp4xx_config_irq(irq, irq_type); ixp4xx_config_irq(irq, irq_type);
if (line >= 8) { /* pins 8-15 */ if (line >= 8) { /* pins 8-15 */

View File

@ -56,6 +56,9 @@ static int __init nas100d_power_init(void)
static void __exit nas100d_power_exit(void) static void __exit nas100d_power_exit(void)
{ {
if (!(machine_is_nas100d()))
return;
free_irq(NAS100D_RB_IRQ, NULL); free_irq(NAS100D_RB_IRQ, NULL);
} }

View File

@ -113,6 +113,9 @@ static void __init nas100d_init(void)
{ {
ixp4xx_sys_init(); ixp4xx_sys_init();
/* gpio 14 and 15 are _not_ clocks */
*IXP4XX_GPIO_GPCLKR = 0;
nas100d_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); nas100d_flash_resource.start = IXP4XX_EXP_BUS_BASE(0);
nas100d_flash_resource.end = nas100d_flash_resource.end =
IXP4XX_EXP_BUS_BASE(0) + ixp4xx_exp_bus_size - 1; IXP4XX_EXP_BUS_BASE(0) + ixp4xx_exp_bus_size - 1;

View File

@ -77,6 +77,9 @@ static int __init nslu2_power_init(void)
static void __exit nslu2_power_exit(void) static void __exit nslu2_power_exit(void)
{ {
if (!(machine_is_nslu2()))
return;
free_irq(NSLU2_RB_IRQ, NULL); free_irq(NSLU2_RB_IRQ, NULL);
free_irq(NSLU2_PB_IRQ, NULL); free_irq(NSLU2_PB_IRQ, NULL);
} }

View File

@ -27,8 +27,6 @@ static struct flash_platform_data nslu2_flash_data = {
}; };
static struct resource nslu2_flash_resource = { static struct resource nslu2_flash_resource = {
.start = NSLU2_FLASH_BASE,
.end = NSLU2_FLASH_BASE + NSLU2_FLASH_SIZE,
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}; };
@ -52,6 +50,12 @@ static struct platform_device nslu2_i2c_controller = {
.num_resources = 0, .num_resources = 0,
}; };
static struct platform_device nslu2_beeper = {
.name = "ixp4xx-beeper",
.id = NSLU2_GPIO_BUZZ,
.num_resources = 0,
};
static struct resource nslu2_uart_resources[] = { static struct resource nslu2_uart_resources[] = {
{ {
.start = IXP4XX_UART1_BASE_PHYS, .start = IXP4XX_UART1_BASE_PHYS,
@ -99,6 +103,7 @@ static struct platform_device *nslu2_devices[] __initdata = {
&nslu2_i2c_controller, &nslu2_i2c_controller,
&nslu2_flash, &nslu2_flash,
&nslu2_uart, &nslu2_uart,
&nslu2_beeper,
}; };
static void nslu2_power_off(void) static void nslu2_power_off(void)
@ -116,6 +121,10 @@ static void __init nslu2_init(void)
{ {
ixp4xx_sys_init(); ixp4xx_sys_init();
nslu2_flash_resource.start = IXP4XX_EXP_BUS_BASE(0);
nslu2_flash_resource.end =
IXP4XX_EXP_BUS_BASE(0) + ixp4xx_exp_bus_size - 1;
pm_power_off = nslu2_power_off; pm_power_off = nslu2_power_off;
platform_add_devices(nslu2_devices, ARRAY_SIZE(nslu2_devices)); platform_add_devices(nslu2_devices, ARRAY_SIZE(nslu2_devices));

View File

@ -30,6 +30,7 @@
static void __init omap_generic_init_irq(void) static void __init omap_generic_init_irq(void)
{ {
omap1_init_common_hw();
omap_init_irq(); omap_init_irq();
} }
@ -104,7 +105,7 @@ static void __init omap_generic_init(void)
static void __init omap_generic_map_io(void) static void __init omap_generic_map_io(void)
{ {
omap_map_common_io(); omap1_map_common_io();
} }
MACHINE_START(OMAP_GENERIC, "Generic OMAP1510/1610/1710") MACHINE_START(OMAP_GENERIC, "Generic OMAP1510/1610/1710")

View File

@ -128,6 +128,7 @@ static void __init h2_init_smc91x(void)
static void __init h2_init_irq(void) static void __init h2_init_irq(void)
{ {
omap1_init_common_hw();
omap_init_irq(); omap_init_irq();
omap_gpio_init(); omap_gpio_init();
h2_init_smc91x(); h2_init_smc91x();
@ -194,7 +195,7 @@ static void __init h2_init(void)
static void __init h2_map_io(void) static void __init h2_map_io(void)
{ {
omap_map_common_io(); omap1_map_common_io();
} }
MACHINE_START(OMAP_H2, "TI-H2") MACHINE_START(OMAP_H2, "TI-H2")

View File

@ -203,6 +203,7 @@ static void __init h3_init_smc91x(void)
void h3_init_irq(void) void h3_init_irq(void)
{ {
omap1_init_common_hw();
omap_init_irq(); omap_init_irq();
omap_gpio_init(); omap_gpio_init();
h3_init_smc91x(); h3_init_smc91x();
@ -210,7 +211,7 @@ void h3_init_irq(void)
static void __init h3_map_io(void) static void __init h3_map_io(void)
{ {
omap_map_common_io(); omap1_map_common_io();
} }
MACHINE_START(OMAP_H3, "TI OMAP1710 H3 board") MACHINE_START(OMAP_H3, "TI OMAP1710 H3 board")

View File

@ -181,6 +181,7 @@ static void __init innovator_init_smc91x(void)
void innovator_init_irq(void) void innovator_init_irq(void)
{ {
omap1_init_common_hw();
omap_init_irq(); omap_init_irq();
omap_gpio_init(); omap_gpio_init();
#ifdef CONFIG_ARCH_OMAP15XX #ifdef CONFIG_ARCH_OMAP15XX
@ -285,7 +286,7 @@ static void __init innovator_init(void)
static void __init innovator_map_io(void) static void __init innovator_map_io(void)
{ {
omap_map_common_io(); omap1_map_common_io();
#ifdef CONFIG_ARCH_OMAP15XX #ifdef CONFIG_ARCH_OMAP15XX
if (cpu_is_omap1510()) { if (cpu_is_omap1510()) {

Some files were not shown because too many files have changed in this diff Show More