mirror of
https://gitee.com/openharmony/kernel_linux
synced 2025-04-15 05:43:05 +00:00
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
This commit is contained in:
commit
33edcf133b
@ -6,7 +6,7 @@
|
|||||||
# To add a new book the only step required is to add the book to the
|
# To add a new book the only step required is to add the book to the
|
||||||
# list of DOCBOOKS.
|
# list of DOCBOOKS.
|
||||||
|
|
||||||
DOCBOOKS := wanbook.xml z8530book.xml mcabook.xml \
|
DOCBOOKS := z8530book.xml mcabook.xml \
|
||||||
kernel-hacking.xml kernel-locking.xml deviceiobook.xml \
|
kernel-hacking.xml kernel-locking.xml deviceiobook.xml \
|
||||||
procfs-guide.xml writing_usb_driver.xml networking.xml \
|
procfs-guide.xml writing_usb_driver.xml networking.xml \
|
||||||
kernel-api.xml filesystems.xml lsm.xml usb.xml kgdb.xml \
|
kernel-api.xml filesystems.xml lsm.xml usb.xml kgdb.xml \
|
||||||
|
@ -98,9 +98,6 @@
|
|||||||
X!Enet/core/wireless.c
|
X!Enet/core/wireless.c
|
||||||
</sect1>
|
</sect1>
|
||||||
-->
|
-->
|
||||||
<sect1><title>Synchronous PPP</title>
|
|
||||||
!Edrivers/net/wan/syncppp.c
|
|
||||||
</sect1>
|
|
||||||
</chapter>
|
</chapter>
|
||||||
|
|
||||||
</book>
|
</book>
|
||||||
|
@ -1,99 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
|
|
||||||
"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" []>
|
|
||||||
|
|
||||||
<book id="WANGuide">
|
|
||||||
<bookinfo>
|
|
||||||
<title>Synchronous PPP and Cisco HDLC Programming Guide</title>
|
|
||||||
|
|
||||||
<authorgroup>
|
|
||||||
<author>
|
|
||||||
<firstname>Alan</firstname>
|
|
||||||
<surname>Cox</surname>
|
|
||||||
<affiliation>
|
|
||||||
<address>
|
|
||||||
<email>alan@lxorguk.ukuu.org.uk</email>
|
|
||||||
</address>
|
|
||||||
</affiliation>
|
|
||||||
</author>
|
|
||||||
</authorgroup>
|
|
||||||
|
|
||||||
<copyright>
|
|
||||||
<year>2000</year>
|
|
||||||
<holder>Alan Cox</holder>
|
|
||||||
</copyright>
|
|
||||||
|
|
||||||
<legalnotice>
|
|
||||||
<para>
|
|
||||||
This documentation is free software; you can redistribute
|
|
||||||
it and/or modify it under the terms of the GNU General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2 of the License, or (at your option) any later
|
|
||||||
version.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
This program is distributed in the hope that it will be
|
|
||||||
useful, but WITHOUT ANY WARRANTY; without even the implied
|
|
||||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
See the GNU General Public License for more details.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
You should have received a copy of the GNU General Public
|
|
||||||
License along with this program; if not, write to the Free
|
|
||||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
|
||||||
MA 02111-1307 USA
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
For more details see the file COPYING in the source
|
|
||||||
distribution of Linux.
|
|
||||||
</para>
|
|
||||||
</legalnotice>
|
|
||||||
</bookinfo>
|
|
||||||
|
|
||||||
<toc></toc>
|
|
||||||
|
|
||||||
<chapter id="intro">
|
|
||||||
<title>Introduction</title>
|
|
||||||
<para>
|
|
||||||
The syncppp drivers in Linux provide a fairly complete
|
|
||||||
implementation of Cisco HDLC and a minimal implementation of
|
|
||||||
PPP. The longer term goal is to switch the PPP layer to the
|
|
||||||
generic PPP interface that is new in Linux 2.3.x. The API should
|
|
||||||
remain unchanged when this is done, but support will then be
|
|
||||||
available for IPX, compression and other PPP features
|
|
||||||
</para>
|
|
||||||
</chapter>
|
|
||||||
<chapter id="bugs">
|
|
||||||
<title>Known Bugs And Assumptions</title>
|
|
||||||
<para>
|
|
||||||
<variablelist>
|
|
||||||
<varlistentry><term>PPP is minimal</term>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
The current PPP implementation is very basic, although sufficient
|
|
||||||
for most wan usages.
|
|
||||||
</para>
|
|
||||||
</listitem></varlistentry>
|
|
||||||
|
|
||||||
<varlistentry><term>Cisco HDLC Quirks</term>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Currently we do not end all packets with the correct Cisco multicast
|
|
||||||
or unicast flags. Nothing appears to mind too much but this should
|
|
||||||
be corrected.
|
|
||||||
</para>
|
|
||||||
</listitem></varlistentry>
|
|
||||||
</variablelist>
|
|
||||||
|
|
||||||
</para>
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
<chapter id="pubfunctions">
|
|
||||||
<title>Public Functions Provided</title>
|
|
||||||
!Edrivers/net/wan/syncppp.c
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
</book>
|
|
167
Documentation/RCU/rculist_nulls.txt
Normal file
167
Documentation/RCU/rculist_nulls.txt
Normal file
@ -0,0 +1,167 @@
|
|||||||
|
Using hlist_nulls to protect read-mostly linked lists and
|
||||||
|
objects using SLAB_DESTROY_BY_RCU allocations.
|
||||||
|
|
||||||
|
Please read the basics in Documentation/RCU/listRCU.txt
|
||||||
|
|
||||||
|
Using special makers (called 'nulls') is a convenient way
|
||||||
|
to solve following problem :
|
||||||
|
|
||||||
|
A typical RCU linked list managing objects which are
|
||||||
|
allocated with SLAB_DESTROY_BY_RCU kmem_cache can
|
||||||
|
use following algos :
|
||||||
|
|
||||||
|
1) Lookup algo
|
||||||
|
--------------
|
||||||
|
rcu_read_lock()
|
||||||
|
begin:
|
||||||
|
obj = lockless_lookup(key);
|
||||||
|
if (obj) {
|
||||||
|
if (!try_get_ref(obj)) // might fail for free objects
|
||||||
|
goto begin;
|
||||||
|
/*
|
||||||
|
* Because a writer could delete object, and a writer could
|
||||||
|
* reuse these object before the RCU grace period, we
|
||||||
|
* must check key after geting the reference on object
|
||||||
|
*/
|
||||||
|
if (obj->key != key) { // not the object we expected
|
||||||
|
put_ref(obj);
|
||||||
|
goto begin;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rcu_read_unlock();
|
||||||
|
|
||||||
|
Beware that lockless_lookup(key) cannot use traditional hlist_for_each_entry_rcu()
|
||||||
|
but a version with an additional memory barrier (smp_rmb())
|
||||||
|
|
||||||
|
lockless_lookup(key)
|
||||||
|
{
|
||||||
|
struct hlist_node *node, *next;
|
||||||
|
for (pos = rcu_dereference((head)->first);
|
||||||
|
pos && ({ next = pos->next; smp_rmb(); prefetch(next); 1; }) &&
|
||||||
|
({ tpos = hlist_entry(pos, typeof(*tpos), member); 1; });
|
||||||
|
pos = rcu_dereference(next))
|
||||||
|
if (obj->key == key)
|
||||||
|
return obj;
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
And note the traditional hlist_for_each_entry_rcu() misses this smp_rmb() :
|
||||||
|
|
||||||
|
struct hlist_node *node;
|
||||||
|
for (pos = rcu_dereference((head)->first);
|
||||||
|
pos && ({ prefetch(pos->next); 1; }) &&
|
||||||
|
({ tpos = hlist_entry(pos, typeof(*tpos), member); 1; });
|
||||||
|
pos = rcu_dereference(pos->next))
|
||||||
|
if (obj->key == key)
|
||||||
|
return obj;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
Quoting Corey Minyard :
|
||||||
|
|
||||||
|
"If the object is moved from one list to another list in-between the
|
||||||
|
time the hash is calculated and the next field is accessed, and the
|
||||||
|
object has moved to the end of a new list, the traversal will not
|
||||||
|
complete properly on the list it should have, since the object will
|
||||||
|
be on the end of the new list and there's not a way to tell it's on a
|
||||||
|
new list and restart the list traversal. I think that this can be
|
||||||
|
solved by pre-fetching the "next" field (with proper barriers) before
|
||||||
|
checking the key."
|
||||||
|
|
||||||
|
2) Insert algo :
|
||||||
|
----------------
|
||||||
|
|
||||||
|
We need to make sure a reader cannot read the new 'obj->obj_next' value
|
||||||
|
and previous value of 'obj->key'. Or else, an item could be deleted
|
||||||
|
from a chain, and inserted into another chain. If new chain was empty
|
||||||
|
before the move, 'next' pointer is NULL, and lockless reader can
|
||||||
|
not detect it missed following items in original chain.
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Please note that new inserts are done at the head of list,
|
||||||
|
* not in the middle or end.
|
||||||
|
*/
|
||||||
|
obj = kmem_cache_alloc(...);
|
||||||
|
lock_chain(); // typically a spin_lock()
|
||||||
|
obj->key = key;
|
||||||
|
atomic_inc(&obj->refcnt);
|
||||||
|
/*
|
||||||
|
* we need to make sure obj->key is updated before obj->next
|
||||||
|
*/
|
||||||
|
smp_wmb();
|
||||||
|
hlist_add_head_rcu(&obj->obj_node, list);
|
||||||
|
unlock_chain(); // typically a spin_unlock()
|
||||||
|
|
||||||
|
|
||||||
|
3) Remove algo
|
||||||
|
--------------
|
||||||
|
Nothing special here, we can use a standard RCU hlist deletion.
|
||||||
|
But thanks to SLAB_DESTROY_BY_RCU, beware a deleted object can be reused
|
||||||
|
very very fast (before the end of RCU grace period)
|
||||||
|
|
||||||
|
if (put_last_reference_on(obj) {
|
||||||
|
lock_chain(); // typically a spin_lock()
|
||||||
|
hlist_del_init_rcu(&obj->obj_node);
|
||||||
|
unlock_chain(); // typically a spin_unlock()
|
||||||
|
kmem_cache_free(cachep, obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------
|
||||||
|
With hlist_nulls we can avoid extra smp_rmb() in lockless_lookup()
|
||||||
|
and extra smp_wmb() in insert function.
|
||||||
|
|
||||||
|
For example, if we choose to store the slot number as the 'nulls'
|
||||||
|
end-of-list marker for each slot of the hash table, we can detect
|
||||||
|
a race (some writer did a delete and/or a move of an object
|
||||||
|
to another chain) checking the final 'nulls' value if
|
||||||
|
the lookup met the end of chain. If final 'nulls' value
|
||||||
|
is not the slot number, then we must restart the lookup at
|
||||||
|
the begining. If the object was moved to same chain,
|
||||||
|
then the reader doesnt care : It might eventually
|
||||||
|
scan the list again without harm.
|
||||||
|
|
||||||
|
|
||||||
|
1) lookup algo
|
||||||
|
|
||||||
|
head = &table[slot];
|
||||||
|
rcu_read_lock();
|
||||||
|
begin:
|
||||||
|
hlist_nulls_for_each_entry_rcu(obj, node, head, member) {
|
||||||
|
if (obj->key == key) {
|
||||||
|
if (!try_get_ref(obj)) // might fail for free objects
|
||||||
|
goto begin;
|
||||||
|
if (obj->key != key) { // not the object we expected
|
||||||
|
put_ref(obj);
|
||||||
|
goto begin;
|
||||||
|
}
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* if the nulls value we got at the end of this lookup is
|
||||||
|
* not the expected one, we must restart lookup.
|
||||||
|
* We probably met an item that was moved to another chain.
|
||||||
|
*/
|
||||||
|
if (get_nulls_value(node) != slot)
|
||||||
|
goto begin;
|
||||||
|
obj = NULL;
|
||||||
|
|
||||||
|
out:
|
||||||
|
rcu_read_unlock();
|
||||||
|
|
||||||
|
2) Insert function :
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Please note that new inserts are done at the head of list,
|
||||||
|
* not in the middle or end.
|
||||||
|
*/
|
||||||
|
obj = kmem_cache_alloc(cachep);
|
||||||
|
lock_chain(); // typically a spin_lock()
|
||||||
|
obj->key = key;
|
||||||
|
atomic_set(&obj->refcnt, 1);
|
||||||
|
/*
|
||||||
|
* insert obj in RCU way (readers might be traversing chain)
|
||||||
|
*/
|
||||||
|
hlist_nulls_add_head_rcu(&obj->obj_node, list);
|
||||||
|
unlock_chain(); // typically a spin_unlock()
|
@ -24,7 +24,7 @@ real bad - it changes the behaviour of all unaligned instructions in user
|
|||||||
space, and might cause programs to fail unexpectedly.
|
space, and might cause programs to fail unexpectedly.
|
||||||
|
|
||||||
To change the alignment trap behavior, simply echo a number into
|
To change the alignment trap behavior, simply echo a number into
|
||||||
/proc/sys/debug/alignment. The number is made up from various bits:
|
/proc/cpu/alignment. The number is made up from various bits:
|
||||||
|
|
||||||
bit behavior when set
|
bit behavior when set
|
||||||
--- -----------------
|
--- -----------------
|
||||||
|
32
Documentation/controllers/cpuacct.txt
Normal file
32
Documentation/controllers/cpuacct.txt
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
CPU Accounting Controller
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
The CPU accounting controller is used to group tasks using cgroups and
|
||||||
|
account the CPU usage of these groups of tasks.
|
||||||
|
|
||||||
|
The CPU accounting controller supports multi-hierarchy groups. An accounting
|
||||||
|
group accumulates the CPU usage of all of its child groups and the tasks
|
||||||
|
directly present in its group.
|
||||||
|
|
||||||
|
Accounting groups can be created by first mounting the cgroup filesystem.
|
||||||
|
|
||||||
|
# mkdir /cgroups
|
||||||
|
# mount -t cgroup -ocpuacct none /cgroups
|
||||||
|
|
||||||
|
With the above step, the initial or the parent accounting group
|
||||||
|
becomes visible at /cgroups. At bootup, this group includes all the
|
||||||
|
tasks in the system. /cgroups/tasks lists the tasks in this cgroup.
|
||||||
|
/cgroups/cpuacct.usage gives the CPU time (in nanoseconds) obtained by
|
||||||
|
this group which is essentially the CPU time obtained by all the tasks
|
||||||
|
in the system.
|
||||||
|
|
||||||
|
New accounting groups can be created under the parent group /cgroups.
|
||||||
|
|
||||||
|
# cd /cgroups
|
||||||
|
# mkdir g1
|
||||||
|
# echo $$ > g1
|
||||||
|
|
||||||
|
The above steps create a new group g1 and move the current shell
|
||||||
|
process (bash) into it. CPU time consumed by this bash and its children
|
||||||
|
can be obtained from g1/cpuacct.usage and the same is accumulated in
|
||||||
|
/cgroups/cpuacct.usage also.
|
@ -93,10 +93,8 @@ Several "PowerBook" and "iBook2" notebooks are supported.
|
|||||||
1.5 SuperH
|
1.5 SuperH
|
||||||
----------
|
----------
|
||||||
|
|
||||||
The following SuperH processors are supported by cpufreq:
|
All SuperH processors supporting rate rounding through the clock
|
||||||
|
framework are supported by cpufreq.
|
||||||
SH-3
|
|
||||||
SH-4
|
|
||||||
|
|
||||||
1.6 Blackfin
|
1.6 Blackfin
|
||||||
------------
|
------------
|
||||||
|
582
Documentation/credentials.txt
Normal file
582
Documentation/credentials.txt
Normal file
@ -0,0 +1,582 @@
|
|||||||
|
====================
|
||||||
|
CREDENTIALS IN LINUX
|
||||||
|
====================
|
||||||
|
|
||||||
|
By: David Howells <dhowells@redhat.com>
|
||||||
|
|
||||||
|
Contents:
|
||||||
|
|
||||||
|
(*) Overview.
|
||||||
|
|
||||||
|
(*) Types of credentials.
|
||||||
|
|
||||||
|
(*) File markings.
|
||||||
|
|
||||||
|
(*) Task credentials.
|
||||||
|
|
||||||
|
- Immutable credentials.
|
||||||
|
- Accessing task credentials.
|
||||||
|
- Accessing another task's credentials.
|
||||||
|
- Altering credentials.
|
||||||
|
- Managing credentials.
|
||||||
|
|
||||||
|
(*) Open file credentials.
|
||||||
|
|
||||||
|
(*) Overriding the VFS's use of credentials.
|
||||||
|
|
||||||
|
|
||||||
|
========
|
||||||
|
OVERVIEW
|
||||||
|
========
|
||||||
|
|
||||||
|
There are several parts to the security check performed by Linux when one
|
||||||
|
object acts upon another:
|
||||||
|
|
||||||
|
(1) Objects.
|
||||||
|
|
||||||
|
Objects are things in the system that may be acted upon directly by
|
||||||
|
userspace programs. Linux has a variety of actionable objects, including:
|
||||||
|
|
||||||
|
- Tasks
|
||||||
|
- Files/inodes
|
||||||
|
- Sockets
|
||||||
|
- Message queues
|
||||||
|
- Shared memory segments
|
||||||
|
- Semaphores
|
||||||
|
- Keys
|
||||||
|
|
||||||
|
As a part of the description of all these objects there is a set of
|
||||||
|
credentials. What's in the set depends on the type of object.
|
||||||
|
|
||||||
|
(2) Object ownership.
|
||||||
|
|
||||||
|
Amongst the credentials of most objects, there will be a subset that
|
||||||
|
indicates the ownership of that object. This is used for resource
|
||||||
|
accounting and limitation (disk quotas and task rlimits for example).
|
||||||
|
|
||||||
|
In a standard UNIX filesystem, for instance, this will be defined by the
|
||||||
|
UID marked on the inode.
|
||||||
|
|
||||||
|
(3) The objective context.
|
||||||
|
|
||||||
|
Also amongst the credentials of those objects, there will be a subset that
|
||||||
|
indicates the 'objective context' of that object. This may or may not be
|
||||||
|
the same set as in (2) - in standard UNIX files, for instance, this is the
|
||||||
|
defined by the UID and the GID marked on the inode.
|
||||||
|
|
||||||
|
The objective context is used as part of the security calculation that is
|
||||||
|
carried out when an object is acted upon.
|
||||||
|
|
||||||
|
(4) Subjects.
|
||||||
|
|
||||||
|
A subject is an object that is acting upon another object.
|
||||||
|
|
||||||
|
Most of the objects in the system are inactive: they don't act on other
|
||||||
|
objects within the system. Processes/tasks are the obvious exception:
|
||||||
|
they do stuff; they access and manipulate things.
|
||||||
|
|
||||||
|
Objects other than tasks may under some circumstances also be subjects.
|
||||||
|
For instance an open file may send SIGIO to a task using the UID and EUID
|
||||||
|
given to it by a task that called fcntl(F_SETOWN) upon it. In this case,
|
||||||
|
the file struct will have a subjective context too.
|
||||||
|
|
||||||
|
(5) The subjective context.
|
||||||
|
|
||||||
|
A subject has an additional interpretation of its credentials. A subset
|
||||||
|
of its credentials forms the 'subjective context'. The subjective context
|
||||||
|
is used as part of the security calculation that is carried out when a
|
||||||
|
subject acts.
|
||||||
|
|
||||||
|
A Linux task, for example, has the FSUID, FSGID and the supplementary
|
||||||
|
group list for when it is acting upon a file - which are quite separate
|
||||||
|
from the real UID and GID that normally form the objective context of the
|
||||||
|
task.
|
||||||
|
|
||||||
|
(6) Actions.
|
||||||
|
|
||||||
|
Linux has a number of actions available that a subject may perform upon an
|
||||||
|
object. The set of actions available depends on the nature of the subject
|
||||||
|
and the object.
|
||||||
|
|
||||||
|
Actions include reading, writing, creating and deleting files; forking or
|
||||||
|
signalling and tracing tasks.
|
||||||
|
|
||||||
|
(7) Rules, access control lists and security calculations.
|
||||||
|
|
||||||
|
When a subject acts upon an object, a security calculation is made. This
|
||||||
|
involves taking the subjective context, the objective context and the
|
||||||
|
action, and searching one or more sets of rules to see whether the subject
|
||||||
|
is granted or denied permission to act in the desired manner on the
|
||||||
|
object, given those contexts.
|
||||||
|
|
||||||
|
There are two main sources of rules:
|
||||||
|
|
||||||
|
(a) Discretionary access control (DAC):
|
||||||
|
|
||||||
|
Sometimes the object will include sets of rules as part of its
|
||||||
|
description. This is an 'Access Control List' or 'ACL'. A Linux
|
||||||
|
file may supply more than one ACL.
|
||||||
|
|
||||||
|
A traditional UNIX file, for example, includes a permissions mask that
|
||||||
|
is an abbreviated ACL with three fixed classes of subject ('user',
|
||||||
|
'group' and 'other'), each of which may be granted certain privileges
|
||||||
|
('read', 'write' and 'execute' - whatever those map to for the object
|
||||||
|
in question). UNIX file permissions do not allow the arbitrary
|
||||||
|
specification of subjects, however, and so are of limited use.
|
||||||
|
|
||||||
|
A Linux file might also sport a POSIX ACL. This is a list of rules
|
||||||
|
that grants various permissions to arbitrary subjects.
|
||||||
|
|
||||||
|
(b) Mandatory access control (MAC):
|
||||||
|
|
||||||
|
The system as a whole may have one or more sets of rules that get
|
||||||
|
applied to all subjects and objects, regardless of their source.
|
||||||
|
SELinux and Smack are examples of this.
|
||||||
|
|
||||||
|
In the case of SELinux and Smack, each object is given a label as part
|
||||||
|
of its credentials. When an action is requested, they take the
|
||||||
|
subject label, the object label and the action and look for a rule
|
||||||
|
that says that this action is either granted or denied.
|
||||||
|
|
||||||
|
|
||||||
|
====================
|
||||||
|
TYPES OF CREDENTIALS
|
||||||
|
====================
|
||||||
|
|
||||||
|
The Linux kernel supports the following types of credentials:
|
||||||
|
|
||||||
|
(1) Traditional UNIX credentials.
|
||||||
|
|
||||||
|
Real User ID
|
||||||
|
Real Group ID
|
||||||
|
|
||||||
|
The UID and GID are carried by most, if not all, Linux objects, even if in
|
||||||
|
some cases it has to be invented (FAT or CIFS files for example, which are
|
||||||
|
derived from Windows). These (mostly) define the objective context of
|
||||||
|
that object, with tasks being slightly different in some cases.
|
||||||
|
|
||||||
|
Effective, Saved and FS User ID
|
||||||
|
Effective, Saved and FS Group ID
|
||||||
|
Supplementary groups
|
||||||
|
|
||||||
|
These are additional credentials used by tasks only. Usually, an
|
||||||
|
EUID/EGID/GROUPS will be used as the subjective context, and real UID/GID
|
||||||
|
will be used as the objective. For tasks, it should be noted that this is
|
||||||
|
not always true.
|
||||||
|
|
||||||
|
(2) Capabilities.
|
||||||
|
|
||||||
|
Set of permitted capabilities
|
||||||
|
Set of inheritable capabilities
|
||||||
|
Set of effective capabilities
|
||||||
|
Capability bounding set
|
||||||
|
|
||||||
|
These are only carried by tasks. They indicate superior capabilities
|
||||||
|
granted piecemeal to a task that an ordinary task wouldn't otherwise have.
|
||||||
|
These are manipulated implicitly by changes to the traditional UNIX
|
||||||
|
credentials, but can also be manipulated directly by the capset() system
|
||||||
|
call.
|
||||||
|
|
||||||
|
The permitted capabilities are those caps that the process might grant
|
||||||
|
itself to its effective or permitted sets through capset(). This
|
||||||
|
inheritable set might also be so constrained.
|
||||||
|
|
||||||
|
The effective capabilities are the ones that a task is actually allowed to
|
||||||
|
make use of itself.
|
||||||
|
|
||||||
|
The inheritable capabilities are the ones that may get passed across
|
||||||
|
execve().
|
||||||
|
|
||||||
|
The bounding set limits the capabilities that may be inherited across
|
||||||
|
execve(), especially when a binary is executed that will execute as UID 0.
|
||||||
|
|
||||||
|
(3) Secure management flags (securebits).
|
||||||
|
|
||||||
|
These are only carried by tasks. These govern the way the above
|
||||||
|
credentials are manipulated and inherited over certain operations such as
|
||||||
|
execve(). They aren't used directly as objective or subjective
|
||||||
|
credentials.
|
||||||
|
|
||||||
|
(4) Keys and keyrings.
|
||||||
|
|
||||||
|
These are only carried by tasks. They carry and cache security tokens
|
||||||
|
that don't fit into the other standard UNIX credentials. They are for
|
||||||
|
making such things as network filesystem keys available to the file
|
||||||
|
accesses performed by processes, without the necessity of ordinary
|
||||||
|
programs having to know about security details involved.
|
||||||
|
|
||||||
|
Keyrings are a special type of key. They carry sets of other keys and can
|
||||||
|
be searched for the desired key. Each process may subscribe to a number
|
||||||
|
of keyrings:
|
||||||
|
|
||||||
|
Per-thread keying
|
||||||
|
Per-process keyring
|
||||||
|
Per-session keyring
|
||||||
|
|
||||||
|
When a process accesses a key, if not already present, it will normally be
|
||||||
|
cached on one of these keyrings for future accesses to find.
|
||||||
|
|
||||||
|
For more information on using keys, see Documentation/keys.txt.
|
||||||
|
|
||||||
|
(5) LSM
|
||||||
|
|
||||||
|
The Linux Security Module allows extra controls to be placed over the
|
||||||
|
operations that a task may do. Currently Linux supports two main
|
||||||
|
alternate LSM options: SELinux and Smack.
|
||||||
|
|
||||||
|
Both work by labelling the objects in a system and then applying sets of
|
||||||
|
rules (policies) that say what operations a task with one label may do to
|
||||||
|
an object with another label.
|
||||||
|
|
||||||
|
(6) AF_KEY
|
||||||
|
|
||||||
|
This is a socket-based approach to credential management for networking
|
||||||
|
stacks [RFC 2367]. It isn't discussed by this document as it doesn't
|
||||||
|
interact directly with task and file credentials; rather it keeps system
|
||||||
|
level credentials.
|
||||||
|
|
||||||
|
|
||||||
|
When a file is opened, part of the opening task's subjective context is
|
||||||
|
recorded in the file struct created. This allows operations using that file
|
||||||
|
struct to use those credentials instead of the subjective context of the task
|
||||||
|
that issued the operation. An example of this would be a file opened on a
|
||||||
|
network filesystem where the credentials of the opened file should be presented
|
||||||
|
to the server, regardless of who is actually doing a read or a write upon it.
|
||||||
|
|
||||||
|
|
||||||
|
=============
|
||||||
|
FILE MARKINGS
|
||||||
|
=============
|
||||||
|
|
||||||
|
Files on disk or obtained over the network may have annotations that form the
|
||||||
|
objective security context of that file. Depending on the type of filesystem,
|
||||||
|
this may include one or more of the following:
|
||||||
|
|
||||||
|
(*) UNIX UID, GID, mode;
|
||||||
|
|
||||||
|
(*) Windows user ID;
|
||||||
|
|
||||||
|
(*) Access control list;
|
||||||
|
|
||||||
|
(*) LSM security label;
|
||||||
|
|
||||||
|
(*) UNIX exec privilege escalation bits (SUID/SGID);
|
||||||
|
|
||||||
|
(*) File capabilities exec privilege escalation bits.
|
||||||
|
|
||||||
|
These are compared to the task's subjective security context, and certain
|
||||||
|
operations allowed or disallowed as a result. In the case of execve(), the
|
||||||
|
privilege escalation bits come into play, and may allow the resulting process
|
||||||
|
extra privileges, based on the annotations on the executable file.
|
||||||
|
|
||||||
|
|
||||||
|
================
|
||||||
|
TASK CREDENTIALS
|
||||||
|
================
|
||||||
|
|
||||||
|
In Linux, all of a task's credentials are held in (uid, gid) or through
|
||||||
|
(groups, keys, LSM security) a refcounted structure of type 'struct cred'.
|
||||||
|
Each task points to its credentials by a pointer called 'cred' in its
|
||||||
|
task_struct.
|
||||||
|
|
||||||
|
Once a set of credentials has been prepared and committed, it may not be
|
||||||
|
changed, barring the following exceptions:
|
||||||
|
|
||||||
|
(1) its reference count may be changed;
|
||||||
|
|
||||||
|
(2) the reference count on the group_info struct it points to may be changed;
|
||||||
|
|
||||||
|
(3) the reference count on the security data it points to may be changed;
|
||||||
|
|
||||||
|
(4) the reference count on any keyrings it points to may be changed;
|
||||||
|
|
||||||
|
(5) any keyrings it points to may be revoked, expired or have their security
|
||||||
|
attributes changed; and
|
||||||
|
|
||||||
|
(6) the contents of any keyrings to which it points may be changed (the whole
|
||||||
|
point of keyrings being a shared set of credentials, modifiable by anyone
|
||||||
|
with appropriate access).
|
||||||
|
|
||||||
|
To alter anything in the cred struct, the copy-and-replace principle must be
|
||||||
|
adhered to. First take a copy, then alter the copy and then use RCU to change
|
||||||
|
the task pointer to make it point to the new copy. There are wrappers to aid
|
||||||
|
with this (see below).
|
||||||
|
|
||||||
|
A task may only alter its _own_ credentials; it is no longer permitted for a
|
||||||
|
task to alter another's credentials. This means the capset() system call is no
|
||||||
|
longer permitted to take any PID other than the one of the current process.
|
||||||
|
Also keyctl_instantiate() and keyctl_negate() functions no longer permit
|
||||||
|
attachment to process-specific keyrings in the requesting process as the
|
||||||
|
instantiating process may need to create them.
|
||||||
|
|
||||||
|
|
||||||
|
IMMUTABLE CREDENTIALS
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
Once a set of credentials has been made public (by calling commit_creds() for
|
||||||
|
example), it must be considered immutable, barring two exceptions:
|
||||||
|
|
||||||
|
(1) The reference count may be altered.
|
||||||
|
|
||||||
|
(2) Whilst the keyring subscriptions of a set of credentials may not be
|
||||||
|
changed, the keyrings subscribed to may have their contents altered.
|
||||||
|
|
||||||
|
To catch accidental credential alteration at compile time, struct task_struct
|
||||||
|
has _const_ pointers to its credential sets, as does struct file. Furthermore,
|
||||||
|
certain functions such as get_cred() and put_cred() operate on const pointers,
|
||||||
|
thus rendering casts unnecessary, but require to temporarily ditch the const
|
||||||
|
qualification to be able to alter the reference count.
|
||||||
|
|
||||||
|
|
||||||
|
ACCESSING TASK CREDENTIALS
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
A task being able to alter only its own credentials permits the current process
|
||||||
|
to read or replace its own credentials without the need for any form of locking
|
||||||
|
- which simplifies things greatly. It can just call:
|
||||||
|
|
||||||
|
const struct cred *current_cred()
|
||||||
|
|
||||||
|
to get a pointer to its credentials structure, and it doesn't have to release
|
||||||
|
it afterwards.
|
||||||
|
|
||||||
|
There are convenience wrappers for retrieving specific aspects of a task's
|
||||||
|
credentials (the value is simply returned in each case):
|
||||||
|
|
||||||
|
uid_t current_uid(void) Current's real UID
|
||||||
|
gid_t current_gid(void) Current's real GID
|
||||||
|
uid_t current_euid(void) Current's effective UID
|
||||||
|
gid_t current_egid(void) Current's effective GID
|
||||||
|
uid_t current_fsuid(void) Current's file access UID
|
||||||
|
gid_t current_fsgid(void) Current's file access GID
|
||||||
|
kernel_cap_t current_cap(void) Current's effective capabilities
|
||||||
|
void *current_security(void) Current's LSM security pointer
|
||||||
|
struct user_struct *current_user(void) Current's user account
|
||||||
|
|
||||||
|
There are also convenience wrappers for retrieving specific associated pairs of
|
||||||
|
a task's credentials:
|
||||||
|
|
||||||
|
void current_uid_gid(uid_t *, gid_t *);
|
||||||
|
void current_euid_egid(uid_t *, gid_t *);
|
||||||
|
void current_fsuid_fsgid(uid_t *, gid_t *);
|
||||||
|
|
||||||
|
which return these pairs of values through their arguments after retrieving
|
||||||
|
them from the current task's credentials.
|
||||||
|
|
||||||
|
|
||||||
|
In addition, there is a function for obtaining a reference on the current
|
||||||
|
process's current set of credentials:
|
||||||
|
|
||||||
|
const struct cred *get_current_cred(void);
|
||||||
|
|
||||||
|
and functions for getting references to one of the credentials that don't
|
||||||
|
actually live in struct cred:
|
||||||
|
|
||||||
|
struct user_struct *get_current_user(void);
|
||||||
|
struct group_info *get_current_groups(void);
|
||||||
|
|
||||||
|
which get references to the current process's user accounting structure and
|
||||||
|
supplementary groups list respectively.
|
||||||
|
|
||||||
|
Once a reference has been obtained, it must be released with put_cred(),
|
||||||
|
free_uid() or put_group_info() as appropriate.
|
||||||
|
|
||||||
|
|
||||||
|
ACCESSING ANOTHER TASK'S CREDENTIALS
|
||||||
|
------------------------------------
|
||||||
|
|
||||||
|
Whilst a task may access its own credentials without the need for locking, the
|
||||||
|
same is not true of a task wanting to access another task's credentials. It
|
||||||
|
must use the RCU read lock and rcu_dereference().
|
||||||
|
|
||||||
|
The rcu_dereference() is wrapped by:
|
||||||
|
|
||||||
|
const struct cred *__task_cred(struct task_struct *task);
|
||||||
|
|
||||||
|
This should be used inside the RCU read lock, as in the following example:
|
||||||
|
|
||||||
|
void foo(struct task_struct *t, struct foo_data *f)
|
||||||
|
{
|
||||||
|
const struct cred *tcred;
|
||||||
|
...
|
||||||
|
rcu_read_lock();
|
||||||
|
tcred = __task_cred(t);
|
||||||
|
f->uid = tcred->uid;
|
||||||
|
f->gid = tcred->gid;
|
||||||
|
f->groups = get_group_info(tcred->groups);
|
||||||
|
rcu_read_unlock();
|
||||||
|
...
|
||||||
|
}
|
||||||
|
|
||||||
|
A function need not get RCU read lock to use __task_cred() if it is holding a
|
||||||
|
spinlock at the time as this implicitly holds the RCU read lock.
|
||||||
|
|
||||||
|
Should it be necessary to hold another task's credentials for a long period of
|
||||||
|
time, and possibly to sleep whilst doing so, then the caller should get a
|
||||||
|
reference on them using:
|
||||||
|
|
||||||
|
const struct cred *get_task_cred(struct task_struct *task);
|
||||||
|
|
||||||
|
This does all the RCU magic inside of it. The caller must call put_cred() on
|
||||||
|
the credentials so obtained when they're finished with.
|
||||||
|
|
||||||
|
There are a couple of convenience functions to access bits of another task's
|
||||||
|
credentials, hiding the RCU magic from the caller:
|
||||||
|
|
||||||
|
uid_t task_uid(task) Task's real UID
|
||||||
|
uid_t task_euid(task) Task's effective UID
|
||||||
|
|
||||||
|
If the caller is holding a spinlock or the RCU read lock at the time anyway,
|
||||||
|
then:
|
||||||
|
|
||||||
|
__task_cred(task)->uid
|
||||||
|
__task_cred(task)->euid
|
||||||
|
|
||||||
|
should be used instead. Similarly, if multiple aspects of a task's credentials
|
||||||
|
need to be accessed, RCU read lock or a spinlock should be used, __task_cred()
|
||||||
|
called, the result stored in a temporary pointer and then the credential
|
||||||
|
aspects called from that before dropping the lock. This prevents the
|
||||||
|
potentially expensive RCU magic from being invoked multiple times.
|
||||||
|
|
||||||
|
Should some other single aspect of another task's credentials need to be
|
||||||
|
accessed, then this can be used:
|
||||||
|
|
||||||
|
task_cred_xxx(task, member)
|
||||||
|
|
||||||
|
where 'member' is a non-pointer member of the cred struct. For instance:
|
||||||
|
|
||||||
|
uid_t task_cred_xxx(task, suid);
|
||||||
|
|
||||||
|
will retrieve 'struct cred::suid' from the task, doing the appropriate RCU
|
||||||
|
magic. This may not be used for pointer members as what they point to may
|
||||||
|
disappear the moment the RCU read lock is dropped.
|
||||||
|
|
||||||
|
|
||||||
|
ALTERING CREDENTIALS
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
As previously mentioned, a task may only alter its own credentials, and may not
|
||||||
|
alter those of another task. This means that it doesn't need to use any
|
||||||
|
locking to alter its own credentials.
|
||||||
|
|
||||||
|
To alter the current process's credentials, a function should first prepare a
|
||||||
|
new set of credentials by calling:
|
||||||
|
|
||||||
|
struct cred *prepare_creds(void);
|
||||||
|
|
||||||
|
this locks current->cred_replace_mutex and then allocates and constructs a
|
||||||
|
duplicate of the current process's credentials, returning with the mutex still
|
||||||
|
held if successful. It returns NULL if not successful (out of memory).
|
||||||
|
|
||||||
|
The mutex prevents ptrace() from altering the ptrace state of a process whilst
|
||||||
|
security checks on credentials construction and changing is taking place as
|
||||||
|
the ptrace state may alter the outcome, particularly in the case of execve().
|
||||||
|
|
||||||
|
The new credentials set should be altered appropriately, and any security
|
||||||
|
checks and hooks done. Both the current and the proposed sets of credentials
|
||||||
|
are available for this purpose as current_cred() will return the current set
|
||||||
|
still at this point.
|
||||||
|
|
||||||
|
|
||||||
|
When the credential set is ready, it should be committed to the current process
|
||||||
|
by calling:
|
||||||
|
|
||||||
|
int commit_creds(struct cred *new);
|
||||||
|
|
||||||
|
This will alter various aspects of the credentials and the process, giving the
|
||||||
|
LSM a chance to do likewise, then it will use rcu_assign_pointer() to actually
|
||||||
|
commit the new credentials to current->cred, it will release
|
||||||
|
current->cred_replace_mutex to allow ptrace() to take place, and it will notify
|
||||||
|
the scheduler and others of the changes.
|
||||||
|
|
||||||
|
This function is guaranteed to return 0, so that it can be tail-called at the
|
||||||
|
end of such functions as sys_setresuid().
|
||||||
|
|
||||||
|
Note that this function consumes the caller's reference to the new credentials.
|
||||||
|
The caller should _not_ call put_cred() on the new credentials afterwards.
|
||||||
|
|
||||||
|
Furthermore, once this function has been called on a new set of credentials,
|
||||||
|
those credentials may _not_ be changed further.
|
||||||
|
|
||||||
|
|
||||||
|
Should the security checks fail or some other error occur after prepare_creds()
|
||||||
|
has been called, then the following function should be invoked:
|
||||||
|
|
||||||
|
void abort_creds(struct cred *new);
|
||||||
|
|
||||||
|
This releases the lock on current->cred_replace_mutex that prepare_creds() got
|
||||||
|
and then releases the new credentials.
|
||||||
|
|
||||||
|
|
||||||
|
A typical credentials alteration function would look something like this:
|
||||||
|
|
||||||
|
int alter_suid(uid_t suid)
|
||||||
|
{
|
||||||
|
struct cred *new;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
new = prepare_creds();
|
||||||
|
if (!new)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
new->suid = suid;
|
||||||
|
ret = security_alter_suid(new);
|
||||||
|
if (ret < 0) {
|
||||||
|
abort_creds(new);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
return commit_creds(new);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MANAGING CREDENTIALS
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
There are some functions to help manage credentials:
|
||||||
|
|
||||||
|
(*) void put_cred(const struct cred *cred);
|
||||||
|
|
||||||
|
This releases a reference to the given set of credentials. If the
|
||||||
|
reference count reaches zero, the credentials will be scheduled for
|
||||||
|
destruction by the RCU system.
|
||||||
|
|
||||||
|
(*) const struct cred *get_cred(const struct cred *cred);
|
||||||
|
|
||||||
|
This gets a reference on a live set of credentials, returning a pointer to
|
||||||
|
that set of credentials.
|
||||||
|
|
||||||
|
(*) struct cred *get_new_cred(struct cred *cred);
|
||||||
|
|
||||||
|
This gets a reference on a set of credentials that is under construction
|
||||||
|
and is thus still mutable, returning a pointer to that set of credentials.
|
||||||
|
|
||||||
|
|
||||||
|
=====================
|
||||||
|
OPEN FILE CREDENTIALS
|
||||||
|
=====================
|
||||||
|
|
||||||
|
When a new file is opened, a reference is obtained on the opening task's
|
||||||
|
credentials and this is attached to the file struct as 'f_cred' in place of
|
||||||
|
'f_uid' and 'f_gid'. Code that used to access file->f_uid and file->f_gid
|
||||||
|
should now access file->f_cred->fsuid and file->f_cred->fsgid.
|
||||||
|
|
||||||
|
It is safe to access f_cred without the use of RCU or locking because the
|
||||||
|
pointer will not change over the lifetime of the file struct, and nor will the
|
||||||
|
contents of the cred struct pointed to, barring the exceptions listed above
|
||||||
|
(see the Task Credentials section).
|
||||||
|
|
||||||
|
|
||||||
|
=======================================
|
||||||
|
OVERRIDING THE VFS'S USE OF CREDENTIALS
|
||||||
|
=======================================
|
||||||
|
|
||||||
|
Under some circumstances it is desirable to override the credentials used by
|
||||||
|
the VFS, and that can be done by calling into such as vfs_mkdir() with a
|
||||||
|
different set of credentials. This is done in the following places:
|
||||||
|
|
||||||
|
(*) sys_faccessat().
|
||||||
|
|
||||||
|
(*) do_coredump().
|
||||||
|
|
||||||
|
(*) nfs4recover.c.
|
@ -120,13 +120,6 @@ Who: Christoph Hellwig <hch@lst.de>
|
|||||||
|
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
||||||
What: eepro100 network driver
|
|
||||||
When: January 2007
|
|
||||||
Why: replaced by the e100 driver
|
|
||||||
Who: Adrian Bunk <bunk@stusta.de>
|
|
||||||
|
|
||||||
---------------------------
|
|
||||||
|
|
||||||
What: Unused EXPORT_SYMBOL/EXPORT_SYMBOL_GPL exports
|
What: Unused EXPORT_SYMBOL/EXPORT_SYMBOL_GPL exports
|
||||||
(temporary transition config option provided until then)
|
(temporary transition config option provided until then)
|
||||||
The transition config option will also be removed at the same time.
|
The transition config option will also be removed at the same time.
|
||||||
@ -244,18 +237,6 @@ Who: Michael Buesch <mb@bu3sch.de>
|
|||||||
|
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
||||||
What: init_mm export
|
|
||||||
When: 2.6.26
|
|
||||||
Why: Not used in-tree. The current out-of-tree users used it to
|
|
||||||
work around problems in the CPA code which should be resolved
|
|
||||||
by now. One usecase was described to provide verification code
|
|
||||||
of the CPA operation. That's a good idea in general, but such
|
|
||||||
code / infrastructure should be in the kernel and not in some
|
|
||||||
out-of-tree driver.
|
|
||||||
Who: Thomas Gleixner <tglx@linutronix.de>
|
|
||||||
|
|
||||||
----------------------------
|
|
||||||
|
|
||||||
What: usedac i386 kernel parameter
|
What: usedac i386 kernel parameter
|
||||||
When: 2.6.27
|
When: 2.6.27
|
||||||
Why: replaced by allowdac and no dac combination
|
Why: replaced by allowdac and no dac combination
|
||||||
|
@ -1339,10 +1339,13 @@ nmi_watchdog
|
|||||||
|
|
||||||
Enables/Disables the NMI watchdog on x86 systems. When the value is non-zero
|
Enables/Disables the NMI watchdog on x86 systems. When the value is non-zero
|
||||||
the NMI watchdog is enabled and will continuously test all online cpus to
|
the NMI watchdog is enabled and will continuously test all online cpus to
|
||||||
determine whether or not they are still functioning properly.
|
determine whether or not they are still functioning properly. Currently,
|
||||||
|
passing "nmi_watchdog=" parameter at boot time is required for this function
|
||||||
|
to work.
|
||||||
|
|
||||||
Because the NMI watchdog shares registers with oprofile, by disabling the NMI
|
If LAPIC NMI watchdog method is in use (nmi_watchdog=2 kernel parameter), the
|
||||||
watchdog, oprofile may have more registers to utilize.
|
NMI watchdog shares registers with oprofile. By disabling the NMI watchdog,
|
||||||
|
oprofile may have more registers to utilize.
|
||||||
|
|
||||||
msgmni
|
msgmni
|
||||||
------
|
------
|
||||||
|
@ -82,7 +82,7 @@ of ftrace. Here is a list of some of the key files:
|
|||||||
tracer is not adding more data, they will display
|
tracer is not adding more data, they will display
|
||||||
the same information every time they are read.
|
the same information every time they are read.
|
||||||
|
|
||||||
iter_ctrl: This file lets the user control the amount of data
|
trace_options: This file lets the user control the amount of data
|
||||||
that is displayed in one of the above output
|
that is displayed in one of the above output
|
||||||
files.
|
files.
|
||||||
|
|
||||||
@ -94,10 +94,10 @@ of ftrace. Here is a list of some of the key files:
|
|||||||
only be recorded if the latency is greater than
|
only be recorded if the latency is greater than
|
||||||
the value in this file. (in microseconds)
|
the value in this file. (in microseconds)
|
||||||
|
|
||||||
trace_entries: This sets or displays the number of bytes each CPU
|
buffer_size_kb: This sets or displays the number of kilobytes each CPU
|
||||||
buffer can hold. The tracer buffers are the same size
|
buffer can hold. The tracer buffers are the same size
|
||||||
for each CPU. The displayed number is the size of the
|
for each CPU. The displayed number is the size of the
|
||||||
CPU buffer and not total size of all buffers. The
|
CPU buffer and not total size of all buffers. The
|
||||||
trace buffers are allocated in pages (blocks of memory
|
trace buffers are allocated in pages (blocks of memory
|
||||||
that the kernel uses for allocation, usually 4 KB in size).
|
that the kernel uses for allocation, usually 4 KB in size).
|
||||||
If the last page allocated has room for more bytes
|
If the last page allocated has room for more bytes
|
||||||
@ -127,6 +127,8 @@ of ftrace. Here is a list of some of the key files:
|
|||||||
be traced. If a function exists in both set_ftrace_filter
|
be traced. If a function exists in both set_ftrace_filter
|
||||||
and set_ftrace_notrace, the function will _not_ be traced.
|
and set_ftrace_notrace, the function will _not_ be traced.
|
||||||
|
|
||||||
|
set_ftrace_pid: Have the function tracer only trace a single thread.
|
||||||
|
|
||||||
available_filter_functions: This lists the functions that ftrace
|
available_filter_functions: This lists the functions that ftrace
|
||||||
has processed and can trace. These are the function
|
has processed and can trace. These are the function
|
||||||
names that you can pass to "set_ftrace_filter" or
|
names that you can pass to "set_ftrace_filter" or
|
||||||
@ -316,23 +318,23 @@ The above is mostly meaningful for kernel developers.
|
|||||||
The rest is the same as the 'trace' file.
|
The rest is the same as the 'trace' file.
|
||||||
|
|
||||||
|
|
||||||
iter_ctrl
|
trace_options
|
||||||
---------
|
-------------
|
||||||
|
|
||||||
The iter_ctrl file is used to control what gets printed in the trace
|
The trace_options file is used to control what gets printed in the trace
|
||||||
output. To see what is available, simply cat the file:
|
output. To see what is available, simply cat the file:
|
||||||
|
|
||||||
cat /debug/tracing/iter_ctrl
|
cat /debug/tracing/trace_options
|
||||||
print-parent nosym-offset nosym-addr noverbose noraw nohex nobin \
|
print-parent nosym-offset nosym-addr noverbose noraw nohex nobin \
|
||||||
noblock nostacktrace nosched-tree
|
noblock nostacktrace nosched-tree nouserstacktrace nosym-userobj
|
||||||
|
|
||||||
To disable one of the options, echo in the option prepended with "no".
|
To disable one of the options, echo in the option prepended with "no".
|
||||||
|
|
||||||
echo noprint-parent > /debug/tracing/iter_ctrl
|
echo noprint-parent > /debug/tracing/trace_options
|
||||||
|
|
||||||
To enable an option, leave off the "no".
|
To enable an option, leave off the "no".
|
||||||
|
|
||||||
echo sym-offset > /debug/tracing/iter_ctrl
|
echo sym-offset > /debug/tracing/trace_options
|
||||||
|
|
||||||
Here are the available options:
|
Here are the available options:
|
||||||
|
|
||||||
@ -378,6 +380,20 @@ Here are the available options:
|
|||||||
When a trace is recorded, so is the stack of functions.
|
When a trace is recorded, so is the stack of functions.
|
||||||
This allows for back traces of trace sites.
|
This allows for back traces of trace sites.
|
||||||
|
|
||||||
|
userstacktrace - This option changes the trace.
|
||||||
|
It records a stacktrace of the current userspace thread.
|
||||||
|
|
||||||
|
sym-userobj - when user stacktrace are enabled, look up which object the
|
||||||
|
address belongs to, and print a relative address
|
||||||
|
This is especially useful when ASLR is on, otherwise you don't
|
||||||
|
get a chance to resolve the address to object/file/line after the app is no
|
||||||
|
longer running
|
||||||
|
|
||||||
|
The lookup is performed when you read trace,trace_pipe,latency_trace. Example:
|
||||||
|
|
||||||
|
a.out-1623 [000] 40874.465068: /root/a.out[+0x480] <-/root/a.out[+0
|
||||||
|
x494] <- /root/a.out[+0x4a8] <- /lib/libc-2.7.so[+0x1e1a6]
|
||||||
|
|
||||||
sched-tree - TBD (any users??)
|
sched-tree - TBD (any users??)
|
||||||
|
|
||||||
|
|
||||||
@ -1059,6 +1075,83 @@ For simple one time traces, the above is sufficent. For anything else,
|
|||||||
a search through /proc/mounts may be needed to find where the debugfs
|
a search through /proc/mounts may be needed to find where the debugfs
|
||||||
file-system is mounted.
|
file-system is mounted.
|
||||||
|
|
||||||
|
|
||||||
|
Single thread tracing
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
By writing into /debug/tracing/set_ftrace_pid you can trace a
|
||||||
|
single thread. For example:
|
||||||
|
|
||||||
|
# cat /debug/tracing/set_ftrace_pid
|
||||||
|
no pid
|
||||||
|
# echo 3111 > /debug/tracing/set_ftrace_pid
|
||||||
|
# cat /debug/tracing/set_ftrace_pid
|
||||||
|
3111
|
||||||
|
# echo function > /debug/tracing/current_tracer
|
||||||
|
# cat /debug/tracing/trace | head
|
||||||
|
# tracer: function
|
||||||
|
#
|
||||||
|
# TASK-PID CPU# TIMESTAMP FUNCTION
|
||||||
|
# | | | | |
|
||||||
|
yum-updatesd-3111 [003] 1637.254676: finish_task_switch <-thread_return
|
||||||
|
yum-updatesd-3111 [003] 1637.254681: hrtimer_cancel <-schedule_hrtimeout_range
|
||||||
|
yum-updatesd-3111 [003] 1637.254682: hrtimer_try_to_cancel <-hrtimer_cancel
|
||||||
|
yum-updatesd-3111 [003] 1637.254683: lock_hrtimer_base <-hrtimer_try_to_cancel
|
||||||
|
yum-updatesd-3111 [003] 1637.254685: fget_light <-do_sys_poll
|
||||||
|
yum-updatesd-3111 [003] 1637.254686: pipe_poll <-do_sys_poll
|
||||||
|
# echo -1 > /debug/tracing/set_ftrace_pid
|
||||||
|
# cat /debug/tracing/trace |head
|
||||||
|
# tracer: function
|
||||||
|
#
|
||||||
|
# TASK-PID CPU# TIMESTAMP FUNCTION
|
||||||
|
# | | | | |
|
||||||
|
##### CPU 3 buffer started ####
|
||||||
|
yum-updatesd-3111 [003] 1701.957688: free_poll_entry <-poll_freewait
|
||||||
|
yum-updatesd-3111 [003] 1701.957689: remove_wait_queue <-free_poll_entry
|
||||||
|
yum-updatesd-3111 [003] 1701.957691: fput <-free_poll_entry
|
||||||
|
yum-updatesd-3111 [003] 1701.957692: audit_syscall_exit <-sysret_audit
|
||||||
|
yum-updatesd-3111 [003] 1701.957693: path_put <-audit_syscall_exit
|
||||||
|
|
||||||
|
If you want to trace a function when executing, you could use
|
||||||
|
something like this simple program:
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
int main (int argc, char **argv)
|
||||||
|
{
|
||||||
|
if (argc < 1)
|
||||||
|
exit(-1);
|
||||||
|
|
||||||
|
if (fork() > 0) {
|
||||||
|
int fd, ffd;
|
||||||
|
char line[64];
|
||||||
|
int s;
|
||||||
|
|
||||||
|
ffd = open("/debug/tracing/current_tracer", O_WRONLY);
|
||||||
|
if (ffd < 0)
|
||||||
|
exit(-1);
|
||||||
|
write(ffd, "nop", 3);
|
||||||
|
|
||||||
|
fd = open("/debug/tracing/set_ftrace_pid", O_WRONLY);
|
||||||
|
s = sprintf(line, "%d\n", getpid());
|
||||||
|
write(fd, line, s);
|
||||||
|
|
||||||
|
write(ffd, "function", 8);
|
||||||
|
|
||||||
|
close(fd);
|
||||||
|
close(ffd);
|
||||||
|
|
||||||
|
execvp(argv[1], argv+1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
dynamic ftrace
|
dynamic ftrace
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
@ -1158,7 +1251,11 @@ These are the only wild cards which are supported.
|
|||||||
|
|
||||||
<match>*<match> will not work.
|
<match>*<match> will not work.
|
||||||
|
|
||||||
# echo hrtimer_* > /debug/tracing/set_ftrace_filter
|
Note: It is better to use quotes to enclose the wild cards, otherwise
|
||||||
|
the shell may expand the parameters into names of files in the local
|
||||||
|
directory.
|
||||||
|
|
||||||
|
# echo 'hrtimer_*' > /debug/tracing/set_ftrace_filter
|
||||||
|
|
||||||
Produces:
|
Produces:
|
||||||
|
|
||||||
@ -1213,7 +1310,7 @@ Again, now we want to append.
|
|||||||
# echo sys_nanosleep > /debug/tracing/set_ftrace_filter
|
# echo sys_nanosleep > /debug/tracing/set_ftrace_filter
|
||||||
# cat /debug/tracing/set_ftrace_filter
|
# cat /debug/tracing/set_ftrace_filter
|
||||||
sys_nanosleep
|
sys_nanosleep
|
||||||
# echo hrtimer_* >> /debug/tracing/set_ftrace_filter
|
# echo 'hrtimer_*' >> /debug/tracing/set_ftrace_filter
|
||||||
# cat /debug/tracing/set_ftrace_filter
|
# cat /debug/tracing/set_ftrace_filter
|
||||||
hrtimer_run_queues
|
hrtimer_run_queues
|
||||||
hrtimer_run_pending
|
hrtimer_run_pending
|
||||||
@ -1299,41 +1396,29 @@ trace entries
|
|||||||
-------------
|
-------------
|
||||||
|
|
||||||
Having too much or not enough data can be troublesome in diagnosing
|
Having too much or not enough data can be troublesome in diagnosing
|
||||||
an issue in the kernel. The file trace_entries is used to modify
|
an issue in the kernel. The file buffer_size_kb is used to modify
|
||||||
the size of the internal trace buffers. The number listed
|
the size of the internal trace buffers. The number listed
|
||||||
is the number of entries that can be recorded per CPU. To know
|
is the number of entries that can be recorded per CPU. To know
|
||||||
the full size, multiply the number of possible CPUS with the
|
the full size, multiply the number of possible CPUS with the
|
||||||
number of entries.
|
number of entries.
|
||||||
|
|
||||||
# cat /debug/tracing/trace_entries
|
# cat /debug/tracing/buffer_size_kb
|
||||||
65620
|
1408 (units kilobytes)
|
||||||
|
|
||||||
Note, to modify this, you must have tracing completely disabled. To do that,
|
Note, to modify this, you must have tracing completely disabled. To do that,
|
||||||
echo "nop" into the current_tracer. If the current_tracer is not set
|
echo "nop" into the current_tracer. If the current_tracer is not set
|
||||||
to "nop", an EINVAL error will be returned.
|
to "nop", an EINVAL error will be returned.
|
||||||
|
|
||||||
# echo nop > /debug/tracing/current_tracer
|
# echo nop > /debug/tracing/current_tracer
|
||||||
# echo 100000 > /debug/tracing/trace_entries
|
# echo 10000 > /debug/tracing/buffer_size_kb
|
||||||
# cat /debug/tracing/trace_entries
|
# cat /debug/tracing/buffer_size_kb
|
||||||
100045
|
10000 (units kilobytes)
|
||||||
|
|
||||||
|
|
||||||
Notice that we echoed in 100,000 but the size is 100,045. The entries
|
|
||||||
are held in individual pages. It allocates the number of pages it takes
|
|
||||||
to fulfill the request. If more entries may fit on the last page
|
|
||||||
then they will be added.
|
|
||||||
|
|
||||||
# echo 1 > /debug/tracing/trace_entries
|
|
||||||
# cat /debug/tracing/trace_entries
|
|
||||||
85
|
|
||||||
|
|
||||||
This shows us that 85 entries can fit in a single page.
|
|
||||||
|
|
||||||
The number of pages which will be allocated is limited to a percentage
|
The number of pages which will be allocated is limited to a percentage
|
||||||
of available memory. Allocating too much will produce an error.
|
of available memory. Allocating too much will produce an error.
|
||||||
|
|
||||||
# echo 1000000000000 > /debug/tracing/trace_entries
|
# echo 1000000000000 > /debug/tracing/buffer_size_kb
|
||||||
-bash: echo: write error: Cannot allocate memory
|
-bash: echo: write error: Cannot allocate memory
|
||||||
# cat /debug/tracing/trace_entries
|
# cat /debug/tracing/buffer_size_kb
|
||||||
85
|
85
|
||||||
|
|
||||||
|
@ -383,6 +383,20 @@ more details, with real examples.
|
|||||||
to prerequisites are referenced with $(src) (because they are not
|
to prerequisites are referenced with $(src) (because they are not
|
||||||
generated files).
|
generated files).
|
||||||
|
|
||||||
|
$(kecho)
|
||||||
|
echoing information to user in a rule is often a good practice
|
||||||
|
but when execution "make -s" one does not expect to see any output
|
||||||
|
except for warnings/errors.
|
||||||
|
To support this kbuild define $(kecho) which will echo out the
|
||||||
|
text following $(kecho) to stdout except if "make -s" is used.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
#arch/blackfin/boot/Makefile
|
||||||
|
$(obj)/vmImage: $(obj)/vmlinux.gz
|
||||||
|
$(call if_changed,uimage)
|
||||||
|
@$(kecho) 'Kernel: $@ is ready'
|
||||||
|
|
||||||
|
|
||||||
--- 3.11 $(CC) support functions
|
--- 3.11 $(CC) support functions
|
||||||
|
|
||||||
The kernel may be built with several different versions of
|
The kernel may be built with several different versions of
|
||||||
|
@ -89,6 +89,7 @@ parameter is applicable:
|
|||||||
SPARC Sparc architecture is enabled.
|
SPARC Sparc architecture is enabled.
|
||||||
SWSUSP Software suspend (hibernation) is enabled.
|
SWSUSP Software suspend (hibernation) is enabled.
|
||||||
SUSPEND System suspend states are enabled.
|
SUSPEND System suspend states are enabled.
|
||||||
|
FTRACE Function tracing enabled.
|
||||||
TS Appropriate touchscreen support is enabled.
|
TS Appropriate touchscreen support is enabled.
|
||||||
USB USB support is enabled.
|
USB USB support is enabled.
|
||||||
USBHID USB Human Interface Device support is enabled.
|
USBHID USB Human Interface Device support is enabled.
|
||||||
@ -220,14 +221,17 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||||||
Bits in debug_level correspond to a level in
|
Bits in debug_level correspond to a level in
|
||||||
ACPI_DEBUG_PRINT statements, e.g.,
|
ACPI_DEBUG_PRINT statements, e.g.,
|
||||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO, ...
|
ACPI_DEBUG_PRINT((ACPI_DB_INFO, ...
|
||||||
See Documentation/acpi/debug.txt for more information
|
The debug_level mask defaults to "info". See
|
||||||
about debug layers and levels.
|
Documentation/acpi/debug.txt for more information about
|
||||||
|
debug layers and levels.
|
||||||
|
|
||||||
|
Enable processor driver info messages:
|
||||||
|
acpi.debug_layer=0x20000000
|
||||||
|
Enable PCI/PCI interrupt routing info messages:
|
||||||
|
acpi.debug_layer=0x400000
|
||||||
Enable AML "Debug" output, i.e., stores to the Debug
|
Enable AML "Debug" output, i.e., stores to the Debug
|
||||||
object while interpreting AML:
|
object while interpreting AML:
|
||||||
acpi.debug_layer=0xffffffff acpi.debug_level=0x2
|
acpi.debug_layer=0xffffffff acpi.debug_level=0x2
|
||||||
Enable PCI/PCI interrupt routing info messages:
|
|
||||||
acpi.debug_layer=0x400000 acpi.debug_level=0x4
|
|
||||||
Enable all messages related to ACPI hardware:
|
Enable all messages related to ACPI hardware:
|
||||||
acpi.debug_layer=0x2 acpi.debug_level=0xffffffff
|
acpi.debug_layer=0x2 acpi.debug_level=0xffffffff
|
||||||
|
|
||||||
@ -750,6 +754,14 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||||||
parameter will force ia64_sal_cache_flush to call
|
parameter will force ia64_sal_cache_flush to call
|
||||||
ia64_pal_cache_flush instead of SAL_CACHE_FLUSH.
|
ia64_pal_cache_flush instead of SAL_CACHE_FLUSH.
|
||||||
|
|
||||||
|
ftrace=[tracer]
|
||||||
|
[ftrace] will set and start the specified tracer
|
||||||
|
as early as possible in order to facilitate early
|
||||||
|
boot debugging.
|
||||||
|
|
||||||
|
ftrace_dump_on_oops
|
||||||
|
[ftrace] will dump the trace buffers on oops.
|
||||||
|
|
||||||
gamecon.map[2|3]=
|
gamecon.map[2|3]=
|
||||||
[HW,JOY] Multisystem joystick and NES/SNES/PSX pad
|
[HW,JOY] Multisystem joystick and NES/SNES/PSX pad
|
||||||
support via parallel port (up to 5 devices per port)
|
support via parallel port (up to 5 devices per port)
|
||||||
@ -811,6 +823,9 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||||||
|
|
||||||
hlt [BUGS=ARM,SH]
|
hlt [BUGS=ARM,SH]
|
||||||
|
|
||||||
|
hvc_iucv= [S390] Number of z/VM IUCV Hypervisor console (HVC)
|
||||||
|
back-ends. Valid parameters: 0..8
|
||||||
|
|
||||||
i8042.debug [HW] Toggle i8042 debug mode
|
i8042.debug [HW] Toggle i8042 debug mode
|
||||||
i8042.direct [HW] Put keyboard port into non-translated mode
|
i8042.direct [HW] Put keyboard port into non-translated mode
|
||||||
i8042.dumbkbd [HW] Pretend that controller can only read data from
|
i8042.dumbkbd [HW] Pretend that controller can only read data from
|
||||||
@ -1393,7 +1408,20 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||||||
when a NMI is triggered.
|
when a NMI is triggered.
|
||||||
Format: [state][,regs][,debounce][,die]
|
Format: [state][,regs][,debounce][,die]
|
||||||
|
|
||||||
nmi_watchdog= [KNL,BUGS=X86-32] Debugging features for SMP kernels
|
nmi_watchdog= [KNL,BUGS=X86-32,X86-64] Debugging features for SMP kernels
|
||||||
|
Format: [panic,][num]
|
||||||
|
Valid num: 0,1,2
|
||||||
|
0 - turn nmi_watchdog off
|
||||||
|
1 - use the IO-APIC timer for the NMI watchdog
|
||||||
|
2 - use the local APIC for the NMI watchdog using
|
||||||
|
a performance counter. Note: This will use one performance
|
||||||
|
counter and the local APIC's performance vector.
|
||||||
|
When panic is specified panic when an NMI watchdog timeout occurs.
|
||||||
|
This is useful when you use a panic=... timeout and need the box
|
||||||
|
quickly up again.
|
||||||
|
Instead of 1 and 2 it is possible to use the following
|
||||||
|
symbolic names: lapic and ioapic
|
||||||
|
Example: nmi_watchdog=2 or nmi_watchdog=panic,lapic
|
||||||
|
|
||||||
no387 [BUGS=X86-32] Tells the kernel to use the 387 maths
|
no387 [BUGS=X86-32] Tells the kernel to use the 387 maths
|
||||||
emulation library even if a 387 maths coprocessor
|
emulation library even if a 387 maths coprocessor
|
||||||
@ -1449,6 +1477,10 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||||||
instruction doesn't work correctly and not to
|
instruction doesn't work correctly and not to
|
||||||
use it.
|
use it.
|
||||||
|
|
||||||
|
no_file_caps Tells the kernel not to honor file capabilities. The
|
||||||
|
only way then for a file to be executed with privilege
|
||||||
|
is to be setuid root or executed by root.
|
||||||
|
|
||||||
nohalt [IA-64] Tells the kernel not to use the power saving
|
nohalt [IA-64] Tells the kernel not to use the power saving
|
||||||
function PAL_HALT_LIGHT when idle. This increases
|
function PAL_HALT_LIGHT when idle. This increases
|
||||||
power-consumption. On the positive side, it reduces
|
power-consumption. On the positive side, it reduces
|
||||||
@ -1626,6 +1658,17 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||||||
nomsi [MSI] If the PCI_MSI kernel config parameter is
|
nomsi [MSI] If the PCI_MSI kernel config parameter is
|
||||||
enabled, this kernel boot option can be used to
|
enabled, this kernel boot option can be used to
|
||||||
disable the use of MSI interrupts system-wide.
|
disable the use of MSI interrupts system-wide.
|
||||||
|
noioapicquirk [APIC] Disable all boot interrupt quirks.
|
||||||
|
Safety option to keep boot IRQs enabled. This
|
||||||
|
should never be necessary.
|
||||||
|
ioapicreroute [APIC] Enable rerouting of boot IRQs to the
|
||||||
|
primary IO-APIC for bridges that cannot disable
|
||||||
|
boot IRQs. This fixes a source of spurious IRQs
|
||||||
|
when the system masks IRQs.
|
||||||
|
noioapicreroute [APIC] Disable workaround that uses the
|
||||||
|
boot IRQ equivalent of an IRQ that connects to
|
||||||
|
a chipset where boot IRQs cannot be disabled.
|
||||||
|
The opposite of ioapicreroute.
|
||||||
biosirq [X86-32] Use PCI BIOS calls to get the interrupt
|
biosirq [X86-32] Use PCI BIOS calls to get the interrupt
|
||||||
routing table. These calls are known to be buggy
|
routing table. These calls are known to be buggy
|
||||||
on several machines and they hang the machine
|
on several machines and they hang the machine
|
||||||
@ -2165,6 +2208,9 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||||||
st= [HW,SCSI] SCSI tape parameters (buffers, etc.)
|
st= [HW,SCSI] SCSI tape parameters (buffers, etc.)
|
||||||
See Documentation/scsi/st.txt.
|
See Documentation/scsi/st.txt.
|
||||||
|
|
||||||
|
stacktrace [FTRACE]
|
||||||
|
Enabled the stack tracer on boot up.
|
||||||
|
|
||||||
sti= [PARISC,HW]
|
sti= [PARISC,HW]
|
||||||
Format: <num>
|
Format: <num>
|
||||||
Set the STI (builtin display/keyboard on the HP-PARISC
|
Set the STI (builtin display/keyboard on the HP-PARISC
|
||||||
@ -2249,12 +2295,27 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||||||
See comment before function dc390_setup() in
|
See comment before function dc390_setup() in
|
||||||
drivers/scsi/tmscsim.c.
|
drivers/scsi/tmscsim.c.
|
||||||
|
|
||||||
|
topology= [S390]
|
||||||
|
Format: {off | on}
|
||||||
|
Specify if the kernel should make use of the cpu
|
||||||
|
topology informations if the hardware supports these.
|
||||||
|
The scheduler will make use of these informations and
|
||||||
|
e.g. base its process migration decisions on it.
|
||||||
|
Default is off.
|
||||||
|
|
||||||
tp720= [HW,PS2]
|
tp720= [HW,PS2]
|
||||||
|
|
||||||
trix= [HW,OSS] MediaTrix AudioTrix Pro
|
trix= [HW,OSS] MediaTrix AudioTrix Pro
|
||||||
Format:
|
Format:
|
||||||
<io>,<irq>,<dma>,<dma2>,<sb_io>,<sb_irq>,<sb_dma>,<mpu_io>,<mpu_irq>
|
<io>,<irq>,<dma>,<dma2>,<sb_io>,<sb_irq>,<sb_dma>,<mpu_io>,<mpu_irq>
|
||||||
|
|
||||||
|
tsc= Disable clocksource-must-verify flag for TSC.
|
||||||
|
Format: <string>
|
||||||
|
[x86] reliable: mark tsc clocksource as reliable, this
|
||||||
|
disables clocksource verification at runtime.
|
||||||
|
Used to enable high-resolution timer mode on older
|
||||||
|
hardware, and in virtualized environment.
|
||||||
|
|
||||||
turbografx.map[2|3]= [HW,JOY]
|
turbografx.map[2|3]= [HW,JOY]
|
||||||
TurboGraFX parallel port interface
|
TurboGraFX parallel port interface
|
||||||
Format:
|
Format:
|
||||||
|
@ -51,11 +51,16 @@ to call) for the specific marker through marker_probe_register() and can be
|
|||||||
activated by calling marker_arm(). Marker deactivation can be done by calling
|
activated by calling marker_arm(). Marker deactivation can be done by calling
|
||||||
marker_disarm() as many times as marker_arm() has been called. Removing a probe
|
marker_disarm() as many times as marker_arm() has been called. Removing a probe
|
||||||
is done through marker_probe_unregister(); it will disarm the probe.
|
is done through marker_probe_unregister(); it will disarm the probe.
|
||||||
marker_synchronize_unregister() must be called before the end of the module exit
|
|
||||||
function to make sure there is no caller left using the probe. This, and the
|
marker_synchronize_unregister() must be called between probe unregistration and
|
||||||
fact that preemption is disabled around the probe call, make sure that probe
|
the first occurrence of
|
||||||
removal and module unload are safe. See the "Probe example" section below for a
|
- the end of module exit function,
|
||||||
sample probe module.
|
to make sure there is no caller left using the probe;
|
||||||
|
- the free of any resource used by the probes,
|
||||||
|
to make sure the probes wont be accessing invalid data.
|
||||||
|
This, and the fact that preemption is disabled around the probe call, make sure
|
||||||
|
that probe removal and module unload are safe. See the "Probe example" section
|
||||||
|
below for a sample probe module.
|
||||||
|
|
||||||
The marker mechanism supports inserting multiple instances of the same marker.
|
The marker mechanism supports inserting multiple instances of the same marker.
|
||||||
Markers can be put in inline functions, inlined static functions, and
|
Markers can be put in inline functions, inlined static functions, and
|
||||||
@ -70,6 +75,20 @@ a printk warning which identifies the inconsistency:
|
|||||||
|
|
||||||
"Format mismatch for probe probe_name (format), marker (format)"
|
"Format mismatch for probe probe_name (format), marker (format)"
|
||||||
|
|
||||||
|
Another way to use markers is to simply define the marker without generating any
|
||||||
|
function call to actually call into the marker. This is useful in combination
|
||||||
|
with tracepoint probes in a scheme like this :
|
||||||
|
|
||||||
|
void probe_tracepoint_name(unsigned int arg1, struct task_struct *tsk);
|
||||||
|
|
||||||
|
DEFINE_MARKER_TP(marker_eventname, tracepoint_name, probe_tracepoint_name,
|
||||||
|
"arg1 %u pid %d");
|
||||||
|
|
||||||
|
notrace void probe_tracepoint_name(unsigned int arg1, struct task_struct *tsk)
|
||||||
|
{
|
||||||
|
struct marker *marker = &GET_MARKER(kernel_irq_entry);
|
||||||
|
/* write data to trace buffers ... */
|
||||||
|
}
|
||||||
|
|
||||||
* Probe / marker example
|
* Probe / marker example
|
||||||
|
|
||||||
|
@ -147,7 +147,7 @@ Where the supported parameter are:
|
|||||||
driver. If disabled, the driver will not attempt to scan
|
driver. If disabled, the driver will not attempt to scan
|
||||||
for and associate to a network until it has been configured with
|
for and associate to a network until it has been configured with
|
||||||
one or more properties for the target network, for example configuring
|
one or more properties for the target network, for example configuring
|
||||||
the network SSID. Default is 1 (auto-associate)
|
the network SSID. Default is 0 (do not auto-associate)
|
||||||
|
|
||||||
Example: % modprobe ipw2200 associate=0
|
Example: % modprobe ipw2200 associate=0
|
||||||
|
|
||||||
|
@ -194,6 +194,48 @@ or, for backwards compatibility, the option value. E.g.,
|
|||||||
|
|
||||||
The parameters are as follows:
|
The parameters are as follows:
|
||||||
|
|
||||||
|
ad_select
|
||||||
|
|
||||||
|
Specifies the 802.3ad aggregation selection logic to use. The
|
||||||
|
possible values and their effects are:
|
||||||
|
|
||||||
|
stable or 0
|
||||||
|
|
||||||
|
The active aggregator is chosen by largest aggregate
|
||||||
|
bandwidth.
|
||||||
|
|
||||||
|
Reselection of the active aggregator occurs only when all
|
||||||
|
slaves of the active aggregator are down or the active
|
||||||
|
aggregator has no slaves.
|
||||||
|
|
||||||
|
This is the default value.
|
||||||
|
|
||||||
|
bandwidth or 1
|
||||||
|
|
||||||
|
The active aggregator is chosen by largest aggregate
|
||||||
|
bandwidth. Reselection occurs if:
|
||||||
|
|
||||||
|
- A slave is added to or removed from the bond
|
||||||
|
|
||||||
|
- Any slave's link state changes
|
||||||
|
|
||||||
|
- Any slave's 802.3ad association state changes
|
||||||
|
|
||||||
|
- The bond's adminstrative state changes to up
|
||||||
|
|
||||||
|
count or 2
|
||||||
|
|
||||||
|
The active aggregator is chosen by the largest number of
|
||||||
|
ports (slaves). Reselection occurs as described under the
|
||||||
|
"bandwidth" setting, above.
|
||||||
|
|
||||||
|
The bandwidth and count selection policies permit failover of
|
||||||
|
802.3ad aggregations when partial failure of the active aggregator
|
||||||
|
occurs. This keeps the aggregator with the highest availability
|
||||||
|
(either in bandwidth or in number of ports) active at all times.
|
||||||
|
|
||||||
|
This option was added in bonding version 3.4.0.
|
||||||
|
|
||||||
arp_interval
|
arp_interval
|
||||||
|
|
||||||
Specifies the ARP link monitoring frequency in milliseconds.
|
Specifies the ARP link monitoring frequency in milliseconds.
|
||||||
@ -551,6 +593,16 @@ num_grat_arp
|
|||||||
affects only the active-backup mode. This option was added for
|
affects only the active-backup mode. This option was added for
|
||||||
bonding version 3.3.0.
|
bonding version 3.3.0.
|
||||||
|
|
||||||
|
num_unsol_na
|
||||||
|
|
||||||
|
Specifies the number of unsolicited IPv6 Neighbor Advertisements
|
||||||
|
to be issued after a failover event. One unsolicited NA is issued
|
||||||
|
immediately after the failover.
|
||||||
|
|
||||||
|
The valid range is 0 - 255; the default value is 1. This option
|
||||||
|
affects only the active-backup mode. This option was added for
|
||||||
|
bonding version 3.4.0.
|
||||||
|
|
||||||
primary
|
primary
|
||||||
|
|
||||||
A string (eth0, eth2, etc) specifying which slave is the
|
A string (eth0, eth2, etc) specifying which slave is the
|
||||||
@ -922,17 +974,19 @@ USERCTL=no
|
|||||||
NETMASK, NETWORK and BROADCAST) to match your network configuration.
|
NETMASK, NETWORK and BROADCAST) to match your network configuration.
|
||||||
|
|
||||||
For later versions of initscripts, such as that found with Fedora
|
For later versions of initscripts, such as that found with Fedora
|
||||||
7 and Red Hat Enterprise Linux version 5 (or later), it is possible, and,
|
7 (or later) and Red Hat Enterprise Linux version 5 (or later), it is possible,
|
||||||
indeed, preferable, to specify the bonding options in the ifcfg-bond0
|
and, indeed, preferable, to specify the bonding options in the ifcfg-bond0
|
||||||
file, e.g. a line of the format:
|
file, e.g. a line of the format:
|
||||||
|
|
||||||
BONDING_OPTS="mode=active-backup arp_interval=60 arp_ip_target=+192.168.1.254"
|
BONDING_OPTS="mode=active-backup arp_interval=60 arp_ip_target=192.168.1.254"
|
||||||
|
|
||||||
will configure the bond with the specified options. The options
|
will configure the bond with the specified options. The options
|
||||||
specified in BONDING_OPTS are identical to the bonding module parameters
|
specified in BONDING_OPTS are identical to the bonding module parameters
|
||||||
except for the arp_ip_target field. Each target should be included as a
|
except for the arp_ip_target field when using versions of initscripts older
|
||||||
separate option and should be preceded by a '+' to indicate it should be
|
than and 8.57 (Fedora 8) and 8.45.19 (Red Hat Enterprise Linux 5.2). When
|
||||||
added to the list of queried targets, e.g.,
|
using older versions each target should be included as a separate option and
|
||||||
|
should be preceded by a '+' to indicate it should be added to the list of
|
||||||
|
queried targets, e.g.,
|
||||||
|
|
||||||
arp_ip_target=+192.168.1.1 arp_ip_target=+192.168.1.2
|
arp_ip_target=+192.168.1.1 arp_ip_target=+192.168.1.2
|
||||||
|
|
||||||
@ -940,7 +994,7 @@ added to the list of queried targets, e.g.,
|
|||||||
options via BONDING_OPTS, it is not necessary to edit /etc/modules.conf or
|
options via BONDING_OPTS, it is not necessary to edit /etc/modules.conf or
|
||||||
/etc/modprobe.conf.
|
/etc/modprobe.conf.
|
||||||
|
|
||||||
For older versions of initscripts that do not support
|
For even older versions of initscripts that do not support
|
||||||
BONDING_OPTS, it is necessary to edit /etc/modules.conf (or
|
BONDING_OPTS, it is necessary to edit /etc/modules.conf (or
|
||||||
/etc/modprobe.conf, depending upon your distro) to load the bonding module
|
/etc/modprobe.conf, depending upon your distro) to load the bonding module
|
||||||
with your desired options when the bond0 interface is brought up. The
|
with your desired options when the bond0 interface is brought up. The
|
||||||
|
@ -57,6 +57,24 @@ can be set before calling bind().
|
|||||||
DCCP_SOCKOPT_GET_CUR_MPS is read-only and retrieves the current maximum packet
|
DCCP_SOCKOPT_GET_CUR_MPS is read-only and retrieves the current maximum packet
|
||||||
size (application payload size) in bytes, see RFC 4340, section 14.
|
size (application payload size) in bytes, see RFC 4340, section 14.
|
||||||
|
|
||||||
|
DCCP_SOCKOPT_AVAILABLE_CCIDS is also read-only and returns the list of CCIDs
|
||||||
|
supported by the endpoint (see include/linux/dccp.h for symbolic constants).
|
||||||
|
The caller needs to provide a sufficiently large (> 2) array of type uint8_t.
|
||||||
|
|
||||||
|
DCCP_SOCKOPT_CCID is write-only and sets both the TX and RX CCIDs at the same
|
||||||
|
time, combining the operation of the next two socket options. This option is
|
||||||
|
preferrable over the latter two, since often applications will use the same
|
||||||
|
type of CCID for both directions; and mixed use of CCIDs is not currently well
|
||||||
|
understood. This socket option takes as argument at least one uint8_t value, or
|
||||||
|
an array of uint8_t values, which must match available CCIDS (see above). CCIDs
|
||||||
|
must be registered on the socket before calling connect() or listen().
|
||||||
|
|
||||||
|
DCCP_SOCKOPT_TX_CCID is read/write. It returns the current CCID (if set) or sets
|
||||||
|
the preference list for the TX CCID, using the same format as DCCP_SOCKOPT_CCID.
|
||||||
|
Please note that the getsockopt argument type here is `int', not uint8_t.
|
||||||
|
|
||||||
|
DCCP_SOCKOPT_RX_CCID is analogous to DCCP_SOCKOPT_TX_CCID, but for the RX CCID.
|
||||||
|
|
||||||
DCCP_SOCKOPT_SERVER_TIMEWAIT enables the server (listening socket) to hold
|
DCCP_SOCKOPT_SERVER_TIMEWAIT enables the server (listening socket) to hold
|
||||||
timewait state when closing the connection (RFC 4340, 8.3). The usual case is
|
timewait state when closing the connection (RFC 4340, 8.3). The usual case is
|
||||||
that the closing server sends a CloseReq, whereupon the client holds timewait
|
that the closing server sends a CloseReq, whereupon the client holds timewait
|
||||||
@ -115,20 +133,12 @@ retries2
|
|||||||
importance for retransmitted acknowledgments and feature negotiation,
|
importance for retransmitted acknowledgments and feature negotiation,
|
||||||
data packets are never retransmitted. Analogue of tcp_retries2.
|
data packets are never retransmitted. Analogue of tcp_retries2.
|
||||||
|
|
||||||
send_ndp = 1
|
|
||||||
Whether or not to send NDP count options (sec. 7.7.2).
|
|
||||||
|
|
||||||
send_ackvec = 1
|
|
||||||
Whether or not to send Ack Vector options (sec. 11.5).
|
|
||||||
|
|
||||||
ack_ratio = 2
|
|
||||||
The default Ack Ratio (sec. 11.3) to use.
|
|
||||||
|
|
||||||
tx_ccid = 2
|
tx_ccid = 2
|
||||||
Default CCID for the sender-receiver half-connection.
|
Default CCID for the sender-receiver half-connection. Depending on the
|
||||||
|
choice of CCID, the Send Ack Vector feature is enabled automatically.
|
||||||
|
|
||||||
rx_ccid = 2
|
rx_ccid = 2
|
||||||
Default CCID for the receiver-sender half-connection.
|
Default CCID for the receiver-sender half-connection; see tx_ccid.
|
||||||
|
|
||||||
seq_window = 100
|
seq_window = 100
|
||||||
The initial sequence window (sec. 7.5.2).
|
The initial sequence window (sec. 7.5.2).
|
||||||
|
@ -13,7 +13,7 @@ Transmit path guidelines:
|
|||||||
static int drv_hard_start_xmit(struct sk_buff *skb,
|
static int drv_hard_start_xmit(struct sk_buff *skb,
|
||||||
struct net_device *dev)
|
struct net_device *dev)
|
||||||
{
|
{
|
||||||
struct drv *dp = dev->priv;
|
struct drv *dp = netdev_priv(dev);
|
||||||
|
|
||||||
lock_tx(dp);
|
lock_tx(dp);
|
||||||
...
|
...
|
||||||
|
@ -3,15 +3,15 @@ Krzysztof Halasa <khc@pm.waw.pl>
|
|||||||
|
|
||||||
|
|
||||||
Generic HDLC layer currently supports:
|
Generic HDLC layer currently supports:
|
||||||
1. Frame Relay (ANSI, CCITT, Cisco and no LMI).
|
1. Frame Relay (ANSI, CCITT, Cisco and no LMI)
|
||||||
- Normal (routed) and Ethernet-bridged (Ethernet device emulation)
|
- Normal (routed) and Ethernet-bridged (Ethernet device emulation)
|
||||||
interfaces can share a single PVC.
|
interfaces can share a single PVC.
|
||||||
- ARP support (no InARP support in the kernel - there is an
|
- ARP support (no InARP support in the kernel - there is an
|
||||||
experimental InARP user-space daemon available on:
|
experimental InARP user-space daemon available on:
|
||||||
http://www.kernel.org/pub/linux/utils/net/hdlc/).
|
http://www.kernel.org/pub/linux/utils/net/hdlc/).
|
||||||
2. raw HDLC - either IP (IPv4) interface or Ethernet device emulation.
|
2. raw HDLC - either IP (IPv4) interface or Ethernet device emulation
|
||||||
3. Cisco HDLC.
|
3. Cisco HDLC
|
||||||
4. PPP (uses syncppp.c).
|
4. PPP
|
||||||
5. X.25 (uses X.25 routines).
|
5. X.25 (uses X.25 routines).
|
||||||
|
|
||||||
Generic HDLC is a protocol driver only - it needs a low-level driver
|
Generic HDLC is a protocol driver only - it needs a low-level driver
|
||||||
|
@ -27,6 +27,12 @@ min_adv_mss - INTEGER
|
|||||||
The advertised MSS depends on the first hop route MTU, but will
|
The advertised MSS depends on the first hop route MTU, but will
|
||||||
never be lower than this setting.
|
never be lower than this setting.
|
||||||
|
|
||||||
|
rt_cache_rebuild_count - INTEGER
|
||||||
|
The per net-namespace route cache emergency rebuild threshold.
|
||||||
|
Any net-namespace having its route cache rebuilt due to
|
||||||
|
a hash bucket chain being too long more than this many times
|
||||||
|
will have its route caching disabled
|
||||||
|
|
||||||
IP Fragmentation:
|
IP Fragmentation:
|
||||||
|
|
||||||
ipfrag_high_thresh - INTEGER
|
ipfrag_high_thresh - INTEGER
|
||||||
|
@ -50,10 +50,6 @@ associates with the AP. hostapd and wpa_supplicant are used to take
|
|||||||
care of WPA2-PSK authentication. In addition, hostapd is also
|
care of WPA2-PSK authentication. In addition, hostapd is also
|
||||||
processing access point side of association.
|
processing access point side of association.
|
||||||
|
|
||||||
Please note that the current Linux kernel does not enable AP mode, so a
|
|
||||||
simple patch is needed to enable AP mode selection:
|
|
||||||
http://johannes.sipsolutions.net/patches/kernel/all/LATEST/006-allow-ap-vlan-modes.patch
|
|
||||||
|
|
||||||
|
|
||||||
# Build mac80211_hwsim as part of kernel configuration
|
# Build mac80211_hwsim as part of kernel configuration
|
||||||
|
|
||||||
@ -65,3 +61,8 @@ hostapd hostapd.conf
|
|||||||
|
|
||||||
# Run wpa_supplicant (station) for wlan1
|
# Run wpa_supplicant (station) for wlan1
|
||||||
wpa_supplicant -Dwext -iwlan1 -c wpa_supplicant.conf
|
wpa_supplicant -Dwext -iwlan1 -c wpa_supplicant.conf
|
||||||
|
|
||||||
|
|
||||||
|
More test cases are available in hostap.git:
|
||||||
|
git://w1.fi/srv/git/hostap.git and mac80211_hwsim/tests subdirectory
|
||||||
|
(http://w1.fi/gitweb/gitweb.cgi?p=hostap.git;a=tree;f=mac80211_hwsim/tests)
|
||||||
|
@ -18,7 +18,7 @@ There are routines in net_init.c to handle the common cases of
|
|||||||
alloc_etherdev, alloc_netdev. These reserve extra space for driver
|
alloc_etherdev, alloc_netdev. These reserve extra space for driver
|
||||||
private data which gets freed when the network device is freed. If
|
private data which gets freed when the network device is freed. If
|
||||||
separately allocated data is attached to the network device
|
separately allocated data is attached to the network device
|
||||||
(dev->priv) then it is up to the module exit handler to free that.
|
(netdev_priv(dev)) then it is up to the module exit handler to free that.
|
||||||
|
|
||||||
MTU
|
MTU
|
||||||
===
|
===
|
||||||
|
@ -131,11 +131,13 @@ are expected to do this during initialization.
|
|||||||
|
|
||||||
r = zd_reg2alpha2(mac->regdomain, alpha2);
|
r = zd_reg2alpha2(mac->regdomain, alpha2);
|
||||||
if (!r)
|
if (!r)
|
||||||
regulatory_hint(hw->wiphy, alpha2, NULL);
|
regulatory_hint(hw->wiphy, alpha2);
|
||||||
|
|
||||||
Example code - drivers providing a built in regulatory domain:
|
Example code - drivers providing a built in regulatory domain:
|
||||||
--------------------------------------------------------------
|
--------------------------------------------------------------
|
||||||
|
|
||||||
|
[NOTE: This API is not currently available, it can be added when required]
|
||||||
|
|
||||||
If you have regulatory information you can obtain from your
|
If you have regulatory information you can obtain from your
|
||||||
driver and you *need* to use this we let you build a regulatory domain
|
driver and you *need* to use this we let you build a regulatory domain
|
||||||
structure and pass it to the wireless core. To do this you should
|
structure and pass it to the wireless core. To do this you should
|
||||||
@ -167,7 +169,6 @@ struct ieee80211_regdomain mydriver_jp_regdom = {
|
|||||||
|
|
||||||
Then in some part of your code after your wiphy has been registered:
|
Then in some part of your code after your wiphy has been registered:
|
||||||
|
|
||||||
int r;
|
|
||||||
struct ieee80211_regdomain *rd;
|
struct ieee80211_regdomain *rd;
|
||||||
int size_of_regd;
|
int size_of_regd;
|
||||||
int num_rules = mydriver_jp_regdom.n_reg_rules;
|
int num_rules = mydriver_jp_regdom.n_reg_rules;
|
||||||
@ -178,17 +179,12 @@ Then in some part of your code after your wiphy has been registered:
|
|||||||
|
|
||||||
rd = kzalloc(size_of_regd, GFP_KERNEL);
|
rd = kzalloc(size_of_regd, GFP_KERNEL);
|
||||||
if (!rd)
|
if (!rd)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
memcpy(rd, &mydriver_jp_regdom, sizeof(struct ieee80211_regdomain));
|
memcpy(rd, &mydriver_jp_regdom, sizeof(struct ieee80211_regdomain));
|
||||||
|
|
||||||
for (i=0; i < num_rules; i++) {
|
for (i=0; i < num_rules; i++)
|
||||||
memcpy(&rd->reg_rules[i], &mydriver_jp_regdom.reg_rules[i],
|
memcpy(&rd->reg_rules[i],
|
||||||
sizeof(struct ieee80211_reg_rule));
|
&mydriver_jp_regdom.reg_rules[i],
|
||||||
}
|
sizeof(struct ieee80211_reg_rule));
|
||||||
r = regulatory_hint(hw->wiphy, NULL, rd);
|
regulatory_struct_hint(rd);
|
||||||
if (r) {
|
|
||||||
kfree(rd);
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
@ -69,6 +69,11 @@ to the overall system performance.
|
|||||||
On x86 nmi_watchdog is disabled by default so you have to enable it with
|
On x86 nmi_watchdog is disabled by default so you have to enable it with
|
||||||
a boot time parameter.
|
a boot time parameter.
|
||||||
|
|
||||||
|
It's possible to disable the NMI watchdog in run-time by writing "0" to
|
||||||
|
/proc/sys/kernel/nmi_watchdog. Writing "1" to the same file will re-enable
|
||||||
|
the NMI watchdog. Notice that you still need to use "nmi_watchdog=" parameter
|
||||||
|
at boot time.
|
||||||
|
|
||||||
NOTE: In kernels prior to 2.4.2-ac18 the NMI-oopser is enabled unconditionally
|
NOTE: In kernels prior to 2.4.2-ac18 the NMI-oopser is enabled unconditionally
|
||||||
on x86 SMP boxes.
|
on x86 SMP boxes.
|
||||||
|
|
||||||
|
@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
The MDIO is a bus to which the PHY devices are connected. For each
|
The MDIO is a bus to which the PHY devices are connected. For each
|
||||||
device that exists on this bus, a child node should be created. See
|
device that exists on this bus, a child node should be created. See
|
||||||
the definition of the PHY node below for an example of how to define
|
the definition of the PHY node in booting-without-of.txt for an example
|
||||||
a PHY.
|
of how to define a PHY.
|
||||||
|
|
||||||
Required properties:
|
Required properties:
|
||||||
- reg : Offset and length of the register set for the device
|
- reg : Offset and length of the register set for the device
|
||||||
@ -21,6 +21,14 @@ Example:
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
* TBI Internal MDIO bus
|
||||||
|
|
||||||
|
As of this writing, every tsec is associated with an internal TBI PHY.
|
||||||
|
This PHY is accessed through the local MDIO bus. These buses are defined
|
||||||
|
similarly to the mdio buses, except they are compatible with "fsl,gianfar-tbi".
|
||||||
|
The TBI PHYs underneath them are similar to normal PHYs, but the reg property
|
||||||
|
is considered instructive, rather than descriptive. The reg property should
|
||||||
|
be chosen so it doesn't interfere with other PHYs on the bus.
|
||||||
|
|
||||||
* Gianfar-compatible ethernet nodes
|
* Gianfar-compatible ethernet nodes
|
||||||
|
|
||||||
|
@ -191,12 +191,20 @@ Userspace input handlers (uevents) or kernel input handlers (rfkill-input):
|
|||||||
to tell the devices registered with the rfkill class to change
|
to tell the devices registered with the rfkill class to change
|
||||||
their state (i.e. translates the input layer event into real
|
their state (i.e. translates the input layer event into real
|
||||||
action).
|
action).
|
||||||
|
|
||||||
* rfkill-input implements EPO by handling EV_SW SW_RFKILL_ALL 0
|
* rfkill-input implements EPO by handling EV_SW SW_RFKILL_ALL 0
|
||||||
(power off all transmitters) in a special way: it ignores any
|
(power off all transmitters) in a special way: it ignores any
|
||||||
overrides and local state cache and forces all transmitters to the
|
overrides and local state cache and forces all transmitters to the
|
||||||
RFKILL_STATE_SOFT_BLOCKED state (including those which are already
|
RFKILL_STATE_SOFT_BLOCKED state (including those which are already
|
||||||
supposed to be BLOCKED). Note that the opposite event (power on all
|
supposed to be BLOCKED).
|
||||||
transmitters) is handled normally.
|
* rfkill EPO will remain active until rfkill-input receives an
|
||||||
|
EV_SW SW_RFKILL_ALL 1 event. While the EPO is active, transmitters
|
||||||
|
are locked in the blocked state (rfkill will refuse to unblock them).
|
||||||
|
* rfkill-input implements different policies that the user can
|
||||||
|
select for handling EV_SW SW_RFKILL_ALL 1. It will unlock rfkill,
|
||||||
|
and either do nothing (leave transmitters blocked, but now unlocked),
|
||||||
|
restore the transmitters to their state before the EPO, or unblock
|
||||||
|
them all.
|
||||||
|
|
||||||
Userspace uevent handler or kernel platform-specific drivers hooked to the
|
Userspace uevent handler or kernel platform-specific drivers hooked to the
|
||||||
rfkill notifier chain:
|
rfkill notifier chain:
|
||||||
@ -331,11 +339,9 @@ class to get a sysfs interface :-)
|
|||||||
correct event for your switch/button. These events are emergency power-off
|
correct event for your switch/button. These events are emergency power-off
|
||||||
events when they are trying to turn the transmitters off. An example of an
|
events when they are trying to turn the transmitters off. An example of an
|
||||||
input device which SHOULD generate *_RFKILL_ALL events is the wireless-kill
|
input device which SHOULD generate *_RFKILL_ALL events is the wireless-kill
|
||||||
switch in a laptop which is NOT a hotkey, but a real switch that kills radios
|
switch in a laptop which is NOT a hotkey, but a real sliding/rocker switch.
|
||||||
in hardware, even if the O.S. has gone to lunch. An example of an input device
|
An example of an input device which SHOULD NOT generate *_RFKILL_ALL events by
|
||||||
which SHOULD NOT generate *_RFKILL_ALL events by default, is any sort of hot
|
default, is any sort of hot key that is type-specific (e.g. the one for WLAN).
|
||||||
key that does nothing by itself, as well as any hot key that is type-specific
|
|
||||||
(e.g. the one for WLAN).
|
|
||||||
|
|
||||||
|
|
||||||
3.1 Guidelines for wireless device drivers
|
3.1 Guidelines for wireless device drivers
|
||||||
|
@ -8,7 +8,7 @@ Context switch
|
|||||||
By default, the switch_to arch function is called with the runqueue
|
By default, the switch_to arch function is called with the runqueue
|
||||||
locked. This is usually not a problem unless switch_to may need to
|
locked. This is usually not a problem unless switch_to may need to
|
||||||
take the runqueue lock. This is usually due to a wake up operation in
|
take the runqueue lock. This is usually due to a wake up operation in
|
||||||
the context switch. See include/asm-ia64/system.h for an example.
|
the context switch. See arch/ia64/include/asm/system.h for an example.
|
||||||
|
|
||||||
To request the scheduler call switch_to with the runqueue unlocked,
|
To request the scheduler call switch_to with the runqueue unlocked,
|
||||||
you must `#define __ARCH_WANT_UNLOCKED_CTXSW` in a header file
|
you must `#define __ARCH_WANT_UNLOCKED_CTXSW` in a header file
|
||||||
@ -23,7 +23,7 @@ disabled. Interrupts may be enabled over the call if it is likely to
|
|||||||
introduce a significant interrupt latency by adding the line
|
introduce a significant interrupt latency by adding the line
|
||||||
`#define __ARCH_WANT_INTERRUPTS_ON_CTXSW` in the same place as for
|
`#define __ARCH_WANT_INTERRUPTS_ON_CTXSW` in the same place as for
|
||||||
unlocked context switches. This define also implies
|
unlocked context switches. This define also implies
|
||||||
`__ARCH_WANT_UNLOCKED_CTXSW`. See include/asm-arm/system.h for an
|
`__ARCH_WANT_UNLOCKED_CTXSW`. See arch/arm/include/asm/system.h for an
|
||||||
example.
|
example.
|
||||||
|
|
||||||
|
|
||||||
|
@ -273,3 +273,24 @@ task groups and modify their CPU share using the "cgroups" pseudo filesystem.
|
|||||||
|
|
||||||
# #Launch gmplayer (or your favourite movie player)
|
# #Launch gmplayer (or your favourite movie player)
|
||||||
# echo <movie_player_pid> > multimedia/tasks
|
# echo <movie_player_pid> > multimedia/tasks
|
||||||
|
|
||||||
|
8. Implementation note: user namespaces
|
||||||
|
|
||||||
|
User namespaces are intended to be hierarchical. But they are currently
|
||||||
|
only partially implemented. Each of those has ramifications for CFS.
|
||||||
|
|
||||||
|
First, since user namespaces are hierarchical, the /sys/kernel/uids
|
||||||
|
presentation is inadequate. Eventually we will likely want to use sysfs
|
||||||
|
tagging to provide private views of /sys/kernel/uids within each user
|
||||||
|
namespace.
|
||||||
|
|
||||||
|
Second, the hierarchical nature is intended to support completely
|
||||||
|
unprivileged use of user namespaces. So if using user groups, then
|
||||||
|
we want the users in a user namespace to be children of the user
|
||||||
|
who created it.
|
||||||
|
|
||||||
|
That is currently unimplemented. So instead, every user in a new
|
||||||
|
user namespace will receive 1024 shares just like any user in the
|
||||||
|
initial user namespace. Note that at the moment creation of a new
|
||||||
|
user namespace requires each of CAP_SYS_ADMIN, CAP_SETUID, and
|
||||||
|
CAP_SETGID.
|
||||||
|
@ -1,179 +0,0 @@
|
|||||||
|
|
||||||
This file describes the configuration and behavior of KGDB for the SH
|
|
||||||
kernel. Based on a description from Henry Bell <henry.bell@st.com>, it
|
|
||||||
has been modified to account for quirks in the current implementation.
|
|
||||||
|
|
||||||
Version
|
|
||||||
=======
|
|
||||||
|
|
||||||
This version of KGDB was written for 2.4.xx kernels for the SH architecture.
|
|
||||||
Further documentation is available from the linux-sh project website.
|
|
||||||
|
|
||||||
|
|
||||||
Debugging Setup: Host
|
|
||||||
======================
|
|
||||||
|
|
||||||
The two machines will be connected together via a serial line - this
|
|
||||||
should be a null modem cable i.e. with a twist.
|
|
||||||
|
|
||||||
On your DEVELOPMENT machine, go to your kernel source directory and
|
|
||||||
build the kernel, enabling KGDB support in the "kernel hacking" section.
|
|
||||||
This includes the KGDB code, and also makes the kernel be compiled with
|
|
||||||
the "-g" option set -- necessary for debugging.
|
|
||||||
|
|
||||||
To install this new kernel, use the following installation procedure.
|
|
||||||
|
|
||||||
Decide on which tty port you want the machines to communicate, then
|
|
||||||
cable them up back-to-back using the null modem. On the DEVELOPMENT
|
|
||||||
machine, you may wish to create an initialization file called .gdbinit
|
|
||||||
(in the kernel source directory or in your home directory) to execute
|
|
||||||
commonly-used commands at startup.
|
|
||||||
|
|
||||||
A minimal .gdbinit might look like this:
|
|
||||||
|
|
||||||
file vmlinux
|
|
||||||
set remotebaud 115200
|
|
||||||
target remote /dev/ttyS0
|
|
||||||
|
|
||||||
Change the "target" definition so that it specifies the tty port that
|
|
||||||
you intend to use. Change the "remotebaud" definition to match the
|
|
||||||
data rate that you are going to use for the com line (115200 is the
|
|
||||||
default).
|
|
||||||
|
|
||||||
Debugging Setup: Target
|
|
||||||
========================
|
|
||||||
|
|
||||||
By default, the KGDB stub will communicate with the host GDB using
|
|
||||||
ttySC1 at 115200 baud, 8 databits, no parity; these defaults can be
|
|
||||||
changed in the kernel configuration. As the kernel starts up, KGDB will
|
|
||||||
initialize so that breakpoints, kernel segfaults, and so forth will
|
|
||||||
generally enter the debugger.
|
|
||||||
|
|
||||||
This behavior can be modified by including the "kgdb" option in the
|
|
||||||
kernel command line; this option has the general form:
|
|
||||||
|
|
||||||
kgdb=<ttyspec>,<action>
|
|
||||||
|
|
||||||
The <ttyspec> indicates the port to use, and can optionally specify
|
|
||||||
baud, parity and databits -- e.g. "ttySC0,9600N8" or "ttySC1,19200".
|
|
||||||
|
|
||||||
The <action> can be "halt" or "disabled". The "halt" action enters the
|
|
||||||
debugger via a breakpoint as soon as kgdb is initialized; the "disabled"
|
|
||||||
action causes kgdb to ignore kernel segfaults and such until explicitly
|
|
||||||
entered by a breakpoint in the code or by external action (sysrq or NMI).
|
|
||||||
|
|
||||||
(Both <ttyspec> and <action> can appear alone, w/o the separating comma.)
|
|
||||||
|
|
||||||
For example, if you wish to debug early in kernel startup code, you
|
|
||||||
might specify the halt option:
|
|
||||||
|
|
||||||
kgdb=halt
|
|
||||||
|
|
||||||
Boot the TARGET machine, which will appear to hang.
|
|
||||||
|
|
||||||
On your DEVELOPMENT machine, cd to the source directory and run the gdb
|
|
||||||
program. (This is likely to be a cross GDB which runs on your host but
|
|
||||||
is built for an SH target.) If everything is working correctly you
|
|
||||||
should see gdb print out a few lines indicating that a breakpoint has
|
|
||||||
been taken. It will actually show a line of code in the target kernel
|
|
||||||
inside the gdbstub activation code.
|
|
||||||
|
|
||||||
NOTE: BE SURE TO TERMINATE OR SUSPEND any other host application which
|
|
||||||
may be using the same serial port (for example, a terminal emulator you
|
|
||||||
have been using to connect to the target boot code.) Otherwise, data
|
|
||||||
from the target may not all get to GDB!
|
|
||||||
|
|
||||||
You can now use whatever gdb commands you like to set breakpoints.
|
|
||||||
Enter "continue" to start your target machine executing again. At this
|
|
||||||
point the target system will run at full speed until it encounters
|
|
||||||
your breakpoint or gets a segment violation in the kernel, or whatever.
|
|
||||||
|
|
||||||
Serial Ports: KGDB, Console
|
|
||||||
============================
|
|
||||||
|
|
||||||
This version of KGDB may not gracefully handle conflict with other
|
|
||||||
drivers in the kernel using the same port. If KGDB is configured on the
|
|
||||||
same port (and with the same parameters) as the kernel console, or if
|
|
||||||
CONFIG_SH_KGDB_CONSOLE is configured, things should be fine (though in
|
|
||||||
some cases console messages may appear twice through GDB). But if the
|
|
||||||
KGDB port is not the kernel console and used by another serial driver
|
|
||||||
which assumes different serial parameters (e.g. baud rate) KGDB may not
|
|
||||||
recover.
|
|
||||||
|
|
||||||
Also, when KGDB is entered via sysrq-g (requires CONFIG_KGDB_SYSRQ) and
|
|
||||||
the kgdb port uses the same port as the console, detaching GDB will not
|
|
||||||
restore the console to working order without the port being re-opened.
|
|
||||||
|
|
||||||
Another serious consequence of this is that GDB currently CANNOT break
|
|
||||||
into KGDB externally (e.g. via ^C or <BREAK>); unless a breakpoint or
|
|
||||||
error is encountered, the only way to enter KGDB after the initial halt
|
|
||||||
(see above) is via NMI (CONFIG_KGDB_NMI) or sysrq-g (CONFIG_KGDB_SYSRQ).
|
|
||||||
|
|
||||||
Code is included for the basic Hitachi Solution Engine boards to allow
|
|
||||||
the use of ttyS0 for KGDB if desired; this is less robust, but may be
|
|
||||||
useful in some cases. (This cannot be selected using the config file,
|
|
||||||
but only through the kernel command line, e.g. "kgdb=ttyS0", though the
|
|
||||||
configured defaults for baud rate etc. still apply if not overridden.)
|
|
||||||
|
|
||||||
If gdbstub Does Not Work
|
|
||||||
========================
|
|
||||||
|
|
||||||
If it doesn't work, you will have to troubleshoot it. Do the easy
|
|
||||||
things first like double checking your cabling and data rates. You
|
|
||||||
might try some non-kernel based programs to see if the back-to-back
|
|
||||||
connection works properly. Just something simple like cat /etc/hosts
|
|
||||||
/dev/ttyS0 on one machine and cat /dev/ttyS0 on the other will tell you
|
|
||||||
if you can send data from one machine to the other. There is no point
|
|
||||||
in tearing out your hair in the kernel if the line doesn't work.
|
|
||||||
|
|
||||||
If you need to debug the GDB/KGDB communication itself, the gdb commands
|
|
||||||
"set debug remote 1" and "set debug serial 1" may be useful, but be
|
|
||||||
warned: they produce a lot of output.
|
|
||||||
|
|
||||||
Threads
|
|
||||||
=======
|
|
||||||
|
|
||||||
Each process in a target machine is seen as a gdb thread. gdb thread related
|
|
||||||
commands (info threads, thread n) can be used. CONFIG_KGDB_THREAD must
|
|
||||||
be defined for this to work.
|
|
||||||
|
|
||||||
In this version, kgdb reports PID_MAX (32768) as the process ID for the
|
|
||||||
idle process (pid 0), since GDB does not accept 0 as an ID.
|
|
||||||
|
|
||||||
Detaching (exiting KGDB)
|
|
||||||
=========================
|
|
||||||
|
|
||||||
There are two ways to resume full-speed target execution: "continue" and
|
|
||||||
"detach". With "continue", GDB inserts any specified breakpoints in the
|
|
||||||
target code and resumes execution; the target is still in "gdb mode".
|
|
||||||
If a breakpoint or other debug event (e.g. NMI) happens, the target
|
|
||||||
halts and communicates with GDB again, which is waiting for it.
|
|
||||||
|
|
||||||
With "detach", GDB does *not* insert any breakpoints; target execution
|
|
||||||
is resumed and GDB stops communicating (does not wait for the target).
|
|
||||||
In this case, the target is no longer in "gdb mode" -- for example,
|
|
||||||
console messages no longer get sent separately to the KGDB port, or
|
|
||||||
encapsulated for GDB. If a debug event (e.g. NMI) occurs, the target
|
|
||||||
will re-enter "gdb mode" and will display this fact on the console; you
|
|
||||||
must give a new "target remote" command to gdb.
|
|
||||||
|
|
||||||
NOTE: TO AVOID LOSSING CONSOLE MESSAGES IN CASE THE KERNEL CONSOLE AND
|
|
||||||
KGDB USING THE SAME PORT, THE TARGET WAITS FOR ANY INPUT CHARACTER ON
|
|
||||||
THE KGDB PORT AFTER A DETACH COMMAND. For example, after the detach you
|
|
||||||
could start a terminal emulator on the same host port and enter a <cr>;
|
|
||||||
however, this program must then be terminated or suspended in order to
|
|
||||||
use GBD again if KGDB is re-entered.
|
|
||||||
|
|
||||||
|
|
||||||
Acknowledgements
|
|
||||||
================
|
|
||||||
|
|
||||||
This code was mostly generated by Henry Bell <henry.bell@st.com>;
|
|
||||||
largely from KGDB by Amit S. Kale <akale@veritas.com> - extracts from
|
|
||||||
code by Glenn Engel, Jim Kingdon, David Grothe <dave@gcom.com>, Tigran
|
|
||||||
Aivazian <tigran@sco.com>, William Gatliff <bgat@open-widgets.com>, Ben
|
|
||||||
Lee, Steve Chamberlain and Benoit Miller <fulg@iname.com> are also
|
|
||||||
included.
|
|
||||||
|
|
||||||
Jeremy Siegel
|
|
||||||
<jsiegel@mvista.com>
|
|
@ -757,6 +757,8 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
|||||||
model - force the model name
|
model - force the model name
|
||||||
position_fix - Fix DMA pointer (0 = auto, 1 = use LPIB, 2 = POSBUF)
|
position_fix - Fix DMA pointer (0 = auto, 1 = use LPIB, 2 = POSBUF)
|
||||||
probe_mask - Bitmask to probe codecs (default = -1, meaning all slots)
|
probe_mask - Bitmask to probe codecs (default = -1, meaning all slots)
|
||||||
|
probe_only - Only probing and no codec initialization (default=off);
|
||||||
|
Useful to check the initial codec status for debugging
|
||||||
bdl_pos_adj - Specifies the DMA IRQ timing delay in samples.
|
bdl_pos_adj - Specifies the DMA IRQ timing delay in samples.
|
||||||
Passing -1 will make the driver to choose the appropriate
|
Passing -1 will make the driver to choose the appropriate
|
||||||
value based on the controller chip.
|
value based on the controller chip.
|
||||||
@ -772,325 +774,23 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
|||||||
|
|
||||||
This module supports multiple cards and autoprobe.
|
This module supports multiple cards and autoprobe.
|
||||||
|
|
||||||
|
See Documentation/sound/alsa/HD-Audio.txt for more details about
|
||||||
|
HD-audio driver.
|
||||||
|
|
||||||
Each codec may have a model table for different configurations.
|
Each codec may have a model table for different configurations.
|
||||||
If your machine isn't listed there, the default (usually minimal)
|
If your machine isn't listed there, the default (usually minimal)
|
||||||
configuration is set up. You can pass "model=<name>" option to
|
configuration is set up. You can pass "model=<name>" option to
|
||||||
specify a certain model in such a case. There are different
|
specify a certain model in such a case. There are different
|
||||||
models depending on the codec chip.
|
models depending on the codec chip. The list of available models
|
||||||
|
is found in HD-Audio-Models.txt
|
||||||
Model name Description
|
|
||||||
---------- -----------
|
|
||||||
ALC880
|
|
||||||
3stack 3-jack in back and a headphone out
|
|
||||||
3stack-digout 3-jack in back, a HP out and a SPDIF out
|
|
||||||
5stack 5-jack in back, 2-jack in front
|
|
||||||
5stack-digout 5-jack in back, 2-jack in front, a SPDIF out
|
|
||||||
6stack 6-jack in back, 2-jack in front
|
|
||||||
6stack-digout 6-jack with a SPDIF out
|
|
||||||
w810 3-jack
|
|
||||||
z71v 3-jack (HP shared SPDIF)
|
|
||||||
asus 3-jack (ASUS Mobo)
|
|
||||||
asus-w1v ASUS W1V
|
|
||||||
asus-dig ASUS with SPDIF out
|
|
||||||
asus-dig2 ASUS with SPDIF out (using GPIO2)
|
|
||||||
uniwill 3-jack
|
|
||||||
fujitsu Fujitsu Laptops (Pi1536)
|
|
||||||
F1734 2-jack
|
|
||||||
lg LG laptop (m1 express dual)
|
|
||||||
lg-lw LG LW20/LW25 laptop
|
|
||||||
tcl TCL S700
|
|
||||||
clevo Clevo laptops (m520G, m665n)
|
|
||||||
medion Medion Rim 2150
|
|
||||||
test for testing/debugging purpose, almost all controls can be
|
|
||||||
adjusted. Appearing only when compiled with
|
|
||||||
$CONFIG_SND_DEBUG=y
|
|
||||||
auto auto-config reading BIOS (default)
|
|
||||||
|
|
||||||
ALC260
|
|
||||||
hp HP machines
|
|
||||||
hp-3013 HP machines (3013-variant)
|
|
||||||
hp-dc7600 HP DC7600
|
|
||||||
fujitsu Fujitsu S7020
|
|
||||||
acer Acer TravelMate
|
|
||||||
will Will laptops (PB V7900)
|
|
||||||
replacer Replacer 672V
|
|
||||||
basic fixed pin assignment (old default model)
|
|
||||||
test for testing/debugging purpose, almost all controls can
|
|
||||||
adjusted. Appearing only when compiled with
|
|
||||||
$CONFIG_SND_DEBUG=y
|
|
||||||
auto auto-config reading BIOS (default)
|
|
||||||
|
|
||||||
ALC262
|
|
||||||
fujitsu Fujitsu Laptop
|
|
||||||
hp-bpc HP xw4400/6400/8400/9400 laptops
|
|
||||||
hp-bpc-d7000 HP BPC D7000
|
|
||||||
hp-tc-t5735 HP Thin Client T5735
|
|
||||||
hp-rp5700 HP RP5700
|
|
||||||
benq Benq ED8
|
|
||||||
benq-t31 Benq T31
|
|
||||||
hippo Hippo (ATI) with jack detection, Sony UX-90s
|
|
||||||
hippo_1 Hippo (Benq) with jack detection
|
|
||||||
sony-assamd Sony ASSAMD
|
|
||||||
toshiba-s06 Toshiba S06
|
|
||||||
toshiba-rx1 Toshiba RX1
|
|
||||||
ultra Samsung Q1 Ultra Vista model
|
|
||||||
lenovo-3000 Lenovo 3000 y410
|
|
||||||
nec NEC Versa S9100
|
|
||||||
basic fixed pin assignment w/o SPDIF
|
|
||||||
auto auto-config reading BIOS (default)
|
|
||||||
|
|
||||||
ALC267/268
|
|
||||||
quanta-il1 Quanta IL1 mini-notebook
|
|
||||||
3stack 3-stack model
|
|
||||||
toshiba Toshiba A205
|
|
||||||
acer Acer laptops
|
|
||||||
acer-aspire Acer Aspire One
|
|
||||||
dell Dell OEM laptops (Vostro 1200)
|
|
||||||
zepto Zepto laptops
|
|
||||||
test for testing/debugging purpose, almost all controls can
|
|
||||||
adjusted. Appearing only when compiled with
|
|
||||||
$CONFIG_SND_DEBUG=y
|
|
||||||
auto auto-config reading BIOS (default)
|
|
||||||
|
|
||||||
ALC269
|
|
||||||
basic Basic preset
|
|
||||||
quanta Quanta FL1
|
|
||||||
eeepc-p703 ASUS Eeepc P703 P900A
|
|
||||||
eeepc-p901 ASUS Eeepc P901 S101
|
|
||||||
|
|
||||||
ALC662/663
|
|
||||||
3stack-dig 3-stack (2-channel) with SPDIF
|
|
||||||
3stack-6ch 3-stack (6-channel)
|
|
||||||
3stack-6ch-dig 3-stack (6-channel) with SPDIF
|
|
||||||
6stack-dig 6-stack with SPDIF
|
|
||||||
lenovo-101e Lenovo laptop
|
|
||||||
eeepc-p701 ASUS Eeepc P701
|
|
||||||
eeepc-ep20 ASUS Eeepc EP20
|
|
||||||
ecs ECS/Foxconn mobo
|
|
||||||
m51va ASUS M51VA
|
|
||||||
g71v ASUS G71V
|
|
||||||
h13 ASUS H13
|
|
||||||
g50v ASUS G50V
|
|
||||||
asus-mode1 ASUS
|
|
||||||
asus-mode2 ASUS
|
|
||||||
asus-mode3 ASUS
|
|
||||||
asus-mode4 ASUS
|
|
||||||
asus-mode5 ASUS
|
|
||||||
asus-mode6 ASUS
|
|
||||||
auto auto-config reading BIOS (default)
|
|
||||||
|
|
||||||
ALC882/885
|
|
||||||
3stack-dig 3-jack with SPDIF I/O
|
|
||||||
6stack-dig 6-jack digital with SPDIF I/O
|
|
||||||
arima Arima W820Di1
|
|
||||||
targa Targa T8, MSI-1049 T8
|
|
||||||
asus-a7j ASUS A7J
|
|
||||||
asus-a7m ASUS A7M
|
|
||||||
macpro MacPro support
|
|
||||||
mbp3 Macbook Pro rev3
|
|
||||||
imac24 iMac 24'' with jack detection
|
|
||||||
w2jc ASUS W2JC
|
|
||||||
auto auto-config reading BIOS (default)
|
|
||||||
|
|
||||||
ALC883/888
|
|
||||||
3stack-dig 3-jack with SPDIF I/O
|
|
||||||
6stack-dig 6-jack digital with SPDIF I/O
|
|
||||||
3stack-6ch 3-jack 6-channel
|
|
||||||
3stack-6ch-dig 3-jack 6-channel with SPDIF I/O
|
|
||||||
6stack-dig-demo 6-jack digital for Intel demo board
|
|
||||||
acer Acer laptops (Travelmate 3012WTMi, Aspire 5600, etc)
|
|
||||||
acer-aspire Acer Aspire 9810
|
|
||||||
medion Medion Laptops
|
|
||||||
medion-md2 Medion MD2
|
|
||||||
targa-dig Targa/MSI
|
|
||||||
targa-2ch-dig Targs/MSI with 2-channel
|
|
||||||
laptop-eapd 3-jack with SPDIF I/O and EAPD (Clevo M540JE, M550JE)
|
|
||||||
lenovo-101e Lenovo 101E
|
|
||||||
lenovo-nb0763 Lenovo NB0763
|
|
||||||
lenovo-ms7195-dig Lenovo MS7195
|
|
||||||
lenovo-sky Lenovo Sky
|
|
||||||
haier-w66 Haier W66
|
|
||||||
3stack-hp HP machines with 3stack (Lucknow, Samba boards)
|
|
||||||
6stack-dell Dell machines with 6stack (Inspiron 530)
|
|
||||||
mitac Mitac 8252D
|
|
||||||
clevo-m720 Clevo M720 laptop series
|
|
||||||
fujitsu-pi2515 Fujitsu AMILO Pi2515
|
|
||||||
3stack-6ch-intel Intel DG33* boards
|
|
||||||
auto auto-config reading BIOS (default)
|
|
||||||
|
|
||||||
ALC861/660
|
|
||||||
3stack 3-jack
|
|
||||||
3stack-dig 3-jack with SPDIF I/O
|
|
||||||
6stack-dig 6-jack with SPDIF I/O
|
|
||||||
3stack-660 3-jack (for ALC660)
|
|
||||||
uniwill-m31 Uniwill M31 laptop
|
|
||||||
toshiba Toshiba laptop support
|
|
||||||
asus Asus laptop support
|
|
||||||
asus-laptop ASUS F2/F3 laptops
|
|
||||||
auto auto-config reading BIOS (default)
|
|
||||||
|
|
||||||
ALC861VD/660VD
|
|
||||||
3stack 3-jack
|
|
||||||
3stack-dig 3-jack with SPDIF OUT
|
|
||||||
6stack-dig 6-jack with SPDIF OUT
|
|
||||||
3stack-660 3-jack (for ALC660VD)
|
|
||||||
3stack-660-digout 3-jack with SPDIF OUT (for ALC660VD)
|
|
||||||
lenovo Lenovo 3000 C200
|
|
||||||
dallas Dallas laptops
|
|
||||||
hp HP TX1000
|
|
||||||
auto auto-config reading BIOS (default)
|
|
||||||
|
|
||||||
CMI9880
|
|
||||||
minimal 3-jack in back
|
|
||||||
min_fp 3-jack in back, 2-jack in front
|
|
||||||
full 6-jack in back, 2-jack in front
|
|
||||||
full_dig 6-jack in back, 2-jack in front, SPDIF I/O
|
|
||||||
allout 5-jack in back, 2-jack in front, SPDIF out
|
|
||||||
auto auto-config reading BIOS (default)
|
|
||||||
|
|
||||||
AD1882 / AD1882A
|
|
||||||
3stack 3-stack mode (default)
|
|
||||||
6stack 6-stack mode
|
|
||||||
|
|
||||||
AD1884A / AD1883 / AD1984A / AD1984B
|
|
||||||
desktop 3-stack desktop (default)
|
|
||||||
laptop laptop with HP jack sensing
|
|
||||||
mobile mobile devices with HP jack sensing
|
|
||||||
thinkpad Lenovo Thinkpad X300
|
|
||||||
|
|
||||||
AD1884
|
|
||||||
N/A
|
|
||||||
|
|
||||||
AD1981
|
|
||||||
basic 3-jack (default)
|
|
||||||
hp HP nx6320
|
|
||||||
thinkpad Lenovo Thinkpad T60/X60/Z60
|
|
||||||
toshiba Toshiba U205
|
|
||||||
|
|
||||||
AD1983
|
|
||||||
N/A
|
|
||||||
|
|
||||||
AD1984
|
|
||||||
basic default configuration
|
|
||||||
thinkpad Lenovo Thinkpad T61/X61
|
|
||||||
dell Dell T3400
|
|
||||||
|
|
||||||
AD1986A
|
|
||||||
6stack 6-jack, separate surrounds (default)
|
|
||||||
3stack 3-stack, shared surrounds
|
|
||||||
laptop 2-channel only (FSC V2060, Samsung M50)
|
|
||||||
laptop-eapd 2-channel with EAPD (Samsung R65, ASUS A6J)
|
|
||||||
laptop-automute 2-channel with EAPD and HP-automute (Lenovo N100)
|
|
||||||
ultra 2-channel with EAPD (Samsung Ultra tablet PC)
|
|
||||||
|
|
||||||
AD1988/AD1988B/AD1989A/AD1989B
|
|
||||||
6stack 6-jack
|
|
||||||
6stack-dig ditto with SPDIF
|
|
||||||
3stack 3-jack
|
|
||||||
3stack-dig ditto with SPDIF
|
|
||||||
laptop 3-jack with hp-jack automute
|
|
||||||
laptop-dig ditto with SPDIF
|
|
||||||
auto auto-config reading BIOS (default)
|
|
||||||
|
|
||||||
Conexant 5045
|
|
||||||
laptop-hpsense Laptop with HP sense (old model laptop)
|
|
||||||
laptop-micsense Laptop with Mic sense (old model fujitsu)
|
|
||||||
laptop-hpmicsense Laptop with HP and Mic senses
|
|
||||||
benq Benq R55E
|
|
||||||
test for testing/debugging purpose, almost all controls
|
|
||||||
can be adjusted. Appearing only when compiled with
|
|
||||||
$CONFIG_SND_DEBUG=y
|
|
||||||
|
|
||||||
Conexant 5047
|
|
||||||
laptop Basic Laptop config
|
|
||||||
laptop-hp Laptop config for some HP models (subdevice 30A5)
|
|
||||||
laptop-eapd Laptop config with EAPD support
|
|
||||||
test for testing/debugging purpose, almost all controls
|
|
||||||
can be adjusted. Appearing only when compiled with
|
|
||||||
$CONFIG_SND_DEBUG=y
|
|
||||||
|
|
||||||
Conexant 5051
|
|
||||||
laptop Basic Laptop config (default)
|
|
||||||
hp HP Spartan laptop
|
|
||||||
|
|
||||||
STAC9200
|
|
||||||
ref Reference board
|
|
||||||
dell-d21 Dell (unknown)
|
|
||||||
dell-d22 Dell (unknown)
|
|
||||||
dell-d23 Dell (unknown)
|
|
||||||
dell-m21 Dell Inspiron 630m, Dell Inspiron 640m
|
|
||||||
dell-m22 Dell Latitude D620, Dell Latitude D820
|
|
||||||
dell-m23 Dell XPS M1710, Dell Precision M90
|
|
||||||
dell-m24 Dell Latitude 120L
|
|
||||||
dell-m25 Dell Inspiron E1505n
|
|
||||||
dell-m26 Dell Inspiron 1501
|
|
||||||
dell-m27 Dell Inspiron E1705/9400
|
|
||||||
gateway Gateway laptops with EAPD control
|
|
||||||
panasonic Panasonic CF-74
|
|
||||||
|
|
||||||
STAC9205/9254
|
|
||||||
ref Reference board
|
|
||||||
dell-m42 Dell (unknown)
|
|
||||||
dell-m43 Dell Precision
|
|
||||||
dell-m44 Dell Inspiron
|
|
||||||
|
|
||||||
STAC9220/9221
|
|
||||||
ref Reference board
|
|
||||||
3stack D945 3stack
|
|
||||||
5stack D945 5stack + SPDIF
|
|
||||||
intel-mac-v1 Intel Mac Type 1
|
|
||||||
intel-mac-v2 Intel Mac Type 2
|
|
||||||
intel-mac-v3 Intel Mac Type 3
|
|
||||||
intel-mac-v4 Intel Mac Type 4
|
|
||||||
intel-mac-v5 Intel Mac Type 5
|
|
||||||
intel-mac-auto Intel Mac (detect type according to subsystem id)
|
|
||||||
macmini Intel Mac Mini (equivalent with type 3)
|
|
||||||
macbook Intel Mac Book (eq. type 5)
|
|
||||||
macbook-pro-v1 Intel Mac Book Pro 1st generation (eq. type 3)
|
|
||||||
macbook-pro Intel Mac Book Pro 2nd generation (eq. type 3)
|
|
||||||
imac-intel Intel iMac (eq. type 2)
|
|
||||||
imac-intel-20 Intel iMac (newer version) (eq. type 3)
|
|
||||||
dell-d81 Dell (unknown)
|
|
||||||
dell-d82 Dell (unknown)
|
|
||||||
dell-m81 Dell (unknown)
|
|
||||||
dell-m82 Dell XPS M1210
|
|
||||||
|
|
||||||
STAC9202/9250/9251
|
|
||||||
ref Reference board, base config
|
|
||||||
m2-2 Some Gateway MX series laptops
|
|
||||||
m6 Some Gateway NX series laptops
|
|
||||||
pa6 Gateway NX860 series
|
|
||||||
|
|
||||||
STAC9227/9228/9229/927x
|
|
||||||
ref Reference board
|
|
||||||
3stack D965 3stack
|
|
||||||
5stack D965 5stack + SPDIF
|
|
||||||
dell-3stack Dell Dimension E520
|
|
||||||
dell-bios Fixes with Dell BIOS setup
|
|
||||||
|
|
||||||
STAC92HD71B*
|
|
||||||
ref Reference board
|
|
||||||
dell-m4-1 Dell desktops
|
|
||||||
dell-m4-2 Dell desktops
|
|
||||||
dell-m4-3 Dell desktops
|
|
||||||
|
|
||||||
STAC92HD73*
|
|
||||||
ref Reference board
|
|
||||||
dell-m6-amic Dell desktops/laptops with analog mics
|
|
||||||
dell-m6-dmic Dell desktops/laptops with digital mics
|
|
||||||
dell-m6 Dell desktops/laptops with both type of mics
|
|
||||||
|
|
||||||
STAC9872
|
|
||||||
vaio Setup for VAIO FE550G/SZ110
|
|
||||||
vaio-ar Setup for VAIO AR
|
|
||||||
|
|
||||||
The model name "genric" is treated as a special case. When this
|
The model name "genric" is treated as a special case. When this
|
||||||
model is given, the driver uses the generic codec parser without
|
model is given, the driver uses the generic codec parser without
|
||||||
"codec-patch". It's sometimes good for testing and debugging.
|
"codec-patch". It's sometimes good for testing and debugging.
|
||||||
|
|
||||||
If the default configuration doesn't work and one of the above
|
If the default configuration doesn't work and one of the above
|
||||||
matches with your device, report it together with the PCI
|
matches with your device, report it together with alsa-info.sh
|
||||||
subsystem ID (output of "lspci -nv") to ALSA BTS or alsa-devel
|
output (with --no-upload option) to kernel bugzilla or alsa-devel
|
||||||
ML (see the section "Links and Addresses").
|
ML (see the section "Links and Addresses").
|
||||||
|
|
||||||
power_save and power_save_controller options are for power-saving
|
power_save and power_save_controller options are for power-saving
|
||||||
@ -1650,7 +1350,8 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
|||||||
* AuzenTech X-Meridian
|
* AuzenTech X-Meridian
|
||||||
* Bgears b-Enspirer
|
* Bgears b-Enspirer
|
||||||
* Club3D Theatron DTS
|
* Club3D Theatron DTS
|
||||||
* HT-Omega Claro
|
* HT-Omega Claro (plus)
|
||||||
|
* HT-Omega Claro halo (XT)
|
||||||
* Razer Barracuda AC-1
|
* Razer Barracuda AC-1
|
||||||
* Sondigo Inferno
|
* Sondigo Inferno
|
||||||
|
|
||||||
@ -2407,8 +2108,11 @@ Links and Addresses
|
|||||||
ALSA project homepage
|
ALSA project homepage
|
||||||
http://www.alsa-project.org
|
http://www.alsa-project.org
|
||||||
|
|
||||||
ALSA Bug Tracking System
|
Kernel Bugzilla
|
||||||
https://bugtrack.alsa-project.org/bugs/
|
http://bugzilla.kernel.org/
|
||||||
|
|
||||||
ALSA Developers ML
|
ALSA Developers ML
|
||||||
mailto:alsa-devel@alsa-project.org
|
mailto:alsa-devel@alsa-project.org
|
||||||
|
|
||||||
|
alsa-info.sh script
|
||||||
|
http://www.alsa-project.org/alsa-info.sh
|
||||||
|
348
Documentation/sound/alsa/HD-Audio-Models.txt
Normal file
348
Documentation/sound/alsa/HD-Audio-Models.txt
Normal file
@ -0,0 +1,348 @@
|
|||||||
|
Model name Description
|
||||||
|
---------- -----------
|
||||||
|
ALC880
|
||||||
|
======
|
||||||
|
3stack 3-jack in back and a headphone out
|
||||||
|
3stack-digout 3-jack in back, a HP out and a SPDIF out
|
||||||
|
5stack 5-jack in back, 2-jack in front
|
||||||
|
5stack-digout 5-jack in back, 2-jack in front, a SPDIF out
|
||||||
|
6stack 6-jack in back, 2-jack in front
|
||||||
|
6stack-digout 6-jack with a SPDIF out
|
||||||
|
w810 3-jack
|
||||||
|
z71v 3-jack (HP shared SPDIF)
|
||||||
|
asus 3-jack (ASUS Mobo)
|
||||||
|
asus-w1v ASUS W1V
|
||||||
|
asus-dig ASUS with SPDIF out
|
||||||
|
asus-dig2 ASUS with SPDIF out (using GPIO2)
|
||||||
|
uniwill 3-jack
|
||||||
|
fujitsu Fujitsu Laptops (Pi1536)
|
||||||
|
F1734 2-jack
|
||||||
|
lg LG laptop (m1 express dual)
|
||||||
|
lg-lw LG LW20/LW25 laptop
|
||||||
|
tcl TCL S700
|
||||||
|
clevo Clevo laptops (m520G, m665n)
|
||||||
|
medion Medion Rim 2150
|
||||||
|
test for testing/debugging purpose, almost all controls can be
|
||||||
|
adjusted. Appearing only when compiled with
|
||||||
|
$CONFIG_SND_DEBUG=y
|
||||||
|
auto auto-config reading BIOS (default)
|
||||||
|
|
||||||
|
ALC260
|
||||||
|
======
|
||||||
|
hp HP machines
|
||||||
|
hp-3013 HP machines (3013-variant)
|
||||||
|
hp-dc7600 HP DC7600
|
||||||
|
fujitsu Fujitsu S7020
|
||||||
|
acer Acer TravelMate
|
||||||
|
will Will laptops (PB V7900)
|
||||||
|
replacer Replacer 672V
|
||||||
|
basic fixed pin assignment (old default model)
|
||||||
|
test for testing/debugging purpose, almost all controls can
|
||||||
|
adjusted. Appearing only when compiled with
|
||||||
|
$CONFIG_SND_DEBUG=y
|
||||||
|
auto auto-config reading BIOS (default)
|
||||||
|
|
||||||
|
ALC262
|
||||||
|
======
|
||||||
|
fujitsu Fujitsu Laptop
|
||||||
|
hp-bpc HP xw4400/6400/8400/9400 laptops
|
||||||
|
hp-bpc-d7000 HP BPC D7000
|
||||||
|
hp-tc-t5735 HP Thin Client T5735
|
||||||
|
hp-rp5700 HP RP5700
|
||||||
|
benq Benq ED8
|
||||||
|
benq-t31 Benq T31
|
||||||
|
hippo Hippo (ATI) with jack detection, Sony UX-90s
|
||||||
|
hippo_1 Hippo (Benq) with jack detection
|
||||||
|
sony-assamd Sony ASSAMD
|
||||||
|
toshiba-s06 Toshiba S06
|
||||||
|
toshiba-rx1 Toshiba RX1
|
||||||
|
ultra Samsung Q1 Ultra Vista model
|
||||||
|
lenovo-3000 Lenovo 3000 y410
|
||||||
|
nec NEC Versa S9100
|
||||||
|
basic fixed pin assignment w/o SPDIF
|
||||||
|
auto auto-config reading BIOS (default)
|
||||||
|
|
||||||
|
ALC267/268
|
||||||
|
==========
|
||||||
|
quanta-il1 Quanta IL1 mini-notebook
|
||||||
|
3stack 3-stack model
|
||||||
|
toshiba Toshiba A205
|
||||||
|
acer Acer laptops
|
||||||
|
acer-dmic Acer laptops with digital-mic
|
||||||
|
acer-aspire Acer Aspire One
|
||||||
|
dell Dell OEM laptops (Vostro 1200)
|
||||||
|
zepto Zepto laptops
|
||||||
|
test for testing/debugging purpose, almost all controls can
|
||||||
|
adjusted. Appearing only when compiled with
|
||||||
|
$CONFIG_SND_DEBUG=y
|
||||||
|
auto auto-config reading BIOS (default)
|
||||||
|
|
||||||
|
ALC269
|
||||||
|
======
|
||||||
|
basic Basic preset
|
||||||
|
quanta Quanta FL1
|
||||||
|
eeepc-p703 ASUS Eeepc P703 P900A
|
||||||
|
eeepc-p901 ASUS Eeepc P901 S101
|
||||||
|
fujitsu FSC Amilo
|
||||||
|
auto auto-config reading BIOS (default)
|
||||||
|
|
||||||
|
ALC662/663
|
||||||
|
==========
|
||||||
|
3stack-dig 3-stack (2-channel) with SPDIF
|
||||||
|
3stack-6ch 3-stack (6-channel)
|
||||||
|
3stack-6ch-dig 3-stack (6-channel) with SPDIF
|
||||||
|
6stack-dig 6-stack with SPDIF
|
||||||
|
lenovo-101e Lenovo laptop
|
||||||
|
eeepc-p701 ASUS Eeepc P701
|
||||||
|
eeepc-ep20 ASUS Eeepc EP20
|
||||||
|
ecs ECS/Foxconn mobo
|
||||||
|
m51va ASUS M51VA
|
||||||
|
g71v ASUS G71V
|
||||||
|
h13 ASUS H13
|
||||||
|
g50v ASUS G50V
|
||||||
|
asus-mode1 ASUS
|
||||||
|
asus-mode2 ASUS
|
||||||
|
asus-mode3 ASUS
|
||||||
|
asus-mode4 ASUS
|
||||||
|
asus-mode5 ASUS
|
||||||
|
asus-mode6 ASUS
|
||||||
|
auto auto-config reading BIOS (default)
|
||||||
|
|
||||||
|
ALC882/885
|
||||||
|
==========
|
||||||
|
3stack-dig 3-jack with SPDIF I/O
|
||||||
|
6stack-dig 6-jack digital with SPDIF I/O
|
||||||
|
arima Arima W820Di1
|
||||||
|
targa Targa T8, MSI-1049 T8
|
||||||
|
asus-a7j ASUS A7J
|
||||||
|
asus-a7m ASUS A7M
|
||||||
|
macpro MacPro support
|
||||||
|
mbp3 Macbook Pro rev3
|
||||||
|
imac24 iMac 24'' with jack detection
|
||||||
|
w2jc ASUS W2JC
|
||||||
|
auto auto-config reading BIOS (default)
|
||||||
|
|
||||||
|
ALC883/888
|
||||||
|
==========
|
||||||
|
3stack-dig 3-jack with SPDIF I/O
|
||||||
|
6stack-dig 6-jack digital with SPDIF I/O
|
||||||
|
3stack-6ch 3-jack 6-channel
|
||||||
|
3stack-6ch-dig 3-jack 6-channel with SPDIF I/O
|
||||||
|
6stack-dig-demo 6-jack digital for Intel demo board
|
||||||
|
acer Acer laptops (Travelmate 3012WTMi, Aspire 5600, etc)
|
||||||
|
acer-aspire Acer Aspire 9810
|
||||||
|
acer-aspire-4930g Acer Aspire 4930G
|
||||||
|
medion Medion Laptops
|
||||||
|
medion-md2 Medion MD2
|
||||||
|
targa-dig Targa/MSI
|
||||||
|
targa-2ch-dig Targs/MSI with 2-channel
|
||||||
|
laptop-eapd 3-jack with SPDIF I/O and EAPD (Clevo M540JE, M550JE)
|
||||||
|
lenovo-101e Lenovo 101E
|
||||||
|
lenovo-nb0763 Lenovo NB0763
|
||||||
|
lenovo-ms7195-dig Lenovo MS7195
|
||||||
|
lenovo-sky Lenovo Sky
|
||||||
|
haier-w66 Haier W66
|
||||||
|
3stack-hp HP machines with 3stack (Lucknow, Samba boards)
|
||||||
|
6stack-dell Dell machines with 6stack (Inspiron 530)
|
||||||
|
mitac Mitac 8252D
|
||||||
|
clevo-m720 Clevo M720 laptop series
|
||||||
|
fujitsu-pi2515 Fujitsu AMILO Pi2515
|
||||||
|
fujitsu-xa3530 Fujitsu AMILO XA3530
|
||||||
|
3stack-6ch-intel Intel DG33* boards
|
||||||
|
auto auto-config reading BIOS (default)
|
||||||
|
|
||||||
|
ALC861/660
|
||||||
|
==========
|
||||||
|
3stack 3-jack
|
||||||
|
3stack-dig 3-jack with SPDIF I/O
|
||||||
|
6stack-dig 6-jack with SPDIF I/O
|
||||||
|
3stack-660 3-jack (for ALC660)
|
||||||
|
uniwill-m31 Uniwill M31 laptop
|
||||||
|
toshiba Toshiba laptop support
|
||||||
|
asus Asus laptop support
|
||||||
|
asus-laptop ASUS F2/F3 laptops
|
||||||
|
auto auto-config reading BIOS (default)
|
||||||
|
|
||||||
|
ALC861VD/660VD
|
||||||
|
==============
|
||||||
|
3stack 3-jack
|
||||||
|
3stack-dig 3-jack with SPDIF OUT
|
||||||
|
6stack-dig 6-jack with SPDIF OUT
|
||||||
|
3stack-660 3-jack (for ALC660VD)
|
||||||
|
3stack-660-digout 3-jack with SPDIF OUT (for ALC660VD)
|
||||||
|
lenovo Lenovo 3000 C200
|
||||||
|
dallas Dallas laptops
|
||||||
|
hp HP TX1000
|
||||||
|
asus-v1s ASUS V1Sn
|
||||||
|
auto auto-config reading BIOS (default)
|
||||||
|
|
||||||
|
CMI9880
|
||||||
|
=======
|
||||||
|
minimal 3-jack in back
|
||||||
|
min_fp 3-jack in back, 2-jack in front
|
||||||
|
full 6-jack in back, 2-jack in front
|
||||||
|
full_dig 6-jack in back, 2-jack in front, SPDIF I/O
|
||||||
|
allout 5-jack in back, 2-jack in front, SPDIF out
|
||||||
|
auto auto-config reading BIOS (default)
|
||||||
|
|
||||||
|
AD1882 / AD1882A
|
||||||
|
================
|
||||||
|
3stack 3-stack mode (default)
|
||||||
|
6stack 6-stack mode
|
||||||
|
|
||||||
|
AD1884A / AD1883 / AD1984A / AD1984B
|
||||||
|
====================================
|
||||||
|
desktop 3-stack desktop (default)
|
||||||
|
laptop laptop with HP jack sensing
|
||||||
|
mobile mobile devices with HP jack sensing
|
||||||
|
thinkpad Lenovo Thinkpad X300
|
||||||
|
|
||||||
|
AD1884
|
||||||
|
======
|
||||||
|
N/A
|
||||||
|
|
||||||
|
AD1981
|
||||||
|
======
|
||||||
|
basic 3-jack (default)
|
||||||
|
hp HP nx6320
|
||||||
|
thinkpad Lenovo Thinkpad T60/X60/Z60
|
||||||
|
toshiba Toshiba U205
|
||||||
|
|
||||||
|
AD1983
|
||||||
|
======
|
||||||
|
N/A
|
||||||
|
|
||||||
|
AD1984
|
||||||
|
======
|
||||||
|
basic default configuration
|
||||||
|
thinkpad Lenovo Thinkpad T61/X61
|
||||||
|
dell Dell T3400
|
||||||
|
|
||||||
|
AD1986A
|
||||||
|
=======
|
||||||
|
6stack 6-jack, separate surrounds (default)
|
||||||
|
3stack 3-stack, shared surrounds
|
||||||
|
laptop 2-channel only (FSC V2060, Samsung M50)
|
||||||
|
laptop-eapd 2-channel with EAPD (ASUS A6J)
|
||||||
|
laptop-automute 2-channel with EAPD and HP-automute (Lenovo N100)
|
||||||
|
ultra 2-channel with EAPD (Samsung Ultra tablet PC)
|
||||||
|
samsung 2-channel with EAPD (Samsung R65)
|
||||||
|
|
||||||
|
AD1988/AD1988B/AD1989A/AD1989B
|
||||||
|
==============================
|
||||||
|
6stack 6-jack
|
||||||
|
6stack-dig ditto with SPDIF
|
||||||
|
3stack 3-jack
|
||||||
|
3stack-dig ditto with SPDIF
|
||||||
|
laptop 3-jack with hp-jack automute
|
||||||
|
laptop-dig ditto with SPDIF
|
||||||
|
auto auto-config reading BIOS (default)
|
||||||
|
|
||||||
|
Conexant 5045
|
||||||
|
=============
|
||||||
|
laptop-hpsense Laptop with HP sense (old model laptop)
|
||||||
|
laptop-micsense Laptop with Mic sense (old model fujitsu)
|
||||||
|
laptop-hpmicsense Laptop with HP and Mic senses
|
||||||
|
benq Benq R55E
|
||||||
|
test for testing/debugging purpose, almost all controls
|
||||||
|
can be adjusted. Appearing only when compiled with
|
||||||
|
$CONFIG_SND_DEBUG=y
|
||||||
|
|
||||||
|
Conexant 5047
|
||||||
|
=============
|
||||||
|
laptop Basic Laptop config
|
||||||
|
laptop-hp Laptop config for some HP models (subdevice 30A5)
|
||||||
|
laptop-eapd Laptop config with EAPD support
|
||||||
|
test for testing/debugging purpose, almost all controls
|
||||||
|
can be adjusted. Appearing only when compiled with
|
||||||
|
$CONFIG_SND_DEBUG=y
|
||||||
|
|
||||||
|
Conexant 5051
|
||||||
|
=============
|
||||||
|
laptop Basic Laptop config (default)
|
||||||
|
hp HP Spartan laptop
|
||||||
|
|
||||||
|
STAC9200
|
||||||
|
========
|
||||||
|
ref Reference board
|
||||||
|
dell-d21 Dell (unknown)
|
||||||
|
dell-d22 Dell (unknown)
|
||||||
|
dell-d23 Dell (unknown)
|
||||||
|
dell-m21 Dell Inspiron 630m, Dell Inspiron 640m
|
||||||
|
dell-m22 Dell Latitude D620, Dell Latitude D820
|
||||||
|
dell-m23 Dell XPS M1710, Dell Precision M90
|
||||||
|
dell-m24 Dell Latitude 120L
|
||||||
|
dell-m25 Dell Inspiron E1505n
|
||||||
|
dell-m26 Dell Inspiron 1501
|
||||||
|
dell-m27 Dell Inspiron E1705/9400
|
||||||
|
gateway Gateway laptops with EAPD control
|
||||||
|
panasonic Panasonic CF-74
|
||||||
|
|
||||||
|
STAC9205/9254
|
||||||
|
=============
|
||||||
|
ref Reference board
|
||||||
|
dell-m42 Dell (unknown)
|
||||||
|
dell-m43 Dell Precision
|
||||||
|
dell-m44 Dell Inspiron
|
||||||
|
|
||||||
|
STAC9220/9221
|
||||||
|
=============
|
||||||
|
ref Reference board
|
||||||
|
3stack D945 3stack
|
||||||
|
5stack D945 5stack + SPDIF
|
||||||
|
intel-mac-v1 Intel Mac Type 1
|
||||||
|
intel-mac-v2 Intel Mac Type 2
|
||||||
|
intel-mac-v3 Intel Mac Type 3
|
||||||
|
intel-mac-v4 Intel Mac Type 4
|
||||||
|
intel-mac-v5 Intel Mac Type 5
|
||||||
|
intel-mac-auto Intel Mac (detect type according to subsystem id)
|
||||||
|
macmini Intel Mac Mini (equivalent with type 3)
|
||||||
|
macbook Intel Mac Book (eq. type 5)
|
||||||
|
macbook-pro-v1 Intel Mac Book Pro 1st generation (eq. type 3)
|
||||||
|
macbook-pro Intel Mac Book Pro 2nd generation (eq. type 3)
|
||||||
|
imac-intel Intel iMac (eq. type 2)
|
||||||
|
imac-intel-20 Intel iMac (newer version) (eq. type 3)
|
||||||
|
dell-d81 Dell (unknown)
|
||||||
|
dell-d82 Dell (unknown)
|
||||||
|
dell-m81 Dell (unknown)
|
||||||
|
dell-m82 Dell XPS M1210
|
||||||
|
|
||||||
|
STAC9202/9250/9251
|
||||||
|
==================
|
||||||
|
ref Reference board, base config
|
||||||
|
m2-2 Some Gateway MX series laptops
|
||||||
|
m6 Some Gateway NX series laptops
|
||||||
|
pa6 Gateway NX860 series
|
||||||
|
|
||||||
|
STAC9227/9228/9229/927x
|
||||||
|
=======================
|
||||||
|
ref Reference board
|
||||||
|
ref-no-jd Reference board without HP/Mic jack detection
|
||||||
|
3stack D965 3stack
|
||||||
|
5stack D965 5stack + SPDIF
|
||||||
|
dell-3stack Dell Dimension E520
|
||||||
|
dell-bios Fixes with Dell BIOS setup
|
||||||
|
|
||||||
|
STAC92HD71B*
|
||||||
|
============
|
||||||
|
ref Reference board
|
||||||
|
dell-m4-1 Dell desktops
|
||||||
|
dell-m4-2 Dell desktops
|
||||||
|
dell-m4-3 Dell desktops
|
||||||
|
|
||||||
|
STAC92HD73*
|
||||||
|
===========
|
||||||
|
ref Reference board
|
||||||
|
no-jd BIOS setup but without jack-detection
|
||||||
|
dell-m6-amic Dell desktops/laptops with analog mics
|
||||||
|
dell-m6-dmic Dell desktops/laptops with digital mics
|
||||||
|
dell-m6 Dell desktops/laptops with both type of mics
|
||||||
|
|
||||||
|
STAC92HD83*
|
||||||
|
===========
|
||||||
|
ref Reference board
|
||||||
|
|
||||||
|
STAC9872
|
||||||
|
========
|
||||||
|
vaio Setup for VAIO FE550G/SZ110
|
||||||
|
vaio-ar Setup for VAIO AR
|
577
Documentation/sound/alsa/HD-Audio.txt
Normal file
577
Documentation/sound/alsa/HD-Audio.txt
Normal file
@ -0,0 +1,577 @@
|
|||||||
|
MORE NOTES ON HD-AUDIO DRIVER
|
||||||
|
=============================
|
||||||
|
Takashi Iwai <tiwai@suse.de>
|
||||||
|
|
||||||
|
|
||||||
|
GENERAL
|
||||||
|
-------
|
||||||
|
|
||||||
|
HD-audio is the new standard on-board audio component on modern PCs
|
||||||
|
after AC97. Although Linux has been supporting HD-audio since long
|
||||||
|
time ago, there are often problems with new machines. A part of the
|
||||||
|
problem is broken BIOS, and the rest is the driver implementation.
|
||||||
|
This document explains the brief trouble-shooting and debugging
|
||||||
|
methods for the HD-audio hardware.
|
||||||
|
|
||||||
|
The HD-audio component consists of two parts: the controller chip and
|
||||||
|
the codec chips on the HD-audio bus. Linux provides a single driver
|
||||||
|
for all controllers, snd-hda-intel. Although the driver name contains
|
||||||
|
a word of a well-known harware vendor, it's not specific to it but for
|
||||||
|
all controller chips by other companies. Since the HD-audio
|
||||||
|
controllers are supposed to be compatible, the single snd-hda-driver
|
||||||
|
should work in most cases. But, not surprisingly, there are known
|
||||||
|
bugs and issues specific to each controller type. The snd-hda-intel
|
||||||
|
driver has a bunch of workarounds for these as described below.
|
||||||
|
|
||||||
|
A controller may have multiple codecs. Usually you have one audio
|
||||||
|
codec and optionally one modem codec. In theory, there might be
|
||||||
|
multiple audio codecs, e.g. for analog and digital outputs, and the
|
||||||
|
driver might not work properly because of conflict of mixer elements.
|
||||||
|
This should be fixed in future if such hardware really exists.
|
||||||
|
|
||||||
|
The snd-hda-intel driver has several different codec parsers depending
|
||||||
|
on the codec. It has a generic parser as a fallback, but this
|
||||||
|
functionality is fairly limited until now. Instead of the generic
|
||||||
|
parser, usually the codec-specific parser (coded in patch_*.c) is used
|
||||||
|
for the codec-specific implementations. The details about the
|
||||||
|
codec-specific problems are explained in the later sections.
|
||||||
|
|
||||||
|
If you are interested in the deep debugging of HD-audio, read the
|
||||||
|
HD-audio specification at first. The specification is found on
|
||||||
|
Intel's web page, for example:
|
||||||
|
|
||||||
|
- http://www.intel.com/standards/hdaudio/
|
||||||
|
|
||||||
|
|
||||||
|
HD-AUDIO CONTROLLER
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
DMA-Position Problem
|
||||||
|
~~~~~~~~~~~~~~~~~~~~
|
||||||
|
The most common problem of the controller is the inaccurate DMA
|
||||||
|
pointer reporting. The DMA pointer for playback and capture can be
|
||||||
|
read in two ways, either via a LPIB register or via a position-buffer
|
||||||
|
map. As default the driver tries to read from the io-mapped
|
||||||
|
position-buffer, and falls back to LPIB if the position-buffer appears
|
||||||
|
dead. However, this detection isn't perfect on some devices. In such
|
||||||
|
a case, you can change the default method via `position_fix` option.
|
||||||
|
|
||||||
|
`position_fix=1` means to use LPIB method explicitly.
|
||||||
|
`position_fix=2` means to use the position-buffer. 0 is the default
|
||||||
|
value, the automatic check and fallback to LPIB as described in the
|
||||||
|
above. If you get a problem of repeated sounds, this option might
|
||||||
|
help.
|
||||||
|
|
||||||
|
In addition to that, every controller is known to be broken regarding
|
||||||
|
the wake-up timing. It wakes up a few samples before actually
|
||||||
|
processing the data on the buffer. This caused a lot of problems, for
|
||||||
|
example, with ALSA dmix or JACK. Since 2.6.27 kernel, the driver puts
|
||||||
|
an artificial delay to the wake up timing. This delay is controlled
|
||||||
|
via `bdl_pos_adj` option.
|
||||||
|
|
||||||
|
When `bdl_pos_adj` is a negative value (as default), it's assigned to
|
||||||
|
an appropriate value depending on the controller chip. For Intel
|
||||||
|
chips, it'd be 1 while it'd be 32 for others. Usually this works.
|
||||||
|
Only in case it doesn't work and you get warning messages, you should
|
||||||
|
change this parameter to other values.
|
||||||
|
|
||||||
|
|
||||||
|
Codec-Probing Problem
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
A less often but a more severe problem is the codec probing. When
|
||||||
|
BIOS reports the available codec slots wrongly, the driver gets
|
||||||
|
confused and tries to access the non-existing codec slot. This often
|
||||||
|
results in the total screw-up, and destructs the further communication
|
||||||
|
with the codec chips. The symptom appears usually as error messages
|
||||||
|
like:
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
hda_intel: azx_get_response timeout, switching to polling mode:
|
||||||
|
last cmd=0x12345678
|
||||||
|
hda_intel: azx_get_response timeout, switching to single_cmd mode:
|
||||||
|
last cmd=0x12345678
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
|
||||||
|
The first line is a warning, and this is usually relatively harmless.
|
||||||
|
It means that the codec response isn't notified via an IRQ. The
|
||||||
|
driver uses explicit polling method to read the response. It gives
|
||||||
|
very slight CPU overhead, but you'd unlikely notice it.
|
||||||
|
|
||||||
|
The second line is, however, a fatal error. If this happens, usually
|
||||||
|
it means that something is really wrong. Most likely you are
|
||||||
|
accessing a non-existing codec slot.
|
||||||
|
|
||||||
|
Thus, if the second error message appears, try to narrow the probed
|
||||||
|
codec slots via `probe_mask` option. It's a bitmask, and each bit
|
||||||
|
corresponds to the codec slot. For example, to probe only the first
|
||||||
|
slot, pass `probe_mask=1`. For the first and the third slots, pass
|
||||||
|
`probe_mask=5` (where 5 = 1 | 4), and so on.
|
||||||
|
|
||||||
|
Since 2.6.29 kernel, the driver has a more robust probing method, so
|
||||||
|
this error might happen rarely, though.
|
||||||
|
|
||||||
|
|
||||||
|
Interrupt Handling
|
||||||
|
~~~~~~~~~~~~~~~~~~
|
||||||
|
In rare but some cases, the interrupt isn't properly handled as
|
||||||
|
default. You would notice this by the DMA transfer error reported by
|
||||||
|
ALSA PCM core, for example. Using MSI might help in such a case.
|
||||||
|
Pass `enable_msi=1` option for enabling MSI.
|
||||||
|
|
||||||
|
|
||||||
|
HD-AUDIO CODEC
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Model Option
|
||||||
|
~~~~~~~~~~~~
|
||||||
|
The most common problem regarding the HD-audio driver is the
|
||||||
|
unsupported codec features or the mismatched device configuration.
|
||||||
|
Most of codec-specific code has several preset models, either to
|
||||||
|
override the BIOS setup or to provide more comprehensive features.
|
||||||
|
|
||||||
|
The driver checks PCI SSID and looks through the static configuration
|
||||||
|
table until any matching entry is found. If you have a new machine,
|
||||||
|
you may see a message like below:
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
hda_codec: Unknown model for ALC880, trying auto-probe from BIOS...
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
Even if you see such a message, DON'T PANIC. Take a deep breath and
|
||||||
|
keep your towel. First of all, it's an informational message, no
|
||||||
|
warning, no error. This means that the PCI SSID of your device isn't
|
||||||
|
listed in the known preset model (white-)list. But, this doesn't mean
|
||||||
|
that the driver is broken. Many codec-drivers provide the automatic
|
||||||
|
configuration mechanism based on the BIOS setup.
|
||||||
|
|
||||||
|
The HD-audio codec has usually "pin" widgets, and BIOS sets the default
|
||||||
|
configuration of each pin, which indicates the location, the
|
||||||
|
connection type, the jack color, etc. The HD-audio driver can guess
|
||||||
|
the right connection judging from these default configuration values.
|
||||||
|
However -- some codec-support codes, such as patch_analog.c, don't
|
||||||
|
support the automatic probing (yet as of 2.6.28). And, BIOS is often,
|
||||||
|
yes, pretty often broken. It sets up wrong values and screws up the
|
||||||
|
driver.
|
||||||
|
|
||||||
|
The preset model is provided basically to overcome such a situation.
|
||||||
|
When the matching preset model is found in the white-list, the driver
|
||||||
|
assumes the static configuration of that preset and builds the mixer
|
||||||
|
elements and PCM streams based on the static information. Thus, if
|
||||||
|
you have a newer machine with a slightly different PCI SSID from the
|
||||||
|
existing one, you may have a good chance to re-use the same model.
|
||||||
|
You can pass the `model` option to specify the preset model instead of
|
||||||
|
PCI SSID look-up.
|
||||||
|
|
||||||
|
What `model` option values are available depends on the codec chip.
|
||||||
|
Check your codec chip from the codec proc file (see "Codec Proc-File"
|
||||||
|
section below). It will show the vendor/product name of your codec
|
||||||
|
chip. Then, see Documentation/sound/alsa/HD-Audio-Modelstxt file,
|
||||||
|
the section of HD-audio driver. You can find a list of codecs
|
||||||
|
and `model` options belonging to each codec. For example, for Realtek
|
||||||
|
ALC262 codec chip, pass `model=ultra` for devices that are compatible
|
||||||
|
with Samsung Q1 Ultra.
|
||||||
|
|
||||||
|
Thus, the first thing you can do for any brand-new, unsupported and
|
||||||
|
non-working HD-audio hardware is to check HD-audio codec and several
|
||||||
|
different `model` option values. If you have a luck, some of them
|
||||||
|
might suit with your device well.
|
||||||
|
|
||||||
|
Some codecs such as ALC880 have a special model option `model=test`.
|
||||||
|
This configures the driver to provide as many mixer controls as
|
||||||
|
possible for every single pin feature except for the unsolicited
|
||||||
|
events (and maybe some other specials). Adjust each mixer element and
|
||||||
|
try the I/O in the way of trial-and-error until figuring out the whole
|
||||||
|
I/O pin mappings.
|
||||||
|
|
||||||
|
Note that `model=generic` has a special meaning. It means to use the
|
||||||
|
generic parser regardless of the codec. Usually the codec-specific
|
||||||
|
parser is much better than the generic parser (as now). Thus this
|
||||||
|
option is more about the debugging purpose.
|
||||||
|
|
||||||
|
|
||||||
|
Speaker and Headphone Output
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
One of the most frequent (and obvious) bugs with HD-audio is the
|
||||||
|
silent output from either or both of a built-in speaker and a
|
||||||
|
headphone jack. In general, you should try a headphone output at
|
||||||
|
first. A speaker output often requires more additional controls like
|
||||||
|
the external amplifier bits. Thus a headphone output has a slightly
|
||||||
|
better chance.
|
||||||
|
|
||||||
|
Before making a bug report, double-check whether the mixer is set up
|
||||||
|
correctly. The recent version of snd-hda-intel driver provides mostly
|
||||||
|
"Master" volume control as well as "Front" volume (where Front
|
||||||
|
indicates the front-channels). In addition, there can be individual
|
||||||
|
"Headphone" and "Speaker" controls.
|
||||||
|
|
||||||
|
Ditto for the speaker output. There can be "External Amplifier"
|
||||||
|
switch on some codecs. Turn on this if present.
|
||||||
|
|
||||||
|
Another related problem is the automatic mute of speaker output by
|
||||||
|
headphone plugging. This feature is implemented in most cases, but
|
||||||
|
not on every preset model or codec-support code.
|
||||||
|
|
||||||
|
In anyway, try a different model option if you have such a problem.
|
||||||
|
Some other models may match better and give you more matching
|
||||||
|
functionality. If none of the available models works, send a bug
|
||||||
|
report. See the bug report section for details.
|
||||||
|
|
||||||
|
If you are masochistic enough to debug the driver problem, note the
|
||||||
|
following:
|
||||||
|
|
||||||
|
- The speaker (and the headphone, too) output often requires the
|
||||||
|
external amplifier. This can be set usually via EAPD verb or a
|
||||||
|
certain GPIO. If the codec pin supports EAPD, you have a better
|
||||||
|
chance via SET_EAPD_BTL verb (0x70c). On others, GPIO pin (mostly
|
||||||
|
it's either GPIO0 or GPIO1) may turn on/off EAPD.
|
||||||
|
- Some Realtek codecs require special vendor-specific coefficients to
|
||||||
|
turn on the amplifier. See patch_realtek.c.
|
||||||
|
- IDT codecs may have extra power-enable/disable controls on each
|
||||||
|
analog pin. See patch_sigmatel.c.
|
||||||
|
- Very rare but some devices don't accept the pin-detection verb until
|
||||||
|
triggered. Issuing GET_PIN_SENSE verb (0xf09) may result in the
|
||||||
|
codec-communication stall. Some examples are found in
|
||||||
|
patch_realtek.c.
|
||||||
|
|
||||||
|
|
||||||
|
Capture Problems
|
||||||
|
~~~~~~~~~~~~~~~~
|
||||||
|
The capture problems are often because of missing setups of mixers.
|
||||||
|
Thus, before submitting a bug report, make sure that you set up the
|
||||||
|
mixer correctly. For example, both "Capture Volume" and "Capture
|
||||||
|
Switch" have to be set properly in addition to the right "Capture
|
||||||
|
Source" or "Input Source" selection. Some devices have "Mic Boost"
|
||||||
|
volume or switch.
|
||||||
|
|
||||||
|
When the PCM device is opened via "default" PCM (without pulse-audio
|
||||||
|
plugin), you'll likely have "Digital Capture Volume" control as well.
|
||||||
|
This is provided for the extra gain/attenuation of the signal in
|
||||||
|
software, especially for the inputs without the hardware volume
|
||||||
|
control such as digital microphones. Unless really needed, this
|
||||||
|
should be set to exactly 50%, corresponding to 0dB -- neither extra
|
||||||
|
gain nor attenuation. When you use "hw" PCM, i.e., a raw access PCM,
|
||||||
|
this control will have no influence, though.
|
||||||
|
|
||||||
|
It's known that some codecs / devices have fairly bad analog circuits,
|
||||||
|
and the recorded sound contains a certain DC-offset. This is no bug
|
||||||
|
of the driver.
|
||||||
|
|
||||||
|
Most of modern laptops have no analog CD-input connection. Thus, the
|
||||||
|
recording from CD input won't work in many cases although the driver
|
||||||
|
provides it as the capture source. Use CDDA instead.
|
||||||
|
|
||||||
|
The automatic switching of the built-in and external mic per plugging
|
||||||
|
is implemented on some codec models but not on every model. Partly
|
||||||
|
because of my laziness but mostly lack of testers. Feel free to
|
||||||
|
submit the improvement patch to the author.
|
||||||
|
|
||||||
|
|
||||||
|
Direct Debugging
|
||||||
|
~~~~~~~~~~~~~~~~
|
||||||
|
If no model option gives you a better result, and you are a tough guy
|
||||||
|
to fight against evil, try debugging via hitting the raw HD-audio
|
||||||
|
codec verbs to the device. Some tools are available: hda-emu and
|
||||||
|
hda-analyzer. The detailed description is found in the sections
|
||||||
|
below. You'd need to enable hwdep for using these tools. See "Kernel
|
||||||
|
Configuration" section.
|
||||||
|
|
||||||
|
|
||||||
|
OTHER ISSUES
|
||||||
|
------------
|
||||||
|
|
||||||
|
Kernel Configuration
|
||||||
|
~~~~~~~~~~~~~~~~~~~~
|
||||||
|
In general, I recommend you to enable the sound debug option,
|
||||||
|
`CONFIG_SND_DEBUG=y`, no matter whether you are debugging or not.
|
||||||
|
This enables snd_printd() macro and others, and you'll get additional
|
||||||
|
kernel messages at probing.
|
||||||
|
|
||||||
|
In addition, you can enable `CONFIG_SND_DEBUG_VERBOSE=y`. But this
|
||||||
|
will give you far more messages. Thus turn this on only when you are
|
||||||
|
sure to want it.
|
||||||
|
|
||||||
|
Don't forget to turn on the appropriate `CONFIG_SND_HDA_CODEC_*`
|
||||||
|
options. Note that each of them corresponds to the codec chip, not
|
||||||
|
the controller chip. Thus, even if lspci shows the Nvidia controller,
|
||||||
|
you may need to choose the option for other vendors. If you are
|
||||||
|
unsure, just select all yes.
|
||||||
|
|
||||||
|
`CONFIG_SND_HDA_HWDEP` is a useful option for debugging the driver.
|
||||||
|
When this is enabled, the driver creates hardware-dependent devices
|
||||||
|
(one per each codec), and you have a raw access to the device via
|
||||||
|
these device files. For example, `hwC0D2` will be created for the
|
||||||
|
codec slot #2 of the first card (#0). For debug-tools such as
|
||||||
|
hda-verb and hda-analyzer, the hwdep device has to be enabled.
|
||||||
|
Thus, it'd be better to turn this on always.
|
||||||
|
|
||||||
|
`CONFIG_SND_HDA_RECONFIG` is a new option, and this depends on the
|
||||||
|
hwdep option above. When enabled, you'll have some sysfs files under
|
||||||
|
the corresponding hwdep directory. See "HD-audio reconfiguration"
|
||||||
|
section below.
|
||||||
|
|
||||||
|
`CONFIG_SND_HDA_POWER_SAVE` option enables the power-saving feature.
|
||||||
|
See "Power-saving" section below.
|
||||||
|
|
||||||
|
|
||||||
|
Codec Proc-File
|
||||||
|
~~~~~~~~~~~~~~~
|
||||||
|
The codec proc-file is a treasure-chest for debugging HD-audio.
|
||||||
|
It shows most of useful information of each codec widget.
|
||||||
|
|
||||||
|
The proc file is located in /proc/asound/card*/codec#*, one file per
|
||||||
|
each codec slot. You can know the codec vendor, product id and
|
||||||
|
names, the type of each widget, capabilities and so on.
|
||||||
|
This file, however, doesn't show the jack sensing state, so far. This
|
||||||
|
is because the jack-sensing might be depending on the trigger state.
|
||||||
|
|
||||||
|
This file will be picked up by the debug tools, and also it can be fed
|
||||||
|
to the emulator as the primary codec information. See the debug tools
|
||||||
|
section below.
|
||||||
|
|
||||||
|
This proc file can be also used to check whether the generic parser is
|
||||||
|
used. When the generic parser is used, the vendor/product ID name
|
||||||
|
will appear as "Realtek ID 0262", instead of "Realtek ALC262".
|
||||||
|
|
||||||
|
|
||||||
|
HD-Audio Reconfiguration
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
This is an experimental feature to allow you re-configure the HD-audio
|
||||||
|
codec dynamically without reloading the driver. The following sysfs
|
||||||
|
files are available under each codec-hwdep device directory (e.g.
|
||||||
|
/sys/class/sound/hwC0D0):
|
||||||
|
|
||||||
|
vendor_id::
|
||||||
|
Shows the 32bit codec vendor-id hex number. You can change the
|
||||||
|
vendor-id value by writing to this file.
|
||||||
|
subsystem_id::
|
||||||
|
Shows the 32bit codec subsystem-id hex number. You can change the
|
||||||
|
subsystem-id value by writing to this file.
|
||||||
|
revision_id::
|
||||||
|
Shows the 32bit codec revision-id hex number. You can change the
|
||||||
|
revision-id value by writing to this file.
|
||||||
|
afg::
|
||||||
|
Shows the AFG ID. This is read-only.
|
||||||
|
mfg::
|
||||||
|
Shows the MFG ID. This is read-only.
|
||||||
|
name::
|
||||||
|
Shows the codec name string. Can be changed by writing to this
|
||||||
|
file.
|
||||||
|
modelname::
|
||||||
|
Shows the currently set `model` option. Can be changed by writing
|
||||||
|
to this file.
|
||||||
|
init_verbs::
|
||||||
|
The extra verbs to execute at initialization. You can add a verb by
|
||||||
|
writing to this file. Pass tree numbers, nid, verb and parameter.
|
||||||
|
hints::
|
||||||
|
Shows hint strings for codec parsers for any use. Right now it's
|
||||||
|
not used.
|
||||||
|
reconfig::
|
||||||
|
Triggers the codec re-configuration. When any value is written to
|
||||||
|
this file, the driver re-initialize and parses the codec tree
|
||||||
|
again. All the changes done by the sysfs entries above are taken
|
||||||
|
into account.
|
||||||
|
clear::
|
||||||
|
Resets the codec, removes the mixer elements and PCM stuff of the
|
||||||
|
specified codec, and clear all init verbs and hints.
|
||||||
|
|
||||||
|
|
||||||
|
Power-Saving
|
||||||
|
~~~~~~~~~~~~
|
||||||
|
The power-saving is a kind of auto-suspend of the device. When the
|
||||||
|
device is inactive for a certain time, the device is automatically
|
||||||
|
turned off to save the power. The time to go down is specified via
|
||||||
|
`power_save` module option, and this option can be changed dynamically
|
||||||
|
via sysfs.
|
||||||
|
|
||||||
|
The power-saving won't work when the analog loopback is enabled on
|
||||||
|
some codecs. Make sure that you mute all unneeded signal routes when
|
||||||
|
you want the power-saving.
|
||||||
|
|
||||||
|
The power-saving feature might cause audible click noises at each
|
||||||
|
power-down/up depending on the device. Some of them might be
|
||||||
|
solvable, but some are hard, I'm afraid. Some distros such as
|
||||||
|
openSUSE enables the power-saving feature automatically when the power
|
||||||
|
cable is unplugged. Thus, if you hear noises, suspect first the
|
||||||
|
power-saving. See /sys/module/snd_hda_intel/parameters/power_save to
|
||||||
|
check the current value. If it's non-zero, the feature is turned on.
|
||||||
|
|
||||||
|
|
||||||
|
Development Tree
|
||||||
|
~~~~~~~~~~~~~~~~
|
||||||
|
The latest development codes for HD-audio are found on sound git tree:
|
||||||
|
|
||||||
|
- git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6.git
|
||||||
|
|
||||||
|
The master branch or for-next branches can be used as the main
|
||||||
|
development branches in general while the HD-audio specific patches
|
||||||
|
are committed in topic/hda branch.
|
||||||
|
|
||||||
|
If you are using the latest Linus tree, it'd be better to pull the
|
||||||
|
above GIT tree onto it. If you are using the older kernels, an easy
|
||||||
|
way to try the latest ALSA code is to build from the snapshot
|
||||||
|
tarball. There are daily tarballs and the latest snapshot tarball.
|
||||||
|
All can be built just like normal alsa-driver release packages, that
|
||||||
|
is, installed via the usual spells: configure, make and make
|
||||||
|
install(-modules). See INSTALL in the package. The snapshot tarballs
|
||||||
|
are found at:
|
||||||
|
|
||||||
|
- ftp://ftp.kernel.org/pub/linux/kernel/people/tiwai/snapshot/
|
||||||
|
|
||||||
|
|
||||||
|
Sending a Bug Report
|
||||||
|
~~~~~~~~~~~~~~~~~~~~
|
||||||
|
If any model or module options don't work for your device, it's time
|
||||||
|
to send a bug report to the developers. Give the following in your
|
||||||
|
bug report:
|
||||||
|
|
||||||
|
- Hardware vendor, product and model names
|
||||||
|
- Kernel version (and ALSA-driver version if you built externally)
|
||||||
|
- `alsa-info.sh` output; run with `--no-upload` option. See the
|
||||||
|
section below about alsa-info
|
||||||
|
|
||||||
|
If it's a regression, at best, send alsa-info outputs of both working
|
||||||
|
and non-working kernels. This is really helpful because we can
|
||||||
|
compare the codec registers directly.
|
||||||
|
|
||||||
|
Send a bug report either the followings:
|
||||||
|
|
||||||
|
kernel-bugzilla::
|
||||||
|
http://bugme.linux-foundation.org/
|
||||||
|
alsa-devel ML::
|
||||||
|
alsa-devel@alsa-project.org
|
||||||
|
|
||||||
|
|
||||||
|
DEBUG TOOLS
|
||||||
|
-----------
|
||||||
|
|
||||||
|
This section describes some tools available for debugging HD-audio
|
||||||
|
problems.
|
||||||
|
|
||||||
|
alsa-info
|
||||||
|
~~~~~~~~~
|
||||||
|
The script `alsa-info.sh` is a very useful tool to gather the audio
|
||||||
|
device information. You can fetch the latest version from:
|
||||||
|
|
||||||
|
- http://www.alsa-project.org/alsa-info.sh
|
||||||
|
|
||||||
|
Run this script as root, and it will gather the important information
|
||||||
|
such as the module lists, module parameters, proc file contents
|
||||||
|
including the codec proc files, mixer outputs and the control
|
||||||
|
elements. As default, it will store the information onto a web server
|
||||||
|
on alsa-project.org. But, if you send a bug report, it'd be better to
|
||||||
|
run with `--no-upload` option, and attach the generated file.
|
||||||
|
|
||||||
|
There are some other useful options. See `--help` option output for
|
||||||
|
details.
|
||||||
|
|
||||||
|
|
||||||
|
hda-verb
|
||||||
|
~~~~~~~~
|
||||||
|
hda-verb is a tiny program that allows you to access the HD-audio
|
||||||
|
codec directly. You can execute a raw HD-audio codec verb with this.
|
||||||
|
This program accesses the hwdep device, thus you need to enable the
|
||||||
|
kernel config `CONFIG_SND_HDA_HWDEP=y` beforehand.
|
||||||
|
|
||||||
|
The hda-verb program takes four arguments: the hwdep device file, the
|
||||||
|
widget NID, the verb and the parameter. When you access to the codec
|
||||||
|
on the slot 2 of the card 0, pass /dev/snd/hwC0D2 to the first
|
||||||
|
argument, typically. (However, the real path name depends on the
|
||||||
|
system.)
|
||||||
|
|
||||||
|
The second parameter is the widget number-id to access. The third
|
||||||
|
parameter can be either a hex/digit number or a string corresponding
|
||||||
|
to a verb. Similarly, the last parameter is the value to write, or
|
||||||
|
can be a string for the parameter type.
|
||||||
|
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
% hda-verb /dev/snd/hwC0D0 0x12 0x701 2
|
||||||
|
nid = 0x12, verb = 0x701, param = 0x2
|
||||||
|
value = 0x0
|
||||||
|
|
||||||
|
% hda-verb /dev/snd/hwC0D0 0x0 PARAMETERS VENDOR_ID
|
||||||
|
nid = 0x0, verb = 0xf00, param = 0x0
|
||||||
|
value = 0x10ec0262
|
||||||
|
|
||||||
|
% hda-verb /dev/snd/hwC0D0 2 set_a 0xb080
|
||||||
|
nid = 0x2, verb = 0x300, param = 0xb080
|
||||||
|
value = 0x0
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Although you can issue any verbs with this program, the driver state
|
||||||
|
won't be always updated. For example, the volume values are usually
|
||||||
|
cached in the driver, and thus changing the widget amp value directly
|
||||||
|
via hda-verb won't change the mixer value.
|
||||||
|
|
||||||
|
The hda-verb program is found in the ftp directory:
|
||||||
|
|
||||||
|
- ftp://ftp.kernel.org/pub/linux/kernel/people/tiwai/misc/
|
||||||
|
|
||||||
|
Also a git repository is available:
|
||||||
|
|
||||||
|
- git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/hda-verb.git
|
||||||
|
|
||||||
|
See README file in the tarball for more details about hda-verb
|
||||||
|
program.
|
||||||
|
|
||||||
|
|
||||||
|
hda-analyzer
|
||||||
|
~~~~~~~~~~~~
|
||||||
|
hda-analyzer provides a graphical interface to access the raw HD-audio
|
||||||
|
control, based on pyGTK2 binding. It's a more powerful version of
|
||||||
|
hda-verb. The program gives you an easy-to-use GUI stuff for showing
|
||||||
|
the widget information and adjusting the amp values, as well as the
|
||||||
|
proc-compatible output.
|
||||||
|
|
||||||
|
The hda-analyzer is a part of alsa.git repository in
|
||||||
|
alsa-project.org:
|
||||||
|
|
||||||
|
- http://git.alsa-project.org/?p=alsa.git;a=tree;f=hda-analyzer
|
||||||
|
|
||||||
|
|
||||||
|
Codecgraph
|
||||||
|
~~~~~~~~~~
|
||||||
|
Codecgraph is a utility program to generate a graph and visualizes the
|
||||||
|
codec-node connection of a codec chip. It's especially useful when
|
||||||
|
you analyze or debug a codec without a proper datasheet. The program
|
||||||
|
parses the given codec proc file and converts to SVG via graphiz
|
||||||
|
program.
|
||||||
|
|
||||||
|
The tarball and GIT trees are found in the web page at:
|
||||||
|
|
||||||
|
- http://helllabs.org/codecgraph/
|
||||||
|
|
||||||
|
|
||||||
|
hda-emu
|
||||||
|
~~~~~~~
|
||||||
|
hda-emu is an HD-audio emulator. The main purpose of this program is
|
||||||
|
to debug an HD-audio codec without the real hardware. Thus, it
|
||||||
|
doesn't emulate the behavior with the real audio I/O, but it just
|
||||||
|
dumps the codec register changes and the ALSA-driver internal changes
|
||||||
|
at probing and operating the HD-audio driver.
|
||||||
|
|
||||||
|
The program requires a codec proc-file to simulate. Get a proc file
|
||||||
|
for the target codec beforehand, or pick up an example codec from the
|
||||||
|
codec proc collections in the tarball. Then, run the program with the
|
||||||
|
proc file, and the hda-emu program will start parsing the codec file
|
||||||
|
and simulates the HD-audio driver:
|
||||||
|
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
% hda-emu codecs/stac9200-dell-d820-laptop
|
||||||
|
# Parsing..
|
||||||
|
hda_codec: Unknown model for STAC9200, using BIOS defaults
|
||||||
|
hda_codec: pin nid 08 bios pin config 40c003fa
|
||||||
|
....
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
|
||||||
|
The program gives you only a very dumb command-line interface. You
|
||||||
|
can get a proc-file dump at the current state, get a list of control
|
||||||
|
(mixer) elements, set/get the control element value, simulate the PCM
|
||||||
|
operation, the jack plugging simulation, etc.
|
||||||
|
|
||||||
|
The package is found in:
|
||||||
|
|
||||||
|
- ftp://ftp.kernel.org/pub/linux/kernel/people/tiwai/misc/
|
||||||
|
|
||||||
|
A git repository is available:
|
||||||
|
|
||||||
|
- git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/hda-emu.git
|
||||||
|
|
||||||
|
See README file in the tarball for more details about hda-emu
|
||||||
|
program.
|
@ -153,6 +153,16 @@ card*/codec#*
|
|||||||
Shows the general codec information and the attribute of each
|
Shows the general codec information and the attribute of each
|
||||||
widget node.
|
widget node.
|
||||||
|
|
||||||
|
card*/eld#*
|
||||||
|
Available for HDMI or DisplayPort interfaces.
|
||||||
|
Shows ELD(EDID Like Data) info retrieved from the attached HDMI sink,
|
||||||
|
and describes its audio capabilities and configurations.
|
||||||
|
|
||||||
|
Some ELD fields may be modified by doing `echo name hex_value > eld#*`.
|
||||||
|
Only do this if you are sure the HDMI sink provided value is wrong.
|
||||||
|
And if that makes your HDMI audio work, please report to us so that we
|
||||||
|
can fix it in future kernel releases.
|
||||||
|
|
||||||
|
|
||||||
Sequencer Information
|
Sequencer Information
|
||||||
---------------------
|
---------------------
|
||||||
|
@ -9,7 +9,7 @@ the audio subsystem with the kernel as a platform device and is represented by
|
|||||||
the following struct:-
|
the following struct:-
|
||||||
|
|
||||||
/* SoC machine */
|
/* SoC machine */
|
||||||
struct snd_soc_machine {
|
struct snd_soc_card {
|
||||||
char *name;
|
char *name;
|
||||||
|
|
||||||
int (*probe)(struct platform_device *pdev);
|
int (*probe)(struct platform_device *pdev);
|
||||||
@ -67,10 +67,10 @@ static struct snd_soc_dai_link corgi_dai = {
|
|||||||
.ops = &corgi_ops,
|
.ops = &corgi_ops,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct snd_soc_machine then sets up the machine with it's DAIs. e.g.
|
struct snd_soc_card then sets up the machine with it's DAIs. e.g.
|
||||||
|
|
||||||
/* corgi audio machine driver */
|
/* corgi audio machine driver */
|
||||||
static struct snd_soc_machine snd_soc_machine_corgi = {
|
static struct snd_soc_card snd_soc_corgi = {
|
||||||
.name = "Corgi",
|
.name = "Corgi",
|
||||||
.dai_link = &corgi_dai,
|
.dai_link = &corgi_dai,
|
||||||
.num_links = 1,
|
.num_links = 1,
|
||||||
@ -90,7 +90,7 @@ static struct wm8731_setup_data corgi_wm8731_setup = {
|
|||||||
|
|
||||||
/* corgi audio subsystem */
|
/* corgi audio subsystem */
|
||||||
static struct snd_soc_device corgi_snd_devdata = {
|
static struct snd_soc_device corgi_snd_devdata = {
|
||||||
.machine = &snd_soc_machine_corgi,
|
.machine = &snd_soc_corgi,
|
||||||
.platform = &pxa2xx_soc_platform,
|
.platform = &pxa2xx_soc_platform,
|
||||||
.codec_dev = &soc_codec_dev_wm8731,
|
.codec_dev = &soc_codec_dev_wm8731,
|
||||||
.codec_data = &corgi_wm8731_setup,
|
.codec_data = &corgi_wm8731_setup,
|
||||||
|
@ -3,28 +3,30 @@
|
|||||||
Mathieu Desnoyers
|
Mathieu Desnoyers
|
||||||
|
|
||||||
|
|
||||||
This document introduces Linux Kernel Tracepoints and their use. It provides
|
This document introduces Linux Kernel Tracepoints and their use. It
|
||||||
examples of how to insert tracepoints in the kernel and connect probe functions
|
provides examples of how to insert tracepoints in the kernel and
|
||||||
to them and provides some examples of probe functions.
|
connect probe functions to them and provides some examples of probe
|
||||||
|
functions.
|
||||||
|
|
||||||
|
|
||||||
* Purpose of tracepoints
|
* Purpose of tracepoints
|
||||||
|
|
||||||
A tracepoint placed in code provides a hook to call a function (probe) that you
|
A tracepoint placed in code provides a hook to call a function (probe)
|
||||||
can provide at runtime. A tracepoint can be "on" (a probe is connected to it) or
|
that you can provide at runtime. A tracepoint can be "on" (a probe is
|
||||||
"off" (no probe is attached). When a tracepoint is "off" it has no effect,
|
connected to it) or "off" (no probe is attached). When a tracepoint is
|
||||||
except for adding a tiny time penalty (checking a condition for a branch) and
|
"off" it has no effect, except for adding a tiny time penalty
|
||||||
space penalty (adding a few bytes for the function call at the end of the
|
(checking a condition for a branch) and space penalty (adding a few
|
||||||
instrumented function and adds a data structure in a separate section). When a
|
bytes for the function call at the end of the instrumented function
|
||||||
tracepoint is "on", the function you provide is called each time the tracepoint
|
and adds a data structure in a separate section). When a tracepoint
|
||||||
is executed, in the execution context of the caller. When the function provided
|
is "on", the function you provide is called each time the tracepoint
|
||||||
ends its execution, it returns to the caller (continuing from the tracepoint
|
is executed, in the execution context of the caller. When the function
|
||||||
site).
|
provided ends its execution, it returns to the caller (continuing from
|
||||||
|
the tracepoint site).
|
||||||
|
|
||||||
You can put tracepoints at important locations in the code. They are
|
You can put tracepoints at important locations in the code. They are
|
||||||
lightweight hooks that can pass an arbitrary number of parameters,
|
lightweight hooks that can pass an arbitrary number of parameters,
|
||||||
which prototypes are described in a tracepoint declaration placed in a header
|
which prototypes are described in a tracepoint declaration placed in a
|
||||||
file.
|
header file.
|
||||||
|
|
||||||
They can be used for tracing and performance accounting.
|
They can be used for tracing and performance accounting.
|
||||||
|
|
||||||
@ -42,14 +44,16 @@ In include/trace/subsys.h :
|
|||||||
|
|
||||||
#include <linux/tracepoint.h>
|
#include <linux/tracepoint.h>
|
||||||
|
|
||||||
DEFINE_TRACE(subsys_eventname,
|
DECLARE_TRACE(subsys_eventname,
|
||||||
TPPTOTO(int firstarg, struct task_struct *p),
|
TPPROTO(int firstarg, struct task_struct *p),
|
||||||
TPARGS(firstarg, p));
|
TPARGS(firstarg, p));
|
||||||
|
|
||||||
In subsys/file.c (where the tracing statement must be added) :
|
In subsys/file.c (where the tracing statement must be added) :
|
||||||
|
|
||||||
#include <trace/subsys.h>
|
#include <trace/subsys.h>
|
||||||
|
|
||||||
|
DEFINE_TRACE(subsys_eventname);
|
||||||
|
|
||||||
void somefct(void)
|
void somefct(void)
|
||||||
{
|
{
|
||||||
...
|
...
|
||||||
@ -61,31 +65,41 @@ Where :
|
|||||||
- subsys_eventname is an identifier unique to your event
|
- subsys_eventname is an identifier unique to your event
|
||||||
- subsys is the name of your subsystem.
|
- subsys is the name of your subsystem.
|
||||||
- eventname is the name of the event to trace.
|
- eventname is the name of the event to trace.
|
||||||
- TPPTOTO(int firstarg, struct task_struct *p) is the prototype of the function
|
|
||||||
called by this tracepoint.
|
|
||||||
- TPARGS(firstarg, p) are the parameters names, same as found in the prototype.
|
|
||||||
|
|
||||||
Connecting a function (probe) to a tracepoint is done by providing a probe
|
- TPPROTO(int firstarg, struct task_struct *p) is the prototype of the
|
||||||
(function to call) for the specific tracepoint through
|
function called by this tracepoint.
|
||||||
|
|
||||||
|
- TPARGS(firstarg, p) are the parameters names, same as found in the
|
||||||
|
prototype.
|
||||||
|
|
||||||
|
Connecting a function (probe) to a tracepoint is done by providing a
|
||||||
|
probe (function to call) for the specific tracepoint through
|
||||||
register_trace_subsys_eventname(). Removing a probe is done through
|
register_trace_subsys_eventname(). Removing a probe is done through
|
||||||
unregister_trace_subsys_eventname(); it will remove the probe sure there is no
|
unregister_trace_subsys_eventname(); it will remove the probe.
|
||||||
caller left using the probe when it returns. Probe removal is preempt-safe
|
|
||||||
because preemption is disabled around the probe call. See the "Probe example"
|
|
||||||
section below for a sample probe module.
|
|
||||||
|
|
||||||
The tracepoint mechanism supports inserting multiple instances of the same
|
tracepoint_synchronize_unregister() must be called before the end of
|
||||||
tracepoint, but a single definition must be made of a given tracepoint name over
|
the module exit function to make sure there is no caller left using
|
||||||
all the kernel to make sure no type conflict will occur. Name mangling of the
|
the probe. This, and the fact that preemption is disabled around the
|
||||||
tracepoints is done using the prototypes to make sure typing is correct.
|
probe call, make sure that probe removal and module unload are safe.
|
||||||
Verification of probe type correctness is done at the registration site by the
|
See the "Probe example" section below for a sample probe module.
|
||||||
compiler. Tracepoints can be put in inline functions, inlined static functions,
|
|
||||||
and unrolled loops as well as regular functions.
|
|
||||||
|
|
||||||
The naming scheme "subsys_event" is suggested here as a convention intended
|
The tracepoint mechanism supports inserting multiple instances of the
|
||||||
to limit collisions. Tracepoint names are global to the kernel: they are
|
same tracepoint, but a single definition must be made of a given
|
||||||
considered as being the same whether they are in the core kernel image or in
|
tracepoint name over all the kernel to make sure no type conflict will
|
||||||
modules.
|
occur. Name mangling of the tracepoints is done using the prototypes
|
||||||
|
to make sure typing is correct. Verification of probe type correctness
|
||||||
|
is done at the registration site by the compiler. Tracepoints can be
|
||||||
|
put in inline functions, inlined static functions, and unrolled loops
|
||||||
|
as well as regular functions.
|
||||||
|
|
||||||
|
The naming scheme "subsys_event" is suggested here as a convention
|
||||||
|
intended to limit collisions. Tracepoint names are global to the
|
||||||
|
kernel: they are considered as being the same whether they are in the
|
||||||
|
core kernel image or in modules.
|
||||||
|
|
||||||
|
If the tracepoint has to be used in kernel modules, an
|
||||||
|
EXPORT_TRACEPOINT_SYMBOL_GPL() or EXPORT_TRACEPOINT_SYMBOL() can be
|
||||||
|
used to export the defined tracepoints.
|
||||||
|
|
||||||
* Probe / tracepoint example
|
* Probe / tracepoint example
|
||||||
|
|
||||||
|
@ -114,11 +114,11 @@ modules.
|
|||||||
Then you must load the gadget serial driver. To load it as an
|
Then you must load the gadget serial driver. To load it as an
|
||||||
ACM device (recommended for interoperability), do this:
|
ACM device (recommended for interoperability), do this:
|
||||||
|
|
||||||
modprobe g_serial use_acm=1
|
modprobe g_serial
|
||||||
|
|
||||||
To load it as a vendor specific bulk in/out device, do this:
|
To load it as a vendor specific bulk in/out device, do this:
|
||||||
|
|
||||||
modprobe g_serial
|
modprobe g_serial use_acm=0
|
||||||
|
|
||||||
This will also automatically load the underlying gadget peripheral
|
This will also automatically load the underlying gadget peripheral
|
||||||
controller driver. This must be done each time you reboot the gadget
|
controller driver. This must be done each time you reboot the gadget
|
||||||
|
@ -49,8 +49,10 @@ it and 002/048 sometime later.
|
|||||||
|
|
||||||
These files can be read as binary data. The binary data consists
|
These files can be read as binary data. The binary data consists
|
||||||
of first the device descriptor, then the descriptors for each
|
of first the device descriptor, then the descriptors for each
|
||||||
configuration of the device. That information is also shown in
|
configuration of the device. Multi-byte fields in the device and
|
||||||
text form by the /proc/bus/usb/devices file, described later.
|
configuration descriptors, but not other descriptors, are converted
|
||||||
|
to host endianness by the kernel. This information is also shown
|
||||||
|
in text form by the /proc/bus/usb/devices file, described later.
|
||||||
|
|
||||||
These files may also be used to write user-level drivers for the USB
|
These files may also be used to write user-level drivers for the USB
|
||||||
devices. You would open the /proc/bus/usb/BBB/DDD file read/write,
|
devices. You would open the /proc/bus/usb/BBB/DDD file read/write,
|
||||||
|
@ -34,11 +34,12 @@ if usbmon is built into the kernel.
|
|||||||
Verify that bus sockets are present.
|
Verify that bus sockets are present.
|
||||||
|
|
||||||
# ls /sys/kernel/debug/usbmon
|
# ls /sys/kernel/debug/usbmon
|
||||||
0s 0t 0u 1s 1t 1u 2s 2t 2u 3s 3t 3u 4s 4t 4u
|
0s 0u 1s 1t 1u 2s 2t 2u 3s 3t 3u 4s 4t 4u
|
||||||
#
|
#
|
||||||
|
|
||||||
Now you can choose to either use the sockets numbered '0' (to capture packets on
|
Now you can choose to either use the socket '0u' (to capture packets on all
|
||||||
all buses), and skip to step #3, or find the bus used by your device with step #2.
|
buses), and skip to step #3, or find the bus used by your device with step #2.
|
||||||
|
This allows to filter away annoying devices that talk continuously.
|
||||||
|
|
||||||
2. Find which bus connects to the desired device
|
2. Find which bus connects to the desired device
|
||||||
|
|
||||||
@ -99,8 +100,9 @@ on the event type, but there is a set of words, common for all types.
|
|||||||
|
|
||||||
Here is the list of words, from left to right:
|
Here is the list of words, from left to right:
|
||||||
|
|
||||||
- URB Tag. This is used to identify URBs is normally a kernel mode address
|
- URB Tag. This is used to identify URBs, and is normally an in-kernel address
|
||||||
of the URB structure in hexadecimal.
|
of the URB structure in hexadecimal, but can be a sequence number or any
|
||||||
|
other unique string, within reason.
|
||||||
|
|
||||||
- Timestamp in microseconds, a decimal number. The timestamp's resolution
|
- Timestamp in microseconds, a decimal number. The timestamp's resolution
|
||||||
depends on available clock, and so it can be much worse than a microsecond
|
depends on available clock, and so it can be much worse than a microsecond
|
||||||
|
@ -349,7 +349,7 @@ Protocol: 2.00+
|
|||||||
3 SYSLINUX
|
3 SYSLINUX
|
||||||
4 EtherBoot
|
4 EtherBoot
|
||||||
5 ELILO
|
5 ELILO
|
||||||
7 GRuB
|
7 GRUB
|
||||||
8 U-BOOT
|
8 U-BOOT
|
||||||
9 Xen
|
9 Xen
|
||||||
A Gujin
|
A Gujin
|
||||||
@ -537,8 +537,8 @@ Type: read
|
|||||||
Offset/size: 0x248/4
|
Offset/size: 0x248/4
|
||||||
Protocol: 2.08+
|
Protocol: 2.08+
|
||||||
|
|
||||||
If non-zero then this field contains the offset from the end of the
|
If non-zero then this field contains the offset from the beginning
|
||||||
real-mode code to the payload.
|
of the protected-mode code to the payload.
|
||||||
|
|
||||||
The payload may be compressed. The format of both the compressed and
|
The payload may be compressed. The format of both the compressed and
|
||||||
uncompressed data should be determined using the standard magic
|
uncompressed data should be determined using the standard magic
|
||||||
|
@ -80,6 +80,30 @@ pci proc | -- | -- | WC |
|
|||||||
| | | |
|
| | | |
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
|
|
||||||
|
Advanced APIs for drivers
|
||||||
|
-------------------------
|
||||||
|
A. Exporting pages to users with remap_pfn_range, io_remap_pfn_range,
|
||||||
|
vm_insert_pfn
|
||||||
|
|
||||||
|
Drivers wanting to export some pages to userspace do it by using mmap
|
||||||
|
interface and a combination of
|
||||||
|
1) pgprot_noncached()
|
||||||
|
2) io_remap_pfn_range() or remap_pfn_range() or vm_insert_pfn()
|
||||||
|
|
||||||
|
With PAT support, a new API pgprot_writecombine is being added. So, drivers can
|
||||||
|
continue to use the above sequence, with either pgprot_noncached() or
|
||||||
|
pgprot_writecombine() in step 1, followed by step 2.
|
||||||
|
|
||||||
|
In addition, step 2 internally tracks the region as UC or WC in memtype
|
||||||
|
list in order to ensure no conflicting mapping.
|
||||||
|
|
||||||
|
Note that this set of APIs only works with IO (non RAM) regions. If driver
|
||||||
|
wants to export a RAM region, it has to do set_memory_uc() or set_memory_wc()
|
||||||
|
as step 0 above and also track the usage of those pages and use set_memory_wb()
|
||||||
|
before the page is freed to free pool.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Notes:
|
Notes:
|
||||||
|
|
||||||
-- in the above table mean "Not suggested usage for the API". Some of the --'s
|
-- in the above table mean "Not suggested usage for the API". Some of the --'s
|
||||||
|
@ -79,17 +79,6 @@ Timing
|
|||||||
Report when timer interrupts are lost because some code turned off
|
Report when timer interrupts are lost because some code turned off
|
||||||
interrupts for too long.
|
interrupts for too long.
|
||||||
|
|
||||||
nmi_watchdog=NUMBER[,panic]
|
|
||||||
NUMBER can be:
|
|
||||||
0 don't use an NMI watchdog
|
|
||||||
1 use the IO-APIC timer for the NMI watchdog
|
|
||||||
2 use the local APIC for the NMI watchdog using a performance counter. Note
|
|
||||||
This will use one performance counter and the local APIC's performance
|
|
||||||
vector.
|
|
||||||
When panic is specified panic when an NMI watchdog timeout occurs.
|
|
||||||
This is useful when you use a panic=... timeout and need the box
|
|
||||||
quickly up again.
|
|
||||||
|
|
||||||
nohpet
|
nohpet
|
||||||
Don't use the HPET timer.
|
Don't use the HPET timer.
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@ Virtual memory map with 4 level page tables:
|
|||||||
0000000000000000 - 00007fffffffffff (=47 bits) user space, different per mm
|
0000000000000000 - 00007fffffffffff (=47 bits) user space, different per mm
|
||||||
hole caused by [48:63] sign extension
|
hole caused by [48:63] sign extension
|
||||||
ffff800000000000 - ffff80ffffffffff (=40 bits) guard hole
|
ffff800000000000 - ffff80ffffffffff (=40 bits) guard hole
|
||||||
ffff810000000000 - ffffc0ffffffffff (=46 bits) direct mapping of all phys. memory
|
ffff880000000000 - ffffc0ffffffffff (=57 TB) direct mapping of all phys. memory
|
||||||
ffffc10000000000 - ffffc1ffffffffff (=40 bits) hole
|
ffffc10000000000 - ffffc1ffffffffff (=40 bits) hole
|
||||||
ffffc20000000000 - ffffe1ffffffffff (=45 bits) vmalloc/ioremap space
|
ffffc20000000000 - ffffe1ffffffffff (=45 bits) vmalloc/ioremap space
|
||||||
ffffe20000000000 - ffffe2ffffffffff (=40 bits) virtual memory map (1TB)
|
ffffe20000000000 - ffffe2ffffffffff (=40 bits) virtual memory map (1TB)
|
||||||
|
64
MAINTAINERS
64
MAINTAINERS
@ -742,7 +742,7 @@ M: jirislaby@gmail.com
|
|||||||
P: Nick Kossifidis
|
P: Nick Kossifidis
|
||||||
M: mickflemm@gmail.com
|
M: mickflemm@gmail.com
|
||||||
P: Luis R. Rodriguez
|
P: Luis R. Rodriguez
|
||||||
M: mcgrof@gmail.com
|
M: lrodriguez@atheros.com
|
||||||
P: Bob Copeland
|
P: Bob Copeland
|
||||||
M: me@bobcopeland.com
|
M: me@bobcopeland.com
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
@ -1527,10 +1527,10 @@ W: http://ebtables.sourceforge.net/
|
|||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
ECRYPT FILE SYSTEM
|
ECRYPT FILE SYSTEM
|
||||||
P: Mike Halcrow, Phillip Hellewell
|
P: Tyler Hicks, Dustin Kirkland
|
||||||
M: mhalcrow@us.ibm.com, phillip@hellewell.homeip.net
|
M: tyhicks@linux.vnet.ibm.com, kirkland@canonical.com
|
||||||
L: ecryptfs-devel@lists.sourceforge.net
|
L: ecryptfs-devel@lists.launchpad.net
|
||||||
W: http://ecryptfs.sourceforge.net/
|
W: https://launchpad.net/ecryptfs
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
EDAC-CORE
|
EDAC-CORE
|
||||||
@ -1607,11 +1607,6 @@ L: acpi4asus-user@lists.sourceforge.net
|
|||||||
W: http://sourceforge.net/projects/acpi4asus
|
W: http://sourceforge.net/projects/acpi4asus
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
EEPRO100 NETWORK DRIVER
|
|
||||||
P: Andrey V. Savochkin
|
|
||||||
M: saw@saw.sw.com.sg
|
|
||||||
S: Maintained
|
|
||||||
|
|
||||||
EFS FILESYSTEM
|
EFS FILESYSTEM
|
||||||
W: http://aeschi.ch.eu.org/efs/
|
W: http://aeschi.ch.eu.org/efs/
|
||||||
S: Orphan
|
S: Orphan
|
||||||
@ -1849,7 +1844,7 @@ P: Haavard Skinnemoen
|
|||||||
M: hskinnemoen@atmel.com
|
M: hskinnemoen@atmel.com
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
GENERIC HDLC DRIVER, N2, C101, PCI200SYN and WANXL DRIVERS
|
GENERIC HDLC (WAN) DRIVERS
|
||||||
P: Krzysztof Halasa
|
P: Krzysztof Halasa
|
||||||
M: khc@pm.waw.pl
|
M: khc@pm.waw.pl
|
||||||
W: http://www.kernel.org/pub/linux/utils/net/hdlc/
|
W: http://www.kernel.org/pub/linux/utils/net/hdlc/
|
||||||
@ -2191,9 +2186,9 @@ S: Supported
|
|||||||
|
|
||||||
INOTIFY
|
INOTIFY
|
||||||
P: John McCutchan
|
P: John McCutchan
|
||||||
M: ttb@tentacle.dhs.org
|
M: john@johnmccutchan.com
|
||||||
P: Robert Love
|
P: Robert Love
|
||||||
M: rml@novell.com
|
M: rlove@rlove.org
|
||||||
L: linux-kernel@vger.kernel.org
|
L: linux-kernel@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
@ -2248,6 +2243,11 @@ M: dan.j.williams@intel.com
|
|||||||
L: linux-kernel@vger.kernel.org
|
L: linux-kernel@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
|
INTEL IXP4XX QMGR, NPE, ETHERNET and HSS SUPPORT
|
||||||
|
P: Krzysztof Halasa
|
||||||
|
M: khc@pm.waw.pl
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
INTEL IXP4XX RANDOM NUMBER GENERATOR SUPPORT
|
INTEL IXP4XX RANDOM NUMBER GENERATOR SUPPORT
|
||||||
P: Deepak Saxena
|
P: Deepak Saxena
|
||||||
M: dsaxena@plexity.net
|
M: dsaxena@plexity.net
|
||||||
@ -3614,16 +3614,26 @@ L: linux-hams@vger.kernel.org
|
|||||||
W: http://www.linux-ax25.org/
|
W: http://www.linux-ax25.org/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
RTL818X WIRELESS DRIVER
|
RTL8180 WIRELESS DRIVER
|
||||||
P: Michael Wu
|
P: John W. Linville
|
||||||
M: flamingice@sourmilk.net
|
M: linville@tuxdriver.com
|
||||||
P: Andrea Merello
|
|
||||||
M: andreamrl@tiscali.it
|
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
W: http://linuxwireless.org/
|
W: http://linuxwireless.org/
|
||||||
T: git kernel.org:/pub/scm/linux/kernel/git/mwu/mac80211-drivers.git
|
T: git kernel.org:/pub/scm/linux/kernel/git/linville/wireless-testing.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
RTL8187 WIRELESS DRIVER
|
||||||
|
P: Herton Ronaldo Krzesinski
|
||||||
|
M: herton@mandriva.com.br
|
||||||
|
P: Hin-Tak Leung
|
||||||
|
M htl10@users.sourceforge.net
|
||||||
|
P: Larry Finger
|
||||||
|
M: Larry.Finger@lwfinger.net
|
||||||
|
L: linux-wireless@vger.kernel.org
|
||||||
|
W: http://linuxwireless.org/
|
||||||
|
T: git kernel.org:/pub/scm/linux/kernel/git/linville/wireless-testing.git
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
S3 SAVAGE FRAMEBUFFER DRIVER
|
S3 SAVAGE FRAMEBUFFER DRIVER
|
||||||
P: Antonino Daplas
|
P: Antonino Daplas
|
||||||
M: adaplas@gmail.com
|
M: adaplas@gmail.com
|
||||||
@ -3913,6 +3923,18 @@ M: mhoffman@lightlink.com
|
|||||||
L: lm-sensors@lm-sensors.org
|
L: lm-sensors@lm-sensors.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
SMSC911x ETHERNET DRIVER
|
||||||
|
P: Steve Glendinning
|
||||||
|
M: steve.glendinning@smsc.com
|
||||||
|
L: netdev@vger.kernel.org
|
||||||
|
S: Supported
|
||||||
|
|
||||||
|
SMSC9420 PCI ETHERNET DRIVER
|
||||||
|
P: Steve Glendinning
|
||||||
|
M: steve.glendinning@smsc.com
|
||||||
|
L: netdev@vger.kernel.org
|
||||||
|
S: Supported
|
||||||
|
|
||||||
SMX UIO Interface
|
SMX UIO Interface
|
||||||
P: Ben Nizette
|
P: Ben Nizette
|
||||||
M: bn@niasdigital.com
|
M: bn@niasdigital.com
|
||||||
@ -3977,7 +3999,7 @@ M: tiwai@suse.de
|
|||||||
L: alsa-devel@alsa-project.org (subscribers-only)
|
L: alsa-devel@alsa-project.org (subscribers-only)
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
SOUND - SOC LAYER / DYNAMIC AUDIO POWER MANAGEMENT
|
SOUND - SOC LAYER / DYNAMIC AUDIO POWER MANAGEMENT (ASoC)
|
||||||
P: Liam Girdwood
|
P: Liam Girdwood
|
||||||
M: lrg@slimlogic.co.uk
|
M: lrg@slimlogic.co.uk
|
||||||
P: Mark Brown
|
P: Mark Brown
|
||||||
@ -4529,7 +4551,7 @@ S: Maintained
|
|||||||
USB VIDEO CLASS
|
USB VIDEO CLASS
|
||||||
P: Laurent Pinchart
|
P: Laurent Pinchart
|
||||||
M: laurent.pinchart@skynet.be
|
M: laurent.pinchart@skynet.be
|
||||||
L: linux-uvc-devel@lists.berlios.de
|
L: linux-uvc-devel@lists.berlios.de (subscribers-only)
|
||||||
L: video4linux-list@redhat.com
|
L: video4linux-list@redhat.com
|
||||||
W: http://linux-uvc.berlios.de
|
W: http://linux-uvc.berlios.de
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
209
Makefile
209
Makefile
@ -1,7 +1,7 @@
|
|||||||
VERSION = 2
|
VERSION = 2
|
||||||
PATCHLEVEL = 6
|
PATCHLEVEL = 6
|
||||||
SUBLEVEL = 28
|
SUBLEVEL = 28
|
||||||
EXTRAVERSION = -rc8
|
EXTRAVERSION =
|
||||||
NAME = Erotic Pickled Herring
|
NAME = Erotic Pickled Herring
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
@ -336,7 +336,7 @@ LINUXINCLUDE := -Iinclude \
|
|||||||
-I$(srctree)/arch/$(hdr-arch)/include \
|
-I$(srctree)/arch/$(hdr-arch)/include \
|
||||||
-include include/linux/autoconf.h
|
-include include/linux/autoconf.h
|
||||||
|
|
||||||
KBUILD_CPPFLAGS := -D__KERNEL__ $(LINUXINCLUDE)
|
KBUILD_CPPFLAGS := -D__KERNEL__
|
||||||
|
|
||||||
KBUILD_CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
|
KBUILD_CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
|
||||||
-fno-strict-aliasing -fno-common \
|
-fno-strict-aliasing -fno-common \
|
||||||
@ -439,7 +439,11 @@ ifeq ($(config-targets),1)
|
|||||||
include $(srctree)/arch/$(SRCARCH)/Makefile
|
include $(srctree)/arch/$(SRCARCH)/Makefile
|
||||||
export KBUILD_DEFCONFIG KBUILD_KCONFIG
|
export KBUILD_DEFCONFIG KBUILD_KCONFIG
|
||||||
|
|
||||||
config %config: scripts_basic outputmakefile FORCE
|
config: scripts_basic outputmakefile FORCE
|
||||||
|
$(Q)mkdir -p include/linux include/config
|
||||||
|
$(Q)$(MAKE) $(build)=scripts/kconfig $@
|
||||||
|
|
||||||
|
%config: scripts_basic outputmakefile FORCE
|
||||||
$(Q)mkdir -p include/linux include/config
|
$(Q)mkdir -p include/linux include/config
|
||||||
$(Q)$(MAKE) $(build)=scripts/kconfig $@
|
$(Q)$(MAKE) $(build)=scripts/kconfig $@
|
||||||
|
|
||||||
@ -600,20 +604,25 @@ export INSTALL_PATH ?= /boot
|
|||||||
MODLIB = $(INSTALL_MOD_PATH)/lib/modules/$(KERNELRELEASE)
|
MODLIB = $(INSTALL_MOD_PATH)/lib/modules/$(KERNELRELEASE)
|
||||||
export MODLIB
|
export MODLIB
|
||||||
|
|
||||||
#
|
strip-symbols := $(srctree)/scripts/strip-symbols \
|
||||||
# INSTALL_MOD_STRIP, if defined, will cause modules to be
|
$(wildcard $(srctree)/arch/$(ARCH)/scripts/strip-symbols)
|
||||||
# stripped after they are installed. If INSTALL_MOD_STRIP is '1', then
|
|
||||||
# the default option --strip-debug will be used. Otherwise,
|
|
||||||
# INSTALL_MOD_STRIP will used as the options to the strip command.
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# INSTALL_MOD_STRIP, if defined, will cause modules to be stripped while
|
||||||
|
# they get installed. If INSTALL_MOD_STRIP is '1', then the default
|
||||||
|
# options (see below) will be used. Otherwise, INSTALL_MOD_STRIP will
|
||||||
|
# be used as the option(s) to the objcopy command.
|
||||||
ifdef INSTALL_MOD_STRIP
|
ifdef INSTALL_MOD_STRIP
|
||||||
ifeq ($(INSTALL_MOD_STRIP),1)
|
ifeq ($(INSTALL_MOD_STRIP),1)
|
||||||
mod_strip_cmd = $(STRIP) --strip-debug
|
mod_strip_cmd = $(OBJCOPY) --strip-debug
|
||||||
|
ifeq ($(CONFIG_KALLSYMS_ALL),$(CONFIG_KALLSYMS_STRIP_GENERATED))
|
||||||
|
mod_strip_cmd += --wildcard $(addprefix --strip-symbols ,$(strip-symbols))
|
||||||
|
endif
|
||||||
else
|
else
|
||||||
mod_strip_cmd = $(STRIP) $(INSTALL_MOD_STRIP)
|
mod_strip_cmd = $(OBJCOPY) $(INSTALL_MOD_STRIP)
|
||||||
endif # INSTALL_MOD_STRIP=1
|
endif # INSTALL_MOD_STRIP=1
|
||||||
else
|
else
|
||||||
mod_strip_cmd = true
|
mod_strip_cmd = false
|
||||||
endif # INSTALL_MOD_STRIP
|
endif # INSTALL_MOD_STRIP
|
||||||
export mod_strip_cmd
|
export mod_strip_cmd
|
||||||
|
|
||||||
@ -743,6 +752,7 @@ last_kallsyms := 2
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
kallsyms.o := .tmp_kallsyms$(last_kallsyms).o
|
kallsyms.o := .tmp_kallsyms$(last_kallsyms).o
|
||||||
|
kallsyms.h := $(wildcard include/config/kallsyms/*.h) $(wildcard include/config/kallsyms/*/*.h)
|
||||||
|
|
||||||
define verify_kallsyms
|
define verify_kallsyms
|
||||||
$(Q)$(if $($(quiet)cmd_sysmap), \
|
$(Q)$(if $($(quiet)cmd_sysmap), \
|
||||||
@ -767,24 +777,41 @@ endef
|
|||||||
|
|
||||||
# Generate .S file with all kernel symbols
|
# Generate .S file with all kernel symbols
|
||||||
quiet_cmd_kallsyms = KSYM $@
|
quiet_cmd_kallsyms = KSYM $@
|
||||||
cmd_kallsyms = $(NM) -n $< | $(KALLSYMS) \
|
cmd_kallsyms = { test $* -eq 0 || $(NM) -n $<; } \
|
||||||
$(if $(CONFIG_KALLSYMS_ALL),--all-symbols) > $@
|
| $(KALLSYMS) $(if $(CONFIG_KALLSYMS_ALL),--all-symbols) >$@
|
||||||
|
|
||||||
.tmp_kallsyms1.o .tmp_kallsyms2.o .tmp_kallsyms3.o: %.o: %.S scripts FORCE
|
quiet_cmd_kstrip = STRIP $@
|
||||||
|
cmd_kstrip = $(OBJCOPY) --wildcard $(addprefix --strip$(if $(CONFIG_RELOCATABLE),-unneeded)-symbols ,$(filter %/scripts/strip-symbols,$^)) $< $@
|
||||||
|
|
||||||
|
$(foreach n,0 1 2 3,.tmp_kallsyms$(n).o): KBUILD_AFLAGS += -Wa,--strip-local-absolute
|
||||||
|
$(foreach n,0 1 2 3,.tmp_kallsyms$(n).o): %.o: %.S scripts FORCE
|
||||||
$(call if_changed_dep,as_o_S)
|
$(call if_changed_dep,as_o_S)
|
||||||
|
|
||||||
.tmp_kallsyms%.S: .tmp_vmlinux% $(KALLSYMS)
|
ifeq ($(CONFIG_KALLSYMS_STRIP_GENERATED),y)
|
||||||
|
strip-ext := .stripped
|
||||||
|
endif
|
||||||
|
|
||||||
|
.tmp_kallsyms%.S: .tmp_vmlinux%$(strip-ext) $(KALLSYMS) $(kallsyms.h)
|
||||||
$(call cmd,kallsyms)
|
$(call cmd,kallsyms)
|
||||||
|
|
||||||
|
# make -jN seems to have problems with intermediate files, see bug #3330.
|
||||||
|
.SECONDARY: $(foreach n,1 2 3,.tmp_vmlinux$(n).stripped)
|
||||||
|
.tmp_vmlinux%.stripped: .tmp_vmlinux% $(strip-symbols) $(kallsyms.h)
|
||||||
|
$(call cmd,kstrip)
|
||||||
|
|
||||||
|
ifneq ($(CONFIG_DEBUG_INFO),y)
|
||||||
|
.tmp_vmlinux%: LDFLAGS_vmlinux += -S
|
||||||
|
endif
|
||||||
# .tmp_vmlinux1 must be complete except kallsyms, so update vmlinux version
|
# .tmp_vmlinux1 must be complete except kallsyms, so update vmlinux version
|
||||||
.tmp_vmlinux1: $(vmlinux-lds) $(vmlinux-all) FORCE
|
.tmp_vmlinux%: $(vmlinux-lds) $(vmlinux-all) FORCE
|
||||||
$(call if_changed_rule,ksym_ld)
|
$(if $(filter 1,$*),$(call if_changed_rule,ksym_ld),$(call if_changed,vmlinux__))
|
||||||
|
|
||||||
.tmp_vmlinux2: $(vmlinux-lds) $(vmlinux-all) .tmp_kallsyms1.o FORCE
|
.tmp_vmlinux0$(strip-ext):
|
||||||
$(call if_changed,vmlinux__)
|
$(Q)echo "placeholder" >$@
|
||||||
|
|
||||||
.tmp_vmlinux3: $(vmlinux-lds) $(vmlinux-all) .tmp_kallsyms2.o FORCE
|
.tmp_vmlinux1: .tmp_kallsyms0.o
|
||||||
$(call if_changed,vmlinux__)
|
.tmp_vmlinux2: .tmp_kallsyms1.o
|
||||||
|
.tmp_vmlinux3: .tmp_kallsyms2.o
|
||||||
|
|
||||||
# Needs to visit scripts/ before $(KALLSYMS) can be used.
|
# Needs to visit scripts/ before $(KALLSYMS) can be used.
|
||||||
$(KALLSYMS): scripts ;
|
$(KALLSYMS): scripts ;
|
||||||
@ -926,7 +953,7 @@ PHONY += prepare archprepare prepare0 prepare1 prepare2 prepare3
|
|||||||
# 2) Create the include2 directory, used for the second asm symlink
|
# 2) Create the include2 directory, used for the second asm symlink
|
||||||
prepare3: include/config/kernel.release
|
prepare3: include/config/kernel.release
|
||||||
ifneq ($(KBUILD_SRC),)
|
ifneq ($(KBUILD_SRC),)
|
||||||
@echo ' Using $(srctree) as source for kernel'
|
@$(kecho) ' Using $(srctree) as source for kernel'
|
||||||
$(Q)if [ -f $(srctree)/.config -o -d $(srctree)/include/config ]; then \
|
$(Q)if [ -f $(srctree)/.config -o -d $(srctree)/include/config ]; then \
|
||||||
echo " $(srctree) is not clean, please run 'make mrproper'";\
|
echo " $(srctree) is not clean, please run 'make mrproper'";\
|
||||||
echo " in the '$(srctree)' directory.";\
|
echo " in the '$(srctree)' directory.";\
|
||||||
@ -983,7 +1010,7 @@ endef
|
|||||||
# directory for generated filesas used by some architectures.
|
# directory for generated filesas used by some architectures.
|
||||||
define create-symlink
|
define create-symlink
|
||||||
if [ ! -L include/asm ]; then \
|
if [ ! -L include/asm ]; then \
|
||||||
echo ' SYMLINK $@ -> include/asm-$(SRCARCH)'; \
|
$(kecho) ' SYMLINK $@ -> include/asm-$(SRCARCH)'; \
|
||||||
if [ ! -d include/asm-$(SRCARCH) ]; then \
|
if [ ! -d include/asm-$(SRCARCH) ]; then \
|
||||||
mkdir -p include/asm-$(SRCARCH); \
|
mkdir -p include/asm-$(SRCARCH); \
|
||||||
fi; \
|
fi; \
|
||||||
@ -1022,6 +1049,10 @@ include/linux/version.h: $(srctree)/Makefile FORCE
|
|||||||
include/linux/utsrelease.h: include/config/kernel.release FORCE
|
include/linux/utsrelease.h: include/config/kernel.release FORCE
|
||||||
$(call filechk,utsrelease.h)
|
$(call filechk,utsrelease.h)
|
||||||
|
|
||||||
|
PHONY += headerdep
|
||||||
|
headerdep:
|
||||||
|
$(Q)find include/ -name '*.h' | xargs --max-args 1 scripts/headerdep.pl
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
PHONY += depend dep
|
PHONY += depend dep
|
||||||
@ -1096,7 +1127,7 @@ all: modules
|
|||||||
PHONY += modules
|
PHONY += modules
|
||||||
modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux)
|
modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux)
|
||||||
$(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.order) > $(objtree)/modules.order
|
$(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.order) > $(objtree)/modules.order
|
||||||
@echo ' Building modules, stage 2.';
|
@$(kecho) ' Building modules, stage 2.';
|
||||||
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
|
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
|
||||||
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.fwinst obj=firmware __fw_modbuild
|
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.fwinst obj=firmware __fw_modbuild
|
||||||
|
|
||||||
@ -1270,7 +1301,8 @@ help:
|
|||||||
@echo ' versioncheck - Sanity check on version.h usage'
|
@echo ' versioncheck - Sanity check on version.h usage'
|
||||||
@echo ' includecheck - Check for duplicate included header files'
|
@echo ' includecheck - Check for duplicate included header files'
|
||||||
@echo ' export_report - List the usages of all exported symbols'
|
@echo ' export_report - List the usages of all exported symbols'
|
||||||
@echo ' headers_check - Sanity check on exported headers'; \
|
@echo ' headers_check - Sanity check on exported headers'
|
||||||
|
@echo ' headerdep - Detect inclusion cycles in headers'; \
|
||||||
echo ''
|
echo ''
|
||||||
@echo 'Kernel packaging:'
|
@echo 'Kernel packaging:'
|
||||||
@$(MAKE) $(build)=$(package-dir) help
|
@$(MAKE) $(build)=$(package-dir) help
|
||||||
@ -1360,7 +1392,7 @@ $(module-dirs): crmodverdir $(objtree)/Module.symvers
|
|||||||
$(Q)$(MAKE) $(build)=$(patsubst _module_%,%,$@)
|
$(Q)$(MAKE) $(build)=$(patsubst _module_%,%,$@)
|
||||||
|
|
||||||
modules: $(module-dirs)
|
modules: $(module-dirs)
|
||||||
@echo ' Building modules, stage 2.';
|
@$(kecho) ' Building modules, stage 2.';
|
||||||
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
|
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
|
||||||
|
|
||||||
PHONY += modules_install
|
PHONY += modules_install
|
||||||
@ -1409,123 +1441,12 @@ endif # KBUILD_EXTMOD
|
|||||||
|
|
||||||
# Generate tags for editors
|
# Generate tags for editors
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
quiet_cmd_tags = GEN $@
|
||||||
|
cmd_tags = $(CONFIG_SHELL) $(srctree)/scripts/tags.sh $@
|
||||||
|
|
||||||
#We want __srctree to totally vanish out when KBUILD_OUTPUT is not set
|
tags TAGS cscope: FORCE
|
||||||
#(which is the most common case IMHO) to avoid unneeded clutter in the big tags file.
|
|
||||||
#Adding $(srctree) adds about 20M on i386 to the size of the output file!
|
|
||||||
|
|
||||||
ifeq ($(src),$(obj))
|
|
||||||
__srctree =
|
|
||||||
else
|
|
||||||
__srctree = $(srctree)/
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(ALLSOURCE_ARCHS),)
|
|
||||||
ifeq ($(ARCH),um)
|
|
||||||
ALLINCLUDE_ARCHS := $(ARCH) $(SUBARCH)
|
|
||||||
else
|
|
||||||
ALLINCLUDE_ARCHS := $(SRCARCH)
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
#Allow user to specify only ALLSOURCE_PATHS on the command line, keeping existing behaviour.
|
|
||||||
ALLINCLUDE_ARCHS := $(ALLSOURCE_ARCHS)
|
|
||||||
endif
|
|
||||||
|
|
||||||
ALLSOURCE_ARCHS := $(SRCARCH)
|
|
||||||
|
|
||||||
define find-sources
|
|
||||||
( for arch in $(ALLSOURCE_ARCHS) ; do \
|
|
||||||
find $(__srctree)arch/$${arch} $(RCS_FIND_IGNORE) \
|
|
||||||
-wholename $(__srctree)arch/$${arch}/include/asm -type d -prune \
|
|
||||||
-o -name $1 -print; \
|
|
||||||
done ; \
|
|
||||||
find $(__srctree)security/selinux/include $(RCS_FIND_IGNORE) \
|
|
||||||
-name $1 -print; \
|
|
||||||
find $(__srctree)include $(RCS_FIND_IGNORE) \
|
|
||||||
\( -name config -o -name 'asm-*' \) -prune \
|
|
||||||
-o -name $1 -print; \
|
|
||||||
for arch in $(ALLINCLUDE_ARCHS) ; do \
|
|
||||||
test -e $(__srctree)include/asm-$${arch} && \
|
|
||||||
find $(__srctree)include/asm-$${arch} $(RCS_FIND_IGNORE) \
|
|
||||||
-name $1 -print; \
|
|
||||||
test -e $(__srctree)arch/$${arch}/include/asm && \
|
|
||||||
find $(__srctree)arch/$${arch}/include/asm $(RCS_FIND_IGNORE) \
|
|
||||||
-name $1 -print; \
|
|
||||||
done ; \
|
|
||||||
find $(__srctree)include/asm-generic $(RCS_FIND_IGNORE) \
|
|
||||||
-name $1 -print; \
|
|
||||||
find $(__srctree) $(RCS_FIND_IGNORE) \
|
|
||||||
\( -name include -o -name arch -o -name '.tmp_*' \) -prune -o \
|
|
||||||
-name $1 -print; \
|
|
||||||
)
|
|
||||||
endef
|
|
||||||
|
|
||||||
define all-sources
|
|
||||||
$(call find-sources,'*.[chS]')
|
|
||||||
endef
|
|
||||||
define all-kconfigs
|
|
||||||
$(call find-sources,'Kconfig*')
|
|
||||||
endef
|
|
||||||
define all-defconfigs
|
|
||||||
$(call find-sources,'defconfig')
|
|
||||||
endef
|
|
||||||
|
|
||||||
define xtags
|
|
||||||
if $1 --version 2>&1 | grep -iq exuberant; then \
|
|
||||||
$(all-sources) | xargs $1 -a \
|
|
||||||
-I __initdata,__exitdata,__acquires,__releases \
|
|
||||||
-I __read_mostly,____cacheline_aligned,____cacheline_aligned_in_smp,____cacheline_internodealigned_in_smp \
|
|
||||||
-I EXPORT_SYMBOL,EXPORT_SYMBOL_GPL \
|
|
||||||
--extra=+f --c-kinds=+px \
|
|
||||||
--regex-asm='/^ENTRY\(([^)]*)\).*/\1/'; \
|
|
||||||
$(all-kconfigs) | xargs $1 -a \
|
|
||||||
--langdef=kconfig \
|
|
||||||
--language-force=kconfig \
|
|
||||||
--regex-kconfig='/^[[:blank:]]*(menu|)config[[:blank:]]+([[:alnum:]_]+)/\2/'; \
|
|
||||||
$(all-defconfigs) | xargs -r $1 -a \
|
|
||||||
--langdef=dotconfig \
|
|
||||||
--language-force=dotconfig \
|
|
||||||
--regex-dotconfig='/^#?[[:blank:]]*(CONFIG_[[:alnum:]_]+)/\1/'; \
|
|
||||||
elif $1 --version 2>&1 | grep -iq emacs; then \
|
|
||||||
$(all-sources) | xargs $1 -a; \
|
|
||||||
$(all-kconfigs) | xargs $1 -a \
|
|
||||||
--regex='/^[ \t]*\(\(menu\)*config\)[ \t]+\([a-zA-Z0-9_]+\)/\3/'; \
|
|
||||||
$(all-defconfigs) | xargs -r $1 -a \
|
|
||||||
--regex='/^#?[ \t]?\(CONFIG_[a-zA-Z0-9_]+\)/\1/'; \
|
|
||||||
else \
|
|
||||||
$(all-sources) | xargs $1 -a; \
|
|
||||||
fi
|
|
||||||
endef
|
|
||||||
|
|
||||||
quiet_cmd_cscope-file = FILELST cscope.files
|
|
||||||
cmd_cscope-file = (echo \-k; echo \-q; $(all-sources)) > cscope.files
|
|
||||||
|
|
||||||
quiet_cmd_cscope = MAKE cscope.out
|
|
||||||
cmd_cscope = cscope -b -f cscope.out
|
|
||||||
|
|
||||||
cscope: FORCE
|
|
||||||
$(call cmd,cscope-file)
|
|
||||||
$(call cmd,cscope)
|
|
||||||
|
|
||||||
quiet_cmd_TAGS = MAKE $@
|
|
||||||
define cmd_TAGS
|
|
||||||
rm -f $@; \
|
|
||||||
$(call xtags,etags)
|
|
||||||
endef
|
|
||||||
|
|
||||||
TAGS: FORCE
|
|
||||||
$(call cmd,TAGS)
|
|
||||||
|
|
||||||
quiet_cmd_tags = MAKE $@
|
|
||||||
define cmd_tags
|
|
||||||
rm -f $@; \
|
|
||||||
$(call xtags,ctags)
|
|
||||||
endef
|
|
||||||
|
|
||||||
tags: FORCE
|
|
||||||
$(call cmd,tags)
|
$(call cmd,tags)
|
||||||
|
|
||||||
|
|
||||||
# Scripts to check various things for consistency
|
# Scripts to check various things for consistency
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
@ -1604,7 +1525,11 @@ endif
|
|||||||
$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
|
$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
|
||||||
|
|
||||||
# Modules
|
# Modules
|
||||||
/ %/: prepare scripts FORCE
|
/: prepare scripts FORCE
|
||||||
|
$(cmd_crmodverdir)
|
||||||
|
$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \
|
||||||
|
$(build)=$(build-dir)
|
||||||
|
%/: prepare scripts FORCE
|
||||||
$(cmd_crmodverdir)
|
$(cmd_crmodverdir)
|
||||||
$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \
|
$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \
|
||||||
$(build)=$(build-dir)
|
$(build)=$(build-dir)
|
||||||
@ -1638,7 +1563,7 @@ cmd_crmodverdir = $(Q)mkdir -p $(MODVERDIR) \
|
|||||||
$(if $(KBUILD_MODULES),; rm -f $(MODVERDIR)/*)
|
$(if $(KBUILD_MODULES),; rm -f $(MODVERDIR)/*)
|
||||||
|
|
||||||
a_flags = -Wp,-MD,$(depfile) $(KBUILD_AFLAGS) $(AFLAGS_KERNEL) \
|
a_flags = -Wp,-MD,$(depfile) $(KBUILD_AFLAGS) $(AFLAGS_KERNEL) \
|
||||||
$(NOSTDINC_FLAGS) $(KBUILD_CPPFLAGS) \
|
$(NOSTDINC_FLAGS) $(LINUXINCLUDE) $(KBUILD_CPPFLAGS) \
|
||||||
$(modkern_aflags) $(EXTRA_AFLAGS) $(AFLAGS_$(basetarget).o)
|
$(modkern_aflags) $(EXTRA_AFLAGS) $(AFLAGS_$(basetarget).o)
|
||||||
|
|
||||||
quiet_cmd_as_o_S = AS $@
|
quiet_cmd_as_o_S = AS $@
|
||||||
|
@ -19,15 +19,18 @@ void foo(void)
|
|||||||
BLANK();
|
BLANK();
|
||||||
|
|
||||||
DEFINE(TASK_BLOCKED, offsetof(struct task_struct, blocked));
|
DEFINE(TASK_BLOCKED, offsetof(struct task_struct, blocked));
|
||||||
DEFINE(TASK_UID, offsetof(struct task_struct, uid));
|
DEFINE(TASK_CRED, offsetof(struct task_struct, cred));
|
||||||
DEFINE(TASK_EUID, offsetof(struct task_struct, euid));
|
|
||||||
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_REAL_PARENT, offsetof(struct task_struct, real_parent));
|
||||||
DEFINE(TASK_GROUP_LEADER, offsetof(struct task_struct, group_leader));
|
DEFINE(TASK_GROUP_LEADER, offsetof(struct task_struct, group_leader));
|
||||||
DEFINE(TASK_TGID, offsetof(struct task_struct, tgid));
|
DEFINE(TASK_TGID, offsetof(struct task_struct, tgid));
|
||||||
BLANK();
|
BLANK();
|
||||||
|
|
||||||
|
DEFINE(CRED_UID, offsetof(struct cred, uid));
|
||||||
|
DEFINE(CRED_EUID, offsetof(struct cred, euid));
|
||||||
|
DEFINE(CRED_GID, offsetof(struct cred, gid));
|
||||||
|
DEFINE(CRED_EGID, offsetof(struct cred, egid));
|
||||||
|
BLANK();
|
||||||
|
|
||||||
DEFINE(SIZEOF_PT_REGS, sizeof(struct pt_regs));
|
DEFINE(SIZEOF_PT_REGS, sizeof(struct pt_regs));
|
||||||
DEFINE(PT_PTRACED, PT_PTRACED);
|
DEFINE(PT_PTRACED, PT_PTRACED);
|
||||||
DEFINE(CLONE_VM, CLONE_VM);
|
DEFINE(CLONE_VM, CLONE_VM);
|
||||||
|
@ -850,8 +850,9 @@ osf_getpriority:
|
|||||||
sys_getxuid:
|
sys_getxuid:
|
||||||
.prologue 0
|
.prologue 0
|
||||||
ldq $2, TI_TASK($8)
|
ldq $2, TI_TASK($8)
|
||||||
ldl $0, TASK_UID($2)
|
ldq $3, TASK_CRED($2)
|
||||||
ldl $1, TASK_EUID($2)
|
ldl $0, CRED_UID($3)
|
||||||
|
ldl $1, CRED_EUID($3)
|
||||||
stq $1, 80($sp)
|
stq $1, 80($sp)
|
||||||
ret
|
ret
|
||||||
.end sys_getxuid
|
.end sys_getxuid
|
||||||
@ -862,8 +863,9 @@ sys_getxuid:
|
|||||||
sys_getxgid:
|
sys_getxgid:
|
||||||
.prologue 0
|
.prologue 0
|
||||||
ldq $2, TI_TASK($8)
|
ldq $2, TI_TASK($8)
|
||||||
ldl $0, TASK_GID($2)
|
ldq $3, TASK_CRED($2)
|
||||||
ldl $1, TASK_EGID($2)
|
ldl $0, CRED_GID($3)
|
||||||
|
ldl $1, CRED_EGID($3)
|
||||||
stq $1, 80($sp)
|
stq $1, 80($sp)
|
||||||
ret
|
ret
|
||||||
.end sys_getxgid
|
.end sys_getxgid
|
||||||
|
@ -630,7 +630,7 @@ __sa1111_probe(struct device *me, struct resource *mem, int irq)
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
sachip->clk = clk_get(me, "SA1111_CLK");
|
sachip->clk = clk_get(me, "SA1111_CLK");
|
||||||
if (!sachip->clk) {
|
if (IS_ERR(sachip->clk)) {
|
||||||
ret = PTR_ERR(sachip->clk);
|
ret = PTR_ERR(sachip->clk);
|
||||||
goto err_free;
|
goto err_free;
|
||||||
}
|
}
|
||||||
|
@ -115,6 +115,8 @@ EXPORT_SYMBOL(__strnlen_user);
|
|||||||
EXPORT_SYMBOL(__strncpy_from_user);
|
EXPORT_SYMBOL(__strncpy_from_user);
|
||||||
|
|
||||||
#ifdef CONFIG_MMU
|
#ifdef CONFIG_MMU
|
||||||
|
EXPORT_SYMBOL(copy_page);
|
||||||
|
|
||||||
EXPORT_SYMBOL(__copy_from_user);
|
EXPORT_SYMBOL(__copy_from_user);
|
||||||
EXPORT_SYMBOL(__copy_to_user);
|
EXPORT_SYMBOL(__copy_to_user);
|
||||||
EXPORT_SYMBOL(__clear_user);
|
EXPORT_SYMBOL(__clear_user);
|
||||||
@ -181,8 +183,6 @@ EXPORT_SYMBOL(_find_first_bit_be);
|
|||||||
EXPORT_SYMBOL(_find_next_bit_be);
|
EXPORT_SYMBOL(_find_next_bit_be);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
EXPORT_SYMBOL(copy_page);
|
|
||||||
|
|
||||||
#ifdef CONFIG_FUNCTION_TRACER
|
#ifdef CONFIG_FUNCTION_TRACER
|
||||||
EXPORT_SYMBOL(mcount);
|
EXPORT_SYMBOL(mcount);
|
||||||
#endif
|
#endif
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
#include <linux/personality.h>
|
#include <linux/personality.h>
|
||||||
#include <linux/kallsyms.h>
|
#include <linux/kallsyms.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
|
#include <linux/hardirq.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
|
|
||||||
|
@ -177,7 +177,6 @@ static irqreturn_t fsg_reset_handler(int irq, void *dev_id)
|
|||||||
|
|
||||||
static void __init fsg_init(void)
|
static void __init fsg_init(void)
|
||||||
{
|
{
|
||||||
DECLARE_MAC_BUF(mac_buf);
|
|
||||||
uint8_t __iomem *f;
|
uint8_t __iomem *f;
|
||||||
|
|
||||||
ixp4xx_sys_init();
|
ixp4xx_sys_init();
|
||||||
@ -256,10 +255,10 @@ static void __init fsg_init(void)
|
|||||||
#endif
|
#endif
|
||||||
iounmap(f);
|
iounmap(f);
|
||||||
}
|
}
|
||||||
printk(KERN_INFO "FSG: Using MAC address %s for port 0\n",
|
printk(KERN_INFO "FSG: Using MAC address %pM for port 0\n",
|
||||||
print_mac(mac_buf, fsg_plat_eth[0].hwaddr));
|
fsg_plat_eth[0].hwaddr);
|
||||||
printk(KERN_INFO "FSG: Using MAC address %s for port 1\n",
|
printk(KERN_INFO "FSG: Using MAC address %pM for port 1\n",
|
||||||
print_mac(mac_buf, fsg_plat_eth[1].hwaddr));
|
fsg_plat_eth[1].hwaddr);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,6 +12,8 @@
|
|||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
|
|
||||||
|
#define DEBUG_QMGR 0
|
||||||
|
|
||||||
#define HALF_QUEUES 32
|
#define HALF_QUEUES 32
|
||||||
#define QUEUES 64 /* only 32 lower queues currently supported */
|
#define QUEUES 64 /* only 32 lower queues currently supported */
|
||||||
#define MAX_QUEUE_LENGTH 4 /* in dwords */
|
#define MAX_QUEUE_LENGTH 4 /* in dwords */
|
||||||
@ -61,22 +63,51 @@ void qmgr_enable_irq(unsigned int queue);
|
|||||||
void qmgr_disable_irq(unsigned int queue);
|
void qmgr_disable_irq(unsigned int queue);
|
||||||
|
|
||||||
/* request_ and release_queue() must be called from non-IRQ context */
|
/* request_ and release_queue() must be called from non-IRQ context */
|
||||||
|
|
||||||
|
#if DEBUG_QMGR
|
||||||
|
extern char qmgr_queue_descs[QUEUES][32];
|
||||||
|
|
||||||
int qmgr_request_queue(unsigned int queue, unsigned int len /* dwords */,
|
int qmgr_request_queue(unsigned int queue, unsigned int len /* dwords */,
|
||||||
unsigned int nearly_empty_watermark,
|
unsigned int nearly_empty_watermark,
|
||||||
unsigned int nearly_full_watermark);
|
unsigned int nearly_full_watermark,
|
||||||
|
const char *desc_format, const char* name);
|
||||||
|
#else
|
||||||
|
int __qmgr_request_queue(unsigned int queue, unsigned int len /* dwords */,
|
||||||
|
unsigned int nearly_empty_watermark,
|
||||||
|
unsigned int nearly_full_watermark);
|
||||||
|
#define qmgr_request_queue(queue, len, nearly_empty_watermark, \
|
||||||
|
nearly_full_watermark, desc_format, name) \
|
||||||
|
__qmgr_request_queue(queue, len, nearly_empty_watermark, \
|
||||||
|
nearly_full_watermark)
|
||||||
|
#endif
|
||||||
|
|
||||||
void qmgr_release_queue(unsigned int queue);
|
void qmgr_release_queue(unsigned int queue);
|
||||||
|
|
||||||
|
|
||||||
static inline void qmgr_put_entry(unsigned int queue, u32 val)
|
static inline void qmgr_put_entry(unsigned int queue, u32 val)
|
||||||
{
|
{
|
||||||
extern struct qmgr_regs __iomem *qmgr_regs;
|
extern struct qmgr_regs __iomem *qmgr_regs;
|
||||||
|
#if DEBUG_QMGR
|
||||||
|
BUG_ON(!qmgr_queue_descs[queue]); /* not yet requested */
|
||||||
|
|
||||||
|
printk(KERN_DEBUG "Queue %s(%i) put %X\n",
|
||||||
|
qmgr_queue_descs[queue], queue, val);
|
||||||
|
#endif
|
||||||
__raw_writel(val, &qmgr_regs->acc[queue][0]);
|
__raw_writel(val, &qmgr_regs->acc[queue][0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline u32 qmgr_get_entry(unsigned int queue)
|
static inline u32 qmgr_get_entry(unsigned int queue)
|
||||||
{
|
{
|
||||||
|
u32 val;
|
||||||
extern struct qmgr_regs __iomem *qmgr_regs;
|
extern struct qmgr_regs __iomem *qmgr_regs;
|
||||||
return __raw_readl(&qmgr_regs->acc[queue][0]);
|
val = __raw_readl(&qmgr_regs->acc[queue][0]);
|
||||||
|
#if DEBUG_QMGR
|
||||||
|
BUG_ON(!qmgr_queue_descs[queue]); /* not yet requested */
|
||||||
|
|
||||||
|
printk(KERN_DEBUG "Queue %s(%i) get %X\n",
|
||||||
|
qmgr_queue_descs[queue], queue, val);
|
||||||
|
#endif
|
||||||
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int qmgr_get_stat1(unsigned int queue)
|
static inline int qmgr_get_stat1(unsigned int queue)
|
||||||
|
@ -14,8 +14,6 @@
|
|||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <mach/qmgr.h>
|
#include <mach/qmgr.h>
|
||||||
|
|
||||||
#define DEBUG 0
|
|
||||||
|
|
||||||
struct qmgr_regs __iomem *qmgr_regs;
|
struct qmgr_regs __iomem *qmgr_regs;
|
||||||
static struct resource *mem_res;
|
static struct resource *mem_res;
|
||||||
static spinlock_t qmgr_lock;
|
static spinlock_t qmgr_lock;
|
||||||
@ -23,6 +21,10 @@ static u32 used_sram_bitmap[4]; /* 128 16-dword pages */
|
|||||||
static void (*irq_handlers[HALF_QUEUES])(void *pdev);
|
static void (*irq_handlers[HALF_QUEUES])(void *pdev);
|
||||||
static void *irq_pdevs[HALF_QUEUES];
|
static void *irq_pdevs[HALF_QUEUES];
|
||||||
|
|
||||||
|
#if DEBUG_QMGR
|
||||||
|
char qmgr_queue_descs[QUEUES][32];
|
||||||
|
#endif
|
||||||
|
|
||||||
void qmgr_set_irq(unsigned int queue, int src,
|
void qmgr_set_irq(unsigned int queue, int src,
|
||||||
void (*handler)(void *pdev), void *pdev)
|
void (*handler)(void *pdev), void *pdev)
|
||||||
{
|
{
|
||||||
@ -70,6 +72,7 @@ void qmgr_disable_irq(unsigned int queue)
|
|||||||
spin_lock_irqsave(&qmgr_lock, flags);
|
spin_lock_irqsave(&qmgr_lock, flags);
|
||||||
__raw_writel(__raw_readl(&qmgr_regs->irqen[0]) & ~(1 << queue),
|
__raw_writel(__raw_readl(&qmgr_regs->irqen[0]) & ~(1 << queue),
|
||||||
&qmgr_regs->irqen[0]);
|
&qmgr_regs->irqen[0]);
|
||||||
|
__raw_writel(1 << queue, &qmgr_regs->irqstat[0]); /* clear */
|
||||||
spin_unlock_irqrestore(&qmgr_lock, flags);
|
spin_unlock_irqrestore(&qmgr_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -81,9 +84,16 @@ static inline void shift_mask(u32 *mask)
|
|||||||
mask[0] <<= 1;
|
mask[0] <<= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if DEBUG_QMGR
|
||||||
int qmgr_request_queue(unsigned int queue, unsigned int len /* dwords */,
|
int qmgr_request_queue(unsigned int queue, unsigned int len /* dwords */,
|
||||||
unsigned int nearly_empty_watermark,
|
unsigned int nearly_empty_watermark,
|
||||||
unsigned int nearly_full_watermark)
|
unsigned int nearly_full_watermark,
|
||||||
|
const char *desc_format, const char* name)
|
||||||
|
#else
|
||||||
|
int __qmgr_request_queue(unsigned int queue, unsigned int len /* dwords */,
|
||||||
|
unsigned int nearly_empty_watermark,
|
||||||
|
unsigned int nearly_full_watermark)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
u32 cfg, addr = 0, mask[4]; /* in 16-dwords */
|
u32 cfg, addr = 0, mask[4]; /* in 16-dwords */
|
||||||
int err;
|
int err;
|
||||||
@ -151,12 +161,13 @@ int qmgr_request_queue(unsigned int queue, unsigned int len /* dwords */,
|
|||||||
used_sram_bitmap[2] |= mask[2];
|
used_sram_bitmap[2] |= mask[2];
|
||||||
used_sram_bitmap[3] |= mask[3];
|
used_sram_bitmap[3] |= mask[3];
|
||||||
__raw_writel(cfg | (addr << 14), &qmgr_regs->sram[queue]);
|
__raw_writel(cfg | (addr << 14), &qmgr_regs->sram[queue]);
|
||||||
spin_unlock_irq(&qmgr_lock);
|
#if DEBUG_QMGR
|
||||||
|
snprintf(qmgr_queue_descs[queue], sizeof(qmgr_queue_descs[0]),
|
||||||
#if DEBUG
|
desc_format, name);
|
||||||
printk(KERN_DEBUG "qmgr: requested queue %i, addr = 0x%02X\n",
|
printk(KERN_DEBUG "qmgr: requested queue %s(%i) addr = 0x%02X\n",
|
||||||
queue, addr);
|
qmgr_queue_descs[queue], queue, addr);
|
||||||
#endif
|
#endif
|
||||||
|
spin_unlock_irq(&qmgr_lock);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err:
|
err:
|
||||||
@ -189,6 +200,11 @@ void qmgr_release_queue(unsigned int queue)
|
|||||||
while (addr--)
|
while (addr--)
|
||||||
shift_mask(mask);
|
shift_mask(mask);
|
||||||
|
|
||||||
|
#if DEBUG_QMGR
|
||||||
|
printk(KERN_DEBUG "qmgr: releasing queue %s(%i)\n",
|
||||||
|
qmgr_queue_descs[queue], queue);
|
||||||
|
qmgr_queue_descs[queue][0] = '\x0';
|
||||||
|
#endif
|
||||||
__raw_writel(0, &qmgr_regs->sram[queue]);
|
__raw_writel(0, &qmgr_regs->sram[queue]);
|
||||||
|
|
||||||
used_sram_bitmap[0] &= ~mask[0];
|
used_sram_bitmap[0] &= ~mask[0];
|
||||||
@ -199,9 +215,10 @@ void qmgr_release_queue(unsigned int queue)
|
|||||||
spin_unlock_irq(&qmgr_lock);
|
spin_unlock_irq(&qmgr_lock);
|
||||||
|
|
||||||
module_put(THIS_MODULE);
|
module_put(THIS_MODULE);
|
||||||
#if DEBUG
|
|
||||||
printk(KERN_DEBUG "qmgr: released queue %i\n", queue);
|
while ((addr = qmgr_get_entry(queue)))
|
||||||
#endif
|
printk(KERN_ERR "qmgr: released queue %i not empty: 0x%08X\n",
|
||||||
|
queue, addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int qmgr_init(void)
|
static int qmgr_init(void)
|
||||||
@ -272,5 +289,10 @@ EXPORT_SYMBOL(qmgr_regs);
|
|||||||
EXPORT_SYMBOL(qmgr_set_irq);
|
EXPORT_SYMBOL(qmgr_set_irq);
|
||||||
EXPORT_SYMBOL(qmgr_enable_irq);
|
EXPORT_SYMBOL(qmgr_enable_irq);
|
||||||
EXPORT_SYMBOL(qmgr_disable_irq);
|
EXPORT_SYMBOL(qmgr_disable_irq);
|
||||||
|
#if DEBUG_QMGR
|
||||||
|
EXPORT_SYMBOL(qmgr_queue_descs);
|
||||||
EXPORT_SYMBOL(qmgr_request_queue);
|
EXPORT_SYMBOL(qmgr_request_queue);
|
||||||
|
#else
|
||||||
|
EXPORT_SYMBOL(__qmgr_request_queue);
|
||||||
|
#endif
|
||||||
EXPORT_SYMBOL(qmgr_release_queue);
|
EXPORT_SYMBOL(qmgr_release_queue);
|
||||||
|
@ -231,7 +231,6 @@ static irqreturn_t nas100d_reset_handler(int irq, void *dev_id)
|
|||||||
|
|
||||||
static void __init nas100d_init(void)
|
static void __init nas100d_init(void)
|
||||||
{
|
{
|
||||||
DECLARE_MAC_BUF(mac_buf);
|
|
||||||
uint8_t __iomem *f;
|
uint8_t __iomem *f;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -294,8 +293,8 @@ static void __init nas100d_init(void)
|
|||||||
#endif
|
#endif
|
||||||
iounmap(f);
|
iounmap(f);
|
||||||
}
|
}
|
||||||
printk(KERN_INFO "NAS100D: Using MAC address %s for port 0\n",
|
printk(KERN_INFO "NAS100D: Using MAC address %pM for port 0\n",
|
||||||
print_mac(mac_buf, nas100d_plat_eth[0].hwaddr));
|
nas100d_plat_eth[0].hwaddr);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -220,7 +220,6 @@ static struct sys_timer nslu2_timer = {
|
|||||||
|
|
||||||
static void __init nslu2_init(void)
|
static void __init nslu2_init(void)
|
||||||
{
|
{
|
||||||
DECLARE_MAC_BUF(mac_buf);
|
|
||||||
uint8_t __iomem *f;
|
uint8_t __iomem *f;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -275,8 +274,8 @@ static void __init nslu2_init(void)
|
|||||||
#endif
|
#endif
|
||||||
iounmap(f);
|
iounmap(f);
|
||||||
}
|
}
|
||||||
printk(KERN_INFO "NSLU2: Using MAC address %s for port 0\n",
|
printk(KERN_INFO "NSLU2: Using MAC address %pM for port 0\n",
|
||||||
print_mac(mac_buf, nslu2_plat_eth[0].hwaddr));
|
nslu2_plat_eth[0].hwaddr);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
13
arch/arm/mach-pxa/include/mach/palmasoc.h
Normal file
13
arch/arm/mach-pxa/include/mach/palmasoc.h
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#ifndef _INCLUDE_PALMASOC_H_
|
||||||
|
#define _INCLUDE_PALMASOC_H_
|
||||||
|
struct palm27x_asoc_info {
|
||||||
|
int jack_gpio;
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef CONFIG_SND_PXA2XX_SOC_PALM27X
|
||||||
|
void __init palm27x_asoc_set_pdata(struct palm27x_asoc_info *data);
|
||||||
|
#else
|
||||||
|
static inline void palm27x_asoc_set_pdata(struct palm27x_asoc_info *data) {}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
@ -12,9 +12,8 @@ extern void clear_reset_status(unsigned int mask);
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* init_gpio_reset() - register GPIO as reset generator
|
* init_gpio_reset() - register GPIO as reset generator
|
||||||
*
|
* @gpio: gpio nr
|
||||||
* @gpio - gpio nr
|
* @output: set gpio as out/low instead of input during normal work
|
||||||
* @output - set gpio as out/low instead of input during normal work
|
|
||||||
*/
|
*/
|
||||||
extern int init_gpio_reset(int gpio, int output);
|
extern int init_gpio_reset(int gpio, int output);
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/signal.h>
|
#include <linux/signal.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
|
#include <linux/hardirq.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/kprobes.h>
|
#include <linux/kprobes.h>
|
||||||
#include <linux/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
#include <linux/mtd/partitions.h>
|
#include <linux/mtd/partitions.h>
|
||||||
#include <linux/mtd/physmap.h>
|
#include <linux/mtd/physmap.h>
|
||||||
|
|
||||||
#include <asm/arch/smc.h>
|
#include <mach/smc.h>
|
||||||
|
|
||||||
static struct smc_timing flash_timing __initdata = {
|
static struct smc_timing flash_timing __initdata = {
|
||||||
.ncs_read_setup = 0,
|
.ncs_read_setup = 0,
|
||||||
|
@ -25,10 +25,10 @@
|
|||||||
|
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
|
|
||||||
#include <asm/arch/at32ap700x.h>
|
#include <mach/at32ap700x.h>
|
||||||
#include <asm/arch/init.h>
|
#include <mach/init.h>
|
||||||
#include <asm/arch/board.h>
|
#include <mach/board.h>
|
||||||
#include <asm/arch/portmux.h>
|
#include <mach/portmux.h>
|
||||||
|
|
||||||
/* Oscillator frequencies. These are board-specific */
|
/* Oscillator frequencies. These are board-specific */
|
||||||
unsigned long at32_board_osc_rates[3] = {
|
unsigned long at32_board_osc_rates[3] = {
|
||||||
|
@ -10,7 +10,7 @@ MKIMAGE := $(srctree)/scripts/mkuboot.sh
|
|||||||
|
|
||||||
extra-y := vmlinux.bin vmlinux.gz
|
extra-y := vmlinux.bin vmlinux.gz
|
||||||
|
|
||||||
OBJCOPYFLAGS_vmlinux.bin := -O binary
|
OBJCOPYFLAGS_vmlinux.bin := -O binary -R .note.gnu.build-id
|
||||||
$(obj)/vmlinux.bin: vmlinux FORCE
|
$(obj)/vmlinux.bin: vmlinux FORCE
|
||||||
$(call if_changed,objcopy)
|
$(call if_changed,objcopy)
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#
|
#
|
||||||
# Automatically generated make config: don't edit
|
# Automatically generated make config: don't edit
|
||||||
# Linux kernel version: 2.6.27-rc1
|
# Linux kernel version: 2.6.28-rc8
|
||||||
# Tue Aug 5 15:40:26 2008
|
# Thu Dec 18 11:22:23 2008
|
||||||
#
|
#
|
||||||
CONFIG_AVR32=y
|
CONFIG_AVR32=y
|
||||||
CONFIG_GENERIC_GPIO=y
|
CONFIG_GENERIC_GPIO=y
|
||||||
@ -67,6 +67,7 @@ CONFIG_SIGNALFD=y
|
|||||||
CONFIG_TIMERFD=y
|
CONFIG_TIMERFD=y
|
||||||
CONFIG_EVENTFD=y
|
CONFIG_EVENTFD=y
|
||||||
CONFIG_SHMEM=y
|
CONFIG_SHMEM=y
|
||||||
|
CONFIG_AIO=y
|
||||||
CONFIG_VM_EVENT_COUNTERS=y
|
CONFIG_VM_EVENT_COUNTERS=y
|
||||||
CONFIG_SLUB_DEBUG=y
|
CONFIG_SLUB_DEBUG=y
|
||||||
# CONFIG_SLAB is not set
|
# CONFIG_SLAB is not set
|
||||||
@ -77,15 +78,8 @@ CONFIG_PROFILING=y
|
|||||||
CONFIG_OPROFILE=m
|
CONFIG_OPROFILE=m
|
||||||
CONFIG_HAVE_OPROFILE=y
|
CONFIG_HAVE_OPROFILE=y
|
||||||
CONFIG_KPROBES=y
|
CONFIG_KPROBES=y
|
||||||
# CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS is not set
|
|
||||||
# CONFIG_HAVE_IOREMAP_PROT is not set
|
|
||||||
CONFIG_HAVE_KPROBES=y
|
CONFIG_HAVE_KPROBES=y
|
||||||
# CONFIG_HAVE_KRETPROBES is not set
|
|
||||||
# CONFIG_HAVE_ARCH_TRACEHOOK is not set
|
|
||||||
# CONFIG_HAVE_DMA_ATTRS is not set
|
|
||||||
# CONFIG_USE_GENERIC_SMP_HELPERS is not set
|
|
||||||
CONFIG_HAVE_CLK=y
|
CONFIG_HAVE_CLK=y
|
||||||
CONFIG_PROC_PAGE_MONITOR=y
|
|
||||||
# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
|
# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
|
||||||
CONFIG_SLABINFO=y
|
CONFIG_SLABINFO=y
|
||||||
CONFIG_RT_MUTEXES=y
|
CONFIG_RT_MUTEXES=y
|
||||||
@ -118,6 +112,7 @@ CONFIG_DEFAULT_CFQ=y
|
|||||||
# CONFIG_DEFAULT_NOOP is not set
|
# CONFIG_DEFAULT_NOOP is not set
|
||||||
CONFIG_DEFAULT_IOSCHED="cfq"
|
CONFIG_DEFAULT_IOSCHED="cfq"
|
||||||
CONFIG_CLASSIC_RCU=y
|
CONFIG_CLASSIC_RCU=y
|
||||||
|
CONFIG_FREEZER=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# System Type and features
|
# System Type and features
|
||||||
@ -134,6 +129,8 @@ CONFIG_CPU_AT32AP700X=y
|
|||||||
CONFIG_CPU_AT32AP7000=y
|
CONFIG_CPU_AT32AP7000=y
|
||||||
CONFIG_BOARD_ATSTK1000=y
|
CONFIG_BOARD_ATSTK1000=y
|
||||||
# CONFIG_BOARD_ATNGW100 is not set
|
# CONFIG_BOARD_ATNGW100 is not set
|
||||||
|
# CONFIG_BOARD_FAVR_32 is not set
|
||||||
|
# CONFIG_BOARD_MIMC200 is not set
|
||||||
# CONFIG_BOARD_ATSTK1002 is not set
|
# CONFIG_BOARD_ATSTK1002 is not set
|
||||||
# CONFIG_BOARD_ATSTK1003 is not set
|
# CONFIG_BOARD_ATSTK1003 is not set
|
||||||
# CONFIG_BOARD_ATSTK1004 is not set
|
# CONFIG_BOARD_ATSTK1004 is not set
|
||||||
@ -171,14 +168,14 @@ CONFIG_FLATMEM_MANUAL=y
|
|||||||
# CONFIG_SPARSEMEM_MANUAL is not set
|
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||||
CONFIG_FLATMEM=y
|
CONFIG_FLATMEM=y
|
||||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||||
# CONFIG_SPARSEMEM_STATIC is not set
|
|
||||||
# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
|
|
||||||
CONFIG_PAGEFLAGS_EXTENDED=y
|
CONFIG_PAGEFLAGS_EXTENDED=y
|
||||||
CONFIG_SPLIT_PTLOCK_CPUS=4
|
CONFIG_SPLIT_PTLOCK_CPUS=4
|
||||||
# CONFIG_RESOURCES_64BIT is not set
|
# CONFIG_RESOURCES_64BIT is not set
|
||||||
|
# CONFIG_PHYS_ADDR_T_64BIT is not set
|
||||||
CONFIG_ZONE_DMA_FLAG=0
|
CONFIG_ZONE_DMA_FLAG=0
|
||||||
CONFIG_NR_QUICK=2
|
CONFIG_NR_QUICK=2
|
||||||
CONFIG_VIRT_TO_BUS=y
|
CONFIG_VIRT_TO_BUS=y
|
||||||
|
CONFIG_UNEVICTABLE_LRU=y
|
||||||
# CONFIG_OWNERSHIP_TRACE is not set
|
# CONFIG_OWNERSHIP_TRACE is not set
|
||||||
CONFIG_NMI_DEBUGGING=y
|
CONFIG_NMI_DEBUGGING=y
|
||||||
# CONFIG_HZ_100 is not set
|
# CONFIG_HZ_100 is not set
|
||||||
@ -186,7 +183,7 @@ CONFIG_HZ_250=y
|
|||||||
# CONFIG_HZ_300 is not set
|
# CONFIG_HZ_300 is not set
|
||||||
# CONFIG_HZ_1000 is not set
|
# CONFIG_HZ_1000 is not set
|
||||||
CONFIG_HZ=250
|
CONFIG_HZ=250
|
||||||
# CONFIG_SCHED_HRTICK is not set
|
CONFIG_SCHED_HRTICK=y
|
||||||
CONFIG_CMDLINE=""
|
CONFIG_CMDLINE=""
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -228,6 +225,8 @@ CONFIG_CPU_FREQ_AT32AP=y
|
|||||||
# Executable file formats
|
# Executable file formats
|
||||||
#
|
#
|
||||||
CONFIG_BINFMT_ELF=y
|
CONFIG_BINFMT_ELF=y
|
||||||
|
CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y
|
||||||
|
# CONFIG_HAVE_AOUT is not set
|
||||||
# CONFIG_BINFMT_MISC is not set
|
# CONFIG_BINFMT_MISC is not set
|
||||||
CONFIG_NET=y
|
CONFIG_NET=y
|
||||||
|
|
||||||
@ -299,6 +298,7 @@ CONFIG_IPV6_TUNNEL=m
|
|||||||
# CONFIG_ATM is not set
|
# CONFIG_ATM is not set
|
||||||
CONFIG_STP=m
|
CONFIG_STP=m
|
||||||
CONFIG_BRIDGE=m
|
CONFIG_BRIDGE=m
|
||||||
|
# CONFIG_NET_DSA is not set
|
||||||
# CONFIG_VLAN_8021Q is not set
|
# CONFIG_VLAN_8021Q is not set
|
||||||
# CONFIG_DECNET is not set
|
# CONFIG_DECNET is not set
|
||||||
CONFIG_LLC=m
|
CONFIG_LLC=m
|
||||||
@ -321,14 +321,8 @@ CONFIG_LLC=m
|
|||||||
# CONFIG_IRDA is not set
|
# CONFIG_IRDA is not set
|
||||||
# CONFIG_BT is not set
|
# CONFIG_BT is not set
|
||||||
# CONFIG_AF_RXRPC is not set
|
# CONFIG_AF_RXRPC is not set
|
||||||
|
# CONFIG_PHONET is not set
|
||||||
#
|
# CONFIG_WIRELESS is not set
|
||||||
# Wireless
|
|
||||||
#
|
|
||||||
# CONFIG_CFG80211 is not set
|
|
||||||
# CONFIG_WIRELESS_EXT is not set
|
|
||||||
# CONFIG_MAC80211 is not set
|
|
||||||
# CONFIG_IEEE80211 is not set
|
|
||||||
# CONFIG_RFKILL is not set
|
# CONFIG_RFKILL is not set
|
||||||
# CONFIG_NET_9P is not set
|
# CONFIG_NET_9P is not set
|
||||||
|
|
||||||
@ -359,6 +353,7 @@ CONFIG_MTD_CMDLINE_PARTS=y
|
|||||||
# User Modules And Translation Layers
|
# User Modules And Translation Layers
|
||||||
#
|
#
|
||||||
CONFIG_MTD_CHAR=y
|
CONFIG_MTD_CHAR=y
|
||||||
|
CONFIG_HAVE_MTD_OTP=y
|
||||||
CONFIG_MTD_BLKDEVS=y
|
CONFIG_MTD_BLKDEVS=y
|
||||||
CONFIG_MTD_BLOCK=y
|
CONFIG_MTD_BLOCK=y
|
||||||
# CONFIG_FTL is not set
|
# CONFIG_FTL is not set
|
||||||
@ -407,6 +402,8 @@ CONFIG_MTD_PHYSMAP_BANKWIDTH=2
|
|||||||
# Self-contained MTD device drivers
|
# Self-contained MTD device drivers
|
||||||
#
|
#
|
||||||
CONFIG_MTD_DATAFLASH=m
|
CONFIG_MTD_DATAFLASH=m
|
||||||
|
# CONFIG_MTD_DATAFLASH_WRITE_VERIFY is not set
|
||||||
|
CONFIG_MTD_DATAFLASH_OTP=y
|
||||||
CONFIG_MTD_M25P80=m
|
CONFIG_MTD_M25P80=m
|
||||||
CONFIG_M25PXX_USE_FAST_READ=y
|
CONFIG_M25PXX_USE_FAST_READ=y
|
||||||
# CONFIG_MTD_SLRAM is not set
|
# CONFIG_MTD_SLRAM is not set
|
||||||
@ -464,9 +461,10 @@ CONFIG_ATMEL_TCLIB=y
|
|||||||
CONFIG_ATMEL_TCB_CLKSRC=y
|
CONFIG_ATMEL_TCB_CLKSRC=y
|
||||||
CONFIG_ATMEL_TCB_CLKSRC_BLOCK=0
|
CONFIG_ATMEL_TCB_CLKSRC_BLOCK=0
|
||||||
# CONFIG_EEPROM_93CX6 is not set
|
# CONFIG_EEPROM_93CX6 is not set
|
||||||
|
# CONFIG_ICS932S401 is not set
|
||||||
CONFIG_ATMEL_SSC=m
|
CONFIG_ATMEL_SSC=m
|
||||||
# CONFIG_ENCLOSURE_SERVICES is not set
|
# CONFIG_ENCLOSURE_SERVICES is not set
|
||||||
# CONFIG_HAVE_IDE is not set
|
# CONFIG_C2PORT is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# SCSI device support
|
# SCSI device support
|
||||||
@ -548,6 +546,9 @@ CONFIG_MACB=y
|
|||||||
# CONFIG_IBM_NEW_EMAC_RGMII is not set
|
# CONFIG_IBM_NEW_EMAC_RGMII is not set
|
||||||
# CONFIG_IBM_NEW_EMAC_TAH is not set
|
# CONFIG_IBM_NEW_EMAC_TAH is not set
|
||||||
# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
|
# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
|
||||||
|
# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
|
||||||
|
# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
|
||||||
|
# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
|
||||||
# CONFIG_B44 is not set
|
# CONFIG_B44 is not set
|
||||||
# CONFIG_NETDEV_1000 is not set
|
# CONFIG_NETDEV_1000 is not set
|
||||||
# CONFIG_NETDEV_10000 is not set
|
# CONFIG_NETDEV_10000 is not set
|
||||||
@ -653,6 +654,7 @@ CONFIG_UNIX98_PTYS=y
|
|||||||
CONFIG_I2C=m
|
CONFIG_I2C=m
|
||||||
CONFIG_I2C_BOARDINFO=y
|
CONFIG_I2C_BOARDINFO=y
|
||||||
CONFIG_I2C_CHARDEV=m
|
CONFIG_I2C_CHARDEV=m
|
||||||
|
CONFIG_I2C_HELPER_AUTO=y
|
||||||
CONFIG_I2C_ALGOBIT=m
|
CONFIG_I2C_ALGOBIT=m
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -716,6 +718,10 @@ CONFIG_GPIOLIB=y
|
|||||||
# CONFIG_DEBUG_GPIO is not set
|
# CONFIG_DEBUG_GPIO is not set
|
||||||
CONFIG_GPIO_SYSFS=y
|
CONFIG_GPIO_SYSFS=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# Memory mapped GPIO expanders:
|
||||||
|
#
|
||||||
|
|
||||||
#
|
#
|
||||||
# I2C GPIO expanders:
|
# I2C GPIO expanders:
|
||||||
#
|
#
|
||||||
@ -745,11 +751,11 @@ CONFIG_WATCHDOG=y
|
|||||||
#
|
#
|
||||||
# CONFIG_SOFT_WATCHDOG is not set
|
# CONFIG_SOFT_WATCHDOG is not set
|
||||||
CONFIG_AT32AP700X_WDT=y
|
CONFIG_AT32AP700X_WDT=y
|
||||||
|
CONFIG_SSB_POSSIBLE=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# Sonics Silicon Backplane
|
# Sonics Silicon Backplane
|
||||||
#
|
#
|
||||||
CONFIG_SSB_POSSIBLE=y
|
|
||||||
# CONFIG_SSB is not set
|
# CONFIG_SSB is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -758,6 +764,10 @@ CONFIG_SSB_POSSIBLE=y
|
|||||||
# CONFIG_MFD_CORE is not set
|
# CONFIG_MFD_CORE is not set
|
||||||
# CONFIG_MFD_SM501 is not set
|
# CONFIG_MFD_SM501 is not set
|
||||||
# CONFIG_HTC_PASIC3 is not set
|
# CONFIG_HTC_PASIC3 is not set
|
||||||
|
# CONFIG_MFD_TMIO is not set
|
||||||
|
# CONFIG_MFD_WM8400 is not set
|
||||||
|
# CONFIG_MFD_WM8350_I2C is not set
|
||||||
|
# CONFIG_REGULATOR is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Multimedia devices
|
# Multimedia devices
|
||||||
@ -783,6 +793,7 @@ CONFIG_SSB_POSSIBLE=y
|
|||||||
CONFIG_FB=y
|
CONFIG_FB=y
|
||||||
# CONFIG_FIRMWARE_EDID is not set
|
# CONFIG_FIRMWARE_EDID is not set
|
||||||
# CONFIG_FB_DDC is not set
|
# CONFIG_FB_DDC is not set
|
||||||
|
# CONFIG_FB_BOOT_VESA_SUPPORT is not set
|
||||||
CONFIG_FB_CFB_FILLRECT=y
|
CONFIG_FB_CFB_FILLRECT=y
|
||||||
CONFIG_FB_CFB_COPYAREA=y
|
CONFIG_FB_CFB_COPYAREA=y
|
||||||
CONFIG_FB_CFB_IMAGEBLIT=y
|
CONFIG_FB_CFB_IMAGEBLIT=y
|
||||||
@ -804,10 +815,13 @@ CONFIG_FB_CFB_IMAGEBLIT=y
|
|||||||
# CONFIG_FB_S1D13XXX is not set
|
# CONFIG_FB_S1D13XXX is not set
|
||||||
CONFIG_FB_ATMEL=y
|
CONFIG_FB_ATMEL=y
|
||||||
# CONFIG_FB_VIRTUAL is not set
|
# CONFIG_FB_VIRTUAL is not set
|
||||||
|
# CONFIG_FB_METRONOME is not set
|
||||||
|
# CONFIG_FB_MB862XX is not set
|
||||||
CONFIG_BACKLIGHT_LCD_SUPPORT=y
|
CONFIG_BACKLIGHT_LCD_SUPPORT=y
|
||||||
CONFIG_LCD_CLASS_DEVICE=y
|
CONFIG_LCD_CLASS_DEVICE=y
|
||||||
CONFIG_LCD_LTV350QV=y
|
CONFIG_LCD_LTV350QV=y
|
||||||
# CONFIG_LCD_ILI9320 is not set
|
# CONFIG_LCD_ILI9320 is not set
|
||||||
|
# CONFIG_LCD_TDO24M is not set
|
||||||
# CONFIG_LCD_VGG2432A4 is not set
|
# CONFIG_LCD_VGG2432A4 is not set
|
||||||
# CONFIG_LCD_PLATFORM is not set
|
# CONFIG_LCD_PLATFORM is not set
|
||||||
# CONFIG_BACKLIGHT_CLASS_DEVICE is not set
|
# CONFIG_BACKLIGHT_CLASS_DEVICE is not set
|
||||||
@ -818,6 +832,7 @@ CONFIG_LCD_LTV350QV=y
|
|||||||
# CONFIG_DISPLAY_SUPPORT is not set
|
# CONFIG_DISPLAY_SUPPORT is not set
|
||||||
# CONFIG_LOGO is not set
|
# CONFIG_LOGO is not set
|
||||||
CONFIG_SOUND=m
|
CONFIG_SOUND=m
|
||||||
|
CONFIG_SOUND_OSS_CORE=y
|
||||||
CONFIG_SND=m
|
CONFIG_SND=m
|
||||||
CONFIG_SND_TIMER=m
|
CONFIG_SND_TIMER=m
|
||||||
CONFIG_SND_PCM=m
|
CONFIG_SND_PCM=m
|
||||||
@ -848,28 +863,32 @@ CONFIG_USB_SUPPORT=y
|
|||||||
# CONFIG_USB_ARCH_HAS_EHCI is not set
|
# CONFIG_USB_ARCH_HAS_EHCI is not set
|
||||||
# CONFIG_USB_OTG_WHITELIST is not set
|
# CONFIG_USB_OTG_WHITELIST is not set
|
||||||
# CONFIG_USB_OTG_BLACKLIST_HUB is not set
|
# CONFIG_USB_OTG_BLACKLIST_HUB is not set
|
||||||
|
# CONFIG_USB_MUSB_HDRC is not set
|
||||||
|
# CONFIG_USB_GADGET_MUSB_HDRC is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
|
# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed;
|
||||||
#
|
#
|
||||||
CONFIG_USB_GADGET=y
|
CONFIG_USB_GADGET=y
|
||||||
# CONFIG_USB_GADGET_DEBUG is not set
|
# CONFIG_USB_GADGET_DEBUG is not set
|
||||||
# CONFIG_USB_GADGET_DEBUG_FILES is not set
|
# CONFIG_USB_GADGET_DEBUG_FILES is not set
|
||||||
# CONFIG_USB_GADGET_DEBUG_FS is not set
|
# CONFIG_USB_GADGET_DEBUG_FS is not set
|
||||||
|
CONFIG_USB_GADGET_VBUS_DRAW=2
|
||||||
CONFIG_USB_GADGET_SELECTED=y
|
CONFIG_USB_GADGET_SELECTED=y
|
||||||
# CONFIG_USB_GADGET_AMD5536UDC is not set
|
# CONFIG_USB_GADGET_AT91 is not set
|
||||||
CONFIG_USB_GADGET_ATMEL_USBA=y
|
CONFIG_USB_GADGET_ATMEL_USBA=y
|
||||||
CONFIG_USB_ATMEL_USBA=y
|
CONFIG_USB_ATMEL_USBA=y
|
||||||
# CONFIG_USB_GADGET_FSL_USB2 is not set
|
# CONFIG_USB_GADGET_FSL_USB2 is not set
|
||||||
# CONFIG_USB_GADGET_NET2280 is not set
|
|
||||||
# CONFIG_USB_GADGET_PXA25X is not set
|
|
||||||
# CONFIG_USB_GADGET_M66592 is not set
|
|
||||||
# CONFIG_USB_GADGET_PXA27X is not set
|
|
||||||
# CONFIG_USB_GADGET_GOKU is not set
|
|
||||||
# CONFIG_USB_GADGET_LH7A40X is not set
|
# CONFIG_USB_GADGET_LH7A40X is not set
|
||||||
# CONFIG_USB_GADGET_OMAP is not set
|
# CONFIG_USB_GADGET_OMAP is not set
|
||||||
|
# CONFIG_USB_GADGET_PXA25X is not set
|
||||||
|
# CONFIG_USB_GADGET_PXA27X is not set
|
||||||
# CONFIG_USB_GADGET_S3C2410 is not set
|
# CONFIG_USB_GADGET_S3C2410 is not set
|
||||||
# CONFIG_USB_GADGET_AT91 is not set
|
# CONFIG_USB_GADGET_M66592 is not set
|
||||||
|
# CONFIG_USB_GADGET_AMD5536UDC is not set
|
||||||
|
# CONFIG_USB_GADGET_FSL_QE is not set
|
||||||
|
# CONFIG_USB_GADGET_NET2280 is not set
|
||||||
|
# CONFIG_USB_GADGET_GOKU is not set
|
||||||
# CONFIG_USB_GADGET_DUMMY_HCD is not set
|
# CONFIG_USB_GADGET_DUMMY_HCD is not set
|
||||||
CONFIG_USB_GADGET_DUALSPEED=y
|
CONFIG_USB_GADGET_DUALSPEED=y
|
||||||
CONFIG_USB_ZERO=m
|
CONFIG_USB_ZERO=m
|
||||||
@ -887,7 +906,7 @@ CONFIG_MMC=y
|
|||||||
# CONFIG_MMC_UNSAFE_RESUME is not set
|
# CONFIG_MMC_UNSAFE_RESUME is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# MMC/SD Card Drivers
|
# MMC/SD/SDIO Card Drivers
|
||||||
#
|
#
|
||||||
CONFIG_MMC_BLOCK=y
|
CONFIG_MMC_BLOCK=y
|
||||||
CONFIG_MMC_BLOCK_BOUNCE=y
|
CONFIG_MMC_BLOCK_BOUNCE=y
|
||||||
@ -895,10 +914,11 @@ CONFIG_MMC_BLOCK_BOUNCE=y
|
|||||||
# CONFIG_MMC_TEST is not set
|
# CONFIG_MMC_TEST is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# MMC/SD Host Controller Drivers
|
# MMC/SD/SDIO Host Controller Drivers
|
||||||
#
|
#
|
||||||
# CONFIG_MMC_SDHCI is not set
|
# CONFIG_MMC_SDHCI is not set
|
||||||
CONFIG_MMC_ATMELMCI=y
|
CONFIG_MMC_ATMELMCI=y
|
||||||
|
# CONFIG_MMC_ATMELMCI_DMA is not set
|
||||||
CONFIG_MMC_SPI=m
|
CONFIG_MMC_SPI=m
|
||||||
# CONFIG_MEMSTICK is not set
|
# CONFIG_MEMSTICK is not set
|
||||||
CONFIG_NEW_LEDS=y
|
CONFIG_NEW_LEDS=y
|
||||||
@ -918,6 +938,7 @@ CONFIG_LEDS_GPIO=m
|
|||||||
CONFIG_LEDS_TRIGGERS=y
|
CONFIG_LEDS_TRIGGERS=y
|
||||||
CONFIG_LEDS_TRIGGER_TIMER=m
|
CONFIG_LEDS_TRIGGER_TIMER=m
|
||||||
CONFIG_LEDS_TRIGGER_HEARTBEAT=m
|
CONFIG_LEDS_TRIGGER_HEARTBEAT=m
|
||||||
|
# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
|
||||||
CONFIG_LEDS_TRIGGER_DEFAULT_ON=m
|
CONFIG_LEDS_TRIGGER_DEFAULT_ON=m
|
||||||
# CONFIG_ACCESSIBILITY is not set
|
# CONFIG_ACCESSIBILITY is not set
|
||||||
CONFIG_RTC_LIB=y
|
CONFIG_RTC_LIB=y
|
||||||
@ -950,25 +971,31 @@ CONFIG_RTC_INTF_DEV=y
|
|||||||
# CONFIG_RTC_DRV_M41T80 is not set
|
# CONFIG_RTC_DRV_M41T80 is not set
|
||||||
# CONFIG_RTC_DRV_S35390A is not set
|
# CONFIG_RTC_DRV_S35390A is not set
|
||||||
# CONFIG_RTC_DRV_FM3130 is not set
|
# CONFIG_RTC_DRV_FM3130 is not set
|
||||||
|
# CONFIG_RTC_DRV_RX8581 is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# SPI RTC drivers
|
# SPI RTC drivers
|
||||||
#
|
#
|
||||||
# CONFIG_RTC_DRV_M41T94 is not set
|
# CONFIG_RTC_DRV_M41T94 is not set
|
||||||
# CONFIG_RTC_DRV_DS1305 is not set
|
# CONFIG_RTC_DRV_DS1305 is not set
|
||||||
|
# CONFIG_RTC_DRV_DS1390 is not set
|
||||||
# CONFIG_RTC_DRV_MAX6902 is not set
|
# CONFIG_RTC_DRV_MAX6902 is not set
|
||||||
# CONFIG_RTC_DRV_R9701 is not set
|
# CONFIG_RTC_DRV_R9701 is not set
|
||||||
# CONFIG_RTC_DRV_RS5C348 is not set
|
# CONFIG_RTC_DRV_RS5C348 is not set
|
||||||
|
# CONFIG_RTC_DRV_DS3234 is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Platform RTC drivers
|
# Platform RTC drivers
|
||||||
#
|
#
|
||||||
|
# CONFIG_RTC_DRV_DS1286 is not set
|
||||||
# CONFIG_RTC_DRV_DS1511 is not set
|
# CONFIG_RTC_DRV_DS1511 is not set
|
||||||
# CONFIG_RTC_DRV_DS1553 is not set
|
# CONFIG_RTC_DRV_DS1553 is not set
|
||||||
# CONFIG_RTC_DRV_DS1742 is not set
|
# CONFIG_RTC_DRV_DS1742 is not set
|
||||||
# CONFIG_RTC_DRV_STK17TA8 is not set
|
# CONFIG_RTC_DRV_STK17TA8 is not set
|
||||||
# CONFIG_RTC_DRV_M48T86 is not set
|
# CONFIG_RTC_DRV_M48T86 is not set
|
||||||
|
# CONFIG_RTC_DRV_M48T35 is not set
|
||||||
# CONFIG_RTC_DRV_M48T59 is not set
|
# CONFIG_RTC_DRV_M48T59 is not set
|
||||||
|
# CONFIG_RTC_DRV_BQ4802 is not set
|
||||||
# CONFIG_RTC_DRV_V3020 is not set
|
# CONFIG_RTC_DRV_V3020 is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -989,6 +1016,8 @@ CONFIG_DMA_ENGINE=y
|
|||||||
# CONFIG_NET_DMA is not set
|
# CONFIG_NET_DMA is not set
|
||||||
CONFIG_DMATEST=m
|
CONFIG_DMATEST=m
|
||||||
# CONFIG_UIO is not set
|
# CONFIG_UIO is not set
|
||||||
|
# CONFIG_STAGING is not set
|
||||||
|
CONFIG_STAGING_EXCLUDE_BUILD=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# File systems
|
# File systems
|
||||||
@ -998,12 +1027,17 @@ CONFIG_EXT2_FS=m
|
|||||||
# CONFIG_EXT2_FS_XIP is not set
|
# CONFIG_EXT2_FS_XIP is not set
|
||||||
CONFIG_EXT3_FS=m
|
CONFIG_EXT3_FS=m
|
||||||
# CONFIG_EXT3_FS_XATTR is not set
|
# CONFIG_EXT3_FS_XATTR is not set
|
||||||
# CONFIG_EXT4DEV_FS is not set
|
CONFIG_EXT4_FS=m
|
||||||
|
CONFIG_EXT4DEV_COMPAT=y
|
||||||
|
# CONFIG_EXT4_FS_XATTR is not set
|
||||||
CONFIG_JBD=m
|
CONFIG_JBD=m
|
||||||
# CONFIG_JBD_DEBUG is not set
|
# CONFIG_JBD_DEBUG is not set
|
||||||
|
CONFIG_JBD2=m
|
||||||
|
# CONFIG_JBD2_DEBUG is not set
|
||||||
# CONFIG_REISERFS_FS is not set
|
# CONFIG_REISERFS_FS is not set
|
||||||
# CONFIG_JFS_FS is not set
|
# CONFIG_JFS_FS is not set
|
||||||
# CONFIG_FS_POSIX_ACL is not set
|
# CONFIG_FS_POSIX_ACL is not set
|
||||||
|
CONFIG_FILE_LOCKING=y
|
||||||
# CONFIG_XFS_FS is not set
|
# CONFIG_XFS_FS is not set
|
||||||
# CONFIG_OCFS2_FS is not set
|
# CONFIG_OCFS2_FS is not set
|
||||||
# CONFIG_DNOTIFY is not set
|
# CONFIG_DNOTIFY is not set
|
||||||
@ -1036,6 +1070,7 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
|
|||||||
CONFIG_PROC_FS=y
|
CONFIG_PROC_FS=y
|
||||||
CONFIG_PROC_KCORE=y
|
CONFIG_PROC_KCORE=y
|
||||||
CONFIG_PROC_SYSCTL=y
|
CONFIG_PROC_SYSCTL=y
|
||||||
|
CONFIG_PROC_PAGE_MONITOR=y
|
||||||
CONFIG_SYSFS=y
|
CONFIG_SYSFS=y
|
||||||
CONFIG_TMPFS=y
|
CONFIG_TMPFS=y
|
||||||
# CONFIG_TMPFS_POSIX_ACL is not set
|
# CONFIG_TMPFS_POSIX_ACL is not set
|
||||||
@ -1054,7 +1089,8 @@ CONFIG_TMPFS=y
|
|||||||
# CONFIG_EFS_FS is not set
|
# CONFIG_EFS_FS is not set
|
||||||
CONFIG_JFFS2_FS=y
|
CONFIG_JFFS2_FS=y
|
||||||
CONFIG_JFFS2_FS_DEBUG=0
|
CONFIG_JFFS2_FS_DEBUG=0
|
||||||
# CONFIG_JFFS2_FS_WRITEBUFFER is not set
|
CONFIG_JFFS2_FS_WRITEBUFFER=y
|
||||||
|
# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
|
||||||
# CONFIG_JFFS2_SUMMARY is not set
|
# CONFIG_JFFS2_SUMMARY is not set
|
||||||
# CONFIG_JFFS2_FS_XATTR is not set
|
# CONFIG_JFFS2_FS_XATTR is not set
|
||||||
# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
|
# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
|
||||||
@ -1088,6 +1124,7 @@ CONFIG_LOCKD=y
|
|||||||
CONFIG_LOCKD_V4=y
|
CONFIG_LOCKD_V4=y
|
||||||
CONFIG_NFS_COMMON=y
|
CONFIG_NFS_COMMON=y
|
||||||
CONFIG_SUNRPC=y
|
CONFIG_SUNRPC=y
|
||||||
|
# CONFIG_SUNRPC_REGISTER_V4 is not set
|
||||||
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
||||||
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
||||||
# CONFIG_SMB_FS is not set
|
# CONFIG_SMB_FS is not set
|
||||||
@ -1185,10 +1222,21 @@ CONFIG_DEBUG_BUGVERBOSE=y
|
|||||||
CONFIG_FRAME_POINTER=y
|
CONFIG_FRAME_POINTER=y
|
||||||
# CONFIG_BOOT_PRINTK_DELAY is not set
|
# CONFIG_BOOT_PRINTK_DELAY is not set
|
||||||
# CONFIG_RCU_TORTURE_TEST is not set
|
# CONFIG_RCU_TORTURE_TEST is not set
|
||||||
|
# CONFIG_RCU_CPU_STALL_DETECTOR is not set
|
||||||
# CONFIG_KPROBES_SANITY_TEST is not set
|
# CONFIG_KPROBES_SANITY_TEST is not set
|
||||||
# CONFIG_BACKTRACE_SELF_TEST is not set
|
# CONFIG_BACKTRACE_SELF_TEST is not set
|
||||||
|
# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
|
||||||
# CONFIG_LKDTM is not set
|
# CONFIG_LKDTM is not set
|
||||||
# CONFIG_FAULT_INJECTION is not set
|
# CONFIG_FAULT_INJECTION is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Tracers
|
||||||
|
#
|
||||||
|
# CONFIG_IRQSOFF_TRACER is not set
|
||||||
|
# CONFIG_SCHED_TRACER is not set
|
||||||
|
# CONFIG_CONTEXT_SWITCH_TRACER is not set
|
||||||
|
# CONFIG_BOOT_TRACER is not set
|
||||||
|
# CONFIG_DYNAMIC_PRINTK_DEBUG is not set
|
||||||
# CONFIG_SAMPLES is not set
|
# CONFIG_SAMPLES is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -1196,17 +1244,26 @@ CONFIG_FRAME_POINTER=y
|
|||||||
#
|
#
|
||||||
# CONFIG_KEYS is not set
|
# CONFIG_KEYS is not set
|
||||||
# CONFIG_SECURITY is not set
|
# CONFIG_SECURITY is not set
|
||||||
|
# CONFIG_SECURITYFS is not set
|
||||||
# CONFIG_SECURITY_FILE_CAPABILITIES is not set
|
# CONFIG_SECURITY_FILE_CAPABILITIES is not set
|
||||||
CONFIG_CRYPTO=y
|
CONFIG_CRYPTO=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# Crypto core or helper
|
# Crypto core or helper
|
||||||
#
|
#
|
||||||
|
CONFIG_CRYPTO_FIPS=y
|
||||||
CONFIG_CRYPTO_ALGAPI=y
|
CONFIG_CRYPTO_ALGAPI=y
|
||||||
|
CONFIG_CRYPTO_ALGAPI2=y
|
||||||
CONFIG_CRYPTO_AEAD=m
|
CONFIG_CRYPTO_AEAD=m
|
||||||
|
CONFIG_CRYPTO_AEAD2=y
|
||||||
CONFIG_CRYPTO_BLKCIPHER=m
|
CONFIG_CRYPTO_BLKCIPHER=m
|
||||||
|
CONFIG_CRYPTO_BLKCIPHER2=y
|
||||||
CONFIG_CRYPTO_HASH=m
|
CONFIG_CRYPTO_HASH=m
|
||||||
|
CONFIG_CRYPTO_HASH2=y
|
||||||
|
CONFIG_CRYPTO_RNG=m
|
||||||
|
CONFIG_CRYPTO_RNG2=y
|
||||||
CONFIG_CRYPTO_MANAGER=m
|
CONFIG_CRYPTO_MANAGER=m
|
||||||
|
CONFIG_CRYPTO_MANAGER2=y
|
||||||
# CONFIG_CRYPTO_GF128MUL is not set
|
# CONFIG_CRYPTO_GF128MUL is not set
|
||||||
# CONFIG_CRYPTO_NULL is not set
|
# CONFIG_CRYPTO_NULL is not set
|
||||||
# CONFIG_CRYPTO_CRYPTD is not set
|
# CONFIG_CRYPTO_CRYPTD is not set
|
||||||
@ -1257,7 +1314,7 @@ CONFIG_CRYPTO_SHA1=m
|
|||||||
#
|
#
|
||||||
# Ciphers
|
# Ciphers
|
||||||
#
|
#
|
||||||
# CONFIG_CRYPTO_AES is not set
|
CONFIG_CRYPTO_AES=m
|
||||||
# CONFIG_CRYPTO_ANUBIS is not set
|
# CONFIG_CRYPTO_ANUBIS is not set
|
||||||
# CONFIG_CRYPTO_ARC4 is not set
|
# CONFIG_CRYPTO_ARC4 is not set
|
||||||
# CONFIG_CRYPTO_BLOWFISH is not set
|
# CONFIG_CRYPTO_BLOWFISH is not set
|
||||||
@ -1278,14 +1335,17 @@ CONFIG_CRYPTO_DES=m
|
|||||||
#
|
#
|
||||||
CONFIG_CRYPTO_DEFLATE=y
|
CONFIG_CRYPTO_DEFLATE=y
|
||||||
CONFIG_CRYPTO_LZO=y
|
CONFIG_CRYPTO_LZO=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# Random Number Generation
|
||||||
|
#
|
||||||
|
CONFIG_CRYPTO_ANSI_CPRNG=m
|
||||||
# CONFIG_CRYPTO_HW is not set
|
# CONFIG_CRYPTO_HW is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Library routines
|
# Library routines
|
||||||
#
|
#
|
||||||
CONFIG_BITREVERSE=y
|
CONFIG_BITREVERSE=y
|
||||||
# CONFIG_GENERIC_FIND_FIRST_BIT is not set
|
|
||||||
# CONFIG_GENERIC_FIND_NEXT_BIT is not set
|
|
||||||
CONFIG_CRC_CCITT=m
|
CONFIG_CRC_CCITT=m
|
||||||
CONFIG_CRC16=y
|
CONFIG_CRC16=y
|
||||||
CONFIG_CRC_T10DIF=m
|
CONFIG_CRC_T10DIF=m
|
||||||
|
@ -967,28 +967,28 @@ static inline void configure_usart0_pins(void)
|
|||||||
{
|
{
|
||||||
u32 pin_mask = (1 << 8) | (1 << 9); /* RXD & TXD */
|
u32 pin_mask = (1 << 8) | (1 << 9); /* RXD & TXD */
|
||||||
|
|
||||||
select_peripheral(PIOA, pin_mask, PERIPH_B, 0);
|
select_peripheral(PIOA, pin_mask, PERIPH_B, AT32_GPIOF_PULLUP);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void configure_usart1_pins(void)
|
static inline void configure_usart1_pins(void)
|
||||||
{
|
{
|
||||||
u32 pin_mask = (1 << 17) | (1 << 18); /* RXD & TXD */
|
u32 pin_mask = (1 << 17) | (1 << 18); /* RXD & TXD */
|
||||||
|
|
||||||
select_peripheral(PIOA, pin_mask, PERIPH_A, 0);
|
select_peripheral(PIOA, pin_mask, PERIPH_A, AT32_GPIOF_PULLUP);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void configure_usart2_pins(void)
|
static inline void configure_usart2_pins(void)
|
||||||
{
|
{
|
||||||
u32 pin_mask = (1 << 26) | (1 << 27); /* RXD & TXD */
|
u32 pin_mask = (1 << 26) | (1 << 27); /* RXD & TXD */
|
||||||
|
|
||||||
select_peripheral(PIOB, pin_mask, PERIPH_B, 0);
|
select_peripheral(PIOB, pin_mask, PERIPH_B, AT32_GPIOF_PULLUP);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void configure_usart3_pins(void)
|
static inline void configure_usart3_pins(void)
|
||||||
{
|
{
|
||||||
u32 pin_mask = (1 << 18) | (1 << 17); /* RXD & TXD */
|
u32 pin_mask = (1 << 18) | (1 << 17); /* RXD & TXD */
|
||||||
|
|
||||||
select_peripheral(PIOB, pin_mask, PERIPH_B, 0);
|
select_peripheral(PIOB, pin_mask, PERIPH_B, AT32_GPIOF_PULLUP);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct platform_device *__initdata at32_usarts[4];
|
static struct platform_device *__initdata at32_usarts[4];
|
||||||
|
@ -25,7 +25,7 @@ $(obj)/vmlinux.gz: $(obj)/vmlinux.bin FORCE
|
|||||||
|
|
||||||
$(obj)/vmImage: $(obj)/vmlinux.gz
|
$(obj)/vmImage: $(obj)/vmlinux.gz
|
||||||
$(call if_changed,uimage)
|
$(call if_changed,uimage)
|
||||||
@echo 'Kernel: $@ is ready'
|
@$(kecho) 'Kernel: $@ is ready'
|
||||||
|
|
||||||
install:
|
install:
|
||||||
sh $(srctree)/$(src)/install.sh $(KERNELRELEASE) $(BOOTIMAGE) System.map "$(INSTALL_PATH)"
|
sh $(srctree)/$(src)/install.sh $(KERNELRELEASE) $(BOOTIMAGE) System.map "$(INSTALL_PATH)"
|
||||||
|
@ -99,7 +99,7 @@ config GENERIC_IOMAP
|
|||||||
bool
|
bool
|
||||||
default y
|
default y
|
||||||
|
|
||||||
config SCHED_NO_NO_OMIT_FRAME_POINTER
|
config SCHED_OMIT_FRAME_POINTER
|
||||||
bool
|
bool
|
||||||
default y
|
default y
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@ menu "HP Simulator drivers"
|
|||||||
|
|
||||||
config HP_SIMETH
|
config HP_SIMETH
|
||||||
bool "Simulated Ethernet "
|
bool "Simulated Ethernet "
|
||||||
|
depends on NET
|
||||||
|
|
||||||
config HP_SIMSERIAL
|
config HP_SIMSERIAL
|
||||||
bool "Simulated serial driver support"
|
bool "Simulated serial driver support"
|
||||||
|
@ -167,6 +167,15 @@ netdev_read(int fd, unsigned char *buf, unsigned int len)
|
|||||||
return ia64_ssc(fd, __pa(buf), len, 0, SSC_NETDEV_RECV);
|
return ia64_ssc(fd, __pa(buf), len, 0, SSC_NETDEV_RECV);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const struct net_device_ops simeth_netdev_ops = {
|
||||||
|
.ndo_open = simeth_open,
|
||||||
|
.ndo_stop = simeth_close,
|
||||||
|
.ndo_start_xmit = simeth_tx,
|
||||||
|
.ndo_get_stats = simeth_get_stats,
|
||||||
|
.ndo_set_multicast_list = set_multicast_list, /* not yet used */
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Function shared with module code, so cannot be in init section
|
* Function shared with module code, so cannot be in init section
|
||||||
*
|
*
|
||||||
@ -206,14 +215,10 @@ simeth_probe1(void)
|
|||||||
|
|
||||||
memcpy(dev->dev_addr, mac_addr, sizeof(mac_addr));
|
memcpy(dev->dev_addr, mac_addr, sizeof(mac_addr));
|
||||||
|
|
||||||
local = dev->priv;
|
local = netdev_priv(dev);
|
||||||
local->simfd = fd; /* keep track of underlying file descriptor */
|
local->simfd = fd; /* keep track of underlying file descriptor */
|
||||||
|
|
||||||
dev->open = simeth_open;
|
dev->netdev_ops = &simeth_netdev_ops;
|
||||||
dev->stop = simeth_close;
|
|
||||||
dev->hard_start_xmit = simeth_tx;
|
|
||||||
dev->get_stats = simeth_get_stats;
|
|
||||||
dev->set_multicast_list = set_multicast_list; /* no yet used */
|
|
||||||
|
|
||||||
err = register_netdev(dev);
|
err = register_netdev(dev);
|
||||||
if (err) {
|
if (err) {
|
||||||
@ -325,7 +330,7 @@ simeth_device_event(struct notifier_block *this,unsigned long event, void *ptr)
|
|||||||
* we get DOWN then UP.
|
* we get DOWN then UP.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
local = dev->priv;
|
local = netdev_priv(dev);
|
||||||
/* now do it for real */
|
/* now do it for real */
|
||||||
r = event == NETDEV_UP ?
|
r = event == NETDEV_UP ?
|
||||||
netdev_attach(local->simfd, dev->irq, ntohl(ifa->ifa_local)):
|
netdev_attach(local->simfd, dev->irq, ntohl(ifa->ifa_local)):
|
||||||
@ -380,7 +385,7 @@ frame_print(unsigned char *from, unsigned char *frame, int len)
|
|||||||
static int
|
static int
|
||||||
simeth_tx(struct sk_buff *skb, struct net_device *dev)
|
simeth_tx(struct sk_buff *skb, struct net_device *dev)
|
||||||
{
|
{
|
||||||
struct simeth_local *local = dev->priv;
|
struct simeth_local *local = netdev_priv(dev);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
/* ensure we have at least ETH_ZLEN bytes (min frame size) */
|
/* ensure we have at least ETH_ZLEN bytes (min frame size) */
|
||||||
@ -443,7 +448,7 @@ simeth_rx(struct net_device *dev)
|
|||||||
int len;
|
int len;
|
||||||
int rcv_count = SIMETH_RECV_MAX;
|
int rcv_count = SIMETH_RECV_MAX;
|
||||||
|
|
||||||
local = dev->priv;
|
local = netdev_priv(dev);
|
||||||
/*
|
/*
|
||||||
* the loop concept has been borrowed from other drivers
|
* the loop concept has been borrowed from other drivers
|
||||||
* looks to me like it's a throttling thing to avoid pushing to many
|
* looks to me like it's a throttling thing to avoid pushing to many
|
||||||
@ -507,7 +512,7 @@ simeth_interrupt(int irq, void *dev_id)
|
|||||||
static struct net_device_stats *
|
static struct net_device_stats *
|
||||||
simeth_get_stats(struct net_device *dev)
|
simeth_get_stats(struct net_device *dev)
|
||||||
{
|
{
|
||||||
struct simeth_local *local = dev->priv;
|
struct simeth_local *local = netdev_priv(dev);
|
||||||
|
|
||||||
return &local->stats;
|
return &local->stats;
|
||||||
}
|
}
|
||||||
|
@ -1767,25 +1767,24 @@ groups16_from_user(struct group_info *group_info, short __user *grouplist)
|
|||||||
asmlinkage long
|
asmlinkage long
|
||||||
sys32_getgroups16 (int gidsetsize, short __user *grouplist)
|
sys32_getgroups16 (int gidsetsize, short __user *grouplist)
|
||||||
{
|
{
|
||||||
|
const struct cred *cred = current_cred();
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (gidsetsize < 0)
|
if (gidsetsize < 0)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
get_group_info(current->group_info);
|
i = cred->group_info->ngroups;
|
||||||
i = current->group_info->ngroups;
|
|
||||||
if (gidsetsize) {
|
if (gidsetsize) {
|
||||||
if (i > gidsetsize) {
|
if (i > gidsetsize) {
|
||||||
i = -EINVAL;
|
i = -EINVAL;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
if (groups16_to_user(grouplist, current->group_info)) {
|
if (groups16_to_user(grouplist, cred->group_info)) {
|
||||||
i = -EFAULT;
|
i = -EFAULT;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
put_group_info(current->group_info);
|
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -158,7 +158,7 @@ mca_handler_bh(unsigned long paddr, void *iip, unsigned long ipsr)
|
|||||||
ia64_mlogbuf_dump();
|
ia64_mlogbuf_dump();
|
||||||
printk(KERN_ERR "OS_MCA: process [cpu %d, pid: %d, uid: %d, "
|
printk(KERN_ERR "OS_MCA: process [cpu %d, pid: %d, uid: %d, "
|
||||||
"iip: %p, psr: 0x%lx,paddr: 0x%lx](%s) encounters MCA.\n",
|
"iip: %p, psr: 0x%lx,paddr: 0x%lx](%s) encounters MCA.\n",
|
||||||
raw_smp_processor_id(), current->pid, current->uid,
|
raw_smp_processor_id(), current->pid, current_uid(),
|
||||||
iip, ipsr, paddr, current->comm);
|
iip, ipsr, paddr, current->comm);
|
||||||
|
|
||||||
spin_lock(&mca_bh_lock);
|
spin_lock(&mca_bh_lock);
|
||||||
|
@ -2220,8 +2220,8 @@ pfm_alloc_file(pfm_context_t *ctx)
|
|||||||
DPRINT(("new inode ino=%ld @%p\n", inode->i_ino, inode));
|
DPRINT(("new inode ino=%ld @%p\n", inode->i_ino, inode));
|
||||||
|
|
||||||
inode->i_mode = S_IFCHR|S_IRUGO;
|
inode->i_mode = S_IFCHR|S_IRUGO;
|
||||||
inode->i_uid = current->fsuid;
|
inode->i_uid = current_fsuid();
|
||||||
inode->i_gid = current->fsgid;
|
inode->i_gid = current_fsgid();
|
||||||
|
|
||||||
sprintf(name, "[%lu]", inode->i_ino);
|
sprintf(name, "[%lu]", inode->i_ino);
|
||||||
this.name = name;
|
this.name = name;
|
||||||
@ -2399,22 +2399,33 @@ error_kmem:
|
|||||||
static int
|
static int
|
||||||
pfm_bad_permissions(struct task_struct *task)
|
pfm_bad_permissions(struct task_struct *task)
|
||||||
{
|
{
|
||||||
|
const struct cred *tcred;
|
||||||
|
uid_t uid = current_uid();
|
||||||
|
gid_t gid = current_gid();
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
rcu_read_lock();
|
||||||
|
tcred = __task_cred(task);
|
||||||
|
|
||||||
/* inspired by ptrace_attach() */
|
/* inspired by ptrace_attach() */
|
||||||
DPRINT(("cur: uid=%d gid=%d task: euid=%d suid=%d uid=%d egid=%d sgid=%d\n",
|
DPRINT(("cur: uid=%d gid=%d task: euid=%d suid=%d uid=%d egid=%d sgid=%d\n",
|
||||||
current->uid,
|
uid,
|
||||||
current->gid,
|
gid,
|
||||||
task->euid,
|
tcred->euid,
|
||||||
task->suid,
|
tcred->suid,
|
||||||
task->uid,
|
tcred->uid,
|
||||||
task->egid,
|
tcred->egid,
|
||||||
task->sgid));
|
tcred->sgid));
|
||||||
|
|
||||||
return ((current->uid != task->euid)
|
ret = ((uid != tcred->euid)
|
||||||
|| (current->uid != task->suid)
|
|| (uid != tcred->suid)
|
||||||
|| (current->uid != task->uid)
|
|| (uid != tcred->uid)
|
||||||
|| (current->gid != task->egid)
|
|| (gid != tcred->egid)
|
||||||
|| (current->gid != task->sgid)
|
|| (gid != tcred->sgid)
|
||||||
|| (current->gid != task->gid)) && !capable(CAP_SYS_PTRACE);
|
|| (gid != tcred->gid)) && !capable(CAP_SYS_PTRACE);
|
||||||
|
|
||||||
|
rcu_read_unlock();
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -229,7 +229,7 @@ ia64_rt_sigreturn (struct sigscratch *scr)
|
|||||||
si.si_errno = 0;
|
si.si_errno = 0;
|
||||||
si.si_code = SI_KERNEL;
|
si.si_code = SI_KERNEL;
|
||||||
si.si_pid = task_pid_vnr(current);
|
si.si_pid = task_pid_vnr(current);
|
||||||
si.si_uid = current->uid;
|
si.si_uid = current_uid();
|
||||||
si.si_addr = sc;
|
si.si_addr = sc;
|
||||||
force_sig_info(SIGSEGV, &si, current);
|
force_sig_info(SIGSEGV, &si, current);
|
||||||
return retval;
|
return retval;
|
||||||
@ -326,7 +326,7 @@ force_sigsegv_info (int sig, void __user *addr)
|
|||||||
si.si_errno = 0;
|
si.si_errno = 0;
|
||||||
si.si_code = SI_KERNEL;
|
si.si_code = SI_KERNEL;
|
||||||
si.si_pid = task_pid_vnr(current);
|
si.si_pid = task_pid_vnr(current);
|
||||||
si.si_uid = current->uid;
|
si.si_uid = current_uid();
|
||||||
si.si_addr = addr;
|
si.si_addr = addr;
|
||||||
force_sig_info(SIGSEGV, &si, current);
|
force_sig_info(SIGSEGV, &si, current);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -274,7 +274,7 @@ config GENERIC_CALIBRATE_DELAY
|
|||||||
bool
|
bool
|
||||||
default y
|
default y
|
||||||
|
|
||||||
config SCHED_NO_NO_OMIT_FRAME_POINTER
|
config SCHED_OMIT_FRAME_POINTER
|
||||||
bool
|
bool
|
||||||
default y
|
default y
|
||||||
|
|
||||||
|
@ -36,9 +36,9 @@
|
|||||||
| depending on their values, the program may run faster or slower --
|
| depending on their values, the program may run faster or slower --
|
||||||
| but no worse than 10% slower even in the extreme cases.
|
| but no worse than 10% slower even in the extreme cases.
|
||||||
|
|
|
|
||||||
| The program setoxm1 takes approximately ???/??? cycles for input
|
| The program setoxm1 takes approximately ??? / ??? cycles for input
|
||||||
| argument X, 0.25 <= |X| < 70log2. For |X| < 0.25, it takes
|
| argument X, 0.25 <= |X| < 70log2. For |X| < 0.25, it takes
|
||||||
| approximately ???/??? cycles. For the less common arguments,
|
| approximately ??? / ??? cycles. For the less common arguments,
|
||||||
| depending on their values, the program may run faster or slower --
|
| depending on their values, the program may run faster or slower --
|
||||||
| but no worse than 10% slower even in the extreme cases.
|
| but no worse than 10% slower even in the extreme cases.
|
||||||
|
|
|
|
||||||
|
@ -18,11 +18,14 @@
|
|||||||
#include <asm/macints.h>
|
#include <asm/macints.h>
|
||||||
#include <asm/mac_baboon.h>
|
#include <asm/mac_baboon.h>
|
||||||
|
|
||||||
/* #define DEBUG_BABOON */
|
|
||||||
/* #define DEBUG_IRQS */
|
/* #define DEBUG_IRQS */
|
||||||
|
|
||||||
|
extern void mac_enable_irq(unsigned int);
|
||||||
|
extern void mac_disable_irq(unsigned int);
|
||||||
|
|
||||||
int baboon_present;
|
int baboon_present;
|
||||||
static volatile struct baboon *baboon;
|
static volatile struct baboon *baboon;
|
||||||
|
static unsigned char baboon_disabled;
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
extern int macide_ack_intr(struct ata_channel *);
|
extern int macide_ack_intr(struct ata_channel *);
|
||||||
@ -88,34 +91,51 @@ static irqreturn_t baboon_irq(int irq, void *dev_id)
|
|||||||
|
|
||||||
void __init baboon_register_interrupts(void)
|
void __init baboon_register_interrupts(void)
|
||||||
{
|
{
|
||||||
request_irq(IRQ_NUBUS_C, baboon_irq, IRQ_FLG_LOCK|IRQ_FLG_FAST,
|
baboon_disabled = 0;
|
||||||
"baboon", (void *) baboon);
|
request_irq(IRQ_NUBUS_C, baboon_irq, 0, "baboon", (void *)baboon);
|
||||||
}
|
}
|
||||||
|
|
||||||
void baboon_irq_enable(int irq) {
|
/*
|
||||||
|
* The means for masking individual baboon interrupts remains a mystery, so
|
||||||
|
* enable the umbrella interrupt only when no baboon interrupt is disabled.
|
||||||
|
*/
|
||||||
|
|
||||||
|
void baboon_irq_enable(int irq)
|
||||||
|
{
|
||||||
|
int irq_idx = IRQ_IDX(irq);
|
||||||
|
|
||||||
#ifdef DEBUG_IRQUSE
|
#ifdef DEBUG_IRQUSE
|
||||||
printk("baboon_irq_enable(%d)\n", irq);
|
printk("baboon_irq_enable(%d)\n", irq);
|
||||||
#endif
|
#endif
|
||||||
/* FIXME: figure out how to mask and unmask baboon interrupt sources */
|
|
||||||
enable_irq(IRQ_NUBUS_C);
|
baboon_disabled &= ~(1 << irq_idx);
|
||||||
|
if (!baboon_disabled)
|
||||||
|
mac_enable_irq(IRQ_NUBUS_C);
|
||||||
}
|
}
|
||||||
|
|
||||||
void baboon_irq_disable(int irq) {
|
void baboon_irq_disable(int irq)
|
||||||
|
{
|
||||||
|
int irq_idx = IRQ_IDX(irq);
|
||||||
|
|
||||||
#ifdef DEBUG_IRQUSE
|
#ifdef DEBUG_IRQUSE
|
||||||
printk("baboon_irq_disable(%d)\n", irq);
|
printk("baboon_irq_disable(%d)\n", irq);
|
||||||
#endif
|
#endif
|
||||||
disable_irq(IRQ_NUBUS_C);
|
|
||||||
|
baboon_disabled |= 1 << irq_idx;
|
||||||
|
if (baboon_disabled)
|
||||||
|
mac_disable_irq(IRQ_NUBUS_C);
|
||||||
}
|
}
|
||||||
|
|
||||||
void baboon_irq_clear(int irq) {
|
void baboon_irq_clear(int irq)
|
||||||
int irq_idx = IRQ_IDX(irq);
|
{
|
||||||
|
int irq_idx = IRQ_IDX(irq);
|
||||||
|
|
||||||
baboon->mb_ifr &= ~(1 << irq_idx);
|
baboon->mb_ifr &= ~(1 << irq_idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
int baboon_irq_pending(int irq)
|
int baboon_irq_pending(int irq)
|
||||||
{
|
{
|
||||||
int irq_idx = IRQ_IDX(irq);
|
int irq_idx = IRQ_IDX(irq);
|
||||||
|
|
||||||
return baboon->mb_ifr & (1 << irq_idx);
|
return baboon->mb_ifr & (1 << irq_idx);
|
||||||
}
|
}
|
||||||
|
@ -162,10 +162,7 @@ void __init config_mac(void)
|
|||||||
mach_init_IRQ = mac_init_IRQ;
|
mach_init_IRQ = mac_init_IRQ;
|
||||||
mach_get_model = mac_get_model;
|
mach_get_model = mac_get_model;
|
||||||
mach_gettimeoffset = mac_gettimeoffset;
|
mach_gettimeoffset = mac_gettimeoffset;
|
||||||
#warning move to adb/via init
|
|
||||||
#if 0
|
|
||||||
mach_hwclk = mac_hwclk;
|
mach_hwclk = mac_hwclk;
|
||||||
#endif
|
|
||||||
mach_set_clock_mmss = mac_set_clock_mmss;
|
mach_set_clock_mmss = mac_set_clock_mmss;
|
||||||
mach_reset = mac_reset;
|
mach_reset = mac_reset;
|
||||||
mach_halt = mac_poweroff;
|
mach_halt = mac_poweroff;
|
||||||
|
@ -24,7 +24,6 @@
|
|||||||
#define BOOTINFO_COMPAT_1_0
|
#define BOOTINFO_COMPAT_1_0
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
#include <asm/bootinfo.h>
|
#include <asm/bootinfo.h>
|
||||||
#include <asm/machw.h>
|
|
||||||
#include <asm/macints.h>
|
#include <asm/macints.h>
|
||||||
|
|
||||||
extern unsigned long mac_videobase;
|
extern unsigned long mac_videobase;
|
||||||
|
@ -127,7 +127,6 @@
|
|||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
#include <asm/traps.h>
|
#include <asm/traps.h>
|
||||||
#include <asm/bootinfo.h>
|
#include <asm/bootinfo.h>
|
||||||
#include <asm/machw.h>
|
|
||||||
#include <asm/macintosh.h>
|
#include <asm/macintosh.h>
|
||||||
#include <asm/mac_via.h>
|
#include <asm/mac_via.h>
|
||||||
#include <asm/mac_psc.h>
|
#include <asm/mac_psc.h>
|
||||||
@ -215,8 +214,8 @@ irqreturn_t mac_debug_handler(int, void *);
|
|||||||
|
|
||||||
/* #define DEBUG_MACINTS */
|
/* #define DEBUG_MACINTS */
|
||||||
|
|
||||||
static void mac_enable_irq(unsigned int irq);
|
void mac_enable_irq(unsigned int irq);
|
||||||
static void mac_disable_irq(unsigned int irq);
|
void mac_disable_irq(unsigned int irq);
|
||||||
|
|
||||||
static struct irq_controller mac_irq_controller = {
|
static struct irq_controller mac_irq_controller = {
|
||||||
.name = "mac",
|
.name = "mac",
|
||||||
@ -275,7 +274,7 @@ void __init mac_init_IRQ(void)
|
|||||||
* These routines are just dispatchers to the VIA/OSS/PSC routines.
|
* These routines are just dispatchers to the VIA/OSS/PSC routines.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void mac_enable_irq(unsigned int irq)
|
void mac_enable_irq(unsigned int irq)
|
||||||
{
|
{
|
||||||
int irq_src = IRQ_SRC(irq);
|
int irq_src = IRQ_SRC(irq);
|
||||||
|
|
||||||
@ -308,7 +307,7 @@ static void mac_enable_irq(unsigned int irq)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mac_disable_irq(unsigned int irq)
|
void mac_disable_irq(unsigned int irq)
|
||||||
{
|
{
|
||||||
int irq_src = IRQ_SRC(irq);
|
int irq_src = IRQ_SRC(irq);
|
||||||
|
|
||||||
|
@ -93,7 +93,7 @@ static void cuda_write_pram(int offset, __u8 data)
|
|||||||
#define cuda_write_pram NULL
|
#define cuda_write_pram NULL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_ADB_PMU68K
|
#if 0 /* def CONFIG_ADB_PMU68K */
|
||||||
static long pmu_read_time(void)
|
static long pmu_read_time(void)
|
||||||
{
|
{
|
||||||
struct adb_request req;
|
struct adb_request req;
|
||||||
@ -148,7 +148,7 @@ static void pmu_write_pram(int offset, __u8 data)
|
|||||||
#define pmu_write_pram NULL
|
#define pmu_write_pram NULL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_ADB_MACIISI
|
#if 0 /* def CONFIG_ADB_MACIISI */
|
||||||
extern int maciisi_request(struct adb_request *req,
|
extern int maciisi_request(struct adb_request *req,
|
||||||
void (*done)(struct adb_request *), int nbytes, ...);
|
void (*done)(struct adb_request *), int nbytes, ...);
|
||||||
|
|
||||||
@ -717,13 +717,18 @@ int mac_hwclk(int op, struct rtc_time *t)
|
|||||||
unmktime(now, 0,
|
unmktime(now, 0,
|
||||||
&t->tm_year, &t->tm_mon, &t->tm_mday,
|
&t->tm_year, &t->tm_mon, &t->tm_mday,
|
||||||
&t->tm_hour, &t->tm_min, &t->tm_sec);
|
&t->tm_hour, &t->tm_min, &t->tm_sec);
|
||||||
|
#if 0
|
||||||
printk("mac_hwclk: read %04d-%02d-%-2d %02d:%02d:%02d\n",
|
printk("mac_hwclk: read %04d-%02d-%-2d %02d:%02d:%02d\n",
|
||||||
t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
|
t->tm_year + 1900, t->tm_mon + 1, t->tm_mday,
|
||||||
|
t->tm_hour, t->tm_min, t->tm_sec);
|
||||||
|
#endif
|
||||||
} else { /* write */
|
} else { /* write */
|
||||||
|
#if 0
|
||||||
printk("mac_hwclk: tried to write %04d-%02d-%-2d %02d:%02d:%02d\n",
|
printk("mac_hwclk: tried to write %04d-%02d-%-2d %02d:%02d:%02d\n",
|
||||||
t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
|
t->tm_year + 1900, t->tm_mon + 1, t->tm_mday,
|
||||||
|
t->tm_hour, t->tm_min, t->tm_sec);
|
||||||
|
#endif
|
||||||
|
|
||||||
#if 0 /* it trashes my rtc */
|
|
||||||
now = mktime(t->tm_year + 1900, t->tm_mon + 1, t->tm_mday,
|
now = mktime(t->tm_year + 1900, t->tm_mon + 1, t->tm_mday,
|
||||||
t->tm_hour, t->tm_min, t->tm_sec);
|
t->tm_hour, t->tm_min, t->tm_sec);
|
||||||
|
|
||||||
@ -742,7 +747,6 @@ int mac_hwclk(int op, struct rtc_time *t)
|
|||||||
case MAC_ADB_IISI:
|
case MAC_ADB_IISI:
|
||||||
maciisi_write_time(now);
|
maciisi_write_time(now);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,6 @@
|
|||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
|
||||||
#include <asm/bootinfo.h>
|
#include <asm/bootinfo.h>
|
||||||
#include <asm/machw.h>
|
|
||||||
#include <asm/macintosh.h>
|
#include <asm/macintosh.h>
|
||||||
#include <asm/macints.h>
|
#include <asm/macints.h>
|
||||||
#include <asm/mac_via.h>
|
#include <asm/mac_via.h>
|
||||||
|
@ -32,15 +32,10 @@
|
|||||||
#include <asm/bootinfo.h>
|
#include <asm/bootinfo.h>
|
||||||
#include <asm/macintosh.h>
|
#include <asm/macintosh.h>
|
||||||
#include <asm/macints.h>
|
#include <asm/macints.h>
|
||||||
#include <asm/machw.h>
|
|
||||||
#include <asm/mac_via.h>
|
#include <asm/mac_via.h>
|
||||||
#include <asm/mac_psc.h>
|
#include <asm/mac_psc.h>
|
||||||
|
|
||||||
volatile __u8 *via1, *via2;
|
volatile __u8 *via1, *via2;
|
||||||
#if 0
|
|
||||||
/* See note in mac_via.h about how this is possibly not useful */
|
|
||||||
volatile long *via_memory_bogon=(long *)&via_memory_bogon;
|
|
||||||
#endif
|
|
||||||
int rbv_present;
|
int rbv_present;
|
||||||
int via_alt_mapping;
|
int via_alt_mapping;
|
||||||
EXPORT_SYMBOL(via_alt_mapping);
|
EXPORT_SYMBOL(via_alt_mapping);
|
||||||
@ -66,7 +61,7 @@ static int gIER,gIFR,gBufA,gBufB;
|
|||||||
#define MAC_CLOCK_LOW (MAC_CLOCK_TICK&0xFF)
|
#define MAC_CLOCK_LOW (MAC_CLOCK_TICK&0xFF)
|
||||||
#define MAC_CLOCK_HIGH (MAC_CLOCK_TICK>>8)
|
#define MAC_CLOCK_HIGH (MAC_CLOCK_TICK>>8)
|
||||||
|
|
||||||
/* To disable a NuBus slot on Quadras we make the slot IRQ lines outputs, set
|
/* To disable a NuBus slot on Quadras we make that slot IRQ line an output set
|
||||||
* high. On RBV we just use the slot interrupt enable register. On Macs with
|
* high. On RBV we just use the slot interrupt enable register. On Macs with
|
||||||
* genuine VIA chips we must use nubus_disabled to keep track of disabled slot
|
* genuine VIA chips we must use nubus_disabled to keep track of disabled slot
|
||||||
* interrupts. When any slot IRQ is disabled we mask the (edge triggered) CA1
|
* interrupts. When any slot IRQ is disabled we mask the (edge triggered) CA1
|
||||||
@ -180,7 +175,7 @@ void __init via_init(void)
|
|||||||
via1[vT1CH] = 0;
|
via1[vT1CH] = 0;
|
||||||
via1[vT2CL] = 0;
|
via1[vT2CL] = 0;
|
||||||
via1[vT2CH] = 0;
|
via1[vT2CH] = 0;
|
||||||
via1[vACR] &= 0x3F;
|
via1[vACR] &= ~0xC0; /* setup T1 timer with no PB7 output */
|
||||||
via1[vACR] &= ~0x03; /* disable port A & B latches */
|
via1[vACR] &= ~0x03; /* disable port A & B latches */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -203,40 +198,41 @@ void __init via_init(void)
|
|||||||
|
|
||||||
/* Everything below this point is VIA2/RBV only... */
|
/* Everything below this point is VIA2/RBV only... */
|
||||||
|
|
||||||
if (oss_present) return;
|
if (oss_present)
|
||||||
|
return;
|
||||||
|
|
||||||
#if 1
|
|
||||||
/* Some machines support an alternate IRQ mapping that spreads */
|
/* Some machines support an alternate IRQ mapping that spreads */
|
||||||
/* Ethernet and Sound out to their own autolevel IRQs and moves */
|
/* Ethernet and Sound out to their own autolevel IRQs and moves */
|
||||||
/* VIA1 to level 6. A/UX uses this mapping and we do too. Note */
|
/* VIA1 to level 6. A/UX uses this mapping and we do too. Note */
|
||||||
/* that the IIfx emulates this alternate mapping using the OSS. */
|
/* that the IIfx emulates this alternate mapping using the OSS. */
|
||||||
|
|
||||||
switch(macintosh_config->ident) {
|
via_alt_mapping = 0;
|
||||||
case MAC_MODEL_P475:
|
if (macintosh_config->via_type == MAC_VIA_QUADRA)
|
||||||
case MAC_MODEL_P475F:
|
switch (macintosh_config->ident) {
|
||||||
case MAC_MODEL_P575:
|
case MAC_MODEL_C660:
|
||||||
case MAC_MODEL_Q605:
|
case MAC_MODEL_Q840:
|
||||||
case MAC_MODEL_Q605_ACC:
|
/* not applicable */
|
||||||
case MAC_MODEL_C610:
|
break;
|
||||||
case MAC_MODEL_Q610:
|
case MAC_MODEL_P588:
|
||||||
case MAC_MODEL_Q630:
|
case MAC_MODEL_TV:
|
||||||
case MAC_MODEL_C650:
|
case MAC_MODEL_PB140:
|
||||||
case MAC_MODEL_Q650:
|
case MAC_MODEL_PB145:
|
||||||
case MAC_MODEL_Q700:
|
case MAC_MODEL_PB160:
|
||||||
case MAC_MODEL_Q800:
|
case MAC_MODEL_PB165:
|
||||||
case MAC_MODEL_Q900:
|
case MAC_MODEL_PB165C:
|
||||||
case MAC_MODEL_Q950:
|
case MAC_MODEL_PB170:
|
||||||
|
case MAC_MODEL_PB180:
|
||||||
|
case MAC_MODEL_PB180C:
|
||||||
|
case MAC_MODEL_PB190:
|
||||||
|
case MAC_MODEL_PB520:
|
||||||
|
/* not yet tested */
|
||||||
|
break;
|
||||||
|
default:
|
||||||
via_alt_mapping = 1;
|
via_alt_mapping = 1;
|
||||||
via1[vDirB] |= 0x40;
|
via1[vDirB] |= 0x40;
|
||||||
via1[vBufB] &= ~0x40;
|
via1[vBufB] &= ~0x40;
|
||||||
break;
|
break;
|
||||||
default:
|
}
|
||||||
via_alt_mapping = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
via_alt_mapping = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Now initialize VIA2. For RBV we just kill all interrupts;
|
* Now initialize VIA2. For RBV we just kill all interrupts;
|
||||||
@ -252,14 +248,17 @@ void __init via_init(void)
|
|||||||
via2[vT1CH] = 0;
|
via2[vT1CH] = 0;
|
||||||
via2[vT2CL] = 0;
|
via2[vT2CL] = 0;
|
||||||
via2[vT2CH] = 0;
|
via2[vT2CH] = 0;
|
||||||
via2[vACR] &= 0x3F;
|
via2[vACR] &= ~0xC0; /* setup T1 timer with no PB7 output */
|
||||||
via2[vACR] &= ~0x03; /* disable port A & B latches */
|
via2[vACR] &= ~0x03; /* disable port A & B latches */
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set vPCR for SCSI interrupts (but not on RBV)
|
* Set vPCR for control line interrupts (but not on RBV)
|
||||||
*/
|
*/
|
||||||
if (!rbv_present) {
|
if (!rbv_present) {
|
||||||
|
/* For all VIA types, CA1 (SLOTS IRQ) and CB1 (ASC IRQ)
|
||||||
|
* are made negative edge triggered here.
|
||||||
|
*/
|
||||||
if (macintosh_config->scsi_type == MAC_SCSI_OLD) {
|
if (macintosh_config->scsi_type == MAC_SCSI_OLD) {
|
||||||
/* CB2 (IRQ) indep. input, positive edge */
|
/* CB2 (IRQ) indep. input, positive edge */
|
||||||
/* CA2 (DRQ) indep. input, positive edge */
|
/* CA2 (DRQ) indep. input, positive edge */
|
||||||
@ -466,21 +465,6 @@ irqreturn_t via1_irq(int irq, void *dev_id)
|
|||||||
++irq_num;
|
++irq_num;
|
||||||
irq_bit <<= 1;
|
irq_bit <<= 1;
|
||||||
} while (events >= irq_bit);
|
} while (events >= irq_bit);
|
||||||
|
|
||||||
#if 0 /* freakin' pmu is doing weird stuff */
|
|
||||||
if (!oss_present) {
|
|
||||||
/* This (still) seems to be necessary to get IDE
|
|
||||||
working. However, if you enable VBL interrupts,
|
|
||||||
you're screwed... */
|
|
||||||
/* FIXME: should we check the SLOTIRQ bit before
|
|
||||||
pulling this stunt? */
|
|
||||||
/* No, it won't be set. that's why we're doing this. */
|
|
||||||
via_irq_disable(IRQ_MAC_NUBUS);
|
|
||||||
via_irq_clear(IRQ_MAC_NUBUS);
|
|
||||||
m68k_handle_int(IRQ_MAC_NUBUS);
|
|
||||||
via_irq_enable(IRQ_MAC_NUBUS);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -653,7 +653,7 @@ config GENERIC_CMOS_UPDATE
|
|||||||
bool
|
bool
|
||||||
default y
|
default y
|
||||||
|
|
||||||
config SCHED_NO_NO_OMIT_FRAME_POINTER
|
config SCHED_OMIT_FRAME_POINTER
|
||||||
bool
|
bool
|
||||||
default y
|
default y
|
||||||
|
|
||||||
|
@ -48,7 +48,7 @@ config RUNTIME_DEBUG
|
|||||||
help
|
help
|
||||||
If you say Y here, some debugging macros will do run-time checking.
|
If you say Y here, some debugging macros will do run-time checking.
|
||||||
If you say N here, those macros will mostly turn to no-ops. See
|
If you say N here, those macros will mostly turn to no-ops. See
|
||||||
include/asm-mips/debug.h for debuging macros.
|
arch/mips/include/asm/debug.h for debugging macros.
|
||||||
If unsure, say N.
|
If unsure, say N.
|
||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -35,6 +35,16 @@
|
|||||||
mtc0 \reg, CP0_TCSTATUS
|
mtc0 \reg, CP0_TCSTATUS
|
||||||
_ehb
|
_ehb
|
||||||
.endm
|
.endm
|
||||||
|
#elif defined(CONFIG_CPU_MIPSR2)
|
||||||
|
.macro local_irq_enable reg=t0
|
||||||
|
ei
|
||||||
|
irq_enable_hazard
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro local_irq_disable reg=t0
|
||||||
|
di
|
||||||
|
irq_disable_hazard
|
||||||
|
.endm
|
||||||
#else
|
#else
|
||||||
.macro local_irq_enable reg=t0
|
.macro local_irq_enable reg=t0
|
||||||
mfc0 \reg, CP0_STATUS
|
mfc0 \reg, CP0_STATUS
|
||||||
|
@ -50,9 +50,8 @@ static inline __attribute_const__ __u32 __arch_swab32(__u32 x)
|
|||||||
static inline __attribute_const__ __u64 __arch_swab64(__u64 x)
|
static inline __attribute_const__ __u64 __arch_swab64(__u64 x)
|
||||||
{
|
{
|
||||||
__asm__(
|
__asm__(
|
||||||
" dsbh %0, %1 \n"
|
" dsbh %0, %1\n"
|
||||||
" dshd %0, %0 \n"
|
" dshd %0, %0"
|
||||||
" drotr %0, %0, 32 \n"
|
|
||||||
: "=r" (x)
|
: "=r" (x)
|
||||||
: "r" (x));
|
: "r" (x));
|
||||||
|
|
||||||
|
@ -232,7 +232,7 @@ typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
|
|||||||
*/
|
*/
|
||||||
#ifdef __MIPSEB__
|
#ifdef __MIPSEB__
|
||||||
#define ELF_DATA ELFDATA2MSB
|
#define ELF_DATA ELFDATA2MSB
|
||||||
#elif __MIPSEL__
|
#elif defined(__MIPSEL__)
|
||||||
#define ELF_DATA ELFDATA2LSB
|
#define ELF_DATA ELFDATA2LSB
|
||||||
#endif
|
#endif
|
||||||
#define ELF_ARCH EM_MIPS
|
#define ELF_ARCH EM_MIPS
|
||||||
|
@ -174,8 +174,8 @@ static unsigned int translate_open_flags(int flags)
|
|||||||
|
|
||||||
static void sp_setfsuidgid( uid_t uid, gid_t gid)
|
static void sp_setfsuidgid( uid_t uid, gid_t gid)
|
||||||
{
|
{
|
||||||
current->fsuid = uid;
|
current->cred->fsuid = uid;
|
||||||
current->fsgid = gid;
|
current->cred->fsgid = gid;
|
||||||
|
|
||||||
key_fsuid_changed(current);
|
key_fsuid_changed(current);
|
||||||
key_fsgid_changed(current);
|
key_fsgid_changed(current);
|
||||||
|
@ -51,6 +51,7 @@ asmlinkage long mipsmt_sys_sched_setaffinity(pid_t pid, unsigned int len,
|
|||||||
int retval;
|
int retval;
|
||||||
struct task_struct *p;
|
struct task_struct *p;
|
||||||
struct thread_info *ti;
|
struct thread_info *ti;
|
||||||
|
uid_t euid;
|
||||||
|
|
||||||
if (len < sizeof(new_mask))
|
if (len < sizeof(new_mask))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@ -76,9 +77,9 @@ asmlinkage long mipsmt_sys_sched_setaffinity(pid_t pid, unsigned int len,
|
|||||||
*/
|
*/
|
||||||
get_task_struct(p);
|
get_task_struct(p);
|
||||||
|
|
||||||
|
euid = current_euid();
|
||||||
retval = -EPERM;
|
retval = -EPERM;
|
||||||
if ((current->euid != p->euid) && (current->euid != p->uid) &&
|
if (euid != p->euid && euid != p->uid && !capable(CAP_SYS_NICE)) {
|
||||||
!capable(CAP_SYS_NICE)) {
|
|
||||||
read_unlock(&tasklist_lock);
|
read_unlock(&tasklist_lock);
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
}
|
}
|
||||||
|
@ -1085,8 +1085,8 @@ static int vpe_open(struct inode *inode, struct file *filp)
|
|||||||
v->load_addr = NULL;
|
v->load_addr = NULL;
|
||||||
v->len = 0;
|
v->len = 0;
|
||||||
|
|
||||||
v->uid = filp->f_uid;
|
v->uid = filp->f_cred->fsuid;
|
||||||
v->gid = filp->f_gid;
|
v->gid = filp->f_cred->fsgid;
|
||||||
|
|
||||||
#ifdef CONFIG_MIPS_APSP_KSPD
|
#ifdef CONFIG_MIPS_APSP_KSPD
|
||||||
/* get kspd to tell us when a syscall_exit happens */
|
/* get kspd to tell us when a syscall_exit happens */
|
||||||
|
@ -111,6 +111,7 @@ EXPORT_SYMBOL(dma_alloc_coherent);
|
|||||||
void dma_free_noncoherent(struct device *dev, size_t size, void *vaddr,
|
void dma_free_noncoherent(struct device *dev, size_t size, void *vaddr,
|
||||||
dma_addr_t dma_handle)
|
dma_addr_t dma_handle)
|
||||||
{
|
{
|
||||||
|
plat_unmap_dma_mem(dma_handle);
|
||||||
free_pages((unsigned long) vaddr, get_order(size));
|
free_pages((unsigned long) vaddr, get_order(size));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -121,6 +122,8 @@ void dma_free_coherent(struct device *dev, size_t size, void *vaddr,
|
|||||||
{
|
{
|
||||||
unsigned long addr = (unsigned long) vaddr;
|
unsigned long addr = (unsigned long) vaddr;
|
||||||
|
|
||||||
|
plat_unmap_dma_mem(dma_handle);
|
||||||
|
|
||||||
if (!plat_device_is_coherent(dev))
|
if (!plat_device_is_coherent(dev))
|
||||||
addr = CAC_ADDR(addr);
|
addr = CAC_ADDR(addr);
|
||||||
|
|
||||||
|
@ -44,9 +44,12 @@ static inline void flush_tlb_mm(struct mm_struct *mm)
|
|||||||
{
|
{
|
||||||
BUG_ON(mm == &init_mm); /* Should never happen */
|
BUG_ON(mm == &init_mm); /* Should never happen */
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#if 1 || defined(CONFIG_SMP)
|
||||||
flush_tlb_all();
|
flush_tlb_all();
|
||||||
#else
|
#else
|
||||||
|
/* FIXME: currently broken, causing space id and protection ids
|
||||||
|
* to go out of sync, resulting in faults on userspace accesses.
|
||||||
|
*/
|
||||||
if (mm) {
|
if (mm) {
|
||||||
if (mm->context != 0)
|
if (mm->context != 0)
|
||||||
free_sid(mm->context);
|
free_sid(mm->context);
|
||||||
|
@ -182,7 +182,7 @@ give_sigsegv:
|
|||||||
si.si_errno = 0;
|
si.si_errno = 0;
|
||||||
si.si_code = SI_KERNEL;
|
si.si_code = SI_KERNEL;
|
||||||
si.si_pid = task_pid_vnr(current);
|
si.si_pid = task_pid_vnr(current);
|
||||||
si.si_uid = current->uid;
|
si.si_uid = current_uid();
|
||||||
si.si_addr = &frame->uc;
|
si.si_addr = &frame->uc;
|
||||||
force_sig_info(SIGSEGV, &si, current);
|
force_sig_info(SIGSEGV, &si, current);
|
||||||
return;
|
return;
|
||||||
|
@ -141,7 +141,7 @@ config GENERIC_NVRAM
|
|||||||
bool
|
bool
|
||||||
default y if PPC32
|
default y if PPC32
|
||||||
|
|
||||||
config SCHED_NO_NO_OMIT_FRAME_POINTER
|
config SCHED_OMIT_FRAME_POINTER
|
||||||
bool
|
bool
|
||||||
default y
|
default y
|
||||||
|
|
||||||
@ -285,6 +285,10 @@ config IOMMU_VMERGE
|
|||||||
config IOMMU_HELPER
|
config IOMMU_HELPER
|
||||||
def_bool PPC64
|
def_bool PPC64
|
||||||
|
|
||||||
|
config PPC_NEED_DMA_SYNC_OPS
|
||||||
|
def_bool y
|
||||||
|
depends on NOT_COHERENT_CACHE
|
||||||
|
|
||||||
config HOTPLUG_CPU
|
config HOTPLUG_CPU
|
||||||
bool "Support for enabling/disabling CPUs"
|
bool "Support for enabling/disabling CPUs"
|
||||||
depends on SMP && HOTPLUG && EXPERIMENTAL && (PPC_PSERIES || PPC_PMAC)
|
depends on SMP && HOTPLUG && EXPERIMENTAL && (PPC_PSERIES || PPC_PMAC)
|
||||||
@ -322,7 +326,7 @@ config KEXEC
|
|||||||
|
|
||||||
config CRASH_DUMP
|
config CRASH_DUMP
|
||||||
bool "Build a kdump crash kernel"
|
bool "Build a kdump crash kernel"
|
||||||
depends on PPC_MULTIPLATFORM && PPC64 && RELOCATABLE
|
depends on (PPC64 && RELOCATABLE) || 6xx
|
||||||
help
|
help
|
||||||
Build a kernel suitable for use as a kdump capture kernel.
|
Build a kernel suitable for use as a kdump capture kernel.
|
||||||
The same kernel binary can be used as production kernel and dump
|
The same kernel binary can be used as production kernel and dump
|
||||||
@ -401,23 +405,53 @@ config PPC_HAS_HASH_64K
|
|||||||
depends on PPC64
|
depends on PPC64
|
||||||
default n
|
default n
|
||||||
|
|
||||||
config PPC_64K_PAGES
|
choice
|
||||||
bool "64k page size"
|
prompt "Page size"
|
||||||
depends on PPC64
|
default PPC_4K_PAGES
|
||||||
select PPC_HAS_HASH_64K
|
|
||||||
help
|
help
|
||||||
This option changes the kernel logical page size to 64k. On machines
|
Select the kernel logical page size. Increasing the page size
|
||||||
without processor support for 64k pages, the kernel will simulate
|
will reduce software overhead at each page boundary, allow
|
||||||
them by loading each individual 4k page on demand transparently,
|
hardware prefetch mechanisms to be more effective, and allow
|
||||||
while on hardware with such support, it will be used to map
|
larger dma transfers increasing IO efficiency and reducing
|
||||||
normal application pages.
|
overhead. However the utilization of memory will increase.
|
||||||
|
For example, each cached file will using a multiple of the
|
||||||
|
page size to hold its contents and the difference between the
|
||||||
|
end of file and the end of page is wasted.
|
||||||
|
|
||||||
|
Some dedicated systems, such as software raid serving with
|
||||||
|
accelerated calculations, have shown significant increases.
|
||||||
|
|
||||||
|
If you configure a 64 bit kernel for 64k pages but the
|
||||||
|
processor does not support them, then the kernel will simulate
|
||||||
|
them with 4k pages, loading them on demand, but with the
|
||||||
|
reduced software overhead and larger internal fragmentation.
|
||||||
|
For the 32 bit kernel, a large page option will not be offered
|
||||||
|
unless it is supported by the configured processor.
|
||||||
|
|
||||||
|
If unsure, choose 4K_PAGES.
|
||||||
|
|
||||||
|
config PPC_4K_PAGES
|
||||||
|
bool "4k page size"
|
||||||
|
|
||||||
|
config PPC_16K_PAGES
|
||||||
|
bool "16k page size" if 44x
|
||||||
|
|
||||||
|
config PPC_64K_PAGES
|
||||||
|
bool "64k page size" if 44x || PPC_STD_MMU_64
|
||||||
|
select PPC_HAS_HASH_64K if PPC_STD_MMU_64
|
||||||
|
|
||||||
|
endchoice
|
||||||
|
|
||||||
config FORCE_MAX_ZONEORDER
|
config FORCE_MAX_ZONEORDER
|
||||||
int "Maximum zone order"
|
int "Maximum zone order"
|
||||||
range 9 64 if PPC_64K_PAGES
|
range 9 64 if PPC_STD_MMU_64 && PPC_64K_PAGES
|
||||||
default "9" if PPC_64K_PAGES
|
default "9" if PPC_STD_MMU_64 && PPC_64K_PAGES
|
||||||
range 13 64 if PPC64 && !PPC_64K_PAGES
|
range 13 64 if PPC_STD_MMU_64 && !PPC_64K_PAGES
|
||||||
default "13" if PPC64 && !PPC_64K_PAGES
|
default "13" if PPC_STD_MMU_64 && !PPC_64K_PAGES
|
||||||
|
range 9 64 if PPC_STD_MMU_32 && PPC_16K_PAGES
|
||||||
|
default "9" if PPC_STD_MMU_32 && PPC_16K_PAGES
|
||||||
|
range 7 64 if PPC_STD_MMU_32 && PPC_64K_PAGES
|
||||||
|
default "7" if PPC_STD_MMU_32 && PPC_64K_PAGES
|
||||||
range 11 64
|
range 11 64
|
||||||
default "11"
|
default "11"
|
||||||
help
|
help
|
||||||
@ -437,7 +471,7 @@ config FORCE_MAX_ZONEORDER
|
|||||||
|
|
||||||
config PPC_SUBPAGE_PROT
|
config PPC_SUBPAGE_PROT
|
||||||
bool "Support setting protections for 4k subpages"
|
bool "Support setting protections for 4k subpages"
|
||||||
depends on PPC_64K_PAGES
|
depends on PPC_STD_MMU_64 && PPC_64K_PAGES
|
||||||
help
|
help
|
||||||
This option adds support for a system call to allow user programs
|
This option adds support for a system call to allow user programs
|
||||||
to set access permissions (read/write, readonly, or no access)
|
to set access permissions (read/write, readonly, or no access)
|
||||||
|
@ -2,6 +2,15 @@ menu "Kernel hacking"
|
|||||||
|
|
||||||
source "lib/Kconfig.debug"
|
source "lib/Kconfig.debug"
|
||||||
|
|
||||||
|
config PRINT_STACK_DEPTH
|
||||||
|
int "Stack depth to print" if DEBUG_KERNEL
|
||||||
|
default 64
|
||||||
|
help
|
||||||
|
This option allows you to set the stack depth that the kernel
|
||||||
|
prints in stack traces. This can be useful if your display is
|
||||||
|
too small and stack traces cause important information to
|
||||||
|
scroll off the screen.
|
||||||
|
|
||||||
config DEBUG_STACKOVERFLOW
|
config DEBUG_STACKOVERFLOW
|
||||||
bool "Check for stack overflows"
|
bool "Check for stack overflows"
|
||||||
depends on DEBUG_KERNEL
|
depends on DEBUG_KERNEL
|
||||||
|
@ -107,7 +107,6 @@ KBUILD_CFLAGS += $(call cc-option,-mno-altivec)
|
|||||||
# (We use all available options to help semi-broken compilers)
|
# (We use all available options to help semi-broken compilers)
|
||||||
KBUILD_CFLAGS += $(call cc-option,-mno-spe)
|
KBUILD_CFLAGS += $(call cc-option,-mno-spe)
|
||||||
KBUILD_CFLAGS += $(call cc-option,-mspe=no)
|
KBUILD_CFLAGS += $(call cc-option,-mspe=no)
|
||||||
KBUILD_CFLAGS += $(call cc-option,-mabi=no-spe)
|
|
||||||
|
|
||||||
# Enable unit-at-a-time mode when possible. It shrinks the
|
# Enable unit-at-a-time mode when possible. It shrinks the
|
||||||
# kernel considerably.
|
# kernel considerably.
|
||||||
|
@ -41,6 +41,7 @@ $(obj)/4xx.o: BOOTCFLAGS += -mcpu=405
|
|||||||
$(obj)/ebony.o: BOOTCFLAGS += -mcpu=405
|
$(obj)/ebony.o: BOOTCFLAGS += -mcpu=405
|
||||||
$(obj)/cuboot-taishan.o: BOOTCFLAGS += -mcpu=405
|
$(obj)/cuboot-taishan.o: BOOTCFLAGS += -mcpu=405
|
||||||
$(obj)/cuboot-katmai.o: BOOTCFLAGS += -mcpu=405
|
$(obj)/cuboot-katmai.o: BOOTCFLAGS += -mcpu=405
|
||||||
|
$(obj)/cuboot-acadia.o: BOOTCFLAGS += -mcpu=405
|
||||||
$(obj)/treeboot-walnut.o: BOOTCFLAGS += -mcpu=405
|
$(obj)/treeboot-walnut.o: BOOTCFLAGS += -mcpu=405
|
||||||
$(obj)/virtex405-head.o: BOOTAFLAGS += -mcpu=405
|
$(obj)/virtex405-head.o: BOOTAFLAGS += -mcpu=405
|
||||||
|
|
||||||
@ -193,6 +194,7 @@ image-$(CONFIG_PPC_MAPLE) += zImage.pseries
|
|||||||
image-$(CONFIG_PPC_IBM_CELL_BLADE) += zImage.pseries
|
image-$(CONFIG_PPC_IBM_CELL_BLADE) += zImage.pseries
|
||||||
image-$(CONFIG_PPC_PS3) += dtbImage.ps3
|
image-$(CONFIG_PPC_PS3) += dtbImage.ps3
|
||||||
image-$(CONFIG_PPC_CELLEB) += zImage.pseries
|
image-$(CONFIG_PPC_CELLEB) += zImage.pseries
|
||||||
|
image-$(CONFIG_PPC_CELL_QPACE) += zImage.pseries
|
||||||
image-$(CONFIG_PPC_CHRP) += zImage.chrp
|
image-$(CONFIG_PPC_CHRP) += zImage.chrp
|
||||||
image-$(CONFIG_PPC_EFIKA) += zImage.chrp
|
image-$(CONFIG_PPC_EFIKA) += zImage.chrp
|
||||||
image-$(CONFIG_PPC_PMAC) += zImage.pmac
|
image-$(CONFIG_PPC_PMAC) += zImage.pmac
|
||||||
|
@ -213,7 +213,7 @@ static int find_range(u32 *reg, u32 *ranges, int nregaddr,
|
|||||||
u32 range_addr[MAX_ADDR_CELLS];
|
u32 range_addr[MAX_ADDR_CELLS];
|
||||||
u32 range_size[MAX_ADDR_CELLS];
|
u32 range_size[MAX_ADDR_CELLS];
|
||||||
|
|
||||||
copy_val(range_addr, ranges + i, naddr);
|
copy_val(range_addr, ranges + i, nregaddr);
|
||||||
copy_val(range_size, ranges + i + nregaddr + naddr, nsize);
|
copy_val(range_size, ranges + i + nregaddr + naddr, nsize);
|
||||||
|
|
||||||
if (compare_reg(reg, range_addr, range_size))
|
if (compare_reg(reg, range_addr, range_size))
|
||||||
|
@ -199,8 +199,26 @@
|
|||||||
reg = <0x2>;
|
reg = <0x2>;
|
||||||
device_type = "ethernet-phy";
|
device_type = "ethernet-phy";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
tbi0: tbi-phy@11 {
|
||||||
|
reg = <0x11>;
|
||||||
|
device_type = "tbi-phy";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
mdio@25520 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
compatible = "fsl,gianfar-tbi";
|
||||||
|
reg = <0x25520 0x20>;
|
||||||
|
|
||||||
|
tbi1: tbi-phy@11 {
|
||||||
|
reg = <0x11>;
|
||||||
|
device_type = "tbi-phy";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
enet0: ethernet@24000 {
|
enet0: ethernet@24000 {
|
||||||
cell-index = <0>;
|
cell-index = <0>;
|
||||||
device_type = "network";
|
device_type = "network";
|
||||||
@ -210,6 +228,7 @@
|
|||||||
local-mac-address = [ 00 08 e5 11 32 33 ];
|
local-mac-address = [ 00 08 e5 11 32 33 ];
|
||||||
interrupts = <32 0x8 33 0x8 34 0x8>;
|
interrupts = <32 0x8 33 0x8 34 0x8>;
|
||||||
interrupt-parent = <&ipic>;
|
interrupt-parent = <&ipic>;
|
||||||
|
tbi-handle = <&tbi0>;
|
||||||
phy-handle = <&phy0>;
|
phy-handle = <&phy0>;
|
||||||
linux,network-index = <0>;
|
linux,network-index = <0>;
|
||||||
};
|
};
|
||||||
@ -223,6 +242,7 @@
|
|||||||
local-mac-address = [ 00 08 e5 11 32 34 ];
|
local-mac-address = [ 00 08 e5 11 32 34 ];
|
||||||
interrupts = <35 0x8 36 0x8 37 0x8>;
|
interrupts = <35 0x8 36 0x8 37 0x8>;
|
||||||
interrupt-parent = <&ipic>;
|
interrupt-parent = <&ipic>;
|
||||||
|
tbi-handle = <&tbi1>;
|
||||||
phy-handle = <&phy1>;
|
phy-handle = <&phy1>;
|
||||||
linux,network-index = <1>;
|
linux,network-index = <1>;
|
||||||
};
|
};
|
||||||
|
@ -269,7 +269,8 @@
|
|||||||
* later cannot be changed. Chip supports a second
|
* later cannot be changed. Chip supports a second
|
||||||
* IO range but we don't use it for now
|
* IO range but we don't use it for now
|
||||||
*/
|
*/
|
||||||
ranges = <0x02000000 0x00000000 0xa0000000 0x00000000 0xa0000000 0x00000000 0x20000000
|
ranges = <0x02000000 0x00000000 0xa0000000 0x00000000 0xa0000000 0x00000000 0x40000000
|
||||||
|
0x02000000 0x00000000 0x00000000 0x00000000 0xe0000000 0x00000000 0x00100000
|
||||||
0x01000000 0x00000000 0x00000000 0x00000000 0xe8000000 0x00000000 0x00010000>;
|
0x01000000 0x00000000 0x00000000 0x00000000 0xe8000000 0x00000000 0x00010000>;
|
||||||
|
|
||||||
/* Inbound 2GB range starting at 0 */
|
/* Inbound 2GB range starting at 0 */
|
||||||
|
@ -40,6 +40,7 @@
|
|||||||
d-cache-size = <32768>;
|
d-cache-size = <32768>;
|
||||||
dcr-controller;
|
dcr-controller;
|
||||||
dcr-access-method = "native";
|
dcr-access-method = "native";
|
||||||
|
next-level-cache = <&L2C0>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -104,6 +105,16 @@
|
|||||||
dcr-reg = <0x00c 0x002>;
|
dcr-reg = <0x00c 0x002>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
L2C0: l2c {
|
||||||
|
compatible = "ibm,l2-cache-460ex", "ibm,l2-cache";
|
||||||
|
dcr-reg = <0x020 0x008 /* Internal SRAM DCR's */
|
||||||
|
0x030 0x008>; /* L2 cache DCR's */
|
||||||
|
cache-line-size = <32>; /* 32 bytes */
|
||||||
|
cache-size = <262144>; /* L2, 256K */
|
||||||
|
interrupt-parent = <&UIC1>;
|
||||||
|
interrupts = <11 1>;
|
||||||
|
};
|
||||||
|
|
||||||
plb {
|
plb {
|
||||||
compatible = "ibm,plb-460ex", "ibm,plb4";
|
compatible = "ibm,plb-460ex", "ibm,plb4";
|
||||||
#address-cells = <2>;
|
#address-cells = <2>;
|
||||||
@ -343,6 +354,7 @@
|
|||||||
* later cannot be changed
|
* later cannot be changed
|
||||||
*/
|
*/
|
||||||
ranges = <0x02000000 0x00000000 0x80000000 0x0000000d 0x80000000 0x00000000 0x80000000
|
ranges = <0x02000000 0x00000000 0x80000000 0x0000000d 0x80000000 0x00000000 0x80000000
|
||||||
|
0x02000000 0x00000000 0x00000000 0x0000000c 0x0ee00000 0x00000000 0x00100000
|
||||||
0x01000000 0x00000000 0x00000000 0x0000000c 0x08000000 0x00000000 0x00010000>;
|
0x01000000 0x00000000 0x00000000 0x0000000c 0x08000000 0x00000000 0x00010000>;
|
||||||
|
|
||||||
/* Inbound 2GB range starting at 0 */
|
/* Inbound 2GB range starting at 0 */
|
||||||
@ -373,6 +385,7 @@
|
|||||||
* later cannot be changed
|
* later cannot be changed
|
||||||
*/
|
*/
|
||||||
ranges = <0x02000000 0x00000000 0x80000000 0x0000000e 0x00000000 0x00000000 0x80000000
|
ranges = <0x02000000 0x00000000 0x80000000 0x0000000e 0x00000000 0x00000000 0x80000000
|
||||||
|
0x02000000 0x00000000 0x00000000 0x0000000f 0x00000000 0x00000000 0x00100000
|
||||||
0x01000000 0x00000000 0x00000000 0x0000000f 0x80000000 0x00000000 0x00010000>;
|
0x01000000 0x00000000 0x00000000 0x0000000f 0x80000000 0x00000000 0x00010000>;
|
||||||
|
|
||||||
/* Inbound 2GB range starting at 0 */
|
/* Inbound 2GB range starting at 0 */
|
||||||
@ -414,6 +427,7 @@
|
|||||||
* later cannot be changed
|
* later cannot be changed
|
||||||
*/
|
*/
|
||||||
ranges = <0x02000000 0x00000000 0x80000000 0x0000000e 0x80000000 0x00000000 0x80000000
|
ranges = <0x02000000 0x00000000 0x80000000 0x0000000e 0x80000000 0x00000000 0x80000000
|
||||||
|
0x02000000 0x00000000 0x00000000 0x0000000f 0x00100000 0x00000000 0x00100000
|
||||||
0x01000000 0x00000000 0x00000000 0x0000000f 0x80010000 0x00000000 0x00010000>;
|
0x01000000 0x00000000 0x00000000 0x0000000f 0x80010000 0x00000000 0x00010000>;
|
||||||
|
|
||||||
/* Inbound 2GB range starting at 0 */
|
/* Inbound 2GB range starting at 0 */
|
||||||
|
@ -98,6 +98,12 @@
|
|||||||
interrupt-parent = <&mpic>;
|
interrupt-parent = <&mpic>;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
gef_gpio: gpio@7,14000 {
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
compatible = "gef,sbc610-gpio";
|
||||||
|
reg = <0x7 0x14000 0x24>;
|
||||||
|
gpio-controller;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
soc@fef00000 {
|
soc@fef00000 {
|
||||||
@ -119,6 +125,11 @@
|
|||||||
interrupt-parent = <&mpic>;
|
interrupt-parent = <&mpic>;
|
||||||
dfsrr;
|
dfsrr;
|
||||||
|
|
||||||
|
rtc@51 {
|
||||||
|
compatible = "epson,rx8581";
|
||||||
|
reg = <0x00000051>;
|
||||||
|
};
|
||||||
|
|
||||||
eti@6b {
|
eti@6b {
|
||||||
compatible = "dallas,ds1682";
|
compatible = "dallas,ds1682";
|
||||||
reg = <0x6b>;
|
reg = <0x6b>;
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user