mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-16 09:13:55 +08:00
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless
This commit is contained in:
commit
5e819059a2
@ -1,6 +1,6 @@
|
||||
What: /sys/o2cb symlink
|
||||
Date: May 2011
|
||||
KernelVersion: 2.6.40
|
||||
KernelVersion: 3.0
|
||||
Contact: ocfs2-devel@oss.oracle.com
|
||||
Description: This is a symlink: /sys/o2cb to /sys/fs/o2cb. The symlink is
|
||||
removed when new versions of ocfs2-tools which know to look
|
||||
|
@ -5,7 +5,7 @@ Description:
|
||||
/dev/raw1394 was a character device file that allowed low-level
|
||||
access to FireWire buses. Its major drawbacks were its inability
|
||||
to implement sensible device security policies, and its low level
|
||||
of abstraction that required userspace clients do duplicate much
|
||||
of abstraction that required userspace clients to duplicate much
|
||||
of the kernel's ieee1394 core functionality.
|
||||
Replaced by /dev/fw*, i.e. the <linux/firewire-cdev.h> ABI of
|
||||
firewire-core.
|
||||
|
23
Documentation/ABI/testing/evm
Normal file
23
Documentation/ABI/testing/evm
Normal file
@ -0,0 +1,23 @@
|
||||
What: security/evm
|
||||
Date: March 2011
|
||||
Contact: Mimi Zohar <zohar@us.ibm.com>
|
||||
Description:
|
||||
EVM protects a file's security extended attributes(xattrs)
|
||||
against integrity attacks. The initial method maintains an
|
||||
HMAC-sha1 value across the extended attributes, storing the
|
||||
value as the extended attribute 'security.evm'.
|
||||
|
||||
EVM depends on the Kernel Key Retention System to provide it
|
||||
with a trusted/encrypted key for the HMAC-sha1 operation.
|
||||
The key is loaded onto the root's keyring using keyctl. Until
|
||||
EVM receives notification that the key has been successfully
|
||||
loaded onto the keyring (echo 1 > <securityfs>/evm), EVM
|
||||
can not create or validate the 'security.evm' xattr, but
|
||||
returns INTEGRITY_UNKNOWN. Loading the key and signaling EVM
|
||||
should be done as early as possible. Normally this is done
|
||||
in the initramfs, which has already been measured as part
|
||||
of the trusted boot. For more information on creating and
|
||||
loading existing trusted/encrypted keys, refer to:
|
||||
Documentation/keys-trusted-encrypted.txt. (A sample dracut
|
||||
patch, which loads the trusted/encrypted key and enables
|
||||
EVM, is available from http://linux-ima.sourceforge.net/#EVM.)
|
@ -1,6 +1,6 @@
|
||||
What: /sys/bus/bcma/devices/.../manuf
|
||||
Date: May 2011
|
||||
KernelVersion: 2.6.40
|
||||
KernelVersion: 3.0
|
||||
Contact: Rafał Miłecki <zajec5@gmail.com>
|
||||
Description:
|
||||
Each BCMA core has it's manufacturer id. See
|
||||
@ -8,7 +8,7 @@ Description:
|
||||
|
||||
What: /sys/bus/bcma/devices/.../id
|
||||
Date: May 2011
|
||||
KernelVersion: 2.6.40
|
||||
KernelVersion: 3.0
|
||||
Contact: Rafał Miłecki <zajec5@gmail.com>
|
||||
Description:
|
||||
There are a few types of BCMA cores, they can be identified by
|
||||
@ -16,7 +16,7 @@ Description:
|
||||
|
||||
What: /sys/bus/bcma/devices/.../rev
|
||||
Date: May 2011
|
||||
KernelVersion: 2.6.40
|
||||
KernelVersion: 3.0
|
||||
Contact: Rafał Miłecki <zajec5@gmail.com>
|
||||
Description:
|
||||
BCMA cores of the same type can still slightly differ depending
|
||||
@ -24,7 +24,7 @@ Description:
|
||||
|
||||
What: /sys/bus/bcma/devices/.../class
|
||||
Date: May 2011
|
||||
KernelVersion: 2.6.40
|
||||
KernelVersion: 3.0
|
||||
Contact: Rafał Miłecki <zajec5@gmail.com>
|
||||
Description:
|
||||
Each BCMA core is identified by few fields, including class it
|
||||
|
46
Documentation/ABI/testing/sysfs-bus-pci-drivers-ehci_hcd
Normal file
46
Documentation/ABI/testing/sysfs-bus-pci-drivers-ehci_hcd
Normal file
@ -0,0 +1,46 @@
|
||||
What: /sys/bus/pci/drivers/ehci_hcd/.../companion
|
||||
/sys/bus/usb/devices/usbN/../companion
|
||||
Date: January 2007
|
||||
KernelVersion: 2.6.21
|
||||
Contact: Alan Stern <stern@rowland.harvard.edu>
|
||||
Description:
|
||||
PCI-based EHCI USB controllers (i.e., high-speed USB-2.0
|
||||
controllers) are often implemented along with a set of
|
||||
"companion" full/low-speed USB-1.1 controllers. When a
|
||||
high-speed device is plugged in, the connection is routed
|
||||
to the EHCI controller; when a full- or low-speed device
|
||||
is plugged in, the connection is routed to the companion
|
||||
controller.
|
||||
|
||||
Sometimes you want to force a high-speed device to connect
|
||||
at full speed, which can be accomplished by forcing the
|
||||
connection to be routed to the companion controller.
|
||||
That's what this file does. Writing a port number to the
|
||||
file causes connections on that port to be routed to the
|
||||
companion controller, and writing the negative of a port
|
||||
number returns the port to normal operation.
|
||||
|
||||
For example: To force the high-speed device attached to
|
||||
port 4 on bus 2 to run at full speed:
|
||||
|
||||
echo 4 >/sys/bus/usb/devices/usb2/../companion
|
||||
|
||||
To return the port to high-speed operation:
|
||||
|
||||
echo -4 >/sys/bus/usb/devices/usb2/../companion
|
||||
|
||||
Reading the file gives the list of ports currently forced
|
||||
to the companion controller.
|
||||
|
||||
Note: Some EHCI controllers do not have companions; they
|
||||
may contain an internal "transaction translator" or they
|
||||
may be attached directly to a "rate-matching hub". This
|
||||
mechanism will not work with such controllers. Also, it
|
||||
cannot be used to force a port on a high-speed hub to
|
||||
connect at full speed.
|
||||
|
||||
Note: When this file was first added, it appeared in a
|
||||
different sysfs directory. The location given above is
|
||||
correct for 2.6.35 (and probably several earlier kernel
|
||||
versions as well).
|
||||
|
@ -142,3 +142,18 @@ Description:
|
||||
such devices.
|
||||
Users:
|
||||
usb_modeswitch
|
||||
|
||||
What: /sys/bus/usb/devices/.../power/usb2_hardware_lpm
|
||||
Date: September 2011
|
||||
Contact: Andiry Xu <andiry.xu@amd.com>
|
||||
Description:
|
||||
If CONFIG_USB_SUSPEND is set and a USB 2.0 lpm-capable device
|
||||
is plugged in to a xHCI host which support link PM, it will
|
||||
perform a LPM test; if the test is passed and host supports
|
||||
USB2 hardware LPM (xHCI 1.0 feature), USB2 hardware LPM will
|
||||
be enabled for the device and the USB device directory will
|
||||
contain a file named power/usb2_hardware_lpm. The file holds
|
||||
a string value (enable or disable) indicating whether or not
|
||||
USB2 hardware LPM is enabled for the device. Developer can
|
||||
write y/Y/1 or n/N/0 to the file to enable/disable the
|
||||
feature.
|
||||
|
@ -4,8 +4,8 @@ What: /sys/class/backlight/<backlight>/l2_bright_max
|
||||
What: /sys/class/backlight/<backlight>/l3_office_max
|
||||
What: /sys/class/backlight/<backlight>/l4_indoor_max
|
||||
What: /sys/class/backlight/<backlight>/l5_dark_max
|
||||
Date: Mai 2011
|
||||
KernelVersion: 2.6.40
|
||||
Date: May 2011
|
||||
KernelVersion: 3.0
|
||||
Contact: device-drivers-devel@blackfin.uclinux.org
|
||||
Description:
|
||||
Control the maximum brightness for <ambient light zone>
|
||||
@ -18,8 +18,8 @@ What: /sys/class/backlight/<backlight>/l2_bright_dim
|
||||
What: /sys/class/backlight/<backlight>/l3_office_dim
|
||||
What: /sys/class/backlight/<backlight>/l4_indoor_dim
|
||||
What: /sys/class/backlight/<backlight>/l5_dark_dim
|
||||
Date: Mai 2011
|
||||
KernelVersion: 2.6.40
|
||||
Date: May 2011
|
||||
KernelVersion: 3.0
|
||||
Contact: device-drivers-devel@blackfin.uclinux.org
|
||||
Description:
|
||||
Control the dim brightness for <ambient light zone>
|
||||
@ -29,8 +29,8 @@ Description:
|
||||
this <ambient light zone>.
|
||||
|
||||
What: /sys/class/backlight/<backlight>/ambient_light_level
|
||||
Date: Mai 2011
|
||||
KernelVersion: 2.6.40
|
||||
Date: May 2011
|
||||
KernelVersion: 3.0
|
||||
Contact: device-drivers-devel@blackfin.uclinux.org
|
||||
Description:
|
||||
Get conversion value of the light sensor.
|
||||
@ -39,8 +39,8 @@ Description:
|
||||
8000 (max ambient brightness)
|
||||
|
||||
What: /sys/class/backlight/<backlight>/ambient_light_zone
|
||||
Date: Mai 2011
|
||||
KernelVersion: 2.6.40
|
||||
Date: May 2011
|
||||
KernelVersion: 3.0
|
||||
Contact: device-drivers-devel@blackfin.uclinux.org
|
||||
Description:
|
||||
Get/Set current ambient light zone. Reading returns
|
||||
|
52
Documentation/ABI/testing/sysfs-class-devfreq
Normal file
52
Documentation/ABI/testing/sysfs-class-devfreq
Normal file
@ -0,0 +1,52 @@
|
||||
What: /sys/class/devfreq/.../
|
||||
Date: September 2011
|
||||
Contact: MyungJoo Ham <myungjoo.ham@samsung.com>
|
||||
Description:
|
||||
Provide a place in sysfs for the devfreq objects.
|
||||
This allows accessing various devfreq specific variables.
|
||||
The name of devfreq object denoted as ... is same as the
|
||||
name of device using devfreq.
|
||||
|
||||
What: /sys/class/devfreq/.../governor
|
||||
Date: September 2011
|
||||
Contact: MyungJoo Ham <myungjoo.ham@samsung.com>
|
||||
Description:
|
||||
The /sys/class/devfreq/.../governor shows the name of the
|
||||
governor used by the corresponding devfreq object.
|
||||
|
||||
What: /sys/class/devfreq/.../cur_freq
|
||||
Date: September 2011
|
||||
Contact: MyungJoo Ham <myungjoo.ham@samsung.com>
|
||||
Description:
|
||||
The /sys/class/devfreq/.../cur_freq shows the current
|
||||
frequency of the corresponding devfreq object.
|
||||
|
||||
What: /sys/class/devfreq/.../central_polling
|
||||
Date: September 2011
|
||||
Contact: MyungJoo Ham <myungjoo.ham@samsung.com>
|
||||
Description:
|
||||
The /sys/class/devfreq/.../central_polling shows whether
|
||||
the devfreq ojbect is using devfreq-provided central
|
||||
polling mechanism or not.
|
||||
|
||||
What: /sys/class/devfreq/.../polling_interval
|
||||
Date: September 2011
|
||||
Contact: MyungJoo Ham <myungjoo.ham@samsung.com>
|
||||
Description:
|
||||
The /sys/class/devfreq/.../polling_interval shows and sets
|
||||
the requested polling interval of the corresponding devfreq
|
||||
object. The values are represented in ms. If the value is
|
||||
less than 1 jiffy, it is considered to be 0, which means
|
||||
no polling. This value is meaningless if the governor is
|
||||
not polling; thus. If the governor is not using
|
||||
devfreq-provided central polling
|
||||
(/sys/class/devfreq/.../central_polling is 0), this value
|
||||
may be useless.
|
||||
|
||||
What: /sys/class/devfreq/.../userspace/set_freq
|
||||
Date: September 2011
|
||||
Contact: MyungJoo Ham <myungjoo.ham@samsung.com>
|
||||
Description:
|
||||
The /sys/class/devfreq/.../userspace/set_freq shows and
|
||||
sets the requested frequency for the devfreq object if
|
||||
userspace governor is in effect.
|
@ -0,0 +1,7 @@
|
||||
What: /sys/module/hid_logitech/drivers/hid:logitech/<dev>/range.
|
||||
Date: July 2011
|
||||
KernelVersion: 3.2
|
||||
Contact: Michal Malý <madcatxster@gmail.com>
|
||||
Description: Display minimum, maximum and current range of the steering
|
||||
wheel. Writing a value within min and max boundaries sets the
|
||||
range of the wheel.
|
@ -529,7 +529,7 @@ memory (e.g. allocated with <function>kmalloc()</function>). There's also
|
||||
</para></listitem>
|
||||
|
||||
<listitem><para>
|
||||
<varname>unsigned long addr</varname>: Required if the mapping is used.
|
||||
<varname>phys_addr_t addr</varname>: Required if the mapping is used.
|
||||
Fill in the address of your memory block. This address is the one that
|
||||
appears in sysfs.
|
||||
</para></listitem>
|
||||
|
@ -314,7 +314,7 @@ from the PCI device config space. Use the values in the pci_dev structure
|
||||
as the PCI "bus address" might have been remapped to a "host physical"
|
||||
address by the arch/chip-set specific kernel support.
|
||||
|
||||
See Documentation/IO-mapping.txt for how to access device registers
|
||||
See Documentation/io-mapping.txt for how to access device registers
|
||||
or device memory.
|
||||
|
||||
The device driver needs to call pci_request_region() to verify
|
||||
|
@ -95,7 +95,7 @@ not to return until all ongoing NMI handlers exit. It is therefore safe
|
||||
to free up the handler's data as soon as synchronize_sched() returns.
|
||||
|
||||
Important note: for this to work, the architecture in question must
|
||||
invoke irq_enter() and irq_exit() on NMI entry and exit, respectively.
|
||||
invoke nmi_enter() and nmi_exit() on NMI entry and exit, respectively.
|
||||
|
||||
|
||||
Answer to Quick Quiz
|
||||
|
110
Documentation/RCU/lockdep-splat.txt
Normal file
110
Documentation/RCU/lockdep-splat.txt
Normal file
@ -0,0 +1,110 @@
|
||||
Lockdep-RCU was added to the Linux kernel in early 2010
|
||||
(http://lwn.net/Articles/371986/). This facility checks for some common
|
||||
misuses of the RCU API, most notably using one of the rcu_dereference()
|
||||
family to access an RCU-protected pointer without the proper protection.
|
||||
When such misuse is detected, an lockdep-RCU splat is emitted.
|
||||
|
||||
The usual cause of a lockdep-RCU slat is someone accessing an
|
||||
RCU-protected data structure without either (1) being in the right kind of
|
||||
RCU read-side critical section or (2) holding the right update-side lock.
|
||||
This problem can therefore be serious: it might result in random memory
|
||||
overwriting or worse. There can of course be false positives, this
|
||||
being the real world and all that.
|
||||
|
||||
So let's look at an example RCU lockdep splat from 3.0-rc5, one that
|
||||
has long since been fixed:
|
||||
|
||||
===============================
|
||||
[ INFO: suspicious RCU usage. ]
|
||||
-------------------------------
|
||||
block/cfq-iosched.c:2776 suspicious rcu_dereference_protected() usage!
|
||||
|
||||
other info that might help us debug this:
|
||||
|
||||
|
||||
rcu_scheduler_active = 1, debug_locks = 0
|
||||
3 locks held by scsi_scan_6/1552:
|
||||
#0: (&shost->scan_mutex){+.+.+.}, at: [<ffffffff8145efca>]
|
||||
scsi_scan_host_selected+0x5a/0x150
|
||||
#1: (&eq->sysfs_lock){+.+...}, at: [<ffffffff812a5032>]
|
||||
elevator_exit+0x22/0x60
|
||||
#2: (&(&q->__queue_lock)->rlock){-.-...}, at: [<ffffffff812b6233>]
|
||||
cfq_exit_queue+0x43/0x190
|
||||
|
||||
stack backtrace:
|
||||
Pid: 1552, comm: scsi_scan_6 Not tainted 3.0.0-rc5 #17
|
||||
Call Trace:
|
||||
[<ffffffff810abb9b>] lockdep_rcu_dereference+0xbb/0xc0
|
||||
[<ffffffff812b6139>] __cfq_exit_single_io_context+0xe9/0x120
|
||||
[<ffffffff812b626c>] cfq_exit_queue+0x7c/0x190
|
||||
[<ffffffff812a5046>] elevator_exit+0x36/0x60
|
||||
[<ffffffff812a802a>] blk_cleanup_queue+0x4a/0x60
|
||||
[<ffffffff8145cc09>] scsi_free_queue+0x9/0x10
|
||||
[<ffffffff81460944>] __scsi_remove_device+0x84/0xd0
|
||||
[<ffffffff8145dca3>] scsi_probe_and_add_lun+0x353/0xb10
|
||||
[<ffffffff817da069>] ? error_exit+0x29/0xb0
|
||||
[<ffffffff817d98ed>] ? _raw_spin_unlock_irqrestore+0x3d/0x80
|
||||
[<ffffffff8145e722>] __scsi_scan_target+0x112/0x680
|
||||
[<ffffffff812c690d>] ? trace_hardirqs_off_thunk+0x3a/0x3c
|
||||
[<ffffffff817da069>] ? error_exit+0x29/0xb0
|
||||
[<ffffffff812bcc60>] ? kobject_del+0x40/0x40
|
||||
[<ffffffff8145ed16>] scsi_scan_channel+0x86/0xb0
|
||||
[<ffffffff8145f0b0>] scsi_scan_host_selected+0x140/0x150
|
||||
[<ffffffff8145f149>] do_scsi_scan_host+0x89/0x90
|
||||
[<ffffffff8145f170>] do_scan_async+0x20/0x160
|
||||
[<ffffffff8145f150>] ? do_scsi_scan_host+0x90/0x90
|
||||
[<ffffffff810975b6>] kthread+0xa6/0xb0
|
||||
[<ffffffff817db154>] kernel_thread_helper+0x4/0x10
|
||||
[<ffffffff81066430>] ? finish_task_switch+0x80/0x110
|
||||
[<ffffffff817d9c04>] ? retint_restore_args+0xe/0xe
|
||||
[<ffffffff81097510>] ? __init_kthread_worker+0x70/0x70
|
||||
[<ffffffff817db150>] ? gs_change+0xb/0xb
|
||||
|
||||
Line 2776 of block/cfq-iosched.c in v3.0-rc5 is as follows:
|
||||
|
||||
if (rcu_dereference(ioc->ioc_data) == cic) {
|
||||
|
||||
This form says that it must be in a plain vanilla RCU read-side critical
|
||||
section, but the "other info" list above shows that this is not the
|
||||
case. Instead, we hold three locks, one of which might be RCU related.
|
||||
And maybe that lock really does protect this reference. If so, the fix
|
||||
is to inform RCU, perhaps by changing __cfq_exit_single_io_context() to
|
||||
take the struct request_queue "q" from cfq_exit_queue() as an argument,
|
||||
which would permit us to invoke rcu_dereference_protected as follows:
|
||||
|
||||
if (rcu_dereference_protected(ioc->ioc_data,
|
||||
lockdep_is_held(&q->queue_lock)) == cic) {
|
||||
|
||||
With this change, there would be no lockdep-RCU splat emitted if this
|
||||
code was invoked either from within an RCU read-side critical section
|
||||
or with the ->queue_lock held. In particular, this would have suppressed
|
||||
the above lockdep-RCU splat because ->queue_lock is held (see #2 in the
|
||||
list above).
|
||||
|
||||
On the other hand, perhaps we really do need an RCU read-side critical
|
||||
section. In this case, the critical section must span the use of the
|
||||
return value from rcu_dereference(), or at least until there is some
|
||||
reference count incremented or some such. One way to handle this is to
|
||||
add rcu_read_lock() and rcu_read_unlock() as follows:
|
||||
|
||||
rcu_read_lock();
|
||||
if (rcu_dereference(ioc->ioc_data) == cic) {
|
||||
spin_lock(&ioc->lock);
|
||||
rcu_assign_pointer(ioc->ioc_data, NULL);
|
||||
spin_unlock(&ioc->lock);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
With this change, the rcu_dereference() is always within an RCU
|
||||
read-side critical section, which again would have suppressed the
|
||||
above lockdep-RCU splat.
|
||||
|
||||
But in this particular case, we don't actually deference the pointer
|
||||
returned from rcu_dereference(). Instead, that pointer is just compared
|
||||
to the cic pointer, which means that the rcu_dereference() can be replaced
|
||||
by rcu_access_pointer() as follows:
|
||||
|
||||
if (rcu_access_pointer(ioc->ioc_data) == cic) {
|
||||
|
||||
Because it is legal to invoke rcu_access_pointer() without protection,
|
||||
this change would also suppress the above lockdep-RCU splat.
|
@ -32,9 +32,27 @@ checking of rcu_dereference() primitives:
|
||||
srcu_dereference(p, sp):
|
||||
Check for SRCU read-side critical section.
|
||||
rcu_dereference_check(p, c):
|
||||
Use explicit check expression "c". This is useful in
|
||||
code that is invoked by both readers and updaters.
|
||||
rcu_dereference_raw(p)
|
||||
Use explicit check expression "c" along with
|
||||
rcu_read_lock_held(). This is useful in code that is
|
||||
invoked by both RCU readers and updaters.
|
||||
rcu_dereference_bh_check(p, c):
|
||||
Use explicit check expression "c" along with
|
||||
rcu_read_lock_bh_held(). This is useful in code that
|
||||
is invoked by both RCU-bh readers and updaters.
|
||||
rcu_dereference_sched_check(p, c):
|
||||
Use explicit check expression "c" along with
|
||||
rcu_read_lock_sched_held(). This is useful in code that
|
||||
is invoked by both RCU-sched readers and updaters.
|
||||
srcu_dereference_check(p, c):
|
||||
Use explicit check expression "c" along with
|
||||
srcu_read_lock_held()(). This is useful in code that
|
||||
is invoked by both SRCU readers and updaters.
|
||||
rcu_dereference_index_check(p, c):
|
||||
Use explicit check expression "c", but the caller
|
||||
must supply one of the rcu_read_lock_held() functions.
|
||||
This is useful in code that uses RCU-protected arrays
|
||||
that is invoked by both RCU readers and updaters.
|
||||
rcu_dereference_raw(p):
|
||||
Don't check. (Use sparingly, if at all.)
|
||||
rcu_dereference_protected(p, c):
|
||||
Use explicit check expression "c", and omit all barriers
|
||||
@ -48,13 +66,11 @@ checking of rcu_dereference() primitives:
|
||||
value of the pointer itself, for example, against NULL.
|
||||
|
||||
The rcu_dereference_check() check expression can be any boolean
|
||||
expression, but would normally include one of the rcu_read_lock_held()
|
||||
family of functions and a lockdep expression. However, any boolean
|
||||
expression can be used. For a moderately ornate example, consider
|
||||
the following:
|
||||
expression, but would normally include a lockdep expression. However,
|
||||
any boolean expression can be used. For a moderately ornate example,
|
||||
consider the following:
|
||||
|
||||
file = rcu_dereference_check(fdt->fd[fd],
|
||||
rcu_read_lock_held() ||
|
||||
lockdep_is_held(&files->file_lock) ||
|
||||
atomic_read(&files->count) == 1);
|
||||
|
||||
@ -62,7 +78,7 @@ This expression picks up the pointer "fdt->fd[fd]" in an RCU-safe manner,
|
||||
and, if CONFIG_PROVE_RCU is configured, verifies that this expression
|
||||
is used in:
|
||||
|
||||
1. An RCU read-side critical section, or
|
||||
1. An RCU read-side critical section (implicit), or
|
||||
2. with files->file_lock held, or
|
||||
3. on an unshared files_struct.
|
||||
|
||||
|
@ -42,7 +42,7 @@ fqs_holdoff Holdoff time (in microseconds) between consecutive calls
|
||||
fqs_stutter Wait time (in seconds) between consecutive bursts
|
||||
of calls to force_quiescent_state().
|
||||
|
||||
irqreaders Says to invoke RCU readers from irq level. This is currently
|
||||
irqreader Says to invoke RCU readers from irq level. This is currently
|
||||
done via timers. Defaults to "1" for variants of RCU that
|
||||
permit this. (Or, more accurately, variants of RCU that do
|
||||
-not- permit this know to ignore this variable.)
|
||||
@ -79,19 +79,68 @@ stutter The length of time to run the test before pausing for this
|
||||
Specifying "stutter=0" causes the test to run continuously
|
||||
without pausing, which is the old default behavior.
|
||||
|
||||
test_boost Whether or not to test the ability of RCU to do priority
|
||||
boosting. Defaults to "test_boost=1", which performs
|
||||
RCU priority-inversion testing only if the selected
|
||||
RCU implementation supports priority boosting. Specifying
|
||||
"test_boost=0" never performs RCU priority-inversion
|
||||
testing. Specifying "test_boost=2" performs RCU
|
||||
priority-inversion testing even if the selected RCU
|
||||
implementation does not support RCU priority boosting,
|
||||
which can be used to test rcutorture's ability to
|
||||
carry out RCU priority-inversion testing.
|
||||
|
||||
test_boost_interval
|
||||
The number of seconds in an RCU priority-inversion test
|
||||
cycle. Defaults to "test_boost_interval=7". It is
|
||||
usually wise for this value to be relatively prime to
|
||||
the value selected for "stutter".
|
||||
|
||||
test_boost_duration
|
||||
The number of seconds to do RCU priority-inversion testing
|
||||
within any given "test_boost_interval". Defaults to
|
||||
"test_boost_duration=4".
|
||||
|
||||
test_no_idle_hz Whether or not to test the ability of RCU to operate in
|
||||
a kernel that disables the scheduling-clock interrupt to
|
||||
idle CPUs. Boolean parameter, "1" to test, "0" otherwise.
|
||||
Defaults to omitting this test.
|
||||
|
||||
torture_type The type of RCU to test: "rcu" for the rcu_read_lock() API,
|
||||
"rcu_sync" for rcu_read_lock() with synchronous reclamation,
|
||||
"rcu_bh" for the rcu_read_lock_bh() API, "rcu_bh_sync" for
|
||||
rcu_read_lock_bh() with synchronous reclamation, "srcu" for
|
||||
the "srcu_read_lock()" API, "sched" for the use of
|
||||
preempt_disable() together with synchronize_sched(),
|
||||
and "sched_expedited" for the use of preempt_disable()
|
||||
with synchronize_sched_expedited().
|
||||
torture_type The type of RCU to test, with string values as follows:
|
||||
|
||||
"rcu": rcu_read_lock(), rcu_read_unlock() and call_rcu().
|
||||
|
||||
"rcu_sync": rcu_read_lock(), rcu_read_unlock(), and
|
||||
synchronize_rcu().
|
||||
|
||||
"rcu_expedited": rcu_read_lock(), rcu_read_unlock(), and
|
||||
synchronize_rcu_expedited().
|
||||
|
||||
"rcu_bh": rcu_read_lock_bh(), rcu_read_unlock_bh(), and
|
||||
call_rcu_bh().
|
||||
|
||||
"rcu_bh_sync": rcu_read_lock_bh(), rcu_read_unlock_bh(),
|
||||
and synchronize_rcu_bh().
|
||||
|
||||
"rcu_bh_expedited": rcu_read_lock_bh(), rcu_read_unlock_bh(),
|
||||
and synchronize_rcu_bh_expedited().
|
||||
|
||||
"srcu": srcu_read_lock(), srcu_read_unlock() and
|
||||
synchronize_srcu().
|
||||
|
||||
"srcu_expedited": srcu_read_lock(), srcu_read_unlock() and
|
||||
synchronize_srcu_expedited().
|
||||
|
||||
"sched": preempt_disable(), preempt_enable(), and
|
||||
call_rcu_sched().
|
||||
|
||||
"sched_sync": preempt_disable(), preempt_enable(), and
|
||||
synchronize_sched().
|
||||
|
||||
"sched_expedited": preempt_disable(), preempt_enable(), and
|
||||
synchronize_sched_expedited().
|
||||
|
||||
Defaults to "rcu".
|
||||
|
||||
verbose Enable debug printk()s. Default is disabled.
|
||||
|
||||
@ -100,12 +149,12 @@ OUTPUT
|
||||
|
||||
The statistics output is as follows:
|
||||
|
||||
rcu-torture: --- Start of test: nreaders=16 stat_interval=0 verbose=0
|
||||
rcu-torture: rtc: 0000000000000000 ver: 1916 tfle: 0 rta: 1916 rtaf: 0 rtf: 1915
|
||||
rcu-torture: Reader Pipe: 1466408 9747 0 0 0 0 0 0 0 0 0
|
||||
rcu-torture: Reader Batch: 1464477 11678 0 0 0 0 0 0 0 0
|
||||
rcu-torture: Free-Block Circulation: 1915 1915 1915 1915 1915 1915 1915 1915 1915 1915 0
|
||||
rcu-torture: --- End of test
|
||||
rcu-torture:--- Start of test: nreaders=16 nfakewriters=4 stat_interval=30 verbose=0 test_no_idle_hz=1 shuffle_interval=3 stutter=5 irqreader=1 fqs_duration=0 fqs_holdoff=0 fqs_stutter=3 test_boost=1/0 test_boost_interval=7 test_boost_duration=4
|
||||
rcu-torture: rtc: (null) ver: 155441 tfle: 0 rta: 155441 rtaf: 8884 rtf: 155440 rtmbe: 0 rtbke: 0 rtbre: 0 rtbf: 0 rtb: 0 nt: 3055767
|
||||
rcu-torture: Reader Pipe: 727860534 34213 0 0 0 0 0 0 0 0 0
|
||||
rcu-torture: Reader Batch: 727877838 17003 0 0 0 0 0 0 0 0 0
|
||||
rcu-torture: Free-Block Circulation: 155440 155440 155440 155440 155440 155440 155440 155440 155440 155440 0
|
||||
rcu-torture:--- End of test: SUCCESS: nreaders=16 nfakewriters=4 stat_interval=30 verbose=0 test_no_idle_hz=1 shuffle_interval=3 stutter=5 irqreader=1 fqs_duration=0 fqs_holdoff=0 fqs_stutter=3 test_boost=1/0 test_boost_interval=7 test_boost_duration=4
|
||||
|
||||
The command "dmesg | grep torture:" will extract this information on
|
||||
most systems. On more esoteric configurations, it may be necessary to
|
||||
@ -113,26 +162,55 @@ use other commands to access the output of the printk()s used by
|
||||
the RCU torture test. The printk()s use KERN_ALERT, so they should
|
||||
be evident. ;-)
|
||||
|
||||
The first and last lines show the rcutorture module parameters, and the
|
||||
last line shows either "SUCCESS" or "FAILURE", based on rcutorture's
|
||||
automatic determination as to whether RCU operated correctly.
|
||||
|
||||
The entries are as follows:
|
||||
|
||||
o "rtc": The hexadecimal address of the structure currently visible
|
||||
to readers.
|
||||
|
||||
o "ver": The number of times since boot that the rcutw writer task
|
||||
o "ver": The number of times since boot that the RCU writer task
|
||||
has changed the structure visible to readers.
|
||||
|
||||
o "tfle": If non-zero, indicates that the "torture freelist"
|
||||
containing structure to be placed into the "rtc" area is empty.
|
||||
containing structures to be placed into the "rtc" area is empty.
|
||||
This condition is important, since it can fool you into thinking
|
||||
that RCU is working when it is not. :-/
|
||||
|
||||
o "rta": Number of structures allocated from the torture freelist.
|
||||
|
||||
o "rtaf": Number of allocations from the torture freelist that have
|
||||
failed due to the list being empty.
|
||||
failed due to the list being empty. It is not unusual for this
|
||||
to be non-zero, but it is bad for it to be a large fraction of
|
||||
the value indicated by "rta".
|
||||
|
||||
o "rtf": Number of frees into the torture freelist.
|
||||
|
||||
o "rtmbe": A non-zero value indicates that rcutorture believes that
|
||||
rcu_assign_pointer() and rcu_dereference() are not working
|
||||
correctly. This value should be zero.
|
||||
|
||||
o "rtbke": rcutorture was unable to create the real-time kthreads
|
||||
used to force RCU priority inversion. This value should be zero.
|
||||
|
||||
o "rtbre": Although rcutorture successfully created the kthreads
|
||||
used to force RCU priority inversion, it was unable to set them
|
||||
to the real-time priority level of 1. This value should be zero.
|
||||
|
||||
o "rtbf": The number of times that RCU priority boosting failed
|
||||
to resolve RCU priority inversion.
|
||||
|
||||
o "rtb": The number of times that rcutorture attempted to force
|
||||
an RCU priority inversion condition. If you are testing RCU
|
||||
priority boosting via the "test_boost" module parameter, this
|
||||
value should be non-zero.
|
||||
|
||||
o "nt": The number of times rcutorture ran RCU read-side code from
|
||||
within a timer handler. This value should be non-zero only
|
||||
if you specified the "irqreader" module parameter.
|
||||
|
||||
o "Reader Pipe": Histogram of "ages" of structures seen by readers.
|
||||
If any entries past the first two are non-zero, RCU is broken.
|
||||
And rcutorture prints the error flag string "!!!" to make sure
|
||||
@ -162,26 +240,15 @@ o "Free-Block Circulation": Shows the number of torture structures
|
||||
somehow gets incremented farther than it should.
|
||||
|
||||
Different implementations of RCU can provide implementation-specific
|
||||
additional information. For example, SRCU provides the following:
|
||||
additional information. For example, SRCU provides the following
|
||||
additional line:
|
||||
|
||||
srcu-torture: rtc: f8cf46a8 ver: 355 tfle: 0 rta: 356 rtaf: 0 rtf: 346 rtmbe: 0
|
||||
srcu-torture: Reader Pipe: 559738 939 0 0 0 0 0 0 0 0 0
|
||||
srcu-torture: Reader Batch: 560434 243 0 0 0 0 0 0 0 0
|
||||
srcu-torture: Free-Block Circulation: 355 354 353 352 351 350 349 348 347 346 0
|
||||
srcu-torture: per-CPU(idx=1): 0(0,1) 1(0,1) 2(0,0) 3(0,1)
|
||||
|
||||
The first four lines are similar to those for RCU. The last line shows
|
||||
the per-CPU counter state. The numbers in parentheses are the values
|
||||
of the "old" and "current" counters for the corresponding CPU. The
|
||||
"idx" value maps the "old" and "current" values to the underlying array,
|
||||
and is useful for debugging.
|
||||
|
||||
Similarly, sched_expedited RCU provides the following:
|
||||
|
||||
sched_expedited-torture: rtc: d0000000016c1880 ver: 1090796 tfle: 0 rta: 1090796 rtaf: 0 rtf: 1090787 rtmbe: 0 nt: 27713319
|
||||
sched_expedited-torture: Reader Pipe: 12660320201 95875 0 0 0 0 0 0 0 0 0
|
||||
sched_expedited-torture: Reader Batch: 12660424885 0 0 0 0 0 0 0 0 0 0
|
||||
sched_expedited-torture: Free-Block Circulation: 1090795 1090795 1090794 1090793 1090792 1090791 1090790 1090789 1090788 1090787 0
|
||||
This line shows the per-CPU counter state. The numbers in parentheses are
|
||||
the values of the "old" and "current" counters for the corresponding CPU.
|
||||
The "idx" value maps the "old" and "current" values to the underlying
|
||||
array, and is useful for debugging.
|
||||
|
||||
|
||||
USAGE
|
||||
|
@ -33,23 +33,23 @@ rcu/rcuboost:
|
||||
The output of "cat rcu/rcudata" looks as follows:
|
||||
|
||||
rcu_sched:
|
||||
0 c=20972 g=20973 pq=1 pqc=20972 qp=0 dt=545/1/0 df=50 of=0 ri=0 ql=163 qs=NRW. kt=0/W/0 ktl=ebc3 b=10 ci=153737 co=0 ca=0
|
||||
1 c=20972 g=20973 pq=1 pqc=20972 qp=0 dt=967/1/0 df=58 of=0 ri=0 ql=634 qs=NRW. kt=0/W/1 ktl=58c b=10 ci=191037 co=0 ca=0
|
||||
2 c=20972 g=20973 pq=1 pqc=20972 qp=0 dt=1081/1/0 df=175 of=0 ri=0 ql=74 qs=N.W. kt=0/W/2 ktl=da94 b=10 ci=75991 co=0 ca=0
|
||||
3 c=20942 g=20943 pq=1 pqc=20942 qp=1 dt=1846/0/0 df=404 of=0 ri=0 ql=0 qs=.... kt=0/W/3 ktl=d1cd b=10 ci=72261 co=0 ca=0
|
||||
4 c=20972 g=20973 pq=1 pqc=20972 qp=0 dt=369/1/0 df=83 of=0 ri=0 ql=48 qs=N.W. kt=0/W/4 ktl=e0e7 b=10 ci=128365 co=0 ca=0
|
||||
5 c=20972 g=20973 pq=1 pqc=20972 qp=0 dt=381/1/0 df=64 of=0 ri=0 ql=169 qs=NRW. kt=0/W/5 ktl=fb2f b=10 ci=164360 co=0 ca=0
|
||||
6 c=20972 g=20973 pq=1 pqc=20972 qp=0 dt=1037/1/0 df=183 of=0 ri=0 ql=62 qs=N.W. kt=0/W/6 ktl=d2ad b=10 ci=65663 co=0 ca=0
|
||||
7 c=20897 g=20897 pq=1 pqc=20896 qp=0 dt=1572/0/0 df=382 of=0 ri=0 ql=0 qs=.... kt=0/W/7 ktl=cf15 b=10 ci=75006 co=0 ca=0
|
||||
0 c=20972 g=20973 pq=1 pgp=20973 qp=0 dt=545/1/0 df=50 of=0 ri=0 ql=163 qs=NRW. kt=0/W/0 ktl=ebc3 b=10 ci=153737 co=0 ca=0
|
||||
1 c=20972 g=20973 pq=1 pgp=20973 qp=0 dt=967/1/0 df=58 of=0 ri=0 ql=634 qs=NRW. kt=0/W/1 ktl=58c b=10 ci=191037 co=0 ca=0
|
||||
2 c=20972 g=20973 pq=1 pgp=20973 qp=0 dt=1081/1/0 df=175 of=0 ri=0 ql=74 qs=N.W. kt=0/W/2 ktl=da94 b=10 ci=75991 co=0 ca=0
|
||||
3 c=20942 g=20943 pq=1 pgp=20942 qp=1 dt=1846/0/0 df=404 of=0 ri=0 ql=0 qs=.... kt=0/W/3 ktl=d1cd b=10 ci=72261 co=0 ca=0
|
||||
4 c=20972 g=20973 pq=1 pgp=20973 qp=0 dt=369/1/0 df=83 of=0 ri=0 ql=48 qs=N.W. kt=0/W/4 ktl=e0e7 b=10 ci=128365 co=0 ca=0
|
||||
5 c=20972 g=20973 pq=1 pgp=20973 qp=0 dt=381/1/0 df=64 of=0 ri=0 ql=169 qs=NRW. kt=0/W/5 ktl=fb2f b=10 ci=164360 co=0 ca=0
|
||||
6 c=20972 g=20973 pq=1 pgp=20973 qp=0 dt=1037/1/0 df=183 of=0 ri=0 ql=62 qs=N.W. kt=0/W/6 ktl=d2ad b=10 ci=65663 co=0 ca=0
|
||||
7 c=20897 g=20897 pq=1 pgp=20896 qp=0 dt=1572/0/0 df=382 of=0 ri=0 ql=0 qs=.... kt=0/W/7 ktl=cf15 b=10 ci=75006 co=0 ca=0
|
||||
rcu_bh:
|
||||
0 c=1480 g=1480 pq=1 pqc=1479 qp=0 dt=545/1/0 df=6 of=0 ri=1 ql=0 qs=.... kt=0/W/0 ktl=ebc3 b=10 ci=0 co=0 ca=0
|
||||
1 c=1480 g=1480 pq=1 pqc=1479 qp=0 dt=967/1/0 df=3 of=0 ri=1 ql=0 qs=.... kt=0/W/1 ktl=58c b=10 ci=151 co=0 ca=0
|
||||
2 c=1480 g=1480 pq=1 pqc=1479 qp=0 dt=1081/1/0 df=6 of=0 ri=1 ql=0 qs=.... kt=0/W/2 ktl=da94 b=10 ci=0 co=0 ca=0
|
||||
3 c=1480 g=1480 pq=1 pqc=1479 qp=0 dt=1846/0/0 df=8 of=0 ri=1 ql=0 qs=.... kt=0/W/3 ktl=d1cd b=10 ci=0 co=0 ca=0
|
||||
4 c=1480 g=1480 pq=1 pqc=1479 qp=0 dt=369/1/0 df=6 of=0 ri=1 ql=0 qs=.... kt=0/W/4 ktl=e0e7 b=10 ci=0 co=0 ca=0
|
||||
5 c=1480 g=1480 pq=1 pqc=1479 qp=0 dt=381/1/0 df=4 of=0 ri=1 ql=0 qs=.... kt=0/W/5 ktl=fb2f b=10 ci=0 co=0 ca=0
|
||||
6 c=1480 g=1480 pq=1 pqc=1479 qp=0 dt=1037/1/0 df=6 of=0 ri=1 ql=0 qs=.... kt=0/W/6 ktl=d2ad b=10 ci=0 co=0 ca=0
|
||||
7 c=1474 g=1474 pq=1 pqc=1473 qp=0 dt=1572/0/0 df=8 of=0 ri=1 ql=0 qs=.... kt=0/W/7 ktl=cf15 b=10 ci=0 co=0 ca=0
|
||||
0 c=1480 g=1480 pq=1 pgp=1480 qp=0 dt=545/1/0 df=6 of=0 ri=1 ql=0 qs=.... kt=0/W/0 ktl=ebc3 b=10 ci=0 co=0 ca=0
|
||||
1 c=1480 g=1480 pq=1 pgp=1480 qp=0 dt=967/1/0 df=3 of=0 ri=1 ql=0 qs=.... kt=0/W/1 ktl=58c b=10 ci=151 co=0 ca=0
|
||||
2 c=1480 g=1480 pq=1 pgp=1480 qp=0 dt=1081/1/0 df=6 of=0 ri=1 ql=0 qs=.... kt=0/W/2 ktl=da94 b=10 ci=0 co=0 ca=0
|
||||
3 c=1480 g=1480 pq=1 pgp=1480 qp=0 dt=1846/0/0 df=8 of=0 ri=1 ql=0 qs=.... kt=0/W/3 ktl=d1cd b=10 ci=0 co=0 ca=0
|
||||
4 c=1480 g=1480 pq=1 pgp=1480 qp=0 dt=369/1/0 df=6 of=0 ri=1 ql=0 qs=.... kt=0/W/4 ktl=e0e7 b=10 ci=0 co=0 ca=0
|
||||
5 c=1480 g=1480 pq=1 pgp=1480 qp=0 dt=381/1/0 df=4 of=0 ri=1 ql=0 qs=.... kt=0/W/5 ktl=fb2f b=10 ci=0 co=0 ca=0
|
||||
6 c=1480 g=1480 pq=1 pgp=1480 qp=0 dt=1037/1/0 df=6 of=0 ri=1 ql=0 qs=.... kt=0/W/6 ktl=d2ad b=10 ci=0 co=0 ca=0
|
||||
7 c=1474 g=1474 pq=1 pgp=1473 qp=0 dt=1572/0/0 df=8 of=0 ri=1 ql=0 qs=.... kt=0/W/7 ktl=cf15 b=10 ci=0 co=0 ca=0
|
||||
|
||||
The first section lists the rcu_data structures for rcu_sched, the second
|
||||
for rcu_bh. Note that CONFIG_TREE_PREEMPT_RCU kernels will have an
|
||||
@ -84,7 +84,7 @@ o "pq" indicates that this CPU has passed through a quiescent state
|
||||
CPU has not yet reported that fact, (2) some other CPU has not
|
||||
yet reported for this grace period, or (3) both.
|
||||
|
||||
o "pqc" indicates which grace period the last-observed quiescent
|
||||
o "pgp" indicates which grace period the last-observed quiescent
|
||||
state for this CPU corresponds to. This is important for handling
|
||||
the race between CPU 0 reporting an extended dynticks-idle
|
||||
quiescent state for CPU 1 and CPU 1 suddenly waking up and
|
||||
@ -184,10 +184,14 @@ o "kt" is the per-CPU kernel-thread state. The digit preceding
|
||||
The number after the final slash is the CPU that the kthread
|
||||
is actually running on.
|
||||
|
||||
This field is displayed only for CONFIG_RCU_BOOST kernels.
|
||||
|
||||
o "ktl" is the low-order 16 bits (in hexadecimal) of the count of
|
||||
the number of times that this CPU's per-CPU kthread has gone
|
||||
through its loop servicing invoke_rcu_cpu_kthread() requests.
|
||||
|
||||
This field is displayed only for CONFIG_RCU_BOOST kernels.
|
||||
|
||||
o "b" is the batch limit for this CPU. If more than this number
|
||||
of RCU callbacks is ready to invoke, then the remainder will
|
||||
be deferred.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* File: Documentation/blackfin/bfin-gpio-note.txt
|
||||
* File: Documentation/blackfin/bfin-gpio-notes.txt
|
||||
* Based on:
|
||||
* Author:
|
||||
*
|
||||
|
@ -186,7 +186,7 @@ a virtual address mapping (unlike the earlier scheme of virtual address
|
||||
do not have a corresponding kernel virtual address space mapping) and
|
||||
low-memory pages.
|
||||
|
||||
Note: Please refer to Documentation/PCI/PCI-DMA-mapping.txt for a discussion
|
||||
Note: Please refer to Documentation/DMA-API-HOWTO.txt for a discussion
|
||||
on PCI high mem DMA aspects and mapping of scatter gather lists, and support
|
||||
for 64 bit PCI.
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
[ NOTE: The virt_to_bus() and bus_to_virt() functions have been
|
||||
superseded by the functionality provided by the PCI DMA interface
|
||||
(see Documentation/PCI/PCI-DMA-mapping.txt). They continue
|
||||
(see Documentation/DMA-API-HOWTO.txt). They continue
|
||||
to be documented below for historical purposes, but new code
|
||||
must not use them. --davidm 00/12/12 ]
|
||||
|
||||
|
@ -109,7 +109,7 @@ this interface. (see http://tom.ist-im-web.de/download/pktcdvd )
|
||||
|
||||
For a description of the sysfs interface look into the file:
|
||||
|
||||
Documentation/ABI/testing/sysfs-block-pktcdvd
|
||||
Documentation/ABI/testing/sysfs-class-pktcdvd
|
||||
|
||||
|
||||
Using the pktcdvd debugfs interface
|
||||
|
@ -132,7 +132,7 @@ The sampling rate is limited by the HW transition latency:
|
||||
transition_latency * 100
|
||||
Or by kernel restrictions:
|
||||
If CONFIG_NO_HZ is set, the limit is 10ms fixed.
|
||||
If CONFIG_NO_HZ is not set or no_hz=off boot parameter is used, the
|
||||
If CONFIG_NO_HZ is not set or nohz=off boot parameter is used, the
|
||||
limits depend on the CONFIG_HZ option:
|
||||
HZ=1000: min=20000us (20ms)
|
||||
HZ=250: min=80000us (80ms)
|
||||
|
@ -278,7 +278,7 @@ enabled, a configurable percentage of memory allocations will be made to
|
||||
fail; these failures can be restricted to a specific range of code.
|
||||
Running with fault injection enabled allows the programmer to see how the
|
||||
code responds when things go badly. See
|
||||
Documentation/fault-injection/fault-injection.text for more information on
|
||||
Documentation/fault-injection/fault-injection.txt for more information on
|
||||
how to use this facility.
|
||||
|
||||
Other kinds of errors can be found with the "sparse" static analysis tool.
|
||||
|
44
Documentation/devicetree/bindings/arm/l2cc.txt
Normal file
44
Documentation/devicetree/bindings/arm/l2cc.txt
Normal file
@ -0,0 +1,44 @@
|
||||
* ARM L2 Cache Controller
|
||||
|
||||
ARM cores often have a separate level 2 cache controller. There are various
|
||||
implementations of the L2 cache controller with compatible programming models.
|
||||
The ARM L2 cache representation in the device tree should be done as follows:
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible : should be one of:
|
||||
"arm,pl310-cache"
|
||||
"arm,l220-cache"
|
||||
"arm,l210-cache"
|
||||
- cache-unified : Specifies the cache is a unified cache.
|
||||
- cache-level : Should be set to 2 for a level 2 cache.
|
||||
- reg : Physical base address and size of cache controller's memory mapped
|
||||
registers.
|
||||
|
||||
Optional properties:
|
||||
|
||||
- arm,data-latency : Cycles of latency for Data RAM accesses. Specifies 3 cells of
|
||||
read, write and setup latencies. Minimum valid values are 1. Controllers
|
||||
without setup latency control should use a value of 0.
|
||||
- arm,tag-latency : Cycles of latency for Tag RAM accesses. Specifies 3 cells of
|
||||
read, write and setup latencies. Controllers without setup latency control
|
||||
should use 0. Controllers without separate read and write Tag RAM latency
|
||||
values should only use the first cell.
|
||||
- arm,dirty-latency : Cycles of latency for Dirty RAMs. This is a single cell.
|
||||
- arm,filter-ranges : <start length> Starting address and length of window to
|
||||
filter. Addresses in the filter window are directed to the M1 port. Other
|
||||
addresses will go to the M0 port.
|
||||
- interrupts : 1 combined interrupt.
|
||||
|
||||
Example:
|
||||
|
||||
L2: cache-controller {
|
||||
compatible = "arm,pl310-cache";
|
||||
reg = <0xfff12000 0x1000>;
|
||||
arm,data-latency = <1 1 1>;
|
||||
arm,tag-latency = <2 2 2>;
|
||||
arm,filter-latency = <0x80000000 0x8000000>;
|
||||
cache-unified;
|
||||
cache-level = <2>;
|
||||
interrupts = <45>;
|
||||
};
|
@ -8,7 +8,7 @@ node's name represents the name of the corresponding LED.
|
||||
|
||||
LED sub-node properties:
|
||||
- gpios : Should specify the LED's GPIO, see "Specifying GPIO information
|
||||
for devices" in Documentation/powerpc/booting-without-of.txt. Active
|
||||
for devices" in Documentation/devicetree/booting-without-of.txt. Active
|
||||
low LEDs should be indicated using flags in the GPIO specifier.
|
||||
- label : (optional) The label for this LED. If omitted, the label is
|
||||
taken from the node name (excluding the unit address).
|
||||
|
31
Documentation/devicetree/bindings/serial/rs485.txt
Normal file
31
Documentation/devicetree/bindings/serial/rs485.txt
Normal file
@ -0,0 +1,31 @@
|
||||
* RS485 serial communications
|
||||
|
||||
The RTS signal is capable of automatically controlling line direction for
|
||||
the built-in half-duplex mode.
|
||||
The properties described hereafter shall be given to a half-duplex capable
|
||||
UART node.
|
||||
|
||||
Required properties:
|
||||
- rs485-rts-delay: prop-encoded-array <a b> where:
|
||||
* a is the delay beteween rts signal and beginning of data sent in milliseconds.
|
||||
it corresponds to the delay before sending data.
|
||||
* b is the delay between end of data sent and rts signal in milliseconds
|
||||
it corresponds to the delay after sending data and actual release of the line.
|
||||
|
||||
Optional properties:
|
||||
- linux,rs485-enabled-at-boot-time: empty property telling to enable the rs485
|
||||
feature at boot time. It can be disabled later with proper ioctl.
|
||||
- rs485-rx-during-tx: empty property that enables the receiving of data even
|
||||
whilst sending data.
|
||||
|
||||
RS485 example for Atmel USART:
|
||||
usart0: serial@fff8c000 {
|
||||
compatible = "atmel,at91sam9260-usart";
|
||||
reg = <0xfff8c000 0x4000>;
|
||||
interrupts = <7>;
|
||||
atmel,use-dma-rx;
|
||||
atmel,use-dma-tx;
|
||||
linux,rs485-enabled-at-boot-time;
|
||||
rs485-rts-delay = <0 200>; // in milliseconds
|
||||
};
|
||||
|
27
Documentation/devicetree/bindings/tty/serial/atmel-usart.txt
Normal file
27
Documentation/devicetree/bindings/tty/serial/atmel-usart.txt
Normal file
@ -0,0 +1,27 @@
|
||||
* Atmel Universal Synchronous Asynchronous Receiver/Transmitter (USART)
|
||||
|
||||
Required properties:
|
||||
- compatible: Should be "atmel,<chip>-usart"
|
||||
The compatible <chip> indicated will be the first SoC to support an
|
||||
additional mode or an USART new feature.
|
||||
- reg: Should contain registers location and length
|
||||
- interrupts: Should contain interrupt
|
||||
|
||||
Optional properties:
|
||||
- atmel,use-dma-rx: use of PDC or DMA for receiving data
|
||||
- atmel,use-dma-tx: use of PDC or DMA for transmitting data
|
||||
|
||||
<chip> compatible description:
|
||||
- at91rm9200: legacy USART support
|
||||
- at91sam9260: generic USART implementation for SAM9 SoCs
|
||||
|
||||
Example:
|
||||
|
||||
usart0: serial@fff8c000 {
|
||||
compatible = "atmel,at91sam9260-usart";
|
||||
reg = <0xfff8c000 0x4000>;
|
||||
interrupts = <7>;
|
||||
atmel,use-dma-rx;
|
||||
atmel,use-dma-tx;
|
||||
};
|
||||
|
@ -0,0 +1,25 @@
|
||||
* Synopsys DesignWare ABP UART
|
||||
|
||||
Required properties:
|
||||
- compatible : "snps,dw-apb-uart"
|
||||
- reg : offset and length of the register set for the device.
|
||||
- interrupts : should contain uart interrupt.
|
||||
- clock-frequency : the input clock frequency for the UART.
|
||||
|
||||
Optional properties:
|
||||
- reg-shift : quantity to shift the register offsets by. If this property is
|
||||
not present then the register offsets are not shifted.
|
||||
- reg-io-width : the size (in bytes) of the IO accesses that should be
|
||||
performed on the device. If this property is not present then single byte
|
||||
accesses are used.
|
||||
|
||||
Example:
|
||||
|
||||
uart@80230000 {
|
||||
compatible = "snps,dw-apb-uart";
|
||||
reg = <0x80230000 0x100>;
|
||||
clock-frequency = <3686400>;
|
||||
interrupts = <10>;
|
||||
reg-shift = <2>;
|
||||
reg-io-width = <4>;
|
||||
};
|
@ -48,10 +48,6 @@ devclass_add_device is called to enumerate the device within the class
|
||||
and actually register it with the class, which happens with the
|
||||
class's register_dev callback.
|
||||
|
||||
NOTE: The device class structures and core routines to manipulate them
|
||||
are not in the mainline kernel, so the discussion is still a bit
|
||||
speculative.
|
||||
|
||||
|
||||
Driver
|
||||
~~~~~~
|
||||
|
@ -45,33 +45,52 @@ struct device_attribute {
|
||||
const char *buf, size_t count);
|
||||
};
|
||||
|
||||
Attributes of devices can be exported via drivers using a simple
|
||||
procfs-like interface.
|
||||
Attributes of devices can be exported by a device driver through sysfs.
|
||||
|
||||
Please see Documentation/filesystems/sysfs.txt for more information
|
||||
on how sysfs works.
|
||||
|
||||
As explained in Documentation/kobject.txt, device attributes must be be
|
||||
created before the KOBJ_ADD uevent is generated. The only way to realize
|
||||
that is by defining an attribute group.
|
||||
|
||||
Attributes are declared using a macro called DEVICE_ATTR:
|
||||
|
||||
#define DEVICE_ATTR(name,mode,show,store)
|
||||
|
||||
Example:
|
||||
|
||||
DEVICE_ATTR(power,0644,show_power,store_power);
|
||||
static DEVICE_ATTR(type, 0444, show_type, NULL);
|
||||
static DEVICE_ATTR(power, 0644, show_power, store_power);
|
||||
|
||||
This declares a structure of type struct device_attribute named
|
||||
'dev_attr_power'. This can then be added and removed to the device's
|
||||
directory using:
|
||||
This declares two structures of type struct device_attribute with respective
|
||||
names 'dev_attr_type' and 'dev_attr_power'. These two attributes can be
|
||||
organized as follows into a group:
|
||||
|
||||
int device_create_file(struct device *device, struct device_attribute * entry);
|
||||
void device_remove_file(struct device * dev, struct device_attribute * attr);
|
||||
static struct attribute *dev_attrs[] = {
|
||||
&dev_attr_type.attr,
|
||||
&dev_attr_power.attr,
|
||||
NULL,
|
||||
};
|
||||
|
||||
Example:
|
||||
static struct attribute_group dev_attr_group = {
|
||||
.attrs = dev_attrs,
|
||||
};
|
||||
|
||||
device_create_file(dev,&dev_attr_power);
|
||||
device_remove_file(dev,&dev_attr_power);
|
||||
static const struct attribute_group *dev_attr_groups[] = {
|
||||
&dev_attr_group,
|
||||
NULL,
|
||||
};
|
||||
|
||||
The file name will be 'power' with a mode of 0644 (-rw-r--r--).
|
||||
This array of groups can then be associated with a device by setting the
|
||||
group pointer in struct device before device_register() is invoked:
|
||||
|
||||
dev->groups = dev_attr_groups;
|
||||
device_register(dev);
|
||||
|
||||
The device_register() function will use the 'groups' pointer to create the
|
||||
device attributes and the device_unregister() function will use this pointer
|
||||
to remove the device attributes.
|
||||
|
||||
Word of warning: While the kernel allows device_create_file() and
|
||||
device_remove_file() to be called on a device at any time, userspace has
|
||||
@ -84,24 +103,4 @@ not know about the new attributes.
|
||||
This is important for device driver that need to publish additional
|
||||
attributes for a device at driver probe time. If the device driver simply
|
||||
calls device_create_file() on the device structure passed to it, then
|
||||
userspace will never be notified of the new attributes. Instead, it should
|
||||
probably use class_create() and class->dev_attrs to set up a list of
|
||||
desired attributes in the modules_init function, and then in the .probe()
|
||||
hook, and then use device_create() to create a new device as a child
|
||||
of the probed device. The new device will generate a new uevent and
|
||||
properly advertise the new attributes to userspace.
|
||||
|
||||
For example, if a driver wanted to add the following attributes:
|
||||
struct device_attribute mydriver_attribs[] = {
|
||||
__ATTR(port_count, 0444, port_count_show),
|
||||
__ATTR(serial_number, 0444, serial_number_show),
|
||||
NULL
|
||||
};
|
||||
|
||||
Then in the module init function is would do:
|
||||
mydriver_class = class_create(THIS_MODULE, "my_attrs");
|
||||
mydriver_class.dev_attr = mydriver_attribs;
|
||||
|
||||
And assuming 'dev' is the struct device passed into the probe hook, the driver
|
||||
probe function would do something like:
|
||||
device_create(&mydriver_class, dev, chrdev, &private_data, "my_name");
|
||||
userspace will never be notified of the new attributes.
|
||||
|
@ -92,7 +92,7 @@ OPTIONS
|
||||
|
||||
wfdno=n the file descriptor for writing with trans=fd
|
||||
|
||||
maxdata=n the number of bytes to use for 9p packet payload (msize)
|
||||
msize=n the number of bytes to use for 9p packet payload
|
||||
|
||||
port=n port to connect to on the remote server
|
||||
|
||||
|
@ -127,9 +127,9 @@ fscache_enqueue_object()).
|
||||
PROVISION OF CPU TIME
|
||||
---------------------
|
||||
|
||||
The work to be done by the various states is given CPU time by the threads of
|
||||
the slow work facility (see Documentation/slow-work.txt). This is used in
|
||||
preference to the workqueue facility because:
|
||||
The work to be done by the various states was given CPU time by the threads of
|
||||
the slow work facility. This was used in preference to the workqueue facility
|
||||
because:
|
||||
|
||||
(1) Threads may be completely occupied for very long periods of time by a
|
||||
particular work item. These state actions may be doing sequences of
|
||||
|
@ -53,11 +53,12 @@ fcntl(), with all the problems that implies.
|
||||
1.3 Mandatory Locking As A Mount Option
|
||||
---------------------------------------
|
||||
|
||||
Mandatory locking, as described in 'Documentation/filesystems/mandatory.txt'
|
||||
was prior to this release a general configuration option that was valid for
|
||||
all mounted filesystems. This had a number of inherent dangers, not the
|
||||
least of which was the ability to freeze an NFS server by asking it to read
|
||||
a file for which a mandatory lock existed.
|
||||
Mandatory locking, as described in
|
||||
'Documentation/filesystems/mandatory-locking.txt' was prior to this release a
|
||||
general configuration option that was valid for all mounted filesystems. This
|
||||
had a number of inherent dangers, not the least of which was the ability to
|
||||
freeze an NFS server by asking it to read a file for which a mandatory lock
|
||||
existed.
|
||||
|
||||
From this release of the kernel, mandatory locking can be turned on and off
|
||||
on a per-filesystem basis, using the mount options 'mand' and 'nomand'.
|
||||
|
@ -47,7 +47,7 @@ request-key will find the first matching line and corresponding program. In
|
||||
this case, /some/other/program will handle all uid lookups and
|
||||
/usr/sbin/nfs.idmap will handle gid, user, and group lookups.
|
||||
|
||||
See <file:Documentation/security/keys-request-keys.txt> for more information
|
||||
See <file:Documentation/security/keys-request-key.txt> for more information
|
||||
about the request-key function.
|
||||
|
||||
|
||||
|
@ -58,8 +58,9 @@ data transfers.
|
||||
POHMELFS clients operate with a working set of servers and are capable of balancing read-only
|
||||
operations (like lookups or directory listings) between them according to IO priorities.
|
||||
Administrators can add or remove servers from the set at run-time via special commands (described
|
||||
in Documentation/pohmelfs/info.txt file). Writes are replicated to all servers, which are connected
|
||||
with write permission turned on. IO priority and permissions can be changed in run-time.
|
||||
in Documentation/filesystems/pohmelfs/info.txt file). Writes are replicated to all servers, which
|
||||
are connected with write permission turned on. IO priority and permissions can be changed in
|
||||
run-time.
|
||||
|
||||
POHMELFS is capable of full data channel encryption and/or strong crypto hashing.
|
||||
One can select any kernel supported cipher, encryption mode, hash type and operation mode
|
||||
|
@ -1263,7 +1263,7 @@ review the kernel documentation in the directory /usr/src/linux/Documentation.
|
||||
This chapter is heavily based on the documentation included in the pre 2.2
|
||||
kernels, and became part of it in version 2.2.1 of the Linux kernel.
|
||||
|
||||
Please see: Documentation/sysctls/ directory for descriptions of these
|
||||
Please see: Documentation/sysctl/ directory for descriptions of these
|
||||
entries.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
@ -4,7 +4,7 @@ sysfs - _The_ filesystem for exporting kernel objects.
|
||||
Patrick Mochel <mochel@osdl.org>
|
||||
Mike Murphy <mamurph@cs.clemson.edu>
|
||||
|
||||
Revised: 15 July 2010
|
||||
Revised: 16 August 2011
|
||||
Original: 10 January 2003
|
||||
|
||||
|
||||
@ -370,3 +370,11 @@ int driver_create_file(struct device_driver *, const struct driver_attribute *);
|
||||
void driver_remove_file(struct device_driver *, const struct driver_attribute *);
|
||||
|
||||
|
||||
Documentation
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
The sysfs directory structure and the attributes in each directory define an
|
||||
ABI between the kernel and user space. As for any ABI, it is important that
|
||||
this ABI is stable and properly documented. All new sysfs attributes must be
|
||||
documented in Documentation/ABI. See also Documentation/ABI/README for more
|
||||
information.
|
||||
|
@ -1053,9 +1053,6 @@ manipulate dentries:
|
||||
and the dentry is returned. The caller must use dput()
|
||||
to free the dentry when it finishes using it.
|
||||
|
||||
For further information on dentry locking, please refer to the document
|
||||
Documentation/filesystems/dentry-locking.txt.
|
||||
|
||||
Mount Options
|
||||
=============
|
||||
|
||||
|
@ -180,9 +180,3 @@ separated by spaces:
|
||||
|
||||
This tells the kernel what program to run initially. By default this is
|
||||
/sbin/init, but /sbin/sash or /bin/sh are common alternatives.
|
||||
|
||||
(*) vdc=...
|
||||
|
||||
This option configures the MB93493 companion chip visual display
|
||||
driver. Please see Documentation/frv/mb93493/vdc.txt for more
|
||||
information.
|
||||
|
25
Documentation/hwmon/ad7314
Normal file
25
Documentation/hwmon/ad7314
Normal file
@ -0,0 +1,25 @@
|
||||
Kernel driver ad7314
|
||||
====================
|
||||
|
||||
Supported chips:
|
||||
* Analog Devices AD7314
|
||||
Prefix: 'ad7314'
|
||||
Datasheet: Publicly available at Analog Devices website.
|
||||
* Analog Devices ADT7301
|
||||
Prefix: 'adt7301'
|
||||
Datasheet: Publicly available at Analog Devices website.
|
||||
* Analog Devices ADT7302
|
||||
Prefix: 'adt7302'
|
||||
Datasheet: Publicly available at Analog Devices website.
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
Driver supports the above parts. The ad7314 has a 10 bit
|
||||
sensor with 1lsb = 0.25 degrees centigrade. The adt7301 and
|
||||
adt7302 have 14 bit sensors with 1lsb = 0.03125 degrees centigrade.
|
||||
|
||||
Notes
|
||||
-----
|
||||
|
||||
Currently power down mode is not supported.
|
@ -6,6 +6,10 @@ Supported chips:
|
||||
Prefix: 'adm1275'
|
||||
Addresses scanned: -
|
||||
Datasheet: www.analog.com/static/imported-files/data_sheets/ADM1275.pdf
|
||||
* Analog Devices ADM1276
|
||||
Prefix: 'adm1276'
|
||||
Addresses scanned: -
|
||||
Datasheet: www.analog.com/static/imported-files/data_sheets/ADM1276.pdf
|
||||
|
||||
Author: Guenter Roeck <guenter.roeck@ericsson.com>
|
||||
|
||||
@ -13,13 +17,13 @@ Author: Guenter Roeck <guenter.roeck@ericsson.com>
|
||||
Description
|
||||
-----------
|
||||
|
||||
This driver supports hardware montoring for Analog Devices ADM1275 Hot-Swap
|
||||
Controller and Digital Power Monitor.
|
||||
This driver supports hardware montoring for Analog Devices ADM1275 and ADM1276
|
||||
Hot-Swap Controller and Digital Power Monitor.
|
||||
|
||||
The ADM1275 is a hot-swap controller that allows a circuit board to be removed
|
||||
from or inserted into a live backplane. It also features current and voltage
|
||||
readback via an integrated 12-bit analog-to-digital converter (ADC), accessed
|
||||
using a PMBus. interface.
|
||||
ADM1275 and ADM1276 are hot-swap controllers that allow a circuit board to be
|
||||
removed from or inserted into a live backplane. They also feature current and
|
||||
voltage readback via an integrated 12-bit analog-to-digital converter (ADC),
|
||||
accessed using a PMBus interface.
|
||||
|
||||
The driver is a client driver to the core PMBus driver. Please see
|
||||
Documentation/hwmon/pmbus for details on PMBus client drivers.
|
||||
@ -48,17 +52,25 @@ attributes are write-only, all other attributes are read-only.
|
||||
|
||||
in1_label "vin1" or "vout1" depending on chip variant and
|
||||
configuration.
|
||||
in1_input Measured voltage. From READ_VOUT register.
|
||||
in1_min Minumum Voltage. From VOUT_UV_WARN_LIMIT register.
|
||||
in1_max Maximum voltage. From VOUT_OV_WARN_LIMIT register.
|
||||
in1_min_alarm Voltage low alarm. From VOLTAGE_UV_WARNING status.
|
||||
in1_max_alarm Voltage high alarm. From VOLTAGE_OV_WARNING status.
|
||||
in1_input Measured voltage.
|
||||
in1_min Minumum Voltage.
|
||||
in1_max Maximum voltage.
|
||||
in1_min_alarm Voltage low alarm.
|
||||
in1_max_alarm Voltage high alarm.
|
||||
in1_highest Historical maximum voltage.
|
||||
in1_reset_history Write any value to reset history.
|
||||
|
||||
curr1_label "iout1"
|
||||
curr1_input Measured current. From READ_IOUT register.
|
||||
curr1_max Maximum current. From IOUT_OC_WARN_LIMIT register.
|
||||
curr1_max_alarm Current high alarm. From IOUT_OC_WARN_LIMIT register.
|
||||
curr1_input Measured current.
|
||||
curr1_max Maximum current.
|
||||
curr1_max_alarm Current high alarm.
|
||||
curr1_lcrit Critical minimum current. Depending on the chip
|
||||
configuration, either curr1_lcrit or curr1_crit is
|
||||
supported, but not both.
|
||||
curr1_lcrit_alarm Critical current low alarm.
|
||||
curr1_crit Critical maximum current. Depending on the chip
|
||||
configuration, either curr1_lcrit or curr1_crit is
|
||||
supported, but not both.
|
||||
curr1_crit_alarm Critical current high alarm.
|
||||
curr1_highest Historical maximum current.
|
||||
curr1_reset_history Write any value to reset history.
|
||||
|
81
Documentation/hwmon/exynos4_tmu
Normal file
81
Documentation/hwmon/exynos4_tmu
Normal file
@ -0,0 +1,81 @@
|
||||
Kernel driver exynos4_tmu
|
||||
=================
|
||||
|
||||
Supported chips:
|
||||
* ARM SAMSUNG EXYNOS4 series of SoC
|
||||
Prefix: 'exynos4-tmu'
|
||||
Datasheet: Not publicly available
|
||||
|
||||
Authors: Donggeun Kim <dg77.kim@samsung.com>
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
This driver allows to read temperature inside SAMSUNG EXYNOS4 series of SoC.
|
||||
|
||||
The chip only exposes the measured 8-bit temperature code value
|
||||
through a register.
|
||||
Temperature can be taken from the temperature code.
|
||||
There are three equations converting from temperature to temperature code.
|
||||
|
||||
The three equations are:
|
||||
1. Two point trimming
|
||||
Tc = (T - 25) * (TI2 - TI1) / (85 - 25) + TI1
|
||||
|
||||
2. One point trimming
|
||||
Tc = T + TI1 - 25
|
||||
|
||||
3. No trimming
|
||||
Tc = T + 50
|
||||
|
||||
Tc: Temperature code, T: Temperature,
|
||||
TI1: Trimming info for 25 degree Celsius (stored at TRIMINFO register)
|
||||
Temperature code measured at 25 degree Celsius which is unchanged
|
||||
TI2: Trimming info for 85 degree Celsius (stored at TRIMINFO register)
|
||||
Temperature code measured at 85 degree Celsius which is unchanged
|
||||
|
||||
TMU(Thermal Management Unit) in EXYNOS4 generates interrupt
|
||||
when temperature exceeds pre-defined levels.
|
||||
The maximum number of configurable threshold is four.
|
||||
The threshold levels are defined as follows:
|
||||
Level_0: current temperature > trigger_level_0 + threshold
|
||||
Level_1: current temperature > trigger_level_1 + threshold
|
||||
Level_2: current temperature > trigger_level_2 + threshold
|
||||
Level_3: current temperature > trigger_level_3 + threshold
|
||||
|
||||
The threshold and each trigger_level are set
|
||||
through the corresponding registers.
|
||||
|
||||
When an interrupt occurs, this driver notify user space of
|
||||
one of four threshold levels for the interrupt
|
||||
through kobject_uevent_env and sysfs_notify functions.
|
||||
Although an interrupt condition for level_0 can be set,
|
||||
it is not notified to user space through sysfs_notify function.
|
||||
|
||||
Sysfs Interface
|
||||
---------------
|
||||
name name of the temperature sensor
|
||||
RO
|
||||
|
||||
temp1_input temperature
|
||||
RO
|
||||
|
||||
temp1_max temperature for level_1 interrupt
|
||||
RO
|
||||
|
||||
temp1_crit temperature for level_2 interrupt
|
||||
RO
|
||||
|
||||
temp1_emergency temperature for level_3 interrupt
|
||||
RO
|
||||
|
||||
temp1_max_alarm alarm for level_1 interrupt
|
||||
RO
|
||||
|
||||
temp1_crit_alarm
|
||||
alarm for level_2 interrupt
|
||||
RO
|
||||
|
||||
temp1_emergency_alarm
|
||||
alarm for level_3 interrupt
|
||||
RO
|
@ -12,26 +12,46 @@ Supported chips:
|
||||
Addresses scanned: I2C 0x48 - 0x4f
|
||||
Datasheet: Publicly available at the National Semiconductor website
|
||||
http://www.national.com/
|
||||
* Dallas Semiconductor DS75
|
||||
Prefix: 'lm75'
|
||||
Addresses scanned: I2C 0x48 - 0x4f
|
||||
Datasheet: Publicly available at the Dallas Semiconductor website
|
||||
http://www.maxim-ic.com/
|
||||
* Dallas Semiconductor DS1775
|
||||
Prefix: 'lm75'
|
||||
Addresses scanned: I2C 0x48 - 0x4f
|
||||
* Dallas Semiconductor DS75, DS1775
|
||||
Prefixes: 'ds75', 'ds1775'
|
||||
Addresses scanned: none
|
||||
Datasheet: Publicly available at the Dallas Semiconductor website
|
||||
http://www.maxim-ic.com/
|
||||
* Maxim MAX6625, MAX6626
|
||||
Prefix: 'lm75'
|
||||
Addresses scanned: I2C 0x48 - 0x4b
|
||||
Prefixes: 'max6625', 'max6626'
|
||||
Addresses scanned: none
|
||||
Datasheet: Publicly available at the Maxim website
|
||||
http://www.maxim-ic.com/
|
||||
* Microchip (TelCom) TCN75
|
||||
Prefix: 'lm75'
|
||||
Addresses scanned: I2C 0x48 - 0x4f
|
||||
Addresses scanned: none
|
||||
Datasheet: Publicly available at the Microchip website
|
||||
http://www.microchip.com/
|
||||
* Microchip MCP9800, MCP9801, MCP9802, MCP9803
|
||||
Prefix: 'mcp980x'
|
||||
Addresses scanned: none
|
||||
Datasheet: Publicly available at the Microchip website
|
||||
http://www.microchip.com/
|
||||
* Analog Devices ADT75
|
||||
Prefix: 'adt75'
|
||||
Addresses scanned: none
|
||||
Datasheet: Publicly available at the Analog Devices website
|
||||
http://www.analog.com/adt75
|
||||
* ST Microelectronics STDS75
|
||||
Prefix: 'stds75'
|
||||
Addresses scanned: none
|
||||
Datasheet: Publicly available at the ST website
|
||||
http://www.st.com/internet/analog/product/121769.jsp
|
||||
* Texas Instruments TMP100, TMP101, TMP105, TMP75, TMP175, TMP275
|
||||
Prefixes: 'tmp100', 'tmp101', 'tmp105', 'tmp175', 'tmp75', 'tmp275'
|
||||
Addresses scanned: none
|
||||
Datasheet: Publicly available at the Texas Instruments website
|
||||
http://www.ti.com/product/tmp100
|
||||
http://www.ti.com/product/tmp101
|
||||
http://www.ti.com/product/tmp105
|
||||
http://www.ti.com/product/tmp75
|
||||
http://www.ti.com/product/tmp175
|
||||
http://www.ti.com/product/tmp275
|
||||
|
||||
Author: Frodo Looijaard <frodol@dds.nl>
|
||||
|
||||
@ -50,21 +70,16 @@ range of -55 to +125 degrees.
|
||||
The LM75 only updates its values each 1.5 seconds; reading it more often
|
||||
will do no harm, but will return 'old' values.
|
||||
|
||||
The LM75 is usually used in combination with LM78-like chips, to measure
|
||||
the temperature of the processor(s).
|
||||
|
||||
The DS75, DS1775, MAX6625, and MAX6626 are supported as well.
|
||||
They are not distinguished from an LM75. While most of these chips
|
||||
have three additional bits of accuracy (12 vs. 9 for the LM75),
|
||||
the additional bits are not supported. Not only that, but these chips will
|
||||
not be detected if not in 9-bit precision mode (use the force parameter if
|
||||
needed).
|
||||
|
||||
The TCN75 is supported as well, and is not distinguished from an LM75.
|
||||
The original LM75 was typically used in combination with LM78-like chips
|
||||
on PC motherboards, to measure the temperature of the processor(s). Clones
|
||||
are now used in various embedded designs.
|
||||
|
||||
The LM75 is essentially an industry standard; there may be other
|
||||
LM75 clones not listed here, with or without various enhancements,
|
||||
that are supported.
|
||||
that are supported. The clones are not detected by the driver, unless
|
||||
they reproduce the exact register tricks of the original LM75, and must
|
||||
therefore be instantiated explicitly. The specific enhancements (such as
|
||||
higher resolution) are not currently supported by the driver.
|
||||
|
||||
The LM77 is not supported, contrary to what we pretended for a long time.
|
||||
Both chips are simply not compatible, value encoding differs.
|
||||
|
103
Documentation/hwmon/ltc2978
Normal file
103
Documentation/hwmon/ltc2978
Normal file
@ -0,0 +1,103 @@
|
||||
Kernel driver ltc2978
|
||||
=====================
|
||||
|
||||
Supported chips:
|
||||
* Linear Technology LTC2978
|
||||
Prefix: 'ltc2978'
|
||||
Addresses scanned: -
|
||||
Datasheet: http://cds.linear.com/docs/Datasheet/2978fa.pdf
|
||||
* Linear Technology LTC3880
|
||||
Prefix: 'ltc3880'
|
||||
Addresses scanned: -
|
||||
Datasheet: http://cds.linear.com/docs/Datasheet/3880f.pdf
|
||||
|
||||
Author: Guenter Roeck <guenter.roeck@ericsson.com>
|
||||
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
The LTC2978 is an octal power supply monitor, supervisor, sequencer and
|
||||
margin controller. The LTC3880 is a dual, PolyPhase DC/DC synchronous
|
||||
step-down switching regulator controller.
|
||||
|
||||
|
||||
Usage Notes
|
||||
-----------
|
||||
|
||||
This driver does not probe for PMBus devices. You will have to instantiate
|
||||
devices explicitly.
|
||||
|
||||
Example: the following commands will load the driver for an LTC2978 at address
|
||||
0x60 on I2C bus #1:
|
||||
|
||||
# modprobe ltc2978
|
||||
# echo ltc2978 0x60 > /sys/bus/i2c/devices/i2c-1/new_device
|
||||
|
||||
|
||||
Sysfs attributes
|
||||
----------------
|
||||
|
||||
in1_label "vin"
|
||||
in1_input Measured input voltage.
|
||||
in1_min Minimum input voltage.
|
||||
in1_max Maximum input voltage.
|
||||
in1_lcrit Critical minimum input voltage.
|
||||
in1_crit Critical maximum input voltage.
|
||||
in1_min_alarm Input voltage low alarm.
|
||||
in1_max_alarm Input voltage high alarm.
|
||||
in1_lcrit_alarm Input voltage critical low alarm.
|
||||
in1_crit_alarm Input voltage critical high alarm.
|
||||
in1_lowest Lowest input voltage. LTC2978 only.
|
||||
in1_highest Highest input voltage.
|
||||
in1_reset_history Reset history. Writing into this attribute will reset
|
||||
history for all attributes.
|
||||
|
||||
in[2-9]_label "vout[1-8]". Channels 3 to 9 on LTC2978 only.
|
||||
in[2-9]_input Measured output voltage.
|
||||
in[2-9]_min Minimum output voltage.
|
||||
in[2-9]_max Maximum output voltage.
|
||||
in[2-9]_lcrit Critical minimum output voltage.
|
||||
in[2-9]_crit Critical maximum output voltage.
|
||||
in[2-9]_min_alarm Output voltage low alarm.
|
||||
in[2-9]_max_alarm Output voltage high alarm.
|
||||
in[2-9]_lcrit_alarm Output voltage critical low alarm.
|
||||
in[2-9]_crit_alarm Output voltage critical high alarm.
|
||||
in[2-9]_lowest Lowest output voltage. LTC2978 only.
|
||||
in[2-9]_highest Lowest output voltage.
|
||||
in[2-9]_reset_history Reset history. Writing into this attribute will reset
|
||||
history for all attributes.
|
||||
|
||||
temp[1-3]_input Measured temperature.
|
||||
On LTC2978, only one temperature measurement is
|
||||
supported and reflects the internal temperature.
|
||||
On LTC3880, temp1 and temp2 report external
|
||||
temperatures, and temp3 reports the internal
|
||||
temperature.
|
||||
temp[1-3]_min Mimimum temperature.
|
||||
temp[1-3]_max Maximum temperature.
|
||||
temp[1-3]_lcrit Critical low temperature.
|
||||
temp[1-3]_crit Critical high temperature.
|
||||
temp[1-3]_min_alarm Chip temperature low alarm.
|
||||
temp[1-3]_max_alarm Chip temperature high alarm.
|
||||
temp[1-3]_lcrit_alarm Chip temperature critical low alarm.
|
||||
temp[1-3]_crit_alarm Chip temperature critical high alarm.
|
||||
temp[1-3]_lowest Lowest measured temperature. LTC2978 only.
|
||||
temp[1-3]_highest Highest measured temperature.
|
||||
temp[1-3]_reset_history Reset history. Writing into this attribute will reset
|
||||
history for all attributes.
|
||||
|
||||
power[1-2]_label "pout[1-2]". LTC3880 only.
|
||||
power[1-2]_input Measured power.
|
||||
|
||||
curr1_label "iin". LTC3880 only.
|
||||
curr1_input Measured input current.
|
||||
curr1_max Maximum input current.
|
||||
curr1_max_alarm Input current high alarm.
|
||||
|
||||
curr[2-3]_label "iout[1-2]". LTC3880 only.
|
||||
curr[2-3]_input Measured input current.
|
||||
curr[2-3]_max Maximum input current.
|
||||
curr[2-3]_crit Critical input current.
|
||||
curr[2-3]_max_alarm Input current high alarm.
|
||||
curr[2-3]_crit_alarm Input current critical high alarm.
|
@ -8,11 +8,6 @@ Supported chips:
|
||||
Addresses scanned: -
|
||||
Datasheet:
|
||||
http://archive.ericsson.net/service/internet/picov/get?DocNo=28701-EN/LZT146395
|
||||
* Linear Technology LTC2978
|
||||
Octal PMBus Power Supply Monitor and Controller
|
||||
Prefix: 'ltc2978'
|
||||
Addresses scanned: -
|
||||
Datasheet: http://cds.linear.com/docs/Datasheet/2978fa.pdf
|
||||
* ON Semiconductor ADP4000, NCP4200, NCP4208
|
||||
Prefixes: 'adp4000', 'ncp4200', 'ncp4208'
|
||||
Addresses scanned: -
|
||||
@ -20,6 +15,14 @@ Supported chips:
|
||||
http://www.onsemi.com/pub_link/Collateral/ADP4000-D.PDF
|
||||
http://www.onsemi.com/pub_link/Collateral/NCP4200-D.PDF
|
||||
http://www.onsemi.com/pub_link/Collateral/JUNE%202009-%20REV.%200.PDF
|
||||
* Lineage Power
|
||||
Prefixes: 'pdt003', 'pdt006', 'pdt012', 'udt020'
|
||||
Addresses scanned: -
|
||||
Datasheets:
|
||||
http://www.lineagepower.com/oem/pdf/PDT003A0X.pdf
|
||||
http://www.lineagepower.com/oem/pdf/PDT006A0X.pdf
|
||||
http://www.lineagepower.com/oem/pdf/PDT012A0X.pdf
|
||||
http://www.lineagepower.com/oem/pdf/UDT020A0X.pdf
|
||||
* Generic PMBus devices
|
||||
Prefix: 'pmbus'
|
||||
Addresses scanned: -
|
||||
|
283
Documentation/hwmon/pmbus-core
Normal file
283
Documentation/hwmon/pmbus-core
Normal file
@ -0,0 +1,283 @@
|
||||
PMBus core driver and internal API
|
||||
==================================
|
||||
|
||||
Introduction
|
||||
============
|
||||
|
||||
[from pmbus.org] The Power Management Bus (PMBus) is an open standard
|
||||
power-management protocol with a fully defined command language that facilitates
|
||||
communication with power converters and other devices in a power system. The
|
||||
protocol is implemented over the industry-standard SMBus serial interface and
|
||||
enables programming, control, and real-time monitoring of compliant power
|
||||
conversion products. This flexible and highly versatile standard allows for
|
||||
communication between devices based on both analog and digital technologies, and
|
||||
provides true interoperability which will reduce design complexity and shorten
|
||||
time to market for power system designers. Pioneered by leading power supply and
|
||||
semiconductor companies, this open power system standard is maintained and
|
||||
promoted by the PMBus Implementers Forum (PMBus-IF), comprising 30+ adopters
|
||||
with the objective to provide support to, and facilitate adoption among, users.
|
||||
|
||||
Unfortunately, while PMBus commands are standardized, there are no mandatory
|
||||
commands, and manufacturers can add as many non-standard commands as they like.
|
||||
Also, different PMBUs devices act differently if non-supported commands are
|
||||
executed. Some devices return an error, some devices return 0xff or 0xffff and
|
||||
set a status error flag, and some devices may simply hang up.
|
||||
|
||||
Despite all those difficulties, a generic PMBus device driver is still useful
|
||||
and supported since kernel version 2.6.39. However, it was necessary to support
|
||||
device specific extensions in addition to the core PMBus driver, since it is
|
||||
simply unknown what new device specific functionality PMBus device developers
|
||||
come up with next.
|
||||
|
||||
To make device specific extensions as scalable as possible, and to avoid having
|
||||
to modify the core PMBus driver repeatedly for new devices, the PMBus driver was
|
||||
split into core, generic, and device specific code. The core code (in
|
||||
pmbus_core.c) provides generic functionality. The generic code (in pmbus.c)
|
||||
provides support for generic PMBus devices. Device specific code is responsible
|
||||
for device specific initialization and, if needed, maps device specific
|
||||
functionality into generic functionality. This is to some degree comparable
|
||||
to PCI code, where generic code is augmented as needed with quirks for all kinds
|
||||
of devices.
|
||||
|
||||
PMBus device capabilities auto-detection
|
||||
========================================
|
||||
|
||||
For generic PMBus devices, code in pmbus.c attempts to auto-detect all supported
|
||||
PMBus commands. Auto-detection is somewhat limited, since there are simply too
|
||||
many variables to consider. For example, it is almost impossible to autodetect
|
||||
which PMBus commands are paged and which commands are replicated across all
|
||||
pages (see the PMBus specification for details on multi-page PMBus devices).
|
||||
|
||||
For this reason, it often makes sense to provide a device specific driver if not
|
||||
all commands can be auto-detected. The data structures in this driver can be
|
||||
used to inform the core driver about functionality supported by individual
|
||||
chips.
|
||||
|
||||
Some commands are always auto-detected. This applies to all limit commands
|
||||
(lcrit, min, max, and crit attributes) as well as associated alarm attributes.
|
||||
Limits and alarm attributes are auto-detected because there are simply too many
|
||||
possible combinations to provide a manual configuration interface.
|
||||
|
||||
PMBus internal API
|
||||
==================
|
||||
|
||||
The API between core and device specific PMBus code is defined in
|
||||
drivers/hwmon/pmbus/pmbus.h. In addition to the internal API, pmbus.h defines
|
||||
standard PMBus commands and virtual PMBus commands.
|
||||
|
||||
Standard PMBus commands
|
||||
-----------------------
|
||||
|
||||
Standard PMBus commands (commands values 0x00 to 0xff) are defined in the PMBUs
|
||||
specification.
|
||||
|
||||
Virtual PMBus commands
|
||||
----------------------
|
||||
|
||||
Virtual PMBus commands are provided to enable support for non-standard
|
||||
functionality which has been implemented by several chip vendors and is thus
|
||||
desirable to support.
|
||||
|
||||
Virtual PMBus commands start with command value 0x100 and can thus easily be
|
||||
distinguished from standard PMBus commands (which can not have values larger
|
||||
than 0xff). Support for virtual PMBus commands is device specific and thus has
|
||||
to be implemented in device specific code.
|
||||
|
||||
Virtual commands are named PMBUS_VIRT_xxx and start with PMBUS_VIRT_BASE. All
|
||||
virtual commands are word sized.
|
||||
|
||||
There are currently two types of virtual commands.
|
||||
|
||||
- READ commands are read-only; writes are either ignored or return an error.
|
||||
- RESET commands are read/write. Reading reset registers returns zero
|
||||
(used for detection), writing any value causes the associated history to be
|
||||
reset.
|
||||
|
||||
Virtual commands have to be handled in device specific driver code. Chip driver
|
||||
code returns non-negative values if a virtual command is supported, or a
|
||||
negative error code if not. The chip driver may return -ENODATA or any other
|
||||
Linux error code in this case, though an error code other than -ENODATA is
|
||||
handled more efficiently and thus preferred. Either case, the calling PMBus
|
||||
core code will abort if the chip driver returns an error code when reading
|
||||
or writing virtual registers (in other words, the PMBus core code will never
|
||||
send a virtual command to a chip).
|
||||
|
||||
PMBus driver information
|
||||
------------------------
|
||||
|
||||
PMBus driver information, defined in struct pmbus_driver_info, is the main means
|
||||
for device specific drivers to pass information to the core PMBus driver.
|
||||
Specifically, it provides the following information.
|
||||
|
||||
- For devices supporting its data in Direct Data Format, it provides coefficients
|
||||
for converting register values into normalized data. This data is usually
|
||||
provided by chip manufacturers in device datasheets.
|
||||
- Supported chip functionality can be provided to the core driver. This may be
|
||||
necessary for chips which react badly if non-supported commands are executed,
|
||||
and/or to speed up device detection and initialization.
|
||||
- Several function entry points are provided to support overriding and/or
|
||||
augmenting generic command execution. This functionality can be used to map
|
||||
non-standard PMBus commands to standard commands, or to augment standard
|
||||
command return values with device specific information.
|
||||
|
||||
API functions
|
||||
-------------
|
||||
|
||||
Functions provided by chip driver
|
||||
---------------------------------
|
||||
|
||||
All functions return the command return value (read) or zero (write) if
|
||||
successful. A return value of -ENODATA indicates that there is no manufacturer
|
||||
specific command, but that a standard PMBus command may exist. Any other
|
||||
negative return value indicates that the commands does not exist for this
|
||||
chip, and that no attempt should be made to read or write the standard
|
||||
command.
|
||||
|
||||
As mentioned above, an exception to this rule applies to virtual commands,
|
||||
which _must_ be handled in driver specific code. See "Virtual PMBus Commands"
|
||||
above for more details.
|
||||
|
||||
Command execution in the core PMBus driver code is as follows.
|
||||
|
||||
if (chip_access_function) {
|
||||
status = chip_access_function();
|
||||
if (status != -ENODATA)
|
||||
return status;
|
||||
}
|
||||
if (command >= PMBUS_VIRT_BASE) /* For word commands/registers only */
|
||||
return -EINVAL;
|
||||
return generic_access();
|
||||
|
||||
Chip drivers may provide pointers to the following functions in struct
|
||||
pmbus_driver_info. All functions are optional.
|
||||
|
||||
int (*read_byte_data)(struct i2c_client *client, int page, int reg);
|
||||
|
||||
Read byte from page <page>, register <reg>.
|
||||
<page> may be -1, which means "current page".
|
||||
|
||||
int (*read_word_data)(struct i2c_client *client, int page, int reg);
|
||||
|
||||
Read word from page <page>, register <reg>.
|
||||
|
||||
int (*write_word_data)(struct i2c_client *client, int page, int reg,
|
||||
u16 word);
|
||||
|
||||
Write word to page <page>, register <reg>.
|
||||
|
||||
int (*write_byte)(struct i2c_client *client, int page, u8 value);
|
||||
|
||||
Write byte to page <page>, register <reg>.
|
||||
<page> may be -1, which means "current page".
|
||||
|
||||
int (*identify)(struct i2c_client *client, struct pmbus_driver_info *info);
|
||||
|
||||
Determine supported PMBus functionality. This function is only necessary
|
||||
if a chip driver supports multiple chips, and the chip functionality is not
|
||||
pre-determined. It is currently only used by the generic pmbus driver
|
||||
(pmbus.c).
|
||||
|
||||
Functions exported by core driver
|
||||
---------------------------------
|
||||
|
||||
Chip drivers are expected to use the following functions to read or write
|
||||
PMBus registers. Chip drivers may also use direct I2C commands. If direct I2C
|
||||
commands are used, the chip driver code must not directly modify the current
|
||||
page, since the selected page is cached in the core driver and the core driver
|
||||
will assume that it is selected. Using pmbus_set_page() to select a new page
|
||||
is mandatory.
|
||||
|
||||
int pmbus_set_page(struct i2c_client *client, u8 page);
|
||||
|
||||
Set PMBus page register to <page> for subsequent commands.
|
||||
|
||||
int pmbus_read_word_data(struct i2c_client *client, u8 page, u8 reg);
|
||||
|
||||
Read word data from <page>, <reg>. Similar to i2c_smbus_read_word_data(), but
|
||||
selects page first.
|
||||
|
||||
int pmbus_write_word_data(struct i2c_client *client, u8 page, u8 reg,
|
||||
u16 word);
|
||||
|
||||
Write word data to <page>, <reg>. Similar to i2c_smbus_write_word_data(), but
|
||||
selects page first.
|
||||
|
||||
int pmbus_read_byte_data(struct i2c_client *client, int page, u8 reg);
|
||||
|
||||
Read byte data from <page>, <reg>. Similar to i2c_smbus_read_byte_data(), but
|
||||
selects page first. <page> may be -1, which means "current page".
|
||||
|
||||
int pmbus_write_byte(struct i2c_client *client, int page, u8 value);
|
||||
|
||||
Write byte data to <page>, <reg>. Similar to i2c_smbus_write_byte(), but
|
||||
selects page first. <page> may be -1, which means "current page".
|
||||
|
||||
void pmbus_clear_faults(struct i2c_client *client);
|
||||
|
||||
Execute PMBus "Clear Fault" command on all chip pages.
|
||||
This function calls the device specific write_byte function if defined.
|
||||
Therefore, it must _not_ be called from that function.
|
||||
|
||||
bool pmbus_check_byte_register(struct i2c_client *client, int page, int reg);
|
||||
|
||||
Check if byte register exists. Return true if the register exists, false
|
||||
otherwise.
|
||||
This function calls the device specific write_byte function if defined to
|
||||
obtain the chip status. Therefore, it must _not_ be called from that function.
|
||||
|
||||
bool pmbus_check_word_register(struct i2c_client *client, int page, int reg);
|
||||
|
||||
Check if word register exists. Return true if the register exists, false
|
||||
otherwise.
|
||||
This function calls the device specific write_byte function if defined to
|
||||
obtain the chip status. Therefore, it must _not_ be called from that function.
|
||||
|
||||
int pmbus_do_probe(struct i2c_client *client, const struct i2c_device_id *id,
|
||||
struct pmbus_driver_info *info);
|
||||
|
||||
Execute probe function. Similar to standard probe function for other drivers,
|
||||
with the pointer to struct pmbus_driver_info as additional argument. Calls
|
||||
identify function if supported. Must only be called from device probe
|
||||
function.
|
||||
|
||||
void pmbus_do_remove(struct i2c_client *client);
|
||||
|
||||
Execute driver remove function. Similar to standard driver remove function.
|
||||
|
||||
const struct pmbus_driver_info
|
||||
*pmbus_get_driver_info(struct i2c_client *client);
|
||||
|
||||
Return pointer to struct pmbus_driver_info as passed to pmbus_do_probe().
|
||||
|
||||
|
||||
PMBus driver platform data
|
||||
==========================
|
||||
|
||||
PMBus platform data is defined in include/linux/i2c/pmbus.h. Platform data
|
||||
currently only provides a flag field with a single bit used.
|
||||
|
||||
#define PMBUS_SKIP_STATUS_CHECK (1 << 0)
|
||||
|
||||
struct pmbus_platform_data {
|
||||
u32 flags; /* Device specific flags */
|
||||
};
|
||||
|
||||
|
||||
Flags
|
||||
-----
|
||||
|
||||
PMBUS_SKIP_STATUS_CHECK
|
||||
|
||||
During register detection, skip checking the status register for
|
||||
communication or command errors.
|
||||
|
||||
Some PMBus chips respond with valid data when trying to read an unsupported
|
||||
register. For such chips, checking the status register is mandatory when
|
||||
trying to determine if a chip register exists or not.
|
||||
Other PMBus chips don't support the STATUS_CML register, or report
|
||||
communication errors for no explicable reason. For such chips, checking the
|
||||
status register must be disabled.
|
||||
|
||||
Some i2c controllers do not support single-byte commands (write commands with
|
||||
no data, i2c_smbus_write_byte()). With such controllers, clearing the status
|
||||
register is impossible, and the PMBUS_SKIP_STATUS_CHECK flag must be set.
|
125
Documentation/hwmon/zl6100
Normal file
125
Documentation/hwmon/zl6100
Normal file
@ -0,0 +1,125 @@
|
||||
Kernel driver zl6100
|
||||
====================
|
||||
|
||||
Supported chips:
|
||||
* Intersil / Zilker Labs ZL2004
|
||||
Prefix: 'zl2004'
|
||||
Addresses scanned: -
|
||||
Datasheet: http://www.intersil.com/data/fn/fn6847.pdf
|
||||
* Intersil / Zilker Labs ZL2006
|
||||
Prefix: 'zl2006'
|
||||
Addresses scanned: -
|
||||
Datasheet: http://www.intersil.com/data/fn/fn6850.pdf
|
||||
* Intersil / Zilker Labs ZL2008
|
||||
Prefix: 'zl2008'
|
||||
Addresses scanned: -
|
||||
Datasheet: http://www.intersil.com/data/fn/fn6859.pdf
|
||||
* Intersil / Zilker Labs ZL2105
|
||||
Prefix: 'zl2105'
|
||||
Addresses scanned: -
|
||||
Datasheet: http://www.intersil.com/data/fn/fn6851.pdf
|
||||
* Intersil / Zilker Labs ZL2106
|
||||
Prefix: 'zl2106'
|
||||
Addresses scanned: -
|
||||
Datasheet: http://www.intersil.com/data/fn/fn6852.pdf
|
||||
* Intersil / Zilker Labs ZL6100
|
||||
Prefix: 'zl6100'
|
||||
Addresses scanned: -
|
||||
Datasheet: http://www.intersil.com/data/fn/fn6876.pdf
|
||||
* Intersil / Zilker Labs ZL6105
|
||||
Prefix: 'zl6105'
|
||||
Addresses scanned: -
|
||||
Datasheet: http://www.intersil.com/data/fn/fn6906.pdf
|
||||
|
||||
Author: Guenter Roeck <guenter.roeck@ericsson.com>
|
||||
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
This driver supports hardware montoring for Intersil / Zilker Labs ZL6100 and
|
||||
compatible digital DC-DC controllers.
|
||||
|
||||
The driver is a client driver to the core PMBus driver. Please see
|
||||
Documentation/hwmon/pmbus and Documentation.hwmon/pmbus-core for details
|
||||
on PMBus client drivers.
|
||||
|
||||
|
||||
Usage Notes
|
||||
-----------
|
||||
|
||||
This driver does not auto-detect devices. You will have to instantiate the
|
||||
devices explicitly. Please see Documentation/i2c/instantiating-devices for
|
||||
details.
|
||||
|
||||
WARNING: Do not access chip registers using the i2cdump command, and do not use
|
||||
any of the i2ctools commands on a command register used to save and restore
|
||||
configuration data (0x11, 0x12, 0x15, 0x16, and 0xf4). The chips supported by
|
||||
this driver interpret any access to those command registers (including read
|
||||
commands) as request to execute the command in question. Unless write accesses
|
||||
to those registers are protected, this may result in power loss, board resets,
|
||||
and/or Flash corruption. Worst case, your board may turn into a brick.
|
||||
|
||||
|
||||
Platform data support
|
||||
---------------------
|
||||
|
||||
The driver supports standard PMBus driver platform data.
|
||||
|
||||
|
||||
Module parameters
|
||||
-----------------
|
||||
|
||||
delay
|
||||
-----
|
||||
|
||||
Some Intersil/Zilker Labs DC-DC controllers require a minimum interval between
|
||||
I2C bus accesses. According to Intersil, the minimum interval is 2 ms, though
|
||||
1 ms appears to be sufficient and has not caused any problems in testing.
|
||||
The problem is known to affect ZL6100, ZL2105, and ZL2008. It is known not to
|
||||
affect ZL2004 and ZL6105. The driver automatically sets the interval to 1 ms
|
||||
except for ZL2004 and ZL6105. To enable manual override, the driver provides a
|
||||
writeable module parameter, 'delay', which can be used to set the interval to
|
||||
a value between 0 and 65,535 microseconds.
|
||||
|
||||
|
||||
Sysfs entries
|
||||
-------------
|
||||
|
||||
The following attributes are supported. Limits are read-write; all other
|
||||
attributes are read-only.
|
||||
|
||||
in1_label "vin"
|
||||
in1_input Measured input voltage.
|
||||
in1_min Minimum input voltage.
|
||||
in1_max Maximum input voltage.
|
||||
in1_lcrit Critical minumum input voltage.
|
||||
in1_crit Critical maximum input voltage.
|
||||
in1_min_alarm Input voltage low alarm.
|
||||
in1_max_alarm Input voltage high alarm.
|
||||
in1_lcrit_alarm Input voltage critical low alarm.
|
||||
in1_crit_alarm Input voltage critical high alarm.
|
||||
|
||||
in2_label "vout1"
|
||||
in2_input Measured output voltage.
|
||||
in2_lcrit Critical minumum output Voltage.
|
||||
in2_crit Critical maximum output voltage.
|
||||
in2_lcrit_alarm Critical output voltage critical low alarm.
|
||||
in2_crit_alarm Critical output voltage critical high alarm.
|
||||
|
||||
curr1_label "iout1"
|
||||
curr1_input Measured output current.
|
||||
curr1_lcrit Critical minimum output current.
|
||||
curr1_crit Critical maximum output current.
|
||||
curr1_lcrit_alarm Output current critical low alarm.
|
||||
curr1_crit_alarm Output current critical high alarm.
|
||||
|
||||
temp[12]_input Measured temperature.
|
||||
temp[12]_min Minimum temperature.
|
||||
temp[12]_max Maximum temperature.
|
||||
temp[12]_lcrit Critical low temperature.
|
||||
temp[12]_crit Critical high temperature.
|
||||
temp[12]_min_alarm Chip temperature low alarm.
|
||||
temp[12]_max_alarm Chip temperature high alarm.
|
||||
temp[12]_lcrit_alarm Chip temperature critical low alarm.
|
||||
temp[12]_crit_alarm Chip temperature critical high alarm.
|
@ -111,7 +111,7 @@ LCDs and many other purposes.
|
||||
|
||||
The monitor and speaker controls should be easy to add to the hid/input
|
||||
interface, but for the UPSs and LCDs it doesn't make much sense. For this,
|
||||
the hiddev interface was designed. See Documentation/usb/hiddev.txt
|
||||
the hiddev interface was designed. See Documentation/hid/hiddev.txt
|
||||
for more information about it.
|
||||
|
||||
The usage of the usbhid module is very simple, it takes no parameters,
|
||||
|
@ -300,7 +300,7 @@
|
||||
|
||||
* Title: "The Kernel Hacking HOWTO"
|
||||
Author: Various Talented People, and Rusty.
|
||||
Location: in kernel tree, Documentation/DocBook/kernel-hacking/
|
||||
Location: in kernel tree, Documentation/DocBook/kernel-hacking.tmpl
|
||||
(must be built as "make {htmldocs | psdocs | pdfdocs})
|
||||
Keywords: HOWTO, kernel contexts, deadlock, locking, modules,
|
||||
symbols, return conventions.
|
||||
@ -351,7 +351,7 @@
|
||||
|
||||
* Title: "Linux Kernel Locking HOWTO"
|
||||
Author: Various Talented People, and Rusty.
|
||||
Location: in kernel tree, Documentation/DocBook/kernel-locking/
|
||||
Location: in kernel tree, Documentation/DocBook/kernel-locking.tmpl
|
||||
(must be built as "make {htmldocs | psdocs | pdfdocs})
|
||||
Keywords: locks, locking, spinlock, semaphore, atomic, race
|
||||
condition, bottom halves, tasklets, softirqs.
|
||||
|
@ -49,6 +49,7 @@ parameter is applicable:
|
||||
EDD BIOS Enhanced Disk Drive Services (EDD) is enabled
|
||||
EFI EFI Partitioning (GPT) is enabled
|
||||
EIDE EIDE/ATAPI support is enabled.
|
||||
EVM Extended Verification Module
|
||||
FB The frame buffer device is enabled.
|
||||
FTRACE Function tracing enabled.
|
||||
GCOV GCOV profiling is enabled.
|
||||
@ -163,7 +164,7 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
||||
rsdt -- prefer RSDT over (default) XSDT
|
||||
copy_dsdt -- copy DSDT to memory
|
||||
|
||||
See also Documentation/power/pm.txt, pci=noacpi
|
||||
See also Documentation/power/runtime_pm.txt, pci=noacpi
|
||||
|
||||
acpi_rsdp= [ACPI,EFI,KEXEC]
|
||||
Pass the RSDP address to the kernel, mostly used
|
||||
@ -319,7 +320,7 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
||||
amijoy.map= [HW,JOY] Amiga joystick support
|
||||
Map of devices attached to JOY0DAT and JOY1DAT
|
||||
Format: <a>,<b>
|
||||
See also Documentation/kernel/input/joystick.txt
|
||||
See also Documentation/input/joystick.txt
|
||||
|
||||
analog.map= [HW,JOY] Analog joystick and gamepad support
|
||||
Specifies type or capabilities of an analog joystick
|
||||
@ -408,7 +409,7 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
||||
bttv.radio= Most important insmod options are available as
|
||||
kernel args too.
|
||||
bttv.pll= See Documentation/video4linux/bttv/Insmod-options
|
||||
bttv.tuner= and Documentation/video4linux/bttv/CARDLIST
|
||||
bttv.tuner=
|
||||
|
||||
bulk_remove=off [PPC] This parameter disables the use of the pSeries
|
||||
firmware feature for flushing multiple hpte entries
|
||||
@ -724,7 +725,7 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
||||
|
||||
elevator= [IOSCHED]
|
||||
Format: {"cfq" | "deadline" | "noop"}
|
||||
See Documentation/block/as-iosched.txt and
|
||||
See Documentation/block/cfq-iosched.txt and
|
||||
Documentation/block/deadline-iosched.txt for details.
|
||||
|
||||
elfcorehdr= [IA-64,PPC,SH,X86]
|
||||
@ -760,12 +761,17 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
||||
This option is obsoleted by the "netdev=" option, which
|
||||
has equivalent usage. See its documentation for details.
|
||||
|
||||
evm= [EVM]
|
||||
Format: { "fix" }
|
||||
Permit 'security.evm' to be updated regardless of
|
||||
current integrity status.
|
||||
|
||||
failslab=
|
||||
fail_page_alloc=
|
||||
fail_make_request=[KNL]
|
||||
General fault injection mechanism.
|
||||
Format: <interval>,<probability>,<space>,<times>
|
||||
See also /Documentation/fault-injection/.
|
||||
See also Documentation/fault-injection/.
|
||||
|
||||
floppy= [HW]
|
||||
See Documentation/blockdev/floppy.txt.
|
||||
@ -1014,10 +1020,11 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
||||
has the capability. With this option, super page will
|
||||
not be supported.
|
||||
intremap= [X86-64, Intel-IOMMU]
|
||||
Format: { on (default) | off | nosid }
|
||||
on enable Interrupt Remapping (default)
|
||||
off disable Interrupt Remapping
|
||||
nosid disable Source ID checking
|
||||
no_x2apic_optout
|
||||
BIOS x2APIC opt-out request will be ignored
|
||||
|
||||
inttest= [IA-64]
|
||||
|
||||
@ -2240,6 +2247,13 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
||||
in <PAGE_SIZE> units (needed only for swap files).
|
||||
See Documentation/power/swsusp-and-swap-files.txt
|
||||
|
||||
resumedelay= [HIBERNATION] Delay (in seconds) to pause before attempting to
|
||||
read the resume files
|
||||
|
||||
resumewait [HIBERNATION] Wait (indefinitely) for resume device to show up.
|
||||
Useful for devices that are detected asynchronously
|
||||
(e.g. USB and MMC devices).
|
||||
|
||||
hibernate= [HIBERNATION]
|
||||
noresume Don't check if there's a hibernation image
|
||||
present during boot.
|
||||
@ -2375,7 +2389,7 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
||||
Format: <integer>
|
||||
|
||||
sonypi.*= [HW] Sony Programmable I/O Control Device driver
|
||||
See Documentation/sonypi.txt
|
||||
See Documentation/laptops/sonypi.txt
|
||||
|
||||
specialix= [HW,SERIAL] Specialix multi-serial port adapter
|
||||
See Documentation/serial/specialix.txt.
|
||||
|
@ -736,7 +736,7 @@ status as "unknown". The available commands are:
|
||||
sysfs notes:
|
||||
|
||||
The ThinkLight sysfs interface is documented by the LED class
|
||||
documentation, in Documentation/leds-class.txt. The ThinkLight LED name
|
||||
documentation, in Documentation/leds/leds-class.txt. The ThinkLight LED name
|
||||
is "tpacpi::thinklight".
|
||||
|
||||
Due to limitations in the sysfs LED class, if the status of the ThinkLight
|
||||
@ -833,7 +833,7 @@ All of the above can be turned on and off and can be made to blink.
|
||||
sysfs notes:
|
||||
|
||||
The ThinkPad LED sysfs interface is described in detail by the LED class
|
||||
documentation, in Documentation/leds-class.txt.
|
||||
documentation, in Documentation/leds/leds-class.txt.
|
||||
|
||||
The LEDs are named (in LED ID order, from 0 to 12):
|
||||
"tpacpi::power", "tpacpi:orange:batt", "tpacpi:green:batt",
|
||||
|
@ -9,8 +9,8 @@ Introduction
|
||||
------------
|
||||
|
||||
The media controller API is documented in DocBook format in
|
||||
Documentation/DocBook/v4l/media-controller.xml. This document will focus on
|
||||
the kernel-side implementation of the media framework.
|
||||
Documentation/DocBook/media/v4l/media-controller.xml. This document will focus
|
||||
on the kernel-side implementation of the media framework.
|
||||
|
||||
|
||||
Abstract media device model
|
||||
|
@ -438,7 +438,7 @@ There are certain things that the Linux kernel memory barriers do not guarantee:
|
||||
[*] For information on bus mastering DMA and coherency please read:
|
||||
|
||||
Documentation/PCI/pci.txt
|
||||
Documentation/PCI/PCI-DMA-mapping.txt
|
||||
Documentation/DMA-API-HOWTO.txt
|
||||
Documentation/DMA-API.txt
|
||||
|
||||
|
||||
|
@ -1,61 +1,22 @@
|
||||
Copyright (c) 2009-2010 QLogic Corporation
|
||||
Copyright (c) 2009-2011 QLogic Corporation
|
||||
QLogic Linux qlcnic NIC Driver
|
||||
|
||||
This program includes a device driver for Linux 2.6 that may be
|
||||
distributed with QLogic hardware specific firmware binary file.
|
||||
You may modify and redistribute the device driver code under the
|
||||
GNU General Public License (a copy of which is attached hereto as
|
||||
Exhibit A) published by the Free Software Foundation (version 2).
|
||||
|
||||
You may redistribute the hardware specific firmware binary file
|
||||
under the following terms:
|
||||
|
||||
1. Redistribution of source code (only if applicable),
|
||||
must retain the above copyright notice, this list of
|
||||
conditions and the following disclaimer.
|
||||
|
||||
2. Redistribution in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the
|
||||
following disclaimer in the documentation and/or other
|
||||
materials provided with the distribution.
|
||||
|
||||
3. The name of QLogic Corporation may not be used to
|
||||
endorse or promote products derived from this software
|
||||
without specific prior written permission
|
||||
|
||||
REGARDLESS OF WHAT LICENSING MECHANISM IS USED OR APPLICABLE,
|
||||
THIS PROGRAM IS PROVIDED BY QLOGIC CORPORATION "AS IS'' AND ANY
|
||||
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR
|
||||
BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||||
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
USER ACKNOWLEDGES AND AGREES THAT USE OF THIS PROGRAM WILL NOT
|
||||
CREATE OR GIVE GROUNDS FOR A LICENSE BY IMPLICATION, ESTOPPEL, OR
|
||||
OTHERWISE IN ANY INTELLECTUAL PROPERTY RIGHTS (PATENT, COPYRIGHT,
|
||||
TRADE SECRET, MASK WORK, OR OTHER PROPRIETARY RIGHT) EMBODIED IN
|
||||
ANY OTHER QLOGIC HARDWARE OR SOFTWARE EITHER SOLELY OR IN
|
||||
COMBINATION WITH THIS PROGRAM.
|
||||
|
||||
|
||||
EXHIBIT A
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
@ -105,7 +66,7 @@ patent must be licensed for everyone's free use or not licensed at all.
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
@ -304,7 +265,7 @@ make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
|
@ -73,7 +73,7 @@ of queues to IRQs can be determined from /proc/interrupts. By default,
|
||||
an IRQ may be handled on any CPU. Because a non-negligible part of packet
|
||||
processing takes place in receive interrupt handling, it is advantageous
|
||||
to spread receive interrupts between CPUs. To manually adjust the IRQ
|
||||
affinity of each interrupt see Documentation/IRQ-affinity. Some systems
|
||||
affinity of each interrupt see Documentation/IRQ-affinity.txt. Some systems
|
||||
will be running irqbalance, a daemon that dynamically optimizes IRQ
|
||||
assignments and as a result may override any manual settings.
|
||||
|
||||
|
950
Documentation/pinctrl.txt
Normal file
950
Documentation/pinctrl.txt
Normal file
@ -0,0 +1,950 @@
|
||||
PINCTRL (PIN CONTROL) subsystem
|
||||
This document outlines the pin control subsystem in Linux
|
||||
|
||||
This subsystem deals with:
|
||||
|
||||
- Enumerating and naming controllable pins
|
||||
|
||||
- Multiplexing of pins, pads, fingers (etc) see below for details
|
||||
|
||||
The intention is to also deal with:
|
||||
|
||||
- Software-controlled biasing and driving mode specific pins, such as
|
||||
pull-up/down, open drain etc, load capacitance configuration when controlled
|
||||
by software, etc.
|
||||
|
||||
|
||||
Top-level interface
|
||||
===================
|
||||
|
||||
Definition of PIN CONTROLLER:
|
||||
|
||||
- A pin controller is a piece of hardware, usually a set of registers, that
|
||||
can control PINs. It may be able to multiplex, bias, set load capacitance,
|
||||
set drive strength etc for individual pins or groups of pins.
|
||||
|
||||
Definition of PIN:
|
||||
|
||||
- PINS are equal to pads, fingers, balls or whatever packaging input or
|
||||
output line you want to control and these are denoted by unsigned integers
|
||||
in the range 0..maxpin. This numberspace is local to each PIN CONTROLLER, so
|
||||
there may be several such number spaces in a system. This pin space may
|
||||
be sparse - i.e. there may be gaps in the space with numbers where no
|
||||
pin exists.
|
||||
|
||||
When a PIN CONTROLLER is instatiated, it will register a descriptor to the
|
||||
pin control framework, and this descriptor contains an array of pin descriptors
|
||||
describing the pins handled by this specific pin controller.
|
||||
|
||||
Here is an example of a PGA (Pin Grid Array) chip seen from underneath:
|
||||
|
||||
A B C D E F G H
|
||||
|
||||
8 o o o o o o o o
|
||||
|
||||
7 o o o o o o o o
|
||||
|
||||
6 o o o o o o o o
|
||||
|
||||
5 o o o o o o o o
|
||||
|
||||
4 o o o o o o o o
|
||||
|
||||
3 o o o o o o o o
|
||||
|
||||
2 o o o o o o o o
|
||||
|
||||
1 o o o o o o o o
|
||||
|
||||
To register a pin controller and name all the pins on this package we can do
|
||||
this in our driver:
|
||||
|
||||
#include <linux/pinctrl/pinctrl.h>
|
||||
|
||||
const struct pinctrl_pin_desc __refdata foo_pins[] = {
|
||||
PINCTRL_PIN(0, "A1"),
|
||||
PINCTRL_PIN(1, "A2"),
|
||||
PINCTRL_PIN(2, "A3"),
|
||||
...
|
||||
PINCTRL_PIN(61, "H6"),
|
||||
PINCTRL_PIN(62, "H7"),
|
||||
PINCTRL_PIN(63, "H8"),
|
||||
};
|
||||
|
||||
static struct pinctrl_desc foo_desc = {
|
||||
.name = "foo",
|
||||
.pins = foo_pins,
|
||||
.npins = ARRAY_SIZE(foo_pins),
|
||||
.maxpin = 63,
|
||||
.owner = THIS_MODULE,
|
||||
};
|
||||
|
||||
int __init foo_probe(void)
|
||||
{
|
||||
struct pinctrl_dev *pctl;
|
||||
|
||||
pctl = pinctrl_register(&foo_desc, <PARENT>, NULL);
|
||||
if (IS_ERR(pctl))
|
||||
pr_err("could not register foo pin driver\n");
|
||||
}
|
||||
|
||||
Pins usually have fancier names than this. You can find these in the dataheet
|
||||
for your chip. Notice that the core pinctrl.h file provides a fancy macro
|
||||
called PINCTRL_PIN() to create the struct entries. As you can see I enumerated
|
||||
the pins from 0 in the upper left corner to 63 in the lower right corner,
|
||||
this enumeration was arbitrarily chosen, in practice you need to think
|
||||
through your numbering system so that it matches the layout of registers
|
||||
and such things in your driver, or the code may become complicated. You must
|
||||
also consider matching of offsets to the GPIO ranges that may be handled by
|
||||
the pin controller.
|
||||
|
||||
For a padring with 467 pads, as opposed to actual pins, I used an enumeration
|
||||
like this, walking around the edge of the chip, which seems to be industry
|
||||
standard too (all these pads had names, too):
|
||||
|
||||
|
||||
0 ..... 104
|
||||
466 105
|
||||
. .
|
||||
. .
|
||||
358 224
|
||||
357 .... 225
|
||||
|
||||
|
||||
Pin groups
|
||||
==========
|
||||
|
||||
Many controllers need to deal with groups of pins, so the pin controller
|
||||
subsystem has a mechanism for enumerating groups of pins and retrieving the
|
||||
actual enumerated pins that are part of a certain group.
|
||||
|
||||
For example, say that we have a group of pins dealing with an SPI interface
|
||||
on { 0, 8, 16, 24 }, and a group of pins dealing with an I2C interface on pins
|
||||
on { 24, 25 }.
|
||||
|
||||
These two groups are presented to the pin control subsystem by implementing
|
||||
some generic pinctrl_ops like this:
|
||||
|
||||
#include <linux/pinctrl/pinctrl.h>
|
||||
|
||||
struct foo_group {
|
||||
const char *name;
|
||||
const unsigned int *pins;
|
||||
const unsigned num_pins;
|
||||
};
|
||||
|
||||
static unsigned int spi0_pins[] = { 0, 8, 16, 24 };
|
||||
static unsigned int i2c0_pins[] = { 24, 25 };
|
||||
|
||||
static const struct foo_group foo_groups[] = {
|
||||
{
|
||||
.name = "spi0_grp",
|
||||
.pins = spi0_pins,
|
||||
.num_pins = ARRAY_SIZE(spi0_pins),
|
||||
},
|
||||
{
|
||||
.name = "i2c0_grp",
|
||||
.pins = i2c0_pins,
|
||||
.num_pins = ARRAY_SIZE(i2c0_pins),
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
static int foo_list_groups(struct pinctrl_dev *pctldev, unsigned selector)
|
||||
{
|
||||
if (selector >= ARRAY_SIZE(foo_groups))
|
||||
return -EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const char *foo_get_group_name(struct pinctrl_dev *pctldev,
|
||||
unsigned selector)
|
||||
{
|
||||
return foo_groups[selector].name;
|
||||
}
|
||||
|
||||
static int foo_get_group_pins(struct pinctrl_dev *pctldev, unsigned selector,
|
||||
unsigned ** const pins,
|
||||
unsigned * const num_pins)
|
||||
{
|
||||
*pins = (unsigned *) foo_groups[selector].pins;
|
||||
*num_pins = foo_groups[selector].num_pins;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct pinctrl_ops foo_pctrl_ops = {
|
||||
.list_groups = foo_list_groups,
|
||||
.get_group_name = foo_get_group_name,
|
||||
.get_group_pins = foo_get_group_pins,
|
||||
};
|
||||
|
||||
|
||||
static struct pinctrl_desc foo_desc = {
|
||||
...
|
||||
.pctlops = &foo_pctrl_ops,
|
||||
};
|
||||
|
||||
The pin control subsystem will call the .list_groups() function repeatedly
|
||||
beginning on 0 until it returns non-zero to determine legal selectors, then
|
||||
it will call the other functions to retrieve the name and pins of the group.
|
||||
Maintaining the data structure of the groups is up to the driver, this is
|
||||
just a simple example - in practice you may need more entries in your group
|
||||
structure, for example specific register ranges associated with each group
|
||||
and so on.
|
||||
|
||||
|
||||
Interaction with the GPIO subsystem
|
||||
===================================
|
||||
|
||||
The GPIO drivers may want to perform operations of various types on the same
|
||||
physical pins that are also registered as pin controller pins.
|
||||
|
||||
Since the pin controller subsystem have its pinspace local to the pin
|
||||
controller we need a mapping so that the pin control subsystem can figure out
|
||||
which pin controller handles control of a certain GPIO pin. Since a single
|
||||
pin controller may be muxing several GPIO ranges (typically SoCs that have
|
||||
one set of pins but internally several GPIO silicon blocks, each modeled as
|
||||
a struct gpio_chip) any number of GPIO ranges can be added to a pin controller
|
||||
instance like this:
|
||||
|
||||
struct gpio_chip chip_a;
|
||||
struct gpio_chip chip_b;
|
||||
|
||||
static struct pinctrl_gpio_range gpio_range_a = {
|
||||
.name = "chip a",
|
||||
.id = 0,
|
||||
.base = 32,
|
||||
.npins = 16,
|
||||
.gc = &chip_a;
|
||||
};
|
||||
|
||||
static struct pinctrl_gpio_range gpio_range_a = {
|
||||
.name = "chip b",
|
||||
.id = 0,
|
||||
.base = 48,
|
||||
.npins = 8,
|
||||
.gc = &chip_b;
|
||||
};
|
||||
|
||||
|
||||
{
|
||||
struct pinctrl_dev *pctl;
|
||||
...
|
||||
pinctrl_add_gpio_range(pctl, &gpio_range_a);
|
||||
pinctrl_add_gpio_range(pctl, &gpio_range_b);
|
||||
}
|
||||
|
||||
So this complex system has one pin controller handling two different
|
||||
GPIO chips. Chip a has 16 pins and chip b has 8 pins. They are mapped in
|
||||
the global GPIO pin space at:
|
||||
|
||||
chip a: [32 .. 47]
|
||||
chip b: [48 .. 55]
|
||||
|
||||
When GPIO-specific functions in the pin control subsystem are called, these
|
||||
ranges will be used to look up the apropriate pin controller by inspecting
|
||||
and matching the pin to the pin ranges across all controllers. When a
|
||||
pin controller handling the matching range is found, GPIO-specific functions
|
||||
will be called on that specific pin controller.
|
||||
|
||||
For all functionalities dealing with pin biasing, pin muxing etc, the pin
|
||||
controller subsystem will subtract the range's .base offset from the passed
|
||||
in gpio pin number, and pass that on to the pin control driver, so the driver
|
||||
will get an offset into its handled number range. Further it is also passed
|
||||
the range ID value, so that the pin controller knows which range it should
|
||||
deal with.
|
||||
|
||||
For example: if a user issues pinctrl_gpio_set_foo(50), the pin control
|
||||
subsystem will find that the second range on this pin controller matches,
|
||||
subtract the base 48 and call the
|
||||
pinctrl_driver_gpio_set_foo(pinctrl, range, 2) where the latter function has
|
||||
this signature:
|
||||
|
||||
int pinctrl_driver_gpio_set_foo(struct pinctrl_dev *pctldev,
|
||||
struct pinctrl_gpio_range *rangeid,
|
||||
unsigned offset);
|
||||
|
||||
Now the driver knows that we want to do some GPIO-specific operation on the
|
||||
second GPIO range handled by "chip b", at offset 2 in that specific range.
|
||||
|
||||
(If the GPIO subsystem is ever refactored to use a local per-GPIO controller
|
||||
pin space, this mapping will need to be augmented accordingly.)
|
||||
|
||||
|
||||
PINMUX interfaces
|
||||
=================
|
||||
|
||||
These calls use the pinmux_* naming prefix. No other calls should use that
|
||||
prefix.
|
||||
|
||||
|
||||
What is pinmuxing?
|
||||
==================
|
||||
|
||||
PINMUX, also known as padmux, ballmux, alternate functions or mission modes
|
||||
is a way for chip vendors producing some kind of electrical packages to use
|
||||
a certain physical pin (ball, pad, finger, etc) for multiple mutually exclusive
|
||||
functions, depending on the application. By "application" in this context
|
||||
we usually mean a way of soldering or wiring the package into an electronic
|
||||
system, even though the framework makes it possible to also change the function
|
||||
at runtime.
|
||||
|
||||
Here is an example of a PGA (Pin Grid Array) chip seen from underneath:
|
||||
|
||||
A B C D E F G H
|
||||
+---+
|
||||
8 | o | o o o o o o o
|
||||
| |
|
||||
7 | o | o o o o o o o
|
||||
| |
|
||||
6 | o | o o o o o o o
|
||||
+---+---+
|
||||
5 | o | o | o o o o o o
|
||||
+---+---+ +---+
|
||||
4 o o o o o o | o | o
|
||||
| |
|
||||
3 o o o o o o | o | o
|
||||
| |
|
||||
2 o o o o o o | o | o
|
||||
+-------+-------+-------+---+---+
|
||||
1 | o o | o o | o o | o | o |
|
||||
+-------+-------+-------+---+---+
|
||||
|
||||
This is not tetris. The game to think of is chess. Not all PGA/BGA packages
|
||||
are chessboard-like, big ones have "holes" in some arrangement according to
|
||||
different design patterns, but we're using this as a simple example. Of the
|
||||
pins you see some will be taken by things like a few VCC and GND to feed power
|
||||
to the chip, and quite a few will be taken by large ports like an external
|
||||
memory interface. The remaining pins will often be subject to pin multiplexing.
|
||||
|
||||
The example 8x8 PGA package above will have pin numbers 0 thru 63 assigned to
|
||||
its physical pins. It will name the pins { A1, A2, A3 ... H6, H7, H8 } using
|
||||
pinctrl_register_pins() and a suitable data set as shown earlier.
|
||||
|
||||
In this 8x8 BGA package the pins { A8, A7, A6, A5 } can be used as an SPI port
|
||||
(these are four pins: CLK, RXD, TXD, FRM). In that case, pin B5 can be used as
|
||||
some general-purpose GPIO pin. However, in another setting, pins { A5, B5 } can
|
||||
be used as an I2C port (these are just two pins: SCL, SDA). Needless to say,
|
||||
we cannot use the SPI port and I2C port at the same time. However in the inside
|
||||
of the package the silicon performing the SPI logic can alternatively be routed
|
||||
out on pins { G4, G3, G2, G1 }.
|
||||
|
||||
On the botton row at { A1, B1, C1, D1, E1, F1, G1, H1 } we have something
|
||||
special - it's an external MMC bus that can be 2, 4 or 8 bits wide, and it will
|
||||
consume 2, 4 or 8 pins respectively, so either { A1, B1 } are taken or
|
||||
{ A1, B1, C1, D1 } or all of them. If we use all 8 bits, we cannot use the SPI
|
||||
port on pins { G4, G3, G2, G1 } of course.
|
||||
|
||||
This way the silicon blocks present inside the chip can be multiplexed "muxed"
|
||||
out on different pin ranges. Often contemporary SoC (systems on chip) will
|
||||
contain several I2C, SPI, SDIO/MMC, etc silicon blocks that can be routed to
|
||||
different pins by pinmux settings.
|
||||
|
||||
Since general-purpose I/O pins (GPIO) are typically always in shortage, it is
|
||||
common to be able to use almost any pin as a GPIO pin if it is not currently
|
||||
in use by some other I/O port.
|
||||
|
||||
|
||||
Pinmux conventions
|
||||
==================
|
||||
|
||||
The purpose of the pinmux functionality in the pin controller subsystem is to
|
||||
abstract and provide pinmux settings to the devices you choose to instantiate
|
||||
in your machine configuration. It is inspired by the clk, GPIO and regulator
|
||||
subsystems, so devices will request their mux setting, but it's also possible
|
||||
to request a single pin for e.g. GPIO.
|
||||
|
||||
Definitions:
|
||||
|
||||
- FUNCTIONS can be switched in and out by a driver residing with the pin
|
||||
control subsystem in the drivers/pinctrl/* directory of the kernel. The
|
||||
pin control driver knows the possible functions. In the example above you can
|
||||
identify three pinmux functions, one for spi, one for i2c and one for mmc.
|
||||
|
||||
- FUNCTIONS are assumed to be enumerable from zero in a one-dimensional array.
|
||||
In this case the array could be something like: { spi0, i2c0, mmc0 }
|
||||
for the three available functions.
|
||||
|
||||
- FUNCTIONS have PIN GROUPS as defined on the generic level - so a certain
|
||||
function is *always* associated with a certain set of pin groups, could
|
||||
be just a single one, but could also be many. In the example above the
|
||||
function i2c is associated with the pins { A5, B5 }, enumerated as
|
||||
{ 24, 25 } in the controller pin space.
|
||||
|
||||
The Function spi is associated with pin groups { A8, A7, A6, A5 }
|
||||
and { G4, G3, G2, G1 }, which are enumerated as { 0, 8, 16, 24 } and
|
||||
{ 38, 46, 54, 62 } respectively.
|
||||
|
||||
Group names must be unique per pin controller, no two groups on the same
|
||||
controller may have the same name.
|
||||
|
||||
- The combination of a FUNCTION and a PIN GROUP determine a certain function
|
||||
for a certain set of pins. The knowledge of the functions and pin groups
|
||||
and their machine-specific particulars are kept inside the pinmux driver,
|
||||
from the outside only the enumerators are known, and the driver core can:
|
||||
|
||||
- Request the name of a function with a certain selector (>= 0)
|
||||
- A list of groups associated with a certain function
|
||||
- Request that a certain group in that list to be activated for a certain
|
||||
function
|
||||
|
||||
As already described above, pin groups are in turn self-descriptive, so
|
||||
the core will retrieve the actual pin range in a certain group from the
|
||||
driver.
|
||||
|
||||
- FUNCTIONS and GROUPS on a certain PIN CONTROLLER are MAPPED to a certain
|
||||
device by the board file, device tree or similar machine setup configuration
|
||||
mechanism, similar to how regulators are connected to devices, usually by
|
||||
name. Defining a pin controller, function and group thus uniquely identify
|
||||
the set of pins to be used by a certain device. (If only one possible group
|
||||
of pins is available for the function, no group name need to be supplied -
|
||||
the core will simply select the first and only group available.)
|
||||
|
||||
In the example case we can define that this particular machine shall
|
||||
use device spi0 with pinmux function fspi0 group gspi0 and i2c0 on function
|
||||
fi2c0 group gi2c0, on the primary pin controller, we get mappings
|
||||
like these:
|
||||
|
||||
{
|
||||
{"map-spi0", spi0, pinctrl0, fspi0, gspi0},
|
||||
{"map-i2c0", i2c0, pinctrl0, fi2c0, gi2c0}
|
||||
}
|
||||
|
||||
Every map must be assigned a symbolic name, pin controller and function.
|
||||
The group is not compulsory - if it is omitted the first group presented by
|
||||
the driver as applicable for the function will be selected, which is
|
||||
useful for simple cases.
|
||||
|
||||
The device name is present in map entries tied to specific devices. Maps
|
||||
without device names are referred to as SYSTEM pinmuxes, such as can be taken
|
||||
by the machine implementation on boot and not tied to any specific device.
|
||||
|
||||
It is possible to map several groups to the same combination of device,
|
||||
pin controller and function. This is for cases where a certain function on
|
||||
a certain pin controller may use different sets of pins in different
|
||||
configurations.
|
||||
|
||||
- PINS for a certain FUNCTION using a certain PIN GROUP on a certain
|
||||
PIN CONTROLLER are provided on a first-come first-serve basis, so if some
|
||||
other device mux setting or GPIO pin request has already taken your physical
|
||||
pin, you will be denied the use of it. To get (activate) a new setting, the
|
||||
old one has to be put (deactivated) first.
|
||||
|
||||
Sometimes the documentation and hardware registers will be oriented around
|
||||
pads (or "fingers") rather than pins - these are the soldering surfaces on the
|
||||
silicon inside the package, and may or may not match the actual number of
|
||||
pins/balls underneath the capsule. Pick some enumeration that makes sense to
|
||||
you. Define enumerators only for the pins you can control if that makes sense.
|
||||
|
||||
Assumptions:
|
||||
|
||||
We assume that the number possible function maps to pin groups is limited by
|
||||
the hardware. I.e. we assume that there is no system where any function can be
|
||||
mapped to any pin, like in a phone exchange. So the available pins groups for
|
||||
a certain function will be limited to a few choices (say up to eight or so),
|
||||
not hundreds or any amount of choices. This is the characteristic we have found
|
||||
by inspecting available pinmux hardware, and a necessary assumption since we
|
||||
expect pinmux drivers to present *all* possible function vs pin group mappings
|
||||
to the subsystem.
|
||||
|
||||
|
||||
Pinmux drivers
|
||||
==============
|
||||
|
||||
The pinmux core takes care of preventing conflicts on pins and calling
|
||||
the pin controller driver to execute different settings.
|
||||
|
||||
It is the responsibility of the pinmux driver to impose further restrictions
|
||||
(say for example infer electronic limitations due to load etc) to determine
|
||||
whether or not the requested function can actually be allowed, and in case it
|
||||
is possible to perform the requested mux setting, poke the hardware so that
|
||||
this happens.
|
||||
|
||||
Pinmux drivers are required to supply a few callback functions, some are
|
||||
optional. Usually the enable() and disable() functions are implemented,
|
||||
writing values into some certain registers to activate a certain mux setting
|
||||
for a certain pin.
|
||||
|
||||
A simple driver for the above example will work by setting bits 0, 1, 2, 3 or 4
|
||||
into some register named MUX to select a certain function with a certain
|
||||
group of pins would work something like this:
|
||||
|
||||
#include <linux/pinctrl/pinctrl.h>
|
||||
#include <linux/pinctrl/pinmux.h>
|
||||
|
||||
struct foo_group {
|
||||
const char *name;
|
||||
const unsigned int *pins;
|
||||
const unsigned num_pins;
|
||||
};
|
||||
|
||||
static const unsigned spi0_0_pins[] = { 0, 8, 16, 24 };
|
||||
static const unsigned spi0_1_pins[] = { 38, 46, 54, 62 };
|
||||
static const unsigned i2c0_pins[] = { 24, 25 };
|
||||
static const unsigned mmc0_1_pins[] = { 56, 57 };
|
||||
static const unsigned mmc0_2_pins[] = { 58, 59 };
|
||||
static const unsigned mmc0_3_pins[] = { 60, 61, 62, 63 };
|
||||
|
||||
static const struct foo_group foo_groups[] = {
|
||||
{
|
||||
.name = "spi0_0_grp",
|
||||
.pins = spi0_0_pins,
|
||||
.num_pins = ARRAY_SIZE(spi0_0_pins),
|
||||
},
|
||||
{
|
||||
.name = "spi0_1_grp",
|
||||
.pins = spi0_1_pins,
|
||||
.num_pins = ARRAY_SIZE(spi0_1_pins),
|
||||
},
|
||||
{
|
||||
.name = "i2c0_grp",
|
||||
.pins = i2c0_pins,
|
||||
.num_pins = ARRAY_SIZE(i2c0_pins),
|
||||
},
|
||||
{
|
||||
.name = "mmc0_1_grp",
|
||||
.pins = mmc0_1_pins,
|
||||
.num_pins = ARRAY_SIZE(mmc0_1_pins),
|
||||
},
|
||||
{
|
||||
.name = "mmc0_2_grp",
|
||||
.pins = mmc0_2_pins,
|
||||
.num_pins = ARRAY_SIZE(mmc0_2_pins),
|
||||
},
|
||||
{
|
||||
.name = "mmc0_3_grp",
|
||||
.pins = mmc0_3_pins,
|
||||
.num_pins = ARRAY_SIZE(mmc0_3_pins),
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
static int foo_list_groups(struct pinctrl_dev *pctldev, unsigned selector)
|
||||
{
|
||||
if (selector >= ARRAY_SIZE(foo_groups))
|
||||
return -EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const char *foo_get_group_name(struct pinctrl_dev *pctldev,
|
||||
unsigned selector)
|
||||
{
|
||||
return foo_groups[selector].name;
|
||||
}
|
||||
|
||||
static int foo_get_group_pins(struct pinctrl_dev *pctldev, unsigned selector,
|
||||
unsigned ** const pins,
|
||||
unsigned * const num_pins)
|
||||
{
|
||||
*pins = (unsigned *) foo_groups[selector].pins;
|
||||
*num_pins = foo_groups[selector].num_pins;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct pinctrl_ops foo_pctrl_ops = {
|
||||
.list_groups = foo_list_groups,
|
||||
.get_group_name = foo_get_group_name,
|
||||
.get_group_pins = foo_get_group_pins,
|
||||
};
|
||||
|
||||
struct foo_pmx_func {
|
||||
const char *name;
|
||||
const char * const *groups;
|
||||
const unsigned num_groups;
|
||||
};
|
||||
|
||||
static const char * const spi0_groups[] = { "spi0_1_grp" };
|
||||
static const char * const i2c0_groups[] = { "i2c0_grp" };
|
||||
static const char * const mmc0_groups[] = { "mmc0_1_grp", "mmc0_2_grp",
|
||||
"mmc0_3_grp" };
|
||||
|
||||
static const struct foo_pmx_func foo_functions[] = {
|
||||
{
|
||||
.name = "spi0",
|
||||
.groups = spi0_groups,
|
||||
.num_groups = ARRAY_SIZE(spi0_groups),
|
||||
},
|
||||
{
|
||||
.name = "i2c0",
|
||||
.groups = i2c0_groups,
|
||||
.num_groups = ARRAY_SIZE(i2c0_groups),
|
||||
},
|
||||
{
|
||||
.name = "mmc0",
|
||||
.groups = mmc0_groups,
|
||||
.num_groups = ARRAY_SIZE(mmc0_groups),
|
||||
},
|
||||
};
|
||||
|
||||
int foo_list_funcs(struct pinctrl_dev *pctldev, unsigned selector)
|
||||
{
|
||||
if (selector >= ARRAY_SIZE(foo_functions))
|
||||
return -EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
const char *foo_get_fname(struct pinctrl_dev *pctldev, unsigned selector)
|
||||
{
|
||||
return myfuncs[selector].name;
|
||||
}
|
||||
|
||||
static int foo_get_groups(struct pinctrl_dev *pctldev, unsigned selector,
|
||||
const char * const **groups,
|
||||
unsigned * const num_groups)
|
||||
{
|
||||
*groups = foo_functions[selector].groups;
|
||||
*num_groups = foo_functions[selector].num_groups;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int foo_enable(struct pinctrl_dev *pctldev, unsigned selector,
|
||||
unsigned group)
|
||||
{
|
||||
u8 regbit = (1 << group);
|
||||
|
||||
writeb((readb(MUX)|regbit), MUX)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int foo_disable(struct pinctrl_dev *pctldev, unsigned selector,
|
||||
unsigned group)
|
||||
{
|
||||
u8 regbit = (1 << group);
|
||||
|
||||
writeb((readb(MUX) & ~(regbit)), MUX)
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct pinmux_ops foo_pmxops = {
|
||||
.list_functions = foo_list_funcs,
|
||||
.get_function_name = foo_get_fname,
|
||||
.get_function_groups = foo_get_groups,
|
||||
.enable = foo_enable,
|
||||
.disable = foo_disable,
|
||||
};
|
||||
|
||||
/* Pinmux operations are handled by some pin controller */
|
||||
static struct pinctrl_desc foo_desc = {
|
||||
...
|
||||
.pctlops = &foo_pctrl_ops,
|
||||
.pmxops = &foo_pmxops,
|
||||
};
|
||||
|
||||
In the example activating muxing 0 and 1 at the same time setting bits
|
||||
0 and 1, uses one pin in common so they would collide.
|
||||
|
||||
The beauty of the pinmux subsystem is that since it keeps track of all
|
||||
pins and who is using them, it will already have denied an impossible
|
||||
request like that, so the driver does not need to worry about such
|
||||
things - when it gets a selector passed in, the pinmux subsystem makes
|
||||
sure no other device or GPIO assignment is already using the selected
|
||||
pins. Thus bits 0 and 1 in the control register will never be set at the
|
||||
same time.
|
||||
|
||||
All the above functions are mandatory to implement for a pinmux driver.
|
||||
|
||||
|
||||
Pinmux interaction with the GPIO subsystem
|
||||
==========================================
|
||||
|
||||
The function list could become long, especially if you can convert every
|
||||
individual pin into a GPIO pin independent of any other pins, and then try
|
||||
the approach to define every pin as a function.
|
||||
|
||||
In this case, the function array would become 64 entries for each GPIO
|
||||
setting and then the device functions.
|
||||
|
||||
For this reason there is an additional function a pinmux driver can implement
|
||||
to enable only GPIO on an individual pin: .gpio_request_enable(). The same
|
||||
.free() function as for other functions is assumed to be usable also for
|
||||
GPIO pins.
|
||||
|
||||
This function will pass in the affected GPIO range identified by the pin
|
||||
controller core, so you know which GPIO pins are being affected by the request
|
||||
operation.
|
||||
|
||||
Alternatively it is fully allowed to use named functions for each GPIO
|
||||
pin, the pinmux_request_gpio() will attempt to obtain the function "gpioN"
|
||||
where "N" is the global GPIO pin number if no special GPIO-handler is
|
||||
registered.
|
||||
|
||||
|
||||
Pinmux board/machine configuration
|
||||
==================================
|
||||
|
||||
Boards and machines define how a certain complete running system is put
|
||||
together, including how GPIOs and devices are muxed, how regulators are
|
||||
constrained and how the clock tree looks. Of course pinmux settings are also
|
||||
part of this.
|
||||
|
||||
A pinmux config for a machine looks pretty much like a simple regulator
|
||||
configuration, so for the example array above we want to enable i2c and
|
||||
spi on the second function mapping:
|
||||
|
||||
#include <linux/pinctrl/machine.h>
|
||||
|
||||
static struct pinmux_map pmx_mapping[] = {
|
||||
{
|
||||
.ctrl_dev_name = "pinctrl.0",
|
||||
.function = "spi0",
|
||||
.dev_name = "foo-spi.0",
|
||||
},
|
||||
{
|
||||
.ctrl_dev_name = "pinctrl.0",
|
||||
.function = "i2c0",
|
||||
.dev_name = "foo-i2c.0",
|
||||
},
|
||||
{
|
||||
.ctrl_dev_name = "pinctrl.0",
|
||||
.function = "mmc0",
|
||||
.dev_name = "foo-mmc.0",
|
||||
},
|
||||
};
|
||||
|
||||
The dev_name here matches to the unique device name that can be used to look
|
||||
up the device struct (just like with clockdev or regulators). The function name
|
||||
must match a function provided by the pinmux driver handling this pin range.
|
||||
|
||||
As you can see we may have several pin controllers on the system and thus
|
||||
we need to specify which one of them that contain the functions we wish
|
||||
to map. The map can also use struct device * directly, so there is no
|
||||
inherent need to use strings to specify .dev_name or .ctrl_dev_name, these
|
||||
are for the situation where you do not have a handle to the struct device *,
|
||||
for example if they are not yet instantiated or cumbersome to obtain.
|
||||
|
||||
You register this pinmux mapping to the pinmux subsystem by simply:
|
||||
|
||||
ret = pinmux_register_mappings(&pmx_mapping, ARRAY_SIZE(pmx_mapping));
|
||||
|
||||
Since the above construct is pretty common there is a helper macro to make
|
||||
it even more compact which assumes you want to use pinctrl.0 and position
|
||||
0 for mapping, for example:
|
||||
|
||||
static struct pinmux_map pmx_mapping[] = {
|
||||
PINMUX_MAP_PRIMARY("I2CMAP", "i2c0", "foo-i2c.0"),
|
||||
};
|
||||
|
||||
|
||||
Complex mappings
|
||||
================
|
||||
|
||||
As it is possible to map a function to different groups of pins an optional
|
||||
.group can be specified like this:
|
||||
|
||||
...
|
||||
{
|
||||
.name = "spi0-pos-A",
|
||||
.ctrl_dev_name = "pinctrl.0",
|
||||
.function = "spi0",
|
||||
.group = "spi0_0_grp",
|
||||
.dev_name = "foo-spi.0",
|
||||
},
|
||||
{
|
||||
.name = "spi0-pos-B",
|
||||
.ctrl_dev_name = "pinctrl.0",
|
||||
.function = "spi0",
|
||||
.group = "spi0_1_grp",
|
||||
.dev_name = "foo-spi.0",
|
||||
},
|
||||
...
|
||||
|
||||
This example mapping is used to switch between two positions for spi0 at
|
||||
runtime, as described further below under the heading "Runtime pinmuxing".
|
||||
|
||||
Further it is possible to match several groups of pins to the same function
|
||||
for a single device, say for example in the mmc0 example above, where you can
|
||||
additively expand the mmc0 bus from 2 to 4 to 8 pins. If we want to use all
|
||||
three groups for a total of 2+2+4 = 8 pins (for an 8-bit MMC bus as is the
|
||||
case), we define a mapping like this:
|
||||
|
||||
...
|
||||
{
|
||||
.name "2bit"
|
||||
.ctrl_dev_name = "pinctrl.0",
|
||||
.function = "mmc0",
|
||||
.group = "mmc0_0_grp",
|
||||
.dev_name = "foo-mmc.0",
|
||||
},
|
||||
{
|
||||
.name "4bit"
|
||||
.ctrl_dev_name = "pinctrl.0",
|
||||
.function = "mmc0",
|
||||
.group = "mmc0_0_grp",
|
||||
.dev_name = "foo-mmc.0",
|
||||
},
|
||||
{
|
||||
.name "4bit"
|
||||
.ctrl_dev_name = "pinctrl.0",
|
||||
.function = "mmc0",
|
||||
.group = "mmc0_1_grp",
|
||||
.dev_name = "foo-mmc.0",
|
||||
},
|
||||
{
|
||||
.name "8bit"
|
||||
.ctrl_dev_name = "pinctrl.0",
|
||||
.function = "mmc0",
|
||||
.group = "mmc0_0_grp",
|
||||
.dev_name = "foo-mmc.0",
|
||||
},
|
||||
{
|
||||
.name "8bit"
|
||||
.ctrl_dev_name = "pinctrl.0",
|
||||
.function = "mmc0",
|
||||
.group = "mmc0_1_grp",
|
||||
.dev_name = "foo-mmc.0",
|
||||
},
|
||||
{
|
||||
.name "8bit"
|
||||
.ctrl_dev_name = "pinctrl.0",
|
||||
.function = "mmc0",
|
||||
.group = "mmc0_2_grp",
|
||||
.dev_name = "foo-mmc.0",
|
||||
},
|
||||
...
|
||||
|
||||
The result of grabbing this mapping from the device with something like
|
||||
this (see next paragraph):
|
||||
|
||||
pmx = pinmux_get(&device, "8bit");
|
||||
|
||||
Will be that you activate all the three bottom records in the mapping at
|
||||
once. Since they share the same name, pin controller device, funcion and
|
||||
device, and since we allow multiple groups to match to a single device, they
|
||||
all get selected, and they all get enabled and disable simultaneously by the
|
||||
pinmux core.
|
||||
|
||||
|
||||
Pinmux requests from drivers
|
||||
============================
|
||||
|
||||
Generally it is discouraged to let individual drivers get and enable pinmuxes.
|
||||
So if possible, handle the pinmuxes in platform code or some other place where
|
||||
you have access to all the affected struct device * pointers. In some cases
|
||||
where a driver needs to switch between different mux mappings at runtime
|
||||
this is not possible.
|
||||
|
||||
A driver may request a certain mux to be activated, usually just the default
|
||||
mux like this:
|
||||
|
||||
#include <linux/pinctrl/pinmux.h>
|
||||
|
||||
struct foo_state {
|
||||
struct pinmux *pmx;
|
||||
...
|
||||
};
|
||||
|
||||
foo_probe()
|
||||
{
|
||||
/* Allocate a state holder named "state" etc */
|
||||
struct pinmux pmx;
|
||||
|
||||
pmx = pinmux_get(&device, NULL);
|
||||
if IS_ERR(pmx)
|
||||
return PTR_ERR(pmx);
|
||||
pinmux_enable(pmx);
|
||||
|
||||
state->pmx = pmx;
|
||||
}
|
||||
|
||||
foo_remove()
|
||||
{
|
||||
pinmux_disable(state->pmx);
|
||||
pinmux_put(state->pmx);
|
||||
}
|
||||
|
||||
If you want to grab a specific mux mapping and not just the first one found for
|
||||
this device you can specify a specific mapping name, for example in the above
|
||||
example the second i2c0 setting: pinmux_get(&device, "spi0-pos-B");
|
||||
|
||||
This get/enable/disable/put sequence can just as well be handled by bus drivers
|
||||
if you don't want each and every driver to handle it and you know the
|
||||
arrangement on your bus.
|
||||
|
||||
The semantics of the get/enable respective disable/put is as follows:
|
||||
|
||||
- pinmux_get() is called in process context to reserve the pins affected with
|
||||
a certain mapping and set up the pinmux core and the driver. It will allocate
|
||||
a struct from the kernel memory to hold the pinmux state.
|
||||
|
||||
- pinmux_enable()/pinmux_disable() is quick and can be called from fastpath
|
||||
(irq context) when you quickly want to set up/tear down the hardware muxing
|
||||
when running a device driver. Usually it will just poke some values into a
|
||||
register.
|
||||
|
||||
- pinmux_disable() is called in process context to tear down the pin requests
|
||||
and release the state holder struct for the mux setting.
|
||||
|
||||
Usually the pinmux core handled the get/put pair and call out to the device
|
||||
drivers bookkeeping operations, like checking available functions and the
|
||||
associated pins, whereas the enable/disable pass on to the pin controller
|
||||
driver which takes care of activating and/or deactivating the mux setting by
|
||||
quickly poking some registers.
|
||||
|
||||
The pins are allocated for your device when you issue the pinmux_get() call,
|
||||
after this you should be able to see this in the debugfs listing of all pins.
|
||||
|
||||
|
||||
System pinmux hogging
|
||||
=====================
|
||||
|
||||
A system pinmux map entry, i.e. a pinmux setting that does not have a device
|
||||
associated with it, can be hogged by the core when the pin controller is
|
||||
registered. This means that the core will attempt to call pinmux_get() and
|
||||
pinmux_enable() on it immediately after the pin control device has been
|
||||
registered.
|
||||
|
||||
This is enabled by simply setting the .hog_on_boot field in the map to true,
|
||||
like this:
|
||||
|
||||
{
|
||||
.name "POWERMAP"
|
||||
.ctrl_dev_name = "pinctrl.0",
|
||||
.function = "power_func",
|
||||
.hog_on_boot = true,
|
||||
},
|
||||
|
||||
Since it may be common to request the core to hog a few always-applicable
|
||||
mux settings on the primary pin controller, there is a convenience macro for
|
||||
this:
|
||||
|
||||
PINMUX_MAP_PRIMARY_SYS_HOG("POWERMAP", "power_func")
|
||||
|
||||
This gives the exact same result as the above construction.
|
||||
|
||||
|
||||
Runtime pinmuxing
|
||||
=================
|
||||
|
||||
It is possible to mux a certain function in and out at runtime, say to move
|
||||
an SPI port from one set of pins to another set of pins. Say for example for
|
||||
spi0 in the example above, we expose two different groups of pins for the same
|
||||
function, but with different named in the mapping as described under
|
||||
"Advanced mapping" above. So we have two mappings named "spi0-pos-A" and
|
||||
"spi0-pos-B".
|
||||
|
||||
This snippet first muxes the function in the pins defined by group A, enables
|
||||
it, disables and releases it, and muxes it in on the pins defined by group B:
|
||||
|
||||
foo_switch()
|
||||
{
|
||||
struct pinmux pmx;
|
||||
|
||||
/* Enable on position A */
|
||||
pmx = pinmux_get(&device, "spi0-pos-A");
|
||||
if IS_ERR(pmx)
|
||||
return PTR_ERR(pmx);
|
||||
pinmux_enable(pmx);
|
||||
|
||||
/* This releases the pins again */
|
||||
pinmux_disable(pmx);
|
||||
pinmux_put(pmx);
|
||||
|
||||
/* Enable on position B */
|
||||
pmx = pinmux_get(&device, "spi0-pos-B");
|
||||
if IS_ERR(pmx)
|
||||
return PTR_ERR(pmx);
|
||||
pinmux_enable(pmx);
|
||||
...
|
||||
}
|
||||
|
||||
The above has to be done from process context.
|
@ -26,6 +26,8 @@ s2ram.txt
|
||||
- How to get suspend to ram working (and debug it when it isn't)
|
||||
states.txt
|
||||
- System power management states
|
||||
suspend-and-cpuhotplug.txt
|
||||
- Explains the interaction between Suspend-to-RAM (S3) and CPU hotplug
|
||||
swsusp-and-swap-files.txt
|
||||
- Using swap files with software suspend (to disk)
|
||||
swsusp-dmcrypt.txt
|
||||
|
@ -173,7 +173,7 @@ kernel messages using the serial console. This may provide you with some
|
||||
information about the reasons of the suspend (resume) failure. Alternatively,
|
||||
it may be possible to use a FireWire port for debugging with firescope
|
||||
(ftp://ftp.firstfloor.org/pub/ak/firescope/). On x86 it is also possible to
|
||||
use the PM_TRACE mechanism documented in Documentation/s2ram.txt .
|
||||
use the PM_TRACE mechanism documented in Documentation/power/s2ram.txt .
|
||||
|
||||
2. Testing suspend to RAM (STR)
|
||||
|
||||
@ -201,3 +201,27 @@ case, you may be able to search for failing drivers by following the procedure
|
||||
analogous to the one described in section 1. If you find some failing drivers,
|
||||
you will have to unload them every time before an STR transition (ie. before
|
||||
you run s2ram), and please report the problems with them.
|
||||
|
||||
There is a debugfs entry which shows the suspend to RAM statistics. Here is an
|
||||
example of its output.
|
||||
# mount -t debugfs none /sys/kernel/debug
|
||||
# cat /sys/kernel/debug/suspend_stats
|
||||
success: 20
|
||||
fail: 5
|
||||
failed_freeze: 0
|
||||
failed_prepare: 0
|
||||
failed_suspend: 5
|
||||
failed_suspend_noirq: 0
|
||||
failed_resume: 0
|
||||
failed_resume_noirq: 0
|
||||
failures:
|
||||
last_failed_dev: alarm
|
||||
adc
|
||||
last_failed_errno: -16
|
||||
-16
|
||||
last_failed_step: suspend
|
||||
suspend
|
||||
Field success means the success number of suspend to RAM, and field fail means
|
||||
the failure number. Others are the failure number of different steps of suspend
|
||||
to RAM. suspend_stats just lists the last 2 failed devices, error number and
|
||||
failed step of suspend.
|
||||
|
@ -152,7 +152,9 @@ try to use its wakeup mechanism. device_set_wakeup_enable() affects this flag;
|
||||
for the most part drivers should not change its value. The initial value of
|
||||
should_wakeup is supposed to be false for the majority of devices; the major
|
||||
exceptions are power buttons, keyboards, and Ethernet adapters whose WoL
|
||||
(wake-on-LAN) feature has been set up with ethtool.
|
||||
(wake-on-LAN) feature has been set up with ethtool. It should also default
|
||||
to true for devices that don't generate wakeup requests on their own but merely
|
||||
forward wakeup requests from one bus to another (like PCI bridges).
|
||||
|
||||
Whether or not a device is capable of issuing wakeup events is a hardware
|
||||
matter, and the kernel is responsible for keeping track of it. By contrast,
|
||||
@ -279,10 +281,6 @@ When the system goes into the standby or memory sleep state, the phases are:
|
||||
time.) Unlike the other suspend-related phases, during the prepare
|
||||
phase the device tree is traversed top-down.
|
||||
|
||||
In addition to that, if device drivers need to allocate additional
|
||||
memory to be able to hadle device suspend correctly, that should be
|
||||
done in the prepare phase.
|
||||
|
||||
After the prepare callback method returns, no new children may be
|
||||
registered below the device. The method may also prepare the device or
|
||||
driver in some way for the upcoming system power transition (for
|
||||
|
@ -4,14 +4,19 @@ This interface provides a kernel and user mode interface for registering
|
||||
performance expectations by drivers, subsystems and user space applications on
|
||||
one of the parameters.
|
||||
|
||||
Currently we have {cpu_dma_latency, network_latency, network_throughput} as the
|
||||
initial set of pm_qos parameters.
|
||||
Two different PM QoS frameworks are available:
|
||||
1. PM QoS classes for cpu_dma_latency, network_latency, network_throughput.
|
||||
2. the per-device PM QoS framework provides the API to manage the per-device latency
|
||||
constraints.
|
||||
|
||||
Each parameters have defined units:
|
||||
* latency: usec
|
||||
* timeout: usec
|
||||
* throughput: kbs (kilo bit / sec)
|
||||
|
||||
|
||||
1. PM QoS framework
|
||||
|
||||
The infrastructure exposes multiple misc device nodes one per implemented
|
||||
parameter. The set of parameters implement is defined by pm_qos_power_init()
|
||||
and pm_qos_params.h. This is done because having the available parameters
|
||||
@ -23,14 +28,18 @@ an aggregated target value. The aggregated target value is updated with
|
||||
changes to the request list or elements of the list. Typically the
|
||||
aggregated target value is simply the max or min of the request values held
|
||||
in the parameter list elements.
|
||||
Note: the aggregated target value is implemented as an atomic variable so that
|
||||
reading the aggregated value does not require any locking mechanism.
|
||||
|
||||
|
||||
From kernel mode the use of this interface is simple:
|
||||
|
||||
handle = pm_qos_add_request(param_class, target_value):
|
||||
Will insert an element into the list for that identified PM_QOS class with the
|
||||
void pm_qos_add_request(handle, param_class, target_value):
|
||||
Will insert an element into the list for that identified PM QoS class with the
|
||||
target value. Upon change to this list the new target is recomputed and any
|
||||
registered notifiers are called only if the target value is now different.
|
||||
Clients of pm_qos need to save the returned handle.
|
||||
Clients of pm_qos need to save the returned handle for future use in other
|
||||
pm_qos API functions.
|
||||
|
||||
void pm_qos_update_request(handle, new_target_value):
|
||||
Will update the list element pointed to by the handle with the new target value
|
||||
@ -42,6 +51,20 @@ Will remove the element. After removal it will update the aggregate target and
|
||||
call the notification tree if the target was changed as a result of removing
|
||||
the request.
|
||||
|
||||
int pm_qos_request(param_class):
|
||||
Returns the aggregated value for a given PM QoS class.
|
||||
|
||||
int pm_qos_request_active(handle):
|
||||
Returns if the request is still active, i.e. it has not been removed from a
|
||||
PM QoS class constraints list.
|
||||
|
||||
int pm_qos_add_notifier(param_class, notifier):
|
||||
Adds a notification callback function to the PM QoS class. The callback is
|
||||
called when the aggregated value for the PM QoS class is changed.
|
||||
|
||||
int pm_qos_remove_notifier(int param_class, notifier):
|
||||
Removes the notification callback function for the PM QoS class.
|
||||
|
||||
|
||||
From user mode:
|
||||
Only processes can register a pm_qos request. To provide for automatic
|
||||
@ -63,4 +86,63 @@ To remove the user mode request for a target value simply close the device
|
||||
node.
|
||||
|
||||
|
||||
2. PM QoS per-device latency framework
|
||||
|
||||
For each device a list of performance requests is maintained along with
|
||||
an aggregated target value. The aggregated target value is updated with
|
||||
changes to the request list or elements of the list. Typically the
|
||||
aggregated target value is simply the max or min of the request values held
|
||||
in the parameter list elements.
|
||||
Note: the aggregated target value is implemented as an atomic variable so that
|
||||
reading the aggregated value does not require any locking mechanism.
|
||||
|
||||
|
||||
From kernel mode the use of this interface is the following:
|
||||
|
||||
int dev_pm_qos_add_request(device, handle, value):
|
||||
Will insert an element into the list for that identified device with the
|
||||
target value. Upon change to this list the new target is recomputed and any
|
||||
registered notifiers are called only if the target value is now different.
|
||||
Clients of dev_pm_qos need to save the handle for future use in other
|
||||
dev_pm_qos API functions.
|
||||
|
||||
int dev_pm_qos_update_request(handle, new_value):
|
||||
Will update the list element pointed to by the handle with the new target value
|
||||
and recompute the new aggregated target, calling the notification trees if the
|
||||
target is changed.
|
||||
|
||||
int dev_pm_qos_remove_request(handle):
|
||||
Will remove the element. After removal it will update the aggregate target and
|
||||
call the notification trees if the target was changed as a result of removing
|
||||
the request.
|
||||
|
||||
s32 dev_pm_qos_read_value(device):
|
||||
Returns the aggregated value for a given device's constraints list.
|
||||
|
||||
|
||||
Notification mechanisms:
|
||||
The per-device PM QoS framework has 2 different and distinct notification trees:
|
||||
a per-device notification tree and a global notification tree.
|
||||
|
||||
int dev_pm_qos_add_notifier(device, notifier):
|
||||
Adds a notification callback function for the device.
|
||||
The callback is called when the aggregated value of the device constraints list
|
||||
is changed.
|
||||
|
||||
int dev_pm_qos_remove_notifier(device, notifier):
|
||||
Removes the notification callback function for the device.
|
||||
|
||||
int dev_pm_qos_add_global_notifier(notifier):
|
||||
Adds a notification callback function in the global notification tree of the
|
||||
framework.
|
||||
The callback is called when the aggregated value for any device is changed.
|
||||
|
||||
int dev_pm_qos_remove_global_notifier(notifier):
|
||||
Removes the notification callback function from the global notification tree
|
||||
of the framework.
|
||||
|
||||
|
||||
From user mode:
|
||||
No API for user space access to the per-device latency constraints is provided
|
||||
yet - still under discussion.
|
||||
|
||||
|
@ -43,13 +43,18 @@ struct dev_pm_ops {
|
||||
...
|
||||
};
|
||||
|
||||
The ->runtime_suspend(), ->runtime_resume() and ->runtime_idle() callbacks are
|
||||
executed by the PM core for either the device type, or the class (if the device
|
||||
type's struct dev_pm_ops object does not exist), or the bus type (if the
|
||||
device type's and class' struct dev_pm_ops objects do not exist) of the given
|
||||
device (this allows device types to override callbacks provided by bus types or
|
||||
classes if necessary). The bus type, device type and class callbacks are
|
||||
referred to as subsystem-level callbacks in what follows.
|
||||
The ->runtime_suspend(), ->runtime_resume() and ->runtime_idle() callbacks
|
||||
are executed by the PM core for either the power domain, or the device type
|
||||
(if the device power domain's struct dev_pm_ops does not exist), or the class
|
||||
(if the device power domain's and type's struct dev_pm_ops object does not
|
||||
exist), or the bus type (if the device power domain's, type's and class'
|
||||
struct dev_pm_ops objects do not exist) of the given device, so the priority
|
||||
order of callbacks from high to low is that power domain callbacks, device
|
||||
type callbacks, class callbacks and bus type callbacks, and the high priority
|
||||
one will take precedence over low priority one. The bus type, device type and
|
||||
class callbacks are referred to as subsystem-level callbacks in what follows,
|
||||
and generally speaking, the power domain callbacks are used for representing
|
||||
power domains within a SoC.
|
||||
|
||||
By default, the callbacks are always invoked in process context with interrupts
|
||||
enabled. However, subsystems can use the pm_runtime_irq_safe() helper function
|
||||
@ -477,12 +482,14 @@ pm_runtime_autosuspend_expiration()
|
||||
If pm_runtime_irq_safe() has been called for a device then the following helper
|
||||
functions may also be used in interrupt context:
|
||||
|
||||
pm_runtime_idle()
|
||||
pm_runtime_suspend()
|
||||
pm_runtime_autosuspend()
|
||||
pm_runtime_resume()
|
||||
pm_runtime_get_sync()
|
||||
pm_runtime_put_sync()
|
||||
pm_runtime_put_sync_suspend()
|
||||
pm_runtime_put_sync_autosuspend()
|
||||
|
||||
5. Runtime PM Initialization, Device Probing and Removal
|
||||
|
||||
|
275
Documentation/power/suspend-and-cpuhotplug.txt
Normal file
275
Documentation/power/suspend-and-cpuhotplug.txt
Normal file
@ -0,0 +1,275 @@
|
||||
Interaction of Suspend code (S3) with the CPU hotplug infrastructure
|
||||
|
||||
(C) 2011 Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
|
||||
|
||||
|
||||
I. How does the regular CPU hotplug code differ from how the Suspend-to-RAM
|
||||
infrastructure uses it internally? And where do they share common code?
|
||||
|
||||
Well, a picture is worth a thousand words... So ASCII art follows :-)
|
||||
|
||||
[This depicts the current design in the kernel, and focusses only on the
|
||||
interactions involving the freezer and CPU hotplug and also tries to explain
|
||||
the locking involved. It outlines the notifications involved as well.
|
||||
But please note that here, only the call paths are illustrated, with the aim
|
||||
of describing where they take different paths and where they share code.
|
||||
What happens when regular CPU hotplug and Suspend-to-RAM race with each other
|
||||
is not depicted here.]
|
||||
|
||||
On a high level, the suspend-resume cycle goes like this:
|
||||
|
||||
|Freeze| -> |Disable nonboot| -> |Do suspend| -> |Enable nonboot| -> |Thaw |
|
||||
|tasks | | cpus | | | | cpus | |tasks|
|
||||
|
||||
|
||||
More details follow:
|
||||
|
||||
Suspend call path
|
||||
-----------------
|
||||
|
||||
Write 'mem' to
|
||||
/sys/power/state
|
||||
syfs file
|
||||
|
|
||||
v
|
||||
Acquire pm_mutex lock
|
||||
|
|
||||
v
|
||||
Send PM_SUSPEND_PREPARE
|
||||
notifications
|
||||
|
|
||||
v
|
||||
Freeze tasks
|
||||
|
|
||||
|
|
||||
v
|
||||
disable_nonboot_cpus()
|
||||
/* start */
|
||||
|
|
||||
v
|
||||
Acquire cpu_add_remove_lock
|
||||
|
|
||||
v
|
||||
Iterate over CURRENTLY
|
||||
online CPUs
|
||||
|
|
||||
|
|
||||
| ----------
|
||||
v | L
|
||||
======> _cpu_down() |
|
||||
| [This takes cpuhotplug.lock |
|
||||
Common | before taking down the CPU |
|
||||
code | and releases it when done] | O
|
||||
| While it is at it, notifications |
|
||||
| are sent when notable events occur, |
|
||||
======> by running all registered callbacks. |
|
||||
| | O
|
||||
| |
|
||||
| |
|
||||
v |
|
||||
Note down these cpus in | P
|
||||
frozen_cpus mask ----------
|
||||
|
|
||||
v
|
||||
Disable regular cpu hotplug
|
||||
by setting cpu_hotplug_disabled=1
|
||||
|
|
||||
v
|
||||
Release cpu_add_remove_lock
|
||||
|
|
||||
v
|
||||
/* disable_nonboot_cpus() complete */
|
||||
|
|
||||
v
|
||||
Do suspend
|
||||
|
||||
|
||||
|
||||
Resuming back is likewise, with the counterparts being (in the order of
|
||||
execution during resume):
|
||||
* enable_nonboot_cpus() which involves:
|
||||
| Acquire cpu_add_remove_lock
|
||||
| Reset cpu_hotplug_disabled to 0, thereby enabling regular cpu hotplug
|
||||
| Call _cpu_up() [for all those cpus in the frozen_cpus mask, in a loop]
|
||||
| Release cpu_add_remove_lock
|
||||
v
|
||||
|
||||
* thaw tasks
|
||||
* send PM_POST_SUSPEND notifications
|
||||
* Release pm_mutex lock.
|
||||
|
||||
|
||||
It is to be noted here that the pm_mutex lock is acquired at the very
|
||||
beginning, when we are just starting out to suspend, and then released only
|
||||
after the entire cycle is complete (i.e., suspend + resume).
|
||||
|
||||
|
||||
|
||||
Regular CPU hotplug call path
|
||||
-----------------------------
|
||||
|
||||
Write 0 (or 1) to
|
||||
/sys/devices/system/cpu/cpu*/online
|
||||
sysfs file
|
||||
|
|
||||
|
|
||||
v
|
||||
cpu_down()
|
||||
|
|
||||
v
|
||||
Acquire cpu_add_remove_lock
|
||||
|
|
||||
v
|
||||
If cpu_hotplug_disabled is 1
|
||||
return gracefully
|
||||
|
|
||||
|
|
||||
v
|
||||
======> _cpu_down()
|
||||
| [This takes cpuhotplug.lock
|
||||
Common | before taking down the CPU
|
||||
code | and releases it when done]
|
||||
| While it is at it, notifications
|
||||
| are sent when notable events occur,
|
||||
======> by running all registered callbacks.
|
||||
|
|
||||
|
|
||||
v
|
||||
Release cpu_add_remove_lock
|
||||
[That's it!, for
|
||||
regular CPU hotplug]
|
||||
|
||||
|
||||
|
||||
So, as can be seen from the two diagrams (the parts marked as "Common code"),
|
||||
regular CPU hotplug and the suspend code path converge at the _cpu_down() and
|
||||
_cpu_up() functions. They differ in the arguments passed to these functions,
|
||||
in that during regular CPU hotplug, 0 is passed for the 'tasks_frozen'
|
||||
argument. But during suspend, since the tasks are already frozen by the time
|
||||
the non-boot CPUs are offlined or onlined, the _cpu_*() functions are called
|
||||
with the 'tasks_frozen' argument set to 1.
|
||||
[See below for some known issues regarding this.]
|
||||
|
||||
|
||||
Important files and functions/entry points:
|
||||
------------------------------------------
|
||||
|
||||
kernel/power/process.c : freeze_processes(), thaw_processes()
|
||||
kernel/power/suspend.c : suspend_prepare(), suspend_enter(), suspend_finish()
|
||||
kernel/cpu.c: cpu_[up|down](), _cpu_[up|down](), [disable|enable]_nonboot_cpus()
|
||||
|
||||
|
||||
|
||||
II. What are the issues involved in CPU hotplug?
|
||||
-------------------------------------------
|
||||
|
||||
There are some interesting situations involving CPU hotplug and microcode
|
||||
update on the CPUs, as discussed below:
|
||||
|
||||
[Please bear in mind that the kernel requests the microcode images from
|
||||
userspace, using the request_firmware() function defined in
|
||||
drivers/base/firmware_class.c]
|
||||
|
||||
|
||||
a. When all the CPUs are identical:
|
||||
|
||||
This is the most common situation and it is quite straightforward: we want
|
||||
to apply the same microcode revision to each of the CPUs.
|
||||
To give an example of x86, the collect_cpu_info() function defined in
|
||||
arch/x86/kernel/microcode_core.c helps in discovering the type of the CPU
|
||||
and thereby in applying the correct microcode revision to it.
|
||||
But note that the kernel does not maintain a common microcode image for the
|
||||
all CPUs, in order to handle case 'b' described below.
|
||||
|
||||
|
||||
b. When some of the CPUs are different than the rest:
|
||||
|
||||
In this case since we probably need to apply different microcode revisions
|
||||
to different CPUs, the kernel maintains a copy of the correct microcode
|
||||
image for each CPU (after appropriate CPU type/model discovery using
|
||||
functions such as collect_cpu_info()).
|
||||
|
||||
|
||||
c. When a CPU is physically hot-unplugged and a new (and possibly different
|
||||
type of) CPU is hot-plugged into the system:
|
||||
|
||||
In the current design of the kernel, whenever a CPU is taken offline during
|
||||
a regular CPU hotplug operation, upon receiving the CPU_DEAD notification
|
||||
(which is sent by the CPU hotplug code), the microcode update driver's
|
||||
callback for that event reacts by freeing the kernel's copy of the
|
||||
microcode image for that CPU.
|
||||
|
||||
Hence, when a new CPU is brought online, since the kernel finds that it
|
||||
doesn't have the microcode image, it does the CPU type/model discovery
|
||||
afresh and then requests the userspace for the appropriate microcode image
|
||||
for that CPU, which is subsequently applied.
|
||||
|
||||
For example, in x86, the mc_cpu_callback() function (which is the microcode
|
||||
update driver's callback registered for CPU hotplug events) calls
|
||||
microcode_update_cpu() which would call microcode_init_cpu() in this case,
|
||||
instead of microcode_resume_cpu() when it finds that the kernel doesn't
|
||||
have a valid microcode image. This ensures that the CPU type/model
|
||||
discovery is performed and the right microcode is applied to the CPU after
|
||||
getting it from userspace.
|
||||
|
||||
|
||||
d. Handling microcode update during suspend/hibernate:
|
||||
|
||||
Strictly speaking, during a CPU hotplug operation which does not involve
|
||||
physically removing or inserting CPUs, the CPUs are not actually powered
|
||||
off during a CPU offline. They are just put to the lowest C-states possible.
|
||||
Hence, in such a case, it is not really necessary to re-apply microcode
|
||||
when the CPUs are brought back online, since they wouldn't have lost the
|
||||
image during the CPU offline operation.
|
||||
|
||||
This is the usual scenario encountered during a resume after a suspend.
|
||||
However, in the case of hibernation, since all the CPUs are completely
|
||||
powered off, during restore it becomes necessary to apply the microcode
|
||||
images to all the CPUs.
|
||||
|
||||
[Note that we don't expect someone to physically pull out nodes and insert
|
||||
nodes with a different type of CPUs in-between a suspend-resume or a
|
||||
hibernate/restore cycle.]
|
||||
|
||||
In the current design of the kernel however, during a CPU offline operation
|
||||
as part of the suspend/hibernate cycle (the CPU_DEAD_FROZEN notification),
|
||||
the existing copy of microcode image in the kernel is not freed up.
|
||||
And during the CPU online operations (during resume/restore), since the
|
||||
kernel finds that it already has copies of the microcode images for all the
|
||||
CPUs, it just applies them to the CPUs, avoiding any re-discovery of CPU
|
||||
type/model and the need for validating whether the microcode revisions are
|
||||
right for the CPUs or not (due to the above assumption that physical CPU
|
||||
hotplug will not be done in-between suspend/resume or hibernate/restore
|
||||
cycles).
|
||||
|
||||
|
||||
III. Are there any known problems when regular CPU hotplug and suspend race
|
||||
with each other?
|
||||
|
||||
Yes, they are listed below:
|
||||
|
||||
1. When invoking regular CPU hotplug, the 'tasks_frozen' argument passed to
|
||||
the _cpu_down() and _cpu_up() functions is *always* 0.
|
||||
This might not reflect the true current state of the system, since the
|
||||
tasks could have been frozen by an out-of-band event such as a suspend
|
||||
operation in progress. Hence, it will lead to wrong notifications being
|
||||
sent during the cpu online/offline events (eg, CPU_ONLINE notification
|
||||
instead of CPU_ONLINE_FROZEN) which in turn will lead to execution of
|
||||
inappropriate code by the callbacks registered for such CPU hotplug events.
|
||||
|
||||
2. If a regular CPU hotplug stress test happens to race with the freezer due
|
||||
to a suspend operation in progress at the same time, then we could hit the
|
||||
situation described below:
|
||||
|
||||
* A regular cpu online operation continues its journey from userspace
|
||||
into the kernel, since the freezing has not yet begun.
|
||||
* Then freezer gets to work and freezes userspace.
|
||||
* If cpu online has not yet completed the microcode update stuff by now,
|
||||
it will now start waiting on the frozen userspace in the
|
||||
TASK_UNINTERRUPTIBLE state, in order to get the microcode image.
|
||||
* Now the freezer continues and tries to freeze the remaining tasks. But
|
||||
due to this wait mentioned above, the freezer won't be able to freeze
|
||||
the cpu online hotplug task and hence freezing of tasks fails.
|
||||
|
||||
As a result of this task freezing failure, the suspend operation gets
|
||||
aborted.
|
@ -77,7 +77,8 @@ SNAPSHOT_SET_SWAP_AREA - set the resume partition and the offset (in <PAGE_SIZE>
|
||||
resume_swap_area, as defined in kernel/power/suspend_ioctls.h,
|
||||
containing the resume device specification and the offset); for swap
|
||||
partitions the offset is always 0, but it is different from zero for
|
||||
swap files (see Documentation/swsusp-and-swap-files.txt for details).
|
||||
swap files (see Documentation/power/swsusp-and-swap-files.txt for
|
||||
details).
|
||||
|
||||
SNAPSHOT_PLATFORM_SUPPORT - enable/disable the hibernation platform support,
|
||||
depending on the argument value (enable, if the argument is nonzero)
|
||||
|
@ -117,5 +117,4 @@ The contents of these variables corresponds to the "name", "state" and
|
||||
"type" sysfs files explained above.
|
||||
|
||||
|
||||
For further details consult Documentation/ABI/stable/dev-rfkill and
|
||||
Documentation/ABI/stable/sysfs-class-rfkill.
|
||||
For further details consult Documentation/ABI/stable/sysfs-class-rfkill.
|
||||
|
122
Documentation/scheduler/sched-bwc.txt
Normal file
122
Documentation/scheduler/sched-bwc.txt
Normal file
@ -0,0 +1,122 @@
|
||||
CFS Bandwidth Control
|
||||
=====================
|
||||
|
||||
[ This document only discusses CPU bandwidth control for SCHED_NORMAL.
|
||||
The SCHED_RT case is covered in Documentation/scheduler/sched-rt-group.txt ]
|
||||
|
||||
CFS bandwidth control is a CONFIG_FAIR_GROUP_SCHED extension which allows the
|
||||
specification of the maximum CPU bandwidth available to a group or hierarchy.
|
||||
|
||||
The bandwidth allowed for a group is specified using a quota and period. Within
|
||||
each given "period" (microseconds), a group is allowed to consume only up to
|
||||
"quota" microseconds of CPU time. When the CPU bandwidth consumption of a
|
||||
group exceeds this limit (for that period), the tasks belonging to its
|
||||
hierarchy will be throttled and are not allowed to run again until the next
|
||||
period.
|
||||
|
||||
A group's unused runtime is globally tracked, being refreshed with quota units
|
||||
above at each period boundary. As threads consume this bandwidth it is
|
||||
transferred to cpu-local "silos" on a demand basis. The amount transferred
|
||||
within each of these updates is tunable and described as the "slice".
|
||||
|
||||
Management
|
||||
----------
|
||||
Quota and period are managed within the cpu subsystem via cgroupfs.
|
||||
|
||||
cpu.cfs_quota_us: the total available run-time within a period (in microseconds)
|
||||
cpu.cfs_period_us: the length of a period (in microseconds)
|
||||
cpu.stat: exports throttling statistics [explained further below]
|
||||
|
||||
The default values are:
|
||||
cpu.cfs_period_us=100ms
|
||||
cpu.cfs_quota=-1
|
||||
|
||||
A value of -1 for cpu.cfs_quota_us indicates that the group does not have any
|
||||
bandwidth restriction in place, such a group is described as an unconstrained
|
||||
bandwidth group. This represents the traditional work-conserving behavior for
|
||||
CFS.
|
||||
|
||||
Writing any (valid) positive value(s) will enact the specified bandwidth limit.
|
||||
The minimum quota allowed for the quota or period is 1ms. There is also an
|
||||
upper bound on the period length of 1s. Additional restrictions exist when
|
||||
bandwidth limits are used in a hierarchical fashion, these are explained in
|
||||
more detail below.
|
||||
|
||||
Writing any negative value to cpu.cfs_quota_us will remove the bandwidth limit
|
||||
and return the group to an unconstrained state once more.
|
||||
|
||||
Any updates to a group's bandwidth specification will result in it becoming
|
||||
unthrottled if it is in a constrained state.
|
||||
|
||||
System wide settings
|
||||
--------------------
|
||||
For efficiency run-time is transferred between the global pool and CPU local
|
||||
"silos" in a batch fashion. This greatly reduces global accounting pressure
|
||||
on large systems. The amount transferred each time such an update is required
|
||||
is described as the "slice".
|
||||
|
||||
This is tunable via procfs:
|
||||
/proc/sys/kernel/sched_cfs_bandwidth_slice_us (default=5ms)
|
||||
|
||||
Larger slice values will reduce transfer overheads, while smaller values allow
|
||||
for more fine-grained consumption.
|
||||
|
||||
Statistics
|
||||
----------
|
||||
A group's bandwidth statistics are exported via 3 fields in cpu.stat.
|
||||
|
||||
cpu.stat:
|
||||
- nr_periods: Number of enforcement intervals that have elapsed.
|
||||
- nr_throttled: Number of times the group has been throttled/limited.
|
||||
- throttled_time: The total time duration (in nanoseconds) for which entities
|
||||
of the group have been throttled.
|
||||
|
||||
This interface is read-only.
|
||||
|
||||
Hierarchical considerations
|
||||
---------------------------
|
||||
The interface enforces that an individual entity's bandwidth is always
|
||||
attainable, that is: max(c_i) <= C. However, over-subscription in the
|
||||
aggregate case is explicitly allowed to enable work-conserving semantics
|
||||
within a hierarchy.
|
||||
e.g. \Sum (c_i) may exceed C
|
||||
[ Where C is the parent's bandwidth, and c_i its children ]
|
||||
|
||||
|
||||
There are two ways in which a group may become throttled:
|
||||
a. it fully consumes its own quota within a period
|
||||
b. a parent's quota is fully consumed within its period
|
||||
|
||||
In case b) above, even though the child may have runtime remaining it will not
|
||||
be allowed to until the parent's runtime is refreshed.
|
||||
|
||||
Examples
|
||||
--------
|
||||
1. Limit a group to 1 CPU worth of runtime.
|
||||
|
||||
If period is 250ms and quota is also 250ms, the group will get
|
||||
1 CPU worth of runtime every 250ms.
|
||||
|
||||
# echo 250000 > cpu.cfs_quota_us /* quota = 250ms */
|
||||
# echo 250000 > cpu.cfs_period_us /* period = 250ms */
|
||||
|
||||
2. Limit a group to 2 CPUs worth of runtime on a multi-CPU machine.
|
||||
|
||||
With 500ms period and 1000ms quota, the group can get 2 CPUs worth of
|
||||
runtime every 500ms.
|
||||
|
||||
# echo 1000000 > cpu.cfs_quota_us /* quota = 1000ms */
|
||||
# echo 500000 > cpu.cfs_period_us /* period = 500ms */
|
||||
|
||||
The larger period here allows for increased burst capacity.
|
||||
|
||||
3. Limit a group to 20% of 1 CPU.
|
||||
|
||||
With 50ms period, 10ms quota will be equivalent to 20% of 1 CPU.
|
||||
|
||||
# echo 10000 > cpu.cfs_quota_us /* quota = 10ms */
|
||||
# echo 50000 > cpu.cfs_period_us /* period = 50ms */
|
||||
|
||||
By using a small period here we are ensuring a consistent latency
|
||||
response at the expense of burst capacity.
|
||||
|
@ -444,7 +444,7 @@ linux-1.1.x and fairly stable since linux-1.2.x, and are also in FreeBSD
|
||||
Kernel Compile options
|
||||
------------------------------
|
||||
The various kernel compile time options for this driver are now fairly
|
||||
well documented in the file Documentation/Configure.help. In order to
|
||||
well documented in the file drivers/scsi/Kconfig. In order to
|
||||
see this documentation, you need to use one of the advanced configuration
|
||||
programs (menuconfig and xconfig). If you are using the "make menuconfig"
|
||||
method of configuring your kernel, then you would simply highlight the
|
||||
|
@ -55,11 +55,6 @@ or in the same directory as the C source code. For example to find a url
|
||||
about the USB mass storage driver see the
|
||||
/usr/src/linux/drivers/usb/storage directory.
|
||||
|
||||
The Linux kernel source Documentation/DocBook/scsidrivers.tmpl file
|
||||
refers to this file. With the appropriate DocBook tool-set, this permits
|
||||
users to generate html, ps and pdf renderings of information within this
|
||||
file (e.g. the interface functions).
|
||||
|
||||
Driver structure
|
||||
================
|
||||
Traditionally an LLD for the SCSI subsystem has been at least two files in
|
||||
|
@ -156,4 +156,5 @@ Load an encrypted key "evm" from saved blob:
|
||||
Other uses for trusted and encrypted keys, such as for disk and file encryption
|
||||
are anticipated. In particular the new format 'ecryptfs' has been defined in
|
||||
in order to use encrypted keys to mount an eCryptfs filesystem. More details
|
||||
about the usage can be found in the file 'Documentation/keys-ecryptfs.txt'.
|
||||
about the usage can be found in the file
|
||||
'Documentation/security/keys-ecryptfs.txt'.
|
||||
|
@ -28,6 +28,10 @@
|
||||
RS485 communications. This data structure is used to set and configure RS485
|
||||
parameters in the platform data and in ioctls.
|
||||
|
||||
The device tree can also provide RS485 boot time parameters (see [2]
|
||||
for bindings). The driver is in charge of filling this data structure from
|
||||
the values given by the device tree.
|
||||
|
||||
Any driver for devices capable of working both as RS232 and RS485 should
|
||||
provide at least the following ioctls:
|
||||
|
||||
@ -104,6 +108,9 @@
|
||||
rs485conf.flags |= SER_RS485_RTS_AFTER_SEND;
|
||||
rs485conf.delay_rts_after_send = ...;
|
||||
|
||||
/* Set this flag if you want to receive data even whilst sending data */
|
||||
rs485conf.flags |= SER_RS485_RX_DURING_TX;
|
||||
|
||||
if (ioctl (fd, TIOCSRS485, &rs485conf) < 0) {
|
||||
/* Error handling. See errno. */
|
||||
}
|
||||
@ -118,3 +125,4 @@
|
||||
5. REFERENCES
|
||||
|
||||
[1] include/linux/serial.h
|
||||
[2] Documentation/devicetree/bindings/serial/rs485.txt
|
||||
|
@ -60,8 +60,7 @@ With PAS16 you can use two audio device files at the same time. /dev/dsp (and
|
||||
|
||||
The new stuff for 2.3.99 and later
|
||||
============================================================================
|
||||
The following configuration options from Documentation/Configure.help
|
||||
are relevant to configuring the PAS16:
|
||||
The following configuration options are relevant to configuring the PAS16:
|
||||
|
||||
Sound card support
|
||||
CONFIG_SOUND
|
||||
|
@ -2,7 +2,7 @@ PXA2xx SPI on SSP driver HOWTO
|
||||
===================================================
|
||||
This a mini howto on the pxa2xx_spi driver. The driver turns a PXA2xx
|
||||
synchronous serial port into a SPI master controller
|
||||
(see Documentation/spi/spi_summary). The driver has the following features
|
||||
(see Documentation/spi/spi-summary). The driver has the following features
|
||||
|
||||
- Support for any PXA2xx SSP
|
||||
- SSP PIO and SSP DMA data transfers.
|
||||
@ -85,7 +85,7 @@ Declaring Slave Devices
|
||||
-----------------------
|
||||
Typically each SPI slave (chip) is defined in the arch/.../mach-*/board-*.c
|
||||
using the "spi_board_info" structure found in "linux/spi/spi.h". See
|
||||
"Documentation/spi/spi_summary" for additional information.
|
||||
"Documentation/spi/spi-summary" for additional information.
|
||||
|
||||
Each slave device attached to the PXA must provide slave specific configuration
|
||||
information via the structure "pxa2xx_spi_chip" found in
|
||||
|
@ -24,10 +24,10 @@ Rules on what kind of patches are accepted, and which ones are not, into the
|
||||
Procedure for submitting patches to the -stable tree:
|
||||
|
||||
- Send the patch, after verifying that it follows the above rules, to
|
||||
stable@kernel.org. You must note the upstream commit ID in the changelog
|
||||
of your submission.
|
||||
stable@vger.kernel.org. You must note the upstream commit ID in the
|
||||
changelog of your submission.
|
||||
- To have the patch automatically included in the stable tree, add the tag
|
||||
Cc: stable@kernel.org
|
||||
Cc: stable@vger.kernel.org
|
||||
in the sign-off area. Once the patch is merged it will be applied to
|
||||
the stable tree without anything else needing to be done by the author
|
||||
or subsystem maintainer.
|
||||
@ -35,10 +35,10 @@ Procedure for submitting patches to the -stable tree:
|
||||
cherry-picked than this can be specified in the following format in
|
||||
the sign-off area:
|
||||
|
||||
Cc: <stable@kernel.org> # .32.x: a1f84a3: sched: Check for idle
|
||||
Cc: <stable@kernel.org> # .32.x: 1b9508f: sched: Rate-limit newidle
|
||||
Cc: <stable@kernel.org> # .32.x: fd21073: sched: Fix affinity logic
|
||||
Cc: <stable@kernel.org> # .32.x
|
||||
Cc: <stable@vger.kernel.org> # .32.x: a1f84a3: sched: Check for idle
|
||||
Cc: <stable@vger.kernel.org> # .32.x: 1b9508f: sched: Rate-limit newidle
|
||||
Cc: <stable@vger.kernel.org> # .32.x: fd21073: sched: Fix affinity logic
|
||||
Cc: <stable@vger.kernel.org> # .32.x
|
||||
Signed-off-by: Ingo Molnar <mingo@elte.hu>
|
||||
|
||||
The tag sequence has the meaning of:
|
||||
|
@ -30,7 +30,7 @@ hrtimer base infrastructure
|
||||
---------------------------
|
||||
|
||||
The hrtimer base infrastructure was merged into the 2.6.16 kernel. Details of
|
||||
the base implementation are covered in Documentation/hrtimers/hrtimer.txt. See
|
||||
the base implementation are covered in Documentation/timers/hrtimers.txt. See
|
||||
also figure #2 (OLS slides p. 15)
|
||||
|
||||
The main differences to the timer wheel, which holds the armed timer_list type
|
||||
|
@ -7,7 +7,7 @@ API OVERVIEW
|
||||
|
||||
The big picture is that USB drivers can continue to ignore most DMA issues,
|
||||
though they still must provide DMA-ready buffers (see
|
||||
Documentation/PCI/PCI-DMA-mapping.txt). That's how they've worked through
|
||||
Documentation/DMA-API-HOWTO.txt). That's how they've worked through
|
||||
the 2.4 (and earlier) kernels.
|
||||
|
||||
OR: they can now be DMA-aware.
|
||||
@ -57,7 +57,7 @@ and effects like cache-trashing can impose subtle penalties.
|
||||
force a consistent memory access ordering by using memory barriers. It's
|
||||
not using a streaming DMA mapping, so it's good for small transfers on
|
||||
systems where the I/O would otherwise thrash an IOMMU mapping. (See
|
||||
Documentation/PCI/PCI-DMA-mapping.txt for definitions of "coherent" and
|
||||
Documentation/DMA-API-HOWTO.txt for definitions of "coherent" and
|
||||
"streaming" DMA mappings.)
|
||||
|
||||
Asking for 1/Nth of a page (as well as asking for N pages) is reasonably
|
||||
@ -88,7 +88,7 @@ WORKING WITH EXISTING BUFFERS
|
||||
Existing buffers aren't usable for DMA without first being mapped into the
|
||||
DMA address space of the device. However, most buffers passed to your
|
||||
driver can safely be used with such DMA mapping. (See the first section
|
||||
of Documentation/PCI/PCI-DMA-mapping.txt, titled "What memory is DMA-able?")
|
||||
of Documentation/DMA-API-HOWTO.txt, titled "What memory is DMA-able?")
|
||||
|
||||
- When you're using scatterlists, you can map everything at once. On some
|
||||
systems, this kicks in an IOMMU and turns the scatterlists into single
|
||||
|
45
Documentation/usb/dwc3.txt
Normal file
45
Documentation/usb/dwc3.txt
Normal file
@ -0,0 +1,45 @@
|
||||
|
||||
TODO
|
||||
~~~~~~
|
||||
Please pick something while reading :)
|
||||
|
||||
- Convert interrupt handler to per-ep-thread-irq
|
||||
|
||||
As it turns out some DWC3-commands ~1ms to complete. Currently we spin
|
||||
until the command completes which is bad.
|
||||
|
||||
Implementation idea:
|
||||
- dwc core implements a demultiplexing irq chip for interrupts per
|
||||
endpoint. The interrupt numbers are allocated during probe and belong
|
||||
to the device. If MSI provides per-endpoint interrupt this dummy
|
||||
interrupt chip can be replaced with "real" interrupts.
|
||||
- interrupts are requested / allocated on usb_ep_enable() and removed on
|
||||
usb_ep_disable(). Worst case are 32 interrupts, the lower limit is two
|
||||
for ep0/1.
|
||||
- dwc3_send_gadget_ep_cmd() will sleep in wait_for_completion_timeout()
|
||||
until the command completes.
|
||||
- the interrupt handler is split into the following pieces:
|
||||
- primary handler of the device
|
||||
goes through every event and calls generic_handle_irq() for event
|
||||
it. On return from generic_handle_irq() in acknowledges the event
|
||||
counter so interrupt goes away (eventually).
|
||||
|
||||
- threaded handler of the device
|
||||
none
|
||||
|
||||
- primary handler of the EP-interrupt
|
||||
reads the event and tries to process it. Everything that requries
|
||||
sleeping is handed over to the Thread. The event is saved in an
|
||||
per-endpoint data-structure.
|
||||
We probably have to pay attention not to process events once we
|
||||
handed something to thread so we don't process event X prio Y
|
||||
where X > Y.
|
||||
|
||||
- threaded handler of the EP-interrupt
|
||||
handles the remaining EP work which might sleep such as waiting
|
||||
for command completion.
|
||||
|
||||
Latency:
|
||||
There should be no increase in latency since the interrupt-thread has a
|
||||
high priority and will be run before an average task in user land
|
||||
(except the user changed priorities).
|
@ -439,10 +439,10 @@ cause autosuspends to fail with -EBUSY if the driver needs to use the
|
||||
device.
|
||||
|
||||
External suspend calls should never be allowed to fail in this way,
|
||||
only autosuspend calls. The driver can tell them apart by checking
|
||||
the PM_EVENT_AUTO bit in the message.event argument to the suspend
|
||||
method; this bit will be set for internal PM events (autosuspend) and
|
||||
clear for external PM events.
|
||||
only autosuspend calls. The driver can tell them apart by applying
|
||||
the PMSG_IS_AUTO() macro to the message argument to the suspend
|
||||
method; it will return True for internal PM events (autosuspend) and
|
||||
False for external PM events.
|
||||
|
||||
|
||||
Mutual exclusion
|
||||
@ -487,3 +487,29 @@ succeed, it may still remain active and thus cause the system to
|
||||
resume as soon as the system suspend is complete. Or the remote
|
||||
wakeup may fail and get lost. Which outcome occurs depends on timing
|
||||
and on the hardware and firmware design.
|
||||
|
||||
|
||||
xHCI hardware link PM
|
||||
---------------------
|
||||
|
||||
xHCI host controller provides hardware link power management to usb2.0
|
||||
(xHCI 1.0 feature) and usb3.0 devices which support link PM. By
|
||||
enabling hardware LPM, the host can automatically put the device into
|
||||
lower power state(L1 for usb2.0 devices, or U1/U2 for usb3.0 devices),
|
||||
which state device can enter and resume very quickly.
|
||||
|
||||
The user interface for controlling USB2 hardware LPM is located in the
|
||||
power/ subdirectory of each USB device's sysfs directory, that is, in
|
||||
/sys/bus/usb/devices/.../power/ where "..." is the device's ID. The
|
||||
relevant attribute files is usb2_hardware_lpm.
|
||||
|
||||
power/usb2_hardware_lpm
|
||||
|
||||
When a USB2 device which support LPM is plugged to a
|
||||
xHCI host root hub which support software LPM, the
|
||||
host will run a software LPM test for it; if the device
|
||||
enters L1 state and resume successfully and the host
|
||||
supports USB2 hardware LPM, this file will show up and
|
||||
driver will enable hardware LPM for the device. You
|
||||
can write y/Y/1 or n/N/0 to the file to enable/disable
|
||||
USB2 hardware LPM manually. This is for test purpose mainly.
|
||||
|
@ -436,7 +436,7 @@ static unsigned long load_bzimage(int fd)
|
||||
|
||||
/*
|
||||
* Go back to the start of the file and read the header. It should be
|
||||
* a Linux boot header (see Documentation/x86/i386/boot.txt)
|
||||
* a Linux boot header (see Documentation/x86/boot.txt)
|
||||
*/
|
||||
lseek(fd, 0, SEEK_SET);
|
||||
read(fd, &boot, sizeof(boot));
|
||||
|
@ -30,8 +30,6 @@ page_migration
|
||||
- description of page migration in NUMA systems.
|
||||
pagemap.txt
|
||||
- pagemap, from the userspace perspective
|
||||
slabinfo.c
|
||||
- source code for a tool to get reports about slabs.
|
||||
slub.txt
|
||||
- a short users guide for SLUB.
|
||||
unevictable-lru.txt
|
||||
|
@ -109,11 +109,11 @@ to improve NUMA locality using various CPU affinity command line interfaces,
|
||||
such as taskset(1) and numactl(1), and program interfaces such as
|
||||
sched_setaffinity(2). Further, one can modify the kernel's default local
|
||||
allocation behavior using Linux NUMA memory policy.
|
||||
[see Documentation/vm/numa_memory_policy.]
|
||||
[see Documentation/vm/numa_memory_policy.txt.]
|
||||
|
||||
System administrators can restrict the CPUs and nodes' memories that a non-
|
||||
privileged user can specify in the scheduling or NUMA commands and functions
|
||||
using control groups and CPUsets. [see Documentation/cgroups/CPUsets.txt]
|
||||
using control groups and CPUsets. [see Documentation/cgroups/cpusets.txt]
|
||||
|
||||
On architectures that do not hide memoryless nodes, Linux will include only
|
||||
zones [nodes] with memory in the zonelists. This means that for a memoryless
|
||||
|
@ -17,7 +17,7 @@ data and perform operation on the slabs. By default slabinfo only lists
|
||||
slabs that have data in them. See "slabinfo -h" for more options when
|
||||
running the command. slabinfo can be compiled with
|
||||
|
||||
gcc -o slabinfo Documentation/vm/slabinfo.c
|
||||
gcc -o slabinfo tools/slub/slabinfo.c
|
||||
|
||||
Some of the modes of operation of slabinfo require that slub debugging
|
||||
be enabled on the command line. F.e. no tracking information will be
|
||||
|
@ -1,109 +0,0 @@
|
||||
Chinese translated version of Documentation/SubmitChecklist
|
||||
|
||||
If you have any comment or update to the content, please contact the
|
||||
original document maintainer directly. However, if you have a problem
|
||||
communicating in English you can also ask the Chinese maintainer for
|
||||
help. Contact the Chinese maintainer if this translation is outdated
|
||||
or if there is a problem with the translation.
|
||||
|
||||
Chinese maintainer: Harry Wei <harryxiyou@gmail.com>
|
||||
---------------------------------------------------------------------
|
||||
Documentation/SubmitChecklist 的中文翻译
|
||||
|
||||
如果想评论或更新本文的内容,请直接联系原文档的维护者。如果你使用英文
|
||||
交流有困难的话,也可以向中文版维护者求助。如果本翻译更新不及时或者翻
|
||||
译存在问题,请联系中文版维护者。
|
||||
|
||||
中文版维护者: 贾威威 Harry Wei <harryxiyou@gmail.com>
|
||||
中文版翻译者: 贾威威 Harry Wei <harryxiyou@gmail.com>
|
||||
中文版校译者: 贾威威 Harry Wei <harryxiyou@gmail.com>
|
||||
|
||||
|
||||
以下为正文
|
||||
---------------------------------------------------------------------
|
||||
Linux内核提交清单
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
这里有一些内核开发者应该做的基本事情,如果他们想看到自己的内核补丁提交
|
||||
被接受的更快。
|
||||
|
||||
这些都是超出Documentation/SubmittingPatches文档里所提供的以及其他
|
||||
关于提交Linux内核补丁的说明。
|
||||
|
||||
1:如果你使用了一个功能那么就#include定义/声明那个功能的那个文件。
|
||||
不要依靠其他间接引入定义/声明那个功能的头文件。
|
||||
|
||||
2:构建简洁适用或者更改CONFIG选项 =y,=m,或者=n。
|
||||
不要有编译警告/错误, 不要有链接警告/错误。
|
||||
|
||||
2b:通过 allnoconfig, allmodconfig
|
||||
|
||||
2c:当使用 0=builddir 成功地构建
|
||||
|
||||
3:通过使用本地交叉编译工具或者其他一些构建产所,在多CPU框架上构建。
|
||||
|
||||
4:ppc64 是一个很好的检查交叉编译的框架,因为它往往把‘unsigned long’
|
||||
当64位值来使用。
|
||||
|
||||
5:按照Documentation/CodingStyle文件里的详细描述,检查你补丁的整体风格。
|
||||
使用补丁风格检查琐碎的违规(scripts/checkpatch.pl),审核员优先提交。
|
||||
你应该调整遗留在你补丁中的所有违规。
|
||||
|
||||
6:任何更新或者改动CONFIG选项都不能打乱配置菜单。
|
||||
|
||||
7:所有的Kconfig选项更新都要有说明文字。
|
||||
|
||||
8:已经认真地总结了相关的Kconfig组合。这是很难通过测试做好的--脑力在这里下降。
|
||||
|
||||
9:检查具有简洁性。
|
||||
|
||||
10:使用'make checkstack'和'make namespacecheck'检查,然后修改所找到的问题。
|
||||
注意:堆栈检查不会明确地出现问题,但是任何的一个函数在堆栈上使用多于512字节
|
||||
都要准备修改。
|
||||
|
||||
11:包含kernel-doc到全局内核APIs文件。(不要求静态的函数,但是包含也无所谓。)
|
||||
使用'make htmldocs'或者'make mandocs'来检查kernel-doc,然后修改任何
|
||||
发现的问题。
|
||||
|
||||
12:已经通过CONFIG_PREEMPT, CONFIG_DEBUG_PREEMPT,
|
||||
CONFIG_DEBUG_SLAB, CONFIG_DEBUG_PAGEALLOC, CONFIG_DEBUG_MUTEXES,
|
||||
CONFIG_DEBUG_SPINLOCK, CONFIG_DEBUG_ATOMIC_SLEEP测试,并且同时都
|
||||
使能。
|
||||
|
||||
13:已经都构建并且使用或者不使用 CONFIG_SMP 和 CONFIG_PREEMPT测试执行时间。
|
||||
|
||||
14:如果补丁影响IO/Disk,等等:已经通过使用或者不使用 CONFIG_LBDAF 测试。
|
||||
|
||||
15:所有的codepaths已经行使所有lockdep启用功能。
|
||||
|
||||
16:所有的/proc记录更新都要作成文件放在Documentation/目录下。
|
||||
|
||||
17:所有的内核启动参数更新都被记录到Documentation/kernel-parameters.txt文件中。
|
||||
|
||||
18:所有的模块参数更新都用MODULE_PARM_DESC()记录。
|
||||
|
||||
19:所有的用户空间接口更新都被记录到Documentation/ABI/。查看Documentation/ABI/README
|
||||
可以获得更多的信息。改变用户空间接口的补丁应该被邮件抄送给linux-api@vger.kernel.org。
|
||||
|
||||
20:检查它是不是都通过`make headers_check'。
|
||||
|
||||
21:已经通过至少引入slab和page-allocation失败检查。查看Documentation/fault-injection/。
|
||||
|
||||
22:新加入的源码已经通过`gcc -W'(使用"make EXTRA_CFLAGS=-W")编译。这样将产生很多烦恼,
|
||||
但是对于寻找漏洞很有益处,例如:"warning: comparison between signed and unsigned"。
|
||||
|
||||
23:当它被合并到-mm补丁集后再测试,用来确定它是否还和补丁队列中的其他补丁一起工作以及在VM,VFS
|
||||
和其他子系统中各个变化。
|
||||
|
||||
24:所有的内存屏障{e.g., barrier(), rmb(), wmb()}需要在源代码中的一个注释来解释他们都是干什么的
|
||||
以及原因。
|
||||
|
||||
25:如果有任何输入输出控制的补丁被添加,也要更新Documentation/ioctl/ioctl-number.txt。
|
||||
|
||||
26:如果你的更改代码依靠或者使用任何的内核APIs或者与下面的kconfig符号有关系的功能,你就要
|
||||
使用相关的kconfig符号关闭, and/or =m(如果选项提供)[在同一时间不是所用的都启用,仅仅各个或者自由
|
||||
组合他们]:
|
||||
|
||||
CONFIG_SMP, CONFIG_SYSFS, CONFIG_PROC_FS, CONFIG_INPUT, CONFIG_PCI,
|
||||
CONFIG_BLOCK, CONFIG_PM, CONFIG_HOTPLUG, CONFIG_MAGIC_SYSRQ,
|
||||
CONFIG_NET, CONFIG_INET=n (后一个使用 CONFIG_NET=y)
|
66
MAINTAINERS
66
MAINTAINERS
@ -2144,6 +2144,14 @@ M: Matthew Garrett <mjg59@srcf.ucam.org>
|
||||
S: Maintained
|
||||
F: drivers/platform/x86/dell-wmi.c
|
||||
|
||||
DESIGNWARE USB3 DRD IP DRIVER
|
||||
M: Felipe Balbi <balbi@ti.com>
|
||||
L: linux-usb@vger.kernel.org
|
||||
L: linux-omap@vger.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git
|
||||
S: Maintained
|
||||
F: drivers/usb/dwc3/
|
||||
|
||||
DEVICE NUMBER REGISTRY
|
||||
M: Torben Mathiasen <device@lanana.org>
|
||||
W: http://lanana.org/docs/device-list/index.html
|
||||
@ -2302,6 +2310,12 @@ L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/net/wan/dscc4.c
|
||||
|
||||
DYNAMIC DEBUG
|
||||
M: Jason Baron <jbaron@redhat.com>
|
||||
S: Maintained
|
||||
F: lib/dynamic_debug.c
|
||||
F: include/linux/dynamic_debug.h
|
||||
|
||||
DZ DECSTATION DZ11 SERIAL DRIVER
|
||||
M: "Maciej W. Rozycki" <macro@linux-mips.org>
|
||||
S: Maintained
|
||||
@ -2560,6 +2574,11 @@ S: Maintained
|
||||
F: Documentation/filesystems/ext4.txt
|
||||
F: fs/ext4/
|
||||
|
||||
Extended Verification Module (EVM)
|
||||
M: Mimi Zohar <zohar@us.ibm.com>
|
||||
S: Supported
|
||||
F: security/integrity/evm/
|
||||
|
||||
F71805F HARDWARE MONITORING DRIVER
|
||||
M: Jean Delvare <khali@linux-fr.org>
|
||||
L: lm-sensors@lm-sensors.org
|
||||
@ -2741,7 +2760,7 @@ F: fs/freevxfs/
|
||||
FREEZER
|
||||
M: Pavel Machek <pavel@ucw.cz>
|
||||
M: "Rafael J. Wysocki" <rjw@sisk.pl>
|
||||
L: linux-pm@lists.linux-foundation.org
|
||||
L: linux-pm@vger.kernel.org
|
||||
S: Supported
|
||||
F: Documentation/power/freezing-of-tasks.txt
|
||||
F: include/linux/freezer.h
|
||||
@ -3003,7 +3022,7 @@ F: drivers/video/hgafb.c
|
||||
HIBERNATION (aka Software Suspend, aka swsusp)
|
||||
M: Pavel Machek <pavel@ucw.cz>
|
||||
M: "Rafael J. Wysocki" <rjw@sisk.pl>
|
||||
L: linux-pm@lists.linux-foundation.org
|
||||
L: linux-pm@vger.kernel.org
|
||||
S: Supported
|
||||
F: arch/x86/power/
|
||||
F: drivers/base/power/
|
||||
@ -3198,7 +3217,7 @@ F: drivers/ide/ide-cd*
|
||||
|
||||
IDLE-I7300
|
||||
M: Andy Henroid <andrew.d.henroid@intel.com>
|
||||
L: linux-pm@lists.linux-foundation.org
|
||||
L: linux-pm@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/idle/i7300_idle.c
|
||||
|
||||
@ -3281,7 +3300,7 @@ F: firmware/isci/
|
||||
|
||||
INTEL IDLE DRIVER
|
||||
M: Len Brown <lenb@kernel.org>
|
||||
L: linux-pm@lists.linux-foundation.org
|
||||
L: linux-pm@vger.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-idle-2.6.git
|
||||
S: Supported
|
||||
F: drivers/idle/intel_idle.c
|
||||
@ -3322,7 +3341,7 @@ M: David Woodhouse <dwmw2@infradead.org>
|
||||
L: iommu@lists.linux-foundation.org
|
||||
T: git git://git.infradead.org/iommu-2.6.git
|
||||
S: Supported
|
||||
F: drivers/pci/intel-iommu.c
|
||||
F: drivers/iommu/intel-iommu.c
|
||||
F: include/linux/intel-iommu.h
|
||||
|
||||
INTEL IOP-ADMA DMA DRIVER
|
||||
@ -3378,7 +3397,7 @@ F: drivers/net/ethernet/intel/
|
||||
|
||||
INTEL MRST PMU DRIVER
|
||||
M: Len Brown <len.brown@intel.com>
|
||||
L: linux-pm@lists.linux-foundation.org
|
||||
L: linux-pm@vger.kernel.org
|
||||
S: Supported
|
||||
F: arch/x86/platform/mrst/pmu.*
|
||||
|
||||
@ -4069,7 +4088,7 @@ S: Maintained
|
||||
|
||||
M32R ARCHITECTURE
|
||||
M: Hirokazu Takata <takata@linux-m32r.org>
|
||||
L: linux-m32r@ml.linux-m32r.org
|
||||
L: linux-m32r@ml.linux-m32r.org (moderated for non-subscribers)
|
||||
L: linux-m32r-ja@ml.linux-m32r.org (in Japanese)
|
||||
W: http://www.linux-m32r.org/
|
||||
S: Maintained
|
||||
@ -4238,7 +4257,7 @@ F: include/mtd/
|
||||
|
||||
MICROBLAZE ARCHITECTURE
|
||||
M: Michal Simek <monstr@monstr.eu>
|
||||
L: microblaze-uclinux@itee.uq.edu.au
|
||||
L: microblaze-uclinux@itee.uq.edu.au (moderated for non-subscribers)
|
||||
W: http://www.monstr.eu/fdt/
|
||||
T: git git://git.monstr.eu/linux-2.6-microblaze.git
|
||||
S: Supported
|
||||
@ -4753,7 +4772,7 @@ K: of_match_table
|
||||
OPENRISC ARCHITECTURE
|
||||
M: Jonas Bonn <jonas@southpole.se>
|
||||
W: http://openrisc.net
|
||||
L: linux@lists.openrisc.net
|
||||
L: linux@lists.openrisc.net (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
T: git git://openrisc.net/~jonas/linux
|
||||
F: arch/openrisc
|
||||
@ -5023,6 +5042,11 @@ L: linux-mtd@lists.infradead.org
|
||||
S: Maintained
|
||||
F: drivers/mtd/devices/phram.c
|
||||
|
||||
PIN CONTROL SUBSYSTEM
|
||||
M: Linus Walleij <linus.walleij@linaro.org>
|
||||
S: Maintained
|
||||
F: drivers/pinmux/
|
||||
|
||||
PKTCDVD DRIVER
|
||||
M: Peter Osterlund <petero2@telia.com>
|
||||
S: Maintained
|
||||
@ -6147,7 +6171,7 @@ S: Maintained
|
||||
|
||||
STAGING SUBSYSTEM
|
||||
M: Greg Kroah-Hartman <gregkh@suse.de>
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging-2.6.git
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git
|
||||
L: devel@driverdev.osuosl.org
|
||||
S: Maintained
|
||||
F: drivers/staging/
|
||||
@ -6188,6 +6212,11 @@ M: David Rowe <david@rowetel.com>
|
||||
S: Odd Fixes
|
||||
F: drivers/staging/echo/
|
||||
|
||||
STAGING - ET131X NETWORK DRIVER
|
||||
M: Mark Einon <mark.einon@gmail.com>
|
||||
S: Odd Fixes
|
||||
F: drivers/staging/et131x/
|
||||
|
||||
STAGING - FLARION FT1000 DRIVERS
|
||||
M: Marek Belisko <marek.belisko@gmail.com>
|
||||
S: Odd Fixes
|
||||
@ -6216,6 +6245,13 @@ W: http://www.lirc.org/
|
||||
S: Odd Fixes
|
||||
F: drivers/staging/lirc/
|
||||
|
||||
STAGING - NVIDIA COMPLIANT EMBEDDED CONTROLLER INTERFACE (nvec)
|
||||
M: Julian Andres Klode <jak@jak-linux.org>
|
||||
M: Marc Dietrich <marvin24@gmx.de>
|
||||
L: ac100@lists.launchpad.net (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
F: drivers/staging/nvec/
|
||||
|
||||
STAGING - OLPC SECONDARY DISPLAY CONTROLLER (DCON)
|
||||
M: Andres Salomon <dilinger@queued.net>
|
||||
M: Chris Ball <cjb@laptop.org>
|
||||
@ -6314,7 +6350,7 @@ SUSPEND TO RAM
|
||||
M: Len Brown <len.brown@intel.com>
|
||||
M: Pavel Machek <pavel@ucw.cz>
|
||||
M: "Rafael J. Wysocki" <rjw@sisk.pl>
|
||||
L: linux-pm@lists.linux-foundation.org
|
||||
L: linux-pm@vger.kernel.org
|
||||
S: Supported
|
||||
F: Documentation/power/
|
||||
F: arch/x86/kernel/acpi/
|
||||
@ -6455,7 +6491,7 @@ L: tomoyo-users-en@lists.sourceforge.jp (subscribers-only, for users in English)
|
||||
L: tomoyo-dev@lists.sourceforge.jp (subscribers-only, for developers in Japanese)
|
||||
L: tomoyo-users@lists.sourceforge.jp (subscribers-only, for users in Japanese)
|
||||
W: http://tomoyo.sourceforge.jp/
|
||||
T: quilt http://svn.sourceforge.jp/svnroot/tomoyo/trunk/2.4.x/tomoyo-lsm/patches/
|
||||
T: quilt http://svn.sourceforge.jp/svnroot/tomoyo/trunk/2.5.x/tomoyo-lsm/patches/
|
||||
S: Maintained
|
||||
F: security/tomoyo/
|
||||
|
||||
@ -7150,6 +7186,12 @@ L: linux-scsi@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/scsi/wd7000.c
|
||||
|
||||
WIIMOTE HID DRIVER
|
||||
M: David Herrmann <dh.herrmann@googlemail.com>
|
||||
L: linux-input@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/hid/hid-wiimote*
|
||||
|
||||
WINBOND CIR DRIVER
|
||||
M: David Härdeman <david@hardeman.nu>
|
||||
S: Maintained
|
||||
|
2
Makefile
2
Makefile
@ -1,7 +1,7 @@
|
||||
VERSION = 3
|
||||
PATCHLEVEL = 1
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc10
|
||||
EXTRAVERSION =
|
||||
NAME = "Divemaster Edition"
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
@ -51,8 +51,6 @@
|
||||
#define F_EXLCK 16 /* or 3 */
|
||||
#define F_SHLCK 32 /* or 4 */
|
||||
|
||||
#define F_INPROGRESS 64
|
||||
|
||||
#include <asm-generic/fcntl.h>
|
||||
|
||||
#endif
|
||||
|
@ -4,9 +4,8 @@
|
||||
*
|
||||
* (C) 2001,2002,2006 by Jan-Benedict Glaw <jbglaw@lug-owl.de>
|
||||
*
|
||||
* This driver is at all a modified version of Erik Mouw's
|
||||
* Documentation/DocBook/procfs_example.c, so: thank
|
||||
* you, Erik! He can be reached via email at
|
||||
* This driver is a modified version of Erik Mouw's example proc
|
||||
* interface, so: thank you, Erik! He can be reached via email at
|
||||
* <J.A.K.Mouw@its.tudelft.nl>. It is based on an idea
|
||||
* provided by DEC^WCompaq^WIntel's "Jumpstart" CD. They
|
||||
* included a patch like this as well. Thanks for idea!
|
||||
|
@ -3,7 +3,7 @@ config ARM
|
||||
default y
|
||||
select HAVE_AOUT
|
||||
select HAVE_DMA_API_DEBUG
|
||||
select HAVE_IDE
|
||||
select HAVE_IDE if PCI || ISA || PCMCIA
|
||||
select HAVE_MEMBLOCK
|
||||
select RTC_LIB
|
||||
select SYS_SUPPORTS_APM_EMULATION
|
||||
@ -195,7 +195,8 @@ config VECTORS_BASE
|
||||
The base address of exception vectors.
|
||||
|
||||
config ARM_PATCH_PHYS_VIRT
|
||||
bool "Patch physical to virtual translations at runtime"
|
||||
bool "Patch physical to virtual translations at runtime" if EMBEDDED
|
||||
default y
|
||||
depends on !XIP_KERNEL && MMU
|
||||
depends on !ARCH_REALVIEW || !SPARSEMEM
|
||||
help
|
||||
@ -204,16 +205,16 @@ config ARM_PATCH_PHYS_VIRT
|
||||
kernel in system memory.
|
||||
|
||||
This can only be used with non-XIP MMU kernels where the base
|
||||
of physical memory is at a 16MB boundary, or theoretically 64K
|
||||
for the MSM machine class.
|
||||
of physical memory is at a 16MB boundary.
|
||||
|
||||
config ARM_PATCH_PHYS_VIRT_16BIT
|
||||
Only disable this option if you know that you do not require
|
||||
this feature (eg, building a kernel for a single machine) and
|
||||
you need to shrink the kernel to the minimal size.
|
||||
|
||||
|
||||
config GENERIC_BUG
|
||||
def_bool y
|
||||
depends on ARM_PATCH_PHYS_VIRT && ARCH_MSM
|
||||
help
|
||||
This option extends the physical to virtual translation patching
|
||||
to allow physical memory down to a theoretical minimum of 64K
|
||||
boundaries.
|
||||
depends on BUG
|
||||
|
||||
source "init/Kconfig"
|
||||
|
||||
@ -301,7 +302,6 @@ config ARCH_AT91
|
||||
select ARCH_REQUIRE_GPIOLIB
|
||||
select HAVE_CLK
|
||||
select CLKDEV_LOOKUP
|
||||
select ARM_PATCH_PHYS_VIRT if MMU
|
||||
help
|
||||
This enables support for systems based on the Atmel AT91RM9200,
|
||||
AT91SAM9 and AT91CAP9 processors.
|
||||
@ -346,7 +346,6 @@ config ARCH_GEMINI
|
||||
config ARCH_PRIMA2
|
||||
bool "CSR SiRFSoC PRIMA2 ARM Cortex A9 Platform"
|
||||
select CPU_V7
|
||||
select GENERIC_TIME
|
||||
select NO_IOPORT
|
||||
select GENERIC_CLOCKEVENTS
|
||||
select CLKDEV_LOOKUP
|
||||
@ -385,6 +384,7 @@ config ARCH_FOOTBRIDGE
|
||||
select CPU_SA110
|
||||
select FOOTBRIDGE
|
||||
select GENERIC_CLOCKEVENTS
|
||||
select HAVE_IDE
|
||||
help
|
||||
Support for systems based on the DC21285 companion chip
|
||||
("FootBridge"), such as the Simtec CATS and the Rebel NetWinder.
|
||||
@ -519,7 +519,6 @@ config ARCH_LPC32XX
|
||||
select ARM_AMBA
|
||||
select USB_ARCH_HAS_OHCI
|
||||
select CLKDEV_LOOKUP
|
||||
select GENERIC_TIME
|
||||
select GENERIC_CLOCKEVENTS
|
||||
help
|
||||
Support for the NXP LPC32XX family of processors
|
||||
@ -598,7 +597,6 @@ config ARCH_TEGRA
|
||||
bool "NVIDIA Tegra"
|
||||
select CLKDEV_LOOKUP
|
||||
select CLKSRC_MMIO
|
||||
select GENERIC_TIME
|
||||
select GENERIC_CLOCKEVENTS
|
||||
select GENERIC_GPIO
|
||||
select HAVE_CLK
|
||||
@ -631,6 +629,8 @@ config ARCH_PXA
|
||||
select SPARSE_IRQ
|
||||
select AUTO_ZRELADDR
|
||||
select MULTI_IRQ_HANDLER
|
||||
select ARM_CPU_SUSPEND if PM
|
||||
select HAVE_IDE
|
||||
help
|
||||
Support for Intel/Marvell's PXA2xx/PXA3xx processor line.
|
||||
|
||||
@ -671,6 +671,7 @@ config ARCH_RPC
|
||||
select NO_IOPORT
|
||||
select ARCH_SPARSEMEM_ENABLE
|
||||
select ARCH_USES_GETTIMEOFFSET
|
||||
select HAVE_IDE
|
||||
help
|
||||
On the Acorn Risc-PC, Linux can support the internal IDE disk and
|
||||
CD-ROM interface, serial and parallel port, and the floppy drive.
|
||||
@ -689,6 +690,7 @@ config ARCH_SA1100
|
||||
select HAVE_SCHED_CLOCK
|
||||
select TICK_ONESHOT
|
||||
select ARCH_REQUIRE_GPIOLIB
|
||||
select HAVE_IDE
|
||||
help
|
||||
Support for StrongARM 11x0 based boards.
|
||||
|
||||
@ -722,7 +724,6 @@ config ARCH_S3C64XX
|
||||
select ARCH_REQUIRE_GPIOLIB
|
||||
select SAMSUNG_CLKSRC
|
||||
select SAMSUNG_IRQ_VIC_TIMER
|
||||
select SAMSUNG_IRQ_UART
|
||||
select S3C_GPIO_TRACK
|
||||
select S3C_GPIO_PULL_UPDOWN
|
||||
select S3C_GPIO_CFG_S3C24XX
|
||||
@ -910,7 +911,6 @@ config ARCH_VT8500
|
||||
config ARCH_ZYNQ
|
||||
bool "Xilinx Zynq ARM Cortex A9 Platform"
|
||||
select CPU_V7
|
||||
select GENERIC_TIME
|
||||
select GENERIC_CLOCKEVENTS
|
||||
select CLKDEV_LOOKUP
|
||||
select ARM_GIC
|
||||
@ -1375,6 +1375,7 @@ config SMP
|
||||
MACH_REALVIEW_PB11MP || MACH_REALVIEW_PBX || ARCH_OMAP4 || \
|
||||
ARCH_EXYNOS4 || ARCH_TEGRA || ARCH_U8500 || ARCH_VEXPRESS_CA9X4 || \
|
||||
ARCH_MSM_SCORPIONMP || ARCH_SHMOBILE
|
||||
depends on MMU
|
||||
select USE_GENERIC_SMP_HELPERS
|
||||
select HAVE_ARM_SCU if !ARCH_MSM_SCORPIONMP
|
||||
help
|
||||
@ -1388,7 +1389,7 @@ config SMP
|
||||
processor machines. On a single processor machine, the kernel will
|
||||
run faster if you say N here.
|
||||
|
||||
See also <file:Documentation/i386/IO-APIC.txt>,
|
||||
See also <file:Documentation/x86/i386/IO-APIC.txt>,
|
||||
<file:Documentation/nmi_watchdog.txt> and the SMP-HOWTO available at
|
||||
<http://tldp.org/HOWTO/SMP-HOWTO.html>.
|
||||
|
||||
@ -1407,6 +1408,31 @@ config SMP_ON_UP
|
||||
|
||||
If you don't know what to do here, say Y.
|
||||
|
||||
config ARM_CPU_TOPOLOGY
|
||||
bool "Support cpu topology definition"
|
||||
depends on SMP && CPU_V7
|
||||
default y
|
||||
help
|
||||
Support ARM cpu topology definition. The MPIDR register defines
|
||||
affinity between processors which is then used to describe the cpu
|
||||
topology of an ARM System.
|
||||
|
||||
config SCHED_MC
|
||||
bool "Multi-core scheduler support"
|
||||
depends on ARM_CPU_TOPOLOGY
|
||||
help
|
||||
Multi-core scheduler support improves the CPU scheduler's decision
|
||||
making when dealing with multi-core CPU chips at a cost of slightly
|
||||
increased overhead in some places. If unsure say N here.
|
||||
|
||||
config SCHED_SMT
|
||||
bool "SMT scheduler support"
|
||||
depends on ARM_CPU_TOPOLOGY
|
||||
help
|
||||
Improves the CPU scheduler's decision making when dealing with
|
||||
MultiThreading at a cost of slightly increased overhead in some
|
||||
places. If unsure say N here.
|
||||
|
||||
config HAVE_ARM_SCU
|
||||
bool
|
||||
help
|
||||
@ -1482,6 +1508,7 @@ config THUMB2_KERNEL
|
||||
depends on CPU_V7 && !CPU_V6 && !CPU_V6K && EXPERIMENTAL
|
||||
select AEABI
|
||||
select ARM_ASM_UNIFIED
|
||||
select ARM_UNWIND
|
||||
help
|
||||
By enabling this option, the kernel will be compiled in
|
||||
Thumb-2 mode. A compiler/assembler that understand the unified
|
||||
@ -2101,6 +2128,9 @@ config ARCH_SUSPEND_POSSIBLE
|
||||
CPU_V6 || CPU_V6K || CPU_V7 || CPU_XSC3 || CPU_XSCALE
|
||||
def_bool y
|
||||
|
||||
config ARM_CPU_SUSPEND
|
||||
def_bool PM_SLEEP
|
||||
|
||||
endmenu
|
||||
|
||||
source "net/Kconfig"
|
||||
|
@ -65,13 +65,71 @@ config DEBUG_USER
|
||||
|
||||
# These options are only for real kernel hackers who want to get their hands dirty.
|
||||
config DEBUG_LL
|
||||
bool "Kernel low-level debugging functions"
|
||||
bool "Kernel low-level debugging functions (read help!)"
|
||||
depends on DEBUG_KERNEL
|
||||
help
|
||||
Say Y here to include definitions of printascii, printch, printhex
|
||||
in the kernel. This is helpful if you are debugging code that
|
||||
executes before the console is initialized.
|
||||
|
||||
Note that selecting this option will limit the kernel to a single
|
||||
UART definition, as specified below. Attempting to boot the kernel
|
||||
image on a different platform *will not work*, so this option should
|
||||
not be enabled for kernels that are intended to be portable.
|
||||
|
||||
choice
|
||||
prompt "Kernel low-level debugging port"
|
||||
depends on DEBUG_LL
|
||||
|
||||
config DEBUG_LL_UART_NONE
|
||||
bool "No low-level debugging UART"
|
||||
help
|
||||
Say Y here if your platform doesn't provide a UART option
|
||||
below. This relies on your platform choosing the right UART
|
||||
definition internally in order for low-level debugging to
|
||||
work.
|
||||
|
||||
config DEBUG_ICEDCC
|
||||
bool "Kernel low-level debugging via EmbeddedICE DCC channel"
|
||||
help
|
||||
Say Y here if you want the debug print routines to direct
|
||||
their output to the EmbeddedICE macrocell's DCC channel using
|
||||
co-processor 14. This is known to work on the ARM9 style ICE
|
||||
channel and on the XScale with the PEEDI.
|
||||
|
||||
Note that the system will appear to hang during boot if there
|
||||
is nothing connected to read from the DCC.
|
||||
|
||||
config DEBUG_FOOTBRIDGE_COM1
|
||||
bool "Kernel low-level debugging messages via footbridge 8250 at PCI COM1"
|
||||
depends on FOOTBRIDGE
|
||||
help
|
||||
Say Y here if you want the debug print routines to direct
|
||||
their output to the 8250 at PCI COM1.
|
||||
|
||||
config DEBUG_DC21285_PORT
|
||||
bool "Kernel low-level debugging messages via footbridge serial port"
|
||||
depends on FOOTBRIDGE
|
||||
help
|
||||
Say Y here if you want the debug print routines to direct
|
||||
their output to the serial port in the DC21285 (Footbridge).
|
||||
|
||||
config DEBUG_CLPS711X_UART1
|
||||
bool "Kernel low-level debugging messages via UART1"
|
||||
depends on ARCH_CLPS711X
|
||||
help
|
||||
Say Y here if you want the debug print routines to direct
|
||||
their output to the first serial port on these devices.
|
||||
|
||||
config DEBUG_CLPS711X_UART2
|
||||
bool "Kernel low-level debugging messages via UART2"
|
||||
depends on ARCH_CLPS711X
|
||||
help
|
||||
Say Y here if you want the debug print routines to direct
|
||||
their output to the second serial port on these devices.
|
||||
|
||||
endchoice
|
||||
|
||||
config EARLY_PRINTK
|
||||
bool "Early printk"
|
||||
depends on DEBUG_LL
|
||||
@ -80,43 +138,14 @@ config EARLY_PRINTK
|
||||
kernel low-level debugging functions. Add earlyprintk to your
|
||||
kernel parameters to enable this console.
|
||||
|
||||
config DEBUG_ICEDCC
|
||||
bool "Kernel low-level debugging via EmbeddedICE DCC channel"
|
||||
depends on DEBUG_LL
|
||||
help
|
||||
Say Y here if you want the debug print routines to direct their
|
||||
output to the EmbeddedICE macrocell's DCC channel using
|
||||
co-processor 14. This is known to work on the ARM9 style ICE
|
||||
channel and on the XScale with the PEEDI.
|
||||
|
||||
It does include a timeout to ensure that the system does not
|
||||
totally freeze when there is nothing connected to read.
|
||||
|
||||
config OC_ETM
|
||||
bool "On-chip ETM and ETB"
|
||||
select ARM_AMBA
|
||||
depends on ARM_AMBA
|
||||
help
|
||||
Enables the on-chip embedded trace macrocell and embedded trace
|
||||
buffer driver that will allow you to collect traces of the
|
||||
kernel code.
|
||||
|
||||
config DEBUG_DC21285_PORT
|
||||
bool "Kernel low-level debugging messages via footbridge serial port"
|
||||
depends on DEBUG_LL && FOOTBRIDGE
|
||||
help
|
||||
Say Y here if you want the debug print routines to direct their
|
||||
output to the serial port in the DC21285 (Footbridge). Saying N
|
||||
will cause the debug messages to appear on the first 16550
|
||||
serial port.
|
||||
|
||||
config DEBUG_CLPS711X_UART2
|
||||
bool "Kernel low-level debugging messages via UART2"
|
||||
depends on DEBUG_LL && ARCH_CLPS711X
|
||||
help
|
||||
Say Y here if you want the debug print routines to direct their
|
||||
output to the second serial port on these devices. Saying N will
|
||||
cause the debug messages to appear on the first serial port.
|
||||
|
||||
config DEBUG_S3C_UART
|
||||
depends on PLAT_SAMSUNG
|
||||
int "S3C UART to use for low-level debug"
|
||||
|
@ -128,6 +128,9 @@ textofs-$(CONFIG_PM_H1940) := 0x00108000
|
||||
ifeq ($(CONFIG_ARCH_SA1100),y)
|
||||
textofs-$(CONFIG_SA1111) := 0x00208000
|
||||
endif
|
||||
textofs-$(CONFIG_ARCH_MSM7X30) := 0x00208000
|
||||
textofs-$(CONFIG_ARCH_MSM8X60) := 0x00208000
|
||||
textofs-$(CONFIG_ARCH_MSM8960) := 0x00208000
|
||||
|
||||
# Machine directory name. This list is sorted alphanumerically
|
||||
# by CONFIG_* macro name.
|
||||
|
@ -78,7 +78,16 @@ endif
|
||||
|
||||
$(obj)/uImage: STARTADDR=$(LOADADDR)
|
||||
|
||||
check_for_multiple_loadaddr = \
|
||||
if [ $(words $(LOADADDR)) -gt 1 ]; then \
|
||||
echo 'multiple load addresses: $(LOADADDR)'; \
|
||||
echo 'This is incompatible with uImages'; \
|
||||
echo 'Specify LOADADDR on the commandline to build an uImage'; \
|
||||
false; \
|
||||
fi
|
||||
|
||||
$(obj)/uImage: $(obj)/zImage FORCE
|
||||
@$(check_for_multiple_loadaddr)
|
||||
$(call if_changed,uimage)
|
||||
@echo ' Image $@ is ready'
|
||||
|
||||
|
@ -139,8 +139,16 @@ bad_syms=$$($(CROSS_COMPILE)nm $@ | sed -n 's/^.\{8\} [bc] \(.*\)/\1/p') && \
|
||||
( echo "following symbols must have non local/private scope:" >&2; \
|
||||
echo "$$bad_syms" >&2; rm -f $@; false )
|
||||
|
||||
check_for_multiple_zreladdr = \
|
||||
if [ $(words $(ZRELADDR)) -gt 1 -a "$(CONFIG_AUTO_ZRELADDR)" = "" ]; then \
|
||||
echo 'multiple zreladdrs: $(ZRELADDR)'; \
|
||||
echo 'This needs CONFIG_AUTO_ZRELADDR to be set'; \
|
||||
false; \
|
||||
fi
|
||||
|
||||
$(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/$(HEAD) $(obj)/piggy.$(suffix_y).o \
|
||||
$(addprefix $(obj)/, $(OBJS)) $(lib1funcs) FORCE
|
||||
@$(check_for_multiple_zreladdr)
|
||||
$(call if_changed,ld)
|
||||
@$(check_for_bad_syms)
|
||||
|
||||
|
@ -33,7 +33,7 @@
|
||||
#include <asm/mach/irq.h>
|
||||
#include <asm/hardware/gic.h>
|
||||
|
||||
static DEFINE_SPINLOCK(irq_controller_lock);
|
||||
static DEFINE_RAW_SPINLOCK(irq_controller_lock);
|
||||
|
||||
/* Address of GIC 0 CPU interface */
|
||||
void __iomem *gic_cpu_base_addr __read_mostly;
|
||||
@ -82,30 +82,30 @@ static void gic_mask_irq(struct irq_data *d)
|
||||
{
|
||||
u32 mask = 1 << (d->irq % 32);
|
||||
|
||||
spin_lock(&irq_controller_lock);
|
||||
raw_spin_lock(&irq_controller_lock);
|
||||
writel_relaxed(mask, gic_dist_base(d) + GIC_DIST_ENABLE_CLEAR + (gic_irq(d) / 32) * 4);
|
||||
if (gic_arch_extn.irq_mask)
|
||||
gic_arch_extn.irq_mask(d);
|
||||
spin_unlock(&irq_controller_lock);
|
||||
raw_spin_unlock(&irq_controller_lock);
|
||||
}
|
||||
|
||||
static void gic_unmask_irq(struct irq_data *d)
|
||||
{
|
||||
u32 mask = 1 << (d->irq % 32);
|
||||
|
||||
spin_lock(&irq_controller_lock);
|
||||
raw_spin_lock(&irq_controller_lock);
|
||||
if (gic_arch_extn.irq_unmask)
|
||||
gic_arch_extn.irq_unmask(d);
|
||||
writel_relaxed(mask, gic_dist_base(d) + GIC_DIST_ENABLE_SET + (gic_irq(d) / 32) * 4);
|
||||
spin_unlock(&irq_controller_lock);
|
||||
raw_spin_unlock(&irq_controller_lock);
|
||||
}
|
||||
|
||||
static void gic_eoi_irq(struct irq_data *d)
|
||||
{
|
||||
if (gic_arch_extn.irq_eoi) {
|
||||
spin_lock(&irq_controller_lock);
|
||||
raw_spin_lock(&irq_controller_lock);
|
||||
gic_arch_extn.irq_eoi(d);
|
||||
spin_unlock(&irq_controller_lock);
|
||||
raw_spin_unlock(&irq_controller_lock);
|
||||
}
|
||||
|
||||
writel_relaxed(gic_irq(d), gic_cpu_base(d) + GIC_CPU_EOI);
|
||||
@ -129,7 +129,7 @@ static int gic_set_type(struct irq_data *d, unsigned int type)
|
||||
if (type != IRQ_TYPE_LEVEL_HIGH && type != IRQ_TYPE_EDGE_RISING)
|
||||
return -EINVAL;
|
||||
|
||||
spin_lock(&irq_controller_lock);
|
||||
raw_spin_lock(&irq_controller_lock);
|
||||
|
||||
if (gic_arch_extn.irq_set_type)
|
||||
gic_arch_extn.irq_set_type(d, type);
|
||||
@ -154,7 +154,7 @@ static int gic_set_type(struct irq_data *d, unsigned int type)
|
||||
if (enabled)
|
||||
writel_relaxed(enablemask, base + GIC_DIST_ENABLE_SET + enableoff);
|
||||
|
||||
spin_unlock(&irq_controller_lock);
|
||||
raw_spin_unlock(&irq_controller_lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -180,12 +180,12 @@ static int gic_set_affinity(struct irq_data *d, const struct cpumask *mask_val,
|
||||
return -EINVAL;
|
||||
|
||||
mask = 0xff << shift;
|
||||
bit = 1 << (cpu + shift);
|
||||
bit = 1 << (cpu_logical_map(cpu) + shift);
|
||||
|
||||
spin_lock(&irq_controller_lock);
|
||||
raw_spin_lock(&irq_controller_lock);
|
||||
val = readl_relaxed(reg) & ~mask;
|
||||
writel_relaxed(val | bit, reg);
|
||||
spin_unlock(&irq_controller_lock);
|
||||
raw_spin_unlock(&irq_controller_lock);
|
||||
|
||||
return IRQ_SET_MASK_OK;
|
||||
}
|
||||
@ -215,9 +215,9 @@ static void gic_handle_cascade_irq(unsigned int irq, struct irq_desc *desc)
|
||||
|
||||
chained_irq_enter(chip, desc);
|
||||
|
||||
spin_lock(&irq_controller_lock);
|
||||
raw_spin_lock(&irq_controller_lock);
|
||||
status = readl_relaxed(chip_data->cpu_base + GIC_CPU_INTACK);
|
||||
spin_unlock(&irq_controller_lock);
|
||||
raw_spin_unlock(&irq_controller_lock);
|
||||
|
||||
gic_irq = (status & 0x3ff);
|
||||
if (gic_irq == 1023)
|
||||
@ -259,9 +259,15 @@ static void __init gic_dist_init(struct gic_chip_data *gic,
|
||||
unsigned int irq_start)
|
||||
{
|
||||
unsigned int gic_irqs, irq_limit, i;
|
||||
u32 cpumask;
|
||||
void __iomem *base = gic->dist_base;
|
||||
u32 cpumask = 1 << smp_processor_id();
|
||||
u32 cpu = 0;
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
cpu = cpu_logical_map(smp_processor_id());
|
||||
#endif
|
||||
|
||||
cpumask = 1 << cpu;
|
||||
cpumask |= cpumask << 8;
|
||||
cpumask |= cpumask << 16;
|
||||
|
||||
@ -382,7 +388,12 @@ void __cpuinit gic_enable_ppi(unsigned int irq)
|
||||
#ifdef CONFIG_SMP
|
||||
void gic_raise_softirq(const struct cpumask *mask, unsigned int irq)
|
||||
{
|
||||
unsigned long map = *cpus_addr(*mask);
|
||||
int cpu;
|
||||
unsigned long map = 0;
|
||||
|
||||
/* Convert our logical CPU mask into a physical one. */
|
||||
for_each_cpu(cpu, mask)
|
||||
map |= 1 << cpu_logical_map(cpu);
|
||||
|
||||
/*
|
||||
* Ensure that stores to Normal memory are visible to the
|
||||
|
@ -1546,7 +1546,7 @@ int pl330_chan_ctrl(void *ch_id, enum pl330_chan_op op)
|
||||
|
||||
/* Start the next */
|
||||
case PL330_OP_START:
|
||||
if (!_start(thrd))
|
||||
if (!_thrd_active(thrd) && !_start(thrd))
|
||||
ret = -EIO;
|
||||
break;
|
||||
|
||||
|
@ -346,7 +346,8 @@ void __init vic_init(void __iomem *base, unsigned int irq_start,
|
||||
|
||||
/* Identify which VIC cell this one is, by reading the ID */
|
||||
for (i = 0; i < 4; i++) {
|
||||
u32 addr = ((u32)base & PAGE_MASK) + 0xfe0 + (i * 4);
|
||||
void __iomem *addr;
|
||||
addr = (void __iomem *)((u32)base & PAGE_MASK) + 0xfe0 + (i * 4);
|
||||
cellid |= (readl(addr) & 0xff) << (8 * i);
|
||||
}
|
||||
vendor = (cellid >> 12) & 0xff;
|
||||
|
@ -1,5 +1,6 @@
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_SYSVIPC=y
|
||||
CONFIG_TINY_RCU=y
|
||||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
@ -8,20 +9,29 @@ CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
CONFIG_ARCH_INTEGRATOR=y
|
||||
CONFIG_ARCH_INTEGRATOR_AP=y
|
||||
CONFIG_ARCH_INTEGRATOR_CP=y
|
||||
CONFIG_CPU_ARM720T=y
|
||||
CONFIG_CPU_ARM920T=y
|
||||
CONFIG_CPU_ARM922T=y
|
||||
CONFIG_CPU_ARM926T=y
|
||||
CONFIG_CPU_ARM1020=y
|
||||
CONFIG_CPU_ARM1022=y
|
||||
CONFIG_CPU_ARM1026=y
|
||||
CONFIG_PCI=y
|
||||
CONFIG_NO_HZ=y
|
||||
CONFIG_HIGH_RES_TIMERS=y
|
||||
CONFIG_PREEMPT=y
|
||||
CONFIG_AEABI=y
|
||||
CONFIG_LEDS=y
|
||||
CONFIG_LEDS_CPU=y
|
||||
CONFIG_ZBOOT_ROM_TEXT=0x0
|
||||
CONFIG_ZBOOT_ROM_BSS=0x0
|
||||
CONFIG_CMDLINE="console=ttyAM0,38400n8 root=/dev/nfs ip=bootp mem=32M"
|
||||
CONFIG_CMDLINE="console=ttyAM0,38400n8 root=/dev/nfs ip=bootp"
|
||||
CONFIG_CPU_FREQ=y
|
||||
CONFIG_CPU_FREQ_GOV_POWERSAVE=y
|
||||
CONFIG_CPU_FREQ_GOV_USERSPACE=y
|
||||
CONFIG_CPU_FREQ_GOV_ONDEMAND=y
|
||||
CONFIG_FPE_NWFPE=y
|
||||
CONFIG_PM=y
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_UNIX=y
|
||||
@ -32,7 +42,6 @@ CONFIG_IP_PNP_DHCP=y
|
||||
CONFIG_IP_PNP_BOOTP=y
|
||||
# CONFIG_IPV6 is not set
|
||||
CONFIG_MTD=y
|
||||
CONFIG_MTD_PARTITIONS=y
|
||||
CONFIG_MTD_CMDLINE_PARTS=y
|
||||
CONFIG_MTD_AFS_PARTS=y
|
||||
CONFIG_MTD_CHAR=y
|
||||
@ -40,6 +49,7 @@ CONFIG_MTD_BLOCK=y
|
||||
CONFIG_MTD_CFI=y
|
||||
CONFIG_MTD_CFI_ADV_OPTIONS=y
|
||||
CONFIG_MTD_CFI_INTELEXT=y
|
||||
CONFIG_MTD_PHYSMAP=y
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_SIZE=8192
|
||||
@ -56,6 +66,8 @@ CONFIG_FB_MODE_HELPERS=y
|
||||
CONFIG_FB_MATROX=y
|
||||
CONFIG_FB_MATROX_MILLENIUM=y
|
||||
CONFIG_FB_MATROX_MYSTIQUE=y
|
||||
CONFIG_RTC_CLASS=y
|
||||
CONFIG_RTC_DRV_PL030=y
|
||||
CONFIG_EXT2_FS=y
|
||||
CONFIG_TMPFS=y
|
||||
CONFIG_JFFS2_FS=y
|
||||
@ -68,4 +80,3 @@ CONFIG_NFSD_V3=y
|
||||
CONFIG_PARTITION_ADVANCED=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_DEBUG_ERRORS=y
|
||||
|
@ -1,3 +1,20 @@
|
||||
include include/asm-generic/Kbuild.asm
|
||||
|
||||
header-y += hwcap.h
|
||||
|
||||
generic-y += auxvec.h
|
||||
generic-y += bitsperlong.h
|
||||
generic-y += cputime.h
|
||||
generic-y += emergency-restart.h
|
||||
generic-y += errno.h
|
||||
generic-y += ioctl.h
|
||||
generic-y += irq_regs.h
|
||||
generic-y += kdebug.h
|
||||
generic-y += local.h
|
||||
generic-y += local64.h
|
||||
generic-y += percpu.h
|
||||
generic-y += poll.h
|
||||
generic-y += resource.h
|
||||
generic-y += sections.h
|
||||
generic-y += siginfo.h
|
||||
generic-y += sizes.h
|
||||
|
@ -1,4 +0,0 @@
|
||||
#ifndef __ASMARM_AUXVEC_H
|
||||
#define __ASMARM_AUXVEC_H
|
||||
|
||||
#endif
|
@ -1 +0,0 @@
|
||||
#include <asm-generic/bitsperlong.h>
|
@ -3,21 +3,58 @@
|
||||
|
||||
|
||||
#ifdef CONFIG_BUG
|
||||
#ifdef CONFIG_DEBUG_BUGVERBOSE
|
||||
extern void __bug(const char *file, int line) __attribute__((noreturn));
|
||||
|
||||
/* give file/line information */
|
||||
#define BUG() __bug(__FILE__, __LINE__)
|
||||
|
||||
/*
|
||||
* Use a suitable undefined instruction to use for ARM/Thumb2 bug handling.
|
||||
* We need to be careful not to conflict with those used by other modules and
|
||||
* the register_undef_hook() system.
|
||||
*/
|
||||
#ifdef CONFIG_THUMB2_KERNEL
|
||||
#define BUG_INSTR_VALUE 0xde02
|
||||
#define BUG_INSTR_TYPE ".hword "
|
||||
#else
|
||||
|
||||
/* this just causes an oops */
|
||||
#define BUG() do { *(int *)0 = 0; } while (1)
|
||||
|
||||
#define BUG_INSTR_VALUE 0xe7f001f2
|
||||
#define BUG_INSTR_TYPE ".word "
|
||||
#endif
|
||||
|
||||
|
||||
#define BUG() _BUG(__FILE__, __LINE__, BUG_INSTR_VALUE)
|
||||
#define _BUG(file, line, value) __BUG(file, line, value)
|
||||
|
||||
#ifdef CONFIG_DEBUG_BUGVERBOSE
|
||||
|
||||
/*
|
||||
* The extra indirection is to ensure that the __FILE__ string comes through
|
||||
* OK. Many version of gcc do not support the asm %c parameter which would be
|
||||
* preferable to this unpleasantness. We use mergeable string sections to
|
||||
* avoid multiple copies of the string appearing in the kernel image.
|
||||
*/
|
||||
|
||||
#define __BUG(__file, __line, __value) \
|
||||
do { \
|
||||
BUILD_BUG_ON(sizeof(struct bug_entry) != 12); \
|
||||
asm volatile("1:\t" BUG_INSTR_TYPE #__value "\n" \
|
||||
".pushsection .rodata.str, \"aMS\", %progbits, 1\n" \
|
||||
"2:\t.asciz " #__file "\n" \
|
||||
".popsection\n" \
|
||||
".pushsection __bug_table,\"a\"\n" \
|
||||
"3:\t.word 1b, 2b\n" \
|
||||
"\t.hword " #__line ", 0\n" \
|
||||
".popsection"); \
|
||||
unreachable(); \
|
||||
} while (0)
|
||||
|
||||
#else /* not CONFIG_DEBUG_BUGVERBOSE */
|
||||
|
||||
#define __BUG(__file, __line, __value) \
|
||||
do { \
|
||||
asm volatile(BUG_INSTR_TYPE #__value); \
|
||||
unreachable(); \
|
||||
} while (0)
|
||||
#endif /* CONFIG_DEBUG_BUGVERBOSE */
|
||||
|
||||
#define HAVE_ARCH_BUG
|
||||
#endif
|
||||
#endif /* CONFIG_BUG */
|
||||
|
||||
#include <asm-generic/bug.h>
|
||||
|
||||
|
@ -7,6 +7,7 @@
|
||||
#define CACHEID_VIPT (CACHEID_VIPT_ALIASING|CACHEID_VIPT_NONALIASING)
|
||||
#define CACHEID_ASID_TAGGED (1 << 3)
|
||||
#define CACHEID_VIPT_I_ALIASING (1 << 4)
|
||||
#define CACHEID_PIPT (1 << 5)
|
||||
|
||||
extern unsigned int cacheid;
|
||||
|
||||
@ -16,6 +17,7 @@ extern unsigned int cacheid;
|
||||
#define cache_is_vipt_aliasing() cacheid_is(CACHEID_VIPT_ALIASING)
|
||||
#define icache_is_vivt_asid_tagged() cacheid_is(CACHEID_ASID_TAGGED)
|
||||
#define icache_is_vipt_aliasing() cacheid_is(CACHEID_VIPT_I_ALIASING)
|
||||
#define icache_is_pipt() cacheid_is(CACHEID_PIPT)
|
||||
|
||||
/*
|
||||
* __LINUX_ARM_ARCH__ is the minimum supported CPU architecture
|
||||
@ -26,7 +28,8 @@ extern unsigned int cacheid;
|
||||
#if __LINUX_ARM_ARCH__ >= 7
|
||||
#define __CACHEID_ARCH_MIN (CACHEID_VIPT_NONALIASING |\
|
||||
CACHEID_ASID_TAGGED |\
|
||||
CACHEID_VIPT_I_ALIASING)
|
||||
CACHEID_VIPT_I_ALIASING |\
|
||||
CACHEID_PIPT)
|
||||
#elif __LINUX_ARM_ARCH__ >= 6
|
||||
#define __CACHEID_ARCH_MIN (~CACHEID_VIVT)
|
||||
#else
|
||||
|
@ -1,6 +0,0 @@
|
||||
#ifndef __ARM_CPUTIME_H
|
||||
#define __ARM_CPUTIME_H
|
||||
|
||||
#include <asm-generic/cputime.h>
|
||||
|
||||
#endif /* __ARM_CPUTIME_H */
|
@ -8,6 +8,7 @@
|
||||
#define CPUID_CACHETYPE 1
|
||||
#define CPUID_TCM 2
|
||||
#define CPUID_TLBTYPE 3
|
||||
#define CPUID_MPIDR 5
|
||||
|
||||
#define CPUID_EXT_PFR0 "c1, 0"
|
||||
#define CPUID_EXT_PFR1 "c1, 1"
|
||||
@ -70,6 +71,11 @@ static inline unsigned int __attribute_const__ read_cpuid_tcmstatus(void)
|
||||
return read_cpuid(CPUID_TCM);
|
||||
}
|
||||
|
||||
static inline unsigned int __attribute_const__ read_cpuid_mpidr(void)
|
||||
{
|
||||
return read_cpuid(CPUID_MPIDR);
|
||||
}
|
||||
|
||||
/*
|
||||
* Intel's XScale3 core supports some v6 features (supersections, L2)
|
||||
* but advertises itself as v5 as it does not support the v6 ISA. For
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user