Merge ff61bc81b3 ("Merge tag 'pinctrl-v5.18-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl") into android-mainline
Steps on the way to 5.18-rc1 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I575022847e52ace6d4c97ccfa92e53ef47afb84e
This commit is contained in:
commit
dbf75dad1f
767 changed files with 124416 additions and 83356 deletions
|
|
@ -6,7 +6,7 @@ Description:
|
|||
|
||||
===================== =======================================
|
||||
c_chmask capture channel mask
|
||||
c_srate capture sampling rate
|
||||
c_srate list of capture sampling rates (comma-separated)
|
||||
c_ssize capture sample size (bytes)
|
||||
c_mute_present capture mute control enable
|
||||
c_volume_present capture volume control enable
|
||||
|
|
@ -17,7 +17,7 @@ Description:
|
|||
c_volume_res capture volume control resolution
|
||||
(in 1/256 dB)
|
||||
p_chmask playback channel mask
|
||||
p_srate playback sampling rate
|
||||
p_srate list of playback sampling rates (comma-separated)
|
||||
p_ssize playback sample size (bytes)
|
||||
p_mute_present playback mute control enable
|
||||
p_volume_present playback volume control enable
|
||||
|
|
@ -29,4 +29,5 @@ Description:
|
|||
(in 1/256 dB)
|
||||
req_number the number of pre-allocated requests
|
||||
for both capture and playback
|
||||
function_name name of the interface
|
||||
===================== =======================================
|
||||
|
|
|
|||
|
|
@ -6,8 +6,9 @@ Description:
|
|||
|
||||
===================== =======================================
|
||||
c_chmask capture channel mask
|
||||
c_srate capture sampling rate
|
||||
c_srate list of capture sampling rates (comma-separated)
|
||||
c_ssize capture sample size (bytes)
|
||||
c_hs_bint capture bInterval for HS/SS (1-4: fixed, 0: auto)
|
||||
c_sync capture synchronization type
|
||||
(async/adaptive)
|
||||
c_mute_present capture mute control enable
|
||||
|
|
@ -20,8 +21,9 @@ Description:
|
|||
(in 1/256 dB)
|
||||
fb_max maximum extra bandwidth in async mode
|
||||
p_chmask playback channel mask
|
||||
p_srate playback sampling rate
|
||||
p_srate list of playback sampling rates (comma-separated)
|
||||
p_ssize playback sample size (bytes)
|
||||
p_hs_bint playback bInterval for HS/SS (1-4: fixed, 0: auto)
|
||||
p_mute_present playback mute control enable
|
||||
p_volume_present playback volume control enable
|
||||
p_volume_min playback volume control min value
|
||||
|
|
@ -32,4 +34,5 @@ Description:
|
|||
(in 1/256 dB)
|
||||
req_number the number of pre-allocated requests
|
||||
for both capture and playback
|
||||
function_name name of the interface
|
||||
===================== =======================================
|
||||
|
|
|
|||
9
Documentation/ABI/testing/sysfs-driver-eud
Normal file
9
Documentation/ABI/testing/sysfs-driver-eud
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
What: /sys/bus/platform/drivers/eud/.../enable
|
||||
Date: February 2022
|
||||
Contact: Souradeep Chowdhury <quic_schowdhu@quicinc.com>
|
||||
Description:
|
||||
The Enable/Disable sysfs interface for Embedded
|
||||
USB Debugger(EUD). This enables and disables the
|
||||
EUD based on a 1 or a 0 value. By enabling EUD,
|
||||
the user is able to activate the mini-usb hub of
|
||||
EUD for debug and trace capabilities.
|
||||
|
|
@ -130,11 +130,3 @@ accesses to DMA buffers in both privileged "supervisor" and unprivileged
|
|||
subsystem that the buffer is fully accessible at the elevated privilege
|
||||
level (and ideally inaccessible or at least read-only at the
|
||||
lesser-privileged levels).
|
||||
|
||||
DMA_ATTR_OVERWRITE
|
||||
------------------
|
||||
|
||||
This is a hint to the DMA-mapping subsystem that the device is expected to
|
||||
overwrite the entire mapped size, thus the caller does not require any of the
|
||||
previous buffer contents to be preserved. This allows bounce-buffering
|
||||
implementations to optimise DMA_FROM_DEVICE transfers.
|
||||
|
|
|
|||
|
|
@ -185,9 +185,11 @@ examples:
|
|||
};
|
||||
};
|
||||
|
||||
led-controller@0 {
|
||||
- |
|
||||
#include <dt-bindings/leds/common.h>
|
||||
|
||||
led-controller {
|
||||
compatible = "maxim,max77693-led";
|
||||
reg = <0 0x100>;
|
||||
|
||||
led {
|
||||
function = LED_FUNCTION_FLASH;
|
||||
|
|
@ -199,6 +201,9 @@ examples:
|
|||
};
|
||||
};
|
||||
|
||||
- |
|
||||
#include <dt-bindings/leds/common.h>
|
||||
|
||||
i2c {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
|
|
|||
|
|
@ -28,7 +28,12 @@ properties:
|
|||
- const: fsl,imx7ulp-mu
|
||||
- const: fsl,imx8ulp-mu
|
||||
- const: fsl,imx8-mu-scu
|
||||
- const: fsl,imx8-mu-seco
|
||||
- const: fsl,imx93-mu-s4
|
||||
- const: fsl,imx8ulp-mu-s4
|
||||
- items:
|
||||
- const: fsl,imx93-mu
|
||||
- const: fsl,imx8ulp-mu
|
||||
- items:
|
||||
- enum:
|
||||
- fsl,imx7s-mu
|
||||
|
|
@ -51,7 +56,14 @@ properties:
|
|||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
minItems: 1
|
||||
maxItems: 2
|
||||
|
||||
interrupt-names:
|
||||
minItems: 1
|
||||
items:
|
||||
- const: tx
|
||||
- const: rx
|
||||
|
||||
"#mbox-cells":
|
||||
description: |
|
||||
|
|
@ -86,6 +98,27 @@ required:
|
|||
- interrupts
|
||||
- "#mbox-cells"
|
||||
|
||||
allOf:
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- fsl,imx93-mu-s4
|
||||
then:
|
||||
properties:
|
||||
interrupt-names:
|
||||
minItems: 2
|
||||
interrupts:
|
||||
minItems: 2
|
||||
|
||||
else:
|
||||
properties:
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
not:
|
||||
required:
|
||||
- interrupt-names
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
|
|
|
|||
50
Documentation/devicetree/bindings/mailbox/mtk,adsp-mbox.yaml
Normal file
50
Documentation/devicetree/bindings/mailbox/mtk,adsp-mbox.yaml
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/mailbox/mtk,adsp-mbox.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Mediatek ADSP mailbox
|
||||
|
||||
maintainers:
|
||||
- Allen-KH Cheng <Allen-KH.Cheng@mediatek.com>
|
||||
|
||||
description: |
|
||||
The MTK ADSP mailbox Inter-Processor Communication (IPC) enables the SoC
|
||||
to ommunicate with ADSP by passing messages through two mailbox channels.
|
||||
The MTK ADSP mailbox IPC also provides the ability for one processor to
|
||||
signal the other processor using interrupts.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
items:
|
||||
- const: mediatek,mt8195-adsp-mbox
|
||||
|
||||
"#mbox-cells":
|
||||
const: 0
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- "#mbox-cells"
|
||||
- reg
|
||||
- interrupts
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
#include <dt-bindings/interrupt-controller/irq.h>
|
||||
|
||||
adsp_mailbox0:mailbox@10816000 {
|
||||
compatible = "mediatek,mt8195-adsp-mbox";
|
||||
#mbox-cells = <0>;
|
||||
reg = <0x10816000 0x1000>;
|
||||
interrupts = <GIC_SPI 702 IRQ_TYPE_LEVEL_HIGH 0>;
|
||||
};
|
||||
|
|
@ -10,7 +10,8 @@ mailbox.txt for generic information about mailbox device-tree bindings.
|
|||
|
||||
Required properties:
|
||||
- compatible: can be "mediatek,mt8173-gce", "mediatek,mt8183-gce",
|
||||
"mediatek,mt8192-gce", "mediatek,mt8195-gce" or "mediatek,mt6779-gce".
|
||||
"mediatek,mt8186-gce", "mediatek,mt8192-gce", "mediatek,mt8195-gce" or
|
||||
"mediatek,mt6779-gce".
|
||||
- reg: Address range of the GCE unit
|
||||
- interrupts: The interrupt signal from the GCE block
|
||||
- clock: Clocks according to the common clock binding
|
||||
|
|
@ -40,8 +41,9 @@ Optional properties for a client mutex node:
|
|||
defined in 'dt-bindings/gce/<chip>-gce.h'.
|
||||
|
||||
Some vaules of properties are defined in 'dt-bindings/gce/mt8173-gce.h',
|
||||
'dt-bindings/gce/mt8183-gce.h', 'dt-bindings/gce/mt8192-gce.h',
|
||||
'dt-bindings/gce/mt8195-gce.h' or 'dt-bindings/gce/mt6779-gce.h'.
|
||||
'dt-bindings/gce/mt8183-gce.h', 'dt-bindings/gce/mt8186-gce.h'
|
||||
'dt-bindings/gce/mt8192-gce.h', 'dt-bindings/gce/mt8195-gce.h' or
|
||||
'dt-bindings/gce/mt6779-gce.h'.
|
||||
Such as sub-system ids, thread priority, event ids.
|
||||
|
||||
Example:
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@ properties:
|
|||
- qcom,msm8916-apcs-kpss-global
|
||||
- qcom,msm8939-apcs-kpss-global
|
||||
- qcom,msm8953-apcs-kpss-global
|
||||
- qcom,msm8976-apcs-kpss-global
|
||||
- qcom,msm8994-apcs-kpss-global
|
||||
- qcom,msm8996-apcs-hmss-global
|
||||
- qcom,msm8998-apcs-hmss-global
|
||||
|
|
|
|||
|
|
@ -75,6 +75,7 @@ additionalProperties: false
|
|||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/clock/aspeed-clock.h>
|
||||
apb {
|
||||
compatible = "simple-bus";
|
||||
#address-cells = <1>;
|
||||
|
|
@ -84,6 +85,8 @@ examples:
|
|||
syscon: scu@1e6e2000 {
|
||||
compatible = "aspeed,ast2500-scu", "syscon", "simple-mfd";
|
||||
reg = <0x1e6e2000 0x1a8>;
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
|
||||
pinctrl: pinctrl {
|
||||
compatible = "aspeed,ast2500-pinctrl";
|
||||
|
|
@ -104,6 +107,12 @@ examples:
|
|||
gfx: display@1e6e6000 {
|
||||
compatible = "aspeed,ast2500-gfx", "syscon";
|
||||
reg = <0x1e6e6000 0x1000>;
|
||||
reg-io-width = <4>;
|
||||
clocks = <&syscon ASPEED_CLK_GATE_D1CLK>;
|
||||
resets = <&syscon ASPEED_RESET_CRT1>;
|
||||
interrupts = <0x19>;
|
||||
syscon = <&syscon>;
|
||||
memory-region = <&gfx_memory>;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
@ -130,3 +139,10 @@ examples:
|
|||
};
|
||||
};
|
||||
};
|
||||
|
||||
gfx_memory: framebuffer {
|
||||
size = <0x01000000>;
|
||||
alignment = <0x01000000>;
|
||||
compatible = "shared-dma-pool";
|
||||
reusable;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -85,7 +85,7 @@ Optional Properties (for I2C pins):
|
|||
- function: String. Specifies the pin mux selection. Values
|
||||
must be one of: "alt1", "alt2", "alt3", "alt4"
|
||||
- bias-pull-up: Integer. Pull up strength in Ohm. There are 3
|
||||
pull-up resisitors (1.2k, 1.8k, 2.7k) available
|
||||
pull-up resistors (1.2k, 1.8k, 2.7k) available
|
||||
in parallel for I2C pins, so the valid values
|
||||
are: 568, 720, 831, 1080, 1200, 1800, 2700 Ohm.
|
||||
- bias-disable: No arguments. Disable pin bias.
|
||||
|
|
|
|||
|
|
@ -0,0 +1,72 @@
|
|||
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/pinctrl/brcm,bcm4908-pinctrl.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Broadcom BCM4908 pin controller
|
||||
|
||||
maintainers:
|
||||
- Rafał Miłecki <rafal@milecki.pl>
|
||||
|
||||
description:
|
||||
Binding for pin controller present on BCM4908 family SoCs.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: brcm,bcm4908-pinctrl
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
patternProperties:
|
||||
'-pins$':
|
||||
type: object
|
||||
$ref: pinmux-node.yaml#
|
||||
|
||||
properties:
|
||||
function:
|
||||
enum: [ led_0, led_1, led_2, led_3, led_4, led_5, led_6, led_7, led_8,
|
||||
led_9, led_10, led_11, led_12, led_13, led_14, led_15, led_16,
|
||||
led_17, led_18, led_19, led_20, led_21, led_22, led_23, led_24,
|
||||
led_25, led_26, led_27, led_28, led_29, led_30, led_31,
|
||||
hs_uart, i2c, i2s, nand_ctrl, nand_data, emmc_ctrl, usb0_pwr,
|
||||
usb1_pwr ]
|
||||
|
||||
groups:
|
||||
minItems: 1
|
||||
maxItems: 2
|
||||
items:
|
||||
enum: [ led_0_grp_a, led_1_grp_a, led_2_grp_a, led_3_grp_a,
|
||||
led_4_grp_a, led_5_grp_a, led_6_grp_a, led_7_grp_a,
|
||||
led_8_grp_a, led_9_grp_a, led_10_grp_a, led_10_grp_b,
|
||||
led_11_grp_a, led_11_grp_b, led_12_grp_a, led_12_grp_b,
|
||||
led_13_grp_a, led_13_grp_b, led_14_grp_a, led_15_grp_a,
|
||||
led_16_grp_a, led_17_grp_a, led_18_grp_a, led_19_grp_a,
|
||||
led_20_grp_a, led_21_grp_a, led_22_grp_a, led_23_grp_a,
|
||||
led_24_grp_a, led_25_grp_a, led_26_grp_a, led_27_grp_a,
|
||||
led_28_grp_a, led_29_grp_a, led_30_grp_a, led_31_grp_a,
|
||||
led_31_grp_b, hs_uart_grp, i2c_grp_a, i2c_grp_b, i2s_grp,
|
||||
nand_ctrl_grp, nand_data_grp, emmc_ctrl_grp, usb0_pwr_grp,
|
||||
usb1_pwr_grp ]
|
||||
|
||||
allOf:
|
||||
- $ref: pinctrl.yaml#
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
pinctrl@ff800560 {
|
||||
compatible = "brcm,bcm4908-pinctrl";
|
||||
reg = <0xff800560 0x10>;
|
||||
|
||||
led_0-a-pins {
|
||||
function = "led_0";
|
||||
groups = "led_0_grp_a";
|
||||
};
|
||||
};
|
||||
|
|
@ -0,0 +1,85 @@
|
|||
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/pinctrl/fsl,imx93-pinctrl.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Freescale IMX93 IOMUX Controller
|
||||
|
||||
maintainers:
|
||||
- Peng Fan <peng.fan@nxp.com>
|
||||
|
||||
description:
|
||||
Please refer to fsl,imx-pinctrl.txt and pinctrl-bindings.txt in this directory
|
||||
for common binding part and usage.
|
||||
|
||||
allOf:
|
||||
- $ref: "pinctrl.yaml#"
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: fsl,imx93-iomuxc
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
# Client device subnode's properties
|
||||
patternProperties:
|
||||
'grp$':
|
||||
type: object
|
||||
description:
|
||||
Pinctrl node's client devices use subnodes for desired pin configuration.
|
||||
Client device subnodes use below standard properties.
|
||||
|
||||
properties:
|
||||
fsl,pins:
|
||||
description:
|
||||
each entry consists of 6 integers and represents the mux and config
|
||||
setting for one pin. The first 5 integers <mux_reg conf_reg input_reg
|
||||
mux_val input_val> are specified using a PIN_FUNC_ID macro, which can
|
||||
be found in <arch/arm64/boot/dts/freescale/imx8mp-pinfunc.h>. The last
|
||||
integer CONFIG is the pad setting value like pull-up on this pin. Please
|
||||
refer to i.MX8M Plus Reference Manual for detailed CONFIG settings.
|
||||
$ref: /schemas/types.yaml#/definitions/uint32-matrix
|
||||
items:
|
||||
items:
|
||||
- description: |
|
||||
"mux_reg" indicates the offset of mux register.
|
||||
- description: |
|
||||
"conf_reg" indicates the offset of pad configuration register.
|
||||
- description: |
|
||||
"input_reg" indicates the offset of select input register.
|
||||
- description: |
|
||||
"mux_val" indicates the mux value to be applied.
|
||||
- description: |
|
||||
"input_val" indicates the select input value to be applied.
|
||||
- description: |
|
||||
"pad_setting" indicates the pad configuration value to be applied.
|
||||
|
||||
|
||||
required:
|
||||
- fsl,pins
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
# Pinmux controller node
|
||||
- |
|
||||
iomuxc: pinctrl@443c0000 {
|
||||
compatible = "fsl,imx93-iomuxc";
|
||||
reg = <0x30330000 0x10000>;
|
||||
|
||||
pinctrl_uart3: uart3grp {
|
||||
fsl,pins =
|
||||
<0x48 0x1f8 0x41c 0x1 0x0 0x49>,
|
||||
<0x4c 0x1fc 0x418 0x1 0x0 0x49>;
|
||||
};
|
||||
};
|
||||
|
||||
...
|
||||
|
|
@ -16,6 +16,7 @@ Required properties for the root node:
|
|||
"amlogic,meson-g12a-periphs-pinctrl"
|
||||
"amlogic,meson-g12a-aobus-pinctrl"
|
||||
"amlogic,meson-a1-periphs-pinctrl"
|
||||
"amlogic,meson-s4-periphs-pinctrl"
|
||||
- reg: address and size of registers controlling irq functionality
|
||||
|
||||
=== GPIO sub-nodes ===
|
||||
|
|
|
|||
|
|
@ -145,7 +145,7 @@ examples:
|
|||
clocks = <&sys_clk>;
|
||||
pinctrl-0 = <&sgpio2_pins>;
|
||||
pinctrl-names = "default";
|
||||
reg = <0x1101059c 0x100>;
|
||||
reg = <0x1101059c 0x118>;
|
||||
microchip,sgpio-port-ranges = <0 0>, <16 18>, <28 31>;
|
||||
bus-frequency = <25000000>;
|
||||
sgpio_in2: gpio@0 {
|
||||
|
|
|
|||
|
|
@ -4,8 +4,8 @@ Microsemi Ocelot pin controller Device Tree Bindings
|
|||
Required properties:
|
||||
- compatible : Should be "mscc,ocelot-pinctrl",
|
||||
"mscc,jaguar2-pinctrl", "microchip,sparx5-pinctrl",
|
||||
"mscc,luton-pinctrl", "mscc,serval-pinctrl" or
|
||||
"microchip,lan966x-pinctrl"
|
||||
"mscc,luton-pinctrl", "mscc,serval-pinctrl",
|
||||
"microchip,lan966x-pinctrl" or "mscc,servalt-pinctrl"
|
||||
- reg : Address and length of the register set for the device
|
||||
- gpio-controller : Indicates this device is a GPIO controller
|
||||
- #gpio-cells : Must be 2.
|
||||
|
|
|
|||
|
|
@ -0,0 +1,160 @@
|
|||
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/pinctrl/nuvoton,wpcm450-pinctrl.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Nuvoton WPCM450 pin control and GPIO
|
||||
|
||||
maintainers:
|
||||
- Jonathan Neuschäfer <j.neuschaefer@gmx.net>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: nuvoton,wpcm450-pinctrl
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
'#address-cells':
|
||||
const: 1
|
||||
|
||||
'#size-cells':
|
||||
const: 0
|
||||
|
||||
patternProperties:
|
||||
# There are three kinds of subnodes:
|
||||
# 1. a GPIO controller node for each GPIO bank
|
||||
# 2. a pinmux node configures pin muxing for a group of pins (e.g. rmii2)
|
||||
# 3. a pinconf node configures properties of a single pin
|
||||
|
||||
"^gpio@[0-7]$":
|
||||
type: object
|
||||
|
||||
description:
|
||||
Eight GPIO banks (gpio@0 to gpio@7), that each contain between 14 and 18
|
||||
GPIOs. Some GPIOs support interrupts.
|
||||
|
||||
properties:
|
||||
reg:
|
||||
minimum: 0
|
||||
maximum: 7
|
||||
|
||||
gpio-controller: true
|
||||
|
||||
"#gpio-cells":
|
||||
const: 2
|
||||
|
||||
interrupt-controller: true
|
||||
|
||||
"#interrupt-cells":
|
||||
const: 2
|
||||
|
||||
interrupts:
|
||||
maxItems: 3
|
||||
description:
|
||||
The interrupts associated with this GPIO bank
|
||||
|
||||
required:
|
||||
- reg
|
||||
- gpio-controller
|
||||
- '#gpio-cells'
|
||||
|
||||
"^mux-":
|
||||
$ref: pinmux-node.yaml#
|
||||
|
||||
properties:
|
||||
groups:
|
||||
description:
|
||||
One or more groups of pins to mux to a certain function
|
||||
items:
|
||||
enum: [ smb3, smb4, smb5, scs1, scs2, scs3, smb0, smb1, smb2, bsp,
|
||||
hsp1, hsp2, r1err, r1md, rmii2, r2err, r2md, kbcc, dvo,
|
||||
clko, smi, uinc, gspi, mben, xcs2, xcs1, sdio, sspi, fi0,
|
||||
fi1, fi2, fi3, fi4, fi5, fi6, fi7, fi8, fi9, fi10, fi11,
|
||||
fi12, fi13, fi14, fi15, pwm0, pwm1, pwm2, pwm3, pwm4, pwm5,
|
||||
pwm6, pwm7, hg0, hg1, hg2, hg3, hg4, hg5, hg6, hg7 ]
|
||||
function:
|
||||
description:
|
||||
The function that a group of pins is muxed to
|
||||
enum: [ smb3, smb4, smb5, scs1, scs2, scs3, smb0, smb1, smb2, bsp,
|
||||
hsp1, hsp2, r1err, r1md, rmii2, r2err, r2md, kbcc, dvo0,
|
||||
dvo1, dvo2, dvo3, dvo4, dvo5, dvo6, dvo7, clko, smi, uinc,
|
||||
gspi, mben, xcs2, xcs1, sdio, sspi, fi0, fi1, fi2, fi3, fi4,
|
||||
fi5, fi6, fi7, fi8, fi9, fi10, fi11, fi12, fi13, fi14, fi15,
|
||||
pwm0, pwm1, pwm2, pwm3, pwm4, pwm5, pwm6, pwm7, hg0, hg1,
|
||||
hg2, hg3, hg4, hg5, hg6, hg7, gpio ]
|
||||
|
||||
dependencies:
|
||||
groups: [ function ]
|
||||
function: [ groups ]
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
"^cfg-":
|
||||
$ref: pincfg-node.yaml#
|
||||
|
||||
properties:
|
||||
pins:
|
||||
description:
|
||||
A list of pins to configure in certain ways, such as enabling
|
||||
debouncing
|
||||
items:
|
||||
pattern: "^gpio1?[0-9]{1,2}$"
|
||||
|
||||
input-debounce: true
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/interrupt-controller/irq.h>
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
pinctrl: pinctrl@b8003000 {
|
||||
compatible = "nuvoton,wpcm450-pinctrl";
|
||||
reg = <0xb8003000 0x1000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
gpio0: gpio@0 {
|
||||
reg = <0>;
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
interrupts = <2 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<3 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<4 IRQ_TYPE_LEVEL_HIGH>;
|
||||
};
|
||||
|
||||
mux-rmii2 {
|
||||
groups = "rmii2";
|
||||
function = "rmii2";
|
||||
};
|
||||
|
||||
pinmux_uid: mux-uid {
|
||||
groups = "gspi", "sspi";
|
||||
function = "gpio";
|
||||
};
|
||||
|
||||
pinctrl_uid: cfg-uid {
|
||||
pins = "gpio14";
|
||||
input-debounce = <1>;
|
||||
};
|
||||
};
|
||||
|
||||
gpio-keys {
|
||||
compatible = "gpio-keys";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_uid>, <&pinmux_uid>;
|
||||
|
||||
uid {
|
||||
label = "UID";
|
||||
linux,code = <102>;
|
||||
gpios = <&gpio0 14 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
};
|
||||
297
Documentation/devicetree/bindings/pinctrl/pinctrl-mt8186.yaml
Normal file
297
Documentation/devicetree/bindings/pinctrl/pinctrl-mt8186.yaml
Normal file
|
|
@ -0,0 +1,297 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/pinctrl/pinctrl-mt8186.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Mediatek MT8186 Pin Controller
|
||||
|
||||
maintainers:
|
||||
- Sean Wang <sean.wang@mediatek.com>
|
||||
|
||||
description: |
|
||||
The Mediatek's Pin controller is used to control SoC pins.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: mediatek,mt8186-pinctrl
|
||||
|
||||
gpio-controller: true
|
||||
|
||||
'#gpio-cells':
|
||||
description: |
|
||||
Number of cells in GPIO specifier. Since the generic GPIO binding is used,
|
||||
the amount of cells must be specified as 2. See the below
|
||||
mentioned gpio binding representation for description of particular cells.
|
||||
const: 2
|
||||
|
||||
gpio-ranges:
|
||||
maxItems: 1
|
||||
|
||||
reg:
|
||||
description: |
|
||||
Physical address base for gpio base registers. There are 8 different GPIO
|
||||
physical address base in mt8186.
|
||||
maxItems: 8
|
||||
|
||||
reg-names:
|
||||
description: |
|
||||
Gpio base register names.
|
||||
items:
|
||||
- const: iocfg0
|
||||
- const: iocfg_bm
|
||||
- const: iocfg_bl
|
||||
- const: iocfg_br
|
||||
- const: iocfg_lm
|
||||
- const: iocfg_rb
|
||||
- const: iocfg_tl
|
||||
- const: eint
|
||||
|
||||
interrupt-controller: true
|
||||
|
||||
'#interrupt-cells':
|
||||
const: 2
|
||||
|
||||
interrupts:
|
||||
description: The interrupt outputs to sysirq
|
||||
maxItems: 1
|
||||
|
||||
mediatek,rsel-resistance-in-si-unit:
|
||||
type: boolean
|
||||
description: |
|
||||
Identifying i2c pins pull up/down type which is RSEL. It can support
|
||||
RSEL define or si unit value(ohm) to set different resistance.
|
||||
|
||||
# PIN CONFIGURATION NODES
|
||||
patternProperties:
|
||||
'-pins$':
|
||||
type: object
|
||||
additionalProperties: false
|
||||
patternProperties:
|
||||
'^pins':
|
||||
type: object
|
||||
additionalProperties: false
|
||||
description: |
|
||||
A pinctrl node should contain at least one subnodes representing the
|
||||
pinctrl groups available on the machine. Each subnode will list the
|
||||
pins it needs, and how they should be configured, with regard to muxer
|
||||
configuration, pullups, drive strength, input enable/disable and
|
||||
input schmitt.
|
||||
An example of using macro:
|
||||
pincontroller {
|
||||
/* GPIO0 set as multifunction GPIO0 */
|
||||
gpio-pins {
|
||||
pins {
|
||||
pinmux = <PINMUX_GPIO0__FUNC_GPIO0>;
|
||||
}
|
||||
};
|
||||
/* GPIO128 set as multifunction SDA0 */
|
||||
i2c0-pins {
|
||||
pins {
|
||||
pinmux = <PINMUX_GPIO128__FUNC_SDA0>;
|
||||
}
|
||||
};
|
||||
};
|
||||
$ref: "pinmux-node.yaml"
|
||||
|
||||
properties:
|
||||
pinmux:
|
||||
description: |
|
||||
Integer array, represents gpio pin number and mux setting.
|
||||
Supported pin number and mux varies for different SoCs, and are
|
||||
defined as macros in dt-bindings/pinctrl/<soc>-pinfunc.h
|
||||
directly.
|
||||
|
||||
drive-strength:
|
||||
enum: [2, 4, 6, 8, 10, 12, 14, 16]
|
||||
|
||||
mediatek,drive-strength-adv:
|
||||
description: |
|
||||
Describe the specific driving setup property.
|
||||
For I2C pins, the existing generic driving setup can only support
|
||||
2/4/6/8/10/12/14/16mA driving. But in specific driving setup, they
|
||||
can support 0.125/0.25/0.5/1mA adjustment. If we enable specific
|
||||
driving setup, the existing generic setup will be disabled.
|
||||
The specific driving setup is controlled by E1E0EN.
|
||||
When E1=0/E0=0, the strength is 0.125mA.
|
||||
When E1=0/E0=1, the strength is 0.25mA.
|
||||
When E1=1/E0=0, the strength is 0.5mA.
|
||||
When E1=1/E0=1, the strength is 1mA.
|
||||
EN is used to enable or disable the specific driving setup.
|
||||
Valid arguments are described as below:
|
||||
0: (E1, E0, EN) = (0, 0, 0)
|
||||
1: (E1, E0, EN) = (0, 0, 1)
|
||||
2: (E1, E0, EN) = (0, 1, 0)
|
||||
3: (E1, E0, EN) = (0, 1, 1)
|
||||
4: (E1, E0, EN) = (1, 0, 0)
|
||||
5: (E1, E0, EN) = (1, 0, 1)
|
||||
6: (E1, E0, EN) = (1, 1, 0)
|
||||
7: (E1, E0, EN) = (1, 1, 1)
|
||||
So the valid arguments are from 0 to 7.
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
enum: [0, 1, 2, 3, 4, 5, 6, 7]
|
||||
|
||||
bias-pull-down:
|
||||
oneOf:
|
||||
- type: boolean
|
||||
- enum: [100, 101, 102, 103]
|
||||
description: mt8186 pull down PUPD/R0/R1 type define value.
|
||||
- enum: [200, 201, 202, 203]
|
||||
description: mt8186 pull down RSEL type define value.
|
||||
- enum: [75000, 5000]
|
||||
description: mt8186 pull down RSEL type si unit value(ohm).
|
||||
description: |
|
||||
For pull down type is normal, it don't need add RSEL & R1R0 define
|
||||
and resistance value.
|
||||
For pull down type is PUPD/R0/R1 type, it can add R1R0 define to
|
||||
set different resistance. It can support "MTK_PUPD_SET_R1R0_00" &
|
||||
"MTK_PUPD_SET_R1R0_01" & "MTK_PUPD_SET_R1R0_10" &
|
||||
"MTK_PUPD_SET_R1R0_11" define in mt8186.
|
||||
For pull down type is RSEL, it can add RSEL define & resistance
|
||||
value(ohm) to set different resistance by identifying property
|
||||
"mediatek,rsel-resistance-in-si-unit".
|
||||
It can support "MTK_PULL_SET_RSEL_000" & "MTK_PULL_SET_RSEL_001"
|
||||
& "MTK_PULL_SET_RSEL_010" & "MTK_PULL_SET_RSEL_011"
|
||||
define in mt8186. It can also support resistance value(ohm)
|
||||
"75000" & "5000" in mt8186.
|
||||
An example of using RSEL define:
|
||||
pincontroller {
|
||||
i2c0_pin {
|
||||
pins {
|
||||
pinmux = <PINMUX_GPIO128__FUNC_SDA0>;
|
||||
bias-pull-down = <MTK_PULL_SET_RSEL_001>;
|
||||
}
|
||||
};
|
||||
};
|
||||
An example of using si unit resistance value(ohm):
|
||||
&pio {
|
||||
mediatek,rsel-resistance-in-si-unit;
|
||||
}
|
||||
pincontroller {
|
||||
i2c0_pin {
|
||||
pins {
|
||||
pinmux = <PINMUX_GPIO128__FUNC_SDA0>;
|
||||
bias-pull-down = <75000>;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
bias-pull-up:
|
||||
oneOf:
|
||||
- type: boolean
|
||||
- enum: [100, 101, 102, 103]
|
||||
description: mt8186 pull up PUPD/R0/R1 type define value.
|
||||
- enum: [200, 201, 202, 203]
|
||||
description: mt8186 pull up RSEL type define value.
|
||||
- enum: [1000, 5000, 10000, 75000]
|
||||
description: mt8186 pull up RSEL type si unit value(ohm).
|
||||
description: |
|
||||
For pull up type is normal, it don't need add RSEL & R1R0 define
|
||||
and resistance value.
|
||||
For pull up type is PUPD/R0/R1 type, it can add R1R0 define to
|
||||
set different resistance. It can support "MTK_PUPD_SET_R1R0_00" &
|
||||
"MTK_PUPD_SET_R1R0_01" & "MTK_PUPD_SET_R1R0_10" &
|
||||
"MTK_PUPD_SET_R1R0_11" define in mt8186.
|
||||
For pull up type is RSEL, it can add RSEL define & resistance
|
||||
value(ohm) to set different resistance by identifying property
|
||||
"mediatek,rsel-resistance-in-si-unit".
|
||||
It can support "MTK_PULL_SET_RSEL_000" & "MTK_PULL_SET_RSEL_001"
|
||||
& "MTK_PULL_SET_RSEL_010" & "MTK_PULL_SET_RSEL_011"
|
||||
define in mt8186. It can also support resistance value(ohm)
|
||||
"1000" & "5000" & "10000" & "75000" in mt8186.
|
||||
An example of using si unit resistance value(ohm):
|
||||
&pio {
|
||||
mediatek,rsel-resistance-in-si-unit;
|
||||
}
|
||||
pincontroller {
|
||||
i2c0-pins {
|
||||
pins {
|
||||
pinmux = <PINMUX_GPIO128__FUNC_SDA0>;
|
||||
bias-pull-up = <1000>;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
bias-disable: true
|
||||
|
||||
output-high: true
|
||||
|
||||
output-low: true
|
||||
|
||||
input-enable: true
|
||||
|
||||
input-disable: true
|
||||
|
||||
input-schmitt-enable: true
|
||||
|
||||
input-schmitt-disable: true
|
||||
|
||||
required:
|
||||
- pinmux
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
- interrupt-controller
|
||||
- '#interrupt-cells'
|
||||
- gpio-controller
|
||||
- '#gpio-cells'
|
||||
- gpio-ranges
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/pinctrl/mt8186-pinfunc.h>
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
|
||||
pio: pinctrl@10005000 {
|
||||
compatible = "mediatek,mt8186-pinctrl";
|
||||
reg = <0x10005000 0x1000>,
|
||||
<0x10002000 0x0200>,
|
||||
<0x10002200 0x0200>,
|
||||
<0x10002400 0x0200>,
|
||||
<0x10002600 0x0200>,
|
||||
<0x10002A00 0x0200>,
|
||||
<0x10002c00 0x0200>,
|
||||
<0x1000b000 0x1000>;
|
||||
reg-names = "iocfg0", "iocfg_bm", "iocfg_bl",
|
||||
"iocfg_br", "iocfg_lm", "iocfg_rb",
|
||||
"iocfg_tl", "eint";
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
gpio-ranges = <&pio 0 0 185>;
|
||||
interrupt-controller;
|
||||
interrupts = <GIC_SPI 186 IRQ_TYPE_LEVEL_HIGH 0>;
|
||||
#interrupt-cells = <2>;
|
||||
|
||||
pio-pins {
|
||||
pins {
|
||||
pinmux = <PINMUX_GPIO0__FUNC_GPIO0>;
|
||||
output-low;
|
||||
};
|
||||
};
|
||||
|
||||
spi0-pins {
|
||||
pins-spi {
|
||||
pinmux = <PINMUX_GPIO0__FUNC_SPI0_CLK_B>,
|
||||
<PINMUX_GPIO1__FUNC_SPI0_CSB_B>,
|
||||
<PINMUX_GPIO2__FUNC_SPI0_MO_B>;
|
||||
bias-disable;
|
||||
};
|
||||
pins-spi-mi {
|
||||
pinmux = <PINMUX_GPIO3__FUNC_SPI0_MI_B>;
|
||||
bias-pull-down;
|
||||
};
|
||||
};
|
||||
|
||||
i2c0-pins {
|
||||
pins {
|
||||
pinmux = <PINMUX_GPIO127__FUNC_SCL0>,
|
||||
<PINMUX_GPIO128__FUNC_SDA0>;
|
||||
bias-pull-up = <MTK_PULL_SET_RSEL_001>;
|
||||
mediatek,drive-strength-adv = <7>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
@ -98,7 +98,41 @@ patternProperties:
|
|||
drive-strength:
|
||||
enum: [2, 4, 6, 8, 10, 12, 14, 16]
|
||||
|
||||
mediatek,drive-strength-adv:
|
||||
description: |
|
||||
Describe the specific driving setup property.
|
||||
For I2C pins, the existing generic driving setup can only support
|
||||
2/4/6/8/10/12/14/16mA driving. But in specific driving setup, they
|
||||
can support 0.125/0.25/0.5/1mA adjustment. If we enable specific
|
||||
driving setup, the existing generic setup will be disabled.
|
||||
The specific driving setup is controlled by E1E0EN.
|
||||
When E1=0/E0=0, the strength is 0.125mA.
|
||||
When E1=0/E0=1, the strength is 0.25mA.
|
||||
When E1=1/E0=0, the strength is 0.5mA.
|
||||
When E1=1/E0=1, the strength is 1mA.
|
||||
EN is used to enable or disable the specific driving setup.
|
||||
Valid arguments are described as below:
|
||||
0: (E1, E0, EN) = (0, 0, 0)
|
||||
1: (E1, E0, EN) = (0, 0, 1)
|
||||
2: (E1, E0, EN) = (0, 1, 0)
|
||||
3: (E1, E0, EN) = (0, 1, 1)
|
||||
4: (E1, E0, EN) = (1, 0, 0)
|
||||
5: (E1, E0, EN) = (1, 0, 1)
|
||||
6: (E1, E0, EN) = (1, 1, 0)
|
||||
7: (E1, E0, EN) = (1, 1, 1)
|
||||
So the valid arguments are from 0 to 7.
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
enum: [0, 1, 2, 3, 4, 5, 6, 7]
|
||||
|
||||
bias-pull-down:
|
||||
oneOf:
|
||||
- type: boolean
|
||||
- enum: [100, 101, 102, 103]
|
||||
description: mt8195 pull down PUPD/R0/R1 type define value.
|
||||
- enum: [200, 201, 202, 203, 204, 205, 206, 207]
|
||||
description: mt8195 pull down RSEL type define value.
|
||||
- enum: [75000, 5000]
|
||||
description: mt8195 pull down RSEL type si unit value(ohm).
|
||||
description: |
|
||||
For pull down type is normal, it don't need add RSEL & R1R0 define
|
||||
and resistance value.
|
||||
|
|
@ -115,13 +149,6 @@ patternProperties:
|
|||
& "MTK_PULL_SET_RSEL_110" & "MTK_PULL_SET_RSEL_111"
|
||||
define in mt8195. It can also support resistance value(ohm)
|
||||
"75000" & "5000" in mt8195.
|
||||
oneOf:
|
||||
- enum: [100, 101, 102, 103]
|
||||
- description: mt8195 pull down PUPD/R0/R1 type define value.
|
||||
- enum: [200, 201, 202, 203, 204, 205, 206, 207]
|
||||
- description: mt8195 pull down RSEL type define value.
|
||||
- enum: [75000, 5000]
|
||||
- description: mt8195 pull down RSEL type si unit value(ohm).
|
||||
|
||||
An example of using RSEL define:
|
||||
pincontroller {
|
||||
|
|
@ -146,6 +173,14 @@ patternProperties:
|
|||
};
|
||||
|
||||
bias-pull-up:
|
||||
oneOf:
|
||||
- type: boolean
|
||||
- enum: [100, 101, 102, 103]
|
||||
description: mt8195 pull up PUPD/R0/R1 type define value.
|
||||
- enum: [200, 201, 202, 203, 204, 205, 206, 207]
|
||||
description: mt8195 pull up RSEL type define value.
|
||||
- enum: [1000, 1500, 2000, 3000, 4000, 5000, 10000, 75000]
|
||||
description: mt8195 pull up RSEL type si unit value(ohm).
|
||||
description: |
|
||||
For pull up type is normal, it don't need add RSEL & R1R0 define
|
||||
and resistance value.
|
||||
|
|
@ -163,13 +198,6 @@ patternProperties:
|
|||
define in mt8195. It can also support resistance value(ohm)
|
||||
"1000" & "1500" & "2000" & "3000" & "4000" & "5000" & "10000" &
|
||||
"75000" in mt8195.
|
||||
oneOf:
|
||||
- enum: [100, 101, 102, 103]
|
||||
- description: mt8195 pull up PUPD/R0/R1 type define value.
|
||||
- enum: [200, 201, 202, 203, 204, 205, 206, 207]
|
||||
- description: mt8195 pull up RSEL type define value.
|
||||
- enum: [1000, 1500, 2000, 3000, 4000, 5000, 10000, 75000]
|
||||
- description: mt8195 pull up RSEL type si unit value(ohm).
|
||||
An example of using RSEL define:
|
||||
pincontroller {
|
||||
i2c0-pins {
|
||||
|
|
@ -268,4 +296,13 @@ examples:
|
|||
bias-pull-down;
|
||||
};
|
||||
};
|
||||
|
||||
i2c0-pins {
|
||||
pins {
|
||||
pinmux = <PINMUX_GPIO8__FUNC_SDA0>,
|
||||
<PINMUX_GPIO9__FUNC_SCL0>;
|
||||
bias-disable;
|
||||
mediatek,drive-strength-adv = <7>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
|
|||
|
|
@ -34,6 +34,8 @@ properties:
|
|||
|
||||
gpio-controller: true
|
||||
|
||||
gpio-reserved-ranges: true
|
||||
|
||||
'#gpio-cells':
|
||||
description: Specifying the pin number and flags, as defined in
|
||||
include/dt-bindings/gpio/gpio.h
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@ properties:
|
|||
- qcom,pm8350-gpio
|
||||
- qcom,pm8350b-gpio
|
||||
- qcom,pm8350c-gpio
|
||||
- qcom,pm8450-gpio
|
||||
- qcom,pm8916-gpio
|
||||
- qcom,pm8917-gpio
|
||||
- qcom,pm8921-gpio
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@ properties:
|
|||
- qcom,pm8019-mpp
|
||||
- qcom,pm8038-mpp
|
||||
- qcom,pm8058-mpp
|
||||
- qcom,pm8226-mpp
|
||||
- qcom,pm8821-mpp
|
||||
- qcom,pm8841-mpp
|
||||
- qcom,pm8916-mpp
|
||||
|
|
|
|||
|
|
@ -0,0 +1,151 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/pinctrl/qcom,sc8280xp-pinctrl.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Qualcomm Technologies, Inc. SC8280XP TLMM block
|
||||
|
||||
maintainers:
|
||||
- Bjorn Andersson <bjorn.andersson@linaro.org>
|
||||
|
||||
description: |
|
||||
This binding describes the Top Level Mode Multiplexer block found in the
|
||||
SC8280XP platform.
|
||||
|
||||
allOf:
|
||||
- $ref: /schemas/pinctrl/qcom,tlmm-common.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: qcom,sc8280xp-tlmm
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts: true
|
||||
interrupt-controller: true
|
||||
'#interrupt-cells': true
|
||||
gpio-controller: true
|
||||
gpio-reserved-ranges: true
|
||||
'#gpio-cells': true
|
||||
gpio-ranges: true
|
||||
wakeup-parent: true
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
patternProperties:
|
||||
'-state$':
|
||||
oneOf:
|
||||
- $ref: "#/$defs/qcom-sc8280xp-tlmm-state"
|
||||
- patternProperties:
|
||||
".*":
|
||||
$ref: "#/$defs/qcom-sc8280xp-tlmm-state"
|
||||
|
||||
'$defs':
|
||||
qcom-sc8280xp-tlmm-state:
|
||||
type: object
|
||||
description:
|
||||
Pinctrl node's client devices use subnodes for desired pin configuration.
|
||||
Client device subnodes use below standard properties.
|
||||
$ref: "qcom,tlmm-common.yaml#/$defs/qcom-tlmm-state"
|
||||
|
||||
properties:
|
||||
pins:
|
||||
description:
|
||||
List of gpio pins affected by the properties specified in this
|
||||
subnode.
|
||||
items:
|
||||
oneOf:
|
||||
- pattern: "^gpio([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-1][0-9]|22[0-7])$"
|
||||
- enum: [ sdc2_clk, sdc2_cmd, sdc2_data, ufs_reset, ufs1_reset ]
|
||||
minItems: 1
|
||||
maxItems: 16
|
||||
|
||||
function:
|
||||
description:
|
||||
Specify the alternative function to be configured for the specified
|
||||
pins.
|
||||
|
||||
enum: [ atest_char, atest_usb, audio_ref, cam_mclk, cci_async, cci_i2c,
|
||||
cci_timer0, cci_timer1, cci_timer2, cci_timer3, cci_timer4,
|
||||
cci_timer5, cci_timer6, cci_timer7, cci_timer8, cci_timer9,
|
||||
cmu_rng, cri_trng, cri_trng0, cri_trng1, dbg_out, ddr_bist,
|
||||
ddr_pxi0, ddr_pxi1, ddr_pxi2, ddr_pxi3, ddr_pxi4, ddr_pxi5,
|
||||
ddr_pxi6, ddr_pxi7, dp2_hot, dp3_hot, edp0_lcd, edp1_lcd,
|
||||
edp2_lcd, edp3_lcd, edp_hot, emac0_dll, emac0_mcg0, emac0_mcg1,
|
||||
emac0_mcg2, emac0_mcg3, emac0_phy, emac0_ptp, emac1_dll0,
|
||||
emac1_dll1, emac1_mcg0, emac1_mcg1, emac1_mcg2, emac1_mcg3,
|
||||
emac1_phy, emac1_ptp, gcc_gp1, gcc_gp2, gcc_gp3, gcc_gp4,
|
||||
gcc_gp5, gpio, hs1_mi2s, hs2_mi2s, hs3_mi2s, ibi_i3c,
|
||||
jitter_bist, lpass_slimbus, mdp0_vsync0, mdp0_vsync1,
|
||||
mdp0_vsync2, mdp0_vsync3, mdp0_vsync4, mdp0_vsync5,
|
||||
mdp0_vsync6, mdp0_vsync7, mdp0_vsync8, mdp1_vsync0,
|
||||
mdp1_vsync1, mdp1_vsync2, mdp1_vsync3, mdp1_vsync4,
|
||||
mdp1_vsync5, mdp1_vsync6, mdp1_vsync7, mdp1_vsync8, mdp_vsync,
|
||||
mi2s0_data0, mi2s0_data1, mi2s0_sck, mi2s0_ws, mi2s1_data0,
|
||||
mi2s1_data1, mi2s1_sck, mi2s1_ws, mi2s2_data0, mi2s2_data1,
|
||||
mi2s2_sck, mi2s2_ws, mi2s_mclk1, mi2s_mclk2, pcie2a_clkreq,
|
||||
pcie2b_clkreq, pcie3a_clkreq, pcie3b_clkreq, pcie4_clkreq,
|
||||
phase_flag, pll_bist, pll_clk, prng_rosc0, prng_rosc1,
|
||||
prng_rosc2, prng_rosc3, qdss_cti, qdss_gpio, qspi, qspi_clk,
|
||||
qspi_cs, qup0, qup1, qup2, qup3, qup4, qup5, qup6, qup7, qup8,
|
||||
qup9, qup10, qup11, qup12, qup13, qup14, qup15, qup16, qup17,
|
||||
qup18, qup19, qup20, qup21, qup22, qup23, rgmii_0, rgmii_1,
|
||||
sd_write, sdc40, sdc42, sdc43, sdc4_clk, sdc4_cmd, tb_trig,
|
||||
tgu, tsense_pwm1, tsense_pwm2, tsense_pwm3, tsense_pwm4,
|
||||
usb0_dp, usb0_phy, usb0_sbrx, usb0_sbtx, usb0_usb4, usb1_dp,
|
||||
usb1_phy, usb1_sbrx, usb1_sbtx, usb1_usb4, usb2phy_ac,
|
||||
vsense_trigger ]
|
||||
|
||||
bias-disable: true
|
||||
bias-pull-down: true
|
||||
bias-pull-up: true
|
||||
drive-strength: true
|
||||
input-enable: true
|
||||
output-high: true
|
||||
output-low: true
|
||||
|
||||
required:
|
||||
- pins
|
||||
- function
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
pinctrl@f100000 {
|
||||
compatible = "qcom,sc8280xp-tlmm";
|
||||
reg = <0x0f100000 0x300000>;
|
||||
interrupts = <GIC_SPI 208 IRQ_TYPE_LEVEL_HIGH>;
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <2>;
|
||||
gpio-ranges = <&tlmm 0 0 230>;
|
||||
|
||||
gpio-wo-subnode-state {
|
||||
pins = "gpio1";
|
||||
function = "gpio";
|
||||
};
|
||||
|
||||
uart-w-subnodes-state {
|
||||
rx {
|
||||
pins = "gpio4";
|
||||
function = "qup14";
|
||||
bias-pull-up;
|
||||
};
|
||||
|
||||
tx {
|
||||
pins = "gpio5";
|
||||
function = "qup14";
|
||||
bias-disable;
|
||||
};
|
||||
};
|
||||
};
|
||||
...
|
||||
|
|
@ -73,7 +73,6 @@ $defs:
|
|||
properties:
|
||||
drive-strength:
|
||||
enum: [2, 4, 6, 8, 10, 12, 14, 16]
|
||||
default: 2
|
||||
description:
|
||||
Selects the drive strength for the specified pins, in mA.
|
||||
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ maintainers:
|
|||
- Sergio Paracuellos <sergio.paracuellos@gmail.com>
|
||||
|
||||
description:
|
||||
The rt2880 pinmux can only set the muxing of pin groups. muxing indiviual pins
|
||||
The rt2880 pinmux can only set the muxing of pin groups. Muxing indiviual pins
|
||||
is not supported. There is no pinconf support.
|
||||
|
||||
properties:
|
||||
|
|
@ -29,12 +29,13 @@ patternProperties:
|
|||
properties:
|
||||
groups:
|
||||
description: Name of the pin group to use for the functions.
|
||||
enum: [i2c, spi, uart1, uart2, uart3, rgmii1, rgmii2, mdio,
|
||||
pcie, sdhci]
|
||||
enum: [i2c, jtag, mdio, pcie, rgmii1, rgmii2, sdhci, spi,
|
||||
uart1, uart2, uart3, wdt]
|
||||
function:
|
||||
description: The mux function to select
|
||||
enum: [gpio, i2c, spi, uart1, uart2, uart3, rgmii1, rgmii2,
|
||||
mdio, nand1, nand2, sdhci]
|
||||
enum: [gpio, i2c, i2s, jtag, mdio, nand1, nand2, pcie refclk,
|
||||
pcie rst, pcm, rgmii1, rgmii2, sdhci, spdif2, spdif3,
|
||||
spi, uart1, uart2, uart3, wdt refclk, wdt rst]
|
||||
|
||||
required:
|
||||
- groups
|
||||
|
|
|
|||
|
|
@ -44,6 +44,7 @@ properties:
|
|||
- renesas,pfc-r8a77990 # R-Car E3
|
||||
- renesas,pfc-r8a77995 # R-Car D3
|
||||
- renesas,pfc-r8a779a0 # R-Car V3U
|
||||
- renesas,pfc-r8a779f0 # R-Car S4-8
|
||||
- renesas,pfc-sh73a0 # SH-Mobile AG5
|
||||
|
||||
reg:
|
||||
|
|
|
|||
|
|
@ -4,14 +4,14 @@
|
|||
$id: http://devicetree.org/schemas/pinctrl/renesas,rzg2l-pinctrl.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Renesas RZ/G2L combined Pin and GPIO controller
|
||||
title: Renesas RZ/{G2L,V2L} combined Pin and GPIO controller
|
||||
|
||||
maintainers:
|
||||
- Geert Uytterhoeven <geert+renesas@glider.be>
|
||||
- Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
|
||||
|
||||
description:
|
||||
The Renesas SoCs of the RZ/G2L series feature a combined Pin and GPIO
|
||||
The Renesas SoCs of the RZ/{G2L,V2L} series feature a combined Pin and GPIO
|
||||
controller.
|
||||
Pin multiplexing and GPIO configuration is performed on a per-pin basis.
|
||||
Each port features up to 8 pins, each of them configurable for GPIO function
|
||||
|
|
@ -20,8 +20,15 @@ description:
|
|||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- renesas,r9a07g044-pinctrl # RZ/G2{L,LC}
|
||||
oneOf:
|
||||
- items:
|
||||
- enum:
|
||||
- renesas,r9a07g044-pinctrl # RZ/G2{L,LC}
|
||||
|
||||
- items:
|
||||
- enum:
|
||||
- renesas,r9a07g054-pinctrl # RZ/V2L
|
||||
- const: renesas,r9a07g044-pinctrl # RZ/G2{L,LC} fallback for RZ/V2L
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
|
@ -76,6 +83,7 @@ additionalProperties:
|
|||
output-impedance-ohms:
|
||||
enum: [ 33, 50, 66, 100 ]
|
||||
power-source:
|
||||
description: I/O voltage in millivolt.
|
||||
enum: [ 1800, 2500, 3300 ]
|
||||
slew-rate: true
|
||||
gpio-hog: true
|
||||
|
|
|
|||
|
|
@ -56,6 +56,7 @@ properties:
|
|||
- samsung,exynos7885-pinctrl
|
||||
- samsung,exynos850-pinctrl
|
||||
- samsung,exynosautov9-pinctrl
|
||||
- tesla,fsd-pinctrl
|
||||
|
||||
interrupts:
|
||||
description:
|
||||
|
|
|
|||
|
|
@ -0,0 +1,374 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
# Copyright (C) Sunplus Co., Ltd.
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/pinctrl/sunplus,sp7021-pinctrl.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Sunplus SP7021 Pin Controller Device Tree Bindings
|
||||
|
||||
maintainers:
|
||||
- Dvorkin Dmitry <dvorkin@tibbo.com>
|
||||
- Wells Lu <wellslutw@gmail.com>
|
||||
|
||||
description: |
|
||||
The Sunplus SP7021 pin controller is used to control SoC pins. Please
|
||||
refer to pinctrl-bindings.txt in this directory for details of the common
|
||||
pinctrl bindings used by client devices.
|
||||
|
||||
SP7021 has 99 digital GPIO pins which are numbered from GPIO 0 to 98. All
|
||||
are multiplexed with some special function pins. SP7021 has 3 types of
|
||||
special function pins:
|
||||
|
||||
(1) function-group pins:
|
||||
Ex 1 (SPI-NOR flash):
|
||||
If control-field SPI_FLASH_SEL is set to 1, GPIO 83, 84, 86 and 87
|
||||
will be pins of SPI-NOR flash. If it is set to 2, GPIO 76, 78, 79
|
||||
and 81 will be pins of SPI-NOR flash.
|
||||
|
||||
Ex 2 (UART_0):
|
||||
If control-bit UA0_SEL is set to 1, GPIO 88 and 89 will be TX and
|
||||
RX pins of UART_0 (UART channel 0).
|
||||
|
||||
Ex 3 (eMMC):
|
||||
If control-bit EMMC_SEL is set to 1, GPIO 72, 73, 74, 75, 76, 77,
|
||||
78, 79, 80, 81 will be pins of an eMMC device.
|
||||
|
||||
Properties "function" and "groups" are used to select function-group
|
||||
pins.
|
||||
|
||||
(2) fully pin-mux (like phone exchange mux) pins:
|
||||
GPIO 8 to 71 are 'fully pin-mux' pins. Any pins of peripherals of
|
||||
SP7021 (ex: UART_1, UART_2, UART_3, UART_4, I2C_0, I2C_1, and etc.)
|
||||
can be routed to any pins of fully pin-mux pins.
|
||||
|
||||
Ex 1 (UART channel 1):
|
||||
If control-field UA1_TX_SEL is set to 3, TX pin of UART_1 will be
|
||||
routed to GPIO 10 (3 - 1 + 8 = 10).
|
||||
If control-field UA1_RX_SEL is set to 4, RX pin of UART_1 will be
|
||||
routed to GPIO 11 (4 - 1 + 8 = 11).
|
||||
If control-field UA1_RTS_SEL is set to 5, RTS pin of UART_1 will
|
||||
be routed to GPIO 12 (5 - 1 + 8 = 12).
|
||||
If control-field UA1_CTS_SEL is set to 6, CTS pin of UART_1 will
|
||||
be routed to GPIO 13 (6 - 1 + 8 = 13).
|
||||
|
||||
Ex 2 (I2C channel 0):
|
||||
If control-field I2C0_CLK_SEL is set to 20, CLK pin of I2C_0 will
|
||||
be routed to GPIO 27 (20 - 1 + 8 = 27).
|
||||
If control-field I2C0_DATA_SEL is set to 21, DATA pin of I2C_0
|
||||
will be routed to GPIO 28 (21 - 1 + 9 = 28).
|
||||
|
||||
Totally, SP7021 has 120 peripheral pins. The peripheral pins can be
|
||||
routed to any of 64 'fully pin-mux' pins.
|
||||
|
||||
(3) I/O processor pins
|
||||
SP7021 has a built-in I/O processor.
|
||||
Any GPIO pins (GPIO 0 to 98) can be set to pins of I/O processor.
|
||||
|
||||
Vendor property "sunplus,pins" is used to select "fully pin-mux" pins,
|
||||
"I/O processor pins" and "digital GPIO" pins.
|
||||
|
||||
The device node of pin controller of Sunplus SP7021 has following
|
||||
properties.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: sunplus,sp7021-pctl
|
||||
|
||||
gpio-controller: true
|
||||
|
||||
'#gpio-cells':
|
||||
const: 2
|
||||
|
||||
reg:
|
||||
items:
|
||||
- description: the MOON2 registers
|
||||
- description: the GPIOXT registers
|
||||
- description: the FIRST registers
|
||||
- description: the MOON1 registers
|
||||
|
||||
reg-names:
|
||||
items:
|
||||
- const: moon2
|
||||
- const: gpioxt
|
||||
- const: first
|
||||
- const: moon1
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
|
||||
resets:
|
||||
maxItems: 1
|
||||
|
||||
patternProperties:
|
||||
'-pins$':
|
||||
type: object
|
||||
description: |
|
||||
A pinctrl node should contain at least one subnodes representing the
|
||||
pins or function-pins group available on the machine. Each subnode
|
||||
will list the pins it needs, and how they should be configured.
|
||||
|
||||
Pinctrl node's client devices use subnodes for desired pin
|
||||
configuration. Client device subnodes use below standard properties.
|
||||
$ref: pinmux-node.yaml#
|
||||
|
||||
properties:
|
||||
sunplus,pins:
|
||||
description: |
|
||||
Define 'sunplus,pins' which are used by pinctrl node's client
|
||||
device.
|
||||
|
||||
It consists of one or more integers which represents the config
|
||||
setting for corresponding pin. Each integer defines a individual
|
||||
pin in which:
|
||||
|
||||
Bit 32~24: defines GPIO number. Its range is 0 ~ 98.
|
||||
Bit 23~16: defines types: (1) fully pin-mux pins
|
||||
(2) IO processor pins
|
||||
(3) digital GPIO pins
|
||||
Bit 15~8: defines pins of peripherals (which are defined in
|
||||
'include/dt-binging/pinctrl/sppctl.h').
|
||||
Bit 7~0: defines types or initial-state of digital GPIO pins.
|
||||
|
||||
Please use macro SPPCTL_IOPAD to define the integers for pins.
|
||||
|
||||
$ref: /schemas/types.yaml#/definitions/uint32-array
|
||||
|
||||
function:
|
||||
description: |
|
||||
Define pin-function which is used by pinctrl node's client device.
|
||||
The name should be one of string in the following enumeration.
|
||||
$ref: "/schemas/types.yaml#/definitions/string"
|
||||
enum: [ SPI_FLASH, SPI_FLASH_4BIT, SPI_NAND, CARD0_EMMC, SD_CARD,
|
||||
UA0, FPGA_IFX, HDMI_TX, LCDIF, USB0_OTG, USB1_OTG ]
|
||||
|
||||
groups:
|
||||
description: |
|
||||
Define pin-group in a specified pin-function.
|
||||
The name should be one of string in the following enumeration.
|
||||
$ref: "/schemas/types.yaml#/definitions/string"
|
||||
enum: [ SPI_FLASH1, SPI_FLASH2, SPI_FLASH_4BIT1, SPI_FLASH_4BIT2,
|
||||
SPI_NAND, CARD0_EMMC, SD_CARD, UA0, FPGA_IFX, HDMI_TX1,
|
||||
HDMI_TX2, HDMI_TX3, LCDIF, USB0_OTG, USB1_OTG ]
|
||||
|
||||
sunplus,zerofunc:
|
||||
description: |
|
||||
This is a vendor specific property. It is used to disable pins
|
||||
which are not used by pinctrl node's client device.
|
||||
Some pins may be enabled by boot-loader. We can use this
|
||||
property to disable them.
|
||||
$ref: /schemas/types.yaml#/definitions/uint32-array
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
allOf:
|
||||
- if:
|
||||
properties:
|
||||
function:
|
||||
enum:
|
||||
- SPI_FLASH
|
||||
then:
|
||||
properties:
|
||||
groups:
|
||||
enum:
|
||||
- SPI_FLASH1
|
||||
- SPI_FLASH2
|
||||
- if:
|
||||
properties:
|
||||
function:
|
||||
enum:
|
||||
- SPI_FLASH_4BIT
|
||||
then:
|
||||
properties:
|
||||
groups:
|
||||
enum:
|
||||
- SPI_FLASH_4BIT1
|
||||
- SPI_FLASH_4BIT2
|
||||
- if:
|
||||
properties:
|
||||
function:
|
||||
enum:
|
||||
- SPI_NAND
|
||||
then:
|
||||
properties:
|
||||
groups:
|
||||
enum:
|
||||
- SPI_NAND
|
||||
- if:
|
||||
properties:
|
||||
function:
|
||||
enum:
|
||||
- CARD0_EMMC
|
||||
then:
|
||||
properties:
|
||||
groups:
|
||||
enum:
|
||||
- CARD0_EMMC
|
||||
- if:
|
||||
properties:
|
||||
function:
|
||||
enum:
|
||||
- SD_CARD
|
||||
then:
|
||||
properties:
|
||||
groups:
|
||||
enum:
|
||||
- SD_CARD
|
||||
- if:
|
||||
properties:
|
||||
function:
|
||||
enum:
|
||||
- UA0
|
||||
then:
|
||||
properties:
|
||||
groups:
|
||||
enum:
|
||||
- UA0
|
||||
- if:
|
||||
properties:
|
||||
function:
|
||||
enum:
|
||||
- FPGA_IFX
|
||||
then:
|
||||
properties:
|
||||
groups:
|
||||
enum:
|
||||
- FPGA_IFX
|
||||
- if:
|
||||
properties:
|
||||
function:
|
||||
enum:
|
||||
- HDMI_TX
|
||||
then:
|
||||
properties:
|
||||
groups:
|
||||
enum:
|
||||
- HDMI_TX1
|
||||
- HDMI_TX2
|
||||
- HDMI_TX3
|
||||
- if:
|
||||
properties:
|
||||
function:
|
||||
enum:
|
||||
- LCDIF
|
||||
then:
|
||||
properties:
|
||||
groups:
|
||||
enum:
|
||||
- LCDIF
|
||||
- if:
|
||||
properties:
|
||||
function:
|
||||
enum:
|
||||
- USB0_OTG
|
||||
then:
|
||||
properties:
|
||||
groups:
|
||||
enum:
|
||||
- USB0_OTG
|
||||
- if:
|
||||
properties:
|
||||
function:
|
||||
enum:
|
||||
- USB1_OTG
|
||||
then:
|
||||
properties:
|
||||
groups:
|
||||
enum:
|
||||
- USB1_OTG
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- reg-names
|
||||
- "#gpio-cells"
|
||||
- gpio-controller
|
||||
- clocks
|
||||
- resets
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/pinctrl/sppctl-sp7021.h>
|
||||
|
||||
pinctl@9c000100 {
|
||||
compatible = "sunplus,sp7021-pctl";
|
||||
reg = <0x9c000100 0x100>, <0x9c000300 0x100>,
|
||||
<0x9c0032e4 0x1c>, <0x9c000080 0x20>;
|
||||
reg-names = "moon2", "gpioxt", "first", "moon1";
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
clocks = <&clkc 0x83>;
|
||||
resets = <&rstc 0x73>;
|
||||
|
||||
uart0-pins {
|
||||
function = "UA0";
|
||||
groups = "UA0";
|
||||
};
|
||||
|
||||
spinand0-pins {
|
||||
function = "SPI_NAND";
|
||||
groups = "SPI_NAND";
|
||||
};
|
||||
|
||||
uart1-pins {
|
||||
sunplus,pins = <
|
||||
SPPCTL_IOPAD(11, SPPCTL_PCTL_G_PMUX, MUXF_UA1_TX, 0)
|
||||
SPPCTL_IOPAD(10, SPPCTL_PCTL_G_PMUX, MUXF_UA1_RX, 0)
|
||||
>;
|
||||
};
|
||||
|
||||
uart2-pins {
|
||||
sunplus,pins = <
|
||||
SPPCTL_IOPAD(20, SPPCTL_PCTL_G_PMUX, MUXF_UA1_TX, 0)
|
||||
SPPCTL_IOPAD(21, SPPCTL_PCTL_G_PMUX, MUXF_UA1_RX, 0)
|
||||
SPPCTL_IOPAD(22, SPPCTL_PCTL_G_PMUX, MUXF_UA1_RTS, 0)
|
||||
SPPCTL_IOPAD(23, SPPCTL_PCTL_G_PMUX, MUXF_UA1_CTS, 0)
|
||||
>;
|
||||
};
|
||||
|
||||
emmc-pins {
|
||||
function = "CARD0_EMMC";
|
||||
groups = "CARD0_EMMC";
|
||||
};
|
||||
|
||||
sdcard-pins {
|
||||
function = "SD_CARD";
|
||||
groups = "SD_CARD";
|
||||
sunplus,pins = < SPPCTL_IOPAD(91, SPPCTL_PCTL_G_GPIO, 0, 0) >;
|
||||
};
|
||||
|
||||
hdmi_A_tx1-pins {
|
||||
function = "HDMI_TX";
|
||||
groups = "HDMI_TX1";
|
||||
};
|
||||
hdmi_A_tx2-pins {
|
||||
function = "HDMI_TX";
|
||||
groups = "HDMI_TX2";
|
||||
};
|
||||
hdmi_A_tx3-pins {
|
||||
function = "HDMI_TX";
|
||||
groups = "HDMI_TX3";
|
||||
};
|
||||
|
||||
ethernet-pins {
|
||||
sunplus,pins = <
|
||||
SPPCTL_IOPAD(49,SPPCTL_PCTL_G_PMUX,MUXF_L2SW_CLK_OUT,0)
|
||||
SPPCTL_IOPAD(44,SPPCTL_PCTL_G_PMUX,MUXF_L2SW_MAC_SMI_MDC,0)
|
||||
SPPCTL_IOPAD(43,SPPCTL_PCTL_G_PMUX,MUXF_L2SW_MAC_SMI_MDIO,0)
|
||||
SPPCTL_IOPAD(52,SPPCTL_PCTL_G_PMUX,MUXF_L2SW_P0_MAC_RMII_TXEN,0)
|
||||
SPPCTL_IOPAD(50,SPPCTL_PCTL_G_PMUX,MUXF_L2SW_P0_MAC_RMII_TXD0,0)
|
||||
SPPCTL_IOPAD(51,SPPCTL_PCTL_G_PMUX,MUXF_L2SW_P0_MAC_RMII_TXD1,0)
|
||||
SPPCTL_IOPAD(46,SPPCTL_PCTL_G_PMUX,MUXF_L2SW_P0_MAC_RMII_CRSDV,0)
|
||||
SPPCTL_IOPAD(47,SPPCTL_PCTL_G_PMUX,MUXF_L2SW_P0_MAC_RMII_RXD0,0)
|
||||
SPPCTL_IOPAD(48,SPPCTL_PCTL_G_PMUX,MUXF_L2SW_P0_MAC_RMII_RXD1,0)
|
||||
>;
|
||||
sunplus,zerofunc = <
|
||||
MUXF_L2SW_LED_FLASH0
|
||||
MUXF_L2SW_LED_ON0
|
||||
MUXF_L2SW_P0_MAC_RMII_RXER
|
||||
>;
|
||||
};
|
||||
};
|
||||
...
|
||||
77
Documentation/devicetree/bindings/soc/qcom/qcom,eud.yaml
Normal file
77
Documentation/devicetree/bindings/soc/qcom/qcom,eud.yaml
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: "http://devicetree.org/schemas/soc/qcom/qcom,eud.yaml#"
|
||||
$schema: "http://devicetree.org/meta-schemas/core.yaml#"
|
||||
|
||||
title: Qualcomm Embedded USB Debugger
|
||||
|
||||
maintainers:
|
||||
- Souradeep Chowdhury <quic_schowdhu@quicinc.com>
|
||||
|
||||
description:
|
||||
This binding is used to describe the Qualcomm Embedded USB Debugger, which is
|
||||
mini USB-hub implemented on chip to support USB-based debug capabilities.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
items:
|
||||
- enum:
|
||||
- qcom,sc7280-eud
|
||||
- const: qcom,eud
|
||||
|
||||
reg:
|
||||
items:
|
||||
- description: EUD Base Register Region
|
||||
- description: EUD Mode Manager Register
|
||||
|
||||
interrupts:
|
||||
description: EUD interrupt
|
||||
maxItems: 1
|
||||
|
||||
ports:
|
||||
$ref: /schemas/graph.yaml#/properties/ports
|
||||
description:
|
||||
These ports is to be attached to the endpoint of the DWC3 controller node
|
||||
and type C connector node. The controller has the "usb-role-switch"
|
||||
property.
|
||||
|
||||
properties:
|
||||
port@0:
|
||||
$ref: /schemas/graph.yaml#/properties/port
|
||||
description: This port is to be attached to the DWC3 controller.
|
||||
|
||||
port@1:
|
||||
$ref: /schemas/graph.yaml#/properties/port
|
||||
description: This port is to be attached to the type C connector.
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- ports
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
eud@88e0000 {
|
||||
compatible = "qcom,sc7280-eud","qcom,eud";
|
||||
reg = <0x88e0000 0x2000>,
|
||||
<0x88e2000 0x1000>;
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
eud_ep: endpoint {
|
||||
remote-endpoint = <&usb2_role_switch>;
|
||||
};
|
||||
};
|
||||
port@1 {
|
||||
reg = <1>;
|
||||
eud_con: endpoint {
|
||||
remote-endpoint = <&con_eud>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
@ -1,115 +0,0 @@
|
|||
Samsung Exynos SoC USB controller
|
||||
|
||||
The USB devices interface with USB controllers on Exynos SOCs.
|
||||
The device node has following properties.
|
||||
|
||||
EHCI
|
||||
Required properties:
|
||||
- compatible: should be "samsung,exynos4210-ehci" for USB 2.0
|
||||
EHCI controller in host mode.
|
||||
- reg: physical base address of the controller and length of memory mapped
|
||||
region.
|
||||
- interrupts: interrupt number to the cpu.
|
||||
- clocks: from common clock binding: handle to usb clock.
|
||||
- clock-names: from common clock binding: Shall be "usbhost".
|
||||
- phys: from the *Generic PHY* bindings; array specifying phy(s) used
|
||||
by the root port.
|
||||
- phy-names: from the *Generic PHY* bindings; array of the names for
|
||||
each phy for the root ports, must be a subset of the following:
|
||||
"host", "hsic0", "hsic1".
|
||||
|
||||
Optional properties:
|
||||
- samsung,vbus-gpio: if present, specifies the GPIO that
|
||||
needs to be pulled up for the bus to be powered.
|
||||
|
||||
Example:
|
||||
|
||||
usb@12110000 {
|
||||
compatible = "samsung,exynos4210-ehci";
|
||||
reg = <0x12110000 0x100>;
|
||||
interrupts = <0 71 0>;
|
||||
samsung,vbus-gpio = <&gpx2 6 1 3 3>;
|
||||
|
||||
clocks = <&clock 285>;
|
||||
clock-names = "usbhost";
|
||||
|
||||
phys = <&usb2phy 1>;
|
||||
phy-names = "host";
|
||||
};
|
||||
|
||||
OHCI
|
||||
Required properties:
|
||||
- compatible: should be "samsung,exynos4210-ohci" for USB 2.0
|
||||
OHCI companion controller in host mode.
|
||||
- reg: physical base address of the controller and length of memory mapped
|
||||
region.
|
||||
- interrupts: interrupt number to the cpu.
|
||||
- clocks: from common clock binding: handle to usb clock.
|
||||
- clock-names: from common clock binding: Shall be "usbhost".
|
||||
- phys: from the *Generic PHY* bindings; array specifying phy(s) used
|
||||
by the root port.
|
||||
- phy-names: from the *Generic PHY* bindings; array of the names for
|
||||
each phy for the root ports, must be a subset of the following:
|
||||
"host", "hsic0", "hsic1".
|
||||
|
||||
Example:
|
||||
usb@12120000 {
|
||||
compatible = "samsung,exynos4210-ohci";
|
||||
reg = <0x12120000 0x100>;
|
||||
interrupts = <0 71 0>;
|
||||
|
||||
clocks = <&clock 285>;
|
||||
clock-names = "usbhost";
|
||||
|
||||
phys = <&usb2phy 1>;
|
||||
phy-names = "host";
|
||||
};
|
||||
|
||||
DWC3
|
||||
Required properties:
|
||||
- compatible: should be one of the following -
|
||||
"samsung,exynos5250-dwusb3": for USB 3.0 DWC3 controller on
|
||||
Exynos5250/5420.
|
||||
"samsung,exynos5433-dwusb3": for USB 3.0 DWC3 controller on
|
||||
Exynos5433.
|
||||
"samsung,exynos7-dwusb3": for USB 3.0 DWC3 controller on Exynos7.
|
||||
- #address-cells, #size-cells : should be '1' if the device has sub-nodes
|
||||
with 'reg' property.
|
||||
- ranges: allows valid 1:1 translation between child's address space and
|
||||
parent's address space
|
||||
- clocks: Clock IDs array as required by the controller.
|
||||
- clock-names: Names of clocks corresponding to IDs in the clock property.
|
||||
Following clock names shall be provided for different
|
||||
compatibles:
|
||||
- samsung,exynos5250-dwusb3: "usbdrd30",
|
||||
- samsung,exynos5433-dwusb3: "aclk", "susp_clk", "pipe_pclk",
|
||||
"phyclk",
|
||||
- samsung,exynos7-dwusb3: "usbdrd30", "usbdrd30_susp_clk",
|
||||
"usbdrd30_axius_clk"
|
||||
- vdd10-supply: 1.0V powr supply
|
||||
- vdd33-supply: 3.0V/3.3V power supply
|
||||
|
||||
Sub-nodes:
|
||||
The dwc3 core should be added as subnode to Exynos dwc3 glue.
|
||||
- dwc3 :
|
||||
The binding details of dwc3 can be found in:
|
||||
Documentation/devicetree/bindings/usb/snps,dwc3.yaml
|
||||
|
||||
Example:
|
||||
usb@12000000 {
|
||||
compatible = "samsung,exynos5250-dwusb3";
|
||||
clocks = <&clock 286>;
|
||||
clock-names = "usbdrd30";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges;
|
||||
vdd10-supply = <&ldo11_reg>;
|
||||
vdd33-supply = <&ldo9_reg>;
|
||||
|
||||
dwc3 {
|
||||
compatible = "synopsys,dwc3";
|
||||
reg = <0x12000000 0x10000>;
|
||||
interrupts = <0 72 0>;
|
||||
usb-phy = <&usb2_phy &usb3_phy>;
|
||||
};
|
||||
};
|
||||
|
|
@ -15,9 +15,9 @@ properties:
|
|||
const: fsl,imx8mp-dwc3
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
description: Address and length of the register set for the wrapper of
|
||||
dwc3 core on the SOC.
|
||||
items:
|
||||
- description: Address and length of the register set for HSIO Block Control
|
||||
- description: Address and length of the register set for the wrapper of dwc3 core on the SOC.
|
||||
|
||||
"#address-cells":
|
||||
enum: [ 1, 2 ]
|
||||
|
|
@ -49,6 +49,28 @@ properties:
|
|||
- const: hsio
|
||||
- const: suspend
|
||||
|
||||
fsl,permanently-attached:
|
||||
type: boolean
|
||||
description:
|
||||
Indicates if the device atached to a downstream port is
|
||||
permanently attached.
|
||||
|
||||
fsl,disable-port-power-control:
|
||||
type: boolean
|
||||
description:
|
||||
Indicates whether the host controller implementation includes port
|
||||
power control. Defines Bit 3 in capability register (HCCPARAMS).
|
||||
|
||||
fsl,over-current-active-low:
|
||||
type: boolean
|
||||
description:
|
||||
Over current signal polarity is active low.
|
||||
|
||||
fsl,power-active-low:
|
||||
type: boolean
|
||||
description:
|
||||
Power pad (PWR) polarity is active low.
|
||||
|
||||
# Required child node:
|
||||
|
||||
patternProperties:
|
||||
|
|
@ -74,7 +96,8 @@ examples:
|
|||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
usb3_0: usb@32f10100 {
|
||||
compatible = "fsl,imx8mp-dwc3";
|
||||
reg = <0x32f10100 0x8>;
|
||||
reg = <0x32f10100 0x8>,
|
||||
<0x381f0000 0x20>;
|
||||
clocks = <&clk IMX8MP_CLK_HSIO_ROOT>,
|
||||
<&clk IMX8MP_CLK_USB_ROOT>;
|
||||
clock-names = "hsio", "suspend";
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@ properties:
|
|||
- mediatek,mt7629-xhci
|
||||
- mediatek,mt8173-xhci
|
||||
- mediatek,mt8183-xhci
|
||||
- mediatek,mt8186-xhci
|
||||
- mediatek,mt8192-xhci
|
||||
- mediatek,mt8195-xhci
|
||||
- const: mediatek,mtk-xhci
|
||||
|
|
@ -146,7 +147,11 @@ properties:
|
|||
2 - used by mt2712 etc, revision 2 following IPM rule;
|
||||
101 - used by mt8183, specific 1.01;
|
||||
102 - used by mt8192, specific 1.02;
|
||||
enum: [1, 2, 101, 102]
|
||||
103 - used by mt8195, IP0, specific 1.03;
|
||||
104 - used by mt8195, IP1, specific 1.04;
|
||||
105 - used by mt8195, IP2, specific 1.05;
|
||||
106 - used by mt8195, IP3, specific 1.06;
|
||||
enum: [1, 2, 101, 102, 103, 104, 105, 106]
|
||||
|
||||
mediatek,u3p-dis-msk:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
|
|
|
|||
|
|
@ -0,0 +1,59 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/usb/microchip,mpfs-musb.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Microchip MPFS USB Controller Device Tree Bindings
|
||||
|
||||
allOf:
|
||||
- $ref: usb-drd.yaml#
|
||||
|
||||
maintainers:
|
||||
- Conor Dooley <conor.dooley@microchip.com>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- microchip,mpfs-musb
|
||||
|
||||
dr_mode: true
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
minItems: 2
|
||||
maxItems: 2
|
||||
|
||||
interrupt-names:
|
||||
items:
|
||||
- const: dma
|
||||
- const: mc
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
- interrupt-names
|
||||
- clocks
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include "dt-bindings/clock/microchip,mpfs-clock.h"
|
||||
usb@20201000 {
|
||||
compatible = "microchip,mpfs-musb";
|
||||
reg = <0x20201000 0x1000>;
|
||||
clocks = <&clkcfg CLK_USB>;
|
||||
interrupt-parent = <&plic>;
|
||||
interrupts = <86>, <87>;
|
||||
interrupt-names = "dma", "mc";
|
||||
dr_mode = "host";
|
||||
};
|
||||
|
||||
...
|
||||
|
|
@ -16,6 +16,7 @@ properties:
|
|||
- qcom,ipq4019-dwc3
|
||||
- qcom,ipq6018-dwc3
|
||||
- qcom,ipq8064-dwc3
|
||||
- qcom,msm8953-dwc3
|
||||
- qcom,msm8996-dwc3
|
||||
- qcom,msm8998-dwc3
|
||||
- qcom,sc7180-dwc3
|
||||
|
|
|
|||
85
Documentation/devicetree/bindings/usb/richtek,rt1719.yaml
Normal file
85
Documentation/devicetree/bindings/usb/richtek,rt1719.yaml
Normal file
|
|
@ -0,0 +1,85 @@
|
|||
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: "http://devicetree.org/schemas/usb/richtek,rt1719.yaml#"
|
||||
$schema: "http://devicetree.org/meta-schemas/core.yaml#"
|
||||
|
||||
title: Richtek RT1719 sink-only Type-C PD controller bindings
|
||||
|
||||
maintainers:
|
||||
- ChiYuan Huang <cy_huang@richtek.com>
|
||||
|
||||
description: |
|
||||
The RT1719 is a sink-only USB Type-C contoller that complies with the latest
|
||||
USB Type-C and PD standards. It does the USB Type-C detection including attach
|
||||
and orientation. It integrates the physical layer of the USB BMC power
|
||||
delivery protocol to allow up to 100W of power. The BMC PD block enables full
|
||||
support for alternative interfaces of the Type-C specification.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- richtek,rt1719
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
wakeup-source:
|
||||
description: enable IRQ remote wakeup, see power/wakeup-source.txt
|
||||
type: boolean
|
||||
|
||||
connector:
|
||||
type: object
|
||||
$ref: ../connector/usb-connector.yaml#
|
||||
description:
|
||||
Properties for usb c connector.
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- connector
|
||||
- interrupts
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/interrupt-controller/irq.h>
|
||||
i2c0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
rt1719@43 {
|
||||
compatible = "richtek,rt1719";
|
||||
reg = <0x43>;
|
||||
interrupts-extended = <&gpio26 2 IRQ_TYPE_LEVEL_LOW>;
|
||||
wakeup-source;
|
||||
|
||||
connector {
|
||||
compatible = "usb-c-connector";
|
||||
label = "USB-C";
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
endpoint {
|
||||
remote-endpoint = <&usb_hs>;
|
||||
};
|
||||
};
|
||||
port@1 {
|
||||
reg = <1>;
|
||||
endpoint {
|
||||
remote-endpoint = <&usb_ss>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
...
|
||||
|
|
@ -30,6 +30,7 @@ select:
|
|||
enum:
|
||||
- rockchip,rk3328-dwc3
|
||||
- rockchip,rk3399-dwc3
|
||||
- rockchip,rk3568-dwc3
|
||||
required:
|
||||
- compatible
|
||||
|
||||
|
|
@ -39,6 +40,7 @@ properties:
|
|||
- enum:
|
||||
- rockchip,rk3328-dwc3
|
||||
- rockchip,rk3399-dwc3
|
||||
- rockchip,rk3568-dwc3
|
||||
- const: snps,dwc3
|
||||
|
||||
reg:
|
||||
|
|
|
|||
129
Documentation/devicetree/bindings/usb/samsung,exynos-dwc3.yaml
Normal file
129
Documentation/devicetree/bindings/usb/samsung,exynos-dwc3.yaml
Normal file
|
|
@ -0,0 +1,129 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/usb/samsung,exynos-dwc3.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Samsung Exynos SoC USB 3.0 DWC3 Controller
|
||||
|
||||
maintainers:
|
||||
- Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- samsung,exynos5250-dwusb3
|
||||
- samsung,exynos5433-dwusb3
|
||||
- samsung,exynos7-dwusb3
|
||||
|
||||
'#address-cells':
|
||||
const: 1
|
||||
|
||||
clocks:
|
||||
minItems: 1
|
||||
maxItems: 4
|
||||
|
||||
clock-names:
|
||||
minItems: 1
|
||||
maxItems: 4
|
||||
|
||||
ranges: true
|
||||
|
||||
'#size-cells':
|
||||
const: 1
|
||||
|
||||
vdd10-supply:
|
||||
description: 1.0V power supply
|
||||
|
||||
vdd33-supply:
|
||||
description: 3.0V/3.3V power supply
|
||||
|
||||
patternProperties:
|
||||
"^usb@[0-9a-f]+$":
|
||||
$ref: snps,dwc3.yaml#
|
||||
description: Required child node
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- '#address-cells'
|
||||
- clocks
|
||||
- clock-names
|
||||
- ranges
|
||||
- '#size-cells'
|
||||
- vdd10-supply
|
||||
- vdd33-supply
|
||||
|
||||
allOf:
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: samsung,exynos5250-dwusb3
|
||||
then:
|
||||
properties:
|
||||
clocks:
|
||||
minItems: 1
|
||||
maxItems: 1
|
||||
clock-names:
|
||||
items:
|
||||
- const: usbdrd30
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: samsung,exynos54333-dwusb3
|
||||
then:
|
||||
properties:
|
||||
clocks:
|
||||
minItems: 4
|
||||
maxItems: 4
|
||||
clock-names:
|
||||
items:
|
||||
- const: aclk
|
||||
- const: susp_clk
|
||||
- const: pipe_pclk
|
||||
- const: phyclk
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: samsung,exynos7-dwusb3
|
||||
then:
|
||||
properties:
|
||||
clocks:
|
||||
minItems: 3
|
||||
maxItems: 3
|
||||
clock-names:
|
||||
items:
|
||||
- const: usbdrd30
|
||||
- const: usbdrd30_susp_clk
|
||||
- const: usbdrd30_axius_clk
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/clock/exynos5420.h>
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
|
||||
usb {
|
||||
compatible = "samsung,exynos5250-dwusb3";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges;
|
||||
clocks = <&clock CLK_USBD300>;
|
||||
clock-names = "usbdrd30";
|
||||
vdd33-supply = <&ldo9_reg>;
|
||||
vdd10-supply = <&ldo11_reg>;
|
||||
|
||||
usb@12000000 {
|
||||
compatible = "snps,dwc3";
|
||||
reg = <0x12000000 0x10000>;
|
||||
interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>;
|
||||
phys = <&usbdrd_phy0 0>, <&usbdrd_phy0 1>;
|
||||
phy-names = "usb2-phy", "usb3-phy";
|
||||
snps,dis_u3_susphy_quirk;
|
||||
};
|
||||
};
|
||||
117
Documentation/devicetree/bindings/usb/samsung,exynos-usb2.yaml
Normal file
117
Documentation/devicetree/bindings/usb/samsung,exynos-usb2.yaml
Normal file
|
|
@ -0,0 +1,117 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/usb/samsung,exynos-usb2.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Samsung Exynos SoC USB 2.0 EHCI/OHCI Controller
|
||||
|
||||
maintainers:
|
||||
- Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- samsung,exynos4210-ehci
|
||||
- samsung,exynos4210-ohci
|
||||
|
||||
'#address-cells':
|
||||
const: 1
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: usbhost
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
phys:
|
||||
minItems: 1
|
||||
maxItems: 3
|
||||
|
||||
phy-names:
|
||||
items:
|
||||
enum: [host, hsic0, hsic1]
|
||||
minItems: 1
|
||||
maxItems: 3
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
samsung,vbus-gpio:
|
||||
description:
|
||||
Only for controller in EHCI mode, if present, specifies the GPIO that
|
||||
needs to be pulled up for the bus to be powered.
|
||||
|
||||
'#size-cells':
|
||||
const: 0
|
||||
|
||||
patternProperties:
|
||||
"^.*@[0-9a-f]{1,2}$":
|
||||
description: The hard wired USB devices
|
||||
type: object
|
||||
$ref: /usb/usb-device.yaml
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- clocks
|
||||
- clock-names
|
||||
- interrupts
|
||||
- phys
|
||||
- phy-names
|
||||
|
||||
allOf:
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: samsung,exynos4210-ohci
|
||||
then:
|
||||
properties:
|
||||
samsung,vbus-gpio: false
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/clock/exynos5420.h>
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
|
||||
usb@12110000 {
|
||||
compatible = "samsung,exynos4210-ehci";
|
||||
reg = <0x12110000 0x100>;
|
||||
interrupts = <GIC_SPI 71 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clock CLK_USBH20>;
|
||||
clock-names = "usbhost";
|
||||
phys = <&usb2_phy 0>;
|
||||
phy-names = "host";
|
||||
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
hub@1 {
|
||||
compatible = "usb0424,9514";
|
||||
reg = <1>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
usbether@1 {
|
||||
compatible = "usb0424,ec00";
|
||||
reg = <1>;
|
||||
local-mac-address = [00 00 00 00 00 00];
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
usb@12120000 {
|
||||
compatible = "samsung,exynos4210-ohci";
|
||||
reg = <0x12120000 0x100>;
|
||||
interrupts = <GIC_SPI 71 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clock CLK_USBH20>;
|
||||
clock-names = "usbhost";
|
||||
phys = <&usb2_phy 0>;
|
||||
phy-names = "host";
|
||||
};
|
||||
|
|
@ -263,8 +263,11 @@ properties:
|
|||
Value for REFCLKPER field of GUCTL register for reference clock period in
|
||||
nanoseconds, when the hardware set default does not match the actual
|
||||
clock.
|
||||
minimum: 1
|
||||
maximum: 0x3ff
|
||||
|
||||
This binding is deprecated. Instead, provide an appropriate reference clock.
|
||||
minimum: 8
|
||||
maximum: 62
|
||||
deprecated: true
|
||||
|
||||
snps,rx-thr-num-pkt-prd:
|
||||
description:
|
||||
|
|
@ -332,6 +335,12 @@ properties:
|
|||
items:
|
||||
enum: [1, 4, 8, 16, 32, 64, 128, 256]
|
||||
|
||||
port:
|
||||
$ref: /schemas/graph.yaml#/properties/port
|
||||
description:
|
||||
This port is used with the 'usb-role-switch' property to connect the
|
||||
dwc3 to type C connector.
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
required:
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ patternProperties:
|
|||
"^.*@[0-9a-f]{1,2}$":
|
||||
description: The hard wired USB devices
|
||||
type: object
|
||||
$ref: /usb/usb-device.yaml
|
||||
$ref: /schemas/usb/usb-device.yaml
|
||||
|
||||
additionalProperties: true
|
||||
|
||||
|
|
|
|||
75
Documentation/devicetree/bindings/usb/willsemi,wusb3801.yaml
Normal file
75
Documentation/devicetree/bindings/usb/willsemi,wusb3801.yaml
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/usb/willsemi,wusb3801.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: WUSB3801 Type-C port controller DT bindings
|
||||
|
||||
description:
|
||||
The Will Semiconductor WUSB3801 is a USB Type-C port controller which
|
||||
supports role and plug orientation detection using the CC pins. It is
|
||||
compatible with the USB Type-C Cable and Connector Specification v1.2.
|
||||
|
||||
maintainers:
|
||||
- Samuel Holland <samuel@sholland.org>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- willsemi,wusb3801
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
connector:
|
||||
type: object
|
||||
$ref: ../connector/usb-connector.yaml#
|
||||
description:
|
||||
The managed USB Type-C connector. Since WUSB3801 does not support
|
||||
Power Delivery, the node should have the "pd-disable" property.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: usb-c-connector
|
||||
|
||||
required:
|
||||
- pd-disable
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
- connector
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/interrupt-controller/irq.h>
|
||||
|
||||
i2c {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
tcpc@60 {
|
||||
compatible = "willsemi,wusb3801";
|
||||
reg = <0x60>;
|
||||
interrupt-parent = <&gpio0>;
|
||||
interrupts = <4 IRQ_TYPE_LEVEL_LOW>;
|
||||
|
||||
connector {
|
||||
compatible = "usb-c-connector";
|
||||
label = "USB-C";
|
||||
vbus-supply = <&otg_switch>;
|
||||
power-role = "dual";
|
||||
try-power-role = "sink";
|
||||
data-role = "dual";
|
||||
typec-power-opmode = "default";
|
||||
pd-disable;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
@ -876,6 +876,8 @@ patternProperties:
|
|||
description: NXP Semiconductors
|
||||
"^oceanic,.*":
|
||||
description: Oceanic Systems (UK) Ltd.
|
||||
"^ocs,.*":
|
||||
description: Orient Chip Technology Co., Ltd.
|
||||
"^oct,.*":
|
||||
description: Octavo Systems LLC
|
||||
"^okaya,.*":
|
||||
|
|
@ -1371,6 +1373,8 @@ patternProperties:
|
|||
description: Wi2Wi, Inc.
|
||||
"^wiligear,.*":
|
||||
description: Wiligear, Ltd.
|
||||
"^willsemi,.*":
|
||||
description: Will Semiconductor Ltd.
|
||||
"^winbond,.*":
|
||||
description: Winbond Electronics corp.
|
||||
"^wingtech,.*":
|
||||
|
|
|
|||
|
|
@ -726,7 +726,7 @@ The uac2 function provides these attributes in its function directory:
|
|||
|
||||
================ ====================================================
|
||||
c_chmask capture channel mask
|
||||
c_srate capture sampling rate
|
||||
c_srate list of capture sampling rates (comma-separated)
|
||||
c_ssize capture sample size (bytes)
|
||||
c_sync capture synchronization type (async/adaptive)
|
||||
c_mute_present capture mute control enable
|
||||
|
|
@ -734,17 +734,20 @@ The uac2 function provides these attributes in its function directory:
|
|||
c_volume_min capture volume control min value (in 1/256 dB)
|
||||
c_volume_max capture volume control max value (in 1/256 dB)
|
||||
c_volume_res capture volume control resolution (in 1/256 dB)
|
||||
c_hs_bint capture bInterval for HS/SS (1-4: fixed, 0: auto)
|
||||
fb_max maximum extra bandwidth in async mode
|
||||
p_chmask playback channel mask
|
||||
p_srate playback sampling rate
|
||||
p_srate list of playback sampling rates (comma-separated)
|
||||
p_ssize playback sample size (bytes)
|
||||
p_mute_present playback mute control enable
|
||||
p_volume_present playback volume control enable
|
||||
p_volume_min playback volume control min value (in 1/256 dB)
|
||||
p_volume_max playback volume control max value (in 1/256 dB)
|
||||
p_volume_res playback volume control resolution (in 1/256 dB)
|
||||
p_hs_bint playback bInterval for HS/SS (1-4: fixed, 0: auto)
|
||||
req_number the number of pre-allocated request for both capture
|
||||
and playback
|
||||
function_name name of the interface
|
||||
================ ====================================================
|
||||
|
||||
The attributes have sane default values.
|
||||
|
|
@ -916,7 +919,7 @@ The uac1 function provides these attributes in its function directory:
|
|||
|
||||
================ ====================================================
|
||||
c_chmask capture channel mask
|
||||
c_srate capture sampling rate
|
||||
c_srate list of capture sampling rates (comma-separated)
|
||||
c_ssize capture sample size (bytes)
|
||||
c_mute_present capture mute control enable
|
||||
c_volume_present capture volume control enable
|
||||
|
|
@ -924,7 +927,7 @@ The uac1 function provides these attributes in its function directory:
|
|||
c_volume_max capture volume control max value (in 1/256 dB)
|
||||
c_volume_res capture volume control resolution (in 1/256 dB)
|
||||
p_chmask playback channel mask
|
||||
p_srate playback sampling rate
|
||||
p_srate list of playback sampling rates (comma-separated)
|
||||
p_ssize playback sample size (bytes)
|
||||
p_mute_present playback mute control enable
|
||||
p_volume_present playback volume control enable
|
||||
|
|
@ -933,6 +936,7 @@ The uac1 function provides these attributes in its function directory:
|
|||
p_volume_res playback volume control resolution (in 1/256 dB)
|
||||
req_number the number of pre-allocated requests for both capture
|
||||
and playback
|
||||
function_name name of the interface
|
||||
================ ====================================================
|
||||
|
||||
The attributes have sane default values.
|
||||
|
|
|
|||
28
MAINTAINERS
28
MAINTAINERS
|
|
@ -2383,6 +2383,7 @@ W: https://github.com/neuschaefer/wpcm450/wiki
|
|||
F: Documentation/devicetree/bindings/*/*wpcm*
|
||||
F: arch/arm/boot/dts/nuvoton-wpcm450*
|
||||
F: arch/arm/mach-npcm/wpcm450.c
|
||||
F: drivers/*/*/*wpcm*
|
||||
F: drivers/*/*wpcm*
|
||||
|
||||
ARM/NXP S32G ARCHITECTURE
|
||||
|
|
@ -3716,6 +3717,14 @@ F: Documentation/devicetree/bindings/net/brcm,bcm4908-enet.yaml
|
|||
F: drivers/net/ethernet/broadcom/bcm4908_enet.*
|
||||
F: drivers/net/ethernet/broadcom/unimac.h
|
||||
|
||||
BROADCOM BCM4908 PINMUX DRIVER
|
||||
M: Rafał Miłecki <rafal@milecki.pl>
|
||||
M: bcm-kernel-feedback-list@broadcom.com
|
||||
L: linux-gpio@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/pinctrl/brcm,bcm4908-pinctrl.yaml
|
||||
F: drivers/pinctrl/bcm/pinctrl-bcm4908.c
|
||||
|
||||
BROADCOM BCM5301X ARM ARCHITECTURE
|
||||
M: Florian Fainelli <f.fainelli@gmail.com>
|
||||
M: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
|
|
@ -12557,6 +12566,7 @@ S: Maintained
|
|||
F: Documentation/core-api/boot-time-mm.rst
|
||||
F: include/linux/memblock.h
|
||||
F: mm/memblock.c
|
||||
F: tools/testing/memblock/
|
||||
|
||||
MEMORY CONTROLLER DRIVERS
|
||||
M: Krzysztof Kozlowski <krzk@kernel.org>
|
||||
|
|
@ -15484,6 +15494,16 @@ M: Lakshmi Sowjanya D <lakshmi.sowjanya.d@intel.com>
|
|||
S: Supported
|
||||
F: drivers/pinctrl/pinctrl-thunderbay.c
|
||||
|
||||
PIN CONTROLLER - SUNPLUS / TIBBO
|
||||
M: Dvorkin Dmitry <dvorkin@tibbo.com>
|
||||
M: Wells Lu <wellslutw@gmail.com>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
W: https://sunplus.atlassian.net/wiki/spaces/doc/overview
|
||||
F: Documentation/devicetree/bindings/pinctrl/sunplus,*
|
||||
F: drivers/pinctrl/sunplus/
|
||||
F: include/dt-bindings/pinctrl/sppctl*.h
|
||||
|
||||
PKTCDVD DRIVER
|
||||
M: linux-block@vger.kernel.org
|
||||
S: Orphan
|
||||
|
|
@ -15924,6 +15944,14 @@ F: sound/soc/codecs/wcd-clsh-v2.*
|
|||
F: sound/soc/codecs/wsa881x.c
|
||||
F: sound/soc/qcom/
|
||||
|
||||
QCOM EMBEDDED USB DEBUGGER (EUD)
|
||||
M: Souradeep Chowdhury <quic_schowdhu@quicinc.com>
|
||||
L: linux-arm-msm@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/ABI/testing/sysfs-driver-eud
|
||||
F: Documentation/devicetree/bindings/soc/qcom/qcom,eud.yaml
|
||||
F: drivers/usb/misc/qcom_eud.c
|
||||
|
||||
QCOM IPA DRIVER
|
||||
M: Alex Elder <elder@kernel.org>
|
||||
L: netdev@vger.kernel.org
|
||||
|
|
|
|||
|
|
@ -921,7 +921,8 @@
|
|||
|
||||
usb3_0: usb@32f10100 {
|
||||
compatible = "fsl,imx8mp-dwc3";
|
||||
reg = <0x32f10100 0x8>;
|
||||
reg = <0x32f10100 0x8>,
|
||||
<0x381f0000 0x20>;
|
||||
clocks = <&clk IMX8MP_CLK_HSIO_ROOT>,
|
||||
<&clk IMX8MP_CLK_USB_ROOT>;
|
||||
clock-names = "hsio", "suspend";
|
||||
|
|
@ -963,7 +964,8 @@
|
|||
|
||||
usb3_1: usb@32f10108 {
|
||||
compatible = "fsl,imx8mp-dwc3";
|
||||
reg = <0x32f10108 0x8>;
|
||||
reg = <0x32f10108 0x8>,
|
||||
<0x382f0000 0x20>;
|
||||
clocks = <&clk IMX8MP_CLK_HSIO_ROOT>,
|
||||
<&clk IMX8MP_CLK_USB_ROOT>;
|
||||
clock-names = "hsio", "suspend";
|
||||
|
|
|
|||
|
|
@ -752,12 +752,13 @@
|
|||
interrupts = <GIC_SPI 140 IRQ_TYPE_LEVEL_HIGH>;
|
||||
phys = <&qusb_phy_0>, <&usb0_ssphy>;
|
||||
phy-names = "usb2-phy", "usb3-phy";
|
||||
clocks = <&xo>;
|
||||
clock-names = "ref";
|
||||
tx-fifo-resize;
|
||||
snps,is-utmi-l1-suspend;
|
||||
snps,hird-threshold = /bits/ 8 <0x0>;
|
||||
snps,dis_u2_susphy_quirk;
|
||||
snps,dis_u3_susphy_quirk;
|
||||
snps,ref-clock-period-ns = <0x29>;
|
||||
dr_mode = "host";
|
||||
};
|
||||
};
|
||||
|
|
|
|||
|
|
@ -223,11 +223,11 @@
|
|||
clocks = <&zynqmp_clk UART1_REF>, <&zynqmp_clk LPD_LSBUS>;
|
||||
};
|
||||
|
||||
&usb0 {
|
||||
&dwc3_0 {
|
||||
clocks = <&zynqmp_clk USB0_BUS_REF>, <&zynqmp_clk USB3_DUAL_REF>;
|
||||
};
|
||||
|
||||
&usb1 {
|
||||
&dwc3_1 {
|
||||
clocks = <&zynqmp_clk USB1_BUS_REF>, <&zynqmp_clk USB3_DUAL_REF>;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -809,7 +809,6 @@
|
|||
status = "disabled";
|
||||
compatible = "xlnx,zynqmp-dwc3";
|
||||
reg = <0x0 0xff9d0000 0x0 0x100>;
|
||||
clock-names = "bus_clk", "ref_clk";
|
||||
power-domains = <&zynqmp_firmware PD_USB_0>;
|
||||
resets = <&zynqmp_reset ZYNQMP_RESET_USB0_CORERESET>,
|
||||
<&zynqmp_reset ZYNQMP_RESET_USB0_HIBERRESET>,
|
||||
|
|
@ -823,6 +822,7 @@
|
|||
interrupt-parent = <&gic>;
|
||||
interrupt-names = "dwc_usb3", "otg";
|
||||
interrupts = <0 65 4>, <0 69 4>;
|
||||
clock-names = "bus_early", "ref";
|
||||
iommus = <&smmu 0x860>;
|
||||
snps,quirk-frame-length-adjustment = <0x20>;
|
||||
/* dma-coherent; */
|
||||
|
|
@ -835,7 +835,6 @@
|
|||
status = "disabled";
|
||||
compatible = "xlnx,zynqmp-dwc3";
|
||||
reg = <0x0 0xff9e0000 0x0 0x100>;
|
||||
clock-names = "bus_clk", "ref_clk";
|
||||
power-domains = <&zynqmp_firmware PD_USB_1>;
|
||||
resets = <&zynqmp_reset ZYNQMP_RESET_USB1_CORERESET>,
|
||||
<&zynqmp_reset ZYNQMP_RESET_USB1_HIBERRESET>,
|
||||
|
|
@ -849,6 +848,7 @@
|
|||
interrupt-parent = <&gic>;
|
||||
interrupt-names = "dwc_usb3", "otg";
|
||||
interrupts = <0 70 4>, <0 74 4>;
|
||||
clock-names = "bus_early", "ref";
|
||||
iommus = <&smmu 0x861>;
|
||||
snps,quirk-frame-length-adjustment = <0x20>;
|
||||
/* dma-coherent; */
|
||||
|
|
|
|||
|
|
@ -101,7 +101,7 @@ void *memcpy(void *dest, __const void *src, __kernel_size_t n)
|
|||
*/
|
||||
void *memcpy(void *dest, __const void *src, __kernel_size_t n)
|
||||
{
|
||||
unsigned char *d = (unsigned char *)dest, *s = (unsigned char *)src;
|
||||
unsigned char *d, *s;
|
||||
uint32_t *dest_w = (uint32_t *)dest, *src_w = (uint32_t *)src;
|
||||
|
||||
/* If both source and dest are word aligned copy words */
|
||||
|
|
|
|||
|
|
@ -16,16 +16,6 @@ static inline void klp_arch_set_pc(struct ftrace_regs *fregs, unsigned long ip)
|
|||
{
|
||||
ftrace_instruction_pointer_set(fregs, ip);
|
||||
}
|
||||
|
||||
#define klp_get_ftrace_location klp_get_ftrace_location
|
||||
static inline unsigned long klp_get_ftrace_location(unsigned long faddr)
|
||||
{
|
||||
/*
|
||||
* Live patch works on PPC32 and only with -mprofile-kernel on PPC64. In
|
||||
* both cases, the ftrace location is always within the first 16 bytes.
|
||||
*/
|
||||
return ftrace_location_range(faddr, faddr + 16);
|
||||
}
|
||||
#endif /* CONFIG_LIVEPATCH */
|
||||
|
||||
#ifdef CONFIG_LIVEPATCH_64
|
||||
|
|
|
|||
|
|
@ -105,6 +105,27 @@ kprobe_opcode_t *kprobe_lookup_name(const char *name, unsigned int offset)
|
|||
return addr;
|
||||
}
|
||||
|
||||
static bool arch_kprobe_on_func_entry(unsigned long offset)
|
||||
{
|
||||
#ifdef PPC64_ELF_ABI_v2
|
||||
#ifdef CONFIG_KPROBES_ON_FTRACE
|
||||
return offset <= 16;
|
||||
#else
|
||||
return offset <= 8;
|
||||
#endif
|
||||
#else
|
||||
return !offset;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* XXX try and fold the magic of kprobe_lookup_name() in this */
|
||||
kprobe_opcode_t *arch_adjust_kprobe_addr(unsigned long addr, unsigned long offset,
|
||||
bool *on_func_entry)
|
||||
{
|
||||
*on_func_entry = arch_kprobe_on_func_entry(offset);
|
||||
return (kprobe_opcode_t *)(addr + offset);
|
||||
}
|
||||
|
||||
void *alloc_insn_page(void)
|
||||
{
|
||||
void *page;
|
||||
|
|
@ -218,19 +239,6 @@ static nokprobe_inline void set_current_kprobe(struct kprobe *p, struct pt_regs
|
|||
kcb->kprobe_saved_msr = regs->msr;
|
||||
}
|
||||
|
||||
bool arch_kprobe_on_func_entry(unsigned long offset)
|
||||
{
|
||||
#ifdef PPC64_ELF_ABI_v2
|
||||
#ifdef CONFIG_KPROBES_ON_FTRACE
|
||||
return offset <= 16;
|
||||
#else
|
||||
return offset <= 8;
|
||||
#endif
|
||||
#else
|
||||
return !offset;
|
||||
#endif
|
||||
}
|
||||
|
||||
void arch_prepare_kretprobe(struct kretprobe_instance *ri, struct pt_regs *regs)
|
||||
{
|
||||
ri->ret_addr = (kprobe_opcode_t *)regs->link;
|
||||
|
|
|
|||
|
|
@ -424,6 +424,10 @@ void __init check_bugs(void)
|
|||
os_check_bugs();
|
||||
}
|
||||
|
||||
void apply_ibt_endbr(s32 *start, s32 *end)
|
||||
{
|
||||
}
|
||||
|
||||
void apply_retpolines(s32 *start, s32 *end)
|
||||
{
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1842,6 +1842,36 @@ config X86_UMIP
|
|||
specific cases in protected and virtual-8086 modes. Emulated
|
||||
results are dummy.
|
||||
|
||||
config CC_HAS_IBT
|
||||
# GCC >= 9 and binutils >= 2.29
|
||||
# Retpoline check to work around https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93654
|
||||
# Clang/LLVM >= 14
|
||||
# https://github.com/llvm/llvm-project/commit/e0b89df2e0f0130881bf6c39bf31d7f6aac00e0f
|
||||
# https://github.com/llvm/llvm-project/commit/dfcf69770bc522b9e411c66454934a37c1f35332
|
||||
def_bool ((CC_IS_GCC && $(cc-option, -fcf-protection=branch -mindirect-branch-register)) || \
|
||||
(CC_IS_CLANG && CLANG_VERSION >= 140000)) && \
|
||||
$(as-instr,endbr64)
|
||||
|
||||
config X86_KERNEL_IBT
|
||||
prompt "Indirect Branch Tracking"
|
||||
bool
|
||||
depends on X86_64 && CC_HAS_IBT && STACK_VALIDATION
|
||||
# https://github.com/llvm/llvm-project/commit/9d7001eba9c4cb311e03cd8cdc231f9e579f2d0f
|
||||
depends on !LD_IS_LLD || LLD_VERSION >= 140000
|
||||
help
|
||||
Build the kernel with support for Indirect Branch Tracking, a
|
||||
hardware support course-grain forward-edge Control Flow Integrity
|
||||
protection. It enforces that all indirect calls must land on
|
||||
an ENDBR instruction, as such, the compiler will instrument the
|
||||
code with them to make this happen.
|
||||
|
||||
In addition to building the kernel with IBT, seal all functions that
|
||||
are not indirect call targets, avoiding them ever becomming one.
|
||||
|
||||
This requires LTO like objtool runs and will slow down the build. It
|
||||
does significantly reduce the number of ENDBR instructions in the
|
||||
kernel image.
|
||||
|
||||
config X86_INTEL_MEMORY_PROTECTION_KEYS
|
||||
prompt "Memory Protection Keys"
|
||||
def_bool y
|
||||
|
|
@ -2815,19 +2845,20 @@ config IA32_AOUT
|
|||
help
|
||||
Support old a.out binaries in the 32bit emulation.
|
||||
|
||||
config X86_X32
|
||||
config X86_X32_ABI
|
||||
bool "x32 ABI for 64-bit mode"
|
||||
depends on X86_64
|
||||
# llvm-objcopy does not convert x86_64 .note.gnu.property or
|
||||
# compressed debug sections to x86_x32 properly:
|
||||
# https://github.com/ClangBuiltLinux/linux/issues/514
|
||||
# https://github.com/ClangBuiltLinux/linux/issues/1141
|
||||
depends on $(success,$(OBJCOPY) --version | head -n1 | grep -qv llvm)
|
||||
help
|
||||
Include code to run binaries for the x32 native 32-bit ABI
|
||||
for 64-bit processors. An x32 process gets access to the
|
||||
full 64-bit register file and wide data path while leaving
|
||||
pointers at 32 bits for smaller memory footprint.
|
||||
|
||||
You will need a recent binutils (2.22 or later) with
|
||||
elf32_x86_64 support enabled to compile a kernel with this
|
||||
option set.
|
||||
|
||||
config COMPAT_32
|
||||
def_bool y
|
||||
depends on IA32_EMULATION || X86_32
|
||||
|
|
@ -2836,7 +2867,7 @@ config COMPAT_32
|
|||
|
||||
config COMPAT
|
||||
def_bool y
|
||||
depends on IA32_EMULATION || X86_X32
|
||||
depends on IA32_EMULATION || X86_X32_ABI
|
||||
|
||||
if COMPAT
|
||||
config COMPAT_FOR_U64_ALIGNMENT
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ endif
|
|||
|
||||
# How to compile the 16-bit code. Note we always compile for -march=i386;
|
||||
# that way we can complain to the user if the CPU is insufficient.
|
||||
REALMODE_CFLAGS := -m16 -g -Os -DDISABLE_BRANCH_PROFILING \
|
||||
REALMODE_CFLAGS := -m16 -g -Os -DDISABLE_BRANCH_PROFILING -D__DISABLE_EXPORTS \
|
||||
-Wall -Wstrict-prototypes -march=i386 -mregparm=3 \
|
||||
-fno-strict-aliasing -fomit-frame-pointer -fno-pic \
|
||||
-mno-mmx -mno-sse $(call cc-option,-fcf-protection=none)
|
||||
|
|
@ -62,8 +62,20 @@ export BITS
|
|||
#
|
||||
KBUILD_CFLAGS += -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -mno-avx
|
||||
|
||||
# Intel CET isn't enabled in the kernel
|
||||
ifeq ($(CONFIG_X86_KERNEL_IBT),y)
|
||||
#
|
||||
# Kernel IBT has S_CET.NOTRACK_EN=0, as such the compilers must not generate
|
||||
# NOTRACK prefixes. Current generation compilers unconditionally employ NOTRACK
|
||||
# for jump-tables, as such, disable jump-tables for now.
|
||||
#
|
||||
# (jump-tables are implicitly disabled by RETPOLINE)
|
||||
#
|
||||
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104816
|
||||
#
|
||||
KBUILD_CFLAGS += $(call cc-option,-fcf-protection=branch -fno-jump-tables)
|
||||
else
|
||||
KBUILD_CFLAGS += $(call cc-option,-fcf-protection=none)
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_X86_32),y)
|
||||
BITS := 32
|
||||
|
|
@ -140,22 +152,6 @@ else
|
|||
KBUILD_CFLAGS += -mcmodel=kernel
|
||||
endif
|
||||
|
||||
ifdef CONFIG_X86_X32
|
||||
x32_ld_ok := $(call try-run,\
|
||||
/bin/echo -e '1: .quad 1b' | \
|
||||
$(CC) $(KBUILD_AFLAGS) -c -x assembler -o "$$TMP" - && \
|
||||
$(OBJCOPY) -O elf32-x86-64 "$$TMP" "$$TMP.o" && \
|
||||
$(LD) -m elf32_x86_64 "$$TMP.o" -o "$$TMP",y,n)
|
||||
ifeq ($(x32_ld_ok),y)
|
||||
CONFIG_X86_X32_ABI := y
|
||||
KBUILD_AFLAGS += -DCONFIG_X86_X32_ABI
|
||||
KBUILD_CFLAGS += -DCONFIG_X86_X32_ABI
|
||||
else
|
||||
$(warning CONFIG_X86_X32 enabled but no binutils support)
|
||||
endif
|
||||
endif
|
||||
export CONFIG_X86_X32_ABI
|
||||
|
||||
#
|
||||
# If the function graph tracer is used with mcount instead of fentry,
|
||||
# '-maccumulate-outgoing-args' is needed to prevent a GCC bug
|
||||
|
|
|
|||
|
|
@ -195,6 +195,7 @@ crc_array:
|
|||
.altmacro
|
||||
LABEL crc_ %i
|
||||
.noaltmacro
|
||||
ENDBR
|
||||
crc32q -i*8(block_0), crc_init
|
||||
crc32q -i*8(block_1), crc1
|
||||
crc32q -i*8(block_2), crc2
|
||||
|
|
@ -204,6 +205,7 @@ LABEL crc_ %i
|
|||
.altmacro
|
||||
LABEL crc_ %i
|
||||
.noaltmacro
|
||||
ENDBR
|
||||
crc32q -i*8(block_0), crc_init
|
||||
crc32q -i*8(block_1), crc1
|
||||
# SKIP crc32 -i*8(block_2), crc2 ; Don't do this one yet
|
||||
|
|
@ -237,6 +239,7 @@ LABEL crc_ %i
|
|||
################################################################
|
||||
|
||||
LABEL crc_ 0
|
||||
ENDBR
|
||||
mov tmp, len
|
||||
cmp $128*24, tmp
|
||||
jae full_block
|
||||
|
|
|
|||
|
|
@ -86,6 +86,7 @@
|
|||
|
||||
SYM_CODE_START(entry_SYSCALL_64)
|
||||
UNWIND_HINT_EMPTY
|
||||
ENDBR
|
||||
|
||||
swapgs
|
||||
/* tss.sp2 is scratch space. */
|
||||
|
|
@ -94,6 +95,7 @@ SYM_CODE_START(entry_SYSCALL_64)
|
|||
movq PER_CPU_VAR(cpu_current_top_of_stack), %rsp
|
||||
|
||||
SYM_INNER_LABEL(entry_SYSCALL_64_safe_stack, SYM_L_GLOBAL)
|
||||
ANNOTATE_NOENDBR
|
||||
|
||||
/* Construct struct pt_regs on stack */
|
||||
pushq $__USER_DS /* pt_regs->ss */
|
||||
|
|
@ -276,6 +278,7 @@ SYM_FUNC_END(__switch_to_asm)
|
|||
.pushsection .text, "ax"
|
||||
SYM_CODE_START(ret_from_fork)
|
||||
UNWIND_HINT_EMPTY
|
||||
ANNOTATE_NOENDBR // copy_thread
|
||||
movq %rax, %rdi
|
||||
call schedule_tail /* rdi: 'prev' task parameter */
|
||||
|
||||
|
|
@ -350,6 +353,7 @@ SYM_CODE_END(ret_from_fork)
|
|||
.macro idtentry vector asmsym cfunc has_error_code:req
|
||||
SYM_CODE_START(\asmsym)
|
||||
UNWIND_HINT_IRET_REGS offset=\has_error_code*8
|
||||
ENDBR
|
||||
ASM_CLAC
|
||||
|
||||
.if \has_error_code == 0
|
||||
|
|
@ -417,6 +421,7 @@ SYM_CODE_END(\asmsym)
|
|||
.macro idtentry_mce_db vector asmsym cfunc
|
||||
SYM_CODE_START(\asmsym)
|
||||
UNWIND_HINT_IRET_REGS
|
||||
ENDBR
|
||||
ASM_CLAC
|
||||
|
||||
pushq $-1 /* ORIG_RAX: no syscall to restart */
|
||||
|
|
@ -472,6 +477,7 @@ SYM_CODE_END(\asmsym)
|
|||
.macro idtentry_vc vector asmsym cfunc
|
||||
SYM_CODE_START(\asmsym)
|
||||
UNWIND_HINT_IRET_REGS
|
||||
ENDBR
|
||||
ASM_CLAC
|
||||
|
||||
/*
|
||||
|
|
@ -533,6 +539,7 @@ SYM_CODE_END(\asmsym)
|
|||
.macro idtentry_df vector asmsym cfunc
|
||||
SYM_CODE_START(\asmsym)
|
||||
UNWIND_HINT_IRET_REGS offset=8
|
||||
ENDBR
|
||||
ASM_CLAC
|
||||
|
||||
/* paranoid_entry returns GS information for paranoid_exit in EBX. */
|
||||
|
|
@ -544,6 +551,9 @@ SYM_CODE_START(\asmsym)
|
|||
movq $-1, ORIG_RAX(%rsp) /* no syscall to restart */
|
||||
call \cfunc
|
||||
|
||||
/* For some configurations \cfunc ends up being a noreturn. */
|
||||
REACHABLE
|
||||
|
||||
jmp paranoid_exit
|
||||
|
||||
_ASM_NOKPROBE(\asmsym)
|
||||
|
|
@ -564,6 +574,7 @@ __irqentry_text_start:
|
|||
.align 16
|
||||
.globl __irqentry_text_end
|
||||
__irqentry_text_end:
|
||||
ANNOTATE_NOENDBR
|
||||
|
||||
SYM_CODE_START_LOCAL(common_interrupt_return)
|
||||
SYM_INNER_LABEL(swapgs_restore_regs_and_return_to_usermode, SYM_L_GLOBAL)
|
||||
|
|
@ -608,8 +619,8 @@ SYM_INNER_LABEL(swapgs_restore_regs_and_return_to_usermode, SYM_L_GLOBAL)
|
|||
|
||||
/* Restore RDI. */
|
||||
popq %rdi
|
||||
SWAPGS
|
||||
INTERRUPT_RETURN
|
||||
swapgs
|
||||
jmp .Lnative_iret
|
||||
|
||||
|
||||
SYM_INNER_LABEL(restore_regs_and_return_to_kernel, SYM_L_GLOBAL)
|
||||
|
|
@ -626,9 +637,14 @@ SYM_INNER_LABEL(restore_regs_and_return_to_kernel, SYM_L_GLOBAL)
|
|||
* ARCH_HAS_MEMBARRIER_SYNC_CORE rely on IRET core serialization
|
||||
* when returning from IPI handler.
|
||||
*/
|
||||
INTERRUPT_RETURN
|
||||
#ifdef CONFIG_XEN_PV
|
||||
SYM_INNER_LABEL(early_xen_iret_patch, SYM_L_GLOBAL)
|
||||
ANNOTATE_NOENDBR
|
||||
.byte 0xe9
|
||||
.long .Lnative_iret - (. + 4)
|
||||
#endif
|
||||
|
||||
SYM_INNER_LABEL_ALIGN(native_iret, SYM_L_GLOBAL)
|
||||
.Lnative_iret:
|
||||
UNWIND_HINT_IRET_REGS
|
||||
/*
|
||||
* Are we returning to a stack segment from the LDT? Note: in
|
||||
|
|
@ -640,6 +656,7 @@ SYM_INNER_LABEL_ALIGN(native_iret, SYM_L_GLOBAL)
|
|||
#endif
|
||||
|
||||
SYM_INNER_LABEL(native_irq_return_iret, SYM_L_GLOBAL)
|
||||
ANNOTATE_NOENDBR // exc_double_fault
|
||||
/*
|
||||
* This may fault. Non-paranoid faults on return to userspace are
|
||||
* handled by fixup_bad_iret. These include #SS, #GP, and #NP.
|
||||
|
|
@ -734,6 +751,7 @@ SYM_FUNC_START(asm_load_gs_index)
|
|||
FRAME_BEGIN
|
||||
swapgs
|
||||
.Lgs_change:
|
||||
ANNOTATE_NOENDBR // error_entry
|
||||
movl %edi, %gs
|
||||
2: ALTERNATIVE "", "mfence", X86_BUG_SWAPGS_FENCE
|
||||
swapgs
|
||||
|
|
@ -804,6 +822,7 @@ SYM_CODE_END(exc_xen_hypervisor_callback)
|
|||
*/
|
||||
SYM_CODE_START(xen_failsafe_callback)
|
||||
UNWIND_HINT_EMPTY
|
||||
ENDBR
|
||||
movl %ds, %ecx
|
||||
cmpw %cx, 0x10(%rsp)
|
||||
jne 1f
|
||||
|
|
@ -1063,6 +1082,7 @@ SYM_CODE_END(error_return)
|
|||
*/
|
||||
SYM_CODE_START(asm_exc_nmi)
|
||||
UNWIND_HINT_IRET_REGS
|
||||
ENDBR
|
||||
|
||||
/*
|
||||
* We allow breakpoints in NMIs. If a breakpoint occurs, then
|
||||
|
|
@ -1310,6 +1330,7 @@ first_nmi:
|
|||
#endif
|
||||
|
||||
repeat_nmi:
|
||||
ANNOTATE_NOENDBR // this code
|
||||
/*
|
||||
* If there was a nested NMI, the first NMI's iret will return
|
||||
* here. But NMIs are still enabled and we can take another
|
||||
|
|
@ -1338,6 +1359,7 @@ repeat_nmi:
|
|||
.endr
|
||||
subq $(5*8), %rsp
|
||||
end_repeat_nmi:
|
||||
ANNOTATE_NOENDBR // this code
|
||||
|
||||
/*
|
||||
* Everything below this point can be preempted by a nested NMI.
|
||||
|
|
@ -1421,6 +1443,7 @@ SYM_CODE_END(asm_exc_nmi)
|
|||
*/
|
||||
SYM_CODE_START(ignore_sysret)
|
||||
UNWIND_HINT_EMPTY
|
||||
ENDBR
|
||||
mov $-ENOSYS, %eax
|
||||
sysretl
|
||||
SYM_CODE_END(ignore_sysret)
|
||||
|
|
|
|||
|
|
@ -48,6 +48,7 @@
|
|||
*/
|
||||
SYM_CODE_START(entry_SYSENTER_compat)
|
||||
UNWIND_HINT_EMPTY
|
||||
ENDBR
|
||||
/* Interrupts are off on entry. */
|
||||
SWAPGS
|
||||
|
||||
|
|
@ -147,6 +148,7 @@ SYM_INNER_LABEL(entry_SYSENTER_compat_after_hwframe, SYM_L_GLOBAL)
|
|||
popfq
|
||||
jmp .Lsysenter_flags_fixed
|
||||
SYM_INNER_LABEL(__end_entry_SYSENTER_compat, SYM_L_GLOBAL)
|
||||
ANNOTATE_NOENDBR // is_sysenter_singlestep
|
||||
SYM_CODE_END(entry_SYSENTER_compat)
|
||||
|
||||
/*
|
||||
|
|
@ -198,6 +200,7 @@ SYM_CODE_END(entry_SYSENTER_compat)
|
|||
*/
|
||||
SYM_CODE_START(entry_SYSCALL_compat)
|
||||
UNWIND_HINT_EMPTY
|
||||
ENDBR
|
||||
/* Interrupts are off on entry. */
|
||||
swapgs
|
||||
|
||||
|
|
@ -211,6 +214,7 @@ SYM_CODE_START(entry_SYSCALL_compat)
|
|||
movq PER_CPU_VAR(cpu_current_top_of_stack), %rsp
|
||||
|
||||
SYM_INNER_LABEL(entry_SYSCALL_compat_safe_stack, SYM_L_GLOBAL)
|
||||
ANNOTATE_NOENDBR
|
||||
|
||||
/* Construct struct pt_regs on stack */
|
||||
pushq $__USER32_DS /* pt_regs->ss */
|
||||
|
|
@ -340,6 +344,7 @@ SYM_CODE_END(entry_SYSCALL_compat)
|
|||
*/
|
||||
SYM_CODE_START(entry_INT80_compat)
|
||||
UNWIND_HINT_EMPTY
|
||||
ENDBR
|
||||
/*
|
||||
* Interrupts are off on entry.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -67,7 +67,7 @@ uapisyshdr-y += unistd_32.h unistd_64.h unistd_x32.h
|
|||
syshdr-y += syscalls_32.h
|
||||
syshdr-$(CONFIG_X86_64) += unistd_32_ia32.h unistd_64_x32.h
|
||||
syshdr-$(CONFIG_X86_64) += syscalls_64.h
|
||||
syshdr-$(CONFIG_X86_X32) += syscalls_x32.h
|
||||
syshdr-$(CONFIG_X86_X32_ABI) += syscalls_x32.h
|
||||
syshdr-$(CONFIG_XEN) += xen-hypercalls.h
|
||||
|
||||
uapisyshdr-y := $(addprefix $(uapi)/, $(uapisyshdr-y))
|
||||
|
|
|
|||
|
|
@ -76,6 +76,7 @@ extern int alternatives_patched;
|
|||
extern void alternative_instructions(void);
|
||||
extern void apply_alternatives(struct alt_instr *start, struct alt_instr *end);
|
||||
extern void apply_retpolines(s32 *start, s32 *end);
|
||||
extern void apply_ibt_endbr(s32 *start, s32 *end);
|
||||
|
||||
struct module;
|
||||
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
#include <linux/stringify.h>
|
||||
#include <linux/instrumentation.h>
|
||||
#include <linux/objtool.h>
|
||||
|
||||
/*
|
||||
* Despite that some emulators terminate on UD2, we use it for WARN().
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@
|
|||
#include <linux/topology.h>
|
||||
#include <linux/nodemask.h>
|
||||
#include <linux/percpu.h>
|
||||
#include <asm/ibt.h>
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
|
||||
|
|
@ -72,4 +73,7 @@ void init_ia32_feat_ctl(struct cpuinfo_x86 *c);
|
|||
#else
|
||||
static inline void init_ia32_feat_ctl(struct cpuinfo_x86 *c) {}
|
||||
#endif
|
||||
|
||||
extern __noendbr void cet_disable(void);
|
||||
|
||||
#endif /* _ASM_X86_CPU_H */
|
||||
|
|
|
|||
|
|
@ -388,6 +388,7 @@
|
|||
#define X86_FEATURE_TSXLDTRK (18*32+16) /* TSX Suspend Load Address Tracking */
|
||||
#define X86_FEATURE_PCONFIG (18*32+18) /* Intel PCONFIG */
|
||||
#define X86_FEATURE_ARCH_LBR (18*32+19) /* Intel ARCH LBR */
|
||||
#define X86_FEATURE_IBT (18*32+20) /* Indirect Branch Tracking */
|
||||
#define X86_FEATURE_AMX_BF16 (18*32+22) /* AMX bf16 Support */
|
||||
#define X86_FEATURE_AVX512_FP16 (18*32+23) /* AVX512 FP16 */
|
||||
#define X86_FEATURE_AMX_TILE (18*32+24) /* AMX tile Support */
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@
|
|||
#include <asm/tlb.h>
|
||||
#include <asm/nospec-branch.h>
|
||||
#include <asm/mmu_context.h>
|
||||
#include <asm/ibt.h>
|
||||
#include <linux/build_bug.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/pgtable.h>
|
||||
|
|
@ -120,8 +121,12 @@ extern asmlinkage u64 __efi_call(void *fp, ...);
|
|||
efi_enter_mm(); \
|
||||
})
|
||||
|
||||
#define arch_efi_call_virt(p, f, args...) \
|
||||
efi_call((void *)p->f, args) \
|
||||
#define arch_efi_call_virt(p, f, args...) ({ \
|
||||
u64 ret, ibt = ibt_save(); \
|
||||
ret = efi_call((void *)p->f, args); \
|
||||
ibt_restore(ibt); \
|
||||
ret; \
|
||||
})
|
||||
|
||||
#define arch_efi_call_virt_teardown() \
|
||||
({ \
|
||||
|
|
|
|||
105
arch/x86/include/asm/ibt.h
Normal file
105
arch/x86/include/asm/ibt.h
Normal file
|
|
@ -0,0 +1,105 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef _ASM_X86_IBT_H
|
||||
#define _ASM_X86_IBT_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
/*
|
||||
* The rules for enabling IBT are:
|
||||
*
|
||||
* - CC_HAS_IBT: the toolchain supports it
|
||||
* - X86_KERNEL_IBT: it is selected in Kconfig
|
||||
* - !__DISABLE_EXPORTS: this is regular kernel code
|
||||
*
|
||||
* Esp. that latter one is a bit non-obvious, but some code like compressed,
|
||||
* purgatory, realmode etc.. is built with custom CFLAGS that do not include
|
||||
* -fcf-protection=branch and things will go *bang*.
|
||||
*
|
||||
* When all the above are satisfied, HAS_KERNEL_IBT will be 1, otherwise 0.
|
||||
*/
|
||||
#if defined(CONFIG_X86_KERNEL_IBT) && !defined(__DISABLE_EXPORTS)
|
||||
|
||||
#define HAS_KERNEL_IBT 1
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
#define ASM_ENDBR "endbr64\n\t"
|
||||
#else
|
||||
#define ASM_ENDBR "endbr32\n\t"
|
||||
#endif
|
||||
|
||||
#define __noendbr __attribute__((nocf_check))
|
||||
|
||||
static inline __attribute_const__ u32 gen_endbr(void)
|
||||
{
|
||||
u32 endbr;
|
||||
|
||||
/*
|
||||
* Generate ENDBR64 in a way that is sure to not result in
|
||||
* an ENDBR64 instruction as immediate.
|
||||
*/
|
||||
asm ( "mov $~0xfa1e0ff3, %[endbr]\n\t"
|
||||
"not %[endbr]\n\t"
|
||||
: [endbr] "=&r" (endbr) );
|
||||
|
||||
return endbr;
|
||||
}
|
||||
|
||||
static inline __attribute_const__ u32 gen_endbr_poison(void)
|
||||
{
|
||||
/*
|
||||
* 4 byte NOP that isn't NOP4 (in fact it is OSP NOP3), such that it
|
||||
* will be unique to (former) ENDBR sites.
|
||||
*/
|
||||
return 0x001f0f66; /* osp nopl (%rax) */
|
||||
}
|
||||
|
||||
static inline bool is_endbr(u32 val)
|
||||
{
|
||||
if (val == gen_endbr_poison())
|
||||
return true;
|
||||
|
||||
val &= ~0x01000000U; /* ENDBR32 -> ENDBR64 */
|
||||
return val == gen_endbr();
|
||||
}
|
||||
|
||||
extern __noendbr u64 ibt_save(void);
|
||||
extern __noendbr void ibt_restore(u64 save);
|
||||
|
||||
#else /* __ASSEMBLY__ */
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
#define ENDBR endbr64
|
||||
#else
|
||||
#define ENDBR endbr32
|
||||
#endif
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#else /* !IBT */
|
||||
|
||||
#define HAS_KERNEL_IBT 0
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#define ASM_ENDBR
|
||||
|
||||
#define __noendbr
|
||||
|
||||
static inline bool is_endbr(u32 val) { return false; }
|
||||
|
||||
static inline u64 ibt_save(void) { return 0; }
|
||||
static inline void ibt_restore(u64 save) { }
|
||||
|
||||
#else /* __ASSEMBLY__ */
|
||||
|
||||
#define ENDBR
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#endif /* CONFIG_X86_KERNEL_IBT */
|
||||
|
||||
#define ENDBR_INSN_SIZE (4*HAS_KERNEL_IBT)
|
||||
|
||||
#endif /* _ASM_X86_IBT_H */
|
||||
|
|
@ -5,6 +5,8 @@
|
|||
/* Interrupts/Exceptions */
|
||||
#include <asm/trapnr.h>
|
||||
|
||||
#define IDT_ALIGN (8 * (1 + HAS_KERNEL_IBT))
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#include <linux/entry-common.h>
|
||||
#include <linux/hardirq.h>
|
||||
|
|
@ -480,7 +482,7 @@ __visible noinstr void func(struct pt_regs *regs, \
|
|||
|
||||
/*
|
||||
* ASM code to emit the common vector entry stubs where each stub is
|
||||
* packed into 8 bytes.
|
||||
* packed into IDT_ALIGN bytes.
|
||||
*
|
||||
* Note, that the 'pushq imm8' is emitted via '.byte 0x6a, vector' because
|
||||
* GCC treats the local vector variable as unsigned int and would expand
|
||||
|
|
@ -492,33 +494,33 @@ __visible noinstr void func(struct pt_regs *regs, \
|
|||
* point is to mask off the bits above bit 7 because the push is sign
|
||||
* extending.
|
||||
*/
|
||||
.align 8
|
||||
.align IDT_ALIGN
|
||||
SYM_CODE_START(irq_entries_start)
|
||||
vector=FIRST_EXTERNAL_VECTOR
|
||||
.rept NR_EXTERNAL_VECTORS
|
||||
UNWIND_HINT_IRET_REGS
|
||||
0 :
|
||||
ENDBR
|
||||
.byte 0x6a, vector
|
||||
jmp asm_common_interrupt
|
||||
nop
|
||||
/* Ensure that the above is 8 bytes max */
|
||||
. = 0b + 8
|
||||
/* Ensure that the above is IDT_ALIGN bytes max */
|
||||
.fill 0b + IDT_ALIGN - ., 1, 0xcc
|
||||
vector = vector+1
|
||||
.endr
|
||||
SYM_CODE_END(irq_entries_start)
|
||||
|
||||
#ifdef CONFIG_X86_LOCAL_APIC
|
||||
.align 8
|
||||
.align IDT_ALIGN
|
||||
SYM_CODE_START(spurious_entries_start)
|
||||
vector=FIRST_SYSTEM_VECTOR
|
||||
.rept NR_SYSTEM_VECTORS
|
||||
UNWIND_HINT_IRET_REGS
|
||||
0 :
|
||||
ENDBR
|
||||
.byte 0x6a, vector
|
||||
jmp asm_spurious_interrupt
|
||||
nop
|
||||
/* Ensure that the above is 8 bytes max */
|
||||
. = 0b + 8
|
||||
/* Ensure that the above is IDT_ALIGN bytes max */
|
||||
.fill 0b + IDT_ALIGN - ., 1, 0xcc
|
||||
vector = vector+1
|
||||
.endr
|
||||
SYM_CODE_END(spurious_entries_start)
|
||||
|
|
@ -615,6 +617,11 @@ DECLARE_IDTENTRY_DF(X86_TRAP_DF, exc_double_fault);
|
|||
DECLARE_IDTENTRY_RAW_ERRORCODE(X86_TRAP_DF, xenpv_exc_double_fault);
|
||||
#endif
|
||||
|
||||
/* #CP */
|
||||
#ifdef CONFIG_X86_KERNEL_IBT
|
||||
DECLARE_IDTENTRY_ERRORCODE(X86_TRAP_CP, exc_control_protection);
|
||||
#endif
|
||||
|
||||
/* #VC */
|
||||
#ifdef CONFIG_AMD_MEM_ENCRYPT
|
||||
DECLARE_IDTENTRY_VC(X86_TRAP_VC, exc_vmm_communication);
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
#define _ASM_X86_IRQ_STACK_H
|
||||
|
||||
#include <linux/ptrace.h>
|
||||
#include <linux/objtool.h>
|
||||
|
||||
#include <asm/processor.h>
|
||||
|
||||
|
|
@ -99,7 +100,8 @@
|
|||
}
|
||||
|
||||
#define ASM_CALL_ARG0 \
|
||||
"call %P[__func] \n"
|
||||
"call %P[__func] \n" \
|
||||
ASM_REACHABLE
|
||||
|
||||
#define ASM_CALL_ARG1 \
|
||||
"movq %[arg1], %%rdi \n" \
|
||||
|
|
|
|||
|
|
@ -141,13 +141,8 @@ static __always_inline void arch_local_irq_restore(unsigned long flags)
|
|||
#ifdef CONFIG_X86_64
|
||||
#ifdef CONFIG_XEN_PV
|
||||
#define SWAPGS ALTERNATIVE "swapgs", "", X86_FEATURE_XENPV
|
||||
#define INTERRUPT_RETURN \
|
||||
ANNOTATE_RETPOLINE_SAFE; \
|
||||
ALTERNATIVE_TERNARY("jmp *paravirt_iret(%rip);", \
|
||||
X86_FEATURE_XENPV, "jmp xen_iret;", "jmp native_iret;")
|
||||
#else
|
||||
#define SWAPGS swapgs
|
||||
#define INTERRUPT_RETURN jmp native_iret
|
||||
#endif
|
||||
#endif
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
#define _ASM_X86_LINKAGE_H
|
||||
|
||||
#include <linux/stringify.h>
|
||||
#include <asm/ibt.h>
|
||||
|
||||
#undef notrace
|
||||
#define notrace __attribute__((no_instrument_function))
|
||||
|
|
@ -34,5 +35,35 @@
|
|||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
/* SYM_FUNC_START -- use for global functions */
|
||||
#define SYM_FUNC_START(name) \
|
||||
SYM_START(name, SYM_L_GLOBAL, SYM_A_ALIGN) \
|
||||
ENDBR
|
||||
|
||||
/* SYM_FUNC_START_NOALIGN -- use for global functions, w/o alignment */
|
||||
#define SYM_FUNC_START_NOALIGN(name) \
|
||||
SYM_START(name, SYM_L_GLOBAL, SYM_A_NONE) \
|
||||
ENDBR
|
||||
|
||||
/* SYM_FUNC_START_LOCAL -- use for local functions */
|
||||
#define SYM_FUNC_START_LOCAL(name) \
|
||||
SYM_START(name, SYM_L_LOCAL, SYM_A_ALIGN) \
|
||||
ENDBR
|
||||
|
||||
/* SYM_FUNC_START_LOCAL_NOALIGN -- use for local functions, w/o alignment */
|
||||
#define SYM_FUNC_START_LOCAL_NOALIGN(name) \
|
||||
SYM_START(name, SYM_L_LOCAL, SYM_A_NONE) \
|
||||
ENDBR
|
||||
|
||||
/* SYM_FUNC_START_WEAK -- use for weak functions */
|
||||
#define SYM_FUNC_START_WEAK(name) \
|
||||
SYM_START(name, SYM_L_WEAK, SYM_A_ALIGN) \
|
||||
ENDBR
|
||||
|
||||
/* SYM_FUNC_START_WEAK_NOALIGN -- use for weak functions, w/o alignment */
|
||||
#define SYM_FUNC_START_WEAK_NOALIGN(name) \
|
||||
SYM_START(name, SYM_L_WEAK, SYM_A_NONE) \
|
||||
ENDBR
|
||||
|
||||
#endif /* _ASM_X86_LINKAGE_H */
|
||||
|
||||
|
|
|
|||
|
|
@ -362,11 +362,29 @@
|
|||
#define MSR_ATOM_CORE_TURBO_RATIOS 0x0000066c
|
||||
#define MSR_ATOM_CORE_TURBO_VIDS 0x0000066d
|
||||
|
||||
|
||||
#define MSR_CORE_PERF_LIMIT_REASONS 0x00000690
|
||||
#define MSR_GFX_PERF_LIMIT_REASONS 0x000006B0
|
||||
#define MSR_RING_PERF_LIMIT_REASONS 0x000006B1
|
||||
|
||||
/* Control-flow Enforcement Technology MSRs */
|
||||
#define MSR_IA32_U_CET 0x000006a0 /* user mode cet */
|
||||
#define MSR_IA32_S_CET 0x000006a2 /* kernel mode cet */
|
||||
#define CET_SHSTK_EN BIT_ULL(0)
|
||||
#define CET_WRSS_EN BIT_ULL(1)
|
||||
#define CET_ENDBR_EN BIT_ULL(2)
|
||||
#define CET_LEG_IW_EN BIT_ULL(3)
|
||||
#define CET_NO_TRACK_EN BIT_ULL(4)
|
||||
#define CET_SUPPRESS_DISABLE BIT_ULL(5)
|
||||
#define CET_RESERVED (BIT_ULL(6) | BIT_ULL(7) | BIT_ULL(8) | BIT_ULL(9))
|
||||
#define CET_SUPPRESS BIT_ULL(10)
|
||||
#define CET_WAIT_ENDBR BIT_ULL(11)
|
||||
|
||||
#define MSR_IA32_PL0_SSP 0x000006a4 /* ring-0 shadow stack pointer */
|
||||
#define MSR_IA32_PL1_SSP 0x000006a5 /* ring-1 shadow stack pointer */
|
||||
#define MSR_IA32_PL2_SSP 0x000006a6 /* ring-2 shadow stack pointer */
|
||||
#define MSR_IA32_PL3_SSP 0x000006a7 /* ring-3 shadow stack pointer */
|
||||
#define MSR_IA32_INT_SSP_TAB 0x000006a8 /* exception shadow stack table */
|
||||
|
||||
/* Hardware P state interface */
|
||||
#define MSR_PPERF 0x0000064e
|
||||
#define MSR_PERF_LIMIT_REASONS 0x0000064f
|
||||
|
|
|
|||
|
|
@ -666,6 +666,7 @@ bool __raw_callee_save___native_vcpu_is_preempted(long cpu);
|
|||
".globl " PV_THUNK_NAME(func) ";" \
|
||||
".type " PV_THUNK_NAME(func) ", @function;" \
|
||||
PV_THUNK_NAME(func) ":" \
|
||||
ASM_ENDBR \
|
||||
FRAME_BEGIN \
|
||||
PV_SAVE_ALL_CALLER_REGS \
|
||||
"call " #func ";" \
|
||||
|
|
|
|||
|
|
@ -272,7 +272,6 @@ struct paravirt_patch_template {
|
|||
|
||||
extern struct pv_info pv_info;
|
||||
extern struct paravirt_patch_template pv_ops;
|
||||
extern void (*paravirt_iret)(void);
|
||||
|
||||
#define PARAVIRT_PATCH(x) \
|
||||
(offsetof(struct paravirt_patch_template, x) / sizeof(void *))
|
||||
|
|
|
|||
|
|
@ -837,7 +837,7 @@ bool xen_set_default_idle(void);
|
|||
#define xen_set_default_idle 0
|
||||
#endif
|
||||
|
||||
void stop_this_cpu(void *dummy);
|
||||
void __noreturn stop_this_cpu(void *dummy);
|
||||
void microcode_check(void);
|
||||
|
||||
enum l1tf_mitigations {
|
||||
|
|
|
|||
|
|
@ -2,6 +2,8 @@
|
|||
#ifndef __ASM_QSPINLOCK_PARAVIRT_H
|
||||
#define __ASM_QSPINLOCK_PARAVIRT_H
|
||||
|
||||
#include <asm/ibt.h>
|
||||
|
||||
/*
|
||||
* For x86-64, PV_CALLEE_SAVE_REGS_THUNK() saves and restores 8 64-bit
|
||||
* registers. For i386, however, only 1 32-bit register needs to be saved
|
||||
|
|
@ -39,6 +41,7 @@ asm (".pushsection .text;"
|
|||
".type " PV_UNLOCK ", @function;"
|
||||
".align 4,0x90;"
|
||||
PV_UNLOCK ": "
|
||||
ASM_ENDBR
|
||||
FRAME_BEGIN
|
||||
"push %rdx;"
|
||||
"mov $0x1,%eax;"
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
#include <linux/const.h>
|
||||
#include <asm/alternative.h>
|
||||
#include <asm/ibt.h>
|
||||
|
||||
/*
|
||||
* Constructor for a conventional segment GDT (or LDT) entry.
|
||||
|
|
@ -275,7 +276,7 @@ static inline void vdso_read_cpunode(unsigned *cpu, unsigned *node)
|
|||
* vector has no error code (two bytes), a 'push $vector_number' (two
|
||||
* bytes), and a jump to the common entry code (up to five bytes).
|
||||
*/
|
||||
#define EARLY_IDT_HANDLER_SIZE 9
|
||||
#define EARLY_IDT_HANDLER_SIZE (9 + ENDBR_INSN_SIZE)
|
||||
|
||||
/*
|
||||
* xen_early_idt_handler_array is for Xen pv guests: for each entry in
|
||||
|
|
@ -283,7 +284,7 @@ static inline void vdso_read_cpunode(unsigned *cpu, unsigned *node)
|
|||
* pop %rcx; pop %r11; jmp early_idt_handler_array[i]; summing up to
|
||||
* max 8 bytes.
|
||||
*/
|
||||
#define XEN_EARLY_IDT_HANDLER_SIZE 8
|
||||
#define XEN_EARLY_IDT_HANDLER_SIZE (8 + ENDBR_INSN_SIZE)
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@
|
|||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/page_types.h>
|
||||
#include <asm/ibt.h>
|
||||
|
||||
#ifdef __i386__
|
||||
|
||||
|
|
@ -119,7 +120,7 @@ void *extend_brk(size_t size, size_t align);
|
|||
* executable.)
|
||||
*/
|
||||
#define RESERVE_BRK(name,sz) \
|
||||
static void __section(".discard.text") __used notrace \
|
||||
static void __section(".discard.text") __noendbr __used notrace \
|
||||
__brk_reservation_fn_##name##__(void) { \
|
||||
asm volatile ( \
|
||||
".pushsection .brk_reservation,\"aw\",@nobits;" \
|
||||
|
|
|
|||
|
|
@ -159,7 +159,7 @@ extern long __ia32_sys_ni_syscall(const struct pt_regs *regs);
|
|||
#endif /* CONFIG_IA32_EMULATION */
|
||||
|
||||
|
||||
#ifdef CONFIG_X86_X32
|
||||
#ifdef CONFIG_X86_X32_ABI
|
||||
/*
|
||||
* For the x32 ABI, we need to create a stub for compat_sys_*() which is aware
|
||||
* of the x86-64-style parameter ordering of x32 syscalls. The syscalls common
|
||||
|
|
@ -177,12 +177,12 @@ extern long __ia32_sys_ni_syscall(const struct pt_regs *regs);
|
|||
|
||||
#define __X32_COMPAT_SYS_NI(name) \
|
||||
__SYS_NI(x64, compat_sys_##name)
|
||||
#else /* CONFIG_X86_X32 */
|
||||
#else /* CONFIG_X86_X32_ABI */
|
||||
#define __X32_COMPAT_SYS_STUB0(name)
|
||||
#define __X32_COMPAT_SYS_STUBx(x, name, ...)
|
||||
#define __X32_COMPAT_COND_SYSCALL(name)
|
||||
#define __X32_COMPAT_SYS_NI(name)
|
||||
#endif /* CONFIG_X86_X32 */
|
||||
#endif /* CONFIG_X86_X32_ABI */
|
||||
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
|
|
|
|||
|
|
@ -96,25 +96,41 @@ union text_poke_insn {
|
|||
} __attribute__((packed));
|
||||
};
|
||||
|
||||
static __always_inline
|
||||
void __text_gen_insn(void *buf, u8 opcode, const void *addr, const void *dest, int size)
|
||||
{
|
||||
union text_poke_insn *insn = buf;
|
||||
|
||||
BUG_ON(size < text_opcode_size(opcode));
|
||||
|
||||
/*
|
||||
* Hide the addresses to avoid the compiler folding in constants when
|
||||
* referencing code, these can mess up annotations like
|
||||
* ANNOTATE_NOENDBR.
|
||||
*/
|
||||
OPTIMIZER_HIDE_VAR(insn);
|
||||
OPTIMIZER_HIDE_VAR(addr);
|
||||
OPTIMIZER_HIDE_VAR(dest);
|
||||
|
||||
insn->opcode = opcode;
|
||||
|
||||
if (size > 1) {
|
||||
insn->disp = (long)dest - (long)(addr + size);
|
||||
if (size == 2) {
|
||||
/*
|
||||
* Ensure that for JMP8 the displacement
|
||||
* actually fits the signed byte.
|
||||
*/
|
||||
BUG_ON((insn->disp >> 31) != (insn->disp >> 7));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static __always_inline
|
||||
void *text_gen_insn(u8 opcode, const void *addr, const void *dest)
|
||||
{
|
||||
static union text_poke_insn insn; /* per instance */
|
||||
int size = text_opcode_size(opcode);
|
||||
|
||||
insn.opcode = opcode;
|
||||
|
||||
if (size > 1) {
|
||||
insn.disp = (long)dest - (long)(addr + size);
|
||||
if (size == 2) {
|
||||
/*
|
||||
* Ensure that for JMP9 the displacement
|
||||
* actually fits the signed byte.
|
||||
*/
|
||||
BUG_ON((insn.disp >> 31) != (insn.disp >> 7));
|
||||
}
|
||||
}
|
||||
|
||||
__text_gen_insn(&insn, opcode, addr, dest, text_opcode_size(opcode));
|
||||
return &insn.text;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -18,6 +18,8 @@ void __init trap_init(void);
|
|||
asmlinkage __visible noinstr struct pt_regs *vc_switch_off_ist(struct pt_regs *eregs);
|
||||
#endif
|
||||
|
||||
extern bool ibt_selftest(void);
|
||||
|
||||
#ifdef CONFIG_X86_F00F_BUG
|
||||
/* For handling the FOOF bug */
|
||||
void handle_invalid_op(struct pt_regs *regs);
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ struct vdso_image {
|
|||
extern const struct vdso_image vdso_image_64;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_X86_X32
|
||||
#ifdef CONFIG_X86_X32_ABI
|
||||
extern const struct vdso_image vdso_image_x32;
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -130,6 +130,8 @@
|
|||
#define X86_CR4_SMAP _BITUL(X86_CR4_SMAP_BIT)
|
||||
#define X86_CR4_PKE_BIT 22 /* enable Protection Keys support */
|
||||
#define X86_CR4_PKE _BITUL(X86_CR4_PKE_BIT)
|
||||
#define X86_CR4_CET_BIT 23 /* enable Control-flow Enforcement Technology */
|
||||
#define X86_CR4_CET _BITUL(X86_CR4_CET_BIT)
|
||||
|
||||
/*
|
||||
* x86-64 Task Priority Register, CR8
|
||||
|
|
|
|||
|
|
@ -115,6 +115,7 @@ static void __init_or_module add_nops(void *insns, unsigned int len)
|
|||
}
|
||||
|
||||
extern s32 __retpoline_sites[], __retpoline_sites_end[];
|
||||
extern s32 __ibt_endbr_seal[], __ibt_endbr_seal_end[];
|
||||
extern struct alt_instr __alt_instructions[], __alt_instructions_end[];
|
||||
extern s32 __smp_locks[], __smp_locks_end[];
|
||||
void text_poke_early(void *addr, const void *opcode, size_t len);
|
||||
|
|
@ -512,6 +513,42 @@ void __init_or_module noinline apply_retpolines(s32 *start, s32 *end) { }
|
|||
|
||||
#endif /* CONFIG_RETPOLINE && CONFIG_STACK_VALIDATION */
|
||||
|
||||
#ifdef CONFIG_X86_KERNEL_IBT
|
||||
|
||||
/*
|
||||
* Generated by: objtool --ibt
|
||||
*/
|
||||
void __init_or_module noinline apply_ibt_endbr(s32 *start, s32 *end)
|
||||
{
|
||||
s32 *s;
|
||||
|
||||
for (s = start; s < end; s++) {
|
||||
u32 endbr, poison = gen_endbr_poison();
|
||||
void *addr = (void *)s + *s;
|
||||
|
||||
if (WARN_ON_ONCE(get_kernel_nofault(endbr, addr)))
|
||||
continue;
|
||||
|
||||
if (WARN_ON_ONCE(!is_endbr(endbr)))
|
||||
continue;
|
||||
|
||||
DPRINTK("ENDBR at: %pS (%px)", addr, addr);
|
||||
|
||||
/*
|
||||
* When we have IBT, the lack of ENDBR will trigger #CP
|
||||
*/
|
||||
DUMP_BYTES(((u8*)addr), 4, "%px: orig: ", addr);
|
||||
DUMP_BYTES(((u8*)&poison), 4, "%px: repl: ", addr);
|
||||
text_poke_early(addr, &poison, 4);
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void __init_or_module noinline apply_ibt_endbr(s32 *start, s32 *end) { }
|
||||
|
||||
#endif /* CONFIG_X86_KERNEL_IBT */
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
static void alternatives_smp_lock(const s32 *start, const s32 *end,
|
||||
u8 *text, u8 *text_end)
|
||||
|
|
@ -713,34 +750,39 @@ asm (
|
|||
" .pushsection .init.text, \"ax\", @progbits\n"
|
||||
" .type int3_magic, @function\n"
|
||||
"int3_magic:\n"
|
||||
ANNOTATE_NOENDBR
|
||||
" movl $1, (%" _ASM_ARG1 ")\n"
|
||||
ASM_RET
|
||||
" .size int3_magic, .-int3_magic\n"
|
||||
" .popsection\n"
|
||||
);
|
||||
|
||||
extern __initdata unsigned long int3_selftest_ip; /* defined in asm below */
|
||||
extern void int3_selftest_ip(void); /* defined in asm below */
|
||||
|
||||
static int __init
|
||||
int3_exception_notify(struct notifier_block *self, unsigned long val, void *data)
|
||||
{
|
||||
unsigned long selftest = (unsigned long)&int3_selftest_ip;
|
||||
struct die_args *args = data;
|
||||
struct pt_regs *regs = args->regs;
|
||||
|
||||
OPTIMIZER_HIDE_VAR(selftest);
|
||||
|
||||
if (!regs || user_mode(regs))
|
||||
return NOTIFY_DONE;
|
||||
|
||||
if (val != DIE_INT3)
|
||||
return NOTIFY_DONE;
|
||||
|
||||
if (regs->ip - INT3_INSN_SIZE != int3_selftest_ip)
|
||||
if (regs->ip - INT3_INSN_SIZE != selftest)
|
||||
return NOTIFY_DONE;
|
||||
|
||||
int3_emulate_call(regs, (unsigned long)&int3_magic);
|
||||
return NOTIFY_STOP;
|
||||
}
|
||||
|
||||
static void __init int3_selftest(void)
|
||||
/* Must be noinline to ensure uniqueness of int3_selftest_ip. */
|
||||
static noinline void __init int3_selftest(void)
|
||||
{
|
||||
static __initdata struct notifier_block int3_exception_nb = {
|
||||
.notifier_call = int3_exception_notify,
|
||||
|
|
@ -753,18 +795,12 @@ static void __init int3_selftest(void)
|
|||
/*
|
||||
* Basically: int3_magic(&val); but really complicated :-)
|
||||
*
|
||||
* Stick the address of the INT3 instruction into int3_selftest_ip,
|
||||
* then trigger the INT3, padded with NOPs to match a CALL instruction
|
||||
* length.
|
||||
* INT3 padded with NOP to CALL_INSN_SIZE. The int3_exception_nb
|
||||
* notifier above will emulate CALL for us.
|
||||
*/
|
||||
asm volatile ("1: int3; nop; nop; nop; nop\n\t"
|
||||
".pushsection .init.data,\"aw\"\n\t"
|
||||
".align " __ASM_SEL(4, 8) "\n\t"
|
||||
".type int3_selftest_ip, @object\n\t"
|
||||
".size int3_selftest_ip, " __ASM_SEL(4, 8) "\n\t"
|
||||
"int3_selftest_ip:\n\t"
|
||||
__ASM_SEL(.long, .quad) " 1b\n\t"
|
||||
".popsection\n\t"
|
||||
asm volatile ("int3_selftest_ip:\n\t"
|
||||
ANNOTATE_NOENDBR
|
||||
" int3; nop; nop; nop; nop\n\t"
|
||||
: ASM_CALL_CONSTRAINT
|
||||
: __ASM_SEL_RAW(a, D) (&val)
|
||||
: "memory");
|
||||
|
|
@ -831,6 +867,8 @@ void __init alternative_instructions(void)
|
|||
*/
|
||||
apply_alternatives(__alt_instructions, __alt_instructions_end);
|
||||
|
||||
apply_ibt_endbr(__ibt_endbr_seal, __ibt_endbr_seal_end);
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
/* Patch to UP if other cpus not imminent. */
|
||||
if (!noreplace_smp && (num_present_cpus() == 1 || setup_max_cpus <= 1)) {
|
||||
|
|
|
|||
|
|
@ -232,6 +232,7 @@
|
|||
#include <asm/paravirt.h>
|
||||
#include <asm/reboot.h>
|
||||
#include <asm/nospec-branch.h>
|
||||
#include <asm/ibt.h>
|
||||
|
||||
#if defined(CONFIG_APM_DISPLAY_BLANK) && defined(CONFIG_VT)
|
||||
extern int (*console_blank_hook)(int);
|
||||
|
|
@ -598,6 +599,7 @@ static long __apm_bios_call(void *_call)
|
|||
struct desc_struct save_desc_40;
|
||||
struct desc_struct *gdt;
|
||||
struct apm_bios_call *call = _call;
|
||||
u64 ibt;
|
||||
|
||||
cpu = get_cpu();
|
||||
BUG_ON(cpu != 0);
|
||||
|
|
@ -607,11 +609,13 @@ static long __apm_bios_call(void *_call)
|
|||
|
||||
apm_irq_save(flags);
|
||||
firmware_restrict_branch_speculation_start();
|
||||
ibt = ibt_save();
|
||||
APM_DO_SAVE_SEGS;
|
||||
apm_bios_call_asm(call->func, call->ebx, call->ecx,
|
||||
&call->eax, &call->ebx, &call->ecx, &call->edx,
|
||||
&call->esi);
|
||||
APM_DO_RESTORE_SEGS;
|
||||
ibt_restore(ibt);
|
||||
firmware_restrict_branch_speculation_end();
|
||||
apm_irq_restore(flags);
|
||||
gdt[0x40 / 8] = save_desc_40;
|
||||
|
|
@ -676,6 +680,7 @@ static long __apm_bios_call_simple(void *_call)
|
|||
struct desc_struct save_desc_40;
|
||||
struct desc_struct *gdt;
|
||||
struct apm_bios_call *call = _call;
|
||||
u64 ibt;
|
||||
|
||||
cpu = get_cpu();
|
||||
BUG_ON(cpu != 0);
|
||||
|
|
@ -685,10 +690,12 @@ static long __apm_bios_call_simple(void *_call)
|
|||
|
||||
apm_irq_save(flags);
|
||||
firmware_restrict_branch_speculation_start();
|
||||
ibt = ibt_save();
|
||||
APM_DO_SAVE_SEGS;
|
||||
error = apm_bios_call_simple_asm(call->func, call->ebx, call->ecx,
|
||||
&call->eax);
|
||||
APM_DO_RESTORE_SEGS;
|
||||
ibt_restore(ibt);
|
||||
firmware_restrict_branch_speculation_end();
|
||||
apm_irq_restore(flags);
|
||||
gdt[0x40 / 8] = save_desc_40;
|
||||
|
|
|
|||
|
|
@ -59,6 +59,7 @@
|
|||
#include <asm/cpu_device_id.h>
|
||||
#include <asm/uv/uv.h>
|
||||
#include <asm/sigframe.h>
|
||||
#include <asm/traps.h>
|
||||
|
||||
#include "cpu.h"
|
||||
|
||||
|
|
@ -438,7 +439,8 @@ out:
|
|||
|
||||
/* These bits should not change their value after CPU init is finished. */
|
||||
static const unsigned long cr4_pinned_mask =
|
||||
X86_CR4_SMEP | X86_CR4_SMAP | X86_CR4_UMIP | X86_CR4_FSGSBASE;
|
||||
X86_CR4_SMEP | X86_CR4_SMAP | X86_CR4_UMIP |
|
||||
X86_CR4_FSGSBASE | X86_CR4_CET;
|
||||
static DEFINE_STATIC_KEY_FALSE_RO(cr_pinning);
|
||||
static unsigned long cr4_pinned_bits __ro_after_init;
|
||||
|
||||
|
|
@ -592,6 +594,58 @@ static __init int setup_disable_pku(char *arg)
|
|||
__setup("nopku", setup_disable_pku);
|
||||
#endif /* CONFIG_X86_64 */
|
||||
|
||||
#ifdef CONFIG_X86_KERNEL_IBT
|
||||
|
||||
__noendbr u64 ibt_save(void)
|
||||
{
|
||||
u64 msr = 0;
|
||||
|
||||
if (cpu_feature_enabled(X86_FEATURE_IBT)) {
|
||||
rdmsrl(MSR_IA32_S_CET, msr);
|
||||
wrmsrl(MSR_IA32_S_CET, msr & ~CET_ENDBR_EN);
|
||||
}
|
||||
|
||||
return msr;
|
||||
}
|
||||
|
||||
__noendbr void ibt_restore(u64 save)
|
||||
{
|
||||
u64 msr;
|
||||
|
||||
if (cpu_feature_enabled(X86_FEATURE_IBT)) {
|
||||
rdmsrl(MSR_IA32_S_CET, msr);
|
||||
msr &= ~CET_ENDBR_EN;
|
||||
msr |= (save & CET_ENDBR_EN);
|
||||
wrmsrl(MSR_IA32_S_CET, msr);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static __always_inline void setup_cet(struct cpuinfo_x86 *c)
|
||||
{
|
||||
u64 msr = CET_ENDBR_EN;
|
||||
|
||||
if (!HAS_KERNEL_IBT ||
|
||||
!cpu_feature_enabled(X86_FEATURE_IBT))
|
||||
return;
|
||||
|
||||
wrmsrl(MSR_IA32_S_CET, msr);
|
||||
cr4_set_bits(X86_CR4_CET);
|
||||
|
||||
if (!ibt_selftest()) {
|
||||
pr_err("IBT selftest: Failed!\n");
|
||||
setup_clear_cpu_cap(X86_FEATURE_IBT);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
__noendbr void cet_disable(void)
|
||||
{
|
||||
if (cpu_feature_enabled(X86_FEATURE_IBT))
|
||||
wrmsrl(MSR_IA32_S_CET, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Some CPU features depend on higher CPUID levels, which may not always
|
||||
* be available due to CPUID level capping or broken virtualization
|
||||
|
|
@ -1709,6 +1763,7 @@ static void identify_cpu(struct cpuinfo_x86 *c)
|
|||
|
||||
x86_init_rdrand(c);
|
||||
setup_pku(c);
|
||||
setup_cet(c);
|
||||
|
||||
/*
|
||||
* Clear/Set all flags overridden by options, need do it
|
||||
|
|
@ -1777,6 +1832,8 @@ void enable_sep_cpu(void)
|
|||
void __init identify_boot_cpu(void)
|
||||
{
|
||||
identify_cpu(&boot_cpu_data);
|
||||
if (HAS_KERNEL_IBT && cpu_feature_enabled(X86_FEATURE_IBT))
|
||||
pr_info("CET detected: Indirect Branch Tracking enabled\n");
|
||||
#ifdef CONFIG_X86_32
|
||||
sysenter_setup();
|
||||
enable_sep_cpu();
|
||||
|
|
|
|||
|
|
@ -387,7 +387,7 @@ static int __init setup_early_printk(char *buf)
|
|||
#endif
|
||||
#ifdef CONFIG_EARLY_PRINTK_USB_XDBC
|
||||
if (!strncmp(buf, "xdbc", 4))
|
||||
early_xdbc_parse_parameter(buf + 4);
|
||||
early_xdbc_parse_parameter(buf + 4, keep);
|
||||
#endif
|
||||
|
||||
buf++;
|
||||
|
|
|
|||
|
|
@ -316,12 +316,12 @@ create_trampoline(struct ftrace_ops *ops, unsigned int *tramp_size)
|
|||
unsigned long offset;
|
||||
unsigned long npages;
|
||||
unsigned long size;
|
||||
unsigned long retq;
|
||||
unsigned long *ptr;
|
||||
void *trampoline;
|
||||
void *ip;
|
||||
/* 48 8b 15 <offset> is movq <offset>(%rip), %rdx */
|
||||
unsigned const char op_ref[] = { 0x48, 0x8b, 0x15 };
|
||||
unsigned const char retq[] = { RET_INSN_OPCODE, INT3_INSN_OPCODE };
|
||||
union ftrace_op_code_union op_ptr;
|
||||
int ret;
|
||||
|
||||
|
|
@ -359,12 +359,7 @@ create_trampoline(struct ftrace_ops *ops, unsigned int *tramp_size)
|
|||
goto fail;
|
||||
|
||||
ip = trampoline + size;
|
||||
|
||||
/* The trampoline ends with ret(q) */
|
||||
retq = (unsigned long)ftrace_stub;
|
||||
ret = copy_from_kernel_nofault(ip, (void *)retq, RET_SIZE);
|
||||
if (WARN_ON(ret < 0))
|
||||
goto fail;
|
||||
memcpy(ip, retq, RET_SIZE);
|
||||
|
||||
/* No need to test direct calls on created trampolines */
|
||||
if (ops->flags & FTRACE_OPS_FL_SAVE_REGS) {
|
||||
|
|
|
|||
|
|
@ -145,6 +145,7 @@ SYM_FUNC_START(ftrace_caller)
|
|||
movq %rcx, RSP(%rsp)
|
||||
|
||||
SYM_INNER_LABEL(ftrace_caller_op_ptr, SYM_L_GLOBAL)
|
||||
ANNOTATE_NOENDBR
|
||||
/* Load the ftrace_ops into the 3rd parameter */
|
||||
movq function_trace_op(%rip), %rdx
|
||||
|
||||
|
|
@ -155,6 +156,7 @@ SYM_INNER_LABEL(ftrace_caller_op_ptr, SYM_L_GLOBAL)
|
|||
movq $0, CS(%rsp)
|
||||
|
||||
SYM_INNER_LABEL(ftrace_call, SYM_L_GLOBAL)
|
||||
ANNOTATE_NOENDBR
|
||||
call ftrace_stub
|
||||
|
||||
/* Handlers can change the RIP */
|
||||
|
|
@ -169,6 +171,7 @@ SYM_INNER_LABEL(ftrace_call, SYM_L_GLOBAL)
|
|||
* layout here.
|
||||
*/
|
||||
SYM_INNER_LABEL(ftrace_caller_end, SYM_L_GLOBAL)
|
||||
ANNOTATE_NOENDBR
|
||||
|
||||
jmp ftrace_epilogue
|
||||
SYM_FUNC_END(ftrace_caller);
|
||||
|
|
@ -176,10 +179,10 @@ SYM_FUNC_END(ftrace_caller);
|
|||
SYM_FUNC_START(ftrace_epilogue)
|
||||
/*
|
||||
* This is weak to keep gas from relaxing the jumps.
|
||||
* It is also used to copy the RET for trampolines.
|
||||
*/
|
||||
SYM_INNER_LABEL_ALIGN(ftrace_stub, SYM_L_WEAK)
|
||||
UNWIND_HINT_FUNC
|
||||
ENDBR
|
||||
RET
|
||||
SYM_FUNC_END(ftrace_epilogue)
|
||||
|
||||
|
|
@ -192,6 +195,7 @@ SYM_FUNC_START(ftrace_regs_caller)
|
|||
/* save_mcount_regs fills in first two parameters */
|
||||
|
||||
SYM_INNER_LABEL(ftrace_regs_caller_op_ptr, SYM_L_GLOBAL)
|
||||
ANNOTATE_NOENDBR
|
||||
/* Load the ftrace_ops into the 3rd parameter */
|
||||
movq function_trace_op(%rip), %rdx
|
||||
|
||||
|
|
@ -221,6 +225,7 @@ SYM_INNER_LABEL(ftrace_regs_caller_op_ptr, SYM_L_GLOBAL)
|
|||
leaq (%rsp), %rcx
|
||||
|
||||
SYM_INNER_LABEL(ftrace_regs_call, SYM_L_GLOBAL)
|
||||
ANNOTATE_NOENDBR
|
||||
call ftrace_stub
|
||||
|
||||
/* Copy flags back to SS, to restore them */
|
||||
|
|
@ -248,6 +253,7 @@ SYM_INNER_LABEL(ftrace_regs_call, SYM_L_GLOBAL)
|
|||
*/
|
||||
testq %rax, %rax
|
||||
SYM_INNER_LABEL(ftrace_regs_caller_jmp, SYM_L_GLOBAL)
|
||||
ANNOTATE_NOENDBR
|
||||
jnz 1f
|
||||
|
||||
restore_mcount_regs
|
||||
|
|
@ -261,6 +267,7 @@ SYM_INNER_LABEL(ftrace_regs_caller_jmp, SYM_L_GLOBAL)
|
|||
* to the return.
|
||||
*/
|
||||
SYM_INNER_LABEL(ftrace_regs_caller_end, SYM_L_GLOBAL)
|
||||
ANNOTATE_NOENDBR
|
||||
jmp ftrace_epilogue
|
||||
|
||||
/* Swap the flags with orig_rax */
|
||||
|
|
@ -284,6 +291,7 @@ SYM_FUNC_START(__fentry__)
|
|||
jnz trace
|
||||
|
||||
SYM_INNER_LABEL(ftrace_stub, SYM_L_GLOBAL)
|
||||
ENDBR
|
||||
RET
|
||||
|
||||
trace:
|
||||
|
|
@ -307,7 +315,7 @@ EXPORT_SYMBOL(__fentry__)
|
|||
|
||||
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
||||
SYM_FUNC_START(return_to_handler)
|
||||
subq $24, %rsp
|
||||
subq $16, %rsp
|
||||
|
||||
/* Save the return values */
|
||||
movq %rax, (%rsp)
|
||||
|
|
@ -319,7 +327,19 @@ SYM_FUNC_START(return_to_handler)
|
|||
movq %rax, %rdi
|
||||
movq 8(%rsp), %rdx
|
||||
movq (%rsp), %rax
|
||||
addq $24, %rsp
|
||||
JMP_NOSPEC rdi
|
||||
|
||||
addq $16, %rsp
|
||||
/*
|
||||
* Jump back to the old return address. This cannot be JMP_NOSPEC rdi
|
||||
* since IBT would demand that contain ENDBR, which simply isn't so for
|
||||
* return addresses. Use a retpoline here to keep the RSB balanced.
|
||||
*/
|
||||
ANNOTATE_INTRA_FUNCTION_CALL
|
||||
call .Ldo_rop
|
||||
int3
|
||||
.Ldo_rop:
|
||||
mov %rdi, (%rsp)
|
||||
UNWIND_HINT_FUNC
|
||||
RET
|
||||
SYM_FUNC_END(return_to_handler)
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -99,6 +99,7 @@ SYM_CODE_END(startup_64)
|
|||
|
||||
SYM_CODE_START(secondary_startup_64)
|
||||
UNWIND_HINT_EMPTY
|
||||
ANNOTATE_NOENDBR
|
||||
/*
|
||||
* At this point the CPU runs in 64bit mode CS.L = 1 CS.D = 0,
|
||||
* and someone has loaded a mapped page table.
|
||||
|
|
@ -127,6 +128,7 @@ SYM_CODE_START(secondary_startup_64)
|
|||
*/
|
||||
SYM_INNER_LABEL(secondary_startup_64_no_verify, SYM_L_GLOBAL)
|
||||
UNWIND_HINT_EMPTY
|
||||
ANNOTATE_NOENDBR
|
||||
|
||||
/*
|
||||
* Retrieve the modifier (SME encryption mask if SME is active) to be
|
||||
|
|
@ -192,6 +194,7 @@ SYM_INNER_LABEL(secondary_startup_64_no_verify, SYM_L_GLOBAL)
|
|||
jmp *%rax
|
||||
1:
|
||||
UNWIND_HINT_EMPTY
|
||||
ANNOTATE_NOENDBR // above
|
||||
|
||||
/*
|
||||
* We must switch to a new descriptor in kernel space for the GDT
|
||||
|
|
@ -299,6 +302,7 @@ SYM_INNER_LABEL(secondary_startup_64_no_verify, SYM_L_GLOBAL)
|
|||
pushq %rax # target address in negative space
|
||||
lretq
|
||||
.Lafter_lret:
|
||||
ANNOTATE_NOENDBR
|
||||
SYM_CODE_END(secondary_startup_64)
|
||||
|
||||
#include "verify_cpu.S"
|
||||
|
|
@ -328,6 +332,7 @@ SYM_CODE_END(start_cpu0)
|
|||
*/
|
||||
SYM_CODE_START_NOALIGN(vc_boot_ghcb)
|
||||
UNWIND_HINT_IRET_REGS offset=8
|
||||
ENDBR
|
||||
|
||||
/* Build pt_regs */
|
||||
PUSH_AND_CLEAR_REGS
|
||||
|
|
@ -345,7 +350,6 @@ SYM_CODE_START_NOALIGN(vc_boot_ghcb)
|
|||
/* Remove Error Code */
|
||||
addq $8, %rsp
|
||||
|
||||
/* Pure iret required here - don't use INTERRUPT_RETURN */
|
||||
iretq
|
||||
SYM_CODE_END(vc_boot_ghcb)
|
||||
#endif
|
||||
|
|
@ -372,9 +376,11 @@ SYM_CODE_START(early_idt_handler_array)
|
|||
.rept NUM_EXCEPTION_VECTORS
|
||||
.if ((EXCEPTION_ERRCODE_MASK >> i) & 1) == 0
|
||||
UNWIND_HINT_IRET_REGS
|
||||
ENDBR
|
||||
pushq $0 # Dummy error code, to make stack frame uniform
|
||||
.else
|
||||
UNWIND_HINT_IRET_REGS offset=8
|
||||
ENDBR
|
||||
.endif
|
||||
pushq $i # 72(%rsp) Vector number
|
||||
jmp early_idt_handler_common
|
||||
|
|
@ -382,10 +388,11 @@ SYM_CODE_START(early_idt_handler_array)
|
|||
i = i + 1
|
||||
.fill early_idt_handler_array + i*EARLY_IDT_HANDLER_SIZE - ., 1, 0xcc
|
||||
.endr
|
||||
UNWIND_HINT_IRET_REGS offset=16
|
||||
SYM_CODE_END(early_idt_handler_array)
|
||||
ANNOTATE_NOENDBR // early_idt_handler_array[NUM_EXCEPTION_VECTORS]
|
||||
|
||||
SYM_CODE_START_LOCAL(early_idt_handler_common)
|
||||
UNWIND_HINT_IRET_REGS offset=16
|
||||
/*
|
||||
* The stack is the hardware frame, an error code or zero, and the
|
||||
* vector number.
|
||||
|
|
@ -426,11 +433,14 @@ SYM_CODE_END(early_idt_handler_common)
|
|||
* early_idt_handler_array can't be used because it returns via the
|
||||
* paravirtualized INTERRUPT_RETURN and pv-ops don't work that early.
|
||||
*
|
||||
* XXX it does, fix this.
|
||||
*
|
||||
* This handler will end up in the .init.text section and not be
|
||||
* available to boot secondary CPUs.
|
||||
*/
|
||||
SYM_CODE_START_NOALIGN(vc_no_ghcb)
|
||||
UNWIND_HINT_IRET_REGS offset=8
|
||||
ENDBR
|
||||
|
||||
/* Build pt_regs */
|
||||
PUSH_AND_CLEAR_REGS
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@
|
|||
#include <asm/proto.h>
|
||||
#include <asm/desc.h>
|
||||
#include <asm/hw_irq.h>
|
||||
#include <asm/idtentry.h>
|
||||
|
||||
#define DPL0 0x0
|
||||
#define DPL3 0x3
|
||||
|
|
@ -103,6 +104,10 @@ static const __initconst struct idt_data def_idts[] = {
|
|||
ISTG(X86_TRAP_MC, asm_exc_machine_check, IST_INDEX_MCE),
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_X86_KERNEL_IBT
|
||||
INTG(X86_TRAP_CP, asm_exc_control_protection),
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_AMD_MEM_ENCRYPT
|
||||
ISTG(X86_TRAP_VC, asm_exc_vmm_communication, IST_INDEX_VC),
|
||||
#endif
|
||||
|
|
@ -272,7 +277,7 @@ void __init idt_setup_apic_and_irq_gates(void)
|
|||
idt_setup_from_table(idt_table, apic_idts, ARRAY_SIZE(apic_idts), true);
|
||||
|
||||
for_each_clear_bit_from(i, system_vectors, FIRST_SYSTEM_VECTOR) {
|
||||
entry = irq_entries_start + 8 * (i - FIRST_EXTERNAL_VECTOR);
|
||||
entry = irq_entries_start + IDT_ALIGN * (i - FIRST_EXTERNAL_VECTOR);
|
||||
set_intr_gate(i, entry);
|
||||
}
|
||||
|
||||
|
|
@ -283,7 +288,7 @@ void __init idt_setup_apic_and_irq_gates(void)
|
|||
* system_vectors bitmap. Otherwise they show up in
|
||||
* /proc/interrupts.
|
||||
*/
|
||||
entry = spurious_entries_start + 8 * (i - FIRST_SYSTEM_VECTOR);
|
||||
entry = spurious_entries_start + IDT_ALIGN * (i - FIRST_SYSTEM_VECTOR);
|
||||
set_intr_gate(i, entry);
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -52,6 +52,7 @@
|
|||
#include <asm/insn.h>
|
||||
#include <asm/debugreg.h>
|
||||
#include <asm/set_memory.h>
|
||||
#include <asm/ibt.h>
|
||||
|
||||
#include "common.h"
|
||||
|
||||
|
|
@ -193,17 +194,10 @@ static unsigned long
|
|||
__recover_probed_insn(kprobe_opcode_t *buf, unsigned long addr)
|
||||
{
|
||||
struct kprobe *kp;
|
||||
unsigned long faddr;
|
||||
bool faddr;
|
||||
|
||||
kp = get_kprobe((void *)addr);
|
||||
faddr = ftrace_location(addr);
|
||||
/*
|
||||
* Addresses inside the ftrace location are refused by
|
||||
* arch_check_ftrace_location(). Something went terribly wrong
|
||||
* if such an address is checked here.
|
||||
*/
|
||||
if (WARN_ON(faddr && faddr != addr))
|
||||
return 0UL;
|
||||
faddr = ftrace_location(addr) == addr;
|
||||
/*
|
||||
* Use the current code if it is not modified by Kprobe
|
||||
* and it cannot be modified by ftrace.
|
||||
|
|
@ -301,6 +295,22 @@ static int can_probe(unsigned long paddr)
|
|||
return (addr == paddr);
|
||||
}
|
||||
|
||||
/* If x86 supports IBT (ENDBR) it must be skipped. */
|
||||
kprobe_opcode_t *arch_adjust_kprobe_addr(unsigned long addr, unsigned long offset,
|
||||
bool *on_func_entry)
|
||||
{
|
||||
if (is_endbr(*(u32 *)addr)) {
|
||||
*on_func_entry = !offset || offset == 4;
|
||||
if (*on_func_entry)
|
||||
offset = 4;
|
||||
|
||||
} else {
|
||||
*on_func_entry = !offset;
|
||||
}
|
||||
|
||||
return (kprobe_opcode_t *)(addr + offset);
|
||||
}
|
||||
|
||||
/*
|
||||
* Copy an instruction with recovering modified instruction by kprobes
|
||||
* and adjust the displacement if the instruction uses the %rip-relative
|
||||
|
|
@ -1023,6 +1033,7 @@ asm(
|
|||
".type __kretprobe_trampoline, @function\n"
|
||||
"__kretprobe_trampoline:\n"
|
||||
#ifdef CONFIG_X86_64
|
||||
ANNOTATE_NOENDBR
|
||||
/* Push a fake return address to tell the unwinder it's a kretprobe. */
|
||||
" pushq $__kretprobe_trampoline\n"
|
||||
UNWIND_HINT_FUNC
|
||||
|
|
|
|||
|
|
@ -1029,10 +1029,11 @@ asm(
|
|||
".global __raw_callee_save___kvm_vcpu_is_preempted;"
|
||||
".type __raw_callee_save___kvm_vcpu_is_preempted, @function;"
|
||||
"__raw_callee_save___kvm_vcpu_is_preempted:"
|
||||
ASM_ENDBR
|
||||
"movq __per_cpu_offset(,%rdi,8), %rax;"
|
||||
"cmpb $0, " __stringify(KVM_STEAL_TIME_preempted) "+steal_time(%rax);"
|
||||
"setne %al;"
|
||||
"ret;"
|
||||
ASM_RET
|
||||
".size __raw_callee_save___kvm_vcpu_is_preempted, .-__raw_callee_save___kvm_vcpu_is_preempted;"
|
||||
".popsection");
|
||||
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@
|
|||
#include <asm/kexec-bzimage64.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/set_memory.h>
|
||||
#include <asm/cpu.h>
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
/*
|
||||
|
|
@ -310,6 +311,7 @@ void machine_kexec(struct kimage *image)
|
|||
/* Interrupts aren't acceptable while we reboot */
|
||||
local_irq_disable();
|
||||
hw_breakpoint_disable();
|
||||
cet_disable();
|
||||
|
||||
if (image->preserve_context) {
|
||||
#ifdef CONFIG_X86_IO_APIC
|
||||
|
|
@ -325,7 +327,7 @@ void machine_kexec(struct kimage *image)
|
|||
}
|
||||
|
||||
control_page = page_address(image->control_code_page) + PAGE_SIZE;
|
||||
memcpy(control_page, relocate_kernel, KEXEC_CONTROL_CODE_MAX_SIZE);
|
||||
__memcpy(control_page, relocate_kernel, KEXEC_CONTROL_CODE_MAX_SIZE);
|
||||
|
||||
page_list[PA_CONTROL_PAGE] = virt_to_phys(control_page);
|
||||
page_list[VA_CONTROL_PAGE] = (unsigned long)control_page;
|
||||
|
|
|
|||
|
|
@ -253,7 +253,7 @@ int module_finalize(const Elf_Ehdr *hdr,
|
|||
{
|
||||
const Elf_Shdr *s, *text = NULL, *alt = NULL, *locks = NULL,
|
||||
*para = NULL, *orc = NULL, *orc_ip = NULL,
|
||||
*retpolines = NULL;
|
||||
*retpolines = NULL, *ibt_endbr = NULL;
|
||||
char *secstrings = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset;
|
||||
|
||||
for (s = sechdrs; s < sechdrs + hdr->e_shnum; s++) {
|
||||
|
|
@ -271,6 +271,8 @@ int module_finalize(const Elf_Ehdr *hdr,
|
|||
orc_ip = s;
|
||||
if (!strcmp(".retpoline_sites", secstrings + s->sh_name))
|
||||
retpolines = s;
|
||||
if (!strcmp(".ibt_endbr_seal", secstrings + s->sh_name))
|
||||
ibt_endbr = s;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -290,6 +292,10 @@ int module_finalize(const Elf_Ehdr *hdr,
|
|||
void *aseg = (void *)alt->sh_addr;
|
||||
apply_alternatives(aseg, aseg + alt->sh_size);
|
||||
}
|
||||
if (ibt_endbr) {
|
||||
void *iseg = (void *)ibt_endbr->sh_addr;
|
||||
apply_ibt_endbr(iseg, iseg + ibt_endbr->sh_size);
|
||||
}
|
||||
if (locks && text) {
|
||||
void *lseg = (void *)locks->sh_addr;
|
||||
void *tseg = (void *)text->sh_addr;
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@ extern void _paravirt_nop(void);
|
|||
asm (".pushsection .entry.text, \"ax\"\n"
|
||||
".global _paravirt_nop\n"
|
||||
"_paravirt_nop:\n\t"
|
||||
ASM_ENDBR
|
||||
ASM_RET
|
||||
".size _paravirt_nop, . - _paravirt_nop\n\t"
|
||||
".type _paravirt_nop, @function\n\t"
|
||||
|
|
@ -50,6 +51,7 @@ asm (".pushsection .entry.text, \"ax\"\n"
|
|||
asm (".pushsection .entry.text, \"ax\"\n"
|
||||
".global paravirt_ret0\n"
|
||||
"paravirt_ret0:\n\t"
|
||||
ASM_ENDBR
|
||||
"xor %" _ASM_AX ", %" _ASM_AX ";\n\t"
|
||||
ASM_RET
|
||||
".size paravirt_ret0, . - paravirt_ret0\n\t"
|
||||
|
|
@ -69,29 +71,12 @@ noinstr void paravirt_BUG(void)
|
|||
BUG();
|
||||
}
|
||||
|
||||
struct branch {
|
||||
unsigned char opcode;
|
||||
u32 delta;
|
||||
} __attribute__((packed));
|
||||
|
||||
static unsigned paravirt_patch_call(void *insn_buff, const void *target,
|
||||
unsigned long addr, unsigned len)
|
||||
{
|
||||
const int call_len = 5;
|
||||
struct branch *b = insn_buff;
|
||||
unsigned long delta = (unsigned long)target - (addr+call_len);
|
||||
|
||||
if (len < call_len) {
|
||||
pr_warn("paravirt: Failed to patch indirect CALL at %ps\n", (void *)addr);
|
||||
/* Kernel might not be viable if patching fails, bail out: */
|
||||
BUG_ON(1);
|
||||
}
|
||||
|
||||
b->opcode = 0xe8; /* call */
|
||||
b->delta = delta;
|
||||
BUILD_BUG_ON(sizeof(*b) != call_len);
|
||||
|
||||
return call_len;
|
||||
__text_gen_insn(insn_buff, CALL_INSN_OPCODE,
|
||||
(void *)addr, target, CALL_INSN_SIZE);
|
||||
return CALL_INSN_SIZE;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PARAVIRT_XXL
|
||||
|
|
@ -149,8 +134,6 @@ void paravirt_set_sched_clock(u64 (*func)(void))
|
|||
}
|
||||
|
||||
/* These are in entry.S */
|
||||
extern void native_iret(void);
|
||||
|
||||
static struct resource reserve_ioports = {
|
||||
.start = 0,
|
||||
.end = IO_SPACE_LIMIT,
|
||||
|
|
@ -414,8 +397,6 @@ struct paravirt_patch_template pv_ops = {
|
|||
|
||||
#ifdef CONFIG_PARAVIRT_XXL
|
||||
NOKPROBE_SYMBOL(native_load_idt);
|
||||
|
||||
void (*paravirt_iret)(void) = native_iret;
|
||||
#endif
|
||||
|
||||
EXPORT_SYMBOL(pv_ops);
|
||||
|
|
|
|||
|
|
@ -747,7 +747,7 @@ bool xen_set_default_idle(void)
|
|||
}
|
||||
#endif
|
||||
|
||||
void stop_this_cpu(void *dummy)
|
||||
void __noreturn stop_this_cpu(void *dummy)
|
||||
{
|
||||
local_irq_disable();
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -681,7 +681,7 @@ void set_personality_64bit(void)
|
|||
|
||||
static void __set_personality_x32(void)
|
||||
{
|
||||
#ifdef CONFIG_X86_X32
|
||||
#ifdef CONFIG_X86_X32_ABI
|
||||
if (current->mm)
|
||||
current->mm->context.flags = 0;
|
||||
|
||||
|
|
|
|||
|
|
@ -42,6 +42,7 @@
|
|||
.code64
|
||||
SYM_CODE_START_NOALIGN(relocate_kernel)
|
||||
UNWIND_HINT_EMPTY
|
||||
ANNOTATE_NOENDBR
|
||||
/*
|
||||
* %rdi indirection_page
|
||||
* %rsi page_list
|
||||
|
|
@ -114,6 +115,14 @@ SYM_CODE_START_LOCAL_NOALIGN(identity_mapped)
|
|||
/* store the start address on the stack */
|
||||
pushq %rdx
|
||||
|
||||
/*
|
||||
* Clear X86_CR4_CET (if it was set) such that we can clear CR0_WP
|
||||
* below.
|
||||
*/
|
||||
movq %cr4, %rax
|
||||
andq $~(X86_CR4_CET), %rax
|
||||
movq %rax, %cr4
|
||||
|
||||
/*
|
||||
* Set cr0 to a known state:
|
||||
* - Paging enabled
|
||||
|
|
@ -215,6 +224,7 @@ SYM_CODE_END(identity_mapped)
|
|||
|
||||
SYM_CODE_START_LOCAL_NOALIGN(virtual_mapped)
|
||||
UNWIND_HINT_EMPTY
|
||||
ANNOTATE_NOENDBR // RET target, above
|
||||
movq RSP(%r8), %rsp
|
||||
movq CR4(%r8), %rax
|
||||
movq %rax, %cr4
|
||||
|
|
|
|||
|
|
@ -210,6 +210,81 @@ DEFINE_IDTENTRY(exc_overflow)
|
|||
do_error_trap(regs, 0, "overflow", X86_TRAP_OF, SIGSEGV, 0, NULL);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_X86_KERNEL_IBT
|
||||
|
||||
static __ro_after_init bool ibt_fatal = true;
|
||||
|
||||
extern void ibt_selftest_ip(void); /* code label defined in asm below */
|
||||
|
||||
enum cp_error_code {
|
||||
CP_EC = (1 << 15) - 1,
|
||||
|
||||
CP_RET = 1,
|
||||
CP_IRET = 2,
|
||||
CP_ENDBR = 3,
|
||||
CP_RSTRORSSP = 4,
|
||||
CP_SETSSBSY = 5,
|
||||
|
||||
CP_ENCL = 1 << 15,
|
||||
};
|
||||
|
||||
DEFINE_IDTENTRY_ERRORCODE(exc_control_protection)
|
||||
{
|
||||
if (!cpu_feature_enabled(X86_FEATURE_IBT)) {
|
||||
pr_err("Unexpected #CP\n");
|
||||
BUG();
|
||||
}
|
||||
|
||||
if (WARN_ON_ONCE(user_mode(regs) || (error_code & CP_EC) != CP_ENDBR))
|
||||
return;
|
||||
|
||||
if (unlikely(regs->ip == (unsigned long)&ibt_selftest_ip)) {
|
||||
regs->ax = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
pr_err("Missing ENDBR: %pS\n", (void *)instruction_pointer(regs));
|
||||
if (!ibt_fatal) {
|
||||
printk(KERN_DEFAULT CUT_HERE);
|
||||
__warn(__FILE__, __LINE__, (void *)regs->ip, TAINT_WARN, regs, NULL);
|
||||
return;
|
||||
}
|
||||
BUG();
|
||||
}
|
||||
|
||||
/* Must be noinline to ensure uniqueness of ibt_selftest_ip. */
|
||||
noinline bool ibt_selftest(void)
|
||||
{
|
||||
unsigned long ret;
|
||||
|
||||
asm (" lea ibt_selftest_ip(%%rip), %%rax\n\t"
|
||||
ANNOTATE_RETPOLINE_SAFE
|
||||
" jmp *%%rax\n\t"
|
||||
"ibt_selftest_ip:\n\t"
|
||||
UNWIND_HINT_FUNC
|
||||
ANNOTATE_NOENDBR
|
||||
" nop\n\t"
|
||||
|
||||
: "=a" (ret) : : "memory");
|
||||
|
||||
return !ret;
|
||||
}
|
||||
|
||||
static int __init ibt_setup(char *str)
|
||||
{
|
||||
if (!strcmp(str, "off"))
|
||||
setup_clear_cpu_cap(X86_FEATURE_IBT);
|
||||
|
||||
if (!strcmp(str, "warn"))
|
||||
ibt_fatal = false;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
__setup("ibt=", ibt_setup);
|
||||
|
||||
#endif /* CONFIG_X86_KERNEL_IBT */
|
||||
|
||||
#ifdef CONFIG_X86_F00F_BUG
|
||||
void handle_invalid_op(struct pt_regs *regs)
|
||||
#else
|
||||
|
|
|
|||
|
|
@ -1487,6 +1487,9 @@ static unsigned long __init get_loops_per_jiffy(void)
|
|||
|
||||
static void __init tsc_enable_sched_clock(void)
|
||||
{
|
||||
loops_per_jiffy = get_loops_per_jiffy();
|
||||
use_tsc_delay();
|
||||
|
||||
/* Sanitize TSC ADJUST before cyc2ns gets initialized */
|
||||
tsc_store_and_check_tsc_adjust(true);
|
||||
cyc2ns_init_boot_cpu();
|
||||
|
|
@ -1502,8 +1505,6 @@ void __init tsc_early_init(void)
|
|||
return;
|
||||
if (!determine_cpu_tsc_frequencies(true))
|
||||
return;
|
||||
loops_per_jiffy = get_loops_per_jiffy();
|
||||
|
||||
tsc_enable_sched_clock();
|
||||
}
|
||||
|
||||
|
|
@ -1537,7 +1538,6 @@ void __init tsc_init(void)
|
|||
enable_sched_clock_irqtime();
|
||||
|
||||
lpj_fine = get_loops_per_jiffy();
|
||||
use_tsc_delay();
|
||||
|
||||
check_system_tsc_reliable();
|
||||
|
||||
|
|
|
|||
|
|
@ -285,6 +285,15 @@ SECTIONS
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_X86_KERNEL_IBT
|
||||
. = ALIGN(8);
|
||||
.ibt_endbr_seal : AT(ADDR(.ibt_endbr_seal) - LOAD_OFFSET) {
|
||||
__ibt_endbr_seal = .;
|
||||
*(.ibt_endbr_seal)
|
||||
__ibt_endbr_seal_end = .;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* struct alt_inst entries. From the header (alternative.h):
|
||||
* "Alternative instructions for different CPU types or capabilities"
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue