Merge 9c2b840a3b ("Merge tag 'x86-urgent-2022-12-12' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip") into android-mainline
Steps on the way to 6.2-rc1 Change-Id: I71eec06393152983a1ca0ab3f8815c1a5fc81b84 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -0,0 +1,21 @@
|
||||
What: /sys/kernel/debug/dell-wmi-ddv-<wmi_device_name>/fan_sensor_information
|
||||
Date: September 2022
|
||||
KernelVersion: 6.1
|
||||
Contact: Armin Wolf <W_Armin@gmx.de>
|
||||
Description:
|
||||
This file contains the contents of the fan sensor information buffer,
|
||||
which contains fan sensor entries and a terminating character (0xFF).
|
||||
|
||||
Each fan sensor entry consists of three bytes with an unknown meaning,
|
||||
interested people may use this file for reverse-engineering.
|
||||
|
||||
What: /sys/kernel/debug/dell-wmi-ddv-<wmi_device_name>/thermal_sensor_information
|
||||
Date: September 2022
|
||||
KernelVersion: 6.1
|
||||
Contact: Armin Wolf <W_Armin@gmx.de>
|
||||
Description:
|
||||
This file contains the contents of the thermal sensor information buffer,
|
||||
which contains thermal sensor entries and a terminating character (0xFF).
|
||||
|
||||
Each thermal sensor entry consists of five bytes with an unknown meaning,
|
||||
interested people may use this file for reverse-engineering.
|
||||
@@ -4,21 +4,21 @@ KernelVersion: 5.18
|
||||
Contact: "David E. Box" <david.e.box@linux.intel.com>
|
||||
Description:
|
||||
This directory contains interface files for accessing Intel
|
||||
Software Defined Silicon (SDSi) features on a CPU. X
|
||||
represents the socket instance (though not the socket ID).
|
||||
The socket ID is determined by reading the registers file
|
||||
and decoding it per the specification.
|
||||
On Demand (formerly Software Defined Silicon or SDSi) features
|
||||
on a CPU. X represents the socket instance (though not the
|
||||
socket ID). The socket ID is determined by reading the
|
||||
registers file and decoding it per the specification.
|
||||
|
||||
Some files communicate with SDSi hardware through a mailbox.
|
||||
Should the operation fail, one of the following error codes
|
||||
may be returned:
|
||||
Some files communicate with On Demand hardware through a
|
||||
mailbox. Should the operation fail, one of the following error
|
||||
codes may be returned:
|
||||
|
||||
========== =====
|
||||
Error Code Cause
|
||||
========== =====
|
||||
EIO General mailbox failure. Log may indicate cause.
|
||||
EBUSY Mailbox is owned by another agent.
|
||||
EPERM SDSI capability is not enabled in hardware.
|
||||
EPERM On Demand capability is not enabled in hardware.
|
||||
EPROTO Failure in mailbox protocol detected by driver.
|
||||
See log for details.
|
||||
EOVERFLOW For provision commands, the size of the data
|
||||
@@ -54,8 +54,8 @@ KernelVersion: 5.18
|
||||
Contact: "David E. Box" <david.e.box@linux.intel.com>
|
||||
Description:
|
||||
(WO) Used to write an Authentication Key Certificate (AKC) to
|
||||
the SDSi NVRAM for the CPU. The AKC is used to authenticate a
|
||||
Capability Activation Payload. Mailbox command.
|
||||
the On Demand NVRAM for the CPU. The AKC is used to authenticate
|
||||
a Capability Activation Payload. Mailbox command.
|
||||
|
||||
What: /sys/bus/auxiliary/devices/intel_vsec.sdsi.X/provision_cap
|
||||
Date: Feb 2022
|
||||
@@ -63,17 +63,28 @@ KernelVersion: 5.18
|
||||
Contact: "David E. Box" <david.e.box@linux.intel.com>
|
||||
Description:
|
||||
(WO) Used to write a Capability Activation Payload (CAP) to the
|
||||
SDSi NVRAM for the CPU. CAPs are used to activate a given CPU
|
||||
feature. A CAP is validated by SDSi hardware using a previously
|
||||
provisioned AKC file. Upon successful authentication, the CPU
|
||||
configuration is updated. A cold reboot is required to fully
|
||||
activate the feature. Mailbox command.
|
||||
On Demand NVRAM for the CPU. CAPs are used to activate a given
|
||||
CPU feature. A CAP is validated by On Demand hardware using a
|
||||
previously provisioned AKC file. Upon successful authentication,
|
||||
the CPU configuration is updated. A cold reboot is required to
|
||||
fully activate the feature. Mailbox command.
|
||||
|
||||
What: /sys/bus/auxiliary/devices/intel_vsec.sdsi.X/meter_certificate
|
||||
Date: Nov 2022
|
||||
KernelVersion: 6.2
|
||||
Contact: "David E. Box" <david.e.box@linux.intel.com>
|
||||
Description:
|
||||
(RO) Used to read back the current meter certificate for the CPU
|
||||
from Intel On Demand hardware. The meter certificate contains
|
||||
utilization metrics of On Demand enabled features. Mailbox
|
||||
command.
|
||||
|
||||
What: /sys/bus/auxiliary/devices/intel_vsec.sdsi.X/state_certificate
|
||||
Date: Feb 2022
|
||||
KernelVersion: 5.18
|
||||
Contact: "David E. Box" <david.e.box@linux.intel.com>
|
||||
Description:
|
||||
(RO) Used to read back the current State Certificate for the CPU
|
||||
from SDSi hardware. The State Certificate contains information
|
||||
about the current licenses on the CPU. Mailbox command.
|
||||
(RO) Used to read back the current state certificate for the CPU
|
||||
from On Demand hardware. The state certificate contains
|
||||
information about the current licenses on the CPU. Mailbox
|
||||
command.
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
What: /sys/class/power_supply/<battery_name>/eppid
|
||||
Date: September 2022
|
||||
KernelVersion: 6.1
|
||||
Contact: Armin Wolf <W_Armin@gmx.de>
|
||||
Description:
|
||||
Reports the Dell ePPID (electronic Dell Piece Part Identification)
|
||||
of the ACPI battery.
|
||||
@@ -703,6 +703,17 @@
|
||||
condev= [HW,S390] console device
|
||||
conmode=
|
||||
|
||||
con3215_drop= [S390] 3215 console drop mode.
|
||||
Format: y|n|Y|N|1|0
|
||||
When set to true, drop data on the 3215 console when
|
||||
the console buffer is full. In this case the
|
||||
operator using a 3270 terminal emulator (for example
|
||||
x3270) does not have to enter the clear key for the
|
||||
console output to advance and the kernel to continue.
|
||||
This leads to a much faster boot time when a 3270
|
||||
terminal emulator is active. If no 3270 terminal
|
||||
emulator is used, this parameter has no effect.
|
||||
|
||||
console= [KNL] Output console device and options.
|
||||
|
||||
tty<n> Use the virtual console device <n>.
|
||||
|
||||
@@ -48,6 +48,7 @@ examples:
|
||||
cros_ec: ec@0 {
|
||||
compatible = "google,cros-ec-spi";
|
||||
reg = <0>;
|
||||
interrupts = <35 0>;
|
||||
|
||||
typec {
|
||||
compatible = "google,cros-ec-typec";
|
||||
|
||||
@@ -27,6 +27,7 @@ examples:
|
||||
cros_ec: ec@0 {
|
||||
compatible = "google,cros-ec-spi";
|
||||
reg = <0>;
|
||||
interrupts = <15 0>;
|
||||
|
||||
kbd-led-backlight {
|
||||
compatible = "google,cros-kbd-led-backlight";
|
||||
|
||||
@@ -40,6 +40,7 @@ examples:
|
||||
cros-ec@0 {
|
||||
compatible = "google,cros-ec-spi";
|
||||
reg = <0>;
|
||||
interrupts = <44 0>;
|
||||
|
||||
usbc_extcon0: extcon0 {
|
||||
compatible = "google,extcon-usbc-cros-ec";
|
||||
|
||||
@@ -47,6 +47,7 @@ examples:
|
||||
compatible = "google,cros-ec-spi";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <5000000>;
|
||||
interrupts = <99 0>;
|
||||
|
||||
i2c-tunnel {
|
||||
compatible = "google,cros-ec-i2c-tunnel";
|
||||
|
||||
@@ -20,19 +20,21 @@ properties:
|
||||
compatible:
|
||||
oneOf:
|
||||
- description:
|
||||
For implementations of the EC is connected through I2C.
|
||||
For implementations of the EC connected through I2C.
|
||||
const: google,cros-ec-i2c
|
||||
- description:
|
||||
For implementations of the EC is connected through SPI.
|
||||
For implementations of the EC connected through SPI.
|
||||
const: google,cros-ec-spi
|
||||
- description:
|
||||
For implementations of the EC is connected through RPMSG.
|
||||
For implementations of the FPMCU connected through SPI.
|
||||
items:
|
||||
- const: google,cros-ec-fp
|
||||
- const: google,cros-ec-spi
|
||||
- description:
|
||||
For implementations of the EC connected through RPMSG.
|
||||
const: google,cros-ec-rpmsg
|
||||
|
||||
controller-data:
|
||||
description:
|
||||
SPI controller data, see bindings/spi/samsung,spi-peripheral-props.yaml
|
||||
type: object
|
||||
controller-data: true
|
||||
|
||||
google,cros-ec-spi-pre-delay:
|
||||
description:
|
||||
@@ -62,8 +64,7 @@ properties:
|
||||
the SCP.
|
||||
$ref: "/schemas/types.yaml#/definitions/string"
|
||||
|
||||
spi-max-frequency:
|
||||
description: Maximum SPI frequency of the device in Hz.
|
||||
spi-max-frequency: true
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
@@ -71,6 +72,15 @@ properties:
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
reset-gpios:
|
||||
maxItems: 1
|
||||
|
||||
boot0-gpios:
|
||||
maxItems: 1
|
||||
description: Assert for bootloader mode.
|
||||
|
||||
vdd-supply: true
|
||||
|
||||
wakeup-source:
|
||||
description: Button can wake-up the system.
|
||||
|
||||
@@ -155,18 +165,67 @@ allOf:
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- google,cros-ec-i2c
|
||||
- google,cros-ec-rpmsg
|
||||
not:
|
||||
contains:
|
||||
const: google,cros-ec-spi
|
||||
then:
|
||||
properties:
|
||||
controller-data: false
|
||||
google,cros-ec-spi-pre-delay: false
|
||||
google,cros-ec-spi-msg-delay: false
|
||||
spi-max-frequency: false
|
||||
else:
|
||||
$ref: /schemas/spi/spi-peripheral-props.yaml
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
not:
|
||||
contains:
|
||||
const: google,cros-ec-rpmsg
|
||||
then:
|
||||
properties:
|
||||
mediatek,rpmsg-name: false
|
||||
|
||||
required:
|
||||
- reg
|
||||
- interrupts
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: google,cros-ec-fp
|
||||
then:
|
||||
properties:
|
||||
'#address-cells': false
|
||||
'#size-cells': false
|
||||
typec: false
|
||||
ec-pwm: false
|
||||
kbd-led-backlight: false
|
||||
keyboard-controller: false
|
||||
proximity: false
|
||||
codecs: false
|
||||
cbas: false
|
||||
|
||||
patternProperties:
|
||||
"^i2c-tunnel[0-9]*$": false
|
||||
"^regulator@[0-9]+$": false
|
||||
"^extcon[0-9]*$": false
|
||||
|
||||
# Using additionalProperties: false here and
|
||||
# listing true properties doesn't work
|
||||
|
||||
required:
|
||||
- reset-gpios
|
||||
- boot0-gpios
|
||||
- vdd-supply
|
||||
else:
|
||||
properties:
|
||||
reset-gpios: false
|
||||
boot0-gpios: false
|
||||
vdd-supply: false
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
@@ -222,4 +281,22 @@ examples:
|
||||
compatible = "google,cros-ec-rpmsg";
|
||||
};
|
||||
};
|
||||
|
||||
# Example for FPMCU
|
||||
- |
|
||||
spi0 {
|
||||
#address-cells = <0x1>;
|
||||
#size-cells = <0x0>;
|
||||
|
||||
ec@0 {
|
||||
compatible = "google,cros-ec-fp", "google,cros-ec-spi";
|
||||
reg = <0x0>;
|
||||
interrupt-parent = <&gpio_controller>;
|
||||
interrupts = <4 IRQ_TYPE_LEVEL_LOW>;
|
||||
spi-max-frequency = <3000000>;
|
||||
reset-gpios = <&gpio_controller 5 GPIO_ACTIVE_LOW>;
|
||||
boot0-gpios = <&gpio_controller 10 GPIO_ACTIVE_HIGH>;
|
||||
vdd-supply = <&pp3300_fp_mcu>;
|
||||
};
|
||||
};
|
||||
...
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
* Broadcom MIPS (BMIPS) CPUs
|
||||
|
||||
Required properties:
|
||||
- compatible: "brcm,bmips3300", "brcm,bmips4350", "brcm,bmips4380",
|
||||
"brcm,bmips5000"
|
||||
|
||||
- mips-hpt-frequency: This is common to all CPUs in the system so it lives
|
||||
under the "cpus" node.
|
||||
@@ -0,0 +1,96 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/mips/brcm/soc.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Broadcom cable/DSL/settop platforms
|
||||
|
||||
maintainers:
|
||||
- Florian Fainelli <f.fainelli@gmail.com>
|
||||
|
||||
description: |
|
||||
Boards Broadcom cable/DSL/settop SoC shall have the following properties.
|
||||
The experimental -viper variants are for running Linux on the 3384's
|
||||
BMIPS4355 cable modem CPU instead of the BMIPS5000 application processor.
|
||||
|
||||
properties:
|
||||
$nodename:
|
||||
const: '/'
|
||||
|
||||
compatible:
|
||||
enum:
|
||||
- brcm,bcm3368
|
||||
- brcm,bcm3384
|
||||
- brcm,bcm33843
|
||||
- brcm,bcm3384-viper
|
||||
- brcm,bcm33843-viper
|
||||
- brcm,bcm6328
|
||||
- brcm,bcm6358
|
||||
- brcm,bcm6362
|
||||
- brcm,bcm6368
|
||||
- brcm,bcm63168
|
||||
- brcm,bcm63268
|
||||
- brcm,bcm7125
|
||||
- brcm,bcm7346
|
||||
- brcm,bcm7358
|
||||
- brcm,bcm7360
|
||||
- brcm,bcm7362
|
||||
- brcm,bcm7420
|
||||
- brcm,bcm7425
|
||||
|
||||
cpus:
|
||||
type: object
|
||||
additionalProperties: false
|
||||
properties:
|
||||
'#address-cells':
|
||||
const: 1
|
||||
|
||||
'#size-cells':
|
||||
const: 0
|
||||
|
||||
mips-hpt-frequency:
|
||||
description: MIPS counter high precision timer frequency.
|
||||
This is common to all CPUs in the system so it lives
|
||||
under the "cpus" node.
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
|
||||
patternProperties:
|
||||
"^cpu@[0-9]$":
|
||||
type: object
|
||||
$ref: /schemas/mips/cpus.yaml#
|
||||
unevaluatedProperties: false
|
||||
|
||||
required:
|
||||
- mips-hpt-frequency
|
||||
|
||||
additionalProperties: true
|
||||
|
||||
examples:
|
||||
- |
|
||||
/ {
|
||||
compatible = "brcm,bcm3368";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
model = "Broadcom 3368";
|
||||
|
||||
cpus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
mips-hpt-frequency = <150000000>;
|
||||
|
||||
cpu@0 {
|
||||
compatible = "brcm,bmips4350";
|
||||
device_type = "cpu";
|
||||
reg = <0>;
|
||||
};
|
||||
|
||||
cpu@1 {
|
||||
compatible = "brcm,bmips4350";
|
||||
device_type = "cpu";
|
||||
reg = <1>;
|
||||
};
|
||||
};
|
||||
};
|
||||
...
|
||||
@@ -0,0 +1,115 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/mips/cpus.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: MIPS CPUs bindings
|
||||
|
||||
maintainers:
|
||||
- Thomas Bogendoerfer <tsbogend@alpha.franken.de>
|
||||
- 周琰杰 (Zhou Yanjie) <zhouyanjie@wanyeetech.com>
|
||||
|
||||
description: |
|
||||
The device tree allows to describe the layout of CPUs in a system through
|
||||
the "cpus" node, which in turn contains a number of subnodes (ie "cpu")
|
||||
defining properties for every CPU.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- brcm,bmips3300
|
||||
- brcm,bmips4350
|
||||
- brcm,bmips4380
|
||||
- brcm,bmips5000
|
||||
- brcm,bmips5200
|
||||
- ingenic,xburst-mxu1.0
|
||||
- ingenic,xburst-fpu1.0-mxu1.1
|
||||
- ingenic,xburst-fpu2.0-mxu2.0
|
||||
- ingenic,xburst2-fpu2.1-mxu2.1-smt
|
||||
- loongson,gs264
|
||||
- mips,m14Kc
|
||||
- mips,mips4Kc
|
||||
- mips,mips4KEc
|
||||
- mips,mips24Kc
|
||||
- mips,mips24KEc
|
||||
- mips,mips74Kc
|
||||
- mips,mips1004Kc
|
||||
- mti,interaptiv
|
||||
- mti,mips24KEc
|
||||
- mti,mips14KEc
|
||||
- mti,mips14Kc
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
|
||||
device_type: true
|
||||
|
||||
allOf:
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- ingenic,xburst-mxu1.0
|
||||
- ingenic,xburst-fpu1.0-mxu1.1
|
||||
- ingenic,xburst-fpu2.0-mxu2.0
|
||||
- ingenic,xburst2-fpu2.1-mxu2.1-smt
|
||||
then:
|
||||
required:
|
||||
- device_type
|
||||
- clocks
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
cpus {
|
||||
#size-cells = <0>;
|
||||
#address-cells = <1>;
|
||||
|
||||
cpu@0 {
|
||||
compatible = "mips,mips1004Kc";
|
||||
device_type = "cpu";
|
||||
reg = <0>;
|
||||
};
|
||||
|
||||
cpu@1 {
|
||||
compatible = "mips,mips1004Kc";
|
||||
device_type = "cpu";
|
||||
reg = <1>;
|
||||
};
|
||||
};
|
||||
|
||||
- |
|
||||
// Example 2 (Ingenic CPU)
|
||||
#include <dt-bindings/clock/ingenic,jz4780-cgu.h>
|
||||
|
||||
cpus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
cpu@0 {
|
||||
compatible = "ingenic,xburst-fpu1.0-mxu1.1";
|
||||
device_type = "cpu";
|
||||
reg = <0>;
|
||||
|
||||
clocks = <&cgu JZ4780_CLK_CPU>;
|
||||
};
|
||||
|
||||
cpu@1 {
|
||||
compatible = "ingenic,xburst-fpu1.0-mxu1.1";
|
||||
device_type = "cpu";
|
||||
reg = <1>;
|
||||
|
||||
clocks = <&cgu JZ4780_CLK_CORE1>;
|
||||
};
|
||||
};
|
||||
...
|
||||
@@ -1,69 +0,0 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/mips/ingenic/ingenic,cpu.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Bindings for Ingenic XBurst family CPUs
|
||||
|
||||
maintainers:
|
||||
- 周琰杰 (Zhou Yanjie) <zhouyanjie@wanyeetech.com>
|
||||
|
||||
description:
|
||||
Ingenic XBurst family CPUs shall have the following properties.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
oneOf:
|
||||
|
||||
- description: Ingenic XBurst®1 CPU Cores
|
||||
enum:
|
||||
- ingenic,xburst-mxu1.0
|
||||
- ingenic,xburst-fpu1.0-mxu1.1
|
||||
- ingenic,xburst-fpu2.0-mxu2.0
|
||||
|
||||
- description: Ingenic XBurst®2 CPU Cores
|
||||
enum:
|
||||
- ingenic,xburst2-fpu2.1-mxu2.1-smt
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
|
||||
device_type: true
|
||||
|
||||
required:
|
||||
- device_type
|
||||
- compatible
|
||||
- reg
|
||||
- clocks
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/clock/ingenic,jz4780-cgu.h>
|
||||
|
||||
cpus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
cpu0: cpu@0 {
|
||||
device_type = "cpu";
|
||||
compatible = "ingenic,xburst-fpu1.0-mxu1.1";
|
||||
reg = <0>;
|
||||
|
||||
clocks = <&cgu JZ4780_CLK_CPU>;
|
||||
};
|
||||
|
||||
cpu1: cpu@1 {
|
||||
device_type = "cpu";
|
||||
compatible = "ingenic,xburst-fpu1.0-mxu1.1";
|
||||
reg = <1>;
|
||||
|
||||
clocks = <&cgu JZ4780_CLK_CORE1>;
|
||||
};
|
||||
};
|
||||
...
|
||||
@@ -48,6 +48,7 @@ examples:
|
||||
cros-ec@0 {
|
||||
compatible = "google,cros-ec-spi";
|
||||
reg = <0>;
|
||||
interrupts = <101 0>;
|
||||
|
||||
cros_ec_pwm: pwm {
|
||||
compatible = "google,cros-ec-pwm";
|
||||
|
||||
@@ -41,6 +41,7 @@ examples:
|
||||
reg = <0>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
interrupts = <99 0>;
|
||||
|
||||
regulator@0 {
|
||||
compatible = "google,cros-ec-regulator";
|
||||
|
||||
@@ -57,6 +57,7 @@ examples:
|
||||
cros-ec@0 {
|
||||
compatible = "google,cros-ec-spi";
|
||||
reg = <0>;
|
||||
interrupts = <93 0>;
|
||||
|
||||
codecs {
|
||||
#address-cells = <2>;
|
||||
|
||||
+15
-2
@@ -4954,6 +4954,12 @@ S: Maintained
|
||||
F: drivers/platform/chrome/cros_usbpd_notify.c
|
||||
F: include/linux/platform_data/cros_usbpd_notify.h
|
||||
|
||||
CHROMEOS HPS DRIVER
|
||||
M: Dan Callaghan <dcallagh@chromium.org>
|
||||
R: Sami Kyöstilä <skyostil@chromium.org>
|
||||
S: Maintained
|
||||
F: drivers/platform/chrome/cros_hps_i2c.c
|
||||
|
||||
CHRONTEL CH7322 CEC DRIVER
|
||||
M: Joe Tessler <jrt@google.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
@@ -5867,6 +5873,13 @@ L: Dell.Client.Kernel@dell.com
|
||||
S: Maintained
|
||||
F: drivers/platform/x86/dell/dell-wmi-descriptor.c
|
||||
|
||||
DELL WMI DDV DRIVER
|
||||
M: Armin Wolf <W_Armin@gmx.de>
|
||||
S: Maintained
|
||||
F: Documentation/ABI/testing/debugfs-dell-wmi-ddv
|
||||
F: Documentation/ABI/testing/sysfs-platform-dell-wmi-ddv
|
||||
F: drivers/platform/x86/dell/dell-wmi-ddv.c
|
||||
|
||||
DELL WMI SYSMAN DRIVER
|
||||
M: Divya Bharathi <divya.bharathi@dell.com>
|
||||
M: Prasanth Ksr <prasanth.ksr@dell.com>
|
||||
@@ -9376,7 +9389,7 @@ F: drivers/net/wireless/intersil/hostap/
|
||||
HP COMPAQ TC1100 TABLET WMI EXTRAS DRIVER
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
S: Orphan
|
||||
F: drivers/platform/x86/tc1100-wmi.c
|
||||
F: drivers/platform/x86/hp/tc1100-wmi.c
|
||||
|
||||
HPET: High Precision Event Timers driver
|
||||
M: Clemens Ladisch <clemens@ladisch.de>
|
||||
@@ -11877,7 +11890,7 @@ M: Eric Piel <eric.piel@tremplin-utc.net>
|
||||
S: Maintained
|
||||
F: Documentation/misc-devices/lis3lv02d.rst
|
||||
F: drivers/misc/lis3lv02d/
|
||||
F: drivers/platform/x86/hp_accel.c
|
||||
F: drivers/platform/x86/hp/hp_accel.c
|
||||
|
||||
LIST KUNIT TEST
|
||||
M: David Gow <davidgow@google.com>
|
||||
|
||||
@@ -445,7 +445,7 @@ static int __init xen_guest_init(void)
|
||||
return 0;
|
||||
|
||||
if (IS_ENABLED(CONFIG_XEN_VIRTIO))
|
||||
virtio_set_mem_acc_cb(xen_virtio_mem_acc);
|
||||
virtio_set_mem_acc_cb(xen_virtio_restricted_mem_acc);
|
||||
|
||||
if (!acpi_disabled)
|
||||
xen_acpi_guest_init();
|
||||
|
||||
@@ -562,29 +562,10 @@ CONFIG_CRYPTO_ECDSA=m
|
||||
CONFIG_CRYPTO_ECRDSA=m
|
||||
CONFIG_CRYPTO_SM2=m
|
||||
CONFIG_CRYPTO_CURVE25519=m
|
||||
CONFIG_CRYPTO_CHACHA20POLY1305=m
|
||||
CONFIG_CRYPTO_AEGIS128=m
|
||||
CONFIG_CRYPTO_CFB=m
|
||||
CONFIG_CRYPTO_CTS=m
|
||||
CONFIG_CRYPTO_LRW=m
|
||||
CONFIG_CRYPTO_OFB=m
|
||||
CONFIG_CRYPTO_PCBC=m
|
||||
CONFIG_CRYPTO_XTS=m
|
||||
CONFIG_CRYPTO_KEYWRAP=m
|
||||
CONFIG_CRYPTO_ADIANTUM=m
|
||||
CONFIG_CRYPTO_HCTR2=m
|
||||
CONFIG_CRYPTO_XCBC=m
|
||||
CONFIG_CRYPTO_VMAC=m
|
||||
CONFIG_CRYPTO_MD4=m
|
||||
CONFIG_CRYPTO_MICHAEL_MIC=m
|
||||
CONFIG_CRYPTO_RMD160=m
|
||||
CONFIG_CRYPTO_SHA3=m
|
||||
CONFIG_CRYPTO_SM3_GENERIC=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_AES=y
|
||||
CONFIG_CRYPTO_AES_TI=m
|
||||
CONFIG_CRYPTO_ANUBIS=m
|
||||
CONFIG_CRYPTO_ARC4=m
|
||||
CONFIG_CRYPTO_ARIA=m
|
||||
CONFIG_CRYPTO_BLOWFISH=m
|
||||
CONFIG_CRYPTO_CAMELLIA=m
|
||||
CONFIG_CRYPTO_CAST5=m
|
||||
@@ -593,11 +574,30 @@ CONFIG_CRYPTO_DES=m
|
||||
CONFIG_CRYPTO_FCRYPT=m
|
||||
CONFIG_CRYPTO_KHAZAD=m
|
||||
CONFIG_CRYPTO_SEED=m
|
||||
CONFIG_CRYPTO_ARIA=m
|
||||
CONFIG_CRYPTO_SERPENT=m
|
||||
CONFIG_CRYPTO_SM4_GENERIC=m
|
||||
CONFIG_CRYPTO_TEA=m
|
||||
CONFIG_CRYPTO_TWOFISH=m
|
||||
CONFIG_CRYPTO_ADIANTUM=m
|
||||
CONFIG_CRYPTO_ARC4=m
|
||||
CONFIG_CRYPTO_CFB=m
|
||||
CONFIG_CRYPTO_CTS=m
|
||||
CONFIG_CRYPTO_HCTR2=m
|
||||
CONFIG_CRYPTO_KEYWRAP=m
|
||||
CONFIG_CRYPTO_LRW=m
|
||||
CONFIG_CRYPTO_OFB=m
|
||||
CONFIG_CRYPTO_PCBC=m
|
||||
CONFIG_CRYPTO_XTS=m
|
||||
CONFIG_CRYPTO_AEGIS128=m
|
||||
CONFIG_CRYPTO_CHACHA20POLY1305=m
|
||||
CONFIG_CRYPTO_MD4=m
|
||||
CONFIG_CRYPTO_MICHAEL_MIC=m
|
||||
CONFIG_CRYPTO_RMD160=m
|
||||
CONFIG_CRYPTO_SHA3=m
|
||||
CONFIG_CRYPTO_SM3_GENERIC=m
|
||||
CONFIG_CRYPTO_VMAC=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_XCBC=m
|
||||
CONFIG_CRYPTO_LZO=m
|
||||
CONFIG_CRYPTO_842=m
|
||||
CONFIG_CRYPTO_LZ4=m
|
||||
|
||||
@@ -519,29 +519,10 @@ CONFIG_CRYPTO_ECDSA=m
|
||||
CONFIG_CRYPTO_ECRDSA=m
|
||||
CONFIG_CRYPTO_SM2=m
|
||||
CONFIG_CRYPTO_CURVE25519=m
|
||||
CONFIG_CRYPTO_CHACHA20POLY1305=m
|
||||
CONFIG_CRYPTO_AEGIS128=m
|
||||
CONFIG_CRYPTO_CFB=m
|
||||
CONFIG_CRYPTO_CTS=m
|
||||
CONFIG_CRYPTO_LRW=m
|
||||
CONFIG_CRYPTO_OFB=m
|
||||
CONFIG_CRYPTO_PCBC=m
|
||||
CONFIG_CRYPTO_XTS=m
|
||||
CONFIG_CRYPTO_KEYWRAP=m
|
||||
CONFIG_CRYPTO_ADIANTUM=m
|
||||
CONFIG_CRYPTO_HCTR2=m
|
||||
CONFIG_CRYPTO_XCBC=m
|
||||
CONFIG_CRYPTO_VMAC=m
|
||||
CONFIG_CRYPTO_MD4=m
|
||||
CONFIG_CRYPTO_MICHAEL_MIC=m
|
||||
CONFIG_CRYPTO_RMD160=m
|
||||
CONFIG_CRYPTO_SHA3=m
|
||||
CONFIG_CRYPTO_SM3_GENERIC=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_AES=y
|
||||
CONFIG_CRYPTO_AES_TI=m
|
||||
CONFIG_CRYPTO_ANUBIS=m
|
||||
CONFIG_CRYPTO_ARC4=m
|
||||
CONFIG_CRYPTO_ARIA=m
|
||||
CONFIG_CRYPTO_BLOWFISH=m
|
||||
CONFIG_CRYPTO_CAMELLIA=m
|
||||
CONFIG_CRYPTO_CAST5=m
|
||||
@@ -550,11 +531,30 @@ CONFIG_CRYPTO_DES=m
|
||||
CONFIG_CRYPTO_FCRYPT=m
|
||||
CONFIG_CRYPTO_KHAZAD=m
|
||||
CONFIG_CRYPTO_SEED=m
|
||||
CONFIG_CRYPTO_ARIA=m
|
||||
CONFIG_CRYPTO_SERPENT=m
|
||||
CONFIG_CRYPTO_SM4_GENERIC=m
|
||||
CONFIG_CRYPTO_TEA=m
|
||||
CONFIG_CRYPTO_TWOFISH=m
|
||||
CONFIG_CRYPTO_ADIANTUM=m
|
||||
CONFIG_CRYPTO_ARC4=m
|
||||
CONFIG_CRYPTO_CFB=m
|
||||
CONFIG_CRYPTO_CTS=m
|
||||
CONFIG_CRYPTO_HCTR2=m
|
||||
CONFIG_CRYPTO_KEYWRAP=m
|
||||
CONFIG_CRYPTO_LRW=m
|
||||
CONFIG_CRYPTO_OFB=m
|
||||
CONFIG_CRYPTO_PCBC=m
|
||||
CONFIG_CRYPTO_XTS=m
|
||||
CONFIG_CRYPTO_AEGIS128=m
|
||||
CONFIG_CRYPTO_CHACHA20POLY1305=m
|
||||
CONFIG_CRYPTO_MD4=m
|
||||
CONFIG_CRYPTO_MICHAEL_MIC=m
|
||||
CONFIG_CRYPTO_RMD160=m
|
||||
CONFIG_CRYPTO_SHA3=m
|
||||
CONFIG_CRYPTO_SM3_GENERIC=m
|
||||
CONFIG_CRYPTO_VMAC=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_XCBC=m
|
||||
CONFIG_CRYPTO_LZO=m
|
||||
CONFIG_CRYPTO_842=m
|
||||
CONFIG_CRYPTO_LZ4=m
|
||||
|
||||
@@ -539,29 +539,10 @@ CONFIG_CRYPTO_ECDSA=m
|
||||
CONFIG_CRYPTO_ECRDSA=m
|
||||
CONFIG_CRYPTO_SM2=m
|
||||
CONFIG_CRYPTO_CURVE25519=m
|
||||
CONFIG_CRYPTO_CHACHA20POLY1305=m
|
||||
CONFIG_CRYPTO_AEGIS128=m
|
||||
CONFIG_CRYPTO_CFB=m
|
||||
CONFIG_CRYPTO_CTS=m
|
||||
CONFIG_CRYPTO_LRW=m
|
||||
CONFIG_CRYPTO_OFB=m
|
||||
CONFIG_CRYPTO_PCBC=m
|
||||
CONFIG_CRYPTO_XTS=m
|
||||
CONFIG_CRYPTO_KEYWRAP=m
|
||||
CONFIG_CRYPTO_ADIANTUM=m
|
||||
CONFIG_CRYPTO_HCTR2=m
|
||||
CONFIG_CRYPTO_XCBC=m
|
||||
CONFIG_CRYPTO_VMAC=m
|
||||
CONFIG_CRYPTO_MD4=m
|
||||
CONFIG_CRYPTO_MICHAEL_MIC=m
|
||||
CONFIG_CRYPTO_RMD160=m
|
||||
CONFIG_CRYPTO_SHA3=m
|
||||
CONFIG_CRYPTO_SM3_GENERIC=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_AES=y
|
||||
CONFIG_CRYPTO_AES_TI=m
|
||||
CONFIG_CRYPTO_ANUBIS=m
|
||||
CONFIG_CRYPTO_ARC4=m
|
||||
CONFIG_CRYPTO_ARIA=m
|
||||
CONFIG_CRYPTO_BLOWFISH=m
|
||||
CONFIG_CRYPTO_CAMELLIA=m
|
||||
CONFIG_CRYPTO_CAST5=m
|
||||
@@ -570,11 +551,30 @@ CONFIG_CRYPTO_DES=m
|
||||
CONFIG_CRYPTO_FCRYPT=m
|
||||
CONFIG_CRYPTO_KHAZAD=m
|
||||
CONFIG_CRYPTO_SEED=m
|
||||
CONFIG_CRYPTO_ARIA=m
|
||||
CONFIG_CRYPTO_SERPENT=m
|
||||
CONFIG_CRYPTO_SM4_GENERIC=m
|
||||
CONFIG_CRYPTO_TEA=m
|
||||
CONFIG_CRYPTO_TWOFISH=m
|
||||
CONFIG_CRYPTO_ADIANTUM=m
|
||||
CONFIG_CRYPTO_ARC4=m
|
||||
CONFIG_CRYPTO_CFB=m
|
||||
CONFIG_CRYPTO_CTS=m
|
||||
CONFIG_CRYPTO_HCTR2=m
|
||||
CONFIG_CRYPTO_KEYWRAP=m
|
||||
CONFIG_CRYPTO_LRW=m
|
||||
CONFIG_CRYPTO_OFB=m
|
||||
CONFIG_CRYPTO_PCBC=m
|
||||
CONFIG_CRYPTO_XTS=m
|
||||
CONFIG_CRYPTO_AEGIS128=m
|
||||
CONFIG_CRYPTO_CHACHA20POLY1305=m
|
||||
CONFIG_CRYPTO_MD4=m
|
||||
CONFIG_CRYPTO_MICHAEL_MIC=m
|
||||
CONFIG_CRYPTO_RMD160=m
|
||||
CONFIG_CRYPTO_SHA3=m
|
||||
CONFIG_CRYPTO_SM3_GENERIC=m
|
||||
CONFIG_CRYPTO_VMAC=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_XCBC=m
|
||||
CONFIG_CRYPTO_LZO=m
|
||||
CONFIG_CRYPTO_842=m
|
||||
CONFIG_CRYPTO_LZ4=m
|
||||
|
||||
@@ -511,29 +511,10 @@ CONFIG_CRYPTO_ECDSA=m
|
||||
CONFIG_CRYPTO_ECRDSA=m
|
||||
CONFIG_CRYPTO_SM2=m
|
||||
CONFIG_CRYPTO_CURVE25519=m
|
||||
CONFIG_CRYPTO_CHACHA20POLY1305=m
|
||||
CONFIG_CRYPTO_AEGIS128=m
|
||||
CONFIG_CRYPTO_CFB=m
|
||||
CONFIG_CRYPTO_CTS=m
|
||||
CONFIG_CRYPTO_LRW=m
|
||||
CONFIG_CRYPTO_OFB=m
|
||||
CONFIG_CRYPTO_PCBC=m
|
||||
CONFIG_CRYPTO_XTS=m
|
||||
CONFIG_CRYPTO_KEYWRAP=m
|
||||
CONFIG_CRYPTO_ADIANTUM=m
|
||||
CONFIG_CRYPTO_HCTR2=m
|
||||
CONFIG_CRYPTO_XCBC=m
|
||||
CONFIG_CRYPTO_VMAC=m
|
||||
CONFIG_CRYPTO_MD4=m
|
||||
CONFIG_CRYPTO_MICHAEL_MIC=m
|
||||
CONFIG_CRYPTO_RMD160=m
|
||||
CONFIG_CRYPTO_SHA3=m
|
||||
CONFIG_CRYPTO_SM3_GENERIC=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_AES=y
|
||||
CONFIG_CRYPTO_AES_TI=m
|
||||
CONFIG_CRYPTO_ANUBIS=m
|
||||
CONFIG_CRYPTO_ARC4=m
|
||||
CONFIG_CRYPTO_ARIA=m
|
||||
CONFIG_CRYPTO_BLOWFISH=m
|
||||
CONFIG_CRYPTO_CAMELLIA=m
|
||||
CONFIG_CRYPTO_CAST5=m
|
||||
@@ -542,11 +523,30 @@ CONFIG_CRYPTO_DES=m
|
||||
CONFIG_CRYPTO_FCRYPT=m
|
||||
CONFIG_CRYPTO_KHAZAD=m
|
||||
CONFIG_CRYPTO_SEED=m
|
||||
CONFIG_CRYPTO_ARIA=m
|
||||
CONFIG_CRYPTO_SERPENT=m
|
||||
CONFIG_CRYPTO_SM4_GENERIC=m
|
||||
CONFIG_CRYPTO_TEA=m
|
||||
CONFIG_CRYPTO_TWOFISH=m
|
||||
CONFIG_CRYPTO_ADIANTUM=m
|
||||
CONFIG_CRYPTO_ARC4=m
|
||||
CONFIG_CRYPTO_CFB=m
|
||||
CONFIG_CRYPTO_CTS=m
|
||||
CONFIG_CRYPTO_HCTR2=m
|
||||
CONFIG_CRYPTO_KEYWRAP=m
|
||||
CONFIG_CRYPTO_LRW=m
|
||||
CONFIG_CRYPTO_OFB=m
|
||||
CONFIG_CRYPTO_PCBC=m
|
||||
CONFIG_CRYPTO_XTS=m
|
||||
CONFIG_CRYPTO_AEGIS128=m
|
||||
CONFIG_CRYPTO_CHACHA20POLY1305=m
|
||||
CONFIG_CRYPTO_MD4=m
|
||||
CONFIG_CRYPTO_MICHAEL_MIC=m
|
||||
CONFIG_CRYPTO_RMD160=m
|
||||
CONFIG_CRYPTO_SHA3=m
|
||||
CONFIG_CRYPTO_SM3_GENERIC=m
|
||||
CONFIG_CRYPTO_VMAC=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_XCBC=m
|
||||
CONFIG_CRYPTO_LZO=m
|
||||
CONFIG_CRYPTO_842=m
|
||||
CONFIG_CRYPTO_LZ4=m
|
||||
|
||||
@@ -521,29 +521,10 @@ CONFIG_CRYPTO_ECDSA=m
|
||||
CONFIG_CRYPTO_ECRDSA=m
|
||||
CONFIG_CRYPTO_SM2=m
|
||||
CONFIG_CRYPTO_CURVE25519=m
|
||||
CONFIG_CRYPTO_CHACHA20POLY1305=m
|
||||
CONFIG_CRYPTO_AEGIS128=m
|
||||
CONFIG_CRYPTO_CFB=m
|
||||
CONFIG_CRYPTO_CTS=m
|
||||
CONFIG_CRYPTO_LRW=m
|
||||
CONFIG_CRYPTO_OFB=m
|
||||
CONFIG_CRYPTO_PCBC=m
|
||||
CONFIG_CRYPTO_XTS=m
|
||||
CONFIG_CRYPTO_KEYWRAP=m
|
||||
CONFIG_CRYPTO_ADIANTUM=m
|
||||
CONFIG_CRYPTO_HCTR2=m
|
||||
CONFIG_CRYPTO_XCBC=m
|
||||
CONFIG_CRYPTO_VMAC=m
|
||||
CONFIG_CRYPTO_MD4=m
|
||||
CONFIG_CRYPTO_MICHAEL_MIC=m
|
||||
CONFIG_CRYPTO_RMD160=m
|
||||
CONFIG_CRYPTO_SHA3=m
|
||||
CONFIG_CRYPTO_SM3_GENERIC=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_AES=y
|
||||
CONFIG_CRYPTO_AES_TI=m
|
||||
CONFIG_CRYPTO_ANUBIS=m
|
||||
CONFIG_CRYPTO_ARC4=m
|
||||
CONFIG_CRYPTO_ARIA=m
|
||||
CONFIG_CRYPTO_BLOWFISH=m
|
||||
CONFIG_CRYPTO_CAMELLIA=m
|
||||
CONFIG_CRYPTO_CAST5=m
|
||||
@@ -552,11 +533,30 @@ CONFIG_CRYPTO_DES=m
|
||||
CONFIG_CRYPTO_FCRYPT=m
|
||||
CONFIG_CRYPTO_KHAZAD=m
|
||||
CONFIG_CRYPTO_SEED=m
|
||||
CONFIG_CRYPTO_ARIA=m
|
||||
CONFIG_CRYPTO_SERPENT=m
|
||||
CONFIG_CRYPTO_SM4_GENERIC=m
|
||||
CONFIG_CRYPTO_TEA=m
|
||||
CONFIG_CRYPTO_TWOFISH=m
|
||||
CONFIG_CRYPTO_ADIANTUM=m
|
||||
CONFIG_CRYPTO_ARC4=m
|
||||
CONFIG_CRYPTO_CFB=m
|
||||
CONFIG_CRYPTO_CTS=m
|
||||
CONFIG_CRYPTO_HCTR2=m
|
||||
CONFIG_CRYPTO_KEYWRAP=m
|
||||
CONFIG_CRYPTO_LRW=m
|
||||
CONFIG_CRYPTO_OFB=m
|
||||
CONFIG_CRYPTO_PCBC=m
|
||||
CONFIG_CRYPTO_XTS=m
|
||||
CONFIG_CRYPTO_AEGIS128=m
|
||||
CONFIG_CRYPTO_CHACHA20POLY1305=m
|
||||
CONFIG_CRYPTO_MD4=m
|
||||
CONFIG_CRYPTO_MICHAEL_MIC=m
|
||||
CONFIG_CRYPTO_RMD160=m
|
||||
CONFIG_CRYPTO_SHA3=m
|
||||
CONFIG_CRYPTO_SM3_GENERIC=m
|
||||
CONFIG_CRYPTO_VMAC=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_XCBC=m
|
||||
CONFIG_CRYPTO_LZO=m
|
||||
CONFIG_CRYPTO_842=m
|
||||
CONFIG_CRYPTO_LZ4=m
|
||||
|
||||
@@ -541,29 +541,10 @@ CONFIG_CRYPTO_ECDSA=m
|
||||
CONFIG_CRYPTO_ECRDSA=m
|
||||
CONFIG_CRYPTO_SM2=m
|
||||
CONFIG_CRYPTO_CURVE25519=m
|
||||
CONFIG_CRYPTO_CHACHA20POLY1305=m
|
||||
CONFIG_CRYPTO_AEGIS128=m
|
||||
CONFIG_CRYPTO_CFB=m
|
||||
CONFIG_CRYPTO_CTS=m
|
||||
CONFIG_CRYPTO_LRW=m
|
||||
CONFIG_CRYPTO_OFB=m
|
||||
CONFIG_CRYPTO_PCBC=m
|
||||
CONFIG_CRYPTO_XTS=m
|
||||
CONFIG_CRYPTO_KEYWRAP=m
|
||||
CONFIG_CRYPTO_ADIANTUM=m
|
||||
CONFIG_CRYPTO_HCTR2=m
|
||||
CONFIG_CRYPTO_XCBC=m
|
||||
CONFIG_CRYPTO_VMAC=m
|
||||
CONFIG_CRYPTO_MD4=m
|
||||
CONFIG_CRYPTO_MICHAEL_MIC=m
|
||||
CONFIG_CRYPTO_RMD160=m
|
||||
CONFIG_CRYPTO_SHA3=m
|
||||
CONFIG_CRYPTO_SM3_GENERIC=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_AES=y
|
||||
CONFIG_CRYPTO_AES_TI=m
|
||||
CONFIG_CRYPTO_ANUBIS=m
|
||||
CONFIG_CRYPTO_ARC4=m
|
||||
CONFIG_CRYPTO_ARIA=m
|
||||
CONFIG_CRYPTO_BLOWFISH=m
|
||||
CONFIG_CRYPTO_CAMELLIA=m
|
||||
CONFIG_CRYPTO_CAST5=m
|
||||
@@ -572,11 +553,30 @@ CONFIG_CRYPTO_DES=m
|
||||
CONFIG_CRYPTO_FCRYPT=m
|
||||
CONFIG_CRYPTO_KHAZAD=m
|
||||
CONFIG_CRYPTO_SEED=m
|
||||
CONFIG_CRYPTO_ARIA=m
|
||||
CONFIG_CRYPTO_SERPENT=m
|
||||
CONFIG_CRYPTO_SM4_GENERIC=m
|
||||
CONFIG_CRYPTO_TEA=m
|
||||
CONFIG_CRYPTO_TWOFISH=m
|
||||
CONFIG_CRYPTO_ADIANTUM=m
|
||||
CONFIG_CRYPTO_ARC4=m
|
||||
CONFIG_CRYPTO_CFB=m
|
||||
CONFIG_CRYPTO_CTS=m
|
||||
CONFIG_CRYPTO_HCTR2=m
|
||||
CONFIG_CRYPTO_KEYWRAP=m
|
||||
CONFIG_CRYPTO_LRW=m
|
||||
CONFIG_CRYPTO_OFB=m
|
||||
CONFIG_CRYPTO_PCBC=m
|
||||
CONFIG_CRYPTO_XTS=m
|
||||
CONFIG_CRYPTO_AEGIS128=m
|
||||
CONFIG_CRYPTO_CHACHA20POLY1305=m
|
||||
CONFIG_CRYPTO_MD4=m
|
||||
CONFIG_CRYPTO_MICHAEL_MIC=m
|
||||
CONFIG_CRYPTO_RMD160=m
|
||||
CONFIG_CRYPTO_SHA3=m
|
||||
CONFIG_CRYPTO_SM3_GENERIC=m
|
||||
CONFIG_CRYPTO_VMAC=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_XCBC=m
|
||||
CONFIG_CRYPTO_LZO=m
|
||||
CONFIG_CRYPTO_842=m
|
||||
CONFIG_CRYPTO_LZ4=m
|
||||
|
||||
@@ -627,29 +627,10 @@ CONFIG_CRYPTO_ECDSA=m
|
||||
CONFIG_CRYPTO_ECRDSA=m
|
||||
CONFIG_CRYPTO_SM2=m
|
||||
CONFIG_CRYPTO_CURVE25519=m
|
||||
CONFIG_CRYPTO_CHACHA20POLY1305=m
|
||||
CONFIG_CRYPTO_AEGIS128=m
|
||||
CONFIG_CRYPTO_CFB=m
|
||||
CONFIG_CRYPTO_CTS=m
|
||||
CONFIG_CRYPTO_LRW=m
|
||||
CONFIG_CRYPTO_OFB=m
|
||||
CONFIG_CRYPTO_PCBC=m
|
||||
CONFIG_CRYPTO_XTS=m
|
||||
CONFIG_CRYPTO_KEYWRAP=m
|
||||
CONFIG_CRYPTO_ADIANTUM=m
|
||||
CONFIG_CRYPTO_HCTR2=m
|
||||
CONFIG_CRYPTO_XCBC=m
|
||||
CONFIG_CRYPTO_VMAC=m
|
||||
CONFIG_CRYPTO_MD4=m
|
||||
CONFIG_CRYPTO_MICHAEL_MIC=m
|
||||
CONFIG_CRYPTO_RMD160=m
|
||||
CONFIG_CRYPTO_SHA3=m
|
||||
CONFIG_CRYPTO_SM3_GENERIC=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_AES=y
|
||||
CONFIG_CRYPTO_AES_TI=m
|
||||
CONFIG_CRYPTO_ANUBIS=m
|
||||
CONFIG_CRYPTO_ARC4=m
|
||||
CONFIG_CRYPTO_ARIA=m
|
||||
CONFIG_CRYPTO_BLOWFISH=m
|
||||
CONFIG_CRYPTO_CAMELLIA=m
|
||||
CONFIG_CRYPTO_CAST5=m
|
||||
@@ -658,11 +639,30 @@ CONFIG_CRYPTO_DES=m
|
||||
CONFIG_CRYPTO_FCRYPT=m
|
||||
CONFIG_CRYPTO_KHAZAD=m
|
||||
CONFIG_CRYPTO_SEED=m
|
||||
CONFIG_CRYPTO_ARIA=m
|
||||
CONFIG_CRYPTO_SERPENT=m
|
||||
CONFIG_CRYPTO_SM4_GENERIC=m
|
||||
CONFIG_CRYPTO_TEA=m
|
||||
CONFIG_CRYPTO_TWOFISH=m
|
||||
CONFIG_CRYPTO_ADIANTUM=m
|
||||
CONFIG_CRYPTO_ARC4=m
|
||||
CONFIG_CRYPTO_CFB=m
|
||||
CONFIG_CRYPTO_CTS=m
|
||||
CONFIG_CRYPTO_HCTR2=m
|
||||
CONFIG_CRYPTO_KEYWRAP=m
|
||||
CONFIG_CRYPTO_LRW=m
|
||||
CONFIG_CRYPTO_OFB=m
|
||||
CONFIG_CRYPTO_PCBC=m
|
||||
CONFIG_CRYPTO_XTS=m
|
||||
CONFIG_CRYPTO_AEGIS128=m
|
||||
CONFIG_CRYPTO_CHACHA20POLY1305=m
|
||||
CONFIG_CRYPTO_MD4=m
|
||||
CONFIG_CRYPTO_MICHAEL_MIC=m
|
||||
CONFIG_CRYPTO_RMD160=m
|
||||
CONFIG_CRYPTO_SHA3=m
|
||||
CONFIG_CRYPTO_SM3_GENERIC=m
|
||||
CONFIG_CRYPTO_VMAC=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_XCBC=m
|
||||
CONFIG_CRYPTO_LZO=m
|
||||
CONFIG_CRYPTO_842=m
|
||||
CONFIG_CRYPTO_LZ4=m
|
||||
|
||||
@@ -510,29 +510,10 @@ CONFIG_CRYPTO_ECDSA=m
|
||||
CONFIG_CRYPTO_ECRDSA=m
|
||||
CONFIG_CRYPTO_SM2=m
|
||||
CONFIG_CRYPTO_CURVE25519=m
|
||||
CONFIG_CRYPTO_CHACHA20POLY1305=m
|
||||
CONFIG_CRYPTO_AEGIS128=m
|
||||
CONFIG_CRYPTO_CFB=m
|
||||
CONFIG_CRYPTO_CTS=m
|
||||
CONFIG_CRYPTO_LRW=m
|
||||
CONFIG_CRYPTO_OFB=m
|
||||
CONFIG_CRYPTO_PCBC=m
|
||||
CONFIG_CRYPTO_XTS=m
|
||||
CONFIG_CRYPTO_KEYWRAP=m
|
||||
CONFIG_CRYPTO_ADIANTUM=m
|
||||
CONFIG_CRYPTO_HCTR2=m
|
||||
CONFIG_CRYPTO_XCBC=m
|
||||
CONFIG_CRYPTO_VMAC=m
|
||||
CONFIG_CRYPTO_MD4=m
|
||||
CONFIG_CRYPTO_MICHAEL_MIC=m
|
||||
CONFIG_CRYPTO_RMD160=m
|
||||
CONFIG_CRYPTO_SHA3=m
|
||||
CONFIG_CRYPTO_SM3_GENERIC=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_AES=y
|
||||
CONFIG_CRYPTO_AES_TI=m
|
||||
CONFIG_CRYPTO_ANUBIS=m
|
||||
CONFIG_CRYPTO_ARC4=m
|
||||
CONFIG_CRYPTO_ARIA=m
|
||||
CONFIG_CRYPTO_BLOWFISH=m
|
||||
CONFIG_CRYPTO_CAMELLIA=m
|
||||
CONFIG_CRYPTO_CAST5=m
|
||||
@@ -541,11 +522,30 @@ CONFIG_CRYPTO_DES=m
|
||||
CONFIG_CRYPTO_FCRYPT=m
|
||||
CONFIG_CRYPTO_KHAZAD=m
|
||||
CONFIG_CRYPTO_SEED=m
|
||||
CONFIG_CRYPTO_ARIA=m
|
||||
CONFIG_CRYPTO_SERPENT=m
|
||||
CONFIG_CRYPTO_SM4_GENERIC=m
|
||||
CONFIG_CRYPTO_TEA=m
|
||||
CONFIG_CRYPTO_TWOFISH=m
|
||||
CONFIG_CRYPTO_ADIANTUM=m
|
||||
CONFIG_CRYPTO_ARC4=m
|
||||
CONFIG_CRYPTO_CFB=m
|
||||
CONFIG_CRYPTO_CTS=m
|
||||
CONFIG_CRYPTO_HCTR2=m
|
||||
CONFIG_CRYPTO_KEYWRAP=m
|
||||
CONFIG_CRYPTO_LRW=m
|
||||
CONFIG_CRYPTO_OFB=m
|
||||
CONFIG_CRYPTO_PCBC=m
|
||||
CONFIG_CRYPTO_XTS=m
|
||||
CONFIG_CRYPTO_AEGIS128=m
|
||||
CONFIG_CRYPTO_CHACHA20POLY1305=m
|
||||
CONFIG_CRYPTO_MD4=m
|
||||
CONFIG_CRYPTO_MICHAEL_MIC=m
|
||||
CONFIG_CRYPTO_RMD160=m
|
||||
CONFIG_CRYPTO_SHA3=m
|
||||
CONFIG_CRYPTO_SM3_GENERIC=m
|
||||
CONFIG_CRYPTO_VMAC=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_XCBC=m
|
||||
CONFIG_CRYPTO_LZO=m
|
||||
CONFIG_CRYPTO_842=m
|
||||
CONFIG_CRYPTO_LZ4=m
|
||||
|
||||
@@ -511,29 +511,10 @@ CONFIG_CRYPTO_ECDSA=m
|
||||
CONFIG_CRYPTO_ECRDSA=m
|
||||
CONFIG_CRYPTO_SM2=m
|
||||
CONFIG_CRYPTO_CURVE25519=m
|
||||
CONFIG_CRYPTO_CHACHA20POLY1305=m
|
||||
CONFIG_CRYPTO_AEGIS128=m
|
||||
CONFIG_CRYPTO_CFB=m
|
||||
CONFIG_CRYPTO_CTS=m
|
||||
CONFIG_CRYPTO_LRW=m
|
||||
CONFIG_CRYPTO_OFB=m
|
||||
CONFIG_CRYPTO_PCBC=m
|
||||
CONFIG_CRYPTO_XTS=m
|
||||
CONFIG_CRYPTO_KEYWRAP=m
|
||||
CONFIG_CRYPTO_ADIANTUM=m
|
||||
CONFIG_CRYPTO_HCTR2=m
|
||||
CONFIG_CRYPTO_XCBC=m
|
||||
CONFIG_CRYPTO_VMAC=m
|
||||
CONFIG_CRYPTO_MD4=m
|
||||
CONFIG_CRYPTO_MICHAEL_MIC=m
|
||||
CONFIG_CRYPTO_RMD160=m
|
||||
CONFIG_CRYPTO_SHA3=m
|
||||
CONFIG_CRYPTO_SM3_GENERIC=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_AES=y
|
||||
CONFIG_CRYPTO_AES_TI=m
|
||||
CONFIG_CRYPTO_ANUBIS=m
|
||||
CONFIG_CRYPTO_ARC4=m
|
||||
CONFIG_CRYPTO_ARIA=m
|
||||
CONFIG_CRYPTO_BLOWFISH=m
|
||||
CONFIG_CRYPTO_CAMELLIA=m
|
||||
CONFIG_CRYPTO_CAST5=m
|
||||
@@ -542,11 +523,30 @@ CONFIG_CRYPTO_DES=m
|
||||
CONFIG_CRYPTO_FCRYPT=m
|
||||
CONFIG_CRYPTO_KHAZAD=m
|
||||
CONFIG_CRYPTO_SEED=m
|
||||
CONFIG_CRYPTO_ARIA=m
|
||||
CONFIG_CRYPTO_SERPENT=m
|
||||
CONFIG_CRYPTO_SM4_GENERIC=m
|
||||
CONFIG_CRYPTO_TEA=m
|
||||
CONFIG_CRYPTO_TWOFISH=m
|
||||
CONFIG_CRYPTO_ADIANTUM=m
|
||||
CONFIG_CRYPTO_ARC4=m
|
||||
CONFIG_CRYPTO_CFB=m
|
||||
CONFIG_CRYPTO_CTS=m
|
||||
CONFIG_CRYPTO_HCTR2=m
|
||||
CONFIG_CRYPTO_KEYWRAP=m
|
||||
CONFIG_CRYPTO_LRW=m
|
||||
CONFIG_CRYPTO_OFB=m
|
||||
CONFIG_CRYPTO_PCBC=m
|
||||
CONFIG_CRYPTO_XTS=m
|
||||
CONFIG_CRYPTO_AEGIS128=m
|
||||
CONFIG_CRYPTO_CHACHA20POLY1305=m
|
||||
CONFIG_CRYPTO_MD4=m
|
||||
CONFIG_CRYPTO_MICHAEL_MIC=m
|
||||
CONFIG_CRYPTO_RMD160=m
|
||||
CONFIG_CRYPTO_SHA3=m
|
||||
CONFIG_CRYPTO_SM3_GENERIC=m
|
||||
CONFIG_CRYPTO_VMAC=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_XCBC=m
|
||||
CONFIG_CRYPTO_LZO=m
|
||||
CONFIG_CRYPTO_842=m
|
||||
CONFIG_CRYPTO_LZ4=m
|
||||
|
||||
@@ -528,29 +528,10 @@ CONFIG_CRYPTO_ECDSA=m
|
||||
CONFIG_CRYPTO_ECRDSA=m
|
||||
CONFIG_CRYPTO_SM2=m
|
||||
CONFIG_CRYPTO_CURVE25519=m
|
||||
CONFIG_CRYPTO_CHACHA20POLY1305=m
|
||||
CONFIG_CRYPTO_AEGIS128=m
|
||||
CONFIG_CRYPTO_CFB=m
|
||||
CONFIG_CRYPTO_CTS=m
|
||||
CONFIG_CRYPTO_LRW=m
|
||||
CONFIG_CRYPTO_OFB=m
|
||||
CONFIG_CRYPTO_PCBC=m
|
||||
CONFIG_CRYPTO_XTS=m
|
||||
CONFIG_CRYPTO_KEYWRAP=m
|
||||
CONFIG_CRYPTO_ADIANTUM=m
|
||||
CONFIG_CRYPTO_HCTR2=m
|
||||
CONFIG_CRYPTO_XCBC=m
|
||||
CONFIG_CRYPTO_VMAC=m
|
||||
CONFIG_CRYPTO_MD4=m
|
||||
CONFIG_CRYPTO_MICHAEL_MIC=m
|
||||
CONFIG_CRYPTO_RMD160=m
|
||||
CONFIG_CRYPTO_SHA3=m
|
||||
CONFIG_CRYPTO_SM3_GENERIC=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_AES=y
|
||||
CONFIG_CRYPTO_AES_TI=m
|
||||
CONFIG_CRYPTO_ANUBIS=m
|
||||
CONFIG_CRYPTO_ARC4=m
|
||||
CONFIG_CRYPTO_ARIA=m
|
||||
CONFIG_CRYPTO_BLOWFISH=m
|
||||
CONFIG_CRYPTO_CAMELLIA=m
|
||||
CONFIG_CRYPTO_CAST5=m
|
||||
@@ -559,11 +540,30 @@ CONFIG_CRYPTO_DES=m
|
||||
CONFIG_CRYPTO_FCRYPT=m
|
||||
CONFIG_CRYPTO_KHAZAD=m
|
||||
CONFIG_CRYPTO_SEED=m
|
||||
CONFIG_CRYPTO_ARIA=m
|
||||
CONFIG_CRYPTO_SERPENT=m
|
||||
CONFIG_CRYPTO_SM4_GENERIC=m
|
||||
CONFIG_CRYPTO_TEA=m
|
||||
CONFIG_CRYPTO_TWOFISH=m
|
||||
CONFIG_CRYPTO_ADIANTUM=m
|
||||
CONFIG_CRYPTO_ARC4=m
|
||||
CONFIG_CRYPTO_CFB=m
|
||||
CONFIG_CRYPTO_CTS=m
|
||||
CONFIG_CRYPTO_HCTR2=m
|
||||
CONFIG_CRYPTO_KEYWRAP=m
|
||||
CONFIG_CRYPTO_LRW=m
|
||||
CONFIG_CRYPTO_OFB=m
|
||||
CONFIG_CRYPTO_PCBC=m
|
||||
CONFIG_CRYPTO_XTS=m
|
||||
CONFIG_CRYPTO_AEGIS128=m
|
||||
CONFIG_CRYPTO_CHACHA20POLY1305=m
|
||||
CONFIG_CRYPTO_MD4=m
|
||||
CONFIG_CRYPTO_MICHAEL_MIC=m
|
||||
CONFIG_CRYPTO_RMD160=m
|
||||
CONFIG_CRYPTO_SHA3=m
|
||||
CONFIG_CRYPTO_SM3_GENERIC=m
|
||||
CONFIG_CRYPTO_VMAC=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_XCBC=m
|
||||
CONFIG_CRYPTO_LZO=m
|
||||
CONFIG_CRYPTO_842=m
|
||||
CONFIG_CRYPTO_LZ4=m
|
||||
|
||||
@@ -510,29 +510,10 @@ CONFIG_CRYPTO_ECDSA=m
|
||||
CONFIG_CRYPTO_ECRDSA=m
|
||||
CONFIG_CRYPTO_SM2=m
|
||||
CONFIG_CRYPTO_CURVE25519=m
|
||||
CONFIG_CRYPTO_CHACHA20POLY1305=m
|
||||
CONFIG_CRYPTO_AEGIS128=m
|
||||
CONFIG_CRYPTO_CFB=m
|
||||
CONFIG_CRYPTO_CTS=m
|
||||
CONFIG_CRYPTO_LRW=m
|
||||
CONFIG_CRYPTO_OFB=m
|
||||
CONFIG_CRYPTO_PCBC=m
|
||||
CONFIG_CRYPTO_XTS=m
|
||||
CONFIG_CRYPTO_KEYWRAP=m
|
||||
CONFIG_CRYPTO_ADIANTUM=m
|
||||
CONFIG_CRYPTO_HCTR2=m
|
||||
CONFIG_CRYPTO_XCBC=m
|
||||
CONFIG_CRYPTO_VMAC=m
|
||||
CONFIG_CRYPTO_MD4=m
|
||||
CONFIG_CRYPTO_MICHAEL_MIC=m
|
||||
CONFIG_CRYPTO_RMD160=m
|
||||
CONFIG_CRYPTO_SHA3=m
|
||||
CONFIG_CRYPTO_SM3_GENERIC=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_AES=y
|
||||
CONFIG_CRYPTO_AES_TI=m
|
||||
CONFIG_CRYPTO_ANUBIS=m
|
||||
CONFIG_CRYPTO_ARC4=m
|
||||
CONFIG_CRYPTO_ARIA=m
|
||||
CONFIG_CRYPTO_BLOWFISH=m
|
||||
CONFIG_CRYPTO_CAMELLIA=m
|
||||
CONFIG_CRYPTO_CAST5=m
|
||||
@@ -541,11 +522,30 @@ CONFIG_CRYPTO_DES=m
|
||||
CONFIG_CRYPTO_FCRYPT=m
|
||||
CONFIG_CRYPTO_KHAZAD=m
|
||||
CONFIG_CRYPTO_SEED=m
|
||||
CONFIG_CRYPTO_ARIA=m
|
||||
CONFIG_CRYPTO_SERPENT=m
|
||||
CONFIG_CRYPTO_SM4_GENERIC=m
|
||||
CONFIG_CRYPTO_TEA=m
|
||||
CONFIG_CRYPTO_TWOFISH=m
|
||||
CONFIG_CRYPTO_ADIANTUM=m
|
||||
CONFIG_CRYPTO_ARC4=m
|
||||
CONFIG_CRYPTO_CFB=m
|
||||
CONFIG_CRYPTO_CTS=m
|
||||
CONFIG_CRYPTO_HCTR2=m
|
||||
CONFIG_CRYPTO_KEYWRAP=m
|
||||
CONFIG_CRYPTO_LRW=m
|
||||
CONFIG_CRYPTO_OFB=m
|
||||
CONFIG_CRYPTO_PCBC=m
|
||||
CONFIG_CRYPTO_XTS=m
|
||||
CONFIG_CRYPTO_AEGIS128=m
|
||||
CONFIG_CRYPTO_CHACHA20POLY1305=m
|
||||
CONFIG_CRYPTO_MD4=m
|
||||
CONFIG_CRYPTO_MICHAEL_MIC=m
|
||||
CONFIG_CRYPTO_RMD160=m
|
||||
CONFIG_CRYPTO_SHA3=m
|
||||
CONFIG_CRYPTO_SM3_GENERIC=m
|
||||
CONFIG_CRYPTO_VMAC=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_XCBC=m
|
||||
CONFIG_CRYPTO_LZO=m
|
||||
CONFIG_CRYPTO_842=m
|
||||
CONFIG_CRYPTO_LZ4=m
|
||||
|
||||
@@ -509,29 +509,10 @@ CONFIG_CRYPTO_ECDSA=m
|
||||
CONFIG_CRYPTO_ECRDSA=m
|
||||
CONFIG_CRYPTO_SM2=m
|
||||
CONFIG_CRYPTO_CURVE25519=m
|
||||
CONFIG_CRYPTO_CHACHA20POLY1305=m
|
||||
CONFIG_CRYPTO_AEGIS128=m
|
||||
CONFIG_CRYPTO_CFB=m
|
||||
CONFIG_CRYPTO_CTS=m
|
||||
CONFIG_CRYPTO_LRW=m
|
||||
CONFIG_CRYPTO_OFB=m
|
||||
CONFIG_CRYPTO_PCBC=m
|
||||
CONFIG_CRYPTO_XTS=m
|
||||
CONFIG_CRYPTO_KEYWRAP=m
|
||||
CONFIG_CRYPTO_ADIANTUM=m
|
||||
CONFIG_CRYPTO_HCTR2=m
|
||||
CONFIG_CRYPTO_XCBC=m
|
||||
CONFIG_CRYPTO_VMAC=m
|
||||
CONFIG_CRYPTO_MD4=m
|
||||
CONFIG_CRYPTO_MICHAEL_MIC=m
|
||||
CONFIG_CRYPTO_RMD160=m
|
||||
CONFIG_CRYPTO_SHA3=m
|
||||
CONFIG_CRYPTO_SM3_GENERIC=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_AES=y
|
||||
CONFIG_CRYPTO_AES_TI=m
|
||||
CONFIG_CRYPTO_ANUBIS=m
|
||||
CONFIG_CRYPTO_ARC4=m
|
||||
CONFIG_CRYPTO_ARIA=m
|
||||
CONFIG_CRYPTO_BLOWFISH=m
|
||||
CONFIG_CRYPTO_CAMELLIA=m
|
||||
CONFIG_CRYPTO_CAST5=m
|
||||
@@ -540,11 +521,30 @@ CONFIG_CRYPTO_DES=m
|
||||
CONFIG_CRYPTO_FCRYPT=m
|
||||
CONFIG_CRYPTO_KHAZAD=m
|
||||
CONFIG_CRYPTO_SEED=m
|
||||
CONFIG_CRYPTO_ARIA=m
|
||||
CONFIG_CRYPTO_SERPENT=m
|
||||
CONFIG_CRYPTO_SM4_GENERIC=m
|
||||
CONFIG_CRYPTO_TEA=m
|
||||
CONFIG_CRYPTO_TWOFISH=m
|
||||
CONFIG_CRYPTO_ADIANTUM=m
|
||||
CONFIG_CRYPTO_ARC4=m
|
||||
CONFIG_CRYPTO_CFB=m
|
||||
CONFIG_CRYPTO_CTS=m
|
||||
CONFIG_CRYPTO_HCTR2=m
|
||||
CONFIG_CRYPTO_KEYWRAP=m
|
||||
CONFIG_CRYPTO_LRW=m
|
||||
CONFIG_CRYPTO_OFB=m
|
||||
CONFIG_CRYPTO_PCBC=m
|
||||
CONFIG_CRYPTO_XTS=m
|
||||
CONFIG_CRYPTO_AEGIS128=m
|
||||
CONFIG_CRYPTO_CHACHA20POLY1305=m
|
||||
CONFIG_CRYPTO_MD4=m
|
||||
CONFIG_CRYPTO_MICHAEL_MIC=m
|
||||
CONFIG_CRYPTO_RMD160=m
|
||||
CONFIG_CRYPTO_SHA3=m
|
||||
CONFIG_CRYPTO_SM3_GENERIC=m
|
||||
CONFIG_CRYPTO_VMAC=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_XCBC=m
|
||||
CONFIG_CRYPTO_LZO=m
|
||||
CONFIG_CRYPTO_842=m
|
||||
CONFIG_CRYPTO_LZ4=m
|
||||
|
||||
@@ -267,14 +267,6 @@ extern void via1_irq(struct irq_desc *desc);
|
||||
extern void via1_set_head(int);
|
||||
extern int via2_scsi_drq_pending(void);
|
||||
|
||||
static inline int rbv_set_video_bpp(int bpp)
|
||||
{
|
||||
char val = (bpp==1)?0:(bpp==2)?1:(bpp==4)?2:(bpp==8)?3:-1;
|
||||
if (!rbv_present || val<0) return -1;
|
||||
via2[rMonP] = (via2[rMonP] & ~RBV_DEPTH) | val;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#endif /* _ASM_MAC_VIA_H_ */
|
||||
|
||||
@@ -126,7 +126,7 @@ static void via_rtc_send(__u8 data)
|
||||
|
||||
reg = via1[vBufB] & ~(VIA1B_vRTCClk | VIA1B_vRTCData);
|
||||
|
||||
/* The bits of the byte go in in MSB order */
|
||||
/* The bits of the byte go into the RTC in MSB order */
|
||||
|
||||
for (i = 0 ; i < 8 ; i++) {
|
||||
bit = data & 0x80? 1 : 0;
|
||||
|
||||
+1
-1
@@ -318,7 +318,7 @@ KBUILD_LDFLAGS += -m $(ld-emul)
|
||||
|
||||
ifdef CONFIG_MIPS
|
||||
CHECKFLAGS += $(shell $(CC) $(KBUILD_CFLAGS) -dM -E -x c /dev/null | \
|
||||
egrep -vw '__GNUC_(MINOR_|PATCHLEVEL_)?_' | \
|
||||
grep -E -vw '__GNUC_(MINOR_|PATCHLEVEL_)?_' | \
|
||||
sed -e "s/^\#define /-D'/" -e "s/ /'='/" -e "s/$$/'/" -e 's/\$$/&&/g')
|
||||
endif
|
||||
|
||||
|
||||
@@ -361,6 +361,8 @@ static struct clk clk_periph = {
|
||||
*/
|
||||
int clk_enable(struct clk *clk)
|
||||
{
|
||||
if (!clk)
|
||||
return 0;
|
||||
mutex_lock(&clocks_mutex);
|
||||
clk_enable_unlocked(clk);
|
||||
mutex_unlock(&clocks_mutex);
|
||||
|
||||
@@ -110,6 +110,11 @@
|
||||
reg = <0x10000080 0x30>;
|
||||
ranges = <0x0 0x10000080 0x30>;
|
||||
|
||||
timer@0 {
|
||||
compatible = "brcm,bcm6345-timer";
|
||||
reg = <0x0 0x1c>;
|
||||
};
|
||||
|
||||
wdt: watchdog@1c {
|
||||
compatible = "brcm,bcm7038-wdt";
|
||||
reg = <0x1c 0xc>;
|
||||
|
||||
@@ -422,6 +422,7 @@
|
||||
reg = <0x41c800 0x600>, <0x41d000 0x100>;
|
||||
interrupt-parent = <&hif_l2_intc>;
|
||||
interrupts = <24>, <4>;
|
||||
interrupt-names = "nand_ctlrdy", "flash_dma_done";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
||||
@@ -438,7 +438,7 @@
|
||||
ingenic,nemc-tAW = <50>;
|
||||
ingenic,nemc-tSTRV = <100>;
|
||||
|
||||
reset-gpios = <&gpf 12 GPIO_ACTIVE_HIGH>;
|
||||
reset-gpios = <&gpf 12 GPIO_ACTIVE_LOW>;
|
||||
vcc-supply = <ð0_power>;
|
||||
|
||||
interrupt-parent = <&gpe>;
|
||||
|
||||
@@ -208,7 +208,7 @@
|
||||
};
|
||||
|
||||
&i2c0 {
|
||||
pca9545@70 {
|
||||
i2c-mux@70 {
|
||||
compatible = "nxp,pca9545";
|
||||
reg = <0x70>;
|
||||
#address-cells = <1>;
|
||||
@@ -236,7 +236,7 @@
|
||||
reg = <3>;
|
||||
};
|
||||
};
|
||||
pca9545@71 {
|
||||
i2c-mux@71 {
|
||||
compatible = "nxp,pca9545";
|
||||
reg = <0x71>;
|
||||
#address-cells = <1>;
|
||||
|
||||
@@ -176,7 +176,6 @@
|
||||
|
||||
switch_port0: port@0 {
|
||||
reg = <0x0>;
|
||||
label = "cpu";
|
||||
ethernet = <ð1>;
|
||||
|
||||
phy-mode = "gmii";
|
||||
|
||||
@@ -113,13 +113,13 @@
|
||||
|
||||
&gmac1 {
|
||||
status = "okay";
|
||||
phy-mode = "rgmii-rxid";
|
||||
phy-handle = <ðphy5>;
|
||||
};
|
||||
|
||||
&mdio {
|
||||
ethphy5: ethernet-phy@5 {
|
||||
reg = <5>;
|
||||
phy-mode = "rgmii-rxid";
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -357,36 +357,35 @@
|
||||
port@0 {
|
||||
status = "disabled";
|
||||
reg = <0>;
|
||||
label = "lan0";
|
||||
label = "swp0";
|
||||
};
|
||||
|
||||
port@1 {
|
||||
status = "disabled";
|
||||
reg = <1>;
|
||||
label = "lan1";
|
||||
label = "swp1";
|
||||
};
|
||||
|
||||
port@2 {
|
||||
status = "disabled";
|
||||
reg = <2>;
|
||||
label = "lan2";
|
||||
label = "swp2";
|
||||
};
|
||||
|
||||
port@3 {
|
||||
status = "disabled";
|
||||
reg = <3>;
|
||||
label = "lan3";
|
||||
label = "swp3";
|
||||
};
|
||||
|
||||
port@4 {
|
||||
status = "disabled";
|
||||
reg = <4>;
|
||||
label = "lan4";
|
||||
label = "swp4";
|
||||
};
|
||||
|
||||
port@6 {
|
||||
reg = <6>;
|
||||
label = "cpu";
|
||||
ethernet = <&gmac0>;
|
||||
phy-mode = "trgmii";
|
||||
|
||||
|
||||
@@ -780,9 +780,8 @@ int64_t cvmx_bootmem_phy_named_block_alloc(uint64_t size, uint64_t min_addr,
|
||||
if (addr_allocated >= 0) {
|
||||
named_block_desc_ptr->base_addr = addr_allocated;
|
||||
named_block_desc_ptr->size = size;
|
||||
strncpy(named_block_desc_ptr->name, name,
|
||||
strscpy(named_block_desc_ptr->name, name,
|
||||
cvmx_bootmem_desc->named_block_name_len);
|
||||
named_block_desc_ptr->name[cvmx_bootmem_desc->named_block_name_len - 1] = 0;
|
||||
}
|
||||
|
||||
if (!(flags & CVMX_BOOTMEM_FLAG_NO_LOCKING))
|
||||
|
||||
@@ -211,7 +211,7 @@ union cvmx_helper_link_info __cvmx_helper_board_link_get(int ipd_port)
|
||||
{
|
||||
union cvmx_helper_link_info result;
|
||||
|
||||
WARN(!octeon_is_simulation(),
|
||||
WARN_ONCE(!octeon_is_simulation(),
|
||||
"Using deprecated link status - please update your DT");
|
||||
|
||||
/* Unless we fix it later, all links are defaulted to down */
|
||||
|
||||
@@ -1096,7 +1096,7 @@ union cvmx_helper_link_info cvmx_helper_link_get(int ipd_port)
|
||||
if (index == 0)
|
||||
result = __cvmx_helper_rgmii_link_get(ipd_port);
|
||||
else {
|
||||
WARN(1, "Using deprecated link status - please update your DT");
|
||||
WARN_ONCE(1, "Using deprecated link status - please update your DT");
|
||||
result.s.full_duplex = 1;
|
||||
result.s.link_up = 1;
|
||||
result.s.speed = 1000;
|
||||
|
||||
@@ -6,3 +6,6 @@
|
||||
#include <linux/uaccess.h>
|
||||
#include <asm/ftrace.h>
|
||||
#include <asm/mmu_context.h>
|
||||
|
||||
extern void clear_page_cpu(void *page);
|
||||
extern void copy_page_cpu(void *to, void *from);
|
||||
|
||||
@@ -7,10 +7,12 @@
|
||||
#ifndef _MT7621_REGS_H_
|
||||
#define _MT7621_REGS_H_
|
||||
|
||||
#define IOMEM(x) ((void __iomem *)(KSEG1ADDR(x)))
|
||||
|
||||
#define MT7621_PALMBUS_BASE 0x1C000000
|
||||
#define MT7621_PALMBUS_SIZE 0x03FFFFFF
|
||||
|
||||
#define MT7621_SYSC_BASE 0x1E000000
|
||||
#define MT7621_SYSC_BASE IOMEM(0x1E000000)
|
||||
|
||||
#define SYSC_REG_CHIP_NAME0 0x00
|
||||
#define SYSC_REG_CHIP_NAME1 0x04
|
||||
|
||||
@@ -75,7 +75,6 @@ ATTRIBUTE_GROUPS(vpe);
|
||||
|
||||
static void vpe_device_release(struct device *cd)
|
||||
{
|
||||
kfree(cd);
|
||||
}
|
||||
|
||||
static struct class vpe_class = {
|
||||
@@ -157,6 +156,7 @@ out_dev:
|
||||
device_del(&vpe_device);
|
||||
|
||||
out_class:
|
||||
put_device(&vpe_device);
|
||||
class_unregister(&vpe_class);
|
||||
|
||||
out_chrdev:
|
||||
@@ -169,7 +169,7 @@ void __exit vpe_module_exit(void)
|
||||
{
|
||||
struct vpe *v, *n;
|
||||
|
||||
device_del(&vpe_device);
|
||||
device_unregister(&vpe_device);
|
||||
class_unregister(&vpe_class);
|
||||
unregister_chrdev(major, VPE_MODULE_NAME);
|
||||
|
||||
|
||||
@@ -313,7 +313,6 @@ ATTRIBUTE_GROUPS(vpe);
|
||||
|
||||
static void vpe_device_release(struct device *cd)
|
||||
{
|
||||
kfree(cd);
|
||||
}
|
||||
|
||||
static struct class vpe_class = {
|
||||
@@ -497,6 +496,7 @@ out_dev:
|
||||
device_del(&vpe_device);
|
||||
|
||||
out_class:
|
||||
put_device(&vpe_device);
|
||||
class_unregister(&vpe_class);
|
||||
|
||||
out_chrdev:
|
||||
@@ -509,7 +509,7 @@ void __exit vpe_module_exit(void)
|
||||
{
|
||||
struct vpe *v, *n;
|
||||
|
||||
device_del(&vpe_device);
|
||||
device_unregister(&vpe_device);
|
||||
class_unregister(&vpe_class);
|
||||
unregister_chrdev(major, VPE_MODULE_NAME);
|
||||
|
||||
|
||||
@@ -404,7 +404,6 @@ static int rt3883_pci_probe(struct platform_device *pdev)
|
||||
struct rt3883_pci_controller *rpc;
|
||||
struct device *dev = &pdev->dev;
|
||||
struct device_node *np = dev->of_node;
|
||||
struct resource *res;
|
||||
struct device_node *child;
|
||||
u32 val;
|
||||
int err;
|
||||
@@ -414,8 +413,7 @@ static int rt3883_pci_probe(struct platform_device *pdev)
|
||||
if (!rpc)
|
||||
return -ENOMEM;
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
rpc->base = devm_ioremap_resource(dev, res);
|
||||
rpc->base = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (IS_ERR(rpc->base))
|
||||
return PTR_ERR(rpc->base);
|
||||
|
||||
|
||||
+68
-29
@@ -25,6 +25,7 @@
|
||||
#define MT7621_MEM_TEST_PATTERN 0xaa5555aa
|
||||
|
||||
static u32 detect_magic __initdata;
|
||||
static struct ralink_soc_info *soc_info_ptr;
|
||||
|
||||
int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge)
|
||||
{
|
||||
@@ -97,41 +98,83 @@ void __init ralink_of_remap(void)
|
||||
panic("Failed to remap core resources");
|
||||
}
|
||||
|
||||
static void soc_dev_init(struct ralink_soc_info *soc_info, u32 rev)
|
||||
static unsigned int __init mt7621_get_soc_name0(void)
|
||||
{
|
||||
return __raw_readl(MT7621_SYSC_BASE + SYSC_REG_CHIP_NAME0);
|
||||
}
|
||||
|
||||
static unsigned int __init mt7621_get_soc_name1(void)
|
||||
{
|
||||
return __raw_readl(MT7621_SYSC_BASE + SYSC_REG_CHIP_NAME1);
|
||||
}
|
||||
|
||||
static bool __init mt7621_soc_valid(void)
|
||||
{
|
||||
if (mt7621_get_soc_name0() == MT7621_CHIP_NAME0 &&
|
||||
mt7621_get_soc_name1() == MT7621_CHIP_NAME1)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
static const char __init *mt7621_get_soc_id(void)
|
||||
{
|
||||
if (mt7621_soc_valid())
|
||||
return "MT7621";
|
||||
else
|
||||
return "invalid";
|
||||
}
|
||||
|
||||
static unsigned int __init mt7621_get_soc_rev(void)
|
||||
{
|
||||
return __raw_readl(MT7621_SYSC_BASE + SYSC_REG_CHIP_REV);
|
||||
}
|
||||
|
||||
static unsigned int __init mt7621_get_soc_ver(void)
|
||||
{
|
||||
return (mt7621_get_soc_rev() >> CHIP_REV_VER_SHIFT) & CHIP_REV_VER_MASK;
|
||||
}
|
||||
|
||||
static unsigned int __init mt7621_get_soc_eco(void)
|
||||
{
|
||||
return (mt7621_get_soc_rev() & CHIP_REV_ECO_MASK);
|
||||
}
|
||||
|
||||
static const char __init *mt7621_get_soc_revision(void)
|
||||
{
|
||||
if (mt7621_get_soc_rev() == 1 && mt7621_get_soc_eco() == 1)
|
||||
return "E2";
|
||||
else
|
||||
return "E1";
|
||||
}
|
||||
|
||||
static int __init mt7621_soc_dev_init(void)
|
||||
{
|
||||
struct soc_device *soc_dev;
|
||||
struct soc_device_attribute *soc_dev_attr;
|
||||
|
||||
soc_dev_attr = kzalloc(sizeof(*soc_dev_attr), GFP_KERNEL);
|
||||
if (!soc_dev_attr)
|
||||
return;
|
||||
return -ENOMEM;
|
||||
|
||||
soc_dev_attr->soc_id = "mt7621";
|
||||
soc_dev_attr->family = "Ralink";
|
||||
soc_dev_attr->revision = mt7621_get_soc_revision();
|
||||
|
||||
if (((rev >> CHIP_REV_VER_SHIFT) & CHIP_REV_VER_MASK) == 1 &&
|
||||
(rev & CHIP_REV_ECO_MASK) == 1)
|
||||
soc_dev_attr->revision = "E2";
|
||||
else
|
||||
soc_dev_attr->revision = "E1";
|
||||
|
||||
soc_dev_attr->data = soc_info;
|
||||
soc_dev_attr->data = soc_info_ptr;
|
||||
|
||||
soc_dev = soc_device_register(soc_dev_attr);
|
||||
if (IS_ERR(soc_dev)) {
|
||||
kfree(soc_dev_attr);
|
||||
return;
|
||||
return PTR_ERR(soc_dev);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
device_initcall(mt7621_soc_dev_init);
|
||||
|
||||
void __init prom_soc_init(struct ralink_soc_info *soc_info)
|
||||
{
|
||||
void __iomem *sysc = (void __iomem *) KSEG1ADDR(MT7621_SYSC_BASE);
|
||||
unsigned char *name = NULL;
|
||||
u32 n0;
|
||||
u32 n1;
|
||||
u32 rev;
|
||||
|
||||
/* Early detection of CMP support */
|
||||
mips_cm_probe();
|
||||
mips_cpc_probe();
|
||||
@@ -154,27 +197,23 @@ void __init prom_soc_init(struct ralink_soc_info *soc_info)
|
||||
__sync();
|
||||
}
|
||||
|
||||
n0 = __raw_readl(sysc + SYSC_REG_CHIP_NAME0);
|
||||
n1 = __raw_readl(sysc + SYSC_REG_CHIP_NAME1);
|
||||
|
||||
if (n0 == MT7621_CHIP_NAME0 && n1 == MT7621_CHIP_NAME1) {
|
||||
name = "MT7621";
|
||||
if (mt7621_soc_valid())
|
||||
soc_info->compatible = "mediatek,mt7621-soc";
|
||||
} else {
|
||||
panic("mt7621: unknown SoC, n0:%08x n1:%08x\n", n0, n1);
|
||||
}
|
||||
else
|
||||
panic("mt7621: unknown SoC, n0:%08x n1:%08x\n",
|
||||
mt7621_get_soc_name0(),
|
||||
mt7621_get_soc_name1());
|
||||
ralink_soc = MT762X_SOC_MT7621AT;
|
||||
rev = __raw_readl(sysc + SYSC_REG_CHIP_REV);
|
||||
|
||||
snprintf(soc_info->sys_type, RAMIPS_SYS_TYPE_LEN,
|
||||
"MediaTek %s ver:%u eco:%u",
|
||||
name,
|
||||
(rev >> CHIP_REV_VER_SHIFT) & CHIP_REV_VER_MASK,
|
||||
(rev & CHIP_REV_ECO_MASK));
|
||||
mt7621_get_soc_id(),
|
||||
mt7621_get_soc_ver(),
|
||||
mt7621_get_soc_eco());
|
||||
|
||||
soc_info->mem_detect = mt7621_memory_detect;
|
||||
|
||||
soc_dev_init(soc_info, rev);
|
||||
soc_info_ptr = soc_info;
|
||||
|
||||
if (!register_cps_smp_ops())
|
||||
return;
|
||||
|
||||
@@ -71,7 +71,7 @@ KCOV_INSTRUMENT := n
|
||||
|
||||
# Check that we don't have PIC 'jalr t9' calls left
|
||||
quiet_cmd_vdso_mips_check = VDSOCHK $@
|
||||
cmd_vdso_mips_check = if $(OBJDUMP) --disassemble $@ | egrep -h "jalr.*t9" > /dev/null; \
|
||||
cmd_vdso_mips_check = if $(OBJDUMP) --disassemble $@ | grep -E -h "jalr.*t9" > /dev/null; \
|
||||
then (echo >&2 "$@: PIC 'jalr t9' calls are not supported"; \
|
||||
rm -f $@; /bin/false); fi
|
||||
|
||||
|
||||
@@ -26,6 +26,10 @@ config GENERIC_BUG
|
||||
config GENERIC_BUG_RELATIVE_POINTERS
|
||||
def_bool y
|
||||
|
||||
config GENERIC_CSUM
|
||||
bool
|
||||
default y if KASAN
|
||||
|
||||
config GENERIC_LOCKBREAK
|
||||
def_bool y if PREEMPTION
|
||||
|
||||
@@ -122,6 +126,7 @@ config S390
|
||||
select ARCH_WANTS_NO_INSTR
|
||||
select ARCH_WANT_DEFAULT_BPF_JIT
|
||||
select ARCH_WANT_IPC_PARSE_VERSION
|
||||
select ARCH_WANT_HUGETLB_PAGE_OPTIMIZE_VMEMMAP
|
||||
select BUILDTIME_TABLE_SORT
|
||||
select CLONE_BACKWARDS2
|
||||
select DMA_OPS if PCI
|
||||
@@ -197,6 +202,7 @@ config S390
|
||||
select HAVE_RSEQ
|
||||
select HAVE_SAMPLE_FTRACE_DIRECT
|
||||
select HAVE_SAMPLE_FTRACE_DIRECT_MULTI
|
||||
select HAVE_SETUP_PER_CPU_AREA
|
||||
select HAVE_SOFTIRQ_ON_OWN_STACK
|
||||
select HAVE_SYSCALL_TRACEPOINTS
|
||||
select HAVE_VIRT_CPU_ACCOUNTING
|
||||
@@ -208,6 +214,7 @@ config S390
|
||||
select MMU_GATHER_MERGE_VMAS
|
||||
select MODULES_USE_ELF_RELA
|
||||
select NEED_DMA_MAP_STATE if PCI
|
||||
select NEED_PER_CPU_EMBED_FIRST_CHUNK
|
||||
select NEED_SG_DMA_LENGTH if PCI
|
||||
select OLD_SIGACTION
|
||||
select OLD_SIGSUSPEND3
|
||||
|
||||
@@ -26,8 +26,6 @@
|
||||
#include <linux/notifier.h>
|
||||
#include <linux/cpu.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/suspend.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <asm/appldata.h>
|
||||
#include <asm/vtimer.h>
|
||||
#include <linux/uaccess.h>
|
||||
@@ -44,8 +42,6 @@
|
||||
#define TOD_MICRO 0x01000 /* nr. of TOD clock units
|
||||
for 1 microsecond */
|
||||
|
||||
static struct platform_device *appldata_pdev;
|
||||
|
||||
/*
|
||||
* /proc entries (sysctl)
|
||||
*/
|
||||
@@ -88,7 +84,6 @@ static struct vtimer_list appldata_timer;
|
||||
static DEFINE_SPINLOCK(appldata_timer_lock);
|
||||
static int appldata_interval = APPLDATA_CPU_INTERVAL;
|
||||
static int appldata_timer_active;
|
||||
static int appldata_timer_suspended = 0;
|
||||
|
||||
/*
|
||||
* Work queue
|
||||
@@ -412,88 +407,6 @@ void appldata_unregister_ops(struct appldata_ops *ops)
|
||||
/********************** module-ops management <END> **************************/
|
||||
|
||||
|
||||
/**************************** suspend / resume *******************************/
|
||||
static int appldata_freeze(struct device *dev)
|
||||
{
|
||||
struct appldata_ops *ops;
|
||||
int rc;
|
||||
struct list_head *lh;
|
||||
|
||||
spin_lock(&appldata_timer_lock);
|
||||
if (appldata_timer_active) {
|
||||
__appldata_vtimer_setup(APPLDATA_DEL_TIMER);
|
||||
appldata_timer_suspended = 1;
|
||||
}
|
||||
spin_unlock(&appldata_timer_lock);
|
||||
|
||||
mutex_lock(&appldata_ops_mutex);
|
||||
list_for_each(lh, &appldata_ops_list) {
|
||||
ops = list_entry(lh, struct appldata_ops, list);
|
||||
if (ops->active == 1) {
|
||||
rc = appldata_diag(ops->record_nr, APPLDATA_STOP_REC,
|
||||
(unsigned long) ops->data, ops->size,
|
||||
ops->mod_lvl);
|
||||
if (rc != 0)
|
||||
pr_err("Stopping the data collection for %s "
|
||||
"failed with rc=%d\n", ops->name, rc);
|
||||
}
|
||||
}
|
||||
mutex_unlock(&appldata_ops_mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int appldata_restore(struct device *dev)
|
||||
{
|
||||
struct appldata_ops *ops;
|
||||
int rc;
|
||||
struct list_head *lh;
|
||||
|
||||
spin_lock(&appldata_timer_lock);
|
||||
if (appldata_timer_suspended) {
|
||||
__appldata_vtimer_setup(APPLDATA_ADD_TIMER);
|
||||
appldata_timer_suspended = 0;
|
||||
}
|
||||
spin_unlock(&appldata_timer_lock);
|
||||
|
||||
mutex_lock(&appldata_ops_mutex);
|
||||
list_for_each(lh, &appldata_ops_list) {
|
||||
ops = list_entry(lh, struct appldata_ops, list);
|
||||
if (ops->active == 1) {
|
||||
ops->callback(ops->data); // init record
|
||||
rc = appldata_diag(ops->record_nr,
|
||||
APPLDATA_START_INTERVAL_REC,
|
||||
(unsigned long) ops->data, ops->size,
|
||||
ops->mod_lvl);
|
||||
if (rc != 0) {
|
||||
pr_err("Starting the data collection for %s "
|
||||
"failed with rc=%d\n", ops->name, rc);
|
||||
}
|
||||
}
|
||||
}
|
||||
mutex_unlock(&appldata_ops_mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int appldata_thaw(struct device *dev)
|
||||
{
|
||||
return appldata_restore(dev);
|
||||
}
|
||||
|
||||
static const struct dev_pm_ops appldata_pm_ops = {
|
||||
.freeze = appldata_freeze,
|
||||
.thaw = appldata_thaw,
|
||||
.restore = appldata_restore,
|
||||
};
|
||||
|
||||
static struct platform_driver appldata_pdrv = {
|
||||
.driver = {
|
||||
.name = "appldata",
|
||||
.pm = &appldata_pm_ops,
|
||||
},
|
||||
};
|
||||
/************************* suspend / resume <END> ****************************/
|
||||
|
||||
|
||||
/******************************* init / exit *********************************/
|
||||
|
||||
/*
|
||||
@@ -503,36 +416,14 @@ static struct platform_driver appldata_pdrv = {
|
||||
*/
|
||||
static int __init appldata_init(void)
|
||||
{
|
||||
int rc;
|
||||
|
||||
init_virt_timer(&appldata_timer);
|
||||
appldata_timer.function = appldata_timer_function;
|
||||
appldata_timer.data = (unsigned long) &appldata_work;
|
||||
|
||||
rc = platform_driver_register(&appldata_pdrv);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
appldata_pdev = platform_device_register_simple("appldata", -1, NULL,
|
||||
0);
|
||||
if (IS_ERR(appldata_pdev)) {
|
||||
rc = PTR_ERR(appldata_pdev);
|
||||
goto out_driver;
|
||||
}
|
||||
appldata_wq = alloc_ordered_workqueue("appldata", 0);
|
||||
if (!appldata_wq) {
|
||||
rc = -ENOMEM;
|
||||
goto out_device;
|
||||
}
|
||||
|
||||
if (!appldata_wq)
|
||||
return -ENOMEM;
|
||||
appldata_sysctl_header = register_sysctl_table(appldata_dir_table);
|
||||
return 0;
|
||||
|
||||
out_device:
|
||||
platform_device_unregister(appldata_pdev);
|
||||
out_driver:
|
||||
platform_driver_unregister(&appldata_pdrv);
|
||||
return rc;
|
||||
}
|
||||
|
||||
__initcall(appldata_init);
|
||||
|
||||
@@ -77,6 +77,9 @@ bool is_ipl_block_dump(void)
|
||||
if (ipl_block.pb0_hdr.pbt == IPL_PBT_NVME &&
|
||||
ipl_block.nvme.opt == IPL_PB0_NVME_OPT_DUMP)
|
||||
return true;
|
||||
if (ipl_block.pb0_hdr.pbt == IPL_PBT_ECKD &&
|
||||
ipl_block.eckd.opt == IPL_PB0_ECKD_OPT_DUMP)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -108,6 +111,11 @@ static size_t ipl_block_get_ascii_scpdata(char *dest, size_t size,
|
||||
scp_data_len = ipb->nvme.scp_data_len;
|
||||
scp_data = ipb->nvme.scp_data;
|
||||
break;
|
||||
case IPL_PBT_ECKD:
|
||||
scp_data_len = ipb->eckd.scp_data_len;
|
||||
scp_data = ipb->eckd.scp_data;
|
||||
break;
|
||||
|
||||
default:
|
||||
goto out;
|
||||
}
|
||||
@@ -153,6 +161,7 @@ static void append_ipl_block_parm(void)
|
||||
break;
|
||||
case IPL_PBT_FCP:
|
||||
case IPL_PBT_NVME:
|
||||
case IPL_PBT_ECKD:
|
||||
rc = ipl_block_get_ascii_scpdata(
|
||||
parm, COMMAND_LINE_SIZE - len - 1, &ipl_block);
|
||||
break;
|
||||
|
||||
@@ -68,14 +68,6 @@ static inline __u8 info_blk_hdr__flags(enum diag204_format type, void *hdr)
|
||||
return ((struct diag204_x_info_blk_hdr *)hdr)->flags;
|
||||
}
|
||||
|
||||
static inline __u16 info_blk_hdr__pcpus(enum diag204_format type, void *hdr)
|
||||
{
|
||||
if (type == DIAG204_INFO_SIMPLE)
|
||||
return ((struct diag204_info_blk_hdr *)hdr)->phys_cpus;
|
||||
else /* DIAG204_INFO_EXT */
|
||||
return ((struct diag204_x_info_blk_hdr *)hdr)->phys_cpus;
|
||||
}
|
||||
|
||||
/* Partition header */
|
||||
|
||||
static inline int part_hdr__size(enum diag204_format type)
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* S390 version
|
||||
* Copyright IBM Corp. 1999
|
||||
* Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com)
|
||||
*
|
||||
* Derived from "include/asm-i386/bugs.h"
|
||||
* Copyright (C) 1994 Linus Torvalds
|
||||
*/
|
||||
|
||||
/*
|
||||
* This is included by init/main.c to check for architecture-dependent bugs.
|
||||
*
|
||||
* Needs:
|
||||
* void check_bugs(void);
|
||||
*/
|
||||
|
||||
static inline void check_bugs(void)
|
||||
{
|
||||
/* s390 has no bugs ... */
|
||||
}
|
||||
@@ -12,6 +12,12 @@
|
||||
#ifndef _S390_CHECKSUM_H
|
||||
#define _S390_CHECKSUM_H
|
||||
|
||||
#ifdef CONFIG_GENERIC_CSUM
|
||||
|
||||
#include <asm-generic/checksum.h>
|
||||
|
||||
#else /* CONFIG_GENERIC_CSUM */
|
||||
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/in6.h>
|
||||
|
||||
@@ -129,4 +135,5 @@ static inline __sum16 csum_ipv6_magic(const struct in6_addr *saddr,
|
||||
return csum_fold((__force __wsum)(sum >> 32));
|
||||
}
|
||||
|
||||
#endif /* CONFIG_GENERIC_CSUM */
|
||||
#endif /* _S390_CHECKSUM_H */
|
||||
|
||||
@@ -22,6 +22,7 @@ struct ipl_parameter_block {
|
||||
struct ipl_pb0_common common;
|
||||
struct ipl_pb0_fcp fcp;
|
||||
struct ipl_pb0_ccw ccw;
|
||||
struct ipl_pb0_eckd eckd;
|
||||
struct ipl_pb0_nvme nvme;
|
||||
char raw[PAGE_SIZE - sizeof(struct ipl_pl_hdr)];
|
||||
};
|
||||
@@ -41,6 +42,10 @@ struct ipl_parameter_block {
|
||||
sizeof(struct ipl_pb0_ccw))
|
||||
#define IPL_BP0_CCW_LEN (sizeof(struct ipl_pb0_ccw))
|
||||
|
||||
#define IPL_BP_ECKD_LEN (sizeof(struct ipl_pl_hdr) + \
|
||||
sizeof(struct ipl_pb0_eckd))
|
||||
#define IPL_BP0_ECKD_LEN (sizeof(struct ipl_pb0_eckd))
|
||||
|
||||
#define IPL_MAX_SUPPORTED_VERSION (0)
|
||||
|
||||
#define IPL_RB_CERT_UNKNOWN ((unsigned short)-1)
|
||||
@@ -68,6 +73,8 @@ enum ipl_type {
|
||||
IPL_TYPE_NSS = 16,
|
||||
IPL_TYPE_NVME = 32,
|
||||
IPL_TYPE_NVME_DUMP = 64,
|
||||
IPL_TYPE_ECKD = 128,
|
||||
IPL_TYPE_ECKD_DUMP = 256,
|
||||
};
|
||||
|
||||
struct ipl_info
|
||||
@@ -77,6 +84,9 @@ struct ipl_info
|
||||
struct {
|
||||
struct ccw_dev_id dev_id;
|
||||
} ccw;
|
||||
struct {
|
||||
struct ccw_dev_id dev_id;
|
||||
} eckd;
|
||||
struct {
|
||||
struct ccw_dev_id dev_id;
|
||||
u64 wwpn;
|
||||
@@ -99,6 +109,7 @@ extern void set_os_info_reipl_block(void);
|
||||
static inline bool is_ipl_type_dump(void)
|
||||
{
|
||||
return (ipl_info.type == IPL_TYPE_FCP_DUMP) ||
|
||||
(ipl_info.type == IPL_TYPE_ECKD_DUMP) ||
|
||||
(ipl_info.type == IPL_TYPE_NVME_DUMP);
|
||||
}
|
||||
|
||||
|
||||
@@ -75,4 +75,10 @@ static __always_inline void pai_kernel_exit(struct pt_regs *regs)
|
||||
WRITE_ONCE(S390_lowcore.ccd, S390_lowcore.ccd & ~PAI_CRYPTO_KERNEL_OFFSET);
|
||||
}
|
||||
|
||||
enum paievt_mode {
|
||||
PAI_MODE_NONE,
|
||||
PAI_MODE_SAMPLING,
|
||||
PAI_MODE_COUNTING,
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -87,6 +87,7 @@ struct sclp_info {
|
||||
unsigned char has_gisaf : 1;
|
||||
unsigned char has_diag318 : 1;
|
||||
unsigned char has_sipl : 1;
|
||||
unsigned char has_sipl_eckd : 1;
|
||||
unsigned char has_dirq : 1;
|
||||
unsigned char has_iplcc : 1;
|
||||
unsigned char has_zpci_lsi : 1;
|
||||
@@ -131,6 +132,7 @@ void sclp_early_get_ipl_info(struct sclp_ipl_info *info);
|
||||
void sclp_early_detect(void);
|
||||
void sclp_early_printk(const char *s);
|
||||
void __sclp_early_printk(const char *s, unsigned int len);
|
||||
void sclp_emergency_printk(const char *s);
|
||||
|
||||
int sclp_early_get_memsize(unsigned long *mem);
|
||||
int sclp_early_get_hsa_size(unsigned long *hsa_size);
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef _ASM_S390_SERIAL_H
|
||||
#define _ASM_S390_SERIAL_H
|
||||
|
||||
#define BASE_BAUD 0
|
||||
|
||||
#endif /* _ASM_S390_SERIAL_H */
|
||||
@@ -1,12 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* S390 version
|
||||
*
|
||||
* Derived from "include/asm-i386/shmparam.h"
|
||||
*/
|
||||
#ifndef _ASM_S390_SHMPARAM_H
|
||||
#define _ASM_S390_SHMPARAM_H
|
||||
|
||||
#define SHMLBA PAGE_SIZE /* attach addr a multiple of this */
|
||||
|
||||
#endif /* _ASM_S390_SHMPARAM_H */
|
||||
@@ -1,7 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef _ASM_S390_VGA_H
|
||||
#define _ASM_S390_VGA_H
|
||||
|
||||
/* Avoid compile errors due to missing asm/vga.h */
|
||||
|
||||
#endif /* _ASM_S390_VGA_H */
|
||||
@@ -0,0 +1,681 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Support for Vector Instructions
|
||||
*
|
||||
* Assembler macros to generate .byte/.word code for particular
|
||||
* vector instructions that are supported by recent binutils (>= 2.26) only.
|
||||
*
|
||||
* Copyright IBM Corp. 2015
|
||||
* Author(s): Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
|
||||
*/
|
||||
|
||||
#ifndef __ASM_S390_VX_INSN_INTERNAL_H
|
||||
#define __ASM_S390_VX_INSN_INTERNAL_H
|
||||
|
||||
#ifndef __ASM_S390_VX_INSN_H
|
||||
#error only <asm/vx-insn.h> can be included directly
|
||||
#endif
|
||||
|
||||
#ifdef __ASSEMBLY__
|
||||
|
||||
/* Macros to generate vector instruction byte code */
|
||||
|
||||
/* GR_NUM - Retrieve general-purpose register number
|
||||
*
|
||||
* @opd: Operand to store register number
|
||||
* @r64: String designation register in the format "%rN"
|
||||
*/
|
||||
.macro GR_NUM opd gr
|
||||
\opd = 255
|
||||
.ifc \gr,%r0
|
||||
\opd = 0
|
||||
.endif
|
||||
.ifc \gr,%r1
|
||||
\opd = 1
|
||||
.endif
|
||||
.ifc \gr,%r2
|
||||
\opd = 2
|
||||
.endif
|
||||
.ifc \gr,%r3
|
||||
\opd = 3
|
||||
.endif
|
||||
.ifc \gr,%r4
|
||||
\opd = 4
|
||||
.endif
|
||||
.ifc \gr,%r5
|
||||
\opd = 5
|
||||
.endif
|
||||
.ifc \gr,%r6
|
||||
\opd = 6
|
||||
.endif
|
||||
.ifc \gr,%r7
|
||||
\opd = 7
|
||||
.endif
|
||||
.ifc \gr,%r8
|
||||
\opd = 8
|
||||
.endif
|
||||
.ifc \gr,%r9
|
||||
\opd = 9
|
||||
.endif
|
||||
.ifc \gr,%r10
|
||||
\opd = 10
|
||||
.endif
|
||||
.ifc \gr,%r11
|
||||
\opd = 11
|
||||
.endif
|
||||
.ifc \gr,%r12
|
||||
\opd = 12
|
||||
.endif
|
||||
.ifc \gr,%r13
|
||||
\opd = 13
|
||||
.endif
|
||||
.ifc \gr,%r14
|
||||
\opd = 14
|
||||
.endif
|
||||
.ifc \gr,%r15
|
||||
\opd = 15
|
||||
.endif
|
||||
.if \opd == 255
|
||||
\opd = \gr
|
||||
.endif
|
||||
.endm
|
||||
|
||||
/* VX_NUM - Retrieve vector register number
|
||||
*
|
||||
* @opd: Operand to store register number
|
||||
* @vxr: String designation register in the format "%vN"
|
||||
*
|
||||
* The vector register number is used for as input number to the
|
||||
* instruction and, as well as, to compute the RXB field of the
|
||||
* instruction.
|
||||
*/
|
||||
.macro VX_NUM opd vxr
|
||||
\opd = 255
|
||||
.ifc \vxr,%v0
|
||||
\opd = 0
|
||||
.endif
|
||||
.ifc \vxr,%v1
|
||||
\opd = 1
|
||||
.endif
|
||||
.ifc \vxr,%v2
|
||||
\opd = 2
|
||||
.endif
|
||||
.ifc \vxr,%v3
|
||||
\opd = 3
|
||||
.endif
|
||||
.ifc \vxr,%v4
|
||||
\opd = 4
|
||||
.endif
|
||||
.ifc \vxr,%v5
|
||||
\opd = 5
|
||||
.endif
|
||||
.ifc \vxr,%v6
|
||||
\opd = 6
|
||||
.endif
|
||||
.ifc \vxr,%v7
|
||||
\opd = 7
|
||||
.endif
|
||||
.ifc \vxr,%v8
|
||||
\opd = 8
|
||||
.endif
|
||||
.ifc \vxr,%v9
|
||||
\opd = 9
|
||||
.endif
|
||||
.ifc \vxr,%v10
|
||||
\opd = 10
|
||||
.endif
|
||||
.ifc \vxr,%v11
|
||||
\opd = 11
|
||||
.endif
|
||||
.ifc \vxr,%v12
|
||||
\opd = 12
|
||||
.endif
|
||||
.ifc \vxr,%v13
|
||||
\opd = 13
|
||||
.endif
|
||||
.ifc \vxr,%v14
|
||||
\opd = 14
|
||||
.endif
|
||||
.ifc \vxr,%v15
|
||||
\opd = 15
|
||||
.endif
|
||||
.ifc \vxr,%v16
|
||||
\opd = 16
|
||||
.endif
|
||||
.ifc \vxr,%v17
|
||||
\opd = 17
|
||||
.endif
|
||||
.ifc \vxr,%v18
|
||||
\opd = 18
|
||||
.endif
|
||||
.ifc \vxr,%v19
|
||||
\opd = 19
|
||||
.endif
|
||||
.ifc \vxr,%v20
|
||||
\opd = 20
|
||||
.endif
|
||||
.ifc \vxr,%v21
|
||||
\opd = 21
|
||||
.endif
|
||||
.ifc \vxr,%v22
|
||||
\opd = 22
|
||||
.endif
|
||||
.ifc \vxr,%v23
|
||||
\opd = 23
|
||||
.endif
|
||||
.ifc \vxr,%v24
|
||||
\opd = 24
|
||||
.endif
|
||||
.ifc \vxr,%v25
|
||||
\opd = 25
|
||||
.endif
|
||||
.ifc \vxr,%v26
|
||||
\opd = 26
|
||||
.endif
|
||||
.ifc \vxr,%v27
|
||||
\opd = 27
|
||||
.endif
|
||||
.ifc \vxr,%v28
|
||||
\opd = 28
|
||||
.endif
|
||||
.ifc \vxr,%v29
|
||||
\opd = 29
|
||||
.endif
|
||||
.ifc \vxr,%v30
|
||||
\opd = 30
|
||||
.endif
|
||||
.ifc \vxr,%v31
|
||||
\opd = 31
|
||||
.endif
|
||||
.if \opd == 255
|
||||
\opd = \vxr
|
||||
.endif
|
||||
.endm
|
||||
|
||||
/* RXB - Compute most significant bit used vector registers
|
||||
*
|
||||
* @rxb: Operand to store computed RXB value
|
||||
* @v1: First vector register designated operand
|
||||
* @v2: Second vector register designated operand
|
||||
* @v3: Third vector register designated operand
|
||||
* @v4: Fourth vector register designated operand
|
||||
*/
|
||||
.macro RXB rxb v1 v2=0 v3=0 v4=0
|
||||
\rxb = 0
|
||||
.if \v1 & 0x10
|
||||
\rxb = \rxb | 0x08
|
||||
.endif
|
||||
.if \v2 & 0x10
|
||||
\rxb = \rxb | 0x04
|
||||
.endif
|
||||
.if \v3 & 0x10
|
||||
\rxb = \rxb | 0x02
|
||||
.endif
|
||||
.if \v4 & 0x10
|
||||
\rxb = \rxb | 0x01
|
||||
.endif
|
||||
.endm
|
||||
|
||||
/* MRXB - Generate Element Size Control and RXB value
|
||||
*
|
||||
* @m: Element size control
|
||||
* @v1: First vector register designated operand (for RXB)
|
||||
* @v2: Second vector register designated operand (for RXB)
|
||||
* @v3: Third vector register designated operand (for RXB)
|
||||
* @v4: Fourth vector register designated operand (for RXB)
|
||||
*/
|
||||
.macro MRXB m v1 v2=0 v3=0 v4=0
|
||||
rxb = 0
|
||||
RXB rxb, \v1, \v2, \v3, \v4
|
||||
.byte (\m << 4) | rxb
|
||||
.endm
|
||||
|
||||
/* MRXBOPC - Generate Element Size Control, RXB, and final Opcode fields
|
||||
*
|
||||
* @m: Element size control
|
||||
* @opc: Opcode
|
||||
* @v1: First vector register designated operand (for RXB)
|
||||
* @v2: Second vector register designated operand (for RXB)
|
||||
* @v3: Third vector register designated operand (for RXB)
|
||||
* @v4: Fourth vector register designated operand (for RXB)
|
||||
*/
|
||||
.macro MRXBOPC m opc v1 v2=0 v3=0 v4=0
|
||||
MRXB \m, \v1, \v2, \v3, \v4
|
||||
.byte \opc
|
||||
.endm
|
||||
|
||||
/* Vector support instructions */
|
||||
|
||||
/* VECTOR GENERATE BYTE MASK */
|
||||
.macro VGBM vr imm2
|
||||
VX_NUM v1, \vr
|
||||
.word (0xE700 | ((v1&15) << 4))
|
||||
.word \imm2
|
||||
MRXBOPC 0, 0x44, v1
|
||||
.endm
|
||||
.macro VZERO vxr
|
||||
VGBM \vxr, 0
|
||||
.endm
|
||||
.macro VONE vxr
|
||||
VGBM \vxr, 0xFFFF
|
||||
.endm
|
||||
|
||||
/* VECTOR LOAD VR ELEMENT FROM GR */
|
||||
.macro VLVG v, gr, disp, m
|
||||
VX_NUM v1, \v
|
||||
GR_NUM b2, "%r0"
|
||||
GR_NUM r3, \gr
|
||||
.word 0xE700 | ((v1&15) << 4) | r3
|
||||
.word (b2 << 12) | (\disp)
|
||||
MRXBOPC \m, 0x22, v1
|
||||
.endm
|
||||
.macro VLVGB v, gr, index, base
|
||||
VLVG \v, \gr, \index, \base, 0
|
||||
.endm
|
||||
.macro VLVGH v, gr, index
|
||||
VLVG \v, \gr, \index, 1
|
||||
.endm
|
||||
.macro VLVGF v, gr, index
|
||||
VLVG \v, \gr, \index, 2
|
||||
.endm
|
||||
.macro VLVGG v, gr, index
|
||||
VLVG \v, \gr, \index, 3
|
||||
.endm
|
||||
|
||||
/* VECTOR LOAD REGISTER */
|
||||
.macro VLR v1, v2
|
||||
VX_NUM v1, \v1
|
||||
VX_NUM v2, \v2
|
||||
.word 0xE700 | ((v1&15) << 4) | (v2&15)
|
||||
.word 0
|
||||
MRXBOPC 0, 0x56, v1, v2
|
||||
.endm
|
||||
|
||||
/* VECTOR LOAD */
|
||||
.macro VL v, disp, index="%r0", base
|
||||
VX_NUM v1, \v
|
||||
GR_NUM x2, \index
|
||||
GR_NUM b2, \base
|
||||
.word 0xE700 | ((v1&15) << 4) | x2
|
||||
.word (b2 << 12) | (\disp)
|
||||
MRXBOPC 0, 0x06, v1
|
||||
.endm
|
||||
|
||||
/* VECTOR LOAD ELEMENT */
|
||||
.macro VLEx vr1, disp, index="%r0", base, m3, opc
|
||||
VX_NUM v1, \vr1
|
||||
GR_NUM x2, \index
|
||||
GR_NUM b2, \base
|
||||
.word 0xE700 | ((v1&15) << 4) | x2
|
||||
.word (b2 << 12) | (\disp)
|
||||
MRXBOPC \m3, \opc, v1
|
||||
.endm
|
||||
.macro VLEB vr1, disp, index="%r0", base, m3
|
||||
VLEx \vr1, \disp, \index, \base, \m3, 0x00
|
||||
.endm
|
||||
.macro VLEH vr1, disp, index="%r0", base, m3
|
||||
VLEx \vr1, \disp, \index, \base, \m3, 0x01
|
||||
.endm
|
||||
.macro VLEF vr1, disp, index="%r0", base, m3
|
||||
VLEx \vr1, \disp, \index, \base, \m3, 0x03
|
||||
.endm
|
||||
.macro VLEG vr1, disp, index="%r0", base, m3
|
||||
VLEx \vr1, \disp, \index, \base, \m3, 0x02
|
||||
.endm
|
||||
|
||||
/* VECTOR LOAD ELEMENT IMMEDIATE */
|
||||
.macro VLEIx vr1, imm2, m3, opc
|
||||
VX_NUM v1, \vr1
|
||||
.word 0xE700 | ((v1&15) << 4)
|
||||
.word \imm2
|
||||
MRXBOPC \m3, \opc, v1
|
||||
.endm
|
||||
.macro VLEIB vr1, imm2, index
|
||||
VLEIx \vr1, \imm2, \index, 0x40
|
||||
.endm
|
||||
.macro VLEIH vr1, imm2, index
|
||||
VLEIx \vr1, \imm2, \index, 0x41
|
||||
.endm
|
||||
.macro VLEIF vr1, imm2, index
|
||||
VLEIx \vr1, \imm2, \index, 0x43
|
||||
.endm
|
||||
.macro VLEIG vr1, imm2, index
|
||||
VLEIx \vr1, \imm2, \index, 0x42
|
||||
.endm
|
||||
|
||||
/* VECTOR LOAD GR FROM VR ELEMENT */
|
||||
.macro VLGV gr, vr, disp, base="%r0", m
|
||||
GR_NUM r1, \gr
|
||||
GR_NUM b2, \base
|
||||
VX_NUM v3, \vr
|
||||
.word 0xE700 | (r1 << 4) | (v3&15)
|
||||
.word (b2 << 12) | (\disp)
|
||||
MRXBOPC \m, 0x21, v3
|
||||
.endm
|
||||
.macro VLGVB gr, vr, disp, base="%r0"
|
||||
VLGV \gr, \vr, \disp, \base, 0
|
||||
.endm
|
||||
.macro VLGVH gr, vr, disp, base="%r0"
|
||||
VLGV \gr, \vr, \disp, \base, 1
|
||||
.endm
|
||||
.macro VLGVF gr, vr, disp, base="%r0"
|
||||
VLGV \gr, \vr, \disp, \base, 2
|
||||
.endm
|
||||
.macro VLGVG gr, vr, disp, base="%r0"
|
||||
VLGV \gr, \vr, \disp, \base, 3
|
||||
.endm
|
||||
|
||||
/* VECTOR LOAD MULTIPLE */
|
||||
.macro VLM vfrom, vto, disp, base, hint=3
|
||||
VX_NUM v1, \vfrom
|
||||
VX_NUM v3, \vto
|
||||
GR_NUM b2, \base
|
||||
.word 0xE700 | ((v1&15) << 4) | (v3&15)
|
||||
.word (b2 << 12) | (\disp)
|
||||
MRXBOPC \hint, 0x36, v1, v3
|
||||
.endm
|
||||
|
||||
/* VECTOR STORE */
|
||||
.macro VST vr1, disp, index="%r0", base
|
||||
VX_NUM v1, \vr1
|
||||
GR_NUM x2, \index
|
||||
GR_NUM b2, \base
|
||||
.word 0xE700 | ((v1&15) << 4) | (x2&15)
|
||||
.word (b2 << 12) | (\disp)
|
||||
MRXBOPC 0, 0x0E, v1
|
||||
.endm
|
||||
|
||||
/* VECTOR STORE MULTIPLE */
|
||||
.macro VSTM vfrom, vto, disp, base, hint=3
|
||||
VX_NUM v1, \vfrom
|
||||
VX_NUM v3, \vto
|
||||
GR_NUM b2, \base
|
||||
.word 0xE700 | ((v1&15) << 4) | (v3&15)
|
||||
.word (b2 << 12) | (\disp)
|
||||
MRXBOPC \hint, 0x3E, v1, v3
|
||||
.endm
|
||||
|
||||
/* VECTOR PERMUTE */
|
||||
.macro VPERM vr1, vr2, vr3, vr4
|
||||
VX_NUM v1, \vr1
|
||||
VX_NUM v2, \vr2
|
||||
VX_NUM v3, \vr3
|
||||
VX_NUM v4, \vr4
|
||||
.word 0xE700 | ((v1&15) << 4) | (v2&15)
|
||||
.word ((v3&15) << 12)
|
||||
MRXBOPC (v4&15), 0x8C, v1, v2, v3, v4
|
||||
.endm
|
||||
|
||||
/* VECTOR UNPACK LOGICAL LOW */
|
||||
.macro VUPLL vr1, vr2, m3
|
||||
VX_NUM v1, \vr1
|
||||
VX_NUM v2, \vr2
|
||||
.word 0xE700 | ((v1&15) << 4) | (v2&15)
|
||||
.word 0x0000
|
||||
MRXBOPC \m3, 0xD4, v1, v2
|
||||
.endm
|
||||
.macro VUPLLB vr1, vr2
|
||||
VUPLL \vr1, \vr2, 0
|
||||
.endm
|
||||
.macro VUPLLH vr1, vr2
|
||||
VUPLL \vr1, \vr2, 1
|
||||
.endm
|
||||
.macro VUPLLF vr1, vr2
|
||||
VUPLL \vr1, \vr2, 2
|
||||
.endm
|
||||
|
||||
/* VECTOR PERMUTE DOUBLEWORD IMMEDIATE */
|
||||
.macro VPDI vr1, vr2, vr3, m4
|
||||
VX_NUM v1, \vr1
|
||||
VX_NUM v2, \vr2
|
||||
VX_NUM v3, \vr3
|
||||
.word 0xE700 | ((v1&15) << 4) | (v2&15)
|
||||
.word ((v3&15) << 12)
|
||||
MRXBOPC \m4, 0x84, v1, v2, v3
|
||||
.endm
|
||||
|
||||
/* VECTOR REPLICATE */
|
||||
.macro VREP vr1, vr3, imm2, m4
|
||||
VX_NUM v1, \vr1
|
||||
VX_NUM v3, \vr3
|
||||
.word 0xE700 | ((v1&15) << 4) | (v3&15)
|
||||
.word \imm2
|
||||
MRXBOPC \m4, 0x4D, v1, v3
|
||||
.endm
|
||||
.macro VREPB vr1, vr3, imm2
|
||||
VREP \vr1, \vr3, \imm2, 0
|
||||
.endm
|
||||
.macro VREPH vr1, vr3, imm2
|
||||
VREP \vr1, \vr3, \imm2, 1
|
||||
.endm
|
||||
.macro VREPF vr1, vr3, imm2
|
||||
VREP \vr1, \vr3, \imm2, 2
|
||||
.endm
|
||||
.macro VREPG vr1, vr3, imm2
|
||||
VREP \vr1, \vr3, \imm2, 3
|
||||
.endm
|
||||
|
||||
/* VECTOR MERGE HIGH */
|
||||
.macro VMRH vr1, vr2, vr3, m4
|
||||
VX_NUM v1, \vr1
|
||||
VX_NUM v2, \vr2
|
||||
VX_NUM v3, \vr3
|
||||
.word 0xE700 | ((v1&15) << 4) | (v2&15)
|
||||
.word ((v3&15) << 12)
|
||||
MRXBOPC \m4, 0x61, v1, v2, v3
|
||||
.endm
|
||||
.macro VMRHB vr1, vr2, vr3
|
||||
VMRH \vr1, \vr2, \vr3, 0
|
||||
.endm
|
||||
.macro VMRHH vr1, vr2, vr3
|
||||
VMRH \vr1, \vr2, \vr3, 1
|
||||
.endm
|
||||
.macro VMRHF vr1, vr2, vr3
|
||||
VMRH \vr1, \vr2, \vr3, 2
|
||||
.endm
|
||||
.macro VMRHG vr1, vr2, vr3
|
||||
VMRH \vr1, \vr2, \vr3, 3
|
||||
.endm
|
||||
|
||||
/* VECTOR MERGE LOW */
|
||||
.macro VMRL vr1, vr2, vr3, m4
|
||||
VX_NUM v1, \vr1
|
||||
VX_NUM v2, \vr2
|
||||
VX_NUM v3, \vr3
|
||||
.word 0xE700 | ((v1&15) << 4) | (v2&15)
|
||||
.word ((v3&15) << 12)
|
||||
MRXBOPC \m4, 0x60, v1, v2, v3
|
||||
.endm
|
||||
.macro VMRLB vr1, vr2, vr3
|
||||
VMRL \vr1, \vr2, \vr3, 0
|
||||
.endm
|
||||
.macro VMRLH vr1, vr2, vr3
|
||||
VMRL \vr1, \vr2, \vr3, 1
|
||||
.endm
|
||||
.macro VMRLF vr1, vr2, vr3
|
||||
VMRL \vr1, \vr2, \vr3, 2
|
||||
.endm
|
||||
.macro VMRLG vr1, vr2, vr3
|
||||
VMRL \vr1, \vr2, \vr3, 3
|
||||
.endm
|
||||
|
||||
|
||||
/* Vector integer instructions */
|
||||
|
||||
/* VECTOR AND */
|
||||
.macro VN vr1, vr2, vr3
|
||||
VX_NUM v1, \vr1
|
||||
VX_NUM v2, \vr2
|
||||
VX_NUM v3, \vr3
|
||||
.word 0xE700 | ((v1&15) << 4) | (v2&15)
|
||||
.word ((v3&15) << 12)
|
||||
MRXBOPC 0, 0x68, v1, v2, v3
|
||||
.endm
|
||||
|
||||
/* VECTOR EXCLUSIVE OR */
|
||||
.macro VX vr1, vr2, vr3
|
||||
VX_NUM v1, \vr1
|
||||
VX_NUM v2, \vr2
|
||||
VX_NUM v3, \vr3
|
||||
.word 0xE700 | ((v1&15) << 4) | (v2&15)
|
||||
.word ((v3&15) << 12)
|
||||
MRXBOPC 0, 0x6D, v1, v2, v3
|
||||
.endm
|
||||
|
||||
/* VECTOR GALOIS FIELD MULTIPLY SUM */
|
||||
.macro VGFM vr1, vr2, vr3, m4
|
||||
VX_NUM v1, \vr1
|
||||
VX_NUM v2, \vr2
|
||||
VX_NUM v3, \vr3
|
||||
.word 0xE700 | ((v1&15) << 4) | (v2&15)
|
||||
.word ((v3&15) << 12)
|
||||
MRXBOPC \m4, 0xB4, v1, v2, v3
|
||||
.endm
|
||||
.macro VGFMB vr1, vr2, vr3
|
||||
VGFM \vr1, \vr2, \vr3, 0
|
||||
.endm
|
||||
.macro VGFMH vr1, vr2, vr3
|
||||
VGFM \vr1, \vr2, \vr3, 1
|
||||
.endm
|
||||
.macro VGFMF vr1, vr2, vr3
|
||||
VGFM \vr1, \vr2, \vr3, 2
|
||||
.endm
|
||||
.macro VGFMG vr1, vr2, vr3
|
||||
VGFM \vr1, \vr2, \vr3, 3
|
||||
.endm
|
||||
|
||||
/* VECTOR GALOIS FIELD MULTIPLY SUM AND ACCUMULATE */
|
||||
.macro VGFMA vr1, vr2, vr3, vr4, m5
|
||||
VX_NUM v1, \vr1
|
||||
VX_NUM v2, \vr2
|
||||
VX_NUM v3, \vr3
|
||||
VX_NUM v4, \vr4
|
||||
.word 0xE700 | ((v1&15) << 4) | (v2&15)
|
||||
.word ((v3&15) << 12) | (\m5 << 8)
|
||||
MRXBOPC (v4&15), 0xBC, v1, v2, v3, v4
|
||||
.endm
|
||||
.macro VGFMAB vr1, vr2, vr3, vr4
|
||||
VGFMA \vr1, \vr2, \vr3, \vr4, 0
|
||||
.endm
|
||||
.macro VGFMAH vr1, vr2, vr3, vr4
|
||||
VGFMA \vr1, \vr2, \vr3, \vr4, 1
|
||||
.endm
|
||||
.macro VGFMAF vr1, vr2, vr3, vr4
|
||||
VGFMA \vr1, \vr2, \vr3, \vr4, 2
|
||||
.endm
|
||||
.macro VGFMAG vr1, vr2, vr3, vr4
|
||||
VGFMA \vr1, \vr2, \vr3, \vr4, 3
|
||||
.endm
|
||||
|
||||
/* VECTOR SHIFT RIGHT LOGICAL BY BYTE */
|
||||
.macro VSRLB vr1, vr2, vr3
|
||||
VX_NUM v1, \vr1
|
||||
VX_NUM v2, \vr2
|
||||
VX_NUM v3, \vr3
|
||||
.word 0xE700 | ((v1&15) << 4) | (v2&15)
|
||||
.word ((v3&15) << 12)
|
||||
MRXBOPC 0, 0x7D, v1, v2, v3
|
||||
.endm
|
||||
|
||||
/* VECTOR REPLICATE IMMEDIATE */
|
||||
.macro VREPI vr1, imm2, m3
|
||||
VX_NUM v1, \vr1
|
||||
.word 0xE700 | ((v1&15) << 4)
|
||||
.word \imm2
|
||||
MRXBOPC \m3, 0x45, v1
|
||||
.endm
|
||||
.macro VREPIB vr1, imm2
|
||||
VREPI \vr1, \imm2, 0
|
||||
.endm
|
||||
.macro VREPIH vr1, imm2
|
||||
VREPI \vr1, \imm2, 1
|
||||
.endm
|
||||
.macro VREPIF vr1, imm2
|
||||
VREPI \vr1, \imm2, 2
|
||||
.endm
|
||||
.macro VREPIG vr1, imm2
|
||||
VREP \vr1, \imm2, 3
|
||||
.endm
|
||||
|
||||
/* VECTOR ADD */
|
||||
.macro VA vr1, vr2, vr3, m4
|
||||
VX_NUM v1, \vr1
|
||||
VX_NUM v2, \vr2
|
||||
VX_NUM v3, \vr3
|
||||
.word 0xE700 | ((v1&15) << 4) | (v2&15)
|
||||
.word ((v3&15) << 12)
|
||||
MRXBOPC \m4, 0xF3, v1, v2, v3
|
||||
.endm
|
||||
.macro VAB vr1, vr2, vr3
|
||||
VA \vr1, \vr2, \vr3, 0
|
||||
.endm
|
||||
.macro VAH vr1, vr2, vr3
|
||||
VA \vr1, \vr2, \vr3, 1
|
||||
.endm
|
||||
.macro VAF vr1, vr2, vr3
|
||||
VA \vr1, \vr2, \vr3, 2
|
||||
.endm
|
||||
.macro VAG vr1, vr2, vr3
|
||||
VA \vr1, \vr2, \vr3, 3
|
||||
.endm
|
||||
.macro VAQ vr1, vr2, vr3
|
||||
VA \vr1, \vr2, \vr3, 4
|
||||
.endm
|
||||
|
||||
/* VECTOR ELEMENT SHIFT RIGHT ARITHMETIC */
|
||||
.macro VESRAV vr1, vr2, vr3, m4
|
||||
VX_NUM v1, \vr1
|
||||
VX_NUM v2, \vr2
|
||||
VX_NUM v3, \vr3
|
||||
.word 0xE700 | ((v1&15) << 4) | (v2&15)
|
||||
.word ((v3&15) << 12)
|
||||
MRXBOPC \m4, 0x7A, v1, v2, v3
|
||||
.endm
|
||||
|
||||
.macro VESRAVB vr1, vr2, vr3
|
||||
VESRAV \vr1, \vr2, \vr3, 0
|
||||
.endm
|
||||
.macro VESRAVH vr1, vr2, vr3
|
||||
VESRAV \vr1, \vr2, \vr3, 1
|
||||
.endm
|
||||
.macro VESRAVF vr1, vr2, vr3
|
||||
VESRAV \vr1, \vr2, \vr3, 2
|
||||
.endm
|
||||
.macro VESRAVG vr1, vr2, vr3
|
||||
VESRAV \vr1, \vr2, \vr3, 3
|
||||
.endm
|
||||
|
||||
/* VECTOR ELEMENT ROTATE LEFT LOGICAL */
|
||||
.macro VERLL vr1, vr3, disp, base="%r0", m4
|
||||
VX_NUM v1, \vr1
|
||||
VX_NUM v3, \vr3
|
||||
GR_NUM b2, \base
|
||||
.word 0xE700 | ((v1&15) << 4) | (v3&15)
|
||||
.word (b2 << 12) | (\disp)
|
||||
MRXBOPC \m4, 0x33, v1, v3
|
||||
.endm
|
||||
.macro VERLLB vr1, vr3, disp, base="%r0"
|
||||
VERLL \vr1, \vr3, \disp, \base, 0
|
||||
.endm
|
||||
.macro VERLLH vr1, vr3, disp, base="%r0"
|
||||
VERLL \vr1, \vr3, \disp, \base, 1
|
||||
.endm
|
||||
.macro VERLLF vr1, vr3, disp, base="%r0"
|
||||
VERLL \vr1, \vr3, \disp, \base, 2
|
||||
.endm
|
||||
.macro VERLLG vr1, vr3, disp, base="%r0"
|
||||
VERLL \vr1, \vr3, \disp, \base, 3
|
||||
.endm
|
||||
|
||||
/* VECTOR SHIFT LEFT DOUBLE BY BYTE */
|
||||
.macro VSLDB vr1, vr2, vr3, imm4
|
||||
VX_NUM v1, \vr1
|
||||
VX_NUM v2, \vr2
|
||||
VX_NUM v3, \vr3
|
||||
.word 0xE700 | ((v1&15) << 4) | (v2&15)
|
||||
.word ((v3&15) << 12) | (\imm4)
|
||||
MRXBOPC 0, 0x77, v1, v2, v3
|
||||
.endm
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ASM_S390_VX_INSN_INTERNAL_H */
|
||||
@@ -2,677 +2,18 @@
|
||||
/*
|
||||
* Support for Vector Instructions
|
||||
*
|
||||
* Assembler macros to generate .byte/.word code for particular
|
||||
* vector instructions that are supported by recent binutils (>= 2.26) only.
|
||||
*
|
||||
* Copyright IBM Corp. 2015
|
||||
* Author(s): Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
|
||||
* This wrapper header file allows to use the vector instruction macros in
|
||||
* both assembler files as well as in inline assemblies in C files.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_S390_VX_INSN_H
|
||||
#define __ASM_S390_VX_INSN_H
|
||||
|
||||
#ifdef __ASSEMBLY__
|
||||
#include <asm/vx-insn-asm.h>
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
/* Macros to generate vector instruction byte code */
|
||||
asm(".include \"asm/vx-insn-asm.h\"\n");
|
||||
|
||||
/* GR_NUM - Retrieve general-purpose register number
|
||||
*
|
||||
* @opd: Operand to store register number
|
||||
* @r64: String designation register in the format "%rN"
|
||||
*/
|
||||
.macro GR_NUM opd gr
|
||||
\opd = 255
|
||||
.ifc \gr,%r0
|
||||
\opd = 0
|
||||
.endif
|
||||
.ifc \gr,%r1
|
||||
\opd = 1
|
||||
.endif
|
||||
.ifc \gr,%r2
|
||||
\opd = 2
|
||||
.endif
|
||||
.ifc \gr,%r3
|
||||
\opd = 3
|
||||
.endif
|
||||
.ifc \gr,%r4
|
||||
\opd = 4
|
||||
.endif
|
||||
.ifc \gr,%r5
|
||||
\opd = 5
|
||||
.endif
|
||||
.ifc \gr,%r6
|
||||
\opd = 6
|
||||
.endif
|
||||
.ifc \gr,%r7
|
||||
\opd = 7
|
||||
.endif
|
||||
.ifc \gr,%r8
|
||||
\opd = 8
|
||||
.endif
|
||||
.ifc \gr,%r9
|
||||
\opd = 9
|
||||
.endif
|
||||
.ifc \gr,%r10
|
||||
\opd = 10
|
||||
.endif
|
||||
.ifc \gr,%r11
|
||||
\opd = 11
|
||||
.endif
|
||||
.ifc \gr,%r12
|
||||
\opd = 12
|
||||
.endif
|
||||
.ifc \gr,%r13
|
||||
\opd = 13
|
||||
.endif
|
||||
.ifc \gr,%r14
|
||||
\opd = 14
|
||||
.endif
|
||||
.ifc \gr,%r15
|
||||
\opd = 15
|
||||
.endif
|
||||
.if \opd == 255
|
||||
\opd = \gr
|
||||
.endif
|
||||
.endm
|
||||
|
||||
/* VX_NUM - Retrieve vector register number
|
||||
*
|
||||
* @opd: Operand to store register number
|
||||
* @vxr: String designation register in the format "%vN"
|
||||
*
|
||||
* The vector register number is used for as input number to the
|
||||
* instruction and, as well as, to compute the RXB field of the
|
||||
* instruction.
|
||||
*/
|
||||
.macro VX_NUM opd vxr
|
||||
\opd = 255
|
||||
.ifc \vxr,%v0
|
||||
\opd = 0
|
||||
.endif
|
||||
.ifc \vxr,%v1
|
||||
\opd = 1
|
||||
.endif
|
||||
.ifc \vxr,%v2
|
||||
\opd = 2
|
||||
.endif
|
||||
.ifc \vxr,%v3
|
||||
\opd = 3
|
||||
.endif
|
||||
.ifc \vxr,%v4
|
||||
\opd = 4
|
||||
.endif
|
||||
.ifc \vxr,%v5
|
||||
\opd = 5
|
||||
.endif
|
||||
.ifc \vxr,%v6
|
||||
\opd = 6
|
||||
.endif
|
||||
.ifc \vxr,%v7
|
||||
\opd = 7
|
||||
.endif
|
||||
.ifc \vxr,%v8
|
||||
\opd = 8
|
||||
.endif
|
||||
.ifc \vxr,%v9
|
||||
\opd = 9
|
||||
.endif
|
||||
.ifc \vxr,%v10
|
||||
\opd = 10
|
||||
.endif
|
||||
.ifc \vxr,%v11
|
||||
\opd = 11
|
||||
.endif
|
||||
.ifc \vxr,%v12
|
||||
\opd = 12
|
||||
.endif
|
||||
.ifc \vxr,%v13
|
||||
\opd = 13
|
||||
.endif
|
||||
.ifc \vxr,%v14
|
||||
\opd = 14
|
||||
.endif
|
||||
.ifc \vxr,%v15
|
||||
\opd = 15
|
||||
.endif
|
||||
.ifc \vxr,%v16
|
||||
\opd = 16
|
||||
.endif
|
||||
.ifc \vxr,%v17
|
||||
\opd = 17
|
||||
.endif
|
||||
.ifc \vxr,%v18
|
||||
\opd = 18
|
||||
.endif
|
||||
.ifc \vxr,%v19
|
||||
\opd = 19
|
||||
.endif
|
||||
.ifc \vxr,%v20
|
||||
\opd = 20
|
||||
.endif
|
||||
.ifc \vxr,%v21
|
||||
\opd = 21
|
||||
.endif
|
||||
.ifc \vxr,%v22
|
||||
\opd = 22
|
||||
.endif
|
||||
.ifc \vxr,%v23
|
||||
\opd = 23
|
||||
.endif
|
||||
.ifc \vxr,%v24
|
||||
\opd = 24
|
||||
.endif
|
||||
.ifc \vxr,%v25
|
||||
\opd = 25
|
||||
.endif
|
||||
.ifc \vxr,%v26
|
||||
\opd = 26
|
||||
.endif
|
||||
.ifc \vxr,%v27
|
||||
\opd = 27
|
||||
.endif
|
||||
.ifc \vxr,%v28
|
||||
\opd = 28
|
||||
.endif
|
||||
.ifc \vxr,%v29
|
||||
\opd = 29
|
||||
.endif
|
||||
.ifc \vxr,%v30
|
||||
\opd = 30
|
||||
.endif
|
||||
.ifc \vxr,%v31
|
||||
\opd = 31
|
||||
.endif
|
||||
.if \opd == 255
|
||||
\opd = \vxr
|
||||
.endif
|
||||
.endm
|
||||
|
||||
/* RXB - Compute most significant bit used vector registers
|
||||
*
|
||||
* @rxb: Operand to store computed RXB value
|
||||
* @v1: First vector register designated operand
|
||||
* @v2: Second vector register designated operand
|
||||
* @v3: Third vector register designated operand
|
||||
* @v4: Fourth vector register designated operand
|
||||
*/
|
||||
.macro RXB rxb v1 v2=0 v3=0 v4=0
|
||||
\rxb = 0
|
||||
.if \v1 & 0x10
|
||||
\rxb = \rxb | 0x08
|
||||
.endif
|
||||
.if \v2 & 0x10
|
||||
\rxb = \rxb | 0x04
|
||||
.endif
|
||||
.if \v3 & 0x10
|
||||
\rxb = \rxb | 0x02
|
||||
.endif
|
||||
.if \v4 & 0x10
|
||||
\rxb = \rxb | 0x01
|
||||
.endif
|
||||
.endm
|
||||
|
||||
/* MRXB - Generate Element Size Control and RXB value
|
||||
*
|
||||
* @m: Element size control
|
||||
* @v1: First vector register designated operand (for RXB)
|
||||
* @v2: Second vector register designated operand (for RXB)
|
||||
* @v3: Third vector register designated operand (for RXB)
|
||||
* @v4: Fourth vector register designated operand (for RXB)
|
||||
*/
|
||||
.macro MRXB m v1 v2=0 v3=0 v4=0
|
||||
rxb = 0
|
||||
RXB rxb, \v1, \v2, \v3, \v4
|
||||
.byte (\m << 4) | rxb
|
||||
.endm
|
||||
|
||||
/* MRXBOPC - Generate Element Size Control, RXB, and final Opcode fields
|
||||
*
|
||||
* @m: Element size control
|
||||
* @opc: Opcode
|
||||
* @v1: First vector register designated operand (for RXB)
|
||||
* @v2: Second vector register designated operand (for RXB)
|
||||
* @v3: Third vector register designated operand (for RXB)
|
||||
* @v4: Fourth vector register designated operand (for RXB)
|
||||
*/
|
||||
.macro MRXBOPC m opc v1 v2=0 v3=0 v4=0
|
||||
MRXB \m, \v1, \v2, \v3, \v4
|
||||
.byte \opc
|
||||
.endm
|
||||
|
||||
/* Vector support instructions */
|
||||
|
||||
/* VECTOR GENERATE BYTE MASK */
|
||||
.macro VGBM vr imm2
|
||||
VX_NUM v1, \vr
|
||||
.word (0xE700 | ((v1&15) << 4))
|
||||
.word \imm2
|
||||
MRXBOPC 0, 0x44, v1
|
||||
.endm
|
||||
.macro VZERO vxr
|
||||
VGBM \vxr, 0
|
||||
.endm
|
||||
.macro VONE vxr
|
||||
VGBM \vxr, 0xFFFF
|
||||
.endm
|
||||
|
||||
/* VECTOR LOAD VR ELEMENT FROM GR */
|
||||
.macro VLVG v, gr, disp, m
|
||||
VX_NUM v1, \v
|
||||
GR_NUM b2, "%r0"
|
||||
GR_NUM r3, \gr
|
||||
.word 0xE700 | ((v1&15) << 4) | r3
|
||||
.word (b2 << 12) | (\disp)
|
||||
MRXBOPC \m, 0x22, v1
|
||||
.endm
|
||||
.macro VLVGB v, gr, index, base
|
||||
VLVG \v, \gr, \index, \base, 0
|
||||
.endm
|
||||
.macro VLVGH v, gr, index
|
||||
VLVG \v, \gr, \index, 1
|
||||
.endm
|
||||
.macro VLVGF v, gr, index
|
||||
VLVG \v, \gr, \index, 2
|
||||
.endm
|
||||
.macro VLVGG v, gr, index
|
||||
VLVG \v, \gr, \index, 3
|
||||
.endm
|
||||
|
||||
/* VECTOR LOAD REGISTER */
|
||||
.macro VLR v1, v2
|
||||
VX_NUM v1, \v1
|
||||
VX_NUM v2, \v2
|
||||
.word 0xE700 | ((v1&15) << 4) | (v2&15)
|
||||
.word 0
|
||||
MRXBOPC 0, 0x56, v1, v2
|
||||
.endm
|
||||
|
||||
/* VECTOR LOAD */
|
||||
.macro VL v, disp, index="%r0", base
|
||||
VX_NUM v1, \v
|
||||
GR_NUM x2, \index
|
||||
GR_NUM b2, \base
|
||||
.word 0xE700 | ((v1&15) << 4) | x2
|
||||
.word (b2 << 12) | (\disp)
|
||||
MRXBOPC 0, 0x06, v1
|
||||
.endm
|
||||
|
||||
/* VECTOR LOAD ELEMENT */
|
||||
.macro VLEx vr1, disp, index="%r0", base, m3, opc
|
||||
VX_NUM v1, \vr1
|
||||
GR_NUM x2, \index
|
||||
GR_NUM b2, \base
|
||||
.word 0xE700 | ((v1&15) << 4) | x2
|
||||
.word (b2 << 12) | (\disp)
|
||||
MRXBOPC \m3, \opc, v1
|
||||
.endm
|
||||
.macro VLEB vr1, disp, index="%r0", base, m3
|
||||
VLEx \vr1, \disp, \index, \base, \m3, 0x00
|
||||
.endm
|
||||
.macro VLEH vr1, disp, index="%r0", base, m3
|
||||
VLEx \vr1, \disp, \index, \base, \m3, 0x01
|
||||
.endm
|
||||
.macro VLEF vr1, disp, index="%r0", base, m3
|
||||
VLEx \vr1, \disp, \index, \base, \m3, 0x03
|
||||
.endm
|
||||
.macro VLEG vr1, disp, index="%r0", base, m3
|
||||
VLEx \vr1, \disp, \index, \base, \m3, 0x02
|
||||
.endm
|
||||
|
||||
/* VECTOR LOAD ELEMENT IMMEDIATE */
|
||||
.macro VLEIx vr1, imm2, m3, opc
|
||||
VX_NUM v1, \vr1
|
||||
.word 0xE700 | ((v1&15) << 4)
|
||||
.word \imm2
|
||||
MRXBOPC \m3, \opc, v1
|
||||
.endm
|
||||
.macro VLEIB vr1, imm2, index
|
||||
VLEIx \vr1, \imm2, \index, 0x40
|
||||
.endm
|
||||
.macro VLEIH vr1, imm2, index
|
||||
VLEIx \vr1, \imm2, \index, 0x41
|
||||
.endm
|
||||
.macro VLEIF vr1, imm2, index
|
||||
VLEIx \vr1, \imm2, \index, 0x43
|
||||
.endm
|
||||
.macro VLEIG vr1, imm2, index
|
||||
VLEIx \vr1, \imm2, \index, 0x42
|
||||
.endm
|
||||
|
||||
/* VECTOR LOAD GR FROM VR ELEMENT */
|
||||
.macro VLGV gr, vr, disp, base="%r0", m
|
||||
GR_NUM r1, \gr
|
||||
GR_NUM b2, \base
|
||||
VX_NUM v3, \vr
|
||||
.word 0xE700 | (r1 << 4) | (v3&15)
|
||||
.word (b2 << 12) | (\disp)
|
||||
MRXBOPC \m, 0x21, v3
|
||||
.endm
|
||||
.macro VLGVB gr, vr, disp, base="%r0"
|
||||
VLGV \gr, \vr, \disp, \base, 0
|
||||
.endm
|
||||
.macro VLGVH gr, vr, disp, base="%r0"
|
||||
VLGV \gr, \vr, \disp, \base, 1
|
||||
.endm
|
||||
.macro VLGVF gr, vr, disp, base="%r0"
|
||||
VLGV \gr, \vr, \disp, \base, 2
|
||||
.endm
|
||||
.macro VLGVG gr, vr, disp, base="%r0"
|
||||
VLGV \gr, \vr, \disp, \base, 3
|
||||
.endm
|
||||
|
||||
/* VECTOR LOAD MULTIPLE */
|
||||
.macro VLM vfrom, vto, disp, base, hint=3
|
||||
VX_NUM v1, \vfrom
|
||||
VX_NUM v3, \vto
|
||||
GR_NUM b2, \base
|
||||
.word 0xE700 | ((v1&15) << 4) | (v3&15)
|
||||
.word (b2 << 12) | (\disp)
|
||||
MRXBOPC \hint, 0x36, v1, v3
|
||||
.endm
|
||||
|
||||
/* VECTOR STORE */
|
||||
.macro VST vr1, disp, index="%r0", base
|
||||
VX_NUM v1, \vr1
|
||||
GR_NUM x2, \index
|
||||
GR_NUM b2, \base
|
||||
.word 0xE700 | ((v1&15) << 4) | (x2&15)
|
||||
.word (b2 << 12) | (\disp)
|
||||
MRXBOPC 0, 0x0E, v1
|
||||
.endm
|
||||
|
||||
/* VECTOR STORE MULTIPLE */
|
||||
.macro VSTM vfrom, vto, disp, base, hint=3
|
||||
VX_NUM v1, \vfrom
|
||||
VX_NUM v3, \vto
|
||||
GR_NUM b2, \base
|
||||
.word 0xE700 | ((v1&15) << 4) | (v3&15)
|
||||
.word (b2 << 12) | (\disp)
|
||||
MRXBOPC \hint, 0x3E, v1, v3
|
||||
.endm
|
||||
|
||||
/* VECTOR PERMUTE */
|
||||
.macro VPERM vr1, vr2, vr3, vr4
|
||||
VX_NUM v1, \vr1
|
||||
VX_NUM v2, \vr2
|
||||
VX_NUM v3, \vr3
|
||||
VX_NUM v4, \vr4
|
||||
.word 0xE700 | ((v1&15) << 4) | (v2&15)
|
||||
.word ((v3&15) << 12)
|
||||
MRXBOPC (v4&15), 0x8C, v1, v2, v3, v4
|
||||
.endm
|
||||
|
||||
/* VECTOR UNPACK LOGICAL LOW */
|
||||
.macro VUPLL vr1, vr2, m3
|
||||
VX_NUM v1, \vr1
|
||||
VX_NUM v2, \vr2
|
||||
.word 0xE700 | ((v1&15) << 4) | (v2&15)
|
||||
.word 0x0000
|
||||
MRXBOPC \m3, 0xD4, v1, v2
|
||||
.endm
|
||||
.macro VUPLLB vr1, vr2
|
||||
VUPLL \vr1, \vr2, 0
|
||||
.endm
|
||||
.macro VUPLLH vr1, vr2
|
||||
VUPLL \vr1, \vr2, 1
|
||||
.endm
|
||||
.macro VUPLLF vr1, vr2
|
||||
VUPLL \vr1, \vr2, 2
|
||||
.endm
|
||||
|
||||
/* VECTOR PERMUTE DOUBLEWORD IMMEDIATE */
|
||||
.macro VPDI vr1, vr2, vr3, m4
|
||||
VX_NUM v1, \vr1
|
||||
VX_NUM v2, \vr2
|
||||
VX_NUM v3, \vr3
|
||||
.word 0xE700 | ((v1&15) << 4) | (v2&15)
|
||||
.word ((v3&15) << 12)
|
||||
MRXBOPC \m4, 0x84, v1, v2, v3
|
||||
.endm
|
||||
|
||||
/* VECTOR REPLICATE */
|
||||
.macro VREP vr1, vr3, imm2, m4
|
||||
VX_NUM v1, \vr1
|
||||
VX_NUM v3, \vr3
|
||||
.word 0xE700 | ((v1&15) << 4) | (v3&15)
|
||||
.word \imm2
|
||||
MRXBOPC \m4, 0x4D, v1, v3
|
||||
.endm
|
||||
.macro VREPB vr1, vr3, imm2
|
||||
VREP \vr1, \vr3, \imm2, 0
|
||||
.endm
|
||||
.macro VREPH vr1, vr3, imm2
|
||||
VREP \vr1, \vr3, \imm2, 1
|
||||
.endm
|
||||
.macro VREPF vr1, vr3, imm2
|
||||
VREP \vr1, \vr3, \imm2, 2
|
||||
.endm
|
||||
.macro VREPG vr1, vr3, imm2
|
||||
VREP \vr1, \vr3, \imm2, 3
|
||||
.endm
|
||||
|
||||
/* VECTOR MERGE HIGH */
|
||||
.macro VMRH vr1, vr2, vr3, m4
|
||||
VX_NUM v1, \vr1
|
||||
VX_NUM v2, \vr2
|
||||
VX_NUM v3, \vr3
|
||||
.word 0xE700 | ((v1&15) << 4) | (v2&15)
|
||||
.word ((v3&15) << 12)
|
||||
MRXBOPC \m4, 0x61, v1, v2, v3
|
||||
.endm
|
||||
.macro VMRHB vr1, vr2, vr3
|
||||
VMRH \vr1, \vr2, \vr3, 0
|
||||
.endm
|
||||
.macro VMRHH vr1, vr2, vr3
|
||||
VMRH \vr1, \vr2, \vr3, 1
|
||||
.endm
|
||||
.macro VMRHF vr1, vr2, vr3
|
||||
VMRH \vr1, \vr2, \vr3, 2
|
||||
.endm
|
||||
.macro VMRHG vr1, vr2, vr3
|
||||
VMRH \vr1, \vr2, \vr3, 3
|
||||
.endm
|
||||
|
||||
/* VECTOR MERGE LOW */
|
||||
.macro VMRL vr1, vr2, vr3, m4
|
||||
VX_NUM v1, \vr1
|
||||
VX_NUM v2, \vr2
|
||||
VX_NUM v3, \vr3
|
||||
.word 0xE700 | ((v1&15) << 4) | (v2&15)
|
||||
.word ((v3&15) << 12)
|
||||
MRXBOPC \m4, 0x60, v1, v2, v3
|
||||
.endm
|
||||
.macro VMRLB vr1, vr2, vr3
|
||||
VMRL \vr1, \vr2, \vr3, 0
|
||||
.endm
|
||||
.macro VMRLH vr1, vr2, vr3
|
||||
VMRL \vr1, \vr2, \vr3, 1
|
||||
.endm
|
||||
.macro VMRLF vr1, vr2, vr3
|
||||
VMRL \vr1, \vr2, \vr3, 2
|
||||
.endm
|
||||
.macro VMRLG vr1, vr2, vr3
|
||||
VMRL \vr1, \vr2, \vr3, 3
|
||||
.endm
|
||||
|
||||
|
||||
/* Vector integer instructions */
|
||||
|
||||
/* VECTOR AND */
|
||||
.macro VN vr1, vr2, vr3
|
||||
VX_NUM v1, \vr1
|
||||
VX_NUM v2, \vr2
|
||||
VX_NUM v3, \vr3
|
||||
.word 0xE700 | ((v1&15) << 4) | (v2&15)
|
||||
.word ((v3&15) << 12)
|
||||
MRXBOPC 0, 0x68, v1, v2, v3
|
||||
.endm
|
||||
|
||||
/* VECTOR EXCLUSIVE OR */
|
||||
.macro VX vr1, vr2, vr3
|
||||
VX_NUM v1, \vr1
|
||||
VX_NUM v2, \vr2
|
||||
VX_NUM v3, \vr3
|
||||
.word 0xE700 | ((v1&15) << 4) | (v2&15)
|
||||
.word ((v3&15) << 12)
|
||||
MRXBOPC 0, 0x6D, v1, v2, v3
|
||||
.endm
|
||||
|
||||
/* VECTOR GALOIS FIELD MULTIPLY SUM */
|
||||
.macro VGFM vr1, vr2, vr3, m4
|
||||
VX_NUM v1, \vr1
|
||||
VX_NUM v2, \vr2
|
||||
VX_NUM v3, \vr3
|
||||
.word 0xE700 | ((v1&15) << 4) | (v2&15)
|
||||
.word ((v3&15) << 12)
|
||||
MRXBOPC \m4, 0xB4, v1, v2, v3
|
||||
.endm
|
||||
.macro VGFMB vr1, vr2, vr3
|
||||
VGFM \vr1, \vr2, \vr3, 0
|
||||
.endm
|
||||
.macro VGFMH vr1, vr2, vr3
|
||||
VGFM \vr1, \vr2, \vr3, 1
|
||||
.endm
|
||||
.macro VGFMF vr1, vr2, vr3
|
||||
VGFM \vr1, \vr2, \vr3, 2
|
||||
.endm
|
||||
.macro VGFMG vr1, vr2, vr3
|
||||
VGFM \vr1, \vr2, \vr3, 3
|
||||
.endm
|
||||
|
||||
/* VECTOR GALOIS FIELD MULTIPLY SUM AND ACCUMULATE */
|
||||
.macro VGFMA vr1, vr2, vr3, vr4, m5
|
||||
VX_NUM v1, \vr1
|
||||
VX_NUM v2, \vr2
|
||||
VX_NUM v3, \vr3
|
||||
VX_NUM v4, \vr4
|
||||
.word 0xE700 | ((v1&15) << 4) | (v2&15)
|
||||
.word ((v3&15) << 12) | (\m5 << 8)
|
||||
MRXBOPC (v4&15), 0xBC, v1, v2, v3, v4
|
||||
.endm
|
||||
.macro VGFMAB vr1, vr2, vr3, vr4
|
||||
VGFMA \vr1, \vr2, \vr3, \vr4, 0
|
||||
.endm
|
||||
.macro VGFMAH vr1, vr2, vr3, vr4
|
||||
VGFMA \vr1, \vr2, \vr3, \vr4, 1
|
||||
.endm
|
||||
.macro VGFMAF vr1, vr2, vr3, vr4
|
||||
VGFMA \vr1, \vr2, \vr3, \vr4, 2
|
||||
.endm
|
||||
.macro VGFMAG vr1, vr2, vr3, vr4
|
||||
VGFMA \vr1, \vr2, \vr3, \vr4, 3
|
||||
.endm
|
||||
|
||||
/* VECTOR SHIFT RIGHT LOGICAL BY BYTE */
|
||||
.macro VSRLB vr1, vr2, vr3
|
||||
VX_NUM v1, \vr1
|
||||
VX_NUM v2, \vr2
|
||||
VX_NUM v3, \vr3
|
||||
.word 0xE700 | ((v1&15) << 4) | (v2&15)
|
||||
.word ((v3&15) << 12)
|
||||
MRXBOPC 0, 0x7D, v1, v2, v3
|
||||
.endm
|
||||
|
||||
/* VECTOR REPLICATE IMMEDIATE */
|
||||
.macro VREPI vr1, imm2, m3
|
||||
VX_NUM v1, \vr1
|
||||
.word 0xE700 | ((v1&15) << 4)
|
||||
.word \imm2
|
||||
MRXBOPC \m3, 0x45, v1
|
||||
.endm
|
||||
.macro VREPIB vr1, imm2
|
||||
VREPI \vr1, \imm2, 0
|
||||
.endm
|
||||
.macro VREPIH vr1, imm2
|
||||
VREPI \vr1, \imm2, 1
|
||||
.endm
|
||||
.macro VREPIF vr1, imm2
|
||||
VREPI \vr1, \imm2, 2
|
||||
.endm
|
||||
.macro VREPIG vr1, imm2
|
||||
VREP \vr1, \imm2, 3
|
||||
.endm
|
||||
|
||||
/* VECTOR ADD */
|
||||
.macro VA vr1, vr2, vr3, m4
|
||||
VX_NUM v1, \vr1
|
||||
VX_NUM v2, \vr2
|
||||
VX_NUM v3, \vr3
|
||||
.word 0xE700 | ((v1&15) << 4) | (v2&15)
|
||||
.word ((v3&15) << 12)
|
||||
MRXBOPC \m4, 0xF3, v1, v2, v3
|
||||
.endm
|
||||
.macro VAB vr1, vr2, vr3
|
||||
VA \vr1, \vr2, \vr3, 0
|
||||
.endm
|
||||
.macro VAH vr1, vr2, vr3
|
||||
VA \vr1, \vr2, \vr3, 1
|
||||
.endm
|
||||
.macro VAF vr1, vr2, vr3
|
||||
VA \vr1, \vr2, \vr3, 2
|
||||
.endm
|
||||
.macro VAG vr1, vr2, vr3
|
||||
VA \vr1, \vr2, \vr3, 3
|
||||
.endm
|
||||
.macro VAQ vr1, vr2, vr3
|
||||
VA \vr1, \vr2, \vr3, 4
|
||||
.endm
|
||||
|
||||
/* VECTOR ELEMENT SHIFT RIGHT ARITHMETIC */
|
||||
.macro VESRAV vr1, vr2, vr3, m4
|
||||
VX_NUM v1, \vr1
|
||||
VX_NUM v2, \vr2
|
||||
VX_NUM v3, \vr3
|
||||
.word 0xE700 | ((v1&15) << 4) | (v2&15)
|
||||
.word ((v3&15) << 12)
|
||||
MRXBOPC \m4, 0x7A, v1, v2, v3
|
||||
.endm
|
||||
|
||||
.macro VESRAVB vr1, vr2, vr3
|
||||
VESRAV \vr1, \vr2, \vr3, 0
|
||||
.endm
|
||||
.macro VESRAVH vr1, vr2, vr3
|
||||
VESRAV \vr1, \vr2, \vr3, 1
|
||||
.endm
|
||||
.macro VESRAVF vr1, vr2, vr3
|
||||
VESRAV \vr1, \vr2, \vr3, 2
|
||||
.endm
|
||||
.macro VESRAVG vr1, vr2, vr3
|
||||
VESRAV \vr1, \vr2, \vr3, 3
|
||||
.endm
|
||||
|
||||
/* VECTOR ELEMENT ROTATE LEFT LOGICAL */
|
||||
.macro VERLL vr1, vr3, disp, base="%r0", m4
|
||||
VX_NUM v1, \vr1
|
||||
VX_NUM v3, \vr3
|
||||
GR_NUM b2, \base
|
||||
.word 0xE700 | ((v1&15) << 4) | (v3&15)
|
||||
.word (b2 << 12) | (\disp)
|
||||
MRXBOPC \m4, 0x33, v1, v3
|
||||
.endm
|
||||
.macro VERLLB vr1, vr3, disp, base="%r0"
|
||||
VERLL \vr1, \vr3, \disp, \base, 0
|
||||
.endm
|
||||
.macro VERLLH vr1, vr3, disp, base="%r0"
|
||||
VERLL \vr1, \vr3, \disp, \base, 1
|
||||
.endm
|
||||
.macro VERLLF vr1, vr3, disp, base="%r0"
|
||||
VERLL \vr1, \vr3, \disp, \base, 2
|
||||
.endm
|
||||
.macro VERLLG vr1, vr3, disp, base="%r0"
|
||||
VERLL \vr1, \vr3, \disp, \base, 3
|
||||
.endm
|
||||
|
||||
/* VECTOR SHIFT LEFT DOUBLE BY BYTE */
|
||||
.macro VSLDB vr1, vr2, vr3, imm4
|
||||
VX_NUM v1, \vr1
|
||||
VX_NUM v2, \vr2
|
||||
VX_NUM v3, \vr3
|
||||
.word 0xE700 | ((v1&15) << 4) | (v2&15)
|
||||
.word ((v3&15) << 12) | (\imm4)
|
||||
MRXBOPC 0, 0x77, v1, v2, v3
|
||||
.endm
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __ASM_S390_VX_INSN_H */
|
||||
|
||||
@@ -27,6 +27,7 @@ enum ipl_pbt {
|
||||
IPL_PBT_FCP = 0,
|
||||
IPL_PBT_SCP_DATA = 1,
|
||||
IPL_PBT_CCW = 2,
|
||||
IPL_PBT_ECKD = 3,
|
||||
IPL_PBT_NVME = 4,
|
||||
};
|
||||
|
||||
@@ -111,6 +112,34 @@ struct ipl_pb0_ccw {
|
||||
__u8 reserved5[8];
|
||||
} __packed;
|
||||
|
||||
/* IPL Parameter Block 0 for ECKD */
|
||||
struct ipl_pb0_eckd {
|
||||
__u32 len;
|
||||
__u8 pbt;
|
||||
__u8 reserved1[3];
|
||||
__u32 reserved2[78];
|
||||
__u8 opt;
|
||||
__u8 reserved4[4];
|
||||
__u8 reserved5:5;
|
||||
__u8 ssid:3;
|
||||
__u16 devno;
|
||||
__u32 reserved6[5];
|
||||
__u32 bootprog;
|
||||
__u8 reserved7[12];
|
||||
struct {
|
||||
__u16 cyl;
|
||||
__u8 head;
|
||||
__u8 record;
|
||||
__u32 reserved;
|
||||
} br_chr __packed;
|
||||
__u32 scp_data_len;
|
||||
__u8 reserved8[260];
|
||||
__u8 scp_data[];
|
||||
} __packed;
|
||||
|
||||
#define IPL_PB0_ECKD_OPT_IPL 0x10
|
||||
#define IPL_PB0_ECKD_OPT_DUMP 0x20
|
||||
|
||||
#define IPL_PB0_CCW_VM_FLAG_NSS 0x80
|
||||
#define IPL_PB0_CCW_VM_FLAG_VP 0x40
|
||||
|
||||
|
||||
@@ -92,7 +92,7 @@ static int debug_input_flush_fn(debug_info_t *id, struct debug_view *view,
|
||||
static int debug_hex_ascii_format_fn(debug_info_t *id, struct debug_view *view,
|
||||
char *out_buf, const char *in_buf);
|
||||
static int debug_sprintf_format_fn(debug_info_t *id, struct debug_view *view,
|
||||
char *out_buf, debug_sprintf_entry_t *curr_event);
|
||||
char *out_buf, const char *inbuf);
|
||||
static void debug_areas_swap(debug_info_t *a, debug_info_t *b);
|
||||
static void debug_events_append(debug_info_t *dest, debug_info_t *src);
|
||||
|
||||
@@ -139,7 +139,7 @@ struct debug_view debug_sprintf_view = {
|
||||
"sprintf",
|
||||
NULL,
|
||||
&debug_dflt_header_fn,
|
||||
(debug_format_proc_t *)&debug_sprintf_format_fn,
|
||||
&debug_sprintf_format_fn,
|
||||
NULL,
|
||||
NULL
|
||||
};
|
||||
@@ -1532,8 +1532,9 @@ EXPORT_SYMBOL(debug_dflt_header_fn);
|
||||
#define DEBUG_SPRINTF_MAX_ARGS 10
|
||||
|
||||
static int debug_sprintf_format_fn(debug_info_t *id, struct debug_view *view,
|
||||
char *out_buf, debug_sprintf_entry_t *curr_event)
|
||||
char *out_buf, const char *inbuf)
|
||||
{
|
||||
debug_sprintf_entry_t *curr_event = (debug_sprintf_entry_t *)inbuf;
|
||||
int num_longs, num_used_args = 0, i, rc = 0;
|
||||
int index[DEBUG_SPRINTF_MAX_ARGS];
|
||||
|
||||
|
||||
@@ -122,24 +122,6 @@ _LPP_OFFSET = __LC_LPP
|
||||
"jnz .+8; .insn rrf,0xb2e80000,0,0,13,0", 82
|
||||
.endm
|
||||
|
||||
/*
|
||||
* The CHKSTG macro jumps to the provided label in case the
|
||||
* machine check interruption code reports one of unrecoverable
|
||||
* storage errors:
|
||||
* - Storage error uncorrected
|
||||
* - Storage key error uncorrected
|
||||
* - Storage degradation with Failing-storage-address validity
|
||||
*/
|
||||
.macro CHKSTG errlabel
|
||||
TSTMSK __LC_MCCK_CODE,(MCCK_CODE_STG_ERROR|MCCK_CODE_STG_KEY_ERROR)
|
||||
jnz \errlabel
|
||||
TSTMSK __LC_MCCK_CODE,MCCK_CODE_STG_DEGRAD
|
||||
jz .Loklabel\@
|
||||
TSTMSK __LC_MCCK_CODE,MCCK_CODE_STG_FAIL_ADDR
|
||||
jnz \errlabel
|
||||
.Loklabel\@:
|
||||
.endm
|
||||
|
||||
#if IS_ENABLED(CONFIG_KVM)
|
||||
/*
|
||||
* The OUTSIDE macro jumps to the provided label in case the value
|
||||
@@ -546,26 +528,18 @@ ENTRY(mcck_int_handler)
|
||||
3: TSTMSK __LC_MCCK_CODE,MCCK_CODE_PSW_MWP_VALID
|
||||
jno .Lmcck_panic
|
||||
tmhh %r8,0x0001 # interrupting from user ?
|
||||
jnz 6f
|
||||
jnz .Lmcck_user
|
||||
TSTMSK __LC_MCCK_CODE,MCCK_CODE_PSW_IA_VALID
|
||||
jno .Lmcck_panic
|
||||
#if IS_ENABLED(CONFIG_KVM)
|
||||
OUTSIDE %r9,.Lsie_gmap,.Lsie_done,6f
|
||||
OUTSIDE %r9,.Lsie_gmap,.Lsie_done,.Lmcck_stack
|
||||
OUTSIDE %r9,.Lsie_entry,.Lsie_leave,4f
|
||||
oi __LC_CPU_FLAGS+7, _CIF_MCCK_GUEST
|
||||
j 5f
|
||||
4: CHKSTG .Lmcck_panic
|
||||
5: larl %r14,.Lstosm_tmp
|
||||
stosm 0(%r14),0x04 # turn dat on, keep irqs off
|
||||
BPENTER __SF_SIE_FLAGS(%r15),(_TIF_ISOLATE_BP|_TIF_ISOLATE_BP_GUEST)
|
||||
4: BPENTER __SF_SIE_FLAGS(%r15),(_TIF_ISOLATE_BP|_TIF_ISOLATE_BP_GUEST)
|
||||
SIEEXIT
|
||||
j .Lmcck_stack
|
||||
#endif
|
||||
6: CHKSTG .Lmcck_panic
|
||||
larl %r14,.Lstosm_tmp
|
||||
stosm 0(%r14),0x04 # turn dat on, keep irqs off
|
||||
tmhh %r8,0x0001 # interrupting from user ?
|
||||
jz .Lmcck_stack
|
||||
.Lmcck_user:
|
||||
BPENTER __TI_flags(%r12),_TIF_ISOLATE_BP
|
||||
.Lmcck_stack:
|
||||
lg %r15,__LC_MCCK_STACK
|
||||
|
||||
@@ -10,8 +10,7 @@
|
||||
#include <linux/sched.h>
|
||||
#include <asm/fpu/types.h>
|
||||
#include <asm/fpu/api.h>
|
||||
|
||||
asm(".include \"asm/vx-insn.h\"\n");
|
||||
#include <asm/vx-insn.h>
|
||||
|
||||
void __kernel_fpu_begin(struct kernel_fpu *state, u32 flags)
|
||||
{
|
||||
|
||||
+375
-28
@@ -12,6 +12,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/kstrtox.h>
|
||||
#include <linux/panic_notifier.h>
|
||||
#include <linux/reboot.h>
|
||||
#include <linux/ctype.h>
|
||||
@@ -39,6 +40,8 @@
|
||||
|
||||
#define IPL_UNKNOWN_STR "unknown"
|
||||
#define IPL_CCW_STR "ccw"
|
||||
#define IPL_ECKD_STR "eckd"
|
||||
#define IPL_ECKD_DUMP_STR "eckd_dump"
|
||||
#define IPL_FCP_STR "fcp"
|
||||
#define IPL_FCP_DUMP_STR "fcp_dump"
|
||||
#define IPL_NVME_STR "nvme"
|
||||
@@ -46,6 +49,7 @@
|
||||
#define IPL_NSS_STR "nss"
|
||||
|
||||
#define DUMP_CCW_STR "ccw"
|
||||
#define DUMP_ECKD_STR "eckd"
|
||||
#define DUMP_FCP_STR "fcp"
|
||||
#define DUMP_NVME_STR "nvme"
|
||||
#define DUMP_NONE_STR "none"
|
||||
@@ -92,6 +96,10 @@ static char *ipl_type_str(enum ipl_type type)
|
||||
switch (type) {
|
||||
case IPL_TYPE_CCW:
|
||||
return IPL_CCW_STR;
|
||||
case IPL_TYPE_ECKD:
|
||||
return IPL_ECKD_STR;
|
||||
case IPL_TYPE_ECKD_DUMP:
|
||||
return IPL_ECKD_DUMP_STR;
|
||||
case IPL_TYPE_FCP:
|
||||
return IPL_FCP_STR;
|
||||
case IPL_TYPE_FCP_DUMP:
|
||||
@@ -113,6 +121,7 @@ enum dump_type {
|
||||
DUMP_TYPE_CCW = 2,
|
||||
DUMP_TYPE_FCP = 4,
|
||||
DUMP_TYPE_NVME = 8,
|
||||
DUMP_TYPE_ECKD = 16,
|
||||
};
|
||||
|
||||
static char *dump_type_str(enum dump_type type)
|
||||
@@ -122,6 +131,8 @@ static char *dump_type_str(enum dump_type type)
|
||||
return DUMP_NONE_STR;
|
||||
case DUMP_TYPE_CCW:
|
||||
return DUMP_CCW_STR;
|
||||
case DUMP_TYPE_ECKD:
|
||||
return DUMP_ECKD_STR;
|
||||
case DUMP_TYPE_FCP:
|
||||
return DUMP_FCP_STR;
|
||||
case DUMP_TYPE_NVME:
|
||||
@@ -147,6 +158,7 @@ static enum ipl_type reipl_type = IPL_TYPE_UNKNOWN;
|
||||
static struct ipl_parameter_block *reipl_block_fcp;
|
||||
static struct ipl_parameter_block *reipl_block_nvme;
|
||||
static struct ipl_parameter_block *reipl_block_ccw;
|
||||
static struct ipl_parameter_block *reipl_block_eckd;
|
||||
static struct ipl_parameter_block *reipl_block_nss;
|
||||
static struct ipl_parameter_block *reipl_block_actual;
|
||||
|
||||
@@ -155,12 +167,14 @@ static enum dump_type dump_type = DUMP_TYPE_NONE;
|
||||
static struct ipl_parameter_block *dump_block_fcp;
|
||||
static struct ipl_parameter_block *dump_block_nvme;
|
||||
static struct ipl_parameter_block *dump_block_ccw;
|
||||
static struct ipl_parameter_block *dump_block_eckd;
|
||||
|
||||
static struct sclp_ipl_info sclp_ipl_info;
|
||||
|
||||
static bool reipl_nvme_clear;
|
||||
static bool reipl_fcp_clear;
|
||||
static bool reipl_ccw_clear;
|
||||
static bool reipl_eckd_clear;
|
||||
|
||||
static inline int __diag308(unsigned long subcode, void *addr)
|
||||
{
|
||||
@@ -218,14 +232,14 @@ IPL_ATTR_SHOW_FN(_prefix, _name, "0.%x.%04x\n", \
|
||||
_ipl_blk.ssid, _ipl_blk.devno); \
|
||||
IPL_ATTR_CCW_STORE_FN(_prefix, _name, _ipl_blk); \
|
||||
static struct kobj_attribute sys_##_prefix##_##_name##_attr = \
|
||||
__ATTR(_name, (S_IRUGO | S_IWUSR), \
|
||||
__ATTR(_name, 0644, \
|
||||
sys_##_prefix##_##_name##_show, \
|
||||
sys_##_prefix##_##_name##_store) \
|
||||
|
||||
#define DEFINE_IPL_ATTR_RO(_prefix, _name, _format, _value) \
|
||||
IPL_ATTR_SHOW_FN(_prefix, _name, _format, _value) \
|
||||
static struct kobj_attribute sys_##_prefix##_##_name##_attr = \
|
||||
__ATTR(_name, S_IRUGO, sys_##_prefix##_##_name##_show, NULL)
|
||||
__ATTR(_name, 0444, sys_##_prefix##_##_name##_show, NULL)
|
||||
|
||||
#define DEFINE_IPL_ATTR_RW(_prefix, _name, _fmt_out, _fmt_in, _value) \
|
||||
IPL_ATTR_SHOW_FN(_prefix, _name, _fmt_out, (unsigned long long) _value) \
|
||||
@@ -240,7 +254,7 @@ static ssize_t sys_##_prefix##_##_name##_store(struct kobject *kobj, \
|
||||
return len; \
|
||||
} \
|
||||
static struct kobj_attribute sys_##_prefix##_##_name##_attr = \
|
||||
__ATTR(_name,(S_IRUGO | S_IWUSR), \
|
||||
__ATTR(_name, 0644, \
|
||||
sys_##_prefix##_##_name##_show, \
|
||||
sys_##_prefix##_##_name##_store)
|
||||
|
||||
@@ -255,7 +269,7 @@ static ssize_t sys_##_prefix##_##_name##_store(struct kobject *kobj, \
|
||||
return len; \
|
||||
} \
|
||||
static struct kobj_attribute sys_##_prefix##_##_name##_attr = \
|
||||
__ATTR(_name,(S_IRUGO | S_IWUSR), \
|
||||
__ATTR(_name, 0644, \
|
||||
sys_##_prefix##_##_name##_show, \
|
||||
sys_##_prefix##_##_name##_store)
|
||||
|
||||
@@ -281,6 +295,11 @@ static __init enum ipl_type get_ipl_type(void)
|
||||
return IPL_TYPE_NVME_DUMP;
|
||||
else
|
||||
return IPL_TYPE_NVME;
|
||||
case IPL_PBT_ECKD:
|
||||
if (ipl_block.eckd.opt == IPL_PB0_ECKD_OPT_DUMP)
|
||||
return IPL_TYPE_ECKD_DUMP;
|
||||
else
|
||||
return IPL_TYPE_ECKD;
|
||||
}
|
||||
return IPL_TYPE_UNKNOWN;
|
||||
}
|
||||
@@ -325,7 +344,7 @@ static ssize_t ipl_vm_parm_show(struct kobject *kobj,
|
||||
}
|
||||
|
||||
static struct kobj_attribute sys_ipl_vm_parm_attr =
|
||||
__ATTR(parm, S_IRUGO, ipl_vm_parm_show, NULL);
|
||||
__ATTR(parm, 0444, ipl_vm_parm_show, NULL);
|
||||
|
||||
static ssize_t sys_ipl_device_show(struct kobject *kobj,
|
||||
struct kobj_attribute *attr, char *page)
|
||||
@@ -334,6 +353,10 @@ static ssize_t sys_ipl_device_show(struct kobject *kobj,
|
||||
case IPL_TYPE_CCW:
|
||||
return sprintf(page, "0.%x.%04x\n", ipl_block.ccw.ssid,
|
||||
ipl_block.ccw.devno);
|
||||
case IPL_TYPE_ECKD:
|
||||
case IPL_TYPE_ECKD_DUMP:
|
||||
return sprintf(page, "0.%x.%04x\n", ipl_block.eckd.ssid,
|
||||
ipl_block.eckd.devno);
|
||||
case IPL_TYPE_FCP:
|
||||
case IPL_TYPE_FCP_DUMP:
|
||||
return sprintf(page, "0.0.%04x\n", ipl_block.fcp.devno);
|
||||
@@ -346,7 +369,7 @@ static ssize_t sys_ipl_device_show(struct kobject *kobj,
|
||||
}
|
||||
|
||||
static struct kobj_attribute sys_ipl_device_attr =
|
||||
__ATTR(device, S_IRUGO, sys_ipl_device_show, NULL);
|
||||
__ATTR(device, 0444, sys_ipl_device_show, NULL);
|
||||
|
||||
static ssize_t ipl_parameter_read(struct file *filp, struct kobject *kobj,
|
||||
struct bin_attribute *attr, char *buf,
|
||||
@@ -356,7 +379,7 @@ static ssize_t ipl_parameter_read(struct file *filp, struct kobject *kobj,
|
||||
ipl_block.hdr.len);
|
||||
}
|
||||
static struct bin_attribute ipl_parameter_attr =
|
||||
__BIN_ATTR(binary_parameter, S_IRUGO, ipl_parameter_read, NULL,
|
||||
__BIN_ATTR(binary_parameter, 0444, ipl_parameter_read, NULL,
|
||||
PAGE_SIZE);
|
||||
|
||||
static ssize_t ipl_scp_data_read(struct file *filp, struct kobject *kobj,
|
||||
@@ -379,11 +402,24 @@ static ssize_t ipl_nvme_scp_data_read(struct file *filp, struct kobject *kobj,
|
||||
return memory_read_from_buffer(buf, count, &off, scp_data, size);
|
||||
}
|
||||
|
||||
static ssize_t ipl_eckd_scp_data_read(struct file *filp, struct kobject *kobj,
|
||||
struct bin_attribute *attr, char *buf,
|
||||
loff_t off, size_t count)
|
||||
{
|
||||
unsigned int size = ipl_block.eckd.scp_data_len;
|
||||
void *scp_data = &ipl_block.eckd.scp_data;
|
||||
|
||||
return memory_read_from_buffer(buf, count, &off, scp_data, size);
|
||||
}
|
||||
|
||||
static struct bin_attribute ipl_scp_data_attr =
|
||||
__BIN_ATTR(scp_data, S_IRUGO, ipl_scp_data_read, NULL, PAGE_SIZE);
|
||||
__BIN_ATTR(scp_data, 0444, ipl_scp_data_read, NULL, PAGE_SIZE);
|
||||
|
||||
static struct bin_attribute ipl_nvme_scp_data_attr =
|
||||
__BIN_ATTR(scp_data, S_IRUGO, ipl_nvme_scp_data_read, NULL, PAGE_SIZE);
|
||||
__BIN_ATTR(scp_data, 0444, ipl_nvme_scp_data_read, NULL, PAGE_SIZE);
|
||||
|
||||
static struct bin_attribute ipl_eckd_scp_data_attr =
|
||||
__BIN_ATTR(scp_data, 0444, ipl_eckd_scp_data_read, NULL, PAGE_SIZE);
|
||||
|
||||
static struct bin_attribute *ipl_fcp_bin_attrs[] = {
|
||||
&ipl_parameter_attr,
|
||||
@@ -397,6 +433,12 @@ static struct bin_attribute *ipl_nvme_bin_attrs[] = {
|
||||
NULL,
|
||||
};
|
||||
|
||||
static struct bin_attribute *ipl_eckd_bin_attrs[] = {
|
||||
&ipl_parameter_attr,
|
||||
&ipl_eckd_scp_data_attr,
|
||||
NULL,
|
||||
};
|
||||
|
||||
/* FCP ipl device attributes */
|
||||
|
||||
DEFINE_IPL_ATTR_RO(ipl_fcp, wwpn, "0x%016llx\n",
|
||||
@@ -418,6 +460,84 @@ DEFINE_IPL_ATTR_RO(ipl_nvme, bootprog, "%lld\n",
|
||||
DEFINE_IPL_ATTR_RO(ipl_nvme, br_lba, "%lld\n",
|
||||
(unsigned long long)ipl_block.nvme.br_lba);
|
||||
|
||||
/* ECKD ipl device attributes */
|
||||
DEFINE_IPL_ATTR_RO(ipl_eckd, bootprog, "%lld\n",
|
||||
(unsigned long long)ipl_block.eckd.bootprog);
|
||||
|
||||
#define IPL_ATTR_BR_CHR_SHOW_FN(_name, _ipb) \
|
||||
static ssize_t eckd_##_name##_br_chr_show(struct kobject *kobj, \
|
||||
struct kobj_attribute *attr, \
|
||||
char *buf) \
|
||||
{ \
|
||||
struct ipl_pb0_eckd *ipb = &(_ipb); \
|
||||
\
|
||||
if (!ipb->br_chr.cyl && \
|
||||
!ipb->br_chr.head && \
|
||||
!ipb->br_chr.record) \
|
||||
return sprintf(buf, "auto\n"); \
|
||||
\
|
||||
return sprintf(buf, "0x%x,0x%x,0x%x\n", \
|
||||
ipb->br_chr.cyl, \
|
||||
ipb->br_chr.head, \
|
||||
ipb->br_chr.record); \
|
||||
}
|
||||
|
||||
#define IPL_ATTR_BR_CHR_STORE_FN(_name, _ipb) \
|
||||
static ssize_t eckd_##_name##_br_chr_store(struct kobject *kobj, \
|
||||
struct kobj_attribute *attr, \
|
||||
const char *buf, size_t len) \
|
||||
{ \
|
||||
struct ipl_pb0_eckd *ipb = &(_ipb); \
|
||||
unsigned long args[3] = { 0 }; \
|
||||
char *p, *p1, *tmp = NULL; \
|
||||
int i, rc; \
|
||||
\
|
||||
if (!strncmp(buf, "auto", 4)) \
|
||||
goto out; \
|
||||
\
|
||||
tmp = kstrdup(buf, GFP_KERNEL); \
|
||||
p = tmp; \
|
||||
for (i = 0; i < 3; i++) { \
|
||||
p1 = strsep(&p, ", "); \
|
||||
if (!p1) { \
|
||||
rc = -EINVAL; \
|
||||
goto err; \
|
||||
} \
|
||||
rc = kstrtoul(p1, 0, args + i); \
|
||||
if (rc) \
|
||||
goto err; \
|
||||
} \
|
||||
\
|
||||
rc = -EINVAL; \
|
||||
if (i != 3) \
|
||||
goto err; \
|
||||
\
|
||||
if ((args[0] || args[1]) && !args[2]) \
|
||||
goto err; \
|
||||
\
|
||||
if (args[0] > UINT_MAX || args[1] > 255 || args[2] > 255) \
|
||||
goto err; \
|
||||
\
|
||||
out: \
|
||||
ipb->br_chr.cyl = args[0]; \
|
||||
ipb->br_chr.head = args[1]; \
|
||||
ipb->br_chr.record = args[2]; \
|
||||
rc = len; \
|
||||
err: \
|
||||
kfree(tmp); \
|
||||
return rc; \
|
||||
}
|
||||
|
||||
IPL_ATTR_BR_CHR_SHOW_FN(ipl, ipl_block.eckd);
|
||||
static struct kobj_attribute sys_ipl_eckd_br_chr_attr =
|
||||
__ATTR(br_chr, 0644, eckd_ipl_br_chr_show, NULL);
|
||||
|
||||
IPL_ATTR_BR_CHR_SHOW_FN(reipl, reipl_block_eckd->eckd);
|
||||
IPL_ATTR_BR_CHR_STORE_FN(reipl, reipl_block_eckd->eckd);
|
||||
|
||||
static struct kobj_attribute sys_reipl_eckd_br_chr_attr =
|
||||
__ATTR(br_chr, 0644, eckd_reipl_br_chr_show, eckd_reipl_br_chr_store);
|
||||
|
||||
static ssize_t ipl_ccw_loadparm_show(struct kobject *kobj,
|
||||
struct kobj_attribute *attr, char *page)
|
||||
{
|
||||
@@ -469,6 +589,20 @@ static struct attribute_group ipl_nvme_attr_group = {
|
||||
.bin_attrs = ipl_nvme_bin_attrs,
|
||||
};
|
||||
|
||||
static struct attribute *ipl_eckd_attrs[] = {
|
||||
&sys_ipl_type_attr.attr,
|
||||
&sys_ipl_eckd_bootprog_attr.attr,
|
||||
&sys_ipl_eckd_br_chr_attr.attr,
|
||||
&sys_ipl_device_attr.attr,
|
||||
&sys_ipl_secure_attr.attr,
|
||||
&sys_ipl_has_secure_attr.attr,
|
||||
NULL,
|
||||
};
|
||||
|
||||
static struct attribute_group ipl_eckd_attr_group = {
|
||||
.attrs = ipl_eckd_attrs,
|
||||
.bin_attrs = ipl_eckd_bin_attrs,
|
||||
};
|
||||
|
||||
/* CCW ipl device attributes */
|
||||
|
||||
@@ -541,6 +675,9 @@ static int __init ipl_init(void)
|
||||
rc = sysfs_create_group(&ipl_kset->kobj,
|
||||
&ipl_ccw_attr_group_lpar);
|
||||
break;
|
||||
case IPL_TYPE_ECKD:
|
||||
rc = sysfs_create_group(&ipl_kset->kobj, &ipl_eckd_attr_group);
|
||||
break;
|
||||
case IPL_TYPE_FCP:
|
||||
case IPL_TYPE_FCP_DUMP:
|
||||
rc = sysfs_create_group(&ipl_kset->kobj, &ipl_fcp_attr_group);
|
||||
@@ -642,11 +779,11 @@ static ssize_t reipl_ccw_vmparm_store(struct kobject *kobj,
|
||||
}
|
||||
|
||||
static struct kobj_attribute sys_reipl_nss_vmparm_attr =
|
||||
__ATTR(parm, S_IRUGO | S_IWUSR, reipl_nss_vmparm_show,
|
||||
reipl_nss_vmparm_store);
|
||||
__ATTR(parm, 0644, reipl_nss_vmparm_show,
|
||||
reipl_nss_vmparm_store);
|
||||
static struct kobj_attribute sys_reipl_ccw_vmparm_attr =
|
||||
__ATTR(parm, S_IRUGO | S_IWUSR, reipl_ccw_vmparm_show,
|
||||
reipl_ccw_vmparm_store);
|
||||
__ATTR(parm, 0644, reipl_ccw_vmparm_show,
|
||||
reipl_ccw_vmparm_store);
|
||||
|
||||
/* FCP reipl device attributes */
|
||||
|
||||
@@ -686,7 +823,7 @@ static ssize_t reipl_fcp_scpdata_write(struct file *filp, struct kobject *kobj,
|
||||
return count;
|
||||
}
|
||||
static struct bin_attribute sys_reipl_fcp_scp_data_attr =
|
||||
__BIN_ATTR(scp_data, (S_IRUGO | S_IWUSR), reipl_fcp_scpdata_read,
|
||||
__BIN_ATTR(scp_data, 0644, reipl_fcp_scpdata_read,
|
||||
reipl_fcp_scpdata_write, DIAG308_SCPDATA_SIZE);
|
||||
|
||||
static struct bin_attribute *reipl_fcp_bin_attrs[] = {
|
||||
@@ -766,8 +903,8 @@ static ssize_t reipl_fcp_loadparm_store(struct kobject *kobj,
|
||||
}
|
||||
|
||||
static struct kobj_attribute sys_reipl_fcp_loadparm_attr =
|
||||
__ATTR(loadparm, S_IRUGO | S_IWUSR, reipl_fcp_loadparm_show,
|
||||
reipl_fcp_loadparm_store);
|
||||
__ATTR(loadparm, 0644, reipl_fcp_loadparm_show,
|
||||
reipl_fcp_loadparm_store);
|
||||
|
||||
static ssize_t reipl_fcp_clear_show(struct kobject *kobj,
|
||||
struct kobj_attribute *attr, char *page)
|
||||
@@ -779,7 +916,7 @@ static ssize_t reipl_fcp_clear_store(struct kobject *kobj,
|
||||
struct kobj_attribute *attr,
|
||||
const char *buf, size_t len)
|
||||
{
|
||||
if (strtobool(buf, &reipl_fcp_clear) < 0)
|
||||
if (kstrtobool(buf, &reipl_fcp_clear) < 0)
|
||||
return -EINVAL;
|
||||
return len;
|
||||
}
|
||||
@@ -840,7 +977,7 @@ static ssize_t reipl_nvme_scpdata_write(struct file *filp, struct kobject *kobj,
|
||||
}
|
||||
|
||||
static struct bin_attribute sys_reipl_nvme_scp_data_attr =
|
||||
__BIN_ATTR(scp_data, (S_IRUGO | S_IWUSR), reipl_nvme_scpdata_read,
|
||||
__BIN_ATTR(scp_data, 0644, reipl_nvme_scpdata_read,
|
||||
reipl_nvme_scpdata_write, DIAG308_SCPDATA_SIZE);
|
||||
|
||||
static struct bin_attribute *reipl_nvme_bin_attrs[] = {
|
||||
@@ -872,8 +1009,8 @@ static ssize_t reipl_nvme_loadparm_store(struct kobject *kobj,
|
||||
}
|
||||
|
||||
static struct kobj_attribute sys_reipl_nvme_loadparm_attr =
|
||||
__ATTR(loadparm, S_IRUGO | S_IWUSR, reipl_nvme_loadparm_show,
|
||||
reipl_nvme_loadparm_store);
|
||||
__ATTR(loadparm, 0644, reipl_nvme_loadparm_show,
|
||||
reipl_nvme_loadparm_store);
|
||||
|
||||
static struct attribute *reipl_nvme_attrs[] = {
|
||||
&sys_reipl_nvme_fid_attr.attr,
|
||||
@@ -899,7 +1036,7 @@ static ssize_t reipl_nvme_clear_store(struct kobject *kobj,
|
||||
struct kobj_attribute *attr,
|
||||
const char *buf, size_t len)
|
||||
{
|
||||
if (strtobool(buf, &reipl_nvme_clear) < 0)
|
||||
if (kstrtobool(buf, &reipl_nvme_clear) < 0)
|
||||
return -EINVAL;
|
||||
return len;
|
||||
}
|
||||
@@ -939,8 +1076,8 @@ static ssize_t reipl_ccw_loadparm_store(struct kobject *kobj,
|
||||
}
|
||||
|
||||
static struct kobj_attribute sys_reipl_ccw_loadparm_attr =
|
||||
__ATTR(loadparm, S_IRUGO | S_IWUSR, reipl_ccw_loadparm_show,
|
||||
reipl_ccw_loadparm_store);
|
||||
__ATTR(loadparm, 0644, reipl_ccw_loadparm_show,
|
||||
reipl_ccw_loadparm_store);
|
||||
|
||||
static ssize_t reipl_ccw_clear_show(struct kobject *kobj,
|
||||
struct kobj_attribute *attr, char *page)
|
||||
@@ -952,7 +1089,7 @@ static ssize_t reipl_ccw_clear_store(struct kobject *kobj,
|
||||
struct kobj_attribute *attr,
|
||||
const char *buf, size_t len)
|
||||
{
|
||||
if (strtobool(buf, &reipl_ccw_clear) < 0)
|
||||
if (kstrtobool(buf, &reipl_ccw_clear) < 0)
|
||||
return -EINVAL;
|
||||
return len;
|
||||
}
|
||||
@@ -985,6 +1122,85 @@ static struct attribute_group reipl_ccw_attr_group_lpar = {
|
||||
.attrs = reipl_ccw_attrs_lpar,
|
||||
};
|
||||
|
||||
/* ECKD reipl device attributes */
|
||||
|
||||
static ssize_t reipl_eckd_scpdata_read(struct file *filp, struct kobject *kobj,
|
||||
struct bin_attribute *attr,
|
||||
char *buf, loff_t off, size_t count)
|
||||
{
|
||||
size_t size = reipl_block_eckd->eckd.scp_data_len;
|
||||
void *scp_data = reipl_block_eckd->eckd.scp_data;
|
||||
|
||||
return memory_read_from_buffer(buf, count, &off, scp_data, size);
|
||||
}
|
||||
|
||||
static ssize_t reipl_eckd_scpdata_write(struct file *filp, struct kobject *kobj,
|
||||
struct bin_attribute *attr,
|
||||
char *buf, loff_t off, size_t count)
|
||||
{
|
||||
size_t scpdata_len = count;
|
||||
size_t padding;
|
||||
|
||||
if (off)
|
||||
return -EINVAL;
|
||||
|
||||
memcpy(reipl_block_eckd->eckd.scp_data, buf, count);
|
||||
if (scpdata_len % 8) {
|
||||
padding = 8 - (scpdata_len % 8);
|
||||
memset(reipl_block_eckd->eckd.scp_data + scpdata_len,
|
||||
0, padding);
|
||||
scpdata_len += padding;
|
||||
}
|
||||
|
||||
reipl_block_eckd->hdr.len = IPL_BP_ECKD_LEN + scpdata_len;
|
||||
reipl_block_eckd->eckd.len = IPL_BP0_ECKD_LEN + scpdata_len;
|
||||
reipl_block_eckd->eckd.scp_data_len = scpdata_len;
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static struct bin_attribute sys_reipl_eckd_scp_data_attr =
|
||||
__BIN_ATTR(scp_data, 0644, reipl_eckd_scpdata_read,
|
||||
reipl_eckd_scpdata_write, DIAG308_SCPDATA_SIZE);
|
||||
|
||||
static struct bin_attribute *reipl_eckd_bin_attrs[] = {
|
||||
&sys_reipl_eckd_scp_data_attr,
|
||||
NULL,
|
||||
};
|
||||
|
||||
DEFINE_IPL_CCW_ATTR_RW(reipl_eckd, device, reipl_block_eckd->eckd);
|
||||
DEFINE_IPL_ATTR_RW(reipl_eckd, bootprog, "%lld\n", "%lld\n",
|
||||
reipl_block_eckd->eckd.bootprog);
|
||||
|
||||
static struct attribute *reipl_eckd_attrs[] = {
|
||||
&sys_reipl_eckd_device_attr.attr,
|
||||
&sys_reipl_eckd_bootprog_attr.attr,
|
||||
&sys_reipl_eckd_br_chr_attr.attr,
|
||||
NULL,
|
||||
};
|
||||
|
||||
static struct attribute_group reipl_eckd_attr_group = {
|
||||
.attrs = reipl_eckd_attrs,
|
||||
.bin_attrs = reipl_eckd_bin_attrs
|
||||
};
|
||||
|
||||
static ssize_t reipl_eckd_clear_show(struct kobject *kobj,
|
||||
struct kobj_attribute *attr, char *page)
|
||||
{
|
||||
return sprintf(page, "%u\n", reipl_eckd_clear);
|
||||
}
|
||||
|
||||
static ssize_t reipl_eckd_clear_store(struct kobject *kobj,
|
||||
struct kobj_attribute *attr,
|
||||
const char *buf, size_t len)
|
||||
{
|
||||
if (strtobool(buf, &reipl_eckd_clear) < 0)
|
||||
return -EINVAL;
|
||||
return len;
|
||||
}
|
||||
|
||||
static struct kobj_attribute sys_reipl_eckd_clear_attr =
|
||||
__ATTR(clear, 0644, reipl_eckd_clear_show, reipl_eckd_clear_store);
|
||||
|
||||
/* NSS reipl device attributes */
|
||||
static void reipl_get_ascii_nss_name(char *dst,
|
||||
@@ -1032,12 +1248,12 @@ static ssize_t reipl_nss_name_store(struct kobject *kobj,
|
||||
}
|
||||
|
||||
static struct kobj_attribute sys_reipl_nss_name_attr =
|
||||
__ATTR(name, S_IRUGO | S_IWUSR, reipl_nss_name_show,
|
||||
reipl_nss_name_store);
|
||||
__ATTR(name, 0644, reipl_nss_name_show,
|
||||
reipl_nss_name_store);
|
||||
|
||||
static struct kobj_attribute sys_reipl_nss_loadparm_attr =
|
||||
__ATTR(loadparm, S_IRUGO | S_IWUSR, reipl_nss_loadparm_show,
|
||||
reipl_nss_loadparm_store);
|
||||
__ATTR(loadparm, 0644, reipl_nss_loadparm_show,
|
||||
reipl_nss_loadparm_store);
|
||||
|
||||
static struct attribute *reipl_nss_attrs[] = {
|
||||
&sys_reipl_nss_name_attr.attr,
|
||||
@@ -1068,6 +1284,9 @@ static int reipl_set_type(enum ipl_type type)
|
||||
case IPL_TYPE_CCW:
|
||||
reipl_block_actual = reipl_block_ccw;
|
||||
break;
|
||||
case IPL_TYPE_ECKD:
|
||||
reipl_block_actual = reipl_block_eckd;
|
||||
break;
|
||||
case IPL_TYPE_FCP:
|
||||
reipl_block_actual = reipl_block_fcp;
|
||||
break;
|
||||
@@ -1098,6 +1317,8 @@ static ssize_t reipl_type_store(struct kobject *kobj,
|
||||
|
||||
if (strncmp(buf, IPL_CCW_STR, strlen(IPL_CCW_STR)) == 0)
|
||||
rc = reipl_set_type(IPL_TYPE_CCW);
|
||||
else if (strncmp(buf, IPL_ECKD_STR, strlen(IPL_ECKD_STR)) == 0)
|
||||
rc = reipl_set_type(IPL_TYPE_ECKD);
|
||||
else if (strncmp(buf, IPL_FCP_STR, strlen(IPL_FCP_STR)) == 0)
|
||||
rc = reipl_set_type(IPL_TYPE_FCP);
|
||||
else if (strncmp(buf, IPL_NVME_STR, strlen(IPL_NVME_STR)) == 0)
|
||||
@@ -1113,6 +1334,7 @@ static struct kobj_attribute reipl_type_attr =
|
||||
static struct kset *reipl_kset;
|
||||
static struct kset *reipl_fcp_kset;
|
||||
static struct kset *reipl_nvme_kset;
|
||||
static struct kset *reipl_eckd_kset;
|
||||
|
||||
static void __reipl_run(void *unused)
|
||||
{
|
||||
@@ -1124,6 +1346,13 @@ static void __reipl_run(void *unused)
|
||||
else
|
||||
diag308(DIAG308_LOAD_NORMAL_DUMP, NULL);
|
||||
break;
|
||||
case IPL_TYPE_ECKD:
|
||||
diag308(DIAG308_SET, reipl_block_eckd);
|
||||
if (reipl_eckd_clear)
|
||||
diag308(DIAG308_LOAD_CLEAR, NULL);
|
||||
else
|
||||
diag308(DIAG308_LOAD_NORMAL, NULL);
|
||||
break;
|
||||
case IPL_TYPE_FCP:
|
||||
diag308(DIAG308_SET, reipl_block_fcp);
|
||||
if (reipl_fcp_clear)
|
||||
@@ -1147,6 +1376,7 @@ static void __reipl_run(void *unused)
|
||||
break;
|
||||
case IPL_TYPE_FCP_DUMP:
|
||||
case IPL_TYPE_NVME_DUMP:
|
||||
case IPL_TYPE_ECKD_DUMP:
|
||||
break;
|
||||
}
|
||||
disabled_wait();
|
||||
@@ -1344,6 +1574,58 @@ out1:
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int __init reipl_eckd_init(void)
|
||||
{
|
||||
int rc;
|
||||
|
||||
if (!sclp.has_sipl_eckd)
|
||||
return 0;
|
||||
|
||||
reipl_block_eckd = (void *)get_zeroed_page(GFP_KERNEL);
|
||||
if (!reipl_block_eckd)
|
||||
return -ENOMEM;
|
||||
|
||||
/* sysfs: create kset for mixing attr group and bin attrs */
|
||||
reipl_eckd_kset = kset_create_and_add(IPL_ECKD_STR, NULL,
|
||||
&reipl_kset->kobj);
|
||||
if (!reipl_eckd_kset) {
|
||||
free_page((unsigned long)reipl_block_eckd);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
rc = sysfs_create_group(&reipl_eckd_kset->kobj, &reipl_eckd_attr_group);
|
||||
if (rc)
|
||||
goto out1;
|
||||
|
||||
if (test_facility(141)) {
|
||||
rc = sysfs_create_file(&reipl_eckd_kset->kobj,
|
||||
&sys_reipl_eckd_clear_attr.attr);
|
||||
if (rc)
|
||||
goto out2;
|
||||
} else {
|
||||
reipl_eckd_clear = true;
|
||||
}
|
||||
|
||||
if (ipl_info.type == IPL_TYPE_ECKD) {
|
||||
memcpy(reipl_block_eckd, &ipl_block, sizeof(ipl_block));
|
||||
} else {
|
||||
reipl_block_eckd->hdr.len = IPL_BP_ECKD_LEN;
|
||||
reipl_block_eckd->hdr.version = IPL_PARM_BLOCK_VERSION;
|
||||
reipl_block_eckd->eckd.len = IPL_BP0_ECKD_LEN;
|
||||
reipl_block_eckd->eckd.pbt = IPL_PBT_ECKD;
|
||||
reipl_block_eckd->eckd.opt = IPL_PB0_ECKD_OPT_IPL;
|
||||
}
|
||||
reipl_capabilities |= IPL_TYPE_ECKD;
|
||||
return 0;
|
||||
|
||||
out2:
|
||||
sysfs_remove_group(&reipl_eckd_kset->kobj, &reipl_eckd_attr_group);
|
||||
out1:
|
||||
kset_unregister(reipl_eckd_kset);
|
||||
free_page((unsigned long)reipl_block_eckd);
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int __init reipl_type_init(void)
|
||||
{
|
||||
enum ipl_type reipl_type = ipl_info.type;
|
||||
@@ -1365,6 +1647,9 @@ static int __init reipl_type_init(void)
|
||||
} else if (reipl_block->pb0_hdr.pbt == IPL_PBT_CCW) {
|
||||
memcpy(reipl_block_ccw, reipl_block, size);
|
||||
reipl_type = IPL_TYPE_CCW;
|
||||
} else if (reipl_block->pb0_hdr.pbt == IPL_PBT_ECKD) {
|
||||
memcpy(reipl_block_eckd, reipl_block, size);
|
||||
reipl_type = IPL_TYPE_ECKD;
|
||||
}
|
||||
out:
|
||||
return reipl_set_type(reipl_type);
|
||||
@@ -1383,6 +1668,9 @@ static int __init reipl_init(void)
|
||||
return rc;
|
||||
}
|
||||
rc = reipl_ccw_init();
|
||||
if (rc)
|
||||
return rc;
|
||||
rc = reipl_eckd_init();
|
||||
if (rc)
|
||||
return rc;
|
||||
rc = reipl_fcp_init();
|
||||
@@ -1457,6 +1745,29 @@ static struct attribute_group dump_nvme_attr_group = {
|
||||
.attrs = dump_nvme_attrs,
|
||||
};
|
||||
|
||||
/* ECKD dump device attributes */
|
||||
DEFINE_IPL_CCW_ATTR_RW(dump_eckd, device, dump_block_eckd->eckd);
|
||||
DEFINE_IPL_ATTR_RW(dump_eckd, bootprog, "%lld\n", "%llx\n",
|
||||
dump_block_eckd->eckd.bootprog);
|
||||
|
||||
IPL_ATTR_BR_CHR_SHOW_FN(dump, dump_block_eckd->eckd);
|
||||
IPL_ATTR_BR_CHR_STORE_FN(dump, dump_block_eckd->eckd);
|
||||
|
||||
static struct kobj_attribute sys_dump_eckd_br_chr_attr =
|
||||
__ATTR(br_chr, 0644, eckd_dump_br_chr_show, eckd_dump_br_chr_store);
|
||||
|
||||
static struct attribute *dump_eckd_attrs[] = {
|
||||
&sys_dump_eckd_device_attr.attr,
|
||||
&sys_dump_eckd_bootprog_attr.attr,
|
||||
&sys_dump_eckd_br_chr_attr.attr,
|
||||
NULL,
|
||||
};
|
||||
|
||||
static struct attribute_group dump_eckd_attr_group = {
|
||||
.name = IPL_ECKD_STR,
|
||||
.attrs = dump_eckd_attrs,
|
||||
};
|
||||
|
||||
/* CCW dump device attributes */
|
||||
DEFINE_IPL_CCW_ATTR_RW(dump_ccw, device, dump_block_ccw->ccw);
|
||||
|
||||
@@ -1496,6 +1807,8 @@ static ssize_t dump_type_store(struct kobject *kobj,
|
||||
rc = dump_set_type(DUMP_TYPE_NONE);
|
||||
else if (strncmp(buf, DUMP_CCW_STR, strlen(DUMP_CCW_STR)) == 0)
|
||||
rc = dump_set_type(DUMP_TYPE_CCW);
|
||||
else if (strncmp(buf, DUMP_ECKD_STR, strlen(DUMP_ECKD_STR)) == 0)
|
||||
rc = dump_set_type(DUMP_TYPE_ECKD);
|
||||
else if (strncmp(buf, DUMP_FCP_STR, strlen(DUMP_FCP_STR)) == 0)
|
||||
rc = dump_set_type(DUMP_TYPE_FCP);
|
||||
else if (strncmp(buf, DUMP_NVME_STR, strlen(DUMP_NVME_STR)) == 0)
|
||||
@@ -1524,6 +1837,9 @@ static void __dump_run(void *unused)
|
||||
case DUMP_TYPE_CCW:
|
||||
diag308_dump(dump_block_ccw);
|
||||
break;
|
||||
case DUMP_TYPE_ECKD:
|
||||
diag308_dump(dump_block_eckd);
|
||||
break;
|
||||
case DUMP_TYPE_FCP:
|
||||
diag308_dump(dump_block_fcp);
|
||||
break;
|
||||
@@ -1609,6 +1925,29 @@ static int __init dump_nvme_init(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init dump_eckd_init(void)
|
||||
{
|
||||
int rc;
|
||||
|
||||
if (!sclp_ipl_info.has_dump || !sclp.has_sipl_eckd)
|
||||
return 0; /* LDIPL DUMP is not installed */
|
||||
dump_block_eckd = (void *)get_zeroed_page(GFP_KERNEL);
|
||||
if (!dump_block_eckd)
|
||||
return -ENOMEM;
|
||||
rc = sysfs_create_group(&dump_kset->kobj, &dump_eckd_attr_group);
|
||||
if (rc) {
|
||||
free_page((unsigned long)dump_block_eckd);
|
||||
return rc;
|
||||
}
|
||||
dump_block_eckd->hdr.len = IPL_BP_ECKD_LEN;
|
||||
dump_block_eckd->hdr.version = IPL_PARM_BLOCK_VERSION;
|
||||
dump_block_eckd->eckd.len = IPL_BP0_ECKD_LEN;
|
||||
dump_block_eckd->eckd.pbt = IPL_PBT_ECKD;
|
||||
dump_block_eckd->eckd.opt = IPL_PB0_ECKD_OPT_DUMP;
|
||||
dump_capabilities |= DUMP_TYPE_ECKD;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init dump_init(void)
|
||||
{
|
||||
int rc;
|
||||
@@ -1622,6 +1961,9 @@ static int __init dump_init(void)
|
||||
return rc;
|
||||
}
|
||||
rc = dump_ccw_init();
|
||||
if (rc)
|
||||
return rc;
|
||||
rc = dump_eckd_init();
|
||||
if (rc)
|
||||
return rc;
|
||||
rc = dump_fcp_init();
|
||||
@@ -2057,6 +2399,11 @@ void __init setup_ipl(void)
|
||||
ipl_info.data.ccw.dev_id.ssid = ipl_block.ccw.ssid;
|
||||
ipl_info.data.ccw.dev_id.devno = ipl_block.ccw.devno;
|
||||
break;
|
||||
case IPL_TYPE_ECKD:
|
||||
case IPL_TYPE_ECKD_DUMP:
|
||||
ipl_info.data.eckd.dev_id.ssid = ipl_block.eckd.ssid;
|
||||
ipl_info.data.eckd.dev_id.devno = ipl_block.eckd.devno;
|
||||
break;
|
||||
case IPL_TYPE_FCP:
|
||||
case IPL_TYPE_FCP_DUMP:
|
||||
ipl_info.data.fcp.dev_id.ssid = 0;
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
#include <asm/set_memory.h>
|
||||
#include <asm/sections.h>
|
||||
#include <asm/dis.h>
|
||||
#include "kprobes.h"
|
||||
#include "entry.h"
|
||||
|
||||
DEFINE_PER_CPU(struct kprobe *, current_kprobe);
|
||||
@@ -31,8 +32,6 @@ DEFINE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk);
|
||||
|
||||
struct kretprobe_blackpoint kretprobe_blacklist[] = { };
|
||||
|
||||
DEFINE_INSN_CACHE_OPS(s390_insn);
|
||||
|
||||
static int insn_page_in_use;
|
||||
|
||||
void *alloc_insn_page(void)
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
#ifndef _ARCH_S390_KPROBES_H
|
||||
#define _ARCH_S390_KPROBES_H
|
||||
|
||||
#include <linux/kprobes.h>
|
||||
|
||||
DEFINE_INSN_CACHE_OPS(s390_insn);
|
||||
|
||||
#endif
|
||||
+90
-91
@@ -19,7 +19,7 @@
|
||||
#include <linux/time.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/sched/signal.h>
|
||||
|
||||
#include <linux/kvm_host.h>
|
||||
#include <linux/export.h>
|
||||
#include <asm/lowcore.h>
|
||||
#include <asm/smp.h>
|
||||
@@ -31,8 +31,7 @@
|
||||
#include <asm/ctl_reg.h>
|
||||
#include <asm/asm-offsets.h>
|
||||
#include <asm/pai.h>
|
||||
|
||||
#include <linux/kvm_host.h>
|
||||
#include <asm/vx-insn.h>
|
||||
|
||||
struct mcck_struct {
|
||||
unsigned int kill_task : 1;
|
||||
@@ -43,21 +42,12 @@ struct mcck_struct {
|
||||
};
|
||||
|
||||
static DEFINE_PER_CPU(struct mcck_struct, cpu_mcck);
|
||||
static struct kmem_cache *mcesa_cache;
|
||||
static unsigned long mcesa_origin_lc;
|
||||
|
||||
static inline int nmi_needs_mcesa(void)
|
||||
{
|
||||
return MACHINE_HAS_VX || MACHINE_HAS_GS;
|
||||
}
|
||||
|
||||
static inline unsigned long nmi_get_mcesa_size(void)
|
||||
{
|
||||
if (MACHINE_HAS_GS)
|
||||
return MCESA_MAX_SIZE;
|
||||
return MCESA_MIN_SIZE;
|
||||
}
|
||||
|
||||
/*
|
||||
* The initial machine check extended save area for the boot CPU.
|
||||
* It will be replaced on the boot CPU reinit with an allocated
|
||||
@@ -75,36 +65,23 @@ void __init nmi_alloc_mcesa_early(u64 *mcesad)
|
||||
*mcesad |= ilog2(MCESA_MAX_SIZE);
|
||||
}
|
||||
|
||||
static void __init nmi_alloc_cache(void)
|
||||
int nmi_alloc_mcesa(u64 *mcesad)
|
||||
{
|
||||
unsigned long size;
|
||||
|
||||
if (!nmi_needs_mcesa())
|
||||
return;
|
||||
size = nmi_get_mcesa_size();
|
||||
if (size > MCESA_MIN_SIZE)
|
||||
mcesa_origin_lc = ilog2(size);
|
||||
/* create slab cache for the machine-check-extended-save-areas */
|
||||
mcesa_cache = kmem_cache_create("nmi_save_areas", size, size, 0, NULL);
|
||||
if (!mcesa_cache)
|
||||
panic("Couldn't create nmi save area cache");
|
||||
}
|
||||
|
||||
int __ref nmi_alloc_mcesa(u64 *mcesad)
|
||||
{
|
||||
unsigned long origin;
|
||||
void *origin;
|
||||
|
||||
*mcesad = 0;
|
||||
if (!nmi_needs_mcesa())
|
||||
return 0;
|
||||
if (!mcesa_cache)
|
||||
nmi_alloc_cache();
|
||||
origin = (unsigned long) kmem_cache_alloc(mcesa_cache, GFP_KERNEL);
|
||||
size = MACHINE_HAS_GS ? MCESA_MAX_SIZE : MCESA_MIN_SIZE;
|
||||
origin = kmalloc(size, GFP_KERNEL);
|
||||
if (!origin)
|
||||
return -ENOMEM;
|
||||
/* The pointer is stored with mcesa_bits ORed in */
|
||||
kmemleak_not_leak((void *) origin);
|
||||
*mcesad = __pa(origin) | mcesa_origin_lc;
|
||||
kmemleak_not_leak(origin);
|
||||
*mcesad = __pa(origin);
|
||||
if (MACHINE_HAS_GS)
|
||||
*mcesad |= ilog2(MCESA_MAX_SIZE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -112,12 +89,64 @@ void nmi_free_mcesa(u64 *mcesad)
|
||||
{
|
||||
if (!nmi_needs_mcesa())
|
||||
return;
|
||||
kmem_cache_free(mcesa_cache, __va(*mcesad & MCESA_ORIGIN_MASK));
|
||||
kfree(__va(*mcesad & MCESA_ORIGIN_MASK));
|
||||
}
|
||||
|
||||
static __always_inline char *nmi_puts(char *dest, const char *src)
|
||||
{
|
||||
while (*src)
|
||||
*dest++ = *src++;
|
||||
*dest = 0;
|
||||
return dest;
|
||||
}
|
||||
|
||||
static __always_inline char *u64_to_hex(char *dest, u64 val)
|
||||
{
|
||||
int i, num;
|
||||
|
||||
for (i = 1; i <= 16; i++) {
|
||||
num = (val >> (64 - 4 * i)) & 0xf;
|
||||
if (num >= 10)
|
||||
*dest++ = 'A' + num - 10;
|
||||
else
|
||||
*dest++ = '0' + num;
|
||||
}
|
||||
*dest = 0;
|
||||
return dest;
|
||||
}
|
||||
|
||||
static notrace void s390_handle_damage(void)
|
||||
{
|
||||
union ctlreg0 cr0, cr0_new;
|
||||
char message[100];
|
||||
psw_t psw_save;
|
||||
char *ptr;
|
||||
|
||||
smp_emergency_stop();
|
||||
diag_amode31_ops.diag308_reset();
|
||||
ptr = nmi_puts(message, "System stopped due to unrecoverable machine check, code: 0x");
|
||||
u64_to_hex(ptr, S390_lowcore.mcck_interruption_code);
|
||||
|
||||
/*
|
||||
* Disable low address protection and make machine check new PSW a
|
||||
* disabled wait PSW. Any additional machine check cannot be handled.
|
||||
*/
|
||||
__ctl_store(cr0.val, 0, 0);
|
||||
cr0_new = cr0;
|
||||
cr0_new.lap = 0;
|
||||
__ctl_load(cr0_new.val, 0, 0);
|
||||
psw_save = S390_lowcore.mcck_new_psw;
|
||||
psw_bits(S390_lowcore.mcck_new_psw).io = 0;
|
||||
psw_bits(S390_lowcore.mcck_new_psw).ext = 0;
|
||||
psw_bits(S390_lowcore.mcck_new_psw).wait = 1;
|
||||
sclp_emergency_printk(message);
|
||||
|
||||
/*
|
||||
* Restore machine check new PSW and control register 0 to original
|
||||
* values. This makes possible system dump analysis easier.
|
||||
*/
|
||||
S390_lowcore.mcck_new_psw = psw_save;
|
||||
__ctl_load(cr0.val, 0, 0);
|
||||
disabled_wait();
|
||||
while (1);
|
||||
}
|
||||
@@ -181,10 +210,10 @@ void noinstr s390_handle_mcck(struct pt_regs *regs)
|
||||
trace_hardirqs_on();
|
||||
}
|
||||
/*
|
||||
* returns 0 if all required registers are available
|
||||
* returns 0 if register contents could be validated
|
||||
* returns 1 otherwise
|
||||
*/
|
||||
static int notrace s390_validate_registers(union mci mci, int umode)
|
||||
static int notrace s390_validate_registers(union mci mci)
|
||||
{
|
||||
struct mcesa *mcesa;
|
||||
void *fpt_save_area;
|
||||
@@ -195,45 +224,15 @@ static int notrace s390_validate_registers(union mci mci, int umode)
|
||||
kill_task = 0;
|
||||
zero = 0;
|
||||
|
||||
if (!mci.gr) {
|
||||
/*
|
||||
* General purpose registers couldn't be restored and have
|
||||
* unknown contents. Stop system or terminate process.
|
||||
*/
|
||||
if (!umode)
|
||||
s390_handle_damage();
|
||||
if (!mci.gr || !mci.fp)
|
||||
kill_task = 1;
|
||||
}
|
||||
if (!mci.fp) {
|
||||
/*
|
||||
* Floating point registers can't be restored. If the
|
||||
* kernel currently uses floating point registers the
|
||||
* system is stopped. If the process has its floating
|
||||
* pointer registers loaded it is terminated.
|
||||
*/
|
||||
if (S390_lowcore.fpu_flags & KERNEL_VXR_V0V7)
|
||||
s390_handle_damage();
|
||||
if (!test_cpu_flag(CIF_FPU))
|
||||
kill_task = 1;
|
||||
}
|
||||
fpt_save_area = &S390_lowcore.floating_pt_save_area;
|
||||
if (!mci.fc) {
|
||||
/*
|
||||
* Floating point control register can't be restored.
|
||||
* If the kernel currently uses the floating pointer
|
||||
* registers and needs the FPC register the system is
|
||||
* stopped. If the process has its floating pointer
|
||||
* registers loaded it is terminated. Otherwise the
|
||||
* FPC is just validated.
|
||||
*/
|
||||
if (S390_lowcore.fpu_flags & KERNEL_FPC)
|
||||
s390_handle_damage();
|
||||
kill_task = 1;
|
||||
asm volatile(
|
||||
" lfpc %0\n"
|
||||
:
|
||||
: "Q" (zero));
|
||||
if (!test_cpu_flag(CIF_FPU))
|
||||
kill_task = 1;
|
||||
} else {
|
||||
asm volatile(
|
||||
" lfpc %0\n"
|
||||
@@ -275,26 +274,15 @@ static int notrace s390_validate_registers(union mci mci, int umode)
|
||||
* appropriate actions. The host vector or FPU values have been
|
||||
* saved by KVM and will be restored by KVM.
|
||||
*/
|
||||
if (!mci.vr && !test_cpu_flag(CIF_MCCK_GUEST)) {
|
||||
/*
|
||||
* Vector registers can't be restored. If the kernel
|
||||
* currently uses vector registers the system is
|
||||
* stopped. If the process has its vector registers
|
||||
* loaded it is terminated. Otherwise just validate
|
||||
* the registers.
|
||||
*/
|
||||
if (S390_lowcore.fpu_flags & KERNEL_VXR)
|
||||
s390_handle_damage();
|
||||
if (!test_cpu_flag(CIF_FPU))
|
||||
kill_task = 1;
|
||||
}
|
||||
if (!mci.vr && !test_cpu_flag(CIF_MCCK_GUEST))
|
||||
kill_task = 1;
|
||||
cr0.val = S390_lowcore.cregs_save_area[0];
|
||||
cr0.afp = cr0.vx = 1;
|
||||
__ctl_load(cr0.val, 0, 0);
|
||||
asm volatile(
|
||||
" la 1,%0\n"
|
||||
" .word 0xe70f,0x1000,0x0036\n" /* vlm 0,15,0(1) */
|
||||
" .word 0xe70f,0x1100,0x0c36\n" /* vlm 16,31,256(1) */
|
||||
" VLM 0,15,0,1\n"
|
||||
" VLM 16,31,256,1\n"
|
||||
:
|
||||
: "Q" (*(struct vx_array *)mcesa->vector_save_area)
|
||||
: "1");
|
||||
@@ -306,13 +294,8 @@ static int notrace s390_validate_registers(union mci mci, int umode)
|
||||
:
|
||||
: "a" (&S390_lowcore.access_regs_save_area)
|
||||
: "memory");
|
||||
if (!mci.ar) {
|
||||
/*
|
||||
* Access registers have unknown contents.
|
||||
* Terminating task.
|
||||
*/
|
||||
if (!mci.ar)
|
||||
kill_task = 1;
|
||||
}
|
||||
/* Validate guarded storage registers */
|
||||
cr2.val = S390_lowcore.cregs_save_area[2];
|
||||
if (cr2.gse) {
|
||||
@@ -451,7 +434,9 @@ int notrace s390_do_machine_check(struct pt_regs *regs)
|
||||
s390_handle_damage();
|
||||
}
|
||||
}
|
||||
if (s390_validate_registers(mci, user_mode(regs))) {
|
||||
if (s390_validate_registers(mci)) {
|
||||
if (!user_mode(regs))
|
||||
s390_handle_damage();
|
||||
/*
|
||||
* Couldn't restore all register contents for the
|
||||
* user space process -> mark task for termination.
|
||||
@@ -480,7 +465,21 @@ int notrace s390_do_machine_check(struct pt_regs *regs)
|
||||
mcck->stp_queue |= stp_island_check();
|
||||
mcck_pending = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Reinject storage related machine checks into the guest if they
|
||||
* happen when the guest is running.
|
||||
*/
|
||||
if (!test_cpu_flag(CIF_MCCK_GUEST)) {
|
||||
/* Storage error uncorrected */
|
||||
if (mci.se)
|
||||
s390_handle_damage();
|
||||
/* Storage key-error uncorrected */
|
||||
if (mci.ke)
|
||||
s390_handle_damage();
|
||||
/* Storage degradation */
|
||||
if (mci.ds && mci.fa)
|
||||
s390_handle_damage();
|
||||
}
|
||||
if (mci.cp) {
|
||||
/* Channel report word pending */
|
||||
mcck->channel_report = 1;
|
||||
|
||||
@@ -35,9 +35,9 @@ struct pai_userdata {
|
||||
struct paicrypt_map {
|
||||
unsigned long *page; /* Page for CPU to store counters */
|
||||
struct pai_userdata *save; /* Page to store no-zero counters */
|
||||
unsigned int users; /* # of PAI crypto users */
|
||||
unsigned int sampler; /* # of PAI crypto samplers */
|
||||
unsigned int counter; /* # of PAI crypto counters */
|
||||
unsigned int active_events; /* # of PAI crypto users */
|
||||
unsigned int refcnt; /* Reference count mapped buffers */
|
||||
enum paievt_mode mode; /* Type of event */
|
||||
struct perf_event *event; /* Perf event for sampling */
|
||||
};
|
||||
|
||||
@@ -56,15 +56,11 @@ static void paicrypt_event_destroy(struct perf_event *event)
|
||||
cpump->event = NULL;
|
||||
static_branch_dec(&pai_key);
|
||||
mutex_lock(&pai_reserve_mutex);
|
||||
if (event->attr.sample_period)
|
||||
cpump->sampler -= 1;
|
||||
else
|
||||
cpump->counter -= 1;
|
||||
debug_sprintf_event(cfm_dbg, 5, "%s event %#llx cpu %d"
|
||||
" sampler %d counter %d\n", __func__,
|
||||
event->attr.config, event->cpu, cpump->sampler,
|
||||
cpump->counter);
|
||||
if (!cpump->counter && !cpump->sampler) {
|
||||
debug_sprintf_event(cfm_dbg, 5, "%s event %#llx cpu %d users %d"
|
||||
" mode %d refcnt %d\n", __func__,
|
||||
event->attr.config, event->cpu,
|
||||
cpump->active_events, cpump->mode, cpump->refcnt);
|
||||
if (!--cpump->refcnt) {
|
||||
debug_sprintf_event(cfm_dbg, 4, "%s page %#lx save %p\n",
|
||||
__func__, (unsigned long)cpump->page,
|
||||
cpump->save);
|
||||
@@ -72,6 +68,7 @@ static void paicrypt_event_destroy(struct perf_event *event)
|
||||
cpump->page = NULL;
|
||||
kvfree(cpump->save);
|
||||
cpump->save = NULL;
|
||||
cpump->mode = PAI_MODE_NONE;
|
||||
}
|
||||
mutex_unlock(&pai_reserve_mutex);
|
||||
}
|
||||
@@ -136,17 +133,14 @@ static u64 paicrypt_getall(struct perf_event *event)
|
||||
*/
|
||||
static int paicrypt_busy(struct perf_event_attr *a, struct paicrypt_map *cpump)
|
||||
{
|
||||
unsigned int *use_ptr;
|
||||
int rc = 0;
|
||||
|
||||
mutex_lock(&pai_reserve_mutex);
|
||||
if (a->sample_period) { /* Sampling requested */
|
||||
use_ptr = &cpump->sampler;
|
||||
if (cpump->counter || cpump->sampler)
|
||||
if (cpump->mode != PAI_MODE_NONE)
|
||||
rc = -EBUSY; /* ... sampling/counting active */
|
||||
} else { /* Counting requested */
|
||||
use_ptr = &cpump->counter;
|
||||
if (cpump->sampler)
|
||||
if (cpump->mode == PAI_MODE_SAMPLING)
|
||||
rc = -EBUSY; /* ... and sampling active */
|
||||
}
|
||||
if (rc)
|
||||
@@ -172,12 +166,16 @@ static int paicrypt_busy(struct perf_event_attr *a, struct paicrypt_map *cpump)
|
||||
rc = 0;
|
||||
|
||||
unlock:
|
||||
/* If rc is non-zero, do not increment counter/sampler. */
|
||||
if (!rc)
|
||||
*use_ptr += 1;
|
||||
debug_sprintf_event(cfm_dbg, 5, "%s sample_period %#llx sampler %d"
|
||||
" counter %d page %#lx save %p rc %d\n", __func__,
|
||||
a->sample_period, cpump->sampler, cpump->counter,
|
||||
/* If rc is non-zero, do not set mode and reference count */
|
||||
if (!rc) {
|
||||
cpump->refcnt++;
|
||||
cpump->mode = a->sample_period ? PAI_MODE_SAMPLING
|
||||
: PAI_MODE_COUNTING;
|
||||
}
|
||||
debug_sprintf_event(cfm_dbg, 5, "%s sample_period %#llx users %d"
|
||||
" mode %d refcnt %d page %#lx save %p rc %d\n",
|
||||
__func__, a->sample_period, cpump->active_events,
|
||||
cpump->mode, cpump->refcnt,
|
||||
(unsigned long)cpump->page, cpump->save, rc);
|
||||
mutex_unlock(&pai_reserve_mutex);
|
||||
return rc;
|
||||
@@ -262,7 +260,7 @@ static int paicrypt_add(struct perf_event *event, int flags)
|
||||
struct paicrypt_map *cpump = this_cpu_ptr(&paicrypt_map);
|
||||
unsigned long ccd;
|
||||
|
||||
if (cpump->users++ == 0) {
|
||||
if (++cpump->active_events == 1) {
|
||||
ccd = virt_to_phys(cpump->page) | PAI_CRYPTO_KERNEL_OFFSET;
|
||||
WRITE_ONCE(S390_lowcore.ccd, ccd);
|
||||
__ctl_set_bit(0, 50);
|
||||
@@ -293,7 +291,7 @@ static void paicrypt_del(struct perf_event *event, int flags)
|
||||
if (!event->attr.sample_period)
|
||||
/* Only counting needs to read counter */
|
||||
paicrypt_stop(event, PERF_EF_UPDATE);
|
||||
if (cpump->users-- == 1) {
|
||||
if (--cpump->active_events == 0) {
|
||||
__ctl_clear_bit(0, 50);
|
||||
WRITE_ONCE(S390_lowcore.ccd, 0);
|
||||
}
|
||||
|
||||
@@ -28,12 +28,6 @@
|
||||
static debug_info_t *paiext_dbg;
|
||||
static unsigned int paiext_cnt; /* Extracted with QPACI instruction */
|
||||
|
||||
enum paiext_mode {
|
||||
PAI_MODE_NONE,
|
||||
PAI_MODE_SAMPLING,
|
||||
PAI_MODE_COUNTER,
|
||||
};
|
||||
|
||||
struct pai_userdata {
|
||||
u16 num;
|
||||
u64 value;
|
||||
@@ -54,7 +48,7 @@ struct paiext_cb { /* PAI extension 1 control block */
|
||||
struct paiext_map {
|
||||
unsigned long *area; /* Area for CPU to store counters */
|
||||
struct pai_userdata *save; /* Area to store non-zero counters */
|
||||
enum paiext_mode mode; /* Type of event */
|
||||
enum paievt_mode mode; /* Type of event */
|
||||
unsigned int active_events; /* # of PAI Extension users */
|
||||
unsigned int refcnt;
|
||||
struct perf_event *event; /* Perf event for sampling */
|
||||
@@ -192,14 +186,14 @@ static int paiext_alloc(struct perf_event_attr *a, struct perf_event *event)
|
||||
goto unlock;
|
||||
}
|
||||
cpump->mode = a->sample_period ? PAI_MODE_SAMPLING
|
||||
: PAI_MODE_COUNTER;
|
||||
: PAI_MODE_COUNTING;
|
||||
} else {
|
||||
/* Multiple invocation, check whats active.
|
||||
* Supported are multiple counter events or only one sampling
|
||||
* event concurrently at any one time.
|
||||
*/
|
||||
if (cpump->mode == PAI_MODE_SAMPLING ||
|
||||
(cpump->mode == PAI_MODE_COUNTER && a->sample_period)) {
|
||||
(cpump->mode == PAI_MODE_COUNTING && a->sample_period)) {
|
||||
rc = -EBUSY;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
@@ -437,7 +437,7 @@ static void __init setup_lowcore_dat_off(void)
|
||||
lc->svc_new_psw.addr = (unsigned long) system_call;
|
||||
lc->program_new_psw.mask = int_psw_mask | PSW_MASK_MCHECK;
|
||||
lc->program_new_psw.addr = (unsigned long) pgm_check_handler;
|
||||
lc->mcck_new_psw.mask = PSW_KERNEL_BITS;
|
||||
lc->mcck_new_psw.mask = int_psw_mask;
|
||||
lc->mcck_new_psw.addr = (unsigned long) mcck_int_handler;
|
||||
lc->io_new_psw.mask = int_psw_mask | PSW_MASK_MCHECK;
|
||||
lc->io_new_psw.addr = (unsigned long) io_int_handler;
|
||||
@@ -512,6 +512,7 @@ static void __init setup_lowcore_dat_on(void)
|
||||
S390_lowcore.external_new_psw.mask |= PSW_MASK_DAT;
|
||||
S390_lowcore.svc_new_psw.mask |= PSW_MASK_DAT;
|
||||
S390_lowcore.program_new_psw.mask |= PSW_MASK_DAT;
|
||||
S390_lowcore.mcck_new_psw.mask |= PSW_MASK_DAT;
|
||||
S390_lowcore.io_new_psw.mask |= PSW_MASK_DAT;
|
||||
__ctl_set_bit(0, 28);
|
||||
__ctl_store(S390_lowcore.cregs_save_area, 0, 15);
|
||||
|
||||
+36
-3
@@ -31,6 +31,7 @@
|
||||
#include <linux/cma.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/dma-direct.h>
|
||||
#include <linux/percpu.h>
|
||||
#include <asm/processor.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <asm/pgalloc.h>
|
||||
@@ -207,9 +208,6 @@ void free_initmem(void)
|
||||
__set_memory((unsigned long)_sinittext,
|
||||
(unsigned long)(_einittext - _sinittext) >> PAGE_SHIFT,
|
||||
SET_MEMORY_RW | SET_MEMORY_NX);
|
||||
free_reserved_area(sclp_early_sccb,
|
||||
sclp_early_sccb + EXT_SCCB_READ_SCP,
|
||||
POISON_FREE_INITMEM, "unused early sccb");
|
||||
free_initmem_default(POISON_FREE_INITMEM);
|
||||
}
|
||||
|
||||
@@ -222,6 +220,41 @@ unsigned long memory_block_size_bytes(void)
|
||||
return max_t(unsigned long, MIN_MEMORY_BLOCK_SIZE, sclp.rzm);
|
||||
}
|
||||
|
||||
unsigned long __per_cpu_offset[NR_CPUS] __read_mostly;
|
||||
EXPORT_SYMBOL(__per_cpu_offset);
|
||||
|
||||
static int __init pcpu_cpu_distance(unsigned int from, unsigned int to)
|
||||
{
|
||||
return LOCAL_DISTANCE;
|
||||
}
|
||||
|
||||
static int __init pcpu_cpu_to_node(int cpu)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void __init setup_per_cpu_areas(void)
|
||||
{
|
||||
unsigned long delta;
|
||||
unsigned int cpu;
|
||||
int rc;
|
||||
|
||||
/*
|
||||
* Always reserve area for module percpu variables. That's
|
||||
* what the legacy allocator did.
|
||||
*/
|
||||
rc = pcpu_embed_first_chunk(PERCPU_MODULE_RESERVE,
|
||||
PERCPU_DYNAMIC_RESERVE, PAGE_SIZE,
|
||||
pcpu_cpu_distance,
|
||||
pcpu_cpu_to_node);
|
||||
if (rc < 0)
|
||||
panic("Failed to initialize percpu areas.");
|
||||
|
||||
delta = (unsigned long)pcpu_base_addr - (unsigned long)__per_cpu_start;
|
||||
for_each_possible_cpu(cpu)
|
||||
__per_cpu_offset[cpu] = delta + pcpu_unit_offsets[cpu];
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MEMORY_HOTPLUG
|
||||
|
||||
#ifdef CONFIG_CMA
|
||||
|
||||
@@ -58,17 +58,6 @@ void __init cmma_init(void)
|
||||
cmma_flag = 2;
|
||||
}
|
||||
|
||||
static inline unsigned char get_page_state(struct page *page)
|
||||
{
|
||||
unsigned char state;
|
||||
|
||||
asm volatile(" .insn rrf,0xb9ab0000,%0,%1,%2,0"
|
||||
: "=&d" (state)
|
||||
: "a" (page_to_phys(page)),
|
||||
"i" (ESSA_GET_STATE));
|
||||
return state & 0x3f;
|
||||
}
|
||||
|
||||
static inline void set_page_unused(struct page *page, int order)
|
||||
{
|
||||
int i, rc;
|
||||
|
||||
@@ -132,7 +132,7 @@ static int zpci_clear_irq(struct zpci_dev *zdev)
|
||||
static int zpci_set_irq_affinity(struct irq_data *data, const struct cpumask *dest,
|
||||
bool force)
|
||||
{
|
||||
struct msi_desc *entry = irq_get_msi_desc(data->irq);
|
||||
struct msi_desc *entry = irq_data_get_msi_desc(data);
|
||||
struct msi_msg msg = entry->msg;
|
||||
int cpu_addr = smp_cpu_get_cpu_address(cpumask_first(dest));
|
||||
|
||||
|
||||
@@ -27,7 +27,9 @@ VERSION {
|
||||
__vdso_time;
|
||||
clock_getres;
|
||||
__vdso_clock_getres;
|
||||
#ifdef CONFIG_X86_SGX
|
||||
__vdso_sgx_enter_enclave;
|
||||
#endif
|
||||
local: *;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -624,7 +624,7 @@ void __init_or_module noinline apply_ibt_endbr(s32 *start, s32 *end)
|
||||
|
||||
#else
|
||||
|
||||
void __init_or_module noinline apply_ibt_endbr(s32 *start, s32 *end) { }
|
||||
void __init_or_module apply_ibt_endbr(s32 *start, s32 *end) { }
|
||||
|
||||
#endif /* CONFIG_X86_KERNEL_IBT */
|
||||
|
||||
|
||||
@@ -722,8 +722,9 @@ static int branch_setup_xol_ops(struct arch_uprobe *auprobe, struct insn *insn)
|
||||
switch (opc1) {
|
||||
case 0xeb: /* jmp 8 */
|
||||
case 0xe9: /* jmp 32 */
|
||||
case 0x90: /* prefix* + nop; same as jmp with .offs = 0 */
|
||||
break;
|
||||
case 0x90: /* prefix* + nop; same as jmp with .offs = 0 */
|
||||
goto setup;
|
||||
|
||||
case 0xe8: /* call relative */
|
||||
branch_clear_offset(auprobe, insn);
|
||||
@@ -753,6 +754,7 @@ static int branch_setup_xol_ops(struct arch_uprobe *auprobe, struct insn *insn)
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
setup:
|
||||
auprobe->branch.opc1 = opc1;
|
||||
auprobe->branch.ilen = insn->length;
|
||||
auprobe->branch.offs = insn->immediate.value;
|
||||
|
||||
+12
-12
@@ -32,30 +32,30 @@ static irqreturn_t xen_reschedule_interrupt(int irq, void *dev_id)
|
||||
|
||||
void xen_smp_intr_free(unsigned int cpu)
|
||||
{
|
||||
kfree(per_cpu(xen_resched_irq, cpu).name);
|
||||
per_cpu(xen_resched_irq, cpu).name = NULL;
|
||||
if (per_cpu(xen_resched_irq, cpu).irq >= 0) {
|
||||
unbind_from_irqhandler(per_cpu(xen_resched_irq, cpu).irq, NULL);
|
||||
per_cpu(xen_resched_irq, cpu).irq = -1;
|
||||
kfree(per_cpu(xen_resched_irq, cpu).name);
|
||||
per_cpu(xen_resched_irq, cpu).name = NULL;
|
||||
}
|
||||
kfree(per_cpu(xen_callfunc_irq, cpu).name);
|
||||
per_cpu(xen_callfunc_irq, cpu).name = NULL;
|
||||
if (per_cpu(xen_callfunc_irq, cpu).irq >= 0) {
|
||||
unbind_from_irqhandler(per_cpu(xen_callfunc_irq, cpu).irq, NULL);
|
||||
per_cpu(xen_callfunc_irq, cpu).irq = -1;
|
||||
kfree(per_cpu(xen_callfunc_irq, cpu).name);
|
||||
per_cpu(xen_callfunc_irq, cpu).name = NULL;
|
||||
}
|
||||
kfree(per_cpu(xen_debug_irq, cpu).name);
|
||||
per_cpu(xen_debug_irq, cpu).name = NULL;
|
||||
if (per_cpu(xen_debug_irq, cpu).irq >= 0) {
|
||||
unbind_from_irqhandler(per_cpu(xen_debug_irq, cpu).irq, NULL);
|
||||
per_cpu(xen_debug_irq, cpu).irq = -1;
|
||||
kfree(per_cpu(xen_debug_irq, cpu).name);
|
||||
per_cpu(xen_debug_irq, cpu).name = NULL;
|
||||
}
|
||||
kfree(per_cpu(xen_callfuncsingle_irq, cpu).name);
|
||||
per_cpu(xen_callfuncsingle_irq, cpu).name = NULL;
|
||||
if (per_cpu(xen_callfuncsingle_irq, cpu).irq >= 0) {
|
||||
unbind_from_irqhandler(per_cpu(xen_callfuncsingle_irq, cpu).irq,
|
||||
NULL);
|
||||
per_cpu(xen_callfuncsingle_irq, cpu).irq = -1;
|
||||
kfree(per_cpu(xen_callfuncsingle_irq, cpu).name);
|
||||
per_cpu(xen_callfuncsingle_irq, cpu).name = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -65,6 +65,7 @@ int xen_smp_intr_init(unsigned int cpu)
|
||||
char *resched_name, *callfunc_name, *debug_name;
|
||||
|
||||
resched_name = kasprintf(GFP_KERNEL, "resched%d", cpu);
|
||||
per_cpu(xen_resched_irq, cpu).name = resched_name;
|
||||
rc = bind_ipi_to_irqhandler(XEN_RESCHEDULE_VECTOR,
|
||||
cpu,
|
||||
xen_reschedule_interrupt,
|
||||
@@ -74,9 +75,9 @@ int xen_smp_intr_init(unsigned int cpu)
|
||||
if (rc < 0)
|
||||
goto fail;
|
||||
per_cpu(xen_resched_irq, cpu).irq = rc;
|
||||
per_cpu(xen_resched_irq, cpu).name = resched_name;
|
||||
|
||||
callfunc_name = kasprintf(GFP_KERNEL, "callfunc%d", cpu);
|
||||
per_cpu(xen_callfunc_irq, cpu).name = callfunc_name;
|
||||
rc = bind_ipi_to_irqhandler(XEN_CALL_FUNCTION_VECTOR,
|
||||
cpu,
|
||||
xen_call_function_interrupt,
|
||||
@@ -86,10 +87,10 @@ int xen_smp_intr_init(unsigned int cpu)
|
||||
if (rc < 0)
|
||||
goto fail;
|
||||
per_cpu(xen_callfunc_irq, cpu).irq = rc;
|
||||
per_cpu(xen_callfunc_irq, cpu).name = callfunc_name;
|
||||
|
||||
if (!xen_fifo_events) {
|
||||
debug_name = kasprintf(GFP_KERNEL, "debug%d", cpu);
|
||||
per_cpu(xen_debug_irq, cpu).name = debug_name;
|
||||
rc = bind_virq_to_irqhandler(VIRQ_DEBUG, cpu,
|
||||
xen_debug_interrupt,
|
||||
IRQF_PERCPU | IRQF_NOBALANCING,
|
||||
@@ -97,10 +98,10 @@ int xen_smp_intr_init(unsigned int cpu)
|
||||
if (rc < 0)
|
||||
goto fail;
|
||||
per_cpu(xen_debug_irq, cpu).irq = rc;
|
||||
per_cpu(xen_debug_irq, cpu).name = debug_name;
|
||||
}
|
||||
|
||||
callfunc_name = kasprintf(GFP_KERNEL, "callfuncsingle%d", cpu);
|
||||
per_cpu(xen_callfuncsingle_irq, cpu).name = callfunc_name;
|
||||
rc = bind_ipi_to_irqhandler(XEN_CALL_FUNCTION_SINGLE_VECTOR,
|
||||
cpu,
|
||||
xen_call_function_single_interrupt,
|
||||
@@ -110,7 +111,6 @@ int xen_smp_intr_init(unsigned int cpu)
|
||||
if (rc < 0)
|
||||
goto fail;
|
||||
per_cpu(xen_callfuncsingle_irq, cpu).irq = rc;
|
||||
per_cpu(xen_callfuncsingle_irq, cpu).name = callfunc_name;
|
||||
|
||||
return 0;
|
||||
|
||||
|
||||
@@ -97,18 +97,18 @@ asmlinkage __visible void cpu_bringup_and_idle(void)
|
||||
|
||||
void xen_smp_intr_free_pv(unsigned int cpu)
|
||||
{
|
||||
kfree(per_cpu(xen_irq_work, cpu).name);
|
||||
per_cpu(xen_irq_work, cpu).name = NULL;
|
||||
if (per_cpu(xen_irq_work, cpu).irq >= 0) {
|
||||
unbind_from_irqhandler(per_cpu(xen_irq_work, cpu).irq, NULL);
|
||||
per_cpu(xen_irq_work, cpu).irq = -1;
|
||||
kfree(per_cpu(xen_irq_work, cpu).name);
|
||||
per_cpu(xen_irq_work, cpu).name = NULL;
|
||||
}
|
||||
|
||||
kfree(per_cpu(xen_pmu_irq, cpu).name);
|
||||
per_cpu(xen_pmu_irq, cpu).name = NULL;
|
||||
if (per_cpu(xen_pmu_irq, cpu).irq >= 0) {
|
||||
unbind_from_irqhandler(per_cpu(xen_pmu_irq, cpu).irq, NULL);
|
||||
per_cpu(xen_pmu_irq, cpu).irq = -1;
|
||||
kfree(per_cpu(xen_pmu_irq, cpu).name);
|
||||
per_cpu(xen_pmu_irq, cpu).name = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -118,6 +118,7 @@ int xen_smp_intr_init_pv(unsigned int cpu)
|
||||
char *callfunc_name, *pmu_name;
|
||||
|
||||
callfunc_name = kasprintf(GFP_KERNEL, "irqwork%d", cpu);
|
||||
per_cpu(xen_irq_work, cpu).name = callfunc_name;
|
||||
rc = bind_ipi_to_irqhandler(XEN_IRQ_WORK_VECTOR,
|
||||
cpu,
|
||||
xen_irq_work_interrupt,
|
||||
@@ -127,10 +128,10 @@ int xen_smp_intr_init_pv(unsigned int cpu)
|
||||
if (rc < 0)
|
||||
goto fail;
|
||||
per_cpu(xen_irq_work, cpu).irq = rc;
|
||||
per_cpu(xen_irq_work, cpu).name = callfunc_name;
|
||||
|
||||
if (is_xen_pmu) {
|
||||
pmu_name = kasprintf(GFP_KERNEL, "pmu%d", cpu);
|
||||
per_cpu(xen_pmu_irq, cpu).name = pmu_name;
|
||||
rc = bind_virq_to_irqhandler(VIRQ_XENPMU, cpu,
|
||||
xen_pmu_irq_handler,
|
||||
IRQF_PERCPU|IRQF_NOBALANCING,
|
||||
@@ -138,7 +139,6 @@ int xen_smp_intr_init_pv(unsigned int cpu)
|
||||
if (rc < 0)
|
||||
goto fail;
|
||||
per_cpu(xen_pmu_irq, cpu).irq = rc;
|
||||
per_cpu(xen_pmu_irq, cpu).name = pmu_name;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -75,6 +75,7 @@ void xen_init_lock_cpu(int cpu)
|
||||
cpu, per_cpu(lock_kicker_irq, cpu));
|
||||
|
||||
name = kasprintf(GFP_KERNEL, "spinlock%d", cpu);
|
||||
per_cpu(irq_name, cpu) = name;
|
||||
irq = bind_ipi_to_irqhandler(XEN_SPIN_UNLOCK_VECTOR,
|
||||
cpu,
|
||||
dummy_handler,
|
||||
@@ -85,7 +86,6 @@ void xen_init_lock_cpu(int cpu)
|
||||
if (irq >= 0) {
|
||||
disable_irq(irq); /* make sure it's never delivered */
|
||||
per_cpu(lock_kicker_irq, cpu) = irq;
|
||||
per_cpu(irq_name, cpu) = name;
|
||||
}
|
||||
|
||||
printk("cpu %d spinlock event irq %d\n", cpu, irq);
|
||||
@@ -98,6 +98,8 @@ void xen_uninit_lock_cpu(int cpu)
|
||||
if (!xen_pvspin)
|
||||
return;
|
||||
|
||||
kfree(per_cpu(irq_name, cpu));
|
||||
per_cpu(irq_name, cpu) = NULL;
|
||||
/*
|
||||
* When booting the kernel with 'mitigations=auto,nosmt', the secondary
|
||||
* CPUs are not activated, and lock_kicker_irq is not initialized.
|
||||
@@ -108,8 +110,6 @@ void xen_uninit_lock_cpu(int cpu)
|
||||
|
||||
unbind_from_irqhandler(irq, NULL);
|
||||
per_cpu(lock_kicker_irq, cpu) = -1;
|
||||
kfree(per_cpu(irq_name, cpu));
|
||||
per_cpu(irq_name, cpu) = NULL;
|
||||
}
|
||||
|
||||
PV_CALLEE_SAVE_REGS_THUNK(xen_vcpu_stolen);
|
||||
|
||||
@@ -696,7 +696,7 @@ static void __battery_hook_unregister(struct acpi_battery_hook *hook, int lock)
|
||||
if (lock)
|
||||
mutex_lock(&hook_mutex);
|
||||
list_for_each_entry(battery, &acpi_battery_list, list) {
|
||||
hook->remove_battery(battery->bat);
|
||||
hook->remove_battery(battery->bat, hook);
|
||||
}
|
||||
list_del(&hook->list);
|
||||
if (lock)
|
||||
@@ -724,7 +724,7 @@ void battery_hook_register(struct acpi_battery_hook *hook)
|
||||
* its attributes.
|
||||
*/
|
||||
list_for_each_entry(battery, &acpi_battery_list, list) {
|
||||
if (hook->add_battery(battery->bat)) {
|
||||
if (hook->add_battery(battery->bat, hook)) {
|
||||
/*
|
||||
* If a add-battery returns non-zero,
|
||||
* the registration of the extension has failed,
|
||||
@@ -762,7 +762,7 @@ static void battery_hook_add_battery(struct acpi_battery *battery)
|
||||
* during the battery module initialization.
|
||||
*/
|
||||
list_for_each_entry_safe(hook_node, tmp, &battery_hook_list, list) {
|
||||
if (hook_node->add_battery(battery->bat)) {
|
||||
if (hook_node->add_battery(battery->bat, hook_node)) {
|
||||
/*
|
||||
* The notification of the extensions has failed, to
|
||||
* prevent further errors we will unload the extension.
|
||||
@@ -785,7 +785,7 @@ static void battery_hook_remove_battery(struct acpi_battery *battery)
|
||||
* custom attributes from the battery.
|
||||
*/
|
||||
list_for_each_entry(hook, &battery_hook_list, list) {
|
||||
hook->remove_battery(battery->bat);
|
||||
hook->remove_battery(battery->bat, hook);
|
||||
}
|
||||
/* Then, just remove the battery from the list */
|
||||
list_del(&battery->list);
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
if MIPS
|
||||
source "drivers/platform/mips/Kconfig"
|
||||
endif
|
||||
|
||||
source "drivers/platform/loongarch/Kconfig"
|
||||
|
||||
|
||||
@@ -228,6 +228,16 @@ config CROS_EC_TYPEC
|
||||
To compile this driver as a module, choose M here: the module will be
|
||||
called cros_ec_typec.
|
||||
|
||||
config CROS_HPS_I2C
|
||||
tristate "ChromeOS HPS device"
|
||||
depends on HID && I2C && PM
|
||||
help
|
||||
Say Y here if you want to enable support for the ChromeOS
|
||||
human presence sensor (HPS), attached via I2C. The driver supports a
|
||||
sensor connected to the I2C bus and exposes it as a character device.
|
||||
To save power, the sensor is automatically powered down when no
|
||||
clients are accessing it.
|
||||
|
||||
config CROS_USBPD_LOGGER
|
||||
tristate "Logging driver for USB PD charger"
|
||||
depends on CHARGER_CROS_USBPD
|
||||
|
||||
@@ -27,6 +27,7 @@ obj-$(CONFIG_CROS_EC_DEBUGFS) += cros_ec_debugfs.o
|
||||
cros-ec-sensorhub-objs := cros_ec_sensorhub.o cros_ec_sensorhub_ring.o
|
||||
obj-$(CONFIG_CROS_EC_SENSORHUB) += cros-ec-sensorhub.o
|
||||
obj-$(CONFIG_CROS_EC_SYSFS) += cros_ec_sysfs.o
|
||||
obj-$(CONFIG_CROS_HPS_I2C) += cros_hps_i2c.o
|
||||
obj-$(CONFIG_CROS_USBPD_LOGGER) += cros_usbpd_logger.o
|
||||
obj-$(CONFIG_CROS_USBPD_NOTIFY) += cros_usbpd_notify.o
|
||||
|
||||
|
||||
@@ -521,6 +521,7 @@ static struct platform_driver cros_ec_debugfs_driver = {
|
||||
.driver = {
|
||||
.name = DRV_NAME,
|
||||
.pm = &cros_ec_debugfs_pm_ops,
|
||||
.probe_type = PROBE_PREFER_ASYNCHRONOUS,
|
||||
},
|
||||
.probe = cros_ec_debugfs_probe,
|
||||
.remove = cros_ec_debugfs_remove,
|
||||
|
||||
@@ -286,8 +286,7 @@ done:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int cros_ec_i2c_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *dev_id)
|
||||
static int cros_ec_i2c_probe(struct i2c_client *client)
|
||||
{
|
||||
struct device *dev = &client->dev;
|
||||
struct cros_ec_device *ec_dev = NULL;
|
||||
@@ -373,7 +372,7 @@ static struct i2c_driver cros_ec_driver = {
|
||||
.of_match_table = of_match_ptr(cros_ec_i2c_of_match),
|
||||
.pm = &cros_ec_i2c_pm_ops,
|
||||
},
|
||||
.probe = cros_ec_i2c_probe,
|
||||
.probe_new = cros_ec_i2c_probe,
|
||||
.remove = cros_ec_i2c_remove,
|
||||
.id_table = cros_ec_i2c_id,
|
||||
};
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include <linux/device.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/kobject.h>
|
||||
#include <linux/kstrtox.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_data/cros_ec_commands.h>
|
||||
#include <linux/platform_data/cros_ec_proto.h>
|
||||
@@ -493,7 +494,7 @@ static ssize_t userspace_control_store(struct device *dev,
|
||||
bool enable;
|
||||
int ret;
|
||||
|
||||
ret = strtobool(buf, &enable);
|
||||
ret = kstrtobool(buf, &enable);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
@@ -601,6 +602,7 @@ static struct platform_driver cros_ec_lightbar_driver = {
|
||||
.driver = {
|
||||
.name = DRV_NAME,
|
||||
.pm = &cros_ec_lightbar_pm_ops,
|
||||
.probe_type = PROBE_PREFER_ASYNCHRONOUS,
|
||||
},
|
||||
.probe = cros_ec_lightbar_probe,
|
||||
.remove = cros_ec_lightbar_remove,
|
||||
|
||||
@@ -354,6 +354,9 @@ static int cros_ec_lpc_probe(struct platform_device *pdev)
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
cros_ec_lpc_mec_init(EC_HOST_CMD_REGION0,
|
||||
EC_LPC_ADDR_MEMMAP + EC_MEMMAP_SIZE);
|
||||
|
||||
/*
|
||||
* Read the mapped ID twice, the first one is assuming the
|
||||
* EC is a Microchip Embedded Controller (MEC) variant, if the
|
||||
@@ -554,6 +557,12 @@ static struct platform_driver cros_ec_lpc_driver = {
|
||||
.name = DRV_NAME,
|
||||
.acpi_match_table = cros_ec_lpc_acpi_device_ids,
|
||||
.pm = &cros_ec_lpc_pm_ops,
|
||||
/*
|
||||
* ACPI child devices may probe before us, and they racily
|
||||
* check our drvdata pointer. Force synchronous probe until
|
||||
* those races are resolved.
|
||||
*/
|
||||
.probe_type = PROBE_FORCE_SYNCHRONOUS,
|
||||
},
|
||||
.probe = cros_ec_lpc_probe,
|
||||
.remove = cros_ec_lpc_remove,
|
||||
@@ -586,14 +595,10 @@ static int __init cros_ec_lpc_init(void)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
cros_ec_lpc_mec_init(EC_HOST_CMD_REGION0,
|
||||
EC_LPC_ADDR_MEMMAP + EC_MEMMAP_SIZE);
|
||||
|
||||
/* Register the driver */
|
||||
ret = platform_driver_register(&cros_ec_lpc_driver);
|
||||
if (ret) {
|
||||
pr_err(DRV_NAME ": can't register driver: %d\n", ret);
|
||||
cros_ec_lpc_mec_destroy();
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -603,7 +608,6 @@ static int __init cros_ec_lpc_init(void)
|
||||
if (ret) {
|
||||
pr_err(DRV_NAME ": can't register device: %d\n", ret);
|
||||
platform_driver_unregister(&cros_ec_lpc_driver);
|
||||
cros_ec_lpc_mec_destroy();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -615,7 +619,6 @@ static void __exit cros_ec_lpc_exit(void)
|
||||
if (!cros_ec_lpc_acpi_device_found)
|
||||
platform_device_unregister(&cros_ec_lpc_device);
|
||||
platform_driver_unregister(&cros_ec_lpc_driver);
|
||||
cros_ec_lpc_mec_destroy();
|
||||
}
|
||||
|
||||
module_init(cros_ec_lpc_init);
|
||||
|
||||
@@ -146,9 +146,3 @@ void cros_ec_lpc_mec_init(unsigned int base, unsigned int end)
|
||||
mec_emi_end = end;
|
||||
}
|
||||
EXPORT_SYMBOL(cros_ec_lpc_mec_init);
|
||||
|
||||
void cros_ec_lpc_mec_destroy(void)
|
||||
{
|
||||
mutex_destroy(&io_mutex);
|
||||
}
|
||||
EXPORT_SYMBOL(cros_ec_lpc_mec_destroy);
|
||||
|
||||
@@ -45,13 +45,6 @@ enum cros_ec_lpc_mec_io_type {
|
||||
*/
|
||||
void cros_ec_lpc_mec_init(unsigned int base, unsigned int end);
|
||||
|
||||
/*
|
||||
* cros_ec_lpc_mec_destroy
|
||||
*
|
||||
* Cleanup MEC I/O.
|
||||
*/
|
||||
void cros_ec_lpc_mec_destroy(void);
|
||||
|
||||
/**
|
||||
* cros_ec_lpc_mec_in_range() - Determine if addresses are in MEC EMI range.
|
||||
*
|
||||
|
||||
@@ -834,6 +834,7 @@ static struct spi_driver cros_ec_driver_spi = {
|
||||
.name = "cros-ec-spi",
|
||||
.of_match_table = cros_ec_spi_of_match,
|
||||
.pm = &cros_ec_spi_pm_ops,
|
||||
.probe_type = PROBE_PREFER_ASYNCHRONOUS,
|
||||
},
|
||||
.probe = cros_ec_spi_probe,
|
||||
.remove = cros_ec_spi_remove,
|
||||
|
||||
@@ -173,10 +173,13 @@ static int cros_typec_get_switch_handles(struct cros_typec_port *port,
|
||||
|
||||
role_sw_err:
|
||||
typec_switch_put(port->ori_sw);
|
||||
port->ori_sw = NULL;
|
||||
ori_sw_err:
|
||||
typec_retimer_put(port->retimer);
|
||||
port->retimer = NULL;
|
||||
retimer_sw_err:
|
||||
typec_mux_put(port->mux);
|
||||
port->mux = NULL;
|
||||
mux_err:
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,160 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Driver for the ChromeOS human presence sensor (HPS), attached via I2C.
|
||||
*
|
||||
* The driver exposes HPS as a character device, although currently no read or
|
||||
* write operations are supported. Instead, the driver only controls the power
|
||||
* state of the sensor, keeping it on only while userspace holds an open file
|
||||
* descriptor to the HPS device.
|
||||
*
|
||||
* Copyright 2022 Google LLC.
|
||||
*/
|
||||
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/gpio/consumer.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/miscdevice.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
|
||||
#define HPS_ACPI_ID "GOOG0020"
|
||||
|
||||
struct hps_drvdata {
|
||||
struct i2c_client *client;
|
||||
struct miscdevice misc_device;
|
||||
struct gpio_desc *enable_gpio;
|
||||
};
|
||||
|
||||
static void hps_set_power(struct hps_drvdata *hps, bool state)
|
||||
{
|
||||
gpiod_set_value_cansleep(hps->enable_gpio, state);
|
||||
}
|
||||
|
||||
static int hps_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct hps_drvdata *hps = container_of(file->private_data,
|
||||
struct hps_drvdata, misc_device);
|
||||
struct device *dev = &hps->client->dev;
|
||||
|
||||
return pm_runtime_resume_and_get(dev);
|
||||
}
|
||||
|
||||
static int hps_release(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct hps_drvdata *hps = container_of(file->private_data,
|
||||
struct hps_drvdata, misc_device);
|
||||
struct device *dev = &hps->client->dev;
|
||||
|
||||
return pm_runtime_put(dev);
|
||||
}
|
||||
|
||||
static const struct file_operations hps_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = hps_open,
|
||||
.release = hps_release,
|
||||
};
|
||||
|
||||
static int hps_i2c_probe(struct i2c_client *client)
|
||||
{
|
||||
struct hps_drvdata *hps;
|
||||
int ret;
|
||||
|
||||
hps = devm_kzalloc(&client->dev, sizeof(*hps), GFP_KERNEL);
|
||||
if (!hps)
|
||||
return -ENOMEM;
|
||||
|
||||
hps->misc_device.parent = &client->dev;
|
||||
hps->misc_device.minor = MISC_DYNAMIC_MINOR;
|
||||
hps->misc_device.name = "cros-hps";
|
||||
hps->misc_device.fops = &hps_fops;
|
||||
|
||||
i2c_set_clientdata(client, hps);
|
||||
hps->client = client;
|
||||
|
||||
/*
|
||||
* HPS is powered on from firmware before entering the kernel, so we
|
||||
* acquire the line with GPIOD_OUT_HIGH here to preserve the existing
|
||||
* state. The peripheral is powered off after successful probe below.
|
||||
*/
|
||||
hps->enable_gpio = devm_gpiod_get(&client->dev, "enable", GPIOD_OUT_HIGH);
|
||||
if (IS_ERR(hps->enable_gpio)) {
|
||||
ret = PTR_ERR(hps->enable_gpio);
|
||||
dev_err(&client->dev, "failed to get enable gpio: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = misc_register(&hps->misc_device);
|
||||
if (ret) {
|
||||
dev_err(&client->dev, "failed to initialize misc device: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
hps_set_power(hps, false);
|
||||
pm_runtime_enable(&client->dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void hps_i2c_remove(struct i2c_client *client)
|
||||
{
|
||||
struct hps_drvdata *hps = i2c_get_clientdata(client);
|
||||
|
||||
pm_runtime_disable(&client->dev);
|
||||
misc_deregister(&hps->misc_device);
|
||||
|
||||
/*
|
||||
* Re-enable HPS, in order to return it to its default state
|
||||
* (i.e. powered on).
|
||||
*/
|
||||
hps_set_power(hps, true);
|
||||
}
|
||||
|
||||
static int hps_suspend(struct device *dev)
|
||||
{
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
struct hps_drvdata *hps = i2c_get_clientdata(client);
|
||||
|
||||
hps_set_power(hps, false);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int hps_resume(struct device *dev)
|
||||
{
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
struct hps_drvdata *hps = i2c_get_clientdata(client);
|
||||
|
||||
hps_set_power(hps, true);
|
||||
return 0;
|
||||
}
|
||||
static UNIVERSAL_DEV_PM_OPS(hps_pm_ops, hps_suspend, hps_resume, NULL);
|
||||
|
||||
static const struct i2c_device_id hps_i2c_id[] = {
|
||||
{ "cros-hps", 0 },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, hps_i2c_id);
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
static const struct acpi_device_id hps_acpi_id[] = {
|
||||
{ HPS_ACPI_ID, 0 },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(acpi, hps_acpi_id);
|
||||
#endif /* CONFIG_ACPI */
|
||||
|
||||
static struct i2c_driver hps_i2c_driver = {
|
||||
.probe_new = hps_i2c_probe,
|
||||
.remove = hps_i2c_remove,
|
||||
.id_table = hps_i2c_id,
|
||||
.driver = {
|
||||
.name = "cros-hps",
|
||||
.pm = &hps_pm_ops,
|
||||
.acpi_match_table = ACPI_PTR(hps_acpi_id),
|
||||
},
|
||||
};
|
||||
module_i2c_driver(hps_i2c_driver);
|
||||
|
||||
MODULE_ALIAS("acpi:" HPS_ACPI_ID);
|
||||
MODULE_AUTHOR("Sami Kyöstilä <skyostil@chromium.org>");
|
||||
MODULE_DESCRIPTION("Driver for ChromeOS HPS");
|
||||
MODULE_LICENSE("GPL");
|
||||
@@ -239,7 +239,11 @@ static int __init cros_usbpd_notify_init(void)
|
||||
return ret;
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
platform_driver_register(&cros_usbpd_notify_acpi_driver);
|
||||
ret = platform_driver_register(&cros_usbpd_notify_acpi_driver);
|
||||
if (ret) {
|
||||
platform_driver_unregister(&cros_usbpd_notify_plat_driver);
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -129,7 +129,6 @@ unregister_rtc:
|
||||
unregister_debugfs:
|
||||
if (ec->debugfs_pdev)
|
||||
platform_device_unregister(ec->debugfs_pdev);
|
||||
cros_ec_lpc_mec_destroy();
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -143,10 +142,6 @@ static int wilco_ec_remove(struct platform_device *pdev)
|
||||
platform_device_unregister(ec->rtc_pdev);
|
||||
if (ec->debugfs_pdev)
|
||||
platform_device_unregister(ec->debugfs_pdev);
|
||||
|
||||
/* Teardown cros_ec interface */
|
||||
cros_ec_lpc_mec_destroy();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user