Merge branch 'iommu/fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/joro/linux-2.6-iommu into x86/urgent
This commit is contained in:
7
.gitignore
vendored
7
.gitignore
vendored
@@ -22,6 +22,7 @@
|
|||||||
*.lst
|
*.lst
|
||||||
*.symtypes
|
*.symtypes
|
||||||
*.order
|
*.order
|
||||||
|
modules.builtin
|
||||||
*.elf
|
*.elf
|
||||||
*.bin
|
*.bin
|
||||||
*.gz
|
*.gz
|
||||||
@@ -45,14 +46,8 @@ Module.symvers
|
|||||||
#
|
#
|
||||||
# Generated include files
|
# Generated include files
|
||||||
#
|
#
|
||||||
include/asm
|
|
||||||
include/asm-*/asm-offsets.h
|
|
||||||
include/config
|
include/config
|
||||||
include/linux/autoconf.h
|
|
||||||
include/linux/compile.h
|
|
||||||
include/linux/version.h
|
include/linux/version.h
|
||||||
include/linux/utsrelease.h
|
|
||||||
include/linux/bounds.h
|
|
||||||
include/generated
|
include/generated
|
||||||
|
|
||||||
# stgit generated dirs
|
# stgit generated dirs
|
||||||
|
@@ -144,3 +144,16 @@ Description:
|
|||||||
|
|
||||||
Write a 1 to force the device to disconnect
|
Write a 1 to force the device to disconnect
|
||||||
(equivalent to unplugging a wired USB device).
|
(equivalent to unplugging a wired USB device).
|
||||||
|
|
||||||
|
What: /sys/bus/usb/drivers/.../remove_id
|
||||||
|
Date: November 2009
|
||||||
|
Contact: CHENG Renquan <rqcheng@smu.edu.sg>
|
||||||
|
Description:
|
||||||
|
Writing a device ID to this file will remove an ID
|
||||||
|
that was dynamically added via the new_id sysfs entry.
|
||||||
|
The format for the device ID is:
|
||||||
|
idVendor idProduct. After successfully
|
||||||
|
removing an ID, the driver will no longer support the
|
||||||
|
device. This is useful to ensure auto probing won't
|
||||||
|
match the driver to the device. For example:
|
||||||
|
# echo "046d c315" > /sys/bus/usb/drivers/foo/remove_id
|
||||||
|
@@ -23,3 +23,16 @@ Description:
|
|||||||
Since this relates to security (specifically, the
|
Since this relates to security (specifically, the
|
||||||
lifetime of PTKs and GTKs) it should not be changed
|
lifetime of PTKs and GTKs) it should not be changed
|
||||||
from the default.
|
from the default.
|
||||||
|
|
||||||
|
What: /sys/class/uwb_rc/uwbN/wusbhc/wusb_phy_rate
|
||||||
|
Date: August 2009
|
||||||
|
KernelVersion: 2.6.32
|
||||||
|
Contact: David Vrabel <david.vrabel@csr.com>
|
||||||
|
Description:
|
||||||
|
The maximum PHY rate to use for all connected devices.
|
||||||
|
This is only of limited use for testing and
|
||||||
|
development as the hardware's automatic rate
|
||||||
|
adaptation is better then this simple control.
|
||||||
|
|
||||||
|
Refer to [ECMA-368] section 10.3.1.1 for the value to
|
||||||
|
use.
|
||||||
|
@@ -60,6 +60,19 @@ Description:
|
|||||||
Users: hotplug memory remove tools
|
Users: hotplug memory remove tools
|
||||||
https://w3.opensource.ibm.com/projects/powerpc-utils/
|
https://w3.opensource.ibm.com/projects/powerpc-utils/
|
||||||
|
|
||||||
|
|
||||||
|
What: /sys/devices/system/memoryX/nodeY
|
||||||
|
Date: October 2009
|
||||||
|
Contact: Linux Memory Management list <linux-mm@kvack.org>
|
||||||
|
Description:
|
||||||
|
When CONFIG_NUMA is enabled, a symbolic link that
|
||||||
|
points to the corresponding NUMA node directory.
|
||||||
|
|
||||||
|
For example, the following symbolic link is created for
|
||||||
|
memory section 9 on node0:
|
||||||
|
/sys/devices/system/memory/memory9/node0 -> ../../node/node0
|
||||||
|
|
||||||
|
|
||||||
What: /sys/devices/system/node/nodeX/memoryY
|
What: /sys/devices/system/node/nodeX/memoryY
|
||||||
Date: September 2008
|
Date: September 2008
|
||||||
Contact: Gary Hade <garyhade@us.ibm.com>
|
Contact: Gary Hade <garyhade@us.ibm.com>
|
||||||
@@ -70,4 +83,3 @@ Description:
|
|||||||
memory section directory. For example, the following symbolic
|
memory section directory. For example, the following symbolic
|
||||||
link is created for memory section 9 on node0.
|
link is created for memory section 9 on node0.
|
||||||
/sys/devices/system/node/node0/memory9 -> ../../memory/memory9
|
/sys/devices/system/node/node0/memory9 -> ../../memory/memory9
|
||||||
|
|
||||||
|
@@ -62,6 +62,35 @@ Description: CPU topology files that describe kernel limits related to
|
|||||||
See Documentation/cputopology.txt for more information.
|
See Documentation/cputopology.txt for more information.
|
||||||
|
|
||||||
|
|
||||||
|
What: /sys/devices/system/cpu/probe
|
||||||
|
/sys/devices/system/cpu/release
|
||||||
|
Date: November 2009
|
||||||
|
Contact: Linux kernel mailing list <linux-kernel@vger.kernel.org>
|
||||||
|
Description: Dynamic addition and removal of CPU's. This is not hotplug
|
||||||
|
removal, this is meant complete removal/addition of the CPU
|
||||||
|
from the system.
|
||||||
|
|
||||||
|
probe: writes to this file will dynamically add a CPU to the
|
||||||
|
system. Information written to the file to add CPU's is
|
||||||
|
architecture specific.
|
||||||
|
|
||||||
|
release: writes to this file dynamically remove a CPU from
|
||||||
|
the system. Information writtento the file to remove CPU's
|
||||||
|
is architecture specific.
|
||||||
|
|
||||||
|
What: /sys/devices/system/cpu/cpu#/node
|
||||||
|
Date: October 2009
|
||||||
|
Contact: Linux memory management mailing list <linux-mm@kvack.org>
|
||||||
|
Description: Discover NUMA node a CPU belongs to
|
||||||
|
|
||||||
|
When CONFIG_NUMA is enabled, a symbolic link that points
|
||||||
|
to the corresponding NUMA node directory.
|
||||||
|
|
||||||
|
For example, the following symlink is created for cpu42
|
||||||
|
in NUMA node 2:
|
||||||
|
|
||||||
|
/sys/devices/system/cpu/cpu42/node2 -> ../../node/node2
|
||||||
|
|
||||||
|
|
||||||
What: /sys/devices/system/cpu/cpu#/node
|
What: /sys/devices/system/cpu/cpu#/node
|
||||||
Date: October 2009
|
Date: October 2009
|
||||||
@@ -136,6 +165,24 @@ Description: Discover cpuidle policy and mechanism
|
|||||||
See files in Documentation/cpuidle/ for more information.
|
See files in Documentation/cpuidle/ for more information.
|
||||||
|
|
||||||
|
|
||||||
|
What: /sys/devices/system/cpu/cpu#/cpufreq/*
|
||||||
|
Date: pre-git history
|
||||||
|
Contact: cpufreq@vger.kernel.org
|
||||||
|
Description: Discover and change clock speed of CPUs
|
||||||
|
|
||||||
|
Clock scaling allows you to change the clock speed of the
|
||||||
|
CPUs on the fly. This is a nice method to save battery
|
||||||
|
power, because the lower the clock speed, the less power
|
||||||
|
the CPU consumes.
|
||||||
|
|
||||||
|
There are many knobs to tweak in this directory.
|
||||||
|
|
||||||
|
See files in Documentation/cpu-freq/ for more information.
|
||||||
|
|
||||||
|
In particular, read Documentation/cpu-freq/user-guide.txt
|
||||||
|
to learn how to control the knobs.
|
||||||
|
|
||||||
|
|
||||||
What: /sys/devices/system/cpu/cpu*/cache/index*/cache_disable_X
|
What: /sys/devices/system/cpu/cpu*/cache/index*/cache_disable_X
|
||||||
Date: August 2008
|
Date: August 2008
|
||||||
KernelVersion: 2.6.27
|
KernelVersion: 2.6.27
|
||||||
|
@@ -45,8 +45,9 @@ KernelVersion: 2.6.25
|
|||||||
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
||||||
Christoph Lameter <cl@linux-foundation.org>
|
Christoph Lameter <cl@linux-foundation.org>
|
||||||
Description:
|
Description:
|
||||||
The alloc_fastpath file is read-only and specifies how many
|
The alloc_fastpath file shows how many objects have been
|
||||||
objects have been allocated using the fast path.
|
allocated using the fast path. It can be written to clear the
|
||||||
|
current count.
|
||||||
Available when CONFIG_SLUB_STATS is enabled.
|
Available when CONFIG_SLUB_STATS is enabled.
|
||||||
|
|
||||||
What: /sys/kernel/slab/cache/alloc_from_partial
|
What: /sys/kernel/slab/cache/alloc_from_partial
|
||||||
@@ -55,9 +56,10 @@ KernelVersion: 2.6.25
|
|||||||
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
||||||
Christoph Lameter <cl@linux-foundation.org>
|
Christoph Lameter <cl@linux-foundation.org>
|
||||||
Description:
|
Description:
|
||||||
The alloc_from_partial file is read-only and specifies how
|
The alloc_from_partial file shows how many times a cpu slab has
|
||||||
many times a cpu slab has been full and it has been refilled
|
been full and it has been refilled by using a slab from the list
|
||||||
by using a slab from the list of partially used slabs.
|
of partially used slabs. It can be written to clear the current
|
||||||
|
count.
|
||||||
Available when CONFIG_SLUB_STATS is enabled.
|
Available when CONFIG_SLUB_STATS is enabled.
|
||||||
|
|
||||||
What: /sys/kernel/slab/cache/alloc_refill
|
What: /sys/kernel/slab/cache/alloc_refill
|
||||||
@@ -66,9 +68,9 @@ KernelVersion: 2.6.25
|
|||||||
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
||||||
Christoph Lameter <cl@linux-foundation.org>
|
Christoph Lameter <cl@linux-foundation.org>
|
||||||
Description:
|
Description:
|
||||||
The alloc_refill file is read-only and specifies how many
|
The alloc_refill file shows how many times the per-cpu freelist
|
||||||
times the per-cpu freelist was empty but there were objects
|
was empty but there were objects available as the result of
|
||||||
available as the result of remote cpu frees.
|
remote cpu frees. It can be written to clear the current count.
|
||||||
Available when CONFIG_SLUB_STATS is enabled.
|
Available when CONFIG_SLUB_STATS is enabled.
|
||||||
|
|
||||||
What: /sys/kernel/slab/cache/alloc_slab
|
What: /sys/kernel/slab/cache/alloc_slab
|
||||||
@@ -77,8 +79,9 @@ KernelVersion: 2.6.25
|
|||||||
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
||||||
Christoph Lameter <cl@linux-foundation.org>
|
Christoph Lameter <cl@linux-foundation.org>
|
||||||
Description:
|
Description:
|
||||||
The alloc_slab file is read-only and specifies how many times
|
The alloc_slab file is shows how many times a new slab had to
|
||||||
a new slab had to be allocated from the page allocator.
|
be allocated from the page allocator. It can be written to
|
||||||
|
clear the current count.
|
||||||
Available when CONFIG_SLUB_STATS is enabled.
|
Available when CONFIG_SLUB_STATS is enabled.
|
||||||
|
|
||||||
What: /sys/kernel/slab/cache/alloc_slowpath
|
What: /sys/kernel/slab/cache/alloc_slowpath
|
||||||
@@ -87,9 +90,10 @@ KernelVersion: 2.6.25
|
|||||||
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
||||||
Christoph Lameter <cl@linux-foundation.org>
|
Christoph Lameter <cl@linux-foundation.org>
|
||||||
Description:
|
Description:
|
||||||
The alloc_slowpath file is read-only and specifies how many
|
The alloc_slowpath file shows how many objects have been
|
||||||
objects have been allocated using the slow path because of a
|
allocated using the slow path because of a refill or
|
||||||
refill or allocation from a partial or new slab.
|
allocation from a partial or new slab. It can be written to
|
||||||
|
clear the current count.
|
||||||
Available when CONFIG_SLUB_STATS is enabled.
|
Available when CONFIG_SLUB_STATS is enabled.
|
||||||
|
|
||||||
What: /sys/kernel/slab/cache/cache_dma
|
What: /sys/kernel/slab/cache/cache_dma
|
||||||
@@ -117,10 +121,11 @@ KernelVersion: 2.6.31
|
|||||||
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
||||||
Christoph Lameter <cl@linux-foundation.org>
|
Christoph Lameter <cl@linux-foundation.org>
|
||||||
Description:
|
Description:
|
||||||
The file cpuslab_flush is read-only and specifies how many
|
The file cpuslab_flush shows how many times a cache's cpu slabs
|
||||||
times a cache's cpu slabs have been flushed as the result of
|
have been flushed as the result of destroying or shrinking a
|
||||||
destroying or shrinking a cache, a cpu going offline, or as
|
cache, a cpu going offline, or as the result of forcing an
|
||||||
the result of forcing an allocation from a certain node.
|
allocation from a certain node. It can be written to clear the
|
||||||
|
current count.
|
||||||
Available when CONFIG_SLUB_STATS is enabled.
|
Available when CONFIG_SLUB_STATS is enabled.
|
||||||
|
|
||||||
What: /sys/kernel/slab/cache/ctor
|
What: /sys/kernel/slab/cache/ctor
|
||||||
@@ -139,8 +144,8 @@ KernelVersion: 2.6.25
|
|||||||
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
||||||
Christoph Lameter <cl@linux-foundation.org>
|
Christoph Lameter <cl@linux-foundation.org>
|
||||||
Description:
|
Description:
|
||||||
The file deactivate_empty is read-only and specifies how many
|
The deactivate_empty file shows how many times an empty cpu slab
|
||||||
times an empty cpu slab was deactivated.
|
was deactivated. It can be written to clear the current count.
|
||||||
Available when CONFIG_SLUB_STATS is enabled.
|
Available when CONFIG_SLUB_STATS is enabled.
|
||||||
|
|
||||||
What: /sys/kernel/slab/cache/deactivate_full
|
What: /sys/kernel/slab/cache/deactivate_full
|
||||||
@@ -149,8 +154,8 @@ KernelVersion: 2.6.25
|
|||||||
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
||||||
Christoph Lameter <cl@linux-foundation.org>
|
Christoph Lameter <cl@linux-foundation.org>
|
||||||
Description:
|
Description:
|
||||||
The file deactivate_full is read-only and specifies how many
|
The deactivate_full file shows how many times a full cpu slab
|
||||||
times a full cpu slab was deactivated.
|
was deactivated. It can be written to clear the current count.
|
||||||
Available when CONFIG_SLUB_STATS is enabled.
|
Available when CONFIG_SLUB_STATS is enabled.
|
||||||
|
|
||||||
What: /sys/kernel/slab/cache/deactivate_remote_frees
|
What: /sys/kernel/slab/cache/deactivate_remote_frees
|
||||||
@@ -159,9 +164,9 @@ KernelVersion: 2.6.25
|
|||||||
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
||||||
Christoph Lameter <cl@linux-foundation.org>
|
Christoph Lameter <cl@linux-foundation.org>
|
||||||
Description:
|
Description:
|
||||||
The file deactivate_remote_frees is read-only and specifies how
|
The deactivate_remote_frees file shows how many times a cpu slab
|
||||||
many times a cpu slab has been deactivated and contained free
|
has been deactivated and contained free objects that were freed
|
||||||
objects that were freed remotely.
|
remotely. It can be written to clear the current count.
|
||||||
Available when CONFIG_SLUB_STATS is enabled.
|
Available when CONFIG_SLUB_STATS is enabled.
|
||||||
|
|
||||||
What: /sys/kernel/slab/cache/deactivate_to_head
|
What: /sys/kernel/slab/cache/deactivate_to_head
|
||||||
@@ -170,9 +175,9 @@ KernelVersion: 2.6.25
|
|||||||
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
||||||
Christoph Lameter <cl@linux-foundation.org>
|
Christoph Lameter <cl@linux-foundation.org>
|
||||||
Description:
|
Description:
|
||||||
The file deactivate_to_head is read-only and specifies how
|
The deactivate_to_head file shows how many times a partial cpu
|
||||||
many times a partial cpu slab was deactivated and added to the
|
slab was deactivated and added to the head of its node's partial
|
||||||
head of its node's partial list.
|
list. It can be written to clear the current count.
|
||||||
Available when CONFIG_SLUB_STATS is enabled.
|
Available when CONFIG_SLUB_STATS is enabled.
|
||||||
|
|
||||||
What: /sys/kernel/slab/cache/deactivate_to_tail
|
What: /sys/kernel/slab/cache/deactivate_to_tail
|
||||||
@@ -181,9 +186,9 @@ KernelVersion: 2.6.25
|
|||||||
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
||||||
Christoph Lameter <cl@linux-foundation.org>
|
Christoph Lameter <cl@linux-foundation.org>
|
||||||
Description:
|
Description:
|
||||||
The file deactivate_to_tail is read-only and specifies how
|
The deactivate_to_tail file shows how many times a partial cpu
|
||||||
many times a partial cpu slab was deactivated and added to the
|
slab was deactivated and added to the tail of its node's partial
|
||||||
tail of its node's partial list.
|
list. It can be written to clear the current count.
|
||||||
Available when CONFIG_SLUB_STATS is enabled.
|
Available when CONFIG_SLUB_STATS is enabled.
|
||||||
|
|
||||||
What: /sys/kernel/slab/cache/destroy_by_rcu
|
What: /sys/kernel/slab/cache/destroy_by_rcu
|
||||||
@@ -201,9 +206,9 @@ KernelVersion: 2.6.25
|
|||||||
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
||||||
Christoph Lameter <cl@linux-foundation.org>
|
Christoph Lameter <cl@linux-foundation.org>
|
||||||
Description:
|
Description:
|
||||||
The file free_add_partial is read-only and specifies how many
|
The free_add_partial file shows how many times an object has
|
||||||
times an object has been freed in a full slab so that it had to
|
been freed in a full slab so that it had to added to its node's
|
||||||
added to its node's partial list.
|
partial list. It can be written to clear the current count.
|
||||||
Available when CONFIG_SLUB_STATS is enabled.
|
Available when CONFIG_SLUB_STATS is enabled.
|
||||||
|
|
||||||
What: /sys/kernel/slab/cache/free_calls
|
What: /sys/kernel/slab/cache/free_calls
|
||||||
@@ -222,9 +227,9 @@ KernelVersion: 2.6.25
|
|||||||
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
||||||
Christoph Lameter <cl@linux-foundation.org>
|
Christoph Lameter <cl@linux-foundation.org>
|
||||||
Description:
|
Description:
|
||||||
The free_fastpath file is read-only and specifies how many
|
The free_fastpath file shows how many objects have been freed
|
||||||
objects have been freed using the fast path because it was an
|
using the fast path because it was an object from the cpu slab.
|
||||||
object from the cpu slab.
|
It can be written to clear the current count.
|
||||||
Available when CONFIG_SLUB_STATS is enabled.
|
Available when CONFIG_SLUB_STATS is enabled.
|
||||||
|
|
||||||
What: /sys/kernel/slab/cache/free_frozen
|
What: /sys/kernel/slab/cache/free_frozen
|
||||||
@@ -233,9 +238,9 @@ KernelVersion: 2.6.25
|
|||||||
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
||||||
Christoph Lameter <cl@linux-foundation.org>
|
Christoph Lameter <cl@linux-foundation.org>
|
||||||
Description:
|
Description:
|
||||||
The free_frozen file is read-only and specifies how many
|
The free_frozen file shows how many objects have been freed to
|
||||||
objects have been freed to a frozen slab (i.e. a remote cpu
|
a frozen slab (i.e. a remote cpu slab). It can be written to
|
||||||
slab).
|
clear the current count.
|
||||||
Available when CONFIG_SLUB_STATS is enabled.
|
Available when CONFIG_SLUB_STATS is enabled.
|
||||||
|
|
||||||
What: /sys/kernel/slab/cache/free_remove_partial
|
What: /sys/kernel/slab/cache/free_remove_partial
|
||||||
@@ -244,9 +249,10 @@ KernelVersion: 2.6.25
|
|||||||
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
||||||
Christoph Lameter <cl@linux-foundation.org>
|
Christoph Lameter <cl@linux-foundation.org>
|
||||||
Description:
|
Description:
|
||||||
The file free_remove_partial is read-only and specifies how
|
The free_remove_partial file shows how many times an object has
|
||||||
many times an object has been freed to a now-empty slab so
|
been freed to a now-empty slab so that it had to be removed from
|
||||||
that it had to be removed from its node's partial list.
|
its node's partial list. It can be written to clear the current
|
||||||
|
count.
|
||||||
Available when CONFIG_SLUB_STATS is enabled.
|
Available when CONFIG_SLUB_STATS is enabled.
|
||||||
|
|
||||||
What: /sys/kernel/slab/cache/free_slab
|
What: /sys/kernel/slab/cache/free_slab
|
||||||
@@ -255,8 +261,9 @@ KernelVersion: 2.6.25
|
|||||||
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
||||||
Christoph Lameter <cl@linux-foundation.org>
|
Christoph Lameter <cl@linux-foundation.org>
|
||||||
Description:
|
Description:
|
||||||
The free_slab file is read-only and specifies how many times an
|
The free_slab file shows how many times an empty slab has been
|
||||||
empty slab has been freed back to the page allocator.
|
freed back to the page allocator. It can be written to clear
|
||||||
|
the current count.
|
||||||
Available when CONFIG_SLUB_STATS is enabled.
|
Available when CONFIG_SLUB_STATS is enabled.
|
||||||
|
|
||||||
What: /sys/kernel/slab/cache/free_slowpath
|
What: /sys/kernel/slab/cache/free_slowpath
|
||||||
@@ -265,9 +272,9 @@ KernelVersion: 2.6.25
|
|||||||
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
||||||
Christoph Lameter <cl@linux-foundation.org>
|
Christoph Lameter <cl@linux-foundation.org>
|
||||||
Description:
|
Description:
|
||||||
The free_slowpath file is read-only and specifies how many
|
The free_slowpath file shows how many objects have been freed
|
||||||
objects have been freed using the slow path (i.e. to a full or
|
using the slow path (i.e. to a full or partial slab). It can
|
||||||
partial slab).
|
be written to clear the current count.
|
||||||
Available when CONFIG_SLUB_STATS is enabled.
|
Available when CONFIG_SLUB_STATS is enabled.
|
||||||
|
|
||||||
What: /sys/kernel/slab/cache/hwcache_align
|
What: /sys/kernel/slab/cache/hwcache_align
|
||||||
@@ -346,10 +353,10 @@ KernelVersion: 2.6.26
|
|||||||
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
Contact: Pekka Enberg <penberg@cs.helsinki.fi>,
|
||||||
Christoph Lameter <cl@linux-foundation.org>
|
Christoph Lameter <cl@linux-foundation.org>
|
||||||
Description:
|
Description:
|
||||||
The file order_fallback is read-only and specifies how many
|
The order_fallback file shows how many times an allocation of a
|
||||||
times an allocation of a new slab has not been possible at the
|
new slab has not been possible at the cache's order and instead
|
||||||
cache's order and instead fallen back to its minimum possible
|
fallen back to its minimum possible order. It can be written to
|
||||||
order.
|
clear the current count.
|
||||||
Available when CONFIG_SLUB_STATS is enabled.
|
Available when CONFIG_SLUB_STATS is enabled.
|
||||||
|
|
||||||
What: /sys/kernel/slab/cache/partial
|
What: /sys/kernel/slab/cache/partial
|
||||||
|
44
Documentation/ABI/testing/sysfs-memory-page-offline
Normal file
44
Documentation/ABI/testing/sysfs-memory-page-offline
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
What: /sys/devices/system/memory/soft_offline_page
|
||||||
|
Date: Sep 2009
|
||||||
|
KernelVersion: 2.6.33
|
||||||
|
Contact: andi@firstfloor.org
|
||||||
|
Description:
|
||||||
|
Soft-offline the memory page containing the physical address
|
||||||
|
written into this file. Input is a hex number specifying the
|
||||||
|
physical address of the page. The kernel will then attempt
|
||||||
|
to soft-offline it, by moving the contents elsewhere or
|
||||||
|
dropping it if possible. The kernel will then be placed
|
||||||
|
on the bad page list and never be reused.
|
||||||
|
|
||||||
|
The offlining is done in kernel specific granuality.
|
||||||
|
Normally it's the base page size of the kernel, but
|
||||||
|
this might change.
|
||||||
|
|
||||||
|
The page must be still accessible, not poisoned. The
|
||||||
|
kernel will never kill anything for this, but rather
|
||||||
|
fail the offline. Return value is the size of the
|
||||||
|
number, or a error when the offlining failed. Reading
|
||||||
|
the file is not allowed.
|
||||||
|
|
||||||
|
What: /sys/devices/system/memory/hard_offline_page
|
||||||
|
Date: Sep 2009
|
||||||
|
KernelVersion: 2.6.33
|
||||||
|
Contact: andi@firstfloor.org
|
||||||
|
Description:
|
||||||
|
Hard-offline the memory page containing the physical
|
||||||
|
address written into this file. Input is a hex number
|
||||||
|
specifying the physical address of the page. The
|
||||||
|
kernel will then attempt to hard-offline the page, by
|
||||||
|
trying to drop the page or killing any owner or
|
||||||
|
triggering IO errors if needed. Note this may kill
|
||||||
|
any processes owning the page. The kernel will avoid
|
||||||
|
to access this page assuming it's poisoned by the
|
||||||
|
hardware.
|
||||||
|
|
||||||
|
The offlining is done in kernel specific granuality.
|
||||||
|
Normally it's the base page size of the kernel, but
|
||||||
|
this might change.
|
||||||
|
|
||||||
|
Return value is the size of the number, or a error when
|
||||||
|
the offlining failed.
|
||||||
|
Reading the file is not allowed.
|
@@ -49,6 +49,8 @@ o oprofile 0.9 # oprofiled --version
|
|||||||
o udev 081 # udevinfo -V
|
o udev 081 # udevinfo -V
|
||||||
o grub 0.93 # grub --version
|
o grub 0.93 # grub --version
|
||||||
o mcelog 0.6
|
o mcelog 0.6
|
||||||
|
o iptables 1.4.1 # iptables -V
|
||||||
|
|
||||||
|
|
||||||
Kernel compilation
|
Kernel compilation
|
||||||
==================
|
==================
|
||||||
|
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
DOCBOOKS := z8530book.xml mcabook.xml device-drivers.xml \
|
DOCBOOKS := z8530book.xml mcabook.xml device-drivers.xml \
|
||||||
kernel-hacking.xml kernel-locking.xml deviceiobook.xml \
|
kernel-hacking.xml kernel-locking.xml deviceiobook.xml \
|
||||||
procfs-guide.xml writing_usb_driver.xml networking.xml \
|
writing_usb_driver.xml networking.xml \
|
||||||
kernel-api.xml filesystems.xml lsm.xml usb.xml kgdb.xml \
|
kernel-api.xml filesystems.xml lsm.xml usb.xml kgdb.xml \
|
||||||
gadget.xml libata.xml mtdnand.xml librs.xml rapidio.xml \
|
gadget.xml libata.xml mtdnand.xml librs.xml rapidio.xml \
|
||||||
genericirq.xml s390-drivers.xml uio-howto.xml scsi.xml \
|
genericirq.xml s390-drivers.xml uio-howto.xml scsi.xml \
|
||||||
@@ -32,10 +32,10 @@ PS_METHOD = $(prefer-db2x)
|
|||||||
|
|
||||||
###
|
###
|
||||||
# The targets that may be used.
|
# The targets that may be used.
|
||||||
PHONY += xmldocs sgmldocs psdocs pdfdocs htmldocs mandocs installmandocs cleandocs media
|
PHONY += xmldocs sgmldocs psdocs pdfdocs htmldocs mandocs installmandocs cleandocs xmldoclinks
|
||||||
|
|
||||||
BOOKS := $(addprefix $(obj)/,$(DOCBOOKS))
|
BOOKS := $(addprefix $(obj)/,$(DOCBOOKS))
|
||||||
xmldocs: $(BOOKS)
|
xmldocs: $(BOOKS) xmldoclinks
|
||||||
sgmldocs: xmldocs
|
sgmldocs: xmldocs
|
||||||
|
|
||||||
PS := $(patsubst %.xml, %.ps, $(BOOKS))
|
PS := $(patsubst %.xml, %.ps, $(BOOKS))
|
||||||
@@ -45,15 +45,24 @@ PDF := $(patsubst %.xml, %.pdf, $(BOOKS))
|
|||||||
pdfdocs: $(PDF)
|
pdfdocs: $(PDF)
|
||||||
|
|
||||||
HTML := $(sort $(patsubst %.xml, %.html, $(BOOKS)))
|
HTML := $(sort $(patsubst %.xml, %.html, $(BOOKS)))
|
||||||
htmldocs: media $(HTML)
|
htmldocs: $(HTML)
|
||||||
$(call build_main_index)
|
$(call build_main_index)
|
||||||
|
$(call build_images)
|
||||||
|
|
||||||
MAN := $(patsubst %.xml, %.9, $(BOOKS))
|
MAN := $(patsubst %.xml, %.9, $(BOOKS))
|
||||||
mandocs: $(MAN)
|
mandocs: $(MAN)
|
||||||
|
|
||||||
media:
|
build_images = mkdir -p $(objtree)/Documentation/DocBook/media/ && \
|
||||||
mkdir -p $(srctree)/Documentation/DocBook/media/
|
cp $(srctree)/Documentation/DocBook/dvb/*.png $(srctree)/Documentation/DocBook/v4l/*.gif $(objtree)/Documentation/DocBook/media/
|
||||||
cp $(srctree)/Documentation/DocBook/dvb/*.png $(srctree)/Documentation/DocBook/v4l/*.gif $(srctree)/Documentation/DocBook/media/
|
|
||||||
|
xmldoclinks:
|
||||||
|
ifneq ($(objtree),$(srctree))
|
||||||
|
for dep in dvb media-entities.tmpl media-indices.tmpl v4l; do \
|
||||||
|
rm -f $(objtree)/Documentation/DocBook/$$dep \
|
||||||
|
&& ln -s $(srctree)/Documentation/DocBook/$$dep $(objtree)/Documentation/DocBook/ \
|
||||||
|
|| exit; \
|
||||||
|
done
|
||||||
|
endif
|
||||||
|
|
||||||
installmandocs: mandocs
|
installmandocs: mandocs
|
||||||
mkdir -p /usr/local/man/man9/
|
mkdir -p /usr/local/man/man9/
|
||||||
@@ -65,7 +74,7 @@ KERNELDOC = $(srctree)/scripts/kernel-doc
|
|||||||
DOCPROC = $(objtree)/scripts/basic/docproc
|
DOCPROC = $(objtree)/scripts/basic/docproc
|
||||||
|
|
||||||
XMLTOFLAGS = -m $(srctree)/Documentation/DocBook/stylesheet.xsl
|
XMLTOFLAGS = -m $(srctree)/Documentation/DocBook/stylesheet.xsl
|
||||||
#XMLTOFLAGS += --skip-validation
|
XMLTOFLAGS += --skip-validation
|
||||||
|
|
||||||
###
|
###
|
||||||
# DOCPROC is used for two purposes:
|
# DOCPROC is used for two purposes:
|
||||||
@@ -101,17 +110,6 @@ endif
|
|||||||
# Changes in kernel-doc force a rebuild of all documentation
|
# Changes in kernel-doc force a rebuild of all documentation
|
||||||
$(BOOKS): $(KERNELDOC)
|
$(BOOKS): $(KERNELDOC)
|
||||||
|
|
||||||
###
|
|
||||||
# procfs guide uses a .c file as example code.
|
|
||||||
# This requires an explicit dependency
|
|
||||||
C-procfs-example = procfs_example.xml
|
|
||||||
C-procfs-example2 = $(addprefix $(obj)/,$(C-procfs-example))
|
|
||||||
$(obj)/procfs-guide.xml: $(C-procfs-example2)
|
|
||||||
|
|
||||||
# List of programs to build
|
|
||||||
##oops, this is a kernel module::hostprogs-y := procfs_example
|
|
||||||
obj-m += procfs_example.o
|
|
||||||
|
|
||||||
# Tell kbuild to always build the programs
|
# Tell kbuild to always build the programs
|
||||||
always := $(hostprogs-y)
|
always := $(hostprogs-y)
|
||||||
|
|
||||||
@@ -238,7 +236,7 @@ clean-files := $(DOCBOOKS) \
|
|||||||
$(patsubst %.xml, %.pdf, $(DOCBOOKS)) \
|
$(patsubst %.xml, %.pdf, $(DOCBOOKS)) \
|
||||||
$(patsubst %.xml, %.html, $(DOCBOOKS)) \
|
$(patsubst %.xml, %.html, $(DOCBOOKS)) \
|
||||||
$(patsubst %.xml, %.9, $(DOCBOOKS)) \
|
$(patsubst %.xml, %.9, $(DOCBOOKS)) \
|
||||||
$(C-procfs-example) $(index)
|
$(index)
|
||||||
|
|
||||||
clean-dirs := $(patsubst %.xml,%,$(DOCBOOKS)) man
|
clean-dirs := $(patsubst %.xml,%,$(DOCBOOKS)) man
|
||||||
|
|
||||||
|
@@ -23,6 +23,7 @@
|
|||||||
<!ENTITY VIDIOC-ENUMINPUT "<link linkend='vidioc-enuminput'><constant>VIDIOC_ENUMINPUT</constant></link>">
|
<!ENTITY VIDIOC-ENUMINPUT "<link linkend='vidioc-enuminput'><constant>VIDIOC_ENUMINPUT</constant></link>">
|
||||||
<!ENTITY VIDIOC-ENUMOUTPUT "<link linkend='vidioc-enumoutput'><constant>VIDIOC_ENUMOUTPUT</constant></link>">
|
<!ENTITY VIDIOC-ENUMOUTPUT "<link linkend='vidioc-enumoutput'><constant>VIDIOC_ENUMOUTPUT</constant></link>">
|
||||||
<!ENTITY VIDIOC-ENUMSTD "<link linkend='vidioc-enumstd'><constant>VIDIOC_ENUMSTD</constant></link>">
|
<!ENTITY VIDIOC-ENUMSTD "<link linkend='vidioc-enumstd'><constant>VIDIOC_ENUMSTD</constant></link>">
|
||||||
|
<!ENTITY VIDIOC-ENUM-DV-PRESETS "<link linkend='vidioc-enum-dv-presets'><constant>VIDIOC_ENUM_DV_PRESETS</constant></link>">
|
||||||
<!ENTITY VIDIOC-ENUM-FMT "<link linkend='vidioc-enum-fmt'><constant>VIDIOC_ENUM_FMT</constant></link>">
|
<!ENTITY VIDIOC-ENUM-FMT "<link linkend='vidioc-enum-fmt'><constant>VIDIOC_ENUM_FMT</constant></link>">
|
||||||
<!ENTITY VIDIOC-ENUM-FRAMEINTERVALS "<link linkend='vidioc-enum-frameintervals'><constant>VIDIOC_ENUM_FRAMEINTERVALS</constant></link>">
|
<!ENTITY VIDIOC-ENUM-FRAMEINTERVALS "<link linkend='vidioc-enum-frameintervals'><constant>VIDIOC_ENUM_FRAMEINTERVALS</constant></link>">
|
||||||
<!ENTITY VIDIOC-ENUM-FRAMESIZES "<link linkend='vidioc-enum-framesizes'><constant>VIDIOC_ENUM_FRAMESIZES</constant></link>">
|
<!ENTITY VIDIOC-ENUM-FRAMESIZES "<link linkend='vidioc-enum-framesizes'><constant>VIDIOC_ENUM_FRAMESIZES</constant></link>">
|
||||||
@@ -30,6 +31,8 @@
|
|||||||
<!ENTITY VIDIOC-G-AUDOUT "<link linkend='vidioc-g-audioout'><constant>VIDIOC_G_AUDOUT</constant></link>">
|
<!ENTITY VIDIOC-G-AUDOUT "<link linkend='vidioc-g-audioout'><constant>VIDIOC_G_AUDOUT</constant></link>">
|
||||||
<!ENTITY VIDIOC-G-CROP "<link linkend='vidioc-g-crop'><constant>VIDIOC_G_CROP</constant></link>">
|
<!ENTITY VIDIOC-G-CROP "<link linkend='vidioc-g-crop'><constant>VIDIOC_G_CROP</constant></link>">
|
||||||
<!ENTITY VIDIOC-G-CTRL "<link linkend='vidioc-g-ctrl'><constant>VIDIOC_G_CTRL</constant></link>">
|
<!ENTITY VIDIOC-G-CTRL "<link linkend='vidioc-g-ctrl'><constant>VIDIOC_G_CTRL</constant></link>">
|
||||||
|
<!ENTITY VIDIOC-G-DV-PRESET "<link linkend='vidioc-g-dv-preset'><constant>VIDIOC_G_DV_PRESET</constant></link>">
|
||||||
|
<!ENTITY VIDIOC-G-DV-TIMINGS "<link linkend='vidioc-g-dv-timings'><constant>VIDIOC_G_DV_TIMINGS</constant></link>">
|
||||||
<!ENTITY VIDIOC-G-ENC-INDEX "<link linkend='vidioc-g-enc-index'><constant>VIDIOC_G_ENC_INDEX</constant></link>">
|
<!ENTITY VIDIOC-G-ENC-INDEX "<link linkend='vidioc-g-enc-index'><constant>VIDIOC_G_ENC_INDEX</constant></link>">
|
||||||
<!ENTITY VIDIOC-G-EXT-CTRLS "<link linkend='vidioc-g-ext-ctrls'><constant>VIDIOC_G_EXT_CTRLS</constant></link>">
|
<!ENTITY VIDIOC-G-EXT-CTRLS "<link linkend='vidioc-g-ext-ctrls'><constant>VIDIOC_G_EXT_CTRLS</constant></link>">
|
||||||
<!ENTITY VIDIOC-G-FBUF "<link linkend='vidioc-g-fbuf'><constant>VIDIOC_G_FBUF</constant></link>">
|
<!ENTITY VIDIOC-G-FBUF "<link linkend='vidioc-g-fbuf'><constant>VIDIOC_G_FBUF</constant></link>">
|
||||||
@@ -53,6 +56,7 @@
|
|||||||
<!ENTITY VIDIOC-QUERYCTRL "<link linkend='vidioc-queryctrl'><constant>VIDIOC_QUERYCTRL</constant></link>">
|
<!ENTITY VIDIOC-QUERYCTRL "<link linkend='vidioc-queryctrl'><constant>VIDIOC_QUERYCTRL</constant></link>">
|
||||||
<!ENTITY VIDIOC-QUERYMENU "<link linkend='vidioc-queryctrl'><constant>VIDIOC_QUERYMENU</constant></link>">
|
<!ENTITY VIDIOC-QUERYMENU "<link linkend='vidioc-queryctrl'><constant>VIDIOC_QUERYMENU</constant></link>">
|
||||||
<!ENTITY VIDIOC-QUERYSTD "<link linkend='vidioc-querystd'><constant>VIDIOC_QUERYSTD</constant></link>">
|
<!ENTITY VIDIOC-QUERYSTD "<link linkend='vidioc-querystd'><constant>VIDIOC_QUERYSTD</constant></link>">
|
||||||
|
<!ENTITY VIDIOC-QUERY-DV-PRESET "<link linkend='vidioc-query-dv-preset'><constant>VIDIOC_QUERY_DV_PRESET</constant></link>">
|
||||||
<!ENTITY VIDIOC-REQBUFS "<link linkend='vidioc-reqbufs'><constant>VIDIOC_REQBUFS</constant></link>">
|
<!ENTITY VIDIOC-REQBUFS "<link linkend='vidioc-reqbufs'><constant>VIDIOC_REQBUFS</constant></link>">
|
||||||
<!ENTITY VIDIOC-STREAMOFF "<link linkend='vidioc-streamon'><constant>VIDIOC_STREAMOFF</constant></link>">
|
<!ENTITY VIDIOC-STREAMOFF "<link linkend='vidioc-streamon'><constant>VIDIOC_STREAMOFF</constant></link>">
|
||||||
<!ENTITY VIDIOC-STREAMON "<link linkend='vidioc-streamon'><constant>VIDIOC_STREAMON</constant></link>">
|
<!ENTITY VIDIOC-STREAMON "<link linkend='vidioc-streamon'><constant>VIDIOC_STREAMON</constant></link>">
|
||||||
@@ -60,6 +64,8 @@
|
|||||||
<!ENTITY VIDIOC-S-AUDOUT "<link linkend='vidioc-g-audioout'><constant>VIDIOC_S_AUDOUT</constant></link>">
|
<!ENTITY VIDIOC-S-AUDOUT "<link linkend='vidioc-g-audioout'><constant>VIDIOC_S_AUDOUT</constant></link>">
|
||||||
<!ENTITY VIDIOC-S-CROP "<link linkend='vidioc-g-crop'><constant>VIDIOC_S_CROP</constant></link>">
|
<!ENTITY VIDIOC-S-CROP "<link linkend='vidioc-g-crop'><constant>VIDIOC_S_CROP</constant></link>">
|
||||||
<!ENTITY VIDIOC-S-CTRL "<link linkend='vidioc-g-ctrl'><constant>VIDIOC_S_CTRL</constant></link>">
|
<!ENTITY VIDIOC-S-CTRL "<link linkend='vidioc-g-ctrl'><constant>VIDIOC_S_CTRL</constant></link>">
|
||||||
|
<!ENTITY VIDIOC-S-DV-PRESET "<link linkend='vidioc-g-dv-preset'><constant>VIDIOC_S_DV_PRESET</constant></link>">
|
||||||
|
<!ENTITY VIDIOC-S-DV-TIMINGS "<link linkend='vidioc-g-dv-timings'><constant>VIDIOC_S_DV_TIMINGS</constant></link>">
|
||||||
<!ENTITY VIDIOC-S-EXT-CTRLS "<link linkend='vidioc-g-ext-ctrls'><constant>VIDIOC_S_EXT_CTRLS</constant></link>">
|
<!ENTITY VIDIOC-S-EXT-CTRLS "<link linkend='vidioc-g-ext-ctrls'><constant>VIDIOC_S_EXT_CTRLS</constant></link>">
|
||||||
<!ENTITY VIDIOC-S-FBUF "<link linkend='vidioc-g-fbuf'><constant>VIDIOC_S_FBUF</constant></link>">
|
<!ENTITY VIDIOC-S-FBUF "<link linkend='vidioc-g-fbuf'><constant>VIDIOC_S_FBUF</constant></link>">
|
||||||
<!ENTITY VIDIOC-S-FMT "<link linkend='vidioc-g-fmt'><constant>VIDIOC_S_FMT</constant></link>">
|
<!ENTITY VIDIOC-S-FMT "<link linkend='vidioc-g-fmt'><constant>VIDIOC_S_FMT</constant></link>">
|
||||||
@@ -118,6 +124,7 @@
|
|||||||
<!-- Structures -->
|
<!-- Structures -->
|
||||||
<!ENTITY v4l2-audio "struct <link linkend='v4l2-audio'>v4l2_audio</link>">
|
<!ENTITY v4l2-audio "struct <link linkend='v4l2-audio'>v4l2_audio</link>">
|
||||||
<!ENTITY v4l2-audioout "struct <link linkend='v4l2-audioout'>v4l2_audioout</link>">
|
<!ENTITY v4l2-audioout "struct <link linkend='v4l2-audioout'>v4l2_audioout</link>">
|
||||||
|
<!ENTITY v4l2-bt-timings "struct <link linkend='v4l2-bt-timings'>v4l2_bt_timings</link>">
|
||||||
<!ENTITY v4l2-buffer "struct <link linkend='v4l2-buffer'>v4l2_buffer</link>">
|
<!ENTITY v4l2-buffer "struct <link linkend='v4l2-buffer'>v4l2_buffer</link>">
|
||||||
<!ENTITY v4l2-capability "struct <link linkend='v4l2-capability'>v4l2_capability</link>">
|
<!ENTITY v4l2-capability "struct <link linkend='v4l2-capability'>v4l2_capability</link>">
|
||||||
<!ENTITY v4l2-captureparm "struct <link linkend='v4l2-captureparm'>v4l2_captureparm</link>">
|
<!ENTITY v4l2-captureparm "struct <link linkend='v4l2-captureparm'>v4l2_captureparm</link>">
|
||||||
@@ -128,6 +135,9 @@
|
|||||||
<!ENTITY v4l2-dbg-chip-ident "struct <link linkend='v4l2-dbg-chip-ident'>v4l2_dbg_chip_ident</link>">
|
<!ENTITY v4l2-dbg-chip-ident "struct <link linkend='v4l2-dbg-chip-ident'>v4l2_dbg_chip_ident</link>">
|
||||||
<!ENTITY v4l2-dbg-match "struct <link linkend='v4l2-dbg-match'>v4l2_dbg_match</link>">
|
<!ENTITY v4l2-dbg-match "struct <link linkend='v4l2-dbg-match'>v4l2_dbg_match</link>">
|
||||||
<!ENTITY v4l2-dbg-register "struct <link linkend='v4l2-dbg-register'>v4l2_dbg_register</link>">
|
<!ENTITY v4l2-dbg-register "struct <link linkend='v4l2-dbg-register'>v4l2_dbg_register</link>">
|
||||||
|
<!ENTITY v4l2-dv-enum-preset "struct <link linkend='v4l2-dv-enum-preset'>v4l2_dv_enum_preset</link>">
|
||||||
|
<!ENTITY v4l2-dv-preset "struct <link linkend='v4l2-dv-preset'>v4l2_dv_preset</link>">
|
||||||
|
<!ENTITY v4l2-dv-timings "struct <link linkend='v4l2-dv-timings'>v4l2_dv_timings</link>">
|
||||||
<!ENTITY v4l2-enc-idx "struct <link linkend='v4l2-enc-idx'>v4l2_enc_idx</link>">
|
<!ENTITY v4l2-enc-idx "struct <link linkend='v4l2-enc-idx'>v4l2_enc_idx</link>">
|
||||||
<!ENTITY v4l2-enc-idx-entry "struct <link linkend='v4l2-enc-idx-entry'>v4l2_enc_idx_entry</link>">
|
<!ENTITY v4l2-enc-idx-entry "struct <link linkend='v4l2-enc-idx-entry'>v4l2_enc_idx_entry</link>">
|
||||||
<!ENTITY v4l2-encoder-cmd "struct <link linkend='v4l2-encoder-cmd'>v4l2_encoder_cmd</link>">
|
<!ENTITY v4l2-encoder-cmd "struct <link linkend='v4l2-encoder-cmd'>v4l2_encoder_cmd</link>">
|
||||||
@@ -243,6 +253,10 @@
|
|||||||
<!ENTITY sub-enumaudioout SYSTEM "v4l/vidioc-enumaudioout.xml">
|
<!ENTITY sub-enumaudioout SYSTEM "v4l/vidioc-enumaudioout.xml">
|
||||||
<!ENTITY sub-enuminput SYSTEM "v4l/vidioc-enuminput.xml">
|
<!ENTITY sub-enuminput SYSTEM "v4l/vidioc-enuminput.xml">
|
||||||
<!ENTITY sub-enumoutput SYSTEM "v4l/vidioc-enumoutput.xml">
|
<!ENTITY sub-enumoutput SYSTEM "v4l/vidioc-enumoutput.xml">
|
||||||
|
<!ENTITY sub-enum-dv-presets SYSTEM "v4l/vidioc-enum-dv-presets.xml">
|
||||||
|
<!ENTITY sub-g-dv-preset SYSTEM "v4l/vidioc-g-dv-preset.xml">
|
||||||
|
<!ENTITY sub-query-dv-preset SYSTEM "v4l/vidioc-query-dv-preset.xml">
|
||||||
|
<!ENTITY sub-g-dv-timings SYSTEM "v4l/vidioc-g-dv-timings.xml">
|
||||||
<!ENTITY sub-enumstd SYSTEM "v4l/vidioc-enumstd.xml">
|
<!ENTITY sub-enumstd SYSTEM "v4l/vidioc-enumstd.xml">
|
||||||
<!ENTITY sub-g-audio SYSTEM "v4l/vidioc-g-audio.xml">
|
<!ENTITY sub-g-audio SYSTEM "v4l/vidioc-g-audio.xml">
|
||||||
<!ENTITY sub-g-audioout SYSTEM "v4l/vidioc-g-audioout.xml">
|
<!ENTITY sub-g-audioout SYSTEM "v4l/vidioc-g-audioout.xml">
|
||||||
@@ -333,6 +347,10 @@
|
|||||||
<!ENTITY enumaudioout SYSTEM "v4l/vidioc-enumaudioout.xml">
|
<!ENTITY enumaudioout SYSTEM "v4l/vidioc-enumaudioout.xml">
|
||||||
<!ENTITY enuminput SYSTEM "v4l/vidioc-enuminput.xml">
|
<!ENTITY enuminput SYSTEM "v4l/vidioc-enuminput.xml">
|
||||||
<!ENTITY enumoutput SYSTEM "v4l/vidioc-enumoutput.xml">
|
<!ENTITY enumoutput SYSTEM "v4l/vidioc-enumoutput.xml">
|
||||||
|
<!ENTITY enum-dv-presets SYSTEM "v4l/vidioc-enum-dv-presets.xml">
|
||||||
|
<!ENTITY g-dv-preset SYSTEM "v4l/vidioc-g-dv-preset.xml">
|
||||||
|
<!ENTITY query-dv-preset SYSTEM "v4l/vidioc-query-dv-preset.xml">
|
||||||
|
<!ENTITY g-dv-timings SYSTEM "v4l/vidioc-g-dv-timings.xml">
|
||||||
<!ENTITY enumstd SYSTEM "v4l/vidioc-enumstd.xml">
|
<!ENTITY enumstd SYSTEM "v4l/vidioc-enumstd.xml">
|
||||||
<!ENTITY g-audio SYSTEM "v4l/vidioc-g-audio.xml">
|
<!ENTITY g-audio SYSTEM "v4l/vidioc-g-audio.xml">
|
||||||
<!ENTITY g-audioout SYSTEM "v4l/vidioc-g-audioout.xml">
|
<!ENTITY g-audioout SYSTEM "v4l/vidioc-g-audioout.xml">
|
||||||
|
@@ -36,6 +36,7 @@
|
|||||||
<indexentry><primaryie>enum <link linkend='v4l2-preemphasis'>v4l2_preemphasis</link></primaryie></indexentry>
|
<indexentry><primaryie>enum <link linkend='v4l2-preemphasis'>v4l2_preemphasis</link></primaryie></indexentry>
|
||||||
<indexentry><primaryie>struct <link linkend='v4l2-audio'>v4l2_audio</link></primaryie></indexentry>
|
<indexentry><primaryie>struct <link linkend='v4l2-audio'>v4l2_audio</link></primaryie></indexentry>
|
||||||
<indexentry><primaryie>struct <link linkend='v4l2-audioout'>v4l2_audioout</link></primaryie></indexentry>
|
<indexentry><primaryie>struct <link linkend='v4l2-audioout'>v4l2_audioout</link></primaryie></indexentry>
|
||||||
|
<indexentry><primaryie>struct <link linkend='v4l2-bt-timings'>v4l2_bt_timings</link></primaryie></indexentry>
|
||||||
<indexentry><primaryie>struct <link linkend='v4l2-buffer'>v4l2_buffer</link></primaryie></indexentry>
|
<indexentry><primaryie>struct <link linkend='v4l2-buffer'>v4l2_buffer</link></primaryie></indexentry>
|
||||||
<indexentry><primaryie>struct <link linkend='v4l2-capability'>v4l2_capability</link></primaryie></indexentry>
|
<indexentry><primaryie>struct <link linkend='v4l2-capability'>v4l2_capability</link></primaryie></indexentry>
|
||||||
<indexentry><primaryie>struct <link linkend='v4l2-captureparm'>v4l2_captureparm</link></primaryie></indexentry>
|
<indexentry><primaryie>struct <link linkend='v4l2-captureparm'>v4l2_captureparm</link></primaryie></indexentry>
|
||||||
@@ -46,6 +47,9 @@
|
|||||||
<indexentry><primaryie>struct <link linkend='v4l2-dbg-chip-ident'>v4l2_dbg_chip_ident</link></primaryie></indexentry>
|
<indexentry><primaryie>struct <link linkend='v4l2-dbg-chip-ident'>v4l2_dbg_chip_ident</link></primaryie></indexentry>
|
||||||
<indexentry><primaryie>struct <link linkend='v4l2-dbg-match'>v4l2_dbg_match</link></primaryie></indexentry>
|
<indexentry><primaryie>struct <link linkend='v4l2-dbg-match'>v4l2_dbg_match</link></primaryie></indexentry>
|
||||||
<indexentry><primaryie>struct <link linkend='v4l2-dbg-register'>v4l2_dbg_register</link></primaryie></indexentry>
|
<indexentry><primaryie>struct <link linkend='v4l2-dbg-register'>v4l2_dbg_register</link></primaryie></indexentry>
|
||||||
|
<indexentry><primaryie>struct <link linkend='v4l2-dv-enum-preset'>v4l2_dv_enum_preset</link></primaryie></indexentry>
|
||||||
|
<indexentry><primaryie>struct <link linkend='v4l2-dv-preset'>v4l2_dv_preset</link></primaryie></indexentry>
|
||||||
|
<indexentry><primaryie>struct <link linkend='v4l2-dv-timings'>v4l2_dv_timings</link></primaryie></indexentry>
|
||||||
<indexentry><primaryie>struct <link linkend='v4l2-enc-idx'>v4l2_enc_idx</link></primaryie></indexentry>
|
<indexentry><primaryie>struct <link linkend='v4l2-enc-idx'>v4l2_enc_idx</link></primaryie></indexentry>
|
||||||
<indexentry><primaryie>struct <link linkend='v4l2-enc-idx-entry'>v4l2_enc_idx_entry</link></primaryie></indexentry>
|
<indexentry><primaryie>struct <link linkend='v4l2-enc-idx-entry'>v4l2_enc_idx_entry</link></primaryie></indexentry>
|
||||||
<indexentry><primaryie>struct <link linkend='v4l2-encoder-cmd'>v4l2_encoder_cmd</link></primaryie></indexentry>
|
<indexentry><primaryie>struct <link linkend='v4l2-encoder-cmd'>v4l2_encoder_cmd</link></primaryie></indexentry>
|
||||||
|
@@ -1,626 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
|
|
||||||
"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
|
|
||||||
<!ENTITY procfsexample SYSTEM "procfs_example.xml">
|
|
||||||
]>
|
|
||||||
|
|
||||||
<book id="LKProcfsGuide">
|
|
||||||
<bookinfo>
|
|
||||||
<title>Linux Kernel Procfs Guide</title>
|
|
||||||
|
|
||||||
<authorgroup>
|
|
||||||
<author>
|
|
||||||
<firstname>Erik</firstname>
|
|
||||||
<othername>(J.A.K.)</othername>
|
|
||||||
<surname>Mouw</surname>
|
|
||||||
<affiliation>
|
|
||||||
<address>
|
|
||||||
<email>mouw@nl.linux.org</email>
|
|
||||||
</address>
|
|
||||||
</affiliation>
|
|
||||||
</author>
|
|
||||||
<othercredit>
|
|
||||||
<contrib>
|
|
||||||
This software and documentation were written while working on the
|
|
||||||
LART computing board
|
|
||||||
(<ulink url="http://www.lartmaker.nl/">http://www.lartmaker.nl/</ulink>),
|
|
||||||
which was sponsored by the Delt University of Technology projects
|
|
||||||
Mobile Multi-media Communications and Ubiquitous Communications.
|
|
||||||
</contrib>
|
|
||||||
</othercredit>
|
|
||||||
</authorgroup>
|
|
||||||
|
|
||||||
<revhistory>
|
|
||||||
<revision>
|
|
||||||
<revnumber>1.0</revnumber>
|
|
||||||
<date>May 30, 2001</date>
|
|
||||||
<revremark>Initial revision posted to linux-kernel</revremark>
|
|
||||||
</revision>
|
|
||||||
<revision>
|
|
||||||
<revnumber>1.1</revnumber>
|
|
||||||
<date>June 3, 2001</date>
|
|
||||||
<revremark>Revised after comments from linux-kernel</revremark>
|
|
||||||
</revision>
|
|
||||||
</revhistory>
|
|
||||||
|
|
||||||
<copyright>
|
|
||||||
<year>2001</year>
|
|
||||||
<holder>Erik Mouw</holder>
|
|
||||||
</copyright>
|
|
||||||
|
|
||||||
|
|
||||||
<legalnotice>
|
|
||||||
<para>
|
|
||||||
This documentation is free software; you can redistribute it
|
|
||||||
and/or modify it under the terms of the GNU General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2 of the License, or (at your option) any later
|
|
||||||
version.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
This documentation is distributed in the hope that it will be
|
|
||||||
useful, but WITHOUT ANY WARRANTY; without even the implied
|
|
||||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
||||||
PURPOSE. See the GNU General Public License for more details.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
You should have received a copy of the GNU General Public
|
|
||||||
License along with this program; if not, write to the Free
|
|
||||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
|
||||||
MA 02111-1307 USA
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
For more details see the file COPYING in the source
|
|
||||||
distribution of Linux.
|
|
||||||
</para>
|
|
||||||
</legalnotice>
|
|
||||||
</bookinfo>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<toc>
|
|
||||||
</toc>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<preface id="Preface">
|
|
||||||
<title>Preface</title>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
This guide describes the use of the procfs file system from
|
|
||||||
within the Linux kernel. The idea to write this guide came up on
|
|
||||||
the #kernelnewbies IRC channel (see <ulink
|
|
||||||
url="http://www.kernelnewbies.org/">http://www.kernelnewbies.org/</ulink>),
|
|
||||||
when Jeff Garzik explained the use of procfs and forwarded me a
|
|
||||||
message Alexander Viro wrote to the linux-kernel mailing list. I
|
|
||||||
agreed to write it up nicely, so here it is.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
I'd like to thank Jeff Garzik
|
|
||||||
<email>jgarzik@pobox.com</email> and Alexander Viro
|
|
||||||
<email>viro@parcelfarce.linux.theplanet.co.uk</email> for their input,
|
|
||||||
Tim Waugh <email>twaugh@redhat.com</email> for his <ulink
|
|
||||||
url="http://people.redhat.com/twaugh/docbook/selfdocbook/">Selfdocbook</ulink>,
|
|
||||||
and Marc Joosen <email>marcj@historia.et.tudelft.nl</email> for
|
|
||||||
proofreading.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
Erik
|
|
||||||
</para>
|
|
||||||
</preface>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<chapter id="intro">
|
|
||||||
<title>Introduction</title>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
The <filename class="directory">/proc</filename> file system
|
|
||||||
(procfs) is a special file system in the linux kernel. It's a
|
|
||||||
virtual file system: it is not associated with a block device
|
|
||||||
but exists only in memory. The files in the procfs are there to
|
|
||||||
allow userland programs access to certain information from the
|
|
||||||
kernel (like process information in <filename
|
|
||||||
class="directory">/proc/[0-9]+/</filename>), but also for debug
|
|
||||||
purposes (like <filename>/proc/ksyms</filename>).
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
This guide describes the use of the procfs file system from
|
|
||||||
within the Linux kernel. It starts by introducing all relevant
|
|
||||||
functions to manage the files within the file system. After that
|
|
||||||
it shows how to communicate with userland, and some tips and
|
|
||||||
tricks will be pointed out. Finally a complete example will be
|
|
||||||
shown.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
Note that the files in <filename
|
|
||||||
class="directory">/proc/sys</filename> are sysctl files: they
|
|
||||||
don't belong to procfs and are governed by a completely
|
|
||||||
different API described in the Kernel API book.
|
|
||||||
</para>
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<chapter id="managing">
|
|
||||||
<title>Managing procfs entries</title>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
This chapter describes the functions that various kernel
|
|
||||||
components use to populate the procfs with files, symlinks,
|
|
||||||
device nodes, and directories.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
A minor note before we start: if you want to use any of the
|
|
||||||
procfs functions, be sure to include the correct header file!
|
|
||||||
This should be one of the first lines in your code:
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<programlisting>
|
|
||||||
#include <linux/proc_fs.h>
|
|
||||||
</programlisting>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<sect1 id="regularfile">
|
|
||||||
<title>Creating a regular file</title>
|
|
||||||
|
|
||||||
<funcsynopsis>
|
|
||||||
<funcprototype>
|
|
||||||
<funcdef>struct proc_dir_entry* <function>create_proc_entry</function></funcdef>
|
|
||||||
<paramdef>const char* <parameter>name</parameter></paramdef>
|
|
||||||
<paramdef>mode_t <parameter>mode</parameter></paramdef>
|
|
||||||
<paramdef>struct proc_dir_entry* <parameter>parent</parameter></paramdef>
|
|
||||||
</funcprototype>
|
|
||||||
</funcsynopsis>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
This function creates a regular file with the name
|
|
||||||
<parameter>name</parameter>, file mode
|
|
||||||
<parameter>mode</parameter> in the directory
|
|
||||||
<parameter>parent</parameter>. To create a file in the root of
|
|
||||||
the procfs, use <constant>NULL</constant> as
|
|
||||||
<parameter>parent</parameter> parameter. When successful, the
|
|
||||||
function will return a pointer to the freshly created
|
|
||||||
<structname>struct proc_dir_entry</structname>; otherwise it
|
|
||||||
will return <constant>NULL</constant>. <xref
|
|
||||||
linkend="userland"/> describes how to do something useful with
|
|
||||||
regular files.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
Note that it is specifically supported that you can pass a
|
|
||||||
path that spans multiple directories. For example
|
|
||||||
<function>create_proc_entry</function>(<parameter>"drivers/via0/info"</parameter>)
|
|
||||||
will create the <filename class="directory">via0</filename>
|
|
||||||
directory if necessary, with standard
|
|
||||||
<constant>0755</constant> permissions.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
If you only want to be able to read the file, the function
|
|
||||||
<function>create_proc_read_entry</function> described in <xref
|
|
||||||
linkend="convenience"/> may be used to create and initialise
|
|
||||||
the procfs entry in one single call.
|
|
||||||
</para>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<sect1 id="Creating_a_symlink">
|
|
||||||
<title>Creating a symlink</title>
|
|
||||||
|
|
||||||
<funcsynopsis>
|
|
||||||
<funcprototype>
|
|
||||||
<funcdef>struct proc_dir_entry*
|
|
||||||
<function>proc_symlink</function></funcdef> <paramdef>const
|
|
||||||
char* <parameter>name</parameter></paramdef>
|
|
||||||
<paramdef>struct proc_dir_entry*
|
|
||||||
<parameter>parent</parameter></paramdef> <paramdef>const
|
|
||||||
char* <parameter>dest</parameter></paramdef>
|
|
||||||
</funcprototype>
|
|
||||||
</funcsynopsis>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
This creates a symlink in the procfs directory
|
|
||||||
<parameter>parent</parameter> that points from
|
|
||||||
<parameter>name</parameter> to
|
|
||||||
<parameter>dest</parameter>. This translates in userland to
|
|
||||||
<literal>ln -s</literal> <parameter>dest</parameter>
|
|
||||||
<parameter>name</parameter>.
|
|
||||||
</para>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1 id="Creating_a_directory">
|
|
||||||
<title>Creating a directory</title>
|
|
||||||
|
|
||||||
<funcsynopsis>
|
|
||||||
<funcprototype>
|
|
||||||
<funcdef>struct proc_dir_entry* <function>proc_mkdir</function></funcdef>
|
|
||||||
<paramdef>const char* <parameter>name</parameter></paramdef>
|
|
||||||
<paramdef>struct proc_dir_entry* <parameter>parent</parameter></paramdef>
|
|
||||||
</funcprototype>
|
|
||||||
</funcsynopsis>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
Create a directory <parameter>name</parameter> in the procfs
|
|
||||||
directory <parameter>parent</parameter>.
|
|
||||||
</para>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<sect1 id="Removing_an_entry">
|
|
||||||
<title>Removing an entry</title>
|
|
||||||
|
|
||||||
<funcsynopsis>
|
|
||||||
<funcprototype>
|
|
||||||
<funcdef>void <function>remove_proc_entry</function></funcdef>
|
|
||||||
<paramdef>const char* <parameter>name</parameter></paramdef>
|
|
||||||
<paramdef>struct proc_dir_entry* <parameter>parent</parameter></paramdef>
|
|
||||||
</funcprototype>
|
|
||||||
</funcsynopsis>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
Removes the entry <parameter>name</parameter> in the directory
|
|
||||||
<parameter>parent</parameter> from the procfs. Entries are
|
|
||||||
removed by their <emphasis>name</emphasis>, not by the
|
|
||||||
<structname>struct proc_dir_entry</structname> returned by the
|
|
||||||
various create functions. Note that this function doesn't
|
|
||||||
recursively remove entries.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
Be sure to free the <structfield>data</structfield> entry from
|
|
||||||
the <structname>struct proc_dir_entry</structname> before
|
|
||||||
<function>remove_proc_entry</function> is called (that is: if
|
|
||||||
there was some <structfield>data</structfield> allocated, of
|
|
||||||
course). See <xref linkend="usingdata"/> for more information
|
|
||||||
on using the <structfield>data</structfield> entry.
|
|
||||||
</para>
|
|
||||||
</sect1>
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<chapter id="userland">
|
|
||||||
<title>Communicating with userland</title>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
Instead of reading (or writing) information directly from
|
|
||||||
kernel memory, procfs works with <emphasis>call back
|
|
||||||
functions</emphasis> for files: functions that are called when
|
|
||||||
a specific file is being read or written. Such functions have
|
|
||||||
to be initialised after the procfs file is created by setting
|
|
||||||
the <structfield>read_proc</structfield> and/or
|
|
||||||
<structfield>write_proc</structfield> fields in the
|
|
||||||
<structname>struct proc_dir_entry*</structname> that the
|
|
||||||
function <function>create_proc_entry</function> returned:
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<programlisting>
|
|
||||||
struct proc_dir_entry* entry;
|
|
||||||
|
|
||||||
entry->read_proc = read_proc_foo;
|
|
||||||
entry->write_proc = write_proc_foo;
|
|
||||||
</programlisting>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
If you only want to use a the
|
|
||||||
<structfield>read_proc</structfield>, the function
|
|
||||||
<function>create_proc_read_entry</function> described in <xref
|
|
||||||
linkend="convenience"/> may be used to create and initialise the
|
|
||||||
procfs entry in one single call.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<sect1 id="Reading_data">
|
|
||||||
<title>Reading data</title>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
The read function is a call back function that allows userland
|
|
||||||
processes to read data from the kernel. The read function
|
|
||||||
should have the following format:
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<funcsynopsis>
|
|
||||||
<funcprototype>
|
|
||||||
<funcdef>int <function>read_func</function></funcdef>
|
|
||||||
<paramdef>char* <parameter>buffer</parameter></paramdef>
|
|
||||||
<paramdef>char** <parameter>start</parameter></paramdef>
|
|
||||||
<paramdef>off_t <parameter>off</parameter></paramdef>
|
|
||||||
<paramdef>int <parameter>count</parameter></paramdef>
|
|
||||||
<paramdef>int* <parameter>peof</parameter></paramdef>
|
|
||||||
<paramdef>void* <parameter>data</parameter></paramdef>
|
|
||||||
</funcprototype>
|
|
||||||
</funcsynopsis>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
The read function should write its information into the
|
|
||||||
<parameter>buffer</parameter>, which will be exactly
|
|
||||||
<literal>PAGE_SIZE</literal> bytes long.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
The parameter
|
|
||||||
<parameter>peof</parameter> should be used to signal that the
|
|
||||||
end of the file has been reached by writing
|
|
||||||
<literal>1</literal> to the memory location
|
|
||||||
<parameter>peof</parameter> points to.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
The <parameter>data</parameter>
|
|
||||||
parameter can be used to create a single call back function for
|
|
||||||
several files, see <xref linkend="usingdata"/>.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
The rest of the parameters and the return value are described
|
|
||||||
by a comment in <filename>fs/proc/generic.c</filename> as follows:
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<blockquote>
|
|
||||||
<para>
|
|
||||||
You have three ways to return data:
|
|
||||||
</para>
|
|
||||||
<orderedlist>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Leave <literal>*start = NULL</literal>. (This is the default.)
|
|
||||||
Put the data of the requested offset at that
|
|
||||||
offset within the buffer. Return the number (<literal>n</literal>)
|
|
||||||
of bytes there are from the beginning of the
|
|
||||||
buffer up to the last byte of data. If the
|
|
||||||
number of supplied bytes (<literal>= n - offset</literal>) is
|
|
||||||
greater than zero and you didn't signal eof
|
|
||||||
and the reader is prepared to take more data
|
|
||||||
you will be called again with the requested
|
|
||||||
offset advanced by the number of bytes
|
|
||||||
absorbed. This interface is useful for files
|
|
||||||
no larger than the buffer.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Set <literal>*start</literal> to an unsigned long value less than
|
|
||||||
the buffer address but greater than zero.
|
|
||||||
Put the data of the requested offset at the
|
|
||||||
beginning of the buffer. Return the number of
|
|
||||||
bytes of data placed there. If this number is
|
|
||||||
greater than zero and you didn't signal eof
|
|
||||||
and the reader is prepared to take more data
|
|
||||||
you will be called again with the requested
|
|
||||||
offset advanced by <literal>*start</literal>. This interface is
|
|
||||||
useful when you have a large file consisting
|
|
||||||
of a series of blocks which you want to count
|
|
||||||
and return as wholes.
|
|
||||||
(Hack by Paul.Russell@rustcorp.com.au)
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
<listitem>
|
|
||||||
<para>
|
|
||||||
Set <literal>*start</literal> to an address within the buffer.
|
|
||||||
Put the data of the requested offset at <literal>*start</literal>.
|
|
||||||
Return the number of bytes of data placed there.
|
|
||||||
If this number is greater than zero and you
|
|
||||||
didn't signal eof and the reader is prepared to
|
|
||||||
take more data you will be called again with the
|
|
||||||
requested offset advanced by the number of bytes
|
|
||||||
absorbed.
|
|
||||||
</para>
|
|
||||||
</listitem>
|
|
||||||
</orderedlist>
|
|
||||||
</blockquote>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
<xref linkend="example"/> shows how to use a read call back
|
|
||||||
function.
|
|
||||||
</para>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<sect1 id="Writing_data">
|
|
||||||
<title>Writing data</title>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
The write call back function allows a userland process to write
|
|
||||||
data to the kernel, so it has some kind of control over the
|
|
||||||
kernel. The write function should have the following format:
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<funcsynopsis>
|
|
||||||
<funcprototype>
|
|
||||||
<funcdef>int <function>write_func</function></funcdef>
|
|
||||||
<paramdef>struct file* <parameter>file</parameter></paramdef>
|
|
||||||
<paramdef>const char* <parameter>buffer</parameter></paramdef>
|
|
||||||
<paramdef>unsigned long <parameter>count</parameter></paramdef>
|
|
||||||
<paramdef>void* <parameter>data</parameter></paramdef>
|
|
||||||
</funcprototype>
|
|
||||||
</funcsynopsis>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
The write function should read <parameter>count</parameter>
|
|
||||||
bytes at maximum from the <parameter>buffer</parameter>. Note
|
|
||||||
that the <parameter>buffer</parameter> doesn't live in the
|
|
||||||
kernel's memory space, so it should first be copied to kernel
|
|
||||||
space with <function>copy_from_user</function>. The
|
|
||||||
<parameter>file</parameter> parameter is usually
|
|
||||||
ignored. <xref linkend="usingdata"/> shows how to use the
|
|
||||||
<parameter>data</parameter> parameter.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
Again, <xref linkend="example"/> shows how to use this call back
|
|
||||||
function.
|
|
||||||
</para>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<sect1 id="usingdata">
|
|
||||||
<title>A single call back for many files</title>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
When a large number of almost identical files is used, it's
|
|
||||||
quite inconvenient to use a separate call back function for
|
|
||||||
each file. A better approach is to have a single call back
|
|
||||||
function that distinguishes between the files by using the
|
|
||||||
<structfield>data</structfield> field in <structname>struct
|
|
||||||
proc_dir_entry</structname>. First of all, the
|
|
||||||
<structfield>data</structfield> field has to be initialised:
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<programlisting>
|
|
||||||
struct proc_dir_entry* entry;
|
|
||||||
struct my_file_data *file_data;
|
|
||||||
|
|
||||||
file_data = kmalloc(sizeof(struct my_file_data), GFP_KERNEL);
|
|
||||||
entry->data = file_data;
|
|
||||||
</programlisting>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
The <structfield>data</structfield> field is a <type>void
|
|
||||||
*</type>, so it can be initialised with anything.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
Now that the <structfield>data</structfield> field is set, the
|
|
||||||
<function>read_proc</function> and
|
|
||||||
<function>write_proc</function> can use it to distinguish
|
|
||||||
between files because they get it passed into their
|
|
||||||
<parameter>data</parameter> parameter:
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<programlisting>
|
|
||||||
int foo_read_func(char *page, char **start, off_t off,
|
|
||||||
int count, int *eof, void *data)
|
|
||||||
{
|
|
||||||
int len;
|
|
||||||
|
|
||||||
if(data == file_data) {
|
|
||||||
/* special case for this file */
|
|
||||||
} else {
|
|
||||||
/* normal processing */
|
|
||||||
}
|
|
||||||
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
</programlisting>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
Be sure to free the <structfield>data</structfield> data field
|
|
||||||
when removing the procfs entry.
|
|
||||||
</para>
|
|
||||||
</sect1>
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<chapter id="tips">
|
|
||||||
<title>Tips and tricks</title>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<sect1 id="convenience">
|
|
||||||
<title>Convenience functions</title>
|
|
||||||
|
|
||||||
<funcsynopsis>
|
|
||||||
<funcprototype>
|
|
||||||
<funcdef>struct proc_dir_entry* <function>create_proc_read_entry</function></funcdef>
|
|
||||||
<paramdef>const char* <parameter>name</parameter></paramdef>
|
|
||||||
<paramdef>mode_t <parameter>mode</parameter></paramdef>
|
|
||||||
<paramdef>struct proc_dir_entry* <parameter>parent</parameter></paramdef>
|
|
||||||
<paramdef>read_proc_t* <parameter>read_proc</parameter></paramdef>
|
|
||||||
<paramdef>void* <parameter>data</parameter></paramdef>
|
|
||||||
</funcprototype>
|
|
||||||
</funcsynopsis>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
This function creates a regular file in exactly the same way
|
|
||||||
as <function>create_proc_entry</function> from <xref
|
|
||||||
linkend="regularfile"/> does, but also allows to set the read
|
|
||||||
function <parameter>read_proc</parameter> in one call. This
|
|
||||||
function can set the <parameter>data</parameter> as well, like
|
|
||||||
explained in <xref linkend="usingdata"/>.
|
|
||||||
</para>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<sect1 id="Modules">
|
|
||||||
<title>Modules</title>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
If procfs is being used from within a module, be sure to set
|
|
||||||
the <structfield>owner</structfield> field in the
|
|
||||||
<structname>struct proc_dir_entry</structname> to
|
|
||||||
<constant>THIS_MODULE</constant>.
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<programlisting>
|
|
||||||
struct proc_dir_entry* entry;
|
|
||||||
|
|
||||||
entry->owner = THIS_MODULE;
|
|
||||||
</programlisting>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<sect1 id="Mode_and_ownership">
|
|
||||||
<title>Mode and ownership</title>
|
|
||||||
|
|
||||||
<para>
|
|
||||||
Sometimes it is useful to change the mode and/or ownership of
|
|
||||||
a procfs entry. Here is an example that shows how to achieve
|
|
||||||
that:
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<programlisting>
|
|
||||||
struct proc_dir_entry* entry;
|
|
||||||
|
|
||||||
entry->mode = S_IWUSR |S_IRUSR | S_IRGRP | S_IROTH;
|
|
||||||
entry->uid = 0;
|
|
||||||
entry->gid = 100;
|
|
||||||
</programlisting>
|
|
||||||
|
|
||||||
</sect1>
|
|
||||||
</chapter>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<chapter id="example">
|
|
||||||
<title>Example</title>
|
|
||||||
|
|
||||||
<!-- be careful with the example code: it shouldn't be wider than
|
|
||||||
approx. 60 columns, or otherwise it won't fit properly on a page
|
|
||||||
-->
|
|
||||||
|
|
||||||
&procfsexample;
|
|
||||||
|
|
||||||
</chapter>
|
|
||||||
</book>
|
|
@@ -1,201 +0,0 @@
|
|||||||
/*
|
|
||||||
* procfs_example.c: an example proc interface
|
|
||||||
*
|
|
||||||
* Copyright (C) 2001, Erik Mouw (mouw@nl.linux.org)
|
|
||||||
*
|
|
||||||
* This file accompanies the procfs-guide in the Linux kernel
|
|
||||||
* source. Its main use is to demonstrate the concepts and
|
|
||||||
* functions described in the guide.
|
|
||||||
*
|
|
||||||
* This software has been developed while working on the LART
|
|
||||||
* computing board (http://www.lartmaker.nl), which was sponsored
|
|
||||||
* by the Delt University of Technology projects Mobile Multi-media
|
|
||||||
* Communications and Ubiquitous Communications.
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute
|
|
||||||
* it and/or modify it under the terms of the GNU General
|
|
||||||
* Public License as published by the Free Software
|
|
||||||
* Foundation; either version 2 of the License, or (at your
|
|
||||||
* option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be
|
|
||||||
* useful, but WITHOUT ANY WARRANTY; without even the implied
|
|
||||||
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
||||||
* PURPOSE. See the GNU General Public License for more
|
|
||||||
* details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public
|
|
||||||
* License along with this program; if not, write to the
|
|
||||||
* Free Software Foundation, Inc., 59 Temple Place,
|
|
||||||
* Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/module.h>
|
|
||||||
#include <linux/kernel.h>
|
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/proc_fs.h>
|
|
||||||
#include <linux/jiffies.h>
|
|
||||||
#include <asm/uaccess.h>
|
|
||||||
|
|
||||||
|
|
||||||
#define MODULE_VERS "1.0"
|
|
||||||
#define MODULE_NAME "procfs_example"
|
|
||||||
|
|
||||||
#define FOOBAR_LEN 8
|
|
||||||
|
|
||||||
struct fb_data_t {
|
|
||||||
char name[FOOBAR_LEN + 1];
|
|
||||||
char value[FOOBAR_LEN + 1];
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
static struct proc_dir_entry *example_dir, *foo_file,
|
|
||||||
*bar_file, *jiffies_file, *symlink;
|
|
||||||
|
|
||||||
|
|
||||||
struct fb_data_t foo_data, bar_data;
|
|
||||||
|
|
||||||
|
|
||||||
static int proc_read_jiffies(char *page, char **start,
|
|
||||||
off_t off, int count,
|
|
||||||
int *eof, void *data)
|
|
||||||
{
|
|
||||||
int len;
|
|
||||||
|
|
||||||
len = sprintf(page, "jiffies = %ld\n",
|
|
||||||
jiffies);
|
|
||||||
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int proc_read_foobar(char *page, char **start,
|
|
||||||
off_t off, int count,
|
|
||||||
int *eof, void *data)
|
|
||||||
{
|
|
||||||
int len;
|
|
||||||
struct fb_data_t *fb_data = (struct fb_data_t *)data;
|
|
||||||
|
|
||||||
/* DON'T DO THAT - buffer overruns are bad */
|
|
||||||
len = sprintf(page, "%s = '%s'\n",
|
|
||||||
fb_data->name, fb_data->value);
|
|
||||||
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int proc_write_foobar(struct file *file,
|
|
||||||
const char *buffer,
|
|
||||||
unsigned long count,
|
|
||||||
void *data)
|
|
||||||
{
|
|
||||||
int len;
|
|
||||||
struct fb_data_t *fb_data = (struct fb_data_t *)data;
|
|
||||||
|
|
||||||
if(count > FOOBAR_LEN)
|
|
||||||
len = FOOBAR_LEN;
|
|
||||||
else
|
|
||||||
len = count;
|
|
||||||
|
|
||||||
if(copy_from_user(fb_data->value, buffer, len))
|
|
||||||
return -EFAULT;
|
|
||||||
|
|
||||||
fb_data->value[len] = '\0';
|
|
||||||
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int __init init_procfs_example(void)
|
|
||||||
{
|
|
||||||
int rv = 0;
|
|
||||||
|
|
||||||
/* create directory */
|
|
||||||
example_dir = proc_mkdir(MODULE_NAME, NULL);
|
|
||||||
if(example_dir == NULL) {
|
|
||||||
rv = -ENOMEM;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
/* create jiffies using convenience function */
|
|
||||||
jiffies_file = create_proc_read_entry("jiffies",
|
|
||||||
0444, example_dir,
|
|
||||||
proc_read_jiffies,
|
|
||||||
NULL);
|
|
||||||
if(jiffies_file == NULL) {
|
|
||||||
rv = -ENOMEM;
|
|
||||||
goto no_jiffies;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* create foo and bar files using same callback
|
|
||||||
* functions
|
|
||||||
*/
|
|
||||||
foo_file = create_proc_entry("foo", 0644, example_dir);
|
|
||||||
if(foo_file == NULL) {
|
|
||||||
rv = -ENOMEM;
|
|
||||||
goto no_foo;
|
|
||||||
}
|
|
||||||
|
|
||||||
strcpy(foo_data.name, "foo");
|
|
||||||
strcpy(foo_data.value, "foo");
|
|
||||||
foo_file->data = &foo_data;
|
|
||||||
foo_file->read_proc = proc_read_foobar;
|
|
||||||
foo_file->write_proc = proc_write_foobar;
|
|
||||||
|
|
||||||
bar_file = create_proc_entry("bar", 0644, example_dir);
|
|
||||||
if(bar_file == NULL) {
|
|
||||||
rv = -ENOMEM;
|
|
||||||
goto no_bar;
|
|
||||||
}
|
|
||||||
|
|
||||||
strcpy(bar_data.name, "bar");
|
|
||||||
strcpy(bar_data.value, "bar");
|
|
||||||
bar_file->data = &bar_data;
|
|
||||||
bar_file->read_proc = proc_read_foobar;
|
|
||||||
bar_file->write_proc = proc_write_foobar;
|
|
||||||
|
|
||||||
/* create symlink */
|
|
||||||
symlink = proc_symlink("jiffies_too", example_dir,
|
|
||||||
"jiffies");
|
|
||||||
if(symlink == NULL) {
|
|
||||||
rv = -ENOMEM;
|
|
||||||
goto no_symlink;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* everything OK */
|
|
||||||
printk(KERN_INFO "%s %s initialised\n",
|
|
||||||
MODULE_NAME, MODULE_VERS);
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
no_symlink:
|
|
||||||
remove_proc_entry("bar", example_dir);
|
|
||||||
no_bar:
|
|
||||||
remove_proc_entry("foo", example_dir);
|
|
||||||
no_foo:
|
|
||||||
remove_proc_entry("jiffies", example_dir);
|
|
||||||
no_jiffies:
|
|
||||||
remove_proc_entry(MODULE_NAME, NULL);
|
|
||||||
out:
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void __exit cleanup_procfs_example(void)
|
|
||||||
{
|
|
||||||
remove_proc_entry("jiffies_too", example_dir);
|
|
||||||
remove_proc_entry("bar", example_dir);
|
|
||||||
remove_proc_entry("foo", example_dir);
|
|
||||||
remove_proc_entry("jiffies", example_dir);
|
|
||||||
remove_proc_entry(MODULE_NAME, NULL);
|
|
||||||
|
|
||||||
printk(KERN_INFO "%s %s removed\n",
|
|
||||||
MODULE_NAME, MODULE_VERS);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
module_init(init_procfs_example);
|
|
||||||
module_exit(cleanup_procfs_example);
|
|
||||||
|
|
||||||
MODULE_AUTHOR("Erik Mouw");
|
|
||||||
MODULE_DESCRIPTION("procfs examples");
|
|
||||||
MODULE_LICENSE("GPL");
|
|
@@ -716,6 +716,41 @@ if (-1 == ioctl (fd, &VIDIOC-S-STD;, &std_id)) {
|
|||||||
}
|
}
|
||||||
</programlisting>
|
</programlisting>
|
||||||
</example>
|
</example>
|
||||||
|
<section id="dv-timings">
|
||||||
|
<title>Digital Video (DV) Timings</title>
|
||||||
|
<para>
|
||||||
|
The video standards discussed so far has been dealing with Analog TV and the
|
||||||
|
corresponding video timings. Today there are many more different hardware interfaces
|
||||||
|
such as High Definition TV interfaces (HDMI), VGA, DVI connectors etc., that carry
|
||||||
|
video signals and there is a need to extend the API to select the video timings
|
||||||
|
for these interfaces. Since it is not possible to extend the &v4l2-std-id; due to
|
||||||
|
the limited bits available, a new set of IOCTLs is added to set/get video timings at
|
||||||
|
the input and output: </para><itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>DV Presets: Digital Video (DV) presets. These are IDs representing a
|
||||||
|
video timing at the input/output. Presets are pre-defined timings implemented
|
||||||
|
by the hardware according to video standards. A __u32 data type is used to represent
|
||||||
|
a preset unlike the bit mask that is used in &v4l2-std-id; allowing future extensions
|
||||||
|
to support as many different presets as needed.</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>Custom DV Timings: This will allow applications to define more detailed
|
||||||
|
custom video timings for the interface. This includes parameters such as width, height,
|
||||||
|
polarities, frontporch, backporch etc.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
<para>To enumerate and query the attributes of DV presets supported by a device,
|
||||||
|
applications use the &VIDIOC-ENUM-DV-PRESETS; ioctl. To get the current DV preset,
|
||||||
|
applications use the &VIDIOC-G-DV-PRESET; ioctl and to set a preset they use the
|
||||||
|
&VIDIOC-S-DV-PRESET; ioctl.</para>
|
||||||
|
<para>To set custom DV timings for the device, applications use the
|
||||||
|
&VIDIOC-S-DV-TIMINGS; ioctl and to get current custom DV timings they use the
|
||||||
|
&VIDIOC-G-DV-TIMINGS; ioctl.</para>
|
||||||
|
<para>Applications can make use of the <xref linkend="input-capabilities" /> and
|
||||||
|
<xref linkend="output-capabilities"/> flags to decide what ioctls are available to set the
|
||||||
|
video timings for the device.</para>
|
||||||
|
</section>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
&sub-controls;
|
&sub-controls;
|
||||||
|
@@ -2291,8 +2291,8 @@ was renamed to <structname id="v4l2-chip-ident-old">v4l2_chip_ident_old</structn
|
|||||||
<listitem>
|
<listitem>
|
||||||
<para>New control <constant>V4L2_CID_COLORFX</constant> was added.</para>
|
<para>New control <constant>V4L2_CID_COLORFX</constant> was added.</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
</orderedlist>
|
</orderedlist>
|
||||||
</section>
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<title>V4L2 in Linux 2.6.32</title>
|
<title>V4L2 in Linux 2.6.32</title>
|
||||||
<orderedlist>
|
<orderedlist>
|
||||||
@@ -2322,8 +2322,16 @@ more information.</para>
|
|||||||
<listitem>
|
<listitem>
|
||||||
<para>Added Remote Controller chapter, describing the default Remote Controller mapping for media devices.</para>
|
<para>Added Remote Controller chapter, describing the default Remote Controller mapping for media devices.</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
</orderedlist>
|
</orderedlist>
|
||||||
</section>
|
</section>
|
||||||
|
<section>
|
||||||
|
<title>V4L2 in Linux 2.6.33</title>
|
||||||
|
<orderedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>Added support for Digital Video timings in order to support HDTV receivers and transmitters.</para>
|
||||||
|
</listitem>
|
||||||
|
</orderedlist>
|
||||||
|
</section>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section id="other">
|
<section id="other">
|
||||||
|
@@ -74,6 +74,17 @@ Remote Controller chapter.</contrib>
|
|||||||
</address>
|
</address>
|
||||||
</affiliation>
|
</affiliation>
|
||||||
</author>
|
</author>
|
||||||
|
|
||||||
|
<author>
|
||||||
|
<firstname>Muralidharan</firstname>
|
||||||
|
<surname>Karicheri</surname>
|
||||||
|
<contrib>Documented the Digital Video timings API.</contrib>
|
||||||
|
<affiliation>
|
||||||
|
<address>
|
||||||
|
<email>m-karicheri2@ti.com</email>
|
||||||
|
</address>
|
||||||
|
</affiliation>
|
||||||
|
</author>
|
||||||
</authorgroup>
|
</authorgroup>
|
||||||
|
|
||||||
<copyright>
|
<copyright>
|
||||||
@@ -89,7 +100,7 @@ Remote Controller chapter.</contrib>
|
|||||||
<year>2008</year>
|
<year>2008</year>
|
||||||
<year>2009</year>
|
<year>2009</year>
|
||||||
<holder>Bill Dirks, Michael H. Schimek, Hans Verkuil, Martin
|
<holder>Bill Dirks, Michael H. Schimek, Hans Verkuil, Martin
|
||||||
Rubli, Andy Walls, Mauro Carvalho Chehab</holder>
|
Rubli, Andy Walls, Muralidharan Karicheri, Mauro Carvalho Chehab</holder>
|
||||||
</copyright>
|
</copyright>
|
||||||
<legalnotice>
|
<legalnotice>
|
||||||
<para>Except when explicitly stated as GPL, programming examples within
|
<para>Except when explicitly stated as GPL, programming examples within
|
||||||
@@ -102,6 +113,13 @@ structs, ioctls) must be noted in more detail in the history chapter
|
|||||||
(compat.sgml), along with the possible impact on existing drivers and
|
(compat.sgml), along with the possible impact on existing drivers and
|
||||||
applications. -->
|
applications. -->
|
||||||
|
|
||||||
|
<revision>
|
||||||
|
<revnumber>2.6.33</revnumber>
|
||||||
|
<date>2009-12-03</date>
|
||||||
|
<authorinitials>mk</authorinitials>
|
||||||
|
<revremark>Added documentation for the Digital Video timings API.</revremark>
|
||||||
|
</revision>
|
||||||
|
|
||||||
<revision>
|
<revision>
|
||||||
<revnumber>2.6.32</revnumber>
|
<revnumber>2.6.32</revnumber>
|
||||||
<date>2009-08-31</date>
|
<date>2009-08-31</date>
|
||||||
@@ -355,7 +373,7 @@ and discussions on the V4L mailing list.</revremark>
|
|||||||
</partinfo>
|
</partinfo>
|
||||||
|
|
||||||
<title>Video for Linux Two API Specification</title>
|
<title>Video for Linux Two API Specification</title>
|
||||||
<subtitle>Revision 2.6.32</subtitle>
|
<subtitle>Revision 2.6.33</subtitle>
|
||||||
|
|
||||||
<chapter id="common">
|
<chapter id="common">
|
||||||
&sub-common;
|
&sub-common;
|
||||||
@@ -411,6 +429,7 @@ and discussions on the V4L mailing list.</revremark>
|
|||||||
&sub-encoder-cmd;
|
&sub-encoder-cmd;
|
||||||
&sub-enumaudio;
|
&sub-enumaudio;
|
||||||
&sub-enumaudioout;
|
&sub-enumaudioout;
|
||||||
|
&sub-enum-dv-presets;
|
||||||
&sub-enum-fmt;
|
&sub-enum-fmt;
|
||||||
&sub-enum-framesizes;
|
&sub-enum-framesizes;
|
||||||
&sub-enum-frameintervals;
|
&sub-enum-frameintervals;
|
||||||
@@ -421,6 +440,8 @@ and discussions on the V4L mailing list.</revremark>
|
|||||||
&sub-g-audioout;
|
&sub-g-audioout;
|
||||||
&sub-g-crop;
|
&sub-g-crop;
|
||||||
&sub-g-ctrl;
|
&sub-g-ctrl;
|
||||||
|
&sub-g-dv-preset;
|
||||||
|
&sub-g-dv-timings;
|
||||||
&sub-g-enc-index;
|
&sub-g-enc-index;
|
||||||
&sub-g-ext-ctrls;
|
&sub-g-ext-ctrls;
|
||||||
&sub-g-fbuf;
|
&sub-g-fbuf;
|
||||||
@@ -441,6 +462,7 @@ and discussions on the V4L mailing list.</revremark>
|
|||||||
&sub-querybuf;
|
&sub-querybuf;
|
||||||
&sub-querycap;
|
&sub-querycap;
|
||||||
&sub-queryctrl;
|
&sub-queryctrl;
|
||||||
|
&sub-query-dv-preset;
|
||||||
&sub-querystd;
|
&sub-querystd;
|
||||||
&sub-reqbufs;
|
&sub-reqbufs;
|
||||||
&sub-s-hw-freq-seek;
|
&sub-s-hw-freq-seek;
|
||||||
|
@@ -733,6 +733,99 @@ struct <link linkend="v4l2-standard">v4l2_standard</link> {
|
|||||||
__u32 reserved[4];
|
__u32 reserved[4];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* V I D E O T I M I N G S D V P R E S E T
|
||||||
|
*/
|
||||||
|
struct <link linkend="v4l2-dv-preset">v4l2_dv_preset</link> {
|
||||||
|
__u32 preset;
|
||||||
|
__u32 reserved[4];
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* D V P R E S E T S E N U M E R A T I O N
|
||||||
|
*/
|
||||||
|
struct <link linkend="v4l2-dv-enum-preset">v4l2_dv_enum_preset</link> {
|
||||||
|
__u32 index;
|
||||||
|
__u32 preset;
|
||||||
|
__u8 name[32]; /* Name of the preset timing */
|
||||||
|
__u32 width;
|
||||||
|
__u32 height;
|
||||||
|
__u32 reserved[4];
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* D V P R E S E T V A L U E S
|
||||||
|
*/
|
||||||
|
#define V4L2_DV_INVALID 0
|
||||||
|
#define V4L2_DV_480P59_94 1 /* BT.1362 */
|
||||||
|
#define V4L2_DV_576P50 2 /* BT.1362 */
|
||||||
|
#define V4L2_DV_720P24 3 /* SMPTE 296M */
|
||||||
|
#define V4L2_DV_720P25 4 /* SMPTE 296M */
|
||||||
|
#define V4L2_DV_720P30 5 /* SMPTE 296M */
|
||||||
|
#define V4L2_DV_720P50 6 /* SMPTE 296M */
|
||||||
|
#define V4L2_DV_720P59_94 7 /* SMPTE 274M */
|
||||||
|
#define V4L2_DV_720P60 8 /* SMPTE 274M/296M */
|
||||||
|
#define V4L2_DV_1080I29_97 9 /* BT.1120/ SMPTE 274M */
|
||||||
|
#define V4L2_DV_1080I30 10 /* BT.1120/ SMPTE 274M */
|
||||||
|
#define V4L2_DV_1080I25 11 /* BT.1120 */
|
||||||
|
#define V4L2_DV_1080I50 12 /* SMPTE 296M */
|
||||||
|
#define V4L2_DV_1080I60 13 /* SMPTE 296M */
|
||||||
|
#define V4L2_DV_1080P24 14 /* SMPTE 296M */
|
||||||
|
#define V4L2_DV_1080P25 15 /* SMPTE 296M */
|
||||||
|
#define V4L2_DV_1080P30 16 /* SMPTE 296M */
|
||||||
|
#define V4L2_DV_1080P50 17 /* BT.1120 */
|
||||||
|
#define V4L2_DV_1080P60 18 /* BT.1120 */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* D V B T T I M I N G S
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* BT.656/BT.1120 timing data */
|
||||||
|
struct <link linkend="v4l2-bt-timings">v4l2_bt_timings</link> {
|
||||||
|
__u32 width; /* width in pixels */
|
||||||
|
__u32 height; /* height in lines */
|
||||||
|
__u32 interlaced; /* Interlaced or progressive */
|
||||||
|
__u32 polarities; /* Positive or negative polarity */
|
||||||
|
__u64 pixelclock; /* Pixel clock in HZ. Ex. 74.25MHz->74250000 */
|
||||||
|
__u32 hfrontporch; /* Horizpontal front porch in pixels */
|
||||||
|
__u32 hsync; /* Horizontal Sync length in pixels */
|
||||||
|
__u32 hbackporch; /* Horizontal back porch in pixels */
|
||||||
|
__u32 vfrontporch; /* Vertical front porch in pixels */
|
||||||
|
__u32 vsync; /* Vertical Sync length in lines */
|
||||||
|
__u32 vbackporch; /* Vertical back porch in lines */
|
||||||
|
__u32 il_vfrontporch; /* Vertical front porch for bottom field of
|
||||||
|
* interlaced field formats
|
||||||
|
*/
|
||||||
|
__u32 il_vsync; /* Vertical sync length for bottom field of
|
||||||
|
* interlaced field formats
|
||||||
|
*/
|
||||||
|
__u32 il_vbackporch; /* Vertical back porch for bottom field of
|
||||||
|
* interlaced field formats
|
||||||
|
*/
|
||||||
|
__u32 reserved[16];
|
||||||
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
|
/* Interlaced or progressive format */
|
||||||
|
#define V4L2_DV_PROGRESSIVE 0
|
||||||
|
#define V4L2_DV_INTERLACED 1
|
||||||
|
|
||||||
|
/* Polarities. If bit is not set, it is assumed to be negative polarity */
|
||||||
|
#define V4L2_DV_VSYNC_POS_POL 0x00000001
|
||||||
|
#define V4L2_DV_HSYNC_POS_POL 0x00000002
|
||||||
|
|
||||||
|
|
||||||
|
/* DV timings */
|
||||||
|
struct <link linkend="v4l2-dv-timings">v4l2_dv_timings</link> {
|
||||||
|
__u32 type;
|
||||||
|
union {
|
||||||
|
struct <link linkend="v4l2-bt-timings">v4l2_bt_timings</link> bt;
|
||||||
|
__u32 reserved[32];
|
||||||
|
};
|
||||||
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
|
/* Values for the type field */
|
||||||
|
#define V4L2_DV_BT_656_1120 0 /* BT.656/1120 timing type */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* V I D E O I N P U T S
|
* V I D E O I N P U T S
|
||||||
*/
|
*/
|
||||||
@@ -744,7 +837,8 @@ struct <link linkend="v4l2-input">v4l2_input</link> {
|
|||||||
__u32 tuner; /* Associated tuner */
|
__u32 tuner; /* Associated tuner */
|
||||||
v4l2_std_id std;
|
v4l2_std_id std;
|
||||||
__u32 status;
|
__u32 status;
|
||||||
__u32 reserved[4];
|
__u32 capabilities;
|
||||||
|
__u32 reserved[3];
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Values for the 'type' field */
|
/* Values for the 'type' field */
|
||||||
@@ -775,6 +869,11 @@ struct <link linkend="v4l2-input">v4l2_input</link> {
|
|||||||
#define V4L2_IN_ST_NO_ACCESS 0x02000000 /* Conditional access denied */
|
#define V4L2_IN_ST_NO_ACCESS 0x02000000 /* Conditional access denied */
|
||||||
#define V4L2_IN_ST_VTR 0x04000000 /* VTR time constant */
|
#define V4L2_IN_ST_VTR 0x04000000 /* VTR time constant */
|
||||||
|
|
||||||
|
/* capabilities flags */
|
||||||
|
#define V4L2_IN_CAP_PRESETS 0x00000001 /* Supports S_DV_PRESET */
|
||||||
|
#define V4L2_IN_CAP_CUSTOM_TIMINGS 0x00000002 /* Supports S_DV_TIMINGS */
|
||||||
|
#define V4L2_IN_CAP_STD 0x00000004 /* Supports S_STD */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* V I D E O O U T P U T S
|
* V I D E O O U T P U T S
|
||||||
*/
|
*/
|
||||||
@@ -785,13 +884,19 @@ struct <link linkend="v4l2-output">v4l2_output</link> {
|
|||||||
__u32 audioset; /* Associated audios (bitfield) */
|
__u32 audioset; /* Associated audios (bitfield) */
|
||||||
__u32 modulator; /* Associated modulator */
|
__u32 modulator; /* Associated modulator */
|
||||||
v4l2_std_id std;
|
v4l2_std_id std;
|
||||||
__u32 reserved[4];
|
__u32 capabilities;
|
||||||
|
__u32 reserved[3];
|
||||||
};
|
};
|
||||||
/* Values for the 'type' field */
|
/* Values for the 'type' field */
|
||||||
#define V4L2_OUTPUT_TYPE_MODULATOR 1
|
#define V4L2_OUTPUT_TYPE_MODULATOR 1
|
||||||
#define V4L2_OUTPUT_TYPE_ANALOG 2
|
#define V4L2_OUTPUT_TYPE_ANALOG 2
|
||||||
#define V4L2_OUTPUT_TYPE_ANALOGVGAOVERLAY 3
|
#define V4L2_OUTPUT_TYPE_ANALOGVGAOVERLAY 3
|
||||||
|
|
||||||
|
/* capabilities flags */
|
||||||
|
#define V4L2_OUT_CAP_PRESETS 0x00000001 /* Supports S_DV_PRESET */
|
||||||
|
#define V4L2_OUT_CAP_CUSTOM_TIMINGS 0x00000002 /* Supports S_DV_TIMINGS */
|
||||||
|
#define V4L2_OUT_CAP_STD 0x00000004 /* Supports S_STD */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* C O N T R O L S
|
* C O N T R O L S
|
||||||
*/
|
*/
|
||||||
@@ -1626,6 +1731,13 @@ struct <link linkend="v4l2-dbg-chip-ident">v4l2_dbg_chip_ident</link> {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define VIDIOC_S_HW_FREQ_SEEK _IOW('V', 82, struct <link linkend="v4l2-hw-freq-seek">v4l2_hw_freq_seek</link>)
|
#define VIDIOC_S_HW_FREQ_SEEK _IOW('V', 82, struct <link linkend="v4l2-hw-freq-seek">v4l2_hw_freq_seek</link>)
|
||||||
|
#define VIDIOC_ENUM_DV_PRESETS _IOWR('V', 83, struct <link linkend="v4l2-dv-enum-preset">v4l2_dv_enum_preset</link>)
|
||||||
|
#define VIDIOC_S_DV_PRESET _IOWR('V', 84, struct <link linkend="v4l2-dv-preset">v4l2_dv_preset</link>)
|
||||||
|
#define VIDIOC_G_DV_PRESET _IOWR('V', 85, struct <link linkend="v4l2-dv-preset">v4l2_dv_preset</link>)
|
||||||
|
#define VIDIOC_QUERY_DV_PRESET _IOR('V', 86, struct <link linkend="v4l2-dv-preset">v4l2_dv_preset</link>)
|
||||||
|
#define VIDIOC_S_DV_TIMINGS _IOWR('V', 87, struct <link linkend="v4l2-dv-timings">v4l2_dv_timings</link>)
|
||||||
|
#define VIDIOC_G_DV_TIMINGS _IOWR('V', 88, struct <link linkend="v4l2-dv-timings">v4l2_dv_timings</link>)
|
||||||
|
|
||||||
/* Reminder: when adding new ioctls please add support for them to
|
/* Reminder: when adding new ioctls please add support for them to
|
||||||
drivers/media/video/v4l2-compat-ioctl32.c as well! */
|
drivers/media/video/v4l2-compat-ioctl32.c as well! */
|
||||||
|
|
||||||
|
238
Documentation/DocBook/v4l/vidioc-enum-dv-presets.xml
Normal file
238
Documentation/DocBook/v4l/vidioc-enum-dv-presets.xml
Normal file
@@ -0,0 +1,238 @@
|
|||||||
|
<refentry id="vidioc-enum-dv-presets">
|
||||||
|
<refmeta>
|
||||||
|
<refentrytitle>ioctl VIDIOC_ENUM_DV_PRESETS</refentrytitle>
|
||||||
|
&manvol;
|
||||||
|
</refmeta>
|
||||||
|
|
||||||
|
<refnamediv>
|
||||||
|
<refname>VIDIOC_ENUM_DV_PRESETS</refname>
|
||||||
|
<refpurpose>Enumerate supported Digital Video presets</refpurpose>
|
||||||
|
</refnamediv>
|
||||||
|
|
||||||
|
<refsynopsisdiv>
|
||||||
|
<funcsynopsis>
|
||||||
|
<funcprototype>
|
||||||
|
<funcdef>int <function>ioctl</function></funcdef>
|
||||||
|
<paramdef>int <parameter>fd</parameter></paramdef>
|
||||||
|
<paramdef>int <parameter>request</parameter></paramdef>
|
||||||
|
<paramdef>struct v4l2_dv_enum_preset *<parameter>argp</parameter></paramdef>
|
||||||
|
</funcprototype>
|
||||||
|
</funcsynopsis>
|
||||||
|
</refsynopsisdiv>
|
||||||
|
|
||||||
|
<refsect1>
|
||||||
|
<title>Arguments</title>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term><parameter>fd</parameter></term>
|
||||||
|
<listitem>
|
||||||
|
<para>&fd;</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><parameter>request</parameter></term>
|
||||||
|
<listitem>
|
||||||
|
<para>VIDIOC_ENUM_DV_PRESETS</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><parameter>argp</parameter></term>
|
||||||
|
<listitem>
|
||||||
|
<para></para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1>
|
||||||
|
<title>Description</title>
|
||||||
|
|
||||||
|
<para>To query the attributes of a DV preset, applications initialize the
|
||||||
|
<structfield>index</structfield> field and zero the reserved array of &v4l2-dv-enum-preset;
|
||||||
|
and call the <constant>VIDIOC_ENUM_DV_PRESETS</constant> ioctl with a pointer to this
|
||||||
|
structure. Drivers fill the rest of the structure or return an
|
||||||
|
&EINVAL; when the index is out of bounds. To enumerate all DV Presets supported,
|
||||||
|
applications shall begin at index zero, incrementing by one until the
|
||||||
|
driver returns <errorcode>EINVAL</errorcode>. Drivers may enumerate a
|
||||||
|
different set of DV presets after switching the video input or
|
||||||
|
output.</para>
|
||||||
|
|
||||||
|
<table pgwide="1" frame="none" id="v4l2-dv-enum-preset">
|
||||||
|
<title>struct <structname>v4l2_dv_enum_presets</structname></title>
|
||||||
|
<tgroup cols="3">
|
||||||
|
&cs-str;
|
||||||
|
<tbody valign="top">
|
||||||
|
<row>
|
||||||
|
<entry>__u32</entry>
|
||||||
|
<entry><structfield>index</structfield></entry>
|
||||||
|
<entry>Number of the DV preset, set by the
|
||||||
|
application.</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>__u32</entry>
|
||||||
|
<entry><structfield>preset</structfield></entry>
|
||||||
|
<entry>This field identifies one of the DV preset values listed in <xref linkend="v4l2-dv-presets-vals"/>.</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>__u8</entry>
|
||||||
|
<entry><structfield>name</structfield>[24]</entry>
|
||||||
|
<entry>Name of the preset, a NUL-terminated ASCII string, for example: "720P-60", "1080I-60". This information is
|
||||||
|
intended for the user.</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>__u32</entry>
|
||||||
|
<entry><structfield>width</structfield></entry>
|
||||||
|
<entry>Width of the active video in pixels for the DV preset.</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>__u32</entry>
|
||||||
|
<entry><structfield>height</structfield></entry>
|
||||||
|
<entry>Height of the active video in lines for the DV preset.</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>__u32</entry>
|
||||||
|
<entry><structfield>reserved</structfield>[4]</entry>
|
||||||
|
<entry>Reserved for future extensions. Drivers must set the array to zero.</entry>
|
||||||
|
</row>
|
||||||
|
</tbody>
|
||||||
|
</tgroup>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<table pgwide="1" frame="none" id="v4l2-dv-presets-vals">
|
||||||
|
<title>struct <structname>DV Presets</structname></title>
|
||||||
|
<tgroup cols="3">
|
||||||
|
&cs-str;
|
||||||
|
<tbody valign="top">
|
||||||
|
<row>
|
||||||
|
<entry>Preset</entry>
|
||||||
|
<entry>Preset value</entry>
|
||||||
|
<entry>Description</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry></entry>
|
||||||
|
<entry></entry>
|
||||||
|
<entry></entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>V4L2_DV_INVALID</entry>
|
||||||
|
<entry>0</entry>
|
||||||
|
<entry>Invalid preset value.</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>V4L2_DV_480P59_94</entry>
|
||||||
|
<entry>1</entry>
|
||||||
|
<entry>720x480 progressive video at 59.94 fps as per BT.1362.</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>V4L2_DV_576P50</entry>
|
||||||
|
<entry>2</entry>
|
||||||
|
<entry>720x576 progressive video at 50 fps as per BT.1362.</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>V4L2_DV_720P24</entry>
|
||||||
|
<entry>3</entry>
|
||||||
|
<entry>1280x720 progressive video at 24 fps as per SMPTE 296M.</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>V4L2_DV_720P25</entry>
|
||||||
|
<entry>4</entry>
|
||||||
|
<entry>1280x720 progressive video at 25 fps as per SMPTE 296M.</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>V4L2_DV_720P30</entry>
|
||||||
|
<entry>5</entry>
|
||||||
|
<entry>1280x720 progressive video at 30 fps as per SMPTE 296M.</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>V4L2_DV_720P50</entry>
|
||||||
|
<entry>6</entry>
|
||||||
|
<entry>1280x720 progressive video at 50 fps as per SMPTE 296M.</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>V4L2_DV_720P59_94</entry>
|
||||||
|
<entry>7</entry>
|
||||||
|
<entry>1280x720 progressive video at 59.94 fps as per SMPTE 274M.</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>V4L2_DV_720P60</entry>
|
||||||
|
<entry>8</entry>
|
||||||
|
<entry>1280x720 progressive video at 60 fps as per SMPTE 274M/296M.</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>V4L2_DV_1080I29_97</entry>
|
||||||
|
<entry>9</entry>
|
||||||
|
<entry>1920x1080 interlaced video at 29.97 fps as per BT.1120/SMPTE 274M.</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>V4L2_DV_1080I30</entry>
|
||||||
|
<entry>10</entry>
|
||||||
|
<entry>1920x1080 interlaced video at 30 fps as per BT.1120/SMPTE 274M.</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>V4L2_DV_1080I25</entry>
|
||||||
|
<entry>11</entry>
|
||||||
|
<entry>1920x1080 interlaced video at 25 fps as per BT.1120.</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>V4L2_DV_1080I50</entry>
|
||||||
|
<entry>12</entry>
|
||||||
|
<entry>1920x1080 interlaced video at 50 fps as per SMPTE 296M.</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>V4L2_DV_1080I60</entry>
|
||||||
|
<entry>13</entry>
|
||||||
|
<entry>1920x1080 interlaced video at 60 fps as per SMPTE 296M.</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>V4L2_DV_1080P24</entry>
|
||||||
|
<entry>14</entry>
|
||||||
|
<entry>1920x1080 progressive video at 24 fps as per SMPTE 296M.</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>V4L2_DV_1080P25</entry>
|
||||||
|
<entry>15</entry>
|
||||||
|
<entry>1920x1080 progressive video at 25 fps as per SMPTE 296M.</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>V4L2_DV_1080P30</entry>
|
||||||
|
<entry>16</entry>
|
||||||
|
<entry>1920x1080 progressive video at 30 fps as per SMPTE 296M.</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>V4L2_DV_1080P50</entry>
|
||||||
|
<entry>17</entry>
|
||||||
|
<entry>1920x1080 progressive video at 50 fps as per BT.1120.</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>V4L2_DV_1080P60</entry>
|
||||||
|
<entry>18</entry>
|
||||||
|
<entry>1920x1080 progressive video at 60 fps as per BT.1120.</entry>
|
||||||
|
</row>
|
||||||
|
</tbody>
|
||||||
|
</tgroup>
|
||||||
|
</table>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1>
|
||||||
|
&return-value;
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term><errorcode>EINVAL</errorcode></term>
|
||||||
|
<listitem>
|
||||||
|
<para>The &v4l2-dv-enum-preset; <structfield>index</structfield>
|
||||||
|
is out of bounds.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</refsect1>
|
||||||
|
</refentry>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Local Variables:
|
||||||
|
mode: sgml
|
||||||
|
sgml-parent-document: "v4l2.sgml"
|
||||||
|
indent-tabs-mode: nil
|
||||||
|
End:
|
||||||
|
-->
|
@@ -124,7 +124,13 @@ current input.</entry>
|
|||||||
</row>
|
</row>
|
||||||
<row>
|
<row>
|
||||||
<entry>__u32</entry>
|
<entry>__u32</entry>
|
||||||
<entry><structfield>reserved</structfield>[4]</entry>
|
<entry><structfield>capabilities</structfield></entry>
|
||||||
|
<entry>This field provides capabilities for the
|
||||||
|
input. See <xref linkend="input-capabilities" /> for flags.</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>__u32</entry>
|
||||||
|
<entry><structfield>reserved</structfield>[3]</entry>
|
||||||
<entry>Reserved for future extensions. Drivers must set
|
<entry>Reserved for future extensions. Drivers must set
|
||||||
the array to zero.</entry>
|
the array to zero.</entry>
|
||||||
</row>
|
</row>
|
||||||
@@ -261,6 +267,34 @@ flag is set Macrovision has been detected.</entry>
|
|||||||
</tbody>
|
</tbody>
|
||||||
</tgroup>
|
</tgroup>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
<!-- Capability flags based on video timings RFC by Muralidharan
|
||||||
|
Karicheri, titled RFC (v1.2): V4L - Support for video timings at the
|
||||||
|
input/output interface to linux-media@vger.kernel.org on 19 Oct 2009.
|
||||||
|
-->
|
||||||
|
<table frame="none" pgwide="1" id="input-capabilities">
|
||||||
|
<title>Input capabilities</title>
|
||||||
|
<tgroup cols="3">
|
||||||
|
&cs-def;
|
||||||
|
<tbody valign="top">
|
||||||
|
<row>
|
||||||
|
<entry><constant>V4L2_IN_CAP_PRESETS</constant></entry>
|
||||||
|
<entry>0x00000001</entry>
|
||||||
|
<entry>This input supports setting DV presets by using VIDIOC_S_DV_PRESET.</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry><constant>V4L2_OUT_CAP_CUSTOM_TIMINGS</constant></entry>
|
||||||
|
<entry>0x00000002</entry>
|
||||||
|
<entry>This input supports setting custom video timings by using VIDIOC_S_DV_TIMINGS.</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry><constant>V4L2_IN_CAP_STD</constant></entry>
|
||||||
|
<entry>0x00000004</entry>
|
||||||
|
<entry>This input supports setting the TV standard by using VIDIOC_S_STD.</entry>
|
||||||
|
</row>
|
||||||
|
</tbody>
|
||||||
|
</tgroup>
|
||||||
|
</table>
|
||||||
</refsect1>
|
</refsect1>
|
||||||
|
|
||||||
<refsect1>
|
<refsect1>
|
||||||
|
@@ -114,7 +114,13 @@ details on video standards and how to switch see <xref
|
|||||||
</row>
|
</row>
|
||||||
<row>
|
<row>
|
||||||
<entry>__u32</entry>
|
<entry>__u32</entry>
|
||||||
<entry><structfield>reserved</structfield>[4]</entry>
|
<entry><structfield>capabilities</structfield></entry>
|
||||||
|
<entry>This field provides capabilities for the
|
||||||
|
output. See <xref linkend="output-capabilities" /> for flags.</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>__u32</entry>
|
||||||
|
<entry><structfield>reserved</structfield>[3]</entry>
|
||||||
<entry>Reserved for future extensions. Drivers must set
|
<entry>Reserved for future extensions. Drivers must set
|
||||||
the array to zero.</entry>
|
the array to zero.</entry>
|
||||||
</row>
|
</row>
|
||||||
@@ -147,6 +153,34 @@ CVBS, S-Video, RGB.</entry>
|
|||||||
</tgroup>
|
</tgroup>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
<!-- Capabilities flags based on video timings RFC by Muralidharan
|
||||||
|
Karicheri, titled RFC (v1.2): V4L - Support for video timings at the
|
||||||
|
input/output interface to linux-media@vger.kernel.org on 19 Oct 2009.
|
||||||
|
-->
|
||||||
|
<table frame="none" pgwide="1" id="output-capabilities">
|
||||||
|
<title>Output capabilities</title>
|
||||||
|
<tgroup cols="3">
|
||||||
|
&cs-def;
|
||||||
|
<tbody valign="top">
|
||||||
|
<row>
|
||||||
|
<entry><constant>V4L2_OUT_CAP_PRESETS</constant></entry>
|
||||||
|
<entry>0x00000001</entry>
|
||||||
|
<entry>This output supports setting DV presets by using VIDIOC_S_DV_PRESET.</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry><constant>V4L2_OUT_CAP_CUSTOM_TIMINGS</constant></entry>
|
||||||
|
<entry>0x00000002</entry>
|
||||||
|
<entry>This output supports setting custom video timings by using VIDIOC_S_DV_TIMINGS.</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry><constant>V4L2_OUT_CAP_STD</constant></entry>
|
||||||
|
<entry>0x00000004</entry>
|
||||||
|
<entry>This output supports setting the TV standard by using VIDIOC_S_STD.</entry>
|
||||||
|
</row>
|
||||||
|
</tbody>
|
||||||
|
</tgroup>
|
||||||
|
</table>
|
||||||
|
|
||||||
</refsect1>
|
</refsect1>
|
||||||
<refsect1>
|
<refsect1>
|
||||||
&return-value;
|
&return-value;
|
||||||
|
111
Documentation/DocBook/v4l/vidioc-g-dv-preset.xml
Normal file
111
Documentation/DocBook/v4l/vidioc-g-dv-preset.xml
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
<refentry id="vidioc-g-dv-preset">
|
||||||
|
<refmeta>
|
||||||
|
<refentrytitle>ioctl VIDIOC_G_DV_PRESET, VIDIOC_S_DV_PRESET</refentrytitle>
|
||||||
|
&manvol;
|
||||||
|
</refmeta>
|
||||||
|
|
||||||
|
<refnamediv>
|
||||||
|
<refname>VIDIOC_G_DV_PRESET</refname>
|
||||||
|
<refname>VIDIOC_S_DV_PRESET</refname>
|
||||||
|
<refpurpose>Query or select the DV preset of the current input or output</refpurpose>
|
||||||
|
</refnamediv>
|
||||||
|
|
||||||
|
<refsynopsisdiv>
|
||||||
|
<funcsynopsis>
|
||||||
|
<funcprototype>
|
||||||
|
<funcdef>int <function>ioctl</function></funcdef>
|
||||||
|
<paramdef>int <parameter>fd</parameter></paramdef>
|
||||||
|
<paramdef>int <parameter>request</parameter></paramdef>
|
||||||
|
<paramdef>&v4l2-dv-preset;
|
||||||
|
*<parameter>argp</parameter></paramdef>
|
||||||
|
</funcprototype>
|
||||||
|
</funcsynopsis>
|
||||||
|
</refsynopsisdiv>
|
||||||
|
|
||||||
|
<refsect1>
|
||||||
|
<title>Arguments</title>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term><parameter>fd</parameter></term>
|
||||||
|
<listitem>
|
||||||
|
<para>&fd;</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><parameter>request</parameter></term>
|
||||||
|
<listitem>
|
||||||
|
<para>VIDIOC_G_DV_PRESET, VIDIOC_S_DV_PRESET</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><parameter>argp</parameter></term>
|
||||||
|
<listitem>
|
||||||
|
<para></para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1>
|
||||||
|
<title>Description</title>
|
||||||
|
<para>To query and select the current DV preset, applications
|
||||||
|
use the <constant>VIDIOC_G_DV_PRESET</constant> and <constant>VIDIOC_S_DV_PRESET</constant>
|
||||||
|
ioctls which take a pointer to a &v4l2-dv-preset; type as argument.
|
||||||
|
Applications must zero the reserved array in &v4l2-dv-preset;.
|
||||||
|
<constant>VIDIOC_G_DV_PRESET</constant> returns a dv preset in the field
|
||||||
|
<structfield>preset</structfield> of &v4l2-dv-preset;.</para>
|
||||||
|
|
||||||
|
<para><constant>VIDIOC_S_DV_PRESET</constant> accepts a pointer to a &v4l2-dv-preset;
|
||||||
|
that has the preset value to be set. Applications must zero the reserved array in &v4l2-dv-preset;.
|
||||||
|
If the preset is not supported, it returns an &EINVAL; </para>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1>
|
||||||
|
&return-value;
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term><errorcode>EINVAL</errorcode></term>
|
||||||
|
<listitem>
|
||||||
|
<para>This ioctl is not supported, or the
|
||||||
|
<constant>VIDIOC_S_DV_PRESET</constant>,<constant>VIDIOC_S_DV_PRESET</constant> parameter was unsuitable.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><errorcode>EBUSY</errorcode></term>
|
||||||
|
<listitem>
|
||||||
|
<para>The device is busy and therefore can not change the preset.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
|
||||||
|
<table pgwide="1" frame="none" id="v4l2-dv-preset">
|
||||||
|
<title>struct <structname>v4l2_dv_preset</structname></title>
|
||||||
|
<tgroup cols="3">
|
||||||
|
&cs-str;
|
||||||
|
<tbody valign="top">
|
||||||
|
<row>
|
||||||
|
<entry>__u32</entry>
|
||||||
|
<entry><structfield>preset</structfield></entry>
|
||||||
|
<entry>Preset value to represent the digital video timings</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>__u32</entry>
|
||||||
|
<entry><structfield>reserved[4]</structfield></entry>
|
||||||
|
<entry>Reserved fields for future use</entry>
|
||||||
|
</row>
|
||||||
|
</tbody>
|
||||||
|
</tgroup>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
</refsect1>
|
||||||
|
</refentry>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Local Variables:
|
||||||
|
mode: sgml
|
||||||
|
sgml-parent-document: "v4l2.sgml"
|
||||||
|
indent-tabs-mode: nil
|
||||||
|
End:
|
||||||
|
-->
|
224
Documentation/DocBook/v4l/vidioc-g-dv-timings.xml
Normal file
224
Documentation/DocBook/v4l/vidioc-g-dv-timings.xml
Normal file
@@ -0,0 +1,224 @@
|
|||||||
|
<refentry id="vidioc-g-dv-timings">
|
||||||
|
<refmeta>
|
||||||
|
<refentrytitle>ioctl VIDIOC_G_DV_TIMINGS, VIDIOC_S_DV_TIMINGS</refentrytitle>
|
||||||
|
&manvol;
|
||||||
|
</refmeta>
|
||||||
|
|
||||||
|
<refnamediv>
|
||||||
|
<refname>VIDIOC_G_DV_TIMINGS</refname>
|
||||||
|
<refname>VIDIOC_S_DV_TIMINGS</refname>
|
||||||
|
<refpurpose>Get or set custom DV timings for input or output</refpurpose>
|
||||||
|
</refnamediv>
|
||||||
|
|
||||||
|
<refsynopsisdiv>
|
||||||
|
<funcsynopsis>
|
||||||
|
<funcprototype>
|
||||||
|
<funcdef>int <function>ioctl</function></funcdef>
|
||||||
|
<paramdef>int <parameter>fd</parameter></paramdef>
|
||||||
|
<paramdef>int <parameter>request</parameter></paramdef>
|
||||||
|
<paramdef>&v4l2-dv-timings;
|
||||||
|
*<parameter>argp</parameter></paramdef>
|
||||||
|
</funcprototype>
|
||||||
|
</funcsynopsis>
|
||||||
|
</refsynopsisdiv>
|
||||||
|
|
||||||
|
<refsect1>
|
||||||
|
<title>Arguments</title>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term><parameter>fd</parameter></term>
|
||||||
|
<listitem>
|
||||||
|
<para>&fd;</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><parameter>request</parameter></term>
|
||||||
|
<listitem>
|
||||||
|
<para>VIDIOC_G_DV_TIMINGS, VIDIOC_S_DV_TIMINGS</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><parameter>argp</parameter></term>
|
||||||
|
<listitem>
|
||||||
|
<para></para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1>
|
||||||
|
<title>Description</title>
|
||||||
|
<para>To set custom DV timings for the input or output, applications use the
|
||||||
|
<constant>VIDIOC_S_DV_TIMINGS</constant> ioctl and to get the current custom timings,
|
||||||
|
applications use the <constant>VIDIOC_G_DV_TIMINGS</constant> ioctl. The detailed timing
|
||||||
|
information is filled in using the structure &v4l2-dv-timings;. These ioctls take
|
||||||
|
a pointer to the &v4l2-dv-timings; structure as argument. If the ioctl is not supported
|
||||||
|
or the timing values are not correct, the driver returns &EINVAL;.</para>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1>
|
||||||
|
&return-value;
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term><errorcode>EINVAL</errorcode></term>
|
||||||
|
<listitem>
|
||||||
|
<para>This ioctl is not supported, or the
|
||||||
|
<constant>VIDIOC_S_DV_TIMINGS</constant> parameter was unsuitable.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><errorcode>EBUSY</errorcode></term>
|
||||||
|
<listitem>
|
||||||
|
<para>The device is busy and therefore can not change the timings.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
|
||||||
|
<table pgwide="1" frame="none" id="v4l2-bt-timings">
|
||||||
|
<title>struct <structname>v4l2_bt_timings</structname></title>
|
||||||
|
<tgroup cols="3">
|
||||||
|
&cs-str;
|
||||||
|
<tbody valign="top">
|
||||||
|
<row>
|
||||||
|
<entry>__u32</entry>
|
||||||
|
<entry><structfield>width</structfield></entry>
|
||||||
|
<entry>Width of the active video in pixels</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>__u32</entry>
|
||||||
|
<entry><structfield>height</structfield></entry>
|
||||||
|
<entry>Height of the active video in lines</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>__u32</entry>
|
||||||
|
<entry><structfield>interlaced</structfield></entry>
|
||||||
|
<entry>Progressive (0) or interlaced (1)</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>__u32</entry>
|
||||||
|
<entry><structfield>polarities</structfield></entry>
|
||||||
|
<entry>This is a bit mask that defines polarities of sync signals.
|
||||||
|
bit 0 (V4L2_DV_VSYNC_POS_POL) is for vertical sync polarity and bit 1 (V4L2_DV_HSYNC_POS_POL) is for horizontal sync polarity. If the bit is set
|
||||||
|
(1) it is positive polarity and if is cleared (0), it is negative polarity.</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>__u64</entry>
|
||||||
|
<entry><structfield>pixelclock</structfield></entry>
|
||||||
|
<entry>Pixel clock in Hz. Ex. 74.25MHz->74250000</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>__u32</entry>
|
||||||
|
<entry><structfield>hfrontporch</structfield></entry>
|
||||||
|
<entry>Horizontal front porch in pixels</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>__u32</entry>
|
||||||
|
<entry><structfield>hsync</structfield></entry>
|
||||||
|
<entry>Horizontal sync length in pixels</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>__u32</entry>
|
||||||
|
<entry><structfield>hbackporch</structfield></entry>
|
||||||
|
<entry>Horizontal back porch in pixels</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>__u32</entry>
|
||||||
|
<entry><structfield>vfrontporch</structfield></entry>
|
||||||
|
<entry>Vertical front porch in lines</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>__u32</entry>
|
||||||
|
<entry><structfield>vsync</structfield></entry>
|
||||||
|
<entry>Vertical sync length in lines</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>__u32</entry>
|
||||||
|
<entry><structfield>vbackporch</structfield></entry>
|
||||||
|
<entry>Vertical back porch in lines</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>__u32</entry>
|
||||||
|
<entry><structfield>il_vfrontporch</structfield></entry>
|
||||||
|
<entry>Vertical front porch in lines for bottom field of interlaced field formats</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>__u32</entry>
|
||||||
|
<entry><structfield>il_vsync</structfield></entry>
|
||||||
|
<entry>Vertical sync length in lines for bottom field of interlaced field formats</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>__u32</entry>
|
||||||
|
<entry><structfield>il_vbackporch</structfield></entry>
|
||||||
|
<entry>Vertical back porch in lines for bottom field of interlaced field formats</entry>
|
||||||
|
</row>
|
||||||
|
</tbody>
|
||||||
|
</tgroup>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<table pgwide="1" frame="none" id="v4l2-dv-timings">
|
||||||
|
<title>struct <structname>v4l2_dv_timings</structname></title>
|
||||||
|
<tgroup cols="4">
|
||||||
|
&cs-str;
|
||||||
|
<tbody valign="top">
|
||||||
|
<row>
|
||||||
|
<entry>__u32</entry>
|
||||||
|
<entry><structfield>type</structfield></entry>
|
||||||
|
<entry></entry>
|
||||||
|
<entry>Type of DV timings as listed in <xref linkend="dv-timing-types"/>.</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>union</entry>
|
||||||
|
<entry><structfield></structfield></entry>
|
||||||
|
<entry></entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry></entry>
|
||||||
|
<entry>&v4l2-bt-timings;</entry>
|
||||||
|
<entry><structfield>bt</structfield></entry>
|
||||||
|
<entry>Timings defined by BT.656/1120 specifications</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry></entry>
|
||||||
|
<entry>__u32</entry>
|
||||||
|
<entry><structfield>reserved</structfield>[32]</entry>
|
||||||
|
<entry></entry>
|
||||||
|
</row>
|
||||||
|
</tbody>
|
||||||
|
</tgroup>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<table pgwide="1" frame="none" id="dv-timing-types">
|
||||||
|
<title>DV Timing types</title>
|
||||||
|
<tgroup cols="3">
|
||||||
|
&cs-str;
|
||||||
|
<tbody valign="top">
|
||||||
|
<row>
|
||||||
|
<entry>Timing type</entry>
|
||||||
|
<entry>value</entry>
|
||||||
|
<entry>Description</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry></entry>
|
||||||
|
<entry></entry>
|
||||||
|
<entry></entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>V4L2_DV_BT_656_1120</entry>
|
||||||
|
<entry>0</entry>
|
||||||
|
<entry>BT.656/1120 timings</entry>
|
||||||
|
</row>
|
||||||
|
</tbody>
|
||||||
|
</tgroup>
|
||||||
|
</table>
|
||||||
|
</refsect1>
|
||||||
|
</refentry>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Local Variables:
|
||||||
|
mode: sgml
|
||||||
|
sgml-parent-document: "v4l2.sgml"
|
||||||
|
indent-tabs-mode: nil
|
||||||
|
End:
|
||||||
|
-->
|
@@ -86,6 +86,12 @@ standards.</para>
|
|||||||
<constant>VIDIOC_S_STD</constant> parameter was unsuitable.</para>
|
<constant>VIDIOC_S_STD</constant> parameter was unsuitable.</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><errorcode>EBUSY</errorcode></term>
|
||||||
|
<listitem>
|
||||||
|
<para>The device is busy and therefore can not change the standard</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
</variablelist>
|
</variablelist>
|
||||||
</refsect1>
|
</refsect1>
|
||||||
</refentry>
|
</refentry>
|
||||||
|
85
Documentation/DocBook/v4l/vidioc-query-dv-preset.xml
Normal file
85
Documentation/DocBook/v4l/vidioc-query-dv-preset.xml
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
<refentry id="vidioc-query-dv-preset">
|
||||||
|
<refmeta>
|
||||||
|
<refentrytitle>ioctl VIDIOC_QUERY_DV_PRESET</refentrytitle>
|
||||||
|
&manvol;
|
||||||
|
</refmeta>
|
||||||
|
|
||||||
|
<refnamediv>
|
||||||
|
<refname>VIDIOC_QUERY_DV_PRESET</refname>
|
||||||
|
<refpurpose>Sense the DV preset received by the current
|
||||||
|
input</refpurpose>
|
||||||
|
</refnamediv>
|
||||||
|
|
||||||
|
<refsynopsisdiv>
|
||||||
|
<funcsynopsis>
|
||||||
|
<funcprototype>
|
||||||
|
<funcdef>int <function>ioctl</function></funcdef>
|
||||||
|
<paramdef>int <parameter>fd</parameter></paramdef>
|
||||||
|
<paramdef>int <parameter>request</parameter></paramdef>
|
||||||
|
<paramdef>&v4l2-dv-preset; *<parameter>argp</parameter></paramdef>
|
||||||
|
</funcprototype>
|
||||||
|
</funcsynopsis>
|
||||||
|
</refsynopsisdiv>
|
||||||
|
|
||||||
|
<refsect1>
|
||||||
|
<title>Arguments</title>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term><parameter>fd</parameter></term>
|
||||||
|
<listitem>
|
||||||
|
<para>&fd;</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><parameter>request</parameter></term>
|
||||||
|
<listitem>
|
||||||
|
<para>VIDIOC_QUERY_DV_PRESET</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><parameter>argp</parameter></term>
|
||||||
|
<listitem>
|
||||||
|
<para></para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1>
|
||||||
|
<title>Description</title>
|
||||||
|
|
||||||
|
<para>The hardware may be able to detect the current DV preset
|
||||||
|
automatically, similar to sensing the video standard. To do so, applications
|
||||||
|
call <constant> VIDIOC_QUERY_DV_PRESET</constant> with a pointer to a
|
||||||
|
&v4l2-dv-preset; type. Once the hardware detects a preset, that preset is
|
||||||
|
returned in the preset field of &v4l2-dv-preset;. When detection is not
|
||||||
|
possible or fails, the value V4L2_DV_INVALID is returned.</para>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1>
|
||||||
|
&return-value;
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term><errorcode>EINVAL</errorcode></term>
|
||||||
|
<listitem>
|
||||||
|
<para>This ioctl is not supported.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><errorcode>EBUSY</errorcode></term>
|
||||||
|
<listitem>
|
||||||
|
<para>The device is busy and therefore can not sense the preset</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</refsect1>
|
||||||
|
</refentry>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Local Variables:
|
||||||
|
mode: sgml
|
||||||
|
sgml-parent-document: "v4l2.sgml"
|
||||||
|
indent-tabs-mode: nil
|
||||||
|
End:
|
||||||
|
-->
|
@@ -70,6 +70,12 @@ current video input or output.</para>
|
|||||||
<para>This ioctl is not supported.</para>
|
<para>This ioctl is not supported.</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><errorcode>EBUSY</errorcode></term>
|
||||||
|
<listitem>
|
||||||
|
<para>The device is busy and therefore can not detect the standard</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
</variablelist>
|
</variablelist>
|
||||||
</refsect1>
|
</refsect1>
|
||||||
</refentry>
|
</refentry>
|
||||||
|
@@ -15,7 +15,7 @@ kernel patches.
|
|||||||
2: Passes allnoconfig, allmodconfig
|
2: Passes allnoconfig, allmodconfig
|
||||||
|
|
||||||
3: Builds on multiple CPU architectures by using local cross-compile tools
|
3: Builds on multiple CPU architectures by using local cross-compile tools
|
||||||
or something like PLM at OSDL.
|
or some other build farm.
|
||||||
|
|
||||||
4: ppc64 is a good architecture for cross-compilation checking because it
|
4: ppc64 is a good architecture for cross-compilation checking because it
|
||||||
tends to use `unsigned long' for 64-bit quantities.
|
tends to use `unsigned long' for 64-bit quantities.
|
||||||
@@ -88,3 +88,6 @@ kernel patches.
|
|||||||
|
|
||||||
24: All memory barriers {e.g., barrier(), rmb(), wmb()} need a comment in the
|
24: All memory barriers {e.g., barrier(), rmb(), wmb()} need a comment in the
|
||||||
source code that explains the logic of what they are doing and why.
|
source code that explains the logic of what they are doing and why.
|
||||||
|
|
||||||
|
25: If any ioctl's are added by the patch, then also update
|
||||||
|
Documentation/ioctl/ioctl-number.txt.
|
||||||
|
66
Documentation/acpi/method-customizing.txt
Normal file
66
Documentation/acpi/method-customizing.txt
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
Linux ACPI Custom Control Method How To
|
||||||
|
=======================================
|
||||||
|
|
||||||
|
Written by Zhang Rui <rui.zhang@intel.com>
|
||||||
|
|
||||||
|
|
||||||
|
Linux supports customizing ACPI control methods at runtime.
|
||||||
|
|
||||||
|
Users can use this to
|
||||||
|
1. override an existing method which may not work correctly,
|
||||||
|
or just for debugging purposes.
|
||||||
|
2. insert a completely new method in order to create a missing
|
||||||
|
method such as _OFF, _ON, _STA, _INI, etc.
|
||||||
|
For these cases, it is far simpler to dynamically install a single
|
||||||
|
control method rather than override the entire DSDT, because kernel
|
||||||
|
rebuild/reboot is not needed and test result can be got in minutes.
|
||||||
|
|
||||||
|
Note: Only ACPI METHOD can be overridden, any other object types like
|
||||||
|
"Device", "OperationRegion", are not recognized.
|
||||||
|
Note: The same ACPI control method can be overridden for many times,
|
||||||
|
and it's always the latest one that used by Linux/kernel.
|
||||||
|
|
||||||
|
1. override an existing method
|
||||||
|
a) get the ACPI table via ACPI sysfs I/F. e.g. to get the DSDT,
|
||||||
|
just run "cat /sys/firmware/acpi/tables/DSDT > /tmp/dsdt.dat"
|
||||||
|
b) disassemble the table by running "iasl -d dsdt.dat".
|
||||||
|
c) rewrite the ASL code of the method and save it in a new file,
|
||||||
|
d) package the new file (psr.asl) to an ACPI table format.
|
||||||
|
Here is an example of a customized \_SB._AC._PSR method,
|
||||||
|
|
||||||
|
DefinitionBlock ("", "SSDT", 1, "", "", 0x20080715)
|
||||||
|
{
|
||||||
|
External (ACON)
|
||||||
|
|
||||||
|
Method (\_SB_.AC._PSR, 0, NotSerialized)
|
||||||
|
{
|
||||||
|
Store ("In AC _PSR", Debug)
|
||||||
|
Return (ACON)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Note that the full pathname of the method in ACPI namespace
|
||||||
|
should be used.
|
||||||
|
And remember to use "External" to declare external objects.
|
||||||
|
e) assemble the file to generate the AML code of the method.
|
||||||
|
e.g. "iasl psr.asl" (psr.aml is generated as a result)
|
||||||
|
f) mount debugfs by "mount -t debugfs none /sys/kernel/debug"
|
||||||
|
g) override the old method via the debugfs by running
|
||||||
|
"cat /tmp/psr.aml > /sys/kernel/debug/acpi/custom_method"
|
||||||
|
|
||||||
|
2. insert a new method
|
||||||
|
This is easier than overriding an existing method.
|
||||||
|
We just need to create the ASL code of the method we want to
|
||||||
|
insert and then follow the step c) ~ g) in section 1.
|
||||||
|
|
||||||
|
3. undo your changes
|
||||||
|
The "undo" operation is not supported for a new inserted method
|
||||||
|
right now, i.e. we can not remove a method currently.
|
||||||
|
For an overrided method, in order to undo your changes, please
|
||||||
|
save a copy of the method original ASL code in step c) section 1,
|
||||||
|
and redo step c) ~ g) to override the method with the original one.
|
||||||
|
|
||||||
|
|
||||||
|
Note: We can use a kernel with multiple custom ACPI method running,
|
||||||
|
But each individual write to debugfs can implement a SINGLE
|
||||||
|
method override. i.e. if we want to insert/override multiple
|
||||||
|
ACPI methods, we need to redo step c) ~ g) for multiple times.
|
@@ -1,9 +1,6 @@
|
|||||||
00-INDEX
|
00-INDEX
|
||||||
- This file
|
- This file
|
||||||
|
|
||||||
cache-lock.txt
|
|
||||||
- HOWTO for blackfin cache locking.
|
|
||||||
|
|
||||||
cachefeatures.txt
|
cachefeatures.txt
|
||||||
- Supported cache features.
|
- Supported cache features.
|
||||||
|
|
||||||
|
6
Documentation/blackfin/Makefile
Normal file
6
Documentation/blackfin/Makefile
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
obj-m := gptimers-example.o
|
||||||
|
|
||||||
|
all: modules
|
||||||
|
|
||||||
|
modules clean:
|
||||||
|
$(MAKE) -C ../.. SUBDIRS=$(PWD) $@
|
@@ -1,48 +0,0 @@
|
|||||||
/*
|
|
||||||
* File: Documentation/blackfin/cache-lock.txt
|
|
||||||
* Based on:
|
|
||||||
* Author:
|
|
||||||
*
|
|
||||||
* Created:
|
|
||||||
* Description: This file contains the simple DMA Implementation for Blackfin
|
|
||||||
*
|
|
||||||
* Rev: $Id: cache-lock.txt 2384 2006-11-01 04:12:43Z magicyang $
|
|
||||||
*
|
|
||||||
* Modified:
|
|
||||||
* Copyright 2004-2006 Analog Devices Inc.
|
|
||||||
*
|
|
||||||
* Bugs: Enter bugs at http://blackfin.uclinux.org/
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
How to lock your code in cache in uClinux/blackfin
|
|
||||||
--------------------------------------------------
|
|
||||||
|
|
||||||
There are only a few steps required to lock your code into the cache.
|
|
||||||
Currently you can lock the code by Way.
|
|
||||||
|
|
||||||
Below are the interface provided for locking the cache.
|
|
||||||
|
|
||||||
|
|
||||||
1. cache_grab_lock(int Ways);
|
|
||||||
|
|
||||||
This function grab the lock for locking your code into the cache specified
|
|
||||||
by Ways.
|
|
||||||
|
|
||||||
|
|
||||||
2. cache_lock(int Ways);
|
|
||||||
|
|
||||||
This function should be called after your critical code has been executed.
|
|
||||||
Once the critical code exits, the code is now loaded into the cache. This
|
|
||||||
function locks the code into the cache.
|
|
||||||
|
|
||||||
|
|
||||||
So, the example sequence will be:
|
|
||||||
|
|
||||||
cache_grab_lock(WAY0_L); /* Grab the lock */
|
|
||||||
|
|
||||||
critical_code(); /* Execute the code of interest */
|
|
||||||
|
|
||||||
cache_lock(WAY0_L); /* Lock the cache */
|
|
||||||
|
|
||||||
Where WAY0_L signifies WAY0 locking.
|
|
@@ -41,16 +41,6 @@
|
|||||||
icplb_flush();
|
icplb_flush();
|
||||||
dcplb_flush();
|
dcplb_flush();
|
||||||
|
|
||||||
- Locking the cache.
|
|
||||||
|
|
||||||
cache_grab_lock();
|
|
||||||
cache_lock();
|
|
||||||
|
|
||||||
Please refer linux-2.6.x/Documentation/blackfin/cache-lock.txt for how to
|
|
||||||
lock the cache.
|
|
||||||
|
|
||||||
Locking the cache is optional feature.
|
|
||||||
|
|
||||||
- Miscellaneous cache functions.
|
- Miscellaneous cache functions.
|
||||||
|
|
||||||
flush_cache_all();
|
flush_cache_all();
|
||||||
|
83
Documentation/blackfin/gptimers-example.c
Normal file
83
Documentation/blackfin/gptimers-example.c
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
/*
|
||||||
|
* Simple gptimers example
|
||||||
|
* http://docs.blackfin.uclinux.org/doku.php?id=linux-kernel:drivers:gptimers
|
||||||
|
*
|
||||||
|
* Copyright 2007-2009 Analog Devices Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the GPL-2 or later.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/interrupt.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
|
||||||
|
#include <asm/gptimers.h>
|
||||||
|
#include <asm/portmux.h>
|
||||||
|
|
||||||
|
/* ... random driver includes ... */
|
||||||
|
|
||||||
|
#define DRIVER_NAME "gptimer_example"
|
||||||
|
|
||||||
|
struct gptimer_data {
|
||||||
|
uint32_t period, width;
|
||||||
|
};
|
||||||
|
static struct gptimer_data data;
|
||||||
|
|
||||||
|
/* ... random driver state ... */
|
||||||
|
|
||||||
|
static irqreturn_t gptimer_example_irq(int irq, void *dev_id)
|
||||||
|
{
|
||||||
|
struct gptimer_data *data = dev_id;
|
||||||
|
|
||||||
|
/* make sure it was our timer which caused the interrupt */
|
||||||
|
if (!get_gptimer_intr(TIMER5_id))
|
||||||
|
return IRQ_NONE;
|
||||||
|
|
||||||
|
/* read the width/period values that were captured for the waveform */
|
||||||
|
data->width = get_gptimer_pwidth(TIMER5_id);
|
||||||
|
data->period = get_gptimer_period(TIMER5_id);
|
||||||
|
|
||||||
|
/* acknowledge the interrupt */
|
||||||
|
clear_gptimer_intr(TIMER5_id);
|
||||||
|
|
||||||
|
/* tell the upper layers we took care of things */
|
||||||
|
return IRQ_HANDLED;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ... random driver code ... */
|
||||||
|
|
||||||
|
static int __init gptimer_example_init(void)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
/* grab the peripheral pins */
|
||||||
|
ret = peripheral_request(P_TMR5, DRIVER_NAME);
|
||||||
|
if (ret) {
|
||||||
|
printk(KERN_NOTICE DRIVER_NAME ": peripheral request failed\n");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* grab the IRQ for the timer */
|
||||||
|
ret = request_irq(IRQ_TIMER5, gptimer_example_irq, IRQF_SHARED, DRIVER_NAME, &data);
|
||||||
|
if (ret) {
|
||||||
|
printk(KERN_NOTICE DRIVER_NAME ": IRQ request failed\n");
|
||||||
|
peripheral_free(P_TMR5);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* setup the timer and enable it */
|
||||||
|
set_gptimer_config(TIMER5_id, WDTH_CAP | PULSE_HI | PERIOD_CNT | IRQ_ENA);
|
||||||
|
enable_gptimers(TIMER5bit);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
module_init(gptimer_example_init);
|
||||||
|
|
||||||
|
static void __exit gptimer_example_exit(void)
|
||||||
|
{
|
||||||
|
disable_gptimers(TIMER5bit);
|
||||||
|
free_irq(IRQ_TIMER5, &data);
|
||||||
|
peripheral_free(P_TMR5);
|
||||||
|
}
|
||||||
|
module_exit(gptimer_example_exit);
|
||||||
|
|
||||||
|
MODULE_LICENSE("BSD");
|
@@ -92,9 +92,9 @@ policy->cpuinfo.max_freq - the minimum and maximum frequency
|
|||||||
(in kHz) which is supported by
|
(in kHz) which is supported by
|
||||||
this CPU
|
this CPU
|
||||||
policy->cpuinfo.transition_latency the time it takes on this CPU to
|
policy->cpuinfo.transition_latency the time it takes on this CPU to
|
||||||
switch between two frequencies (if
|
switch between two frequencies in
|
||||||
appropriate, else specify
|
nanoseconds (if appropriate, else
|
||||||
CPUFREQ_ETERNAL)
|
specify CPUFREQ_ETERNAL)
|
||||||
|
|
||||||
policy->cur The current operating frequency of
|
policy->cur The current operating frequency of
|
||||||
this CPU (if appropriate)
|
this CPU (if appropriate)
|
||||||
|
@@ -203,6 +203,17 @@ scaling_cur_freq : Current frequency of the CPU as determined by
|
|||||||
the frequency the kernel thinks the CPU runs
|
the frequency the kernel thinks the CPU runs
|
||||||
at.
|
at.
|
||||||
|
|
||||||
|
bios_limit : If the BIOS tells the OS to limit a CPU to
|
||||||
|
lower frequencies, the user can read out the
|
||||||
|
maximum available frequency from this file.
|
||||||
|
This typically can happen through (often not
|
||||||
|
intended) BIOS settings, restrictions
|
||||||
|
triggered through a service processor or other
|
||||||
|
BIOS/HW based implementations.
|
||||||
|
This does not cover thermal ACPI limitations
|
||||||
|
which can be detected through the generic
|
||||||
|
thermal driver.
|
||||||
|
|
||||||
If you have selected the "userspace" governor which allows you to
|
If you have selected the "userspace" governor which allows you to
|
||||||
set the CPU operating frequency to a specific value, you can read out
|
set the CPU operating frequency to a specific value, you can read out
|
||||||
the current frequency in
|
the current frequency in
|
||||||
|
@@ -49,6 +49,12 @@ maxcpus=n Restrict boot time cpus to n. Say if you have 4 cpus, using
|
|||||||
additional_cpus=n (*) Use this to limit hotpluggable cpus. This option sets
|
additional_cpus=n (*) Use this to limit hotpluggable cpus. This option sets
|
||||||
cpu_possible_map = cpu_present_map + additional_cpus
|
cpu_possible_map = cpu_present_map + additional_cpus
|
||||||
|
|
||||||
|
cede_offline={"off","on"} Use this option to disable/enable putting offlined
|
||||||
|
processors to an extended H_CEDE state on
|
||||||
|
supported pseries platforms.
|
||||||
|
If nothing is specified,
|
||||||
|
cede_offline is set to "on".
|
||||||
|
|
||||||
(*) Option valid only for following architectures
|
(*) Option valid only for following architectures
|
||||||
- ia64
|
- ia64
|
||||||
|
|
||||||
@@ -309,41 +315,26 @@ A: The following are what is required for CPU hotplug infrastructure to work
|
|||||||
|
|
||||||
Q: I need to ensure that a particular cpu is not removed when there is some
|
Q: I need to ensure that a particular cpu is not removed when there is some
|
||||||
work specific to this cpu is in progress.
|
work specific to this cpu is in progress.
|
||||||
A: First switch the current thread context to preferred cpu
|
A: There are two ways. If your code can be run in interrupt context, use
|
||||||
|
smp_call_function_single(), otherwise use work_on_cpu(). Note that
|
||||||
|
work_on_cpu() is slow, and can fail due to out of memory:
|
||||||
|
|
||||||
int my_func_on_cpu(int cpu)
|
int my_func_on_cpu(int cpu)
|
||||||
{
|
{
|
||||||
cpumask_t saved_mask, new_mask = CPU_MASK_NONE;
|
int err;
|
||||||
int curr_cpu, err = 0;
|
get_online_cpus();
|
||||||
|
if (!cpu_online(cpu))
|
||||||
saved_mask = current->cpus_allowed;
|
err = -EINVAL;
|
||||||
cpu_set(cpu, new_mask);
|
else
|
||||||
err = set_cpus_allowed(current, new_mask);
|
#if NEEDS_BLOCKING
|
||||||
|
err = work_on_cpu(cpu, __my_func_on_cpu, NULL);
|
||||||
if (err)
|
#else
|
||||||
return err;
|
smp_call_function_single(cpu, __my_func_on_cpu, &err,
|
||||||
|
true);
|
||||||
/*
|
#endif
|
||||||
* If we got scheduled out just after the return from
|
put_online_cpus();
|
||||||
* set_cpus_allowed() before running the work, this ensures
|
return err;
|
||||||
* we stay locked.
|
}
|
||||||
*/
|
|
||||||
curr_cpu = get_cpu();
|
|
||||||
|
|
||||||
if (curr_cpu != cpu) {
|
|
||||||
err = -EAGAIN;
|
|
||||||
goto ret;
|
|
||||||
} else {
|
|
||||||
/*
|
|
||||||
* Do work : But cant sleep, since get_cpu() disables preempt
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
ret:
|
|
||||||
put_cpu();
|
|
||||||
set_cpus_allowed(current, saved_mask);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Q: How do we determine how many CPUs are available for hotplug.
|
Q: How do we determine how many CPUs are available for hotplug.
|
||||||
A: There is no clear spec defined way from ACPI that can give us that
|
A: There is no clear spec defined way from ACPI that can give us that
|
||||||
|
@@ -8,13 +8,19 @@ the block device which are also writable without interfering with the
|
|||||||
original content;
|
original content;
|
||||||
*) To create device "forks", i.e. multiple different versions of the
|
*) To create device "forks", i.e. multiple different versions of the
|
||||||
same data stream.
|
same data stream.
|
||||||
|
*) To merge a snapshot of a block device back into the snapshot's origin
|
||||||
|
device.
|
||||||
|
|
||||||
|
In the first two cases, dm copies only the chunks of data that get
|
||||||
|
changed and uses a separate copy-on-write (COW) block device for
|
||||||
|
storage.
|
||||||
|
|
||||||
|
For snapshot merge the contents of the COW storage are merged back into
|
||||||
|
the origin device.
|
||||||
|
|
||||||
|
|
||||||
In both cases, dm copies only the chunks of data that get changed and
|
There are three dm targets available:
|
||||||
uses a separate copy-on-write (COW) block device for storage.
|
snapshot, snapshot-origin, and snapshot-merge.
|
||||||
|
|
||||||
|
|
||||||
There are two dm targets available: snapshot and snapshot-origin.
|
|
||||||
|
|
||||||
*) snapshot-origin <origin>
|
*) snapshot-origin <origin>
|
||||||
|
|
||||||
@@ -40,8 +46,25 @@ The difference is that for transient snapshots less metadata must be
|
|||||||
saved on disk - they can be kept in memory by the kernel.
|
saved on disk - they can be kept in memory by the kernel.
|
||||||
|
|
||||||
|
|
||||||
How this is used by LVM2
|
* snapshot-merge <origin> <COW device> <persistent> <chunksize>
|
||||||
========================
|
|
||||||
|
takes the same table arguments as the snapshot target except it only
|
||||||
|
works with persistent snapshots. This target assumes the role of the
|
||||||
|
"snapshot-origin" target and must not be loaded if the "snapshot-origin"
|
||||||
|
is still present for <origin>.
|
||||||
|
|
||||||
|
Creates a merging snapshot that takes control of the changed chunks
|
||||||
|
stored in the <COW device> of an existing snapshot, through a handover
|
||||||
|
procedure, and merges these chunks back into the <origin>. Once merging
|
||||||
|
has started (in the background) the <origin> may be opened and the merge
|
||||||
|
will continue while I/O is flowing to it. Changes to the <origin> are
|
||||||
|
deferred until the merging snapshot's corresponding chunk(s) have been
|
||||||
|
merged. Once merging has started the snapshot device, associated with
|
||||||
|
the "snapshot" target, will return -EIO when accessed.
|
||||||
|
|
||||||
|
|
||||||
|
How snapshot is used by LVM2
|
||||||
|
============================
|
||||||
When you create the first LVM2 snapshot of a volume, four dm devices are used:
|
When you create the first LVM2 snapshot of a volume, four dm devices are used:
|
||||||
|
|
||||||
1) a device containing the original mapping table of the source volume;
|
1) a device containing the original mapping table of the source volume;
|
||||||
@@ -72,3 +95,30 @@ brw------- 1 root root 254, 12 29 ago 18:15 /dev/mapper/volumeGroup-snap-cow
|
|||||||
brw------- 1 root root 254, 13 29 ago 18:15 /dev/mapper/volumeGroup-snap
|
brw------- 1 root root 254, 13 29 ago 18:15 /dev/mapper/volumeGroup-snap
|
||||||
brw------- 1 root root 254, 10 29 ago 18:14 /dev/mapper/volumeGroup-base
|
brw------- 1 root root 254, 10 29 ago 18:14 /dev/mapper/volumeGroup-base
|
||||||
|
|
||||||
|
|
||||||
|
How snapshot-merge is used by LVM2
|
||||||
|
==================================
|
||||||
|
A merging snapshot assumes the role of the "snapshot-origin" while
|
||||||
|
merging. As such the "snapshot-origin" is replaced with
|
||||||
|
"snapshot-merge". The "-real" device is not changed and the "-cow"
|
||||||
|
device is renamed to <origin name>-cow to aid LVM2's cleanup of the
|
||||||
|
merging snapshot after it completes. The "snapshot" that hands over its
|
||||||
|
COW device to the "snapshot-merge" is deactivated (unless using lvchange
|
||||||
|
--refresh); but if it is left active it will simply return I/O errors.
|
||||||
|
|
||||||
|
A snapshot will merge into its origin with the following command:
|
||||||
|
|
||||||
|
lvconvert --merge volumeGroup/snap
|
||||||
|
|
||||||
|
we'll now have this situation:
|
||||||
|
|
||||||
|
# dmsetup table|grep volumeGroup
|
||||||
|
|
||||||
|
volumeGroup-base-real: 0 2097152 linear 8:19 384
|
||||||
|
volumeGroup-base-cow: 0 204800 linear 8:19 2097536
|
||||||
|
volumeGroup-base: 0 2097152 snapshot-merge 254:11 254:12 P 16
|
||||||
|
|
||||||
|
# ls -lL /dev/mapper/volumeGroup-*
|
||||||
|
brw------- 1 root root 254, 11 29 ago 18:15 /dev/mapper/volumeGroup-base-real
|
||||||
|
brw------- 1 root root 254, 12 29 ago 18:16 /dev/mapper/volumeGroup-base-cow
|
||||||
|
brw------- 1 root root 254, 10 29 ago 18:16 /dev/mapper/volumeGroup-base
|
||||||
|
@@ -103,6 +103,7 @@ gconf
|
|||||||
gen-devlist
|
gen-devlist
|
||||||
gen_crc32table
|
gen_crc32table
|
||||||
gen_init_cpio
|
gen_init_cpio
|
||||||
|
generated
|
||||||
genheaders
|
genheaders
|
||||||
genksyms
|
genksyms
|
||||||
*_gray256.c
|
*_gray256.c
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
VIA UniChrome Family(CLE266, PM800 / CN400 / CN300,
|
VIA UniChrome Family(CLE266, PM800 / CN400 / CN300,
|
||||||
P4M800CE / P4M800Pro / CN700 / VN800,
|
P4M800CE / P4M800Pro / CN700 / VN800,
|
||||||
CX700 / VX700, K8M890, P4M890,
|
CX700 / VX700, K8M890, P4M890,
|
||||||
CN896 / P4M900, VX800)
|
CN896 / P4M900, VX800, VX855)
|
||||||
|
|
||||||
[Driver features]
|
[Driver features]
|
||||||
------------------------
|
------------------------
|
||||||
@@ -154,13 +154,6 @@
|
|||||||
0 : No Dual Edge Panel (default)
|
0 : No Dual Edge Panel (default)
|
||||||
1 : Dual Edge Panel
|
1 : Dual Edge Panel
|
||||||
|
|
||||||
viafb_video_dev:
|
|
||||||
This option is used to specify video output devices(CRT, DVI, LCD) for
|
|
||||||
duoview case.
|
|
||||||
For example:
|
|
||||||
To output video on DVI, we should use:
|
|
||||||
modprobe viafb viafb_video_dev=DVI...
|
|
||||||
|
|
||||||
viafb_lcd_port:
|
viafb_lcd_port:
|
||||||
This option is used to specify LCD output port,
|
This option is used to specify LCD output port,
|
||||||
available values are "DVP0" "DVP1" "DFP_HIGHLOW" "DFP_HIGH" "DFP_LOW".
|
available values are "DVP0" "DVP1" "DFP_HIGHLOW" "DFP_HIGH" "DFP_LOW".
|
||||||
@@ -181,9 +174,6 @@ Notes:
|
|||||||
and bpp, need to call VIAFB specified ioctl interface VIAFB_SET_DEVICE
|
and bpp, need to call VIAFB specified ioctl interface VIAFB_SET_DEVICE
|
||||||
instead of calling common ioctl function FBIOPUT_VSCREENINFO since
|
instead of calling common ioctl function FBIOPUT_VSCREENINFO since
|
||||||
viafb doesn't support multi-head well, or it will cause screen crush.
|
viafb doesn't support multi-head well, or it will cause screen crush.
|
||||||
4. VX800 2D accelerator hasn't been supported in this driver yet. When
|
|
||||||
using driver on VX800, the driver will disable the acceleration
|
|
||||||
function as default.
|
|
||||||
|
|
||||||
|
|
||||||
[Configure viafb with "fbset" tool]
|
[Configure viafb with "fbset" tool]
|
||||||
|
@@ -291,15 +291,6 @@ Who: Michael Buesch <mb@bu3sch.de>
|
|||||||
|
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
||||||
What: print_fn_descriptor_symbol()
|
|
||||||
When: October 2009
|
|
||||||
Why: The %pF vsprintf format provides the same functionality in a
|
|
||||||
simpler way. print_fn_descriptor_symbol() is deprecated but
|
|
||||||
still present to give out-of-tree modules time to change.
|
|
||||||
Who: Bjorn Helgaas <bjorn.helgaas@hp.com>
|
|
||||||
|
|
||||||
---------------------------
|
|
||||||
|
|
||||||
What: /sys/o2cb symlink
|
What: /sys/o2cb symlink
|
||||||
When: January 2010
|
When: January 2010
|
||||||
Why: /sys/fs/o2cb is the proper location for this information - /sys/o2cb
|
Why: /sys/fs/o2cb is the proper location for this information - /sys/o2cb
|
||||||
@@ -483,3 +474,22 @@ Why: Obsoleted by the adt7475 driver.
|
|||||||
Who: Jean Delvare <khali@linux-fr.org>
|
Who: Jean Delvare <khali@linux-fr.org>
|
||||||
|
|
||||||
---------------------------
|
---------------------------
|
||||||
|
What: Support for lcd_switch and display_get in asus-laptop driver
|
||||||
|
When: March 2010
|
||||||
|
Why: These two features use non-standard interfaces. There are the
|
||||||
|
only features that really need multiple path to guess what's
|
||||||
|
the right method name on a specific laptop.
|
||||||
|
|
||||||
|
Removing them will allow to remove a lot of code an significantly
|
||||||
|
clean the drivers.
|
||||||
|
|
||||||
|
This will affect the backlight code which won't be able to know
|
||||||
|
if the backlight is on or off. The platform display file will also be
|
||||||
|
write only (like the one in eeepc-laptop).
|
||||||
|
|
||||||
|
This should'nt affect a lot of user because they usually know
|
||||||
|
when their display is on or off.
|
||||||
|
|
||||||
|
Who: Corentin Chary <corentin.chary@gmail.com>
|
||||||
|
|
||||||
|
----------------------------
|
||||||
|
@@ -1,7 +1,5 @@
|
|||||||
00-INDEX
|
00-INDEX
|
||||||
- this file (info on some of the filesystems supported by linux).
|
- this file (info on some of the filesystems supported by linux).
|
||||||
Exporting
|
|
||||||
- explanation of how to make filesystems exportable.
|
|
||||||
Locking
|
Locking
|
||||||
- info on locking rules as they pertain to Linux VFS.
|
- info on locking rules as they pertain to Linux VFS.
|
||||||
9p.txt
|
9p.txt
|
||||||
@@ -68,12 +66,8 @@ mandatory-locking.txt
|
|||||||
- info on the Linux implementation of Sys V mandatory file locking.
|
- info on the Linux implementation of Sys V mandatory file locking.
|
||||||
ncpfs.txt
|
ncpfs.txt
|
||||||
- info on Novell Netware(tm) filesystem using NCP protocol.
|
- info on Novell Netware(tm) filesystem using NCP protocol.
|
||||||
nfs41-server.txt
|
nfs/
|
||||||
- info on the Linux server implementation of NFSv4 minor version 1.
|
- nfs-related documentation.
|
||||||
nfs-rdma.txt
|
|
||||||
- how to install and setup the Linux NFS/RDMA client and server software.
|
|
||||||
nfsroot.txt
|
|
||||||
- short guide on setting up a diskless box with NFS root filesystem.
|
|
||||||
nilfs2.txt
|
nilfs2.txt
|
||||||
- info and mount options for the NILFS2 filesystem.
|
- info and mount options for the NILFS2 filesystem.
|
||||||
ntfs.txt
|
ntfs.txt
|
||||||
@@ -92,8 +86,6 @@ relay.txt
|
|||||||
- info on relay, for efficient streaming from kernel to user space.
|
- info on relay, for efficient streaming from kernel to user space.
|
||||||
romfs.txt
|
romfs.txt
|
||||||
- description of the ROMFS filesystem.
|
- description of the ROMFS filesystem.
|
||||||
rpc-cache.txt
|
|
||||||
- introduction to the caching mechanisms in the sunrpc layer.
|
|
||||||
seq_file.txt
|
seq_file.txt
|
||||||
- how to use the seq_file API
|
- how to use the seq_file API
|
||||||
sharedsubtree.txt
|
sharedsubtree.txt
|
||||||
|
@@ -32,8 +32,8 @@ journal_dev=devnum When the external journal device's major/minor numbers
|
|||||||
identified through its new major/minor numbers encoded
|
identified through its new major/minor numbers encoded
|
||||||
in devnum.
|
in devnum.
|
||||||
|
|
||||||
noload Don't load the journal on mounting. Note that this forces
|
norecovery Don't load the journal on mounting. Note that this forces
|
||||||
mount of inconsistent filesystem, which can lead to
|
noload mount of inconsistent filesystem, which can lead to
|
||||||
various problems.
|
various problems.
|
||||||
|
|
||||||
data=journal All data are committed into the journal prior to being
|
data=journal All data are committed into the journal prior to being
|
||||||
|
16
Documentation/filesystems/nfs/00-INDEX
Normal file
16
Documentation/filesystems/nfs/00-INDEX
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
00-INDEX
|
||||||
|
- this file (nfs-related documentation).
|
||||||
|
Exporting
|
||||||
|
- explanation of how to make filesystems exportable.
|
||||||
|
knfsd-stats.txt
|
||||||
|
- statistics which the NFS server makes available to user space.
|
||||||
|
nfs.txt
|
||||||
|
- nfs client, and DNS resolution for fs_locations.
|
||||||
|
nfs41-server.txt
|
||||||
|
- info on the Linux server implementation of NFSv4 minor version 1.
|
||||||
|
nfs-rdma.txt
|
||||||
|
- how to install and setup the Linux NFS/RDMA client and server software
|
||||||
|
nfsroot.txt
|
||||||
|
- short guide on setting up a diskless box with NFS root filesystem.
|
||||||
|
rpc-cache.txt
|
||||||
|
- introduction to the caching mechanisms in the sunrpc layer.
|
@@ -41,7 +41,7 @@ interoperability problems with future clients. Known issues:
|
|||||||
conformant with the spec (for example, we don't use kerberos
|
conformant with the spec (for example, we don't use kerberos
|
||||||
on the backchannel correctly).
|
on the backchannel correctly).
|
||||||
- no trunking support: no clients currently take advantage of
|
- no trunking support: no clients currently take advantage of
|
||||||
trunking, but this is a mandatory failure, and its use is
|
trunking, but this is a mandatory feature, and its use is
|
||||||
recommended to clients in a number of places. (E.g. to ensure
|
recommended to clients in a number of places. (E.g. to ensure
|
||||||
timely renewal in case an existing connection's retry timeouts
|
timely renewal in case an existing connection's retry timeouts
|
||||||
have gotten too long; see section 8.3 of the draft.)
|
have gotten too long; see section 8.3 of the draft.)
|
||||||
@@ -213,3 +213,10 @@ The following cases aren't supported yet:
|
|||||||
DESTROY_CLIENTID, DESTROY_SESSION, EXCHANGE_ID.
|
DESTROY_CLIENTID, DESTROY_SESSION, EXCHANGE_ID.
|
||||||
* DESTROY_SESSION MUST be the final operation in the COMPOUND request.
|
* DESTROY_SESSION MUST be the final operation in the COMPOUND request.
|
||||||
|
|
||||||
|
Nonstandard compound limitations:
|
||||||
|
* No support for a sessions fore channel RPC compound that requires both a
|
||||||
|
ca_maxrequestsize request and a ca_maxresponsesize reply, so we may
|
||||||
|
fail to live up to the promise we made in CREATE_SESSION fore channel
|
||||||
|
negotiation.
|
||||||
|
* No more than one IO operation (read, write, readdir) allowed per
|
||||||
|
compound.
|
@@ -49,8 +49,7 @@ Mount options
|
|||||||
NILFS2 supports the following mount options:
|
NILFS2 supports the following mount options:
|
||||||
(*) == default
|
(*) == default
|
||||||
|
|
||||||
barrier=on(*) This enables/disables barriers. barrier=off disables
|
nobarrier Disables barriers.
|
||||||
it, barrier=on enables it.
|
|
||||||
errors=continue(*) Keep going on a filesystem error.
|
errors=continue(*) Keep going on a filesystem error.
|
||||||
errors=remount-ro Remount the filesystem read-only on an error.
|
errors=remount-ro Remount the filesystem read-only on an error.
|
||||||
errors=panic Panic and halt the machine if an error occurs.
|
errors=panic Panic and halt the machine if an error occurs.
|
||||||
@@ -71,6 +70,10 @@ order=strict Apply strict in-order semantics that preserves sequence
|
|||||||
blocks. That means, it is guaranteed that no
|
blocks. That means, it is guaranteed that no
|
||||||
overtaking of events occurs in the recovered file
|
overtaking of events occurs in the recovered file
|
||||||
system after a crash.
|
system after a crash.
|
||||||
|
norecovery Disable recovery of the filesystem on mount.
|
||||||
|
This disables every write access on the device for
|
||||||
|
read-only mounts or snapshots. This option will fail
|
||||||
|
for r/w mounts on an unclean volume.
|
||||||
|
|
||||||
NILFS2 usage
|
NILFS2 usage
|
||||||
============
|
============
|
||||||
|
@@ -140,7 +140,7 @@ Callers of notify_change() need ->i_mutex now.
|
|||||||
New super_block field "struct export_operations *s_export_op" for
|
New super_block field "struct export_operations *s_export_op" for
|
||||||
explicit support for exporting, e.g. via NFS. The structure is fully
|
explicit support for exporting, e.g. via NFS. The structure is fully
|
||||||
documented at its declaration in include/linux/fs.h, and in
|
documented at its declaration in include/linux/fs.h, and in
|
||||||
Documentation/filesystems/Exporting.
|
Documentation/filesystems/nfs/Exporting.
|
||||||
|
|
||||||
Briefly it allows for the definition of decode_fh and encode_fh operations
|
Briefly it allows for the definition of decode_fh and encode_fh operations
|
||||||
to encode and decode filehandles, and allows the filesystem to use
|
to encode and decode filehandles, and allows the filesystem to use
|
||||||
|
@@ -38,6 +38,7 @@ Table of Contents
|
|||||||
3.3 /proc/<pid>/io - Display the IO accounting fields
|
3.3 /proc/<pid>/io - Display the IO accounting fields
|
||||||
3.4 /proc/<pid>/coredump_filter - Core dump filtering settings
|
3.4 /proc/<pid>/coredump_filter - Core dump filtering settings
|
||||||
3.5 /proc/<pid>/mountinfo - Information about mounts
|
3.5 /proc/<pid>/mountinfo - Information about mounts
|
||||||
|
3.6 /proc/<pid>/comm & /proc/<pid>/task/<tid>/comm
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
@@ -1409,3 +1410,11 @@ For more information on mount propagation see:
|
|||||||
|
|
||||||
Documentation/filesystems/sharedsubtree.txt
|
Documentation/filesystems/sharedsubtree.txt
|
||||||
|
|
||||||
|
|
||||||
|
3.6 /proc/<pid>/comm & /proc/<pid>/task/<tid>/comm
|
||||||
|
--------------------------------------------------------
|
||||||
|
These files provide a method to access a tasks comm value. It also allows for
|
||||||
|
a task to set its own or one of its thread siblings comm value. The comm value
|
||||||
|
is limited in size compared to the cmdline value, so writing anything longer
|
||||||
|
then the kernel's TASK_COMM_LEN (currently 16 chars) will result in a truncated
|
||||||
|
comm value.
|
||||||
|
@@ -248,9 +248,7 @@ code, that is done in the initialization code in the usual way:
|
|||||||
{
|
{
|
||||||
struct proc_dir_entry *entry;
|
struct proc_dir_entry *entry;
|
||||||
|
|
||||||
entry = create_proc_entry("sequence", 0, NULL);
|
proc_create("sequence", 0, NULL, &ct_file_ops);
|
||||||
if (entry)
|
|
||||||
entry->proc_fops = &ct_file_ops;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -472,7 +472,7 @@ __sync_single_inode) to check if ->writepages has been successful in
|
|||||||
writing out the whole address_space.
|
writing out the whole address_space.
|
||||||
|
|
||||||
The Writeback tag is used by filemap*wait* and sync_page* functions,
|
The Writeback tag is used by filemap*wait* and sync_page* functions,
|
||||||
via wait_on_page_writeback_range, to wait for all writeback to
|
via filemap_fdatawait_range, to wait for all writeback to
|
||||||
complete. While waiting ->sync_page (if defined) will be called on
|
complete. While waiting ->sync_page (if defined) will be called on
|
||||||
each page that is found to require writeback.
|
each page that is found to require writeback.
|
||||||
|
|
||||||
|
@@ -531,6 +531,13 @@ and have the following read/write attributes:
|
|||||||
This file exists only if the pin can be configured as an
|
This file exists only if the pin can be configured as an
|
||||||
interrupt generating input pin.
|
interrupt generating input pin.
|
||||||
|
|
||||||
|
"active_low" ... reads as either 0 (false) or 1 (true). Write
|
||||||
|
any nonzero value to invert the value attribute both
|
||||||
|
for reading and writing. Existing and subsequent
|
||||||
|
poll(2) support configuration via the edge attribute
|
||||||
|
for "rising" and "falling" edges will follow this
|
||||||
|
setting.
|
||||||
|
|
||||||
GPIO controllers have paths like /sys/class/gpio/gpiochip42/ (for the
|
GPIO controllers have paths like /sys/class/gpio/gpiochip42/ (for the
|
||||||
controller implementing GPIOs starting at #42) and have the following
|
controller implementing GPIOs starting at #42) and have the following
|
||||||
read-only attributes:
|
read-only attributes:
|
||||||
@@ -566,6 +573,8 @@ requested using gpio_request():
|
|||||||
int gpio_export_link(struct device *dev, const char *name,
|
int gpio_export_link(struct device *dev, const char *name,
|
||||||
unsigned gpio)
|
unsigned gpio)
|
||||||
|
|
||||||
|
/* change the polarity of a GPIO node in sysfs */
|
||||||
|
int gpio_sysfs_set_active_low(unsigned gpio, int value);
|
||||||
|
|
||||||
After a kernel driver requests a GPIO, it may only be made available in
|
After a kernel driver requests a GPIO, it may only be made available in
|
||||||
the sysfs interface by gpio_export(). The driver can control whether the
|
the sysfs interface by gpio_export(). The driver can control whether the
|
||||||
@@ -580,3 +589,9 @@ After the GPIO has been exported, gpio_export_link() allows creating
|
|||||||
symlinks from elsewhere in sysfs to the GPIO sysfs node. Drivers can
|
symlinks from elsewhere in sysfs to the GPIO sysfs node. Drivers can
|
||||||
use this to provide the interface under their own device in sysfs with
|
use this to provide the interface under their own device in sysfs with
|
||||||
a descriptive name.
|
a descriptive name.
|
||||||
|
|
||||||
|
Drivers can use gpio_sysfs_set_active_low() to hide GPIO line polarity
|
||||||
|
differences between boards from user space. This only affects the
|
||||||
|
sysfs interface. Polarity change can be done both before and after
|
||||||
|
gpio_export(), and previously enabled poll(2) support for either
|
||||||
|
rising or falling edge will be reconfigured to follow this setting.
|
||||||
|
60
Documentation/hwmon/k10temp
Normal file
60
Documentation/hwmon/k10temp
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
Kernel driver k10temp
|
||||||
|
=====================
|
||||||
|
|
||||||
|
Supported chips:
|
||||||
|
* AMD Family 10h processors:
|
||||||
|
Socket F: Quad-Core/Six-Core/Embedded Opteron
|
||||||
|
Socket AM2+: Opteron, Phenom (II) X3/X4
|
||||||
|
Socket AM3: Quad-Core Opteron, Athlon/Phenom II X2/X3/X4, Sempron II
|
||||||
|
Socket S1G3: Athlon II, Sempron, Turion II
|
||||||
|
* AMD Family 11h processors:
|
||||||
|
Socket S1G2: Athlon (X2), Sempron (X2), Turion X2 (Ultra)
|
||||||
|
|
||||||
|
Prefix: 'k10temp'
|
||||||
|
Addresses scanned: PCI space
|
||||||
|
Datasheets:
|
||||||
|
BIOS and Kernel Developer's Guide (BKDG) For AMD Family 10h Processors:
|
||||||
|
http://support.amd.com/us/Processor_TechDocs/31116.pdf
|
||||||
|
BIOS and Kernel Developer's Guide (BKDG) for AMD Family 11h Processors:
|
||||||
|
http://support.amd.com/us/Processor_TechDocs/41256.pdf
|
||||||
|
Revision Guide for AMD Family 10h Processors:
|
||||||
|
http://support.amd.com/us/Processor_TechDocs/41322.pdf
|
||||||
|
Revision Guide for AMD Family 11h Processors:
|
||||||
|
http://support.amd.com/us/Processor_TechDocs/41788.pdf
|
||||||
|
AMD Family 11h Processor Power and Thermal Data Sheet for Notebooks:
|
||||||
|
http://support.amd.com/us/Processor_TechDocs/43373.pdf
|
||||||
|
AMD Family 10h Server and Workstation Processor Power and Thermal Data Sheet:
|
||||||
|
http://support.amd.com/us/Processor_TechDocs/43374.pdf
|
||||||
|
AMD Family 10h Desktop Processor Power and Thermal Data Sheet:
|
||||||
|
http://support.amd.com/us/Processor_TechDocs/43375.pdf
|
||||||
|
|
||||||
|
Author: Clemens Ladisch <clemens@ladisch.de>
|
||||||
|
|
||||||
|
Description
|
||||||
|
-----------
|
||||||
|
|
||||||
|
This driver permits reading of the internal temperature sensor of AMD
|
||||||
|
Family 10h and 11h processors.
|
||||||
|
|
||||||
|
All these processors have a sensor, but on older revisions of Family 10h
|
||||||
|
processors, the sensor may return inconsistent values (erratum 319). The
|
||||||
|
driver will refuse to load on these revisions unless you specify the
|
||||||
|
"force=1" module parameter.
|
||||||
|
|
||||||
|
There is one temperature measurement value, available as temp1_input in
|
||||||
|
sysfs. It is measured in degrees Celsius with a resolution of 1/8th degree.
|
||||||
|
Please note that it is defined as a relative value; to quote the AMD manual:
|
||||||
|
|
||||||
|
Tctl is the processor temperature control value, used by the platform to
|
||||||
|
control cooling systems. Tctl is a non-physical temperature on an
|
||||||
|
arbitrary scale measured in degrees. It does _not_ represent an actual
|
||||||
|
physical temperature like die or case temperature. Instead, it specifies
|
||||||
|
the processor temperature relative to the point at which the system must
|
||||||
|
supply the maximum cooling for the processor's specified maximum case
|
||||||
|
temperature and maximum thermal power dissipation.
|
||||||
|
|
||||||
|
The maximum value for Tctl is available in the file temp1_max.
|
||||||
|
|
||||||
|
If the BIOS has enabled hardware temperature control, the threshold at
|
||||||
|
which the processor will throttle itself to avoid damage is available in
|
||||||
|
temp1_crit and temp1_crit_hyst.
|
@@ -3,7 +3,8 @@ Kernel driver lis3lv02d
|
|||||||
|
|
||||||
Supported chips:
|
Supported chips:
|
||||||
|
|
||||||
* STMicroelectronics LIS3LV02DL and LIS3LV02DQ
|
* STMicroelectronics LIS3LV02DL, LIS3LV02DQ (12 bits precision)
|
||||||
|
* STMicroelectronics LIS302DL, LIS3L02DQ, LIS331DL (8 bits)
|
||||||
|
|
||||||
Authors:
|
Authors:
|
||||||
Yan Burman <burman.yan@gmail.com>
|
Yan Burman <burman.yan@gmail.com>
|
||||||
@@ -13,32 +14,52 @@ Authors:
|
|||||||
Description
|
Description
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
This driver provides support for the accelerometer found in various HP
|
This driver provides support for the accelerometer found in various HP laptops
|
||||||
laptops sporting the feature officially called "HP Mobile Data
|
sporting the feature officially called "HP Mobile Data Protection System 3D" or
|
||||||
Protection System 3D" or "HP 3D DriveGuard". It detects automatically
|
"HP 3D DriveGuard". It detects automatically laptops with this sensor. Known
|
||||||
laptops with this sensor. Known models (for now the HP 2133, nc6420,
|
models (full list can be found in drivers/hwmon/hp_accel.c) will have their
|
||||||
nc2510, nc8510, nc84x0, nw9440 and nx9420) will have their axis
|
axis automatically oriented on standard way (eg: you can directly play
|
||||||
automatically oriented on standard way (eg: you can directly play
|
neverball). The accelerometer data is readable via
|
||||||
neverball). The accelerometer data is readable via
|
/sys/devices/platform/lis3lv02d. Reported values are scaled
|
||||||
/sys/devices/platform/lis3lv02d.
|
to mg values (1/1000th of earth gravity).
|
||||||
|
|
||||||
Sysfs attributes under /sys/devices/platform/lis3lv02d/:
|
Sysfs attributes under /sys/devices/platform/lis3lv02d/:
|
||||||
position - 3D position that the accelerometer reports. Format: "(x,y,z)"
|
position - 3D position that the accelerometer reports. Format: "(x,y,z)"
|
||||||
calibrate - read: values (x, y, z) that are used as the base for input
|
rate - read reports the sampling rate of the accelerometer device in HZ.
|
||||||
class device operation.
|
write changes sampling rate of the accelerometer device.
|
||||||
write: forces the base to be recalibrated with the current
|
Only values which are supported by HW are accepted.
|
||||||
position.
|
selftest - performs selftest for the chip as specified by chip manufacturer.
|
||||||
rate - reports the sampling rate of the accelerometer device in HZ
|
|
||||||
|
|
||||||
This driver also provides an absolute input class device, allowing
|
This driver also provides an absolute input class device, allowing
|
||||||
the laptop to act as a pinball machine-esque joystick.
|
the laptop to act as a pinball machine-esque joystick. Joystick device can be
|
||||||
|
calibrated. Joystick device can be in two different modes.
|
||||||
|
By default output values are scaled between -32768 .. 32767. In joystick raw
|
||||||
|
mode, joystick and sysfs position entry have the same scale. There can be
|
||||||
|
small difference due to input system fuzziness feature.
|
||||||
|
Events are also available as input event device.
|
||||||
|
|
||||||
|
Selftest is meant only for hardware diagnostic purposes. It is not meant to be
|
||||||
|
used during normal operations. Position data is not corrupted during selftest
|
||||||
|
but interrupt behaviour is not guaranteed to work reliably. In test mode, the
|
||||||
|
sensing element is internally moved little bit. Selftest measures difference
|
||||||
|
between normal mode and test mode. Chip specifications tell the acceptance
|
||||||
|
limit for each type of the chip. Limits are provided via platform data
|
||||||
|
to allow adjustment of the limits without a change to the actual driver.
|
||||||
|
Seltest returns either "OK x y z" or "FAIL x y z" where x, y and z are
|
||||||
|
measured difference between modes. Axes are not remapped in selftest mode.
|
||||||
|
Measurement values are provided to help HW diagnostic applications to make
|
||||||
|
final decision.
|
||||||
|
|
||||||
|
On HP laptops, if the led infrastructure is activated, support for a led
|
||||||
|
indicating disk protection will be provided as /sys/class/leds/hp::hddprotect.
|
||||||
|
|
||||||
Another feature of the driver is misc device called "freefall" that
|
Another feature of the driver is misc device called "freefall" that
|
||||||
acts similar to /dev/rtc and reacts on free-fall interrupts received
|
acts similar to /dev/rtc and reacts on free-fall interrupts received
|
||||||
from the device. It supports blocking operations, poll/select and
|
from the device. It supports blocking operations, poll/select and
|
||||||
fasync operation modes. You must read 1 bytes from the device. The
|
fasync operation modes. You must read 1 bytes from the device. The
|
||||||
result is number of free-fall interrupts since the last successful
|
result is number of free-fall interrupts since the last successful
|
||||||
read (or 255 if number of interrupts would not fit).
|
read (or 255 if number of interrupts would not fit). See the hpfall.c
|
||||||
|
file for an example on using the device.
|
||||||
|
|
||||||
|
|
||||||
Axes orientation
|
Axes orientation
|
||||||
@@ -55,7 +76,7 @@ the accelerometer are converted into a "standard" organisation of the axes
|
|||||||
* If the laptop is put upside-down, Z becomes negative
|
* If the laptop is put upside-down, Z becomes negative
|
||||||
|
|
||||||
If your laptop model is not recognized (cf "dmesg"), you can send an
|
If your laptop model is not recognized (cf "dmesg"), you can send an
|
||||||
email to the authors to add it to the database. When reporting a new
|
email to the maintainer to add it to the database. When reporting a new
|
||||||
laptop, please include the output of "dmidecode" plus the value of
|
laptop, please include the output of "dmidecode" plus the value of
|
||||||
/sys/devices/platform/lis3lv02d/position in these four cases.
|
/sys/devices/platform/lis3lv02d/position in these four cases.
|
||||||
|
|
||||||
|
@@ -81,8 +81,14 @@ pwm[1-4] - this file stores PWM duty cycle or DC value (fan speed) in range:
|
|||||||
0 (stop) to 255 (full)
|
0 (stop) to 255 (full)
|
||||||
|
|
||||||
pwm[1-4]_enable - this file controls mode of fan/temperature control:
|
pwm[1-4]_enable - this file controls mode of fan/temperature control:
|
||||||
* 1 Manual Mode, write to pwm file any value 0-255 (full speed)
|
* 1 Manual mode, write to pwm file any value 0-255 (full speed)
|
||||||
* 2 Thermal Cruise
|
* 2 "Thermal Cruise" mode
|
||||||
|
* 3 "Fan Speed Cruise" mode
|
||||||
|
* 4 "Smart Fan III" mode
|
||||||
|
|
||||||
|
pwm[1-4]_mode - controls if output is PWM or DC level
|
||||||
|
* 0 DC output (0 - 12v)
|
||||||
|
* 1 PWM output
|
||||||
|
|
||||||
Thermal Cruise mode
|
Thermal Cruise mode
|
||||||
-------------------
|
-------------------
|
||||||
|
@@ -44,7 +44,7 @@ static struct i2c_driver foo_driver = {
|
|||||||
/* if device autodetection is needed: */
|
/* if device autodetection is needed: */
|
||||||
.class = I2C_CLASS_SOMETHING,
|
.class = I2C_CLASS_SOMETHING,
|
||||||
.detect = foo_detect,
|
.detect = foo_detect,
|
||||||
.address_data = &addr_data,
|
.address_list = normal_i2c,
|
||||||
|
|
||||||
.shutdown = foo_shutdown, /* optional */
|
.shutdown = foo_shutdown, /* optional */
|
||||||
.suspend = foo_suspend, /* optional */
|
.suspend = foo_suspend, /* optional */
|
||||||
|
@@ -36,11 +36,11 @@ Datagram vs Connected modes
|
|||||||
fabric with a 2K MTU, the IPoIB MTU will be 2048 - 4 = 2044 bytes.
|
fabric with a 2K MTU, the IPoIB MTU will be 2048 - 4 = 2044 bytes.
|
||||||
|
|
||||||
In connected mode, the IB RC (Reliable Connected) transport is used.
|
In connected mode, the IB RC (Reliable Connected) transport is used.
|
||||||
Connected mode is to takes advantage of the connected nature of the
|
Connected mode takes advantage of the connected nature of the IB
|
||||||
IB transport and allows an MTU up to the maximal IP packet size of
|
transport and allows an MTU up to the maximal IP packet size of 64K,
|
||||||
64K, which reduces the number of IP packets needed for handling
|
which reduces the number of IP packets needed for handling large UDP
|
||||||
large UDP datagrams, TCP segments, etc and increases the performance
|
datagrams, TCP segments, etc and increases the performance for large
|
||||||
for large messages.
|
messages.
|
||||||
|
|
||||||
In connected mode, the interface's UD QP is still used for multicast
|
In connected mode, the interface's UD QP is still used for multicast
|
||||||
and communication with peers that don't support connected mode. In
|
and communication with peers that don't support connected mode. In
|
||||||
|
@@ -68,22 +68,38 @@ GigaSet 307x Device Driver
|
|||||||
for troubleshooting or to pass module parameters.
|
for troubleshooting or to pass module parameters.
|
||||||
|
|
||||||
The module ser_gigaset provides a serial line discipline N_GIGASET_M101
|
The module ser_gigaset provides a serial line discipline N_GIGASET_M101
|
||||||
which drives the device through the regular serial line driver. It must
|
which uses the regular serial port driver to access the device, and must
|
||||||
be attached to the serial line to which the M101 is connected with the
|
therefore be attached to the serial device to which the M101 is connected.
|
||||||
ldattach(8) command (requires util-linux-ng release 2.14 or later), for
|
The ldattach(8) command (included in util-linux-ng release 2.14 or later)
|
||||||
example:
|
can be used for that purpose, for example:
|
||||||
ldattach GIGASET_M101 /dev/ttyS1
|
ldattach GIGASET_M101 /dev/ttyS1
|
||||||
This will open the device file, attach the line discipline to it, and
|
This will open the device file, attach the line discipline to it, and
|
||||||
then sleep in the background, keeping the device open so that the line
|
then sleep in the background, keeping the device open so that the line
|
||||||
discipline remains active. To deactivate it, kill the daemon, for example
|
discipline remains active. To deactivate it, kill the daemon, for example
|
||||||
with
|
with
|
||||||
killall ldattach
|
killall ldattach
|
||||||
before disconnecting the device. To have this happen automatically at
|
before disconnecting the device. To have this happen automatically at
|
||||||
system startup/shutdown on an LSB compatible system, create and activate
|
system startup/shutdown on an LSB compatible system, create and activate
|
||||||
an appropriate LSB startup script /etc/init.d/gigaset. (The init name
|
an appropriate LSB startup script /etc/init.d/gigaset. (The init name
|
||||||
'gigaset' is officially assigned to this project by LANANA.)
|
'gigaset' is officially assigned to this project by LANANA.)
|
||||||
Alternatively, just add the 'ldattach' command line to /etc/rc.local.
|
Alternatively, just add the 'ldattach' command line to /etc/rc.local.
|
||||||
|
|
||||||
|
The modules accept the following parameters:
|
||||||
|
|
||||||
|
Module Parameter Meaning
|
||||||
|
|
||||||
|
gigaset debug debug level (see section 3.2.)
|
||||||
|
|
||||||
|
startmode initial operation mode (see section 2.5.):
|
||||||
|
bas_gigaset ) 1=ISDN4linux/CAPI (default), 0=Unimodem
|
||||||
|
ser_gigaset )
|
||||||
|
usb_gigaset ) cidmode initial Call-ID mode setting (see section
|
||||||
|
2.5.): 1=on (default), 0=off
|
||||||
|
|
||||||
|
Depending on your distribution you may want to create a separate module
|
||||||
|
configuration file /etc/modprobe.d/gigaset for these, or add them to a
|
||||||
|
custom file like /etc/modprobe.conf.local.
|
||||||
|
|
||||||
2.2. Device nodes for user space programs
|
2.2. Device nodes for user space programs
|
||||||
------------------------------------
|
------------------------------------
|
||||||
The device can be accessed from user space (eg. by the user space tools
|
The device can be accessed from user space (eg. by the user space tools
|
||||||
@@ -93,11 +109,48 @@ GigaSet 307x Device Driver
|
|||||||
- /dev/ttyGU0 for M105 (USB data boxes)
|
- /dev/ttyGU0 for M105 (USB data boxes)
|
||||||
- /dev/ttyGB0 for the base driver (direct USB connection)
|
- /dev/ttyGB0 for the base driver (direct USB connection)
|
||||||
|
|
||||||
You can also select a "default device" which is used by the frontends when
|
If you connect more than one device of a type, they will get consecutive
|
||||||
|
device nodes, eg. /dev/ttyGU1 for a second M105.
|
||||||
|
|
||||||
|
You can also set a "default device" for the user space tools to use when
|
||||||
no device node is given as parameter, by creating a symlink /dev/ttyG to
|
no device node is given as parameter, by creating a symlink /dev/ttyG to
|
||||||
one of them, eg.:
|
one of them, eg.:
|
||||||
|
|
||||||
ln -s /dev/ttyGB0 /dev/ttyG
|
ln -s /dev/ttyGB0 /dev/ttyG
|
||||||
|
|
||||||
|
The devices accept the following device specific ioctl calls
|
||||||
|
(defined in gigaset_dev.h):
|
||||||
|
|
||||||
|
ioctl(int fd, GIGASET_REDIR, int *cmd);
|
||||||
|
If cmd==1, the device is set to be controlled exclusively through the
|
||||||
|
character device node; access from the ISDN subsystem is blocked.
|
||||||
|
If cmd==0, the device is set to be used from the ISDN subsystem and does
|
||||||
|
not communicate through the character device node.
|
||||||
|
|
||||||
|
ioctl(int fd, GIGASET_CONFIG, int *cmd);
|
||||||
|
(ser_gigaset and usb_gigaset only)
|
||||||
|
If cmd==1, the device is set to adapter configuration mode where commands
|
||||||
|
are interpreted by the M10x DECT adapter itself instead of being
|
||||||
|
forwarded to the base station. In this mode, the device accepts the
|
||||||
|
commands described in Siemens document "AT-Kommando Alignment M10x Data"
|
||||||
|
for setting the operation mode, associating with a base station and
|
||||||
|
querying parameters like field strengh and signal quality.
|
||||||
|
Note that there is no ioctl command for leaving adapter configuration
|
||||||
|
mode and returning to regular operation. In order to leave adapter
|
||||||
|
configuration mode, write the command ATO to the device.
|
||||||
|
|
||||||
|
ioctl(int fd, GIGASET_BRKCHARS, unsigned char brkchars[6]);
|
||||||
|
(usb_gigaset only)
|
||||||
|
Set the break characters on an M105's internal serial adapter to the six
|
||||||
|
bytes stored in brkchars[]. Unused bytes should be set to zero.
|
||||||
|
|
||||||
|
ioctl(int fd, GIGASET_VERSION, unsigned version[4]);
|
||||||
|
Retrieve version information from the driver. version[0] must be set to
|
||||||
|
one of:
|
||||||
|
- GIGVER_DRIVER: retrieve driver version
|
||||||
|
- GIGVER_COMPAT: retrieve interface compatibility version
|
||||||
|
- GIGVER_FWBASE: retrieve the firmware version of the base
|
||||||
|
Upon return, version[] is filled with the requested version information.
|
||||||
|
|
||||||
2.3. ISDN4linux
|
2.3. ISDN4linux
|
||||||
----------
|
----------
|
||||||
@@ -113,15 +166,24 @@ GigaSet 307x Device Driver
|
|||||||
Connection State: 0, Response: -1
|
Connection State: 0, Response: -1
|
||||||
gigaset_process_response: resp_code -1 in ConState 0 !
|
gigaset_process_response: resp_code -1 in ConState 0 !
|
||||||
Timeout occurred
|
Timeout occurred
|
||||||
you might need to use unimodem mode. (see section 2.5.)
|
you probably need to use unimodem mode. (see section 2.5.)
|
||||||
|
|
||||||
2.4. CAPI
|
2.4. CAPI
|
||||||
----
|
----
|
||||||
If the driver is compiled with CAPI support (kernel configuration option
|
If the driver is compiled with CAPI support (kernel configuration option
|
||||||
GIGASET_CAPI, experimental) it can also be used with CAPI 2.0 kernel and
|
GIGASET_CAPI, experimental) it can also be used with CAPI 2.0 kernel and
|
||||||
user space applications. ISDN4Linux is supported in this configuration
|
user space applications. For user space access, the module capi.ko must
|
||||||
|
be loaded. The capiinit command (included in the capi4k-utils package)
|
||||||
|
does this for you.
|
||||||
|
|
||||||
|
The CAPI variant of the driver supports legacy ISDN4Linux applications
|
||||||
via the capidrv compatibility driver. The kernel module capidrv.ko must
|
via the capidrv compatibility driver. The kernel module capidrv.ko must
|
||||||
be loaded explicitly ("modprobe capidrv") if needed.
|
be loaded explicitly with the command
|
||||||
|
modprobe capidrv
|
||||||
|
if needed, and cannot be unloaded again without unloading the driver
|
||||||
|
first. (These are limitations of capidrv.)
|
||||||
|
|
||||||
|
The note about unimodem mode in the preceding section applies here, too.
|
||||||
|
|
||||||
2.5. Unimodem mode
|
2.5. Unimodem mode
|
||||||
-------------
|
-------------
|
||||||
@@ -134,9 +196,14 @@ GigaSet 307x Device Driver
|
|||||||
You can switch back using
|
You can switch back using
|
||||||
gigacontr --mode isdn
|
gigacontr --mode isdn
|
||||||
|
|
||||||
You can also load the driver using e.g.
|
You can also put the driver directly into Unimodem mode when it's loaded,
|
||||||
modprobe usb_gigaset startmode=0
|
by passing the module parameter startmode=0 to the hardware specific
|
||||||
to prevent the driver from starting in "isdn4linux mode".
|
module, e.g.
|
||||||
|
modprobe usb_gigaset startmode=0
|
||||||
|
or by adding a line like
|
||||||
|
options usb_gigaset startmode=0
|
||||||
|
to an appropriate module configuration file, like /etc/modprobe.d/gigaset
|
||||||
|
or /etc/modprobe.conf.local.
|
||||||
|
|
||||||
In this mode the device works like a modem connected to a serial port
|
In this mode the device works like a modem connected to a serial port
|
||||||
(the /dev/ttyGU0, ... mentioned above) which understands the commands
|
(the /dev/ttyGU0, ... mentioned above) which understands the commands
|
||||||
@@ -164,9 +231,8 @@ GigaSet 307x Device Driver
|
|||||||
|
|
||||||
options ppp_async flag_time=0
|
options ppp_async flag_time=0
|
||||||
|
|
||||||
to /etc/modprobe.conf. If your distribution has some local module
|
to an appropriate module configuration file, like /etc/modprobe.d/gigaset
|
||||||
configuration file like /etc/modprobe.conf.local,
|
or /etc/modprobe.conf.local.
|
||||||
using that should be preferred.
|
|
||||||
|
|
||||||
2.6. Call-ID (CID) mode
|
2.6. Call-ID (CID) mode
|
||||||
------------------
|
------------------
|
||||||
@@ -189,12 +255,13 @@ GigaSet 307x Device Driver
|
|||||||
settings (CID mode).
|
settings (CID mode).
|
||||||
- If you have several DECT data devices (M10x) which you want to use
|
- If you have several DECT data devices (M10x) which you want to use
|
||||||
in turn, select Unimodem mode by passing the parameter "cidmode=0" to
|
in turn, select Unimodem mode by passing the parameter "cidmode=0" to
|
||||||
the driver ("modprobe usb_gigaset cidmode=0" or modprobe.conf).
|
the appropriate driver module (ser_gigaset or usb_gigaset).
|
||||||
|
|
||||||
If you want both of these at once, you are out of luck.
|
If you want both of these at once, you are out of luck.
|
||||||
|
|
||||||
You can also use /sys/class/tty/ttyGxy/cidmode for changing the CID mode
|
You can also use the tty class parameter "cidmode" of the device to
|
||||||
setting (ttyGxy is ttyGU0 or ttyGB0).
|
change its CID mode while the driver is loaded, eg.
|
||||||
|
echo 0 > /sys/class/tty/ttyGU0/cidmode
|
||||||
|
|
||||||
2.7. Unregistered Wireless Devices (M101/M105)
|
2.7. Unregistered Wireless Devices (M101/M105)
|
||||||
-----------------------------------------
|
-----------------------------------------
|
||||||
@@ -208,7 +275,7 @@ GigaSet 307x Device Driver
|
|||||||
driver. In that situation, a restricted set of functions is available
|
driver. In that situation, a restricted set of functions is available
|
||||||
which includes, in particular, those necessary for registering the device
|
which includes, in particular, those necessary for registering the device
|
||||||
to a base or for switching it between Fixed Part and Portable Part
|
to a base or for switching it between Fixed Part and Portable Part
|
||||||
modes.
|
modes. See the gigacontr(8) manpage for details.
|
||||||
|
|
||||||
3. Troubleshooting
|
3. Troubleshooting
|
||||||
---------------
|
---------------
|
||||||
@@ -222,9 +289,7 @@ GigaSet 307x Device Driver
|
|||||||
|
|
||||||
options isdn dialtimeout=15
|
options isdn dialtimeout=15
|
||||||
|
|
||||||
to /etc/modprobe.conf. If your distribution has some local module
|
to /etc/modprobe.d/gigaset, /etc/modprobe.conf.local or a similar file.
|
||||||
configuration file like /etc/modprobe.conf.local,
|
|
||||||
using that should be preferred.
|
|
||||||
|
|
||||||
Problem:
|
Problem:
|
||||||
Your isdn script aborts with a message about isdnlog.
|
Your isdn script aborts with a message about isdnlog.
|
||||||
@@ -264,7 +329,8 @@ GigaSet 307x Device Driver
|
|||||||
The initial value can be set using the debug parameter when loading the
|
The initial value can be set using the debug parameter when loading the
|
||||||
module "gigaset", e.g. by adding a line
|
module "gigaset", e.g. by adding a line
|
||||||
options gigaset debug=0
|
options gigaset debug=0
|
||||||
to /etc/modprobe.conf, ...
|
to your module configuration file, eg. /etc/modprobe.d/gigaset or
|
||||||
|
/etc/modprobe.conf.local.
|
||||||
|
|
||||||
Generated debugging information can be found
|
Generated debugging information can be found
|
||||||
- as output of the command
|
- as output of the command
|
||||||
|
@@ -1,3 +1,17 @@
|
|||||||
|
Output files
|
||||||
|
|
||||||
|
modules.order
|
||||||
|
--------------------------------------------------
|
||||||
|
This file records the order in which modules appear in Makefiles. This
|
||||||
|
is used by modprobe to deterministically resolve aliases that match
|
||||||
|
multiple modules.
|
||||||
|
|
||||||
|
modules.builtin
|
||||||
|
--------------------------------------------------
|
||||||
|
This file lists all modules that are built into the kernel. This is used
|
||||||
|
by modprobe to not fail when trying to load something builtin.
|
||||||
|
|
||||||
|
|
||||||
Environment variables
|
Environment variables
|
||||||
|
|
||||||
KCPPFLAGS
|
KCPPFLAGS
|
||||||
|
@@ -103,10 +103,16 @@ KCONFIG_AUTOCONFIG
|
|||||||
This environment variable can be set to specify the path & name of the
|
This environment variable can be set to specify the path & name of the
|
||||||
"auto.conf" file. Its default value is "include/config/auto.conf".
|
"auto.conf" file. Its default value is "include/config/auto.conf".
|
||||||
|
|
||||||
|
KCONFIG_TRISTATE
|
||||||
|
--------------------------------------------------
|
||||||
|
This environment variable can be set to specify the path & name of the
|
||||||
|
"tristate.conf" file. Its default value is "include/config/tristate.conf".
|
||||||
|
|
||||||
KCONFIG_AUTOHEADER
|
KCONFIG_AUTOHEADER
|
||||||
--------------------------------------------------
|
--------------------------------------------------
|
||||||
This environment variable can be set to specify the path & name of the
|
This environment variable can be set to specify the path & name of the
|
||||||
"autoconf.h" (header) file. Its default value is "include/linux/autoconf.h".
|
"autoconf.h" (header) file.
|
||||||
|
Its default value is "include/generated/autoconf.h".
|
||||||
|
|
||||||
|
|
||||||
======================================================================
|
======================================================================
|
||||||
|
@@ -1032,7 +1032,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||||||
No delay
|
No delay
|
||||||
|
|
||||||
ip= [IP_PNP]
|
ip= [IP_PNP]
|
||||||
See Documentation/filesystems/nfsroot.txt.
|
See Documentation/filesystems/nfs/nfsroot.txt.
|
||||||
|
|
||||||
ip2= [HW] Set IO/IRQ pairs for up to 4 IntelliPort boards
|
ip2= [HW] Set IO/IRQ pairs for up to 4 IntelliPort boards
|
||||||
See comment before ip2_setup() in
|
See comment before ip2_setup() in
|
||||||
@@ -1553,10 +1553,10 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||||||
going to be removed in 2.6.29.
|
going to be removed in 2.6.29.
|
||||||
|
|
||||||
nfsaddrs= [NFS]
|
nfsaddrs= [NFS]
|
||||||
See Documentation/filesystems/nfsroot.txt.
|
See Documentation/filesystems/nfs/nfsroot.txt.
|
||||||
|
|
||||||
nfsroot= [NFS] nfs root filesystem for disk-less boxes.
|
nfsroot= [NFS] nfs root filesystem for disk-less boxes.
|
||||||
See Documentation/filesystems/nfsroot.txt.
|
See Documentation/filesystems/nfs/nfsroot.txt.
|
||||||
|
|
||||||
nfs.callback_tcpport=
|
nfs.callback_tcpport=
|
||||||
[NFS] set the TCP port on which the NFSv4 callback
|
[NFS] set the TCP port on which the NFSv4 callback
|
||||||
@@ -1787,6 +1787,11 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||||||
waiting for the ACK, so if this is set too high
|
waiting for the ACK, so if this is set too high
|
||||||
interrupts *may* be lost!
|
interrupts *may* be lost!
|
||||||
|
|
||||||
|
omap_mux= [OMAP] Override bootloader pin multiplexing.
|
||||||
|
Format: <mux_mode0.mode_name=value>...
|
||||||
|
For example, to override I2C bus2:
|
||||||
|
omap_mux=i2c2_scl.i2c2_scl=0x100,i2c2_sda.i2c2_sda=0x100
|
||||||
|
|
||||||
opl3= [HW,OSS]
|
opl3= [HW,OSS]
|
||||||
Format: <io>
|
Format: <io>
|
||||||
|
|
||||||
@@ -2663,6 +2668,8 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||||||
to a common usb-storage quirk flag as follows:
|
to a common usb-storage quirk flag as follows:
|
||||||
a = SANE_SENSE (collect more than 18 bytes
|
a = SANE_SENSE (collect more than 18 bytes
|
||||||
of sense data);
|
of sense data);
|
||||||
|
b = BAD_SENSE (don't collect more than 18
|
||||||
|
bytes of sense data);
|
||||||
c = FIX_CAPACITY (decrease the reported
|
c = FIX_CAPACITY (decrease the reported
|
||||||
device capacity by one sector);
|
device capacity by one sector);
|
||||||
h = CAPACITY_HEURISTICS (decrease the
|
h = CAPACITY_HEURISTICS (decrease the
|
||||||
@@ -2722,6 +2729,11 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||||||
vmpoff= [KNL,S390] Perform z/VM CP command after power off.
|
vmpoff= [KNL,S390] Perform z/VM CP command after power off.
|
||||||
Format: <command>
|
Format: <command>
|
||||||
|
|
||||||
|
vt.cur_default= [VT] Default cursor shape.
|
||||||
|
Format: 0xCCBBAA, where AA, BB, and CC are the same as
|
||||||
|
the parameters of the <Esc>[?A;B;Cc escape sequence;
|
||||||
|
see VGA-softcursor.txt. Default: 2 = underline.
|
||||||
|
|
||||||
vt.default_blu= [VT]
|
vt.default_blu= [VT]
|
||||||
Format: <blue0>,<blue1>,<blue2>,...,<blue15>
|
Format: <blue0>,<blue1>,<blue2>,...,<blue15>
|
||||||
Change the default blue palette of the console.
|
Change the default blue palette of the console.
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
ThinkPad ACPI Extras Driver
|
ThinkPad ACPI Extras Driver
|
||||||
|
|
||||||
Version 0.23
|
Version 0.24
|
||||||
April 10th, 2009
|
December 11th, 2009
|
||||||
|
|
||||||
Borislav Deianov <borislav@users.sf.net>
|
Borislav Deianov <borislav@users.sf.net>
|
||||||
Henrique de Moraes Holschuh <hmh@hmh.eng.br>
|
Henrique de Moraes Holschuh <hmh@hmh.eng.br>
|
||||||
@@ -460,6 +460,8 @@ event code Key Notes
|
|||||||
For Lenovo ThinkPads with a new
|
For Lenovo ThinkPads with a new
|
||||||
BIOS, it has to be handled either
|
BIOS, it has to be handled either
|
||||||
by the ACPI OSI, or by userspace.
|
by the ACPI OSI, or by userspace.
|
||||||
|
The driver does the right thing,
|
||||||
|
never mess with this.
|
||||||
0x1011 0x10 FN+END Brightness down. See brightness
|
0x1011 0x10 FN+END Brightness down. See brightness
|
||||||
up for details.
|
up for details.
|
||||||
|
|
||||||
@@ -582,46 +584,15 @@ with hotkey_report_mode.
|
|||||||
|
|
||||||
Brightness hotkey notes:
|
Brightness hotkey notes:
|
||||||
|
|
||||||
These are the current sane choices for brightness key mapping in
|
Don't mess with the brightness hotkeys in a Thinkpad. If you want
|
||||||
thinkpad-acpi:
|
notifications for OSD, use the sysfs backlight class event support.
|
||||||
|
|
||||||
For IBM and Lenovo models *without* ACPI backlight control (the ones on
|
The driver will issue KEY_BRIGHTNESS_UP and KEY_BRIGHTNESS_DOWN events
|
||||||
which thinkpad-acpi will autoload its backlight interface by default,
|
automatically for the cases were userspace has to do something to
|
||||||
and on which ACPI video does not export a backlight interface):
|
implement brightness changes. When you override these events, you will
|
||||||
|
either fail to handle properly the ThinkPads that require explicit
|
||||||
1. Don't enable or map the brightness hotkeys in thinkpad-acpi, as
|
action to change backlight brightness, or the ThinkPads that require
|
||||||
these older firmware versions unfortunately won't respect the hotkey
|
that no action be taken to work properly.
|
||||||
mask for brightness keys anyway, and always reacts to them. This
|
|
||||||
usually work fine, unless X.org drivers are doing something to block
|
|
||||||
the BIOS. In that case, use (3) below. This is the default mode of
|
|
||||||
operation.
|
|
||||||
|
|
||||||
2. Enable the hotkeys, but map them to something else that is NOT
|
|
||||||
KEY_BRIGHTNESS_UP/DOWN or any other keycode that would cause
|
|
||||||
userspace to try to change the backlight level, and use that as an
|
|
||||||
on-screen-display hint.
|
|
||||||
|
|
||||||
3. IF AND ONLY IF X.org drivers find a way to block the firmware from
|
|
||||||
automatically changing the brightness, enable the hotkeys and map
|
|
||||||
them to KEY_BRIGHTNESS_UP and KEY_BRIGHTNESS_DOWN, and feed that to
|
|
||||||
something that calls xbacklight. thinkpad-acpi will not be able to
|
|
||||||
change brightness in that case either, so you should disable its
|
|
||||||
backlight interface.
|
|
||||||
|
|
||||||
For Lenovo models *with* ACPI backlight control:
|
|
||||||
|
|
||||||
1. Load up ACPI video and use that. ACPI video will report ACPI
|
|
||||||
events for brightness change keys. Do not mess with thinkpad-acpi
|
|
||||||
defaults in this case. thinkpad-acpi should not have anything to do
|
|
||||||
with backlight events in a scenario where ACPI video is loaded:
|
|
||||||
brightness hotkeys must be disabled, and the backlight interface is
|
|
||||||
to be kept disabled as well. This is the default mode of operation.
|
|
||||||
|
|
||||||
2. Do *NOT* load up ACPI video, enable the hotkeys in thinkpad-acpi,
|
|
||||||
and map them to KEY_BRIGHTNESS_UP and KEY_BRIGHTNESS_DOWN. Process
|
|
||||||
these keys on userspace somehow (e.g. by calling xbacklight).
|
|
||||||
The driver will do this automatically if it detects that ACPI video
|
|
||||||
has been disabled.
|
|
||||||
|
|
||||||
|
|
||||||
Bluetooth
|
Bluetooth
|
||||||
@@ -1121,25 +1092,61 @@ WARNING:
|
|||||||
its level up and down at every change.
|
its level up and down at every change.
|
||||||
|
|
||||||
|
|
||||||
Volume control -- /proc/acpi/ibm/volume
|
Volume control
|
||||||
---------------------------------------
|
--------------
|
||||||
|
|
||||||
This feature allows volume control on ThinkPad models which don't have
|
procfs: /proc/acpi/ibm/volume
|
||||||
a hardware volume knob. The available commands are:
|
ALSA: "ThinkPad Console Audio Control", default ID: "ThinkPadEC"
|
||||||
|
|
||||||
|
NOTE: by default, the volume control interface operates in read-only
|
||||||
|
mode, as it is supposed to be used for on-screen-display purposes.
|
||||||
|
The read/write mode can be enabled through the use of the
|
||||||
|
"volume_control=1" module parameter.
|
||||||
|
|
||||||
|
NOTE: distros are urged to not enable volume_control by default, this
|
||||||
|
should be done by the local admin only. The ThinkPad UI is for the
|
||||||
|
console audio control to be done through the volume keys only, and for
|
||||||
|
the desktop environment to just provide on-screen-display feedback.
|
||||||
|
Software volume control should be done only in the main AC97/HDA
|
||||||
|
mixer.
|
||||||
|
|
||||||
|
This feature allows volume control on ThinkPad models with a digital
|
||||||
|
volume knob (when available, not all models have it), as well as
|
||||||
|
mute/unmute control. The available commands are:
|
||||||
|
|
||||||
echo up >/proc/acpi/ibm/volume
|
echo up >/proc/acpi/ibm/volume
|
||||||
echo down >/proc/acpi/ibm/volume
|
echo down >/proc/acpi/ibm/volume
|
||||||
echo mute >/proc/acpi/ibm/volume
|
echo mute >/proc/acpi/ibm/volume
|
||||||
|
echo unmute >/proc/acpi/ibm/volume
|
||||||
echo 'level <level>' >/proc/acpi/ibm/volume
|
echo 'level <level>' >/proc/acpi/ibm/volume
|
||||||
|
|
||||||
The <level> number range is 0 to 15 although not all of them may be
|
The <level> number range is 0 to 14 although not all of them may be
|
||||||
distinct. The unmute the volume after the mute command, use either the
|
distinct. The unmute the volume after the mute command, use either the
|
||||||
up or down command (the level command will not unmute the volume).
|
up or down command (the level command will not unmute the volume), or
|
||||||
|
the unmute command.
|
||||||
|
|
||||||
The current volume level and mute state is shown in the file.
|
The current volume level and mute state is shown in the file.
|
||||||
|
|
||||||
The ALSA mixer interface to this feature is still missing, but patches
|
You can use the volume_capabilities parameter to tell the driver
|
||||||
to add it exist. That problem should be addressed in the not so
|
whether your thinkpad has volume control or mute-only control:
|
||||||
distant future.
|
volume_capabilities=1 for mixers with mute and volume control,
|
||||||
|
volume_capabilities=2 for mixers with only mute control.
|
||||||
|
|
||||||
|
If the driver misdetects the capabilities for your ThinkPad model,
|
||||||
|
please report this to ibm-acpi-devel@lists.sourceforge.net, so that we
|
||||||
|
can update the driver.
|
||||||
|
|
||||||
|
There are two strategies for volume control. To select which one
|
||||||
|
should be used, use the volume_mode module parameter: volume_mode=1
|
||||||
|
selects EC mode, and volume_mode=3 selects EC mode with NVRAM backing
|
||||||
|
(so that volume/mute changes are remembered across shutdown/reboot).
|
||||||
|
|
||||||
|
The driver will operate in volume_mode=3 by default. If that does not
|
||||||
|
work well on your ThinkPad model, please report this to
|
||||||
|
ibm-acpi-devel@lists.sourceforge.net.
|
||||||
|
|
||||||
|
The driver supports the standard ALSA module parameters. If the ALSA
|
||||||
|
mixer is disabled, the driver will disable all volume functionality.
|
||||||
|
|
||||||
|
|
||||||
Fan control and monitoring: fan speed, fan enable/disable
|
Fan control and monitoring: fan speed, fan enable/disable
|
||||||
@@ -1405,6 +1412,7 @@ to enable more than one output class, just add their values.
|
|||||||
0x0008 HKEY event interface, hotkeys
|
0x0008 HKEY event interface, hotkeys
|
||||||
0x0010 Fan control
|
0x0010 Fan control
|
||||||
0x0020 Backlight brightness
|
0x0020 Backlight brightness
|
||||||
|
0x0040 Audio mixer/volume control
|
||||||
|
|
||||||
There is also a kernel build option to enable more debugging
|
There is also a kernel build option to enable more debugging
|
||||||
information, which may be necessary to debug driver problems.
|
information, which may be necessary to debug driver problems.
|
||||||
@@ -1465,3 +1473,9 @@ Sysfs interface changelog:
|
|||||||
and it is always able to disable hot keys. Very old
|
and it is always able to disable hot keys. Very old
|
||||||
thinkpads are properly supported. hotkey_bios_mask
|
thinkpads are properly supported. hotkey_bios_mask
|
||||||
is deprecated and marked for removal.
|
is deprecated and marked for removal.
|
||||||
|
|
||||||
|
0x020600: Marker for backlight change event support.
|
||||||
|
|
||||||
|
0x020700: Support for mute-only mixers.
|
||||||
|
Volume control in read-only mode by default.
|
||||||
|
Marker for ALSA mixer support.
|
||||||
|
@@ -62,8 +62,20 @@ applicable).
|
|||||||
It also tracks 4 contention points per class. A contention point is a call site
|
It also tracks 4 contention points per class. A contention point is a call site
|
||||||
that had to wait on lock acquisition.
|
that had to wait on lock acquisition.
|
||||||
|
|
||||||
|
- CONFIGURATION
|
||||||
|
|
||||||
|
Lock statistics are enabled via CONFIG_LOCK_STATS.
|
||||||
|
|
||||||
- USAGE
|
- USAGE
|
||||||
|
|
||||||
|
Enable collection of statistics:
|
||||||
|
|
||||||
|
# echo 1 >/proc/sys/kernel/lock_stat
|
||||||
|
|
||||||
|
Disable collection of statistics:
|
||||||
|
|
||||||
|
# echo 0 >/proc/sys/kernel/lock_stat
|
||||||
|
|
||||||
Look at the current lock statistics:
|
Look at the current lock statistics:
|
||||||
|
|
||||||
( line numbers not part of actual output, done for clarity in the explanation
|
( line numbers not part of actual output, done for clarity in the explanation
|
||||||
|
@@ -233,9 +233,9 @@ All md devices contain:
|
|||||||
|
|
||||||
resync_start
|
resync_start
|
||||||
The point at which resync should start. If no resync is needed,
|
The point at which resync should start. If no resync is needed,
|
||||||
this will be a very large number. At array creation it will
|
this will be a very large number (or 'none' since 2.6.30-rc1). At
|
||||||
default to 0, though starting the array as 'clean' will
|
array creation it will default to 0, though starting the array as
|
||||||
set it much larger.
|
'clean' will set it much larger.
|
||||||
|
|
||||||
new_dev
|
new_dev
|
||||||
This file can be written but not read. The value written should
|
This file can be written but not read. The value written should
|
||||||
@@ -296,6 +296,51 @@ All md devices contain:
|
|||||||
active-idle
|
active-idle
|
||||||
like active, but no writes have been seen for a while (safe_mode_delay).
|
like active, but no writes have been seen for a while (safe_mode_delay).
|
||||||
|
|
||||||
|
bitmap/location
|
||||||
|
This indicates where the write-intent bitmap for the array is
|
||||||
|
stored.
|
||||||
|
It can be one of "none", "file" or "[+-]N".
|
||||||
|
"file" may later be extended to "file:/file/name"
|
||||||
|
"[+-]N" means that many sectors from the start of the metadata.
|
||||||
|
This is replicated on all devices. For arrays with externally
|
||||||
|
managed metadata, the offset is from the beginning of the
|
||||||
|
device.
|
||||||
|
bitmap/chunksize
|
||||||
|
The size, in bytes, of the chunk which will be represented by a
|
||||||
|
single bit. For RAID456, it is a portion of an individual
|
||||||
|
device. For RAID10, it is a portion of the array. For RAID1, it
|
||||||
|
is both (they come to the same thing).
|
||||||
|
bitmap/time_base
|
||||||
|
The time, in seconds, between looking for bits in the bitmap to
|
||||||
|
be cleared. In the current implementation, a bit will be cleared
|
||||||
|
between 2 and 3 times "time_base" after all the covered blocks
|
||||||
|
are known to be in-sync.
|
||||||
|
bitmap/backlog
|
||||||
|
When write-mostly devices are active in a RAID1, write requests
|
||||||
|
to those devices proceed in the background - the filesystem (or
|
||||||
|
other user of the device) does not have to wait for them.
|
||||||
|
'backlog' sets a limit on the number of concurrent background
|
||||||
|
writes. If there are more than this, new writes will by
|
||||||
|
synchronous.
|
||||||
|
bitmap/metadata
|
||||||
|
This can be either 'internal' or 'external'.
|
||||||
|
'internal' is the default and means the metadata for the bitmap
|
||||||
|
is stored in the first 256 bytes of the allocated space and is
|
||||||
|
managed by the md module.
|
||||||
|
'external' means that bitmap metadata is managed externally to
|
||||||
|
the kernel (i.e. by some userspace program)
|
||||||
|
bitmap/can_clear
|
||||||
|
This is either 'true' or 'false'. If 'true', then bits in the
|
||||||
|
bitmap will be cleared when the corresponding blocks are thought
|
||||||
|
to be in-sync. If 'false', bits will never be cleared.
|
||||||
|
This is automatically set to 'false' if a write happens on a
|
||||||
|
degraded array, or if the array becomes degraded during a write.
|
||||||
|
When metadata is managed externally, it should be set to true
|
||||||
|
once the array becomes non-degraded, and this fact has been
|
||||||
|
recorded in the metadata.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
As component devices are added to an md array, they appear in the 'md'
|
As component devices are added to an md array, they appear in the 'md'
|
||||||
directory as new directories named
|
directory as new directories named
|
||||||
@@ -334,8 +379,9 @@ Each directory contains:
|
|||||||
Writing "writemostly" sets the writemostly flag.
|
Writing "writemostly" sets the writemostly flag.
|
||||||
Writing "-writemostly" clears the writemostly flag.
|
Writing "-writemostly" clears the writemostly flag.
|
||||||
Writing "blocked" sets the "blocked" flag.
|
Writing "blocked" sets the "blocked" flag.
|
||||||
Writing "-blocked" clear the "blocked" flag and allows writes
|
Writing "-blocked" clears the "blocked" flag and allows writes
|
||||||
to complete.
|
to complete.
|
||||||
|
Writing "in_sync" sets the in_sync flag.
|
||||||
|
|
||||||
This file responds to select/poll. Any change to 'faulty'
|
This file responds to select/poll. Any change to 'faulty'
|
||||||
or 'blocked' causes an event.
|
or 'blocked' causes an event.
|
||||||
@@ -372,6 +418,24 @@ Each directory contains:
|
|||||||
array. If a value less than the current component_size is
|
array. If a value less than the current component_size is
|
||||||
written, it will be rejected.
|
written, it will be rejected.
|
||||||
|
|
||||||
|
recovery_start
|
||||||
|
|
||||||
|
When the device is not 'in_sync', this records the number of
|
||||||
|
sectors from the start of the device which are known to be
|
||||||
|
correct. This is normally zero, but during a recovery
|
||||||
|
operation is will steadily increase, and if the recovery is
|
||||||
|
interrupted, restoring this value can cause recovery to
|
||||||
|
avoid repeating the earlier blocks. With v1.x metadata, this
|
||||||
|
value is saved and restored automatically.
|
||||||
|
|
||||||
|
This can be set whenever the device is not an active member of
|
||||||
|
the array, either before the array is activated, or before
|
||||||
|
the 'slot' is set.
|
||||||
|
|
||||||
|
Setting this to 'none' is equivalent to setting 'in_sync'.
|
||||||
|
Setting to any other value also clears the 'in_sync' flag.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
An active md device will also contain and entry for each active device
|
An active md device will also contain and entry for each active device
|
||||||
in the array. These are named
|
in the array. These are named
|
||||||
|
@@ -160,12 +160,15 @@ Under each section, you can see 4 files.
|
|||||||
NOTE:
|
NOTE:
|
||||||
These directories/files appear after physical memory hotplug phase.
|
These directories/files appear after physical memory hotplug phase.
|
||||||
|
|
||||||
If CONFIG_NUMA is enabled the
|
If CONFIG_NUMA is enabled the memoryXXX/ directories can also be accessed
|
||||||
/sys/devices/system/memory/memoryXXX memory section
|
via symbolic links located in the /sys/devices/system/node/node* directories.
|
||||||
directories can also be accessed via symbolic links located in
|
|
||||||
the /sys/devices/system/node/node* directories. For example:
|
For example:
|
||||||
/sys/devices/system/node/node0/memory9 -> ../../memory/memory9
|
/sys/devices/system/node/node0/memory9 -> ../../memory/memory9
|
||||||
|
|
||||||
|
A backlink will also be created:
|
||||||
|
/sys/devices/system/memory/memory9/node0 -> ../../node/node0
|
||||||
|
|
||||||
--------------------------------
|
--------------------------------
|
||||||
4. Physical memory hot-add phase
|
4. Physical memory hot-add phase
|
||||||
--------------------------------
|
--------------------------------
|
||||||
|
57
Documentation/misc-devices/ad525x_dpot.txt
Normal file
57
Documentation/misc-devices/ad525x_dpot.txt
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
---------------------------------
|
||||||
|
AD525x Digital Potentiometers
|
||||||
|
---------------------------------
|
||||||
|
|
||||||
|
The ad525x_dpot driver exports a simple sysfs interface. This allows you to
|
||||||
|
work with the immediate resistance settings as well as update the saved startup
|
||||||
|
settings. Access to the factory programmed tolerance is also provided, but
|
||||||
|
interpretation of this settings is required by the end application according to
|
||||||
|
the specific part in use.
|
||||||
|
|
||||||
|
---------
|
||||||
|
Files
|
||||||
|
---------
|
||||||
|
|
||||||
|
Each dpot device will have a set of eeprom, rdac, and tolerance files. How
|
||||||
|
many depends on the actual part you have, as will the range of allowed values.
|
||||||
|
|
||||||
|
The eeprom files are used to program the startup value of the device.
|
||||||
|
|
||||||
|
The rdac files are used to program the immediate value of the device.
|
||||||
|
|
||||||
|
The tolerance files are the read-only factory programmed tolerance settings
|
||||||
|
and may vary greatly on a part-by-part basis. For exact interpretation of
|
||||||
|
this field, please consult the datasheet for your part. This is presented
|
||||||
|
as a hex file for easier parsing.
|
||||||
|
|
||||||
|
-----------
|
||||||
|
Example
|
||||||
|
-----------
|
||||||
|
|
||||||
|
Locate the device in your sysfs tree. This is probably easiest by going into
|
||||||
|
the common i2c directory and locating the device by the i2c slave address.
|
||||||
|
|
||||||
|
# ls /sys/bus/i2c/devices/
|
||||||
|
0-0022 0-0027 0-002f
|
||||||
|
|
||||||
|
So assuming the device in question is on the first i2c bus and has the slave
|
||||||
|
address of 0x2f, we descend (unrelated sysfs entries have been trimmed).
|
||||||
|
|
||||||
|
# ls /sys/bus/i2c/devices/0-002f/
|
||||||
|
eeprom0 rdac0 tolerance0
|
||||||
|
|
||||||
|
You can use simple reads/writes to access these files:
|
||||||
|
|
||||||
|
# cd /sys/bus/i2c/devices/0-002f/
|
||||||
|
|
||||||
|
# cat eeprom0
|
||||||
|
0
|
||||||
|
# echo 10 > eeprom0
|
||||||
|
# cat eeprom0
|
||||||
|
10
|
||||||
|
|
||||||
|
# cat rdac0
|
||||||
|
5
|
||||||
|
# echo 3 > rdac0
|
||||||
|
# cat rdac0
|
||||||
|
3
|
@@ -119,6 +119,32 @@ FURTHER NOTES ON NO-MMU MMAP
|
|||||||
granule but will only discard the excess if appropriately configured as
|
granule but will only discard the excess if appropriately configured as
|
||||||
this has an effect on fragmentation.
|
this has an effect on fragmentation.
|
||||||
|
|
||||||
|
(*) The memory allocated by a request for an anonymous mapping will normally
|
||||||
|
be cleared by the kernel before being returned in accordance with the
|
||||||
|
Linux man pages (ver 2.22 or later).
|
||||||
|
|
||||||
|
In the MMU case this can be achieved with reasonable performance as
|
||||||
|
regions are backed by virtual pages, with the contents only being mapped
|
||||||
|
to cleared physical pages when a write happens on that specific page
|
||||||
|
(prior to which, the pages are effectively mapped to the global zero page
|
||||||
|
from which reads can take place). This spreads out the time it takes to
|
||||||
|
initialize the contents of a page - depending on the write-usage of the
|
||||||
|
mapping.
|
||||||
|
|
||||||
|
In the no-MMU case, however, anonymous mappings are backed by physical
|
||||||
|
pages, and the entire map is cleared at allocation time. This can cause
|
||||||
|
significant delays during a userspace malloc() as the C library does an
|
||||||
|
anonymous mapping and the kernel then does a memset for the entire map.
|
||||||
|
|
||||||
|
However, for memory that isn't required to be precleared - such as that
|
||||||
|
returned by malloc() - mmap() can take a MAP_UNINITIALIZED flag to
|
||||||
|
indicate to the kernel that it shouldn't bother clearing the memory before
|
||||||
|
returning it. Note that CONFIG_MMAP_ALLOW_UNINITIALIZED must be enabled
|
||||||
|
to permit this, otherwise the flag will be ignored.
|
||||||
|
|
||||||
|
uClibc uses this to speed up malloc(), and the ELF-FDPIC binfmt uses this
|
||||||
|
to allocate the brk and stack region.
|
||||||
|
|
||||||
(*) A list of all the private copy and anonymous mappings on the system is
|
(*) A list of all the private copy and anonymous mappings on the system is
|
||||||
visible through /proc/maps in no-MMU mode.
|
visible through /proc/maps in no-MMU mode.
|
||||||
|
|
||||||
|
93
Documentation/powerpc/dts-bindings/4xx/ppc440spe-adma.txt
Normal file
93
Documentation/powerpc/dts-bindings/4xx/ppc440spe-adma.txt
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
PPC440SPe DMA/XOR (DMA Controller and XOR Accelerator)
|
||||||
|
|
||||||
|
Device nodes needed for operation of the ppc440spe-adma driver
|
||||||
|
are specified hereby. These are I2O/DMA, DMA and XOR nodes
|
||||||
|
for DMA engines and Memory Queue Module node. The latter is used
|
||||||
|
by ADMA driver for configuration of RAID-6 H/W capabilities of
|
||||||
|
the PPC440SPe. In addition to the nodes and properties described
|
||||||
|
below, the ranges property of PLB node must specify ranges for
|
||||||
|
DMA devices.
|
||||||
|
|
||||||
|
i) The I2O node
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
|
||||||
|
- compatible : "ibm,i2o-440spe";
|
||||||
|
- reg : <registers mapping>
|
||||||
|
- dcr-reg : <DCR registers range>
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
I2O: i2o@400100000 {
|
||||||
|
compatible = "ibm,i2o-440spe";
|
||||||
|
reg = <0x00000004 0x00100000 0x100>;
|
||||||
|
dcr-reg = <0x060 0x020>;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
ii) The DMA node
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
|
||||||
|
- compatible : "ibm,dma-440spe";
|
||||||
|
- cell-index : 1 cell, hardware index of the DMA engine
|
||||||
|
(typically 0x0 and 0x1 for DMA0 and DMA1)
|
||||||
|
- reg : <registers mapping>
|
||||||
|
- dcr-reg : <DCR registers range>
|
||||||
|
- interrupts : <interrupt mapping for DMA0/1 interrupts sources:
|
||||||
|
2 sources: DMAx CS FIFO Needs Service IRQ (on UIC0)
|
||||||
|
and DMA Error IRQ (on UIC1). The latter is common
|
||||||
|
for both DMA engines>.
|
||||||
|
- interrupt-parent : needed for interrupt mapping
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
DMA0: dma0@400100100 {
|
||||||
|
compatible = "ibm,dma-440spe";
|
||||||
|
cell-index = <0>;
|
||||||
|
reg = <0x00000004 0x00100100 0x100>;
|
||||||
|
dcr-reg = <0x060 0x020>;
|
||||||
|
interrupt-parent = <&DMA0>;
|
||||||
|
interrupts = <0 1>;
|
||||||
|
#interrupt-cells = <1>;
|
||||||
|
#address-cells = <0>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
interrupt-map = <
|
||||||
|
0 &UIC0 0x14 4
|
||||||
|
1 &UIC1 0x16 4>;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
iii) XOR Accelerator node
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
|
||||||
|
- compatible : "amcc,xor-accelerator";
|
||||||
|
- reg : <registers mapping>
|
||||||
|
- interrupts : <interrupt mapping for XOR interrupt source>
|
||||||
|
- interrupt-parent : for interrupt mapping
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
xor-accel@400200000 {
|
||||||
|
compatible = "amcc,xor-accelerator";
|
||||||
|
reg = <0x00000004 0x00200000 0x400>;
|
||||||
|
interrupt-parent = <&UIC1>;
|
||||||
|
interrupts = <0x1f 4>;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
iv) Memory Queue Module node
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
|
||||||
|
- compatible : "ibm,mq-440spe";
|
||||||
|
- dcr-reg : <DCR registers range>
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
MQ0: mq {
|
||||||
|
compatible = "ibm,mq-440spe";
|
||||||
|
dcr-reg = <0x040 0x020>;
|
||||||
|
};
|
||||||
|
|
@@ -20,12 +20,16 @@ Required properities:
|
|||||||
- compatible : should be "fsl,fpga-pixis".
|
- compatible : should be "fsl,fpga-pixis".
|
||||||
- reg : should contain the address and the length of the FPPGA register
|
- reg : should contain the address and the length of the FPPGA register
|
||||||
set.
|
set.
|
||||||
|
- interrupt-parent: should specify phandle for the interrupt controller.
|
||||||
|
- interrupts : should specify event (wakeup) IRQ.
|
||||||
|
|
||||||
Example (MPC8610HPCD):
|
Example (MPC8610HPCD):
|
||||||
|
|
||||||
board-control@e8000000 {
|
board-control@e8000000 {
|
||||||
compatible = "fsl,fpga-pixis";
|
compatible = "fsl,fpga-pixis";
|
||||||
reg = <0xe8000000 32>;
|
reg = <0xe8000000 32>;
|
||||||
|
interrupt-parent = <&mpic>;
|
||||||
|
interrupts = <8 8>;
|
||||||
};
|
};
|
||||||
|
|
||||||
* Freescale BCSR GPIO banks
|
* Freescale BCSR GPIO banks
|
||||||
|
@@ -103,7 +103,22 @@ fsl,mpc5200-gpt nodes
|
|||||||
---------------------
|
---------------------
|
||||||
On the mpc5200 and 5200b, GPT0 has a watchdog timer function. If the board
|
On the mpc5200 and 5200b, GPT0 has a watchdog timer function. If the board
|
||||||
design supports the internal wdt, then the device node for GPT0 should
|
design supports the internal wdt, then the device node for GPT0 should
|
||||||
include the empty property 'fsl,has-wdt'.
|
include the empty property 'fsl,has-wdt'. Note that this does not activate
|
||||||
|
the watchdog. The timer will function as a GPT if the timer api is used, and
|
||||||
|
it will function as watchdog if the watchdog device is used. The watchdog
|
||||||
|
mode has priority over the gpt mode, i.e. if the watchdog is activated, any
|
||||||
|
gpt api call to this timer will fail with -EBUSY.
|
||||||
|
|
||||||
|
If you add the property
|
||||||
|
fsl,wdt-on-boot = <n>;
|
||||||
|
GPT0 will be marked as in-use watchdog, i.e. blocking every gpt access to it.
|
||||||
|
If n>0, the watchdog is started with a timeout of n seconds. If n=0, the
|
||||||
|
configuration of the watchdog is not touched. This is useful in two cases:
|
||||||
|
- just mark GPT0 as watchdog, blocking gpt accesses, and configure it later;
|
||||||
|
- do not touch a configuration assigned by the boot loader which supervises
|
||||||
|
the boot process itself.
|
||||||
|
|
||||||
|
The watchdog will respect the CONFIG_WATCHDOG_NOWAYOUT option.
|
||||||
|
|
||||||
An mpc5200-gpt can be used as a single line GPIO controller. To do so,
|
An mpc5200-gpt can be used as a single line GPIO controller. To do so,
|
||||||
add the following properties to the gpt node:
|
add the following properties to the gpt node:
|
||||||
|
109
Documentation/powerpc/dts-bindings/nintendo/gamecube.txt
Normal file
109
Documentation/powerpc/dts-bindings/nintendo/gamecube.txt
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
|
||||||
|
Nintendo GameCube device tree
|
||||||
|
=============================
|
||||||
|
|
||||||
|
1) The "flipper" node
|
||||||
|
|
||||||
|
This node represents the multi-function "Flipper" chip, which packages
|
||||||
|
many of the devices found in the Nintendo GameCube.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
|
||||||
|
- compatible : Should be "nintendo,flipper"
|
||||||
|
|
||||||
|
1.a) The Video Interface (VI) node
|
||||||
|
|
||||||
|
Represents the interface between the graphics processor and a external
|
||||||
|
video encoder.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
|
||||||
|
- compatible : should be "nintendo,flipper-vi"
|
||||||
|
- reg : should contain the VI registers location and length
|
||||||
|
- interrupts : should contain the VI interrupt
|
||||||
|
|
||||||
|
1.b) The Processor Interface (PI) node
|
||||||
|
|
||||||
|
Represents the data and control interface between the main processor
|
||||||
|
and graphics and audio processor.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
|
||||||
|
- compatible : should be "nintendo,flipper-pi"
|
||||||
|
- reg : should contain the PI registers location and length
|
||||||
|
|
||||||
|
1.b.i) The "Flipper" interrupt controller node
|
||||||
|
|
||||||
|
Represents the interrupt controller within the "Flipper" chip.
|
||||||
|
The node for the "Flipper" interrupt controller must be placed under
|
||||||
|
the PI node.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
|
||||||
|
- compatible : should be "nintendo,flipper-pic"
|
||||||
|
|
||||||
|
1.c) The Digital Signal Procesor (DSP) node
|
||||||
|
|
||||||
|
Represents the digital signal processor interface, designed to offload
|
||||||
|
audio related tasks.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
|
||||||
|
- compatible : should be "nintendo,flipper-dsp"
|
||||||
|
- reg : should contain the DSP registers location and length
|
||||||
|
- interrupts : should contain the DSP interrupt
|
||||||
|
|
||||||
|
1.c.i) The Auxiliary RAM (ARAM) node
|
||||||
|
|
||||||
|
Represents the non cpu-addressable ram designed mainly to store audio
|
||||||
|
related information.
|
||||||
|
The ARAM node must be placed under the DSP node.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
|
||||||
|
- compatible : should be "nintendo,flipper-aram"
|
||||||
|
- reg : should contain the ARAM start (zero-based) and length
|
||||||
|
|
||||||
|
1.d) The Disk Interface (DI) node
|
||||||
|
|
||||||
|
Represents the interface used to communicate with mass storage devices.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
|
||||||
|
- compatible : should be "nintendo,flipper-di"
|
||||||
|
- reg : should contain the DI registers location and length
|
||||||
|
- interrupts : should contain the DI interrupt
|
||||||
|
|
||||||
|
1.e) The Audio Interface (AI) node
|
||||||
|
|
||||||
|
Represents the interface to the external 16-bit stereo digital-to-analog
|
||||||
|
converter.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
|
||||||
|
- compatible : should be "nintendo,flipper-ai"
|
||||||
|
- reg : should contain the AI registers location and length
|
||||||
|
- interrupts : should contain the AI interrupt
|
||||||
|
|
||||||
|
1.f) The Serial Interface (SI) node
|
||||||
|
|
||||||
|
Represents the interface to the four single bit serial interfaces.
|
||||||
|
The SI is a proprietary serial interface used normally to control gamepads.
|
||||||
|
It's NOT a RS232-type interface.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
|
||||||
|
- compatible : should be "nintendo,flipper-si"
|
||||||
|
- reg : should contain the SI registers location and length
|
||||||
|
- interrupts : should contain the SI interrupt
|
||||||
|
|
||||||
|
1.g) The External Interface (EXI) node
|
||||||
|
|
||||||
|
Represents the multi-channel SPI-like interface.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
|
||||||
|
- compatible : should be "nintendo,flipper-exi"
|
||||||
|
- reg : should contain the EXI registers location and length
|
||||||
|
- interrupts : should contain the EXI interrupt
|
||||||
|
|
184
Documentation/powerpc/dts-bindings/nintendo/wii.txt
Normal file
184
Documentation/powerpc/dts-bindings/nintendo/wii.txt
Normal file
@@ -0,0 +1,184 @@
|
|||||||
|
|
||||||
|
Nintendo Wii device tree
|
||||||
|
========================
|
||||||
|
|
||||||
|
0) The root node
|
||||||
|
|
||||||
|
This node represents the Nintendo Wii video game console.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
|
||||||
|
- model : Should be "nintendo,wii"
|
||||||
|
- compatible : Should be "nintendo,wii"
|
||||||
|
|
||||||
|
1) The "hollywood" node
|
||||||
|
|
||||||
|
This node represents the multi-function "Hollywood" chip, which packages
|
||||||
|
many of the devices found in the Nintendo Wii.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
|
||||||
|
- compatible : Should be "nintendo,hollywood"
|
||||||
|
|
||||||
|
1.a) The Video Interface (VI) node
|
||||||
|
|
||||||
|
Represents the interface between the graphics processor and a external
|
||||||
|
video encoder.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
|
||||||
|
- compatible : should be "nintendo,hollywood-vi","nintendo,flipper-vi"
|
||||||
|
- reg : should contain the VI registers location and length
|
||||||
|
- interrupts : should contain the VI interrupt
|
||||||
|
|
||||||
|
1.b) The Processor Interface (PI) node
|
||||||
|
|
||||||
|
Represents the data and control interface between the main processor
|
||||||
|
and graphics and audio processor.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
|
||||||
|
- compatible : should be "nintendo,hollywood-pi","nintendo,flipper-pi"
|
||||||
|
- reg : should contain the PI registers location and length
|
||||||
|
|
||||||
|
1.b.i) The "Flipper" interrupt controller node
|
||||||
|
|
||||||
|
Represents the "Flipper" interrupt controller within the "Hollywood" chip.
|
||||||
|
The node for the "Flipper" interrupt controller must be placed under
|
||||||
|
the PI node.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
|
||||||
|
- #interrupt-cells : <1>
|
||||||
|
- compatible : should be "nintendo,flipper-pic"
|
||||||
|
- interrupt-controller
|
||||||
|
|
||||||
|
1.c) The Digital Signal Procesor (DSP) node
|
||||||
|
|
||||||
|
Represents the digital signal processor interface, designed to offload
|
||||||
|
audio related tasks.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
|
||||||
|
- compatible : should be "nintendo,hollywood-dsp","nintendo,flipper-dsp"
|
||||||
|
- reg : should contain the DSP registers location and length
|
||||||
|
- interrupts : should contain the DSP interrupt
|
||||||
|
|
||||||
|
1.d) The Serial Interface (SI) node
|
||||||
|
|
||||||
|
Represents the interface to the four single bit serial interfaces.
|
||||||
|
The SI is a proprietary serial interface used normally to control gamepads.
|
||||||
|
It's NOT a RS232-type interface.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
|
||||||
|
- compatible : should be "nintendo,hollywood-si","nintendo,flipper-si"
|
||||||
|
- reg : should contain the SI registers location and length
|
||||||
|
- interrupts : should contain the SI interrupt
|
||||||
|
|
||||||
|
1.e) The Audio Interface (AI) node
|
||||||
|
|
||||||
|
Represents the interface to the external 16-bit stereo digital-to-analog
|
||||||
|
converter.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
|
||||||
|
- compatible : should be "nintendo,hollywood-ai","nintendo,flipper-ai"
|
||||||
|
- reg : should contain the AI registers location and length
|
||||||
|
- interrupts : should contain the AI interrupt
|
||||||
|
|
||||||
|
1.f) The External Interface (EXI) node
|
||||||
|
|
||||||
|
Represents the multi-channel SPI-like interface.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
|
||||||
|
- compatible : should be "nintendo,hollywood-exi","nintendo,flipper-exi"
|
||||||
|
- reg : should contain the EXI registers location and length
|
||||||
|
- interrupts : should contain the EXI interrupt
|
||||||
|
|
||||||
|
1.g) The Open Host Controller Interface (OHCI) nodes
|
||||||
|
|
||||||
|
Represent the USB 1.x Open Host Controller Interfaces.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
|
||||||
|
- compatible : should be "nintendo,hollywood-usb-ohci","usb-ohci"
|
||||||
|
- reg : should contain the OHCI registers location and length
|
||||||
|
- interrupts : should contain the OHCI interrupt
|
||||||
|
|
||||||
|
1.h) The Enhanced Host Controller Interface (EHCI) node
|
||||||
|
|
||||||
|
Represents the USB 2.0 Enhanced Host Controller Interface.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
|
||||||
|
- compatible : should be "nintendo,hollywood-usb-ehci","usb-ehci"
|
||||||
|
- reg : should contain the EHCI registers location and length
|
||||||
|
- interrupts : should contain the EHCI interrupt
|
||||||
|
|
||||||
|
1.i) The Secure Digital Host Controller Interface (SDHCI) nodes
|
||||||
|
|
||||||
|
Represent the Secure Digital Host Controller Interfaces.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
|
||||||
|
- compatible : should be "nintendo,hollywood-sdhci","sdhci"
|
||||||
|
- reg : should contain the SDHCI registers location and length
|
||||||
|
- interrupts : should contain the SDHCI interrupt
|
||||||
|
|
||||||
|
1.j) The Inter-Processsor Communication (IPC) node
|
||||||
|
|
||||||
|
Represent the Inter-Processor Communication interface. This interface
|
||||||
|
enables communications between the Broadway and the Starlet processors.
|
||||||
|
|
||||||
|
- compatible : should be "nintendo,hollywood-ipc"
|
||||||
|
- reg : should contain the IPC registers location and length
|
||||||
|
- interrupts : should contain the IPC interrupt
|
||||||
|
|
||||||
|
1.k) The "Hollywood" interrupt controller node
|
||||||
|
|
||||||
|
Represents the "Hollywood" interrupt controller within the
|
||||||
|
"Hollywood" chip.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
|
||||||
|
- #interrupt-cells : <1>
|
||||||
|
- compatible : should be "nintendo,hollywood-pic"
|
||||||
|
- reg : should contain the controller registers location and length
|
||||||
|
- interrupt-controller
|
||||||
|
- interrupts : should contain the cascade interrupt of the "flipper" pic
|
||||||
|
- interrupt-parent: should contain the phandle of the "flipper" pic
|
||||||
|
|
||||||
|
1.l) The General Purpose I/O (GPIO) controller node
|
||||||
|
|
||||||
|
Represents the dual access 32 GPIO controller interface.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
|
||||||
|
- #gpio-cells : <2>
|
||||||
|
- compatible : should be "nintendo,hollywood-gpio"
|
||||||
|
- reg : should contain the IPC registers location and length
|
||||||
|
- gpio-controller
|
||||||
|
|
||||||
|
1.m) The control node
|
||||||
|
|
||||||
|
Represents the control interface used to setup several miscellaneous
|
||||||
|
settings of the "Hollywood" chip like boot memory mappings, resets,
|
||||||
|
disk interface mode, etc.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
|
||||||
|
- compatible : should be "nintendo,hollywood-control"
|
||||||
|
- reg : should contain the control registers location and length
|
||||||
|
|
||||||
|
1.n) The Disk Interface (DI) node
|
||||||
|
|
||||||
|
Represents the interface used to communicate with mass storage devices.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
|
||||||
|
- compatible : should be "nintendo,hollywood-di"
|
||||||
|
- reg : should contain the DI registers location and length
|
||||||
|
- interrupts : should contain the DI interrupt
|
||||||
|
|
@@ -292,4 +292,15 @@
|
|||||||
- reg-offset : A value of 3 is required
|
- reg-offset : A value of 3 is required
|
||||||
- reg-shift : A value of 2 is required
|
- reg-shift : A value of 2 is required
|
||||||
|
|
||||||
|
vii) Xilinx USB Host controller
|
||||||
|
|
||||||
|
The Xilinx USB host controller is EHCI compatible but with a different
|
||||||
|
base address for the EHCI registers, and it is always a big-endian
|
||||||
|
USB Host controller. The hardware can be configured as high speed only,
|
||||||
|
or high speed/full speed hybrid.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
- xlnx,support-usb-fs: A value 0 means the core is built as high speed
|
||||||
|
only. A value 1 means the core also supports
|
||||||
|
full speed devices.
|
||||||
|
|
||||||
|
@@ -1,154 +0,0 @@
|
|||||||
HAYES ESP DRIVER VERSION 2.1
|
|
||||||
|
|
||||||
A big thanks to the people at Hayes, especially Alan Adamson. Their support
|
|
||||||
has enabled me to provide enhancements to the driver.
|
|
||||||
|
|
||||||
Please report your experiences with this driver to me (arobinso@nyx.net). I
|
|
||||||
am looking for both positive and negative feedback.
|
|
||||||
|
|
||||||
*** IMPORTANT CHANGES FOR 2.1 ***
|
|
||||||
Support for PIO mode. Five situations will cause PIO mode to be used:
|
|
||||||
1) A multiport card is detected. PIO mode will always be used. (8 port cards
|
|
||||||
do not support DMA).
|
|
||||||
2) The DMA channel is set to an invalid value (anything other than 1 or 3).
|
|
||||||
3) The DMA buffer/channel could not be allocated. The port will revert to PIO
|
|
||||||
mode until it is reopened.
|
|
||||||
4) Less than a specified number of bytes need to be transferred to/from the
|
|
||||||
FIFOs. PIO mode will be used for that transfer only.
|
|
||||||
5) A port needs to do a DMA transfer and another port is already using the
|
|
||||||
DMA channel. PIO mode will be used for that transfer only.
|
|
||||||
|
|
||||||
Since the Hayes ESP seems to conflict with other cards (notably sound cards)
|
|
||||||
when using DMA, DMA is turned off by default. To use DMA, it must be turned
|
|
||||||
on explicitly, either with the "dma=" option described below or with
|
|
||||||
setserial. A multiport card can be forced into DMA mode by using setserial;
|
|
||||||
however, most multiport cards don't support DMA.
|
|
||||||
|
|
||||||
The latest version of setserial allows the enhanced configuration of the ESP
|
|
||||||
card to be viewed and modified.
|
|
||||||
***
|
|
||||||
|
|
||||||
This package contains the files needed to compile a module to support the Hayes
|
|
||||||
ESP card. The drivers are basically a modified version of the serial drivers.
|
|
||||||
|
|
||||||
Features:
|
|
||||||
|
|
||||||
- Uses the enhanced mode of the ESP card, allowing a wider range of
|
|
||||||
interrupts and features than compatibility mode
|
|
||||||
- Uses DMA and 16 bit PIO mode to transfer data to and from the ESP's FIFOs,
|
|
||||||
reducing CPU load
|
|
||||||
- Supports primary and secondary ports
|
|
||||||
|
|
||||||
|
|
||||||
If the driver is compiled as a module, the IRQs to use can be specified by
|
|
||||||
using the irq= option. The format is:
|
|
||||||
|
|
||||||
irq=[0x100],[0x140],[0x180],[0x200],[0x240],[0x280],[0x300],[0x380]
|
|
||||||
|
|
||||||
The address in brackets is the base address of the card. The IRQ of
|
|
||||||
nonexistent cards can be set to 0. If an IRQ of a card that does exist is set
|
|
||||||
to 0, the driver will attempt to guess at the correct IRQ. For example, to set
|
|
||||||
the IRQ of the card at address 0x300 to 12, the insmod command would be:
|
|
||||||
|
|
||||||
insmod esp irq=0,0,0,0,0,0,12,0
|
|
||||||
|
|
||||||
The custom divisor can be set by using the divisor= option. The format is the
|
|
||||||
same as for the irq= option. Each divisor value is a series of hex digits,
|
|
||||||
with each digit representing the divisor to use for a corresponding port. The
|
|
||||||
divisor value is constructed RIGHT TO LEFT. Specifying a nonzero divisor value
|
|
||||||
will automatically set the spd_cust flag. To calculate the divisor to use for
|
|
||||||
a certain baud rate, divide the port's base baud (generally 921600) by the
|
|
||||||
desired rate. For example, to set the divisor of the primary port at 0x300 to
|
|
||||||
4 and the divisor of the secondary port at 0x308 to 8, the insmod command would
|
|
||||||
be:
|
|
||||||
|
|
||||||
insmod esp divisor=0,0,0,0,0,0,0x84,0
|
|
||||||
|
|
||||||
The dma= option can be used to set the DMA channel. The channel can be either
|
|
||||||
1 or 3. Specifying any other value will force the driver to use PIO mode.
|
|
||||||
For example, to set the DMA channel to 3, the insmod command would be:
|
|
||||||
|
|
||||||
insmod esp dma=3
|
|
||||||
|
|
||||||
The rx_trigger= and tx_trigger= options can be used to set the FIFO trigger
|
|
||||||
levels. They specify when the ESP card should send an interrupt. Larger
|
|
||||||
values will decrease the number of interrupts; however, a value too high may
|
|
||||||
result in data loss. Valid values are 1 through 1023, with 768 being the
|
|
||||||
default. For example, to set the receive trigger level to 512 bytes and the
|
|
||||||
transmit trigger level to 700 bytes, the insmod command would be:
|
|
||||||
|
|
||||||
insmod esp rx_trigger=512 tx_trigger=700
|
|
||||||
|
|
||||||
The flow_off= and flow_on= options can be used to set the hardware flow off/
|
|
||||||
flow on levels. The flow on level must be lower than the flow off level, and
|
|
||||||
the flow off level should be higher than rx_trigger. Valid values are 1
|
|
||||||
through 1023, with 1016 being the default flow off level and 944 being the
|
|
||||||
default flow on level. For example, to set the flow off level to 1000 bytes
|
|
||||||
and the flow on level to 935 bytes, the insmod command would be:
|
|
||||||
|
|
||||||
insmod esp flow_off=1000 flow_on=935
|
|
||||||
|
|
||||||
The rx_timeout= option can be used to set the receive timeout value. This
|
|
||||||
value indicates how long after receiving the last character that the ESP card
|
|
||||||
should wait before signalling an interrupt. Valid values are 0 though 255,
|
|
||||||
with 128 being the default. A value too high will increase latency, and a
|
|
||||||
value too low will cause unnecessary interrupts. For example, to set the
|
|
||||||
receive timeout to 255, the insmod command would be:
|
|
||||||
|
|
||||||
insmod esp rx_timeout=255
|
|
||||||
|
|
||||||
The pio_threshold= option sets the threshold (in number of characters) for
|
|
||||||
using PIO mode instead of DMA mode. For example, if this value is 32,
|
|
||||||
transfers of 32 bytes or less will always use PIO mode.
|
|
||||||
|
|
||||||
insmod esp pio_threshold=32
|
|
||||||
|
|
||||||
Multiple options can be listed on the insmod command line by separating each
|
|
||||||
option with a space. For example:
|
|
||||||
|
|
||||||
insmod esp dma=3 trigger=512
|
|
||||||
|
|
||||||
The esp module can be automatically loaded when needed. To cause this to
|
|
||||||
happen, add the following lines to /etc/modprobe.conf (replacing the last line
|
|
||||||
with options for your configuration):
|
|
||||||
|
|
||||||
alias char-major-57 esp
|
|
||||||
alias char-major-58 esp
|
|
||||||
options esp irq=0,0,0,0,0,0,3,0 divisor=0,0,0,0,0,0,0x4,0
|
|
||||||
|
|
||||||
You may also need to run 'depmod -a'.
|
|
||||||
|
|
||||||
Devices must be created manually. To create the devices, note the output from
|
|
||||||
the module after it is inserted. The output will appear in the location where
|
|
||||||
kernel messages usually appear (usually /var/adm/messages). Create two devices
|
|
||||||
for each 'tty' mentioned, one with major of 57 and the other with major of 58.
|
|
||||||
The minor number should be the same as the tty number reported. The commands
|
|
||||||
would be (replace ? with the tty number):
|
|
||||||
|
|
||||||
mknod /dev/ttyP? c 57 ?
|
|
||||||
mknod /dev/cup? c 58 ?
|
|
||||||
|
|
||||||
For example, if the following line appears:
|
|
||||||
|
|
||||||
Oct 24 18:17:23 techno kernel: ttyP8 at 0x0140 (irq = 3) is an ESP primary port
|
|
||||||
|
|
||||||
...two devices should be created:
|
|
||||||
|
|
||||||
mknod /dev/ttyP8 c 57 8
|
|
||||||
mknod /dev/cup8 c 58 8
|
|
||||||
|
|
||||||
You may need to set the permissions on the devices:
|
|
||||||
|
|
||||||
chmod 666 /dev/ttyP*
|
|
||||||
chmod 666 /dev/cup*
|
|
||||||
|
|
||||||
The ESP module and the serial module should not conflict (they can be used at
|
|
||||||
the same time). After the ESP module has been loaded the ports on the ESP card
|
|
||||||
will no longer be accessible by the serial driver.
|
|
||||||
|
|
||||||
If I/O errors are experienced when accessing the port, check for IRQ and DMA
|
|
||||||
conflicts ('cat /proc/interrupts' and 'cat /proc/dma' for a list of IRQs and
|
|
||||||
DMAs currently in use).
|
|
||||||
|
|
||||||
Enjoy!
|
|
||||||
Andrew J. Robinson <arobinso@nyx.net>
|
|
@@ -42,7 +42,8 @@ TTY side interfaces:
|
|||||||
open() - Called when the line discipline is attached to
|
open() - Called when the line discipline is attached to
|
||||||
the terminal. No other call into the line
|
the terminal. No other call into the line
|
||||||
discipline for this tty will occur until it
|
discipline for this tty will occur until it
|
||||||
completes successfully. Can sleep.
|
completes successfully. Returning an error will
|
||||||
|
prevent the ldisc from being attached. Can sleep.
|
||||||
|
|
||||||
close() - This is called on a terminal when the line
|
close() - This is called on a terminal when the line
|
||||||
discipline is being unplugged. At the point of
|
discipline is being unplugged. At the point of
|
||||||
@@ -52,7 +53,7 @@ close() - This is called on a terminal when the line
|
|||||||
hangup() - Called when the tty line is hung up.
|
hangup() - Called when the tty line is hung up.
|
||||||
The line discipline should cease I/O to the tty.
|
The line discipline should cease I/O to the tty.
|
||||||
No further calls into the ldisc code will occur.
|
No further calls into the ldisc code will occur.
|
||||||
Can sleep.
|
The return value is ignored. Can sleep.
|
||||||
|
|
||||||
write() - A process is writing data through the line
|
write() - A process is writing data through the line
|
||||||
discipline. Multiple write calls are serialized
|
discipline. Multiple write calls are serialized
|
||||||
@@ -83,6 +84,10 @@ ioctl() - Called when an ioctl is handed to the tty layer
|
|||||||
that might be for the ldisc. Multiple ioctl calls
|
that might be for the ldisc. Multiple ioctl calls
|
||||||
may occur in parallel. May sleep.
|
may occur in parallel. May sleep.
|
||||||
|
|
||||||
|
compat_ioctl() - Called when a 32 bit ioctl is handed to the tty layer
|
||||||
|
that might be for the ldisc. Multiple ioctl calls
|
||||||
|
may occur in parallel. May sleep.
|
||||||
|
|
||||||
Driver Side Interfaces:
|
Driver Side Interfaces:
|
||||||
|
|
||||||
receive_buf() - Hand buffers of bytes from the driver to the ldisc
|
receive_buf() - Hand buffers of bytes from the driver to the ldisc
|
||||||
|
@@ -1,73 +1,8 @@
|
|||||||
SPIN_LOCK_UNLOCKED and RW_LOCK_UNLOCKED defeat lockdep state tracking and
|
Lesson 1: Spin locks
|
||||||
are hence deprecated.
|
|
||||||
|
|
||||||
Please use DEFINE_SPINLOCK()/DEFINE_RWLOCK() or
|
The most basic primitive for locking is spinlock.
|
||||||
__SPIN_LOCK_UNLOCKED()/__RW_LOCK_UNLOCKED() as appropriate for static
|
|
||||||
initialization.
|
|
||||||
|
|
||||||
Most of the time, you can simply turn:
|
|
||||||
|
|
||||||
static spinlock_t xxx_lock = SPIN_LOCK_UNLOCKED;
|
|
||||||
|
|
||||||
into:
|
|
||||||
|
|
||||||
static DEFINE_SPINLOCK(xxx_lock);
|
|
||||||
|
|
||||||
Static structure member variables go from:
|
|
||||||
|
|
||||||
struct foo bar {
|
|
||||||
.lock = SPIN_LOCK_UNLOCKED;
|
|
||||||
};
|
|
||||||
|
|
||||||
to:
|
|
||||||
|
|
||||||
struct foo bar {
|
|
||||||
.lock = __SPIN_LOCK_UNLOCKED(bar.lock);
|
|
||||||
};
|
|
||||||
|
|
||||||
Declaration of static rw_locks undergo a similar transformation.
|
|
||||||
|
|
||||||
Dynamic initialization, when necessary, may be performed as
|
|
||||||
demonstrated below.
|
|
||||||
|
|
||||||
spinlock_t xxx_lock;
|
|
||||||
rwlock_t xxx_rw_lock;
|
|
||||||
|
|
||||||
static int __init xxx_init(void)
|
|
||||||
{
|
|
||||||
spin_lock_init(&xxx_lock);
|
|
||||||
rwlock_init(&xxx_rw_lock);
|
|
||||||
...
|
|
||||||
}
|
|
||||||
|
|
||||||
module_init(xxx_init);
|
|
||||||
|
|
||||||
The following discussion is still valid, however, with the dynamic
|
|
||||||
initialization of spinlocks or with DEFINE_SPINLOCK, etc., used
|
|
||||||
instead of SPIN_LOCK_UNLOCKED.
|
|
||||||
|
|
||||||
-----------------------
|
|
||||||
|
|
||||||
On Fri, 2 Jan 1998, Doug Ledford wrote:
|
|
||||||
>
|
|
||||||
> I'm working on making the aic7xxx driver more SMP friendly (as well as
|
|
||||||
> importing the latest FreeBSD sequencer code to have 7895 support) and wanted
|
|
||||||
> to get some info from you. The goal here is to make the various routines
|
|
||||||
> SMP safe as well as UP safe during interrupts and other manipulating
|
|
||||||
> routines. So far, I've added a spin_lock variable to things like my queue
|
|
||||||
> structs. Now, from what I recall, there are some spin lock functions I can
|
|
||||||
> use to lock these spin locks from other use as opposed to a (nasty)
|
|
||||||
> save_flags(); cli(); stuff; restore_flags(); construct. Where do I find
|
|
||||||
> these routines and go about making use of them? Do they only lock on a
|
|
||||||
> per-processor basis or can they also lock say an interrupt routine from
|
|
||||||
> mucking with a queue if the queue routine was manipulating it when the
|
|
||||||
> interrupt occurred, or should I still use a cli(); based construct on that
|
|
||||||
> one?
|
|
||||||
|
|
||||||
See <asm/spinlock.h>. The basic version is:
|
|
||||||
|
|
||||||
spinlock_t xxx_lock = SPIN_LOCK_UNLOCKED;
|
|
||||||
|
|
||||||
|
static DEFINE_SPINLOCK(xxx_lock);
|
||||||
|
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
@@ -75,13 +10,11 @@ See <asm/spinlock.h>. The basic version is:
|
|||||||
... critical section here ..
|
... critical section here ..
|
||||||
spin_unlock_irqrestore(&xxx_lock, flags);
|
spin_unlock_irqrestore(&xxx_lock, flags);
|
||||||
|
|
||||||
and the above is always safe. It will disable interrupts _locally_, but the
|
The above is always safe. It will disable interrupts _locally_, but the
|
||||||
spinlock itself will guarantee the global lock, so it will guarantee that
|
spinlock itself will guarantee the global lock, so it will guarantee that
|
||||||
there is only one thread-of-control within the region(s) protected by that
|
there is only one thread-of-control within the region(s) protected by that
|
||||||
lock.
|
lock. This works well even under UP. The above sequence under UP
|
||||||
|
essentially is just the same as doing
|
||||||
Note that it works well even under UP - the above sequence under UP
|
|
||||||
essentially is just the same as doing a
|
|
||||||
|
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
@@ -91,15 +24,13 @@ essentially is just the same as doing a
|
|||||||
|
|
||||||
so the code does _not_ need to worry about UP vs SMP issues: the spinlocks
|
so the code does _not_ need to worry about UP vs SMP issues: the spinlocks
|
||||||
work correctly under both (and spinlocks are actually more efficient on
|
work correctly under both (and spinlocks are actually more efficient on
|
||||||
architectures that allow doing the "save_flags + cli" in one go because I
|
architectures that allow doing the "save_flags + cli" in one operation).
|
||||||
don't export that interface normally).
|
|
||||||
|
|
||||||
NOTE NOTE NOTE! The reason the spinlock is so much faster than a global
|
NOTE! Implications of spin_locks for memory are further described in:
|
||||||
interrupt lock under SMP is exactly because it disables interrupts only on
|
|
||||||
the local CPU. The spin-lock is safe only when you _also_ use the lock
|
Documentation/memory-barriers.txt
|
||||||
itself to do locking across CPU's, which implies that EVERYTHING that
|
(5) LOCK operations.
|
||||||
touches a shared variable has to agree about the spinlock they want to
|
(6) UNLOCK operations.
|
||||||
use.
|
|
||||||
|
|
||||||
The above is usually pretty simple (you usually need and want only one
|
The above is usually pretty simple (you usually need and want only one
|
||||||
spinlock for most things - using more than one spinlock can make things a
|
spinlock for most things - using more than one spinlock can make things a
|
||||||
@@ -120,20 +51,24 @@ and another sequence that does
|
|||||||
then they are NOT mutually exclusive, and the critical regions can happen
|
then they are NOT mutually exclusive, and the critical regions can happen
|
||||||
at the same time on two different CPU's. That's fine per se, but the
|
at the same time on two different CPU's. That's fine per se, but the
|
||||||
critical regions had better be critical for different things (ie they
|
critical regions had better be critical for different things (ie they
|
||||||
can't stomp on each other).
|
can't stomp on each other).
|
||||||
|
|
||||||
The above is a problem mainly if you end up mixing code - for example the
|
The above is a problem mainly if you end up mixing code - for example the
|
||||||
routines in ll_rw_block() tend to use cli/sti to protect the atomicity of
|
routines in ll_rw_block() tend to use cli/sti to protect the atomicity of
|
||||||
their actions, and if a driver uses spinlocks instead then you should
|
their actions, and if a driver uses spinlocks instead then you should
|
||||||
think about issues like the above..
|
think about issues like the above.
|
||||||
|
|
||||||
This is really the only really hard part about spinlocks: once you start
|
This is really the only really hard part about spinlocks: once you start
|
||||||
using spinlocks they tend to expand to areas you might not have noticed
|
using spinlocks they tend to expand to areas you might not have noticed
|
||||||
before, because you have to make sure the spinlocks correctly protect the
|
before, because you have to make sure the spinlocks correctly protect the
|
||||||
shared data structures _everywhere_ they are used. The spinlocks are most
|
shared data structures _everywhere_ they are used. The spinlocks are most
|
||||||
easily added to places that are completely independent of other code (ie
|
easily added to places that are completely independent of other code (for
|
||||||
internal driver data structures that nobody else ever touches, for
|
example, internal driver data structures that nobody else ever touches).
|
||||||
example).
|
|
||||||
|
NOTE! The spin-lock is safe only when you _also_ use the lock itself
|
||||||
|
to do locking across CPU's, which implies that EVERYTHING that
|
||||||
|
touches a shared variable has to agree about the spinlock they want
|
||||||
|
to use.
|
||||||
|
|
||||||
----
|
----
|
||||||
|
|
||||||
@@ -141,14 +76,18 @@ Lesson 2: reader-writer spinlocks.
|
|||||||
|
|
||||||
If your data accesses have a very natural pattern where you usually tend
|
If your data accesses have a very natural pattern where you usually tend
|
||||||
to mostly read from the shared variables, the reader-writer locks
|
to mostly read from the shared variables, the reader-writer locks
|
||||||
(rw_lock) versions of the spinlocks are often nicer. They allow multiple
|
(rw_lock) versions of the spinlocks are sometimes useful. They allow multiple
|
||||||
readers to be in the same critical region at once, but if somebody wants
|
readers to be in the same critical region at once, but if somebody wants
|
||||||
to change the variables it has to get an exclusive write lock. The
|
to change the variables it has to get an exclusive write lock.
|
||||||
routines look the same as above:
|
|
||||||
|
NOTE! reader-writer locks require more atomic memory operations than
|
||||||
|
simple spinlocks. Unless the reader critical section is long, you
|
||||||
|
are better off just using spinlocks.
|
||||||
|
|
||||||
|
The routines look the same as above:
|
||||||
|
|
||||||
rwlock_t xxx_lock = RW_LOCK_UNLOCKED;
|
rwlock_t xxx_lock = RW_LOCK_UNLOCKED;
|
||||||
|
|
||||||
|
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
read_lock_irqsave(&xxx_lock, flags);
|
read_lock_irqsave(&xxx_lock, flags);
|
||||||
@@ -159,18 +98,21 @@ routines look the same as above:
|
|||||||
.. read and write exclusive access to the info ...
|
.. read and write exclusive access to the info ...
|
||||||
write_unlock_irqrestore(&xxx_lock, flags);
|
write_unlock_irqrestore(&xxx_lock, flags);
|
||||||
|
|
||||||
The above kind of lock is useful for complex data structures like linked
|
The above kind of lock may be useful for complex data structures like
|
||||||
lists etc, especially when you know that most of the work is to just
|
linked lists, especially searching for entries without changing the list
|
||||||
traverse the list searching for entries without changing the list itself,
|
itself. The read lock allows many concurrent readers. Anything that
|
||||||
for example. Then you can use the read lock for that kind of list
|
_changes_ the list will have to get the write lock.
|
||||||
traversal, which allows many concurrent readers. Anything that _changes_
|
|
||||||
the list will have to get the write lock.
|
|
||||||
|
|
||||||
Note: you cannot "upgrade" a read-lock to a write-lock, so if you at _any_
|
NOTE! RCU is better for list traversal, but requires careful
|
||||||
|
attention to design detail (see Documentation/RCU/listRCU.txt).
|
||||||
|
|
||||||
|
Also, you cannot "upgrade" a read-lock to a write-lock, so if you at _any_
|
||||||
time need to do any changes (even if you don't do it every time), you have
|
time need to do any changes (even if you don't do it every time), you have
|
||||||
to get the write-lock at the very beginning. I could fairly easily add a
|
to get the write-lock at the very beginning.
|
||||||
primitive to create a "upgradeable" read-lock, but it hasn't been an issue
|
|
||||||
yet. Tell me if you'd want one.
|
NOTE! We are working hard to remove reader-writer spinlocks in most
|
||||||
|
cases, so please don't add a new one without consensus. (Instead, see
|
||||||
|
Documentation/RCU/rcu.txt for complete information.)
|
||||||
|
|
||||||
----
|
----
|
||||||
|
|
||||||
@@ -233,4 +175,46 @@ indeed), while write-locks need to protect themselves against interrupts.
|
|||||||
|
|
||||||
Linus
|
Linus
|
||||||
|
|
||||||
|
----
|
||||||
|
|
||||||
|
Reference information:
|
||||||
|
|
||||||
|
For dynamic initialization, use spin_lock_init() or rwlock_init() as
|
||||||
|
appropriate:
|
||||||
|
|
||||||
|
spinlock_t xxx_lock;
|
||||||
|
rwlock_t xxx_rw_lock;
|
||||||
|
|
||||||
|
static int __init xxx_init(void)
|
||||||
|
{
|
||||||
|
spin_lock_init(&xxx_lock);
|
||||||
|
rwlock_init(&xxx_rw_lock);
|
||||||
|
...
|
||||||
|
}
|
||||||
|
|
||||||
|
module_init(xxx_init);
|
||||||
|
|
||||||
|
For static initialization, use DEFINE_SPINLOCK() / DEFINE_RWLOCK() or
|
||||||
|
__SPIN_LOCK_UNLOCKED() / __RW_LOCK_UNLOCKED() as appropriate.
|
||||||
|
|
||||||
|
SPIN_LOCK_UNLOCKED and RW_LOCK_UNLOCKED are deprecated. These interfere
|
||||||
|
with lockdep state tracking.
|
||||||
|
|
||||||
|
Most of the time, you can simply turn:
|
||||||
|
static spinlock_t xxx_lock = SPIN_LOCK_UNLOCKED;
|
||||||
|
into:
|
||||||
|
static DEFINE_SPINLOCK(xxx_lock);
|
||||||
|
|
||||||
|
Static structure member variables go from:
|
||||||
|
|
||||||
|
struct foo bar {
|
||||||
|
.lock = SPIN_LOCK_UNLOCKED;
|
||||||
|
};
|
||||||
|
|
||||||
|
to:
|
||||||
|
|
||||||
|
struct foo bar {
|
||||||
|
.lock = __SPIN_LOCK_UNLOCKED(bar.lock);
|
||||||
|
};
|
||||||
|
|
||||||
|
Declaration of static rw_locks undergo a similar transformation.
|
||||||
|
@@ -206,6 +206,7 @@ passive
|
|||||||
passive trip point for the zone. Activation is done by polling with
|
passive trip point for the zone. Activation is done by polling with
|
||||||
an interval of 1 second.
|
an interval of 1 second.
|
||||||
Unit: millidegrees Celsius
|
Unit: millidegrees Celsius
|
||||||
|
Valid values: 0 (disabled) or greater than 1000
|
||||||
RW, Optional
|
RW, Optional
|
||||||
|
|
||||||
*****************************
|
*****************************
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
Alan Stern <stern@rowland.harvard.edu>
|
Alan Stern <stern@rowland.harvard.edu>
|
||||||
|
|
||||||
October 5, 2007
|
November 10, 2009
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -123,9 +123,9 @@ relevant attribute files are: wakeup, level, and autosuspend.
|
|||||||
|
|
||||||
power/level
|
power/level
|
||||||
|
|
||||||
This file contains one of three words: "on", "auto",
|
This file contains one of two words: "on" or "auto".
|
||||||
or "suspend". You can write those words to the file
|
You can write those words to the file to change the
|
||||||
to change the device's setting.
|
device's setting.
|
||||||
|
|
||||||
"on" means that the device should be resumed and
|
"on" means that the device should be resumed and
|
||||||
autosuspend is not allowed. (Of course, system
|
autosuspend is not allowed. (Of course, system
|
||||||
@@ -134,10 +134,10 @@ relevant attribute files are: wakeup, level, and autosuspend.
|
|||||||
"auto" is the normal state in which the kernel is
|
"auto" is the normal state in which the kernel is
|
||||||
allowed to autosuspend and autoresume the device.
|
allowed to autosuspend and autoresume the device.
|
||||||
|
|
||||||
"suspend" means that the device should remain
|
(In kernels up to 2.6.32, you could also specify
|
||||||
suspended, and autoresume is not allowed. (But remote
|
"suspend", meaning that the device should remain
|
||||||
wakeup may still be allowed, since it is controlled
|
suspended and autoresume was not allowed. This
|
||||||
separately by the power/wakeup attribute.)
|
setting is no longer supported.)
|
||||||
|
|
||||||
power/autosuspend
|
power/autosuspend
|
||||||
|
|
||||||
@@ -313,13 +313,14 @@ three of the methods listed above. In addition, a driver indicates
|
|||||||
that it supports autosuspend by setting the .supports_autosuspend flag
|
that it supports autosuspend by setting the .supports_autosuspend flag
|
||||||
in its usb_driver structure. It is then responsible for informing the
|
in its usb_driver structure. It is then responsible for informing the
|
||||||
USB core whenever one of its interfaces becomes busy or idle. The
|
USB core whenever one of its interfaces becomes busy or idle. The
|
||||||
driver does so by calling these five functions:
|
driver does so by calling these six functions:
|
||||||
|
|
||||||
int usb_autopm_get_interface(struct usb_interface *intf);
|
int usb_autopm_get_interface(struct usb_interface *intf);
|
||||||
void usb_autopm_put_interface(struct usb_interface *intf);
|
void usb_autopm_put_interface(struct usb_interface *intf);
|
||||||
int usb_autopm_set_interface(struct usb_interface *intf);
|
|
||||||
int usb_autopm_get_interface_async(struct usb_interface *intf);
|
int usb_autopm_get_interface_async(struct usb_interface *intf);
|
||||||
void usb_autopm_put_interface_async(struct usb_interface *intf);
|
void usb_autopm_put_interface_async(struct usb_interface *intf);
|
||||||
|
void usb_autopm_get_interface_no_resume(struct usb_interface *intf);
|
||||||
|
void usb_autopm_put_interface_no_suspend(struct usb_interface *intf);
|
||||||
|
|
||||||
The functions work by maintaining a counter in the usb_interface
|
The functions work by maintaining a counter in the usb_interface
|
||||||
structure. When intf->pm_usage_count is > 0 then the interface is
|
structure. When intf->pm_usage_count is > 0 then the interface is
|
||||||
@@ -331,11 +332,13 @@ considered to be idle, and the kernel may autosuspend the device.
|
|||||||
associated with the device itself rather than any of its interfaces.
|
associated with the device itself rather than any of its interfaces.
|
||||||
This field is used only by the USB core.)
|
This field is used only by the USB core.)
|
||||||
|
|
||||||
The driver owns intf->pm_usage_count; it can modify the value however
|
Drivers must not modify intf->pm_usage_count directly; its value
|
||||||
and whenever it likes. A nice aspect of the non-async usb_autopm_*
|
should be changed only be using the functions listed above. Drivers
|
||||||
routines is that the changes they make are protected by the usb_device
|
are responsible for insuring that the overall change to pm_usage_count
|
||||||
structure's PM mutex (udev->pm_mutex); however drivers may change
|
during their lifetime balances out to 0 (it may be necessary for the
|
||||||
pm_usage_count without holding the mutex. Drivers using the async
|
disconnect method to call usb_autopm_put_interface() one or more times
|
||||||
|
to fulfill this requirement). The first two routines use the PM mutex
|
||||||
|
in struct usb_device for mutual exclusion; drivers using the async
|
||||||
routines are responsible for their own synchronization and mutual
|
routines are responsible for their own synchronization and mutual
|
||||||
exclusion.
|
exclusion.
|
||||||
|
|
||||||
@@ -347,11 +350,6 @@ exclusion.
|
|||||||
attempts an autosuspend if the new value is <= 0 and the
|
attempts an autosuspend if the new value is <= 0 and the
|
||||||
device isn't suspended.
|
device isn't suspended.
|
||||||
|
|
||||||
usb_autopm_set_interface() leaves pm_usage_count alone.
|
|
||||||
It attempts an autoresume if the value is > 0 and the device
|
|
||||||
is suspended, and it attempts an autosuspend if the value is
|
|
||||||
<= 0 and the device isn't suspended.
|
|
||||||
|
|
||||||
usb_autopm_get_interface_async() and
|
usb_autopm_get_interface_async() and
|
||||||
usb_autopm_put_interface_async() do almost the same things as
|
usb_autopm_put_interface_async() do almost the same things as
|
||||||
their non-async counterparts. The differences are: they do
|
their non-async counterparts. The differences are: they do
|
||||||
@@ -360,13 +358,11 @@ exclusion.
|
|||||||
such as an URB's completion handler, but when they return the
|
such as an URB's completion handler, but when they return the
|
||||||
device will not generally not yet be in the desired state.
|
device will not generally not yet be in the desired state.
|
||||||
|
|
||||||
There also are a couple of utility routines drivers can use:
|
usb_autopm_get_interface_no_resume() and
|
||||||
|
usb_autopm_put_interface_no_suspend() merely increment or
|
||||||
usb_autopm_enable() sets pm_usage_cnt to 0 and then calls
|
decrement the pm_usage_count value; they do not attempt to
|
||||||
usb_autopm_set_interface(), which will attempt an autosuspend.
|
carry out an autoresume or an autosuspend. Hence they can be
|
||||||
|
called in an atomic context.
|
||||||
usb_autopm_disable() sets pm_usage_cnt to 1 and then calls
|
|
||||||
usb_autopm_set_interface(), which will attempt an autoresume.
|
|
||||||
|
|
||||||
The conventional usage pattern is that a driver calls
|
The conventional usage pattern is that a driver calls
|
||||||
usb_autopm_get_interface() in its open routine and
|
usb_autopm_get_interface() in its open routine and
|
||||||
@@ -400,11 +396,11 @@ though, setting this flag won't cause the kernel to autoresume it.
|
|||||||
Normally a driver would set this flag in its probe method, at which
|
Normally a driver would set this flag in its probe method, at which
|
||||||
time the device is guaranteed not to be autosuspended.)
|
time the device is guaranteed not to be autosuspended.)
|
||||||
|
|
||||||
The usb_autopm_* routines have to run in a sleepable process context;
|
The synchronous usb_autopm_* routines have to run in a sleepable
|
||||||
they must not be called from an interrupt handler or while holding a
|
process context; they must not be called from an interrupt handler or
|
||||||
spinlock. In fact, the entire autosuspend mechanism is not well geared
|
while holding a spinlock. In fact, the entire autosuspend mechanism
|
||||||
toward interrupt-driven operation. However there is one thing a
|
is not well geared toward interrupt-driven operation. However there
|
||||||
driver can do in an interrupt handler:
|
is one thing a driver can do in an interrupt handler:
|
||||||
|
|
||||||
usb_mark_last_busy(struct usb_device *udev);
|
usb_mark_last_busy(struct usb_device *udev);
|
||||||
|
|
||||||
@@ -423,15 +419,16 @@ an URB had completed too recently.
|
|||||||
|
|
||||||
External suspend calls should never be allowed to fail in this way,
|
External suspend calls should never be allowed to fail in this way,
|
||||||
only autosuspend calls. The driver can tell them apart by checking
|
only autosuspend calls. The driver can tell them apart by checking
|
||||||
udev->auto_pm; this flag will be set to 1 for internal PM events
|
the PM_EVENT_AUTO bit in the message.event argument to the suspend
|
||||||
(autosuspend or autoresume) and 0 for external PM events.
|
method; this bit will be set for internal PM events (autosuspend) and
|
||||||
|
clear for external PM events.
|
||||||
|
|
||||||
Many of the ingredients in the autosuspend framework are oriented
|
Many of the ingredients in the autosuspend framework are oriented
|
||||||
towards interfaces: The usb_interface structure contains the
|
towards interfaces: The usb_interface structure contains the
|
||||||
pm_usage_cnt field, and the usb_autopm_* routines take an interface
|
pm_usage_cnt field, and the usb_autopm_* routines take an interface
|
||||||
pointer as their argument. But somewhat confusingly, a few of the
|
pointer as their argument. But somewhat confusingly, a few of the
|
||||||
pieces (usb_mark_last_busy() and udev->auto_pm) use the usb_device
|
pieces (i.e., usb_mark_last_busy()) use the usb_device structure
|
||||||
structure instead. Drivers need to keep this straight; they can call
|
instead. Drivers need to keep this straight; they can call
|
||||||
interface_to_usbdev() to find the device structure for a given
|
interface_to_usbdev() to find the device structure for a given
|
||||||
interface.
|
interface.
|
||||||
|
|
||||||
|
@@ -12,6 +12,7 @@ m5602 0402:5602 ALi Video Camera Controller
|
|||||||
spca501 040a:0002 Kodak DVC-325
|
spca501 040a:0002 Kodak DVC-325
|
||||||
spca500 040a:0300 Kodak EZ200
|
spca500 040a:0300 Kodak EZ200
|
||||||
zc3xx 041e:041e Creative WebCam Live!
|
zc3xx 041e:041e Creative WebCam Live!
|
||||||
|
ov519 041e:4003 Video Blaster WebCam Go Plus
|
||||||
spca500 041e:400a Creative PC-CAM 300
|
spca500 041e:400a Creative PC-CAM 300
|
||||||
sunplus 041e:400b Creative PC-CAM 600
|
sunplus 041e:400b Creative PC-CAM 600
|
||||||
sunplus 041e:4012 PC-Cam350
|
sunplus 041e:4012 PC-Cam350
|
||||||
@@ -168,10 +169,14 @@ sunplus 055f:c650 Mustek MDC5500Z
|
|||||||
zc3xx 055f:d003 Mustek WCam300A
|
zc3xx 055f:d003 Mustek WCam300A
|
||||||
zc3xx 055f:d004 Mustek WCam300 AN
|
zc3xx 055f:d004 Mustek WCam300 AN
|
||||||
conex 0572:0041 Creative Notebook cx11646
|
conex 0572:0041 Creative Notebook cx11646
|
||||||
|
ov519 05a9:0511 Video Blaster WebCam 3/WebCam Plus, D-Link USB Digital Video Camera
|
||||||
|
ov519 05a9:0518 Creative WebCam
|
||||||
ov519 05a9:0519 OV519 Microphone
|
ov519 05a9:0519 OV519 Microphone
|
||||||
ov519 05a9:0530 OmniVision
|
ov519 05a9:0530 OmniVision
|
||||||
|
ov519 05a9:2800 OmniVision SuperCAM
|
||||||
ov519 05a9:4519 Webcam Classic
|
ov519 05a9:4519 Webcam Classic
|
||||||
ov519 05a9:8519 OmniVision
|
ov519 05a9:8519 OmniVision
|
||||||
|
ov519 05a9:a511 D-Link USB Digital Video Camera
|
||||||
ov519 05a9:a518 D-Link DSB-C310 Webcam
|
ov519 05a9:a518 D-Link DSB-C310 Webcam
|
||||||
sunplus 05da:1018 Digital Dream Enigma 1.3
|
sunplus 05da:1018 Digital Dream Enigma 1.3
|
||||||
stk014 05e1:0893 Syntek DV4000
|
stk014 05e1:0893 Syntek DV4000
|
||||||
@@ -187,7 +192,7 @@ ov534 06f8:3002 Hercules Blog Webcam
|
|||||||
ov534 06f8:3003 Hercules Dualpix HD Weblog
|
ov534 06f8:3003 Hercules Dualpix HD Weblog
|
||||||
sonixj 06f8:3004 Hercules Classic Silver
|
sonixj 06f8:3004 Hercules Classic Silver
|
||||||
sonixj 06f8:3008 Hercules Deluxe Optical Glass
|
sonixj 06f8:3008 Hercules Deluxe Optical Glass
|
||||||
pac7311 06f8:3009 Hercules Classic Link
|
pac7302 06f8:3009 Hercules Classic Link
|
||||||
spca508 0733:0110 ViewQuest VQ110
|
spca508 0733:0110 ViewQuest VQ110
|
||||||
spca501 0733:0401 Intel Create and Share
|
spca501 0733:0401 Intel Create and Share
|
||||||
spca501 0733:0402 ViewQuest M318B
|
spca501 0733:0402 ViewQuest M318B
|
||||||
@@ -199,6 +204,7 @@ sunplus 0733:2221 Mercury Digital Pro 3.1p
|
|||||||
sunplus 0733:3261 Concord 3045 spca536a
|
sunplus 0733:3261 Concord 3045 spca536a
|
||||||
sunplus 0733:3281 Cyberpix S550V
|
sunplus 0733:3281 Cyberpix S550V
|
||||||
spca506 0734:043b 3DeMon USB Capture aka
|
spca506 0734:043b 3DeMon USB Capture aka
|
||||||
|
ov519 0813:0002 Dual Mode USB Camera Plus
|
||||||
spca500 084d:0003 D-Link DSC-350
|
spca500 084d:0003 D-Link DSC-350
|
||||||
spca500 08ca:0103 Aiptek PocketDV
|
spca500 08ca:0103 Aiptek PocketDV
|
||||||
sunplus 08ca:0104 Aiptek PocketDVII 1.3
|
sunplus 08ca:0104 Aiptek PocketDVII 1.3
|
||||||
@@ -236,15 +242,15 @@ pac7311 093a:2603 Philips SPC 500 NC
|
|||||||
pac7311 093a:2608 Trust WB-3300p
|
pac7311 093a:2608 Trust WB-3300p
|
||||||
pac7311 093a:260e Gigaware VGA PC Camera, Trust WB-3350p, SIGMA cam 2350
|
pac7311 093a:260e Gigaware VGA PC Camera, Trust WB-3350p, SIGMA cam 2350
|
||||||
pac7311 093a:260f SnakeCam
|
pac7311 093a:260f SnakeCam
|
||||||
pac7311 093a:2620 Apollo AC-905
|
pac7302 093a:2620 Apollo AC-905
|
||||||
pac7311 093a:2621 PAC731x
|
pac7302 093a:2621 PAC731x
|
||||||
pac7311 093a:2622 Genius Eye 312
|
pac7302 093a:2622 Genius Eye 312
|
||||||
pac7311 093a:2624 PAC7302
|
pac7302 093a:2624 PAC7302
|
||||||
pac7311 093a:2626 Labtec 2200
|
pac7302 093a:2626 Labtec 2200
|
||||||
pac7311 093a:2628 Genius iLook 300
|
pac7302 093a:2628 Genius iLook 300
|
||||||
pac7311 093a:2629 Genious iSlim 300
|
pac7302 093a:2629 Genious iSlim 300
|
||||||
pac7311 093a:262a Webcam 300k
|
pac7302 093a:262a Webcam 300k
|
||||||
pac7311 093a:262c Philips SPC 230 NC
|
pac7302 093a:262c Philips SPC 230 NC
|
||||||
jeilinj 0979:0280 Sakar 57379
|
jeilinj 0979:0280 Sakar 57379
|
||||||
zc3xx 0ac8:0302 Z-star Vimicro zc0302
|
zc3xx 0ac8:0302 Z-star Vimicro zc0302
|
||||||
vc032x 0ac8:0321 Vimicro generic vc0321
|
vc032x 0ac8:0321 Vimicro generic vc0321
|
||||||
@@ -259,6 +265,7 @@ vc032x 0ac8:c002 Sony embedded vimicro
|
|||||||
vc032x 0ac8:c301 Samsung Q1 Ultra Premium
|
vc032x 0ac8:c301 Samsung Q1 Ultra Premium
|
||||||
spca508 0af9:0010 Hama USB Sightcam 100
|
spca508 0af9:0010 Hama USB Sightcam 100
|
||||||
spca508 0af9:0011 Hama USB Sightcam 100
|
spca508 0af9:0011 Hama USB Sightcam 100
|
||||||
|
ov519 0b62:0059 iBOT2 Webcam
|
||||||
sonixb 0c45:6001 Genius VideoCAM NB
|
sonixb 0c45:6001 Genius VideoCAM NB
|
||||||
sonixb 0c45:6005 Microdia Sweex Mini Webcam
|
sonixb 0c45:6005 Microdia Sweex Mini Webcam
|
||||||
sonixb 0c45:6007 Sonix sn9c101 + Tas5110D
|
sonixb 0c45:6007 Sonix sn9c101 + Tas5110D
|
||||||
@@ -318,8 +325,10 @@ sn9c20x 0c45:62b3 PC Camera (SN9C202 + OV9655)
|
|||||||
sn9c20x 0c45:62bb PC Camera (SN9C202 + OV7660)
|
sn9c20x 0c45:62bb PC Camera (SN9C202 + OV7660)
|
||||||
sn9c20x 0c45:62bc PC Camera (SN9C202 + HV7131R)
|
sn9c20x 0c45:62bc PC Camera (SN9C202 + HV7131R)
|
||||||
sunplus 0d64:0303 Sunplus FashionCam DXG
|
sunplus 0d64:0303 Sunplus FashionCam DXG
|
||||||
|
ov519 0e96:c001 TRUST 380 USB2 SPACEC@M
|
||||||
etoms 102c:6151 Qcam Sangha CIF
|
etoms 102c:6151 Qcam Sangha CIF
|
||||||
etoms 102c:6251 Qcam xxxxxx VGA
|
etoms 102c:6251 Qcam xxxxxx VGA
|
||||||
|
ov519 1046:9967 W9967CF/W9968CF WebCam IC, Video Blaster WebCam Go
|
||||||
zc3xx 10fd:0128 Typhoon Webshot II USB 300k 0x0128
|
zc3xx 10fd:0128 Typhoon Webshot II USB 300k 0x0128
|
||||||
spca561 10fd:7e50 FlyCam Usb 100
|
spca561 10fd:7e50 FlyCam Usb 100
|
||||||
zc3xx 10fd:8050 Typhoon Webshot II USB 300k
|
zc3xx 10fd:8050 Typhoon Webshot II USB 300k
|
||||||
@@ -332,7 +341,12 @@ spca501 1776:501c Arowana 300K CMOS Camera
|
|||||||
t613 17a1:0128 TASCORP JPEG Webcam, NGS Cyclops
|
t613 17a1:0128 TASCORP JPEG Webcam, NGS Cyclops
|
||||||
vc032x 17ef:4802 Lenovo Vc0323+MI1310_SOC
|
vc032x 17ef:4802 Lenovo Vc0323+MI1310_SOC
|
||||||
pac207 2001:f115 D-Link DSB-C120
|
pac207 2001:f115 D-Link DSB-C120
|
||||||
|
sq905c 2770:9050 sq905c
|
||||||
|
sq905c 2770:905c DualCamera
|
||||||
|
sq905 2770:9120 Argus Digital Camera DC1512
|
||||||
|
sq905c 2770:913d sq905c
|
||||||
spca500 2899:012c Toptro Industrial
|
spca500 2899:012c Toptro Industrial
|
||||||
|
ov519 8020:ef04 ov519
|
||||||
spca508 8086:0110 Intel Easy PC Camera
|
spca508 8086:0110 Intel Easy PC Camera
|
||||||
spca500 8086:0630 Intel Pocket PC Camera
|
spca500 8086:0630 Intel Pocket PC Camera
|
||||||
spca506 99fa:8988 Grandtec V.cap
|
spca506 99fa:8988 Grandtec V.cap
|
||||||
|
157
Documentation/video4linux/sh_mobile_ceu_camera.txt
Normal file
157
Documentation/video4linux/sh_mobile_ceu_camera.txt
Normal file
@@ -0,0 +1,157 @@
|
|||||||
|
Cropping and Scaling algorithm, used in the sh_mobile_ceu_camera driver
|
||||||
|
=======================================================================
|
||||||
|
|
||||||
|
Terminology
|
||||||
|
-----------
|
||||||
|
|
||||||
|
sensor scales: horizontal and vertical scales, configured by the sensor driver
|
||||||
|
host scales: -"- host driver
|
||||||
|
combined scales: sensor_scale * host_scale
|
||||||
|
|
||||||
|
|
||||||
|
Generic scaling / cropping scheme
|
||||||
|
---------------------------------
|
||||||
|
|
||||||
|
-1--
|
||||||
|
|
|
||||||
|
-2-- -\
|
||||||
|
| --\
|
||||||
|
| --\
|
||||||
|
+-5-- -\ -- -3--
|
||||||
|
| ---\
|
||||||
|
| --- -4-- -\
|
||||||
|
| -\
|
||||||
|
| - -6--
|
||||||
|
|
|
||||||
|
| - -6'-
|
||||||
|
| -/
|
||||||
|
| --- -4'- -/
|
||||||
|
| ---/
|
||||||
|
+-5'- -/
|
||||||
|
| -- -3'-
|
||||||
|
| --/
|
||||||
|
| --/
|
||||||
|
-2'- -/
|
||||||
|
|
|
||||||
|
|
|
||||||
|
-1'-
|
||||||
|
|
||||||
|
Produced by user requests:
|
||||||
|
|
||||||
|
S_CROP(left / top = (5) - (1), width / height = (5') - (5))
|
||||||
|
S_FMT(width / height = (6') - (6))
|
||||||
|
|
||||||
|
Here:
|
||||||
|
|
||||||
|
(1) to (1') - whole max width or height
|
||||||
|
(1) to (2) - sensor cropped left or top
|
||||||
|
(2) to (2') - sensor cropped width or height
|
||||||
|
(3) to (3') - sensor scale
|
||||||
|
(3) to (4) - CEU cropped left or top
|
||||||
|
(4) to (4') - CEU cropped width or height
|
||||||
|
(5) to (5') - reverse sensor scale applied to CEU cropped width or height
|
||||||
|
(2) to (5) - reverse sensor scale applied to CEU cropped left or top
|
||||||
|
(6) to (6') - CEU scale - user window
|
||||||
|
|
||||||
|
|
||||||
|
S_FMT
|
||||||
|
-----
|
||||||
|
|
||||||
|
Do not touch input rectangle - it is already optimal.
|
||||||
|
|
||||||
|
1. Calculate current sensor scales:
|
||||||
|
|
||||||
|
scale_s = ((3') - (3)) / ((2') - (2))
|
||||||
|
|
||||||
|
2. Calculate "effective" input crop (sensor subwindow) - CEU crop scaled back at
|
||||||
|
current sensor scales onto input window - this is user S_CROP:
|
||||||
|
|
||||||
|
width_u = (5') - (5) = ((4') - (4)) * scale_s
|
||||||
|
|
||||||
|
3. Calculate new combined scales from "effective" input window to requested user
|
||||||
|
window:
|
||||||
|
|
||||||
|
scale_comb = width_u / ((6') - (6))
|
||||||
|
|
||||||
|
4. Calculate sensor output window by applying combined scales to real input
|
||||||
|
window:
|
||||||
|
|
||||||
|
width_s_out = ((2') - (2)) / scale_comb
|
||||||
|
|
||||||
|
5. Apply iterative sensor S_FMT for sensor output window.
|
||||||
|
|
||||||
|
subdev->video_ops->s_fmt(.width = width_s_out)
|
||||||
|
|
||||||
|
6. Retrieve sensor output window (g_fmt)
|
||||||
|
|
||||||
|
7. Calculate new sensor scales:
|
||||||
|
|
||||||
|
scale_s_new = ((3')_new - (3)_new) / ((2') - (2))
|
||||||
|
|
||||||
|
8. Calculate new CEU crop - apply sensor scales to previously calculated
|
||||||
|
"effective" crop:
|
||||||
|
|
||||||
|
width_ceu = (4')_new - (4)_new = width_u / scale_s_new
|
||||||
|
left_ceu = (4)_new - (3)_new = ((5) - (2)) / scale_s_new
|
||||||
|
|
||||||
|
9. Use CEU cropping to crop to the new window:
|
||||||
|
|
||||||
|
ceu_crop(.width = width_ceu, .left = left_ceu)
|
||||||
|
|
||||||
|
10. Use CEU scaling to scale to the requested user window:
|
||||||
|
|
||||||
|
scale_ceu = width_ceu / width
|
||||||
|
|
||||||
|
|
||||||
|
S_CROP
|
||||||
|
------
|
||||||
|
|
||||||
|
If old scale applied to new crop is invalid produce nearest new scale possible
|
||||||
|
|
||||||
|
1. Calculate current combined scales.
|
||||||
|
|
||||||
|
scale_comb = (((4') - (4)) / ((6') - (6))) * (((2') - (2)) / ((3') - (3)))
|
||||||
|
|
||||||
|
2. Apply iterative sensor S_CROP for new input window.
|
||||||
|
|
||||||
|
3. If old combined scales applied to new crop produce an impossible user window,
|
||||||
|
adjust scales to produce nearest possible window.
|
||||||
|
|
||||||
|
width_u_out = ((5') - (5)) / scale_comb
|
||||||
|
|
||||||
|
if (width_u_out > max)
|
||||||
|
scale_comb = ((5') - (5)) / max;
|
||||||
|
else if (width_u_out < min)
|
||||||
|
scale_comb = ((5') - (5)) / min;
|
||||||
|
|
||||||
|
4. Issue G_CROP to retrieve actual input window.
|
||||||
|
|
||||||
|
5. Using actual input window and calculated combined scales calculate sensor
|
||||||
|
target output window.
|
||||||
|
|
||||||
|
width_s_out = ((3') - (3)) = ((2') - (2)) / scale_comb
|
||||||
|
|
||||||
|
6. Apply iterative S_FMT for new sensor target output window.
|
||||||
|
|
||||||
|
7. Issue G_FMT to retrieve the actual sensor output window.
|
||||||
|
|
||||||
|
8. Calculate sensor scales.
|
||||||
|
|
||||||
|
scale_s = ((3') - (3)) / ((2') - (2))
|
||||||
|
|
||||||
|
9. Calculate sensor output subwindow to be cropped on CEU by applying sensor
|
||||||
|
scales to the requested window.
|
||||||
|
|
||||||
|
width_ceu = ((5') - (5)) / scale_s
|
||||||
|
|
||||||
|
10. Use CEU cropping for above calculated window.
|
||||||
|
|
||||||
|
11. Calculate CEU scales from sensor scales from results of (10) and user window
|
||||||
|
from (3)
|
||||||
|
|
||||||
|
scale_ceu = calc_scale(((5') - (5)), &width_u_out)
|
||||||
|
|
||||||
|
12. Apply CEU scales.
|
||||||
|
|
||||||
|
--
|
||||||
|
Author: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
|
@@ -561,6 +561,8 @@ video_device helper functions
|
|||||||
|
|
||||||
There are a few useful helper functions:
|
There are a few useful helper functions:
|
||||||
|
|
||||||
|
- file/video_device private data
|
||||||
|
|
||||||
You can set/get driver private data in the video_device struct using:
|
You can set/get driver private data in the video_device struct using:
|
||||||
|
|
||||||
void *video_get_drvdata(struct video_device *vdev);
|
void *video_get_drvdata(struct video_device *vdev);
|
||||||
@@ -575,8 +577,7 @@ struct video_device *video_devdata(struct file *file);
|
|||||||
|
|
||||||
returns the video_device belonging to the file struct.
|
returns the video_device belonging to the file struct.
|
||||||
|
|
||||||
The final helper function combines video_get_drvdata with
|
The video_drvdata function combines video_get_drvdata with video_devdata:
|
||||||
video_devdata:
|
|
||||||
|
|
||||||
void *video_drvdata(struct file *file);
|
void *video_drvdata(struct file *file);
|
||||||
|
|
||||||
@@ -584,6 +585,17 @@ You can go from a video_device struct to the v4l2_device struct using:
|
|||||||
|
|
||||||
struct v4l2_device *v4l2_dev = vdev->v4l2_dev;
|
struct v4l2_device *v4l2_dev = vdev->v4l2_dev;
|
||||||
|
|
||||||
|
- Device node name
|
||||||
|
|
||||||
|
The video_device node kernel name can be retrieved using
|
||||||
|
|
||||||
|
const char *video_device_node_name(struct video_device *vdev);
|
||||||
|
|
||||||
|
The name is used as a hint by userspace tools such as udev. The function
|
||||||
|
should be used where possible instead of accessing the video_device::num and
|
||||||
|
video_device::minor fields.
|
||||||
|
|
||||||
|
|
||||||
video buffer helper functions
|
video buffer helper functions
|
||||||
-----------------------------
|
-----------------------------
|
||||||
|
|
||||||
|
@@ -11,23 +11,21 @@ This optimization is more critical now as bigger and bigger physical memories
|
|||||||
(several GBs) are more readily available.
|
(several GBs) are more readily available.
|
||||||
|
|
||||||
Users can use the huge page support in Linux kernel by either using the mmap
|
Users can use the huge page support in Linux kernel by either using the mmap
|
||||||
system call or standard SYSv shared memory system calls (shmget, shmat).
|
system call or standard SYSV shared memory system calls (shmget, shmat).
|
||||||
|
|
||||||
First the Linux kernel needs to be built with the CONFIG_HUGETLBFS
|
First the Linux kernel needs to be built with the CONFIG_HUGETLBFS
|
||||||
(present under "File systems") and CONFIG_HUGETLB_PAGE (selected
|
(present under "File systems") and CONFIG_HUGETLB_PAGE (selected
|
||||||
automatically when CONFIG_HUGETLBFS is selected) configuration
|
automatically when CONFIG_HUGETLBFS is selected) configuration
|
||||||
options.
|
options.
|
||||||
|
|
||||||
The kernel built with huge page support should show the number of configured
|
The /proc/meminfo file provides information about the total number of
|
||||||
huge pages in the system by running the "cat /proc/meminfo" command.
|
persistent hugetlb pages in the kernel's huge page pool. It also displays
|
||||||
|
information about the number of free, reserved and surplus huge pages and the
|
||||||
|
default huge page size. The huge page size is needed for generating the
|
||||||
|
proper alignment and size of the arguments to system calls that map huge page
|
||||||
|
regions.
|
||||||
|
|
||||||
/proc/meminfo also provides information about the total number of hugetlb
|
The output of "cat /proc/meminfo" will include lines like:
|
||||||
pages configured in the kernel. It also displays information about the
|
|
||||||
number of free hugetlb pages at any time. It also displays information about
|
|
||||||
the configured huge page size - this is needed for generating the proper
|
|
||||||
alignment and size of the arguments to the above system calls.
|
|
||||||
|
|
||||||
The output of "cat /proc/meminfo" will have lines like:
|
|
||||||
|
|
||||||
.....
|
.....
|
||||||
HugePages_Total: vvv
|
HugePages_Total: vvv
|
||||||
@@ -53,59 +51,63 @@ HugePages_Surp is short for "surplus," and is the number of huge pages in
|
|||||||
/proc/filesystems should also show a filesystem of type "hugetlbfs" configured
|
/proc/filesystems should also show a filesystem of type "hugetlbfs" configured
|
||||||
in the kernel.
|
in the kernel.
|
||||||
|
|
||||||
/proc/sys/vm/nr_hugepages indicates the current number of configured hugetlb
|
/proc/sys/vm/nr_hugepages indicates the current number of "persistent" huge
|
||||||
pages in the kernel. Super user can dynamically request more (or free some
|
pages in the kernel's huge page pool. "Persistent" huge pages will be
|
||||||
pre-configured) huge pages.
|
returned to the huge page pool when freed by a task. A user with root
|
||||||
The allocation (or deallocation) of hugetlb pages is possible only if there are
|
privileges can dynamically allocate more or free some persistent huge pages
|
||||||
enough physically contiguous free pages in system (freeing of huge pages is
|
by increasing or decreasing the value of 'nr_hugepages'.
|
||||||
possible only if there are enough hugetlb pages free that can be transferred
|
|
||||||
back to regular memory pool).
|
|
||||||
|
|
||||||
Pages that are used as hugetlb pages are reserved inside the kernel and cannot
|
Pages that are used as huge pages are reserved inside the kernel and cannot
|
||||||
be used for other purposes.
|
be used for other purposes. Huge pages cannot be swapped out under
|
||||||
|
memory pressure.
|
||||||
|
|
||||||
Once the kernel with Hugetlb page support is built and running, a user can
|
Once a number of huge pages have been pre-allocated to the kernel huge page
|
||||||
use either the mmap system call or shared memory system calls to start using
|
pool, a user with appropriate privilege can use either the mmap system call
|
||||||
the huge pages. It is required that the system administrator preallocate
|
or shared memory system calls to use the huge pages. See the discussion of
|
||||||
enough memory for huge page purposes.
|
Using Huge Pages, below.
|
||||||
|
|
||||||
The administrator can preallocate huge pages on the kernel boot command line by
|
The administrator can allocate persistent huge pages on the kernel boot
|
||||||
specifying the "hugepages=N" parameter, where 'N' = the number of huge pages
|
command line by specifying the "hugepages=N" parameter, where 'N' = the
|
||||||
requested. This is the most reliable method for preallocating huge pages as
|
number of huge pages requested. This is the most reliable method of
|
||||||
memory has not yet become fragmented.
|
allocating huge pages as memory has not yet become fragmented.
|
||||||
|
|
||||||
Some platforms support multiple huge page sizes. To preallocate huge pages
|
Some platforms support multiple huge page sizes. To allocate huge pages
|
||||||
of a specific size, one must preceed the huge pages boot command parameters
|
of a specific size, one must preceed the huge pages boot command parameters
|
||||||
with a huge page size selection parameter "hugepagesz=<size>". <size> must
|
with a huge page size selection parameter "hugepagesz=<size>". <size> must
|
||||||
be specified in bytes with optional scale suffix [kKmMgG]. The default huge
|
be specified in bytes with optional scale suffix [kKmMgG]. The default huge
|
||||||
page size may be selected with the "default_hugepagesz=<size>" boot parameter.
|
page size may be selected with the "default_hugepagesz=<size>" boot parameter.
|
||||||
|
|
||||||
/proc/sys/vm/nr_hugepages indicates the current number of configured [default
|
When multiple huge page sizes are supported, /proc/sys/vm/nr_hugepages
|
||||||
size] hugetlb pages in the kernel. Super user can dynamically request more
|
indicates the current number of pre-allocated huge pages of the default size.
|
||||||
(or free some pre-configured) huge pages.
|
Thus, one can use the following command to dynamically allocate/deallocate
|
||||||
|
default sized persistent huge pages:
|
||||||
Use the following command to dynamically allocate/deallocate default sized
|
|
||||||
huge pages:
|
|
||||||
|
|
||||||
echo 20 > /proc/sys/vm/nr_hugepages
|
echo 20 > /proc/sys/vm/nr_hugepages
|
||||||
|
|
||||||
This command will try to configure 20 default sized huge pages in the system.
|
This command will try to adjust the number of default sized huge pages in the
|
||||||
|
huge page pool to 20, allocating or freeing huge pages, as required.
|
||||||
|
|
||||||
On a NUMA platform, the kernel will attempt to distribute the huge page pool
|
On a NUMA platform, the kernel will attempt to distribute the huge page pool
|
||||||
over the all on-line nodes. These huge pages, allocated when nr_hugepages
|
over all the set of allowed nodes specified by the NUMA memory policy of the
|
||||||
is increased, are called "persistent huge pages".
|
task that modifies nr_hugepages. The default for the allowed nodes--when the
|
||||||
|
task has default memory policy--is all on-line nodes with memory. Allowed
|
||||||
|
nodes with insufficient available, contiguous memory for a huge page will be
|
||||||
|
silently skipped when allocating persistent huge pages. See the discussion
|
||||||
|
below of the interaction of task memory policy, cpusets and per node attributes
|
||||||
|
with the allocation and freeing of persistent huge pages.
|
||||||
|
|
||||||
The success or failure of huge page allocation depends on the amount of
|
The success or failure of huge page allocation depends on the amount of
|
||||||
physically contiguous memory that is preset in system at the time of the
|
physically contiguous memory that is present in system at the time of the
|
||||||
allocation attempt. If the kernel is unable to allocate huge pages from
|
allocation attempt. If the kernel is unable to allocate huge pages from
|
||||||
some nodes in a NUMA system, it will attempt to make up the difference by
|
some nodes in a NUMA system, it will attempt to make up the difference by
|
||||||
allocating extra pages on other nodes with sufficient available contiguous
|
allocating extra pages on other nodes with sufficient available contiguous
|
||||||
memory, if any.
|
memory, if any.
|
||||||
|
|
||||||
System administrators may want to put this command in one of the local rc init
|
System administrators may want to put this command in one of the local rc
|
||||||
files. This will enable the kernel to request huge pages early in the boot
|
init files. This will enable the kernel to allocate huge pages early in
|
||||||
process when the possibility of getting physical contiguous pages is still
|
the boot process when the possibility of getting physical contiguous pages
|
||||||
very high. Administrators can verify the number of huge pages actually
|
is still very high. Administrators can verify the number of huge pages
|
||||||
allocated by checking the sysctl or meminfo. To check the per node
|
actually allocated by checking the sysctl or meminfo. To check the per node
|
||||||
distribution of huge pages in a NUMA system, use:
|
distribution of huge pages in a NUMA system, use:
|
||||||
|
|
||||||
cat /sys/devices/system/node/node*/meminfo | fgrep Huge
|
cat /sys/devices/system/node/node*/meminfo | fgrep Huge
|
||||||
@@ -113,45 +115,47 @@ distribution of huge pages in a NUMA system, use:
|
|||||||
/proc/sys/vm/nr_overcommit_hugepages specifies how large the pool of
|
/proc/sys/vm/nr_overcommit_hugepages specifies how large the pool of
|
||||||
huge pages can grow, if more huge pages than /proc/sys/vm/nr_hugepages are
|
huge pages can grow, if more huge pages than /proc/sys/vm/nr_hugepages are
|
||||||
requested by applications. Writing any non-zero value into this file
|
requested by applications. Writing any non-zero value into this file
|
||||||
indicates that the hugetlb subsystem is allowed to try to obtain "surplus"
|
indicates that the hugetlb subsystem is allowed to try to obtain that
|
||||||
huge pages from the buddy allocator, when the normal pool is exhausted. As
|
number of "surplus" huge pages from the kernel's normal page pool, when the
|
||||||
these surplus huge pages go out of use, they are freed back to the buddy
|
persistent huge page pool is exhausted. As these surplus huge pages become
|
||||||
allocator.
|
unused, they are freed back to the kernel's normal page pool.
|
||||||
|
|
||||||
When increasing the huge page pool size via nr_hugepages, any surplus
|
When increasing the huge page pool size via nr_hugepages, any existing surplus
|
||||||
pages will first be promoted to persistent huge pages. Then, additional
|
pages will first be promoted to persistent huge pages. Then, additional
|
||||||
huge pages will be allocated, if necessary and if possible, to fulfill
|
huge pages will be allocated, if necessary and if possible, to fulfill
|
||||||
the new huge page pool size.
|
the new persistent huge page pool size.
|
||||||
|
|
||||||
The administrator may shrink the pool of preallocated huge pages for
|
The administrator may shrink the pool of persistent huge pages for
|
||||||
the default huge page size by setting the nr_hugepages sysctl to a
|
the default huge page size by setting the nr_hugepages sysctl to a
|
||||||
smaller value. The kernel will attempt to balance the freeing of huge pages
|
smaller value. The kernel will attempt to balance the freeing of huge pages
|
||||||
across all on-line nodes. Any free huge pages on the selected nodes will
|
across all nodes in the memory policy of the task modifying nr_hugepages.
|
||||||
be freed back to the buddy allocator.
|
Any free huge pages on the selected nodes will be freed back to the kernel's
|
||||||
|
normal page pool.
|
||||||
|
|
||||||
Caveat: Shrinking the pool via nr_hugepages such that it becomes less
|
Caveat: Shrinking the persistent huge page pool via nr_hugepages such that
|
||||||
than the number of huge pages in use will convert the balance to surplus
|
it becomes less than the number of huge pages in use will convert the balance
|
||||||
huge pages even if it would exceed the overcommit value. As long as
|
of the in-use huge pages to surplus huge pages. This will occur even if
|
||||||
this condition holds, however, no more surplus huge pages will be
|
the number of surplus pages it would exceed the overcommit value. As long as
|
||||||
allowed on the system until one of the two sysctls are increased
|
this condition holds--that is, until nr_hugepages+nr_overcommit_hugepages is
|
||||||
sufficiently, or the surplus huge pages go out of use and are freed.
|
increased sufficiently, or the surplus huge pages go out of use and are freed--
|
||||||
|
no more surplus huge pages will be allowed to be allocated.
|
||||||
|
|
||||||
With support for multiple huge page pools at run-time available, much of
|
With support for multiple huge page pools at run-time available, much of
|
||||||
the huge page userspace interface has been duplicated in sysfs. The above
|
the huge page userspace interface in /proc/sys/vm has been duplicated in sysfs.
|
||||||
information applies to the default huge page size which will be
|
The /proc interfaces discussed above have been retained for backwards
|
||||||
controlled by the /proc interfaces for backwards compatibility. The root
|
compatibility. The root huge page control directory in sysfs is:
|
||||||
huge page control directory in sysfs is:
|
|
||||||
|
|
||||||
/sys/kernel/mm/hugepages
|
/sys/kernel/mm/hugepages
|
||||||
|
|
||||||
For each huge page size supported by the running kernel, a subdirectory
|
For each huge page size supported by the running kernel, a subdirectory
|
||||||
will exist, of the form
|
will exist, of the form:
|
||||||
|
|
||||||
hugepages-${size}kB
|
hugepages-${size}kB
|
||||||
|
|
||||||
Inside each of these directories, the same set of files will exist:
|
Inside each of these directories, the same set of files will exist:
|
||||||
|
|
||||||
nr_hugepages
|
nr_hugepages
|
||||||
|
nr_hugepages_mempolicy
|
||||||
nr_overcommit_hugepages
|
nr_overcommit_hugepages
|
||||||
free_hugepages
|
free_hugepages
|
||||||
resv_hugepages
|
resv_hugepages
|
||||||
@@ -159,6 +163,102 @@ Inside each of these directories, the same set of files will exist:
|
|||||||
|
|
||||||
which function as described above for the default huge page-sized case.
|
which function as described above for the default huge page-sized case.
|
||||||
|
|
||||||
|
|
||||||
|
Interaction of Task Memory Policy with Huge Page Allocation/Freeing
|
||||||
|
|
||||||
|
Whether huge pages are allocated and freed via the /proc interface or
|
||||||
|
the /sysfs interface using the nr_hugepages_mempolicy attribute, the NUMA
|
||||||
|
nodes from which huge pages are allocated or freed are controlled by the
|
||||||
|
NUMA memory policy of the task that modifies the nr_hugepages_mempolicy
|
||||||
|
sysctl or attribute. When the nr_hugepages attribute is used, mempolicy
|
||||||
|
is ignored.
|
||||||
|
|
||||||
|
The recommended method to allocate or free huge pages to/from the kernel
|
||||||
|
huge page pool, using the nr_hugepages example above, is:
|
||||||
|
|
||||||
|
numactl --interleave <node-list> echo 20 \
|
||||||
|
>/proc/sys/vm/nr_hugepages_mempolicy
|
||||||
|
|
||||||
|
or, more succinctly:
|
||||||
|
|
||||||
|
numactl -m <node-list> echo 20 >/proc/sys/vm/nr_hugepages_mempolicy
|
||||||
|
|
||||||
|
This will allocate or free abs(20 - nr_hugepages) to or from the nodes
|
||||||
|
specified in <node-list>, depending on whether number of persistent huge pages
|
||||||
|
is initially less than or greater than 20, respectively. No huge pages will be
|
||||||
|
allocated nor freed on any node not included in the specified <node-list>.
|
||||||
|
|
||||||
|
When adjusting the persistent hugepage count via nr_hugepages_mempolicy, any
|
||||||
|
memory policy mode--bind, preferred, local or interleave--may be used. The
|
||||||
|
resulting effect on persistent huge page allocation is as follows:
|
||||||
|
|
||||||
|
1) Regardless of mempolicy mode [see Documentation/vm/numa_memory_policy.txt],
|
||||||
|
persistent huge pages will be distributed across the node or nodes
|
||||||
|
specified in the mempolicy as if "interleave" had been specified.
|
||||||
|
However, if a node in the policy does not contain sufficient contiguous
|
||||||
|
memory for a huge page, the allocation will not "fallback" to the nearest
|
||||||
|
neighbor node with sufficient contiguous memory. To do this would cause
|
||||||
|
undesirable imbalance in the distribution of the huge page pool, or
|
||||||
|
possibly, allocation of persistent huge pages on nodes not allowed by
|
||||||
|
the task's memory policy.
|
||||||
|
|
||||||
|
2) One or more nodes may be specified with the bind or interleave policy.
|
||||||
|
If more than one node is specified with the preferred policy, only the
|
||||||
|
lowest numeric id will be used. Local policy will select the node where
|
||||||
|
the task is running at the time the nodes_allowed mask is constructed.
|
||||||
|
For local policy to be deterministic, the task must be bound to a cpu or
|
||||||
|
cpus in a single node. Otherwise, the task could be migrated to some
|
||||||
|
other node at any time after launch and the resulting node will be
|
||||||
|
indeterminate. Thus, local policy is not very useful for this purpose.
|
||||||
|
Any of the other mempolicy modes may be used to specify a single node.
|
||||||
|
|
||||||
|
3) The nodes allowed mask will be derived from any non-default task mempolicy,
|
||||||
|
whether this policy was set explicitly by the task itself or one of its
|
||||||
|
ancestors, such as numactl. This means that if the task is invoked from a
|
||||||
|
shell with non-default policy, that policy will be used. One can specify a
|
||||||
|
node list of "all" with numactl --interleave or --membind [-m] to achieve
|
||||||
|
interleaving over all nodes in the system or cpuset.
|
||||||
|
|
||||||
|
4) Any task mempolicy specifed--e.g., using numactl--will be constrained by
|
||||||
|
the resource limits of any cpuset in which the task runs. Thus, there will
|
||||||
|
be no way for a task with non-default policy running in a cpuset with a
|
||||||
|
subset of the system nodes to allocate huge pages outside the cpuset
|
||||||
|
without first moving to a cpuset that contains all of the desired nodes.
|
||||||
|
|
||||||
|
5) Boot-time huge page allocation attempts to distribute the requested number
|
||||||
|
of huge pages over all on-lines nodes with memory.
|
||||||
|
|
||||||
|
Per Node Hugepages Attributes
|
||||||
|
|
||||||
|
A subset of the contents of the root huge page control directory in sysfs,
|
||||||
|
described above, will be replicated under each the system device of each
|
||||||
|
NUMA node with memory in:
|
||||||
|
|
||||||
|
/sys/devices/system/node/node[0-9]*/hugepages/
|
||||||
|
|
||||||
|
Under this directory, the subdirectory for each supported huge page size
|
||||||
|
contains the following attribute files:
|
||||||
|
|
||||||
|
nr_hugepages
|
||||||
|
free_hugepages
|
||||||
|
surplus_hugepages
|
||||||
|
|
||||||
|
The free_' and surplus_' attribute files are read-only. They return the number
|
||||||
|
of free and surplus [overcommitted] huge pages, respectively, on the parent
|
||||||
|
node.
|
||||||
|
|
||||||
|
The nr_hugepages attribute returns the total number of huge pages on the
|
||||||
|
specified node. When this attribute is written, the number of persistent huge
|
||||||
|
pages on the parent node will be adjusted to the specified value, if sufficient
|
||||||
|
resources exist, regardless of the task's mempolicy or cpuset constraints.
|
||||||
|
|
||||||
|
Note that the number of overcommit and reserve pages remain global quantities,
|
||||||
|
as we don't know until fault time, when the faulting task's mempolicy is
|
||||||
|
applied, from which node the huge page allocation will be attempted.
|
||||||
|
|
||||||
|
|
||||||
|
Using Huge Pages
|
||||||
|
|
||||||
If the user applications are going to request huge pages using mmap system
|
If the user applications are going to request huge pages using mmap system
|
||||||
call, then it is required that system administrator mount a file system of
|
call, then it is required that system administrator mount a file system of
|
||||||
type hugetlbfs:
|
type hugetlbfs:
|
||||||
@@ -206,9 +306,11 @@ map_hugetlb.c.
|
|||||||
* requesting huge pages.
|
* requesting huge pages.
|
||||||
*
|
*
|
||||||
* For the ia64 architecture, the Linux kernel reserves Region number 4 for
|
* For the ia64 architecture, the Linux kernel reserves Region number 4 for
|
||||||
* huge pages. That means the addresses starting with 0x800000... will need
|
* huge pages. That means that if one requires a fixed address, a huge page
|
||||||
* to be specified. Specifying a fixed address is not required on ppc64,
|
* aligned address starting with 0x800000... will be required. If a fixed
|
||||||
* i386 or x86_64.
|
* address is not required, the kernel will select an address in the proper
|
||||||
|
* range.
|
||||||
|
* Other architectures, such as ppc64, i386 or x86_64 are not so constrained.
|
||||||
*
|
*
|
||||||
* Note: The default shared memory limit is quite low on many kernels,
|
* Note: The default shared memory limit is quite low on many kernels,
|
||||||
* you may need to increase it via:
|
* you may need to increase it via:
|
||||||
@@ -237,14 +339,8 @@ map_hugetlb.c.
|
|||||||
|
|
||||||
#define dprintf(x) printf(x)
|
#define dprintf(x) printf(x)
|
||||||
|
|
||||||
/* Only ia64 requires this */
|
#define ADDR (void *)(0x0UL) /* let kernel choose address */
|
||||||
#ifdef __ia64__
|
|
||||||
#define ADDR (void *)(0x8000000000000000UL)
|
|
||||||
#define SHMAT_FLAGS (SHM_RND)
|
|
||||||
#else
|
|
||||||
#define ADDR (void *)(0x0UL)
|
|
||||||
#define SHMAT_FLAGS (0)
|
#define SHMAT_FLAGS (0)
|
||||||
#endif
|
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
@@ -302,10 +398,12 @@ int main(void)
|
|||||||
* example, the app is requesting memory of size 256MB that is backed by
|
* example, the app is requesting memory of size 256MB that is backed by
|
||||||
* huge pages.
|
* huge pages.
|
||||||
*
|
*
|
||||||
* For ia64 architecture, Linux kernel reserves Region number 4 for huge pages.
|
* For the ia64 architecture, the Linux kernel reserves Region number 4 for
|
||||||
* That means the addresses starting with 0x800000... will need to be
|
* huge pages. That means that if one requires a fixed address, a huge page
|
||||||
* specified. Specifying a fixed address is not required on ppc64, i386
|
* aligned address starting with 0x800000... will be required. If a fixed
|
||||||
* or x86_64.
|
* address is not required, the kernel will select an address in the proper
|
||||||
|
* range.
|
||||||
|
* Other architectures, such as ppc64, i386 or x86_64 are not so constrained.
|
||||||
*/
|
*/
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -317,14 +415,8 @@ int main(void)
|
|||||||
#define LENGTH (256UL*1024*1024)
|
#define LENGTH (256UL*1024*1024)
|
||||||
#define PROTECTION (PROT_READ | PROT_WRITE)
|
#define PROTECTION (PROT_READ | PROT_WRITE)
|
||||||
|
|
||||||
/* Only ia64 requires this */
|
#define ADDR (void *)(0x0UL) /* let kernel choose address */
|
||||||
#ifdef __ia64__
|
|
||||||
#define ADDR (void *)(0x8000000000000000UL)
|
|
||||||
#define FLAGS (MAP_SHARED | MAP_FIXED)
|
|
||||||
#else
|
|
||||||
#define ADDR (void *)(0x0UL)
|
|
||||||
#define FLAGS (MAP_SHARED)
|
#define FLAGS (MAP_SHARED)
|
||||||
#endif
|
|
||||||
|
|
||||||
void check_bytes(char *addr)
|
void check_bytes(char *addr)
|
||||||
{
|
{
|
||||||
|
@@ -92,16 +92,62 @@ PR_MCE_KILL_GET
|
|||||||
|
|
||||||
Testing:
|
Testing:
|
||||||
|
|
||||||
madvise(MADV_POISON, ....)
|
madvise(MADV_HWPOISON, ....)
|
||||||
(as root)
|
(as root)
|
||||||
Poison a page in the process for testing
|
Poison a page in the process for testing
|
||||||
|
|
||||||
|
|
||||||
hwpoison-inject module through debugfs
|
hwpoison-inject module through debugfs
|
||||||
/sys/debug/hwpoison/corrupt-pfn
|
|
||||||
|
|
||||||
Inject hwpoison fault at PFN echoed into this file
|
/sys/debug/hwpoison/
|
||||||
|
|
||||||
|
corrupt-pfn
|
||||||
|
|
||||||
|
Inject hwpoison fault at PFN echoed into this file. This does
|
||||||
|
some early filtering to avoid corrupted unintended pages in test suites.
|
||||||
|
|
||||||
|
unpoison-pfn
|
||||||
|
|
||||||
|
Software-unpoison page at PFN echoed into this file. This
|
||||||
|
way a page can be reused again.
|
||||||
|
This only works for Linux injected failures, not for real
|
||||||
|
memory failures.
|
||||||
|
|
||||||
|
Note these injection interfaces are not stable and might change between
|
||||||
|
kernel versions
|
||||||
|
|
||||||
|
corrupt-filter-dev-major
|
||||||
|
corrupt-filter-dev-minor
|
||||||
|
|
||||||
|
Only handle memory failures to pages associated with the file system defined
|
||||||
|
by block device major/minor. -1U is the wildcard value.
|
||||||
|
This should be only used for testing with artificial injection.
|
||||||
|
|
||||||
|
corrupt-filter-memcg
|
||||||
|
|
||||||
|
Limit injection to pages owned by memgroup. Specified by inode number
|
||||||
|
of the memcg.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
mkdir /cgroup/hwpoison
|
||||||
|
|
||||||
|
usemem -m 100 -s 1000 &
|
||||||
|
echo `jobs -p` > /cgroup/hwpoison/tasks
|
||||||
|
|
||||||
|
memcg_ino=$(ls -id /cgroup/hwpoison | cut -f1 -d' ')
|
||||||
|
echo $memcg_ino > /debug/hwpoison/corrupt-filter-memcg
|
||||||
|
|
||||||
|
page-types -p `pidof init` --hwpoison # shall do nothing
|
||||||
|
page-types -p `pidof usemem` --hwpoison # poison its pages
|
||||||
|
|
||||||
|
corrupt-filter-flags-mask
|
||||||
|
corrupt-filter-flags-value
|
||||||
|
|
||||||
|
When specified, only poison pages if ((page_flags & mask) == value).
|
||||||
|
This allows stress testing of many kinds of pages. The page_flags
|
||||||
|
are the same as in /proc/kpageflags. The flag bits are defined in
|
||||||
|
include/linux/kernel-page-flags.h and documented in
|
||||||
|
Documentation/vm/pagemap.txt
|
||||||
|
|
||||||
Architecture specific MCE injector
|
Architecture specific MCE injector
|
||||||
|
|
||||||
|
@@ -16,9 +16,9 @@ by sharing the data common between them. But it can be useful to any
|
|||||||
application which generates many instances of the same data.
|
application which generates many instances of the same data.
|
||||||
|
|
||||||
KSM only merges anonymous (private) pages, never pagecache (file) pages.
|
KSM only merges anonymous (private) pages, never pagecache (file) pages.
|
||||||
KSM's merged pages are at present locked into kernel memory for as long
|
KSM's merged pages were originally locked into kernel memory, but can now
|
||||||
as they are shared: so cannot be swapped out like the user pages they
|
be swapped out just like other user pages (but sharing is broken when they
|
||||||
replace (but swapping KSM pages should follow soon in a later release).
|
are swapped back in: ksmd must rediscover their identity and merge again).
|
||||||
|
|
||||||
KSM only operates on those areas of address space which an application
|
KSM only operates on those areas of address space which an application
|
||||||
has advised to be likely candidates for merging, by using the madvise(2)
|
has advised to be likely candidates for merging, by using the madvise(2)
|
||||||
@@ -44,20 +44,12 @@ includes unmapped gaps (though working on the intervening mapped areas),
|
|||||||
and might fail with EAGAIN if not enough memory for internal structures.
|
and might fail with EAGAIN if not enough memory for internal structures.
|
||||||
|
|
||||||
Applications should be considerate in their use of MADV_MERGEABLE,
|
Applications should be considerate in their use of MADV_MERGEABLE,
|
||||||
restricting its use to areas likely to benefit. KSM's scans may use
|
restricting its use to areas likely to benefit. KSM's scans may use a lot
|
||||||
a lot of processing power, and its kernel-resident pages are a limited
|
of processing power: some installations will disable KSM for that reason.
|
||||||
resource. Some installations will disable KSM for these reasons.
|
|
||||||
|
|
||||||
The KSM daemon is controlled by sysfs files in /sys/kernel/mm/ksm/,
|
The KSM daemon is controlled by sysfs files in /sys/kernel/mm/ksm/,
|
||||||
readable by all but writable only by root:
|
readable by all but writable only by root:
|
||||||
|
|
||||||
max_kernel_pages - set to maximum number of kernel pages that KSM may use
|
|
||||||
e.g. "echo 100000 > /sys/kernel/mm/ksm/max_kernel_pages"
|
|
||||||
Value 0 imposes no limit on the kernel pages KSM may use;
|
|
||||||
but note that any process using MADV_MERGEABLE can cause
|
|
||||||
KSM to allocate these pages, unswappable until it exits.
|
|
||||||
Default: quarter of memory (chosen to not pin too much)
|
|
||||||
|
|
||||||
pages_to_scan - how many present pages to scan before ksmd goes to sleep
|
pages_to_scan - how many present pages to scan before ksmd goes to sleep
|
||||||
e.g. "echo 100 > /sys/kernel/mm/ksm/pages_to_scan"
|
e.g. "echo 100 > /sys/kernel/mm/ksm/pages_to_scan"
|
||||||
Default: 100 (chosen for demonstration purposes)
|
Default: 100 (chosen for demonstration purposes)
|
||||||
@@ -75,7 +67,7 @@ run - set 0 to stop ksmd from running but keep merged pages,
|
|||||||
|
|
||||||
The effectiveness of KSM and MADV_MERGEABLE is shown in /sys/kernel/mm/ksm/:
|
The effectiveness of KSM and MADV_MERGEABLE is shown in /sys/kernel/mm/ksm/:
|
||||||
|
|
||||||
pages_shared - how many shared unswappable kernel pages KSM is using
|
pages_shared - how many shared pages are being used
|
||||||
pages_sharing - how many more sites are sharing them i.e. how much saved
|
pages_sharing - how many more sites are sharing them i.e. how much saved
|
||||||
pages_unshared - how many pages unique but repeatedly checked for merging
|
pages_unshared - how many pages unique but repeatedly checked for merging
|
||||||
pages_volatile - how many pages changing too fast to be placed in a tree
|
pages_volatile - how many pages changing too fast to be placed in a tree
|
||||||
@@ -87,4 +79,4 @@ pages_volatile embraces several different kinds of activity, but a high
|
|||||||
proportion there would also indicate poor use of madvise MADV_MERGEABLE.
|
proportion there would also indicate poor use of madvise MADV_MERGEABLE.
|
||||||
|
|
||||||
Izik Eidus,
|
Izik Eidus,
|
||||||
Hugh Dickins, 24 Sept 2009
|
Hugh Dickins, 17 Nov 2009
|
||||||
|
@@ -1,11 +1,22 @@
|
|||||||
/*
|
/*
|
||||||
* page-types: Tool for querying page flags
|
* page-types: Tool for querying page flags
|
||||||
*
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License as published by the Free
|
||||||
|
* Software Foundation; version 2.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should find a copy of v2 of the GNU General Public License somewhere on
|
||||||
|
* your Linux system; if not, write to the Free Software Foundation, Inc., 59
|
||||||
|
* Temple Place, Suite 330, Boston, MA 02111-1307 USA.
|
||||||
|
*
|
||||||
* Copyright (C) 2009 Intel corporation
|
* Copyright (C) 2009 Intel corporation
|
||||||
*
|
*
|
||||||
* Authors: Wu Fengguang <fengguang.wu@intel.com>
|
* Authors: Wu Fengguang <fengguang.wu@intel.com>
|
||||||
*
|
|
||||||
* Released under the General Public License (GPL).
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define _LARGEFILE64_SOURCE
|
#define _LARGEFILE64_SOURCE
|
||||||
@@ -100,7 +111,7 @@
|
|||||||
#define BIT(name) (1ULL << KPF_##name)
|
#define BIT(name) (1ULL << KPF_##name)
|
||||||
#define BITS_COMPOUND (BIT(COMPOUND_HEAD) | BIT(COMPOUND_TAIL))
|
#define BITS_COMPOUND (BIT(COMPOUND_HEAD) | BIT(COMPOUND_TAIL))
|
||||||
|
|
||||||
static char *page_flag_names[] = {
|
static const char *page_flag_names[] = {
|
||||||
[KPF_LOCKED] = "L:locked",
|
[KPF_LOCKED] = "L:locked",
|
||||||
[KPF_ERROR] = "E:error",
|
[KPF_ERROR] = "E:error",
|
||||||
[KPF_REFERENCED] = "R:referenced",
|
[KPF_REFERENCED] = "R:referenced",
|
||||||
@@ -173,7 +184,7 @@ static int kpageflags_fd;
|
|||||||
static int opt_hwpoison;
|
static int opt_hwpoison;
|
||||||
static int opt_unpoison;
|
static int opt_unpoison;
|
||||||
|
|
||||||
static char *hwpoison_debug_fs = "/debug/hwpoison";
|
static const char hwpoison_debug_fs[] = "/debug/hwpoison";
|
||||||
static int hwpoison_inject_fd;
|
static int hwpoison_inject_fd;
|
||||||
static int hwpoison_forget_fd;
|
static int hwpoison_forget_fd;
|
||||||
|
|
||||||
@@ -560,7 +571,7 @@ static void walk_pfn(unsigned long voffset,
|
|||||||
{
|
{
|
||||||
uint64_t buf[KPAGEFLAGS_BATCH];
|
uint64_t buf[KPAGEFLAGS_BATCH];
|
||||||
unsigned long batch;
|
unsigned long batch;
|
||||||
unsigned long pages;
|
long pages;
|
||||||
unsigned long i;
|
unsigned long i;
|
||||||
|
|
||||||
while (count) {
|
while (count) {
|
||||||
@@ -673,30 +684,35 @@ static void usage(void)
|
|||||||
|
|
||||||
printf(
|
printf(
|
||||||
"page-types [options]\n"
|
"page-types [options]\n"
|
||||||
" -r|--raw Raw mode, for kernel developers\n"
|
" -r|--raw Raw mode, for kernel developers\n"
|
||||||
" -a|--addr addr-spec Walk a range of pages\n"
|
" -d|--describe flags Describe flags\n"
|
||||||
" -b|--bits bits-spec Walk pages with specified bits\n"
|
" -a|--addr addr-spec Walk a range of pages\n"
|
||||||
" -p|--pid pid Walk process address space\n"
|
" -b|--bits bits-spec Walk pages with specified bits\n"
|
||||||
|
" -p|--pid pid Walk process address space\n"
|
||||||
#if 0 /* planned features */
|
#if 0 /* planned features */
|
||||||
" -f|--file filename Walk file address space\n"
|
" -f|--file filename Walk file address space\n"
|
||||||
#endif
|
#endif
|
||||||
" -l|--list Show page details in ranges\n"
|
" -l|--list Show page details in ranges\n"
|
||||||
" -L|--list-each Show page details one by one\n"
|
" -L|--list-each Show page details one by one\n"
|
||||||
" -N|--no-summary Don't show summay info\n"
|
" -N|--no-summary Don't show summay info\n"
|
||||||
" -X|--hwpoison hwpoison pages\n"
|
" -X|--hwpoison hwpoison pages\n"
|
||||||
" -x|--unpoison unpoison pages\n"
|
" -x|--unpoison unpoison pages\n"
|
||||||
" -h|--help Show this usage message\n"
|
" -h|--help Show this usage message\n"
|
||||||
|
"flags:\n"
|
||||||
|
" 0x10 bitfield format, e.g.\n"
|
||||||
|
" anon bit-name, e.g.\n"
|
||||||
|
" 0x10,anon comma-separated list, e.g.\n"
|
||||||
"addr-spec:\n"
|
"addr-spec:\n"
|
||||||
" N one page at offset N (unit: pages)\n"
|
" N one page at offset N (unit: pages)\n"
|
||||||
" N+M pages range from N to N+M-1\n"
|
" N+M pages range from N to N+M-1\n"
|
||||||
" N,M pages range from N to M-1\n"
|
" N,M pages range from N to M-1\n"
|
||||||
" N, pages range from N to end\n"
|
" N, pages range from N to end\n"
|
||||||
" ,M pages range from 0 to M-1\n"
|
" ,M pages range from 0 to M-1\n"
|
||||||
"bits-spec:\n"
|
"bits-spec:\n"
|
||||||
" bit1,bit2 (flags & (bit1|bit2)) != 0\n"
|
" bit1,bit2 (flags & (bit1|bit2)) != 0\n"
|
||||||
" bit1,bit2=bit1 (flags & (bit1|bit2)) == bit1\n"
|
" bit1,bit2=bit1 (flags & (bit1|bit2)) == bit1\n"
|
||||||
" bit1,~bit2 (flags & (bit1|bit2)) == bit1\n"
|
" bit1,~bit2 (flags & (bit1|bit2)) == bit1\n"
|
||||||
" =bit1,bit2 flags == (bit1|bit2)\n"
|
" =bit1,bit2 flags == (bit1|bit2)\n"
|
||||||
"bit-names:\n"
|
"bit-names:\n"
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -884,13 +900,23 @@ static void parse_bits_mask(const char *optarg)
|
|||||||
add_bits_filter(mask, bits);
|
add_bits_filter(mask, bits);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void describe_flags(const char *optarg)
|
||||||
|
{
|
||||||
|
uint64_t flags = parse_flag_names(optarg, 0);
|
||||||
|
|
||||||
static struct option opts[] = {
|
printf("0x%016llx\t%s\t%s\n",
|
||||||
|
(unsigned long long)flags,
|
||||||
|
page_flag_name(flags),
|
||||||
|
page_flag_longname(flags));
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct option opts[] = {
|
||||||
{ "raw" , 0, NULL, 'r' },
|
{ "raw" , 0, NULL, 'r' },
|
||||||
{ "pid" , 1, NULL, 'p' },
|
{ "pid" , 1, NULL, 'p' },
|
||||||
{ "file" , 1, NULL, 'f' },
|
{ "file" , 1, NULL, 'f' },
|
||||||
{ "addr" , 1, NULL, 'a' },
|
{ "addr" , 1, NULL, 'a' },
|
||||||
{ "bits" , 1, NULL, 'b' },
|
{ "bits" , 1, NULL, 'b' },
|
||||||
|
{ "describe" , 1, NULL, 'd' },
|
||||||
{ "list" , 0, NULL, 'l' },
|
{ "list" , 0, NULL, 'l' },
|
||||||
{ "list-each" , 0, NULL, 'L' },
|
{ "list-each" , 0, NULL, 'L' },
|
||||||
{ "no-summary", 0, NULL, 'N' },
|
{ "no-summary", 0, NULL, 'N' },
|
||||||
@@ -907,7 +933,7 @@ int main(int argc, char *argv[])
|
|||||||
page_size = getpagesize();
|
page_size = getpagesize();
|
||||||
|
|
||||||
while ((c = getopt_long(argc, argv,
|
while ((c = getopt_long(argc, argv,
|
||||||
"rp:f:a:b:lLNXxh", opts, NULL)) != -1) {
|
"rp:f:a:b:d:lLNXxh", opts, NULL)) != -1) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case 'r':
|
case 'r':
|
||||||
opt_raw = 1;
|
opt_raw = 1;
|
||||||
@@ -924,6 +950,9 @@ int main(int argc, char *argv[])
|
|||||||
case 'b':
|
case 'b':
|
||||||
parse_bits_mask(optarg);
|
parse_bits_mask(optarg);
|
||||||
break;
|
break;
|
||||||
|
case 'd':
|
||||||
|
describe_flags(optarg);
|
||||||
|
exit(0);
|
||||||
case 'l':
|
case 'l':
|
||||||
opt_list = 1;
|
opt_list = 1;
|
||||||
break;
|
break;
|
||||||
|
4
Kbuild
4
Kbuild
@@ -8,7 +8,7 @@
|
|||||||
#####
|
#####
|
||||||
# 1) Generate bounds.h
|
# 1) Generate bounds.h
|
||||||
|
|
||||||
bounds-file := include/linux/bounds.h
|
bounds-file := include/generated/bounds.h
|
||||||
|
|
||||||
always := $(bounds-file)
|
always := $(bounds-file)
|
||||||
targets := $(bounds-file) kernel/bounds.s
|
targets := $(bounds-file) kernel/bounds.s
|
||||||
@@ -43,7 +43,7 @@ $(obj)/$(bounds-file): kernel/bounds.s Kbuild
|
|||||||
# 2) Generate asm-offsets.h
|
# 2) Generate asm-offsets.h
|
||||||
#
|
#
|
||||||
|
|
||||||
offsets-file := include/asm/asm-offsets.h
|
offsets-file := include/generated/asm-offsets.h
|
||||||
|
|
||||||
always += $(offsets-file)
|
always += $(offsets-file)
|
||||||
targets += $(offsets-file)
|
targets += $(offsets-file)
|
||||||
|
78
MAINTAINERS
78
MAINTAINERS
@@ -801,6 +801,19 @@ L: openmoko-kernel@lists.openmoko.org (subscribers-only)
|
|||||||
W: http://wiki.openmoko.org/wiki/Neo_FreeRunner
|
W: http://wiki.openmoko.org/wiki/Neo_FreeRunner
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
|
ARM/QUALCOMM MSM MACHINE SUPPORT
|
||||||
|
M: David Brown <davidb@codeaurora.org>
|
||||||
|
M: Daniel Walker <dwalker@codeaurora.org>
|
||||||
|
M: Bryan Huntsman <bryanh@codeaurora.org>
|
||||||
|
F: arch/arm/mach-msm/
|
||||||
|
F: drivers/video/msm/
|
||||||
|
F: drivers/mmc/host/msm_sdcc.c
|
||||||
|
F: drivers/mmc/host/msm_sdcc.h
|
||||||
|
F: drivers/serial/msm_serial.h
|
||||||
|
F: drivers/serial/msm_serial.c
|
||||||
|
T: git git://codeaurora.org/quic/kernel/dwalker/linux-msm.git
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
ARM/TOSA MACHINE SUPPORT
|
ARM/TOSA MACHINE SUPPORT
|
||||||
M: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
|
M: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
|
||||||
M: Dirk Opfer <dirk@opfer-online.de>
|
M: Dirk Opfer <dirk@opfer-online.de>
|
||||||
@@ -822,13 +835,13 @@ F: arch/arm/mach-pxa/palmte2.c
|
|||||||
F: arch/arm/mach-pxa/include/mach/palmtc.h
|
F: arch/arm/mach-pxa/include/mach/palmtc.h
|
||||||
F: arch/arm/mach-pxa/palmtc.c
|
F: arch/arm/mach-pxa/palmtc.c
|
||||||
|
|
||||||
ARM/PALM TREO 680 SUPPORT
|
ARM/PALM TREO SUPPORT
|
||||||
M: Tomas Cech <sleep_walker@suse.cz>
|
M: Tomas Cech <sleep_walker@suse.cz>
|
||||||
L: linux-arm-kernel@lists.infradead.org
|
L: linux-arm-kernel@lists.infradead.org
|
||||||
W: http://hackndev.com
|
W: http://hackndev.com
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/arm/mach-pxa/include/mach/treo680.h
|
F: arch/arm/mach-pxa/include/mach/palmtreo.h
|
||||||
F: arch/arm/mach-pxa/treo680.c
|
F: arch/arm/mach-pxa/palmtreo.c
|
||||||
|
|
||||||
ARM/PALMZ72 SUPPORT
|
ARM/PALMZ72 SUPPORT
|
||||||
M: Sergey Lapin <slapin@ossfans.org>
|
M: Sergey Lapin <slapin@ossfans.org>
|
||||||
@@ -1469,8 +1482,8 @@ F: include/linux/coda*.h
|
|||||||
|
|
||||||
COMMON INTERNET FILE SYSTEM (CIFS)
|
COMMON INTERNET FILE SYSTEM (CIFS)
|
||||||
M: Steve French <sfrench@samba.org>
|
M: Steve French <sfrench@samba.org>
|
||||||
L: linux-cifs-client@lists.samba.org
|
L: linux-cifs-client@lists.samba.org (moderated for non-subscribers)
|
||||||
L: samba-technical@lists.samba.org
|
L: samba-technical@lists.samba.org (moderated for non-subscribers)
|
||||||
W: http://linux-cifs.samba.org/
|
W: http://linux-cifs.samba.org/
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6.git
|
||||||
S: Supported
|
S: Supported
|
||||||
@@ -2364,6 +2377,15 @@ W: http://www.kernel.org/pub/linux/kernel/people/fseidel/hdaps/
|
|||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/hwmon/hdaps.c
|
F: drivers/hwmon/hdaps.c
|
||||||
|
|
||||||
|
HWPOISON MEMORY FAILURE HANDLING
|
||||||
|
M: Andi Kleen <andi@firstfloor.org>
|
||||||
|
L: linux-mm@kvack.org
|
||||||
|
L: linux-kernel@vger.kernel.org
|
||||||
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/ak/linux-mce-2.6.git hwpoison
|
||||||
|
S: Maintained
|
||||||
|
F: mm/memory-failure.c
|
||||||
|
F: mm/hwpoison-inject.c
|
||||||
|
|
||||||
HYPERVISOR VIRTUAL CONSOLE DRIVER
|
HYPERVISOR VIRTUAL CONSOLE DRIVER
|
||||||
L: linuxppc-dev@ozlabs.org
|
L: linuxppc-dev@ozlabs.org
|
||||||
S: Odd Fixes
|
S: Odd Fixes
|
||||||
@@ -3068,8 +3090,11 @@ S: Maintained
|
|||||||
F: fs/autofs4/
|
F: fs/autofs4/
|
||||||
|
|
||||||
KERNEL BUILD
|
KERNEL BUILD
|
||||||
|
M: Michal Marek <mmarek@suse.cz>
|
||||||
|
T: git git://repo.or.cz/linux-kbuild.git for-next
|
||||||
|
T: git git://repo.or.cz/linux-kbuild.git for-linus
|
||||||
L: linux-kbuild@vger.kernel.org
|
L: linux-kbuild@vger.kernel.org
|
||||||
S: Orphan
|
S: Maintained
|
||||||
F: Documentation/kbuild/
|
F: Documentation/kbuild/
|
||||||
F: Makefile
|
F: Makefile
|
||||||
F: scripts/Makefile.*
|
F: scripts/Makefile.*
|
||||||
@@ -3111,7 +3136,6 @@ L: kvm@vger.kernel.org
|
|||||||
W: http://kvm.qumranet.com
|
W: http://kvm.qumranet.com
|
||||||
S: Supported
|
S: Supported
|
||||||
F: arch/x86/include/asm/svm.h
|
F: arch/x86/include/asm/svm.h
|
||||||
F: arch/x86/kvm/kvm_svm.h
|
|
||||||
F: arch/x86/kvm/svm.c
|
F: arch/x86/kvm/svm.c
|
||||||
|
|
||||||
KERNEL VIRTUAL MACHINE (KVM) FOR POWERPC
|
KERNEL VIRTUAL MACHINE (KVM) FOR POWERPC
|
||||||
@@ -3247,6 +3271,7 @@ LINUX FOR IBM pSERIES (RS/6000)
|
|||||||
M: Paul Mackerras <paulus@au.ibm.com>
|
M: Paul Mackerras <paulus@au.ibm.com>
|
||||||
W: http://www.ibm.com/linux/ltc/projects/ppc
|
W: http://www.ibm.com/linux/ltc/projects/ppc
|
||||||
S: Supported
|
S: Supported
|
||||||
|
F: arch/powerpc/boot/rs6000.h
|
||||||
|
|
||||||
LINUX FOR POWERPC (32-BIT AND 64-BIT)
|
LINUX FOR POWERPC (32-BIT AND 64-BIT)
|
||||||
M: Benjamin Herrenschmidt <benh@kernel.crashing.org>
|
M: Benjamin Herrenschmidt <benh@kernel.crashing.org>
|
||||||
@@ -3255,18 +3280,24 @@ W: http://www.penguinppc.org/
|
|||||||
L: linuxppc-dev@ozlabs.org
|
L: linuxppc-dev@ozlabs.org
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc.git
|
||||||
S: Supported
|
S: Supported
|
||||||
|
F: Documentation/powerpc/
|
||||||
|
F: arch/powerpc/
|
||||||
|
|
||||||
LINUX FOR POWER MACINTOSH
|
LINUX FOR POWER MACINTOSH
|
||||||
M: Benjamin Herrenschmidt <benh@kernel.crashing.org>
|
M: Benjamin Herrenschmidt <benh@kernel.crashing.org>
|
||||||
W: http://www.penguinppc.org/
|
W: http://www.penguinppc.org/
|
||||||
L: linuxppc-dev@ozlabs.org
|
L: linuxppc-dev@ozlabs.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
F: arch/powerpc/platforms/powermac/
|
||||||
|
F: drivers/macintosh/
|
||||||
|
|
||||||
LINUX FOR POWERPC EMBEDDED MPC5XXX
|
LINUX FOR POWERPC EMBEDDED MPC5XXX
|
||||||
M: Grant Likely <grant.likely@secretlab.ca>
|
M: Grant Likely <grant.likely@secretlab.ca>
|
||||||
L: linuxppc-dev@ozlabs.org
|
L: linuxppc-dev@ozlabs.org
|
||||||
T: git git://git.secretlab.ca/git/linux-2.6.git
|
T: git git://git.secretlab.ca/git/linux-2.6.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
F: arch/powerpc/platforms/512x/
|
||||||
|
F: arch/powerpc/platforms/52xx/
|
||||||
|
|
||||||
LINUX FOR POWERPC EMBEDDED PPC4XX
|
LINUX FOR POWERPC EMBEDDED PPC4XX
|
||||||
M: Josh Boyer <jwboyer@linux.vnet.ibm.com>
|
M: Josh Boyer <jwboyer@linux.vnet.ibm.com>
|
||||||
@@ -3275,6 +3306,8 @@ W: http://www.penguinppc.org/
|
|||||||
L: linuxppc-dev@ozlabs.org
|
L: linuxppc-dev@ozlabs.org
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jwboyer/powerpc-4xx.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jwboyer/powerpc-4xx.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
F: arch/powerpc/platforms/40x/
|
||||||
|
F: arch/powerpc/platforms/44x/
|
||||||
|
|
||||||
LINUX FOR POWERPC EMBEDDED XILINX VIRTEX
|
LINUX FOR POWERPC EMBEDDED XILINX VIRTEX
|
||||||
M: Grant Likely <grant.likely@secretlab.ca>
|
M: Grant Likely <grant.likely@secretlab.ca>
|
||||||
@@ -3282,6 +3315,8 @@ W: http://wiki.secretlab.ca/index.php/Linux_on_Xilinx_Virtex
|
|||||||
L: linuxppc-dev@ozlabs.org
|
L: linuxppc-dev@ozlabs.org
|
||||||
T: git git://git.secretlab.ca/git/linux-2.6.git
|
T: git git://git.secretlab.ca/git/linux-2.6.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
F: arch/powerpc/*/*virtex*
|
||||||
|
F: arch/powerpc/*/*/*virtex*
|
||||||
|
|
||||||
LINUX FOR POWERPC EMBEDDED PPC8XX
|
LINUX FOR POWERPC EMBEDDED PPC8XX
|
||||||
M: Vitaly Bordug <vitb@kernel.crashing.org>
|
M: Vitaly Bordug <vitb@kernel.crashing.org>
|
||||||
@@ -3295,12 +3330,16 @@ M: Kumar Gala <galak@kernel.crashing.org>
|
|||||||
W: http://www.penguinppc.org/
|
W: http://www.penguinppc.org/
|
||||||
L: linuxppc-dev@ozlabs.org
|
L: linuxppc-dev@ozlabs.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
F: arch/powerpc/platforms/83xx/
|
||||||
|
|
||||||
LINUX FOR POWERPC PA SEMI PWRFICIENT
|
LINUX FOR POWERPC PA SEMI PWRFICIENT
|
||||||
M: Olof Johansson <olof@lixom.net>
|
M: Olof Johansson <olof@lixom.net>
|
||||||
W: http://www.pasemi.com/
|
W: http://www.pasemi.com/
|
||||||
L: linuxppc-dev@ozlabs.org
|
L: linuxppc-dev@ozlabs.org
|
||||||
S: Supported
|
S: Supported
|
||||||
|
F: arch/powerpc/platforms/pasemi/
|
||||||
|
F: drivers/*/*pasemi*
|
||||||
|
F: drivers/*/*/*pasemi*
|
||||||
|
|
||||||
LINUX SECURITY MODULE (LSM) FRAMEWORK
|
LINUX SECURITY MODULE (LSM) FRAMEWORK
|
||||||
M: Chris Wright <chrisw@sous-sol.org>
|
M: Chris Wright <chrisw@sous-sol.org>
|
||||||
@@ -5052,6 +5091,7 @@ F: drivers/char/specialix*
|
|||||||
|
|
||||||
SPI SUBSYSTEM
|
SPI SUBSYSTEM
|
||||||
M: David Brownell <dbrownell@users.sourceforge.net>
|
M: David Brownell <dbrownell@users.sourceforge.net>
|
||||||
|
M: Grant Likely <grant.likely@secretlab.ca>
|
||||||
L: spi-devel-general@lists.sourceforge.net
|
L: spi-devel-general@lists.sourceforge.net
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: Documentation/spi/
|
F: Documentation/spi/
|
||||||
@@ -5394,6 +5434,12 @@ F: drivers/uwb/*
|
|||||||
F: include/linux/uwb.h
|
F: include/linux/uwb.h
|
||||||
F: include/linux/uwb/
|
F: include/linux/uwb/
|
||||||
|
|
||||||
|
UNIFDEF
|
||||||
|
M: Tony Finch <dot@dotat.at>
|
||||||
|
W: http://dotat.at/prog/unifdef
|
||||||
|
S: Maintained
|
||||||
|
F: scripts/unifdef.c
|
||||||
|
|
||||||
UNIFORM CDROM DRIVER
|
UNIFORM CDROM DRIVER
|
||||||
M: Jens Axboe <axboe@kernel.dk>
|
M: Jens Axboe <axboe@kernel.dk>
|
||||||
W: http://www.kernel.dk
|
W: http://www.kernel.dk
|
||||||
@@ -5426,10 +5472,9 @@ S: Supported
|
|||||||
F: drivers/block/ub.c
|
F: drivers/block/ub.c
|
||||||
|
|
||||||
USB CDC ETHERNET DRIVER
|
USB CDC ETHERNET DRIVER
|
||||||
M: Greg Kroah-Hartman <greg@kroah.com>
|
M: Oliver Neukum <oliver@neukum.name>
|
||||||
L: linux-usb@vger.kernel.org
|
L: linux-usb@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
W: http://www.kroah.com/linux-usb/
|
|
||||||
F: drivers/net/usb/cdc_*.c
|
F: drivers/net/usb/cdc_*.c
|
||||||
F: include/linux/usb/cdc.h
|
F: include/linux/usb/cdc.h
|
||||||
|
|
||||||
@@ -5680,9 +5725,11 @@ S: Maintained
|
|||||||
F: drivers/net/wireless/rndis_wlan.c
|
F: drivers/net/wireless/rndis_wlan.c
|
||||||
|
|
||||||
USB XHCI DRIVER
|
USB XHCI DRIVER
|
||||||
M: Sarah Sharp <sarah.a.sharp@intel.com>
|
M: Sarah Sharp <sarah.a.sharp@linux.intel.com>
|
||||||
L: linux-usb@vger.kernel.org
|
L: linux-usb@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
|
F: drivers/usb/host/xhci*
|
||||||
|
F: drivers/usb/host/pci-quirks*
|
||||||
|
|
||||||
USB ZC0301 DRIVER
|
USB ZC0301 DRIVER
|
||||||
M: Luca Risolia <luca.risolia@studio.unibo.it>
|
M: Luca Risolia <luca.risolia@studio.unibo.it>
|
||||||
@@ -5944,6 +5991,7 @@ M: Mark Brown <broonie@opensource.wolfsonmicro.com>
|
|||||||
T: git git://opensource.wolfsonmicro.com/linux-2.6-audioplus
|
T: git git://opensource.wolfsonmicro.com/linux-2.6-audioplus
|
||||||
W: http://opensource.wolfsonmicro.com/node/8
|
W: http://opensource.wolfsonmicro.com/node/8
|
||||||
S: Supported
|
S: Supported
|
||||||
|
F: Documentation/hwmon/wm83??
|
||||||
F: drivers/leds/leds-wm83*.c
|
F: drivers/leds/leds-wm83*.c
|
||||||
F: drivers/mfd/wm8*.c
|
F: drivers/mfd/wm8*.c
|
||||||
F: drivers/power/wm83*.c
|
F: drivers/power/wm83*.c
|
||||||
@@ -5953,14 +6001,14 @@ F: drivers/video/backlight/wm83*_bl.c
|
|||||||
F: drivers/watchdog/wm83*_wdt.c
|
F: drivers/watchdog/wm83*_wdt.c
|
||||||
F: include/linux/mfd/wm831x/
|
F: include/linux/mfd/wm831x/
|
||||||
F: include/linux/mfd/wm8350/
|
F: include/linux/mfd/wm8350/
|
||||||
F: include/linux/mfd/wm8400/
|
F: include/linux/mfd/wm8400*
|
||||||
F: sound/soc/codecs/wm8350.c
|
F: sound/soc/codecs/wm8350.*
|
||||||
F: sound/soc/codecs/wm8400.c
|
F: sound/soc/codecs/wm8400.*
|
||||||
|
|
||||||
X.25 NETWORK LAYER
|
X.25 NETWORK LAYER
|
||||||
M: Henner Eisen <eis@baty.hanse.de>
|
M: Andrew Hendry <andrew.hendry@gmail.com>
|
||||||
L: linux-x25@vger.kernel.org
|
L: linux-x25@vger.kernel.org
|
||||||
S: Maintained
|
S: Odd Fixes
|
||||||
F: Documentation/networking/x25*
|
F: Documentation/networking/x25*
|
||||||
F: include/net/x25*
|
F: include/net/x25*
|
||||||
F: net/x25/
|
F: net/x25/
|
||||||
|
100
Makefile
100
Makefile
@@ -1,7 +1,7 @@
|
|||||||
VERSION = 2
|
VERSION = 2
|
||||||
PATCHLEVEL = 6
|
PATCHLEVEL = 6
|
||||||
SUBLEVEL = 32
|
SUBLEVEL = 33
|
||||||
EXTRAVERSION =
|
EXTRAVERSION = -rc1
|
||||||
NAME = Man-Eating Seals of Antiquity
|
NAME = Man-Eating Seals of Antiquity
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
@@ -341,10 +341,9 @@ CFLAGS_GCOV = -fprofile-arcs -ftest-coverage
|
|||||||
|
|
||||||
# Use LINUXINCLUDE when you must reference the include/ directory.
|
# Use LINUXINCLUDE when you must reference the include/ directory.
|
||||||
# Needed to be compatible with the O= option
|
# Needed to be compatible with the O= option
|
||||||
LINUXINCLUDE := -Iinclude \
|
LINUXINCLUDE := -I$(srctree)/arch/$(hdr-arch)/include -Iinclude \
|
||||||
$(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include) \
|
$(if $(KBUILD_SRC), -I$(srctree)/include) \
|
||||||
-I$(srctree)/arch/$(hdr-arch)/include \
|
-include include/generated/autoconf.h
|
||||||
-include include/linux/autoconf.h
|
|
||||||
|
|
||||||
KBUILD_CPPFLAGS := -D__KERNEL__
|
KBUILD_CPPFLAGS := -D__KERNEL__
|
||||||
|
|
||||||
@@ -472,7 +471,7 @@ ifeq ($(KBUILD_EXTMOD),)
|
|||||||
# Carefully list dependencies so we do not try to build scripts twice
|
# Carefully list dependencies so we do not try to build scripts twice
|
||||||
# in parallel
|
# in parallel
|
||||||
PHONY += scripts
|
PHONY += scripts
|
||||||
scripts: scripts_basic include/config/auto.conf
|
scripts: scripts_basic include/config/auto.conf include/config/tristate.conf
|
||||||
$(Q)$(MAKE) $(build)=$(@)
|
$(Q)$(MAKE) $(build)=$(@)
|
||||||
|
|
||||||
# Objects we will link into vmlinux / subdirs we need to visit
|
# Objects we will link into vmlinux / subdirs we need to visit
|
||||||
@@ -499,18 +498,18 @@ $(KCONFIG_CONFIG) include/config/auto.conf.cmd: ;
|
|||||||
# with it and forgot to run make oldconfig.
|
# with it and forgot to run make oldconfig.
|
||||||
# if auto.conf.cmd is missing then we are probably in a cleaned tree so
|
# if auto.conf.cmd is missing then we are probably in a cleaned tree so
|
||||||
# we execute the config step to be sure to catch updated Kconfig files
|
# we execute the config step to be sure to catch updated Kconfig files
|
||||||
include/config/auto.conf: $(KCONFIG_CONFIG) include/config/auto.conf.cmd
|
include/config/%.conf: $(KCONFIG_CONFIG) include/config/auto.conf.cmd
|
||||||
$(Q)$(MAKE) -f $(srctree)/Makefile silentoldconfig
|
$(Q)$(MAKE) -f $(srctree)/Makefile silentoldconfig
|
||||||
else
|
else
|
||||||
# external modules needs include/linux/autoconf.h and include/config/auto.conf
|
# external modules needs include/generated/autoconf.h and include/config/auto.conf
|
||||||
# but do not care if they are up-to-date. Use auto.conf to trigger the test
|
# but do not care if they are up-to-date. Use auto.conf to trigger the test
|
||||||
PHONY += include/config/auto.conf
|
PHONY += include/config/auto.conf
|
||||||
|
|
||||||
include/config/auto.conf:
|
include/config/auto.conf:
|
||||||
$(Q)test -e include/linux/autoconf.h -a -e $@ || ( \
|
$(Q)test -e include/generated/autoconf.h -a -e $@ || ( \
|
||||||
echo; \
|
echo; \
|
||||||
echo " ERROR: Kernel configuration is invalid."; \
|
echo " ERROR: Kernel configuration is invalid."; \
|
||||||
echo " include/linux/autoconf.h or $@ are missing."; \
|
echo " include/generated/autoconf.h or $@ are missing.";\
|
||||||
echo " Run 'make oldconfig && make prepare' on kernel src to fix it."; \
|
echo " Run 'make oldconfig && make prepare' on kernel src to fix it."; \
|
||||||
echo; \
|
echo; \
|
||||||
/bin/false)
|
/bin/false)
|
||||||
@@ -884,6 +883,9 @@ $(sort $(vmlinux-init) $(vmlinux-main)) $(vmlinux-lds): $(vmlinux-dirs) ;
|
|||||||
PHONY += $(vmlinux-dirs)
|
PHONY += $(vmlinux-dirs)
|
||||||
$(vmlinux-dirs): prepare scripts
|
$(vmlinux-dirs): prepare scripts
|
||||||
$(Q)$(MAKE) $(build)=$@
|
$(Q)$(MAKE) $(build)=$@
|
||||||
|
ifdef CONFIG_MODULES
|
||||||
|
$(Q)$(MAKE) $(modbuiltin)=$@
|
||||||
|
endif
|
||||||
|
|
||||||
# Build the kernel release string
|
# Build the kernel release string
|
||||||
#
|
#
|
||||||
@@ -962,7 +964,6 @@ PHONY += prepare archprepare prepare0 prepare1 prepare2 prepare3
|
|||||||
# prepare3 is used to check if we are building in a separate output directory,
|
# prepare3 is used to check if we are building in a separate output directory,
|
||||||
# and if so do:
|
# and if so do:
|
||||||
# 1) Check that make has not been executed in the kernel src $(srctree)
|
# 1) Check that make has not been executed in the kernel src $(srctree)
|
||||||
# 2) Create the include2 directory, used for the second asm symlink
|
|
||||||
prepare3: include/config/kernel.release
|
prepare3: include/config/kernel.release
|
||||||
ifneq ($(KBUILD_SRC),)
|
ifneq ($(KBUILD_SRC),)
|
||||||
@$(kecho) ' Using $(srctree) as source for kernel'
|
@$(kecho) ' Using $(srctree) as source for kernel'
|
||||||
@@ -971,17 +972,13 @@ ifneq ($(KBUILD_SRC),)
|
|||||||
echo " in the '$(srctree)' directory.";\
|
echo " in the '$(srctree)' directory.";\
|
||||||
/bin/false; \
|
/bin/false; \
|
||||||
fi;
|
fi;
|
||||||
$(Q)if [ ! -d include2 ]; then \
|
|
||||||
mkdir -p include2; \
|
|
||||||
ln -fsn $(srctree)/include/asm-$(SRCARCH) include2/asm; \
|
|
||||||
fi
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# prepare2 creates a makefile if using a separate output directory
|
# prepare2 creates a makefile if using a separate output directory
|
||||||
prepare2: prepare3 outputmakefile
|
prepare2: prepare3 outputmakefile
|
||||||
|
|
||||||
prepare1: prepare2 include/linux/version.h include/linux/utsrelease.h \
|
prepare1: prepare2 include/linux/version.h include/generated/utsrelease.h \
|
||||||
include/asm include/config/auto.conf
|
include/config/auto.conf
|
||||||
$(cmd_crmodverdir)
|
$(cmd_crmodverdir)
|
||||||
|
|
||||||
archprepare: prepare1 scripts_basic
|
archprepare: prepare1 scripts_basic
|
||||||
@@ -993,42 +990,6 @@ prepare0: archprepare FORCE
|
|||||||
# All the preparing..
|
# All the preparing..
|
||||||
prepare: prepare0
|
prepare: prepare0
|
||||||
|
|
||||||
# The asm symlink changes when $(ARCH) changes.
|
|
||||||
# Detect this and ask user to run make mrproper
|
|
||||||
# If asm is a stale symlink (point to dir that does not exist) remove it
|
|
||||||
define check-symlink
|
|
||||||
set -e; \
|
|
||||||
if [ -L include/asm ]; then \
|
|
||||||
asmlink=`readlink include/asm | cut -d '-' -f 2`; \
|
|
||||||
if [ "$$asmlink" != "$(SRCARCH)" ]; then \
|
|
||||||
echo "ERROR: the symlink $@ points to asm-$$asmlink but asm-$(SRCARCH) was expected"; \
|
|
||||||
echo " set ARCH or save .config and run 'make mrproper' to fix it"; \
|
|
||||||
exit 1; \
|
|
||||||
fi; \
|
|
||||||
test -e $$asmlink || rm include/asm; \
|
|
||||||
elif [ -d include/asm ]; then \
|
|
||||||
echo "ERROR: $@ is a directory but a symlink was expected";\
|
|
||||||
exit 1; \
|
|
||||||
fi
|
|
||||||
endef
|
|
||||||
|
|
||||||
# We create the target directory of the symlink if it does
|
|
||||||
# not exist so the test in check-symlink works and we have a
|
|
||||||
# directory for generated filesas used by some architectures.
|
|
||||||
define create-symlink
|
|
||||||
if [ ! -L include/asm ]; then \
|
|
||||||
$(kecho) ' SYMLINK $@ -> include/asm-$(SRCARCH)'; \
|
|
||||||
if [ ! -d include/asm-$(SRCARCH) ]; then \
|
|
||||||
mkdir -p include/asm-$(SRCARCH); \
|
|
||||||
fi; \
|
|
||||||
ln -fsn asm-$(SRCARCH) $@; \
|
|
||||||
fi
|
|
||||||
endef
|
|
||||||
|
|
||||||
include/asm: FORCE
|
|
||||||
$(Q)$(check-symlink)
|
|
||||||
$(Q)$(create-symlink)
|
|
||||||
|
|
||||||
# Generate some files
|
# Generate some files
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
@@ -1053,7 +1014,7 @@ endef
|
|||||||
include/linux/version.h: $(srctree)/Makefile FORCE
|
include/linux/version.h: $(srctree)/Makefile FORCE
|
||||||
$(call filechk,version.h)
|
$(call filechk,version.h)
|
||||||
|
|
||||||
include/linux/utsrelease.h: include/config/kernel.release FORCE
|
include/generated/utsrelease.h: include/config/kernel.release FORCE
|
||||||
$(call filechk,utsrelease.h)
|
$(call filechk,utsrelease.h)
|
||||||
|
|
||||||
PHONY += headerdep
|
PHONY += headerdep
|
||||||
@@ -1083,11 +1044,6 @@ firmware_install: FORCE
|
|||||||
export INSTALL_HDR_PATH = $(objtree)/usr
|
export INSTALL_HDR_PATH = $(objtree)/usr
|
||||||
|
|
||||||
hdr-inst := -rR -f $(srctree)/scripts/Makefile.headersinst obj
|
hdr-inst := -rR -f $(srctree)/scripts/Makefile.headersinst obj
|
||||||
# Find out where the Kbuild file is located to support
|
|
||||||
# arch/$(ARCH)/include/asm
|
|
||||||
hdr-dir = $(strip \
|
|
||||||
$(if $(wildcard $(srctree)/arch/$(hdr-arch)/include/asm/Kbuild), \
|
|
||||||
arch/$(hdr-arch)/include/asm, include/asm-$(hdr-arch)))
|
|
||||||
|
|
||||||
# If we do an all arch process set dst to asm-$(hdr-arch)
|
# If we do an all arch process set dst to asm-$(hdr-arch)
|
||||||
hdr-dst = $(if $(KBUILD_HEADERS), dst=include/asm-$(hdr-arch), dst=include/asm)
|
hdr-dst = $(if $(KBUILD_HEADERS), dst=include/asm-$(hdr-arch), dst=include/asm)
|
||||||
@@ -1102,10 +1058,10 @@ headers_install_all:
|
|||||||
|
|
||||||
PHONY += headers_install
|
PHONY += headers_install
|
||||||
headers_install: __headers
|
headers_install: __headers
|
||||||
$(if $(wildcard $(srctree)/$(hdr-dir)/Kbuild),, \
|
$(if $(wildcard $(srctree)/arch/$(hdr-arch)/include/asm/Kbuild),, \
|
||||||
$(error Headers not exportable for the $(SRCARCH) architecture))
|
$(error Headers not exportable for the $(SRCARCH) architecture))
|
||||||
$(Q)$(MAKE) $(hdr-inst)=include
|
$(Q)$(MAKE) $(hdr-inst)=include
|
||||||
$(Q)$(MAKE) $(hdr-inst)=$(hdr-dir) $(hdr-dst)
|
$(Q)$(MAKE) $(hdr-inst)=arch/$(hdr-arch)/include/asm $(hdr-dst)
|
||||||
|
|
||||||
PHONY += headers_check_all
|
PHONY += headers_check_all
|
||||||
headers_check_all: headers_install_all
|
headers_check_all: headers_install_all
|
||||||
@@ -1114,7 +1070,7 @@ headers_check_all: headers_install_all
|
|||||||
PHONY += headers_check
|
PHONY += headers_check
|
||||||
headers_check: headers_install
|
headers_check: headers_install
|
||||||
$(Q)$(MAKE) $(hdr-inst)=include HDRCHECK=1
|
$(Q)$(MAKE) $(hdr-inst)=include HDRCHECK=1
|
||||||
$(Q)$(MAKE) $(hdr-inst)=$(hdr-dir) $(hdr-dst) HDRCHECK=1
|
$(Q)$(MAKE) $(hdr-inst)=arch/$(hdr-arch)/include/asm $(hdr-dst) HDRCHECK=1
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
# Modules
|
# Modules
|
||||||
@@ -1134,6 +1090,7 @@ all: modules
|
|||||||
PHONY += modules
|
PHONY += modules
|
||||||
modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux)
|
modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux)
|
||||||
$(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.order) > $(objtree)/modules.order
|
$(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.order) > $(objtree)/modules.order
|
||||||
|
$(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.builtin) > $(objtree)/modules.builtin
|
||||||
@$(kecho) ' Building modules, stage 2.';
|
@$(kecho) ' Building modules, stage 2.';
|
||||||
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
|
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
|
||||||
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.fwinst obj=firmware __fw_modbuild
|
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.fwinst obj=firmware __fw_modbuild
|
||||||
@@ -1163,6 +1120,7 @@ _modinst_:
|
|||||||
ln -s $(objtree) $(MODLIB)/build ; \
|
ln -s $(objtree) $(MODLIB)/build ; \
|
||||||
fi
|
fi
|
||||||
@cp -f $(objtree)/modules.order $(MODLIB)/
|
@cp -f $(objtree)/modules.order $(MODLIB)/
|
||||||
|
@cp -f $(objtree)/modules.builtin $(MODLIB)/
|
||||||
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinst
|
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinst
|
||||||
|
|
||||||
# This depmod is only for convenience to give the initial
|
# This depmod is only for convenience to give the initial
|
||||||
@@ -1201,12 +1159,10 @@ CLEAN_FILES += vmlinux System.map \
|
|||||||
.tmp_kallsyms* .tmp_version .tmp_vmlinux* .tmp_System.map
|
.tmp_kallsyms* .tmp_version .tmp_vmlinux* .tmp_System.map
|
||||||
|
|
||||||
# Directories & files removed with 'make mrproper'
|
# Directories & files removed with 'make mrproper'
|
||||||
MRPROPER_DIRS += include/config include2 usr/include include/generated
|
MRPROPER_DIRS += include/config usr/include include/generated
|
||||||
MRPROPER_FILES += .config .config.old include/asm .version .old_version \
|
MRPROPER_FILES += .config .config.old .version .old_version \
|
||||||
include/linux/autoconf.h include/linux/version.h \
|
include/linux/version.h \
|
||||||
include/linux/utsrelease.h \
|
Module.symvers tags TAGS cscope*
|
||||||
include/linux/bounds.h include/asm*/asm-offsets.h \
|
|
||||||
Module.symvers Module.markers tags TAGS cscope*
|
|
||||||
|
|
||||||
# clean - Delete most, but leave enough to build external modules
|
# clean - Delete most, but leave enough to build external modules
|
||||||
#
|
#
|
||||||
@@ -1225,7 +1181,7 @@ clean: archclean $(clean-dirs)
|
|||||||
\( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \
|
\( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \
|
||||||
-o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \
|
-o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \
|
||||||
-o -name '*.symtypes' -o -name 'modules.order' \
|
-o -name '*.symtypes' -o -name 'modules.order' \
|
||||||
-o -name 'Module.markers' -o -name '.tmp_*.o.*' \
|
-o -name modules.builtin -o -name '.tmp_*.o.*' \
|
||||||
-o -name '*.gcno' \) -type f -print | xargs rm -f
|
-o -name '*.gcno' \) -type f -print | xargs rm -f
|
||||||
|
|
||||||
# mrproper - Delete all generated files, including .config
|
# mrproper - Delete all generated files, including .config
|
||||||
@@ -1423,8 +1379,8 @@ $(clean-dirs):
|
|||||||
|
|
||||||
clean: rm-dirs := $(MODVERDIR)
|
clean: rm-dirs := $(MODVERDIR)
|
||||||
clean: rm-files := $(KBUILD_EXTMOD)/Module.symvers \
|
clean: rm-files := $(KBUILD_EXTMOD)/Module.symvers \
|
||||||
$(KBUILD_EXTMOD)/Module.markers \
|
$(KBUILD_EXTMOD)/modules.order \
|
||||||
$(KBUILD_EXTMOD)/modules.order
|
$(KBUILD_EXTMOD)/modules.builtin
|
||||||
clean: $(clean-dirs)
|
clean: $(clean-dirs)
|
||||||
$(call cmd,rmdirs)
|
$(call cmd,rmdirs)
|
||||||
$(call cmd,rmfiles)
|
$(call cmd,rmfiles)
|
||||||
|
@@ -9,7 +9,7 @@
|
|||||||
*/
|
*/
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
#include <linux/utsrelease.h>
|
#include <generated/utsrelease.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
|
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
|
@@ -11,7 +11,7 @@
|
|||||||
*/
|
*/
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
#include <linux/utsrelease.h>
|
#include <generated/utsrelease.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
|
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
*/
|
*/
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
#include <linux/utsrelease.h>
|
#include <generated/utsrelease.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
|
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
|
1
arch/alpha/include/asm/asm-offsets.h
Normal file
1
arch/alpha/include/asm/asm-offsets.h
Normal file
@@ -0,0 +1 @@
|
|||||||
|
#include <generated/asm-offsets.h>
|
@@ -435,7 +435,7 @@ extern inline void t2_outl(u32 b, unsigned long addr)
|
|||||||
set_hae(msb); \
|
set_hae(msb); \
|
||||||
}
|
}
|
||||||
|
|
||||||
extern spinlock_t t2_hae_lock;
|
extern raw_spinlock_t t2_hae_lock;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NOTE: take T2_DENSE_MEM off in each readX/writeX routine, since
|
* NOTE: take T2_DENSE_MEM off in each readX/writeX routine, since
|
||||||
@@ -448,12 +448,12 @@ __EXTERN_INLINE u8 t2_readb(const volatile void __iomem *xaddr)
|
|||||||
unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM;
|
unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM;
|
||||||
unsigned long result, msb;
|
unsigned long result, msb;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
spin_lock_irqsave(&t2_hae_lock, flags);
|
raw_spin_lock_irqsave(&t2_hae_lock, flags);
|
||||||
|
|
||||||
t2_set_hae;
|
t2_set_hae;
|
||||||
|
|
||||||
result = *(vip) ((addr << 5) + T2_SPARSE_MEM + 0x00);
|
result = *(vip) ((addr << 5) + T2_SPARSE_MEM + 0x00);
|
||||||
spin_unlock_irqrestore(&t2_hae_lock, flags);
|
raw_spin_unlock_irqrestore(&t2_hae_lock, flags);
|
||||||
return __kernel_extbl(result, addr & 3);
|
return __kernel_extbl(result, addr & 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -462,12 +462,12 @@ __EXTERN_INLINE u16 t2_readw(const volatile void __iomem *xaddr)
|
|||||||
unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM;
|
unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM;
|
||||||
unsigned long result, msb;
|
unsigned long result, msb;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
spin_lock_irqsave(&t2_hae_lock, flags);
|
raw_spin_lock_irqsave(&t2_hae_lock, flags);
|
||||||
|
|
||||||
t2_set_hae;
|
t2_set_hae;
|
||||||
|
|
||||||
result = *(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x08);
|
result = *(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x08);
|
||||||
spin_unlock_irqrestore(&t2_hae_lock, flags);
|
raw_spin_unlock_irqrestore(&t2_hae_lock, flags);
|
||||||
return __kernel_extwl(result, addr & 3);
|
return __kernel_extwl(result, addr & 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -480,12 +480,12 @@ __EXTERN_INLINE u32 t2_readl(const volatile void __iomem *xaddr)
|
|||||||
unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM;
|
unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM;
|
||||||
unsigned long result, msb;
|
unsigned long result, msb;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
spin_lock_irqsave(&t2_hae_lock, flags);
|
raw_spin_lock_irqsave(&t2_hae_lock, flags);
|
||||||
|
|
||||||
t2_set_hae;
|
t2_set_hae;
|
||||||
|
|
||||||
result = *(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x18);
|
result = *(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x18);
|
||||||
spin_unlock_irqrestore(&t2_hae_lock, flags);
|
raw_spin_unlock_irqrestore(&t2_hae_lock, flags);
|
||||||
return result & 0xffffffffUL;
|
return result & 0xffffffffUL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -494,14 +494,14 @@ __EXTERN_INLINE u64 t2_readq(const volatile void __iomem *xaddr)
|
|||||||
unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM;
|
unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM;
|
||||||
unsigned long r0, r1, work, msb;
|
unsigned long r0, r1, work, msb;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
spin_lock_irqsave(&t2_hae_lock, flags);
|
raw_spin_lock_irqsave(&t2_hae_lock, flags);
|
||||||
|
|
||||||
t2_set_hae;
|
t2_set_hae;
|
||||||
|
|
||||||
work = (addr << 5) + T2_SPARSE_MEM + 0x18;
|
work = (addr << 5) + T2_SPARSE_MEM + 0x18;
|
||||||
r0 = *(vuip)(work);
|
r0 = *(vuip)(work);
|
||||||
r1 = *(vuip)(work + (4 << 5));
|
r1 = *(vuip)(work + (4 << 5));
|
||||||
spin_unlock_irqrestore(&t2_hae_lock, flags);
|
raw_spin_unlock_irqrestore(&t2_hae_lock, flags);
|
||||||
return r1 << 32 | r0;
|
return r1 << 32 | r0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -510,13 +510,13 @@ __EXTERN_INLINE void t2_writeb(u8 b, volatile void __iomem *xaddr)
|
|||||||
unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM;
|
unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM;
|
||||||
unsigned long msb, w;
|
unsigned long msb, w;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
spin_lock_irqsave(&t2_hae_lock, flags);
|
raw_spin_lock_irqsave(&t2_hae_lock, flags);
|
||||||
|
|
||||||
t2_set_hae;
|
t2_set_hae;
|
||||||
|
|
||||||
w = __kernel_insbl(b, addr & 3);
|
w = __kernel_insbl(b, addr & 3);
|
||||||
*(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x00) = w;
|
*(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x00) = w;
|
||||||
spin_unlock_irqrestore(&t2_hae_lock, flags);
|
raw_spin_unlock_irqrestore(&t2_hae_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
__EXTERN_INLINE void t2_writew(u16 b, volatile void __iomem *xaddr)
|
__EXTERN_INLINE void t2_writew(u16 b, volatile void __iomem *xaddr)
|
||||||
@@ -524,13 +524,13 @@ __EXTERN_INLINE void t2_writew(u16 b, volatile void __iomem *xaddr)
|
|||||||
unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM;
|
unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM;
|
||||||
unsigned long msb, w;
|
unsigned long msb, w;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
spin_lock_irqsave(&t2_hae_lock, flags);
|
raw_spin_lock_irqsave(&t2_hae_lock, flags);
|
||||||
|
|
||||||
t2_set_hae;
|
t2_set_hae;
|
||||||
|
|
||||||
w = __kernel_inswl(b, addr & 3);
|
w = __kernel_inswl(b, addr & 3);
|
||||||
*(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x08) = w;
|
*(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x08) = w;
|
||||||
spin_unlock_irqrestore(&t2_hae_lock, flags);
|
raw_spin_unlock_irqrestore(&t2_hae_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -542,12 +542,12 @@ __EXTERN_INLINE void t2_writel(u32 b, volatile void __iomem *xaddr)
|
|||||||
unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM;
|
unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM;
|
||||||
unsigned long msb;
|
unsigned long msb;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
spin_lock_irqsave(&t2_hae_lock, flags);
|
raw_spin_lock_irqsave(&t2_hae_lock, flags);
|
||||||
|
|
||||||
t2_set_hae;
|
t2_set_hae;
|
||||||
|
|
||||||
*(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x18) = b;
|
*(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x18) = b;
|
||||||
spin_unlock_irqrestore(&t2_hae_lock, flags);
|
raw_spin_unlock_irqrestore(&t2_hae_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
__EXTERN_INLINE void t2_writeq(u64 b, volatile void __iomem *xaddr)
|
__EXTERN_INLINE void t2_writeq(u64 b, volatile void __iomem *xaddr)
|
||||||
@@ -555,14 +555,14 @@ __EXTERN_INLINE void t2_writeq(u64 b, volatile void __iomem *xaddr)
|
|||||||
unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM;
|
unsigned long addr = (unsigned long) xaddr - T2_DENSE_MEM;
|
||||||
unsigned long msb, work;
|
unsigned long msb, work;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
spin_lock_irqsave(&t2_hae_lock, flags);
|
raw_spin_lock_irqsave(&t2_hae_lock, flags);
|
||||||
|
|
||||||
t2_set_hae;
|
t2_set_hae;
|
||||||
|
|
||||||
work = (addr << 5) + T2_SPARSE_MEM + 0x18;
|
work = (addr << 5) + T2_SPARSE_MEM + 0x18;
|
||||||
*(vuip)work = b;
|
*(vuip)work = b;
|
||||||
*(vuip)(work + (4 << 5)) = b >> 32;
|
*(vuip)(work + (4 << 5)) = b >> 32;
|
||||||
spin_unlock_irqrestore(&t2_hae_lock, flags);
|
raw_spin_unlock_irqrestore(&t2_hae_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
__EXTERN_INLINE void __iomem *t2_ioportmap(unsigned long addr)
|
__EXTERN_INLINE void __iomem *t2_ioportmap(unsigned long addr)
|
||||||
|
@@ -81,7 +81,6 @@ typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
|
|||||||
#define ELF_DATA ELFDATA2LSB
|
#define ELF_DATA ELFDATA2LSB
|
||||||
#define ELF_ARCH EM_ALPHA
|
#define ELF_ARCH EM_ALPHA
|
||||||
|
|
||||||
#define USE_ELF_CORE_DUMP
|
|
||||||
#define ELF_EXEC_PAGESIZE 8192
|
#define ELF_EXEC_PAGESIZE 8192
|
||||||
|
|
||||||
/* This is the location that an ET_DYN program is loaded if exec'ed. Typical
|
/* This is the location that an ET_DYN program is loaded if exec'ed. Typical
|
||||||
|
@@ -1,8 +1,6 @@
|
|||||||
#ifndef _ALPHA_FCNTL_H
|
#ifndef _ALPHA_FCNTL_H
|
||||||
#define _ALPHA_FCNTL_H
|
#define _ALPHA_FCNTL_H
|
||||||
|
|
||||||
/* open/fcntl - O_SYNC is only implemented on blocks devices and on files
|
|
||||||
located on an ext2 file system */
|
|
||||||
#define O_CREAT 01000 /* not fcntl */
|
#define O_CREAT 01000 /* not fcntl */
|
||||||
#define O_TRUNC 02000 /* not fcntl */
|
#define O_TRUNC 02000 /* not fcntl */
|
||||||
#define O_EXCL 04000 /* not fcntl */
|
#define O_EXCL 04000 /* not fcntl */
|
||||||
@@ -10,13 +8,28 @@
|
|||||||
|
|
||||||
#define O_NONBLOCK 00004
|
#define O_NONBLOCK 00004
|
||||||
#define O_APPEND 00010
|
#define O_APPEND 00010
|
||||||
#define O_SYNC 040000
|
#define O_DSYNC 040000 /* used to be O_SYNC, see below */
|
||||||
#define O_DIRECTORY 0100000 /* must be a directory */
|
#define O_DIRECTORY 0100000 /* must be a directory */
|
||||||
#define O_NOFOLLOW 0200000 /* don't follow links */
|
#define O_NOFOLLOW 0200000 /* don't follow links */
|
||||||
#define O_LARGEFILE 0400000 /* will be set by the kernel on every open */
|
#define O_LARGEFILE 0400000 /* will be set by the kernel on every open */
|
||||||
#define O_DIRECT 02000000 /* direct disk access - should check with OSF/1 */
|
#define O_DIRECT 02000000 /* direct disk access - should check with OSF/1 */
|
||||||
#define O_NOATIME 04000000
|
#define O_NOATIME 04000000
|
||||||
#define O_CLOEXEC 010000000 /* set close_on_exec */
|
#define O_CLOEXEC 010000000 /* set close_on_exec */
|
||||||
|
/*
|
||||||
|
* Before Linux 2.6.33 only O_DSYNC semantics were implemented, but using
|
||||||
|
* the O_SYNC flag. We continue to use the existing numerical value
|
||||||
|
* for O_DSYNC semantics now, but using the correct symbolic name for it.
|
||||||
|
* This new value is used to request true Posix O_SYNC semantics. It is
|
||||||
|
* defined in this strange way to make sure applications compiled against
|
||||||
|
* new headers get at least O_DSYNC semantics on older kernels.
|
||||||
|
*
|
||||||
|
* This has the nice side-effect that we can simply test for O_DSYNC
|
||||||
|
* wherever we do not care if O_DSYNC or O_SYNC is used.
|
||||||
|
*
|
||||||
|
* Note: __O_SYNC must never be used directly.
|
||||||
|
*/
|
||||||
|
#define __O_SYNC 020000000
|
||||||
|
#define O_SYNC (__O_SYNC|O_DSYNC)
|
||||||
|
|
||||||
#define F_GETLK 7
|
#define F_GETLK 7
|
||||||
#define F_SETLK 8
|
#define F_SETLK 8
|
||||||
|
@@ -12,18 +12,18 @@
|
|||||||
* We make no fairness assumptions. They have a cost.
|
* We make no fairness assumptions. They have a cost.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define __raw_spin_lock_flags(lock, flags) __raw_spin_lock(lock)
|
#define arch_spin_lock_flags(lock, flags) arch_spin_lock(lock)
|
||||||
#define __raw_spin_is_locked(x) ((x)->lock != 0)
|
#define arch_spin_is_locked(x) ((x)->lock != 0)
|
||||||
#define __raw_spin_unlock_wait(x) \
|
#define arch_spin_unlock_wait(x) \
|
||||||
do { cpu_relax(); } while ((x)->lock)
|
do { cpu_relax(); } while ((x)->lock)
|
||||||
|
|
||||||
static inline void __raw_spin_unlock(raw_spinlock_t * lock)
|
static inline void arch_spin_unlock(arch_spinlock_t * lock)
|
||||||
{
|
{
|
||||||
mb();
|
mb();
|
||||||
lock->lock = 0;
|
lock->lock = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void __raw_spin_lock(raw_spinlock_t * lock)
|
static inline void arch_spin_lock(arch_spinlock_t * lock)
|
||||||
{
|
{
|
||||||
long tmp;
|
long tmp;
|
||||||
|
|
||||||
@@ -43,24 +43,24 @@ static inline void __raw_spin_lock(raw_spinlock_t * lock)
|
|||||||
: "m"(lock->lock) : "memory");
|
: "m"(lock->lock) : "memory");
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int __raw_spin_trylock(raw_spinlock_t *lock)
|
static inline int arch_spin_trylock(arch_spinlock_t *lock)
|
||||||
{
|
{
|
||||||
return !test_and_set_bit(0, &lock->lock);
|
return !test_and_set_bit(0, &lock->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************/
|
/***********************************************************/
|
||||||
|
|
||||||
static inline int __raw_read_can_lock(raw_rwlock_t *lock)
|
static inline int arch_read_can_lock(arch_rwlock_t *lock)
|
||||||
{
|
{
|
||||||
return (lock->lock & 1) == 0;
|
return (lock->lock & 1) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int __raw_write_can_lock(raw_rwlock_t *lock)
|
static inline int arch_write_can_lock(arch_rwlock_t *lock)
|
||||||
{
|
{
|
||||||
return lock->lock == 0;
|
return lock->lock == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void __raw_read_lock(raw_rwlock_t *lock)
|
static inline void arch_read_lock(arch_rwlock_t *lock)
|
||||||
{
|
{
|
||||||
long regx;
|
long regx;
|
||||||
|
|
||||||
@@ -80,7 +80,7 @@ static inline void __raw_read_lock(raw_rwlock_t *lock)
|
|||||||
: "m" (*lock) : "memory");
|
: "m" (*lock) : "memory");
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void __raw_write_lock(raw_rwlock_t *lock)
|
static inline void arch_write_lock(arch_rwlock_t *lock)
|
||||||
{
|
{
|
||||||
long regx;
|
long regx;
|
||||||
|
|
||||||
@@ -100,7 +100,7 @@ static inline void __raw_write_lock(raw_rwlock_t *lock)
|
|||||||
: "m" (*lock) : "memory");
|
: "m" (*lock) : "memory");
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int __raw_read_trylock(raw_rwlock_t * lock)
|
static inline int arch_read_trylock(arch_rwlock_t * lock)
|
||||||
{
|
{
|
||||||
long regx;
|
long regx;
|
||||||
int success;
|
int success;
|
||||||
@@ -122,7 +122,7 @@ static inline int __raw_read_trylock(raw_rwlock_t * lock)
|
|||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int __raw_write_trylock(raw_rwlock_t * lock)
|
static inline int arch_write_trylock(arch_rwlock_t * lock)
|
||||||
{
|
{
|
||||||
long regx;
|
long regx;
|
||||||
int success;
|
int success;
|
||||||
@@ -144,7 +144,7 @@ static inline int __raw_write_trylock(raw_rwlock_t * lock)
|
|||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void __raw_read_unlock(raw_rwlock_t * lock)
|
static inline void arch_read_unlock(arch_rwlock_t * lock)
|
||||||
{
|
{
|
||||||
long regx;
|
long regx;
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
@@ -160,17 +160,17 @@ static inline void __raw_read_unlock(raw_rwlock_t * lock)
|
|||||||
: "m" (*lock) : "memory");
|
: "m" (*lock) : "memory");
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void __raw_write_unlock(raw_rwlock_t * lock)
|
static inline void arch_write_unlock(arch_rwlock_t * lock)
|
||||||
{
|
{
|
||||||
mb();
|
mb();
|
||||||
lock->lock = 0;
|
lock->lock = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define __raw_read_lock_flags(lock, flags) __raw_read_lock(lock)
|
#define arch_read_lock_flags(lock, flags) arch_read_lock(lock)
|
||||||
#define __raw_write_lock_flags(lock, flags) __raw_write_lock(lock)
|
#define arch_write_lock_flags(lock, flags) arch_write_lock(lock)
|
||||||
|
|
||||||
#define _raw_spin_relax(lock) cpu_relax()
|
#define arch_spin_relax(lock) cpu_relax()
|
||||||
#define _raw_read_relax(lock) cpu_relax()
|
#define arch_read_relax(lock) cpu_relax()
|
||||||
#define _raw_write_relax(lock) cpu_relax()
|
#define arch_write_relax(lock) cpu_relax()
|
||||||
|
|
||||||
#endif /* _ALPHA_SPINLOCK_H */
|
#endif /* _ALPHA_SPINLOCK_H */
|
||||||
|
@@ -7,14 +7,14 @@
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
volatile unsigned int lock;
|
volatile unsigned int lock;
|
||||||
} raw_spinlock_t;
|
} arch_spinlock_t;
|
||||||
|
|
||||||
#define __RAW_SPIN_LOCK_UNLOCKED { 0 }
|
#define __ARCH_SPIN_LOCK_UNLOCKED { 0 }
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
volatile unsigned int lock;
|
volatile unsigned int lock;
|
||||||
} raw_rwlock_t;
|
} arch_rwlock_t;
|
||||||
|
|
||||||
#define __RAW_RW_LOCK_UNLOCKED { 0 }
|
#define __ARCH_RW_LOCK_UNLOCKED { 0 }
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user