Merge branch 'mmp/hsic' into arm/dt
* mmp/hsic: ARM: dts: mmp3-dell-ariel: Enable the HSIC ARM: dts: mmp3: Add HSIC controllers dt-bindings: phy: Add binding for marvell,mmp3-hsic-phy clk: mmp2: Add HSIC clocks dt-bindings: marvell,mmp2: Add clock ids for the HSIC clocks + Linux 5.5-rc2
This commit is contained in:
commit
4081b33559
2
.mailmap
2
.mailmap
|
@ -276,3 +276,5 @@ Gustavo Padovan <gustavo@las.ic.unicamp.br>
|
||||||
Gustavo Padovan <padovan@profusion.mobi>
|
Gustavo Padovan <padovan@profusion.mobi>
|
||||||
Changbin Du <changbin.du@intel.com> <changbin.du@intel.com>
|
Changbin Du <changbin.du@intel.com> <changbin.du@intel.com>
|
||||||
Changbin Du <changbin.du@intel.com> <changbin.du@gmail.com>
|
Changbin Du <changbin.du@intel.com> <changbin.du@gmail.com>
|
||||||
|
Steve Wise <larrystevenwise@gmail.com> <swise@chelsio.com>
|
||||||
|
Steve Wise <larrystevenwise@gmail.com> <swise@opengridcomputing.com>
|
||||||
|
|
|
@ -144,7 +144,7 @@ journal_crypt:algorithm(:key) (the key is optional)
|
||||||
Encrypt the journal using given algorithm to make sure that the
|
Encrypt the journal using given algorithm to make sure that the
|
||||||
attacker can't read the journal. You can use a block cipher here
|
attacker can't read the journal. You can use a block cipher here
|
||||||
(such as "cbc(aes)") or a stream cipher (for example "chacha20",
|
(such as "cbc(aes)") or a stream cipher (for example "chacha20",
|
||||||
"salsa20", "ctr(aes)" or "ecb(arc4)").
|
"salsa20" or "ctr(aes)").
|
||||||
|
|
||||||
The journal contains history of last writes to the block device,
|
The journal contains history of last writes to the block device,
|
||||||
an attacker reading the journal could see the last sector nubmers
|
an attacker reading the journal could see the last sector nubmers
|
||||||
|
|
|
@ -8,6 +8,7 @@ Device Mapper
|
||||||
cache-policies
|
cache-policies
|
||||||
cache
|
cache
|
||||||
delay
|
delay
|
||||||
|
dm-clone
|
||||||
dm-crypt
|
dm-crypt
|
||||||
dm-dust
|
dm-dust
|
||||||
dm-flakey
|
dm-flakey
|
||||||
|
|
|
@ -8,7 +8,7 @@ title: Allwinner platforms device tree bindings
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
$nodename:
|
$nodename:
|
||||||
|
|
|
@ -8,7 +8,7 @@ title: Allwinner A64 Display Engine Bus Device Tree Bindings
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
$nodename:
|
$nodename:
|
||||||
|
|
|
@ -8,7 +8,7 @@ title: Allwinner A23 RSB Device Tree Bindings
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
"#address-cells":
|
"#address-cells":
|
||||||
|
|
|
@ -8,7 +8,7 @@ title: Allwinner Clock Control Unit Device Tree Bindings
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
"#clock-cells":
|
"#clock-cells":
|
||||||
|
|
|
@ -8,7 +8,7 @@ title: Allwinner A10 Security System Device Tree Bindings
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
compatible:
|
compatible:
|
||||||
|
|
|
@ -8,7 +8,7 @@ title: Allwinner A31 MIPI-DSI Controller Device Tree Bindings
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
"#address-cells": true
|
"#address-cells": true
|
||||||
|
|
|
@ -7,7 +7,7 @@ $schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
title: Ronbo RB070D30 DSI Display Panel
|
title: Ronbo RB070D30 DSI Display Panel
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
compatible:
|
compatible:
|
||||||
|
|
|
@ -8,7 +8,7 @@ title: Allwinner A10 DMA Controller Device Tree Bindings
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
allOf:
|
allOf:
|
||||||
- $ref: "dma-controller.yaml#"
|
- $ref: "dma-controller.yaml#"
|
||||||
|
|
|
@ -8,7 +8,7 @@ title: Allwinner A64 DMA Controller Device Tree Bindings
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
allOf:
|
allOf:
|
||||||
- $ref: "dma-controller.yaml#"
|
- $ref: "dma-controller.yaml#"
|
||||||
|
|
|
@ -8,7 +8,7 @@ title: Allwinner A31 DMA Controller Device Tree Bindings
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
allOf:
|
allOf:
|
||||||
- $ref: "dma-controller.yaml#"
|
- $ref: "dma-controller.yaml#"
|
||||||
|
|
|
@ -8,7 +8,7 @@ title: Allwinner A31 P2WI (Push/Pull 2 Wires Interface) Device Tree Bindings
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
allOf:
|
allOf:
|
||||||
- $ref: /schemas/i2c/i2c-controller.yaml#
|
- $ref: /schemas/i2c/i2c-controller.yaml#
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# SPDX-License-Identifier: GPL-2.0-only
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
%YAML 1.2
|
%YAML 1.2
|
||||||
---
|
---
|
||||||
$id: http://devicetree.org/schemas/iio/adc/adi,ad7292.yaml#
|
$id: http://devicetree.org/schemas/iio/adc/adi,ad7292.yaml#
|
||||||
|
@ -53,6 +53,7 @@ patternProperties:
|
||||||
description: |
|
description: |
|
||||||
The channel number. It can have up to 8 channels numbered from 0 to 7.
|
The channel number. It can have up to 8 channels numbered from 0 to 7.
|
||||||
items:
|
items:
|
||||||
|
- minimum: 0
|
||||||
maximum: 7
|
maximum: 7
|
||||||
|
|
||||||
diff-channels:
|
diff-channels:
|
||||||
|
|
|
@ -8,7 +8,7 @@ title: Allwinner A33 Thermal Sensor Device Tree Bindings
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
"#io-channel-cells":
|
"#io-channel-cells":
|
||||||
|
|
|
@ -8,7 +8,7 @@ title: Allwinner A10 LRADC Device Tree Bindings
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
compatible:
|
compatible:
|
||||||
|
|
|
@ -8,7 +8,7 @@ title: Allwinner A10 Interrupt Controller Device Tree Bindings
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
allOf:
|
allOf:
|
||||||
- $ref: /schemas/interrupt-controller.yaml#
|
- $ref: /schemas/interrupt-controller.yaml#
|
||||||
|
|
|
@ -8,7 +8,7 @@ title: Allwinner A20 Non-Maskable Interrupt Controller Device Tree Bindings
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
allOf:
|
allOf:
|
||||||
- $ref: /schemas/interrupt-controller.yaml#
|
- $ref: /schemas/interrupt-controller.yaml#
|
||||||
|
|
|
@ -8,7 +8,7 @@ title: Allwinner A10 CMOS Sensor Interface (CSI) Device Tree Bindings
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
description: |-
|
description: |-
|
||||||
The Allwinner A10 and later has a CMOS Sensor Interface to retrieve
|
The Allwinner A10 and later has a CMOS Sensor Interface to retrieve
|
||||||
|
|
|
@ -8,7 +8,7 @@ title: Allwinner A10 Infrared Controller Device Tree Bindings
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
allOf:
|
allOf:
|
||||||
- $ref: "rc.yaml#"
|
- $ref: "rc.yaml#"
|
||||||
|
|
|
@ -60,7 +60,8 @@ patternProperties:
|
||||||
maximum: 1066000000
|
maximum: 1066000000
|
||||||
|
|
||||||
nvidia,emem-configuration:
|
nvidia,emem-configuration:
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32-array
|
allOf:
|
||||||
|
- $ref: /schemas/types.yaml#/definitions/uint32-array
|
||||||
description: |
|
description: |
|
||||||
Values to be written to the EMEM register block. See section
|
Values to be written to the EMEM register block. See section
|
||||||
"15.6.1 MC Registers" in the TRM.
|
"15.6.1 MC Registers" in the TRM.
|
||||||
|
|
|
@ -56,7 +56,8 @@ patternProperties:
|
||||||
maximum: 900000000
|
maximum: 900000000
|
||||||
|
|
||||||
nvidia,emc-auto-cal-interval:
|
nvidia,emc-auto-cal-interval:
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
allOf:
|
||||||
|
- $ref: /schemas/types.yaml#/definitions/uint32
|
||||||
description:
|
description:
|
||||||
Pad calibration interval in microseconds.
|
Pad calibration interval in microseconds.
|
||||||
minimum: 0
|
minimum: 0
|
||||||
|
@ -78,7 +79,8 @@ patternProperties:
|
||||||
Mode Register 0.
|
Mode Register 0.
|
||||||
|
|
||||||
nvidia,emc-zcal-cnt-long:
|
nvidia,emc-zcal-cnt-long:
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
allOf:
|
||||||
|
- $ref: /schemas/types.yaml#/definitions/uint32
|
||||||
description:
|
description:
|
||||||
Number of EMC clocks to wait before issuing any commands after
|
Number of EMC clocks to wait before issuing any commands after
|
||||||
sending ZCAL_MRW_CMD.
|
sending ZCAL_MRW_CMD.
|
||||||
|
@ -96,7 +98,8 @@ patternProperties:
|
||||||
FBIO "read" FIFO periodic resetting enabled.
|
FBIO "read" FIFO periodic resetting enabled.
|
||||||
|
|
||||||
nvidia,emc-configuration:
|
nvidia,emc-configuration:
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32-array
|
allOf:
|
||||||
|
- $ref: /schemas/types.yaml#/definitions/uint32-array
|
||||||
description:
|
description:
|
||||||
EMC timing characterization data. These are the registers
|
EMC timing characterization data. These are the registers
|
||||||
(see section "18.13.2 EMC Registers" in the TRM) whose values
|
(see section "18.13.2 EMC Registers" in the TRM) whose values
|
||||||
|
|
|
@ -77,7 +77,8 @@ patternProperties:
|
||||||
maximum: 900000000
|
maximum: 900000000
|
||||||
|
|
||||||
nvidia,emem-configuration:
|
nvidia,emem-configuration:
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32-array
|
allOf:
|
||||||
|
- $ref: /schemas/types.yaml#/definitions/uint32-array
|
||||||
description: |
|
description: |
|
||||||
Values to be written to the EMEM register block. See section
|
Values to be written to the EMEM register block. See section
|
||||||
"18.13.1 MC Registers" in the TRM.
|
"18.13.1 MC Registers" in the TRM.
|
||||||
|
|
|
@ -8,7 +8,7 @@ title: Allwinner A10 Resistive Touchscreen Controller Device Tree Bindings
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
"#thermal-sensor-cells":
|
"#thermal-sensor-cells":
|
||||||
|
|
|
@ -11,7 +11,7 @@ allOf:
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
"#address-cells": true
|
"#address-cells": true
|
||||||
|
|
|
@ -11,7 +11,7 @@ allOf:
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
"#address-cells": true
|
"#address-cells": true
|
||||||
|
|
|
@ -11,7 +11,7 @@ allOf:
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
compatible:
|
compatible:
|
||||||
|
|
|
@ -8,7 +8,7 @@ title: Allwinner A10 MDIO Controller Device Tree Bindings
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
allOf:
|
allOf:
|
||||||
- $ref: "mdio.yaml#"
|
- $ref: "mdio.yaml#"
|
||||||
|
|
|
@ -11,7 +11,7 @@ allOf:
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
compatible:
|
compatible:
|
||||||
|
|
|
@ -8,7 +8,7 @@ title: Allwinner A83t EMAC Device Tree Bindings
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
compatible:
|
compatible:
|
||||||
|
|
|
@ -8,7 +8,7 @@ title: Allwinner A10 CAN Controller Device Tree Bindings
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
compatible:
|
compatible:
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# SPDX-License-Identifier: GPL-2.0
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
%YAML 1.2
|
%YAML 1.2
|
||||||
---
|
---
|
||||||
$id: http://devicetree.org/schemas/net/ti,cpsw-switch.yaml#
|
$id: http://devicetree.org/schemas/net/ti,cpsw-switch.yaml#
|
||||||
|
@ -44,7 +44,6 @@ properties:
|
||||||
description: CPSW functional clock
|
description: CPSW functional clock
|
||||||
|
|
||||||
clock-names:
|
clock-names:
|
||||||
maxItems: 1
|
|
||||||
items:
|
items:
|
||||||
- const: fck
|
- const: fck
|
||||||
|
|
||||||
|
@ -70,7 +69,6 @@ properties:
|
||||||
Phandle to the system control device node which provides access to
|
Phandle to the system control device node which provides access to
|
||||||
efuse IO range with MAC addresses
|
efuse IO range with MAC addresses
|
||||||
|
|
||||||
|
|
||||||
ethernet-ports:
|
ethernet-ports:
|
||||||
type: object
|
type: object
|
||||||
properties:
|
properties:
|
||||||
|
@ -82,8 +80,6 @@ properties:
|
||||||
patternProperties:
|
patternProperties:
|
||||||
"^port@[0-9]+$":
|
"^port@[0-9]+$":
|
||||||
type: object
|
type: object
|
||||||
minItems: 1
|
|
||||||
maxItems: 2
|
|
||||||
description: CPSW external ports
|
description: CPSW external ports
|
||||||
|
|
||||||
allOf:
|
allOf:
|
||||||
|
@ -91,23 +87,20 @@ properties:
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
reg:
|
reg:
|
||||||
maxItems: 1
|
items:
|
||||||
enum: [1, 2]
|
- enum: [1, 2]
|
||||||
description: CPSW port number
|
description: CPSW port number
|
||||||
|
|
||||||
phys:
|
phys:
|
||||||
$ref: /schemas/types.yaml#definitions/phandle-array
|
|
||||||
maxItems: 1
|
maxItems: 1
|
||||||
description: phandle on phy-gmii-sel PHY
|
description: phandle on phy-gmii-sel PHY
|
||||||
|
|
||||||
label:
|
label:
|
||||||
$ref: /schemas/types.yaml#/definitions/string-array
|
|
||||||
maxItems: 1
|
|
||||||
description: label associated with this port
|
description: label associated with this port
|
||||||
|
|
||||||
ti,dual-emac-pvid:
|
ti,dual-emac-pvid:
|
||||||
$ref: /schemas/types.yaml#/definitions/uint32
|
allOf:
|
||||||
maxItems: 1
|
- $ref: /schemas/types.yaml#/definitions/uint32
|
||||||
minimum: 1
|
minimum: 1
|
||||||
maximum: 1024
|
maximum: 1024
|
||||||
description:
|
description:
|
||||||
|
@ -136,7 +129,6 @@ properties:
|
||||||
description: CPTS reference clock
|
description: CPTS reference clock
|
||||||
|
|
||||||
clock-names:
|
clock-names:
|
||||||
maxItems: 1
|
|
||||||
items:
|
items:
|
||||||
- const: cpts
|
- const: cpts
|
||||||
|
|
||||||
|
@ -201,7 +193,7 @@ examples:
|
||||||
phys = <&phy_gmii_sel 1>;
|
phys = <&phy_gmii_sel 1>;
|
||||||
phy-handle = <ðphy0_sw>;
|
phy-handle = <ðphy0_sw>;
|
||||||
phy-mode = "rgmii";
|
phy-mode = "rgmii";
|
||||||
ti,dual_emac_pvid = <1>;
|
ti,dual-emac-pvid = <1>;
|
||||||
};
|
};
|
||||||
|
|
||||||
cpsw_port2: port@2 {
|
cpsw_port2: port@2 {
|
||||||
|
@ -211,7 +203,7 @@ examples:
|
||||||
phys = <&phy_gmii_sel 2>;
|
phys = <&phy_gmii_sel 2>;
|
||||||
phy-handle = <ðphy1_sw>;
|
phy-handle = <ðphy1_sw>;
|
||||||
phy-mode = "rgmii";
|
phy-mode = "rgmii";
|
||||||
ti,dual_emac_pvid = <2>;
|
ti,dual-emac-pvid = <2>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@ title: Allwinner A10 Security ID Device Tree Bindings
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
allOf:
|
allOf:
|
||||||
- $ref: "nvmem.yaml#"
|
- $ref: "nvmem.yaml#"
|
||||||
|
|
|
@ -8,7 +8,7 @@ title: Allwinner A31 MIPI D-PHY Controller Device Tree Bindings
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
"#phy-cells":
|
"#phy-cells":
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
# Copyright 2019 Lubomir Rintel <lkundrak@v3.sk>
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: "http://devicetree.org/schemas/phy/marvell,mmp3-hsic-phy.yaml#"
|
||||||
|
$schema: "http://devicetree.org/meta-schemas/core.yaml#"
|
||||||
|
|
||||||
|
title: Marvell MMP3 HSIC PHY
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Lubomir Rintel <lkundrak@v3.sk>
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
const: marvell,mmp3-hsic-phy
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
description: base address of the device
|
||||||
|
|
||||||
|
reset-gpios:
|
||||||
|
maxItems: 1
|
||||||
|
description: GPIO connected to reset
|
||||||
|
|
||||||
|
"#phy-cells":
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
- reset-gpios
|
||||||
|
- "#phy-cells"
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
hsic-phy@f0001800 {
|
||||||
|
compatible = "marvell,mmp3-hsic-phy";
|
||||||
|
reg = <0xf0001800 0x40>;
|
||||||
|
reset-gpios = <&gpio 63 GPIO_ACTIVE_HIGH>;
|
||||||
|
#phy-cells = <0>;
|
||||||
|
};
|
|
@ -8,7 +8,7 @@ title: Allwinner A10 Pin Controller Device Tree Bindings
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
"#gpio-cells":
|
"#gpio-cells":
|
||||||
|
|
|
@ -8,7 +8,7 @@ title: Allwinner A10 PWM Device Tree Bindings
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
"#pwm-cells":
|
"#pwm-cells":
|
||||||
|
|
|
@ -50,6 +50,8 @@ properties:
|
||||||
description: Should contain the WWDG1 watchdog reset interrupt
|
description: Should contain the WWDG1 watchdog reset interrupt
|
||||||
maxItems: 1
|
maxItems: 1
|
||||||
|
|
||||||
|
wakeup-source: true
|
||||||
|
|
||||||
mboxes:
|
mboxes:
|
||||||
description:
|
description:
|
||||||
This property is required only if the rpmsg/virtio functionality is used.
|
This property is required only if the rpmsg/virtio functionality is used.
|
||||||
|
|
|
@ -11,7 +11,7 @@ allOf:
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
compatible:
|
compatible:
|
||||||
|
|
|
@ -8,7 +8,7 @@ title: Allwinner A31 RTC Device Tree Bindings
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
"#clock-cells":
|
"#clock-cells":
|
||||||
|
|
|
@ -8,7 +8,7 @@ title: Allwinner A10 PS2 Host Controller Device Tree Bindings
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
description:
|
description:
|
||||||
A20 PS2 is dual role controller (PS2 host and PS2 device). These
|
A20 PS2 is dual role controller (PS2 host and PS2 device). These
|
||||||
|
|
|
@ -8,7 +8,7 @@ title: Allwinner A10 Codec Device Tree Bindings
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
"#sound-dai-cells":
|
"#sound-dai-cells":
|
||||||
|
|
|
@ -8,7 +8,7 @@ title: Allwinner A10 I2S Controller Device Tree Bindings
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
"#sound-dai-cells":
|
"#sound-dai-cells":
|
||||||
|
|
|
@ -10,7 +10,7 @@ maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Liam Girdwood <lgirdwood@gmail.com>
|
- Liam Girdwood <lgirdwood@gmail.com>
|
||||||
- Mark Brown <broonie@kernel.org>
|
- Mark Brown <broonie@kernel.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
"#sound-dai-cells":
|
"#sound-dai-cells":
|
||||||
|
|
|
@ -8,7 +8,7 @@ title: Allwinner A64 Analog Codec Device Tree Bindings
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
compatible:
|
compatible:
|
||||||
|
|
|
@ -8,7 +8,7 @@ title: Allwinner A23 Analog Codec Device Tree Bindings
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
compatible:
|
compatible:
|
||||||
|
|
|
@ -8,7 +8,7 @@ title: Allwinner A33 Codec Device Tree Bindings
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
"#sound-dai-cells":
|
"#sound-dai-cells":
|
||||||
|
|
|
@ -11,7 +11,7 @@ allOf:
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
"#address-cells": true
|
"#address-cells": true
|
||||||
|
|
|
@ -11,7 +11,7 @@ allOf:
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
"#address-cells": true
|
"#address-cells": true
|
||||||
|
|
|
@ -8,7 +8,7 @@ title: Allwinner A10 Timer Device Tree Bindings
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
compatible:
|
compatible:
|
||||||
|
|
|
@ -8,7 +8,7 @@ title: Allwinner A13 High-Speed Timer Device Tree Bindings
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
compatible:
|
compatible:
|
||||||
|
|
|
@ -8,7 +8,7 @@ title: Allwinner A10 mUSB OTG Controller Device Tree Bindings
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
compatible:
|
compatible:
|
||||||
|
|
|
@ -11,7 +11,7 @@ allOf:
|
||||||
|
|
||||||
maintainers:
|
maintainers:
|
||||||
- Chen-Yu Tsai <wens@csie.org>
|
- Chen-Yu Tsai <wens@csie.org>
|
||||||
- Maxime Ripard <maxime.ripard@bootlin.com>
|
- Maxime Ripard <mripard@kernel.org>
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
compatible:
|
compatible:
|
||||||
|
|
|
@ -24,11 +24,11 @@ Here is the main features of EROFS:
|
||||||
- Metadata & data could be mixed by design;
|
- Metadata & data could be mixed by design;
|
||||||
|
|
||||||
- 2 inode versions for different requirements:
|
- 2 inode versions for different requirements:
|
||||||
v1 v2
|
compact (v1) extended (v2)
|
||||||
Inode metadata size: 32 bytes 64 bytes
|
Inode metadata size: 32 bytes 64 bytes
|
||||||
Max file size: 4 GB 16 EB (also limited by max. vol size)
|
Max file size: 4 GB 16 EB (also limited by max. vol size)
|
||||||
Max uids/gids: 65536 4294967296
|
Max uids/gids: 65536 4294967296
|
||||||
File creation time: no yes (64 + 32-bit timestamp)
|
File change time: no yes (64 + 32-bit timestamp)
|
||||||
Max hardlinks: 65536 4294967296
|
Max hardlinks: 65536 4294967296
|
||||||
Metadata reserved: 4 bytes 14 bytes
|
Metadata reserved: 4 bytes 14 bytes
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ Here is the main features of EROFS:
|
||||||
- Support POSIX.1e ACLs by using xattrs;
|
- Support POSIX.1e ACLs by using xattrs;
|
||||||
|
|
||||||
- Support transparent file compression as an option:
|
- Support transparent file compression as an option:
|
||||||
LZ4 algorithm with 4 KB fixed-output compression for high performance;
|
LZ4 algorithm with 4 KB fixed-sized output compression for high performance.
|
||||||
|
|
||||||
The following git tree provides the file system user-space tools under
|
The following git tree provides the file system user-space tools under
|
||||||
development (ex, formatting tool mkfs.erofs):
|
development (ex, formatting tool mkfs.erofs):
|
||||||
|
@ -85,7 +85,7 @@ All data areas should be aligned with the block size, but metadata areas
|
||||||
may not. All metadatas can be now observed in two different spaces (views):
|
may not. All metadatas can be now observed in two different spaces (views):
|
||||||
1. Inode metadata space
|
1. Inode metadata space
|
||||||
Each valid inode should be aligned with an inode slot, which is a fixed
|
Each valid inode should be aligned with an inode slot, which is a fixed
|
||||||
value (32 bytes) and designed to be kept in line with v1 inode size.
|
value (32 bytes) and designed to be kept in line with compact inode size.
|
||||||
|
|
||||||
Each inode can be directly found with the following formula:
|
Each inode can be directly found with the following formula:
|
||||||
inode offset = meta_blkaddr * block_size + 32 * nid
|
inode offset = meta_blkaddr * block_size + 32 * nid
|
||||||
|
@ -117,10 +117,10 @@ may not. All metadatas can be now observed in two different spaces (views):
|
||||||
|-> aligned with 4B
|
|-> aligned with 4B
|
||||||
|
|
||||||
Inode could be 32 or 64 bytes, which can be distinguished from a common
|
Inode could be 32 or 64 bytes, which can be distinguished from a common
|
||||||
field which all inode versions have -- i_advise:
|
field which all inode versions have -- i_format:
|
||||||
|
|
||||||
__________________ __________________
|
__________________ __________________
|
||||||
| i_advise | | i_advise |
|
| i_format | | i_format |
|
||||||
|__________________| |__________________|
|
|__________________| |__________________|
|
||||||
| ... | | ... |
|
| ... | | ... |
|
||||||
| | | |
|
| | | |
|
||||||
|
@ -129,12 +129,13 @@ may not. All metadatas can be now observed in two different spaces (views):
|
||||||
|__________________| 64 bytes
|
|__________________| 64 bytes
|
||||||
|
|
||||||
Xattrs, extents, data inline are followed by the corresponding inode with
|
Xattrs, extents, data inline are followed by the corresponding inode with
|
||||||
proper alignes, and they could be optional for different data mappings,
|
proper alignment, and they could be optional for different data mappings.
|
||||||
_currently_ there are totally 3 valid data mappings supported:
|
_currently_ total 4 valid data mappings are supported:
|
||||||
|
|
||||||
1) flat file data without data inline (no extent);
|
0 flat file data without data inline (no extent);
|
||||||
2) fixed-output size data compression (must have extents);
|
1 fixed-sized output data compression (with non-compacted indexes);
|
||||||
3) flat file data with tail-end data inline (no extent);
|
2 flat file data with tail packing data inline (no extent);
|
||||||
|
3 fixed-sized output data compression (with compacted indexes, v5.3+).
|
||||||
|
|
||||||
The size of the optional xattrs is indicated by i_xattr_count in inode
|
The size of the optional xattrs is indicated by i_xattr_count in inode
|
||||||
header. Large xattrs or xattrs shared by many different files can be
|
header. Large xattrs or xattrs shared by many different files can be
|
||||||
|
@ -182,8 +183,8 @@ introduce another on-disk field at all.
|
||||||
|
|
||||||
Compression
|
Compression
|
||||||
-----------
|
-----------
|
||||||
Currently, EROFS supports 4KB fixed-output clustersize transparent file
|
Currently, EROFS supports 4KB fixed-sized output transparent file compression,
|
||||||
compression, as illustrated below:
|
as illustrated below:
|
||||||
|
|
||||||
|---- Variant-Length Extent ----|-------- VLE --------|----- VLE -----
|
|---- Variant-Length Extent ----|-------- VLE --------|----- VLE -----
|
||||||
clusterofs clusterofs clusterofs
|
clusterofs clusterofs clusterofs
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
.. SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
Written by: Neil Brown
|
Written by: Neil Brown
|
||||||
Please see MAINTAINERS file for where to send questions.
|
Please see MAINTAINERS file for where to send questions.
|
||||||
|
|
||||||
|
@ -181,7 +183,7 @@ Kernel config options:
|
||||||
worried about backward compatibility with kernels that have the redirect_dir
|
worried about backward compatibility with kernels that have the redirect_dir
|
||||||
feature and follow redirects even if turned off.
|
feature and follow redirects even if turned off.
|
||||||
|
|
||||||
Module options (can also be changed through /sys/module/overlay/parameters/*):
|
Module options (can also be changed through /sys/module/overlay/parameters/):
|
||||||
|
|
||||||
- "redirect_dir=BOOL":
|
- "redirect_dir=BOOL":
|
||||||
See OVERLAY_FS_REDIRECT_DIR kernel config option above.
|
See OVERLAY_FS_REDIRECT_DIR kernel config option above.
|
||||||
|
@ -263,7 +265,7 @@ top, lower2 the middle and lower3 the bottom layer.
|
||||||
|
|
||||||
|
|
||||||
Metadata only copy up
|
Metadata only copy up
|
||||||
--------------------
|
---------------------
|
||||||
|
|
||||||
When metadata only copy up feature is enabled, overlayfs will only copy
|
When metadata only copy up feature is enabled, overlayfs will only copy
|
||||||
up metadata (as opposed to whole file), when a metadata specific operation
|
up metadata (as opposed to whole file), when a metadata specific operation
|
||||||
|
@ -286,10 +288,10 @@ pointed by REDIRECT. This should not be possible on local system as setting
|
||||||
"trusted." xattrs will require CAP_SYS_ADMIN. But it should be possible
|
"trusted." xattrs will require CAP_SYS_ADMIN. But it should be possible
|
||||||
for untrusted layers like from a pen drive.
|
for untrusted layers like from a pen drive.
|
||||||
|
|
||||||
Note: redirect_dir={off|nofollow|follow(*)} conflicts with metacopy=on, and
|
Note: redirect_dir={off|nofollow|follow[*]} conflicts with metacopy=on, and
|
||||||
results in an error.
|
results in an error.
|
||||||
|
|
||||||
(*) redirect_dir=follow only conflicts with metacopy=on if upperdir=... is
|
[*] redirect_dir=follow only conflicts with metacopy=on if upperdir=... is
|
||||||
given.
|
given.
|
||||||
|
|
||||||
Sharing and copying layers
|
Sharing and copying layers
|
|
@ -988,7 +988,7 @@ Similarly, if you need to calculate the size of some structure member, use
|
||||||
|
|
||||||
.. code-block:: c
|
.. code-block:: c
|
||||||
|
|
||||||
#define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f))
|
#define sizeof_field(t, f) (sizeof(((t*)0)->f))
|
||||||
|
|
||||||
There are also min() and max() macros that do strict type checking if you
|
There are also min() and max() macros that do strict type checking if you
|
||||||
need them. Feel free to peruse that header file to see what else is already
|
need them. Feel free to peruse that header file to see what else is already
|
||||||
|
|
|
@ -29,7 +29,7 @@ smartpqi specific entries in /sys
|
||||||
smartpqi host attributes:
|
smartpqi host attributes:
|
||||||
-------------------------
|
-------------------------
|
||||||
/sys/class/scsi_host/host*/rescan
|
/sys/class/scsi_host/host*/rescan
|
||||||
/sys/class/scsi_host/host*/version
|
/sys/class/scsi_host/host*/driver_version
|
||||||
|
|
||||||
The host rescan attribute is a write only attribute. Writing to this
|
The host rescan attribute is a write only attribute. Writing to this
|
||||||
attribute will trigger the driver to scan for new, changed, or removed
|
attribute will trigger the driver to scan for new, changed, or removed
|
||||||
|
|
|
@ -1005,7 +1005,7 @@ struttura, usate
|
||||||
|
|
||||||
.. code-block:: c
|
.. code-block:: c
|
||||||
|
|
||||||
#define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f))
|
#define sizeof_field(t, f) (sizeof(((t*)0)->f))
|
||||||
|
|
||||||
Ci sono anche le macro min() e max() che, se vi serve, effettuano un controllo
|
Ci sono anche le macro min() e max() che, se vi serve, effettuano un controllo
|
||||||
rigido sui tipi. Sentitevi liberi di leggere attentamente questo file
|
rigido sui tipi. Sentitevi liberi di leggere attentamente questo file
|
||||||
|
|
|
@ -826,7 +826,7 @@ inline gcc 也可以自动使其内联。而且其他用户可能会要求移除
|
||||||
|
|
||||||
.. code-block:: c
|
.. code-block:: c
|
||||||
|
|
||||||
#define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f))
|
#define sizeof_field(t, f) (sizeof(((t*)0)->f))
|
||||||
|
|
||||||
还有可以做严格的类型检查的 min() 和 max() 宏,如果你需要可以使用它们。你可以
|
还有可以做严格的类型检查的 min() 和 max() 宏,如果你需要可以使用它们。你可以
|
||||||
自己看看那个头文件里还定义了什么你可以拿来用的东西,如果有定义的话,你就不应
|
自己看看那个头文件里还定义了什么你可以拿来用的东西,如果有定义的话,你就不应
|
||||||
|
|
|
@ -4971,6 +4971,7 @@ F: include/linux/dma-buf*
|
||||||
F: include/linux/reservation.h
|
F: include/linux/reservation.h
|
||||||
F: include/linux/*fence.h
|
F: include/linux/*fence.h
|
||||||
F: Documentation/driver-api/dma-buf.rst
|
F: Documentation/driver-api/dma-buf.rst
|
||||||
|
K: dma_(buf|fence|resv)
|
||||||
T: git git://anongit.freedesktop.org/drm/drm-misc
|
T: git git://anongit.freedesktop.org/drm/drm-misc
|
||||||
|
|
||||||
DMA GENERIC OFFLOAD ENGINE SUBSYSTEM
|
DMA GENERIC OFFLOAD ENGINE SUBSYSTEM
|
||||||
|
@ -12394,7 +12395,7 @@ L: linux-unionfs@vger.kernel.org
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/vfs.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/vfs.git
|
||||||
S: Supported
|
S: Supported
|
||||||
F: fs/overlayfs/
|
F: fs/overlayfs/
|
||||||
F: Documentation/filesystems/overlayfs.txt
|
F: Documentation/filesystems/overlayfs.rst
|
||||||
|
|
||||||
P54 WIRELESS DRIVER
|
P54 WIRELESS DRIVER
|
||||||
M: Christian Lamparter <chunkeey@googlemail.com>
|
M: Christian Lamparter <chunkeey@googlemail.com>
|
||||||
|
@ -16315,12 +16316,10 @@ F: drivers/media/radio/radio-raremono.c
|
||||||
|
|
||||||
THERMAL
|
THERMAL
|
||||||
M: Zhang Rui <rui.zhang@intel.com>
|
M: Zhang Rui <rui.zhang@intel.com>
|
||||||
M: Eduardo Valentin <edubezval@gmail.com>
|
M: Daniel Lezcano <daniel.lezcano@linaro.org>
|
||||||
R: Daniel Lezcano <daniel.lezcano@linaro.org>
|
|
||||||
R: Amit Kucheria <amit.kucheria@verdurent.com>
|
R: Amit Kucheria <amit.kucheria@verdurent.com>
|
||||||
L: linux-pm@vger.kernel.org
|
L: linux-pm@vger.kernel.org
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/rzhang/linux.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/thermal/linux.git
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/evalenti/linux-soc-thermal.git
|
|
||||||
Q: https://patchwork.kernel.org/project/linux-pm/list/
|
Q: https://patchwork.kernel.org/project/linux-pm/list/
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/thermal/
|
F: drivers/thermal/
|
||||||
|
|
2
Makefile
2
Makefile
|
@ -2,7 +2,7 @@
|
||||||
VERSION = 5
|
VERSION = 5
|
||||||
PATCHLEVEL = 5
|
PATCHLEVEL = 5
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION = -rc1
|
EXTRAVERSION = -rc2
|
||||||
NAME = Kleptomaniac Octopus
|
NAME = Kleptomaniac Octopus
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
|
|
@ -42,10 +42,10 @@ do { \
|
||||||
|
|
||||||
#define EXTRA_INFO(f) { \
|
#define EXTRA_INFO(f) { \
|
||||||
BUILD_BUG_ON_ZERO(offsetof(struct unwind_frame_info, f) \
|
BUILD_BUG_ON_ZERO(offsetof(struct unwind_frame_info, f) \
|
||||||
% FIELD_SIZEOF(struct unwind_frame_info, f)) \
|
% sizeof_field(struct unwind_frame_info, f)) \
|
||||||
+ offsetof(struct unwind_frame_info, f) \
|
+ offsetof(struct unwind_frame_info, f) \
|
||||||
/ FIELD_SIZEOF(struct unwind_frame_info, f), \
|
/ sizeof_field(struct unwind_frame_info, f), \
|
||||||
FIELD_SIZEOF(struct unwind_frame_info, f) \
|
sizeof_field(struct unwind_frame_info, f) \
|
||||||
}
|
}
|
||||||
#define PTREGS_INFO(f) EXTRA_INFO(regs.f)
|
#define PTREGS_INFO(f) EXTRA_INFO(regs.f)
|
||||||
|
|
||||||
|
|
|
@ -49,6 +49,28 @@
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
&hsic0 {
|
||||||
|
status = "okay";
|
||||||
|
|
||||||
|
usb1@1 {
|
||||||
|
compatible = "usb424,2640";
|
||||||
|
reg = <0x01>;
|
||||||
|
#address-cells = <0x01>;
|
||||||
|
#size-cells = <0x00>;
|
||||||
|
|
||||||
|
mass-storage@1 {
|
||||||
|
compatible = "usb424,4040";
|
||||||
|
reg = <0x01>;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
&hsic_phy0 {
|
||||||
|
status = "okay";
|
||||||
|
reset-gpios = <&gpio 63 GPIO_ACTIVE_HIGH>;
|
||||||
|
};
|
||||||
|
|
||||||
&mmc3 {
|
&mmc3 {
|
||||||
status = "okay";
|
status = "okay";
|
||||||
max-frequency = <50000000>;
|
max-frequency = <50000000>;
|
||||||
|
|
|
@ -201,6 +201,50 @@
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
hsic_phy0: hsic-phy@f0001800 {
|
||||||
|
compatible = "marvell,mmp3-hsic-phy",
|
||||||
|
"usb-nop-xceiv",
|
||||||
|
reg = <0xf0001800 0x40>;
|
||||||
|
#phy-cells = <0>;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
hsic0: hsic@f0001000 {
|
||||||
|
compatible = "marvell,pxau2o-ehci";
|
||||||
|
reg = <0xf0001000 0x200>;
|
||||||
|
interrupts = <GIC_SPI 22 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
clocks = <&soc_clocks MMP2_CLK_USBHSIC0>;
|
||||||
|
clock-names = "USBCLK";
|
||||||
|
phys = <&hsic_phy0>;
|
||||||
|
phy-names = "usb";
|
||||||
|
phy_type = "hsic";
|
||||||
|
#address-cells = <0x01>;
|
||||||
|
#size-cells = <0x00>;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
hsic_phy1: hsic-phy@f0002800 {
|
||||||
|
compatible = "marvell,mmp3-hsic-phy",
|
||||||
|
"usb-nop-xceiv",
|
||||||
|
reg = <0xf0002800 0x40>;
|
||||||
|
#phy-cells = <0>;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
|
hsic1: hsic@f0002000 {
|
||||||
|
compatible = "marvell,pxau2o-ehci";
|
||||||
|
reg = <0xf0002000 0x200>;
|
||||||
|
interrupts = <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
clocks = <&soc_clocks MMP2_CLK_USBHSIC1>;
|
||||||
|
clock-names = "USBCLK";
|
||||||
|
phys = <&hsic_phy1>;
|
||||||
|
phy-names = "usb";
|
||||||
|
phy_type = "hsic";
|
||||||
|
#address-cells = <0x01>;
|
||||||
|
#size-cells = <0x00>;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
|
||||||
mmc1: mmc@d4280000 {
|
mmc1: mmc@d4280000 {
|
||||||
compatible = "mrvl,pxav3-mmc";
|
compatible = "mrvl,pxav3-mmc";
|
||||||
reg = <0xd4280000 0x120>;
|
reg = <0xd4280000 0x120>;
|
||||||
|
|
|
@ -38,6 +38,13 @@ void curve25519_arch(u8 out[CURVE25519_KEY_SIZE],
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(curve25519_arch);
|
EXPORT_SYMBOL(curve25519_arch);
|
||||||
|
|
||||||
|
void curve25519_base_arch(u8 pub[CURVE25519_KEY_SIZE],
|
||||||
|
const u8 secret[CURVE25519_KEY_SIZE])
|
||||||
|
{
|
||||||
|
return curve25519_arch(pub, secret, curve25519_base_point);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(curve25519_base_arch);
|
||||||
|
|
||||||
static int curve25519_set_secret(struct crypto_kpp *tfm, const void *buf,
|
static int curve25519_set_secret(struct crypto_kpp *tfm, const void *buf,
|
||||||
unsigned int len)
|
unsigned int len)
|
||||||
{
|
{
|
||||||
|
|
|
@ -44,13 +44,6 @@ static struct cvmx_bootmem_desc *cvmx_bootmem_desc;
|
||||||
|
|
||||||
/* See header file for descriptions of functions */
|
/* See header file for descriptions of functions */
|
||||||
|
|
||||||
/**
|
|
||||||
* This macro returns the size of a member of a structure.
|
|
||||||
* Logically it is the same as "sizeof(s::field)" in C++, but
|
|
||||||
* C lacks the "::" operator.
|
|
||||||
*/
|
|
||||||
#define SIZEOF_FIELD(s, field) sizeof(((s *)NULL)->field)
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This macro returns a member of the
|
* This macro returns a member of the
|
||||||
* cvmx_bootmem_named_block_desc_t structure. These members can't
|
* cvmx_bootmem_named_block_desc_t structure. These members can't
|
||||||
|
@ -65,7 +58,7 @@ static struct cvmx_bootmem_desc *cvmx_bootmem_desc;
|
||||||
#define CVMX_BOOTMEM_NAMED_GET_FIELD(addr, field) \
|
#define CVMX_BOOTMEM_NAMED_GET_FIELD(addr, field) \
|
||||||
__cvmx_bootmem_desc_get(addr, \
|
__cvmx_bootmem_desc_get(addr, \
|
||||||
offsetof(struct cvmx_bootmem_named_block_desc, field), \
|
offsetof(struct cvmx_bootmem_named_block_desc, field), \
|
||||||
SIZEOF_FIELD(struct cvmx_bootmem_named_block_desc, field))
|
sizeof_field(struct cvmx_bootmem_named_block_desc, field))
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This function is the implementation of the get macros defined
|
* This function is the implementation of the get macros defined
|
||||||
|
|
|
@ -138,6 +138,14 @@ void __iomem *ioremap(unsigned long phys_addr, unsigned long size)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Map uncached objects in the low part of address space to
|
||||||
|
* CONFIG_NIOS2_IO_REGION_BASE
|
||||||
|
*/
|
||||||
|
if (IS_MAPPABLE_UNCACHEABLE(phys_addr) &&
|
||||||
|
IS_MAPPABLE_UNCACHEABLE(last_addr))
|
||||||
|
return (void __iomem *)(CONFIG_NIOS2_IO_REGION_BASE + phys_addr);
|
||||||
|
|
||||||
/* Mappings have to be page-aligned */
|
/* Mappings have to be page-aligned */
|
||||||
offset = phys_addr & ~PAGE_MASK;
|
offset = phys_addr & ~PAGE_MASK;
|
||||||
phys_addr &= PAGE_MASK;
|
phys_addr &= PAGE_MASK;
|
||||||
|
|
|
@ -97,12 +97,12 @@ DECLARE_LOAD_FUNC(sk_load_byte_msh);
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
#ifdef CONFIG_PPC64
|
#ifdef CONFIG_PPC64
|
||||||
#define PPC_BPF_LOAD_CPU(r) \
|
#define PPC_BPF_LOAD_CPU(r) \
|
||||||
do { BUILD_BUG_ON(FIELD_SIZEOF(struct paca_struct, paca_index) != 2); \
|
do { BUILD_BUG_ON(sizeof_field(struct paca_struct, paca_index) != 2); \
|
||||||
PPC_LHZ_OFFS(r, 13, offsetof(struct paca_struct, paca_index)); \
|
PPC_LHZ_OFFS(r, 13, offsetof(struct paca_struct, paca_index)); \
|
||||||
} while (0)
|
} while (0)
|
||||||
#else
|
#else
|
||||||
#define PPC_BPF_LOAD_CPU(r) \
|
#define PPC_BPF_LOAD_CPU(r) \
|
||||||
do { BUILD_BUG_ON(FIELD_SIZEOF(struct task_struct, cpu) != 4); \
|
do { BUILD_BUG_ON(sizeof_field(struct task_struct, cpu) != 4); \
|
||||||
PPC_LHZ_OFFS(r, 2, offsetof(struct task_struct, cpu)); \
|
PPC_LHZ_OFFS(r, 2, offsetof(struct task_struct, cpu)); \
|
||||||
} while(0)
|
} while(0)
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -321,7 +321,7 @@ static int bpf_jit_build_body(struct bpf_prog *fp, u32 *image,
|
||||||
ctx->seen |= SEEN_XREG | SEEN_MEM | (1<<(K & 0xf));
|
ctx->seen |= SEEN_XREG | SEEN_MEM | (1<<(K & 0xf));
|
||||||
break;
|
break;
|
||||||
case BPF_LD | BPF_W | BPF_LEN: /* A = skb->len; */
|
case BPF_LD | BPF_W | BPF_LEN: /* A = skb->len; */
|
||||||
BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, len) != 4);
|
BUILD_BUG_ON(sizeof_field(struct sk_buff, len) != 4);
|
||||||
PPC_LWZ_OFFS(r_A, r_skb, offsetof(struct sk_buff, len));
|
PPC_LWZ_OFFS(r_A, r_skb, offsetof(struct sk_buff, len));
|
||||||
break;
|
break;
|
||||||
case BPF_LDX | BPF_W | BPF_ABS: /* A = *((u32 *)(seccomp_data + K)); */
|
case BPF_LDX | BPF_W | BPF_ABS: /* A = *((u32 *)(seccomp_data + K)); */
|
||||||
|
@ -333,16 +333,16 @@ static int bpf_jit_build_body(struct bpf_prog *fp, u32 *image,
|
||||||
|
|
||||||
/*** Ancillary info loads ***/
|
/*** Ancillary info loads ***/
|
||||||
case BPF_ANC | SKF_AD_PROTOCOL: /* A = ntohs(skb->protocol); */
|
case BPF_ANC | SKF_AD_PROTOCOL: /* A = ntohs(skb->protocol); */
|
||||||
BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff,
|
BUILD_BUG_ON(sizeof_field(struct sk_buff,
|
||||||
protocol) != 2);
|
protocol) != 2);
|
||||||
PPC_NTOHS_OFFS(r_A, r_skb, offsetof(struct sk_buff,
|
PPC_NTOHS_OFFS(r_A, r_skb, offsetof(struct sk_buff,
|
||||||
protocol));
|
protocol));
|
||||||
break;
|
break;
|
||||||
case BPF_ANC | SKF_AD_IFINDEX:
|
case BPF_ANC | SKF_AD_IFINDEX:
|
||||||
case BPF_ANC | SKF_AD_HATYPE:
|
case BPF_ANC | SKF_AD_HATYPE:
|
||||||
BUILD_BUG_ON(FIELD_SIZEOF(struct net_device,
|
BUILD_BUG_ON(sizeof_field(struct net_device,
|
||||||
ifindex) != 4);
|
ifindex) != 4);
|
||||||
BUILD_BUG_ON(FIELD_SIZEOF(struct net_device,
|
BUILD_BUG_ON(sizeof_field(struct net_device,
|
||||||
type) != 2);
|
type) != 2);
|
||||||
PPC_LL_OFFS(r_scratch1, r_skb, offsetof(struct sk_buff,
|
PPC_LL_OFFS(r_scratch1, r_skb, offsetof(struct sk_buff,
|
||||||
dev));
|
dev));
|
||||||
|
@ -365,17 +365,17 @@ static int bpf_jit_build_body(struct bpf_prog *fp, u32 *image,
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case BPF_ANC | SKF_AD_MARK:
|
case BPF_ANC | SKF_AD_MARK:
|
||||||
BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, mark) != 4);
|
BUILD_BUG_ON(sizeof_field(struct sk_buff, mark) != 4);
|
||||||
PPC_LWZ_OFFS(r_A, r_skb, offsetof(struct sk_buff,
|
PPC_LWZ_OFFS(r_A, r_skb, offsetof(struct sk_buff,
|
||||||
mark));
|
mark));
|
||||||
break;
|
break;
|
||||||
case BPF_ANC | SKF_AD_RXHASH:
|
case BPF_ANC | SKF_AD_RXHASH:
|
||||||
BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, hash) != 4);
|
BUILD_BUG_ON(sizeof_field(struct sk_buff, hash) != 4);
|
||||||
PPC_LWZ_OFFS(r_A, r_skb, offsetof(struct sk_buff,
|
PPC_LWZ_OFFS(r_A, r_skb, offsetof(struct sk_buff,
|
||||||
hash));
|
hash));
|
||||||
break;
|
break;
|
||||||
case BPF_ANC | SKF_AD_VLAN_TAG:
|
case BPF_ANC | SKF_AD_VLAN_TAG:
|
||||||
BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, vlan_tci) != 2);
|
BUILD_BUG_ON(sizeof_field(struct sk_buff, vlan_tci) != 2);
|
||||||
|
|
||||||
PPC_LHZ_OFFS(r_A, r_skb, offsetof(struct sk_buff,
|
PPC_LHZ_OFFS(r_A, r_skb, offsetof(struct sk_buff,
|
||||||
vlan_tci));
|
vlan_tci));
|
||||||
|
@ -388,7 +388,7 @@ static int bpf_jit_build_body(struct bpf_prog *fp, u32 *image,
|
||||||
PPC_ANDI(r_A, r_A, 1);
|
PPC_ANDI(r_A, r_A, 1);
|
||||||
break;
|
break;
|
||||||
case BPF_ANC | SKF_AD_QUEUE:
|
case BPF_ANC | SKF_AD_QUEUE:
|
||||||
BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff,
|
BUILD_BUG_ON(sizeof_field(struct sk_buff,
|
||||||
queue_mapping) != 2);
|
queue_mapping) != 2);
|
||||||
PPC_LHZ_OFFS(r_A, r_skb, offsetof(struct sk_buff,
|
PPC_LHZ_OFFS(r_A, r_skb, offsetof(struct sk_buff,
|
||||||
queue_mapping));
|
queue_mapping));
|
||||||
|
|
|
@ -2,8 +2,8 @@ menu "SoC selection"
|
||||||
|
|
||||||
config SOC_SIFIVE
|
config SOC_SIFIVE
|
||||||
bool "SiFive SoCs"
|
bool "SiFive SoCs"
|
||||||
select SERIAL_SIFIVE
|
select SERIAL_SIFIVE if TTY
|
||||||
select SERIAL_SIFIVE_CONSOLE
|
select SERIAL_SIFIVE_CONSOLE if TTY
|
||||||
select CLK_SIFIVE
|
select CLK_SIFIVE
|
||||||
select CLK_SIFIVE_FU540_PRCI
|
select CLK_SIFIVE_FU540_PRCI
|
||||||
select SIFIVE_PLIC
|
select SIFIVE_PLIC
|
||||||
|
|
|
@ -24,7 +24,7 @@ $(obj)/Image: vmlinux FORCE
|
||||||
$(obj)/Image.gz: $(obj)/Image FORCE
|
$(obj)/Image.gz: $(obj)/Image FORCE
|
||||||
$(call if_changed,gzip)
|
$(call if_changed,gzip)
|
||||||
|
|
||||||
loader.o: $(src)/loader.S $(obj)/Image
|
$(obj)/loader.o: $(src)/loader.S $(obj)/Image
|
||||||
|
|
||||||
$(obj)/loader: $(obj)/loader.o $(obj)/Image $(obj)/loader.lds FORCE
|
$(obj)/loader: $(obj)/loader.o $(obj)/Image $(obj)/loader.lds FORCE
|
||||||
$(Q)$(LD) -T $(obj)/loader.lds -o $@ $(obj)/loader.o
|
$(Q)$(LD) -T $(obj)/loader.lds -o $@ $(obj)/loader.o
|
||||||
|
|
|
@ -124,6 +124,7 @@ config S390
|
||||||
select HAVE_ARCH_JUMP_LABEL
|
select HAVE_ARCH_JUMP_LABEL
|
||||||
select HAVE_ARCH_JUMP_LABEL_RELATIVE
|
select HAVE_ARCH_JUMP_LABEL_RELATIVE
|
||||||
select HAVE_ARCH_KASAN
|
select HAVE_ARCH_KASAN
|
||||||
|
select HAVE_ARCH_KASAN_VMALLOC
|
||||||
select CPU_NO_EFFICIENT_FFS if !HAVE_MARCH_Z9_109_FEATURES
|
select CPU_NO_EFFICIENT_FFS if !HAVE_MARCH_Z9_109_FEATURES
|
||||||
select HAVE_ARCH_SECCOMP_FILTER
|
select HAVE_ARCH_SECCOMP_FILTER
|
||||||
select HAVE_ARCH_SOFT_DIRTY
|
select HAVE_ARCH_SOFT_DIRTY
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
#define MACHINE_FLAG_DIAG9C BIT(3)
|
#define MACHINE_FLAG_DIAG9C BIT(3)
|
||||||
#define MACHINE_FLAG_ESOP BIT(4)
|
#define MACHINE_FLAG_ESOP BIT(4)
|
||||||
#define MACHINE_FLAG_IDTE BIT(5)
|
#define MACHINE_FLAG_IDTE BIT(5)
|
||||||
#define MACHINE_FLAG_DIAG44 BIT(6)
|
|
||||||
#define MACHINE_FLAG_EDAT1 BIT(7)
|
#define MACHINE_FLAG_EDAT1 BIT(7)
|
||||||
#define MACHINE_FLAG_EDAT2 BIT(8)
|
#define MACHINE_FLAG_EDAT2 BIT(8)
|
||||||
#define MACHINE_FLAG_TOPOLOGY BIT(10)
|
#define MACHINE_FLAG_TOPOLOGY BIT(10)
|
||||||
|
@ -94,7 +93,6 @@ extern unsigned long __swsusp_reset_dma;
|
||||||
#define MACHINE_HAS_DIAG9C (S390_lowcore.machine_flags & MACHINE_FLAG_DIAG9C)
|
#define MACHINE_HAS_DIAG9C (S390_lowcore.machine_flags & MACHINE_FLAG_DIAG9C)
|
||||||
#define MACHINE_HAS_ESOP (S390_lowcore.machine_flags & MACHINE_FLAG_ESOP)
|
#define MACHINE_HAS_ESOP (S390_lowcore.machine_flags & MACHINE_FLAG_ESOP)
|
||||||
#define MACHINE_HAS_IDTE (S390_lowcore.machine_flags & MACHINE_FLAG_IDTE)
|
#define MACHINE_HAS_IDTE (S390_lowcore.machine_flags & MACHINE_FLAG_IDTE)
|
||||||
#define MACHINE_HAS_DIAG44 (S390_lowcore.machine_flags & MACHINE_FLAG_DIAG44)
|
|
||||||
#define MACHINE_HAS_EDAT1 (S390_lowcore.machine_flags & MACHINE_FLAG_EDAT1)
|
#define MACHINE_HAS_EDAT1 (S390_lowcore.machine_flags & MACHINE_FLAG_EDAT1)
|
||||||
#define MACHINE_HAS_EDAT2 (S390_lowcore.machine_flags & MACHINE_FLAG_EDAT2)
|
#define MACHINE_HAS_EDAT2 (S390_lowcore.machine_flags & MACHINE_FLAG_EDAT2)
|
||||||
#define MACHINE_HAS_TOPOLOGY (S390_lowcore.machine_flags & MACHINE_FLAG_TOPOLOGY)
|
#define MACHINE_HAS_TOPOLOGY (S390_lowcore.machine_flags & MACHINE_FLAG_TOPOLOGY)
|
||||||
|
|
|
@ -86,7 +86,7 @@ static inline int share(unsigned long addr, u16 cmd)
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!is_prot_virt_guest())
|
if (!is_prot_virt_guest())
|
||||||
return -ENOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
/*
|
/*
|
||||||
* Sharing is page wise, if we encounter addresses that are
|
* Sharing is page wise, if we encounter addresses that are
|
||||||
* not page aligned, we assume something went wrong. If
|
* not page aligned, we assume something went wrong. If
|
||||||
|
|
|
@ -204,21 +204,6 @@ static __init void detect_diag9c(void)
|
||||||
S390_lowcore.machine_flags |= MACHINE_FLAG_DIAG9C;
|
S390_lowcore.machine_flags |= MACHINE_FLAG_DIAG9C;
|
||||||
}
|
}
|
||||||
|
|
||||||
static __init void detect_diag44(void)
|
|
||||||
{
|
|
||||||
int rc;
|
|
||||||
|
|
||||||
diag_stat_inc(DIAG_STAT_X044);
|
|
||||||
asm volatile(
|
|
||||||
" diag 0,0,0x44\n"
|
|
||||||
"0: la %0,0\n"
|
|
||||||
"1:\n"
|
|
||||||
EX_TABLE(0b,1b)
|
|
||||||
: "=d" (rc) : "0" (-EOPNOTSUPP) : "cc");
|
|
||||||
if (!rc)
|
|
||||||
S390_lowcore.machine_flags |= MACHINE_FLAG_DIAG44;
|
|
||||||
}
|
|
||||||
|
|
||||||
static __init void detect_machine_facilities(void)
|
static __init void detect_machine_facilities(void)
|
||||||
{
|
{
|
||||||
if (test_facility(8)) {
|
if (test_facility(8)) {
|
||||||
|
@ -331,7 +316,6 @@ void __init startup_init(void)
|
||||||
setup_arch_string();
|
setup_arch_string();
|
||||||
setup_boot_command_line();
|
setup_boot_command_line();
|
||||||
detect_diag9c();
|
detect_diag9c();
|
||||||
detect_diag44();
|
|
||||||
detect_machine_facilities();
|
detect_machine_facilities();
|
||||||
save_vector_registers();
|
save_vector_registers();
|
||||||
setup_topology();
|
setup_topology();
|
||||||
|
|
|
@ -1303,18 +1303,28 @@ static void hw_perf_event_update(struct perf_event *event, int flush_all)
|
||||||
*/
|
*/
|
||||||
if (flush_all && done)
|
if (flush_all && done)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* If an event overflow happened, discard samples by
|
|
||||||
* processing any remaining sample-data-blocks.
|
|
||||||
*/
|
|
||||||
if (event_overflow)
|
|
||||||
flush_all = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Account sample overflows in the event hardware structure */
|
/* Account sample overflows in the event hardware structure */
|
||||||
if (sampl_overflow)
|
if (sampl_overflow)
|
||||||
OVERFLOW_REG(hwc) = DIV_ROUND_UP(OVERFLOW_REG(hwc) +
|
OVERFLOW_REG(hwc) = DIV_ROUND_UP(OVERFLOW_REG(hwc) +
|
||||||
sampl_overflow, 1 + num_sdb);
|
sampl_overflow, 1 + num_sdb);
|
||||||
|
|
||||||
|
/* Perf_event_overflow() and perf_event_account_interrupt() limit
|
||||||
|
* the interrupt rate to an upper limit. Roughly 1000 samples per
|
||||||
|
* task tick.
|
||||||
|
* Hitting this limit results in a large number
|
||||||
|
* of throttled REF_REPORT_THROTTLE entries and the samples
|
||||||
|
* are dropped.
|
||||||
|
* Slightly increase the interval to avoid hitting this limit.
|
||||||
|
*/
|
||||||
|
if (event_overflow) {
|
||||||
|
SAMPL_RATE(hwc) += DIV_ROUND_UP(SAMPL_RATE(hwc), 10);
|
||||||
|
debug_sprintf_event(sfdbg, 1, "%s: rate adjustment %ld\n",
|
||||||
|
__func__,
|
||||||
|
DIV_ROUND_UP(SAMPL_RATE(hwc), 10));
|
||||||
|
}
|
||||||
|
|
||||||
if (sampl_overflow || event_overflow)
|
if (sampl_overflow || event_overflow)
|
||||||
debug_sprintf_event(sfdbg, 4, "%s: "
|
debug_sprintf_event(sfdbg, 4, "%s: "
|
||||||
"overflows: sample %llu event %llu"
|
"overflows: sample %llu event %llu"
|
||||||
|
|
|
@ -413,14 +413,11 @@ EXPORT_SYMBOL(arch_vcpu_is_preempted);
|
||||||
|
|
||||||
void smp_yield_cpu(int cpu)
|
void smp_yield_cpu(int cpu)
|
||||||
{
|
{
|
||||||
if (MACHINE_HAS_DIAG9C) {
|
if (!MACHINE_HAS_DIAG9C)
|
||||||
|
return;
|
||||||
diag_stat_inc_norecursion(DIAG_STAT_X09C);
|
diag_stat_inc_norecursion(DIAG_STAT_X09C);
|
||||||
asm volatile("diag %0,0,0x9c"
|
asm volatile("diag %0,0,0x9c"
|
||||||
: : "d" (pcpu_devices[cpu].address));
|
: : "d" (pcpu_devices[cpu].address));
|
||||||
} else if (MACHINE_HAS_DIAG44 && !smp_cpu_mtid) {
|
|
||||||
diag_stat_inc_norecursion(DIAG_STAT_X044);
|
|
||||||
asm volatile("diag 0,0,0x44");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -242,7 +242,6 @@ static inline void arch_spin_lock_classic(arch_spinlock_t *lp)
|
||||||
|
|
||||||
void arch_spin_lock_wait(arch_spinlock_t *lp)
|
void arch_spin_lock_wait(arch_spinlock_t *lp)
|
||||||
{
|
{
|
||||||
/* Use classic spinlocks + niai if the steal time is >= 10% */
|
|
||||||
if (test_cpu_flag(CIF_DEDICATED_CPU))
|
if (test_cpu_flag(CIF_DEDICATED_CPU))
|
||||||
arch_spin_lock_queued(lp);
|
arch_spin_lock_queued(lp);
|
||||||
else
|
else
|
||||||
|
|
|
@ -238,7 +238,7 @@ static int test_unwind_irq(struct unwindme *u)
|
||||||
{
|
{
|
||||||
preempt_disable();
|
preempt_disable();
|
||||||
if (register_external_irq(EXT_IRQ_CLK_COMP, unwindme_irq_handler)) {
|
if (register_external_irq(EXT_IRQ_CLK_COMP, unwindme_irq_handler)) {
|
||||||
pr_info("Couldn't reqister external interrupt handler");
|
pr_info("Couldn't register external interrupt handler");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
u->task = current;
|
u->task = current;
|
||||||
|
|
|
@ -82,7 +82,8 @@ static pte_t * __init kasan_early_pte_alloc(void)
|
||||||
enum populate_mode {
|
enum populate_mode {
|
||||||
POPULATE_ONE2ONE,
|
POPULATE_ONE2ONE,
|
||||||
POPULATE_MAP,
|
POPULATE_MAP,
|
||||||
POPULATE_ZERO_SHADOW
|
POPULATE_ZERO_SHADOW,
|
||||||
|
POPULATE_SHALLOW
|
||||||
};
|
};
|
||||||
static void __init kasan_early_vmemmap_populate(unsigned long address,
|
static void __init kasan_early_vmemmap_populate(unsigned long address,
|
||||||
unsigned long end,
|
unsigned long end,
|
||||||
|
@ -116,6 +117,12 @@ static void __init kasan_early_vmemmap_populate(unsigned long address,
|
||||||
pgd_populate(&init_mm, pg_dir, p4_dir);
|
pgd_populate(&init_mm, pg_dir, p4_dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (IS_ENABLED(CONFIG_KASAN_S390_4_LEVEL_PAGING) &&
|
||||||
|
mode == POPULATE_SHALLOW) {
|
||||||
|
address = (address + P4D_SIZE) & P4D_MASK;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
p4_dir = p4d_offset(pg_dir, address);
|
p4_dir = p4d_offset(pg_dir, address);
|
||||||
if (p4d_none(*p4_dir)) {
|
if (p4d_none(*p4_dir)) {
|
||||||
if (mode == POPULATE_ZERO_SHADOW &&
|
if (mode == POPULATE_ZERO_SHADOW &&
|
||||||
|
@ -130,6 +137,12 @@ static void __init kasan_early_vmemmap_populate(unsigned long address,
|
||||||
p4d_populate(&init_mm, p4_dir, pu_dir);
|
p4d_populate(&init_mm, p4_dir, pu_dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!IS_ENABLED(CONFIG_KASAN_S390_4_LEVEL_PAGING) &&
|
||||||
|
mode == POPULATE_SHALLOW) {
|
||||||
|
address = (address + PUD_SIZE) & PUD_MASK;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
pu_dir = pud_offset(p4_dir, address);
|
pu_dir = pud_offset(p4_dir, address);
|
||||||
if (pud_none(*pu_dir)) {
|
if (pud_none(*pu_dir)) {
|
||||||
if (mode == POPULATE_ZERO_SHADOW &&
|
if (mode == POPULATE_ZERO_SHADOW &&
|
||||||
|
@ -195,6 +208,9 @@ static void __init kasan_early_vmemmap_populate(unsigned long address,
|
||||||
page = kasan_early_shadow_page;
|
page = kasan_early_shadow_page;
|
||||||
pte_val(*pt_dir) = __pa(page) | pgt_prot_zero;
|
pte_val(*pt_dir) = __pa(page) | pgt_prot_zero;
|
||||||
break;
|
break;
|
||||||
|
case POPULATE_SHALLOW:
|
||||||
|
/* should never happen */
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
address += PAGE_SIZE;
|
address += PAGE_SIZE;
|
||||||
|
@ -315,20 +331,48 @@ void __init kasan_early_init(void)
|
||||||
* Current memory layout:
|
* Current memory layout:
|
||||||
* +- 0 -------------+ +- shadow start -+
|
* +- 0 -------------+ +- shadow start -+
|
||||||
* | 1:1 ram mapping | /| 1/8 ram |
|
* | 1:1 ram mapping | /| 1/8 ram |
|
||||||
|
* | | / | |
|
||||||
* +- end of ram ----+ / +----------------+
|
* +- end of ram ----+ / +----------------+
|
||||||
* | ... gap ... |/ | kasan |
|
* | ... gap ... | / | |
|
||||||
|
* | |/ | kasan |
|
||||||
* +- shadow start --+ | zero |
|
* +- shadow start --+ | zero |
|
||||||
* | 1/8 addr space | | page |
|
* | 1/8 addr space | | page |
|
||||||
* +- shadow end -+ | mapping |
|
* +- shadow end -+ | mapping |
|
||||||
* | ... gap ... |\ | (untracked) |
|
* | ... gap ... |\ | (untracked) |
|
||||||
|
* +- vmalloc area -+ \ | |
|
||||||
|
* | vmalloc_size | \ | |
|
||||||
* +- modules vaddr -+ \ +----------------+
|
* +- modules vaddr -+ \ +----------------+
|
||||||
* | 2Gb | \| unmapped | allocated per module
|
* | 2Gb | \| unmapped | allocated per module
|
||||||
* +-----------------+ +- shadow end ---+
|
* +-----------------+ +- shadow end ---+
|
||||||
|
*
|
||||||
|
* Current memory layout (KASAN_VMALLOC):
|
||||||
|
* +- 0 -------------+ +- shadow start -+
|
||||||
|
* | 1:1 ram mapping | /| 1/8 ram |
|
||||||
|
* | | / | |
|
||||||
|
* +- end of ram ----+ / +----------------+
|
||||||
|
* | ... gap ... | / | kasan |
|
||||||
|
* | |/ | zero |
|
||||||
|
* +- shadow start --+ | page |
|
||||||
|
* | 1/8 addr space | | mapping |
|
||||||
|
* +- shadow end -+ | (untracked) |
|
||||||
|
* | ... gap ... |\ | |
|
||||||
|
* +- vmalloc area -+ \ +- vmalloc area -+
|
||||||
|
* | vmalloc_size | \ |shallow populate|
|
||||||
|
* +- modules vaddr -+ \ +- modules area -+
|
||||||
|
* | 2Gb | \|shallow populate|
|
||||||
|
* +-----------------+ +- shadow end ---+
|
||||||
*/
|
*/
|
||||||
/* populate kasan shadow (for identity mapping and zero page mapping) */
|
/* populate kasan shadow (for identity mapping and zero page mapping) */
|
||||||
kasan_early_vmemmap_populate(__sha(0), __sha(memsize), POPULATE_MAP);
|
kasan_early_vmemmap_populate(__sha(0), __sha(memsize), POPULATE_MAP);
|
||||||
if (IS_ENABLED(CONFIG_MODULES))
|
if (IS_ENABLED(CONFIG_MODULES))
|
||||||
untracked_mem_end = vmax - MODULES_LEN;
|
untracked_mem_end = vmax - MODULES_LEN;
|
||||||
|
if (IS_ENABLED(CONFIG_KASAN_VMALLOC)) {
|
||||||
|
untracked_mem_end = vmax - vmalloc_size - MODULES_LEN;
|
||||||
|
/* shallowly populate kasan shadow for vmalloc and modules */
|
||||||
|
kasan_early_vmemmap_populate(__sha(untracked_mem_end),
|
||||||
|
__sha(vmax), POPULATE_SHALLOW);
|
||||||
|
}
|
||||||
|
/* populate kasan shadow for untracked memory */
|
||||||
kasan_early_vmemmap_populate(__sha(max_physmem_end),
|
kasan_early_vmemmap_populate(__sha(max_physmem_end),
|
||||||
__sha(untracked_mem_end),
|
__sha(untracked_mem_end),
|
||||||
POPULATE_ZERO_SHADOW);
|
POPULATE_ZERO_SHADOW);
|
||||||
|
|
|
@ -325,9 +325,9 @@ int __init sh_early_platform_driver_probe(char *class_str,
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* sh_early_platform_cleanup - clean up early platform code
|
* early_platform_cleanup - clean up early platform code
|
||||||
*/
|
*/
|
||||||
static int __init sh_early_platform_cleanup(void)
|
void __init early_platform_cleanup(void)
|
||||||
{
|
{
|
||||||
struct platform_device *pd, *pd2;
|
struct platform_device *pd, *pd2;
|
||||||
|
|
||||||
|
@ -337,11 +337,4 @@ static int __init sh_early_platform_cleanup(void)
|
||||||
list_del(&pd->dev.devres_head);
|
list_del(&pd->dev.devres_head);
|
||||||
memset(&pd->dev.devres_head, 0, sizeof(pd->dev.devres_head));
|
memset(&pd->dev.devres_head, 0, sizeof(pd->dev.devres_head));
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
* This must happen once after all early devices are probed but before probing
|
|
||||||
* real platform devices.
|
|
||||||
*/
|
|
||||||
subsys_initcall(sh_early_platform_cleanup);
|
|
||||||
|
|
|
@ -266,6 +266,7 @@ int kgdb_arch_handle_exception(int e_vector, int signo, int err_code,
|
||||||
ptr = &remcomInBuffer[1];
|
ptr = &remcomInBuffer[1];
|
||||||
if (kgdb_hex2long(&ptr, &addr))
|
if (kgdb_hex2long(&ptr, &addr))
|
||||||
linux_regs->pc = addr;
|
linux_regs->pc = addr;
|
||||||
|
/* fallthrough */
|
||||||
case 'D':
|
case 'D':
|
||||||
case 'k':
|
case 'k':
|
||||||
atomic_set(&kgdb_cpu_doing_single_step, -1);
|
atomic_set(&kgdb_cpu_doing_single_step, -1);
|
||||||
|
|
|
@ -180,19 +180,19 @@ do { \
|
||||||
|
|
||||||
#define emit_loadptr(BASE, STRUCT, FIELD, DEST) \
|
#define emit_loadptr(BASE, STRUCT, FIELD, DEST) \
|
||||||
do { unsigned int _off = offsetof(STRUCT, FIELD); \
|
do { unsigned int _off = offsetof(STRUCT, FIELD); \
|
||||||
BUILD_BUG_ON(FIELD_SIZEOF(STRUCT, FIELD) != sizeof(void *)); \
|
BUILD_BUG_ON(sizeof_field(STRUCT, FIELD) != sizeof(void *)); \
|
||||||
*prog++ = LDPTRI | RS1(BASE) | S13(_off) | RD(DEST); \
|
*prog++ = LDPTRI | RS1(BASE) | S13(_off) | RD(DEST); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define emit_load32(BASE, STRUCT, FIELD, DEST) \
|
#define emit_load32(BASE, STRUCT, FIELD, DEST) \
|
||||||
do { unsigned int _off = offsetof(STRUCT, FIELD); \
|
do { unsigned int _off = offsetof(STRUCT, FIELD); \
|
||||||
BUILD_BUG_ON(FIELD_SIZEOF(STRUCT, FIELD) != sizeof(u32)); \
|
BUILD_BUG_ON(sizeof_field(STRUCT, FIELD) != sizeof(u32)); \
|
||||||
*prog++ = LD32I | RS1(BASE) | S13(_off) | RD(DEST); \
|
*prog++ = LD32I | RS1(BASE) | S13(_off) | RD(DEST); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define emit_load16(BASE, STRUCT, FIELD, DEST) \
|
#define emit_load16(BASE, STRUCT, FIELD, DEST) \
|
||||||
do { unsigned int _off = offsetof(STRUCT, FIELD); \
|
do { unsigned int _off = offsetof(STRUCT, FIELD); \
|
||||||
BUILD_BUG_ON(FIELD_SIZEOF(STRUCT, FIELD) != sizeof(u16)); \
|
BUILD_BUG_ON(sizeof_field(STRUCT, FIELD) != sizeof(u16)); \
|
||||||
*prog++ = LD16I | RS1(BASE) | S13(_off) | RD(DEST); \
|
*prog++ = LD16I | RS1(BASE) | S13(_off) | RD(DEST); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
@ -202,7 +202,7 @@ do { unsigned int _off = offsetof(STRUCT, FIELD); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define emit_load8(BASE, STRUCT, FIELD, DEST) \
|
#define emit_load8(BASE, STRUCT, FIELD, DEST) \
|
||||||
do { BUILD_BUG_ON(FIELD_SIZEOF(STRUCT, FIELD) != sizeof(u8)); \
|
do { BUILD_BUG_ON(sizeof_field(STRUCT, FIELD) != sizeof(u8)); \
|
||||||
__emit_load8(BASE, STRUCT, FIELD, DEST); \
|
__emit_load8(BASE, STRUCT, FIELD, DEST); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
|
|
@ -259,7 +259,7 @@ static void __init setup_xstate_features(void)
|
||||||
xmm_space);
|
xmm_space);
|
||||||
|
|
||||||
xstate_offsets[XFEATURE_SSE] = xstate_sizes[XFEATURE_FP];
|
xstate_offsets[XFEATURE_SSE] = xstate_sizes[XFEATURE_FP];
|
||||||
xstate_sizes[XFEATURE_SSE] = FIELD_SIZEOF(struct fxregs_state,
|
xstate_sizes[XFEATURE_SSE] = sizeof_field(struct fxregs_state,
|
||||||
xmm_space);
|
xmm_space);
|
||||||
|
|
||||||
for (i = FIRST_EXTENDED_XFEATURE; i < XFEATURE_MAX; i++) {
|
for (i = FIRST_EXTENDED_XFEATURE; i < XFEATURE_MAX; i++) {
|
||||||
|
|
|
@ -1042,20 +1042,6 @@ void prepare_ftrace_return(unsigned long self_addr, unsigned long *parent,
|
||||||
if (unlikely(atomic_read(¤t->tracing_graph_pause)))
|
if (unlikely(atomic_read(¤t->tracing_graph_pause)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/*
|
|
||||||
* If the return location is actually pointing directly to
|
|
||||||
* the start of a direct trampoline (if we trace the trampoline
|
|
||||||
* it will still be offset by MCOUNT_INSN_SIZE), then the
|
|
||||||
* return address is actually off by one word, and we
|
|
||||||
* need to adjust for that.
|
|
||||||
*/
|
|
||||||
if (ftrace_direct_func_count) {
|
|
||||||
if (ftrace_find_direct_func(self_addr + MCOUNT_INSN_SIZE)) {
|
|
||||||
self_addr = *parent;
|
|
||||||
parent++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Protect against fault, even if it shouldn't
|
* Protect against fault, even if it shouldn't
|
||||||
* happen. This tool is too much intrusive to
|
* happen. This tool is too much intrusive to
|
||||||
|
|
|
@ -754,10 +754,12 @@ bool __bio_try_merge_page(struct bio *bio, struct page *page,
|
||||||
if (WARN_ON_ONCE(bio_flagged(bio, BIO_CLONED)))
|
if (WARN_ON_ONCE(bio_flagged(bio, BIO_CLONED)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (bio->bi_vcnt > 0 && !bio_full(bio, len)) {
|
if (bio->bi_vcnt > 0) {
|
||||||
struct bio_vec *bv = &bio->bi_io_vec[bio->bi_vcnt - 1];
|
struct bio_vec *bv = &bio->bi_io_vec[bio->bi_vcnt - 1];
|
||||||
|
|
||||||
if (page_is_mergeable(bv, page, len, off, same_page)) {
|
if (page_is_mergeable(bv, page, len, off, same_page)) {
|
||||||
|
if (bio->bi_iter.bi_size > UINT_MAX - len)
|
||||||
|
return false;
|
||||||
bv->bv_len += len;
|
bv->bv_len += len;
|
||||||
bio->bi_iter.bi_size += len;
|
bio->bi_iter.bi_size += len;
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -1061,26 +1061,6 @@ err_unlock:
|
||||||
return PTR_ERR(blkg);
|
return PTR_ERR(blkg);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* blkcg_drain_queue - drain blkcg part of request_queue
|
|
||||||
* @q: request_queue to drain
|
|
||||||
*
|
|
||||||
* Called from blk_drain_queue(). Responsible for draining blkcg part.
|
|
||||||
*/
|
|
||||||
void blkcg_drain_queue(struct request_queue *q)
|
|
||||||
{
|
|
||||||
lockdep_assert_held(&q->queue_lock);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @q could be exiting and already have destroyed all blkgs as
|
|
||||||
* indicated by NULL root_blkg. If so, don't confuse policies.
|
|
||||||
*/
|
|
||||||
if (!q->root_blkg)
|
|
||||||
return;
|
|
||||||
|
|
||||||
blk_throtl_drain(q);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* blkcg_exit_queue - exit and release blkcg part of request_queue
|
* blkcg_exit_queue - exit and release blkcg part of request_queue
|
||||||
* @q: request_queue being released
|
* @q: request_queue being released
|
||||||
|
|
|
@ -1310,7 +1310,7 @@ EXPORT_SYMBOL_GPL(blk_rq_err_bytes);
|
||||||
|
|
||||||
void blk_account_io_completion(struct request *req, unsigned int bytes)
|
void blk_account_io_completion(struct request *req, unsigned int bytes)
|
||||||
{
|
{
|
||||||
if (blk_do_io_stat(req)) {
|
if (req->part && blk_do_io_stat(req)) {
|
||||||
const int sgrp = op_stat_group(req_op(req));
|
const int sgrp = op_stat_group(req_op(req));
|
||||||
struct hd_struct *part;
|
struct hd_struct *part;
|
||||||
|
|
||||||
|
@ -1328,7 +1328,8 @@ void blk_account_io_done(struct request *req, u64 now)
|
||||||
* normal IO on queueing nor completion. Accounting the
|
* normal IO on queueing nor completion. Accounting the
|
||||||
* containing request is enough.
|
* containing request is enough.
|
||||||
*/
|
*/
|
||||||
if (blk_do_io_stat(req) && !(req->rq_flags & RQF_FLUSH_SEQ)) {
|
if (req->part && blk_do_io_stat(req) &&
|
||||||
|
!(req->rq_flags & RQF_FLUSH_SEQ)) {
|
||||||
const int sgrp = op_stat_group(req_op(req));
|
const int sgrp = op_stat_group(req_op(req));
|
||||||
struct hd_struct *part;
|
struct hd_struct *part;
|
||||||
|
|
||||||
|
@ -1792,9 +1793,9 @@ int __init blk_dev_init(void)
|
||||||
{
|
{
|
||||||
BUILD_BUG_ON(REQ_OP_LAST >= (1 << REQ_OP_BITS));
|
BUILD_BUG_ON(REQ_OP_LAST >= (1 << REQ_OP_BITS));
|
||||||
BUILD_BUG_ON(REQ_OP_BITS + REQ_FLAG_BITS > 8 *
|
BUILD_BUG_ON(REQ_OP_BITS + REQ_FLAG_BITS > 8 *
|
||||||
FIELD_SIZEOF(struct request, cmd_flags));
|
sizeof_field(struct request, cmd_flags));
|
||||||
BUILD_BUG_ON(REQ_OP_BITS + REQ_FLAG_BITS > 8 *
|
BUILD_BUG_ON(REQ_OP_BITS + REQ_FLAG_BITS > 8 *
|
||||||
FIELD_SIZEOF(struct bio, bi_opf));
|
sizeof_field(struct bio, bi_opf));
|
||||||
|
|
||||||
/* used for unplugging and affects IO latency/throughput - HIGHPRI */
|
/* used for unplugging and affects IO latency/throughput - HIGHPRI */
|
||||||
kblockd_workqueue = alloc_workqueue("kblockd",
|
kblockd_workqueue = alloc_workqueue("kblockd",
|
||||||
|
|
|
@ -436,10 +436,10 @@ static int adiantum_init_tfm(struct crypto_skcipher *tfm)
|
||||||
|
|
||||||
BUILD_BUG_ON(offsetofend(struct adiantum_request_ctx, u) !=
|
BUILD_BUG_ON(offsetofend(struct adiantum_request_ctx, u) !=
|
||||||
sizeof(struct adiantum_request_ctx));
|
sizeof(struct adiantum_request_ctx));
|
||||||
subreq_size = max(FIELD_SIZEOF(struct adiantum_request_ctx,
|
subreq_size = max(sizeof_field(struct adiantum_request_ctx,
|
||||||
u.hash_desc) +
|
u.hash_desc) +
|
||||||
crypto_shash_descsize(hash),
|
crypto_shash_descsize(hash),
|
||||||
FIELD_SIZEOF(struct adiantum_request_ctx,
|
sizeof_field(struct adiantum_request_ctx,
|
||||||
u.streamcipher_req) +
|
u.streamcipher_req) +
|
||||||
crypto_skcipher_reqsize(streamcipher));
|
crypto_skcipher_reqsize(streamcipher));
|
||||||
|
|
||||||
|
|
|
@ -347,7 +347,7 @@ static int essiv_aead_init_tfm(struct crypto_aead *tfm)
|
||||||
if (IS_ERR(aead))
|
if (IS_ERR(aead))
|
||||||
return PTR_ERR(aead);
|
return PTR_ERR(aead);
|
||||||
|
|
||||||
subreq_size = FIELD_SIZEOF(struct essiv_aead_request_ctx, aead_req) +
|
subreq_size = sizeof_field(struct essiv_aead_request_ctx, aead_req) +
|
||||||
crypto_aead_reqsize(aead);
|
crypto_aead_reqsize(aead);
|
||||||
|
|
||||||
tctx->ivoffset = offsetof(struct essiv_aead_request_ctx, aead_req) +
|
tctx->ivoffset = offsetof(struct essiv_aead_request_ctx, aead_req) +
|
||||||
|
|
|
@ -1314,9 +1314,19 @@ static void acpi_dev_pm_detach(struct device *dev, bool power_off)
|
||||||
*/
|
*/
|
||||||
int acpi_dev_pm_attach(struct device *dev, bool power_on)
|
int acpi_dev_pm_attach(struct device *dev, bool power_on)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
* Skip devices whose ACPI companions match the device IDs below,
|
||||||
|
* because they require special power management handling incompatible
|
||||||
|
* with the generic ACPI PM domain.
|
||||||
|
*/
|
||||||
|
static const struct acpi_device_id special_pm_ids[] = {
|
||||||
|
{"PNP0C0B", }, /* Generic ACPI fan */
|
||||||
|
{"INT3404", }, /* Fan */
|
||||||
|
{}
|
||||||
|
};
|
||||||
struct acpi_device *adev = ACPI_COMPANION(dev);
|
struct acpi_device *adev = ACPI_COMPANION(dev);
|
||||||
|
|
||||||
if (!adev)
|
if (!adev || !acpi_match_device_ids(adev, special_pm_ids))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -3310,7 +3310,7 @@ static void binder_transaction(struct binder_proc *proc,
|
||||||
binder_size_t parent_offset;
|
binder_size_t parent_offset;
|
||||||
struct binder_fd_array_object *fda =
|
struct binder_fd_array_object *fda =
|
||||||
to_binder_fd_array_object(hdr);
|
to_binder_fd_array_object(hdr);
|
||||||
size_t num_valid = (buffer_offset - off_start_offset) *
|
size_t num_valid = (buffer_offset - off_start_offset) /
|
||||||
sizeof(binder_size_t);
|
sizeof(binder_size_t);
|
||||||
struct binder_buffer_object *parent =
|
struct binder_buffer_object *parent =
|
||||||
binder_validate_ptr(target_proc, t->buffer,
|
binder_validate_ptr(target_proc, t->buffer,
|
||||||
|
@ -3384,7 +3384,7 @@ static void binder_transaction(struct binder_proc *proc,
|
||||||
t->buffer->user_data + sg_buf_offset;
|
t->buffer->user_data + sg_buf_offset;
|
||||||
sg_buf_offset += ALIGN(bp->length, sizeof(u64));
|
sg_buf_offset += ALIGN(bp->length, sizeof(u64));
|
||||||
|
|
||||||
num_valid = (buffer_offset - off_start_offset) *
|
num_valid = (buffer_offset - off_start_offset) /
|
||||||
sizeof(binder_size_t);
|
sizeof(binder_size_t);
|
||||||
ret = binder_fixup_parent(t, thread, bp,
|
ret = binder_fixup_parent(t, thread, bp,
|
||||||
off_start_offset,
|
off_start_offset,
|
||||||
|
|
|
@ -359,7 +359,7 @@ static int handle_remove(const char *nodename, struct device *dev)
|
||||||
* If configured, or requested by the commandline, devtmpfs will be
|
* If configured, or requested by the commandline, devtmpfs will be
|
||||||
* auto-mounted after the kernel mounted the root filesystem.
|
* auto-mounted after the kernel mounted the root filesystem.
|
||||||
*/
|
*/
|
||||||
int devtmpfs_mount(const char *mntdir)
|
int devtmpfs_mount(void)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
@ -369,7 +369,7 @@ int devtmpfs_mount(const char *mntdir)
|
||||||
if (!thread)
|
if (!thread)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err = ksys_mount("devtmpfs", mntdir, "devtmpfs", MS_SILENT, NULL);
|
err = do_mount("devtmpfs", "dev", "devtmpfs", MS_SILENT, NULL);
|
||||||
if (err)
|
if (err)
|
||||||
printk(KERN_INFO "devtmpfs: error mounting %i\n", err);
|
printk(KERN_INFO "devtmpfs: error mounting %i\n", err);
|
||||||
else
|
else
|
||||||
|
@ -394,7 +394,7 @@ static int devtmpfsd(void *p)
|
||||||
*err = ksys_unshare(CLONE_NEWNS);
|
*err = ksys_unshare(CLONE_NEWNS);
|
||||||
if (*err)
|
if (*err)
|
||||||
goto out;
|
goto out;
|
||||||
*err = ksys_mount("devtmpfs", "/", "devtmpfs", MS_SILENT, NULL);
|
*err = do_mount("devtmpfs", "/", "devtmpfs", MS_SILENT, NULL);
|
||||||
if (*err)
|
if (*err)
|
||||||
goto out;
|
goto out;
|
||||||
ksys_chdir("/.."); /* will traverse into overmounted root */
|
ksys_chdir("/.."); /* will traverse into overmounted root */
|
||||||
|
|
|
@ -1325,10 +1325,14 @@ struct device *platform_find_device_by_driver(struct device *start,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(platform_find_device_by_driver);
|
EXPORT_SYMBOL_GPL(platform_find_device_by_driver);
|
||||||
|
|
||||||
|
void __weak __init early_platform_cleanup(void) { }
|
||||||
|
|
||||||
int __init platform_bus_init(void)
|
int __init platform_bus_init(void)
|
||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
|
early_platform_cleanup();
|
||||||
|
|
||||||
error = device_register(&platform_bus);
|
error = device_register(&platform_bus);
|
||||||
if (error) {
|
if (error) {
|
||||||
put_device(&platform_bus);
|
put_device(&platform_bus);
|
||||||
|
|
|
@ -171,6 +171,15 @@ static struct xen_blkif *xen_blkif_alloc(domid_t domid)
|
||||||
blkif->domid = domid;
|
blkif->domid = domid;
|
||||||
atomic_set(&blkif->refcnt, 1);
|
atomic_set(&blkif->refcnt, 1);
|
||||||
init_completion(&blkif->drain_complete);
|
init_completion(&blkif->drain_complete);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Because freeing back to the cache may be deferred, it is not
|
||||||
|
* safe to unload the module (and hence destroy the cache) until
|
||||||
|
* this has completed. To prevent premature unloading, take an
|
||||||
|
* extra module reference here and release only when the object
|
||||||
|
* has been freed back to the cache.
|
||||||
|
*/
|
||||||
|
__module_get(THIS_MODULE);
|
||||||
INIT_WORK(&blkif->free_work, xen_blkif_deferred_free);
|
INIT_WORK(&blkif->free_work, xen_blkif_deferred_free);
|
||||||
|
|
||||||
return blkif;
|
return blkif;
|
||||||
|
@ -320,6 +329,7 @@ static void xen_blkif_free(struct xen_blkif *blkif)
|
||||||
|
|
||||||
/* Make sure everything is drained before shutting down */
|
/* Make sure everything is drained before shutting down */
|
||||||
kmem_cache_free(xen_blkif_cachep, blkif);
|
kmem_cache_free(xen_blkif_cachep, blkif);
|
||||||
|
module_put(THIS_MODULE);
|
||||||
}
|
}
|
||||||
|
|
||||||
int __init xen_blkif_interface_init(void)
|
int __init xen_blkif_interface_init(void)
|
||||||
|
|
|
@ -53,6 +53,8 @@
|
||||||
#define APMU_DISP1 0x110
|
#define APMU_DISP1 0x110
|
||||||
#define APMU_CCIC0 0x50
|
#define APMU_CCIC0 0x50
|
||||||
#define APMU_CCIC1 0xf4
|
#define APMU_CCIC1 0xf4
|
||||||
|
#define APMU_USBHSIC0 0xf8
|
||||||
|
#define APMU_USBHSIC1 0xfc
|
||||||
#define MPMU_UART_PLL 0x14
|
#define MPMU_UART_PLL 0x14
|
||||||
|
|
||||||
struct mmp2_clk_unit {
|
struct mmp2_clk_unit {
|
||||||
|
@ -194,6 +196,8 @@ static struct mmp_clk_mix_config sdh_mix_config = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static DEFINE_SPINLOCK(usb_lock);
|
static DEFINE_SPINLOCK(usb_lock);
|
||||||
|
static DEFINE_SPINLOCK(usbhsic0_lock);
|
||||||
|
static DEFINE_SPINLOCK(usbhsic1_lock);
|
||||||
|
|
||||||
static DEFINE_SPINLOCK(disp0_lock);
|
static DEFINE_SPINLOCK(disp0_lock);
|
||||||
static DEFINE_SPINLOCK(disp1_lock);
|
static DEFINE_SPINLOCK(disp1_lock);
|
||||||
|
@ -224,6 +228,8 @@ static struct mmp_param_div_clk apmu_div_clks[] = {
|
||||||
|
|
||||||
static struct mmp_param_gate_clk apmu_gate_clks[] = {
|
static struct mmp_param_gate_clk apmu_gate_clks[] = {
|
||||||
{MMP2_CLK_USB, "usb_clk", "usb_pll", 0, APMU_USB, 0x9, 0x9, 0x0, 0, &usb_lock},
|
{MMP2_CLK_USB, "usb_clk", "usb_pll", 0, APMU_USB, 0x9, 0x9, 0x0, 0, &usb_lock},
|
||||||
|
{MMP2_CLK_USBHSIC0, "usbhsic0_clk", "usb_pll", 0, APMU_USBHSIC0, 0x1b, 0x1b, 0x0, 0, &usbhsic0_lock},
|
||||||
|
{MMP2_CLK_USBHSIC1, "usbhsic1_clk", "usb_pll", 0, APMU_USBHSIC1, 0x1b, 0x1b, 0x0, 0, &usbhsic1_lock},
|
||||||
/* The gate clocks has mux parent. */
|
/* The gate clocks has mux parent. */
|
||||||
{MMP2_CLK_SDH0, "sdh0_clk", "sdh_mix_clk", CLK_SET_RATE_PARENT, APMU_SDH0, 0x1b, 0x1b, 0x0, 0, &sdh_lock},
|
{MMP2_CLK_SDH0, "sdh0_clk", "sdh_mix_clk", CLK_SET_RATE_PARENT, APMU_SDH0, 0x1b, 0x1b, 0x0, 0, &sdh_lock},
|
||||||
{MMP2_CLK_SDH1, "sdh1_clk", "sdh_mix_clk", CLK_SET_RATE_PARENT, APMU_SDH1, 0x1b, 0x1b, 0x0, 0, &sdh_lock},
|
{MMP2_CLK_SDH1, "sdh1_clk", "sdh_mix_clk", CLK_SET_RATE_PARENT, APMU_SDH1, 0x1b, 0x1b, 0x0, 0, &sdh_lock},
|
||||||
|
|
|
@ -381,7 +381,8 @@ u64 cpuidle_poll_time(struct cpuidle_driver *drv,
|
||||||
if (dev->states_usage[i].disable)
|
if (dev->states_usage[i].disable)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
limit_ns = (u64)drv->states[i].target_residency_ns;
|
limit_ns = drv->states[i].target_residency_ns;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
dev->poll_limit_ns = limit_ns;
|
dev->poll_limit_ns = limit_ns;
|
||||||
|
|
|
@ -403,6 +403,13 @@ void cpuidle_driver_state_disabled(struct cpuidle_driver *drv, int idx,
|
||||||
|
|
||||||
mutex_lock(&cpuidle_lock);
|
mutex_lock(&cpuidle_lock);
|
||||||
|
|
||||||
|
spin_lock(&cpuidle_driver_lock);
|
||||||
|
|
||||||
|
if (!drv->cpumask) {
|
||||||
|
drv->states[idx].flags |= CPUIDLE_FLAG_UNUSABLE;
|
||||||
|
goto unlock;
|
||||||
|
}
|
||||||
|
|
||||||
for_each_cpu(cpu, drv->cpumask) {
|
for_each_cpu(cpu, drv->cpumask) {
|
||||||
struct cpuidle_device *dev = per_cpu(cpuidle_devices, cpu);
|
struct cpuidle_device *dev = per_cpu(cpuidle_devices, cpu);
|
||||||
|
|
||||||
|
@ -415,5 +422,8 @@ void cpuidle_driver_state_disabled(struct cpuidle_driver *drv, int idx,
|
||||||
dev->states_usage[idx].disable &= ~CPUIDLE_STATE_DISABLED_BY_DRIVER;
|
dev->states_usage[idx].disable &= ~CPUIDLE_STATE_DISABLED_BY_DRIVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unlock:
|
||||||
|
spin_unlock(&cpuidle_driver_lock);
|
||||||
|
|
||||||
mutex_unlock(&cpuidle_lock);
|
mutex_unlock(&cpuidle_lock);
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,11 +24,14 @@
|
||||||
#include <linux/printk.h>
|
#include <linux/printk.h>
|
||||||
#include <linux/hrtimer.h>
|
#include <linux/hrtimer.h>
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
|
#include <linux/pm_qos.h>
|
||||||
#include "governor.h"
|
#include "governor.h"
|
||||||
|
|
||||||
#define CREATE_TRACE_POINTS
|
#define CREATE_TRACE_POINTS
|
||||||
#include <trace/events/devfreq.h>
|
#include <trace/events/devfreq.h>
|
||||||
|
|
||||||
|
#define HZ_PER_KHZ 1000
|
||||||
|
|
||||||
static struct class *devfreq_class;
|
static struct class *devfreq_class;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -98,6 +101,54 @@ static unsigned long find_available_max_freq(struct devfreq *devfreq)
|
||||||
return max_freq;
|
return max_freq;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get_freq_range() - Get the current freq range
|
||||||
|
* @devfreq: the devfreq instance
|
||||||
|
* @min_freq: the min frequency
|
||||||
|
* @max_freq: the max frequency
|
||||||
|
*
|
||||||
|
* This takes into consideration all constraints.
|
||||||
|
*/
|
||||||
|
static void get_freq_range(struct devfreq *devfreq,
|
||||||
|
unsigned long *min_freq,
|
||||||
|
unsigned long *max_freq)
|
||||||
|
{
|
||||||
|
unsigned long *freq_table = devfreq->profile->freq_table;
|
||||||
|
s32 qos_min_freq, qos_max_freq;
|
||||||
|
|
||||||
|
lockdep_assert_held(&devfreq->lock);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initialize minimum/maximum frequency from freq table.
|
||||||
|
* The devfreq drivers can initialize this in either ascending or
|
||||||
|
* descending order and devfreq core supports both.
|
||||||
|
*/
|
||||||
|
if (freq_table[0] < freq_table[devfreq->profile->max_state - 1]) {
|
||||||
|
*min_freq = freq_table[0];
|
||||||
|
*max_freq = freq_table[devfreq->profile->max_state - 1];
|
||||||
|
} else {
|
||||||
|
*min_freq = freq_table[devfreq->profile->max_state - 1];
|
||||||
|
*max_freq = freq_table[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Apply constraints from PM QoS */
|
||||||
|
qos_min_freq = dev_pm_qos_read_value(devfreq->dev.parent,
|
||||||
|
DEV_PM_QOS_MIN_FREQUENCY);
|
||||||
|
qos_max_freq = dev_pm_qos_read_value(devfreq->dev.parent,
|
||||||
|
DEV_PM_QOS_MAX_FREQUENCY);
|
||||||
|
*min_freq = max(*min_freq, (unsigned long)HZ_PER_KHZ * qos_min_freq);
|
||||||
|
if (qos_max_freq != PM_QOS_MAX_FREQUENCY_DEFAULT_VALUE)
|
||||||
|
*max_freq = min(*max_freq,
|
||||||
|
(unsigned long)HZ_PER_KHZ * qos_max_freq);
|
||||||
|
|
||||||
|
/* Apply constraints from OPP interface */
|
||||||
|
*min_freq = max(*min_freq, devfreq->scaling_min_freq);
|
||||||
|
*max_freq = min(*max_freq, devfreq->scaling_max_freq);
|
||||||
|
|
||||||
|
if (*min_freq > *max_freq)
|
||||||
|
*min_freq = *max_freq;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* devfreq_get_freq_level() - Lookup freq_table for the frequency
|
* devfreq_get_freq_level() - Lookup freq_table for the frequency
|
||||||
* @devfreq: the devfreq instance
|
* @devfreq: the devfreq instance
|
||||||
|
@ -351,16 +402,7 @@ int update_devfreq(struct devfreq *devfreq)
|
||||||
err = devfreq->governor->get_target_freq(devfreq, &freq);
|
err = devfreq->governor->get_target_freq(devfreq, &freq);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
get_freq_range(devfreq, &min_freq, &max_freq);
|
||||||
/*
|
|
||||||
* Adjust the frequency with user freq, QoS and available freq.
|
|
||||||
*
|
|
||||||
* List from the highest priority
|
|
||||||
* max_freq
|
|
||||||
* min_freq
|
|
||||||
*/
|
|
||||||
max_freq = min(devfreq->scaling_max_freq, devfreq->max_freq);
|
|
||||||
min_freq = max(devfreq->scaling_min_freq, devfreq->min_freq);
|
|
||||||
|
|
||||||
if (freq < min_freq) {
|
if (freq < min_freq) {
|
||||||
freq = min_freq;
|
freq = min_freq;
|
||||||
|
@ -568,26 +610,69 @@ static int devfreq_notifier_call(struct notifier_block *nb, unsigned long type,
|
||||||
void *devp)
|
void *devp)
|
||||||
{
|
{
|
||||||
struct devfreq *devfreq = container_of(nb, struct devfreq, nb);
|
struct devfreq *devfreq = container_of(nb, struct devfreq, nb);
|
||||||
int ret;
|
int err = -EINVAL;
|
||||||
|
|
||||||
mutex_lock(&devfreq->lock);
|
mutex_lock(&devfreq->lock);
|
||||||
|
|
||||||
devfreq->scaling_min_freq = find_available_min_freq(devfreq);
|
devfreq->scaling_min_freq = find_available_min_freq(devfreq);
|
||||||
if (!devfreq->scaling_min_freq) {
|
if (!devfreq->scaling_min_freq)
|
||||||
mutex_unlock(&devfreq->lock);
|
goto out;
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
devfreq->scaling_max_freq = find_available_max_freq(devfreq);
|
devfreq->scaling_max_freq = find_available_max_freq(devfreq);
|
||||||
if (!devfreq->scaling_max_freq) {
|
if (!devfreq->scaling_max_freq) {
|
||||||
mutex_unlock(&devfreq->lock);
|
devfreq->scaling_max_freq = ULONG_MAX;
|
||||||
return -EINVAL;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = update_devfreq(devfreq);
|
err = update_devfreq(devfreq);
|
||||||
mutex_unlock(&devfreq->lock);
|
|
||||||
|
|
||||||
return ret;
|
out:
|
||||||
|
mutex_unlock(&devfreq->lock);
|
||||||
|
if (err)
|
||||||
|
dev_err(devfreq->dev.parent,
|
||||||
|
"failed to update frequency from OPP notifier (%d)\n",
|
||||||
|
err);
|
||||||
|
|
||||||
|
return NOTIFY_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* qos_notifier_call() - Common handler for QoS constraints.
|
||||||
|
* @devfreq: the devfreq instance.
|
||||||
|
*/
|
||||||
|
static int qos_notifier_call(struct devfreq *devfreq)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
|
||||||
|
mutex_lock(&devfreq->lock);
|
||||||
|
err = update_devfreq(devfreq);
|
||||||
|
mutex_unlock(&devfreq->lock);
|
||||||
|
if (err)
|
||||||
|
dev_err(devfreq->dev.parent,
|
||||||
|
"failed to update frequency from PM QoS (%d)\n",
|
||||||
|
err);
|
||||||
|
|
||||||
|
return NOTIFY_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* qos_min_notifier_call() - Callback for QoS min_freq changes.
|
||||||
|
* @nb: Should be devfreq->nb_min
|
||||||
|
*/
|
||||||
|
static int qos_min_notifier_call(struct notifier_block *nb,
|
||||||
|
unsigned long val, void *ptr)
|
||||||
|
{
|
||||||
|
return qos_notifier_call(container_of(nb, struct devfreq, nb_min));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* qos_max_notifier_call() - Callback for QoS max_freq changes.
|
||||||
|
* @nb: Should be devfreq->nb_max
|
||||||
|
*/
|
||||||
|
static int qos_max_notifier_call(struct notifier_block *nb,
|
||||||
|
unsigned long val, void *ptr)
|
||||||
|
{
|
||||||
|
return qos_notifier_call(container_of(nb, struct devfreq, nb_max));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -599,16 +684,36 @@ static int devfreq_notifier_call(struct notifier_block *nb, unsigned long type,
|
||||||
static void devfreq_dev_release(struct device *dev)
|
static void devfreq_dev_release(struct device *dev)
|
||||||
{
|
{
|
||||||
struct devfreq *devfreq = to_devfreq(dev);
|
struct devfreq *devfreq = to_devfreq(dev);
|
||||||
|
int err;
|
||||||
|
|
||||||
mutex_lock(&devfreq_list_lock);
|
mutex_lock(&devfreq_list_lock);
|
||||||
if (IS_ERR(find_device_devfreq(devfreq->dev.parent))) {
|
|
||||||
mutex_unlock(&devfreq_list_lock);
|
|
||||||
dev_warn(&devfreq->dev, "releasing devfreq which doesn't exist\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
list_del(&devfreq->node);
|
list_del(&devfreq->node);
|
||||||
mutex_unlock(&devfreq_list_lock);
|
mutex_unlock(&devfreq_list_lock);
|
||||||
|
|
||||||
|
err = dev_pm_qos_remove_notifier(devfreq->dev.parent, &devfreq->nb_max,
|
||||||
|
DEV_PM_QOS_MAX_FREQUENCY);
|
||||||
|
if (err && err != -ENOENT)
|
||||||
|
dev_warn(dev->parent,
|
||||||
|
"Failed to remove max_freq notifier: %d\n", err);
|
||||||
|
err = dev_pm_qos_remove_notifier(devfreq->dev.parent, &devfreq->nb_min,
|
||||||
|
DEV_PM_QOS_MIN_FREQUENCY);
|
||||||
|
if (err && err != -ENOENT)
|
||||||
|
dev_warn(dev->parent,
|
||||||
|
"Failed to remove min_freq notifier: %d\n", err);
|
||||||
|
|
||||||
|
if (dev_pm_qos_request_active(&devfreq->user_max_freq_req)) {
|
||||||
|
err = dev_pm_qos_remove_request(&devfreq->user_max_freq_req);
|
||||||
|
if (err)
|
||||||
|
dev_warn(dev->parent,
|
||||||
|
"Failed to remove max_freq request: %d\n", err);
|
||||||
|
}
|
||||||
|
if (dev_pm_qos_request_active(&devfreq->user_min_freq_req)) {
|
||||||
|
err = dev_pm_qos_remove_request(&devfreq->user_min_freq_req);
|
||||||
|
if (err)
|
||||||
|
dev_warn(dev->parent,
|
||||||
|
"Failed to remove min_freq request: %d\n", err);
|
||||||
|
}
|
||||||
|
|
||||||
if (devfreq->profile->exit)
|
if (devfreq->profile->exit)
|
||||||
devfreq->profile->exit(devfreq->dev.parent);
|
devfreq->profile->exit(devfreq->dev.parent);
|
||||||
|
|
||||||
|
@ -660,6 +765,7 @@ struct devfreq *devfreq_add_device(struct device *dev,
|
||||||
devfreq->dev.parent = dev;
|
devfreq->dev.parent = dev;
|
||||||
devfreq->dev.class = devfreq_class;
|
devfreq->dev.class = devfreq_class;
|
||||||
devfreq->dev.release = devfreq_dev_release;
|
devfreq->dev.release = devfreq_dev_release;
|
||||||
|
INIT_LIST_HEAD(&devfreq->node);
|
||||||
devfreq->profile = profile;
|
devfreq->profile = profile;
|
||||||
strncpy(devfreq->governor_name, governor_name, DEVFREQ_NAME_LEN);
|
strncpy(devfreq->governor_name, governor_name, DEVFREQ_NAME_LEN);
|
||||||
devfreq->previous_freq = profile->initial_freq;
|
devfreq->previous_freq = profile->initial_freq;
|
||||||
|
@ -681,7 +787,6 @@ struct devfreq *devfreq_add_device(struct device *dev,
|
||||||
err = -EINVAL;
|
err = -EINVAL;
|
||||||
goto err_dev;
|
goto err_dev;
|
||||||
}
|
}
|
||||||
devfreq->min_freq = devfreq->scaling_min_freq;
|
|
||||||
|
|
||||||
devfreq->scaling_max_freq = find_available_max_freq(devfreq);
|
devfreq->scaling_max_freq = find_available_max_freq(devfreq);
|
||||||
if (!devfreq->scaling_max_freq) {
|
if (!devfreq->scaling_max_freq) {
|
||||||
|
@ -689,7 +794,6 @@ struct devfreq *devfreq_add_device(struct device *dev,
|
||||||
err = -EINVAL;
|
err = -EINVAL;
|
||||||
goto err_dev;
|
goto err_dev;
|
||||||
}
|
}
|
||||||
devfreq->max_freq = devfreq->scaling_max_freq;
|
|
||||||
|
|
||||||
devfreq->suspend_freq = dev_pm_opp_get_suspend_opp_freq(dev);
|
devfreq->suspend_freq = dev_pm_opp_get_suspend_opp_freq(dev);
|
||||||
atomic_set(&devfreq->suspend_count, 0);
|
atomic_set(&devfreq->suspend_count, 0);
|
||||||
|
@ -730,6 +834,28 @@ struct devfreq *devfreq_add_device(struct device *dev,
|
||||||
|
|
||||||
mutex_unlock(&devfreq->lock);
|
mutex_unlock(&devfreq->lock);
|
||||||
|
|
||||||
|
err = dev_pm_qos_add_request(dev, &devfreq->user_min_freq_req,
|
||||||
|
DEV_PM_QOS_MIN_FREQUENCY, 0);
|
||||||
|
if (err < 0)
|
||||||
|
goto err_devfreq;
|
||||||
|
err = dev_pm_qos_add_request(dev, &devfreq->user_max_freq_req,
|
||||||
|
DEV_PM_QOS_MAX_FREQUENCY,
|
||||||
|
PM_QOS_MAX_FREQUENCY_DEFAULT_VALUE);
|
||||||
|
if (err < 0)
|
||||||
|
goto err_devfreq;
|
||||||
|
|
||||||
|
devfreq->nb_min.notifier_call = qos_min_notifier_call;
|
||||||
|
err = dev_pm_qos_add_notifier(devfreq->dev.parent, &devfreq->nb_min,
|
||||||
|
DEV_PM_QOS_MIN_FREQUENCY);
|
||||||
|
if (err)
|
||||||
|
goto err_devfreq;
|
||||||
|
|
||||||
|
devfreq->nb_max.notifier_call = qos_max_notifier_call;
|
||||||
|
err = dev_pm_qos_add_notifier(devfreq->dev.parent, &devfreq->nb_max,
|
||||||
|
DEV_PM_QOS_MAX_FREQUENCY);
|
||||||
|
if (err)
|
||||||
|
goto err_devfreq;
|
||||||
|
|
||||||
mutex_lock(&devfreq_list_lock);
|
mutex_lock(&devfreq_list_lock);
|
||||||
|
|
||||||
governor = try_then_request_governor(devfreq->governor_name);
|
governor = try_then_request_governor(devfreq->governor_name);
|
||||||
|
@ -1303,41 +1429,37 @@ static ssize_t min_freq_store(struct device *dev, struct device_attribute *attr,
|
||||||
unsigned long value;
|
unsigned long value;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Protect against theoretical sysfs writes between
|
||||||
|
* device_add and dev_pm_qos_add_request
|
||||||
|
*/
|
||||||
|
if (!dev_pm_qos_request_active(&df->user_min_freq_req))
|
||||||
|
return -EAGAIN;
|
||||||
|
|
||||||
ret = sscanf(buf, "%lu", &value);
|
ret = sscanf(buf, "%lu", &value);
|
||||||
if (ret != 1)
|
if (ret != 1)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
mutex_lock(&df->lock);
|
/* Round down to kHz for PM QoS */
|
||||||
|
ret = dev_pm_qos_update_request(&df->user_min_freq_req,
|
||||||
if (value) {
|
value / HZ_PER_KHZ);
|
||||||
if (value > df->max_freq) {
|
if (ret < 0)
|
||||||
ret = -EINVAL;
|
|
||||||
goto unlock;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
unsigned long *freq_table = df->profile->freq_table;
|
|
||||||
|
|
||||||
/* Get minimum frequency according to sorting order */
|
|
||||||
if (freq_table[0] < freq_table[df->profile->max_state - 1])
|
|
||||||
value = freq_table[0];
|
|
||||||
else
|
|
||||||
value = freq_table[df->profile->max_state - 1];
|
|
||||||
}
|
|
||||||
|
|
||||||
df->min_freq = value;
|
|
||||||
update_devfreq(df);
|
|
||||||
ret = count;
|
|
||||||
unlock:
|
|
||||||
mutex_unlock(&df->lock);
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t min_freq_show(struct device *dev, struct device_attribute *attr,
|
static ssize_t min_freq_show(struct device *dev, struct device_attribute *attr,
|
||||||
char *buf)
|
char *buf)
|
||||||
{
|
{
|
||||||
struct devfreq *df = to_devfreq(dev);
|
struct devfreq *df = to_devfreq(dev);
|
||||||
|
unsigned long min_freq, max_freq;
|
||||||
|
|
||||||
return sprintf(buf, "%lu\n", max(df->scaling_min_freq, df->min_freq));
|
mutex_lock(&df->lock);
|
||||||
|
get_freq_range(df, &min_freq, &max_freq);
|
||||||
|
mutex_unlock(&df->lock);
|
||||||
|
|
||||||
|
return sprintf(buf, "%lu\n", min_freq);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t max_freq_store(struct device *dev, struct device_attribute *attr,
|
static ssize_t max_freq_store(struct device *dev, struct device_attribute *attr,
|
||||||
|
@ -1347,33 +1469,37 @@ static ssize_t max_freq_store(struct device *dev, struct device_attribute *attr,
|
||||||
unsigned long value;
|
unsigned long value;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Protect against theoretical sysfs writes between
|
||||||
|
* device_add and dev_pm_qos_add_request
|
||||||
|
*/
|
||||||
|
if (!dev_pm_qos_request_active(&df->user_max_freq_req))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
ret = sscanf(buf, "%lu", &value);
|
ret = sscanf(buf, "%lu", &value);
|
||||||
if (ret != 1)
|
if (ret != 1)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
mutex_lock(&df->lock);
|
/*
|
||||||
|
* PM QoS frequencies are in kHz so we need to convert. Convert by
|
||||||
if (value) {
|
* rounding upwards so that the acceptable interval never shrinks.
|
||||||
if (value < df->min_freq) {
|
*
|
||||||
ret = -EINVAL;
|
* For example if the user writes "666666666" to sysfs this value will
|
||||||
goto unlock;
|
* be converted to 666667 kHz and back to 666667000 Hz before an OPP
|
||||||
}
|
* lookup, this ensures that an OPP of 666666666Hz is still accepted.
|
||||||
} else {
|
*
|
||||||
unsigned long *freq_table = df->profile->freq_table;
|
* A value of zero means "no limit".
|
||||||
|
*/
|
||||||
/* Get maximum frequency according to sorting order */
|
if (value)
|
||||||
if (freq_table[0] < freq_table[df->profile->max_state - 1])
|
value = DIV_ROUND_UP(value, HZ_PER_KHZ);
|
||||||
value = freq_table[df->profile->max_state - 1];
|
|
||||||
else
|
else
|
||||||
value = freq_table[0];
|
value = PM_QOS_MAX_FREQUENCY_DEFAULT_VALUE;
|
||||||
}
|
|
||||||
|
|
||||||
df->max_freq = value;
|
ret = dev_pm_qos_update_request(&df->user_max_freq_req, value);
|
||||||
update_devfreq(df);
|
if (ret < 0)
|
||||||
ret = count;
|
|
||||||
unlock:
|
|
||||||
mutex_unlock(&df->lock);
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
return count;
|
||||||
}
|
}
|
||||||
static DEVICE_ATTR_RW(min_freq);
|
static DEVICE_ATTR_RW(min_freq);
|
||||||
|
|
||||||
|
@ -1381,8 +1507,13 @@ static ssize_t max_freq_show(struct device *dev, struct device_attribute *attr,
|
||||||
char *buf)
|
char *buf)
|
||||||
{
|
{
|
||||||
struct devfreq *df = to_devfreq(dev);
|
struct devfreq *df = to_devfreq(dev);
|
||||||
|
unsigned long min_freq, max_freq;
|
||||||
|
|
||||||
return sprintf(buf, "%lu\n", min(df->scaling_max_freq, df->max_freq));
|
mutex_lock(&df->lock);
|
||||||
|
get_freq_range(df, &min_freq, &max_freq);
|
||||||
|
mutex_unlock(&df->lock);
|
||||||
|
|
||||||
|
return sprintf(buf, "%lu\n", max_freq);
|
||||||
}
|
}
|
||||||
static DEVICE_ATTR_RW(max_freq);
|
static DEVICE_ATTR_RW(max_freq);
|
||||||
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue