Merge d0d642a5d3 ("Merge tag 'sound-fix-5.18-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound") into android-mainline
Steps on the way to 5.18-rc1 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I5f1abc34f93d7ae438ece408089b8e52d467ad94
This commit is contained in:
@@ -4431,6 +4431,12 @@
|
||||
fully seed the kernel's CRNG. Default is controlled
|
||||
by CONFIG_RANDOM_TRUST_CPU.
|
||||
|
||||
random.trust_bootloader={on,off}
|
||||
[KNL] Enable or disable trusting the use of a
|
||||
seed passed by the bootloader (if available) to
|
||||
fully seed the kernel's CRNG. Default is controlled
|
||||
by CONFIG_RANDOM_TRUST_BOOTLOADER.
|
||||
|
||||
randomize_kstack_offset=
|
||||
[KNL] Enable or disable kernel stack offset
|
||||
randomization, which provides roughly 5 bits of
|
||||
|
||||
@@ -658,7 +658,7 @@ when:
|
||||
|
||||
.. Links
|
||||
.. _Documentation/process/: https://www.kernel.org/doc/html/latest/process/
|
||||
.. _netdev-FAQ: ../networking/netdev-FAQ.rst
|
||||
.. _netdev-FAQ: Documentation/process/maintainer-netdev.rst
|
||||
.. _selftests:
|
||||
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/tools/testing/selftests/bpf/
|
||||
.. _Documentation/dev-tools/kselftest.rst:
|
||||
|
||||
@@ -26,10 +26,7 @@ The fundamental unit in KUnit is the test case. The KUnit test cases are
|
||||
grouped into KUnit suites. A KUnit test case is a function with type
|
||||
signature ``void (*)(struct kunit *test)``.
|
||||
These test case functions are wrapped in a struct called
|
||||
``struct kunit_case``. For code, see:
|
||||
|
||||
.. kernel-doc:: include/kunit/test.h
|
||||
:identifiers: kunit_case
|
||||
struct kunit_case.
|
||||
|
||||
.. note:
|
||||
``generate_params`` is optional for non-parameterized tests.
|
||||
@@ -152,18 +149,12 @@ Parameterized Tests
|
||||
Each KUnit parameterized test is associated with a collection of
|
||||
parameters. The test is invoked multiple times, once for each parameter
|
||||
value and the parameter is stored in the ``param_value`` field.
|
||||
The test case includes a ``KUNIT_CASE_PARAM()`` macro that accepts a
|
||||
The test case includes a KUNIT_CASE_PARAM() macro that accepts a
|
||||
generator function.
|
||||
The generator function is passed the previous parameter and returns the next
|
||||
parameter. It also provides a macro to generate common-case generators based on
|
||||
arrays.
|
||||
|
||||
For code, see:
|
||||
|
||||
.. kernel-doc:: include/kunit/test.h
|
||||
:identifiers: KUNIT_ARRAY_PARAM
|
||||
|
||||
|
||||
kunit_tool (Command Line Test Harness)
|
||||
======================================
|
||||
|
||||
|
||||
@@ -0,0 +1,122 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/dma/mediatek,uart-dma.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: MediaTek UART APDMA controller
|
||||
|
||||
maintainers:
|
||||
- Long Cheng <long.cheng@mediatek.com>
|
||||
|
||||
description: |
|
||||
The MediaTek UART APDMA controller provides DMA capabilities
|
||||
for the UART peripheral bus.
|
||||
|
||||
allOf:
|
||||
- $ref: "dma-controller.yaml#"
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
oneOf:
|
||||
- items:
|
||||
- enum:
|
||||
- mediatek,mt2712-uart-dma
|
||||
- mediatek,mt8516-uart-dma
|
||||
- const: mediatek,mt6577-uart-dma
|
||||
- enum:
|
||||
- mediatek,mt6577-uart-dma
|
||||
|
||||
reg:
|
||||
minItems: 1
|
||||
maxItems: 16
|
||||
|
||||
interrupts:
|
||||
description: |
|
||||
TX, RX interrupt lines for each UART APDMA channel
|
||||
minItems: 1
|
||||
maxItems: 16
|
||||
|
||||
clocks:
|
||||
description: Must contain one entry for the APDMA main clock
|
||||
maxItems: 1
|
||||
|
||||
clock-names:
|
||||
const: apdma
|
||||
|
||||
"#dma-cells":
|
||||
const: 1
|
||||
description: |
|
||||
The first cell specifies the UART APDMA channel number
|
||||
|
||||
dma-requests:
|
||||
description: |
|
||||
Number of virtual channels of the UART APDMA controller
|
||||
maximum: 16
|
||||
|
||||
mediatek,dma-33bits:
|
||||
type: boolean
|
||||
description: Enable 33-bits UART APDMA support
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
if:
|
||||
not:
|
||||
required:
|
||||
- dma-requests
|
||||
then:
|
||||
properties:
|
||||
interrupts:
|
||||
maxItems: 8
|
||||
reg:
|
||||
maxItems: 8
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
#include <dt-bindings/clock/mt2712-clk.h>
|
||||
soc {
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
|
||||
apdma: dma-controller@11000400 {
|
||||
compatible = "mediatek,mt2712-uart-dma",
|
||||
"mediatek,mt6577-uart-dma";
|
||||
reg = <0 0x11000400 0 0x80>,
|
||||
<0 0x11000480 0 0x80>,
|
||||
<0 0x11000500 0 0x80>,
|
||||
<0 0x11000580 0 0x80>,
|
||||
<0 0x11000600 0 0x80>,
|
||||
<0 0x11000680 0 0x80>,
|
||||
<0 0x11000700 0 0x80>,
|
||||
<0 0x11000780 0 0x80>,
|
||||
<0 0x11000800 0 0x80>,
|
||||
<0 0x11000880 0 0x80>,
|
||||
<0 0x11000900 0 0x80>,
|
||||
<0 0x11000980 0 0x80>;
|
||||
interrupts = <GIC_SPI 103 IRQ_TYPE_LEVEL_LOW>,
|
||||
<GIC_SPI 104 IRQ_TYPE_LEVEL_LOW>,
|
||||
<GIC_SPI 105 IRQ_TYPE_LEVEL_LOW>,
|
||||
<GIC_SPI 106 IRQ_TYPE_LEVEL_LOW>,
|
||||
<GIC_SPI 107 IRQ_TYPE_LEVEL_LOW>,
|
||||
<GIC_SPI 108 IRQ_TYPE_LEVEL_LOW>,
|
||||
<GIC_SPI 109 IRQ_TYPE_LEVEL_LOW>,
|
||||
<GIC_SPI 110 IRQ_TYPE_LEVEL_LOW>,
|
||||
<GIC_SPI 111 IRQ_TYPE_LEVEL_LOW>,
|
||||
<GIC_SPI 112 IRQ_TYPE_LEVEL_LOW>,
|
||||
<GIC_SPI 113 IRQ_TYPE_LEVEL_LOW>,
|
||||
<GIC_SPI 114 IRQ_TYPE_LEVEL_LOW>;
|
||||
dma-requests = <12>;
|
||||
clocks = <&pericfg CLK_PERI_AP_DMA>;
|
||||
clock-names = "apdma";
|
||||
mediatek,dma-33bits;
|
||||
#dma-cells = <1>;
|
||||
};
|
||||
};
|
||||
|
||||
...
|
||||
@@ -1,56 +0,0 @@
|
||||
* Mediatek UART APDMA Controller
|
||||
|
||||
Required properties:
|
||||
- compatible should contain:
|
||||
* "mediatek,mt2712-uart-dma" for MT2712 compatible APDMA
|
||||
* "mediatek,mt6577-uart-dma" for MT6577 and all of the above
|
||||
* "mediatek,mt8516-uart-dma", "mediatek,mt6577" for MT8516 SoC
|
||||
|
||||
- reg: The base address of the APDMA register bank.
|
||||
|
||||
- interrupts: A single interrupt specifier.
|
||||
One interrupt per dma-requests, or 8 if no dma-requests property is present
|
||||
|
||||
- dma-requests: The number of DMA channels
|
||||
|
||||
- clocks : Must contain an entry for each entry in clock-names.
|
||||
See ../clocks/clock-bindings.txt for details.
|
||||
- clock-names: The APDMA clock for register accesses
|
||||
|
||||
- mediatek,dma-33bits: Present if the DMA requires support
|
||||
|
||||
Examples:
|
||||
|
||||
apdma: dma-controller@11000400 {
|
||||
compatible = "mediatek,mt2712-uart-dma",
|
||||
"mediatek,mt6577-uart-dma";
|
||||
reg = <0 0x11000400 0 0x80>,
|
||||
<0 0x11000480 0 0x80>,
|
||||
<0 0x11000500 0 0x80>,
|
||||
<0 0x11000580 0 0x80>,
|
||||
<0 0x11000600 0 0x80>,
|
||||
<0 0x11000680 0 0x80>,
|
||||
<0 0x11000700 0 0x80>,
|
||||
<0 0x11000780 0 0x80>,
|
||||
<0 0x11000800 0 0x80>,
|
||||
<0 0x11000880 0 0x80>,
|
||||
<0 0x11000900 0 0x80>,
|
||||
<0 0x11000980 0 0x80>;
|
||||
interrupts = <GIC_SPI 103 IRQ_TYPE_LEVEL_LOW>,
|
||||
<GIC_SPI 104 IRQ_TYPE_LEVEL_LOW>,
|
||||
<GIC_SPI 105 IRQ_TYPE_LEVEL_LOW>,
|
||||
<GIC_SPI 106 IRQ_TYPE_LEVEL_LOW>,
|
||||
<GIC_SPI 107 IRQ_TYPE_LEVEL_LOW>,
|
||||
<GIC_SPI 108 IRQ_TYPE_LEVEL_LOW>,
|
||||
<GIC_SPI 109 IRQ_TYPE_LEVEL_LOW>,
|
||||
<GIC_SPI 110 IRQ_TYPE_LEVEL_LOW>,
|
||||
<GIC_SPI 111 IRQ_TYPE_LEVEL_LOW>,
|
||||
<GIC_SPI 112 IRQ_TYPE_LEVEL_LOW>,
|
||||
<GIC_SPI 113 IRQ_TYPE_LEVEL_LOW>,
|
||||
<GIC_SPI 114 IRQ_TYPE_LEVEL_LOW>;
|
||||
dma-requests = <12>;
|
||||
clocks = <&pericfg CLK_PERI_AP_DMA>;
|
||||
clock-names = "apdma";
|
||||
mediatek,dma-33bits;
|
||||
#dma-cells = <1>;
|
||||
};
|
||||
@@ -4,7 +4,7 @@
|
||||
$id: http://devicetree.org/schemas/dma/renesas,rz-dmac.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Renesas RZ/G2L DMA Controller
|
||||
title: Renesas RZ/{G2L,G2UL,V2L} DMA Controller
|
||||
|
||||
maintainers:
|
||||
- Biju Das <biju.das.jz@bp.renesas.com>
|
||||
@@ -16,7 +16,9 @@ properties:
|
||||
compatible:
|
||||
items:
|
||||
- enum:
|
||||
- renesas,r9a07g043-dmac # RZ/G2UL
|
||||
- renesas,r9a07g044-dmac # RZ/G2{L,LC}
|
||||
- renesas,r9a07g054-dmac # RZ/V2L
|
||||
- const: renesas,rz-dmac
|
||||
|
||||
reg:
|
||||
|
||||
@@ -39,39 +39,8 @@ additionalProperties: false
|
||||
examples:
|
||||
|
||||
- |
|
||||
/* OMAP4 SoCs */
|
||||
hwspinlock: spinlock@4a0f6000 {
|
||||
spinlock@4a0f6000 {
|
||||
compatible = "ti,omap4-hwspinlock";
|
||||
reg = <0x4a0f6000 0x1000>;
|
||||
#hwlock-cells = <1>;
|
||||
};
|
||||
|
||||
- |
|
||||
/ {
|
||||
/* K3 AM65x SoCs */
|
||||
model = "Texas Instruments K3 AM654 SoC";
|
||||
compatible = "ti,am654-evm", "ti,am654";
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
|
||||
bus@100000 {
|
||||
compatible = "simple-bus";
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
ranges = <0x00 0x00100000 0x00 0x00100000 0x00 0x00020000>, /* ctrl mmr */
|
||||
<0x00 0x30800000 0x00 0x30800000 0x00 0x0bc00000>; /* Main NavSS */
|
||||
|
||||
bus@30800000 {
|
||||
compatible = "simple-mfd";
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
ranges = <0x00 0x30800000 0x00 0x30800000 0x00 0x0bc00000>;
|
||||
|
||||
spinlock@30e00000 {
|
||||
compatible = "ti,am654-hwspinlock";
|
||||
reg = <0x00 0x30e00000 0x00 0x1000>;
|
||||
#hwlock-cells = <1>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/input/mediatek,mt6779-keypad.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Mediatek's Keypad Controller device tree bindings
|
||||
|
||||
maintainers:
|
||||
- Fengping Yu <fengping.yu@mediatek.com>
|
||||
|
||||
allOf:
|
||||
- $ref: "/schemas/input/matrix-keymap.yaml#"
|
||||
|
||||
description: |
|
||||
Mediatek's Keypad controller is used to interface a SoC with a matrix-type
|
||||
keypad device. The keypad controller supports multiple row and column lines.
|
||||
A key can be placed at each intersection of a unique row and a unique column.
|
||||
The keypad controller can sense a key-press and key-release and report the
|
||||
event using a interrupt to the cpu.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
oneOf:
|
||||
- const: mediatek,mt6779-keypad
|
||||
- items:
|
||||
- enum:
|
||||
- mediatek,mt6873-keypad
|
||||
- const: mediatek,mt6779-keypad
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: kpd
|
||||
|
||||
wakeup-source:
|
||||
description: use any event on keypad as wakeup event
|
||||
type: boolean
|
||||
|
||||
debounce-delay-ms:
|
||||
maximum: 256
|
||||
default: 16
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
- clocks
|
||||
- clock-names
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/input/input.h>
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
|
||||
soc {
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
|
||||
keyboard@10010000 {
|
||||
compatible = "mediatek,mt6779-keypad";
|
||||
reg = <0 0x10010000 0 0x1000>;
|
||||
interrupts = <GIC_SPI 75 IRQ_TYPE_EDGE_FALLING>;
|
||||
clocks = <&clk26m>;
|
||||
clock-names = "kpd";
|
||||
};
|
||||
};
|
||||
@@ -9,7 +9,10 @@ For MT6397/MT6323 MFD bindings see:
|
||||
Documentation/devicetree/bindings/mfd/mt6397.txt
|
||||
|
||||
Required properties:
|
||||
- compatible: "mediatek,mt6397-keys" or "mediatek,mt6323-keys"
|
||||
- compatible: Should be one of:
|
||||
- "mediatek,mt6397-keys"
|
||||
- "mediatek,mt6323-keys"
|
||||
- "mediatek,mt6358-keys"
|
||||
- linux,keycodes: See Documentation/devicetree/bindings/input/input.yaml
|
||||
|
||||
Optional Properties:
|
||||
|
||||
@@ -0,0 +1,74 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/input/touchscreen/imagis,ist3038c.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Imagis IST30XXC family touchscreen controller bindings
|
||||
|
||||
maintainers:
|
||||
- Markuss Broks <markuss.broks@gmail.com>
|
||||
|
||||
allOf:
|
||||
- $ref: touchscreen.yaml#
|
||||
|
||||
properties:
|
||||
$nodename:
|
||||
pattern: "^touchscreen@[0-9a-f]+$"
|
||||
|
||||
compatible:
|
||||
enum:
|
||||
- imagis,ist3038c
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
vdd-supply:
|
||||
description: Power supply regulator for the chip
|
||||
|
||||
vddio-supply:
|
||||
description: Power supply regulator for the I2C bus
|
||||
|
||||
touchscreen-size-x: true
|
||||
touchscreen-size-y: true
|
||||
touchscreen-fuzz-x: true
|
||||
touchscreen-fuzz-y: true
|
||||
touchscreen-inverted-x: true
|
||||
touchscreen-inverted-y: true
|
||||
touchscreen-swapped-x-y: true
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
- touchscreen-size-x
|
||||
- touchscreen-size-y
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/interrupt-controller/irq.h>
|
||||
i2c {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
touchscreen@50 {
|
||||
compatible = "imagis,ist3038c";
|
||||
reg = <0x50>;
|
||||
interrupt-parent = <&gpio>;
|
||||
interrupts = <13 IRQ_TYPE_EDGE_FALLING>;
|
||||
vdd-supply = <&ldo1_reg>;
|
||||
vddio-supply = <&ldo2_reg>;
|
||||
touchscreen-size-x = <720>;
|
||||
touchscreen-size-y = <1280>;
|
||||
touchscreen-fuzz-x = <10>;
|
||||
touchscreen-fuzz-y = <10>;
|
||||
touchscreen-inverted-x;
|
||||
touchscreen-inverted-y;
|
||||
};
|
||||
};
|
||||
|
||||
...
|
||||
@@ -85,6 +85,10 @@ properties:
|
||||
|
||||
ec-pwm:
|
||||
$ref: "/schemas/pwm/google,cros-ec-pwm.yaml#"
|
||||
deprecated: true
|
||||
|
||||
pwm:
|
||||
$ref: "/schemas/pwm/google,cros-ec-pwm.yaml#"
|
||||
|
||||
keyboard-controller:
|
||||
$ref: "/schemas/input/google,cros-ec-keyb.yaml#"
|
||||
|
||||
@@ -7,7 +7,9 @@ This device has following properties:
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible: Should be qcom,qcs404-ethqos"
|
||||
- compatible: Should be one of:
|
||||
"qcom,qcs404-ethqos"
|
||||
"qcom,sm8150-ethqos"
|
||||
|
||||
- reg: Address and length of the register set for the device
|
||||
|
||||
|
||||
@@ -52,33 +52,36 @@ properties:
|
||||
resets:
|
||||
maxItems: 1
|
||||
|
||||
if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: allwinner,sun50i-h6-pwm
|
||||
|
||||
then:
|
||||
properties:
|
||||
clocks:
|
||||
maxItems: 2
|
||||
allOf:
|
||||
- $ref: pwm.yaml#
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: mod
|
||||
- const: bus
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: allwinner,sun50i-h6-pwm
|
||||
|
||||
required:
|
||||
- clock-names
|
||||
- resets
|
||||
then:
|
||||
properties:
|
||||
clocks:
|
||||
maxItems: 2
|
||||
|
||||
else:
|
||||
properties:
|
||||
clocks:
|
||||
maxItems: 1
|
||||
clock-names:
|
||||
items:
|
||||
- const: mod
|
||||
- const: bus
|
||||
|
||||
required:
|
||||
- clock-names
|
||||
- resets
|
||||
|
||||
else:
|
||||
properties:
|
||||
clocks:
|
||||
maxItems: 1
|
||||
|
||||
required:
|
||||
- "#pwm-cells"
|
||||
- compatible
|
||||
- reg
|
||||
- clocks
|
||||
|
||||
@@ -28,7 +28,6 @@ properties:
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- "#pwm-cells"
|
||||
- clocks
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
@@ -16,6 +16,9 @@ description: |
|
||||
An EC PWM node should be only found as a sub-node of the EC node (see
|
||||
Documentation/devicetree/bindings/mfd/google,cros-ec.yaml).
|
||||
|
||||
allOf:
|
||||
- $ref: pwm.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: google,cros-ec-pwm
|
||||
@@ -39,7 +42,7 @@ examples:
|
||||
compatible = "google,cros-ec-spi";
|
||||
reg = <0>;
|
||||
|
||||
cros_ec_pwm: ec-pwm {
|
||||
cros_ec_pwm: pwm {
|
||||
compatible = "google,cros-ec-pwm";
|
||||
#pwm-cells = <1>;
|
||||
};
|
||||
|
||||
@@ -9,6 +9,9 @@ title: Freescale i.MX PWM controller
|
||||
maintainers:
|
||||
- Philipp Zabel <p.zabel@pengutronix.de>
|
||||
|
||||
allOf:
|
||||
- $ref: pwm.yaml#
|
||||
|
||||
properties:
|
||||
"#pwm-cells":
|
||||
description: |
|
||||
@@ -59,7 +62,6 @@ properties:
|
||||
maxItems: 1
|
||||
|
||||
required:
|
||||
- "#pwm-cells"
|
||||
- compatible
|
||||
- reg
|
||||
- clocks
|
||||
|
||||
@@ -13,6 +13,9 @@ description: |
|
||||
The TPM counter and period counter are shared between multiple
|
||||
channels, so all channels should use same period setting.
|
||||
|
||||
allOf:
|
||||
- $ref: pwm.yaml#
|
||||
|
||||
properties:
|
||||
"#pwm-cells":
|
||||
const: 3
|
||||
@@ -34,7 +37,6 @@ properties:
|
||||
maxItems: 1
|
||||
|
||||
required:
|
||||
- "#pwm-cells"
|
||||
- compatible
|
||||
- reg
|
||||
- clocks
|
||||
|
||||
@@ -31,7 +31,6 @@ required:
|
||||
- compatible
|
||||
- reg
|
||||
- clocks
|
||||
- '#pwm-cells'
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
|
||||
@@ -9,6 +9,9 @@ title: LGM SoC PWM fan controller
|
||||
maintainers:
|
||||
- Rahul Tanwar <rtanwar@maxlinear.com>
|
||||
|
||||
allOf:
|
||||
- $ref: pwm.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: intel,lgm-pwm
|
||||
|
||||
@@ -15,6 +15,9 @@ description: |
|
||||
Documentation/devicetree/bindings/mfd/iqs62x.yaml for further details as
|
||||
well as an example.
|
||||
|
||||
allOf:
|
||||
- $ref: pwm.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
@@ -25,7 +28,6 @@ properties:
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- "#pwm-cells"
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
|
||||
@@ -10,6 +10,9 @@ maintainers:
|
||||
- Shawn Guo <shawnguo@kernel.org>
|
||||
- Anson Huang <anson.huang@nxp.com>
|
||||
|
||||
allOf:
|
||||
- $ref: pwm.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
@@ -28,7 +31,6 @@ properties:
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- "#pwm-cells"
|
||||
- fsl,pwm-number
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
@@ -6,6 +6,7 @@ Required properties:
|
||||
- "mediatek,mt6595-disp-pwm": found on mt6595 SoC.
|
||||
- "mediatek,mt8167-disp-pwm", "mediatek,mt8173-disp-pwm": found on mt8167 SoC.
|
||||
- "mediatek,mt8173-disp-pwm": found on mt8173 SoC.
|
||||
- "mediatek,mt8183-disp-pwm": found on mt8183 SoC.$
|
||||
- reg: physical base address and length of the controller's registers.
|
||||
- #pwm-cells: must be 2. See pwm.yaml in this directory for a description of
|
||||
the cell format.
|
||||
|
||||
@@ -51,42 +51,44 @@ properties:
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- "#pwm-cells"
|
||||
|
||||
if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- rockchip,rk3328-pwm
|
||||
- rockchip,rv1108-pwm
|
||||
allOf:
|
||||
- $ref: pwm.yaml#
|
||||
|
||||
then:
|
||||
properties:
|
||||
clocks:
|
||||
items:
|
||||
- description: Used to derive the functional clock for the device.
|
||||
- description: Used as the APB bus clock.
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- rockchip,rk3328-pwm
|
||||
- rockchip,rv1108-pwm
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: pwm
|
||||
- const: pclk
|
||||
then:
|
||||
properties:
|
||||
clocks:
|
||||
items:
|
||||
- description: Used to derive the functional clock for the device.
|
||||
- description: Used as the APB bus clock.
|
||||
|
||||
required:
|
||||
- clocks
|
||||
- clock-names
|
||||
clock-names:
|
||||
items:
|
||||
- const: pwm
|
||||
- const: pclk
|
||||
|
||||
else:
|
||||
properties:
|
||||
clocks:
|
||||
maxItems: 1
|
||||
description:
|
||||
Used both to derive the functional clock
|
||||
for the device and as the bus clock.
|
||||
required:
|
||||
- clocks
|
||||
- clock-names
|
||||
|
||||
required:
|
||||
- clocks
|
||||
else:
|
||||
properties:
|
||||
clocks:
|
||||
maxItems: 1
|
||||
description:
|
||||
Used both to derive the functional clock
|
||||
for the device and as the bus clock.
|
||||
|
||||
required:
|
||||
- clocks
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
|
||||
@@ -86,7 +86,6 @@ required:
|
||||
- clocks
|
||||
- clock-names
|
||||
- compatible
|
||||
- "#pwm-cells"
|
||||
- reg
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
@@ -21,6 +21,9 @@ description:
|
||||
|
||||
https://github.com/sifive/sifive-blocks/tree/master/src/main/scala/devices/pwm
|
||||
|
||||
allOf:
|
||||
- $ref: pwm.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
items:
|
||||
@@ -54,7 +57,6 @@ required:
|
||||
- compatible
|
||||
- reg
|
||||
- clocks
|
||||
- "#pwm-cells"
|
||||
- interrupts
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
@@ -47,7 +47,6 @@ properties:
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- "#pwm-cells"
|
||||
- clocks
|
||||
- clock-names
|
||||
|
||||
|
||||
@@ -48,7 +48,6 @@ properties:
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- "#pwm-cells"
|
||||
- clocks
|
||||
- clock-names
|
||||
|
||||
|
||||
@@ -59,21 +59,23 @@ properties:
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- '#pwm-cells'
|
||||
- clocks
|
||||
- power-domains
|
||||
|
||||
if:
|
||||
not:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- renesas,pwm-r8a7778
|
||||
- renesas,pwm-r8a7779
|
||||
then:
|
||||
required:
|
||||
- resets
|
||||
allOf:
|
||||
- $ref: pwm.yaml#
|
||||
|
||||
- if:
|
||||
not:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- renesas,pwm-r8a7778
|
||||
- renesas,pwm-r8a7779
|
||||
then:
|
||||
required:
|
||||
- resets
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
|
||||
@@ -68,7 +68,6 @@ properties:
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- '#pwm-cells'
|
||||
- clocks
|
||||
- power-domains
|
||||
|
||||
|
||||
@@ -9,6 +9,9 @@ title: Toshiba Visconti PWM Controller
|
||||
maintainers:
|
||||
- Nobuhiro Iwamatsu <nobuhiro1.iwamatsu@toshiba.co.jp>
|
||||
|
||||
allOf:
|
||||
- $ref: pwm.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
items:
|
||||
@@ -23,7 +26,6 @@ properties:
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- '#pwm-cells'
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@ properties:
|
||||
compatible:
|
||||
enum:
|
||||
- mediatek,mt8183-scp
|
||||
- mediatek,mt8186-scp
|
||||
- mediatek,mt8192-scp
|
||||
- mediatek,mt8195-scp
|
||||
|
||||
|
||||
@@ -1,140 +0,0 @@
|
||||
Qualcomm Technology Inc. Hexagon v56 Peripheral Image Loader
|
||||
|
||||
This document defines the binding for a component that loads and boots firmware
|
||||
on the Qualcomm Technology Inc. Hexagon v56 core.
|
||||
|
||||
- compatible:
|
||||
Usage: required
|
||||
Value type: <string>
|
||||
Definition: must be one of:
|
||||
"qcom,qcs404-cdsp-pil",
|
||||
"qcom,sdm845-adsp-pil"
|
||||
|
||||
- reg:
|
||||
Usage: required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: must specify the base address and size of the qdsp6ss register
|
||||
|
||||
- interrupts-extended:
|
||||
Usage: required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: must list the watchdog, fatal IRQs ready, handover and
|
||||
stop-ack IRQs
|
||||
|
||||
- interrupt-names:
|
||||
Usage: required
|
||||
Value type: <stringlist>
|
||||
Definition: must be "wdog", "fatal", "ready", "handover", "stop-ack"
|
||||
|
||||
- clocks:
|
||||
Usage: required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: List of phandles and clock specifier pairs for the Hexagon,
|
||||
per clock-names below.
|
||||
|
||||
- clock-names:
|
||||
Usage: required for SDM845 ADSP
|
||||
Value type: <stringlist>
|
||||
Definition: List of clock input name strings sorted in the same
|
||||
order as the clocks property. Definition must have
|
||||
"xo", "sway_cbcr", "lpass_ahbs_aon_cbcr",
|
||||
"lpass_ahbm_aon_cbcr", "qdsp6ss_xo", "qdsp6ss_sleep"
|
||||
and "qdsp6ss_core".
|
||||
|
||||
- clock-names:
|
||||
Usage: required for QCS404 CDSP
|
||||
Value type: <stringlist>
|
||||
Definition: List of clock input name strings sorted in the same
|
||||
order as the clocks property. Definition must have
|
||||
"xo", "sway", "tbu", "bimc", "ahb_aon", "q6ss_slave",
|
||||
"q6ss_master", "q6_axim".
|
||||
|
||||
- power-domains:
|
||||
Usage: required
|
||||
Value type: <phandle>
|
||||
Definition: reference to cx power domain node.
|
||||
|
||||
- resets:
|
||||
Usage: required
|
||||
Value type: <phandle>
|
||||
Definition: reference to the list of resets for the Hexagon.
|
||||
|
||||
- reset-names:
|
||||
Usage: required for SDM845 ADSP
|
||||
Value type: <stringlist>
|
||||
Definition: must be "pdc_sync" and "cc_lpass"
|
||||
|
||||
- reset-names:
|
||||
Usage: required for QCS404 CDSP
|
||||
Value type: <stringlist>
|
||||
Definition: must be "restart"
|
||||
|
||||
- qcom,halt-regs:
|
||||
Usage: required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: a phandle reference to a syscon representing TCSR followed
|
||||
by the offset within syscon for Hexagon halt register.
|
||||
|
||||
- memory-region:
|
||||
Usage: required
|
||||
Value type: <phandle>
|
||||
Definition: reference to the reserved-memory for the firmware
|
||||
|
||||
- qcom,smem-states:
|
||||
Usage: required
|
||||
Value type: <phandle>
|
||||
Definition: reference to the smem state for requesting the Hexagon to
|
||||
shut down
|
||||
|
||||
- qcom,smem-state-names:
|
||||
Usage: required
|
||||
Value type: <stringlist>
|
||||
Definition: must be "stop"
|
||||
|
||||
|
||||
= SUBNODES
|
||||
The adsp node may have an subnode named "glink-edge" that describes the
|
||||
communication edge, channels and devices related to the Hexagon.
|
||||
See ../soc/qcom/qcom,glink.txt for details on how to describe these.
|
||||
|
||||
= EXAMPLE
|
||||
The following example describes the resources needed to boot control the
|
||||
ADSP, as it is found on SDM845 boards.
|
||||
|
||||
remoteproc@17300000 {
|
||||
compatible = "qcom,sdm845-adsp-pil";
|
||||
reg = <0x17300000 0x40c>;
|
||||
|
||||
interrupts-extended = <&intc GIC_SPI 162 IRQ_TYPE_EDGE_RISING>,
|
||||
<&adsp_smp2p_in 0 IRQ_TYPE_EDGE_RISING>,
|
||||
<&adsp_smp2p_in 1 IRQ_TYPE_EDGE_RISING>,
|
||||
<&adsp_smp2p_in 2 IRQ_TYPE_EDGE_RISING>,
|
||||
<&adsp_smp2p_in 3 IRQ_TYPE_EDGE_RISING>;
|
||||
interrupt-names = "wdog", "fatal", "ready",
|
||||
"handover", "stop-ack";
|
||||
|
||||
clocks = <&rpmhcc RPMH_CXO_CLK>,
|
||||
<&gcc GCC_LPASS_SWAY_CLK>,
|
||||
<&lpasscc LPASS_Q6SS_AHBS_AON_CLK>,
|
||||
<&lpasscc LPASS_Q6SS_AHBM_AON_CLK>,
|
||||
<&lpasscc LPASS_QDSP6SS_XO_CLK>,
|
||||
<&lpasscc LPASS_QDSP6SS_SLEEP_CLK>,
|
||||
<&lpasscc LPASS_QDSP6SS_CORE_CLK>;
|
||||
clock-names = "xo", "sway_cbcr",
|
||||
"lpass_ahbs_aon_cbcr",
|
||||
"lpass_ahbm_aon_cbcr", "qdsp6ss_xo",
|
||||
"qdsp6ss_sleep", "qdsp6ss_core";
|
||||
|
||||
power-domains = <&rpmhpd SDM845_CX>;
|
||||
|
||||
resets = <&pdc_reset PDC_AUDIO_SYNC_RESET>,
|
||||
<&aoss_reset AOSS_CC_LPASS_RESTART>;
|
||||
reset-names = "pdc_sync", "cc_lpass";
|
||||
|
||||
qcom,halt-regs = <&tcsr_mutex_regs 0x22000>;
|
||||
|
||||
memory-region = <&pil_adsp_mem>;
|
||||
|
||||
qcom,smem-states = <&adsp_smp2p_out 0>;
|
||||
qcom,smem-state-names = "stop";
|
||||
};
|
||||
@@ -0,0 +1,161 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/remoteproc/qcom,qcs404-cdsp-pil.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Qualcomm QCS404 CDSP Peripheral Image Loader
|
||||
|
||||
maintainers:
|
||||
- Bjorn Andersson <bjorn.andersson@linaro.org>
|
||||
|
||||
description:
|
||||
This document defines the binding for a component that loads and boots firmware
|
||||
on the Qualcomm Technology Inc. CDSP (Compute DSP).
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- qcom,qcs404-cdsp-pil
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
description:
|
||||
The base address and size of the qdsp6ss register
|
||||
|
||||
interrupts:
|
||||
items:
|
||||
- description: Watchdog interrupt
|
||||
- description: Fatal interrupt
|
||||
- description: Ready interrupt
|
||||
- description: Handover interrupt
|
||||
- description: Stop acknowledge interrupt
|
||||
|
||||
interrupt-names:
|
||||
items:
|
||||
- const: wdog
|
||||
- const: fatal
|
||||
- const: ready
|
||||
- const: handover
|
||||
- const: stop-ack
|
||||
|
||||
clocks:
|
||||
items:
|
||||
- description: XO clock
|
||||
- description: SWAY clock
|
||||
- description: TBU clock
|
||||
- description: BIMC clock
|
||||
- description: AHB AON clock
|
||||
- description: Q6SS SLAVE clock
|
||||
- description: Q6SS MASTER clock
|
||||
- description: Q6 AXIM clock
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: xo
|
||||
- const: sway
|
||||
- const: tbu
|
||||
- const: bimc
|
||||
- const: ahb_aon
|
||||
- const: q6ss_slave
|
||||
- const: q6ss_master
|
||||
- const: q6_axim
|
||||
|
||||
power-domains:
|
||||
items:
|
||||
- description: CX power domain
|
||||
|
||||
resets:
|
||||
items:
|
||||
- description: AOSS restart
|
||||
|
||||
reset-names:
|
||||
items:
|
||||
- const: restart
|
||||
|
||||
memory-region:
|
||||
maxItems: 1
|
||||
description: Reference to the reserved-memory for the Hexagon core
|
||||
|
||||
qcom,halt-regs:
|
||||
$ref: /schemas/types.yaml#/definitions/phandle-array
|
||||
description:
|
||||
Phandle reference to a syscon representing TCSR followed by the
|
||||
three offsets within syscon for q6, modem and nc halt registers.
|
||||
|
||||
qcom,smem-states:
|
||||
$ref: /schemas/types.yaml#/definitions/phandle-array
|
||||
description: States used by the AP to signal the Hexagon core
|
||||
items:
|
||||
- description: Stop the modem
|
||||
|
||||
qcom,smem-state-names:
|
||||
$ref: /schemas/types.yaml#/definitions/string
|
||||
description: The names of the state bits used for SMP2P output
|
||||
items:
|
||||
- const: stop
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
- interrupt-names
|
||||
- clocks
|
||||
- clock-names
|
||||
- power-domains
|
||||
- resets
|
||||
- reset-names
|
||||
- qcom,halt-regs
|
||||
- memory-region
|
||||
- qcom,smem-states
|
||||
- qcom,smem-state-names
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
#include <dt-bindings/clock/qcom,gcc-qcs404.h>
|
||||
#include <dt-bindings/power/qcom-rpmpd.h>
|
||||
#include <dt-bindings/clock/qcom,turingcc-qcs404.h>
|
||||
remoteproc@b00000 {
|
||||
compatible = "qcom,qcs404-cdsp-pil";
|
||||
reg = <0x00b00000 0x4040>;
|
||||
|
||||
interrupts-extended = <&intc GIC_SPI 229 IRQ_TYPE_EDGE_RISING>,
|
||||
<&cdsp_smp2p_in 0 IRQ_TYPE_EDGE_RISING>,
|
||||
<&cdsp_smp2p_in 1 IRQ_TYPE_EDGE_RISING>,
|
||||
<&cdsp_smp2p_in 2 IRQ_TYPE_EDGE_RISING>,
|
||||
<&cdsp_smp2p_in 3 IRQ_TYPE_EDGE_RISING>;
|
||||
interrupt-names = "wdog", "fatal", "ready",
|
||||
"handover", "stop-ack";
|
||||
|
||||
clocks = <&xo_board>,
|
||||
<&gcc GCC_CDSP_CFG_AHB_CLK>,
|
||||
<&gcc GCC_CDSP_TBU_CLK>,
|
||||
<&gcc GCC_BIMC_CDSP_CLK>,
|
||||
<&turingcc TURING_WRAPPER_AON_CLK>,
|
||||
<&turingcc TURING_Q6SS_AHBS_AON_CLK>,
|
||||
<&turingcc TURING_Q6SS_AHBM_AON_CLK>,
|
||||
<&turingcc TURING_Q6SS_Q6_AXIM_CLK>;
|
||||
clock-names = "xo",
|
||||
"sway",
|
||||
"tbu",
|
||||
"bimc",
|
||||
"ahb_aon",
|
||||
"q6ss_slave",
|
||||
"q6ss_master",
|
||||
"q6_axim";
|
||||
|
||||
power-domains = <&rpmhpd SDM845_CX>;
|
||||
|
||||
resets = <&gcc GCC_CDSP_RESTART>;
|
||||
reset-names = "restart";
|
||||
|
||||
qcom,halt-regs = <&tcsr 0x19004>;
|
||||
|
||||
memory-region = <&cdsp_fw_mem>;
|
||||
|
||||
qcom,smem-states = <&cdsp_smp2p_out 0>;
|
||||
qcom,smem-state-names = "stop";
|
||||
};
|
||||
@@ -0,0 +1,219 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/remoteproc/qcom,sc7280-wpss-pil.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Qualcomm SC7280 WPSS Peripheral Image Loader
|
||||
|
||||
maintainers:
|
||||
- Bjorn Andersson <bjorn.andersson@linaro.org>
|
||||
|
||||
description:
|
||||
This document defines the binding for a component that loads and boots firmware
|
||||
on the Qualcomm Technology Inc. WPSS.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- qcom,sc7280-wpss-pil
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
description:
|
||||
The base address and size of the qdsp6ss register
|
||||
|
||||
interrupts:
|
||||
items:
|
||||
- description: Watchdog interrupt
|
||||
- description: Fatal interrupt
|
||||
- description: Ready interrupt
|
||||
- description: Handover interrupt
|
||||
- description: Stop acknowledge interrupt
|
||||
- description: Shutdown acknowledge interrupt
|
||||
|
||||
interrupt-names:
|
||||
items:
|
||||
- const: wdog
|
||||
- const: fatal
|
||||
- const: ready
|
||||
- const: handover
|
||||
- const: stop-ack
|
||||
- const: shutdown-ack
|
||||
|
||||
clocks:
|
||||
items:
|
||||
- description: GCC WPSS AHB BDG Master clock
|
||||
- description: GCC WPSS AHB clock
|
||||
- description: GCC WPSS RSCP clock
|
||||
- description: XO clock
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: ahb_bdg
|
||||
- const: ahb
|
||||
- const: rscp
|
||||
- const: xo
|
||||
|
||||
power-domains:
|
||||
items:
|
||||
- description: CX power domain
|
||||
- description: MX power domain
|
||||
|
||||
power-domain-names:
|
||||
items:
|
||||
- const: cx
|
||||
- const: mx
|
||||
|
||||
resets:
|
||||
items:
|
||||
- description: AOSS restart
|
||||
- description: PDC SYNC
|
||||
|
||||
reset-names:
|
||||
items:
|
||||
- const: restart
|
||||
- const: pdc_sync
|
||||
|
||||
memory-region:
|
||||
$ref: /schemas/types.yaml#/definitions/phandle
|
||||
description: Reference to the reserved-memory for the Hexagon core
|
||||
|
||||
firmware-name:
|
||||
$ref: /schemas/types.yaml#/definitions/string
|
||||
description:
|
||||
The name of the firmware which should be loaded for this remote
|
||||
processor.
|
||||
|
||||
qcom,halt-regs:
|
||||
$ref: /schemas/types.yaml#/definitions/phandle-array
|
||||
description:
|
||||
Phandle reference to a syscon representing TCSR followed by the
|
||||
three offsets within syscon for q6, modem and nc halt registers.
|
||||
|
||||
qcom,qmp:
|
||||
$ref: /schemas/types.yaml#/definitions/phandle
|
||||
description: Reference to the AOSS side-channel message RAM.
|
||||
|
||||
qcom,smem-states:
|
||||
$ref: /schemas/types.yaml#/definitions/phandle-array
|
||||
description: States used by the AP to signal the Hexagon core
|
||||
items:
|
||||
- description: Stop the modem
|
||||
|
||||
qcom,smem-state-names:
|
||||
$ref: /schemas/types.yaml#/definitions/string
|
||||
description: The names of the state bits used for SMP2P output
|
||||
items:
|
||||
- const: stop
|
||||
|
||||
glink-edge:
|
||||
type: object
|
||||
description: |
|
||||
Qualcomm G-Link subnode which represents communication edge, channels
|
||||
and devices related to the ADSP.
|
||||
|
||||
properties:
|
||||
interrupts:
|
||||
items:
|
||||
- description: IRQ from WPSS to GLINK
|
||||
|
||||
mboxes:
|
||||
items:
|
||||
- description: Mailbox for communication between APPS and WPSS
|
||||
|
||||
label:
|
||||
description: The names of the state bits used for SMP2P output
|
||||
items:
|
||||
- const: wpss
|
||||
|
||||
qcom,remote-pid:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
description: ID of the shared memory used by GLINK for communication with WPSS
|
||||
maxItems: 1
|
||||
|
||||
required:
|
||||
- interrupts
|
||||
- mboxes
|
||||
- label
|
||||
- qcom,remote-pid
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
- interrupt-names
|
||||
- clocks
|
||||
- clock-names
|
||||
- power-domains
|
||||
- power-domain-names
|
||||
- resets
|
||||
- reset-names
|
||||
- qcom,halt-regs
|
||||
- memory-region
|
||||
- qcom,qmp
|
||||
- qcom,smem-states
|
||||
- qcom,smem-state-names
|
||||
- glink-edge
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
#include <dt-bindings/clock/qcom,gcc-sc7280.h>
|
||||
#include <dt-bindings/clock/qcom,rpmh.h>
|
||||
#include <dt-bindings/power/qcom-rpmpd.h>
|
||||
#include <dt-bindings/reset/qcom,sdm845-aoss.h>
|
||||
#include <dt-bindings/reset/qcom,sdm845-pdc.h>
|
||||
#include <dt-bindings/mailbox/qcom-ipcc.h>
|
||||
remoteproc@8a00000 {
|
||||
compatible = "qcom,sc7280-wpss-pil";
|
||||
reg = <0x08a00000 0x10000>;
|
||||
|
||||
interrupts-extended = <&intc GIC_SPI 587 IRQ_TYPE_EDGE_RISING>,
|
||||
<&wpss_smp2p_in 0 IRQ_TYPE_EDGE_RISING>,
|
||||
<&wpss_smp2p_in 1 IRQ_TYPE_EDGE_RISING>,
|
||||
<&wpss_smp2p_in 2 IRQ_TYPE_EDGE_RISING>,
|
||||
<&wpss_smp2p_in 3 IRQ_TYPE_EDGE_RISING>,
|
||||
<&wpss_smp2p_in 7 IRQ_TYPE_EDGE_RISING>;
|
||||
interrupt-names = "wdog", "fatal", "ready", "handover",
|
||||
"stop-ack", "shutdown-ack";
|
||||
|
||||
clocks = <&gcc GCC_WPSS_AHB_BDG_MST_CLK>,
|
||||
<&gcc GCC_WPSS_AHB_CLK>,
|
||||
<&gcc GCC_WPSS_RSCP_CLK>,
|
||||
<&rpmhcc RPMH_CXO_CLK>;
|
||||
clock-names = "ahb_bdg", "ahb",
|
||||
"rscp", "xo";
|
||||
|
||||
power-domains = <&rpmhpd SC7280_CX>,
|
||||
<&rpmhpd SC7280_MX>;
|
||||
power-domain-names = "cx", "mx";
|
||||
|
||||
memory-region = <&wpss_mem>;
|
||||
|
||||
qcom,qmp = <&aoss_qmp>;
|
||||
|
||||
qcom,smem-states = <&wpss_smp2p_out 0>;
|
||||
qcom,smem-state-names = "stop";
|
||||
|
||||
resets = <&aoss_reset AOSS_CC_WCSS_RESTART>,
|
||||
<&pdc_reset PDC_WPSS_SYNC_RESET>;
|
||||
reset-names = "restart", "pdc_sync";
|
||||
|
||||
qcom,halt-regs = <&tcsr_mutex 0x37000>;
|
||||
|
||||
glink-edge {
|
||||
interrupts-extended = <&ipcc IPCC_CLIENT_WPSS
|
||||
IPCC_MPROC_SIGNAL_GLINK_QMP
|
||||
IRQ_TYPE_EDGE_RISING>;
|
||||
mboxes = <&ipcc IPCC_CLIENT_WPSS
|
||||
IPCC_MPROC_SIGNAL_GLINK_QMP>;
|
||||
|
||||
label = "wpss";
|
||||
qcom,remote-pid = <13>;
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,160 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/remoteproc/qcom,sdm845-adsp-pil.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Qualcomm SDM845 ADSP Peripheral Image Loader
|
||||
|
||||
maintainers:
|
||||
- Bjorn Andersson <bjorn.andersson@linaro.org>
|
||||
|
||||
description:
|
||||
This document defines the binding for a component that loads and boots firmware
|
||||
on the Qualcomm Technology Inc. ADSP.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- qcom,sdm845-adsp-pil
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
description:
|
||||
The base address and size of the qdsp6ss register
|
||||
|
||||
interrupts:
|
||||
items:
|
||||
- description: Watchdog interrupt
|
||||
- description: Fatal interrupt
|
||||
- description: Ready interrupt
|
||||
- description: Handover interrupt
|
||||
- description: Stop acknowledge interrupt
|
||||
|
||||
interrupt-names:
|
||||
items:
|
||||
- const: wdog
|
||||
- const: fatal
|
||||
- const: ready
|
||||
- const: handover
|
||||
- const: stop-ack
|
||||
|
||||
clocks:
|
||||
items:
|
||||
- description: XO clock
|
||||
- description: SWAY clock
|
||||
- description: LPASS AHBS AON clock
|
||||
- description: LPASS AHBM AON clock
|
||||
- description: QDSP XO clock
|
||||
- description: Q6SP6SS SLEEP clock
|
||||
- description: Q6SP6SS CORE clock
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: xo
|
||||
- const: sway_cbcr
|
||||
- const: lpass_ahbs_aon_cbcr
|
||||
- const: lpass_ahbm_aon_cbcr
|
||||
- const: qdsp6ss_xo
|
||||
- const: qdsp6ss_sleep
|
||||
- const: qdsp6ss_core
|
||||
|
||||
power-domains:
|
||||
items:
|
||||
- description: CX power domain
|
||||
|
||||
resets:
|
||||
items:
|
||||
- description: PDC AUDIO SYNC RESET
|
||||
- description: CC LPASS restart
|
||||
|
||||
reset-names:
|
||||
items:
|
||||
- const: pdc_sync
|
||||
- const: cc_lpass
|
||||
|
||||
memory-region:
|
||||
maxItems: 1
|
||||
description: Reference to the reserved-memory for the Hexagon core
|
||||
|
||||
qcom,halt-regs:
|
||||
$ref: /schemas/types.yaml#/definitions/phandle-array
|
||||
description:
|
||||
Phandle reference to a syscon representing TCSR followed by the
|
||||
three offsets within syscon for q6, modem and nc halt registers.
|
||||
|
||||
qcom,smem-states:
|
||||
$ref: /schemas/types.yaml#/definitions/phandle-array
|
||||
description: States used by the AP to signal the Hexagon core
|
||||
items:
|
||||
- description: Stop the modem
|
||||
|
||||
qcom,smem-state-names:
|
||||
$ref: /schemas/types.yaml#/definitions/string
|
||||
description: The names of the state bits used for SMP2P output
|
||||
items:
|
||||
- const: stop
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
- interrupt-names
|
||||
- clocks
|
||||
- clock-names
|
||||
- power-domains
|
||||
- resets
|
||||
- reset-names
|
||||
- qcom,halt-regs
|
||||
- memory-region
|
||||
- qcom,smem-states
|
||||
- qcom,smem-state-names
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
#include <dt-bindings/clock/qcom,rpmh.h>
|
||||
#include <dt-bindings/clock/qcom,gcc-sdm845.h>
|
||||
#include <dt-bindings/clock/qcom,lpass-sdm845.h>
|
||||
#include <dt-bindings/power/qcom-rpmpd.h>
|
||||
#include <dt-bindings/reset/qcom,sdm845-pdc.h>
|
||||
#include <dt-bindings/reset/qcom,sdm845-aoss.h>
|
||||
remoteproc@17300000 {
|
||||
compatible = "qcom,sdm845-adsp-pil";
|
||||
reg = <0x17300000 0x40c>;
|
||||
|
||||
interrupts-extended = <&intc GIC_SPI 162 IRQ_TYPE_EDGE_RISING>,
|
||||
<&adsp_smp2p_in 0 IRQ_TYPE_EDGE_RISING>,
|
||||
<&adsp_smp2p_in 1 IRQ_TYPE_EDGE_RISING>,
|
||||
<&adsp_smp2p_in 2 IRQ_TYPE_EDGE_RISING>,
|
||||
<&adsp_smp2p_in 3 IRQ_TYPE_EDGE_RISING>;
|
||||
interrupt-names = "wdog", "fatal", "ready",
|
||||
"handover", "stop-ack";
|
||||
|
||||
clocks = <&rpmhcc RPMH_CXO_CLK>,
|
||||
<&gcc GCC_LPASS_SWAY_CLK>,
|
||||
<&lpasscc LPASS_Q6SS_AHBS_AON_CLK>,
|
||||
<&lpasscc LPASS_Q6SS_AHBM_AON_CLK>,
|
||||
<&lpasscc LPASS_QDSP6SS_XO_CLK>,
|
||||
<&lpasscc LPASS_QDSP6SS_SLEEP_CLK>,
|
||||
<&lpasscc LPASS_QDSP6SS_CORE_CLK>;
|
||||
clock-names = "xo", "sway_cbcr",
|
||||
"lpass_ahbs_aon_cbcr",
|
||||
"lpass_ahbm_aon_cbcr", "qdsp6ss_xo",
|
||||
"qdsp6ss_sleep", "qdsp6ss_core";
|
||||
|
||||
power-domains = <&rpmhpd SDM845_CX>;
|
||||
|
||||
resets = <&pdc_reset PDC_AUDIO_SYNC_RESET>,
|
||||
<&aoss_reset AOSS_CC_LPASS_RESTART>;
|
||||
reset-names = "pdc_sync", "cc_lpass";
|
||||
|
||||
qcom,halt-regs = <&tcsr_mutex_regs 0x22000>;
|
||||
|
||||
memory-region = <&pil_adsp_mem>;
|
||||
|
||||
qcom,smem-states = <&adsp_smp2p_out 0>;
|
||||
qcom,smem-state-names = "stop";
|
||||
};
|
||||
@@ -16,16 +16,22 @@ properties:
|
||||
|
||||
compatible:
|
||||
oneOf:
|
||||
- const: allwinner,sun6i-a31-rtc
|
||||
- const: allwinner,sun8i-a23-rtc
|
||||
- const: allwinner,sun8i-h3-rtc
|
||||
- const: allwinner,sun8i-r40-rtc
|
||||
- const: allwinner,sun8i-v3-rtc
|
||||
- const: allwinner,sun50i-h5-rtc
|
||||
- enum:
|
||||
- allwinner,sun6i-a31-rtc
|
||||
- allwinner,sun8i-a23-rtc
|
||||
- allwinner,sun8i-h3-rtc
|
||||
- allwinner,sun8i-r40-rtc
|
||||
- allwinner,sun8i-v3-rtc
|
||||
- allwinner,sun50i-h5-rtc
|
||||
- allwinner,sun50i-h6-rtc
|
||||
- allwinner,sun50i-h616-rtc
|
||||
- allwinner,sun50i-r329-rtc
|
||||
- items:
|
||||
- const: allwinner,sun50i-a64-rtc
|
||||
- const: allwinner,sun8i-h3-rtc
|
||||
- const: allwinner,sun50i-h6-rtc
|
||||
- items:
|
||||
- const: allwinner,sun20i-d1-rtc
|
||||
- const: allwinner,sun50i-r329-rtc
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
@@ -37,7 +43,12 @@ properties:
|
||||
- description: RTC Alarm 1
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
minItems: 1
|
||||
maxItems: 4
|
||||
|
||||
clock-names:
|
||||
minItems: 1
|
||||
maxItems: 4
|
||||
|
||||
clock-output-names:
|
||||
minItems: 1
|
||||
@@ -85,6 +96,7 @@ allOf:
|
||||
enum:
|
||||
- allwinner,sun8i-h3-rtc
|
||||
- allwinner,sun50i-h5-rtc
|
||||
- allwinner,sun50i-h6-rtc
|
||||
|
||||
then:
|
||||
properties:
|
||||
@@ -96,19 +108,68 @@ allOf:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: allwinner,sun50i-h6-rtc
|
||||
const: allwinner,sun50i-h616-rtc
|
||||
|
||||
then:
|
||||
properties:
|
||||
clock-output-names:
|
||||
clocks:
|
||||
minItems: 3
|
||||
maxItems: 3
|
||||
items:
|
||||
- description: Bus clock for register access
|
||||
- description: 24 MHz oscillator
|
||||
- description: 32 kHz clock from the CCU
|
||||
|
||||
clock-names:
|
||||
minItems: 3
|
||||
maxItems: 3
|
||||
items:
|
||||
- const: bus
|
||||
- const: hosc
|
||||
- const: pll-32k
|
||||
|
||||
required:
|
||||
- clocks
|
||||
- clock-names
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: allwinner,sun8i-r40-rtc
|
||||
const: allwinner,sun50i-r329-rtc
|
||||
|
||||
then:
|
||||
properties:
|
||||
clocks:
|
||||
minItems: 3
|
||||
maxItems: 4
|
||||
items:
|
||||
- description: Bus clock for register access
|
||||
- description: 24 MHz oscillator
|
||||
- description: AHB parent for internal SPI clock
|
||||
- description: External 32768 Hz oscillator
|
||||
|
||||
clock-names:
|
||||
minItems: 3
|
||||
maxItems: 4
|
||||
items:
|
||||
- const: bus
|
||||
- const: hosc
|
||||
- const: ahb
|
||||
- const: ext-osc32k
|
||||
|
||||
required:
|
||||
- clocks
|
||||
- clock-names
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- allwinner,sun8i-r40-rtc
|
||||
- allwinner,sun50i-h616-rtc
|
||||
- allwinner,sun50i-r329-rtc
|
||||
|
||||
then:
|
||||
properties:
|
||||
@@ -127,7 +188,6 @@ required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
- clock-output-names
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
|
||||
@@ -1,25 +0,0 @@
|
||||
Atmel AT91SAM9260 Real Time Timer
|
||||
|
||||
Required properties:
|
||||
- compatible: should be one of the following:
|
||||
- "atmel,at91sam9260-rtt"
|
||||
- "microchip,sam9x60-rtt", "atmel,at91sam9260-rtt"
|
||||
- reg: should encode the memory region of the RTT controller
|
||||
- interrupts: rtt alarm/event interrupt
|
||||
- clocks: should contain the 32 KHz slow clk that will drive the RTT block.
|
||||
- atmel,rtt-rtc-time-reg: should encode the GPBR register used to store
|
||||
the time base when the RTT is used as an RTC.
|
||||
The first cell should point to the GPBR node and the second one
|
||||
encode the offset within the GPBR block (or in other words, the
|
||||
GPBR register used to store the time base).
|
||||
|
||||
|
||||
Example:
|
||||
|
||||
rtt@fffffd20 {
|
||||
compatible = "atmel,at91sam9260-rtt";
|
||||
reg = <0xfffffd20 0x10>;
|
||||
interrupts = <1 4 7>;
|
||||
clocks = <&clk32k>;
|
||||
atmel,rtt-rtc-time-reg = <&gpbr 0x0>;
|
||||
};
|
||||
@@ -0,0 +1,69 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
# Copyright (C) 2022 Microchip Technology, Inc. and its subsidiaries
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/rtc/atmel,at91sam9260-rtt.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Atmel AT91 RTT Device Tree Bindings
|
||||
|
||||
allOf:
|
||||
- $ref: "rtc.yaml#"
|
||||
|
||||
maintainers:
|
||||
- Alexandre Belloni <alexandre.belloni@bootlin.com>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
oneOf:
|
||||
- items:
|
||||
- const: atmel,at91sam9260-rtt
|
||||
- items:
|
||||
- const: microchip,sam9x60-rtt
|
||||
- const: atmel,at91sam9260-rtt
|
||||
- items:
|
||||
- const: microchip,sama7g5-rtt
|
||||
- const: microchip,sam9x60-rtt
|
||||
- const: atmel,at91sam9260-rtt
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
|
||||
atmel,rtt-rtc-time-reg:
|
||||
$ref: /schemas/types.yaml#/definitions/phandle-array
|
||||
items:
|
||||
- items:
|
||||
- description: Phandle to the GPBR node.
|
||||
- description: Offset within the GPBR block.
|
||||
description:
|
||||
Should encode the GPBR register used to store the time base when the
|
||||
RTT is used as an RTC. The first cell should point to the GPBR node
|
||||
and the second one encodes the offset within the GPBR block (or in
|
||||
other words, the GPBR register used to store the time base).
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
- clocks
|
||||
- atmel,rtt-rtc-time-reg
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/interrupt-controller/irq.h>
|
||||
|
||||
rtc@fffffd20 {
|
||||
compatible = "atmel,at91sam9260-rtt";
|
||||
reg = <0xfffffd20 0x10>;
|
||||
interrupts = <1 IRQ_TYPE_LEVEL_HIGH 7>;
|
||||
clocks = <&clk32k>;
|
||||
atmel,rtt-rtc-time-reg = <&gpbr 0x0>;
|
||||
};
|
||||
@@ -152,6 +152,7 @@ patternProperties:
|
||||
- enum:
|
||||
- ingenic,jz4740-pwm
|
||||
- ingenic,jz4725b-pwm
|
||||
- ingenic,x1000-pwm
|
||||
- items:
|
||||
- enum:
|
||||
- ingenic,jz4760-pwm
|
||||
|
||||
@@ -560,6 +560,8 @@ patternProperties:
|
||||
description: Ingenieurburo Fur Ic-Technologie (I/F/I)
|
||||
"^ilitek,.*":
|
||||
description: ILI Technology Corporation (ILITEK)
|
||||
"^imagis,.*":
|
||||
description: Imagis Technologies Co., Ltd.
|
||||
"^img,.*":
|
||||
description: Imagination Technologies Ltd.
|
||||
"^imi,.*":
|
||||
|
||||
@@ -55,6 +55,11 @@ properties:
|
||||
- renesas,r8a779a0-wdt # R-Car V3U
|
||||
- const: renesas,rcar-gen3-wdt # R-Car Gen3 and RZ/G2
|
||||
|
||||
- items:
|
||||
- enum:
|
||||
- renesas,r8a779f0-wdt # R-Car S4-8
|
||||
- const: renesas,rcar-gen4-wdt # R-Car Gen4
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
|
||||
@@ -7,6 +7,8 @@ Network Filesystem Helper Library
|
||||
.. Contents:
|
||||
|
||||
- Overview.
|
||||
- Per-inode context.
|
||||
- Inode context helper functions.
|
||||
- Buffered read helpers.
|
||||
- Read helper functions.
|
||||
- Read helper structures.
|
||||
@@ -28,6 +30,69 @@ Note that the library module doesn't link against local caching directly, so
|
||||
access must be provided by the netfs.
|
||||
|
||||
|
||||
Per-Inode Context
|
||||
=================
|
||||
|
||||
The network filesystem helper library needs a place to store a bit of state for
|
||||
its use on each netfs inode it is helping to manage. To this end, a context
|
||||
structure is defined::
|
||||
|
||||
struct netfs_i_context {
|
||||
const struct netfs_request_ops *ops;
|
||||
struct fscache_cookie *cache;
|
||||
};
|
||||
|
||||
A network filesystem that wants to use netfs lib must place one of these
|
||||
directly after the VFS ``struct inode`` it allocates, usually as part of its
|
||||
own struct. This can be done in a way similar to the following::
|
||||
|
||||
struct my_inode {
|
||||
struct {
|
||||
/* These must be contiguous */
|
||||
struct inode vfs_inode;
|
||||
struct netfs_i_context netfs_ctx;
|
||||
};
|
||||
...
|
||||
};
|
||||
|
||||
This allows netfslib to find its state by simple offset from the inode pointer,
|
||||
thereby allowing the netfslib helper functions to be pointed to directly by the
|
||||
VFS/VM operation tables.
|
||||
|
||||
The structure contains the following fields:
|
||||
|
||||
* ``ops``
|
||||
|
||||
The set of operations provided by the network filesystem to netfslib.
|
||||
|
||||
* ``cache``
|
||||
|
||||
Local caching cookie, or NULL if no caching is enabled. This field does not
|
||||
exist if fscache is disabled.
|
||||
|
||||
|
||||
Inode Context Helper Functions
|
||||
------------------------------
|
||||
|
||||
To help deal with the per-inode context, a number helper functions are
|
||||
provided. Firstly, a function to perform basic initialisation on a context and
|
||||
set the operations table pointer::
|
||||
|
||||
void netfs_i_context_init(struct inode *inode,
|
||||
const struct netfs_request_ops *ops);
|
||||
|
||||
then two functions to cast between the VFS inode structure and the netfs
|
||||
context::
|
||||
|
||||
struct netfs_i_context *netfs_i_context(struct inode *inode);
|
||||
struct inode *netfs_inode(struct netfs_i_context *ctx);
|
||||
|
||||
and finally, a function to get the cache cookie pointer from the context
|
||||
attached to an inode (or NULL if fscache is disabled)::
|
||||
|
||||
struct fscache_cookie *netfs_i_cookie(struct inode *inode);
|
||||
|
||||
|
||||
Buffered Read Helpers
|
||||
=====================
|
||||
|
||||
@@ -70,38 +135,22 @@ Read Helper Functions
|
||||
|
||||
Three read helpers are provided::
|
||||
|
||||
void netfs_readahead(struct readahead_control *ractl,
|
||||
const struct netfs_read_request_ops *ops,
|
||||
void *netfs_priv);
|
||||
void netfs_readahead(struct readahead_control *ractl);
|
||||
int netfs_readpage(struct file *file,
|
||||
struct folio *folio,
|
||||
const struct netfs_read_request_ops *ops,
|
||||
void *netfs_priv);
|
||||
struct page *page);
|
||||
int netfs_write_begin(struct file *file,
|
||||
struct address_space *mapping,
|
||||
loff_t pos,
|
||||
unsigned int len,
|
||||
unsigned int flags,
|
||||
struct folio **_folio,
|
||||
void **_fsdata,
|
||||
const struct netfs_read_request_ops *ops,
|
||||
void *netfs_priv);
|
||||
void **_fsdata);
|
||||
|
||||
Each corresponds to a VM operation, with the addition of a couple of parameters
|
||||
for the use of the read helpers:
|
||||
Each corresponds to a VM address space operation. These operations use the
|
||||
state in the per-inode context.
|
||||
|
||||
* ``ops``
|
||||
|
||||
A table of operations through which the helpers can talk to the filesystem.
|
||||
|
||||
* ``netfs_priv``
|
||||
|
||||
Filesystem private data (can be NULL).
|
||||
|
||||
Both of these values will be stored into the read request structure.
|
||||
|
||||
For ->readahead() and ->readpage(), the network filesystem should just jump
|
||||
into the corresponding read helper; whereas for ->write_begin(), it may be a
|
||||
For ->readahead() and ->readpage(), the network filesystem just point directly
|
||||
at the corresponding read helper; whereas for ->write_begin(), it may be a
|
||||
little more complicated as the network filesystem might want to flush
|
||||
conflicting writes or track dirty data and needs to put the acquired folio if
|
||||
an error occurs after calling the helper.
|
||||
@@ -116,7 +165,7 @@ occurs, the request will get partially completed if sufficient data is read.
|
||||
|
||||
Additionally, there is::
|
||||
|
||||
* void netfs_subreq_terminated(struct netfs_read_subrequest *subreq,
|
||||
* void netfs_subreq_terminated(struct netfs_io_subrequest *subreq,
|
||||
ssize_t transferred_or_error,
|
||||
bool was_async);
|
||||
|
||||
@@ -132,7 +181,7 @@ Read Helper Structures
|
||||
The read helpers make use of a couple of structures to maintain the state of
|
||||
the read. The first is a structure that manages a read request as a whole::
|
||||
|
||||
struct netfs_read_request {
|
||||
struct netfs_io_request {
|
||||
struct inode *inode;
|
||||
struct address_space *mapping;
|
||||
struct netfs_cache_resources cache_resources;
|
||||
@@ -140,7 +189,7 @@ the read. The first is a structure that manages a read request as a whole::
|
||||
loff_t start;
|
||||
size_t len;
|
||||
loff_t i_size;
|
||||
const struct netfs_read_request_ops *netfs_ops;
|
||||
const struct netfs_request_ops *netfs_ops;
|
||||
unsigned int debug_id;
|
||||
...
|
||||
};
|
||||
@@ -187,8 +236,8 @@ The above fields are the ones the netfs can use. They are:
|
||||
The second structure is used to manage individual slices of the overall read
|
||||
request::
|
||||
|
||||
struct netfs_read_subrequest {
|
||||
struct netfs_read_request *rreq;
|
||||
struct netfs_io_subrequest {
|
||||
struct netfs_io_request *rreq;
|
||||
loff_t start;
|
||||
size_t len;
|
||||
size_t transferred;
|
||||
@@ -244,32 +293,26 @@ Read Helper Operations
|
||||
The network filesystem must provide the read helpers with a table of operations
|
||||
through which it can issue requests and negotiate::
|
||||
|
||||
struct netfs_read_request_ops {
|
||||
void (*init_rreq)(struct netfs_read_request *rreq, struct file *file);
|
||||
bool (*is_cache_enabled)(struct inode *inode);
|
||||
int (*begin_cache_operation)(struct netfs_read_request *rreq);
|
||||
void (*expand_readahead)(struct netfs_read_request *rreq);
|
||||
bool (*clamp_length)(struct netfs_read_subrequest *subreq);
|
||||
void (*issue_op)(struct netfs_read_subrequest *subreq);
|
||||
bool (*is_still_valid)(struct netfs_read_request *rreq);
|
||||
struct netfs_request_ops {
|
||||
void (*init_request)(struct netfs_io_request *rreq, struct file *file);
|
||||
int (*begin_cache_operation)(struct netfs_io_request *rreq);
|
||||
void (*expand_readahead)(struct netfs_io_request *rreq);
|
||||
bool (*clamp_length)(struct netfs_io_subrequest *subreq);
|
||||
void (*issue_read)(struct netfs_io_subrequest *subreq);
|
||||
bool (*is_still_valid)(struct netfs_io_request *rreq);
|
||||
int (*check_write_begin)(struct file *file, loff_t pos, unsigned len,
|
||||
struct folio *folio, void **_fsdata);
|
||||
void (*done)(struct netfs_read_request *rreq);
|
||||
void (*done)(struct netfs_io_request *rreq);
|
||||
void (*cleanup)(struct address_space *mapping, void *netfs_priv);
|
||||
};
|
||||
|
||||
The operations are as follows:
|
||||
|
||||
* ``init_rreq()``
|
||||
* ``init_request()``
|
||||
|
||||
[Optional] This is called to initialise the request structure. It is given
|
||||
the file for reference and can modify the ->netfs_priv value.
|
||||
|
||||
* ``is_cache_enabled()``
|
||||
|
||||
[Required] This is called by netfs_write_begin() to ask if the file is being
|
||||
cached. It should return true if it is being cached and false otherwise.
|
||||
|
||||
* ``begin_cache_operation()``
|
||||
|
||||
[Optional] This is called to ask the network filesystem to call into the
|
||||
@@ -305,7 +348,7 @@ The operations are as follows:
|
||||
|
||||
This should return 0 on success and an error code on error.
|
||||
|
||||
* ``issue_op()``
|
||||
* ``issue_read()``
|
||||
|
||||
[Required] The helpers use this to dispatch a subrequest to the server for
|
||||
reading. In the subrequest, ->start, ->len and ->transferred indicate what
|
||||
@@ -420,12 +463,12 @@ The network filesystem's ->begin_cache_operation() method is called to set up a
|
||||
cache and this must call into the cache to do the work. If using fscache, for
|
||||
example, the cache would call::
|
||||
|
||||
int fscache_begin_read_operation(struct netfs_read_request *rreq,
|
||||
int fscache_begin_read_operation(struct netfs_io_request *rreq,
|
||||
struct fscache_cookie *cookie);
|
||||
|
||||
passing in the request pointer and the cookie corresponding to the file.
|
||||
|
||||
The netfs_read_request object contains a place for the cache to hang its
|
||||
The netfs_io_request object contains a place for the cache to hang its
|
||||
state::
|
||||
|
||||
struct netfs_cache_resources {
|
||||
@@ -443,7 +486,7 @@ operation table looks like the following::
|
||||
void (*expand_readahead)(struct netfs_cache_resources *cres,
|
||||
loff_t *_start, size_t *_len, loff_t i_size);
|
||||
|
||||
enum netfs_read_source (*prepare_read)(struct netfs_read_subrequest *subreq,
|
||||
enum netfs_io_source (*prepare_read)(struct netfs_io_subrequest *subreq,
|
||||
loff_t i_size);
|
||||
|
||||
int (*read)(struct netfs_cache_resources *cres,
|
||||
@@ -562,4 +605,5 @@ API Function Reference
|
||||
======================
|
||||
|
||||
.. kernel-doc:: include/linux/netfs.h
|
||||
.. kernel-doc:: fs/netfs/read_helper.c
|
||||
.. kernel-doc:: fs/netfs/buffered_read.c
|
||||
.. kernel-doc:: fs/netfs/io.c
|
||||
|
||||
@@ -49,17 +49,36 @@ example: ::
|
||||
LLVM Utilities
|
||||
--------------
|
||||
|
||||
LLVM has substitutes for GNU binutils utilities. Kbuild supports ``LLVM=1``
|
||||
to enable them. ::
|
||||
|
||||
make LLVM=1
|
||||
|
||||
They can be enabled individually. The full list of the parameters: ::
|
||||
LLVM has substitutes for GNU binutils utilities. They can be enabled individually.
|
||||
The full list of supported make variables::
|
||||
|
||||
make CC=clang LD=ld.lld AR=llvm-ar NM=llvm-nm STRIP=llvm-strip \
|
||||
OBJCOPY=llvm-objcopy OBJDUMP=llvm-objdump READELF=llvm-readelf \
|
||||
HOSTCC=clang HOSTCXX=clang++ HOSTAR=llvm-ar HOSTLD=ld.lld
|
||||
|
||||
To simplify the above command, Kbuild supports the ``LLVM`` variable::
|
||||
|
||||
make LLVM=1
|
||||
|
||||
If your LLVM tools are not available in your PATH, you can supply their
|
||||
location using the LLVM variable with a trailing slash::
|
||||
|
||||
make LLVM=/path/to/llvm/
|
||||
|
||||
which will use ``/path/to/llvm/clang``, ``/path/to/llvm/ld.lld``, etc.
|
||||
|
||||
If your LLVM tools have a version suffix and you want to test with that
|
||||
explicit version rather than the unsuffixed executables like ``LLVM=1``, you
|
||||
can pass the suffix using the ``LLVM`` variable::
|
||||
|
||||
make LLVM=-14
|
||||
|
||||
which will use ``clang-14``, ``ld.lld-14``, etc.
|
||||
|
||||
``LLVM=0`` is not the same as omitting ``LLVM`` altogether, it will behave like
|
||||
``LLVM=1``. If you only wish to use certain LLVM utilities, use their respective
|
||||
make variables.
|
||||
|
||||
The integrated assembler is enabled by default. You can pass ``LLVM_IAS=0`` to
|
||||
disable it.
|
||||
|
||||
|
||||
@@ -211,9 +211,6 @@ raw_spinlock_t and spinlock_t
|
||||
raw_spinlock_t
|
||||
--------------
|
||||
|
||||
raw_spinlock_t is a strict spinning lock implementation regardless of the
|
||||
kernel configuration including PREEMPT_RT enabled kernels.
|
||||
|
||||
raw_spinlock_t is a strict spinning lock implementation in all kernels,
|
||||
including PREEMPT_RT kernels. Use raw_spinlock_t only in real critical
|
||||
core code, low-level interrupt handling and places where disabling
|
||||
|
||||
@@ -12,6 +12,7 @@ additions to this manual.
|
||||
configure-git
|
||||
rebasing-and-merging
|
||||
pull-requests
|
||||
messy-diffstat
|
||||
maintainer-entry-profile
|
||||
modifying-patches
|
||||
|
||||
|
||||
@@ -0,0 +1,96 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
=====================================
|
||||
Handling messy pull-request diffstats
|
||||
=====================================
|
||||
|
||||
Subsystem maintainers routinely use ``git request-pull`` as part of the
|
||||
process of sending work upstream. Normally, the result includes a nice
|
||||
diffstat that shows which files will be touched and how much of each will
|
||||
be changed. Occasionally, though, a repository with a relatively
|
||||
complicated development history will yield a massive diffstat containing a
|
||||
great deal of unrelated work. The result looks ugly and obscures what the
|
||||
pull request is actually doing. This document describes what is happening
|
||||
and how to fix things up; it is derived from The Wisdom of Linus Torvalds,
|
||||
found in Linus1_ and Linus2_.
|
||||
|
||||
.. _Linus1: https://lore.kernel.org/lkml/CAHk-=wg3wXH2JNxkQi+eLZkpuxqV+wPiHhw_Jf7ViH33Sw7PHA@mail.gmail.com/
|
||||
.. _Linus2: https://lore.kernel.org/lkml/CAHk-=wgXbSa8yq8Dht8at+gxb_idnJ7X5qWZQWRBN4_CUPr=eQ@mail.gmail.com/
|
||||
|
||||
A Git development history proceeds as a series of commits. In a simplified
|
||||
manner, mainline kernel development looks like this::
|
||||
|
||||
... vM --- vN-rc1 --- vN-rc2 --- vN-rc3 --- ... --- vN-rc7 --- vN
|
||||
|
||||
If one wants to see what has changed between two points, a command like
|
||||
this will do the job::
|
||||
|
||||
$ git diff --stat --summary vN-rc2..vN-rc3
|
||||
|
||||
Here, there are two clear points in the history; Git will essentially
|
||||
"subtract" the beginning point from the end point and display the resulting
|
||||
differences. The requested operation is unambiguous and easy enough to
|
||||
understand.
|
||||
|
||||
When a subsystem maintainer creates a branch and commits changes to it, the
|
||||
result in the simplest case is a history that looks like::
|
||||
|
||||
... vM --- vN-rc1 --- vN-rc2 --- vN-rc3 --- ... --- vN-rc7 --- vN
|
||||
|
|
||||
+-- c1 --- c2 --- ... --- cN
|
||||
|
||||
If that maintainer now uses ``git diff`` to see what has changed between
|
||||
the mainline branch (let's call it "linus") and cN, there are still two
|
||||
clear endpoints, and the result is as expected. So a pull request
|
||||
generated with ``git request-pull`` will also be as expected. But now
|
||||
consider a slightly more complex development history::
|
||||
|
||||
... vM --- vN-rc1 --- vN-rc2 --- vN-rc3 --- ... --- vN-rc7 --- vN
|
||||
| |
|
||||
| +-- c1 --- c2 --- ... --- cN
|
||||
| /
|
||||
+-- x1 --- x2 --- x3
|
||||
|
||||
Our maintainer has created one branch at vN-rc1 and another at vN-rc2; the
|
||||
two were then subsequently merged into c2. Now a pull request generated
|
||||
for cN may end up being messy indeed, and developers often end up wondering
|
||||
why.
|
||||
|
||||
What is happening here is that there are no longer two clear end points for
|
||||
the ``git diff`` operation to use. The development culminating in cN
|
||||
started in two different places; to generate the diffstat, ``git diff``
|
||||
ends up having pick one of them and hoping for the best. If the diffstat
|
||||
starts at vN-rc1, it may end up including all of the changes between there
|
||||
and the second origin end point (vN-rc2), which is certainly not what our
|
||||
maintainer had in mind. With all of that extra junk in the diffstat, it
|
||||
may be impossible to tell what actually happened in the changes leading up
|
||||
to cN.
|
||||
|
||||
Maintainers often try to resolve this problem by, for example, rebasing the
|
||||
branch or performing another merge with the linus branch, then recreating
|
||||
the pull request. This approach tends not to lead to joy at the receiving
|
||||
end of that pull request; rebasing and/or merging just before pushing
|
||||
upstream is a well-known way to get a grumpy response.
|
||||
|
||||
So what is to be done? The best response when confronted with this
|
||||
situation is to indeed to do a merge with the branch you intend your work
|
||||
to be pulled into, but to do it privately, as if it were the source of
|
||||
shame. Create a new, throwaway branch and do the merge there::
|
||||
|
||||
... vM --- vN-rc1 --- vN-rc2 --- vN-rc3 --- ... --- vN-rc7 --- vN
|
||||
| | |
|
||||
| +-- c1 --- c2 --- ... --- cN |
|
||||
| / | |
|
||||
+-- x1 --- x2 --- x3 +------------+-- TEMP
|
||||
|
||||
The merge operation resolves all of the complications resulting from the
|
||||
multiple beginning points, yielding a coherent result that contains only
|
||||
the differences from the mainline branch. Now it will be possible to
|
||||
generate a diffstat with the desired information::
|
||||
|
||||
$ git diff -C --stat --summary linus..TEMP
|
||||
|
||||
Save the output from this command, then simply delete the TEMP branch;
|
||||
definitely do not expose it to the outside world. Take the saved diffstat
|
||||
output and edit it into the messy pull request, yielding a result that
|
||||
shows what is really going on. That request can then be sent upstream.
|
||||
@@ -1,12 +1,13 @@
|
||||
Linux Networking Documentation
|
||||
==============================
|
||||
|
||||
Refer to :ref:`netdev-FAQ` for a guide on netdev development process specifics.
|
||||
|
||||
Contents:
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
netdev-FAQ
|
||||
af_xdp
|
||||
bareudp
|
||||
batman-adv
|
||||
|
||||
@@ -16,3 +16,4 @@ Contents:
|
||||
:maxdepth: 2
|
||||
|
||||
maintainer-tip
|
||||
maintainer-netdev
|
||||
|
||||
+68
-46
@@ -16,12 +16,10 @@ Note that some subsystems (e.g. wireless drivers) which have a high
|
||||
volume of traffic have their own specific mailing lists.
|
||||
|
||||
The netdev list is managed (like many other Linux mailing lists) through
|
||||
VGER (http://vger.kernel.org/) and archives can be found below:
|
||||
VGER (http://vger.kernel.org/) with archives available at
|
||||
https://lore.kernel.org/netdev/
|
||||
|
||||
- http://marc.info/?l=linux-netdev
|
||||
- http://www.spinics.net/lists/netdev/
|
||||
|
||||
Aside from subsystems like that mentioned above, all network-related
|
||||
Aside from subsystems like those mentioned above, all network-related
|
||||
Linux development (i.e. RFC, review, comments, etc.) takes place on
|
||||
netdev.
|
||||
|
||||
@@ -37,6 +35,17 @@ for the future release. You can find the trees here:
|
||||
- https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git
|
||||
- https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git
|
||||
|
||||
How do I indicate which tree (net vs. net-next) my patch should be in?
|
||||
----------------------------------------------------------------------
|
||||
To help maintainers and CI bots you should explicitly mark which tree
|
||||
your patch is targeting. Assuming that you use git, use the prefix
|
||||
flag::
|
||||
|
||||
git format-patch --subject-prefix='PATCH net-next' start..finish
|
||||
|
||||
Use ``net`` instead of ``net-next`` (always lower case) in the above for
|
||||
bug-fix ``net`` content.
|
||||
|
||||
How often do changes from these trees make it to the mainline Linus tree?
|
||||
-------------------------------------------------------------------------
|
||||
To understand this, you need to know a bit of background information on
|
||||
@@ -61,8 +70,12 @@ relating to vX.Y
|
||||
An announcement indicating when ``net-next`` has been closed is usually
|
||||
sent to netdev, but knowing the above, you can predict that in advance.
|
||||
|
||||
IMPORTANT: Do not send new ``net-next`` content to netdev during the
|
||||
period during which ``net-next`` tree is closed.
|
||||
.. warning::
|
||||
Do not send new ``net-next`` content to netdev during the
|
||||
period during which ``net-next`` tree is closed.
|
||||
|
||||
RFC patches sent for review only are obviously welcome at any time
|
||||
(use ``--subject-prefix='RFC net-next'`` with ``git format-patch``).
|
||||
|
||||
Shortly after the two weeks have passed (and vX.Y-rc1 is released), the
|
||||
tree for ``net-next`` reopens to collect content for the next (vX.Y+1)
|
||||
@@ -90,41 +103,35 @@ Load the mainline (Linus) page here:
|
||||
|
||||
and note the top of the "tags" section. If it is rc1, it is early in
|
||||
the dev cycle. If it was tagged rc7 a week ago, then a release is
|
||||
probably imminent.
|
||||
probably imminent. If the most recent tag is a final release tag
|
||||
(without an ``-rcN`` suffix) - we are most likely in a merge window
|
||||
and ``net-next`` is closed.
|
||||
|
||||
How do I indicate which tree (net vs. net-next) my patch should be in?
|
||||
----------------------------------------------------------------------
|
||||
Firstly, think whether you have a bug fix or new "next-like" content.
|
||||
Then once decided, assuming that you use git, use the prefix flag, i.e.
|
||||
::
|
||||
|
||||
git format-patch --subject-prefix='PATCH net-next' start..finish
|
||||
|
||||
Use ``net`` instead of ``net-next`` (always lower case) in the above for
|
||||
bug-fix ``net`` content. If you don't use git, then note the only magic
|
||||
in the above is just the subject text of the outgoing e-mail, and you
|
||||
can manually change it yourself with whatever MUA you are comfortable
|
||||
with.
|
||||
|
||||
I sent a patch and I'm wondering what happened to it - how can I tell whether it got merged?
|
||||
--------------------------------------------------------------------------------------------
|
||||
How can I tell the status of a patch I've sent?
|
||||
-----------------------------------------------
|
||||
Start by looking at the main patchworks queue for netdev:
|
||||
|
||||
https://patchwork.kernel.org/project/netdevbpf/list/
|
||||
|
||||
The "State" field will tell you exactly where things are at with your
|
||||
patch.
|
||||
patch. Patches are indexed by the ``Message-ID`` header of the emails
|
||||
which carried them so if you have trouble finding your patch append
|
||||
the value of ``Message-ID`` to the URL above.
|
||||
|
||||
The above only says "Under Review". How can I find out more?
|
||||
-------------------------------------------------------------
|
||||
How long before my patch is accepted?
|
||||
-------------------------------------
|
||||
Generally speaking, the patches get triaged quickly (in less than
|
||||
48h). So be patient. Asking the maintainer for status updates on your
|
||||
48h). But be patient, if your patch is active in patchwork (i.e. it's
|
||||
listed on the project's patch list) the chances it was missed are close to zero.
|
||||
Asking the maintainer for status updates on your
|
||||
patch is a good way to ensure your patch is ignored or pushed to the
|
||||
bottom of the priority list.
|
||||
|
||||
I submitted multiple versions of the patch series. Should I directly update patchwork for the previous versions of these patch series?
|
||||
--------------------------------------------------------------------------------------------------------------------------------------
|
||||
No, please don't interfere with the patch status on patchwork, leave
|
||||
Should I directly update patchwork state of my own patches?
|
||||
-----------------------------------------------------------
|
||||
It may be tempting to help the maintainers and update the state of your
|
||||
own patches when you post a new version or spot a bug. Please do not do that.
|
||||
Interfering with the patch status on patchwork will only cause confusion. Leave
|
||||
it to the maintainer to figure out what is the most recent and current
|
||||
version that should be applied. If there is any doubt, the maintainer
|
||||
will reply and ask what should be done.
|
||||
@@ -135,6 +142,17 @@ No, please resend the entire patch series and make sure you do number your
|
||||
patches such that it is clear this is the latest and greatest set of patches
|
||||
that can be applied.
|
||||
|
||||
I have received review feedback, when should I post a revised version of the patches?
|
||||
-------------------------------------------------------------------------------------
|
||||
Allow at least 24 hours to pass between postings. This will ensure reviewers
|
||||
from all geographical locations have a chance to chime in. Do not wait
|
||||
too long (weeks) between postings either as it will make it harder for reviewers
|
||||
to recall all the context.
|
||||
|
||||
Make sure you address all the feedback in your new posting. Do not post a new
|
||||
version of the code if the discussion about the previous version is still
|
||||
ongoing, unless directly instructed by a reviewer.
|
||||
|
||||
I submitted multiple versions of a patch series and it looks like a version other than the last one has been accepted, what should I do?
|
||||
----------------------------------------------------------------------------------------------------------------------------------------
|
||||
There is no revert possible, once it is pushed out, it stays like that.
|
||||
@@ -165,10 +183,10 @@ it is requested that you make it look like this::
|
||||
* another line of text
|
||||
*/
|
||||
|
||||
I am working in existing code that has the former comment style and not the latter. Should I submit new code in the former style or the latter?
|
||||
-----------------------------------------------------------------------------------------------------------------------------------------------
|
||||
Make it the latter style, so that eventually all code in the domain
|
||||
of netdev is of this format.
|
||||
I am working in existing code which uses non-standard formatting. Which formatting should I use?
|
||||
------------------------------------------------------------------------------------------------
|
||||
Make your code follow the most recent guidelines, so that eventually all code
|
||||
in the domain of netdev is in the preferred format.
|
||||
|
||||
I found a bug that might have possible security implications or similar. Should I mail the main netdev maintainer off-list?
|
||||
---------------------------------------------------------------------------------------------------------------------------
|
||||
@@ -180,11 +198,15 @@ as possible alternative mechanisms.
|
||||
|
||||
What level of testing is expected before I submit my change?
|
||||
------------------------------------------------------------
|
||||
If your changes are against ``net-next``, the expectation is that you
|
||||
have tested by layering your changes on top of ``net-next``. Ideally
|
||||
you will have done run-time testing specific to your change, but at a
|
||||
minimum, your changes should survive an ``allyesconfig`` and an
|
||||
``allmodconfig`` build without new warnings or failures.
|
||||
At the very minimum your changes must survive an ``allyesconfig`` and an
|
||||
``allmodconfig`` build with ``W=1`` set without new warnings or failures.
|
||||
|
||||
Ideally you will have done run-time testing specific to your change,
|
||||
and the patch series contains a set of kernel selftest for
|
||||
``tools/testing/selftests/net`` or using the KUnit framework.
|
||||
|
||||
You are expected to test your changes on top of the relevant networking
|
||||
tree (``net`` or ``net-next``) and not e.g. a stable tree or ``linux-next``.
|
||||
|
||||
How do I post corresponding changes to user space components?
|
||||
-------------------------------------------------------------
|
||||
@@ -198,7 +220,7 @@ or the user space project is not reviewed on netdev include a link
|
||||
to a public repo where user space patches can be seen.
|
||||
|
||||
In case user space tooling lives in a separate repository but is
|
||||
reviewed on netdev (e.g. patches to `iproute2` tools) kernel and
|
||||
reviewed on netdev (e.g. patches to ``iproute2`` tools) kernel and
|
||||
user space patches should form separate series (threads) when posted
|
||||
to the mailing list, e.g.::
|
||||
|
||||
@@ -231,18 +253,18 @@ traffic if we can help it.
|
||||
netdevsim is great, can I extend it for my out-of-tree tests?
|
||||
-------------------------------------------------------------
|
||||
|
||||
No, `netdevsim` is a test vehicle solely for upstream tests.
|
||||
(Please add your tests under tools/testing/selftests/.)
|
||||
No, ``netdevsim`` is a test vehicle solely for upstream tests.
|
||||
(Please add your tests under ``tools/testing/selftests/``.)
|
||||
|
||||
We also give no guarantees that `netdevsim` won't change in the future
|
||||
We also give no guarantees that ``netdevsim`` won't change in the future
|
||||
in a way which would break what would normally be considered uAPI.
|
||||
|
||||
Is netdevsim considered a "user" of an API?
|
||||
-------------------------------------------
|
||||
|
||||
Linux kernel has a long standing rule that no API should be added unless
|
||||
it has a real, in-tree user. Mock-ups and tests based on `netdevsim` are
|
||||
strongly encouraged when adding new APIs, but `netdevsim` in itself
|
||||
it has a real, in-tree user. Mock-ups and tests based on ``netdevsim`` are
|
||||
strongly encouraged when adding new APIs, but ``netdevsim`` in itself
|
||||
is **not** considered a use case/user.
|
||||
|
||||
Any other tips to help ensure my net/net-next patch gets OK'd?
|
||||
@@ -128,6 +128,7 @@ class KernelCmd(Directive):
|
||||
return out
|
||||
|
||||
def nestedParse(self, lines, fname):
|
||||
env = self.state.document.settings.env
|
||||
content = ViewList()
|
||||
node = nodes.section()
|
||||
|
||||
@@ -137,7 +138,7 @@ class KernelCmd(Directive):
|
||||
code_block += "\n " + l
|
||||
lines = code_block + "\n\n"
|
||||
|
||||
line_regex = re.compile("^#define LINENO (\S+)\#([0-9]+)$")
|
||||
line_regex = re.compile("^\.\. LINENO (\S+)\#([0-9]+)$")
|
||||
ln = 0
|
||||
n = 0
|
||||
f = fname
|
||||
@@ -154,6 +155,9 @@ class KernelCmd(Directive):
|
||||
self.do_parse(content, node)
|
||||
content = ViewList()
|
||||
|
||||
# Add the file to Sphinx build dependencies
|
||||
env.note_dependency(os.path.abspath(f))
|
||||
|
||||
f = new_f
|
||||
|
||||
# sphinx counts lines from 0
|
||||
|
||||
@@ -33,6 +33,7 @@ u"""
|
||||
|
||||
import codecs
|
||||
import os
|
||||
import re
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
@@ -82,7 +83,7 @@ class KernelFeat(Directive):
|
||||
|
||||
env = doc.settings.env
|
||||
cwd = path.dirname(doc.current_source)
|
||||
cmd = "get_feat.pl rest --dir "
|
||||
cmd = "get_feat.pl rest --enable-fname --dir "
|
||||
cmd += self.arguments[0]
|
||||
|
||||
if len(self.arguments) > 1:
|
||||
@@ -102,7 +103,22 @@ class KernelFeat(Directive):
|
||||
shell_env["srctree"] = srctree
|
||||
|
||||
lines = self.runCmd(cmd, shell=True, cwd=cwd, env=shell_env)
|
||||
nodeList = self.nestedParse(lines, fname)
|
||||
|
||||
line_regex = re.compile("^\.\. FILE (\S+)$")
|
||||
|
||||
out_lines = ""
|
||||
|
||||
for line in lines.split("\n"):
|
||||
match = line_regex.search(line)
|
||||
if match:
|
||||
fname = match.group(1)
|
||||
|
||||
# Add the file to Sphinx build dependencies
|
||||
env.note_dependency(os.path.abspath(fname))
|
||||
else:
|
||||
out_lines += line + "\n"
|
||||
|
||||
nodeList = self.nestedParse(out_lines, fname)
|
||||
return nodeList
|
||||
|
||||
def runCmd(self, cmd, **kwargs):
|
||||
|
||||
@@ -59,6 +59,7 @@ class KernelInclude(Include):
|
||||
u"""KernelInclude (``kernel-include``) directive"""
|
||||
|
||||
def run(self):
|
||||
env = self.state.document.settings.env
|
||||
path = os.path.realpath(
|
||||
os.path.expandvars(self.arguments[0]))
|
||||
|
||||
@@ -70,6 +71,8 @@ class KernelInclude(Include):
|
||||
|
||||
self.arguments[0] = path
|
||||
|
||||
env.note_dependency(os.path.abspath(path))
|
||||
|
||||
#return super(KernelInclude, self).run() # won't work, see HINTs in _run()
|
||||
return self._run()
|
||||
|
||||
|
||||
@@ -130,7 +130,7 @@ class KernelDocDirective(Directive):
|
||||
result = ViewList()
|
||||
|
||||
lineoffset = 0;
|
||||
line_regex = re.compile("^#define LINENO ([0-9]+)$")
|
||||
line_regex = re.compile("^\.\. LINENO ([0-9]+)$")
|
||||
for line in lines:
|
||||
match = line_regex.search(line)
|
||||
if match:
|
||||
|
||||
@@ -212,7 +212,7 @@ def setupTools(app):
|
||||
if convert_cmd:
|
||||
kernellog.verbose(app, "use convert(1) from: " + convert_cmd)
|
||||
else:
|
||||
kernellog.warn(app,
|
||||
kernellog.verbose(app,
|
||||
"Neither inkscape(1) nor convert(1) found.\n"
|
||||
"For SVG to PDF conversion, "
|
||||
"install either Inkscape (https://inkscape.org/) (preferred) or\n"
|
||||
@@ -296,8 +296,10 @@ def convert_image(img_node, translator, src_fname=None):
|
||||
|
||||
if translator.builder.format == 'latex':
|
||||
if not inkscape_cmd and convert_cmd is None:
|
||||
kernellog.verbose(app,
|
||||
"no SVG to PDF conversion available / include SVG raw.")
|
||||
kernellog.warn(app,
|
||||
"no SVG to PDF conversion available / include SVG raw."
|
||||
"\nIncluding large raw SVGs can cause xelatex error."
|
||||
"\nInstall Inkscape (preferred) or ImageMagick.")
|
||||
img_node.replace_self(file2literal(src_fname))
|
||||
else:
|
||||
dst_fname = path.join(translator.builder.outdir, fname + '.pdf')
|
||||
|
||||
@@ -1,2 +1,4 @@
|
||||
# jinja2>=3.1 is not compatible with Sphinx<4.0
|
||||
jinja2<3.1
|
||||
sphinx_rtd_theme
|
||||
Sphinx==2.4.4
|
||||
|
||||
@@ -49,13 +49,14 @@ might also consider using dev_archdata for this).
|
||||
|
||||
::
|
||||
|
||||
void rproc_shutdown(struct rproc *rproc)
|
||||
int rproc_shutdown(struct rproc *rproc)
|
||||
|
||||
Power off a remote processor (previously booted with rproc_boot()).
|
||||
In case @rproc is still being used by an additional user(s), then
|
||||
this function will just decrement the power refcount and exit,
|
||||
without really powering off the device.
|
||||
|
||||
Returns 0 on success, and an appropriate error value otherwise.
|
||||
Every call to rproc_boot() must (eventually) be accompanied by a call
|
||||
to rproc_shutdown(). Calling rproc_shutdown() redundantly is a bug.
|
||||
|
||||
|
||||
@@ -1193,6 +1193,26 @@ E.g. ``os_close_file()`` is just a wrapper around ``close()``
|
||||
which ensures that the userspace function close does not clash
|
||||
with similarly named function(s) in the kernel part.
|
||||
|
||||
Using UML as a Test Platform
|
||||
============================
|
||||
|
||||
UML is an excellent test platform for device driver development. As
|
||||
with most things UML, "some user assembly may be required". It is
|
||||
up to the user to build their emulation environment. UML at present
|
||||
provides only the kernel infrastructure.
|
||||
|
||||
Part of this infrastructure is the ability to load and parse fdt
|
||||
device tree blobs as used in Arm or Open Firmware platforms. These
|
||||
are supplied as an optional extra argument to the kernel command
|
||||
line::
|
||||
|
||||
dtb=filename
|
||||
|
||||
The device tree is loaded and parsed at boottime and is accessible by
|
||||
drivers which query it. At this moment in time this facility is
|
||||
intended solely for development purposes. UML's own devices do not
|
||||
query the device tree.
|
||||
|
||||
Security Considerations
|
||||
-----------------------
|
||||
|
||||
|
||||
+16
-2
@@ -9517,6 +9517,12 @@ M: Stanislaw Gruszka <stf_xl@wp.pl>
|
||||
S: Maintained
|
||||
F: drivers/usb/atm/ueagle-atm.c
|
||||
|
||||
IMAGIS TOUCHSCREEN DRIVER
|
||||
M: Markuss Broks <markuss.broks@gmail.com>
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml
|
||||
F: drivers/input/touchscreen/imagis.c
|
||||
|
||||
IMGTEC ASCII LCD DRIVER
|
||||
M: Paul Burton <paulburton@kernel.org>
|
||||
S: Maintained
|
||||
@@ -13660,6 +13666,7 @@ B: mailto:netdev@vger.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git
|
||||
F: Documentation/networking/
|
||||
F: Documentation/process/maintainer-netdev.rst
|
||||
F: include/linux/in.h
|
||||
F: include/linux/net.h
|
||||
F: include/linux/netdevice.h
|
||||
@@ -14628,6 +14635,12 @@ L: op-tee@lists.trustedfirmware.org
|
||||
S: Maintained
|
||||
F: drivers/char/hw_random/optee-rng.c
|
||||
|
||||
OP-TEE RTC DRIVER
|
||||
M: Clément Léger <clement.leger@bootlin.com>
|
||||
L: linux-rtc@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/rtc/rtc-optee.c
|
||||
|
||||
OPA-VNIC DRIVER
|
||||
M: Dennis Dalessandro <dennis.dalessandro@cornelisnetworks.com>
|
||||
M: Mike Marciniszyn <mike.marciniszyn@cornelisnetworks.com>
|
||||
@@ -20545,14 +20558,15 @@ F: Documentation/admin-guide/media/zr364xx*
|
||||
F: drivers/media/usb/zr364xx/
|
||||
|
||||
USER-MODE LINUX (UML)
|
||||
M: Jeff Dike <jdike@addtoit.com>
|
||||
M: Richard Weinberger <richard@nod.at>
|
||||
M: Anton Ivanov <anton.ivanov@cambridgegreys.com>
|
||||
M: Johannes Berg <johannes@sipsolutions.net>
|
||||
L: linux-um@lists.infradead.org
|
||||
S: Maintained
|
||||
W: http://user-mode-linux.sourceforge.net
|
||||
Q: https://patchwork.ozlabs.org/project/linux-um/list/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/rw/uml.git
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/uml/linux.git next
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/uml/linux.git fixes
|
||||
F: Documentation/virt/uml/
|
||||
F: arch/um/
|
||||
F: arch/x86/um/
|
||||
|
||||
@@ -442,8 +442,14 @@ HOST_LFS_LDFLAGS := $(shell getconf LFS_LDFLAGS 2>/dev/null)
|
||||
HOST_LFS_LIBS := $(shell getconf LFS_LIBS 2>/dev/null)
|
||||
|
||||
ifneq ($(LLVM),)
|
||||
HOSTCC = clang
|
||||
HOSTCXX = clang++
|
||||
ifneq ($(filter %/,$(LLVM)),)
|
||||
LLVM_PREFIX := $(LLVM)
|
||||
else ifneq ($(filter -%,$(LLVM)),)
|
||||
LLVM_SUFFIX := $(LLVM)
|
||||
endif
|
||||
|
||||
HOSTCC = $(LLVM_PREFIX)clang$(LLVM_SUFFIX)
|
||||
HOSTCXX = $(LLVM_PREFIX)clang++$(LLVM_SUFFIX)
|
||||
else
|
||||
HOSTCC = gcc
|
||||
HOSTCXX = g++
|
||||
@@ -463,14 +469,14 @@ KBUILD_HOSTLDLIBS := $(HOST_LFS_LIBS) $(HOSTLDLIBS)
|
||||
# Make variables (CC, etc...)
|
||||
CPP = $(CC) -E
|
||||
ifneq ($(LLVM),)
|
||||
CC = clang
|
||||
LD = ld.lld
|
||||
AR = llvm-ar
|
||||
NM = llvm-nm
|
||||
OBJCOPY = llvm-objcopy
|
||||
OBJDUMP = llvm-objdump
|
||||
READELF = llvm-readelf
|
||||
STRIP = llvm-strip
|
||||
CC = $(LLVM_PREFIX)clang$(LLVM_SUFFIX)
|
||||
LD = $(LLVM_PREFIX)ld.lld$(LLVM_SUFFIX)
|
||||
AR = $(LLVM_PREFIX)llvm-ar$(LLVM_SUFFIX)
|
||||
NM = $(LLVM_PREFIX)llvm-nm$(LLVM_SUFFIX)
|
||||
OBJCOPY = $(LLVM_PREFIX)llvm-objcopy$(LLVM_SUFFIX)
|
||||
OBJDUMP = $(LLVM_PREFIX)llvm-objdump$(LLVM_SUFFIX)
|
||||
READELF = $(LLVM_PREFIX)llvm-readelf$(LLVM_SUFFIX)
|
||||
STRIP = $(LLVM_PREFIX)llvm-strip$(LLVM_SUFFIX)
|
||||
else
|
||||
CC = $(CROSS_COMPILE)gcc
|
||||
LD = $(CROSS_COMPILE)ld
|
||||
@@ -1303,8 +1309,8 @@ define filechk_version.h
|
||||
echo \#define LINUX_VERSION_SUBLEVEL $(SUBLEVEL)
|
||||
endef
|
||||
|
||||
$(version_h): PATCHLEVEL := $(if $(PATCHLEVEL), $(PATCHLEVEL), 0)
|
||||
$(version_h): SUBLEVEL := $(if $(SUBLEVEL), $(SUBLEVEL), 0)
|
||||
$(version_h): PATCHLEVEL := $(or $(PATCHLEVEL), 0)
|
||||
$(version_h): SUBLEVEL := $(or $(SUBLEVEL), 0)
|
||||
$(version_h): FORCE
|
||||
$(call filechk,version.h)
|
||||
|
||||
@@ -1664,7 +1670,7 @@ help:
|
||||
@$(MAKE) -f $(srctree)/Documentation/Makefile dochelp
|
||||
@echo ''
|
||||
@echo 'Architecture specific targets ($(SRCARCH)):'
|
||||
@$(if $(archhelp),$(archhelp),\
|
||||
@$(or $(archhelp),\
|
||||
echo ' No architecture specific help defined for $(SRCARCH)')
|
||||
@echo ''
|
||||
@$(if $(boards), \
|
||||
@@ -1883,7 +1889,7 @@ $(clean-dirs):
|
||||
|
||||
clean: $(clean-dirs)
|
||||
$(call cmd,rmfiles)
|
||||
@find $(if $(KBUILD_EXTMOD), $(KBUILD_EXTMOD), .) $(RCS_FIND_IGNORE) \
|
||||
@find $(or $(KBUILD_EXTMOD), .) $(RCS_FIND_IGNORE) \
|
||||
\( -name '*.[aios]' -o -name '*.ko' -o -name '.*.cmd' \
|
||||
-o -name '*.ko.*' \
|
||||
-o -name '*.dtb' -o -name '*.dtbo' -o -name '*.dtb.S' -o -name '*.dt.yaml' \
|
||||
|
||||
+7
-1
@@ -164,7 +164,13 @@ config ARCH_USE_BUILTIN_BSWAP
|
||||
|
||||
config KRETPROBES
|
||||
def_bool y
|
||||
depends on KPROBES && HAVE_KRETPROBES
|
||||
depends on KPROBES && (HAVE_KRETPROBES || HAVE_RETHOOK)
|
||||
|
||||
config KRETPROBE_ON_RETHOOK
|
||||
def_bool y
|
||||
depends on HAVE_RETHOOK
|
||||
depends on KRETPROBES
|
||||
select RETHOOK
|
||||
|
||||
config USER_RETURN_NOTIFIER
|
||||
bool
|
||||
|
||||
@@ -2,8 +2,7 @@
|
||||
kapi := arch/$(SRCARCH)/include/generated/asm
|
||||
uapi := arch/$(SRCARCH)/include/generated/uapi/asm
|
||||
|
||||
_dummy := $(shell [ -d '$(uapi)' ] || mkdir -p '$(uapi)') \
|
||||
$(shell [ -d '$(kapi)' ] || mkdir -p '$(kapi)')
|
||||
$(shell mkdir -p $(uapi) $(kapi))
|
||||
|
||||
syscall := $(src)/syscall.tbl
|
||||
syshdr := $(srctree)/scripts/syscallhdr.sh
|
||||
|
||||
@@ -102,6 +102,8 @@ config CRYPTO_AES_ARM_BS
|
||||
depends on KERNEL_MODE_NEON
|
||||
select CRYPTO_SKCIPHER
|
||||
select CRYPTO_LIB_AES
|
||||
select CRYPTO_AES
|
||||
select CRYPTO_CBC
|
||||
select CRYPTO_SIMD
|
||||
help
|
||||
Use a faster and more secure NEON based implementation of AES in CBC,
|
||||
|
||||
@@ -381,6 +381,7 @@ out:
|
||||
*/
|
||||
postcore_initcall(atomic_pool_init);
|
||||
|
||||
#ifdef CONFIG_CMA_AREAS
|
||||
struct dma_contig_early_reserve {
|
||||
phys_addr_t base;
|
||||
unsigned long size;
|
||||
@@ -435,6 +436,7 @@ void __init dma_contiguous_remap(void)
|
||||
iotable_init(&map, 1);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static int __dma_update_pte(pte_t *pte, unsigned long addr, void *data)
|
||||
{
|
||||
|
||||
@@ -88,6 +88,10 @@ extern phys_addr_t arm_lowmem_limit;
|
||||
|
||||
void __init bootmem_init(void);
|
||||
void arm_mm_memblock_reserve(void);
|
||||
#ifdef CONFIG_CMA_AREAS
|
||||
void dma_contiguous_remap(void);
|
||||
#else
|
||||
static inline void dma_contiguous_remap(void) { }
|
||||
#endif
|
||||
|
||||
unsigned long __clear_cr(unsigned long mask);
|
||||
|
||||
@@ -29,8 +29,7 @@ kapi: $(kapi-hdrs-y) $(gen-y)
|
||||
uapi: $(uapi-hdrs-y)
|
||||
|
||||
# Create output directory if not already present
|
||||
_dummy := $(shell [ -d '$(kapi)' ] || mkdir -p '$(kapi)') \
|
||||
$(shell [ -d '$(uapi)' ] || mkdir -p '$(uapi)')
|
||||
$(shell mkdir -p $(kapi) $(uapi))
|
||||
|
||||
quiet_cmd_gen_mach = GEN $@
|
||||
cmd_gen_mach = $(AWK) -f $(real-prereqs) > $@
|
||||
|
||||
@@ -2,8 +2,7 @@
|
||||
kapi := arch/$(SRCARCH)/include/generated/asm
|
||||
uapi := arch/$(SRCARCH)/include/generated/uapi/asm
|
||||
|
||||
_dummy := $(shell [ -d '$(uapi)' ] || mkdir -p '$(uapi)') \
|
||||
$(shell [ -d '$(kapi)' ] || mkdir -p '$(kapi)')
|
||||
$(shell mkdir -p $(uapi) $(kapi))
|
||||
|
||||
syscall := $(src)/syscall.tbl
|
||||
syshdr := $(srctree)/scripts/syscallhdr.sh
|
||||
|
||||
@@ -2,8 +2,7 @@
|
||||
kapi := arch/$(SRCARCH)/include/generated/asm
|
||||
uapi := arch/$(SRCARCH)/include/generated/uapi/asm
|
||||
|
||||
_dummy := $(shell [ -d '$(uapi)' ] || mkdir -p '$(uapi)') \
|
||||
$(shell [ -d '$(kapi)' ] || mkdir -p '$(kapi)')
|
||||
$(shell mkdir -p $(uapi) $(kapi))
|
||||
|
||||
syscall := $(src)/syscall.tbl
|
||||
syshdr := $(srctree)/scripts/syscallhdr.sh
|
||||
|
||||
@@ -29,7 +29,7 @@ $(obj)/simpleImage.$(DTB).ub: $(obj)/simpleImage.$(DTB) FORCE
|
||||
$(call if_changed,uimage)
|
||||
|
||||
$(obj)/simpleImage.$(DTB).unstrip: vmlinux FORCE
|
||||
$(call if_changed,shipped)
|
||||
$(call if_changed,copy)
|
||||
|
||||
$(obj)/simpleImage.$(DTB).strip: vmlinux FORCE
|
||||
$(call if_changed,strip)
|
||||
|
||||
@@ -12,7 +12,7 @@ $(obj)/linked_dtb.o: $(obj)/system.dtb
|
||||
# Generate system.dtb from $(DTB).dtb
|
||||
ifneq ($(DTB),system)
|
||||
$(obj)/system.dtb: $(obj)/$(DTB).dtb
|
||||
$(call if_changed,shipped)
|
||||
$(call if_changed,copy)
|
||||
endif
|
||||
endif
|
||||
|
||||
|
||||
@@ -2,8 +2,7 @@
|
||||
kapi := arch/$(SRCARCH)/include/generated/asm
|
||||
uapi := arch/$(SRCARCH)/include/generated/uapi/asm
|
||||
|
||||
_dummy := $(shell [ -d '$(uapi)' ] || mkdir -p '$(uapi)') \
|
||||
$(shell [ -d '$(kapi)' ] || mkdir -p '$(kapi)')
|
||||
$(shell mkdir -p $(uapi) $(kapi))
|
||||
|
||||
syscall := $(src)/syscall.tbl
|
||||
syshdr := $(srctree)/scripts/syscallhdr.sh
|
||||
|
||||
@@ -2,8 +2,7 @@
|
||||
kapi := arch/$(SRCARCH)/include/generated/asm
|
||||
uapi := arch/$(SRCARCH)/include/generated/uapi/asm
|
||||
|
||||
_dummy := $(shell [ -d '$(uapi)' ] || mkdir -p '$(uapi)') \
|
||||
$(shell [ -d '$(kapi)' ] || mkdir -p '$(kapi)')
|
||||
$(shell mkdir -p $(uapi) $(kapi))
|
||||
|
||||
syshdr := $(srctree)/scripts/syscallhdr.sh
|
||||
sysnr := $(srctree)/$(src)/syscallnr.sh
|
||||
|
||||
+3
-9
@@ -37,7 +37,7 @@ config PARISC
|
||||
select GENERIC_PCI_IOMAP
|
||||
select ARCH_HAVE_NMI_SAFE_CMPXCHG
|
||||
select GENERIC_SMP_IDLE_THREAD
|
||||
select GENERIC_CPU_DEVICES
|
||||
select GENERIC_ARCH_TOPOLOGY if SMP
|
||||
select GENERIC_LIB_DEVMEM_IS_ALLOWED
|
||||
select SYSCTL_ARCH_UNALIGN_ALLOW
|
||||
select SYSCTL_EXCEPTION_TRACE
|
||||
@@ -56,6 +56,7 @@ config PARISC
|
||||
select HAVE_ARCH_TRACEHOOK
|
||||
select HAVE_REGS_AND_STACK_ACCESS_API
|
||||
select GENERIC_SCHED_CLOCK
|
||||
select GENERIC_IRQ_MIGRATION if SMP
|
||||
select HAVE_UNSTABLE_SCHED_CLOCK if SMP
|
||||
select LEGACY_TIMER_TICK
|
||||
select CPU_NO_EFFICIENT_FFS
|
||||
@@ -279,16 +280,9 @@ config SMP
|
||||
|
||||
If you don't know what to do here, say N.
|
||||
|
||||
config PARISC_CPU_TOPOLOGY
|
||||
bool "Support cpu topology definition"
|
||||
depends on SMP
|
||||
default y
|
||||
help
|
||||
Support PARISC cpu topology definition.
|
||||
|
||||
config SCHED_MC
|
||||
bool "Multi-core scheduler support"
|
||||
depends on PARISC_CPU_TOPOLOGY && PA8X00
|
||||
depends on GENERIC_ARCH_TOPOLOGY && PA8X00
|
||||
help
|
||||
Multi-core scheduler support improves the CPU scheduler's decision
|
||||
making when dealing with multi-core CPU chips at a cost of slightly
|
||||
|
||||
@@ -42,7 +42,7 @@ export LD_BFD
|
||||
|
||||
# Set default 32 bits cross compilers for vdso
|
||||
CC_ARCHES_32 = hppa hppa2.0 hppa1.1
|
||||
CC_SUFFIXES = linux linux-gnu unknown-linux-gnu
|
||||
CC_SUFFIXES = linux linux-gnu unknown-linux-gnu suse-linux
|
||||
CROSS32_COMPILE := $(call cc-cross-prefix, \
|
||||
$(foreach a,$(CC_ARCHES_32), \
|
||||
$(foreach s,$(CC_SUFFIXES),$(a)-$(s)-)))
|
||||
@@ -52,7 +52,7 @@ export CROSS32CC
|
||||
# Set default cross compiler for kernel build
|
||||
ifdef cross_compiling
|
||||
ifeq ($(CROSS_COMPILE),)
|
||||
CC_SUFFIXES = linux linux-gnu unknown-linux-gnu
|
||||
CC_SUFFIXES = linux linux-gnu unknown-linux-gnu suse-linux
|
||||
CROSS_COMPILE := $(call cc-cross-prefix, \
|
||||
$(foreach a,$(CC_ARCHES), \
|
||||
$(foreach s,$(CC_SUFFIXES),$(a)-$(s)-)))
|
||||
|
||||
@@ -94,6 +94,9 @@ int pdc_sti_call(unsigned long func, unsigned long flags,
|
||||
unsigned long glob_cfg);
|
||||
|
||||
int __pdc_cpu_rendezvous(void);
|
||||
void pdc_cpu_rendezvous_lock(void);
|
||||
void pdc_cpu_rendezvous_unlock(void);
|
||||
|
||||
static inline char * os_id_to_string(u16 os_id) {
|
||||
switch(os_id) {
|
||||
case OS_ID_NONE: return "No OS";
|
||||
|
||||
@@ -83,6 +83,7 @@
|
||||
#define PDC_PAT_CPU_RENDEZVOUS 6L /* Rendezvous CPU */
|
||||
#define PDC_PAT_CPU_GET_CLOCK_INFO 7L /* Return CPU Clock info */
|
||||
#define PDC_PAT_CPU_GET_RENDEZVOUS_STATE 8L /* Return Rendezvous State */
|
||||
#define PDC_PAT_CPU_GET_PDC_ENTRYPOINT 11L /* Return PDC Entry point */
|
||||
#define PDC_PAT_CPU_PLUNGE_FABRIC 128L /* Plunge Fabric */
|
||||
#define PDC_PAT_CPU_UPDATE_CACHE_CLEANSING 129L /* Manipulate Cache
|
||||
* Cleansing Mode */
|
||||
@@ -356,7 +357,7 @@ struct pdc_pat_cell_mod_maddr_block { /* PDC_PAT_CELL_MODULE */
|
||||
|
||||
typedef struct pdc_pat_cell_mod_maddr_block pdc_pat_cell_mod_maddr_block_t;
|
||||
|
||||
|
||||
extern int pdc_pat_get_PDC_entrypoint(unsigned long *pdc_entry);
|
||||
extern int pdc_pat_chassis_send_log(unsigned long status, unsigned long data);
|
||||
extern int pdc_pat_cell_get_number(struct pdc_pat_cell_num *cell_info);
|
||||
extern int pdc_pat_cell_info(struct pdc_pat_cell_info_rtn_block *info,
|
||||
|
||||
@@ -95,6 +95,7 @@ struct cpuinfo_parisc {
|
||||
|
||||
extern struct system_cpuinfo_parisc boot_cpu_data;
|
||||
DECLARE_PER_CPU(struct cpuinfo_parisc, cpu_data);
|
||||
extern int time_keeper_id; /* CPU used for timekeeping */
|
||||
|
||||
#define CPU_HVERSION ((boot_cpu_data.hversion >> 4) & 0x0FFF)
|
||||
|
||||
|
||||
@@ -44,12 +44,7 @@ static inline void smp_send_all_nop(void) { return; }
|
||||
|
||||
#define NO_PROC_ID 0xFF /* No processor magic marker */
|
||||
#define ANY_PROC_ID 0xFF /* Any processor magic marker */
|
||||
static inline int __cpu_disable (void) {
|
||||
return 0;
|
||||
}
|
||||
static inline void __cpu_die (unsigned int cpu) {
|
||||
while(1)
|
||||
;
|
||||
}
|
||||
int __cpu_disable(void);
|
||||
void __cpu_die(unsigned int cpu);
|
||||
|
||||
#endif /* __ASM_SMP_H */
|
||||
|
||||
@@ -30,11 +30,15 @@
|
||||
pa; \
|
||||
})
|
||||
|
||||
#define CR_EIEM 15 /* External Interrupt Enable Mask */
|
||||
#define CR_CR16 16 /* CR16 Interval Timer */
|
||||
#define CR_EIRR 23 /* External Interrupt Request Register */
|
||||
|
||||
#define mfctl(reg) ({ \
|
||||
unsigned long cr; \
|
||||
__asm__ __volatile__( \
|
||||
"mfctl " #reg ",%0" : \
|
||||
"=r" (cr) \
|
||||
"mfctl %1,%0" : \
|
||||
"=r" (cr) : "i" (reg) \
|
||||
); \
|
||||
cr; \
|
||||
})
|
||||
@@ -44,13 +48,8 @@
|
||||
: /* no outputs */ \
|
||||
: "r" (gr), "i" (cr) : "memory")
|
||||
|
||||
/* these are here to de-mystefy the calling code, and to provide hooks */
|
||||
/* which I needed for debugging EIEM problems -PB */
|
||||
#define get_eiem() mfctl(15)
|
||||
static inline void set_eiem(unsigned long val)
|
||||
{
|
||||
mtctl(val, 15);
|
||||
}
|
||||
#define get_eiem() mfctl(CR_EIEM)
|
||||
#define set_eiem(val) mtctl(val, CR_EIEM)
|
||||
|
||||
#define mfsp(reg) ({ \
|
||||
unsigned long cr; \
|
||||
|
||||
@@ -1,33 +1,16 @@
|
||||
#ifndef _ASM_PARISC_TOPOLOGY_H
|
||||
#define _ASM_PARISC_TOPOLOGY_H
|
||||
|
||||
#ifdef CONFIG_PARISC_CPU_TOPOLOGY
|
||||
#ifdef CONFIG_GENERIC_ARCH_TOPOLOGY
|
||||
|
||||
#include <linux/cpumask.h>
|
||||
|
||||
struct cputopo_parisc {
|
||||
int thread_id;
|
||||
int core_id;
|
||||
int socket_id;
|
||||
cpumask_t thread_sibling;
|
||||
cpumask_t core_sibling;
|
||||
};
|
||||
|
||||
extern struct cputopo_parisc cpu_topology[NR_CPUS];
|
||||
|
||||
#define topology_physical_package_id(cpu) (cpu_topology[cpu].socket_id)
|
||||
#define topology_core_id(cpu) (cpu_topology[cpu].core_id)
|
||||
#define topology_core_cpumask(cpu) (&cpu_topology[cpu].core_sibling)
|
||||
#define topology_sibling_cpumask(cpu) (&cpu_topology[cpu].thread_sibling)
|
||||
|
||||
void init_cpu_topology(void);
|
||||
void store_cpu_topology(unsigned int cpuid);
|
||||
const struct cpumask *cpu_coregroup_mask(int cpu);
|
||||
#include <linux/arch_topology.h>
|
||||
|
||||
#else
|
||||
|
||||
static inline void init_cpu_topology(void) { }
|
||||
static inline void store_cpu_topology(unsigned int cpuid) { }
|
||||
static inline void reset_cpu_topology(void) { }
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ obj-$(CONFIG_AUDIT) += audit.o
|
||||
obj64-$(CONFIG_AUDIT) += compat_audit.o
|
||||
# only supported for PCX-W/U in 64-bit mode at the moment
|
||||
obj-$(CONFIG_64BIT) += perf.o perf_asm.o $(obj64-y)
|
||||
obj-$(CONFIG_PARISC_CPU_TOPOLOGY) += topology.o
|
||||
obj-$(CONFIG_GENERIC_ARCH_TOPOLOGY) += topology.o
|
||||
obj-$(CONFIG_FUNCTION_TRACER) += ftrace.o
|
||||
obj-$(CONFIG_FUNCTION_GRAPH_TRACER) += ftrace.o
|
||||
obj-$(CONFIG_JUMP_LABEL) += jump_label.o
|
||||
|
||||
@@ -273,7 +273,7 @@ parisc_cache_init(void)
|
||||
}
|
||||
}
|
||||
|
||||
void __init disable_sr_hashing(void)
|
||||
void disable_sr_hashing(void)
|
||||
{
|
||||
int srhash_type, retval;
|
||||
unsigned long space_bits;
|
||||
@@ -611,8 +611,8 @@ void
|
||||
flush_cache_page(struct vm_area_struct *vma, unsigned long vmaddr, unsigned long pfn)
|
||||
{
|
||||
if (pfn_valid(pfn)) {
|
||||
flush_tlb_page(vma, vmaddr);
|
||||
if (likely(vma->vm_mm->context.space_id)) {
|
||||
flush_tlb_page(vma, vmaddr);
|
||||
__flush_cache_page(vma, vmaddr, PFN_PHYS(pfn));
|
||||
} else {
|
||||
__purge_cache_page(vma, vmaddr, PFN_PHYS(pfn));
|
||||
@@ -624,7 +624,6 @@ void flush_kernel_vmap_range(void *vaddr, int size)
|
||||
{
|
||||
unsigned long start = (unsigned long)vaddr;
|
||||
unsigned long end = start + size;
|
||||
unsigned long flags, physaddr;
|
||||
|
||||
if ((!IS_ENABLED(CONFIG_SMP) || !arch_irqs_disabled()) &&
|
||||
(unsigned long)size >= parisc_cache_flush_threshold) {
|
||||
@@ -633,14 +632,8 @@ void flush_kernel_vmap_range(void *vaddr, int size)
|
||||
return;
|
||||
}
|
||||
|
||||
while (start < end) {
|
||||
physaddr = lpa(start);
|
||||
purge_tlb_start(flags);
|
||||
pdtlb(SR_KERNEL, start);
|
||||
purge_tlb_end(flags);
|
||||
flush_dcache_page_asm(physaddr, start);
|
||||
start += PAGE_SIZE;
|
||||
}
|
||||
flush_kernel_dcache_range_asm(start, end);
|
||||
flush_tlb_kernel_range(start, end);
|
||||
}
|
||||
EXPORT_SYMBOL(flush_kernel_vmap_range);
|
||||
|
||||
@@ -648,7 +641,6 @@ void invalidate_kernel_vmap_range(void *vaddr, int size)
|
||||
{
|
||||
unsigned long start = (unsigned long)vaddr;
|
||||
unsigned long end = start + size;
|
||||
unsigned long flags, physaddr;
|
||||
|
||||
if ((!IS_ENABLED(CONFIG_SMP) || !arch_irqs_disabled()) &&
|
||||
(unsigned long)size >= parisc_cache_flush_threshold) {
|
||||
@@ -657,13 +649,7 @@ void invalidate_kernel_vmap_range(void *vaddr, int size)
|
||||
return;
|
||||
}
|
||||
|
||||
while (start < end) {
|
||||
physaddr = lpa(start);
|
||||
purge_tlb_start(flags);
|
||||
pdtlb(SR_KERNEL, start);
|
||||
purge_tlb_end(flags);
|
||||
purge_dcache_page_asm(physaddr, start);
|
||||
start += PAGE_SIZE;
|
||||
}
|
||||
purge_kernel_dcache_range_asm(start, end);
|
||||
flush_tlb_kernel_range(start, end);
|
||||
}
|
||||
EXPORT_SYMBOL(invalidate_kernel_vmap_range);
|
||||
|
||||
@@ -83,7 +83,7 @@ extern unsigned long pdc_result2[NUM_PDC_RESULT];
|
||||
|
||||
/* Firmware needs to be initially set to narrow to determine the
|
||||
* actual firmware width. */
|
||||
int parisc_narrow_firmware __ro_after_init = 1;
|
||||
int parisc_narrow_firmware __ro_after_init = 2;
|
||||
#endif
|
||||
|
||||
/* On most currently-supported platforms, IODC I/O calls are 32-bit calls
|
||||
@@ -174,6 +174,11 @@ void set_firmware_width_unlocked(void)
|
||||
void set_firmware_width(void)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
/* already initialized? */
|
||||
if (parisc_narrow_firmware != 2)
|
||||
return;
|
||||
|
||||
spin_lock_irqsave(&pdc_lock, flags);
|
||||
set_firmware_width_unlocked();
|
||||
spin_unlock_irqrestore(&pdc_lock, flags);
|
||||
@@ -324,7 +329,44 @@ int __pdc_cpu_rendezvous(void)
|
||||
return mem_pdc_call(PDC_PROC, 1, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* pdc_cpu_rendezvous_lock - Lock PDC while transitioning to rendezvous state
|
||||
*/
|
||||
void pdc_cpu_rendezvous_lock(void)
|
||||
{
|
||||
spin_lock(&pdc_lock);
|
||||
}
|
||||
|
||||
/**
|
||||
* pdc_cpu_rendezvous_unlock - Unlock PDC after reaching rendezvous state
|
||||
*/
|
||||
void pdc_cpu_rendezvous_unlock(void)
|
||||
{
|
||||
spin_unlock(&pdc_lock);
|
||||
}
|
||||
|
||||
/**
|
||||
* pdc_pat_get_PDC_entrypoint - Get PDC entry point for current CPU
|
||||
* @retval: -1 on error, 0 on success
|
||||
*/
|
||||
int pdc_pat_get_PDC_entrypoint(unsigned long *pdc_entry)
|
||||
{
|
||||
int retval = 0;
|
||||
unsigned long flags;
|
||||
|
||||
if (!IS_ENABLED(CONFIG_SMP) || !is_pdc_pat()) {
|
||||
*pdc_entry = MEM_PDC;
|
||||
return 0;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&pdc_lock, flags);
|
||||
retval = mem_pdc_call(PDC_PAT_CPU, PDC_PAT_CPU_GET_PDC_ENTRYPOINT,
|
||||
__pa(pdc_result));
|
||||
*pdc_entry = pdc_result[0];
|
||||
spin_unlock_irqrestore(&pdc_lock, flags);
|
||||
|
||||
return retval;
|
||||
}
|
||||
/**
|
||||
* pdc_chassis_warn - Fetches chassis warnings
|
||||
* @retval: -1 on error, 0 on success
|
||||
|
||||
@@ -162,6 +162,15 @@ $pgt_fill_loop:
|
||||
/* FALLTHROUGH */
|
||||
.procend
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
/* common_stext is far away in another section... jump there */
|
||||
load32 PA(common_stext), %rp
|
||||
bv,n (%rp)
|
||||
|
||||
/* common_stext and smp_slave_stext needs to be in text section */
|
||||
.text
|
||||
#endif
|
||||
|
||||
/*
|
||||
** Code Common to both Monarch and Slave processors.
|
||||
** Entry:
|
||||
@@ -371,8 +380,6 @@ smp_slave_stext:
|
||||
.procend
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
ENDPROC(parisc_kernel_start)
|
||||
|
||||
#ifndef CONFIG_64BIT
|
||||
.section .data..ro_after_init
|
||||
|
||||
|
||||
@@ -105,28 +105,12 @@ int cpu_check_affinity(struct irq_data *d, const struct cpumask *dest)
|
||||
if (irqd_is_per_cpu(d))
|
||||
return -EINVAL;
|
||||
|
||||
/* whatever mask they set, we just allow one CPU */
|
||||
cpu_dest = cpumask_next_and(d->irq & (num_online_cpus()-1),
|
||||
dest, cpu_online_mask);
|
||||
cpu_dest = cpumask_first_and(dest, cpu_online_mask);
|
||||
if (cpu_dest >= nr_cpu_ids)
|
||||
cpu_dest = cpumask_first_and(dest, cpu_online_mask);
|
||||
cpu_dest = cpumask_first(cpu_online_mask);
|
||||
|
||||
return cpu_dest;
|
||||
}
|
||||
|
||||
static int cpu_set_affinity_irq(struct irq_data *d, const struct cpumask *dest,
|
||||
bool force)
|
||||
{
|
||||
int cpu_dest;
|
||||
|
||||
cpu_dest = cpu_check_affinity(d, dest);
|
||||
if (cpu_dest < 0)
|
||||
return -1;
|
||||
|
||||
cpumask_copy(irq_data_get_affinity_mask(d), dest);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static struct irq_chip cpu_interrupt_type = {
|
||||
@@ -135,9 +119,6 @@ static struct irq_chip cpu_interrupt_type = {
|
||||
.irq_unmask = cpu_unmask_irq,
|
||||
.irq_ack = cpu_ack_irq,
|
||||
.irq_eoi = cpu_eoi_irq,
|
||||
#ifdef CONFIG_SMP
|
||||
.irq_set_affinity = cpu_set_affinity_irq,
|
||||
#endif
|
||||
/* XXX: Needs to be written. We managed without it so far, but
|
||||
* we really ought to write it.
|
||||
*/
|
||||
@@ -582,7 +563,7 @@ static void claim_cpu_irqs(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
void __init init_IRQ(void)
|
||||
void init_IRQ(void)
|
||||
{
|
||||
local_irq_disable(); /* PARANOID - should already be disabled */
|
||||
mtctl(~0UL, 23); /* EIRR : clear all pending external intr */
|
||||
|
||||
@@ -1264,7 +1264,7 @@ ENTRY_CFI(flush_kernel_icache_range_asm)
|
||||
nop
|
||||
ENDPROC_CFI(flush_kernel_icache_range_asm)
|
||||
|
||||
__INIT
|
||||
.text
|
||||
|
||||
/* align should cover use of rfi in disable_sr_hashing_asm and
|
||||
* srdis_done.
|
||||
|
||||
+11
-14
@@ -40,10 +40,7 @@ static void __kprobes *patch_map(void *addr, int fixmap, unsigned long *flags,
|
||||
|
||||
*need_unmap = 1;
|
||||
set_fixmap(fixmap, page_to_phys(page));
|
||||
if (flags)
|
||||
raw_spin_lock_irqsave(&patch_lock, *flags);
|
||||
else
|
||||
__acquire(&patch_lock);
|
||||
raw_spin_lock_irqsave(&patch_lock, *flags);
|
||||
|
||||
return (void *) (__fix_to_virt(fixmap) + (uintaddr & ~PAGE_MASK));
|
||||
}
|
||||
@@ -52,10 +49,7 @@ static void __kprobes patch_unmap(int fixmap, unsigned long *flags)
|
||||
{
|
||||
clear_fixmap(fixmap);
|
||||
|
||||
if (flags)
|
||||
raw_spin_unlock_irqrestore(&patch_lock, *flags);
|
||||
else
|
||||
__release(&patch_lock);
|
||||
raw_spin_unlock_irqrestore(&patch_lock, *flags);
|
||||
}
|
||||
|
||||
void __kprobes __patch_text_multiple(void *addr, u32 *insn, unsigned int len)
|
||||
@@ -67,8 +61,9 @@ void __kprobes __patch_text_multiple(void *addr, u32 *insn, unsigned int len)
|
||||
int mapped;
|
||||
|
||||
/* Make sure we don't have any aliases in cache */
|
||||
flush_kernel_vmap_range(addr, len);
|
||||
flush_icache_range(start, end);
|
||||
flush_kernel_dcache_range_asm(start, end);
|
||||
flush_kernel_icache_range_asm(start, end);
|
||||
flush_tlb_kernel_range(start, end);
|
||||
|
||||
p = fixmap = patch_map(addr, FIX_TEXT_POKE0, &flags, &mapped);
|
||||
|
||||
@@ -81,8 +76,10 @@ void __kprobes __patch_text_multiple(void *addr, u32 *insn, unsigned int len)
|
||||
* We're crossing a page boundary, so
|
||||
* need to remap
|
||||
*/
|
||||
flush_kernel_vmap_range((void *)fixmap,
|
||||
(p-fixmap) * sizeof(*p));
|
||||
flush_kernel_dcache_range_asm((unsigned long)fixmap,
|
||||
(unsigned long)p);
|
||||
flush_tlb_kernel_range((unsigned long)fixmap,
|
||||
(unsigned long)p);
|
||||
if (mapped)
|
||||
patch_unmap(FIX_TEXT_POKE0, &flags);
|
||||
p = fixmap = patch_map(addr, FIX_TEXT_POKE0, &flags,
|
||||
@@ -90,10 +87,10 @@ void __kprobes __patch_text_multiple(void *addr, u32 *insn, unsigned int len)
|
||||
}
|
||||
}
|
||||
|
||||
flush_kernel_vmap_range((void *)fixmap, (p-fixmap) * sizeof(*p));
|
||||
flush_kernel_dcache_range_asm((unsigned long)fixmap, (unsigned long)p);
|
||||
flush_tlb_kernel_range((unsigned long)fixmap, (unsigned long)p);
|
||||
if (mapped)
|
||||
patch_unmap(FIX_TEXT_POKE0, &flags);
|
||||
flush_icache_range(start, end);
|
||||
}
|
||||
|
||||
void __kprobes __patch_text(void *addr, u32 insn)
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
#include <linux/rcupdate.h>
|
||||
#include <linux/random.h>
|
||||
#include <linux/nmi.h>
|
||||
#include <linux/sched/hotplug.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/asm-offsets.h>
|
||||
@@ -46,6 +47,7 @@
|
||||
#include <asm/pdc_chassis.h>
|
||||
#include <asm/unwind.h>
|
||||
#include <asm/sections.h>
|
||||
#include <asm/cacheflush.h>
|
||||
|
||||
#define COMMAND_GLOBAL F_EXTEND(0xfffe0030)
|
||||
#define CMD_RESET 5 /* reset any module */
|
||||
@@ -158,10 +160,29 @@ void release_thread(struct task_struct *dead_task)
|
||||
int running_on_qemu __ro_after_init;
|
||||
EXPORT_SYMBOL(running_on_qemu);
|
||||
|
||||
void __cpuidle arch_cpu_idle_dead(void)
|
||||
/*
|
||||
* Called from the idle thread for the CPU which has been shutdown.
|
||||
*/
|
||||
void arch_cpu_idle_dead(void)
|
||||
{
|
||||
/* nop on real hardware, qemu will offline CPU. */
|
||||
asm volatile("or %%r31,%%r31,%%r31\n":::);
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
idle_task_exit();
|
||||
|
||||
local_irq_disable();
|
||||
|
||||
/* Tell __cpu_die() that this CPU is now safe to dispose of. */
|
||||
(void)cpu_report_death();
|
||||
|
||||
/* Ensure that the cache lines are written out. */
|
||||
flush_cache_all_local();
|
||||
flush_tlb_all_local(NULL);
|
||||
|
||||
/* Let PDC firmware put CPU into firmware idle loop. */
|
||||
__pdc_cpu_rendezvous();
|
||||
|
||||
pr_warn("PDC does not provide rendezvous function.\n");
|
||||
#endif
|
||||
while (1);
|
||||
}
|
||||
|
||||
void __cpuidle arch_cpu_idle(void)
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
#include <linux/random.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/cpu.h>
|
||||
#include <asm/topology.h>
|
||||
#include <asm/param.h>
|
||||
#include <asm/cache.h>
|
||||
#include <asm/hardware.h> /* for register_parisc_driver() stuff */
|
||||
@@ -317,7 +318,7 @@ void __init collect_boot_cpu_data(void)
|
||||
*
|
||||
* o Enable CPU profiling hooks.
|
||||
*/
|
||||
int __init init_per_cpu(int cpunum)
|
||||
int init_per_cpu(int cpunum)
|
||||
{
|
||||
int ret;
|
||||
struct pdc_coproc_cfg coproc_cfg;
|
||||
@@ -390,7 +391,7 @@ show_cpuinfo (struct seq_file *m, void *v)
|
||||
boot_cpu_data.cpu_hz / 1000000,
|
||||
boot_cpu_data.cpu_hz % 1000000 );
|
||||
|
||||
#ifdef CONFIG_PARISC_CPU_TOPOLOGY
|
||||
#ifdef CONFIG_GENERIC_ARCH_TOPOLOGY
|
||||
seq_printf(m, "physical id\t: %d\n",
|
||||
topology_physical_package_id(cpu));
|
||||
seq_printf(m, "siblings\t: %d\n",
|
||||
@@ -460,5 +461,6 @@ static struct parisc_driver cpu_driver __refdata = {
|
||||
*/
|
||||
void __init processor_init(void)
|
||||
{
|
||||
reset_cpu_topology();
|
||||
register_parisc_driver(&cpu_driver);
|
||||
}
|
||||
|
||||
+93
-15
@@ -30,6 +30,7 @@
|
||||
#include <linux/ftrace.h>
|
||||
#include <linux/cpu.h>
|
||||
#include <linux/kgdb.h>
|
||||
#include <linux/sched/hotplug.h>
|
||||
|
||||
#include <linux/atomic.h>
|
||||
#include <asm/current.h>
|
||||
@@ -60,8 +61,6 @@ volatile struct task_struct *smp_init_current_idle_task;
|
||||
/* track which CPU is booting */
|
||||
static volatile int cpu_now_booting;
|
||||
|
||||
static int parisc_max_cpus = 1;
|
||||
|
||||
static DEFINE_PER_CPU(spinlock_t, ipi_lock);
|
||||
|
||||
enum ipi_message_type {
|
||||
@@ -269,7 +268,7 @@ void arch_send_call_function_single_ipi(int cpu)
|
||||
/*
|
||||
* Called by secondaries to update state and initialize CPU registers.
|
||||
*/
|
||||
static void __init
|
||||
static void
|
||||
smp_cpu_init(int cpunum)
|
||||
{
|
||||
extern void init_IRQ(void); /* arch/parisc/kernel/irq.c */
|
||||
@@ -309,7 +308,7 @@ smp_cpu_init(int cpunum)
|
||||
* Slaves start using C here. Indirectly called from smp_slave_stext.
|
||||
* Do what start_kernel() and main() do for boot strap processor (aka monarch)
|
||||
*/
|
||||
void __init smp_callin(unsigned long pdce_proc)
|
||||
void smp_callin(unsigned long pdce_proc)
|
||||
{
|
||||
int slave_id = cpu_now_booting;
|
||||
|
||||
@@ -334,11 +333,28 @@ void __init smp_callin(unsigned long pdce_proc)
|
||||
/*
|
||||
* Bring one cpu online.
|
||||
*/
|
||||
int smp_boot_one_cpu(int cpuid, struct task_struct *idle)
|
||||
static int smp_boot_one_cpu(int cpuid, struct task_struct *idle)
|
||||
{
|
||||
const struct cpuinfo_parisc *p = &per_cpu(cpu_data, cpuid);
|
||||
long timeout;
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
int i;
|
||||
|
||||
/* reset irq statistics for this CPU */
|
||||
memset(&per_cpu(irq_stat, cpuid), 0, sizeof(irq_cpustat_t));
|
||||
for (i = 0; i < NR_IRQS; i++) {
|
||||
struct irq_desc *desc = irq_to_desc(i);
|
||||
|
||||
if (desc && desc->kstat_irqs)
|
||||
*per_cpu_ptr(desc->kstat_irqs, cpuid) = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* wait until last booting CPU has started. */
|
||||
while (cpu_now_booting)
|
||||
;
|
||||
|
||||
/* Let _start know what logical CPU we're booting
|
||||
** (offset into init_tasks[],cpu_data[])
|
||||
*/
|
||||
@@ -374,7 +390,6 @@ int smp_boot_one_cpu(int cpuid, struct task_struct *idle)
|
||||
if(cpu_online(cpuid)) {
|
||||
/* Which implies Slave has started up */
|
||||
cpu_now_booting = 0;
|
||||
smp_init_current_idle_task = NULL;
|
||||
goto alive ;
|
||||
}
|
||||
udelay(100);
|
||||
@@ -415,25 +430,88 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
|
||||
spin_lock_init(&per_cpu(ipi_lock, cpu));
|
||||
|
||||
init_cpu_present(cpumask_of(0));
|
||||
|
||||
parisc_max_cpus = max_cpus;
|
||||
if (!max_cpus)
|
||||
printk(KERN_INFO "SMP mode deactivated.\n");
|
||||
}
|
||||
|
||||
|
||||
void smp_cpus_done(unsigned int cpu_max)
|
||||
void __init smp_cpus_done(unsigned int cpu_max)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
int __cpu_up(unsigned int cpu, struct task_struct *tidle)
|
||||
{
|
||||
if (cpu != 0 && cpu < parisc_max_cpus && smp_boot_one_cpu(cpu, tidle))
|
||||
return -ENOSYS;
|
||||
if (cpu_online(cpu))
|
||||
return 0;
|
||||
|
||||
return cpu_online(cpu) ? 0 : -ENOSYS;
|
||||
if (num_online_cpus() < setup_max_cpus && smp_boot_one_cpu(cpu, tidle))
|
||||
return -EIO;
|
||||
|
||||
return cpu_online(cpu) ? 0 : -EIO;
|
||||
}
|
||||
|
||||
/*
|
||||
* __cpu_disable runs on the processor to be shutdown.
|
||||
*/
|
||||
int __cpu_disable(void)
|
||||
{
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
unsigned int cpu = smp_processor_id();
|
||||
|
||||
remove_cpu_topology(cpu);
|
||||
|
||||
/*
|
||||
* Take this CPU offline. Once we clear this, we can't return,
|
||||
* and we must not schedule until we're ready to give up the cpu.
|
||||
*/
|
||||
set_cpu_online(cpu, false);
|
||||
|
||||
/* Find a new timesync master */
|
||||
if (cpu == time_keeper_id) {
|
||||
time_keeper_id = cpumask_first(cpu_online_mask);
|
||||
pr_info("CPU %d is now promoted to time-keeper master\n", time_keeper_id);
|
||||
}
|
||||
|
||||
disable_percpu_irq(IPI_IRQ);
|
||||
|
||||
irq_migrate_all_off_this_cpu();
|
||||
|
||||
flush_cache_all_local();
|
||||
flush_tlb_all_local(NULL);
|
||||
|
||||
/* disable all irqs, including timer irq */
|
||||
local_irq_disable();
|
||||
|
||||
/* wait for next timer irq ... */
|
||||
mdelay(1000/HZ+100);
|
||||
|
||||
/* ... and then clear all pending external irqs */
|
||||
set_eiem(0);
|
||||
mtctl(~0UL, CR_EIRR);
|
||||
mfctl(CR_EIRR);
|
||||
mtctl(0, CR_EIRR);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* called on the thread which is asking for a CPU to be shutdown -
|
||||
* waits until shutdown has completed, or it is timed out.
|
||||
*/
|
||||
void __cpu_die(unsigned int cpu)
|
||||
{
|
||||
pdc_cpu_rendezvous_lock();
|
||||
|
||||
if (!cpu_wait_death(cpu, 5)) {
|
||||
pr_crit("CPU%u: cpu didn't die\n", cpu);
|
||||
return;
|
||||
}
|
||||
pr_info("CPU%u: is shutting down\n", cpu);
|
||||
|
||||
/* set task's state to interruptible sleep */
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
schedule_timeout((IS_ENABLED(CONFIG_64BIT) ? 8:2) * HZ);
|
||||
|
||||
pdc_cpu_rendezvous_unlock();
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
|
||||
@@ -2,8 +2,7 @@
|
||||
kapi := arch/$(SRCARCH)/include/generated/asm
|
||||
uapi := arch/$(SRCARCH)/include/generated/uapi/asm
|
||||
|
||||
_dummy := $(shell [ -d '$(uapi)' ] || mkdir -p '$(uapi)') \
|
||||
$(shell [ -d '$(kapi)' ] || mkdir -p '$(kapi)')
|
||||
$(shell mkdir -p $(uapi) $(kapi))
|
||||
|
||||
syscall := $(src)/syscall.tbl
|
||||
syshdr := $(srctree)/scripts/syscallhdr.sh
|
||||
|
||||
@@ -40,6 +40,8 @@
|
||||
|
||||
#include <linux/timex.h>
|
||||
|
||||
int time_keeper_id __read_mostly; /* CPU used for timekeeping. */
|
||||
|
||||
static unsigned long clocktick __ro_after_init; /* timer cycles per tick */
|
||||
|
||||
/*
|
||||
@@ -84,7 +86,7 @@ irqreturn_t __irq_entry timer_interrupt(int irq, void *dev_id)
|
||||
cpuinfo->it_value = next_tick;
|
||||
|
||||
/* Go do system house keeping. */
|
||||
if (cpu != 0)
|
||||
if (IS_ENABLED(CONFIG_SMP) && (cpu != time_keeper_id))
|
||||
ticks_elapsed = 0;
|
||||
legacy_timer_tick(ticks_elapsed);
|
||||
|
||||
@@ -150,7 +152,7 @@ static struct clocksource clocksource_cr16 = {
|
||||
.flags = CLOCK_SOURCE_IS_CONTINUOUS,
|
||||
};
|
||||
|
||||
void __init start_cpu_itimer(void)
|
||||
void start_cpu_itimer(void)
|
||||
{
|
||||
unsigned int cpu = smp_processor_id();
|
||||
unsigned long next_tick = mfctl(16) + clocktick;
|
||||
|
||||
@@ -13,56 +13,23 @@
|
||||
#include <linux/percpu.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/sched/topology.h>
|
||||
#include <linux/cpu.h>
|
||||
|
||||
#include <asm/topology.h>
|
||||
#include <asm/sections.h>
|
||||
|
||||
/*
|
||||
* cpu topology table
|
||||
*/
|
||||
struct cputopo_parisc cpu_topology[NR_CPUS] __read_mostly;
|
||||
EXPORT_SYMBOL_GPL(cpu_topology);
|
||||
static DEFINE_PER_CPU(struct cpu, cpu_devices);
|
||||
|
||||
const struct cpumask *cpu_coregroup_mask(int cpu)
|
||||
{
|
||||
return &cpu_topology[cpu].core_sibling;
|
||||
}
|
||||
|
||||
static void update_siblings_masks(unsigned int cpuid)
|
||||
{
|
||||
struct cputopo_parisc *cpu_topo, *cpuid_topo = &cpu_topology[cpuid];
|
||||
int cpu;
|
||||
|
||||
/* update core and thread sibling masks */
|
||||
for_each_possible_cpu(cpu) {
|
||||
cpu_topo = &cpu_topology[cpu];
|
||||
|
||||
if (cpuid_topo->socket_id != cpu_topo->socket_id)
|
||||
continue;
|
||||
|
||||
cpumask_set_cpu(cpuid, &cpu_topo->core_sibling);
|
||||
if (cpu != cpuid)
|
||||
cpumask_set_cpu(cpu, &cpuid_topo->core_sibling);
|
||||
|
||||
if (cpuid_topo->core_id != cpu_topo->core_id)
|
||||
continue;
|
||||
|
||||
cpumask_set_cpu(cpuid, &cpu_topo->thread_sibling);
|
||||
if (cpu != cpuid)
|
||||
cpumask_set_cpu(cpu, &cpuid_topo->thread_sibling);
|
||||
}
|
||||
smp_wmb();
|
||||
}
|
||||
|
||||
static int dualcores_found __initdata;
|
||||
static int dualcores_found;
|
||||
|
||||
/*
|
||||
* store_cpu_topology is called at boot when only one cpu is running
|
||||
* and with the mutex cpu_hotplug.lock locked, when several cpus have booted,
|
||||
* which prevents simultaneous write access to cpu_topology array
|
||||
*/
|
||||
void __init store_cpu_topology(unsigned int cpuid)
|
||||
void store_cpu_topology(unsigned int cpuid)
|
||||
{
|
||||
struct cputopo_parisc *cpuid_topo = &cpu_topology[cpuid];
|
||||
struct cpu_topology *cpuid_topo = &cpu_topology[cpuid];
|
||||
struct cpuinfo_parisc *p;
|
||||
int max_socket = -1;
|
||||
unsigned long cpu;
|
||||
@@ -71,6 +38,12 @@ void __init store_cpu_topology(unsigned int cpuid)
|
||||
if (cpuid_topo->core_id != -1)
|
||||
return;
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
per_cpu(cpu_devices, cpuid).hotpluggable = 1;
|
||||
#endif
|
||||
if (register_cpu(&per_cpu(cpu_devices, cpuid), cpuid))
|
||||
pr_warn("Failed to register CPU%d device", cpuid);
|
||||
|
||||
/* create cpu topology mapping */
|
||||
cpuid_topo->thread_id = -1;
|
||||
cpuid_topo->core_id = 0;
|
||||
@@ -86,25 +59,25 @@ void __init store_cpu_topology(unsigned int cpuid)
|
||||
cpuid_topo->core_id = cpu_topology[cpu].core_id;
|
||||
if (p->cpu_loc) {
|
||||
cpuid_topo->core_id++;
|
||||
cpuid_topo->socket_id = cpu_topology[cpu].socket_id;
|
||||
cpuid_topo->package_id = cpu_topology[cpu].package_id;
|
||||
dualcores_found = 1;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (cpuid_topo->socket_id == -1)
|
||||
max_socket = max(max_socket, cpu_topology[cpu].socket_id);
|
||||
if (cpuid_topo->package_id == -1)
|
||||
max_socket = max(max_socket, cpu_topology[cpu].package_id);
|
||||
}
|
||||
|
||||
if (cpuid_topo->socket_id == -1)
|
||||
cpuid_topo->socket_id = max_socket + 1;
|
||||
if (cpuid_topo->package_id == -1)
|
||||
cpuid_topo->package_id = max_socket + 1;
|
||||
|
||||
update_siblings_masks(cpuid);
|
||||
|
||||
pr_info("CPU%u: cpu core %d of socket %d\n",
|
||||
cpuid,
|
||||
cpu_topology[cpuid].core_id,
|
||||
cpu_topology[cpuid].socket_id);
|
||||
cpu_topology[cpuid].package_id);
|
||||
}
|
||||
|
||||
static struct sched_domain_topology_level parisc_mc_topology[] = {
|
||||
@@ -122,20 +95,6 @@ static struct sched_domain_topology_level parisc_mc_topology[] = {
|
||||
*/
|
||||
void __init init_cpu_topology(void)
|
||||
{
|
||||
unsigned int cpu;
|
||||
|
||||
/* init core mask and capacity */
|
||||
for_each_possible_cpu(cpu) {
|
||||
struct cputopo_parisc *cpu_topo = &(cpu_topology[cpu]);
|
||||
|
||||
cpu_topo->thread_id = -1;
|
||||
cpu_topo->core_id = -1;
|
||||
cpu_topo->socket_id = -1;
|
||||
cpumask_clear(&cpu_topo->core_sibling);
|
||||
cpumask_clear(&cpu_topo->thread_sibling);
|
||||
}
|
||||
smp_wmb();
|
||||
|
||||
/* Set scheduler topology descriptor */
|
||||
if (dualcores_found)
|
||||
set_sched_topology(parisc_mc_topology);
|
||||
|
||||
@@ -2,8 +2,7 @@
|
||||
kapi := arch/$(SRCARCH)/include/generated/asm
|
||||
uapi := arch/$(SRCARCH)/include/generated/uapi/asm
|
||||
|
||||
_dummy := $(shell [ -d '$(uapi)' ] || mkdir -p '$(uapi)') \
|
||||
$(shell [ -d '$(kapi)' ] || mkdir -p '$(kapi)')
|
||||
$(shell mkdir -p $(uapi) $(kapi))
|
||||
|
||||
syscall := $(src)/syscall.tbl
|
||||
syshdr := $(srctree)/scripts/syscallhdr.sh
|
||||
|
||||
@@ -21,8 +21,7 @@ uapi: $(uapi-hdrs-y)
|
||||
|
||||
|
||||
# Create output directory if not already present
|
||||
_dummy := $(shell [ -d '$(uapi)' ] || mkdir -p '$(uapi)') \
|
||||
$(shell [ -d '$(kapi)' ] || mkdir -p '$(kapi)')
|
||||
$(shell mkdir -p $(uapi) $(kapi))
|
||||
|
||||
filechk_syshdr = $(CONFIG_SHELL) '$(systbl)' -H -a $(syshdr_abi_$(basetarget)) -f "$2" < $<
|
||||
|
||||
|
||||
@@ -2,8 +2,7 @@
|
||||
kapi := arch/$(SRCARCH)/include/generated/asm
|
||||
uapi := arch/$(SRCARCH)/include/generated/uapi/asm
|
||||
|
||||
_dummy := $(shell [ -d '$(uapi)' ] || mkdir -p '$(uapi)') \
|
||||
$(shell [ -d '$(kapi)' ] || mkdir -p '$(kapi)')
|
||||
$(shell mkdir -p $(uapi) $(kapi))
|
||||
|
||||
syscall := $(src)/syscall.tbl
|
||||
syshdr := $(srctree)/scripts/syscallhdr.sh
|
||||
|
||||
@@ -2,8 +2,7 @@
|
||||
kapi := arch/$(SRCARCH)/include/generated/asm
|
||||
uapi := arch/$(SRCARCH)/include/generated/uapi/asm
|
||||
|
||||
_dummy := $(shell [ -d '$(uapi)' ] || mkdir -p '$(uapi)') \
|
||||
$(shell [ -d '$(kapi)' ] || mkdir -p '$(kapi)')
|
||||
$(shell mkdir -p $(uapi) $(kapi))
|
||||
|
||||
syscall := $(src)/syscall.tbl
|
||||
syshdr := $(srctree)/scripts/syscallhdr.sh
|
||||
|
||||
@@ -75,6 +75,10 @@ USER_CFLAGS = $(patsubst $(KERNEL_DEFINES),,$(patsubst -I%,,$(KBUILD_CFLAGS))) \
|
||||
-D_FILE_OFFSET_BITS=64 -idirafter $(srctree)/include \
|
||||
-idirafter $(objtree)/include -D__KERNEL__ -D__UM_HOST__
|
||||
|
||||
ifdef CONFIG_CC_IS_CLANG
|
||||
USER_CFLAGS := $(patsubst -mno-global-merge,,$(USER_CFLAGS))
|
||||
endif
|
||||
|
||||
#This will adjust *FLAGS accordingly to the platform.
|
||||
include $(srctree)/$(ARCH_DIR)/Makefile-os-$(OS)
|
||||
|
||||
|
||||
@@ -224,7 +224,7 @@ void mconsole_go(struct mc_request *req)
|
||||
|
||||
void mconsole_stop(struct mc_request *req)
|
||||
{
|
||||
deactivate_fd(req->originating_fd, MCONSOLE_IRQ);
|
||||
block_signals();
|
||||
os_set_fd_block(req->originating_fd, 1);
|
||||
mconsole_reply(req, "stopped", 0, 0);
|
||||
for (;;) {
|
||||
@@ -247,6 +247,7 @@ void mconsole_stop(struct mc_request *req)
|
||||
}
|
||||
os_set_fd_block(req->originating_fd, 0);
|
||||
mconsole_reply(req, "", 0, 0);
|
||||
unblock_signals();
|
||||
}
|
||||
|
||||
static DEFINE_SPINLOCK(mc_devices_lock);
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <termios.h>
|
||||
#include <unistd.h>
|
||||
@@ -167,14 +168,29 @@ static void port_pre_exec(void *arg)
|
||||
int port_connection(int fd, int *socket, int *pid_out)
|
||||
{
|
||||
int new, err;
|
||||
char *argv[] = { "/usr/sbin/in.telnetd", "-L",
|
||||
char *env;
|
||||
char *argv[] = { "in.telnetd", "-L",
|
||||
OS_LIB_PATH "/uml/port-helper", NULL };
|
||||
struct port_pre_exec_data data;
|
||||
|
||||
if ((env = getenv("UML_PORT_HELPER")))
|
||||
argv[2] = env;
|
||||
|
||||
new = accept(fd, NULL, 0);
|
||||
if (new < 0)
|
||||
return -errno;
|
||||
|
||||
err = os_access(argv[2], X_OK);
|
||||
if (err < 0) {
|
||||
printk(UM_KERN_ERR "port_connection : error accessing port-helper "
|
||||
"executable at %s: %s\n", argv[2], strerror(-err));
|
||||
if (env == NULL)
|
||||
printk(UM_KERN_ERR "Set UML_PORT_HELPER environment "
|
||||
"variable to path to uml-utilities port-helper "
|
||||
"binary\n");
|
||||
goto out_close;
|
||||
}
|
||||
|
||||
err = os_pipe(socket, 0, 0);
|
||||
if (err < 0)
|
||||
goto out_close;
|
||||
|
||||
@@ -1526,13 +1526,19 @@ static void do_io(struct io_thread_req *req, struct io_desc *desc)
|
||||
}
|
||||
break;
|
||||
case REQ_OP_DISCARD:
|
||||
case REQ_OP_WRITE_ZEROES:
|
||||
n = os_falloc_punch(req->fds[bit], off, len);
|
||||
if (n) {
|
||||
req->error = map_error(-n);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case REQ_OP_WRITE_ZEROES:
|
||||
n = os_falloc_zeroes(req->fds[bit], off, len);
|
||||
if (n) {
|
||||
req->error = map_error(-n);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
WARN_ON_ONCE(1);
|
||||
req->error = BLK_STS_NOTSUPP;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user