Merge branch 'next' into for-linus
Prepare second round of input updates for 3.18.
This commit is contained in:
commit
4af6600fd7
917 changed files with 9587 additions and 5412 deletions
|
@ -2545,6 +2545,30 @@ fields changed from _s32 to _u32.
|
||||||
</orderedlist>
|
</orderedlist>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<title>V4L2 in Linux 3.16</title>
|
||||||
|
<orderedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>Added event V4L2_EVENT_SOURCE_CHANGE.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</orderedlist>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<title>V4L2 in Linux 3.17</title>
|
||||||
|
<orderedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>Extended &v4l2-pix-format;. Added format flags.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>Added compound control types and &VIDIOC-QUERY-EXT-CTRL;.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</orderedlist>
|
||||||
|
</section>
|
||||||
|
|
||||||
<section id="other">
|
<section id="other">
|
||||||
<title>Relation of V4L2 to other Linux multimedia APIs</title>
|
<title>Relation of V4L2 to other Linux multimedia APIs</title>
|
||||||
|
|
||||||
|
|
|
@ -29,9 +29,12 @@ can suspend execution until the driver has captured data or is ready
|
||||||
to accept data for output.</para>
|
to accept data for output.</para>
|
||||||
|
|
||||||
<para>When streaming I/O has been negotiated this function waits
|
<para>When streaming I/O has been negotiated this function waits
|
||||||
until a buffer has been filled or displayed and can be dequeued with
|
until a buffer has been filled by the capture device and can be dequeued
|
||||||
the &VIDIOC-DQBUF; ioctl. When buffers are already in the outgoing
|
with the &VIDIOC-DQBUF; ioctl. For output devices this function waits
|
||||||
queue of the driver the function returns immediately.</para>
|
until the device is ready to accept a new buffer to be queued up with
|
||||||
|
the &VIDIOC-QBUF; ioctl for display. When buffers are already in the outgoing
|
||||||
|
queue of the driver (capture) or the incoming queue isn't full (display)
|
||||||
|
the function returns immediately.</para>
|
||||||
|
|
||||||
<para>On success <function>poll()</function> returns the number of
|
<para>On success <function>poll()</function> returns the number of
|
||||||
file descriptors that have been selected (that is, file descriptors
|
file descriptors that have been selected (that is, file descriptors
|
||||||
|
@ -44,10 +47,22 @@ Capture devices set the <constant>POLLIN</constant> and
|
||||||
flags. When the function timed out it returns a value of zero, on
|
flags. When the function timed out it returns a value of zero, on
|
||||||
failure it returns <returnvalue>-1</returnvalue> and the
|
failure it returns <returnvalue>-1</returnvalue> and the
|
||||||
<varname>errno</varname> variable is set appropriately. When the
|
<varname>errno</varname> variable is set appropriately. When the
|
||||||
application did not call &VIDIOC-QBUF; or &VIDIOC-STREAMON; yet the
|
application did not call &VIDIOC-STREAMON; the
|
||||||
<function>poll()</function> function succeeds, but sets the
|
<function>poll()</function> function succeeds, but sets the
|
||||||
<constant>POLLERR</constant> flag in the
|
<constant>POLLERR</constant> flag in the
|
||||||
<structfield>revents</structfield> field.</para>
|
<structfield>revents</structfield> field. When the
|
||||||
|
application has called &VIDIOC-STREAMON; for a capture device but hasn't
|
||||||
|
yet called &VIDIOC-QBUF;, the <function>poll()</function> function
|
||||||
|
succeeds and sets the <constant>POLLERR</constant> flag in the
|
||||||
|
<structfield>revents</structfield> field. For output devices this
|
||||||
|
same situation will cause <function>poll()</function> to succeed
|
||||||
|
as well, but it sets the <constant>POLLOUT</constant> and
|
||||||
|
<constant>POLLWRNORM</constant> flags in the <structfield>revents</structfield>
|
||||||
|
field.</para>
|
||||||
|
|
||||||
|
<para>If an event occurred (see &VIDIOC-DQEVENT;) then
|
||||||
|
<constant>POLLPRI</constant> will be set in the <structfield>revents</structfield>
|
||||||
|
field and <function>poll()</function> will return.</para>
|
||||||
|
|
||||||
<para>When use of the <function>read()</function> function has
|
<para>When use of the <function>read()</function> function has
|
||||||
been negotiated and the driver does not capture yet, the
|
been negotiated and the driver does not capture yet, the
|
||||||
|
@ -58,10 +73,18 @@ continuously (as opposed to, for example, still images) the function
|
||||||
may return immediately.</para>
|
may return immediately.</para>
|
||||||
|
|
||||||
<para>When use of the <function>write()</function> function has
|
<para>When use of the <function>write()</function> function has
|
||||||
been negotiated the <function>poll</function> function just waits
|
been negotiated and the driver does not stream yet, the
|
||||||
|
<function>poll</function> function starts streaming. When that fails
|
||||||
|
it returns a <constant>POLLERR</constant> as above. Otherwise it waits
|
||||||
until the driver is ready for a non-blocking
|
until the driver is ready for a non-blocking
|
||||||
<function>write()</function> call.</para>
|
<function>write()</function> call.</para>
|
||||||
|
|
||||||
|
<para>If the caller is only interested in events (just
|
||||||
|
<constant>POLLPRI</constant> is set in the <structfield>events</structfield>
|
||||||
|
field), then <function>poll()</function> will <emphasis>not</emphasis>
|
||||||
|
start streaming if the driver does not stream yet. This makes it
|
||||||
|
possible to just poll for events and not for buffers.</para>
|
||||||
|
|
||||||
<para>All drivers implementing the <function>read()</function> or
|
<para>All drivers implementing the <function>read()</function> or
|
||||||
<function>write()</function> function or streaming I/O must also
|
<function>write()</function> function or streaming I/O must also
|
||||||
support the <function>poll()</function> function.</para>
|
support the <function>poll()</function> function.</para>
|
||||||
|
|
|
@ -152,10 +152,11 @@ structs, ioctls) must be noted in more detail in the history chapter
|
||||||
applications. -->
|
applications. -->
|
||||||
|
|
||||||
<revision>
|
<revision>
|
||||||
<revnumber>3.16</revnumber>
|
<revnumber>3.17</revnumber>
|
||||||
<date>2014-05-27</date>
|
<date>2014-08-04</date>
|
||||||
<authorinitials>lp</authorinitials>
|
<authorinitials>lp, hv</authorinitials>
|
||||||
<revremark>Extended &v4l2-pix-format;. Added format flags.
|
<revremark>Extended &v4l2-pix-format;. Added format flags. Added compound control types
|
||||||
|
and VIDIOC_QUERY_EXT_CTRL.
|
||||||
</revremark>
|
</revremark>
|
||||||
</revision>
|
</revision>
|
||||||
|
|
||||||
|
@ -538,7 +539,7 @@ and discussions on the V4L mailing list.</revremark>
|
||||||
</partinfo>
|
</partinfo>
|
||||||
|
|
||||||
<title>Video for Linux Two API Specification</title>
|
<title>Video for Linux Two API Specification</title>
|
||||||
<subtitle>Revision 3.14</subtitle>
|
<subtitle>Revision 3.17</subtitle>
|
||||||
|
|
||||||
<chapter id="common">
|
<chapter id="common">
|
||||||
&sub-common;
|
&sub-common;
|
||||||
|
|
|
@ -119,7 +119,7 @@
|
||||||
</row>
|
</row>
|
||||||
<row>
|
<row>
|
||||||
<entry>&v4l2-rect;</entry>
|
<entry>&v4l2-rect;</entry>
|
||||||
<entry><structfield>rect</structfield></entry>
|
<entry><structfield>r</structfield></entry>
|
||||||
<entry>Selection rectangle, in pixels.</entry>
|
<entry>Selection rectangle, in pixels.</entry>
|
||||||
</row>
|
</row>
|
||||||
<row>
|
<row>
|
||||||
|
|
|
@ -794,6 +794,7 @@ Greg Kroah-Hartman, "How to piss off a kernel subsystem maintainer".
|
||||||
<http://www.kroah.com/log/linux/maintainer-03.html>
|
<http://www.kroah.com/log/linux/maintainer-03.html>
|
||||||
<http://www.kroah.com/log/linux/maintainer-04.html>
|
<http://www.kroah.com/log/linux/maintainer-04.html>
|
||||||
<http://www.kroah.com/log/linux/maintainer-05.html>
|
<http://www.kroah.com/log/linux/maintainer-05.html>
|
||||||
|
<http://www.kroah.com/log/linux/maintainer-06.html>
|
||||||
|
|
||||||
NO!!!! No more huge patch bombs to linux-kernel@vger.kernel.org people!
|
NO!!!! No more huge patch bombs to linux-kernel@vger.kernel.org people!
|
||||||
<https://lkml.org/lkml/2005/7/11/336>
|
<https://lkml.org/lkml/2005/7/11/336>
|
||||||
|
|
|
@ -345,14 +345,14 @@ the named feature on.
|
||||||
The implementation is simple.
|
The implementation is simple.
|
||||||
|
|
||||||
Setting the flag 'cpuset.memory_spread_page' turns on a per-process flag
|
Setting the flag 'cpuset.memory_spread_page' turns on a per-process flag
|
||||||
PF_SPREAD_PAGE for each task that is in that cpuset or subsequently
|
PFA_SPREAD_PAGE for each task that is in that cpuset or subsequently
|
||||||
joins that cpuset. The page allocation calls for the page cache
|
joins that cpuset. The page allocation calls for the page cache
|
||||||
is modified to perform an inline check for this PF_SPREAD_PAGE task
|
is modified to perform an inline check for this PFA_SPREAD_PAGE task
|
||||||
flag, and if set, a call to a new routine cpuset_mem_spread_node()
|
flag, and if set, a call to a new routine cpuset_mem_spread_node()
|
||||||
returns the node to prefer for the allocation.
|
returns the node to prefer for the allocation.
|
||||||
|
|
||||||
Similarly, setting 'cpuset.memory_spread_slab' turns on the flag
|
Similarly, setting 'cpuset.memory_spread_slab' turns on the flag
|
||||||
PF_SPREAD_SLAB, and appropriately marked slab caches will allocate
|
PFA_SPREAD_SLAB, and appropriately marked slab caches will allocate
|
||||||
pages from the node returned by cpuset_mem_spread_node().
|
pages from the node returned by cpuset_mem_spread_node().
|
||||||
|
|
||||||
The cpuset_mem_spread_node() routine is also simple. It uses the
|
The cpuset_mem_spread_node() routine is also simple. It uses the
|
||||||
|
|
|
@ -16,9 +16,9 @@ Example:
|
||||||
* DMA client
|
* DMA client
|
||||||
|
|
||||||
Required properties:
|
Required properties:
|
||||||
- dmas: a list of <[DMA multiplexer phandle] [SRS/DRS value]> pairs,
|
- dmas: a list of <[DMA multiplexer phandle] [SRS << 8 | DRS]> pairs.
|
||||||
where SRS/DRS values are fixed handles, specified in the SoC
|
where SRS/DRS are specified in the SoC manual.
|
||||||
manual as the value that would be written into the PDMACHCR.
|
It will be written into PDMACHCR as high 16-bit parts.
|
||||||
- dma-names: a list of DMA channel names, one per "dmas" entry
|
- dma-names: a list of DMA channel names, one per "dmas" entry
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
|
@ -39,6 +39,10 @@ Optional properties:
|
||||||
further clocks may be specified in derived bindings.
|
further clocks may be specified in derived bindings.
|
||||||
- clock-names: One name for each entry in the clocks property, the
|
- clock-names: One name for each entry in the clocks property, the
|
||||||
first one should be "stmmaceth".
|
first one should be "stmmaceth".
|
||||||
|
- clk_ptp_ref: this is the PTP reference clock; in case of the PTP is
|
||||||
|
available this clock is used for programming the Timestamp Addend Register.
|
||||||
|
If not passed then the system clock will be used and this is fine on some
|
||||||
|
platforms.
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
|
|
||||||
|
|
|
@ -45,8 +45,8 @@ Example:
|
||||||
infet5-supply = <&some_reg>;
|
infet5-supply = <&some_reg>;
|
||||||
infet6-supply = <&some_reg>;
|
infet6-supply = <&some_reg>;
|
||||||
infet7-supply = <&some_reg>;
|
infet7-supply = <&some_reg>;
|
||||||
vsys_l1-supply = <&some_reg>;
|
vsys-l1-supply = <&some_reg>;
|
||||||
vsys_l2-supply = <&some_reg>;
|
vsys-l2-supply = <&some_reg>;
|
||||||
|
|
||||||
regulators {
|
regulators {
|
||||||
dcdc1 {
|
dcdc1 {
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
ADI AXI-SPDIF controller
|
ADI AXI-SPDIF controller
|
||||||
|
|
||||||
Required properties:
|
Required properties:
|
||||||
- compatible : Must be "adi,axi-spdif-1.00.a"
|
- compatible : Must be "adi,axi-spdif-tx-1.00.a"
|
||||||
- reg : Must contain SPDIF core's registers location and length
|
- reg : Must contain SPDIF core's registers location and length
|
||||||
- clocks : Pairs of phandle and specifier referencing the controller's clocks.
|
- clocks : Pairs of phandle and specifier referencing the controller's clocks.
|
||||||
The controller expects two clocks, the clock used for the AXI interface and
|
The controller expects two clocks, the clock used for the AXI interface and
|
||||||
|
|
|
@ -31,7 +31,7 @@ i2s@ff890000 {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
dmas = <&pdma1 0>, <&pdma1 1>;
|
dmas = <&pdma1 0>, <&pdma1 1>;
|
||||||
dma-names = "rx", "tx";
|
dma-names = "tx", "rx";
|
||||||
clock-names = "i2s_hclk", "i2s_clk";
|
clock-names = "i2s_hclk", "i2s_clk";
|
||||||
clocks = <&cru HCLK_I2S0>, <&cru SCLK_I2S0>;
|
clocks = <&cru HCLK_I2S0>, <&cru SCLK_I2S0>;
|
||||||
};
|
};
|
||||||
|
|
|
@ -16,11 +16,15 @@ Required Properties:
|
||||||
- clocks: Must contain an entry for each entry in clock-names.
|
- clocks: Must contain an entry for each entry in clock-names.
|
||||||
- clock-names: Shall be "spiclk" for the transfer-clock, and "apb_pclk" for
|
- clock-names: Shall be "spiclk" for the transfer-clock, and "apb_pclk" for
|
||||||
the peripheral clock.
|
the peripheral clock.
|
||||||
|
- #address-cells: should be 1.
|
||||||
|
- #size-cells: should be 0.
|
||||||
|
|
||||||
|
Optional Properties:
|
||||||
|
|
||||||
- dmas: DMA specifiers for tx and rx dma. See the DMA client binding,
|
- dmas: DMA specifiers for tx and rx dma. See the DMA client binding,
|
||||||
Documentation/devicetree/bindings/dma/dma.txt
|
Documentation/devicetree/bindings/dma/dma.txt
|
||||||
- dma-names: DMA request names should include "tx" and "rx" if present.
|
- dma-names: DMA request names should include "tx" and "rx" if present.
|
||||||
- #address-cells: should be 1.
|
|
||||||
- #size-cells: should be 0.
|
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
|
|
|
@ -56,6 +56,9 @@ Required properties:
|
||||||
- fsl,data-width : should be <18> or <24>
|
- fsl,data-width : should be <18> or <24>
|
||||||
- port: A port node with endpoint definitions as defined in
|
- port: A port node with endpoint definitions as defined in
|
||||||
Documentation/devicetree/bindings/media/video-interfaces.txt.
|
Documentation/devicetree/bindings/media/video-interfaces.txt.
|
||||||
|
On i.MX5, the internal two-input-multiplexer is used.
|
||||||
|
Due to hardware limitations, only one port (port@[0,1])
|
||||||
|
can be used for each channel (lvds-channel@[0,1], respectively)
|
||||||
On i.MX6, there should be four ports (port@[0-3]) that correspond
|
On i.MX6, there should be four ports (port@[0-3]) that correspond
|
||||||
to the four LVDS multiplexer inputs.
|
to the four LVDS multiplexer inputs.
|
||||||
|
|
||||||
|
@ -78,6 +81,8 @@ ldb: ldb@53fa8008 {
|
||||||
"di0", "di1";
|
"di0", "di1";
|
||||||
|
|
||||||
lvds-channel@0 {
|
lvds-channel@0 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
reg = <0>;
|
reg = <0>;
|
||||||
fsl,data-mapping = "spwg";
|
fsl,data-mapping = "spwg";
|
||||||
fsl,data-width = <24>;
|
fsl,data-width = <24>;
|
||||||
|
@ -86,7 +91,9 @@ ldb: ldb@53fa8008 {
|
||||||
/* ... */
|
/* ... */
|
||||||
};
|
};
|
||||||
|
|
||||||
port {
|
port@0 {
|
||||||
|
reg = <0>;
|
||||||
|
|
||||||
lvds0_in: endpoint {
|
lvds0_in: endpoint {
|
||||||
remote-endpoint = <&ipu_di0_lvds0>;
|
remote-endpoint = <&ipu_di0_lvds0>;
|
||||||
};
|
};
|
||||||
|
@ -94,6 +101,8 @@ ldb: ldb@53fa8008 {
|
||||||
};
|
};
|
||||||
|
|
||||||
lvds-channel@1 {
|
lvds-channel@1 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
reg = <1>;
|
reg = <1>;
|
||||||
fsl,data-mapping = "spwg";
|
fsl,data-mapping = "spwg";
|
||||||
fsl,data-width = <24>;
|
fsl,data-width = <24>;
|
||||||
|
@ -102,7 +111,9 @@ ldb: ldb@53fa8008 {
|
||||||
/* ... */
|
/* ... */
|
||||||
};
|
};
|
||||||
|
|
||||||
port {
|
port@1 {
|
||||||
|
reg = <1>;
|
||||||
|
|
||||||
lvds1_in: endpoint {
|
lvds1_in: endpoint {
|
||||||
remote-endpoint = <&ipu_di1_lvds1>;
|
remote-endpoint = <&ipu_di1_lvds1>;
|
||||||
};
|
};
|
||||||
|
|
|
@ -5,6 +5,7 @@ Required properties:
|
||||||
* "fsl,imx23-usbphy" for imx23 and imx28
|
* "fsl,imx23-usbphy" for imx23 and imx28
|
||||||
* "fsl,imx6q-usbphy" for imx6dq and imx6dl
|
* "fsl,imx6q-usbphy" for imx6dq and imx6dl
|
||||||
* "fsl,imx6sl-usbphy" for imx6sl
|
* "fsl,imx6sl-usbphy" for imx6sl
|
||||||
|
* "fsl,imx6sx-usbphy" for imx6sx
|
||||||
"fsl,imx23-usbphy" is still a fallback for other strings
|
"fsl,imx23-usbphy" is still a fallback for other strings
|
||||||
- reg: Should contain registers location and length
|
- reg: Should contain registers location and length
|
||||||
- interrupts: Should contain phy interrupt
|
- interrupts: Should contain phy interrupt
|
||||||
|
|
|
@ -2,7 +2,7 @@ Analog TV Connector
|
||||||
===================
|
===================
|
||||||
|
|
||||||
Required properties:
|
Required properties:
|
||||||
- compatible: "composite-connector" or "svideo-connector"
|
- compatible: "composite-video-connector" or "svideo-connector"
|
||||||
|
|
||||||
Optional properties:
|
Optional properties:
|
||||||
- label: a symbolic name for the connector
|
- label: a symbolic name for the connector
|
||||||
|
@ -14,7 +14,7 @@ Example
|
||||||
-------
|
-------
|
||||||
|
|
||||||
tv: connector {
|
tv: connector {
|
||||||
compatible = "composite-connector";
|
compatible = "composite-video-connector";
|
||||||
label = "tv";
|
label = "tv";
|
||||||
|
|
||||||
port {
|
port {
|
||||||
|
|
211
Documentation/devicetree/of_selftest.txt
Normal file
211
Documentation/devicetree/of_selftest.txt
Normal file
|
@ -0,0 +1,211 @@
|
||||||
|
Open Firmware Device Tree Selftest
|
||||||
|
----------------------------------
|
||||||
|
|
||||||
|
Author: Gaurav Minocha <gaurav.minocha.os@gmail.com>
|
||||||
|
|
||||||
|
1. Introduction
|
||||||
|
|
||||||
|
This document explains how the test data required for executing OF selftest
|
||||||
|
is attached to the live tree dynamically, independent of the machine's
|
||||||
|
architecture.
|
||||||
|
|
||||||
|
It is recommended to read the following documents before moving ahead.
|
||||||
|
|
||||||
|
[1] Documentation/devicetree/usage-model.txt
|
||||||
|
[2] http://www.devicetree.org/Device_Tree_Usage
|
||||||
|
|
||||||
|
OF Selftest has been designed to test the interface (include/linux/of.h)
|
||||||
|
provided to device driver developers to fetch the device information..etc.
|
||||||
|
from the unflattened device tree data structure. This interface is used by
|
||||||
|
most of the device drivers in various use cases.
|
||||||
|
|
||||||
|
|
||||||
|
2. Test-data
|
||||||
|
|
||||||
|
The Device Tree Source file (drivers/of/testcase-data/testcases.dts) contains
|
||||||
|
the test data required for executing the unit tests automated in
|
||||||
|
drivers/of/selftests.c. Currently, following Device Tree Source Include files
|
||||||
|
(.dtsi) are included in testcase.dts:
|
||||||
|
|
||||||
|
drivers/of/testcase-data/tests-interrupts.dtsi
|
||||||
|
drivers/of/testcase-data/tests-platform.dtsi
|
||||||
|
drivers/of/testcase-data/tests-phandle.dtsi
|
||||||
|
drivers/of/testcase-data/tests-match.dtsi
|
||||||
|
|
||||||
|
When the kernel is build with OF_SELFTEST enabled, then the following make rule
|
||||||
|
|
||||||
|
$(obj)/%.dtb: $(src)/%.dts FORCE
|
||||||
|
$(call if_changed_dep, dtc)
|
||||||
|
|
||||||
|
is used to compile the DT source file (testcase.dts) into a binary blob
|
||||||
|
(testcase.dtb), also referred as flattened DT.
|
||||||
|
|
||||||
|
After that, using the following rule the binary blob above is wrapped as an
|
||||||
|
assembly file (testcase.dtb.S).
|
||||||
|
|
||||||
|
$(obj)/%.dtb.S: $(obj)/%.dtb
|
||||||
|
$(call cmd, dt_S_dtb)
|
||||||
|
|
||||||
|
The assembly file is compiled into an object file (testcase.dtb.o), and is
|
||||||
|
linked into the kernel image.
|
||||||
|
|
||||||
|
|
||||||
|
2.1. Adding the test data
|
||||||
|
|
||||||
|
Un-flattened device tree structure:
|
||||||
|
|
||||||
|
Un-flattened device tree consists of connected device_node(s) in form of a tree
|
||||||
|
structure described below.
|
||||||
|
|
||||||
|
// following struct members are used to construct the tree
|
||||||
|
struct device_node {
|
||||||
|
...
|
||||||
|
struct device_node *parent;
|
||||||
|
struct device_node *child;
|
||||||
|
struct device_node *sibling;
|
||||||
|
struct device_node *allnext; /* next in list of all nodes */
|
||||||
|
...
|
||||||
|
};
|
||||||
|
|
||||||
|
Figure 1, describes a generic structure of machine’s un-flattened device tree
|
||||||
|
considering only child and sibling pointers. There exists another pointer,
|
||||||
|
*parent, that is used to traverse the tree in the reverse direction. So, at
|
||||||
|
a particular level the child node and all the sibling nodes will have a parent
|
||||||
|
pointer pointing to a common node (e.g. child1, sibling2, sibling3, sibling4’s
|
||||||
|
parent points to root node)
|
||||||
|
|
||||||
|
root (‘/’)
|
||||||
|
|
|
||||||
|
child1 -> sibling2 -> sibling3 -> sibling4 -> null
|
||||||
|
| | | |
|
||||||
|
| | | null
|
||||||
|
| | |
|
||||||
|
| | child31 -> sibling32 -> null
|
||||||
|
| | | |
|
||||||
|
| | null null
|
||||||
|
| |
|
||||||
|
| child21 -> sibling22 -> sibling23 -> null
|
||||||
|
| | | |
|
||||||
|
| null null null
|
||||||
|
|
|
||||||
|
child11 -> sibling12 -> sibling13 -> sibling14 -> null
|
||||||
|
| | | |
|
||||||
|
| | | null
|
||||||
|
| | |
|
||||||
|
null null child131 -> null
|
||||||
|
|
|
||||||
|
null
|
||||||
|
|
||||||
|
Figure 1: Generic structure of un-flattened device tree
|
||||||
|
|
||||||
|
|
||||||
|
*allnext: it is used to link all the nodes of DT into a list. So, for the
|
||||||
|
above tree the list would be as follows:
|
||||||
|
|
||||||
|
root->child1->child11->sibling12->sibling13->child131->sibling14->sibling2->
|
||||||
|
child21->sibling22->sibling23->sibling3->child31->sibling32->sibling4->null
|
||||||
|
|
||||||
|
Before executing OF selftest, it is required to attach the test data to
|
||||||
|
machine's device tree (if present). So, when selftest_data_add() is called,
|
||||||
|
at first it reads the flattened device tree data linked into the kernel image
|
||||||
|
via the following kernel symbols:
|
||||||
|
|
||||||
|
__dtb_testcases_begin - address marking the start of test data blob
|
||||||
|
__dtb_testcases_end - address marking the end of test data blob
|
||||||
|
|
||||||
|
Secondly, it calls of_fdt_unflatten_device_tree() to unflatten the flattened
|
||||||
|
blob. And finally, if the machine’s device tree (i.e live tree) is present,
|
||||||
|
then it attaches the unflattened test data tree to the live tree, else it
|
||||||
|
attaches itself as a live device tree.
|
||||||
|
|
||||||
|
attach_node_and_children() uses of_attach_node() to attach the nodes into the
|
||||||
|
live tree as explained below. To explain the same, the test data tree described
|
||||||
|
in Figure 2 is attached to the live tree described in Figure 1.
|
||||||
|
|
||||||
|
root (‘/’)
|
||||||
|
|
|
||||||
|
testcase-data
|
||||||
|
|
|
||||||
|
test-child0 -> test-sibling1 -> test-sibling2 -> test-sibling3 -> null
|
||||||
|
| | | |
|
||||||
|
test-child01 null null null
|
||||||
|
|
||||||
|
|
||||||
|
allnext list:
|
||||||
|
|
||||||
|
root->testcase-data->test-child0->test-child01->test-sibling1->test-sibling2
|
||||||
|
->test-sibling3->null
|
||||||
|
|
||||||
|
Figure 2: Example test data tree to be attached to live tree.
|
||||||
|
|
||||||
|
According to the scenario above, the live tree is already present so it isn’t
|
||||||
|
required to attach the root(‘/’) node. All other nodes are attached by calling
|
||||||
|
of_attach_node() on each node.
|
||||||
|
|
||||||
|
In the function of_attach_node(), the new node is attached as the child of the
|
||||||
|
given parent in live tree. But, if parent already has a child then the new node
|
||||||
|
replaces the current child and turns it into its sibling. So, when the testcase
|
||||||
|
data node is attached to the live tree above (Figure 1), the final structure is
|
||||||
|
as shown in Figure 3.
|
||||||
|
|
||||||
|
root (‘/’)
|
||||||
|
|
|
||||||
|
testcase-data -> child1 -> sibling2 -> sibling3 -> sibling4 -> null
|
||||||
|
| | | | |
|
||||||
|
(...) | | | null
|
||||||
|
| | child31 -> sibling32 -> null
|
||||||
|
| | | |
|
||||||
|
| | null null
|
||||||
|
| |
|
||||||
|
| child21 -> sibling22 -> sibling23 -> null
|
||||||
|
| | | |
|
||||||
|
| null null null
|
||||||
|
|
|
||||||
|
child11 -> sibling12 -> sibling13 -> sibling14 -> null
|
||||||
|
| | | |
|
||||||
|
null null | null
|
||||||
|
|
|
||||||
|
child131 -> null
|
||||||
|
|
|
||||||
|
null
|
||||||
|
-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
root (‘/’)
|
||||||
|
|
|
||||||
|
testcase-data -> child1 -> sibling2 -> sibling3 -> sibling4 -> null
|
||||||
|
| | | | |
|
||||||
|
| (...) (...) (...) null
|
||||||
|
|
|
||||||
|
test-sibling3 -> test-sibling2 -> test-sibling1 -> test-child0 -> null
|
||||||
|
| | | |
|
||||||
|
null null null test-child01
|
||||||
|
|
||||||
|
|
||||||
|
Figure 3: Live device tree structure after attaching the testcase-data.
|
||||||
|
|
||||||
|
|
||||||
|
Astute readers would have noticed that test-child0 node becomes the last
|
||||||
|
sibling compared to the earlier structure (Figure 2). After attaching first
|
||||||
|
test-child0 the test-sibling1 is attached that pushes the child node
|
||||||
|
(i.e. test-child0) to become a sibling and makes itself a child node,
|
||||||
|
as mentioned above.
|
||||||
|
|
||||||
|
If a duplicate node is found (i.e. if a node with same full_name property is
|
||||||
|
already present in the live tree), then the node isn’t attached rather its
|
||||||
|
properties are updated to the live tree’s node by calling the function
|
||||||
|
update_node_properties().
|
||||||
|
|
||||||
|
|
||||||
|
2.2. Removing the test data
|
||||||
|
|
||||||
|
Once the test case execution is complete, selftest_data_remove is called in
|
||||||
|
order to remove the device nodes attached initially (first the leaf nodes are
|
||||||
|
detached and then moving up the parent nodes are removed, and eventually the
|
||||||
|
whole tree). selftest_data_remove() calls detach_node_and_children() that uses
|
||||||
|
of_detach_node() to detach the nodes from the live device tree.
|
||||||
|
|
||||||
|
To detach a node, of_detach_node() first updates all_next linked list, by
|
||||||
|
attaching the previous node’s allnext to current node’s allnext pointer. And
|
||||||
|
then, it either updates the child pointer of given node’s parent to its
|
||||||
|
sibling or attaches the previous sibling to the given node’s sibling, as
|
||||||
|
appropriate. That is it :)
|
|
@ -138,9 +138,9 @@ Installation
|
||||||
- Build, install, reboot
|
- Build, install, reboot
|
||||||
|
|
||||||
The NFS/RDMA code will be enabled automatically if NFS and RDMA
|
The NFS/RDMA code will be enabled automatically if NFS and RDMA
|
||||||
are turned on. The NFS/RDMA client and server are configured via the hidden
|
are turned on. The NFS/RDMA client and server are configured via the
|
||||||
SUNRPC_XPRT_RDMA config option that depends on SUNRPC and INFINIBAND. The
|
SUNRPC_XPRT_RDMA_CLIENT and SUNRPC_XPRT_RDMA_SERVER config options that both
|
||||||
value of SUNRPC_XPRT_RDMA will be:
|
depend on SUNRPC and INFINIBAND. The default value of both options will be:
|
||||||
|
|
||||||
- N if either SUNRPC or INFINIBAND are N, in this case the NFS/RDMA client
|
- N if either SUNRPC or INFINIBAND are N, in this case the NFS/RDMA client
|
||||||
and server will not be built
|
and server will not be built
|
||||||
|
@ -235,8 +235,9 @@ NFS/RDMA Setup
|
||||||
|
|
||||||
- Start the NFS server
|
- Start the NFS server
|
||||||
|
|
||||||
If the NFS/RDMA server was built as a module (CONFIG_SUNRPC_XPRT_RDMA=m in
|
If the NFS/RDMA server was built as a module
|
||||||
kernel config), load the RDMA transport module:
|
(CONFIG_SUNRPC_XPRT_RDMA_SERVER=m in kernel config), load the RDMA
|
||||||
|
transport module:
|
||||||
|
|
||||||
$ modprobe svcrdma
|
$ modprobe svcrdma
|
||||||
|
|
||||||
|
@ -255,8 +256,9 @@ NFS/RDMA Setup
|
||||||
|
|
||||||
- On the client system
|
- On the client system
|
||||||
|
|
||||||
If the NFS/RDMA client was built as a module (CONFIG_SUNRPC_XPRT_RDMA=m in
|
If the NFS/RDMA client was built as a module
|
||||||
kernel config), load the RDMA client module:
|
(CONFIG_SUNRPC_XPRT_RDMA_CLIENT=m in kernel config), load the RDMA client
|
||||||
|
module:
|
||||||
|
|
||||||
$ modprobe xprtrdma.ko
|
$ modprobe xprtrdma.ko
|
||||||
|
|
||||||
|
|
|
@ -235,6 +235,39 @@ be used for more than one file, you can store an arbitrary pointer in the
|
||||||
private field of the seq_file structure; that value can then be retrieved
|
private field of the seq_file structure; that value can then be retrieved
|
||||||
by the iterator functions.
|
by the iterator functions.
|
||||||
|
|
||||||
|
There is also a wrapper function to seq_open() called seq_open_private(). It
|
||||||
|
kmallocs a zero filled block of memory and stores a pointer to it in the
|
||||||
|
private field of the seq_file structure, returning 0 on success. The
|
||||||
|
block size is specified in a third parameter to the function, e.g.:
|
||||||
|
|
||||||
|
static int ct_open(struct inode *inode, struct file *file)
|
||||||
|
{
|
||||||
|
return seq_open_private(file, &ct_seq_ops,
|
||||||
|
sizeof(struct mystruct));
|
||||||
|
}
|
||||||
|
|
||||||
|
There is also a variant function, __seq_open_private(), which is functionally
|
||||||
|
identical except that, if successful, it returns the pointer to the allocated
|
||||||
|
memory block, allowing further initialisation e.g.:
|
||||||
|
|
||||||
|
static int ct_open(struct inode *inode, struct file *file)
|
||||||
|
{
|
||||||
|
struct mystruct *p =
|
||||||
|
__seq_open_private(file, &ct_seq_ops, sizeof(*p));
|
||||||
|
|
||||||
|
if (!p)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
p->foo = bar; /* initialize my stuff */
|
||||||
|
...
|
||||||
|
p->baz = true;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
A corresponding close function, seq_release_private() is available which
|
||||||
|
frees the memory allocated in the corresponding open.
|
||||||
|
|
||||||
The other operations of interest - read(), llseek(), and release() - are
|
The other operations of interest - read(), llseek(), and release() - are
|
||||||
all implemented by the seq_file code itself. So a virtual file's
|
all implemented by the seq_file code itself. So a virtual file's
|
||||||
file_operations structure will look like:
|
file_operations structure will look like:
|
||||||
|
|
|
@ -53,7 +53,20 @@ with IS_ERR() (they will never return a NULL pointer). -ENOENT will be returned
|
||||||
if and only if no GPIO has been assigned to the device/function/index triplet,
|
if and only if no GPIO has been assigned to the device/function/index triplet,
|
||||||
other error codes are used for cases where a GPIO has been assigned but an error
|
other error codes are used for cases where a GPIO has been assigned but an error
|
||||||
occurred while trying to acquire it. This is useful to discriminate between mere
|
occurred while trying to acquire it. This is useful to discriminate between mere
|
||||||
errors and an absence of GPIO for optional GPIO parameters.
|
errors and an absence of GPIO for optional GPIO parameters. For the common
|
||||||
|
pattern where a GPIO is optional, the gpiod_get_optional() and
|
||||||
|
gpiod_get_index_optional() functions can be used. These functions return NULL
|
||||||
|
instead of -ENOENT if no GPIO has been assigned to the requested function:
|
||||||
|
|
||||||
|
|
||||||
|
struct gpio_desc *gpiod_get_optional(struct device *dev,
|
||||||
|
const char *con_id,
|
||||||
|
enum gpiod_flags flags)
|
||||||
|
|
||||||
|
struct gpio_desc *gpiod_get_index_optional(struct device *dev,
|
||||||
|
const char *con_id,
|
||||||
|
unsigned int index,
|
||||||
|
enum gpiod_flags flags)
|
||||||
|
|
||||||
Device-managed variants of these functions are also defined:
|
Device-managed variants of these functions are also defined:
|
||||||
|
|
||||||
|
@ -65,6 +78,15 @@ Device-managed variants of these functions are also defined:
|
||||||
unsigned int idx,
|
unsigned int idx,
|
||||||
enum gpiod_flags flags)
|
enum gpiod_flags flags)
|
||||||
|
|
||||||
|
struct gpio_desc *devm_gpiod_get_optional(struct device *dev,
|
||||||
|
const char *con_id,
|
||||||
|
enum gpiod_flags flags)
|
||||||
|
|
||||||
|
struct gpio_desc * devm_gpiod_get_index_optional(struct device *dev,
|
||||||
|
const char *con_id,
|
||||||
|
unsigned int index,
|
||||||
|
enum gpiod_flags flags)
|
||||||
|
|
||||||
A GPIO descriptor can be disposed of using the gpiod_put() function:
|
A GPIO descriptor can be disposed of using the gpiod_put() function:
|
||||||
|
|
||||||
void gpiod_put(struct gpio_desc *desc)
|
void gpiod_put(struct gpio_desc *desc)
|
||||||
|
|
|
@ -57,12 +57,12 @@ Well, you are all set up now. You can now use SMBus commands or plain
|
||||||
I2C to communicate with your device. SMBus commands are preferred if
|
I2C to communicate with your device. SMBus commands are preferred if
|
||||||
the device supports them. Both are illustrated below.
|
the device supports them. Both are illustrated below.
|
||||||
|
|
||||||
__u8 register = 0x10; /* Device register to access */
|
__u8 reg = 0x10; /* Device register to access */
|
||||||
__s32 res;
|
__s32 res;
|
||||||
char buf[10];
|
char buf[10];
|
||||||
|
|
||||||
/* Using SMBus commands */
|
/* Using SMBus commands */
|
||||||
res = i2c_smbus_read_word_data(file, register);
|
res = i2c_smbus_read_word_data(file, reg);
|
||||||
if (res < 0) {
|
if (res < 0) {
|
||||||
/* ERROR HANDLING: i2c transaction failed */
|
/* ERROR HANDLING: i2c transaction failed */
|
||||||
} else {
|
} else {
|
||||||
|
@ -70,11 +70,11 @@ the device supports them. Both are illustrated below.
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Using I2C Write, equivalent of
|
/* Using I2C Write, equivalent of
|
||||||
i2c_smbus_write_word_data(file, register, 0x6543) */
|
i2c_smbus_write_word_data(file, reg, 0x6543) */
|
||||||
buf[0] = register;
|
buf[0] = reg;
|
||||||
buf[1] = 0x43;
|
buf[1] = 0x43;
|
||||||
buf[2] = 0x65;
|
buf[2] = 0x65;
|
||||||
if (write(file, buf, 3) ! =3) {
|
if (write(file, buf, 3) != 3) {
|
||||||
/* ERROR HANDLING: i2c transaction failed */
|
/* ERROR HANDLING: i2c transaction failed */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1237,7 +1237,7 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
||||||
i8042.noloop [HW] Disable the AUX Loopback command while probing
|
i8042.noloop [HW] Disable the AUX Loopback command while probing
|
||||||
for the AUX port
|
for the AUX port
|
||||||
i8042.nomux [HW] Don't check presence of an active multiplexing
|
i8042.nomux [HW] Don't check presence of an active multiplexing
|
||||||
controller
|
controller. Default: true.
|
||||||
i8042.nopnp [HW] Don't use ACPIPnP / PnPBIOS to discover KBD/AUX
|
i8042.nopnp [HW] Don't use ACPIPnP / PnPBIOS to discover KBD/AUX
|
||||||
controllers
|
controllers
|
||||||
i8042.notimeout [HW] Ignore timeout condition signalled by controller
|
i8042.notimeout [HW] Ignore timeout condition signalled by controller
|
||||||
|
@ -3541,6 +3541,7 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
||||||
bogus residue values);
|
bogus residue values);
|
||||||
s = SINGLE_LUN (the device has only one
|
s = SINGLE_LUN (the device has only one
|
||||||
Logical Unit);
|
Logical Unit);
|
||||||
|
u = IGNORE_UAS (don't bind to the uas driver);
|
||||||
w = NO_WP_DETECT (don't test whether the
|
w = NO_WP_DETECT (don't test whether the
|
||||||
medium is write-protected).
|
medium is write-protected).
|
||||||
Example: quirks=0419:aaf5:rl,0421:0433:rc
|
Example: quirks=0419:aaf5:rl,0421:0433:rc
|
||||||
|
|
|
@ -59,7 +59,7 @@ acts similar to /dev/rtc and reacts on free-fall interrupts received
|
||||||
from the device. It supports blocking operations, poll/select and
|
from the device. It supports blocking operations, poll/select and
|
||||||
fasync operation modes. You must read 1 bytes from the device. The
|
fasync operation modes. You must read 1 bytes from the device. The
|
||||||
result is number of free-fall interrupts since the last successful
|
result is number of free-fall interrupts since the last successful
|
||||||
read (or 255 if number of interrupts would not fit). See the hpfall.c
|
read (or 255 if number of interrupts would not fit). See the freefall.c
|
||||||
file for an example on using the device.
|
file for an example on using the device.
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -462,9 +462,9 @@ JIT compiler
|
||||||
------------
|
------------
|
||||||
|
|
||||||
The Linux kernel has a built-in BPF JIT compiler for x86_64, SPARC, PowerPC,
|
The Linux kernel has a built-in BPF JIT compiler for x86_64, SPARC, PowerPC,
|
||||||
ARM and s390 and can be enabled through CONFIG_BPF_JIT. The JIT compiler is
|
ARM, MIPS and s390 and can be enabled through CONFIG_BPF_JIT. The JIT compiler
|
||||||
transparently invoked for each attached filter from user space or for internal
|
is transparently invoked for each attached filter from user space or for
|
||||||
kernel users if it has been previously enabled by root:
|
internal kernel users if it has been previously enabled by root:
|
||||||
|
|
||||||
echo 1 > /proc/sys/net/core/bpf_jit_enable
|
echo 1 > /proc/sys/net/core/bpf_jit_enable
|
||||||
|
|
||||||
|
|
|
@ -143,8 +143,9 @@ This will cause the core to recalculate the total load on the regulator (based
|
||||||
on all its consumers) and change operating mode (if necessary and permitted)
|
on all its consumers) and change operating mode (if necessary and permitted)
|
||||||
to best match the current operating load.
|
to best match the current operating load.
|
||||||
|
|
||||||
The load_uA value can be determined from the consumers datasheet. e.g.most
|
The load_uA value can be determined from the consumer's datasheet. e.g. most
|
||||||
datasheets have tables showing the max current consumed in certain situations.
|
datasheets have tables showing the maximum current consumed in certain
|
||||||
|
situations.
|
||||||
|
|
||||||
Most consumers will use indirect operating mode control since they have no
|
Most consumers will use indirect operating mode control since they have no
|
||||||
knowledge of the regulator or whether the regulator is shared with other
|
knowledge of the regulator or whether the regulator is shared with other
|
||||||
|
@ -173,7 +174,7 @@ Consumers can register interest in regulator events by calling :-
|
||||||
int regulator_register_notifier(struct regulator *regulator,
|
int regulator_register_notifier(struct regulator *regulator,
|
||||||
struct notifier_block *nb);
|
struct notifier_block *nb);
|
||||||
|
|
||||||
Consumers can uregister interest by calling :-
|
Consumers can unregister interest by calling :-
|
||||||
|
|
||||||
int regulator_unregister_notifier(struct regulator *regulator,
|
int regulator_unregister_notifier(struct regulator *regulator,
|
||||||
struct notifier_block *nb);
|
struct notifier_block *nb);
|
||||||
|
|
|
@ -9,14 +9,14 @@ Safety
|
||||||
|
|
||||||
- Errors in regulator configuration can have very serious consequences
|
- Errors in regulator configuration can have very serious consequences
|
||||||
for the system, potentially including lasting hardware damage.
|
for the system, potentially including lasting hardware damage.
|
||||||
- It is not possible to automatically determine the power confugration
|
- It is not possible to automatically determine the power configuration
|
||||||
of the system - software-equivalent variants of the same chip may
|
of the system - software-equivalent variants of the same chip may
|
||||||
have different power requirments, and not all components with power
|
have different power requirements, and not all components with power
|
||||||
requirements are visible to software.
|
requirements are visible to software.
|
||||||
|
|
||||||
=> The API should make no changes to the hardware state unless it has
|
=> The API should make no changes to the hardware state unless it has
|
||||||
specific knowledge that these changes are safe to do perform on
|
specific knowledge that these changes are safe to perform on this
|
||||||
this particular system.
|
particular system.
|
||||||
|
|
||||||
Consumer use cases
|
Consumer use cases
|
||||||
------------------
|
------------------
|
||||||
|
|
|
@ -11,7 +11,7 @@ Consider the following machine :-
|
||||||
+-> [Consumer B @ 3.3V]
|
+-> [Consumer B @ 3.3V]
|
||||||
|
|
||||||
The drivers for consumers A & B must be mapped to the correct regulator in
|
The drivers for consumers A & B must be mapped to the correct regulator in
|
||||||
order to control their power supply. This mapping can be achieved in machine
|
order to control their power supplies. This mapping can be achieved in machine
|
||||||
initialisation code by creating a struct regulator_consumer_supply for
|
initialisation code by creating a struct regulator_consumer_supply for
|
||||||
each regulator.
|
each regulator.
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ to the 'Vcc' supply for Consumer A.
|
||||||
|
|
||||||
Constraints can now be registered by defining a struct regulator_init_data
|
Constraints can now be registered by defining a struct regulator_init_data
|
||||||
for each regulator power domain. This structure also maps the consumers
|
for each regulator power domain. This structure also maps the consumers
|
||||||
to their supply regulator :-
|
to their supply regulators :-
|
||||||
|
|
||||||
static struct regulator_init_data regulator1_data = {
|
static struct regulator_init_data regulator1_data = {
|
||||||
.constraints = {
|
.constraints = {
|
||||||
|
|
|
@ -36,11 +36,11 @@ Some terms used in this document:-
|
||||||
Consumers can be classified into two types:-
|
Consumers can be classified into two types:-
|
||||||
|
|
||||||
Static: consumer does not change its supply voltage or
|
Static: consumer does not change its supply voltage or
|
||||||
current limit. It only needs to enable or disable it's
|
current limit. It only needs to enable or disable its
|
||||||
power supply. Its supply voltage is set by the hardware,
|
power supply. Its supply voltage is set by the hardware,
|
||||||
bootloader, firmware or kernel board initialisation code.
|
bootloader, firmware or kernel board initialisation code.
|
||||||
|
|
||||||
Dynamic: consumer needs to change it's supply voltage or
|
Dynamic: consumer needs to change its supply voltage or
|
||||||
current limit to meet operation demands.
|
current limit to meet operation demands.
|
||||||
|
|
||||||
|
|
||||||
|
@ -156,7 +156,7 @@ relevant to non SoC devices and is split into the following four interfaces:-
|
||||||
This interface is for machine specific code and allows the creation of
|
This interface is for machine specific code and allows the creation of
|
||||||
voltage/current domains (with constraints) for each regulator. It can
|
voltage/current domains (with constraints) for each regulator. It can
|
||||||
provide regulator constraints that will prevent device damage through
|
provide regulator constraints that will prevent device damage through
|
||||||
overvoltage or over current caused by buggy client drivers. It also
|
overvoltage or overcurrent caused by buggy client drivers. It also
|
||||||
allows the creation of a regulator tree whereby some regulators are
|
allows the creation of a regulator tree whereby some regulators are
|
||||||
supplied by others (similar to a clock tree).
|
supplied by others (similar to a clock tree).
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@ Drivers can register a regulator by calling :-
|
||||||
struct regulator_dev *regulator_register(struct regulator_desc *regulator_desc,
|
struct regulator_dev *regulator_register(struct regulator_desc *regulator_desc,
|
||||||
const struct regulator_config *config);
|
const struct regulator_config *config);
|
||||||
|
|
||||||
This will register the regulators capabilities and operations to the regulator
|
This will register the regulator's capabilities and operations to the regulator
|
||||||
core.
|
core.
|
||||||
|
|
||||||
Regulators can be unregistered by calling :-
|
Regulators can be unregistered by calling :-
|
||||||
|
@ -23,8 +23,8 @@ void regulator_unregister(struct regulator_dev *rdev);
|
||||||
|
|
||||||
Regulator Events
|
Regulator Events
|
||||||
================
|
================
|
||||||
Regulators can send events (e.g. over temp, under voltage, etc) to consumer
|
Regulators can send events (e.g. overtemperature, undervoltage, etc) to
|
||||||
drivers by calling :-
|
consumer drivers by calling :-
|
||||||
|
|
||||||
int regulator_notifier_call_chain(struct regulator_dev *rdev,
|
int regulator_notifier_call_chain(struct regulator_dev *rdev,
|
||||||
unsigned long event, void *data);
|
unsigned long event, void *data);
|
||||||
|
|
41
MAINTAINERS
41
MAINTAINERS
|
@ -1665,6 +1665,12 @@ M: Nicolas Ferre <nicolas.ferre@atmel.com>
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/tty/serial/atmel_serial.c
|
F: drivers/tty/serial/atmel_serial.c
|
||||||
|
|
||||||
|
ATMEL Audio ALSA driver
|
||||||
|
M: Bo Shen <voice.shen@atmel.com>
|
||||||
|
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||||
|
S: Supported
|
||||||
|
F: sound/soc/atmel
|
||||||
|
|
||||||
ATMEL DMA DRIVER
|
ATMEL DMA DRIVER
|
||||||
M: Nicolas Ferre <nicolas.ferre@atmel.com>
|
M: Nicolas Ferre <nicolas.ferre@atmel.com>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
|
@ -2098,7 +2104,7 @@ S: Supported
|
||||||
F: drivers/scsi/bfa/
|
F: drivers/scsi/bfa/
|
||||||
|
|
||||||
BROCADE BNA 10 GIGABIT ETHERNET DRIVER
|
BROCADE BNA 10 GIGABIT ETHERNET DRIVER
|
||||||
M: Rasesh Mody <rmody@brocade.com>
|
M: Rasesh Mody <rasesh.mody@qlogic.com>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/net/ethernet/brocade/bna/
|
F: drivers/net/ethernet/brocade/bna/
|
||||||
|
@ -3012,9 +3018,8 @@ S: Supported
|
||||||
F: drivers/acpi/dock.c
|
F: drivers/acpi/dock.c
|
||||||
|
|
||||||
DOCUMENTATION
|
DOCUMENTATION
|
||||||
M: Randy Dunlap <rdunlap@infradead.org>
|
M: Jiri Kosina <jkosina@suse.cz>
|
||||||
L: linux-doc@vger.kernel.org
|
L: linux-doc@vger.kernel.org
|
||||||
T: quilt http://www.infradead.org/~rdunlap/Doc/patches/
|
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: Documentation/
|
F: Documentation/
|
||||||
X: Documentation/ABI/
|
X: Documentation/ABI/
|
||||||
|
@ -4477,7 +4482,6 @@ M: Mika Westerberg <mika.westerberg@linux.intel.com>
|
||||||
L: linux-i2c@vger.kernel.org
|
L: linux-i2c@vger.kernel.org
|
||||||
L: linux-acpi@vger.kernel.org
|
L: linux-acpi@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/i2c/i2c-acpi.c
|
|
||||||
|
|
||||||
I2C-TAOS-EVM DRIVER
|
I2C-TAOS-EVM DRIVER
|
||||||
M: Jean Delvare <jdelvare@suse.de>
|
M: Jean Delvare <jdelvare@suse.de>
|
||||||
|
@ -5480,7 +5484,7 @@ F: drivers/macintosh/
|
||||||
LINUX FOR POWERPC EMBEDDED MPC5XXX
|
LINUX FOR POWERPC EMBEDDED MPC5XXX
|
||||||
M: Anatolij Gustschin <agust@denx.de>
|
M: Anatolij Gustschin <agust@denx.de>
|
||||||
L: linuxppc-dev@lists.ozlabs.org
|
L: linuxppc-dev@lists.ozlabs.org
|
||||||
T: git git://git.denx.de/linux-2.6-agust.git
|
T: git git://git.denx.de/linux-denx-agust.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/powerpc/platforms/512x/
|
F: arch/powerpc/platforms/512x/
|
||||||
F: arch/powerpc/platforms/52xx/
|
F: arch/powerpc/platforms/52xx/
|
||||||
|
@ -6424,7 +6428,8 @@ F: Documentation/scsi/NinjaSCSI.txt
|
||||||
F: drivers/scsi/nsp32*
|
F: drivers/scsi/nsp32*
|
||||||
|
|
||||||
NTB DRIVER
|
NTB DRIVER
|
||||||
M: Jon Mason <jon.mason@intel.com>
|
M: Jon Mason <jdmason@kudzu.us>
|
||||||
|
M: Dave Jiang <dave.jiang@intel.com>
|
||||||
S: Supported
|
S: Supported
|
||||||
W: https://github.com/jonmason/ntb/wiki
|
W: https://github.com/jonmason/ntb/wiki
|
||||||
T: git git://github.com/jonmason/ntb.git
|
T: git git://github.com/jonmason/ntb.git
|
||||||
|
@ -6875,7 +6880,7 @@ F: arch/x86/kernel/quirks.c
|
||||||
|
|
||||||
PCI DRIVER FOR IMX6
|
PCI DRIVER FOR IMX6
|
||||||
M: Richard Zhu <r65037@freescale.com>
|
M: Richard Zhu <r65037@freescale.com>
|
||||||
M: Shawn Guo <shawn.guo@freescale.com>
|
M: Lucas Stach <l.stach@pengutronix.de>
|
||||||
L: linux-pci@vger.kernel.org
|
L: linux-pci@vger.kernel.org
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
@ -7053,7 +7058,7 @@ S: Maintained
|
||||||
F: drivers/pinctrl/sh-pfc/
|
F: drivers/pinctrl/sh-pfc/
|
||||||
|
|
||||||
PIN CONTROLLER - SAMSUNG
|
PIN CONTROLLER - SAMSUNG
|
||||||
M: Tomasz Figa <t.figa@samsung.com>
|
M: Tomasz Figa <tomasz.figa@gmail.com>
|
||||||
M: Thomas Abraham <thomas.abraham@linaro.org>
|
M: Thomas Abraham <thomas.abraham@linaro.org>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers)
|
L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers)
|
||||||
|
@ -7899,7 +7904,8 @@ S: Supported
|
||||||
F: drivers/media/i2c/s5k5baf.c
|
F: drivers/media/i2c/s5k5baf.c
|
||||||
|
|
||||||
SAMSUNG SOC CLOCK DRIVERS
|
SAMSUNG SOC CLOCK DRIVERS
|
||||||
M: Tomasz Figa <t.figa@samsung.com>
|
M: Sylwester Nawrocki <s.nawrocki@samsung.com>
|
||||||
|
M: Tomasz Figa <tomasz.figa@gmail.com>
|
||||||
S: Supported
|
S: Supported
|
||||||
L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers)
|
L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers)
|
||||||
F: drivers/clk/samsung/
|
F: drivers/clk/samsung/
|
||||||
|
@ -7912,6 +7918,19 @@ S: Supported
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
F: drivers/net/ethernet/samsung/sxgbe/
|
F: drivers/net/ethernet/samsung/sxgbe/
|
||||||
|
|
||||||
|
SAMSUNG USB2 PHY DRIVER
|
||||||
|
M: Kamil Debski <k.debski@samsung.com>
|
||||||
|
L: linux-kernel@vger.kernel.org
|
||||||
|
S: Supported
|
||||||
|
F: Documentation/devicetree/bindings/phy/samsung-phy.txt
|
||||||
|
F: Documentation/phy/samsung-usb2.txt
|
||||||
|
F: drivers/phy/phy-exynos4210-usb2.c
|
||||||
|
F: drivers/phy/phy-exynos4x12-usb2.c
|
||||||
|
F: drivers/phy/phy-exynos5250-usb2.c
|
||||||
|
F: drivers/phy/phy-s5pv210-usb2.c
|
||||||
|
F: drivers/phy/phy-samsung-usb2.c
|
||||||
|
F: drivers/phy/phy-samsung-usb2.h
|
||||||
|
|
||||||
SERIAL DRIVERS
|
SERIAL DRIVERS
|
||||||
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
L: linux-serial@vger.kernel.org
|
L: linux-serial@vger.kernel.org
|
||||||
|
@ -10070,9 +10089,9 @@ F: Documentation/x86/
|
||||||
F: arch/x86/
|
F: arch/x86/
|
||||||
|
|
||||||
X86 PLATFORM DRIVERS
|
X86 PLATFORM DRIVERS
|
||||||
M: Matthew Garrett <matthew.garrett@nebula.com>
|
M: Darren Hart <dvhart@infradead.org>
|
||||||
L: platform-driver-x86@vger.kernel.org
|
L: platform-driver-x86@vger.kernel.org
|
||||||
T: git git://cavan.codon.org.uk/platform-drivers-x86.git
|
T: git git://git.infradead.org/users/dvhart/linux-platform-drivers-x86.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/platform/x86/
|
F: drivers/platform/x86/
|
||||||
|
|
||||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
||||||
VERSION = 3
|
VERSION = 3
|
||||||
PATCHLEVEL = 17
|
PATCHLEVEL = 17
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION = -rc3
|
EXTRAVERSION =
|
||||||
NAME = Shuffling Zombie Juror
|
NAME = Shuffling Zombie Juror
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
|
|
@ -427,7 +427,7 @@ struct ic_inv_args {
|
||||||
|
|
||||||
static void __ic_line_inv_vaddr_helper(void *info)
|
static void __ic_line_inv_vaddr_helper(void *info)
|
||||||
{
|
{
|
||||||
struct ic_inv *ic_inv_args = (struct ic_inv_args *) info;
|
struct ic_inv_args *ic_inv = info;
|
||||||
|
|
||||||
__ic_line_inv_vaddr_local(ic_inv->paddr, ic_inv->vaddr, ic_inv->sz);
|
__ic_line_inv_vaddr_local(ic_inv->paddr, ic_inv->vaddr, ic_inv->sz);
|
||||||
}
|
}
|
||||||
|
|
|
@ -804,7 +804,7 @@
|
||||||
|
|
||||||
usb1: usb@48390000 {
|
usb1: usb@48390000 {
|
||||||
compatible = "synopsys,dwc3";
|
compatible = "synopsys,dwc3";
|
||||||
reg = <0x48390000 0x17000>;
|
reg = <0x48390000 0x10000>;
|
||||||
interrupts = <GIC_SPI 168 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 168 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
phys = <&usb2_phy1>;
|
phys = <&usb2_phy1>;
|
||||||
phy-names = "usb2-phy";
|
phy-names = "usb2-phy";
|
||||||
|
@ -826,7 +826,7 @@
|
||||||
|
|
||||||
usb2: usb@483d0000 {
|
usb2: usb@483d0000 {
|
||||||
compatible = "synopsys,dwc3";
|
compatible = "synopsys,dwc3";
|
||||||
reg = <0x483d0000 0x17000>;
|
reg = <0x483d0000 0x10000>;
|
||||||
interrupts = <GIC_SPI 174 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 174 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
phys = <&usb2_phy2>;
|
phys = <&usb2_phy2>;
|
||||||
phy-names = "usb2-phy";
|
phy-names = "usb2-phy";
|
||||||
|
|
|
@ -260,7 +260,7 @@
|
||||||
status = "okay";
|
status = "okay";
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&i2c0_pins>;
|
pinctrl-0 = <&i2c0_pins>;
|
||||||
clock-frequency = <400000>;
|
clock-frequency = <100000>;
|
||||||
|
|
||||||
tps65218: tps65218@24 {
|
tps65218: tps65218@24 {
|
||||||
reg = <0x24>;
|
reg = <0x24>;
|
||||||
|
@ -424,7 +424,7 @@
|
||||||
ranges = <0 0 0 0x01000000>; /* minimum GPMC partition = 16MB */
|
ranges = <0 0 0 0x01000000>; /* minimum GPMC partition = 16MB */
|
||||||
nand@0,0 {
|
nand@0,0 {
|
||||||
reg = <0 0 4>; /* device IO registers */
|
reg = <0 0 4>; /* device IO registers */
|
||||||
ti,nand-ecc-opt = "bch8";
|
ti,nand-ecc-opt = "bch16";
|
||||||
ti,elm-id = <&elm>;
|
ti,elm-id = <&elm>;
|
||||||
nand-bus-width = <8>;
|
nand-bus-width = <8>;
|
||||||
gpmc,device-width = <1>;
|
gpmc,device-width = <1>;
|
||||||
|
@ -443,8 +443,6 @@
|
||||||
gpmc,rd-cycle-ns = <40>;
|
gpmc,rd-cycle-ns = <40>;
|
||||||
gpmc,wr-cycle-ns = <40>;
|
gpmc,wr-cycle-ns = <40>;
|
||||||
gpmc,wait-pin = <0>;
|
gpmc,wait-pin = <0>;
|
||||||
gpmc,wait-on-read;
|
|
||||||
gpmc,wait-on-write;
|
|
||||||
gpmc,bus-turnaround-ns = <0>;
|
gpmc,bus-turnaround-ns = <0>;
|
||||||
gpmc,cycle2cycle-delay-ns = <0>;
|
gpmc,cycle2cycle-delay-ns = <0>;
|
||||||
gpmc,clk-activation-ns = <0>;
|
gpmc,clk-activation-ns = <0>;
|
||||||
|
|
|
@ -435,13 +435,13 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
&gpmc {
|
&gpmc {
|
||||||
status = "okay";
|
status = "okay"; /* Disable QSPI when enabling GPMC (NAND) */
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&nand_flash_x8>;
|
pinctrl-0 = <&nand_flash_x8>;
|
||||||
ranges = <0 0 0x08000000 0x10000000>; /* CS0: NAND */
|
ranges = <0 0 0x08000000 0x10000000>; /* CS0: NAND */
|
||||||
nand@0,0 {
|
nand@0,0 {
|
||||||
reg = <0 0 0>; /* CS0, offset 0 */
|
reg = <0 0 0>; /* CS0, offset 0 */
|
||||||
ti,nand-ecc-opt = "bch8";
|
ti,nand-ecc-opt = "bch16";
|
||||||
ti,elm-id = <&elm>;
|
ti,elm-id = <&elm>;
|
||||||
nand-bus-width = <8>;
|
nand-bus-width = <8>;
|
||||||
gpmc,device-width = <1>;
|
gpmc,device-width = <1>;
|
||||||
|
@ -459,8 +459,7 @@
|
||||||
gpmc,access-ns = <30>; /* tCEA + 4*/
|
gpmc,access-ns = <30>; /* tCEA + 4*/
|
||||||
gpmc,rd-cycle-ns = <40>;
|
gpmc,rd-cycle-ns = <40>;
|
||||||
gpmc,wr-cycle-ns = <40>;
|
gpmc,wr-cycle-ns = <40>;
|
||||||
gpmc,wait-on-read = "true";
|
gpmc,wait-pin = <0>;
|
||||||
gpmc,wait-on-write = "true";
|
|
||||||
gpmc,bus-turnaround-ns = <0>;
|
gpmc,bus-turnaround-ns = <0>;
|
||||||
gpmc,cycle2cycle-delay-ns = <0>;
|
gpmc,cycle2cycle-delay-ns = <0>;
|
||||||
gpmc,clk-activation-ns = <0>;
|
gpmc,clk-activation-ns = <0>;
|
||||||
|
@ -557,7 +556,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
&qspi {
|
&qspi {
|
||||||
status = "okay";
|
status = "disabled"; /* Disable GPMC (NAND) when enabling QSPI */
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&qspi1_default>;
|
pinctrl-0 = <&qspi1_default>;
|
||||||
|
|
||||||
|
|
|
@ -149,7 +149,7 @@
|
||||||
usb: usbck {
|
usb: usbck {
|
||||||
compatible = "atmel,at91rm9200-clk-usb";
|
compatible = "atmel,at91rm9200-clk-usb";
|
||||||
#clock-cells = <0>;
|
#clock-cells = <0>;
|
||||||
atmel,clk-divisors = <1 2>;
|
atmel,clk-divisors = <1 2 0 0>;
|
||||||
clocks = <&pllb>;
|
clocks = <&pllb>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -40,6 +40,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
pllb: pllbck {
|
pllb: pllbck {
|
||||||
|
compatible = "atmel,at91sam9g20-clk-pllb";
|
||||||
atmel,clk-input-range = <2000000 32000000>;
|
atmel,clk-input-range = <2000000 32000000>;
|
||||||
atmel,pll-clk-output-ranges = <30000000 100000000 0 0>;
|
atmel,pll-clk-output-ranges = <30000000 100000000 0 0>;
|
||||||
};
|
};
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
/dts-v1/;
|
/dts-v1/;
|
||||||
|
|
||||||
#include "dra74x.dtsi"
|
#include "dra74x.dtsi"
|
||||||
|
#include <dt-bindings/gpio/gpio.h>
|
||||||
|
|
||||||
/ {
|
/ {
|
||||||
model = "TI DRA742";
|
model = "TI DRA742";
|
||||||
|
@ -24,9 +25,29 @@
|
||||||
regulator-min-microvolt = <3300000>;
|
regulator-min-microvolt = <3300000>;
|
||||||
regulator-max-microvolt = <3300000>;
|
regulator-max-microvolt = <3300000>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
vtt_fixed: fixedregulator-vtt {
|
||||||
|
compatible = "regulator-fixed";
|
||||||
|
regulator-name = "vtt_fixed";
|
||||||
|
regulator-min-microvolt = <1350000>;
|
||||||
|
regulator-max-microvolt = <1350000>;
|
||||||
|
regulator-always-on;
|
||||||
|
regulator-boot-on;
|
||||||
|
enable-active-high;
|
||||||
|
gpio = <&gpio7 11 GPIO_ACTIVE_HIGH>;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
&dra7_pmx_core {
|
&dra7_pmx_core {
|
||||||
|
pinctrl-names = "default";
|
||||||
|
pinctrl-0 = <&vtt_pin>;
|
||||||
|
|
||||||
|
vtt_pin: pinmux_vtt_pin {
|
||||||
|
pinctrl-single,pins = <
|
||||||
|
0x3b4 (PIN_OUTPUT | MUX_MODE14) /* spi1_cs1.gpio7_11 */
|
||||||
|
>;
|
||||||
|
};
|
||||||
|
|
||||||
i2c1_pins: pinmux_i2c1_pins {
|
i2c1_pins: pinmux_i2c1_pins {
|
||||||
pinctrl-single,pins = <
|
pinctrl-single,pins = <
|
||||||
0x400 (PIN_INPUT | MUX_MODE0) /* i2c1_sda */
|
0x400 (PIN_INPUT | MUX_MODE0) /* i2c1_sda */
|
||||||
|
@ -43,20 +64,19 @@
|
||||||
|
|
||||||
i2c3_pins: pinmux_i2c3_pins {
|
i2c3_pins: pinmux_i2c3_pins {
|
||||||
pinctrl-single,pins = <
|
pinctrl-single,pins = <
|
||||||
0x410 (PIN_INPUT | MUX_MODE0) /* i2c3_sda */
|
0x288 (PIN_INPUT | MUX_MODE9) /* gpio6_14.i2c3_sda */
|
||||||
0x414 (PIN_INPUT | MUX_MODE0) /* i2c3_scl */
|
0x28c (PIN_INPUT | MUX_MODE9) /* gpio6_15.i2c3_scl */
|
||||||
>;
|
>;
|
||||||
};
|
};
|
||||||
|
|
||||||
mcspi1_pins: pinmux_mcspi1_pins {
|
mcspi1_pins: pinmux_mcspi1_pins {
|
||||||
pinctrl-single,pins = <
|
pinctrl-single,pins = <
|
||||||
0x3a4 (PIN_INPUT | MUX_MODE0) /* spi2_clk */
|
0x3a4 (PIN_INPUT | MUX_MODE0) /* spi1_sclk */
|
||||||
0x3a8 (PIN_INPUT | MUX_MODE0) /* spi2_d1 */
|
0x3a8 (PIN_INPUT | MUX_MODE0) /* spi1_d1 */
|
||||||
0x3ac (PIN_INPUT | MUX_MODE0) /* spi2_d0 */
|
0x3ac (PIN_INPUT | MUX_MODE0) /* spi1_d0 */
|
||||||
0x3b0 (PIN_INPUT_SLEW | MUX_MODE0) /* spi2_cs0 */
|
0x3b0 (PIN_INPUT_SLEW | MUX_MODE0) /* spi1_cs0 */
|
||||||
0x3b4 (PIN_INPUT_SLEW | MUX_MODE0) /* spi2_cs1 */
|
0x3b8 (PIN_INPUT_SLEW | MUX_MODE6) /* spi1_cs2.hdmi1_hpd */
|
||||||
0x3b8 (PIN_INPUT_SLEW | MUX_MODE6) /* spi2_cs2 */
|
0x3bc (PIN_INPUT_SLEW | MUX_MODE6) /* spi1_cs3.hdmi1_cec */
|
||||||
0x3bc (PIN_INPUT_SLEW | MUX_MODE6) /* spi2_cs3 */
|
|
||||||
>;
|
>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -284,7 +304,7 @@
|
||||||
status = "okay";
|
status = "okay";
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&i2c3_pins>;
|
pinctrl-0 = <&i2c3_pins>;
|
||||||
clock-frequency = <3400000>;
|
clock-frequency = <400000>;
|
||||||
};
|
};
|
||||||
|
|
||||||
&mcspi1 {
|
&mcspi1 {
|
||||||
|
@ -427,22 +447,19 @@
|
||||||
gpmc,device-width = <2>;
|
gpmc,device-width = <2>;
|
||||||
gpmc,sync-clk-ps = <0>;
|
gpmc,sync-clk-ps = <0>;
|
||||||
gpmc,cs-on-ns = <0>;
|
gpmc,cs-on-ns = <0>;
|
||||||
gpmc,cs-rd-off-ns = <40>;
|
gpmc,cs-rd-off-ns = <80>;
|
||||||
gpmc,cs-wr-off-ns = <40>;
|
gpmc,cs-wr-off-ns = <80>;
|
||||||
gpmc,adv-on-ns = <0>;
|
gpmc,adv-on-ns = <0>;
|
||||||
gpmc,adv-rd-off-ns = <30>;
|
gpmc,adv-rd-off-ns = <60>;
|
||||||
gpmc,adv-wr-off-ns = <30>;
|
gpmc,adv-wr-off-ns = <60>;
|
||||||
gpmc,we-on-ns = <5>;
|
gpmc,we-on-ns = <10>;
|
||||||
gpmc,we-off-ns = <25>;
|
gpmc,we-off-ns = <50>;
|
||||||
gpmc,oe-on-ns = <2>;
|
gpmc,oe-on-ns = <4>;
|
||||||
gpmc,oe-off-ns = <20>;
|
gpmc,oe-off-ns = <40>;
|
||||||
gpmc,access-ns = <20>;
|
gpmc,access-ns = <40>;
|
||||||
gpmc,wr-access-ns = <40>;
|
gpmc,wr-access-ns = <80>;
|
||||||
gpmc,rd-cycle-ns = <40>;
|
gpmc,rd-cycle-ns = <80>;
|
||||||
gpmc,wr-cycle-ns = <40>;
|
gpmc,wr-cycle-ns = <80>;
|
||||||
gpmc,wait-pin = <0>;
|
|
||||||
gpmc,wait-on-read;
|
|
||||||
gpmc,wait-on-write;
|
|
||||||
gpmc,bus-turnaround-ns = <0>;
|
gpmc,bus-turnaround-ns = <0>;
|
||||||
gpmc,cycle2cycle-delay-ns = <0>;
|
gpmc,cycle2cycle-delay-ns = <0>;
|
||||||
gpmc,clk-activation-ns = <0>;
|
gpmc,clk-activation-ns = <0>;
|
||||||
|
@ -483,7 +500,7 @@
|
||||||
reg = <0x001c0000 0x00020000>;
|
reg = <0x001c0000 0x00020000>;
|
||||||
};
|
};
|
||||||
partition@7 {
|
partition@7 {
|
||||||
label = "NAND.u-boot-env";
|
label = "NAND.u-boot-env.backup1";
|
||||||
reg = <0x001e0000 0x00020000>;
|
reg = <0x001e0000 0x00020000>;
|
||||||
};
|
};
|
||||||
partition@8 {
|
partition@8 {
|
||||||
|
@ -504,3 +521,8 @@
|
||||||
&usb2_phy2 {
|
&usb2_phy2 {
|
||||||
phy-supply = <&ldousb_reg>;
|
phy-supply = <&ldousb_reg>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
&gpio7 {
|
||||||
|
ti,no-reset-on-init;
|
||||||
|
ti,no-idle-on-init;
|
||||||
|
};
|
||||||
|
|
|
@ -423,10 +423,14 @@
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
|
||||||
lvds-channel@0 {
|
lvds-channel@0 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
reg = <0>;
|
reg = <0>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
|
||||||
port {
|
port@0 {
|
||||||
|
reg = <0>;
|
||||||
|
|
||||||
lvds0_in: endpoint {
|
lvds0_in: endpoint {
|
||||||
remote-endpoint = <&ipu_di0_lvds0>;
|
remote-endpoint = <&ipu_di0_lvds0>;
|
||||||
};
|
};
|
||||||
|
@ -434,10 +438,14 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
lvds-channel@1 {
|
lvds-channel@1 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
reg = <1>;
|
reg = <1>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
|
||||||
port {
|
port@1 {
|
||||||
|
reg = <1>;
|
||||||
|
|
||||||
lvds1_in: endpoint {
|
lvds1_in: endpoint {
|
||||||
remote-endpoint = <&ipu_di1_lvds1>;
|
remote-endpoint = <&ipu_di1_lvds1>;
|
||||||
};
|
};
|
||||||
|
|
|
@ -40,7 +40,7 @@ clocks {
|
||||||
#clock-cells = <0>;
|
#clock-cells = <0>;
|
||||||
compatible = "ti,keystone,psc-clock";
|
compatible = "ti,keystone,psc-clock";
|
||||||
clocks = <&chipclk16>;
|
clocks = <&chipclk16>;
|
||||||
clock-output-names = "usb";
|
clock-output-names = "usb1";
|
||||||
reg = <0x02350004 0xb00>, <0x02350000 0x400>;
|
reg = <0x02350004 0xb00>, <0x02350000 0x400>;
|
||||||
reg-names = "control", "domain";
|
reg-names = "control", "domain";
|
||||||
domain-id = <0>;
|
domain-id = <0>;
|
||||||
|
@ -60,8 +60,8 @@ clocks {
|
||||||
#clock-cells = <0>;
|
#clock-cells = <0>;
|
||||||
compatible = "ti,keystone,psc-clock";
|
compatible = "ti,keystone,psc-clock";
|
||||||
clocks = <&chipclk12>;
|
clocks = <&chipclk12>;
|
||||||
clock-output-names = "pcie";
|
clock-output-names = "pcie1";
|
||||||
reg = <0x0235006c 0xb00>, <0x02350000 0x400>;
|
reg = <0x0235006c 0xb00>, <0x02350048 0x400>;
|
||||||
reg-names = "control", "domain";
|
reg-names = "control", "domain";
|
||||||
domain-id = <18>;
|
domain-id = <18>;
|
||||||
};
|
};
|
||||||
|
|
|
@ -93,7 +93,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
tv: connector {
|
tv: connector {
|
||||||
compatible = "composite-connector";
|
compatible = "composite-video-connector";
|
||||||
label = "tv";
|
label = "tv";
|
||||||
|
|
||||||
port {
|
port {
|
||||||
|
|
|
@ -467,6 +467,7 @@
|
||||||
ti,bit-shift = <0x1e>;
|
ti,bit-shift = <0x1e>;
|
||||||
reg = <0x0d00>;
|
reg = <0x0d00>;
|
||||||
ti,set-bit-to-disable;
|
ti,set-bit-to-disable;
|
||||||
|
ti,set-rate-parent;
|
||||||
};
|
};
|
||||||
|
|
||||||
dpll4_m6_ck: dpll4_m6_ck {
|
dpll4_m6_ck: dpll4_m6_ck {
|
||||||
|
|
|
@ -353,13 +353,12 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
ldo8_reg: ldo8 {
|
ldo8_reg: ldo8 {
|
||||||
/* VDD_3v0: Does not go anywhere */
|
/* VDD_3V_GP: act led/serial console */
|
||||||
regulator-name = "ldo8";
|
regulator-name = "ldo8";
|
||||||
regulator-min-microvolt = <3000000>;
|
regulator-min-microvolt = <3000000>;
|
||||||
regulator-max-microvolt = <3000000>;
|
regulator-max-microvolt = <3000000>;
|
||||||
|
regulator-always-on;
|
||||||
regulator-boot-on;
|
regulator-boot-on;
|
||||||
/* Unused */
|
|
||||||
status = "disabled";
|
|
||||||
};
|
};
|
||||||
|
|
||||||
ldo9_reg: ldo9 {
|
ldo9_reg: ldo9 {
|
||||||
|
|
|
@ -116,7 +116,6 @@
|
||||||
msp2: msp@80117000 {
|
msp2: msp@80117000 {
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&msp2_default_mode>;
|
pinctrl-0 = <&msp2_default_mode>;
|
||||||
status = "okay";
|
|
||||||
};
|
};
|
||||||
|
|
||||||
msp3: msp@80125000 {
|
msp3: msp@80125000 {
|
||||||
|
|
|
@ -1443,14 +1443,14 @@ void edma_assign_channel_eventq(unsigned channel, enum dma_event_q eventq_no)
|
||||||
EXPORT_SYMBOL(edma_assign_channel_eventq);
|
EXPORT_SYMBOL(edma_assign_channel_eventq);
|
||||||
|
|
||||||
static int edma_setup_from_hw(struct device *dev, struct edma_soc_info *pdata,
|
static int edma_setup_from_hw(struct device *dev, struct edma_soc_info *pdata,
|
||||||
struct edma *edma_cc)
|
struct edma *edma_cc, int cc_id)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
u32 value, cccfg;
|
u32 value, cccfg;
|
||||||
s8 (*queue_priority_map)[2];
|
s8 (*queue_priority_map)[2];
|
||||||
|
|
||||||
/* Decode the eDMA3 configuration from CCCFG register */
|
/* Decode the eDMA3 configuration from CCCFG register */
|
||||||
cccfg = edma_read(0, EDMA_CCCFG);
|
cccfg = edma_read(cc_id, EDMA_CCCFG);
|
||||||
|
|
||||||
value = GET_NUM_REGN(cccfg);
|
value = GET_NUM_REGN(cccfg);
|
||||||
edma_cc->num_region = BIT(value);
|
edma_cc->num_region = BIT(value);
|
||||||
|
@ -1464,7 +1464,8 @@ static int edma_setup_from_hw(struct device *dev, struct edma_soc_info *pdata,
|
||||||
value = GET_NUM_EVQUE(cccfg);
|
value = GET_NUM_EVQUE(cccfg);
|
||||||
edma_cc->num_tc = value + 1;
|
edma_cc->num_tc = value + 1;
|
||||||
|
|
||||||
dev_dbg(dev, "eDMA3 HW configuration (cccfg: 0x%08x):\n", cccfg);
|
dev_dbg(dev, "eDMA3 CC%d HW configuration (cccfg: 0x%08x):\n", cc_id,
|
||||||
|
cccfg);
|
||||||
dev_dbg(dev, "num_region: %u\n", edma_cc->num_region);
|
dev_dbg(dev, "num_region: %u\n", edma_cc->num_region);
|
||||||
dev_dbg(dev, "num_channel: %u\n", edma_cc->num_channels);
|
dev_dbg(dev, "num_channel: %u\n", edma_cc->num_channels);
|
||||||
dev_dbg(dev, "num_slot: %u\n", edma_cc->num_slots);
|
dev_dbg(dev, "num_slot: %u\n", edma_cc->num_slots);
|
||||||
|
@ -1684,7 +1685,7 @@ static int edma_probe(struct platform_device *pdev)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
/* Get eDMA3 configuration from IP */
|
/* Get eDMA3 configuration from IP */
|
||||||
ret = edma_setup_from_hw(dev, info[j], edma_cc[j]);
|
ret = edma_setup_from_hw(dev, info[j], edma_cc[j], j);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
|
|
@ -466,6 +466,7 @@ static inline void __sync_cache_range_r(volatile void *p, size_t size)
|
||||||
*/
|
*/
|
||||||
#define v7_exit_coherency_flush(level) \
|
#define v7_exit_coherency_flush(level) \
|
||||||
asm volatile( \
|
asm volatile( \
|
||||||
|
".arch armv7-a \n\t" \
|
||||||
"stmfd sp!, {fp, ip} \n\t" \
|
"stmfd sp!, {fp, ip} \n\t" \
|
||||||
"mrc p15, 0, r0, c1, c0, 0 @ get SCTLR \n\t" \
|
"mrc p15, 0, r0, c1, c0, 0 @ get SCTLR \n\t" \
|
||||||
"bic r0, r0, #"__stringify(CR_C)" \n\t" \
|
"bic r0, r0, #"__stringify(CR_C)" \n\t" \
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
#ifndef __ASMARM_TLS_H
|
#ifndef __ASMARM_TLS_H
|
||||||
#define __ASMARM_TLS_H
|
#define __ASMARM_TLS_H
|
||||||
|
|
||||||
|
#include <linux/compiler.h>
|
||||||
|
#include <asm/thread_info.h>
|
||||||
|
|
||||||
#ifdef __ASSEMBLY__
|
#ifdef __ASSEMBLY__
|
||||||
#include <asm/asm-offsets.h>
|
#include <asm/asm-offsets.h>
|
||||||
.macro switch_tls_none, base, tp, tpuser, tmp1, tmp2
|
.macro switch_tls_none, base, tp, tpuser, tmp1, tmp2
|
||||||
|
@ -50,6 +53,49 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
|
static inline void set_tls(unsigned long val)
|
||||||
|
{
|
||||||
|
struct thread_info *thread;
|
||||||
|
|
||||||
|
thread = current_thread_info();
|
||||||
|
|
||||||
|
thread->tp_value[0] = val;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This code runs with preemption enabled and therefore must
|
||||||
|
* be reentrant with respect to switch_tls.
|
||||||
|
*
|
||||||
|
* We need to ensure ordering between the shadow state and the
|
||||||
|
* hardware state, so that we don't corrupt the hardware state
|
||||||
|
* with a stale shadow state during context switch.
|
||||||
|
*
|
||||||
|
* If we're preempted here, switch_tls will load TPIDRURO from
|
||||||
|
* thread_info upon resuming execution and the following mcr
|
||||||
|
* is merely redundant.
|
||||||
|
*/
|
||||||
|
barrier();
|
||||||
|
|
||||||
|
if (!tls_emu) {
|
||||||
|
if (has_tls_reg) {
|
||||||
|
asm("mcr p15, 0, %0, c13, c0, 3"
|
||||||
|
: : "r" (val));
|
||||||
|
} else {
|
||||||
|
#ifdef CONFIG_KUSER_HELPERS
|
||||||
|
/*
|
||||||
|
* User space must never try to access this
|
||||||
|
* directly. Expect your app to break
|
||||||
|
* eventually if you do so. The user helper
|
||||||
|
* at 0xffff0fe0 must be used instead. (see
|
||||||
|
* entry-armv.S for details)
|
||||||
|
*/
|
||||||
|
*((unsigned int *)0xffff0ff0) = val;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static inline unsigned long get_tpuser(void)
|
static inline unsigned long get_tpuser(void)
|
||||||
{
|
{
|
||||||
unsigned long reg = 0;
|
unsigned long reg = 0;
|
||||||
|
@ -59,5 +105,23 @@ static inline unsigned long get_tpuser(void)
|
||||||
|
|
||||||
return reg;
|
return reg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void set_tpuser(unsigned long val)
|
||||||
|
{
|
||||||
|
/* Since TPIDRURW is fully context-switched (unlike TPIDRURO),
|
||||||
|
* we need not update thread_info.
|
||||||
|
*/
|
||||||
|
if (has_tls_reg && !tls_emu) {
|
||||||
|
asm("mcr p15, 0, %0, c13, c0, 2"
|
||||||
|
: : "r" (val));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void flush_tls(void)
|
||||||
|
{
|
||||||
|
set_tls(0);
|
||||||
|
set_tpuser(0);
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#endif /* __ASMARM_TLS_H */
|
#endif /* __ASMARM_TLS_H */
|
||||||
|
|
|
@ -107,8 +107,11 @@ static inline void set_fs(mm_segment_t fs)
|
||||||
extern int __get_user_1(void *);
|
extern int __get_user_1(void *);
|
||||||
extern int __get_user_2(void *);
|
extern int __get_user_2(void *);
|
||||||
extern int __get_user_4(void *);
|
extern int __get_user_4(void *);
|
||||||
extern int __get_user_lo8(void *);
|
extern int __get_user_32t_8(void *);
|
||||||
extern int __get_user_8(void *);
|
extern int __get_user_8(void *);
|
||||||
|
extern int __get_user_64t_1(void *);
|
||||||
|
extern int __get_user_64t_2(void *);
|
||||||
|
extern int __get_user_64t_4(void *);
|
||||||
|
|
||||||
#define __GUP_CLOBBER_1 "lr", "cc"
|
#define __GUP_CLOBBER_1 "lr", "cc"
|
||||||
#ifdef CONFIG_CPU_USE_DOMAINS
|
#ifdef CONFIG_CPU_USE_DOMAINS
|
||||||
|
@ -117,7 +120,7 @@ extern int __get_user_8(void *);
|
||||||
#define __GUP_CLOBBER_2 "lr", "cc"
|
#define __GUP_CLOBBER_2 "lr", "cc"
|
||||||
#endif
|
#endif
|
||||||
#define __GUP_CLOBBER_4 "lr", "cc"
|
#define __GUP_CLOBBER_4 "lr", "cc"
|
||||||
#define __GUP_CLOBBER_lo8 "lr", "cc"
|
#define __GUP_CLOBBER_32t_8 "lr", "cc"
|
||||||
#define __GUP_CLOBBER_8 "lr", "cc"
|
#define __GUP_CLOBBER_8 "lr", "cc"
|
||||||
|
|
||||||
#define __get_user_x(__r2,__p,__e,__l,__s) \
|
#define __get_user_x(__r2,__p,__e,__l,__s) \
|
||||||
|
@ -131,12 +134,30 @@ extern int __get_user_8(void *);
|
||||||
|
|
||||||
/* narrowing a double-word get into a single 32bit word register: */
|
/* narrowing a double-word get into a single 32bit word register: */
|
||||||
#ifdef __ARMEB__
|
#ifdef __ARMEB__
|
||||||
#define __get_user_xb(__r2, __p, __e, __l, __s) \
|
#define __get_user_x_32t(__r2, __p, __e, __l, __s) \
|
||||||
__get_user_x(__r2, __p, __e, __l, lo8)
|
__get_user_x(__r2, __p, __e, __l, 32t_8)
|
||||||
#else
|
#else
|
||||||
#define __get_user_xb __get_user_x
|
#define __get_user_x_32t __get_user_x
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* storing result into proper least significant word of 64bit target var,
|
||||||
|
* different only for big endian case where 64 bit __r2 lsw is r3:
|
||||||
|
*/
|
||||||
|
#ifdef __ARMEB__
|
||||||
|
#define __get_user_x_64t(__r2, __p, __e, __l, __s) \
|
||||||
|
__asm__ __volatile__ ( \
|
||||||
|
__asmeq("%0", "r0") __asmeq("%1", "r2") \
|
||||||
|
__asmeq("%3", "r1") \
|
||||||
|
"bl __get_user_64t_" #__s \
|
||||||
|
: "=&r" (__e), "=r" (__r2) \
|
||||||
|
: "0" (__p), "r" (__l) \
|
||||||
|
: __GUP_CLOBBER_##__s)
|
||||||
|
#else
|
||||||
|
#define __get_user_x_64t __get_user_x
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#define __get_user_check(x,p) \
|
#define __get_user_check(x,p) \
|
||||||
({ \
|
({ \
|
||||||
unsigned long __limit = current_thread_info()->addr_limit - 1; \
|
unsigned long __limit = current_thread_info()->addr_limit - 1; \
|
||||||
|
@ -146,17 +167,26 @@ extern int __get_user_8(void *);
|
||||||
register int __e asm("r0"); \
|
register int __e asm("r0"); \
|
||||||
switch (sizeof(*(__p))) { \
|
switch (sizeof(*(__p))) { \
|
||||||
case 1: \
|
case 1: \
|
||||||
__get_user_x(__r2, __p, __e, __l, 1); \
|
if (sizeof((x)) >= 8) \
|
||||||
|
__get_user_x_64t(__r2, __p, __e, __l, 1); \
|
||||||
|
else \
|
||||||
|
__get_user_x(__r2, __p, __e, __l, 1); \
|
||||||
break; \
|
break; \
|
||||||
case 2: \
|
case 2: \
|
||||||
__get_user_x(__r2, __p, __e, __l, 2); \
|
if (sizeof((x)) >= 8) \
|
||||||
|
__get_user_x_64t(__r2, __p, __e, __l, 2); \
|
||||||
|
else \
|
||||||
|
__get_user_x(__r2, __p, __e, __l, 2); \
|
||||||
break; \
|
break; \
|
||||||
case 4: \
|
case 4: \
|
||||||
__get_user_x(__r2, __p, __e, __l, 4); \
|
if (sizeof((x)) >= 8) \
|
||||||
|
__get_user_x_64t(__r2, __p, __e, __l, 4); \
|
||||||
|
else \
|
||||||
|
__get_user_x(__r2, __p, __e, __l, 4); \
|
||||||
break; \
|
break; \
|
||||||
case 8: \
|
case 8: \
|
||||||
if (sizeof((x)) < 8) \
|
if (sizeof((x)) < 8) \
|
||||||
__get_user_xb(__r2, __p, __e, __l, 4); \
|
__get_user_x_32t(__r2, __p, __e, __l, 4); \
|
||||||
else \
|
else \
|
||||||
__get_user_x(__r2, __p, __e, __l, 8); \
|
__get_user_x(__r2, __p, __e, __l, 8); \
|
||||||
break; \
|
break; \
|
||||||
|
|
|
@ -26,25 +26,14 @@ static inline void xen_dma_map_page(struct device *hwdev, struct page *page,
|
||||||
__generic_dma_ops(hwdev)->map_page(hwdev, page, offset, size, dir, attrs);
|
__generic_dma_ops(hwdev)->map_page(hwdev, page, offset, size, dir, attrs);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void xen_dma_unmap_page(struct device *hwdev, dma_addr_t handle,
|
void xen_dma_unmap_page(struct device *hwdev, dma_addr_t handle,
|
||||||
size_t size, enum dma_data_direction dir,
|
size_t size, enum dma_data_direction dir,
|
||||||
struct dma_attrs *attrs)
|
struct dma_attrs *attrs);
|
||||||
{
|
|
||||||
if (__generic_dma_ops(hwdev)->unmap_page)
|
|
||||||
__generic_dma_ops(hwdev)->unmap_page(hwdev, handle, size, dir, attrs);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void xen_dma_sync_single_for_cpu(struct device *hwdev,
|
void xen_dma_sync_single_for_cpu(struct device *hwdev,
|
||||||
dma_addr_t handle, size_t size, enum dma_data_direction dir)
|
dma_addr_t handle, size_t size, enum dma_data_direction dir);
|
||||||
{
|
|
||||||
if (__generic_dma_ops(hwdev)->sync_single_for_cpu)
|
void xen_dma_sync_single_for_device(struct device *hwdev,
|
||||||
__generic_dma_ops(hwdev)->sync_single_for_cpu(hwdev, handle, size, dir);
|
dma_addr_t handle, size_t size, enum dma_data_direction dir);
|
||||||
}
|
|
||||||
|
|
||||||
static inline void xen_dma_sync_single_for_device(struct device *hwdev,
|
|
||||||
dma_addr_t handle, size_t size, enum dma_data_direction dir)
|
|
||||||
{
|
|
||||||
if (__generic_dma_ops(hwdev)->sync_single_for_device)
|
|
||||||
__generic_dma_ops(hwdev)->sync_single_for_device(hwdev, handle, size, dir);
|
|
||||||
}
|
|
||||||
#endif /* _ASM_ARM_XEN_PAGE_COHERENT_H */
|
#endif /* _ASM_ARM_XEN_PAGE_COHERENT_H */
|
||||||
|
|
|
@ -33,7 +33,6 @@ typedef struct xpaddr {
|
||||||
#define INVALID_P2M_ENTRY (~0UL)
|
#define INVALID_P2M_ENTRY (~0UL)
|
||||||
|
|
||||||
unsigned long __pfn_to_mfn(unsigned long pfn);
|
unsigned long __pfn_to_mfn(unsigned long pfn);
|
||||||
unsigned long __mfn_to_pfn(unsigned long mfn);
|
|
||||||
extern struct rb_root phys_to_mach;
|
extern struct rb_root phys_to_mach;
|
||||||
|
|
||||||
static inline unsigned long pfn_to_mfn(unsigned long pfn)
|
static inline unsigned long pfn_to_mfn(unsigned long pfn)
|
||||||
|
@ -51,14 +50,6 @@ static inline unsigned long pfn_to_mfn(unsigned long pfn)
|
||||||
|
|
||||||
static inline unsigned long mfn_to_pfn(unsigned long mfn)
|
static inline unsigned long mfn_to_pfn(unsigned long mfn)
|
||||||
{
|
{
|
||||||
unsigned long pfn;
|
|
||||||
|
|
||||||
if (phys_to_mach.rb_node != NULL) {
|
|
||||||
pfn = __mfn_to_pfn(mfn);
|
|
||||||
if (pfn != INVALID_P2M_ENTRY)
|
|
||||||
return pfn;
|
|
||||||
}
|
|
||||||
|
|
||||||
return mfn;
|
return mfn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -98,6 +98,14 @@ EXPORT_SYMBOL(__clear_user);
|
||||||
EXPORT_SYMBOL(__get_user_1);
|
EXPORT_SYMBOL(__get_user_1);
|
||||||
EXPORT_SYMBOL(__get_user_2);
|
EXPORT_SYMBOL(__get_user_2);
|
||||||
EXPORT_SYMBOL(__get_user_4);
|
EXPORT_SYMBOL(__get_user_4);
|
||||||
|
EXPORT_SYMBOL(__get_user_8);
|
||||||
|
|
||||||
|
#ifdef __ARMEB__
|
||||||
|
EXPORT_SYMBOL(__get_user_64t_1);
|
||||||
|
EXPORT_SYMBOL(__get_user_64t_2);
|
||||||
|
EXPORT_SYMBOL(__get_user_64t_4);
|
||||||
|
EXPORT_SYMBOL(__get_user_32t_8);
|
||||||
|
#endif
|
||||||
|
|
||||||
EXPORT_SYMBOL(__put_user_1);
|
EXPORT_SYMBOL(__put_user_1);
|
||||||
EXPORT_SYMBOL(__put_user_2);
|
EXPORT_SYMBOL(__put_user_2);
|
||||||
|
|
|
@ -175,7 +175,7 @@ static bool migrate_one_irq(struct irq_desc *desc)
|
||||||
c = irq_data_get_irq_chip(d);
|
c = irq_data_get_irq_chip(d);
|
||||||
if (!c->irq_set_affinity)
|
if (!c->irq_set_affinity)
|
||||||
pr_debug("IRQ%u: unable to set affinity\n", d->irq);
|
pr_debug("IRQ%u: unable to set affinity\n", d->irq);
|
||||||
else if (c->irq_set_affinity(d, affinity, true) == IRQ_SET_MASK_OK && ret)
|
else if (c->irq_set_affinity(d, affinity, false) == IRQ_SET_MASK_OK && ret)
|
||||||
cpumask_copy(d->affinity, affinity);
|
cpumask_copy(d->affinity, affinity);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -110,10 +110,13 @@
|
||||||
*
|
*
|
||||||
* @ TESTCASE_START
|
* @ TESTCASE_START
|
||||||
* bl __kprobes_test_case_start
|
* bl __kprobes_test_case_start
|
||||||
* @ start of inline data...
|
* .pushsection .rodata
|
||||||
|
* "10:
|
||||||
* .ascii "mov r0, r7" @ text title for test case
|
* .ascii "mov r0, r7" @ text title for test case
|
||||||
* .byte 0
|
* .byte 0
|
||||||
* .align 2, 0
|
* .popsection
|
||||||
|
* @ start of inline data...
|
||||||
|
* .word 10b @ pointer to title in .rodata section
|
||||||
*
|
*
|
||||||
* @ TEST_ARG_REG
|
* @ TEST_ARG_REG
|
||||||
* .byte ARG_TYPE_REG
|
* .byte ARG_TYPE_REG
|
||||||
|
@ -971,7 +974,7 @@ void __naked __kprobes_test_case_start(void)
|
||||||
__asm__ __volatile__ (
|
__asm__ __volatile__ (
|
||||||
"stmdb sp!, {r4-r11} \n\t"
|
"stmdb sp!, {r4-r11} \n\t"
|
||||||
"sub sp, sp, #"__stringify(TEST_MEMORY_SIZE)"\n\t"
|
"sub sp, sp, #"__stringify(TEST_MEMORY_SIZE)"\n\t"
|
||||||
"bic r0, lr, #1 @ r0 = inline title string \n\t"
|
"bic r0, lr, #1 @ r0 = inline data \n\t"
|
||||||
"mov r1, sp \n\t"
|
"mov r1, sp \n\t"
|
||||||
"bl kprobes_test_case_start \n\t"
|
"bl kprobes_test_case_start \n\t"
|
||||||
"bx r0 \n\t"
|
"bx r0 \n\t"
|
||||||
|
@ -1349,15 +1352,14 @@ static unsigned long next_instruction(unsigned long pc)
|
||||||
return pc + 4;
|
return pc + 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uintptr_t __used kprobes_test_case_start(const char *title, void *stack)
|
static uintptr_t __used kprobes_test_case_start(const char **title, void *stack)
|
||||||
{
|
{
|
||||||
struct test_arg *args;
|
struct test_arg *args;
|
||||||
struct test_arg_end *end_arg;
|
struct test_arg_end *end_arg;
|
||||||
unsigned long test_code;
|
unsigned long test_code;
|
||||||
|
|
||||||
args = (struct test_arg *)PTR_ALIGN(title + strlen(title) + 1, 4);
|
current_title = *title++;
|
||||||
|
args = (struct test_arg *)title;
|
||||||
current_title = title;
|
|
||||||
current_args = args;
|
current_args = args;
|
||||||
current_stack = stack;
|
current_stack = stack;
|
||||||
|
|
||||||
|
|
|
@ -111,11 +111,14 @@ struct test_arg_end {
|
||||||
#define TESTCASE_START(title) \
|
#define TESTCASE_START(title) \
|
||||||
__asm__ __volatile__ ( \
|
__asm__ __volatile__ ( \
|
||||||
"bl __kprobes_test_case_start \n\t" \
|
"bl __kprobes_test_case_start \n\t" \
|
||||||
|
".pushsection .rodata \n\t" \
|
||||||
|
"10: \n\t" \
|
||||||
/* don't use .asciz here as 'title' may be */ \
|
/* don't use .asciz here as 'title' may be */ \
|
||||||
/* multiple strings to be concatenated. */ \
|
/* multiple strings to be concatenated. */ \
|
||||||
".ascii "#title" \n\t" \
|
".ascii "#title" \n\t" \
|
||||||
".byte 0 \n\t" \
|
".byte 0 \n\t" \
|
||||||
".align 2, 0 \n\t"
|
".popsection \n\t" \
|
||||||
|
".word 10b \n\t"
|
||||||
|
|
||||||
#define TEST_ARG_REG(reg, val) \
|
#define TEST_ARG_REG(reg, val) \
|
||||||
".byte "__stringify(ARG_TYPE_REG)" \n\t" \
|
".byte "__stringify(ARG_TYPE_REG)" \n\t" \
|
||||||
|
|
|
@ -76,21 +76,15 @@ static struct pmu_hw_events *cpu_pmu_get_cpu_events(void)
|
||||||
|
|
||||||
static void cpu_pmu_enable_percpu_irq(void *data)
|
static void cpu_pmu_enable_percpu_irq(void *data)
|
||||||
{
|
{
|
||||||
struct arm_pmu *cpu_pmu = data;
|
int irq = *(int *)data;
|
||||||
struct platform_device *pmu_device = cpu_pmu->plat_device;
|
|
||||||
int irq = platform_get_irq(pmu_device, 0);
|
|
||||||
|
|
||||||
enable_percpu_irq(irq, IRQ_TYPE_NONE);
|
enable_percpu_irq(irq, IRQ_TYPE_NONE);
|
||||||
cpumask_set_cpu(smp_processor_id(), &cpu_pmu->active_irqs);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cpu_pmu_disable_percpu_irq(void *data)
|
static void cpu_pmu_disable_percpu_irq(void *data)
|
||||||
{
|
{
|
||||||
struct arm_pmu *cpu_pmu = data;
|
int irq = *(int *)data;
|
||||||
struct platform_device *pmu_device = cpu_pmu->plat_device;
|
|
||||||
int irq = platform_get_irq(pmu_device, 0);
|
|
||||||
|
|
||||||
cpumask_clear_cpu(smp_processor_id(), &cpu_pmu->active_irqs);
|
|
||||||
disable_percpu_irq(irq);
|
disable_percpu_irq(irq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -103,7 +97,7 @@ static void cpu_pmu_free_irq(struct arm_pmu *cpu_pmu)
|
||||||
|
|
||||||
irq = platform_get_irq(pmu_device, 0);
|
irq = platform_get_irq(pmu_device, 0);
|
||||||
if (irq >= 0 && irq_is_percpu(irq)) {
|
if (irq >= 0 && irq_is_percpu(irq)) {
|
||||||
on_each_cpu(cpu_pmu_disable_percpu_irq, cpu_pmu, 1);
|
on_each_cpu(cpu_pmu_disable_percpu_irq, &irq, 1);
|
||||||
free_percpu_irq(irq, &percpu_pmu);
|
free_percpu_irq(irq, &percpu_pmu);
|
||||||
} else {
|
} else {
|
||||||
for (i = 0; i < irqs; ++i) {
|
for (i = 0; i < irqs; ++i) {
|
||||||
|
@ -138,7 +132,7 @@ static int cpu_pmu_request_irq(struct arm_pmu *cpu_pmu, irq_handler_t handler)
|
||||||
irq);
|
irq);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
on_each_cpu(cpu_pmu_enable_percpu_irq, cpu_pmu, 1);
|
on_each_cpu(cpu_pmu_enable_percpu_irq, &irq, 1);
|
||||||
} else {
|
} else {
|
||||||
for (i = 0; i < irqs; ++i) {
|
for (i = 0; i < irqs; ++i) {
|
||||||
err = 0;
|
err = 0;
|
||||||
|
|
|
@ -334,6 +334,8 @@ void flush_thread(void)
|
||||||
memset(&tsk->thread.debug, 0, sizeof(struct debug_info));
|
memset(&tsk->thread.debug, 0, sizeof(struct debug_info));
|
||||||
memset(&thread->fpstate, 0, sizeof(union fp_state));
|
memset(&thread->fpstate, 0, sizeof(union fp_state));
|
||||||
|
|
||||||
|
flush_tls();
|
||||||
|
|
||||||
thread_notify(THREAD_NOTIFY_FLUSH, thread);
|
thread_notify(THREAD_NOTIFY_FLUSH, thread);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -142,14 +142,6 @@ static int emulate_swpX(unsigned int address, unsigned int *data,
|
||||||
while (1) {
|
while (1) {
|
||||||
unsigned long temp;
|
unsigned long temp;
|
||||||
|
|
||||||
/*
|
|
||||||
* Barrier required between accessing protected resource and
|
|
||||||
* releasing a lock for it. Legacy code might not have done
|
|
||||||
* this, and we cannot determine that this is not the case
|
|
||||||
* being emulated, so insert always.
|
|
||||||
*/
|
|
||||||
smp_mb();
|
|
||||||
|
|
||||||
if (type == TYPE_SWPB)
|
if (type == TYPE_SWPB)
|
||||||
__user_swpb_asm(*data, address, res, temp);
|
__user_swpb_asm(*data, address, res, temp);
|
||||||
else
|
else
|
||||||
|
@ -162,13 +154,6 @@ static int emulate_swpX(unsigned int address, unsigned int *data,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (res == 0) {
|
if (res == 0) {
|
||||||
/*
|
|
||||||
* Barrier also required between acquiring a lock for a
|
|
||||||
* protected resource and accessing the resource. Inserted for
|
|
||||||
* same reason as above.
|
|
||||||
*/
|
|
||||||
smp_mb();
|
|
||||||
|
|
||||||
if (type == TYPE_SWPB)
|
if (type == TYPE_SWPB)
|
||||||
swpbcounter++;
|
swpbcounter++;
|
||||||
else
|
else
|
||||||
|
|
|
@ -45,7 +45,7 @@ static int thumbee_notifier(struct notifier_block *self, unsigned long cmd, void
|
||||||
|
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case THREAD_NOTIFY_FLUSH:
|
case THREAD_NOTIFY_FLUSH:
|
||||||
thread->thumbee_state = 0;
|
teehbr_write(0);
|
||||||
break;
|
break;
|
||||||
case THREAD_NOTIFY_SWITCH:
|
case THREAD_NOTIFY_SWITCH:
|
||||||
current_thread_info()->thumbee_state = teehbr_read();
|
current_thread_info()->thumbee_state = teehbr_read();
|
||||||
|
|
|
@ -581,7 +581,6 @@ do_cache_op(unsigned long start, unsigned long end, int flags)
|
||||||
#define NR(x) ((__ARM_NR_##x) - __ARM_NR_BASE)
|
#define NR(x) ((__ARM_NR_##x) - __ARM_NR_BASE)
|
||||||
asmlinkage int arm_syscall(int no, struct pt_regs *regs)
|
asmlinkage int arm_syscall(int no, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
struct thread_info *thread = current_thread_info();
|
|
||||||
siginfo_t info;
|
siginfo_t info;
|
||||||
|
|
||||||
if ((no >> 16) != (__ARM_NR_BASE>> 16))
|
if ((no >> 16) != (__ARM_NR_BASE>> 16))
|
||||||
|
@ -632,21 +631,7 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs)
|
||||||
return regs->ARM_r0;
|
return regs->ARM_r0;
|
||||||
|
|
||||||
case NR(set_tls):
|
case NR(set_tls):
|
||||||
thread->tp_value[0] = regs->ARM_r0;
|
set_tls(regs->ARM_r0);
|
||||||
if (tls_emu)
|
|
||||||
return 0;
|
|
||||||
if (has_tls_reg) {
|
|
||||||
asm ("mcr p15, 0, %0, c13, c0, 3"
|
|
||||||
: : "r" (regs->ARM_r0));
|
|
||||||
} else {
|
|
||||||
/*
|
|
||||||
* User space must never try to access this directly.
|
|
||||||
* Expect your app to break eventually if you do so.
|
|
||||||
* The user helper at 0xffff0fe0 must be used instead.
|
|
||||||
* (see entry-armv.S for details)
|
|
||||||
*/
|
|
||||||
*((unsigned int *)0xffff0ff0) = regs->ARM_r0;
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
#ifdef CONFIG_NEEDS_SYSCALL_FOR_CMPXCHG
|
#ifdef CONFIG_NEEDS_SYSCALL_FOR_CMPXCHG
|
||||||
|
|
|
@ -93,6 +93,8 @@ static int kvm_handle_wfx(struct kvm_vcpu *vcpu, struct kvm_run *run)
|
||||||
else
|
else
|
||||||
kvm_vcpu_block(vcpu);
|
kvm_vcpu_block(vcpu);
|
||||||
|
|
||||||
|
kvm_skip_instr(vcpu, kvm_vcpu_trap_il_is32bit(vcpu));
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -99,6 +99,10 @@ __do_hyp_init:
|
||||||
mrc p15, 0, r0, c10, c2, 1
|
mrc p15, 0, r0, c10, c2, 1
|
||||||
mcr p15, 4, r0, c10, c2, 1
|
mcr p15, 4, r0, c10, c2, 1
|
||||||
|
|
||||||
|
@ Invalidate the stale TLBs from Bootloader
|
||||||
|
mcr p15, 4, r0, c8, c7, 0 @ TLBIALLH
|
||||||
|
dsb ish
|
||||||
|
|
||||||
@ Set the HSCTLR to:
|
@ Set the HSCTLR to:
|
||||||
@ - ARM/THUMB exceptions: Kernel config (Thumb-2 kernel)
|
@ - ARM/THUMB exceptions: Kernel config (Thumb-2 kernel)
|
||||||
@ - Endianness: Kernel config
|
@ - Endianness: Kernel config
|
||||||
|
|
|
@ -80,7 +80,7 @@ ENTRY(__get_user_8)
|
||||||
ENDPROC(__get_user_8)
|
ENDPROC(__get_user_8)
|
||||||
|
|
||||||
#ifdef __ARMEB__
|
#ifdef __ARMEB__
|
||||||
ENTRY(__get_user_lo8)
|
ENTRY(__get_user_32t_8)
|
||||||
check_uaccess r0, 8, r1, r2, __get_user_bad
|
check_uaccess r0, 8, r1, r2, __get_user_bad
|
||||||
#ifdef CONFIG_CPU_USE_DOMAINS
|
#ifdef CONFIG_CPU_USE_DOMAINS
|
||||||
add r0, r0, #4
|
add r0, r0, #4
|
||||||
|
@ -90,7 +90,37 @@ ENTRY(__get_user_lo8)
|
||||||
#endif
|
#endif
|
||||||
mov r0, #0
|
mov r0, #0
|
||||||
ret lr
|
ret lr
|
||||||
ENDPROC(__get_user_lo8)
|
ENDPROC(__get_user_32t_8)
|
||||||
|
|
||||||
|
ENTRY(__get_user_64t_1)
|
||||||
|
check_uaccess r0, 1, r1, r2, __get_user_bad8
|
||||||
|
8: TUSER(ldrb) r3, [r0]
|
||||||
|
mov r0, #0
|
||||||
|
ret lr
|
||||||
|
ENDPROC(__get_user_64t_1)
|
||||||
|
|
||||||
|
ENTRY(__get_user_64t_2)
|
||||||
|
check_uaccess r0, 2, r1, r2, __get_user_bad8
|
||||||
|
#ifdef CONFIG_CPU_USE_DOMAINS
|
||||||
|
rb .req ip
|
||||||
|
9: ldrbt r3, [r0], #1
|
||||||
|
10: ldrbt rb, [r0], #0
|
||||||
|
#else
|
||||||
|
rb .req r0
|
||||||
|
9: ldrb r3, [r0]
|
||||||
|
10: ldrb rb, [r0, #1]
|
||||||
|
#endif
|
||||||
|
orr r3, rb, r3, lsl #8
|
||||||
|
mov r0, #0
|
||||||
|
ret lr
|
||||||
|
ENDPROC(__get_user_64t_2)
|
||||||
|
|
||||||
|
ENTRY(__get_user_64t_4)
|
||||||
|
check_uaccess r0, 4, r1, r2, __get_user_bad8
|
||||||
|
11: TUSER(ldr) r3, [r0]
|
||||||
|
mov r0, #0
|
||||||
|
ret lr
|
||||||
|
ENDPROC(__get_user_64t_4)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
__get_user_bad8:
|
__get_user_bad8:
|
||||||
|
@ -111,5 +141,9 @@ ENDPROC(__get_user_bad8)
|
||||||
.long 6b, __get_user_bad8
|
.long 6b, __get_user_bad8
|
||||||
#ifdef __ARMEB__
|
#ifdef __ARMEB__
|
||||||
.long 7b, __get_user_bad
|
.long 7b, __get_user_bad
|
||||||
|
.long 8b, __get_user_bad8
|
||||||
|
.long 9b, __get_user_bad8
|
||||||
|
.long 10b, __get_user_bad8
|
||||||
|
.long 11b, __get_user_bad8
|
||||||
#endif
|
#endif
|
||||||
.popsection
|
.popsection
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
#include <linux/of_irq.h>
|
#include <linux/of_irq.h>
|
||||||
|
#include <linux/clk-provider.h>
|
||||||
|
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
|
@ -35,13 +36,21 @@ static void __init at91rm9200_dt_init_irq(void)
|
||||||
of_irq_init(irq_of_match);
|
of_irq_init(irq_of_match);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void __init at91rm9200_dt_timer_init(void)
|
||||||
|
{
|
||||||
|
#if defined(CONFIG_COMMON_CLK)
|
||||||
|
of_clk_init(NULL);
|
||||||
|
#endif
|
||||||
|
at91rm9200_timer_init();
|
||||||
|
}
|
||||||
|
|
||||||
static const char *at91rm9200_dt_board_compat[] __initdata = {
|
static const char *at91rm9200_dt_board_compat[] __initdata = {
|
||||||
"atmel,at91rm9200",
|
"atmel,at91rm9200",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
DT_MACHINE_START(at91rm9200_dt, "Atmel AT91RM9200 (Device Tree)")
|
DT_MACHINE_START(at91rm9200_dt, "Atmel AT91RM9200 (Device Tree)")
|
||||||
.init_time = at91rm9200_timer_init,
|
.init_time = at91rm9200_dt_timer_init,
|
||||||
.map_io = at91_map_io,
|
.map_io = at91_map_io,
|
||||||
.handle_irq = at91_aic_handle_irq,
|
.handle_irq = at91_aic_handle_irq,
|
||||||
.init_early = at91rm9200_dt_initialize,
|
.init_early = at91rm9200_dt_initialize,
|
||||||
|
|
|
@ -97,7 +97,7 @@ static int clk_gate2_is_enabled(struct clk_hw *hw)
|
||||||
struct clk_gate2 *gate = to_clk_gate2(hw);
|
struct clk_gate2 *gate = to_clk_gate2(hw);
|
||||||
|
|
||||||
if (gate->share_count)
|
if (gate->share_count)
|
||||||
return !!(*gate->share_count);
|
return !!__clk_get_enable_count(hw->clk);
|
||||||
else
|
else
|
||||||
return clk_gate2_reg_is_enabled(gate->reg, gate->bit_idx);
|
return clk_gate2_reg_is_enabled(gate->reg, gate->bit_idx);
|
||||||
}
|
}
|
||||||
|
@ -127,10 +127,6 @@ struct clk *clk_register_gate2(struct device *dev, const char *name,
|
||||||
gate->bit_idx = bit_idx;
|
gate->bit_idx = bit_idx;
|
||||||
gate->flags = clk_gate2_flags;
|
gate->flags = clk_gate2_flags;
|
||||||
gate->lock = lock;
|
gate->lock = lock;
|
||||||
|
|
||||||
/* Initialize share_count per hardware state */
|
|
||||||
if (share_count)
|
|
||||||
*share_count = clk_gate2_reg_is_enabled(reg, bit_idx) ? 1 : 0;
|
|
||||||
gate->share_count = share_count;
|
gate->share_count = share_count;
|
||||||
|
|
||||||
init.name = name;
|
init.name = name;
|
||||||
|
|
|
@ -1,9 +1,6 @@
|
||||||
menu "TI OMAP/AM/DM/DRA Family"
|
menu "TI OMAP/AM/DM/DRA Family"
|
||||||
depends on ARCH_MULTI_V6 || ARCH_MULTI_V7
|
depends on ARCH_MULTI_V6 || ARCH_MULTI_V7
|
||||||
|
|
||||||
config ARCH_OMAP
|
|
||||||
bool
|
|
||||||
|
|
||||||
config ARCH_OMAP2
|
config ARCH_OMAP2
|
||||||
bool "TI OMAP2"
|
bool "TI OMAP2"
|
||||||
depends on ARCH_MULTI_V6
|
depends on ARCH_MULTI_V6
|
||||||
|
|
|
@ -1207,8 +1207,7 @@ int gpmc_cs_program_settings(int cs, struct gpmc_settings *p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((p->wait_on_read || p->wait_on_write) &&
|
if (p->wait_pin > gpmc_nr_waitpins) {
|
||||||
(p->wait_pin > gpmc_nr_waitpins)) {
|
|
||||||
pr_err("%s: invalid wait-pin (%d)\n", __func__, p->wait_pin);
|
pr_err("%s: invalid wait-pin (%d)\n", __func__, p->wait_pin);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
@ -1288,8 +1287,8 @@ void gpmc_read_settings_dt(struct device_node *np, struct gpmc_settings *p)
|
||||||
p->wait_on_write = of_property_read_bool(np,
|
p->wait_on_write = of_property_read_bool(np,
|
||||||
"gpmc,wait-on-write");
|
"gpmc,wait-on-write");
|
||||||
if (!p->wait_on_read && !p->wait_on_write)
|
if (!p->wait_on_read && !p->wait_on_write)
|
||||||
pr_warn("%s: read/write wait monitoring not enabled!\n",
|
pr_debug("%s: rd/wr wait monitoring not enabled!\n",
|
||||||
__func__);
|
__func__);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2065,7 +2065,7 @@ static void _reconfigure_io_chain(void)
|
||||||
|
|
||||||
spin_lock_irqsave(&io_chain_lock, flags);
|
spin_lock_irqsave(&io_chain_lock, flags);
|
||||||
|
|
||||||
if (cpu_is_omap34xx() && omap3_has_io_chain_ctrl())
|
if (cpu_is_omap34xx())
|
||||||
omap3xxx_prm_reconfigure_io_chain();
|
omap3xxx_prm_reconfigure_io_chain();
|
||||||
else if (cpu_is_omap44xx())
|
else if (cpu_is_omap44xx())
|
||||||
omap44xx_prm_reconfigure_io_chain();
|
omap44xx_prm_reconfigure_io_chain();
|
||||||
|
|
|
@ -45,7 +45,7 @@ static struct omap_prcm_irq_setup omap3_prcm_irq_setup = {
|
||||||
.ocp_barrier = &omap3xxx_prm_ocp_barrier,
|
.ocp_barrier = &omap3xxx_prm_ocp_barrier,
|
||||||
.save_and_clear_irqen = &omap3xxx_prm_save_and_clear_irqen,
|
.save_and_clear_irqen = &omap3xxx_prm_save_and_clear_irqen,
|
||||||
.restore_irqen = &omap3xxx_prm_restore_irqen,
|
.restore_irqen = &omap3xxx_prm_restore_irqen,
|
||||||
.reconfigure_io_chain = &omap3xxx_prm_reconfigure_io_chain,
|
.reconfigure_io_chain = NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -369,15 +369,30 @@ void __init omap3_prm_init_pm(bool has_uart4, bool has_iva)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* omap3xxx_prm_reconfigure_io_chain - clear latches and reconfigure I/O chain
|
* omap3430_pre_es3_1_reconfigure_io_chain - restart wake-up daisy chain
|
||||||
|
*
|
||||||
|
* The ST_IO_CHAIN bit does not exist in 3430 before es3.1. The only
|
||||||
|
* thing we can do is toggle EN_IO bit for earlier omaps.
|
||||||
|
*/
|
||||||
|
void omap3430_pre_es3_1_reconfigure_io_chain(void)
|
||||||
|
{
|
||||||
|
omap2_prm_clear_mod_reg_bits(OMAP3430_EN_IO_MASK, WKUP_MOD,
|
||||||
|
PM_WKEN);
|
||||||
|
omap2_prm_set_mod_reg_bits(OMAP3430_EN_IO_MASK, WKUP_MOD,
|
||||||
|
PM_WKEN);
|
||||||
|
omap2_prm_read_mod_reg(WKUP_MOD, PM_WKEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* omap3_prm_reconfigure_io_chain - clear latches and reconfigure I/O chain
|
||||||
*
|
*
|
||||||
* Clear any previously-latched I/O wakeup events and ensure that the
|
* Clear any previously-latched I/O wakeup events and ensure that the
|
||||||
* I/O wakeup gates are aligned with the current mux settings. Works
|
* I/O wakeup gates are aligned with the current mux settings. Works
|
||||||
* by asserting WUCLKIN, waiting for WUCLKOUT to be asserted, and then
|
* by asserting WUCLKIN, waiting for WUCLKOUT to be asserted, and then
|
||||||
* deasserting WUCLKIN and clearing the ST_IO_CHAIN WKST bit. No
|
* deasserting WUCLKIN and clearing the ST_IO_CHAIN WKST bit. No
|
||||||
* return value.
|
* return value. These registers are only available in 3430 es3.1 and later.
|
||||||
*/
|
*/
|
||||||
void omap3xxx_prm_reconfigure_io_chain(void)
|
void omap3_prm_reconfigure_io_chain(void)
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
|
@ -399,6 +414,15 @@ void omap3xxx_prm_reconfigure_io_chain(void)
|
||||||
omap2_prm_read_mod_reg(WKUP_MOD, PM_WKST);
|
omap2_prm_read_mod_reg(WKUP_MOD, PM_WKST);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* omap3xxx_prm_reconfigure_io_chain - reconfigure I/O chain
|
||||||
|
*/
|
||||||
|
void omap3xxx_prm_reconfigure_io_chain(void)
|
||||||
|
{
|
||||||
|
if (omap3_prcm_irq_setup.reconfigure_io_chain)
|
||||||
|
omap3_prcm_irq_setup.reconfigure_io_chain();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* omap3xxx_prm_enable_io_wakeup - enable wakeup events from I/O wakeup latches
|
* omap3xxx_prm_enable_io_wakeup - enable wakeup events from I/O wakeup latches
|
||||||
*
|
*
|
||||||
|
@ -656,6 +680,13 @@ static int omap3xxx_prm_late_init(void)
|
||||||
if (!(prm_features & PRM_HAS_IO_WAKEUP))
|
if (!(prm_features & PRM_HAS_IO_WAKEUP))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if (omap3_has_io_chain_ctrl())
|
||||||
|
omap3_prcm_irq_setup.reconfigure_io_chain =
|
||||||
|
omap3_prm_reconfigure_io_chain;
|
||||||
|
else
|
||||||
|
omap3_prcm_irq_setup.reconfigure_io_chain =
|
||||||
|
omap3430_pre_es3_1_reconfigure_io_chain;
|
||||||
|
|
||||||
omap3xxx_prm_enable_io_wakeup();
|
omap3xxx_prm_enable_io_wakeup();
|
||||||
ret = omap_prcm_register_chain_handler(&omap3_prcm_irq_setup);
|
ret = omap_prcm_register_chain_handler(&omap3_prcm_irq_setup);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
|
|
|
@ -61,7 +61,7 @@ EXPORT_SYMBOL(get_clock_tick_rate);
|
||||||
/*
|
/*
|
||||||
* For non device-tree builds, keep legacy timer init
|
* For non device-tree builds, keep legacy timer init
|
||||||
*/
|
*/
|
||||||
void pxa_timer_init(void)
|
void __init pxa_timer_init(void)
|
||||||
{
|
{
|
||||||
pxa_timer_nodt_init(IRQ_OST0, io_p2v(0x40a00000),
|
pxa_timer_nodt_init(IRQ_OST0, io_p2v(0x40a00000),
|
||||||
get_clock_tick_rate());
|
get_clock_tick_rate());
|
||||||
|
|
|
@ -41,6 +41,7 @@
|
||||||
* This code is not portable to processors with late data abort handling.
|
* This code is not portable to processors with late data abort handling.
|
||||||
*/
|
*/
|
||||||
#define CODING_BITS(i) (i & 0x0e000000)
|
#define CODING_BITS(i) (i & 0x0e000000)
|
||||||
|
#define COND_BITS(i) (i & 0xf0000000)
|
||||||
|
|
||||||
#define LDST_I_BIT(i) (i & (1 << 26)) /* Immediate constant */
|
#define LDST_I_BIT(i) (i & (1 << 26)) /* Immediate constant */
|
||||||
#define LDST_P_BIT(i) (i & (1 << 24)) /* Preindex */
|
#define LDST_P_BIT(i) (i & (1 << 24)) /* Preindex */
|
||||||
|
@ -821,6 +822,8 @@ do_alignment(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x04000000: /* ldr or str immediate */
|
case 0x04000000: /* ldr or str immediate */
|
||||||
|
if (COND_BITS(instr) == 0xf0000000) /* NEON VLDn, VSTn */
|
||||||
|
goto bad;
|
||||||
offset.un = OFFSET_BITS(instr);
|
offset.un = OFFSET_BITS(instr);
|
||||||
handler = do_alignment_ldrstr;
|
handler = do_alignment_ldrstr;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -146,7 +146,6 @@ ENDPROC(cpu_v7_set_pte_ext)
|
||||||
mov \tmp, \ttbr1, lsr #(32 - ARCH_PGD_SHIFT) @ upper bits
|
mov \tmp, \ttbr1, lsr #(32 - ARCH_PGD_SHIFT) @ upper bits
|
||||||
mov \ttbr1, \ttbr1, lsl #ARCH_PGD_SHIFT @ lower bits
|
mov \ttbr1, \ttbr1, lsl #ARCH_PGD_SHIFT @ lower bits
|
||||||
addls \ttbr1, \ttbr1, #TTBR1_OFFSET
|
addls \ttbr1, \ttbr1, #TTBR1_OFFSET
|
||||||
adcls \tmp, \tmp, #0
|
|
||||||
mcrr p15, 1, \ttbr1, \tmp, c2 @ load TTBR1
|
mcrr p15, 1, \ttbr1, \tmp, c2 @ load TTBR1
|
||||||
mov \tmp, \ttbr0, lsr #(32 - ARCH_PGD_SHIFT) @ upper bits
|
mov \tmp, \ttbr0, lsr #(32 - ARCH_PGD_SHIFT) @ upper bits
|
||||||
mov \ttbr0, \ttbr0, lsl #ARCH_PGD_SHIFT @ lower bits
|
mov \ttbr0, \ttbr0, lsl #ARCH_PGD_SHIFT @ lower bits
|
||||||
|
@ -158,9 +157,9 @@ ENDPROC(cpu_v7_set_pte_ext)
|
||||||
* TFR EV X F IHD LR S
|
* TFR EV X F IHD LR S
|
||||||
* .EEE ..EE PUI. .TAT 4RVI ZWRS BLDP WCAM
|
* .EEE ..EE PUI. .TAT 4RVI ZWRS BLDP WCAM
|
||||||
* rxxx rrxx xxx0 0101 xxxx xxxx x111 xxxx < forced
|
* rxxx rrxx xxx0 0101 xxxx xxxx x111 xxxx < forced
|
||||||
* 11 0 110 1 0011 1100 .111 1101 < we want
|
* 11 0 110 0 0011 1100 .111 1101 < we want
|
||||||
*/
|
*/
|
||||||
.align 2
|
.align 2
|
||||||
.type v7_crval, #object
|
.type v7_crval, #object
|
||||||
v7_crval:
|
v7_crval:
|
||||||
crval clear=0x0120c302, mmuset=0x30c23c7d, ucset=0x00c01c7c
|
crval clear=0x0122c302, mmuset=0x30c03c7d, ucset=0x00c01c7c
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
config ARCH_OMAP
|
||||||
|
bool
|
||||||
|
|
||||||
if ARCH_OMAP
|
if ARCH_OMAP
|
||||||
|
|
||||||
menu "TI OMAP Common Features"
|
menu "TI OMAP Common Features"
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
obj-y := enlighten.o hypercall.o grant-table.o p2m.o mm.o
|
obj-y := enlighten.o hypercall.o grant-table.o p2m.o mm.o mm32.o
|
||||||
|
|
|
@ -260,6 +260,12 @@ static int __init xen_guest_init(void)
|
||||||
xen_domain_type = XEN_HVM_DOMAIN;
|
xen_domain_type = XEN_HVM_DOMAIN;
|
||||||
|
|
||||||
xen_setup_features();
|
xen_setup_features();
|
||||||
|
|
||||||
|
if (!xen_feature(XENFEAT_grant_map_identity)) {
|
||||||
|
pr_warn("Please upgrade your Xen.\n"
|
||||||
|
"If your platform has any non-coherent DMA devices, they won't work properly.\n");
|
||||||
|
}
|
||||||
|
|
||||||
if (xen_feature(XENFEAT_dom0))
|
if (xen_feature(XENFEAT_dom0))
|
||||||
xen_start_info->flags |= SIF_INITDOMAIN|SIF_PRIVILEGED;
|
xen_start_info->flags |= SIF_INITDOMAIN|SIF_PRIVILEGED;
|
||||||
else
|
else
|
||||||
|
|
202
arch/arm/xen/mm32.c
Normal file
202
arch/arm/xen/mm32.c
Normal file
|
@ -0,0 +1,202 @@
|
||||||
|
#include <linux/cpu.h>
|
||||||
|
#include <linux/dma-mapping.h>
|
||||||
|
#include <linux/gfp.h>
|
||||||
|
#include <linux/highmem.h>
|
||||||
|
|
||||||
|
#include <xen/features.h>
|
||||||
|
|
||||||
|
static DEFINE_PER_CPU(unsigned long, xen_mm32_scratch_virt);
|
||||||
|
static DEFINE_PER_CPU(pte_t *, xen_mm32_scratch_ptep);
|
||||||
|
|
||||||
|
static int alloc_xen_mm32_scratch_page(int cpu)
|
||||||
|
{
|
||||||
|
struct page *page;
|
||||||
|
unsigned long virt;
|
||||||
|
pmd_t *pmdp;
|
||||||
|
pte_t *ptep;
|
||||||
|
|
||||||
|
if (per_cpu(xen_mm32_scratch_ptep, cpu) != NULL)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
page = alloc_page(GFP_KERNEL);
|
||||||
|
if (page == NULL) {
|
||||||
|
pr_warn("Failed to allocate xen_mm32_scratch_page for cpu %d\n", cpu);
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
virt = (unsigned long)__va(page_to_phys(page));
|
||||||
|
pmdp = pmd_offset(pud_offset(pgd_offset_k(virt), virt), virt);
|
||||||
|
ptep = pte_offset_kernel(pmdp, virt);
|
||||||
|
|
||||||
|
per_cpu(xen_mm32_scratch_virt, cpu) = virt;
|
||||||
|
per_cpu(xen_mm32_scratch_ptep, cpu) = ptep;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int xen_mm32_cpu_notify(struct notifier_block *self,
|
||||||
|
unsigned long action, void *hcpu)
|
||||||
|
{
|
||||||
|
int cpu = (long)hcpu;
|
||||||
|
switch (action) {
|
||||||
|
case CPU_UP_PREPARE:
|
||||||
|
if (alloc_xen_mm32_scratch_page(cpu))
|
||||||
|
return NOTIFY_BAD;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return NOTIFY_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct notifier_block xen_mm32_cpu_notifier = {
|
||||||
|
.notifier_call = xen_mm32_cpu_notify,
|
||||||
|
};
|
||||||
|
|
||||||
|
static void* xen_mm32_remap_page(dma_addr_t handle)
|
||||||
|
{
|
||||||
|
unsigned long virt = get_cpu_var(xen_mm32_scratch_virt);
|
||||||
|
pte_t *ptep = __get_cpu_var(xen_mm32_scratch_ptep);
|
||||||
|
|
||||||
|
*ptep = pfn_pte(handle >> PAGE_SHIFT, PAGE_KERNEL);
|
||||||
|
local_flush_tlb_kernel_page(virt);
|
||||||
|
|
||||||
|
return (void*)virt;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void xen_mm32_unmap(void *vaddr)
|
||||||
|
{
|
||||||
|
put_cpu_var(xen_mm32_scratch_virt);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* functions called by SWIOTLB */
|
||||||
|
|
||||||
|
static void dma_cache_maint(dma_addr_t handle, unsigned long offset,
|
||||||
|
size_t size, enum dma_data_direction dir,
|
||||||
|
void (*op)(const void *, size_t, int))
|
||||||
|
{
|
||||||
|
unsigned long pfn;
|
||||||
|
size_t left = size;
|
||||||
|
|
||||||
|
pfn = (handle >> PAGE_SHIFT) + offset / PAGE_SIZE;
|
||||||
|
offset %= PAGE_SIZE;
|
||||||
|
|
||||||
|
do {
|
||||||
|
size_t len = left;
|
||||||
|
void *vaddr;
|
||||||
|
|
||||||
|
if (!pfn_valid(pfn))
|
||||||
|
{
|
||||||
|
/* Cannot map the page, we don't know its physical address.
|
||||||
|
* Return and hope for the best */
|
||||||
|
if (!xen_feature(XENFEAT_grant_map_identity))
|
||||||
|
return;
|
||||||
|
vaddr = xen_mm32_remap_page(handle) + offset;
|
||||||
|
op(vaddr, len, dir);
|
||||||
|
xen_mm32_unmap(vaddr - offset);
|
||||||
|
} else {
|
||||||
|
struct page *page = pfn_to_page(pfn);
|
||||||
|
|
||||||
|
if (PageHighMem(page)) {
|
||||||
|
if (len + offset > PAGE_SIZE)
|
||||||
|
len = PAGE_SIZE - offset;
|
||||||
|
|
||||||
|
if (cache_is_vipt_nonaliasing()) {
|
||||||
|
vaddr = kmap_atomic(page);
|
||||||
|
op(vaddr + offset, len, dir);
|
||||||
|
kunmap_atomic(vaddr);
|
||||||
|
} else {
|
||||||
|
vaddr = kmap_high_get(page);
|
||||||
|
if (vaddr) {
|
||||||
|
op(vaddr + offset, len, dir);
|
||||||
|
kunmap_high(page);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
vaddr = page_address(page) + offset;
|
||||||
|
op(vaddr, len, dir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
offset = 0;
|
||||||
|
pfn++;
|
||||||
|
left -= len;
|
||||||
|
} while (left);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __xen_dma_page_dev_to_cpu(struct device *hwdev, dma_addr_t handle,
|
||||||
|
size_t size, enum dma_data_direction dir)
|
||||||
|
{
|
||||||
|
/* Cannot use __dma_page_dev_to_cpu because we don't have a
|
||||||
|
* struct page for handle */
|
||||||
|
|
||||||
|
if (dir != DMA_TO_DEVICE)
|
||||||
|
outer_inv_range(handle, handle + size);
|
||||||
|
|
||||||
|
dma_cache_maint(handle & PAGE_MASK, handle & ~PAGE_MASK, size, dir, dmac_unmap_area);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __xen_dma_page_cpu_to_dev(struct device *hwdev, dma_addr_t handle,
|
||||||
|
size_t size, enum dma_data_direction dir)
|
||||||
|
{
|
||||||
|
|
||||||
|
dma_cache_maint(handle & PAGE_MASK, handle & ~PAGE_MASK, size, dir, dmac_map_area);
|
||||||
|
|
||||||
|
if (dir == DMA_FROM_DEVICE) {
|
||||||
|
outer_inv_range(handle, handle + size);
|
||||||
|
} else {
|
||||||
|
outer_clean_range(handle, handle + size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void xen_dma_unmap_page(struct device *hwdev, dma_addr_t handle,
|
||||||
|
size_t size, enum dma_data_direction dir,
|
||||||
|
struct dma_attrs *attrs)
|
||||||
|
|
||||||
|
{
|
||||||
|
if (!__generic_dma_ops(hwdev)->unmap_page)
|
||||||
|
return;
|
||||||
|
if (dma_get_attr(DMA_ATTR_SKIP_CPU_SYNC, attrs))
|
||||||
|
return;
|
||||||
|
|
||||||
|
__xen_dma_page_dev_to_cpu(hwdev, handle, size, dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
void xen_dma_sync_single_for_cpu(struct device *hwdev,
|
||||||
|
dma_addr_t handle, size_t size, enum dma_data_direction dir)
|
||||||
|
{
|
||||||
|
if (!__generic_dma_ops(hwdev)->sync_single_for_cpu)
|
||||||
|
return;
|
||||||
|
__xen_dma_page_dev_to_cpu(hwdev, handle, size, dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
void xen_dma_sync_single_for_device(struct device *hwdev,
|
||||||
|
dma_addr_t handle, size_t size, enum dma_data_direction dir)
|
||||||
|
{
|
||||||
|
if (!__generic_dma_ops(hwdev)->sync_single_for_device)
|
||||||
|
return;
|
||||||
|
__xen_dma_page_cpu_to_dev(hwdev, handle, size, dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
int __init xen_mm32_init(void)
|
||||||
|
{
|
||||||
|
int cpu;
|
||||||
|
|
||||||
|
if (!xen_initial_domain())
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
register_cpu_notifier(&xen_mm32_cpu_notifier);
|
||||||
|
get_online_cpus();
|
||||||
|
for_each_online_cpu(cpu) {
|
||||||
|
if (alloc_xen_mm32_scratch_page(cpu)) {
|
||||||
|
put_online_cpus();
|
||||||
|
unregister_cpu_notifier(&xen_mm32_cpu_notifier);
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
put_online_cpus();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
arch_initcall(xen_mm32_init);
|
|
@ -21,14 +21,12 @@ struct xen_p2m_entry {
|
||||||
unsigned long pfn;
|
unsigned long pfn;
|
||||||
unsigned long mfn;
|
unsigned long mfn;
|
||||||
unsigned long nr_pages;
|
unsigned long nr_pages;
|
||||||
struct rb_node rbnode_mach;
|
|
||||||
struct rb_node rbnode_phys;
|
struct rb_node rbnode_phys;
|
||||||
};
|
};
|
||||||
|
|
||||||
static rwlock_t p2m_lock;
|
static rwlock_t p2m_lock;
|
||||||
struct rb_root phys_to_mach = RB_ROOT;
|
struct rb_root phys_to_mach = RB_ROOT;
|
||||||
EXPORT_SYMBOL_GPL(phys_to_mach);
|
EXPORT_SYMBOL_GPL(phys_to_mach);
|
||||||
static struct rb_root mach_to_phys = RB_ROOT;
|
|
||||||
|
|
||||||
static int xen_add_phys_to_mach_entry(struct xen_p2m_entry *new)
|
static int xen_add_phys_to_mach_entry(struct xen_p2m_entry *new)
|
||||||
{
|
{
|
||||||
|
@ -41,8 +39,6 @@ static int xen_add_phys_to_mach_entry(struct xen_p2m_entry *new)
|
||||||
parent = *link;
|
parent = *link;
|
||||||
entry = rb_entry(parent, struct xen_p2m_entry, rbnode_phys);
|
entry = rb_entry(parent, struct xen_p2m_entry, rbnode_phys);
|
||||||
|
|
||||||
if (new->mfn == entry->mfn)
|
|
||||||
goto err_out;
|
|
||||||
if (new->pfn == entry->pfn)
|
if (new->pfn == entry->pfn)
|
||||||
goto err_out;
|
goto err_out;
|
||||||
|
|
||||||
|
@ -88,64 +84,6 @@ unsigned long __pfn_to_mfn(unsigned long pfn)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(__pfn_to_mfn);
|
EXPORT_SYMBOL_GPL(__pfn_to_mfn);
|
||||||
|
|
||||||
static int xen_add_mach_to_phys_entry(struct xen_p2m_entry *new)
|
|
||||||
{
|
|
||||||
struct rb_node **link = &mach_to_phys.rb_node;
|
|
||||||
struct rb_node *parent = NULL;
|
|
||||||
struct xen_p2m_entry *entry;
|
|
||||||
int rc = 0;
|
|
||||||
|
|
||||||
while (*link) {
|
|
||||||
parent = *link;
|
|
||||||
entry = rb_entry(parent, struct xen_p2m_entry, rbnode_mach);
|
|
||||||
|
|
||||||
if (new->mfn == entry->mfn)
|
|
||||||
goto err_out;
|
|
||||||
if (new->pfn == entry->pfn)
|
|
||||||
goto err_out;
|
|
||||||
|
|
||||||
if (new->mfn < entry->mfn)
|
|
||||||
link = &(*link)->rb_left;
|
|
||||||
else
|
|
||||||
link = &(*link)->rb_right;
|
|
||||||
}
|
|
||||||
rb_link_node(&new->rbnode_mach, parent, link);
|
|
||||||
rb_insert_color(&new->rbnode_mach, &mach_to_phys);
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
err_out:
|
|
||||||
rc = -EINVAL;
|
|
||||||
pr_warn("%s: cannot add pfn=%pa -> mfn=%pa: pfn=%pa -> mfn=%pa already exists\n",
|
|
||||||
__func__, &new->pfn, &new->mfn, &entry->pfn, &entry->mfn);
|
|
||||||
out:
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned long __mfn_to_pfn(unsigned long mfn)
|
|
||||||
{
|
|
||||||
struct rb_node *n = mach_to_phys.rb_node;
|
|
||||||
struct xen_p2m_entry *entry;
|
|
||||||
unsigned long irqflags;
|
|
||||||
|
|
||||||
read_lock_irqsave(&p2m_lock, irqflags);
|
|
||||||
while (n) {
|
|
||||||
entry = rb_entry(n, struct xen_p2m_entry, rbnode_mach);
|
|
||||||
if (entry->mfn <= mfn &&
|
|
||||||
entry->mfn + entry->nr_pages > mfn) {
|
|
||||||
read_unlock_irqrestore(&p2m_lock, irqflags);
|
|
||||||
return entry->pfn + (mfn - entry->mfn);
|
|
||||||
}
|
|
||||||
if (mfn < entry->mfn)
|
|
||||||
n = n->rb_left;
|
|
||||||
else
|
|
||||||
n = n->rb_right;
|
|
||||||
}
|
|
||||||
read_unlock_irqrestore(&p2m_lock, irqflags);
|
|
||||||
|
|
||||||
return INVALID_P2M_ENTRY;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(__mfn_to_pfn);
|
|
||||||
|
|
||||||
int set_foreign_p2m_mapping(struct gnttab_map_grant_ref *map_ops,
|
int set_foreign_p2m_mapping(struct gnttab_map_grant_ref *map_ops,
|
||||||
struct gnttab_map_grant_ref *kmap_ops,
|
struct gnttab_map_grant_ref *kmap_ops,
|
||||||
struct page **pages, unsigned int count)
|
struct page **pages, unsigned int count)
|
||||||
|
@ -192,7 +130,6 @@ bool __set_phys_to_machine_multi(unsigned long pfn,
|
||||||
p2m_entry = rb_entry(n, struct xen_p2m_entry, rbnode_phys);
|
p2m_entry = rb_entry(n, struct xen_p2m_entry, rbnode_phys);
|
||||||
if (p2m_entry->pfn <= pfn &&
|
if (p2m_entry->pfn <= pfn &&
|
||||||
p2m_entry->pfn + p2m_entry->nr_pages > pfn) {
|
p2m_entry->pfn + p2m_entry->nr_pages > pfn) {
|
||||||
rb_erase(&p2m_entry->rbnode_mach, &mach_to_phys);
|
|
||||||
rb_erase(&p2m_entry->rbnode_phys, &phys_to_mach);
|
rb_erase(&p2m_entry->rbnode_phys, &phys_to_mach);
|
||||||
write_unlock_irqrestore(&p2m_lock, irqflags);
|
write_unlock_irqrestore(&p2m_lock, irqflags);
|
||||||
kfree(p2m_entry);
|
kfree(p2m_entry);
|
||||||
|
@ -217,8 +154,7 @@ bool __set_phys_to_machine_multi(unsigned long pfn,
|
||||||
p2m_entry->mfn = mfn;
|
p2m_entry->mfn = mfn;
|
||||||
|
|
||||||
write_lock_irqsave(&p2m_lock, irqflags);
|
write_lock_irqsave(&p2m_lock, irqflags);
|
||||||
if ((rc = xen_add_phys_to_mach_entry(p2m_entry) < 0) ||
|
if ((rc = xen_add_phys_to_mach_entry(p2m_entry)) < 0) {
|
||||||
(rc = xen_add_mach_to_phys_entry(p2m_entry) < 0)) {
|
|
||||||
write_unlock_irqrestore(&p2m_lock, irqflags);
|
write_unlock_irqrestore(&p2m_lock, irqflags);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -150,7 +150,6 @@ static void sha2_finup(struct shash_desc *desc, const u8 *data,
|
||||||
kernel_neon_begin_partial(28);
|
kernel_neon_begin_partial(28);
|
||||||
sha2_ce_transform(blocks, data, sctx->state, NULL, len);
|
sha2_ce_transform(blocks, data, sctx->state, NULL, len);
|
||||||
kernel_neon_end();
|
kernel_neon_end();
|
||||||
data += blocks * SHA256_BLOCK_SIZE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sha224_finup(struct shash_desc *desc, const u8 *data,
|
static int sha224_finup(struct shash_desc *desc, const u8 *data,
|
||||||
|
|
|
@ -79,7 +79,6 @@ static inline void decode_ctrl_reg(u32 reg,
|
||||||
*/
|
*/
|
||||||
#define ARM_MAX_BRP 16
|
#define ARM_MAX_BRP 16
|
||||||
#define ARM_MAX_WRP 16
|
#define ARM_MAX_WRP 16
|
||||||
#define ARM_MAX_HBP_SLOTS (ARM_MAX_BRP + ARM_MAX_WRP)
|
|
||||||
|
|
||||||
/* Virtual debug register bases. */
|
/* Virtual debug register bases. */
|
||||||
#define AARCH64_DBG_REG_BVR 0
|
#define AARCH64_DBG_REG_BVR 0
|
||||||
|
|
|
@ -139,7 +139,7 @@ extern struct task_struct *cpu_switch_to(struct task_struct *prev,
|
||||||
((struct pt_regs *)(THREAD_START_SP + task_stack_page(p)) - 1)
|
((struct pt_regs *)(THREAD_START_SP + task_stack_page(p)) - 1)
|
||||||
|
|
||||||
#define KSTK_EIP(tsk) ((unsigned long)task_pt_regs(tsk)->pc)
|
#define KSTK_EIP(tsk) ((unsigned long)task_pt_regs(tsk)->pc)
|
||||||
#define KSTK_ESP(tsk) ((unsigned long)task_pt_regs(tsk)->sp)
|
#define KSTK_ESP(tsk) user_stack_pointer(task_pt_regs(tsk))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Prefetching support
|
* Prefetching support
|
||||||
|
|
|
@ -137,7 +137,7 @@ struct pt_regs {
|
||||||
(!((regs)->pstate & PSR_F_BIT))
|
(!((regs)->pstate & PSR_F_BIT))
|
||||||
|
|
||||||
#define user_stack_pointer(regs) \
|
#define user_stack_pointer(regs) \
|
||||||
(!compat_user_mode(regs)) ? ((regs)->sp) : ((regs)->compat_sp)
|
(!compat_user_mode(regs) ? (regs)->sp : (regs)->compat_sp)
|
||||||
|
|
||||||
static inline unsigned long regs_return_value(struct pt_regs *regs)
|
static inline unsigned long regs_return_value(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
|
|
|
@ -270,6 +270,7 @@ static int fpsimd_cpu_pm_notifier(struct notifier_block *self,
|
||||||
case CPU_PM_ENTER:
|
case CPU_PM_ENTER:
|
||||||
if (current->mm && !test_thread_flag(TIF_FOREIGN_FPSTATE))
|
if (current->mm && !test_thread_flag(TIF_FOREIGN_FPSTATE))
|
||||||
fpsimd_save_state(¤t->thread.fpsimd_state);
|
fpsimd_save_state(¤t->thread.fpsimd_state);
|
||||||
|
this_cpu_write(fpsimd_last_state, NULL);
|
||||||
break;
|
break;
|
||||||
case CPU_PM_EXIT:
|
case CPU_PM_EXIT:
|
||||||
if (current->mm)
|
if (current->mm)
|
||||||
|
|
|
@ -373,10 +373,6 @@ ENTRY(__boot_cpu_mode)
|
||||||
.long 0
|
.long 0
|
||||||
.popsection
|
.popsection
|
||||||
|
|
||||||
.align 3
|
|
||||||
2: .quad .
|
|
||||||
.quad PAGE_OFFSET
|
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
.align 3
|
.align 3
|
||||||
1: .quad .
|
1: .quad .
|
||||||
|
|
|
@ -97,19 +97,15 @@ static bool migrate_one_irq(struct irq_desc *desc)
|
||||||
if (irqd_is_per_cpu(d) || !cpumask_test_cpu(smp_processor_id(), affinity))
|
if (irqd_is_per_cpu(d) || !cpumask_test_cpu(smp_processor_id(), affinity))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (cpumask_any_and(affinity, cpu_online_mask) >= nr_cpu_ids)
|
if (cpumask_any_and(affinity, cpu_online_mask) >= nr_cpu_ids) {
|
||||||
|
affinity = cpu_online_mask;
|
||||||
ret = true;
|
ret = true;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* when using forced irq_set_affinity we must ensure that the cpu
|
|
||||||
* being offlined is not present in the affinity mask, it may be
|
|
||||||
* selected as the target CPU otherwise
|
|
||||||
*/
|
|
||||||
affinity = cpu_online_mask;
|
|
||||||
c = irq_data_get_irq_chip(d);
|
c = irq_data_get_irq_chip(d);
|
||||||
if (!c->irq_set_affinity)
|
if (!c->irq_set_affinity)
|
||||||
pr_debug("IRQ%u: unable to set affinity\n", d->irq);
|
pr_debug("IRQ%u: unable to set affinity\n", d->irq);
|
||||||
else if (c->irq_set_affinity(d, affinity, true) == IRQ_SET_MASK_OK && ret)
|
else if (c->irq_set_affinity(d, affinity, false) == IRQ_SET_MASK_OK && ret)
|
||||||
cpumask_copy(d->affinity, affinity);
|
cpumask_copy(d->affinity, affinity);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -24,6 +24,12 @@ u64 perf_reg_value(struct pt_regs *regs, int idx)
|
||||||
return regs->compat_lr;
|
return regs->compat_lr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((u32)idx == PERF_REG_ARM64_SP)
|
||||||
|
return regs->sp;
|
||||||
|
|
||||||
|
if ((u32)idx == PERF_REG_ARM64_PC)
|
||||||
|
return regs->pc;
|
||||||
|
|
||||||
return regs->regs[idx];
|
return regs->regs[idx];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -230,9 +230,27 @@ void exit_thread(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void tls_thread_flush(void)
|
||||||
|
{
|
||||||
|
asm ("msr tpidr_el0, xzr");
|
||||||
|
|
||||||
|
if (is_compat_task()) {
|
||||||
|
current->thread.tp_value = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We need to ensure ordering between the shadow state and the
|
||||||
|
* hardware state, so that we don't corrupt the hardware state
|
||||||
|
* with a stale shadow state during context switch.
|
||||||
|
*/
|
||||||
|
barrier();
|
||||||
|
asm ("msr tpidrro_el0, xzr");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void flush_thread(void)
|
void flush_thread(void)
|
||||||
{
|
{
|
||||||
fpsimd_flush_thread();
|
fpsimd_flush_thread();
|
||||||
|
tls_thread_flush();
|
||||||
flush_ptrace_hw_breakpoint(current);
|
flush_ptrace_hw_breakpoint(current);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -87,7 +87,8 @@ static void ptrace_hbptriggered(struct perf_event *bp,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (i = ARM_MAX_BRP; i < ARM_MAX_HBP_SLOTS && !bp; ++i) {
|
|
||||||
|
for (i = 0; i < ARM_MAX_WRP; ++i) {
|
||||||
if (current->thread.debug.hbp_watch[i] == bp) {
|
if (current->thread.debug.hbp_watch[i] == bp) {
|
||||||
info.si_errno = -((i << 1) + 1);
|
info.si_errno = -((i << 1) + 1);
|
||||||
break;
|
break;
|
||||||
|
@ -662,8 +663,10 @@ static int compat_gpr_get(struct task_struct *target,
|
||||||
kbuf += sizeof(reg);
|
kbuf += sizeof(reg);
|
||||||
} else {
|
} else {
|
||||||
ret = copy_to_user(ubuf, ®, sizeof(reg));
|
ret = copy_to_user(ubuf, ®, sizeof(reg));
|
||||||
if (ret)
|
if (ret) {
|
||||||
|
ret = -EFAULT;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
ubuf += sizeof(reg);
|
ubuf += sizeof(reg);
|
||||||
}
|
}
|
||||||
|
@ -701,8 +704,10 @@ static int compat_gpr_set(struct task_struct *target,
|
||||||
kbuf += sizeof(reg);
|
kbuf += sizeof(reg);
|
||||||
} else {
|
} else {
|
||||||
ret = copy_from_user(®, ubuf, sizeof(reg));
|
ret = copy_from_user(®, ubuf, sizeof(reg));
|
||||||
if (ret)
|
if (ret) {
|
||||||
return ret;
|
ret = -EFAULT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
ubuf += sizeof(reg);
|
ubuf += sizeof(reg);
|
||||||
}
|
}
|
||||||
|
|
|
@ -78,6 +78,7 @@ unsigned int compat_elf_hwcap2 __read_mostly;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static const char *cpu_name;
|
static const char *cpu_name;
|
||||||
|
static const char *machine_name;
|
||||||
phys_addr_t __fdt_pointer __initdata;
|
phys_addr_t __fdt_pointer __initdata;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -309,6 +310,8 @@ static void __init setup_machine_fdt(phys_addr_t dt_phys)
|
||||||
while (true)
|
while (true)
|
||||||
cpu_relax();
|
cpu_relax();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
machine_name = of_flat_dt_get_machine_name();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -447,21 +450,10 @@ static int c_show(struct seq_file *m, void *v)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/*
|
seq_printf(m, "Processor\t: %s rev %d (%s)\n",
|
||||||
* Dump out the common processor features in a single line. Userspace
|
cpu_name, read_cpuid_id() & 15, ELF_PLATFORM);
|
||||||
* should read the hwcaps with getauxval(AT_HWCAP) rather than
|
|
||||||
* attempting to parse this.
|
|
||||||
*/
|
|
||||||
seq_puts(m, "features\t:");
|
|
||||||
for (i = 0; hwcap_str[i]; i++)
|
|
||||||
if (elf_hwcap & (1 << i))
|
|
||||||
seq_printf(m, " %s", hwcap_str[i]);
|
|
||||||
seq_puts(m, "\n\n");
|
|
||||||
|
|
||||||
for_each_online_cpu(i) {
|
for_each_online_cpu(i) {
|
||||||
struct cpuinfo_arm64 *cpuinfo = &per_cpu(cpu_data, i);
|
|
||||||
u32 midr = cpuinfo->reg_midr;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* glibc reads /proc/cpuinfo to determine the number of
|
* glibc reads /proc/cpuinfo to determine the number of
|
||||||
* online processors, looking for lines beginning with
|
* online processors, looking for lines beginning with
|
||||||
|
@ -470,13 +462,25 @@ static int c_show(struct seq_file *m, void *v)
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
seq_printf(m, "processor\t: %d\n", i);
|
seq_printf(m, "processor\t: %d\n", i);
|
||||||
#endif
|
#endif
|
||||||
seq_printf(m, "implementer\t: 0x%02x\n",
|
|
||||||
MIDR_IMPLEMENTOR(midr));
|
|
||||||
seq_printf(m, "variant\t\t: 0x%x\n", MIDR_VARIANT(midr));
|
|
||||||
seq_printf(m, "partnum\t\t: 0x%03x\n", MIDR_PARTNUM(midr));
|
|
||||||
seq_printf(m, "revision\t: 0x%x\n\n", MIDR_REVISION(midr));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* dump out the processor features */
|
||||||
|
seq_puts(m, "Features\t: ");
|
||||||
|
|
||||||
|
for (i = 0; hwcap_str[i]; i++)
|
||||||
|
if (elf_hwcap & (1 << i))
|
||||||
|
seq_printf(m, "%s ", hwcap_str[i]);
|
||||||
|
|
||||||
|
seq_printf(m, "\nCPU implementer\t: 0x%02x\n", read_cpuid_id() >> 24);
|
||||||
|
seq_printf(m, "CPU architecture: AArch64\n");
|
||||||
|
seq_printf(m, "CPU variant\t: 0x%x\n", (read_cpuid_id() >> 20) & 15);
|
||||||
|
seq_printf(m, "CPU part\t: 0x%03x\n", (read_cpuid_id() >> 4) & 0xfff);
|
||||||
|
seq_printf(m, "CPU revision\t: %d\n", read_cpuid_id() & 15);
|
||||||
|
|
||||||
|
seq_puts(m, "\n");
|
||||||
|
|
||||||
|
seq_printf(m, "Hardware\t: %s\n", machine_name);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -79,6 +79,12 @@ long compat_arm_syscall(struct pt_regs *regs)
|
||||||
|
|
||||||
case __ARM_NR_compat_set_tls:
|
case __ARM_NR_compat_set_tls:
|
||||||
current->thread.tp_value = regs->regs[0];
|
current->thread.tp_value = regs->regs[0];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Protect against register corruption from context switch.
|
||||||
|
* See comment in tls_thread_flush.
|
||||||
|
*/
|
||||||
|
barrier();
|
||||||
asm ("msr tpidrro_el0, %0" : : "r" (regs->regs[0]));
|
asm ("msr tpidrro_el0, %0" : : "r" (regs->regs[0]));
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
|
@ -66,6 +66,8 @@ static int kvm_handle_wfx(struct kvm_vcpu *vcpu, struct kvm_run *run)
|
||||||
else
|
else
|
||||||
kvm_vcpu_block(vcpu);
|
kvm_vcpu_block(vcpu);
|
||||||
|
|
||||||
|
kvm_skip_instr(vcpu, kvm_vcpu_trap_il_is32bit(vcpu));
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -80,6 +80,10 @@ __do_hyp_init:
|
||||||
msr mair_el2, x4
|
msr mair_el2, x4
|
||||||
isb
|
isb
|
||||||
|
|
||||||
|
/* Invalidate the stale TLBs from Bootloader */
|
||||||
|
tlbi alle2
|
||||||
|
dsb sy
|
||||||
|
|
||||||
mrs x4, sctlr_el2
|
mrs x4, sctlr_el2
|
||||||
and x4, x4, #SCTLR_EL2_EE // preserve endianness of EL2
|
and x4, x4, #SCTLR_EL2_EE // preserve endianness of EL2
|
||||||
ldr x5, =SCTLR_EL2_FLAGS
|
ldr x5, =SCTLR_EL2_FLAGS
|
||||||
|
|
|
@ -149,8 +149,7 @@ void __init arm64_memblock_init(void)
|
||||||
memblock_reserve(__virt_to_phys(initrd_start), initrd_end - initrd_start);
|
memblock_reserve(__virt_to_phys(initrd_start), initrd_end - initrd_start);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!efi_enabled(EFI_MEMMAP))
|
early_init_fdt_scan_reserved_mem();
|
||||||
early_init_fdt_scan_reserved_mem();
|
|
||||||
|
|
||||||
/* 4GB maximum for 32-bit only capable devices */
|
/* 4GB maximum for 32-bit only capable devices */
|
||||||
if (IS_ENABLED(CONFIG_ZONE_DMA))
|
if (IS_ENABLED(CONFIG_ZONE_DMA))
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
CONFIG_EXPERIMENTAL=y
|
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_POSIX_MQUEUE=y
|
CONFIG_POSIX_MQUEUE=y
|
||||||
CONFIG_LOG_BUF_SHIFT=16
|
CONFIG_LOG_BUF_SHIFT=16
|
||||||
|
@ -6,6 +5,8 @@ CONFIG_PROFILING=y
|
||||||
CONFIG_OPROFILE=y
|
CONFIG_OPROFILE=y
|
||||||
CONFIG_MODULES=y
|
CONFIG_MODULES=y
|
||||||
CONFIG_MODULE_UNLOAD=y
|
CONFIG_MODULE_UNLOAD=y
|
||||||
|
CONFIG_PARTITION_ADVANCED=y
|
||||||
|
CONFIG_SGI_PARTITION=y
|
||||||
CONFIG_IA64_DIG=y
|
CONFIG_IA64_DIG=y
|
||||||
CONFIG_SMP=y
|
CONFIG_SMP=y
|
||||||
CONFIG_NR_CPUS=2
|
CONFIG_NR_CPUS=2
|
||||||
|
@ -51,9 +52,6 @@ CONFIG_DM_MIRROR=m
|
||||||
CONFIG_DM_ZERO=m
|
CONFIG_DM_ZERO=m
|
||||||
CONFIG_NETDEVICES=y
|
CONFIG_NETDEVICES=y
|
||||||
CONFIG_DUMMY=y
|
CONFIG_DUMMY=y
|
||||||
CONFIG_NET_ETHERNET=y
|
|
||||||
CONFIG_MII=y
|
|
||||||
CONFIG_NET_PCI=y
|
|
||||||
CONFIG_INPUT_EVDEV=y
|
CONFIG_INPUT_EVDEV=y
|
||||||
CONFIG_SERIAL_8250=y
|
CONFIG_SERIAL_8250=y
|
||||||
CONFIG_SERIAL_8250_CONSOLE=y
|
CONFIG_SERIAL_8250_CONSOLE=y
|
||||||
|
@ -85,7 +83,6 @@ CONFIG_EXT3_FS=y
|
||||||
CONFIG_XFS_FS=y
|
CONFIG_XFS_FS=y
|
||||||
CONFIG_XFS_QUOTA=y
|
CONFIG_XFS_QUOTA=y
|
||||||
CONFIG_XFS_POSIX_ACL=y
|
CONFIG_XFS_POSIX_ACL=y
|
||||||
CONFIG_AUTOFS_FS=m
|
|
||||||
CONFIG_AUTOFS4_FS=m
|
CONFIG_AUTOFS4_FS=m
|
||||||
CONFIG_ISO9660_FS=m
|
CONFIG_ISO9660_FS=m
|
||||||
CONFIG_JOLIET=y
|
CONFIG_JOLIET=y
|
||||||
|
@ -95,17 +92,13 @@ CONFIG_PROC_KCORE=y
|
||||||
CONFIG_TMPFS=y
|
CONFIG_TMPFS=y
|
||||||
CONFIG_HUGETLBFS=y
|
CONFIG_HUGETLBFS=y
|
||||||
CONFIG_NFS_FS=m
|
CONFIG_NFS_FS=m
|
||||||
CONFIG_NFS_V3=y
|
CONFIG_NFS_V4=m
|
||||||
CONFIG_NFS_V4=y
|
|
||||||
CONFIG_NFSD=m
|
CONFIG_NFSD=m
|
||||||
CONFIG_NFSD_V4=y
|
CONFIG_NFSD_V4=y
|
||||||
CONFIG_CIFS=m
|
CONFIG_CIFS=m
|
||||||
CONFIG_CIFS_STATS=y
|
CONFIG_CIFS_STATS=y
|
||||||
CONFIG_CIFS_XATTR=y
|
CONFIG_CIFS_XATTR=y
|
||||||
CONFIG_CIFS_POSIX=y
|
CONFIG_CIFS_POSIX=y
|
||||||
CONFIG_PARTITION_ADVANCED=y
|
|
||||||
CONFIG_SGI_PARTITION=y
|
|
||||||
CONFIG_EFI_PARTITION=y
|
|
||||||
CONFIG_NLS_CODEPAGE_437=y
|
CONFIG_NLS_CODEPAGE_437=y
|
||||||
CONFIG_NLS_ISO8859_1=y
|
CONFIG_NLS_ISO8859_1=y
|
||||||
CONFIG_NLS_UTF8=m
|
CONFIG_NLS_UTF8=m
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
CONFIG_EXPERIMENTAL=y
|
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_POSIX_MQUEUE=y
|
CONFIG_POSIX_MQUEUE=y
|
||||||
CONFIG_IKCONFIG=y
|
CONFIG_IKCONFIG=y
|
||||||
|
@ -6,13 +5,13 @@ CONFIG_IKCONFIG_PROC=y
|
||||||
CONFIG_LOG_BUF_SHIFT=20
|
CONFIG_LOG_BUF_SHIFT=20
|
||||||
CONFIG_CGROUPS=y
|
CONFIG_CGROUPS=y
|
||||||
CONFIG_CPUSETS=y
|
CONFIG_CPUSETS=y
|
||||||
CONFIG_SYSFS_DEPRECATED_V2=y
|
|
||||||
CONFIG_BLK_DEV_INITRD=y
|
CONFIG_BLK_DEV_INITRD=y
|
||||||
CONFIG_KALLSYMS_ALL=y
|
CONFIG_KALLSYMS_ALL=y
|
||||||
CONFIG_MODULES=y
|
CONFIG_MODULES=y
|
||||||
CONFIG_MODULE_UNLOAD=y
|
CONFIG_MODULE_UNLOAD=y
|
||||||
CONFIG_MODVERSIONS=y
|
CONFIG_MODVERSIONS=y
|
||||||
# CONFIG_BLK_DEV_BSG is not set
|
CONFIG_PARTITION_ADVANCED=y
|
||||||
|
CONFIG_SGI_PARTITION=y
|
||||||
CONFIG_MCKINLEY=y
|
CONFIG_MCKINLEY=y
|
||||||
CONFIG_IA64_PAGE_SIZE_64KB=y
|
CONFIG_IA64_PAGE_SIZE_64KB=y
|
||||||
CONFIG_IA64_CYCLONE=y
|
CONFIG_IA64_CYCLONE=y
|
||||||
|
@ -29,14 +28,13 @@ CONFIG_ACPI_BUTTON=m
|
||||||
CONFIG_ACPI_FAN=m
|
CONFIG_ACPI_FAN=m
|
||||||
CONFIG_ACPI_DOCK=y
|
CONFIG_ACPI_DOCK=y
|
||||||
CONFIG_ACPI_PROCESSOR=m
|
CONFIG_ACPI_PROCESSOR=m
|
||||||
CONFIG_ACPI_CONTAINER=y
|
|
||||||
CONFIG_HOTPLUG_PCI=y
|
CONFIG_HOTPLUG_PCI=y
|
||||||
CONFIG_HOTPLUG_PCI_ACPI=y
|
CONFIG_HOTPLUG_PCI_ACPI=y
|
||||||
|
CONFIG_NET=y
|
||||||
CONFIG_PACKET=y
|
CONFIG_PACKET=y
|
||||||
CONFIG_UNIX=y
|
CONFIG_UNIX=y
|
||||||
CONFIG_INET=y
|
CONFIG_INET=y
|
||||||
CONFIG_IP_MULTICAST=y
|
CONFIG_IP_MULTICAST=y
|
||||||
CONFIG_ARPD=y
|
|
||||||
CONFIG_SYN_COOKIES=y
|
CONFIG_SYN_COOKIES=y
|
||||||
# CONFIG_IPV6 is not set
|
# CONFIG_IPV6 is not set
|
||||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||||
|
@ -82,16 +80,13 @@ CONFIG_FUSION_FC=m
|
||||||
CONFIG_FUSION_SAS=y
|
CONFIG_FUSION_SAS=y
|
||||||
CONFIG_NETDEVICES=y
|
CONFIG_NETDEVICES=y
|
||||||
CONFIG_DUMMY=m
|
CONFIG_DUMMY=m
|
||||||
CONFIG_NET_ETHERNET=y
|
CONFIG_NETCONSOLE=y
|
||||||
|
CONFIG_TIGON3=y
|
||||||
CONFIG_NET_TULIP=y
|
CONFIG_NET_TULIP=y
|
||||||
CONFIG_TULIP=m
|
CONFIG_TULIP=m
|
||||||
CONFIG_NET_PCI=y
|
|
||||||
CONFIG_NET_VENDOR_INTEL=y
|
|
||||||
CONFIG_E100=m
|
CONFIG_E100=m
|
||||||
CONFIG_E1000=y
|
CONFIG_E1000=y
|
||||||
CONFIG_IGB=y
|
CONFIG_IGB=y
|
||||||
CONFIG_TIGON3=y
|
|
||||||
CONFIG_NETCONSOLE=y
|
|
||||||
# CONFIG_SERIO_SERPORT is not set
|
# CONFIG_SERIO_SERPORT is not set
|
||||||
CONFIG_GAMEPORT=m
|
CONFIG_GAMEPORT=m
|
||||||
CONFIG_SERIAL_NONSTANDARD=y
|
CONFIG_SERIAL_NONSTANDARD=y
|
||||||
|
@ -151,6 +146,7 @@ CONFIG_USB_STORAGE=m
|
||||||
CONFIG_INFINIBAND=m
|
CONFIG_INFINIBAND=m
|
||||||
CONFIG_INFINIBAND_MTHCA=m
|
CONFIG_INFINIBAND_MTHCA=m
|
||||||
CONFIG_INFINIBAND_IPOIB=m
|
CONFIG_INFINIBAND_IPOIB=m
|
||||||
|
CONFIG_INTEL_IOMMU=y
|
||||||
CONFIG_MSPEC=m
|
CONFIG_MSPEC=m
|
||||||
CONFIG_EXT2_FS=y
|
CONFIG_EXT2_FS=y
|
||||||
CONFIG_EXT2_FS_XATTR=y
|
CONFIG_EXT2_FS_XATTR=y
|
||||||
|
@ -164,7 +160,6 @@ CONFIG_REISERFS_FS_XATTR=y
|
||||||
CONFIG_REISERFS_FS_POSIX_ACL=y
|
CONFIG_REISERFS_FS_POSIX_ACL=y
|
||||||
CONFIG_REISERFS_FS_SECURITY=y
|
CONFIG_REISERFS_FS_SECURITY=y
|
||||||
CONFIG_XFS_FS=y
|
CONFIG_XFS_FS=y
|
||||||
CONFIG_AUTOFS_FS=m
|
|
||||||
CONFIG_AUTOFS4_FS=m
|
CONFIG_AUTOFS4_FS=m
|
||||||
CONFIG_ISO9660_FS=m
|
CONFIG_ISO9660_FS=m
|
||||||
CONFIG_JOLIET=y
|
CONFIG_JOLIET=y
|
||||||
|
@ -175,16 +170,10 @@ CONFIG_PROC_KCORE=y
|
||||||
CONFIG_TMPFS=y
|
CONFIG_TMPFS=y
|
||||||
CONFIG_HUGETLBFS=y
|
CONFIG_HUGETLBFS=y
|
||||||
CONFIG_NFS_FS=m
|
CONFIG_NFS_FS=m
|
||||||
CONFIG_NFS_V3=y
|
CONFIG_NFS_V4=m
|
||||||
CONFIG_NFS_V4=y
|
|
||||||
CONFIG_NFSD=m
|
CONFIG_NFSD=m
|
||||||
CONFIG_NFSD_V4=y
|
CONFIG_NFSD_V4=y
|
||||||
CONFIG_SMB_FS=m
|
|
||||||
CONFIG_SMB_NLS_DEFAULT=y
|
|
||||||
CONFIG_CIFS=m
|
CONFIG_CIFS=m
|
||||||
CONFIG_PARTITION_ADVANCED=y
|
|
||||||
CONFIG_SGI_PARTITION=y
|
|
||||||
CONFIG_EFI_PARTITION=y
|
|
||||||
CONFIG_NLS_CODEPAGE_437=y
|
CONFIG_NLS_CODEPAGE_437=y
|
||||||
CONFIG_NLS_CODEPAGE_737=m
|
CONFIG_NLS_CODEPAGE_737=m
|
||||||
CONFIG_NLS_CODEPAGE_775=m
|
CONFIG_NLS_CODEPAGE_775=m
|
||||||
|
@ -225,11 +214,7 @@ CONFIG_NLS_UTF8=m
|
||||||
CONFIG_MAGIC_SYSRQ=y
|
CONFIG_MAGIC_SYSRQ=y
|
||||||
CONFIG_DEBUG_KERNEL=y
|
CONFIG_DEBUG_KERNEL=y
|
||||||
CONFIG_DEBUG_MUTEXES=y
|
CONFIG_DEBUG_MUTEXES=y
|
||||||
# CONFIG_RCU_CPU_STALL_DETECTOR is not set
|
|
||||||
CONFIG_SYSCTL_SYSCALL_CHECK=y
|
|
||||||
CONFIG_CRYPTO_ECB=m
|
|
||||||
CONFIG_CRYPTO_PCBC=m
|
CONFIG_CRYPTO_PCBC=m
|
||||||
CONFIG_CRYPTO_MD5=y
|
CONFIG_CRYPTO_MD5=y
|
||||||
# CONFIG_CRYPTO_ANSI_CPRNG is not set
|
# CONFIG_CRYPTO_ANSI_CPRNG is not set
|
||||||
CONFIG_CRC_T10DIF=y
|
CONFIG_CRC_T10DIF=y
|
||||||
CONFIG_INTEL_IOMMU=y
|
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
CONFIG_EXPERIMENTAL=y
|
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_POSIX_MQUEUE=y
|
CONFIG_POSIX_MQUEUE=y
|
||||||
CONFIG_IKCONFIG=y
|
CONFIG_IKCONFIG=y
|
||||||
|
@ -9,6 +8,8 @@ CONFIG_KALLSYMS_ALL=y
|
||||||
CONFIG_MODULES=y
|
CONFIG_MODULES=y
|
||||||
CONFIG_MODULE_UNLOAD=y
|
CONFIG_MODULE_UNLOAD=y
|
||||||
CONFIG_MODVERSIONS=y
|
CONFIG_MODVERSIONS=y
|
||||||
|
CONFIG_PARTITION_ADVANCED=y
|
||||||
|
CONFIG_SGI_PARTITION=y
|
||||||
CONFIG_MCKINLEY=y
|
CONFIG_MCKINLEY=y
|
||||||
CONFIG_IA64_CYCLONE=y
|
CONFIG_IA64_CYCLONE=y
|
||||||
CONFIG_SMP=y
|
CONFIG_SMP=y
|
||||||
|
@ -24,14 +25,12 @@ CONFIG_BINFMT_MISC=m
|
||||||
CONFIG_ACPI_BUTTON=m
|
CONFIG_ACPI_BUTTON=m
|
||||||
CONFIG_ACPI_FAN=m
|
CONFIG_ACPI_FAN=m
|
||||||
CONFIG_ACPI_PROCESSOR=m
|
CONFIG_ACPI_PROCESSOR=m
|
||||||
CONFIG_ACPI_CONTAINER=m
|
|
||||||
CONFIG_HOTPLUG_PCI=y
|
CONFIG_HOTPLUG_PCI=y
|
||||||
CONFIG_HOTPLUG_PCI_ACPI=m
|
CONFIG_NET=y
|
||||||
CONFIG_PACKET=y
|
CONFIG_PACKET=y
|
||||||
CONFIG_UNIX=y
|
CONFIG_UNIX=y
|
||||||
CONFIG_INET=y
|
CONFIG_INET=y
|
||||||
CONFIG_IP_MULTICAST=y
|
CONFIG_IP_MULTICAST=y
|
||||||
CONFIG_ARPD=y
|
|
||||||
CONFIG_SYN_COOKIES=y
|
CONFIG_SYN_COOKIES=y
|
||||||
# CONFIG_IPV6 is not set
|
# CONFIG_IPV6 is not set
|
||||||
CONFIG_BLK_DEV_LOOP=m
|
CONFIG_BLK_DEV_LOOP=m
|
||||||
|
@ -71,15 +70,12 @@ CONFIG_FUSION_SPI=y
|
||||||
CONFIG_FUSION_FC=m
|
CONFIG_FUSION_FC=m
|
||||||
CONFIG_NETDEVICES=y
|
CONFIG_NETDEVICES=y
|
||||||
CONFIG_DUMMY=m
|
CONFIG_DUMMY=m
|
||||||
CONFIG_NET_ETHERNET=y
|
CONFIG_NETCONSOLE=y
|
||||||
|
CONFIG_TIGON3=y
|
||||||
CONFIG_NET_TULIP=y
|
CONFIG_NET_TULIP=y
|
||||||
CONFIG_TULIP=m
|
CONFIG_TULIP=m
|
||||||
CONFIG_NET_PCI=y
|
|
||||||
CONFIG_NET_VENDOR_INTEL=y
|
|
||||||
CONFIG_E100=m
|
CONFIG_E100=m
|
||||||
CONFIG_E1000=y
|
CONFIG_E1000=y
|
||||||
CONFIG_TIGON3=y
|
|
||||||
CONFIG_NETCONSOLE=y
|
|
||||||
# CONFIG_SERIO_SERPORT is not set
|
# CONFIG_SERIO_SERPORT is not set
|
||||||
CONFIG_GAMEPORT=m
|
CONFIG_GAMEPORT=m
|
||||||
CONFIG_SERIAL_NONSTANDARD=y
|
CONFIG_SERIAL_NONSTANDARD=y
|
||||||
|
@ -146,7 +142,6 @@ CONFIG_REISERFS_FS_XATTR=y
|
||||||
CONFIG_REISERFS_FS_POSIX_ACL=y
|
CONFIG_REISERFS_FS_POSIX_ACL=y
|
||||||
CONFIG_REISERFS_FS_SECURITY=y
|
CONFIG_REISERFS_FS_SECURITY=y
|
||||||
CONFIG_XFS_FS=y
|
CONFIG_XFS_FS=y
|
||||||
CONFIG_AUTOFS_FS=y
|
|
||||||
CONFIG_AUTOFS4_FS=y
|
CONFIG_AUTOFS4_FS=y
|
||||||
CONFIG_ISO9660_FS=m
|
CONFIG_ISO9660_FS=m
|
||||||
CONFIG_JOLIET=y
|
CONFIG_JOLIET=y
|
||||||
|
@ -157,16 +152,10 @@ CONFIG_PROC_KCORE=y
|
||||||
CONFIG_TMPFS=y
|
CONFIG_TMPFS=y
|
||||||
CONFIG_HUGETLBFS=y
|
CONFIG_HUGETLBFS=y
|
||||||
CONFIG_NFS_FS=m
|
CONFIG_NFS_FS=m
|
||||||
CONFIG_NFS_V3=y
|
CONFIG_NFS_V4=m
|
||||||
CONFIG_NFS_V4=y
|
|
||||||
CONFIG_NFSD=m
|
CONFIG_NFSD=m
|
||||||
CONFIG_NFSD_V4=y
|
CONFIG_NFSD_V4=y
|
||||||
CONFIG_SMB_FS=m
|
|
||||||
CONFIG_SMB_NLS_DEFAULT=y
|
|
||||||
CONFIG_CIFS=m
|
CONFIG_CIFS=m
|
||||||
CONFIG_PARTITION_ADVANCED=y
|
|
||||||
CONFIG_SGI_PARTITION=y
|
|
||||||
CONFIG_EFI_PARTITION=y
|
|
||||||
CONFIG_NLS_CODEPAGE_437=y
|
CONFIG_NLS_CODEPAGE_437=y
|
||||||
CONFIG_NLS_CODEPAGE_737=m
|
CONFIG_NLS_CODEPAGE_737=m
|
||||||
CONFIG_NLS_CODEPAGE_775=m
|
CONFIG_NLS_CODEPAGE_775=m
|
||||||
|
|
|
@ -1,13 +1,12 @@
|
||||||
CONFIG_EXPERIMENTAL=y
|
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_IKCONFIG=y
|
CONFIG_IKCONFIG=y
|
||||||
CONFIG_IKCONFIG_PROC=y
|
CONFIG_IKCONFIG_PROC=y
|
||||||
CONFIG_LOG_BUF_SHIFT=16
|
CONFIG_LOG_BUF_SHIFT=16
|
||||||
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
|
|
||||||
CONFIG_MODULES=y
|
CONFIG_MODULES=y
|
||||||
CONFIG_MODULE_UNLOAD=y
|
CONFIG_MODULE_UNLOAD=y
|
||||||
CONFIG_MODULE_FORCE_UNLOAD=y
|
CONFIG_MODULE_FORCE_UNLOAD=y
|
||||||
CONFIG_MODVERSIONS=y
|
CONFIG_MODVERSIONS=y
|
||||||
|
CONFIG_PARTITION_ADVANCED=y
|
||||||
CONFIG_IA64_HP_SIM=y
|
CONFIG_IA64_HP_SIM=y
|
||||||
CONFIG_MCKINLEY=y
|
CONFIG_MCKINLEY=y
|
||||||
CONFIG_IA64_PAGE_SIZE_64KB=y
|
CONFIG_IA64_PAGE_SIZE_64KB=y
|
||||||
|
@ -27,7 +26,6 @@ CONFIG_BLK_DEV_LOOP=y
|
||||||
CONFIG_BLK_DEV_RAM=y
|
CONFIG_BLK_DEV_RAM=y
|
||||||
CONFIG_SCSI=y
|
CONFIG_SCSI=y
|
||||||
CONFIG_BLK_DEV_SD=y
|
CONFIG_BLK_DEV_SD=y
|
||||||
CONFIG_SCSI_MULTI_LUN=y
|
|
||||||
CONFIG_SCSI_CONSTANTS=y
|
CONFIG_SCSI_CONSTANTS=y
|
||||||
CONFIG_SCSI_LOGGING=y
|
CONFIG_SCSI_LOGGING=y
|
||||||
CONFIG_SCSI_SPI_ATTRS=y
|
CONFIG_SCSI_SPI_ATTRS=y
|
||||||
|
@ -49,8 +47,6 @@ CONFIG_HUGETLBFS=y
|
||||||
CONFIG_NFS_FS=y
|
CONFIG_NFS_FS=y
|
||||||
CONFIG_NFSD=y
|
CONFIG_NFSD=y
|
||||||
CONFIG_NFSD_V3=y
|
CONFIG_NFSD_V3=y
|
||||||
CONFIG_PARTITION_ADVANCED=y
|
CONFIG_DEBUG_INFO=y
|
||||||
CONFIG_EFI_PARTITION=y
|
|
||||||
CONFIG_DEBUG_KERNEL=y
|
CONFIG_DEBUG_KERNEL=y
|
||||||
CONFIG_DEBUG_MUTEXES=y
|
CONFIG_DEBUG_MUTEXES=y
|
||||||
CONFIG_DEBUG_INFO=y
|
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
CONFIG_EXPERIMENTAL=y
|
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_POSIX_MQUEUE=y
|
CONFIG_POSIX_MQUEUE=y
|
||||||
CONFIG_IKCONFIG=y
|
CONFIG_IKCONFIG=y
|
||||||
|
@ -11,6 +10,8 @@ CONFIG_MODULE_UNLOAD=y
|
||||||
CONFIG_MODVERSIONS=y
|
CONFIG_MODVERSIONS=y
|
||||||
CONFIG_MODULE_SRCVERSION_ALL=y
|
CONFIG_MODULE_SRCVERSION_ALL=y
|
||||||
# CONFIG_BLK_DEV_BSG is not set
|
# CONFIG_BLK_DEV_BSG is not set
|
||||||
|
CONFIG_PARTITION_ADVANCED=y
|
||||||
|
CONFIG_SGI_PARTITION=y
|
||||||
CONFIG_IA64_DIG=y
|
CONFIG_IA64_DIG=y
|
||||||
CONFIG_MCKINLEY=y
|
CONFIG_MCKINLEY=y
|
||||||
CONFIG_IA64_PAGE_SIZE_64KB=y
|
CONFIG_IA64_PAGE_SIZE_64KB=y
|
||||||
|
@ -29,14 +30,12 @@ CONFIG_BINFMT_MISC=m
|
||||||
CONFIG_ACPI_BUTTON=m
|
CONFIG_ACPI_BUTTON=m
|
||||||
CONFIG_ACPI_FAN=m
|
CONFIG_ACPI_FAN=m
|
||||||
CONFIG_ACPI_PROCESSOR=m
|
CONFIG_ACPI_PROCESSOR=m
|
||||||
CONFIG_ACPI_CONTAINER=m
|
|
||||||
CONFIG_HOTPLUG_PCI=y
|
CONFIG_HOTPLUG_PCI=y
|
||||||
CONFIG_HOTPLUG_PCI_ACPI=m
|
CONFIG_NET=y
|
||||||
CONFIG_PACKET=y
|
CONFIG_PACKET=y
|
||||||
CONFIG_UNIX=y
|
CONFIG_UNIX=y
|
||||||
CONFIG_INET=y
|
CONFIG_INET=y
|
||||||
CONFIG_IP_MULTICAST=y
|
CONFIG_IP_MULTICAST=y
|
||||||
CONFIG_ARPD=y
|
|
||||||
CONFIG_SYN_COOKIES=y
|
CONFIG_SYN_COOKIES=y
|
||||||
# CONFIG_IPV6 is not set
|
# CONFIG_IPV6 is not set
|
||||||
CONFIG_BLK_DEV_LOOP=m
|
CONFIG_BLK_DEV_LOOP=m
|
||||||
|
@ -53,6 +52,7 @@ CONFIG_BLK_DEV_SD=y
|
||||||
CONFIG_CHR_DEV_ST=m
|
CONFIG_CHR_DEV_ST=m
|
||||||
CONFIG_BLK_DEV_SR=m
|
CONFIG_BLK_DEV_SR=m
|
||||||
CONFIG_CHR_DEV_SG=m
|
CONFIG_CHR_DEV_SG=m
|
||||||
|
CONFIG_SCSI_FC_ATTRS=y
|
||||||
CONFIG_SCSI_SYM53C8XX_2=y
|
CONFIG_SCSI_SYM53C8XX_2=y
|
||||||
CONFIG_SCSI_QLOGIC_1280=y
|
CONFIG_SCSI_QLOGIC_1280=y
|
||||||
CONFIG_MD=y
|
CONFIG_MD=y
|
||||||
|
@ -72,15 +72,12 @@ CONFIG_FUSION_FC=y
|
||||||
CONFIG_FUSION_CTL=y
|
CONFIG_FUSION_CTL=y
|
||||||
CONFIG_NETDEVICES=y
|
CONFIG_NETDEVICES=y
|
||||||
CONFIG_DUMMY=m
|
CONFIG_DUMMY=m
|
||||||
CONFIG_NET_ETHERNET=y
|
CONFIG_NETCONSOLE=y
|
||||||
|
CONFIG_TIGON3=y
|
||||||
CONFIG_NET_TULIP=y
|
CONFIG_NET_TULIP=y
|
||||||
CONFIG_TULIP=m
|
CONFIG_TULIP=m
|
||||||
CONFIG_NET_PCI=y
|
|
||||||
CONFIG_NET_VENDOR_INTEL=y
|
|
||||||
CONFIG_E100=m
|
CONFIG_E100=m
|
||||||
CONFIG_E1000=y
|
CONFIG_E1000=y
|
||||||
CONFIG_TIGON3=y
|
|
||||||
CONFIG_NETCONSOLE=y
|
|
||||||
# CONFIG_SERIO_SERPORT is not set
|
# CONFIG_SERIO_SERPORT is not set
|
||||||
CONFIG_GAMEPORT=m
|
CONFIG_GAMEPORT=m
|
||||||
CONFIG_SERIAL_NONSTANDARD=y
|
CONFIG_SERIAL_NONSTANDARD=y
|
||||||
|
@ -118,7 +115,6 @@ CONFIG_REISERFS_FS_XATTR=y
|
||||||
CONFIG_REISERFS_FS_POSIX_ACL=y
|
CONFIG_REISERFS_FS_POSIX_ACL=y
|
||||||
CONFIG_REISERFS_FS_SECURITY=y
|
CONFIG_REISERFS_FS_SECURITY=y
|
||||||
CONFIG_XFS_FS=y
|
CONFIG_XFS_FS=y
|
||||||
CONFIG_AUTOFS_FS=y
|
|
||||||
CONFIG_AUTOFS4_FS=y
|
CONFIG_AUTOFS4_FS=y
|
||||||
CONFIG_ISO9660_FS=m
|
CONFIG_ISO9660_FS=m
|
||||||
CONFIG_JOLIET=y
|
CONFIG_JOLIET=y
|
||||||
|
@ -129,16 +125,10 @@ CONFIG_PROC_KCORE=y
|
||||||
CONFIG_TMPFS=y
|
CONFIG_TMPFS=y
|
||||||
CONFIG_HUGETLBFS=y
|
CONFIG_HUGETLBFS=y
|
||||||
CONFIG_NFS_FS=m
|
CONFIG_NFS_FS=m
|
||||||
CONFIG_NFS_V3=y
|
CONFIG_NFS_V4=m
|
||||||
CONFIG_NFS_V4=y
|
|
||||||
CONFIG_NFSD=m
|
CONFIG_NFSD=m
|
||||||
CONFIG_NFSD_V4=y
|
CONFIG_NFSD_V4=y
|
||||||
CONFIG_SMB_FS=m
|
|
||||||
CONFIG_SMB_NLS_DEFAULT=y
|
|
||||||
CONFIG_CIFS=m
|
CONFIG_CIFS=m
|
||||||
CONFIG_PARTITION_ADVANCED=y
|
|
||||||
CONFIG_SGI_PARTITION=y
|
|
||||||
CONFIG_EFI_PARTITION=y
|
|
||||||
CONFIG_NLS_CODEPAGE_437=y
|
CONFIG_NLS_CODEPAGE_437=y
|
||||||
CONFIG_NLS_CODEPAGE_737=m
|
CONFIG_NLS_CODEPAGE_737=m
|
||||||
CONFIG_NLS_CODEPAGE_775=m
|
CONFIG_NLS_CODEPAGE_775=m
|
||||||
|
@ -180,6 +170,5 @@ CONFIG_MAGIC_SYSRQ=y
|
||||||
CONFIG_DEBUG_KERNEL=y
|
CONFIG_DEBUG_KERNEL=y
|
||||||
CONFIG_DEBUG_MUTEXES=y
|
CONFIG_DEBUG_MUTEXES=y
|
||||||
CONFIG_IA64_GRANULE_16MB=y
|
CONFIG_IA64_GRANULE_16MB=y
|
||||||
CONFIG_CRYPTO_ECB=m
|
|
||||||
CONFIG_CRYPTO_PCBC=m
|
CONFIG_CRYPTO_PCBC=m
|
||||||
CONFIG_CRYPTO_MD5=y
|
CONFIG_CRYPTO_MD5=y
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
CONFIG_EXPERIMENTAL=y
|
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_BSD_PROCESS_ACCT=y
|
CONFIG_BSD_PROCESS_ACCT=y
|
||||||
CONFIG_BLK_DEV_INITRD=y
|
CONFIG_BLK_DEV_INITRD=y
|
||||||
CONFIG_KPROBES=y
|
CONFIG_KPROBES=y
|
||||||
CONFIG_MODULES=y
|
CONFIG_MODULES=y
|
||||||
|
CONFIG_PARTITION_ADVANCED=y
|
||||||
CONFIG_IA64_HP_ZX1=y
|
CONFIG_IA64_HP_ZX1=y
|
||||||
CONFIG_MCKINLEY=y
|
CONFIG_MCKINLEY=y
|
||||||
CONFIG_SMP=y
|
CONFIG_SMP=y
|
||||||
|
@ -18,6 +18,7 @@ CONFIG_EFI_VARS=y
|
||||||
CONFIG_BINFMT_MISC=y
|
CONFIG_BINFMT_MISC=y
|
||||||
CONFIG_HOTPLUG_PCI=y
|
CONFIG_HOTPLUG_PCI=y
|
||||||
CONFIG_HOTPLUG_PCI_ACPI=y
|
CONFIG_HOTPLUG_PCI_ACPI=y
|
||||||
|
CONFIG_NET=y
|
||||||
CONFIG_PACKET=y
|
CONFIG_PACKET=y
|
||||||
CONFIG_UNIX=y
|
CONFIG_UNIX=y
|
||||||
CONFIG_INET=y
|
CONFIG_INET=y
|
||||||
|
@ -37,9 +38,9 @@ CONFIG_CHR_DEV_OSST=y
|
||||||
CONFIG_BLK_DEV_SR=y
|
CONFIG_BLK_DEV_SR=y
|
||||||
CONFIG_BLK_DEV_SR_VENDOR=y
|
CONFIG_BLK_DEV_SR_VENDOR=y
|
||||||
CONFIG_CHR_DEV_SG=y
|
CONFIG_CHR_DEV_SG=y
|
||||||
CONFIG_SCSI_MULTI_LUN=y
|
|
||||||
CONFIG_SCSI_CONSTANTS=y
|
CONFIG_SCSI_CONSTANTS=y
|
||||||
CONFIG_SCSI_LOGGING=y
|
CONFIG_SCSI_LOGGING=y
|
||||||
|
CONFIG_SCSI_FC_ATTRS=y
|
||||||
CONFIG_SCSI_SYM53C8XX_2=y
|
CONFIG_SCSI_SYM53C8XX_2=y
|
||||||
CONFIG_SCSI_QLOGIC_1280=y
|
CONFIG_SCSI_QLOGIC_1280=y
|
||||||
CONFIG_FUSION=y
|
CONFIG_FUSION=y
|
||||||
|
@ -48,18 +49,15 @@ CONFIG_FUSION_FC=y
|
||||||
CONFIG_FUSION_CTL=m
|
CONFIG_FUSION_CTL=m
|
||||||
CONFIG_NETDEVICES=y
|
CONFIG_NETDEVICES=y
|
||||||
CONFIG_DUMMY=y
|
CONFIG_DUMMY=y
|
||||||
CONFIG_NET_ETHERNET=y
|
CONFIG_TIGON3=y
|
||||||
CONFIG_NET_TULIP=y
|
CONFIG_NET_TULIP=y
|
||||||
CONFIG_TULIP=y
|
CONFIG_TULIP=y
|
||||||
CONFIG_TULIP_MWI=y
|
CONFIG_TULIP_MWI=y
|
||||||
CONFIG_TULIP_MMIO=y
|
CONFIG_TULIP_MMIO=y
|
||||||
CONFIG_TULIP_NAPI=y
|
CONFIG_TULIP_NAPI=y
|
||||||
CONFIG_TULIP_NAPI_HW_MITIGATION=y
|
CONFIG_TULIP_NAPI_HW_MITIGATION=y
|
||||||
CONFIG_NET_PCI=y
|
|
||||||
CONFIG_NET_VENDOR_INTEL=y
|
|
||||||
CONFIG_E100=y
|
CONFIG_E100=y
|
||||||
CONFIG_E1000=y
|
CONFIG_E1000=y
|
||||||
CONFIG_TIGON3=y
|
|
||||||
CONFIG_INPUT_JOYDEV=y
|
CONFIG_INPUT_JOYDEV=y
|
||||||
CONFIG_INPUT_EVDEV=y
|
CONFIG_INPUT_EVDEV=y
|
||||||
# CONFIG_INPUT_KEYBOARD is not set
|
# CONFIG_INPUT_KEYBOARD is not set
|
||||||
|
@ -100,7 +98,6 @@ CONFIG_USB_STORAGE=y
|
||||||
CONFIG_EXT2_FS=y
|
CONFIG_EXT2_FS=y
|
||||||
CONFIG_EXT2_FS_XATTR=y
|
CONFIG_EXT2_FS_XATTR=y
|
||||||
CONFIG_EXT3_FS=y
|
CONFIG_EXT3_FS=y
|
||||||
CONFIG_AUTOFS_FS=y
|
|
||||||
CONFIG_ISO9660_FS=y
|
CONFIG_ISO9660_FS=y
|
||||||
CONFIG_JOLIET=y
|
CONFIG_JOLIET=y
|
||||||
CONFIG_UDF_FS=y
|
CONFIG_UDF_FS=y
|
||||||
|
@ -110,12 +107,9 @@ CONFIG_PROC_KCORE=y
|
||||||
CONFIG_TMPFS=y
|
CONFIG_TMPFS=y
|
||||||
CONFIG_HUGETLBFS=y
|
CONFIG_HUGETLBFS=y
|
||||||
CONFIG_NFS_FS=y
|
CONFIG_NFS_FS=y
|
||||||
CONFIG_NFS_V3=y
|
|
||||||
CONFIG_NFS_V4=y
|
CONFIG_NFS_V4=y
|
||||||
CONFIG_NFSD=y
|
CONFIG_NFSD=y
|
||||||
CONFIG_NFSD_V3=y
|
CONFIG_NFSD_V3=y
|
||||||
CONFIG_PARTITION_ADVANCED=y
|
|
||||||
CONFIG_EFI_PARTITION=y
|
|
||||||
CONFIG_NLS_CODEPAGE_437=y
|
CONFIG_NLS_CODEPAGE_437=y
|
||||||
CONFIG_NLS_CODEPAGE_737=y
|
CONFIG_NLS_CODEPAGE_737=y
|
||||||
CONFIG_NLS_CODEPAGE_775=y
|
CONFIG_NLS_CODEPAGE_775=y
|
||||||
|
|
|
@ -329,6 +329,6 @@
|
||||||
#define __NR_sched_getattr 1337
|
#define __NR_sched_getattr 1337
|
||||||
#define __NR_renameat2 1338
|
#define __NR_renameat2 1338
|
||||||
#define __NR_getrandom 1339
|
#define __NR_getrandom 1339
|
||||||
#define __NR_memfd_create 1339
|
#define __NR_memfd_create 1340
|
||||||
|
|
||||||
#endif /* _UAPI_ASM_IA64_UNISTD_H */
|
#endif /* _UAPI_ASM_IA64_UNISTD_H */
|
||||||
|
|
|
@ -38,27 +38,6 @@ static void pci_fixup_video(struct pci_dev *pdev)
|
||||||
return;
|
return;
|
||||||
/* Maybe, this machine supports legacy memory map. */
|
/* Maybe, this machine supports legacy memory map. */
|
||||||
|
|
||||||
if (!vga_default_device()) {
|
|
||||||
resource_size_t start, end;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
/* Does firmware framebuffer belong to us? */
|
|
||||||
for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
|
|
||||||
if (!(pci_resource_flags(pdev, i) & IORESOURCE_MEM))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
start = pci_resource_start(pdev, i);
|
|
||||||
end = pci_resource_end(pdev, i);
|
|
||||||
|
|
||||||
if (!start || !end)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (screen_info.lfb_base >= start &&
|
|
||||||
(screen_info.lfb_base + screen_info.lfb_size) < end)
|
|
||||||
vga_set_default_device(pdev);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Is VGA routed to us? */
|
/* Is VGA routed to us? */
|
||||||
bus = pdev->bus;
|
bus = pdev->bus;
|
||||||
while (bus) {
|
while (bus) {
|
||||||
|
@ -83,8 +62,7 @@ static void pci_fixup_video(struct pci_dev *pdev)
|
||||||
pci_read_config_word(pdev, PCI_COMMAND, &config);
|
pci_read_config_word(pdev, PCI_COMMAND, &config);
|
||||||
if (config & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) {
|
if (config & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) {
|
||||||
pdev->resource[PCI_ROM_RESOURCE].flags |= IORESOURCE_ROM_SHADOW;
|
pdev->resource[PCI_ROM_RESOURCE].flags |= IORESOURCE_ROM_SHADOW;
|
||||||
dev_printk(KERN_DEBUG, &pdev->dev, "Boot video device\n");
|
dev_printk(KERN_DEBUG, &pdev->dev, "Video device with shadowed ROM\n");
|
||||||
vga_set_default_device(pdev);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
#include <uapi/asm/unistd.h>
|
#include <uapi/asm/unistd.h>
|
||||||
|
|
||||||
|
|
||||||
#define NR_syscalls 352
|
#define NR_syscalls 354
|
||||||
|
|
||||||
#define __ARCH_WANT_OLD_READDIR
|
#define __ARCH_WANT_OLD_READDIR
|
||||||
#define __ARCH_WANT_OLD_STAT
|
#define __ARCH_WANT_OLD_STAT
|
||||||
|
|
|
@ -357,5 +357,7 @@
|
||||||
#define __NR_sched_setattr 349
|
#define __NR_sched_setattr 349
|
||||||
#define __NR_sched_getattr 350
|
#define __NR_sched_getattr 350
|
||||||
#define __NR_renameat2 351
|
#define __NR_renameat2 351
|
||||||
|
#define __NR_getrandom 352
|
||||||
|
#define __NR_memfd_create 353
|
||||||
|
|
||||||
#endif /* _UAPI_ASM_M68K_UNISTD_H_ */
|
#endif /* _UAPI_ASM_M68K_UNISTD_H_ */
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue