mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 22:21:40 +00:00
Merge 6.6-rc6 into usb-next
We need the USB and Thunderbolt fixes in here as well. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
commit
d0d27ef87e
1
.mailmap
1
.mailmap
@ -377,6 +377,7 @@ Matthew Wilcox <willy@infradead.org> <willy@debian.org>
|
||||
Matthew Wilcox <willy@infradead.org> <willy@linux.intel.com>
|
||||
Matthew Wilcox <willy@infradead.org> <willy@parisc-linux.org>
|
||||
Matthias Fuchs <socketcan@esd.eu> <matthias.fuchs@esd.eu>
|
||||
Matthieu Baerts <matttbe@kernel.org> <matthieu.baerts@tessares.net>
|
||||
Matthieu CASTET <castet.matthieu@free.fr>
|
||||
Matti Vaittinen <mazziesaccount@gmail.com> <matti.vaittinen@fi.rohmeurope.com>
|
||||
Matt Ranostay <matt.ranostay@konsulko.com> <matt@ranostay.consulting>
|
||||
|
@ -1,7 +1,7 @@
|
||||
What: /sys/class/firmware/.../data
|
||||
Date: July 2022
|
||||
KernelVersion: 5.19
|
||||
Contact: Russ Weight <russell.h.weight@intel.com>
|
||||
Contact: Russ Weight <russ.weight@linux.dev>
|
||||
Description: The data sysfs file is used for firmware-fallback and for
|
||||
firmware uploads. Cat a firmware image to this sysfs file
|
||||
after you echo 1 to the loading sysfs file. When the firmware
|
||||
@ -13,7 +13,7 @@ Description: The data sysfs file is used for firmware-fallback and for
|
||||
What: /sys/class/firmware/.../cancel
|
||||
Date: July 2022
|
||||
KernelVersion: 5.19
|
||||
Contact: Russ Weight <russell.h.weight@intel.com>
|
||||
Contact: Russ Weight <russ.weight@linux.dev>
|
||||
Description: Write-only. For firmware uploads, write a "1" to this file to
|
||||
request that the transfer of firmware data to the lower-level
|
||||
device be canceled. This request will be rejected (EBUSY) if
|
||||
@ -23,7 +23,7 @@ Description: Write-only. For firmware uploads, write a "1" to this file to
|
||||
What: /sys/class/firmware/.../error
|
||||
Date: July 2022
|
||||
KernelVersion: 5.19
|
||||
Contact: Russ Weight <russell.h.weight@intel.com>
|
||||
Contact: Russ Weight <russ.weight@linux.dev>
|
||||
Description: Read-only. Returns a string describing a failed firmware
|
||||
upload. This string will be in the form of <STATUS>:<ERROR>,
|
||||
where <STATUS> will be one of the status strings described
|
||||
@ -37,7 +37,7 @@ Description: Read-only. Returns a string describing a failed firmware
|
||||
What: /sys/class/firmware/.../loading
|
||||
Date: July 2022
|
||||
KernelVersion: 5.19
|
||||
Contact: Russ Weight <russell.h.weight@intel.com>
|
||||
Contact: Russ Weight <russ.weight@linux.dev>
|
||||
Description: The loading sysfs file is used for both firmware-fallback and
|
||||
for firmware uploads. Echo 1 onto the loading file to indicate
|
||||
you are writing a firmware file to the data sysfs node. Echo
|
||||
@ -49,7 +49,7 @@ Description: The loading sysfs file is used for both firmware-fallback and
|
||||
What: /sys/class/firmware/.../remaining_size
|
||||
Date: July 2022
|
||||
KernelVersion: 5.19
|
||||
Contact: Russ Weight <russell.h.weight@intel.com>
|
||||
Contact: Russ Weight <russ.weight@linux.dev>
|
||||
Description: Read-only. For firmware upload, this file contains the size
|
||||
of the firmware data that remains to be transferred to the
|
||||
lower-level device driver. The size value is initialized to
|
||||
@ -62,7 +62,7 @@ Description: Read-only. For firmware upload, this file contains the size
|
||||
What: /sys/class/firmware/.../status
|
||||
Date: July 2022
|
||||
KernelVersion: 5.19
|
||||
Contact: Russ Weight <russell.h.weight@intel.com>
|
||||
Contact: Russ Weight <russ.weight@linux.dev>
|
||||
Description: Read-only. Returns a string describing the current status of
|
||||
a firmware upload. The string will be one of the following:
|
||||
idle, "receiving", "preparing", "transferring", "programming".
|
||||
@ -70,7 +70,7 @@ Description: Read-only. Returns a string describing the current status of
|
||||
What: /sys/class/firmware/.../timeout
|
||||
Date: July 2022
|
||||
KernelVersion: 5.19
|
||||
Contact: Russ Weight <russell.h.weight@intel.com>
|
||||
Contact: Russ Weight <russ.weight@linux.dev>
|
||||
Description: This file supports the timeout mechanism for firmware
|
||||
fallback. This file has no affect on firmware uploads. For
|
||||
more information on timeouts please see the documentation
|
||||
|
@ -71,6 +71,8 @@ stable kernels.
|
||||
+----------------+-----------------+-----------------+-----------------------------+
|
||||
| ARM | Cortex-A510 | #2658417 | ARM64_ERRATUM_2658417 |
|
||||
+----------------+-----------------+-----------------+-----------------------------+
|
||||
| ARM | Cortex-A520 | #2966298 | ARM64_ERRATUM_2966298 |
|
||||
+----------------+-----------------+-----------------+-----------------------------+
|
||||
| ARM | Cortex-A53 | #826319 | ARM64_ERRATUM_826319 |
|
||||
+----------------+-----------------+-----------------+-----------------------------+
|
||||
| ARM | Cortex-A53 | #827319 | ARM64_ERRATUM_827319 |
|
||||
|
@ -244,7 +244,7 @@ unbound worker-pools and only one work item could be active at any given
|
||||
time thus achieving the same ordering property as ST wq.
|
||||
|
||||
In the current implementation the above configuration only guarantees
|
||||
ST behavior within a given NUMA node. Instead ``alloc_ordered_queue()`` should
|
||||
ST behavior within a given NUMA node. Instead ``alloc_ordered_workqueue()`` should
|
||||
be used to achieve system-wide ST behavior.
|
||||
|
||||
|
||||
@ -390,7 +390,7 @@ The default affinity scope can be changed with the module parameter
|
||||
scope can be changed using ``apply_workqueue_attrs()``.
|
||||
|
||||
If ``WQ_SYSFS`` is set, the workqueue will have the following affinity scope
|
||||
related interface files under its ``/sys/devices/virtual/WQ_NAME/``
|
||||
related interface files under its ``/sys/devices/virtual/workqueue/WQ_NAME/``
|
||||
directory.
|
||||
|
||||
``affinity_scope``
|
||||
|
@ -73,9 +73,6 @@ patternProperties:
|
||||
"^.*@[0-9a-f]+$":
|
||||
description: Devices attached to the bus
|
||||
type: object
|
||||
properties:
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
required:
|
||||
- reg
|
||||
|
@ -69,7 +69,7 @@ examples:
|
||||
- |
|
||||
#include <dt-bindings/interrupt-controller/irq.h>
|
||||
|
||||
cache-controller@2010000 {
|
||||
cache-controller@13400000 {
|
||||
compatible = "andestech,ax45mp-cache", "cache";
|
||||
reg = <0x13400000 0x100000>;
|
||||
interrupts = <508 IRQ_TYPE_LEVEL_HIGH>;
|
||||
|
@ -87,7 +87,7 @@ required:
|
||||
- interrupts
|
||||
- ports
|
||||
|
||||
additionalProperties: false
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
|
@ -13,6 +13,8 @@ description: |
|
||||
|
||||
maintainers:
|
||||
- Michael Tretter <m.tretter@pengutronix.de>
|
||||
- Harini Katakam <harini.katakam@amd.com>
|
||||
- Radhey Shyam Pandey <radhey.shyam.pandey@amd.com>
|
||||
|
||||
allOf:
|
||||
- $ref: ../dma-controller.yaml#
|
||||
@ -65,6 +67,7 @@ required:
|
||||
- interrupts
|
||||
- clocks
|
||||
- clock-names
|
||||
- xlnx,bus-width
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
|
@ -61,7 +61,7 @@ patternProperties:
|
||||
required:
|
||||
- reg
|
||||
|
||||
additionalProperties: true
|
||||
additionalProperties: false
|
||||
|
||||
allOf:
|
||||
- $ref: /schemas/spi/spi-peripheral-props.yaml#
|
||||
|
@ -45,5 +45,6 @@ examples:
|
||||
light-sensor@38 {
|
||||
compatible = "rohm,bu27010";
|
||||
reg = <0x38>;
|
||||
vdd-supply = <&vdd>;
|
||||
};
|
||||
};
|
||||
|
@ -106,6 +106,12 @@ properties:
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
maximum: 4096
|
||||
|
||||
dma-noncoherent:
|
||||
description:
|
||||
Present if the GIC redistributors permit programming shareability
|
||||
and cacheability attributes but are connected to a non-coherent
|
||||
downstream interconnect.
|
||||
|
||||
msi-controller:
|
||||
description:
|
||||
Only present if the Message Based Interrupt functionality is
|
||||
@ -193,6 +199,12 @@ patternProperties:
|
||||
compatible:
|
||||
const: arm,gic-v3-its
|
||||
|
||||
dma-noncoherent:
|
||||
description:
|
||||
Present if the GIC ITS permits programming shareability and
|
||||
cacheability attributes but is connected to a non-coherent
|
||||
downstream interconnect.
|
||||
|
||||
msi-controller: true
|
||||
|
||||
"#msi-cells":
|
||||
|
@ -37,6 +37,7 @@ properties:
|
||||
- renesas,intc-ex-r8a77990 # R-Car E3
|
||||
- renesas,intc-ex-r8a77995 # R-Car D3
|
||||
- renesas,intc-ex-r8a779a0 # R-Car V3U
|
||||
- renesas,intc-ex-r8a779f0 # R-Car S4-8
|
||||
- renesas,intc-ex-r8a779g0 # R-Car V4H
|
||||
- const: renesas,irqc
|
||||
|
||||
|
@ -19,20 +19,19 @@ description: |
|
||||
- NMI edge select (NMI is not treated as NMI exception and supports fall edge and
|
||||
stand-up edge detection interrupts)
|
||||
|
||||
allOf:
|
||||
- $ref: /schemas/interrupt-controller.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
items:
|
||||
- enum:
|
||||
- renesas,r9a07g043u-irqc # RZ/G2UL
|
||||
- renesas,r9a07g044-irqc # RZ/G2{L,LC}
|
||||
- renesas,r9a07g054-irqc # RZ/V2L
|
||||
- const: renesas,rzg2l-irqc
|
||||
|
||||
'#interrupt-cells':
|
||||
description: The first cell should contain external interrupt number (IRQ0-7) and the
|
||||
second cell is used to specify the flag.
|
||||
description: The first cell should contain a macro RZG2L_{NMI,IRQX} included in the
|
||||
include/dt-bindings/interrupt-controller/irqc-rzg2l.h and the second
|
||||
cell is used to specify the flag.
|
||||
const: 2
|
||||
|
||||
'#address-cells':
|
||||
@ -44,7 +43,96 @@ properties:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 41
|
||||
minItems: 41
|
||||
items:
|
||||
- description: NMI interrupt
|
||||
- description: IRQ0 interrupt
|
||||
- description: IRQ1 interrupt
|
||||
- description: IRQ2 interrupt
|
||||
- description: IRQ3 interrupt
|
||||
- description: IRQ4 interrupt
|
||||
- description: IRQ5 interrupt
|
||||
- description: IRQ6 interrupt
|
||||
- description: IRQ7 interrupt
|
||||
- description: GPIO interrupt, TINT0
|
||||
- description: GPIO interrupt, TINT1
|
||||
- description: GPIO interrupt, TINT2
|
||||
- description: GPIO interrupt, TINT3
|
||||
- description: GPIO interrupt, TINT4
|
||||
- description: GPIO interrupt, TINT5
|
||||
- description: GPIO interrupt, TINT6
|
||||
- description: GPIO interrupt, TINT7
|
||||
- description: GPIO interrupt, TINT8
|
||||
- description: GPIO interrupt, TINT9
|
||||
- description: GPIO interrupt, TINT10
|
||||
- description: GPIO interrupt, TINT11
|
||||
- description: GPIO interrupt, TINT12
|
||||
- description: GPIO interrupt, TINT13
|
||||
- description: GPIO interrupt, TINT14
|
||||
- description: GPIO interrupt, TINT15
|
||||
- description: GPIO interrupt, TINT16
|
||||
- description: GPIO interrupt, TINT17
|
||||
- description: GPIO interrupt, TINT18
|
||||
- description: GPIO interrupt, TINT19
|
||||
- description: GPIO interrupt, TINT20
|
||||
- description: GPIO interrupt, TINT21
|
||||
- description: GPIO interrupt, TINT22
|
||||
- description: GPIO interrupt, TINT23
|
||||
- description: GPIO interrupt, TINT24
|
||||
- description: GPIO interrupt, TINT25
|
||||
- description: GPIO interrupt, TINT26
|
||||
- description: GPIO interrupt, TINT27
|
||||
- description: GPIO interrupt, TINT28
|
||||
- description: GPIO interrupt, TINT29
|
||||
- description: GPIO interrupt, TINT30
|
||||
- description: GPIO interrupt, TINT31
|
||||
- description: Bus error interrupt
|
||||
|
||||
interrupt-names:
|
||||
minItems: 41
|
||||
items:
|
||||
- const: nmi
|
||||
- const: irq0
|
||||
- const: irq1
|
||||
- const: irq2
|
||||
- const: irq3
|
||||
- const: irq4
|
||||
- const: irq5
|
||||
- const: irq6
|
||||
- const: irq7
|
||||
- const: tint0
|
||||
- const: tint1
|
||||
- const: tint2
|
||||
- const: tint3
|
||||
- const: tint4
|
||||
- const: tint5
|
||||
- const: tint6
|
||||
- const: tint7
|
||||
- const: tint8
|
||||
- const: tint9
|
||||
- const: tint10
|
||||
- const: tint11
|
||||
- const: tint12
|
||||
- const: tint13
|
||||
- const: tint14
|
||||
- const: tint15
|
||||
- const: tint16
|
||||
- const: tint17
|
||||
- const: tint18
|
||||
- const: tint19
|
||||
- const: tint20
|
||||
- const: tint21
|
||||
- const: tint22
|
||||
- const: tint23
|
||||
- const: tint24
|
||||
- const: tint25
|
||||
- const: tint26
|
||||
- const: tint27
|
||||
- const: tint28
|
||||
- const: tint29
|
||||
- const: tint30
|
||||
- const: tint31
|
||||
- const: bus-err
|
||||
|
||||
clocks:
|
||||
maxItems: 2
|
||||
@ -72,6 +160,23 @@ required:
|
||||
- power-domains
|
||||
- resets
|
||||
|
||||
allOf:
|
||||
- $ref: /schemas/interrupt-controller.yaml#
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: renesas,r9a07g043u-irqc
|
||||
then:
|
||||
properties:
|
||||
interrupts:
|
||||
minItems: 42
|
||||
interrupt-names:
|
||||
minItems: 42
|
||||
required:
|
||||
- interrupt-names
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
@ -80,55 +185,66 @@ examples:
|
||||
#include <dt-bindings/clock/r9a07g044-cpg.h>
|
||||
|
||||
irqc: interrupt-controller@110a0000 {
|
||||
compatible = "renesas,r9a07g044-irqc", "renesas,rzg2l-irqc";
|
||||
reg = <0x110a0000 0x10000>;
|
||||
#interrupt-cells = <2>;
|
||||
#address-cells = <0>;
|
||||
interrupt-controller;
|
||||
interrupts = <GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 1 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 444 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 445 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 446 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 447 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 448 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 449 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 450 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 451 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 452 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 453 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 454 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 455 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 456 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 457 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 458 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 459 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 460 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 461 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 462 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 463 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 464 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 465 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 466 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 467 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 468 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 469 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 470 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 471 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 472 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 473 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 474 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 475 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&cpg CPG_MOD R9A07G044_IA55_CLK>,
|
||||
<&cpg CPG_MOD R9A07G044_IA55_PCLK>;
|
||||
clock-names = "clk", "pclk";
|
||||
power-domains = <&cpg>;
|
||||
resets = <&cpg R9A07G044_IA55_RESETN>;
|
||||
compatible = "renesas,r9a07g044-irqc", "renesas,rzg2l-irqc";
|
||||
reg = <0x110a0000 0x10000>;
|
||||
#interrupt-cells = <2>;
|
||||
#address-cells = <0>;
|
||||
interrupt-controller;
|
||||
interrupts = <GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 1 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 444 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 445 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 446 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 447 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 448 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 449 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 450 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 451 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 452 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 453 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 454 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 455 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 456 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 457 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 458 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 459 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 460 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 461 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 462 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 463 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 464 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 465 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 466 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 467 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 468 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 469 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 470 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 471 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 472 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 473 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 474 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 475 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-names = "nmi",
|
||||
"irq0", "irq1", "irq2", "irq3",
|
||||
"irq4", "irq5", "irq6", "irq7",
|
||||
"tint0", "tint1", "tint2", "tint3",
|
||||
"tint4", "tint5", "tint6", "tint7",
|
||||
"tint8", "tint9", "tint10", "tint11",
|
||||
"tint12", "tint13", "tint14", "tint15",
|
||||
"tint16", "tint17", "tint18", "tint19",
|
||||
"tint20", "tint21", "tint22", "tint23",
|
||||
"tint24", "tint25", "tint26", "tint27",
|
||||
"tint28", "tint29", "tint30", "tint31";
|
||||
clocks = <&cpg CPG_MOD R9A07G044_IA55_CLK>,
|
||||
<&cpg CPG_MOD R9A07G044_IA55_PCLK>;
|
||||
clock-names = "clk", "pclk";
|
||||
power-domains = <&cpg>;
|
||||
resets = <&cpg R9A07G044_IA55_RESETN>;
|
||||
};
|
||||
|
@ -270,6 +270,7 @@ allOf:
|
||||
contains:
|
||||
enum:
|
||||
- qcom,msm8998-smmu-v2
|
||||
- qcom,sdm630-smmu-v2
|
||||
then:
|
||||
anyOf:
|
||||
- properties:
|
||||
@ -311,7 +312,6 @@ allOf:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- qcom,sdm630-smmu-v2
|
||||
- qcom,sm6375-smmu-v2
|
||||
then:
|
||||
anyOf:
|
||||
|
@ -54,6 +54,7 @@ properties:
|
||||
|
||||
port:
|
||||
$ref: /schemas/graph.yaml#/$defs/port-base
|
||||
unevaluatedProperties: false
|
||||
|
||||
properties:
|
||||
endpoint:
|
||||
|
@ -69,6 +69,7 @@ properties:
|
||||
properties:
|
||||
port@0:
|
||||
$ref: /schemas/graph.yaml#/$defs/port-base
|
||||
unevaluatedProperties: false
|
||||
description: Input port
|
||||
|
||||
properties:
|
||||
@ -89,6 +90,7 @@ properties:
|
||||
|
||||
port@1:
|
||||
$ref: /schemas/graph.yaml#/$defs/port-base
|
||||
unevaluatedProperties: false
|
||||
description: Output port
|
||||
|
||||
properties:
|
||||
|
@ -59,7 +59,6 @@ allOf:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- fsl,imx8mq-csi
|
||||
- fsl,imx8mm-csi
|
||||
then:
|
||||
required:
|
||||
|
@ -95,7 +95,7 @@ properties:
|
||||
synchronization is selected.
|
||||
default: 1
|
||||
|
||||
field-active-even: true
|
||||
field-even-active: true
|
||||
|
||||
bus-width: true
|
||||
|
||||
@ -144,7 +144,7 @@ properties:
|
||||
synchronization is selected.
|
||||
default: 1
|
||||
|
||||
field-active-even: true
|
||||
field-even-active: true
|
||||
|
||||
bus-width: true
|
||||
|
||||
|
@ -57,6 +57,7 @@ properties:
|
||||
patternProperties:
|
||||
"^port@[01]$":
|
||||
$ref: /schemas/graph.yaml#/$defs/port-base
|
||||
unevaluatedProperties: false
|
||||
description:
|
||||
Camera A and camera B inputs.
|
||||
|
||||
|
@ -31,10 +31,6 @@ properties:
|
||||
charger:
|
||||
$ref: /schemas/power/supply/maxim,max77693.yaml
|
||||
|
||||
connector:
|
||||
$ref: /schemas/connector/usb-connector.yaml#
|
||||
unevaluatedProperties: false
|
||||
|
||||
led:
|
||||
$ref: /schemas/leds/maxim,max77693.yaml
|
||||
|
||||
|
@ -12,7 +12,6 @@ maintainers:
|
||||
|
||||
allOf:
|
||||
- $ref: /schemas/pci/pci-bus.yaml#
|
||||
- $ref: /schemas/interrupt-controller/msi-controller.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
@ -34,13 +33,6 @@ properties:
|
||||
description: >
|
||||
Base address and length of the PCIe controller I/O register space
|
||||
|
||||
interrupt-map: true
|
||||
|
||||
interrupt-map-mask: true
|
||||
|
||||
"#interrupt-cells":
|
||||
const: 1
|
||||
|
||||
ranges:
|
||||
minItems: 1
|
||||
maxItems: 2
|
||||
@ -54,16 +46,8 @@ properties:
|
||||
items:
|
||||
- const: pcie-phy
|
||||
|
||||
bus-range: true
|
||||
|
||||
dma-coherent: true
|
||||
|
||||
"#address-cells": true
|
||||
|
||||
"#size-cells": true
|
||||
|
||||
device_type: true
|
||||
|
||||
brcm,pcie-ob:
|
||||
type: boolean
|
||||
description: >
|
||||
@ -78,21 +62,25 @@ properties:
|
||||
|
||||
msi:
|
||||
type: object
|
||||
$ref: /schemas/interrupt-controller/msi-controller.yaml#
|
||||
unevaluatedProperties: false
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
items:
|
||||
- const: brcm,iproc-msi
|
||||
|
||||
interrupts:
|
||||
maxItems: 4
|
||||
|
||||
brcm,pcie-msi-inten:
|
||||
type: boolean
|
||||
description:
|
||||
Needs to be present for some older iProc platforms that require the
|
||||
interrupt enable registers to be set explicitly to enable MSI
|
||||
|
||||
msi-parent: true
|
||||
|
||||
msi-controller: true
|
||||
|
||||
brcm,pcie-msi-inten:
|
||||
type: boolean
|
||||
description: >
|
||||
Needs to be present for some older iProc platforms that require the
|
||||
interrupt enable registers to be set explicitly to enable MSI
|
||||
|
||||
dependencies:
|
||||
brcm,pcie-ob-axi-offset: ["brcm,pcie-ob"]
|
||||
brcm,pcie-msi-inten: [msi-controller]
|
||||
@ -117,68 +105,69 @@ unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
|
||||
bus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
pcie0: pcie@18012000 {
|
||||
compatible = "brcm,iproc-pcie";
|
||||
reg = <0x18012000 0x1000>;
|
||||
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-map-mask = <0 0 0 0>;
|
||||
interrupt-map = <0 0 0 0 &gic GIC_SPI 100 IRQ_TYPE_NONE>;
|
||||
|
||||
linux,pci-domain = <0>;
|
||||
|
||||
bus-range = <0x00 0xff>;
|
||||
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
device_type = "pci";
|
||||
ranges = <0x81000000 0 0 0x28000000 0 0x00010000>,
|
||||
<0x82000000 0 0x20000000 0x20000000 0 0x04000000>;
|
||||
|
||||
phys = <&phy 0 5>;
|
||||
phy-names = "pcie-phy";
|
||||
|
||||
brcm,pcie-ob;
|
||||
brcm,pcie-ob-axi-offset = <0x00000000>;
|
||||
|
||||
msi-parent = <&msi0>;
|
||||
|
||||
/* iProc event queue based MSI */
|
||||
msi0: msi {
|
||||
compatible = "brcm,iproc-msi";
|
||||
msi-controller;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupts = <GIC_SPI 96 IRQ_TYPE_NONE>,
|
||||
<GIC_SPI 97 IRQ_TYPE_NONE>,
|
||||
<GIC_SPI 98 IRQ_TYPE_NONE>,
|
||||
<GIC_SPI 99 IRQ_TYPE_NONE>;
|
||||
};
|
||||
};
|
||||
|
||||
pcie1: pcie@18013000 {
|
||||
compatible = "brcm,iproc-pcie";
|
||||
reg = <0x18013000 0x1000>;
|
||||
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-map-mask = <0 0 0 0>;
|
||||
interrupt-map = <0 0 0 0 &gic GIC_SPI 106 IRQ_TYPE_NONE>;
|
||||
|
||||
linux,pci-domain = <1>;
|
||||
|
||||
bus-range = <0x00 0xff>;
|
||||
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
device_type = "pci";
|
||||
ranges = <0x81000000 0 0 0x48000000 0 0x00010000>,
|
||||
<0x82000000 0 0x40000000 0x40000000 0 0x04000000>;
|
||||
|
||||
phys = <&phy 1 6>;
|
||||
phy-names = "pcie-phy";
|
||||
};
|
||||
gic: interrupt-controller {
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <3>;
|
||||
};
|
||||
|
||||
pcie@18012000 {
|
||||
compatible = "brcm,iproc-pcie";
|
||||
reg = <0x18012000 0x1000>;
|
||||
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-map-mask = <0 0 0 0>;
|
||||
interrupt-map = <0 0 0 0 &gic GIC_SPI 100 IRQ_TYPE_NONE>;
|
||||
|
||||
linux,pci-domain = <0>;
|
||||
|
||||
bus-range = <0x00 0xff>;
|
||||
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
device_type = "pci";
|
||||
ranges = <0x81000000 0 0 0x28000000 0 0x00010000>,
|
||||
<0x82000000 0 0x20000000 0x20000000 0 0x04000000>;
|
||||
|
||||
phys = <&phy 0 5>;
|
||||
phy-names = "pcie-phy";
|
||||
|
||||
brcm,pcie-ob;
|
||||
brcm,pcie-ob-axi-offset = <0x00000000>;
|
||||
|
||||
msi-parent = <&msi0>;
|
||||
|
||||
/* iProc event queue based MSI */
|
||||
msi0: msi {
|
||||
compatible = "brcm,iproc-msi";
|
||||
msi-controller;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupts = <GIC_SPI 96 IRQ_TYPE_NONE>,
|
||||
<GIC_SPI 97 IRQ_TYPE_NONE>,
|
||||
<GIC_SPI 98 IRQ_TYPE_NONE>,
|
||||
<GIC_SPI 99 IRQ_TYPE_NONE>;
|
||||
};
|
||||
};
|
||||
- |
|
||||
pcie@18013000 {
|
||||
compatible = "brcm,iproc-pcie";
|
||||
reg = <0x18013000 0x1000>;
|
||||
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-map-mask = <0 0 0 0>;
|
||||
interrupt-map = <0 0 0 0 &gic GIC_SPI 106 IRQ_TYPE_NONE>;
|
||||
|
||||
linux,pci-domain = <1>;
|
||||
|
||||
bus-range = <0x00 0xff>;
|
||||
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
device_type = "pci";
|
||||
ranges = <0x81000000 0 0 0x48000000 0 0x00010000>,
|
||||
<0x82000000 0 0x40000000 0x40000000 0 0x04000000>;
|
||||
|
||||
phys = <&phy 1 6>;
|
||||
phy-names = "pcie-phy";
|
||||
};
|
||||
|
@ -91,6 +91,7 @@ properties:
|
||||
|
||||
interrupt-controller:
|
||||
type: object
|
||||
additionalProperties: false
|
||||
description: Describes the CPU's local interrupt controller
|
||||
|
||||
properties:
|
||||
|
@ -56,6 +56,9 @@ properties:
|
||||
- const: clkext3
|
||||
minItems: 2
|
||||
|
||||
"#sound-dai-cells":
|
||||
const: 0
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
|
@ -26,6 +26,7 @@ properties:
|
||||
- const: rockchip,rk3568-spdif
|
||||
- items:
|
||||
- enum:
|
||||
- rockchip,rk3128-spdif
|
||||
- rockchip,rk3188-spdif
|
||||
- rockchip,rk3288-spdif
|
||||
- rockchip,rk3308-spdif
|
||||
|
@ -232,7 +232,7 @@ properties:
|
||||
# MEMSIC magnetometer
|
||||
- memsic,mmc35240
|
||||
# MEMSIC 3-axis accelerometer
|
||||
- memsic,mx4005
|
||||
- memsic,mxc4005
|
||||
# MEMSIC 2-axis 8-bit digital accelerometer
|
||||
- memsic,mxc6225
|
||||
# MEMSIC 2-axis 8-bit digital accelerometer
|
||||
|
@ -58,12 +58,14 @@ Here are the main features of EROFS:
|
||||
|
||||
- Support extended attributes as an option;
|
||||
|
||||
- Support a bloom filter that speeds up negative extended attribute lookups;
|
||||
|
||||
- Support POSIX.1e ACLs by using extended attributes;
|
||||
|
||||
- Support transparent data compression as an option:
|
||||
LZ4 and MicroLZMA algorithms can be used on a per-file basis; In addition,
|
||||
inplace decompression is also supported to avoid bounce compressed buffers
|
||||
and page cache thrashing.
|
||||
LZ4, MicroLZMA and DEFLATE algorithms can be used on a per-file basis; In
|
||||
addition, inplace decompression is also supported to avoid bounce compressed
|
||||
buffers and unnecessary page cache thrashing.
|
||||
|
||||
- Support chunk-based data deduplication and rolling-hash compressed data
|
||||
deduplication;
|
||||
@ -268,6 +270,38 @@ details.)
|
||||
|
||||
By the way, chunk-based files are all uncompressed for now.
|
||||
|
||||
Long extended attribute name prefixes
|
||||
-------------------------------------
|
||||
There are use cases where extended attributes with different values can have
|
||||
only a few common prefixes (such as overlayfs xattrs). The predefined prefixes
|
||||
work inefficiently in both image size and runtime performance in such cases.
|
||||
|
||||
The long xattr name prefixes feature is introduced to address this issue. The
|
||||
overall idea is that, apart from the existing predefined prefixes, the xattr
|
||||
entry could also refer to user-specified long xattr name prefixes, e.g.
|
||||
"trusted.overlay.".
|
||||
|
||||
When referring to a long xattr name prefix, the highest bit (bit 7) of
|
||||
erofs_xattr_entry.e_name_index is set, while the lower bits (bit 0-6) as a whole
|
||||
represent the index of the referred long name prefix among all long name
|
||||
prefixes. Therefore, only the trailing part of the name apart from the long
|
||||
xattr name prefix is stored in erofs_xattr_entry.e_name, which could be empty if
|
||||
the full xattr name matches exactly as its long xattr name prefix.
|
||||
|
||||
All long xattr prefixes are stored one by one in the packed inode as long as
|
||||
the packed inode is valid, or in the meta inode otherwise. The
|
||||
xattr_prefix_count (of the on-disk superblock) indicates the total number of
|
||||
long xattr name prefixes, while (xattr_prefix_start * 4) indicates the start
|
||||
offset of long name prefixes in the packed/meta inode. Note that, long extended
|
||||
attribute name prefixes are disabled if xattr_prefix_count is 0.
|
||||
|
||||
Each long name prefix is stored in the format: ALIGN({__le16 len, data}, 4),
|
||||
where len represents the total size of the data part. The data part is actually
|
||||
represented by 'struct erofs_xattr_long_prefix', where base_index represents the
|
||||
index of the predefined xattr name prefix, e.g. EROFS_XATTR_INDEX_TRUSTED for
|
||||
"trusted.overlay." long name prefix, while the infix string keeps the string
|
||||
after stripping the short prefix, e.g. "overlay." for the example above.
|
||||
|
||||
Data compression
|
||||
----------------
|
||||
EROFS implements fixed-sized output compression which generates fixed-sized
|
||||
|
@ -339,6 +339,18 @@ The specified lower directories will be stacked beginning from the
|
||||
rightmost one and going left. In the above example lower1 will be the
|
||||
top, lower2 the middle and lower3 the bottom layer.
|
||||
|
||||
Note: directory names containing colons can be provided as lower layer by
|
||||
escaping the colons with a single backslash. For example:
|
||||
|
||||
mount -t overlay overlay -olowerdir=/a\:lower\:\:dir /merged
|
||||
|
||||
Since kernel version v6.5, directory names containing colons can also
|
||||
be provided as lower layer using the fsconfig syscall from new mount api:
|
||||
|
||||
fsconfig(fs_fd, FSCONFIG_SET_STRING, "lowerdir", "/a:lower::dir", 0);
|
||||
|
||||
In the latter case, colons in lower layer directory names will be escaped
|
||||
as an octal characters (\072) when displayed in /proc/self/mountinfo.
|
||||
|
||||
Metadata only copy up
|
||||
---------------------
|
||||
|
@ -25,15 +25,15 @@ Contact
|
||||
The Linux kernel hardware security team is separate from the regular Linux
|
||||
kernel security team.
|
||||
|
||||
The team only handles the coordination of embargoed hardware security
|
||||
issues. Reports of pure software security bugs in the Linux kernel are not
|
||||
The team only handles developing fixes for embargoed hardware security
|
||||
issues. Reports of pure software security bugs in the Linux kernel are not
|
||||
handled by this team and the reporter will be guided to contact the regular
|
||||
Linux kernel security team (:ref:`Documentation/admin-guide/
|
||||
<securitybugs>`) instead.
|
||||
|
||||
The team can be contacted by email at <hardware-security@kernel.org>. This
|
||||
is a private list of security officers who will help you to coordinate an
|
||||
issue according to our documented process.
|
||||
is a private list of security officers who will help you to coordinate a
|
||||
fix according to our documented process.
|
||||
|
||||
The list is encrypted and email to the list can be sent by either PGP or
|
||||
S/MIME encrypted and must be signed with the reporter's PGP key or S/MIME
|
||||
@ -132,11 +132,11 @@ other hardware could be affected.
|
||||
|
||||
The hardware security team will provide an incident-specific encrypted
|
||||
mailing-list which will be used for initial discussion with the reporter,
|
||||
further disclosure and coordination.
|
||||
further disclosure, and coordination of fixes.
|
||||
|
||||
The hardware security team will provide the disclosing party a list of
|
||||
developers (domain experts) who should be informed initially about the
|
||||
issue after confirming with the developers that they will adhere to this
|
||||
issue after confirming with the developers that they will adhere to this
|
||||
Memorandum of Understanding and the documented process. These developers
|
||||
form the initial response team and will be responsible for handling the
|
||||
issue after initial contact. The hardware security team is supporting the
|
||||
@ -209,13 +209,18 @@ five work days this is taken as silent acknowledgement.
|
||||
After acknowledgement or resolution of an objection the expert is disclosed
|
||||
by the incident team and brought into the development process.
|
||||
|
||||
List participants may not communicate about the issue outside of the
|
||||
private mailing list. List participants may not use any shared resources
|
||||
(e.g. employer build farms, CI systems, etc) when working on patches.
|
||||
|
||||
|
||||
Coordinated release
|
||||
"""""""""""""""""""
|
||||
|
||||
The involved parties will negotiate the date and time where the embargo
|
||||
ends. At that point the prepared mitigations are integrated into the
|
||||
relevant kernel trees and published.
|
||||
relevant kernel trees and published. There is no pre-notification process:
|
||||
fixes are published in public and available to everyone at the same time.
|
||||
|
||||
While we understand that hardware security issues need coordinated embargo
|
||||
time, the embargo time should be constrained to the minimum time which is
|
||||
|
@ -36,11 +36,11 @@ EXAMPLE
|
||||
In the example below, **rtla timerlat hist** is set to run for *10* minutes,
|
||||
in the cpus *0-4*, *skipping zero* only lines. Moreover, **rtla timerlat
|
||||
hist** will change the priority of the *timerlat* threads to run under
|
||||
*SCHED_DEADLINE* priority, with a *10us* runtime every *1ms* period. The
|
||||
*SCHED_DEADLINE* priority, with a *100us* runtime every *1ms* period. The
|
||||
*1ms* period is also passed to the *timerlat* tracer. Auto-analysis is disabled
|
||||
to reduce overhead ::
|
||||
|
||||
[root@alien ~]# timerlat hist -d 10m -c 0-4 -P d:100us:1ms -p 1ms --no-aa
|
||||
[root@alien ~]# timerlat hist -d 10m -c 0-4 -P d:100us:1ms -p 1000 --no-aa
|
||||
# RTLA timerlat histogram
|
||||
# Time unit is microseconds (us)
|
||||
# Duration: 0 00:10:00
|
||||
|
@ -202,7 +202,7 @@ workqueue将自动创建与属性相匹配的后备工作者池。调节并发
|
||||
同的排序属性。
|
||||
|
||||
在目前的实现中,上述配置只保证了特定NUMA节点内的ST行为。相反,
|
||||
``alloc_ordered_queue()`` 应该被用来实现全系统的ST行为。
|
||||
``alloc_ordered_workqueue()`` 应该被用来实现全系统的ST行为。
|
||||
|
||||
|
||||
执行场景示例
|
||||
|
60
MAINTAINERS
60
MAINTAINERS
@ -470,7 +470,6 @@ F: drivers/hwmon/adm1029.c
|
||||
ADM8211 WIRELESS DRIVER
|
||||
L: linux-wireless@vger.kernel.org
|
||||
S: Orphan
|
||||
W: https://wireless.wiki.kernel.org/
|
||||
F: drivers/net/wireless/admtek/adm8211.*
|
||||
|
||||
ADP1653 FLASH CONTROLLER DRIVER
|
||||
@ -1585,6 +1584,17 @@ F: arch/arm/include/asm/arch_timer.h
|
||||
F: arch/arm64/include/asm/arch_timer.h
|
||||
F: drivers/clocksource/arm_arch_timer.c
|
||||
|
||||
ARM GENERIC INTERRUPT CONTROLLER DRIVERS
|
||||
M: Marc Zyngier <maz@kernel.org>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/interrupt-controller/arm,gic*
|
||||
F: arch/arm/include/asm/arch_gicv3.h
|
||||
F: arch/arm64/include/asm/arch_gicv3.h
|
||||
F: drivers/irqchip/irq-gic*.[ch]
|
||||
F: include/linux/irqchip/arm-gic*.h
|
||||
F: include/linux/irqchip/arm-vgic-info.h
|
||||
|
||||
ARM HDLCD DRM DRIVER
|
||||
M: Liviu Dudau <liviu.dudau@arm.com>
|
||||
S: Supported
|
||||
@ -2211,21 +2221,28 @@ F: arch/arm/boot/dts/ti/omap/omap3-igep*
|
||||
ARM/INTEL IXP4XX ARM ARCHITECTURE
|
||||
M: Linus Walleij <linusw@kernel.org>
|
||||
M: Imre Kaloz <kaloz@openwrt.org>
|
||||
M: Krzysztof Halasa <khalasa@piap.pl>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/arm/intel-ixp4xx.yaml
|
||||
F: Documentation/devicetree/bindings/gpio/intel,ixp4xx-gpio.txt
|
||||
F: Documentation/devicetree/bindings/interrupt-controller/intel,ixp4xx-interrupt.yaml
|
||||
F: Documentation/devicetree/bindings/memory-controllers/intel,ixp4xx-expansion*
|
||||
F: Documentation/devicetree/bindings/rng/intel,ixp46x-rng.yaml
|
||||
F: Documentation/devicetree/bindings/timer/intel,ixp4xx-timer.yaml
|
||||
F: arch/arm/boot/dts/intel/ixp/
|
||||
F: arch/arm/mach-ixp4xx/
|
||||
F: drivers/bus/intel-ixp4xx-eb.c
|
||||
F: drivers/char/hw_random/ixp4xx-rng.c
|
||||
F: drivers/clocksource/timer-ixp4xx.c
|
||||
F: drivers/crypto/intel/ixp4xx/ixp4xx_crypto.c
|
||||
F: drivers/gpio/gpio-ixp4xx.c
|
||||
F: drivers/irqchip/irq-ixp4xx.c
|
||||
F: drivers/net/ethernet/xscale/ixp4xx_eth.c
|
||||
F: drivers/net/wan/ixp4xx_hss.c
|
||||
F: drivers/soc/ixp4xx/ixp4xx-npe.c
|
||||
F: drivers/soc/ixp4xx/ixp4xx-qmgr.c
|
||||
F: include/linux/soc/ixp4xx/npe.h
|
||||
F: include/linux/soc/ixp4xx/qmgr.h
|
||||
|
||||
ARM/INTEL KEEMBAY ARCHITECTURE
|
||||
M: Paul J. Murphy <paul.j.murphy@intel.com>
|
||||
@ -2327,7 +2344,7 @@ F: drivers/rtc/rtc-mt7622.c
|
||||
|
||||
ARM/Mediatek SoC support
|
||||
M: Matthias Brugger <matthias.bgg@gmail.com>
|
||||
R: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
|
||||
M: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
|
||||
L: linux-kernel@vger.kernel.org
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
L: linux-mediatek@lists.infradead.org (moderated for non-subscribers)
|
||||
@ -5985,8 +6002,8 @@ F: include/linux/devm-helpers.h
|
||||
DEVICE-MAPPER (LVM)
|
||||
M: Alasdair Kergon <agk@redhat.com>
|
||||
M: Mike Snitzer <snitzer@kernel.org>
|
||||
M: dm-devel@redhat.com
|
||||
L: dm-devel@redhat.com
|
||||
M: dm-devel@lists.linux.dev
|
||||
L: dm-devel@lists.linux.dev
|
||||
S: Maintained
|
||||
W: http://sources.redhat.com/dm
|
||||
Q: http://patchwork.kernel.org/project/dm-devel/list/
|
||||
@ -8093,7 +8110,7 @@ F: include/linux/arm_ffa.h
|
||||
|
||||
FIRMWARE LOADER (request_firmware)
|
||||
M: Luis Chamberlain <mcgrof@kernel.org>
|
||||
M: Russ Weight <russell.h.weight@intel.com>
|
||||
M: Russ Weight <russ.weight@linux.dev>
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/firmware_class/
|
||||
@ -9531,10 +9548,8 @@ F: Documentation/devicetree/bindings/iio/pressure/honeywell,mprls0025pa.yaml
|
||||
F: drivers/iio/pressure/mprls0025pa.c
|
||||
|
||||
HOST AP DRIVER
|
||||
M: Jouni Malinen <j@w1.fi>
|
||||
L: linux-wireless@vger.kernel.org
|
||||
S: Obsolete
|
||||
W: http://w1.fi/hostap-driver.html
|
||||
F: drivers/net/wireless/intersil/hostap/
|
||||
|
||||
HP BIOSCFG DRIVER
|
||||
@ -10622,22 +10637,6 @@ L: linux-crypto@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/crypto/intel/ixp4xx/ixp4xx_crypto.c
|
||||
|
||||
INTEL IXP4XX QMGR, NPE, ETHERNET and HSS SUPPORT
|
||||
M: Krzysztof Halasa <khalasa@piap.pl>
|
||||
S: Maintained
|
||||
F: drivers/net/ethernet/xscale/ixp4xx_eth.c
|
||||
F: drivers/net/wan/ixp4xx_hss.c
|
||||
F: drivers/soc/ixp4xx/ixp4xx-npe.c
|
||||
F: drivers/soc/ixp4xx/ixp4xx-qmgr.c
|
||||
F: include/linux/soc/ixp4xx/npe.h
|
||||
F: include/linux/soc/ixp4xx/qmgr.h
|
||||
|
||||
INTEL IXP4XX RANDOM NUMBER GENERATOR SUPPORT
|
||||
M: Deepak Saxena <dsaxena@plexity.net>
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/rng/intel,ixp46x-rng.yaml
|
||||
F: drivers/char/hw_random/ixp4xx-rng.c
|
||||
|
||||
INTEL KEEM BAY DRM DRIVER
|
||||
M: Anitha Chrisanthus <anitha.chrisanthus@intel.com>
|
||||
M: Edmund Dea <edmund.j.dea@intel.com>
|
||||
@ -11063,7 +11062,7 @@ F: Documentation/devicetree/bindings/sound/irondevice,*
|
||||
F: sound/soc/codecs/sma*
|
||||
|
||||
IRQ DOMAINS (IRQ NUMBER MAPPING LIBRARY)
|
||||
M: Marc Zyngier <maz@kernel.org>
|
||||
M: Thomas Gleixner <tglx@linutronix.de>
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git irq/core
|
||||
F: Documentation/core-api/irq/irq-domain.rst
|
||||
@ -11082,7 +11081,6 @@ F: lib/group_cpus.c
|
||||
|
||||
IRQCHIP DRIVERS
|
||||
M: Thomas Gleixner <tglx@linutronix.de>
|
||||
M: Marc Zyngier <maz@kernel.org>
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git irq/core
|
||||
@ -14947,7 +14945,7 @@ K: macsec
|
||||
K: \bmdo_
|
||||
|
||||
NETWORKING [MPTCP]
|
||||
M: Matthieu Baerts <matthieu.baerts@tessares.net>
|
||||
M: Matthieu Baerts <matttbe@kernel.org>
|
||||
M: Mat Martineau <martineau@kernel.org>
|
||||
L: netdev@vger.kernel.org
|
||||
L: mptcp@lists.linux.dev
|
||||
@ -17602,6 +17600,7 @@ M: Kalle Valo <kvalo@kernel.org>
|
||||
M: Jeff Johnson <quic_jjohnson@quicinc.com>
|
||||
L: ath12k@lists.infradead.org
|
||||
S: Supported
|
||||
W: https://wireless.wiki.kernel.org/en/users/Drivers/ath12k
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git
|
||||
F: drivers/net/wireless/ath/ath12k/
|
||||
|
||||
@ -18132,8 +18131,6 @@ REALTEK WIRELESS DRIVER (rtlwifi family)
|
||||
M: Ping-Ke Shih <pkshih@realtek.com>
|
||||
L: linux-wireless@vger.kernel.org
|
||||
S: Maintained
|
||||
W: https://wireless.wiki.kernel.org/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-testing.git
|
||||
F: drivers/net/wireless/realtek/rtlwifi/
|
||||
|
||||
REALTEK WIRELESS DRIVER (rtw88)
|
||||
@ -18661,7 +18658,6 @@ F: drivers/media/dvb-frontends/rtl2832_sdr*
|
||||
RTL8180 WIRELESS DRIVER
|
||||
L: linux-wireless@vger.kernel.org
|
||||
S: Orphan
|
||||
W: https://wireless.wiki.kernel.org/
|
||||
F: drivers/net/wireless/realtek/rtl818x/rtl8180/
|
||||
|
||||
RTL8187 WIRELESS DRIVER
|
||||
@ -18669,14 +18665,12 @@ M: Hin-Tak Leung <hintak.leung@gmail.com>
|
||||
M: Larry Finger <Larry.Finger@lwfinger.net>
|
||||
L: linux-wireless@vger.kernel.org
|
||||
S: Maintained
|
||||
W: https://wireless.wiki.kernel.org/
|
||||
F: drivers/net/wireless/realtek/rtl818x/rtl8187/
|
||||
|
||||
RTL8XXXU WIRELESS DRIVER (rtl8xxxu)
|
||||
M: Jes Sorensen <Jes.Sorensen@gmail.com>
|
||||
L: linux-wireless@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jes/linux.git rtl8xxxu-devel
|
||||
F: drivers/net/wireless/realtek/rtl8xxxu/
|
||||
|
||||
RTRS TRANSPORT DRIVERS
|
||||
@ -20490,6 +20484,7 @@ F: include/dt-bindings/clock/starfive?jh71*.h
|
||||
STARFIVE JH71X0 PINCTRL DRIVERS
|
||||
M: Emil Renner Berthing <kernel@esmil.dk>
|
||||
M: Jianlong Huang <jianlong.huang@starfivetech.com>
|
||||
M: Hal Feng <hal.feng@starfivetech.com>
|
||||
L: linux-gpio@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/pinctrl/starfive,jh71*.yaml
|
||||
@ -21658,7 +21653,6 @@ L: linux-wireless@vger.kernel.org
|
||||
S: Orphan
|
||||
W: https://wireless.wiki.kernel.org/en/users/Drivers/wl12xx
|
||||
W: https://wireless.wiki.kernel.org/en/users/Drivers/wl1251
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/luca/wl12xx.git
|
||||
F: drivers/net/wireless/ti/
|
||||
|
||||
TIMEKEEPING, CLOCKSOURCE CORE, NTP, ALARMTIMER
|
||||
|
2
Makefile
2
Makefile
@ -2,7 +2,7 @@
|
||||
VERSION = 6
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc4
|
||||
EXTRAVERSION = -rc6
|
||||
NAME = Hurr durr I'ma ninja sloth
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
@ -1037,6 +1037,19 @@ config ARM64_ERRATUM_2645198
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
config ARM64_ERRATUM_2966298
|
||||
bool "Cortex-A520: 2966298: workaround for speculatively executed unprivileged load"
|
||||
default y
|
||||
help
|
||||
This option adds the workaround for ARM Cortex-A520 erratum 2966298.
|
||||
|
||||
On an affected Cortex-A520 core, a speculatively executed unprivileged
|
||||
load might leak data from a privileged level via a cache side channel.
|
||||
|
||||
Work around this problem by executing a TLBI before returning to EL0.
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
config CAVIUM_ERRATUM_22375
|
||||
bool "Cavium erratum 22375, 24313"
|
||||
default y
|
||||
|
@ -185,7 +185,7 @@
|
||||
#size-cells = <1>;
|
||||
ranges;
|
||||
|
||||
anomix_ns_gpr: syscon@44210000 {
|
||||
aonmix_ns_gpr: syscon@44210000 {
|
||||
compatible = "fsl,imx93-aonmix-ns-syscfg", "syscon";
|
||||
reg = <0x44210000 0x1000>;
|
||||
};
|
||||
@ -319,6 +319,7 @@
|
||||
assigned-clock-parents = <&clk IMX93_CLK_SYS_PLL_PFD1_DIV2>;
|
||||
assigned-clock-rates = <40000000>;
|
||||
fsl,clk-source = /bits/ 8 <0>;
|
||||
fsl,stop-mode = <&aonmix_ns_gpr 0x14 0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@ -591,6 +592,7 @@
|
||||
assigned-clock-parents = <&clk IMX93_CLK_SYS_PLL_PFD1_DIV2>;
|
||||
assigned-clock-rates = <40000000>;
|
||||
fsl,clk-source = /bits/ 8 <0>;
|
||||
fsl,stop-mode = <&wakeupmix_gpr 0x0c 2>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -905,7 +905,7 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
sata_phy: t-phy@1a243000 {
|
||||
sata_phy: t-phy {
|
||||
compatible = "mediatek,mt7622-tphy",
|
||||
"mediatek,generic-tphy-v1";
|
||||
#address-cells = <2>;
|
||||
|
@ -434,7 +434,7 @@
|
||||
};
|
||||
};
|
||||
|
||||
pcie_phy: t-phy@11c00000 {
|
||||
pcie_phy: t-phy {
|
||||
compatible = "mediatek,mt7986-tphy",
|
||||
"mediatek,generic-tphy-v2";
|
||||
#address-cells = <2>;
|
||||
|
@ -48,7 +48,7 @@
|
||||
|
||||
memory@40000000 {
|
||||
device_type = "memory";
|
||||
reg = <0 0x40000000 0 0x80000000>;
|
||||
reg = <0 0x40000000 0x2 0x00000000>;
|
||||
};
|
||||
|
||||
reserved-memory {
|
||||
@ -56,13 +56,8 @@
|
||||
#size-cells = <2>;
|
||||
ranges;
|
||||
|
||||
/* 2 MiB reserved for ARM Trusted Firmware (BL31) */
|
||||
bl31_secmon_reserved: secmon@54600000 {
|
||||
no-map;
|
||||
reg = <0 0x54600000 0x0 0x200000>;
|
||||
};
|
||||
|
||||
/* 12 MiB reserved for OP-TEE (BL32)
|
||||
/*
|
||||
* 12 MiB reserved for OP-TEE (BL32)
|
||||
* +-----------------------+ 0x43e0_0000
|
||||
* | SHMEM 2MiB |
|
||||
* +-----------------------+ 0x43c0_0000
|
||||
@ -75,6 +70,34 @@
|
||||
no-map;
|
||||
reg = <0 0x43200000 0 0x00c00000>;
|
||||
};
|
||||
|
||||
scp_mem: memory@50000000 {
|
||||
compatible = "shared-dma-pool";
|
||||
reg = <0 0x50000000 0 0x2900000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
vpu_mem: memory@53000000 {
|
||||
compatible = "shared-dma-pool";
|
||||
reg = <0 0x53000000 0 0x1400000>; /* 20 MB */
|
||||
};
|
||||
|
||||
/* 2 MiB reserved for ARM Trusted Firmware (BL31) */
|
||||
bl31_secmon_mem: memory@54600000 {
|
||||
no-map;
|
||||
reg = <0 0x54600000 0x0 0x200000>;
|
||||
};
|
||||
|
||||
snd_dma_mem: memory@60000000 {
|
||||
compatible = "shared-dma-pool";
|
||||
reg = <0 0x60000000 0 0x1100000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
apu_mem: memory@62000000 {
|
||||
compatible = "shared-dma-pool";
|
||||
reg = <0 0x62000000 0 0x1400000>; /* 20 MB */
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -313,6 +313,7 @@
|
||||
interrupts = <GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH 0>;
|
||||
cpus = <&cpu0>, <&cpu1>, <&cpu2>, <&cpu3>,
|
||||
<&cpu4>, <&cpu5>, <&cpu6>, <&cpu7>;
|
||||
status = "fail";
|
||||
};
|
||||
|
||||
dmic_codec: dmic-codec {
|
||||
|
@ -3958,7 +3958,7 @@
|
||||
|
||||
pdc: interrupt-controller@b220000 {
|
||||
compatible = "qcom,sm8150-pdc", "qcom,pdc";
|
||||
reg = <0 0x0b220000 0 0x400>;
|
||||
reg = <0 0x0b220000 0 0x30000>;
|
||||
qcom,pdc-ranges = <0 480 94>, <94 609 31>,
|
||||
<125 63 1>;
|
||||
#interrupt-cells = <2>;
|
||||
|
@ -9,6 +9,7 @@
|
||||
#ifndef _ASM_ACPI_H
|
||||
#define _ASM_ACPI_H
|
||||
|
||||
#include <linux/cpuidle.h>
|
||||
#include <linux/efi.h>
|
||||
#include <linux/memblock.h>
|
||||
#include <linux/psci.h>
|
||||
@ -44,6 +45,24 @@
|
||||
|
||||
#define ACPI_MADT_GICC_TRBE (offsetof(struct acpi_madt_generic_interrupt, \
|
||||
trbe_interrupt) + sizeof(u16))
|
||||
/*
|
||||
* Arm® Functional Fixed Hardware Specification Version 1.2.
|
||||
* Table 2: Arm Architecture context loss flags
|
||||
*/
|
||||
#define CPUIDLE_CORE_CTXT BIT(0) /* Core context Lost */
|
||||
|
||||
static inline unsigned int arch_get_idle_state_flags(u32 arch_flags)
|
||||
{
|
||||
if (arch_flags & CPUIDLE_CORE_CTXT)
|
||||
return CPUIDLE_FLAG_TIMER_STOP;
|
||||
|
||||
return 0;
|
||||
}
|
||||
#define arch_get_idle_state_flags arch_get_idle_state_flags
|
||||
|
||||
#define CPUIDLE_TRACE_CTXT BIT(1) /* Trace context loss */
|
||||
#define CPUIDLE_GICR_CTXT BIT(2) /* GICR */
|
||||
#define CPUIDLE_GICD_CTXT BIT(3) /* GICD */
|
||||
|
||||
/* Basic configuration for ACPI */
|
||||
#ifdef CONFIG_ACPI
|
||||
|
@ -79,6 +79,7 @@
|
||||
#define ARM_CPU_PART_CORTEX_A78AE 0xD42
|
||||
#define ARM_CPU_PART_CORTEX_X1 0xD44
|
||||
#define ARM_CPU_PART_CORTEX_A510 0xD46
|
||||
#define ARM_CPU_PART_CORTEX_A520 0xD80
|
||||
#define ARM_CPU_PART_CORTEX_A710 0xD47
|
||||
#define ARM_CPU_PART_CORTEX_A715 0xD4D
|
||||
#define ARM_CPU_PART_CORTEX_X2 0xD48
|
||||
@ -148,6 +149,7 @@
|
||||
#define MIDR_CORTEX_A78AE MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A78AE)
|
||||
#define MIDR_CORTEX_X1 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_X1)
|
||||
#define MIDR_CORTEX_A510 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A510)
|
||||
#define MIDR_CORTEX_A520 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A520)
|
||||
#define MIDR_CORTEX_A710 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A710)
|
||||
#define MIDR_CORTEX_A715 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A715)
|
||||
#define MIDR_CORTEX_X2 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_X2)
|
||||
|
@ -730,6 +730,14 @@ const struct arm64_cpu_capabilities arm64_errata[] = {
|
||||
.cpu_enable = cpu_clear_bf16_from_user_emulation,
|
||||
},
|
||||
#endif
|
||||
#ifdef CONFIG_ARM64_ERRATUM_2966298
|
||||
{
|
||||
.desc = "ARM erratum 2966298",
|
||||
.capability = ARM64_WORKAROUND_2966298,
|
||||
/* Cortex-A520 r0p0 - r0p1 */
|
||||
ERRATA_MIDR_REV_RANGE(MIDR_CORTEX_A520, 0, 0, 1),
|
||||
},
|
||||
#endif
|
||||
#ifdef CONFIG_AMPERE_ERRATUM_AC03_CPU_38
|
||||
{
|
||||
.desc = "AmpereOne erratum AC03_CPU_38",
|
||||
|
@ -428,6 +428,10 @@ alternative_else_nop_endif
|
||||
ldp x28, x29, [sp, #16 * 14]
|
||||
|
||||
.if \el == 0
|
||||
alternative_if ARM64_WORKAROUND_2966298
|
||||
tlbi vale1, xzr
|
||||
dsb nsh
|
||||
alternative_else_nop_endif
|
||||
alternative_if_not ARM64_UNMAP_KERNEL_AT_EL0
|
||||
ldr lr, [sp, #S_LR]
|
||||
add sp, sp, #PT_REGS_SIZE // restore sp
|
||||
|
@ -84,6 +84,7 @@ WORKAROUND_2077057
|
||||
WORKAROUND_2457168
|
||||
WORKAROUND_2645198
|
||||
WORKAROUND_2658417
|
||||
WORKAROUND_2966298
|
||||
WORKAROUND_AMPERE_AC03_CPU_38
|
||||
WORKAROUND_TRBE_OVERWRITE_FILL_MODE
|
||||
WORKAROUND_TSB_FLUSH_FAILURE
|
||||
|
@ -15,9 +15,4 @@ DECLARE_PER_CPU(struct ia64_cpu, cpu_devices);
|
||||
|
||||
DECLARE_PER_CPU(int, cpu_state);
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
extern int arch_register_cpu(int num);
|
||||
extern void arch_unregister_cpu(int);
|
||||
#endif
|
||||
|
||||
#endif /* _ASM_IA64_CPU_H_ */
|
||||
|
@ -59,7 +59,7 @@ void __ref arch_unregister_cpu(int num)
|
||||
}
|
||||
EXPORT_SYMBOL(arch_unregister_cpu);
|
||||
#else
|
||||
static int __init arch_register_cpu(int num)
|
||||
int __init arch_register_cpu(int num)
|
||||
{
|
||||
return register_cpu(&sysfs_cpus[num].cpu, num);
|
||||
}
|
||||
|
@ -2,39 +2,42 @@
|
||||
#ifndef __PARISC_LDCW_H
|
||||
#define __PARISC_LDCW_H
|
||||
|
||||
#ifndef CONFIG_PA20
|
||||
/* Because kmalloc only guarantees 8-byte alignment for kmalloc'd data,
|
||||
and GCC only guarantees 8-byte alignment for stack locals, we can't
|
||||
be assured of 16-byte alignment for atomic lock data even if we
|
||||
specify "__attribute ((aligned(16)))" in the type declaration. So,
|
||||
we use a struct containing an array of four ints for the atomic lock
|
||||
type and dynamically select the 16-byte aligned int from the array
|
||||
for the semaphore. */
|
||||
for the semaphore. */
|
||||
|
||||
/* From: "Jim Hull" <jim.hull of hp.com>
|
||||
I've attached a summary of the change, but basically, for PA 2.0, as
|
||||
long as the ",CO" (coherent operation) completer is implemented, then the
|
||||
16-byte alignment requirement for ldcw and ldcd is relaxed, and instead
|
||||
they only require "natural" alignment (4-byte for ldcw, 8-byte for
|
||||
ldcd).
|
||||
|
||||
Although the cache control hint is accepted by all PA 2.0 processors,
|
||||
it is only implemented on PA8800/PA8900 CPUs. Prior PA8X00 CPUs still
|
||||
require 16-byte alignment. If the address is unaligned, the operation
|
||||
of the instruction is undefined. The ldcw instruction does not generate
|
||||
unaligned data reference traps so misaligned accesses are not detected.
|
||||
This hid the problem for years. So, restore the 16-byte alignment dropped
|
||||
by Kyle McMartin in "Remove __ldcw_align for PA-RISC 2.0 processors". */
|
||||
|
||||
#define __PA_LDCW_ALIGNMENT 16
|
||||
#define __PA_LDCW_ALIGN_ORDER 4
|
||||
#define __ldcw_align(a) ({ \
|
||||
unsigned long __ret = (unsigned long) &(a)->lock[0]; \
|
||||
__ret = (__ret + __PA_LDCW_ALIGNMENT - 1) \
|
||||
& ~(__PA_LDCW_ALIGNMENT - 1); \
|
||||
(volatile unsigned int *) __ret; \
|
||||
})
|
||||
#define __LDCW "ldcw"
|
||||
|
||||
#else /*CONFIG_PA20*/
|
||||
/* From: "Jim Hull" <jim.hull of hp.com>
|
||||
I've attached a summary of the change, but basically, for PA 2.0, as
|
||||
long as the ",CO" (coherent operation) completer is specified, then the
|
||||
16-byte alignment requirement for ldcw and ldcd is relaxed, and instead
|
||||
they only require "natural" alignment (4-byte for ldcw, 8-byte for
|
||||
ldcd). */
|
||||
|
||||
#define __PA_LDCW_ALIGNMENT 4
|
||||
#define __PA_LDCW_ALIGN_ORDER 2
|
||||
#define __ldcw_align(a) (&(a)->slock)
|
||||
#ifdef CONFIG_PA20
|
||||
#define __LDCW "ldcw,co"
|
||||
|
||||
#endif /*!CONFIG_PA20*/
|
||||
#else
|
||||
#define __LDCW "ldcw"
|
||||
#endif
|
||||
|
||||
/* LDCW, the only atomic read-write operation PA-RISC has. *sigh*.
|
||||
We don't explicitly expose that "*a" may be written as reload
|
||||
|
@ -9,15 +9,10 @@
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
typedef struct {
|
||||
#ifdef CONFIG_PA20
|
||||
volatile unsigned int slock;
|
||||
# define __ARCH_SPIN_LOCK_UNLOCKED { __ARCH_SPIN_LOCK_UNLOCKED_VAL }
|
||||
#else
|
||||
volatile unsigned int lock[4];
|
||||
# define __ARCH_SPIN_LOCK_UNLOCKED \
|
||||
{ { __ARCH_SPIN_LOCK_UNLOCKED_VAL, __ARCH_SPIN_LOCK_UNLOCKED_VAL, \
|
||||
__ARCH_SPIN_LOCK_UNLOCKED_VAL, __ARCH_SPIN_LOCK_UNLOCKED_VAL } }
|
||||
#endif
|
||||
} arch_spinlock_t;
|
||||
|
||||
|
||||
|
@ -440,7 +440,9 @@ int __cpu_up(unsigned int cpu, struct task_struct *tidle)
|
||||
if (cpu_online(cpu))
|
||||
return 0;
|
||||
|
||||
if (num_online_cpus() < setup_max_cpus && smp_boot_one_cpu(cpu, tidle))
|
||||
if (num_online_cpus() < nr_cpu_ids &&
|
||||
num_online_cpus() < setup_max_cpus &&
|
||||
smp_boot_one_cpu(cpu, tidle))
|
||||
return -EIO;
|
||||
|
||||
return cpu_online(cpu) ? 0 : -EIO;
|
||||
|
@ -94,6 +94,13 @@ static inline pte_t pte_wrprotect(pte_t pte)
|
||||
|
||||
#define pte_wrprotect pte_wrprotect
|
||||
|
||||
static inline int pte_read(pte_t pte)
|
||||
{
|
||||
return (pte_val(pte) & _PAGE_RO) != _PAGE_NA;
|
||||
}
|
||||
|
||||
#define pte_read pte_read
|
||||
|
||||
static inline int pte_write(pte_t pte)
|
||||
{
|
||||
return !(pte_val(pte) & _PAGE_RO);
|
||||
|
@ -197,7 +197,7 @@ static inline int __ptep_test_and_clear_young(struct mm_struct *mm,
|
||||
{
|
||||
unsigned long old;
|
||||
|
||||
if (pte_young(*ptep))
|
||||
if (!pte_young(*ptep))
|
||||
return 0;
|
||||
old = pte_update(mm, addr, ptep, _PAGE_ACCESSED, 0, 0);
|
||||
return (old & _PAGE_ACCESSED) != 0;
|
||||
|
@ -25,7 +25,9 @@ static inline int pte_write(pte_t pte)
|
||||
return pte_val(pte) & _PAGE_RW;
|
||||
}
|
||||
#endif
|
||||
#ifndef pte_read
|
||||
static inline int pte_read(pte_t pte) { return 1; }
|
||||
#endif
|
||||
static inline int pte_dirty(pte_t pte) { return pte_val(pte) & _PAGE_DIRTY; }
|
||||
static inline int pte_special(pte_t pte) { return pte_val(pte) & _PAGE_SPECIAL; }
|
||||
static inline int pte_none(pte_t pte) { return (pte_val(pte) & ~_PTE_NONE_MASK) == 0; }
|
||||
|
@ -137,8 +137,9 @@ ret_from_syscall:
|
||||
lis r4,icache_44x_need_flush@ha
|
||||
lwz r5,icache_44x_need_flush@l(r4)
|
||||
cmplwi cr0,r5,0
|
||||
bne- 2f
|
||||
bne- .L44x_icache_flush
|
||||
#endif /* CONFIG_PPC_47x */
|
||||
.L44x_icache_flush_return:
|
||||
kuep_unlock
|
||||
lwz r4,_LINK(r1)
|
||||
lwz r5,_CCR(r1)
|
||||
@ -172,10 +173,11 @@ syscall_exit_finish:
|
||||
b 1b
|
||||
|
||||
#ifdef CONFIG_44x
|
||||
2: li r7,0
|
||||
.L44x_icache_flush:
|
||||
li r7,0
|
||||
iccci r0,r0
|
||||
stw r7,icache_44x_need_flush@l(r4)
|
||||
b 1b
|
||||
b .L44x_icache_flush_return
|
||||
#endif /* CONFIG_44x */
|
||||
|
||||
.globl ret_from_fork
|
||||
|
@ -395,7 +395,7 @@ interrupt_base:
|
||||
#ifdef CONFIG_PPC_FPU
|
||||
FP_UNAVAILABLE_EXCEPTION
|
||||
#else
|
||||
EXCEPTION(0x0800, FP_UNAVAIL, FloatingPointUnavailable, unknown_exception)
|
||||
EXCEPTION(0x0800, FP_UNAVAIL, FloatingPointUnavailable, emulation_assist_interrupt)
|
||||
#endif
|
||||
|
||||
/* System Call Interrupt */
|
||||
|
@ -184,9 +184,6 @@ _GLOBAL_TOC(plpar_hcall)
|
||||
plpar_hcall_trace:
|
||||
HCALL_INST_PRECALL(R5)
|
||||
|
||||
std r4,STK_PARAM(R4)(r1)
|
||||
mr r0,r4
|
||||
|
||||
mr r4,r5
|
||||
mr r5,r6
|
||||
mr r6,r7
|
||||
@ -196,7 +193,7 @@ plpar_hcall_trace:
|
||||
|
||||
HVSC
|
||||
|
||||
ld r12,STK_PARAM(R4)(r1)
|
||||
ld r12,STACK_FRAME_MIN_SIZE+STK_PARAM(R4)(r1)
|
||||
std r4,0(r12)
|
||||
std r5,8(r12)
|
||||
std r6,16(r12)
|
||||
@ -296,9 +293,6 @@ _GLOBAL_TOC(plpar_hcall9)
|
||||
plpar_hcall9_trace:
|
||||
HCALL_INST_PRECALL(R5)
|
||||
|
||||
std r4,STK_PARAM(R4)(r1)
|
||||
mr r0,r4
|
||||
|
||||
mr r4,r5
|
||||
mr r5,r6
|
||||
mr r6,r7
|
||||
|
@ -6,7 +6,6 @@
|
||||
# for more details.
|
||||
#
|
||||
|
||||
OBJCOPYFLAGS := -O binary
|
||||
LDFLAGS_vmlinux := -z norelro
|
||||
ifeq ($(CONFIG_RELOCATABLE),y)
|
||||
LDFLAGS_vmlinux += -shared -Bsymbolic -z notext --emit-relocs
|
||||
|
@ -1 +1,5 @@
|
||||
ifdef CONFIG_RISCV_ALTERNATIVE_EARLY
|
||||
CFLAGS_errata.o := -mcmodel=medany
|
||||
endif
|
||||
|
||||
obj-y += errata.o
|
||||
|
@ -31,6 +31,27 @@ static inline unsigned long ftrace_call_adjust(unsigned long addr)
|
||||
return addr;
|
||||
}
|
||||
|
||||
/*
|
||||
* Let's do like x86/arm64 and ignore the compat syscalls.
|
||||
*/
|
||||
#define ARCH_TRACE_IGNORE_COMPAT_SYSCALLS
|
||||
static inline bool arch_trace_is_compat_syscall(struct pt_regs *regs)
|
||||
{
|
||||
return is_compat_task();
|
||||
}
|
||||
|
||||
#define ARCH_HAS_SYSCALL_MATCH_SYM_NAME
|
||||
static inline bool arch_syscall_match_sym_name(const char *sym,
|
||||
const char *name)
|
||||
{
|
||||
/*
|
||||
* Since all syscall functions have __riscv_ prefix, we must skip it.
|
||||
* However, as we described above, we decided to ignore compat
|
||||
* syscalls, so we don't care about __riscv_compat_ prefix here.
|
||||
*/
|
||||
return !strcmp(sym + 8, name);
|
||||
}
|
||||
|
||||
struct dyn_arch_ftrace {
|
||||
};
|
||||
#endif
|
||||
|
@ -40,6 +40,15 @@ void arch_remove_kprobe(struct kprobe *p);
|
||||
int kprobe_fault_handler(struct pt_regs *regs, unsigned int trapnr);
|
||||
bool kprobe_breakpoint_handler(struct pt_regs *regs);
|
||||
bool kprobe_single_step_handler(struct pt_regs *regs);
|
||||
#else
|
||||
static inline bool kprobe_breakpoint_handler(struct pt_regs *regs)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline bool kprobe_single_step_handler(struct pt_regs *regs)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#endif /* CONFIG_KPROBES */
|
||||
#endif /* _ASM_RISCV_KPROBES_H */
|
||||
|
@ -34,7 +34,18 @@ struct arch_uprobe {
|
||||
bool simulate;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_UPROBES
|
||||
bool uprobe_breakpoint_handler(struct pt_regs *regs);
|
||||
bool uprobe_single_step_handler(struct pt_regs *regs);
|
||||
#else
|
||||
static inline bool uprobe_breakpoint_handler(struct pt_regs *regs)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline bool uprobe_single_step_handler(struct pt_regs *regs)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#endif /* CONFIG_UPROBES */
|
||||
#endif /* _ASM_RISCV_UPROBES_H */
|
||||
|
@ -60,7 +60,7 @@ static void init_irq_stacks(void)
|
||||
}
|
||||
#endif /* CONFIG_VMAP_STACK */
|
||||
|
||||
#ifdef CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK
|
||||
#ifdef CONFIG_SOFTIRQ_ON_OWN_STACK
|
||||
void do_softirq_own_stack(void)
|
||||
{
|
||||
#ifdef CONFIG_IRQ_STACKS
|
||||
@ -92,7 +92,7 @@ void do_softirq_own_stack(void)
|
||||
#endif
|
||||
__do_softirq();
|
||||
}
|
||||
#endif /* CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK */
|
||||
#endif /* CONFIG_SOFTIRQ_ON_OWN_STACK */
|
||||
|
||||
#else
|
||||
static void init_irq_stacks(void) {}
|
||||
|
@ -173,19 +173,6 @@ static void __init init_resources(void)
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
|
||||
#ifdef CONFIG_KEXEC_CORE
|
||||
if (crashk_res.start != crashk_res.end) {
|
||||
ret = add_resource(&iomem_resource, &crashk_res);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
}
|
||||
if (crashk_low_res.start != crashk_low_res.end) {
|
||||
ret = add_resource(&iomem_resource, &crashk_low_res);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CRASH_DUMP
|
||||
if (elfcorehdr_size > 0) {
|
||||
elfcorehdr_res.start = elfcorehdr_addr;
|
||||
|
@ -311,13 +311,6 @@ static inline void __user *get_sigframe(struct ksignal *ksig,
|
||||
/* Align the stack frame. */
|
||||
sp &= ~0xfUL;
|
||||
|
||||
/*
|
||||
* Fail if the size of the altstack is not large enough for the
|
||||
* sigframe construction.
|
||||
*/
|
||||
if (current->sas_ss_size && sp < current->sas_ss_sp)
|
||||
return (void __user __force *)-1UL;
|
||||
|
||||
return (void __user *)sp;
|
||||
}
|
||||
|
||||
|
@ -13,6 +13,8 @@
|
||||
#include <linux/kdebug.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/kprobes.h>
|
||||
#include <linux/uprobes.h>
|
||||
#include <asm/uprobes.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/irq.h>
|
||||
@ -247,22 +249,28 @@ static inline unsigned long get_break_insn_length(unsigned long pc)
|
||||
return GET_INSN_LENGTH(insn);
|
||||
}
|
||||
|
||||
static bool probe_single_step_handler(struct pt_regs *regs)
|
||||
{
|
||||
bool user = user_mode(regs);
|
||||
|
||||
return user ? uprobe_single_step_handler(regs) : kprobe_single_step_handler(regs);
|
||||
}
|
||||
|
||||
static bool probe_breakpoint_handler(struct pt_regs *regs)
|
||||
{
|
||||
bool user = user_mode(regs);
|
||||
|
||||
return user ? uprobe_breakpoint_handler(regs) : kprobe_breakpoint_handler(regs);
|
||||
}
|
||||
|
||||
void handle_break(struct pt_regs *regs)
|
||||
{
|
||||
#ifdef CONFIG_KPROBES
|
||||
if (kprobe_single_step_handler(regs))
|
||||
if (probe_single_step_handler(regs))
|
||||
return;
|
||||
|
||||
if (kprobe_breakpoint_handler(regs))
|
||||
return;
|
||||
#endif
|
||||
#ifdef CONFIG_UPROBES
|
||||
if (uprobe_single_step_handler(regs))
|
||||
if (probe_breakpoint_handler(regs))
|
||||
return;
|
||||
|
||||
if (uprobe_breakpoint_handler(regs))
|
||||
return;
|
||||
#endif
|
||||
current->thread.bad_cause = regs->cause;
|
||||
|
||||
if (user_mode(regs))
|
||||
|
@ -245,7 +245,7 @@ static void __build_epilogue(bool is_tail_call, struct rv_jit_context *ctx)
|
||||
emit_addi(RV_REG_SP, RV_REG_SP, stack_adjust, ctx);
|
||||
/* Set return value. */
|
||||
if (!is_tail_call)
|
||||
emit_mv(RV_REG_A0, RV_REG_A5, ctx);
|
||||
emit_addiw(RV_REG_A0, RV_REG_A5, 0, ctx);
|
||||
emit_jalr(RV_REG_ZERO, is_tail_call ? RV_REG_T3 : RV_REG_RA,
|
||||
is_tail_call ? (RV_FENTRY_NINSNS + 1) * 4 : 0, /* skip reserved nops and TCC init */
|
||||
ctx);
|
||||
@ -759,8 +759,10 @@ static int invoke_bpf_prog(struct bpf_tramp_link *l, int args_off, int retval_of
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (save_ret)
|
||||
emit_sd(RV_REG_FP, -retval_off, regmap[BPF_REG_0], ctx);
|
||||
if (save_ret) {
|
||||
emit_sd(RV_REG_FP, -retval_off, RV_REG_A0, ctx);
|
||||
emit_sd(RV_REG_FP, -(retval_off - 8), regmap[BPF_REG_0], ctx);
|
||||
}
|
||||
|
||||
/* update branch with beqz */
|
||||
if (ctx->insns) {
|
||||
@ -853,7 +855,7 @@ static int __arch_prepare_bpf_trampoline(struct bpf_tramp_image *im,
|
||||
|
||||
save_ret = flags & (BPF_TRAMP_F_CALL_ORIG | BPF_TRAMP_F_RET_FENTRY_RET);
|
||||
if (save_ret) {
|
||||
stack_size += 8;
|
||||
stack_size += 16; /* Save both A5 (BPF R0) and A0 */
|
||||
retval_off = stack_size;
|
||||
}
|
||||
|
||||
@ -957,6 +959,7 @@ static int __arch_prepare_bpf_trampoline(struct bpf_tramp_image *im,
|
||||
if (ret)
|
||||
goto out;
|
||||
emit_sd(RV_REG_FP, -retval_off, RV_REG_A0, ctx);
|
||||
emit_sd(RV_REG_FP, -(retval_off - 8), regmap[BPF_REG_0], ctx);
|
||||
im->ip_after_call = ctx->insns + ctx->ninsns;
|
||||
/* 2 nops reserved for auipc+jalr pair */
|
||||
emit(rv_nop(), ctx);
|
||||
@ -988,8 +991,10 @@ static int __arch_prepare_bpf_trampoline(struct bpf_tramp_image *im,
|
||||
if (flags & BPF_TRAMP_F_RESTORE_REGS)
|
||||
restore_args(nregs, args_off, ctx);
|
||||
|
||||
if (save_ret)
|
||||
if (save_ret) {
|
||||
emit_ld(RV_REG_A0, -retval_off, RV_REG_FP, ctx);
|
||||
emit_ld(regmap[BPF_REG_0], -(retval_off - 8), RV_REG_FP, ctx);
|
||||
}
|
||||
|
||||
emit_ld(RV_REG_S1, -sreg_off, RV_REG_FP, ctx);
|
||||
|
||||
@ -1515,7 +1520,8 @@ out_be:
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
emit_mv(bpf_to_rv_reg(BPF_REG_0, ctx), RV_REG_A0, ctx);
|
||||
if (insn->src_reg != BPF_PSEUDO_CALL)
|
||||
emit_mv(bpf_to_rv_reg(BPF_REG_0, ctx), RV_REG_A0, ctx);
|
||||
break;
|
||||
}
|
||||
/* tail call */
|
||||
|
@ -2066,6 +2066,7 @@ struct bpf_tramp_jit {
|
||||
* func_addr's original caller
|
||||
*/
|
||||
int stack_size; /* Trampoline stack size */
|
||||
int backchain_off; /* Offset of backchain */
|
||||
int stack_args_off; /* Offset of stack arguments for calling
|
||||
* func_addr, has to be at the top
|
||||
*/
|
||||
@ -2086,9 +2087,10 @@ struct bpf_tramp_jit {
|
||||
* for __bpf_prog_enter() return value and
|
||||
* func_addr respectively
|
||||
*/
|
||||
int r14_off; /* Offset of saved %r14 */
|
||||
int run_ctx_off; /* Offset of struct bpf_tramp_run_ctx */
|
||||
int tccnt_off; /* Offset of saved tailcall counter */
|
||||
int r14_off; /* Offset of saved %r14, has to be at the
|
||||
* bottom */
|
||||
int do_fexit; /* do_fexit: label */
|
||||
};
|
||||
|
||||
@ -2247,8 +2249,12 @@ static int __arch_prepare_bpf_trampoline(struct bpf_tramp_image *im,
|
||||
* Calculate the stack layout.
|
||||
*/
|
||||
|
||||
/* Reserve STACK_FRAME_OVERHEAD bytes for the callees. */
|
||||
/*
|
||||
* Allocate STACK_FRAME_OVERHEAD bytes for the callees. As the s390x
|
||||
* ABI requires, put our backchain at the end of the allocated memory.
|
||||
*/
|
||||
tjit->stack_size = STACK_FRAME_OVERHEAD;
|
||||
tjit->backchain_off = tjit->stack_size - sizeof(u64);
|
||||
tjit->stack_args_off = alloc_stack(tjit, nr_stack_args * sizeof(u64));
|
||||
tjit->reg_args_off = alloc_stack(tjit, nr_reg_args * sizeof(u64));
|
||||
tjit->ip_off = alloc_stack(tjit, sizeof(u64));
|
||||
@ -2256,16 +2262,25 @@ static int __arch_prepare_bpf_trampoline(struct bpf_tramp_image *im,
|
||||
tjit->bpf_args_off = alloc_stack(tjit, nr_bpf_args * sizeof(u64));
|
||||
tjit->retval_off = alloc_stack(tjit, sizeof(u64));
|
||||
tjit->r7_r8_off = alloc_stack(tjit, 2 * sizeof(u64));
|
||||
tjit->r14_off = alloc_stack(tjit, sizeof(u64));
|
||||
tjit->run_ctx_off = alloc_stack(tjit,
|
||||
sizeof(struct bpf_tramp_run_ctx));
|
||||
tjit->tccnt_off = alloc_stack(tjit, sizeof(u64));
|
||||
/* The caller has already reserved STACK_FRAME_OVERHEAD bytes. */
|
||||
tjit->stack_size -= STACK_FRAME_OVERHEAD;
|
||||
tjit->r14_off = alloc_stack(tjit, sizeof(u64) * 2);
|
||||
/*
|
||||
* In accordance with the s390x ABI, the caller has allocated
|
||||
* STACK_FRAME_OVERHEAD bytes for us. 8 of them contain the caller's
|
||||
* backchain, and the rest we can use.
|
||||
*/
|
||||
tjit->stack_size -= STACK_FRAME_OVERHEAD - sizeof(u64);
|
||||
tjit->orig_stack_args_off = tjit->stack_size + STACK_FRAME_OVERHEAD;
|
||||
|
||||
/* lgr %r1,%r15 */
|
||||
EMIT4(0xb9040000, REG_1, REG_15);
|
||||
/* aghi %r15,-stack_size */
|
||||
EMIT4_IMM(0xa70b0000, REG_15, -tjit->stack_size);
|
||||
/* stg %r1,backchain_off(%r15) */
|
||||
EMIT6_DISP_LH(0xe3000000, 0x0024, REG_1, REG_0, REG_15,
|
||||
tjit->backchain_off);
|
||||
/* mvc tccnt_off(4,%r15),stack_size+STK_OFF_TCCNT(%r15) */
|
||||
_EMIT6(0xd203f000 | tjit->tccnt_off,
|
||||
0xf000 | (tjit->stack_size + STK_OFF_TCCNT));
|
||||
@ -2513,7 +2528,7 @@ int arch_prepare_bpf_trampoline(struct bpf_tramp_image *im, void *image,
|
||||
return -E2BIG;
|
||||
}
|
||||
|
||||
return ret;
|
||||
return tjit.common.prg;
|
||||
}
|
||||
|
||||
bool bpf_jit_supports_subprog_tailcalls(void)
|
||||
|
@ -1,5 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include <asm/insn.h>
|
||||
#include <linux/mm.h>
|
||||
|
||||
#include "perf_event.h"
|
||||
|
||||
@ -132,9 +133,9 @@ static int get_branch_type(unsigned long from, unsigned long to, int abort,
|
||||
* The LBR logs any address in the IP, even if the IP just
|
||||
* faulted. This means userspace can control the from address.
|
||||
* Ensure we don't blindly read any address by validating it is
|
||||
* a known text address.
|
||||
* a known text address and not a vsyscall address.
|
||||
*/
|
||||
if (kernel_text_address(from)) {
|
||||
if (kernel_text_address(from) && !in_gate_area_no_mm(from)) {
|
||||
addr = (void *)from;
|
||||
/*
|
||||
* Assume we can get the maximum possible size
|
||||
|
@ -7,6 +7,8 @@
|
||||
* Author : K. Y. Srinivasan <kys@microsoft.com>
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) "Hyper-V: " fmt
|
||||
|
||||
#include <linux/efi.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/bitfield.h>
|
||||
@ -191,7 +193,7 @@ void set_hv_tscchange_cb(void (*cb)(void))
|
||||
struct hv_tsc_emulation_control emu_ctrl = {.enabled = 1};
|
||||
|
||||
if (!hv_reenlightenment_available()) {
|
||||
pr_warn("Hyper-V: reenlightenment support is unavailable\n");
|
||||
pr_warn("reenlightenment support is unavailable\n");
|
||||
return;
|
||||
}
|
||||
|
||||
@ -394,6 +396,7 @@ static void __init hv_get_partition_id(void)
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_HYPERV_VTL_MODE)
|
||||
static u8 __init get_vtl(void)
|
||||
{
|
||||
u64 control = HV_HYPERCALL_REP_COMP_1 | HVCALL_GET_VP_REGISTERS;
|
||||
@ -416,13 +419,16 @@ static u8 __init get_vtl(void)
|
||||
if (hv_result_success(ret)) {
|
||||
ret = output->as64.low & HV_X64_VTL_MASK;
|
||||
} else {
|
||||
pr_err("Failed to get VTL(%lld) and set VTL to zero by default.\n", ret);
|
||||
ret = 0;
|
||||
pr_err("Failed to get VTL(error: %lld) exiting...\n", ret);
|
||||
BUG();
|
||||
}
|
||||
|
||||
local_irq_restore(flags);
|
||||
return ret;
|
||||
}
|
||||
#else
|
||||
static inline u8 get_vtl(void) { return 0; }
|
||||
#endif
|
||||
|
||||
/*
|
||||
* This function is to be invoked early in the boot sequence after the
|
||||
@ -564,7 +570,7 @@ skip_hypercall_pg_init:
|
||||
if (cpu_feature_enabled(X86_FEATURE_IBT) &&
|
||||
*(u32 *)hv_hypercall_pg != gen_endbr()) {
|
||||
setup_clear_cpu_cap(X86_FEATURE_IBT);
|
||||
pr_warn("Hyper-V: Disabling IBT because of Hyper-V bug\n");
|
||||
pr_warn("Disabling IBT because of Hyper-V bug\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -604,8 +610,10 @@ skip_hypercall_pg_init:
|
||||
hv_query_ext_cap(0);
|
||||
|
||||
/* Find the VTL */
|
||||
if (!ms_hyperv.paravisor_present && hv_isolation_type_snp())
|
||||
ms_hyperv.vtl = get_vtl();
|
||||
ms_hyperv.vtl = get_vtl();
|
||||
|
||||
if (ms_hyperv.vtl > 0) /* non default VTL */
|
||||
hv_vtl_early_init();
|
||||
|
||||
return;
|
||||
|
||||
|
@ -215,7 +215,7 @@ static int hv_vtl_wakeup_secondary_cpu(int apicid, unsigned long start_eip)
|
||||
return hv_vtl_bringup_vcpu(vp_id, start_eip);
|
||||
}
|
||||
|
||||
static int __init hv_vtl_early_init(void)
|
||||
int __init hv_vtl_early_init(void)
|
||||
{
|
||||
/*
|
||||
* `boot_cpu_has` returns the runtime feature support,
|
||||
@ -230,4 +230,3 @@ static int __init hv_vtl_early_init(void)
|
||||
|
||||
return 0;
|
||||
}
|
||||
early_initcall(hv_vtl_early_init);
|
||||
|
@ -28,8 +28,6 @@ struct x86_cpu {
|
||||
};
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
extern int arch_register_cpu(int num);
|
||||
extern void arch_unregister_cpu(int);
|
||||
extern void soft_restart_cpu(void);
|
||||
#endif
|
||||
|
||||
|
@ -340,8 +340,10 @@ static inline u64 hv_get_non_nested_register(unsigned int reg) { return 0; }
|
||||
|
||||
#ifdef CONFIG_HYPERV_VTL_MODE
|
||||
void __init hv_vtl_init_platform(void);
|
||||
int __init hv_vtl_early_init(void);
|
||||
#else
|
||||
static inline void __init hv_vtl_init_platform(void) {}
|
||||
static inline int __init hv_vtl_early_init(void) { return 0; }
|
||||
#endif
|
||||
|
||||
#include <asm-generic/mshyperv.h>
|
||||
|
@ -637,12 +637,17 @@
|
||||
/* AMD Last Branch Record MSRs */
|
||||
#define MSR_AMD64_LBR_SELECT 0xc000010e
|
||||
|
||||
/* Fam 17h MSRs */
|
||||
#define MSR_F17H_IRPERF 0xc00000e9
|
||||
/* Zen4 */
|
||||
#define MSR_ZEN4_BP_CFG 0xc001102e
|
||||
#define MSR_ZEN4_BP_CFG_SHARED_BTB_FIX_BIT 5
|
||||
|
||||
/* Zen 2 */
|
||||
#define MSR_ZEN2_SPECTRAL_CHICKEN 0xc00110e3
|
||||
#define MSR_ZEN2_SPECTRAL_CHICKEN_BIT BIT_ULL(1)
|
||||
|
||||
/* Fam 17h MSRs */
|
||||
#define MSR_F17H_IRPERF 0xc00000e9
|
||||
|
||||
/* Fam 16h MSRs */
|
||||
#define MSR_F16H_L2I_PERF_CTL 0xc0010230
|
||||
#define MSR_F16H_L2I_PERF_CTR 0xc0010231
|
||||
|
@ -129,7 +129,6 @@ void native_smp_send_reschedule(int cpu);
|
||||
void native_send_call_func_ipi(const struct cpumask *mask);
|
||||
void native_send_call_func_single_ipi(int cpu);
|
||||
|
||||
bool smp_park_other_cpus_in_init(void);
|
||||
void smp_store_cpu_info(int id);
|
||||
|
||||
asmlinkage __visible void smp_reboot_interrupt(void);
|
||||
|
@ -403,6 +403,17 @@ void __init_or_module noinline apply_alternatives(struct alt_instr *start,
|
||||
u8 insn_buff[MAX_PATCH_LEN];
|
||||
|
||||
DPRINTK(ALT, "alt table %px, -> %px", start, end);
|
||||
|
||||
/*
|
||||
* In the case CONFIG_X86_5LEVEL=y, KASAN_SHADOW_START is defined using
|
||||
* cpu_feature_enabled(X86_FEATURE_LA57) and is therefore patched here.
|
||||
* During the process, KASAN becomes confused seeing partial LA57
|
||||
* conversion and triggers a false-positive out-of-bound report.
|
||||
*
|
||||
* Disable KASAN until the patching is complete.
|
||||
*/
|
||||
kasan_disable_current();
|
||||
|
||||
/*
|
||||
* The scan order should be from start to end. A later scanned
|
||||
* alternative code can overwrite previously scanned alternative code.
|
||||
@ -452,6 +463,8 @@ void __init_or_module noinline apply_alternatives(struct alt_instr *start,
|
||||
|
||||
text_poke_early(instr, insn_buff, insn_buff_sz);
|
||||
}
|
||||
|
||||
kasan_enable_current();
|
||||
}
|
||||
|
||||
static inline bool is_jcc32(struct insn *insn)
|
||||
|
@ -80,6 +80,10 @@ static const int amd_div0[] =
|
||||
AMD_LEGACY_ERRATUM(AMD_MODEL_RANGE(0x17, 0x00, 0x0, 0x2f, 0xf),
|
||||
AMD_MODEL_RANGE(0x17, 0x50, 0x0, 0x5f, 0xf));
|
||||
|
||||
static const int amd_erratum_1485[] =
|
||||
AMD_LEGACY_ERRATUM(AMD_MODEL_RANGE(0x19, 0x10, 0x0, 0x1f, 0xf),
|
||||
AMD_MODEL_RANGE(0x19, 0x60, 0x0, 0xaf, 0xf));
|
||||
|
||||
static bool cpu_has_amd_erratum(struct cpuinfo_x86 *cpu, const int *erratum)
|
||||
{
|
||||
int osvw_id = *erratum++;
|
||||
@ -1149,6 +1153,10 @@ static void init_amd(struct cpuinfo_x86 *c)
|
||||
pr_notice_once("AMD Zen1 DIV0 bug detected. Disable SMT for full protection.\n");
|
||||
setup_force_cpu_bug(X86_BUG_DIV0);
|
||||
}
|
||||
|
||||
if (!cpu_has(c, X86_FEATURE_HYPERVISOR) &&
|
||||
cpu_has_amd_erratum(c, amd_erratum_1485))
|
||||
msr_set_bit(MSR_ZEN4_BP_CFG, MSR_ZEN4_BP_CFG_SHARED_BTB_FIX_BIT);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
|
@ -30,15 +30,15 @@ struct rmid_entry {
|
||||
struct list_head list;
|
||||
};
|
||||
|
||||
/**
|
||||
* @rmid_free_lru A least recently used list of free RMIDs
|
||||
/*
|
||||
* @rmid_free_lru - A least recently used list of free RMIDs
|
||||
* These RMIDs are guaranteed to have an occupancy less than the
|
||||
* threshold occupancy
|
||||
*/
|
||||
static LIST_HEAD(rmid_free_lru);
|
||||
|
||||
/**
|
||||
* @rmid_limbo_count count of currently unused but (potentially)
|
||||
/*
|
||||
* @rmid_limbo_count - count of currently unused but (potentially)
|
||||
* dirty RMIDs.
|
||||
* This counts RMIDs that no one is currently using but that
|
||||
* may have a occupancy value > resctrl_rmid_realloc_threshold. User can
|
||||
@ -46,7 +46,7 @@ static LIST_HEAD(rmid_free_lru);
|
||||
*/
|
||||
static unsigned int rmid_limbo_count;
|
||||
|
||||
/**
|
||||
/*
|
||||
* @rmid_entry - The entry in the limbo and free lists.
|
||||
*/
|
||||
static struct rmid_entry *rmid_ptrs;
|
||||
|
@ -256,7 +256,7 @@ static int __sev_cpuid_hv(u32 fn, int reg_idx, u32 *reg)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int sev_cpuid_hv(struct cpuid_leaf *leaf)
|
||||
static int __sev_cpuid_hv_msr(struct cpuid_leaf *leaf)
|
||||
{
|
||||
int ret;
|
||||
|
||||
@ -279,6 +279,45 @@ static int sev_cpuid_hv(struct cpuid_leaf *leaf)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int __sev_cpuid_hv_ghcb(struct ghcb *ghcb, struct es_em_ctxt *ctxt, struct cpuid_leaf *leaf)
|
||||
{
|
||||
u32 cr4 = native_read_cr4();
|
||||
int ret;
|
||||
|
||||
ghcb_set_rax(ghcb, leaf->fn);
|
||||
ghcb_set_rcx(ghcb, leaf->subfn);
|
||||
|
||||
if (cr4 & X86_CR4_OSXSAVE)
|
||||
/* Safe to read xcr0 */
|
||||
ghcb_set_xcr0(ghcb, xgetbv(XCR_XFEATURE_ENABLED_MASK));
|
||||
else
|
||||
/* xgetbv will cause #UD - use reset value for xcr0 */
|
||||
ghcb_set_xcr0(ghcb, 1);
|
||||
|
||||
ret = sev_es_ghcb_hv_call(ghcb, ctxt, SVM_EXIT_CPUID, 0, 0);
|
||||
if (ret != ES_OK)
|
||||
return ret;
|
||||
|
||||
if (!(ghcb_rax_is_valid(ghcb) &&
|
||||
ghcb_rbx_is_valid(ghcb) &&
|
||||
ghcb_rcx_is_valid(ghcb) &&
|
||||
ghcb_rdx_is_valid(ghcb)))
|
||||
return ES_VMM_ERROR;
|
||||
|
||||
leaf->eax = ghcb->save.rax;
|
||||
leaf->ebx = ghcb->save.rbx;
|
||||
leaf->ecx = ghcb->save.rcx;
|
||||
leaf->edx = ghcb->save.rdx;
|
||||
|
||||
return ES_OK;
|
||||
}
|
||||
|
||||
static int sev_cpuid_hv(struct ghcb *ghcb, struct es_em_ctxt *ctxt, struct cpuid_leaf *leaf)
|
||||
{
|
||||
return ghcb ? __sev_cpuid_hv_ghcb(ghcb, ctxt, leaf)
|
||||
: __sev_cpuid_hv_msr(leaf);
|
||||
}
|
||||
|
||||
/*
|
||||
* This may be called early while still running on the initial identity
|
||||
* mapping. Use RIP-relative addressing to obtain the correct address
|
||||
@ -388,19 +427,20 @@ snp_cpuid_get_validated_func(struct cpuid_leaf *leaf)
|
||||
return false;
|
||||
}
|
||||
|
||||
static void snp_cpuid_hv(struct cpuid_leaf *leaf)
|
||||
static void snp_cpuid_hv(struct ghcb *ghcb, struct es_em_ctxt *ctxt, struct cpuid_leaf *leaf)
|
||||
{
|
||||
if (sev_cpuid_hv(leaf))
|
||||
if (sev_cpuid_hv(ghcb, ctxt, leaf))
|
||||
sev_es_terminate(SEV_TERM_SET_LINUX, GHCB_TERM_CPUID_HV);
|
||||
}
|
||||
|
||||
static int snp_cpuid_postprocess(struct cpuid_leaf *leaf)
|
||||
static int snp_cpuid_postprocess(struct ghcb *ghcb, struct es_em_ctxt *ctxt,
|
||||
struct cpuid_leaf *leaf)
|
||||
{
|
||||
struct cpuid_leaf leaf_hv = *leaf;
|
||||
|
||||
switch (leaf->fn) {
|
||||
case 0x1:
|
||||
snp_cpuid_hv(&leaf_hv);
|
||||
snp_cpuid_hv(ghcb, ctxt, &leaf_hv);
|
||||
|
||||
/* initial APIC ID */
|
||||
leaf->ebx = (leaf_hv.ebx & GENMASK(31, 24)) | (leaf->ebx & GENMASK(23, 0));
|
||||
@ -419,7 +459,7 @@ static int snp_cpuid_postprocess(struct cpuid_leaf *leaf)
|
||||
break;
|
||||
case 0xB:
|
||||
leaf_hv.subfn = 0;
|
||||
snp_cpuid_hv(&leaf_hv);
|
||||
snp_cpuid_hv(ghcb, ctxt, &leaf_hv);
|
||||
|
||||
/* extended APIC ID */
|
||||
leaf->edx = leaf_hv.edx;
|
||||
@ -467,7 +507,7 @@ static int snp_cpuid_postprocess(struct cpuid_leaf *leaf)
|
||||
}
|
||||
break;
|
||||
case 0x8000001E:
|
||||
snp_cpuid_hv(&leaf_hv);
|
||||
snp_cpuid_hv(ghcb, ctxt, &leaf_hv);
|
||||
|
||||
/* extended APIC ID */
|
||||
leaf->eax = leaf_hv.eax;
|
||||
@ -488,7 +528,7 @@ static int snp_cpuid_postprocess(struct cpuid_leaf *leaf)
|
||||
* Returns -EOPNOTSUPP if feature not enabled. Any other non-zero return value
|
||||
* should be treated as fatal by caller.
|
||||
*/
|
||||
static int snp_cpuid(struct cpuid_leaf *leaf)
|
||||
static int snp_cpuid(struct ghcb *ghcb, struct es_em_ctxt *ctxt, struct cpuid_leaf *leaf)
|
||||
{
|
||||
const struct snp_cpuid_table *cpuid_table = snp_cpuid_get_table();
|
||||
|
||||
@ -522,7 +562,7 @@ static int snp_cpuid(struct cpuid_leaf *leaf)
|
||||
return 0;
|
||||
}
|
||||
|
||||
return snp_cpuid_postprocess(leaf);
|
||||
return snp_cpuid_postprocess(ghcb, ctxt, leaf);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -544,14 +584,14 @@ void __init do_vc_no_ghcb(struct pt_regs *regs, unsigned long exit_code)
|
||||
leaf.fn = fn;
|
||||
leaf.subfn = subfn;
|
||||
|
||||
ret = snp_cpuid(&leaf);
|
||||
ret = snp_cpuid(NULL, NULL, &leaf);
|
||||
if (!ret)
|
||||
goto cpuid_done;
|
||||
|
||||
if (ret != -EOPNOTSUPP)
|
||||
goto fail;
|
||||
|
||||
if (sev_cpuid_hv(&leaf))
|
||||
if (__sev_cpuid_hv_msr(&leaf))
|
||||
goto fail;
|
||||
|
||||
cpuid_done:
|
||||
@ -848,14 +888,15 @@ static enum es_result vc_handle_ioio(struct ghcb *ghcb, struct es_em_ctxt *ctxt)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int vc_handle_cpuid_snp(struct pt_regs *regs)
|
||||
static int vc_handle_cpuid_snp(struct ghcb *ghcb, struct es_em_ctxt *ctxt)
|
||||
{
|
||||
struct pt_regs *regs = ctxt->regs;
|
||||
struct cpuid_leaf leaf;
|
||||
int ret;
|
||||
|
||||
leaf.fn = regs->ax;
|
||||
leaf.subfn = regs->cx;
|
||||
ret = snp_cpuid(&leaf);
|
||||
ret = snp_cpuid(ghcb, ctxt, &leaf);
|
||||
if (!ret) {
|
||||
regs->ax = leaf.eax;
|
||||
regs->bx = leaf.ebx;
|
||||
@ -874,7 +915,7 @@ static enum es_result vc_handle_cpuid(struct ghcb *ghcb,
|
||||
enum es_result ret;
|
||||
int snp_cpuid_ret;
|
||||
|
||||
snp_cpuid_ret = vc_handle_cpuid_snp(regs);
|
||||
snp_cpuid_ret = vc_handle_cpuid_snp(ghcb, ctxt);
|
||||
if (!snp_cpuid_ret)
|
||||
return ES_OK;
|
||||
if (snp_cpuid_ret != -EOPNOTSUPP)
|
||||
|
@ -868,8 +868,7 @@ void snp_set_memory_private(unsigned long vaddr, unsigned long npages)
|
||||
|
||||
void snp_accept_memory(phys_addr_t start, phys_addr_t end)
|
||||
{
|
||||
unsigned long vaddr;
|
||||
unsigned int npages;
|
||||
unsigned long vaddr, npages;
|
||||
|
||||
if (!cc_platform_has(CC_ATTR_GUEST_SEV_SNP))
|
||||
return;
|
||||
|
@ -131,7 +131,7 @@ static int smp_stop_nmi_callback(unsigned int val, struct pt_regs *regs)
|
||||
}
|
||||
|
||||
/*
|
||||
* Disable virtualization, APIC etc. and park the CPU in a HLT loop
|
||||
* this function calls the 'stop' function on all other CPUs in the system.
|
||||
*/
|
||||
DEFINE_IDTENTRY_SYSVEC(sysvec_reboot)
|
||||
{
|
||||
@ -172,17 +172,13 @@ static void native_stop_other_cpus(int wait)
|
||||
* 2) Wait for all other CPUs to report that they reached the
|
||||
* HLT loop in stop_this_cpu()
|
||||
*
|
||||
* 3) If the system uses INIT/STARTUP for CPU bringup, then
|
||||
* send all present CPUs an INIT vector, which brings them
|
||||
* completely out of the way.
|
||||
* 3) If #2 timed out send an NMI to the CPUs which did not
|
||||
* yet report
|
||||
*
|
||||
* 4) If #3 is not possible and #2 timed out send an NMI to the
|
||||
* CPUs which did not yet report
|
||||
*
|
||||
* 5) Wait for all other CPUs to report that they reached the
|
||||
* 4) Wait for all other CPUs to report that they reached the
|
||||
* HLT loop in stop_this_cpu()
|
||||
*
|
||||
* #4 can obviously race against a CPU reaching the HLT loop late.
|
||||
* #3 can obviously race against a CPU reaching the HLT loop late.
|
||||
* That CPU will have reported already and the "have all CPUs
|
||||
* reached HLT" condition will be true despite the fact that the
|
||||
* other CPU is still handling the NMI. Again, there is no
|
||||
@ -198,7 +194,7 @@ static void native_stop_other_cpus(int wait)
|
||||
/*
|
||||
* Don't wait longer than a second for IPI completion. The
|
||||
* wait request is not checked here because that would
|
||||
* prevent an NMI/INIT shutdown in case that not all
|
||||
* prevent an NMI shutdown attempt in case that not all
|
||||
* CPUs reach shutdown state.
|
||||
*/
|
||||
timeout = USEC_PER_SEC;
|
||||
@ -206,27 +202,7 @@ static void native_stop_other_cpus(int wait)
|
||||
udelay(1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Park all other CPUs in INIT including "offline" CPUs, if
|
||||
* possible. That's a safe place where they can't resume execution
|
||||
* of HLT and then execute the HLT loop from overwritten text or
|
||||
* page tables.
|
||||
*
|
||||
* The only downside is a broadcast MCE, but up to the point where
|
||||
* the kexec() kernel brought all APs online again an MCE will just
|
||||
* make HLT resume and handle the MCE. The machine crashes and burns
|
||||
* due to overwritten text, page tables and data. So there is a
|
||||
* choice between fire and frying pan. The result is pretty much
|
||||
* the same. Chose frying pan until x86 provides a sane mechanism
|
||||
* to park a CPU.
|
||||
*/
|
||||
if (smp_park_other_cpus_in_init())
|
||||
goto done;
|
||||
|
||||
/*
|
||||
* If park with INIT was not possible and the REBOOT_VECTOR didn't
|
||||
* take all secondary CPUs offline, try with the NMI.
|
||||
*/
|
||||
/* if the REBOOT_VECTOR didn't work, try with the NMI */
|
||||
if (!cpumask_empty(&cpus_stop_mask)) {
|
||||
/*
|
||||
* If NMI IPI is enabled, try to register the stop handler
|
||||
@ -249,7 +225,6 @@ static void native_stop_other_cpus(int wait)
|
||||
udelay(1);
|
||||
}
|
||||
|
||||
done:
|
||||
local_irq_save(flags);
|
||||
disable_local_APIC();
|
||||
mcheck_cpu_clear(this_cpu_ptr(&cpu_info));
|
||||
|
@ -1240,33 +1240,6 @@ void arch_thaw_secondary_cpus_end(void)
|
||||
cache_aps_init();
|
||||
}
|
||||
|
||||
bool smp_park_other_cpus_in_init(void)
|
||||
{
|
||||
unsigned int cpu, this_cpu = smp_processor_id();
|
||||
unsigned int apicid;
|
||||
|
||||
if (apic->wakeup_secondary_cpu_64 || apic->wakeup_secondary_cpu)
|
||||
return false;
|
||||
|
||||
/*
|
||||
* If this is a crash stop which does not execute on the boot CPU,
|
||||
* then this cannot use the INIT mechanism because INIT to the boot
|
||||
* CPU will reset the machine.
|
||||
*/
|
||||
if (this_cpu)
|
||||
return false;
|
||||
|
||||
for_each_cpu_and(cpu, &cpus_booted_once_mask, cpu_present_mask) {
|
||||
if (cpu == this_cpu)
|
||||
continue;
|
||||
apicid = apic->cpu_present_to_apicid(cpu);
|
||||
if (apicid == BAD_APICID)
|
||||
continue;
|
||||
send_init_sequence(apicid);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* Early setup to make printk work.
|
||||
*/
|
||||
|
@ -54,7 +54,7 @@ void arch_unregister_cpu(int num)
|
||||
EXPORT_SYMBOL(arch_unregister_cpu);
|
||||
#else /* CONFIG_HOTPLUG_CPU */
|
||||
|
||||
static int __init arch_register_cpu(int num)
|
||||
int __init arch_register_cpu(int num)
|
||||
{
|
||||
return register_cpu(&per_cpu(cpu_devices, num).cpu, num);
|
||||
}
|
||||
|
21
block/fops.c
21
block/fops.c
@ -772,24 +772,35 @@ static long blkdev_fallocate(struct file *file, int mode, loff_t start,
|
||||
|
||||
filemap_invalidate_lock(inode->i_mapping);
|
||||
|
||||
/* Invalidate the page cache, including dirty pages. */
|
||||
error = truncate_bdev_range(bdev, file_to_blk_mode(file), start, end);
|
||||
if (error)
|
||||
goto fail;
|
||||
|
||||
/*
|
||||
* Invalidate the page cache, including dirty pages, for valid
|
||||
* de-allocate mode calls to fallocate().
|
||||
*/
|
||||
switch (mode) {
|
||||
case FALLOC_FL_ZERO_RANGE:
|
||||
case FALLOC_FL_ZERO_RANGE | FALLOC_FL_KEEP_SIZE:
|
||||
error = truncate_bdev_range(bdev, file_to_blk_mode(file), start, end);
|
||||
if (error)
|
||||
goto fail;
|
||||
|
||||
error = blkdev_issue_zeroout(bdev, start >> SECTOR_SHIFT,
|
||||
len >> SECTOR_SHIFT, GFP_KERNEL,
|
||||
BLKDEV_ZERO_NOUNMAP);
|
||||
break;
|
||||
case FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE:
|
||||
error = truncate_bdev_range(bdev, file_to_blk_mode(file), start, end);
|
||||
if (error)
|
||||
goto fail;
|
||||
|
||||
error = blkdev_issue_zeroout(bdev, start >> SECTOR_SHIFT,
|
||||
len >> SECTOR_SHIFT, GFP_KERNEL,
|
||||
BLKDEV_ZERO_NOFALLBACK);
|
||||
break;
|
||||
case FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE | FALLOC_FL_NO_HIDE_STALE:
|
||||
error = truncate_bdev_range(bdev, file_to_blk_mode(file), start, end);
|
||||
if (error)
|
||||
goto fail;
|
||||
|
||||
error = blkdev_issue_discard(bdev, start >> SECTOR_SHIFT,
|
||||
len >> SECTOR_SHIFT, GFP_KERNEL);
|
||||
break;
|
||||
|
@ -12,6 +12,7 @@
|
||||
#define pr_fmt(fmt) "ACPI: " fmt
|
||||
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/cpu.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/kernel.h>
|
||||
|
@ -1913,6 +1913,17 @@ static const struct dmi_system_id ec_dmi_table[] __initconst = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "HP 15-cx0041ur"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/*
|
||||
* HP Pavilion Gaming Laptop 15-dk1xxx
|
||||
* https://github.com/systemd/systemd/issues/28942
|
||||
*/
|
||||
.callback = ec_honor_dsdt_gpe,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "HP"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion Gaming Laptop 15-dk1xxx"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/*
|
||||
* Samsung hardware
|
||||
|
@ -855,7 +855,7 @@ static size_t sizeof_idt(struct acpi_nfit_interleave *idt)
|
||||
{
|
||||
if (idt->header.length < sizeof(*idt))
|
||||
return 0;
|
||||
return sizeof(*idt) + sizeof(u32) * (idt->line_count - 1);
|
||||
return sizeof(*idt) + sizeof(u32) * idt->line_count;
|
||||
}
|
||||
|
||||
static bool add_idt(struct acpi_nfit_desc *acpi_desc,
|
||||
|
@ -1217,8 +1217,7 @@ static int acpi_processor_setup_lpi_states(struct acpi_processor *pr)
|
||||
strscpy(state->desc, lpi->desc, CPUIDLE_DESC_LEN);
|
||||
state->exit_latency = lpi->wake_latency;
|
||||
state->target_residency = lpi->min_residency;
|
||||
if (lpi->arch_flags)
|
||||
state->flags |= CPUIDLE_FLAG_TIMER_STOP;
|
||||
state->flags |= arch_get_idle_state_flags(lpi->arch_flags);
|
||||
if (i != 0 && lpi->entry_method == ACPI_CSTATE_FFH)
|
||||
state->flags |= CPUIDLE_FLAG_RCU_IDLE;
|
||||
state->enter = acpi_idle_lpi_enter;
|
||||
|
@ -439,6 +439,13 @@ static const struct dmi_system_id asus_laptop[] = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "S5602ZA"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.ident = "Asus ExpertBook B1402CBA",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "B1402CBA"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.ident = "Asus ExpertBook B1502CBA",
|
||||
.matches = {
|
||||
@ -500,16 +507,23 @@ static const struct dmi_system_id maingear_laptop[] = {
|
||||
|
||||
static const struct dmi_system_id pcspecialist_laptop[] = {
|
||||
{
|
||||
.ident = "PCSpecialist Elimina Pro 16 M",
|
||||
/*
|
||||
* Some models have product-name "Elimina Pro 16 M",
|
||||
* others "GM6BGEQ". Match on board-name to match both.
|
||||
*/
|
||||
/* TongFang GM6BGEQ / PCSpecialist Elimina Pro 16 M, RTX 3050 */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "PCSpecialist"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "GM6BGEQ"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* TongFang GM6BG5Q, RTX 4050 */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "GM6BG5Q"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* TongFang GM6BG0Q / PCSpecialist Elimina Pro 16 M, RTX 4060 */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "GM6BG0Q"),
|
||||
},
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
|
@ -4812,6 +4812,8 @@ static void binder_release_work(struct binder_proc *proc,
|
||||
"undelivered TRANSACTION_ERROR: %u\n",
|
||||
e->cmd);
|
||||
} break;
|
||||
case BINDER_WORK_TRANSACTION_PENDING:
|
||||
case BINDER_WORK_TRANSACTION_ONEWAY_SPAM_SUSPECT:
|
||||
case BINDER_WORK_TRANSACTION_COMPLETE: {
|
||||
binder_debug(BINDER_DEBUG_DEAD_TRANSACTION,
|
||||
"undelivered TRANSACTION_COMPLETE\n");
|
||||
|
@ -9,11 +9,6 @@
|
||||
*
|
||||
* The TD-2000 and certain older devices use a different protocol.
|
||||
* Try the fit2 protocol module with them.
|
||||
*
|
||||
* NB: The FIT adapters do not appear to support the control
|
||||
* registers. So, we map ALT_STATUS to STATUS and NO-OP writes
|
||||
* to the device control register - this means that IDE reset
|
||||
* will not work on these devices.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
@ -37,8 +32,7 @@
|
||||
|
||||
static void fit3_write_regr(struct pi_adapter *pi, int cont, int regr, int val)
|
||||
{
|
||||
if (cont == 1)
|
||||
return;
|
||||
regr += cont << 3;
|
||||
|
||||
switch (pi->mode) {
|
||||
case 0:
|
||||
@ -59,11 +53,7 @@ static int fit3_read_regr(struct pi_adapter *pi, int cont, int regr)
|
||||
{
|
||||
int a, b;
|
||||
|
||||
if (cont) {
|
||||
if (regr != 6)
|
||||
return 0xff;
|
||||
regr = 7;
|
||||
}
|
||||
regr += cont << 3;
|
||||
|
||||
switch (pi->mode) {
|
||||
case 0:
|
||||
|
@ -51,6 +51,13 @@ static void pata_parport_dev_select(struct ata_port *ap, unsigned int device)
|
||||
ata_sff_pause(ap);
|
||||
}
|
||||
|
||||
static void pata_parport_set_devctl(struct ata_port *ap, u8 ctl)
|
||||
{
|
||||
struct pi_adapter *pi = ap->host->private_data;
|
||||
|
||||
pi->proto->write_regr(pi, 1, 6, ctl);
|
||||
}
|
||||
|
||||
static bool pata_parport_devchk(struct ata_port *ap, unsigned int device)
|
||||
{
|
||||
struct pi_adapter *pi = ap->host->private_data;
|
||||
@ -64,7 +71,7 @@ static bool pata_parport_devchk(struct ata_port *ap, unsigned int device)
|
||||
pi->proto->write_regr(pi, 0, ATA_REG_NSECT, 0xaa);
|
||||
pi->proto->write_regr(pi, 0, ATA_REG_LBAL, 0x55);
|
||||
|
||||
pi->proto->write_regr(pi, 0, ATA_REG_NSECT, 055);
|
||||
pi->proto->write_regr(pi, 0, ATA_REG_NSECT, 0x55);
|
||||
pi->proto->write_regr(pi, 0, ATA_REG_LBAL, 0xaa);
|
||||
|
||||
nsect = pi->proto->read_regr(pi, 0, ATA_REG_NSECT);
|
||||
@ -73,6 +80,72 @@ static bool pata_parport_devchk(struct ata_port *ap, unsigned int device)
|
||||
return (nsect == 0x55) && (lbal == 0xaa);
|
||||
}
|
||||
|
||||
static int pata_parport_wait_after_reset(struct ata_link *link,
|
||||
unsigned int devmask,
|
||||
unsigned long deadline)
|
||||
{
|
||||
struct ata_port *ap = link->ap;
|
||||
struct pi_adapter *pi = ap->host->private_data;
|
||||
unsigned int dev0 = devmask & (1 << 0);
|
||||
unsigned int dev1 = devmask & (1 << 1);
|
||||
int rc, ret = 0;
|
||||
|
||||
ata_msleep(ap, ATA_WAIT_AFTER_RESET);
|
||||
|
||||
/* always check readiness of the master device */
|
||||
rc = ata_sff_wait_ready(link, deadline);
|
||||
if (rc) {
|
||||
/*
|
||||
* some adapters return bogus values if master device is not
|
||||
* present, so don't abort now if a slave device is present
|
||||
*/
|
||||
if (!dev1)
|
||||
return rc;
|
||||
ret = -ENODEV;
|
||||
}
|
||||
|
||||
/*
|
||||
* if device 1 was found in ata_devchk, wait for register
|
||||
* access briefly, then wait for BSY to clear.
|
||||
*/
|
||||
if (dev1) {
|
||||
int i;
|
||||
|
||||
pata_parport_dev_select(ap, 1);
|
||||
|
||||
/*
|
||||
* Wait for register access. Some ATAPI devices fail
|
||||
* to set nsect/lbal after reset, so don't waste too
|
||||
* much time on it. We're gonna wait for !BSY anyway.
|
||||
*/
|
||||
for (i = 0; i < 2; i++) {
|
||||
u8 nsect, lbal;
|
||||
|
||||
nsect = pi->proto->read_regr(pi, 0, ATA_REG_NSECT);
|
||||
lbal = pi->proto->read_regr(pi, 0, ATA_REG_LBAL);
|
||||
if (nsect == 1 && lbal == 1)
|
||||
break;
|
||||
/* give drive a breather */
|
||||
ata_msleep(ap, 50);
|
||||
}
|
||||
|
||||
rc = ata_sff_wait_ready(link, deadline);
|
||||
if (rc) {
|
||||
if (rc != -ENODEV)
|
||||
return rc;
|
||||
ret = rc;
|
||||
}
|
||||
}
|
||||
|
||||
pata_parport_dev_select(ap, 0);
|
||||
if (dev1)
|
||||
pata_parport_dev_select(ap, 1);
|
||||
if (dev0)
|
||||
pata_parport_dev_select(ap, 0);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int pata_parport_bus_softreset(struct ata_port *ap, unsigned int devmask,
|
||||
unsigned long deadline)
|
||||
{
|
||||
@ -87,7 +160,7 @@ static int pata_parport_bus_softreset(struct ata_port *ap, unsigned int devmask,
|
||||
ap->last_ctl = ap->ctl;
|
||||
|
||||
/* wait the port to become ready */
|
||||
return ata_sff_wait_after_reset(&ap->link, devmask, deadline);
|
||||
return pata_parport_wait_after_reset(&ap->link, devmask, deadline);
|
||||
}
|
||||
|
||||
static int pata_parport_softreset(struct ata_link *link, unsigned int *classes,
|
||||
@ -252,6 +325,7 @@ static struct ata_port_operations pata_parport_port_ops = {
|
||||
.hardreset = NULL,
|
||||
|
||||
.sff_dev_select = pata_parport_dev_select,
|
||||
.sff_set_devctl = pata_parport_set_devctl,
|
||||
.sff_check_status = pata_parport_check_status,
|
||||
.sff_check_altstatus = pata_parport_check_altstatus,
|
||||
.sff_tf_load = pata_parport_tf_load,
|
||||
|
@ -453,7 +453,8 @@ static int regcache_rbtree_write(struct regmap *map, unsigned int reg,
|
||||
if (!rbnode)
|
||||
return -ENOMEM;
|
||||
regcache_rbtree_set_register(map, rbnode,
|
||||
reg - rbnode->base_reg, value);
|
||||
(reg - rbnode->base_reg) / map->reg_stride,
|
||||
value);
|
||||
regcache_rbtree_insert(map, &rbtree_ctx->root, rbnode);
|
||||
rbtree_ctx->cached_rbnode = rbnode;
|
||||
}
|
||||
|
@ -1436,8 +1436,9 @@ static int nbd_start_device_ioctl(struct nbd_device *nbd)
|
||||
|
||||
static void nbd_clear_sock_ioctl(struct nbd_device *nbd)
|
||||
{
|
||||
blk_mark_disk_dead(nbd->disk);
|
||||
nbd_clear_sock(nbd);
|
||||
disk_force_media_change(nbd->disk);
|
||||
nbd_bdev_reset(nbd);
|
||||
if (test_and_clear_bit(NBD_RT_HAS_CONFIG_REF,
|
||||
&nbd->config->runtime_flags))
|
||||
nbd_config_put(nbd);
|
||||
|
@ -4419,6 +4419,7 @@ static int btusb_probe(struct usb_interface *intf,
|
||||
|
||||
if (id->driver_info & BTUSB_QCA_ROME) {
|
||||
data->setup_on_usb = btusb_setup_qca;
|
||||
hdev->shutdown = btusb_shutdown_qca;
|
||||
hdev->set_bdaddr = btusb_set_bdaddr_ath3012;
|
||||
hdev->cmd_timeout = btusb_qca_cmd_timeout;
|
||||
set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
|
||||
|
@ -247,8 +247,8 @@ static int counter_get_ext(const struct counter_comp *const ext,
|
||||
if (*id == component_id)
|
||||
return 0;
|
||||
|
||||
if (ext->type == COUNTER_COMP_ARRAY) {
|
||||
element = ext->priv;
|
||||
if (ext[*ext_idx].type == COUNTER_COMP_ARRAY) {
|
||||
element = ext[*ext_idx].priv;
|
||||
|
||||
if (component_id - *id < element->length)
|
||||
return 0;
|
||||
|
@ -97,7 +97,7 @@ static int mchp_tc_count_function_write(struct counter_device *counter,
|
||||
priv->qdec_mode = 0;
|
||||
/* Set highest rate based on whether soc has gclk or not */
|
||||
bmr &= ~(ATMEL_TC_QDEN | ATMEL_TC_POSEN);
|
||||
if (priv->tc_cfg->has_gclk)
|
||||
if (!priv->tc_cfg->has_gclk)
|
||||
cmr |= ATMEL_TC_TIMER_CLOCK2;
|
||||
else
|
||||
cmr |= ATMEL_TC_TIMER_CLOCK1;
|
||||
|
@ -76,16 +76,11 @@ struct dma_fence *__dma_fence_unwrap_merge(unsigned int num_fences,
|
||||
dma_fence_unwrap_for_each(tmp, &iter[i], fences[i]) {
|
||||
if (!dma_fence_is_signaled(tmp)) {
|
||||
++count;
|
||||
} else if (test_bit(DMA_FENCE_FLAG_TIMESTAMP_BIT,
|
||||
&tmp->flags)) {
|
||||
if (ktime_after(tmp->timestamp, timestamp))
|
||||
timestamp = tmp->timestamp;
|
||||
} else {
|
||||
/*
|
||||
* Use the current time if the fence is
|
||||
* currently signaling.
|
||||
*/
|
||||
timestamp = ktime_get();
|
||||
ktime_t t = dma_fence_timestamp(tmp);
|
||||
|
||||
if (ktime_after(t, timestamp))
|
||||
timestamp = t;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -268,13 +268,10 @@ static int sync_fill_fence_info(struct dma_fence *fence,
|
||||
sizeof(info->driver_name));
|
||||
|
||||
info->status = dma_fence_get_status(fence);
|
||||
while (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags) &&
|
||||
!test_bit(DMA_FENCE_FLAG_TIMESTAMP_BIT, &fence->flags))
|
||||
cpu_relax();
|
||||
info->timestamp_ns =
|
||||
test_bit(DMA_FENCE_FLAG_TIMESTAMP_BIT, &fence->flags) ?
|
||||
ktime_to_ns(fence->timestamp) :
|
||||
ktime_set(0, 0);
|
||||
dma_fence_is_signaled(fence) ?
|
||||
ktime_to_ns(dma_fence_timestamp(fence)) :
|
||||
ktime_set(0, 0);
|
||||
|
||||
return info->status;
|
||||
}
|
||||
|
@ -92,8 +92,14 @@ static void fsl_edma3_enable_request(struct fsl_edma_chan *fsl_chan)
|
||||
|
||||
edma_writel_chreg(fsl_chan, val, ch_sbr);
|
||||
|
||||
if (flags & FSL_EDMA_DRV_HAS_CHMUX)
|
||||
edma_writel_chreg(fsl_chan, fsl_chan->srcid, ch_mux);
|
||||
if (flags & FSL_EDMA_DRV_HAS_CHMUX) {
|
||||
/*
|
||||
* ch_mux: With the exception of 0, attempts to write a value
|
||||
* already in use will be forced to 0.
|
||||
*/
|
||||
if (!edma_readl_chreg(fsl_chan, ch_mux))
|
||||
edma_writel_chreg(fsl_chan, fsl_chan->srcid, ch_mux);
|
||||
}
|
||||
|
||||
val = edma_readl_chreg(fsl_chan, ch_csr);
|
||||
val |= EDMA_V3_CH_CSR_ERQ;
|
||||
@ -448,12 +454,25 @@ static void fsl_edma_set_tcd_regs(struct fsl_edma_chan *fsl_chan,
|
||||
|
||||
edma_write_tcdreg(fsl_chan, tcd->dlast_sga, dlast_sga);
|
||||
|
||||
csr = le16_to_cpu(tcd->csr);
|
||||
|
||||
if (fsl_chan->is_sw) {
|
||||
csr = le16_to_cpu(tcd->csr);
|
||||
csr |= EDMA_TCD_CSR_START;
|
||||
tcd->csr = cpu_to_le16(csr);
|
||||
}
|
||||
|
||||
/*
|
||||
* Must clear CHn_CSR[DONE] bit before enable TCDn_CSR[ESG] at EDMAv3
|
||||
* eDMAv4 have not such requirement.
|
||||
* Change MLINK need clear CHn_CSR[DONE] for both eDMAv3 and eDMAv4.
|
||||
*/
|
||||
if (((fsl_edma_drvflags(fsl_chan) & FSL_EDMA_DRV_CLEAR_DONE_E_SG) &&
|
||||
(csr & EDMA_TCD_CSR_E_SG)) ||
|
||||
((fsl_edma_drvflags(fsl_chan) & FSL_EDMA_DRV_CLEAR_DONE_E_LINK) &&
|
||||
(csr & EDMA_TCD_CSR_E_LINK)))
|
||||
edma_writel_chreg(fsl_chan, edma_readl_chreg(fsl_chan, ch_csr), ch_csr);
|
||||
|
||||
|
||||
edma_write_tcdreg(fsl_chan, tcd->csr, csr);
|
||||
}
|
||||
|
||||
|
@ -183,11 +183,23 @@ struct fsl_edma_desc {
|
||||
#define FSL_EDMA_DRV_BUS_8BYTE BIT(10)
|
||||
#define FSL_EDMA_DRV_DEV_TO_DEV BIT(11)
|
||||
#define FSL_EDMA_DRV_ALIGN_64BYTE BIT(12)
|
||||
/* Need clean CHn_CSR DONE before enable TCD's ESG */
|
||||
#define FSL_EDMA_DRV_CLEAR_DONE_E_SG BIT(13)
|
||||
/* Need clean CHn_CSR DONE before enable TCD's MAJORELINK */
|
||||
#define FSL_EDMA_DRV_CLEAR_DONE_E_LINK BIT(14)
|
||||
|
||||
#define FSL_EDMA_DRV_EDMA3 (FSL_EDMA_DRV_SPLIT_REG | \
|
||||
FSL_EDMA_DRV_BUS_8BYTE | \
|
||||
FSL_EDMA_DRV_DEV_TO_DEV | \
|
||||
FSL_EDMA_DRV_ALIGN_64BYTE)
|
||||
FSL_EDMA_DRV_ALIGN_64BYTE | \
|
||||
FSL_EDMA_DRV_CLEAR_DONE_E_SG | \
|
||||
FSL_EDMA_DRV_CLEAR_DONE_E_LINK)
|
||||
|
||||
#define FSL_EDMA_DRV_EDMA4 (FSL_EDMA_DRV_SPLIT_REG | \
|
||||
FSL_EDMA_DRV_BUS_8BYTE | \
|
||||
FSL_EDMA_DRV_DEV_TO_DEV | \
|
||||
FSL_EDMA_DRV_ALIGN_64BYTE | \
|
||||
FSL_EDMA_DRV_CLEAR_DONE_E_LINK)
|
||||
|
||||
struct fsl_edma_drvdata {
|
||||
u32 dmamuxs; /* only used before v3 */
|
||||
|
@ -154,18 +154,20 @@ static struct dma_chan *fsl_edma3_xlate(struct of_phandle_args *dma_spec,
|
||||
fsl_chan = to_fsl_edma_chan(chan);
|
||||
i = fsl_chan - fsl_edma->chans;
|
||||
|
||||
chan = dma_get_slave_channel(chan);
|
||||
chan->device->privatecnt++;
|
||||
fsl_chan->priority = dma_spec->args[1];
|
||||
fsl_chan->is_rxchan = dma_spec->args[2] & ARGS_RX;
|
||||
fsl_chan->is_remote = dma_spec->args[2] & ARGS_REMOTE;
|
||||
fsl_chan->is_multi_fifo = dma_spec->args[2] & ARGS_MULTI_FIFO;
|
||||
|
||||
if (!b_chmux && i == dma_spec->args[0]) {
|
||||
chan = dma_get_slave_channel(chan);
|
||||
chan->device->privatecnt++;
|
||||
mutex_unlock(&fsl_edma->fsl_edma_mutex);
|
||||
return chan;
|
||||
} else if (b_chmux && !fsl_chan->srcid) {
|
||||
/* if controller support channel mux, choose a free channel */
|
||||
chan = dma_get_slave_channel(chan);
|
||||
chan->device->privatecnt++;
|
||||
fsl_chan->srcid = dma_spec->args[0];
|
||||
mutex_unlock(&fsl_edma->fsl_edma_mutex);
|
||||
return chan;
|
||||
@ -355,7 +357,7 @@ static struct fsl_edma_drvdata imx93_data3 = {
|
||||
};
|
||||
|
||||
static struct fsl_edma_drvdata imx93_data4 = {
|
||||
.flags = FSL_EDMA_DRV_HAS_CHMUX | FSL_EDMA_DRV_HAS_DMACLK | FSL_EDMA_DRV_EDMA3,
|
||||
.flags = FSL_EDMA_DRV_HAS_CHMUX | FSL_EDMA_DRV_HAS_DMACLK | FSL_EDMA_DRV_EDMA4,
|
||||
.chreg_space_sz = 0x8000,
|
||||
.chreg_off = 0x10000,
|
||||
.setup_irq = fsl_edma3_irq_init,
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user