mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-03-22 07:27:12 +08:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Cross-merge networking fixes after downstream PR (net-6.19-rc7). Conflicts: drivers/net/ethernet/huawei/hinic3/hinic3_irq.cb35a6fd37a("hinic3: Add adaptive IRQ coalescing with DIM")fb2bb2a1eb("hinic3: Fix netif_queue_set_napi queue_index input parameter error") https://lore.kernel.org/fc0a7fdf08789a52653e8ad05281a0a849e79206.1768915707.git.zhuyikai1@h-partners.com drivers/net/wireless/ath/ath12k/mac.c drivers/net/wireless/ath/ath12k/wifi7/hw.c3170757210("wifi: ath12k: Fix wrong P2P device link id issue")c26f294fef("wifi: ath12k: Move ieee80211_ops callback to the arch specific module") https://lore.kernel.org/20260114123751.6a208818@canb.auug.org.au Adjacent changes: drivers/net/wireless/ath/ath12k/mac.c8b8d6ee53d("wifi: ath12k: Fix scan state stuck in ABORTING after cancel_remain_on_channel")914c890d3b("wifi: ath12k: Add framework for hardware specific ieee80211_ops registration") Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
5
.mailmap
5
.mailmap
@@ -12,6 +12,7 @@
|
||||
#
|
||||
Aaron Durbin <adurbin@google.com>
|
||||
Abel Vesa <abelvesa@kernel.org> <abel.vesa@nxp.com>
|
||||
Abel Vesa <abelvesa@kernel.org> <abel.vesa@linaro.org>
|
||||
Abel Vesa <abelvesa@kernel.org> <abelvesa@gmail.com>
|
||||
Abhijeet Dharmapurikar <quic_adharmap@quicinc.com> <adharmap@codeaurora.org>
|
||||
Abhinav Kumar <quic_abhinavk@quicinc.com> <abhinavk@codeaurora.org>
|
||||
@@ -207,6 +208,7 @@ Daniel Borkmann <daniel@iogearbox.net> <daniel.borkmann@tik.ee.ethz.ch>
|
||||
Daniel Borkmann <daniel@iogearbox.net> <dborkmann@redhat.com>
|
||||
Daniel Borkmann <daniel@iogearbox.net> <dborkman@redhat.com>
|
||||
Daniel Borkmann <daniel@iogearbox.net> <dxchgb@gmail.com>
|
||||
Daniel Thompson <danielt@kernel.org> <daniel.thompson@linaro.org>
|
||||
Danilo Krummrich <dakr@kernel.org> <dakr@redhat.com>
|
||||
David Brownell <david-b@pacbell.net>
|
||||
David Collins <quic_collinsd@quicinc.com> <collinsd@codeaurora.org>
|
||||
@@ -794,6 +796,7 @@ Sven Eckelmann <sven@narfation.org> <sven.eckelmann@open-mesh.com>
|
||||
Sven Eckelmann <sven@narfation.org> <sven.eckelmann@openmesh.com>
|
||||
Sven Eckelmann <sven@narfation.org> <sven@open-mesh.com>
|
||||
Sven Peter <sven@kernel.org> <sven@svenpeter.dev>
|
||||
Szymon Wilczek <swilczek.lx@gmail.com> <szymonwilczek@gmx.com>
|
||||
Takashi YOSHII <takashi.yoshii.zj@renesas.com>
|
||||
Tamizh Chelvam Raja <quic_tamizhr@quicinc.com> <tamizhr@codeaurora.org>
|
||||
Taniya Das <quic_tdas@quicinc.com> <tdas@codeaurora.org>
|
||||
@@ -876,6 +879,8 @@ Wolfram Sang <wsa@kernel.org> <wsa@the-dreams.de>
|
||||
Yakir Yang <kuankuan.y@gmail.com> <ykk@rock-chips.com>
|
||||
Yanteng Si <si.yanteng@linux.dev> <siyanteng@loongson.cn>
|
||||
Ying Huang <huang.ying.caritas@gmail.com> <ying.huang@intel.com>
|
||||
Yixun Lan <dlan@kernel.org> <dlan@gentoo.org>
|
||||
Yixun Lan <dlan@kernel.org> <yixun.lan@amlogic.com>
|
||||
Yosry Ahmed <yosry.ahmed@linux.dev> <yosryahmed@google.com>
|
||||
Yu-Chun Lin <eleanor.lin@realtek.com> <eleanor15x@gmail.com>
|
||||
Yusuke Goda <goda.yusuke@renesas.com>
|
||||
|
||||
4
CREDITS
4
CREDITS
@@ -2231,6 +2231,10 @@ S: Markham, Ontario
|
||||
S: L3R 8B2
|
||||
S: Canada
|
||||
|
||||
N: Krzysztof Kozlowski
|
||||
E: krzk@kernel.org
|
||||
D: NFC network subsystem and drivers maintainer
|
||||
|
||||
N: Christian Krafft
|
||||
D: PowerPC Cell support
|
||||
|
||||
|
||||
@@ -2917,6 +2917,41 @@ Kernel parameters
|
||||
for Movable pages. "nn[KMGTPE]", "nn%", and "mirror"
|
||||
are exclusive, so you cannot specify multiple forms.
|
||||
|
||||
kfence.burst= [MM,KFENCE] The number of additional successive
|
||||
allocations to be attempted through KFENCE for each
|
||||
sample interval.
|
||||
Format: <unsigned integer>
|
||||
Default: 0
|
||||
|
||||
kfence.check_on_panic=
|
||||
[MM,KFENCE] Whether to check all KFENCE-managed objects'
|
||||
canaries on panic.
|
||||
Format: <bool>
|
||||
Default: false
|
||||
|
||||
kfence.deferrable=
|
||||
[MM,KFENCE] Whether to use a deferrable timer to trigger
|
||||
allocations. This avoids forcing CPU wake-ups if the
|
||||
system is idle, at the risk of a less predictable
|
||||
sample interval.
|
||||
Format: <bool>
|
||||
Default: CONFIG_KFENCE_DEFERRABLE
|
||||
|
||||
kfence.sample_interval=
|
||||
[MM,KFENCE] KFENCE's sample interval in milliseconds.
|
||||
Format: <unsigned integer>
|
||||
0 - Disable KFENCE.
|
||||
>0 - Enabled KFENCE with given sample interval.
|
||||
Default: CONFIG_KFENCE_SAMPLE_INTERVAL
|
||||
|
||||
kfence.skip_covered_thresh=
|
||||
[MM,KFENCE] If pool utilization reaches this threshold
|
||||
(pool usage%), KFENCE limits currently covered
|
||||
allocations of the same source from further filling
|
||||
up the pool.
|
||||
Format: <unsigned integer>
|
||||
Default: 75
|
||||
|
||||
kgdbdbgp= [KGDB,HW,EARLY] kgdb over EHCI usb debug port.
|
||||
Format: <Controller#>[,poll interval]
|
||||
The controller # is the number of the ehci usb debug
|
||||
|
||||
@@ -494,6 +494,10 @@ memory allocations.
|
||||
|
||||
The default value depends on CONFIG_MEM_ALLOC_PROFILING_ENABLED_BY_DEFAULT.
|
||||
|
||||
When CONFIG_MEM_ALLOC_PROFILING_DEBUG=y, this control is read-only to avoid
|
||||
warnings produced by allocations made while profiling is disabled and freed
|
||||
when it's enabled.
|
||||
|
||||
|
||||
memory_failure_early_kill
|
||||
=========================
|
||||
|
||||
@@ -16,7 +16,8 @@ properties:
|
||||
- brcm,iproc-nic-i2c
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
minItems: 1
|
||||
maxItems: 2
|
||||
|
||||
clock-frequency:
|
||||
enum: [ 100000, 400000 ]
|
||||
@@ -41,8 +42,15 @@ allOf:
|
||||
contains:
|
||||
const: brcm,iproc-nic-i2c
|
||||
then:
|
||||
properties:
|
||||
reg:
|
||||
minItems: 2
|
||||
required:
|
||||
- brcm,ape-hsls-addr-mask
|
||||
else:
|
||||
properties:
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
|
||||
@@ -56,7 +56,7 @@ properties:
|
||||
|
||||
clocks:
|
||||
minItems: 5
|
||||
maxItems: 7
|
||||
maxItems: 6
|
||||
|
||||
clock-names:
|
||||
minItems: 5
|
||||
@@ -67,7 +67,6 @@ properties:
|
||||
- enum: [rchng, refgen]
|
||||
- const: pipe
|
||||
- const: pipediv2
|
||||
- const: phy_aux
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
@@ -180,6 +179,7 @@ allOf:
|
||||
contains:
|
||||
enum:
|
||||
- qcom,glymur-qmp-gen5x4-pcie-phy
|
||||
- qcom,qcs8300-qmp-gen4x2-pcie-phy
|
||||
- qcom,sa8775p-qmp-gen4x2-pcie-phy
|
||||
- qcom,sa8775p-qmp-gen4x4-pcie-phy
|
||||
- qcom,sc8280xp-qmp-gen3x1-pcie-phy
|
||||
@@ -197,19 +197,6 @@ allOf:
|
||||
clock-names:
|
||||
minItems: 6
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- qcom,qcs8300-qmp-gen4x2-pcie-phy
|
||||
then:
|
||||
properties:
|
||||
clocks:
|
||||
minItems: 7
|
||||
clock-names:
|
||||
minItems: 7
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -49,6 +49,10 @@ properties:
|
||||
items:
|
||||
- const: mclk
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
description: Headphone detect interrupt
|
||||
|
||||
port:
|
||||
$ref: audio-graph-port.yaml#
|
||||
unevaluatedProperties: false
|
||||
|
||||
@@ -47,6 +47,12 @@ properties:
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
|
||||
clock-names:
|
||||
const: mclk
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
description: The CODEC's interrupt output.
|
||||
@@ -98,6 +104,7 @@ properties:
|
||||
- 4 # Use GPIO2 for jack-detect
|
||||
- 5 # Use GPIO3 for jack-detect
|
||||
- 6 # Use GPIO4 for jack-detect
|
||||
- 7 # Use HDA header for jack-detect
|
||||
|
||||
realtek,jack-detect-not-inverted:
|
||||
description:
|
||||
@@ -121,6 +128,10 @@ properties:
|
||||
- 2 # Scale current by 1.0
|
||||
- 3 # Scale current by 1.5
|
||||
|
||||
port:
|
||||
$ref: audio-graph-port.yaml#
|
||||
unevaluatedProperties: false
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
|
||||
@@ -70,6 +70,9 @@ properties:
|
||||
"#sound-dai-cells":
|
||||
const: 0
|
||||
|
||||
port:
|
||||
$ref: /schemas/graph.yaml#/properties/port
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
|
||||
@@ -406,7 +406,6 @@ allOf:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- qcom,ipq5018-dwc3
|
||||
- qcom,ipq6018-dwc3
|
||||
- qcom,ipq8074-dwc3
|
||||
- qcom,msm8953-dwc3
|
||||
@@ -428,6 +427,7 @@ allOf:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- qcom,msm8994-dwc3
|
||||
- qcom,msm8996-dwc3
|
||||
- qcom,qcs404-dwc3
|
||||
- qcom,sdm660-dwc3
|
||||
@@ -451,6 +451,7 @@ allOf:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- qcom,ipq5018-dwc3
|
||||
- qcom,ipq5332-dwc3
|
||||
then:
|
||||
properties:
|
||||
@@ -488,7 +489,6 @@ allOf:
|
||||
enum:
|
||||
- qcom,ipq4019-dwc3
|
||||
- qcom,ipq8064-dwc3
|
||||
- qcom,msm8994-dwc3
|
||||
- qcom,qcs615-dwc3
|
||||
- qcom,qcs8300-dwc3
|
||||
- qcom,qdu1000-dwc3
|
||||
|
||||
@@ -420,7 +420,6 @@ allOf:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- qcom,ipq5018-dwc3
|
||||
- qcom,ipq6018-dwc3
|
||||
- qcom,ipq8074-dwc3
|
||||
- qcom,msm8953-dwc3
|
||||
@@ -443,6 +442,7 @@ allOf:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- qcom,msm8994-dwc3
|
||||
- qcom,msm8996-dwc3
|
||||
- qcom,qcs404-dwc3
|
||||
- qcom,sdm660-dwc3
|
||||
@@ -467,6 +467,7 @@ allOf:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- qcom,ipq5018-dwc3
|
||||
- qcom,ipq5332-dwc3
|
||||
then:
|
||||
properties:
|
||||
@@ -509,7 +510,6 @@ allOf:
|
||||
- qcom,ipq4019-dwc3
|
||||
- qcom,ipq8064-dwc3
|
||||
- qcom,kaanapali-dwc3
|
||||
- qcom,msm8994-dwc3
|
||||
- qcom,qcs615-dwc3
|
||||
- qcom,qcs8300-dwc3
|
||||
- qcom,qdu1000-dwc3
|
||||
|
||||
@@ -33,6 +33,16 @@ Boot parameter:
|
||||
sysctl:
|
||||
/proc/sys/vm/mem_profiling
|
||||
|
||||
1: Enable memory profiling.
|
||||
|
||||
0: Disable memory profiling.
|
||||
|
||||
The default value depends on CONFIG_MEM_ALLOC_PROFILING_ENABLED_BY_DEFAULT.
|
||||
|
||||
When CONFIG_MEM_ALLOC_PROFILING_DEBUG=y, this control is read-only to avoid
|
||||
warnings produced by allocations made while profiling is disabled and freed
|
||||
when it's enabled.
|
||||
|
||||
Runtime info:
|
||||
/proc/allocinfo
|
||||
|
||||
|
||||
175
Documentation/netlink/specs/dev-energymodel.yaml
Normal file
175
Documentation/netlink/specs/dev-energymodel.yaml
Normal file
@@ -0,0 +1,175 @@
|
||||
# SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
|
||||
#
|
||||
# Copyright (c) 2025 Valve Corporation.
|
||||
#
|
||||
---
|
||||
name: dev-energymodel
|
||||
|
||||
doc: |
|
||||
Energy model netlink interface to notify its changes.
|
||||
|
||||
protocol: genetlink
|
||||
|
||||
uapi-header: linux/dev_energymodel.h
|
||||
|
||||
definitions:
|
||||
-
|
||||
type: flags
|
||||
name: perf-state-flags
|
||||
entries:
|
||||
-
|
||||
name: perf-state-inefficient
|
||||
doc: >-
|
||||
The performance state is inefficient. There is in this perf-domain,
|
||||
another performance state with a higher frequency but a lower or
|
||||
equal power cost.
|
||||
-
|
||||
type: flags
|
||||
name: perf-domain-flags
|
||||
entries:
|
||||
-
|
||||
name: perf-domain-microwatts
|
||||
doc: >-
|
||||
The power values are in micro-Watts or some other scale.
|
||||
-
|
||||
name: perf-domain-skip-inefficiencies
|
||||
doc: >-
|
||||
Skip inefficient states when estimating energy consumption.
|
||||
-
|
||||
name: perf-domain-artificial
|
||||
doc: >-
|
||||
The power values are artificial and might be created by platform
|
||||
missing real power information.
|
||||
|
||||
attribute-sets:
|
||||
-
|
||||
name: perf-domain
|
||||
doc: >-
|
||||
Information on a single performance domains.
|
||||
attributes:
|
||||
-
|
||||
name: pad
|
||||
type: pad
|
||||
-
|
||||
name: perf-domain-id
|
||||
type: u32
|
||||
doc: >-
|
||||
A unique ID number for each performance domain.
|
||||
-
|
||||
name: flags
|
||||
type: u64
|
||||
doc: >-
|
||||
Bitmask of performance domain flags.
|
||||
enum: perf-domain-flags
|
||||
-
|
||||
name: cpus
|
||||
type: u64
|
||||
multi-attr: true
|
||||
doc: >-
|
||||
CPUs that belong to this performance domain.
|
||||
-
|
||||
name: perf-table
|
||||
doc: >-
|
||||
Performance states table.
|
||||
attributes:
|
||||
-
|
||||
name: perf-domain-id
|
||||
type: u32
|
||||
doc: >-
|
||||
A unique ID number for each performance domain.
|
||||
-
|
||||
name: perf-state
|
||||
type: nest
|
||||
nested-attributes: perf-state
|
||||
multi-attr: true
|
||||
-
|
||||
name: perf-state
|
||||
doc: >-
|
||||
Performance state of a performance domain.
|
||||
attributes:
|
||||
-
|
||||
name: pad
|
||||
type: pad
|
||||
-
|
||||
name: performance
|
||||
type: u64
|
||||
doc: >-
|
||||
CPU performance (capacity) at a given frequency.
|
||||
-
|
||||
name: frequency
|
||||
type: u64
|
||||
doc: >-
|
||||
The frequency in KHz, for consistency with CPUFreq.
|
||||
-
|
||||
name: power
|
||||
type: u64
|
||||
doc: >-
|
||||
The power consumed at this level (by 1 CPU or by a registered
|
||||
device). It can be a total power: static and dynamic.
|
||||
-
|
||||
name: cost
|
||||
type: u64
|
||||
doc: >-
|
||||
The cost coefficient associated with this level, used during energy
|
||||
calculation. Equal to: power * max_frequency / frequency.
|
||||
-
|
||||
name: flags
|
||||
type: u64
|
||||
doc: >-
|
||||
Bitmask of performance state flags.
|
||||
enum: perf-state-flags
|
||||
|
||||
operations:
|
||||
list:
|
||||
-
|
||||
name: get-perf-domains
|
||||
attribute-set: perf-domain
|
||||
doc: Get the list of information for all performance domains.
|
||||
do:
|
||||
request:
|
||||
attributes:
|
||||
- perf-domain-id
|
||||
reply:
|
||||
attributes: &perf-domain-attrs
|
||||
- pad
|
||||
- perf-domain-id
|
||||
- flags
|
||||
- cpus
|
||||
dump:
|
||||
reply:
|
||||
attributes: *perf-domain-attrs
|
||||
-
|
||||
name: get-perf-table
|
||||
attribute-set: perf-table
|
||||
doc: Get the energy model table of a performance domain.
|
||||
do:
|
||||
request:
|
||||
attributes:
|
||||
- perf-domain-id
|
||||
reply:
|
||||
attributes:
|
||||
- perf-domain-id
|
||||
- perf-state
|
||||
-
|
||||
name: perf-domain-created
|
||||
doc: A performance domain is created.
|
||||
notify: get-perf-table
|
||||
mcgrp: event
|
||||
-
|
||||
name: perf-domain-updated
|
||||
doc: A performance domain is updated.
|
||||
notify: get-perf-table
|
||||
mcgrp: event
|
||||
-
|
||||
name: perf-domain-deleted
|
||||
doc: A performance domain is deleted.
|
||||
attribute-set: perf-table
|
||||
event:
|
||||
attributes:
|
||||
- perf-domain-id
|
||||
mcgrp: event
|
||||
|
||||
mcast-groups:
|
||||
list:
|
||||
-
|
||||
name: event
|
||||
@@ -1,113 +0,0 @@
|
||||
# SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
|
||||
|
||||
name: em
|
||||
|
||||
doc: |
|
||||
Energy model netlink interface to notify its changes.
|
||||
|
||||
protocol: genetlink
|
||||
|
||||
uapi-header: linux/energy_model.h
|
||||
|
||||
attribute-sets:
|
||||
-
|
||||
name: pds
|
||||
attributes:
|
||||
-
|
||||
name: pd
|
||||
type: nest
|
||||
nested-attributes: pd
|
||||
multi-attr: true
|
||||
-
|
||||
name: pd
|
||||
attributes:
|
||||
-
|
||||
name: pad
|
||||
type: pad
|
||||
-
|
||||
name: pd-id
|
||||
type: u32
|
||||
-
|
||||
name: flags
|
||||
type: u64
|
||||
-
|
||||
name: cpus
|
||||
type: string
|
||||
-
|
||||
name: pd-table
|
||||
attributes:
|
||||
-
|
||||
name: pd-id
|
||||
type: u32
|
||||
-
|
||||
name: ps
|
||||
type: nest
|
||||
nested-attributes: ps
|
||||
multi-attr: true
|
||||
-
|
||||
name: ps
|
||||
attributes:
|
||||
-
|
||||
name: pad
|
||||
type: pad
|
||||
-
|
||||
name: performance
|
||||
type: u64
|
||||
-
|
||||
name: frequency
|
||||
type: u64
|
||||
-
|
||||
name: power
|
||||
type: u64
|
||||
-
|
||||
name: cost
|
||||
type: u64
|
||||
-
|
||||
name: flags
|
||||
type: u64
|
||||
|
||||
operations:
|
||||
list:
|
||||
-
|
||||
name: get-pds
|
||||
attribute-set: pds
|
||||
doc: Get the list of information for all performance domains.
|
||||
do:
|
||||
reply:
|
||||
attributes:
|
||||
- pd
|
||||
-
|
||||
name: get-pd-table
|
||||
attribute-set: pd-table
|
||||
doc: Get the energy model table of a performance domain.
|
||||
do:
|
||||
request:
|
||||
attributes:
|
||||
- pd-id
|
||||
reply:
|
||||
attributes:
|
||||
- pd-id
|
||||
- ps
|
||||
-
|
||||
name: pd-created
|
||||
doc: A performance domain is created.
|
||||
notify: get-pd-table
|
||||
mcgrp: event
|
||||
-
|
||||
name: pd-updated
|
||||
doc: A performance domain is updated.
|
||||
notify: get-pd-table
|
||||
mcgrp: event
|
||||
-
|
||||
name: pd-deleted
|
||||
doc: A performance domain is deleted.
|
||||
attribute-set: pd-table
|
||||
event:
|
||||
attributes:
|
||||
- pd-id
|
||||
mcgrp: event
|
||||
|
||||
mcast-groups:
|
||||
list:
|
||||
-
|
||||
name: event
|
||||
@@ -39,6 +39,8 @@ attribute-sets:
|
||||
-
|
||||
name: ipproto
|
||||
type: u8
|
||||
checks:
|
||||
min: 1
|
||||
-
|
||||
name: type
|
||||
type: u8
|
||||
|
||||
@@ -363,6 +363,18 @@ just do it. As a result, a sequence of smaller series gets merged quicker and
|
||||
with better review coverage. Re-posting large series also increases the mailing
|
||||
list traffic.
|
||||
|
||||
Limit patches outstanding on mailing list
|
||||
-----------------------------------------
|
||||
|
||||
Avoid having more than 15 patches, across all series, outstanding for
|
||||
review on the mailing list for a single tree. In other words, a maximum of
|
||||
15 patches under review on net, and a maximum of 15 patches under review on
|
||||
net-next.
|
||||
|
||||
This limit is intended to focus developer effort on testing patches before
|
||||
upstream review. Aiding the quality of upstream submissions, and easing the
|
||||
load on reviewers.
|
||||
|
||||
.. _rcs:
|
||||
|
||||
Local variable ordering ("reverse xmas tree", "RCS")
|
||||
|
||||
22
MAINTAINERS
22
MAINTAINERS
@@ -314,6 +314,7 @@ R: Mauro Carvalho Chehab <mchehab@kernel.org>
|
||||
R: Shuai Xue <xueshuai@linux.alibaba.com>
|
||||
L: linux-acpi@vger.kernel.org
|
||||
F: drivers/acpi/apei/
|
||||
F: drivers/firmware/efi/cper*
|
||||
|
||||
ACPI COMPONENT ARCHITECTURE (ACPICA)
|
||||
M: "Rafael J. Wysocki" <rafael@kernel.org>
|
||||
@@ -3131,6 +3132,7 @@ F: drivers/*/*ma35*
|
||||
K: ma35d1
|
||||
|
||||
ARM/NUVOTON NPCM ARCHITECTURE
|
||||
M: Andrew Jeffery <andrew@codeconstruct.com.au>
|
||||
M: Avi Fishman <avifishman70@gmail.com>
|
||||
M: Tomer Maimon <tmaimon77@gmail.com>
|
||||
M: Tali Perry <tali.perry1@gmail.com>
|
||||
@@ -3139,6 +3141,7 @@ R: Nancy Yuen <yuenn@google.com>
|
||||
R: Benjamin Fair <benjaminfair@google.com>
|
||||
L: openbmc@lists.ozlabs.org (moderated for non-subscribers)
|
||||
S: Supported
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/bmc/linux.git
|
||||
F: Documentation/devicetree/bindings/*/*/*npcm*
|
||||
F: Documentation/devicetree/bindings/*/*npcm*
|
||||
F: Documentation/devicetree/bindings/rtc/nuvoton,nct3018y.yaml
|
||||
@@ -6420,6 +6423,7 @@ F: include/linux/blk-cgroup.h
|
||||
|
||||
CONTROL GROUP - CPUSET
|
||||
M: Waiman Long <longman@redhat.com>
|
||||
R: Chen Ridong <chenridong@huaweicloud.com>
|
||||
L: cgroups@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup.git
|
||||
@@ -9303,12 +9307,12 @@ M: Lukasz Luba <lukasz.luba@arm.com>
|
||||
M: "Rafael J. Wysocki" <rafael@kernel.org>
|
||||
L: linux-pm@vger.kernel.org
|
||||
S: Maintained
|
||||
F: kernel/power/energy_model.c
|
||||
F: include/linux/energy_model.h
|
||||
F: Documentation/netlink/specs/dev-energymodel.yaml
|
||||
F: Documentation/power/energy-model.rst
|
||||
F: Documentation/netlink/specs/em.yaml
|
||||
F: include/uapi/linux/energy_model.h
|
||||
F: include/linux/energy_model.h
|
||||
F: include/uapi/linux/dev_energymodel.h
|
||||
F: kernel/power/em_netlink*.*
|
||||
F: kernel/power/energy_model.c
|
||||
|
||||
EPAPR HYPERVISOR BYTE CHANNEL DEVICE DRIVER
|
||||
M: Laurentiu Tudor <laurentiu.tudor@nxp.com>
|
||||
@@ -9519,6 +9523,7 @@ F: arch/arm/boot/compressed/efi-header.S
|
||||
F: arch/x86/platform/efi/
|
||||
F: drivers/firmware/efi/
|
||||
F: include/linux/efi*.h
|
||||
X: drivers/firmware/efi/cper*
|
||||
|
||||
EXTERNAL CONNECTOR SUBSYSTEM (EXTCON)
|
||||
M: MyungJoo Ham <myungjoo.ham@samsung.com>
|
||||
@@ -18490,9 +18495,8 @@ F: include/uapi/linux/nexthop.h
|
||||
F: net/ipv4/nexthop.c
|
||||
|
||||
NFC SUBSYSTEM
|
||||
M: Krzysztof Kozlowski <krzk@kernel.org>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
S: Orphan
|
||||
F: Documentation/devicetree/bindings/net/nfc/
|
||||
F: drivers/nfc/
|
||||
F: include/net/nfc/
|
||||
@@ -21119,6 +21123,10 @@ S: Maintained
|
||||
F: rust/helpers/pwm.c
|
||||
F: rust/kernel/pwm.rs
|
||||
|
||||
PWM SUBSYSTEM DRIVERS [RUST]
|
||||
R: Michal Wilczynski <m.wilczynski@samsung.com>
|
||||
F: drivers/pwm/*.rs
|
||||
|
||||
PXA GPIO DRIVER
|
||||
M: Robert Jarzmik <robert.jarzmik@free.fr>
|
||||
L: linux-gpio@vger.kernel.org
|
||||
@@ -22548,7 +22556,7 @@ F: drivers/mailbox/riscv-sbi-mpxy-mbox.c
|
||||
F: include/linux/mailbox/riscv-rpmi-message.h
|
||||
|
||||
RISC-V SPACEMIT SoC Support
|
||||
M: Yixun Lan <dlan@gentoo.org>
|
||||
M: Yixun Lan <dlan@kernel.org>
|
||||
L: linux-riscv@lists.infradead.org
|
||||
L: spacemit@lists.linux.dev
|
||||
S: Maintained
|
||||
|
||||
2
Makefile
2
Makefile
@@ -2,7 +2,7 @@
|
||||
VERSION = 6
|
||||
PATCHLEVEL = 19
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc5
|
||||
EXTRAVERSION = -rc6
|
||||
NAME = Baby Opossum Posse
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
||||
@@ -54,6 +54,7 @@
|
||||
&mdio0 {
|
||||
pinctrl-0 = <&miim_a_pins>;
|
||||
pinctrl-names = "default";
|
||||
reset-gpios = <&gpio 53 GPIO_ACTIVE_LOW>;
|
||||
status = "okay";
|
||||
|
||||
ext_phy0: ethernet-phy@7 {
|
||||
|
||||
@@ -527,7 +527,7 @@
|
||||
interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&pmc PMC_TYPE_PERIPHERAL 37>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
dmas = <&dma0 AT91_XDMAC_DT_PERID(12)>,
|
||||
<&dma0 AT91_XDMAC_DT_PERID(11)>;
|
||||
dma-names = "tx", "rx";
|
||||
@@ -676,7 +676,7 @@
|
||||
flx9: flexcom@e2820000 {
|
||||
compatible = "microchip,sama7d65-flexcom", "atmel,sama5d2-flexcom";
|
||||
reg = <0xe2820000 0x200>;
|
||||
ranges = <0x0 0xe281c000 0x800>;
|
||||
ranges = <0x0 0xe2820000 0x800>;
|
||||
clocks = <&pmc PMC_TYPE_PERIPHERAL 43>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
@@ -30,7 +30,6 @@ config ARCH_NPCM7XX
|
||||
select ARM_ERRATA_764369 if SMP
|
||||
select ARM_ERRATA_720789
|
||||
select ARM_ERRATA_754322
|
||||
select ARM_ERRATA_794072
|
||||
select PL310_ERRATA_588369
|
||||
select PL310_ERRATA_727915
|
||||
select MFD_SYSCON
|
||||
|
||||
@@ -202,19 +202,6 @@
|
||||
|
||||
nvidia,outputs = <&dsia &dsib &sor0 &sor1>;
|
||||
nvidia,head = <0>;
|
||||
|
||||
interconnects = <&mc TEGRA210_MC_DISPLAY0A &emc>,
|
||||
<&mc TEGRA210_MC_DISPLAY0B &emc>,
|
||||
<&mc TEGRA210_MC_DISPLAY0C &emc>,
|
||||
<&mc TEGRA210_MC_DISPLAYHC &emc>,
|
||||
<&mc TEGRA210_MC_DISPLAYD &emc>,
|
||||
<&mc TEGRA210_MC_DISPLAYT &emc>;
|
||||
interconnect-names = "wina",
|
||||
"winb",
|
||||
"winc",
|
||||
"cursor",
|
||||
"wind",
|
||||
"wint";
|
||||
};
|
||||
|
||||
dc@54240000 {
|
||||
@@ -230,15 +217,6 @@
|
||||
|
||||
nvidia,outputs = <&dsia &dsib &sor0 &sor1>;
|
||||
nvidia,head = <1>;
|
||||
|
||||
interconnects = <&mc TEGRA210_MC_DISPLAY0AB &emc>,
|
||||
<&mc TEGRA210_MC_DISPLAY0BB &emc>,
|
||||
<&mc TEGRA210_MC_DISPLAY0CB &emc>,
|
||||
<&mc TEGRA210_MC_DISPLAYHCB &emc>;
|
||||
interconnect-names = "wina",
|
||||
"winb",
|
||||
"winc",
|
||||
"cursor";
|
||||
};
|
||||
|
||||
dsia: dsi@54300000 {
|
||||
@@ -1052,7 +1030,6 @@
|
||||
|
||||
#iommu-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
#interconnect-cells = <1>;
|
||||
};
|
||||
|
||||
emc: external-memory-controller@7001b000 {
|
||||
@@ -1066,7 +1043,6 @@
|
||||
nvidia,memory-controller = <&mc>;
|
||||
operating-points-v2 = <&emc_icc_dvfs_opp_table>;
|
||||
|
||||
#interconnect-cells = <0>;
|
||||
#cooling-cells = <2>;
|
||||
};
|
||||
|
||||
|
||||
@@ -5788,8 +5788,12 @@
|
||||
clocks = <&rpmhcc RPMH_CXO_CLK>;
|
||||
clock-names = "xo";
|
||||
|
||||
power-domains = <&rpmhpd SC8280XP_NSP>;
|
||||
power-domain-names = "nsp";
|
||||
power-domains = <&rpmhpd SC8280XP_NSP>,
|
||||
<&rpmhpd SC8280XP_CX>,
|
||||
<&rpmhpd SC8280XP_MXC>;
|
||||
power-domain-names = "nsp",
|
||||
"cx",
|
||||
"mxc";
|
||||
|
||||
memory-region = <&pil_nsp0_mem>;
|
||||
|
||||
@@ -5919,8 +5923,12 @@
|
||||
clocks = <&rpmhcc RPMH_CXO_CLK>;
|
||||
clock-names = "xo";
|
||||
|
||||
power-domains = <&rpmhpd SC8280XP_NSP>;
|
||||
power-domain-names = "nsp";
|
||||
power-domains = <&rpmhpd SC8280XP_NSP>,
|
||||
<&rpmhpd SC8280XP_CX>,
|
||||
<&rpmhpd SC8280XP_MXC>;
|
||||
power-domain-names = "nsp",
|
||||
"cx",
|
||||
"mxc";
|
||||
|
||||
memory-region = <&pil_nsp1_mem>;
|
||||
|
||||
|
||||
@@ -31,9 +31,9 @@
|
||||
};
|
||||
|
||||
&display_panel {
|
||||
status = "okay";
|
||||
compatible = "samsung,sofef00-ams628nw01", "samsung,sofef00";
|
||||
|
||||
compatible = "samsung,sofef00";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&bq27441_fg {
|
||||
|
||||
@@ -4133,8 +4133,6 @@
|
||||
usb_1: usb@a600000 {
|
||||
compatible = "qcom,sm8550-dwc3", "qcom,snps-dwc3";
|
||||
reg = <0x0 0x0a600000 0x0 0xfc100>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
clocks = <&gcc GCC_CFG_NOC_USB3_PRIM_AXI_CLK>,
|
||||
<&gcc GCC_USB30_PRIM_MASTER_CLK>,
|
||||
|
||||
@@ -5150,9 +5150,6 @@
|
||||
|
||||
dma-coherent;
|
||||
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
status = "disabled";
|
||||
|
||||
ports {
|
||||
|
||||
@@ -1399,10 +1399,10 @@
|
||||
<&gcc GCC_AGGRE_UFS_PHY_AXI_CLK>,
|
||||
<&gcc GCC_UFS_PHY_AHB_CLK>,
|
||||
<&gcc GCC_UFS_PHY_UNIPRO_CORE_CLK>,
|
||||
<&gcc GCC_UFS_PHY_ICE_CORE_CLK>,
|
||||
<&rpmhcc RPMH_CXO_CLK>,
|
||||
<&gcc GCC_UFS_PHY_TX_SYMBOL_0_CLK>,
|
||||
<&gcc GCC_UFS_PHY_RX_SYMBOL_0_CLK>;
|
||||
<&gcc GCC_UFS_PHY_RX_SYMBOL_0_CLK>,
|
||||
<&gcc GCC_UFS_PHY_ICE_CORE_CLK>;
|
||||
clock-names = "core_clk",
|
||||
"bus_aggr_clk",
|
||||
"iface_clk",
|
||||
|
||||
@@ -199,7 +199,7 @@
|
||||
compatible = "brcm,bcm43455-fmac", "brcm,bcm4329-fmac";
|
||||
reg = <1>;
|
||||
interrupt-parent = <&gpio0>;
|
||||
interrupts = <RK_PA3 GPIO_ACTIVE_HIGH>;
|
||||
interrupts = <RK_PA3 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-names = "host-wake";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&wifi_host_wake>;
|
||||
|
||||
@@ -14,7 +14,8 @@
|
||||
|
||||
joystick_mux_controller: mux-controller {
|
||||
compatible = "gpio-mux";
|
||||
pinctrl = <&mux_en_pins>;
|
||||
pinctrl-0 = <&mux_en_pins>;
|
||||
pinctrl-names = "default";
|
||||
#mux-control-cells = <0>;
|
||||
|
||||
mux-gpios = <&gpio3 RK_PB3 GPIO_ACTIVE_LOW>,
|
||||
|
||||
@@ -424,9 +424,7 @@
|
||||
|
||||
&pcie0 {
|
||||
ep-gpios = <&gpio2 RK_PD4 GPIO_ACTIVE_HIGH>;
|
||||
max-link-speed = <2>;
|
||||
num-lanes = <2>;
|
||||
pinctrl-names = "default";
|
||||
status = "okay";
|
||||
|
||||
vpcie12v-supply = <&vcc12v_dcin>;
|
||||
|
||||
@@ -71,7 +71,6 @@
|
||||
};
|
||||
|
||||
&pcie0 {
|
||||
max-link-speed = <1>;
|
||||
num-lanes = <1>;
|
||||
vpcie3v3-supply = <&vcc3v3_sys>;
|
||||
};
|
||||
|
||||
@@ -969,7 +969,6 @@
|
||||
};
|
||||
|
||||
&spi1 {
|
||||
max-freq = <10000000>;
|
||||
status = "okay";
|
||||
|
||||
spiflash: flash@0 {
|
||||
|
||||
@@ -40,13 +40,13 @@
|
||||
button-up {
|
||||
label = "Volume Up";
|
||||
linux,code = <KEY_VOLUMEUP>;
|
||||
press-threshold-microvolt = <100000>;
|
||||
press-threshold-microvolt = <2000>;
|
||||
};
|
||||
|
||||
button-down {
|
||||
label = "Volume Down";
|
||||
linux,code = <KEY_VOLUMEDOWN>;
|
||||
press-threshold-microvolt = <600000>;
|
||||
press-threshold-microvolt = <300000>;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -483,7 +483,7 @@
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&q7_thermal_pin &bios_disable_override_hog_pin>;
|
||||
|
||||
gpios {
|
||||
gpio-pins {
|
||||
bios_disable_override_hog_pin: bios-disable-override-hog-pin {
|
||||
rockchip,pins =
|
||||
<3 RK_PD5 RK_FUNC_GPIO &pcfg_pull_down>;
|
||||
|
||||
@@ -529,11 +529,11 @@
|
||||
rockchip,pins = <1 RK_PC5 RK_FUNC_GPIO &pcfg_pull_up>;
|
||||
};
|
||||
|
||||
vsel1_gpio: vsel1-gpio {
|
||||
vsel1_gpio: vsel1-gpio-pin {
|
||||
rockchip,pins = <1 RK_PC1 RK_FUNC_GPIO &pcfg_pull_down>;
|
||||
};
|
||||
|
||||
vsel2_gpio: vsel2-gpio {
|
||||
vsel2_gpio: vsel2-gpio-pin {
|
||||
rockchip,pins = <1 RK_PB6 RK_FUNC_GPIO &pcfg_pull_down>;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
#include "rk3568-wolfvision-pf5-display.dtsi"
|
||||
|
||||
&st7789 {
|
||||
compatible = "jasonic,jt240mhqs-hwt-ek-e3",
|
||||
"sitronix,st7789v";
|
||||
compatible = "jasonic,jt240mhqs-hwt-ek-e3";
|
||||
rotation = <270>;
|
||||
};
|
||||
|
||||
@@ -201,6 +201,7 @@
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&hp_det_l>;
|
||||
|
||||
simple-audio-card,bitclock-master = <&masterdai>;
|
||||
simple-audio-card,format = "i2s";
|
||||
simple-audio-card,hp-det-gpios = <&gpio2 RK_PD6 GPIO_ACTIVE_LOW>;
|
||||
simple-audio-card,mclk-fs = <256>;
|
||||
@@ -211,15 +212,16 @@
|
||||
"Headphones", "HPOR",
|
||||
"IN1P", "Microphone Jack";
|
||||
simple-audio-card,widgets =
|
||||
"Headphone", "Headphone Jack",
|
||||
"Headphone", "Headphones",
|
||||
"Microphone", "Microphone Jack";
|
||||
|
||||
simple-audio-card,codec {
|
||||
sound-dai = <&rt5616>;
|
||||
};
|
||||
|
||||
simple-audio-card,cpu {
|
||||
masterdai: simple-audio-card,cpu {
|
||||
sound-dai = <&sai2>;
|
||||
system-clock-frequency = <12288000>;
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -727,10 +729,12 @@
|
||||
rt5616: audio-codec@1b {
|
||||
compatible = "realtek,rt5616";
|
||||
reg = <0x1b>;
|
||||
assigned-clocks = <&cru CLK_SAI2_MCLKOUT>;
|
||||
assigned-clocks = <&cru CLK_SAI2_MCLKOUT_TO_IO>;
|
||||
assigned-clock-rates = <12288000>;
|
||||
clocks = <&cru CLK_SAI2_MCLKOUT>;
|
||||
clocks = <&cru CLK_SAI2_MCLKOUT_TO_IO>;
|
||||
clock-names = "mclk";
|
||||
pinctrl-0 = <&sai2m0_mclk>;
|
||||
pinctrl-names = "default";
|
||||
#sound-dai-cells = <0>;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -1261,7 +1261,7 @@
|
||||
|
||||
gpu: gpu@27800000 {
|
||||
compatible = "rockchip,rk3576-mali", "arm,mali-bifrost";
|
||||
reg = <0x0 0x27800000 0x0 0x200000>;
|
||||
reg = <0x0 0x27800000 0x0 0x20000>;
|
||||
assigned-clocks = <&scmi_clk SCMI_CLK_GPU>;
|
||||
assigned-clock-rates = <198000000>;
|
||||
clocks = <&cru CLK_GPU>;
|
||||
|
||||
@@ -1200,7 +1200,7 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
rknn_mmu_1: iommu@fdac9000 {
|
||||
rknn_mmu_1: iommu@fdaca000 {
|
||||
compatible = "rockchip,rk3588-iommu", "rockchip,rk3568-iommu";
|
||||
reg = <0x0 0xfdaca000 0x0 0x100>;
|
||||
interrupts = <GIC_SPI 111 IRQ_TYPE_LEVEL_HIGH 0>;
|
||||
@@ -1230,7 +1230,7 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
rknn_mmu_2: iommu@fdad9000 {
|
||||
rknn_mmu_2: iommu@fdada000 {
|
||||
compatible = "rockchip,rk3588-iommu", "rockchip,rk3568-iommu";
|
||||
reg = <0x0 0xfdada000 0x0 0x100>;
|
||||
interrupts = <GIC_SPI 112 IRQ_TYPE_LEVEL_HIGH 0>;
|
||||
|
||||
@@ -131,6 +131,7 @@
|
||||
reg-names = "main", "isr0";
|
||||
|
||||
interrupt-controller;
|
||||
#address-cells = <0>;
|
||||
#interrupt-cells = <2>;
|
||||
interrupt-parent = <&cpuintc>;
|
||||
interrupts = <2>;
|
||||
@@ -149,6 +150,7 @@
|
||||
reg-names = "main", "isr0";
|
||||
|
||||
interrupt-controller;
|
||||
#address-cells = <0>;
|
||||
#interrupt-cells = <2>;
|
||||
interrupt-parent = <&cpuintc>;
|
||||
interrupts = <4>;
|
||||
@@ -164,6 +166,7 @@
|
||||
compatible = "loongson,ls2k0500-eiointc";
|
||||
reg = <0x0 0x1fe11600 0x0 0xea00>;
|
||||
interrupt-controller;
|
||||
#address-cells = <0>;
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-parent = <&cpuintc>;
|
||||
interrupts = <3>;
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
};
|
||||
|
||||
/* i2c of the dvi eeprom edid */
|
||||
i2c-gpio-0 {
|
||||
i2c-0 {
|
||||
compatible = "i2c-gpio";
|
||||
scl-gpios = <&gpio0 0 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
|
||||
sda-gpios = <&gpio0 1 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
|
||||
@@ -57,7 +57,7 @@
|
||||
};
|
||||
|
||||
/* i2c of the eeprom edid */
|
||||
i2c-gpio-1 {
|
||||
i2c-1 {
|
||||
compatible = "i2c-gpio";
|
||||
scl-gpios = <&gpio0 33 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
|
||||
sda-gpios = <&gpio0 32 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
|
||||
@@ -114,6 +114,7 @@
|
||||
<0x0 0x1fe01140 0x0 0x8>;
|
||||
reg-names = "main", "isr0", "isr1";
|
||||
interrupt-controller;
|
||||
#address-cells = <0>;
|
||||
#interrupt-cells = <2>;
|
||||
interrupt-parent = <&cpuintc>;
|
||||
interrupts = <2>;
|
||||
@@ -131,6 +132,7 @@
|
||||
<0x0 0x1fe01148 0x0 0x8>;
|
||||
reg-names = "main", "isr0", "isr1";
|
||||
interrupt-controller;
|
||||
#address-cells = <0>;
|
||||
#interrupt-cells = <2>;
|
||||
interrupt-parent = <&cpuintc>;
|
||||
interrupts = <3>;
|
||||
@@ -437,54 +439,47 @@
|
||||
|
||||
gmac0: ethernet@3,0 {
|
||||
reg = <0x1800 0x0 0x0 0x0 0x0>;
|
||||
interrupt-parent = <&liointc0>;
|
||||
interrupts = <12 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<13 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupts-extended = <&liointc0 12 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<&liointc0 13 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-names = "macirq", "eth_lpi";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
gmac1: ethernet@3,1 {
|
||||
reg = <0x1900 0x0 0x0 0x0 0x0>;
|
||||
interrupt-parent = <&liointc0>;
|
||||
interrupts = <14 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<15 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupts-extended = <&liointc0 14 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<&liointc0 15 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-names = "macirq", "eth_lpi";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
ehci0: usb@4,1 {
|
||||
reg = <0x2100 0x0 0x0 0x0 0x0>;
|
||||
interrupt-parent = <&liointc1>;
|
||||
interrupts = <18 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupts-extended = <&liointc1 18 IRQ_TYPE_LEVEL_HIGH>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
ohci0: usb@4,2 {
|
||||
reg = <0x2200 0x0 0x0 0x0 0x0>;
|
||||
interrupt-parent = <&liointc1>;
|
||||
interrupts = <19 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupts-extended = <&liointc1 19 IRQ_TYPE_LEVEL_HIGH>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
display@6,0 {
|
||||
reg = <0x3000 0x0 0x0 0x0 0x0>;
|
||||
interrupt-parent = <&liointc0>;
|
||||
interrupts = <28 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupts-extended = <&liointc0 28 IRQ_TYPE_LEVEL_HIGH>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
hda@7,0 {
|
||||
reg = <0x3800 0x0 0x0 0x0 0x0>;
|
||||
interrupt-parent = <&liointc0>;
|
||||
interrupts = <4 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupts-extended = <&liointc0 4 IRQ_TYPE_LEVEL_HIGH>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
sata: sata@8,0 {
|
||||
reg = <0x4000 0x0 0x0 0x0 0x0>;
|
||||
interrupt-parent = <&liointc0>;
|
||||
interrupts = <19 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupts-extended = <&liointc0 19 IRQ_TYPE_LEVEL_HIGH>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
||||
@@ -126,6 +126,7 @@
|
||||
reg = <0x0 0x1fe01400 0x0 0x64>;
|
||||
|
||||
interrupt-controller;
|
||||
#address-cells = <0>;
|
||||
#interrupt-cells = <2>;
|
||||
interrupt-parent = <&cpuintc>;
|
||||
interrupts = <2>;
|
||||
@@ -140,6 +141,7 @@
|
||||
compatible = "loongson,ls2k2000-eiointc";
|
||||
reg = <0x0 0x1fe01600 0x0 0xea00>;
|
||||
interrupt-controller;
|
||||
#address-cells = <0>;
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-parent = <&cpuintc>;
|
||||
interrupts = <3>;
|
||||
@@ -149,6 +151,7 @@
|
||||
compatible = "loongson,pch-pic-1.0";
|
||||
reg = <0x0 0x10000000 0x0 0x400>;
|
||||
interrupt-controller;
|
||||
#address-cells = <0>;
|
||||
#interrupt-cells = <2>;
|
||||
loongson,pic-base-vec = <0>;
|
||||
interrupt-parent = <&eiointc>;
|
||||
@@ -291,65 +294,57 @@
|
||||
|
||||
gmac0: ethernet@3,0 {
|
||||
reg = <0x1800 0x0 0x0 0x0 0x0>;
|
||||
interrupts = <12 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<13 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupts-extended = <&pic 12 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<&pic 13 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-names = "macirq", "eth_lpi";
|
||||
interrupt-parent = <&pic>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
gmac1: ethernet@3,1 {
|
||||
reg = <0x1900 0x0 0x0 0x0 0x0>;
|
||||
interrupts = <14 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<15 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupts-extended = <&pic 14 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<&pic 15 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-names = "macirq", "eth_lpi";
|
||||
interrupt-parent = <&pic>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
gmac2: ethernet@3,2 {
|
||||
reg = <0x1a00 0x0 0x0 0x0 0x0>;
|
||||
interrupts = <17 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<18 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupts-extended = <&pic 17 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<&pic 18 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-names = "macirq", "eth_lpi";
|
||||
interrupt-parent = <&pic>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
xhci0: usb@4,0 {
|
||||
reg = <0x2000 0x0 0x0 0x0 0x0>;
|
||||
interrupts = <48 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-parent = <&pic>;
|
||||
interrupts-extended = <&pic 48 IRQ_TYPE_LEVEL_HIGH>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
xhci1: usb@19,0 {
|
||||
reg = <0xc800 0x0 0x0 0x0 0x0>;
|
||||
interrupts = <22 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-parent = <&pic>;
|
||||
interrupts-extended = <&pic 22 IRQ_TYPE_LEVEL_HIGH>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
display@6,1 {
|
||||
reg = <0x3100 0x0 0x0 0x0 0x0>;
|
||||
interrupts = <28 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-parent = <&pic>;
|
||||
interrupts-extended = <&pic 28 IRQ_TYPE_LEVEL_HIGH>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
i2s@7,0 {
|
||||
reg = <0x3800 0x0 0x0 0x0 0x0>;
|
||||
interrupts = <78 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<79 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupts-extended = <&pic 78 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<&pic 79 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-names = "tx", "rx";
|
||||
interrupt-parent = <&pic>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
sata: sata@8,0 {
|
||||
reg = <0x4000 0x0 0x0 0x0 0x0>;
|
||||
interrupts = <16 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-parent = <&pic>;
|
||||
interrupts-extended = <&pic 16 IRQ_TYPE_LEVEL_HIGH>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
||||
@@ -126,14 +126,6 @@ SYM_CODE_START(smpboot_entry)
|
||||
LONG_LI t1, CSR_STFILL
|
||||
csrxchg t0, t1, LOONGARCH_CSR_IMPCTL1
|
||||
#endif
|
||||
/* Enable PG */
|
||||
li.w t0, 0xb0 # PLV=0, IE=0, PG=1
|
||||
csrwr t0, LOONGARCH_CSR_CRMD
|
||||
li.w t0, 0x04 # PLV=0, PIE=1, PWE=0
|
||||
csrwr t0, LOONGARCH_CSR_PRMD
|
||||
li.w t0, 0x00 # FPE=0, SXE=0, ASXE=0, BTE=0
|
||||
csrwr t0, LOONGARCH_CSR_EUEN
|
||||
|
||||
la.pcrel t0, cpuboot_data
|
||||
ld.d sp, t0, CPU_BOOT_STACK
|
||||
ld.d tp, t0, CPU_BOOT_TINFO
|
||||
|
||||
@@ -626,6 +626,18 @@ static const struct loongarch_perf_event *loongarch_pmu_map_cache_event(u64 conf
|
||||
return pev;
|
||||
}
|
||||
|
||||
static inline bool loongarch_pmu_event_requires_counter(const struct perf_event *event)
|
||||
{
|
||||
switch (event->attr.type) {
|
||||
case PERF_TYPE_HARDWARE:
|
||||
case PERF_TYPE_HW_CACHE:
|
||||
case PERF_TYPE_RAW:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static int validate_group(struct perf_event *event)
|
||||
{
|
||||
struct cpu_hw_events fake_cpuc;
|
||||
@@ -633,15 +645,18 @@ static int validate_group(struct perf_event *event)
|
||||
|
||||
memset(&fake_cpuc, 0, sizeof(fake_cpuc));
|
||||
|
||||
if (loongarch_pmu_alloc_counter(&fake_cpuc, &leader->hw) < 0)
|
||||
if (loongarch_pmu_event_requires_counter(leader) &&
|
||||
loongarch_pmu_alloc_counter(&fake_cpuc, &leader->hw) < 0)
|
||||
return -EINVAL;
|
||||
|
||||
for_each_sibling_event(sibling, leader) {
|
||||
if (loongarch_pmu_alloc_counter(&fake_cpuc, &sibling->hw) < 0)
|
||||
if (loongarch_pmu_event_requires_counter(sibling) &&
|
||||
loongarch_pmu_alloc_counter(&fake_cpuc, &sibling->hw) < 0)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (loongarch_pmu_alloc_counter(&fake_cpuc, &event->hw) < 0)
|
||||
if (loongarch_pmu_event_requires_counter(event) &&
|
||||
loongarch_pmu_alloc_counter(&fake_cpuc, &event->hw) < 0)
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -679,6 +679,7 @@ static void kvm_eiointc_destroy(struct kvm_device *dev)
|
||||
kvm_io_bus_unregister_dev(kvm, KVM_IOCSR_BUS, &eiointc->device);
|
||||
kvm_io_bus_unregister_dev(kvm, KVM_IOCSR_BUS, &eiointc->device_vext);
|
||||
kfree(eiointc);
|
||||
kfree(dev);
|
||||
}
|
||||
|
||||
static struct kvm_device_ops kvm_eiointc_dev_ops = {
|
||||
|
||||
@@ -459,6 +459,7 @@ static void kvm_ipi_destroy(struct kvm_device *dev)
|
||||
ipi = kvm->arch.ipi;
|
||||
kvm_io_bus_unregister_dev(kvm, KVM_IOCSR_BUS, &ipi->device);
|
||||
kfree(ipi);
|
||||
kfree(dev);
|
||||
}
|
||||
|
||||
static struct kvm_device_ops kvm_ipi_dev_ops = {
|
||||
|
||||
@@ -475,6 +475,7 @@ static void kvm_pch_pic_destroy(struct kvm_device *dev)
|
||||
/* unregister pch pic device and free it's memory */
|
||||
kvm_io_bus_unregister_dev(kvm, KVM_MMIO_BUS, &s->device);
|
||||
kfree(s);
|
||||
kfree(dev);
|
||||
}
|
||||
|
||||
static struct kvm_device_ops kvm_pch_pic_dev_ops = {
|
||||
|
||||
@@ -425,6 +425,28 @@ void __init paging_init(void)
|
||||
static struct kcore_list kcore_kseg0;
|
||||
#endif
|
||||
|
||||
static inline void __init highmem_init(void)
|
||||
{
|
||||
#ifdef CONFIG_HIGHMEM
|
||||
unsigned long tmp;
|
||||
|
||||
/*
|
||||
* If CPU cannot support HIGHMEM discard the memory above highstart_pfn
|
||||
*/
|
||||
if (cpu_has_dc_aliases) {
|
||||
memblock_remove(PFN_PHYS(highstart_pfn), -1);
|
||||
return;
|
||||
}
|
||||
|
||||
for (tmp = highstart_pfn; tmp < highend_pfn; tmp++) {
|
||||
struct page *page = pfn_to_page(tmp);
|
||||
|
||||
if (!memblock_is_memory(PFN_PHYS(tmp)))
|
||||
SetPageReserved(page);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void __init arch_mm_preinit(void)
|
||||
{
|
||||
/*
|
||||
@@ -435,6 +457,7 @@ void __init arch_mm_preinit(void)
|
||||
|
||||
maar_init();
|
||||
setup_zero_pages(); /* Setup zeroed pages. */
|
||||
highmem_init();
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
if ((unsigned long) &_text > (unsigned long) CKSEG0)
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
#include <linux/delay.h>
|
||||
#include <linux/processor.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/sys_info.h>
|
||||
|
||||
#include <asm/interrupt.h>
|
||||
#include <asm/paca.h>
|
||||
@@ -235,7 +236,11 @@ static void watchdog_smp_panic(int cpu)
|
||||
pr_emerg("CPU %d TB:%lld, last SMP heartbeat TB:%lld (%lldms ago)\n",
|
||||
cpu, tb, last_reset, tb_to_ns(tb - last_reset) / 1000000);
|
||||
|
||||
if (!sysctl_hardlockup_all_cpu_backtrace) {
|
||||
if (sysctl_hardlockup_all_cpu_backtrace ||
|
||||
(hardlockup_si_mask & SYS_INFO_ALL_BT)) {
|
||||
trigger_allbutcpu_cpu_backtrace(cpu);
|
||||
cpumask_clear(&wd_smp_cpus_ipi);
|
||||
} else {
|
||||
/*
|
||||
* Try to trigger the stuck CPUs, unless we are going to
|
||||
* get a backtrace on all of them anyway.
|
||||
@@ -244,11 +249,9 @@ static void watchdog_smp_panic(int cpu)
|
||||
smp_send_nmi_ipi(c, wd_lockup_ipi, 1000000);
|
||||
__cpumask_clear_cpu(c, &wd_smp_cpus_ipi);
|
||||
}
|
||||
} else {
|
||||
trigger_allbutcpu_cpu_backtrace(cpu);
|
||||
cpumask_clear(&wd_smp_cpus_ipi);
|
||||
}
|
||||
|
||||
sys_info(hardlockup_si_mask & ~SYS_INFO_ALL_BT);
|
||||
if (hardlockup_panic)
|
||||
nmi_panic(NULL, "Hard LOCKUP");
|
||||
|
||||
@@ -415,9 +418,11 @@ DEFINE_INTERRUPT_HANDLER_NMI(soft_nmi_interrupt)
|
||||
|
||||
xchg(&__wd_nmi_output, 1); // see wd_lockup_ipi
|
||||
|
||||
if (sysctl_hardlockup_all_cpu_backtrace)
|
||||
if (sysctl_hardlockup_all_cpu_backtrace ||
|
||||
(hardlockup_si_mask & SYS_INFO_ALL_BT))
|
||||
trigger_allbutcpu_cpu_backtrace(cpu);
|
||||
|
||||
sys_info(hardlockup_si_mask & ~SYS_INFO_ALL_BT);
|
||||
if (hardlockup_panic)
|
||||
nmi_panic(regs, "Hard LOCKUP");
|
||||
|
||||
|
||||
@@ -42,10 +42,34 @@ static inline bool kfence_protect_page(unsigned long addr, bool protect)
|
||||
{
|
||||
unsigned int level;
|
||||
pte_t *pte = lookup_address(addr, &level);
|
||||
pteval_t val;
|
||||
|
||||
if (WARN_ON(!pte || level != PG_LEVEL_4K))
|
||||
return false;
|
||||
|
||||
val = pte_val(*pte);
|
||||
|
||||
/*
|
||||
* protect requires making the page not-present. If the PTE is
|
||||
* already in the right state, there's nothing to do.
|
||||
*/
|
||||
if (protect != !!(val & _PAGE_PRESENT))
|
||||
return true;
|
||||
|
||||
/*
|
||||
* Otherwise, invert the entire PTE. This avoids writing out an
|
||||
* L1TF-vulnerable PTE (not present, without the high address bits
|
||||
* set).
|
||||
*/
|
||||
set_pte(pte, __pte(~val));
|
||||
|
||||
/*
|
||||
* If the page was protected (non-present) and we're making it
|
||||
* present, there is no need to flush the TLB at all.
|
||||
*/
|
||||
if (!protect)
|
||||
return true;
|
||||
|
||||
/*
|
||||
* We need to avoid IPIs, as we may get KFENCE allocations or faults
|
||||
* with interrupts disabled. Therefore, the below is best-effort, and
|
||||
@@ -53,11 +77,6 @@ static inline bool kfence_protect_page(unsigned long addr, bool protect)
|
||||
* lazy fault handling takes care of faults after the page is PRESENT.
|
||||
*/
|
||||
|
||||
if (protect)
|
||||
set_pte(pte, __pte(pte_val(*pte) & ~_PAGE_PRESENT));
|
||||
else
|
||||
set_pte(pte, __pte(pte_val(*pte) | _PAGE_PRESENT));
|
||||
|
||||
/*
|
||||
* Flush this CPU's TLB, assuming whoever did the allocation/free is
|
||||
* likely to continue running on this CPU.
|
||||
|
||||
@@ -825,7 +825,8 @@ static __init bool get_mem_config(void)
|
||||
|
||||
if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL)
|
||||
return __get_mem_config_intel(&hw_res->r_resctrl);
|
||||
else if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD)
|
||||
else if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD ||
|
||||
boot_cpu_data.x86_vendor == X86_VENDOR_HYGON)
|
||||
return __rdt_get_mem_config_amd(&hw_res->r_resctrl);
|
||||
|
||||
return false;
|
||||
@@ -987,7 +988,8 @@ static __init void rdt_init_res_defs(void)
|
||||
{
|
||||
if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL)
|
||||
rdt_init_res_defs_intel();
|
||||
else if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD)
|
||||
else if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD ||
|
||||
boot_cpu_data.x86_vendor == X86_VENDOR_HYGON)
|
||||
rdt_init_res_defs_amd();
|
||||
}
|
||||
|
||||
@@ -1019,8 +1021,19 @@ void resctrl_cpu_detect(struct cpuinfo_x86 *c)
|
||||
c->x86_cache_occ_scale = ebx;
|
||||
c->x86_cache_mbm_width_offset = eax & 0xff;
|
||||
|
||||
if (c->x86_vendor == X86_VENDOR_AMD && !c->x86_cache_mbm_width_offset)
|
||||
c->x86_cache_mbm_width_offset = MBM_CNTR_WIDTH_OFFSET_AMD;
|
||||
if (!c->x86_cache_mbm_width_offset) {
|
||||
switch (c->x86_vendor) {
|
||||
case X86_VENDOR_AMD:
|
||||
c->x86_cache_mbm_width_offset = MBM_CNTR_WIDTH_OFFSET_AMD;
|
||||
break;
|
||||
case X86_VENDOR_HYGON:
|
||||
c->x86_cache_mbm_width_offset = MBM_CNTR_WIDTH_OFFSET_HYGON;
|
||||
break;
|
||||
default:
|
||||
/* Leave c->x86_cache_mbm_width_offset as 0 */
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -14,6 +14,9 @@
|
||||
|
||||
#define MBM_CNTR_WIDTH_OFFSET_AMD 20
|
||||
|
||||
/* Hygon MBM counter width as an offset from MBM_CNTR_WIDTH_BASE */
|
||||
#define MBM_CNTR_WIDTH_OFFSET_HYGON 8
|
||||
|
||||
#define RMID_VAL_ERROR BIT_ULL(63)
|
||||
|
||||
#define RMID_VAL_UNAVAIL BIT_ULL(62)
|
||||
|
||||
@@ -115,12 +115,12 @@ void __init kernel_randomize_memory(void)
|
||||
|
||||
/*
|
||||
* Adapt physical memory region size based on available memory,
|
||||
* except when CONFIG_PCI_P2PDMA is enabled. P2PDMA exposes the
|
||||
* device BAR space assuming the direct map space is large enough
|
||||
* for creating a ZONE_DEVICE mapping in the direct map corresponding
|
||||
* to the physical BAR address.
|
||||
* except when CONFIG_ZONE_DEVICE is enabled. ZONE_DEVICE wants to map
|
||||
* any physical address into the direct-map. KASLR wants to reliably
|
||||
* steal some physical address bits. Those design choices are in direct
|
||||
* conflict.
|
||||
*/
|
||||
if (!IS_ENABLED(CONFIG_PCI_P2PDMA) && (memory_tb < kaslr_regions[0].size_tb))
|
||||
if (!IS_ENABLED(CONFIG_ZONE_DEVICE) && (memory_tb < kaslr_regions[0].size_tb))
|
||||
kaslr_regions[0].size_tb = memory_tb;
|
||||
|
||||
/*
|
||||
|
||||
@@ -140,7 +140,7 @@ bool bio_integrity_prep(struct bio *bio)
|
||||
return true;
|
||||
set_flags = false;
|
||||
gfp |= __GFP_ZERO;
|
||||
} else if (bi->csum_type == BLK_INTEGRITY_CSUM_NONE)
|
||||
} else if (bi->metadata_size > bi->pi_tuple_size)
|
||||
gfp |= __GFP_ZERO;
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -28,6 +28,10 @@ static bool sleep_no_lps0 __read_mostly;
|
||||
module_param(sleep_no_lps0, bool, 0644);
|
||||
MODULE_PARM_DESC(sleep_no_lps0, "Do not use the special LPS0 device interface");
|
||||
|
||||
static bool check_lps0_constraints __read_mostly;
|
||||
module_param(check_lps0_constraints, bool, 0644);
|
||||
MODULE_PARM_DESC(check_lps0_constraints, "Check LPS0 device constraints");
|
||||
|
||||
static const struct acpi_device_id lps0_device_ids[] = {
|
||||
{"PNP0D80", },
|
||||
{"", },
|
||||
@@ -515,7 +519,8 @@ static struct acpi_scan_handler lps0_handler = {
|
||||
|
||||
static int acpi_s2idle_begin_lps0(void)
|
||||
{
|
||||
if (pm_debug_messages_on && !lpi_constraints_table) {
|
||||
if (lps0_device_handle && !sleep_no_lps0 && check_lps0_constraints &&
|
||||
!lpi_constraints_table) {
|
||||
if (acpi_s2idle_vendor_amd())
|
||||
lpi_device_get_constraints_amd();
|
||||
else
|
||||
@@ -539,7 +544,7 @@ static int acpi_s2idle_prepare_late_lps0(void)
|
||||
if (!lps0_device_handle || sleep_no_lps0)
|
||||
return 0;
|
||||
|
||||
if (pm_debug_messages_on)
|
||||
if (check_lps0_constraints)
|
||||
lpi_check_constraints();
|
||||
|
||||
/* Screen off */
|
||||
|
||||
@@ -2094,13 +2094,13 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
if (ap->flags & ATA_FLAG_EM)
|
||||
ap->em_message_type = hpriv->em_msg_type;
|
||||
|
||||
ahci_mark_external_port(ap);
|
||||
|
||||
ahci_update_initial_lpm_policy(ap);
|
||||
|
||||
/* disabled/not-implemented port */
|
||||
if (!(hpriv->port_map & (1 << i)))
|
||||
if (!(hpriv->port_map & (1 << i))) {
|
||||
ap->ops = &ata_dummy_port_ops;
|
||||
} else {
|
||||
ahci_mark_external_port(ap);
|
||||
ahci_update_initial_lpm_policy(ap);
|
||||
}
|
||||
}
|
||||
|
||||
/* apply workaround for ASUS P5W DH Deluxe mainboard */
|
||||
|
||||
@@ -2872,7 +2872,8 @@ static void ata_dev_config_lpm(struct ata_device *dev)
|
||||
|
||||
static void ata_dev_print_features(struct ata_device *dev)
|
||||
{
|
||||
if (!(dev->flags & ATA_DFLAG_FEATURES_MASK))
|
||||
if (!(dev->flags & ATA_DFLAG_FEATURES_MASK) && !dev->cpr_log &&
|
||||
!ata_id_has_hipm(dev->id) && !ata_id_has_dipm(dev->id))
|
||||
return;
|
||||
|
||||
ata_dev_info(dev,
|
||||
@@ -3116,6 +3117,11 @@ int ata_dev_configure(struct ata_device *dev)
|
||||
ata_mode_string(xfer_mask),
|
||||
cdb_intr_string, atapi_an_string,
|
||||
dma_dir_string);
|
||||
|
||||
ata_dev_config_lpm(dev);
|
||||
|
||||
if (print_info)
|
||||
ata_dev_print_features(dev);
|
||||
}
|
||||
|
||||
/* determine max_sectors */
|
||||
|
||||
@@ -909,7 +909,7 @@ static bool ata_scsi_lpm_supported(struct ata_port *ap)
|
||||
struct ata_link *link;
|
||||
struct ata_device *dev;
|
||||
|
||||
if (ap->flags & ATA_FLAG_NO_LPM)
|
||||
if ((ap->flags & ATA_FLAG_NO_LPM) || !ap->ops->set_lpm)
|
||||
return false;
|
||||
|
||||
ata_for_each_link(link, ap, EDGE) {
|
||||
|
||||
@@ -665,12 +665,22 @@ static void nullb_add_fault_config(struct nullb_device *dev)
|
||||
configfs_add_default_group(&dev->init_hctx_fault_config.group, &dev->group);
|
||||
}
|
||||
|
||||
static void nullb_del_fault_config(struct nullb_device *dev)
|
||||
{
|
||||
config_item_put(&dev->init_hctx_fault_config.group.cg_item);
|
||||
config_item_put(&dev->requeue_config.group.cg_item);
|
||||
config_item_put(&dev->timeout_config.group.cg_item);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static void nullb_add_fault_config(struct nullb_device *dev)
|
||||
{
|
||||
}
|
||||
|
||||
static void nullb_del_fault_config(struct nullb_device *dev)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
static struct
|
||||
@@ -702,7 +712,7 @@ nullb_group_drop_item(struct config_group *group, struct config_item *item)
|
||||
null_del_dev(dev->nullb);
|
||||
mutex_unlock(&lock);
|
||||
}
|
||||
|
||||
nullb_del_fault_config(dev);
|
||||
config_item_put(item);
|
||||
}
|
||||
|
||||
|
||||
@@ -1662,7 +1662,6 @@ static void destroy_sysfs(struct rnbd_clt_dev *dev,
|
||||
/* To avoid deadlock firstly remove itself */
|
||||
sysfs_remove_file_self(&dev->kobj, sysfs_self);
|
||||
kobject_del(&dev->kobj);
|
||||
kobject_put(&dev->kobj);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -75,9 +75,16 @@ EXPORT_SYMBOL_FOR_MODULES(cxl_do_xormap_calc, "cxl_translate");
|
||||
|
||||
static u64 cxl_apply_xor_maps(struct cxl_root_decoder *cxlrd, u64 addr)
|
||||
{
|
||||
struct cxl_cxims_data *cximsd = cxlrd->platform_data;
|
||||
int hbiw = cxlrd->cxlsd.nr_targets;
|
||||
struct cxl_cxims_data *cximsd;
|
||||
|
||||
return cxl_do_xormap_calc(cximsd, addr, cxlrd->cxlsd.nr_targets);
|
||||
/* No xormaps for host bridge interleave ways of 1 or 3 */
|
||||
if (hbiw == 1 || hbiw == 3)
|
||||
return addr;
|
||||
|
||||
cximsd = cxlrd->platform_data;
|
||||
|
||||
return cxl_do_xormap_calc(cximsd, addr, hbiw);
|
||||
}
|
||||
|
||||
struct cxl_cxims_context {
|
||||
|
||||
@@ -403,7 +403,7 @@ static int __cxl_dpa_reserve(struct cxl_endpoint_decoder *cxled,
|
||||
* is not set.
|
||||
*/
|
||||
if (cxled->part < 0)
|
||||
for (int i = 0; cxlds->nr_partitions; i++)
|
||||
for (int i = 0; i < cxlds->nr_partitions; i++)
|
||||
if (resource_contains(&cxlds->part[i].res, res)) {
|
||||
cxled->part = i;
|
||||
break;
|
||||
@@ -530,7 +530,7 @@ resource_size_t cxl_dpa_size(struct cxl_endpoint_decoder *cxled)
|
||||
|
||||
resource_size_t cxl_dpa_resource_start(struct cxl_endpoint_decoder *cxled)
|
||||
{
|
||||
resource_size_t base = -1;
|
||||
resource_size_t base = RESOURCE_SIZE_MAX;
|
||||
|
||||
lockdep_assert_held(&cxl_rwsem.dpa);
|
||||
if (cxled->dpa_res)
|
||||
|
||||
@@ -1590,7 +1590,7 @@ static int update_decoder_targets(struct device *dev, void *data)
|
||||
cxlsd->target[i] = dport;
|
||||
dev_dbg(dev, "dport%d found in target list, index %d\n",
|
||||
dport->port_id, i);
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -759,7 +759,7 @@ static ssize_t extended_linear_cache_size_show(struct device *dev,
|
||||
ACQUIRE(rwsem_read_intr, rwsem)(&cxl_rwsem.region);
|
||||
if ((rc = ACQUIRE_ERR(rwsem_read_intr, &rwsem)))
|
||||
return rc;
|
||||
return sysfs_emit(buf, "%#llx\n", p->cache_size);
|
||||
return sysfs_emit(buf, "%pap\n", &p->cache_size);
|
||||
}
|
||||
static DEVICE_ATTR_RO(extended_linear_cache_size);
|
||||
|
||||
@@ -3118,7 +3118,7 @@ u64 cxl_dpa_to_hpa(struct cxl_region *cxlr, const struct cxl_memdev *cxlmd,
|
||||
struct cxl_root_decoder *cxlrd = to_cxl_root_decoder(cxlr->dev.parent);
|
||||
struct cxl_region_params *p = &cxlr->params;
|
||||
struct cxl_endpoint_decoder *cxled = NULL;
|
||||
u64 dpa_offset, hpa_offset, hpa;
|
||||
u64 base, dpa_offset, hpa_offset, hpa;
|
||||
u16 eig = 0;
|
||||
u8 eiw = 0;
|
||||
int pos;
|
||||
@@ -3136,8 +3136,14 @@ u64 cxl_dpa_to_hpa(struct cxl_region *cxlr, const struct cxl_memdev *cxlmd,
|
||||
ways_to_eiw(p->interleave_ways, &eiw);
|
||||
granularity_to_eig(p->interleave_granularity, &eig);
|
||||
|
||||
dpa_offset = dpa - cxl_dpa_resource_start(cxled);
|
||||
base = cxl_dpa_resource_start(cxled);
|
||||
if (base == RESOURCE_SIZE_MAX)
|
||||
return ULLONG_MAX;
|
||||
|
||||
dpa_offset = dpa - base;
|
||||
hpa_offset = cxl_calculate_hpa_offset(dpa_offset, pos, eiw, eig);
|
||||
if (hpa_offset == ULLONG_MAX)
|
||||
return ULLONG_MAX;
|
||||
|
||||
/* Apply the hpa_offset to the region base address */
|
||||
hpa = hpa_offset + p->res->start + p->cache_size;
|
||||
@@ -3146,6 +3152,9 @@ u64 cxl_dpa_to_hpa(struct cxl_region *cxlr, const struct cxl_memdev *cxlmd,
|
||||
if (cxlrd->ops.hpa_to_spa)
|
||||
hpa = cxlrd->ops.hpa_to_spa(cxlrd, hpa);
|
||||
|
||||
if (hpa == ULLONG_MAX)
|
||||
return ULLONG_MAX;
|
||||
|
||||
if (!cxl_resource_contains_addr(p->res, hpa)) {
|
||||
dev_dbg(&cxlr->dev,
|
||||
"Addr trans fail: hpa 0x%llx not in region\n", hpa);
|
||||
@@ -3170,7 +3179,8 @@ static int region_offset_to_dpa_result(struct cxl_region *cxlr, u64 offset,
|
||||
struct cxl_region_params *p = &cxlr->params;
|
||||
struct cxl_root_decoder *cxlrd = to_cxl_root_decoder(cxlr->dev.parent);
|
||||
struct cxl_endpoint_decoder *cxled;
|
||||
u64 hpa, hpa_offset, dpa_offset;
|
||||
u64 hpa_offset = offset;
|
||||
u64 dpa, dpa_offset;
|
||||
u16 eig = 0;
|
||||
u8 eiw = 0;
|
||||
int pos;
|
||||
@@ -3187,10 +3197,13 @@ static int region_offset_to_dpa_result(struct cxl_region *cxlr, u64 offset,
|
||||
* CXL HPA is assumed to equal SPA.
|
||||
*/
|
||||
if (cxlrd->ops.spa_to_hpa) {
|
||||
hpa = cxlrd->ops.spa_to_hpa(cxlrd, p->res->start + offset);
|
||||
hpa_offset = hpa - p->res->start;
|
||||
} else {
|
||||
hpa_offset = offset;
|
||||
hpa_offset = cxlrd->ops.spa_to_hpa(cxlrd, p->res->start + offset);
|
||||
if (hpa_offset == ULLONG_MAX) {
|
||||
dev_dbg(&cxlr->dev, "HPA not found for %pr offset %#llx\n",
|
||||
p->res, offset);
|
||||
return -ENXIO;
|
||||
}
|
||||
hpa_offset -= p->res->start;
|
||||
}
|
||||
|
||||
pos = cxl_calculate_position(hpa_offset, eiw, eig);
|
||||
@@ -3207,8 +3220,13 @@ static int region_offset_to_dpa_result(struct cxl_region *cxlr, u64 offset,
|
||||
cxled = p->targets[i];
|
||||
if (cxled->pos != pos)
|
||||
continue;
|
||||
|
||||
dpa = cxl_dpa_resource_start(cxled);
|
||||
if (dpa != RESOURCE_SIZE_MAX)
|
||||
dpa += dpa_offset;
|
||||
|
||||
result->cxlmd = cxled_to_memdev(cxled);
|
||||
result->dpa = cxl_dpa_resource_start(cxled) + dpa_offset;
|
||||
result->dpa = dpa;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -67,14 +67,16 @@ struct dev_dax_range {
|
||||
/**
|
||||
* struct dev_dax - instance data for a subdivision of a dax region, and
|
||||
* data while the device is activated in the driver.
|
||||
* @region - parent region
|
||||
* @dax_dev - core dax functionality
|
||||
* @region: parent region
|
||||
* @dax_dev: core dax functionality
|
||||
* @align: alignment of this instance
|
||||
* @target_node: effective numa node if dev_dax memory range is onlined
|
||||
* @dyn_id: is this a dynamic or statically created instance
|
||||
* @id: ida allocated id when the dax_region is not static
|
||||
* @ida: mapping id allocator
|
||||
* @dev - device core
|
||||
* @pgmap - pgmap for memmap setup / lifetime (driver owned)
|
||||
* @dev: device core
|
||||
* @pgmap: pgmap for memmap setup / lifetime (driver owned)
|
||||
* @memmap_on_memory: allow kmem to put the memmap in the memory
|
||||
* @nr_range: size of @ranges
|
||||
* @ranges: range tuples of memory used
|
||||
*/
|
||||
|
||||
@@ -936,6 +936,7 @@ static void admac_remove(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
static const struct of_device_id admac_of_match[] = {
|
||||
{ .compatible = "apple,t8103-admac", },
|
||||
{ .compatible = "apple,admac", },
|
||||
{ }
|
||||
};
|
||||
|
||||
@@ -1765,6 +1765,7 @@ static int atc_alloc_chan_resources(struct dma_chan *chan)
|
||||
static void atc_free_chan_resources(struct dma_chan *chan)
|
||||
{
|
||||
struct at_dma_chan *atchan = to_at_dma_chan(chan);
|
||||
struct at_dma_slave *atslave;
|
||||
|
||||
BUG_ON(atc_chan_is_enabled(atchan));
|
||||
|
||||
@@ -1774,8 +1775,12 @@ static void atc_free_chan_resources(struct dma_chan *chan)
|
||||
/*
|
||||
* Free atslave allocated in at_dma_xlate()
|
||||
*/
|
||||
kfree(chan->private);
|
||||
chan->private = NULL;
|
||||
atslave = chan->private;
|
||||
if (atslave) {
|
||||
put_device(atslave->dma_dev);
|
||||
kfree(atslave);
|
||||
chan->private = NULL;
|
||||
}
|
||||
|
||||
dev_vdbg(chan2dev(chan), "free_chan_resources: done\n");
|
||||
}
|
||||
|
||||
@@ -1699,7 +1699,7 @@ static int sba_probe(struct platform_device *pdev)
|
||||
/* Prealloc channel resource */
|
||||
ret = sba_prealloc_channel_resources(sba);
|
||||
if (ret)
|
||||
goto fail_free_mchan;
|
||||
goto fail_put_mbox;
|
||||
|
||||
/* Check availability of debugfs */
|
||||
if (!debugfs_initialized())
|
||||
@@ -1729,6 +1729,8 @@ skip_debugfs:
|
||||
fail_free_resources:
|
||||
debugfs_remove_recursive(sba->root);
|
||||
sba_freeup_channel_resources(sba);
|
||||
fail_put_mbox:
|
||||
put_device(sba->mbox_dev);
|
||||
fail_free_mchan:
|
||||
mbox_free_channel(sba->mchan);
|
||||
return ret;
|
||||
@@ -1744,6 +1746,8 @@ static void sba_remove(struct platform_device *pdev)
|
||||
|
||||
sba_freeup_channel_resources(sba);
|
||||
|
||||
put_device(sba->mbox_dev);
|
||||
|
||||
mbox_free_channel(sba->mchan);
|
||||
}
|
||||
|
||||
|
||||
@@ -102,11 +102,11 @@ static void *cv1800_dmamux_route_allocate(struct of_phandle_args *dma_spec,
|
||||
struct llist_node *node;
|
||||
unsigned long flags;
|
||||
unsigned int chid, devid, cpuid;
|
||||
int ret;
|
||||
int ret = -EINVAL;
|
||||
|
||||
if (dma_spec->args_count != DMAMUX_NCELLS) {
|
||||
dev_err(&pdev->dev, "invalid number of dma mux args\n");
|
||||
return ERR_PTR(-EINVAL);
|
||||
goto err_put_pdev;
|
||||
}
|
||||
|
||||
devid = dma_spec->args[0];
|
||||
@@ -115,18 +115,18 @@ static void *cv1800_dmamux_route_allocate(struct of_phandle_args *dma_spec,
|
||||
|
||||
if (devid > MAX_DMA_MAPPING_ID) {
|
||||
dev_err(&pdev->dev, "invalid device id: %u\n", devid);
|
||||
return ERR_PTR(-EINVAL);
|
||||
goto err_put_pdev;
|
||||
}
|
||||
|
||||
if (cpuid > MAX_DMA_CPU_ID) {
|
||||
dev_err(&pdev->dev, "invalid cpu id: %u\n", cpuid);
|
||||
return ERR_PTR(-EINVAL);
|
||||
goto err_put_pdev;
|
||||
}
|
||||
|
||||
dma_spec->np = of_parse_phandle(ofdma->of_node, "dma-masters", 0);
|
||||
if (!dma_spec->np) {
|
||||
dev_err(&pdev->dev, "can't get dma master\n");
|
||||
return ERR_PTR(-EINVAL);
|
||||
goto err_put_pdev;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&dmamux->lock, flags);
|
||||
@@ -136,8 +136,6 @@ static void *cv1800_dmamux_route_allocate(struct of_phandle_args *dma_spec,
|
||||
if (map->peripheral == devid && map->cpu == cpuid)
|
||||
goto found;
|
||||
}
|
||||
|
||||
ret = -EINVAL;
|
||||
goto failed;
|
||||
} else {
|
||||
node = llist_del_first(&dmamux->free_maps);
|
||||
@@ -171,12 +169,17 @@ found:
|
||||
dev_dbg(&pdev->dev, "register channel %u for req %u (cpu %u)\n",
|
||||
chid, devid, cpuid);
|
||||
|
||||
put_device(&pdev->dev);
|
||||
|
||||
return map;
|
||||
|
||||
failed:
|
||||
spin_unlock_irqrestore(&dmamux->lock, flags);
|
||||
of_node_put(dma_spec->np);
|
||||
dev_err(&pdev->dev, "errno %d\n", ret);
|
||||
err_put_pdev:
|
||||
put_device(&pdev->dev);
|
||||
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
|
||||
@@ -90,7 +90,7 @@ static void *rzn1_dmamux_route_allocate(struct of_phandle_args *dma_spec,
|
||||
|
||||
if (test_and_set_bit(map->req_idx, dmamux->used_chans)) {
|
||||
ret = -EBUSY;
|
||||
goto free_map;
|
||||
goto put_dma_spec_np;
|
||||
}
|
||||
|
||||
mask = BIT(map->req_idx);
|
||||
@@ -103,6 +103,8 @@ static void *rzn1_dmamux_route_allocate(struct of_phandle_args *dma_spec,
|
||||
|
||||
clear_bitmap:
|
||||
clear_bit(map->req_idx, dmamux->used_chans);
|
||||
put_dma_spec_np:
|
||||
of_node_put(dma_spec->np);
|
||||
free_map:
|
||||
kfree(map);
|
||||
put_device:
|
||||
|
||||
@@ -873,6 +873,7 @@ err_errirq:
|
||||
free_irq(fsl_chan->txirq, fsl_chan);
|
||||
err_txirq:
|
||||
dma_pool_destroy(fsl_chan->tcd_pool);
|
||||
clk_disable_unprepare(fsl_chan->clk);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -20,11 +20,16 @@ static ssize_t unbind_store(struct device_driver *drv, const char *buf, size_t c
|
||||
int rc = -ENODEV;
|
||||
|
||||
dev = bus_find_device_by_name(bus, NULL, buf);
|
||||
if (dev && dev->driver) {
|
||||
if (!dev)
|
||||
return -ENODEV;
|
||||
|
||||
if (dev->driver) {
|
||||
device_driver_detach(dev);
|
||||
rc = count;
|
||||
}
|
||||
|
||||
put_device(dev);
|
||||
|
||||
return rc;
|
||||
}
|
||||
static DRIVER_ATTR_IGNORE_LOCKDEP(unbind, 0200, NULL, unbind_store);
|
||||
@@ -38,9 +43,12 @@ static ssize_t bind_store(struct device_driver *drv, const char *buf, size_t cou
|
||||
struct idxd_dev *idxd_dev;
|
||||
|
||||
dev = bus_find_device_by_name(bus, NULL, buf);
|
||||
if (!dev || dev->driver || drv != &dsa_drv.drv)
|
||||
if (!dev)
|
||||
return -ENODEV;
|
||||
|
||||
if (dev->driver || drv != &dsa_drv.drv)
|
||||
goto err_put_dev;
|
||||
|
||||
idxd_dev = confdev_to_idxd_dev(dev);
|
||||
if (is_idxd_dev(idxd_dev)) {
|
||||
alt_drv = driver_find("idxd", bus);
|
||||
@@ -53,13 +61,20 @@ static ssize_t bind_store(struct device_driver *drv, const char *buf, size_t cou
|
||||
alt_drv = driver_find("user", bus);
|
||||
}
|
||||
if (!alt_drv)
|
||||
return -ENODEV;
|
||||
goto err_put_dev;
|
||||
|
||||
rc = device_driver_attach(alt_drv, dev);
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
goto err_put_dev;
|
||||
|
||||
put_device(dev);
|
||||
|
||||
return count;
|
||||
|
||||
err_put_dev:
|
||||
put_device(dev);
|
||||
|
||||
return rc;
|
||||
}
|
||||
static DRIVER_ATTR_IGNORE_LOCKDEP(bind, 0200, NULL, bind_store);
|
||||
|
||||
|
||||
@@ -57,30 +57,31 @@ static void *lpc18xx_dmamux_reserve(struct of_phandle_args *dma_spec,
|
||||
struct lpc18xx_dmamux_data *dmamux = platform_get_drvdata(pdev);
|
||||
unsigned long flags;
|
||||
unsigned mux;
|
||||
int ret = -EINVAL;
|
||||
|
||||
if (dma_spec->args_count != 3) {
|
||||
dev_err(&pdev->dev, "invalid number of dma mux args\n");
|
||||
return ERR_PTR(-EINVAL);
|
||||
goto err_put_pdev;
|
||||
}
|
||||
|
||||
mux = dma_spec->args[0];
|
||||
if (mux >= dmamux->dma_master_requests) {
|
||||
dev_err(&pdev->dev, "invalid mux number: %d\n",
|
||||
dma_spec->args[0]);
|
||||
return ERR_PTR(-EINVAL);
|
||||
goto err_put_pdev;
|
||||
}
|
||||
|
||||
if (dma_spec->args[1] > LPC18XX_DMAMUX_MAX_VAL) {
|
||||
dev_err(&pdev->dev, "invalid dma mux value: %d\n",
|
||||
dma_spec->args[1]);
|
||||
return ERR_PTR(-EINVAL);
|
||||
goto err_put_pdev;
|
||||
}
|
||||
|
||||
/* The of_node_put() will be done in the core for the node */
|
||||
dma_spec->np = of_parse_phandle(ofdma->of_node, "dma-masters", 0);
|
||||
if (!dma_spec->np) {
|
||||
dev_err(&pdev->dev, "can't get dma master\n");
|
||||
return ERR_PTR(-EINVAL);
|
||||
goto err_put_pdev;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&dmamux->lock, flags);
|
||||
@@ -89,7 +90,8 @@ static void *lpc18xx_dmamux_reserve(struct of_phandle_args *dma_spec,
|
||||
dev_err(&pdev->dev, "dma request %u busy with %u.%u\n",
|
||||
mux, mux, dmamux->muxes[mux].value);
|
||||
of_node_put(dma_spec->np);
|
||||
return ERR_PTR(-EBUSY);
|
||||
ret = -EBUSY;
|
||||
goto err_put_pdev;
|
||||
}
|
||||
|
||||
dmamux->muxes[mux].busy = true;
|
||||
@@ -106,7 +108,14 @@ static void *lpc18xx_dmamux_reserve(struct of_phandle_args *dma_spec,
|
||||
dev_dbg(&pdev->dev, "mapping dmamux %u.%u to dma request %u\n", mux,
|
||||
dmamux->muxes[mux].value, mux);
|
||||
|
||||
put_device(&pdev->dev);
|
||||
|
||||
return &dmamux->muxes[mux];
|
||||
|
||||
err_put_pdev:
|
||||
put_device(&pdev->dev);
|
||||
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
static int lpc18xx_dmamux_probe(struct platform_device *pdev)
|
||||
|
||||
@@ -95,11 +95,12 @@ static void *lpc32xx_dmamux_reserve(struct of_phandle_args *dma_spec,
|
||||
struct lpc32xx_dmamux_data *dmamux = platform_get_drvdata(pdev);
|
||||
unsigned long flags;
|
||||
struct lpc32xx_dmamux *mux = NULL;
|
||||
int ret = -EINVAL;
|
||||
int i;
|
||||
|
||||
if (dma_spec->args_count != 3) {
|
||||
dev_err(&pdev->dev, "invalid number of dma mux args\n");
|
||||
return ERR_PTR(-EINVAL);
|
||||
goto err_put_pdev;
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(lpc32xx_muxes); i++) {
|
||||
@@ -111,20 +112,20 @@ static void *lpc32xx_dmamux_reserve(struct of_phandle_args *dma_spec,
|
||||
if (!mux) {
|
||||
dev_err(&pdev->dev, "invalid mux request number: %d\n",
|
||||
dma_spec->args[0]);
|
||||
return ERR_PTR(-EINVAL);
|
||||
goto err_put_pdev;
|
||||
}
|
||||
|
||||
if (dma_spec->args[2] > 1) {
|
||||
dev_err(&pdev->dev, "invalid dma mux value: %d\n",
|
||||
dma_spec->args[1]);
|
||||
return ERR_PTR(-EINVAL);
|
||||
goto err_put_pdev;
|
||||
}
|
||||
|
||||
/* The of_node_put() will be done in the core for the node */
|
||||
dma_spec->np = of_parse_phandle(ofdma->of_node, "dma-masters", 0);
|
||||
if (!dma_spec->np) {
|
||||
dev_err(&pdev->dev, "can't get dma master\n");
|
||||
return ERR_PTR(-EINVAL);
|
||||
goto err_put_pdev;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&dmamux->lock, flags);
|
||||
@@ -133,7 +134,8 @@ static void *lpc32xx_dmamux_reserve(struct of_phandle_args *dma_spec,
|
||||
dev_err(dev, "dma request signal %d busy, routed to %s\n",
|
||||
mux->signal, mux->muxval ? mux->name_sel1 : mux->name_sel1);
|
||||
of_node_put(dma_spec->np);
|
||||
return ERR_PTR(-EBUSY);
|
||||
ret = -EBUSY;
|
||||
goto err_put_pdev;
|
||||
}
|
||||
|
||||
mux->busy = true;
|
||||
@@ -148,7 +150,14 @@ static void *lpc32xx_dmamux_reserve(struct of_phandle_args *dma_spec,
|
||||
dev_dbg(dev, "dma request signal %d routed to %s\n",
|
||||
mux->signal, mux->muxval ? mux->name_sel1 : mux->name_sel1);
|
||||
|
||||
put_device(&pdev->dev);
|
||||
|
||||
return mux;
|
||||
|
||||
err_put_pdev:
|
||||
put_device(&pdev->dev);
|
||||
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
static int lpc32xx_dmamux_probe(struct platform_device *pdev)
|
||||
|
||||
@@ -152,8 +152,8 @@ struct mmp_pdma_phy {
|
||||
*
|
||||
* Controller Configuration:
|
||||
* @run_bits: Control bits in DCSR register for channel start/stop
|
||||
* @dma_mask: DMA addressing capability of controller. 0 to use OF/platform
|
||||
* settings, or explicit mask like DMA_BIT_MASK(32/64)
|
||||
* @dma_width: DMA addressing width in bits (32 or 64). Determines the
|
||||
* DMA mask capability of the controller hardware.
|
||||
*/
|
||||
struct mmp_pdma_ops {
|
||||
/* Hardware Register Operations */
|
||||
@@ -173,7 +173,7 @@ struct mmp_pdma_ops {
|
||||
|
||||
/* Controller Configuration */
|
||||
u32 run_bits;
|
||||
u64 dma_mask;
|
||||
u32 dma_width;
|
||||
};
|
||||
|
||||
struct mmp_pdma_device {
|
||||
@@ -928,6 +928,7 @@ static unsigned int mmp_pdma_residue(struct mmp_pdma_chan *chan,
|
||||
{
|
||||
struct mmp_pdma_desc_sw *sw;
|
||||
struct mmp_pdma_device *pdev = to_mmp_pdma_dev(chan->chan.device);
|
||||
unsigned long flags;
|
||||
u64 curr;
|
||||
u32 residue = 0;
|
||||
bool passed = false;
|
||||
@@ -945,6 +946,8 @@ static unsigned int mmp_pdma_residue(struct mmp_pdma_chan *chan,
|
||||
else
|
||||
curr = pdev->ops->read_src_addr(chan->phy);
|
||||
|
||||
spin_lock_irqsave(&chan->desc_lock, flags);
|
||||
|
||||
list_for_each_entry(sw, &chan->chain_running, node) {
|
||||
u64 start, end;
|
||||
u32 len;
|
||||
@@ -989,6 +992,7 @@ static unsigned int mmp_pdma_residue(struct mmp_pdma_chan *chan,
|
||||
continue;
|
||||
|
||||
if (sw->async_tx.cookie == cookie) {
|
||||
spin_unlock_irqrestore(&chan->desc_lock, flags);
|
||||
return residue;
|
||||
} else {
|
||||
residue = 0;
|
||||
@@ -996,6 +1000,8 @@ static unsigned int mmp_pdma_residue(struct mmp_pdma_chan *chan,
|
||||
}
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&chan->desc_lock, flags);
|
||||
|
||||
/* We should only get here in case of cyclic transactions */
|
||||
return residue;
|
||||
}
|
||||
@@ -1172,7 +1178,7 @@ static const struct mmp_pdma_ops marvell_pdma_v1_ops = {
|
||||
.get_desc_src_addr = get_desc_src_addr_32,
|
||||
.get_desc_dst_addr = get_desc_dst_addr_32,
|
||||
.run_bits = (DCSR_RUN),
|
||||
.dma_mask = 0, /* let OF/platform set DMA mask */
|
||||
.dma_width = 32,
|
||||
};
|
||||
|
||||
static const struct mmp_pdma_ops spacemit_k1_pdma_ops = {
|
||||
@@ -1185,7 +1191,7 @@ static const struct mmp_pdma_ops spacemit_k1_pdma_ops = {
|
||||
.get_desc_src_addr = get_desc_src_addr_64,
|
||||
.get_desc_dst_addr = get_desc_dst_addr_64,
|
||||
.run_bits = (DCSR_RUN | DCSR_LPAEEN),
|
||||
.dma_mask = DMA_BIT_MASK(64), /* force 64-bit DMA addr capability */
|
||||
.dma_width = 64,
|
||||
};
|
||||
|
||||
static const struct of_device_id mmp_pdma_dt_ids[] = {
|
||||
@@ -1314,13 +1320,9 @@ static int mmp_pdma_probe(struct platform_device *op)
|
||||
pdev->device.directions = BIT(DMA_MEM_TO_DEV) | BIT(DMA_DEV_TO_MEM);
|
||||
pdev->device.residue_granularity = DMA_RESIDUE_GRANULARITY_DESCRIPTOR;
|
||||
|
||||
/* Set DMA mask based on ops->dma_mask, or OF/platform */
|
||||
if (pdev->ops->dma_mask)
|
||||
dma_set_mask(pdev->dev, pdev->ops->dma_mask);
|
||||
else if (pdev->dev->coherent_dma_mask)
|
||||
dma_set_mask(pdev->dev, pdev->dev->coherent_dma_mask);
|
||||
else
|
||||
dma_set_mask(pdev->dev, DMA_BIT_MASK(64));
|
||||
/* Set DMA mask based on controller hardware capabilities */
|
||||
dma_set_mask_and_coherent(pdev->dev,
|
||||
DMA_BIT_MASK(pdev->ops->dma_width));
|
||||
|
||||
ret = dma_async_device_register(&pdev->device);
|
||||
if (ret) {
|
||||
|
||||
@@ -1605,14 +1605,16 @@ static int
|
||||
gpi_peripheral_config(struct dma_chan *chan, struct dma_slave_config *config)
|
||||
{
|
||||
struct gchan *gchan = to_gchan(chan);
|
||||
void *new_config;
|
||||
|
||||
if (!config->peripheral_config)
|
||||
return -EINVAL;
|
||||
|
||||
gchan->config = krealloc(gchan->config, config->peripheral_size, GFP_NOWAIT);
|
||||
if (!gchan->config)
|
||||
new_config = krealloc(gchan->config, config->peripheral_size, GFP_NOWAIT);
|
||||
if (!new_config)
|
||||
return -ENOMEM;
|
||||
|
||||
gchan->config = new_config;
|
||||
memcpy(gchan->config, config->peripheral_config, config->peripheral_size);
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -557,11 +557,16 @@ rz_dmac_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,
|
||||
static int rz_dmac_terminate_all(struct dma_chan *chan)
|
||||
{
|
||||
struct rz_dmac_chan *channel = to_rz_dmac_chan(chan);
|
||||
struct rz_lmdesc *lmdesc = channel->lmdesc.base;
|
||||
unsigned long flags;
|
||||
unsigned int i;
|
||||
LIST_HEAD(head);
|
||||
|
||||
rz_dmac_disable_hw(channel);
|
||||
spin_lock_irqsave(&channel->vc.lock, flags);
|
||||
for (i = 0; i < DMAC_NR_LMDESC; i++)
|
||||
lmdesc[i].header = 0;
|
||||
|
||||
list_splice_tail_init(&channel->ld_active, &channel->ld_free);
|
||||
list_splice_tail_init(&channel->ld_queue, &channel->ld_free);
|
||||
vchan_get_all_descriptors(&channel->vc, &head);
|
||||
@@ -854,6 +859,13 @@ static int rz_dmac_chan_probe(struct rz_dmac *dmac,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void rz_dmac_put_device(void *_dev)
|
||||
{
|
||||
struct device *dev = _dev;
|
||||
|
||||
put_device(dev);
|
||||
}
|
||||
|
||||
static int rz_dmac_parse_of_icu(struct device *dev, struct rz_dmac *dmac)
|
||||
{
|
||||
struct device_node *np = dev->of_node;
|
||||
@@ -876,6 +888,10 @@ static int rz_dmac_parse_of_icu(struct device *dev, struct rz_dmac *dmac)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
ret = devm_add_action_or_reset(dev, rz_dmac_put_device, &dmac->icu.pdev->dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
dmac_index = args.args[0];
|
||||
if (dmac_index > RZV2H_MAX_DMAC_INDEX) {
|
||||
dev_err(dev, "DMAC index %u invalid.\n", dmac_index);
|
||||
@@ -1055,8 +1071,6 @@ static void rz_dmac_remove(struct platform_device *pdev)
|
||||
reset_control_assert(dmac->rstc);
|
||||
pm_runtime_put(&pdev->dev);
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
|
||||
platform_device_put(dmac->icu.pdev);
|
||||
}
|
||||
|
||||
static const struct of_device_id of_rz_dmac_match[] = {
|
||||
|
||||
@@ -90,23 +90,25 @@ static void *stm32_dmamux_route_allocate(struct of_phandle_args *dma_spec,
|
||||
struct stm32_dmamux_data *dmamux = platform_get_drvdata(pdev);
|
||||
struct stm32_dmamux *mux;
|
||||
u32 i, min, max;
|
||||
int ret;
|
||||
int ret = -EINVAL;
|
||||
unsigned long flags;
|
||||
|
||||
if (dma_spec->args_count != 3) {
|
||||
dev_err(&pdev->dev, "invalid number of dma mux args\n");
|
||||
return ERR_PTR(-EINVAL);
|
||||
goto err_put_pdev;
|
||||
}
|
||||
|
||||
if (dma_spec->args[0] > dmamux->dmamux_requests) {
|
||||
dev_err(&pdev->dev, "invalid mux request number: %d\n",
|
||||
dma_spec->args[0]);
|
||||
return ERR_PTR(-EINVAL);
|
||||
goto err_put_pdev;
|
||||
}
|
||||
|
||||
mux = kzalloc(sizeof(*mux), GFP_KERNEL);
|
||||
if (!mux)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
if (!mux) {
|
||||
ret = -ENOMEM;
|
||||
goto err_put_pdev;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&dmamux->lock, flags);
|
||||
mux->chan_id = find_first_zero_bit(dmamux->dma_inuse,
|
||||
@@ -116,7 +118,7 @@ static void *stm32_dmamux_route_allocate(struct of_phandle_args *dma_spec,
|
||||
spin_unlock_irqrestore(&dmamux->lock, flags);
|
||||
dev_err(&pdev->dev, "Run out of free DMA requests\n");
|
||||
ret = -ENOMEM;
|
||||
goto error_chan_id;
|
||||
goto err_free_mux;
|
||||
}
|
||||
set_bit(mux->chan_id, dmamux->dma_inuse);
|
||||
spin_unlock_irqrestore(&dmamux->lock, flags);
|
||||
@@ -133,8 +135,7 @@ static void *stm32_dmamux_route_allocate(struct of_phandle_args *dma_spec,
|
||||
dma_spec->np = of_parse_phandle(ofdma->of_node, "dma-masters", i - 1);
|
||||
if (!dma_spec->np) {
|
||||
dev_err(&pdev->dev, "can't get dma master\n");
|
||||
ret = -EINVAL;
|
||||
goto error;
|
||||
goto err_clear_inuse;
|
||||
}
|
||||
|
||||
/* Set dma request */
|
||||
@@ -142,7 +143,7 @@ static void *stm32_dmamux_route_allocate(struct of_phandle_args *dma_spec,
|
||||
ret = pm_runtime_resume_and_get(&pdev->dev);
|
||||
if (ret < 0) {
|
||||
spin_unlock_irqrestore(&dmamux->lock, flags);
|
||||
goto error;
|
||||
goto err_put_dma_spec_np;
|
||||
}
|
||||
spin_unlock_irqrestore(&dmamux->lock, flags);
|
||||
|
||||
@@ -160,13 +161,19 @@ static void *stm32_dmamux_route_allocate(struct of_phandle_args *dma_spec,
|
||||
dev_dbg(&pdev->dev, "Mapping DMAMUX(%u) to DMA%u(%u)\n",
|
||||
mux->request, mux->master, mux->chan_id);
|
||||
|
||||
put_device(&pdev->dev);
|
||||
|
||||
return mux;
|
||||
|
||||
error:
|
||||
err_put_dma_spec_np:
|
||||
of_node_put(dma_spec->np);
|
||||
err_clear_inuse:
|
||||
clear_bit(mux->chan_id, dmamux->dma_inuse);
|
||||
|
||||
error_chan_id:
|
||||
err_free_mux:
|
||||
kfree(mux);
|
||||
err_put_pdev:
|
||||
put_device(&pdev->dev);
|
||||
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
|
||||
@@ -429,10 +429,17 @@ static void tegra_adma_stop(struct tegra_adma_chan *tdc)
|
||||
return;
|
||||
}
|
||||
|
||||
kfree(tdc->desc);
|
||||
vchan_terminate_vdesc(&tdc->desc->vd);
|
||||
tdc->desc = NULL;
|
||||
}
|
||||
|
||||
static void tegra_adma_synchronize(struct dma_chan *dc)
|
||||
{
|
||||
struct tegra_adma_chan *tdc = to_tegra_adma_chan(dc);
|
||||
|
||||
vchan_synchronize(&tdc->vc);
|
||||
}
|
||||
|
||||
static void tegra_adma_start(struct tegra_adma_chan *tdc)
|
||||
{
|
||||
struct virt_dma_desc *vd = vchan_next_desc(&tdc->vc);
|
||||
@@ -1155,6 +1162,7 @@ static int tegra_adma_probe(struct platform_device *pdev)
|
||||
tdma->dma_dev.device_config = tegra_adma_slave_config;
|
||||
tdma->dma_dev.device_tx_status = tegra_adma_tx_status;
|
||||
tdma->dma_dev.device_terminate_all = tegra_adma_terminate_all;
|
||||
tdma->dma_dev.device_synchronize = tegra_adma_synchronize;
|
||||
tdma->dma_dev.src_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_4_BYTES);
|
||||
tdma->dma_dev.dst_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_4_BYTES);
|
||||
tdma->dma_dev.directions = BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV);
|
||||
|
||||
@@ -79,34 +79,35 @@ static void *ti_am335x_xbar_route_allocate(struct of_phandle_args *dma_spec,
|
||||
{
|
||||
struct platform_device *pdev = of_find_device_by_node(ofdma->of_node);
|
||||
struct ti_am335x_xbar_data *xbar = platform_get_drvdata(pdev);
|
||||
struct ti_am335x_xbar_map *map;
|
||||
struct ti_am335x_xbar_map *map = ERR_PTR(-EINVAL);
|
||||
|
||||
if (dma_spec->args_count != 3)
|
||||
return ERR_PTR(-EINVAL);
|
||||
goto out_put_pdev;
|
||||
|
||||
if (dma_spec->args[2] >= xbar->xbar_events) {
|
||||
dev_err(&pdev->dev, "Invalid XBAR event number: %d\n",
|
||||
dma_spec->args[2]);
|
||||
return ERR_PTR(-EINVAL);
|
||||
goto out_put_pdev;
|
||||
}
|
||||
|
||||
if (dma_spec->args[0] >= xbar->dma_requests) {
|
||||
dev_err(&pdev->dev, "Invalid DMA request line number: %d\n",
|
||||
dma_spec->args[0]);
|
||||
return ERR_PTR(-EINVAL);
|
||||
goto out_put_pdev;
|
||||
}
|
||||
|
||||
/* The of_node_put() will be done in the core for the node */
|
||||
dma_spec->np = of_parse_phandle(ofdma->of_node, "dma-masters", 0);
|
||||
if (!dma_spec->np) {
|
||||
dev_err(&pdev->dev, "Can't get DMA master\n");
|
||||
return ERR_PTR(-EINVAL);
|
||||
goto out_put_pdev;
|
||||
}
|
||||
|
||||
map = kzalloc(sizeof(*map), GFP_KERNEL);
|
||||
if (!map) {
|
||||
of_node_put(dma_spec->np);
|
||||
return ERR_PTR(-ENOMEM);
|
||||
map = ERR_PTR(-ENOMEM);
|
||||
goto out_put_pdev;
|
||||
}
|
||||
|
||||
map->dma_line = (u16)dma_spec->args[0];
|
||||
@@ -120,6 +121,9 @@ static void *ti_am335x_xbar_route_allocate(struct of_phandle_args *dma_spec,
|
||||
|
||||
ti_am335x_xbar_write(xbar->iomem, map->dma_line, map->mux_val);
|
||||
|
||||
out_put_pdev:
|
||||
put_device(&pdev->dev);
|
||||
|
||||
return map;
|
||||
}
|
||||
|
||||
@@ -241,28 +245,26 @@ static void *ti_dra7_xbar_route_allocate(struct of_phandle_args *dma_spec,
|
||||
{
|
||||
struct platform_device *pdev = of_find_device_by_node(ofdma->of_node);
|
||||
struct ti_dra7_xbar_data *xbar = platform_get_drvdata(pdev);
|
||||
struct ti_dra7_xbar_map *map;
|
||||
struct ti_dra7_xbar_map *map = ERR_PTR(-EINVAL);
|
||||
|
||||
if (dma_spec->args[0] >= xbar->xbar_requests) {
|
||||
dev_err(&pdev->dev, "Invalid XBAR request number: %d\n",
|
||||
dma_spec->args[0]);
|
||||
put_device(&pdev->dev);
|
||||
return ERR_PTR(-EINVAL);
|
||||
goto out_put_pdev;
|
||||
}
|
||||
|
||||
/* The of_node_put() will be done in the core for the node */
|
||||
dma_spec->np = of_parse_phandle(ofdma->of_node, "dma-masters", 0);
|
||||
if (!dma_spec->np) {
|
||||
dev_err(&pdev->dev, "Can't get DMA master\n");
|
||||
put_device(&pdev->dev);
|
||||
return ERR_PTR(-EINVAL);
|
||||
goto out_put_pdev;
|
||||
}
|
||||
|
||||
map = kzalloc(sizeof(*map), GFP_KERNEL);
|
||||
if (!map) {
|
||||
of_node_put(dma_spec->np);
|
||||
put_device(&pdev->dev);
|
||||
return ERR_PTR(-ENOMEM);
|
||||
map = ERR_PTR(-ENOMEM);
|
||||
goto out_put_pdev;
|
||||
}
|
||||
|
||||
mutex_lock(&xbar->mutex);
|
||||
@@ -273,8 +275,8 @@ static void *ti_dra7_xbar_route_allocate(struct of_phandle_args *dma_spec,
|
||||
dev_err(&pdev->dev, "Run out of free DMA requests\n");
|
||||
kfree(map);
|
||||
of_node_put(dma_spec->np);
|
||||
put_device(&pdev->dev);
|
||||
return ERR_PTR(-ENOMEM);
|
||||
map = ERR_PTR(-ENOMEM);
|
||||
goto out_put_pdev;
|
||||
}
|
||||
set_bit(map->xbar_out, xbar->dma_inuse);
|
||||
mutex_unlock(&xbar->mutex);
|
||||
@@ -288,6 +290,9 @@ static void *ti_dra7_xbar_route_allocate(struct of_phandle_args *dma_spec,
|
||||
|
||||
ti_dra7_xbar_write(xbar->iomem, map->xbar_out, map->xbar_in);
|
||||
|
||||
out_put_pdev:
|
||||
put_device(&pdev->dev);
|
||||
|
||||
return map;
|
||||
}
|
||||
|
||||
|
||||
@@ -42,9 +42,9 @@ struct udma_dev *of_xudma_dev_get(struct device_node *np, const char *property)
|
||||
}
|
||||
|
||||
ud = platform_get_drvdata(pdev);
|
||||
put_device(&pdev->dev);
|
||||
if (!ud) {
|
||||
pr_debug("UDMA has not been probed\n");
|
||||
put_device(&pdev->dev);
|
||||
return ERR_PTR(-EPROBE_DEFER);
|
||||
}
|
||||
|
||||
|
||||
@@ -1808,6 +1808,8 @@ static int omap_dma_probe(struct platform_device *pdev)
|
||||
if (rc) {
|
||||
pr_warn("OMAP-DMA: failed to register slave DMA engine device: %d\n",
|
||||
rc);
|
||||
if (od->ll123_supported)
|
||||
dma_pool_destroy(od->desc_pool);
|
||||
omap_dma_free(od);
|
||||
return rc;
|
||||
}
|
||||
@@ -1823,6 +1825,8 @@ static int omap_dma_probe(struct platform_device *pdev)
|
||||
if (rc) {
|
||||
pr_warn("OMAP-DMA: failed to register DMA controller\n");
|
||||
dma_async_device_unregister(&od->ddev);
|
||||
if (od->ll123_supported)
|
||||
dma_pool_destroy(od->desc_pool);
|
||||
omap_dma_free(od);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
|
||||
/* The length of register space exposed to host */
|
||||
#define XDMA_REG_SPACE_LEN 65536
|
||||
#define XDMA_MAX_REG_OFFSET (XDMA_REG_SPACE_LEN - 4)
|
||||
|
||||
/*
|
||||
* maximum number of DMA channels for each direction:
|
||||
|
||||
@@ -38,7 +38,7 @@ static const struct regmap_config xdma_regmap_config = {
|
||||
.reg_bits = 32,
|
||||
.val_bits = 32,
|
||||
.reg_stride = 4,
|
||||
.max_register = XDMA_REG_SPACE_LEN,
|
||||
.max_register = XDMA_MAX_REG_OFFSET,
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -131,6 +131,7 @@
|
||||
#define XILINX_MCDMA_MAX_CHANS_PER_DEVICE 0x20
|
||||
#define XILINX_DMA_MAX_CHANS_PER_DEVICE 0x2
|
||||
#define XILINX_CDMA_MAX_CHANS_PER_DEVICE 0x1
|
||||
#define XILINX_DMA_DFAULT_ADDRWIDTH 0x20
|
||||
|
||||
#define XILINX_DMA_DMAXR_ALL_IRQ_MASK \
|
||||
(XILINX_DMA_DMASR_FRM_CNT_IRQ | \
|
||||
@@ -3159,7 +3160,7 @@ static int xilinx_dma_probe(struct platform_device *pdev)
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
struct xilinx_dma_device *xdev;
|
||||
struct device_node *child, *np = pdev->dev.of_node;
|
||||
u32 num_frames, addr_width, len_width;
|
||||
u32 num_frames, addr_width = XILINX_DMA_DFAULT_ADDRWIDTH, len_width;
|
||||
int i, err;
|
||||
|
||||
/* Allocate and initialize the DMA engine structure */
|
||||
@@ -3235,7 +3236,9 @@ static int xilinx_dma_probe(struct platform_device *pdev)
|
||||
|
||||
err = of_property_read_u32(node, "xlnx,addrwidth", &addr_width);
|
||||
if (err < 0)
|
||||
dev_warn(xdev->dev, "missing xlnx,addrwidth property\n");
|
||||
dev_warn(xdev->dev,
|
||||
"missing xlnx,addrwidth property, using default value %d\n",
|
||||
XILINX_DMA_DFAULT_ADDRWIDTH);
|
||||
|
||||
if (addr_width > 32)
|
||||
xdev->ext_addr = true;
|
||||
|
||||
@@ -83,10 +83,8 @@ dpll_xa_ref_pin_add(struct xarray *xa_pins, struct dpll_pin *pin,
|
||||
if (ref->pin != pin)
|
||||
continue;
|
||||
reg = dpll_pin_registration_find(ref, ops, priv, cookie);
|
||||
if (reg) {
|
||||
refcount_inc(&ref->refcount);
|
||||
return 0;
|
||||
}
|
||||
if (reg)
|
||||
return -EEXIST;
|
||||
ref_exists = true;
|
||||
break;
|
||||
}
|
||||
@@ -164,10 +162,8 @@ dpll_xa_ref_dpll_add(struct xarray *xa_dplls, struct dpll_device *dpll,
|
||||
if (ref->dpll != dpll)
|
||||
continue;
|
||||
reg = dpll_pin_registration_find(ref, ops, priv, cookie);
|
||||
if (reg) {
|
||||
refcount_inc(&ref->refcount);
|
||||
return 0;
|
||||
}
|
||||
if (reg)
|
||||
return -EEXIST;
|
||||
ref_exists = true;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -358,10 +358,11 @@ static int i3200_probe1(struct pci_dev *pdev, int dev_idx)
|
||||
layers[1].type = EDAC_MC_LAYER_CHANNEL;
|
||||
layers[1].size = nr_channels;
|
||||
layers[1].is_virt_csrow = false;
|
||||
mci = edac_mc_alloc(0, ARRAY_SIZE(layers), layers,
|
||||
sizeof(struct i3200_priv));
|
||||
|
||||
rc = -ENOMEM;
|
||||
mci = edac_mc_alloc(0, ARRAY_SIZE(layers), layers, sizeof(struct i3200_priv));
|
||||
if (!mci)
|
||||
return -ENOMEM;
|
||||
goto unmap;
|
||||
|
||||
edac_dbg(3, "MC: init mci\n");
|
||||
|
||||
@@ -421,9 +422,9 @@ static int i3200_probe1(struct pci_dev *pdev, int dev_idx)
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
edac_mc_free(mci);
|
||||
unmap:
|
||||
iounmap(window);
|
||||
if (mci)
|
||||
edac_mc_free(mci);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -341,9 +341,12 @@ static int x38_probe1(struct pci_dev *pdev, int dev_idx)
|
||||
layers[1].type = EDAC_MC_LAYER_CHANNEL;
|
||||
layers[1].size = x38_channel_num;
|
||||
layers[1].is_virt_csrow = false;
|
||||
|
||||
|
||||
rc = -ENOMEM;
|
||||
mci = edac_mc_alloc(0, ARRAY_SIZE(layers), layers, 0);
|
||||
if (!mci)
|
||||
return -ENOMEM;
|
||||
goto unmap;
|
||||
|
||||
edac_dbg(3, "MC: init mci\n");
|
||||
|
||||
@@ -403,9 +406,9 @@ static int x38_probe1(struct pci_dev *pdev, int dev_idx)
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
edac_mc_free(mci);
|
||||
unmap:
|
||||
iounmap(window);
|
||||
if (mci)
|
||||
edac_mc_free(mci);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -162,7 +162,7 @@ int cper_bits_to_str(char *buf, int buf_size, unsigned long bits,
|
||||
len -= size;
|
||||
str += size;
|
||||
}
|
||||
return len - buf_size;
|
||||
return buf_size - len;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(cper_bits_to_str);
|
||||
|
||||
|
||||
@@ -74,10 +74,10 @@ struct mm_struct efi_mm = {
|
||||
.page_table_lock = __SPIN_LOCK_UNLOCKED(efi_mm.page_table_lock),
|
||||
.mmlist = LIST_HEAD_INIT(efi_mm.mmlist),
|
||||
.user_ns = &init_user_ns,
|
||||
.cpu_bitmap = { [BITS_TO_LONGS(NR_CPUS)] = 0},
|
||||
#ifdef CONFIG_SCHED_MM_CID
|
||||
.mm_cid.lock = __RAW_SPIN_LOCK_UNLOCKED(efi_mm.mm_cid.lock),
|
||||
#endif
|
||||
.flexible_array = MM_STRUCT_FLEXIBLE_ARRAY_INIT,
|
||||
};
|
||||
|
||||
struct workqueue_struct *efi_rts_wq;
|
||||
@@ -819,6 +819,7 @@ int __init efi_config_parse_tables(const efi_config_table_t *config_tables,
|
||||
if (tbl) {
|
||||
phys_initrd_start = tbl->base;
|
||||
phys_initrd_size = tbl->size;
|
||||
tbl->base = tbl->size = 0;
|
||||
early_memunmap(tbl, sizeof(*tbl));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
* Copyright (c) 2007, MontaVista Software, Inc. <source@mvista.com>
|
||||
*/
|
||||
|
||||
#include <linux/cleanup.h>
|
||||
#include <linux/gpio/driver.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/kernel.h>
|
||||
@@ -109,6 +110,22 @@ davinci_direction_out(struct gpio_chip *chip, unsigned offset, int value)
|
||||
return __davinci_direction(chip, offset, true, value);
|
||||
}
|
||||
|
||||
static int davinci_get_direction(struct gpio_chip *chip, unsigned int offset)
|
||||
{
|
||||
struct davinci_gpio_controller *d = gpiochip_get_data(chip);
|
||||
struct davinci_gpio_regs __iomem *g;
|
||||
u32 mask = __gpio_mask(offset), val;
|
||||
int bank = offset / 32;
|
||||
|
||||
g = d->regs[bank];
|
||||
|
||||
guard(spinlock_irqsave)(&d->lock);
|
||||
|
||||
val = readl_relaxed(&g->dir);
|
||||
|
||||
return (val & mask) ? GPIO_LINE_DIRECTION_IN : GPIO_LINE_DIRECTION_OUT;
|
||||
}
|
||||
|
||||
/*
|
||||
* Read the pin's value (works even if it's set up as output);
|
||||
* returns zero/nonzero.
|
||||
@@ -203,6 +220,7 @@ static int davinci_gpio_probe(struct platform_device *pdev)
|
||||
chips->chip.get = davinci_gpio_get;
|
||||
chips->chip.direction_output = davinci_direction_out;
|
||||
chips->chip.set = davinci_gpio_set;
|
||||
chips->chip.get_direction = davinci_get_direction;
|
||||
|
||||
chips->chip.ngpio = ngpio;
|
||||
chips->chip.base = -1;
|
||||
|
||||
@@ -468,9 +468,6 @@ int gpiod_get_direction(struct gpio_desc *desc)
|
||||
test_bit(GPIOD_FLAG_IS_OUT, &flags))
|
||||
return 0;
|
||||
|
||||
if (!guard.gc->get_direction)
|
||||
return -ENOTSUPP;
|
||||
|
||||
ret = gpiochip_get_direction(guard.gc, offset);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
@@ -274,6 +274,8 @@ extern int amdgpu_rebar;
|
||||
extern int amdgpu_wbrf;
|
||||
extern int amdgpu_user_queue;
|
||||
|
||||
extern uint amdgpu_hdmi_hpd_debounce_delay_ms;
|
||||
|
||||
#define AMDGPU_VM_MAX_NUM_CTX 4096
|
||||
#define AMDGPU_SG_THRESHOLD (256*1024*1024)
|
||||
#define AMDGPU_WAIT_IDLE_TIMEOUT_IN_MS 3000
|
||||
|
||||
@@ -5063,6 +5063,14 @@ void amdgpu_device_fini_hw(struct amdgpu_device *adev)
|
||||
|
||||
amdgpu_ttm_set_buffer_funcs_status(adev, false);
|
||||
|
||||
/*
|
||||
* device went through surprise hotplug; we need to destroy topology
|
||||
* before ip_fini_early to prevent kfd locking refcount issues by calling
|
||||
* amdgpu_amdkfd_suspend()
|
||||
*/
|
||||
if (drm_dev_is_unplugged(adev_to_drm(adev)))
|
||||
amdgpu_amdkfd_device_fini_sw(adev);
|
||||
|
||||
amdgpu_device_ip_fini_early(adev);
|
||||
|
||||
amdgpu_irq_fini_hw(adev);
|
||||
|
||||
@@ -1880,7 +1880,12 @@ int amdgpu_display_get_scanout_buffer(struct drm_plane *plane,
|
||||
struct drm_scanout_buffer *sb)
|
||||
{
|
||||
struct amdgpu_bo *abo;
|
||||
struct drm_framebuffer *fb = plane->state->fb;
|
||||
struct drm_framebuffer *fb;
|
||||
|
||||
if (drm_drv_uses_atomic_modeset(plane->dev))
|
||||
fb = plane->state->fb;
|
||||
else
|
||||
fb = plane->fb;
|
||||
|
||||
if (!fb)
|
||||
return -EINVAL;
|
||||
|
||||
@@ -83,18 +83,6 @@ static int amdgpu_dma_buf_attach(struct dma_buf *dmabuf,
|
||||
struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
|
||||
int r;
|
||||
|
||||
/*
|
||||
* Disable peer-to-peer access for DCC-enabled VRAM surfaces on GFX12+.
|
||||
* Such buffers cannot be safely accessed over P2P due to device-local
|
||||
* compression metadata. Fallback to system-memory path instead.
|
||||
* Device supports GFX12 (GC 12.x or newer)
|
||||
* BO was created with the AMDGPU_GEM_CREATE_GFX12_DCC flag
|
||||
*
|
||||
*/
|
||||
if (amdgpu_ip_version(adev, GC_HWIP, 0) >= IP_VERSION(12, 0, 0) &&
|
||||
bo->flags & AMDGPU_GEM_CREATE_GFX12_DCC)
|
||||
attach->peer2peer = false;
|
||||
|
||||
/*
|
||||
* Disable peer-to-peer access for DCC-enabled VRAM surfaces on GFX12+.
|
||||
* Such buffers cannot be safely accessed over P2P due to device-local
|
||||
|
||||
@@ -247,6 +247,7 @@ int amdgpu_damage_clips = -1; /* auto */
|
||||
int amdgpu_umsch_mm_fwlog;
|
||||
int amdgpu_rebar = -1; /* auto */
|
||||
int amdgpu_user_queue = -1;
|
||||
uint amdgpu_hdmi_hpd_debounce_delay_ms;
|
||||
|
||||
DECLARE_DYNDBG_CLASSMAP(drm_debug_classes, DD_CLASS_TYPE_DISJOINT_BITS, 0,
|
||||
"DRM_UT_CORE",
|
||||
@@ -1123,6 +1124,16 @@ module_param_named(rebar, amdgpu_rebar, int, 0444);
|
||||
MODULE_PARM_DESC(user_queue, "Enable user queues (-1 = auto (default), 0 = disable, 1 = enable, 2 = enable UQs and disable KQs)");
|
||||
module_param_named(user_queue, amdgpu_user_queue, int, 0444);
|
||||
|
||||
/*
|
||||
* DOC: hdmi_hpd_debounce_delay_ms (uint)
|
||||
* HDMI HPD disconnect debounce delay in milliseconds.
|
||||
*
|
||||
* Used to filter short disconnect->reconnect HPD toggles some HDMI sinks
|
||||
* generate while entering/leaving power save. Set to 0 to disable by default.
|
||||
*/
|
||||
MODULE_PARM_DESC(hdmi_hpd_debounce_delay_ms, "HDMI HPD disconnect debounce delay in milliseconds (0 to disable (by default), 1500 is common)");
|
||||
module_param_named(hdmi_hpd_debounce_delay_ms, amdgpu_hdmi_hpd_debounce_delay_ms, uint, 0644);
|
||||
|
||||
/* These devices are not supported by amdgpu.
|
||||
* They are supported by the mach64, r128, radeon drivers
|
||||
*/
|
||||
|
||||
@@ -375,7 +375,7 @@ void amdgpu_gart_map(struct amdgpu_device *adev, uint64_t offset,
|
||||
* @start_page: first page to map in the GART aperture
|
||||
* @num_pages: number of pages to be mapped
|
||||
* @flags: page table entry flags
|
||||
* @dst: CPU address of the GART table
|
||||
* @dst: valid CPU address of GART table, cannot be null
|
||||
*
|
||||
* Binds a BO that is allocated in VRAM to the GART page table
|
||||
* (all ASICs).
|
||||
@@ -396,7 +396,7 @@ void amdgpu_gart_map_vram_range(struct amdgpu_device *adev, uint64_t pa,
|
||||
return;
|
||||
|
||||
for (i = 0; i < num_pages; ++i) {
|
||||
amdgpu_gmc_set_pte_pde(adev, adev->gart.ptr,
|
||||
amdgpu_gmc_set_pte_pde(adev, dst,
|
||||
start_page + i, pa + AMDGPU_GPU_PAGE_SIZE * i, flags);
|
||||
}
|
||||
|
||||
|
||||
@@ -732,6 +732,10 @@ int amdgpu_gmc_flush_gpu_tlb_pasid(struct amdgpu_device *adev, uint16_t pasid,
|
||||
return 0;
|
||||
|
||||
if (!adev->gmc.flush_pasid_uses_kiq || !ring->sched.ready) {
|
||||
|
||||
if (!adev->gmc.gmc_funcs->flush_gpu_tlb_pasid)
|
||||
return 0;
|
||||
|
||||
if (adev->gmc.flush_tlb_needs_extra_type_2)
|
||||
adev->gmc.gmc_funcs->flush_gpu_tlb_pasid(adev, pasid,
|
||||
2, all_hub,
|
||||
|
||||
@@ -885,12 +885,28 @@ static int amdgpu_userq_input_args_validate(struct drm_device *dev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool amdgpu_userq_enabled(struct drm_device *dev)
|
||||
{
|
||||
struct amdgpu_device *adev = drm_to_adev(dev);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < AMDGPU_HW_IP_NUM; i++) {
|
||||
if (adev->userq_funcs[i])
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
int amdgpu_userq_ioctl(struct drm_device *dev, void *data,
|
||||
struct drm_file *filp)
|
||||
{
|
||||
union drm_amdgpu_userq *args = data;
|
||||
int r;
|
||||
|
||||
if (!amdgpu_userq_enabled(dev))
|
||||
return -ENOTSUPP;
|
||||
|
||||
if (amdgpu_userq_input_args_validate(dev, args, filp) < 0)
|
||||
return -EINVAL;
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user