mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-09-18 23:09:29 +02:00
Merge remote-tracking branch 'drm/drm-next' into drm-rust-next
Backmerge to pull in commit 21fcb222f0 ("drm: Remove DRIVER_GEM_GPUVA
feature flag"), which a Tyr patch series depends on.
Signed-off-by: Danilo Krummrich <dakr@kernel.org>
This commit is contained in:
+1
-1
@@ -167,7 +167,7 @@ ForEachMacros:
|
||||
- 'drm_connector_for_each_possible_encoder'
|
||||
- 'drm_exec_for_each_locked_object'
|
||||
- 'drm_exec_for_each_locked_object_reverse'
|
||||
- 'drm_for_each_bridge_in_chain_scoped'
|
||||
- 'drm_for_each_bridge_in_chain'
|
||||
- 'drm_for_each_connector_iter'
|
||||
- 'drm_for_each_crtc'
|
||||
- 'drm_for_each_crtc_reverse'
|
||||
|
||||
@@ -373,6 +373,7 @@ Jarkko Sakkinen <jarkko@kernel.org> <jarkko.sakkinen@opinsys.com>
|
||||
Jason Gunthorpe <jgg@ziepe.ca> <jgg@mellanox.com>
|
||||
Jason Gunthorpe <jgg@ziepe.ca> <jgg@nvidia.com>
|
||||
Jason Gunthorpe <jgg@ziepe.ca> <jgunthorpe@obsidianresearch.com>
|
||||
Jason Wang <jasowangio@gmail.com> <jasowang@redhat.com>
|
||||
Jason Xing <kerneljasonxing@gmail.com> <kernelxing@tencent.com>
|
||||
<javier@osg.samsung.com> <javier.martinez@collabora.co.uk>
|
||||
Javi Merino <javi.merino@kernel.org> <javi.merino@arm.com>
|
||||
@@ -558,6 +559,7 @@ Martyna Szapar-Mudlaw <martyna.szapar-mudlaw@linux.intel.com> <martyna.szapar-mu
|
||||
Mathieu Othacehe <othacehe@gnu.org> <m.othacehe@gmail.com>
|
||||
Mat Martineau <martineau@kernel.org> <mathew.j.martineau@linux.intel.com>
|
||||
Mat Martineau <martineau@kernel.org> <mathewm@codeaurora.org>
|
||||
Matt Coster <opensource@mtcoster.net> <matt.coster@imgtec.com>
|
||||
Matthew Wilcox <willy@infradead.org> <matthew.r.wilcox@intel.com>
|
||||
Matthew Wilcox <willy@infradead.org> <matthew@wil.cx>
|
||||
Matthew Wilcox <willy@infradead.org> <mawilcox@linuxonhyperv.com>
|
||||
@@ -626,7 +628,8 @@ Nadav Amit <nadav.amit@gmail.com> <namit@cs.technion.ac.il>
|
||||
Nadia Yvette Chambers <nyc@holomorphy.com> William Lee Irwin III <wli@holomorphy.com>
|
||||
Naoya Horiguchi <nao.horiguchi@gmail.com> <n-horiguchi@ah.jp.nec.com>
|
||||
Naoya Horiguchi <nao.horiguchi@gmail.com> <naoya.horiguchi@nec.com>
|
||||
Natalie Vock <natalie.vock@gmx.de> <friedrich.vock@gmx.de>
|
||||
Natalie Vock <nat@pixelcluster.dev> <friedrich.vock@gmx.de>
|
||||
Natalie Vock <nat@pixelcluster.dev> <natalie.vock@gmx.de>
|
||||
Nathan Chancellor <nathan@kernel.org> <natechancellor@gmail.com>
|
||||
Naveen N Rao <naveen@kernel.org> <naveen.n.rao@linux.ibm.com>
|
||||
Naveen N Rao <naveen@kernel.org> <naveen.n.rao@linux.vnet.ibm.com>
|
||||
|
||||
@@ -29,3 +29,29 @@ Date: Oct 2025
|
||||
KernelVersion: 6.18
|
||||
Contact: Cédric Le Goater <clg@redhat.com>
|
||||
Description: Read the migration features of the vfio device.
|
||||
|
||||
What: /sys/kernel/debug/vfio/<device>/pci
|
||||
Date: June 2026
|
||||
KernelVersion: 7.2
|
||||
Contact: Alex Williamson <alex.williamson@nvidia.com>
|
||||
Description: This debugfs file directory is used for debugging
|
||||
VFIO PCI devices.
|
||||
|
||||
What: /sys/kernel/debug/vfio/<device>/pci/nointxmask
|
||||
Date: June 2026
|
||||
KernelVersion: 7.2
|
||||
Contact: Alex Williamson <alex.williamson@nvidia.com>
|
||||
Description: Read the nointxmask policy latched for this device. This
|
||||
policy governs whether the device may use PCI 2.3 style
|
||||
INTx masking when supported, reporting a value of "N", or
|
||||
requires APIC level INTx masking, reporting a value of "Y".
|
||||
|
||||
What: /sys/kernel/debug/vfio/<device>/pci/disable_idle_d3
|
||||
Date: June 2026
|
||||
KernelVersion: 7.2
|
||||
Contact: Alex Williamson <alex.williamson@nvidia.com>
|
||||
Description: Read the disable_idle_d3 policy latched for this device. This
|
||||
policy governs whether the device PM runtime usage count is
|
||||
kept elevated while the device is bound to the driver and
|
||||
unused, reporting a value of "Y", or decremented to allow the
|
||||
device to enter a low power state, reporting a value of "N".
|
||||
|
||||
@@ -251,6 +251,13 @@ Description: RO. Fan 2 speed in RPM.
|
||||
|
||||
Only supported for particular Intel Xe graphics platforms.
|
||||
|
||||
On DG2 the driver always shows two fan channels, because the
|
||||
FSC_READ_NUM_FANS command does not work on some cards. OEMs
|
||||
decide how the fans map to tach channels, so two fans can share
|
||||
one tach line. When that happens, the second channel
|
||||
reads 0 RPM even though the fan is spinning. This is normal, not
|
||||
a bug.
|
||||
|
||||
What: /sys/bus/pci/drivers/xe/.../hwmon/hwmon<i>/fan3_input
|
||||
Date: March 2025
|
||||
KernelVersion: 6.16
|
||||
|
||||
@@ -2861,6 +2861,12 @@ DMEM Interface Files
|
||||
The semantics are the same as for the memory cgroup controller, and are
|
||||
calculated in the same way.
|
||||
|
||||
dmem.peak
|
||||
A read-only nested-keyed file that exists on non-root cgroups.
|
||||
|
||||
The max device memory usage recorded for the cgroup and its
|
||||
descendants since the creation of the cgroup for each region.
|
||||
|
||||
dmem.capacity
|
||||
A read-only file that describes maximum region capacity.
|
||||
It only exists on the root cgroup. Not all memory can be
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/display/panel/anbernic,td4310.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Anbernic TD4310 Based Panels
|
||||
|
||||
maintainers:
|
||||
- Chris Morgan <macromorgan@hotmail.com>
|
||||
|
||||
description:
|
||||
Anbernic TD4310 Based Panels, such as the RG-Vita-Pro panel
|
||||
(a 1080x1920 5.5 inch panel).
|
||||
|
||||
allOf:
|
||||
- $ref: panel-common.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
items:
|
||||
- enum:
|
||||
- anbernic,panel-vita-pro
|
||||
- const: anbernic,td4310
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
vdd-supply:
|
||||
description: Panel power supply
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- port
|
||||
- reg
|
||||
- reset-gpios
|
||||
- vdd-supply
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
|
||||
dsi {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
panel@0 {
|
||||
compatible = "anbernic,panel-vita-pro", "anbernic,td4310";
|
||||
reg = <0>;
|
||||
backlight = <&backlight>;
|
||||
enable-gpios = <&gpio0 9 GPIO_ACTIVE_HIGH>;
|
||||
reset-gpios = <&gpio0 13 GPIO_ACTIVE_LOW>;
|
||||
rotation = <270>;
|
||||
vdd-supply = <&vdd_lcd>;
|
||||
|
||||
port {
|
||||
endpoint {
|
||||
remote-endpoint = <&dsi_out>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
...
|
||||
@@ -0,0 +1,79 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/display/panel/chipone,icna3512.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Chipone ICNA3512 and ICNA3520 display drivers
|
||||
|
||||
maintainers:
|
||||
- Neil Armstrong <neil.armstrong@linaro.org>
|
||||
|
||||
description:
|
||||
The Chipone ICNA3512 and ICNA3520 are DDICs connected
|
||||
using a MIPI-DSI video interface.
|
||||
|
||||
allOf:
|
||||
- $ref: panel-common.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
oneOf:
|
||||
- items:
|
||||
- enum:
|
||||
- ayaneo,pocketds-panel-top
|
||||
- ayntec,odin2portal-panel
|
||||
- const: chipone,icna3512
|
||||
|
||||
- items:
|
||||
- enum:
|
||||
- ayntec,odin3-panel
|
||||
- ayntec,thor-panel-top
|
||||
- const: chipone,icna3520
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
description: DSI virtual channel
|
||||
|
||||
vdd-supply: true
|
||||
vddio-supply: true
|
||||
vci-supply: true
|
||||
disp-supply: true
|
||||
blvdd-supply: true
|
||||
|
||||
port: true
|
||||
reset-gpios: true
|
||||
rotation: true
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- vdd-supply
|
||||
- vddio-supply
|
||||
- vci-supply
|
||||
- disp-supply
|
||||
- blvdd-supply
|
||||
- reset-gpios
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
|
||||
dsi {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
panel@0 {
|
||||
compatible = "ayntec,odin2portal-panel", "chipone,icna3512";
|
||||
reg = <0>;
|
||||
vdd-supply = <&vreg_l11b_1p2>;
|
||||
vddio-supply = <&vreg_l12b_1p8>;
|
||||
vci-supply = <&vreg_l13b_3p0>;
|
||||
disp-supply = <&vdd_disp_2v8>;
|
||||
blvdd-supply = <&vdd_bl_5v0>;
|
||||
reset-gpios = <&tlmm 133 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
};
|
||||
|
||||
...
|
||||
@@ -40,6 +40,9 @@ properties:
|
||||
vddi-supply:
|
||||
description: power supply for IC
|
||||
|
||||
bl-supply:
|
||||
description: power supply for backlight, in case it's managed via DSC
|
||||
|
||||
backlight: true
|
||||
ports: true
|
||||
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/display/panel/ilitek,ili7807s.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Ilitek ILI7807S-based DSI panels
|
||||
|
||||
maintainers:
|
||||
- Arpit Saini <arpit.saini@oss.qualcomm.com>
|
||||
|
||||
allOf:
|
||||
- $ref: panel-common.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
items:
|
||||
- enum:
|
||||
- dlc,dlc0697
|
||||
- const: ilitek,ili7807s
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
description: DSI virtual channel
|
||||
|
||||
vddi-supply:
|
||||
description: I/O voltage supply (1.8V)
|
||||
|
||||
avdd-supply:
|
||||
description: Positive LCD bias supply (AVDD), typically +5.5V
|
||||
(range 4.5V to 6.3V)
|
||||
|
||||
avee-supply:
|
||||
description: Negative LCD bias supply (AVEE), typically -5.5V
|
||||
(range -6.3V to -4.5V)
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- reset-gpios
|
||||
- vddi-supply
|
||||
- avdd-supply
|
||||
- avee-supply
|
||||
- port
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
|
||||
dsi {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
panel@0 {
|
||||
compatible = "dlc,dlc0697", "ilitek,ili7807s";
|
||||
reg = <0>;
|
||||
|
||||
reset-gpios = <&tlmm 3 GPIO_ACTIVE_LOW>;
|
||||
vddi-supply = <&pm4125_l15>;
|
||||
avdd-supply = <&avdd>;
|
||||
avee-supply = <&avee>;
|
||||
|
||||
port {
|
||||
panel_in: endpoint {
|
||||
remote-endpoint = <&dsi0_out>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,63 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/display/panel/ilitek,ili9488.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Ilitek ILI9488 based MIPI-DSI panels
|
||||
|
||||
maintainers:
|
||||
- Igor Reznichenko <igor@reznichenko.net>
|
||||
|
||||
allOf:
|
||||
- $ref: panel-common.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
items:
|
||||
- enum:
|
||||
- focuslcds,e35gh-i-mw800cb
|
||||
- const: ilitek,ili9488
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
vci-supply: true
|
||||
iovcc-supply: true
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- vci-supply
|
||||
- iovcc-supply
|
||||
- reset-gpios
|
||||
- backlight
|
||||
- port
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
|
||||
dsi {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
panel@0 {
|
||||
compatible = "focuslcds,e35gh-i-mw800cb", "ilitek,ili9488";
|
||||
reg = <0>;
|
||||
vci-supply = <®_vci_panel>;
|
||||
iovcc-supply = <®_iovcc_panel>;
|
||||
reset-gpios = <&gpio3 6 GPIO_ACTIVE_LOW>;
|
||||
backlight = <&pwm_bl>;
|
||||
|
||||
port {
|
||||
panel_in: endpoint {
|
||||
remote-endpoint = <&dsi_out>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
...
|
||||
@@ -0,0 +1,91 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/display/panel/novatek,nt36536.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Novatek NT36536 based DSI display Panels
|
||||
|
||||
maintainers:
|
||||
- Pengyu Luo <mitltlatltl@gmail.com>
|
||||
|
||||
description:
|
||||
The Novatek NT36536 is a generic DSI Panel IC used to drive dsi
|
||||
panels. Support video mode panels from China Star Optoelectronics
|
||||
Technology (CSOT), such as PP8807HB1-1 which is a dual-link 10-bit
|
||||
panel.
|
||||
|
||||
allOf:
|
||||
- $ref: panel-common-dual.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
items:
|
||||
- enum:
|
||||
- csot,pp8807hb1-1
|
||||
- const: novatek,nt36536
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
reset-gpios:
|
||||
maxItems: 1
|
||||
|
||||
vddio-supply:
|
||||
description: I/O source voltage rail
|
||||
|
||||
vsp-supply:
|
||||
description: Positive source voltage rail
|
||||
|
||||
vsn-supply:
|
||||
description: Negative source voltage rail
|
||||
|
||||
backlight: true
|
||||
ports: true
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- vddio-supply
|
||||
- reset-gpios
|
||||
- ports
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
|
||||
dsi {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
panel@0 {
|
||||
compatible = "csot,pp8807hb1-1", "novatek,nt36536";
|
||||
reg = <0>;
|
||||
|
||||
vddio-supply = <&vreg_iovdd_1p8>;
|
||||
reset-gpios = <&tlmm 98 GPIO_ACTIVE_LOW>;
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
panel_in_0: endpoint {
|
||||
remote-endpoint = <&dsi0_out>;
|
||||
};
|
||||
};
|
||||
|
||||
port@1{
|
||||
reg = <1>;
|
||||
panel_in_1: endpoint {
|
||||
remote-endpoint = <&dsi1_out>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
...
|
||||
@@ -58,6 +58,8 @@ properties:
|
||||
- hydis,hv070wx2-1e0
|
||||
# Jenson Display BL-JT60050-01A 7" WSVGA (1024x600) color TFT LCD LVDS panel
|
||||
- jenson,bl-jt60050-01a
|
||||
# Opto Logic SCX1001511GGC49 10.1" WXGA (1280x800) TFT LCD LVDS panel
|
||||
- optologic,scx1001511ggc49
|
||||
# Riverdi RVT101HVLNWC00 10.1" WXGA (1280x800) TFT LCD LVDS panel
|
||||
- riverdi,rvt101hvlnwc00
|
||||
# Riverdi RVT70HSLNWCA0 7.0" WSVGA (1024x600) TFT LCD LVDS panel
|
||||
|
||||
@@ -0,0 +1,98 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/display/panel/renesas,r63419.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Renesas R63419 based dual-DSI video mode Display Panel
|
||||
|
||||
maintainers:
|
||||
- Neil Armstrong <neil.armstrong@linaro.org>
|
||||
|
||||
description:
|
||||
The Renesas R63419 is a generic DDIC used to control dual-DSI LCD panels.
|
||||
|
||||
allOf:
|
||||
- $ref: panel-common-dual.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
items:
|
||||
- enum:
|
||||
- ayaneo,wt0600-2k
|
||||
- ayaneo,wt0630-2k
|
||||
- const: renesas,r63419
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
vdd-supply: true
|
||||
vddio-supply: true
|
||||
vsp-supply: true
|
||||
vsn-supply: true
|
||||
vci-supply: true
|
||||
|
||||
backlight: true
|
||||
reset-gpios: true
|
||||
rotation: true
|
||||
ports: true
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- vdd-supply
|
||||
- vddio-supply
|
||||
- vsp-supply
|
||||
- vsn-supply
|
||||
- vci-supply
|
||||
- backlight
|
||||
- reset-gpios
|
||||
- ports
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
|
||||
dsi {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
panel@0 {
|
||||
compatible = "ayaneo,wt0600-2k", "renesas,r63419";
|
||||
reg = <0>;
|
||||
|
||||
reset-gpios = <&gpio 176 GPIO_ACTIVE_LOW>;
|
||||
|
||||
vdd-supply = <&vdd_3v0_lcd>;
|
||||
vddio-supply = <&vdd_1v8_io>;
|
||||
vsn-supply = <&vdd_5v0_neg>;
|
||||
vsp-supply = <&vdd_5v0_pos>;
|
||||
vci-supply = <&vdd_3v0_vci>;
|
||||
|
||||
backlight = <&backlight>;
|
||||
|
||||
rotation = <90>;
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
panel_in0: endpoint {
|
||||
remote-endpoint = <&dsi0_out>;
|
||||
};
|
||||
};
|
||||
|
||||
port@1 {
|
||||
reg = <1>;
|
||||
panel_in1: endpoint {
|
||||
remote-endpoint = <&dsi1_out>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
...
|
||||
@@ -25,6 +25,8 @@ properties:
|
||||
- samsung,atna40ct06
|
||||
# Samsung 14" WQXGA+ (2880x1800 pixels) eDP AMOLED panel
|
||||
- samsung,atna40cu11
|
||||
# Samsung 14" WQXGA+ (2880x1800 pixels) eDP AMOLED panel
|
||||
- samsung,atna40hq08
|
||||
# Samsung 14" WQXGA+ (2880×1800 pixels) eDP AMOLED panel
|
||||
- samsung,atna40yk20
|
||||
# Samsung 14.5" WQXGA+ (2880x1800 pixels) eDP AMOLED panel
|
||||
|
||||
@@ -15,18 +15,24 @@ properties:
|
||||
enum:
|
||||
- rockchip,rk3288-dp
|
||||
- rockchip,rk3399-edp
|
||||
- rockchip,rk3576-edp
|
||||
- rockchip,rk3588-edp
|
||||
|
||||
clocks:
|
||||
minItems: 2
|
||||
maxItems: 3
|
||||
items:
|
||||
- description: Reference clock
|
||||
- description: APB bus clock
|
||||
- description: GRF or AHB bus clock
|
||||
|
||||
clock-names:
|
||||
minItems: 2
|
||||
items:
|
||||
- const: dp
|
||||
- const: pclk
|
||||
- const: grf
|
||||
- enum:
|
||||
- grf
|
||||
- hclk
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
@@ -65,9 +71,46 @@ allOf:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- rockchip,rk3288-dp
|
||||
then:
|
||||
properties:
|
||||
clocks:
|
||||
maxItems: 2
|
||||
clock-names:
|
||||
maxItems: 2
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- rockchip,rk3399-edp
|
||||
then:
|
||||
properties:
|
||||
clocks:
|
||||
minItems: 3
|
||||
clock-names:
|
||||
items:
|
||||
- const: dp
|
||||
- const: pclk
|
||||
- const: grf
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- rockchip,rk3576-edp
|
||||
- rockchip,rk3588-edp
|
||||
then:
|
||||
properties:
|
||||
clocks:
|
||||
minItems: 3
|
||||
clock-names:
|
||||
items:
|
||||
- const: dp
|
||||
- const: pclk
|
||||
- const: hclk
|
||||
resets:
|
||||
minItems: 2
|
||||
reset-names:
|
||||
|
||||
@@ -22,6 +22,7 @@ properties:
|
||||
- nvidia,tegra186-vic
|
||||
- nvidia,tegra194-vic
|
||||
- nvidia,tegra234-vic
|
||||
- nvidia,tegra264-vic
|
||||
|
||||
- items:
|
||||
- const: nvidia,tegra132-vic
|
||||
|
||||
@@ -25,6 +25,7 @@ properties:
|
||||
- nvidia,tegra186-host1x
|
||||
- nvidia,tegra194-host1x
|
||||
- nvidia,tegra234-host1x
|
||||
- nvidia,tegra264-host1x
|
||||
|
||||
- items:
|
||||
- const: nvidia,tegra132-host1x
|
||||
@@ -57,7 +58,8 @@ properties:
|
||||
enum: [1, 2]
|
||||
|
||||
ranges:
|
||||
maxItems: 1
|
||||
minItems: 1
|
||||
maxItems: 2
|
||||
|
||||
clocks:
|
||||
description: Must contain one entry, for the module clock. See
|
||||
@@ -192,6 +194,7 @@ allOf:
|
||||
contains:
|
||||
enum:
|
||||
- nvidia,tegra234-host1x
|
||||
- nvidia,tegra264-host1x
|
||||
then:
|
||||
properties:
|
||||
reg-names:
|
||||
@@ -239,6 +242,21 @@ allOf:
|
||||
|
||||
required:
|
||||
- reg-names
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- nvidia,tegra264-host1x
|
||||
then:
|
||||
properties:
|
||||
ranges:
|
||||
minItems: 2
|
||||
maxItems: 2
|
||||
else:
|
||||
properties:
|
||||
ranges:
|
||||
maxItems: 1
|
||||
|
||||
examples:
|
||||
- |
|
||||
|
||||
@@ -8,7 +8,8 @@ $schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
title: Imagination Technologies PowerVR and IMG Rogue GPUs
|
||||
|
||||
maintainers:
|
||||
- Frank Binns <frank.binns@imgtec.com>
|
||||
- Alessio Belle <alessio.belle@imgtec.com>
|
||||
- Luigi Santivetti <luigi.santivetti@imgtec.com>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -9,7 +9,8 @@ $schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
title: Imagination Technologies PowerVR SGX GPUs
|
||||
|
||||
maintainers:
|
||||
- Frank Binns <frank.binns@imgtec.com>
|
||||
- Alessio Belle <alessio.belle@imgtec.com>
|
||||
- Luigi Santivetti <luigi.santivetti@imgtec.com>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -50,7 +50,6 @@ properties:
|
||||
- enum:
|
||||
- mscc,ocelot-spi
|
||||
- mscc,jaguar2-spi
|
||||
- renesas,rzn1-spi
|
||||
- sophgo,sg2042-spi
|
||||
- thead,th1520-spi
|
||||
- const: snps,dw-apb-ssi
|
||||
@@ -94,6 +93,9 @@ properties:
|
||||
- const: ssi_clk
|
||||
- const: pclk
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
resets:
|
||||
maxItems: 1
|
||||
|
||||
|
||||
@@ -225,6 +225,8 @@ patternProperties:
|
||||
description: Axis Communications AB
|
||||
"^ayaneo,.*":
|
||||
description: Anyun Intelligent Technology (Hong Kong) Co., Ltd
|
||||
"^ayntec,.*":
|
||||
description: AYN Technologies Co., Ltd.
|
||||
"^azoteq,.*":
|
||||
description: Azoteq (Pty) Ltd
|
||||
"^azw,.*":
|
||||
@@ -604,6 +606,8 @@ patternProperties:
|
||||
description: Flipkart Inc.
|
||||
"^focaltech,.*":
|
||||
description: FocalTech Systems Co.,Ltd
|
||||
"^focuslcds,.*":
|
||||
description: Focus Display Solutions, Inc.
|
||||
"^forlinx,.*":
|
||||
description: Baoding Forlinx Embedded Technology Co., Ltd.
|
||||
"^foursemi,.*":
|
||||
@@ -1411,6 +1415,8 @@ patternProperties:
|
||||
description: Embest RIoT
|
||||
"^riscv,.*":
|
||||
description: RISC-V Foundation
|
||||
"^riverdi,.*":
|
||||
description: Riverdi Sp. z o.o
|
||||
"^rockchip,.*":
|
||||
description: Rockchip Electronics Co., Ltd.
|
||||
"^rocktech,.*":
|
||||
|
||||
@@ -97,7 +97,7 @@ ACLs Partially Supported. only DACLs available, SACLs
|
||||
to allow future support for running as a domain
|
||||
member.
|
||||
Kerberos Supported.
|
||||
Durable handle v1,v2 Planned for future.
|
||||
Durable handle v1,v2 Supported.
|
||||
Persistent handle Planned for future.
|
||||
SMB2 notify Planned for future.
|
||||
Sparse file support Supported.
|
||||
@@ -111,7 +111,7 @@ DCE/RPC support Partially Supported. a few calls(NetShareEnumAll,
|
||||
for Witness protocol e.g.)
|
||||
ksmbd/nfsd interoperability Planned for future. The features that ksmbd
|
||||
support are Leases, Notify, ACLs and Share modes.
|
||||
SMB3.1.1 Compression Planned for future.
|
||||
SMB3.1.1 Compression Supported.
|
||||
SMB3.1.1 over QUIC Planned for future.
|
||||
Signing/Encryption over RDMA Planned for future.
|
||||
SMB3.1.1 GMAC signing support Planned for future.
|
||||
|
||||
@@ -32,6 +32,9 @@ Interrupts
|
||||
.. kernel-doc:: drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
|
||||
:functions: register_hpd_handlers dm_crtc_high_irq dm_pflip_high_irq
|
||||
|
||||
.. kernel-doc:: drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
|
||||
:functions: amdgpu_display_hotplug_work_func
|
||||
|
||||
Atomic Implementation
|
||||
=====================
|
||||
|
||||
@@ -178,3 +181,9 @@ following path:
|
||||
2. On DC interface, :c:type:`struct mpcc_blnd_cfg <mpcc_blnd_cfg>` programs the
|
||||
MPCC blend configuration considering the :c:type:`dc_plane_info
|
||||
<dc_plane_info>` input from DPP.
|
||||
|
||||
Display Properties
|
||||
==================
|
||||
|
||||
.. kernel-doc:: drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
|
||||
:doc: property for adaptive backlight modulation
|
||||
|
||||
@@ -99,7 +99,8 @@ How to enable automated testing on your tree
|
||||
============================================
|
||||
|
||||
1. Create a Linux tree in https://gitlab.freedesktop.org/ if you don't have one
|
||||
yet
|
||||
yet, by forking https://gitlab.freedesktop.org/drm/kernel (this allows GitLab
|
||||
to internally track that these are the same git objects).
|
||||
|
||||
2. In your kernel repo's configuration (eg.
|
||||
https://gitlab.freedesktop.org/janedoe/linux/-/settings/ci_cd), change the
|
||||
|
||||
@@ -171,6 +171,12 @@ Bridge Operations
|
||||
.. kernel-doc:: drivers/gpu/drm/drm_bridge.c
|
||||
:doc: bridge operations
|
||||
|
||||
Bridge Chain Format Selection
|
||||
-----------------------------
|
||||
|
||||
.. kernel-doc:: drivers/gpu/drm/drm_bridge.c
|
||||
:doc: bridge chain format selection
|
||||
|
||||
Bridge Connector Helper
|
||||
-----------------------
|
||||
|
||||
|
||||
@@ -287,6 +287,12 @@ structure, ordering of committing state changes to hardware is sequenced using
|
||||
Read on in this chapter, and also in :ref:`drm_atomic_helper` for more detailed
|
||||
coverage of specific topics.
|
||||
|
||||
Atomic State Lifetime
|
||||
---------------------
|
||||
|
||||
.. kernel-doc:: drivers/gpu/drm/drm_atomic.c
|
||||
:doc: state lifetime
|
||||
|
||||
Handling Driver Private State
|
||||
-----------------------------
|
||||
|
||||
@@ -604,6 +610,12 @@ Color Management Properties
|
||||
.. kernel-doc:: drivers/gpu/drm/drm_color_mgmt.c
|
||||
:doc: overview
|
||||
|
||||
Color Format Property
|
||||
---------------------
|
||||
|
||||
.. kernel-doc:: drivers/gpu/drm/drm_connector.c
|
||||
:doc: Color format
|
||||
|
||||
Tile Group Property
|
||||
-------------------
|
||||
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
.. SPDX-License-Identifier: MIT
|
||||
.. Copyright © 2026 Intel Corporation
|
||||
|
||||
DisplayPort Link Training
|
||||
=========================
|
||||
|
||||
.. kernel-doc:: drivers/gpu/drm/i915/display/intel_dp_link_training.c
|
||||
:doc: DisplayPort link training
|
||||
@@ -38,6 +38,7 @@ driver. The display driver isn't an independent driver in that sense.
|
||||
fifo-underrun
|
||||
frontbuffer
|
||||
hotplug
|
||||
dp-link-training
|
||||
plane
|
||||
psr
|
||||
snps-phy
|
||||
|
||||
@@ -55,7 +55,7 @@ There are still drivers that use drm_simple_display_pipe. The task here is to
|
||||
convert them to use regular atomic helpers. Search for a driver that calls
|
||||
drm_simple_display_pipe_init() and inline all helpers from drm_simple_kms_helper.c
|
||||
into the driver, such that no simple-KMS interfaces are required. Please also
|
||||
rename all inlined fucntions according to driver conventions.
|
||||
rename all inlined functions according to driver conventions.
|
||||
|
||||
Contact: Thomas Zimmermann, respective driver maintainer
|
||||
|
||||
@@ -896,10 +896,11 @@ complection of submission.
|
||||
One minor feature still missing is a generic DRM IOCTL to query the error
|
||||
status of binary and timeline drm_syncobj.
|
||||
|
||||
This should probably be improved by implementing the necessary kernel interface
|
||||
and adding support for that in the userspace stack.
|
||||
This was already improved by implementing the necessary kernel interface
|
||||
(patches are on the dri-devel mailing list) but adding support for that in the
|
||||
userspace stack is still missing.
|
||||
|
||||
Contact: Christian König
|
||||
Contact: Christian König, Michel Dänzer
|
||||
|
||||
Level: Starter
|
||||
|
||||
@@ -948,6 +949,47 @@ Contact: Philipp Stanner <phasta@kernel.org>
|
||||
|
||||
Level: Intermediate
|
||||
|
||||
Replace the lockless queue with a locked list
|
||||
---------------------------------------------
|
||||
|
||||
drm_sched is the only user in the entire kernel of a special lockless queue, the
|
||||
spsc_queue. This queue utilizes:
|
||||
|
||||
- preempt_disable()
|
||||
- atomic instructions
|
||||
- memory barriers
|
||||
- ACCESS_ONCE()
|
||||
|
||||
whereas a conventional spinlock utilizes:
|
||||
|
||||
- preempt_disable()
|
||||
- 1 atomic instruction for taking / releasing the lock
|
||||
- memory barriers
|
||||
|
||||
Moreover, drm_sched_entity_push_job(), the only user of spsc_queue_push(), has
|
||||
to take a lock in some situations anyways and calls to it are often serialized
|
||||
with a driver lock.
|
||||
|
||||
It is, thus, highly questionable whether the lockless queue grants any advantage
|
||||
at all. Considering that its internals are not well documented and its correctness
|
||||
is not formally proven, it seems desirable to replace the queue with a mere list
|
||||
or hlist that is protected by a spinlock.
|
||||
|
||||
Tasks:
|
||||
|
||||
- Replace the spsc_queue in drm/sched (and those who might access the scheduler's
|
||||
internal queue) with a spinlock + (h)list.
|
||||
- Ideally, check with some micro benchmarks and real world tests (preferably
|
||||
with amdgpu) for relevant performance regressions.
|
||||
- Remove the spsc_queue from the kernel altogether.
|
||||
|
||||
Contact:
|
||||
|
||||
- Philipp Stanner <phasta@kernel.org>
|
||||
- Christian König <christian.koenig@amd.com>
|
||||
|
||||
Level: Beginner
|
||||
|
||||
Outside DRM
|
||||
===========
|
||||
|
||||
|
||||
@@ -256,7 +256,7 @@ these logs can be cleared by writing in the proper reset_history attribute.
|
||||
``/sys/kernel/debug/i2c/i2c-[X]/[X]-addr/``
|
||||
contains the following attributes:
|
||||
|
||||
======================= ==========================================
|
||||
============================== ==========================================================
|
||||
power1_failed_fault_log Set to 1 by a power1 fault occurring.
|
||||
power1_good_input_fault_log Set to 1 by a power1 good input fault occurring at PGIO3.
|
||||
in11_fet_short_fault_log Set to 1 when a FET-short fault occurs.
|
||||
@@ -264,4 +264,4 @@ in11_fet_bad_fault_log Set to 1 when a FET-BAD fault occurs.
|
||||
in0_lcrit_fault_log Set to 1 by a VIN undervoltage fault occurring.
|
||||
in0_crit_fault_log Set to 1 by a VIN overvoltage fault occurring.
|
||||
curr1_crit_fault_log Set to 1 by an overcurrent fault occurring.
|
||||
======================= ==========================================
|
||||
============================== ==========================================================
|
||||
|
||||
@@ -281,7 +281,7 @@ Global Temperature
|
||||
:Description: Global die temperature sense register.
|
||||
:Type: Integer (read-only)
|
||||
:Range: 0 to 255
|
||||
:Conversion: (value × 0.5 °C) − 50 °C
|
||||
:Conversion: value × 2.19 K; subtract 273.15 for °C
|
||||
:Register: 0x75
|
||||
|
||||
CHx Temperature Range
|
||||
@@ -289,10 +289,11 @@ CHx Temperature Range
|
||||
|
||||
:Description: Per-channel coarse temperature range indicator (x = 1, 2, 3, 4).
|
||||
:Type: Integer (read-only)
|
||||
:Range: 0 to 3
|
||||
:Mapping: 0 = <80 °C, 1 = 80–100 °C, 2 = 100–120 °C, 3 = >120 °C
|
||||
:Register: 0xBB bits [7:6] (CH1), bits [5:4] (CH2),
|
||||
0xBC bits [3:2] (CH3), bits [1:0] (CH4)
|
||||
:Range: 0 to 7
|
||||
:Mapping: 0 = <95 °C, 1 = 95–110 °C, 2 = 110–125 °C, 3 = 125–135 °C,
|
||||
4 = 135–145 °C, 5 = 145–155 °C, 6 = 155–165 °C, 7 = >165 °C
|
||||
:Register: 0xBB bits [2:0] (CH1), bits [5:3] (CH2),
|
||||
0xBC bits [2:0] (CH3), bits [5:3] (CH4)
|
||||
|
||||
Load Diagnostics
|
||||
================
|
||||
|
||||
+29
-16
@@ -6636,7 +6636,7 @@ F: tools/testing/selftests/cgroup/test_cpuset_v1_base.sh
|
||||
CONTROL GROUP - DEVICE MEMORY CONTROLLER (DMEM)
|
||||
M: Maarten Lankhorst <dev@lankhorst.se>
|
||||
M: Maxime Ripard <mripard@kernel.org>
|
||||
M: Natalie Vock <natalie.vock@gmx.de>
|
||||
M: Natalie Vock <nat@pixelcluster.dev>
|
||||
L: cgroups@vger.kernel.org
|
||||
L: dri-devel@lists.freedesktop.org
|
||||
S: Maintained
|
||||
@@ -8120,6 +8120,12 @@ T: git https://gitlab.freedesktop.org/drm/misc/kernel.git
|
||||
F: Documentation/devicetree/bindings/display/ilitek,ili9486.yaml
|
||||
F: drivers/gpu/drm/tiny/ili9486.c
|
||||
|
||||
DRM DRIVER FOR ILITEK ILI9488 PANELS
|
||||
M: Igor Reznichenko <igor@reznichenko.net>
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/display/panel/ilitek,ili9488.yaml
|
||||
F: drivers/gpu/drm/panel/panel-ilitek-ili9488.c
|
||||
|
||||
DRM DRIVER FOR ILITEK ILI9805 PANELS
|
||||
M: Michael Trimarchi <michael@amarulasolutions.com>
|
||||
S: Maintained
|
||||
@@ -8852,11 +8858,14 @@ M: Sandy Huang <hjc@rock-chips.com>
|
||||
M: Heiko Stübner <heiko@sntech.de>
|
||||
M: Andy Yan <andy.yan@rock-chips.com>
|
||||
L: dri-devel@lists.freedesktop.org
|
||||
L: linux-rockchip@lists.infradead.org
|
||||
S: Maintained
|
||||
T: git https://gitlab.freedesktop.org/drm/misc/kernel.git
|
||||
F: Documentation/devicetree/bindings/display/rockchip/
|
||||
F: drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.*
|
||||
F: drivers/gpu/drm/ci/xfails/rockchip*
|
||||
F: drivers/gpu/drm/rockchip/
|
||||
F: include/drm/bridge/dw_hdmi_qp.h
|
||||
|
||||
DRM DRIVERS FOR STI
|
||||
M: Alain Volmat <alain.volmat@foss.st.com>
|
||||
@@ -12664,12 +12673,15 @@ S: Orphan
|
||||
F: drivers/media/rc/img-ir/
|
||||
|
||||
IMGTEC POWERVR DRM DRIVER
|
||||
M: Frank Binns <frank.binns@imgtec.com>
|
||||
M: Matt Coster <matt.coster@imgtec.com>
|
||||
M: Alessio Belle <alessio.belle@imgtec.com>
|
||||
M: Luigi Santivetti <luigi.santivetti@imgtec.com>
|
||||
L: imagination@lists.freedesktop.org
|
||||
S: Supported
|
||||
Q: https://patchwork.freedesktop.org/project/imagination/list/
|
||||
B: https://gitlab.freedesktop.org/imagination/linux/-/issues
|
||||
C: irc://irc.oftc.net/powervr
|
||||
T: git https://gitlab.freedesktop.org/drm/misc/kernel.git
|
||||
F: Documentation/devicetree/bindings/gpu/img,powervr-rogue.yaml
|
||||
F: Documentation/devicetree/bindings/gpu/img,powervr-sgx.yaml
|
||||
F: Documentation/devicetree/bindings/gpu/img,powervr-*.yaml
|
||||
F: Documentation/gpu/imagination/
|
||||
F: drivers/gpu/drm/ci/xfails/powervr*
|
||||
F: drivers/gpu/drm/imagination/
|
||||
@@ -15738,8 +15750,8 @@ F: drivers/net/ethernet/marvell/octeon_ep_vf
|
||||
MARVELL OCTEONTX2 PHYSICAL FUNCTION DRIVER
|
||||
M: Sunil Goutham <sgoutham@marvell.com>
|
||||
M: Geetha sowjanya <gakula@marvell.com>
|
||||
M: Ratheesh Kannoth <rkannoth@marvell.com>
|
||||
M: Subbaraya Sundeep <sbhatta@marvell.com>
|
||||
M: hariprasad <hkelam@marvell.com>
|
||||
M: Bharat Bhushan <bbhushan2@marvell.com>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
@@ -15748,9 +15760,8 @@ F: include/linux/soc/marvell/octeontx2/
|
||||
|
||||
MARVELL OCTEONTX2 RVU ADMIN FUNCTION DRIVER
|
||||
M: Sunil Goutham <sgoutham@marvell.com>
|
||||
M: Linu Cherian <lcherian@marvell.com>
|
||||
M: Ratheesh Kannoth <rkannoth@marvell.com>
|
||||
M: Geetha sowjanya <gakula@marvell.com>
|
||||
M: hariprasad <hkelam@marvell.com>
|
||||
M: Subbaraya Sundeep <sbhatta@marvell.com>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
@@ -15758,8 +15769,8 @@ F: Documentation/networking/device_drivers/ethernet/marvell/octeontx2.rst
|
||||
F: drivers/net/ethernet/marvell/octeontx2/af/
|
||||
|
||||
MARVELL PEM PMU DRIVER
|
||||
M: Linu Cherian <lcherian@marvell.com>
|
||||
M: Gowthami Thiagarajan <gthiagarajan@marvell.com>
|
||||
M: Geetha sowjanya <gakula@marvell.com>
|
||||
S: Supported
|
||||
F: drivers/perf/marvell_pem_pmu.c
|
||||
|
||||
@@ -18442,6 +18453,7 @@ F: drivers/net/ethernet/mucse/
|
||||
|
||||
MULTIFUNCTION DEVICES (MFD)
|
||||
M: Lee Jones <lee@kernel.org>
|
||||
L: mfd@lists.linux.dev
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd.git
|
||||
F: Documentation/devicetree/bindings/mfd/
|
||||
@@ -25377,6 +25389,7 @@ M: Bard Liao <yung-chuan.liao@linux.intel.com>
|
||||
M: Daniel Baluta <daniel.baluta@nxp.com>
|
||||
R: Kai Vehmanen <kai.vehmanen@linux.intel.com>
|
||||
R: Pierre-Louis Bossart <pierre-louis.bossart@linux.dev>
|
||||
R: Vijendar Mukunda <Vijendar.Mukunda@amd.com>
|
||||
L: sound-open-firmware@alsa-project.org (moderated for non-subscribers)
|
||||
S: Supported
|
||||
W: https://github.com/thesofproject/linux/
|
||||
@@ -27520,7 +27533,7 @@ F: drivers/net/ethernet/dec/tulip/
|
||||
|
||||
TUN/TAP DRIVER
|
||||
M: Willem de Bruijn <willemdebruijn.kernel@gmail.com>
|
||||
M: Jason Wang <jasowang@redhat.com>
|
||||
M: Jason Wang <jasowangio@gmail.com>
|
||||
S: Maintained
|
||||
W: http://vtun.sourceforge.net/tun
|
||||
F: Documentation/networking/tuntap.rst
|
||||
@@ -28512,7 +28525,7 @@ F: include/uapi/linux/virtio_balloon.h
|
||||
|
||||
VIRTIO BLOCK AND SCSI DRIVERS
|
||||
M: "Michael S. Tsirkin" <mst@redhat.com>
|
||||
M: Jason Wang <jasowang@redhat.com>
|
||||
M: Jason Wang <jasowangio@gmail.com>
|
||||
R: Paolo Bonzini <pbonzini@redhat.com>
|
||||
R: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
R: Eugenio Pérez <eperezma@redhat.com>
|
||||
@@ -28541,7 +28554,7 @@ F: include/uapi/linux/virtio_console.h
|
||||
|
||||
VIRTIO CORE
|
||||
M: "Michael S. Tsirkin" <mst@redhat.com>
|
||||
M: Jason Wang <jasowang@redhat.com>
|
||||
M: Jason Wang <jasowangio@gmail.com>
|
||||
R: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
|
||||
R: Eugenio Pérez <eperezma@redhat.com>
|
||||
L: virtualization@lists.linux.dev
|
||||
@@ -28619,7 +28632,7 @@ F: include/uapi/linux/virtio_gpu.h
|
||||
|
||||
VIRTIO HOST (VHOST)
|
||||
M: "Michael S. Tsirkin" <mst@redhat.com>
|
||||
M: Jason Wang <jasowang@redhat.com>
|
||||
M: Jason Wang <jasowangio@gmail.com>
|
||||
R: Eugenio Pérez <eperezma@redhat.com>
|
||||
L: kvm@vger.kernel.org
|
||||
L: virtualization@lists.linux.dev
|
||||
@@ -28634,7 +28647,7 @@ F: kernel/vhost_task.c
|
||||
|
||||
VIRTIO HOST (VHOST-SCSI)
|
||||
M: "Michael S. Tsirkin" <mst@redhat.com>
|
||||
M: Jason Wang <jasowang@redhat.com>
|
||||
M: Jason Wang <jasowangio@gmail.com>
|
||||
M: Mike Christie <michael.christie@oracle.com>
|
||||
R: Paolo Bonzini <pbonzini@redhat.com>
|
||||
R: Stefan Hajnoczi <stefanha@redhat.com>
|
||||
@@ -28674,7 +28687,7 @@ F: include/uapi/linux/virtio_mem.h
|
||||
|
||||
VIRTIO NET DRIVER
|
||||
M: "Michael S. Tsirkin" <mst@redhat.com>
|
||||
M: Jason Wang <jasowang@redhat.com>
|
||||
M: Jason Wang <jasowangio@gmail.com>
|
||||
R: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
|
||||
R: Eugenio Pérez <eperezma@redhat.com>
|
||||
L: netdev@vger.kernel.org
|
||||
@@ -28725,7 +28738,7 @@ F: include/linux/vbox_utils.h
|
||||
F: include/uapi/linux/vbox*.h
|
||||
|
||||
VIRTUAL BOX SHARED FOLDER VFS DRIVER
|
||||
M: Hans de Goede <hansg@kernel.org>
|
||||
M: Jori Koolstra <jkoolstra@xs4all.nl>
|
||||
L: linux-fsdevel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: fs/vboxsf/*
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
VERSION = 7
|
||||
PATCHLEVEL = 2
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc1
|
||||
EXTRAVERSION = -rc2
|
||||
NAME = Baby Opossum Posse
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
||||
@@ -12,7 +12,6 @@
|
||||
#include <linux/irqdomain.h>
|
||||
#include <linux/clocksource.h>
|
||||
#include <linux/clockchips.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
|
||||
#include <asm/setup.h>
|
||||
#include <asm/mach/arch.h>
|
||||
|
||||
@@ -2177,7 +2177,7 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_verifier_env *env, struct bpf_pr
|
||||
image_size = extable_offset + extable_size;
|
||||
ro_header = bpf_jit_binary_pack_alloc(image_size, &ro_image_ptr,
|
||||
sizeof(u64), &header, &image_ptr,
|
||||
jit_fill_hole);
|
||||
jit_fill_hole, was_classic);
|
||||
if (!ro_header)
|
||||
goto out_off;
|
||||
|
||||
@@ -2870,7 +2870,7 @@ int arch_bpf_trampoline_size(const struct btf_func_model *m, u32 flags,
|
||||
|
||||
void *arch_alloc_bpf_trampoline(unsigned int size)
|
||||
{
|
||||
return bpf_prog_pack_alloc(size, jit_fill_hole);
|
||||
return bpf_prog_pack_alloc(size, jit_fill_hole, false);
|
||||
}
|
||||
|
||||
void arch_free_bpf_trampoline(void *image, unsigned int size)
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
|
||||
#include <linux/err.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/kvm_host.h>
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/cpufeature.h>
|
||||
|
||||
@@ -1790,7 +1790,7 @@ static int invoke_bpf(struct jit_ctx *ctx, struct bpf_tramp_nodes *tn,
|
||||
|
||||
void *arch_alloc_bpf_trampoline(unsigned int size)
|
||||
{
|
||||
return bpf_prog_pack_alloc(size, jit_fill_hole);
|
||||
return bpf_prog_pack_alloc(size, jit_fill_hole, false);
|
||||
}
|
||||
|
||||
void arch_free_bpf_trampoline(void *image, unsigned int size)
|
||||
@@ -2256,7 +2256,8 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_verifier_env *env, struct bpf_pr
|
||||
image_size = prog_size + extable_size;
|
||||
/* Now we know the size of the structure to make */
|
||||
ro_header = bpf_jit_binary_pack_alloc(image_size, &ro_image_ptr, sizeof(u32),
|
||||
&header, &image_ptr, jit_fill_hole);
|
||||
&header, &image_ptr, jit_fill_hole,
|
||||
bpf_prog_was_classic(prog));
|
||||
if (!ro_header)
|
||||
goto out_offset;
|
||||
|
||||
|
||||
@@ -86,7 +86,7 @@ CONFIG_DMA_JZ4780=y
|
||||
# CONFIG_INGENIC_TIMER is not set
|
||||
CONFIG_INGENIC_SYSOST=y
|
||||
# CONFIG_IOMMU_SUPPORT is not set
|
||||
CONFIG_JZ4770_PHY=y
|
||||
CONFIG_PHY_INGENIC_USB=y
|
||||
CONFIG_EXT4_FS=y
|
||||
# CONFIG_DNOTIFY is not set
|
||||
CONFIG_AUTOFS_FS=y
|
||||
|
||||
@@ -89,7 +89,7 @@ CONFIG_DMA_JZ4780=y
|
||||
# CONFIG_INGENIC_TIMER is not set
|
||||
CONFIG_INGENIC_SYSOST=y
|
||||
# CONFIG_IOMMU_SUPPORT is not set
|
||||
CONFIG_JZ4770_PHY=y
|
||||
CONFIG_PHY_INGENIC_USB=y
|
||||
CONFIG_EXT4_FS=y
|
||||
# CONFIG_DNOTIFY is not set
|
||||
CONFIG_AUTOFS_FS=y
|
||||
|
||||
@@ -99,7 +99,7 @@ CONFIG_USB_MUSB_HDRC=y
|
||||
CONFIG_USB_MUSB_GADGET=y
|
||||
CONFIG_USB_MUSB_JZ4740=y
|
||||
CONFIG_USB_INVENTRA_DMA=y
|
||||
CONFIG_JZ4770_PHY=y
|
||||
CONFIG_PHY_INGENIC_USB=y
|
||||
CONFIG_USB_GADGET=y
|
||||
CONFIG_USB_GADGET_VBUS_DRAW=500
|
||||
CONFIG_USB_ETH=y
|
||||
|
||||
@@ -38,6 +38,10 @@ static struct platform_device dec_rtc_device = {
|
||||
.num_resources = ARRAY_SIZE(dec_rtc_resources),
|
||||
};
|
||||
|
||||
static struct platform_device *dec_rtc_devices[] __initdata = {
|
||||
&dec_rtc_device,
|
||||
};
|
||||
|
||||
static struct resource dec_dz_resources[] = {
|
||||
{ .name = "dz", .flags = IORESOURCE_MEM, },
|
||||
{ .name = "dz", .flags = IORESOURCE_IRQ, },
|
||||
@@ -137,7 +141,7 @@ static int __init dec_add_devices(void)
|
||||
}
|
||||
num_zs = i;
|
||||
|
||||
ret1 = platform_device_register(&dec_rtc_device);
|
||||
ret1 = platform_add_devices(dec_rtc_devices, 1);
|
||||
ret2 = IS_ENABLED(CONFIG_32BIT) ?
|
||||
platform_add_devices(dec_dz_devices, num_dz) : 0;
|
||||
ret3 = platform_add_devices(dec_zs_devices, num_zs);
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
#define __ASM_CDMM_H
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/device-id/mips_cdmm.h>
|
||||
|
||||
/**
|
||||
* struct mips_cdmm_device - Represents a single device on a CDMM bus.
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
|
||||
#ifndef _ASM_MIPS_IRQ_WORK_H
|
||||
#define _ASM_MIPS_IRQ_WORK_H
|
||||
static inline bool arch_irq_work_has_interrupt(void)
|
||||
{
|
||||
return IS_ENABLED(CONFIG_MACH_LOONGSON64) && IS_ENABLED(CONFIG_SMP);
|
||||
}
|
||||
#endif /* _ASM_MIPS_IRQ_WORK_H */
|
||||
@@ -50,6 +50,8 @@ extern int __cpu_logical_map[NR_CPUS];
|
||||
#define SMP_CALL_FUNCTION 0x2
|
||||
/* Octeon - Tell another core to flush its icache */
|
||||
#define SMP_ICACHE_FLUSH 0x4
|
||||
/* Loongson64 - Self IPI for IRQ work */
|
||||
#define SMP_IRQ_WORK 0x8
|
||||
|
||||
/* Mask of CPUs which are currently definitely operating coherently */
|
||||
extern cpumask_t cpu_coherent_mask;
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
*/
|
||||
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <lantiq_soc.h>
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/of_irq.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
#include <linux/err.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/gpio/consumer.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
|
||||
|
||||
@@ -381,6 +381,13 @@ loongson3_send_ipi_mask(const struct cpumask *mask, unsigned int action)
|
||||
ipi_write_action(cpu_logical_map(i), (u32)action);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_IRQ_WORK
|
||||
void arch_irq_work_raise(void)
|
||||
{
|
||||
loongson3_send_ipi_single(smp_processor_id(), SMP_IRQ_WORK);
|
||||
}
|
||||
#endif
|
||||
|
||||
static irqreturn_t loongson3_ipi_interrupt(int irq, void *dev_id)
|
||||
{
|
||||
int cpu = smp_processor_id();
|
||||
@@ -397,6 +404,9 @@ static irqreturn_t loongson3_ipi_interrupt(int irq, void *dev_id)
|
||||
irq_exit();
|
||||
}
|
||||
|
||||
if (action & SMP_IRQ_WORK)
|
||||
irq_work_run();
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
|
||||
+3
-2
@@ -426,10 +426,11 @@ static inline void __init highmem_init(void)
|
||||
unsigned long tmp;
|
||||
|
||||
/*
|
||||
* If CPU cannot support HIGHMEM discard the memory above highstart_pfn
|
||||
* If CPU cannot support HIGHMEM discard any memory above highstart_pfn
|
||||
*/
|
||||
if (cpu_has_dc_aliases) {
|
||||
memblock_remove(PFN_PHYS(highstart_pfn), -1);
|
||||
if (highstart_pfn)
|
||||
memblock_remove(PFN_PHYS(highstart_pfn), -1);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
#include <linux/pci.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <asm/mach-ralink/rt288x.h>
|
||||
|
||||
@@ -12,7 +12,6 @@
|
||||
#include <linux/err.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
|
||||
#include <asm/isa-rev.h>
|
||||
|
||||
#include <linux/build-salt.h>
|
||||
#include <linux/elfnote.h>
|
||||
#include <linux/version.h>
|
||||
|
||||
@@ -15,6 +16,8 @@ ELFNOTE_START(Linux, 0, "a")
|
||||
.long LINUX_VERSION_CODE
|
||||
ELFNOTE_END
|
||||
|
||||
BUILD_SALT
|
||||
|
||||
/*
|
||||
* The .MIPS.abiflags section must be defined with the FP ABI flags set
|
||||
* to 'any' to be able to link with both old and new libraries.
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#ifndef _PARISC_HARDWARE_H
|
||||
#define _PARISC_HARDWARE_H
|
||||
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/device-id/parisc.h>
|
||||
|
||||
#define HWTYPE_ANY_ID PA_HWTYPE_ANY_ID
|
||||
#define HVERSION_ANY_ID PA_HVERSION_ANY_ID
|
||||
@@ -95,8 +95,6 @@ struct bc_module {
|
||||
#define HPHW_MC 15
|
||||
#define HPHW_FAULTY 31
|
||||
|
||||
struct parisc_device_id;
|
||||
|
||||
/* hardware.c: */
|
||||
extern const char *parisc_hardware_description(struct parisc_device_id *id);
|
||||
extern enum cpu_type parisc_get_cpu_type(unsigned long hversion);
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
#define _ASM_PARISC_PARISC_DEVICE_H_
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/device-id/parisc.h>
|
||||
|
||||
struct parisc_device {
|
||||
struct resource hpa; /* Hard Physical Address */
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
|
||||
#include <asm/assembly.h>
|
||||
#include <uapi/asm/ptrace.h>
|
||||
#include <linux/compiler.h>
|
||||
|
||||
#define task_regs(task) ((struct pt_regs *) ((char *)(task) + TASK_REGS))
|
||||
|
||||
|
||||
@@ -295,7 +295,7 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_verifier_env *env, struct bpf_pr
|
||||
alloclen = proglen + FUNCTION_DESCR_SIZE + fixup_len + extable_len;
|
||||
|
||||
fhdr = bpf_jit_binary_pack_alloc(alloclen, &fimage, 4, &hdr, &image,
|
||||
bpf_jit_fill_ill_insns);
|
||||
bpf_jit_fill_ill_insns, bpf_prog_was_classic(fp));
|
||||
if (!fhdr)
|
||||
goto out_err;
|
||||
|
||||
@@ -588,7 +588,7 @@ bool bpf_jit_inlines_helper_call(s32 imm)
|
||||
|
||||
void *arch_alloc_bpf_trampoline(unsigned int size)
|
||||
{
|
||||
return bpf_prog_pack_alloc(size, bpf_jit_fill_ill_insns);
|
||||
return bpf_prog_pack_alloc(size, bpf_jit_fill_ill_insns, false);
|
||||
}
|
||||
|
||||
void arch_free_bpf_trampoline(void *image, unsigned int size)
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/mutex.h>
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <asm/reg.h>
|
||||
#include <asm/synch.h>
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
#include <linux/sched.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
#include <asm/fsl_lbc.h>
|
||||
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
#include <linux/export.h>
|
||||
#include <linux/suspend.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
|
||||
+2
-1
@@ -454,7 +454,8 @@ config NR_CPUS
|
||||
range 2 32 if RISCV_SBI_V01 && 32BIT
|
||||
range 2 64 if RISCV_SBI_V01 && 64BIT
|
||||
default "32" if 32BIT
|
||||
default "64" if 64BIT
|
||||
default "64" if RISCV_SBI_V01 && 64BIT
|
||||
default "256" if !RISCV_SBI_V01 && 64BIT
|
||||
|
||||
config HOTPLUG_CPU
|
||||
bool "Support for hot-pluggable CPUs"
|
||||
|
||||
@@ -501,8 +501,8 @@ void asm_offsets(void)
|
||||
OFFSET(SBI_HART_BOOT_STACK_PTR_OFFSET, sbi_hart_boot_data, stack_ptr);
|
||||
|
||||
DEFINE(STACKFRAME_SIZE_ON_STACK, ALIGN(sizeof(struct stackframe), STACK_ALIGN));
|
||||
OFFSET(STACKFRAME_FP, stackframe, fp);
|
||||
OFFSET(STACKFRAME_RA, stackframe, ra);
|
||||
DEFINE(STACKFRAME_FP, offsetof(struct stackframe, fp) - sizeof(struct stackframe));
|
||||
DEFINE(STACKFRAME_RA, offsetof(struct stackframe, ra) - sizeof(struct stackframe));
|
||||
#ifdef CONFIG_FUNCTION_TRACER
|
||||
DEFINE(FTRACE_OPS_FUNC, offsetof(struct ftrace_ops, func));
|
||||
#ifdef CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS
|
||||
|
||||
@@ -386,8 +386,8 @@ SYM_CODE_END(ret_from_fork_user_asm)
|
||||
SYM_FUNC_START(call_on_irq_stack)
|
||||
/* Create a frame record to save ra and s0 (fp) */
|
||||
addi sp, sp, -STACKFRAME_SIZE_ON_STACK
|
||||
REG_S ra, STACKFRAME_RA(sp)
|
||||
REG_S s0, STACKFRAME_FP(sp)
|
||||
REG_S ra, (STACKFRAME_SIZE_ON_STACK + STACKFRAME_RA)(sp)
|
||||
REG_S s0, (STACKFRAME_SIZE_ON_STACK + STACKFRAME_FP)(sp)
|
||||
addi s0, sp, STACKFRAME_SIZE_ON_STACK
|
||||
|
||||
/* Switch to the per-CPU shadow call stack */
|
||||
@@ -405,8 +405,8 @@ SYM_FUNC_START(call_on_irq_stack)
|
||||
|
||||
/* Switch back to the thread stack and restore ra and s0 */
|
||||
addi sp, s0, -STACKFRAME_SIZE_ON_STACK
|
||||
REG_L ra, STACKFRAME_RA(sp)
|
||||
REG_L s0, STACKFRAME_FP(sp)
|
||||
REG_L ra, (STACKFRAME_SIZE_ON_STACK + STACKFRAME_RA)(sp)
|
||||
REG_L s0, (STACKFRAME_SIZE_ON_STACK + STACKFRAME_FP)(sp)
|
||||
addi sp, sp, STACKFRAME_SIZE_ON_STACK
|
||||
|
||||
ret
|
||||
|
||||
@@ -41,6 +41,9 @@
|
||||
REG_S x29, PT_T4(sp)
|
||||
REG_S x30, PT_T5(sp)
|
||||
REG_S x31, PT_T6(sp)
|
||||
/* save original sp */
|
||||
addi a0, sp, PT_SIZE_ON_STACK
|
||||
REG_S a0, PT_SP(sp)
|
||||
.endm
|
||||
|
||||
.macro restore_all_base_regs
|
||||
|
||||
@@ -189,13 +189,12 @@ int arch_cpuhp_kick_ap_alive(unsigned int cpu, struct task_struct *tidle)
|
||||
#else
|
||||
int __cpu_up(unsigned int cpu, struct task_struct *tidle)
|
||||
{
|
||||
int ret = 0;
|
||||
int ret;
|
||||
tidle->thread_info.cpu = cpu;
|
||||
|
||||
ret = start_secondary_cpu(cpu, tidle);
|
||||
if (!ret) {
|
||||
wait_for_completion_timeout(&cpu_running,
|
||||
msecs_to_jiffies(1000));
|
||||
wait_for_completion_timeout(&cpu_running, secs_to_jiffies(1));
|
||||
|
||||
if (!cpu_online(cpu)) {
|
||||
pr_crit("CPU%u: failed to come online\n", cpu);
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
* Here we can supply some information useful to userland.
|
||||
*/
|
||||
|
||||
#include <linux/build-salt.h>
|
||||
#include <linux/elfnote.h>
|
||||
#include <linux/version.h>
|
||||
#include <asm/assembler.h>
|
||||
@@ -12,4 +13,6 @@ ELFNOTE_START(Linux, 0, "a")
|
||||
.long LINUX_VERSION_CODE
|
||||
ELFNOTE_END
|
||||
|
||||
BUILD_SALT
|
||||
|
||||
emit_riscv_feature_1_and
|
||||
|
||||
@@ -1321,7 +1321,7 @@ int arch_bpf_trampoline_size(const struct btf_func_model *m, u32 flags,
|
||||
|
||||
void *arch_alloc_bpf_trampoline(unsigned int size)
|
||||
{
|
||||
return bpf_prog_pack_alloc(size, bpf_fill_ill_insns);
|
||||
return bpf_prog_pack_alloc(size, bpf_fill_ill_insns, false);
|
||||
}
|
||||
|
||||
void arch_free_bpf_trampoline(void *image, unsigned int size)
|
||||
|
||||
@@ -109,7 +109,8 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_verifier_env *env, struct bpf_pr
|
||||
bpf_jit_binary_pack_alloc(prog_size + extable_size,
|
||||
&jit_data->ro_image, sizeof(u32),
|
||||
&jit_data->header, &jit_data->image,
|
||||
bpf_fill_ill_insns);
|
||||
bpf_fill_ill_insns,
|
||||
bpf_prog_was_classic(prog));
|
||||
if (!jit_data->ro_header)
|
||||
goto out_offset;
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
#define _S390_CCWDEV_H_
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/device-id/ccw.h>
|
||||
#include <asm/chsc.h>
|
||||
#include <asm/fcx.h>
|
||||
#include <asm/irq.h>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
#include <asm/platform_early.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/device-id/platform.h>
|
||||
#include <linux/pm.h>
|
||||
|
||||
static __initdata LIST_HEAD(sh_early_platform_driver_list);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/device-id/of.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
/* This is a dummy device table linked into all of the crypto
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/irq.h>
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/irq.h>
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
#include <linux/string.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/of.h>
|
||||
|
||||
@@ -38,11 +38,8 @@
|
||||
/*
|
||||
* Declare drivers belonging to specific x86 CPUs
|
||||
* Similar in spirit to pci_device_id and related PCI functions
|
||||
*
|
||||
* The wildcard initializers are in mod_devicetable.h because
|
||||
* file2alias needs them. Sigh.
|
||||
*/
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/device-id/x86_cpu.h>
|
||||
/* Get the INTEL_FAM* model defines */
|
||||
#include <asm/intel-family.h>
|
||||
/* And the X86_VENDOR_* ones */
|
||||
|
||||
@@ -388,6 +388,10 @@ extern void srso_alias_return_thunk(void);
|
||||
extern void entry_untrain_ret(void);
|
||||
extern void write_ibpb(void);
|
||||
|
||||
#ifdef CONFIG_BPF_JIT
|
||||
extern void bpf_arch_ibpb(void);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
extern void clear_bhb_loop(void);
|
||||
#endif
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
#include <linux/sched/smt.h>
|
||||
#include <linux/pgtable.h>
|
||||
#include <linux/bpf.h>
|
||||
#include <linux/filter.h>
|
||||
#include <linux/kvm_types.h>
|
||||
|
||||
#include <asm/spec-ctrl.h>
|
||||
@@ -1651,8 +1652,21 @@ static inline const char *spectre_v2_module_string(void)
|
||||
{
|
||||
return spectre_v2_bad_module ? " - vulnerable module loaded" : "";
|
||||
}
|
||||
|
||||
/*
|
||||
* The "retpoline sequence" is the "call;mov;ret" sequence that
|
||||
* replaces normal indirect branch instructions. Differentiate
|
||||
* *the* retpoline sequence from the LFENCE-prefixed indirect
|
||||
* branches that simply use the retpoline infrastructure.
|
||||
*/
|
||||
static inline bool retpoline_seq_enabled(void)
|
||||
{
|
||||
return boot_cpu_has(X86_FEATURE_RETPOLINE) && !boot_cpu_has(X86_FEATURE_RETPOLINE_LFENCE);
|
||||
}
|
||||
|
||||
#else
|
||||
static inline const char *spectre_v2_module_string(void) { return ""; }
|
||||
static inline bool retpoline_seq_enabled(void) { return false; }
|
||||
#endif
|
||||
|
||||
#define SPECTRE_V2_LFENCE_MSG "WARNING: LFENCE mitigation is not recommended for this CPU, data leaks possible!\n"
|
||||
@@ -2095,8 +2109,7 @@ static void __init bhi_apply_mitigation(void)
|
||||
return;
|
||||
|
||||
/* Retpoline mitigates against BHI unless the CPU has RRSBA behavior */
|
||||
if (boot_cpu_has(X86_FEATURE_RETPOLINE) &&
|
||||
!boot_cpu_has(X86_FEATURE_RETPOLINE_LFENCE)) {
|
||||
if (retpoline_seq_enabled()) {
|
||||
spec_ctrl_disable_kernel_rrsba();
|
||||
if (rrsba_disabled)
|
||||
return;
|
||||
@@ -2238,6 +2251,27 @@ static void __init spectre_v2_update_mitigation(void)
|
||||
pr_info("%s\n", spectre_v2_strings[spectre_v2_enabled]);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BPF_JIT
|
||||
static void __bpf_arch_ibpb(void *unused)
|
||||
{
|
||||
write_ibpb();
|
||||
}
|
||||
|
||||
void bpf_arch_ibpb(void)
|
||||
{
|
||||
on_each_cpu(__bpf_arch_ibpb, NULL, 1);
|
||||
}
|
||||
|
||||
static bool __init cpu_wants_ibpb_bpf(void)
|
||||
{
|
||||
/* A genuine retpoline already neutralizes ring0 indirect predictions */
|
||||
if (retpoline_seq_enabled())
|
||||
return false;
|
||||
|
||||
return boot_cpu_has(X86_FEATURE_IBPB);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void __init spectre_v2_apply_mitigation(void)
|
||||
{
|
||||
if (spectre_v2_enabled == SPECTRE_V2_EIBRS && unprivileged_ebpf_enabled())
|
||||
@@ -2314,6 +2348,14 @@ static void __init spectre_v2_apply_mitigation(void)
|
||||
setup_force_cpu_cap(X86_FEATURE_USE_IBRS_FW);
|
||||
pr_info("Enabling Restricted Speculation for firmware calls\n");
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BPF_JIT
|
||||
if (cpu_wants_ibpb_bpf()) {
|
||||
static_call_update(bpf_arch_pred_flush, bpf_arch_ibpb);
|
||||
static_branch_enable(&bpf_pred_flush_enabled);
|
||||
pr_info("Enabling IBPB for BPF\n");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static void update_stibp_msr(void * __unused)
|
||||
@@ -3490,9 +3532,7 @@ static const char *spectre_bhi_state(void)
|
||||
return "; BHI: BHI_DIS_S";
|
||||
else if (boot_cpu_has(X86_FEATURE_CLEAR_BHB_LOOP))
|
||||
return "; BHI: SW loop, KVM: SW loop";
|
||||
else if (boot_cpu_has(X86_FEATURE_RETPOLINE) &&
|
||||
!boot_cpu_has(X86_FEATURE_RETPOLINE_LFENCE) &&
|
||||
rrsba_disabled)
|
||||
else if (retpoline_seq_enabled() && rrsba_disabled)
|
||||
return "; BHI: Retpoline";
|
||||
else if (boot_cpu_has(X86_FEATURE_CLEAR_BHB_VMEXIT))
|
||||
return "; BHI: Vulnerable, KVM: SW loop";
|
||||
|
||||
@@ -259,6 +259,11 @@ int resctrl_arch_rmid_read(struct rdt_resource *r, struct rdt_domain_hdr *hdr,
|
||||
if (!domain_header_is_valid(hdr, RESCTRL_MON_DOMAIN, RDT_RESOURCE_L3))
|
||||
return -EINVAL;
|
||||
|
||||
if (cpumask_empty(&hdr->cpu_mask)) {
|
||||
pr_warn_once("Domain %d has no CPUs\n", hdr->id);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
d = container_of(hdr, struct rdt_l3_mon_domain, hdr);
|
||||
hw_dom = resctrl_to_arch_mon_dom(d);
|
||||
cpu = cpumask_any(&hdr->cpu_mask);
|
||||
|
||||
@@ -761,9 +761,9 @@ void arch_uprobe_clear_state(struct mm_struct *mm)
|
||||
destroy_uprobe_trampoline(tramp);
|
||||
}
|
||||
|
||||
static bool __in_uprobe_trampoline(unsigned long ip)
|
||||
static bool __in_uprobe_trampoline(struct mm_struct *mm, unsigned long ip)
|
||||
{
|
||||
struct vm_area_struct *vma = vma_lookup(current->mm, ip);
|
||||
struct vm_area_struct *vma = vma_lookup(mm, ip);
|
||||
|
||||
return vma && vma_is_special_mapping(vma, &tramp_mapping);
|
||||
}
|
||||
@@ -776,14 +776,14 @@ static bool in_uprobe_trampoline(unsigned long ip)
|
||||
|
||||
rcu_read_lock();
|
||||
if (mmap_lock_speculate_try_begin(mm, &seq)) {
|
||||
found = __in_uprobe_trampoline(ip);
|
||||
found = __in_uprobe_trampoline(mm, ip);
|
||||
retry = mmap_lock_speculate_retry(mm, seq);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
if (retry) {
|
||||
mmap_read_lock(mm);
|
||||
found = __in_uprobe_trampoline(ip);
|
||||
found = __in_uprobe_trampoline(mm, ip);
|
||||
mmap_read_unlock(mm);
|
||||
}
|
||||
return found;
|
||||
@@ -1044,7 +1044,7 @@ static int copy_from_vaddr(struct mm_struct *mm, unsigned long vaddr, void *dst,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool __is_optimized(uprobe_opcode_t *insn, unsigned long vaddr)
|
||||
static bool __is_optimized(struct mm_struct *mm, uprobe_opcode_t *insn, unsigned long vaddr)
|
||||
{
|
||||
struct __packed __arch_relative_insn {
|
||||
u8 op;
|
||||
@@ -1053,7 +1053,7 @@ static bool __is_optimized(uprobe_opcode_t *insn, unsigned long vaddr)
|
||||
|
||||
if (!is_call_insn(insn))
|
||||
return false;
|
||||
return __in_uprobe_trampoline(vaddr + 5 + call->raddr);
|
||||
return __in_uprobe_trampoline(mm, vaddr + 5 + call->raddr);
|
||||
}
|
||||
|
||||
static int is_optimized(struct mm_struct *mm, unsigned long vaddr)
|
||||
@@ -1064,7 +1064,7 @@ static int is_optimized(struct mm_struct *mm, unsigned long vaddr)
|
||||
err = copy_from_vaddr(mm, vaddr, &insn, 5);
|
||||
if (err)
|
||||
return err;
|
||||
return __is_optimized((uprobe_opcode_t *)&insn, vaddr);
|
||||
return __is_optimized(mm, (uprobe_opcode_t *)&insn, vaddr);
|
||||
}
|
||||
|
||||
static bool should_optimize(struct arch_uprobe *auprobe)
|
||||
@@ -1246,9 +1246,15 @@ static int default_post_xol_op(struct arch_uprobe *auprobe, struct pt_regs *regs
|
||||
long correction = utask->vaddr - utask->xol_vaddr;
|
||||
regs->ip += correction;
|
||||
} else if (auprobe->defparam.fixups & UPROBE_FIX_CALL) {
|
||||
unsigned long retaddr = utask->vaddr + auprobe->defparam.ilen;
|
||||
int err;
|
||||
|
||||
regs->sp += sizeof_long(regs); /* Pop incorrect return address */
|
||||
if (emulate_push_stack(regs, utask->vaddr + auprobe->defparam.ilen))
|
||||
if (emulate_push_stack(regs, retaddr))
|
||||
return -ERESTART;
|
||||
err = shstk_update_last_frame(retaddr);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
/* popf; tell the caller to not touch TF */
|
||||
if (auprobe->defparam.fixups & UPROBE_FIX_SETF)
|
||||
@@ -1338,6 +1344,10 @@ static bool branch_emulate_op(struct arch_uprobe *auprobe, struct pt_regs *regs)
|
||||
*/
|
||||
if (emulate_push_stack(regs, new_ip))
|
||||
return false;
|
||||
if (shstk_push(new_ip) == -EFAULT) {
|
||||
regs->sp += sizeof_long(regs);
|
||||
return false;
|
||||
}
|
||||
} else if (!check_jmp_cond(auprobe, regs)) {
|
||||
offs = 0;
|
||||
}
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
#include "pmu.h"
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/highmem.h>
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
#include <linux/kvm_host.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/moduleparam.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/objtool.h>
|
||||
#include <linux/sched.h>
|
||||
|
||||
@@ -3653,7 +3653,7 @@ cleanup:
|
||||
|
||||
void *arch_alloc_bpf_trampoline(unsigned int size)
|
||||
{
|
||||
return bpf_prog_pack_alloc(size, jit_fill_hole);
|
||||
return bpf_prog_pack_alloc(size, jit_fill_hole, false);
|
||||
}
|
||||
|
||||
void arch_free_bpf_trampoline(void *image, unsigned int size)
|
||||
@@ -3965,7 +3965,8 @@ out_image:
|
||||
/* allocate module memory for x86 insns and extable */
|
||||
header = bpf_jit_binary_pack_alloc(roundup(proglen, align) + extable_size,
|
||||
&image, align, &rw_header, &rw_image,
|
||||
jit_fill_hole);
|
||||
jit_fill_hole,
|
||||
bpf_prog_was_classic(prog));
|
||||
if (!header)
|
||||
goto out_addrs;
|
||||
prog->aux->extable = (void *) image + roundup(proglen, align);
|
||||
|
||||
@@ -2291,18 +2291,19 @@ static void xen_remap_exchanged_ptes(unsigned long vaddr, int order,
|
||||
}
|
||||
|
||||
/*
|
||||
* Perform the hypercall to exchange a region of our pfns to point to
|
||||
* memory with the required contiguous alignment. Takes the pfns as
|
||||
* input, and populates mfns as output.
|
||||
* Perform the hypercall to exchange a region of our pages to point to memory
|
||||
* with the required contiguous alignment. Takes as input the mfns to trade
|
||||
* in (mfns_in) and the pfns where the new pages are to appear (fns_inout),
|
||||
* and populates mfns as output (fns_inout).
|
||||
*
|
||||
* Returns a success code indicating whether the hypervisor was able to
|
||||
* satisfy the request or not.
|
||||
*/
|
||||
static int xen_exchange_memory(unsigned long extents_in, unsigned int order_in,
|
||||
unsigned long *pfns_in,
|
||||
unsigned long *mfns_in,
|
||||
unsigned long extents_out,
|
||||
unsigned int order_out,
|
||||
unsigned long *mfns_out,
|
||||
unsigned long *fns_inout,
|
||||
unsigned int address_bits)
|
||||
{
|
||||
long rc;
|
||||
@@ -2312,13 +2313,13 @@ static int xen_exchange_memory(unsigned long extents_in, unsigned int order_in,
|
||||
.in = {
|
||||
.nr_extents = extents_in,
|
||||
.extent_order = order_in,
|
||||
.extent_start = pfns_in,
|
||||
.extent_start = mfns_in,
|
||||
.domid = DOMID_SELF
|
||||
},
|
||||
.out = {
|
||||
.nr_extents = extents_out,
|
||||
.extent_order = order_out,
|
||||
.extent_start = mfns_out,
|
||||
.extent_start = fns_inout,
|
||||
.address_bits = address_bits,
|
||||
.domid = DOMID_SELF
|
||||
}
|
||||
|
||||
@@ -59,6 +59,18 @@ static bool aie2_tdr_detect(struct amdxdna_dev *xdna)
|
||||
return false;
|
||||
}
|
||||
|
||||
static void aie2_cmd_release(struct kref *ref)
|
||||
{
|
||||
struct amdxdna_drv_cmd *drv_cmd = container_of(ref, struct amdxdna_drv_cmd, refcnt);
|
||||
|
||||
kfree(drv_cmd);
|
||||
}
|
||||
|
||||
static void aie2_cmd_put(struct amdxdna_drv_cmd *drv_cmd)
|
||||
{
|
||||
kref_put(&drv_cmd->refcnt, aie2_cmd_release);
|
||||
}
|
||||
|
||||
static void aie2_job_release(struct kref *ref)
|
||||
{
|
||||
struct amdxdna_sched_job *job;
|
||||
@@ -70,6 +82,8 @@ static void aie2_job_release(struct kref *ref)
|
||||
wake_up(&job->hwctx->priv->job_free_wq);
|
||||
if (job->out_fence)
|
||||
dma_fence_put(job->out_fence);
|
||||
if (job->drv_cmd)
|
||||
aie2_cmd_put(job->drv_cmd);
|
||||
kfree(job->aie2_job_health);
|
||||
kfree(job);
|
||||
}
|
||||
@@ -901,7 +915,7 @@ static int aie2_hwctx_cfg_debug_bo(struct amdxdna_hwctx *hwctx, u32 bo_hdl,
|
||||
{
|
||||
struct amdxdna_client *client = hwctx->client;
|
||||
struct amdxdna_dev *xdna = client->xdna;
|
||||
struct amdxdna_drv_cmd cmd = { 0 };
|
||||
struct amdxdna_drv_cmd *cmd;
|
||||
struct amdxdna_gem_obj *abo;
|
||||
u64 seq;
|
||||
int ret;
|
||||
@@ -912,32 +926,39 @@ static int aie2_hwctx_cfg_debug_bo(struct amdxdna_hwctx *hwctx, u32 bo_hdl,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
cmd = kzalloc_obj(*cmd);
|
||||
if (!cmd) {
|
||||
ret = -ENOMEM;
|
||||
goto put_obj;
|
||||
}
|
||||
kref_init(&cmd->refcnt);
|
||||
|
||||
if (attach) {
|
||||
if (abo->assigned_hwctx != AMDXDNA_INVALID_CTX_HANDLE) {
|
||||
ret = -EBUSY;
|
||||
goto put_obj;
|
||||
goto put_cmd;
|
||||
}
|
||||
cmd.opcode = ATTACH_DEBUG_BO;
|
||||
cmd->opcode = ATTACH_DEBUG_BO;
|
||||
} else {
|
||||
if (abo->assigned_hwctx != hwctx->id) {
|
||||
ret = -EINVAL;
|
||||
goto put_obj;
|
||||
goto put_cmd;
|
||||
}
|
||||
cmd.opcode = DETACH_DEBUG_BO;
|
||||
cmd->opcode = DETACH_DEBUG_BO;
|
||||
}
|
||||
|
||||
ret = amdxdna_cmd_submit(client, &cmd, AMDXDNA_INVALID_BO_HANDLE,
|
||||
ret = amdxdna_cmd_submit(client, cmd, AMDXDNA_INVALID_BO_HANDLE,
|
||||
&bo_hdl, 1, hwctx->id, &seq);
|
||||
if (ret) {
|
||||
XDNA_ERR(xdna, "Submit command failed");
|
||||
goto put_obj;
|
||||
goto put_cmd;
|
||||
}
|
||||
|
||||
aie2_cmd_wait(hwctx, seq);
|
||||
if (cmd.result) {
|
||||
XDNA_ERR(xdna, "Response failure 0x%x", cmd.result);
|
||||
if (cmd->result) {
|
||||
XDNA_ERR(xdna, "Response failure 0x%x", cmd->result);
|
||||
ret = -EINVAL;
|
||||
goto put_obj;
|
||||
goto put_cmd;
|
||||
}
|
||||
|
||||
if (attach)
|
||||
@@ -947,6 +968,8 @@ static int aie2_hwctx_cfg_debug_bo(struct amdxdna_hwctx *hwctx, u32 bo_hdl,
|
||||
|
||||
XDNA_DBG(xdna, "Config debug BO %d to %s", bo_hdl, hwctx->name);
|
||||
|
||||
put_cmd:
|
||||
aie2_cmd_put(cmd);
|
||||
put_obj:
|
||||
amdxdna_gem_put_obj(abo);
|
||||
return ret;
|
||||
@@ -974,25 +997,32 @@ int aie2_hwctx_sync_debug_bo(struct amdxdna_hwctx *hwctx, u32 debug_bo_hdl)
|
||||
{
|
||||
struct amdxdna_client *client = hwctx->client;
|
||||
struct amdxdna_dev *xdna = client->xdna;
|
||||
struct amdxdna_drv_cmd cmd = { 0 };
|
||||
struct amdxdna_drv_cmd *cmd;
|
||||
u64 seq;
|
||||
int ret;
|
||||
|
||||
cmd.opcode = SYNC_DEBUG_BO;
|
||||
ret = amdxdna_cmd_submit(client, &cmd, AMDXDNA_INVALID_BO_HANDLE,
|
||||
cmd = kzalloc_obj(*cmd);
|
||||
if (!cmd)
|
||||
return -ENOMEM;
|
||||
kref_init(&cmd->refcnt);
|
||||
|
||||
cmd->opcode = SYNC_DEBUG_BO;
|
||||
ret = amdxdna_cmd_submit(client, cmd, AMDXDNA_INVALID_BO_HANDLE,
|
||||
&debug_bo_hdl, 1, hwctx->id, &seq);
|
||||
if (ret) {
|
||||
XDNA_ERR(xdna, "Submit command failed");
|
||||
return ret;
|
||||
goto put_cmd;
|
||||
}
|
||||
|
||||
aie2_cmd_wait(hwctx, seq);
|
||||
if (cmd.result) {
|
||||
XDNA_ERR(xdna, "Response failure 0x%x", cmd.result);
|
||||
return -EINVAL;
|
||||
if (cmd->result) {
|
||||
XDNA_ERR(xdna, "Response failure 0x%x", cmd->result);
|
||||
ret = -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
put_cmd:
|
||||
aie2_cmd_put(cmd);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int aie2_populate_range(struct amdxdna_gem_obj *abo)
|
||||
@@ -1142,6 +1172,8 @@ retry:
|
||||
dma_resv_add_fence(job->bos[i]->resv, job->out_fence, DMA_RESV_USAGE_WRITE);
|
||||
job->seq = hwctx->priv->seq++;
|
||||
kref_get(&job->refcnt);
|
||||
if (job->drv_cmd)
|
||||
kref_get(&job->drv_cmd->refcnt);
|
||||
drm_sched_entity_push_job(&job->base);
|
||||
|
||||
*seq = job->seq;
|
||||
|
||||
@@ -132,6 +132,7 @@ enum amdxdna_job_opcode {
|
||||
struct amdxdna_drv_cmd {
|
||||
enum amdxdna_job_opcode opcode;
|
||||
u32 result;
|
||||
struct kref refcnt;
|
||||
};
|
||||
|
||||
struct app_health_report;
|
||||
|
||||
@@ -731,9 +731,15 @@ static int amdxdna_gem_dev_obj_vmap(struct drm_gem_object *obj, struct iosys_map
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct dma_buf *amdxdna_gem_dev_obj_export(struct drm_gem_object *gobj, int flags)
|
||||
{
|
||||
return ERR_PTR(-EOPNOTSUPP);
|
||||
}
|
||||
|
||||
static const struct drm_gem_object_funcs amdxdna_gem_dev_obj_funcs = {
|
||||
.free = amdxdna_gem_dev_obj_free,
|
||||
.vmap = amdxdna_gem_dev_obj_vmap,
|
||||
.export = amdxdna_gem_dev_obj_export,
|
||||
};
|
||||
|
||||
static const struct drm_gem_object_funcs amdxdna_gem_shmem_funcs = {
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
*/
|
||||
|
||||
#include <drm/amdxdna_accel.h>
|
||||
#include <drm/drm_managed.h>
|
||||
#include <linux/iommu.h>
|
||||
#include <linux/iova.h>
|
||||
|
||||
@@ -153,10 +154,30 @@ void amdxdna_iommu_free(struct amdxdna_dev *xdna, size_t size,
|
||||
free_pages((unsigned long)cpu_addr, get_order(size));
|
||||
}
|
||||
|
||||
static void amdxdna_cleanup_force_iova(struct drm_device *dev, void *res)
|
||||
{
|
||||
struct amdxdna_dev *xdna = to_xdna_dev(dev);
|
||||
|
||||
if (xdna->domain) {
|
||||
iommu_detach_group(xdna->domain, xdna->group);
|
||||
put_iova_domain(&xdna->iovad);
|
||||
iova_cache_put();
|
||||
iommu_domain_free(xdna->domain);
|
||||
}
|
||||
|
||||
iommu_group_put(xdna->group);
|
||||
}
|
||||
|
||||
void amdxdna_iommu_fini(struct amdxdna_dev *xdna)
|
||||
{
|
||||
if (xdna->group && !xdna->domain)
|
||||
iommu_group_put(xdna->group);
|
||||
}
|
||||
|
||||
int amdxdna_iommu_init(struct amdxdna_dev *xdna)
|
||||
{
|
||||
unsigned long order;
|
||||
int ret;
|
||||
int ret = 0;
|
||||
|
||||
xdna->group = iommu_group_get(xdna->ddev.dev);
|
||||
if (!xdna->group || !force_iova)
|
||||
@@ -182,8 +203,14 @@ int amdxdna_iommu_init(struct amdxdna_dev *xdna)
|
||||
if (ret)
|
||||
goto put_iova;
|
||||
|
||||
ret = drmm_add_action(&xdna->ddev, amdxdna_cleanup_force_iova, NULL);
|
||||
if (ret)
|
||||
goto detach_group;
|
||||
|
||||
return 0;
|
||||
|
||||
detach_group:
|
||||
iommu_detach_group(xdna->domain, xdna->group);
|
||||
put_iova:
|
||||
put_iova_domain(&xdna->iovad);
|
||||
iova_cache_put();
|
||||
@@ -191,20 +218,8 @@ free_domain:
|
||||
iommu_domain_free(xdna->domain);
|
||||
put_group:
|
||||
iommu_group_put(xdna->group);
|
||||
xdna->group = NULL;
|
||||
xdna->domain = NULL;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void amdxdna_iommu_fini(struct amdxdna_dev *xdna)
|
||||
{
|
||||
if (xdna->domain) {
|
||||
iommu_detach_group(xdna->domain, xdna->group);
|
||||
put_iova_domain(&xdna->iovad);
|
||||
iova_cache_put();
|
||||
iommu_domain_free(xdna->domain);
|
||||
}
|
||||
|
||||
if (xdna->group)
|
||||
iommu_group_put(xdna->group);
|
||||
}
|
||||
|
||||
@@ -138,9 +138,11 @@ static int amdxdna_drm_open(struct drm_device *ddev, struct drm_file *filp)
|
||||
xdna->dev_info->dev_heap_max_size);
|
||||
mutex_init(&client->mm_lock);
|
||||
|
||||
mutex_lock(&xdna->client_lock);
|
||||
mutex_lock(&xdna->dev_lock);
|
||||
list_add_tail(&client->node, &xdna->client_list);
|
||||
mutex_unlock(&xdna->dev_lock);
|
||||
mutex_unlock(&xdna->client_lock);
|
||||
|
||||
filp->driver_priv = client;
|
||||
client->filp = filp;
|
||||
@@ -174,18 +176,14 @@ static void amdxdna_drm_close(struct drm_device *ddev, struct drm_file *filp)
|
||||
{
|
||||
struct amdxdna_client *client = filp->driver_priv;
|
||||
struct amdxdna_dev *xdna = to_xdna_dev(ddev);
|
||||
int idx;
|
||||
|
||||
XDNA_DBG(xdna, "closing pid %d", client->pid);
|
||||
|
||||
if (!drm_dev_enter(&xdna->ddev, &idx))
|
||||
return;
|
||||
|
||||
mutex_lock(&xdna->client_lock);
|
||||
mutex_lock(&xdna->dev_lock);
|
||||
amdxdna_client_cleanup(client);
|
||||
mutex_unlock(&xdna->dev_lock);
|
||||
|
||||
drm_dev_exit(idx);
|
||||
mutex_unlock(&xdna->client_lock);
|
||||
}
|
||||
|
||||
static int amdxdna_drm_get_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
|
||||
@@ -371,6 +369,10 @@ static int amdxdna_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
if (!xdna->dev_info)
|
||||
return -ENODEV;
|
||||
|
||||
ret = drmm_mutex_init(ddev, &xdna->client_lock);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
drmm_mutex_init(ddev, &xdna->dev_lock);
|
||||
init_rwsem(&xdna->notifier_lock);
|
||||
INIT_LIST_HEAD(&xdna->client_list);
|
||||
@@ -390,9 +392,9 @@ static int amdxdna_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
xdna->notifier_wq = alloc_ordered_workqueue("notifier_wq", WQ_MEM_RECLAIM);
|
||||
if (!xdna->notifier_wq) {
|
||||
ret = -ENOMEM;
|
||||
xdna->notifier_wq = drmm_alloc_ordered_workqueue(ddev, "notifier_wq", WQ_MEM_RECLAIM);
|
||||
if (IS_ERR(xdna->notifier_wq)) {
|
||||
ret = PTR_ERR(xdna->notifier_wq);
|
||||
goto iommu_fini;
|
||||
}
|
||||
|
||||
@@ -401,7 +403,7 @@ static int amdxdna_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
mutex_unlock(&xdna->dev_lock);
|
||||
if (ret) {
|
||||
XDNA_ERR(xdna, "Hardware init failed, ret %d", ret);
|
||||
goto destroy_notifier_wq;
|
||||
goto iommu_fini;
|
||||
}
|
||||
|
||||
ret = amdxdna_sysfs_init(xdna);
|
||||
@@ -425,8 +427,6 @@ failed_dev_fini:
|
||||
mutex_lock(&xdna->dev_lock);
|
||||
xdna->dev_info->ops->fini(xdna);
|
||||
mutex_unlock(&xdna->dev_lock);
|
||||
destroy_notifier_wq:
|
||||
destroy_workqueue(xdna->notifier_wq);
|
||||
iommu_fini:
|
||||
amdxdna_iommu_fini(xdna);
|
||||
return ret;
|
||||
@@ -437,23 +437,19 @@ static void amdxdna_remove(struct pci_dev *pdev)
|
||||
struct amdxdna_dev *xdna = pci_get_drvdata(pdev);
|
||||
struct amdxdna_client *client;
|
||||
|
||||
destroy_workqueue(xdna->notifier_wq);
|
||||
|
||||
drm_dev_unplug(&xdna->ddev);
|
||||
amdxdna_sysfs_fini(xdna);
|
||||
|
||||
mutex_lock(&xdna->client_lock);
|
||||
mutex_lock(&xdna->dev_lock);
|
||||
client = list_first_entry_or_null(&xdna->client_list,
|
||||
struct amdxdna_client, node);
|
||||
while (client) {
|
||||
amdxdna_client_cleanup(client);
|
||||
|
||||
client = list_first_entry_or_null(&xdna->client_list,
|
||||
struct amdxdna_client, node);
|
||||
list_for_each_entry(client, &xdna->client_list, node) {
|
||||
amdxdna_hwctx_remove_all(client);
|
||||
amdxdna_sva_fini(client);
|
||||
}
|
||||
|
||||
xdna->dev_info->ops->fini(xdna);
|
||||
mutex_unlock(&xdna->dev_lock);
|
||||
mutex_unlock(&xdna->client_lock);
|
||||
|
||||
amdxdna_iommu_fini(xdna);
|
||||
}
|
||||
|
||||
@@ -120,6 +120,7 @@ struct amdxdna_dev {
|
||||
|
||||
struct mutex dev_lock; /* per device lock */
|
||||
struct list_head client_list;
|
||||
struct mutex client_lock; /* client_list */
|
||||
struct amdxdna_fw_ver fw_ver;
|
||||
struct rw_semaphore notifier_lock; /* for mmu notifier*/
|
||||
struct workqueue_struct *notifier_wq;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
|
||||
obj-$(CONFIG_DRM_ACCEL_ARM_ETHOSU) := ethosu.o
|
||||
ethosu-y += ethosu_drv.o ethosu_gem.o ethosu_job.o
|
||||
ethosu-y += ethosu_drv.o ethosu_gem.o ethosu_job.o ethosu_perfmon.o
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
|
||||
#include <linux/bitfield.h>
|
||||
#include <linux/bits.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#include <drm/drm_device.h>
|
||||
@@ -43,6 +44,15 @@ struct gen_pool;
|
||||
#define NPU_REG_BASEP_HI(x) (0x0084 + (x) * 8)
|
||||
#define NPU_BASEP_REGION_MAX 8
|
||||
|
||||
#define NPU_REG_PMCR 0x0180
|
||||
#define NPU_REG_PMCNTENSET 0x0184
|
||||
#define NPU_REG_PMCNTENCLR 0x0188
|
||||
#define NPU_REG_PMCCNTR_LO 0x01A0
|
||||
#define NPU_REG_PMCCNTR_HI 0x01A4
|
||||
#define NPU_REG_PMCCNTR_CFG 0x01A8
|
||||
#define NPU_REG_PMU_EVCNTR(x) (0x0300 + (x) * 4)
|
||||
#define NPU_REG_PMU_EVTYPER(x) (0x0380 + (x) * 4)
|
||||
|
||||
#define ID_ARCH_MAJOR_MASK GENMASK(31, 28)
|
||||
#define ID_ARCH_MINOR_MASK GENMASK(27, 20)
|
||||
#define ID_ARCH_PATCH_MASK GENMASK(19, 16)
|
||||
@@ -67,6 +77,15 @@ struct gen_pool;
|
||||
|
||||
#define PROT_ACTIVE_CSL BIT(1)
|
||||
|
||||
#define PMCR_NUM_EVENT_CNT_MASK GENMASK(15, 11)
|
||||
#define PMCR_CYCLE_CNT_RST BIT(2)
|
||||
#define PMCR_EVENT_CNT_RST BIT(1)
|
||||
#define PMCR_CNT_EN BIT(0)
|
||||
|
||||
#define PMU_EV_TYPE_NONE 0
|
||||
#define PMU_EV_TYPE_CYCLES 0x11
|
||||
#define PMU_EV_TYPE_IDLE 0x20
|
||||
|
||||
enum ethosu_cmds {
|
||||
NPU_OP_CONV = 0x2,
|
||||
NPU_OP_DEPTHWISE = 0x3,
|
||||
@@ -152,6 +171,8 @@ enum ethosu_cmds {
|
||||
|
||||
#define ETHOSU_SRAM_REGION 2 /* Matching Vela compiler */
|
||||
|
||||
struct ethosu_perfmon;
|
||||
|
||||
/**
|
||||
* struct ethosu_device - Ethosu device
|
||||
*/
|
||||
@@ -161,6 +182,7 @@ struct ethosu_device {
|
||||
|
||||
/** @iomem: CPU mapping of the registers. */
|
||||
void __iomem *regs;
|
||||
void __iomem *pmu_regs;
|
||||
|
||||
void __iomem *sram;
|
||||
struct gen_pool *srampool;
|
||||
@@ -173,8 +195,6 @@ struct ethosu_device {
|
||||
struct drm_ethosu_npu_info npu_info;
|
||||
|
||||
struct ethosu_job *in_flight_job;
|
||||
/* For in_flight_job and ethosu_job_hw_submit() */
|
||||
struct mutex job_lock;
|
||||
|
||||
/* For dma_fence */
|
||||
spinlock_t fence_lock;
|
||||
@@ -184,6 +204,17 @@ struct ethosu_device {
|
||||
struct mutex sched_lock;
|
||||
u64 fence_context;
|
||||
u64 emit_seqno;
|
||||
|
||||
/* Tracks the performance monitor state. */
|
||||
struct {
|
||||
/* Protects @active. */
|
||||
struct mutex lock;
|
||||
|
||||
/* Perfmon currently programmed in HW (or NULL if none). */
|
||||
struct ethosu_perfmon *active;
|
||||
} perfmon_state;
|
||||
|
||||
struct ethosu_perfmon *global_perfmon;
|
||||
};
|
||||
|
||||
#define to_ethosu_device(drm_dev) \
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
#include <linux/io.h>
|
||||
#include <linux/iopoll.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
|
||||
@@ -16,6 +15,7 @@
|
||||
#include <drm/drm_utils.h>
|
||||
#include <drm/drm_gem.h>
|
||||
#include <drm/drm_accel.h>
|
||||
#include <drm/drm_managed.h>
|
||||
#include <drm/ethosu_accel.h>
|
||||
|
||||
#include "ethosu_drv.h"
|
||||
@@ -155,6 +155,7 @@ static int ethosu_open(struct drm_device *ddev, struct drm_file *file)
|
||||
if (ret)
|
||||
goto err_put_mod;
|
||||
|
||||
ethosu_perfmon_open_file(priv);
|
||||
file->driver_priv = no_free_ptr(priv);
|
||||
return 0;
|
||||
|
||||
@@ -166,6 +167,7 @@ err_put_mod:
|
||||
static void ethosu_postclose(struct drm_device *ddev, struct drm_file *file)
|
||||
{
|
||||
ethosu_job_close(file->driver_priv);
|
||||
ethosu_perfmon_close_file(file->driver_priv);
|
||||
kfree(file->driver_priv);
|
||||
module_put(THIS_MODULE);
|
||||
}
|
||||
@@ -180,6 +182,10 @@ static const struct drm_ioctl_desc ethosu_drm_driver_ioctls[] = {
|
||||
ETHOSU_IOCTL(BO_MMAP_OFFSET, bo_mmap_offset, 0),
|
||||
ETHOSU_IOCTL(CMDSTREAM_BO_CREATE, cmdstream_bo_create, 0),
|
||||
ETHOSU_IOCTL(SUBMIT, submit, 0),
|
||||
ETHOSU_IOCTL(PERFMON_CREATE, perfmon_create, 0),
|
||||
ETHOSU_IOCTL(PERFMON_DESTROY, perfmon_destroy, 0),
|
||||
ETHOSU_IOCTL(PERFMON_GET_VALUES, perfmon_get_values, 0),
|
||||
ETHOSU_IOCTL(PERFMON_SET_GLOBAL, perfmon_set_global, 0),
|
||||
};
|
||||
|
||||
DEFINE_DRM_ACCEL_FOPS(ethosu_drm_driver_fops);
|
||||
@@ -315,8 +321,14 @@ static int ethosu_init(struct ethosu_device *ethosudev)
|
||||
|
||||
ethosu_sram_init(ethosudev);
|
||||
|
||||
if (!ethosu_is_u65(ethosudev))
|
||||
ethosudev->pmu_regs += 0x1000;
|
||||
|
||||
ethosudev->npu_info.pmu_counters = FIELD_GET(PMCR_NUM_EVENT_CNT_MASK,
|
||||
readl_relaxed(ethosudev->pmu_regs + NPU_REG_PMCR));
|
||||
|
||||
dev_info(ethosudev->base.dev,
|
||||
"Ethos-U NPU, arch v%ld.%ld.%ld, rev r%ldp%ld, cmd stream ver%ld, %d MACs, %dKB SRAM\n",
|
||||
"Ethos-U NPU, arch v%ld.%ld.%ld, rev r%ldp%ld, cmd stream ver%ld, %d MACs, %dKB SRAM, %d PMU cntrs\n",
|
||||
FIELD_GET(ID_ARCH_MAJOR_MASK, id),
|
||||
FIELD_GET(ID_ARCH_MINOR_MASK, id),
|
||||
FIELD_GET(ID_ARCH_PATCH_MASK, id),
|
||||
@@ -324,7 +336,8 @@ static int ethosu_init(struct ethosu_device *ethosudev)
|
||||
FIELD_GET(ID_VER_MINOR_MASK, id),
|
||||
FIELD_GET(CONFIG_CMD_STREAM_VER_MASK, config),
|
||||
1 << FIELD_GET(CONFIG_MACS_PER_CC_MASK, config),
|
||||
ethosudev->npu_info.sram_size / 1024);
|
||||
ethosudev->npu_info.sram_size / 1024,
|
||||
ethosudev->npu_info.pmu_counters);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -343,11 +356,16 @@ static int ethosu_probe(struct platform_device *pdev)
|
||||
dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(40));
|
||||
|
||||
ethosudev->regs = devm_platform_ioremap_resource(pdev, 0);
|
||||
ethosudev->pmu_regs = ethosudev->regs;
|
||||
|
||||
ethosudev->num_clks = devm_clk_bulk_get_all(&pdev->dev, ðosudev->clks);
|
||||
if (ethosudev->num_clks < 0)
|
||||
return ethosudev->num_clks;
|
||||
|
||||
ret = drmm_mutex_init(ðosudev->base, ðosudev->perfmon_state.lock);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = ethosu_job_init(ethosudev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -1,15 +1,74 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only OR MIT */
|
||||
/* Copyright 2025 Arm, Ltd. */
|
||||
/* Copyright 2025-2026 Arm, Ltd. */
|
||||
#ifndef __ETHOSU_DRV_H__
|
||||
#define __ETHOSU_DRV_H__
|
||||
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/xarray.h>
|
||||
#include <drm/gpu_scheduler.h>
|
||||
|
||||
struct ethosu_device;
|
||||
struct drm_device;
|
||||
struct drm_file;
|
||||
|
||||
struct ethosu_file_priv {
|
||||
struct ethosu_device *edev;
|
||||
struct drm_sched_entity sched_entity;
|
||||
struct xarray perfmons;
|
||||
};
|
||||
|
||||
/* Performance monitor object. The perfmon lifetime is controlled by userspace
|
||||
* using perfmon related ioctls. A perfmon can be attached to a DRM_ETHOSU_SUBMIT
|
||||
* request, and when this is the case, HW perf counters will be activated just
|
||||
* before the job is submitted to the NPU and disabled when the job is
|
||||
* done. This way, only events related to a specific job will be counted.
|
||||
*/
|
||||
struct ethosu_perfmon {
|
||||
/* Tracks the number of users of the perfmon, when this counter reaches
|
||||
* zero the perfmon is destroyed.
|
||||
*/
|
||||
refcount_t refcnt;
|
||||
|
||||
/* Number of counters activated in this perfmon instance
|
||||
* (should be less than or equal to DRM_ETHOSU_MAX_PERF_COUNTERS).
|
||||
*/
|
||||
u8 ncounters;
|
||||
|
||||
/* Events counted by the HW perf counters. */
|
||||
u16 counters[DRM_ETHOSU_MAX_PERF_EVENT_COUNTERS];
|
||||
|
||||
/*
|
||||
* Storage for counter values. Counters are incremented by the HW
|
||||
* perf counter values every time the perfmon is attached to an
|
||||
* NPU job. This way, perfmon users don't have to retrieve the
|
||||
* results after each job if they want to track events covering
|
||||
* several submissions. Note that counter values can't be reset,
|
||||
* but you can fake a reset by destroying the perfmon and
|
||||
* creating a new one.
|
||||
*/
|
||||
u64 values[] __counted_by(ncounters);
|
||||
};
|
||||
|
||||
/* ethosu_perfmon.c */
|
||||
void ethosu_perfmon_get(struct ethosu_perfmon *perfmon);
|
||||
void ethosu_perfmon_put(struct ethosu_perfmon *perfmon);
|
||||
void ethosu_perfmon_start(struct ethosu_device *ethosu,
|
||||
struct ethosu_perfmon *perfmon);
|
||||
void ethosu_perfmon_stop(struct ethosu_device *ethosu,
|
||||
struct ethosu_perfmon *perfmon, bool capture);
|
||||
void ethosu_perfmon_stop_locked(struct ethosu_device *ethosu, struct ethosu_perfmon *perfmon,
|
||||
bool capture);
|
||||
struct ethosu_perfmon *ethosu_perfmon_find(struct ethosu_file_priv *ethosu_priv,
|
||||
int id);
|
||||
void ethosu_perfmon_open_file(struct ethosu_file_priv *ethosu_priv);
|
||||
void ethosu_perfmon_close_file(struct ethosu_file_priv *ethosu_priv);
|
||||
int ethosu_ioctl_perfmon_create(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv);
|
||||
int ethosu_ioctl_perfmon_destroy(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv);
|
||||
int ethosu_ioctl_perfmon_get_values(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv);
|
||||
int ethosu_ioctl_perfmon_set_global(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only OR MIT
|
||||
/* Copyright 2024-2025 Tomeu Vizoso <tomeu@tomeuvizoso.net> */
|
||||
/* Copyright 2025 Arm, Ltd. */
|
||||
/* Copyright 2025-2026 Arm, Ltd. */
|
||||
|
||||
#include <linux/bitfield.h>
|
||||
#include <linux/genalloc.h>
|
||||
@@ -147,6 +147,8 @@ static void ethosu_job_err_cleanup(struct ethosu_job *job)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
ethosu_perfmon_put(job->perfmon);
|
||||
|
||||
for (i = 0; i < job->region_cnt; i++)
|
||||
drm_gem_object_put(job->region_bo[i]);
|
||||
|
||||
@@ -181,6 +183,26 @@ static void ethosu_job_free(struct drm_sched_job *sched_job)
|
||||
ethosu_job_put(job);
|
||||
}
|
||||
|
||||
static void
|
||||
ethosu_switch_perfmon(struct ethosu_device *ethosu, struct ethosu_job *job)
|
||||
{
|
||||
struct ethosu_perfmon *perfmon;
|
||||
|
||||
guard(mutex)(ðosu->perfmon_state.lock);
|
||||
|
||||
perfmon = ethosu->global_perfmon;
|
||||
if (!perfmon)
|
||||
perfmon = job->perfmon;
|
||||
|
||||
if (perfmon == ethosu->perfmon_state.active)
|
||||
return;
|
||||
|
||||
ethosu_perfmon_stop_locked(ethosu, ethosu->perfmon_state.active, true);
|
||||
|
||||
if (perfmon)
|
||||
ethosu_perfmon_start(ethosu, perfmon);
|
||||
}
|
||||
|
||||
static struct dma_fence *ethosu_job_run(struct drm_sched_job *sched_job)
|
||||
{
|
||||
struct ethosu_job *job = to_ethosu_job(sched_job);
|
||||
@@ -194,10 +216,10 @@ static struct dma_fence *ethosu_job_run(struct drm_sched_job *sched_job)
|
||||
dev->fence_context, ++dev->emit_seqno);
|
||||
dma_fence_get(fence);
|
||||
|
||||
scoped_guard(mutex, &dev->job_lock) {
|
||||
dev->in_flight_job = job;
|
||||
ethosu_job_hw_submit(dev, job);
|
||||
}
|
||||
ethosu_switch_perfmon(dev, job);
|
||||
|
||||
WRITE_ONCE(dev->in_flight_job, job);
|
||||
ethosu_job_hw_submit(dev, job);
|
||||
|
||||
return fence;
|
||||
}
|
||||
@@ -205,6 +227,7 @@ static struct dma_fence *ethosu_job_run(struct drm_sched_job *sched_job)
|
||||
static void ethosu_job_handle_irq(struct ethosu_device *dev)
|
||||
{
|
||||
u32 status = readl_relaxed(dev->regs + NPU_REG_STATUS);
|
||||
struct ethosu_job *job;
|
||||
|
||||
if (status & (STATUS_BUS_STATUS | STATUS_CMD_PARSE_ERR)) {
|
||||
dev_err(dev->base.dev, "Error IRQ - %x\n", status);
|
||||
@@ -212,11 +235,10 @@ static void ethosu_job_handle_irq(struct ethosu_device *dev)
|
||||
return;
|
||||
}
|
||||
|
||||
scoped_guard(mutex, &dev->job_lock) {
|
||||
if (dev->in_flight_job) {
|
||||
dma_fence_signal(dev->in_flight_job->done_fence);
|
||||
dev->in_flight_job = NULL;
|
||||
}
|
||||
job = READ_ONCE(dev->in_flight_job);
|
||||
if (job) {
|
||||
WRITE_ONCE(dev->in_flight_job, NULL);
|
||||
dma_fence_signal(job->done_fence);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -272,8 +294,7 @@ static enum drm_gpu_sched_stat ethosu_job_timedout(struct drm_sched_job *bad)
|
||||
|
||||
drm_sched_stop(&dev->sched, bad);
|
||||
|
||||
scoped_guard(mutex, &dev->job_lock)
|
||||
dev->in_flight_job = NULL;
|
||||
WRITE_ONCE(dev->in_flight_job, NULL);
|
||||
|
||||
/* Proceed with reset now. */
|
||||
pm_runtime_force_suspend(dev->base.dev);
|
||||
@@ -304,9 +325,6 @@ int ethosu_job_init(struct ethosu_device *edev)
|
||||
int ret;
|
||||
|
||||
spin_lock_init(&edev->fence_lock);
|
||||
ret = devm_mutex_init(dev, &edev->job_lock);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = devm_mutex_init(dev, &edev->sched_lock);
|
||||
if (ret)
|
||||
return ret;
|
||||
@@ -365,7 +383,8 @@ void ethosu_job_close(struct ethosu_file_priv *ethosu_priv)
|
||||
}
|
||||
|
||||
static int ethosu_ioctl_submit_job(struct drm_device *dev, struct drm_file *file,
|
||||
struct drm_ethosu_job *job)
|
||||
struct drm_ethosu_job *job,
|
||||
int perfmon_id)
|
||||
{
|
||||
struct ethosu_device *edev = to_ethosu_device(dev);
|
||||
struct ethosu_file_priv *file_priv = file->driver_priv;
|
||||
@@ -389,6 +408,9 @@ static int ethosu_ioctl_submit_job(struct drm_device *dev, struct drm_file *file
|
||||
ejob->dev = edev;
|
||||
ejob->sram_size = job->sram_size;
|
||||
|
||||
if (perfmon_id)
|
||||
ejob->perfmon = ethosu_perfmon_find(file_priv, perfmon_id);
|
||||
|
||||
ejob->done_fence = kzalloc_obj(*ejob->done_fence);
|
||||
if (!ejob->done_fence) {
|
||||
ret = -ENOMEM;
|
||||
@@ -491,11 +513,6 @@ int ethosu_ioctl_submit(struct drm_device *dev, void *data, struct drm_file *fil
|
||||
int ret = 0;
|
||||
unsigned int i = 0;
|
||||
|
||||
if (args->pad) {
|
||||
drm_dbg(dev, "Reserved field in drm_ethosu_submit struct should be 0.\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
struct drm_ethosu_job __free(kvfree) *jobs =
|
||||
kvmalloc_objs(*jobs, args->job_count);
|
||||
if (!jobs)
|
||||
@@ -509,7 +526,7 @@ int ethosu_ioctl_submit(struct drm_device *dev, void *data, struct drm_file *fil
|
||||
}
|
||||
|
||||
for (i = 0; i < args->job_count; i++) {
|
||||
ret = ethosu_ioctl_submit_job(dev, file, &jobs[i]);
|
||||
ret = ethosu_ioctl_submit_job(dev, file, &jobs[i], args->perfmon_id);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -21,6 +21,8 @@ struct ethosu_job {
|
||||
u8 region_cnt;
|
||||
u32 sram_size;
|
||||
|
||||
struct ethosu_perfmon *perfmon;
|
||||
|
||||
/* Fence to be signaled by drm-sched once its done with the job */
|
||||
struct dma_fence *inference_done_fence;
|
||||
|
||||
|
||||
@@ -0,0 +1,301 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only OR MIT
|
||||
/* Copyright 2026 Arm, Ltd. */
|
||||
/* Based on v3d_perfmon.c, Copyright (C) 2021 Raspberry Pi */
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/uaccess.h>
|
||||
|
||||
#include <drm/drm_file.h>
|
||||
#include <drm/drm_ioctl.h>
|
||||
|
||||
#include <uapi/drm/ethosu_accel.h>
|
||||
|
||||
#include "ethosu_drv.h"
|
||||
#include "ethosu_device.h"
|
||||
|
||||
void ethosu_perfmon_get(struct ethosu_perfmon *perfmon)
|
||||
{
|
||||
if (perfmon)
|
||||
refcount_inc(&perfmon->refcnt);
|
||||
}
|
||||
|
||||
void ethosu_perfmon_put(struct ethosu_perfmon *perfmon)
|
||||
{
|
||||
if (perfmon && refcount_dec_and_test(&perfmon->refcnt))
|
||||
kfree(perfmon);
|
||||
}
|
||||
|
||||
void ethosu_perfmon_start(struct ethosu_device *ethosu, struct ethosu_perfmon *perfmon)
|
||||
{
|
||||
unsigned int i;
|
||||
u8 ncounters;
|
||||
u32 mask;
|
||||
|
||||
lockdep_assert_held(ðosu->perfmon_state.lock);
|
||||
|
||||
if (WARN_ON_ONCE(!perfmon || ethosu->perfmon_state.active))
|
||||
return;
|
||||
|
||||
writel_relaxed(PMCR_CNT_EN, ethosu->pmu_regs + NPU_REG_PMCR);
|
||||
writel_relaxed(PMU_EV_TYPE_CYCLES, ethosu->pmu_regs + NPU_REG_PMCCNTR_CFG);
|
||||
|
||||
mask = 0x80000000;
|
||||
ncounters = perfmon->ncounters - 1;
|
||||
if (ncounters)
|
||||
mask |= GENMASK(ncounters - 1, 0);
|
||||
|
||||
for (i = 0; i < ncounters; i++)
|
||||
writel_relaxed(perfmon->counters[i], ethosu->pmu_regs + NPU_REG_PMU_EVTYPER(i));
|
||||
|
||||
writel_relaxed(mask, ethosu->pmu_regs + NPU_REG_PMCNTENSET);
|
||||
writel_relaxed(PMCR_CNT_EN | PMCR_EVENT_CNT_RST | PMCR_CYCLE_CNT_RST,
|
||||
ethosu->pmu_regs + NPU_REG_PMCR);
|
||||
ethosu->perfmon_state.active = perfmon;
|
||||
}
|
||||
|
||||
void ethosu_perfmon_stop_locked(struct ethosu_device *ethosu, struct ethosu_perfmon *perfmon,
|
||||
bool capture)
|
||||
{
|
||||
unsigned int i;
|
||||
u8 ncounters;
|
||||
u32 mask;
|
||||
|
||||
lockdep_assert_held(ðosu->perfmon_state.lock);
|
||||
|
||||
if (!perfmon || perfmon != ethosu->perfmon_state.active)
|
||||
return;
|
||||
|
||||
ncounters = perfmon->ncounters - 1;
|
||||
|
||||
if (!pm_runtime_get_if_active(ethosu->base.dev)) {
|
||||
ethosu->perfmon_state.active = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
if (capture) {
|
||||
for (i = 0; i < ncounters; i++)
|
||||
perfmon->values[i] += readl_relaxed(ethosu->pmu_regs + NPU_REG_PMU_EVCNTR(i));
|
||||
|
||||
perfmon->values[ncounters] +=
|
||||
readl_relaxed(ethosu->pmu_regs + NPU_REG_PMCCNTR_LO) |
|
||||
(u64)readl_relaxed(ethosu->pmu_regs + NPU_REG_PMCCNTR_HI) << 32;
|
||||
}
|
||||
|
||||
mask = 0x80000000;
|
||||
if (ncounters)
|
||||
mask |= GENMASK(ncounters - 1, 0);
|
||||
writel_relaxed(mask, ethosu->pmu_regs + NPU_REG_PMCNTENCLR);
|
||||
|
||||
writel_relaxed(0, ethosu->pmu_regs + NPU_REG_PMCR);
|
||||
ethosu->perfmon_state.active = NULL;
|
||||
|
||||
pm_runtime_put(ethosu->base.dev);
|
||||
}
|
||||
|
||||
void ethosu_perfmon_stop(struct ethosu_device *ethosu, struct ethosu_perfmon *perfmon,
|
||||
bool capture)
|
||||
{
|
||||
if (!perfmon)
|
||||
return;
|
||||
|
||||
guard(mutex)(ðosu->perfmon_state.lock);
|
||||
ethosu_perfmon_stop_locked(ethosu, perfmon, capture);
|
||||
}
|
||||
|
||||
struct ethosu_perfmon *ethosu_perfmon_find(struct ethosu_file_priv *ethosu_priv, int id)
|
||||
{
|
||||
struct ethosu_perfmon *perfmon;
|
||||
|
||||
xa_lock(ðosu_priv->perfmons);
|
||||
perfmon = xa_load(ðosu_priv->perfmons, id);
|
||||
ethosu_perfmon_get(perfmon);
|
||||
xa_unlock(ðosu_priv->perfmons);
|
||||
|
||||
return perfmon;
|
||||
}
|
||||
|
||||
void ethosu_perfmon_open_file(struct ethosu_file_priv *ethosu_priv)
|
||||
{
|
||||
xa_init_flags(ðosu_priv->perfmons, XA_FLAGS_ALLOC1);
|
||||
}
|
||||
|
||||
static void ethosu_perfmon_delete(struct ethosu_file_priv *ethosu_priv,
|
||||
struct ethosu_perfmon *perfmon)
|
||||
{
|
||||
struct ethosu_device *ethosu = ethosu_priv->edev;
|
||||
|
||||
/* If the active perfmon is being destroyed, stop it first */
|
||||
scoped_guard(mutex, ðosu->perfmon_state.lock) {
|
||||
/* If the global perfmon is being destroyed, set it to NULL */
|
||||
if (ethosu->global_perfmon == perfmon) {
|
||||
ethosu->global_perfmon = NULL;
|
||||
ethosu_perfmon_put(perfmon);
|
||||
}
|
||||
|
||||
ethosu_perfmon_stop_locked(ethosu, perfmon, false);
|
||||
}
|
||||
|
||||
ethosu_perfmon_put(perfmon);
|
||||
}
|
||||
|
||||
void ethosu_perfmon_close_file(struct ethosu_file_priv *ethosu_priv)
|
||||
{
|
||||
struct ethosu_perfmon *perfmon;
|
||||
unsigned long id;
|
||||
|
||||
xa_for_each(ðosu_priv->perfmons, id, perfmon)
|
||||
ethosu_perfmon_delete(ethosu_priv, perfmon);
|
||||
|
||||
xa_destroy(ðosu_priv->perfmons);
|
||||
}
|
||||
|
||||
int ethosu_ioctl_perfmon_create(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv)
|
||||
{
|
||||
struct ethosu_file_priv *ethosu_priv = file_priv->driver_priv;
|
||||
struct drm_ethosu_perfmon_create *req = data;
|
||||
struct ethosu_device *ethosu = to_ethosu_device(dev);
|
||||
struct ethosu_perfmon *perfmon;
|
||||
unsigned int i, event_max;
|
||||
int ret;
|
||||
u32 id;
|
||||
|
||||
/* Number of monitored counters cannot exceed HW limits. */
|
||||
if (req->ncounters > ethosu->npu_info.pmu_counters)
|
||||
return -EINVAL;
|
||||
|
||||
/* Make sure all counters are valid. */
|
||||
event_max = ethosu_is_u65(ethosu) ? 433 : 671;
|
||||
for (i = 0; i < req->ncounters; i++) {
|
||||
if (req->counters[i] > event_max)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Add 1 more counter for cycle counter */
|
||||
req->ncounters++;
|
||||
|
||||
perfmon = kzalloc_flex(*perfmon, values, req->ncounters);
|
||||
if (!perfmon)
|
||||
return -ENOMEM;
|
||||
|
||||
for (i = 0; i < req->ncounters - 1; i++)
|
||||
perfmon->counters[i] = req->counters[i];
|
||||
|
||||
perfmon->ncounters = req->ncounters;
|
||||
|
||||
refcount_set(&perfmon->refcnt, 1);
|
||||
|
||||
ret = xa_alloc(ðosu_priv->perfmons, &id, perfmon, xa_limit_32b,
|
||||
GFP_KERNEL);
|
||||
|
||||
if (ret < 0) {
|
||||
kfree(perfmon);
|
||||
return ret;
|
||||
}
|
||||
|
||||
req->id = id;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ethosu_ioctl_perfmon_destroy(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv)
|
||||
{
|
||||
struct ethosu_file_priv *ethosu_priv = file_priv->driver_priv;
|
||||
struct drm_ethosu_perfmon_destroy *req = data;
|
||||
struct ethosu_perfmon *perfmon;
|
||||
|
||||
perfmon = xa_erase(ðosu_priv->perfmons, req->id);
|
||||
if (!perfmon)
|
||||
return -EINVAL;
|
||||
|
||||
ethosu_perfmon_delete(ethosu_priv, perfmon);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ethosu_ioctl_perfmon_get_values(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv)
|
||||
{
|
||||
struct ethosu_device *ethosu = to_ethosu_device(dev);
|
||||
struct ethosu_file_priv *ethosu_priv = file_priv->driver_priv;
|
||||
struct drm_ethosu_perfmon_get_values *req = data;
|
||||
struct ethosu_perfmon *perfmon;
|
||||
int ret = 0;
|
||||
|
||||
if (req->pad != 0)
|
||||
return -EINVAL;
|
||||
|
||||
perfmon = ethosu_perfmon_find(ethosu_priv, req->id);
|
||||
if (!perfmon)
|
||||
return -EINVAL;
|
||||
|
||||
ret = pm_runtime_resume_and_get(dev->dev);
|
||||
if (ret) {
|
||||
ethosu_perfmon_put(perfmon);
|
||||
return ret;
|
||||
}
|
||||
ethosu_perfmon_stop(ethosu, perfmon, true);
|
||||
|
||||
pm_runtime_put_autosuspend(dev->dev);
|
||||
|
||||
if (copy_to_user(u64_to_user_ptr(req->values_ptr), perfmon->values,
|
||||
perfmon->ncounters * sizeof(u64)))
|
||||
ret = -EFAULT;
|
||||
|
||||
ethosu_perfmon_put(perfmon);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ethosu_ioctl_perfmon_set_global(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv)
|
||||
{
|
||||
struct ethosu_file_priv *ethosu_priv = file_priv->driver_priv;
|
||||
struct drm_ethosu_perfmon_set_global *req = data;
|
||||
struct ethosu_device *ethosu = to_ethosu_device(dev);
|
||||
struct ethosu_perfmon *perfmon;
|
||||
|
||||
if (req->flags & ~DRM_ETHOSU_PERFMON_CLEAR_GLOBAL)
|
||||
return -EINVAL;
|
||||
|
||||
perfmon = ethosu_perfmon_find(ethosu_priv, req->id);
|
||||
if (!perfmon)
|
||||
return -EINVAL;
|
||||
|
||||
/* If the request is to clear the global performance monitor */
|
||||
if (req->flags & DRM_ETHOSU_PERFMON_CLEAR_GLOBAL) {
|
||||
struct ethosu_perfmon *old;
|
||||
|
||||
scoped_guard(mutex, ðosu->perfmon_state.lock) {
|
||||
old = ethosu->global_perfmon;
|
||||
if (!old) {
|
||||
ethosu_perfmon_put(perfmon);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ethosu->global_perfmon = NULL;
|
||||
ethosu_perfmon_stop_locked(ethosu, old, true);
|
||||
}
|
||||
|
||||
ethosu_perfmon_put(old);
|
||||
ethosu_perfmon_put(perfmon);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
scoped_guard(mutex, ðosu->perfmon_state.lock) {
|
||||
if (ethosu->perfmon_state.active || ethosu->global_perfmon) {
|
||||
ethosu_perfmon_put(perfmon);
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
ethosu->global_perfmon = perfmon;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -307,6 +307,11 @@ static int ivpu_open(struct drm_device *dev, struct drm_file *file)
|
||||
return -ENODEV;
|
||||
|
||||
limits = ivpu_user_limits_get(vdev);
|
||||
if (IS_ERR(limits) && PTR_ERR(limits) == -EMFILE) {
|
||||
/* Context limit may be held by jobs pending deferred cleanup */
|
||||
flush_work(&vdev->job_destroy_work);
|
||||
limits = ivpu_user_limits_get(vdev);
|
||||
}
|
||||
if (IS_ERR(limits)) {
|
||||
ret = PTR_ERR(limits);
|
||||
goto err_dev_exit;
|
||||
@@ -510,9 +515,9 @@ void ivpu_prepare_for_reset(struct ivpu_device *vdev)
|
||||
{
|
||||
ivpu_hw_irq_disable(vdev);
|
||||
disable_irq(vdev->irq);
|
||||
flush_work(&vdev->irq_ipc_work);
|
||||
flush_work(&vdev->irq_dct_work);
|
||||
flush_work(&vdev->context_abort_work);
|
||||
flush_work(&vdev->job_destroy_work);
|
||||
ivpu_ipc_disable(vdev);
|
||||
ivpu_mmu_disable(vdev);
|
||||
}
|
||||
@@ -584,6 +589,11 @@ static const struct drm_driver driver = {
|
||||
.major = 1,
|
||||
};
|
||||
|
||||
static void ivpu_destroy_workqueue(void *wq)
|
||||
{
|
||||
destroy_workqueue(wq);
|
||||
}
|
||||
|
||||
static int ivpu_irq_init(struct ivpu_device *vdev)
|
||||
{
|
||||
struct pci_dev *pdev = to_pci_dev(vdev->drm.dev);
|
||||
@@ -595,16 +605,26 @@ static int ivpu_irq_init(struct ivpu_device *vdev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
INIT_WORK(&vdev->irq_ipc_work, ivpu_ipc_irq_work_fn);
|
||||
INIT_WORK(&vdev->irq_dct_work, ivpu_pm_irq_dct_work_fn);
|
||||
INIT_WORK(&vdev->context_abort_work, ivpu_context_abort_work_fn);
|
||||
init_llist_head(&vdev->job_destroy_list);
|
||||
INIT_WORK(&vdev->job_destroy_work, ivpu_job_destroy_work_fn);
|
||||
|
||||
vdev->job_destroy_wq = alloc_workqueue("ivpu_job_destroy", WQ_UNBOUND | WQ_MEM_RECLAIM, 0);
|
||||
if (!vdev->job_destroy_wq)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = devm_add_action_or_reset(vdev->drm.dev, ivpu_destroy_workqueue, vdev->job_destroy_wq);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ivpu_irq_handlers_init(vdev);
|
||||
|
||||
vdev->irq = pci_irq_vector(pdev, 0);
|
||||
|
||||
ret = devm_request_irq(vdev->drm.dev, vdev->irq, ivpu_hw_irq_handler,
|
||||
IRQF_NO_AUTOEN, DRIVER_NAME, vdev);
|
||||
ret = devm_request_threaded_irq(vdev->drm.dev, vdev->irq, ivpu_hw_irq_handler,
|
||||
ivpu_ipc_irq_thread_handler, IRQF_NO_AUTOEN,
|
||||
DRIVER_NAME, vdev);
|
||||
if (ret)
|
||||
ivpu_err(vdev, "Failed to request an IRQ %d\n", ret);
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
#include <drm/drm_print.h>
|
||||
|
||||
#include <linux/hashtable.h>
|
||||
#include <linux/llist.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/xarray.h>
|
||||
#include <uapi/drm/ivpu_accel.h>
|
||||
@@ -157,9 +158,11 @@ struct ivpu_device {
|
||||
struct xa_limit db_limit;
|
||||
u32 db_next;
|
||||
|
||||
struct work_struct irq_ipc_work;
|
||||
struct work_struct irq_dct_work;
|
||||
struct work_struct context_abort_work;
|
||||
struct llist_head job_destroy_list;
|
||||
struct work_struct job_destroy_work;
|
||||
struct workqueue_struct *job_destroy_wq;
|
||||
|
||||
struct mutex bo_list_lock; /* Protects bo_list */
|
||||
struct list_head bo_list;
|
||||
|
||||
@@ -318,7 +318,7 @@ static int ivpu_fw_parse(struct ivpu_device *vdev)
|
||||
fw->shave_nn_size = PAGE_ALIGN(fw_hdr->shave_nn_fw_size);
|
||||
fw->cold_boot_entry_point = fw_hdr->entry_point;
|
||||
|
||||
fw->trace_level = min_t(u32, ivpu_fw_log_level, IVPU_FW_LOG_FATAL);
|
||||
fw->trace_level = min(ivpu_fw_log_level, IVPU_FW_LOG_FATAL);
|
||||
fw->trace_destination_mask = VPU_TRACE_DESTINATION_VERBOSE_TRACING;
|
||||
fw->trace_hw_component_mask = -1;
|
||||
|
||||
|
||||
@@ -399,6 +399,10 @@ irqreturn_t ivpu_hw_irq_handler(int irq, void *ptr)
|
||||
return IRQ_NONE;
|
||||
|
||||
pm_runtime_mark_last_busy(vdev->drm.dev);
|
||||
|
||||
if (ip_handled)
|
||||
return IRQ_WAKE_THREAD;
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user