Merge 4a39ac5b7d ("Merge tag 'random-6.12-rc1-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/crng/random") into android-mainline
Steps on the way to 6.12-rc1 Bug: 367265496 Change-Id: I115d487c6294c249dd30b708b3164f34be34d874 Signed-off-by: Matthias Maennich <maennich@google.com>
This commit is contained in:
@@ -9,9 +9,11 @@ maps an ELF DSO into that program's address space. This DSO is called
|
||||
the vDSO and it often contains useful and highly-optimized alternatives
|
||||
to real syscalls.
|
||||
|
||||
These functions are called just like ordinary C function according to
|
||||
your platform's ABI. Call them from a sensible context. (For example,
|
||||
if you set CS on x86 to something strange, the vDSO functions are
|
||||
These functions are called according to your platform's ABI. On many
|
||||
platforms they are called just like ordinary C function. On other platforms
|
||||
(ex: powerpc) they are called with the same convention as system calls which
|
||||
is different from ordinary C functions. Call them from a sensible context.
|
||||
(For example, if you set CS on x86 to something strange, the vDSO functions are
|
||||
within their rights to crash.) In addition, if you pass a bad
|
||||
pointer to a vDSO function, you might get SIGSEGV instead of -EFAULT.
|
||||
|
||||
|
||||
@@ -377,17 +377,33 @@ What: /sys/class/power_supply/<supply_name>/charge_type
|
||||
Date: July 2009
|
||||
Contact: linux-pm@vger.kernel.org
|
||||
Description:
|
||||
Represents the type of charging currently being applied to the
|
||||
battery. "Trickle", "Fast", and "Standard" all mean different
|
||||
charging speeds. "Adaptive" means that the charger uses some
|
||||
algorithm to adjust the charge rate dynamically, without
|
||||
any user configuration required. "Custom" means that the charger
|
||||
uses the charge_control_* properties as configuration for some
|
||||
different algorithm. "Long Life" means the charger reduces its
|
||||
charging rate in order to prolong the battery health. "Bypass"
|
||||
means the charger bypasses the charging path around the
|
||||
integrated converter allowing for a "smart" wall adaptor to
|
||||
perform the power conversion externally.
|
||||
Select the charging algorithm to use for a battery.
|
||||
|
||||
Standard:
|
||||
Fully charge the battery at a moderate rate.
|
||||
Fast:
|
||||
Quickly charge the battery using fast-charge
|
||||
technology. This is typically harder on the battery
|
||||
than standard charging and may lower its lifespan.
|
||||
Trickle:
|
||||
Users who primarily operate the system while
|
||||
plugged into an external power source can extend
|
||||
battery life with this mode. Vendor tooling may
|
||||
call this "Primarily AC Use".
|
||||
Adaptive:
|
||||
Automatically optimize battery charge rate based
|
||||
on typical usage pattern.
|
||||
Custom:
|
||||
Use the charge_control_* properties to determine
|
||||
when to start and stop charging. Advanced users
|
||||
can use this to drastically extend battery life.
|
||||
Long Life:
|
||||
The charger reduces its charging rate in order to
|
||||
prolong the battery health.
|
||||
Bypass:
|
||||
The charger bypasses the charging path around the
|
||||
integrated converter allowing for a "smart" wall
|
||||
adaptor to perform the power conversion externally.
|
||||
|
||||
Access: Read, Write
|
||||
|
||||
@@ -592,7 +608,12 @@ Description:
|
||||
the supply, for example it can show if USB-PD capable source
|
||||
is attached.
|
||||
|
||||
Access: Read-Only
|
||||
Access: For power-supplies which consume USB power such
|
||||
as battery charger chips, this indicates the type of
|
||||
the connected USB power source and is Read-Only.
|
||||
|
||||
For power-supplies which act as a USB power-source such as
|
||||
e.g. the UCS1002 USB Port Power Controller this is writable.
|
||||
|
||||
Valid values:
|
||||
"Unknown", "SDP", "DCP", "CDP", "ACA", "C", "PD",
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
What: /sys/class/tee/tee{,priv}X/rpmb_routing_model
|
||||
Date: May 2024
|
||||
KernelVersion: 6.10
|
||||
Contact: op-tee@lists.trustedfirmware.org
|
||||
Description:
|
||||
RPMB frames can be routed to the RPMB device via the
|
||||
user-space daemon tee-supplicant or the RPMB subsystem
|
||||
in the kernel. The value "user" means that the driver
|
||||
will route the RPMB frames via user space. Conversely,
|
||||
"kernel" means that the frames are routed via the RPMB
|
||||
subsystem without assistance from tee-supplicant. It
|
||||
should be assumed that RPMB frames are routed via user
|
||||
space if the variable is absent. The primary purpose
|
||||
of this variable is to let systemd know whether
|
||||
tee-supplicant is needed in the early boot with initramfs.
|
||||
@@ -333,12 +333,17 @@
|
||||
allowed anymore to lift isolation
|
||||
requirements as needed. This option
|
||||
does not override iommu=pt
|
||||
force_enable - Force enable the IOMMU on platforms known
|
||||
to be buggy with IOMMU enabled. Use this
|
||||
option with care.
|
||||
pgtbl_v1 - Use v1 page table for DMA-API (Default).
|
||||
pgtbl_v2 - Use v2 page table for DMA-API.
|
||||
irtcachedis - Disable Interrupt Remapping Table (IRT) caching.
|
||||
force_enable - Force enable the IOMMU on platforms known
|
||||
to be buggy with IOMMU enabled. Use this
|
||||
option with care.
|
||||
pgtbl_v1 - Use v1 page table for DMA-API (Default).
|
||||
pgtbl_v2 - Use v2 page table for DMA-API.
|
||||
irtcachedis - Disable Interrupt Remapping Table (IRT) caching.
|
||||
nohugepages - Limit page-sizes used for v1 page-tables
|
||||
to 4 KiB.
|
||||
v2_pgsizes_only - Limit page-sizes used for v1 page-tables
|
||||
to 4KiB/2Mib/1GiB.
|
||||
|
||||
|
||||
amd_iommu_dump= [HW,X86-64]
|
||||
Enable AMD IOMMU driver option to dump the ACPI table
|
||||
|
||||
@@ -129,7 +129,7 @@ Setting the ramoops parameters can be done in several different manners:
|
||||
takes a size, alignment and name as arguments. The name is used
|
||||
to map the memory to a label that can be retrieved by ramoops.
|
||||
|
||||
reserver_mem=2M:4096:oops ramoops.mem_name=oops
|
||||
reserve_mem=2M:4096:oops ramoops.mem_name=oops
|
||||
|
||||
You can specify either RAM memory or peripheral devices' memory. However, when
|
||||
specifying RAM, be sure to reserve the memory by issuing memblock_reserve()
|
||||
|
||||
@@ -36,19 +36,8 @@ properties:
|
||||
patternProperties:
|
||||
"^(hog-[0-9]+|.+-hog(-[0-9]+)?)$":
|
||||
type: object
|
||||
|
||||
properties:
|
||||
gpio-hog: true
|
||||
gpios: true
|
||||
output-high: true
|
||||
output-low: true
|
||||
line-name: true
|
||||
|
||||
required:
|
||||
- gpio-hog
|
||||
- gpios
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
required:
|
||||
- compatible
|
||||
|
||||
@@ -28,6 +28,7 @@ properties:
|
||||
|
||||
patternProperties:
|
||||
"^(hog-[0-9]+|.+-hog(-[0-9]+)?)$":
|
||||
type: object
|
||||
required:
|
||||
- gpio-hog
|
||||
|
||||
|
||||
@@ -85,19 +85,8 @@ properties:
|
||||
patternProperties:
|
||||
"^(hog-[0-9]+|.+-hog(-[0-9]+)?)$":
|
||||
type: object
|
||||
properties:
|
||||
gpio-hog: true
|
||||
gpios: true
|
||||
input: true
|
||||
output-high: true
|
||||
output-low: true
|
||||
line-name: true
|
||||
|
||||
required:
|
||||
- gpio-hog
|
||||
- gpios
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
required:
|
||||
- compatible
|
||||
|
||||
@@ -32,6 +32,8 @@ properties:
|
||||
|
||||
gpio-ranges: true
|
||||
|
||||
gpio-reserved-ranges: true
|
||||
|
||||
gpio-line-names:
|
||||
description: strings describing the names of each gpio line.
|
||||
minItems: 1
|
||||
|
||||
@@ -107,19 +107,8 @@ properties:
|
||||
patternProperties:
|
||||
"^(hog-[0-9]+|.+-hog(-[0-9]+)?)$":
|
||||
type: object
|
||||
properties:
|
||||
gpio-hog: true
|
||||
gpios: true
|
||||
input: true
|
||||
output-high: true
|
||||
output-low: true
|
||||
line-name: true
|
||||
|
||||
required:
|
||||
- gpio-hog
|
||||
- gpios
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
required:
|
||||
- compatible
|
||||
|
||||
@@ -1,43 +0,0 @@
|
||||
NXP LPC32xx SoC GPIO controller
|
||||
|
||||
Required properties:
|
||||
- compatible: must be "nxp,lpc3220-gpio"
|
||||
- reg: Physical base address and length of the controller's registers.
|
||||
- gpio-controller: Marks the device node as a GPIO controller.
|
||||
- #gpio-cells: Should be 3:
|
||||
1) bank:
|
||||
0: GPIO P0
|
||||
1: GPIO P1
|
||||
2: GPIO P2
|
||||
3: GPIO P3
|
||||
4: GPI P3
|
||||
5: GPO P3
|
||||
2) pin number
|
||||
3) optional parameters:
|
||||
- bit 0 specifies polarity (0 for normal, 1 for inverted)
|
||||
- reg: Index of the GPIO group
|
||||
|
||||
Example:
|
||||
|
||||
gpio: gpio@40028000 {
|
||||
compatible = "nxp,lpc3220-gpio";
|
||||
reg = <0x40028000 0x1000>;
|
||||
gpio-controller;
|
||||
#gpio-cells = <3>; /* bank, pin, flags */
|
||||
};
|
||||
|
||||
leds {
|
||||
compatible = "gpio-leds";
|
||||
|
||||
led0 {
|
||||
gpios = <&gpio 5 1 1>; /* GPO_P3 1, active low */
|
||||
linux,default-trigger = "heartbeat";
|
||||
default-state = "off";
|
||||
};
|
||||
|
||||
led1 {
|
||||
gpios = <&gpio 5 14 1>; /* GPO_P3 14, active low */
|
||||
linux,default-trigger = "timer";
|
||||
default-state = "off";
|
||||
};
|
||||
};
|
||||
@@ -49,20 +49,8 @@ properties:
|
||||
patternProperties:
|
||||
"^.+-hog(-[0-9]+)?$":
|
||||
type: object
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
properties:
|
||||
gpio-hog: true
|
||||
gpios: true
|
||||
input: true
|
||||
output-high: true
|
||||
output-low: true
|
||||
line-name: true
|
||||
|
||||
required:
|
||||
- gpio-hog
|
||||
- gpios
|
||||
|
||||
allOf:
|
||||
- if:
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/gpio/nxp,lpc3220-gpio.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: NXP LPC3220 SoC GPIO controller
|
||||
|
||||
maintainers:
|
||||
- Animesh Agarwal <animeshagarwal28@gmail.com>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: nxp,lpc3220-gpio
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
gpio-controller: true
|
||||
|
||||
'#gpio-cells':
|
||||
const: 3
|
||||
description: |
|
||||
1) bank:
|
||||
0: GPIO P0
|
||||
1: GPIO P1
|
||||
2: GPIO P2
|
||||
3: GPIO P3
|
||||
4: GPI P3
|
||||
5: GPO P3
|
||||
2) pin number
|
||||
3) flags:
|
||||
- bit 0 specifies polarity (0 for normal, 1 for inverted)
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- gpio-controller
|
||||
- '#gpio-cells'
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
gpio@40028000 {
|
||||
compatible = "nxp,lpc3220-gpio";
|
||||
reg = <0x40028000 0x1000>;
|
||||
gpio-controller;
|
||||
#gpio-cells = <3>; /* bank, pin, flags */
|
||||
};
|
||||
@@ -55,19 +55,8 @@ properties:
|
||||
patternProperties:
|
||||
"^.+-hog(-[0-9]+)?$":
|
||||
type: object
|
||||
properties:
|
||||
gpio-hog: true
|
||||
gpios: true
|
||||
input: true
|
||||
output-high: true
|
||||
output-low: true
|
||||
line-name: true
|
||||
|
||||
required:
|
||||
- gpio-hog
|
||||
- gpios
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
required:
|
||||
- compatible
|
||||
|
||||
@@ -45,12 +45,31 @@ properties:
|
||||
the pwm uses a logic low output for 100% duty cycle. If set to 1 the pwm
|
||||
uses a logic high output for 100% duty cycle.
|
||||
$ref: /schemas/types.yaml#/definitions/uint32-array
|
||||
deprecated: true
|
||||
minItems: 3
|
||||
maxItems: 3
|
||||
items:
|
||||
enum: [0, 1]
|
||||
default: 1
|
||||
|
||||
"#pwm-cells":
|
||||
const: 4
|
||||
description: |
|
||||
Number of cells in a PWM specifier.
|
||||
- 0: The PWM channel
|
||||
- 1: The PWM period in nanoseconds
|
||||
- 90909091 (11 Hz)
|
||||
- 71428571 (14 Hz)
|
||||
- 45454545 (22 Hz)
|
||||
- 34482759 (29 Hz)
|
||||
- 28571429 (35 Hz)
|
||||
- 22727273 (44 Hz)
|
||||
- 17241379 (58 Hz)
|
||||
- 11363636 (88 Hz)
|
||||
- 44444 (22 kHz)
|
||||
- 2: PWM flags 0 or PWM_POLARITY_INVERTED
|
||||
- 3: The default PWM duty cycle in nanoseconds
|
||||
|
||||
patternProperties:
|
||||
"^adi,bypass-attenuator-in[0-4]$":
|
||||
description: |
|
||||
@@ -81,6 +100,10 @@ patternProperties:
|
||||
- smbalert#
|
||||
- gpio
|
||||
|
||||
"^fan-[0-9]+$":
|
||||
$ref: fan-common.yaml#
|
||||
unevaluatedProperties: false
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
@@ -89,17 +112,27 @@ additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/pwm/pwm.h>
|
||||
i2c {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
hwmon@2e {
|
||||
pwm: hwmon@2e {
|
||||
compatible = "adi,adt7476";
|
||||
reg = <0x2e>;
|
||||
adi,bypass-attenuator-in0 = <1>;
|
||||
adi,bypass-attenuator-in1 = <0>;
|
||||
adi,pwm-active-state = <1 0 1>;
|
||||
adi,pin10-function = "smbalert#";
|
||||
adi,pin14-function = "tach4";
|
||||
#pwm-cells = <4>;
|
||||
|
||||
/* PWMs at 22.5 kHz frequency, 50% duty*/
|
||||
fan-0 {
|
||||
pwms = <&pwm 0 44444 0 22222>;
|
||||
};
|
||||
|
||||
fan-1 {
|
||||
pwms = <&pwm 2 44444 0 22222>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -0,0 +1,94 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/hwmon/lltc,ltc2978.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Octal Digital Power-supply monitor/supervisor/sequencer/margin controller.
|
||||
|
||||
maintainers:
|
||||
- Frank Li <Frank.Li@nxp.com>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- lltc,ltc2972
|
||||
- lltc,ltc2974
|
||||
- lltc,ltc2975
|
||||
- lltc,ltc2977
|
||||
- lltc,ltc2978
|
||||
- lltc,ltc2979
|
||||
- lltc,ltc2980
|
||||
- lltc,ltc3880
|
||||
- lltc,ltc3882
|
||||
- lltc,ltc3883
|
||||
- lltc,ltc3884
|
||||
- lltc,ltc3886
|
||||
- lltc,ltc3887
|
||||
- lltc,ltc3889
|
||||
- lltc,ltc7880
|
||||
- lltc,ltm2987
|
||||
- lltc,ltm4664
|
||||
- lltc,ltm4675
|
||||
- lltc,ltm4676
|
||||
- lltc,ltm4677
|
||||
- lltc,ltm4678
|
||||
- lltc,ltm4680
|
||||
- lltc,ltm4686
|
||||
- lltc,ltm4700
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
regulators:
|
||||
type: object
|
||||
description: |
|
||||
list of regulators provided by this controller.
|
||||
Valid names of regulators depend on number of supplies supported per device:
|
||||
* ltc2972 vout0 - vout1
|
||||
* ltc2974, ltc2975 : vout0 - vout3
|
||||
* ltc2977, ltc2979, ltc2980, ltm2987 : vout0 - vout7
|
||||
* ltc2978 : vout0 - vout7
|
||||
* ltc3880, ltc3882, ltc3884, ltc3886, ltc3887, ltc3889 : vout0 - vout1
|
||||
* ltc7880 : vout0 - vout1
|
||||
* ltc3883 : vout0
|
||||
* ltm4664 : vout0 - vout1
|
||||
* ltm4675, ltm4676, ltm4677, ltm4678 : vout0 - vout1
|
||||
* ltm4680, ltm4686 : vout0 - vout1
|
||||
* ltm4700 : vout0 - vout1
|
||||
|
||||
patternProperties:
|
||||
"^vout[0-7]$":
|
||||
$ref: /schemas/regulator/regulator.yaml#
|
||||
type: object
|
||||
unevaluatedProperties: false
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
i2c {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
regulator@5e {
|
||||
compatible = "lltc,ltc2978";
|
||||
reg = <0x5e>;
|
||||
|
||||
regulators {
|
||||
vout0 {
|
||||
regulator-name = "FPGA-2.5V";
|
||||
};
|
||||
vout2 {
|
||||
regulator-name = "FPGA-1.5V";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -1,62 +0,0 @@
|
||||
ltc2978
|
||||
|
||||
Required properties:
|
||||
- compatible: should contain one of:
|
||||
* "lltc,ltc2972"
|
||||
* "lltc,ltc2974"
|
||||
* "lltc,ltc2975"
|
||||
* "lltc,ltc2977"
|
||||
* "lltc,ltc2978"
|
||||
* "lltc,ltc2979"
|
||||
* "lltc,ltc2980"
|
||||
* "lltc,ltc3880"
|
||||
* "lltc,ltc3882"
|
||||
* "lltc,ltc3883"
|
||||
* "lltc,ltc3884"
|
||||
* "lltc,ltc3886"
|
||||
* "lltc,ltc3887"
|
||||
* "lltc,ltc3889"
|
||||
* "lltc,ltc7880"
|
||||
* "lltc,ltm2987"
|
||||
* "lltc,ltm4664"
|
||||
* "lltc,ltm4675"
|
||||
* "lltc,ltm4676"
|
||||
* "lltc,ltm4677"
|
||||
* "lltc,ltm4678"
|
||||
* "lltc,ltm4680"
|
||||
* "lltc,ltm4686"
|
||||
* "lltc,ltm4700"
|
||||
- reg: I2C slave address
|
||||
|
||||
Optional properties:
|
||||
- regulators: A node that houses a sub-node for each regulator controlled by
|
||||
the device. Each sub-node is identified using the node's name, with valid
|
||||
values listed below. The content of each sub-node is defined by the
|
||||
standard binding for regulators; see regulator.txt.
|
||||
|
||||
Valid names of regulators depend on number of supplies supported per device:
|
||||
* ltc2972 vout0 - vout1
|
||||
* ltc2974, ltc2975 : vout0 - vout3
|
||||
* ltc2977, ltc2979, ltc2980, ltm2987 : vout0 - vout7
|
||||
* ltc2978 : vout0 - vout7
|
||||
* ltc3880, ltc3882, ltc3884, ltc3886, ltc3887, ltc3889 : vout0 - vout1
|
||||
* ltc7880 : vout0 - vout1
|
||||
* ltc3883 : vout0
|
||||
* ltm4664 : vout0 - vout1
|
||||
* ltm4675, ltm4676, ltm4677, ltm4678 : vout0 - vout1
|
||||
* ltm4680, ltm4686 : vout0 - vout1
|
||||
* ltm4700 : vout0 - vout1
|
||||
|
||||
Example:
|
||||
ltc2978@5e {
|
||||
compatible = "lltc,ltc2978";
|
||||
reg = <0x5e>;
|
||||
regulators {
|
||||
vout0 {
|
||||
regulator-name = "FPGA-2.5V";
|
||||
};
|
||||
vout2 {
|
||||
regulator-name = "FPGA-1.5V";
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,70 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/hwmon/maxim,max31790.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: The Maxim MAX31790 Fan Controller
|
||||
|
||||
maintainers:
|
||||
- Guenter Roeck <linux@roeck-us.net>
|
||||
- Chanh Nguyen <chanh@os.amperecomputing.com>
|
||||
|
||||
description: >
|
||||
The MAX31790 controls the speeds of up to six fans using six
|
||||
independent PWM outputs. The desired fan speeds (or PWM duty cycles)
|
||||
are written through the I2C interface.
|
||||
|
||||
Datasheets:
|
||||
https://datasheets.maximintegrated.com/en/ds/MAX31790.pdf
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: maxim,max31790
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
|
||||
resets:
|
||||
maxItems: 1
|
||||
|
||||
"#pwm-cells":
|
||||
const: 1
|
||||
|
||||
patternProperties:
|
||||
"^fan-[0-9]+$":
|
||||
$ref: fan-common.yaml#
|
||||
unevaluatedProperties: false
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
i2c {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
pwm_provider: fan-controller@20 {
|
||||
compatible = "maxim,max31790";
|
||||
reg = <0x20>;
|
||||
clocks = <&sys_clk>;
|
||||
resets = <&reset 0>;
|
||||
#pwm-cells = <1>;
|
||||
|
||||
fan-0 {
|
||||
pwms = <&pwm_provider 1>;
|
||||
};
|
||||
|
||||
fan-1 {
|
||||
pwms = <&pwm_provider 2>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/hwmon/sophgo,sg2042-hwmon-mcu.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Sophgo SG2042 onboard MCU support
|
||||
|
||||
maintainers:
|
||||
- Inochi Amaoto <inochiama@outlook.com>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: sophgo,sg2042-hwmon-mcu
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
"#thermal-sensor-cells":
|
||||
const: 1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- "#thermal-sensor-cells"
|
||||
|
||||
allOf:
|
||||
- $ref: /schemas/thermal/thermal-sensor.yaml#
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
i2c {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
hwmon@17 {
|
||||
compatible = "sophgo,sg2042-hwmon-mcu";
|
||||
reg = <0x17>;
|
||||
#thermal-sensor-cells = <1>;
|
||||
};
|
||||
};
|
||||
@@ -36,7 +36,9 @@ properties:
|
||||
items:
|
||||
- enum:
|
||||
- qcom,qcm2290-smmu-500
|
||||
- qcom,qcs8300-smmu-500
|
||||
- qcom,qdu1000-smmu-500
|
||||
- qcom,sa8255p-smmu-500
|
||||
- qcom,sa8775p-smmu-500
|
||||
- qcom,sc7180-smmu-500
|
||||
- qcom,sc7280-smmu-500
|
||||
@@ -84,6 +86,7 @@ properties:
|
||||
items:
|
||||
- enum:
|
||||
- qcom,qcm2290-smmu-500
|
||||
- qcom,sa8255p-smmu-500
|
||||
- qcom,sa8775p-smmu-500
|
||||
- qcom,sc7280-smmu-500
|
||||
- qcom,sc8180x-smmu-500
|
||||
@@ -552,7 +555,9 @@ allOf:
|
||||
- cavium,smmu-v2
|
||||
- marvell,ap806-smmu-500
|
||||
- nvidia,smmu-500
|
||||
- qcom,qcs8300-smmu-500
|
||||
- qcom,qdu1000-smmu-500
|
||||
- qcom,sa8255p-smmu-500
|
||||
- qcom,sc7180-smmu-500
|
||||
- qcom,sdm670-smmu-500
|
||||
- qcom,sdm845-smmu-500
|
||||
|
||||
@@ -0,0 +1,92 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/mfd/adi,adp5585.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Analog Devices ADP5585 Keypad Decoder and I/O Expansion
|
||||
|
||||
maintainers:
|
||||
- Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
||||
|
||||
description:
|
||||
The ADP5585 is a 10/11 input/output port expander with a built in keypad
|
||||
matrix decoder, programmable logic, reset generator, and PWM generator.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
items:
|
||||
- enum:
|
||||
- adi,adp5585-00 # Default
|
||||
- adi,adp5585-01 # 11 GPIOs
|
||||
- adi,adp5585-02 # No pull-up resistors by default on special pins
|
||||
- adi,adp5585-03 # Alternate I2C address
|
||||
- adi,adp5585-04 # Pull-down resistors on all pins by default
|
||||
- const: adi,adp5585
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
vdd-supply: true
|
||||
|
||||
gpio-controller: true
|
||||
|
||||
'#gpio-cells':
|
||||
const: 2
|
||||
|
||||
gpio-reserved-ranges: true
|
||||
|
||||
"#pwm-cells":
|
||||
const: 3
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- gpio-controller
|
||||
- "#gpio-cells"
|
||||
- "#pwm-cells"
|
||||
|
||||
allOf:
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: adi,adp5585-01
|
||||
then:
|
||||
properties:
|
||||
gpio-reserved-ranges: false
|
||||
else:
|
||||
properties:
|
||||
gpio-reserved-ranges:
|
||||
maxItems: 1
|
||||
items:
|
||||
items:
|
||||
- const: 5
|
||||
- const: 1
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
i2c {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
io-expander@34 {
|
||||
compatible = "adi,adp5585-00", "adi,adp5585";
|
||||
reg = <0x34>;
|
||||
|
||||
vdd-supply = <®_3v3>;
|
||||
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
gpio-reserved-ranges = <5 1>;
|
||||
|
||||
#pwm-cells = <3>;
|
||||
};
|
||||
};
|
||||
|
||||
...
|
||||
@@ -0,0 +1,92 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/mmc/atmel,sama5d2-sdhci.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Atmel SDHCI controller
|
||||
|
||||
maintainers:
|
||||
- Aubin Constans <aubin.constans@microchip.com>
|
||||
- Nicolas Ferre <nicolas.ferre@microchip.com>
|
||||
|
||||
description:
|
||||
Bindings for the SDHCI controller found in Atmel/Microchip SoCs.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
oneOf:
|
||||
- enum:
|
||||
- atmel,sama5d2-sdhci
|
||||
- microchip,sam9x60-sdhci
|
||||
- items:
|
||||
- enum:
|
||||
- microchip,sam9x7-sdhci
|
||||
- microchip,sama7g5-sdhci
|
||||
- const: microchip,sam9x60-sdhci
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
items:
|
||||
- description: hclock
|
||||
- description: multclk
|
||||
- description: baseclk
|
||||
minItems: 2
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: hclock
|
||||
- const: multclk
|
||||
- const: baseclk
|
||||
minItems: 2
|
||||
|
||||
microchip,sdcal-inverted:
|
||||
type: boolean
|
||||
description:
|
||||
When present, polarity on the SDCAL SoC pin is inverted. The default
|
||||
polarity for this signal is described in the datasheet. For instance on
|
||||
SAMA5D2, the pin is usually tied to the GND with a resistor and a
|
||||
capacitor (see "SDMMC I/O Calibration" chapter).
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
- clocks
|
||||
- clock-names
|
||||
|
||||
allOf:
|
||||
- $ref: sdhci-common.yaml#
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- atmel,sama5d2-sdhci
|
||||
then:
|
||||
properties:
|
||||
clocks:
|
||||
minItems: 3
|
||||
clock-names:
|
||||
minItems: 3
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/interrupt-controller/irq.h>
|
||||
#include <dt-bindings/clock/at91.h>
|
||||
mmc@a0000000 {
|
||||
compatible = "atmel,sama5d2-sdhci";
|
||||
reg = <0xa0000000 0x300>;
|
||||
interrupts = <31 IRQ_TYPE_LEVEL_HIGH 0>;
|
||||
clocks = <&sdmmc0_hclk>, <&sdmmc0_gclk>, <&main>;
|
||||
clock-names = "hclock", "multclk", "baseclk";
|
||||
assigned-clocks = <&sdmmc0_gclk>;
|
||||
assigned-clock-rates = <480000000>;
|
||||
};
|
||||
@@ -0,0 +1,87 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/mmc/nuvoton,ma35d1-sdhci.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Nuvoton MA35D1 SD/SDIO/MMC Controller
|
||||
|
||||
maintainers:
|
||||
- Shan-Chun Hung <shanchun1218@gmail.com>
|
||||
|
||||
allOf:
|
||||
- $ref: sdhci-common.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- nuvoton,ma35d1-sdhci
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
|
||||
pinctrl-names:
|
||||
minItems: 1
|
||||
items:
|
||||
- const: default
|
||||
- const: state_uhs
|
||||
|
||||
pinctrl-0:
|
||||
description:
|
||||
Should contain default/high speed pin ctrl.
|
||||
maxItems: 1
|
||||
|
||||
pinctrl-1:
|
||||
description:
|
||||
Should contain uhs mode pin ctrl.
|
||||
maxItems: 1
|
||||
|
||||
resets:
|
||||
maxItems: 1
|
||||
|
||||
nuvoton,sys:
|
||||
$ref: /schemas/types.yaml#/definitions/phandle
|
||||
description: phandle to access GCR (Global Control Register) registers.
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
- clocks
|
||||
- pinctrl-names
|
||||
- pinctrl-0
|
||||
- resets
|
||||
- nuvoton,sys
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
#include <dt-bindings/clock/nuvoton,ma35d1-clk.h>
|
||||
#include <dt-bindings/reset/nuvoton,ma35d1-reset.h>
|
||||
|
||||
soc {
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
mmc@40190000 {
|
||||
compatible = "nuvoton,ma35d1-sdhci";
|
||||
reg = <0x0 0x40190000 0x0 0x2000>;
|
||||
interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clk SDH1_GATE>;
|
||||
pinctrl-names = "default", "state_uhs";
|
||||
pinctrl-0 = <&pinctrl_sdhci1>;
|
||||
pinctrl-1 = <&pinctrl_sdhci1_uhs>;
|
||||
resets = <&sys MA35D1_RESET_SDH1>;
|
||||
nuvoton,sys = <&sys>;
|
||||
vqmmc-supply = <&sdhci1_vqmmc_regulator>;
|
||||
bus-width = <8>;
|
||||
max-frequency = <200000000>;
|
||||
};
|
||||
};
|
||||
@@ -18,6 +18,7 @@ properties:
|
||||
- renesas,sdhi-r7s9210 # SH-Mobile AG5
|
||||
- renesas,sdhi-r8a73a4 # R-Mobile APE6
|
||||
- renesas,sdhi-r8a7740 # R-Mobile A1
|
||||
- renesas,sdhi-r9a09g057 # RZ/V2H(P)
|
||||
- renesas,sdhi-sh73a0 # R-Mobile APE6
|
||||
- items:
|
||||
- enum:
|
||||
@@ -75,9 +76,13 @@ properties:
|
||||
minItems: 1
|
||||
maxItems: 3
|
||||
|
||||
clocks: true
|
||||
clocks:
|
||||
minItems: 1
|
||||
maxItems: 4
|
||||
|
||||
clock-names: true
|
||||
clock-names:
|
||||
minItems: 1
|
||||
maxItems: 4
|
||||
|
||||
dmas:
|
||||
minItems: 4
|
||||
@@ -118,7 +123,9 @@ allOf:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: renesas,rzg2l-sdhi
|
||||
enum:
|
||||
- renesas,sdhi-r9a09g057
|
||||
- renesas,rzg2l-sdhi
|
||||
then:
|
||||
properties:
|
||||
clocks:
|
||||
|
||||
@@ -43,6 +43,8 @@ properties:
|
||||
- rockchip,rv1108-dw-mshc
|
||||
- rockchip,rv1126-dw-mshc
|
||||
- const: rockchip,rk3288-dw-mshc
|
||||
# for Rockchip RK3576 with phase tuning inside the controller
|
||||
- const: rockchip,rk3576-dw-mshc
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
* Atmel SDHCI controller
|
||||
|
||||
This file documents the differences between the core properties in
|
||||
Documentation/devicetree/bindings/mmc/mmc.txt and the properties used by the
|
||||
sdhci-of-at91 driver.
|
||||
|
||||
Required properties:
|
||||
- compatible: Must be "atmel,sama5d2-sdhci" or "microchip,sam9x60-sdhci"
|
||||
or "microchip,sam9x7-sdhci", "microchip,sam9x60-sdhci".
|
||||
- clocks: Phandlers to the clocks.
|
||||
- clock-names: Must be "hclock", "multclk", "baseclk" for
|
||||
"atmel,sama5d2-sdhci".
|
||||
Must be "hclock", "multclk" for "microchip,sam9x60-sdhci".
|
||||
Must be "hclock", "multclk" for "microchip,sam9x7-sdhci".
|
||||
|
||||
Optional properties:
|
||||
- assigned-clocks: The same with "multclk".
|
||||
- assigned-clock-rates The rate of "multclk" in order to not rely on the
|
||||
gck configuration set by previous components.
|
||||
- microchip,sdcal-inverted: when present, polarity on the SDCAL SoC pin is
|
||||
inverted. The default polarity for this signal is described in the datasheet.
|
||||
For instance on SAMA5D2, the pin is usually tied to the GND with a resistor
|
||||
and a capacitor (see "SDMMC I/O Calibration" chapter).
|
||||
|
||||
Example:
|
||||
|
||||
mmc0: sdio-host@a0000000 {
|
||||
compatible = "atmel,sama5d2-sdhci";
|
||||
reg = <0xa0000000 0x300>;
|
||||
interrupts = <31 IRQ_TYPE_LEVEL_HIGH 0>;
|
||||
clocks = <&sdmmc0_hclk>, <&sdmmc0_gclk>, <&main>;
|
||||
clock-names = "hclock", "multclk", "baseclk";
|
||||
assigned-clocks = <&sdmmc0_gclk>;
|
||||
assigned-clock-rates = <480000000>;
|
||||
};
|
||||
@@ -10,18 +10,20 @@ maintainers:
|
||||
- Ulf Hansson <ulf.hansson@linaro.org>
|
||||
- Jisheng Zhang <Jisheng.Zhang@synaptics.com>
|
||||
|
||||
allOf:
|
||||
- $ref: mmc-controller.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- rockchip,rk3568-dwcmshc
|
||||
- rockchip,rk3588-dwcmshc
|
||||
- snps,dwcmshc-sdhci
|
||||
- sophgo,cv1800b-dwcmshc
|
||||
- sophgo,sg2002-dwcmshc
|
||||
- thead,th1520-dwcmshc
|
||||
oneOf:
|
||||
- items:
|
||||
- const: rockchip,rk3576-dwcmshc
|
||||
- const: rockchip,rk3588-dwcmshc
|
||||
- enum:
|
||||
- rockchip,rk3568-dwcmshc
|
||||
- rockchip,rk3588-dwcmshc
|
||||
- snps,dwcmshc-sdhci
|
||||
- sophgo,cv1800b-dwcmshc
|
||||
- sophgo,sg2002-dwcmshc
|
||||
- sophgo,sg2042-dwcmshc
|
||||
- thead,th1520-dwcmshc
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
@@ -31,22 +33,14 @@ properties:
|
||||
|
||||
clocks:
|
||||
minItems: 1
|
||||
items:
|
||||
- description: core clock
|
||||
- description: bus clock for optional
|
||||
- description: axi clock for rockchip specified
|
||||
- description: block clock for rockchip specified
|
||||
- description: timer clock for rockchip specified
|
||||
|
||||
maxItems: 5
|
||||
|
||||
clock-names:
|
||||
minItems: 1
|
||||
items:
|
||||
- const: core
|
||||
- const: bus
|
||||
- const: axi
|
||||
- const: block
|
||||
- const: timer
|
||||
maxItems: 5
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
resets:
|
||||
maxItems: 5
|
||||
@@ -63,7 +57,6 @@ properties:
|
||||
description: Specify the number of delay for tx sampling.
|
||||
$ref: /schemas/types.yaml#/definitions/uint8
|
||||
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
@@ -71,6 +64,60 @@ required:
|
||||
- clocks
|
||||
- clock-names
|
||||
|
||||
allOf:
|
||||
- $ref: mmc-controller.yaml#
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: sophgo,sg2042-dwcmshc
|
||||
|
||||
then:
|
||||
properties:
|
||||
clocks:
|
||||
items:
|
||||
- description: core clock
|
||||
- description: bus clock
|
||||
- description: timer clock
|
||||
clock-names:
|
||||
items:
|
||||
- const: core
|
||||
- const: bus
|
||||
- const: timer
|
||||
else:
|
||||
properties:
|
||||
clocks:
|
||||
minItems: 1
|
||||
items:
|
||||
- description: core clock
|
||||
- description: bus clock for optional
|
||||
- description: axi clock for rockchip specified
|
||||
- description: block clock for rockchip specified
|
||||
- description: timer clock for rockchip specified
|
||||
clock-names:
|
||||
minItems: 1
|
||||
items:
|
||||
- const: core
|
||||
- const: bus
|
||||
- const: axi
|
||||
- const: block
|
||||
- const: timer
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: rockchip,rk3576-dwcmshc
|
||||
|
||||
then:
|
||||
required:
|
||||
- power-domains
|
||||
|
||||
else:
|
||||
properties:
|
||||
power-domains: false
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
|
||||
@@ -61,12 +61,9 @@ properties:
|
||||
GPIO connection to R/B signal from NAND chip
|
||||
maxItems: 1
|
||||
|
||||
patternProperties:
|
||||
"@[0-9a-f]+$":
|
||||
$ref: /schemas/mtd/partitions/partition.yaml
|
||||
|
||||
allOf:
|
||||
- $ref: /schemas/memory-controllers/ti,gpmc-child.yaml
|
||||
- $ref: mtd.yaml#
|
||||
|
||||
required:
|
||||
- compatible
|
||||
|
||||
@@ -41,6 +41,7 @@ properties:
|
||||
- rockchip,rk3368-power-controller
|
||||
- rockchip,rk3399-power-controller
|
||||
- rockchip,rk3568-power-controller
|
||||
- rockchip,rk3576-power-controller
|
||||
- rockchip,rk3588-power-controller
|
||||
- rockchip,rv1126-power-controller
|
||||
|
||||
|
||||
@@ -27,6 +27,9 @@ properties:
|
||||
battery-detect-gpios:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
io-channels:
|
||||
items:
|
||||
- description: Battery Temperature ADC
|
||||
@@ -53,6 +56,7 @@ required:
|
||||
- compatible
|
||||
- reg
|
||||
- battery-detect-gpios
|
||||
- interrupts
|
||||
- io-channels
|
||||
- io-channel-names
|
||||
- nvmem-cells
|
||||
@@ -88,6 +92,8 @@ examples:
|
||||
compatible = "sprd,sc2731-fgu";
|
||||
reg = <0xa00>;
|
||||
battery-detect-gpios = <&pmic_eic 9 GPIO_ACTIVE_HIGH>;
|
||||
interrupt-parent = <&sc2731_pmic>;
|
||||
interrupts = <4>;
|
||||
io-channels = <&pmic_adc 5>, <&pmic_adc 14>;
|
||||
io-channel-names = "bat-temp", "charge-vol";
|
||||
nvmem-cells = <&fgu_calib>;
|
||||
|
||||
+7
@@ -23,11 +23,18 @@ properties:
|
||||
- const: x-powers,axp202-battery-power-supply
|
||||
- const: x-powers,axp209-battery-power-supply
|
||||
- const: x-powers,axp221-battery-power-supply
|
||||
- const: x-powers,axp717-battery-power-supply
|
||||
- items:
|
||||
- const: x-powers,axp803-battery-power-supply
|
||||
- const: x-powers,axp813-battery-power-supply
|
||||
- const: x-powers,axp813-battery-power-supply
|
||||
|
||||
monitored-battery:
|
||||
description:
|
||||
Specifies the phandle of an optional simple-battery connected to
|
||||
this gauge.
|
||||
$ref: /schemas/types.yaml#/definitions/phandle
|
||||
|
||||
required:
|
||||
- compatible
|
||||
|
||||
|
||||
+69
-3
@@ -15,9 +15,6 @@ maintainers:
|
||||
- Chen-Yu Tsai <wens@csie.org>
|
||||
- Sebastian Reichel <sre@kernel.org>
|
||||
|
||||
allOf:
|
||||
- $ref: power-supply.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
oneOf:
|
||||
@@ -26,13 +23,82 @@ properties:
|
||||
- x-powers,axp202-usb-power-supply
|
||||
- x-powers,axp221-usb-power-supply
|
||||
- x-powers,axp223-usb-power-supply
|
||||
- x-powers,axp717-usb-power-supply
|
||||
- x-powers,axp813-usb-power-supply
|
||||
- items:
|
||||
- const: x-powers,axp803-usb-power-supply
|
||||
- const: x-powers,axp813-usb-power-supply
|
||||
|
||||
input-current-limit-microamp:
|
||||
description:
|
||||
Optional value to clamp the maximum input current limit to for
|
||||
the device. If omitted, the programmed value from the EFUSE will
|
||||
be used.
|
||||
minimum: 100000
|
||||
maximum: 4000000
|
||||
|
||||
required:
|
||||
- compatible
|
||||
|
||||
allOf:
|
||||
- $ref: power-supply.yaml#
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- x-powers,axp192-usb-power-supply
|
||||
then:
|
||||
properties:
|
||||
input-current-limit-microamp:
|
||||
enum: [100000, 500000]
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- x-powers,axp202-usb-power-supply
|
||||
- x-powers,axp223-usb-power-supply
|
||||
then:
|
||||
properties:
|
||||
input-current-limit-microamp:
|
||||
enum: [100000, 500000, 900000]
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- x-powers,axp221-usb-power-supply
|
||||
then:
|
||||
properties:
|
||||
input-current-limit-microamp:
|
||||
enum: [500000, 900000]
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- x-powers,axp717-usb-power-supply
|
||||
then:
|
||||
properties:
|
||||
input-current-limit-microamp:
|
||||
description: Maximum input current in increments of 50000 uA.
|
||||
minimum: 100000
|
||||
maximum: 3250000
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- x-powers,axp813-usb-power-supply
|
||||
then:
|
||||
properties:
|
||||
input-current-limit-microamp:
|
||||
enum: [100000, 500000, 900000, 1500000, 2000000, 2500000,
|
||||
3000000, 3500000, 4000000]
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
@@ -46,10 +46,11 @@ properties:
|
||||
- description: Module Clock
|
||||
- description: Bus Clock
|
||||
|
||||
# Even though it only applies to subschemas under the conditionals,
|
||||
# not listing them here will trigger a warning because of the
|
||||
# additionalsProperties set to false.
|
||||
clock-names: true
|
||||
clock-names:
|
||||
minItems: 1
|
||||
items:
|
||||
- const: mod
|
||||
- const: bus
|
||||
|
||||
resets:
|
||||
maxItems: 1
|
||||
|
||||
@@ -37,6 +37,10 @@ properties:
|
||||
- enum:
|
||||
- amlogic,meson8-pwm-v2
|
||||
- amlogic,meson-s4-pwm
|
||||
- items:
|
||||
- enum:
|
||||
- amlogic,meson-a1-pwm
|
||||
- const: amlogic,meson-s4-pwm
|
||||
- items:
|
||||
- enum:
|
||||
- amlogic,meson8b-pwm-v2
|
||||
@@ -56,6 +60,9 @@ properties:
|
||||
minItems: 1
|
||||
maxItems: 2
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
"#pwm-cells":
|
||||
const: 3
|
||||
|
||||
@@ -136,6 +143,16 @@ allOf:
|
||||
required:
|
||||
- clocks
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- amlogic,meson-a1-pwm
|
||||
then:
|
||||
required:
|
||||
- power-domains
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
|
||||
@@ -37,6 +37,7 @@ properties:
|
||||
- renesas,pwm-r8a77995 # R-Car D3
|
||||
- renesas,pwm-r8a779a0 # R-Car V3U
|
||||
- renesas,pwm-r8a779g0 # R-Car V4H
|
||||
- renesas,pwm-r8a779h0 # R-Car V4M
|
||||
- const: renesas,pwm-rcar
|
||||
|
||||
reg:
|
||||
|
||||
@@ -41,6 +41,7 @@ properties:
|
||||
- renesas,tpu-r8a77980 # R-Car V3H
|
||||
- renesas,tpu-r8a779a0 # R-Car V3U
|
||||
- renesas,tpu-r8a779g0 # R-Car V4H
|
||||
- renesas,tpu-r8a779h0 # R-Car V4M
|
||||
- const: renesas,tpu
|
||||
|
||||
reg:
|
||||
|
||||
@@ -38,10 +38,6 @@ properties:
|
||||
- ad,adm9240
|
||||
# AD5110 - Nonvolatile Digital Potentiometer
|
||||
- adi,ad5110
|
||||
# Analog Devices ADP5585 Keypad Decoder and I/O Expansion
|
||||
- adi,adp5585
|
||||
# Analog Devices ADP5585 Keypad Decoder and I/O Expansion with support for Row5
|
||||
- adi,adp5585-02
|
||||
# Analog Devices ADP5589 Keypad Decoder and I/O Expansion
|
||||
- adi,adp5589
|
||||
# Analog Devices LT7182S Dual Channel 6A, 20V PolyPhase Step-Down Silent Switcher
|
||||
|
||||
@@ -124,6 +124,7 @@ Subsystem-specific APIs
|
||||
pps
|
||||
ptp
|
||||
pwm
|
||||
pwrseq
|
||||
regulator
|
||||
reset
|
||||
rfkill
|
||||
|
||||
@@ -10,4 +10,5 @@ MMC/SD/SDIO card support
|
||||
mmc-dev-attrs
|
||||
mmc-dev-parts
|
||||
mmc-async-req
|
||||
mmc-test
|
||||
mmc-tools
|
||||
|
||||
@@ -0,0 +1,299 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
========================
|
||||
MMC Test Framework
|
||||
========================
|
||||
|
||||
Overview
|
||||
========
|
||||
|
||||
The `mmc_test` framework is designed to test the performance and reliability of host controller drivers and all devices handled by the MMC subsystem. This includes not only MMC devices but also SD cards and other devices supported by the subsystem.
|
||||
|
||||
The framework provides a variety of tests to evaluate different aspects of the host controller and device interactions, such as read and write performance, data integrity, and error handling. These tests help ensure that the host controller drivers and devices operate correctly under various conditions.
|
||||
|
||||
The `mmc_test` framework is particularly useful for:
|
||||
|
||||
- Verifying the functionality and performance of MMC and SD host controller drivers.
|
||||
- Ensuring compatibility and reliability of MMC and SD devices.
|
||||
- Identifying and diagnosing issues in the MMC subsystem.
|
||||
|
||||
The results of the tests are logged in the kernel log, providing detailed information about the test outcomes and any encountered issues.
|
||||
|
||||
Note: whatever is on your card will be overwritten by these tests.
|
||||
|
||||
Initialization
|
||||
==============
|
||||
|
||||
To use the ``mmc_test`` framework, follow these steps:
|
||||
|
||||
1. **Enable the MMC Test Framework**:
|
||||
|
||||
Ensure that the ``CONFIG_MMC_TEST`` kernel configuration option is enabled. This can be done by configuring the kernel:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
make menuconfig
|
||||
|
||||
Navigate to:
|
||||
|
||||
Device Drivers --->
|
||||
<*> MMC/SD/SDIO card support --->
|
||||
[*] MMC host test driver
|
||||
|
||||
Alternatively, you can enable it directly in the kernel configuration file:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
echo "CONFIG_MMC_TEST=y" >> .config
|
||||
|
||||
Rebuild and install the kernel if necessary.
|
||||
|
||||
2. **Load the MMC Test Module**:
|
||||
|
||||
If the ``mmc_test`` framework is built as a module, you need to load it using ``modprobe``:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
modprobe mmc_test
|
||||
|
||||
Binding the MMC Card for Testing
|
||||
================================
|
||||
|
||||
To enable MMC testing, you need to unbind the MMC card from the ``mmcblk`` driver and bind it to the ``mmc_test`` driver. This allows the ``mmc_test`` framework to take control of the MMC card for testing purposes.
|
||||
|
||||
1. Identify the MMC card:
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
ls /sys/bus/mmc/devices/
|
||||
|
||||
This will list the MMC devices, such as ``mmc0:0001``.
|
||||
|
||||
2. Unbind the MMC card from the ``mmcblk`` driver:
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
echo 'mmc0:0001' > /sys/bus/mmc/drivers/mmcblk/unbind
|
||||
|
||||
3. Bind the MMC card to the ``mmc_test`` driver:
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
echo 'mmc0:0001' > /sys/bus/mmc/drivers/mmc_test/bind
|
||||
|
||||
After binding, you should see a line in the kernel log indicating that the card has been claimed for testing:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
mmc_test mmc0:0001: Card claimed for testing.
|
||||
|
||||
|
||||
Usage - Debugfs Entries
|
||||
=======================
|
||||
|
||||
Once the ``mmc_test`` framework is enabled, you can interact with the following debugfs entries located in ``/sys/kernel/debug/mmc0/mmc0:0001``:
|
||||
|
||||
1. **test**:
|
||||
|
||||
This file is used to run specific tests. Write the test number to this file to execute a test.
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
echo <test_number> > /sys/kernel/debug/mmc0/mmc0:0001/test
|
||||
|
||||
The test result is indicated in the kernel log info. You can view the kernel log using the `dmesg` command or by checking the log file in `/var/log/`.
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
dmesg | grep mmc0
|
||||
|
||||
Example:
|
||||
|
||||
To run test number 4 (Basic read with data verification):
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
echo 4 > /sys/kernel/debug/mmc0/mmc0:0001/test
|
||||
|
||||
Check the kernel log for the result:
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
dmesg | grep mmc0
|
||||
|
||||
2. **testlist**:
|
||||
|
||||
This file lists all available tests. You can read this file to see the list of tests and their corresponding numbers.
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
cat /sys/kernel/debug/mmc0/mmc0:0001/testlist
|
||||
|
||||
The available tests are listed in the table below:
|
||||
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| Test | Test Name | Test Description |
|
||||
+======+================================+=============================================+
|
||||
| 0 | Run all tests | Runs all available tests |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 1 | Basic write | Performs a basic write operation of a |
|
||||
| | | single 512-Byte block to the MMC card |
|
||||
| | | without data verification. |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 2 | Basic read | Same for read |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 3 | Basic write | Performs a basic write operation of a |
|
||||
| | (with data verification) | single 512-Byte block to the MMC card |
|
||||
| | | with data verification by reading back |
|
||||
| | | the written data and comparing it. |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 4 | Basic read | Same for read |
|
||||
| | (with data verification) | |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 5 | Multi-block write | Performs a multi-block write operation of |
|
||||
| | | 8 blocks (each 512 bytes) to the MMC card. |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 6 | Multi-block read | Same for read |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 7 | Power of two block writes | Performs write operations with block sizes |
|
||||
| | | that are powers of two, starting from 1 |
|
||||
| | | byte up to 256 bytes, to the MMC card. |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 8 | Power of two block reads | Same for read |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 9 | Weird sized block writes | Performs write operations with varying |
|
||||
| | | block sizes starting from 3 bytes and |
|
||||
| | | increasing by 7 bytes each iteration, up |
|
||||
| | | to 511 bytes, to the MMC card. |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 10 | Weird sized block reads | same for read |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 11 | Badly aligned write | Performs write operations with buffers |
|
||||
| | | starting at different alignments (0 to 7 |
|
||||
| | | bytes offset) to test how the MMC card |
|
||||
| | | handles unaligned data transfers. |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 12 | Badly aligned read | same for read |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 13 | Badly aligned multi-block write| same for multi-write |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 14 | Badly aligned multi-block read | same for multi-read |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 15 | Proper xfer_size at write | intentionally create a broken transfer by |
|
||||
| | (Start failure) | modifying the MMC request in a way that it |
|
||||
| | | will not perform as expected, e.g. use |
|
||||
| | | MMC_WRITE_BLOCK for a multi-block transfer |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 16 | Proper xfer_size at read | same for read |
|
||||
| | (Start failure) | |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 17 | Proper xfer_size at write | same for 2 blocks |
|
||||
| | (Midway failure) | |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 18 | Proper xfer_size at read | same for read |
|
||||
| | (Midway failure) | |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 19 | Highmem write | use a high memory page |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 20 | Highmem read | same for read |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 21 | Multi-block highmem write | same for multi-write |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 22 | Multi-block highmem read | same for mult-read |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 23 | Best-case read performance | Performs 512K sequential read (non sg) |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 24 | Best-case write performance | same for write |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 25 | Best-case read performance | Same using sg |
|
||||
| | (Into scattered pages) | |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 26 | Best-case write performance | same for write |
|
||||
| | (From scattered pages) | |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 27 | Single read performance | By transfer size |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 28 | Single write performance | By transfer size |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 29 | Single trim performance | By transfer size |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 30 | Consecutive read performance | By transfer size |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 31 | Consecutive write performance | By transfer size |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 32 | Consecutive trim performance | By transfer size |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 33 | Random read performance | By transfer size |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 34 | Random write performance | By transfer size |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 35 | Large sequential read | Into scattered pages |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 36 | Large sequential write | From scattered pages |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 37 | Write performance | With blocking req 4k to 4MB |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 38 | Write performance | With non-blocking req 4k to 4MB |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 39 | Read performance | With blocking req 4k to 4MB |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 40 | Read performance | With non-blocking req 4k to 4MB |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 41 | Write performance | Blocking req 1 to 512 sg elems |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 42 | Write performance | Non-blocking req 1 to 512 sg elems |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 43 | Read performance | Blocking req 1 to 512 sg elems |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 44 | Read performance | Non-blocking req 1 to 512 sg elems |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 45 | Reset test | |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 46 | Commands during read | No Set Block Count (CMD23) |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 47 | Commands during write | No Set Block Count (CMD23) |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 48 | Commands during read | Use Set Block Count (CMD23) |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 49 | Commands during write | Use Set Block Count (CMD23) |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 50 | Commands during non-blocking | Read - use Set Block Count (CMD23) |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
| 51 | Commands during non-blocking | Write - use Set Block Count (CMD23) |
|
||||
+------+--------------------------------+---------------------------------------------+
|
||||
|
||||
Test Results
|
||||
============
|
||||
|
||||
The results of the tests are logged in the kernel log. Each test logs the start, end, and result of the test. The possible results are:
|
||||
|
||||
- **OK**: The test completed successfully.
|
||||
- **FAILED**: The test failed.
|
||||
- **UNSUPPORTED (by host)**: The test is unsupported by the host.
|
||||
- **UNSUPPORTED (by card)**: The test is unsupported by the card.
|
||||
- **ERROR**: An error occurred during the test.
|
||||
|
||||
Example Kernel Log Output
|
||||
=========================
|
||||
|
||||
When running a test, you will see log entries similar to the following in the kernel log:
|
||||
|
||||
.. code-block:: none
|
||||
|
||||
[ 1234.567890] mmc0: Starting tests of card mmc0:0001...
|
||||
[ 1234.567891] mmc0: Test case 4. Basic read (with data verification)...
|
||||
[ 1234.567892] mmc0: Result: OK
|
||||
[ 1234.567893] mmc0: Tests completed.
|
||||
|
||||
In this example, test case 4 (Basic read with data verification) was executed, and the result was OK.
|
||||
|
||||
|
||||
Contributing
|
||||
============
|
||||
|
||||
Contributions to the `mmc_test` framework are welcome. Please follow the standard Linux kernel contribution guidelines and submit patches to the appropriate maintainers.
|
||||
|
||||
Contact
|
||||
=======
|
||||
|
||||
For more information or to report issues, please contact the MMC subsystem maintainers.
|
||||
@@ -0,0 +1,95 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0-only
|
||||
.. Copyright 2024 Linaro Ltd.
|
||||
|
||||
====================
|
||||
Power Sequencing API
|
||||
====================
|
||||
|
||||
:Author: Bartosz Golaszewski
|
||||
|
||||
Introduction
|
||||
============
|
||||
|
||||
This framework is designed to abstract complex power-up sequences that are
|
||||
shared between multiple logical devices in the linux kernel.
|
||||
|
||||
The intention is to allow consumers to obtain a power sequencing handle
|
||||
exposed by the power sequence provider and delegate the actual requesting and
|
||||
control of the underlying resources as well as to allow the provider to
|
||||
mitigate any potential conflicts between multiple users behind the scenes.
|
||||
|
||||
Glossary
|
||||
--------
|
||||
|
||||
The power sequencing API uses a number of terms specific to the subsystem:
|
||||
|
||||
Unit
|
||||
|
||||
A unit is a discreet chunk of a power sequence. For instance one unit may
|
||||
enable a set of regulators, another may enable a specific GPIO. Units can
|
||||
define dependencies in the form of other units that must be enabled before
|
||||
it itself can be.
|
||||
|
||||
Target
|
||||
|
||||
A target is a set of units (composed of the "final" unit and its
|
||||
dependencies) that a consumer selects by its name when requesting a handle
|
||||
to the power sequencer. Via the dependency system, multiple targets may
|
||||
share the same parts of a power sequence but ignore parts that are
|
||||
irrelevant.
|
||||
|
||||
Descriptor
|
||||
|
||||
A handle passed by the pwrseq core to every consumer that serves as the
|
||||
entry point to the provider layer. It ensures coherence between different
|
||||
users and keeps reference counting consistent.
|
||||
|
||||
Consumer interface
|
||||
==================
|
||||
|
||||
The consumer API is aimed to be as simple as possible. The driver interested in
|
||||
getting a descriptor from the power sequencer should call pwrseq_get() and
|
||||
specify the name of the target it wants to reach in the sequence after calling
|
||||
pwrseq_power_up(). The descriptor can be released by calling pwrseq_put() and
|
||||
the consumer can request the powering down of its target with
|
||||
pwrseq_power_off(). Note that there is no guarantee that pwrseq_power_off()
|
||||
will have any effect as there may be multiple users of the underlying resources
|
||||
who may keep them active.
|
||||
|
||||
Provider interface
|
||||
==================
|
||||
|
||||
The provider API is admittedly not nearly as straightforward as the one for
|
||||
consumers but it makes up for it in flexibility.
|
||||
|
||||
Each provider can logically split the power-up sequence into descrete chunks
|
||||
(units) and define their dependencies. They can then expose named targets that
|
||||
consumers may use as the final point in the sequence that they wish to reach.
|
||||
|
||||
To that end the providers fill out a set of configuration structures and
|
||||
register with the pwrseq subsystem by calling pwrseq_device_register().
|
||||
|
||||
Dynamic consumer matching
|
||||
-------------------------
|
||||
|
||||
The main difference between pwrseq and other linux kernel providers is the
|
||||
mechanism for dynamic matching of consumers and providers. Every power sequence
|
||||
provider driver must implement the `match()` callback and pass it to the pwrseq
|
||||
core when registering with the subsystems.
|
||||
|
||||
When a client requests a sequencer handle, the core will call this callback for
|
||||
every registered provider and let it flexibly figure out whether the proposed
|
||||
client device is indeed its consumer. For example: if the provider binds to the
|
||||
device-tree node representing a power management unit of a chipset and the
|
||||
consumer driver controls one of its modules, the provider driver may parse the
|
||||
relevant regulator supply properties in device tree and see if they lead from
|
||||
the PMU to the consumer.
|
||||
|
||||
API reference
|
||||
=============
|
||||
|
||||
.. kernel-doc:: include/linux/pwrseq/provider.h
|
||||
:internal:
|
||||
|
||||
.. kernel-doc:: drivers/power/sequencing/core.c
|
||||
:export:
|
||||
@@ -38,8 +38,6 @@ register/unregister functions::
|
||||
|
||||
void hwmon_device_unregister(struct device *dev);
|
||||
|
||||
void devm_hwmon_device_unregister(struct device *dev);
|
||||
|
||||
char *hwmon_sanitize_name(const char *name);
|
||||
|
||||
char *devm_hwmon_sanitize_name(struct device *dev, const char *name);
|
||||
@@ -64,11 +62,6 @@ monitoring device structure. This function must be called from the driver
|
||||
remove function if the hardware monitoring device was registered with
|
||||
hwmon_device_register_with_info.
|
||||
|
||||
devm_hwmon_device_unregister does not normally have to be called. It is only
|
||||
needed for error handling, and only needed if the driver probe fails after
|
||||
the call to devm_hwmon_device_register_with_info and if the automatic (device
|
||||
managed) removal would be too late.
|
||||
|
||||
All supported hwmon device registration functions only accept valid device
|
||||
names. Device names including invalid characters (whitespace, '*', or '-')
|
||||
will be rejected. The 'name' parameter is mandatory.
|
||||
|
||||
@@ -99,6 +99,10 @@ Sysfs entries for ina226, ina230 and ina231 only
|
||||
------------------------------------------------
|
||||
|
||||
======================= ====================================================
|
||||
curr1_lcrit Critical low current
|
||||
curr1_crit Critical high current
|
||||
curr1_lcrit_alarm Current critical low alarm
|
||||
curr1_crit_alarm Current critical high alarm
|
||||
in0_lcrit Critical low shunt voltage
|
||||
in0_crit Critical high shunt voltage
|
||||
in0_lcrit_alarm Shunt voltage critical low alarm
|
||||
|
||||
@@ -206,6 +206,7 @@ Hardware Monitoring Kernel Drivers
|
||||
sch5636
|
||||
scpi-hwmon
|
||||
sfctemp
|
||||
sg2042-mcu
|
||||
sht15
|
||||
sht21
|
||||
sht3x
|
||||
|
||||
@@ -3,29 +3,29 @@ Kernel driver lm92
|
||||
|
||||
Supported chips:
|
||||
|
||||
* National Semiconductor LM92
|
||||
* National Semiconductor / Texas Instruments LM92
|
||||
|
||||
Prefix: 'lm92'
|
||||
|
||||
Addresses scanned: I2C 0x48 - 0x4b
|
||||
|
||||
Datasheet: http://www.national.com/pf/LM/LM92.html
|
||||
Datasheet: https://www.ti.com/lit/gpn/LM92
|
||||
|
||||
* National Semiconductor LM76
|
||||
* National Semiconductor / Texas Instruments LM76
|
||||
|
||||
Prefix: 'lm92'
|
||||
|
||||
Addresses scanned: none, force parameter needed
|
||||
Addresses scanned: none, must be instantiated explicitly
|
||||
|
||||
Datasheet: http://www.national.com/pf/LM/LM76.html
|
||||
Datasheet: https://www.ti.com/lit/gpn/LM76
|
||||
|
||||
* Maxim MAX6633/MAX6634/MAX6635
|
||||
* Maxim /Analog Devices MAX6633/MAX6634/MAX6635
|
||||
|
||||
Prefix: 'max6635'
|
||||
|
||||
Addresses scanned: none, force parameter needed
|
||||
Addresses scanned: none, must be instantiated explicitly
|
||||
|
||||
Datasheet: http://www.maxim-ic.com/quick_view2.cfm/qv_pk/3074
|
||||
Datasheet: https://www.analog.com/media/en/technical-documentation/data-sheets/max6633-max6635.pdf
|
||||
|
||||
|
||||
Authors:
|
||||
@@ -36,13 +36,13 @@ Authors:
|
||||
Description
|
||||
-----------
|
||||
|
||||
This driver implements support for the National Semiconductor LM92
|
||||
temperature sensor.
|
||||
This driver implements support for the National Semiconductor / Texas
|
||||
Instruments LM92 temperature sensor.
|
||||
|
||||
Each LM92 temperature sensor supports a single temperature sensor. There are
|
||||
alarms for high, low, and critical thresholds. There's also an hysteresis to
|
||||
control the thresholds for resetting alarms.
|
||||
|
||||
Support was added later for the LM76 and Maxim MAX6633/MAX6634/MAX6635,
|
||||
which are mostly compatible. They have not all been tested, so you
|
||||
may need to use the force parameter.
|
||||
The driver also supports LM76 and Maxim MAX6633/MAX6634/MAX6635, which are
|
||||
mostly compatible but do not have a vendor ID register and therefore must be
|
||||
instantiated explicitly.
|
||||
|
||||
@@ -27,7 +27,3 @@ All temperature values are given in degrees Celsius. Resolution
|
||||
is 1.0 degree for the local temperature and for the remote temperature.
|
||||
|
||||
Only the external sensor has high and low limits.
|
||||
|
||||
The max1619 driver will not update its values more frequently than every
|
||||
other second; reading them more often will do no harm, but will return
|
||||
'old' values.
|
||||
|
||||
@@ -10,41 +10,59 @@ Authors:
|
||||
Description:
|
||||
------------
|
||||
|
||||
Handheld devices from One Netbook and Aya Neo provide fan readings and fan
|
||||
control through their embedded controllers.
|
||||
Handheld devices from OneNetbook, AOKZOE, AYANEO, And OrangePi provide fan
|
||||
readings and fan control through their embedded controllers.
|
||||
|
||||
Currently only supports AMD boards from One X Player, AOK ZOE, and some Aya
|
||||
Neo devices. One X Player Intel boards could be supported if we could figure
|
||||
out the EC registers and values to write to since the EC layout and model is
|
||||
different. Aya Neo devices preceding the AIR may not be supportable as the EC
|
||||
model is different and do not appear to have manual control capabilities.
|
||||
Currently supports OneXPlayer devices, AOKZOE, AYANEO, and OrangePi
|
||||
handheld devices. AYANEO devices preceding the AIR and OneXPlayer devices
|
||||
preceding the Mini A07 are not supportable as the EC model is different
|
||||
and do not have manual control capabilities.
|
||||
|
||||
Some models have a toggle for changing the behaviour of the "Turbo/Silent"
|
||||
button of the device. It will change the key event that it triggers with
|
||||
a flip of the `tt_toggle` attribute. See below for boards that support this
|
||||
function.
|
||||
Some OneXPlayer and AOKZOE models have a toggle for changing the behaviour
|
||||
of the "Turbo/Silent" button of the device. It will change the key event
|
||||
that it triggers with a flip of the `tt_toggle` attribute. See below for
|
||||
boards that support this function.
|
||||
|
||||
Supported devices
|
||||
-----------------
|
||||
|
||||
Currently the driver supports the following handhelds:
|
||||
|
||||
- AOK ZOE A1
|
||||
- AOK ZOE A1 PRO
|
||||
- Aya Neo 2
|
||||
- Aya Neo AIR
|
||||
- Aya Neo AIR Plus (Mendocino)
|
||||
- Aya Neo AIR Pro
|
||||
- Aya Neo Geek
|
||||
- AOKZOE A1
|
||||
- AOKZOE A1 PRO
|
||||
- AYANEO 2
|
||||
- AYANEO 2S
|
||||
- AYANEO AIR
|
||||
- AYANEO AIR 1S
|
||||
- AYANEO AIR Plus (Mendocino)
|
||||
- AYANEO AIR Pro
|
||||
- AYANEO Flip DS
|
||||
- AYANEO Flip KB
|
||||
- AYANEO Geek
|
||||
- AYANEO Geek 1S
|
||||
- AYANEO KUN
|
||||
- OneXPlayer 2
|
||||
- OneXPlayer 2 Pro
|
||||
- OneXPlayer AMD
|
||||
- OneXPlayer mini AMD
|
||||
- OneXPlayer mini AMD PRO
|
||||
- OneXPlayer OneXFly
|
||||
- OneXPlayer X1 A
|
||||
- OneXPlayer X1 i
|
||||
- OneXPlayer X1 mini
|
||||
- OrangePi NEO-01
|
||||
|
||||
"Turbo/Silent" button behaviour toggle is only supported on:
|
||||
- AOK ZOE A1
|
||||
- AOK ZOE A1 PRO
|
||||
- OneXPlayer 2
|
||||
- OneXPlayer 2 Pro
|
||||
- OneXPlayer mini AMD (only with updated alpha BIOS)
|
||||
- OneXPlayer mini AMD PRO
|
||||
- OneXPlayer OneXFly
|
||||
- OneXPlayer X1 A
|
||||
- OneXPlayer X1 i
|
||||
- OneXPlayer X1 mini
|
||||
|
||||
Sysfs entries
|
||||
-------------
|
||||
@@ -52,7 +70,7 @@ Sysfs entries
|
||||
The following attributes are supported:
|
||||
|
||||
fan1_input
|
||||
Read Only. Reads current fan RMP.
|
||||
Read Only. Reads current fan RPM.
|
||||
|
||||
pwm1_enable
|
||||
Read Write. Enable manual fan control. Write "1" to set to manual, write "0"
|
||||
|
||||
@@ -0,0 +1,78 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
Kernel driver sg2042-mcu
|
||||
========================
|
||||
|
||||
Supported chips:
|
||||
|
||||
* Onboard MCU for sg2042
|
||||
|
||||
Addresses scanned: -
|
||||
|
||||
Prefix: 'sg2042-mcu'
|
||||
|
||||
Authors:
|
||||
|
||||
- Inochi Amaoto <inochiama@outlook.com>
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
This driver supprts hardware monitoring for onboard MCU with
|
||||
i2c interface.
|
||||
|
||||
Usage Notes
|
||||
-----------
|
||||
|
||||
This driver does not auto-detect devices. You will have to instantiate
|
||||
the devices explicitly.
|
||||
Please see Documentation/i2c/instantiating-devices.rst for details.
|
||||
|
||||
Sysfs Attributes
|
||||
----------------
|
||||
|
||||
The following table shows the standard entries support by the driver:
|
||||
|
||||
================= =====================================================
|
||||
Name Description
|
||||
================= =====================================================
|
||||
temp1_input Measured temperature of SoC
|
||||
temp1_crit Critical high temperature
|
||||
temp1_crit_hyst hysteresis temperature restore from Critical
|
||||
temp2_input Measured temperature of the base board
|
||||
================= =====================================================
|
||||
|
||||
The following table shows the extra entries support by the driver
|
||||
(the MCU device is in i2c subsystem):
|
||||
|
||||
================= ======= =============================================
|
||||
Name Perm Description
|
||||
================= ======= =============================================
|
||||
reset_count RO Reset count of the SoC
|
||||
uptime RO Seconds after the MCU is powered
|
||||
reset_reason RO Reset reason for the last reset
|
||||
repower_policy RW Execution policy when triggering repower
|
||||
================= ======= =============================================
|
||||
|
||||
``repower_policy``
|
||||
The repower is triggered when the temperature of the SoC falls below
|
||||
the hysteresis temperature after triggering a shutdown due to
|
||||
reaching the critical temperature.
|
||||
The valid values for this entry are "repower" and "keep". "keep" will
|
||||
leave the SoC down when the triggering repower, and "repower" will
|
||||
boot the SoC.
|
||||
|
||||
Debugfs Interfaces
|
||||
------------------
|
||||
|
||||
If debugfs is available, this driver exposes some hardware specific
|
||||
data in ``/sys/kernel/debug/sg2042-mcu/*/``.
|
||||
|
||||
================= ======= =============================================
|
||||
Name Format Description
|
||||
================= ======= =============================================
|
||||
firmware_version 0x%02x firmware version of the MCU
|
||||
pcb_version 0x%02x version number of the base board
|
||||
board_type 0x%02x identifiers for the base board
|
||||
mcu_type %d type of the MCU: 0 is STM32, 1 is GD32
|
||||
================= ======= =============================================
|
||||
@@ -50,7 +50,7 @@ some limitations, see below.
|
||||
3. Consistency model
|
||||
====================
|
||||
|
||||
Functions are there for a reason. They take some input parameters, get or
|
||||
Functions are there for a reason. They take some input parameters, acquire or
|
||||
release locks, read, process, and even write some data in a defined way,
|
||||
have return values. In other words, each function has a defined semantic.
|
||||
|
||||
|
||||
+27
-1
@@ -538,6 +538,17 @@ F: drivers/leds/leds-adp5520.c
|
||||
F: drivers/mfd/adp5520.c
|
||||
F: drivers/video/backlight/adp5520_bl.c
|
||||
|
||||
ADP5585 GPIO EXPANDER, PWM AND KEYPAD CONTROLLER DRIVER
|
||||
M: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
||||
L: linux-gpio@vger.kernel.org
|
||||
L: linux-pwm@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/*/adi,adp5585*.yaml
|
||||
F: drivers/gpio/gpio-adp5585.c
|
||||
F: drivers/mfd/adp5585.c
|
||||
F: drivers/pwm/pwm-adp5585.c
|
||||
F: include/linux/mfd/adp5585.h
|
||||
|
||||
ADP5588 QWERTY KEYPAD AND IO EXPANDER DRIVER (ADP5588/ADP5587)
|
||||
M: Michael Hennerich <michael.hennerich@analog.com>
|
||||
S: Supported
|
||||
@@ -8823,7 +8834,6 @@ F: include/linux/fortify-string.h
|
||||
F: lib/fortify_kunit.c
|
||||
F: lib/memcpy_kunit.c
|
||||
F: lib/test_fortify/*
|
||||
F: scripts/test_fortify.sh
|
||||
K: \b__NO_FORTIFY\b
|
||||
|
||||
FPGA DFL DRIVERS
|
||||
@@ -15292,6 +15302,12 @@ S: Maintained
|
||||
F: Documentation/hwmon/surface_fan.rst
|
||||
F: drivers/hwmon/surface_fan.c
|
||||
|
||||
MICROSOFT SURFACE SENSOR THERMAL DRIVER
|
||||
M: Maximilian Luz <luzmaximilian@gmail.com>
|
||||
L: linux-hwmon@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/hwmon/surface_temp.c
|
||||
|
||||
MICROSOFT SURFACE GPE LID SUPPORT DRIVER
|
||||
M: Maximilian Luz <luzmaximilian@gmail.com>
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
@@ -18327,6 +18343,7 @@ M: Bartosz Golaszewski <brgl@bgdev.pl>
|
||||
L: linux-pm@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux.git
|
||||
F: Documentation/driver-api/pwrseq.rst
|
||||
F: drivers/power/sequencing/
|
||||
F: include/linux/pwrseq/
|
||||
|
||||
@@ -19981,6 +19998,13 @@ T: git git://linuxtv.org/media_tree.git
|
||||
F: Documentation/devicetree/bindings/media/allwinner,sun8i-a83t-de2-rotate.yaml
|
||||
F: drivers/media/platform/sunxi/sun8i-rotate/
|
||||
|
||||
RPMB SUBSYSTEM
|
||||
M: Jens Wiklander <jens.wiklander@linaro.org>
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/misc/rpmb-core.c
|
||||
F: include/linux/rpmb.h
|
||||
|
||||
RPMSG TTY DRIVER
|
||||
M: Arnaud Pouliquen <arnaud.pouliquen@foss.st.com>
|
||||
L: linux-remoteproc@vger.kernel.org
|
||||
@@ -22587,6 +22611,7 @@ M: Jens Wiklander <jens.wiklander@linaro.org>
|
||||
R: Sumit Garg <sumit.garg@linaro.org>
|
||||
L: op-tee@lists.trustedfirmware.org
|
||||
S: Maintained
|
||||
F: Documentation/ABI/testing/sysfs-class-tee
|
||||
F: Documentation/driver-api/tee.rst
|
||||
F: Documentation/tee/
|
||||
F: Documentation/userspace-api/tee.rst
|
||||
@@ -22632,6 +22657,7 @@ M: Thierry Reding <thierry.reding@gmail.com>
|
||||
R: Krishna Reddy <vdumpa@nvidia.com>
|
||||
L: linux-tegra@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/iommu/arm/arm-smmu-v3/tegra241-cmdqv.c
|
||||
F: drivers/iommu/arm/arm-smmu/arm-smmu-nvidia.c
|
||||
F: drivers/iommu/tegra*
|
||||
|
||||
|
||||
@@ -76,8 +76,7 @@ static int vision_lcd_setup(struct platform_device *pdev)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = gpio_request_one(VISION_LCD_ENABLE, GPIOF_INIT_HIGH,
|
||||
dev_name(&pdev->dev));
|
||||
err = gpio_request_one(VISION_LCD_ENABLE, GPIOF_OUT_INIT_HIGH, dev_name(&pdev->dev));
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@@ -293,8 +292,7 @@ static void __init vision_init_machine(void)
|
||||
* Request the gpio expander's interrupt gpio line now to prevent
|
||||
* the kernel from doing a WARN in gpiolib:gpio_ensure_requested().
|
||||
*/
|
||||
if (gpio_request_one(EP93XX_GPIO_LINE_F(7), GPIOF_DIR_IN,
|
||||
"pca9539:74"))
|
||||
if (gpio_request_one(EP93XX_GPIO_LINE_F(7), GPIOF_IN, "pca9539:74"))
|
||||
pr_warn("cannot request interrupt gpio for pca9539:74\n");
|
||||
|
||||
vision_i2c_info[1].irq = gpio_to_irq(EP93XX_GPIO_LINE_F(7));
|
||||
|
||||
@@ -263,6 +263,7 @@ config ARM64
|
||||
select TRACE_IRQFLAGS_NMI_SUPPORT
|
||||
select HAVE_SOFTIRQ_ON_OWN_STACK
|
||||
select USER_STACKTRACE_SUPPORT
|
||||
select VDSO_GETRANDOM
|
||||
help
|
||||
ARM 64-bit (AArch64) Linux support.
|
||||
|
||||
|
||||
@@ -230,7 +230,11 @@ alternative_has_cap_likely(const unsigned long cpucap)
|
||||
return false;
|
||||
|
||||
asm goto(
|
||||
#ifdef BUILD_VDSO
|
||||
ALTERNATIVE("b %l[l_no]", "nop", %[cpucap])
|
||||
#else
|
||||
ALTERNATIVE_CB("b %l[l_no]", %[cpucap], alt_cb_patch_nops)
|
||||
#endif
|
||||
:
|
||||
: [cpucap] "i" (cpucap)
|
||||
:
|
||||
|
||||
@@ -2,9 +2,11 @@
|
||||
#ifndef __ASM_MMAN_H__
|
||||
#define __ASM_MMAN_H__
|
||||
|
||||
#include <uapi/asm/mman.h>
|
||||
|
||||
#ifndef BUILD_VDSO
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/types.h>
|
||||
#include <uapi/asm/mman.h>
|
||||
|
||||
static inline unsigned long arch_calc_vm_prot_bits(unsigned long prot,
|
||||
unsigned long pkey)
|
||||
@@ -68,4 +70,6 @@ static inline bool arch_validate_flags(unsigned long vm_flags)
|
||||
}
|
||||
#define arch_validate_flags(vm_flags) arch_validate_flags(vm_flags)
|
||||
|
||||
#endif /* !BUILD_VDSO */
|
||||
|
||||
#endif /* ! __ASM_MMAN_H__ */
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
|
||||
#ifndef __ASM_VDSO_GETRANDOM_H
|
||||
#define __ASM_VDSO_GETRANDOM_H
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#include <asm/unistd.h>
|
||||
#include <asm/vdso/vsyscall.h>
|
||||
#include <vdso/datapage.h>
|
||||
|
||||
/**
|
||||
* getrandom_syscall - Invoke the getrandom() syscall.
|
||||
* @buffer: Destination buffer to fill with random bytes.
|
||||
* @len: Size of @buffer in bytes.
|
||||
* @flags: Zero or more GRND_* flags.
|
||||
* Returns: The number of random bytes written to @buffer, or a negative value indicating an error.
|
||||
*/
|
||||
static __always_inline ssize_t getrandom_syscall(void *_buffer, size_t _len, unsigned int _flags)
|
||||
{
|
||||
register void *buffer asm ("x0") = _buffer;
|
||||
register size_t len asm ("x1") = _len;
|
||||
register unsigned int flags asm ("x2") = _flags;
|
||||
register long ret asm ("x0");
|
||||
register long nr asm ("x8") = __NR_getrandom;
|
||||
|
||||
asm volatile(
|
||||
" svc #0\n"
|
||||
: "=r" (ret)
|
||||
: "r" (buffer), "r" (len), "r" (flags), "r" (nr)
|
||||
: "memory");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static __always_inline const struct vdso_rng_data *__arch_get_vdso_rng_data(void)
|
||||
{
|
||||
/*
|
||||
* The RNG data is in the real VVAR data page, but if a task belongs to a time namespace
|
||||
* then VVAR_DATA_PAGE_OFFSET points to the namespace-specific VVAR page and VVAR_TIMENS_
|
||||
* PAGE_OFFSET points to the real VVAR page.
|
||||
*/
|
||||
if (IS_ENABLED(CONFIG_TIME_NS) && _vdso_data->clock_mode == VDSO_CLOCKMODE_TIMENS)
|
||||
return (void *)&_vdso_rng_data + VVAR_TIMENS_PAGE_OFFSET * (1UL << CONFIG_PAGE_SHIFT);
|
||||
return &_vdso_rng_data;
|
||||
}
|
||||
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
|
||||
#endif /* __ASM_VDSO_GETRANDOM_H */
|
||||
@@ -2,11 +2,19 @@
|
||||
#ifndef __ASM_VDSO_VSYSCALL_H
|
||||
#define __ASM_VDSO_VSYSCALL_H
|
||||
|
||||
#define __VDSO_RND_DATA_OFFSET 480
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#include <linux/timekeeper_internal.h>
|
||||
#include <vdso/datapage.h>
|
||||
|
||||
enum vvar_pages {
|
||||
VVAR_DATA_PAGE_OFFSET,
|
||||
VVAR_TIMENS_PAGE_OFFSET,
|
||||
VVAR_NR_PAGES,
|
||||
};
|
||||
|
||||
#define VDSO_PRECISION_MASK ~(0xFF00ULL<<48)
|
||||
|
||||
extern struct vdso_data *vdso_data;
|
||||
@@ -21,6 +29,13 @@ struct vdso_data *__arm64_get_k_vdso_data(void)
|
||||
}
|
||||
#define __arch_get_k_vdso_data __arm64_get_k_vdso_data
|
||||
|
||||
static __always_inline
|
||||
struct vdso_rng_data *__arm64_get_k_vdso_rnd_data(void)
|
||||
{
|
||||
return (void *)vdso_data + __VDSO_RND_DATA_OFFSET;
|
||||
}
|
||||
#define __arch_get_k_vdso_rng_data __arm64_get_k_vdso_rnd_data
|
||||
|
||||
static __always_inline
|
||||
void __arm64_update_vsyscall(struct vdso_data *vdata, struct timekeeper *tk)
|
||||
{
|
||||
|
||||
@@ -34,12 +34,6 @@ enum vdso_abi {
|
||||
VDSO_ABI_AA32,
|
||||
};
|
||||
|
||||
enum vvar_pages {
|
||||
VVAR_DATA_PAGE_OFFSET,
|
||||
VVAR_TIMENS_PAGE_OFFSET,
|
||||
VVAR_NR_PAGES,
|
||||
};
|
||||
|
||||
struct vdso_abi_info {
|
||||
const char *name;
|
||||
const char *vdso_code_start;
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
# Include the generic Makefile to check the built vdso.
|
||||
include $(srctree)/lib/vdso/Makefile
|
||||
|
||||
obj-vdso := vgettimeofday.o note.o sigreturn.o
|
||||
obj-vdso := vgettimeofday.o note.o sigreturn.o vgetrandom.o vgetrandom-chacha.o
|
||||
|
||||
# Build rules
|
||||
targets := $(obj-vdso) vdso.so vdso.so.dbg
|
||||
@@ -34,19 +34,28 @@ ccflags-y := -fno-common -fno-builtin -fno-stack-protector -ffixed-x18
|
||||
ccflags-y += -DDISABLE_BRANCH_PROFILING -DBUILD_VDSO
|
||||
|
||||
# -Wmissing-prototypes and -Wmissing-declarations are removed from
|
||||
# the CFLAGS of vgettimeofday.c to make possible to build the
|
||||
# kernel with CONFIG_WERROR enabled.
|
||||
CFLAGS_REMOVE_vgettimeofday.o = $(CC_FLAGS_FTRACE) -Os $(CC_FLAGS_SCS) \
|
||||
$(RANDSTRUCT_CFLAGS) $(GCC_PLUGINS_CFLAGS) \
|
||||
$(CC_FLAGS_LTO) $(CC_FLAGS_CFI) \
|
||||
-Wmissing-prototypes -Wmissing-declarations
|
||||
# the CFLAGS to make possible to build the kernel with CONFIG_WERROR enabled.
|
||||
CC_FLAGS_REMOVE_VDSO := $(CC_FLAGS_FTRACE) -Os $(CC_FLAGS_SCS) \
|
||||
$(RANDSTRUCT_CFLAGS) $(GCC_PLUGINS_CFLAGS) \
|
||||
$(CC_FLAGS_LTO) $(CC_FLAGS_CFI) \
|
||||
-Wmissing-prototypes -Wmissing-declarations
|
||||
|
||||
CFLAGS_vgettimeofday.o = -O2 -mcmodel=tiny -fasynchronous-unwind-tables
|
||||
CC_FLAGS_ADD_VDSO := -O2 -mcmodel=tiny -fasynchronous-unwind-tables
|
||||
|
||||
CFLAGS_REMOVE_vgettimeofday.o = $(CC_FLAGS_REMOVE_VDSO)
|
||||
CFLAGS_REMOVE_vgetrandom.o = $(CC_FLAGS_REMOVE_VDSO)
|
||||
|
||||
CFLAGS_vgettimeofday.o = $(CC_FLAGS_ADD_VDSO)
|
||||
CFLAGS_vgetrandom.o = $(CC_FLAGS_ADD_VDSO)
|
||||
|
||||
ifneq ($(c-gettimeofday-y),)
|
||||
CFLAGS_vgettimeofday.o += -include $(c-gettimeofday-y)
|
||||
endif
|
||||
|
||||
ifneq ($(c-getrandom-y),)
|
||||
CFLAGS_vgetrandom.o += -include $(c-getrandom-y)
|
||||
endif
|
||||
|
||||
targets += vdso.lds
|
||||
CPPFLAGS_vdso.lds += -P -C -U$(ARCH)
|
||||
|
||||
|
||||
@@ -11,7 +11,9 @@
|
||||
#include <linux/const.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/vdso.h>
|
||||
#include <asm/vdso/vsyscall.h>
|
||||
#include <asm-generic/vmlinux.lds.h>
|
||||
#include <vdso/datapage.h>
|
||||
|
||||
OUTPUT_FORMAT("elf64-littleaarch64", "elf64-bigaarch64", "elf64-littleaarch64")
|
||||
OUTPUT_ARCH(aarch64)
|
||||
@@ -19,6 +21,7 @@ OUTPUT_ARCH(aarch64)
|
||||
SECTIONS
|
||||
{
|
||||
PROVIDE(_vdso_data = . - __VVAR_PAGES * PAGE_SIZE);
|
||||
PROVIDE(_vdso_rng_data = _vdso_data + __VDSO_RND_DATA_OFFSET);
|
||||
#ifdef CONFIG_TIME_NS
|
||||
PROVIDE(_timens_data = _vdso_data + PAGE_SIZE);
|
||||
#endif
|
||||
@@ -102,6 +105,7 @@ VERSION
|
||||
__kernel_gettimeofday;
|
||||
__kernel_clock_gettime;
|
||||
__kernel_clock_getres;
|
||||
__kernel_getrandom;
|
||||
local: *;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -0,0 +1,172 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/cache.h>
|
||||
#include <asm/assembler.h>
|
||||
|
||||
.text
|
||||
|
||||
#define state0 v0
|
||||
#define state1 v1
|
||||
#define state2 v2
|
||||
#define state3 v3
|
||||
#define copy0 v4
|
||||
#define copy0_q q4
|
||||
#define copy1 v5
|
||||
#define copy2 v6
|
||||
#define copy3 v7
|
||||
#define copy3_d d7
|
||||
#define one_d d16
|
||||
#define one_q q16
|
||||
#define one_v v16
|
||||
#define tmp v17
|
||||
#define rot8 v18
|
||||
|
||||
/*
|
||||
* ARM64 ChaCha20 implementation meant for vDSO. Produces a given positive
|
||||
* number of blocks of output with nonce 0, taking an input key and 8-bytes
|
||||
* counter. Importantly does not spill to the stack.
|
||||
*
|
||||
* This implementation avoids d8-d15 because they are callee-save in user
|
||||
* space.
|
||||
*
|
||||
* void __arch_chacha20_blocks_nostack(uint8_t *dst_bytes,
|
||||
* const uint8_t *key,
|
||||
* uint32_t *counter,
|
||||
* size_t nblocks)
|
||||
*
|
||||
* x0: output bytes
|
||||
* x1: 32-byte key input
|
||||
* x2: 8-byte counter input/output
|
||||
* x3: number of 64-byte block to write to output
|
||||
*/
|
||||
SYM_FUNC_START(__arch_chacha20_blocks_nostack)
|
||||
|
||||
/* copy0 = "expand 32-byte k" */
|
||||
mov_q x8, 0x3320646e61707865
|
||||
mov_q x9, 0x6b20657479622d32
|
||||
mov copy0.d[0], x8
|
||||
mov copy0.d[1], x9
|
||||
|
||||
/* copy1,copy2 = key */
|
||||
ld1 { copy1.4s, copy2.4s }, [x1]
|
||||
/* copy3 = counter || zero nonce */
|
||||
ld1 { copy3.2s }, [x2]
|
||||
|
||||
movi one_v.2s, #1
|
||||
uzp1 one_v.4s, one_v.4s, one_v.4s
|
||||
|
||||
.Lblock:
|
||||
/* copy state to auxiliary vectors for the final add after the permute. */
|
||||
mov state0.16b, copy0.16b
|
||||
mov state1.16b, copy1.16b
|
||||
mov state2.16b, copy2.16b
|
||||
mov state3.16b, copy3.16b
|
||||
|
||||
mov w4, 20
|
||||
.Lpermute:
|
||||
/*
|
||||
* Permute one 64-byte block where the state matrix is stored in the four NEON
|
||||
* registers state0-state3. It performs matrix operations on four words in parallel,
|
||||
* but requires shuffling to rearrange the words after each round.
|
||||
*/
|
||||
|
||||
.Ldoubleround:
|
||||
/* state0 += state1, state3 = rotl32(state3 ^ state0, 16) */
|
||||
add state0.4s, state0.4s, state1.4s
|
||||
eor state3.16b, state3.16b, state0.16b
|
||||
rev32 state3.8h, state3.8h
|
||||
|
||||
/* state2 += state3, state1 = rotl32(state1 ^ state2, 12) */
|
||||
add state2.4s, state2.4s, state3.4s
|
||||
eor tmp.16b, state1.16b, state2.16b
|
||||
shl state1.4s, tmp.4s, #12
|
||||
sri state1.4s, tmp.4s, #20
|
||||
|
||||
/* state0 += state1, state3 = rotl32(state3 ^ state0, 8) */
|
||||
add state0.4s, state0.4s, state1.4s
|
||||
eor tmp.16b, state3.16b, state0.16b
|
||||
shl state3.4s, tmp.4s, #8
|
||||
sri state3.4s, tmp.4s, #24
|
||||
|
||||
/* state2 += state3, state1 = rotl32(state1 ^ state2, 7) */
|
||||
add state2.4s, state2.4s, state3.4s
|
||||
eor tmp.16b, state1.16b, state2.16b
|
||||
shl state1.4s, tmp.4s, #7
|
||||
sri state1.4s, tmp.4s, #25
|
||||
|
||||
/* state1[0,1,2,3] = state1[1,2,3,0] */
|
||||
ext state1.16b, state1.16b, state1.16b, #4
|
||||
/* state2[0,1,2,3] = state2[2,3,0,1] */
|
||||
ext state2.16b, state2.16b, state2.16b, #8
|
||||
/* state3[0,1,2,3] = state3[1,2,3,0] */
|
||||
ext state3.16b, state3.16b, state3.16b, #12
|
||||
|
||||
/* state0 += state1, state3 = rotl32(state3 ^ state0, 16) */
|
||||
add state0.4s, state0.4s, state1.4s
|
||||
eor state3.16b, state3.16b, state0.16b
|
||||
rev32 state3.8h, state3.8h
|
||||
|
||||
/* state2 += state3, state1 = rotl32(state1 ^ state2, 12) */
|
||||
add state2.4s, state2.4s, state3.4s
|
||||
eor tmp.16b, state1.16b, state2.16b
|
||||
shl state1.4s, tmp.4s, #12
|
||||
sri state1.4s, tmp.4s, #20
|
||||
|
||||
/* state0 += state1, state3 = rotl32(state3 ^ state0, 8) */
|
||||
add state0.4s, state0.4s, state1.4s
|
||||
eor tmp.16b, state3.16b, state0.16b
|
||||
shl state3.4s, tmp.4s, #8
|
||||
sri state3.4s, tmp.4s, #24
|
||||
|
||||
/* state2 += state3, state1 = rotl32(state1 ^ state2, 7) */
|
||||
add state2.4s, state2.4s, state3.4s
|
||||
eor tmp.16b, state1.16b, state2.16b
|
||||
shl state1.4s, tmp.4s, #7
|
||||
sri state1.4s, tmp.4s, #25
|
||||
|
||||
/* state1[0,1,2,3] = state1[3,0,1,2] */
|
||||
ext state1.16b, state1.16b, state1.16b, #12
|
||||
/* state2[0,1,2,3] = state2[2,3,0,1] */
|
||||
ext state2.16b, state2.16b, state2.16b, #8
|
||||
/* state3[0,1,2,3] = state3[1,2,3,0] */
|
||||
ext state3.16b, state3.16b, state3.16b, #4
|
||||
|
||||
subs w4, w4, #2
|
||||
b.ne .Ldoubleround
|
||||
|
||||
/* output0 = state0 + state0 */
|
||||
add state0.4s, state0.4s, copy0.4s
|
||||
/* output1 = state1 + state1 */
|
||||
add state1.4s, state1.4s, copy1.4s
|
||||
/* output2 = state2 + state2 */
|
||||
add state2.4s, state2.4s, copy2.4s
|
||||
/* output2 = state3 + state3 */
|
||||
add state3.4s, state3.4s, copy3.4s
|
||||
st1 { state0.16b - state3.16b }, [x0]
|
||||
|
||||
/*
|
||||
* ++copy3.counter, the 'add' clears the upper half of the SIMD register
|
||||
* which is the expected behaviour here.
|
||||
*/
|
||||
add copy3_d, copy3_d, one_d
|
||||
|
||||
/* output += 64, --nblocks */
|
||||
add x0, x0, 64
|
||||
subs x3, x3, #1
|
||||
b.ne .Lblock
|
||||
|
||||
/* counter = copy3.counter */
|
||||
st1 { copy3.2s }, [x2]
|
||||
|
||||
/* Zero out the potentially sensitive regs, in case nothing uses these again. */
|
||||
movi state0.16b, #0
|
||||
movi state1.16b, #0
|
||||
movi state2.16b, #0
|
||||
movi state3.16b, #0
|
||||
movi copy1.16b, #0
|
||||
movi copy2.16b, #0
|
||||
ret
|
||||
SYM_FUNC_END(__arch_chacha20_blocks_nostack)
|
||||
|
||||
emit_aarch64_feature_1_and
|
||||
@@ -0,0 +1,15 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
#include <uapi/asm-generic/errno.h>
|
||||
|
||||
typeof(__cvdso_getrandom) __kernel_getrandom;
|
||||
|
||||
ssize_t __kernel_getrandom(void *buffer, size_t len, unsigned int flags, void *opaque_state, size_t opaque_len)
|
||||
{
|
||||
if (alternative_has_cap_likely(ARM64_HAS_FPSIMD))
|
||||
return __cvdso_getrandom(buffer, len, flags, opaque_state, opaque_len);
|
||||
|
||||
if (unlikely(opaque_len == ~0UL && !buffer && !len && !flags))
|
||||
return -ENOSYS;
|
||||
return getrandom_syscall(buffer, len, flags);
|
||||
}
|
||||
@@ -191,6 +191,7 @@ config LOONGARCH
|
||||
select TRACE_IRQFLAGS_SUPPORT
|
||||
select USE_PERCPU_NUMA_NODE_ID
|
||||
select USER_STACKTRACE_SUPPORT
|
||||
select VDSO_GETRANDOM
|
||||
select ZONE_DMA32
|
||||
|
||||
config 32BIT
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (C) 2024 Xi Ruoyao <xry111@xry111.site>. All Rights Reserved.
|
||||
*/
|
||||
#ifndef __ASM_VDSO_GETRANDOM_H
|
||||
#define __ASM_VDSO_GETRANDOM_H
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#include <asm/unistd.h>
|
||||
#include <asm/vdso/vdso.h>
|
||||
|
||||
static __always_inline ssize_t getrandom_syscall(void *_buffer, size_t _len, unsigned int _flags)
|
||||
{
|
||||
register long ret asm("a0");
|
||||
register long nr asm("a7") = __NR_getrandom;
|
||||
register void *buffer asm("a0") = _buffer;
|
||||
register size_t len asm("a1") = _len;
|
||||
register unsigned int flags asm("a2") = _flags;
|
||||
|
||||
asm volatile(
|
||||
" syscall 0\n"
|
||||
: "+r" (ret)
|
||||
: "r" (nr), "r" (buffer), "r" (len), "r" (flags)
|
||||
: "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", "$t8",
|
||||
"memory");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static __always_inline const struct vdso_rng_data *__arch_get_vdso_rng_data(void)
|
||||
{
|
||||
return (const struct vdso_rng_data *)(get_vdso_data() + VVAR_LOONGARCH_PAGES_START *
|
||||
PAGE_SIZE + offsetof(struct loongarch_vdso_data, rng_data));
|
||||
}
|
||||
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
|
||||
#endif /* __ASM_VDSO_GETRANDOM_H */
|
||||
@@ -4,6 +4,9 @@
|
||||
* Copyright (C) 2020-2022 Loongson Technology Corporation Limited
|
||||
*/
|
||||
|
||||
#ifndef _ASM_VDSO_VDSO_H
|
||||
#define _ASM_VDSO_VDSO_H
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#include <asm/asm.h>
|
||||
@@ -16,6 +19,7 @@ struct vdso_pcpu_data {
|
||||
|
||||
struct loongarch_vdso_data {
|
||||
struct vdso_pcpu_data pdata[NR_CPUS];
|
||||
struct vdso_rng_data rng_data;
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -63,3 +67,5 @@ static inline unsigned long get_vdso_data(void)
|
||||
}
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#endif
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include <vdso/datapage.h>
|
||||
|
||||
extern struct vdso_data *vdso_data;
|
||||
extern struct vdso_rng_data *vdso_rng_data;
|
||||
|
||||
/*
|
||||
* Update the vDSO data page to keep in sync with kernel timekeeping.
|
||||
@@ -19,6 +20,13 @@ struct vdso_data *__loongarch_get_k_vdso_data(void)
|
||||
}
|
||||
#define __arch_get_k_vdso_data __loongarch_get_k_vdso_data
|
||||
|
||||
static __always_inline
|
||||
struct vdso_rng_data *__loongarch_get_k_vdso_rng_data(void)
|
||||
{
|
||||
return vdso_rng_data;
|
||||
}
|
||||
#define __arch_get_k_vdso_rng_data __loongarch_get_k_vdso_rng_data
|
||||
|
||||
/* The asm-generic header needs to be included after the definitions above */
|
||||
#include <asm-generic/vdso/vsyscall.h>
|
||||
|
||||
|
||||
@@ -37,6 +37,7 @@ static union {
|
||||
static struct page *vdso_pages[] = { NULL };
|
||||
struct vdso_data *vdso_data = generic_vdso_data.data;
|
||||
struct vdso_pcpu_data *vdso_pdata = loongarch_vdso_data.vdata.pdata;
|
||||
struct vdso_rng_data *vdso_rng_data = &loongarch_vdso_data.vdata.rng_data;
|
||||
|
||||
static int vdso_mremap(const struct vm_special_mapping *sm, struct vm_area_struct *new_vma)
|
||||
{
|
||||
|
||||
@@ -4,7 +4,8 @@
|
||||
# Include the generic Makefile to check the built vdso.
|
||||
include $(srctree)/lib/vdso/Makefile
|
||||
|
||||
obj-vdso-y := elf.o vgetcpu.o vgettimeofday.o sigreturn.o
|
||||
obj-vdso-y := elf.o vgetcpu.o vgettimeofday.o vgetrandom.o \
|
||||
vgetrandom-chacha.o sigreturn.o
|
||||
|
||||
# Common compiler flags between ABIs.
|
||||
ccflags-vdso := \
|
||||
@@ -29,6 +30,10 @@ ifneq ($(c-gettimeofday-y),)
|
||||
CFLAGS_vgettimeofday.o += -include $(c-gettimeofday-y)
|
||||
endif
|
||||
|
||||
ifneq ($(c-getrandom-y),)
|
||||
CFLAGS_vgetrandom.o += -include $(c-getrandom-y)
|
||||
endif
|
||||
|
||||
# VDSO linker flags.
|
||||
ldflags-y := -Bsymbolic --no-undefined -soname=linux-vdso.so.1 \
|
||||
$(filter -E%,$(KBUILD_CFLAGS)) -nostdlib -shared \
|
||||
|
||||
@@ -62,6 +62,7 @@ VERSION
|
||||
__vdso_clock_getres;
|
||||
__vdso_clock_gettime;
|
||||
__vdso_gettimeofday;
|
||||
__vdso_getrandom;
|
||||
__vdso_rt_sigreturn;
|
||||
local: *;
|
||||
};
|
||||
|
||||
@@ -0,0 +1,242 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (C) 2024 Xi Ruoyao <xry111@xry111.site>. All Rights Reserved.
|
||||
*/
|
||||
|
||||
#include <asm/asm.h>
|
||||
#include <asm/regdef.h>
|
||||
#include <linux/linkage.h>
|
||||
|
||||
.text
|
||||
|
||||
/* Salsa20 quarter-round */
|
||||
.macro QR a b c d
|
||||
add.w \a, \a, \b
|
||||
xor \d, \d, \a
|
||||
rotri.w \d, \d, 16
|
||||
|
||||
add.w \c, \c, \d
|
||||
xor \b, \b, \c
|
||||
rotri.w \b, \b, 20
|
||||
|
||||
add.w \a, \a, \b
|
||||
xor \d, \d, \a
|
||||
rotri.w \d, \d, 24
|
||||
|
||||
add.w \c, \c, \d
|
||||
xor \b, \b, \c
|
||||
rotri.w \b, \b, 25
|
||||
.endm
|
||||
|
||||
/*
|
||||
* Very basic LoongArch implementation of ChaCha20. Produces a given positive
|
||||
* number of blocks of output with a nonce of 0, taking an input key and
|
||||
* 8-byte counter. Importantly does not spill to the stack. Its arguments
|
||||
* are:
|
||||
*
|
||||
* a0: output bytes
|
||||
* a1: 32-byte key input
|
||||
* a2: 8-byte counter input/output
|
||||
* a3: number of 64-byte blocks to write to output
|
||||
*/
|
||||
SYM_FUNC_START(__arch_chacha20_blocks_nostack)
|
||||
|
||||
/* We don't need a frame pointer */
|
||||
#define s9 fp
|
||||
|
||||
#define output a0
|
||||
#define key a1
|
||||
#define counter a2
|
||||
#define nblocks a3
|
||||
#define i a4
|
||||
#define state0 s0
|
||||
#define state1 s1
|
||||
#define state2 s2
|
||||
#define state3 s3
|
||||
#define state4 s4
|
||||
#define state5 s5
|
||||
#define state6 s6
|
||||
#define state7 s7
|
||||
#define state8 s8
|
||||
#define state9 s9
|
||||
#define state10 a5
|
||||
#define state11 a6
|
||||
#define state12 a7
|
||||
#define state13 t0
|
||||
#define state14 t1
|
||||
#define state15 t2
|
||||
#define cnt_lo t3
|
||||
#define cnt_hi t4
|
||||
#define copy0 t5
|
||||
#define copy1 t6
|
||||
#define copy2 t7
|
||||
|
||||
/* Reuse i as copy3 */
|
||||
#define copy3 i
|
||||
|
||||
/*
|
||||
* The ABI requires s0-s9 saved, and sp aligned to 16-byte.
|
||||
* This does not violate the stack-less requirement: no sensitive data
|
||||
* is spilled onto the stack.
|
||||
*/
|
||||
PTR_ADDI sp, sp, (-SZREG * 10) & STACK_ALIGN
|
||||
REG_S s0, sp, 0
|
||||
REG_S s1, sp, SZREG
|
||||
REG_S s2, sp, SZREG * 2
|
||||
REG_S s3, sp, SZREG * 3
|
||||
REG_S s4, sp, SZREG * 4
|
||||
REG_S s5, sp, SZREG * 5
|
||||
REG_S s6, sp, SZREG * 6
|
||||
REG_S s7, sp, SZREG * 7
|
||||
REG_S s8, sp, SZREG * 8
|
||||
REG_S s9, sp, SZREG * 9
|
||||
|
||||
li.w copy0, 0x61707865
|
||||
li.w copy1, 0x3320646e
|
||||
li.w copy2, 0x79622d32
|
||||
|
||||
ld.w cnt_lo, counter, 0
|
||||
ld.w cnt_hi, counter, 4
|
||||
|
||||
.Lblock:
|
||||
/* state[0,1,2,3] = "expand 32-byte k" */
|
||||
move state0, copy0
|
||||
move state1, copy1
|
||||
move state2, copy2
|
||||
li.w state3, 0x6b206574
|
||||
|
||||
/* state[4,5,..,11] = key */
|
||||
ld.w state4, key, 0
|
||||
ld.w state5, key, 4
|
||||
ld.w state6, key, 8
|
||||
ld.w state7, key, 12
|
||||
ld.w state8, key, 16
|
||||
ld.w state9, key, 20
|
||||
ld.w state10, key, 24
|
||||
ld.w state11, key, 28
|
||||
|
||||
/* state[12,13] = counter */
|
||||
move state12, cnt_lo
|
||||
move state13, cnt_hi
|
||||
|
||||
/* state[14,15] = 0 */
|
||||
move state14, zero
|
||||
move state15, zero
|
||||
|
||||
li.w i, 10
|
||||
.Lpermute:
|
||||
/* odd round */
|
||||
QR state0, state4, state8, state12
|
||||
QR state1, state5, state9, state13
|
||||
QR state2, state6, state10, state14
|
||||
QR state3, state7, state11, state15
|
||||
|
||||
/* even round */
|
||||
QR state0, state5, state10, state15
|
||||
QR state1, state6, state11, state12
|
||||
QR state2, state7, state8, state13
|
||||
QR state3, state4, state9, state14
|
||||
|
||||
addi.w i, i, -1
|
||||
bnez i, .Lpermute
|
||||
|
||||
/*
|
||||
* copy[3] = "expa", materialize it here because copy[3] shares the
|
||||
* same register with i which just became dead.
|
||||
*/
|
||||
li.w copy3, 0x6b206574
|
||||
|
||||
/* output[0,1,2,3] = copy[0,1,2,3] + state[0,1,2,3] */
|
||||
add.w state0, state0, copy0
|
||||
add.w state1, state1, copy1
|
||||
add.w state2, state2, copy2
|
||||
add.w state3, state3, copy3
|
||||
st.w state0, output, 0
|
||||
st.w state1, output, 4
|
||||
st.w state2, output, 8
|
||||
st.w state3, output, 12
|
||||
|
||||
/* from now on state[0,1,2,3] are scratch registers */
|
||||
|
||||
/* state[0,1,2,3] = lo32(key) */
|
||||
ld.w state0, key, 0
|
||||
ld.w state1, key, 4
|
||||
ld.w state2, key, 8
|
||||
ld.w state3, key, 12
|
||||
|
||||
/* output[4,5,6,7] = state[0,1,2,3] + state[4,5,6,7] */
|
||||
add.w state4, state4, state0
|
||||
add.w state5, state5, state1
|
||||
add.w state6, state6, state2
|
||||
add.w state7, state7, state3
|
||||
st.w state4, output, 16
|
||||
st.w state5, output, 20
|
||||
st.w state6, output, 24
|
||||
st.w state7, output, 28
|
||||
|
||||
/* state[0,1,2,3] = hi32(key) */
|
||||
ld.w state0, key, 16
|
||||
ld.w state1, key, 20
|
||||
ld.w state2, key, 24
|
||||
ld.w state3, key, 28
|
||||
|
||||
/* output[8,9,10,11] = state[0,1,2,3] + state[8,9,10,11] */
|
||||
add.w state8, state8, state0
|
||||
add.w state9, state9, state1
|
||||
add.w state10, state10, state2
|
||||
add.w state11, state11, state3
|
||||
st.w state8, output, 32
|
||||
st.w state9, output, 36
|
||||
st.w state10, output, 40
|
||||
st.w state11, output, 44
|
||||
|
||||
/* output[12,13,14,15] = state[12,13,14,15] + [cnt_lo, cnt_hi, 0, 0] */
|
||||
add.w state12, state12, cnt_lo
|
||||
add.w state13, state13, cnt_hi
|
||||
st.w state12, output, 48
|
||||
st.w state13, output, 52
|
||||
st.w state14, output, 56
|
||||
st.w state15, output, 60
|
||||
|
||||
/* ++counter */
|
||||
addi.w cnt_lo, cnt_lo, 1
|
||||
sltui state0, cnt_lo, 1
|
||||
add.w cnt_hi, cnt_hi, state0
|
||||
|
||||
/* output += 64 */
|
||||
PTR_ADDI output, output, 64
|
||||
/* --nblocks */
|
||||
PTR_ADDI nblocks, nblocks, -1
|
||||
bnez nblocks, .Lblock
|
||||
|
||||
/* counter = [cnt_lo, cnt_hi] */
|
||||
st.w cnt_lo, counter, 0
|
||||
st.w cnt_hi, counter, 4
|
||||
|
||||
/*
|
||||
* Zero out the potentially sensitive regs, in case nothing uses these
|
||||
* again. As at now copy[0,1,2,3] just contains "expand 32-byte k" and
|
||||
* state[0,...,9] are s0-s9 those we'll restore in the epilogue, so we
|
||||
* only need to zero state[11,...,15].
|
||||
*/
|
||||
move state10, zero
|
||||
move state11, zero
|
||||
move state12, zero
|
||||
move state13, zero
|
||||
move state14, zero
|
||||
move state15, zero
|
||||
|
||||
REG_L s0, sp, 0
|
||||
REG_L s1, sp, SZREG
|
||||
REG_L s2, sp, SZREG * 2
|
||||
REG_L s3, sp, SZREG * 3
|
||||
REG_L s4, sp, SZREG * 4
|
||||
REG_L s5, sp, SZREG * 5
|
||||
REG_L s6, sp, SZREG * 6
|
||||
REG_L s7, sp, SZREG * 7
|
||||
REG_L s8, sp, SZREG * 8
|
||||
REG_L s9, sp, SZREG * 9
|
||||
PTR_ADDI sp, sp, -((-SZREG * 10) & STACK_ALIGN)
|
||||
|
||||
jr ra
|
||||
SYM_FUNC_END(__arch_chacha20_blocks_nostack)
|
||||
@@ -0,0 +1,10 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (C) 2024 Xi Ruoyao <xry111@xry111.site>. All Rights Reserved.
|
||||
*/
|
||||
#include <linux/types.h>
|
||||
|
||||
ssize_t __vdso_getrandom(void *buffer, size_t len, unsigned int flags, void *opaque_state, size_t opaque_len)
|
||||
{
|
||||
return __cvdso_getrandom(buffer, len, flags, opaque_state, opaque_len);
|
||||
}
|
||||
@@ -42,7 +42,7 @@ static struct board_info __initdata board_cvg834g = {
|
||||
.expected_cpu_id = 0x3368,
|
||||
|
||||
.ephy_reset_gpio = 36,
|
||||
.ephy_reset_gpio_flags = GPIOF_INIT_HIGH,
|
||||
.ephy_reset_gpio_flags = GPIOF_OUT_INIT_HIGH,
|
||||
.has_pci = 1,
|
||||
.has_uart0 = 1,
|
||||
.has_uart1 = 1,
|
||||
|
||||
@@ -311,6 +311,7 @@ config PPC
|
||||
select SYSCTL_EXCEPTION_TRACE
|
||||
select THREAD_INFO_IN_TASK
|
||||
select TRACE_IRQFLAGS_SUPPORT
|
||||
select VDSO_GETRANDOM
|
||||
#
|
||||
# Please keep this list sorted alphabetically.
|
||||
#
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
#include <uapi/asm/mman.h>
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
#if defined(CONFIG_PPC64) && !defined(BUILD_VDSO)
|
||||
|
||||
#include <asm/cputable.h>
|
||||
#include <linux/mm.h>
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright (C) 2024 Christophe Leroy <christophe.leroy@csgroup.eu>, CS GROUP France
|
||||
*/
|
||||
#ifndef _ASM_POWERPC_VDSO_GETRANDOM_H
|
||||
#define _ASM_POWERPC_VDSO_GETRANDOM_H
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
static __always_inline int do_syscall_3(const unsigned long _r0, const unsigned long _r3,
|
||||
const unsigned long _r4, const unsigned long _r5)
|
||||
{
|
||||
register long r0 asm("r0") = _r0;
|
||||
register unsigned long r3 asm("r3") = _r3;
|
||||
register unsigned long r4 asm("r4") = _r4;
|
||||
register unsigned long r5 asm("r5") = _r5;
|
||||
register int ret asm ("r3");
|
||||
|
||||
asm volatile(
|
||||
" sc\n"
|
||||
" bns+ 1f\n"
|
||||
" neg %0, %0\n"
|
||||
"1:\n"
|
||||
: "=r" (ret), "+r" (r4), "+r" (r5), "+r" (r0)
|
||||
: "r" (r3)
|
||||
: "memory", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cr0", "ctr");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* getrandom_syscall - Invoke the getrandom() syscall.
|
||||
* @buffer: Destination buffer to fill with random bytes.
|
||||
* @len: Size of @buffer in bytes.
|
||||
* @flags: Zero or more GRND_* flags.
|
||||
* Returns: The number of bytes written to @buffer, or a negative value indicating an error.
|
||||
*/
|
||||
static __always_inline ssize_t getrandom_syscall(void *buffer, size_t len, unsigned int flags)
|
||||
{
|
||||
return do_syscall_3(__NR_getrandom, (unsigned long)buffer,
|
||||
(unsigned long)len, (unsigned long)flags);
|
||||
}
|
||||
|
||||
static __always_inline struct vdso_rng_data *__arch_get_vdso_rng_data(void)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ssize_t __c_kernel_getrandom(void *buffer, size_t len, unsigned int flags, void *opaque_state,
|
||||
size_t opaque_len, const struct vdso_rng_data *vd);
|
||||
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
|
||||
#endif /* _ASM_POWERPC_VDSO_GETRANDOM_H */
|
||||
@@ -17,6 +17,12 @@ struct vdso_data *__arch_get_k_vdso_data(void)
|
||||
}
|
||||
#define __arch_get_k_vdso_data __arch_get_k_vdso_data
|
||||
|
||||
static __always_inline
|
||||
struct vdso_rng_data *__arch_get_k_vdso_rng_data(void)
|
||||
{
|
||||
return &vdso_data->rng_data;
|
||||
}
|
||||
|
||||
/* The asm-generic header needs to be included after the definitions above */
|
||||
#include <asm-generic/vdso/vsyscall.h>
|
||||
|
||||
|
||||
@@ -83,6 +83,7 @@ struct vdso_arch_data {
|
||||
__u32 compat_syscall_map[SYSCALL_MAP_SIZE]; /* Map of compat syscalls */
|
||||
|
||||
struct vdso_data data[CS_BASES];
|
||||
struct vdso_rng_data rng_data;
|
||||
};
|
||||
|
||||
#else /* CONFIG_PPC64 */
|
||||
@@ -95,6 +96,7 @@ struct vdso_arch_data {
|
||||
__u32 syscall_map[SYSCALL_MAP_SIZE]; /* Map of syscalls */
|
||||
__u32 compat_syscall_map[0]; /* No compat syscalls on PPC32 */
|
||||
struct vdso_data data[CS_BASES];
|
||||
struct vdso_rng_data rng_data;
|
||||
};
|
||||
|
||||
#endif /* CONFIG_PPC64 */
|
||||
@@ -111,6 +113,21 @@ extern struct vdso_arch_data *vdso_data;
|
||||
addi \ptr, \ptr, (_vdso_datapage - 999b)@l
|
||||
.endm
|
||||
|
||||
#include <asm/asm-offsets.h>
|
||||
#include <asm/page.h>
|
||||
|
||||
.macro get_realdatapage ptr scratch
|
||||
get_datapage \ptr
|
||||
#ifdef CONFIG_TIME_NS
|
||||
lwz \scratch, VDSO_CLOCKMODE_OFFSET(\ptr)
|
||||
xoris \scratch, \scratch, VDSO_CLOCKMODE_TIMENS@h
|
||||
xori \scratch, \scratch, VDSO_CLOCKMODE_TIMENS@l
|
||||
cntlzw \scratch, \scratch
|
||||
rlwinm \scratch, \scratch, PAGE_SHIFT - 5, 1 << PAGE_SHIFT
|
||||
add \ptr, \ptr, \scratch
|
||||
#endif
|
||||
.endm
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
@@ -335,6 +335,7 @@ int main(void)
|
||||
|
||||
/* datapage offsets for use by vdso */
|
||||
OFFSET(VDSO_DATA_OFFSET, vdso_arch_data, data);
|
||||
OFFSET(VDSO_RNG_DATA_OFFSET, vdso_arch_data, rng_data);
|
||||
OFFSET(CFG_TB_TICKS_PER_SEC, vdso_arch_data, tb_ticks_per_sec);
|
||||
#ifdef CONFIG_PPC64
|
||||
OFFSET(CFG_ICACHE_BLOCKSZ, vdso_arch_data, icache_block_size);
|
||||
@@ -346,6 +347,8 @@ int main(void)
|
||||
#else
|
||||
OFFSET(CFG_SYSCALL_MAP32, vdso_arch_data, syscall_map);
|
||||
#endif
|
||||
OFFSET(VDSO_CLOCKMODE_OFFSET, vdso_arch_data, data[0].clock_mode);
|
||||
DEFINE(VDSO_CLOCKMODE_TIMENS, VDSO_CLOCKMODE_TIMENS);
|
||||
|
||||
#ifdef CONFIG_BUG
|
||||
DEFINE(BUG_ENTRY_SIZE, sizeof(struct bug_entry));
|
||||
|
||||
@@ -8,30 +8,21 @@ include $(srctree)/lib/vdso/Makefile
|
||||
obj-vdso32 = sigtramp32-32.o gettimeofday-32.o datapage-32.o cacheflush-32.o note-32.o getcpu-32.o
|
||||
obj-vdso64 = sigtramp64-64.o gettimeofday-64.o datapage-64.o cacheflush-64.o note-64.o getcpu-64.o
|
||||
|
||||
obj-vdso32 += getrandom-32.o vgetrandom-chacha-32.o
|
||||
obj-vdso64 += getrandom-64.o vgetrandom-chacha-64.o
|
||||
|
||||
ifneq ($(c-gettimeofday-y),)
|
||||
CFLAGS_vgettimeofday-32.o += -include $(c-gettimeofday-y)
|
||||
CFLAGS_vgettimeofday-32.o += $(DISABLE_LATENT_ENTROPY_PLUGIN)
|
||||
CFLAGS_vgettimeofday-32.o += $(call cc-option, -fno-stack-protector)
|
||||
CFLAGS_vgettimeofday-32.o += -DDISABLE_BRANCH_PROFILING
|
||||
CFLAGS_vgettimeofday-32.o += -ffreestanding -fasynchronous-unwind-tables
|
||||
CFLAGS_REMOVE_vgettimeofday-32.o = $(CC_FLAGS_FTRACE)
|
||||
CFLAGS_REMOVE_vgettimeofday-32.o += -mcmodel=medium -mabi=elfv1 -mabi=elfv2 -mcall-aixdesc
|
||||
# This flag is supported by clang for 64-bit but not 32-bit so it will cause
|
||||
# an unused command line flag warning for this file.
|
||||
ifdef CONFIG_CC_IS_CLANG
|
||||
CFLAGS_REMOVE_vgettimeofday-32.o += -fno-stack-clash-protection
|
||||
endif
|
||||
CFLAGS_vgettimeofday-64.o += -include $(c-gettimeofday-y)
|
||||
CFLAGS_vgettimeofday-64.o += $(DISABLE_LATENT_ENTROPY_PLUGIN)
|
||||
CFLAGS_vgettimeofday-64.o += $(call cc-option, -fno-stack-protector)
|
||||
CFLAGS_vgettimeofday-64.o += -DDISABLE_BRANCH_PROFILING
|
||||
CFLAGS_vgettimeofday-64.o += -ffreestanding -fasynchronous-unwind-tables
|
||||
CFLAGS_REMOVE_vgettimeofday-64.o = $(CC_FLAGS_FTRACE)
|
||||
# Go prior to 1.16.x assumes r30 is not clobbered by any VDSO code. That used to be true
|
||||
# by accident when the VDSO was hand-written asm code, but may not be now that the VDSO is
|
||||
# compiler generated. To avoid breaking Go tell GCC not to use r30. Impact on code
|
||||
# generation is minimal, it will just use r29 instead.
|
||||
CFLAGS_vgettimeofday-64.o += $(call cc-option, -ffixed-r30)
|
||||
CFLAGS_vgettimeofday-64.o += -include $(c-gettimeofday-y) $(call cc-option, -ffixed-r30)
|
||||
endif
|
||||
|
||||
ifneq ($(c-getrandom-y),)
|
||||
CFLAGS_vgetrandom-32.o += -include $(c-getrandom-y)
|
||||
CFLAGS_vgetrandom-64.o += -include $(c-getrandom-y) $(call cc-option, -ffixed-r30)
|
||||
endif
|
||||
|
||||
# Build rules
|
||||
@@ -42,12 +33,18 @@ else
|
||||
VDSOCC := $(CC)
|
||||
endif
|
||||
|
||||
targets := $(obj-vdso32) vdso32.so.dbg vgettimeofday-32.o
|
||||
targets := $(obj-vdso32) vdso32.so.dbg vgettimeofday-32.o vgetrandom-32.o
|
||||
targets += crtsavres-32.o
|
||||
obj-vdso32 := $(addprefix $(obj)/, $(obj-vdso32))
|
||||
targets += $(obj-vdso64) vdso64.so.dbg vgettimeofday-64.o
|
||||
targets += $(obj-vdso64) vdso64.so.dbg vgettimeofday-64.o vgetrandom-64.o
|
||||
obj-vdso64 := $(addprefix $(obj)/, $(obj-vdso64))
|
||||
|
||||
ccflags-y := -fno-common -fno-builtin
|
||||
ccflags-y := -fno-common -fno-builtin -DBUILD_VDSO
|
||||
ccflags-y += $(DISABLE_LATENT_ENTROPY_PLUGIN)
|
||||
ccflags-y += $(call cc-option, -fno-stack-protector)
|
||||
ccflags-y += -DDISABLE_BRANCH_PROFILING
|
||||
ccflags-y += -ffreestanding -fasynchronous-unwind-tables
|
||||
ccflags-remove-y := $(CC_FLAGS_FTRACE)
|
||||
ldflags-y := -Wl,--hash-style=both -nostdlib -shared -z noexecstack $(CLANG_FLAGS)
|
||||
ldflags-$(CONFIG_LD_IS_LLD) += $(call cc-option,--ld-path=$(LD),-fuse-ld=lld)
|
||||
ldflags-$(CONFIG_LD_ORPHAN_WARN) += -Wl,--orphan-handling=$(CONFIG_LD_ORPHAN_WARN_LEVEL)
|
||||
@@ -56,6 +53,12 @@ ldflags-$(CONFIG_LD_ORPHAN_WARN) += -Wl,--orphan-handling=$(CONFIG_LD_ORPHAN_WAR
|
||||
ldflags-y += $(filter-out $(CC_AUTO_VAR_INIT_ZERO_ENABLER) $(CC_FLAGS_FTRACE) -Wa$(comma)%, $(KBUILD_CFLAGS))
|
||||
|
||||
CC32FLAGS := -m32
|
||||
CC32FLAGSREMOVE := -mcmodel=medium -mabi=elfv1 -mabi=elfv2 -mcall-aixdesc
|
||||
# This flag is supported by clang for 64-bit but not 32-bit so it will cause
|
||||
# an unused command line flag warning for this file.
|
||||
ifdef CONFIG_CC_IS_CLANG
|
||||
CC32FLAGSREMOVE += -fno-stack-clash-protection
|
||||
endif
|
||||
LD32FLAGS := -Wl,-soname=linux-vdso32.so.1
|
||||
AS32FLAGS := -D__VDSO32__
|
||||
|
||||
@@ -68,20 +71,26 @@ targets += vdso64.lds
|
||||
CPPFLAGS_vdso64.lds += -P -C
|
||||
|
||||
# link rule for the .so file, .lds has to be first
|
||||
$(obj)/vdso32.so.dbg: $(obj)/vdso32.lds $(obj-vdso32) $(obj)/vgettimeofday-32.o FORCE
|
||||
$(obj)/vdso32.so.dbg: $(obj)/vdso32.lds $(obj-vdso32) $(obj)/vgettimeofday-32.o $(obj)/vgetrandom-32.o $(obj)/crtsavres-32.o FORCE
|
||||
$(call if_changed,vdso32ld_and_check)
|
||||
$(obj)/vdso64.so.dbg: $(obj)/vdso64.lds $(obj-vdso64) $(obj)/vgettimeofday-64.o FORCE
|
||||
$(obj)/vdso64.so.dbg: $(obj)/vdso64.lds $(obj-vdso64) $(obj)/vgettimeofday-64.o $(obj)/vgetrandom-64.o FORCE
|
||||
$(call if_changed,vdso64ld_and_check)
|
||||
|
||||
# assembly rules for the .S files
|
||||
$(obj-vdso32): %-32.o: %.S FORCE
|
||||
$(call if_changed_dep,vdso32as)
|
||||
$(obj)/crtsavres-32.o: %-32.o: $(srctree)/arch/powerpc/lib/crtsavres.S FORCE
|
||||
$(call if_changed_dep,vdso32as)
|
||||
$(obj)/vgettimeofday-32.o: %-32.o: %.c FORCE
|
||||
$(call if_changed_dep,vdso32cc)
|
||||
$(obj)/vgetrandom-32.o: %-32.o: %.c FORCE
|
||||
$(call if_changed_dep,vdso32cc)
|
||||
$(obj-vdso64): %-64.o: %.S FORCE
|
||||
$(call if_changed_dep,vdso64as)
|
||||
$(obj)/vgettimeofday-64.o: %-64.o: %.c FORCE
|
||||
$(call if_changed_dep,cc_o_c)
|
||||
$(obj)/vgetrandom-64.o: %-64.o: %.c FORCE
|
||||
$(call if_changed_dep,cc_o_c)
|
||||
|
||||
# Generate VDSO offsets using helper script
|
||||
gen-vdso32sym := $(src)/gen_vdso32_offsets.sh
|
||||
@@ -102,7 +111,7 @@ quiet_cmd_vdso32ld_and_check = VDSO32L $@
|
||||
quiet_cmd_vdso32as = VDSO32A $@
|
||||
cmd_vdso32as = $(VDSOCC) $(a_flags) $(CC32FLAGS) $(AS32FLAGS) -c -o $@ $<
|
||||
quiet_cmd_vdso32cc = VDSO32C $@
|
||||
cmd_vdso32cc = $(VDSOCC) $(c_flags) $(CC32FLAGS) -c -o $@ $<
|
||||
cmd_vdso32cc = $(VDSOCC) $(filter-out $(CC32FLAGSREMOVE), $(c_flags)) $(CC32FLAGS) -c -o $@ $<
|
||||
|
||||
quiet_cmd_vdso64ld_and_check = VDSO64L $@
|
||||
cmd_vdso64ld_and_check = $(VDSOCC) $(ldflags-y) $(LD64FLAGS) -o $@ -Wl,-T$(filter %.lds,$^) $(filter %.o,$^); $(cmd_vdso_check)
|
||||
|
||||
@@ -30,7 +30,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_COHERENT_ICACHE)
|
||||
#ifdef CONFIG_PPC64
|
||||
mflr r12
|
||||
.cfi_register lr,r12
|
||||
get_datapage r10
|
||||
get_realdatapage r10, r11
|
||||
mtlr r12
|
||||
.cfi_restore lr
|
||||
#endif
|
||||
|
||||
@@ -28,7 +28,7 @@ V_FUNCTION_BEGIN(__kernel_get_syscall_map)
|
||||
mflr r12
|
||||
.cfi_register lr,r12
|
||||
mr. r4,r3
|
||||
get_datapage r3
|
||||
get_realdatapage r3, r11
|
||||
mtlr r12
|
||||
#ifdef __powerpc64__
|
||||
addi r3,r3,CFG_SYSCALL_MAP64
|
||||
@@ -52,7 +52,7 @@ V_FUNCTION_BEGIN(__kernel_get_tbfreq)
|
||||
.cfi_startproc
|
||||
mflr r12
|
||||
.cfi_register lr,r12
|
||||
get_datapage r3
|
||||
get_realdatapage r3, r11
|
||||
#ifndef __powerpc64__
|
||||
lwz r4,(CFG_TB_TICKS_PER_SEC + 4)(r3)
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
/*
|
||||
* Userland implementation of getrandom() for processes
|
||||
* for use in the vDSO
|
||||
*
|
||||
* Copyright (C) 2024 Christophe Leroy <christophe.leroy@csgroup.eu>, CS GROUP France
|
||||
*/
|
||||
#include <asm/processor.h>
|
||||
#include <asm/ppc_asm.h>
|
||||
#include <asm/vdso.h>
|
||||
#include <asm/vdso_datapage.h>
|
||||
#include <asm/asm-offsets.h>
|
||||
#include <asm/unistd.h>
|
||||
|
||||
/*
|
||||
* The macro sets two stack frames, one for the caller and one for the callee
|
||||
* because there are no requirement for the caller to set a stack frame when
|
||||
* calling VDSO so it may have omitted to set one, especially on PPC64
|
||||
*/
|
||||
|
||||
.macro cvdso_call funct
|
||||
.cfi_startproc
|
||||
PPC_STLU r1, -PPC_MIN_STKFRM(r1)
|
||||
.cfi_adjust_cfa_offset PPC_MIN_STKFRM
|
||||
mflr r0
|
||||
PPC_STLU r1, -PPC_MIN_STKFRM(r1)
|
||||
.cfi_adjust_cfa_offset PPC_MIN_STKFRM
|
||||
PPC_STL r0, PPC_MIN_STKFRM + PPC_LR_STKOFF(r1)
|
||||
.cfi_rel_offset lr, PPC_MIN_STKFRM + PPC_LR_STKOFF
|
||||
#ifdef __powerpc64__
|
||||
PPC_STL r2, PPC_MIN_STKFRM + STK_GOT(r1)
|
||||
.cfi_rel_offset r2, PPC_MIN_STKFRM + STK_GOT
|
||||
#endif
|
||||
get_realdatapage r8, r11
|
||||
addi r8, r8, VDSO_RNG_DATA_OFFSET
|
||||
bl CFUNC(DOTSYM(\funct))
|
||||
PPC_LL r0, PPC_MIN_STKFRM + PPC_LR_STKOFF(r1)
|
||||
#ifdef __powerpc64__
|
||||
PPC_LL r2, PPC_MIN_STKFRM + STK_GOT(r1)
|
||||
.cfi_restore r2
|
||||
#endif
|
||||
cmpwi r3, 0
|
||||
mtlr r0
|
||||
addi r1, r1, 2 * PPC_MIN_STKFRM
|
||||
.cfi_restore lr
|
||||
.cfi_def_cfa_offset 0
|
||||
crclr so
|
||||
bgelr+
|
||||
crset so
|
||||
neg r3, r3
|
||||
blr
|
||||
.cfi_endproc
|
||||
.endm
|
||||
|
||||
.text
|
||||
V_FUNCTION_BEGIN(__kernel_getrandom)
|
||||
cvdso_call __c_kernel_getrandom
|
||||
V_FUNCTION_END(__kernel_getrandom)
|
||||
@@ -118,16 +118,3 @@ V_FUNCTION_END(__kernel_clock_getres)
|
||||
V_FUNCTION_BEGIN(__kernel_time)
|
||||
cvdso_call __c_kernel_time call_time=1
|
||||
V_FUNCTION_END(__kernel_time)
|
||||
|
||||
/* Routines for restoring integer registers, called by the compiler. */
|
||||
/* Called with r11 pointing to the stack header word of the caller of the */
|
||||
/* function, just beyond the end of the integer restore area. */
|
||||
#ifndef __powerpc64__
|
||||
_GLOBAL(_restgpr_31_x)
|
||||
_GLOBAL(_rest32gpr_31_x)
|
||||
lwz r0,4(r11)
|
||||
lwz r31,-4(r11)
|
||||
mtlr r0
|
||||
mr r1,r11
|
||||
blr
|
||||
#endif
|
||||
|
||||
@@ -130,6 +130,7 @@ VERSION
|
||||
#if defined(CONFIG_PPC64) || !defined(CONFIG_SMP)
|
||||
__kernel_getcpu;
|
||||
#endif
|
||||
__kernel_getrandom;
|
||||
|
||||
local: *;
|
||||
};
|
||||
|
||||
@@ -123,6 +123,7 @@ VERSION
|
||||
__kernel_sigtramp_rt64;
|
||||
__kernel_getcpu;
|
||||
__kernel_time;
|
||||
__kernel_getrandom;
|
||||
|
||||
local: *;
|
||||
};
|
||||
|
||||
@@ -0,0 +1,365 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright (C) 2024 Christophe Leroy <christophe.leroy@csgroup.eu>, CS GROUP France
|
||||
*/
|
||||
|
||||
#include <linux/linkage.h>
|
||||
|
||||
#include <asm/ppc_asm.h>
|
||||
|
||||
#define dst_bytes r3
|
||||
#define key r4
|
||||
#define counter r5
|
||||
#define nblocks r6
|
||||
|
||||
#define idx_r0 r0
|
||||
#define val4 r4
|
||||
|
||||
#define const0 0x61707865
|
||||
#define const1 0x3320646e
|
||||
#define const2 0x79622d32
|
||||
#define const3 0x6b206574
|
||||
|
||||
#define key0 r5
|
||||
#define key1 r6
|
||||
#define key2 r7
|
||||
#define key3 r8
|
||||
#define key4 r9
|
||||
#define key5 r10
|
||||
#define key6 r11
|
||||
#define key7 r12
|
||||
|
||||
#define counter0 r14
|
||||
#define counter1 r15
|
||||
|
||||
#define state0 r16
|
||||
#define state1 r17
|
||||
#define state2 r18
|
||||
#define state3 r19
|
||||
#define state4 r20
|
||||
#define state5 r21
|
||||
#define state6 r22
|
||||
#define state7 r23
|
||||
#define state8 r24
|
||||
#define state9 r25
|
||||
#define state10 r26
|
||||
#define state11 r27
|
||||
#define state12 r28
|
||||
#define state13 r29
|
||||
#define state14 r30
|
||||
#define state15 r31
|
||||
|
||||
.macro quarterround4 a1 b1 c1 d1 a2 b2 c2 d2 a3 b3 c3 d3 a4 b4 c4 d4
|
||||
add \a1, \a1, \b1
|
||||
add \a2, \a2, \b2
|
||||
add \a3, \a3, \b3
|
||||
add \a4, \a4, \b4
|
||||
xor \d1, \d1, \a1
|
||||
xor \d2, \d2, \a2
|
||||
xor \d3, \d3, \a3
|
||||
xor \d4, \d4, \a4
|
||||
rotlwi \d1, \d1, 16
|
||||
rotlwi \d2, \d2, 16
|
||||
rotlwi \d3, \d3, 16
|
||||
rotlwi \d4, \d4, 16
|
||||
add \c1, \c1, \d1
|
||||
add \c2, \c2, \d2
|
||||
add \c3, \c3, \d3
|
||||
add \c4, \c4, \d4
|
||||
xor \b1, \b1, \c1
|
||||
xor \b2, \b2, \c2
|
||||
xor \b3, \b3, \c3
|
||||
xor \b4, \b4, \c4
|
||||
rotlwi \b1, \b1, 12
|
||||
rotlwi \b2, \b2, 12
|
||||
rotlwi \b3, \b3, 12
|
||||
rotlwi \b4, \b4, 12
|
||||
add \a1, \a1, \b1
|
||||
add \a2, \a2, \b2
|
||||
add \a3, \a3, \b3
|
||||
add \a4, \a4, \b4
|
||||
xor \d1, \d1, \a1
|
||||
xor \d2, \d2, \a2
|
||||
xor \d3, \d3, \a3
|
||||
xor \d4, \d4, \a4
|
||||
rotlwi \d1, \d1, 8
|
||||
rotlwi \d2, \d2, 8
|
||||
rotlwi \d3, \d3, 8
|
||||
rotlwi \d4, \d4, 8
|
||||
add \c1, \c1, \d1
|
||||
add \c2, \c2, \d2
|
||||
add \c3, \c3, \d3
|
||||
add \c4, \c4, \d4
|
||||
xor \b1, \b1, \c1
|
||||
xor \b2, \b2, \c2
|
||||
xor \b3, \b3, \c3
|
||||
xor \b4, \b4, \c4
|
||||
rotlwi \b1, \b1, 7
|
||||
rotlwi \b2, \b2, 7
|
||||
rotlwi \b3, \b3, 7
|
||||
rotlwi \b4, \b4, 7
|
||||
.endm
|
||||
|
||||
#define QUARTERROUND4(a1,b1,c1,d1,a2,b2,c2,d2,a3,b3,c3,d3,a4,b4,c4,d4) \
|
||||
quarterround4 state##a1 state##b1 state##c1 state##d1 \
|
||||
state##a2 state##b2 state##c2 state##d2 \
|
||||
state##a3 state##b3 state##c3 state##d3 \
|
||||
state##a4 state##b4 state##c4 state##d4
|
||||
|
||||
/*
|
||||
* Very basic 32 bits implementation of ChaCha20. Produces a given positive number
|
||||
* of blocks of output with a nonce of 0, taking an input key and 8-byte
|
||||
* counter. Importantly does not spill to the stack. Its arguments are:
|
||||
*
|
||||
* r3: output bytes
|
||||
* r4: 32-byte key input
|
||||
* r5: 8-byte counter input/output (saved on stack)
|
||||
* r6: number of 64-byte blocks to write to output
|
||||
*
|
||||
* r0: counter of blocks (initialised with r6)
|
||||
* r4: Value '4' after key has been read.
|
||||
* r5-r12: key
|
||||
* r14-r15: counter
|
||||
* r16-r31: state
|
||||
*/
|
||||
SYM_FUNC_START(__arch_chacha20_blocks_nostack)
|
||||
#ifdef __powerpc64__
|
||||
std counter, -216(r1)
|
||||
|
||||
std r14, -144(r1)
|
||||
std r15, -136(r1)
|
||||
std r16, -128(r1)
|
||||
std r17, -120(r1)
|
||||
std r18, -112(r1)
|
||||
std r19, -104(r1)
|
||||
std r20, -96(r1)
|
||||
std r21, -88(r1)
|
||||
std r22, -80(r1)
|
||||
std r23, -72(r1)
|
||||
std r24, -64(r1)
|
||||
std r25, -56(r1)
|
||||
std r26, -48(r1)
|
||||
std r27, -40(r1)
|
||||
std r28, -32(r1)
|
||||
std r29, -24(r1)
|
||||
std r30, -16(r1)
|
||||
std r31, -8(r1)
|
||||
#else
|
||||
stwu r1, -96(r1)
|
||||
stw counter, 20(r1)
|
||||
#ifdef __BIG_ENDIAN__
|
||||
stmw r14, 24(r1)
|
||||
#else
|
||||
stw r14, 24(r1)
|
||||
stw r15, 28(r1)
|
||||
stw r16, 32(r1)
|
||||
stw r17, 36(r1)
|
||||
stw r18, 40(r1)
|
||||
stw r19, 44(r1)
|
||||
stw r20, 48(r1)
|
||||
stw r21, 52(r1)
|
||||
stw r22, 56(r1)
|
||||
stw r23, 60(r1)
|
||||
stw r24, 64(r1)
|
||||
stw r25, 68(r1)
|
||||
stw r26, 72(r1)
|
||||
stw r27, 76(r1)
|
||||
stw r28, 80(r1)
|
||||
stw r29, 84(r1)
|
||||
stw r30, 88(r1)
|
||||
stw r31, 92(r1)
|
||||
#endif
|
||||
#endif /* __powerpc64__ */
|
||||
|
||||
lwz counter0, 0(counter)
|
||||
lwz counter1, 4(counter)
|
||||
#ifdef __powerpc64__
|
||||
rldimi counter0, counter1, 32, 0
|
||||
#endif
|
||||
mr idx_r0, nblocks
|
||||
subi dst_bytes, dst_bytes, 4
|
||||
|
||||
lwz key0, 0(key)
|
||||
lwz key1, 4(key)
|
||||
lwz key2, 8(key)
|
||||
lwz key3, 12(key)
|
||||
lwz key4, 16(key)
|
||||
lwz key5, 20(key)
|
||||
lwz key6, 24(key)
|
||||
lwz key7, 28(key)
|
||||
|
||||
li val4, 4
|
||||
.Lblock:
|
||||
li r31, 10
|
||||
|
||||
lis state0, const0@ha
|
||||
lis state1, const1@ha
|
||||
lis state2, const2@ha
|
||||
lis state3, const3@ha
|
||||
addi state0, state0, const0@l
|
||||
addi state1, state1, const1@l
|
||||
addi state2, state2, const2@l
|
||||
addi state3, state3, const3@l
|
||||
|
||||
mtctr r31
|
||||
|
||||
mr state4, key0
|
||||
mr state5, key1
|
||||
mr state6, key2
|
||||
mr state7, key3
|
||||
mr state8, key4
|
||||
mr state9, key5
|
||||
mr state10, key6
|
||||
mr state11, key7
|
||||
|
||||
mr state12, counter0
|
||||
mr state13, counter1
|
||||
|
||||
li state14, 0
|
||||
li state15, 0
|
||||
|
||||
.Lpermute:
|
||||
QUARTERROUND4( 0, 4, 8,12, 1, 5, 9,13, 2, 6,10,14, 3, 7,11,15)
|
||||
QUARTERROUND4( 0, 5,10,15, 1, 6,11,12, 2, 7, 8,13, 3, 4, 9,14)
|
||||
|
||||
bdnz .Lpermute
|
||||
|
||||
addis state0, state0, const0@ha
|
||||
addis state1, state1, const1@ha
|
||||
addis state2, state2, const2@ha
|
||||
addis state3, state3, const3@ha
|
||||
addi state0, state0, const0@l
|
||||
addi state1, state1, const1@l
|
||||
addi state2, state2, const2@l
|
||||
addi state3, state3, const3@l
|
||||
|
||||
add state4, state4, key0
|
||||
add state5, state5, key1
|
||||
add state6, state6, key2
|
||||
add state7, state7, key3
|
||||
add state8, state8, key4
|
||||
add state9, state9, key5
|
||||
add state10, state10, key6
|
||||
add state11, state11, key7
|
||||
|
||||
add state12, state12, counter0
|
||||
add state13, state13, counter1
|
||||
|
||||
#ifdef __BIG_ENDIAN__
|
||||
stwbrx state0, val4, dst_bytes
|
||||
addi dst_bytes, dst_bytes, 8
|
||||
stwbrx state1, 0, dst_bytes
|
||||
stwbrx state2, val4, dst_bytes
|
||||
addi dst_bytes, dst_bytes, 8
|
||||
stwbrx state3, 0, dst_bytes
|
||||
stwbrx state4, val4, dst_bytes
|
||||
addi dst_bytes, dst_bytes, 8
|
||||
stwbrx state5, 0, dst_bytes
|
||||
stwbrx state6, val4, dst_bytes
|
||||
addi dst_bytes, dst_bytes, 8
|
||||
stwbrx state7, 0, dst_bytes
|
||||
stwbrx state8, val4, dst_bytes
|
||||
addi dst_bytes, dst_bytes, 8
|
||||
stwbrx state9, 0, dst_bytes
|
||||
stwbrx state10, val4, dst_bytes
|
||||
addi dst_bytes, dst_bytes, 8
|
||||
stwbrx state11, 0, dst_bytes
|
||||
stwbrx state12, val4, dst_bytes
|
||||
addi dst_bytes, dst_bytes, 8
|
||||
stwbrx state13, 0, dst_bytes
|
||||
stwbrx state14, val4, dst_bytes
|
||||
addi dst_bytes, dst_bytes, 8
|
||||
stwbrx state15, 0, dst_bytes
|
||||
#else
|
||||
stw state0, 4(dst_bytes)
|
||||
stw state1, 8(dst_bytes)
|
||||
stw state2, 12(dst_bytes)
|
||||
stw state3, 16(dst_bytes)
|
||||
stw state4, 20(dst_bytes)
|
||||
stw state5, 24(dst_bytes)
|
||||
stw state6, 28(dst_bytes)
|
||||
stw state7, 32(dst_bytes)
|
||||
stw state8, 36(dst_bytes)
|
||||
stw state9, 40(dst_bytes)
|
||||
stw state10, 44(dst_bytes)
|
||||
stw state11, 48(dst_bytes)
|
||||
stw state12, 52(dst_bytes)
|
||||
stw state13, 56(dst_bytes)
|
||||
stw state14, 60(dst_bytes)
|
||||
stwu state15, 64(dst_bytes)
|
||||
#endif
|
||||
|
||||
subic. idx_r0, idx_r0, 1 /* subi. can't use r0 as source */
|
||||
|
||||
#ifdef __powerpc64__
|
||||
addi counter0, counter0, 1
|
||||
srdi counter1, counter0, 32
|
||||
#else
|
||||
addic counter0, counter0, 1
|
||||
addze counter1, counter1
|
||||
#endif
|
||||
|
||||
bne .Lblock
|
||||
|
||||
#ifdef __powerpc64__
|
||||
ld counter, -216(r1)
|
||||
#else
|
||||
lwz counter, 20(r1)
|
||||
#endif
|
||||
stw counter0, 0(counter)
|
||||
stw counter1, 4(counter)
|
||||
|
||||
li r6, 0
|
||||
li r7, 0
|
||||
li r8, 0
|
||||
li r9, 0
|
||||
li r10, 0
|
||||
li r11, 0
|
||||
li r12, 0
|
||||
|
||||
#ifdef __powerpc64__
|
||||
ld r14, -144(r1)
|
||||
ld r15, -136(r1)
|
||||
ld r16, -128(r1)
|
||||
ld r17, -120(r1)
|
||||
ld r18, -112(r1)
|
||||
ld r19, -104(r1)
|
||||
ld r20, -96(r1)
|
||||
ld r21, -88(r1)
|
||||
ld r22, -80(r1)
|
||||
ld r23, -72(r1)
|
||||
ld r24, -64(r1)
|
||||
ld r25, -56(r1)
|
||||
ld r26, -48(r1)
|
||||
ld r27, -40(r1)
|
||||
ld r28, -32(r1)
|
||||
ld r29, -24(r1)
|
||||
ld r30, -16(r1)
|
||||
ld r31, -8(r1)
|
||||
#else
|
||||
#ifdef __BIG_ENDIAN__
|
||||
lmw r14, 24(r1)
|
||||
#else
|
||||
lwz r14, 24(r1)
|
||||
lwz r15, 28(r1)
|
||||
lwz r16, 32(r1)
|
||||
lwz r17, 36(r1)
|
||||
lwz r18, 40(r1)
|
||||
lwz r19, 44(r1)
|
||||
lwz r20, 48(r1)
|
||||
lwz r21, 52(r1)
|
||||
lwz r22, 56(r1)
|
||||
lwz r23, 60(r1)
|
||||
lwz r24, 64(r1)
|
||||
lwz r25, 68(r1)
|
||||
lwz r26, 72(r1)
|
||||
lwz r27, 76(r1)
|
||||
lwz r28, 80(r1)
|
||||
lwz r29, 84(r1)
|
||||
lwz r30, 88(r1)
|
||||
lwz r31, 92(r1)
|
||||
#endif
|
||||
addi r1, r1, 96
|
||||
#endif /* __powerpc64__ */
|
||||
blr
|
||||
SYM_FUNC_END(__arch_chacha20_blocks_nostack)
|
||||
@@ -0,0 +1,14 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Powerpc userspace implementation of getrandom()
|
||||
*
|
||||
* Copyright (C) 2024 Christophe Leroy <christophe.leroy@csgroup.eu>, CS GROUP France
|
||||
*/
|
||||
#include <linux/time.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
ssize_t __c_kernel_getrandom(void *buffer, size_t len, unsigned int flags, void *opaque_state,
|
||||
size_t opaque_len, const struct vdso_rng_data *vd)
|
||||
{
|
||||
return __cvdso_getrandom_data(vd, buffer, len, flags, opaque_state, opaque_len);
|
||||
}
|
||||
@@ -243,6 +243,7 @@ config S390
|
||||
select TRACE_IRQFLAGS_SUPPORT
|
||||
select TTY
|
||||
select USER_STACKTRACE_SUPPORT
|
||||
select VDSO_GETRANDOM
|
||||
select VIRT_CPU_ACCOUNTING
|
||||
select ZONE_DMA
|
||||
# Note: keep the above list sorted alphabetically
|
||||
|
||||
@@ -39,11 +39,7 @@
|
||||
#define ALT_TYPE_SHIFT 20
|
||||
#define ALT_CTX_SHIFT 28
|
||||
|
||||
#define ALT_FACILITY_EARLY(facility) (ALT_CTX_EARLY << ALT_CTX_SHIFT | \
|
||||
ALT_TYPE_FACILITY << ALT_TYPE_SHIFT | \
|
||||
(facility) << ALT_DATA_SHIFT)
|
||||
|
||||
#define ALT_FACILITY(facility) (ALT_CTX_LATE << ALT_CTX_SHIFT | \
|
||||
#define ALT_FACILITY(facility) (ALT_CTX_EARLY << ALT_CTX_SHIFT | \
|
||||
ALT_TYPE_FACILITY << ALT_TYPE_SHIFT | \
|
||||
(facility) << ALT_DATA_SHIFT)
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
#include <linux/string.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/preempt.h>
|
||||
|
||||
#include <asm/alternative.h>
|
||||
#include <asm/lowcore.h>
|
||||
|
||||
#define MAX_FACILITY_BIT (sizeof(stfle_fac_list) * 8)
|
||||
@@ -39,28 +39,51 @@ static inline void __clear_facility(unsigned long nr, void *facilities)
|
||||
ptr[nr >> 3] &= ~(0x80 >> (nr & 7));
|
||||
}
|
||||
|
||||
static inline int __test_facility(unsigned long nr, void *facilities)
|
||||
static __always_inline bool __test_facility(unsigned long nr, void *facilities)
|
||||
{
|
||||
unsigned char *ptr;
|
||||
|
||||
if (nr >= MAX_FACILITY_BIT)
|
||||
return 0;
|
||||
return false;
|
||||
ptr = (unsigned char *) facilities + (nr >> 3);
|
||||
return (*ptr & (0x80 >> (nr & 7))) != 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* __test_facility_constant() generates a single instruction branch. If the
|
||||
* tested facility is available (likely) the branch is patched into a nop.
|
||||
*
|
||||
* Do not use this function unless you know what you are doing. All users are
|
||||
* supposed to use test_facility() which will do the right thing.
|
||||
*/
|
||||
static __always_inline bool __test_facility_constant(unsigned long nr)
|
||||
{
|
||||
asm goto(
|
||||
ALTERNATIVE("brcl 15,%l[l_no]", "brcl 0,0", ALT_FACILITY(%[nr]))
|
||||
:
|
||||
: [nr] "i" (nr)
|
||||
:
|
||||
: l_no);
|
||||
return true;
|
||||
l_no:
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* The test_facility function uses the bit ordering where the MSB is bit 0.
|
||||
* That makes it easier to query facility bits with the bit number as
|
||||
* documented in the Principles of Operation.
|
||||
*/
|
||||
static inline int test_facility(unsigned long nr)
|
||||
static __always_inline bool test_facility(unsigned long nr)
|
||||
{
|
||||
unsigned long facilities_als[] = { FACILITIES_ALS };
|
||||
|
||||
if (__builtin_constant_p(nr) && nr < sizeof(facilities_als) * 8) {
|
||||
if (__test_facility(nr, &facilities_als))
|
||||
return 1;
|
||||
if (!__is_defined(__DECOMPRESSOR) && __builtin_constant_p(nr)) {
|
||||
if (nr < sizeof(facilities_als) * 8) {
|
||||
if (__test_facility(nr, &facilities_als))
|
||||
return true;
|
||||
}
|
||||
return __test_facility_constant(nr);
|
||||
}
|
||||
return __test_facility(nr, &stfle_fac_list);
|
||||
}
|
||||
|
||||
@@ -407,6 +407,28 @@
|
||||
MRXBOPC 0, 0x0E, v1
|
||||
.endm
|
||||
|
||||
/* VECTOR STORE BYTE REVERSED ELEMENTS */
|
||||
.macro VSTBR vr1, disp, index="%r0", base, m
|
||||
VX_NUM v1, \vr1
|
||||
GR_NUM x2, \index
|
||||
GR_NUM b2, \base
|
||||
.word 0xE600 | ((v1&15) << 4) | (x2&15)
|
||||
.word (b2 << 12) | (\disp)
|
||||
MRXBOPC \m, 0x0E, v1
|
||||
.endm
|
||||
.macro VSTBRH vr1, disp, index="%r0", base
|
||||
VSTBR \vr1, \disp, \index, \base, 1
|
||||
.endm
|
||||
.macro VSTBRF vr1, disp, index="%r0", base
|
||||
VSTBR \vr1, \disp, \index, \base, 2
|
||||
.endm
|
||||
.macro VSTBRG vr1, disp, index="%r0", base
|
||||
VSTBR \vr1, \disp, \index, \base, 3
|
||||
.endm
|
||||
.macro VSTBRQ vr1, disp, index="%r0", base
|
||||
VSTBR \vr1, \disp, \index, \base, 4
|
||||
.endm
|
||||
|
||||
/* VECTOR STORE MULTIPLE */
|
||||
.macro VSTM vfrom, vto, disp, base, hint=3
|
||||
VX_NUM v1, \vfrom
|
||||
|
||||
@@ -38,4 +38,18 @@ struct mod_arch_specific {
|
||||
#endif /* CONFIG_FUNCTION_TRACER */
|
||||
};
|
||||
|
||||
static inline const Elf_Shdr *find_section(const Elf_Ehdr *hdr,
|
||||
const Elf_Shdr *sechdrs,
|
||||
const char *name)
|
||||
{
|
||||
const char *secstrs = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset;
|
||||
const Elf_Shdr *s, *se;
|
||||
|
||||
for (s = sechdrs, se = sechdrs + hdr->e_shnum; s < se; s++) {
|
||||
if (strcmp(name, secstrs + s->sh_name) == 0)
|
||||
return s;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#endif /* _ASM_S390_MODULE_H */
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef __S390_VDSO_SYMBOLS_H__
|
||||
#define __S390_VDSO_SYMBOLS_H__
|
||||
|
||||
#include <generated/vdso64-offsets.h>
|
||||
#ifdef CONFIG_COMPAT
|
||||
#include <generated/vdso32-offsets.h>
|
||||
#endif
|
||||
|
||||
#define VDSO64_SYMBOL(tsk, name) ((tsk)->mm->context.vdso_base + (vdso64_offset_##name))
|
||||
#ifdef CONFIG_COMPAT
|
||||
#define VDSO32_SYMBOL(tsk, name) ((tsk)->mm->context.vdso_base + (vdso32_offset_##name))
|
||||
#else
|
||||
#define VDSO32_SYMBOL(tsk, name) (-1UL)
|
||||
#endif
|
||||
|
||||
#endif /* __S390_VDSO_SYMBOLS_H__ */
|
||||
@@ -6,18 +6,6 @@
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#include <generated/vdso64-offsets.h>
|
||||
#ifdef CONFIG_COMPAT
|
||||
#include <generated/vdso32-offsets.h>
|
||||
#endif
|
||||
|
||||
#define VDSO64_SYMBOL(tsk, name) ((tsk)->mm->context.vdso_base + (vdso64_offset_##name))
|
||||
#ifdef CONFIG_COMPAT
|
||||
#define VDSO32_SYMBOL(tsk, name) ((tsk)->mm->context.vdso_base + (vdso32_offset_##name))
|
||||
#else
|
||||
#define VDSO32_SYMBOL(tsk, name) (-1UL)
|
||||
#endif
|
||||
|
||||
extern struct vdso_data *vdso_data;
|
||||
|
||||
int vdso_getcpu_init(void);
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
|
||||
#ifndef __ASM_VDSO_GETRANDOM_H
|
||||
#define __ASM_VDSO_GETRANDOM_H
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#include <vdso/datapage.h>
|
||||
#include <asm/vdso/vsyscall.h>
|
||||
#include <asm/syscall.h>
|
||||
#include <asm/unistd.h>
|
||||
#include <asm/page.h>
|
||||
|
||||
/**
|
||||
* getrandom_syscall - Invoke the getrandom() syscall.
|
||||
* @buffer: Destination buffer to fill with random bytes.
|
||||
* @len: Size of @buffer in bytes.
|
||||
* @flags: Zero or more GRND_* flags.
|
||||
* Returns: The number of random bytes written to @buffer, or a negative value indicating an error.
|
||||
*/
|
||||
static __always_inline ssize_t getrandom_syscall(void *buffer, size_t len, unsigned int flags)
|
||||
{
|
||||
return syscall3(__NR_getrandom, (long)buffer, (long)len, (long)flags);
|
||||
}
|
||||
|
||||
static __always_inline const struct vdso_rng_data *__arch_get_vdso_rng_data(void)
|
||||
{
|
||||
/*
|
||||
* The RNG data is in the real VVAR data page, but if a task belongs to a time namespace
|
||||
* then VVAR_DATA_PAGE_OFFSET points to the namespace-specific VVAR page and VVAR_TIMENS_
|
||||
* PAGE_OFFSET points to the real VVAR page.
|
||||
*/
|
||||
if (IS_ENABLED(CONFIG_TIME_NS) && _vdso_data->clock_mode == VDSO_CLOCKMODE_TIMENS)
|
||||
return (void *)&_vdso_rng_data + VVAR_TIMENS_PAGE_OFFSET * PAGE_SIZE;
|
||||
return &_vdso_rng_data;
|
||||
}
|
||||
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
|
||||
#endif /* __ASM_VDSO_GETRANDOM_H */
|
||||
@@ -2,12 +2,21 @@
|
||||
#ifndef __ASM_VDSO_VSYSCALL_H
|
||||
#define __ASM_VDSO_VSYSCALL_H
|
||||
|
||||
#define __VDSO_RND_DATA_OFFSET 768
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#include <linux/hrtimer.h>
|
||||
#include <linux/timekeeper_internal.h>
|
||||
#include <vdso/datapage.h>
|
||||
#include <asm/vdso.h>
|
||||
|
||||
enum vvar_pages {
|
||||
VVAR_DATA_PAGE_OFFSET,
|
||||
VVAR_TIMENS_PAGE_OFFSET,
|
||||
VVAR_NR_PAGES
|
||||
};
|
||||
|
||||
/*
|
||||
* Update the vDSO data page to keep in sync with kernel timekeeping.
|
||||
*/
|
||||
@@ -18,6 +27,12 @@ static __always_inline struct vdso_data *__s390_get_k_vdso_data(void)
|
||||
}
|
||||
#define __arch_get_k_vdso_data __s390_get_k_vdso_data
|
||||
|
||||
static __always_inline struct vdso_rng_data *__s390_get_k_vdso_rnd_data(void)
|
||||
{
|
||||
return (void *)vdso_data + __VDSO_RND_DATA_OFFSET;
|
||||
}
|
||||
#define __arch_get_k_vdso_rng_data __s390_get_k_vdso_rnd_data
|
||||
|
||||
/* The asm-generic header needs to be included after the definitions above */
|
||||
#include <asm-generic/vdso/vsyscall.h>
|
||||
|
||||
|
||||
@@ -24,11 +24,11 @@
|
||||
#include <linux/tty.h>
|
||||
#include <linux/personality.h>
|
||||
#include <linux/binfmts.h>
|
||||
#include <asm/vdso-symbols.h>
|
||||
#include <asm/access-regs.h>
|
||||
#include <asm/ucontext.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <asm/lowcore.h>
|
||||
#include <asm/vdso.h>
|
||||
#include <asm/fpu.h>
|
||||
#include "compat_linux.h"
|
||||
#include "compat_ptrace.h"
|
||||
|
||||
@@ -42,7 +42,7 @@ _LPP_OFFSET = __LC_LPP
|
||||
|
||||
.macro LPSWEY address, lpswe
|
||||
ALTERNATIVE_2 "b \lpswe;nopr", \
|
||||
".insn siy,0xeb0000000071,\address,0", ALT_FACILITY_EARLY(193), \
|
||||
".insn siy,0xeb0000000071,\address,0", ALT_FACILITY(193), \
|
||||
__stringify(.insn siy,0xeb0000000071,LOWCORE_ALT_ADDRESS+\address,0), \
|
||||
ALT_LOWCORE
|
||||
.endm
|
||||
|
||||
@@ -30,9 +30,9 @@
|
||||
#include <linux/compat.h>
|
||||
#include <asm/ucontext.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <asm/vdso-symbols.h>
|
||||
#include <asm/access-regs.h>
|
||||
#include <asm/lowcore.h>
|
||||
#include <asm/vdso.h>
|
||||
#include "entry.h"
|
||||
|
||||
/*
|
||||
|
||||
+20
-6
@@ -12,12 +12,15 @@
|
||||
#include <linux/errno.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/time_namespace.h>
|
||||
#include <linux/random.h>
|
||||
#include <vdso/datapage.h>
|
||||
#include <asm/vdso/vsyscall.h>
|
||||
#include <asm/alternative.h>
|
||||
#include <asm/vdso.h>
|
||||
|
||||
extern char vdso64_start[], vdso64_end[];
|
||||
@@ -29,12 +32,6 @@ static union vdso_data_store vdso_data_store __page_aligned_data;
|
||||
|
||||
struct vdso_data *vdso_data = vdso_data_store.data;
|
||||
|
||||
enum vvar_pages {
|
||||
VVAR_DATA_PAGE_OFFSET,
|
||||
VVAR_TIMENS_PAGE_OFFSET,
|
||||
VVAR_NR_PAGES,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_TIME_NS
|
||||
struct vdso_data *arch_get_vdso_data(void *vvar_page)
|
||||
{
|
||||
@@ -250,8 +247,25 @@ static struct page ** __init vdso_setup_pages(void *start, void *end)
|
||||
return pagelist;
|
||||
}
|
||||
|
||||
static void vdso_apply_alternatives(void)
|
||||
{
|
||||
const struct elf64_shdr *alt, *shdr;
|
||||
struct alt_instr *start, *end;
|
||||
const struct elf64_hdr *hdr;
|
||||
|
||||
hdr = (struct elf64_hdr *)vdso64_start;
|
||||
shdr = (void *)hdr + hdr->e_shoff;
|
||||
alt = find_section(hdr, shdr, ".altinstructions");
|
||||
if (!alt)
|
||||
return;
|
||||
start = (void *)hdr + alt->sh_offset;
|
||||
end = (void *)hdr + alt->sh_offset + alt->sh_size;
|
||||
apply_alternatives(start, end);
|
||||
}
|
||||
|
||||
static int __init vdso_init(void)
|
||||
{
|
||||
vdso_apply_alternatives();
|
||||
vdso64_mapping.pages = vdso_setup_pages(vdso64_start, vdso64_end);
|
||||
if (IS_ENABLED(CONFIG_COMPAT))
|
||||
vdso32_mapping.pages = vdso_setup_pages(vdso32_start, vdso32_end);
|
||||
|
||||
@@ -3,12 +3,17 @@
|
||||
|
||||
# Include the generic Makefile to check the built vdso.
|
||||
include $(srctree)/lib/vdso/Makefile
|
||||
obj-vdso64 = vdso_user_wrapper.o note.o
|
||||
obj-cvdso64 = vdso64_generic.o getcpu.o
|
||||
obj-vdso64 = vdso_user_wrapper.o note.o vgetrandom-chacha.o
|
||||
obj-cvdso64 = vdso64_generic.o getcpu.o vgetrandom.o
|
||||
VDSO_CFLAGS_REMOVE := -pg $(CC_FLAGS_FTRACE) $(CC_FLAGS_EXPOLINE) $(CC_FLAGS_CHECK_STACK)
|
||||
CFLAGS_REMOVE_getcpu.o = $(VDSO_CFLAGS_REMOVE)
|
||||
CFLAGS_REMOVE_vgetrandom.o = $(VDSO_CFLAGS_REMOVE)
|
||||
CFLAGS_REMOVE_vdso64_generic.o = $(VDSO_CFLAGS_REMOVE)
|
||||
|
||||
ifneq ($(c-getrandom-y),)
|
||||
CFLAGS_vgetrandom.o += -include $(c-getrandom-y)
|
||||
endif
|
||||
|
||||
# Build rules
|
||||
|
||||
targets := $(obj-vdso64) $(obj-cvdso64) vdso64.so vdso64.so.dbg
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user