Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
This commit is contained in:
commit
a8931ef380
|
@ -3,6 +3,10 @@
|
|||
# subdirectories here. Add them in the ".gitignore" file
|
||||
# in that subdirectory instead.
|
||||
#
|
||||
# NOTE! Please use 'git-ls-files -i --exclude-standard'
|
||||
# command after changing this file, to see if there are
|
||||
# any tracked files which get ignored after the change.
|
||||
#
|
||||
# Normal rules
|
||||
#
|
||||
.*
|
||||
|
@ -18,18 +22,21 @@
|
|||
*.lst
|
||||
*.symtypes
|
||||
*.order
|
||||
*.elf
|
||||
*.bin
|
||||
*.gz
|
||||
|
||||
#
|
||||
# Top-level generic files
|
||||
#
|
||||
tags
|
||||
TAGS
|
||||
vmlinux*
|
||||
!vmlinux.lds.S
|
||||
vmlinux
|
||||
System.map
|
||||
Module.markers
|
||||
Module.symvers
|
||||
!.gitignore
|
||||
!.mailmap
|
||||
|
||||
#
|
||||
# Generated include files
|
||||
|
@ -52,8 +59,8 @@ series
|
|||
|
||||
# cscope files
|
||||
cscope.*
|
||||
ncscope.*
|
||||
|
||||
*.orig
|
||||
*.rej
|
||||
*~
|
||||
\#*#
|
||||
|
|
5
CREDITS
5
CREDITS
|
@ -2611,8 +2611,9 @@ S: Perth, Western Australia
|
|||
S: Australia
|
||||
|
||||
N: Miguel Ojeda Sandonis
|
||||
E: maxextreme@gmail.com
|
||||
W: http://maxextreme.googlepages.com/
|
||||
E: miguel.ojeda.sandonis@gmail.com
|
||||
W: http://miguelojeda.es
|
||||
W: http://jair.lab.fi.uva.es/~migojed/
|
||||
D: Author of the ks0108, cfag12864b and cfag12864bfb auxiliary display drivers.
|
||||
D: Maintainer of the auxiliary display drivers tree (drivers/auxdisplay/*)
|
||||
S: C/ Mieses 20, 9-B
|
||||
|
|
|
@ -14,6 +14,10 @@ MAJOR:MINOR
|
|||
non-block filesystems which provide their own BDI, such as NFS
|
||||
and FUSE.
|
||||
|
||||
MAJOR:MINOR-fuseblk
|
||||
|
||||
Value of st_dev on fuseblk filesystems.
|
||||
|
||||
default
|
||||
|
||||
The default backing dev, used for non-block device backed
|
||||
|
|
|
@ -703,6 +703,31 @@
|
|||
</sect1>
|
||||
</chapter>
|
||||
|
||||
<chapter id="trylock-functions">
|
||||
<title>The trylock Functions</title>
|
||||
<para>
|
||||
There are functions that try to acquire a lock only once and immediately
|
||||
return a value telling about success or failure to acquire the lock.
|
||||
They can be used if you need no access to the data protected with the lock
|
||||
when some other thread is holding the lock. You should acquire the lock
|
||||
later if you then need access to the data protected with the lock.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
<function>spin_trylock()</function> does not spin but returns non-zero if
|
||||
it acquires the spinlock on the first try or 0 if not. This function can
|
||||
be used in all contexts like <function>spin_lock</function>: you must have
|
||||
disabled the contexts that might interrupt you and acquire the spin lock.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
<function>mutex_trylock()</function> does not suspend your task
|
||||
but returns non-zero if it could lock the mutex on the first try
|
||||
or 0 if not. This function cannot be safely used in hardware or software
|
||||
interrupt contexts despite not sleeping.
|
||||
</para>
|
||||
</chapter>
|
||||
|
||||
<chapter id="Examples">
|
||||
<title>Common Examples</title>
|
||||
<para>
|
||||
|
|
|
@ -72,7 +72,7 @@
|
|||
kgdb is a source level debugger for linux kernel. It is used along
|
||||
with gdb to debug a linux kernel. The expectation is that gdb can
|
||||
be used to "break in" to the kernel to inspect memory, variables
|
||||
and look through a cal stack information similar to what an
|
||||
and look through call stack information similar to what an
|
||||
application developer would use gdb for. It is possible to place
|
||||
breakpoints in kernel code and perform some limited execution
|
||||
stepping.
|
||||
|
@ -84,17 +84,18 @@
|
|||
runs an instance of gdb against the vmlinux file which contains
|
||||
the symbols (not boot image such as bzImage, zImage, uImage...).
|
||||
In gdb the developer specifies the connection parameters and
|
||||
connects to kgdb. Depending on which kgdb I/O modules exist in
|
||||
the kernel for a given architecture, it may be possible to debug
|
||||
the test machine's kernel with the development machine using a
|
||||
rs232 or ethernet connection.
|
||||
connects to kgdb. The type of connection a developer makes with
|
||||
gdb depends on the availability of kgdb I/O modules compiled as
|
||||
builtin's or kernel modules in the test machine's kernel.
|
||||
</para>
|
||||
</chapter>
|
||||
<chapter id="CompilingAKernel">
|
||||
<title>Compiling a kernel</title>
|
||||
<para>
|
||||
To enable <symbol>CONFIG_KGDB</symbol>, look under the "Kernel debugging"
|
||||
and then select "KGDB: kernel debugging with remote gdb".
|
||||
To enable <symbol>CONFIG_KGDB</symbol> you should first turn on
|
||||
"Prompt for development and/or incomplete code/drivers"
|
||||
(CONFIG_EXPERIMENTAL) in "General setup", then under the
|
||||
"Kernel debugging" select "KGDB: kernel debugging with remote gdb".
|
||||
</para>
|
||||
<para>
|
||||
Next you should choose one of more I/O drivers to interconnect debugging
|
||||
|
@ -221,7 +222,7 @@
|
|||
</para>
|
||||
<para>
|
||||
IMPORTANT NOTE: Using this option with kgdb over the console
|
||||
(kgdboc) or kgdb over ethernet (kgdboe) is not supported.
|
||||
(kgdboc) is not supported.
|
||||
</para>
|
||||
</sect1>
|
||||
</chapter>
|
||||
|
@ -247,18 +248,11 @@
|
|||
(gdb) target remote /dev/ttyS0
|
||||
</programlisting>
|
||||
<para>
|
||||
Example (kgdb to a terminal server):
|
||||
Example (kgdb to a terminal server on tcp port 2012):
|
||||
</para>
|
||||
<programlisting>
|
||||
% gdb ./vmlinux
|
||||
(gdb) target remote udp:192.168.2.2:6443
|
||||
</programlisting>
|
||||
<para>
|
||||
Example (kgdb over ethernet):
|
||||
</para>
|
||||
<programlisting>
|
||||
% gdb ./vmlinux
|
||||
(gdb) target remote udp:192.168.2.2:6443
|
||||
(gdb) target remote 192.168.2.2:2012
|
||||
</programlisting>
|
||||
<para>
|
||||
Once connected, you can debug a kernel the way you would debug an
|
||||
|
|
|
@ -327,6 +327,52 @@ Some people also put extra tags at the end. They'll just be ignored for
|
|||
now, but you can do this to mark internal company procedures or just
|
||||
point out some special detail about the sign-off.
|
||||
|
||||
If you are a subsystem or branch maintainer, sometimes you need to slightly
|
||||
modify patches you receive in order to merge them, because the code is not
|
||||
exactly the same in your tree and the submitters'. If you stick strictly to
|
||||
rule (c), you should ask the submitter to rediff, but this is a totally
|
||||
counter-productive waste of time and energy. Rule (b) allows you to adjust
|
||||
the code, but then it is very impolite to change one submitter's code and
|
||||
make him endorse your bugs. To solve this problem, it is recommended that
|
||||
you add a line between the last Signed-off-by header and yours, indicating
|
||||
the nature of your changes. While there is nothing mandatory about this, it
|
||||
seems like prepending the description with your mail and/or name, all
|
||||
enclosed in square brackets, is noticeable enough to make it obvious that
|
||||
you are responsible for last-minute changes. Example :
|
||||
|
||||
Signed-off-by: Random J Developer <random@developer.example.org>
|
||||
[lucky@maintainer.example.org: struct foo moved from foo.c to foo.h]
|
||||
Signed-off-by: Lucky K Maintainer <lucky@maintainer.example.org>
|
||||
|
||||
This practise is particularly helpful if you maintain a stable branch and
|
||||
want at the same time to credit the author, track changes, merge the fix,
|
||||
and protect the submitter from complaints. Note that under no circumstances
|
||||
can you change the author's identity (the From header), as it is the one
|
||||
which appears in the changelog.
|
||||
|
||||
Special note to back-porters: It seems to be a common and useful practise
|
||||
to insert an indication of the origin of a patch at the top of the commit
|
||||
message (just after the subject line) to facilitate tracking. For instance,
|
||||
here's what we see in 2.6-stable :
|
||||
|
||||
Date: Tue May 13 19:10:30 2008 +0000
|
||||
|
||||
SCSI: libiscsi regression in 2.6.25: fix nop timer handling
|
||||
|
||||
commit 4cf1043593db6a337f10e006c23c69e5fc93e722 upstream
|
||||
|
||||
And here's what appears in 2.4 :
|
||||
|
||||
Date: Tue May 13 22:12:27 2008 +0200
|
||||
|
||||
wireless, airo: waitbusy() won't delay
|
||||
|
||||
[backport of 2.6 commit b7acbdfbd1f277c1eb23f344f899cfa4cd0bf36a]
|
||||
|
||||
Whatever the format, this information provides a valuable help to people
|
||||
tracking your trees, and to people trying to trouble-shoot bugs in your
|
||||
tree.
|
||||
|
||||
|
||||
13) When to use Acked-by: and Cc:
|
||||
|
||||
|
|
|
@ -24,6 +24,8 @@ There are three different groups of fields in the struct taskstats:
|
|||
|
||||
4) Per-task and per-thread context switch count statistics
|
||||
|
||||
5) Time accounting for SMT machines
|
||||
|
||||
Future extension should add fields to the end of the taskstats struct, and
|
||||
should not change the relative position of each field within the struct.
|
||||
|
||||
|
@ -164,4 +166,8 @@ struct taskstats {
|
|||
__u64 nvcsw; /* Context voluntary switch counter */
|
||||
__u64 nivcsw; /* Context involuntary switch counter */
|
||||
|
||||
5) Time accounting for SMT machines
|
||||
__u64 ac_utimescaled; /* utime scaled on frequency etc */
|
||||
__u64 ac_stimescaled; /* stime scaled on frequency etc */
|
||||
__u64 cpu_scaled_run_real_total; /* scaled cpu_run_real_total */
|
||||
}
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
===================================
|
||||
|
||||
License: GPLv2
|
||||
Author & Maintainer: Miguel Ojeda Sandonis <maxextreme@gmail.com>
|
||||
Author & Maintainer: Miguel Ojeda Sandonis
|
||||
Date: 2006-10-27
|
||||
|
||||
|
||||
|
@ -22,7 +22,7 @@ Date: 2006-10-27
|
|||
1. DRIVER INFORMATION
|
||||
---------------------
|
||||
|
||||
This driver support one cfag12864b display at time.
|
||||
This driver supports a cfag12864b LCD.
|
||||
|
||||
|
||||
---------------------
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
* Description: cfag12864b LCD userspace example program
|
||||
* License: GPLv2
|
||||
*
|
||||
* Author: Copyright (C) Miguel Ojeda Sandonis <maxextreme@gmail.com>
|
||||
* Author: Copyright (C) Miguel Ojeda Sandonis
|
||||
* Date: 2006-10-31
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
==========================================
|
||||
|
||||
License: GPLv2
|
||||
Author & Maintainer: Miguel Ojeda Sandonis <maxextreme@gmail.com>
|
||||
Author & Maintainer: Miguel Ojeda Sandonis
|
||||
Date: 2006-10-27
|
||||
|
||||
|
||||
|
@ -21,7 +21,7 @@ Date: 2006-10-27
|
|||
1. DRIVER INFORMATION
|
||||
---------------------
|
||||
|
||||
This driver support the ks0108 LCD controller.
|
||||
This driver supports the ks0108 LCD controller.
|
||||
|
||||
|
||||
---------------------
|
||||
|
|
|
@ -21,6 +21,11 @@ This driver is known to work with the following cards:
|
|||
* SA E200
|
||||
* SA E200i
|
||||
* SA E500
|
||||
* SA P212
|
||||
* SA P410
|
||||
* SA P410i
|
||||
* SA P411
|
||||
* SA P812
|
||||
|
||||
Detecting drive failures:
|
||||
-------------------------
|
||||
|
|
|
@ -310,8 +310,8 @@ and then start a subshell 'sh' in that cgroup:
|
|||
cd /dev/cgroup
|
||||
mkdir Charlie
|
||||
cd Charlie
|
||||
/bin/echo 2-3 > cpus
|
||||
/bin/echo 1 > mems
|
||||
/bin/echo 2-3 > cpuset.cpus
|
||||
/bin/echo 1 > cpuset.mems
|
||||
/bin/echo $$ > tasks
|
||||
sh
|
||||
# The subshell 'sh' is now running in cgroup Charlie
|
||||
|
@ -390,6 +390,10 @@ If you have several tasks to attach, you have to do it one after another:
|
|||
...
|
||||
# /bin/echo PIDn > tasks
|
||||
|
||||
You can attach the current shell task by echoing 0:
|
||||
|
||||
# echo 0 > tasks
|
||||
|
||||
3. Kernel API
|
||||
=============
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@ either an integer or * for all. Access is a composition of r
|
|||
The root device cgroup starts with rwm to 'all'. A child device
|
||||
cgroup gets a copy of the parent. Administrators can then remove
|
||||
devices from the whitelist or add new entries. A child cgroup can
|
||||
never receive a device access which is denied its parent. However
|
||||
never receive a device access which is denied by its parent. However
|
||||
when a device access is removed from a parent it will not also be
|
||||
removed from the child(ren).
|
||||
|
||||
|
@ -29,7 +29,11 @@ allows cgroup 1 to read and mknod the device usually known as
|
|||
|
||||
echo a > /cgroups/1/devices.deny
|
||||
|
||||
will remove the default 'a *:* mrw' entry.
|
||||
will remove the default 'a *:* rwm' entry. Doing
|
||||
|
||||
echo a > /cgroups/1/devices.allow
|
||||
|
||||
will add the 'a *:* rwm' entry to the whitelist.
|
||||
|
||||
3. Security
|
||||
|
||||
|
|
|
@ -129,14 +129,6 @@ to its default value of '80' it means that between the checking
|
|||
intervals the CPU needs to be on average more than 80% in use to then
|
||||
decide that the CPU frequency needs to be increased.
|
||||
|
||||
sampling_down_factor: this parameter controls the rate that the CPU
|
||||
makes a decision on when to decrease the frequency. When set to its
|
||||
default value of '5' it means that at 1/5 the sampling_rate the kernel
|
||||
makes a decision to lower the frequency. Five "lower rate" decisions
|
||||
have to be made in a row before the CPU frequency is actually lower.
|
||||
If set to '1' then the frequency decreases as quickly as it increases,
|
||||
if set to '2' it decreases at half the rate of the increase.
|
||||
|
||||
ignore_nice_load: this parameter takes a value of '0' or '1'. When
|
||||
set to '0' (its default), all processes are counted towards the
|
||||
'cpu utilisation' value. When set to '1', the processes that are
|
||||
|
|
|
@ -154,13 +154,15 @@ browsing and modifying the cpusets presently known to the kernel. No
|
|||
new system calls are added for cpusets - all support for querying and
|
||||
modifying cpusets is via this cpuset file system.
|
||||
|
||||
The /proc/<pid>/status file for each task has two added lines,
|
||||
The /proc/<pid>/status file for each task has four added lines,
|
||||
displaying the tasks cpus_allowed (on which CPUs it may be scheduled)
|
||||
and mems_allowed (on which Memory Nodes it may obtain memory),
|
||||
in the format seen in the following example:
|
||||
in the two formats seen in the following example:
|
||||
|
||||
Cpus_allowed: ffffffff,ffffffff,ffffffff,ffffffff
|
||||
Cpus_allowed_list: 0-127
|
||||
Mems_allowed: ffffffff,ffffffff
|
||||
Mems_allowed_list: 0-63
|
||||
|
||||
Each cpuset is represented by a directory in the cgroup file system
|
||||
containing (on top of the standard cgroup files) the following
|
||||
|
@ -199,7 +201,7 @@ using the sched_setaffinity, mbind and set_mempolicy system calls.
|
|||
The following rules apply to each cpuset:
|
||||
|
||||
- Its CPUs and Memory Nodes must be a subset of its parents.
|
||||
- It can only be marked exclusive if its parent is.
|
||||
- It can't be marked exclusive unless its parent is.
|
||||
- If its cpu or memory is exclusive, they may not overlap any sibling.
|
||||
|
||||
These rules, and the natural hierarchy of cpusets, enable efficient
|
||||
|
@ -345,7 +347,7 @@ is modified to perform an inline check for this PF_SPREAD_PAGE task
|
|||
flag, and if set, a call to a new routine cpuset_mem_spread_node()
|
||||
returns the node to prefer for the allocation.
|
||||
|
||||
Similarly, setting 'memory_spread_cache' turns on the flag
|
||||
Similarly, setting 'memory_spread_slab' turns on the flag
|
||||
PF_SPREAD_SLAB, and appropriately marked slab caches will allocate
|
||||
pages from the node returned by cpuset_mem_spread_node().
|
||||
|
||||
|
@ -542,7 +544,10 @@ otherwise initial value -1 that indicates the cpuset has no request.
|
|||
2 : search cores in a package.
|
||||
3 : search cpus in a node [= system wide on non-NUMA system]
|
||||
( 4 : search nodes in a chunk of node [on NUMA system] )
|
||||
( 5~ : search system wide [on NUMA system])
|
||||
( 5 : search system wide [on NUMA system] )
|
||||
|
||||
The system default is architecture dependent. The system default
|
||||
can be changed using the relax_domain_level= boot parameter.
|
||||
|
||||
This file is per-cpuset and affect the sched domain where the cpuset
|
||||
belongs to. Therefore if the flag 'sched_load_balance' of a cpuset
|
||||
|
@ -709,7 +714,10 @@ Now you want to do something with this cpuset.
|
|||
|
||||
In this directory you can find several files:
|
||||
# ls
|
||||
cpus cpu_exclusive mems mem_exclusive mem_hardwall tasks
|
||||
cpu_exclusive memory_migrate mems tasks
|
||||
cpus memory_pressure notify_on_release
|
||||
mem_exclusive memory_spread_page sched_load_balance
|
||||
mem_hardwall memory_spread_slab sched_relax_domain_level
|
||||
|
||||
Reading them will give you information about the state of this cpuset:
|
||||
the CPUs and Memory Nodes it can use, the processes that are using
|
||||
|
|
|
@ -289,6 +289,14 @@ Who: Glauber Costa <gcosta@redhat.com>
|
|||
|
||||
---------------------------
|
||||
|
||||
What: old style serial driver for ColdFire (CONFIG_SERIAL_COLDFIRE)
|
||||
When: 2.6.28
|
||||
Why: This driver still uses the old interface and has been replaced
|
||||
by CONFIG_SERIAL_MCF.
|
||||
Who: Sebastian Siewior <sebastian@breakpoint.cc>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: /sys/o2cb symlink
|
||||
When: January 2010
|
||||
Why: /sys/fs/o2cb is the proper location for this information - /sys/o2cb
|
||||
|
@ -304,3 +312,12 @@ When: 2.6.26
|
|||
Why: Implementation became generic; users should now include
|
||||
linux/semaphore.h instead.
|
||||
Who: Matthew Wilcox <willy@linux.intel.com>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: CONFIG_THERMAL_HWMON
|
||||
When: January 2009
|
||||
Why: This option was introduced just to allow older lm-sensors userspace
|
||||
to keep working over the upgrade to 2.6.26. At the scheduled time of
|
||||
removal fixed lm-sensors (2.x or 3.x) should be readily available.
|
||||
Who: Rene Herman <rene.herman@gmail.com>
|
||||
|
|
|
@ -92,7 +92,6 @@ prototypes:
|
|||
void (*destroy_inode)(struct inode *);
|
||||
void (*dirty_inode) (struct inode *);
|
||||
int (*write_inode) (struct inode *, int);
|
||||
void (*put_inode) (struct inode *);
|
||||
void (*drop_inode) (struct inode *);
|
||||
void (*delete_inode) (struct inode *);
|
||||
void (*put_super) (struct super_block *);
|
||||
|
@ -115,7 +114,6 @@ alloc_inode: no no no
|
|||
destroy_inode: no
|
||||
dirty_inode: no (must not sleep)
|
||||
write_inode: no
|
||||
put_inode: no
|
||||
drop_inode: no !!!inode_lock!!!
|
||||
delete_inode: no
|
||||
put_super: yes yes no
|
||||
|
|
|
@ -139,8 +139,16 @@ commit=nrsec (*) Ext4 can be told to sync all its data and metadata
|
|||
Setting it to very large values will improve
|
||||
performance.
|
||||
|
||||
barrier=1 This enables/disables barriers. barrier=0 disables
|
||||
it, barrier=1 enables it.
|
||||
barrier=<0|1(*)> This enables/disables the use of write barriers in
|
||||
the jbd code. barrier=0 disables, barrier=1 enables.
|
||||
This also requires an IO stack which can support
|
||||
barriers, and if jbd gets an error on a barrier
|
||||
write, it will disable again with a warning.
|
||||
Write barriers enforce proper on-disk ordering
|
||||
of journal commits, making volatile disk write caches
|
||||
safe to use, at some performance penalty. If
|
||||
your disks are battery-backed in one way or another,
|
||||
disabling barriers may safely improve performance.
|
||||
|
||||
orlov (*) This enables the new Orlov block allocator. It is
|
||||
enabled by default.
|
||||
|
|
|
@ -36,6 +36,7 @@ files, each with their own function.
|
|||
local_cpus nearby CPU mask (cpumask, ro)
|
||||
resource PCI resource host addresses (ascii, ro)
|
||||
resource0..N PCI resource N, if present (binary, mmap)
|
||||
resource0_wc..N_wc PCI WC map resource N, if prefetchable (binary, mmap)
|
||||
rom PCI ROM resource, if present (binary, ro)
|
||||
subsystem_device PCI subsystem device (ascii, ro)
|
||||
subsystem_vendor PCI subsystem vendor (ascii, ro)
|
||||
|
|
|
@ -205,7 +205,6 @@ struct super_operations {
|
|||
|
||||
void (*dirty_inode) (struct inode *);
|
||||
int (*write_inode) (struct inode *, int);
|
||||
void (*put_inode) (struct inode *);
|
||||
void (*drop_inode) (struct inode *);
|
||||
void (*delete_inode) (struct inode *);
|
||||
void (*put_super) (struct super_block *);
|
||||
|
@ -246,9 +245,6 @@ or bottom half).
|
|||
inode to disc. The second parameter indicates whether the write
|
||||
should be synchronous or not, not all filesystems check this flag.
|
||||
|
||||
put_inode: called when the VFS inode is removed from the inode
|
||||
cache.
|
||||
|
||||
drop_inode: called when the last access to the inode is dropped,
|
||||
with the inode_lock spinlock held.
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -69,7 +69,8 @@ point2: Set the pwm speed at a higher temperature bound.
|
|||
|
||||
The ADT7473 will scale the pwm between the lower and higher pwm speed when
|
||||
the temperature is between the two temperature boundaries. PWM values range
|
||||
from 0 (off) to 255 (full speed).
|
||||
from 0 (off) to 255 (full speed). Fan speed will be set to maximum when the
|
||||
temperature sensor associated with the PWM control exceeds temp#_max.
|
||||
|
||||
Notes
|
||||
-----
|
||||
|
|
|
@ -0,0 +1,37 @@
|
|||
Kernel driver ibmaem
|
||||
======================
|
||||
|
||||
Supported systems:
|
||||
* Any recent IBM System X server with Active Energy Manager support.
|
||||
This includes the x3350, x3550, x3650, x3655, x3755, x3850 M2,
|
||||
x3950 M2, and certain HS2x/LS2x/QS2x blades. The IPMI host interface
|
||||
driver ("ipmi-si") needs to be loaded for this driver to do anything.
|
||||
Prefix: 'ibmaem'
|
||||
Datasheet: Not available
|
||||
|
||||
Author: Darrick J. Wong
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
This driver implements sensor reading support for the energy and power
|
||||
meters available on various IBM System X hardware through the BMC. All
|
||||
sensor banks will be exported as platform devices; this driver can talk
|
||||
to both v1 and v2 interfaces. This driver is completely separate from the
|
||||
older ibmpex driver.
|
||||
|
||||
The v1 AEM interface has a simple set of features to monitor energy use.
|
||||
There is a register that displays an estimate of raw energy consumption
|
||||
since the last BMC reset, and a power sensor that returns average power
|
||||
use over a configurable interval.
|
||||
|
||||
The v2 AEM interface is a bit more sophisticated, being able to present
|
||||
a wider range of energy and power use registers, the power cap as
|
||||
set by the AEM software, and temperature sensors.
|
||||
|
||||
Special Features
|
||||
----------------
|
||||
|
||||
The "power_cap" value displays the current system power cap, as set by
|
||||
the Active Energy Manager software. Setting the power cap from the host
|
||||
is not currently supported.
|
|
@ -2,17 +2,12 @@ Naming and data format standards for sysfs files
|
|||
------------------------------------------------
|
||||
|
||||
The libsensors library offers an interface to the raw sensors data
|
||||
through the sysfs interface. See libsensors documentation and source for
|
||||
further information. As of writing this document, libsensors
|
||||
(from lm_sensors 2.8.3) is heavily chip-dependent. Adding or updating
|
||||
support for any given chip requires modifying the library's code.
|
||||
This is because libsensors was written for the procfs interface
|
||||
older kernel modules were using, which wasn't standardized enough.
|
||||
Recent versions of libsensors (from lm_sensors 2.8.2 and later) have
|
||||
support for the sysfs interface, though.
|
||||
|
||||
The new sysfs interface was designed to be as chip-independent as
|
||||
possible.
|
||||
through the sysfs interface. Since lm-sensors 3.0.0, libsensors is
|
||||
completely chip-independent. It assumes that all the kernel drivers
|
||||
implement the standard sysfs interface described in this document.
|
||||
This makes adding or updating support for any given chip very easy, as
|
||||
libsensors, and applications using it, do not need to be modified.
|
||||
This is a major improvement compared to lm-sensors 2.
|
||||
|
||||
Note that motherboards vary widely in the connections to sensor chips.
|
||||
There is no standard that ensures, for example, that the second
|
||||
|
@ -35,19 +30,17 @@ access this data in a simple and consistent way. That said, such programs
|
|||
will have to implement conversion, labeling and hiding of inputs. For
|
||||
this reason, it is still not recommended to bypass the library.
|
||||
|
||||
If you are developing a userspace application please send us feedback on
|
||||
this standard.
|
||||
|
||||
Note that this standard isn't completely established yet, so it is subject
|
||||
to changes. If you are writing a new hardware monitoring driver those
|
||||
features can't seem to fit in this interface, please contact us with your
|
||||
extension proposal. Keep in mind that backward compatibility must be
|
||||
preserved.
|
||||
|
||||
Each chip gets its own directory in the sysfs /sys/devices tree. To
|
||||
find all sensor chips, it is easier to follow the device symlinks from
|
||||
/sys/class/hwmon/hwmon*.
|
||||
|
||||
Up to lm-sensors 3.0.0, libsensors looks for hardware monitoring attributes
|
||||
in the "physical" device directory. Since lm-sensors 3.0.1, attributes found
|
||||
in the hwmon "class" device directory are also supported. Complex drivers
|
||||
(e.g. drivers for multifunction chips) may want to use this possibility to
|
||||
avoid namespace pollution. The only drawback will be that older versions of
|
||||
libsensors won't support the driver in question.
|
||||
|
||||
All sysfs values are fixed point numbers.
|
||||
|
||||
There is only one value per file, unlike the older /proc specification.
|
||||
|
|
|
@ -51,26 +51,38 @@ A few combinations of the above flags are also defined for your convenience:
|
|||
the transparent emulation layer)
|
||||
|
||||
|
||||
ALGORITHM/ADAPTER IMPLEMENTATION
|
||||
--------------------------------
|
||||
ADAPTER IMPLEMENTATION
|
||||
----------------------
|
||||
|
||||
When you write a new algorithm driver, you will have to implement a
|
||||
function callback `functionality', that gets an i2c_adapter structure
|
||||
pointer as its only parameter:
|
||||
When you write a new adapter driver, you will have to implement a
|
||||
function callback `functionality'. Typical implementations are given
|
||||
below.
|
||||
|
||||
struct i2c_algorithm {
|
||||
/* Many other things of course; check <linux/i2c.h>! */
|
||||
u32 (*functionality) (struct i2c_adapter *);
|
||||
}
|
||||
A typical SMBus-only adapter would list all the SMBus transactions it
|
||||
supports. This example comes from the i2c-piix4 driver:
|
||||
|
||||
A typically implementation is given below, from i2c-algo-bit.c:
|
||||
|
||||
static u32 bit_func(struct i2c_adapter *adap)
|
||||
static u32 piix4_func(struct i2c_adapter *adapter)
|
||||
{
|
||||
return I2C_FUNC_SMBUS_EMUL | I2C_FUNC_10BIT_ADDR |
|
||||
I2C_FUNC_PROTOCOL_MANGLING;
|
||||
return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE |
|
||||
I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA |
|
||||
I2C_FUNC_SMBUS_BLOCK_DATA;
|
||||
}
|
||||
|
||||
A typical full-I2C adapter would use the following (from the i2c-pxa
|
||||
driver):
|
||||
|
||||
static u32 i2c_pxa_functionality(struct i2c_adapter *adap)
|
||||
{
|
||||
return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
|
||||
}
|
||||
|
||||
I2C_FUNC_SMBUS_EMUL includes all the SMBus transactions (with the
|
||||
addition of I2C block transactions) which i2c-core can emulate using
|
||||
I2C_FUNC_I2C without any help from the adapter driver. The idea is
|
||||
to let the client drivers check for the support of SMBus functions
|
||||
without having to care whether the said functions are implemented in
|
||||
hardware by the adapter, or emulated in software by i2c-core on top
|
||||
of an I2C adapter.
|
||||
|
||||
|
||||
CLIENT CHECKING
|
||||
|
@ -78,36 +90,33 @@ CLIENT CHECKING
|
|||
|
||||
Before a client tries to attach to an adapter, or even do tests to check
|
||||
whether one of the devices it supports is present on an adapter, it should
|
||||
check whether the needed functionality is present. There are two functions
|
||||
defined which should be used instead of calling the functionality hook
|
||||
in the algorithm structure directly:
|
||||
check whether the needed functionality is present. The typical way to do
|
||||
this is (from the lm75 driver):
|
||||
|
||||
/* Return the functionality mask */
|
||||
extern u32 i2c_get_functionality (struct i2c_adapter *adap);
|
||||
|
||||
/* Return 1 if adapter supports everything we need, 0 if not. */
|
||||
extern int i2c_check_functionality (struct i2c_adapter *adap, u32 func);
|
||||
|
||||
This is a typical way to use these functions (from the writing-clients
|
||||
document):
|
||||
int foo_detect_client(struct i2c_adapter *adapter, int address,
|
||||
unsigned short flags, int kind)
|
||||
static int lm75_detect(...)
|
||||
{
|
||||
/* Define needed variables */
|
||||
|
||||
/* As the very first action, we check whether the adapter has the
|
||||
needed functionality: we need the SMBus read_word_data,
|
||||
write_word_data and write_byte functions in this example. */
|
||||
if (!i2c_check_functionality(adapter,I2C_FUNC_SMBUS_WORD_DATA |
|
||||
I2C_FUNC_SMBUS_WRITE_BYTE))
|
||||
goto ERROR0;
|
||||
|
||||
/* Now we can do the real detection */
|
||||
|
||||
ERROR0:
|
||||
/* Return an error */
|
||||
(...)
|
||||
if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA |
|
||||
I2C_FUNC_SMBUS_WORD_DATA))
|
||||
goto exit;
|
||||
(...)
|
||||
}
|
||||
|
||||
Here, the lm75 driver checks if the adapter can do both SMBus byte data
|
||||
and SMBus word data transactions. If not, then the driver won't work on
|
||||
this adapter and there's no point in going on. If the check above is
|
||||
successful, then the driver knows that it can call the following
|
||||
functions: i2c_smbus_read_byte_data(), i2c_smbus_write_byte_data(),
|
||||
i2c_smbus_read_word_data() and i2c_smbus_write_word_data(). As a rule of
|
||||
thumb, the functionality constants you test for with
|
||||
i2c_check_functionality() should match exactly the i2c_smbus_* functions
|
||||
which you driver is calling.
|
||||
|
||||
Note that the check above doesn't tell whether the functionalities are
|
||||
implemented in hardware by the underlying adapter or emulated in
|
||||
software by i2c-core. Client drivers don't have to care about this, as
|
||||
i2c-core will transparently implement SMBus transactions on top of I2C
|
||||
adapters.
|
||||
|
||||
|
||||
CHECKING THROUGH /DEV
|
||||
|
@ -116,19 +125,19 @@ CHECKING THROUGH /DEV
|
|||
If you try to access an adapter from a userspace program, you will have
|
||||
to use the /dev interface. You will still have to check whether the
|
||||
functionality you need is supported, of course. This is done using
|
||||
the I2C_FUNCS ioctl. An example, adapted from the lm_sensors i2cdetect
|
||||
program, is below:
|
||||
the I2C_FUNCS ioctl. An example, adapted from the i2cdetect program, is
|
||||
below:
|
||||
|
||||
int file;
|
||||
if (file = open("/dev/i2c-0",O_RDWR) < 0) {
|
||||
if (file = open("/dev/i2c-0", O_RDWR) < 0) {
|
||||
/* Some kind of error handling */
|
||||
exit(1);
|
||||
}
|
||||
if (ioctl(file,I2C_FUNCS,&funcs) < 0) {
|
||||
if (ioctl(file, I2C_FUNCS, &funcs) < 0) {
|
||||
/* Some kind of error handling */
|
||||
exit(1);
|
||||
}
|
||||
if (! (funcs & I2C_FUNC_SMBUS_QUICK)) {
|
||||
if (!(funcs & I2C_FUNC_SMBUS_QUICK)) {
|
||||
/* Oops, the needed functionality (SMBus write_quick function) is
|
||||
not available! */
|
||||
exit(1);
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
SMBus Protocol Summary
|
||||
======================
|
||||
|
||||
The following is a summary of the SMBus protocol. It applies to
|
||||
all revisions of the protocol (1.0, 1.1, and 2.0).
|
||||
Certain protocol features which are not supported by
|
||||
|
@ -8,6 +9,7 @@ this package are briefly described at the end of this document.
|
|||
Some adapters understand only the SMBus (System Management Bus) protocol,
|
||||
which is a subset from the I2C protocol. Fortunately, many devices use
|
||||
only the same subset, which makes it possible to put them on an SMBus.
|
||||
|
||||
If you write a driver for some I2C device, please try to use the SMBus
|
||||
commands if at all possible (if the device uses only that subset of the
|
||||
I2C protocol). This makes it possible to use the device driver on both
|
||||
|
@ -15,7 +17,12 @@ SMBus adapters and I2C adapters (the SMBus command set is automatically
|
|||
translated to I2C on I2C adapters, but plain I2C commands can not be
|
||||
handled at all on most pure SMBus adapters).
|
||||
|
||||
Below is a list of SMBus commands.
|
||||
Below is a list of SMBus protocol operations, and the functions executing
|
||||
them. Note that the names used in the SMBus protocol specifications usually
|
||||
don't match these function names. For some of the operations which pass a
|
||||
single data byte, the functions using SMBus protocol operation names execute
|
||||
a different protocol operation entirely.
|
||||
|
||||
|
||||
Key to symbols
|
||||
==============
|
||||
|
@ -35,17 +42,16 @@ Count (8 bits): A data byte containing the length of a block operation.
|
|||
[..]: Data sent by I2C device, as opposed to data sent by the host adapter.
|
||||
|
||||
|
||||
SMBus Write Quick
|
||||
=================
|
||||
SMBus Quick Command: i2c_smbus_write_quick()
|
||||
=============================================
|
||||
|
||||
This sends a single bit to the device, at the place of the Rd/Wr bit.
|
||||
There is no equivalent Read Quick command.
|
||||
|
||||
A Addr Rd/Wr [A] P
|
||||
|
||||
|
||||
SMBus Read Byte
|
||||
===============
|
||||
SMBus Receive Byte: i2c_smbus_read_byte()
|
||||
==========================================
|
||||
|
||||
This reads a single byte from a device, without specifying a device
|
||||
register. Some devices are so simple that this interface is enough; for
|
||||
|
@ -55,17 +61,17 @@ the previous SMBus command.
|
|||
S Addr Rd [A] [Data] NA P
|
||||
|
||||
|
||||
SMBus Write Byte
|
||||
================
|
||||
SMBus Send Byte: i2c_smbus_write_byte()
|
||||
========================================
|
||||
|
||||
This is the reverse of Read Byte: it sends a single byte to a device.
|
||||
See Read Byte for more information.
|
||||
This operation is the reverse of Receive Byte: it sends a single byte
|
||||
to a device. See Receive Byte for more information.
|
||||
|
||||
S Addr Wr [A] Data [A] P
|
||||
|
||||
|
||||
SMBus Read Byte Data
|
||||
====================
|
||||
SMBus Read Byte: i2c_smbus_read_byte_data()
|
||||
============================================
|
||||
|
||||
This reads a single byte from a device, from a designated register.
|
||||
The register is specified through the Comm byte.
|
||||
|
@ -73,30 +79,30 @@ The register is specified through the Comm byte.
|
|||
S Addr Wr [A] Comm [A] S Addr Rd [A] [Data] NA P
|
||||
|
||||
|
||||
SMBus Read Word Data
|
||||
====================
|
||||
SMBus Read Word: i2c_smbus_read_word_data()
|
||||
============================================
|
||||
|
||||
This command is very like Read Byte Data; again, data is read from a
|
||||
This operation is very like Read Byte; again, data is read from a
|
||||
device, from a designated register that is specified through the Comm
|
||||
byte. But this time, the data is a complete word (16 bits).
|
||||
|
||||
S Addr Wr [A] Comm [A] S Addr Rd [A] [DataLow] A [DataHigh] NA P
|
||||
|
||||
|
||||
SMBus Write Byte Data
|
||||
=====================
|
||||
SMBus Write Byte: i2c_smbus_write_byte_data()
|
||||
==============================================
|
||||
|
||||
This writes a single byte to a device, to a designated register. The
|
||||
register is specified through the Comm byte. This is the opposite of
|
||||
the Read Byte Data command.
|
||||
the Read Byte operation.
|
||||
|
||||
S Addr Wr [A] Comm [A] Data [A] P
|
||||
|
||||
|
||||
SMBus Write Word Data
|
||||
=====================
|
||||
SMBus Write Word: i2c_smbus_write_word_data()
|
||||
==============================================
|
||||
|
||||
This is the opposite operation of the Read Word Data command. 16 bits
|
||||
This is the opposite of the Read Word operation. 16 bits
|
||||
of data is written to a device, to the designated register that is
|
||||
specified through the Comm byte.
|
||||
|
||||
|
@ -113,8 +119,8 @@ S Addr Wr [A] Comm [A] DataLow [A] DataHigh [A]
|
|||
S Addr Rd [A] [DataLow] A [DataHigh] NA P
|
||||
|
||||
|
||||
SMBus Block Read
|
||||
================
|
||||
SMBus Block Read: i2c_smbus_read_block_data()
|
||||
==============================================
|
||||
|
||||
This command reads a block of up to 32 bytes from a device, from a
|
||||
designated register that is specified through the Comm byte. The amount
|
||||
|
@ -124,8 +130,8 @@ S Addr Wr [A] Comm [A]
|
|||
S Addr Rd [A] [Count] A [Data] A [Data] A ... A [Data] NA P
|
||||
|
||||
|
||||
SMBus Block Write
|
||||
=================
|
||||
SMBus Block Write: i2c_smbus_write_block_data()
|
||||
================================================
|
||||
|
||||
The opposite of the Block Read command, this writes up to 32 bytes to
|
||||
a device, to a designated register that is specified through the
|
||||
|
@ -134,10 +140,11 @@ Comm byte. The amount of data is specified in the Count byte.
|
|||
S Addr Wr [A] Comm [A] Count [A] Data [A] Data [A] ... [A] Data [A] P
|
||||
|
||||
|
||||
SMBus Block Process Call
|
||||
========================
|
||||
SMBus Block Write - Block Read Process Call
|
||||
===========================================
|
||||
|
||||
SMBus Block Process Call was introduced in Revision 2.0 of the specification.
|
||||
SMBus Block Write - Block Read Process Call was introduced in
|
||||
Revision 2.0 of the specification.
|
||||
|
||||
This command selects a device register (through the Comm byte), sends
|
||||
1 to 31 bytes of data to it, and reads 1 to 31 bytes of data in return.
|
||||
|
@ -159,13 +166,16 @@ alerting device's address.
|
|||
|
||||
Packet Error Checking (PEC)
|
||||
===========================
|
||||
|
||||
Packet Error Checking was introduced in Revision 1.1 of the specification.
|
||||
|
||||
PEC adds a CRC-8 error-checking byte to all transfers.
|
||||
PEC adds a CRC-8 error-checking byte to transfers using it, immediately
|
||||
before the terminating STOP.
|
||||
|
||||
|
||||
Address Resolution Protocol (ARP)
|
||||
=================================
|
||||
|
||||
The Address Resolution Protocol was introduced in Revision 2.0 of
|
||||
the specification. It is a higher-layer protocol which uses the
|
||||
messages above.
|
||||
|
@ -177,14 +187,17 @@ require PEC checksums.
|
|||
|
||||
I2C Block Transactions
|
||||
======================
|
||||
|
||||
The following I2C block transactions are supported by the
|
||||
SMBus layer and are described here for completeness.
|
||||
They are *NOT* defined by the SMBus specification.
|
||||
|
||||
I2C block transactions do not limit the number of bytes transferred
|
||||
but the SMBus layer places a limit of 32 bytes.
|
||||
|
||||
|
||||
I2C Block Read
|
||||
==============
|
||||
I2C Block Read: i2c_smbus_read_i2c_block_data()
|
||||
================================================
|
||||
|
||||
This command reads a block of bytes from a device, from a
|
||||
designated register that is specified through the Comm byte.
|
||||
|
@ -203,8 +216,8 @@ S Addr Wr [A] Comm1 [A] Comm2 [A]
|
|||
S Addr Rd [A] [Data] A [Data] A ... A [Data] NA P
|
||||
|
||||
|
||||
I2C Block Write
|
||||
===============
|
||||
I2C Block Write: i2c_smbus_write_i2c_block_data()
|
||||
==================================================
|
||||
|
||||
The opposite of the Block Read command, this writes bytes to
|
||||
a device, to a designated register that is specified through the
|
||||
|
@ -212,5 +225,3 @@ Comm byte. Note that command lengths of 0, 2, or more bytes are
|
|||
supported as they are indistinguishable from data.
|
||||
|
||||
S Addr Wr [A] Comm [A] Data [A] Data [A] ... [A] Data [A] P
|
||||
|
||||
|
||||
|
|
|
@ -25,12 +25,23 @@ routines, and should be zero-initialized except for fields with data you
|
|||
provide. A client structure holds device-specific information like the
|
||||
driver model device node, and its I2C address.
|
||||
|
||||
/* iff driver uses driver model ("new style") binding model: */
|
||||
|
||||
static struct i2c_device_id foo_idtable[] = {
|
||||
{ "foo", my_id_for_foo },
|
||||
{ "bar", my_id_for_bar },
|
||||
{ }
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(i2c, foo_idtable);
|
||||
|
||||
static struct i2c_driver foo_driver = {
|
||||
.driver = {
|
||||
.name = "foo",
|
||||
},
|
||||
|
||||
/* iff driver uses driver model ("new style") binding model: */
|
||||
.id_table = foo_ids,
|
||||
.probe = foo_probe,
|
||||
.remove = foo_remove,
|
||||
|
||||
|
@ -173,10 +184,9 @@ handle may be used during foo_probe(). If foo_probe() reports success
|
|||
(zero not a negative status code) it may save the handle and use it until
|
||||
foo_remove() returns. That binding model is used by most Linux drivers.
|
||||
|
||||
Drivers match devices when i2c_client.driver_name and the driver name are
|
||||
the same; this approach is used in several other busses that don't have
|
||||
device typing support in the hardware. The driver and module name should
|
||||
match, so hotplug/coldplug mechanisms will modprobe the driver.
|
||||
The probe function is called when an entry in the id_table name field
|
||||
matches the device's name. It is passed the entry that was matched so
|
||||
the driver knows which one in the table matched.
|
||||
|
||||
|
||||
Device Creation (Standard driver model)
|
||||
|
|
|
@ -377,27 +377,3 @@ config FOO
|
|||
|
||||
limits FOO to module (=m) or disabled (=n).
|
||||
|
||||
|
||||
Build limited by a third config symbol which may be =y or =m
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
A common idiom that we see (and sometimes have problems with) is this:
|
||||
|
||||
When option C in B (module or subsystem) uses interfaces from A (module
|
||||
or subsystem), and both A and B are tristate (could be =y or =m if they
|
||||
were independent of each other, but they aren't), then we need to limit
|
||||
C such that it cannot be built statically if A is built as a loadable
|
||||
module. (C already depends on B, so there is no dependency issue to
|
||||
take care of here.)
|
||||
|
||||
If A is linked statically into the kernel image, C can be built
|
||||
statically or as loadable module(s). However, if A is built as loadable
|
||||
module(s), then C must be restricted to loadable module(s) also. This
|
||||
can be expressed in kconfig language as:
|
||||
|
||||
config C
|
||||
depends on A = y || A = B
|
||||
|
||||
or for real examples, use this command in a kernel tree:
|
||||
|
||||
$ find . -name Kconfig\* | xargs grep -ns "depends on.*=.*||.*=" | grep -v orig
|
||||
|
||||
|
|
|
@ -1,6 +1,105 @@
|
|||
kernel-doc nano-HOWTO
|
||||
=====================
|
||||
|
||||
How to format kernel-doc comments
|
||||
---------------------------------
|
||||
|
||||
In order to provide embedded, 'C' friendly, easy to maintain,
|
||||
but consistent and extractable documentation of the functions and
|
||||
data structures in the Linux kernel, the Linux kernel has adopted
|
||||
a consistent style for documenting functions and their parameters,
|
||||
and structures and their members.
|
||||
|
||||
The format for this documentation is called the kernel-doc format.
|
||||
It is documented in this Documentation/kernel-doc-nano-HOWTO.txt file.
|
||||
|
||||
This style embeds the documentation within the source files, using
|
||||
a few simple conventions. The scripts/kernel-doc perl script, some
|
||||
SGML templates in Documentation/DocBook, and other tools understand
|
||||
these conventions, and are used to extract this embedded documentation
|
||||
into various documents.
|
||||
|
||||
In order to provide good documentation of kernel functions and data
|
||||
structures, please use the following conventions to format your
|
||||
kernel-doc comments in Linux kernel source.
|
||||
|
||||
We definitely need kernel-doc formatted documentation for functions
|
||||
that are exported to loadable modules using EXPORT_SYMBOL.
|
||||
|
||||
We also look to provide kernel-doc formatted documentation for
|
||||
functions externally visible to other kernel files (not marked
|
||||
"static").
|
||||
|
||||
We also recommend providing kernel-doc formatted documentation
|
||||
for private (file "static") routines, for consistency of kernel
|
||||
source code layout. But this is lower priority and at the
|
||||
discretion of the MAINTAINER of that kernel source file.
|
||||
|
||||
Data structures visible in kernel include files should also be
|
||||
documented using kernel-doc formatted comments.
|
||||
|
||||
The opening comment mark "/**" is reserved for kernel-doc comments.
|
||||
Only comments so marked will be considered by the kernel-doc scripts,
|
||||
and any comment so marked must be in kernel-doc format. Do not use
|
||||
"/**" to be begin a comment block unless the comment block contains
|
||||
kernel-doc formatted comments. The closing comment marker for
|
||||
kernel-doc comments can be either "*/" or "**/".
|
||||
|
||||
Kernel-doc comments should be placed just before the function
|
||||
or data structure being described.
|
||||
|
||||
Example kernel-doc function comment:
|
||||
|
||||
/**
|
||||
* foobar() - short function description of foobar
|
||||
* @arg1: Describe the first argument to foobar.
|
||||
* @arg2: Describe the second argument to foobar.
|
||||
* One can provide multiple line descriptions
|
||||
* for arguments.
|
||||
*
|
||||
* A longer description, with more discussion of the function foobar()
|
||||
* that might be useful to those using or modifying it. Begins with
|
||||
* empty comment line, and may include additional embedded empty
|
||||
* comment lines.
|
||||
*
|
||||
* The longer description can have multiple paragraphs.
|
||||
**/
|
||||
|
||||
The first line, with the short description, must be on a single line.
|
||||
|
||||
The @argument descriptions must begin on the very next line following
|
||||
this opening short function description line, with no intervening
|
||||
empty comment lines.
|
||||
|
||||
Example kernel-doc data structure comment.
|
||||
|
||||
/**
|
||||
* struct blah - the basic blah structure
|
||||
* @mem1: describe the first member of struct blah
|
||||
* @mem2: describe the second member of struct blah,
|
||||
* perhaps with more lines and words.
|
||||
*
|
||||
* Longer description of this structure.
|
||||
**/
|
||||
|
||||
The kernel-doc function comments describe each parameter to the
|
||||
function, in order, with the @name lines.
|
||||
|
||||
The kernel-doc data structure comments describe each structure member
|
||||
in the data structure, with the @name lines.
|
||||
|
||||
The longer description formatting is "reflowed", losing your line
|
||||
breaks. So presenting carefully formatted lists within these
|
||||
descriptions won't work so well; derived documentation will lose
|
||||
the formatting.
|
||||
|
||||
See the section below "How to add extractable documentation to your
|
||||
source files" for more details and notes on how to format kernel-doc
|
||||
comments.
|
||||
|
||||
Components of the kernel-doc system
|
||||
-----------------------------------
|
||||
|
||||
Many places in the source tree have extractable documentation in the
|
||||
form of block comments above functions. The components of this system
|
||||
are:
|
||||
|
|
|
@ -715,14 +715,14 @@
|
|||
|
||||
* Name: "Gary's Encyclopedia - The Linux Kernel"
|
||||
Author: Gary (I suppose...).
|
||||
URL: http://www.lisoleg.net/cgi-bin/lisoleg.pl?view=kernel.htm
|
||||
Keywords: links, not found here?.
|
||||
URL: http://slencyclopedia.berlios.de/index.html
|
||||
Keywords: linux, community, everything!
|
||||
Description: Gary's Encyclopedia exists to allow the rapid finding
|
||||
of documentation and other information of interest to GNU/Linux
|
||||
users. It has about 4000 links to external pages in 150 major
|
||||
categories. This link is for kernel-specific links, documents,
|
||||
sites... Look there if you could not find here what you were
|
||||
looking for.
|
||||
sites... This list is now hosted by developer.Berlios.de,
|
||||
but seems not to have been updated since sometime in 1999.
|
||||
|
||||
* Name: "The home page of Linux-MM"
|
||||
Author: The Linux-MM team.
|
||||
|
|
|
@ -295,7 +295,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
when initialising the APIC and IO-APIC components.
|
||||
|
||||
apm= [APM] Advanced Power Management
|
||||
See header of arch/i386/kernel/apm.c.
|
||||
See header of arch/x86/kernel/apm_32.c.
|
||||
|
||||
arcrimi= [HW,NET] ARCnet - "RIM I" (entirely mem-mapped) cards
|
||||
Format: <io>,<irq>,<nodeID>
|
||||
|
@ -398,9 +398,6 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
cio_ignore= [S390]
|
||||
See Documentation/s390/CommonIO for details.
|
||||
|
||||
cio_msg= [S390]
|
||||
See Documentation/s390/CommonIO for details.
|
||||
|
||||
clock= [BUGS=X86-32, HW] gettimeofday clocksource override.
|
||||
[Deprecated]
|
||||
Forces specified clocksource (if available) to be used
|
||||
|
@ -641,7 +638,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
|
||||
elanfreq= [X86-32]
|
||||
See comment before function elanfreq_setup() in
|
||||
arch/i386/kernel/cpu/cpufreq/elanfreq.c.
|
||||
arch/x86/kernel/cpu/cpufreq/elanfreq.c.
|
||||
|
||||
elevator= [IOSCHED]
|
||||
Format: {"anticipatory" | "cfq" | "deadline" | "noop"}
|
||||
|
@ -689,6 +686,12 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
floppy= [HW]
|
||||
See Documentation/floppy.txt.
|
||||
|
||||
force_pal_cache_flush
|
||||
[IA-64] Avoid check_sal_cache_flush which may hang on
|
||||
buggy SAL_CACHE_FLUSH implementations. Using this
|
||||
parameter will force ia64_sal_cache_flush to call
|
||||
ia64_pal_cache_flush instead of SAL_CACHE_FLUSH.
|
||||
|
||||
gamecon.map[2|3]=
|
||||
[HW,JOY] Multisystem joystick and NES/SNES/PSX pad
|
||||
support via parallel port (up to 5 devices per port)
|
||||
|
@ -1094,9 +1097,6 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
mac5380= [HW,SCSI] Format:
|
||||
<can_queue>,<cmd_per_lun>,<sg_tablesize>,<hostid>,<use_tags>
|
||||
|
||||
mac53c9x= [HW,SCSI] Format:
|
||||
<num_esps>,<disconnect>,<nosync>,<can_queue>,<cmd_per_lun>,<sg_tablesize>,<hostid>,<use_tags>
|
||||
|
||||
machvec= [IA64] Force the use of a particular machine-vector
|
||||
(machvec) in a generic kernel.
|
||||
Example: machvec=hpzx1_swiotlb
|
||||
|
@ -1525,6 +1525,8 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
This is normally done in pci_enable_device(),
|
||||
so this option is a temporary workaround
|
||||
for broken drivers that don't call it.
|
||||
skip_isa_align [X86] do not align io start addr, so can
|
||||
handle more pci cards
|
||||
firmware [ARM] Do not re-enumerate the bus but instead
|
||||
just use the configuration from the
|
||||
bootloader. This is currently used on
|
||||
|
@ -1677,6 +1679,10 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
Format: <reboot_mode>[,<reboot_mode2>[,...]]
|
||||
See arch/*/kernel/reboot.c or arch/*/kernel/process.c
|
||||
|
||||
relax_domain_level=
|
||||
[KNL, SMP] Set scheduler's default relax_domain_level.
|
||||
See Documentation/cpusets.txt.
|
||||
|
||||
reserve= [KNL,BUGS] Force the kernel to ignore some iomem area
|
||||
|
||||
reservetop= [X86-32]
|
||||
|
|
|
@ -305,7 +305,7 @@ should not be manipulated by any other user.
|
|||
|
||||
A kset keeps its children in a standard kernel linked list. Kobjects point
|
||||
back to their containing kset via their kset field. In almost all cases,
|
||||
the kobjects belonging to a ket have that kset (or, strictly, its embedded
|
||||
the kobjects belonging to a kset have that kset (or, strictly, its embedded
|
||||
kobject) in their parent.
|
||||
|
||||
As a kset contains a kobject within it, it should always be dynamically
|
||||
|
|
|
@ -503,7 +503,7 @@ generate input device EV_KEY events.
|
|||
In addition to the EV_KEY events, thinkpad-acpi may also issue EV_SW
|
||||
events for switches:
|
||||
|
||||
SW_RADIO T60 and later hardare rfkill rocker switch
|
||||
SW_RFKILL_ALL T60 and later hardare rfkill rocker switch
|
||||
SW_TABLET_MODE Tablet ThinkPads HKEY events 0x5009 and 0x500A
|
||||
|
||||
Non hot-key ACPI HKEY event map:
|
||||
|
|
|
@ -131,6 +131,9 @@ struct device
|
|||
/* Any queues attached to this device */
|
||||
struct virtqueue *vq;
|
||||
|
||||
/* Handle status being finalized (ie. feature bits stable). */
|
||||
void (*ready)(struct device *me);
|
||||
|
||||
/* Device-specific data. */
|
||||
void *priv;
|
||||
};
|
||||
|
@ -154,6 +157,9 @@ struct virtqueue
|
|||
|
||||
/* The routine to call when the Guest pings us. */
|
||||
void (*handle_output)(int fd, struct virtqueue *me);
|
||||
|
||||
/* Outstanding buffers */
|
||||
unsigned int inflight;
|
||||
};
|
||||
|
||||
/* Remember the arguments to the program so we can "reboot" */
|
||||
|
@ -699,6 +705,7 @@ static unsigned get_vq_desc(struct virtqueue *vq,
|
|||
errx(1, "Looped descriptor");
|
||||
} while ((i = next_desc(vq, i)) != vq->vring.num);
|
||||
|
||||
vq->inflight++;
|
||||
return head;
|
||||
}
|
||||
|
||||
|
@ -716,6 +723,7 @@ static void add_used(struct virtqueue *vq, unsigned int head, int len)
|
|||
/* Make sure buffer is written before we update index. */
|
||||
wmb();
|
||||
vq->vring.used->idx++;
|
||||
vq->inflight--;
|
||||
}
|
||||
|
||||
/* This actually sends the interrupt for this virtqueue */
|
||||
|
@ -723,8 +731,9 @@ static void trigger_irq(int fd, struct virtqueue *vq)
|
|||
{
|
||||
unsigned long buf[] = { LHREQ_IRQ, vq->config.irq };
|
||||
|
||||
/* If they don't want an interrupt, don't send one. */
|
||||
if (vq->vring.avail->flags & VRING_AVAIL_F_NO_INTERRUPT)
|
||||
/* If they don't want an interrupt, don't send one, unless empty. */
|
||||
if ((vq->vring.avail->flags & VRING_AVAIL_F_NO_INTERRUPT)
|
||||
&& vq->inflight)
|
||||
return;
|
||||
|
||||
/* Send the Guest an interrupt tell them we used something up. */
|
||||
|
@ -925,24 +934,40 @@ static void enable_fd(int fd, struct virtqueue *vq)
|
|||
write(waker_fd, &vq->dev->fd, sizeof(vq->dev->fd));
|
||||
}
|
||||
|
||||
/* When the Guest asks us to reset a device, it's is fairly easy. */
|
||||
static void reset_device(struct device *dev)
|
||||
/* When the Guest tells us they updated the status field, we handle it. */
|
||||
static void update_device_status(struct device *dev)
|
||||
{
|
||||
struct virtqueue *vq;
|
||||
|
||||
verbose("Resetting device %s\n", dev->name);
|
||||
/* Clear the status. */
|
||||
dev->desc->status = 0;
|
||||
/* This is a reset. */
|
||||
if (dev->desc->status == 0) {
|
||||
verbose("Resetting device %s\n", dev->name);
|
||||
|
||||
/* Clear any features they've acked. */
|
||||
memset(get_feature_bits(dev) + dev->desc->feature_len, 0,
|
||||
dev->desc->feature_len);
|
||||
/* Clear any features they've acked. */
|
||||
memset(get_feature_bits(dev) + dev->desc->feature_len, 0,
|
||||
dev->desc->feature_len);
|
||||
|
||||
/* Zero out the virtqueues. */
|
||||
for (vq = dev->vq; vq; vq = vq->next) {
|
||||
memset(vq->vring.desc, 0,
|
||||
vring_size(vq->config.num, getpagesize()));
|
||||
vq->last_avail_idx = 0;
|
||||
/* Zero out the virtqueues. */
|
||||
for (vq = dev->vq; vq; vq = vq->next) {
|
||||
memset(vq->vring.desc, 0,
|
||||
vring_size(vq->config.num, getpagesize()));
|
||||
vq->last_avail_idx = 0;
|
||||
}
|
||||
} else if (dev->desc->status & VIRTIO_CONFIG_S_FAILED) {
|
||||
warnx("Device %s configuration FAILED", dev->name);
|
||||
} else if (dev->desc->status & VIRTIO_CONFIG_S_DRIVER_OK) {
|
||||
unsigned int i;
|
||||
|
||||
verbose("Device %s OK: offered", dev->name);
|
||||
for (i = 0; i < dev->desc->feature_len; i++)
|
||||
verbose(" %08x", get_feature_bits(dev)[i]);
|
||||
verbose(", accepted");
|
||||
for (i = 0; i < dev->desc->feature_len; i++)
|
||||
verbose(" %08x", get_feature_bits(dev)
|
||||
[dev->desc->feature_len+i]);
|
||||
|
||||
if (dev->ready)
|
||||
dev->ready(dev);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -954,9 +979,9 @@ static void handle_output(int fd, unsigned long addr)
|
|||
|
||||
/* Check each device and virtqueue. */
|
||||
for (i = devices.dev; i; i = i->next) {
|
||||
/* Notifications to device descriptors reset the device. */
|
||||
/* Notifications to device descriptors update device status. */
|
||||
if (from_guest_phys(addr) == i->desc) {
|
||||
reset_device(i);
|
||||
update_device_status(i);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1088,6 +1113,7 @@ static void add_virtqueue(struct device *dev, unsigned int num_descs,
|
|||
vq->next = NULL;
|
||||
vq->last_avail_idx = 0;
|
||||
vq->dev = dev;
|
||||
vq->inflight = 0;
|
||||
|
||||
/* Initialize the configuration. */
|
||||
vq->config.num = num_descs;
|
||||
|
@ -1170,6 +1196,7 @@ static struct device *new_device(const char *name, u16 type, int fd,
|
|||
dev->handle_input = handle_input;
|
||||
dev->name = name;
|
||||
dev->vq = NULL;
|
||||
dev->ready = NULL;
|
||||
|
||||
/* Append to device list. Prepending to a single-linked list is
|
||||
* easier, but the user expects the devices to be arranged on the bus
|
||||
|
@ -1348,6 +1375,7 @@ static void setup_tun_net(const char *arg)
|
|||
|
||||
/* Tell Guest what MAC address to use. */
|
||||
add_feature(dev, VIRTIO_NET_F_MAC);
|
||||
add_feature(dev, VIRTIO_F_NOTIFY_ON_EMPTY);
|
||||
set_config(dev, sizeof(conf), &conf);
|
||||
|
||||
/* We don't need the socket any more; setup is done. */
|
||||
|
@ -1398,7 +1426,7 @@ static bool service_io(struct device *dev)
|
|||
struct vblk_info *vblk = dev->priv;
|
||||
unsigned int head, out_num, in_num, wlen;
|
||||
int ret;
|
||||
struct virtio_blk_inhdr *in;
|
||||
u8 *in;
|
||||
struct virtio_blk_outhdr *out;
|
||||
struct iovec iov[dev->vq->vring.num];
|
||||
off64_t off;
|
||||
|
@ -1416,7 +1444,7 @@ static bool service_io(struct device *dev)
|
|||
head, out_num, in_num);
|
||||
|
||||
out = convert(&iov[0], struct virtio_blk_outhdr);
|
||||
in = convert(&iov[out_num+in_num-1], struct virtio_blk_inhdr);
|
||||
in = convert(&iov[out_num+in_num-1], u8);
|
||||
off = out->sector * 512;
|
||||
|
||||
/* The block device implements "barriers", where the Guest indicates
|
||||
|
@ -1430,7 +1458,7 @@ static bool service_io(struct device *dev)
|
|||
* It'd be nice if we supported eject, for example, but we don't. */
|
||||
if (out->type & VIRTIO_BLK_T_SCSI_CMD) {
|
||||
fprintf(stderr, "Scsi commands unsupported\n");
|
||||
in->status = VIRTIO_BLK_S_UNSUPP;
|
||||
*in = VIRTIO_BLK_S_UNSUPP;
|
||||
wlen = sizeof(*in);
|
||||
} else if (out->type & VIRTIO_BLK_T_OUT) {
|
||||
/* Write */
|
||||
|
@ -1453,7 +1481,7 @@ static bool service_io(struct device *dev)
|
|||
errx(1, "Write past end %llu+%u", off, ret);
|
||||
}
|
||||
wlen = sizeof(*in);
|
||||
in->status = (ret >= 0 ? VIRTIO_BLK_S_OK : VIRTIO_BLK_S_IOERR);
|
||||
*in = (ret >= 0 ? VIRTIO_BLK_S_OK : VIRTIO_BLK_S_IOERR);
|
||||
} else {
|
||||
/* Read */
|
||||
|
||||
|
@ -1466,10 +1494,10 @@ static bool service_io(struct device *dev)
|
|||
verbose("READ from sector %llu: %i\n", out->sector, ret);
|
||||
if (ret >= 0) {
|
||||
wlen = sizeof(*in) + ret;
|
||||
in->status = VIRTIO_BLK_S_OK;
|
||||
*in = VIRTIO_BLK_S_OK;
|
||||
} else {
|
||||
wlen = sizeof(*in);
|
||||
in->status = VIRTIO_BLK_S_IOERR;
|
||||
*in = VIRTIO_BLK_S_IOERR;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -994,7 +994,17 @@ The Linux kernel has eight basic CPU memory barriers:
|
|||
DATA DEPENDENCY read_barrier_depends() smp_read_barrier_depends()
|
||||
|
||||
|
||||
All CPU memory barriers unconditionally imply compiler barriers.
|
||||
All memory barriers except the data dependency barriers imply a compiler
|
||||
barrier. Data dependencies do not impose any additional compiler ordering.
|
||||
|
||||
Aside: In the case of data dependencies, the compiler would be expected to
|
||||
issue the loads in the correct order (eg. `a[b]` would have to load the value
|
||||
of b before loading a[b]), however there is no guarantee in the C specification
|
||||
that the compiler may not speculate the value of b (eg. is equal to 1) and load
|
||||
a before b (eg. tmp = a[1]; if (b != 1) tmp = a[b]; ). There is also the
|
||||
problem of a compiler reloading b after having loaded a[b], thus having a newer
|
||||
copy of b than a[b]. A consensus has not yet been reached about these problems,
|
||||
however the ACCESS_ONCE macro is a good place to start looking.
|
||||
|
||||
SMP memory barriers are reduced to compiler barriers on uniprocessor compiled
|
||||
systems because it is assumed that a CPU will appear to be self-consistent,
|
||||
|
|
|
@ -46,7 +46,7 @@ These are the ARCnet drivers for Linux.
|
|||
|
||||
|
||||
This new release (2.91) has been put together by David Woodhouse
|
||||
<dwmw2@cam.ac.uk>, in an attempt to tidy up the driver after adding support
|
||||
<dwmw2@infradead.org>, in an attempt to tidy up the driver after adding support
|
||||
for yet another chipset. Now the generic support has been separated from the
|
||||
individual chipset drivers, and the source files aren't quite so packed with
|
||||
#ifdefs! I've changed this file a bit, but kept it in the first person from
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
In order to use the Ethernet bridging functionality, you'll need the
|
||||
userspace tools. These programs and documentation are available
|
||||
at http://bridge.sourceforge.net. The download page is
|
||||
at http://www.linux-foundation.org/en/Net:Bridge. The download page is
|
||||
http://prdownloads.sourceforge.net/bridge.
|
||||
|
||||
If you still have questions, don't hesitate to post to the mailing list
|
||||
|
|
|
@ -81,23 +81,23 @@ inet_peer_minttl - INTEGER
|
|||
Minimum time-to-live of entries. Should be enough to cover fragment
|
||||
time-to-live on the reassembling side. This minimum time-to-live is
|
||||
guaranteed if the pool size is less than inet_peer_threshold.
|
||||
Measured in jiffies(1).
|
||||
Measured in seconds.
|
||||
|
||||
inet_peer_maxttl - INTEGER
|
||||
Maximum time-to-live of entries. Unused entries will expire after
|
||||
this period of time if there is no memory pressure on the pool (i.e.
|
||||
when the number of entries in the pool is very small).
|
||||
Measured in jiffies(1).
|
||||
Measured in seconds.
|
||||
|
||||
inet_peer_gc_mintime - INTEGER
|
||||
Minimum interval between garbage collection passes. This interval is
|
||||
in effect under high memory pressure on the pool.
|
||||
Measured in jiffies(1).
|
||||
Measured in seconds.
|
||||
|
||||
inet_peer_gc_maxtime - INTEGER
|
||||
Minimum interval between garbage collection passes. This interval is
|
||||
in effect under low (or absent) memory pressure on the pool.
|
||||
Measured in jiffies(1).
|
||||
Measured in seconds.
|
||||
|
||||
TCP variables:
|
||||
|
||||
|
@ -148,9 +148,9 @@ tcp_available_congestion_control - STRING
|
|||
but not loaded.
|
||||
|
||||
tcp_base_mss - INTEGER
|
||||
The initial value of search_low to be used by Packetization Layer
|
||||
Path MTU Discovery (MTU probing). If MTU probing is enabled,
|
||||
this is the inital MSS used by the connection.
|
||||
The initial value of search_low to be used by the packetization layer
|
||||
Path MTU discovery (MTU probing). If MTU probing is enabled,
|
||||
this is the initial MSS used by the connection.
|
||||
|
||||
tcp_congestion_control - STRING
|
||||
Set the congestion control algorithm to be used for new
|
||||
|
@ -185,10 +185,9 @@ tcp_frto - INTEGER
|
|||
timeouts. It is particularly beneficial in wireless environments
|
||||
where packet loss is typically due to random radio interference
|
||||
rather than intermediate router congestion. F-RTO is sender-side
|
||||
only modification. Therefore it does not require any support from
|
||||
the peer, but in a typical case, however, where wireless link is
|
||||
the local access link and most of the data flows downlink, the
|
||||
faraway servers should have F-RTO enabled to take advantage of it.
|
||||
only modification. Therefore it does not require any support from
|
||||
the peer.
|
||||
|
||||
If set to 1, basic version is enabled. 2 enables SACK enhanced
|
||||
F-RTO if flow uses SACK. The basic version can be used also when
|
||||
SACK is in use though scenario(s) with it exists where F-RTO
|
||||
|
@ -276,7 +275,7 @@ tcp_mem - vector of 3 INTEGERs: min, pressure, max
|
|||
memory.
|
||||
|
||||
tcp_moderate_rcvbuf - BOOLEAN
|
||||
If set, TCP performs receive buffer autotuning, attempting to
|
||||
If set, TCP performs receive buffer auto-tuning, attempting to
|
||||
automatically size the buffer (no greater than tcp_rmem[2]) to
|
||||
match the size required by the path for full throughput. Enabled by
|
||||
default.
|
||||
|
@ -336,7 +335,7 @@ tcp_rmem - vector of 3 INTEGERs: min, default, max
|
|||
pressure.
|
||||
Default: 8K
|
||||
|
||||
default: default size of receive buffer used by TCP sockets.
|
||||
default: initial size of receive buffer used by TCP sockets.
|
||||
This value overrides net.core.rmem_default used by other protocols.
|
||||
Default: 87380 bytes. This value results in window of 65535 with
|
||||
default setting of tcp_adv_win_scale and tcp_app_win:0 and a bit
|
||||
|
@ -344,8 +343,10 @@ tcp_rmem - vector of 3 INTEGERs: min, default, max
|
|||
|
||||
max: maximal size of receive buffer allowed for automatically
|
||||
selected receiver buffers for TCP socket. This value does not override
|
||||
net.core.rmem_max, "static" selection via SO_RCVBUF does not use this.
|
||||
Default: 87380*2 bytes.
|
||||
net.core.rmem_max. Calling setsockopt() with SO_RCVBUF disables
|
||||
automatic tuning of that socket's receive buffer size, in which
|
||||
case this value is ignored.
|
||||
Default: between 87380B and 4MB, depending on RAM size.
|
||||
|
||||
tcp_sack - BOOLEAN
|
||||
Enable select acknowledgments (SACKS).
|
||||
|
@ -358,7 +359,7 @@ tcp_slow_start_after_idle - BOOLEAN
|
|||
Default: 1
|
||||
|
||||
tcp_stdurg - BOOLEAN
|
||||
Use the Host requirements interpretation of the TCP urg pointer field.
|
||||
Use the Host requirements interpretation of the TCP urgent pointer field.
|
||||
Most hosts use the older BSD interpretation, so if you turn this on
|
||||
Linux might not communicate correctly with them.
|
||||
Default: FALSE
|
||||
|
@ -371,12 +372,12 @@ tcp_synack_retries - INTEGER
|
|||
tcp_syncookies - BOOLEAN
|
||||
Only valid when the kernel was compiled with CONFIG_SYNCOOKIES
|
||||
Send out syncookies when the syn backlog queue of a socket
|
||||
overflows. This is to prevent against the common 'syn flood attack'
|
||||
overflows. This is to prevent against the common 'SYN flood attack'
|
||||
Default: FALSE
|
||||
|
||||
Note, that syncookies is fallback facility.
|
||||
It MUST NOT be used to help highly loaded servers to stand
|
||||
against legal connection rate. If you see synflood warnings
|
||||
against legal connection rate. If you see SYN flood warnings
|
||||
in your logs, but investigation shows that they occur
|
||||
because of overload with legal connections, you should tune
|
||||
another parameters until this warning disappear.
|
||||
|
@ -386,7 +387,7 @@ tcp_syncookies - BOOLEAN
|
|||
to use TCP extensions, can result in serious degradation
|
||||
of some services (f.e. SMTP relaying), visible not by you,
|
||||
but your clients and relays, contacting you. While you see
|
||||
synflood warnings in logs not being really flooded, your server
|
||||
SYN flood warnings in logs not being really flooded, your server
|
||||
is seriously misconfigured.
|
||||
|
||||
tcp_syn_retries - INTEGER
|
||||
|
@ -419,19 +420,21 @@ tcp_window_scaling - BOOLEAN
|
|||
Enable window scaling as defined in RFC1323.
|
||||
|
||||
tcp_wmem - vector of 3 INTEGERs: min, default, max
|
||||
min: Amount of memory reserved for send buffers for TCP socket.
|
||||
min: Amount of memory reserved for send buffers for TCP sockets.
|
||||
Each TCP socket has rights to use it due to fact of its birth.
|
||||
Default: 4K
|
||||
|
||||
default: Amount of memory allowed for send buffers for TCP socket
|
||||
by default. This value overrides net.core.wmem_default used
|
||||
by other protocols, it is usually lower than net.core.wmem_default.
|
||||
default: initial size of send buffer used by TCP sockets. This
|
||||
value overrides net.core.wmem_default used by other protocols.
|
||||
It is usually lower than net.core.wmem_default.
|
||||
Default: 16K
|
||||
|
||||
max: Maximal amount of memory allowed for automatically selected
|
||||
send buffers for TCP socket. This value does not override
|
||||
net.core.wmem_max, "static" selection via SO_SNDBUF does not use this.
|
||||
Default: 128K
|
||||
max: Maximal amount of memory allowed for automatically tuned
|
||||
send buffers for TCP sockets. This value does not override
|
||||
net.core.wmem_max. Calling setsockopt() with SO_SNDBUF disables
|
||||
automatic tuning of that socket's send buffer size, in which case
|
||||
this value is ignored.
|
||||
Default: between 64K and 4MB, depending on RAM size.
|
||||
|
||||
tcp_workaround_signed_windows - BOOLEAN
|
||||
If set, assume no receipt of a window scaling option means the
|
||||
|
@ -794,10 +797,6 @@ tag - INTEGER
|
|||
Allows you to write a number, which can be used as required.
|
||||
Default value is 0.
|
||||
|
||||
(1) Jiffie: internal timeunit for the kernel. On the i386 1/100s, on the
|
||||
Alpha 1/1024s. See the HZ define in /usr/include/asm/param.h for the exact
|
||||
value on your system.
|
||||
|
||||
Alexey Kuznetsov.
|
||||
kuznet@ms2.inr.ac.ru
|
||||
|
||||
|
@ -1064,24 +1063,193 @@ bridge-nf-filter-pppoe-tagged - BOOLEAN
|
|||
Default: 1
|
||||
|
||||
|
||||
proc/sys/net/sctp/* Variables:
|
||||
|
||||
addip_enable - BOOLEAN
|
||||
Enable or disable extension of Dynamic Address Reconfiguration
|
||||
(ADD-IP) functionality specified in RFC5061. This extension provides
|
||||
the ability to dynamically add and remove new addresses for the SCTP
|
||||
associations.
|
||||
|
||||
1: Enable extension.
|
||||
|
||||
0: Disable extension.
|
||||
|
||||
Default: 0
|
||||
|
||||
addip_noauth_enable - BOOLEAN
|
||||
Dynamic Address Reconfiguration (ADD-IP) requires the use of
|
||||
authentication to protect the operations of adding or removing new
|
||||
addresses. This requirement is mandated so that unauthorized hosts
|
||||
would not be able to hijack associations. However, older
|
||||
implementations may not have implemented this requirement while
|
||||
allowing the ADD-IP extension. For reasons of interoperability,
|
||||
we provide this variable to control the enforcement of the
|
||||
authentication requirement.
|
||||
|
||||
1: Allow ADD-IP extension to be used without authentication. This
|
||||
should only be set in a closed environment for interoperability
|
||||
with older implementations.
|
||||
|
||||
0: Enforce the authentication requirement
|
||||
|
||||
Default: 0
|
||||
|
||||
auth_enable - BOOLEAN
|
||||
Enable or disable Authenticated Chunks extension. This extension
|
||||
provides the ability to send and receive authenticated chunks and is
|
||||
required for secure operation of Dynamic Address Reconfiguration
|
||||
(ADD-IP) extension.
|
||||
|
||||
1: Enable this extension.
|
||||
0: Disable this extension.
|
||||
|
||||
Default: 0
|
||||
|
||||
prsctp_enable - BOOLEAN
|
||||
Enable or disable the Partial Reliability extension (RFC3758) which
|
||||
is used to notify peers that a given DATA should no longer be expected.
|
||||
|
||||
1: Enable extension
|
||||
0: Disable
|
||||
|
||||
Default: 1
|
||||
|
||||
max_burst - INTEGER
|
||||
The limit of the number of new packets that can be initially sent. It
|
||||
controls how bursty the generated traffic can be.
|
||||
|
||||
Default: 4
|
||||
|
||||
association_max_retrans - INTEGER
|
||||
Set the maximum number for retransmissions that an association can
|
||||
attempt deciding that the remote end is unreachable. If this value
|
||||
is exceeded, the association is terminated.
|
||||
|
||||
Default: 10
|
||||
|
||||
max_init_retransmits - INTEGER
|
||||
The maximum number of retransmissions of INIT and COOKIE-ECHO chunks
|
||||
that an association will attempt before declaring the destination
|
||||
unreachable and terminating.
|
||||
|
||||
Default: 8
|
||||
|
||||
path_max_retrans - INTEGER
|
||||
The maximum number of retransmissions that will be attempted on a given
|
||||
path. Once this threshold is exceeded, the path is considered
|
||||
unreachable, and new traffic will use a different path when the
|
||||
association is multihomed.
|
||||
|
||||
Default: 5
|
||||
|
||||
rto_initial - INTEGER
|
||||
The initial round trip timeout value in milliseconds that will be used
|
||||
in calculating round trip times. This is the initial time interval
|
||||
for retransmissions.
|
||||
|
||||
Default: 3000
|
||||
|
||||
rto_max - INTEGER
|
||||
The maximum value (in milliseconds) of the round trip timeout. This
|
||||
is the largest time interval that can elapse between retransmissions.
|
||||
|
||||
Default: 60000
|
||||
|
||||
rto_min - INTEGER
|
||||
The minimum value (in milliseconds) of the round trip timeout. This
|
||||
is the smallest time interval the can elapse between retransmissions.
|
||||
|
||||
Default: 1000
|
||||
|
||||
hb_interval - INTEGER
|
||||
The interval (in milliseconds) between HEARTBEAT chunks. These chunks
|
||||
are sent at the specified interval on idle paths to probe the state of
|
||||
a given path between 2 associations.
|
||||
|
||||
Default: 30000
|
||||
|
||||
sack_timeout - INTEGER
|
||||
The amount of time (in milliseconds) that the implementation will wait
|
||||
to send a SACK.
|
||||
|
||||
Default: 200
|
||||
|
||||
valid_cookie_life - INTEGER
|
||||
The default lifetime of the SCTP cookie (in milliseconds). The cookie
|
||||
is used during association establishment.
|
||||
|
||||
Default: 60000
|
||||
|
||||
cookie_preserve_enable - BOOLEAN
|
||||
Enable or disable the ability to extend the lifetime of the SCTP cookie
|
||||
that is used during the establishment phase of SCTP association
|
||||
|
||||
1: Enable cookie lifetime extension.
|
||||
0: Disable
|
||||
|
||||
Default: 1
|
||||
|
||||
rcvbuf_policy - INTEGER
|
||||
Determines if the receive buffer is attributed to the socket or to
|
||||
association. SCTP supports the capability to create multiple
|
||||
associations on a single socket. When using this capability, it is
|
||||
possible that a single stalled association that's buffering a lot
|
||||
of data may block other associations from delivering their data by
|
||||
consuming all of the receive buffer space. To work around this,
|
||||
the rcvbuf_policy could be set to attribute the receiver buffer space
|
||||
to each association instead of the socket. This prevents the described
|
||||
blocking.
|
||||
|
||||
1: rcvbuf space is per association
|
||||
0: recbuf space is per socket
|
||||
|
||||
Default: 0
|
||||
|
||||
sndbuf_policy - INTEGER
|
||||
Similar to rcvbuf_policy above, this applies to send buffer space.
|
||||
|
||||
1: Send buffer is tracked per association
|
||||
0: Send buffer is tracked per socket.
|
||||
|
||||
Default: 0
|
||||
|
||||
sctp_mem - vector of 3 INTEGERs: min, pressure, max
|
||||
Number of pages allowed for queueing by all SCTP sockets.
|
||||
|
||||
min: Below this number of pages SCTP is not bothered about its
|
||||
memory appetite. When amount of memory allocated by SCTP exceeds
|
||||
this number, SCTP starts to moderate memory usage.
|
||||
|
||||
pressure: This value was introduced to follow format of tcp_mem.
|
||||
|
||||
max: Number of pages allowed for queueing by all SCTP sockets.
|
||||
|
||||
Default is calculated at boot time from amount of available memory.
|
||||
|
||||
sctp_rmem - vector of 3 INTEGERs: min, default, max
|
||||
See tcp_rmem for a description.
|
||||
|
||||
sctp_wmem - vector of 3 INTEGERs: min, default, max
|
||||
See tcp_wmem for a description.
|
||||
|
||||
UNDOCUMENTED:
|
||||
|
||||
dev_weight FIXME
|
||||
discovery_slots FIXME
|
||||
discovery_timeout FIXME
|
||||
fast_poll_increase FIXME
|
||||
ip6_queue_maxlen FIXME
|
||||
lap_keepalive_time FIXME
|
||||
lo_cong FIXME
|
||||
max_baud_rate FIXME
|
||||
max_dgram_qlen FIXME
|
||||
max_noreply_time FIXME
|
||||
max_tx_data_size FIXME
|
||||
max_tx_window FIXME
|
||||
min_tx_turn_time FIXME
|
||||
mod_cong FIXME
|
||||
no_cong FIXME
|
||||
no_cong_thresh FIXME
|
||||
slot_timeout FIXME
|
||||
warn_noreply_time FIXME
|
||||
/proc/sys/net/core/*
|
||||
dev_weight FIXME
|
||||
|
||||
/proc/sys/net/unix/*
|
||||
max_dgram_qlen FIXME
|
||||
|
||||
/proc/sys/net/irda/*
|
||||
fast_poll_increase FIXME
|
||||
warn_noreply_time FIXME
|
||||
discovery_slots FIXME
|
||||
slot_timeout FIXME
|
||||
max_baud_rate FIXME
|
||||
discovery_timeout FIXME
|
||||
lap_keepalive_time FIXME
|
||||
max_noreply_time FIXME
|
||||
max_tx_data_size FIXME
|
||||
max_tx_window FIXME
|
||||
min_tx_turn_time FIXME
|
||||
|
|
|
@ -83,9 +83,9 @@ Valid range: Limited by memory on system
|
|||
Default: 30
|
||||
|
||||
e. intr_type
|
||||
Specifies interrupt type. Possible values 1(INTA), 2(MSI), 3(MSI-X)
|
||||
Valid range: 1-3
|
||||
Default: 1
|
||||
Specifies interrupt type. Possible values 0(INTA), 2(MSI-X)
|
||||
Valid values: 0, 2
|
||||
Default: 2
|
||||
|
||||
5. Performance suggestions
|
||||
General:
|
||||
|
|
|
@ -237,6 +237,17 @@ Each GPIO controller node should have the empty property gpio-controller and
|
|||
according to the bit numbers in the GPIO control registers. The second cell
|
||||
is for flags which is currently unsused.
|
||||
|
||||
8) FEC nodes
|
||||
The FEC node can specify one of the following properties to configure
|
||||
the MII link:
|
||||
"fsl,7-wire-mode" - An empty property that specifies the link uses 7-wire
|
||||
mode instead of MII
|
||||
"current-speed" - Specifies that the MII should be configured for a fixed
|
||||
speed. This property should contain two cells. The
|
||||
first cell specifies the speed in Mbps and the second
|
||||
should be '0' for half duplex and '1' for full duplex
|
||||
"phy-handle" - Contains a phandle to an Ethernet PHY.
|
||||
|
||||
IV - Extra Notes
|
||||
================
|
||||
|
||||
|
|
|
@ -8,17 +8,6 @@ Command line parameters
|
|||
|
||||
Enable logging of debug information in case of ccw device timeouts.
|
||||
|
||||
|
||||
* cio_msg = yes | no
|
||||
|
||||
Determines whether information on found devices and sensed device
|
||||
characteristics should be shown during startup or when new devices are
|
||||
found, i. e. messages of the types "Detected device 0.0.4711 on subchannel
|
||||
0.0.0042" and "SenseID: Device 0.0.4711 reports: ...".
|
||||
|
||||
Default is off.
|
||||
|
||||
|
||||
* cio_ignore = {all} |
|
||||
{<device> | <range of devices>} |
|
||||
{!<device> | !<range of devices>}
|
||||
|
|
|
@ -1,165 +0,0 @@
|
|||
Goals, Design and Implementation of the
|
||||
new ultra-scalable O(1) scheduler
|
||||
|
||||
|
||||
This is an edited version of an email Ingo Molnar sent to
|
||||
lkml on 4 Jan 2002. It describes the goals, design, and
|
||||
implementation of Ingo's new ultra-scalable O(1) scheduler.
|
||||
Last Updated: 18 April 2002.
|
||||
|
||||
|
||||
Goal
|
||||
====
|
||||
|
||||
The main goal of the new scheduler is to keep all the good things we know
|
||||
and love about the current Linux scheduler:
|
||||
|
||||
- good interactive performance even during high load: if the user
|
||||
types or clicks then the system must react instantly and must execute
|
||||
the user tasks smoothly, even during considerable background load.
|
||||
|
||||
- good scheduling/wakeup performance with 1-2 runnable processes.
|
||||
|
||||
- fairness: no process should stay without any timeslice for any
|
||||
unreasonable amount of time. No process should get an unjustly high
|
||||
amount of CPU time.
|
||||
|
||||
- priorities: less important tasks can be started with lower priority,
|
||||
more important tasks with higher priority.
|
||||
|
||||
- SMP efficiency: no CPU should stay idle if there is work to do.
|
||||
|
||||
- SMP affinity: processes which run on one CPU should stay affine to
|
||||
that CPU. Processes should not bounce between CPUs too frequently.
|
||||
|
||||
- plus additional scheduler features: RT scheduling, CPU binding.
|
||||
|
||||
and the goal is also to add a few new things:
|
||||
|
||||
- fully O(1) scheduling. Are you tired of the recalculation loop
|
||||
blowing the L1 cache away every now and then? Do you think the goodness
|
||||
loop is taking a bit too long to finish if there are lots of runnable
|
||||
processes? This new scheduler takes no prisoners: wakeup(), schedule(),
|
||||
the timer interrupt are all O(1) algorithms. There is no recalculation
|
||||
loop. There is no goodness loop either.
|
||||
|
||||
- 'perfect' SMP scalability. With the new scheduler there is no 'big'
|
||||
runqueue_lock anymore - it's all per-CPU runqueues and locks - two
|
||||
tasks on two separate CPUs can wake up, schedule and context-switch
|
||||
completely in parallel, without any interlocking. All
|
||||
scheduling-relevant data is structured for maximum scalability.
|
||||
|
||||
- better SMP affinity. The old scheduler has a particular weakness that
|
||||
causes the random bouncing of tasks between CPUs if/when higher
|
||||
priority/interactive tasks, this was observed and reported by many
|
||||
people. The reason is that the timeslice recalculation loop first needs
|
||||
every currently running task to consume its timeslice. But when this
|
||||
happens on eg. an 8-way system, then this property starves an
|
||||
increasing number of CPUs from executing any process. Once the last
|
||||
task that has a timeslice left has finished using up that timeslice,
|
||||
the recalculation loop is triggered and other CPUs can start executing
|
||||
tasks again - after having idled around for a number of timer ticks.
|
||||
The more CPUs, the worse this effect.
|
||||
|
||||
Furthermore, this same effect causes the bouncing effect as well:
|
||||
whenever there is such a 'timeslice squeeze' of the global runqueue,
|
||||
idle processors start executing tasks which are not affine to that CPU.
|
||||
(because the affine tasks have finished off their timeslices already.)
|
||||
|
||||
The new scheduler solves this problem by distributing timeslices on a
|
||||
per-CPU basis, without having any global synchronization or
|
||||
recalculation.
|
||||
|
||||
- batch scheduling. A significant proportion of computing-intensive tasks
|
||||
benefit from batch-scheduling, where timeslices are long and processes
|
||||
are roundrobin scheduled. The new scheduler does such batch-scheduling
|
||||
of the lowest priority tasks - so nice +19 jobs will get
|
||||
'batch-scheduled' automatically. With this scheduler, nice +19 jobs are
|
||||
in essence SCHED_IDLE, from an interactiveness point of view.
|
||||
|
||||
- handle extreme loads more smoothly, without breakdown and scheduling
|
||||
storms.
|
||||
|
||||
- O(1) RT scheduling. For those RT folks who are paranoid about the
|
||||
O(nr_running) property of the goodness loop and the recalculation loop.
|
||||
|
||||
- run fork()ed children before the parent. Andrea has pointed out the
|
||||
advantages of this a few months ago, but patches for this feature
|
||||
do not work with the old scheduler as well as they should,
|
||||
because idle processes often steal the new child before the fork()ing
|
||||
CPU gets to execute it.
|
||||
|
||||
|
||||
Design
|
||||
======
|
||||
|
||||
The core of the new scheduler contains the following mechanisms:
|
||||
|
||||
- *two* priority-ordered 'priority arrays' per CPU. There is an 'active'
|
||||
array and an 'expired' array. The active array contains all tasks that
|
||||
are affine to this CPU and have timeslices left. The expired array
|
||||
contains all tasks which have used up their timeslices - but this array
|
||||
is kept sorted as well. The active and expired array is not accessed
|
||||
directly, it's accessed through two pointers in the per-CPU runqueue
|
||||
structure. If all active tasks are used up then we 'switch' the two
|
||||
pointers and from now on the ready-to-go (former-) expired array is the
|
||||
active array - and the empty active array serves as the new collector
|
||||
for expired tasks.
|
||||
|
||||
- there is a 64-bit bitmap cache for array indices. Finding the highest
|
||||
priority task is thus a matter of two x86 BSFL bit-search instructions.
|
||||
|
||||
the split-array solution enables us to have an arbitrary number of active
|
||||
and expired tasks, and the recalculation of timeslices can be done
|
||||
immediately when the timeslice expires. Because the arrays are always
|
||||
access through the pointers in the runqueue, switching the two arrays can
|
||||
be done very quickly.
|
||||
|
||||
this is a hybride priority-list approach coupled with roundrobin
|
||||
scheduling and the array-switch method of distributing timeslices.
|
||||
|
||||
- there is a per-task 'load estimator'.
|
||||
|
||||
one of the toughest things to get right is good interactive feel during
|
||||
heavy system load. While playing with various scheduler variants i found
|
||||
that the best interactive feel is achieved not by 'boosting' interactive
|
||||
tasks, but by 'punishing' tasks that want to use more CPU time than there
|
||||
is available. This method is also much easier to do in an O(1) fashion.
|
||||
|
||||
to establish the actual 'load' the task contributes to the system, a
|
||||
complex-looking but pretty accurate method is used: there is a 4-entry
|
||||
'history' ringbuffer of the task's activities during the last 4 seconds.
|
||||
This ringbuffer is operated without much overhead. The entries tell the
|
||||
scheduler a pretty accurate load-history of the task: has it used up more
|
||||
CPU time or less during the past N seconds. [the size '4' and the interval
|
||||
of 4x 1 seconds was found by lots of experimentation - this part is
|
||||
flexible and can be changed in both directions.]
|
||||
|
||||
the penalty a task gets for generating more load than the CPU can handle
|
||||
is a priority decrease - there is a maximum amount to this penalty
|
||||
relative to their static priority, so even fully CPU-bound tasks will
|
||||
observe each other's priorities, and will share the CPU accordingly.
|
||||
|
||||
the SMP load-balancer can be extended/switched with additional parallel
|
||||
computing and cache hierarchy concepts: NUMA scheduling, multi-core CPUs
|
||||
can be supported easily by changing the load-balancer. Right now it's
|
||||
tuned for my SMP systems.
|
||||
|
||||
i skipped the prev->mm == next->mm advantage - no workload i know of shows
|
||||
any sensitivity to this. It can be added back by sacrificing O(1)
|
||||
schedule() [the current and one-lower priority list can be searched for a
|
||||
that->mm == current->mm condition], but costs a fair number of cycles
|
||||
during a number of important workloads, so i wanted to avoid this as much
|
||||
as possible.
|
||||
|
||||
- the SMP idle-task startup code was still racy and the new scheduler
|
||||
triggered this. So i streamlined the idle-setup code a bit. We do not call
|
||||
into schedule() before all processors have started up fully and all idle
|
||||
threads are in place.
|
||||
|
||||
- the patch also cleans up a number of aspects of sched.c - moves code
|
||||
into other areas of the kernel where it's appropriate, and simplifies
|
||||
certain code paths and data constructs. As a result, the new scheduler's
|
||||
code is smaller than the old one.
|
||||
|
||||
Ingo
|
|
@ -1,3 +1,25 @@
|
|||
1 Release Date : Mon. March 10 11:02:31 PDT 2008 -
|
||||
(emaild-id:megaraidlinux@lsi.com)
|
||||
Sumant Patro
|
||||
Bo Yang
|
||||
|
||||
2 Current Version : 00.00.03.20-RC1
|
||||
3 Older Version : 00.00.03.16
|
||||
|
||||
1. Rollback the sense info implementation
|
||||
Sense buffer ptr data type in the ioctl path is reverted back
|
||||
to u32 * as in previous versions of driver.
|
||||
|
||||
2. Fixed the driver frame count.
|
||||
When Driver sent wrong frame count to firmware. As this
|
||||
particular command is sent to drive, FW is seeing continuous
|
||||
chip resets and so the command will timeout.
|
||||
|
||||
3. Add the new controller(1078DE) support to the driver
|
||||
and Increase the max_wait to 60 from 10 in the controller
|
||||
operational status. With this max_wait increase, driver will
|
||||
make sure the FW will finish the pending cmd for KDUMP case.
|
||||
|
||||
1 Release Date : Thur. Nov. 07 16:30:43 PST 2007 -
|
||||
(emaild-id:megaraidlinux@lsi.com)
|
||||
Sumant Patro
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
0 -> Unknown board (au0828)
|
||||
1 -> Hauppauge HVR950Q (au0828) [2040:7200]
|
||||
1 -> Hauppauge HVR950Q (au0828) [2040:7200,2040:7210,2040:7217,2040:721b,2040:721f,2040:7280,0fd9:0008]
|
||||
2 -> Hauppauge HVR850 (au0828) [2040:7240]
|
||||
3 -> DViCO FusionHDTV USB (au0828) [0fe9:d620]
|
||||
|
|
|
@ -5,6 +5,6 @@
|
|||
4 -> DViCO FusionHDTV5 Express [18ac:d500]
|
||||
5 -> Hauppauge WinTV-HVR1500Q [0070:7790,0070:7797]
|
||||
6 -> Hauppauge WinTV-HVR1500 [0070:7710,0070:7717]
|
||||
7 -> Hauppauge WinTV-HVR1200 [0070:71d1]
|
||||
7 -> Hauppauge WinTV-HVR1200 [0070:71d1,0070:71d3]
|
||||
8 -> Hauppauge WinTV-HVR1700 [0070:8101]
|
||||
9 -> Hauppauge WinTV-HVR1400 [0070:8010]
|
||||
|
|
|
@ -60,7 +60,7 @@
|
|||
59 -> DViCO FusionHDTV 5 PCI nano [18ac:d530]
|
||||
60 -> Pinnacle Hybrid PCTV [12ab:1788]
|
||||
61 -> Winfast TV2000 XP Global [107d:6f18]
|
||||
62 -> PowerColor Real Angel 330 [14f1:ea3d]
|
||||
62 -> PowerColor RA330 [14f1:ea3d]
|
||||
63 -> Geniatech X8000-MT DVBT [14f1:8852]
|
||||
64 -> DViCO FusionHDTV DVB-T PRO [18ac:db30]
|
||||
65 -> DViCO FusionHDTV 7 Gold [18ac:d610]
|
||||
|
|
|
@ -14,4 +14,4 @@
|
|||
13 -> Terratec Prodigy XS (em2880) [0ccd:0047]
|
||||
14 -> Pixelview Prolink PlayTV USB 2.0 (em2820/em2840)
|
||||
15 -> V-Gear PocketTV (em2800)
|
||||
16 -> Hauppauge WinTV HVR 950 (em2880) [2040:6513]
|
||||
16 -> Hauppauge WinTV HVR 950 (em2880) [2040:6513,2040:6517,2040:651b,2040:651f]
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
Some notes regarding the cx18 driver for the Conexant CX23418 MPEG
|
||||
encoder chip:
|
||||
|
||||
1) The only hardware currently supported is the Hauppauge HVR-1600.
|
||||
1) The only hardware currently supported is the Hauppauge HVR-1600
|
||||
card and the Compro VideoMate H900 (note that this card only
|
||||
supports analog input, it has no digital tuner!).
|
||||
|
||||
2) Some people have problems getting the i2c bus to work. Cause unknown.
|
||||
The symptom is that the eeprom cannot be read and the card is
|
||||
|
|
|
@ -0,0 +1,77 @@
|
|||
pagemap, from the userspace perspective
|
||||
---------------------------------------
|
||||
|
||||
pagemap is a new (as of 2.6.25) set of interfaces in the kernel that allow
|
||||
userspace programs to examine the page tables and related information by
|
||||
reading files in /proc.
|
||||
|
||||
There are three components to pagemap:
|
||||
|
||||
* /proc/pid/pagemap. This file lets a userspace process find out which
|
||||
physical frame each virtual page is mapped to. It contains one 64-bit
|
||||
value for each virtual page, containing the following data (from
|
||||
fs/proc/task_mmu.c, above pagemap_read):
|
||||
|
||||
* Bits 0-55 page frame number (PFN) if present
|
||||
* Bits 0-4 swap type if swapped
|
||||
* Bits 5-55 swap offset if swapped
|
||||
* Bits 55-60 page shift (page size = 1<<page shift)
|
||||
* Bit 61 reserved for future use
|
||||
* Bit 62 page swapped
|
||||
* Bit 63 page present
|
||||
|
||||
If the page is not present but in swap, then the PFN contains an
|
||||
encoding of the swap file number and the page's offset into the
|
||||
swap. Unmapped pages return a null PFN. This allows determining
|
||||
precisely which pages are mapped (or in swap) and comparing mapped
|
||||
pages between processes.
|
||||
|
||||
Efficient users of this interface will use /proc/pid/maps to
|
||||
determine which areas of memory are actually mapped and llseek to
|
||||
skip over unmapped regions.
|
||||
|
||||
* /proc/kpagecount. This file contains a 64-bit count of the number of
|
||||
times each page is mapped, indexed by PFN.
|
||||
|
||||
* /proc/kpageflags. This file contains a 64-bit set of flags for each
|
||||
page, indexed by PFN.
|
||||
|
||||
The flags are (from fs/proc/proc_misc, above kpageflags_read):
|
||||
|
||||
0. LOCKED
|
||||
1. ERROR
|
||||
2. REFERENCED
|
||||
3. UPTODATE
|
||||
4. DIRTY
|
||||
5. LRU
|
||||
6. ACTIVE
|
||||
7. SLAB
|
||||
8. WRITEBACK
|
||||
9. RECLAIM
|
||||
10. BUDDY
|
||||
|
||||
Using pagemap to do something useful:
|
||||
|
||||
The general procedure for using pagemap to find out about a process' memory
|
||||
usage goes like this:
|
||||
|
||||
1. Read /proc/pid/maps to determine which parts of the memory space are
|
||||
mapped to what.
|
||||
2. Select the maps you are interested in -- all of them, or a particular
|
||||
library, or the stack or the heap, etc.
|
||||
3. Open /proc/pid/pagemap and seek to the pages you would like to examine.
|
||||
4. Read a u64 for each page from pagemap.
|
||||
5. Open /proc/kpagecount and/or /proc/kpageflags. For each PFN you just
|
||||
read, seek to that entry in the file, and read the data you want.
|
||||
|
||||
For example, to find the "unique set size" (USS), which is the amount of
|
||||
memory that a process is using that is not shared with any other process,
|
||||
you can go through every map in the process, find the PFNs, look those up
|
||||
in kpagecount, and tally up the number of pages that are only referenced
|
||||
once.
|
||||
|
||||
Other notes:
|
||||
|
||||
Reading from any of the files will return -EINVAL if you are not starting
|
||||
the read on an 8-byte boundary (e.g., if you seeked an odd number of bytes
|
||||
into the file), or if the size of the read is not a multiple of 8 bytes.
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* Slabinfo: Tool to get reports about slabs
|
||||
*
|
||||
* (C) 2007 sgi, Christoph Lameter <clameter@sgi.com>
|
||||
* (C) 2007 sgi, Christoph Lameter
|
||||
*
|
||||
* Compile by:
|
||||
*
|
||||
|
@ -38,7 +38,7 @@ struct slabinfo {
|
|||
unsigned long alloc_from_partial, alloc_slab, free_slab, alloc_refill;
|
||||
unsigned long cpuslab_flush, deactivate_full, deactivate_empty;
|
||||
unsigned long deactivate_to_head, deactivate_to_tail;
|
||||
unsigned long deactivate_remote_frees;
|
||||
unsigned long deactivate_remote_frees, order_fallback;
|
||||
int numa[MAX_NODES];
|
||||
int numa_partial[MAX_NODES];
|
||||
} slabinfo[MAX_SLABS];
|
||||
|
@ -99,7 +99,7 @@ void fatal(const char *x, ...)
|
|||
|
||||
void usage(void)
|
||||
{
|
||||
printf("slabinfo 5/7/2007. (c) 2007 sgi. clameter@sgi.com\n\n"
|
||||
printf("slabinfo 5/7/2007. (c) 2007 sgi.\n\n"
|
||||
"slabinfo [-ahnpvtsz] [-d debugopts] [slab-regexp]\n"
|
||||
"-a|--aliases Show aliases\n"
|
||||
"-A|--activity Most active slabs first\n"
|
||||
|
@ -293,7 +293,7 @@ int line = 0;
|
|||
void first_line(void)
|
||||
{
|
||||
if (show_activity)
|
||||
printf("Name Objects Alloc Free %%Fast\n");
|
||||
printf("Name Objects Alloc Free %%Fast Fallb O\n");
|
||||
else
|
||||
printf("Name Objects Objsize Space "
|
||||
"Slabs/Part/Cpu O/S O %%Fr %%Ef Flg\n");
|
||||
|
@ -573,11 +573,12 @@ void slabcache(struct slabinfo *s)
|
|||
total_alloc = s->alloc_fastpath + s->alloc_slowpath;
|
||||
total_free = s->free_fastpath + s->free_slowpath;
|
||||
|
||||
printf("%-21s %8ld %8ld %8ld %3ld %3ld \n",
|
||||
printf("%-21s %8ld %10ld %10ld %3ld %3ld %5ld %1d\n",
|
||||
s->name, s->objects,
|
||||
total_alloc, total_free,
|
||||
total_alloc ? (s->alloc_fastpath * 100 / total_alloc) : 0,
|
||||
total_free ? (s->free_fastpath * 100 / total_free) : 0);
|
||||
total_free ? (s->free_fastpath * 100 / total_free) : 0,
|
||||
s->order_fallback, s->order);
|
||||
}
|
||||
else
|
||||
printf("%-21s %8ld %7d %8s %14s %4d %1d %3ld %3ld %s\n",
|
||||
|
@ -1188,6 +1189,7 @@ void read_slab_dir(void)
|
|||
slab->deactivate_to_head = get_obj("deactivate_to_head");
|
||||
slab->deactivate_to_tail = get_obj("deactivate_to_tail");
|
||||
slab->deactivate_remote_frees = get_obj("deactivate_remote_frees");
|
||||
slab->order_fallback = get_obj("order_fallback");
|
||||
chdir("..");
|
||||
if (slab->name[0] == ':')
|
||||
alias_targets++;
|
||||
|
|
|
@ -266,4 +266,4 @@ of other objects.
|
|||
|
||||
slub_debug=FZ,dentry
|
||||
|
||||
Christoph Lameter, <clameter@sgi.com>, May 30, 2007
|
||||
Christoph Lameter, May 30, 2007
|
||||
|
|
3
Kbuild
3
Kbuild
|
@ -96,5 +96,4 @@ missing-syscalls: scripts/checksyscalls.sh FORCE
|
|||
$(call cmd,syscalls)
|
||||
|
||||
# Delete all targets during make clean
|
||||
clean-files := $(addprefix $(objtree)/,$(targets))
|
||||
|
||||
clean-files := $(addprefix $(objtree)/,$(filter-out $(bounds-file) $(offsets-file),$(targets)))
|
||||
|
|
323
MAINTAINERS
323
MAINTAINERS
|
@ -228,21 +228,21 @@ ACPI BATTERY DRIVERS
|
|||
P: Alexey Starikovskiy
|
||||
M: astarikovskiy@suse.de
|
||||
L: linux-acpi@vger.kernel.org
|
||||
W: http://acpi.sourceforge.net/
|
||||
W: http://www.lesswatts.org/projects/acpi/
|
||||
S: Supported
|
||||
|
||||
ACPI EC DRIVER
|
||||
P: Alexey Starikovskiy
|
||||
M: astarikovskiy@suse.de
|
||||
L: linux-acpi@vger.kernel.org
|
||||
W: http://acpi.sourceforge.net/
|
||||
W: http://www.lesswatts.org/projects/acpi/
|
||||
S: Supported
|
||||
|
||||
ACPI FAN DRIVER
|
||||
P: Len Brown
|
||||
M: len.brown@intel.com
|
||||
L: linux-acpi@vger.kernel.org
|
||||
W: http://acpi.sourceforge.net/
|
||||
W: http://www.lesswatts.org/projects/acpi/
|
||||
S: Supported
|
||||
|
||||
ACPI PCI HOTPLUG DRIVER
|
||||
|
@ -255,14 +255,14 @@ ACPI THERMAL DRIVER
|
|||
P: Len Brown
|
||||
M: len.brown@intel.com
|
||||
L: linux-acpi@vger.kernel.org
|
||||
W: http://acpi.sourceforge.net/
|
||||
W: http://www.lesswatts.org/projects/acpi/
|
||||
S: Supported
|
||||
|
||||
ACPI VIDEO DRIVER
|
||||
P: Rui Zhang
|
||||
M: rui.zhang@intel.com
|
||||
L: linux-acpi@vger.kernel.org
|
||||
W: http://acpi.sourceforge.net/
|
||||
W: http://www.lesswatts.org/projects/acpi/
|
||||
S: Supported
|
||||
|
||||
ACPI WMI DRIVER
|
||||
|
@ -274,7 +274,7 @@ S: Maintained
|
|||
|
||||
AD1889 ALSA SOUND DRIVER
|
||||
P: Kyle McMartin
|
||||
M: kyle@parisc-linux.org
|
||||
M: kyle@mcmartin.ca
|
||||
P: Thibaut Varene
|
||||
M: T-Bone@parisc-linux.org
|
||||
W: http://wiki.parisc-linux.org/AD1889
|
||||
|
@ -367,12 +367,12 @@ S: Maintained for 2.4; PCI support for 2.6.
|
|||
AMD GEODE CS5536 USB DEVICE CONTROLLER DRIVER
|
||||
P: Thomas Dahlmann
|
||||
M: thomas.dahlmann@amd.com
|
||||
L: info-linux@geode.amd.com (subscribers-only)
|
||||
L: linux-geode@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Supported
|
||||
|
||||
AMD GEODE PROCESSOR/CHIPSET SUPPORT
|
||||
P: Jordan Crouse
|
||||
L: info-linux@geode.amd.com (subscribers-only)
|
||||
L: linux-geode@lists.infradead.org (moderated for non-subscribers)
|
||||
W: http://www.amd.com/us-en/ConnectivitySolutions/TechnicalResources/0,,50_2334_2452_11363,00.html
|
||||
S: Supported
|
||||
|
||||
|
@ -763,9 +763,10 @@ S: Maintained
|
|||
|
||||
AUXILIARY DISPLAY DRIVERS
|
||||
P: Miguel Ojeda Sandonis
|
||||
M: maxextreme@gmail.com
|
||||
M: miguel.ojeda.sandonis@gmail.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
W: http://auxdisplay.googlepages.com/
|
||||
W: http://miguelojeda.es/auxdisplay.htm
|
||||
W: http://jair.lab.fi.uva.es/~migojed/auxdisplay.htm
|
||||
S: Maintained
|
||||
|
||||
AVR32 ARCHITECTURE
|
||||
|
@ -982,13 +983,6 @@ L: bonding-devel@lists.sourceforge.net
|
|||
W: http://sourceforge.net/projects/bonding/
|
||||
S: Supported
|
||||
|
||||
BROADBAND PROCESSOR ARCHITECTURE
|
||||
P: Arnd Bergmann
|
||||
M: arnd@arndb.de
|
||||
L: linuxppc-dev@ozlabs.org
|
||||
W: http://www.penguinppc.org/ppc64/
|
||||
S: Supported
|
||||
|
||||
BROADCOM B44 10/100 ETHERNET DRIVER
|
||||
P: Gary Zambrano
|
||||
M: zambrano@broadcom.com
|
||||
|
@ -1002,8 +996,8 @@ L: netdev@vger.kernel.org
|
|||
S: Supported
|
||||
|
||||
BROADCOM BNX2X 10 GIGABIT ETHERNET DRIVER
|
||||
P: Eliezer Tamir
|
||||
M: eliezert@broadcom.com
|
||||
P: Eilon Greenstein
|
||||
M: eilong@broadcom.com
|
||||
L: netdev@vger.kernel.org
|
||||
S: Supported
|
||||
|
||||
|
@ -1052,18 +1046,28 @@ L: linux-kernel@vger.kernel.org
|
|||
L: discuss@x86-64.org
|
||||
S: Maintained
|
||||
|
||||
CELL BROADBAND ENGINE ARCHITECTURE
|
||||
P: Arnd Bergmann
|
||||
M: arnd@arndb.de
|
||||
L: linuxppc-dev@ozlabs.org
|
||||
L: cbe-oss-dev@ozlabs.org
|
||||
W: http://www.ibm.com/developerworks/power/cell/
|
||||
S: Supported
|
||||
|
||||
CFAG12864B LCD DRIVER
|
||||
P: Miguel Ojeda Sandonis
|
||||
M: maxextreme@gmail.com
|
||||
M: miguel.ojeda.sandonis@gmail.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
W: http://auxdisplay.googlepages.com/
|
||||
W: http://miguelojeda.es/auxdisplay.htm
|
||||
W: http://jair.lab.fi.uva.es/~migojed/auxdisplay.htm
|
||||
S: Maintained
|
||||
|
||||
CFAG12864BFB LCD FRAMEBUFFER DRIVER
|
||||
P: Miguel Ojeda Sandonis
|
||||
M: maxextreme@gmail.com
|
||||
M: miguel.ojeda.sandonis@gmail.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
W: http://auxdisplay.googlepages.com/
|
||||
W: http://miguelojeda.es/auxdisplay.htm
|
||||
W: http://jair.lab.fi.uva.es/~migojed/auxdisplay.htm
|
||||
S: Maintained
|
||||
|
||||
CFG80211 and NL80211
|
||||
|
@ -1201,6 +1205,7 @@ M: pj@sgi.com
|
|||
M: menage@google.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
W: http://www.bullopensource.org/cpuset/
|
||||
W: http://oss.sgi.com/projects/cpusets/
|
||||
S: Supported
|
||||
|
||||
CRAMFS FILESYSTEM
|
||||
|
@ -1230,6 +1235,29 @@ P: Jaya Kumar
|
|||
M: jayakumar.alsa@gmail.com
|
||||
S: Maintained
|
||||
|
||||
CX18 VIDEO4LINUX DRIVER
|
||||
P: Hans Verkuil, Andy Walls
|
||||
M: hverkuil@xs4all.nl, awalls@radix.net
|
||||
L: ivtv-devel@ivtvdriver.org
|
||||
L: ivtv-users@ivtvdriver.org
|
||||
L: video4linux-list@redhat.com
|
||||
W: http://linuxtv.org
|
||||
S: Maintained
|
||||
|
||||
CXGB3 ETHERNET DRIVER (CXGB3)
|
||||
P: Divy Le Ray
|
||||
M: divy@chelsio.com
|
||||
L: netdev@vger.kernel.org
|
||||
W: http://www.chelsio.com
|
||||
S: Supported
|
||||
|
||||
CXGB3 IWARP RNIC DRIVER (IW_CXGB3)
|
||||
P: Steve Wise
|
||||
M: swise@chelsio.com
|
||||
L: general@lists.openfabrics.org
|
||||
W: http://www.openfabrics.org
|
||||
S: Supported
|
||||
|
||||
CYBERPRO FB DRIVER
|
||||
P: Russell King
|
||||
M: rmk@arm.linux.org.uk
|
||||
|
@ -1395,6 +1423,14 @@ M: kristen.c.accardi@intel.com
|
|||
L: linux-acpi@vger.kernel.org
|
||||
S: Supported
|
||||
|
||||
DOCUMENTATION (/Documentation directory)
|
||||
P: Michael Kerrisk
|
||||
M: mtk.manpages@gmail.com
|
||||
P: Randy Dunlap
|
||||
M: rdunlap@xenotime.net
|
||||
L: linux-doc@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
DOUBLETALK DRIVER
|
||||
P: James R. Van Zandt
|
||||
M: jrv@vanzandt.mv.com
|
||||
|
@ -1587,7 +1623,7 @@ ETHERNET BRIDGE
|
|||
P: Stephen Hemminger
|
||||
M: shemminger@linux-foundation.org
|
||||
L: bridge@lists.linux-foundation.org
|
||||
W: http://bridge.sourceforge.net/
|
||||
W: http://www.linux-foundation.org/en/Net:Bridge
|
||||
S: Maintained
|
||||
|
||||
ETHERTEAM 16I DRIVER
|
||||
|
@ -1601,13 +1637,13 @@ S: Maintained
|
|||
|
||||
EXT3 FILE SYSTEM
|
||||
P: Stephen Tweedie, Andrew Morton
|
||||
M: sct@redhat.com, akpm@linux-foundation.org, adilger@clusterfs.com
|
||||
M: sct@redhat.com, akpm@linux-foundation.org, adilger@sun.com
|
||||
L: linux-ext4@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
EXT4 FILE SYSTEM
|
||||
P: Stephen Tweedie, Andrew Morton
|
||||
M: sct@redhat.com, akpm@linux-foundation.org, adilger@clusterfs.com
|
||||
M: sct@redhat.com, akpm@linux-foundation.org, adilger@sun.com
|
||||
L: linux-ext4@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
|
@ -1636,8 +1672,10 @@ W: http://linux-fbdev.sourceforge.net/
|
|||
S: Maintained
|
||||
|
||||
FREESCALE DMA DRIVER
|
||||
P; Zhang Wei
|
||||
M: wei.zhang@freescale.com
|
||||
P: Li Yang
|
||||
M: leoli@freescale.com
|
||||
P: Zhang Wei
|
||||
M: zw@zh-kernel.org
|
||||
L: linuxppc-embedded@ozlabs.org
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
|
@ -1801,7 +1839,7 @@ S: Maintained
|
|||
|
||||
HARMONY SOUND DRIVER
|
||||
P: Kyle McMartin
|
||||
M: kyle@parisc-linux.org
|
||||
M: kyle@mcmartin.ca
|
||||
L: linux-parisc@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
|
@ -1931,8 +1969,10 @@ L: lm-sensors@lm-sensors.org
|
|||
S: Maintained
|
||||
|
||||
I2C SUBSYSTEM
|
||||
P: Jean Delvare
|
||||
P: Jean Delvare (PC drivers, core)
|
||||
M: khali@linux-fr.org
|
||||
P: Ben Dooks (embedded platforms)
|
||||
M: ben-linux@fluff.org
|
||||
L: i2c@lm-sensors.org
|
||||
T: quilt http://khali.linux-fr.org/devel/linux-2.6/jdelvare-i2c/
|
||||
S: Maintained
|
||||
|
@ -2112,12 +2152,10 @@ L: netdev@vger.kernel.org
|
|||
S: Maintained
|
||||
|
||||
INTEL ETHERNET DRIVERS (e100/e1000/e1000e/igb/ixgb/ixgbe)
|
||||
P: Auke Kok
|
||||
M: auke-jan.h.kok@intel.com
|
||||
P: Jesse Brandeburg
|
||||
M: jesse.brandeburg@intel.com
|
||||
P: Jeff Kirsher
|
||||
M: jeffrey.t.kirsher@intel.com
|
||||
P: Jesse Brandeburg
|
||||
M: jesse.brandeburg@intel.com
|
||||
P: Bruce Allan
|
||||
M: bruce.w.allan@intel.com
|
||||
P: John Ronciak
|
||||
|
@ -2320,7 +2358,8 @@ S: Maintained
|
|||
KERNEL BUILD (kbuild: Makefile, scripts/Makefile.*)
|
||||
P: Sam Ravnborg
|
||||
M: sam@ravnborg.org
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/sam/kbuild.git
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/sam/kbuild-next.git
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/sam/kbuild-fixes.git
|
||||
L: linux-kbuild@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
|
@ -2342,24 +2381,24 @@ S: Supported
|
|||
KERNEL VIRTUAL MACHINE (KVM)
|
||||
P: Avi Kivity
|
||||
M: avi@qumranet.com
|
||||
L: kvm-devel@lists.sourceforge.net
|
||||
W: kvm.sourceforge.net
|
||||
L: kvm@vger.kernel.org
|
||||
W: http://kvm.qumranet.com
|
||||
S: Supported
|
||||
|
||||
KERNEL VIRTUAL MACHINE (KVM) FOR POWERPC
|
||||
P: Hollis Blanchard
|
||||
M: hollisb@us.ibm.com
|
||||
L: kvm-ppc-devel@lists.sourceforge.net
|
||||
W: kvm.sourceforge.net
|
||||
L: kvm-ppc@vger.kernel.org
|
||||
W: http://kvm.qumranet.com
|
||||
S: Supported
|
||||
|
||||
KERNEL VIRTUAL MACHINE For Itanium(KVM/IA64)
|
||||
KERNEL VIRTUAL MACHINE For Itanium (KVM/IA64)
|
||||
P: Anthony Xu
|
||||
M: anthony.xu@intel.com
|
||||
P: Xiantao Zhang
|
||||
M: xiantao.zhang@intel.com
|
||||
L: kvm-ia64-devel@lists.sourceforge.net
|
||||
W: kvm.sourceforge.net
|
||||
L: kvm-ia64@vger.kernel.org
|
||||
W: http://kvm.qumranet.com
|
||||
S: Supported
|
||||
|
||||
KERNEL VIRTUAL MACHINE for s390 (KVM/s390)
|
||||
|
@ -2400,9 +2439,10 @@ S: Maintained
|
|||
|
||||
KS0108 LCD CONTROLLER DRIVER
|
||||
P: Miguel Ojeda Sandonis
|
||||
M: maxextreme@gmail.com
|
||||
M: miguel.ojeda.sandonis@gmail.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
W: http://auxdisplay.googlepages.com/
|
||||
W: http://miguelojeda.es/auxdisplay.htm
|
||||
W: http://jair.lab.fi.uva.es/~migojed/auxdisplay.htm
|
||||
S: Maintained
|
||||
|
||||
LAPB module
|
||||
|
@ -2446,9 +2486,11 @@ M: James.Bottomley@HansenPartnership.com
|
|||
W: http://www.hansenpartnership.com/voyager
|
||||
S: Maintained
|
||||
|
||||
LINUX FOR POWERPC
|
||||
LINUX FOR POWERPC (32-BIT AND 64-BIT)
|
||||
P: Paul Mackerras
|
||||
M: paulus@samba.org
|
||||
P: Benjamin Herrenschmidt
|
||||
M: benh@kernel.crashing.org
|
||||
W: http://www.penguinppc.org/
|
||||
L: linuxppc-dev@ozlabs.org
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/paulus/powerpc.git
|
||||
|
@ -2488,13 +2530,6 @@ W: http://wiki.secretlab.ca/index.php/Linux_on_Xilinx_Virtex
|
|||
L: linuxppc-dev@ozlabs.org
|
||||
S: Maintained
|
||||
|
||||
LINUX FOR POWERPC BOOT CODE
|
||||
P: Tom Rini
|
||||
M: trini@kernel.crashing.org
|
||||
W: http://www.penguinppc.org/
|
||||
L: linuxppc-dev@ozlabs.org
|
||||
S: Maintained
|
||||
|
||||
LINUX FOR POWERPC EMBEDDED PPC8XX
|
||||
P: Vitaly Bordug
|
||||
M: vitb@kernel.crashing.org
|
||||
|
@ -2523,22 +2558,10 @@ P: Arnaldo Carvalho de Melo
|
|||
M: acme@ghostprotocols.net
|
||||
S: Maintained
|
||||
|
||||
LINUX FOR 64BIT POWERPC
|
||||
P: Paul Mackerras
|
||||
M: paulus@samba.org
|
||||
M: paulus@au.ibm.com
|
||||
P: Anton Blanchard
|
||||
M: anton@samba.org
|
||||
M: anton@au.ibm.com
|
||||
W: http://www.penguinppc.org/ppc64/
|
||||
L: linuxppc-dev@ozlabs.org
|
||||
S: Supported
|
||||
|
||||
LINUX SECURITY MODULE (LSM) FRAMEWORK
|
||||
P: Chris Wright
|
||||
M: chrisw@sous-sol.org
|
||||
L: linux-security-module@vger.kernel.org
|
||||
W: http://lsm.immunix.org
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/chrisw/lsm-2.6.git
|
||||
S: Supported
|
||||
|
||||
|
@ -2653,8 +2676,8 @@ S: Supported
|
|||
MAN-PAGES: MANUAL PAGES FOR LINUX -- Sections 2, 3, 4, 5, and 7
|
||||
P: Michael Kerrisk
|
||||
M: mtk.manpages@gmail.com
|
||||
W: ftp://ftp.kernel.org/pub/linux/docs/manpages
|
||||
S: Maintained
|
||||
W: http://www.kernel.org/doc/man-pages
|
||||
S: Supported
|
||||
|
||||
MARVELL LIBERTAS WIRELESS DRIVER
|
||||
P: Dan Williams
|
||||
|
@ -2787,6 +2810,12 @@ W: https://tango.0pointer.de/mailman/listinfo/s270-linux
|
|||
W: http://0pointer.de/lennart/tchibo.html
|
||||
S: Maintained
|
||||
|
||||
MULTIFUNCTION DEVICES (MFD)
|
||||
P: Samuel Ortiz
|
||||
M: sameo@openedhand.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Supported
|
||||
|
||||
MULTIMEDIA CARD (MMC), SECURE DIGITAL (SD) AND SDIO SUBSYSTEM
|
||||
P: Pierre Ossman
|
||||
M: drzeus-mmc@drzeus.cx
|
||||
|
@ -2810,6 +2839,15 @@ M: jirislaby@gmail.com
|
|||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
MYRICOM MYRI-10G 10GbE DRIVER (MYRI10GE)
|
||||
P: Andrew Gallatin
|
||||
M: gallatin@myri.com
|
||||
P: Brice Goglin
|
||||
M: brice@myri.com
|
||||
L: netdev@vger.kernel.org
|
||||
W: http://www.myri.com/scs/download-Myri10GE.html
|
||||
S: Supported
|
||||
|
||||
NATSEMI ETHERNET DRIVER (DP8381x)
|
||||
P: Tim Hockin
|
||||
M: thockin@hockin.org
|
||||
|
@ -2830,8 +2868,8 @@ S: Maintained
|
|||
NETEFFECT IWARP RNIC DRIVER (IW_NES)
|
||||
P: Faisal Latif
|
||||
M: flatif@neteffect.com
|
||||
P: Nishi Gupta
|
||||
M: ngupta@neteffect.com
|
||||
P: Chien Tung
|
||||
M: ctung@neteffect.com
|
||||
P: Glenn Streiff
|
||||
M: gstreiff@neteffect.com
|
||||
L: general@lists.openfabrics.org
|
||||
|
@ -3085,7 +3123,7 @@ S: Maintained
|
|||
|
||||
PARISC ARCHITECTURE
|
||||
P: Kyle McMartin
|
||||
M: kyle@parisc-linux.org
|
||||
M: kyle@mcmartin.ca
|
||||
P: Matthew Wilcox
|
||||
M: matthew@wil.cx
|
||||
P: Grant Grundler
|
||||
|
@ -3123,14 +3161,14 @@ PCI ERROR RECOVERY
|
|||
P: Linas Vepstas
|
||||
M: linas@austin.ibm.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
L: linux-pci@atrey.karlin.mff.cuni.cz
|
||||
L: linux-pci@vger.kernel.org
|
||||
S: Supported
|
||||
|
||||
PCI SUBSYSTEM
|
||||
P: Jesse Barnes
|
||||
M: jbarnes@virtuousgeek.org
|
||||
L: linux-kernel@vger.kernel.org
|
||||
L: linux-pci@atrey.karlin.mff.cuni.cz
|
||||
L: linux-pci@vger.kernel.org
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/jbarnes/pci-2.6.git
|
||||
S: Supported
|
||||
|
||||
|
@ -3159,8 +3197,8 @@ L: netdev@vger.kernel.org
|
|||
S: Maintained
|
||||
|
||||
PER-TASK DELAY ACCOUNTING
|
||||
P: Shailabh Nagar
|
||||
M: nagar@watson.ibm.com
|
||||
P: Balbir Singh
|
||||
M: balbir@linux.vnet.ibm.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
|
@ -3229,7 +3267,7 @@ S: Maintained
|
|||
|
||||
PPP OVER ETHERNET
|
||||
P: Michal Ostrowski
|
||||
M: mostrows@speakeasy.net
|
||||
M: mostrows@earthlink.net
|
||||
S: Maintained
|
||||
|
||||
PPP OVER L2TP
|
||||
|
@ -3294,9 +3332,11 @@ L: video4linux-list@redhat.com
|
|||
W: http://www.isely.net/pvrusb2/
|
||||
S: Maintained
|
||||
|
||||
PXA2xx SUPPORT
|
||||
P: Nicolas Pitre
|
||||
M: nico@cam.org
|
||||
PXA2xx/PXA3xx SUPPORT
|
||||
P: Eric Miao
|
||||
M: eric.miao@marvell.com
|
||||
P: Russell King
|
||||
M: linux@arm.linux.org.uk
|
||||
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
|
||||
S: Maintained
|
||||
|
||||
|
@ -3403,10 +3443,7 @@ L: rtc-linux@googlegroups.com
|
|||
S: Maintained
|
||||
|
||||
REISERFS FILE SYSTEM
|
||||
P: Hans Reiser
|
||||
M: reiserfs-dev@namesys.com
|
||||
L: reiserfs-devel@vger.kernel.org
|
||||
W: http://www.namesys.com
|
||||
S: Supported
|
||||
|
||||
RFKILL
|
||||
|
@ -3626,13 +3663,6 @@ M: romieu@fr.zoreil.com
|
|||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
SIS 5513 IDE CONTROLLER DRIVER
|
||||
P: Lionel Bouton
|
||||
M: Lionel.Bouton@inet6.fr
|
||||
W: http://inet6.dyn.dhs.org/sponsoring/sis5513/index.html
|
||||
W: http://gyver.homeip.net/sis5513/index.html
|
||||
S: Maintained
|
||||
|
||||
SIS 900/7016 FAST ETHERNET DRIVER
|
||||
P: Daniele Venzano
|
||||
M: venza@brownhat.org
|
||||
|
@ -3660,7 +3690,7 @@ S: Maintained
|
|||
|
||||
SLAB ALLOCATOR
|
||||
P: Christoph Lameter
|
||||
M: clameter@sgi.com
|
||||
M: cl@linux-foundation.org
|
||||
P: Pekka Enberg
|
||||
M: penberg@cs.helsinki.fi
|
||||
P: Matt Mackall
|
||||
|
@ -3757,6 +3787,14 @@ M: dbrownell@users.sourceforge.net
|
|||
L: spi-devel-general@lists.sourceforge.net
|
||||
S: Maintained
|
||||
|
||||
SPU FILE SYSTEM
|
||||
P: Jeremy Kerr
|
||||
M: jk@ozlabs.org
|
||||
L: linuxppc-dev@ozlabs.org
|
||||
L: cbe-oss-dev@ozlabs.org
|
||||
W: http://www.ibm.com/developerworks/power/cell/
|
||||
S: Supported
|
||||
|
||||
STABLE BRANCH:
|
||||
P: Greg Kroah-Hartman
|
||||
M: greg@kroah.com
|
||||
|
@ -3862,8 +3900,8 @@ M: hch@infradead.org
|
|||
S: Maintained
|
||||
|
||||
TASKSTATS STATISTICS INTERFACE
|
||||
P: Shailabh Nagar
|
||||
M: nagar@watson.ibm.com
|
||||
P: Balbir Singh
|
||||
M: balbir@linux.vnet.ibm.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
|
@ -3959,7 +3997,8 @@ W: http://www.buzzard.org.uk/toshiba/
|
|||
S: Maintained
|
||||
|
||||
TPM DEVICE DRIVER
|
||||
P: Kylene Hall
|
||||
P: Debora Velarde
|
||||
P: Rajiv Andrade
|
||||
M: tpmdd-devel@lists.sourceforge.net
|
||||
W: http://tpmdd.sourceforge.net
|
||||
P: Marcel Selhorst
|
||||
|
@ -3990,7 +4029,7 @@ TULIP NETWORK DRIVERS
|
|||
P: Grant Grundler
|
||||
M: grundler@parisc-linux.org
|
||||
P: Kyle McMartin
|
||||
M: kyle@parisc-linux.org
|
||||
M: kyle@mcmartin.ca
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
|
@ -4012,12 +4051,41 @@ M: ballabio_dario@emc.com
|
|||
L: linux-scsi@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
UCLINUX (AND M68KNOMMU)
|
||||
P: Greg Ungerer
|
||||
M: gerg@uclinux.org
|
||||
W: http://www.uclinux.org/
|
||||
L: uclinux-dev@uclinux.org (subscribers-only)
|
||||
S: Maintained
|
||||
|
||||
UCLINUX FOR NEC V850
|
||||
P: Miles Bader
|
||||
|
||||
UCLINUX FOR RENESAS H8/300
|
||||
P: Yoshinori Sato
|
||||
M: ysato@users.sourceforge.jp
|
||||
W: http://uclinux-h8.sourceforge.jp/
|
||||
S: Supported
|
||||
|
||||
UDF FILESYSTEM
|
||||
P: Jan Kara
|
||||
M: jack@suse.cz
|
||||
W: http://linux-udf.sourceforge.net
|
||||
S: Maintained
|
||||
|
||||
UFS FILESYSTEM
|
||||
P: Evgeniy Dushistov
|
||||
M: dushistov@mail.ru
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
UltraSPARC (sparc64):
|
||||
P: David S. Miller
|
||||
M: davem@davemloft.net
|
||||
L: sparclinux@vger.kernel.org
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6.git
|
||||
S: Maintained
|
||||
|
||||
UNIFORM CDROM DRIVER
|
||||
P: Jens Axboe
|
||||
M: axboe@kernel.dk
|
||||
|
@ -4051,6 +4119,12 @@ L: linux-usb@vger.kernel.org
|
|||
S: Maintained
|
||||
W: http://www.kroah.com/linux-usb/
|
||||
|
||||
USB CYPRESS C67X00 DRIVER
|
||||
P: Peter Korsgaard
|
||||
M: jacmet@sunsite.dk
|
||||
L: linux-usb@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
USB DAVICOM DM9601 DRIVER
|
||||
P: Peter Korsgaard
|
||||
M: jacmet@sunsite.dk
|
||||
|
@ -4058,6 +4132,13 @@ L: netdev@vger.kernel.org
|
|||
W: http://www.linux-usb.org/usbnet
|
||||
S: Maintained
|
||||
|
||||
USB DIAMOND RIO500 DRIVER
|
||||
P: Cesar Miquel
|
||||
M: miquel@df.uba.ar
|
||||
L: rio500-users@lists.sourceforge.net
|
||||
W: http://rio500.sourceforge.net
|
||||
S: Maintained
|
||||
|
||||
USB EHCI DRIVER
|
||||
P: David Brownell
|
||||
M: dbrownell@users.sourceforge.net
|
||||
|
@ -4236,6 +4317,14 @@ L: netdev@vger.kernel.org
|
|||
W: http://www.linux-usb.org/usbnet
|
||||
S: Maintained
|
||||
|
||||
USB VIDEO CLASS
|
||||
P: Laurent Pinchart
|
||||
M: laurent.pinchart@skynet.be
|
||||
L: linx-uvc-devel@berlios.de
|
||||
L: video4linux-list@redhat.com
|
||||
W: http://linux-uvc.berlios.de
|
||||
S: Maintained
|
||||
|
||||
USB W996[87]CF DRIVER
|
||||
P: Luca Risolia
|
||||
M: luca.risolia@studio.unibo.it
|
||||
|
@ -4289,6 +4378,14 @@ M: gregkh@suse.de
|
|||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
UTIL-LINUX-NG PACKAGE
|
||||
P: Karel Zak
|
||||
M: kzak@redhat.com
|
||||
L: util-linux-ng@vger.kernel.org
|
||||
W: http://kernel.org/~kzak/util-linux-ng/
|
||||
T: git://git.kernel.org/pub/scm/utils/util-linux-ng/util-linux-ng.git
|
||||
S: Maintained
|
||||
|
||||
VFAT/FAT/MSDOS FILESYSTEM:
|
||||
P: OGAWA Hirofumi
|
||||
M: hirofumi@mail.parknet.co.jp
|
||||
|
@ -4312,42 +4409,6 @@ M: romieu@fr.zoreil.com
|
|||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
UCLINUX (AND M68KNOMMU)
|
||||
P: Greg Ungerer
|
||||
M: gerg@uclinux.org
|
||||
W: http://www.uclinux.org/
|
||||
L: uclinux-dev@uclinux.org (subscribers-only)
|
||||
S: Maintained
|
||||
|
||||
UCLINUX FOR NEC V850
|
||||
P: Miles Bader
|
||||
|
||||
UCLINUX FOR RENESAS H8/300
|
||||
P: Yoshinori Sato
|
||||
M: ysato@users.sourceforge.jp
|
||||
W: http://uclinux-h8.sourceforge.jp/
|
||||
S: Supported
|
||||
|
||||
UFS FILESYSTEM
|
||||
P: Evgeniy Dushistov
|
||||
M: dushistov@mail.ru
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
UltraSPARC (sparc64):
|
||||
P: David S. Miller
|
||||
M: davem@davemloft.net
|
||||
L: sparclinux@vger.kernel.org
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6.git
|
||||
S: Maintained
|
||||
|
||||
USB DIAMOND RIO500 DRIVER
|
||||
P: Cesar Miquel
|
||||
M: miquel@df.uba.ar
|
||||
L: rio500-users@lists.sourceforge.net
|
||||
W: http://rio500.sourceforge.net
|
||||
S: Maintained
|
||||
|
||||
VIDEO FOR LINUX
|
||||
P: Mauro Carvalho Chehab
|
||||
M: mchehab@infradead.org
|
||||
|
@ -4381,10 +4442,10 @@ M: johnpol@2ka.mipt.ru
|
|||
S: Maintained
|
||||
|
||||
W83791D HARDWARE MONITORING DRIVER
|
||||
P: Charles Spirakis
|
||||
M: bezaur@gmail.com
|
||||
P: Marc Hulsman
|
||||
M: m.hulsman@tudelft.nl
|
||||
L: lm-sensors@lm-sensors.org
|
||||
S: Odd Fixes
|
||||
S: Maintained
|
||||
|
||||
W83793 HARDWARE MONITORING DRIVER
|
||||
P: Rudolf Marek
|
||||
|
|
15
Makefile
15
Makefile
|
@ -1,8 +1,8 @@
|
|||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 25
|
||||
EXTRAVERSION =
|
||||
NAME = Funky Weasel is Jiggy wit it
|
||||
SUBLEVEL = 26
|
||||
EXTRAVERSION = -rc9
|
||||
NAME = Rotary Wombat
|
||||
|
||||
# *DOCUMENTATION*
|
||||
# To see a list of typical targets execute "make help"
|
||||
|
@ -794,7 +794,7 @@ endif # ifdef CONFIG_KALLSYMS
|
|||
quiet_cmd_vmlinux-modpost = LD $@
|
||||
cmd_vmlinux-modpost = $(LD) $(LDFLAGS) -r -o $@ \
|
||||
$(vmlinux-init) --start-group $(vmlinux-main) --end-group \
|
||||
$(filter-out $(vmlinux-init) $(vmlinux-main) $(vmlinux-lds) FORCE ,$^)
|
||||
$(filter-out $(vmlinux-init) $(vmlinux-main) FORCE ,$^)
|
||||
define rule_vmlinux-modpost
|
||||
:
|
||||
+$(call cmd,vmlinux-modpost)
|
||||
|
@ -818,7 +818,9 @@ endif
|
|||
ifdef CONFIG_KALLSYMS
|
||||
.tmp_vmlinux1: vmlinux.o
|
||||
endif
|
||||
vmlinux.o: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) FORCE
|
||||
|
||||
modpost-init := $(filter-out init/built-in.o, $(vmlinux-init))
|
||||
vmlinux.o: $(modpost-init) $(vmlinux-main) FORCE
|
||||
$(call if_changed_rule,vmlinux-modpost)
|
||||
|
||||
# The actual objects are generated when descending,
|
||||
|
@ -1112,6 +1114,7 @@ MRPROPER_DIRS += include/config include2 usr/include
|
|||
MRPROPER_FILES += .config .config.old include/asm .version .old_version \
|
||||
include/linux/autoconf.h include/linux/version.h \
|
||||
include/linux/utsrelease.h \
|
||||
include/linux/bounds.h include/asm*/asm-offsets.h \
|
||||
Module.symvers tags TAGS cscope*
|
||||
|
||||
# clean - Delete most, but leave enough to build external modules
|
||||
|
@ -1429,7 +1432,7 @@ define xtags
|
|||
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_]+\)/\2/'; \
|
||||
--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 \
|
||||
|
|
|
@ -13,6 +13,7 @@ NM := $(NM) -B
|
|||
LDFLAGS_vmlinux := -static -N #-relax
|
||||
CHECKFLAGS += -D__alpha__ -m64
|
||||
cflags-y := -pipe -mno-fp-regs -ffixed-8 -msmall-data
|
||||
cflags-y += $(call cc-option, -fno-jump-tables)
|
||||
|
||||
cpuflags-$(CONFIG_ALPHA_EV4) := -mcpu=ev4
|
||||
cpuflags-$(CONFIG_ALPHA_EV5) := -mcpu=ev5
|
||||
|
|
|
@ -74,6 +74,8 @@
|
|||
# define DBG(args)
|
||||
#endif
|
||||
|
||||
DEFINE_SPINLOCK(t2_hae_lock);
|
||||
|
||||
static volatile unsigned int t2_mcheck_any_expected;
|
||||
static volatile unsigned int t2_mcheck_last_taken;
|
||||
|
||||
|
|
|
@ -9,7 +9,6 @@
|
|||
|
||||
|
||||
static struct fs_struct init_fs = INIT_FS;
|
||||
static struct files_struct init_files = INIT_FILES;
|
||||
static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
|
||||
static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
|
||||
struct mm_struct init_mm = INIT_MM(init_mm);
|
||||
|
|
|
@ -981,27 +981,18 @@ asmlinkage int
|
|||
osf_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp,
|
||||
struct timeval32 __user *tvp)
|
||||
{
|
||||
fd_set_bits fds;
|
||||
char *bits;
|
||||
size_t size;
|
||||
long timeout;
|
||||
int ret = -EINVAL;
|
||||
struct fdtable *fdt;
|
||||
int max_fds;
|
||||
|
||||
timeout = MAX_SCHEDULE_TIMEOUT;
|
||||
s64 timeout = MAX_SCHEDULE_TIMEOUT;
|
||||
if (tvp) {
|
||||
time_t sec, usec;
|
||||
|
||||
if (!access_ok(VERIFY_READ, tvp, sizeof(*tvp))
|
||||
|| __get_user(sec, &tvp->tv_sec)
|
||||
|| __get_user(usec, &tvp->tv_usec)) {
|
||||
ret = -EFAULT;
|
||||
goto out_nofds;
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
if (sec < 0 || usec < 0)
|
||||
goto out_nofds;
|
||||
return -EINVAL;
|
||||
|
||||
if ((unsigned long) sec < MAX_SELECT_SECONDS) {
|
||||
timeout = (usec + 1000000/HZ - 1) / (1000000/HZ);
|
||||
|
@ -1009,60 +1000,8 @@ osf_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp,
|
|||
}
|
||||
}
|
||||
|
||||
rcu_read_lock();
|
||||
fdt = files_fdtable(current->files);
|
||||
max_fds = fdt->max_fds;
|
||||
rcu_read_unlock();
|
||||
if (n < 0 || n > max_fds)
|
||||
goto out_nofds;
|
||||
|
||||
/*
|
||||
* We need 6 bitmaps (in/out/ex for both incoming and outgoing),
|
||||
* since we used fdset we need to allocate memory in units of
|
||||
* long-words.
|
||||
*/
|
||||
ret = -ENOMEM;
|
||||
size = FDS_BYTES(n);
|
||||
bits = kmalloc(6 * size, GFP_KERNEL);
|
||||
if (!bits)
|
||||
goto out_nofds;
|
||||
fds.in = (unsigned long *) bits;
|
||||
fds.out = (unsigned long *) (bits + size);
|
||||
fds.ex = (unsigned long *) (bits + 2*size);
|
||||
fds.res_in = (unsigned long *) (bits + 3*size);
|
||||
fds.res_out = (unsigned long *) (bits + 4*size);
|
||||
fds.res_ex = (unsigned long *) (bits + 5*size);
|
||||
|
||||
if ((ret = get_fd_set(n, inp->fds_bits, fds.in)) ||
|
||||
(ret = get_fd_set(n, outp->fds_bits, fds.out)) ||
|
||||
(ret = get_fd_set(n, exp->fds_bits, fds.ex)))
|
||||
goto out;
|
||||
zero_fd_set(n, fds.res_in);
|
||||
zero_fd_set(n, fds.res_out);
|
||||
zero_fd_set(n, fds.res_ex);
|
||||
|
||||
ret = do_select(n, &fds, &timeout);
|
||||
|
||||
/* OSF does not copy back the remaining time. */
|
||||
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
if (!ret) {
|
||||
ret = -ERESTARTNOHAND;
|
||||
if (signal_pending(current))
|
||||
goto out;
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
if (set_fd_set(n, inp->fds_bits, fds.res_in) ||
|
||||
set_fd_set(n, outp->fds_bits, fds.res_out) ||
|
||||
set_fd_set(n, exp->fds_bits, fds.res_ex))
|
||||
ret = -EFAULT;
|
||||
|
||||
out:
|
||||
kfree(bits);
|
||||
out_nofds:
|
||||
return ret;
|
||||
return core_sys_select(n, inp, outp, exp, &timeout);
|
||||
}
|
||||
|
||||
struct rusage32 {
|
||||
|
|
|
@ -71,6 +71,23 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82378, quirk_i
|
|||
static void __init
|
||||
quirk_cypress(struct pci_dev *dev)
|
||||
{
|
||||
/* The Notorious Cy82C693 chip. */
|
||||
|
||||
/* The generic legacy mode IDE fixup in drivers/pci/probe.c
|
||||
doesn't work correctly with the Cypress IDE controller as
|
||||
it has non-standard register layout. Fix that. */
|
||||
if (dev->class >> 8 == PCI_CLASS_STORAGE_IDE) {
|
||||
dev->resource[2].start = dev->resource[3].start = 0;
|
||||
dev->resource[2].end = dev->resource[3].end = 0;
|
||||
dev->resource[2].flags = dev->resource[3].flags = 0;
|
||||
if (PCI_FUNC(dev->devfn) == 2) {
|
||||
dev->resource[0].start = 0x170;
|
||||
dev->resource[0].end = 0x177;
|
||||
dev->resource[1].start = 0x376;
|
||||
dev->resource[1].end = 0x376;
|
||||
}
|
||||
}
|
||||
|
||||
/* The Cypress bridge responds on the PCI bus in the address range
|
||||
0xffff0000-0xffffffff (conventional x86 BIOS ROM). There is no
|
||||
way to turn this off. The bridge also supports several extended
|
||||
|
|
|
@ -447,7 +447,7 @@ struct unaligned_stat {
|
|||
|
||||
|
||||
/* Macro for exception fixup code to access integer registers. */
|
||||
#define una_reg(r) (regs->regs[(r) >= 16 && (r) <= 18 ? (r)+19 : (r)])
|
||||
#define una_reg(r) (_regs[(r) >= 16 && (r) <= 18 ? (r)+19 : (r)])
|
||||
|
||||
|
||||
asmlinkage void
|
||||
|
@ -456,6 +456,7 @@ do_entUna(void * va, unsigned long opcode, unsigned long reg,
|
|||
{
|
||||
long error, tmp1, tmp2, tmp3, tmp4;
|
||||
unsigned long pc = regs->pc - 4;
|
||||
unsigned long *_regs = regs->regs;
|
||||
const struct exception_table_entry *fixup;
|
||||
|
||||
unaligned[0].count++;
|
||||
|
|
|
@ -25,6 +25,13 @@ SECTIONS
|
|||
} :kernel
|
||||
_etext = .; /* End of text section */
|
||||
|
||||
NOTES :kernel :note
|
||||
.dummy : {
|
||||
*(.dummy)
|
||||
} :kernel
|
||||
|
||||
RODATA
|
||||
|
||||
/* Exception table */
|
||||
. = ALIGN(16);
|
||||
__ex_table : {
|
||||
|
@ -33,13 +40,6 @@ SECTIONS
|
|||
__stop___ex_table = .;
|
||||
}
|
||||
|
||||
NOTES :kernel :note
|
||||
.dummy : {
|
||||
*(.dummy)
|
||||
} :kernel
|
||||
|
||||
RODATA
|
||||
|
||||
/* Will be freed after init */
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
/* Init code and data */
|
||||
|
|
|
@ -33,10 +33,6 @@ __XScale_start:
|
|||
bic r0, r0, #0x1000 @ clear Icache
|
||||
mcr p15, 0, r0, c1, c0, 0
|
||||
|
||||
#ifdef CONFIG_ARCH_COTULLA_IDP
|
||||
mov r7, #MACH_TYPE_COTULLA_IDP
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ARCH_IXP2000
|
||||
mov r1, #-1
|
||||
mov r0, #0xd6000000
|
||||
|
|
|
@ -650,7 +650,8 @@ EXPORT_SYMBOL(dma_map_sg);
|
|||
EXPORT_SYMBOL(dma_unmap_sg);
|
||||
EXPORT_SYMBOL(dma_sync_single_for_cpu);
|
||||
EXPORT_SYMBOL(dma_sync_single_for_device);
|
||||
EXPORT_SYMBOL(dma_sync_sg);
|
||||
EXPORT_SYMBOL(dma_sync_sg_for_cpu);
|
||||
EXPORT_SYMBOL(dma_sync_sg_for_device);
|
||||
EXPORT_SYMBOL(dmabounce_register_dev);
|
||||
EXPORT_SYMBOL(dmabounce_unregister_dev);
|
||||
|
||||
|
|
|
@ -321,11 +321,42 @@ static void locomo_gpio_unmask_irq(unsigned int irq)
|
|||
locomo_writel(r, mapbase + LOCOMO_GIE);
|
||||
}
|
||||
|
||||
static int GPIO_IRQ_rising_edge;
|
||||
static int GPIO_IRQ_falling_edge;
|
||||
|
||||
static int locomo_gpio_type(unsigned int irq, unsigned int type)
|
||||
{
|
||||
unsigned int mask;
|
||||
void __iomem *mapbase = get_irq_chip_data(irq);
|
||||
|
||||
mask = 1 << (irq - LOCOMO_IRQ_GPIO_START);
|
||||
|
||||
if (type == IRQT_PROBE) {
|
||||
if ((GPIO_IRQ_rising_edge | GPIO_IRQ_falling_edge) & mask)
|
||||
return 0;
|
||||
type = __IRQT_RISEDGE | __IRQT_FALEDGE;
|
||||
}
|
||||
|
||||
if (type & __IRQT_RISEDGE)
|
||||
GPIO_IRQ_rising_edge |= mask;
|
||||
else
|
||||
GPIO_IRQ_rising_edge &= ~mask;
|
||||
if (type & __IRQT_FALEDGE)
|
||||
GPIO_IRQ_falling_edge |= mask;
|
||||
else
|
||||
GPIO_IRQ_falling_edge &= ~mask;
|
||||
locomo_writel(GPIO_IRQ_rising_edge, mapbase + LOCOMO_GRIE);
|
||||
locomo_writel(GPIO_IRQ_falling_edge, mapbase + LOCOMO_GFIE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct irq_chip locomo_gpio_chip = {
|
||||
.name = "LOCOMO-gpio",
|
||||
.ack = locomo_gpio_ack_irq,
|
||||
.mask = locomo_gpio_mask_irq,
|
||||
.unmask = locomo_gpio_unmask_irq,
|
||||
.name = "LOCOMO-gpio",
|
||||
.ack = locomo_gpio_ack_irq,
|
||||
.mask = locomo_gpio_mask_irq,
|
||||
.unmask = locomo_gpio_unmask_irq,
|
||||
.set_type = locomo_gpio_type,
|
||||
};
|
||||
|
||||
static void locomo_lt_handler(unsigned int irq, struct irq_desc *desc)
|
||||
|
@ -450,22 +481,18 @@ static void locomo_setup_irq(struct locomo *lchip)
|
|||
set_irq_chip(IRQ_LOCOMO_KEY_BASE, &locomo_chip);
|
||||
set_irq_chip_data(IRQ_LOCOMO_KEY_BASE, irqbase);
|
||||
set_irq_chained_handler(IRQ_LOCOMO_KEY_BASE, locomo_key_handler);
|
||||
set_irq_flags(IRQ_LOCOMO_KEY_BASE, IRQF_VALID | IRQF_PROBE);
|
||||
|
||||
set_irq_chip(IRQ_LOCOMO_GPIO_BASE, &locomo_chip);
|
||||
set_irq_chip_data(IRQ_LOCOMO_GPIO_BASE, irqbase);
|
||||
set_irq_chained_handler(IRQ_LOCOMO_GPIO_BASE, locomo_gpio_handler);
|
||||
set_irq_flags(IRQ_LOCOMO_GPIO_BASE, IRQF_VALID | IRQF_PROBE);
|
||||
|
||||
set_irq_chip(IRQ_LOCOMO_LT_BASE, &locomo_chip);
|
||||
set_irq_chip_data(IRQ_LOCOMO_LT_BASE, irqbase);
|
||||
set_irq_chained_handler(IRQ_LOCOMO_LT_BASE, locomo_lt_handler);
|
||||
set_irq_flags(IRQ_LOCOMO_LT_BASE, IRQF_VALID | IRQF_PROBE);
|
||||
|
||||
set_irq_chip(IRQ_LOCOMO_SPI_BASE, &locomo_chip);
|
||||
set_irq_chip_data(IRQ_LOCOMO_SPI_BASE, irqbase);
|
||||
set_irq_chained_handler(IRQ_LOCOMO_SPI_BASE, locomo_spi_handler);
|
||||
set_irq_flags(IRQ_LOCOMO_SPI_BASE, IRQF_VALID | IRQF_PROBE);
|
||||
|
||||
/* install handlers for IRQ_LOCOMO_KEY_BASE generated interrupts */
|
||||
set_irq_chip(LOCOMO_IRQ_KEY_START, &locomo_key_chip);
|
||||
|
@ -488,7 +515,7 @@ static void locomo_setup_irq(struct locomo *lchip)
|
|||
set_irq_flags(LOCOMO_IRQ_LT_START, IRQF_VALID | IRQF_PROBE);
|
||||
|
||||
/* install handlers for IRQ_LOCOMO_SPI_BASE generated interrupts */
|
||||
for (irq = LOCOMO_IRQ_SPI_START; irq < LOCOMO_IRQ_SPI_START + 3; irq++) {
|
||||
for (irq = LOCOMO_IRQ_SPI_START; irq < LOCOMO_IRQ_SPI_START + 4; irq++) {
|
||||
set_irq_chip(irq, &locomo_spi_chip);
|
||||
set_irq_chip_data(irq, irqbase);
|
||||
set_irq_handler(irq, handle_edge_irq);
|
||||
|
@ -574,20 +601,20 @@ static int locomo_suspend(struct platform_device *dev, pm_message_t state)
|
|||
|
||||
save->LCM_GPO = locomo_readl(lchip->base + LOCOMO_GPO); /* GPIO */
|
||||
locomo_writel(0x00, lchip->base + LOCOMO_GPO);
|
||||
save->LCM_SPICT = locomo_readl(lchip->base + LOCOMO_SPICT); /* SPI */
|
||||
save->LCM_SPICT = locomo_readl(lchip->base + LOCOMO_SPI + LOCOMO_SPICT); /* SPI */
|
||||
locomo_writel(0x40, lchip->base + LOCOMO_SPICT);
|
||||
save->LCM_GPE = locomo_readl(lchip->base + LOCOMO_GPE); /* GPIO */
|
||||
locomo_writel(0x00, lchip->base + LOCOMO_GPE);
|
||||
save->LCM_ASD = locomo_readl(lchip->base + LOCOMO_ASD); /* ADSTART */
|
||||
locomo_writel(0x00, lchip->base + LOCOMO_ASD);
|
||||
save->LCM_SPIMD = locomo_readl(lchip->base + LOCOMO_SPIMD); /* SPI */
|
||||
locomo_writel(0x3C14, lchip->base + LOCOMO_SPIMD);
|
||||
save->LCM_SPIMD = locomo_readl(lchip->base + LOCOMO_SPI + LOCOMO_SPIMD); /* SPI */
|
||||
locomo_writel(0x3C14, lchip->base + LOCOMO_SPI + LOCOMO_SPIMD);
|
||||
|
||||
locomo_writel(0x00, lchip->base + LOCOMO_PAIF);
|
||||
locomo_writel(0x00, lchip->base + LOCOMO_DAC);
|
||||
locomo_writel(0x00, lchip->base + LOCOMO_BACKLIGHT + LOCOMO_TC);
|
||||
|
||||
if ( (locomo_readl(lchip->base + LOCOMO_LED + LOCOMO_LPT0) & 0x88) && (locomo_readl(lchip->base + LOCOMO_LED + LOCOMO_LPT1) & 0x88) )
|
||||
if ((locomo_readl(lchip->base + LOCOMO_LED + LOCOMO_LPT0) & 0x88) && (locomo_readl(lchip->base + LOCOMO_LED + LOCOMO_LPT1) & 0x88))
|
||||
locomo_writel(0x00, lchip->base + LOCOMO_C32K); /* CLK32 off */
|
||||
else
|
||||
/* 18MHz already enabled, so no wait */
|
||||
|
@ -616,10 +643,10 @@ static int locomo_resume(struct platform_device *dev)
|
|||
spin_lock_irqsave(&lchip->lock, flags);
|
||||
|
||||
locomo_writel(save->LCM_GPO, lchip->base + LOCOMO_GPO);
|
||||
locomo_writel(save->LCM_SPICT, lchip->base + LOCOMO_SPICT);
|
||||
locomo_writel(save->LCM_SPICT, lchip->base + LOCOMO_SPI + LOCOMO_SPICT);
|
||||
locomo_writel(save->LCM_GPE, lchip->base + LOCOMO_GPE);
|
||||
locomo_writel(save->LCM_ASD, lchip->base + LOCOMO_ASD);
|
||||
locomo_writel(save->LCM_SPIMD, lchip->base + LOCOMO_SPIMD);
|
||||
locomo_writel(save->LCM_SPIMD, lchip->base + LOCOMO_SPI + LOCOMO_SPIMD);
|
||||
|
||||
locomo_writel(0x00, lchip->base + LOCOMO_C32K);
|
||||
locomo_writel(0x90, lchip->base + LOCOMO_TADC);
|
||||
|
@ -688,9 +715,9 @@ __locomo_probe(struct device *me, struct resource *mem, int irq)
|
|||
|
||||
/* GPIO */
|
||||
locomo_writel(0, lchip->base + LOCOMO_GPO);
|
||||
locomo_writel( (LOCOMO_GPIO(2) | LOCOMO_GPIO(3) | LOCOMO_GPIO(13) | LOCOMO_GPIO(14))
|
||||
locomo_writel((LOCOMO_GPIO(1) | LOCOMO_GPIO(2) | LOCOMO_GPIO(13) | LOCOMO_GPIO(14))
|
||||
, lchip->base + LOCOMO_GPE);
|
||||
locomo_writel( (LOCOMO_GPIO(2) | LOCOMO_GPIO(3) | LOCOMO_GPIO(13) | LOCOMO_GPIO(14))
|
||||
locomo_writel((LOCOMO_GPIO(1) | LOCOMO_GPIO(2) | LOCOMO_GPIO(13) | LOCOMO_GPIO(14))
|
||||
, lchip->base + LOCOMO_GPD);
|
||||
locomo_writel(0, lchip->base + LOCOMO_GIE);
|
||||
|
||||
|
@ -833,7 +860,10 @@ void locomo_gpio_set_dir(struct device *dev, unsigned int bits, unsigned int dir
|
|||
spin_lock_irqsave(&lchip->lock, flags);
|
||||
|
||||
r = locomo_readl(lchip->base + LOCOMO_GPD);
|
||||
r &= ~bits;
|
||||
if (dir)
|
||||
r |= bits;
|
||||
else
|
||||
r &= ~bits;
|
||||
locomo_writel(r, lchip->base + LOCOMO_GPD);
|
||||
|
||||
r = locomo_readl(lchip->base + LOCOMO_GPE);
|
||||
|
|
|
@ -179,3 +179,5 @@ EXPORT_SYMBOL(_find_next_zero_bit_be);
|
|||
EXPORT_SYMBOL(_find_first_bit_be);
|
||||
EXPORT_SYMBOL(_find_next_bit_be);
|
||||
#endif
|
||||
|
||||
EXPORT_SYMBOL(copy_page);
|
||||
|
|
|
@ -90,3 +90,5 @@ static void __exit arthur_exit(void)
|
|||
|
||||
module_init(arthur_init);
|
||||
module_exit(arthur_exit);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
|
@ -13,7 +13,6 @@
|
|||
#include <asm/pgtable.h>
|
||||
|
||||
static struct fs_struct init_fs = INIT_FS;
|
||||
static struct files_struct init_files = INIT_FILES;
|
||||
static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
|
||||
static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
|
||||
struct mm_struct init_mm = INIT_MM(init_mm);
|
||||
|
|
|
@ -34,23 +34,6 @@ extern unsigned long do_mremap(unsigned long addr, unsigned long old_len,
|
|||
unsigned long new_len, unsigned long flags,
|
||||
unsigned long new_addr);
|
||||
|
||||
/*
|
||||
* sys_pipe() is the normal C calling standard for creating
|
||||
* a pipe. It's not the way unix traditionally does this, though.
|
||||
*/
|
||||
asmlinkage int sys_pipe(unsigned long __user *fildes)
|
||||
{
|
||||
int fd[2];
|
||||
int error;
|
||||
|
||||
error = do_pipe(fd);
|
||||
if (!error) {
|
||||
if (copy_to_user(fildes, fd, 2*sizeof(int)))
|
||||
error = -EFAULT;
|
||||
}
|
||||
return error;
|
||||
}
|
||||
|
||||
/* common code for old and new mmaps */
|
||||
inline long do_mmap2(
|
||||
unsigned long addr, unsigned long len,
|
||||
|
|
|
@ -544,10 +544,10 @@ void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data)
|
|||
struct resource *fb_res = &lcdc_resources[2];
|
||||
size_t fb_len = fb_res->end - fb_res->start + 1;
|
||||
|
||||
fb = ioremap_writecombine(fb_res->start, fb_len);
|
||||
fb = ioremap(fb_res->start, fb_len);
|
||||
if (fb) {
|
||||
memset(fb, 0, fb_len);
|
||||
iounmap(fb, fb_len);
|
||||
iounmap(fb);
|
||||
}
|
||||
}
|
||||
lcdc_data = *data;
|
||||
|
|
|
@ -332,13 +332,6 @@ static struct resource lcdc_resources[] = {
|
|||
.end = AT91SAM9RL_ID_LCDC,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
#if defined(CONFIG_FB_INTSRAM)
|
||||
[2] = {
|
||||
.start = AT91SAM9RL_SRAM_BASE,
|
||||
.end = AT91SAM9RL_SRAM_BASE + AT91SAM9RL_SRAM_SIZE - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
#endif
|
||||
};
|
||||
|
||||
static struct platform_device at91_lcdc_device = {
|
||||
|
@ -381,20 +374,6 @@ void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data)
|
|||
at91_set_B_periph(AT91_PIN_PC24, 0); /* LCDD22 */
|
||||
at91_set_B_periph(AT91_PIN_PC25, 0); /* LCDD23 */
|
||||
|
||||
#ifdef CONFIG_FB_INTSRAM
|
||||
{
|
||||
void __iomem *fb;
|
||||
struct resource *fb_res = &lcdc_resources[2];
|
||||
size_t fb_len = fb_res->end - fb_res->start + 1;
|
||||
|
||||
fb = ioremap_writecombine(fb_res->start, fb_len);
|
||||
if (fb) {
|
||||
memset(fb, 0, fb_len);
|
||||
iounmap(fb, fb_len);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
lcdc_data = *data;
|
||||
platform_device_register(&at91_lcdc_device);
|
||||
}
|
||||
|
|
|
@ -16,16 +16,32 @@
|
|||
#include <asm/mach/arch.h>
|
||||
#include <asm/arch/at91x40.h>
|
||||
#include <asm/arch/at91_st.h>
|
||||
#include <asm/arch/timex.h>
|
||||
#include "generic.h"
|
||||
|
||||
/*
|
||||
* This is used in the gpio code, stub locally.
|
||||
* Export the clock functions for the AT91X40. Some external code common
|
||||
* to all AT91 family parts relys on this, like the gpio and serial support.
|
||||
*/
|
||||
int clk_enable(struct clk *clk)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void clk_disable(struct clk *clk)
|
||||
{
|
||||
}
|
||||
|
||||
unsigned long clk_get_rate(struct clk *clk)
|
||||
{
|
||||
return AT91X40_MASTER_CLOCK;
|
||||
}
|
||||
|
||||
struct clk *clk_get(struct device *dev, const char *id)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void __init at91x40_initialize(unsigned long main_clock)
|
||||
{
|
||||
at91_extern_irq = (1 << AT91X40_ID_IRQ0) | (1 << AT91X40_ID_IRQ1)
|
||||
|
|
|
@ -280,7 +280,7 @@ static int ep93xx_gpio_irq_type(unsigned int irq, unsigned int type)
|
|||
const int port = gpio >> 3;
|
||||
const int port_mask = 1 << (gpio & 7);
|
||||
|
||||
gpio_direction_output(gpio, gpio_get_value(gpio));
|
||||
gpio_direction_input(gpio);
|
||||
|
||||
switch (type) {
|
||||
case IRQT_RISING:
|
||||
|
|
|
@ -369,7 +369,8 @@ static int impd1_probe(struct lm_device *dev)
|
|||
|
||||
lm_set_drvdata(dev, impd1);
|
||||
|
||||
printk("IM-PD1 found at 0x%08lx\n", dev->resource.start);
|
||||
printk("IM-PD1 found at 0x%08lx\n",
|
||||
(unsigned long)dev->resource.start);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(impd1->vcos); i++) {
|
||||
impd1->vcos[i].owner = THIS_MODULE,
|
||||
|
|
|
@ -405,7 +405,6 @@ v3_pci_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
|
|||
addr, fsr, pc, instr, __raw_readl(SC_LBFADDR), __raw_readl(SC_LBFCODE) & 255,
|
||||
v3_readb(V3_LB_ISTAT));
|
||||
printk(KERN_DEBUG "%s", buf);
|
||||
printascii(buf);
|
||||
#endif
|
||||
|
||||
v3_writeb(V3_LB_ISTAT, 0);
|
||||
|
@ -447,6 +446,7 @@ static irqreturn_t v3_irq(int dummy, void *devid)
|
|||
unsigned long pc = instruction_pointer(regs);
|
||||
unsigned long instr = *(unsigned long *)pc;
|
||||
char buf[128];
|
||||
extern void printascii(const char *);
|
||||
|
||||
sprintf(buf, "V3 int %d: pc=0x%08lx [%08lx] LBFADDR=%08x LBFCODE=%02x "
|
||||
"ISTAT=%02x\n", IRQ_AP_V3INT, pc, instr,
|
||||
|
|
|
@ -62,7 +62,7 @@ static struct irq_chip ns9xxx_chip = {
|
|||
#if 0
|
||||
#define handle_irq handle_level_irq
|
||||
#else
|
||||
void handle_prio_irq(unsigned int irq, struct irq_desc *desc)
|
||||
static void handle_prio_irq(unsigned int irq, struct irq_desc *desc)
|
||||
{
|
||||
unsigned int cpu = smp_processor_id();
|
||||
struct irqaction *action;
|
||||
|
@ -70,27 +70,35 @@ void handle_prio_irq(unsigned int irq, struct irq_desc *desc)
|
|||
|
||||
spin_lock(&desc->lock);
|
||||
|
||||
if (unlikely(desc->status & IRQ_INPROGRESS))
|
||||
goto out_unlock;
|
||||
BUG_ON(desc->status & IRQ_INPROGRESS);
|
||||
|
||||
desc->status &= ~(IRQ_REPLAY | IRQ_WAITING);
|
||||
kstat_cpu(cpu).irqs[irq]++;
|
||||
|
||||
action = desc->action;
|
||||
if (unlikely(!action || (desc->status & IRQ_DISABLED)))
|
||||
goto out_unlock;
|
||||
goto out_mask;
|
||||
|
||||
desc->status |= IRQ_INPROGRESS;
|
||||
spin_unlock(&desc->lock);
|
||||
|
||||
action_ret = handle_IRQ_event(irq, action);
|
||||
|
||||
/* XXX: There is no direct way to access noirqdebug, so check
|
||||
* unconditionally for spurious irqs...
|
||||
* Maybe this function should go to kernel/irq/chip.c? */
|
||||
note_interrupt(irq, desc, action_ret);
|
||||
|
||||
spin_lock(&desc->lock);
|
||||
desc->status &= ~IRQ_INPROGRESS;
|
||||
if (!(desc->status & IRQ_DISABLED) && desc->chip->ack)
|
||||
desc->chip->ack(irq);
|
||||
|
||||
out_unlock:
|
||||
if (desc->status & IRQ_DISABLED)
|
||||
out_mask:
|
||||
desc->chip->mask(irq);
|
||||
|
||||
/* ack unconditionally to unmask lower prio irqs */
|
||||
desc->chip->ack(irq);
|
||||
|
||||
spin_unlock(&desc->lock);
|
||||
}
|
||||
#define handle_irq handle_prio_irq
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/tsc2102.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/apm-emulation.h>
|
||||
|
||||
|
@ -63,7 +62,7 @@ static const int palmte_keymap[] = {
|
|||
KEY(1, 1, KEY_DOWN),
|
||||
KEY(1, 2, KEY_UP),
|
||||
KEY(1, 3, KEY_RIGHT),
|
||||
KEY(1, 4, KEY_CENTER),
|
||||
KEY(1, 4, KEY_ENTER),
|
||||
0,
|
||||
};
|
||||
|
||||
|
@ -315,14 +314,6 @@ static void palmte_get_power_status(struct apm_power_info *info, int *battery)
|
|||
#define palmte_get_power_status NULL
|
||||
#endif
|
||||
|
||||
static struct tsc2102_config palmte_tsc2102_config = {
|
||||
.use_internal = 0,
|
||||
.monitor = TSC_BAT1 | TSC_AUX | TSC_TEMP,
|
||||
.temp_at25c = { 2200, 2615 },
|
||||
.apm_report = palmte_get_power_status,
|
||||
.alsa_config = &palmte_alsa_config,
|
||||
};
|
||||
|
||||
static struct omap_board_config_kernel palmte_config[] __initdata = {
|
||||
{ OMAP_TAG_USB, &palmte_usb_config },
|
||||
{ OMAP_TAG_MMC, &palmte_mmc_config },
|
||||
|
@ -336,7 +327,6 @@ static struct spi_board_info palmte_spi_info[] __initdata = {
|
|||
.bus_num = 2, /* uWire (officially) */
|
||||
.chip_select = 0, /* As opposed to 3 */
|
||||
.irq = OMAP_GPIO_IRQ(PALMTE_PINTDAV_GPIO),
|
||||
.platform_data = &palmte_tsc2102_config,
|
||||
.max_speed_hz = 8000000,
|
||||
},
|
||||
};
|
||||
|
|
|
@ -65,7 +65,7 @@ static int palmz71_keymap[] = {
|
|||
KEY(1, 1, KEY_DOWN),
|
||||
KEY(1, 2, KEY_UP),
|
||||
KEY(1, 3, KEY_RIGHT),
|
||||
KEY(1, 4, KEY_CENTER),
|
||||
KEY(1, 4, KEY_ENTER),
|
||||
KEY(2, 0, KEY_CAMERA),
|
||||
0,
|
||||
};
|
||||
|
|
|
@ -208,6 +208,7 @@ static void __init omap_2430sdp_init(void)
|
|||
|
||||
static void __init omap_2430sdp_map_io(void)
|
||||
{
|
||||
omap2_set_globals_243x();
|
||||
omap2_map_common_io();
|
||||
}
|
||||
|
||||
|
|
|
@ -394,6 +394,7 @@ static void __init omap_apollon_init(void)
|
|||
|
||||
static void __init omap_apollon_map_io(void)
|
||||
{
|
||||
omap2_set_globals_242x();
|
||||
omap2_map_common_io();
|
||||
}
|
||||
|
||||
|
|
|
@ -65,6 +65,7 @@ static void __init omap_generic_init(void)
|
|||
|
||||
static void __init omap_generic_map_io(void)
|
||||
{
|
||||
omap2_set_globals_242x(); /* should be 242x, 243x, or 343x */
|
||||
omap2_map_common_io();
|
||||
}
|
||||
|
||||
|
|
|
@ -420,6 +420,7 @@ static void __init omap_h4_init(void)
|
|||
|
||||
static void __init omap_h4_map_io(void)
|
||||
{
|
||||
omap2_set_globals_242x();
|
||||
omap2_map_common_io();
|
||||
}
|
||||
|
||||
|
|
|
@ -205,7 +205,9 @@ static void omap2_clk_wait_ready(struct clk *clk)
|
|||
/* REVISIT: What are the appropriate exclusions for 34XX? */
|
||||
/* OMAP3: ignore DSS-mod clocks */
|
||||
if (cpu_is_omap34xx() &&
|
||||
(((u32)reg & ~0xff) == (u32)OMAP_CM_REGADDR(OMAP3430_DSS_MOD, 0)))
|
||||
(((u32)reg & ~0xff) == (u32)OMAP_CM_REGADDR(OMAP3430_DSS_MOD, 0) ||
|
||||
((((u32)reg & ~0xff) == (u32)OMAP_CM_REGADDR(CORE_MOD, 0)) &&
|
||||
clk->enable_bit == OMAP3430_EN_SSI_SHIFT)))
|
||||
return;
|
||||
|
||||
/* Check if both functional and interface clocks
|
||||
|
|
|
@ -836,7 +836,8 @@ static struct clk dpll5_m2_ck = {
|
|||
.clksel_reg = OMAP_CM_REGADDR(PLL_MOD, OMAP3430ES2_CM_CLKSEL5),
|
||||
.clksel_mask = OMAP3430ES2_DIV_120M_MASK,
|
||||
.clksel = div16_dpll5_clksel,
|
||||
.flags = CLOCK_IN_OMAP3430ES2 | RATE_PROPAGATES,
|
||||
.flags = CLOCK_IN_OMAP3430ES2 | RATE_PROPAGATES |
|
||||
PARENT_CONTROLS_CLOCK,
|
||||
.recalc = &omap2_clksel_recalc,
|
||||
};
|
||||
|
||||
|
@ -1046,12 +1047,13 @@ static struct clk iva2_ck = {
|
|||
.name = "iva2_ck",
|
||||
.parent = &dpll2_m2_ck,
|
||||
.init = &omap2_init_clksel_parent,
|
||||
.enable_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, CM_FCLKEN),
|
||||
.enable_bit = OMAP3430_CM_FCLKEN_IVA2_EN_IVA2_SHIFT,
|
||||
.clksel_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD,
|
||||
OMAP3430_CM_IDLEST_PLL),
|
||||
.clksel_mask = OMAP3430_ST_IVA2_CLK_MASK,
|
||||
.clksel = iva2_clksel,
|
||||
.flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES |
|
||||
PARENT_CONTROLS_CLOCK,
|
||||
.flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES,
|
||||
.recalc = &omap2_clksel_recalc,
|
||||
};
|
||||
|
||||
|
@ -1836,7 +1838,8 @@ static struct clk omapctrl_ick = {
|
|||
static struct clk ssi_l4_ick = {
|
||||
.name = "ssi_l4_ick",
|
||||
.parent = &l4_ick,
|
||||
.flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES,
|
||||
.flags = CLOCK_IN_OMAP343X | RATE_PROPAGATES |
|
||||
PARENT_CONTROLS_CLOCK,
|
||||
.recalc = &followparent_recalc,
|
||||
};
|
||||
|
||||
|
@ -2344,7 +2347,7 @@ static struct clk gpio6_fck = {
|
|||
.name = "gpio6_fck",
|
||||
.parent = &per_32k_alwon_fck,
|
||||
.enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
|
||||
.enable_bit = OMAP3430_EN_GPT6_SHIFT,
|
||||
.enable_bit = OMAP3430_EN_GPIO6_SHIFT,
|
||||
.flags = CLOCK_IN_OMAP343X,
|
||||
.recalc = &followparent_recalc,
|
||||
};
|
||||
|
@ -2353,7 +2356,7 @@ static struct clk gpio5_fck = {
|
|||
.name = "gpio5_fck",
|
||||
.parent = &per_32k_alwon_fck,
|
||||
.enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
|
||||
.enable_bit = OMAP3430_EN_GPT5_SHIFT,
|
||||
.enable_bit = OMAP3430_EN_GPIO5_SHIFT,
|
||||
.flags = CLOCK_IN_OMAP343X,
|
||||
.recalc = &followparent_recalc,
|
||||
};
|
||||
|
@ -2362,7 +2365,7 @@ static struct clk gpio4_fck = {
|
|||
.name = "gpio4_fck",
|
||||
.parent = &per_32k_alwon_fck,
|
||||
.enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
|
||||
.enable_bit = OMAP3430_EN_GPT4_SHIFT,
|
||||
.enable_bit = OMAP3430_EN_GPIO4_SHIFT,
|
||||
.flags = CLOCK_IN_OMAP343X,
|
||||
.recalc = &followparent_recalc,
|
||||
};
|
||||
|
@ -2371,7 +2374,7 @@ static struct clk gpio3_fck = {
|
|||
.name = "gpio3_fck",
|
||||
.parent = &per_32k_alwon_fck,
|
||||
.enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
|
||||
.enable_bit = OMAP3430_EN_GPT3_SHIFT,
|
||||
.enable_bit = OMAP3430_EN_GPIO3_SHIFT,
|
||||
.flags = CLOCK_IN_OMAP343X,
|
||||
.recalc = &followparent_recalc,
|
||||
};
|
||||
|
@ -2380,7 +2383,7 @@ static struct clk gpio2_fck = {
|
|||
.name = "gpio2_fck",
|
||||
.parent = &per_32k_alwon_fck,
|
||||
.enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
|
||||
.enable_bit = OMAP3430_EN_GPT2_SHIFT,
|
||||
.enable_bit = OMAP3430_EN_GPIO2_SHIFT,
|
||||
.flags = CLOCK_IN_OMAP343X,
|
||||
.recalc = &followparent_recalc,
|
||||
};
|
||||
|
|
|
@ -56,6 +56,7 @@
|
|||
|
||||
/* CM_FCLKEN_IVA2 */
|
||||
#define OMAP3430_CM_FCLKEN_IVA2_EN_IVA2 (1 << 0)
|
||||
#define OMAP3430_CM_FCLKEN_IVA2_EN_IVA2_SHIFT 0
|
||||
|
||||
/* CM_CLKEN_PLL_IVA2 */
|
||||
#define OMAP3430_IVA2_DPLL_RAMPTIME_SHIFT 8
|
||||
|
|
|
@ -42,7 +42,7 @@
|
|||
#define GPMC_STATUS 0x54
|
||||
#define GPMC_PREFETCH_CONFIG1 0x1e0
|
||||
#define GPMC_PREFETCH_CONFIG2 0x1e4
|
||||
#define GPMC_PREFETCH_CONTROL 0x1e8
|
||||
#define GPMC_PREFETCH_CONTROL 0x1ec
|
||||
#define GPMC_PREFETCH_STATUS 0x1f0
|
||||
#define GPMC_ECC_CONFIG 0x1f4
|
||||
#define GPMC_ECC_CONTROL 0x1f8
|
||||
|
|
|
@ -70,6 +70,9 @@ struct omap_mbox2_priv {
|
|||
|
||||
static struct clk *mbox_ick_handle;
|
||||
|
||||
static void omap2_mbox_enable_irq(struct omap_mbox *mbox,
|
||||
omap_mbox_type_t irq);
|
||||
|
||||
static inline unsigned int mbox_read_reg(unsigned int reg)
|
||||
{
|
||||
return __raw_readl(mbox_base + reg);
|
||||
|
@ -81,7 +84,7 @@ static inline void mbox_write_reg(unsigned int val, unsigned int reg)
|
|||
}
|
||||
|
||||
/* Mailbox H/W preparations */
|
||||
static inline int omap2_mbox_startup(struct omap_mbox *mbox)
|
||||
static int omap2_mbox_startup(struct omap_mbox *mbox)
|
||||
{
|
||||
unsigned int l;
|
||||
|
||||
|
@ -97,38 +100,40 @@ static inline int omap2_mbox_startup(struct omap_mbox *mbox)
|
|||
l |= 0x00000011;
|
||||
mbox_write_reg(l, MAILBOX_SYSCONFIG);
|
||||
|
||||
omap2_mbox_enable_irq(mbox, IRQ_RX);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void omap2_mbox_shutdown(struct omap_mbox *mbox)
|
||||
static void omap2_mbox_shutdown(struct omap_mbox *mbox)
|
||||
{
|
||||
clk_disable(mbox_ick_handle);
|
||||
clk_put(mbox_ick_handle);
|
||||
}
|
||||
|
||||
/* Mailbox FIFO handle functions */
|
||||
static inline mbox_msg_t omap2_mbox_fifo_read(struct omap_mbox *mbox)
|
||||
static mbox_msg_t omap2_mbox_fifo_read(struct omap_mbox *mbox)
|
||||
{
|
||||
struct omap_mbox2_fifo *fifo =
|
||||
&((struct omap_mbox2_priv *)mbox->priv)->rx_fifo;
|
||||
return (mbox_msg_t) mbox_read_reg(fifo->msg);
|
||||
}
|
||||
|
||||
static inline void omap2_mbox_fifo_write(struct omap_mbox *mbox, mbox_msg_t msg)
|
||||
static void omap2_mbox_fifo_write(struct omap_mbox *mbox, mbox_msg_t msg)
|
||||
{
|
||||
struct omap_mbox2_fifo *fifo =
|
||||
&((struct omap_mbox2_priv *)mbox->priv)->tx_fifo;
|
||||
mbox_write_reg(msg, fifo->msg);
|
||||
}
|
||||
|
||||
static inline int omap2_mbox_fifo_empty(struct omap_mbox *mbox)
|
||||
static int omap2_mbox_fifo_empty(struct omap_mbox *mbox)
|
||||
{
|
||||
struct omap_mbox2_fifo *fifo =
|
||||
&((struct omap_mbox2_priv *)mbox->priv)->rx_fifo;
|
||||
return (mbox_read_reg(fifo->msg_stat) == 0);
|
||||
}
|
||||
|
||||
static inline int omap2_mbox_fifo_full(struct omap_mbox *mbox)
|
||||
static int omap2_mbox_fifo_full(struct omap_mbox *mbox)
|
||||
{
|
||||
struct omap_mbox2_fifo *fifo =
|
||||
&((struct omap_mbox2_priv *)mbox->priv)->tx_fifo;
|
||||
|
@ -136,7 +141,7 @@ static inline int omap2_mbox_fifo_full(struct omap_mbox *mbox)
|
|||
}
|
||||
|
||||
/* Mailbox IRQ handle functions */
|
||||
static inline void omap2_mbox_enable_irq(struct omap_mbox *mbox,
|
||||
static void omap2_mbox_enable_irq(struct omap_mbox *mbox,
|
||||
omap_mbox_type_t irq)
|
||||
{
|
||||
struct omap_mbox2_priv *p = (struct omap_mbox2_priv *)mbox->priv;
|
||||
|
@ -147,7 +152,7 @@ static inline void omap2_mbox_enable_irq(struct omap_mbox *mbox,
|
|||
mbox_write_reg(l, p->irqenable);
|
||||
}
|
||||
|
||||
static inline void omap2_mbox_disable_irq(struct omap_mbox *mbox,
|
||||
static void omap2_mbox_disable_irq(struct omap_mbox *mbox,
|
||||
omap_mbox_type_t irq)
|
||||
{
|
||||
struct omap_mbox2_priv *p = (struct omap_mbox2_priv *)mbox->priv;
|
||||
|
@ -158,7 +163,7 @@ static inline void omap2_mbox_disable_irq(struct omap_mbox *mbox,
|
|||
mbox_write_reg(l, p->irqenable);
|
||||
}
|
||||
|
||||
static inline void omap2_mbox_ack_irq(struct omap_mbox *mbox,
|
||||
static void omap2_mbox_ack_irq(struct omap_mbox *mbox,
|
||||
omap_mbox_type_t irq)
|
||||
{
|
||||
struct omap_mbox2_priv *p = (struct omap_mbox2_priv *)mbox->priv;
|
||||
|
@ -167,7 +172,7 @@ static inline void omap2_mbox_ack_irq(struct omap_mbox *mbox,
|
|||
mbox_write_reg(bit, p->irqstatus);
|
||||
}
|
||||
|
||||
static inline int omap2_mbox_is_irq(struct omap_mbox *mbox,
|
||||
static int omap2_mbox_is_irq(struct omap_mbox *mbox,
|
||||
omap_mbox_type_t irq)
|
||||
{
|
||||
struct omap_mbox2_priv *p = (struct omap_mbox2_priv *)mbox->priv;
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
|
||||
/*
|
||||
* Architecture-specific global PRM registers
|
||||
* Use prm_{read,write}_reg() with these registers.
|
||||
* Use __raw_{read,write}l() with these registers.
|
||||
*
|
||||
* With a few exceptions, these are the register names beginning with
|
||||
* PRCM_* on 24xx, and PRM_* on 34xx. (The exceptions are the
|
||||
|
|
|
@ -34,11 +34,7 @@
|
|||
* Non-CPU Masters address decoding --
|
||||
* Unlike the CPU, we setup the access from Orion's master interfaces to DDR
|
||||
* banks only (the typical use case).
|
||||
* Setup access for each master to DDR is issued by common.c.
|
||||
*
|
||||
* Note: although orion_setbits() and orion_clrbits() are not atomic
|
||||
* no locking is necessary here since code in this file is only called
|
||||
* at boot time when there is no concurrency issues.
|
||||
* Setup access for each master to DDR is issued by platform device setup.
|
||||
*/
|
||||
|
||||
/*
|
||||
|
@ -48,10 +44,6 @@
|
|||
#define TARGET_DEV_BUS 1
|
||||
#define TARGET_PCI 3
|
||||
#define TARGET_PCIE 4
|
||||
#define ATTR_DDR_CS(n) (((n) ==0) ? 0xe : \
|
||||
((n) == 1) ? 0xd : \
|
||||
((n) == 2) ? 0xb : \
|
||||
((n) == 3) ? 0x7 : 0xf)
|
||||
#define ATTR_PCIE_MEM 0x59
|
||||
#define ATTR_PCIE_IO 0x51
|
||||
#define ATTR_PCIE_WA 0x79
|
||||
|
@ -61,17 +53,12 @@
|
|||
#define ATTR_DEV_CS1 0x1d
|
||||
#define ATTR_DEV_CS2 0x1b
|
||||
#define ATTR_DEV_BOOT 0xf
|
||||
#define WIN_EN 1
|
||||
|
||||
/*
|
||||
* Helpers to get DDR bank info
|
||||
*/
|
||||
#define DDR_BASE_CS(n) ORION5X_DDR_REG(0x1500 + ((n) * 8))
|
||||
#define DDR_SIZE_CS(n) ORION5X_DDR_REG(0x1504 + ((n) * 8))
|
||||
#define DDR_MAX_CS 4
|
||||
#define DDR_REG_TO_SIZE(reg) (((reg) | 0xffffff) + 1)
|
||||
#define DDR_REG_TO_BASE(reg) ((reg) & 0xff000000)
|
||||
#define DDR_BANK_EN 1
|
||||
#define DDR_BASE_CS(n) ORION5X_DDR_REG(0x1500 + ((n) << 3))
|
||||
#define DDR_SIZE_CS(n) ORION5X_DDR_REG(0x1504 + ((n) << 3))
|
||||
|
||||
/*
|
||||
* CPU Address Decode Windows registers
|
||||
|
@ -81,17 +68,6 @@
|
|||
#define CPU_WIN_REMAP_LO(n) ORION5X_BRIDGE_REG(0x008 | ((n) << 4))
|
||||
#define CPU_WIN_REMAP_HI(n) ORION5X_BRIDGE_REG(0x00c | ((n) << 4))
|
||||
|
||||
/*
|
||||
* Gigabit Ethernet Address Decode Windows registers
|
||||
*/
|
||||
#define ETH_WIN_BASE(win) ORION5X_ETH_REG(0x200 + ((win) * 8))
|
||||
#define ETH_WIN_SIZE(win) ORION5X_ETH_REG(0x204 + ((win) * 8))
|
||||
#define ETH_WIN_REMAP(win) ORION5X_ETH_REG(0x280 + ((win) * 4))
|
||||
#define ETH_WIN_EN ORION5X_ETH_REG(0x290)
|
||||
#define ETH_WIN_PROT ORION5X_ETH_REG(0x294)
|
||||
#define ETH_MAX_WIN 6
|
||||
#define ETH_MAX_REMAP_WIN 4
|
||||
|
||||
|
||||
struct mbus_dram_target_info orion5x_mbus_dram_info;
|
||||
|
||||
|
@ -202,39 +178,3 @@ void __init orion5x_setup_pcie_wa_win(u32 base, u32 size)
|
|||
{
|
||||
setup_cpu_win(7, base, size, TARGET_PCIE, ATTR_PCIE_WA, -1);
|
||||
}
|
||||
|
||||
void __init orion5x_setup_eth_wins(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
/*
|
||||
* First, disable and clear windows
|
||||
*/
|
||||
for (i = 0; i < ETH_MAX_WIN; i++) {
|
||||
orion5x_write(ETH_WIN_BASE(i), 0);
|
||||
orion5x_write(ETH_WIN_SIZE(i), 0);
|
||||
orion5x_setbits(ETH_WIN_EN, 1 << i);
|
||||
orion5x_clrbits(ETH_WIN_PROT, 0x3 << (i * 2));
|
||||
if (i < ETH_MAX_REMAP_WIN)
|
||||
orion5x_write(ETH_WIN_REMAP(i), 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Setup windows for DDR banks.
|
||||
*/
|
||||
for (i = 0; i < DDR_MAX_CS; i++) {
|
||||
u32 base, size;
|
||||
size = orion5x_read(DDR_SIZE_CS(i));
|
||||
base = orion5x_read(DDR_BASE_CS(i));
|
||||
if (size & DDR_BANK_EN) {
|
||||
base = DDR_REG_TO_BASE(base);
|
||||
size = DDR_REG_TO_SIZE(size);
|
||||
orion5x_write(ETH_WIN_SIZE(i), (size-1) & 0xffff0000);
|
||||
orion5x_write(ETH_WIN_BASE(i), (base & 0xffff0000) |
|
||||
(ATTR_DDR_CS(i) << 8) |
|
||||
TARGET_DDR);
|
||||
orion5x_clrbits(ETH_WIN_EN, 1 << i);
|
||||
orion5x_setbits(ETH_WIN_PROT, 0x3 << (i * 2));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -190,6 +190,11 @@ static struct platform_device orion5x_ehci1 = {
|
|||
* (The Orion and Discovery (MV643xx) families use the same Ethernet driver)
|
||||
****************************************************************************/
|
||||
|
||||
struct mv643xx_eth_shared_platform_data orion5x_eth_shared_data = {
|
||||
.dram = &orion5x_mbus_dram_info,
|
||||
.t_clk = ORION5X_TCLK,
|
||||
};
|
||||
|
||||
static struct resource orion5x_eth_shared_resources[] = {
|
||||
{
|
||||
.start = ORION5X_ETH_PHYS_BASE + 0x2000,
|
||||
|
@ -201,6 +206,9 @@ static struct resource orion5x_eth_shared_resources[] = {
|
|||
static struct platform_device orion5x_eth_shared = {
|
||||
.name = MV643XX_ETH_SHARED_NAME,
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &orion5x_eth_shared_data,
|
||||
},
|
||||
.num_resources = 1,
|
||||
.resource = orion5x_eth_shared_resources,
|
||||
};
|
||||
|
@ -223,7 +231,9 @@ static struct platform_device orion5x_eth = {
|
|||
|
||||
void __init orion5x_eth_init(struct mv643xx_eth_platform_data *eth_data)
|
||||
{
|
||||
eth_data->shared = &orion5x_eth_shared;
|
||||
orion5x_eth.dev.platform_data = eth_data;
|
||||
|
||||
platform_device_register(&orion5x_eth_shared);
|
||||
platform_device_register(&orion5x_eth);
|
||||
}
|
||||
|
@ -360,7 +370,6 @@ void __init orion5x_init(void)
|
|||
* Setup Orion address map
|
||||
*/
|
||||
orion5x_setup_cpu_mbus_bridge();
|
||||
orion5x_setup_eth_wins();
|
||||
|
||||
/*
|
||||
* Register devices.
|
||||
|
|
|
@ -22,7 +22,6 @@ void orion5x_setup_dev0_win(u32 base, u32 size);
|
|||
void orion5x_setup_dev1_win(u32 base, u32 size);
|
||||
void orion5x_setup_dev2_win(u32 base, u32 size);
|
||||
void orion5x_setup_pcie_wa_win(u32 base, u32 size);
|
||||
void orion5x_setup_eth_wins(void);
|
||||
|
||||
/*
|
||||
* Shared code used internally by other Orion core functions.
|
||||
|
|
|
@ -58,7 +58,7 @@ static int __init dns323_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
|
|||
}
|
||||
|
||||
static struct hw_pci dns323_pci __initdata = {
|
||||
.nr_controllers = 1,
|
||||
.nr_controllers = 2,
|
||||
.swizzle = pci_std_swizzle,
|
||||
.setup = orion5x_pci_sys_setup,
|
||||
.scan = orion5x_pci_sys_scan_bus,
|
||||
|
|
|
@ -138,7 +138,7 @@ static int __init kurobox_pro_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
|
|||
}
|
||||
|
||||
static struct hw_pci kurobox_pro_pci __initdata = {
|
||||
.nr_controllers = 1,
|
||||
.nr_controllers = 2,
|
||||
.swizzle = pci_std_swizzle,
|
||||
.setup = orion5x_pci_sys_setup,
|
||||
.scan = orion5x_pci_sys_scan_bus,
|
||||
|
|
|
@ -5,6 +5,13 @@
|
|||
# Common support (must be linked before board specific support)
|
||||
obj-y += clock.o devices.o generic.o irq.o dma.o \
|
||||
time.o gpio.o
|
||||
obj-$(CONFIG_PM) += pm.o sleep.o standby.o
|
||||
obj-$(CONFIG_CPU_FREQ) += cpu-pxa.o
|
||||
|
||||
# Generic drivers that other drivers may depend upon
|
||||
obj-$(CONFIG_PXA_SSP) += ssp.o
|
||||
|
||||
# SoC-specific code
|
||||
obj-$(CONFIG_PXA25x) += mfp-pxa2xx.o pxa25x.o
|
||||
obj-$(CONFIG_PXA27x) += mfp-pxa2xx.o pxa27x.o
|
||||
obj-$(CONFIG_PXA3xx) += mfp-pxa3xx.o pxa3xx.o smemc.o
|
||||
|
@ -48,11 +55,6 @@ led-$(CONFIG_MACH_TRIZEPS4) += leds-trizeps4.o
|
|||
|
||||
obj-$(CONFIG_LEDS) += $(led-y)
|
||||
|
||||
# Misc features
|
||||
obj-$(CONFIG_PM) += pm.o sleep.o standby.o
|
||||
obj-$(CONFIG_CPU_FREQ) += cpu-pxa.o
|
||||
obj-$(CONFIG_PXA_SSP) += ssp.o
|
||||
|
||||
ifeq ($(CONFIG_PCI),y)
|
||||
obj-$(CONFIG_MACH_ARMCORE) += cm-x270-pci.o
|
||||
endif
|
||||
|
|
|
@ -59,7 +59,7 @@ static struct resource cmx270_dm9k_resource[] = {
|
|||
[2] = {
|
||||
.start = CMX270_ETHIRQ,
|
||||
.end = CMX270_ETHIRQ,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -98,7 +98,7 @@ static struct resource dm9000_resources[] = {
|
|||
[2] = {
|
||||
.start = COLIBRI_ETH_IRQ,
|
||||
.end = COLIBRI_ETH_IRQ,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
.flags = IORESOURCE_IRQ | IRQF_TRIGGER_RISING,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -119,7 +119,6 @@ static void __init colibri_init(void)
|
|||
/* DM9000 LAN */
|
||||
pxa_gpio_mode(GPIO78_nCS_2_MD);
|
||||
pxa_gpio_mode(GPIO_DM9000 | GPIO_IN);
|
||||
set_irq_type(COLIBRI_ETH_IRQ, IRQT_FALLING);
|
||||
|
||||
platform_add_devices(colibri_devices, ARRAY_SIZE(colibri_devices));
|
||||
}
|
||||
|
|
|
@ -493,8 +493,6 @@ static struct platform_device *devices[] __initdata = {
|
|||
|
||||
static void corgi_poweroff(void)
|
||||
{
|
||||
RCSR = RCSR_HWR | RCSR_WDR | RCSR_SMR | RCSR_GPR;
|
||||
|
||||
if (!machine_is_corgi())
|
||||
/* Green LED off tells the bootloader to halt */
|
||||
reset_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_LED_GREEN);
|
||||
|
@ -503,8 +501,6 @@ static void corgi_poweroff(void)
|
|||
|
||||
static void corgi_restart(char mode)
|
||||
{
|
||||
RCSR = RCSR_HWR | RCSR_WDR | RCSR_SMR | RCSR_GPR;
|
||||
|
||||
if (!machine_is_corgi())
|
||||
/* Green LED on tells the bootloader to reboot */
|
||||
set_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_LED_GREEN);
|
||||
|
|
|
@ -49,125 +49,216 @@ MODULE_PARM_DESC(freq_debug, "Set the debug messages to on=1/off=0");
|
|||
#define freq_debug 0
|
||||
#endif
|
||||
|
||||
static unsigned int pxa27x_maxfreq;
|
||||
module_param(pxa27x_maxfreq, uint, 0);
|
||||
MODULE_PARM_DESC(pxa27x_maxfreq, "Set the pxa27x maxfreq in MHz"
|
||||
"(typically 624=>pxa270, 416=>pxa271, 520=>pxa272)");
|
||||
|
||||
typedef struct {
|
||||
unsigned int khz;
|
||||
unsigned int membus;
|
||||
unsigned int cccr;
|
||||
unsigned int div2;
|
||||
unsigned int cclkcfg;
|
||||
} pxa_freqs_t;
|
||||
|
||||
/* Define the refresh period in mSec for the SDRAM and the number of rows */
|
||||
#define SDRAM_TREF 64 /* standard 64ms SDRAM */
|
||||
#define SDRAM_ROWS 4096 /* 64MB=8192 32MB=4096 */
|
||||
#define MDREFR_DRI(x) (((x) * SDRAM_TREF) / (SDRAM_ROWS * 32))
|
||||
|
||||
#define CCLKCFG_TURBO 0x1
|
||||
#define CCLKCFG_FCS 0x2
|
||||
#define PXA25x_MIN_FREQ 99500
|
||||
#define PXA25x_MAX_FREQ 398100
|
||||
#define MDREFR_DB2_MASK (MDREFR_K2DB2 | MDREFR_K1DB2)
|
||||
#define MDREFR_DRI_MASK 0xFFF
|
||||
#define SDRAM_TREF 64 /* standard 64ms SDRAM */
|
||||
#define SDRAM_ROWS 4096 /* 64MB=8192 32MB=4096 */
|
||||
|
||||
#define CCLKCFG_TURBO 0x1
|
||||
#define CCLKCFG_FCS 0x2
|
||||
#define CCLKCFG_HALFTURBO 0x4
|
||||
#define CCLKCFG_FASTBUS 0x8
|
||||
#define MDREFR_DB2_MASK (MDREFR_K2DB2 | MDREFR_K1DB2)
|
||||
#define MDREFR_DRI_MASK 0xFFF
|
||||
|
||||
/*
|
||||
* PXA255 definitions
|
||||
*/
|
||||
/* Use the run mode frequencies for the CPUFREQ_POLICY_PERFORMANCE policy */
|
||||
#define CCLKCFG CCLKCFG_TURBO | CCLKCFG_FCS
|
||||
|
||||
static pxa_freqs_t pxa255_run_freqs[] =
|
||||
{
|
||||
/* CPU MEMBUS CCCR DIV2*/
|
||||
{ 99500, 99500, 0x121, 1}, /* run= 99, turbo= 99, PXbus=50, SDRAM=50 */
|
||||
{132700, 132700, 0x123, 1}, /* run=133, turbo=133, PXbus=66, SDRAM=66 */
|
||||
{199100, 99500, 0x141, 0}, /* run=199, turbo=199, PXbus=99, SDRAM=99 */
|
||||
{265400, 132700, 0x143, 1}, /* run=265, turbo=265, PXbus=133, SDRAM=66 */
|
||||
{331800, 165900, 0x145, 1}, /* run=331, turbo=331, PXbus=166, SDRAM=83 */
|
||||
{398100, 99500, 0x161, 0}, /* run=398, turbo=398, PXbus=196, SDRAM=99 */
|
||||
{0,}
|
||||
/* CPU MEMBUS CCCR DIV2 CCLKCFG run turbo PXbus SDRAM */
|
||||
{ 99500, 99500, 0x121, 1, CCLKCFG}, /* 99, 99, 50, 50 */
|
||||
{132700, 132700, 0x123, 1, CCLKCFG}, /* 133, 133, 66, 66 */
|
||||
{199100, 99500, 0x141, 0, CCLKCFG}, /* 199, 199, 99, 99 */
|
||||
{265400, 132700, 0x143, 1, CCLKCFG}, /* 265, 265, 133, 66 */
|
||||
{331800, 165900, 0x145, 1, CCLKCFG}, /* 331, 331, 166, 83 */
|
||||
{398100, 99500, 0x161, 0, CCLKCFG}, /* 398, 398, 196, 99 */
|
||||
};
|
||||
#define NUM_RUN_FREQS ARRAY_SIZE(pxa255_run_freqs)
|
||||
|
||||
static struct cpufreq_frequency_table pxa255_run_freq_table[NUM_RUN_FREQS+1];
|
||||
|
||||
/* Use the turbo mode frequencies for the CPUFREQ_POLICY_POWERSAVE policy */
|
||||
static pxa_freqs_t pxa255_turbo_freqs[] =
|
||||
{
|
||||
/* CPU MEMBUS CCCR DIV2*/
|
||||
{ 99500, 99500, 0x121, 1}, /* run=99, turbo= 99, PXbus=50, SDRAM=50 */
|
||||
{199100, 99500, 0x221, 0}, /* run=99, turbo=199, PXbus=50, SDRAM=99 */
|
||||
{298500, 99500, 0x321, 0}, /* run=99, turbo=287, PXbus=50, SDRAM=99 */
|
||||
{298600, 99500, 0x1c1, 0}, /* run=199, turbo=287, PXbus=99, SDRAM=99 */
|
||||
{398100, 99500, 0x241, 0}, /* run=199, turbo=398, PXbus=99, SDRAM=99 */
|
||||
{0,}
|
||||
/* CPU MEMBUS CCCR DIV2 CCLKCFG run turbo PXbus SDRAM */
|
||||
{ 99500, 99500, 0x121, 1, CCLKCFG}, /* 99, 99, 50, 50 */
|
||||
{199100, 99500, 0x221, 0, CCLKCFG}, /* 99, 199, 50, 99 */
|
||||
{298500, 99500, 0x321, 0, CCLKCFG}, /* 99, 287, 50, 99 */
|
||||
{298600, 99500, 0x1c1, 0, CCLKCFG}, /* 199, 287, 99, 99 */
|
||||
{398100, 99500, 0x241, 0, CCLKCFG}, /* 199, 398, 99, 99 */
|
||||
};
|
||||
#define NUM_TURBO_FREQS ARRAY_SIZE(pxa255_turbo_freqs)
|
||||
|
||||
static struct cpufreq_frequency_table pxa255_turbo_freq_table[NUM_TURBO_FREQS+1];
|
||||
#define NUM_PXA25x_RUN_FREQS ARRAY_SIZE(pxa255_run_freqs)
|
||||
#define NUM_PXA25x_TURBO_FREQS ARRAY_SIZE(pxa255_turbo_freqs)
|
||||
|
||||
static struct cpufreq_frequency_table
|
||||
pxa255_run_freq_table[NUM_PXA25x_RUN_FREQS+1];
|
||||
static struct cpufreq_frequency_table
|
||||
pxa255_turbo_freq_table[NUM_PXA25x_TURBO_FREQS+1];
|
||||
|
||||
/*
|
||||
* PXA270 definitions
|
||||
*
|
||||
* For the PXA27x:
|
||||
* Control variables are A, L, 2N for CCCR; B, HT, T for CLKCFG.
|
||||
*
|
||||
* A = 0 => memory controller clock from table 3-7,
|
||||
* A = 1 => memory controller clock = system bus clock
|
||||
* Run mode frequency = 13 MHz * L
|
||||
* Turbo mode frequency = 13 MHz * L * N
|
||||
* System bus frequency = 13 MHz * L / (B + 1)
|
||||
*
|
||||
* In CCCR:
|
||||
* A = 1
|
||||
* L = 16 oscillator to run mode ratio
|
||||
* 2N = 6 2 * (turbo mode to run mode ratio)
|
||||
*
|
||||
* In CCLKCFG:
|
||||
* B = 1 Fast bus mode
|
||||
* HT = 0 Half-Turbo mode
|
||||
* T = 1 Turbo mode
|
||||
*
|
||||
* For now, just support some of the combinations in table 3-7 of
|
||||
* PXA27x Processor Family Developer's Manual to simplify frequency
|
||||
* change sequences.
|
||||
*/
|
||||
#define PXA27x_CCCR(A, L, N2) (A << 25 | N2 << 7 | L)
|
||||
#define CCLKCFG2(B, HT, T) \
|
||||
(CCLKCFG_FCS | \
|
||||
((B) ? CCLKCFG_FASTBUS : 0) | \
|
||||
((HT) ? CCLKCFG_HALFTURBO : 0) | \
|
||||
((T) ? CCLKCFG_TURBO : 0))
|
||||
|
||||
static pxa_freqs_t pxa27x_freqs[] = {
|
||||
{104000, 104000, PXA27x_CCCR(1, 8, 2), 0, CCLKCFG2(1, 0, 1)},
|
||||
{156000, 104000, PXA27x_CCCR(1, 8, 6), 0, CCLKCFG2(1, 1, 1)},
|
||||
{208000, 208000, PXA27x_CCCR(0, 16, 2), 1, CCLKCFG2(0, 0, 1)},
|
||||
{312000, 208000, PXA27x_CCCR(1, 16, 3), 1, CCLKCFG2(1, 0, 1)},
|
||||
{416000, 208000, PXA27x_CCCR(1, 16, 4), 1, CCLKCFG2(1, 0, 1)},
|
||||
{520000, 208000, PXA27x_CCCR(1, 16, 5), 1, CCLKCFG2(1, 0, 1)},
|
||||
{624000, 208000, PXA27x_CCCR(1, 16, 6), 1, CCLKCFG2(1, 0, 1)}
|
||||
};
|
||||
|
||||
#define NUM_PXA27x_FREQS ARRAY_SIZE(pxa27x_freqs)
|
||||
static struct cpufreq_frequency_table
|
||||
pxa27x_freq_table[NUM_PXA27x_FREQS+1];
|
||||
|
||||
extern unsigned get_clk_frequency_khz(int info);
|
||||
|
||||
static void find_freq_tables(struct cpufreq_policy *policy,
|
||||
struct cpufreq_frequency_table **freq_table,
|
||||
pxa_freqs_t **pxa_freqs)
|
||||
{
|
||||
if (cpu_is_pxa25x()) {
|
||||
if (policy->policy == CPUFREQ_POLICY_PERFORMANCE) {
|
||||
*pxa_freqs = pxa255_run_freqs;
|
||||
*freq_table = pxa255_run_freq_table;
|
||||
} else if (policy->policy == CPUFREQ_POLICY_POWERSAVE) {
|
||||
*pxa_freqs = pxa255_turbo_freqs;
|
||||
*freq_table = pxa255_turbo_freq_table;
|
||||
} else {
|
||||
printk("CPU PXA: Unknown policy found. "
|
||||
"Using CPUFREQ_POLICY_PERFORMANCE\n");
|
||||
*pxa_freqs = pxa255_run_freqs;
|
||||
*freq_table = pxa255_run_freq_table;
|
||||
}
|
||||
}
|
||||
if (cpu_is_pxa27x()) {
|
||||
*pxa_freqs = pxa27x_freqs;
|
||||
*freq_table = pxa27x_freq_table;
|
||||
}
|
||||
}
|
||||
|
||||
static void pxa27x_guess_max_freq(void)
|
||||
{
|
||||
if (!pxa27x_maxfreq) {
|
||||
pxa27x_maxfreq = 416000;
|
||||
printk(KERN_INFO "PXA CPU 27x max frequency not defined "
|
||||
"(pxa27x_maxfreq), assuming pxa271 with %dkHz maxfreq\n",
|
||||
pxa27x_maxfreq);
|
||||
} else {
|
||||
pxa27x_maxfreq *= 1000;
|
||||
}
|
||||
}
|
||||
|
||||
static u32 mdrefr_dri(unsigned int freq)
|
||||
{
|
||||
u32 dri = 0;
|
||||
|
||||
if (cpu_is_pxa25x())
|
||||
dri = ((freq * SDRAM_TREF) / (SDRAM_ROWS * 32));
|
||||
if (cpu_is_pxa27x())
|
||||
dri = ((freq * SDRAM_TREF) / (SDRAM_ROWS - 31)) / 32;
|
||||
return dri;
|
||||
}
|
||||
|
||||
/* find a valid frequency point */
|
||||
static int pxa_verify_policy(struct cpufreq_policy *policy)
|
||||
{
|
||||
struct cpufreq_frequency_table *pxa_freqs_table;
|
||||
pxa_freqs_t *pxa_freqs;
|
||||
int ret;
|
||||
|
||||
if (policy->policy == CPUFREQ_POLICY_PERFORMANCE) {
|
||||
pxa_freqs_table = pxa255_run_freq_table;
|
||||
} else if (policy->policy == CPUFREQ_POLICY_POWERSAVE) {
|
||||
pxa_freqs_table = pxa255_turbo_freq_table;
|
||||
} else {
|
||||
printk("CPU PXA: Unknown policy found. "
|
||||
"Using CPUFREQ_POLICY_PERFORMANCE\n");
|
||||
pxa_freqs_table = pxa255_run_freq_table;
|
||||
}
|
||||
|
||||
find_freq_tables(policy, &pxa_freqs_table, &pxa_freqs);
|
||||
ret = cpufreq_frequency_table_verify(policy, pxa_freqs_table);
|
||||
|
||||
if (freq_debug)
|
||||
pr_debug("Verified CPU policy: %dKhz min to %dKhz max\n",
|
||||
policy->min, policy->max);
|
||||
policy->min, policy->max);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static unsigned int pxa_cpufreq_get(unsigned int cpu)
|
||||
{
|
||||
return get_clk_frequency_khz(0);
|
||||
}
|
||||
|
||||
static int pxa_set_target(struct cpufreq_policy *policy,
|
||||
unsigned int target_freq,
|
||||
unsigned int relation)
|
||||
unsigned int target_freq,
|
||||
unsigned int relation)
|
||||
{
|
||||
struct cpufreq_frequency_table *pxa_freqs_table;
|
||||
pxa_freqs_t *pxa_freq_settings;
|
||||
struct cpufreq_freqs freqs;
|
||||
unsigned int idx;
|
||||
unsigned long flags;
|
||||
unsigned int unused, preset_mdrefr, postset_mdrefr;
|
||||
void *ramstart = phys_to_virt(0xa0000000);
|
||||
unsigned int new_freq_cpu, new_freq_mem;
|
||||
unsigned int unused, preset_mdrefr, postset_mdrefr, cclkcfg;
|
||||
|
||||
/* Get the current policy */
|
||||
if (policy->policy == CPUFREQ_POLICY_PERFORMANCE) {
|
||||
pxa_freq_settings = pxa255_run_freqs;
|
||||
pxa_freqs_table = pxa255_run_freq_table;
|
||||
} else if (policy->policy == CPUFREQ_POLICY_POWERSAVE) {
|
||||
pxa_freq_settings = pxa255_turbo_freqs;
|
||||
pxa_freqs_table = pxa255_turbo_freq_table;
|
||||
} else {
|
||||
printk("CPU PXA: Unknown policy found. "
|
||||
"Using CPUFREQ_POLICY_PERFORMANCE\n");
|
||||
pxa_freq_settings = pxa255_run_freqs;
|
||||
pxa_freqs_table = pxa255_run_freq_table;
|
||||
}
|
||||
find_freq_tables(policy, &pxa_freqs_table, &pxa_freq_settings);
|
||||
|
||||
/* Lookup the next frequency */
|
||||
if (cpufreq_frequency_table_target(policy, pxa_freqs_table,
|
||||
target_freq, relation, &idx)) {
|
||||
target_freq, relation, &idx)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
new_freq_cpu = pxa_freq_settings[idx].khz;
|
||||
new_freq_mem = pxa_freq_settings[idx].membus;
|
||||
freqs.old = policy->cur;
|
||||
freqs.new = pxa_freq_settings[idx].khz;
|
||||
freqs.new = new_freq_cpu;
|
||||
freqs.cpu = policy->cpu;
|
||||
|
||||
if (freq_debug)
|
||||
pr_debug(KERN_INFO "Changing CPU frequency to %d Mhz, (SDRAM %d Mhz)\n",
|
||||
freqs.new / 1000, (pxa_freq_settings[idx].div2) ?
|
||||
(pxa_freq_settings[idx].membus / 2000) :
|
||||
(pxa_freq_settings[idx].membus / 1000));
|
||||
pr_debug(KERN_INFO "Changing CPU frequency to %d Mhz, "
|
||||
"(SDRAM %d Mhz)\n",
|
||||
freqs.new / 1000, (pxa_freq_settings[idx].div2) ?
|
||||
(new_freq_mem / 2000) : (new_freq_mem / 1000));
|
||||
|
||||
/*
|
||||
* Tell everyone what we're about to do...
|
||||
|
@ -177,16 +268,16 @@ static int pxa_set_target(struct cpufreq_policy *policy,
|
|||
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
|
||||
|
||||
/* Calculate the next MDREFR. If we're slowing down the SDRAM clock
|
||||
* we need to preset the smaller DRI before the change. If we're speeding
|
||||
* up we need to set the larger DRI value after the change.
|
||||
* we need to preset the smaller DRI before the change. If we're
|
||||
* speeding up we need to set the larger DRI value after the change.
|
||||
*/
|
||||
preset_mdrefr = postset_mdrefr = MDREFR;
|
||||
if ((MDREFR & MDREFR_DRI_MASK) > MDREFR_DRI(pxa_freq_settings[idx].membus)) {
|
||||
preset_mdrefr = (preset_mdrefr & ~MDREFR_DRI_MASK) |
|
||||
MDREFR_DRI(pxa_freq_settings[idx].membus);
|
||||
if ((MDREFR & MDREFR_DRI_MASK) > mdrefr_dri(new_freq_mem)) {
|
||||
preset_mdrefr = (preset_mdrefr & ~MDREFR_DRI_MASK);
|
||||
preset_mdrefr |= mdrefr_dri(new_freq_mem);
|
||||
}
|
||||
postset_mdrefr = (postset_mdrefr & ~MDREFR_DRI_MASK) |
|
||||
MDREFR_DRI(pxa_freq_settings[idx].membus);
|
||||
postset_mdrefr =
|
||||
(postset_mdrefr & ~MDREFR_DRI_MASK) | mdrefr_dri(new_freq_mem);
|
||||
|
||||
/* If we're dividing the memory clock by two for the SDRAM clock, this
|
||||
* must be set prior to the change. Clearing the divide must be done
|
||||
|
@ -201,26 +292,27 @@ static int pxa_set_target(struct cpufreq_policy *policy,
|
|||
|
||||
local_irq_save(flags);
|
||||
|
||||
/* Set new the CCCR */
|
||||
/* Set new the CCCR and prepare CCLKCFG */
|
||||
CCCR = pxa_freq_settings[idx].cccr;
|
||||
cclkcfg = pxa_freq_settings[idx].cclkcfg;
|
||||
|
||||
asm volatile(" \n\
|
||||
ldr r4, [%1] /* load MDREFR */ \n\
|
||||
b 2f \n\
|
||||
.align 5 \n\
|
||||
.align 5 \n\
|
||||
1: \n\
|
||||
str %4, [%1] /* preset the MDREFR */ \n\
|
||||
str %3, [%1] /* preset the MDREFR */ \n\
|
||||
mcr p14, 0, %2, c6, c0, 0 /* set CCLKCFG[FCS] */ \n\
|
||||
str %5, [%1] /* postset the MDREFR */ \n\
|
||||
str %4, [%1] /* postset the MDREFR */ \n\
|
||||
\n\
|
||||
b 3f \n\
|
||||
2: b 1b \n\
|
||||
3: nop \n\
|
||||
"
|
||||
: "=&r" (unused)
|
||||
: "r" (&MDREFR), "r" (CCLKCFG_TURBO|CCLKCFG_FCS), "r" (ramstart),
|
||||
"r" (preset_mdrefr), "r" (postset_mdrefr)
|
||||
: "r4", "r5");
|
||||
: "=&r" (unused)
|
||||
: "r" (&MDREFR), "r" (cclkcfg),
|
||||
"r" (preset_mdrefr), "r" (postset_mdrefr)
|
||||
: "r4", "r5");
|
||||
local_irq_restore(flags);
|
||||
|
||||
/*
|
||||
|
@ -233,38 +325,57 @@ static int pxa_set_target(struct cpufreq_policy *policy,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static unsigned int pxa_cpufreq_get(unsigned int cpu)
|
||||
{
|
||||
return get_clk_frequency_khz(0);
|
||||
}
|
||||
|
||||
static int pxa_cpufreq_init(struct cpufreq_policy *policy)
|
||||
static __init int pxa_cpufreq_init(struct cpufreq_policy *policy)
|
||||
{
|
||||
int i;
|
||||
unsigned int freq;
|
||||
|
||||
/* try to guess pxa27x cpu */
|
||||
if (cpu_is_pxa27x())
|
||||
pxa27x_guess_max_freq();
|
||||
|
||||
/* set default policy and cpuinfo */
|
||||
policy->governor = CPUFREQ_DEFAULT_GOVERNOR;
|
||||
policy->policy = CPUFREQ_POLICY_PERFORMANCE;
|
||||
policy->cpuinfo.max_freq = PXA25x_MAX_FREQ;
|
||||
policy->cpuinfo.min_freq = PXA25x_MIN_FREQ;
|
||||
if (cpu_is_pxa25x())
|
||||
policy->policy = CPUFREQ_POLICY_PERFORMANCE;
|
||||
policy->cpuinfo.transition_latency = 1000; /* FIXME: 1 ms, assumed */
|
||||
policy->cur = get_clk_frequency_khz(0); /* current freq */
|
||||
policy->cur = get_clk_frequency_khz(0); /* current freq */
|
||||
policy->min = policy->max = policy->cur;
|
||||
|
||||
/* Generate the run cpufreq_frequency_table struct */
|
||||
for (i = 0; i < NUM_RUN_FREQS; i++) {
|
||||
/* Generate pxa25x the run cpufreq_frequency_table struct */
|
||||
for (i = 0; i < NUM_PXA25x_RUN_FREQS; i++) {
|
||||
pxa255_run_freq_table[i].frequency = pxa255_run_freqs[i].khz;
|
||||
pxa255_run_freq_table[i].index = i;
|
||||
}
|
||||
|
||||
pxa255_run_freq_table[i].frequency = CPUFREQ_TABLE_END;
|
||||
/* Generate the turbo cpufreq_frequency_table struct */
|
||||
for (i = 0; i < NUM_TURBO_FREQS; i++) {
|
||||
pxa255_turbo_freq_table[i].frequency = pxa255_turbo_freqs[i].khz;
|
||||
|
||||
/* Generate pxa25x the turbo cpufreq_frequency_table struct */
|
||||
for (i = 0; i < NUM_PXA25x_TURBO_FREQS; i++) {
|
||||
pxa255_turbo_freq_table[i].frequency =
|
||||
pxa255_turbo_freqs[i].khz;
|
||||
pxa255_turbo_freq_table[i].index = i;
|
||||
}
|
||||
pxa255_turbo_freq_table[i].frequency = CPUFREQ_TABLE_END;
|
||||
|
||||
/* Generate the pxa27x cpufreq_frequency_table struct */
|
||||
for (i = 0; i < NUM_PXA27x_FREQS; i++) {
|
||||
freq = pxa27x_freqs[i].khz;
|
||||
if (freq > pxa27x_maxfreq)
|
||||
break;
|
||||
pxa27x_freq_table[i].frequency = freq;
|
||||
pxa27x_freq_table[i].index = i;
|
||||
}
|
||||
pxa27x_freq_table[i].frequency = CPUFREQ_TABLE_END;
|
||||
|
||||
/*
|
||||
* Set the policy's minimum and maximum frequencies from the tables
|
||||
* just constructed. This sets cpuinfo.mxx_freq, min and max.
|
||||
*/
|
||||
if (cpu_is_pxa25x())
|
||||
cpufreq_frequency_table_cpuinfo(policy, pxa255_run_freq_table);
|
||||
else if (cpu_is_pxa27x())
|
||||
cpufreq_frequency_table_cpuinfo(policy, pxa27x_freq_table);
|
||||
|
||||
printk(KERN_INFO "PXA CPU frequency change support initialized\n");
|
||||
|
||||
return 0;
|
||||
|
@ -275,26 +386,25 @@ static struct cpufreq_driver pxa_cpufreq_driver = {
|
|||
.target = pxa_set_target,
|
||||
.init = pxa_cpufreq_init,
|
||||
.get = pxa_cpufreq_get,
|
||||
.name = "PXA25x",
|
||||
.name = "PXA2xx",
|
||||
};
|
||||
|
||||
static int __init pxa_cpu_init(void)
|
||||
{
|
||||
int ret = -ENODEV;
|
||||
if (cpu_is_pxa25x())
|
||||
if (cpu_is_pxa25x() || cpu_is_pxa27x())
|
||||
ret = cpufreq_register_driver(&pxa_cpufreq_driver);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void __exit pxa_cpu_exit(void)
|
||||
{
|
||||
if (cpu_is_pxa25x())
|
||||
cpufreq_unregister_driver(&pxa_cpufreq_driver);
|
||||
cpufreq_unregister_driver(&pxa_cpufreq_driver);
|
||||
}
|
||||
|
||||
|
||||
MODULE_AUTHOR ("Intrinsyc Software Inc.");
|
||||
MODULE_DESCRIPTION ("CPU frequency changing driver for the PXA architecture");
|
||||
MODULE_AUTHOR("Intrinsyc Software Inc.");
|
||||
MODULE_DESCRIPTION("CPU frequency changing driver for the PXA architecture");
|
||||
MODULE_LICENSE("GPL");
|
||||
module_init(pxa_cpu_init);
|
||||
module_exit(pxa_cpu_exit);
|
||||
|
|
|
@ -50,7 +50,7 @@ static struct resource em_x270_dm9k_resource[] = {
|
|||
[2] = {
|
||||
.start = EM_X270_ETHIRQ,
|
||||
.end = EM_X270_ETHIRQ,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -396,7 +396,7 @@ static struct pxafb_mach_info sharp_lm8v31 = {
|
|||
.cmap_inverse = 0,
|
||||
.cmap_static = 0,
|
||||
.lcd_conn = LCD_COLOR_DSTN_16BPP | LCD_PCLK_EDGE_FALL |
|
||||
LCD_AC_BIAS_FREQ(255);
|
||||
LCD_AC_BIAS_FREQ(255),
|
||||
};
|
||||
|
||||
#define MMC_POLL_RATE msecs_to_jiffies(1000)
|
||||
|
|
|
@ -42,20 +42,17 @@ int pxa_pm_enter(suspend_state_t state)
|
|||
if (state != PM_SUSPEND_STANDBY) {
|
||||
pxa_cpu_pm_fns->save(sleep_save);
|
||||
/* before sleeping, calculate and save a checksum */
|
||||
for (i = 0; i < pxa_cpu_pm_fns->save_size - 1; i++)
|
||||
for (i = 0; i < pxa_cpu_pm_fns->save_count - 1; i++)
|
||||
sleep_save_checksum += sleep_save[i];
|
||||
}
|
||||
|
||||
/* Clear reset status */
|
||||
RCSR = RCSR_HWR | RCSR_WDR | RCSR_SMR | RCSR_GPR;
|
||||
|
||||
/* *** go zzz *** */
|
||||
pxa_cpu_pm_fns->enter(state);
|
||||
cpu_init();
|
||||
|
||||
if (state != PM_SUSPEND_STANDBY) {
|
||||
/* after sleeping, validate the checksum */
|
||||
for (i = 0; i < pxa_cpu_pm_fns->save_size - 1; i++)
|
||||
for (i = 0; i < pxa_cpu_pm_fns->save_count - 1; i++)
|
||||
checksum += sleep_save[i];
|
||||
|
||||
/* if invalid, display message and wait for a hardware reset */
|
||||
|
@ -101,7 +98,8 @@ static int __init pxa_pm_init(void)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
sleep_save = kmalloc(pxa_cpu_pm_fns->save_size, GFP_KERNEL);
|
||||
sleep_save = kmalloc(pxa_cpu_pm_fns->save_count * sizeof(unsigned long),
|
||||
GFP_KERNEL);
|
||||
if (!sleep_save) {
|
||||
printk(KERN_ERR "failed to alloc memory for pm save\n");
|
||||
return -ENOMEM;
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue