Merge remote-tracking branch 'net-next/master' into mac80211-next
Merge back net-next to get wireless driver changes (from Kalle) to be able to create the API change across all trees properly. Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
commit
206c59d1d7
11
CREDITS
11
CREDITS
|
@ -2049,6 +2049,10 @@ D: pirq addr, CS5535 alsa audio driver
|
|||
S: Gurgaon, India
|
||||
S: Kuala Lumpur, Malaysia
|
||||
|
||||
N: Mohit Kumar
|
||||
D: ST Microelectronics SPEAr13xx PCI host bridge driver
|
||||
D: Synopsys Designware PCI host bridge driver
|
||||
|
||||
N: Gabor Kuti
|
||||
M: seasons@falcon.sch.bme.hu
|
||||
M: seasons@makosteszta.sote.hu
|
||||
|
@ -3705,6 +3709,13 @@ N: Dirk Verworner
|
|||
D: Co-author of German book ``Linux-Kernel-Programmierung''
|
||||
D: Co-founder of Berlin Linux User Group
|
||||
|
||||
N: Andrew Victor
|
||||
E: linux@maxim.org.za
|
||||
W: http://maxim.org.za/at91_26.html
|
||||
D: First maintainer of Atmel ARM-based SoC, aka AT91
|
||||
D: Introduced support for at91rm9200, the first chip of AT91 family
|
||||
S: South Africa
|
||||
|
||||
N: Riku Voipio
|
||||
E: riku.voipio@iki.fi
|
||||
D: Author of PCA9532 LED and Fintek f75375s hwmon driver
|
||||
|
|
|
@ -23,3 +23,25 @@ Description: Device-mapper device suspend state.
|
|||
Contains the value 1 while the device is suspended.
|
||||
Otherwise it contains 0. Read-only attribute.
|
||||
Users: util-linux, device-mapper udev rules
|
||||
|
||||
What: /sys/block/dm-<num>/dm/rq_based_seq_io_merge_deadline
|
||||
Date: March 2015
|
||||
KernelVersion: 4.1
|
||||
Contact: dm-devel@redhat.com
|
||||
Description: Allow control over how long a request that is a
|
||||
reasonable merge candidate can be queued on the request
|
||||
queue. The resolution of this deadline is in
|
||||
microseconds (ranging from 1 to 100000 usecs).
|
||||
Setting this attribute to 0 (the default) will disable
|
||||
request-based DM's merge heuristic and associated extra
|
||||
accounting. This attribute is not applicable to
|
||||
bio-based DM devices so it will only ever report 0 for
|
||||
them.
|
||||
|
||||
What: /sys/block/dm-<num>/dm/use_blk_mq
|
||||
Date: March 2015
|
||||
KernelVersion: 4.1
|
||||
Contact: dm-devel@redhat.com
|
||||
Description: Request-based Device-mapper blk-mq I/O path mode.
|
||||
Contains the value 1 if the device is using blk-mq.
|
||||
Otherwise it contains 0. Read-only attribute.
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
What: /sys/bus/pci/drivers/janz-cmodio/.../modulbus_number
|
||||
Date: May 2010
|
||||
KernelVersion: 2.6.35
|
||||
Contact: Ira W. Snyder <ira.snyder@gmail.com>
|
||||
Description:
|
||||
Value representing the HEX switch S2 of the janz carrier board CMOD-IO or CAN-PCI2
|
||||
|
||||
Read-only: value of the configuration switch (0..15)
|
|
@ -222,3 +222,13 @@ Description:
|
|||
The number of blocks that are marked as reserved, if any, in
|
||||
this partition. These are typically used to store the in-flash
|
||||
bad block table (BBT).
|
||||
|
||||
What: /sys/class/mtd/mtdX/offset
|
||||
Date: March 2015
|
||||
KernelVersion: 4.1
|
||||
Contact: linux-mtd@lists.infradead.org
|
||||
Description:
|
||||
For a partition, the offset of that partition from the start
|
||||
of the master device in bytes. This attribute is absent on
|
||||
main devices, so it can be used to distinguish between
|
||||
partitions and devices that aren't partitions.
|
||||
|
|
|
@ -39,6 +39,25 @@ Description:
|
|||
Format is a string, e.g: 00:11:22:33:44:55 for an Ethernet MAC
|
||||
address.
|
||||
|
||||
What: /sys/class/net/<bridge iface>/bridge/group_fwd_mask
|
||||
Date: January 2012
|
||||
KernelVersion: 3.2
|
||||
Contact: netdev@vger.kernel.org
|
||||
Description:
|
||||
Bitmask to allow forwarding of link local frames with address
|
||||
01-80-C2-00-00-0X on a bridge device. Only values that set bits
|
||||
not matching BR_GROUPFWD_RESTRICTED in net/bridge/br_private.h
|
||||
allowed.
|
||||
Default value 0 does not forward any link local frames.
|
||||
|
||||
Restricted bits:
|
||||
0: 01-80-C2-00-00-00 Bridge Group Address used for STP
|
||||
1: 01-80-C2-00-00-01 (MAC Control) 802.3 used for MAC PAUSE
|
||||
2: 01-80-C2-00-00-02 (Link Aggregation) 802.3ad
|
||||
|
||||
Any values not setting these bits can be used. Take special
|
||||
care when forwarding control frames e.g. 802.1X-PAE or LLDP.
|
||||
|
||||
What: /sys/class/net/<iface>/broadcast
|
||||
Date: April 2005
|
||||
KernelVersion: 2.6.12
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
What: /sys/class/net/<iface>/termination
|
||||
Date: May 2010
|
||||
KernelVersion: 2.6.35
|
||||
Contact: Ira W. Snyder <ira.snyder@gmail.com>
|
||||
Description:
|
||||
Value representing the can bus termination
|
||||
|
||||
Default: 1 (termination active)
|
||||
Reading: get actual termination state
|
||||
Writing: set actual termination state (0=no termination, 1=termination active)
|
||||
|
||||
What: /sys/class/net/<iface>/fwinfo
|
||||
Date: May 2015
|
||||
KernelVersion: 3.19
|
||||
Contact: Andreas Gröger <andreas24groeger@gmail.com>
|
||||
Description:
|
||||
Firmware stamp of ican3 module
|
||||
Read-only: 32 byte string identification of the ICAN3 module
|
||||
(known values: "JANZ-ICAN3 ICANOS 1.xx", "JANZ-ICAN3 CAL/CANopen 1.xx")
|
|
@ -162,7 +162,7 @@ Description: Discover CPUs in the same CPU frequency coordination domain
|
|||
What: /sys/devices/system/cpu/cpu*/cache/index3/cache_disable_{0,1}
|
||||
Date: August 2008
|
||||
KernelVersion: 2.6.27
|
||||
Contact: discuss@x86-64.org
|
||||
Contact: Linux kernel mailing list <linux-kernel@vger.kernel.org>
|
||||
Description: Disable L3 cache indices
|
||||
|
||||
These files exist in every CPU's cache/index3 directory. Each
|
||||
|
|
|
@ -8,9 +8,11 @@ Description: This file controls the keyboard backlight operation mode, valid
|
|||
* 0x2 -> AUTO (also called TIMER)
|
||||
* 0x8 -> ON
|
||||
* 0x10 -> OFF
|
||||
Note that the kernel 3.16 onwards this file accepts all listed
|
||||
Note that from kernel 3.16 onwards this file accepts all listed
|
||||
parameters, kernel 3.15 only accepts the first two (FN-Z and
|
||||
AUTO).
|
||||
Also note that toggling this value on type 1 devices, requires
|
||||
a reboot for changes to take effect.
|
||||
Users: KToshiba
|
||||
|
||||
What: /sys/devices/LNXSYSTM:00/LNXSYBUS:00/TOS{1900,620{0,7,8}}:00/kbd_backlight_timeout
|
||||
|
@ -67,15 +69,72 @@ Description: This file shows the current keyboard backlight type,
|
|||
* 2 -> Type 2, supporting modes TIMER, ON and OFF
|
||||
Users: KToshiba
|
||||
|
||||
What: /sys/devices/LNXSYSTM:00/LNXSYBUS:00/TOS{1900,620{0,7,8}}:00/usb_sleep_charge
|
||||
Date: January 23, 2015
|
||||
KernelVersion: 4.0
|
||||
Contact: Azael Avalos <coproscefalo@gmail.com>
|
||||
Description: This file controls the USB Sleep & Charge charging mode, which
|
||||
can be:
|
||||
* 0 -> Disabled (0x00)
|
||||
* 1 -> Alternate (0x09)
|
||||
* 2 -> Auto (0x21)
|
||||
* 3 -> Typical (0x11)
|
||||
Note that from kernel 4.1 onwards this file accepts all listed
|
||||
values, kernel 4.0 only supports the first three.
|
||||
Note that this feature only works when connected to power, if
|
||||
you want to use it under battery, see the entry named
|
||||
"sleep_functions_on_battery"
|
||||
Users: KToshiba
|
||||
|
||||
What: /sys/devices/LNXSYSTM:00/LNXSYBUS:00/TOS{1900,620{0,7,8}}:00/sleep_functions_on_battery
|
||||
Date: January 23, 2015
|
||||
KernelVersion: 4.0
|
||||
Contact: Azael Avalos <coproscefalo@gmail.com>
|
||||
Description: This file controls the USB Sleep Functions under battery, and
|
||||
set the level at which point they will be disabled, accepted
|
||||
values can be:
|
||||
* 0 -> Disabled
|
||||
* 1-100 -> Battery level to disable sleep functions
|
||||
Currently it prints two values, the first one indicates if the
|
||||
feature is enabled or disabled, while the second one shows the
|
||||
current battery level set.
|
||||
Note that when the value is set to disabled, the sleep function
|
||||
will only work when connected to power.
|
||||
Users: KToshiba
|
||||
|
||||
What: /sys/devices/LNXSYSTM:00/LNXSYBUS:00/TOS{1900,620{0,7,8}}:00/usb_rapid_charge
|
||||
Date: January 23, 2015
|
||||
KernelVersion: 4.0
|
||||
Contact: Azael Avalos <coproscefalo@gmail.com>
|
||||
Description: This file controls the USB Rapid Charge state, which can be:
|
||||
* 0 -> Disabled
|
||||
* 1 -> Enabled
|
||||
Note that toggling this value requires a reboot for changes to
|
||||
take effect.
|
||||
Users: KToshiba
|
||||
|
||||
What: /sys/devices/LNXSYSTM:00/LNXSYBUS:00/TOS{1900,620{0,7,8}}:00/usb_sleep_music
|
||||
Date: January 23, 2015
|
||||
KernelVersion: 4.0
|
||||
Contact: Azael Avalos <coproscefalo@gmail.com>
|
||||
Description: This file controls the Sleep & Music state, which values can be:
|
||||
* 0 -> Disabled
|
||||
* 1 -> Enabled
|
||||
Note that this feature only works when connected to power, if
|
||||
you want to use it under battery, see the entry named
|
||||
"sleep_functions_on_battery"
|
||||
Users: KToshiba
|
||||
|
||||
What: /sys/devices/LNXSYSTM:00/LNXSYBUS:00/TOS{1900,620{0,7,8}}:00/version
|
||||
Date: February, 2015
|
||||
KernelVersion: 3.20
|
||||
Date: February 12, 2015
|
||||
KernelVersion: 4.0
|
||||
Contact: Azael Avalos <coproscefalo@gmail.com>
|
||||
Description: This file shows the current version of the driver
|
||||
Users: KToshiba
|
||||
|
||||
What: /sys/devices/LNXSYSTM:00/LNXSYBUS:00/TOS{1900,620{0,7,8}}:00/fan
|
||||
Date: February, 2015
|
||||
KernelVersion: 3.20
|
||||
Date: February 12, 2015
|
||||
KernelVersion: 4.0
|
||||
Contact: Azael Avalos <coproscefalo@gmail.com>
|
||||
Description: This file controls the state of the internal fan, valid
|
||||
values are:
|
||||
|
@ -83,8 +142,8 @@ Description: This file controls the state of the internal fan, valid
|
|||
* 1 -> ON
|
||||
|
||||
What: /sys/devices/LNXSYSTM:00/LNXSYBUS:00/TOS{1900,620{0,7,8}}:00/kbd_function_keys
|
||||
Date: February, 2015
|
||||
KernelVersion: 3.20
|
||||
Date: February 12, 2015
|
||||
KernelVersion: 4.0
|
||||
Contact: Azael Avalos <coproscefalo@gmail.com>
|
||||
Description: This file controls the Special Functions (hotkeys) operation
|
||||
mode, valid values are:
|
||||
|
@ -94,21 +153,29 @@ Description: This file controls the Special Functions (hotkeys) operation
|
|||
and the hotkeys are accessed via FN-F{1-12}.
|
||||
In the "Special Functions" mode, the F{1-12} keys trigger the
|
||||
hotkey and the F{1-12} keys are accessed via FN-F{1-12}.
|
||||
Note that toggling this value requires a reboot for changes to
|
||||
take effect.
|
||||
Users: KToshiba
|
||||
|
||||
What: /sys/devices/LNXSYSTM:00/LNXSYBUS:00/TOS{1900,620{0,7,8}}:00/panel_power_on
|
||||
Date: February, 2015
|
||||
KernelVersion: 3.20
|
||||
Date: February 12, 2015
|
||||
KernelVersion: 4.0
|
||||
Contact: Azael Avalos <coproscefalo@gmail.com>
|
||||
Description: This file controls whether the laptop should turn ON whenever
|
||||
the LID is opened, valid values are:
|
||||
* 0 -> Disabled
|
||||
* 1 -> Enabled
|
||||
Note that toggling this value requires a reboot for changes to
|
||||
take effect.
|
||||
Users: KToshiba
|
||||
|
||||
What: /sys/devices/LNXSYSTM:00/LNXSYBUS:00/TOS{1900,620{0,7,8}}:00/usb_three
|
||||
Date: February, 2015
|
||||
KernelVersion: 3.20
|
||||
Date: February 12, 2015
|
||||
KernelVersion: 4.0
|
||||
Contact: Azael Avalos <coproscefalo@gmail.com>
|
||||
Description: This file controls whether the USB 3 functionality, valid
|
||||
values are:
|
||||
Description: This file controls the USB 3 functionality, valid values are:
|
||||
* 0 -> Disabled (Acts as a regular USB 2)
|
||||
* 1 -> Enabled (Full USB 3 functionality)
|
||||
Note that toggling this value requires a reboot for changes to
|
||||
take effect.
|
||||
Users: KToshiba
|
||||
|
|
|
@ -0,0 +1,69 @@
|
|||
What: /sys/class/leds/dell::kbd_backlight/als_enabled
|
||||
Date: December 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Gabriele Mazzotta <gabriele.mzt@gmail.com>,
|
||||
Pali Rohár <pali.rohar@gmail.com>
|
||||
Description:
|
||||
This file allows to control the automatic keyboard
|
||||
illumination mode on some systems that have an ambient
|
||||
light sensor. Write 1 to this file to enable the auto
|
||||
mode, 0 to disable it.
|
||||
|
||||
What: /sys/class/leds/dell::kbd_backlight/als_setting
|
||||
Date: December 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Gabriele Mazzotta <gabriele.mzt@gmail.com>,
|
||||
Pali Rohár <pali.rohar@gmail.com>
|
||||
Description:
|
||||
This file allows to specifiy the on/off threshold value,
|
||||
as reported by the ambient light sensor.
|
||||
|
||||
What: /sys/class/leds/dell::kbd_backlight/start_triggers
|
||||
Date: December 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Gabriele Mazzotta <gabriele.mzt@gmail.com>,
|
||||
Pali Rohár <pali.rohar@gmail.com>
|
||||
Description:
|
||||
This file allows to control the input triggers that
|
||||
turn on the keyboard backlight illumination that is
|
||||
disabled because of inactivity.
|
||||
Read the file to see the triggers available. The ones
|
||||
enabled are preceded by '+', those disabled by '-'.
|
||||
|
||||
To enable a trigger, write its name preceded by '+' to
|
||||
this file. To disable a trigger, write its name preceded
|
||||
by '-' instead.
|
||||
|
||||
For example, to enable the keyboard as trigger run:
|
||||
echo +keyboard > /sys/class/leds/dell::kbd_backlight/start_triggers
|
||||
To disable it:
|
||||
echo -keyboard > /sys/class/leds/dell::kbd_backlight/start_triggers
|
||||
|
||||
Note that not all the available triggers can be configured.
|
||||
|
||||
What: /sys/class/leds/dell::kbd_backlight/stop_timeout
|
||||
Date: December 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Gabriele Mazzotta <gabriele.mzt@gmail.com>,
|
||||
Pali Rohár <pali.rohar@gmail.com>
|
||||
Description:
|
||||
This file allows to specify the interval after which the
|
||||
keyboard illumination is disabled because of inactivity.
|
||||
The timeouts are expressed in seconds, minutes, hours and
|
||||
days, for which the symbols are 's', 'm', 'h' and 'd'
|
||||
respectively.
|
||||
|
||||
To configure the timeout, write to this file a value along
|
||||
with any the above units. If no unit is specified, the value
|
||||
is assumed to be expressed in seconds.
|
||||
|
||||
For example, to set the timeout to 10 minutes run:
|
||||
echo 10m > /sys/class/leds/dell::kbd_backlight/stop_timeout
|
||||
|
||||
Note that when this file is read, the returned value might be
|
||||
expressed in a different unit than the one used when the timeout
|
||||
was set.
|
||||
|
||||
Also note that only some timeouts are supported and that
|
||||
some systems might fall back to a specific timeout in case
|
||||
an invalid timeout is written to this file.
|
|
@ -13,7 +13,7 @@ and NOT read it. Burn them, it's a great symbolic gesture.
|
|||
Anyway, here goes:
|
||||
|
||||
|
||||
Chapter 1: Indentation
|
||||
Chapter 1: Indentation
|
||||
|
||||
Tabs are 8 characters, and thus indentations are also 8 characters.
|
||||
There are heretic movements that try to make indentations 4 (or even 2!)
|
||||
|
@ -56,7 +56,6 @@ instead of "double-indenting" the "case" labels. E.g.:
|
|||
break;
|
||||
}
|
||||
|
||||
|
||||
Don't put multiple statements on a single line unless you have
|
||||
something to hide:
|
||||
|
||||
|
@ -156,25 +155,25 @@ comments on.
|
|||
|
||||
Do not unnecessarily use braces where a single statement will do.
|
||||
|
||||
if (condition)
|
||||
action();
|
||||
if (condition)
|
||||
action();
|
||||
|
||||
and
|
||||
|
||||
if (condition)
|
||||
do_this();
|
||||
else
|
||||
do_that();
|
||||
if (condition)
|
||||
do_this();
|
||||
else
|
||||
do_that();
|
||||
|
||||
This does not apply if only one branch of a conditional statement is a single
|
||||
statement; in the latter case use braces in both branches:
|
||||
|
||||
if (condition) {
|
||||
do_this();
|
||||
do_that();
|
||||
} else {
|
||||
otherwise();
|
||||
}
|
||||
if (condition) {
|
||||
do_this();
|
||||
do_that();
|
||||
} else {
|
||||
otherwise();
|
||||
}
|
||||
|
||||
3.1: Spaces
|
||||
|
||||
|
@ -186,8 +185,11 @@ although they are not required in the language, as in: "sizeof info" after
|
|||
"struct fileinfo info;" is declared).
|
||||
|
||||
So use a space after these keywords:
|
||||
|
||||
if, switch, case, for, do, while
|
||||
|
||||
but not with sizeof, typeof, alignof, or __attribute__. E.g.,
|
||||
|
||||
s = sizeof(struct file);
|
||||
|
||||
Do not add spaces around (inside) parenthesized expressions. This example is
|
||||
|
@ -209,12 +211,15 @@ such as any of these:
|
|||
= + - < > * / % | & ^ <= >= == != ? :
|
||||
|
||||
but no space after unary operators:
|
||||
|
||||
& * + - ~ ! sizeof typeof alignof __attribute__ defined
|
||||
|
||||
no space before the postfix increment & decrement unary operators:
|
||||
|
||||
++ --
|
||||
|
||||
no space after the prefix increment & decrement unary operators:
|
||||
|
||||
++ --
|
||||
|
||||
and no space around the '.' and "->" structure member operators.
|
||||
|
@ -268,13 +273,11 @@ See chapter 6 (Functions).
|
|||
Chapter 5: Typedefs
|
||||
|
||||
Please don't use things like "vps_t".
|
||||
|
||||
It's a _mistake_ to use typedef for structures and pointers. When you see a
|
||||
|
||||
vps_t a;
|
||||
|
||||
in the source, what does it mean?
|
||||
|
||||
In contrast, if it says
|
||||
|
||||
struct virtual_container *a;
|
||||
|
@ -372,11 +375,11 @@ In source files, separate functions with one blank line. If the function is
|
|||
exported, the EXPORT* macro for it should follow immediately after the closing
|
||||
function brace line. E.g.:
|
||||
|
||||
int system_is_up(void)
|
||||
{
|
||||
return system_state == SYSTEM_RUNNING;
|
||||
}
|
||||
EXPORT_SYMBOL(system_is_up);
|
||||
int system_is_up(void)
|
||||
{
|
||||
return system_state == SYSTEM_RUNNING;
|
||||
}
|
||||
EXPORT_SYMBOL(system_is_up);
|
||||
|
||||
In function prototypes, include parameter names with their data types.
|
||||
Although this is not required by the C language, it is preferred in Linux
|
||||
|
@ -405,34 +408,34 @@ The rationale for using gotos is:
|
|||
modifications are prevented
|
||||
- saves the compiler work to optimize redundant code away ;)
|
||||
|
||||
int fun(int a)
|
||||
{
|
||||
int result = 0;
|
||||
char *buffer;
|
||||
int fun(int a)
|
||||
{
|
||||
int result = 0;
|
||||
char *buffer;
|
||||
|
||||
buffer = kmalloc(SIZE, GFP_KERNEL);
|
||||
if (!buffer)
|
||||
return -ENOMEM;
|
||||
buffer = kmalloc(SIZE, GFP_KERNEL);
|
||||
if (!buffer)
|
||||
return -ENOMEM;
|
||||
|
||||
if (condition1) {
|
||||
while (loop1) {
|
||||
...
|
||||
if (condition1) {
|
||||
while (loop1) {
|
||||
...
|
||||
}
|
||||
result = 1;
|
||||
goto out_buffer;
|
||||
}
|
||||
result = 1;
|
||||
goto out_buffer;
|
||||
...
|
||||
out_buffer:
|
||||
kfree(buffer);
|
||||
return result;
|
||||
}
|
||||
...
|
||||
out_buffer:
|
||||
kfree(buffer);
|
||||
return result;
|
||||
}
|
||||
|
||||
A common type of bug to be aware of it "one err bugs" which look like this:
|
||||
|
||||
err:
|
||||
kfree(foo->bar);
|
||||
kfree(foo);
|
||||
return ret;
|
||||
err:
|
||||
kfree(foo->bar);
|
||||
kfree(foo);
|
||||
return ret;
|
||||
|
||||
The bug in this code is that on some exit paths "foo" is NULL. Normally the
|
||||
fix for this is to split it up into two error labels "err_bar:" and "err_foo:".
|
||||
|
@ -503,9 +506,9 @@ values. To do the latter, you can stick the following in your .emacs file:
|
|||
(defun c-lineup-arglist-tabs-only (ignored)
|
||||
"Line up argument lists by tabs, not spaces"
|
||||
(let* ((anchor (c-langelem-pos c-syntactic-element))
|
||||
(column (c-langelem-2nd-pos c-syntactic-element))
|
||||
(offset (- (1+ column) anchor))
|
||||
(steps (floor offset c-basic-offset)))
|
||||
(column (c-langelem-2nd-pos c-syntactic-element))
|
||||
(offset (- (1+ column) anchor))
|
||||
(steps (floor offset c-basic-offset)))
|
||||
(* (max steps 1)
|
||||
c-basic-offset)))
|
||||
|
||||
|
@ -612,7 +615,7 @@ have a reference count on it, you almost certainly have a bug.
|
|||
|
||||
Names of macros defining constants and labels in enums are capitalized.
|
||||
|
||||
#define CONSTANT 0x12345
|
||||
#define CONSTANT 0x12345
|
||||
|
||||
Enums are preferred when defining several related constants.
|
||||
|
||||
|
@ -623,28 +626,28 @@ Generally, inline functions are preferable to macros resembling functions.
|
|||
|
||||
Macros with multiple statements should be enclosed in a do - while block:
|
||||
|
||||
#define macrofun(a, b, c) \
|
||||
do { \
|
||||
if (a == 5) \
|
||||
do_this(b, c); \
|
||||
} while (0)
|
||||
#define macrofun(a, b, c) \
|
||||
do { \
|
||||
if (a == 5) \
|
||||
do_this(b, c); \
|
||||
} while (0)
|
||||
|
||||
Things to avoid when using macros:
|
||||
|
||||
1) macros that affect control flow:
|
||||
|
||||
#define FOO(x) \
|
||||
do { \
|
||||
if (blah(x) < 0) \
|
||||
return -EBUGGERED; \
|
||||
} while(0)
|
||||
#define FOO(x) \
|
||||
do { \
|
||||
if (blah(x) < 0) \
|
||||
return -EBUGGERED; \
|
||||
} while(0)
|
||||
|
||||
is a _very_ bad idea. It looks like a function call but exits the "calling"
|
||||
function; don't break the internal parsers of those who will read the code.
|
||||
|
||||
2) macros that depend on having a local variable with a magic name:
|
||||
|
||||
#define FOO(val) bar(index, val)
|
||||
#define FOO(val) bar(index, val)
|
||||
|
||||
might look like a good thing, but it's confusing as hell when one reads the
|
||||
code and it's prone to breakage from seemingly innocent changes.
|
||||
|
@ -656,8 +659,8 @@ bite you if somebody e.g. turns FOO into an inline function.
|
|||
must enclose the expression in parentheses. Beware of similar issues with
|
||||
macros using parameters.
|
||||
|
||||
#define CONSTANT 0x4000
|
||||
#define CONSTEXP (CONSTANT | 3)
|
||||
#define CONSTANT 0x4000
|
||||
#define CONSTEXP (CONSTANT | 3)
|
||||
|
||||
5) namespace collisions when defining local variables in macros resembling
|
||||
functions:
|
||||
|
@ -809,11 +812,11 @@ you should use, rather than explicitly coding some variant of them yourself.
|
|||
For example, if you need to calculate the length of an array, take advantage
|
||||
of the macro
|
||||
|
||||
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
|
||||
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
|
||||
|
||||
Similarly, if you need to calculate the size of some structure member, use
|
||||
|
||||
#define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f))
|
||||
#define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f))
|
||||
|
||||
There are also min() and max() macros that do strict type checking if you
|
||||
need them. Feel free to peruse that header file to see what else is already
|
||||
|
@ -826,19 +829,19 @@ Some editors can interpret configuration information embedded in source files,
|
|||
indicated with special markers. For example, emacs interprets lines marked
|
||||
like this:
|
||||
|
||||
-*- mode: c -*-
|
||||
-*- mode: c -*-
|
||||
|
||||
Or like this:
|
||||
|
||||
/*
|
||||
Local Variables:
|
||||
compile-command: "gcc -DMAGIC_DEBUG_FLAG foo.c"
|
||||
End:
|
||||
*/
|
||||
/*
|
||||
Local Variables:
|
||||
compile-command: "gcc -DMAGIC_DEBUG_FLAG foo.c"
|
||||
End:
|
||||
*/
|
||||
|
||||
Vim interprets markers that look like this:
|
||||
|
||||
/* vim:set sw=8 noet */
|
||||
/* vim:set sw=8 noet */
|
||||
|
||||
Do not include any of these in source files. People have their own personal
|
||||
editor configurations, and your source files should not override them. This
|
||||
|
@ -915,9 +918,9 @@ At the end of any non-trivial #if or #ifdef block (more than a few lines),
|
|||
place a comment after the #endif on the same line, noting the conditional
|
||||
expression used. For instance:
|
||||
|
||||
#ifdef CONFIG_SOMETHING
|
||||
...
|
||||
#endif /* CONFIG_SOMETHING */
|
||||
#ifdef CONFIG_SOMETHING
|
||||
...
|
||||
#endif /* CONFIG_SOMETHING */
|
||||
|
||||
|
||||
Appendix I: References
|
||||
|
|
|
@ -1293,7 +1293,7 @@ int max_width, max_height;</synopsis>
|
|||
</para>
|
||||
<para>
|
||||
If a page flip can be successfully scheduled the driver must set the
|
||||
<code>drm_crtc-<fb</code> field to the new framebuffer pointed to
|
||||
<code>drm_crtc->fb</code> field to the new framebuffer pointed to
|
||||
by <code>fb</code>. This is important so that the reference counting
|
||||
on framebuffers stays balanced.
|
||||
</para>
|
||||
|
@ -3979,6 +3979,11 @@ int num_ioctls;</synopsis>
|
|||
!Fdrivers/gpu/drm/i915/i915_irq.c intel_runtime_pm_disable_interrupts
|
||||
!Fdrivers/gpu/drm/i915/i915_irq.c intel_runtime_pm_enable_interrupts
|
||||
</sect2>
|
||||
<sect2>
|
||||
<title>Intel GVT-g Guest Support(vGPU)</title>
|
||||
!Pdrivers/gpu/drm/i915/i915_vgpu.c Intel GVT-g guest support
|
||||
!Idrivers/gpu/drm/i915/i915_vgpu.c
|
||||
</sect2>
|
||||
</sect1>
|
||||
<sect1>
|
||||
<title>Display Hardware Handling</title>
|
||||
|
@ -4046,6 +4051,17 @@ int num_ioctls;</synopsis>
|
|||
<title>Frame Buffer Compression (FBC)</title>
|
||||
!Pdrivers/gpu/drm/i915/intel_fbc.c Frame Buffer Compression (FBC)
|
||||
!Idrivers/gpu/drm/i915/intel_fbc.c
|
||||
</sect2>
|
||||
<sect2>
|
||||
<title>Display Refresh Rate Switching (DRRS)</title>
|
||||
!Pdrivers/gpu/drm/i915/intel_dp.c Display Refresh Rate Switching (DRRS)
|
||||
!Fdrivers/gpu/drm/i915/intel_dp.c intel_dp_set_drrs_state
|
||||
!Fdrivers/gpu/drm/i915/intel_dp.c intel_edp_drrs_enable
|
||||
!Fdrivers/gpu/drm/i915/intel_dp.c intel_edp_drrs_disable
|
||||
!Fdrivers/gpu/drm/i915/intel_dp.c intel_edp_drrs_invalidate
|
||||
!Fdrivers/gpu/drm/i915/intel_dp.c intel_edp_drrs_flush
|
||||
!Fdrivers/gpu/drm/i915/intel_dp.c intel_dp_drrs_init
|
||||
|
||||
</sect2>
|
||||
<sect2>
|
||||
<title>DPIO</title>
|
||||
|
@ -4168,7 +4184,7 @@ int num_ioctls;</synopsis>
|
|||
<sect2>
|
||||
<title>Buffer Object Eviction</title>
|
||||
<para>
|
||||
This section documents the interface function for evicting buffer
|
||||
This section documents the interface functions for evicting buffer
|
||||
objects to make space available in the virtual gpu address spaces.
|
||||
Note that this is mostly orthogonal to shrinking buffer objects
|
||||
caches, which has the goal to make main memory (shared with the gpu
|
||||
|
@ -4176,6 +4192,17 @@ int num_ioctls;</synopsis>
|
|||
</para>
|
||||
!Idrivers/gpu/drm/i915/i915_gem_evict.c
|
||||
</sect2>
|
||||
<sect2>
|
||||
<title>Buffer Object Memory Shrinking</title>
|
||||
<para>
|
||||
This section documents the interface function for shrinking memory
|
||||
usage of buffer object caches. Shrinking is used to make main memory
|
||||
available. Note that this is mostly orthogonal to evicting buffer
|
||||
objects, which has the goal to make space in gpu virtual address
|
||||
spaces.
|
||||
</para>
|
||||
!Idrivers/gpu/drm/i915/i915_gem_shrinker.c
|
||||
</sect2>
|
||||
</sect1>
|
||||
|
||||
<sect1>
|
||||
|
|
|
@ -1,14 +1,13 @@
|
|||
<bibliography>
|
||||
<title>References</title>
|
||||
|
||||
<biblioentry id="eia608">
|
||||
<abbrev>EIA 608-B</abbrev>
|
||||
<biblioentry id="cea608">
|
||||
<abbrev>CEA 608-E</abbrev>
|
||||
<authorgroup>
|
||||
<corpauthor>Electronic Industries Alliance (<ulink
|
||||
url="http://www.eia.org">http://www.eia.org</ulink>)</corpauthor>
|
||||
<corpauthor>Consumer Electronics Association (<ulink
|
||||
url="http://www.ce.org">http://www.ce.org</ulink>)</corpauthor>
|
||||
</authorgroup>
|
||||
<title>EIA 608-B "Recommended Practice for Line 21 Data
|
||||
Service"</title>
|
||||
<title>CEA-608-E R-2014 "Line 21 Data Services"</title>
|
||||
</biblioentry>
|
||||
|
||||
<biblioentry id="en300294">
|
||||
|
|
|
@ -2491,7 +2491,7 @@ that used it. It was originally scheduled for removal in 2.6.35.
|
|||
</listitem>
|
||||
<listitem>
|
||||
<para>Added <constant>V4L2_EVENT_CTRL_CH_RANGE</constant> control event
|
||||
changes flag. See <xref linkend="changes-flags"/>.</para>
|
||||
changes flag. See <xref linkend="ctrl-changes-flags"/>.</para>
|
||||
</listitem>
|
||||
</orderedlist>
|
||||
</section>
|
||||
|
|
|
@ -254,7 +254,7 @@ ETS 300 231, lsb first transmitted.</entry>
|
|||
<row>
|
||||
<entry><constant>V4L2_SLICED_CAPTION_525</constant></entry>
|
||||
<entry>0x1000</entry>
|
||||
<entry><xref linkend="eia608" /></entry>
|
||||
<entry><xref linkend="cea608" /></entry>
|
||||
<entry>NTSC line 21, 284 (second field 21)</entry>
|
||||
<entry>Two bytes in transmission order, including parity
|
||||
bit, lsb first transmitted.</entry>
|
||||
|
|
|
@ -143,86 +143,28 @@
|
|||
<row>
|
||||
<entry></entry>
|
||||
<entry>struct</entry>
|
||||
<entry><structfield>v4l</structfield></entry>
|
||||
<entry><structfield>dev</structfield></entry>
|
||||
<entry></entry>
|
||||
<entry>Valid for V4L sub-devices and nodes only.</entry>
|
||||
<entry>Valid for (sub-)devices that create a single device node.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry></entry>
|
||||
<entry></entry>
|
||||
<entry>__u32</entry>
|
||||
<entry><structfield>major</structfield></entry>
|
||||
<entry>V4L device node major number. For V4L sub-devices with no
|
||||
device node, set by the driver to 0.</entry>
|
||||
<entry>Device node major number.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry></entry>
|
||||
<entry></entry>
|
||||
<entry>__u32</entry>
|
||||
<entry><structfield>minor</structfield></entry>
|
||||
<entry>V4L device node minor number. For V4L sub-devices with no
|
||||
device node, set by the driver to 0.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry></entry>
|
||||
<entry>struct</entry>
|
||||
<entry><structfield>fb</structfield></entry>
|
||||
<entry></entry>
|
||||
<entry>Valid for frame buffer nodes only.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry></entry>
|
||||
<entry></entry>
|
||||
<entry>__u32</entry>
|
||||
<entry><structfield>major</structfield></entry>
|
||||
<entry>Frame buffer device node major number.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry></entry>
|
||||
<entry></entry>
|
||||
<entry>__u32</entry>
|
||||
<entry><structfield>minor</structfield></entry>
|
||||
<entry>Frame buffer device node minor number.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry></entry>
|
||||
<entry>struct</entry>
|
||||
<entry><structfield>alsa</structfield></entry>
|
||||
<entry></entry>
|
||||
<entry>Valid for ALSA devices only.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry></entry>
|
||||
<entry></entry>
|
||||
<entry>__u32</entry>
|
||||
<entry><structfield>card</structfield></entry>
|
||||
<entry>ALSA card number</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry></entry>
|
||||
<entry></entry>
|
||||
<entry>__u32</entry>
|
||||
<entry><structfield>device</structfield></entry>
|
||||
<entry>ALSA device number</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry></entry>
|
||||
<entry></entry>
|
||||
<entry>__u32</entry>
|
||||
<entry><structfield>subdevice</structfield></entry>
|
||||
<entry>ALSA sub-device number</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry></entry>
|
||||
<entry>int</entry>
|
||||
<entry><structfield>dvb</structfield></entry>
|
||||
<entry></entry>
|
||||
<entry>DVB card number</entry>
|
||||
<entry>Device node minor number.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry></entry>
|
||||
<entry>__u8</entry>
|
||||
<entry><structfield>raw</structfield>[180]</entry>
|
||||
<entry><structfield>raw</structfield>[184]</entry>
|
||||
<entry></entry>
|
||||
<entry></entry>
|
||||
</row>
|
||||
|
@ -253,8 +195,24 @@
|
|||
<entry>ALSA card</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>MEDIA_ENT_T_DEVNODE_DVB</constant></entry>
|
||||
<entry>DVB card</entry>
|
||||
<entry><constant>MEDIA_ENT_T_DEVNODE_DVB_FE</constant></entry>
|
||||
<entry>DVB frontend devnode</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>MEDIA_ENT_T_DEVNODE_DVB_DEMUX</constant></entry>
|
||||
<entry>DVB demux devnode</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>MEDIA_ENT_T_DEVNODE_DVB_DVR</constant></entry>
|
||||
<entry>DVB DVR devnode</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>MEDIA_ENT_T_DEVNODE_DVB_CA</constant></entry>
|
||||
<entry>DVB CAM devnode</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>MEDIA_ENT_T_DEVNODE_DVB_NET</constant></entry>
|
||||
<entry>DVB network devnode</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>MEDIA_ENT_T_V4L2_SUBDEV</constant></entry>
|
||||
|
@ -282,6 +240,10 @@
|
|||
it in some digital video standard, with appropriate embedded timing
|
||||
signals.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>MEDIA_ENT_T_V4L2_SUBDEV_TUNER</constant></entry>
|
||||
<entry>TV and/or radio tuner</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
|
|
|
@ -303,45 +303,6 @@ for a pixel lie next to each other in memory.</para>
|
|||
<entry>b<subscript>1</subscript></entry>
|
||||
<entry>b<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-PIX-FMT-BGR666">
|
||||
<entry><constant>V4L2_PIX_FMT_BGR666</constant></entry>
|
||||
<entry>'BGRH'</entry>
|
||||
<entry></entry>
|
||||
<entry>b<subscript>5</subscript></entry>
|
||||
<entry>b<subscript>4</subscript></entry>
|
||||
<entry>b<subscript>3</subscript></entry>
|
||||
<entry>b<subscript>2</subscript></entry>
|
||||
<entry>b<subscript>1</subscript></entry>
|
||||
<entry>b<subscript>0</subscript></entry>
|
||||
<entry>g<subscript>5</subscript></entry>
|
||||
<entry>g<subscript>4</subscript></entry>
|
||||
<entry></entry>
|
||||
<entry>g<subscript>3</subscript></entry>
|
||||
<entry>g<subscript>2</subscript></entry>
|
||||
<entry>g<subscript>1</subscript></entry>
|
||||
<entry>g<subscript>0</subscript></entry>
|
||||
<entry>r<subscript>5</subscript></entry>
|
||||
<entry>r<subscript>4</subscript></entry>
|
||||
<entry>r<subscript>3</subscript></entry>
|
||||
<entry>r<subscript>2</subscript></entry>
|
||||
<entry></entry>
|
||||
<entry>r<subscript>1</subscript></entry>
|
||||
<entry>r<subscript>0</subscript></entry>
|
||||
<entry></entry>
|
||||
<entry></entry>
|
||||
<entry></entry>
|
||||
<entry></entry>
|
||||
<entry></entry>
|
||||
<entry></entry>
|
||||
<entry></entry>
|
||||
<entry></entry>
|
||||
<entry></entry>
|
||||
<entry></entry>
|
||||
<entry></entry>
|
||||
<entry></entry>
|
||||
<entry></entry>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row id="V4L2-PIX-FMT-BGR24">
|
||||
<entry><constant>V4L2_PIX_FMT_BGR24</constant></entry>
|
||||
<entry>'BGR3'</entry>
|
||||
|
@ -404,6 +365,46 @@ for a pixel lie next to each other in memory.</para>
|
|||
<entry>b<subscript>1</subscript></entry>
|
||||
<entry>b<subscript>0</subscript></entry>
|
||||
</row>
|
||||
<row id="V4L2-PIX-FMT-BGR666">
|
||||
<entry><constant>V4L2_PIX_FMT_BGR666</constant></entry>
|
||||
<entry>'BGRH'</entry>
|
||||
<entry></entry>
|
||||
<entry>b<subscript>5</subscript></entry>
|
||||
<entry>b<subscript>4</subscript></entry>
|
||||
<entry>b<subscript>3</subscript></entry>
|
||||
<entry>b<subscript>2</subscript></entry>
|
||||
<entry>b<subscript>1</subscript></entry>
|
||||
<entry>b<subscript>0</subscript></entry>
|
||||
<entry>g<subscript>5</subscript></entry>
|
||||
<entry>g<subscript>4</subscript></entry>
|
||||
<entry></entry>
|
||||
<entry>g<subscript>3</subscript></entry>
|
||||
<entry>g<subscript>2</subscript></entry>
|
||||
<entry>g<subscript>1</subscript></entry>
|
||||
<entry>g<subscript>0</subscript></entry>
|
||||
<entry>r<subscript>5</subscript></entry>
|
||||
<entry>r<subscript>4</subscript></entry>
|
||||
<entry>r<subscript>3</subscript></entry>
|
||||
<entry>r<subscript>2</subscript></entry>
|
||||
<entry></entry>
|
||||
<entry>r<subscript>1</subscript></entry>
|
||||
<entry>r<subscript>0</subscript></entry>
|
||||
<entry>-</entry>
|
||||
<entry>-</entry>
|
||||
<entry>-</entry>
|
||||
<entry>-</entry>
|
||||
<entry>-</entry>
|
||||
<entry>-</entry>
|
||||
<entry></entry>
|
||||
<entry>-</entry>
|
||||
<entry>-</entry>
|
||||
<entry>-</entry>
|
||||
<entry>-</entry>
|
||||
<entry>-</entry>
|
||||
<entry>-</entry>
|
||||
<entry>-</entry>
|
||||
<entry>-</entry>
|
||||
</row>
|
||||
<row id="V4L2-PIX-FMT-ABGR32">
|
||||
<entry><constant>V4L2_PIX_FMT_ABGR32</constant></entry>
|
||||
<entry>'AR24'</entry>
|
||||
|
|
|
@ -38,10 +38,10 @@ columns and rows.</para>
|
|||
</row>
|
||||
<row>
|
||||
<entry>start + 4:</entry>
|
||||
<entry>R<subscript>10</subscript></entry>
|
||||
<entry>B<subscript>11</subscript></entry>
|
||||
<entry>R<subscript>12</subscript></entry>
|
||||
<entry>B<subscript>13</subscript></entry>
|
||||
<entry>B<subscript>10</subscript></entry>
|
||||
<entry>G<subscript>11</subscript></entry>
|
||||
<entry>B<subscript>12</subscript></entry>
|
||||
<entry>G<subscript>13</subscript></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>start + 8:</entry>
|
||||
|
@ -52,10 +52,10 @@ columns and rows.</para>
|
|||
</row>
|
||||
<row>
|
||||
<entry>start + 12:</entry>
|
||||
<entry>R<subscript>30</subscript></entry>
|
||||
<entry>B<subscript>31</subscript></entry>
|
||||
<entry>R<subscript>32</subscript></entry>
|
||||
<entry>B<subscript>33</subscript></entry>
|
||||
<entry>B<subscript>30</subscript></entry>
|
||||
<entry>G<subscript>31</subscript></entry>
|
||||
<entry>B<subscript>32</subscript></entry>
|
||||
<entry>G<subscript>33</subscript></entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
|
|
|
@ -38,7 +38,7 @@
|
|||
<title>Byte Order.</title>
|
||||
<para>Each cell is one byte.
|
||||
<informaltable frame="topbot" colsep="1" rowsep="1">
|
||||
<tgroup cols="5" align="center" border="1">
|
||||
<tgroup cols="5" align="center">
|
||||
<colspec align="left" colwidth="2*" />
|
||||
<tbody valign="top">
|
||||
<row>
|
||||
|
|
|
@ -29,12 +29,12 @@ and Cr planes have half as many pad bytes after their rows. In other
|
|||
words, two Cx rows (including padding) is exactly as long as one Y row
|
||||
(including padding).</para>
|
||||
|
||||
<para><constant>V4L2_PIX_FMT_NV12M</constant> is intended to be
|
||||
<para><constant>V4L2_PIX_FMT_YUV420M</constant> is intended to be
|
||||
used only in drivers and applications that support the multi-planar API,
|
||||
described in <xref linkend="planar-apis"/>. </para>
|
||||
|
||||
<example>
|
||||
<title><constant>V4L2_PIX_FMT_YVU420M</constant> 4 × 4
|
||||
<title><constant>V4L2_PIX_FMT_YUV420M</constant> 4 × 4
|
||||
pixel image</title>
|
||||
|
||||
<formalpara>
|
||||
|
|
|
@ -80,9 +80,9 @@ padding bytes after the last line of an image cross a system page
|
|||
boundary. Input devices may write padding bytes, the value is
|
||||
undefined. Output devices ignore the contents of padding
|
||||
bytes.</para><para>When the image format is planar the
|
||||
<structfield>bytesperline</structfield> value applies to the largest
|
||||
<structfield>bytesperline</structfield> value applies to the first
|
||||
plane and is divided by the same factor as the
|
||||
<structfield>width</structfield> field for any smaller planes. For
|
||||
<structfield>width</structfield> field for the other planes. For
|
||||
example the Cb and Cr planes of a YUV 4:2:0 image have half as many
|
||||
padding bytes following each line as the Y plane. To avoid ambiguities
|
||||
drivers must return a <structfield>bytesperline</structfield> value
|
||||
|
@ -182,14 +182,14 @@ see <xref linkend="colorspaces" />.</entry>
|
|||
</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>__u16</entry>
|
||||
<entry>__u32</entry>
|
||||
<entry><structfield>bytesperline</structfield></entry>
|
||||
<entry>Distance in bytes between the leftmost pixels in two adjacent
|
||||
lines. See &v4l2-pix-format;.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>__u16</entry>
|
||||
<entry><structfield>reserved[7]</structfield></entry>
|
||||
<entry><structfield>reserved[6]</structfield></entry>
|
||||
<entry>Reserved for future extensions. Should be zeroed by the
|
||||
application.</entry>
|
||||
</row>
|
||||
|
@ -483,8 +483,8 @@ is the Y'CbCr encoding identifier (&v4l2-ycbcr-encoding;) to specify non-standar
|
|||
Y'CbCr encodings and the third is the quantization identifier (&v4l2-quantization;)
|
||||
to specify non-standard quantization methods. Most of the time only the colorspace
|
||||
field of &v4l2-pix-format; or &v4l2-pix-format-mplane; needs to be filled in. Note
|
||||
that the default R'G'B' quantization is always full range for all colorspaces,
|
||||
so this won't be mentioned explicitly for each colorspace description.</para>
|
||||
that the default R'G'B' quantization is full range for all colorspaces except for
|
||||
BT.2020 which uses limited range R'G'B' quantization.</para>
|
||||
|
||||
<table pgwide="1" frame="none" id="v4l2-colorspace">
|
||||
<title>V4L2 Colorspaces</title>
|
||||
|
@ -598,7 +598,8 @@ so this won't be mentioned explicitly for each colorspace description.</para>
|
|||
<row>
|
||||
<entry><constant>V4L2_QUANTIZATION_DEFAULT</constant></entry>
|
||||
<entry>Use the default quantization encoding as defined by the colorspace.
|
||||
This is always full range for R'G'B' and usually limited range for Y'CbCr.</entry>
|
||||
This is always full range for R'G'B' (except for the BT.2020 colorspace) and usually
|
||||
limited range for Y'CbCr.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_QUANTIZATION_FULL_RANGE</constant></entry>
|
||||
|
@ -620,8 +621,8 @@ is mapped to [16…235]. Cb and Cr are mapped from [-0.5…0.5] to [16
|
|||
|
||||
<section>
|
||||
<title>Detailed Colorspace Descriptions</title>
|
||||
<section>
|
||||
<title id="col-smpte-170m">Colorspace SMPTE 170M (<constant>V4L2_COLORSPACE_SMPTE170M</constant>)</title>
|
||||
<section id="col-smpte-170m">
|
||||
<title>Colorspace SMPTE 170M (<constant>V4L2_COLORSPACE_SMPTE170M</constant>)</title>
|
||||
<para>The <xref linkend="smpte170m" /> standard defines the colorspace used by NTSC and PAL and by SDTV
|
||||
in general. The default Y'CbCr encoding is <constant>V4L2_YCBCR_ENC_601</constant>.
|
||||
The default Y'CbCr quantization is limited range. The chromaticities of the primary colors and
|
||||
|
@ -666,8 +667,7 @@ as the SMPTE C set, so this colorspace is sometimes called SMPTE C as well.</par
|
|||
<variablelist>
|
||||
<varlistentry>
|
||||
<term>The transfer function defined for SMPTE 170M is the same as the
|
||||
one defined in Rec. 709. Normally L is in the range [0…1], but for the extended
|
||||
gamut xvYCC encoding values outside that range are allowed.</term>
|
||||
one defined in Rec. 709.</term>
|
||||
<listitem>
|
||||
<para>L' = -1.099(-L)<superscript>0.45</superscript> + 0.099 for L ≤ -0.018</para>
|
||||
<para>L' = 4.5L for -0.018 < L < 0.018</para>
|
||||
|
@ -702,29 +702,10 @@ defined in the <xref linkend="itu601" /> standard and this colorspace is sometim
|
|||
though BT.601 does not mention any color primaries.</para>
|
||||
<para>The default quantization is limited range, but full range is possible although
|
||||
rarely seen.</para>
|
||||
<para>The <constant>V4L2_YCBCR_ENC_601</constant> encoding as described above is the
|
||||
default for this colorspace, but it can be overridden with <constant>V4L2_YCBCR_ENC_709</constant>,
|
||||
in which case the Rec. 709 Y'CbCr encoding is used.</para>
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term>The xvYCC 601 encoding (<constant>V4L2_YCBCR_ENC_XV601</constant>, <xref linkend="xvycc" />) is similar
|
||||
to the BT.601 encoding, but it allows for R', G' and B' values that are outside the range
|
||||
[0…1]. The resulting Y', Cb and Cr values are scaled and offset:</term>
|
||||
<listitem>
|
||||
<para>Y' = (219 / 255) * (0.299R' + 0.587G' + 0.114B') + (16 / 255)</para>
|
||||
<para>Cb = (224 / 255) * (-0.169R' - 0.331G' + 0.5B')</para>
|
||||
<para>Cr = (224 / 255) * (0.5R' - 0.419G' - 0.081B')</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
<para>Y' is clamped to the range [0…1] and Cb and Cr are clamped
|
||||
to the range [-0.5…0.5]. The non-standard xvYCC 709 encoding can also be used by selecting
|
||||
<constant>V4L2_YCBCR_ENC_XV709</constant>. The xvYCC encodings always use full range
|
||||
quantization.</para>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<title id="col-rec709">Colorspace Rec. 709 (<constant>V4L2_COLORSPACE_REC709</constant>)</title>
|
||||
<section id="col-rec709">
|
||||
<title>Colorspace Rec. 709 (<constant>V4L2_COLORSPACE_REC709</constant>)</title>
|
||||
<para>The <xref linkend="itu709" /> standard defines the colorspace used by HDTV in general. The default
|
||||
Y'CbCr encoding is <constant>V4L2_YCBCR_ENC_709</constant>. The default Y'CbCr quantization is
|
||||
limited range. The chromaticities of the primary colors and the white reference are:</para>
|
||||
|
@ -803,26 +784,39 @@ rarely seen.</para>
|
|||
<para>The <constant>V4L2_YCBCR_ENC_709</constant> encoding described above is the default
|
||||
for this colorspace, but it can be overridden with <constant>V4L2_YCBCR_ENC_601</constant>, in which
|
||||
case the BT.601 Y'CbCr encoding is used.</para>
|
||||
<para>Two additional extended gamut Y'CbCr encodings are also possible with this colorspace:</para>
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term>The xvYCC 709 encoding (<constant>V4L2_YCBCR_ENC_XV709</constant>, <xref linkend="xvycc" />)
|
||||
is similar to the Rec. 709 encoding, but it allows for R', G' and B' values that are outside the range
|
||||
[0…1]. The resulting Y', Cb and Cr values are scaled and offset:</term>
|
||||
<listitem>
|
||||
<para>Y' = (219 / 255) * (0.2126R' + 0.7152G' + 0.0722B') + (16 / 255)</para>
|
||||
<para>Cb = (224 / 255) * (-0.1146R' - 0.3854G' + 0.5B')</para>
|
||||
<para>Cr = (224 / 255) * (0.5R' - 0.4542G' - 0.0458B')</para>
|
||||
<para>Y' = (219 / 256) * (0.2126R' + 0.7152G' + 0.0722B') + (16 / 256)</para>
|
||||
<para>Cb = (224 / 256) * (-0.1146R' - 0.3854G' + 0.5B')</para>
|
||||
<para>Cr = (224 / 256) * (0.5R' - 0.4542G' - 0.0458B')</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term>The xvYCC 601 encoding (<constant>V4L2_YCBCR_ENC_XV601</constant>, <xref linkend="xvycc" />) is similar
|
||||
to the BT.601 encoding, but it allows for R', G' and B' values that are outside the range
|
||||
[0…1]. The resulting Y', Cb and Cr values are scaled and offset:</term>
|
||||
<listitem>
|
||||
<para>Y' = (219 / 256) * (0.299R' + 0.587G' + 0.114B') + (16 / 256)</para>
|
||||
<para>Cb = (224 / 256) * (-0.169R' - 0.331G' + 0.5B')</para>
|
||||
<para>Cr = (224 / 256) * (0.5R' - 0.419G' - 0.081B')</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
<para>Y' is clamped to the range [0…1] and Cb and Cr are clamped
|
||||
to the range [-0.5…0.5]. The non-standard xvYCC 601 encoding can also be used by
|
||||
selecting <constant>V4L2_YCBCR_ENC_XV601</constant>. The xvYCC encodings always use full
|
||||
range quantization.</para>
|
||||
to the range [-0.5…0.5]. The non-standard xvYCC 709 or xvYCC 601 encodings can be used by
|
||||
selecting <constant>V4L2_YCBCR_ENC_XV709</constant> or <constant>V4L2_YCBCR_ENC_XV601</constant>.
|
||||
The xvYCC encodings always use full range quantization.</para>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<title id="col-srgb">Colorspace sRGB (<constant>V4L2_COLORSPACE_SRGB</constant>)</title>
|
||||
<section id="col-srgb">
|
||||
<title>Colorspace sRGB (<constant>V4L2_COLORSPACE_SRGB</constant>)</title>
|
||||
<para>The <xref linkend="srgb" /> standard defines the colorspace used by most webcams and computer graphics. The
|
||||
default Y'CbCr encoding is <constant>V4L2_YCBCR_ENC_SYCC</constant>. The default Y'CbCr quantization
|
||||
is full range. The chromaticities of the primary colors and the white reference are:</para>
|
||||
|
@ -898,8 +892,8 @@ encoding, it is not. The <constant>V4L2_YCBCR_ENC_XV601</constant> scales and of
|
|||
values before quantization, but this encoding does not do that.</para>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<title id="col-adobergb">Colorspace Adobe RGB (<constant>V4L2_COLORSPACE_ADOBERGB</constant>)</title>
|
||||
<section id="col-adobergb">
|
||||
<title>Colorspace Adobe RGB (<constant>V4L2_COLORSPACE_ADOBERGB</constant>)</title>
|
||||
<para>The <xref linkend="adobergb" /> standard defines the colorspace used by computer graphics
|
||||
that use the AdobeRGB colorspace. This is also known as the <xref linkend="oprgb" /> standard.
|
||||
The default Y'CbCr encoding is <constant>V4L2_YCBCR_ENC_601</constant>. The default Y'CbCr
|
||||
|
@ -970,12 +964,12 @@ clamped to the range [-0.5…0.5]. This transform is identical to one defin
|
|||
SMPTE 170M/BT.601. The Y'CbCr quantization is limited range.</para>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<title id="col-bt2020">Colorspace BT.2020 (<constant>V4L2_COLORSPACE_BT2020</constant>)</title>
|
||||
<section id="col-bt2020">
|
||||
<title>Colorspace BT.2020 (<constant>V4L2_COLORSPACE_BT2020</constant>)</title>
|
||||
<para>The <xref linkend="itu2020" /> standard defines the colorspace used by Ultra-high definition
|
||||
television (UHDTV). The default Y'CbCr encoding is <constant>V4L2_YCBCR_ENC_BT2020</constant>.
|
||||
The default Y'CbCr quantization is limited range. The chromaticities of the primary colors and
|
||||
the white reference are:</para>
|
||||
The default R'G'B' quantization is limited range (!), and so is the default Y'CbCr quantization.
|
||||
The chromaticities of the primary colors and the white reference are:</para>
|
||||
<table frame="none">
|
||||
<title>BT.2020 Chromaticities</title>
|
||||
<tgroup cols="3" align="left">
|
||||
|
@ -1032,7 +1026,7 @@ the white reference are:</para>
|
|||
<term>The luminance (Y') and color difference (Cb and Cr) are obtained with the
|
||||
following <constant>V4L2_YCBCR_ENC_BT2020</constant> encoding:</term>
|
||||
<listitem>
|
||||
<para>Y' = 0.2627R' + 0.6789G' + 0.0593B'</para>
|
||||
<para>Y' = 0.2627R' + 0.6780G' + 0.0593B'</para>
|
||||
<para>Cb = -0.1396R' - 0.3604G' + 0.5B'</para>
|
||||
<para>Cr = 0.5R' - 0.4598G' - 0.0402B'</para>
|
||||
</listitem>
|
||||
|
@ -1046,7 +1040,7 @@ clamped to the range [-0.5…0.5]. The Y'CbCr quantization is limited range
|
|||
<varlistentry>
|
||||
<term>Luma:</term>
|
||||
<listitem>
|
||||
<para>Yc' = (0.2627R + 0.6789G + 0.0593B)'</para>
|
||||
<para>Yc' = (0.2627R + 0.6780G + 0.0593B)'</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
|
@ -1054,7 +1048,7 @@ clamped to the range [-0.5…0.5]. The Y'CbCr quantization is limited range
|
|||
<varlistentry>
|
||||
<term>B' - Yc' ≤ 0:</term>
|
||||
<listitem>
|
||||
<para>Cbc = (B' - Y') / 1.9404</para>
|
||||
<para>Cbc = (B' - Yc') / 1.9404</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
|
@ -1062,7 +1056,7 @@ clamped to the range [-0.5…0.5]. The Y'CbCr quantization is limited range
|
|||
<varlistentry>
|
||||
<term>B' - Yc' > 0:</term>
|
||||
<listitem>
|
||||
<para>Cbc = (B' - Y') / 1.5816</para>
|
||||
<para>Cbc = (B' - Yc') / 1.5816</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
|
@ -1086,8 +1080,8 @@ clamped to the range [-0.5…0.5]. The Y'CbCr quantization is limited range
|
|||
clamped to the range [-0.5…0.5]. The Yc'CbcCrc quantization is limited range.</para>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<title id="col-smpte-240m">Colorspace SMPTE 240M (<constant>V4L2_COLORSPACE_SMPTE240M</constant>)</title>
|
||||
<section id="col-smpte-240m">
|
||||
<title>Colorspace SMPTE 240M (<constant>V4L2_COLORSPACE_SMPTE240M</constant>)</title>
|
||||
<para>The <xref linkend="smpte240m" /> standard was an interim standard used during the early days of HDTV (1988-1998).
|
||||
It has been superseded by Rec. 709. The default Y'CbCr encoding is <constant>V4L2_YCBCR_ENC_SMPTE240M</constant>.
|
||||
The default Y'CbCr quantization is limited range. The chromaticities of the primary colors and the
|
||||
|
@ -1159,8 +1153,8 @@ following <constant>V4L2_YCBCR_ENC_SMPTE240M</constant> encoding:</term>
|
|||
clamped to the range [-0.5…0.5]. The Y'CbCr quantization is limited range.</para>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<title id="col-sysm">Colorspace NTSC 1953 (<constant>V4L2_COLORSPACE_470_SYSTEM_M</constant>)</title>
|
||||
<section id="col-sysm">
|
||||
<title>Colorspace NTSC 1953 (<constant>V4L2_COLORSPACE_470_SYSTEM_M</constant>)</title>
|
||||
<para>This standard defines the colorspace used by NTSC in 1953. In practice this
|
||||
colorspace is obsolete and SMPTE 170M should be used instead. The default Y'CbCr encoding
|
||||
is <constant>V4L2_YCBCR_ENC_601</constant>. The default Y'CbCr quantization is limited range.
|
||||
|
@ -1237,8 +1231,8 @@ clamped to the range [-0.5…0.5]. The Y'CbCr quantization is limited range
|
|||
This transform is identical to one defined in SMPTE 170M/BT.601.</para>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<title id="col-sysbg">Colorspace EBU Tech. 3213 (<constant>V4L2_COLORSPACE_470_SYSTEM_BG</constant>)</title>
|
||||
<section id="col-sysbg">
|
||||
<title>Colorspace EBU Tech. 3213 (<constant>V4L2_COLORSPACE_470_SYSTEM_BG</constant>)</title>
|
||||
<para>The <xref linkend="tech3213" /> standard defines the colorspace used by PAL/SECAM in 1975. In practice this
|
||||
colorspace is obsolete and SMPTE 170M should be used instead. The default Y'CbCr encoding
|
||||
is <constant>V4L2_YCBCR_ENC_601</constant>. The default Y'CbCr quantization is limited range.
|
||||
|
@ -1311,8 +1305,8 @@ clamped to the range [-0.5…0.5]. The Y'CbCr quantization is limited range
|
|||
This transform is identical to one defined in SMPTE 170M/BT.601.</para>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<title id="col-jpeg">Colorspace JPEG (<constant>V4L2_COLORSPACE_JPEG</constant>)</title>
|
||||
<section id="col-jpeg">
|
||||
<title>Colorspace JPEG (<constant>V4L2_COLORSPACE_JPEG</constant>)</title>
|
||||
<para>This colorspace defines the colorspace used by most (Motion-)JPEG formats. The chromaticities
|
||||
of the primary colors and the white reference are identical to sRGB. The Y'CbCr encoding is
|
||||
<constant>V4L2_YCBCR_ENC_601</constant> with full range quantization where
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -136,6 +136,7 @@ Remote Controller chapter.</contrib>
|
|||
<year>2012</year>
|
||||
<year>2013</year>
|
||||
<year>2014</year>
|
||||
<year>2015</year>
|
||||
<holder>Bill Dirks, Michael H. Schimek, Hans Verkuil, Martin
|
||||
Rubli, Andy Walls, Muralidharan Karicheri, Mauro Carvalho Chehab,
|
||||
Pawel Osciak</holder>
|
||||
|
@ -151,6 +152,14 @@ structs, ioctls) must be noted in more detail in the history chapter
|
|||
(compat.xml), along with the possible impact on existing drivers and
|
||||
applications. -->
|
||||
|
||||
<revision>
|
||||
<revnumber>3.21</revnumber>
|
||||
<date>2015-02-13</date>
|
||||
<authorinitials>mcc</authorinitials>
|
||||
<revremark>Fix documentation for media controller device nodes and add support for DVB device nodes.
|
||||
Add support for Tuner sub-device.
|
||||
</revremark>
|
||||
</revision>
|
||||
<revision>
|
||||
<revnumber>3.19</revnumber>
|
||||
<date>2014-12-05</date>
|
||||
|
|
|
@ -59,6 +59,11 @@ constant except when switching the video standard. Remember this
|
|||
switch can occur implicit when switching the video input or
|
||||
output.</para>
|
||||
|
||||
<para>Do not use the multiplanar buffer types. Use <constant>V4L2_BUF_TYPE_VIDEO_CAPTURE</constant>
|
||||
instead of <constant>V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE</constant>
|
||||
and use <constant>V4L2_BUF_TYPE_VIDEO_OUTPUT</constant> instead of
|
||||
<constant>V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE</constant>.</para>
|
||||
|
||||
<para>This ioctl must be implemented for video capture or output devices that
|
||||
support cropping and/or scaling and/or have non-square pixels, and for overlay devices.</para>
|
||||
|
||||
|
@ -73,9 +78,7 @@ support cropping and/or scaling and/or have non-square pixels, and for overlay d
|
|||
<entry>Type of the data stream, set by the application.
|
||||
Only these types are valid here:
|
||||
<constant>V4L2_BUF_TYPE_VIDEO_CAPTURE</constant>,
|
||||
<constant>V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE</constant>,
|
||||
<constant>V4L2_BUF_TYPE_VIDEO_OUTPUT</constant>,
|
||||
<constant>V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE</constant> and
|
||||
<constant>V4L2_BUF_TYPE_VIDEO_OUTPUT</constant> and
|
||||
<constant>V4L2_BUF_TYPE_VIDEO_OVERLAY</constant>. See <xref linkend="v4l2-buf-type" />.</entry>
|
||||
</row>
|
||||
<row>
|
||||
|
|
|
@ -64,7 +64,7 @@
|
|||
<entry>__u32</entry>
|
||||
<entry><structfield>type</structfield></entry>
|
||||
<entry></entry>
|
||||
<entry>Type of the event.</entry>
|
||||
<entry>Type of the event, see <xref linkend="event-type" />.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>union</entry>
|
||||
|
@ -154,6 +154,113 @@
|
|||
</tgroup>
|
||||
</table>
|
||||
|
||||
<table frame="none" pgwide="1" id="event-type">
|
||||
<title>Event Types</title>
|
||||
<tgroup cols="3">
|
||||
&cs-def;
|
||||
<tbody valign="top">
|
||||
<row>
|
||||
<entry><constant>V4L2_EVENT_ALL</constant></entry>
|
||||
<entry>0</entry>
|
||||
<entry>All events. V4L2_EVENT_ALL is valid only for
|
||||
VIDIOC_UNSUBSCRIBE_EVENT for unsubscribing all events at once.
|
||||
</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_EVENT_VSYNC</constant></entry>
|
||||
<entry>1</entry>
|
||||
<entry>This event is triggered on the vertical sync.
|
||||
This event has a &v4l2-event-vsync; associated with it.
|
||||
</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_EVENT_EOS</constant></entry>
|
||||
<entry>2</entry>
|
||||
<entry>This event is triggered when the end of a stream is reached.
|
||||
This is typically used with MPEG decoders to report to the application
|
||||
when the last of the MPEG stream has been decoded.
|
||||
</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_EVENT_CTRL</constant></entry>
|
||||
<entry>3</entry>
|
||||
<entry><para>This event requires that the <structfield>id</structfield>
|
||||
matches the control ID from which you want to receive events.
|
||||
This event is triggered if the control's value changes, if a
|
||||
button control is pressed or if the control's flags change.
|
||||
This event has a &v4l2-event-ctrl; associated with it. This struct
|
||||
contains much of the same information as &v4l2-queryctrl; and
|
||||
&v4l2-control;.</para>
|
||||
|
||||
<para>If the event is generated due to a call to &VIDIOC-S-CTRL; or
|
||||
&VIDIOC-S-EXT-CTRLS;, then the event will <emphasis>not</emphasis> be sent to
|
||||
the file handle that called the ioctl function. This prevents
|
||||
nasty feedback loops. If you <emphasis>do</emphasis> want to get the
|
||||
event, then set the <constant>V4L2_EVENT_SUB_FL_ALLOW_FEEDBACK</constant>
|
||||
flag.
|
||||
</para>
|
||||
|
||||
<para>This event type will ensure that no information is lost when
|
||||
more events are raised than there is room internally. In that
|
||||
case the &v4l2-event-ctrl; of the second-oldest event is kept,
|
||||
but the <structfield>changes</structfield> field of the
|
||||
second-oldest event is ORed with the <structfield>changes</structfield>
|
||||
field of the oldest event.</para>
|
||||
</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_EVENT_FRAME_SYNC</constant></entry>
|
||||
<entry>4</entry>
|
||||
<entry>
|
||||
<para>Triggered immediately when the reception of a
|
||||
frame has begun. This event has a
|
||||
&v4l2-event-frame-sync; associated with it.</para>
|
||||
|
||||
<para>If the hardware needs to be stopped in the case of a
|
||||
buffer underrun it might not be able to generate this event.
|
||||
In such cases the <structfield>frame_sequence</structfield>
|
||||
field in &v4l2-event-frame-sync; will not be incremented. This
|
||||
causes two consecutive frame sequence numbers to have n times
|
||||
frame interval in between them.</para>
|
||||
</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_EVENT_SOURCE_CHANGE</constant></entry>
|
||||
<entry>5</entry>
|
||||
<entry>
|
||||
<para>This event is triggered when a source parameter change is
|
||||
detected during runtime by the video device. It can be a
|
||||
runtime resolution change triggered by a video decoder or the
|
||||
format change happening on an input connector.
|
||||
This event requires that the <structfield>id</structfield>
|
||||
matches the input index (when used with a video device node)
|
||||
or the pad index (when used with a subdevice node) from which
|
||||
you want to receive events.</para>
|
||||
|
||||
<para>This event has a &v4l2-event-src-change; associated
|
||||
with it. The <structfield>changes</structfield> bitfield denotes
|
||||
what has changed for the subscribed pad. If multiple events
|
||||
occurred before application could dequeue them, then the changes
|
||||
will have the ORed value of all the events generated.</para>
|
||||
</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_EVENT_MOTION_DET</constant></entry>
|
||||
<entry>6</entry>
|
||||
<entry>
|
||||
<para>Triggered whenever the motion detection state for one or more of the regions
|
||||
changes. This event has a &v4l2-event-motion-det; associated with it.</para>
|
||||
</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_EVENT_PRIVATE_START</constant></entry>
|
||||
<entry>0x08000000</entry>
|
||||
<entry>Base event number for driver-private events.</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
|
||||
<table frame="none" pgwide="1" id="v4l2-event-vsync">
|
||||
<title>struct <structname>v4l2_event_vsync</structname></title>
|
||||
<tgroup cols="3">
|
||||
|
@ -177,7 +284,7 @@
|
|||
<entry>__u32</entry>
|
||||
<entry><structfield>changes</structfield></entry>
|
||||
<entry></entry>
|
||||
<entry>A bitmask that tells what has changed. See <xref linkend="changes-flags" />.</entry>
|
||||
<entry>A bitmask that tells what has changed. See <xref linkend="ctrl-changes-flags" />.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>__u32</entry>
|
||||
|
@ -309,8 +416,8 @@
|
|||
</tgroup>
|
||||
</table>
|
||||
|
||||
<table pgwide="1" frame="none" id="changes-flags">
|
||||
<title>Changes</title>
|
||||
<table pgwide="1" frame="none" id="ctrl-changes-flags">
|
||||
<title>Control Changes</title>
|
||||
<tgroup cols="3">
|
||||
&cs-def;
|
||||
<tbody valign="top">
|
||||
|
@ -318,9 +425,9 @@
|
|||
<entry><constant>V4L2_EVENT_CTRL_CH_VALUE</constant></entry>
|
||||
<entry>0x0001</entry>
|
||||
<entry>This control event was triggered because the value of the control
|
||||
changed. Special case: if a button control is pressed, then this
|
||||
event is sent as well, even though there is not explicit value
|
||||
associated with a button control.</entry>
|
||||
changed. Special cases: Volatile controls do no generate this event;
|
||||
If a control has the <constant>V4L2_CTRL_FLAG_EXECUTE_ON_WRITE</constant>
|
||||
flag set, then this event is sent as well, regardless its value.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_EVENT_CTRL_CH_FLAGS</constant></entry>
|
||||
|
|
|
@ -70,6 +70,11 @@ structure or returns the &EINVAL; if cropping is not supported.</para>
|
|||
<constant>VIDIOC_S_CROP</constant> ioctl with a pointer to this
|
||||
structure.</para>
|
||||
|
||||
<para>Do not use the multiplanar buffer types. Use <constant>V4L2_BUF_TYPE_VIDEO_CAPTURE</constant>
|
||||
instead of <constant>V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE</constant>
|
||||
and use <constant>V4L2_BUF_TYPE_VIDEO_OUTPUT</constant> instead of
|
||||
<constant>V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE</constant>.</para>
|
||||
|
||||
<para>The driver first adjusts the requested dimensions against
|
||||
hardware limits, &ie; the bounds given by the capture/output window,
|
||||
and it rounds to the closest possible values of horizontal and
|
||||
|
|
|
@ -318,10 +318,20 @@ can't generate such frequencies, then the flag will also be cleared.
|
|||
</row>
|
||||
<row>
|
||||
<entry>V4L2_DV_FL_HALF_LINE</entry>
|
||||
<entry>Specific to interlaced formats: if set, then field 1 (aka the odd field)
|
||||
is really one half-line longer and field 2 (aka the even field) is really one half-line
|
||||
shorter, so each field has exactly the same number of half-lines. Whether half-lines can be
|
||||
detected or used depends on the hardware.
|
||||
<entry>Specific to interlaced formats: if set, then the vertical frontporch
|
||||
of field 1 (aka the odd field) is really one half-line longer and the vertical backporch
|
||||
of field 2 (aka the even field) is really one half-line shorter, so each field has exactly
|
||||
the same number of half-lines. Whether half-lines can be detected or used depends on
|
||||
the hardware.
|
||||
</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>V4L2_DV_FL_IS_CE_VIDEO</entry>
|
||||
<entry>If set, then this is a Consumer Electronics (CE) video format.
|
||||
Such formats differ from other formats (commonly called IT formats) in that if
|
||||
R'G'B' encoding is used then by default the R'G'B' values use limited range
|
||||
(i.e. 16-235) as opposed to full range (i.e. 0-255). All formats defined in CEA-861
|
||||
except for the 640x480p59.94 format are CE formats.
|
||||
</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
|
|
|
@ -240,9 +240,9 @@ where padding bytes after the last line of an image cross a system
|
|||
page boundary. Capture devices may write padding bytes, the value is
|
||||
undefined. Output devices ignore the contents of padding
|
||||
bytes.</para><para>When the image format is planar the
|
||||
<structfield>bytesperline</structfield> value applies to the largest
|
||||
<structfield>bytesperline</structfield> value applies to the first
|
||||
plane and is divided by the same factor as the
|
||||
<structfield>width</structfield> field for any smaller planes. For
|
||||
<structfield>width</structfield> field for the other planes. For
|
||||
example the Cb and Cr planes of a YUV 4:2:0 image have half as many
|
||||
padding bytes following each line as the Y plane. To avoid ambiguities
|
||||
drivers must return a <structfield>bytesperline</structfield> value
|
||||
|
|
|
@ -60,8 +60,8 @@
|
|||
|
||||
<para>To query the cropping (composing) rectangle set &v4l2-selection;
|
||||
<structfield> type </structfield> field to the respective buffer type.
|
||||
Do not use multiplanar buffers. Use <constant>V4L2_BUF_TYPE_VIDEO_CAPTURE</constant>
|
||||
instead of <constant>V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE</constant>. Use
|
||||
Do not use the multiplanar buffer types. Use <constant>V4L2_BUF_TYPE_VIDEO_CAPTURE</constant>
|
||||
instead of <constant>V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE</constant> and use
|
||||
<constant>V4L2_BUF_TYPE_VIDEO_OUTPUT</constant> instead of
|
||||
<constant>V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE</constant>. The next step is
|
||||
setting the value of &v4l2-selection; <structfield>target</structfield> field
|
||||
|
|
|
@ -205,7 +205,7 @@ ETS 300 231, lsb first transmitted.</entry>
|
|||
<row>
|
||||
<entry><constant>V4L2_SLICED_CAPTION_525</constant></entry>
|
||||
<entry>0x1000</entry>
|
||||
<entry><xref linkend="eia608" /></entry>
|
||||
<entry><xref linkend="cea608" /></entry>
|
||||
<entry>NTSC line 21, 284 (second field 21)</entry>
|
||||
<entry>Two bytes in transmission order, including parity
|
||||
bit, lsb first transmitted.</entry>
|
||||
|
|
|
@ -102,10 +102,10 @@ The bus_info must start with "PCI:" for PCI boards, "PCIe:" for PCI Express boar
|
|||
<entry>__u32</entry>
|
||||
<entry><structfield>version</structfield></entry>
|
||||
<entry><para>Version number of the driver.</para>
|
||||
<para>Starting on kernel 3.1, the version reported is provided per
|
||||
V4L2 subsystem, following the same Kernel numberation scheme. However, it
|
||||
should not always return the same version as the kernel, if, for example,
|
||||
an stable or distribution-modified kernel uses the V4L2 stack from a
|
||||
<para>Starting with kernel 3.1, the version reported is provided by the
|
||||
V4L2 subsystem following the kernel numbering scheme. However, it
|
||||
may not always return the same version as the kernel if, for example,
|
||||
a stable or distribution-modified kernel uses the V4L2 stack from a
|
||||
newer kernel.</para>
|
||||
<para>The version number is formatted using the
|
||||
<constant>KERNEL_VERSION()</constant> macro:</para></entry>
|
||||
|
|
|
@ -600,7 +600,9 @@ writing a value will cause the device to carry out a given action
|
|||
changes continuously. A typical example would be the current gain value if the device
|
||||
is in auto-gain mode. In such a case the hardware calculates the gain value based on
|
||||
the lighting conditions which can change over time. Note that setting a new value for
|
||||
a volatile control will have no effect. The new value will just be ignored.</entry>
|
||||
a volatile control will have no effect and no <constant>V4L2_EVENT_CTRL_CH_VALUE</constant>
|
||||
will be sent, unless the <constant>V4L2_CTRL_FLAG_EXECUTE_ON_WRITE</constant> flag
|
||||
(see below) is also set. Otherwise the new value will just be ignored.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_CTRL_FLAG_HAS_PAYLOAD</constant></entry>
|
||||
|
@ -610,6 +612,14 @@ using one of the pointer fields of &v4l2-ext-control;. This flag is set for cont
|
|||
that are an array, string, or have a compound type. In all cases you have to set a
|
||||
pointer to memory containing the payload of the control.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_CTRL_FLAG_EXECUTE_ON_WRITE</constant></entry>
|
||||
<entry>0x0200</entry>
|
||||
<entry>The value provided to the control will be propagated to the driver
|
||||
even if remains constant. This is required when the control represents an action
|
||||
on the hardware. For example: clearing an error flag or triggering the flash. All the
|
||||
controls of the type <constant>V4L2_CTRL_TYPE_BUTTON</constant> have this flag set.</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
|
|
|
@ -67,9 +67,9 @@
|
|||
|
||||
<para>To enumerate frame intervals applications initialize the
|
||||
<structfield>index</structfield>, <structfield>pad</structfield>,
|
||||
<structfield>code</structfield>, <structfield>width</structfield> and
|
||||
<structfield>height</structfield> fields of
|
||||
&v4l2-subdev-frame-interval-enum; and call the
|
||||
<structfield>which</structfield>, <structfield>code</structfield>,
|
||||
<structfield>width</structfield> and <structfield>height</structfield>
|
||||
fields of &v4l2-subdev-frame-interval-enum; and call the
|
||||
<constant>VIDIOC_SUBDEV_ENUM_FRAME_INTERVAL</constant> ioctl with a pointer
|
||||
to this structure. Drivers fill the rest of the structure or return
|
||||
an &EINVAL; if one of the input fields is invalid. All frame intervals are
|
||||
|
@ -123,7 +123,12 @@
|
|||
</row>
|
||||
<row>
|
||||
<entry>__u32</entry>
|
||||
<entry><structfield>reserved</structfield>[9]</entry>
|
||||
<entry><structfield>which</structfield></entry>
|
||||
<entry>Frame intervals to be enumerated, from &v4l2-subdev-format-whence;.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>__u32</entry>
|
||||
<entry><structfield>reserved</structfield>[8]</entry>
|
||||
<entry>Reserved for future extensions. Applications and drivers must
|
||||
set the array to zero.</entry>
|
||||
</row>
|
||||
|
|
|
@ -61,9 +61,9 @@
|
|||
ioctl.</para>
|
||||
|
||||
<para>To enumerate frame sizes applications initialize the
|
||||
<structfield>pad</structfield>, <structfield>code</structfield> and
|
||||
<structfield>index</structfield> fields of the
|
||||
&v4l2-subdev-mbus-code-enum; and call the
|
||||
<structfield>pad</structfield>, <structfield>which</structfield> ,
|
||||
<structfield>code</structfield> and <structfield>index</structfield>
|
||||
fields of the &v4l2-subdev-mbus-code-enum; and call the
|
||||
<constant>VIDIOC_SUBDEV_ENUM_FRAME_SIZE</constant> ioctl with a pointer to
|
||||
the structure. Drivers fill the minimum and maximum frame sizes or return
|
||||
an &EINVAL; if one of the input parameters is invalid.</para>
|
||||
|
@ -127,7 +127,12 @@
|
|||
</row>
|
||||
<row>
|
||||
<entry>__u32</entry>
|
||||
<entry><structfield>reserved</structfield>[9]</entry>
|
||||
<entry><structfield>which</structfield></entry>
|
||||
<entry>Frame sizes to be enumerated, from &v4l2-subdev-format-whence;.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>__u32</entry>
|
||||
<entry><structfield>reserved</structfield>[8]</entry>
|
||||
<entry>Reserved for future extensions. Applications and drivers must
|
||||
set the array to zero.</entry>
|
||||
</row>
|
||||
|
|
|
@ -56,8 +56,8 @@
|
|||
</note>
|
||||
|
||||
<para>To enumerate media bus formats available at a given sub-device pad
|
||||
applications initialize the <structfield>pad</structfield> and
|
||||
<structfield>index</structfield> fields of &v4l2-subdev-mbus-code-enum; and
|
||||
applications initialize the <structfield>pad</structfield>, <structfield>which</structfield>
|
||||
and <structfield>index</structfield> fields of &v4l2-subdev-mbus-code-enum; and
|
||||
call the <constant>VIDIOC_SUBDEV_ENUM_MBUS_CODE</constant> ioctl with a
|
||||
pointer to this structure. Drivers fill the rest of the structure or return
|
||||
an &EINVAL; if either the <structfield>pad</structfield> or
|
||||
|
@ -93,7 +93,12 @@
|
|||
</row>
|
||||
<row>
|
||||
<entry>__u32</entry>
|
||||
<entry><structfield>reserved</structfield>[9]</entry>
|
||||
<entry><structfield>which</structfield></entry>
|
||||
<entry>Media bus format codes to be enumerated, from &v4l2-subdev-format-whence;.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>__u32</entry>
|
||||
<entry><structfield>reserved</structfield>[8]</entry>
|
||||
<entry>Reserved for future extensions. Applications and drivers must
|
||||
set the array to zero.</entry>
|
||||
</row>
|
||||
|
|
|
@ -60,7 +60,9 @@
|
|||
<row>
|
||||
<entry>__u32</entry>
|
||||
<entry><structfield>type</structfield></entry>
|
||||
<entry>Type of the event.</entry>
|
||||
<entry>Type of the event, see <xref linkend="event-type" />. Note that
|
||||
<constant>V4L2_EVENT_ALL</constant> can be used with VIDIOC_UNSUBSCRIBE_EVENT
|
||||
for unsubscribing all events at once.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>__u32</entry>
|
||||
|
@ -84,113 +86,6 @@
|
|||
</tgroup>
|
||||
</table>
|
||||
|
||||
<table frame="none" pgwide="1" id="event-type">
|
||||
<title>Event Types</title>
|
||||
<tgroup cols="3">
|
||||
&cs-def;
|
||||
<tbody valign="top">
|
||||
<row>
|
||||
<entry><constant>V4L2_EVENT_ALL</constant></entry>
|
||||
<entry>0</entry>
|
||||
<entry>All events. V4L2_EVENT_ALL is valid only for
|
||||
VIDIOC_UNSUBSCRIBE_EVENT for unsubscribing all events at once.
|
||||
</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_EVENT_VSYNC</constant></entry>
|
||||
<entry>1</entry>
|
||||
<entry>This event is triggered on the vertical sync.
|
||||
This event has a &v4l2-event-vsync; associated with it.
|
||||
</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_EVENT_EOS</constant></entry>
|
||||
<entry>2</entry>
|
||||
<entry>This event is triggered when the end of a stream is reached.
|
||||
This is typically used with MPEG decoders to report to the application
|
||||
when the last of the MPEG stream has been decoded.
|
||||
</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_EVENT_CTRL</constant></entry>
|
||||
<entry>3</entry>
|
||||
<entry><para>This event requires that the <structfield>id</structfield>
|
||||
matches the control ID from which you want to receive events.
|
||||
This event is triggered if the control's value changes, if a
|
||||
button control is pressed or if the control's flags change.
|
||||
This event has a &v4l2-event-ctrl; associated with it. This struct
|
||||
contains much of the same information as &v4l2-queryctrl; and
|
||||
&v4l2-control;.</para>
|
||||
|
||||
<para>If the event is generated due to a call to &VIDIOC-S-CTRL; or
|
||||
&VIDIOC-S-EXT-CTRLS;, then the event will <emphasis>not</emphasis> be sent to
|
||||
the file handle that called the ioctl function. This prevents
|
||||
nasty feedback loops. If you <emphasis>do</emphasis> want to get the
|
||||
event, then set the <constant>V4L2_EVENT_SUB_FL_ALLOW_FEEDBACK</constant>
|
||||
flag.
|
||||
</para>
|
||||
|
||||
<para>This event type will ensure that no information is lost when
|
||||
more events are raised than there is room internally. In that
|
||||
case the &v4l2-event-ctrl; of the second-oldest event is kept,
|
||||
but the <structfield>changes</structfield> field of the
|
||||
second-oldest event is ORed with the <structfield>changes</structfield>
|
||||
field of the oldest event.</para>
|
||||
</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_EVENT_FRAME_SYNC</constant></entry>
|
||||
<entry>4</entry>
|
||||
<entry>
|
||||
<para>Triggered immediately when the reception of a
|
||||
frame has begun. This event has a
|
||||
&v4l2-event-frame-sync; associated with it.</para>
|
||||
|
||||
<para>If the hardware needs to be stopped in the case of a
|
||||
buffer underrun it might not be able to generate this event.
|
||||
In such cases the <structfield>frame_sequence</structfield>
|
||||
field in &v4l2-event-frame-sync; will not be incremented. This
|
||||
causes two consecutive frame sequence numbers to have n times
|
||||
frame interval in between them.</para>
|
||||
</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_EVENT_SOURCE_CHANGE</constant></entry>
|
||||
<entry>5</entry>
|
||||
<entry>
|
||||
<para>This event is triggered when a source parameter change is
|
||||
detected during runtime by the video device. It can be a
|
||||
runtime resolution change triggered by a video decoder or the
|
||||
format change happening on an input connector.
|
||||
This event requires that the <structfield>id</structfield>
|
||||
matches the input index (when used with a video device node)
|
||||
or the pad index (when used with a subdevice node) from which
|
||||
you want to receive events.</para>
|
||||
|
||||
<para>This event has a &v4l2-event-src-change; associated
|
||||
with it. The <structfield>changes</structfield> bitfield denotes
|
||||
what has changed for the subscribed pad. If multiple events
|
||||
occurred before application could dequeue them, then the changes
|
||||
will have the ORed value of all the events generated.</para>
|
||||
</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_EVENT_MOTION_DET</constant></entry>
|
||||
<entry>6</entry>
|
||||
<entry>
|
||||
<para>Triggered whenever the motion detection state for one or more of the regions
|
||||
changes. This event has a &v4l2-event-motion-det; associated with it.</para>
|
||||
</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><constant>V4L2_EVENT_PRIVATE_START</constant></entry>
|
||||
<entry>0x08000000</entry>
|
||||
<entry>Base event number for driver-private events.</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
</table>
|
||||
|
||||
<table pgwide="1" frame="none" id="event-flags">
|
||||
<title>Event Flags</title>
|
||||
<tgroup cols="3">
|
||||
|
|
|
@ -505,7 +505,10 @@ at module load time (for a module) with:
|
|||
|
||||
The addresses are normal I2C addresses. The adapter is the string
|
||||
name of the adapter, as shown in /sys/class/i2c-adapter/i2c-<n>/name.
|
||||
It is *NOT* i2c-<n> itself.
|
||||
It is *NOT* i2c-<n> itself. Also, the comparison is done ignoring
|
||||
spaces, so if the name is "This is an I2C chip" you can say
|
||||
adapter_name=ThisisanI2cchip. This is because it's hard to pass in
|
||||
spaces in kernel parameters.
|
||||
|
||||
The debug flags are bit flags for each BMC found, they are:
|
||||
IPMI messages: 1, driver state: 2, timing: 4, I2C probe: 8
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
subdir-y := accounting arm auxdisplay blackfin connector \
|
||||
subdir-y := accounting auxdisplay blackfin connector \
|
||||
filesystems filesystems ia64 laptops mic misc-devices \
|
||||
networking pcmcia prctl ptp spi timers vDSO video4linux \
|
||||
watchdog
|
||||
|
|
|
@ -353,7 +353,7 @@ retry:
|
|||
rc = pci_enable_msix_range(adapter->pdev, adapter->msix_entries,
|
||||
maxvec, maxvec);
|
||||
/*
|
||||
* -ENOSPC is the only error code allowed to be analized
|
||||
* -ENOSPC is the only error code allowed to be analyzed
|
||||
*/
|
||||
if (rc == -ENOSPC) {
|
||||
if (maxvec == 1)
|
||||
|
@ -370,7 +370,7 @@ retry:
|
|||
return rc;
|
||||
}
|
||||
|
||||
Note how pci_enable_msix_range() return value is analized for a fallback -
|
||||
Note how pci_enable_msix_range() return value is analyzed for a fallback -
|
||||
any error code other than -ENOSPC indicates a fatal error and should not
|
||||
be retried.
|
||||
|
||||
|
@ -486,7 +486,7 @@ during development.
|
|||
If your device supports both MSI-X and MSI capabilities, you should use
|
||||
the MSI-X facilities in preference to the MSI facilities. As mentioned
|
||||
above, MSI-X supports any number of interrupts between 1 and 2048.
|
||||
In constrast, MSI is restricted to a maximum of 32 interrupts (and
|
||||
In contrast, MSI is restricted to a maximum of 32 interrupts (and
|
||||
must be a power of two). In addition, the MSI interrupt vectors must
|
||||
be allocated consecutively, so the system might not be able to allocate
|
||||
as many vectors for MSI as it could for MSI-X. On some platforms, MSI
|
||||
|
@ -501,18 +501,9 @@ necessary to disable interrupts (Linux guarantees the same interrupt will
|
|||
not be re-entered). If a device uses multiple interrupts, the driver
|
||||
must disable interrupts while the lock is held. If the device sends
|
||||
a different interrupt, the driver will deadlock trying to recursively
|
||||
acquire the spinlock.
|
||||
|
||||
There are two solutions. The first is to take the lock with
|
||||
spin_lock_irqsave() or spin_lock_irq() (see
|
||||
Documentation/DocBook/kernel-locking). The second is to specify
|
||||
IRQF_DISABLED to request_irq() so that the kernel runs the entire
|
||||
interrupt routine with interrupts disabled.
|
||||
|
||||
If your MSI interrupt routine does not hold the lock for the whole time
|
||||
it is running, the first solution may be best. The second solution is
|
||||
normally preferred as it avoids making two transitions from interrupt
|
||||
disabled to enabled and back again.
|
||||
acquire the spinlock. Such deadlocks can be avoided by using
|
||||
spin_lock_irqsave() or spin_lock_irq() which disable local interrupts
|
||||
and acquire the lock (see Documentation/DocBook/kernel-locking).
|
||||
|
||||
4.6 How to tell whether MSI/MSI-X is enabled on a device
|
||||
|
||||
|
|
|
@ -256,7 +256,7 @@ STEP 4: Slot Reset
|
|||
------------------
|
||||
|
||||
In response to a return value of PCI_ERS_RESULT_NEED_RESET, the
|
||||
the platform will peform a slot reset on the requesting PCI device(s).
|
||||
the platform will perform a slot reset on the requesting PCI device(s).
|
||||
The actual steps taken by a platform to perform a slot reset
|
||||
will be platform-dependent. Upon completion of slot reset, the
|
||||
platform will call the device slot_reset() callback.
|
||||
|
|
|
@ -66,8 +66,8 @@ hardware (mostly chipsets) has root ports that cannot obtain the reporting
|
|||
source ID. nosourceid=n by default.
|
||||
|
||||
2.3 AER error output
|
||||
When a PCI-E AER error is captured, an error message will be outputed to
|
||||
console. If it's a correctable error, it is outputed as a warning.
|
||||
When a PCI-E AER error is captured, an error message will be outputted to
|
||||
console. If it's a correctable error, it is outputted as a warning.
|
||||
Otherwise, it is printed as an error. So users could choose different
|
||||
log level to filter out correctable error messages.
|
||||
|
||||
|
|
|
@ -253,7 +253,7 @@ input driver:
|
|||
GPIO support
|
||||
~~~~~~~~~~~~
|
||||
ACPI 5 introduced two new resources to describe GPIO connections: GpioIo
|
||||
and GpioInt. These resources are used be used to pass GPIO numbers used by
|
||||
and GpioInt. These resources can be used to pass GPIO numbers used by
|
||||
the device to the driver. ACPI 5.1 extended this with _DSD (Device
|
||||
Specific Data) which made it possible to name the GPIOs among other things.
|
||||
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
_DSD Device Properties Related to GPIO
|
||||
--------------------------------------
|
||||
|
||||
With the release of ACPI 5.1 and the _DSD configuration objecte names
|
||||
can finally be given to GPIOs (and other things as well) returned by
|
||||
_CRS. Previously, we were only able to use an integer index to find
|
||||
With the release of ACPI 5.1, the _DSD configuration object finally
|
||||
allows names to be given to GPIOs (and other things as well) returned
|
||||
by _CRS. Previously, we were only able to use an integer index to find
|
||||
the corresponding GPIO, which is pretty error prone (it depends on
|
||||
the _CRS output ordering, for example).
|
||||
|
||||
|
|
|
@ -10,8 +10,6 @@ IXP4xx
|
|||
- Intel IXP4xx Network processor.
|
||||
Makefile
|
||||
- Build sourcefiles as part of the Documentation-build for arm
|
||||
msm/
|
||||
- MSM specific documentation
|
||||
Netwinder
|
||||
- Netwinder specific documentation
|
||||
Porting
|
||||
|
|
|
@ -58,13 +58,18 @@ serial format options as described in
|
|||
--------------------------
|
||||
|
||||
Existing boot loaders: OPTIONAL
|
||||
New boot loaders: MANDATORY
|
||||
New boot loaders: MANDATORY except for DT-only platforms
|
||||
|
||||
The boot loader should detect the machine type its running on by some
|
||||
method. Whether this is a hard coded value or some algorithm that
|
||||
looks at the connected hardware is beyond the scope of this document.
|
||||
The boot loader must ultimately be able to provide a MACH_TYPE_xxx
|
||||
value to the kernel. (see linux/arch/arm/tools/mach-types).
|
||||
value to the kernel. (see linux/arch/arm/tools/mach-types). This
|
||||
should be passed to the kernel in register r1.
|
||||
|
||||
For DT-only platforms, the machine type will be determined by device
|
||||
tree. set the machine type to all ones (~0). This is not strictly
|
||||
necessary, but assures that it will not match any existing types.
|
||||
|
||||
4. Setup boot data
|
||||
------------------
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
subdir-y := SH-Mobile
|
|
@ -96,6 +96,11 @@ EBU Armada family
|
|||
88F6820
|
||||
88F6828
|
||||
|
||||
Armada 390/398 Flavors:
|
||||
88F6920
|
||||
88F6928
|
||||
Product infos: http://www.marvell.com/embedded-processors/armada-39x/
|
||||
|
||||
Armada XP Flavors:
|
||||
MV78230
|
||||
MV78260
|
||||
|
|
|
@ -185,13 +185,20 @@ Kernel entry (head.S)
|
|||
board devices are used, or the device is setup, and provides that
|
||||
machine specific "personality."
|
||||
|
||||
This fine-grained machine specific selection is controlled by the machine
|
||||
type ID, which acts both as a run-time and a compile-time code selection
|
||||
method.
|
||||
For platforms that support device tree (DT), the machine selection is
|
||||
controlled at runtime by passing the device tree blob to the kernel. At
|
||||
compile-time, support for the machine type must be selected. This allows for
|
||||
a single multiplatform kernel build to be used for several machine types.
|
||||
|
||||
You can register a new machine via the web site at:
|
||||
For platforms that do not use device tree, this machine selection is
|
||||
controlled by the machine type ID, which acts both as a run-time and a
|
||||
compile-time code selection method. You can register a new machine via the
|
||||
web site at:
|
||||
|
||||
<http://www.arm.linux.org.uk/developer/machines/>
|
||||
|
||||
Note: Please do not register a machine type for DT-only platforms. If your
|
||||
platform is DT-only, you do not need a registered machine type.
|
||||
|
||||
---
|
||||
Russell King (15/03/2004)
|
||||
|
|
|
@ -1,7 +0,0 @@
|
|||
# List of programs to build
|
||||
hostprogs-y := vrl4
|
||||
|
||||
# Tell kbuild to always build the programs
|
||||
always := $(hostprogs-y)
|
||||
|
||||
HOSTCFLAGS_vrl4.o += -I$(objtree)/usr/include -I$(srctree)/tools/include
|
|
@ -1,170 +0,0 @@
|
|||
/*
|
||||
* vrl4 format generator
|
||||
*
|
||||
* Copyright (C) 2010 Simon Horman
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
/*
|
||||
* usage: vrl4 < zImage > out
|
||||
* dd if=out of=/dev/sdx bs=512 seek=1 # Write the image to sector 1
|
||||
*
|
||||
* Reads a zImage from stdin and writes a vrl4 image to stdout.
|
||||
* In practice this means writing a padded vrl4 header to stdout followed
|
||||
* by the zImage.
|
||||
*
|
||||
* The padding places the zImage at ALIGN bytes into the output.
|
||||
* The vrl4 uses ALIGN + START_BASE as the start_address.
|
||||
* This is where the mask ROM will jump to after verifying the header.
|
||||
*
|
||||
* The header sets copy_size to min(sizeof(zImage), MAX_BOOT_PROG_LEN) + ALIGN.
|
||||
* That is, the mask ROM will load the padded header (ALIGN bytes)
|
||||
* And then MAX_BOOT_PROG_LEN bytes of the image, or the entire image,
|
||||
* whichever is smaller.
|
||||
*
|
||||
* The zImage is not modified in any way.
|
||||
*/
|
||||
|
||||
#define _BSD_SOURCE
|
||||
#include <endian.h>
|
||||
#include <unistd.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
#include <tools/endian.h>
|
||||
|
||||
struct hdr {
|
||||
uint32_t magic1;
|
||||
uint32_t reserved1;
|
||||
uint32_t magic2;
|
||||
uint32_t reserved2;
|
||||
uint16_t copy_size;
|
||||
uint16_t boot_options;
|
||||
uint32_t reserved3;
|
||||
uint32_t start_address;
|
||||
uint32_t reserved4;
|
||||
uint32_t reserved5;
|
||||
char reserved6[308];
|
||||
};
|
||||
|
||||
#define DECLARE_HDR(h) \
|
||||
struct hdr (h) = { \
|
||||
.magic1 = htole32(0xea000000), \
|
||||
.reserved1 = htole32(0x56), \
|
||||
.magic2 = htole32(0xe59ff008), \
|
||||
.reserved3 = htole16(0x1) }
|
||||
|
||||
/* Align to 512 bytes, the MMCIF sector size */
|
||||
#define ALIGN_BITS 9
|
||||
#define ALIGN (1 << ALIGN_BITS)
|
||||
|
||||
#define START_BASE 0xe55b0000
|
||||
|
||||
/*
|
||||
* With an alignment of 512 the header uses the first sector.
|
||||
* There is a 128 sector (64kbyte) limit on the data loaded by the mask ROM.
|
||||
* So there are 127 sectors left for the boot programme. But in practice
|
||||
* Only a small portion of a zImage is needed, 16 sectors should be more
|
||||
* than enough.
|
||||
*
|
||||
* Note that this sets how much of the zImage is copied by the mask ROM.
|
||||
* The entire zImage is present after the header and is loaded
|
||||
* by the code in the boot program (which is the first portion of the zImage).
|
||||
*/
|
||||
#define MAX_BOOT_PROG_LEN (16 * 512)
|
||||
|
||||
#define ROUND_UP(x) ((x + ALIGN - 1) & ~(ALIGN - 1))
|
||||
|
||||
static ssize_t do_read(int fd, void *buf, size_t count)
|
||||
{
|
||||
size_t offset = 0;
|
||||
ssize_t l;
|
||||
|
||||
while (offset < count) {
|
||||
l = read(fd, buf + offset, count - offset);
|
||||
if (!l)
|
||||
break;
|
||||
if (l < 0) {
|
||||
if (errno == EAGAIN || errno == EWOULDBLOCK)
|
||||
continue;
|
||||
perror("read");
|
||||
return -1;
|
||||
}
|
||||
offset += l;
|
||||
}
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
||||
static ssize_t do_write(int fd, const void *buf, size_t count)
|
||||
{
|
||||
size_t offset = 0;
|
||||
ssize_t l;
|
||||
|
||||
while (offset < count) {
|
||||
l = write(fd, buf + offset, count - offset);
|
||||
if (l < 0) {
|
||||
if (errno == EAGAIN || errno == EWOULDBLOCK)
|
||||
continue;
|
||||
perror("write");
|
||||
return -1;
|
||||
}
|
||||
offset += l;
|
||||
}
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
||||
static ssize_t write_zero(int fd, size_t len)
|
||||
{
|
||||
size_t i = len;
|
||||
|
||||
while (i--) {
|
||||
const char x = 0;
|
||||
if (do_write(fd, &x, 1) < 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
DECLARE_HDR(hdr);
|
||||
char boot_program[MAX_BOOT_PROG_LEN];
|
||||
size_t aligned_hdr_len, alligned_prog_len;
|
||||
ssize_t prog_len;
|
||||
|
||||
prog_len = do_read(0, boot_program, sizeof(boot_program));
|
||||
if (prog_len <= 0)
|
||||
return -1;
|
||||
|
||||
aligned_hdr_len = ROUND_UP(sizeof(hdr));
|
||||
hdr.start_address = htole32(START_BASE + aligned_hdr_len);
|
||||
alligned_prog_len = ROUND_UP(prog_len);
|
||||
hdr.copy_size = htole16(aligned_hdr_len + alligned_prog_len);
|
||||
|
||||
if (do_write(1, &hdr, sizeof(hdr)) < 0)
|
||||
return -1;
|
||||
if (write_zero(1, aligned_hdr_len - sizeof(hdr)) < 0)
|
||||
return -1;
|
||||
|
||||
if (do_write(1, boot_program, prog_len) < 0)
|
||||
return 1;
|
||||
|
||||
/* Write out the rest of the kernel */
|
||||
while (1) {
|
||||
prog_len = do_read(0, boot_program, sizeof(boot_program));
|
||||
if (prog_len < 0)
|
||||
return 1;
|
||||
if (prog_len == 0)
|
||||
break;
|
||||
if (do_write(1, boot_program, prog_len) < 0)
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -1,29 +0,0 @@
|
|||
ROM-able zImage boot from MMC
|
||||
-----------------------------
|
||||
|
||||
An ROM-able zImage compiled with ZBOOT_ROM_MMCIF may be written to MMC and
|
||||
SuperH Mobile ARM will to boot directly from the MMCIF hardware block.
|
||||
|
||||
This is achieved by the mask ROM loading the first portion of the image into
|
||||
MERAM and then jumping to it. This portion contains loader code which
|
||||
copies the entire image to SDRAM and jumps to it. From there the zImage
|
||||
boot code proceeds as normal, uncompressing the image into its final
|
||||
location and then jumping to it.
|
||||
|
||||
This code has been tested on an AP4EB board using the developer 1A eMMC
|
||||
boot mode which is configured using the following jumper settings.
|
||||
The board used for testing required a patched mask ROM in order for
|
||||
this mode to function.
|
||||
|
||||
8 7 6 5 4 3 2 1
|
||||
x|x|x|x|x| |x|
|
||||
S4 -+-+-+-+-+-+-+-
|
||||
| | | | |x| |x on
|
||||
|
||||
The zImage must be written to the MMC card at sector 1 (512 bytes) in
|
||||
vrl4 format. A utility vrl4 is supplied to accomplish this.
|
||||
|
||||
e.g.
|
||||
vrl4 < zImage | dd of=/dev/sdX bs=512 seek=1
|
||||
|
||||
A dual-voltage MMC 4.0 card was used for testing.
|
|
@ -1,42 +0,0 @@
|
|||
ROM-able zImage boot from eSD
|
||||
-----------------------------
|
||||
|
||||
An ROM-able zImage compiled with ZBOOT_ROM_SDHI may be written to eSD and
|
||||
SuperH Mobile ARM will to boot directly from the SDHI hardware block.
|
||||
|
||||
This is achieved by the mask ROM loading the first portion of the image into
|
||||
MERAM and then jumping to it. This portion contains loader code which
|
||||
copies the entire image to SDRAM and jumps to it. From there the zImage
|
||||
boot code proceeds as normal, uncompressing the image into its final
|
||||
location and then jumping to it.
|
||||
|
||||
This code has been tested on an mackerel board using the developer 1A eSD
|
||||
boot mode which is configured using the following jumper settings.
|
||||
|
||||
8 7 6 5 4 3 2 1
|
||||
x|x|x|x| |x|x|
|
||||
S4 -+-+-+-+-+-+-+-
|
||||
| | | |x| | |x on
|
||||
|
||||
The eSD card needs to be present in SDHI slot 1 (CN7).
|
||||
As such S1 and S33 also need to be configured as per
|
||||
the notes in arch/arm/mach-shmobile/board-mackerel.c.
|
||||
|
||||
A partial zImage must be written to physical partition #1 (boot)
|
||||
of the eSD at sector 0 in vrl4 format. A utility vrl4 is supplied to
|
||||
accomplish this.
|
||||
|
||||
e.g.
|
||||
vrl4 < zImage | dd of=/dev/sdX bs=512 count=17
|
||||
|
||||
A full copy of _the same_ zImage should be written to physical partition #1
|
||||
(boot) of the eSD at sector 0. This should _not_ be in vrl4 format.
|
||||
|
||||
vrl4 < zImage | dd of=/dev/sdX bs=512
|
||||
|
||||
Note: The commands above assume that the physical partition has been
|
||||
switched. No such facility currently exists in the Linux Kernel.
|
||||
|
||||
Physical partitions are described in the eSD specification. At the time of
|
||||
writing they are not the same as partitions that are typically configured
|
||||
using fdisk and visible through /proc/partitions
|
|
@ -1,176 +0,0 @@
|
|||
This document provides an overview of the msm_gpiomux interface, which
|
||||
is used to provide gpio pin multiplexing and configuration on mach-msm
|
||||
targets.
|
||||
|
||||
History
|
||||
=======
|
||||
|
||||
The first-generation API for gpio configuration & multiplexing on msm
|
||||
is the function gpio_tlmm_config(). This function has a few notable
|
||||
shortcomings, which led to its deprecation and replacement by gpiomux:
|
||||
|
||||
The 'disable' parameter: Setting the second parameter to
|
||||
gpio_tlmm_config to GPIO_CFG_DISABLE tells the peripheral
|
||||
processor in charge of the subsystem to perform a look-up into a
|
||||
low-power table and apply the low-power/sleep setting for the pin.
|
||||
As the msm family evolved this became problematic. Not all pins
|
||||
have sleep settings, not all peripheral processors will accept requests
|
||||
to apply said sleep settings, and not all msm targets have their gpio
|
||||
subsystems managed by a peripheral processor. In order to get consistent
|
||||
behavior on all targets, drivers are forced to ignore this parameter,
|
||||
rendering it useless.
|
||||
|
||||
The 'direction' flag: for all mux-settings other than raw-gpio (0),
|
||||
the output-enable bit of a gpio is hard-wired to a known
|
||||
input (usually VDD or ground). For those settings, the direction flag
|
||||
is meaningless at best, and deceptive at worst. In addition, using the
|
||||
direction flag to change output-enable (OE) directly can cause trouble in
|
||||
gpiolib, which has no visibility into gpio direction changes made
|
||||
in this way. Direction control in gpio mode should be made through gpiolib.
|
||||
|
||||
Key Features of gpiomux
|
||||
=======================
|
||||
|
||||
- A consistent interface across all generations of msm. Drivers can expect
|
||||
the same results on every target.
|
||||
- gpiomux plays nicely with gpiolib. Functions that should belong to gpiolib
|
||||
are left to gpiolib and not duplicated here. gpiomux is written with the
|
||||
intent that gpio_chips will call gpiomux reference-counting methods
|
||||
from their request() and free() hooks, providing full integration.
|
||||
- Tabular configuration. Instead of having to call gpio_tlmm_config
|
||||
hundreds of times, gpio configuration is placed in a single table.
|
||||
- Per-gpio sleep. Each gpio is individually reference counted, allowing only
|
||||
those lines which are in use to be put in high-power states.
|
||||
- 0 means 'do nothing': all flags are designed so that the default memset-zero
|
||||
equates to a sensible default of 'no configuration', preventing users
|
||||
from having to provide hundreds of 'no-op' configs for unused or
|
||||
unwanted lines.
|
||||
|
||||
Usage
|
||||
=====
|
||||
|
||||
To use gpiomux, provide configuration information for relevant gpio lines
|
||||
in the msm_gpiomux_configs table. Since a 0 equates to "unconfigured",
|
||||
only those lines to be managed by gpiomux need to be specified. Here
|
||||
is a completely fictional example:
|
||||
|
||||
struct msm_gpiomux_config msm_gpiomux_configs[GPIOMUX_NGPIOS] = {
|
||||
[12] = {
|
||||
.active = GPIOMUX_VALID | GPIOMUX_DRV_8MA | GPIOMUX_FUNC_1,
|
||||
.suspended = GPIOMUX_VALID | GPIOMUX_PULL_DOWN,
|
||||
},
|
||||
[34] = {
|
||||
.suspended = GPIOMUX_VALID | GPIOMUX_PULL_DOWN,
|
||||
},
|
||||
};
|
||||
|
||||
To indicate that a gpio is in use, call msm_gpiomux_get() to increase
|
||||
its reference count. To decrease the reference count, call msm_gpiomux_put().
|
||||
|
||||
The effect of this configuration is as follows:
|
||||
|
||||
When the system boots, gpios 12 and 34 will be initialized with their
|
||||
'suspended' configurations. All other gpios, which were left unconfigured,
|
||||
will not be touched.
|
||||
|
||||
When msm_gpiomux_get() is called on gpio 12 to raise its reference count
|
||||
above 0, its active configuration will be applied. Since no other gpio
|
||||
line has a valid active configuration, msm_gpiomux_get() will have no
|
||||
effect on any other line.
|
||||
|
||||
When msm_gpiomux_put() is called on gpio 12 or 34 to drop their reference
|
||||
count to 0, their suspended configurations will be applied.
|
||||
Since no other gpio line has a valid suspended configuration, no other
|
||||
gpio line will be effected by msm_gpiomux_put(). Since gpio 34 has no valid
|
||||
active configuration, this is effectively a no-op for gpio 34 as well,
|
||||
with one small caveat, see the section "About Output-Enable Settings".
|
||||
|
||||
All of the GPIOMUX_VALID flags may seem like unnecessary overhead, but
|
||||
they address some important issues. As unused entries (all those
|
||||
except 12 and 34) are zero-filled, gpiomux needs a way to distinguish
|
||||
the used fields from the unused. In addition, the all-zero pattern
|
||||
is a valid configuration! Therefore, gpiomux defines an additional bit
|
||||
which is used to indicate when a field is used. This has the pleasant
|
||||
side-effect of allowing calls to msm_gpiomux_write to use '0' to indicate
|
||||
that a value should not be changed:
|
||||
|
||||
msm_gpiomux_write(0, GPIOMUX_VALID, 0);
|
||||
|
||||
replaces the active configuration of gpio 0 with an all-zero configuration,
|
||||
but leaves the suspended configuration as it was.
|
||||
|
||||
Static Configurations
|
||||
=====================
|
||||
|
||||
To install a static configuration, which is applied at boot and does
|
||||
not change after that, install a configuration with a suspended component
|
||||
but no active component, as in the previous example:
|
||||
|
||||
[34] = {
|
||||
.suspended = GPIOMUX_VALID | GPIOMUX_PULL_DOWN,
|
||||
},
|
||||
|
||||
The suspended setting is applied during boot, and the lack of any valid
|
||||
active setting prevents any other setting from being applied at runtime.
|
||||
If other subsystems attempting to access the line is a concern, one could
|
||||
*really* anchor the configuration down by calling msm_gpiomux_get on the
|
||||
line at initialization to move the line into active mode. With the line
|
||||
held, it will never be re-suspended, and with no valid active configuration,
|
||||
no new configurations will be applied.
|
||||
|
||||
But then, if having other subsystems grabbing for the line is truly a concern,
|
||||
it should be reserved with gpio_request instead, which carries an implicit
|
||||
msm_gpiomux_get.
|
||||
|
||||
gpiomux and gpiolib
|
||||
===================
|
||||
|
||||
It is expected that msm gpio_chips will call msm_gpiomux_get() and
|
||||
msm_gpiomux_put() from their request and free hooks, like this fictional
|
||||
example:
|
||||
|
||||
static int request(struct gpio_chip *chip, unsigned offset)
|
||||
{
|
||||
return msm_gpiomux_get(chip->base + offset);
|
||||
}
|
||||
|
||||
static void free(struct gpio_chip *chip, unsigned offset)
|
||||
{
|
||||
msm_gpiomux_put(chip->base + offset);
|
||||
}
|
||||
|
||||
...somewhere in a gpio_chip declaration...
|
||||
.request = request,
|
||||
.free = free,
|
||||
|
||||
This provides important functionality:
|
||||
- It guarantees that a gpio line will have its 'active' config applied
|
||||
when the line is requested, and will not be suspended while the line
|
||||
remains requested; and
|
||||
- It guarantees that gpio-direction settings from gpiolib behave sensibly.
|
||||
See "About Output-Enable Settings."
|
||||
|
||||
This mechanism allows for "auto-request" of gpiomux lines via gpiolib
|
||||
when it is suitable. Drivers wishing more exact control are, of course,
|
||||
free to also use msm_gpiomux_set and msm_gpiomux_get.
|
||||
|
||||
About Output-Enable Settings
|
||||
============================
|
||||
|
||||
Some msm targets do not have the ability to query the current gpio
|
||||
configuration setting. This means that changes made to the output-enable
|
||||
(OE) bit by gpiolib cannot be consistently detected and preserved by gpiomux.
|
||||
Therefore, when gpiomux applies a configuration setting, any direction
|
||||
settings which may have been applied by gpiolib are lost and the default
|
||||
input settings are re-applied.
|
||||
|
||||
For this reason, drivers should not assume that gpio direction settings
|
||||
continue to hold if they free and then re-request a gpio. This seems like
|
||||
common sense - after all, anybody could have obtained the line in the
|
||||
meantime - but it needs saying.
|
||||
|
||||
This also means that calls to msm_gpiomux_write will reset the OE bit,
|
||||
which means that if the gpio line is held by a client of gpiolib and
|
||||
msm_gpiomux_write is called, the direction setting has been lost and
|
||||
gpiolib's internal state has been broken.
|
||||
Release gpio lines before reconfiguring them.
|
|
@ -0,0 +1,593 @@
|
|||
ACPI Tables
|
||||
-----------
|
||||
The expectations of individual ACPI tables are discussed in the list that
|
||||
follows.
|
||||
|
||||
If a section number is used, it refers to a section number in the ACPI
|
||||
specification where the object is defined. If "Signature Reserved" is used,
|
||||
the table signature (the first four bytes of the table) is the only portion
|
||||
of the table recognized by the specification, and the actual table is defined
|
||||
outside of the UEFI Forum (see Section 5.2.6 of the specification).
|
||||
|
||||
For ACPI on arm64, tables also fall into the following categories:
|
||||
|
||||
-- Required: DSDT, FADT, GTDT, MADT, MCFG, RSDP, SPCR, XSDT
|
||||
|
||||
-- Recommended: BERT, EINJ, ERST, HEST, SSDT
|
||||
|
||||
-- Optional: BGRT, CPEP, CSRT, DRTM, ECDT, FACS, FPDT, MCHI, MPST,
|
||||
MSCT, RASF, SBST, SLIT, SPMI, SRAT, TCPA, TPM2, UEFI
|
||||
|
||||
-- Not supported: BOOT, DBG2, DBGP, DMAR, ETDT, HPET, IBFT, IVRS,
|
||||
LPIT, MSDM, RSDT, SLIC, WAET, WDAT, WDRT, WPBT
|
||||
|
||||
|
||||
Table Usage for ARMv8 Linux
|
||||
----- ----------------------------------------------------------------
|
||||
BERT Section 18.3 (signature == "BERT")
|
||||
== Boot Error Record Table ==
|
||||
Must be supplied if RAS support is provided by the platform. It
|
||||
is recommended this table be supplied.
|
||||
|
||||
BOOT Signature Reserved (signature == "BOOT")
|
||||
== simple BOOT flag table ==
|
||||
Microsoft only table, will not be supported.
|
||||
|
||||
BGRT Section 5.2.22 (signature == "BGRT")
|
||||
== Boot Graphics Resource Table ==
|
||||
Optional, not currently supported, with no real use-case for an
|
||||
ARM server.
|
||||
|
||||
CPEP Section 5.2.18 (signature == "CPEP")
|
||||
== Corrected Platform Error Polling table ==
|
||||
Optional, not currently supported, and not recommended until such
|
||||
time as ARM-compatible hardware is available, and the specification
|
||||
suitably modified.
|
||||
|
||||
CSRT Signature Reserved (signature == "CSRT")
|
||||
== Core System Resources Table ==
|
||||
Optional, not currently supported.
|
||||
|
||||
DBG2 Signature Reserved (signature == "DBG2")
|
||||
== DeBuG port table 2 ==
|
||||
Microsoft only table, will not be supported.
|
||||
|
||||
DBGP Signature Reserved (signature == "DBGP")
|
||||
== DeBuG Port table ==
|
||||
Microsoft only table, will not be supported.
|
||||
|
||||
DSDT Section 5.2.11.1 (signature == "DSDT")
|
||||
== Differentiated System Description Table ==
|
||||
A DSDT is required; see also SSDT.
|
||||
|
||||
ACPI tables contain only one DSDT but can contain one or more SSDTs,
|
||||
which are optional. Each SSDT can only add to the ACPI namespace,
|
||||
but cannot modify or replace anything in the DSDT.
|
||||
|
||||
DMAR Signature Reserved (signature == "DMAR")
|
||||
== DMA Remapping table ==
|
||||
x86 only table, will not be supported.
|
||||
|
||||
DRTM Signature Reserved (signature == "DRTM")
|
||||
== Dynamic Root of Trust for Measurement table ==
|
||||
Optional, not currently supported.
|
||||
|
||||
ECDT Section 5.2.16 (signature == "ECDT")
|
||||
== Embedded Controller Description Table ==
|
||||
Optional, not currently supported, but could be used on ARM if and
|
||||
only if one uses the GPE_BIT field to represent an IRQ number, since
|
||||
there are no GPE blocks defined in hardware reduced mode. This would
|
||||
need to be modified in the ACPI specification.
|
||||
|
||||
EINJ Section 18.6 (signature == "EINJ")
|
||||
== Error Injection table ==
|
||||
This table is very useful for testing platform response to error
|
||||
conditions; it allows one to inject an error into the system as
|
||||
if it had actually occurred. However, this table should not be
|
||||
shipped with a production system; it should be dynamically loaded
|
||||
and executed with the ACPICA tools only during testing.
|
||||
|
||||
ERST Section 18.5 (signature == "ERST")
|
||||
== Error Record Serialization Table ==
|
||||
On a platform supports RAS, this table must be supplied if it is not
|
||||
UEFI-based; if it is UEFI-based, this table may be supplied. When this
|
||||
table is not present, UEFI run time service will be utilized to save
|
||||
and retrieve hardware error information to and from a persistent store.
|
||||
|
||||
ETDT Signature Reserved (signature == "ETDT")
|
||||
== Event Timer Description Table ==
|
||||
Obsolete table, will not be supported.
|
||||
|
||||
FACS Section 5.2.10 (signature == "FACS")
|
||||
== Firmware ACPI Control Structure ==
|
||||
It is unlikely that this table will be terribly useful. If it is
|
||||
provided, the Global Lock will NOT be used since it is not part of
|
||||
the hardware reduced profile, and only 64-bit address fields will
|
||||
be considered valid.
|
||||
|
||||
FADT Section 5.2.9 (signature == "FACP")
|
||||
== Fixed ACPI Description Table ==
|
||||
Required for arm64.
|
||||
|
||||
The HW_REDUCED_ACPI flag must be set. All of the fields that are
|
||||
to be ignored when HW_REDUCED_ACPI is set are expected to be set to
|
||||
zero.
|
||||
|
||||
If an FACS table is provided, the X_FIRMWARE_CTRL field is to be
|
||||
used, not FIRMWARE_CTRL.
|
||||
|
||||
If PSCI is used (as is recommended), make sure that ARM_BOOT_ARCH is
|
||||
filled in properly -- that the PSCI_COMPLIANT flag is set and that
|
||||
PSCI_USE_HVC is set or unset as needed (see table 5-37).
|
||||
|
||||
For the DSDT that is also required, the X_DSDT field is to be used,
|
||||
not the DSDT field.
|
||||
|
||||
FPDT Section 5.2.23 (signature == "FPDT")
|
||||
== Firmware Performance Data Table ==
|
||||
Optional, not currently supported.
|
||||
|
||||
GTDT Section 5.2.24 (signature == "GTDT")
|
||||
== Generic Timer Description Table ==
|
||||
Required for arm64.
|
||||
|
||||
HEST Section 18.3.2 (signature == "HEST")
|
||||
== Hardware Error Source Table ==
|
||||
Until further error source types are defined, use only types 6 (AER
|
||||
Root Port), 7 (AER Endpoint), 8 (AER Bridge), or 9 (Generic Hardware
|
||||
Error Source). Firmware first error handling is possible if and only
|
||||
if Trusted Firmware is being used on arm64.
|
||||
|
||||
Must be supplied if RAS support is provided by the platform. It
|
||||
is recommended this table be supplied.
|
||||
|
||||
HPET Signature Reserved (signature == "HPET")
|
||||
== High Precision Event timer Table ==
|
||||
x86 only table, will not be supported.
|
||||
|
||||
IBFT Signature Reserved (signature == "IBFT")
|
||||
== iSCSI Boot Firmware Table ==
|
||||
Microsoft defined table, support TBD.
|
||||
|
||||
IVRS Signature Reserved (signature == "IVRS")
|
||||
== I/O Virtualization Reporting Structure ==
|
||||
x86_64 (AMD) only table, will not be supported.
|
||||
|
||||
LPIT Signature Reserved (signature == "LPIT")
|
||||
== Low Power Idle Table ==
|
||||
x86 only table as of ACPI 5.1; future versions have been adapted for
|
||||
use with ARM and will be recommended in order to support ACPI power
|
||||
management.
|
||||
|
||||
MADT Section 5.2.12 (signature == "APIC")
|
||||
== Multiple APIC Description Table ==
|
||||
Required for arm64. Only the GIC interrupt controller structures
|
||||
should be used (types 0xA - 0xE).
|
||||
|
||||
MCFG Signature Reserved (signature == "MCFG")
|
||||
== Memory-mapped ConFiGuration space ==
|
||||
If the platform supports PCI/PCIe, an MCFG table is required.
|
||||
|
||||
MCHI Signature Reserved (signature == "MCHI")
|
||||
== Management Controller Host Interface table ==
|
||||
Optional, not currently supported.
|
||||
|
||||
MPST Section 5.2.21 (signature == "MPST")
|
||||
== Memory Power State Table ==
|
||||
Optional, not currently supported.
|
||||
|
||||
MSDM Signature Reserved (signature == "MSDM")
|
||||
== Microsoft Data Management table ==
|
||||
Microsoft only table, will not be supported.
|
||||
|
||||
MSCT Section 5.2.19 (signature == "MSCT")
|
||||
== Maximum System Characteristic Table ==
|
||||
Optional, not currently supported.
|
||||
|
||||
RASF Section 5.2.20 (signature == "RASF")
|
||||
== RAS Feature table ==
|
||||
Optional, not currently supported.
|
||||
|
||||
RSDP Section 5.2.5 (signature == "RSD PTR")
|
||||
== Root System Description PoinTeR ==
|
||||
Required for arm64.
|
||||
|
||||
RSDT Section 5.2.7 (signature == "RSDT")
|
||||
== Root System Description Table ==
|
||||
Since this table can only provide 32-bit addresses, it is deprecated
|
||||
on arm64, and will not be used.
|
||||
|
||||
SBST Section 5.2.14 (signature == "SBST")
|
||||
== Smart Battery Subsystem Table ==
|
||||
Optional, not currently supported.
|
||||
|
||||
SLIC Signature Reserved (signature == "SLIC")
|
||||
== Software LIcensing table ==
|
||||
Microsoft only table, will not be supported.
|
||||
|
||||
SLIT Section 5.2.17 (signature == "SLIT")
|
||||
== System Locality distance Information Table ==
|
||||
Optional in general, but required for NUMA systems.
|
||||
|
||||
SPCR Signature Reserved (signature == "SPCR")
|
||||
== Serial Port Console Redirection table ==
|
||||
Required for arm64.
|
||||
|
||||
SPMI Signature Reserved (signature == "SPMI")
|
||||
== Server Platform Management Interface table ==
|
||||
Optional, not currently supported.
|
||||
|
||||
SRAT Section 5.2.16 (signature == "SRAT")
|
||||
== System Resource Affinity Table ==
|
||||
Optional, but if used, only the GICC Affinity structures are read.
|
||||
To support NUMA, this table is required.
|
||||
|
||||
SSDT Section 5.2.11.2 (signature == "SSDT")
|
||||
== Secondary System Description Table ==
|
||||
These tables are a continuation of the DSDT; these are recommended
|
||||
for use with devices that can be added to a running system, but can
|
||||
also serve the purpose of dividing up device descriptions into more
|
||||
manageable pieces.
|
||||
|
||||
An SSDT can only ADD to the ACPI namespace. It cannot modify or
|
||||
replace existing device descriptions already in the namespace.
|
||||
|
||||
These tables are optional, however. ACPI tables should contain only
|
||||
one DSDT but can contain many SSDTs.
|
||||
|
||||
TCPA Signature Reserved (signature == "TCPA")
|
||||
== Trusted Computing Platform Alliance table ==
|
||||
Optional, not currently supported, and may need changes to fully
|
||||
interoperate with arm64.
|
||||
|
||||
TPM2 Signature Reserved (signature == "TPM2")
|
||||
== Trusted Platform Module 2 table ==
|
||||
Optional, not currently supported, and may need changes to fully
|
||||
interoperate with arm64.
|
||||
|
||||
UEFI Signature Reserved (signature == "UEFI")
|
||||
== UEFI ACPI data table ==
|
||||
Optional, not currently supported. No known use case for arm64,
|
||||
at present.
|
||||
|
||||
WAET Signature Reserved (signature == "WAET")
|
||||
== Windows ACPI Emulated devices Table ==
|
||||
Microsoft only table, will not be supported.
|
||||
|
||||
WDAT Signature Reserved (signature == "WDAT")
|
||||
== Watch Dog Action Table ==
|
||||
Microsoft only table, will not be supported.
|
||||
|
||||
WDRT Signature Reserved (signature == "WDRT")
|
||||
== Watch Dog Resource Table ==
|
||||
Microsoft only table, will not be supported.
|
||||
|
||||
WPBT Signature Reserved (signature == "WPBT")
|
||||
== Windows Platform Binary Table ==
|
||||
Microsoft only table, will not be supported.
|
||||
|
||||
XSDT Section 5.2.8 (signature == "XSDT")
|
||||
== eXtended System Description Table ==
|
||||
Required for arm64.
|
||||
|
||||
|
||||
ACPI Objects
|
||||
------------
|
||||
The expectations on individual ACPI objects are discussed in the list that
|
||||
follows:
|
||||
|
||||
Name Section Usage for ARMv8 Linux
|
||||
---- ------------ -------------------------------------------------
|
||||
_ADR 6.1.1 Use as needed.
|
||||
|
||||
_BBN 6.5.5 Use as needed; PCI-specific.
|
||||
|
||||
_BDN 6.5.3 Optional; not likely to be used on arm64.
|
||||
|
||||
_CCA 6.2.17 This method should be defined for all bus masters
|
||||
on arm64. While cache coherency is assumed, making
|
||||
it explicit ensures the kernel will set up DMA as
|
||||
it should.
|
||||
|
||||
_CDM 6.2.1 Optional, to be used only for processor devices.
|
||||
|
||||
_CID 6.1.2 Use as needed.
|
||||
|
||||
_CLS 6.1.3 Use as needed.
|
||||
|
||||
_CRS 6.2.2 Required on arm64.
|
||||
|
||||
_DCK 6.5.2 Optional; not likely to be used on arm64.
|
||||
|
||||
_DDN 6.1.4 This field can be used for a device name. However,
|
||||
it is meant for DOS device names (e.g., COM1), so be
|
||||
careful of its use across OSes.
|
||||
|
||||
_DEP 6.5.8 Use as needed.
|
||||
|
||||
_DIS 6.2.3 Optional, for power management use.
|
||||
|
||||
_DLM 5.7.5 Optional.
|
||||
|
||||
_DMA 6.2.4 Optional.
|
||||
|
||||
_DSD 6.2.5 To be used with caution. If this object is used, try
|
||||
to use it within the constraints already defined by the
|
||||
Device Properties UUID. Only in rare circumstances
|
||||
should it be necessary to create a new _DSD UUID.
|
||||
|
||||
In either case, submit the _DSD definition along with
|
||||
any driver patches for discussion, especially when
|
||||
device properties are used. A driver will not be
|
||||
considered complete without a corresponding _DSD
|
||||
description. Once approved by kernel maintainers,
|
||||
the UUID or device properties must then be registered
|
||||
with the UEFI Forum; this may cause some iteration as
|
||||
more than one OS will be registering entries.
|
||||
|
||||
_DSM Do not use this method. It is not standardized, the
|
||||
return values are not well documented, and it is
|
||||
currently a frequent source of error.
|
||||
|
||||
_DSW 7.2.1 Use as needed; power management specific.
|
||||
|
||||
_EDL 6.3.1 Optional.
|
||||
|
||||
_EJD 6.3.2 Optional.
|
||||
|
||||
_EJx 6.3.3 Optional.
|
||||
|
||||
_FIX 6.2.7 x86 specific, not used on arm64.
|
||||
|
||||
\_GL 5.7.1 This object is not to be used in hardware reduced
|
||||
mode, and therefore should not be used on arm64.
|
||||
|
||||
_GLK 6.5.7 This object requires a global lock be defined; there
|
||||
is no global lock on arm64 since it runs in hardware
|
||||
reduced mode. Hence, do not use this object on arm64.
|
||||
|
||||
\_GPE 5.3.1 This namespace is for x86 use only. Do not use it
|
||||
on arm64.
|
||||
|
||||
_GSB 6.2.7 Optional.
|
||||
|
||||
_HID 6.1.5 Use as needed. This is the primary object to use in
|
||||
device probing, though _CID and _CLS may also be used.
|
||||
|
||||
_HPP 6.2.8 Optional, PCI specific.
|
||||
|
||||
_HPX 6.2.9 Optional, PCI specific.
|
||||
|
||||
_HRV 6.1.6 Optional, use as needed to clarify device behavior; in
|
||||
some cases, this may be easier to use than _DSD.
|
||||
|
||||
_INI 6.5.1 Not required, but can be useful in setting up devices
|
||||
when UEFI leaves them in a state that may not be what
|
||||
the driver expects before it starts probing.
|
||||
|
||||
_IRC 7.2.15 Use as needed; power management specific.
|
||||
|
||||
_LCK 6.3.4 Optional.
|
||||
|
||||
_MAT 6.2.10 Optional; see also the MADT.
|
||||
|
||||
_MLS 6.1.7 Optional, but highly recommended for use in
|
||||
internationalization.
|
||||
|
||||
_OFF 7.1.2 It is recommended to define this method for any device
|
||||
that can be turned on or off.
|
||||
|
||||
_ON 7.1.3 It is recommended to define this method for any device
|
||||
that can be turned on or off.
|
||||
|
||||
\_OS 5.7.3 This method will return "Linux" by default (this is
|
||||
the value of the macro ACPI_OS_NAME on Linux). The
|
||||
command line parameter acpi_os=<string> can be used
|
||||
to set it to some other value.
|
||||
|
||||
_OSC 6.2.11 This method can be a global method in ACPI (i.e.,
|
||||
\_SB._OSC), or it may be associated with a specific
|
||||
device (e.g., \_SB.DEV0._OSC), or both. When used
|
||||
as a global method, only capabilities published in
|
||||
the ACPI specification are allowed. When used as
|
||||
a device-specific method, the process described for
|
||||
using _DSD MUST be used to create an _OSC definition;
|
||||
out-of-process use of _OSC is not allowed. That is,
|
||||
submit the device-specific _OSC usage description as
|
||||
part of the kernel driver submission, get it approved
|
||||
by the kernel community, then register it with the
|
||||
UEFI Forum.
|
||||
|
||||
\_OSI 5.7.2 Deprecated on ARM64. Any invocation of this method
|
||||
will print a warning on the console and return false.
|
||||
That is, as far as ACPI firmware is concerned, _OSI
|
||||
cannot be used to determine what sort of system is
|
||||
being used or what functionality is provided. The
|
||||
_OSC method is to be used instead.
|
||||
|
||||
_OST 6.3.5 Optional.
|
||||
|
||||
_PDC 8.4.1 Deprecated, do not use on arm64.
|
||||
|
||||
\_PIC 5.8.1 The method should not be used. On arm64, the only
|
||||
interrupt model available is GIC.
|
||||
|
||||
_PLD 6.1.8 Optional.
|
||||
|
||||
\_PR 5.3.1 This namespace is for x86 use only on legacy systems.
|
||||
Do not use it on arm64.
|
||||
|
||||
_PRS 6.2.12 Optional.
|
||||
|
||||
_PRT 6.2.13 Required as part of the definition of all PCI root
|
||||
devices.
|
||||
|
||||
_PRW 7.2.13 Use as needed; power management specific.
|
||||
|
||||
_PRx 7.2.8-11 Use as needed; power management specific. If _PR0 is
|
||||
defined, _PR3 must also be defined.
|
||||
|
||||
_PSC 7.2.6 Use as needed; power management specific.
|
||||
|
||||
_PSE 7.2.7 Use as needed; power management specific.
|
||||
|
||||
_PSW 7.2.14 Use as needed; power management specific.
|
||||
|
||||
_PSx 7.2.2-5 Use as needed; power management specific. If _PS0 is
|
||||
defined, _PS3 must also be defined. If clocks or
|
||||
regulators need adjusting to be consistent with power
|
||||
usage, change them in these methods.
|
||||
|
||||
\_PTS 7.3.1 Use as needed; power management specific.
|
||||
|
||||
_PXM 6.2.14 Optional.
|
||||
|
||||
_REG 6.5.4 Use as needed.
|
||||
|
||||
\_REV 5.7.4 Always returns the latest version of ACPI supported.
|
||||
|
||||
_RMV 6.3.6 Optional.
|
||||
|
||||
\_SB 5.3.1 Required on arm64; all devices must be defined in this
|
||||
namespace.
|
||||
|
||||
_SEG 6.5.6 Use as needed; PCI-specific.
|
||||
|
||||
\_SI 5.3.1, Optional.
|
||||
9.1
|
||||
|
||||
_SLI 6.2.15 Optional; recommended when SLIT table is in use.
|
||||
|
||||
_STA 6.3.7, It is recommended to define this method for any device
|
||||
7.1.4 that can be turned on or off.
|
||||
|
||||
_SRS 6.2.16 Optional; see also _PRS.
|
||||
|
||||
_STR 6.1.10 Recommended for conveying device names to end users;
|
||||
this is preferred over using _DDN.
|
||||
|
||||
_SUB 6.1.9 Use as needed; _HID or _CID are preferred.
|
||||
|
||||
_SUN 6.1.11 Optional.
|
||||
|
||||
\_Sx 7.3.2 Use as needed; power management specific.
|
||||
|
||||
_SxD 7.2.16-19 Use as needed; power management specific.
|
||||
|
||||
_SxW 7.2.20-24 Use as needed; power management specific.
|
||||
|
||||
_SWS 7.3.3 Use as needed; power management specific; this may
|
||||
require specification changes for use on arm64.
|
||||
|
||||
\_TTS 7.3.4 Use as needed; power management specific.
|
||||
|
||||
\_TZ 5.3.1 Optional.
|
||||
|
||||
_UID 6.1.12 Recommended for distinguishing devices of the same
|
||||
class; define it if at all possible.
|
||||
|
||||
\_WAK 7.3.5 Use as needed; power management specific.
|
||||
|
||||
|
||||
ACPI Event Model
|
||||
----------------
|
||||
Do not use GPE block devices; these are not supported in the hardware reduced
|
||||
profile used by arm64. Since there are no GPE blocks defined for use on ARM
|
||||
platforms, GPIO-signaled interrupts should be used for creating system events.
|
||||
|
||||
|
||||
ACPI Processor Control
|
||||
----------------------
|
||||
Section 8 of the ACPI specification is currently undergoing change that
|
||||
should be completed in the 6.0 version of the specification. Processor
|
||||
performance control will be handled differently for arm64 at that point
|
||||
in time. Processor aggregator devices (section 8.5) will not be used,
|
||||
for example, but another similar mechanism instead.
|
||||
|
||||
While UEFI constrains what we can say until the release of 6.0, it is
|
||||
recommended that CPPC (8.4.5) be used as the primary model. This will
|
||||
still be useful into the future. C-states and P-states will still be
|
||||
provided, but most of the current design work appears to favor CPPC.
|
||||
|
||||
Further, it is essential that the ARMv8 SoC provide a fully functional
|
||||
implementation of PSCI; this will be the only mechanism supported by ACPI
|
||||
to control CPU power state (including secondary CPU booting).
|
||||
|
||||
More details will be provided on the release of the ACPI 6.0 specification.
|
||||
|
||||
|
||||
ACPI System Address Map Interfaces
|
||||
----------------------------------
|
||||
In Section 15 of the ACPI specification, several methods are mentioned as
|
||||
possible mechanisms for conveying memory resource information to the kernel.
|
||||
For arm64, we will only support UEFI for booting with ACPI, hence the UEFI
|
||||
GetMemoryMap() boot service is the only mechanism that will be used.
|
||||
|
||||
|
||||
ACPI Platform Error Interfaces (APEI)
|
||||
-------------------------------------
|
||||
The APEI tables supported are described above.
|
||||
|
||||
APEI requires the equivalent of an SCI and an NMI on ARMv8. The SCI is used
|
||||
to notify the OSPM of errors that have occurred but can be corrected and the
|
||||
system can continue correct operation, even if possibly degraded. The NMI is
|
||||
used to indicate fatal errors that cannot be corrected, and require immediate
|
||||
attention.
|
||||
|
||||
Since there is no direct equivalent of the x86 SCI or NMI, arm64 handles
|
||||
these slightly differently. The SCI is handled as a normal GPIO-signaled
|
||||
interrupt; given that these are corrected (or correctable) errors being
|
||||
reported, this is sufficient. The NMI is emulated as the highest priority
|
||||
GPIO-signaled interrupt possible. This implies some caution must be used
|
||||
since there could be interrupts at higher privilege levels or even interrupts
|
||||
at the same priority as the emulated NMI. In Linux, this should not be the
|
||||
case but one should be aware it could happen.
|
||||
|
||||
|
||||
ACPI Objects Not Supported on ARM64
|
||||
-----------------------------------
|
||||
While this may change in the future, there are several classes of objects
|
||||
that can be defined, but are not currently of general interest to ARM servers.
|
||||
|
||||
These are not supported:
|
||||
|
||||
-- Section 9.2: ambient light sensor devices
|
||||
|
||||
-- Section 9.3: battery devices
|
||||
|
||||
-- Section 9.4: lids (e.g., laptop lids)
|
||||
|
||||
-- Section 9.8.2: IDE controllers
|
||||
|
||||
-- Section 9.9: floppy controllers
|
||||
|
||||
-- Section 9.10: GPE block devices
|
||||
|
||||
-- Section 9.15: PC/AT RTC/CMOS devices
|
||||
|
||||
-- Section 9.16: user presence detection devices
|
||||
|
||||
-- Section 9.17: I/O APIC devices; all GICs must be enumerable via MADT
|
||||
|
||||
-- Section 9.18: time and alarm devices (see 9.15)
|
||||
|
||||
|
||||
ACPI Objects Not Yet Implemented
|
||||
--------------------------------
|
||||
While these objects have x86 equivalents, and they do make some sense in ARM
|
||||
servers, there is either no hardware available at present, or in some cases
|
||||
there may not yet be a non-ARM implementation. Hence, they are currently not
|
||||
implemented though that may change in the future.
|
||||
|
||||
Not yet implemented are:
|
||||
|
||||
-- Section 10: power source and power meter devices
|
||||
|
||||
-- Section 11: thermal management
|
||||
|
||||
-- Section 12: embedded controllers interface
|
||||
|
||||
-- Section 13: SMBus interfaces
|
||||
|
||||
-- Section 17: NUMA support (prototypes have been submitted for
|
||||
review)
|
|
@ -0,0 +1,505 @@
|
|||
ACPI on ARMv8 Servers
|
||||
---------------------
|
||||
ACPI can be used for ARMv8 general purpose servers designed to follow
|
||||
the ARM SBSA (Server Base System Architecture) [0] and SBBR (Server
|
||||
Base Boot Requirements) [1] specifications. Please note that the SBBR
|
||||
can be retrieved simply by visiting [1], but the SBSA is currently only
|
||||
available to those with an ARM login due to ARM IP licensing concerns.
|
||||
|
||||
The ARMv8 kernel implements the reduced hardware model of ACPI version
|
||||
5.1 or later. Links to the specification and all external documents
|
||||
it refers to are managed by the UEFI Forum. The specification is
|
||||
available at http://www.uefi.org/specifications and documents referenced
|
||||
by the specification can be found via http://www.uefi.org/acpi.
|
||||
|
||||
If an ARMv8 system does not meet the requirements of the SBSA and SBBR,
|
||||
or cannot be described using the mechanisms defined in the required ACPI
|
||||
specifications, then ACPI may not be a good fit for the hardware.
|
||||
|
||||
While the documents mentioned above set out the requirements for building
|
||||
industry-standard ARMv8 servers, they also apply to more than one operating
|
||||
system. The purpose of this document is to describe the interaction between
|
||||
ACPI and Linux only, on an ARMv8 system -- that is, what Linux expects of
|
||||
ACPI and what ACPI can expect of Linux.
|
||||
|
||||
|
||||
Why ACPI on ARM?
|
||||
----------------
|
||||
Before examining the details of the interface between ACPI and Linux, it is
|
||||
useful to understand why ACPI is being used. Several technologies already
|
||||
exist in Linux for describing non-enumerable hardware, after all. In this
|
||||
section we summarize a blog post [2] from Grant Likely that outlines the
|
||||
reasoning behind ACPI on ARMv8 servers. Actually, we snitch a good portion
|
||||
of the summary text almost directly, to be honest.
|
||||
|
||||
The short form of the rationale for ACPI on ARM is:
|
||||
|
||||
-- ACPI’s bytecode (AML) allows the platform to encode hardware behavior,
|
||||
while DT explicitly does not support this. For hardware vendors, being
|
||||
able to encode behavior is a key tool used in supporting operating
|
||||
system releases on new hardware.
|
||||
|
||||
-- ACPI’s OSPM defines a power management model that constrains what the
|
||||
platform is allowed to do into a specific model, while still providing
|
||||
flexibility in hardware design.
|
||||
|
||||
-- In the enterprise server environment, ACPI has established bindings (such
|
||||
as for RAS) which are currently used in production systems. DT does not.
|
||||
Such bindings could be defined in DT at some point, but doing so means ARM
|
||||
and x86 would end up using completely different code paths in both firmware
|
||||
and the kernel.
|
||||
|
||||
-- Choosing a single interface to describe the abstraction between a platform
|
||||
and an OS is important. Hardware vendors would not be required to implement
|
||||
both DT and ACPI if they want to support multiple operating systems. And,
|
||||
agreeing on a single interface instead of being fragmented into per OS
|
||||
interfaces makes for better interoperability overall.
|
||||
|
||||
-- The new ACPI governance process works well and Linux is now at the same
|
||||
table as hardware vendors and other OS vendors. In fact, there is no
|
||||
longer any reason to feel that ACPI is only belongs to Windows or that
|
||||
Linux is in any way secondary to Microsoft in this arena. The move of
|
||||
ACPI governance into the UEFI forum has significantly opened up the
|
||||
specification development process, and currently, a large portion of the
|
||||
changes being made to ACPI is being driven by Linux.
|
||||
|
||||
Key to the use of ACPI is the support model. For servers in general, the
|
||||
responsibility for hardware behaviour cannot solely be the domain of the
|
||||
kernel, but rather must be split between the platform and the kernel, in
|
||||
order to allow for orderly change over time. ACPI frees the OS from needing
|
||||
to understand all the minute details of the hardware so that the OS doesn’t
|
||||
need to be ported to each and every device individually. It allows the
|
||||
hardware vendors to take responsibility for power management behaviour without
|
||||
depending on an OS release cycle which is not under their control.
|
||||
|
||||
ACPI is also important because hardware and OS vendors have already worked
|
||||
out the mechanisms for supporting a general purpose computing ecosystem. The
|
||||
infrastructure is in place, the bindings are in place, and the processes are
|
||||
in place. DT does exactly what Linux needs it to when working with vertically
|
||||
integrated devices, but there are no good processes for supporting what the
|
||||
server vendors need. Linux could potentially get there with DT, but doing so
|
||||
really just duplicates something that already works. ACPI already does what
|
||||
the hardware vendors need, Microsoft won’t collaborate on DT, and hardware
|
||||
vendors would still end up providing two completely separate firmware
|
||||
interfaces -- one for Linux and one for Windows.
|
||||
|
||||
|
||||
Kernel Compatibility
|
||||
--------------------
|
||||
One of the primary motivations for ACPI is standardization, and using that
|
||||
to provide backward compatibility for Linux kernels. In the server market,
|
||||
software and hardware are often used for long periods. ACPI allows the
|
||||
kernel and firmware to agree on a consistent abstraction that can be
|
||||
maintained over time, even as hardware or software change. As long as the
|
||||
abstraction is supported, systems can be updated without necessarily having
|
||||
to replace the kernel.
|
||||
|
||||
When a Linux driver or subsystem is first implemented using ACPI, it by
|
||||
definition ends up requiring a specific version of the ACPI specification
|
||||
-- it's baseline. ACPI firmware must continue to work, even though it may
|
||||
not be optimal, with the earliest kernel version that first provides support
|
||||
for that baseline version of ACPI. There may be a need for additional drivers,
|
||||
but adding new functionality (e.g., CPU power management) should not break
|
||||
older kernel versions. Further, ACPI firmware must also work with the most
|
||||
recent version of the kernel.
|
||||
|
||||
|
||||
Relationship with Device Tree
|
||||
-----------------------------
|
||||
ACPI support in drivers and subsystems for ARMv8 should never be mutually
|
||||
exclusive with DT support at compile time.
|
||||
|
||||
At boot time the kernel will only use one description method depending on
|
||||
parameters passed from the bootloader (including kernel bootargs).
|
||||
|
||||
Regardless of whether DT or ACPI is used, the kernel must always be capable
|
||||
of booting with either scheme (in kernels with both schemes enabled at compile
|
||||
time).
|
||||
|
||||
|
||||
Booting using ACPI tables
|
||||
-------------------------
|
||||
The only defined method for passing ACPI tables to the kernel on ARMv8
|
||||
is via the UEFI system configuration table. Just so it is explicit, this
|
||||
means that ACPI is only supported on platforms that boot via UEFI.
|
||||
|
||||
When an ARMv8 system boots, it can either have DT information, ACPI tables,
|
||||
or in some very unusual cases, both. If no command line parameters are used,
|
||||
the kernel will try to use DT for device enumeration; if there is no DT
|
||||
present, the kernel will try to use ACPI tables, but only if they are present.
|
||||
In neither is available, the kernel will not boot. If acpi=force is used
|
||||
on the command line, the kernel will attempt to use ACPI tables first, but
|
||||
fall back to DT if there are no ACPI tables present. The basic idea is that
|
||||
the kernel will not fail to boot unless it absolutely has no other choice.
|
||||
|
||||
Processing of ACPI tables may be disabled by passing acpi=off on the kernel
|
||||
command line; this is the default behavior.
|
||||
|
||||
In order for the kernel to load and use ACPI tables, the UEFI implementation
|
||||
MUST set the ACPI_20_TABLE_GUID to point to the RSDP table (the table with
|
||||
the ACPI signature "RSD PTR "). If this pointer is incorrect and acpi=force
|
||||
is used, the kernel will disable ACPI and try to use DT to boot instead; the
|
||||
kernel has, in effect, determined that ACPI tables are not present at that
|
||||
point.
|
||||
|
||||
If the pointer to the RSDP table is correct, the table will be mapped into
|
||||
the kernel by the ACPI core, using the address provided by UEFI.
|
||||
|
||||
The ACPI core will then locate and map in all other ACPI tables provided by
|
||||
using the addresses in the RSDP table to find the XSDT (eXtended System
|
||||
Description Table). The XSDT in turn provides the addresses to all other
|
||||
ACPI tables provided by the system firmware; the ACPI core will then traverse
|
||||
this table and map in the tables listed.
|
||||
|
||||
The ACPI core will ignore any provided RSDT (Root System Description Table).
|
||||
RSDTs have been deprecated and are ignored on arm64 since they only allow
|
||||
for 32-bit addresses.
|
||||
|
||||
Further, the ACPI core will only use the 64-bit address fields in the FADT
|
||||
(Fixed ACPI Description Table). Any 32-bit address fields in the FADT will
|
||||
be ignored on arm64.
|
||||
|
||||
Hardware reduced mode (see Section 4.1 of the ACPI 5.1 specification) will
|
||||
be enforced by the ACPI core on arm64. Doing so allows the ACPI core to
|
||||
run less complex code since it no longer has to provide support for legacy
|
||||
hardware from other architectures. Any fields that are not to be used for
|
||||
hardware reduced mode must be set to zero.
|
||||
|
||||
For the ACPI core to operate properly, and in turn provide the information
|
||||
the kernel needs to configure devices, it expects to find the following
|
||||
tables (all section numbers refer to the ACPI 5.1 specfication):
|
||||
|
||||
-- RSDP (Root System Description Pointer), section 5.2.5
|
||||
|
||||
-- XSDT (eXtended System Description Table), section 5.2.8
|
||||
|
||||
-- FADT (Fixed ACPI Description Table), section 5.2.9
|
||||
|
||||
-- DSDT (Differentiated System Description Table), section
|
||||
5.2.11.1
|
||||
|
||||
-- MADT (Multiple APIC Description Table), section 5.2.12
|
||||
|
||||
-- GTDT (Generic Timer Description Table), section 5.2.24
|
||||
|
||||
-- If PCI is supported, the MCFG (Memory mapped ConFiGuration
|
||||
Table), section 5.2.6, specifically Table 5-31.
|
||||
|
||||
If the above tables are not all present, the kernel may or may not be
|
||||
able to boot properly since it may not be able to configure all of the
|
||||
devices available.
|
||||
|
||||
|
||||
ACPI Detection
|
||||
--------------
|
||||
Drivers should determine their probe() type by checking for a null
|
||||
value for ACPI_HANDLE, or checking .of_node, or other information in
|
||||
the device structure. This is detailed further in the "Driver
|
||||
Recommendations" section.
|
||||
|
||||
In non-driver code, if the presence of ACPI needs to be detected at
|
||||
runtime, then check the value of acpi_disabled. If CONFIG_ACPI is not
|
||||
set, acpi_disabled will always be 1.
|
||||
|
||||
|
||||
Device Enumeration
|
||||
------------------
|
||||
Device descriptions in ACPI should use standard recognized ACPI interfaces.
|
||||
These may contain less information than is typically provided via a Device
|
||||
Tree description for the same device. This is also one of the reasons that
|
||||
ACPI can be useful -- the driver takes into account that it may have less
|
||||
detailed information about the device and uses sensible defaults instead.
|
||||
If done properly in the driver, the hardware can change and improve over
|
||||
time without the driver having to change at all.
|
||||
|
||||
Clocks provide an excellent example. In DT, clocks need to be specified
|
||||
and the drivers need to take them into account. In ACPI, the assumption
|
||||
is that UEFI will leave the device in a reasonable default state, including
|
||||
any clock settings. If for some reason the driver needs to change a clock
|
||||
value, this can be done in an ACPI method; all the driver needs to do is
|
||||
invoke the method and not concern itself with what the method needs to do
|
||||
to change the clock. Changing the hardware can then take place over time
|
||||
by changing what the ACPI method does, and not the driver.
|
||||
|
||||
In DT, the parameters needed by the driver to set up clocks as in the example
|
||||
above are known as "bindings"; in ACPI, these are known as "Device Properties"
|
||||
and provided to a driver via the _DSD object.
|
||||
|
||||
ACPI tables are described with a formal language called ASL, the ACPI
|
||||
Source Language (section 19 of the specification). This means that there
|
||||
are always multiple ways to describe the same thing -- including device
|
||||
properties. For example, device properties could use an ASL construct
|
||||
that looks like this: Name(KEY0, "value0"). An ACPI device driver would
|
||||
then retrieve the value of the property by evaluating the KEY0 object.
|
||||
However, using Name() this way has multiple problems: (1) ACPI limits
|
||||
names ("KEY0") to four characters unlike DT; (2) there is no industry
|
||||
wide registry that maintains a list of names, minimzing re-use; (3)
|
||||
there is also no registry for the definition of property values ("value0"),
|
||||
again making re-use difficult; and (4) how does one maintain backward
|
||||
compatibility as new hardware comes out? The _DSD method was created
|
||||
to solve precisely these sorts of problems; Linux drivers should ALWAYS
|
||||
use the _DSD method for device properties and nothing else.
|
||||
|
||||
The _DSM object (ACPI Section 9.14.1) could also be used for conveying
|
||||
device properties to a driver. Linux drivers should only expect it to
|
||||
be used if _DSD cannot represent the data required, and there is no way
|
||||
to create a new UUID for the _DSD object. Note that there is even less
|
||||
regulation of the use of _DSM than there is of _DSD. Drivers that depend
|
||||
on the contents of _DSM objects will be more difficult to maintain over
|
||||
time because of this; as of this writing, the use of _DSM is the cause
|
||||
of quite a few firmware problems and is not recommended.
|
||||
|
||||
Drivers should look for device properties in the _DSD object ONLY; the _DSD
|
||||
object is described in the ACPI specification section 6.2.5, but this only
|
||||
describes how to define the structure of an object returned via _DSD, and
|
||||
how specific data structures are defined by specific UUIDs. Linux should
|
||||
only use the _DSD Device Properties UUID [5]:
|
||||
|
||||
-- UUID: daffd814-6eba-4d8c-8a91-bc9bbf4aa301
|
||||
|
||||
-- http://www.uefi.org/sites/default/files/resources/_DSD-device-properties-UUID.pdf
|
||||
|
||||
The UEFI Forum provides a mechanism for registering device properties [4]
|
||||
so that they may be used across all operating systems supporting ACPI.
|
||||
Device properties that have not been registered with the UEFI Forum should
|
||||
not be used.
|
||||
|
||||
Before creating new device properties, check to be sure that they have not
|
||||
been defined before and either registered in the Linux kernel documentation
|
||||
as DT bindings, or the UEFI Forum as device properties. While we do not want
|
||||
to simply move all DT bindings into ACPI device properties, we can learn from
|
||||
what has been previously defined.
|
||||
|
||||
If it is necessary to define a new device property, or if it makes sense to
|
||||
synthesize the definition of a binding so it can be used in any firmware,
|
||||
both DT bindings and ACPI device properties for device drivers have review
|
||||
processes. Use them both. When the driver itself is submitted for review
|
||||
to the Linux mailing lists, the device property definitions needed must be
|
||||
submitted at the same time. A driver that supports ACPI and uses device
|
||||
properties will not be considered complete without their definitions. Once
|
||||
the device property has been accepted by the Linux community, it must be
|
||||
registered with the UEFI Forum [4], which will review it again for consistency
|
||||
within the registry. This may require iteration. The UEFI Forum, though,
|
||||
will always be the canonical site for device property definitions.
|
||||
|
||||
It may make sense to provide notice to the UEFI Forum that there is the
|
||||
intent to register a previously unused device property name as a means of
|
||||
reserving the name for later use. Other operating system vendors will
|
||||
also be submitting registration requests and this may help smooth the
|
||||
process.
|
||||
|
||||
Once registration and review have been completed, the kernel provides an
|
||||
interface for looking up device properties in a manner independent of
|
||||
whether DT or ACPI is being used. This API should be used [6]; it can
|
||||
eliminate some duplication of code paths in driver probing functions and
|
||||
discourage divergence between DT bindings and ACPI device properties.
|
||||
|
||||
|
||||
Programmable Power Control Resources
|
||||
------------------------------------
|
||||
Programmable power control resources include such resources as voltage/current
|
||||
providers (regulators) and clock sources.
|
||||
|
||||
With ACPI, the kernel clock and regulator framework is not expected to be used
|
||||
at all.
|
||||
|
||||
The kernel assumes that power control of these resources is represented with
|
||||
Power Resource Objects (ACPI section 7.1). The ACPI core will then handle
|
||||
correctly enabling and disabling resources as they are needed. In order to
|
||||
get that to work, ACPI assumes each device has defined D-states and that these
|
||||
can be controlled through the optional ACPI methods _PS0, _PS1, _PS2, and _PS3;
|
||||
in ACPI, _PS0 is the method to invoke to turn a device full on, and _PS3 is for
|
||||
turning a device full off.
|
||||
|
||||
There are two options for using those Power Resources. They can:
|
||||
|
||||
-- be managed in a _PSx method which gets called on entry to power
|
||||
state Dx.
|
||||
|
||||
-- be declared separately as power resources with their own _ON and _OFF
|
||||
methods. They are then tied back to D-states for a particular device
|
||||
via _PRx which specifies which power resources a device needs to be on
|
||||
while in Dx. Kernel then tracks number of devices using a power resource
|
||||
and calls _ON/_OFF as needed.
|
||||
|
||||
The kernel ACPI code will also assume that the _PSx methods follow the normal
|
||||
ACPI rules for such methods:
|
||||
|
||||
-- If either _PS0 or _PS3 is implemented, then the other method must also
|
||||
be implemented.
|
||||
|
||||
-- If a device requires usage or setup of a power resource when on, the ASL
|
||||
should organize that it is allocated/enabled using the _PS0 method.
|
||||
|
||||
-- Resources allocated or enabled in the _PS0 method should be disabled
|
||||
or de-allocated in the _PS3 method.
|
||||
|
||||
-- Firmware will leave the resources in a reasonable state before handing
|
||||
over control to the kernel.
|
||||
|
||||
Such code in _PSx methods will of course be very platform specific. But,
|
||||
this allows the driver to abstract out the interface for operating the device
|
||||
and avoid having to read special non-standard values from ACPI tables. Further,
|
||||
abstracting the use of these resources allows the hardware to change over time
|
||||
without requiring updates to the driver.
|
||||
|
||||
|
||||
Clocks
|
||||
------
|
||||
ACPI makes the assumption that clocks are initialized by the firmware --
|
||||
UEFI, in this case -- to some working value before control is handed over
|
||||
to the kernel. This has implications for devices such as UARTs, or SoC-driven
|
||||
LCD displays, for example.
|
||||
|
||||
When the kernel boots, the clocks are assumed to be set to reasonable
|
||||
working values. If for some reason the frequency needs to change -- e.g.,
|
||||
throttling for power management -- the device driver should expect that
|
||||
process to be abstracted out into some ACPI method that can be invoked
|
||||
(please see the ACPI specification for further recommendations on standard
|
||||
methods to be expected). The only exceptions to this are CPU clocks where
|
||||
CPPC provides a much richer interface than ACPI methods. If the clocks
|
||||
are not set, there is no direct way for Linux to control them.
|
||||
|
||||
If an SoC vendor wants to provide fine-grained control of the system clocks,
|
||||
they could do so by providing ACPI methods that could be invoked by Linux
|
||||
drivers. However, this is NOT recommended and Linux drivers should NOT use
|
||||
such methods, even if they are provided. Such methods are not currently
|
||||
standardized in the ACPI specification, and using them could tie a kernel
|
||||
to a very specific SoC, or tie an SoC to a very specific version of the
|
||||
kernel, both of which we are trying to avoid.
|
||||
|
||||
|
||||
Driver Recommendations
|
||||
----------------------
|
||||
DO NOT remove any DT handling when adding ACPI support for a driver. The
|
||||
same device may be used on many different systems.
|
||||
|
||||
DO try to structure the driver so that it is data-driven. That is, set up
|
||||
a struct containing internal per-device state based on defaults and whatever
|
||||
else must be discovered by the driver probe function. Then, have the rest
|
||||
of the driver operate off of the contents of that struct. Doing so should
|
||||
allow most divergence between ACPI and DT functionality to be kept local to
|
||||
the probe function instead of being scattered throughout the driver. For
|
||||
example:
|
||||
|
||||
static int device_probe_dt(struct platform_device *pdev)
|
||||
{
|
||||
/* DT specific functionality */
|
||||
...
|
||||
}
|
||||
|
||||
static int device_probe_acpi(struct platform_device *pdev)
|
||||
{
|
||||
/* ACPI specific functionality */
|
||||
...
|
||||
}
|
||||
|
||||
static int device_probe(struct platform_device *pdev)
|
||||
{
|
||||
...
|
||||
struct device_node node = pdev->dev.of_node;
|
||||
...
|
||||
|
||||
if (node)
|
||||
ret = device_probe_dt(pdev);
|
||||
else if (ACPI_HANDLE(&pdev->dev))
|
||||
ret = device_probe_acpi(pdev);
|
||||
else
|
||||
/* other initialization */
|
||||
...
|
||||
/* Continue with any generic probe operations */
|
||||
...
|
||||
}
|
||||
|
||||
DO keep the MODULE_DEVICE_TABLE entries together in the driver to make it
|
||||
clear the different names the driver is probed for, both from DT and from
|
||||
ACPI:
|
||||
|
||||
static struct of_device_id virtio_mmio_match[] = {
|
||||
{ .compatible = "virtio,mmio", },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, virtio_mmio_match);
|
||||
|
||||
static const struct acpi_device_id virtio_mmio_acpi_match[] = {
|
||||
{ "LNRO0005", },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(acpi, virtio_mmio_acpi_match);
|
||||
|
||||
|
||||
ASWG
|
||||
----
|
||||
The ACPI specification changes regularly. During the year 2014, for instance,
|
||||
version 5.1 was released and version 6.0 substantially completed, with most of
|
||||
the changes being driven by ARM-specific requirements. Proposed changes are
|
||||
presented and discussed in the ASWG (ACPI Specification Working Group) which
|
||||
is a part of the UEFI Forum.
|
||||
|
||||
Participation in this group is open to all UEFI members. Please see
|
||||
http://www.uefi.org/workinggroup for details on group membership.
|
||||
|
||||
It is the intent of the ARMv8 ACPI kernel code to follow the ACPI specification
|
||||
as closely as possible, and to only implement functionality that complies with
|
||||
the released standards from UEFI ASWG. As a practical matter, there will be
|
||||
vendors that provide bad ACPI tables or violate the standards in some way.
|
||||
If this is because of errors, quirks and fixups may be necessary, but will
|
||||
be avoided if possible. If there are features missing from ACPI that preclude
|
||||
it from being used on a platform, ECRs (Engineering Change Requests) should be
|
||||
submitted to ASWG and go through the normal approval process; for those that
|
||||
are not UEFI members, many other members of the Linux community are and would
|
||||
likely be willing to assist in submitting ECRs.
|
||||
|
||||
|
||||
Linux Code
|
||||
----------
|
||||
Individual items specific to Linux on ARM, contained in the the Linux
|
||||
source code, are in the list that follows:
|
||||
|
||||
ACPI_OS_NAME This macro defines the string to be returned when
|
||||
an ACPI method invokes the _OS method. On ARM64
|
||||
systems, this macro will be "Linux" by default.
|
||||
The command line parameter acpi_os=<string>
|
||||
can be used to set it to some other value. The
|
||||
default value for other architectures is "Microsoft
|
||||
Windows NT", for example.
|
||||
|
||||
ACPI Objects
|
||||
------------
|
||||
Detailed expectations for ACPI tables and object are listed in the file
|
||||
Documentation/arm64/acpi_object_usage.txt.
|
||||
|
||||
|
||||
References
|
||||
----------
|
||||
[0] http://silver.arm.com -- document ARM-DEN-0029, or newer
|
||||
"Server Base System Architecture", version 2.3, dated 27 Mar 2014
|
||||
|
||||
[1] http://infocenter.arm.com/help/topic/com.arm.doc.den0044a/Server_Base_Boot_Requirements.pdf
|
||||
Document ARM-DEN-0044A, or newer: "Server Base Boot Requirements, System
|
||||
Software on ARM Platforms", dated 16 Aug 2014
|
||||
|
||||
[2] http://www.secretlab.ca/archives/151, 10 Jan 2015, Copyright (c) 2015,
|
||||
Linaro Ltd., written by Grant Likely. A copy of the verbatim text (apart
|
||||
from formatting) is also in Documentation/arm64/why_use_acpi.txt.
|
||||
|
||||
[3] AMD ACPI for Seattle platform documentation:
|
||||
http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2012/10/Seattle_ACPI_Guide.pdf
|
||||
|
||||
[4] http://www.uefi.org/acpi -- please see the link for the "ACPI _DSD Device
|
||||
Property Registry Instructions"
|
||||
|
||||
[5] http://www.uefi.org/acpi -- please see the link for the "_DSD (Device
|
||||
Specific Data) Implementation Guide"
|
||||
|
||||
[6] Kernel code for the unified device property interface can be found in
|
||||
include/linux/property.h and drivers/base/property.c.
|
||||
|
||||
|
||||
Authors
|
||||
-------
|
||||
Al Stone <al.stone@linaro.org>
|
||||
Graeme Gregory <graeme.gregory@linaro.org>
|
||||
Hanjun Guo <hanjun.guo@linaro.org>
|
||||
|
||||
Grant Likely <grant.likely@linaro.org>, for the "Why ACPI on ARM?" section
|
|
@ -1,5 +1,5 @@
|
|||
ifneq ($(CONFIG_BLACKFIN),)
|
||||
ifneq ($(CONFIG_BFIN_GPTIMERS,)
|
||||
ifneq ($(CONFIG_BFIN_GPTIMERS),)
|
||||
obj-m := gptimers-example.o
|
||||
endif
|
||||
endif
|
||||
|
|
|
@ -48,8 +48,7 @@ Description of Contents:
|
|||
- Highmem I/O support
|
||||
- I/O scheduler modularization
|
||||
1.2 Tuning based on high level requirements/capabilities
|
||||
1.2.1 I/O Barriers
|
||||
1.2.2 Request Priority/Latency
|
||||
1.2.1 Request Priority/Latency
|
||||
1.3 Direct access/bypass to lower layers for diagnostics and special
|
||||
device operations
|
||||
1.3.1 Pre-built commands
|
||||
|
@ -255,29 +254,12 @@ some control over i/o ordering.
|
|||
What kind of support exists at the generic block layer for this ?
|
||||
|
||||
The flags and rw fields in the bio structure can be used for some tuning
|
||||
from above e.g indicating that an i/o is just a readahead request, or for
|
||||
marking barrier requests (discussed next), or priority settings (currently
|
||||
unused). As far as user applications are concerned they would need an
|
||||
additional mechanism either via open flags or ioctls, or some other upper
|
||||
level mechanism to communicate such settings to block.
|
||||
from above e.g indicating that an i/o is just a readahead request, or priority
|
||||
settings (currently unused). As far as user applications are concerned they
|
||||
would need an additional mechanism either via open flags or ioctls, or some
|
||||
other upper level mechanism to communicate such settings to block.
|
||||
|
||||
1.2.1 I/O Barriers
|
||||
|
||||
There is a way to enforce strict ordering for i/os through barriers.
|
||||
All requests before a barrier point must be serviced before the barrier
|
||||
request and any other requests arriving after the barrier will not be
|
||||
serviced until after the barrier has completed. This is useful for higher
|
||||
level control on write ordering, e.g flushing a log of committed updates
|
||||
to disk before the corresponding updates themselves.
|
||||
|
||||
A flag in the bio structure, BIO_BARRIER is used to identify a barrier i/o.
|
||||
The generic i/o scheduler would make sure that it places the barrier request and
|
||||
all other requests coming after it after all the previous requests in the
|
||||
queue. Barriers may be implemented in different ways depending on the
|
||||
driver. For more details regarding I/O barriers, please read barrier.txt
|
||||
in this directory.
|
||||
|
||||
1.2.2 Request Priority/Latency
|
||||
1.2.1 Request Priority/Latency
|
||||
|
||||
Todo/Under discussion:
|
||||
Arjan's proposed request priority scheme allows higher levels some broad
|
||||
|
@ -906,8 +888,8 @@ queue and specific I/O schedulers. Unless stated otherwise, elevator is used
|
|||
to refer to both parts and I/O scheduler to specific I/O schedulers.
|
||||
|
||||
Block layer implements generic dispatch queue in block/*.c.
|
||||
The generic dispatch queue is responsible for properly ordering barrier
|
||||
requests, requeueing, handling non-fs requests and all other subtleties.
|
||||
The generic dispatch queue is responsible for requeueing, handling non-fs
|
||||
requests and all other subtleties.
|
||||
|
||||
Specific I/O schedulers are responsible for ordering normal filesystem
|
||||
requests. They can also choose to delay certain requests to improve
|
||||
|
|
|
@ -275,11 +275,6 @@ When oom event notifier is registered, event will be delivered.
|
|||
|
||||
2.7 Kernel Memory Extension (CONFIG_MEMCG_KMEM)
|
||||
|
||||
WARNING: Current implementation lacks reclaim support. That means allocation
|
||||
attempts will fail when close to the limit even if there are plenty of
|
||||
kmem available for reclaim. That makes this option unusable in real
|
||||
life so DO NOT SELECT IT unless for development purposes.
|
||||
|
||||
With the Kernel memory extension, the Memory Controller is able to limit
|
||||
the amount of kernel memory used by the system. Kernel memory is fundamentally
|
||||
different than user memory, since it can't be swapped out, which makes it
|
||||
|
@ -345,6 +340,9 @@ set:
|
|||
In this case, the admin could set up K so that the sum of all groups is
|
||||
never greater than the total memory, and freely set U at the cost of his
|
||||
QoS.
|
||||
WARNING: In the current implementation, memory reclaim will NOT be
|
||||
triggered for a cgroup when it hits K while staying below U, which makes
|
||||
this setup impractical.
|
||||
|
||||
U != 0, K >= U:
|
||||
Since kmem charges will also be fed to the user counter and reclaim will be
|
||||
|
|
|
@ -108,7 +108,7 @@ Never use anything other than cpumask_t to represent bitmap of CPUs.
|
|||
for_each_possible_cpu - Iterate over cpu_possible_mask
|
||||
for_each_online_cpu - Iterate over cpu_online_mask
|
||||
for_each_present_cpu - Iterate over cpu_present_mask
|
||||
for_each_cpu_mask(x,mask) - Iterate over some random collection of cpu mask.
|
||||
for_each_cpu(x,mask) - Iterate over some random collection of cpu mask.
|
||||
|
||||
#include <linux/cpu.h>
|
||||
get_online_cpus() and put_online_cpus():
|
||||
|
|
|
@ -5,7 +5,7 @@ Device-Mapper's "crypt" target provides transparent encryption of block devices
|
|||
using the kernel crypto API.
|
||||
|
||||
For a more detailed description of supported parameters see:
|
||||
http://code.google.com/p/cryptsetup/wiki/DMCrypt
|
||||
https://gitlab.com/cryptsetup/cryptsetup/wikis/DMCrypt
|
||||
|
||||
Parameters: <cipher> <key> <iv_offset> <device path> \
|
||||
<offset> [<#opt_params> <opt_params>]
|
||||
|
@ -80,7 +80,7 @@ Example scripts
|
|||
===============
|
||||
LUKS (Linux Unified Key Setup) is now the preferred way to set up disk
|
||||
encryption with dm-crypt using the 'cryptsetup' utility, see
|
||||
http://code.google.com/p/cryptsetup/
|
||||
https://gitlab.com/cryptsetup/cryptsetup
|
||||
|
||||
[[
|
||||
#!/bin/sh
|
||||
|
|
|
@ -0,0 +1,140 @@
|
|||
dm-log-writes
|
||||
=============
|
||||
|
||||
This target takes 2 devices, one to pass all IO to normally, and one to log all
|
||||
of the write operations to. This is intended for file system developers wishing
|
||||
to verify the integrity of metadata or data as the file system is written to.
|
||||
There is a log_write_entry written for every WRITE request and the target is
|
||||
able to take arbitrary data from userspace to insert into the log. The data
|
||||
that is in the WRITE requests is copied into the log to make the replay happen
|
||||
exactly as it happened originally.
|
||||
|
||||
Log Ordering
|
||||
============
|
||||
|
||||
We log things in order of completion once we are sure the write is no longer in
|
||||
cache. This means that normal WRITE requests are not actually logged until the
|
||||
next REQ_FLUSH request. This is to make it easier for userspace to replay the
|
||||
log in a way that correlates to what is on disk and not what is in cache, to
|
||||
make it easier to detect improper waiting/flushing.
|
||||
|
||||
This works by attaching all WRITE requests to a list once the write completes.
|
||||
Once we see a REQ_FLUSH request we splice this list onto the request and once
|
||||
the FLUSH request completes we log all of the WRITEs and then the FLUSH. Only
|
||||
completed WRITEs, at the time the REQ_FLUSH is issued, are added in order to
|
||||
simulate the worst case scenario with regard to power failures. Consider the
|
||||
following example (W means write, C means complete):
|
||||
|
||||
W1,W2,W3,C3,C2,Wflush,C1,Cflush
|
||||
|
||||
The log would show the following
|
||||
|
||||
W3,W2,flush,W1....
|
||||
|
||||
Again this is to simulate what is actually on disk, this allows us to detect
|
||||
cases where a power failure at a particular point in time would create an
|
||||
inconsistent file system.
|
||||
|
||||
Any REQ_FUA requests bypass this flushing mechanism and are logged as soon as
|
||||
they complete as those requests will obviously bypass the device cache.
|
||||
|
||||
Any REQ_DISCARD requests are treated like WRITE requests. Otherwise we would
|
||||
have all the DISCARD requests, and then the WRITE requests and then the FLUSH
|
||||
request. Consider the following example:
|
||||
|
||||
WRITE block 1, DISCARD block 1, FLUSH
|
||||
|
||||
If we logged DISCARD when it completed, the replay would look like this
|
||||
|
||||
DISCARD 1, WRITE 1, FLUSH
|
||||
|
||||
which isn't quite what happened and wouldn't be caught during the log replay.
|
||||
|
||||
Target interface
|
||||
================
|
||||
|
||||
i) Constructor
|
||||
|
||||
log-writes <dev_path> <log_dev_path>
|
||||
|
||||
dev_path : Device that all of the IO will go to normally.
|
||||
log_dev_path : Device where the log entries are written to.
|
||||
|
||||
ii) Status
|
||||
|
||||
<#logged entries> <highest allocated sector>
|
||||
|
||||
#logged entries : Number of logged entries
|
||||
highest allocated sector : Highest allocated sector
|
||||
|
||||
iii) Messages
|
||||
|
||||
mark <description>
|
||||
|
||||
You can use a dmsetup message to set an arbitrary mark in a log.
|
||||
For example say you want to fsck a file system after every
|
||||
write, but first you need to replay up to the mkfs to make sure
|
||||
we're fsck'ing something reasonable, you would do something like
|
||||
this:
|
||||
|
||||
mkfs.btrfs -f /dev/mapper/log
|
||||
dmsetup message log 0 mark mkfs
|
||||
<run test>
|
||||
|
||||
This would allow you to replay the log up to the mkfs mark and
|
||||
then replay from that point on doing the fsck check in the
|
||||
interval that you want.
|
||||
|
||||
Every log has a mark at the end labeled "dm-log-writes-end".
|
||||
|
||||
Userspace component
|
||||
===================
|
||||
|
||||
There is a userspace tool that will replay the log for you in various ways.
|
||||
It can be found here: https://github.com/josefbacik/log-writes
|
||||
|
||||
Example usage
|
||||
=============
|
||||
|
||||
Say you want to test fsync on your file system. You would do something like
|
||||
this:
|
||||
|
||||
TABLE="0 $(blockdev --getsz /dev/sdb) log-writes /dev/sdb /dev/sdc"
|
||||
dmsetup create log --table "$TABLE"
|
||||
mkfs.btrfs -f /dev/mapper/log
|
||||
dmsetup message log 0 mark mkfs
|
||||
|
||||
mount /dev/mapper/log /mnt/btrfs-test
|
||||
<some test that does fsync at the end>
|
||||
dmsetup message log 0 mark fsync
|
||||
md5sum /mnt/btrfs-test/foo
|
||||
umount /mnt/btrfs-test
|
||||
|
||||
dmsetup remove log
|
||||
replay-log --log /dev/sdc --replay /dev/sdb --end-mark fsync
|
||||
mount /dev/sdb /mnt/btrfs-test
|
||||
md5sum /mnt/btrfs-test/foo
|
||||
<verify md5sum's are correct>
|
||||
|
||||
Another option is to do a complicated file system operation and verify the file
|
||||
system is consistent during the entire operation. You could do this with:
|
||||
|
||||
TABLE="0 $(blockdev --getsz /dev/sdb) log-writes /dev/sdb /dev/sdc"
|
||||
dmsetup create log --table "$TABLE"
|
||||
mkfs.btrfs -f /dev/mapper/log
|
||||
dmsetup message log 0 mark mkfs
|
||||
|
||||
mount /dev/mapper/log /mnt/btrfs-test
|
||||
<fsstress to dirty the fs>
|
||||
btrfs filesystem balance /mnt/btrfs-test
|
||||
umount /mnt/btrfs-test
|
||||
dmsetup remove log
|
||||
|
||||
replay-log --log /dev/sdc --replay /dev/sdb --end-mark mkfs
|
||||
btrfsck /dev/sdb
|
||||
replay-log --log /dev/sdc --replay /dev/sdb --start-mark mkfs \
|
||||
--fsck "btrfsck /dev/sdb" --check fua
|
||||
|
||||
And that will replay the log until it sees a FUA request, run the fsck command
|
||||
and if the fsck passes it will replay to the next FUA, until it is completed or
|
||||
the fsck command exists abnormally.
|
|
@ -47,8 +47,8 @@ consume far too much memory.
|
|||
Using this device-mapper switch target we can now build a two-layer
|
||||
device hierarchy:
|
||||
|
||||
Upper Tier – Determine which array member the I/O should be sent to.
|
||||
Lower Tier – Load balance amongst paths to a particular member.
|
||||
Upper Tier - Determine which array member the I/O should be sent to.
|
||||
Lower Tier - Load balance amongst paths to a particular member.
|
||||
|
||||
The lower tier consists of a single dm multipath device for each member.
|
||||
Each of these multipath devices contains the set of paths directly to
|
||||
|
|
|
@ -380,9 +380,6 @@ then you'll have no access to blocks mapped beyond the end. If you
|
|||
load a target that is bigger than before, then extra blocks will be
|
||||
provisioned as and when needed.
|
||||
|
||||
If you wish to reduce the size of your thin device and potentially
|
||||
regain some space then send the 'trim' message to the pool.
|
||||
|
||||
ii) Status
|
||||
|
||||
<nr mapped sectors> <highest mapped sector>
|
||||
|
|
|
@ -11,6 +11,7 @@ Construction Parameters
|
|||
<data_block_size> <hash_block_size>
|
||||
<num_data_blocks> <hash_start_block>
|
||||
<algorithm> <digest> <salt>
|
||||
[<#opt_params> <opt_params>]
|
||||
|
||||
<version>
|
||||
This is the type of the on-disk hash format.
|
||||
|
@ -62,6 +63,22 @@ Construction Parameters
|
|||
<salt>
|
||||
The hexadecimal encoding of the salt value.
|
||||
|
||||
<#opt_params>
|
||||
Number of optional parameters. If there are no optional parameters,
|
||||
the optional paramaters section can be skipped or #opt_params can be zero.
|
||||
Otherwise #opt_params is the number of following arguments.
|
||||
|
||||
Example of optional parameters section:
|
||||
1 ignore_corruption
|
||||
|
||||
ignore_corruption
|
||||
Log corrupted blocks, but allow read operations to proceed normally.
|
||||
|
||||
restart_on_corruption
|
||||
Restart the system when a corrupted block is discovered. This option is
|
||||
not compatible with ignore_corruption and requires user space support to
|
||||
avoid restart loops.
|
||||
|
||||
Theory of operation
|
||||
===================
|
||||
|
||||
|
@ -125,7 +142,7 @@ block boundary) are the hash blocks which are stored a depth at a time
|
|||
|
||||
The full specification of kernel parameters and on-disk metadata format
|
||||
is available at the cryptsetup project's wiki page
|
||||
http://code.google.com/p/cryptsetup/wiki/DMVerity
|
||||
https://gitlab.com/cryptsetup/cryptsetup/wikis/DMVerity
|
||||
|
||||
Status
|
||||
======
|
||||
|
@ -142,7 +159,7 @@ Set up a device:
|
|||
|
||||
A command line tool veritysetup is available to compute or verify
|
||||
the hash tree or activate the kernel device. This is available from
|
||||
the cryptsetup upstream repository http://code.google.com/p/cryptsetup/
|
||||
the cryptsetup upstream repository https://gitlab.com/cryptsetup/cryptsetup/
|
||||
(as a libcryptsetup extension).
|
||||
|
||||
Create hash on the device:
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
* ARC Performance Counters
|
||||
|
||||
The ARC700 can be configured with a pipeline performance monitor for counting
|
||||
CPU and cache events like cache misses and hits. Like conventional PCT there
|
||||
are 100+ hardware conditions dynamically mapped to upto 32 counters
|
||||
|
||||
Note that:
|
||||
* The ARC 700 PCT does not support interrupts; although HW events may be
|
||||
counted, the HW events themselves cannot serve as a trigger for a sample.
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible : should contain
|
||||
"snps,arc700-pct"
|
||||
|
||||
Example:
|
||||
|
||||
pmu {
|
||||
compatible = "snps,arc700-pct";
|
||||
};
|
|
@ -1,24 +0,0 @@
|
|||
* ARC Performance Monitor Unit
|
||||
|
||||
The ARC 700 can be configured with a pipeline performance monitor for counting
|
||||
CPU and cache events like cache misses and hits.
|
||||
|
||||
Note that:
|
||||
* ARC 700 refers to a family of ARC processor cores;
|
||||
- There is only one type of PMU available for the whole family;
|
||||
- The PMU may support different sets of events; supported events are probed
|
||||
at boot time, as required by the reference manual.
|
||||
|
||||
* The ARC 700 PMU does not support interrupts; although HW events may be
|
||||
counted, the HW events themselves cannot serve as a trigger for a sample.
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible : should contain
|
||||
"snps,arc700-pmu"
|
||||
|
||||
Example:
|
||||
|
||||
pmu {
|
||||
compatible = "snps,arc700-pmu";
|
||||
};
|
|
@ -0,0 +1,88 @@
|
|||
Annapurna Labs Alpine Platform Device Tree Bindings
|
||||
---------------------------------------------------------------
|
||||
|
||||
Boards in the Alpine family shall have the following properties:
|
||||
|
||||
* Required root node properties:
|
||||
compatible: must contain "al,alpine"
|
||||
|
||||
* Example:
|
||||
|
||||
/ {
|
||||
model = "Annapurna Labs Alpine Dev Board";
|
||||
compatible = "al,alpine";
|
||||
|
||||
...
|
||||
}
|
||||
|
||||
* CPU node:
|
||||
|
||||
The Alpine platform includes cortex-a15 cores.
|
||||
enable-method: must be "al,alpine-smp" to allow smp [1]
|
||||
|
||||
Example:
|
||||
|
||||
cpus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
enable-method = "al,alpine-smp";
|
||||
|
||||
cpu@0 {
|
||||
compatible = "arm,cortex-a15";
|
||||
device_type = "cpu";
|
||||
reg = <0>;
|
||||
};
|
||||
|
||||
cpu@1 {
|
||||
compatible = "arm,cortex-a15";
|
||||
device_type = "cpu";
|
||||
reg = <1>;
|
||||
};
|
||||
|
||||
cpu@2 {
|
||||
compatible = "arm,cortex-a15";
|
||||
device_type = "cpu";
|
||||
reg = <2>;
|
||||
};
|
||||
|
||||
cpu@3 {
|
||||
compatible = "arm,cortex-a15";
|
||||
device_type = "cpu";
|
||||
reg = <3>;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
* Alpine CPU resume registers
|
||||
|
||||
The CPU resume register are used to define required resume address after
|
||||
reset.
|
||||
|
||||
Properties:
|
||||
- compatible : Should contain "al,alpine-cpu-resume".
|
||||
- reg : Offset and length of the register set for the device
|
||||
|
||||
Example:
|
||||
|
||||
cpu_resume {
|
||||
compatible = "al,alpine-cpu-resume";
|
||||
reg = <0xfbff5ed0 0x30>;
|
||||
};
|
||||
|
||||
* Alpine System-Fabric Service Registers
|
||||
|
||||
The System-Fabric Service Registers allow various operation on CPU and
|
||||
system fabric, like powering CPUs off.
|
||||
|
||||
Properties:
|
||||
- compatible : Should contain "al,alpine-sysfabric-service" and "syscon".
|
||||
- reg : Offset and length of the register set for the device
|
||||
|
||||
Example:
|
||||
|
||||
nb_service {
|
||||
compatible = "al,alpine-sysfabric-service", "syscon";
|
||||
reg = <0xfb070000 0x10000>;
|
||||
};
|
||||
|
||||
[1] arm/cpu-enable-method/al,alpine-smp
|
|
@ -0,0 +1,14 @@
|
|||
Altera's SoCFPGA platform device tree bindings
|
||||
---------------------------------------------
|
||||
|
||||
Boards with Cyclone 5 SoC:
|
||||
Required root node properties:
|
||||
compatible = "altr,socfpga-cyclone5", "altr,socfpga";
|
||||
|
||||
Boards with Arria 5 SoC:
|
||||
Required root node properties:
|
||||
compatible = "altr,socfpga-arria5", "altr,socfpga";
|
||||
|
||||
Boards with Arria 10 SoC:
|
||||
Required root node properties:
|
||||
compatible = "altr,socfpga-arria10", "altr,socfpga";
|
|
@ -8,3 +8,7 @@ Boards with the Amlogic Meson6 SoC shall have the following properties:
|
|||
Boards with the Amlogic Meson8 SoC shall have the following properties:
|
||||
Required root node property:
|
||||
compatible: "amlogic,meson8";
|
||||
|
||||
Board compatible values:
|
||||
- "geniatech,atv1200"
|
||||
- "minix,neo-x8"
|
||||
|
|
|
@ -17,7 +17,10 @@ to deliver its interrupts via SPIs.
|
|||
- interrupts : Interrupt list for secure, non-secure, virtual and
|
||||
hypervisor timers, in that order.
|
||||
|
||||
- clock-frequency : The frequency of the main counter, in Hz. Optional.
|
||||
- clock-frequency : The frequency of the main counter, in Hz. Should be present
|
||||
only where necessary to work around broken firmware which does not configure
|
||||
CNTFRQ on all CPUs to a uniform correct value. Use of this property is
|
||||
strongly discouraged; fix your firmware unless absolutely impossible.
|
||||
|
||||
- always-on : a boolean property. If present, the timer is powered through an
|
||||
always-on power domain, therefore it never loses context.
|
||||
|
@ -46,7 +49,8 @@ Example:
|
|||
|
||||
- compatible : Should at least contain "arm,armv7-timer-mem".
|
||||
|
||||
- clock-frequency : The frequency of the main counter, in Hz. Optional.
|
||||
- clock-frequency : The frequency of the main counter, in Hz. Should be present
|
||||
only when firmware has not configured the MMIO CNTFRQ registers.
|
||||
|
||||
- reg : The control frame base address.
|
||||
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
Marvell Armada 39x Platforms Device Tree Bindings
|
||||
-------------------------------------------------
|
||||
|
||||
Boards with a SoC of the Marvell Armada 39x family shall have the
|
||||
following property:
|
||||
|
||||
Required root node property:
|
||||
|
||||
- compatible: must contain "marvell,armada390"
|
||||
|
||||
In addition, boards using the Marvell Armada 398 SoC shall have the
|
||||
following property before the previous one:
|
||||
|
||||
Required root node property:
|
||||
|
||||
compatible: must contain "marvell,armada398"
|
||||
|
||||
Example:
|
||||
|
||||
compatible = "marvell,a398-db", "marvell,armada398", "marvell,armada390";
|
|
@ -46,10 +46,12 @@ PIT Timer required properties:
|
|||
shared across all System Controller members.
|
||||
|
||||
System Timer (ST) required properties:
|
||||
- compatible: Should be "atmel,at91rm9200-st"
|
||||
- compatible: Should be "atmel,at91rm9200-st", "syscon", "simple-mfd"
|
||||
- reg: Should contain registers location and length
|
||||
- interrupts: Should contain interrupt for the ST which is the IRQ line
|
||||
shared across all System Controller members.
|
||||
Its subnodes can be:
|
||||
- watchdog: compatible should be "atmel,at91rm9200-wdt"
|
||||
|
||||
TC/TCLIB Timer required properties:
|
||||
- compatible: Should be "atmel,<chip>-tcb".
|
||||
|
|
|
@ -94,8 +94,11 @@ specific to ARM.
|
|||
- compatible
|
||||
Usage: required
|
||||
Value type: <string>
|
||||
Definition: must be "arm,cci-400-pmu"
|
||||
|
||||
Definition: Must contain one of:
|
||||
"arm,cci-400-pmu,r0"
|
||||
"arm,cci-400-pmu,r1"
|
||||
"arm,cci-400-pmu" - DEPRECATED, permitted only where OS has
|
||||
secure acces to CCI registers
|
||||
- reg:
|
||||
Usage: required
|
||||
Value type: Integer cells. A register entry, expressed
|
||||
|
|
|
@ -61,7 +61,6 @@ Example:
|
|||
compatible = "arm,coresight-etb10", "arm,primecell";
|
||||
reg = <0 0x20010000 0 0x1000>;
|
||||
|
||||
coresight-default-sink;
|
||||
clocks = <&oscclk6a>;
|
||||
clock-names = "apb_pclk";
|
||||
port {
|
||||
|
|
|
@ -0,0 +1,52 @@
|
|||
========================================================
|
||||
Secondary CPU enable-method "al,alpine-smp" binding
|
||||
========================================================
|
||||
|
||||
This document describes the "al,alpine-smp" method for
|
||||
enabling secondary CPUs. To apply to all CPUs, a single
|
||||
"al,alpine-smp" enable method should be defined in the
|
||||
"cpus" node.
|
||||
|
||||
Enable method name: "al,alpine-smp"
|
||||
Compatible machines: "al,alpine"
|
||||
Compatible CPUs: "arm,cortex-a15"
|
||||
Related properties: (none)
|
||||
|
||||
Note:
|
||||
This enable method requires valid nodes compatible with
|
||||
"al,alpine-cpu-resume" and "al,alpine-nb-service"[1].
|
||||
|
||||
Example:
|
||||
|
||||
cpus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
enable-method = "al,alpine-smp";
|
||||
|
||||
cpu@0 {
|
||||
compatible = "arm,cortex-a15";
|
||||
device_type = "cpu";
|
||||
reg = <0>;
|
||||
};
|
||||
|
||||
cpu@1 {
|
||||
compatible = "arm,cortex-a15";
|
||||
device_type = "cpu";
|
||||
reg = <1>;
|
||||
};
|
||||
|
||||
cpu@2 {
|
||||
compatible = "arm,cortex-a15";
|
||||
device_type = "cpu";
|
||||
reg = <2>;
|
||||
};
|
||||
|
||||
cpu@3 {
|
||||
compatible = "arm,cortex-a15";
|
||||
device_type = "cpu";
|
||||
reg = <3>;
|
||||
};
|
||||
};
|
||||
|
||||
--
|
||||
[1] arm/al,alpine.txt
|
|
@ -192,6 +192,7 @@ nodes to be present and contain the properties described below.
|
|||
"brcm,brahma-b15"
|
||||
"marvell,armada-375-smp"
|
||||
"marvell,armada-380-smp"
|
||||
"marvell,armada-390-smp"
|
||||
"marvell,armada-xp-smp"
|
||||
"qcom,gcc-msm8660"
|
||||
"qcom,kpss-acc-v1"
|
||||
|
|
|
@ -22,6 +22,9 @@ Optional Properties:
|
|||
- pclkN, clkN: Pairs of parent of input clock and input clock to the
|
||||
devices in this power domain. Maximum of 4 pairs (N = 0 to 3)
|
||||
are supported currently.
|
||||
- asbN: Clocks required by asynchronous bridges (ASB) present in
|
||||
the power domain. These clock should be enabled during power
|
||||
domain on/off operations.
|
||||
- power-domains: phandle pointing to the parent power domain, for more details
|
||||
see Documentation/devicetree/bindings/power/power_domain.txt
|
||||
|
||||
|
|
|
@ -1,5 +0,0 @@
|
|||
Geniatech platforms device tree bindings
|
||||
-------------------------------------------
|
||||
|
||||
Geniatech ATV1200
|
||||
- compatible = "geniatech,atv1200"
|
|
@ -18,6 +18,8 @@ Main node required properties:
|
|||
"arm,arm11mp-gic"
|
||||
"brcm,brahma-b15-gic"
|
||||
"arm,arm1176jzf-devchip-gic"
|
||||
"qcom,msm-8660-qgic"
|
||||
"qcom,msm-qgic2"
|
||||
- interrupt-controller : Identifies the node as an interrupt controller
|
||||
- #interrupt-cells : Specifies the number of cells needed to encode an
|
||||
interrupt source. The type shall be a <u32> and the value shall be 3.
|
||||
|
|
|
@ -42,6 +42,7 @@ board. Currently known boards are:
|
|||
"lacie,cloudbox"
|
||||
"lacie,inetspace_v2"
|
||||
"lacie,laplug"
|
||||
"lacie,nas2big"
|
||||
"lacie,netspace_lite_v2"
|
||||
"lacie,netspace_max_v2"
|
||||
"lacie,netspace_mini_v2"
|
||||
|
|
|
@ -0,0 +1,84 @@
|
|||
QCOM Idle States for cpuidle driver
|
||||
|
||||
ARM provides idle-state node to define the cpuidle states, as defined in [1].
|
||||
cpuidle-qcom is the cpuidle driver for Qualcomm SoCs and uses these idle
|
||||
states. Idle states have different enter/exit latency and residency values.
|
||||
The idle states supported by the QCOM SoC are defined as -
|
||||
|
||||
* Standby
|
||||
* Retention
|
||||
* Standalone Power Collapse (Standalone PC or SPC)
|
||||
* Power Collapse (PC)
|
||||
|
||||
Standby: Standby does a little more in addition to architectural clock gating.
|
||||
When the WFI instruction is executed the ARM core would gate its internal
|
||||
clocks. In addition to gating the clocks, QCOM cpus use this instruction as a
|
||||
trigger to execute the SPM state machine. The SPM state machine waits for the
|
||||
interrupt to trigger the core back in to active. This triggers the cache
|
||||
hierarchy to enter standby states, when all cpus are idle. An interrupt brings
|
||||
the SPM state machine out of its wait, the next step is to ensure that the
|
||||
cache hierarchy is also out of standby, and then the cpu is allowed to resume
|
||||
execution. This state is defined as a generic ARM WFI state by the ARM cpuidle
|
||||
driver and is not defined in the DT. The SPM state machine should be
|
||||
configured to execute this state by default and after executing every other
|
||||
state below.
|
||||
|
||||
Retention: Retention is a low power state where the core is clock gated and
|
||||
the memory and the registers associated with the core are retained. The
|
||||
voltage may be reduced to the minimum value needed to keep the processor
|
||||
registers active. The SPM should be configured to execute the retention
|
||||
sequence and would wait for interrupt, before restoring the cpu to execution
|
||||
state. Retention may have a slightly higher latency than Standby.
|
||||
|
||||
Standalone PC: A cpu can power down and warmboot if there is a sufficient time
|
||||
between the time it enters idle and the next known wake up. SPC mode is used
|
||||
to indicate a core entering a power down state without consulting any other
|
||||
cpu or the system resources. This helps save power only on that core. The SPM
|
||||
sequence for this idle state is programmed to power down the supply to the
|
||||
core, wait for the interrupt, restore power to the core, and ensure the
|
||||
system state including cache hierarchy is ready before allowing core to
|
||||
resume. Applying power and resetting the core causes the core to warmboot
|
||||
back into Elevation Level (EL) which trampolines the control back to the
|
||||
kernel. Entering a power down state for the cpu, needs to be done by trapping
|
||||
into a EL. Failing to do so, would result in a crash enforced by the warm boot
|
||||
code in the EL for the SoC. On SoCs with write-back L1 cache, the cache has to
|
||||
be flushed in s/w, before powering down the core.
|
||||
|
||||
Power Collapse: This state is similar to the SPC mode, but distinguishes
|
||||
itself in that the cpu acknowledges and permits the SoC to enter deeper sleep
|
||||
modes. In a hierarchical power domain SoC, this means L2 and other caches can
|
||||
be flushed, system bus, clocks - lowered, and SoC main XO clock gated and
|
||||
voltages reduced, provided all cpus enter this state. Since the span of low
|
||||
power modes possible at this state is vast, the exit latency and the residency
|
||||
of this low power mode would be considered high even though at a cpu level,
|
||||
this essentially is cpu power down. The SPM in this state also may handshake
|
||||
with the Resource power manager (RPM) processor in the SoC to indicate a
|
||||
complete application processor subsystem shut down.
|
||||
|
||||
The idle-state for QCOM SoCs are distinguished by the compatible property of
|
||||
the idle-states device node.
|
||||
|
||||
The devicetree representation of the idle state should be -
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible: Must be one of -
|
||||
"qcom,idle-state-ret",
|
||||
"qcom,idle-state-spc",
|
||||
"qcom,idle-state-pc",
|
||||
and "arm,idle-state".
|
||||
|
||||
Other required and optional properties are specified in [1].
|
||||
|
||||
Example:
|
||||
|
||||
idle-states {
|
||||
CPU_SPC: spc {
|
||||
compatible = "qcom,idle-state-spc", "arm,idle-state";
|
||||
entry-latency-us = <150>;
|
||||
exit-latency-us = <200>;
|
||||
min-residency-us = <2000>;
|
||||
};
|
||||
};
|
||||
|
||||
[1]. Documentation/devicetree/bindings/arm/idle-states.txt
|
|
@ -2,22 +2,31 @@ SPM AVS Wrapper 2 (SAW2)
|
|||
|
||||
The SAW2 is a wrapper around the Subsystem Power Manager (SPM) and the
|
||||
Adaptive Voltage Scaling (AVS) hardware. The SPM is a programmable
|
||||
micro-controller that transitions a piece of hardware (like a processor or
|
||||
power-controller that transitions a piece of hardware (like a processor or
|
||||
subsystem) into and out of low power modes via a direct connection to
|
||||
the PMIC. It can also be wired up to interact with other processors in the
|
||||
system, notifying them when a low power state is entered or exited.
|
||||
|
||||
Multiple revisions of the SAW hardware are supported using these Device Nodes.
|
||||
SAW2 revisions differ in the register offset and configuration data. Also, the
|
||||
same revision of the SAW in different SoCs may have different configuration
|
||||
data due the the differences in hardware capabilities. Hence the SoC name, the
|
||||
version of the SAW hardware in that SoC and the distinction between cpu (big
|
||||
or Little) or cache, may be needed to uniquely identify the SAW register
|
||||
configuration and initialization data. The compatible string is used to
|
||||
indicate this parameter.
|
||||
|
||||
PROPERTIES
|
||||
|
||||
- compatible:
|
||||
Usage: required
|
||||
Value type: <string>
|
||||
Definition: shall contain "qcom,saw2". A more specific value should be
|
||||
one of:
|
||||
"qcom,saw2-v1"
|
||||
"qcom,saw2-v1.1"
|
||||
"qcom,saw2-v2"
|
||||
"qcom,saw2-v2.1"
|
||||
Definition: Must have
|
||||
"qcom,saw2"
|
||||
A more specific value could be one of:
|
||||
"qcom,apq8064-saw2-v1.1-cpu"
|
||||
"qcom,msm8974-saw2-v2.1-cpu"
|
||||
"qcom,apq8084-saw2-v2.1-cpu"
|
||||
|
||||
- reg:
|
||||
Usage: required
|
||||
|
@ -26,10 +35,23 @@ PROPERTIES
|
|||
the register region. An optional second element specifies
|
||||
the base address and size of the alias register region.
|
||||
|
||||
- regulator:
|
||||
Usage: optional
|
||||
Value type: boolean
|
||||
Definition: Indicates that this SPM device acts as a regulator device
|
||||
device for the core (CPU or Cache) the SPM is attached
|
||||
to.
|
||||
|
||||
Example:
|
||||
Example 1:
|
||||
|
||||
regulator@2099000 {
|
||||
power-controller@2099000 {
|
||||
compatible = "qcom,saw2";
|
||||
reg = <0x02099000 0x1000>, <0x02009000 0x1000>;
|
||||
regulator;
|
||||
};
|
||||
|
||||
Example 2:
|
||||
saw0: power-controller@f9089000 {
|
||||
compatible = "qcom,apq8084-saw2-v2.1-cpu", "qcom,saw2";
|
||||
reg = <0xf9089000 0x1000>, <0xf9009000 0x1000>;
|
||||
};
|
||||
|
|
|
@ -9,11 +9,17 @@ Properties:
|
|||
"qcom,scss-timer" - scorpion subsystem
|
||||
|
||||
- interrupts : Interrupts for the debug timer, the first general purpose
|
||||
timer, and optionally a second general purpose timer in that
|
||||
order.
|
||||
timer, and optionally a second general purpose timer, and
|
||||
optionally as well, 2 watchdog interrupts, in that order.
|
||||
|
||||
- reg : Specifies the base address of the timer registers.
|
||||
|
||||
- clocks: Reference to the parent clocks, one per output clock. The parents
|
||||
must appear in the same order as the clock names.
|
||||
|
||||
- clock-names: The name of the clocks as free-form strings. They should be in
|
||||
the same order as the clocks.
|
||||
|
||||
- clock-frequency : The frequency of the debug timer and the general purpose
|
||||
timer(s) in Hz in that order.
|
||||
|
||||
|
@ -29,9 +35,13 @@ Example:
|
|||
compatible = "qcom,scss-timer", "qcom,msm-timer";
|
||||
interrupts = <1 1 0x301>,
|
||||
<1 2 0x301>,
|
||||
<1 3 0x301>;
|
||||
<1 3 0x301>,
|
||||
<1 4 0x301>,
|
||||
<1 5 0x301>;
|
||||
reg = <0x0200a000 0x100>;
|
||||
clock-frequency = <19200000>,
|
||||
<32768>;
|
||||
clocks = <&sleep_clk>;
|
||||
clock-names = "sleep";
|
||||
cpu-offset = <0x40000>;
|
||||
};
|
||||
|
|
|
@ -0,0 +1,79 @@
|
|||
OMAP Control Module bindings
|
||||
|
||||
Control Module contains miscellaneous features under it based on SoC type.
|
||||
Pincontrol is one common feature, and it has a specialized support
|
||||
described in [1]. Typically some clock nodes are also under control module.
|
||||
Syscon is used to share register level access to drivers external to
|
||||
control module driver itself.
|
||||
|
||||
See [2] for documentation about clock/clockdomain nodes.
|
||||
|
||||
[1] Documentation/devicetree/bindings/pinctrl/pinctrl-single.txt
|
||||
[2] Documentation/devicetree/bindings/clock/ti/*
|
||||
|
||||
Required properties:
|
||||
- compatible: Must be one of:
|
||||
"ti,am3-scm"
|
||||
"ti,am4-scm"
|
||||
"ti,dm814-scrm"
|
||||
"ti,dm816-scrm"
|
||||
"ti,omap2-scm"
|
||||
"ti,omap3-scm"
|
||||
"ti,omap4-scm-core"
|
||||
"ti,omap4-scm-padconf-core"
|
||||
"ti,omap5-scm-core"
|
||||
"ti,omap5-scm-padconf-core"
|
||||
"ti,dra7-scm-core"
|
||||
- reg: Contains Control Module register address range
|
||||
(base address and length)
|
||||
|
||||
Optional properties:
|
||||
- clocks: clocks for this module
|
||||
- clockdomains: clockdomains for this module
|
||||
|
||||
Examples:
|
||||
|
||||
scm: scm@2000 {
|
||||
compatible = "ti,omap3-scm", "simple-bus";
|
||||
reg = <0x2000 0x2000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges = <0 0x2000 0x2000>;
|
||||
|
||||
omap3_pmx_core: pinmux@30 {
|
||||
compatible = "ti,omap3-padconf",
|
||||
"pinctrl-single";
|
||||
reg = <0x30 0x230>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-controller;
|
||||
pinctrl-single,register-width = <16>;
|
||||
pinctrl-single,function-mask = <0xff1f>;
|
||||
};
|
||||
|
||||
scm_conf: scm_conf@270 {
|
||||
compatible = "syscon";
|
||||
reg = <0x270 0x330>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
scm_clocks: clocks {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
};
|
||||
};
|
||||
|
||||
scm_clockdomains: clockdomains {
|
||||
};
|
||||
}
|
||||
|
||||
&scm_clocks {
|
||||
mcbsp5_mux_fck: mcbsp5_mux_fck {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,composite-mux-clock";
|
||||
clocks = <&core_96m_fck>, <&mcbsp_clks>;
|
||||
ti,bit-shift = <4>;
|
||||
reg = <0x02d8>;
|
||||
};
|
||||
};
|
|
@ -6,6 +6,7 @@ provided by Arteris.
|
|||
Required properties:
|
||||
- compatible : Should be "ti,omap3-l3-smx" for OMAP3 family
|
||||
Should be "ti,omap4-l3-noc" for OMAP4 family
|
||||
Should be "ti,omap5-l3-noc" for OMAP5 family
|
||||
Should be "ti,dra7-l3-noc" for DRA7 family
|
||||
Should be "ti,am4372-l3-noc" for AM43 family
|
||||
- reg: Contains L3 register address range for each noc domain.
|
||||
|
|
|
@ -0,0 +1,26 @@
|
|||
L4 interconnect bindings
|
||||
|
||||
These bindings describe the OMAP SoCs L4 interconnect bus.
|
||||
|
||||
Required properties:
|
||||
- compatible : Should be "ti,omap2-l4" for OMAP2 family l4 core bus
|
||||
Should be "ti,omap2-l4-wkup" for OMAP2 family l4 wkup bus
|
||||
Should be "ti,omap3-l4-core" for OMAP3 family l4 core bus
|
||||
Should be "ti,omap4-l4-cfg" for OMAP4 family l4 cfg bus
|
||||
Should be "ti,omap4-l4-wkup" for OMAP4 family l4 wkup bus
|
||||
Should be "ti,omap5-l4-cfg" for OMAP5 family l4 cfg bus
|
||||
Should be "ti,omap5-l4-wkup" for OMAP5 family l4 wkup bus
|
||||
Should be "ti,dra7-l4-cfg" for DRA7 family l4 cfg bus
|
||||
Should be "ti,dra7-l4-wkup" for DRA7 family l4 wkup bus
|
||||
Should be "ti,am3-l4-wkup" for AM33xx family l4 wkup bus
|
||||
Should be "ti,am4-l4-wkup" for AM43xx family l4 wkup bus
|
||||
- ranges : contains the IO map range for the bus
|
||||
|
||||
Examples:
|
||||
|
||||
l4: l4@48000000 {
|
||||
compatible "ti,omap2-l4", "simple-bus";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges = <0 0x48000000 0x100000>;
|
||||
};
|
|
@ -10,14 +10,10 @@ documentation about the individual clock/clockdomain nodes.
|
|||
Required properties:
|
||||
- compatible: Must be one of:
|
||||
"ti,am3-prcm"
|
||||
"ti,am3-scrm"
|
||||
"ti,am4-prcm"
|
||||
"ti,am4-scrm"
|
||||
"ti,omap2-prcm"
|
||||
"ti,omap2-scrm"
|
||||
"ti,omap3-prm"
|
||||
"ti,omap3-cm"
|
||||
"ti,omap3-scrm"
|
||||
"ti,omap4-cm1"
|
||||
"ti,omap4-prm"
|
||||
"ti,omap4-cm2"
|
||||
|
@ -29,6 +25,8 @@ Required properties:
|
|||
"ti,dra7-prm"
|
||||
"ti,dra7-cm-core-aon"
|
||||
"ti,dra7-cm-core"
|
||||
"ti,dm814-prcm"
|
||||
"ti,dm816-prcm"
|
||||
- reg: Contains PRCM module register address range
|
||||
(base address and length)
|
||||
- clocks: clocks for this module
|
||||
|
|
|
@ -22,3 +22,7 @@ Rockchip platforms device tree bindings
|
|||
- compatible = "firefly,firefly-rk3288", "rockchip,rk3288";
|
||||
or
|
||||
- compatible = "firefly,firefly-rk3288-beta", "rockchip,rk3288";
|
||||
|
||||
- ChipSPARK PopMetal-RK3288 board:
|
||||
Required root node properties:
|
||||
- compatible = "chipspark,popmetal-rk3288", "rockchip,rk3288";
|
||||
|
|
|
@ -7,8 +7,6 @@ SoCs:
|
|||
compatible = "renesas,emev2"
|
||||
- RZ/A1H (R7S72100)
|
||||
compatible = "renesas,r7s72100"
|
||||
- SH-Mobile AP4 (R8A73720/SH7372)
|
||||
compatible = "renesas,sh7372"
|
||||
- SH-Mobile AG5 (R8A73A00/SH73A0)
|
||||
compatible = "renesas,sh73a0"
|
||||
- R-Mobile APE6 (R8A73A40)
|
||||
|
@ -37,8 +35,6 @@ Boards:
|
|||
compatible = "renesas,alt", "renesas,r8a7794"
|
||||
- APE6-EVM
|
||||
compatible = "renesas,ape6evm", "renesas,r8a73a4"
|
||||
- APE6-EVM - Reference Device Tree Implementation
|
||||
compatible = "renesas,ape6evm-reference", "renesas,r8a73a4"
|
||||
- Atmark Techno Armadillo-800 EVA
|
||||
compatible = "renesas,armadillo800eva"
|
||||
- BOCK-W
|
||||
|
@ -57,12 +53,8 @@ Boards:
|
|||
compatible = "renesas,kzm9d", "renesas,emev2"
|
||||
- Kyoto Microcomputer Co. KZM-A9-GT
|
||||
compatible = "renesas,kzm9g", "renesas,sh73a0"
|
||||
- Kyoto Microcomputer Co. KZM-A9-GT - Reference Device Tree Implementation
|
||||
compatible = "renesas,kzm9g-reference", "renesas,sh73a0"
|
||||
- Lager (RTP0RC7790SEB00010S)
|
||||
compatible = "renesas,lager", "renesas,r8a7790"
|
||||
- Mackerel (R0P7372LC0016RL, AP4 EVM 2nd)
|
||||
compatible = "renesas,mackerel"
|
||||
- Marzen
|
||||
compatible = "renesas,marzen", "renesas,r8a7779"
|
||||
|
||||
|
|
|
@ -0,0 +1,32 @@
|
|||
NVIDIA Tegra Activity Monitor
|
||||
|
||||
The activity monitor block collects statistics about the behaviour of other
|
||||
components in the system. This information can be used to derive the rate at
|
||||
which the external memory needs to be clocked in order to serve all requests
|
||||
from the monitored clients.
|
||||
|
||||
Required properties:
|
||||
- compatible: should be "nvidia,tegra<chip>-actmon"
|
||||
- reg: offset and length of the register set for the device
|
||||
- interrupts: standard interrupt property
|
||||
- clocks: Must contain a phandle and clock specifier pair for each entry in
|
||||
clock-names. See ../../clock/clock-bindings.txt for details.
|
||||
- clock-names: Must include the following entries:
|
||||
- actmon
|
||||
- emc
|
||||
- resets: Must contain an entry for each entry in reset-names. See
|
||||
../../reset/reset.txt for details.
|
||||
- reset-names: Must include the following entries:
|
||||
- actmon
|
||||
|
||||
Example:
|
||||
actmon@6000c800 {
|
||||
compatible = "nvidia,tegra124-actmon";
|
||||
reg = <0x0 0x6000c800 0x0 0x400>;
|
||||
interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&tegra_car TEGRA124_CLK_ACTMON>,
|
||||
<&tegra_car TEGRA124_CLK_EMC>;
|
||||
clock-names = "actmon", "emc";
|
||||
resets = <&tegra_car 119>;
|
||||
reset-names = "actmon";
|
||||
};
|
|
@ -1,7 +1,8 @@
|
|||
* OMAP OCP2SCP - ocp interface to scp interface
|
||||
|
||||
properties:
|
||||
- compatible : Should be "ti,omap-ocp2scp"
|
||||
- compatible : Should be "ti,am437x-ocp2scp" for AM437x processor
|
||||
Should be "ti,omap-ocp2scp" for all others
|
||||
- reg : Address and length of the register set for the device
|
||||
- #address-cells, #size-cells : Must be present if the device has sub-nodes
|
||||
- ranges : the child address space are mapped 1:1 onto the parent address space
|
||||
|
|
|
@ -0,0 +1,46 @@
|
|||
Renesas Bus State Controller (BSC)
|
||||
==================================
|
||||
|
||||
The Renesas Bus State Controller (BSC, sometimes called "LBSC within Bus
|
||||
Bridge", or "External Bus Interface") can be found in several Renesas ARM SoCs.
|
||||
It provides an external bus for connecting multiple external devices to the
|
||||
SoC, driving several chip select lines, for e.g. NOR FLASH, Ethernet and USB.
|
||||
|
||||
While the BSC is a fairly simple memory-mapped bus, it may be part of a PM
|
||||
domain, and may have a gateable functional clock.
|
||||
Before a device connected to the BSC can be accessed, the PM domain
|
||||
containing the BSC must be powered on, and the functional clock
|
||||
driving the BSC must be enabled.
|
||||
|
||||
The bindings for the BSC extend the bindings for "simple-pm-bus".
|
||||
|
||||
|
||||
Required properties
|
||||
- compatible: Must contain an SoC-specific value, and "renesas,bsc" and
|
||||
"simple-pm-bus" as fallbacks.
|
||||
SoC-specific values can be:
|
||||
"renesas,bsc-r8a73a4" for R-Mobile APE6 (r8a73a4)
|
||||
"renesas,bsc-sh73a0" for SH-Mobile AG5 (sh73a0)
|
||||
- #address-cells, #size-cells, ranges: Must describe the mapping between
|
||||
parent address and child address spaces.
|
||||
- reg: Must contain the base address and length to access the bus controller.
|
||||
|
||||
Optional properties:
|
||||
- interrupts: Must contain a reference to the BSC interrupt, if available.
|
||||
- clocks: Must contain a reference to the functional clock, if available.
|
||||
- power-domains: Must contain a reference to the PM domain, if available.
|
||||
|
||||
|
||||
Example:
|
||||
|
||||
bsc: bus@fec10000 {
|
||||
compatible = "renesas,bsc-sh73a0", "renesas,bsc",
|
||||
"simple-pm-bus";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges = <0 0 0x20000000>;
|
||||
reg = <0xfec10000 0x400>;
|
||||
interrupts = <0 39 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&zb_clk>;
|
||||
power-domains = <&pd_a4s>;
|
||||
};
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue