Merge remote-tracking branch 'airlied/drm-next' into drm-intel-next-queued
Backmerge drm-next to get at the hdmi2.0 helper functions. Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
This commit is contained in:
@@ -299,5 +299,5 @@ What: /sys/bus/pci/devices/.../revision
|
|||||||
Date: November 2016
|
Date: November 2016
|
||||||
Contact: Emil Velikov <emil.l.velikov@gmail.com>
|
Contact: Emil Velikov <emil.l.velikov@gmail.com>
|
||||||
Description:
|
Description:
|
||||||
This file contains the revision field of the the PCI device.
|
This file contains the revision field of the PCI device.
|
||||||
The value comes from device config space. The file is read only.
|
The value comes from device config space. The file is read only.
|
||||||
|
@@ -653,6 +653,9 @@
|
|||||||
cpuidle.off=1 [CPU_IDLE]
|
cpuidle.off=1 [CPU_IDLE]
|
||||||
disable the cpuidle sub-system
|
disable the cpuidle sub-system
|
||||||
|
|
||||||
|
cpufreq.off=1 [CPU_FREQ]
|
||||||
|
disable the cpufreq sub-system
|
||||||
|
|
||||||
cpu_init_udelay=N
|
cpu_init_udelay=N
|
||||||
[X86] Delay for N microsec between assert and de-assert
|
[X86] Delay for N microsec between assert and de-assert
|
||||||
of APIC INIT to start processors. This delay occurs
|
of APIC INIT to start processors. This delay occurs
|
||||||
@@ -1183,6 +1186,12 @@
|
|||||||
functions that can be changed at run time by the
|
functions that can be changed at run time by the
|
||||||
set_graph_notrace file in the debugfs tracing directory.
|
set_graph_notrace file in the debugfs tracing directory.
|
||||||
|
|
||||||
|
ftrace_graph_max_depth=<uint>
|
||||||
|
[FTRACE] Used with the function graph tracer. This is
|
||||||
|
the max depth it will trace into a function. This value
|
||||||
|
can be changed at run time by the max_graph_depth file
|
||||||
|
in the tracefs tracing directory. default: 0 (no limit)
|
||||||
|
|
||||||
gamecon.map[2|3]=
|
gamecon.map[2|3]=
|
||||||
[HW,JOY] Multisystem joystick and NES/SNES/PSX pad
|
[HW,JOY] Multisystem joystick and NES/SNES/PSX pad
|
||||||
support via parallel port (up to 5 devices per port)
|
support via parallel port (up to 5 devices per port)
|
||||||
|
@@ -14,14 +14,17 @@ Contact
|
|||||||
The Linux kernel security team can be contacted by email at
|
The Linux kernel security team can be contacted by email at
|
||||||
<security@kernel.org>. This is a private list of security officers
|
<security@kernel.org>. This is a private list of security officers
|
||||||
who will help verify the bug report and develop and release a fix.
|
who will help verify the bug report and develop and release a fix.
|
||||||
It is possible that the security team will bring in extra help from
|
If you already have a fix, please include it with your report, as
|
||||||
area maintainers to understand and fix the security vulnerability.
|
that can speed up the process considerably. It is possible that the
|
||||||
|
security team will bring in extra help from area maintainers to
|
||||||
|
understand and fix the security vulnerability.
|
||||||
|
|
||||||
As it is with any bug, the more information provided the easier it
|
As it is with any bug, the more information provided the easier it
|
||||||
will be to diagnose and fix. Please review the procedure outlined in
|
will be to diagnose and fix. Please review the procedure outlined in
|
||||||
admin-guide/reporting-bugs.rst if you are unclear about what information is helpful.
|
admin-guide/reporting-bugs.rst if you are unclear about what
|
||||||
Any exploit code is very helpful and will not be released without
|
information is helpful. Any exploit code is very helpful and will not
|
||||||
consent from the reporter unless it has already been made public.
|
be released without consent from the reporter unless it has already been
|
||||||
|
made public.
|
||||||
|
|
||||||
Disclosure
|
Disclosure
|
||||||
----------
|
----------
|
||||||
@@ -39,6 +42,32 @@ disclosure is from immediate (esp. if it's already publicly known)
|
|||||||
to a few weeks. As a basic default policy, we expect report date to
|
to a few weeks. As a basic default policy, we expect report date to
|
||||||
disclosure date to be on the order of 7 days.
|
disclosure date to be on the order of 7 days.
|
||||||
|
|
||||||
|
Coordination
|
||||||
|
------------
|
||||||
|
|
||||||
|
Fixes for sensitive bugs, such as those that might lead to privilege
|
||||||
|
escalations, may need to be coordinated with the private
|
||||||
|
<linux-distros@vs.openwall.org> mailing list so that distribution vendors
|
||||||
|
are well prepared to issue a fixed kernel upon public disclosure of the
|
||||||
|
upstream fix. Distros will need some time to test the proposed patch and
|
||||||
|
will generally request at least a few days of embargo, and vendor update
|
||||||
|
publication prefers to happen Tuesday through Thursday. When appropriate,
|
||||||
|
the security team can assist with this coordination, or the reporter can
|
||||||
|
include linux-distros from the start. In this case, remember to prefix
|
||||||
|
the email Subject line with "[vs]" as described in the linux-distros wiki:
|
||||||
|
<http://oss-security.openwall.org/wiki/mailing-lists/distros#how-to-use-the-lists>
|
||||||
|
|
||||||
|
CVE assignment
|
||||||
|
--------------
|
||||||
|
|
||||||
|
The security team does not normally assign CVEs, nor do we require them
|
||||||
|
for reports or fixes, as this can needlessly complicate the process and
|
||||||
|
may delay the bug handling. If a reporter wishes to have a CVE identifier
|
||||||
|
assigned ahead of public disclosure, they will need to contact the private
|
||||||
|
linux-distros list, described above. When such a CVE identifier is known
|
||||||
|
before a patch is provided, it is desirable to mention it in the commit
|
||||||
|
message, though.
|
||||||
|
|
||||||
Non-disclosure agreements
|
Non-disclosure agreements
|
||||||
-------------------------
|
-------------------------
|
||||||
|
|
||||||
|
@@ -68,3 +68,4 @@ stable kernels.
|
|||||||
| | | | |
|
| | | | |
|
||||||
| Qualcomm Tech. | Falkor v1 | E1003 | QCOM_FALKOR_ERRATUM_1003 |
|
| Qualcomm Tech. | Falkor v1 | E1003 | QCOM_FALKOR_ERRATUM_1003 |
|
||||||
| Qualcomm Tech. | Falkor v1 | E1009 | QCOM_FALKOR_ERRATUM_1009 |
|
| Qualcomm Tech. | Falkor v1 | E1009 | QCOM_FALKOR_ERRATUM_1009 |
|
||||||
|
| Qualcomm Tech. | QDF2400 ITS | E0065 | QCOM_QDF2400_ERRATUM_0065 |
|
||||||
|
@@ -1142,16 +1142,17 @@ used by the kernel.
|
|||||||
|
|
||||||
pids.max
|
pids.max
|
||||||
|
|
||||||
A read-write single value file which exists on non-root cgroups. The
|
A read-write single value file which exists on non-root
|
||||||
default is "max".
|
cgroups. The default is "max".
|
||||||
|
|
||||||
Hard limit of number of processes.
|
Hard limit of number of processes.
|
||||||
|
|
||||||
pids.current
|
pids.current
|
||||||
|
|
||||||
A read-only single value file which exists on all cgroups.
|
A read-only single value file which exists on all cgroups.
|
||||||
|
|
||||||
The number of processes currently in the cgroup and its descendants.
|
The number of processes currently in the cgroup and its
|
||||||
|
descendants.
|
||||||
|
|
||||||
Organisational operations are not blocked by cgroup policies, so it is
|
Organisational operations are not blocked by cgroup policies, so it is
|
||||||
possible to have pids.current > pids.max. This can be done by either
|
possible to have pids.current > pids.max. This can be done by either
|
||||||
|
@@ -34,7 +34,7 @@ from load_config import loadConfig
|
|||||||
# Add any Sphinx extension module names here, as strings. They can be
|
# Add any Sphinx extension module names here, as strings. They can be
|
||||||
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
|
||||||
# ones.
|
# ones.
|
||||||
extensions = ['kerneldoc', 'rstFlatTable', 'kernel_include', 'cdomain']
|
extensions = ['kerneldoc', 'rstFlatTable', 'kernel_include', 'cdomain', 'kfigure']
|
||||||
|
|
||||||
# The name of the math extension changed on Sphinx 1.4
|
# The name of the math extension changed on Sphinx 1.4
|
||||||
if major == 1 and minor > 3:
|
if major == 1 and minor > 3:
|
||||||
|
@@ -231,7 +231,7 @@ the reference implementation in drivers/cpufreq/longrun.c
|
|||||||
Only for drivers with target_index() and CPUFREQ_ASYNC_NOTIFICATION unset.
|
Only for drivers with target_index() and CPUFREQ_ASYNC_NOTIFICATION unset.
|
||||||
|
|
||||||
get_intermediate should return a stable intermediate frequency platform wants to
|
get_intermediate should return a stable intermediate frequency platform wants to
|
||||||
switch to, and target_intermediate() should set CPU to to that frequency, before
|
switch to, and target_intermediate() should set CPU to that frequency, before
|
||||||
jumping to the frequency corresponding to 'index'. Core will take care of
|
jumping to the frequency corresponding to 'index'. Core will take care of
|
||||||
sending notifications and driver doesn't have to handle them in
|
sending notifications and driver doesn't have to handle them in
|
||||||
target_intermediate() or target_index().
|
target_intermediate() or target_index().
|
||||||
|
@@ -10,7 +10,7 @@ Note that kcov does not aim to collect as much coverage as possible. It aims
|
|||||||
to collect more or less stable coverage that is function of syscall inputs.
|
to collect more or less stable coverage that is function of syscall inputs.
|
||||||
To achieve this goal it does not collect coverage in soft/hard interrupts
|
To achieve this goal it does not collect coverage in soft/hard interrupts
|
||||||
and instrumentation of some inherently non-deterministic parts of kernel is
|
and instrumentation of some inherently non-deterministic parts of kernel is
|
||||||
disbled (e.g. scheduler, locking).
|
disabled (e.g. scheduler, locking).
|
||||||
|
|
||||||
Usage
|
Usage
|
||||||
-----
|
-----
|
||||||
|
@@ -34,6 +34,9 @@ Optional properties for HDMI:
|
|||||||
- hpd-gpios: The GPIO pin for HDMI hotplug detect (if it doesn't appear
|
- hpd-gpios: The GPIO pin for HDMI hotplug detect (if it doesn't appear
|
||||||
as an interrupt/status bit in the HDMI controller
|
as an interrupt/status bit in the HDMI controller
|
||||||
itself). See bindings/pinctrl/brcm,bcm2835-gpio.txt
|
itself). See bindings/pinctrl/brcm,bcm2835-gpio.txt
|
||||||
|
- dmas: Should contain one entry pointing to the DMA channel used to
|
||||||
|
transfer audio data
|
||||||
|
- dma-names: Should contain "audio-rx"
|
||||||
|
|
||||||
Required properties for DPI:
|
Required properties for DPI:
|
||||||
- compatible: Should be "brcm,bcm2835-dpi"
|
- compatible: Should be "brcm,bcm2835-dpi"
|
||||||
|
@@ -0,0 +1,64 @@
|
|||||||
|
Parallel to LVDS Encoder
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
This binding supports the parallel to LVDS encoders that don't require any
|
||||||
|
configuration.
|
||||||
|
|
||||||
|
LVDS is a physical layer specification defined in ANSI/TIA/EIA-644-A. Multiple
|
||||||
|
incompatible data link layers have been used over time to transmit image data
|
||||||
|
to LVDS panels. This binding targets devices compatible with the following
|
||||||
|
specifications only.
|
||||||
|
|
||||||
|
[JEIDA] "Digital Interface Standards for Monitor", JEIDA-59-1999, February
|
||||||
|
1999 (Version 1.0), Japan Electronic Industry Development Association (JEIDA)
|
||||||
|
[LDI] "Open LVDS Display Interface", May 1999 (Version 0.95), National
|
||||||
|
Semiconductor
|
||||||
|
[VESA] "VESA Notebook Panel Standard", October 2007 (Version 1.0), Video
|
||||||
|
Electronics Standards Association (VESA)
|
||||||
|
|
||||||
|
Those devices have been marketed under the FPD-Link and FlatLink brand names
|
||||||
|
among others.
|
||||||
|
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
|
||||||
|
- compatible: Must be "lvds-encoder"
|
||||||
|
|
||||||
|
Required nodes:
|
||||||
|
|
||||||
|
This device has two video ports. Their connections are modeled using the OF
|
||||||
|
graph bindings specified in Documentation/devicetree/bindings/graph.txt.
|
||||||
|
|
||||||
|
- Video port 0 for parallel input
|
||||||
|
- Video port 1 for LVDS output
|
||||||
|
|
||||||
|
|
||||||
|
Example
|
||||||
|
-------
|
||||||
|
|
||||||
|
lvds-encoder {
|
||||||
|
compatible = "lvds-encoder";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
|
||||||
|
ports {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
|
||||||
|
port@0 {
|
||||||
|
reg = <0>;
|
||||||
|
|
||||||
|
lvds_enc_in: endpoint {
|
||||||
|
remote-endpoint = <&display_out_rgb>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
port@1 {
|
||||||
|
reg = <1>;
|
||||||
|
|
||||||
|
lvds_enc_out: endpoint {
|
||||||
|
remote-endpoint = <&lvds_panel_in>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
@@ -0,0 +1,94 @@
|
|||||||
|
Drivers for the second video output of the GE B850v3:
|
||||||
|
STDP4028-ge-b850v3-fw bridges (LVDS-DP)
|
||||||
|
STDP2690-ge-b850v3-fw bridges (DP-DP++)
|
||||||
|
|
||||||
|
The video processing pipeline on the second output on the GE B850v3:
|
||||||
|
|
||||||
|
Host -> LVDS|--(STDP4028)--|DP -> DP|--(STDP2690)--|DP++ -> Video output
|
||||||
|
|
||||||
|
Each bridge has a dedicated flash containing firmware for supporting the custom
|
||||||
|
design. The result is that, in this design, neither the STDP4028 nor the
|
||||||
|
STDP2690 behave as the stock bridges would. The compatible strings include the
|
||||||
|
suffix "-ge-b850v3-fw" to make it clear that the driver is for the bridges with
|
||||||
|
the firmware specific for the GE B850v3.
|
||||||
|
|
||||||
|
The hardware do not provide control over the video processing pipeline, as the
|
||||||
|
two bridges behaves as a single one. The only interfaces exposed by the
|
||||||
|
hardware are EDID, HPD, and interrupts.
|
||||||
|
|
||||||
|
stdp4028-ge-b850v3-fw required properties:
|
||||||
|
- compatible : "megachips,stdp4028-ge-b850v3-fw"
|
||||||
|
- reg : I2C bus address
|
||||||
|
- interrupt-parent : phandle of the interrupt controller that services
|
||||||
|
interrupts to the device
|
||||||
|
- interrupts : one interrupt should be described here, as in
|
||||||
|
<0 IRQ_TYPE_LEVEL_HIGH>
|
||||||
|
- ports : One input port(reg = <0>) and one output port(reg = <1>)
|
||||||
|
|
||||||
|
stdp2690-ge-b850v3-fw required properties:
|
||||||
|
compatible : "megachips,stdp2690-ge-b850v3-fw"
|
||||||
|
- reg : I2C bus address
|
||||||
|
- ports : One input port(reg = <0>) and one output port(reg = <1>)
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
&mux2_i2c2 {
|
||||||
|
status = "okay";
|
||||||
|
clock-frequency = <100000>;
|
||||||
|
|
||||||
|
stdp4028@73 {
|
||||||
|
compatible = "megachips,stdp4028-ge-b850v3-fw";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
|
||||||
|
reg = <0x73>;
|
||||||
|
|
||||||
|
interrupt-parent = <&gpio2>;
|
||||||
|
interrupts = <0 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
|
||||||
|
ports {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
|
||||||
|
port@0 {
|
||||||
|
reg = <0>;
|
||||||
|
stdp4028_in: endpoint {
|
||||||
|
remote-endpoint = <&lvds0_out>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
port@1 {
|
||||||
|
reg = <1>;
|
||||||
|
stdp4028_out: endpoint {
|
||||||
|
remote-endpoint = <&stdp2690_in>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
stdp2690@72 {
|
||||||
|
compatible = "megachips,stdp2690-ge-b850v3-fw";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
|
||||||
|
reg = <0x72>;
|
||||||
|
|
||||||
|
ports {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
|
||||||
|
port@0 {
|
||||||
|
reg = <0>;
|
||||||
|
stdp2690_in: endpoint {
|
||||||
|
remote-endpoint = <&stdp4028_out>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
port@1 {
|
||||||
|
reg = <1>;
|
||||||
|
stdp2690_out: endpoint {
|
||||||
|
/* Connector for external display */
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
@@ -21,13 +21,19 @@ Freescale i.MX IPUv3
|
|||||||
====================
|
====================
|
||||||
|
|
||||||
Required properties:
|
Required properties:
|
||||||
- compatible: Should be "fsl,<chip>-ipu"
|
- compatible: Should be "fsl,<chip>-ipu" where <chip> is one of
|
||||||
|
- imx51
|
||||||
|
- imx53
|
||||||
|
- imx6q
|
||||||
|
- imx6qp
|
||||||
- reg: should be register base and length as documented in the
|
- reg: should be register base and length as documented in the
|
||||||
datasheet
|
datasheet
|
||||||
- interrupts: Should contain sync interrupt and error interrupt,
|
- interrupts: Should contain sync interrupt and error interrupt,
|
||||||
in this order.
|
in this order.
|
||||||
- resets: phandle pointing to the system reset controller and
|
- resets: phandle pointing to the system reset controller and
|
||||||
reset line index, see reset/fsl,imx-src.txt for details
|
reset line index, see reset/fsl,imx-src.txt for details
|
||||||
|
Additional required properties for fsl,imx6qp-ipu:
|
||||||
|
- fsl,prg: phandle to prg node associated with this IPU instance
|
||||||
Optional properties:
|
Optional properties:
|
||||||
- port@[0-3]: Port nodes with endpoint definitions as defined in
|
- port@[0-3]: Port nodes with endpoint definitions as defined in
|
||||||
Documentation/devicetree/bindings/media/video-interfaces.txt.
|
Documentation/devicetree/bindings/media/video-interfaces.txt.
|
||||||
@@ -53,6 +59,57 @@ ipu: ipu@18000000 {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Freescale i.MX PRE (Prefetch Resolve Engine)
|
||||||
|
============================================
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
- compatible: should be "fsl,imx6qp-pre"
|
||||||
|
- reg: should be register base and length as documented in the
|
||||||
|
datasheet
|
||||||
|
- clocks : phandle to the PRE axi clock input, as described
|
||||||
|
in Documentation/devicetree/bindings/clock/clock-bindings.txt and
|
||||||
|
Documentation/devicetree/bindings/clock/imx6q-clock.txt.
|
||||||
|
- clock-names: should be "axi"
|
||||||
|
- interrupts: should contain the PRE interrupt
|
||||||
|
- fsl,iram: phandle pointing to the mmio-sram device node, that should be
|
||||||
|
used for the PRE SRAM double buffer.
|
||||||
|
|
||||||
|
example:
|
||||||
|
|
||||||
|
pre@21c8000 {
|
||||||
|
compatible = "fsl,imx6qp-pre";
|
||||||
|
reg = <0x021c8000 0x1000>;
|
||||||
|
interrupts = <GIC_SPI 90 IRQ_TYPE_EDGE_RISING>;
|
||||||
|
clocks = <&clks IMX6QDL_CLK_PRE0>;
|
||||||
|
clock-names = "axi";
|
||||||
|
fsl,iram = <&ocram2>;
|
||||||
|
};
|
||||||
|
|
||||||
|
Freescale i.MX PRG (Prefetch Resolve Gasket)
|
||||||
|
============================================
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
- compatible: should be "fsl,imx6qp-prg"
|
||||||
|
- reg: should be register base and length as documented in the
|
||||||
|
datasheet
|
||||||
|
- clocks : phandles to the PRG ipg and axi clock inputs, as described
|
||||||
|
in Documentation/devicetree/bindings/clock/clock-bindings.txt and
|
||||||
|
Documentation/devicetree/bindings/clock/imx6q-clock.txt.
|
||||||
|
- clock-names: should be "ipg" and "axi"
|
||||||
|
- fsl,pres: phandles to the PRE units attached to this PRG, with the fixed
|
||||||
|
PRE as the first entry and the muxable PREs following.
|
||||||
|
|
||||||
|
example:
|
||||||
|
|
||||||
|
prg@21cc000 {
|
||||||
|
compatible = "fsl,imx6qp-prg";
|
||||||
|
reg = <0x021cc000 0x1000>;
|
||||||
|
clocks = <&clks IMX6QDL_CLK_PRG0_APB>,
|
||||||
|
<&clks IMX6QDL_CLK_PRG0_AXI>;
|
||||||
|
clock-names = "ipg", "axi";
|
||||||
|
fsl,pres = <&pre1>, <&pre2>, <&pre3>;
|
||||||
|
};
|
||||||
|
|
||||||
Parallel display support
|
Parallel display support
|
||||||
========================
|
========================
|
||||||
|
|
||||||
|
@@ -71,6 +71,9 @@
|
|||||||
For Axon it can be absent, though my current driver
|
For Axon it can be absent, though my current driver
|
||||||
doesn't handle phy-address yet so for now, keep
|
doesn't handle phy-address yet so for now, keep
|
||||||
0x00ffffff in it.
|
0x00ffffff in it.
|
||||||
|
- phy-handle : Used to describe configurations where a external PHY
|
||||||
|
is used. Please refer to:
|
||||||
|
Documentation/devicetree/bindings/net/ethernet.txt
|
||||||
- rx-fifo-size-gige : 1 cell, Rx fifo size in bytes for 1000 Mb/sec
|
- rx-fifo-size-gige : 1 cell, Rx fifo size in bytes for 1000 Mb/sec
|
||||||
operations (if absent the value is the same as
|
operations (if absent the value is the same as
|
||||||
rx-fifo-size). For Axon, either absent or 2048.
|
rx-fifo-size). For Axon, either absent or 2048.
|
||||||
@@ -81,8 +84,22 @@
|
|||||||
offload, phandle of the TAH device node.
|
offload, phandle of the TAH device node.
|
||||||
- tah-channel : 1 cell, optional. If appropriate, channel used on the
|
- tah-channel : 1 cell, optional. If appropriate, channel used on the
|
||||||
TAH engine.
|
TAH engine.
|
||||||
|
- fixed-link : Fixed-link subnode describing a link to a non-MDIO
|
||||||
|
managed entity. See
|
||||||
|
Documentation/devicetree/bindings/net/fixed-link.txt
|
||||||
|
for details.
|
||||||
|
- mdio subnode : When the EMAC has a phy connected to its local
|
||||||
|
mdio, which us supported by the kernel's network
|
||||||
|
PHY library in drivers/net/phy, there must be device
|
||||||
|
tree subnode with the following required properties:
|
||||||
|
- #address-cells: Must be <1>.
|
||||||
|
- #size-cells: Must be <0>.
|
||||||
|
|
||||||
Example:
|
For PHY definitions: Please refer to
|
||||||
|
Documentation/devicetree/bindings/net/phy.txt and
|
||||||
|
Documentation/devicetree/bindings/net/ethernet.txt
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
EMAC0: ethernet@40000800 {
|
EMAC0: ethernet@40000800 {
|
||||||
device_type = "network";
|
device_type = "network";
|
||||||
@@ -104,6 +121,48 @@
|
|||||||
zmii-channel = <0>;
|
zmii-channel = <0>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
EMAC1: ethernet@ef600c00 {
|
||||||
|
device_type = "network";
|
||||||
|
compatible = "ibm,emac-apm821xx", "ibm,emac4sync";
|
||||||
|
interrupt-parent = <&EMAC1>;
|
||||||
|
interrupts = <0 1>;
|
||||||
|
#interrupt-cells = <1>;
|
||||||
|
#address-cells = <0>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
interrupt-map = <0 &UIC2 0x10 IRQ_TYPE_LEVEL_HIGH /* Status */
|
||||||
|
1 &UIC2 0x14 IRQ_TYPE_LEVEL_HIGH /* Wake */>;
|
||||||
|
reg = <0xef600c00 0x000000c4>;
|
||||||
|
local-mac-address = [000000000000]; /* Filled in by U-Boot */
|
||||||
|
mal-device = <&MAL0>;
|
||||||
|
mal-tx-channel = <0>;
|
||||||
|
mal-rx-channel = <0>;
|
||||||
|
cell-index = <0>;
|
||||||
|
max-frame-size = <9000>;
|
||||||
|
rx-fifo-size = <16384>;
|
||||||
|
tx-fifo-size = <2048>;
|
||||||
|
fifo-entry-size = <10>;
|
||||||
|
phy-mode = "rgmii";
|
||||||
|
phy-handle = <&phy0>;
|
||||||
|
phy-map = <0x00000000>;
|
||||||
|
rgmii-device = <&RGMII0>;
|
||||||
|
rgmii-channel = <0>;
|
||||||
|
tah-device = <&TAH0>;
|
||||||
|
tah-channel = <0>;
|
||||||
|
has-inverted-stacr-oc;
|
||||||
|
has-new-stacr-staopc;
|
||||||
|
|
||||||
|
mdio {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
|
||||||
|
phy0: ethernet-phy@0 {
|
||||||
|
compatible = "ethernet-phy-ieee802.3-c22";
|
||||||
|
reg = <0>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
ii) McMAL node
|
ii) McMAL node
|
||||||
|
|
||||||
Required properties:
|
Required properties:
|
||||||
@@ -145,4 +204,3 @@
|
|||||||
- revision : as provided by the RGMII new version register if
|
- revision : as provided by the RGMII new version register if
|
||||||
available.
|
available.
|
||||||
For Axon: 0x0000012a
|
For Axon: 0x0000012a
|
||||||
|
|
||||||
|
@@ -45,7 +45,7 @@ Required Properties:
|
|||||||
Optional Properties:
|
Optional Properties:
|
||||||
- reg-names: In addition to the required properties, the following are optional
|
- reg-names: In addition to the required properties, the following are optional
|
||||||
- "efuse-address" - Contains efuse base address used to pick up ABB info.
|
- "efuse-address" - Contains efuse base address used to pick up ABB info.
|
||||||
- "ldo-address" - Contains address of ABB LDO overide register address.
|
- "ldo-address" - Contains address of ABB LDO override register.
|
||||||
"efuse-address" is required for this.
|
"efuse-address" is required for this.
|
||||||
- ti,ldovbb-vset-mask - Required if ldo-address is set, mask for LDO override
|
- ti,ldovbb-vset-mask - Required if ldo-address is set, mask for LDO override
|
||||||
register to provide override vset value.
|
register to provide override vset value.
|
||||||
|
@@ -7,18 +7,18 @@ Required properties :
|
|||||||
- compatible : Should be "microchip,usb251xb" or one of the specific types:
|
- compatible : Should be "microchip,usb251xb" or one of the specific types:
|
||||||
"microchip,usb2512b", "microchip,usb2512bi", "microchip,usb2513b",
|
"microchip,usb2512b", "microchip,usb2512bi", "microchip,usb2513b",
|
||||||
"microchip,usb2513bi", "microchip,usb2514b", "microchip,usb2514bi"
|
"microchip,usb2513bi", "microchip,usb2514b", "microchip,usb2514bi"
|
||||||
- hub-reset-gpios : Should specify the gpio for hub reset
|
- reset-gpios : Should specify the gpio for hub reset
|
||||||
|
- reg : I2C address on the selected bus (default is <0x2C>)
|
||||||
|
|
||||||
Optional properties :
|
Optional properties :
|
||||||
- reg : I2C address on the selected bus (default is <0x2C>)
|
|
||||||
- skip-config : Skip Hub configuration, but only send the USB-Attach command
|
- skip-config : Skip Hub configuration, but only send the USB-Attach command
|
||||||
- vendor-id : USB Vendor ID of the hub (16 bit, default is 0x0424)
|
- vendor-id : Set USB Vendor ID of the hub (16 bit, default is 0x0424)
|
||||||
- product-id : USB Product ID of the hub (16 bit, default depends on type)
|
- product-id : Set USB Product ID of the hub (16 bit, default depends on type)
|
||||||
- device-id : USB Device ID of the hub (16 bit, default is 0x0bb3)
|
- device-id : Set USB Device ID of the hub (16 bit, default is 0x0bb3)
|
||||||
- language-id : USB Language ID (16 bit, default is 0x0000)
|
- language-id : Set USB Language ID (16 bit, default is 0x0000)
|
||||||
- manufacturer : USB Manufacturer string (max 31 characters long)
|
- manufacturer : Set USB Manufacturer string (max 31 characters long)
|
||||||
- product : USB Product string (max 31 characters long)
|
- product : Set USB Product string (max 31 characters long)
|
||||||
- serial : USB Serial string (max 31 characters long)
|
- serial : Set USB Serial string (max 31 characters long)
|
||||||
- {bus,self}-powered : selects between self- and bus-powered operation (default
|
- {bus,self}-powered : selects between self- and bus-powered operation (default
|
||||||
is self-powered)
|
is self-powered)
|
||||||
- disable-hi-speed : disable USB Hi-Speed support
|
- disable-hi-speed : disable USB Hi-Speed support
|
||||||
@@ -31,8 +31,10 @@ Optional properties :
|
|||||||
(default is individual)
|
(default is individual)
|
||||||
- dynamic-power-switching : enable auto-switching from self- to bus-powered
|
- dynamic-power-switching : enable auto-switching from self- to bus-powered
|
||||||
operation if the local power source is removed or unavailable
|
operation if the local power source is removed or unavailable
|
||||||
- oc-delay-{100us,4ms,8ms,16ms} : set over current timer delay (default is 8ms)
|
- oc-delay-us : Delay time (in microseconds) for filtering the over-current
|
||||||
- compound-device : indicated the hub is part of a compound device
|
sense inputs. Valid values are 100, 4000, 8000 (default) and 16000. If
|
||||||
|
an invalid value is given, the default is used instead.
|
||||||
|
- compound-device : indicate the hub is part of a compound device
|
||||||
- port-mapping-mode : enable port mapping mode
|
- port-mapping-mode : enable port mapping mode
|
||||||
- string-support : enable string descriptor support (required for manufacturer,
|
- string-support : enable string descriptor support (required for manufacturer,
|
||||||
product and serial string configuration)
|
product and serial string configuration)
|
||||||
@@ -40,34 +42,15 @@ Optional properties :
|
|||||||
device connected.
|
device connected.
|
||||||
- sp-disabled-ports : Specifies the ports which will be self-power disabled
|
- sp-disabled-ports : Specifies the ports which will be self-power disabled
|
||||||
- bp-disabled-ports : Specifies the ports which will be bus-power disabled
|
- bp-disabled-ports : Specifies the ports which will be bus-power disabled
|
||||||
- max-sp-power : Specifies the maximum current the hub consumes from an
|
- power-on-time-ms : Specifies the time it takes from the time the host
|
||||||
upstream port when operating as self-powered hub including the power
|
initiates the power-on sequence to a port until the port has adequate
|
||||||
consumption of a permanently attached peripheral if the hub is
|
power. The value is given in ms in a 0 - 510 range (default is 100ms).
|
||||||
configured as a compound device. The value is given in mA in a 0 - 500
|
|
||||||
range (default is 2).
|
|
||||||
- max-bp-power : Specifies the maximum current the hub consumes from an
|
|
||||||
upstream port when operating as bus-powered hub including the power
|
|
||||||
consumption of a permanently attached peripheral if the hub is
|
|
||||||
configured as a compound device. The value is given in mA in a 0 - 500
|
|
||||||
range (default is 100).
|
|
||||||
- max-sp-current : Specifies the maximum current the hub consumes from an
|
|
||||||
upstream port when operating as self-powered hub EXCLUDING the power
|
|
||||||
consumption of a permanently attached peripheral if the hub is
|
|
||||||
configured as a compound device. The value is given in mA in a 0 - 500
|
|
||||||
range (default is 2).
|
|
||||||
- max-bp-current : Specifies the maximum current the hub consumes from an
|
|
||||||
upstream port when operating as bus-powered hub EXCLUDING the power
|
|
||||||
consumption of a permanently attached peripheral if the hub is
|
|
||||||
configured as a compound device. The value is given in mA in a 0 - 500
|
|
||||||
range (default is 100).
|
|
||||||
- power-on-time : Specifies the time it takes from the time the host initiates
|
|
||||||
the power-on sequence to a port until the port has adequate power. The
|
|
||||||
value is given in ms in a 0 - 510 range (default is 100ms).
|
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
usb2512b@2c {
|
usb2512b@2c {
|
||||||
compatible = "microchip,usb2512b";
|
compatible = "microchip,usb2512b";
|
||||||
hub-reset-gpios = <&gpio1 4 GPIO_ACTIVE_LOW>;
|
reg = <0x2c>;
|
||||||
|
reset-gpios = <&gpio1 4 GPIO_ACTIVE_LOW>;
|
||||||
};
|
};
|
||||||
|
|
||||||
usb2514b@2c {
|
usb2514b@2c {
|
||||||
|
@@ -178,6 +178,7 @@ maxim Maxim Integrated Products
|
|||||||
mcube mCube
|
mcube mCube
|
||||||
meas Measurement Specialties
|
meas Measurement Specialties
|
||||||
mediatek MediaTek Inc.
|
mediatek MediaTek Inc.
|
||||||
|
megachips MegaChips
|
||||||
melexis Melexis N.V.
|
melexis Melexis N.V.
|
||||||
melfas MELFAS Inc.
|
melfas MELFAS Inc.
|
||||||
memsic MEMSIC Inc.
|
memsic MEMSIC Inc.
|
||||||
|
3
Documentation/doc-guide/hello.dot
Normal file
3
Documentation/doc-guide/hello.dot
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
graph G {
|
||||||
|
Hello -- World
|
||||||
|
}
|
@@ -34,8 +34,9 @@ format-specific subdirectories under ``Documentation/output``.
|
|||||||
|
|
||||||
To generate documentation, Sphinx (``sphinx-build``) must obviously be
|
To generate documentation, Sphinx (``sphinx-build``) must obviously be
|
||||||
installed. For prettier HTML output, the Read the Docs Sphinx theme
|
installed. For prettier HTML output, the Read the Docs Sphinx theme
|
||||||
(``sphinx_rtd_theme``) is used if available. For PDF output, ``rst2pdf`` is also
|
(``sphinx_rtd_theme``) is used if available. For PDF output you'll also need
|
||||||
needed. All of these are widely available and packaged in distributions.
|
``XeLaTeX`` and ``convert(1)`` from ImageMagick (https://www.imagemagick.org).
|
||||||
|
All of these are widely available and packaged in distributions.
|
||||||
|
|
||||||
To pass extra options to Sphinx, you can use the ``SPHINXOPTS`` make
|
To pass extra options to Sphinx, you can use the ``SPHINXOPTS`` make
|
||||||
variable. For example, use ``make SPHINXOPTS=-v htmldocs`` to get more verbose
|
variable. For example, use ``make SPHINXOPTS=-v htmldocs`` to get more verbose
|
||||||
@@ -73,7 +74,16 @@ Specific guidelines for the kernel documentation
|
|||||||
|
|
||||||
Here are some specific guidelines for the kernel documentation:
|
Here are some specific guidelines for the kernel documentation:
|
||||||
|
|
||||||
* Please don't go overboard with reStructuredText markup. Keep it simple.
|
* Please don't go overboard with reStructuredText markup. Keep it
|
||||||
|
simple. For the most part the documentation should be plain text with
|
||||||
|
just enough consistency in formatting that it can be converted to
|
||||||
|
other formats.
|
||||||
|
|
||||||
|
* Please keep the formatting changes minimal when converting existing
|
||||||
|
documentation to reStructuredText.
|
||||||
|
|
||||||
|
* Also update the content, not just the formatting, when converting
|
||||||
|
documentation.
|
||||||
|
|
||||||
* Please stick to this order of heading adornments:
|
* Please stick to this order of heading adornments:
|
||||||
|
|
||||||
@@ -103,6 +113,12 @@ Here are some specific guidelines for the kernel documentation:
|
|||||||
the order as encountered."), having the higher levels the same overall makes
|
the order as encountered."), having the higher levels the same overall makes
|
||||||
it easier to follow the documents.
|
it easier to follow the documents.
|
||||||
|
|
||||||
|
* For inserting fixed width text blocks (for code examples, use case
|
||||||
|
examples, etc.), use ``::`` for anything that doesn't really benefit
|
||||||
|
from syntax highlighting, especially short snippets. Use
|
||||||
|
``.. code-block:: <language>`` for longer code blocks that benefit
|
||||||
|
from highlighting.
|
||||||
|
|
||||||
|
|
||||||
the C domain
|
the C domain
|
||||||
------------
|
------------
|
||||||
@@ -217,3 +233,96 @@ Rendered as:
|
|||||||
* .. _`last row`:
|
* .. _`last row`:
|
||||||
|
|
||||||
- column 3
|
- column 3
|
||||||
|
|
||||||
|
|
||||||
|
Figures & Images
|
||||||
|
================
|
||||||
|
|
||||||
|
If you want to add an image, you should use the ``kernel-figure`` and
|
||||||
|
``kernel-image`` directives. E.g. to insert a figure with a scalable
|
||||||
|
image format use SVG (:ref:`svg_image_example`)::
|
||||||
|
|
||||||
|
.. kernel-figure:: svg_image.svg
|
||||||
|
:alt: simple SVG image
|
||||||
|
|
||||||
|
SVG image example
|
||||||
|
|
||||||
|
.. _svg_image_example:
|
||||||
|
|
||||||
|
.. kernel-figure:: svg_image.svg
|
||||||
|
:alt: simple SVG image
|
||||||
|
|
||||||
|
SVG image example
|
||||||
|
|
||||||
|
The kernel figure (and image) directive support **DOT** formated files, see
|
||||||
|
|
||||||
|
* DOT: http://graphviz.org/pdf/dotguide.pdf
|
||||||
|
* Graphviz: http://www.graphviz.org/content/dot-language
|
||||||
|
|
||||||
|
A simple example (:ref:`hello_dot_file`)::
|
||||||
|
|
||||||
|
.. kernel-figure:: hello.dot
|
||||||
|
:alt: hello world
|
||||||
|
|
||||||
|
DOT's hello world example
|
||||||
|
|
||||||
|
.. _hello_dot_file:
|
||||||
|
|
||||||
|
.. kernel-figure:: hello.dot
|
||||||
|
:alt: hello world
|
||||||
|
|
||||||
|
DOT's hello world example
|
||||||
|
|
||||||
|
Embed *render* markups (or languages) like Graphviz's **DOT** is provided by the
|
||||||
|
``kernel-render`` directives.::
|
||||||
|
|
||||||
|
.. kernel-render:: DOT
|
||||||
|
:alt: foobar digraph
|
||||||
|
:caption: Embedded **DOT** (Graphviz) code
|
||||||
|
|
||||||
|
digraph foo {
|
||||||
|
"bar" -> "baz";
|
||||||
|
}
|
||||||
|
|
||||||
|
How this will be rendered depends on the installed tools. If Graphviz is
|
||||||
|
installed, you will see an vector image. If not the raw markup is inserted as
|
||||||
|
*literal-block* (:ref:`hello_dot_render`).
|
||||||
|
|
||||||
|
.. _hello_dot_render:
|
||||||
|
|
||||||
|
.. kernel-render:: DOT
|
||||||
|
:alt: foobar digraph
|
||||||
|
:caption: Embedded **DOT** (Graphviz) code
|
||||||
|
|
||||||
|
digraph foo {
|
||||||
|
"bar" -> "baz";
|
||||||
|
}
|
||||||
|
|
||||||
|
The *render* directive has all the options known from the *figure* directive,
|
||||||
|
plus option ``caption``. If ``caption`` has a value, a *figure* node is
|
||||||
|
inserted. If not, a *image* node is inserted. A ``caption`` is also needed, if
|
||||||
|
you want to refer it (:ref:`hello_svg_render`).
|
||||||
|
|
||||||
|
Embedded **SVG**::
|
||||||
|
|
||||||
|
.. kernel-render:: SVG
|
||||||
|
:caption: Embedded **SVG** markup
|
||||||
|
:alt: so-nw-arrow
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" ...>
|
||||||
|
...
|
||||||
|
</svg>
|
||||||
|
|
||||||
|
.. _hello_svg_render:
|
||||||
|
|
||||||
|
.. kernel-render:: SVG
|
||||||
|
:caption: Embedded **SVG** markup
|
||||||
|
:alt: so-nw-arrow
|
||||||
|
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg"
|
||||||
|
version="1.1" baseProfile="full" width="70px" height="40px" viewBox="0 0 700 400">
|
||||||
|
<line x1="180" y1="370" x2="500" y2="50" stroke="black" stroke-width="15px"/>
|
||||||
|
<polygon points="585 0 525 25 585 50" transform="rotate(135 525 25)"/>
|
||||||
|
</svg>
|
||||||
|
10
Documentation/doc-guide/svg_image.svg
Normal file
10
Documentation/doc-guide/svg_image.svg
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- originate: https://commons.wikimedia.org/wiki/File:Variable_Resistor.svg -->
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg"
|
||||||
|
version="1.1" baseProfile="full"
|
||||||
|
width="70px" height="40px" viewBox="0 0 700 400">
|
||||||
|
<line x1="0" y1="200" x2="700" y2="200" stroke="black" stroke-width="20px"/>
|
||||||
|
<rect x="100" y="100" width="500" height="200" fill="white" stroke="black" stroke-width="20px"/>
|
||||||
|
<line x1="180" y1="370" x2="500" y2="50" stroke="black" stroke-width="15px"/>
|
||||||
|
<polygon points="585 0 525 25 585 50" transform="rotate(135 525 25)"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 580 B |
@@ -140,12 +140,12 @@ Device Instance and Driver Handling
|
|||||||
.. kernel-doc:: drivers/gpu/drm/drm_drv.c
|
.. kernel-doc:: drivers/gpu/drm/drm_drv.c
|
||||||
:doc: driver instance overview
|
:doc: driver instance overview
|
||||||
|
|
||||||
.. kernel-doc:: drivers/gpu/drm/drm_drv.c
|
|
||||||
:export:
|
|
||||||
|
|
||||||
.. kernel-doc:: include/drm/drm_drv.h
|
.. kernel-doc:: include/drm/drm_drv.h
|
||||||
:internal:
|
:internal:
|
||||||
|
|
||||||
|
.. kernel-doc:: drivers/gpu/drm/drm_drv.c
|
||||||
|
:export:
|
||||||
|
|
||||||
Driver Load
|
Driver Load
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
@@ -240,68 +240,19 @@ drivers.
|
|||||||
.. kernel-doc:: drivers/gpu/drm/drm_pci.c
|
.. kernel-doc:: drivers/gpu/drm/drm_pci.c
|
||||||
:export:
|
:export:
|
||||||
|
|
||||||
.. kernel-doc:: drivers/gpu/drm/drm_platform.c
|
|
||||||
:export:
|
|
||||||
|
|
||||||
Open/Close, File Operations and IOCTLs
|
Open/Close, File Operations and IOCTLs
|
||||||
======================================
|
======================================
|
||||||
|
|
||||||
Open and Close
|
|
||||||
--------------
|
|
||||||
|
|
||||||
Open and close handlers. None of those methods are mandatory::
|
|
||||||
|
|
||||||
int (*firstopen) (struct drm_device *);
|
|
||||||
void (*lastclose) (struct drm_device *);
|
|
||||||
int (*open) (struct drm_device *, struct drm_file *);
|
|
||||||
void (*preclose) (struct drm_device *, struct drm_file *);
|
|
||||||
void (*postclose) (struct drm_device *, struct drm_file *);
|
|
||||||
|
|
||||||
The firstopen method is called by the DRM core for legacy UMS (User Mode
|
|
||||||
Setting) drivers only when an application opens a device that has no
|
|
||||||
other opened file handle. UMS drivers can implement it to acquire device
|
|
||||||
resources. KMS drivers can't use the method and must acquire resources
|
|
||||||
in the load method instead.
|
|
||||||
|
|
||||||
Similarly the lastclose method is called when the last application
|
|
||||||
holding a file handle opened on the device closes it, for both UMS and
|
|
||||||
KMS drivers. Additionally, the method is also called at module unload
|
|
||||||
time or, for hot-pluggable devices, when the device is unplugged. The
|
|
||||||
firstopen and lastclose calls can thus be unbalanced.
|
|
||||||
|
|
||||||
The open method is called every time the device is opened by an
|
|
||||||
application. Drivers can allocate per-file private data in this method
|
|
||||||
and store them in the struct :c:type:`struct drm_file
|
|
||||||
<drm_file>` driver_priv field. Note that the open method is
|
|
||||||
called before firstopen.
|
|
||||||
|
|
||||||
The close operation is split into preclose and postclose methods.
|
|
||||||
Drivers must stop and cleanup all per-file operations in the preclose
|
|
||||||
method. For instance pending vertical blanking and page flip events must
|
|
||||||
be cancelled. No per-file operation is allowed on the file handle after
|
|
||||||
returning from the preclose method.
|
|
||||||
|
|
||||||
Finally the postclose method is called as the last step of the close
|
|
||||||
operation, right before calling the lastclose method if no other open
|
|
||||||
file handle exists for the device. Drivers that have allocated per-file
|
|
||||||
private data in the open method should free it here.
|
|
||||||
|
|
||||||
The lastclose method should restore CRTC and plane properties to default
|
|
||||||
value, so that a subsequent open of the device will not inherit state
|
|
||||||
from the previous user. It can also be used to execute delayed power
|
|
||||||
switching state changes, e.g. in conjunction with the :ref:`vga_switcheroo`
|
|
||||||
infrastructure. Beyond that KMS drivers should not do any
|
|
||||||
further cleanup. Only legacy UMS drivers might need to clean up device
|
|
||||||
state so that the vga console or an independent fbdev driver could take
|
|
||||||
over.
|
|
||||||
|
|
||||||
File Operations
|
File Operations
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
.. kernel-doc:: drivers/gpu/drm/drm_fops.c
|
.. kernel-doc:: drivers/gpu/drm/drm_file.c
|
||||||
:doc: file operations
|
:doc: file operations
|
||||||
|
|
||||||
.. kernel-doc:: drivers/gpu/drm/drm_fops.c
|
.. kernel-doc:: include/drm/drm_file.h
|
||||||
|
:internal:
|
||||||
|
|
||||||
|
.. kernel-doc:: drivers/gpu/drm/drm_file.c
|
||||||
:export:
|
:export:
|
||||||
|
|
||||||
IOCTLs
|
IOCTLs
|
||||||
|
@@ -37,10 +37,12 @@ Modeset Helper Reference for Common Vtables
|
|||||||
===========================================
|
===========================================
|
||||||
|
|
||||||
.. kernel-doc:: include/drm/drm_modeset_helper_vtables.h
|
.. kernel-doc:: include/drm/drm_modeset_helper_vtables.h
|
||||||
:internal:
|
:doc: overview
|
||||||
|
|
||||||
.. kernel-doc:: include/drm/drm_modeset_helper_vtables.h
|
.. kernel-doc:: include/drm/drm_modeset_helper_vtables.h
|
||||||
:doc: overview
|
:internal:
|
||||||
|
|
||||||
|
.. _drm_atomic_helper:
|
||||||
|
|
||||||
Atomic Modeset Helper Functions Reference
|
Atomic Modeset Helper Functions Reference
|
||||||
=========================================
|
=========================================
|
||||||
@@ -84,27 +86,27 @@ Legacy CRTC/Modeset Helper Functions Reference
|
|||||||
Simple KMS Helper Reference
|
Simple KMS Helper Reference
|
||||||
===========================
|
===========================
|
||||||
|
|
||||||
|
.. kernel-doc:: drivers/gpu/drm/drm_simple_kms_helper.c
|
||||||
|
:doc: overview
|
||||||
|
|
||||||
.. kernel-doc:: include/drm/drm_simple_kms_helper.h
|
.. kernel-doc:: include/drm/drm_simple_kms_helper.h
|
||||||
:internal:
|
:internal:
|
||||||
|
|
||||||
.. kernel-doc:: drivers/gpu/drm/drm_simple_kms_helper.c
|
.. kernel-doc:: drivers/gpu/drm/drm_simple_kms_helper.c
|
||||||
:export:
|
:export:
|
||||||
|
|
||||||
.. kernel-doc:: drivers/gpu/drm/drm_simple_kms_helper.c
|
|
||||||
:doc: overview
|
|
||||||
|
|
||||||
fbdev Helper Functions Reference
|
fbdev Helper Functions Reference
|
||||||
================================
|
================================
|
||||||
|
|
||||||
.. kernel-doc:: drivers/gpu/drm/drm_fb_helper.c
|
.. kernel-doc:: drivers/gpu/drm/drm_fb_helper.c
|
||||||
:doc: fbdev helpers
|
:doc: fbdev helpers
|
||||||
|
|
||||||
.. kernel-doc:: drivers/gpu/drm/drm_fb_helper.c
|
|
||||||
:export:
|
|
||||||
|
|
||||||
.. kernel-doc:: include/drm/drm_fb_helper.h
|
.. kernel-doc:: include/drm/drm_fb_helper.h
|
||||||
:internal:
|
:internal:
|
||||||
|
|
||||||
|
.. kernel-doc:: drivers/gpu/drm/drm_fb_helper.c
|
||||||
|
:export:
|
||||||
|
|
||||||
Framebuffer CMA Helper Functions Reference
|
Framebuffer CMA Helper Functions Reference
|
||||||
==========================================
|
==========================================
|
||||||
|
|
||||||
@@ -114,6 +116,8 @@ Framebuffer CMA Helper Functions Reference
|
|||||||
.. kernel-doc:: drivers/gpu/drm/drm_fb_cma_helper.c
|
.. kernel-doc:: drivers/gpu/drm/drm_fb_cma_helper.c
|
||||||
:export:
|
:export:
|
||||||
|
|
||||||
|
.. _drm_bridges:
|
||||||
|
|
||||||
Bridges
|
Bridges
|
||||||
=======
|
=======
|
||||||
|
|
||||||
@@ -139,18 +143,20 @@ Bridge Helper Reference
|
|||||||
.. kernel-doc:: drivers/gpu/drm/drm_bridge.c
|
.. kernel-doc:: drivers/gpu/drm/drm_bridge.c
|
||||||
:export:
|
:export:
|
||||||
|
|
||||||
|
.. _drm_panel_helper:
|
||||||
|
|
||||||
Panel Helper Reference
|
Panel Helper Reference
|
||||||
======================
|
======================
|
||||||
|
|
||||||
|
.. kernel-doc:: drivers/gpu/drm/drm_panel.c
|
||||||
|
:doc: drm panel
|
||||||
|
|
||||||
.. kernel-doc:: include/drm/drm_panel.h
|
.. kernel-doc:: include/drm/drm_panel.h
|
||||||
:internal:
|
:internal:
|
||||||
|
|
||||||
.. kernel-doc:: drivers/gpu/drm/drm_panel.c
|
.. kernel-doc:: drivers/gpu/drm/drm_panel.c
|
||||||
:export:
|
:export:
|
||||||
|
|
||||||
.. kernel-doc:: drivers/gpu/drm/drm_panel.c
|
|
||||||
:doc: drm panel
|
|
||||||
|
|
||||||
Display Port Helper Functions Reference
|
Display Port Helper Functions Reference
|
||||||
=======================================
|
=======================================
|
||||||
|
|
||||||
@@ -217,6 +223,18 @@ EDID Helper Functions Reference
|
|||||||
.. kernel-doc:: drivers/gpu/drm/drm_edid.c
|
.. kernel-doc:: drivers/gpu/drm/drm_edid.c
|
||||||
:export:
|
:export:
|
||||||
|
|
||||||
|
SCDC Helper Functions Reference
|
||||||
|
===============================
|
||||||
|
|
||||||
|
.. kernel-doc:: drivers/gpu/drm/drm_scdc_helper.c
|
||||||
|
:doc: scdc helpers
|
||||||
|
|
||||||
|
.. kernel-doc:: include/drm/drm_scdc_helper.h
|
||||||
|
:internal:
|
||||||
|
|
||||||
|
.. kernel-doc:: drivers/gpu/drm/drm_scdc_helper.c
|
||||||
|
:export:
|
||||||
|
|
||||||
Rectangle Utilities Reference
|
Rectangle Utilities Reference
|
||||||
=============================
|
=============================
|
||||||
|
|
||||||
|
@@ -15,35 +15,271 @@ be setup by initializing the following fields.
|
|||||||
- struct drm_mode_config_funcs \*funcs;
|
- struct drm_mode_config_funcs \*funcs;
|
||||||
Mode setting functions.
|
Mode setting functions.
|
||||||
|
|
||||||
Mode Configuration
|
Overview
|
||||||
|
========
|
||||||
|
|
||||||
|
.. kernel-render:: DOT
|
||||||
|
:alt: KMS Display Pipeline
|
||||||
|
:caption: KMS Display Pipeline Overview
|
||||||
|
|
||||||
|
digraph "KMS" {
|
||||||
|
node [shape=box]
|
||||||
|
|
||||||
|
subgraph cluster_static {
|
||||||
|
style=dashed
|
||||||
|
label="Static Objects"
|
||||||
|
|
||||||
|
node [bgcolor=grey style=filled]
|
||||||
|
"drm_plane A" -> "drm_crtc"
|
||||||
|
"drm_plane B" -> "drm_crtc"
|
||||||
|
"drm_crtc" -> "drm_encoder A"
|
||||||
|
"drm_crtc" -> "drm_encoder B"
|
||||||
|
}
|
||||||
|
|
||||||
|
subgraph cluster_user_created {
|
||||||
|
style=dashed
|
||||||
|
label="Userspace-Created"
|
||||||
|
|
||||||
|
node [shape=oval]
|
||||||
|
"drm_framebuffer 1" -> "drm_plane A"
|
||||||
|
"drm_framebuffer 2" -> "drm_plane B"
|
||||||
|
}
|
||||||
|
|
||||||
|
subgraph cluster_connector {
|
||||||
|
style=dashed
|
||||||
|
label="Hotpluggable"
|
||||||
|
|
||||||
|
"drm_encoder A" -> "drm_connector A"
|
||||||
|
"drm_encoder B" -> "drm_connector B"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
The basic object structure KMS presents to userspace is fairly simple.
|
||||||
|
Framebuffers (represented by :c:type:`struct drm_framebuffer <drm_framebuffer>`,
|
||||||
|
see `Frame Buffer Abstraction`_) feed into planes. One or more (or even no)
|
||||||
|
planes feed their pixel data into a CRTC (represented by :c:type:`struct
|
||||||
|
drm_crtc <drm_crtc>`, see `CRTC Abstraction`_) for blending. The precise
|
||||||
|
blending step is explained in more detail in `Plane Composition Properties`_ and
|
||||||
|
related chapters.
|
||||||
|
|
||||||
|
For the output routing the first step is encoders (represented by
|
||||||
|
:c:type:`struct drm_encoder <drm_encoder>`, see `Encoder Abstraction`_). Those
|
||||||
|
are really just internal artifacts of the helper libraries used to implement KMS
|
||||||
|
drivers. Besides that they make it unecessarily more complicated for userspace
|
||||||
|
to figure out which connections between a CRTC and a connector are possible, and
|
||||||
|
what kind of cloning is supported, they serve no purpose in the userspace API.
|
||||||
|
Unfortunately encoders have been exposed to userspace, hence can't remove them
|
||||||
|
at this point. Futhermore the exposed restrictions are often wrongly set by
|
||||||
|
drivers, and in many cases not powerful enough to express the real restrictions.
|
||||||
|
A CRTC can be connected to multiple encoders, and for an active CRTC there must
|
||||||
|
be at least one encoder.
|
||||||
|
|
||||||
|
The final, and real, endpoint in the display chain is the connector (represented
|
||||||
|
by :c:type:`struct drm_connector <drm_connector>`, see `Connector
|
||||||
|
Abstraction`_). Connectors can have different possible encoders, but the kernel
|
||||||
|
driver selects which encoder to use for each connector. The use case is DVI,
|
||||||
|
which could switch between an analog and a digital encoder. Encoders can also
|
||||||
|
drive multiple different connectors. There is exactly one active connector for
|
||||||
|
every active encoder.
|
||||||
|
|
||||||
|
Internally the output pipeline is a bit more complex and matches today's
|
||||||
|
hardware more closely:
|
||||||
|
|
||||||
|
.. kernel-render:: DOT
|
||||||
|
:alt: KMS Output Pipeline
|
||||||
|
:caption: KMS Output Pipeline
|
||||||
|
|
||||||
|
digraph "Output Pipeline" {
|
||||||
|
node [shape=box]
|
||||||
|
|
||||||
|
subgraph {
|
||||||
|
"drm_crtc" [bgcolor=grey style=filled]
|
||||||
|
}
|
||||||
|
|
||||||
|
subgraph cluster_internal {
|
||||||
|
style=dashed
|
||||||
|
label="Internal Pipeline"
|
||||||
|
{
|
||||||
|
node [bgcolor=grey style=filled]
|
||||||
|
"drm_encoder A";
|
||||||
|
"drm_encoder B";
|
||||||
|
"drm_encoder C";
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
node [bgcolor=grey style=filled]
|
||||||
|
"drm_encoder B" -> "drm_bridge B"
|
||||||
|
"drm_encoder C" -> "drm_bridge C1"
|
||||||
|
"drm_bridge C1" -> "drm_bridge C2";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
"drm_crtc" -> "drm_encoder A"
|
||||||
|
"drm_crtc" -> "drm_encoder B"
|
||||||
|
"drm_crtc" -> "drm_encoder C"
|
||||||
|
|
||||||
|
|
||||||
|
subgraph cluster_output {
|
||||||
|
style=dashed
|
||||||
|
label="Outputs"
|
||||||
|
|
||||||
|
"drm_encoder A" -> "drm_connector A";
|
||||||
|
"drm_bridge B" -> "drm_connector B";
|
||||||
|
"drm_bridge C2" -> "drm_connector C";
|
||||||
|
|
||||||
|
"drm_panel"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Internally two additional helper objects come into play. First, to be able to
|
||||||
|
share code for encoders (sometimes on the same SoC, sometimes off-chip) one or
|
||||||
|
more :ref:`drm_bridges` (represented by :c:type:`struct drm_bridge
|
||||||
|
<drm_bridge>`) can be linked to an encoder. This link is static and cannot be
|
||||||
|
changed, which means the cross-bar (if there is any) needs to be mapped between
|
||||||
|
the CRTC and any encoders. Often for drivers with bridges there's no code left
|
||||||
|
at the encoder level. Atomic drivers can leave out all the encoder callbacks to
|
||||||
|
essentially only leave a dummy routing object behind, which is needed for
|
||||||
|
backwards compatibility since encoders are exposed to userspace.
|
||||||
|
|
||||||
|
The second object is for panels, represented by :c:type:`struct drm_panel
|
||||||
|
<drm_panel>`, see :ref:`drm_panel_helper`. Panels do not have a fixed binding
|
||||||
|
point, but are generally linked to the driver private structure that embeds
|
||||||
|
:c:type:`struct drm_connector <drm_connector>`.
|
||||||
|
|
||||||
|
Note that currently the bridge chaining and interactions with connectors and
|
||||||
|
panels are still in-flux and not really fully sorted out yet.
|
||||||
|
|
||||||
KMS Core Structures and Functions
|
KMS Core Structures and Functions
|
||||||
=================================
|
=================================
|
||||||
|
|
||||||
.. kernel-doc:: drivers/gpu/drm/drm_mode_config.c
|
|
||||||
:export:
|
|
||||||
|
|
||||||
.. kernel-doc:: include/drm/drm_mode_config.h
|
.. kernel-doc:: include/drm/drm_mode_config.h
|
||||||
:internal:
|
:internal:
|
||||||
|
|
||||||
|
.. kernel-doc:: drivers/gpu/drm/drm_mode_config.c
|
||||||
|
:export:
|
||||||
|
|
||||||
Modeset Base Object Abstraction
|
Modeset Base Object Abstraction
|
||||||
===============================
|
===============================
|
||||||
|
|
||||||
|
.. kernel-render:: DOT
|
||||||
|
:alt: Mode Objects and Properties
|
||||||
|
:caption: Mode Objects and Properties
|
||||||
|
|
||||||
|
digraph {
|
||||||
|
node [shape=box]
|
||||||
|
|
||||||
|
"drm_property A" -> "drm_mode_object A"
|
||||||
|
"drm_property A" -> "drm_mode_object B"
|
||||||
|
"drm_property B" -> "drm_mode_object A"
|
||||||
|
}
|
||||||
|
|
||||||
|
The base structure for all KMS objects is :c:type:`struct drm_mode_object
|
||||||
|
<drm_mode_object>`. One of the base services it provides is tracking properties,
|
||||||
|
which are especially important for the atomic IOCTL (see `Atomic Mode
|
||||||
|
Setting`_). The somewhat surprising part here is that properties are not
|
||||||
|
directly instantiated on each object, but free-standing mode objects themselves,
|
||||||
|
represented by :c:type:`struct drm_property <drm_property>`, which only specify
|
||||||
|
the type and value range of a property. Any given property can be attached
|
||||||
|
multiple times to different objects using :c:func:`drm_object_attach_property()
|
||||||
|
<drm_object_attach_property>`.
|
||||||
|
|
||||||
.. kernel-doc:: include/drm/drm_mode_object.h
|
.. kernel-doc:: include/drm/drm_mode_object.h
|
||||||
:internal:
|
:internal:
|
||||||
|
|
||||||
.. kernel-doc:: drivers/gpu/drm/drm_mode_object.c
|
.. kernel-doc:: drivers/gpu/drm/drm_mode_object.c
|
||||||
:export:
|
:export:
|
||||||
|
|
||||||
Atomic Mode Setting Function Reference
|
Atomic Mode Setting
|
||||||
======================================
|
===================
|
||||||
|
|
||||||
.. kernel-doc:: drivers/gpu/drm/drm_atomic.c
|
|
||||||
:export:
|
.. kernel-render:: DOT
|
||||||
|
:alt: Mode Objects and Properties
|
||||||
|
:caption: Mode Objects and Properties
|
||||||
|
|
||||||
|
digraph {
|
||||||
|
node [shape=box]
|
||||||
|
|
||||||
|
subgraph cluster_state {
|
||||||
|
style=dashed
|
||||||
|
label="Free-standing state"
|
||||||
|
|
||||||
|
"drm_atomic_state" -> "duplicated drm_plane_state A"
|
||||||
|
"drm_atomic_state" -> "duplicated drm_plane_state B"
|
||||||
|
"drm_atomic_state" -> "duplicated drm_crtc_state"
|
||||||
|
"drm_atomic_state" -> "duplicated drm_connector_state"
|
||||||
|
"drm_atomic_state" -> "duplicated driver private state"
|
||||||
|
}
|
||||||
|
|
||||||
|
subgraph cluster_current {
|
||||||
|
style=dashed
|
||||||
|
label="Current state"
|
||||||
|
|
||||||
|
"drm_device" -> "drm_plane A"
|
||||||
|
"drm_device" -> "drm_plane B"
|
||||||
|
"drm_device" -> "drm_crtc"
|
||||||
|
"drm_device" -> "drm_connector"
|
||||||
|
"drm_device" -> "driver private object"
|
||||||
|
|
||||||
|
"drm_plane A" -> "drm_plane_state A"
|
||||||
|
"drm_plane B" -> "drm_plane_state B"
|
||||||
|
"drm_crtc" -> "drm_crtc_state"
|
||||||
|
"drm_connector" -> "drm_connector_state"
|
||||||
|
"driver private object" -> "driver private state"
|
||||||
|
}
|
||||||
|
|
||||||
|
"drm_atomic_state" -> "drm_device" [label="atomic_commit"]
|
||||||
|
"duplicated drm_plane_state A" -> "drm_device"[style=invis]
|
||||||
|
}
|
||||||
|
|
||||||
|
Atomic provides transactional modeset (including planes) updates, but a
|
||||||
|
bit differently from the usual transactional approach of try-commit and
|
||||||
|
rollback:
|
||||||
|
|
||||||
|
- Firstly, no hardware changes are allowed when the commit would fail. This
|
||||||
|
allows us to implement the DRM_MODE_ATOMIC_TEST_ONLY mode, which allows
|
||||||
|
userspace to explore whether certain configurations would work or not.
|
||||||
|
|
||||||
|
- This would still allow setting and rollback of just the software state,
|
||||||
|
simplifying conversion of existing drivers. But auditing drivers for
|
||||||
|
correctness of the atomic_check code becomes really hard with that: Rolling
|
||||||
|
back changes in data structures all over the place is hard to get right.
|
||||||
|
|
||||||
|
- Lastly, for backwards compatibility and to support all use-cases, atomic
|
||||||
|
updates need to be incremental and be able to execute in parallel. Hardware
|
||||||
|
doesn't always allow it, but where possible plane updates on different CRTCs
|
||||||
|
should not interfere, and not get stalled due to output routing changing on
|
||||||
|
different CRTCs.
|
||||||
|
|
||||||
|
Taken all together there's two consequences for the atomic design:
|
||||||
|
|
||||||
|
- The overall state is split up into per-object state structures:
|
||||||
|
:c:type:`struct drm_plane_state <drm_plane_state>` for planes, :c:type:`struct
|
||||||
|
drm_crtc_state <drm_crtc_state>` for CRTCs and :c:type:`struct
|
||||||
|
drm_connector_state <drm_connector_state>` for connectors. These are the only
|
||||||
|
objects with userspace-visible and settable state. For internal state drivers
|
||||||
|
can subclass these structures through embeddeding, or add entirely new state
|
||||||
|
structures for their globally shared hardware functions.
|
||||||
|
|
||||||
|
- An atomic update is assembled and validated as an entirely free-standing pile
|
||||||
|
of structures within the :c:type:`drm_atomic_state <drm_atomic_state>`
|
||||||
|
container. Again drivers can subclass that container for their own state
|
||||||
|
structure tracking needs. Only when a state is committed is it applied to the
|
||||||
|
driver and modeset objects. This way rolling back an update boils down to
|
||||||
|
releasing memory and unreferencing objects like framebuffers.
|
||||||
|
|
||||||
|
Read on in this chapter, and also in :ref:`drm_atomic_helper` for more detailed
|
||||||
|
coverage of specific topics.
|
||||||
|
|
||||||
|
Atomic Mode Setting Function Reference
|
||||||
|
--------------------------------------
|
||||||
|
|
||||||
.. kernel-doc:: include/drm/drm_atomic.h
|
.. kernel-doc:: include/drm/drm_atomic.h
|
||||||
:internal:
|
:internal:
|
||||||
|
|
||||||
|
.. kernel-doc:: drivers/gpu/drm/drm_atomic.c
|
||||||
|
:export:
|
||||||
|
|
||||||
CRTC Abstraction
|
CRTC Abstraction
|
||||||
================
|
================
|
||||||
|
|
||||||
@@ -68,12 +304,12 @@ Frame Buffer Abstraction
|
|||||||
Frame Buffer Functions Reference
|
Frame Buffer Functions Reference
|
||||||
--------------------------------
|
--------------------------------
|
||||||
|
|
||||||
.. kernel-doc:: drivers/gpu/drm/drm_framebuffer.c
|
|
||||||
:export:
|
|
||||||
|
|
||||||
.. kernel-doc:: include/drm/drm_framebuffer.h
|
.. kernel-doc:: include/drm/drm_framebuffer.h
|
||||||
:internal:
|
:internal:
|
||||||
|
|
||||||
|
.. kernel-doc:: drivers/gpu/drm/drm_framebuffer.c
|
||||||
|
:export:
|
||||||
|
|
||||||
DRM Format Handling
|
DRM Format Handling
|
||||||
===================
|
===================
|
||||||
|
|
||||||
@@ -376,8 +612,8 @@ operation handler.
|
|||||||
Vertical Blanking and Interrupt Handling Functions Reference
|
Vertical Blanking and Interrupt Handling Functions Reference
|
||||||
------------------------------------------------------------
|
------------------------------------------------------------
|
||||||
|
|
||||||
.. kernel-doc:: drivers/gpu/drm/drm_irq.c
|
|
||||||
:export:
|
|
||||||
|
|
||||||
.. kernel-doc:: include/drm/drm_irq.h
|
.. kernel-doc:: include/drm/drm_irq.h
|
||||||
:internal:
|
:internal:
|
||||||
|
|
||||||
|
.. kernel-doc:: drivers/gpu/drm/drm_irq.c
|
||||||
|
:export:
|
||||||
|
@@ -365,36 +365,36 @@ from the client in libdrm.
|
|||||||
GEM Function Reference
|
GEM Function Reference
|
||||||
----------------------
|
----------------------
|
||||||
|
|
||||||
.. kernel-doc:: drivers/gpu/drm/drm_gem.c
|
|
||||||
:export:
|
|
||||||
|
|
||||||
.. kernel-doc:: include/drm/drm_gem.h
|
.. kernel-doc:: include/drm/drm_gem.h
|
||||||
:internal:
|
:internal:
|
||||||
|
|
||||||
|
.. kernel-doc:: drivers/gpu/drm/drm_gem.c
|
||||||
|
:export:
|
||||||
|
|
||||||
GEM CMA Helper Functions Reference
|
GEM CMA Helper Functions Reference
|
||||||
----------------------------------
|
----------------------------------
|
||||||
|
|
||||||
.. kernel-doc:: drivers/gpu/drm/drm_gem_cma_helper.c
|
.. kernel-doc:: drivers/gpu/drm/drm_gem_cma_helper.c
|
||||||
:doc: cma helpers
|
:doc: cma helpers
|
||||||
|
|
||||||
.. kernel-doc:: drivers/gpu/drm/drm_gem_cma_helper.c
|
|
||||||
:export:
|
|
||||||
|
|
||||||
.. kernel-doc:: include/drm/drm_gem_cma_helper.h
|
.. kernel-doc:: include/drm/drm_gem_cma_helper.h
|
||||||
:internal:
|
:internal:
|
||||||
|
|
||||||
|
.. kernel-doc:: drivers/gpu/drm/drm_gem_cma_helper.c
|
||||||
|
:export:
|
||||||
|
|
||||||
VMA Offset Manager
|
VMA Offset Manager
|
||||||
==================
|
==================
|
||||||
|
|
||||||
.. kernel-doc:: drivers/gpu/drm/drm_vma_manager.c
|
.. kernel-doc:: drivers/gpu/drm/drm_vma_manager.c
|
||||||
:doc: vma offset manager
|
:doc: vma offset manager
|
||||||
|
|
||||||
.. kernel-doc:: drivers/gpu/drm/drm_vma_manager.c
|
|
||||||
:export:
|
|
||||||
|
|
||||||
.. kernel-doc:: include/drm/drm_vma_manager.h
|
.. kernel-doc:: include/drm/drm_vma_manager.h
|
||||||
:internal:
|
:internal:
|
||||||
|
|
||||||
|
.. kernel-doc:: drivers/gpu/drm/drm_vma_manager.c
|
||||||
|
:export:
|
||||||
|
|
||||||
PRIME Buffer Sharing
|
PRIME Buffer Sharing
|
||||||
====================
|
====================
|
||||||
|
|
||||||
@@ -449,6 +449,9 @@ PRIME Helper Functions
|
|||||||
PRIME Function References
|
PRIME Function References
|
||||||
-------------------------
|
-------------------------
|
||||||
|
|
||||||
|
.. kernel-doc:: include/drm/drm_prime.h
|
||||||
|
:internal:
|
||||||
|
|
||||||
.. kernel-doc:: drivers/gpu/drm/drm_prime.c
|
.. kernel-doc:: drivers/gpu/drm/drm_prime.c
|
||||||
:export:
|
:export:
|
||||||
|
|
||||||
@@ -470,12 +473,12 @@ LRU Scan/Eviction Support
|
|||||||
DRM MM Range Allocator Function References
|
DRM MM Range Allocator Function References
|
||||||
------------------------------------------
|
------------------------------------------
|
||||||
|
|
||||||
.. kernel-doc:: drivers/gpu/drm/drm_mm.c
|
|
||||||
:export:
|
|
||||||
|
|
||||||
.. kernel-doc:: include/drm/drm_mm.h
|
.. kernel-doc:: include/drm/drm_mm.h
|
||||||
:internal:
|
:internal:
|
||||||
|
|
||||||
|
.. kernel-doc:: drivers/gpu/drm/drm_mm.c
|
||||||
|
:export:
|
||||||
|
|
||||||
DRM Cache Handling
|
DRM Cache Handling
|
||||||
==================
|
==================
|
||||||
|
|
||||||
|
@@ -21,6 +21,8 @@ libdrm Device Lookup
|
|||||||
:doc: getunique and setversion story
|
:doc: getunique and setversion story
|
||||||
|
|
||||||
|
|
||||||
|
.. _drm_primary_node:
|
||||||
|
|
||||||
Primary Nodes, DRM Master and Authentication
|
Primary Nodes, DRM Master and Authentication
|
||||||
============================================
|
============================================
|
||||||
|
|
||||||
@@ -103,6 +105,8 @@ is already rather painful for the DRM subsystem, with multiple different uAPIs
|
|||||||
for the same thing co-existing. If we add a few more complete mistakes into the
|
for the same thing co-existing. If we add a few more complete mistakes into the
|
||||||
mix every year it would be entirely unmanageable.
|
mix every year it would be entirely unmanageable.
|
||||||
|
|
||||||
|
.. _drm_render_node:
|
||||||
|
|
||||||
Render nodes
|
Render nodes
|
||||||
============
|
============
|
||||||
|
|
||||||
|
@@ -153,6 +153,19 @@ following drivers still use ``struct_mutex``: ``msm``, ``omapdrm`` and
|
|||||||
|
|
||||||
Contact: Daniel Vetter
|
Contact: Daniel Vetter
|
||||||
|
|
||||||
|
Switch to drm_connector_list_iter for any connector_list walking
|
||||||
|
----------------------------------------------------------------
|
||||||
|
|
||||||
|
Connectors can be hotplugged, and we now have a special list of helpers to walk
|
||||||
|
the connector_list in a race-free fashion, without incurring deadlocks on
|
||||||
|
mutexes and other fun stuff.
|
||||||
|
|
||||||
|
Unfortunately most drivers are not converted yet. At least all those supporting
|
||||||
|
DP MST hotplug should be converted, since for those drivers the difference
|
||||||
|
matters. See drm_for_each_connector_iter() vs. drm_for_each_connector().
|
||||||
|
|
||||||
|
Contact: Daniel Vetter
|
||||||
|
|
||||||
Core refactorings
|
Core refactorings
|
||||||
=================
|
=================
|
||||||
|
|
||||||
|
@@ -1006,7 +1006,8 @@ accept_redirects - BOOLEAN
|
|||||||
FALSE (router)
|
FALSE (router)
|
||||||
|
|
||||||
forwarding - BOOLEAN
|
forwarding - BOOLEAN
|
||||||
Enable IP forwarding on this interface.
|
Enable IP forwarding on this interface. This controls whether packets
|
||||||
|
received _on_ this interface can be forwarded.
|
||||||
|
|
||||||
mc_forwarding - BOOLEAN
|
mc_forwarding - BOOLEAN
|
||||||
Do multicast routing. The kernel needs to be compiled with CONFIG_MROUTE
|
Do multicast routing. The kernel needs to be compiled with CONFIG_MROUTE
|
||||||
|
@@ -97,7 +97,7 @@ should contain the phy name as given in the dt data and in the case of
|
|||||||
non-dt boot, it should contain the label of the PHY. The two
|
non-dt boot, it should contain the label of the PHY. The two
|
||||||
devm_phy_get associates the device with the PHY using devres on
|
devm_phy_get associates the device with the PHY using devres on
|
||||||
successful PHY get. On driver detach, release function is invoked on
|
successful PHY get. On driver detach, release function is invoked on
|
||||||
the the devres data and devres data is freed. phy_optional_get and
|
the devres data and devres data is freed. phy_optional_get and
|
||||||
devm_phy_optional_get should be used when the phy is optional. These
|
devm_phy_optional_get should be used when the phy is optional. These
|
||||||
two functions will never return -ENODEV, but instead returns NULL when
|
two functions will never return -ENODEV, but instead returns NULL when
|
||||||
the phy cannot be found.Some generic drivers, such as ehci, may use multiple
|
the phy cannot be found.Some generic drivers, such as ehci, may use multiple
|
||||||
|
@@ -318,9 +318,10 @@ PDF outputs, it is recommended to use version 1.4.6.
|
|||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
Please notice that, for PDF and LaTeX output, you'll also need ``XeLaTeX``
|
Please notice that, for PDF and LaTeX output, you'll also need ``XeLaTeX``
|
||||||
version 3.14159265. Depending on the distribution, you may also need
|
version 3.14159265. Depending on the distribution, you may also need to
|
||||||
to install a series of ``texlive`` packages that provide the minimal
|
install a series of ``texlive`` packages that provide the minimal set of
|
||||||
set of functionalities required for ``XeLaTex`` to work.
|
functionalities required for ``XeLaTex`` to work. For PDF output you'll also
|
||||||
|
need ``convert(1)`` from ImageMagick (https://www.imagemagick.org).
|
||||||
|
|
||||||
Other tools
|
Other tools
|
||||||
-----------
|
-----------
|
||||||
|
551
Documentation/sphinx/kfigure.py
Normal file
551
Documentation/sphinx/kfigure.py
Normal file
@@ -0,0 +1,551 @@
|
|||||||
|
# -*- coding: utf-8; mode: python -*-
|
||||||
|
# pylint: disable=C0103, R0903, R0912, R0915
|
||||||
|
u"""
|
||||||
|
scalable figure and image handling
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Sphinx extension which implements scalable image handling.
|
||||||
|
|
||||||
|
:copyright: Copyright (C) 2016 Markus Heiser
|
||||||
|
:license: GPL Version 2, June 1991 see Linux/COPYING for details.
|
||||||
|
|
||||||
|
The build for image formats depend on image's source format and output's
|
||||||
|
destination format. This extension implement methods to simplify image
|
||||||
|
handling from the author's POV. Directives like ``kernel-figure`` implement
|
||||||
|
methods *to* always get the best output-format even if some tools are not
|
||||||
|
installed. For more details take a look at ``convert_image(...)`` which is
|
||||||
|
the core of all conversions.
|
||||||
|
|
||||||
|
* ``.. kernel-image``: for image handling / a ``.. image::`` replacement
|
||||||
|
|
||||||
|
* ``.. kernel-figure``: for figure handling / a ``.. figure::`` replacement
|
||||||
|
|
||||||
|
* ``.. kernel-render``: for render markup / a concept to embed *render*
|
||||||
|
markups (or languages). Supported markups (see ``RENDER_MARKUP_EXT``)
|
||||||
|
|
||||||
|
- ``DOT``: render embedded Graphviz's **DOC**
|
||||||
|
- ``SVG``: render embedded Scalable Vector Graphics (**SVG**)
|
||||||
|
- ... *developable*
|
||||||
|
|
||||||
|
Used tools:
|
||||||
|
|
||||||
|
* ``dot(1)``: Graphviz (http://www.graphviz.org). If Graphviz is not
|
||||||
|
available, the DOT language is inserted as literal-block.
|
||||||
|
|
||||||
|
* SVG to PDF: To generate PDF, you need at least one of this tools:
|
||||||
|
|
||||||
|
- ``convert(1)``: ImageMagick (https://www.imagemagick.org)
|
||||||
|
|
||||||
|
List of customizations:
|
||||||
|
|
||||||
|
* generate PDF from SVG / used by PDF (LaTeX) builder
|
||||||
|
|
||||||
|
* generate SVG (html-builder) and PDF (latex-builder) from DOT files.
|
||||||
|
DOT: see http://www.graphviz.org/content/dot-language
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
from os import path
|
||||||
|
import subprocess
|
||||||
|
from hashlib import sha1
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from docutils import nodes
|
||||||
|
from docutils.statemachine import ViewList
|
||||||
|
from docutils.parsers.rst import directives
|
||||||
|
from docutils.parsers.rst.directives import images
|
||||||
|
import sphinx
|
||||||
|
|
||||||
|
from sphinx.util.nodes import clean_astext
|
||||||
|
from six import iteritems
|
||||||
|
|
||||||
|
PY3 = sys.version_info[0] == 3
|
||||||
|
|
||||||
|
if PY3:
|
||||||
|
_unicode = str
|
||||||
|
else:
|
||||||
|
_unicode = unicode
|
||||||
|
|
||||||
|
# Get Sphinx version
|
||||||
|
major, minor, patch = sphinx.version_info[:3]
|
||||||
|
if major == 1 and minor > 3:
|
||||||
|
# patches.Figure only landed in Sphinx 1.4
|
||||||
|
from sphinx.directives.patches import Figure # pylint: disable=C0413
|
||||||
|
else:
|
||||||
|
Figure = images.Figure
|
||||||
|
|
||||||
|
__version__ = '1.0.0'
|
||||||
|
|
||||||
|
# simple helper
|
||||||
|
# -------------
|
||||||
|
|
||||||
|
def which(cmd):
|
||||||
|
"""Searches the ``cmd`` in the ``PATH`` enviroment.
|
||||||
|
|
||||||
|
This *which* searches the PATH for executable ``cmd`` . First match is
|
||||||
|
returned, if nothing is found, ``None` is returned.
|
||||||
|
"""
|
||||||
|
envpath = os.environ.get('PATH', None) or os.defpath
|
||||||
|
for folder in envpath.split(os.pathsep):
|
||||||
|
fname = folder + os.sep + cmd
|
||||||
|
if path.isfile(fname):
|
||||||
|
return fname
|
||||||
|
|
||||||
|
def mkdir(folder, mode=0o775):
|
||||||
|
if not path.isdir(folder):
|
||||||
|
os.makedirs(folder, mode)
|
||||||
|
|
||||||
|
def file2literal(fname):
|
||||||
|
with open(fname, "r") as src:
|
||||||
|
data = src.read()
|
||||||
|
node = nodes.literal_block(data, data)
|
||||||
|
return node
|
||||||
|
|
||||||
|
def isNewer(path1, path2):
|
||||||
|
"""Returns True if ``path1`` is newer than ``path2``
|
||||||
|
|
||||||
|
If ``path1`` exists and is newer than ``path2`` the function returns
|
||||||
|
``True`` is returned otherwise ``False``
|
||||||
|
"""
|
||||||
|
return (path.exists(path1)
|
||||||
|
and os.stat(path1).st_ctime > os.stat(path2).st_ctime)
|
||||||
|
|
||||||
|
def pass_handle(self, node): # pylint: disable=W0613
|
||||||
|
pass
|
||||||
|
|
||||||
|
# setup conversion tools and sphinx extension
|
||||||
|
# -------------------------------------------
|
||||||
|
|
||||||
|
# Graphviz's dot(1) support
|
||||||
|
dot_cmd = None
|
||||||
|
|
||||||
|
# ImageMagick' convert(1) support
|
||||||
|
convert_cmd = None
|
||||||
|
|
||||||
|
|
||||||
|
def setup(app):
|
||||||
|
# check toolchain first
|
||||||
|
app.connect('builder-inited', setupTools)
|
||||||
|
|
||||||
|
# image handling
|
||||||
|
app.add_directive("kernel-image", KernelImage)
|
||||||
|
app.add_node(kernel_image,
|
||||||
|
html = (visit_kernel_image, pass_handle),
|
||||||
|
latex = (visit_kernel_image, pass_handle),
|
||||||
|
texinfo = (visit_kernel_image, pass_handle),
|
||||||
|
text = (visit_kernel_image, pass_handle),
|
||||||
|
man = (visit_kernel_image, pass_handle), )
|
||||||
|
|
||||||
|
# figure handling
|
||||||
|
app.add_directive("kernel-figure", KernelFigure)
|
||||||
|
app.add_node(kernel_figure,
|
||||||
|
html = (visit_kernel_figure, pass_handle),
|
||||||
|
latex = (visit_kernel_figure, pass_handle),
|
||||||
|
texinfo = (visit_kernel_figure, pass_handle),
|
||||||
|
text = (visit_kernel_figure, pass_handle),
|
||||||
|
man = (visit_kernel_figure, pass_handle), )
|
||||||
|
|
||||||
|
# render handling
|
||||||
|
app.add_directive('kernel-render', KernelRender)
|
||||||
|
app.add_node(kernel_render,
|
||||||
|
html = (visit_kernel_render, pass_handle),
|
||||||
|
latex = (visit_kernel_render, pass_handle),
|
||||||
|
texinfo = (visit_kernel_render, pass_handle),
|
||||||
|
text = (visit_kernel_render, pass_handle),
|
||||||
|
man = (visit_kernel_render, pass_handle), )
|
||||||
|
|
||||||
|
app.connect('doctree-read', add_kernel_figure_to_std_domain)
|
||||||
|
|
||||||
|
return dict(
|
||||||
|
version = __version__,
|
||||||
|
parallel_read_safe = True,
|
||||||
|
parallel_write_safe = True
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def setupTools(app):
|
||||||
|
u"""
|
||||||
|
Check available build tools and log some *verbose* messages.
|
||||||
|
|
||||||
|
This function is called once, when the builder is initiated.
|
||||||
|
"""
|
||||||
|
global dot_cmd, convert_cmd # pylint: disable=W0603
|
||||||
|
app.verbose("kfigure: check installed tools ...")
|
||||||
|
|
||||||
|
dot_cmd = which('dot')
|
||||||
|
convert_cmd = which('convert')
|
||||||
|
|
||||||
|
if dot_cmd:
|
||||||
|
app.verbose("use dot(1) from: " + dot_cmd)
|
||||||
|
else:
|
||||||
|
app.warn("dot(1) not found, for better output quality install "
|
||||||
|
"graphviz from http://www.graphviz.org")
|
||||||
|
if convert_cmd:
|
||||||
|
app.verbose("use convert(1) from: " + convert_cmd)
|
||||||
|
else:
|
||||||
|
app.warn(
|
||||||
|
"convert(1) not found, for SVG to PDF conversion install "
|
||||||
|
"ImageMagick (https://www.imagemagick.org)")
|
||||||
|
|
||||||
|
|
||||||
|
# integrate conversion tools
|
||||||
|
# --------------------------
|
||||||
|
|
||||||
|
RENDER_MARKUP_EXT = {
|
||||||
|
# The '.ext' must be handled by convert_image(..) function's *in_ext* input.
|
||||||
|
# <name> : <.ext>
|
||||||
|
'DOT' : '.dot',
|
||||||
|
'SVG' : '.svg'
|
||||||
|
}
|
||||||
|
|
||||||
|
def convert_image(img_node, translator, src_fname=None):
|
||||||
|
"""Convert a image node for the builder.
|
||||||
|
|
||||||
|
Different builder prefer different image formats, e.g. *latex* builder
|
||||||
|
prefer PDF while *html* builder prefer SVG format for images.
|
||||||
|
|
||||||
|
This function handles output image formats in dependence of source the
|
||||||
|
format (of the image) and the translator's output format.
|
||||||
|
"""
|
||||||
|
app = translator.builder.app
|
||||||
|
|
||||||
|
fname, in_ext = path.splitext(path.basename(img_node['uri']))
|
||||||
|
if src_fname is None:
|
||||||
|
src_fname = path.join(translator.builder.srcdir, img_node['uri'])
|
||||||
|
if not path.exists(src_fname):
|
||||||
|
src_fname = path.join(translator.builder.outdir, img_node['uri'])
|
||||||
|
|
||||||
|
dst_fname = None
|
||||||
|
|
||||||
|
# in kernel builds, use 'make SPHINXOPTS=-v' to see verbose messages
|
||||||
|
|
||||||
|
app.verbose('assert best format for: ' + img_node['uri'])
|
||||||
|
|
||||||
|
if in_ext == '.dot':
|
||||||
|
|
||||||
|
if not dot_cmd:
|
||||||
|
app.verbose("dot from graphviz not available / include DOT raw.")
|
||||||
|
img_node.replace_self(file2literal(src_fname))
|
||||||
|
|
||||||
|
elif translator.builder.format == 'latex':
|
||||||
|
dst_fname = path.join(translator.builder.outdir, fname + '.pdf')
|
||||||
|
img_node['uri'] = fname + '.pdf'
|
||||||
|
img_node['candidates'] = {'*': fname + '.pdf'}
|
||||||
|
|
||||||
|
|
||||||
|
elif translator.builder.format == 'html':
|
||||||
|
dst_fname = path.join(
|
||||||
|
translator.builder.outdir,
|
||||||
|
translator.builder.imagedir,
|
||||||
|
fname + '.svg')
|
||||||
|
img_node['uri'] = path.join(
|
||||||
|
translator.builder.imgpath, fname + '.svg')
|
||||||
|
img_node['candidates'] = {
|
||||||
|
'*': path.join(translator.builder.imgpath, fname + '.svg')}
|
||||||
|
|
||||||
|
else:
|
||||||
|
# all other builder formats will include DOT as raw
|
||||||
|
img_node.replace_self(file2literal(src_fname))
|
||||||
|
|
||||||
|
elif in_ext == '.svg':
|
||||||
|
|
||||||
|
if translator.builder.format == 'latex':
|
||||||
|
if convert_cmd is None:
|
||||||
|
app.verbose("no SVG to PDF conversion available / include SVG raw.")
|
||||||
|
img_node.replace_self(file2literal(src_fname))
|
||||||
|
else:
|
||||||
|
dst_fname = path.join(translator.builder.outdir, fname + '.pdf')
|
||||||
|
img_node['uri'] = fname + '.pdf'
|
||||||
|
img_node['candidates'] = {'*': fname + '.pdf'}
|
||||||
|
|
||||||
|
if dst_fname:
|
||||||
|
# the builder needs not to copy one more time, so pop it if exists.
|
||||||
|
translator.builder.images.pop(img_node['uri'], None)
|
||||||
|
_name = dst_fname[len(translator.builder.outdir) + 1:]
|
||||||
|
|
||||||
|
if isNewer(dst_fname, src_fname):
|
||||||
|
app.verbose("convert: {out}/%s already exists and is newer" % _name)
|
||||||
|
|
||||||
|
else:
|
||||||
|
ok = False
|
||||||
|
mkdir(path.dirname(dst_fname))
|
||||||
|
|
||||||
|
if in_ext == '.dot':
|
||||||
|
app.verbose('convert DOT to: {out}/' + _name)
|
||||||
|
ok = dot2format(app, src_fname, dst_fname)
|
||||||
|
|
||||||
|
elif in_ext == '.svg':
|
||||||
|
app.verbose('convert SVG to: {out}/' + _name)
|
||||||
|
ok = svg2pdf(app, src_fname, dst_fname)
|
||||||
|
|
||||||
|
if not ok:
|
||||||
|
img_node.replace_self(file2literal(src_fname))
|
||||||
|
|
||||||
|
|
||||||
|
def dot2format(app, dot_fname, out_fname):
|
||||||
|
"""Converts DOT file to ``out_fname`` using ``dot(1)``.
|
||||||
|
|
||||||
|
* ``dot_fname`` pathname of the input DOT file, including extension ``.dot``
|
||||||
|
* ``out_fname`` pathname of the output file, including format extension
|
||||||
|
|
||||||
|
The *format extension* depends on the ``dot`` command (see ``man dot``
|
||||||
|
option ``-Txxx``). Normally you will use one of the following extensions:
|
||||||
|
|
||||||
|
- ``.ps`` for PostScript,
|
||||||
|
- ``.svg`` or ``svgz`` for Structured Vector Graphics,
|
||||||
|
- ``.fig`` for XFIG graphics and
|
||||||
|
- ``.png`` or ``gif`` for common bitmap graphics.
|
||||||
|
|
||||||
|
"""
|
||||||
|
out_format = path.splitext(out_fname)[1][1:]
|
||||||
|
cmd = [dot_cmd, '-T%s' % out_format, dot_fname]
|
||||||
|
exit_code = 42
|
||||||
|
|
||||||
|
with open(out_fname, "w") as out:
|
||||||
|
exit_code = subprocess.call(cmd, stdout = out)
|
||||||
|
if exit_code != 0:
|
||||||
|
app.warn("Error #%d when calling: %s" % (exit_code, " ".join(cmd)))
|
||||||
|
return bool(exit_code == 0)
|
||||||
|
|
||||||
|
def svg2pdf(app, svg_fname, pdf_fname):
|
||||||
|
"""Converts SVG to PDF with ``convert(1)`` command.
|
||||||
|
|
||||||
|
Uses ``convert(1)`` from ImageMagick (https://www.imagemagick.org) for
|
||||||
|
conversion. Returns ``True`` on success and ``False`` if an error occurred.
|
||||||
|
|
||||||
|
* ``svg_fname`` pathname of the input SVG file with extension (``.svg``)
|
||||||
|
* ``pdf_name`` pathname of the output PDF file with extension (``.pdf``)
|
||||||
|
|
||||||
|
"""
|
||||||
|
cmd = [convert_cmd, svg_fname, pdf_fname]
|
||||||
|
# use stdout and stderr from parent
|
||||||
|
exit_code = subprocess.call(cmd)
|
||||||
|
if exit_code != 0:
|
||||||
|
app.warn("Error #%d when calling: %s" % (exit_code, " ".join(cmd)))
|
||||||
|
return bool(exit_code == 0)
|
||||||
|
|
||||||
|
|
||||||
|
# image handling
|
||||||
|
# ---------------------
|
||||||
|
|
||||||
|
def visit_kernel_image(self, node): # pylint: disable=W0613
|
||||||
|
"""Visitor of the ``kernel_image`` Node.
|
||||||
|
|
||||||
|
Handles the ``image`` child-node with the ``convert_image(...)``.
|
||||||
|
"""
|
||||||
|
img_node = node[0]
|
||||||
|
convert_image(img_node, self)
|
||||||
|
|
||||||
|
class kernel_image(nodes.image):
|
||||||
|
"""Node for ``kernel-image`` directive."""
|
||||||
|
pass
|
||||||
|
|
||||||
|
class KernelImage(images.Image):
|
||||||
|
u"""KernelImage directive
|
||||||
|
|
||||||
|
Earns everything from ``.. image::`` directive, except *remote URI* and
|
||||||
|
*glob* pattern. The KernelImage wraps a image node into a
|
||||||
|
kernel_image node. See ``visit_kernel_image``.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
uri = self.arguments[0]
|
||||||
|
if uri.endswith('.*') or uri.find('://') != -1:
|
||||||
|
raise self.severe(
|
||||||
|
'Error in "%s: %s": glob pattern and remote images are not allowed'
|
||||||
|
% (self.name, uri))
|
||||||
|
result = images.Image.run(self)
|
||||||
|
if len(result) == 2 or isinstance(result[0], nodes.system_message):
|
||||||
|
return result
|
||||||
|
(image_node,) = result
|
||||||
|
# wrap image node into a kernel_image node / see visitors
|
||||||
|
node = kernel_image('', image_node)
|
||||||
|
return [node]
|
||||||
|
|
||||||
|
# figure handling
|
||||||
|
# ---------------------
|
||||||
|
|
||||||
|
def visit_kernel_figure(self, node): # pylint: disable=W0613
|
||||||
|
"""Visitor of the ``kernel_figure`` Node.
|
||||||
|
|
||||||
|
Handles the ``image`` child-node with the ``convert_image(...)``.
|
||||||
|
"""
|
||||||
|
img_node = node[0][0]
|
||||||
|
convert_image(img_node, self)
|
||||||
|
|
||||||
|
class kernel_figure(nodes.figure):
|
||||||
|
"""Node for ``kernel-figure`` directive."""
|
||||||
|
|
||||||
|
class KernelFigure(Figure):
|
||||||
|
u"""KernelImage directive
|
||||||
|
|
||||||
|
Earns everything from ``.. figure::`` directive, except *remote URI* and
|
||||||
|
*glob* pattern. The KernelFigure wraps a figure node into a kernel_figure
|
||||||
|
node. See ``visit_kernel_figure``.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
uri = self.arguments[0]
|
||||||
|
if uri.endswith('.*') or uri.find('://') != -1:
|
||||||
|
raise self.severe(
|
||||||
|
'Error in "%s: %s":'
|
||||||
|
' glob pattern and remote images are not allowed'
|
||||||
|
% (self.name, uri))
|
||||||
|
result = Figure.run(self)
|
||||||
|
if len(result) == 2 or isinstance(result[0], nodes.system_message):
|
||||||
|
return result
|
||||||
|
(figure_node,) = result
|
||||||
|
# wrap figure node into a kernel_figure node / see visitors
|
||||||
|
node = kernel_figure('', figure_node)
|
||||||
|
return [node]
|
||||||
|
|
||||||
|
|
||||||
|
# render handling
|
||||||
|
# ---------------------
|
||||||
|
|
||||||
|
def visit_kernel_render(self, node):
|
||||||
|
"""Visitor of the ``kernel_render`` Node.
|
||||||
|
|
||||||
|
If rendering tools available, save the markup of the ``literal_block`` child
|
||||||
|
node into a file and replace the ``literal_block`` node with a new created
|
||||||
|
``image`` node, pointing to the saved markup file. Afterwards, handle the
|
||||||
|
image child-node with the ``convert_image(...)``.
|
||||||
|
"""
|
||||||
|
app = self.builder.app
|
||||||
|
srclang = node.get('srclang')
|
||||||
|
|
||||||
|
app.verbose('visit kernel-render node lang: "%s"' % (srclang))
|
||||||
|
|
||||||
|
tmp_ext = RENDER_MARKUP_EXT.get(srclang, None)
|
||||||
|
if tmp_ext is None:
|
||||||
|
app.warn('kernel-render: "%s" unknow / include raw.' % (srclang))
|
||||||
|
return
|
||||||
|
|
||||||
|
if not dot_cmd and tmp_ext == '.dot':
|
||||||
|
app.verbose("dot from graphviz not available / include raw.")
|
||||||
|
return
|
||||||
|
|
||||||
|
literal_block = node[0]
|
||||||
|
|
||||||
|
code = literal_block.astext()
|
||||||
|
hashobj = code.encode('utf-8') # str(node.attributes)
|
||||||
|
fname = path.join('%s-%s' % (srclang, sha1(hashobj).hexdigest()))
|
||||||
|
|
||||||
|
tmp_fname = path.join(
|
||||||
|
self.builder.outdir, self.builder.imagedir, fname + tmp_ext)
|
||||||
|
|
||||||
|
if not path.isfile(tmp_fname):
|
||||||
|
mkdir(path.dirname(tmp_fname))
|
||||||
|
with open(tmp_fname, "w") as out:
|
||||||
|
out.write(code)
|
||||||
|
|
||||||
|
img_node = nodes.image(node.rawsource, **node.attributes)
|
||||||
|
img_node['uri'] = path.join(self.builder.imgpath, fname + tmp_ext)
|
||||||
|
img_node['candidates'] = {
|
||||||
|
'*': path.join(self.builder.imgpath, fname + tmp_ext)}
|
||||||
|
|
||||||
|
literal_block.replace_self(img_node)
|
||||||
|
convert_image(img_node, self, tmp_fname)
|
||||||
|
|
||||||
|
|
||||||
|
class kernel_render(nodes.General, nodes.Inline, nodes.Element):
|
||||||
|
"""Node for ``kernel-render`` directive."""
|
||||||
|
pass
|
||||||
|
|
||||||
|
class KernelRender(Figure):
|
||||||
|
u"""KernelRender directive
|
||||||
|
|
||||||
|
Render content by external tool. Has all the options known from the
|
||||||
|
*figure* directive, plus option ``caption``. If ``caption`` has a
|
||||||
|
value, a figure node with the *caption* is inserted. If not, a image node is
|
||||||
|
inserted.
|
||||||
|
|
||||||
|
The KernelRender directive wraps the text of the directive into a
|
||||||
|
literal_block node and wraps it into a kernel_render node. See
|
||||||
|
``visit_kernel_render``.
|
||||||
|
"""
|
||||||
|
has_content = True
|
||||||
|
required_arguments = 1
|
||||||
|
optional_arguments = 0
|
||||||
|
final_argument_whitespace = False
|
||||||
|
|
||||||
|
# earn options from 'figure'
|
||||||
|
option_spec = Figure.option_spec.copy()
|
||||||
|
option_spec['caption'] = directives.unchanged
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
return [self.build_node()]
|
||||||
|
|
||||||
|
def build_node(self):
|
||||||
|
|
||||||
|
srclang = self.arguments[0].strip()
|
||||||
|
if srclang not in RENDER_MARKUP_EXT.keys():
|
||||||
|
return [self.state_machine.reporter.warning(
|
||||||
|
'Unknow source language "%s", use one of: %s.' % (
|
||||||
|
srclang, ",".join(RENDER_MARKUP_EXT.keys())),
|
||||||
|
line=self.lineno)]
|
||||||
|
|
||||||
|
code = '\n'.join(self.content)
|
||||||
|
if not code.strip():
|
||||||
|
return [self.state_machine.reporter.warning(
|
||||||
|
'Ignoring "%s" directive without content.' % (
|
||||||
|
self.name),
|
||||||
|
line=self.lineno)]
|
||||||
|
|
||||||
|
node = kernel_render()
|
||||||
|
node['alt'] = self.options.get('alt','')
|
||||||
|
node['srclang'] = srclang
|
||||||
|
literal_node = nodes.literal_block(code, code)
|
||||||
|
node += literal_node
|
||||||
|
|
||||||
|
caption = self.options.get('caption')
|
||||||
|
if caption:
|
||||||
|
# parse caption's content
|
||||||
|
parsed = nodes.Element()
|
||||||
|
self.state.nested_parse(
|
||||||
|
ViewList([caption], source=''), self.content_offset, parsed)
|
||||||
|
caption_node = nodes.caption(
|
||||||
|
parsed[0].rawsource, '', *parsed[0].children)
|
||||||
|
caption_node.source = parsed[0].source
|
||||||
|
caption_node.line = parsed[0].line
|
||||||
|
|
||||||
|
figure_node = nodes.figure('', node)
|
||||||
|
for k,v in self.options.items():
|
||||||
|
figure_node[k] = v
|
||||||
|
figure_node += caption_node
|
||||||
|
|
||||||
|
node = figure_node
|
||||||
|
|
||||||
|
return node
|
||||||
|
|
||||||
|
def add_kernel_figure_to_std_domain(app, doctree):
|
||||||
|
"""Add kernel-figure anchors to 'std' domain.
|
||||||
|
|
||||||
|
The ``StandardDomain.process_doc(..)`` method does not know how to resolve
|
||||||
|
the caption (label) of ``kernel-figure`` directive (it only knows about
|
||||||
|
standard nodes, e.g. table, figure etc.). Without any additional handling
|
||||||
|
this will result in a 'undefined label' for kernel-figures.
|
||||||
|
|
||||||
|
This handle adds labels of kernel-figure to the 'std' domain labels.
|
||||||
|
"""
|
||||||
|
|
||||||
|
std = app.env.domains["std"]
|
||||||
|
docname = app.env.docname
|
||||||
|
labels = std.data["labels"]
|
||||||
|
|
||||||
|
for name, explicit in iteritems(doctree.nametypes):
|
||||||
|
if not explicit:
|
||||||
|
continue
|
||||||
|
labelid = doctree.nameids[name]
|
||||||
|
if labelid is None:
|
||||||
|
continue
|
||||||
|
node = doctree.ids[labelid]
|
||||||
|
|
||||||
|
if node.tagname == 'kernel_figure':
|
||||||
|
for n in node.next_node():
|
||||||
|
if n.tagname == 'caption':
|
||||||
|
sectname = clean_astext(n)
|
||||||
|
# add label to std domain
|
||||||
|
labels[name] = docname, labelid, sectname
|
||||||
|
break
|
@@ -12,7 +12,7 @@ kprobes can probe (this means, all functions body except for __kprobes
|
|||||||
functions). Unlike the Tracepoint based event, this can be added and removed
|
functions). Unlike the Tracepoint based event, this can be added and removed
|
||||||
dynamically, on the fly.
|
dynamically, on the fly.
|
||||||
|
|
||||||
To enable this feature, build your kernel with CONFIG_KPROBE_EVENT=y.
|
To enable this feature, build your kernel with CONFIG_KPROBE_EVENTS=y.
|
||||||
|
|
||||||
Similar to the events tracer, this doesn't need to be activated via
|
Similar to the events tracer, this doesn't need to be activated via
|
||||||
current_tracer. Instead of that, add probe points via
|
current_tracer. Instead of that, add probe points via
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
Overview
|
Overview
|
||||||
--------
|
--------
|
||||||
Uprobe based trace events are similar to kprobe based trace events.
|
Uprobe based trace events are similar to kprobe based trace events.
|
||||||
To enable this feature, build your kernel with CONFIG_UPROBE_EVENT=y.
|
To enable this feature, build your kernel with CONFIG_UPROBE_EVENTS=y.
|
||||||
|
|
||||||
Similar to the kprobe-event tracer, this doesn't need to be activated via
|
Similar to the kprobe-event tracer, this doesn't need to be activated via
|
||||||
current_tracer. Instead of that, add probe points via
|
current_tracer. Instead of that, add probe points via
|
||||||
|
@@ -951,6 +951,10 @@ This ioctl allows the user to create or modify a guest physical memory
|
|||||||
slot. When changing an existing slot, it may be moved in the guest
|
slot. When changing an existing slot, it may be moved in the guest
|
||||||
physical memory space, or its flags may be modified. It may not be
|
physical memory space, or its flags may be modified. It may not be
|
||||||
resized. Slots may not overlap in guest physical address space.
|
resized. Slots may not overlap in guest physical address space.
|
||||||
|
Bits 0-15 of "slot" specifies the slot id and this value should be
|
||||||
|
less than the maximum number of user memory slots supported per VM.
|
||||||
|
The maximum allowed slots can be queried using KVM_CAP_NR_MEMSLOTS,
|
||||||
|
if this capability is supported by the architecture.
|
||||||
|
|
||||||
If KVM_CAP_MULTI_ADDRESS_SPACE is available, bits 16-31 of "slot"
|
If KVM_CAP_MULTI_ADDRESS_SPACE is available, bits 16-31 of "slot"
|
||||||
specifies the address space which is being modified. They must be
|
specifies the address space which is being modified. They must be
|
||||||
|
@@ -172,10 +172,6 @@ the same read(2) protocol as for the page fault notifications. The
|
|||||||
manager has to explicitly enable these events by setting appropriate
|
manager has to explicitly enable these events by setting appropriate
|
||||||
bits in uffdio_api.features passed to UFFDIO_API ioctl:
|
bits in uffdio_api.features passed to UFFDIO_API ioctl:
|
||||||
|
|
||||||
UFFD_FEATURE_EVENT_EXIT - enable notification about exit() of the
|
|
||||||
non-cooperative process. When the monitored process exits, the uffd
|
|
||||||
manager will get UFFD_EVENT_EXIT.
|
|
||||||
|
|
||||||
UFFD_FEATURE_EVENT_FORK - enable userfaultfd hooks for fork(). When
|
UFFD_FEATURE_EVENT_FORK - enable userfaultfd hooks for fork(). When
|
||||||
this feature is enabled, the userfaultfd context of the parent process
|
this feature is enabled, the userfaultfd context of the parent process
|
||||||
is duplicated into the newly created process. The manager receives
|
is duplicated into the newly created process. The manager receives
|
||||||
|
@@ -8123,6 +8123,14 @@ L: linux-wireless@vger.kernel.org
|
|||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/net/wireless/mediatek/mt7601u/
|
F: drivers/net/wireless/mediatek/mt7601u/
|
||||||
|
|
||||||
|
MEGACHIPS STDPXXXX-GE-B850V3-FW LVDS/DP++ BRIDGES
|
||||||
|
M: Peter Senna Tschudin <peter.senna@collabora.com>
|
||||||
|
M: Martin Donnelly <martin.donnelly@ge.com>
|
||||||
|
M: Martyn Welch <martyn.welch@collabora.co.uk>
|
||||||
|
S: Maintained
|
||||||
|
F: drivers/gpu/drm/bridge/megachips-stdpxxxx-ge-b850v3-fw.c
|
||||||
|
F: Documentation/devicetree/bindings/video/bridge/megachips-stdpxxxx-ge-b850v3-fw.txt
|
||||||
|
|
||||||
MEGARAID SCSI/SAS DRIVERS
|
MEGARAID SCSI/SAS DRIVERS
|
||||||
M: Kashyap Desai <kashyap.desai@broadcom.com>
|
M: Kashyap Desai <kashyap.desai@broadcom.com>
|
||||||
M: Sumit Saxena <sumit.saxena@broadcom.com>
|
M: Sumit Saxena <sumit.saxena@broadcom.com>
|
||||||
@@ -8313,7 +8321,6 @@ M: Richard Leitner <richard.leitner@skidata.com>
|
|||||||
L: linux-usb@vger.kernel.org
|
L: linux-usb@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/usb/misc/usb251xb.c
|
F: drivers/usb/misc/usb251xb.c
|
||||||
F: include/linux/platform_data/usb251xb.h
|
|
||||||
F: Documentation/devicetree/bindings/usb/usb251xb.txt
|
F: Documentation/devicetree/bindings/usb/usb251xb.txt
|
||||||
|
|
||||||
MICROSOFT SURFACE PRO 3 BUTTON DRIVER
|
MICROSOFT SURFACE PRO 3 BUTTON DRIVER
|
||||||
|
2
Makefile
2
Makefile
@@ -1,7 +1,7 @@
|
|||||||
VERSION = 4
|
VERSION = 4
|
||||||
PATCHLEVEL = 11
|
PATCHLEVEL = 11
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION = -rc1
|
EXTRAVERSION = -rc3
|
||||||
NAME = Fearless Coyote
|
NAME = Fearless Coyote
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
@@ -11,6 +11,7 @@
|
|||||||
#define _ASM_ARC_HUGEPAGE_H
|
#define _ASM_ARC_HUGEPAGE_H
|
||||||
|
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
|
#define __ARCH_USE_5LEVEL_HACK
|
||||||
#include <asm-generic/pgtable-nopmd.h>
|
#include <asm-generic/pgtable-nopmd.h>
|
||||||
|
|
||||||
static inline pte_t pmd_pte(pmd_t pmd)
|
static inline pte_t pmd_pte(pmd_t pmd)
|
||||||
|
@@ -37,6 +37,7 @@
|
|||||||
|
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
#include <asm/mmu.h>
|
#include <asm/mmu.h>
|
||||||
|
#define __ARCH_USE_5LEVEL_HACK
|
||||||
#include <asm-generic/pgtable-nopmd.h>
|
#include <asm-generic/pgtable-nopmd.h>
|
||||||
#include <linux/const.h>
|
#include <linux/const.h>
|
||||||
|
|
||||||
|
@@ -209,6 +209,7 @@
|
|||||||
#define HSR_EC_IABT_HYP (0x21)
|
#define HSR_EC_IABT_HYP (0x21)
|
||||||
#define HSR_EC_DABT (0x24)
|
#define HSR_EC_DABT (0x24)
|
||||||
#define HSR_EC_DABT_HYP (0x25)
|
#define HSR_EC_DABT_HYP (0x25)
|
||||||
|
#define HSR_EC_MAX (0x3f)
|
||||||
|
|
||||||
#define HSR_WFI_IS_WFE (_AC(1, UL) << 0)
|
#define HSR_WFI_IS_WFE (_AC(1, UL) << 0)
|
||||||
|
|
||||||
|
@@ -30,7 +30,6 @@
|
|||||||
#define __KVM_HAVE_ARCH_INTC_INITIALIZED
|
#define __KVM_HAVE_ARCH_INTC_INITIALIZED
|
||||||
|
|
||||||
#define KVM_USER_MEM_SLOTS 32
|
#define KVM_USER_MEM_SLOTS 32
|
||||||
#define KVM_PRIVATE_MEM_SLOTS 4
|
|
||||||
#define KVM_COALESCED_MMIO_PAGE_OFFSET 1
|
#define KVM_COALESCED_MMIO_PAGE_OFFSET 1
|
||||||
#define KVM_HAVE_ONE_REG
|
#define KVM_HAVE_ONE_REG
|
||||||
#define KVM_HALT_POLL_NS_DEFAULT 500000
|
#define KVM_HALT_POLL_NS_DEFAULT 500000
|
||||||
|
@@ -20,6 +20,7 @@
|
|||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
#define __ARCH_USE_5LEVEL_HACK
|
||||||
#include <asm-generic/pgtable-nopud.h>
|
#include <asm-generic/pgtable-nopud.h>
|
||||||
#include <asm/memory.h>
|
#include <asm/memory.h>
|
||||||
#include <asm/pgtable-hwdef.h>
|
#include <asm/pgtable-hwdef.h>
|
||||||
|
@@ -221,6 +221,9 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
|
|||||||
case KVM_CAP_MAX_VCPUS:
|
case KVM_CAP_MAX_VCPUS:
|
||||||
r = KVM_MAX_VCPUS;
|
r = KVM_MAX_VCPUS;
|
||||||
break;
|
break;
|
||||||
|
case KVM_CAP_NR_MEMSLOTS:
|
||||||
|
r = KVM_USER_MEM_SLOTS;
|
||||||
|
break;
|
||||||
case KVM_CAP_MSI_DEVID:
|
case KVM_CAP_MSI_DEVID:
|
||||||
if (!kvm)
|
if (!kvm)
|
||||||
r = -EINVAL;
|
r = -EINVAL;
|
||||||
|
@@ -79,7 +79,19 @@ static int kvm_handle_wfx(struct kvm_vcpu *vcpu, struct kvm_run *run)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int kvm_handle_unknown_ec(struct kvm_vcpu *vcpu, struct kvm_run *run)
|
||||||
|
{
|
||||||
|
u32 hsr = kvm_vcpu_get_hsr(vcpu);
|
||||||
|
|
||||||
|
kvm_pr_unimpl("Unknown exception class: hsr: %#08x\n",
|
||||||
|
hsr);
|
||||||
|
|
||||||
|
kvm_inject_undefined(vcpu);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static exit_handle_fn arm_exit_handlers[] = {
|
static exit_handle_fn arm_exit_handlers[] = {
|
||||||
|
[0 ... HSR_EC_MAX] = kvm_handle_unknown_ec,
|
||||||
[HSR_EC_WFI] = kvm_handle_wfx,
|
[HSR_EC_WFI] = kvm_handle_wfx,
|
||||||
[HSR_EC_CP15_32] = kvm_handle_cp15_32,
|
[HSR_EC_CP15_32] = kvm_handle_cp15_32,
|
||||||
[HSR_EC_CP15_64] = kvm_handle_cp15_64,
|
[HSR_EC_CP15_64] = kvm_handle_cp15_64,
|
||||||
@@ -98,13 +110,6 @@ static exit_handle_fn kvm_get_exit_handler(struct kvm_vcpu *vcpu)
|
|||||||
{
|
{
|
||||||
u8 hsr_ec = kvm_vcpu_trap_get_class(vcpu);
|
u8 hsr_ec = kvm_vcpu_trap_get_class(vcpu);
|
||||||
|
|
||||||
if (hsr_ec >= ARRAY_SIZE(arm_exit_handlers) ||
|
|
||||||
!arm_exit_handlers[hsr_ec]) {
|
|
||||||
kvm_err("Unknown exception class: hsr: %#08x\n",
|
|
||||||
(unsigned int)kvm_vcpu_get_hsr(vcpu));
|
|
||||||
BUG();
|
|
||||||
}
|
|
||||||
|
|
||||||
return arm_exit_handlers[hsr_ec];
|
return arm_exit_handlers[hsr_ec];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -411,3 +411,4 @@
|
|||||||
394 common pkey_mprotect sys_pkey_mprotect
|
394 common pkey_mprotect sys_pkey_mprotect
|
||||||
395 common pkey_alloc sys_pkey_alloc
|
395 common pkey_alloc sys_pkey_alloc
|
||||||
396 common pkey_free sys_pkey_free
|
396 common pkey_free sys_pkey_free
|
||||||
|
397 common statx sys_statx
|
||||||
|
@@ -198,6 +198,8 @@ static const struct dma_map_ops xen_swiotlb_dma_ops = {
|
|||||||
.unmap_page = xen_swiotlb_unmap_page,
|
.unmap_page = xen_swiotlb_unmap_page,
|
||||||
.dma_supported = xen_swiotlb_dma_supported,
|
.dma_supported = xen_swiotlb_dma_supported,
|
||||||
.set_dma_mask = xen_swiotlb_set_dma_mask,
|
.set_dma_mask = xen_swiotlb_set_dma_mask,
|
||||||
|
.mmap = xen_swiotlb_dma_mmap,
|
||||||
|
.get_sgtable = xen_swiotlb_get_sgtable,
|
||||||
};
|
};
|
||||||
|
|
||||||
int __init xen_mm_init(void)
|
int __init xen_mm_init(void)
|
||||||
|
@@ -508,6 +508,16 @@ config QCOM_FALKOR_ERRATUM_1009
|
|||||||
|
|
||||||
If unsure, say Y.
|
If unsure, say Y.
|
||||||
|
|
||||||
|
config QCOM_QDF2400_ERRATUM_0065
|
||||||
|
bool "QDF2400 E0065: Incorrect GITS_TYPER.ITT_Entry_size"
|
||||||
|
default y
|
||||||
|
help
|
||||||
|
On Qualcomm Datacenter Technologies QDF2400 SoC, ITS hardware reports
|
||||||
|
ITE size incorrectly. The GITS_TYPER.ITT_Entry_size field should have
|
||||||
|
been indicated as 16Bytes (0xf), not 8Bytes (0x7).
|
||||||
|
|
||||||
|
If unsure, say Y.
|
||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
|
||||||
|
|
||||||
@@ -1063,6 +1073,10 @@ config SYSVIPC_COMPAT
|
|||||||
def_bool y
|
def_bool y
|
||||||
depends on COMPAT && SYSVIPC
|
depends on COMPAT && SYSVIPC
|
||||||
|
|
||||||
|
config KEYS_COMPAT
|
||||||
|
def_bool y
|
||||||
|
depends on COMPAT && KEYS
|
||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
|
||||||
menu "Power management options"
|
menu "Power management options"
|
||||||
|
@@ -251,7 +251,7 @@ static inline bool system_supports_fpsimd(void)
|
|||||||
static inline bool system_uses_ttbr0_pan(void)
|
static inline bool system_uses_ttbr0_pan(void)
|
||||||
{
|
{
|
||||||
return IS_ENABLED(CONFIG_ARM64_SW_TTBR0_PAN) &&
|
return IS_ENABLED(CONFIG_ARM64_SW_TTBR0_PAN) &&
|
||||||
!cpus_have_cap(ARM64_HAS_PAN);
|
!cpus_have_const_cap(ARM64_HAS_PAN);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* __ASSEMBLY__ */
|
#endif /* __ASSEMBLY__ */
|
||||||
|
@@ -30,8 +30,7 @@
|
|||||||
|
|
||||||
#define __KVM_HAVE_ARCH_INTC_INITIALIZED
|
#define __KVM_HAVE_ARCH_INTC_INITIALIZED
|
||||||
|
|
||||||
#define KVM_USER_MEM_SLOTS 32
|
#define KVM_USER_MEM_SLOTS 512
|
||||||
#define KVM_PRIVATE_MEM_SLOTS 4
|
|
||||||
#define KVM_COALESCED_MMIO_PAGE_OFFSET 1
|
#define KVM_COALESCED_MMIO_PAGE_OFFSET 1
|
||||||
#define KVM_HALT_POLL_NS_DEFAULT 500000
|
#define KVM_HALT_POLL_NS_DEFAULT 500000
|
||||||
|
|
||||||
|
@@ -55,9 +55,13 @@ typedef struct { pteval_t pgprot; } pgprot_t;
|
|||||||
#define __pgprot(x) ((pgprot_t) { (x) } )
|
#define __pgprot(x) ((pgprot_t) { (x) } )
|
||||||
|
|
||||||
#if CONFIG_PGTABLE_LEVELS == 2
|
#if CONFIG_PGTABLE_LEVELS == 2
|
||||||
|
#define __ARCH_USE_5LEVEL_HACK
|
||||||
#include <asm-generic/pgtable-nopmd.h>
|
#include <asm-generic/pgtable-nopmd.h>
|
||||||
#elif CONFIG_PGTABLE_LEVELS == 3
|
#elif CONFIG_PGTABLE_LEVELS == 3
|
||||||
|
#define __ARCH_USE_5LEVEL_HACK
|
||||||
#include <asm-generic/pgtable-nopud.h>
|
#include <asm-generic/pgtable-nopud.h>
|
||||||
|
#elif CONFIG_PGTABLE_LEVELS == 4
|
||||||
|
#include <asm-generic/5level-fixup.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* __ASM_PGTABLE_TYPES_H */
|
#endif /* __ASM_PGTABLE_TYPES_H */
|
||||||
|
@@ -30,7 +30,7 @@ int arm_cpuidle_init(unsigned int cpu)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* cpu_suspend() - function to enter a low-power idle state
|
* arm_cpuidle_suspend() - function to enter a low-power idle state
|
||||||
* @arg: argument to pass to CPU suspend operations
|
* @arg: argument to pass to CPU suspend operations
|
||||||
*
|
*
|
||||||
* Return: 0 on success, -EOPNOTSUPP if CPU suspend hook not initialized, CPU
|
* Return: 0 on success, -EOPNOTSUPP if CPU suspend hook not initialized, CPU
|
||||||
|
@@ -372,12 +372,6 @@ int __kprobes kprobe_fault_handler(struct pt_regs *regs, unsigned int fsr)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int __kprobes kprobe_exceptions_notify(struct notifier_block *self,
|
|
||||||
unsigned long val, void *data)
|
|
||||||
{
|
|
||||||
return NOTIFY_DONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void __kprobes kprobe_handler(struct pt_regs *regs)
|
static void __kprobes kprobe_handler(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
struct kprobe *p, *cur_kprobe;
|
struct kprobe *p, *cur_kprobe;
|
||||||
|
@@ -135,7 +135,19 @@ static int kvm_handle_guest_debug(struct kvm_vcpu *vcpu, struct kvm_run *run)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int kvm_handle_unknown_ec(struct kvm_vcpu *vcpu, struct kvm_run *run)
|
||||||
|
{
|
||||||
|
u32 hsr = kvm_vcpu_get_hsr(vcpu);
|
||||||
|
|
||||||
|
kvm_pr_unimpl("Unknown exception class: hsr: %#08x -- %s\n",
|
||||||
|
hsr, esr_get_class_string(hsr));
|
||||||
|
|
||||||
|
kvm_inject_undefined(vcpu);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static exit_handle_fn arm_exit_handlers[] = {
|
static exit_handle_fn arm_exit_handlers[] = {
|
||||||
|
[0 ... ESR_ELx_EC_MAX] = kvm_handle_unknown_ec,
|
||||||
[ESR_ELx_EC_WFx] = kvm_handle_wfx,
|
[ESR_ELx_EC_WFx] = kvm_handle_wfx,
|
||||||
[ESR_ELx_EC_CP15_32] = kvm_handle_cp15_32,
|
[ESR_ELx_EC_CP15_32] = kvm_handle_cp15_32,
|
||||||
[ESR_ELx_EC_CP15_64] = kvm_handle_cp15_64,
|
[ESR_ELx_EC_CP15_64] = kvm_handle_cp15_64,
|
||||||
@@ -162,13 +174,6 @@ static exit_handle_fn kvm_get_exit_handler(struct kvm_vcpu *vcpu)
|
|||||||
u32 hsr = kvm_vcpu_get_hsr(vcpu);
|
u32 hsr = kvm_vcpu_get_hsr(vcpu);
|
||||||
u8 hsr_ec = ESR_ELx_EC(hsr);
|
u8 hsr_ec = ESR_ELx_EC(hsr);
|
||||||
|
|
||||||
if (hsr_ec >= ARRAY_SIZE(arm_exit_handlers) ||
|
|
||||||
!arm_exit_handlers[hsr_ec]) {
|
|
||||||
kvm_err("Unknown exception class: hsr: %#08x -- %s\n",
|
|
||||||
hsr, esr_get_class_string(hsr));
|
|
||||||
BUG();
|
|
||||||
}
|
|
||||||
|
|
||||||
return arm_exit_handlers[hsr_ec];
|
return arm_exit_handlers[hsr_ec];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -18,14 +18,62 @@
|
|||||||
#include <asm/kvm_hyp.h>
|
#include <asm/kvm_hyp.h>
|
||||||
#include <asm/tlbflush.h>
|
#include <asm/tlbflush.h>
|
||||||
|
|
||||||
|
static void __hyp_text __tlb_switch_to_guest_vhe(struct kvm *kvm)
|
||||||
|
{
|
||||||
|
u64 val;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* With VHE enabled, we have HCR_EL2.{E2H,TGE} = {1,1}, and
|
||||||
|
* most TLB operations target EL2/EL0. In order to affect the
|
||||||
|
* guest TLBs (EL1/EL0), we need to change one of these two
|
||||||
|
* bits. Changing E2H is impossible (goodbye TTBR1_EL2), so
|
||||||
|
* let's flip TGE before executing the TLB operation.
|
||||||
|
*/
|
||||||
|
write_sysreg(kvm->arch.vttbr, vttbr_el2);
|
||||||
|
val = read_sysreg(hcr_el2);
|
||||||
|
val &= ~HCR_TGE;
|
||||||
|
write_sysreg(val, hcr_el2);
|
||||||
|
isb();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __hyp_text __tlb_switch_to_guest_nvhe(struct kvm *kvm)
|
||||||
|
{
|
||||||
|
write_sysreg(kvm->arch.vttbr, vttbr_el2);
|
||||||
|
isb();
|
||||||
|
}
|
||||||
|
|
||||||
|
static hyp_alternate_select(__tlb_switch_to_guest,
|
||||||
|
__tlb_switch_to_guest_nvhe,
|
||||||
|
__tlb_switch_to_guest_vhe,
|
||||||
|
ARM64_HAS_VIRT_HOST_EXTN);
|
||||||
|
|
||||||
|
static void __hyp_text __tlb_switch_to_host_vhe(struct kvm *kvm)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* We're done with the TLB operation, let's restore the host's
|
||||||
|
* view of HCR_EL2.
|
||||||
|
*/
|
||||||
|
write_sysreg(0, vttbr_el2);
|
||||||
|
write_sysreg(HCR_HOST_VHE_FLAGS, hcr_el2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __hyp_text __tlb_switch_to_host_nvhe(struct kvm *kvm)
|
||||||
|
{
|
||||||
|
write_sysreg(0, vttbr_el2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static hyp_alternate_select(__tlb_switch_to_host,
|
||||||
|
__tlb_switch_to_host_nvhe,
|
||||||
|
__tlb_switch_to_host_vhe,
|
||||||
|
ARM64_HAS_VIRT_HOST_EXTN);
|
||||||
|
|
||||||
void __hyp_text __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa)
|
void __hyp_text __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa)
|
||||||
{
|
{
|
||||||
dsb(ishst);
|
dsb(ishst);
|
||||||
|
|
||||||
/* Switch to requested VMID */
|
/* Switch to requested VMID */
|
||||||
kvm = kern_hyp_va(kvm);
|
kvm = kern_hyp_va(kvm);
|
||||||
write_sysreg(kvm->arch.vttbr, vttbr_el2);
|
__tlb_switch_to_guest()(kvm);
|
||||||
isb();
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We could do so much better if we had the VA as well.
|
* We could do so much better if we had the VA as well.
|
||||||
@@ -46,7 +94,7 @@ void __hyp_text __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa)
|
|||||||
dsb(ish);
|
dsb(ish);
|
||||||
isb();
|
isb();
|
||||||
|
|
||||||
write_sysreg(0, vttbr_el2);
|
__tlb_switch_to_host()(kvm);
|
||||||
}
|
}
|
||||||
|
|
||||||
void __hyp_text __kvm_tlb_flush_vmid(struct kvm *kvm)
|
void __hyp_text __kvm_tlb_flush_vmid(struct kvm *kvm)
|
||||||
@@ -55,14 +103,13 @@ void __hyp_text __kvm_tlb_flush_vmid(struct kvm *kvm)
|
|||||||
|
|
||||||
/* Switch to requested VMID */
|
/* Switch to requested VMID */
|
||||||
kvm = kern_hyp_va(kvm);
|
kvm = kern_hyp_va(kvm);
|
||||||
write_sysreg(kvm->arch.vttbr, vttbr_el2);
|
__tlb_switch_to_guest()(kvm);
|
||||||
isb();
|
|
||||||
|
|
||||||
__tlbi(vmalls12e1is);
|
__tlbi(vmalls12e1is);
|
||||||
dsb(ish);
|
dsb(ish);
|
||||||
isb();
|
isb();
|
||||||
|
|
||||||
write_sysreg(0, vttbr_el2);
|
__tlb_switch_to_host()(kvm);
|
||||||
}
|
}
|
||||||
|
|
||||||
void __hyp_text __kvm_tlb_flush_local_vmid(struct kvm_vcpu *vcpu)
|
void __hyp_text __kvm_tlb_flush_local_vmid(struct kvm_vcpu *vcpu)
|
||||||
@@ -70,14 +117,13 @@ void __hyp_text __kvm_tlb_flush_local_vmid(struct kvm_vcpu *vcpu)
|
|||||||
struct kvm *kvm = kern_hyp_va(kern_hyp_va(vcpu)->kvm);
|
struct kvm *kvm = kern_hyp_va(kern_hyp_va(vcpu)->kvm);
|
||||||
|
|
||||||
/* Switch to requested VMID */
|
/* Switch to requested VMID */
|
||||||
write_sysreg(kvm->arch.vttbr, vttbr_el2);
|
__tlb_switch_to_guest()(kvm);
|
||||||
isb();
|
|
||||||
|
|
||||||
__tlbi(vmalle1);
|
__tlbi(vmalle1);
|
||||||
dsb(nsh);
|
dsb(nsh);
|
||||||
isb();
|
isb();
|
||||||
|
|
||||||
write_sysreg(0, vttbr_el2);
|
__tlb_switch_to_host()(kvm);
|
||||||
}
|
}
|
||||||
|
|
||||||
void __hyp_text __kvm_flush_vm_context(void)
|
void __hyp_text __kvm_flush_vm_context(void)
|
||||||
|
@@ -162,7 +162,7 @@ void __init kasan_init(void)
|
|||||||
clear_pgds(KASAN_SHADOW_START, KASAN_SHADOW_END);
|
clear_pgds(KASAN_SHADOW_START, KASAN_SHADOW_END);
|
||||||
|
|
||||||
vmemmap_populate(kimg_shadow_start, kimg_shadow_end,
|
vmemmap_populate(kimg_shadow_start, kimg_shadow_end,
|
||||||
pfn_to_nid(virt_to_pfn(_text)));
|
pfn_to_nid(virt_to_pfn(lm_alias(_text))));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* vmemmap_populate() has populated the shadow region that covers the
|
* vmemmap_populate() has populated the shadow region that covers the
|
||||||
|
@@ -8,6 +8,7 @@
|
|||||||
#ifndef __ASM_AVR32_PGTABLE_2LEVEL_H
|
#ifndef __ASM_AVR32_PGTABLE_2LEVEL_H
|
||||||
#define __ASM_AVR32_PGTABLE_2LEVEL_H
|
#define __ASM_AVR32_PGTABLE_2LEVEL_H
|
||||||
|
|
||||||
|
#define __ARCH_USE_5LEVEL_HACK
|
||||||
#include <asm-generic/pgtable-nopmd.h>
|
#include <asm-generic/pgtable-nopmd.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -14,7 +14,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/oprofile.h>
|
#include <linux/oprofile.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/ptrace.h>
|
||||||
#include <linux/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
|
|
||||||
/* The first two words of each frame on the stack look like this if we have
|
/* The first two words of each frame on the stack look like this if we have
|
||||||
|
@@ -2086,7 +2086,7 @@ static void cryptocop_job_queue_close(void)
|
|||||||
dma_in_cfg.en = regk_dma_no;
|
dma_in_cfg.en = regk_dma_no;
|
||||||
REG_WR(dma, IN_DMA_INST, rw_cfg, dma_in_cfg);
|
REG_WR(dma, IN_DMA_INST, rw_cfg, dma_in_cfg);
|
||||||
|
|
||||||
/* Disble the cryptocop. */
|
/* Disable the cryptocop. */
|
||||||
rw_cfg = REG_RD(strcop, regi_strcop, rw_cfg);
|
rw_cfg = REG_RD(strcop, regi_strcop, rw_cfg);
|
||||||
rw_cfg.en = 0;
|
rw_cfg.en = 0;
|
||||||
REG_WR(strcop, regi_strcop, rw_cfg, rw_cfg);
|
REG_WR(strcop, regi_strcop, rw_cfg, rw_cfg);
|
||||||
|
@@ -6,6 +6,7 @@
|
|||||||
#define _CRIS_PGTABLE_H
|
#define _CRIS_PGTABLE_H
|
||||||
|
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
|
#define __ARCH_USE_5LEVEL_HACK
|
||||||
#include <asm-generic/pgtable-nopmd.h>
|
#include <asm-generic/pgtable-nopmd.h>
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
@@ -16,6 +16,7 @@
|
|||||||
#ifndef _ASM_PGTABLE_H
|
#ifndef _ASM_PGTABLE_H
|
||||||
#define _ASM_PGTABLE_H
|
#define _ASM_PGTABLE_H
|
||||||
|
|
||||||
|
#include <asm-generic/5level-fixup.h>
|
||||||
#include <asm/mem-layout.h>
|
#include <asm/mem-layout.h>
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
#ifndef _H8300_PGTABLE_H
|
#ifndef _H8300_PGTABLE_H
|
||||||
#define _H8300_PGTABLE_H
|
#define _H8300_PGTABLE_H
|
||||||
|
#define __ARCH_USE_5LEVEL_HACK
|
||||||
#include <asm-generic/pgtable-nopud.h>
|
#include <asm-generic/pgtable-nopud.h>
|
||||||
#include <asm-generic/pgtable.h>
|
#include <asm-generic/pgtable.h>
|
||||||
#define pgtable_cache_init() do { } while (0)
|
#define pgtable_cache_init() do { } while (0)
|
||||||
|
@@ -9,7 +9,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched/signal.h>
|
||||||
#include <asm/ptrace.h>
|
#include <asm/ptrace.h>
|
||||||
|
|
||||||
#define BREAKINST 0x5730 /* trapa #3 */
|
#define BREAKINST 0x5730 /* trapa #3 */
|
||||||
|
@@ -26,6 +26,7 @@
|
|||||||
*/
|
*/
|
||||||
#include <linux/swap.h>
|
#include <linux/swap.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
|
#define __ARCH_USE_5LEVEL_HACK
|
||||||
#include <asm-generic/pgtable-nopmd.h>
|
#include <asm-generic/pgtable-nopmd.h>
|
||||||
|
|
||||||
/* A handy thing to have if one has the RAM. Declared in head.S */
|
/* A handy thing to have if one has the RAM. Declared in head.S */
|
||||||
|
@@ -587,8 +587,10 @@ extern struct page *zero_page_memmap_ptr;
|
|||||||
|
|
||||||
|
|
||||||
#if CONFIG_PGTABLE_LEVELS == 3
|
#if CONFIG_PGTABLE_LEVELS == 3
|
||||||
|
#define __ARCH_USE_5LEVEL_HACK
|
||||||
#include <asm-generic/pgtable-nopud.h>
|
#include <asm-generic/pgtable-nopud.h>
|
||||||
#endif
|
#endif
|
||||||
|
#include <asm-generic/5level-fixup.h>
|
||||||
#include <asm-generic/pgtable.h>
|
#include <asm-generic/pgtable.h>
|
||||||
|
|
||||||
#endif /* _ASM_IA64_PGTABLE_H */
|
#endif /* _ASM_IA64_PGTABLE_H */
|
||||||
|
@@ -6,6 +6,7 @@
|
|||||||
#define _METAG_PGTABLE_H
|
#define _METAG_PGTABLE_H
|
||||||
|
|
||||||
#include <asm/pgtable-bits.h>
|
#include <asm/pgtable-bits.h>
|
||||||
|
#define __ARCH_USE_5LEVEL_HACK
|
||||||
#include <asm-generic/pgtable-nopmd.h>
|
#include <asm-generic/pgtable-nopmd.h>
|
||||||
|
|
||||||
/* Invalid regions on Meta: 0x00000000-0x001FFFFF and 0xFFFF0000-0xFFFFFFFF */
|
/* Invalid regions on Meta: 0x00000000-0x001FFFFF and 0xFFFF0000-0xFFFFFFFF */
|
||||||
|
@@ -95,7 +95,8 @@ typedef struct { unsigned long pgd; } pgd_t;
|
|||||||
# else /* CONFIG_MMU */
|
# else /* CONFIG_MMU */
|
||||||
typedef struct { unsigned long ste[64]; } pmd_t;
|
typedef struct { unsigned long ste[64]; } pmd_t;
|
||||||
typedef struct { pmd_t pue[1]; } pud_t;
|
typedef struct { pmd_t pue[1]; } pud_t;
|
||||||
typedef struct { pud_t pge[1]; } pgd_t;
|
typedef struct { pud_t p4e[1]; } p4d_t;
|
||||||
|
typedef struct { p4d_t pge[1]; } pgd_t;
|
||||||
# endif /* CONFIG_MMU */
|
# endif /* CONFIG_MMU */
|
||||||
|
|
||||||
# define pte_val(x) ((x).pte)
|
# define pte_val(x) ((x).pte)
|
||||||
|
@@ -10,7 +10,9 @@
|
|||||||
#include <linux/irqflags.h>
|
#include <linux/irqflags.h>
|
||||||
#include <linux/notifier.h>
|
#include <linux/notifier.h>
|
||||||
#include <linux/prefetch.h>
|
#include <linux/prefetch.h>
|
||||||
|
#include <linux/ptrace.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
|
#include <linux/sched/task_stack.h>
|
||||||
|
|
||||||
#include <asm/cop2.h>
|
#include <asm/cop2.h>
|
||||||
#include <asm/current.h>
|
#include <asm/current.h>
|
||||||
|
@@ -9,6 +9,7 @@
|
|||||||
#include <asm/cop2.h>
|
#include <asm/cop2.h>
|
||||||
#include <linux/export.h>
|
#include <linux/export.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
|
#include <linux/sched/task_stack.h>
|
||||||
|
|
||||||
#include "octeon-crypto.h"
|
#include "octeon-crypto.h"
|
||||||
|
|
||||||
|
@@ -12,6 +12,7 @@
|
|||||||
#include <linux/kernel_stat.h>
|
#include <linux/kernel_stat.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/sched/hotplug.h>
|
#include <linux/sched/hotplug.h>
|
||||||
|
#include <linux/sched/task_stack.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/export.h>
|
#include <linux/export.h>
|
||||||
|
|
||||||
|
@@ -12,6 +12,7 @@
|
|||||||
|
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/sched/task_stack.h>
|
#include <linux/sched/task_stack.h>
|
||||||
|
#include <linux/ptrace.h>
|
||||||
#include <linux/thread_info.h>
|
#include <linux/thread_info.h>
|
||||||
#include <linux/bitops.h>
|
#include <linux/bitops.h>
|
||||||
|
|
||||||
|
@@ -16,6 +16,7 @@
|
|||||||
#include <asm/cachectl.h>
|
#include <asm/cachectl.h>
|
||||||
#include <asm/fixmap.h>
|
#include <asm/fixmap.h>
|
||||||
|
|
||||||
|
#define __ARCH_USE_5LEVEL_HACK
|
||||||
#include <asm-generic/pgtable-nopmd.h>
|
#include <asm-generic/pgtable-nopmd.h>
|
||||||
|
|
||||||
extern int temp_tlb_entry;
|
extern int temp_tlb_entry;
|
||||||
|
@@ -17,6 +17,7 @@
|
|||||||
#include <asm/cachectl.h>
|
#include <asm/cachectl.h>
|
||||||
#include <asm/fixmap.h>
|
#include <asm/fixmap.h>
|
||||||
|
|
||||||
|
#define __ARCH_USE_5LEVEL_HACK
|
||||||
#if defined(CONFIG_PAGE_SIZE_64KB) && !defined(CONFIG_MIPS_VA_BITS_48)
|
#if defined(CONFIG_PAGE_SIZE_64KB) && !defined(CONFIG_MIPS_VA_BITS_48)
|
||||||
#include <asm-generic/pgtable-nopmd.h>
|
#include <asm-generic/pgtable-nopmd.h>
|
||||||
#else
|
#else
|
||||||
|
@@ -11,6 +11,7 @@
|
|||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/sched/hotplug.h>
|
#include <linux/sched/hotplug.h>
|
||||||
|
#include <linux/sched/task_stack.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/smp.h>
|
#include <linux/smp.h>
|
||||||
|
@@ -23,6 +23,7 @@
|
|||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/irqchip/mips-gic.h>
|
#include <linux/irqchip/mips-gic.h>
|
||||||
#include <linux/compiler.h>
|
#include <linux/compiler.h>
|
||||||
|
#include <linux/sched/task_stack.h>
|
||||||
#include <linux/smp.h>
|
#include <linux/smp.h>
|
||||||
|
|
||||||
#include <linux/atomic.h>
|
#include <linux/atomic.h>
|
||||||
|
@@ -13,6 +13,7 @@
|
|||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/notifier.h>
|
#include <linux/notifier.h>
|
||||||
|
#include <linux/ptrace.h>
|
||||||
|
|
||||||
#include <asm/fpu.h>
|
#include <asm/fpu.h>
|
||||||
#include <asm/cop2.h>
|
#include <asm/cop2.h>
|
||||||
|
@@ -35,6 +35,7 @@
|
|||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
#include <linux/sched/task_stack.h>
|
||||||
#include <linux/smp.h>
|
#include <linux/smp.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
|
|
||||||
|
@@ -9,11 +9,14 @@
|
|||||||
* Copyright (C) 2009 Wind River Systems,
|
* Copyright (C) 2009 Wind River Systems,
|
||||||
* written by Ralf Baechle <ralf@linux-mips.org>
|
* written by Ralf Baechle <ralf@linux-mips.org>
|
||||||
*/
|
*/
|
||||||
|
#include <linux/capability.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/irqflags.h>
|
#include <linux/irqflags.h>
|
||||||
#include <linux/notifier.h>
|
#include <linux/notifier.h>
|
||||||
#include <linux/prefetch.h>
|
#include <linux/prefetch.h>
|
||||||
|
#include <linux/ptrace.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
|
#include <linux/sched/task_stack.h>
|
||||||
|
|
||||||
#include <asm/cop2.h>
|
#include <asm/cop2.h>
|
||||||
#include <asm/current.h>
|
#include <asm/current.h>
|
||||||
|
@@ -9,6 +9,7 @@
|
|||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/sched/debug.h>
|
#include <linux/sched/debug.h>
|
||||||
|
#include <linux/sched/signal.h>
|
||||||
#include <linux/seq_file.h>
|
#include <linux/seq_file.h>
|
||||||
|
|
||||||
#include <asm/addrspace.h>
|
#include <asm/addrspace.h>
|
||||||
|
@@ -12,7 +12,9 @@
|
|||||||
#include <linux/signal.h> /* for SIGBUS */
|
#include <linux/signal.h> /* for SIGBUS */
|
||||||
#include <linux/sched.h> /* schow_regs(), force_sig() */
|
#include <linux/sched.h> /* schow_regs(), force_sig() */
|
||||||
#include <linux/sched/debug.h>
|
#include <linux/sched/debug.h>
|
||||||
|
#include <linux/sched/signal.h>
|
||||||
|
|
||||||
|
#include <asm/ptrace.h>
|
||||||
#include <asm/sn/addrs.h>
|
#include <asm/sn/addrs.h>
|
||||||
#include <asm/sn/arch.h>
|
#include <asm/sn/arch.h>
|
||||||
#include <asm/sn/sn0/hub.h>
|
#include <asm/sn/sn0/hub.h>
|
||||||
|
@@ -8,10 +8,13 @@
|
|||||||
*/
|
*/
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
|
#include <linux/sched/task_stack.h>
|
||||||
#include <linux/topology.h>
|
#include <linux/topology.h>
|
||||||
#include <linux/nodemask.h>
|
#include <linux/nodemask.h>
|
||||||
|
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
|
#include <asm/ptrace.h>
|
||||||
#include <asm/sn/arch.h>
|
#include <asm/sn/arch.h>
|
||||||
#include <asm/sn/gda.h>
|
#include <asm/sn/gda.h>
|
||||||
#include <asm/sn/intr.h>
|
#include <asm/sn/intr.h>
|
||||||
|
@@ -11,6 +11,7 @@
|
|||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/sched/debug.h>
|
#include <linux/sched/debug.h>
|
||||||
|
#include <linux/sched/signal.h>
|
||||||
#include <asm/traps.h>
|
#include <asm/traps.h>
|
||||||
#include <linux/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
#include <asm/addrspace.h>
|
#include <asm/addrspace.h>
|
||||||
|
@@ -13,6 +13,7 @@
|
|||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
|
#include <linux/sched/signal.h>
|
||||||
#include <linux/notifier.h>
|
#include <linux/notifier.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/rtc/ds1685.h>
|
#include <linux/rtc/ds1685.h>
|
||||||
|
@@ -57,6 +57,7 @@ typedef struct page *pgtable_t;
|
|||||||
#define __pgd(x) ((pgd_t) { (x) })
|
#define __pgd(x) ((pgd_t) { (x) })
|
||||||
#define __pgprot(x) ((pgprot_t) { (x) })
|
#define __pgprot(x) ((pgprot_t) { (x) })
|
||||||
|
|
||||||
|
#define __ARCH_USE_5LEVEL_HACK
|
||||||
#include <asm-generic/pgtable-nopmd.h>
|
#include <asm-generic/pgtable-nopmd.h>
|
||||||
|
|
||||||
#endif /* !__ASSEMBLY__ */
|
#endif /* !__ASSEMBLY__ */
|
||||||
|
@@ -22,6 +22,7 @@
|
|||||||
#include <asm/tlbflush.h>
|
#include <asm/tlbflush.h>
|
||||||
|
|
||||||
#include <asm/pgtable-bits.h>
|
#include <asm/pgtable-bits.h>
|
||||||
|
#define __ARCH_USE_5LEVEL_HACK
|
||||||
#include <asm-generic/pgtable-nopmd.h>
|
#include <asm-generic/pgtable-nopmd.h>
|
||||||
|
|
||||||
#define FIRST_USER_ADDRESS 0UL
|
#define FIRST_USER_ADDRESS 0UL
|
||||||
|
@@ -77,7 +77,11 @@ static inline unsigned long __xchg(unsigned long val, volatile void *ptr,
|
|||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define xchg(ptr, with) \
|
#define xchg(ptr, with) \
|
||||||
((typeof(*(ptr)))__xchg((unsigned long)(with), (ptr), sizeof(*(ptr))))
|
({ \
|
||||||
|
(__typeof__(*(ptr))) __xchg((unsigned long)(with), \
|
||||||
|
(ptr), \
|
||||||
|
sizeof(*(ptr))); \
|
||||||
|
})
|
||||||
|
|
||||||
#endif /* __ASM_OPENRISC_CMPXCHG_H */
|
#endif /* __ASM_OPENRISC_CMPXCHG_H */
|
||||||
|
@@ -25,6 +25,7 @@
|
|||||||
#ifndef __ASM_OPENRISC_PGTABLE_H
|
#ifndef __ASM_OPENRISC_PGTABLE_H
|
||||||
#define __ASM_OPENRISC_PGTABLE_H
|
#define __ASM_OPENRISC_PGTABLE_H
|
||||||
|
|
||||||
|
#define __ARCH_USE_5LEVEL_HACK
|
||||||
#include <asm-generic/pgtable-nopmd.h>
|
#include <asm-generic/pgtable-nopmd.h>
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
@@ -211,7 +211,7 @@ do { \
|
|||||||
case 1: __get_user_asm(x, ptr, retval, "l.lbz"); break; \
|
case 1: __get_user_asm(x, ptr, retval, "l.lbz"); break; \
|
||||||
case 2: __get_user_asm(x, ptr, retval, "l.lhz"); break; \
|
case 2: __get_user_asm(x, ptr, retval, "l.lhz"); break; \
|
||||||
case 4: __get_user_asm(x, ptr, retval, "l.lwz"); break; \
|
case 4: __get_user_asm(x, ptr, retval, "l.lwz"); break; \
|
||||||
case 8: __get_user_asm2(x, ptr, retval); \
|
case 8: __get_user_asm2(x, ptr, retval); break; \
|
||||||
default: (x) = __get_user_bad(); \
|
default: (x) = __get_user_bad(); \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
@@ -30,6 +30,7 @@
|
|||||||
#include <asm/hardirq.h>
|
#include <asm/hardirq.h>
|
||||||
#include <asm/delay.h>
|
#include <asm/delay.h>
|
||||||
#include <asm/pgalloc.h>
|
#include <asm/pgalloc.h>
|
||||||
|
#include <asm/pgtable.h>
|
||||||
|
|
||||||
#define DECLARE_EXPORT(name) extern void name(void); EXPORT_SYMBOL(name)
|
#define DECLARE_EXPORT(name) extern void name(void); EXPORT_SYMBOL(name)
|
||||||
|
|
||||||
@@ -42,6 +43,9 @@ DECLARE_EXPORT(__muldi3);
|
|||||||
DECLARE_EXPORT(__ashrdi3);
|
DECLARE_EXPORT(__ashrdi3);
|
||||||
DECLARE_EXPORT(__ashldi3);
|
DECLARE_EXPORT(__ashldi3);
|
||||||
DECLARE_EXPORT(__lshrdi3);
|
DECLARE_EXPORT(__lshrdi3);
|
||||||
|
DECLARE_EXPORT(__ucmpdi2);
|
||||||
|
|
||||||
|
EXPORT_SYMBOL(empty_zero_page);
|
||||||
EXPORT_SYMBOL(__copy_tofrom_user);
|
EXPORT_SYMBOL(__copy_tofrom_user);
|
||||||
|
EXPORT_SYMBOL(__clear_user);
|
||||||
EXPORT_SYMBOL(memset);
|
EXPORT_SYMBOL(memset);
|
||||||
|
@@ -90,6 +90,7 @@ void arch_cpu_idle(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void (*pm_power_off) (void) = machine_power_off;
|
void (*pm_power_off) (void) = machine_power_off;
|
||||||
|
EXPORT_SYMBOL(pm_power_off);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* When a process does an "exec", machine state like FPU and debug
|
* When a process does an "exec", machine state like FPU and debug
|
||||||
|
@@ -43,28 +43,9 @@ static inline void flush_kernel_dcache_page(struct page *page)
|
|||||||
|
|
||||||
#define flush_kernel_dcache_range(start,size) \
|
#define flush_kernel_dcache_range(start,size) \
|
||||||
flush_kernel_dcache_range_asm((start), (start)+(size));
|
flush_kernel_dcache_range_asm((start), (start)+(size));
|
||||||
/* vmap range flushes and invalidates. Architecturally, we don't need
|
|
||||||
* the invalidate, because the CPU should refuse to speculate once an
|
|
||||||
* area has been flushed, so invalidate is left empty */
|
|
||||||
static inline void flush_kernel_vmap_range(void *vaddr, int size)
|
|
||||||
{
|
|
||||||
unsigned long start = (unsigned long)vaddr;
|
|
||||||
|
|
||||||
flush_kernel_dcache_range_asm(start, start + size);
|
void flush_kernel_vmap_range(void *vaddr, int size);
|
||||||
}
|
void invalidate_kernel_vmap_range(void *vaddr, int size);
|
||||||
static inline void invalidate_kernel_vmap_range(void *vaddr, int size)
|
|
||||||
{
|
|
||||||
unsigned long start = (unsigned long)vaddr;
|
|
||||||
void *cursor = vaddr;
|
|
||||||
|
|
||||||
for ( ; cursor < vaddr + size; cursor += PAGE_SIZE) {
|
|
||||||
struct page *page = vmalloc_to_page(cursor);
|
|
||||||
|
|
||||||
if (test_and_clear_bit(PG_dcache_dirty, &page->flags))
|
|
||||||
flush_kernel_dcache_page(page);
|
|
||||||
}
|
|
||||||
flush_kernel_dcache_range_asm(start, start + size);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define flush_cache_vmap(start, end) flush_cache_all()
|
#define flush_cache_vmap(start, end) flush_cache_all()
|
||||||
#define flush_cache_vunmap(start, end) flush_cache_all()
|
#define flush_cache_vunmap(start, end) flush_cache_all()
|
||||||
|
@@ -32,7 +32,8 @@
|
|||||||
* that put_user is the same as __put_user, etc.
|
* that put_user is the same as __put_user, etc.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define access_ok(type, uaddr, size) (1)
|
#define access_ok(type, uaddr, size) \
|
||||||
|
( (uaddr) == (uaddr) )
|
||||||
|
|
||||||
#define put_user __put_user
|
#define put_user __put_user
|
||||||
#define get_user __get_user
|
#define get_user __get_user
|
||||||
|
@@ -362,8 +362,9 @@
|
|||||||
#define __NR_copy_file_range (__NR_Linux + 346)
|
#define __NR_copy_file_range (__NR_Linux + 346)
|
||||||
#define __NR_preadv2 (__NR_Linux + 347)
|
#define __NR_preadv2 (__NR_Linux + 347)
|
||||||
#define __NR_pwritev2 (__NR_Linux + 348)
|
#define __NR_pwritev2 (__NR_Linux + 348)
|
||||||
|
#define __NR_statx (__NR_Linux + 349)
|
||||||
|
|
||||||
#define __NR_Linux_syscalls (__NR_pwritev2 + 1)
|
#define __NR_Linux_syscalls (__NR_statx + 1)
|
||||||
|
|
||||||
|
|
||||||
#define __IGNORE_select /* newselect */
|
#define __IGNORE_select /* newselect */
|
||||||
|
@@ -616,3 +616,25 @@ flush_cache_page(struct vm_area_struct *vma, unsigned long vmaddr, unsigned long
|
|||||||
__flush_cache_page(vma, vmaddr, PFN_PHYS(pfn));
|
__flush_cache_page(vma, vmaddr, PFN_PHYS(pfn));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void flush_kernel_vmap_range(void *vaddr, int size)
|
||||||
|
{
|
||||||
|
unsigned long start = (unsigned long)vaddr;
|
||||||
|
|
||||||
|
if ((unsigned long)size > parisc_cache_flush_threshold)
|
||||||
|
flush_data_cache();
|
||||||
|
else
|
||||||
|
flush_kernel_dcache_range_asm(start, start + size);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(flush_kernel_vmap_range);
|
||||||
|
|
||||||
|
void invalidate_kernel_vmap_range(void *vaddr, int size)
|
||||||
|
{
|
||||||
|
unsigned long start = (unsigned long)vaddr;
|
||||||
|
|
||||||
|
if ((unsigned long)size > parisc_cache_flush_threshold)
|
||||||
|
flush_data_cache();
|
||||||
|
else
|
||||||
|
flush_kernel_dcache_range_asm(start, start + size);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(invalidate_kernel_vmap_range);
|
||||||
|
@@ -620,6 +620,10 @@ int apply_relocate_add(Elf_Shdr *sechdrs,
|
|||||||
*/
|
*/
|
||||||
*loc = fsel(val, addend);
|
*loc = fsel(val, addend);
|
||||||
break;
|
break;
|
||||||
|
case R_PARISC_SECREL32:
|
||||||
|
/* 32-bit section relative address. */
|
||||||
|
*loc = fsel(val, addend);
|
||||||
|
break;
|
||||||
case R_PARISC_DPREL21L:
|
case R_PARISC_DPREL21L:
|
||||||
/* left 21 bit of relative address */
|
/* left 21 bit of relative address */
|
||||||
val = lrsel(val - dp, addend);
|
val = lrsel(val - dp, addend);
|
||||||
@@ -807,6 +811,10 @@ int apply_relocate_add(Elf_Shdr *sechdrs,
|
|||||||
*/
|
*/
|
||||||
*loc = fsel(val, addend);
|
*loc = fsel(val, addend);
|
||||||
break;
|
break;
|
||||||
|
case R_PARISC_SECREL32:
|
||||||
|
/* 32-bit section relative address. */
|
||||||
|
*loc = fsel(val, addend);
|
||||||
|
break;
|
||||||
case R_PARISC_FPTR64:
|
case R_PARISC_FPTR64:
|
||||||
/* 64-bit function address */
|
/* 64-bit function address */
|
||||||
if(in_local(me, (void *)(val + addend))) {
|
if(in_local(me, (void *)(val + addend))) {
|
||||||
|
@@ -39,7 +39,7 @@
|
|||||||
* the PDC INTRIGUE calls. This is done to eliminate bugs introduced
|
* the PDC INTRIGUE calls. This is done to eliminate bugs introduced
|
||||||
* in various PDC revisions. The code is much more maintainable
|
* in various PDC revisions. The code is much more maintainable
|
||||||
* and reliable this way vs having to debug on every version of PDC
|
* and reliable this way vs having to debug on every version of PDC
|
||||||
* on every box.
|
* on every box.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/capability.h>
|
#include <linux/capability.h>
|
||||||
@@ -195,8 +195,8 @@ static int perf_config(uint32_t *image_ptr);
|
|||||||
static int perf_release(struct inode *inode, struct file *file);
|
static int perf_release(struct inode *inode, struct file *file);
|
||||||
static int perf_open(struct inode *inode, struct file *file);
|
static int perf_open(struct inode *inode, struct file *file);
|
||||||
static ssize_t perf_read(struct file *file, char __user *buf, size_t cnt, loff_t *ppos);
|
static ssize_t perf_read(struct file *file, char __user *buf, size_t cnt, loff_t *ppos);
|
||||||
static ssize_t perf_write(struct file *file, const char __user *buf, size_t count,
|
static ssize_t perf_write(struct file *file, const char __user *buf,
|
||||||
loff_t *ppos);
|
size_t count, loff_t *ppos);
|
||||||
static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
|
static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
|
||||||
static void perf_start_counters(void);
|
static void perf_start_counters(void);
|
||||||
static int perf_stop_counters(uint32_t *raddr);
|
static int perf_stop_counters(uint32_t *raddr);
|
||||||
@@ -222,7 +222,7 @@ extern void perf_intrigue_disable_perf_counters (void);
|
|||||||
/*
|
/*
|
||||||
* configure:
|
* configure:
|
||||||
*
|
*
|
||||||
* Configure the cpu with a given data image. First turn off the counters,
|
* Configure the cpu with a given data image. First turn off the counters,
|
||||||
* then download the image, then turn the counters back on.
|
* then download the image, then turn the counters back on.
|
||||||
*/
|
*/
|
||||||
static int perf_config(uint32_t *image_ptr)
|
static int perf_config(uint32_t *image_ptr)
|
||||||
@@ -234,7 +234,7 @@ static int perf_config(uint32_t *image_ptr)
|
|||||||
error = perf_stop_counters(raddr);
|
error = perf_stop_counters(raddr);
|
||||||
if (error != 0) {
|
if (error != 0) {
|
||||||
printk("perf_config: perf_stop_counters = %ld\n", error);
|
printk("perf_config: perf_stop_counters = %ld\n", error);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
printk("Preparing to write image\n");
|
printk("Preparing to write image\n");
|
||||||
@@ -242,7 +242,7 @@ printk("Preparing to write image\n");
|
|||||||
error = perf_write_image((uint64_t *)image_ptr);
|
error = perf_write_image((uint64_t *)image_ptr);
|
||||||
if (error != 0) {
|
if (error != 0) {
|
||||||
printk("perf_config: DOWNLOAD = %ld\n", error);
|
printk("perf_config: DOWNLOAD = %ld\n", error);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
printk("Preparing to start counters\n");
|
printk("Preparing to start counters\n");
|
||||||
@@ -254,7 +254,7 @@ printk("Preparing to start counters\n");
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Open the device and initialize all of its memory. The device is only
|
* Open the device and initialize all of its memory. The device is only
|
||||||
* opened once, but can be "queried" by multiple processes that know its
|
* opened once, but can be "queried" by multiple processes that know its
|
||||||
* file descriptor.
|
* file descriptor.
|
||||||
*/
|
*/
|
||||||
@@ -298,19 +298,19 @@ static ssize_t perf_read(struct file *file, char __user *buf, size_t cnt, loff_t
|
|||||||
* called on the processor that the download should happen
|
* called on the processor that the download should happen
|
||||||
* on.
|
* on.
|
||||||
*/
|
*/
|
||||||
static ssize_t perf_write(struct file *file, const char __user *buf, size_t count,
|
static ssize_t perf_write(struct file *file, const char __user *buf,
|
||||||
loff_t *ppos)
|
size_t count, loff_t *ppos)
|
||||||
{
|
{
|
||||||
size_t image_size;
|
size_t image_size;
|
||||||
uint32_t image_type;
|
uint32_t image_type;
|
||||||
uint32_t interface_type;
|
uint32_t interface_type;
|
||||||
uint32_t test;
|
uint32_t test;
|
||||||
|
|
||||||
if (perf_processor_interface == ONYX_INTF)
|
if (perf_processor_interface == ONYX_INTF)
|
||||||
image_size = PCXU_IMAGE_SIZE;
|
image_size = PCXU_IMAGE_SIZE;
|
||||||
else if (perf_processor_interface == CUDA_INTF)
|
else if (perf_processor_interface == CUDA_INTF)
|
||||||
image_size = PCXW_IMAGE_SIZE;
|
image_size = PCXW_IMAGE_SIZE;
|
||||||
else
|
else
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
if (!capable(CAP_SYS_ADMIN))
|
if (!capable(CAP_SYS_ADMIN))
|
||||||
@@ -330,22 +330,22 @@ static ssize_t perf_write(struct file *file, const char __user *buf, size_t coun
|
|||||||
|
|
||||||
/* First check the machine type is correct for
|
/* First check the machine type is correct for
|
||||||
the requested image */
|
the requested image */
|
||||||
if (((perf_processor_interface == CUDA_INTF) &&
|
if (((perf_processor_interface == CUDA_INTF) &&
|
||||||
(interface_type != CUDA_INTF)) ||
|
(interface_type != CUDA_INTF)) ||
|
||||||
((perf_processor_interface == ONYX_INTF) &&
|
((perf_processor_interface == ONYX_INTF) &&
|
||||||
(interface_type != ONYX_INTF)))
|
(interface_type != ONYX_INTF)))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
/* Next check to make sure the requested image
|
/* Next check to make sure the requested image
|
||||||
is valid */
|
is valid */
|
||||||
if (((interface_type == CUDA_INTF) &&
|
if (((interface_type == CUDA_INTF) &&
|
||||||
(test >= MAX_CUDA_IMAGES)) ||
|
(test >= MAX_CUDA_IMAGES)) ||
|
||||||
((interface_type == ONYX_INTF) &&
|
((interface_type == ONYX_INTF) &&
|
||||||
(test >= MAX_ONYX_IMAGES)))
|
(test >= MAX_ONYX_IMAGES)))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
/* Copy the image into the processor */
|
/* Copy the image into the processor */
|
||||||
if (interface_type == CUDA_INTF)
|
if (interface_type == CUDA_INTF)
|
||||||
return perf_config(cuda_images[test]);
|
return perf_config(cuda_images[test]);
|
||||||
else
|
else
|
||||||
return perf_config(onyx_images[test]);
|
return perf_config(onyx_images[test]);
|
||||||
@@ -359,7 +359,7 @@ static ssize_t perf_write(struct file *file, const char __user *buf, size_t coun
|
|||||||
static void perf_patch_images(void)
|
static void perf_patch_images(void)
|
||||||
{
|
{
|
||||||
#if 0 /* FIXME!! */
|
#if 0 /* FIXME!! */
|
||||||
/*
|
/*
|
||||||
* NOTE: this routine is VERY specific to the current TLB image.
|
* NOTE: this routine is VERY specific to the current TLB image.
|
||||||
* If the image is changed, this routine might also need to be changed.
|
* If the image is changed, this routine might also need to be changed.
|
||||||
*/
|
*/
|
||||||
@@ -367,9 +367,9 @@ static void perf_patch_images(void)
|
|||||||
extern void $i_dtlb_miss_2_0();
|
extern void $i_dtlb_miss_2_0();
|
||||||
extern void PA2_0_iva();
|
extern void PA2_0_iva();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We can only use the lower 32-bits, the upper 32-bits should be 0
|
* We can only use the lower 32-bits, the upper 32-bits should be 0
|
||||||
* anyway given this is in the kernel
|
* anyway given this is in the kernel
|
||||||
*/
|
*/
|
||||||
uint32_t itlb_addr = (uint32_t)&($i_itlb_miss_2_0);
|
uint32_t itlb_addr = (uint32_t)&($i_itlb_miss_2_0);
|
||||||
uint32_t dtlb_addr = (uint32_t)&($i_dtlb_miss_2_0);
|
uint32_t dtlb_addr = (uint32_t)&($i_dtlb_miss_2_0);
|
||||||
@@ -377,21 +377,21 @@ static void perf_patch_images(void)
|
|||||||
|
|
||||||
if (perf_processor_interface == ONYX_INTF) {
|
if (perf_processor_interface == ONYX_INTF) {
|
||||||
/* clear last 2 bytes */
|
/* clear last 2 bytes */
|
||||||
onyx_images[TLBMISS][15] &= 0xffffff00;
|
onyx_images[TLBMISS][15] &= 0xffffff00;
|
||||||
/* set 2 bytes */
|
/* set 2 bytes */
|
||||||
onyx_images[TLBMISS][15] |= (0x000000ff&((dtlb_addr) >> 24));
|
onyx_images[TLBMISS][15] |= (0x000000ff&((dtlb_addr) >> 24));
|
||||||
onyx_images[TLBMISS][16] = (dtlb_addr << 8)&0xffffff00;
|
onyx_images[TLBMISS][16] = (dtlb_addr << 8)&0xffffff00;
|
||||||
onyx_images[TLBMISS][17] = itlb_addr;
|
onyx_images[TLBMISS][17] = itlb_addr;
|
||||||
|
|
||||||
/* clear last 2 bytes */
|
/* clear last 2 bytes */
|
||||||
onyx_images[TLBHANDMISS][15] &= 0xffffff00;
|
onyx_images[TLBHANDMISS][15] &= 0xffffff00;
|
||||||
/* set 2 bytes */
|
/* set 2 bytes */
|
||||||
onyx_images[TLBHANDMISS][15] |= (0x000000ff&((dtlb_addr) >> 24));
|
onyx_images[TLBHANDMISS][15] |= (0x000000ff&((dtlb_addr) >> 24));
|
||||||
onyx_images[TLBHANDMISS][16] = (dtlb_addr << 8)&0xffffff00;
|
onyx_images[TLBHANDMISS][16] = (dtlb_addr << 8)&0xffffff00;
|
||||||
onyx_images[TLBHANDMISS][17] = itlb_addr;
|
onyx_images[TLBHANDMISS][17] = itlb_addr;
|
||||||
|
|
||||||
/* clear last 2 bytes */
|
/* clear last 2 bytes */
|
||||||
onyx_images[BIG_CPI][15] &= 0xffffff00;
|
onyx_images[BIG_CPI][15] &= 0xffffff00;
|
||||||
/* set 2 bytes */
|
/* set 2 bytes */
|
||||||
onyx_images[BIG_CPI][15] |= (0x000000ff&((dtlb_addr) >> 24));
|
onyx_images[BIG_CPI][15] |= (0x000000ff&((dtlb_addr) >> 24));
|
||||||
onyx_images[BIG_CPI][16] = (dtlb_addr << 8)&0xffffff00;
|
onyx_images[BIG_CPI][16] = (dtlb_addr << 8)&0xffffff00;
|
||||||
@@ -404,24 +404,24 @@ static void perf_patch_images(void)
|
|||||||
|
|
||||||
} else if (perf_processor_interface == CUDA_INTF) {
|
} else if (perf_processor_interface == CUDA_INTF) {
|
||||||
/* Cuda interface */
|
/* Cuda interface */
|
||||||
cuda_images[TLBMISS][16] =
|
cuda_images[TLBMISS][16] =
|
||||||
(cuda_images[TLBMISS][16]&0xffff0000) |
|
(cuda_images[TLBMISS][16]&0xffff0000) |
|
||||||
((dtlb_addr >> 8)&0x0000ffff);
|
((dtlb_addr >> 8)&0x0000ffff);
|
||||||
cuda_images[TLBMISS][17] =
|
cuda_images[TLBMISS][17] =
|
||||||
((dtlb_addr << 24)&0xff000000) | ((itlb_addr >> 16)&0x000000ff);
|
((dtlb_addr << 24)&0xff000000) | ((itlb_addr >> 16)&0x000000ff);
|
||||||
cuda_images[TLBMISS][18] = (itlb_addr << 16)&0xffff0000;
|
cuda_images[TLBMISS][18] = (itlb_addr << 16)&0xffff0000;
|
||||||
|
|
||||||
cuda_images[TLBHANDMISS][16] =
|
cuda_images[TLBHANDMISS][16] =
|
||||||
(cuda_images[TLBHANDMISS][16]&0xffff0000) |
|
(cuda_images[TLBHANDMISS][16]&0xffff0000) |
|
||||||
((dtlb_addr >> 8)&0x0000ffff);
|
((dtlb_addr >> 8)&0x0000ffff);
|
||||||
cuda_images[TLBHANDMISS][17] =
|
cuda_images[TLBHANDMISS][17] =
|
||||||
((dtlb_addr << 24)&0xff000000) | ((itlb_addr >> 16)&0x000000ff);
|
((dtlb_addr << 24)&0xff000000) | ((itlb_addr >> 16)&0x000000ff);
|
||||||
cuda_images[TLBHANDMISS][18] = (itlb_addr << 16)&0xffff0000;
|
cuda_images[TLBHANDMISS][18] = (itlb_addr << 16)&0xffff0000;
|
||||||
|
|
||||||
cuda_images[BIG_CPI][16] =
|
cuda_images[BIG_CPI][16] =
|
||||||
(cuda_images[BIG_CPI][16]&0xffff0000) |
|
(cuda_images[BIG_CPI][16]&0xffff0000) |
|
||||||
((dtlb_addr >> 8)&0x0000ffff);
|
((dtlb_addr >> 8)&0x0000ffff);
|
||||||
cuda_images[BIG_CPI][17] =
|
cuda_images[BIG_CPI][17] =
|
||||||
((dtlb_addr << 24)&0xff000000) | ((itlb_addr >> 16)&0x000000ff);
|
((dtlb_addr << 24)&0xff000000) | ((itlb_addr >> 16)&0x000000ff);
|
||||||
cuda_images[BIG_CPI][18] = (itlb_addr << 16)&0xffff0000;
|
cuda_images[BIG_CPI][18] = (itlb_addr << 16)&0xffff0000;
|
||||||
} else {
|
} else {
|
||||||
@@ -433,7 +433,7 @@ static void perf_patch_images(void)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* ioctl routine
|
* ioctl routine
|
||||||
* All routines effect the processor that they are executed on. Thus you
|
* All routines effect the processor that they are executed on. Thus you
|
||||||
* must be running on the processor that you wish to change.
|
* must be running on the processor that you wish to change.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -459,7 +459,7 @@ static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* copy out the Counters */
|
/* copy out the Counters */
|
||||||
if (copy_to_user((void __user *)arg, raddr,
|
if (copy_to_user((void __user *)arg, raddr,
|
||||||
sizeof (raddr)) != 0) {
|
sizeof (raddr)) != 0) {
|
||||||
error = -EFAULT;
|
error = -EFAULT;
|
||||||
break;
|
break;
|
||||||
@@ -487,7 +487,7 @@ static const struct file_operations perf_fops = {
|
|||||||
.open = perf_open,
|
.open = perf_open,
|
||||||
.release = perf_release
|
.release = perf_release
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct miscdevice perf_dev = {
|
static struct miscdevice perf_dev = {
|
||||||
MISC_DYNAMIC_MINOR,
|
MISC_DYNAMIC_MINOR,
|
||||||
PA_PERF_DEV,
|
PA_PERF_DEV,
|
||||||
@@ -595,7 +595,7 @@ static int perf_stop_counters(uint32_t *raddr)
|
|||||||
/* OR sticky2 (bit 1496) to counter2 bit 32 */
|
/* OR sticky2 (bit 1496) to counter2 bit 32 */
|
||||||
tmp64 |= (userbuf[23] >> 8) & 0x0000000080000000;
|
tmp64 |= (userbuf[23] >> 8) & 0x0000000080000000;
|
||||||
raddr[2] = (uint32_t)tmp64;
|
raddr[2] = (uint32_t)tmp64;
|
||||||
|
|
||||||
/* Counter3 is bits 1497 to 1528 */
|
/* Counter3 is bits 1497 to 1528 */
|
||||||
tmp64 = (userbuf[23] >> 7) & 0x00000000ffffffff;
|
tmp64 = (userbuf[23] >> 7) & 0x00000000ffffffff;
|
||||||
/* OR sticky3 (bit 1529) to counter3 bit 32 */
|
/* OR sticky3 (bit 1529) to counter3 bit 32 */
|
||||||
@@ -617,7 +617,7 @@ static int perf_stop_counters(uint32_t *raddr)
|
|||||||
userbuf[22] = 0;
|
userbuf[22] = 0;
|
||||||
userbuf[23] = 0;
|
userbuf[23] = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Write back the zeroed bytes + the image given
|
* Write back the zeroed bytes + the image given
|
||||||
* the read was destructive.
|
* the read was destructive.
|
||||||
*/
|
*/
|
||||||
@@ -625,13 +625,13 @@ static int perf_stop_counters(uint32_t *raddr)
|
|||||||
} else {
|
} else {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Read RDR-15 which contains the counters and sticky bits
|
* Read RDR-15 which contains the counters and sticky bits
|
||||||
*/
|
*/
|
||||||
if (!perf_rdr_read_ubuf(15, userbuf)) {
|
if (!perf_rdr_read_ubuf(15, userbuf)) {
|
||||||
return -13;
|
return -13;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Clear out the counters
|
* Clear out the counters
|
||||||
*/
|
*/
|
||||||
perf_rdr_clear(15);
|
perf_rdr_clear(15);
|
||||||
@@ -644,7 +644,7 @@ static int perf_stop_counters(uint32_t *raddr)
|
|||||||
raddr[2] = (uint32_t)((userbuf[1] >> 32) & 0x00000000ffffffffUL);
|
raddr[2] = (uint32_t)((userbuf[1] >> 32) & 0x00000000ffffffffUL);
|
||||||
raddr[3] = (uint32_t)(userbuf[1] & 0x00000000ffffffffUL);
|
raddr[3] = (uint32_t)(userbuf[1] & 0x00000000ffffffffUL);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -682,7 +682,7 @@ static int perf_rdr_read_ubuf(uint32_t rdr_num, uint64_t *buffer)
|
|||||||
i = tentry->num_words;
|
i = tentry->num_words;
|
||||||
while (i--) {
|
while (i--) {
|
||||||
buffer[i] = 0;
|
buffer[i] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check for bits an even number of 64 */
|
/* Check for bits an even number of 64 */
|
||||||
if ((xbits = width & 0x03f) != 0) {
|
if ((xbits = width & 0x03f) != 0) {
|
||||||
@@ -808,18 +808,22 @@ static int perf_write_image(uint64_t *memaddr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
runway = ioremap_nocache(cpu_device->hpa.start, 4096);
|
runway = ioremap_nocache(cpu_device->hpa.start, 4096);
|
||||||
|
if (!runway) {
|
||||||
|
pr_err("perf_write_image: ioremap failed!\n");
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
/* Merge intrigue bits into Runway STATUS 0 */
|
/* Merge intrigue bits into Runway STATUS 0 */
|
||||||
tmp64 = __raw_readq(runway + RUNWAY_STATUS) & 0xffecfffffffffffful;
|
tmp64 = __raw_readq(runway + RUNWAY_STATUS) & 0xffecfffffffffffful;
|
||||||
__raw_writeq(tmp64 | (*memaddr++ & 0x0013000000000000ul),
|
__raw_writeq(tmp64 | (*memaddr++ & 0x0013000000000000ul),
|
||||||
runway + RUNWAY_STATUS);
|
runway + RUNWAY_STATUS);
|
||||||
|
|
||||||
/* Write RUNWAY DEBUG registers */
|
/* Write RUNWAY DEBUG registers */
|
||||||
for (i = 0; i < 8; i++) {
|
for (i = 0; i < 8; i++) {
|
||||||
__raw_writeq(*memaddr++, runway + RUNWAY_DEBUG);
|
__raw_writeq(*memaddr++, runway + RUNWAY_DEBUG);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -843,7 +847,7 @@ printk("perf_rdr_write\n");
|
|||||||
perf_rdr_shift_out_U(rdr_num, buffer[i]);
|
perf_rdr_shift_out_U(rdr_num, buffer[i]);
|
||||||
} else {
|
} else {
|
||||||
perf_rdr_shift_out_W(rdr_num, buffer[i]);
|
perf_rdr_shift_out_W(rdr_num, buffer[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
printk("perf_rdr_write done\n");
|
printk("perf_rdr_write done\n");
|
||||||
}
|
}
|
||||||
|
@@ -142,6 +142,8 @@ void machine_power_off(void)
|
|||||||
|
|
||||||
printk(KERN_EMERG "System shut down completed.\n"
|
printk(KERN_EMERG "System shut down completed.\n"
|
||||||
"Please power this system off now.");
|
"Please power this system off now.");
|
||||||
|
|
||||||
|
for (;;);
|
||||||
}
|
}
|
||||||
|
|
||||||
void (*pm_power_off)(void) = machine_power_off;
|
void (*pm_power_off)(void) = machine_power_off;
|
||||||
|
@@ -444,6 +444,7 @@
|
|||||||
ENTRY_SAME(copy_file_range)
|
ENTRY_SAME(copy_file_range)
|
||||||
ENTRY_COMP(preadv2)
|
ENTRY_COMP(preadv2)
|
||||||
ENTRY_COMP(pwritev2)
|
ENTRY_COMP(pwritev2)
|
||||||
|
ENTRY_SAME(statx)
|
||||||
|
|
||||||
|
|
||||||
.ifne (. - 90b) - (__NR_Linux_syscalls * (91b - 90b))
|
.ifne (. - 90b) - (__NR_Linux_syscalls * (91b - 90b))
|
||||||
|
@@ -80,93 +80,99 @@ config ARCH_HAS_DMA_SET_COHERENT_MASK
|
|||||||
config PPC
|
config PPC
|
||||||
bool
|
bool
|
||||||
default y
|
default y
|
||||||
select BUILDTIME_EXTABLE_SORT
|
#
|
||||||
|
# Please keep this list sorted alphabetically.
|
||||||
|
#
|
||||||
|
select ARCH_HAS_DEVMEM_IS_ALLOWED
|
||||||
|
select ARCH_HAS_DMA_SET_COHERENT_MASK
|
||||||
|
select ARCH_HAS_ELF_RANDOMIZE
|
||||||
|
select ARCH_HAS_GCOV_PROFILE_ALL
|
||||||
|
select ARCH_HAS_SCALED_CPUTIME if VIRT_CPU_ACCOUNTING_NATIVE
|
||||||
|
select ARCH_HAS_SG_CHAIN
|
||||||
|
select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST
|
||||||
|
select ARCH_HAS_UBSAN_SANITIZE_ALL
|
||||||
|
select ARCH_HAVE_NMI_SAFE_CMPXCHG
|
||||||
select ARCH_MIGHT_HAVE_PC_PARPORT
|
select ARCH_MIGHT_HAVE_PC_PARPORT
|
||||||
select ARCH_MIGHT_HAVE_PC_SERIO
|
select ARCH_MIGHT_HAVE_PC_SERIO
|
||||||
|
select ARCH_SUPPORTS_ATOMIC_RMW
|
||||||
|
select ARCH_SUPPORTS_DEFERRED_STRUCT_PAGE_INIT
|
||||||
|
select ARCH_USE_BUILTIN_BSWAP
|
||||||
|
select ARCH_USE_CMPXCHG_LOCKREF if PPC64
|
||||||
|
select ARCH_WANT_IPC_PARSE_VERSION
|
||||||
select BINFMT_ELF
|
select BINFMT_ELF
|
||||||
select ARCH_HAS_ELF_RANDOMIZE
|
select BUILDTIME_EXTABLE_SORT
|
||||||
|
select CLONE_BACKWARDS
|
||||||
|
select DCACHE_WORD_ACCESS if PPC64 && CPU_LITTLE_ENDIAN
|
||||||
|
select EDAC_ATOMIC_SCRUB
|
||||||
|
select EDAC_SUPPORT
|
||||||
|
select GENERIC_ATOMIC64 if PPC32
|
||||||
|
select GENERIC_CLOCKEVENTS
|
||||||
|
select GENERIC_CLOCKEVENTS_BROADCAST if SMP
|
||||||
|
select GENERIC_CMOS_UPDATE
|
||||||
|
select GENERIC_CPU_AUTOPROBE
|
||||||
|
select GENERIC_IRQ_SHOW
|
||||||
|
select GENERIC_IRQ_SHOW_LEVEL
|
||||||
|
select GENERIC_SMP_IDLE_THREAD
|
||||||
|
select GENERIC_STRNCPY_FROM_USER
|
||||||
|
select GENERIC_STRNLEN_USER
|
||||||
|
select GENERIC_TIME_VSYSCALL_OLD
|
||||||
|
select HAVE_ARCH_AUDITSYSCALL
|
||||||
|
select HAVE_ARCH_HARDENED_USERCOPY
|
||||||
|
select HAVE_ARCH_JUMP_LABEL
|
||||||
|
select HAVE_ARCH_KGDB
|
||||||
|
select HAVE_ARCH_SECCOMP_FILTER
|
||||||
|
select HAVE_ARCH_TRACEHOOK
|
||||||
|
select HAVE_CBPF_JIT if !PPC64
|
||||||
|
select HAVE_CONTEXT_TRACKING if PPC64
|
||||||
|
select HAVE_DEBUG_KMEMLEAK
|
||||||
|
select HAVE_DEBUG_STACKOVERFLOW
|
||||||
|
select HAVE_DMA_API_DEBUG
|
||||||
|
select HAVE_DYNAMIC_FTRACE
|
||||||
|
select HAVE_DYNAMIC_FTRACE_WITH_REGS if MPROFILE_KERNEL
|
||||||
|
select HAVE_EBPF_JIT if PPC64
|
||||||
|
select HAVE_EFFICIENT_UNALIGNED_ACCESS if !(CPU_LITTLE_ENDIAN && POWER7_CPU)
|
||||||
|
select HAVE_FTRACE_MCOUNT_RECORD
|
||||||
|
select HAVE_FUNCTION_GRAPH_TRACER
|
||||||
|
select HAVE_FUNCTION_TRACER
|
||||||
|
select HAVE_GCC_PLUGINS
|
||||||
|
select HAVE_GENERIC_RCU_GUP
|
||||||
|
select HAVE_HW_BREAKPOINT if PERF_EVENTS && (PPC_BOOK3S || PPC_8xx)
|
||||||
|
select HAVE_IDE
|
||||||
|
select HAVE_IOREMAP_PROT
|
||||||
|
select HAVE_IRQ_EXIT_ON_IRQ_STACK
|
||||||
|
select HAVE_KERNEL_GZIP
|
||||||
|
select HAVE_KPROBES
|
||||||
|
select HAVE_KRETPROBES
|
||||||
|
select HAVE_LIVEPATCH if HAVE_DYNAMIC_FTRACE_WITH_REGS
|
||||||
|
select HAVE_MEMBLOCK
|
||||||
|
select HAVE_MEMBLOCK_NODE_MAP
|
||||||
|
select HAVE_MOD_ARCH_SPECIFIC
|
||||||
|
select HAVE_NMI if PERF_EVENTS
|
||||||
|
select HAVE_OPROFILE
|
||||||
|
select HAVE_OPTPROBES if PPC64
|
||||||
|
select HAVE_PERF_EVENTS
|
||||||
|
select HAVE_PERF_EVENTS_NMI if PPC64
|
||||||
|
select HAVE_PERF_REGS
|
||||||
|
select HAVE_PERF_USER_STACK_DUMP
|
||||||
|
select HAVE_RCU_TABLE_FREE if SMP
|
||||||
|
select HAVE_REGS_AND_STACK_ACCESS_API
|
||||||
|
select HAVE_SYSCALL_TRACEPOINTS
|
||||||
|
select HAVE_VIRT_CPU_ACCOUNTING
|
||||||
|
select IRQ_DOMAIN
|
||||||
|
select IRQ_FORCED_THREADING
|
||||||
|
select MODULES_USE_ELF_RELA
|
||||||
|
select NO_BOOTMEM
|
||||||
select OF
|
select OF
|
||||||
select OF_EARLY_FLATTREE
|
select OF_EARLY_FLATTREE
|
||||||
select OF_RESERVED_MEM
|
select OF_RESERVED_MEM
|
||||||
select HAVE_FTRACE_MCOUNT_RECORD
|
select OLD_SIGACTION if PPC32
|
||||||
select HAVE_DYNAMIC_FTRACE
|
|
||||||
select HAVE_DYNAMIC_FTRACE_WITH_REGS if MPROFILE_KERNEL
|
|
||||||
select HAVE_FUNCTION_TRACER
|
|
||||||
select HAVE_FUNCTION_GRAPH_TRACER
|
|
||||||
select HAVE_GCC_PLUGINS
|
|
||||||
select SYSCTL_EXCEPTION_TRACE
|
|
||||||
select VIRT_TO_BUS if !PPC64
|
|
||||||
select HAVE_IDE
|
|
||||||
select HAVE_IOREMAP_PROT
|
|
||||||
select HAVE_EFFICIENT_UNALIGNED_ACCESS if !(CPU_LITTLE_ENDIAN && POWER7_CPU)
|
|
||||||
select HAVE_KPROBES
|
|
||||||
select HAVE_OPTPROBES if PPC64
|
|
||||||
select HAVE_ARCH_KGDB
|
|
||||||
select HAVE_KRETPROBES
|
|
||||||
select HAVE_ARCH_TRACEHOOK
|
|
||||||
select HAVE_MEMBLOCK
|
|
||||||
select HAVE_MEMBLOCK_NODE_MAP
|
|
||||||
select HAVE_DMA_API_DEBUG
|
|
||||||
select HAVE_OPROFILE
|
|
||||||
select HAVE_DEBUG_KMEMLEAK
|
|
||||||
select ARCH_HAS_SG_CHAIN
|
|
||||||
select GENERIC_ATOMIC64 if PPC32
|
|
||||||
select HAVE_PERF_EVENTS
|
|
||||||
select HAVE_PERF_REGS
|
|
||||||
select HAVE_PERF_USER_STACK_DUMP
|
|
||||||
select HAVE_REGS_AND_STACK_ACCESS_API
|
|
||||||
select HAVE_HW_BREAKPOINT if PERF_EVENTS && (PPC_BOOK3S || PPC_8xx)
|
|
||||||
select ARCH_WANT_IPC_PARSE_VERSION
|
|
||||||
select SPARSE_IRQ
|
|
||||||
select IRQ_DOMAIN
|
|
||||||
select GENERIC_IRQ_SHOW
|
|
||||||
select GENERIC_IRQ_SHOW_LEVEL
|
|
||||||
select IRQ_FORCED_THREADING
|
|
||||||
select HAVE_RCU_TABLE_FREE if SMP
|
|
||||||
select HAVE_SYSCALL_TRACEPOINTS
|
|
||||||
select HAVE_CBPF_JIT if !PPC64
|
|
||||||
select HAVE_EBPF_JIT if PPC64
|
|
||||||
select HAVE_ARCH_JUMP_LABEL
|
|
||||||
select ARCH_HAVE_NMI_SAFE_CMPXCHG
|
|
||||||
select ARCH_HAS_GCOV_PROFILE_ALL
|
|
||||||
select GENERIC_SMP_IDLE_THREAD
|
|
||||||
select GENERIC_CMOS_UPDATE
|
|
||||||
select GENERIC_TIME_VSYSCALL_OLD
|
|
||||||
select GENERIC_CLOCKEVENTS
|
|
||||||
select GENERIC_CLOCKEVENTS_BROADCAST if SMP
|
|
||||||
select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST
|
|
||||||
select GENERIC_STRNCPY_FROM_USER
|
|
||||||
select GENERIC_STRNLEN_USER
|
|
||||||
select HAVE_MOD_ARCH_SPECIFIC
|
|
||||||
select MODULES_USE_ELF_RELA
|
|
||||||
select CLONE_BACKWARDS
|
|
||||||
select ARCH_USE_BUILTIN_BSWAP
|
|
||||||
select OLD_SIGSUSPEND
|
select OLD_SIGSUSPEND
|
||||||
select OLD_SIGACTION if PPC32
|
select SPARSE_IRQ
|
||||||
select HAVE_DEBUG_STACKOVERFLOW
|
select SYSCTL_EXCEPTION_TRACE
|
||||||
select HAVE_IRQ_EXIT_ON_IRQ_STACK
|
select VIRT_TO_BUS if !PPC64
|
||||||
select ARCH_USE_CMPXCHG_LOCKREF if PPC64
|
#
|
||||||
select HAVE_ARCH_AUDITSYSCALL
|
# Please keep this list sorted alphabetically.
|
||||||
select ARCH_SUPPORTS_ATOMIC_RMW
|
#
|
||||||
select DCACHE_WORD_ACCESS if PPC64 && CPU_LITTLE_ENDIAN
|
|
||||||
select NO_BOOTMEM
|
|
||||||
select HAVE_GENERIC_RCU_GUP
|
|
||||||
select HAVE_PERF_EVENTS_NMI if PPC64
|
|
||||||
select HAVE_NMI if PERF_EVENTS
|
|
||||||
select EDAC_SUPPORT
|
|
||||||
select EDAC_ATOMIC_SCRUB
|
|
||||||
select ARCH_HAS_DMA_SET_COHERENT_MASK
|
|
||||||
select ARCH_HAS_DEVMEM_IS_ALLOWED
|
|
||||||
select HAVE_ARCH_SECCOMP_FILTER
|
|
||||||
select ARCH_HAS_UBSAN_SANITIZE_ALL
|
|
||||||
select ARCH_SUPPORTS_DEFERRED_STRUCT_PAGE_INIT
|
|
||||||
select HAVE_LIVEPATCH if HAVE_DYNAMIC_FTRACE_WITH_REGS
|
|
||||||
select GENERIC_CPU_AUTOPROBE
|
|
||||||
select HAVE_VIRT_CPU_ACCOUNTING
|
|
||||||
select ARCH_HAS_SCALED_CPUTIME if VIRT_CPU_ACCOUNTING_NATIVE
|
|
||||||
select HAVE_ARCH_HARDENED_USERCOPY
|
|
||||||
select HAVE_KERNEL_GZIP
|
|
||||||
select HAVE_CONTEXT_TRACKING if PPC64
|
|
||||||
|
|
||||||
config GENERIC_CSUM
|
config GENERIC_CSUM
|
||||||
def_bool n
|
def_bool n
|
||||||
|
@@ -72,8 +72,15 @@ GNUTARGET := powerpc
|
|||||||
MULTIPLEWORD := -mmultiple
|
MULTIPLEWORD := -mmultiple
|
||||||
endif
|
endif
|
||||||
|
|
||||||
cflags-$(CONFIG_CPU_BIG_ENDIAN) += $(call cc-option,-mbig-endian)
|
ifdef CONFIG_PPC64
|
||||||
|
cflags-$(CONFIG_CPU_BIG_ENDIAN) += $(call cc-option,-mabi=elfv1)
|
||||||
|
cflags-$(CONFIG_CPU_BIG_ENDIAN) += $(call cc-option,-mcall-aixdesc)
|
||||||
|
aflags-$(CONFIG_CPU_BIG_ENDIAN) += $(call cc-option,-mabi=elfv1)
|
||||||
|
aflags-$(CONFIG_CPU_LITTLE_ENDIAN) += -mabi=elfv2
|
||||||
|
endif
|
||||||
|
|
||||||
cflags-$(CONFIG_CPU_LITTLE_ENDIAN) += -mlittle-endian
|
cflags-$(CONFIG_CPU_LITTLE_ENDIAN) += -mlittle-endian
|
||||||
|
cflags-$(CONFIG_CPU_BIG_ENDIAN) += $(call cc-option,-mbig-endian)
|
||||||
ifneq ($(cc-name),clang)
|
ifneq ($(cc-name),clang)
|
||||||
cflags-$(CONFIG_CPU_LITTLE_ENDIAN) += -mno-strict-align
|
cflags-$(CONFIG_CPU_LITTLE_ENDIAN) += -mno-strict-align
|
||||||
endif
|
endif
|
||||||
@@ -113,7 +120,9 @@ ifeq ($(CONFIG_CPU_LITTLE_ENDIAN),y)
|
|||||||
CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mabi=elfv2,$(call cc-option,-mcall-aixdesc))
|
CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mabi=elfv2,$(call cc-option,-mcall-aixdesc))
|
||||||
AFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mabi=elfv2)
|
AFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mabi=elfv2)
|
||||||
else
|
else
|
||||||
|
CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mabi=elfv1)
|
||||||
CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mcall-aixdesc)
|
CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mcall-aixdesc)
|
||||||
|
AFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mabi=elfv1)
|
||||||
endif
|
endif
|
||||||
CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mcmodel=medium,$(call cc-option,-mminimal-toc))
|
CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mcmodel=medium,$(call cc-option,-mminimal-toc))
|
||||||
CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mno-pointers-to-nested-functions)
|
CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mno-pointers-to-nested-functions)
|
||||||
|
@@ -68,6 +68,7 @@ SECTIONS
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_PPC64_BOOT_WRAPPER
|
#ifdef CONFIG_PPC64_BOOT_WRAPPER
|
||||||
|
. = ALIGN(256);
|
||||||
.got :
|
.got :
|
||||||
{
|
{
|
||||||
__toc_start = .;
|
__toc_start = .;
|
||||||
|
@@ -52,7 +52,7 @@ static int crc32c_vpmsum_cra_init(struct crypto_tfm *tfm)
|
|||||||
{
|
{
|
||||||
u32 *key = crypto_tfm_ctx(tfm);
|
u32 *key = crypto_tfm_ctx(tfm);
|
||||||
|
|
||||||
*key = 0;
|
*key = ~0;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@@ -51,6 +51,10 @@
|
|||||||
#define PPC_BIT(bit) (1UL << PPC_BITLSHIFT(bit))
|
#define PPC_BIT(bit) (1UL << PPC_BITLSHIFT(bit))
|
||||||
#define PPC_BITMASK(bs, be) ((PPC_BIT(bs) - PPC_BIT(be)) | PPC_BIT(bs))
|
#define PPC_BITMASK(bs, be) ((PPC_BIT(bs) - PPC_BIT(be)) | PPC_BIT(bs))
|
||||||
|
|
||||||
|
/* Put a PPC bit into a "normal" bit position */
|
||||||
|
#define PPC_BITEXTRACT(bits, ppc_bit, dst_bit) \
|
||||||
|
((((bits) >> PPC_BITLSHIFT(ppc_bit)) & 1) << (dst_bit))
|
||||||
|
|
||||||
#include <asm/barrier.h>
|
#include <asm/barrier.h>
|
||||||
|
|
||||||
/* Macro for generating the ***_bits() functions */
|
/* Macro for generating the ***_bits() functions */
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user