Merge branch 'origin'
This commit is contained in:
commit
b2faf597d9
2
CREDITS
2
CREDITS
|
@ -3101,7 +3101,7 @@ S: Minto, NSW, 2566
|
|||
S: Australia
|
||||
|
||||
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
|
||||
|
||||
N: Chris Smith
|
||||
|
|
|
@ -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
|
||||
described that same year [Linder02a].
|
||||
|
||||
Also in 2002, Michael [Michael02b,Michael02a] presented techniques
|
||||
that defer the destruction of data structures to simplify non-blocking
|
||||
synchronization (wait-free synchronization, lock-free synchronization,
|
||||
and obstruction-free synchronization are all examples of non-blocking
|
||||
synchronization). In particular, this technique eliminates locking,
|
||||
reduces contention, reduces memory latency for readers, and parallelizes
|
||||
pipeline stalls and memory latency for writers. However, these
|
||||
techniques still impose significant read-side overhead in the form of
|
||||
memory barriers. Researchers at Sun worked along similar lines in the
|
||||
same timeframe [HerlihyLM02,HerlihyLMS03].
|
||||
Also in 2002, Michael [Michael02b,Michael02a] presented "hazard-pointer"
|
||||
techniques that defer the destruction of data structures to simplify
|
||||
non-blocking synchronization (wait-free synchronization, lock-free
|
||||
synchronization, and obstruction-free synchronization are all examples of
|
||||
non-blocking synchronization). In particular, this technique eliminates
|
||||
locking, reduces contention, reduces memory latency for readers, and
|
||||
parallelizes pipeline stalls and memory latency for writers. However,
|
||||
these techniques still impose significant read-side overhead in the
|
||||
form of memory barriers. Researchers at Sun worked along similar lines
|
||||
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
|
||||
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],
|
||||
and a paper describing SELinux performance with RCU [JamesMorris04b].
|
||||
|
||||
|
||||
2005 has seen further adaptation of RCU to realtime use, permitting
|
||||
preemption of RCU realtime critical sections [PaulMcKenney05a,
|
||||
PaulMcKenney05b].
|
||||
|
|
|
@ -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
|
||||
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.
|
||||
|
|
|
@ -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.
|
||||
|
||||
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,
|
||||
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;
|
||||
|
||||
/* Do not use the _rcu iterator here, since this is the only
|
||||
* deletion routine. */
|
||||
/* Do not need to use the _rcu iterator here, since this
|
||||
* is the only deletion routine. */
|
||||
list_for_each_entry(e, list, list) {
|
||||
if (!audit_compare_rule(rule, &e->rule)) {
|
||||
spin_lock(&e->lock);
|
||||
|
@ -304,9 +304,12 @@ function to reject newly deleted data.
|
|||
|
||||
|
||||
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
|
||||
the caller will be processing stale data in any case. If it is really
|
||||
OK to be processing stale data, then you don't need a "deleted" flag.
|
||||
If processing stale data really is a problem, then you need to hold the
|
||||
per-entry lock across all of the code that uses the value looked up.
|
||||
If the search function drops the per-entry lock before returning,
|
||||
then the caller will be processing stale data in any case. If it
|
||||
is really OK to be processing stale data, then you don't need a
|
||||
"deleted" flag. If processing stale data really is a problem,
|
||||
then you need to hold the per-entry lock across all of the code
|
||||
that uses the value that was returned.
|
||||
|
|
|
@ -111,6 +111,11 @@ o What are all these files in this directory?
|
|||
|
||||
You are reading it!
|
||||
|
||||
rcuref.txt
|
||||
|
||||
Describes how to combine use of reference counts
|
||||
with RCU.
|
||||
|
||||
whatisRCU.txt
|
||||
|
||||
Overview of how the RCU implementation works. Along
|
||||
|
|
|
@ -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
|
||||
reader/writer spinlocks or semaphores are straight forward as in:
|
||||
Reference counting on elements of lists which are protected by traditional
|
||||
reader/writer spinlocks or semaphores are straightforward:
|
||||
|
||||
1. 2.
|
||||
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
|
||||
write_lock in add() and delete() to spin_lock and changing read_lock
|
||||
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
|
||||
in search_and_reference to rcu_read_lock(), the atomic_get in
|
||||
search_and_reference could potentially hold reference to an element which
|
||||
has already been deleted from the list/array. atomic_inc_not_zero takes
|
||||
care of this scenario. search_and_reference should look as;
|
||||
has already been deleted from the list/array. Use atomic_inc_not_zero()
|
||||
in this scenario as follows:
|
||||
|
||||
1. 2.
|
||||
add() search_and_reference()
|
||||
|
@ -51,17 +51,16 @@ add() search_and_reference()
|
|||
release_referenced() delete()
|
||||
{ {
|
||||
... write_lock(&list_lock);
|
||||
atomic_dec(&el->rc, relfunc) ...
|
||||
... delete_element
|
||||
} write_unlock(&list_lock);
|
||||
...
|
||||
if (atomic_dec_and_test(&el->rc)) ...
|
||||
call_rcu(&el->head, el_free); delete_element
|
||||
... write_unlock(&list_lock);
|
||||
} ...
|
||||
if (atomic_dec_and_test(&el->rc))
|
||||
call_rcu(&el->head, el_free);
|
||||
...
|
||||
}
|
||||
|
||||
Sometimes, reference to the element need to be obtained in the
|
||||
update (write) stream. In such cases, atomic_inc_not_zero might be an
|
||||
overkill since the spinlock serialising list updates are held. atomic_inc
|
||||
is to be used in such cases.
|
||||
|
||||
Sometimes, a reference to the element needs to be obtained in the
|
||||
update (write) stream. In such cases, atomic_inc_not_zero() might be
|
||||
overkill, since we hold the update-side spinlock. One might instead
|
||||
use atomic_inc() in such cases.
|
||||
|
|
|
@ -200,10 +200,11 @@ rcu_assign_pointer()
|
|||
the new value, and also executes any memory-barrier instructions
|
||||
required for a given CPU architecture.
|
||||
|
||||
Perhaps more important, it serves to document which pointers
|
||||
are protected by RCU. That said, rcu_assign_pointer() is most
|
||||
frequently used indirectly, via the _rcu list-manipulation
|
||||
primitives such as list_add_rcu().
|
||||
Perhaps just as important, it serves to document (1) which
|
||||
pointers are protected by RCU and (2) the point at which a
|
||||
given structure becomes accessible to other CPUs. That said,
|
||||
rcu_assign_pointer() is most frequently used indirectly, via
|
||||
the _rcu list-manipulation primitives such as list_add_rcu().
|
||||
|
||||
rcu_dereference()
|
||||
|
||||
|
@ -258,9 +259,11 @@ rcu_dereference()
|
|||
locking.
|
||||
|
||||
As with rcu_assign_pointer(), an important function of
|
||||
rcu_dereference() is to document which pointers are protected
|
||||
by RCU. And, again like rcu_assign_pointer(), rcu_dereference()
|
||||
is typically used indirectly, via the _rcu list-manipulation
|
||||
rcu_dereference() is to document which pointers are protected by
|
||||
RCU, in particular, flagging a pointer that is subject to changing
|
||||
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().
|
||||
|
||||
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?
|
||||
|
||||
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.
|
||||
|
||||
struct foo {
|
||||
|
@ -410,6 +413,8 @@ o Use synchronize_rcu() -after- removing a data element from an
|
|||
data item.
|
||||
|
||||
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?
|
||||
|
@ -513,7 +518,7 @@ production-quality implementation, and see:
|
|||
|
||||
for papers describing the Linux kernel RCU implementation. The OLS'01
|
||||
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
|
||||
|
@ -768,7 +773,6 @@ RCU pointer/list traversal:
|
|||
rcu_dereference
|
||||
list_for_each_rcu (to be deprecated in favor of
|
||||
list_for_each_entry_rcu)
|
||||
list_for_each_safe_rcu (deprecated, not used)
|
||||
list_for_each_entry_rcu
|
||||
list_for_each_continue_rcu (to be deprecated in favor of new
|
||||
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:
|
||||
|
||||
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
|
||||
rcu_gp_mutex.
|
||||
|
@ -894,7 +899,7 @@ Answer: Just as PREEMPT_RT permits preemption of spinlock
|
|||
ACKNOWLEDGEMENTS
|
||||
|
||||
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.
|
||||
|
|
|
@ -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.
|
||||
|
|
@ -1,50 +1,43 @@
|
|||
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
|
||||
~~~~~~~~
|
||||
|
||||
This driver model is a unification of all the current, disparate driver models
|
||||
that are currently in the kernel. It is intended to augment the
|
||||
The Linux Kernel Driver Model is a unification of all the disparate driver
|
||||
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
|
||||
and operations into globally accessible data structures.
|
||||
|
||||
Current driver models implement some sort of tree-like structure (sometimes
|
||||
just a list) for the devices they control. But, there is no linkage between
|
||||
the different bus types.
|
||||
Traditional driver models implemented some sort of tree-like structure
|
||||
(sometimes just a list) for the devices they control. There wasn't any
|
||||
uniformity across the different bus types.
|
||||
|
||||
A common data structure can provide this linkage with little overhead: when a
|
||||
bus driver discovers a particular device, it can insert it into the global
|
||||
tree as well as its local tree. In fact, the local tree becomes just a subset
|
||||
of the global tree.
|
||||
|
||||
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 current driver model provides a comon, uniform data model for describing
|
||||
a bus and the devices that can appear under the bus. The unified bus
|
||||
model includes a set of common attributes which all busses carry, and a set
|
||||
of common callbacks, such as device discovery during bus probing, bus
|
||||
shutdown, bus power management, etc.
|
||||
|
||||
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
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
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.
|
||||
|
||||
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 device device;
|
||||
struct device dev;
|
||||
};
|
||||
|
||||
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 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
|
||||
of struct device. More precisely, device-specific drivers should not touch
|
||||
fields of struct device unless there is a strong compelling reason to do so.
|
||||
device. Individual PCI device drivers that have been converted the the current
|
||||
driver model generally do not and should not touch the fields of struct device,
|
||||
unless there is a strong compelling reason to do so.
|
||||
|
||||
This abstraction is prevention of unnecessary pain during transitional phases.
|
||||
If the name of the field changes or is removed, then every downstream driver
|
||||
|
|
|
@ -148,3 +148,17 @@ 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
|
||||
issue.
|
||||
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>
|
||||
|
|
|
@ -320,6 +320,7 @@ static struct config_item_type simple_children_type = {
|
|||
.ct_item_ops = &simple_children_item_ops,
|
||||
.ct_group_ops = &simple_children_group_ops,
|
||||
.ct_attrs = simple_children_attrs,
|
||||
.ct_owner = THIS_MODULE,
|
||||
};
|
||||
|
||||
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_group_ops = &group_children_group_ops,
|
||||
.ct_attrs = group_children_attrs,
|
||||
.ct_owner = THIS_MODULE,
|
||||
};
|
||||
|
||||
static struct configfs_subsystem group_children_subsys = {
|
||||
|
|
|
@ -35,6 +35,7 @@ Features which OCFS2 does not support yet:
|
|||
be cluster coherent.
|
||||
- quotas
|
||||
- cluster aware flock
|
||||
- cluster aware lockf
|
||||
- Directory change notification (F_NOTIFY)
|
||||
- Distributed Caching (F_SETLEASE/F_GETLEASE/break_lease)
|
||||
- POSIX ACLs
|
||||
|
|
|
@ -45,10 +45,10 @@ How to extract the documentation
|
|||
|
||||
If you just want to read the ready-made books on the various
|
||||
subsystems (see Documentation/DocBook/*.tmpl), just type 'make
|
||||
psdocs', or 'make pdfdocs', or 'make htmldocs', depending on your
|
||||
preference. If you would rather read a different format, you can type
|
||||
'make sgmldocs' and then use DocBook tools to convert
|
||||
Documentation/DocBook/*.sgml to a format of your choice (for example,
|
||||
psdocs', or 'make pdfdocs', or 'make htmldocs', depending on your
|
||||
preference. If you would rather read a different format, you can type
|
||||
'make sgmldocs' and then use DocBook tools to convert
|
||||
Documentation/DocBook/*.sgml to a format of your choice (for example,
|
||||
'db2html ...' if 'make htmldocs' was not defined).
|
||||
|
||||
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.
|
||||
|
||||
|
||||
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
|
||||
-----------------------------------
|
||||
|
||||
|
@ -147,4 +177,3 @@ documentation, in <filename>, for the functions listed.
|
|||
|
||||
Tim.
|
||||
*/ <twaugh@redhat.com>
|
||||
|
||||
|
|
|
@ -452,6 +452,11 @@ running once the system is up.
|
|||
|
||||
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]
|
||||
|
||||
edb= [HW,PS2]
|
||||
|
|
|
@ -427,6 +427,23 @@ icmp_ignore_bogus_error_responses - BOOLEAN
|
|||
will avoid log file clutter.
|
||||
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
|
||||
Change the maximum number of multicast groups we can subscribe to.
|
||||
Default: 20
|
||||
|
|
|
@ -1068,7 +1068,7 @@ SYNOPSIS
|
|||
|
||||
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 {
|
||||
...
|
||||
void (*frob_control) (struct parport *port,
|
||||
unsigned char mask,
|
||||
unsigned char val);
|
||||
unsigned char (*frob_control) (struct parport *port,
|
||||
unsigned char mask,
|
||||
unsigned char val);
|
||||
...
|
||||
};
|
||||
|
||||
|
|
|
@ -1,246 +1,396 @@
|
|||
|
||||
PCI Error Recovery
|
||||
------------------
|
||||
May 31, 2005
|
||||
February 2, 2006
|
||||
|
||||
Current document maintainer:
|
||||
Linas Vepstas <linas@austin.ibm.com>
|
||||
Current document maintainer:
|
||||
Linas Vepstas <linas@austin.ibm.com>
|
||||
|
||||
|
||||
Some PCI bus controllers are able to detect certain "hard" PCI errors
|
||||
on the bus, such as parity errors on the data and address busses, as
|
||||
well as SERR and PERR errors. These chipsets are then able to disable
|
||||
I/O to/from the affected device, so that, for example, a bad DMA
|
||||
address doesn't end up corrupting system memory. These same chipsets
|
||||
are also able to reset the affected PCI device, and return it to
|
||||
working condition. This document describes a generic API form
|
||||
performing error recovery.
|
||||
Many PCI bus controllers are able to detect a variety of hardware
|
||||
PCI errors on the bus, such as parity errors on the data and address
|
||||
busses, as well as SERR and PERR errors. Some of the more advanced
|
||||
chipsets are able to deal with these errors; these include PCI-E chipsets,
|
||||
and the PCI-host bridges found on IBM Power4 and Power5-based pSeries
|
||||
boxes. A typical action taken is to disconnect the affected device,
|
||||
halting all I/O to it. The goal of a disconnection is to avoid system
|
||||
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
|
||||
be a way for the kernel to coordinate with all affected device drivers
|
||||
so that the pci card can be made operational again, possibly after
|
||||
performing a full electrical #RST of the PCI card. The API below
|
||||
provides a generic API for device drivers to be notified of PCI
|
||||
errors, and to be notified of, and respond to, a reset sequence.
|
||||
Reporting and recovery is performed in several steps. First, when
|
||||
a PCI hardware error has resulted in a bus disconnect, that event
|
||||
is reported as soon as possible to all affected device drivers,
|
||||
including multiple instances of a device driver on multi-function
|
||||
cards. This allows device drivers to avoid deadlocking in spinloops,
|
||||
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
|
||||
Ben Herrenschmidt, circa 5 april 2005
|
||||
Next, recovery is performed in several stages. Most of the complexity
|
||||
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
|
||||
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
|
||||
"non-aware" driver, behaviour on these is platform dependant.
|
||||
Platforms like ppc64 can try to simulate 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.
|
||||
pci_driver. A driver that fails to provide the structure is "non-aware",
|
||||
and the actual recovery steps taken are platform dependent. The
|
||||
arch/powerpc implementation will simulate a PCI hotplug remove/add.
|
||||
|
||||
This structure has the form:
|
||||
|
||||
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 (*resume)(struct pci_dev *dev);
|
||||
int (*link_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
|
||||
only mandatory one is 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 the
|
||||
driver is assumed as not doing any direct recovery and requires
|
||||
The possible channel states are:
|
||||
enum pci_channel_state {
|
||||
pci_channel_io_normal, /* I/O channel is in normal state */
|
||||
pci_channel_io_frozen, /* I/O to channel is blocked */
|
||||
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
|
||||
not caring about link resets, in which case, if recover is supported,
|
||||
the core can try recover (but not slot_reset() unless it really did
|
||||
reset the slot). If slot_reset() is not supported, link_reset() can
|
||||
be called instead on a slot reset.
|
||||
not care about link resets. Typically a driver will want to know about
|
||||
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
|
||||
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
|
||||
"synchronisation point", that is, it gives a chance to the driver 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
|
||||
|
||||
STEP 1: Notification
|
||||
--------------------
|
||||
Platform calls the error_detected() callback on every instance of
|
||||
every driver affected by the error.
|
||||
|
||||
At this point, the device might not be accessible anymore, depending on
|
||||
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
|
||||
"quiesce" point. See note about interrupts at the end of this doc.
|
||||
|
||||
Result codes:
|
||||
- PCIERR_RESULT_CAN_RECOVER:
|
||||
Driever returns this if it thinks it might be able to recover
|
||||
All drivers participating in this system must implement this call.
|
||||
The driver must return one of the following result codes:
|
||||
- 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
|
||||
a chance to extract some diagnostic informations (see
|
||||
below).
|
||||
- PCIERR_RESULT_NEED_RESET:
|
||||
Driver returns this if it thinks it can't recover unless the
|
||||
slot is reset.
|
||||
- PCIERR_RESULT_DISCONNECT:
|
||||
Return this if driver thinks it won't recover at all,
|
||||
(this will detach the driver ? or just leave it
|
||||
dangling ? to be decided)
|
||||
a chance to extract some diagnostic information (see
|
||||
mmio_enable, below).
|
||||
- PCI_ERS_RESULT_NEED_RESET:
|
||||
Driver returns this if it can't recover without a hard
|
||||
slot reset.
|
||||
- PCI_ERS_RESULT_DISCONNECT:
|
||||
Driver returns this if it doesn't want to recover at all.
|
||||
|
||||
So at this point, we have called error_detected() for all drivers
|
||||
on the segment that had the error. On ppc64, the slot is isolated. What
|
||||
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.
|
||||
The next step taken will depend on the result codes returned by the
|
||||
drivers.
|
||||
|
||||
>>> Current ppc64 implementation assumes that a device driver will
|
||||
>>> *not* schedule or semaphore in this routine; the current ppc64
|
||||
If all drivers on the segment/slot return PCI_ERS_RESULT_CAN_RECOVER,
|
||||
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;
|
||||
>>> 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
|
||||
>>> recovery implementation (e.g. waiting for all notification threads
|
||||
>>> to "join" before proceeding with recovery.) This seems excessively
|
||||
>>> complex and not worth implementing.
|
||||
|
||||
>>> The current ppc64 implementation doesn't much care if the device
|
||||
>>> attempts i/o at this point, or not. I/O's will fail, returning
|
||||
>>> 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
|
||||
>>> 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
|
||||
>>> 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
|
||||
is NOT a callback for the driver to start operations again, only to
|
||||
peek/poke at the device, extract diagnostic information, if any, and
|
||||
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
|
||||
agree that they can try to recover and no automatic link reset 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
|
||||
directly to 3) or 4). All IOs 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.
|
||||
but not restart operations. This is callback is made if all drivers on
|
||||
a segment agree that they can try to recover and if no automatic link reset
|
||||
was performed by the HW. If the platform can't just re-enable IOs without
|
||||
a slot reset or a link reset, it wont call this callback, and instead
|
||||
will have gone directly to STEP 3 (Link Reset) or STEP 4 (Slot Reset)
|
||||
|
||||
Result codes:
|
||||
- PCIERR_RESULT_RECOVERED
|
||||
>>> The following is proposed; no platform implements this yet:
|
||||
>>> 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
|
||||
functionnal and thinks it is ready to start
|
||||
functional and thinks it is ready to start
|
||||
normal driver operations again. There is no
|
||||
guarantee that the driver will actually be
|
||||
allowed to proceed, as another driver on the
|
||||
same segment might have failed and thus triggered a
|
||||
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
|
||||
recoverable in it's current state and it needs a slot
|
||||
reset to proceed.
|
||||
|
||||
- PCIERR_RESULT_DISCONNECT
|
||||
- PCI_ERS_RESULT_DISCONNECT
|
||||
Same as above. Total failure, no recovery even after
|
||||
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
|
||||
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
|
||||
should check if the device appears to be in working condition.
|
||||
This function acts a bit like 2) mmio_enabled(), in that the driver
|
||||
is not supposed to restart normal driver I/O operations right away.
|
||||
Instead, it should just "probe" the device to check it's recoverability
|
||||
status. If all is right, then the core will call resume() once all
|
||||
drivers have ack'd link_reset().
|
||||
>>> The current powerpc implementation does not implement this callback.
|
||||
|
||||
|
||||
STEP 3: Link Reset
|
||||
------------------
|
||||
The platform resets the link, and then calls the link_reset() callback
|
||||
on all affected device drivers. This is a PCI-Express specific state
|
||||
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 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:
|
||||
(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
|
||||
and then restoring the PCI BARs and PCI configuration header. If the
|
||||
platform supports PCI hotplug, then it might instead perform a hard
|
||||
reset by toggling power on the slot off/on. This call gives drivers
|
||||
the chance to re-initialize the hardware (re-download firmware, etc.),
|
||||
but drivers shouldn't restart normal I/O processing operations at
|
||||
this point. (See note about interrupts; interrupts aren't guaranteed
|
||||
to be delivered until the resume() callback has been called). If all
|
||||
device drivers report success on this callback, the patform will call
|
||||
resume() to complete the error handling and let the driver restart
|
||||
normal I/O processing.
|
||||
|
||||
STEP 4: Slot Reset
|
||||
------------------
|
||||
The platform performs a soft or hard reset of the device, and then
|
||||
calls the slot_reset() callback.
|
||||
|
||||
A soft reset consists of asserting the adapter #RST line and then
|
||||
restoring the PCI BAR's and PCI configuration header to a state
|
||||
that is equivalent to what it would be after a fresh system
|
||||
power-on followed by power-on BIOS/system firmware initialization.
|
||||
If the platform supports PCI hotplug, then the reset might be
|
||||
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
|
||||
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
|
||||
be recovered, there is nothing more that can be done; the platform
|
||||
will typically report a "permanent failure" in such a case. The
|
||||
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:
|
||||
- PCIERR_RESULT_DISCONNECT
|
||||
- PCI_ERS_RESULT_DISCONNECT
|
||||
Same as above.
|
||||
|
||||
>>> The current ppc64 implementation does not try a power-cycle reset
|
||||
>>> if the driver returned PCIERR_RESULT_DISCONNECT. However, it should.
|
||||
Platform proceeds either to STEP 5 (Resume Operations) or STEP 6 (Permanent
|
||||
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
|
||||
callbacks are called is platform policy. A platform with no slot reset
|
||||
capability for example may want to just "ignore" drivers that can't
|
||||
STEP 5: Resume Operations
|
||||
-------------------------
|
||||
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. Keep in mind that in most real life cases, though, there will
|
||||
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 :)
|
||||
|
||||
After much thinking, I decided to leave that to the platform. That is,
|
||||
the recovery API only precies that:
|
||||
The current policy is to turn this into a platform policy.
|
||||
That is, the recovery API only requires that:
|
||||
|
||||
- There is no guarantee that interrupt delivery can proceed from any
|
||||
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.
|
||||
|
||||
- There is no guarantee that interrupt delivery is stopped, that is, ad
|
||||
river that gets an interrupts after detecting an error, or that detects
|
||||
and error within the interrupt handler such that it prevents proper
|
||||
- There is no guarantee that interrupt delivery is stopped, that is,
|
||||
a driver that gets an interrupt after detecting an error, or that detects
|
||||
an error within the interrupt handler such that it prevents proper
|
||||
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
|
||||
condition, typically by masking the irq source during the duration of
|
||||
return IRQ_NOTHANDLED. It's up to the platform to deal with that
|
||||
condition, typically by masking the IRQ source during the duration of
|
||||
the error handling. It is expected that the platform "knows" which
|
||||
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
|
||||
sharing the interrupt, but there is simply no other way. High end
|
||||
platforms aren't supposed to share interrupts between many devices
|
||||
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
|
||||
-------
|
||||
|
|
|
@ -44,7 +44,7 @@ it.
|
|||
/sys/power/image_size controls the size of the image created by
|
||||
the suspend-to-disk mechanism. It can be written a string
|
||||
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,
|
||||
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
|
||||
|
|
|
@ -27,7 +27,7 @@ echo shutdown > /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
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,24 @@
|
|||
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>
|
|
@ -1,5 +1,5 @@
|
|||
====================================================================
|
||||
= Adaptec Ultra320 Family Manager Set v1.3.11 =
|
||||
= Adaptec Ultra320 Family Manager Set =
|
||||
= =
|
||||
= README for =
|
||||
= The Linux Operating System =
|
||||
|
@ -63,6 +63,11 @@ The following information is available in this file:
|
|||
68-pin)
|
||||
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)
|
||||
- Fix several deadlock issues.
|
||||
- Add 29320ALP and 39320B Id's.
|
||||
|
@ -194,7 +199,7 @@ The following information is available in this file:
|
|||
supported)
|
||||
- Support for the PCI-X standard up to 133MHz
|
||||
- Support for the PCI v2.2 standard
|
||||
- Domain Validation
|
||||
- Domain Validation
|
||||
|
||||
2.2. Operating System Support:
|
||||
- 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.
|
||||
|
||||
|
||||
5. Contacting Adaptec
|
||||
5. Adaptec Customer Support
|
||||
|
||||
A Technical Support Identification (TSID) Number is required for
|
||||
Adaptec technical support.
|
||||
- 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
|
||||
product and support status.
|
||||
|
||||
Support Options
|
||||
- Search the Adaptec Support Knowledgebase (ASK) at
|
||||
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
|
||||
Technical Support Specialists at http://ask.adaptec.com.
|
||||
Technical Support Specialists at http://ask.adaptec.com/.
|
||||
|
||||
North America
|
||||
- Visit our Web site at http://www.adaptec.com.
|
||||
- To speak with a Fibre Channel/RAID/External Storage Technical
|
||||
Support Specialist, call 1-321-207-2000,
|
||||
Hours: Monday-Friday, 3:00 A.M. to 5:00 P.M., PST.
|
||||
(Not open on holidays)
|
||||
- For Technical Support in all other technologies including
|
||||
SCSI, call 1-408-934-7274,
|
||||
Hours: Monday-Friday, 6:00 A.M. to 5:00 P.M., PST.
|
||||
(Not open on holidays)
|
||||
- For after hours support, call 1-800-416-8066 ($99/call,
|
||||
$149/call on holidays)
|
||||
- To order Adaptec products including software and cables, call
|
||||
1-800-442-7274 or 1-408-957-7274. You can also visit our
|
||||
online store at http://www.adaptecstore.com
|
||||
- Visit our Web site at http://www.adaptec.com/.
|
||||
- For information about Adaptec's support options, call
|
||||
408-957-2550, 24 hours a day, 7 days a week.
|
||||
- To speak with a Technical Support Specialist,
|
||||
* For hardware products, call 408-934-7274,
|
||||
Monday to Friday, 3:00 am to 5:00 pm, PDT.
|
||||
* For RAID and Fibre Channel products, call 321-207-2000,
|
||||
Monday to Friday, 3:00 am to 5:00 pm, PDT.
|
||||
To expedite your service, have your computer with you.
|
||||
- To order Adaptec products, including accessories and cables,
|
||||
call 408-957-7274. To order cables online go to
|
||||
http://www.adaptec.com/buy-cables/.
|
||||
|
||||
Europe
|
||||
- Visit our Web site at http://www.adaptec-europe.com.
|
||||
- English and French: To speak with a Technical Support
|
||||
Specialist, call one of the following numbers:
|
||||
- English: +32-2-352-3470
|
||||
- French: +32-2-352-3460
|
||||
Hours: Monday-Thursday, 10:00 to 12:30, 13:30 to 17:30 CET
|
||||
Friday, 10:00 to 12:30, 13:30 to 16:30 CET
|
||||
- German: To speak with a Technical Support Specialist,
|
||||
call +49-89-456-40660
|
||||
Hours: Monday-Thursday, 09:30 to 12:30, 13:30 to 16:30 CET
|
||||
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)
|
||||
- Visit our Web site at http://www.adaptec-europe.com/.
|
||||
- To speak with a Technical Support Specialist, call, or email,
|
||||
* German: +49 89 4366 5522, Monday-Friday, 9:00-17:00 CET,
|
||||
http://ask-de.adaptec.com/.
|
||||
* French: +49 89 4366 5533, Monday-Friday, 9:00-17:00 CET,
|
||||
http://ask-fr.adaptec.com/.
|
||||
* English: +49 89 4366 5544, Monday-Friday, 9:00-17:00 GMT,
|
||||
http://ask.adaptec.com/.
|
||||
- You can order Adaptec cables online at
|
||||
http://www.adaptec.com/buy-cables/.
|
||||
|
||||
Japan
|
||||
- Visit our web site at http://www.adaptec.co.jp/.
|
||||
- To speak with a Technical Support Specialist, call
|
||||
+81-3-5308-6120
|
||||
Hours: Monday-Friday, 9:00 a.m. to 12:00 p.m., 1:00 p.m. to
|
||||
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
|
||||
+81 3 5308 6120, Monday-Friday, 9:00 a.m. to 12:00 p.m.,
|
||||
1:00 p.m. to 6:00 p.m.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
/*
|
||||
|
|
|
@ -309,81 +309,57 @@ The following information is available in this file:
|
|||
-----------------------------------------------------------------
|
||||
|
||||
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,
|
||||
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
|
||||
Adaptec technical support.
|
||||
- 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
|
||||
product and support status.
|
||||
|
||||
Support Options
|
||||
- Search the Adaptec Support Knowledgebase (ASK) at
|
||||
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
|
||||
Technical Support Specialists at http://ask.adaptec.com.
|
||||
Technical Support Specialists at http://ask.adaptec.com/.
|
||||
|
||||
North America
|
||||
- Visit our Web site at http://www.adaptec.com.
|
||||
- To speak with a Fibre Channel/RAID/External Storage Technical
|
||||
Support Specialist, call 1-321-207-2000,
|
||||
Hours: Monday-Friday, 3:00 A.M. to 5:00 P.M., PST.
|
||||
(Not open on holidays)
|
||||
- For Technical Support in all other technologies including
|
||||
SCSI, call 1-408-934-7274,
|
||||
Hours: Monday-Friday, 6:00 A.M. to 5:00 P.M., PST.
|
||||
(Not open on holidays)
|
||||
- For after hours support, call 1-800-416-8066 ($99/call,
|
||||
$149/call on holidays)
|
||||
- To order Adaptec products including software and cables, call
|
||||
1-800-442-7274 or 1-408-957-7274. You can also visit our
|
||||
online store at http://www.adaptecstore.com
|
||||
- Visit our Web site at http://www.adaptec.com/.
|
||||
- For information about Adaptec's support options, call
|
||||
408-957-2550, 24 hours a day, 7 days a week.
|
||||
- To speak with a Technical Support Specialist,
|
||||
* For hardware products, call 408-934-7274,
|
||||
Monday to Friday, 3:00 am to 5:00 pm, PDT.
|
||||
* For RAID and Fibre Channel products, call 321-207-2000,
|
||||
Monday to Friday, 3:00 am to 5:00 pm, PDT.
|
||||
To expedite your service, have your computer with you.
|
||||
- To order Adaptec products, including accessories and cables,
|
||||
call 408-957-7274. To order cables online go to
|
||||
http://www.adaptec.com/buy-cables/.
|
||||
|
||||
Europe
|
||||
- Visit our Web site at http://www.adaptec-europe.com.
|
||||
- English and French: To speak with a Technical Support
|
||||
Specialist, call one of the following numbers:
|
||||
- English: +32-2-352-3470
|
||||
- French: +32-2-352-3460
|
||||
Hours: Monday-Thursday, 10:00 to 12:30, 13:30 to 17:30 CET
|
||||
Friday, 10:00 to 12:30, 13:30 to 16:30 CET
|
||||
- German: To speak with a Technical Support Specialist,
|
||||
call +49-89-456-40660
|
||||
Hours: Monday-Thursday, 09:30 to 12:30, 13:30 to 16:30 CET
|
||||
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)
|
||||
- Visit our Web site at http://www.adaptec-europe.com/.
|
||||
- To speak with a Technical Support Specialist, call, or email,
|
||||
* German: +49 89 4366 5522, Monday-Friday, 9:00-17:00 CET,
|
||||
http://ask-de.adaptec.com/.
|
||||
* French: +49 89 4366 5533, Monday-Friday, 9:00-17:00 CET,
|
||||
http://ask-fr.adaptec.com/.
|
||||
* English: +49 89 4366 5544, Monday-Friday, 9:00-17:00 GMT,
|
||||
http://ask.adaptec.com/.
|
||||
- You can order Adaptec cables online at
|
||||
http://www.adaptec.com/buy-cables/.
|
||||
|
||||
Japan
|
||||
- Visit our web site at http://www.adaptec.co.jp/.
|
||||
- To speak with a Technical Support Specialist, call
|
||||
+81-3-5308-6120
|
||||
Hours: Monday-Friday, 9:00 a.m. to 12:00 p.m., 1:00 p.m. to
|
||||
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
|
||||
+81 3 5308 6120, Monday-Friday, 9:00 a.m. to 12:00 p.m.,
|
||||
1:00 p.m. to 6:00 p.m.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
/*
|
||||
|
|
|
@ -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.
|
||||
* Intel i810/810E, i815, i820, i830, i84x, MX440
|
||||
ICH5, ICH6, ICH7, ESB2
|
||||
* SiS 7012 (SiS 735)
|
||||
* NVidia NForce, NForce2
|
||||
* NVidia NForce, NForce2, NForce3, MCP04, CK804
|
||||
CK8, CK8S, MCP501
|
||||
* AMD AMD768, AMD8111
|
||||
* 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.
|
||||
* 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)
|
||||
|
||||
|
|
|
@ -5206,14 +5206,14 @@ struct _snd_pcm_runtime {
|
|||
You need to pass the <function>snd_dma_pci_data(pci)</function>,
|
||||
where pci is the struct <structname>pci_dev</structname> pointer
|
||||
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->dma_private. You can cast
|
||||
the pointer like:
|
||||
|
||||
<informalexample>
|
||||
<programlisting>
|
||||
<![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>
|
||||
</informalexample>
|
||||
|
|
|
@ -28,6 +28,7 @@ Currently, these files are in /proc/sys/vm:
|
|||
- block_dump
|
||||
- drop-caches
|
||||
- zone_reclaim_mode
|
||||
- zone_reclaim_interval
|
||||
|
||||
==============================================================
|
||||
|
||||
|
@ -126,15 +127,54 @@ the high water marks for each per cpu page list.
|
|||
|
||||
zone_reclaim_mode:
|
||||
|
||||
This is set during bootup to 1 if it is determined that pages from
|
||||
remote zones will cause a significant performance reduction. The
|
||||
Zone_reclaim_mode allows to set more or less agressive approaches to
|
||||
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
|
||||
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
|
||||
off zone reclaim if the system is used for a file server and all
|
||||
of memory should be used for caching files from disk.
|
||||
It may be beneficial to switch off zone reclaim if the system is
|
||||
used for a file server and all of memory should be used for caching files
|
||||
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
|
||||
reclaim regardless of the numa distances in the system.
|
||||
Allowing zone reclaim to write out pages stops processes that are
|
||||
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.
|
||||
|
||||
|
|
|
@ -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'.
|
|
@ -17,16 +17,15 @@ Index
|
|||
7. Module parameters
|
||||
8. Optional device control through "sysfs"
|
||||
9. Supported devices
|
||||
10. How to add plug-in's for new image sensors
|
||||
11. Notes for V4L2 application developers
|
||||
12. Video frame formats
|
||||
13. Contact information
|
||||
14. Credits
|
||||
10. Notes for V4L2 application developers
|
||||
11. Video frame formats
|
||||
12. Contact information
|
||||
13. Credits
|
||||
|
||||
|
||||
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
|
||||
|
@ -54,9 +53,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|||
|
||||
4. Overview and features
|
||||
========================
|
||||
This driver attempts to support the video and audio streaming capabilities of
|
||||
the devices mounting the SONiX SN9C101, SN9C102 and SN9C103 PC Camera
|
||||
Controllers.
|
||||
This driver attempts to support the video interface of the devices mounting the
|
||||
SONiX SN9C101, SN9C102 and SN9C103 PC Camera Controllers.
|
||||
|
||||
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
|
||||
|
@ -78,6 +76,7 @@ Some of the features of the driver are:
|
|||
- available mmap or read/poll methods for video streaming through isochronous
|
||||
data transfers;
|
||||
- automatic detection of image sensor;
|
||||
- support for built-in microphone interface;
|
||||
- support for any window resolutions and optional panning within the maximum
|
||||
pixel area of image sensor;
|
||||
- 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);
|
||||
- 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
|
||||
your system supports hotplugging;
|
||||
the system supports hotplugging;
|
||||
- no known bugs.
|
||||
|
||||
|
||||
|
@ -112,6 +111,12 @@ corresponding modules must be compiled:
|
|||
#
|
||||
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
|
||||
|
@ -125,6 +130,21 @@ necessary:
|
|||
CONFIG_USB_UHCI_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:
|
||||
|
||||
# USB Multimedia devices
|
||||
|
@ -153,7 +173,7 @@ analyze kernel messages and verify that the loading process has gone well:
|
|||
Module parameters are listed below:
|
||||
-------------------------------------------------------------------------------
|
||||
Name: video_nr
|
||||
Type: int array (min = 0, max = 64)
|
||||
Type: short array (min = 0, max = 64)
|
||||
Syntax: <-1|n[,...]>
|
||||
Description: Specify V4L2 minor mode number:
|
||||
-1 = use next available
|
||||
|
@ -165,19 +185,19 @@ Description: Specify V4L2 minor mode number:
|
|||
other camera.
|
||||
Default: -1
|
||||
-------------------------------------------------------------------------------
|
||||
Name: force_munmap;
|
||||
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)"
|
||||
0 = do not force memory unmapping
|
||||
1 = force memory unmapping (save memory)
|
||||
Default: 0
|
||||
-------------------------------------------------------------------------------
|
||||
Name: debug
|
||||
Type: int
|
||||
Type: ushort
|
||||
Syntax: <n>
|
||||
Description: Debugging information level, from 0 to 3:
|
||||
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
|
||||
is used. It also shows some more informations about the
|
||||
hardware being detected. This parameter can be changed at
|
||||
runtime thanks to the /sys filesystem.
|
||||
runtime thanks to the /sys filesystem interface.
|
||||
Default: 2
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
|
||||
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.
|
||||
|
||||
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
|
||||
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
|
||||
application for implementing auto-exposure features via software.
|
||||
|
||||
|
@ -250,7 +271,8 @@ Byte # Value Description
|
|||
0x03 0xC4 Frame synchronisation pattern.
|
||||
0x04 0xC4 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
|
||||
frame counter, u is unknown, zz is a size indicator
|
||||
(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
|
||||
images that are not pure white, the value scales down
|
||||
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
|
||||
registers 0x1c, 0x1d, 0x1e and 0x1f of the SN9C10x controllers, where one unit
|
||||
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
|
||||
|
@ -298,6 +331,7 @@ Vendor ID Product ID
|
|||
0x0c45 0x602b
|
||||
0x0c45 0x602c
|
||||
0x0c45 0x602d
|
||||
0x0c45 0x602e
|
||||
0x0c45 0x6030
|
||||
0x0c45 0x6080
|
||||
0x0c45 0x6082
|
||||
|
@ -348,18 +382,7 @@ appreciated. Non-available hardware will not be supported by the author of this
|
|||
driver.
|
||||
|
||||
|
||||
10. How to add plug-in's for new image sensors
|
||||
==============================================
|
||||
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
|
||||
10. Notes for V4L2 application developers
|
||||
=========================================
|
||||
This driver follows the V4L2 API specifications. In particular, it enforces two
|
||||
rules:
|
||||
|
@ -394,7 +417,7 @@ initialized (as described in the documentation of the API for the image sensors
|
|||
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
|
||||
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.
|
||||
|
||||
|
||||
13. Contact information
|
||||
12. Contact information
|
||||
=======================
|
||||
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'.
|
||||
|
||||
|
||||
14. Credits
|
||||
13. Credits
|
||||
===========
|
||||
Many thanks to following persons for their contribute (listed in alphabetical
|
||||
order):
|
||||
|
@ -480,5 +503,5 @@ order):
|
|||
- Bertrik Sikken, who reverse-engineered and documented the Huffman compression
|
||||
algorithm used in the SN9C10x controllers and implemented the first decoder;
|
||||
- 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.
|
||||
|
|
|
@ -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 supported devices to work; the second one, "w9968cf-vpp", is an optional
|
||||
module, which provides some useful video post-processing functions like video
|
||||
decoding, up-scaling and colour conversions. Once the driver is installed,
|
||||
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.
|
||||
decoding, up-scaling and colour conversions.
|
||||
|
||||
Please keep in mind that official kernels do not include the second module for
|
||||
performance purposes. However it is always recommended to download and install
|
||||
the latest and complete release of the driver, replacing the existing one, if
|
||||
present: it will be still even possible not to load the "w9968cf-vpp" module at
|
||||
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.
|
||||
Note that the official kernels do neither include nor support the second
|
||||
module for performance purposes. Therefore, it is always recommended to
|
||||
download and install the latest and complete release of the driver,
|
||||
replacing the existing one, if present.
|
||||
|
||||
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
|
||||
|
@ -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
|
||||
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
|
||||
Type: int
|
||||
Syntax: <n>
|
||||
|
|
|
@ -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.
|
||||
|
|
@ -40,6 +40,18 @@ APICs
|
|||
no_timer_check Don't check the IO-APIC timer. This can work around
|
||||
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.
|
||||
|
||||
Early Console
|
||||
|
||||
syntax: earlyprintk=vga
|
||||
|
|
20
MAINTAINERS
20
MAINTAINERS
|
@ -558,7 +558,8 @@ S: Supported
|
|||
|
||||
CONFIGFS
|
||||
P: Joel Becker
|
||||
M: Joel Becker <joel.becker@oracle.com>
|
||||
M: joel.becker@oracle.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Supported
|
||||
|
||||
CIRRUS LOGIC GENERIC FBDEV DRIVER
|
||||
|
@ -1178,8 +1179,8 @@ T: git kernel.org:/pub/scm/linux/kernel/git/aegl/linux-2.6.git
|
|||
S: Maintained
|
||||
|
||||
SN-IA64 (Itanium) SUB-PLATFORM
|
||||
P: Greg Edwards
|
||||
M: edwardsg@sgi.com
|
||||
P: Jes Sorensen
|
||||
M: jes@sgi.com
|
||||
L: linux-altix@sgi.com
|
||||
L: linux-ia64@vger.kernel.org
|
||||
W: http://www.sgi.com/altix
|
||||
|
@ -1986,7 +1987,6 @@ M: philb@gnu.org
|
|||
P: Tim Waugh
|
||||
M: tim@cyberelk.net
|
||||
P: David Campbell
|
||||
M: campbell@torque.net
|
||||
P: Andrea Arcangeli
|
||||
M: andrea@suse.de
|
||||
L: linux-parport@lists.infradead.org
|
||||
|
@ -2300,7 +2300,7 @@ S: Supported
|
|||
|
||||
SELINUX SECURITY MODULE
|
||||
P: Stephen Smalley
|
||||
M: sds@epoch.ncsc.mil
|
||||
M: sds@tycho.nsa.gov
|
||||
P: James Morris
|
||||
M: jmorris@namei.org
|
||||
L: linux-kernel@vger.kernel.org (kernel issues)
|
||||
|
@ -2675,6 +2675,14 @@ M: dbrownell@users.sourceforge.net
|
|||
L: linux-usb-devel@lists.sourceforge.net
|
||||
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
|
||||
P: Vojtech Pavlik
|
||||
M: vojtech@suse.cz
|
||||
|
@ -2838,6 +2846,7 @@ USB SN9C10x 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
|
||||
|
||||
|
@ -2867,6 +2876,7 @@ USB W996[87]CF 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
|
||||
|
||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
|||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 16
|
||||
EXTRAVERSION =-rc1
|
||||
EXTRAVERSION =-rc2
|
||||
NAME=Sliding Snow Leopard
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
@ -28,6 +28,7 @@ void foo(void)
|
|||
DEFINE(TASK_GID, offsetof(struct task_struct, gid));
|
||||
DEFINE(TASK_EGID, offsetof(struct task_struct, egid));
|
||||
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));
|
||||
BLANK();
|
||||
|
||||
|
|
|
@ -879,17 +879,19 @@ sys_getxpid:
|
|||
|
||||
/* See linux/kernel/timer.c sys_getppid for discussion
|
||||
about this loop. */
|
||||
ldq $3, TASK_REAL_PARENT($2)
|
||||
1: ldl $1, TASK_TGID($3)
|
||||
ldq $3, TASK_GROUP_LEADER($2)
|
||||
ldq $4, TASK_REAL_PARENT($3)
|
||||
ldl $0, TASK_TGID($2)
|
||||
1: ldl $1, TASK_TGID($4)
|
||||
#ifdef CONFIG_SMP
|
||||
mov $3, $4
|
||||
mov $4, $5
|
||||
mb
|
||||
ldq $3, TASK_REAL_PARENT($2)
|
||||
cmpeq $3, $4, $4
|
||||
beq $4, 1b
|
||||
ldq $3, TASK_GROUP_LEADER($2)
|
||||
ldq $4, TASK_REAL_PARENT($3)
|
||||
cmpeq $4, $5, $5
|
||||
beq $5, 1b
|
||||
#endif
|
||||
stq $1, 80($sp)
|
||||
ldl $0, TASK_TGID($2)
|
||||
ret
|
||||
.end sys_getxpid
|
||||
|
||||
|
|
|
@ -68,34 +68,32 @@ show_interrupts(struct seq_file *p, void *v)
|
|||
#ifdef CONFIG_SMP
|
||||
int j;
|
||||
#endif
|
||||
int i = *(loff_t *) v;
|
||||
int irq = *(loff_t *) v;
|
||||
struct irqaction * action;
|
||||
unsigned long flags;
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
if (i == 0) {
|
||||
if (irq == 0) {
|
||||
seq_puts(p, " ");
|
||||
for (i = 0; i < NR_CPUS; i++)
|
||||
if (cpu_online(i))
|
||||
seq_printf(p, "CPU%d ", i);
|
||||
for_each_online_cpu(j)
|
||||
seq_printf(p, "CPU%d ", j);
|
||||
seq_putc(p, '\n');
|
||||
}
|
||||
#endif
|
||||
|
||||
if (i < ACTUAL_NR_IRQS) {
|
||||
spin_lock_irqsave(&irq_desc[i].lock, flags);
|
||||
action = irq_desc[i].action;
|
||||
if (irq < ACTUAL_NR_IRQS) {
|
||||
spin_lock_irqsave(&irq_desc[irq].lock, flags);
|
||||
action = irq_desc[irq].action;
|
||||
if (!action)
|
||||
goto unlock;
|
||||
seq_printf(p, "%3d: ",i);
|
||||
seq_printf(p, "%3d: ", irq);
|
||||
#ifndef CONFIG_SMP
|
||||
seq_printf(p, "%10u ", kstat_irqs(i));
|
||||
seq_printf(p, "%10u ", kstat_irqs(irq));
|
||||
#else
|
||||
for (j = 0; j < NR_CPUS; j++)
|
||||
if (cpu_online(j))
|
||||
seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]);
|
||||
for_each_online_cpu(j)
|
||||
seq_printf(p, "%10u ", kstat_cpu(j).irqs[irq]);
|
||||
#endif
|
||||
seq_printf(p, " %14s", irq_desc[i].handler->typename);
|
||||
seq_printf(p, " %14s", irq_desc[irq].handler->typename);
|
||||
seq_printf(p, " %c%s",
|
||||
(action->flags & SA_INTERRUPT)?'+':' ',
|
||||
action->name);
|
||||
|
@ -108,13 +106,12 @@ show_interrupts(struct seq_file *p, void *v)
|
|||
|
||||
seq_putc(p, '\n');
|
||||
unlock:
|
||||
spin_unlock_irqrestore(&irq_desc[i].lock, flags);
|
||||
} else if (i == ACTUAL_NR_IRQS) {
|
||||
spin_unlock_irqrestore(&irq_desc[irq].lock, flags);
|
||||
} else if (irq == ACTUAL_NR_IRQS) {
|
||||
#ifdef CONFIG_SMP
|
||||
seq_puts(p, "IPI: ");
|
||||
for (i = 0; i < NR_CPUS; i++)
|
||||
if (cpu_online(i))
|
||||
seq_printf(p, "%10lu ", cpu_data[i].ipi_count);
|
||||
for_each_online_cpu(j)
|
||||
seq_printf(p, "%10lu ", cpu_data[j].ipi_count);
|
||||
seq_putc(p, '\n');
|
||||
#endif
|
||||
seq_printf(p, "ERR: %10lu\n", irq_err_count);
|
||||
|
@ -122,7 +119,6 @@ unlock:
|
|||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* handle_irq handles all normal device IRQ's (the special
|
||||
* SMP cross-CPU interrupts have their own specific
|
||||
|
|
|
@ -85,7 +85,6 @@ CONFIG_DEFAULT_IOSCHED="anticipatory"
|
|||
# CONFIG_ARCH_CLPS711X is not set
|
||||
# CONFIG_ARCH_CO285 is not set
|
||||
# CONFIG_ARCH_EBSA110 is not set
|
||||
# CONFIG_ARCH_CAMELOT is not set
|
||||
# CONFIG_ARCH_FOOTBRIDGE is not set
|
||||
# CONFIG_ARCH_INTEGRATOR is not set
|
||||
# CONFIG_ARCH_IOP3XX is not set
|
||||
|
|
|
@ -85,7 +85,6 @@ CONFIG_DEFAULT_IOSCHED="anticipatory"
|
|||
# CONFIG_ARCH_CLPS711X is not set
|
||||
# CONFIG_ARCH_CO285 is not set
|
||||
# CONFIG_ARCH_EBSA110 is not set
|
||||
# CONFIG_ARCH_CAMELOT is not set
|
||||
# CONFIG_ARCH_FOOTBRIDGE is not set
|
||||
# CONFIG_ARCH_INTEGRATOR is not set
|
||||
# CONFIG_ARCH_IOP3XX is not set
|
||||
|
|
|
@ -85,7 +85,6 @@ CONFIG_DEFAULT_IOSCHED="anticipatory"
|
|||
# CONFIG_ARCH_CLPS711X is not set
|
||||
# CONFIG_ARCH_CO285 is not set
|
||||
# CONFIG_ARCH_EBSA110 is not set
|
||||
# CONFIG_ARCH_CAMELOT is not set
|
||||
# CONFIG_ARCH_FOOTBRIDGE is not set
|
||||
# CONFIG_ARCH_INTEGRATOR is not set
|
||||
# CONFIG_ARCH_IOP3XX is not set
|
||||
|
|
|
@ -85,7 +85,6 @@ CONFIG_DEFAULT_IOSCHED="anticipatory"
|
|||
# CONFIG_ARCH_CLPS711X is not set
|
||||
# CONFIG_ARCH_CO285 is not set
|
||||
# CONFIG_ARCH_EBSA110 is not set
|
||||
# CONFIG_ARCH_CAMELOT is not set
|
||||
# CONFIG_ARCH_FOOTBRIDGE is not set
|
||||
# CONFIG_ARCH_INTEGRATOR is not set
|
||||
# CONFIG_ARCH_IOP3XX is not set
|
||||
|
|
|
@ -44,7 +44,7 @@ unsigned int get_clk_frequency_khz( int info)
|
|||
|
||||
/* Read clkcfg register: it has turbo, b, half-turbo (and f) */
|
||||
asm( "mrc\tp14, 0, %0, c6, c0, 0" : "=r" (clkcfg) );
|
||||
t = clkcfg & (1 << 1);
|
||||
t = clkcfg & (1 << 0);
|
||||
ht = clkcfg & (1 << 2);
|
||||
b = clkcfg & (1 << 3);
|
||||
|
||||
|
|
|
@ -10,9 +10,13 @@ obj-m :=
|
|||
obj-n :=
|
||||
obj- :=
|
||||
|
||||
# S3C2400 support files
|
||||
obj-$(CONFIG_CPU_S3C2400) += s3c2400-gpio.o
|
||||
|
||||
# S3C2410 support files
|
||||
|
||||
obj-$(CONFIG_CPU_S3C2410) += s3c2410.o
|
||||
obj-$(CONFIG_CPU_S3C2410) += s3c2410-gpio.o
|
||||
obj-$(CONFIG_S3C2410_DMA) += dma.o
|
||||
|
||||
# Power Management support
|
||||
|
@ -25,6 +29,7 @@ obj-$(CONFIG_PM_SIMTEC) += pm-simtec.o
|
|||
obj-$(CONFIG_CPU_S3C2440) += s3c2440.o s3c2440-dsc.o
|
||||
obj-$(CONFIG_CPU_S3C2440) += s3c2440-irq.o
|
||||
obj-$(CONFIG_CPU_S3C2440) += s3c2440-clock.o
|
||||
obj-$(CONFIG_CPU_S3C2440) += s3c2410-gpio.o
|
||||
|
||||
# bast extras
|
||||
|
||||
|
|
|
@ -40,6 +40,7 @@
|
|||
|
||||
#include "cpu.h"
|
||||
#include "clock.h"
|
||||
#include "s3c2400.h"
|
||||
#include "s3c2410.h"
|
||||
#include "s3c2440.h"
|
||||
|
||||
|
@ -55,6 +56,7 @@ struct cpu_table {
|
|||
|
||||
/* table of supported CPUs */
|
||||
|
||||
static const char name_s3c2400[] = "S3C2400";
|
||||
static const char name_s3c2410[] = "S3C2410";
|
||||
static const char name_s3c2440[] = "S3C2440";
|
||||
static const char name_s3c2410a[] = "S3C2410A";
|
||||
|
@ -96,7 +98,16 @@ static struct cpu_table cpu_ids[] __initdata = {
|
|||
.init_uarts = s3c2440_init_uarts,
|
||||
.init = s3c2440_init,
|
||||
.name = name_s3c2440a
|
||||
}
|
||||
},
|
||||
{
|
||||
.idcode = 0x0, /* S3C2400 doesn't have an idcode */
|
||||
.idmask = 0xffffffff,
|
||||
.map_io = s3c2400_map_io,
|
||||
.init_clocks = s3c2400_init_clocks,
|
||||
.init_uarts = s3c2400_init_uarts,
|
||||
.init = s3c2400_init,
|
||||
.name = name_s3c2400
|
||||
},
|
||||
};
|
||||
|
||||
/* minimal IO mapping */
|
||||
|
@ -148,12 +159,15 @@ static struct cpu_table *cpu;
|
|||
|
||||
void __init s3c24xx_init_io(struct map_desc *mach_desc, int size)
|
||||
{
|
||||
unsigned long idcode;
|
||||
unsigned long idcode = 0x0;
|
||||
|
||||
/* initialise the io descriptors we need for initialisation */
|
||||
iotable_init(s3c_iodesc, ARRAY_SIZE(s3c_iodesc));
|
||||
|
||||
#ifndef CONFIG_CPU_S3C2400
|
||||
idcode = __raw_readl(S3C2410_GSTATUS1);
|
||||
#endif
|
||||
|
||||
cpu = s3c_lookup_cpu(idcode);
|
||||
|
||||
if (cpu == NULL) {
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
* 05-Nov-2004 BJD EXPORT_SYMBOL() added for all code
|
||||
* 13-Mar-2005 BJD Updates for __iomem
|
||||
* 26-Oct-2005 BJD Added generic configuration types
|
||||
* 15-Jan-2006 LCVR Added support for the S3C2400
|
||||
*/
|
||||
|
||||
|
||||
|
@ -48,7 +49,7 @@
|
|||
|
||||
void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function)
|
||||
{
|
||||
void __iomem *base = S3C2410_GPIO_BASE(pin);
|
||||
void __iomem *base = S3C24XX_GPIO_BASE(pin);
|
||||
unsigned long mask;
|
||||
unsigned long con;
|
||||
unsigned long flags;
|
||||
|
@ -95,7 +96,7 @@ EXPORT_SYMBOL(s3c2410_gpio_cfgpin);
|
|||
|
||||
unsigned int s3c2410_gpio_getcfg(unsigned int pin)
|
||||
{
|
||||
void __iomem *base = S3C2410_GPIO_BASE(pin);
|
||||
void __iomem *base = S3C24XX_GPIO_BASE(pin);
|
||||
unsigned long mask;
|
||||
|
||||
if (pin < S3C2410_GPIO_BANKB) {
|
||||
|
@ -111,7 +112,7 @@ EXPORT_SYMBOL(s3c2410_gpio_getcfg);
|
|||
|
||||
void s3c2410_gpio_pullup(unsigned int pin, unsigned int to)
|
||||
{
|
||||
void __iomem *base = S3C2410_GPIO_BASE(pin);
|
||||
void __iomem *base = S3C24XX_GPIO_BASE(pin);
|
||||
unsigned long offs = S3C2410_GPIO_OFFSET(pin);
|
||||
unsigned long flags;
|
||||
unsigned long up;
|
||||
|
@ -133,7 +134,7 @@ EXPORT_SYMBOL(s3c2410_gpio_pullup);
|
|||
|
||||
void s3c2410_gpio_setpin(unsigned int pin, unsigned int to)
|
||||
{
|
||||
void __iomem *base = S3C2410_GPIO_BASE(pin);
|
||||
void __iomem *base = S3C24XX_GPIO_BASE(pin);
|
||||
unsigned long offs = S3C2410_GPIO_OFFSET(pin);
|
||||
unsigned long flags;
|
||||
unsigned long dat;
|
||||
|
@ -152,7 +153,7 @@ EXPORT_SYMBOL(s3c2410_gpio_setpin);
|
|||
|
||||
unsigned int s3c2410_gpio_getpin(unsigned int pin)
|
||||
{
|
||||
void __iomem *base = S3C2410_GPIO_BASE(pin);
|
||||
void __iomem *base = S3C24XX_GPIO_BASE(pin);
|
||||
unsigned long offs = S3C2410_GPIO_OFFSET(pin);
|
||||
|
||||
return __raw_readl(base + 0x04) & (1<< offs);
|
||||
|
@ -166,70 +167,13 @@ unsigned int s3c2410_modify_misccr(unsigned int clear, unsigned int change)
|
|||
unsigned long misccr;
|
||||
|
||||
local_irq_save(flags);
|
||||
misccr = __raw_readl(S3C2410_MISCCR);
|
||||
misccr = __raw_readl(S3C24XX_MISCCR);
|
||||
misccr &= ~clear;
|
||||
misccr ^= change;
|
||||
__raw_writel(misccr, S3C2410_MISCCR);
|
||||
__raw_writel(misccr, S3C24XX_MISCCR);
|
||||
local_irq_restore(flags);
|
||||
|
||||
return misccr;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(s3c2410_modify_misccr);
|
||||
|
||||
int s3c2410_gpio_getirq(unsigned int pin)
|
||||
{
|
||||
if (pin < S3C2410_GPF0 || pin > S3C2410_GPG15_EINT23)
|
||||
return -1; /* not valid interrupts */
|
||||
|
||||
if (pin < S3C2410_GPG0 && pin > S3C2410_GPF7)
|
||||
return -1; /* not valid pin */
|
||||
|
||||
if (pin < S3C2410_GPF4)
|
||||
return (pin - S3C2410_GPF0) + IRQ_EINT0;
|
||||
|
||||
if (pin < S3C2410_GPG0)
|
||||
return (pin - S3C2410_GPF4) + IRQ_EINT4;
|
||||
|
||||
return (pin - S3C2410_GPG0) + IRQ_EINT8;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(s3c2410_gpio_getirq);
|
||||
|
||||
int s3c2410_gpio_irqfilter(unsigned int pin, unsigned int on,
|
||||
unsigned int config)
|
||||
{
|
||||
void __iomem *reg = S3C2410_EINFLT0;
|
||||
unsigned long flags;
|
||||
unsigned long val;
|
||||
|
||||
if (pin < S3C2410_GPG8 || pin > S3C2410_GPG15)
|
||||
return -1;
|
||||
|
||||
config &= 0xff;
|
||||
|
||||
pin -= S3C2410_GPG8_EINT16;
|
||||
reg += pin & ~3;
|
||||
|
||||
local_irq_save(flags);
|
||||
|
||||
/* update filter width and clock source */
|
||||
|
||||
val = __raw_readl(reg);
|
||||
val &= ~(0xff << ((pin & 3) * 8));
|
||||
val |= config << ((pin & 3) * 8);
|
||||
__raw_writel(val, reg);
|
||||
|
||||
/* update filter enable */
|
||||
|
||||
val = __raw_readl(S3C2410_EXTINT2);
|
||||
val &= ~(1 << ((pin * 4) + 3));
|
||||
val |= on << ((pin * 4) + 3);
|
||||
__raw_writel(val, S3C2410_EXTINT2);
|
||||
|
||||
local_irq_restore(flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(s3c2410_gpio_irqfilter);
|
||||
|
|
|
@ -0,0 +1,45 @@
|
|||
/* linux/arch/arm/mach-s3c2410/gpio.c
|
||||
*
|
||||
* Copyright (c) 2006 Lucas Correia Villa Real <lucasvr@gobolinux.org>
|
||||
*
|
||||
* S3C2400 GPIO support
|
||||
*
|
||||
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Changelog
|
||||
* 15-Jan-2006 LCVR Splitted from gpio.c, adding support for the S3C2400
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/ioport.h>
|
||||
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
#include <asm/arch/regs-gpio.h>
|
||||
|
||||
int s3c2400_gpio_getirq(unsigned int pin)
|
||||
{
|
||||
if (pin < S3C2410_GPE0 || pin > S3C2400_GPE7_EINT7)
|
||||
return -1; /* not valid interrupts */
|
||||
|
||||
return (pin - S3C2410_GPE0) + IRQ_EINT0;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(s3c2400_gpio_getirq);
|
|
@ -0,0 +1,93 @@
|
|||
/* linux/arch/arm/mach-s3c2410/gpio.c
|
||||
*
|
||||
* Copyright (c) 2004-2006 Simtec Electronics
|
||||
* Ben Dooks <ben@simtec.co.uk>
|
||||
*
|
||||
* S3C2410 GPIO support
|
||||
*
|
||||
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Changelog
|
||||
* 15-Jan-2006 LCVR Splitted from gpio.c
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/ioport.h>
|
||||
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
#include <asm/arch/regs-gpio.h>
|
||||
|
||||
int s3c2410_gpio_irqfilter(unsigned int pin, unsigned int on,
|
||||
unsigned int config)
|
||||
{
|
||||
void __iomem *reg = S3C2410_EINFLT0;
|
||||
unsigned long flags;
|
||||
unsigned long val;
|
||||
|
||||
if (pin < S3C2410_GPG8 || pin > S3C2410_GPG15)
|
||||
return -1;
|
||||
|
||||
config &= 0xff;
|
||||
|
||||
pin -= S3C2410_GPG8_EINT16;
|
||||
reg += pin & ~3;
|
||||
|
||||
local_irq_save(flags);
|
||||
|
||||
/* update filter width and clock source */
|
||||
|
||||
val = __raw_readl(reg);
|
||||
val &= ~(0xff << ((pin & 3) * 8));
|
||||
val |= config << ((pin & 3) * 8);
|
||||
__raw_writel(val, reg);
|
||||
|
||||
/* update filter enable */
|
||||
|
||||
val = __raw_readl(S3C2410_EXTINT2);
|
||||
val &= ~(1 << ((pin * 4) + 3));
|
||||
val |= on << ((pin * 4) + 3);
|
||||
__raw_writel(val, S3C2410_EXTINT2);
|
||||
|
||||
local_irq_restore(flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(s3c2410_gpio_irqfilter);
|
||||
|
||||
int s3c2410_gpio_getirq(unsigned int pin)
|
||||
{
|
||||
if (pin < S3C2410_GPF0 || pin > S3C2410_GPG15_EINT23)
|
||||
return -1; /* not valid interrupts */
|
||||
|
||||
if (pin < S3C2410_GPG0 && pin > S3C2410_GPF7)
|
||||
return -1; /* not valid pin */
|
||||
|
||||
if (pin < S3C2410_GPF4)
|
||||
return (pin - S3C2410_GPF0) + IRQ_EINT0;
|
||||
|
||||
if (pin < S3C2410_GPG0)
|
||||
return (pin - S3C2410_GPF4) + IRQ_EINT4;
|
||||
|
||||
return (pin - S3C2410_GPG0) + IRQ_EINT8;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(s3c2410_gpio_getirq);
|
|
@ -72,7 +72,7 @@ ENTRY(s3c2410_cpu_suspend)
|
|||
@@ prepare cpu to sleep
|
||||
|
||||
ldr r4, =S3C2410_REFRESH
|
||||
ldr r5, =S3C2410_MISCCR
|
||||
ldr r5, =S3C24XX_MISCCR
|
||||
ldr r6, =S3C2410_CLKCON
|
||||
ldr r7, [ r4 ] @ get REFRESH (and ensure in TLB)
|
||||
ldr r8, [ r5 ] @ get MISCCR (and ensure in TLB)
|
||||
|
|
|
@ -92,22 +92,16 @@ ENTRY(v6_coherent_kern_range)
|
|||
* - the Icache does not read data from the write buffer
|
||||
*/
|
||||
ENTRY(v6_coherent_user_range)
|
||||
bic r0, r0, #CACHE_LINE_SIZE - 1
|
||||
1:
|
||||
|
||||
#ifdef HARVARD_CACHE
|
||||
mcr p15, 0, r0, c7, c10, 1 @ clean D line
|
||||
bic r0, r0, #CACHE_LINE_SIZE - 1
|
||||
1: mcr p15, 0, r0, c7, c10, 1 @ clean D line
|
||||
mcr p15, 0, r0, c7, c5, 1 @ invalidate I line
|
||||
#endif
|
||||
mcr p15, 0, r0, c7, c5, 7 @ invalidate BTB entry
|
||||
add r0, r0, #BTB_FLUSH_SIZE
|
||||
mcr p15, 0, r0, c7, c5, 7 @ invalidate BTB entry
|
||||
add r0, r0, #BTB_FLUSH_SIZE
|
||||
mcr p15, 0, r0, c7, c5, 7 @ invalidate BTB entry
|
||||
add r0, r0, #BTB_FLUSH_SIZE
|
||||
mcr p15, 0, r0, c7, c5, 7 @ invalidate BTB entry
|
||||
add r0, r0, #BTB_FLUSH_SIZE
|
||||
add r0, r0, #CACHE_LINE_SIZE
|
||||
cmp r0, r1
|
||||
blo 1b
|
||||
#endif
|
||||
mcr p15, 0, r0, c7, c5, 6 @ invalidate BTB
|
||||
#ifdef HARVARD_CACHE
|
||||
mov r0, #0
|
||||
mcr p15, 0, r0, c7, c10, 4 @ drain write buffer
|
||||
|
|
|
@ -241,7 +241,15 @@ ENTRY(xscale_flush_user_cache_range)
|
|||
* it also trashes the mini I-cache used by JTAG debuggers.
|
||||
*/
|
||||
ENTRY(xscale_coherent_kern_range)
|
||||
/* FALLTHROUGH */
|
||||
bic r0, r0, #CACHELINESIZE - 1
|
||||
1: mcr p15, 0, r0, c7, c10, 1 @ clean D entry
|
||||
add r0, r0, #CACHELINESIZE
|
||||
cmp r0, r1
|
||||
blo 1b
|
||||
mov r0, #0
|
||||
mcr p15, 0, r0, c7, c5, 0 @ Invalidate I cache & BTB
|
||||
mcr p15, 0, r0, c7, c10, 4 @ Drain Write (& Fill) Buffer
|
||||
mov pc, lr
|
||||
|
||||
/*
|
||||
* coherent_user_range(start, end)
|
||||
|
@ -252,18 +260,16 @@ ENTRY(xscale_coherent_kern_range)
|
|||
*
|
||||
* - start - virtual start address
|
||||
* - end - virtual end address
|
||||
*
|
||||
* Note: single I-cache line invalidation isn't used here since
|
||||
* it also trashes the mini I-cache used by JTAG debuggers.
|
||||
*/
|
||||
ENTRY(xscale_coherent_user_range)
|
||||
bic r0, r0, #CACHELINESIZE - 1
|
||||
1: mcr p15, 0, r0, c7, c10, 1 @ clean D entry
|
||||
mcr p15, 0, r0, c7, c5, 1 @ Invalidate I cache entry
|
||||
add r0, r0, #CACHELINESIZE
|
||||
cmp r0, r1
|
||||
blo 1b
|
||||
mov r0, #0
|
||||
mcr p15, 0, r0, c7, c5, 0 @ Invalidate I cache & BTB
|
||||
mcr p15, 0, r0, c7, c5, 6 @ Invalidate BTB
|
||||
mcr p15, 0, r0, c7, c10, 4 @ Drain Write (& Fill) Buffer
|
||||
mov pc, lr
|
||||
|
||||
|
|
|
@ -137,8 +137,9 @@ int __init oprofile_arch_init(struct oprofile_operations *ops)
|
|||
if (spec) {
|
||||
init_MUTEX(&op_arm_sem);
|
||||
|
||||
if (spec->init() < 0)
|
||||
return -ENODEV;
|
||||
ret = spec->init();
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
op_arm_model = spec;
|
||||
init_driverfs();
|
||||
|
|
|
@ -53,14 +53,14 @@ config GENERIC_ISA_DMA
|
|||
|
||||
config ARCH_MAY_HAVE_PC_FDC
|
||||
bool
|
||||
default y
|
||||
|
||||
source "init/Kconfig"
|
||||
|
||||
|
||||
menu "System Type"
|
||||
|
||||
comment "Archimedes/A5000 Implementations (select only ONE)"
|
||||
choice
|
||||
prompt "Archimedes/A5000 Implementations"
|
||||
|
||||
config ARCH_ARC
|
||||
bool "Archimedes"
|
||||
|
@ -73,6 +73,7 @@ config ARCH_ARC
|
|||
|
||||
config ARCH_A5K
|
||||
bool "A5000"
|
||||
select ARCH_MAY_HAVE_PC_FDC
|
||||
help
|
||||
Say Y here to to support the Acorn A5000.
|
||||
|
||||
|
@ -87,6 +88,7 @@ config PAGESIZE_16
|
|||
Say Y here if your Archimedes or A5000 system has only 2MB of
|
||||
memory, otherwise say N. The resulting kernel will not run on a
|
||||
machine with 4MB of memory.
|
||||
endchoice
|
||||
endmenu
|
||||
|
||||
config ISA_DMA_API
|
||||
|
|
|
@ -104,14 +104,14 @@ void set_fiq_regs(struct pt_regs *regs)
|
|||
{
|
||||
register unsigned long tmp, tmp2;
|
||||
__asm__ volatile (
|
||||
"mov %0, pc
|
||||
bic %1, %0, #0x3
|
||||
orr %1, %1, %3
|
||||
teqp %1, #0 @ select FIQ mode
|
||||
mov r0, r0
|
||||
ldmia %2, {r8 - r14}
|
||||
teqp %0, #0 @ return to SVC mode
|
||||
mov r0, r0"
|
||||
"mov %0, pc \n"
|
||||
"bic %1, %0, #0x3 \n"
|
||||
"orr %1, %1, %3 \n"
|
||||
"teqp %1, #0 @ select FIQ mode \n"
|
||||
"mov r0, r0 \n"
|
||||
"ldmia %2, {r8 - r14} \n"
|
||||
"teqp %0, #0 @ return to SVC mode \n"
|
||||
"mov r0, r0 "
|
||||
: "=&r" (tmp), "=&r" (tmp2)
|
||||
: "r" (®s->ARM_r8), "I" (PSR_I_BIT | PSR_F_BIT | MODE_FIQ26)
|
||||
/* These registers aren't modified by the above code in a way
|
||||
|
@ -125,14 +125,14 @@ void get_fiq_regs(struct pt_regs *regs)
|
|||
{
|
||||
register unsigned long tmp, tmp2;
|
||||
__asm__ volatile (
|
||||
"mov %0, pc
|
||||
bic %1, %0, #0x3
|
||||
orr %1, %1, %3
|
||||
teqp %1, #0 @ select FIQ mode
|
||||
mov r0, r0
|
||||
stmia %2, {r8 - r14}
|
||||
teqp %0, #0 @ return to SVC mode
|
||||
mov r0, r0"
|
||||
"mov %0, pc \n"
|
||||
"bic %1, %0, #0x3 \n"
|
||||
"orr %1, %1, %3 \n"
|
||||
"teqp %1, #0 @ select FIQ mode \n"
|
||||
"mov r0, r0 \n"
|
||||
"stmia %2, {r8 - r14} \n"
|
||||
"teqp %0, #0 @ return to SVC mode \n"
|
||||
"mov r0, r0 "
|
||||
: "=&r" (tmp), "=&r" (tmp2)
|
||||
: "r" (®s->ARM_r8), "I" (PSR_I_BIT | PSR_F_BIT | MODE_FIQ26)
|
||||
/* These registers aren't modified by the above code in a way
|
||||
|
|
|
@ -480,6 +480,7 @@ static int do_signal(sigset_t *oldset, struct pt_regs *regs, int syscall)
|
|||
{
|
||||
siginfo_t info;
|
||||
int signr;
|
||||
struct k_sigaction ka;
|
||||
|
||||
/*
|
||||
* We want the common case to go fast, which
|
||||
|
@ -493,7 +494,7 @@ static int do_signal(sigset_t *oldset, struct pt_regs *regs, int syscall)
|
|||
if (current->ptrace & PT_SINGLESTEP)
|
||||
ptrace_cancel_bpt(current);
|
||||
|
||||
signr = get_signal_to_deliver(&info, regs, NULL);
|
||||
signr = get_signal_to_deliver(&info, &ka, regs, NULL);
|
||||
if (signr > 0) {
|
||||
handle_signal(signr, &info, oldset, regs, syscall);
|
||||
if (current->ptrace & PT_SINGLESTEP)
|
||||
|
|
|
@ -47,15 +47,6 @@ config DMI
|
|||
|
||||
source "init/Kconfig"
|
||||
|
||||
config DOUBLEFAULT
|
||||
default y
|
||||
bool "Enable doublefault exception handler" if EMBEDDED
|
||||
help
|
||||
This option allows trapping of rare doublefault exceptions that
|
||||
would otherwise cause a system to silently reboot. Disabling this
|
||||
option saves about 4k and might cause you much additional grey
|
||||
hair.
|
||||
|
||||
menu "Processor type and features"
|
||||
|
||||
choice
|
||||
|
@ -451,12 +442,50 @@ config HIGHMEM4G
|
|||
|
||||
config HIGHMEM64G
|
||||
bool "64GB"
|
||||
depends on X86_CMPXCHG64
|
||||
help
|
||||
Select this if you have a 32-bit processor and more than 4
|
||||
gigabytes of physical RAM.
|
||||
|
||||
endchoice
|
||||
|
||||
choice
|
||||
depends on EXPERIMENTAL && !X86_PAE
|
||||
prompt "Memory split"
|
||||
default VMSPLIT_3G
|
||||
help
|
||||
Select the desired split between kernel and user memory.
|
||||
|
||||
If the address range available to the kernel is less than the
|
||||
physical memory installed, the remaining memory will be available
|
||||
as "high memory". Accessing high memory is a little more costly
|
||||
than low memory, as it needs to be mapped into the kernel first.
|
||||
Note that increasing the kernel address space limits the range
|
||||
available to user programs, making the address space there
|
||||
tighter. Selecting anything other than the default 3G/1G split
|
||||
will also likely make your kernel incompatible with binary-only
|
||||
kernel modules.
|
||||
|
||||
If you are not absolutely sure what you are doing, leave this
|
||||
option alone!
|
||||
|
||||
config VMSPLIT_3G
|
||||
bool "3G/1G user/kernel split"
|
||||
config VMSPLIT_3G_OPT
|
||||
bool "3G/1G user/kernel split (for full 1G low memory)"
|
||||
config VMSPLIT_2G
|
||||
bool "2G/2G user/kernel split"
|
||||
config VMSPLIT_1G
|
||||
bool "1G/3G user/kernel split"
|
||||
endchoice
|
||||
|
||||
config PAGE_OFFSET
|
||||
hex
|
||||
default 0xB0000000 if VMSPLIT_3G_OPT
|
||||
default 0x78000000 if VMSPLIT_2G
|
||||
default 0x40000000 if VMSPLIT_1G
|
||||
default 0xC0000000
|
||||
|
||||
config HIGHMEM
|
||||
bool
|
||||
depends on HIGHMEM64G || HIGHMEM4G
|
||||
|
@ -711,6 +740,15 @@ config HOTPLUG_CPU
|
|||
|
||||
Say N.
|
||||
|
||||
config DOUBLEFAULT
|
||||
default y
|
||||
bool "Enable doublefault exception handler" if EMBEDDED
|
||||
help
|
||||
This option allows trapping of rare doublefault exceptions that
|
||||
would otherwise cause a system to silently reboot. Disabling this
|
||||
option saves about 4k and might cause you much additional grey
|
||||
hair.
|
||||
|
||||
endmenu
|
||||
|
||||
|
||||
|
|
|
@ -3,6 +3,6 @@ obj-$(CONFIG_X86_IO_APIC) += earlyquirk.o
|
|||
obj-$(CONFIG_ACPI_SLEEP) += sleep.o wakeup.o
|
||||
|
||||
ifneq ($(CONFIG_ACPI_PROCESSOR),)
|
||||
obj-y += cstate.o
|
||||
obj-y += cstate.o processor.o
|
||||
endif
|
||||
|
||||
|
|
|
@ -248,10 +248,17 @@ acpi_parse_lapic(acpi_table_entry_header * header, const unsigned long end)
|
|||
|
||||
acpi_table_print_madt_entry(header);
|
||||
|
||||
/* Register even disabled CPUs for cpu hotplug */
|
||||
|
||||
x86_acpiid_to_apicid[processor->acpi_id] = processor->id;
|
||||
/* Record local apic id only when enabled */
|
||||
if (processor->flags.enabled)
|
||||
x86_acpiid_to_apicid[processor->acpi_id] = processor->id;
|
||||
|
||||
/*
|
||||
* We need to register disabled CPU as well to permit
|
||||
* counting disabled CPUs. This allows us to size
|
||||
* cpus_possible_map more accurately, to permit
|
||||
* to not preallocating memory for all NR_CPUS
|
||||
* when we use CPU hotplug.
|
||||
*/
|
||||
mp_register_lapic(processor->id, /* APIC ID */
|
||||
processor->flags.enabled); /* Enabled? */
|
||||
|
||||
|
@ -464,7 +471,7 @@ int acpi_gsi_to_irq(u32 gsi, unsigned int *irq)
|
|||
* success: return IRQ number (>=0)
|
||||
* failure: return < 0
|
||||
*/
|
||||
int acpi_register_gsi(u32 gsi, int edge_level, int active_high_low)
|
||||
int acpi_register_gsi(u32 gsi, int triggering, int polarity)
|
||||
{
|
||||
unsigned int irq;
|
||||
unsigned int plat_gsi = gsi;
|
||||
|
@ -476,14 +483,14 @@ int acpi_register_gsi(u32 gsi, int edge_level, int active_high_low)
|
|||
if (acpi_irq_model == ACPI_IRQ_MODEL_PIC) {
|
||||
extern void eisa_set_level_irq(unsigned int irq);
|
||||
|
||||
if (edge_level == ACPI_LEVEL_SENSITIVE)
|
||||
if (triggering == ACPI_LEVEL_SENSITIVE)
|
||||
eisa_set_level_irq(gsi);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_X86_IO_APIC
|
||||
if (acpi_irq_model == ACPI_IRQ_MODEL_IOAPIC) {
|
||||
plat_gsi = mp_register_gsi(gsi, edge_level, active_high_low);
|
||||
plat_gsi = mp_register_gsi(gsi, triggering, polarity);
|
||||
}
|
||||
#endif
|
||||
acpi_gsi_to_irq(plat_gsi, &irq);
|
||||
|
|
|
@ -14,64 +14,6 @@
|
|||
#include <acpi/processor.h>
|
||||
#include <asm/acpi.h>
|
||||
|
||||
static void acpi_processor_power_init_intel_pdc(struct acpi_processor_power
|
||||
*pow)
|
||||
{
|
||||
struct acpi_object_list *obj_list;
|
||||
union acpi_object *obj;
|
||||
u32 *buf;
|
||||
|
||||
/* allocate and initialize pdc. It will be used later. */
|
||||
obj_list = kmalloc(sizeof(struct acpi_object_list), GFP_KERNEL);
|
||||
if (!obj_list) {
|
||||
printk(KERN_ERR "Memory allocation error\n");
|
||||
return;
|
||||
}
|
||||
|
||||
obj = kmalloc(sizeof(union acpi_object), GFP_KERNEL);
|
||||
if (!obj) {
|
||||
printk(KERN_ERR "Memory allocation error\n");
|
||||
kfree(obj_list);
|
||||
return;
|
||||
}
|
||||
|
||||
buf = kmalloc(12, GFP_KERNEL);
|
||||
if (!buf) {
|
||||
printk(KERN_ERR "Memory allocation error\n");
|
||||
kfree(obj);
|
||||
kfree(obj_list);
|
||||
return;
|
||||
}
|
||||
|
||||
buf[0] = ACPI_PDC_REVISION_ID;
|
||||
buf[1] = 1;
|
||||
buf[2] = ACPI_PDC_C_CAPABILITY_SMP;
|
||||
|
||||
obj->type = ACPI_TYPE_BUFFER;
|
||||
obj->buffer.length = 12;
|
||||
obj->buffer.pointer = (u8 *) buf;
|
||||
obj_list->count = 1;
|
||||
obj_list->pointer = obj;
|
||||
pow->pdc = obj_list;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/* Initialize _PDC data based on the CPU vendor */
|
||||
void acpi_processor_power_init_pdc(struct acpi_processor_power *pow,
|
||||
unsigned int cpu)
|
||||
{
|
||||
struct cpuinfo_x86 *c = cpu_data + cpu;
|
||||
|
||||
pow->pdc = NULL;
|
||||
if (c->x86_vendor == X86_VENDOR_INTEL)
|
||||
acpi_processor_power_init_intel_pdc(pow);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(acpi_processor_power_init_pdc);
|
||||
|
||||
/*
|
||||
* Initialize bm_flags based on the CPU cache properties
|
||||
* On SMP it depends on cache configuration
|
||||
|
|
|
@ -0,0 +1,75 @@
|
|||
/*
|
||||
* arch/i386/kernel/acpi/processor.c
|
||||
*
|
||||
* Copyright (C) 2005 Intel Corporation
|
||||
* Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
|
||||
* - Added _PDC for platforms with Intel CPUs
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/acpi.h>
|
||||
|
||||
#include <acpi/processor.h>
|
||||
#include <asm/acpi.h>
|
||||
|
||||
static void init_intel_pdc(struct acpi_processor *pr, struct cpuinfo_x86 *c)
|
||||
{
|
||||
struct acpi_object_list *obj_list;
|
||||
union acpi_object *obj;
|
||||
u32 *buf;
|
||||
|
||||
/* allocate and initialize pdc. It will be used later. */
|
||||
obj_list = kmalloc(sizeof(struct acpi_object_list), GFP_KERNEL);
|
||||
if (!obj_list) {
|
||||
printk(KERN_ERR "Memory allocation error\n");
|
||||
return;
|
||||
}
|
||||
|
||||
obj = kmalloc(sizeof(union acpi_object), GFP_KERNEL);
|
||||
if (!obj) {
|
||||
printk(KERN_ERR "Memory allocation error\n");
|
||||
kfree(obj_list);
|
||||
return;
|
||||
}
|
||||
|
||||
buf = kmalloc(12, GFP_KERNEL);
|
||||
if (!buf) {
|
||||
printk(KERN_ERR "Memory allocation error\n");
|
||||
kfree(obj);
|
||||
kfree(obj_list);
|
||||
return;
|
||||
}
|
||||
|
||||
buf[0] = ACPI_PDC_REVISION_ID;
|
||||
buf[1] = 1;
|
||||
buf[2] = ACPI_PDC_C_CAPABILITY_SMP;
|
||||
|
||||
if (cpu_has(c, X86_FEATURE_EST))
|
||||
buf[2] |= ACPI_PDC_EST_CAPABILITY_SMP;
|
||||
|
||||
obj->type = ACPI_TYPE_BUFFER;
|
||||
obj->buffer.length = 12;
|
||||
obj->buffer.pointer = (u8 *) buf;
|
||||
obj_list->count = 1;
|
||||
obj_list->pointer = obj;
|
||||
pr->pdc = obj_list;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/* Initialize _PDC data based on the CPU vendor */
|
||||
void arch_acpi_processor_init_pdc(struct acpi_processor *pr)
|
||||
{
|
||||
unsigned int cpu = pr->id;
|
||||
struct cpuinfo_x86 *c = cpu_data + cpu;
|
||||
|
||||
pr->pdc = NULL;
|
||||
if (c->x86_vendor == X86_VENDOR_INTEL)
|
||||
init_intel_pdc(pr, c);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(arch_acpi_processor_init_pdc);
|
|
@ -75,8 +75,10 @@ void ack_bad_irq(unsigned int irq)
|
|||
* holds up an irq slot - in excessive cases (when multiple
|
||||
* unexpected vectors occur) that might lock up the APIC
|
||||
* completely.
|
||||
* But only ack when the APIC is enabled -AK
|
||||
*/
|
||||
ack_APIC_irq();
|
||||
if (!cpu_has_apic)
|
||||
ack_APIC_irq();
|
||||
}
|
||||
|
||||
void __init apic_intr_init(void)
|
||||
|
@ -1303,6 +1305,7 @@ int __init APIC_init_uniprocessor (void)
|
|||
if (!cpu_has_apic && APIC_INTEGRATED(apic_version[boot_cpu_physical_apicid])) {
|
||||
printk(KERN_ERR "BIOS bug, local APIC #%d not detected!...\n",
|
||||
boot_cpu_physical_apicid);
|
||||
clear_bit(X86_FEATURE_APIC, boot_cpu_data.x86_capability);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
|
|
@ -282,3 +282,11 @@ int __init amd_init_cpu(void)
|
|||
}
|
||||
|
||||
//early_arch_initcall(amd_init_cpu);
|
||||
|
||||
static int __init amd_exit_cpu(void)
|
||||
{
|
||||
cpu_devs[X86_VENDOR_AMD] = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
late_initcall(amd_exit_cpu);
|
||||
|
|
|
@ -405,10 +405,6 @@ static void __init init_centaur(struct cpuinfo_x86 *c)
|
|||
winchip2_protect_mcr();
|
||||
#endif
|
||||
break;
|
||||
case 10:
|
||||
name="4";
|
||||
/* no info on the WC4 yet */
|
||||
break;
|
||||
default:
|
||||
name="??";
|
||||
}
|
||||
|
@ -474,3 +470,11 @@ int __init centaur_init_cpu(void)
|
|||
}
|
||||
|
||||
//early_arch_initcall(centaur_init_cpu);
|
||||
|
||||
static int __init centaur_exit_cpu(void)
|
||||
{
|
||||
cpu_devs[X86_VENDOR_CENTAUR] = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
late_initcall(centaur_exit_cpu);
|
||||
|
|
|
@ -44,6 +44,7 @@ static void default_init(struct cpuinfo_x86 * c)
|
|||
|
||||
static struct cpu_dev default_cpu = {
|
||||
.c_init = default_init,
|
||||
.c_vendor = "Unknown",
|
||||
};
|
||||
static struct cpu_dev * this_cpu = &default_cpu;
|
||||
|
||||
|
@ -150,6 +151,7 @@ static void __devinit get_cpu_vendor(struct cpuinfo_x86 *c, int early)
|
|||
{
|
||||
char *v = c->x86_vendor_id;
|
||||
int i;
|
||||
static int printed;
|
||||
|
||||
for (i = 0; i < X86_VENDOR_NUM; i++) {
|
||||
if (cpu_devs[i]) {
|
||||
|
@ -159,10 +161,17 @@ static void __devinit get_cpu_vendor(struct cpuinfo_x86 *c, int early)
|
|||
c->x86_vendor = i;
|
||||
if (!early)
|
||||
this_cpu = cpu_devs[i];
|
||||
break;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!printed) {
|
||||
printed++;
|
||||
printk(KERN_ERR "CPU: Vendor unknown, using generic init.\n");
|
||||
printk(KERN_ERR "CPU: Your system may be unstable.\n");
|
||||
}
|
||||
c->x86_vendor = X86_VENDOR_UNKNOWN;
|
||||
this_cpu = &default_cpu;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -96,6 +96,7 @@ config X86_POWERNOW_K8_ACPI
|
|||
|
||||
config X86_GX_SUSPMOD
|
||||
tristate "Cyrix MediaGX/NatSemi Geode Suspend Modulation"
|
||||
depends on PCI
|
||||
help
|
||||
This add the CPUFreq driver for NatSemi Geode processors which
|
||||
support suspend modulation.
|
||||
|
|
|
@ -295,68 +295,6 @@ acpi_cpufreq_guess_freq (
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
* acpi_processor_cpu_init_pdc_est - let BIOS know about the SMP capabilities
|
||||
* of this driver
|
||||
* @perf: processor-specific acpi_io_data struct
|
||||
* @cpu: CPU being initialized
|
||||
*
|
||||
* To avoid issues with legacy OSes, some BIOSes require to be informed of
|
||||
* the SMP capabilities of OS P-state driver. Here we set the bits in _PDC
|
||||
* accordingly, for Enhanced Speedstep. Actual call to _PDC is done in
|
||||
* driver/acpi/processor.c
|
||||
*/
|
||||
static void
|
||||
acpi_processor_cpu_init_pdc_est(
|
||||
struct acpi_processor_performance *perf,
|
||||
unsigned int cpu,
|
||||
struct acpi_object_list *obj_list
|
||||
)
|
||||
{
|
||||
union acpi_object *obj;
|
||||
u32 *buf;
|
||||
struct cpuinfo_x86 *c = cpu_data + cpu;
|
||||
dprintk("acpi_processor_cpu_init_pdc_est\n");
|
||||
|
||||
if (!cpu_has(c, X86_FEATURE_EST))
|
||||
return;
|
||||
|
||||
/* Initialize pdc. It will be used later. */
|
||||
if (!obj_list)
|
||||
return;
|
||||
|
||||
if (!(obj_list->count && obj_list->pointer))
|
||||
return;
|
||||
|
||||
obj = obj_list->pointer;
|
||||
if ((obj->buffer.length == 12) && obj->buffer.pointer) {
|
||||
buf = (u32 *)obj->buffer.pointer;
|
||||
buf[0] = ACPI_PDC_REVISION_ID;
|
||||
buf[1] = 1;
|
||||
buf[2] = ACPI_PDC_EST_CAPABILITY_SMP;
|
||||
perf->pdc = obj_list;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/* CPU specific PDC initialization */
|
||||
static void
|
||||
acpi_processor_cpu_init_pdc(
|
||||
struct acpi_processor_performance *perf,
|
||||
unsigned int cpu,
|
||||
struct acpi_object_list *obj_list
|
||||
)
|
||||
{
|
||||
struct cpuinfo_x86 *c = cpu_data + cpu;
|
||||
dprintk("acpi_processor_cpu_init_pdc\n");
|
||||
perf->pdc = NULL;
|
||||
if (cpu_has(c, X86_FEATURE_EST))
|
||||
acpi_processor_cpu_init_pdc_est(perf, cpu, obj_list);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
acpi_cpufreq_cpu_init (
|
||||
struct cpufreq_policy *policy)
|
||||
|
@ -367,14 +305,7 @@ acpi_cpufreq_cpu_init (
|
|||
unsigned int result = 0;
|
||||
struct cpuinfo_x86 *c = &cpu_data[policy->cpu];
|
||||
|
||||
union acpi_object arg0 = {ACPI_TYPE_BUFFER};
|
||||
u32 arg0_buf[3];
|
||||
struct acpi_object_list arg_list = {1, &arg0};
|
||||
|
||||
dprintk("acpi_cpufreq_cpu_init\n");
|
||||
/* setup arg_list for _PDC settings */
|
||||
arg0.buffer.length = 12;
|
||||
arg0.buffer.pointer = (u8 *) arg0_buf;
|
||||
|
||||
data = kzalloc(sizeof(struct cpufreq_acpi_io), GFP_KERNEL);
|
||||
if (!data)
|
||||
|
@ -382,9 +313,7 @@ acpi_cpufreq_cpu_init (
|
|||
|
||||
acpi_io_data[cpu] = data;
|
||||
|
||||
acpi_processor_cpu_init_pdc(&data->acpi_data, cpu, &arg_list);
|
||||
result = acpi_processor_register_performance(&data->acpi_data, cpu);
|
||||
data->acpi_data.pdc = NULL;
|
||||
|
||||
if (result)
|
||||
goto err_free;
|
||||
|
|
|
@ -52,6 +52,7 @@ enum {
|
|||
|
||||
|
||||
static int has_N44_O17_errata[NR_CPUS];
|
||||
static int has_N60_errata[NR_CPUS];
|
||||
static unsigned int stock_freq;
|
||||
static struct cpufreq_driver p4clockmod_driver;
|
||||
static unsigned int cpufreq_p4_get(unsigned int cpu);
|
||||
|
@ -226,6 +227,12 @@ static int cpufreq_p4_cpu_init(struct cpufreq_policy *policy)
|
|||
case 0x0f12:
|
||||
has_N44_O17_errata[policy->cpu] = 1;
|
||||
dprintk("has errata -- disabling low frequencies\n");
|
||||
break;
|
||||
|
||||
case 0x0f29:
|
||||
has_N60_errata[policy->cpu] = 1;
|
||||
dprintk("has errata -- disabling frequencies lower than 2ghz\n");
|
||||
break;
|
||||
}
|
||||
|
||||
/* get max frequency */
|
||||
|
@ -237,6 +244,8 @@ static int cpufreq_p4_cpu_init(struct cpufreq_policy *policy)
|
|||
for (i=1; (p4clockmod_table[i].frequency != CPUFREQ_TABLE_END); i++) {
|
||||
if ((i<2) && (has_N44_O17_errata[policy->cpu]))
|
||||
p4clockmod_table[i].frequency = CPUFREQ_ENTRY_INVALID;
|
||||
else if (has_N60_errata[policy->cpu] && p4clockmod_table[i].frequency < 2000000)
|
||||
p4clockmod_table[i].frequency = CPUFREQ_ENTRY_INVALID;
|
||||
else
|
||||
p4clockmod_table[i].frequency = (stock_freq * i)/8;
|
||||
}
|
||||
|
|
|
@ -362,22 +362,10 @@ static struct acpi_processor_performance p;
|
|||
*/
|
||||
static int centrino_cpu_init_acpi(struct cpufreq_policy *policy)
|
||||
{
|
||||
union acpi_object arg0 = {ACPI_TYPE_BUFFER};
|
||||
u32 arg0_buf[3];
|
||||
struct acpi_object_list arg_list = {1, &arg0};
|
||||
unsigned long cur_freq;
|
||||
int result = 0, i;
|
||||
unsigned int cpu = policy->cpu;
|
||||
|
||||
/* _PDC settings */
|
||||
arg0.buffer.length = 12;
|
||||
arg0.buffer.pointer = (u8 *) arg0_buf;
|
||||
arg0_buf[0] = ACPI_PDC_REVISION_ID;
|
||||
arg0_buf[1] = 1;
|
||||
arg0_buf[2] = ACPI_PDC_EST_CAPABILITY_SMP_MSR;
|
||||
|
||||
p.pdc = &arg_list;
|
||||
|
||||
/* register with ACPI core */
|
||||
if (acpi_processor_register_performance(&p, cpu)) {
|
||||
dprintk(KERN_INFO PFX "obtaining ACPI data failed\n");
|
||||
|
|
|
@ -345,7 +345,7 @@ static void __init init_cyrix(struct cpuinfo_x86 *c)
|
|||
/*
|
||||
* Handle National Semiconductor branded processors
|
||||
*/
|
||||
static void __devinit init_nsc(struct cpuinfo_x86 *c)
|
||||
static void __init init_nsc(struct cpuinfo_x86 *c)
|
||||
{
|
||||
/* There may be GX1 processors in the wild that are branded
|
||||
* NSC and not Cyrix.
|
||||
|
@ -444,6 +444,14 @@ int __init cyrix_init_cpu(void)
|
|||
|
||||
//early_arch_initcall(cyrix_init_cpu);
|
||||
|
||||
static int __init cyrix_exit_cpu(void)
|
||||
{
|
||||
cpu_devs[X86_VENDOR_CYRIX] = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
late_initcall(cyrix_exit_cpu);
|
||||
|
||||
static struct cpu_dev nsc_cpu_dev __initdata = {
|
||||
.c_vendor = "NSC",
|
||||
.c_ident = { "Geode by NSC" },
|
||||
|
@ -458,3 +466,11 @@ int __init nsc_init_cpu(void)
|
|||
}
|
||||
|
||||
//early_arch_initcall(nsc_init_cpu);
|
||||
|
||||
static int __init nsc_exit_cpu(void)
|
||||
{
|
||||
cpu_devs[X86_VENDOR_NSC] = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
late_initcall(nsc_exit_cpu);
|
||||
|
|
|
@ -43,13 +43,23 @@ static struct _cache_table cache_table[] __cpuinitdata =
|
|||
{ 0x2c, LVL_1_DATA, 32 }, /* 8-way set assoc, 64 byte line size */
|
||||
{ 0x30, LVL_1_INST, 32 }, /* 8-way set assoc, 64 byte line size */
|
||||
{ 0x39, LVL_2, 128 }, /* 4-way set assoc, sectored cache, 64 byte line size */
|
||||
{ 0x3a, LVL_2, 192 }, /* 6-way set assoc, sectored cache, 64 byte line size */
|
||||
{ 0x3b, LVL_2, 128 }, /* 2-way set assoc, sectored cache, 64 byte line size */
|
||||
{ 0x3c, LVL_2, 256 }, /* 4-way set assoc, sectored cache, 64 byte line size */
|
||||
{ 0x3d, LVL_2, 384 }, /* 6-way set assoc, sectored cache, 64 byte line size */
|
||||
{ 0x3e, LVL_2, 512 }, /* 4-way set assoc, sectored cache, 64 byte line size */
|
||||
{ 0x41, LVL_2, 128 }, /* 4-way set assoc, 32 byte line size */
|
||||
{ 0x42, LVL_2, 256 }, /* 4-way set assoc, 32 byte line size */
|
||||
{ 0x43, LVL_2, 512 }, /* 4-way set assoc, 32 byte line size */
|
||||
{ 0x44, LVL_2, 1024 }, /* 4-way set assoc, 32 byte line size */
|
||||
{ 0x45, LVL_2, 2048 }, /* 4-way set assoc, 32 byte line size */
|
||||
{ 0x46, LVL_3, 4096 }, /* 4-way set assoc, 64 byte line size */
|
||||
{ 0x47, LVL_3, 8192 }, /* 8-way set assoc, 64 byte line size */
|
||||
{ 0x49, LVL_3, 4096 }, /* 16-way set assoc, 64 byte line size */
|
||||
{ 0x4a, LVL_3, 6144 }, /* 12-way set assoc, 64 byte line size */
|
||||
{ 0x4b, LVL_3, 8192 }, /* 16-way set assoc, 64 byte line size */
|
||||
{ 0x4c, LVL_3, 12288 }, /* 12-way set assoc, 64 byte line size */
|
||||
{ 0x4d, LVL_3, 16384 }, /* 16-way set assoc, 64 byte line size */
|
||||
{ 0x60, LVL_1_DATA, 16 }, /* 8-way set assoc, sectored cache, 64 byte line size */
|
||||
{ 0x66, LVL_1_DATA, 8 }, /* 4-way set assoc, sectored cache, 64 byte line size */
|
||||
{ 0x67, LVL_1_DATA, 16 }, /* 4-way set assoc, sectored cache, 64 byte line size */
|
||||
|
@ -57,6 +67,7 @@ static struct _cache_table cache_table[] __cpuinitdata =
|
|||
{ 0x70, LVL_TRACE, 12 }, /* 8-way set assoc */
|
||||
{ 0x71, LVL_TRACE, 16 }, /* 8-way set assoc */
|
||||
{ 0x72, LVL_TRACE, 32 }, /* 8-way set assoc */
|
||||
{ 0x73, LVL_TRACE, 64 }, /* 8-way set assoc */
|
||||
{ 0x78, LVL_2, 1024 }, /* 4-way set assoc, 64 byte line size */
|
||||
{ 0x79, LVL_2, 128 }, /* 8-way set assoc, sectored cache, 64 byte line size */
|
||||
{ 0x7a, LVL_2, 256 }, /* 8-way set assoc, sectored cache, 64 byte line size */
|
||||
|
@ -141,6 +152,7 @@ static int __cpuinit cpuid4_cache_lookup(int index, struct _cpuid4_info *this_le
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* will only be called once; __init is safe here */
|
||||
static int __init find_num_cache_leaves(void)
|
||||
{
|
||||
unsigned int eax, ebx, ecx, edx;
|
||||
|
|
|
@ -44,12 +44,10 @@
|
|||
#include <asm/msr.h>
|
||||
#include "mtrr.h"
|
||||
|
||||
#define MTRR_VERSION "2.0 (20020519)"
|
||||
|
||||
u32 num_var_ranges = 0;
|
||||
|
||||
unsigned int *usage_table;
|
||||
static DECLARE_MUTEX(main_lock);
|
||||
static DECLARE_MUTEX(mtrr_sem);
|
||||
|
||||
u32 size_or_mask, size_and_mask;
|
||||
|
||||
|
@ -335,7 +333,7 @@ int mtrr_add_page(unsigned long base, unsigned long size,
|
|||
/* No CPU hotplug when we change MTRR entries */
|
||||
lock_cpu_hotplug();
|
||||
/* Search for existing MTRR */
|
||||
down(&main_lock);
|
||||
down(&mtrr_sem);
|
||||
for (i = 0; i < num_var_ranges; ++i) {
|
||||
mtrr_if->get(i, &lbase, &lsize, <ype);
|
||||
if (base >= lbase + lsize)
|
||||
|
@ -373,7 +371,7 @@ int mtrr_add_page(unsigned long base, unsigned long size,
|
|||
printk(KERN_INFO "mtrr: no more MTRRs available\n");
|
||||
error = i;
|
||||
out:
|
||||
up(&main_lock);
|
||||
up(&mtrr_sem);
|
||||
unlock_cpu_hotplug();
|
||||
return error;
|
||||
}
|
||||
|
@ -466,7 +464,7 @@ int mtrr_del_page(int reg, unsigned long base, unsigned long size)
|
|||
max = num_var_ranges;
|
||||
/* No CPU hotplug when we change MTRR entries */
|
||||
lock_cpu_hotplug();
|
||||
down(&main_lock);
|
||||
down(&mtrr_sem);
|
||||
if (reg < 0) {
|
||||
/* Search for existing MTRR */
|
||||
for (i = 0; i < max; ++i) {
|
||||
|
@ -505,7 +503,7 @@ int mtrr_del_page(int reg, unsigned long base, unsigned long size)
|
|||
set_mtrr(reg, 0, 0, 0);
|
||||
error = reg;
|
||||
out:
|
||||
up(&main_lock);
|
||||
up(&mtrr_sem);
|
||||
unlock_cpu_hotplug();
|
||||
return error;
|
||||
}
|
||||
|
@ -671,7 +669,6 @@ void __init mtrr_bp_init(void)
|
|||
break;
|
||||
}
|
||||
}
|
||||
printk(KERN_INFO "mtrr: v%s\n",MTRR_VERSION);
|
||||
|
||||
if (mtrr_if) {
|
||||
set_num_var_ranges();
|
||||
|
@ -688,7 +685,7 @@ void mtrr_ap_init(void)
|
|||
if (!mtrr_if || !use_intel())
|
||||
return;
|
||||
/*
|
||||
* Ideally we should hold main_lock here to avoid mtrr entries changed,
|
||||
* Ideally we should hold mtrr_sem here to avoid mtrr entries changed,
|
||||
* but this routine will be called in cpu boot time, holding the lock
|
||||
* breaks it. This routine is called in two cases: 1.very earily time
|
||||
* of software resume, when there absolutely isn't mtrr entry changes;
|
||||
|
|
|
@ -61,3 +61,11 @@ int __init nexgen_init_cpu(void)
|
|||
}
|
||||
|
||||
//early_arch_initcall(nexgen_init_cpu);
|
||||
|
||||
static int __init nexgen_exit_cpu(void)
|
||||
{
|
||||
cpu_devs[X86_VENDOR_NEXGEN] = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
late_initcall(nexgen_exit_cpu);
|
||||
|
|
|
@ -51,3 +51,11 @@ int __init rise_init_cpu(void)
|
|||
}
|
||||
|
||||
//early_arch_initcall(rise_init_cpu);
|
||||
|
||||
static int __init rise_exit_cpu(void)
|
||||
{
|
||||
cpu_devs[X86_VENDOR_RISE] = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
late_initcall(rise_exit_cpu);
|
||||
|
|
|
@ -84,7 +84,7 @@ static void __init init_transmeta(struct cpuinfo_x86 *c)
|
|||
#endif
|
||||
}
|
||||
|
||||
static void transmeta_identify(struct cpuinfo_x86 * c)
|
||||
static void __init transmeta_identify(struct cpuinfo_x86 * c)
|
||||
{
|
||||
u32 xlvl;
|
||||
generic_identify(c);
|
||||
|
@ -111,3 +111,11 @@ int __init transmeta_init_cpu(void)
|
|||
}
|
||||
|
||||
//early_arch_initcall(transmeta_init_cpu);
|
||||
|
||||
static int __init transmeta_exit_cpu(void)
|
||||
{
|
||||
cpu_devs[X86_VENDOR_TRANSMETA] = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
late_initcall(transmeta_exit_cpu);
|
||||
|
|
|
@ -31,3 +31,11 @@ int __init umc_init_cpu(void)
|
|||
}
|
||||
|
||||
//early_arch_initcall(umc_init_cpu);
|
||||
|
||||
static int __init umc_exit_cpu(void)
|
||||
{
|
||||
cpu_devs[X86_VENDOR_UMC] = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
late_initcall(umc_exit_cpu);
|
||||
|
|
|
@ -1080,7 +1080,7 @@ void __init mp_config_acpi_legacy_irqs (void)
|
|||
|
||||
#define MAX_GSI_NUM 4096
|
||||
|
||||
int mp_register_gsi (u32 gsi, int edge_level, int active_high_low)
|
||||
int mp_register_gsi (u32 gsi, int triggering, int polarity)
|
||||
{
|
||||
int ioapic = -1;
|
||||
int ioapic_pin = 0;
|
||||
|
@ -1129,7 +1129,7 @@ int mp_register_gsi (u32 gsi, int edge_level, int active_high_low)
|
|||
|
||||
mp_ioapic_routing[ioapic].pin_programmed[idx] |= (1<<bit);
|
||||
|
||||
if (edge_level) {
|
||||
if (triggering == ACPI_LEVEL_SENSITIVE) {
|
||||
/*
|
||||
* For PCI devices assign IRQs in order, avoiding gaps
|
||||
* due to unused I/O APIC pins.
|
||||
|
@ -1151,8 +1151,8 @@ int mp_register_gsi (u32 gsi, int edge_level, int active_high_low)
|
|||
}
|
||||
|
||||
io_apic_set_pci_routing(ioapic, ioapic_pin, gsi,
|
||||
edge_level == ACPI_EDGE_SENSITIVE ? 0 : 1,
|
||||
active_high_low == ACPI_ACTIVE_HIGH ? 0 : 1);
|
||||
triggering == ACPI_EDGE_SENSITIVE ? 0 : 1,
|
||||
polarity == ACPI_ACTIVE_HIGH ? 0 : 1);
|
||||
return gsi;
|
||||
}
|
||||
|
||||
|
|
|
@ -138,7 +138,7 @@ static int __init check_nmi_watchdog(void)
|
|||
if (nmi_watchdog == NMI_LOCAL_APIC)
|
||||
smp_call_function(nmi_cpu_busy, (void *)&endflag, 0, 0);
|
||||
|
||||
for (cpu = 0; cpu < NR_CPUS; cpu++)
|
||||
for_each_cpu(cpu)
|
||||
prev_nmi_count[cpu] = per_cpu(irq_stat, cpu).__nmi_count;
|
||||
local_irq_enable();
|
||||
mdelay((10*1000)/nmi_hz); // wait 10 ticks
|
||||
|
|
|
@ -297,8 +297,10 @@ void show_regs(struct pt_regs * regs)
|
|||
|
||||
if (user_mode(regs))
|
||||
printk(" ESP: %04x:%08lx",0xffff & regs->xss,regs->esp);
|
||||
printk(" EFLAGS: %08lx %s (%s)\n",
|
||||
regs->eflags, print_tainted(), system_utsname.release);
|
||||
printk(" EFLAGS: %08lx %s (%s %.*s)\n",
|
||||
regs->eflags, print_tainted(), system_utsname.release,
|
||||
(int)strcspn(system_utsname.version, " "),
|
||||
system_utsname.version);
|
||||
printk("EAX: %08lx EBX: %08lx ECX: %08lx EDX: %08lx\n",
|
||||
regs->eax,regs->ebx,regs->ecx,regs->edx);
|
||||
printk("ESI: %08lx EDI: %08lx EBP: %08lx",
|
||||
|
|
|
@ -45,6 +45,15 @@ static unsigned long last_tsc_high; /* msb 32 bits of Time Stamp Counter */
|
|||
static unsigned long long monotonic_base;
|
||||
static seqlock_t monotonic_lock = SEQLOCK_UNLOCKED;
|
||||
|
||||
/* Avoid compensating for lost ticks before TSCs are synched */
|
||||
static int detect_lost_ticks;
|
||||
static int __init start_lost_tick_compensation(void)
|
||||
{
|
||||
detect_lost_ticks = 1;
|
||||
return 0;
|
||||
}
|
||||
late_initcall(start_lost_tick_compensation);
|
||||
|
||||
/* convert from cycles(64bits) => nanoseconds (64bits)
|
||||
* basic equation:
|
||||
* ns = cycles / (freq / ns_per_sec)
|
||||
|
@ -196,7 +205,8 @@ static void mark_offset_tsc_hpet(void)
|
|||
|
||||
/* lost tick compensation */
|
||||
offset = hpet_readl(HPET_T0_CMP) - hpet_tick;
|
||||
if (unlikely(((offset - hpet_last) > hpet_tick) && (hpet_last != 0))) {
|
||||
if (unlikely(((offset - hpet_last) > hpet_tick) && (hpet_last != 0))
|
||||
&& detect_lost_ticks) {
|
||||
int lost_ticks = (offset - hpet_last) / hpet_tick;
|
||||
jiffies_64 += lost_ticks;
|
||||
}
|
||||
|
@ -421,7 +431,7 @@ static void mark_offset_tsc(void)
|
|||
delta += delay_at_last_interrupt;
|
||||
lost = delta/(1000000/HZ);
|
||||
delay = delta%(1000000/HZ);
|
||||
if (lost >= 2) {
|
||||
if (lost >= 2 && detect_lost_ticks) {
|
||||
jiffies_64 += lost-1;
|
||||
|
||||
/* sanity check to ensure we're not always losing ticks */
|
||||
|
|
|
@ -166,7 +166,8 @@ static void show_trace_log_lvl(struct task_struct *task,
|
|||
stack = (unsigned long*)context->previous_esp;
|
||||
if (!stack)
|
||||
break;
|
||||
printk(KERN_EMERG " =======================\n");
|
||||
printk(log_lvl);
|
||||
printk(" =======================\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -239,9 +240,11 @@ void show_registers(struct pt_regs *regs)
|
|||
}
|
||||
print_modules();
|
||||
printk(KERN_EMERG "CPU: %d\nEIP: %04x:[<%08lx>] %s VLI\n"
|
||||
"EFLAGS: %08lx (%s) \n",
|
||||
"EFLAGS: %08lx (%s %.*s) \n",
|
||||
smp_processor_id(), 0xffff & regs->xcs, regs->eip,
|
||||
print_tainted(), regs->eflags, system_utsname.release);
|
||||
print_tainted(), regs->eflags, system_utsname.release,
|
||||
(int)strcspn(system_utsname.version, " "),
|
||||
system_utsname.version);
|
||||
print_symbol(KERN_EMERG "EIP is at %s\n", regs->eip);
|
||||
printk(KERN_EMERG "eax: %08lx ebx: %08lx ecx: %08lx edx: %08lx\n",
|
||||
regs->eax, regs->ebx, regs->ecx, regs->edx);
|
||||
|
|
|
@ -49,7 +49,9 @@ dump_backtrace(struct frame_head * head)
|
|||
* | stack |
|
||||
* --------------- saved regs->ebp value if valid (frame_head address)
|
||||
* . .
|
||||
* --------------- struct pt_regs stored on stack (struct pt_regs *)
|
||||
* --------------- saved regs->rsp value if x86_64
|
||||
* | |
|
||||
* --------------- struct pt_regs * stored on stack if 32-bit
|
||||
* | |
|
||||
* . .
|
||||
* | |
|
||||
|
@ -57,13 +59,26 @@ dump_backtrace(struct frame_head * head)
|
|||
* | |
|
||||
* | | \/ Lower addresses
|
||||
*
|
||||
* Thus, &pt_regs <-> stack base restricts the valid(ish) ebp values
|
||||
* Thus, regs (or regs->rsp for x86_64) <-> stack base restricts the
|
||||
* valid(ish) ebp values. Note: (1) for x86_64, NMI and several other
|
||||
* exceptions use special stacks, maintained by the interrupt stack table
|
||||
* (IST). These stacks are set up in trap_init() in
|
||||
* arch/x86_64/kernel/traps.c. Thus, for x86_64, regs now does not point
|
||||
* to the kernel stack; instead, it points to some location on the NMI
|
||||
* stack. On the other hand, regs->rsp is the stack pointer saved when the
|
||||
* NMI occurred. (2) For 32-bit, regs->esp is not valid because the
|
||||
* processor does not save %esp on the kernel stack when interrupts occur
|
||||
* in the kernel mode.
|
||||
*/
|
||||
#ifdef CONFIG_FRAME_POINTER
|
||||
static int valid_kernel_stack(struct frame_head * head, struct pt_regs * regs)
|
||||
{
|
||||
unsigned long headaddr = (unsigned long)head;
|
||||
#ifdef CONFIG_X86_64
|
||||
unsigned long stack = (unsigned long)regs->rsp;
|
||||
#else
|
||||
unsigned long stack = (unsigned long)regs;
|
||||
#endif
|
||||
unsigned long stack_base = (stack & ~(THREAD_SIZE - 1)) + THREAD_SIZE;
|
||||
|
||||
return headaddr > stack && headaddr < stack_base;
|
||||
|
|
|
@ -539,6 +539,11 @@ static __init int intel_router_probe(struct irq_router *r, struct pci_dev *route
|
|||
case PCI_DEVICE_ID_INTEL_ICH7_30:
|
||||
case PCI_DEVICE_ID_INTEL_ICH7_31:
|
||||
case PCI_DEVICE_ID_INTEL_ESB2_0:
|
||||
case PCI_DEVICE_ID_INTEL_ICH8_0:
|
||||
case PCI_DEVICE_ID_INTEL_ICH8_1:
|
||||
case PCI_DEVICE_ID_INTEL_ICH8_2:
|
||||
case PCI_DEVICE_ID_INTEL_ICH8_3:
|
||||
case PCI_DEVICE_ID_INTEL_ICH8_4:
|
||||
r->name = "PIIX/ICH";
|
||||
r->get = pirq_piix_get;
|
||||
r->set = pirq_piix_set;
|
||||
|
|
|
@ -36,8 +36,7 @@ static u32 get_base_addr(unsigned int seg, int bus, unsigned devfn)
|
|||
while (1) {
|
||||
++cfg_num;
|
||||
if (cfg_num >= pci_mmcfg_config_num) {
|
||||
/* Not found - fallback to type 1 */
|
||||
return 0;
|
||||
break;
|
||||
}
|
||||
cfg = &pci_mmcfg_config[cfg_num];
|
||||
if (cfg->pci_segment_group_number != seg)
|
||||
|
@ -46,6 +45,18 @@ static u32 get_base_addr(unsigned int seg, int bus, unsigned devfn)
|
|||
(cfg->end_bus_number >= bus))
|
||||
return cfg->base_address;
|
||||
}
|
||||
|
||||
/* Handle more broken MCFG tables on Asus etc.
|
||||
They only contain a single entry for bus 0-0. Assume
|
||||
this applies to all busses. */
|
||||
cfg = &pci_mmcfg_config[0];
|
||||
if (pci_mmcfg_config_num == 1 &&
|
||||
cfg->pci_segment_group_number == 0 &&
|
||||
(cfg->start_bus_number | cfg->end_bus_number) == 0)
|
||||
return cfg->base_address;
|
||||
|
||||
/* Fall back to type 0 */
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void pci_exp_set_dev_base(unsigned int base, int bus, int devfn)
|
||||
|
|
|
@ -13,6 +13,11 @@ obj-$(CONFIG_IA64_BRL_EMU) += brl_emu.o
|
|||
obj-$(CONFIG_IA64_GENERIC) += acpi-ext.o
|
||||
obj-$(CONFIG_IA64_HP_ZX1) += acpi-ext.o
|
||||
obj-$(CONFIG_IA64_HP_ZX1_SWIOTLB) += acpi-ext.o
|
||||
|
||||
ifneq ($(CONFIG_ACPI_PROCESSOR),)
|
||||
obj-y += acpi-processor.o
|
||||
endif
|
||||
|
||||
obj-$(CONFIG_IA64_PALINFO) += palinfo.o
|
||||
obj-$(CONFIG_IOSAPIC) += iosapic.o
|
||||
obj-$(CONFIG_MODULES) += module.o
|
||||
|
|
|
@ -33,33 +33,33 @@ acpi_vendor_resource_match(struct acpi_resource *resource, void *context)
|
|||
struct acpi_vendor_info *info = (struct acpi_vendor_info *)context;
|
||||
struct acpi_resource_vendor *vendor;
|
||||
struct acpi_vendor_descriptor *descriptor;
|
||||
u32 length;
|
||||
u32 byte_length;
|
||||
|
||||
if (resource->id != ACPI_RSTYPE_VENDOR)
|
||||
if (resource->type != ACPI_RESOURCE_TYPE_VENDOR)
|
||||
return AE_OK;
|
||||
|
||||
vendor = (struct acpi_resource_vendor *)&resource->data;
|
||||
descriptor = (struct acpi_vendor_descriptor *)vendor->reserved;
|
||||
if (vendor->length <= sizeof(*info->descriptor) ||
|
||||
descriptor = (struct acpi_vendor_descriptor *)vendor->byte_data;
|
||||
if (vendor->byte_length <= sizeof(*info->descriptor) ||
|
||||
descriptor->guid_id != info->descriptor->guid_id ||
|
||||
efi_guidcmp(descriptor->guid, info->descriptor->guid))
|
||||
return AE_OK;
|
||||
|
||||
length = vendor->length - sizeof(struct acpi_vendor_descriptor);
|
||||
info->data = acpi_os_allocate(length);
|
||||
byte_length = vendor->byte_length - sizeof(struct acpi_vendor_descriptor);
|
||||
info->data = acpi_os_allocate(byte_length);
|
||||
if (!info->data)
|
||||
return AE_NO_MEMORY;
|
||||
|
||||
memcpy(info->data,
|
||||
vendor->reserved + sizeof(struct acpi_vendor_descriptor),
|
||||
length);
|
||||
info->length = length;
|
||||
vendor->byte_data + sizeof(struct acpi_vendor_descriptor),
|
||||
byte_length);
|
||||
info->length = byte_length;
|
||||
return AE_CTRL_TERMINATE;
|
||||
}
|
||||
|
||||
acpi_status
|
||||
acpi_find_vendor_resource(acpi_handle obj, struct acpi_vendor_descriptor * id,
|
||||
u8 ** data, u32 * length)
|
||||
u8 ** data, u32 * byte_length)
|
||||
{
|
||||
struct acpi_vendor_info info;
|
||||
|
||||
|
@ -72,7 +72,7 @@ acpi_find_vendor_resource(acpi_handle obj, struct acpi_vendor_descriptor * id,
|
|||
return AE_NOT_FOUND;
|
||||
|
||||
*data = info.data;
|
||||
*length = info.length;
|
||||
*byte_length = info.length;
|
||||
return AE_OK;
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,67 @@
|
|||
/*
|
||||
* arch/ia64/kernel/cpufreq/processor.c
|
||||
*
|
||||
* Copyright (C) 2005 Intel Corporation
|
||||
* Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
|
||||
* - Added _PDC for platforms with Intel CPUs
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/acpi.h>
|
||||
|
||||
#include <acpi/processor.h>
|
||||
#include <asm/acpi.h>
|
||||
|
||||
static void init_intel_pdc(struct acpi_processor *pr)
|
||||
{
|
||||
struct acpi_object_list *obj_list;
|
||||
union acpi_object *obj;
|
||||
u32 *buf;
|
||||
|
||||
/* allocate and initialize pdc. It will be used later. */
|
||||
obj_list = kmalloc(sizeof(struct acpi_object_list), GFP_KERNEL);
|
||||
if (!obj_list) {
|
||||
printk(KERN_ERR "Memory allocation error\n");
|
||||
return;
|
||||
}
|
||||
|
||||
obj = kmalloc(sizeof(union acpi_object), GFP_KERNEL);
|
||||
if (!obj) {
|
||||
printk(KERN_ERR "Memory allocation error\n");
|
||||
kfree(obj_list);
|
||||
return;
|
||||
}
|
||||
|
||||
buf = kmalloc(12, GFP_KERNEL);
|
||||
if (!buf) {
|
||||
printk(KERN_ERR "Memory allocation error\n");
|
||||
kfree(obj);
|
||||
kfree(obj_list);
|
||||
return;
|
||||
}
|
||||
|
||||
buf[0] = ACPI_PDC_REVISION_ID;
|
||||
buf[1] = 1;
|
||||
buf[2] |= ACPI_PDC_EST_CAPABILITY_SMP;
|
||||
|
||||
obj->type = ACPI_TYPE_BUFFER;
|
||||
obj->buffer.length = 12;
|
||||
obj->buffer.pointer = (u8 *) buf;
|
||||
obj_list->count = 1;
|
||||
obj_list->pointer = obj;
|
||||
pr->pdc = obj_list;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/* Initialize _PDC data based on the CPU vendor */
|
||||
void arch_acpi_processor_init_pdc(struct acpi_processor *pr)
|
||||
{
|
||||
pr->pdc = NULL;
|
||||
init_intel_pdc(pr);
|
||||
return;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(arch_acpi_processor_init_pdc);
|
|
@ -567,16 +567,16 @@ void __init acpi_numa_arch_fixup(void)
|
|||
* success: return IRQ number (>=0)
|
||||
* failure: return < 0
|
||||
*/
|
||||
int acpi_register_gsi(u32 gsi, int edge_level, int active_high_low)
|
||||
int acpi_register_gsi(u32 gsi, int triggering, int polarity)
|
||||
{
|
||||
if (has_8259 && gsi < 16)
|
||||
return isa_irq_to_vector(gsi);
|
||||
|
||||
return iosapic_register_intr(gsi,
|
||||
(active_high_low ==
|
||||
(polarity ==
|
||||
ACPI_ACTIVE_HIGH) ? IOSAPIC_POL_HIGH :
|
||||
IOSAPIC_POL_LOW,
|
||||
(edge_level ==
|
||||
(triggering ==
|
||||
ACPI_EDGE_SENSITIVE) ? IOSAPIC_EDGE :
|
||||
IOSAPIC_LEVEL);
|
||||
}
|
||||
|
|
|
@ -1 +1,2 @@
|
|||
obj-$(CONFIG_IA64_ACPI_CPUFREQ) += acpi-cpufreq.o
|
||||
|
||||
|
|
|
@ -269,48 +269,6 @@ acpi_cpufreq_verify (
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
* processor_init_pdc - let BIOS know about the SMP capabilities
|
||||
* of this driver
|
||||
* @perf: processor-specific acpi_io_data struct
|
||||
* @cpu: CPU being initialized
|
||||
*
|
||||
* To avoid issues with legacy OSes, some BIOSes require to be informed of
|
||||
* the SMP capabilities of OS P-state driver. Here we set the bits in _PDC
|
||||
* accordingly. Actual call to _PDC is done in driver/acpi/processor.c
|
||||
*/
|
||||
static void
|
||||
processor_init_pdc (
|
||||
struct acpi_processor_performance *perf,
|
||||
unsigned int cpu,
|
||||
struct acpi_object_list *obj_list
|
||||
)
|
||||
{
|
||||
union acpi_object *obj;
|
||||
u32 *buf;
|
||||
|
||||
dprintk("processor_init_pdc\n");
|
||||
|
||||
perf->pdc = NULL;
|
||||
/* Initialize pdc. It will be used later. */
|
||||
if (!obj_list)
|
||||
return;
|
||||
|
||||
if (!(obj_list->count && obj_list->pointer))
|
||||
return;
|
||||
|
||||
obj = obj_list->pointer;
|
||||
if ((obj->buffer.length == 12) && obj->buffer.pointer) {
|
||||
buf = (u32 *)obj->buffer.pointer;
|
||||
buf[0] = ACPI_PDC_REVISION_ID;
|
||||
buf[1] = 1;
|
||||
buf[2] = ACPI_PDC_EST_CAPABILITY_SMP;
|
||||
perf->pdc = obj_list;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
acpi_cpufreq_cpu_init (
|
||||
struct cpufreq_policy *policy)
|
||||
|
@ -320,14 +278,7 @@ acpi_cpufreq_cpu_init (
|
|||
struct cpufreq_acpi_io *data;
|
||||
unsigned int result = 0;
|
||||
|
||||
union acpi_object arg0 = {ACPI_TYPE_BUFFER};
|
||||
u32 arg0_buf[3];
|
||||
struct acpi_object_list arg_list = {1, &arg0};
|
||||
|
||||
dprintk("acpi_cpufreq_cpu_init\n");
|
||||
/* setup arg_list for _PDC settings */
|
||||
arg0.buffer.length = 12;
|
||||
arg0.buffer.pointer = (u8 *) arg0_buf;
|
||||
|
||||
data = kmalloc(sizeof(struct cpufreq_acpi_io), GFP_KERNEL);
|
||||
if (!data)
|
||||
|
@ -337,9 +288,7 @@ acpi_cpufreq_cpu_init (
|
|||
|
||||
acpi_io_data[cpu] = data;
|
||||
|
||||
processor_init_pdc(&data->acpi_data, cpu, &arg_list);
|
||||
result = acpi_processor_register_performance(&data->acpi_data, cpu);
|
||||
data->acpi_data.pdc = NULL;
|
||||
|
||||
if (result)
|
||||
goto err_free;
|
||||
|
|
|
@ -512,7 +512,7 @@ ia64_state_save:
|
|||
st8 [temp1]=r12 // os_status, default is cold boot
|
||||
mov r6=IA64_MCA_SAME_CONTEXT
|
||||
;;
|
||||
st8 [temp1]=r6 // context, default is same context
|
||||
st8 [temp2]=r6 // context, default is same context
|
||||
|
||||
// Save the pt_regs data that is not in minstate. The previous code
|
||||
// left regs at sos.
|
||||
|
|
|
@ -71,31 +71,33 @@ static int __init topology_init(void)
|
|||
int i, err = 0;
|
||||
|
||||
#ifdef CONFIG_NUMA
|
||||
sysfs_nodes = kmalloc(sizeof(struct node) * MAX_NUMNODES, GFP_KERNEL);
|
||||
sysfs_nodes = kzalloc(sizeof(struct node) * MAX_NUMNODES, GFP_KERNEL);
|
||||
if (!sysfs_nodes) {
|
||||
err = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
memset(sysfs_nodes, 0, sizeof(struct node) * MAX_NUMNODES);
|
||||
|
||||
/* MCD - Do we want to register all ONLINE nodes, or all POSSIBLE nodes? */
|
||||
for_each_online_node(i)
|
||||
/*
|
||||
* MCD - Do we want to register all ONLINE nodes, or all POSSIBLE nodes?
|
||||
*/
|
||||
for_each_online_node(i) {
|
||||
if ((err = register_node(&sysfs_nodes[i], i, 0)))
|
||||
goto out;
|
||||
}
|
||||
#endif
|
||||
|
||||
sysfs_cpus = kmalloc(sizeof(struct ia64_cpu) * NR_CPUS, GFP_KERNEL);
|
||||
sysfs_cpus = kzalloc(sizeof(struct ia64_cpu) * NR_CPUS, GFP_KERNEL);
|
||||
if (!sysfs_cpus) {
|
||||
err = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
memset(sysfs_cpus, 0, sizeof(struct ia64_cpu) * NR_CPUS);
|
||||
|
||||
for_each_present_cpu(i)
|
||||
for_each_present_cpu(i) {
|
||||
if((err = arch_register_cpu(i)))
|
||||
goto out;
|
||||
}
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
|
||||
__initcall(topology_init);
|
||||
subsys_initcall(topology_init);
|
||||
|
|
|
@ -1283,8 +1283,9 @@ within_logging_rate_limit (void)
|
|||
|
||||
if (jiffies - last_time > 5*HZ)
|
||||
count = 0;
|
||||
if (++count < 5) {
|
||||
if (count < 5) {
|
||||
last_time = jiffies;
|
||||
count++;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
|
|
|
@ -193,12 +193,12 @@ add_io_space (struct pci_root_info *info, struct acpi_resource_address64 *addr)
|
|||
goto free_resource;
|
||||
}
|
||||
|
||||
min = addr->min_address_range;
|
||||
min = addr->minimum;
|
||||
max = min + addr->address_length - 1;
|
||||
if (addr->attribute.io.translation_attribute == ACPI_SPARSE_TRANSLATION)
|
||||
if (addr->info.io.translation_type == ACPI_SPARSE_TRANSLATION)
|
||||
sparse = 1;
|
||||
|
||||
space_nr = new_space(addr->address_translation_offset, sparse);
|
||||
space_nr = new_space(addr->translation_offset, sparse);
|
||||
if (space_nr == ~0)
|
||||
goto free_name;
|
||||
|
||||
|
@ -285,7 +285,7 @@ static __devinit acpi_status add_window(struct acpi_resource *res, void *data)
|
|||
if (addr.resource_type == ACPI_MEMORY_RANGE) {
|
||||
flags = IORESOURCE_MEM;
|
||||
root = &iomem_resource;
|
||||
offset = addr.address_translation_offset;
|
||||
offset = addr.translation_offset;
|
||||
} else if (addr.resource_type == ACPI_IO_RANGE) {
|
||||
flags = IORESOURCE_IO;
|
||||
root = &ioport_resource;
|
||||
|
@ -298,7 +298,7 @@ static __devinit acpi_status add_window(struct acpi_resource *res, void *data)
|
|||
window = &info->controller->window[info->controller->windows++];
|
||||
window->resource.name = info->name;
|
||||
window->resource.flags = flags;
|
||||
window->resource.start = addr.min_address_range + offset;
|
||||
window->resource.start = addr.minimum + offset;
|
||||
window->resource.end = window->resource.start + addr.address_length - 1;
|
||||
window->resource.child = NULL;
|
||||
window->offset = offset;
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include <linux/nodemask.h>
|
||||
#include <asm/sn/types.h>
|
||||
#include <asm/sn/addrs.h>
|
||||
#include <asm/sn/sn_feature_sets.h>
|
||||
#include <asm/sn/geo.h>
|
||||
#include <asm/sn/io.h>
|
||||
#include <asm/sn/pcibr_provider.h>
|
||||
|
@ -173,8 +174,8 @@ sn_pcidev_info_get(struct pci_dev *dev)
|
|||
*/
|
||||
static u8 war_implemented = 0;
|
||||
|
||||
static void sn_device_fixup_war(u64 nasid, u64 widget, int device,
|
||||
struct sn_flush_device_common *common)
|
||||
static s64 sn_device_fixup_war(u64 nasid, u64 widget, int device,
|
||||
struct sn_flush_device_common *common)
|
||||
{
|
||||
struct sn_flush_device_war *war_list;
|
||||
struct sn_flush_device_war *dev_entry;
|
||||
|
@ -198,8 +199,9 @@ static void sn_device_fixup_war(u64 nasid, u64 widget, int device,
|
|||
|
||||
dev_entry = war_list + device;
|
||||
memcpy(common,dev_entry, sizeof(*common));
|
||||
|
||||
kfree(war_list);
|
||||
|
||||
return isrv.status;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -279,23 +281,21 @@ static void sn_fixup_ionodes(void)
|
|||
memset(dev_entry->common, 0x0, sizeof(struct
|
||||
sn_flush_device_common));
|
||||
|
||||
status = sal_get_device_dmaflush_list(nasid,
|
||||
widget,
|
||||
device,
|
||||
if (sn_prom_feature_available(
|
||||
PRF_DEVICE_FLUSH_LIST))
|
||||
status = sal_get_device_dmaflush_list(
|
||||
nasid,
|
||||
widget,
|
||||
device,
|
||||
(u64)(dev_entry->common));
|
||||
if (status) {
|
||||
if (sn_sal_rev() < 0x0450) {
|
||||
/* shortlived WAR for older
|
||||
* PROM images
|
||||
*/
|
||||
sn_device_fixup_war(nasid,
|
||||
widget,
|
||||
device,
|
||||
else
|
||||
status = sn_device_fixup_war(nasid,
|
||||
widget,
|
||||
device,
|
||||
dev_entry->common);
|
||||
}
|
||||
else
|
||||
BUG();
|
||||
}
|
||||
if (status != SALRET_OK)
|
||||
panic("SAL call failed: %s\n",
|
||||
ia64_sal_strerror(status));
|
||||
|
||||
spin_lock_init(&dev_entry->sfdl_flush_lock);
|
||||
}
|
||||
|
|
|
@ -447,7 +447,7 @@ xpc_allocate_local_msgqueue(struct xpc_channel *ch)
|
|||
|
||||
nbytes = nentries * ch->msg_size;
|
||||
ch->local_msgqueue = xpc_kmalloc_cacheline_aligned(nbytes,
|
||||
(GFP_KERNEL | GFP_DMA),
|
||||
GFP_KERNEL,
|
||||
&ch->local_msgqueue_base);
|
||||
if (ch->local_msgqueue == NULL) {
|
||||
continue;
|
||||
|
@ -455,7 +455,7 @@ xpc_allocate_local_msgqueue(struct xpc_channel *ch)
|
|||
memset(ch->local_msgqueue, 0, nbytes);
|
||||
|
||||
nbytes = nentries * sizeof(struct xpc_notify);
|
||||
ch->notify_queue = kmalloc(nbytes, (GFP_KERNEL | GFP_DMA));
|
||||
ch->notify_queue = kmalloc(nbytes, GFP_KERNEL);
|
||||
if (ch->notify_queue == NULL) {
|
||||
kfree(ch->local_msgqueue_base);
|
||||
ch->local_msgqueue = NULL;
|
||||
|
@ -502,7 +502,7 @@ xpc_allocate_remote_msgqueue(struct xpc_channel *ch)
|
|||
|
||||
nbytes = nentries * ch->msg_size;
|
||||
ch->remote_msgqueue = xpc_kmalloc_cacheline_aligned(nbytes,
|
||||
(GFP_KERNEL | GFP_DMA),
|
||||
GFP_KERNEL,
|
||||
&ch->remote_msgqueue_base);
|
||||
if (ch->remote_msgqueue == NULL) {
|
||||
continue;
|
||||
|
|
|
@ -90,14 +90,14 @@ void *sn_dma_alloc_coherent(struct device *dev, size_t size,
|
|||
*/
|
||||
node = pcibus_to_node(pdev->bus);
|
||||
if (likely(node >=0)) {
|
||||
struct page *p = alloc_pages_node(node, GFP_ATOMIC, get_order(size));
|
||||
struct page *p = alloc_pages_node(node, flags, get_order(size));
|
||||
|
||||
if (likely(p))
|
||||
cpuaddr = page_address(p);
|
||||
else
|
||||
return NULL;
|
||||
} else
|
||||
cpuaddr = (void *)__get_free_pages(GFP_ATOMIC, get_order(size));
|
||||
cpuaddr = (void *)__get_free_pages(flags, get_order(size));
|
||||
|
||||
if (unlikely(!cpuaddr))
|
||||
return NULL;
|
||||
|
|
|
@ -178,7 +178,7 @@ int kgdb_enabled;
|
|||
*/
|
||||
static DEFINE_SPINLOCK(kgdb_lock);
|
||||
static raw_spinlock_t kgdb_cpulock[NR_CPUS] = {
|
||||
[0 ... NR_CPUS-1] = __RAW_SPIN_LOCK_UNLOCKED;
|
||||
[0 ... NR_CPUS-1] = __RAW_SPIN_LOCK_UNLOCKED,
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
@ -149,14 +149,20 @@ config HOTPLUG_CPU
|
|||
default y if SMP
|
||||
select HOTPLUG
|
||||
|
||||
config ARCH_SELECT_MEMORY_MODEL
|
||||
def_bool y
|
||||
depends on 64BIT
|
||||
|
||||
config ARCH_DISCONTIGMEM_ENABLE
|
||||
bool "Discontiguous memory support (EXPERIMENTAL)"
|
||||
depends on 64BIT && EXPERIMENTAL
|
||||
help
|
||||
Say Y to support efficient handling of discontiguous physical memory,
|
||||
for architectures which are either NUMA (Non-Uniform Memory Access)
|
||||
or have huge holes in the physical address space for other reasons.
|
||||
See <file:Documentation/vm/numa> for more.
|
||||
def_bool y
|
||||
depends on 64BIT
|
||||
|
||||
config ARCH_FLATMEM_ENABLE
|
||||
def_bool y
|
||||
|
||||
config ARCH_DISCONTIGMEM_DEFAULT
|
||||
def_bool y
|
||||
depends on ARCH_DISCONTIGMEM_ENABLE
|
||||
|
||||
source "kernel/Kconfig.hz"
|
||||
source "mm/Kconfig"
|
||||
|
|
|
@ -11,4 +11,14 @@ config DEBUG_RWLOCK
|
|||
too many attempts. If you suspect a rwlock problem or a kernel
|
||||
hacker asks for this option then say Y. Otherwise say N.
|
||||
|
||||
config DEBUG_RODATA
|
||||
bool "Write protect kernel read-only data structures"
|
||||
depends on DEBUG_KERNEL
|
||||
help
|
||||
Mark the kernel read-only data as write-protected in the pagetables,
|
||||
in order to catch accidental (and incorrect) writes to such const
|
||||
data. This option may have a slight performance impact because a
|
||||
portion of the kernel code won't be covered by a TLB anymore.
|
||||
If in doubt, say "N".
|
||||
|
||||
endmenu
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.14-rc5-pa1
|
||||
# Fri Oct 21 23:06:10 2005
|
||||
# Linux kernel version: 2.6.16-rc1-pa0
|
||||
# Tue Jan 17 08:21:01 2006
|
||||
#
|
||||
CONFIG_PARISC=y
|
||||
CONFIG_MMU=y
|
||||
|
@ -29,8 +29,6 @@ CONFIG_SYSVIPC=y
|
|||
# CONFIG_BSD_PROCESS_ACCT is not set
|
||||
CONFIG_SYSCTL=y
|
||||
# CONFIG_AUDIT is not set
|
||||
# CONFIG_HOTPLUG is not set
|
||||
CONFIG_KOBJECT_UEVENT=y
|
||||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
|
@ -38,8 +36,10 @@ CONFIG_INITRAMFS_SOURCE=""
|
|||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||
CONFIG_HOTPLUG=y
|
||||
CONFIG_PRINTK=y
|
||||
CONFIG_BUG=y
|
||||
CONFIG_ELF_CORE=y
|
||||
CONFIG_BASE_FULL=y
|
||||
CONFIG_FUTEX=y
|
||||
CONFIG_EPOLL=y
|
||||
|
@ -48,8 +48,10 @@ CONFIG_CC_ALIGN_FUNCTIONS=0
|
|||
CONFIG_CC_ALIGN_LABELS=0
|
||||
CONFIG_CC_ALIGN_LOOPS=0
|
||||
CONFIG_CC_ALIGN_JUMPS=0
|
||||
CONFIG_SLAB=y
|
||||
# CONFIG_TINY_SHMEM is not set
|
||||
CONFIG_BASE_SMALL=0
|
||||
# CONFIG_SLOB is not set
|
||||
|
||||
#
|
||||
# Loadable module support
|
||||
|
@ -57,9 +59,27 @@ CONFIG_BASE_SMALL=0
|
|||
CONFIG_MODULES=y
|
||||
# CONFIG_MODULE_UNLOAD is not set
|
||||
CONFIG_OBSOLETE_MODPARM=y
|
||||
CONFIG_MODVERSIONS=y
|
||||
# CONFIG_MODULE_SRCVERSION_ALL is not set
|
||||
# CONFIG_KMOD is not set
|
||||
|
||||
#
|
||||
# Block layer
|
||||
#
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
#
|
||||
CONFIG_IOSCHED_NOOP=y
|
||||
CONFIG_IOSCHED_AS=y
|
||||
CONFIG_IOSCHED_DEADLINE=y
|
||||
CONFIG_IOSCHED_CFQ=y
|
||||
# CONFIG_DEFAULT_AS is not set
|
||||
# CONFIG_DEFAULT_DEADLINE is not set
|
||||
CONFIG_DEFAULT_CFQ=y
|
||||
# CONFIG_DEFAULT_NOOP is not set
|
||||
CONFIG_DEFAULT_IOSCHED="cfq"
|
||||
|
||||
#
|
||||
# Processor type and features
|
||||
#
|
||||
|
@ -77,6 +97,7 @@ CONFIG_HZ=250
|
|||
CONFIG_FLATMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
# CONFIG_SPARSEMEM_STATIC is not set
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=4096
|
||||
# CONFIG_PREEMPT is not set
|
||||
# CONFIG_HPUX is not set
|
||||
|
||||
|
@ -84,8 +105,8 @@ CONFIG_FLAT_NODE_MEM_MAP=y
|
|||
# Bus options (PCI, PCMCIA, EISA, GSC, ISA)
|
||||
#
|
||||
CONFIG_GSC=y
|
||||
# CONFIG_HPPB is not set
|
||||
# CONFIG_IOMMU_CCIO is not set
|
||||
CONFIG_HPPB=y
|
||||
CONFIG_IOMMU_CCIO=y
|
||||
CONFIG_GSC_LASI=y
|
||||
CONFIG_GSC_WAX=y
|
||||
CONFIG_EISA=y
|
||||
|
@ -165,8 +186,11 @@ CONFIG_IPV6=y
|
|||
# CONFIG_LLC2 is not set
|
||||
# CONFIG_IPX is not set
|
||||
# CONFIG_ATALK is not set
|
||||
|
||||
#
|
||||
# QoS and/or fair queueing
|
||||
#
|
||||
# CONFIG_NET_SCHED is not set
|
||||
# CONFIG_NET_CLS_ROUTE is not set
|
||||
|
||||
#
|
||||
# Network testing
|
||||
|
@ -205,6 +229,7 @@ CONFIG_STANDALONE=y
|
|||
CONFIG_PARPORT=y
|
||||
CONFIG_PARPORT_PC=y
|
||||
# CONFIG_PARPORT_SERIAL is not set
|
||||
CONFIG_PARPORT_NOT_PC=y
|
||||
CONFIG_PARPORT_GSC=y
|
||||
# CONFIG_PARPORT_1284 is not set
|
||||
|
||||
|
@ -230,14 +255,6 @@ CONFIG_BLK_DEV_RAM_COUNT=16
|
|||
CONFIG_CDROM_PKTCDVD=m
|
||||
CONFIG_CDROM_PKTCDVD_BUFFERS=8
|
||||
# CONFIG_CDROM_PKTCDVD_WCACHE is not set
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
#
|
||||
CONFIG_IOSCHED_NOOP=y
|
||||
CONFIG_IOSCHED_AS=y
|
||||
CONFIG_IOSCHED_DEADLINE=y
|
||||
CONFIG_IOSCHED_CFQ=y
|
||||
CONFIG_ATA_OVER_ETH=y
|
||||
|
||||
#
|
||||
|
@ -281,6 +298,7 @@ CONFIG_SCSI_SPI_ATTRS=y
|
|||
#
|
||||
# SCSI low-level drivers
|
||||
#
|
||||
# CONFIG_ISCSI_TCP is not set
|
||||
# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
|
||||
# CONFIG_SCSI_3W_9XXX is not set
|
||||
# CONFIG_SCSI_ACARD is not set
|
||||
|
@ -313,21 +331,19 @@ CONFIG_SCSI_SYM53C8XX_2=y
|
|||
CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=0
|
||||
CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
|
||||
CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
|
||||
# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set
|
||||
CONFIG_SCSI_SYM53C8XX_MMIO=y
|
||||
# CONFIG_SCSI_IPR is not set
|
||||
# CONFIG_SCSI_ZALON is not set
|
||||
CONFIG_SCSI_ZALON=y
|
||||
CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS=8
|
||||
CONFIG_SCSI_NCR53C8XX_MAX_TAGS=32
|
||||
CONFIG_SCSI_NCR53C8XX_SYNC=40
|
||||
# CONFIG_SCSI_NCR53C8XX_PROFILE is not set
|
||||
# CONFIG_SCSI_PAS16 is not set
|
||||
# CONFIG_SCSI_PSI240I is not set
|
||||
# CONFIG_SCSI_QLOGIC_FAS is not set
|
||||
# CONFIG_SCSI_QLOGIC_FC is not set
|
||||
# CONFIG_SCSI_QLOGIC_1280 is not set
|
||||
CONFIG_SCSI_QLA2XXX=y
|
||||
# CONFIG_SCSI_QLA21XX is not set
|
||||
# CONFIG_SCSI_QLA22XX is not set
|
||||
# CONFIG_SCSI_QLA2300 is not set
|
||||
# CONFIG_SCSI_QLA2322 is not set
|
||||
# CONFIG_SCSI_QLA6312 is not set
|
||||
# CONFIG_SCSI_QLA24XX is not set
|
||||
# CONFIG_SCSI_QLA_FC is not set
|
||||
# CONFIG_SCSI_LPFC is not set
|
||||
# CONFIG_SCSI_SIM710 is not set
|
||||
# CONFIG_SCSI_SYM53C416 is not set
|
||||
|
@ -397,7 +413,7 @@ CONFIG_NETDEVICES=y
|
|||
#
|
||||
CONFIG_NET_ETHERNET=y
|
||||
# CONFIG_MII is not set
|
||||
# CONFIG_LASI_82596 is not set
|
||||
CONFIG_LASI_82596=y
|
||||
# CONFIG_HAPPYMEAL is not set
|
||||
# CONFIG_SUNGEM is not set
|
||||
# CONFIG_CASSINI is not set
|
||||
|
@ -464,6 +480,7 @@ CONFIG_NET_RADIO=y
|
|||
# Wireless 802.11b ISA/PCI cards support
|
||||
#
|
||||
# CONFIG_HERMES is not set
|
||||
# CONFIG_ATMEL is not set
|
||||
|
||||
#
|
||||
# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support
|
||||
|
@ -527,7 +544,7 @@ CONFIG_KEYBOARD_ATKBD_HP_KEYCODES=y
|
|||
# CONFIG_KEYBOARD_XTKBD is not set
|
||||
# CONFIG_KEYBOARD_NEWTON is not set
|
||||
# CONFIG_KEYBOARD_HIL_OLD is not set
|
||||
# CONFIG_KEYBOARD_HIL is not set
|
||||
CONFIG_KEYBOARD_HIL=y
|
||||
CONFIG_INPUT_MOUSE=y
|
||||
CONFIG_MOUSE_PS2=y
|
||||
# CONFIG_MOUSE_SERIAL is not set
|
||||
|
@ -535,7 +552,7 @@ CONFIG_MOUSE_PS2=y
|
|||
# CONFIG_MOUSE_LOGIBM is not set
|
||||
# CONFIG_MOUSE_PC110PAD is not set
|
||||
# CONFIG_MOUSE_VSXXXAA is not set
|
||||
# CONFIG_MOUSE_HIL is not set
|
||||
CONFIG_MOUSE_HIL=y
|
||||
# CONFIG_INPUT_JOYSTICK is not set
|
||||
# CONFIG_INPUT_TOUCHSCREEN is not set
|
||||
CONFIG_INPUT_MISC=y
|
||||
|
@ -549,7 +566,8 @@ CONFIG_SERIO=y
|
|||
# CONFIG_SERIO_SERPORT is not set
|
||||
# CONFIG_SERIO_PARKBD is not set
|
||||
CONFIG_SERIO_GSCPS2=y
|
||||
# CONFIG_HP_SDC is not set
|
||||
CONFIG_HP_SDC=y
|
||||
CONFIG_HIL_MLC=y
|
||||
# CONFIG_SERIO_PCIPS2 is not set
|
||||
CONFIG_SERIO_LIBPS2=y
|
||||
# CONFIG_SERIO_RAW is not set
|
||||
|
@ -569,6 +587,7 @@ CONFIG_HW_CONSOLE=y
|
|||
CONFIG_SERIAL_8250=y
|
||||
CONFIG_SERIAL_8250_CONSOLE=y
|
||||
CONFIG_SERIAL_8250_NR_UARTS=13
|
||||
CONFIG_SERIAL_8250_RUNTIME_UARTS=4
|
||||
CONFIG_SERIAL_8250_EXTENDED=y
|
||||
CONFIG_SERIAL_8250_MANY_PORTS=y
|
||||
CONFIG_SERIAL_8250_SHARE_IRQ=y
|
||||
|
@ -582,11 +601,10 @@ CONFIG_SERIAL_8250_SHARE_IRQ=y
|
|||
#
|
||||
# Non-8250 serial port support
|
||||
#
|
||||
# CONFIG_SERIAL_MUX is not set
|
||||
# CONFIG_PDC_CONSOLE is not set
|
||||
CONFIG_SERIAL_MUX=y
|
||||
CONFIG_SERIAL_MUX_CONSOLE=y
|
||||
CONFIG_SERIAL_CORE=y
|
||||
CONFIG_SERIAL_CORE_CONSOLE=y
|
||||
# CONFIG_SERIAL_JSM is not set
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
CONFIG_LEGACY_PTYS=y
|
||||
CONFIG_LEGACY_PTY_COUNT=256
|
||||
|
@ -625,6 +643,12 @@ CONFIG_GEN_RTC=y
|
|||
#
|
||||
# CONFIG_I2C is not set
|
||||
|
||||
#
|
||||
# SPI support
|
||||
#
|
||||
# CONFIG_SPI is not set
|
||||
# CONFIG_SPI_MASTER is not set
|
||||
|
||||
#
|
||||
# Dallas's 1-wire bus
|
||||
#
|
||||
|
@ -661,7 +685,6 @@ CONFIG_FB=y
|
|||
CONFIG_FB_CFB_FILLRECT=y
|
||||
CONFIG_FB_CFB_COPYAREA=y
|
||||
CONFIG_FB_CFB_IMAGEBLIT=y
|
||||
CONFIG_FB_SOFT_CURSOR=y
|
||||
# CONFIG_FB_MACMODES is not set
|
||||
# CONFIG_FB_MODE_HELPERS is not set
|
||||
# CONFIG_FB_TILEBLITTING is not set
|
||||
|
@ -671,6 +694,7 @@ CONFIG_FB_SOFT_CURSOR=y
|
|||
# CONFIG_FB_ASILIANT is not set
|
||||
# CONFIG_FB_IMSTT is not set
|
||||
CONFIG_FB_STI=y
|
||||
# CONFIG_FB_S1D13XXX is not set
|
||||
# CONFIG_FB_NVIDIA is not set
|
||||
# CONFIG_FB_RIVA is not set
|
||||
# CONFIG_FB_MATROX is not set
|
||||
|
@ -683,9 +707,7 @@ CONFIG_FB_STI=y
|
|||
# CONFIG_FB_KYRO is not set
|
||||
# CONFIG_FB_3DFX is not set
|
||||
# CONFIG_FB_VOODOO1 is not set
|
||||
# CONFIG_FB_CYBLA is not set
|
||||
# CONFIG_FB_TRIDENT is not set
|
||||
# CONFIG_FB_S1D13XXX is not set
|
||||
# CONFIG_FB_VIRTUAL is not set
|
||||
|
||||
#
|
||||
|
@ -695,6 +717,7 @@ CONFIG_DUMMY_CONSOLE=y
|
|||
CONFIG_DUMMY_CONSOLE_COLUMNS=160
|
||||
CONFIG_DUMMY_CONSOLE_ROWS=64
|
||||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||
# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
|
||||
CONFIG_STI_CONSOLE=y
|
||||
# CONFIG_FONTS is not set
|
||||
CONFIG_FONT_8x8=y
|
||||
|
@ -713,7 +736,85 @@ CONFIG_LOGO_PARISC_CLUT224=y
|
|||
#
|
||||
# Sound
|
||||
#
|
||||
# CONFIG_SOUND is not set
|
||||
CONFIG_SOUND=y
|
||||
|
||||
#
|
||||
# Advanced Linux Sound Architecture
|
||||
#
|
||||
CONFIG_SND=y
|
||||
CONFIG_SND_TIMER=y
|
||||
CONFIG_SND_PCM=y
|
||||
CONFIG_SND_SEQUENCER=y
|
||||
# CONFIG_SND_SEQ_DUMMY is not set
|
||||
CONFIG_SND_OSSEMUL=y
|
||||
CONFIG_SND_MIXER_OSS=y
|
||||
CONFIG_SND_PCM_OSS=y
|
||||
CONFIG_SND_SEQUENCER_OSS=y
|
||||
CONFIG_SND_SUPPORT_OLD_API=y
|
||||
# CONFIG_SND_VERBOSE_PRINTK is not set
|
||||
# CONFIG_SND_DEBUG is not set
|
||||
|
||||
#
|
||||
# Generic devices
|
||||
#
|
||||
# CONFIG_SND_DUMMY is not set
|
||||
# CONFIG_SND_VIRMIDI is not set
|
||||
# CONFIG_SND_MTPAV is not set
|
||||
# CONFIG_SND_SERIAL_U16550 is not set
|
||||
# CONFIG_SND_MPU401 is not set
|
||||
|
||||
#
|
||||
# PCI devices
|
||||
#
|
||||
# CONFIG_SND_AD1889 is not set
|
||||
# CONFIG_SND_ALI5451 is not set
|
||||
# CONFIG_SND_ATIIXP is not set
|
||||
# CONFIG_SND_ATIIXP_MODEM is not set
|
||||
# CONFIG_SND_AU8810 is not set
|
||||
# CONFIG_SND_AU8820 is not set
|
||||
# CONFIG_SND_AU8830 is not set
|
||||
# CONFIG_SND_BT87X is not set
|
||||
# CONFIG_SND_CA0106 is not set
|
||||
# CONFIG_SND_CMIPCI is not set
|
||||
# CONFIG_SND_CS4281 is not set
|
||||
# CONFIG_SND_CS46XX is not set
|
||||
# CONFIG_SND_EMU10K1 is not set
|
||||
# CONFIG_SND_EMU10K1X is not set
|
||||
# CONFIG_SND_ENS1370 is not set
|
||||
# CONFIG_SND_ENS1371 is not set
|
||||
# CONFIG_SND_ES1938 is not set
|
||||
# CONFIG_SND_ES1968 is not set
|
||||
# CONFIG_SND_FM801 is not set
|
||||
# CONFIG_SND_HDA_INTEL is not set
|
||||
# CONFIG_SND_HDSP is not set
|
||||
# CONFIG_SND_HDSPM is not set
|
||||
# CONFIG_SND_ICE1712 is not set
|
||||
# CONFIG_SND_ICE1724 is not set
|
||||
# CONFIG_SND_INTEL8X0 is not set
|
||||
# CONFIG_SND_KORG1212 is not set
|
||||
# CONFIG_SND_MAESTRO3 is not set
|
||||
# CONFIG_SND_MIXART is not set
|
||||
# CONFIG_SND_NM256 is not set
|
||||
# CONFIG_SND_PCXHR is not set
|
||||
# CONFIG_SND_RME32 is not set
|
||||
# CONFIG_SND_RME96 is not set
|
||||
# CONFIG_SND_RME9652 is not set
|
||||
# CONFIG_SND_SONICVIBES is not set
|
||||
# CONFIG_SND_TRIDENT is not set
|
||||
# CONFIG_SND_VIA82XX is not set
|
||||
# CONFIG_SND_VIA82XX_MODEM is not set
|
||||
# CONFIG_SND_VX222 is not set
|
||||
# CONFIG_SND_YMFPCI is not set
|
||||
|
||||
#
|
||||
# GSC devices
|
||||
#
|
||||
CONFIG_SND_HARMONY=y
|
||||
|
||||
#
|
||||
# Open Sound System
|
||||
#
|
||||
# CONFIG_SOUND_PRIME is not set
|
||||
|
||||
#
|
||||
# USB support
|
||||
|
@ -722,6 +823,10 @@ CONFIG_USB_ARCH_HAS_HCD=y
|
|||
CONFIG_USB_ARCH_HAS_OHCI=y
|
||||
# CONFIG_USB is not set
|
||||
|
||||
#
|
||||
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
|
||||
#
|
||||
|
||||
#
|
||||
# USB Gadget Support
|
||||
#
|
||||
|
@ -877,18 +982,23 @@ CONFIG_NLS_DEFAULT="iso8859-1"
|
|||
# Kernel hacking
|
||||
#
|
||||
# CONFIG_PRINTK_TIME is not set
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_LOG_BUF_SHIFT=16
|
||||
CONFIG_DETECT_SOFTLOCKUP=y
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
# CONFIG_DEBUG_MUTEXES is not set
|
||||
# CONFIG_DEBUG_SPINLOCK is not set
|
||||
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
|
||||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
# CONFIG_DEBUG_INFO is not set
|
||||
# CONFIG_DEBUG_IOREMAP is not set
|
||||
# CONFIG_DEBUG_FS is not set
|
||||
# CONFIG_DEBUG_VM is not set
|
||||
CONFIG_FORCED_INLINING=y
|
||||
# CONFIG_RCU_TORTURE_TEST is not set
|
||||
# CONFIG_DEBUG_RODATA is not set
|
||||
|
||||
#
|
||||
# Security options
|
||||
|
|
|
@ -22,10 +22,9 @@
|
|||
#include <linux/linkage.h>
|
||||
#include <asm/unistd.h>
|
||||
|
||||
.text
|
||||
|
||||
#define ENTRY_NAME(_name_) .word _name_
|
||||
|
||||
.section .rodata,"a"
|
||||
.align 4
|
||||
.export hpux_call_table
|
||||
.import hpux_unimplemented_wrapper
|
||||
|
|
|
@ -408,11 +408,10 @@ static void setup_bus_id(struct parisc_device *padev)
|
|||
|
||||
struct parisc_device * create_tree_node(char id, struct device *parent)
|
||||
{
|
||||
struct parisc_device *dev = kmalloc(sizeof(*dev), GFP_KERNEL);
|
||||
struct parisc_device *dev = kzalloc(sizeof(*dev), GFP_KERNEL);
|
||||
if (!dev)
|
||||
return NULL;
|
||||
|
||||
memset(dev, 0, sizeof(*dev));
|
||||
dev->hw_path = id;
|
||||
dev->id.hw_type = HPHW_FAULTY;
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue