mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 22:21:40 +00:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c9c5de246c1
("net: sparx5: mdb add/del handle non-sparx5 devices")fbb89d02e3
("net: sparx5: Allow mdb entries to both CPU and ports") Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
0d8730f07c
4
.mailmap
4
.mailmap
@ -10,6 +10,8 @@
|
||||
# Please keep this list dictionary sorted.
|
||||
#
|
||||
Aaron Durbin <adurbin@google.com>
|
||||
Abel Vesa <abelvesa@kernel.org> <abel.vesa@nxp.com>
|
||||
Abel Vesa <abelvesa@kernel.org> <abelvesa@gmail.com>
|
||||
Abhinav Kumar <quic_abhinavk@quicinc.com> <abhinavk@codeaurora.org>
|
||||
Adam Oldham <oldhamca@gmail.com>
|
||||
Adam Radford <aradford@gmail.com>
|
||||
@ -85,6 +87,7 @@ Christian Borntraeger <borntraeger@linux.ibm.com> <borntrae@de.ibm.com>
|
||||
Christian Brauner <brauner@kernel.org> <christian@brauner.io>
|
||||
Christian Brauner <brauner@kernel.org> <christian.brauner@canonical.com>
|
||||
Christian Brauner <brauner@kernel.org> <christian.brauner@ubuntu.com>
|
||||
Christian Marangi <ansuelsmth@gmail.com>
|
||||
Christophe Ricard <christophe.ricard@gmail.com>
|
||||
Christoph Hellwig <hch@lst.de>
|
||||
Colin Ian King <colin.king@intel.com> <colin.king@canonical.com>
|
||||
@ -165,6 +168,7 @@ Jan Glauber <jan.glauber@gmail.com> <jang@de.ibm.com>
|
||||
Jan Glauber <jan.glauber@gmail.com> <jang@linux.vnet.ibm.com>
|
||||
Jan Glauber <jan.glauber@gmail.com> <jglauber@cavium.com>
|
||||
Jarkko Sakkinen <jarkko@kernel.org> <jarkko.sakkinen@linux.intel.com>
|
||||
Jarkko Sakkinen <jarkko@kernel.org> <jarkko@profian.com>
|
||||
Jason Gunthorpe <jgg@ziepe.ca> <jgg@mellanox.com>
|
||||
Jason Gunthorpe <jgg@ziepe.ca> <jgg@nvidia.com>
|
||||
Jason Gunthorpe <jgg@ziepe.ca> <jgunthorpe@obsidianresearch.com>
|
||||
|
@ -1,4 +1,4 @@
|
||||
What: /sys/bus/iio/devices/iio:deviceX/conversion_mode
|
||||
What: /sys/bus/iio/devices/iio:deviceX/in_conversion_mode
|
||||
KernelVersion: 4.2
|
||||
Contact: linux-iio@vger.kernel.org
|
||||
Description:
|
||||
|
@ -47,6 +47,5 @@ examples:
|
||||
clocks = <&clkcfg CLK_SPI0>;
|
||||
interrupt-parent = <&plic>;
|
||||
interrupts = <54>;
|
||||
spi-max-frequency = <25000000>;
|
||||
};
|
||||
...
|
||||
|
@ -110,7 +110,6 @@ examples:
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&qup_spi1_default>;
|
||||
interrupts = <GIC_SPI 602 IRQ_TYPE_LEVEL_HIGH>;
|
||||
spi-max-frequency = <50000000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
};
|
||||
|
@ -136,7 +136,8 @@ properties:
|
||||
Phandle of a companion.
|
||||
|
||||
phys:
|
||||
maxItems: 1
|
||||
minItems: 1
|
||||
maxItems: 3
|
||||
|
||||
phy-names:
|
||||
const: usb
|
||||
|
@ -103,7 +103,8 @@ properties:
|
||||
Overrides the detected port count
|
||||
|
||||
phys:
|
||||
maxItems: 1
|
||||
minItems: 1
|
||||
maxItems: 3
|
||||
|
||||
phy-names:
|
||||
const: usb
|
||||
|
@ -6,7 +6,7 @@ This document explains how GPIOs can be assigned to given devices and functions.
|
||||
|
||||
Note that it only applies to the new descriptor-based interface. For a
|
||||
description of the deprecated integer-based GPIO interface please refer to
|
||||
gpio-legacy.txt (actually, there is no real mapping possible with the old
|
||||
legacy.rst (actually, there is no real mapping possible with the old
|
||||
interface; you just fetch an integer from somewhere and request the
|
||||
corresponding GPIO).
|
||||
|
||||
|
@ -4,7 +4,7 @@ GPIO Descriptor Consumer Interface
|
||||
|
||||
This document describes the consumer interface of the GPIO framework. Note that
|
||||
it describes the new descriptor-based interface. For a description of the
|
||||
deprecated integer-based GPIO interface please refer to gpio-legacy.txt.
|
||||
deprecated integer-based GPIO interface please refer to legacy.rst.
|
||||
|
||||
|
||||
Guidelines for GPIOs consumers
|
||||
@ -78,7 +78,7 @@ whether the line is configured active high or active low (see
|
||||
|
||||
The two last flags are used for use cases where open drain is mandatory, such
|
||||
as I2C: if the line is not already configured as open drain in the mappings
|
||||
(see board.txt), then open drain will be enforced anyway and a warning will be
|
||||
(see board.rst), then open drain will be enforced anyway and a warning will be
|
||||
printed that the board configuration needs to be updated to match the use case.
|
||||
|
||||
Both functions return either a valid GPIO descriptor, or an error code checkable
|
||||
@ -270,7 +270,7 @@ driven.
|
||||
The same is applicable for open drain or open source output lines: those do not
|
||||
actively drive their output high (open drain) or low (open source), they just
|
||||
switch their output to a high impedance value. The consumer should not need to
|
||||
care. (For details read about open drain in driver.txt.)
|
||||
care. (For details read about open drain in driver.rst.)
|
||||
|
||||
With this, all the gpiod_set_(array)_value_xxx() functions interpret the
|
||||
parameter "value" as "asserted" ("1") or "de-asserted" ("0"). The physical line
|
||||
|
@ -14,12 +14,12 @@ Due to the history of GPIO interfaces in the kernel, there are two different
|
||||
ways to obtain and use GPIOs:
|
||||
|
||||
- The descriptor-based interface is the preferred way to manipulate GPIOs,
|
||||
and is described by all the files in this directory excepted gpio-legacy.txt.
|
||||
and is described by all the files in this directory excepted legacy.rst.
|
||||
- The legacy integer-based interface which is considered deprecated (but still
|
||||
usable for compatibility reasons) is documented in gpio-legacy.txt.
|
||||
usable for compatibility reasons) is documented in legacy.rst.
|
||||
|
||||
The remainder of this document applies to the new descriptor-based interface.
|
||||
gpio-legacy.txt contains the same information applied to the legacy
|
||||
legacy.rst contains the same information applied to the legacy
|
||||
integer-based interface.
|
||||
|
||||
|
||||
|
@ -19,13 +19,23 @@ The main Btrfs features include:
|
||||
* Subvolumes (separate internal filesystem roots)
|
||||
* Object level mirroring and striping
|
||||
* Checksums on data and metadata (multiple algorithms available)
|
||||
* Compression
|
||||
* Compression (multiple algorithms available)
|
||||
* Reflink, deduplication
|
||||
* Scrub (on-line checksum verification)
|
||||
* Hierarchical quota groups (subvolume and snapshot support)
|
||||
* Integrated multiple device support, with several raid algorithms
|
||||
* Offline filesystem check
|
||||
* Efficient incremental backup and FS mirroring
|
||||
* Efficient incremental backup and FS mirroring (send/receive)
|
||||
* Trim/discard
|
||||
* Online filesystem defragmentation
|
||||
* Swapfile support
|
||||
* Zoned mode
|
||||
* Read/write metadata verification
|
||||
* Online resize (shrink, grow)
|
||||
|
||||
For more information please refer to the wiki
|
||||
For more information please refer to the documentation site or wiki
|
||||
|
||||
https://btrfs.readthedocs.io
|
||||
|
||||
https://btrfs.wiki.kernel.org
|
||||
|
||||
|
@ -129,18 +129,24 @@ yet. Bug reports are always welcome at the issue tracker below!
|
||||
* - arm64
|
||||
- Supported
|
||||
- ``LLVM=1``
|
||||
* - hexagon
|
||||
- Maintained
|
||||
- ``LLVM=1``
|
||||
* - mips
|
||||
- Maintained
|
||||
- ``CC=clang``
|
||||
- ``LLVM=1``
|
||||
* - powerpc
|
||||
- Maintained
|
||||
- ``CC=clang``
|
||||
* - riscv
|
||||
- Maintained
|
||||
- ``CC=clang``
|
||||
- ``LLVM=1``
|
||||
* - s390
|
||||
- Maintained
|
||||
- ``CC=clang``
|
||||
* - um (User Mode)
|
||||
- Maintained
|
||||
- ``LLVM=1``
|
||||
* - x86
|
||||
- Supported
|
||||
- ``LLVM=1``
|
||||
|
@ -120,7 +120,8 @@ Testing
|
||||
unpoison-pfn
|
||||
Software-unpoison page at PFN echoed into this file. This way
|
||||
a page can be reused again. This only works for Linux
|
||||
injected failures, not for real memory failures.
|
||||
injected failures, not for real memory failures. Once any hardware
|
||||
memory failure happens, this feature is disabled.
|
||||
|
||||
Note these injection interfaces are not stable and might change between
|
||||
kernel versions
|
||||
|
88
MAINTAINERS
88
MAINTAINERS
@ -426,6 +426,7 @@ ACPI VIOT DRIVER
|
||||
M: Jean-Philippe Brucker <jean-philippe@linaro.org>
|
||||
L: linux-acpi@vger.kernel.org
|
||||
L: iommu@lists.linux-foundation.org
|
||||
L: iommu@lists.linux.dev
|
||||
S: Maintained
|
||||
F: drivers/acpi/viot.c
|
||||
F: include/linux/acpi_viot.h
|
||||
@ -959,6 +960,7 @@ AMD IOMMU (AMD-VI)
|
||||
M: Joerg Roedel <joro@8bytes.org>
|
||||
R: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
|
||||
L: iommu@lists.linux-foundation.org
|
||||
L: iommu@lists.linux.dev
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git
|
||||
F: drivers/iommu/amd/
|
||||
@ -2466,6 +2468,7 @@ ARM/NXP S32G ARCHITECTURE
|
||||
M: Chester Lin <clin@suse.com>
|
||||
R: Andreas Färber <afaerber@suse.de>
|
||||
R: Matthias Brugger <mbrugger@suse.com>
|
||||
R: NXP S32 Linux Team <s32@nxp.com>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
F: arch/arm64/boot/dts/freescale/s32g*.dts*
|
||||
@ -3809,12 +3812,12 @@ N: bcmbca
|
||||
N: bcm[9]?47622
|
||||
|
||||
BROADCOM BCM2711/BCM2835 ARM ARCHITECTURE
|
||||
M: Nicolas Saenz Julienne <nsaenz@kernel.org>
|
||||
M: Florian Fainelli <f.fainelli@gmail.com>
|
||||
R: Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
|
||||
L: linux-rpi-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/nsaenz/linux-rpi.git
|
||||
T: git git://github.com/broadcom/stblinux.git
|
||||
F: Documentation/devicetree/bindings/pci/brcm,stb-pcie.yaml
|
||||
F: drivers/pci/controller/pcie-brcmstb.c
|
||||
F: drivers/staging/vc04_services
|
||||
@ -5975,6 +5978,7 @@ M: Christoph Hellwig <hch@lst.de>
|
||||
M: Marek Szyprowski <m.szyprowski@samsung.com>
|
||||
R: Robin Murphy <robin.murphy@arm.com>
|
||||
L: iommu@lists.linux-foundation.org
|
||||
L: iommu@lists.linux.dev
|
||||
S: Supported
|
||||
W: http://git.infradead.org/users/hch/dma-mapping.git
|
||||
T: git git://git.infradead.org/users/hch/dma-mapping.git
|
||||
@ -5987,6 +5991,7 @@ F: kernel/dma/
|
||||
DMA MAPPING BENCHMARK
|
||||
M: Xiang Chen <chenxiang66@hisilicon.com>
|
||||
L: iommu@lists.linux-foundation.org
|
||||
L: iommu@lists.linux.dev
|
||||
F: kernel/dma/map_benchmark.c
|
||||
F: tools/testing/selftests/dma/
|
||||
|
||||
@ -7578,6 +7583,7 @@ F: drivers/gpu/drm/exynos/exynos_dp*
|
||||
EXYNOS SYSMMU (IOMMU) driver
|
||||
M: Marek Szyprowski <m.szyprowski@samsung.com>
|
||||
L: iommu@lists.linux-foundation.org
|
||||
L: iommu@lists.linux.dev
|
||||
S: Maintained
|
||||
F: drivers/iommu/exynos-iommu.c
|
||||
|
||||
@ -8499,6 +8505,7 @@ F: Documentation/devicetree/bindings/gpio/
|
||||
F: Documentation/driver-api/gpio/
|
||||
F: drivers/gpio/
|
||||
F: include/asm-generic/gpio.h
|
||||
F: include/dt-bindings/gpio/
|
||||
F: include/linux/gpio.h
|
||||
F: include/linux/gpio/
|
||||
F: include/linux/of_gpio.h
|
||||
@ -9152,6 +9159,7 @@ F: drivers/media/platform/st/sti/hva
|
||||
|
||||
HWPOISON MEMORY FAILURE HANDLING
|
||||
M: Naoya Horiguchi <naoya.horiguchi@nec.com>
|
||||
R: Miaohe Lin <linmiaohe@huawei.com>
|
||||
L: linux-mm@kvack.org
|
||||
S: Maintained
|
||||
F: mm/hwpoison-inject.c
|
||||
@ -9997,6 +10005,7 @@ INTEL IOMMU (VT-d)
|
||||
M: David Woodhouse <dwmw2@infradead.org>
|
||||
M: Lu Baolu <baolu.lu@linux.intel.com>
|
||||
L: iommu@lists.linux-foundation.org
|
||||
L: iommu@lists.linux.dev
|
||||
S: Supported
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git
|
||||
F: drivers/iommu/intel/
|
||||
@ -10376,6 +10385,7 @@ IOMMU DRIVERS
|
||||
M: Joerg Roedel <joro@8bytes.org>
|
||||
M: Will Deacon <will@kernel.org>
|
||||
L: iommu@lists.linux-foundation.org
|
||||
L: iommu@lists.linux.dev
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git
|
||||
F: Documentation/devicetree/bindings/iommu/
|
||||
@ -10852,6 +10862,7 @@ M: Marc Zyngier <maz@kernel.org>
|
||||
R: James Morse <james.morse@arm.com>
|
||||
R: Alexandru Elisei <alexandru.elisei@arm.com>
|
||||
R: Suzuki K Poulose <suzuki.poulose@arm.com>
|
||||
R: Oliver Upton <oliver.upton@linux.dev>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
L: kvmarm@lists.cs.columbia.edu (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
@ -10918,28 +10929,51 @@ F: tools/testing/selftests/kvm/*/s390x/
|
||||
F: tools/testing/selftests/kvm/s390x/
|
||||
|
||||
KERNEL VIRTUAL MACHINE FOR X86 (KVM/x86)
|
||||
M: Sean Christopherson <seanjc@google.com>
|
||||
M: Paolo Bonzini <pbonzini@redhat.com>
|
||||
R: Sean Christopherson <seanjc@google.com>
|
||||
R: Vitaly Kuznetsov <vkuznets@redhat.com>
|
||||
R: Wanpeng Li <wanpengli@tencent.com>
|
||||
R: Jim Mattson <jmattson@google.com>
|
||||
R: Joerg Roedel <joro@8bytes.org>
|
||||
L: kvm@vger.kernel.org
|
||||
S: Supported
|
||||
W: http://www.linux-kvm.org
|
||||
T: git git://git.kernel.org/pub/scm/virt/kvm/kvm.git
|
||||
F: arch/x86/include/asm/kvm*
|
||||
F: arch/x86/include/asm/pvclock-abi.h
|
||||
F: arch/x86/include/asm/svm.h
|
||||
F: arch/x86/include/asm/vmx*.h
|
||||
F: arch/x86/include/uapi/asm/kvm*
|
||||
F: arch/x86/include/uapi/asm/svm.h
|
||||
F: arch/x86/include/uapi/asm/vmx.h
|
||||
F: arch/x86/kernel/kvm.c
|
||||
F: arch/x86/kernel/kvmclock.c
|
||||
F: arch/x86/kvm/
|
||||
F: arch/x86/kvm/*/
|
||||
|
||||
KVM PARAVIRT (KVM/paravirt)
|
||||
M: Paolo Bonzini <pbonzini@redhat.com>
|
||||
R: Wanpeng Li <wanpengli@tencent.com>
|
||||
R: Vitaly Kuznetsov <vkuznets@redhat.com>
|
||||
L: kvm@vger.kernel.org
|
||||
S: Supported
|
||||
T: git git://git.kernel.org/pub/scm/virt/kvm/kvm.git
|
||||
F: arch/x86/kernel/kvm.c
|
||||
F: arch/x86/kernel/kvmclock.c
|
||||
F: arch/x86/include/asm/pvclock-abi.h
|
||||
F: include/linux/kvm_para.h
|
||||
F: include/uapi/linux/kvm_para.h
|
||||
F: include/uapi/asm-generic/kvm_para.h
|
||||
F: include/asm-generic/kvm_para.h
|
||||
F: arch/um/include/asm/kvm_para.h
|
||||
F: arch/x86/include/asm/kvm_para.h
|
||||
F: arch/x86/include/uapi/asm/kvm_para.h
|
||||
|
||||
KVM X86 HYPER-V (KVM/hyper-v)
|
||||
M: Vitaly Kuznetsov <vkuznets@redhat.com>
|
||||
M: Sean Christopherson <seanjc@google.com>
|
||||
M: Paolo Bonzini <pbonzini@redhat.com>
|
||||
L: kvm@vger.kernel.org
|
||||
S: Supported
|
||||
T: git git://git.kernel.org/pub/scm/virt/kvm/kvm.git
|
||||
F: arch/x86/kvm/hyperv.*
|
||||
F: arch/x86/kvm/kvm_onhyperv.*
|
||||
F: arch/x86/kvm/svm/hyperv.*
|
||||
F: arch/x86/kvm/svm/svm_onhyperv.*
|
||||
F: arch/x86/kvm/vmx/evmcs.*
|
||||
|
||||
KERNFS
|
||||
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
M: Tejun Heo <tj@kernel.org>
|
||||
@ -11597,6 +11631,7 @@ F: drivers/gpu/drm/bridge/lontium-lt8912b.c
|
||||
LOONGARCH
|
||||
M: Huacai Chen <chenhuacai@kernel.org>
|
||||
R: WANG Xuerui <kernel@xen0n.name>
|
||||
L: loongarch@lists.linux.dev
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson.git
|
||||
F: arch/loongarch/
|
||||
@ -12510,6 +12545,7 @@ F: drivers/i2c/busses/i2c-mt65xx.c
|
||||
MEDIATEK IOMMU DRIVER
|
||||
M: Yong Wu <yong.wu@mediatek.com>
|
||||
L: iommu@lists.linux-foundation.org
|
||||
L: iommu@lists.linux.dev
|
||||
L: linux-mediatek@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Supported
|
||||
F: Documentation/devicetree/bindings/iommu/mediatek*
|
||||
@ -12852,9 +12888,8 @@ M: Andrew Morton <akpm@linux-foundation.org>
|
||||
L: linux-mm@kvack.org
|
||||
S: Maintained
|
||||
W: http://www.linux-mm.org
|
||||
T: quilt https://ozlabs.org/~akpm/mmotm/
|
||||
T: quilt https://ozlabs.org/~akpm/mmots/
|
||||
T: git git://github.com/hnaz/linux-mm.git
|
||||
T: git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
|
||||
T: quilt git://git.kernel.org/pub/scm/linux/kernel/git/akpm/25-new
|
||||
F: include/linux/gfp.h
|
||||
F: include/linux/memory_hotplug.h
|
||||
F: include/linux/mm.h
|
||||
@ -12864,6 +12899,18 @@ F: include/linux/vmalloc.h
|
||||
F: mm/
|
||||
F: tools/testing/selftests/vm/
|
||||
|
||||
MEMORY HOT(UN)PLUG
|
||||
M: David Hildenbrand <david@redhat.com>
|
||||
M: Oscar Salvador <osalvador@suse.de>
|
||||
L: linux-mm@kvack.org
|
||||
S: Maintained
|
||||
F: Documentation/admin-guide/mm/memory-hotplug.rst
|
||||
F: Documentation/core-api/memory-hotplug.rst
|
||||
F: drivers/base/memory.c
|
||||
F: include/linux/memory_hotplug.h
|
||||
F: mm/memory_hotplug.c
|
||||
F: tools/testing/selftests/memory-hotplug/
|
||||
|
||||
MEMORY TECHNOLOGY DEVICES (MTD)
|
||||
M: Miquel Raynal <miquel.raynal@bootlin.com>
|
||||
M: Richard Weinberger <richard@nod.at>
|
||||
@ -14268,7 +14315,7 @@ F: drivers/iio/gyro/fxas21002c_i2c.c
|
||||
F: drivers/iio/gyro/fxas21002c_spi.c
|
||||
|
||||
NXP i.MX CLOCK DRIVERS
|
||||
M: Abel Vesa <abel.vesa@nxp.com>
|
||||
M: Abel Vesa <abelvesa@kernel.org>
|
||||
L: linux-clk@vger.kernel.org
|
||||
L: linux-imx@nxp.com
|
||||
S: Maintained
|
||||
@ -14356,9 +14403,8 @@ F: Documentation/devicetree/bindings/sound/nxp,tfa989x.yaml
|
||||
F: sound/soc/codecs/tfa989x.c
|
||||
|
||||
NXP-NCI NFC DRIVER
|
||||
R: Charles Gorand <charles.gorand@effinnov.com>
|
||||
L: linux-nfc@lists.01.org (subscribers-only)
|
||||
S: Supported
|
||||
S: Orphan
|
||||
F: Documentation/devicetree/bindings/net/nfc/nxp,nci.yaml
|
||||
F: drivers/nfc/nxp-nci
|
||||
|
||||
@ -16496,7 +16542,7 @@ F: Documentation/devicetree/bindings/opp/opp-v2-kryo-cpu.yaml
|
||||
F: drivers/cpufreq/qcom-cpufreq-nvmem.c
|
||||
|
||||
QUALCOMM CRYPTO DRIVERS
|
||||
M: Thara Gopinath <thara.gopinath@linaro.org>
|
||||
M: Thara Gopinath <thara.gopinath@gmail.com>
|
||||
L: linux-crypto@vger.kernel.org
|
||||
L: linux-arm-msm@vger.kernel.org
|
||||
S: Maintained
|
||||
@ -16551,6 +16597,7 @@ F: drivers/i2c/busses/i2c-qcom-cci.c
|
||||
QUALCOMM IOMMU
|
||||
M: Rob Clark <robdclark@gmail.com>
|
||||
L: iommu@lists.linux-foundation.org
|
||||
L: iommu@lists.linux.dev
|
||||
L: linux-arm-msm@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/iommu/arm/arm-smmu/qcom_iommu.c
|
||||
@ -16606,7 +16653,7 @@ F: include/linux/if_rmnet.h
|
||||
|
||||
QUALCOMM TSENS THERMAL DRIVER
|
||||
M: Amit Kucheria <amitk@kernel.org>
|
||||
M: Thara Gopinath <thara.gopinath@linaro.org>
|
||||
M: Thara Gopinath <thara.gopinath@gmail.com>
|
||||
L: linux-pm@vger.kernel.org
|
||||
L: linux-arm-msm@vger.kernel.org
|
||||
S: Maintained
|
||||
@ -19189,6 +19236,7 @@ F: arch/x86/boot/video*
|
||||
SWIOTLB SUBSYSTEM
|
||||
M: Christoph Hellwig <hch@infradead.org>
|
||||
L: iommu@lists.linux-foundation.org
|
||||
L: iommu@lists.linux.dev
|
||||
S: Supported
|
||||
W: http://git.infradead.org/users/hch/dma-mapping.git
|
||||
T: git git://git.infradead.org/users/hch/dma-mapping.git
|
||||
@ -20733,6 +20781,7 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git
|
||||
F: Documentation/devicetree/bindings/usb/
|
||||
F: Documentation/usb/
|
||||
F: drivers/usb/
|
||||
F: include/dt-bindings/usb/
|
||||
F: include/linux/usb.h
|
||||
F: include/linux/usb/
|
||||
|
||||
@ -21870,6 +21919,7 @@ M: Juergen Gross <jgross@suse.com>
|
||||
M: Stefano Stabellini <sstabellini@kernel.org>
|
||||
L: xen-devel@lists.xenproject.org (moderated for non-subscribers)
|
||||
L: iommu@lists.linux-foundation.org
|
||||
L: iommu@lists.linux.dev
|
||||
S: Supported
|
||||
F: arch/x86/xen/*swiotlb*
|
||||
F: drivers/xen/*swiotlb*
|
||||
|
4
Makefile
4
Makefile
@ -2,7 +2,7 @@
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 19
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc3
|
||||
EXTRAVERSION = -rc4
|
||||
NAME = Superb Owl
|
||||
|
||||
# *DOCUMENTATION*
|
||||
@ -1141,7 +1141,7 @@ KBUILD_MODULES := 1
|
||||
|
||||
autoksyms_recursive: descend modules.order
|
||||
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/adjust_autoksyms.sh \
|
||||
"$(MAKE) -f $(srctree)/Makefile vmlinux"
|
||||
"$(MAKE) -f $(srctree)/Makefile autoksyms_recursive"
|
||||
endif
|
||||
|
||||
autoksyms_h := $(if $(CONFIG_TRIM_UNUSED_KSYMS), include/generated/autoksyms.h)
|
||||
|
@ -1586,7 +1586,6 @@ dtb-$(CONFIG_ARCH_ASPEED) += \
|
||||
aspeed-bmc-lenovo-hr630.dtb \
|
||||
aspeed-bmc-lenovo-hr855xg2.dtb \
|
||||
aspeed-bmc-microsoft-olympus.dtb \
|
||||
aspeed-bmc-nuvia-dc-scm.dtb \
|
||||
aspeed-bmc-opp-lanyang.dtb \
|
||||
aspeed-bmc-opp-mihawk.dtb \
|
||||
aspeed-bmc-opp-mowgli.dtb \
|
||||
@ -1599,6 +1598,7 @@ dtb-$(CONFIG_ARCH_ASPEED) += \
|
||||
aspeed-bmc-opp-witherspoon.dtb \
|
||||
aspeed-bmc-opp-zaius.dtb \
|
||||
aspeed-bmc-portwell-neptune.dtb \
|
||||
aspeed-bmc-qcom-dc-scm-v1.dtb \
|
||||
aspeed-bmc-quanta-q71l.dtb \
|
||||
aspeed-bmc-quanta-s6q.dtb \
|
||||
aspeed-bmc-supermicro-x11spi.dtb \
|
||||
|
@ -6,8 +6,8 @@
|
||||
#include "aspeed-g6.dtsi"
|
||||
|
||||
/ {
|
||||
model = "Nuvia DC-SCM BMC";
|
||||
compatible = "nuvia,dc-scm-bmc", "aspeed,ast2600";
|
||||
model = "Qualcomm DC-SCM V1 BMC";
|
||||
compatible = "qcom,dc-scm-v1-bmc", "aspeed,ast2600";
|
||||
|
||||
aliases {
|
||||
serial4 = &uart5;
|
@ -28,12 +28,12 @@
|
||||
&expgpio {
|
||||
gpio-line-names = "BT_ON",
|
||||
"WL_ON",
|
||||
"",
|
||||
"PWR_LED_OFF",
|
||||
"GLOBAL_RESET",
|
||||
"VDD_SD_IO_SEL",
|
||||
"CAM_GPIO",
|
||||
"GLOBAL_SHUTDOWN",
|
||||
"SD_PWR_ON",
|
||||
"SD_OC_N";
|
||||
"SHUTDOWN_REQUEST";
|
||||
};
|
||||
|
||||
&genet_mdio {
|
||||
|
@ -593,7 +593,7 @@
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_atmel_conn>;
|
||||
reg = <0x4a>;
|
||||
reset-gpios = <&gpio1 14 GPIO_ACTIVE_HIGH>; /* SODIMM 106 */
|
||||
reset-gpios = <&gpio1 14 GPIO_ACTIVE_LOW>; /* SODIMM 106 */
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
|
@ -762,7 +762,7 @@
|
||||
regulator-name = "vddpu";
|
||||
regulator-min-microvolt = <725000>;
|
||||
regulator-max-microvolt = <1450000>;
|
||||
regulator-enable-ramp-delay = <150>;
|
||||
regulator-enable-ramp-delay = <380>;
|
||||
anatop-reg-offset = <0x140>;
|
||||
anatop-vol-bit-shift = <9>;
|
||||
anatop-vol-bit-width = <5>;
|
||||
|
@ -120,6 +120,7 @@
|
||||
compatible = "usb-nop-xceiv";
|
||||
clocks = <&clks IMX7D_USB_HSIC_ROOT_CLK>;
|
||||
clock-names = "main_clk";
|
||||
power-domains = <&pgc_hsic_phy>;
|
||||
#phy-cells = <0>;
|
||||
};
|
||||
|
||||
@ -1153,7 +1154,6 @@
|
||||
compatible = "fsl,imx7d-usb", "fsl,imx27-usb";
|
||||
reg = <0x30b30000 0x200>;
|
||||
interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>;
|
||||
power-domains = <&pgc_hsic_phy>;
|
||||
clocks = <&clks IMX7D_USB_CTRL_CLK>;
|
||||
fsl,usbphy = <&usbphynop3>;
|
||||
fsl,usbmisc = <&usbmisc3 0>;
|
||||
|
47
arch/arm/boot/dts/stm32mp15-scmi.dtsi
Normal file
47
arch/arm/boot/dts/stm32mp15-scmi.dtsi
Normal file
@ -0,0 +1,47 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
|
||||
/*
|
||||
* Copyright (C) STMicroelectronics 2022 - All Rights Reserved
|
||||
* Author: Alexandre Torgue <alexandre.torgue@foss.st.com> for STMicroelectronics.
|
||||
*/
|
||||
|
||||
/ {
|
||||
firmware {
|
||||
optee: optee {
|
||||
compatible = "linaro,optee-tz";
|
||||
method = "smc";
|
||||
};
|
||||
|
||||
scmi: scmi {
|
||||
compatible = "linaro,scmi-optee";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
linaro,optee-channel-id = <0>;
|
||||
shmem = <&scmi_shm>;
|
||||
|
||||
scmi_clk: protocol@14 {
|
||||
reg = <0x14>;
|
||||
#clock-cells = <1>;
|
||||
};
|
||||
|
||||
scmi_reset: protocol@16 {
|
||||
reg = <0x16>;
|
||||
#reset-cells = <1>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
soc {
|
||||
scmi_sram: sram@2ffff000 {
|
||||
compatible = "mmio-sram";
|
||||
reg = <0x2ffff000 0x1000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges = <0 0x2ffff000 0x1000>;
|
||||
|
||||
scmi_shm: scmi-sram@0 {
|
||||
compatible = "arm,scmi-shmem";
|
||||
reg = <0 0x80>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
@ -115,33 +115,6 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
firmware {
|
||||
optee: optee {
|
||||
compatible = "linaro,optee-tz";
|
||||
method = "smc";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
scmi: scmi {
|
||||
compatible = "linaro,scmi-optee";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
linaro,optee-channel-id = <0>;
|
||||
shmem = <&scmi_shm>;
|
||||
status = "disabled";
|
||||
|
||||
scmi_clk: protocol@14 {
|
||||
reg = <0x14>;
|
||||
#clock-cells = <1>;
|
||||
};
|
||||
|
||||
scmi_reset: protocol@16 {
|
||||
reg = <0x16>;
|
||||
#reset-cells = <1>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
soc {
|
||||
compatible = "simple-bus";
|
||||
#address-cells = <1>;
|
||||
@ -149,20 +122,6 @@
|
||||
interrupt-parent = <&intc>;
|
||||
ranges;
|
||||
|
||||
scmi_sram: sram@2ffff000 {
|
||||
compatible = "mmio-sram";
|
||||
reg = <0x2ffff000 0x1000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges = <0 0x2ffff000 0x1000>;
|
||||
|
||||
scmi_shm: scmi-sram@0 {
|
||||
compatible = "arm,scmi-shmem";
|
||||
reg = <0 0x80>;
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
|
||||
timers2: timer@40000000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
@ -7,6 +7,7 @@
|
||||
/dts-v1/;
|
||||
|
||||
#include "stm32mp157a-dk1.dts"
|
||||
#include "stm32mp15-scmi.dtsi"
|
||||
|
||||
/ {
|
||||
model = "STMicroelectronics STM32MP157A-DK1 SCMI Discovery Board";
|
||||
@ -54,10 +55,6 @@
|
||||
resets = <&scmi_reset RST_SCMI_MCU>;
|
||||
};
|
||||
|
||||
&optee {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&rcc {
|
||||
compatible = "st,stm32mp1-rcc-secure", "syscon";
|
||||
clock-names = "hse", "hsi", "csi", "lse", "lsi";
|
||||
@ -76,11 +73,3 @@
|
||||
&rtc {
|
||||
clocks = <&scmi_clk CK_SCMI_RTCAPB>, <&scmi_clk CK_SCMI_RTC>;
|
||||
};
|
||||
|
||||
&scmi {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&scmi_shm {
|
||||
status = "okay";
|
||||
};
|
||||
|
@ -7,6 +7,7 @@
|
||||
/dts-v1/;
|
||||
|
||||
#include "stm32mp157c-dk2.dts"
|
||||
#include "stm32mp15-scmi.dtsi"
|
||||
|
||||
/ {
|
||||
model = "STMicroelectronics STM32MP157C-DK2 SCMI Discovery Board";
|
||||
@ -63,10 +64,6 @@
|
||||
resets = <&scmi_reset RST_SCMI_MCU>;
|
||||
};
|
||||
|
||||
&optee {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&rcc {
|
||||
compatible = "st,stm32mp1-rcc-secure", "syscon";
|
||||
clock-names = "hse", "hsi", "csi", "lse", "lsi";
|
||||
@ -85,11 +82,3 @@
|
||||
&rtc {
|
||||
clocks = <&scmi_clk CK_SCMI_RTCAPB>, <&scmi_clk CK_SCMI_RTC>;
|
||||
};
|
||||
|
||||
&scmi {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&scmi_shm {
|
||||
status = "okay";
|
||||
};
|
||||
|
@ -7,6 +7,7 @@
|
||||
/dts-v1/;
|
||||
|
||||
#include "stm32mp157c-ed1.dts"
|
||||
#include "stm32mp15-scmi.dtsi"
|
||||
|
||||
/ {
|
||||
model = "STMicroelectronics STM32MP157C-ED1 SCMI eval daughter";
|
||||
@ -59,10 +60,6 @@
|
||||
resets = <&scmi_reset RST_SCMI_MCU>;
|
||||
};
|
||||
|
||||
&optee {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&rcc {
|
||||
compatible = "st,stm32mp1-rcc-secure", "syscon";
|
||||
clock-names = "hse", "hsi", "csi", "lse", "lsi";
|
||||
@ -81,11 +78,3 @@
|
||||
&rtc {
|
||||
clocks = <&scmi_clk CK_SCMI_RTCAPB>, <&scmi_clk CK_SCMI_RTC>;
|
||||
};
|
||||
|
||||
&scmi {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&scmi_shm {
|
||||
status = "okay";
|
||||
};
|
||||
|
@ -7,6 +7,7 @@
|
||||
/dts-v1/;
|
||||
|
||||
#include "stm32mp157c-ev1.dts"
|
||||
#include "stm32mp15-scmi.dtsi"
|
||||
|
||||
/ {
|
||||
model = "STMicroelectronics STM32MP157C-EV1 SCMI eval daughter on eval mother";
|
||||
@ -68,10 +69,6 @@
|
||||
resets = <&scmi_reset RST_SCMI_MCU>;
|
||||
};
|
||||
|
||||
&optee {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&rcc {
|
||||
compatible = "st,stm32mp1-rcc-secure", "syscon";
|
||||
clock-names = "hse", "hsi", "csi", "lse", "lsi";
|
||||
@ -90,11 +87,3 @@
|
||||
&rtc {
|
||||
clocks = <&scmi_clk CK_SCMI_RTCAPB>, <&scmi_clk CK_SCMI_RTC>;
|
||||
};
|
||||
|
||||
&scmi {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&scmi_shm {
|
||||
status = "okay";
|
||||
};
|
||||
|
@ -39,6 +39,7 @@ static int axxia_boot_secondary(unsigned int cpu, struct task_struct *idle)
|
||||
return -ENOENT;
|
||||
|
||||
syscon = of_iomap(syscon_np, 0);
|
||||
of_node_put(syscon_np);
|
||||
if (!syscon)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@ -372,6 +372,7 @@ static void __init cns3xxx_init(void)
|
||||
/* De-Asscer SATA Reset */
|
||||
cns3xxx_pwr_soft_rst(CNS3XXX_PWR_SOFTWARE_RST(SATA));
|
||||
}
|
||||
of_node_put(dn);
|
||||
|
||||
dn = of_find_compatible_node(NULL, NULL, "cavium,cns3420-sdhci");
|
||||
if (of_device_is_available(dn)) {
|
||||
@ -385,6 +386,7 @@ static void __init cns3xxx_init(void)
|
||||
cns3xxx_pwr_clk_en(CNS3XXX_PWR_CLK_EN(SDIO));
|
||||
cns3xxx_pwr_soft_rst(CNS3XXX_PWR_SOFTWARE_RST(SDIO));
|
||||
}
|
||||
of_node_put(dn);
|
||||
|
||||
pm_power_off = cns3xxx_power_off;
|
||||
|
||||
|
@ -149,6 +149,7 @@ static void exynos_map_pmu(void)
|
||||
np = of_find_matching_node(NULL, exynos_dt_pmu_match);
|
||||
if (np)
|
||||
pmu_base_addr = of_iomap(np, 0);
|
||||
of_node_put(np);
|
||||
}
|
||||
|
||||
static void __init exynos_init_irq(void)
|
||||
|
@ -218,13 +218,13 @@ void __init spear_setup_of_timer(void)
|
||||
irq = irq_of_parse_and_map(np, 0);
|
||||
if (!irq) {
|
||||
pr_err("%s: No irq passed for timer via DT\n", __func__);
|
||||
return;
|
||||
goto err_put_np;
|
||||
}
|
||||
|
||||
gpt_base = of_iomap(np, 0);
|
||||
if (!gpt_base) {
|
||||
pr_err("%s: of iomap failed\n", __func__);
|
||||
return;
|
||||
goto err_put_np;
|
||||
}
|
||||
|
||||
gpt_clk = clk_get_sys("gpt0", NULL);
|
||||
@ -239,6 +239,8 @@ void __init spear_setup_of_timer(void)
|
||||
goto err_prepare_enable_clk;
|
||||
}
|
||||
|
||||
of_node_put(np);
|
||||
|
||||
spear_clockevent_init(irq);
|
||||
spear_clocksource_init();
|
||||
|
||||
@ -248,4 +250,6 @@ err_prepare_enable_clk:
|
||||
clk_put(gpt_clk);
|
||||
err_iomap:
|
||||
iounmap(gpt_base);
|
||||
err_put_np:
|
||||
of_node_put(np);
|
||||
}
|
||||
|
@ -280,8 +280,8 @@
|
||||
interrupts = <GIC_SPI 246 IRQ_TYPE_LEVEL_HIGH>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&uart0_bus>;
|
||||
clocks = <&cmu_peri CLK_GOUT_UART0_EXT_UCLK>,
|
||||
<&cmu_peri CLK_GOUT_UART0_PCLK>;
|
||||
clocks = <&cmu_peri CLK_GOUT_UART0_PCLK>,
|
||||
<&cmu_peri CLK_GOUT_UART0_EXT_UCLK>;
|
||||
clock-names = "uart", "clk_uart_baud0";
|
||||
samsung,uart-fifosize = <64>;
|
||||
status = "disabled";
|
||||
@ -293,8 +293,8 @@
|
||||
interrupts = <GIC_SPI 247 IRQ_TYPE_LEVEL_HIGH>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&uart1_bus>;
|
||||
clocks = <&cmu_peri CLK_GOUT_UART1_EXT_UCLK>,
|
||||
<&cmu_peri CLK_GOUT_UART1_PCLK>;
|
||||
clocks = <&cmu_peri CLK_GOUT_UART1_PCLK>,
|
||||
<&cmu_peri CLK_GOUT_UART1_EXT_UCLK>;
|
||||
clock-names = "uart", "clk_uart_baud0";
|
||||
samsung,uart-fifosize = <256>;
|
||||
status = "disabled";
|
||||
@ -306,8 +306,8 @@
|
||||
interrupts = <GIC_SPI 279 IRQ_TYPE_LEVEL_HIGH>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&uart2_bus>;
|
||||
clocks = <&cmu_peri CLK_GOUT_UART2_EXT_UCLK>,
|
||||
<&cmu_peri CLK_GOUT_UART2_PCLK>;
|
||||
clocks = <&cmu_peri CLK_GOUT_UART2_PCLK>,
|
||||
<&cmu_peri CLK_GOUT_UART2_EXT_UCLK>;
|
||||
clock-names = "uart", "clk_uart_baud0";
|
||||
samsung,uart-fifosize = <256>;
|
||||
status = "disabled";
|
||||
|
@ -79,7 +79,7 @@
|
||||
};
|
||||
};
|
||||
|
||||
soc {
|
||||
soc@0 {
|
||||
compatible = "simple-bus";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
@ -456,13 +456,11 @@
|
||||
clock-names = "clk_ahb", "clk_xin";
|
||||
mmc-ddr-1_8v;
|
||||
mmc-hs200-1_8v;
|
||||
mmc-hs400-1_8v;
|
||||
ti,trm-icp = <0x2>;
|
||||
ti,otap-del-sel-legacy = <0x0>;
|
||||
ti,otap-del-sel-mmc-hs = <0x0>;
|
||||
ti,otap-del-sel-ddr52 = <0x6>;
|
||||
ti,otap-del-sel-hs200 = <0x7>;
|
||||
ti,otap-del-sel-hs400 = <0x4>;
|
||||
};
|
||||
|
||||
sdhci1: mmc@fa00000 {
|
||||
|
@ -33,7 +33,7 @@
|
||||
ranges;
|
||||
#interrupt-cells = <3>;
|
||||
interrupt-controller;
|
||||
reg = <0x00 0x01800000 0x00 0x200000>, /* GICD */
|
||||
reg = <0x00 0x01800000 0x00 0x100000>, /* GICD */
|
||||
<0x00 0x01900000 0x00 0x100000>, /* GICR */
|
||||
<0x00 0x6f000000 0x00 0x2000>, /* GICC */
|
||||
<0x00 0x6f010000 0x00 0x1000>, /* GICH */
|
||||
|
@ -2112,11 +2112,11 @@ static int finalize_hyp_mode(void)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* Exclude HYP BSS from kmemleak so that it doesn't get peeked
|
||||
* at, which would end badly once the section is inaccessible.
|
||||
* None of other sections should ever be introspected.
|
||||
* Exclude HYP sections from kmemleak so that they don't get peeked
|
||||
* at, which would end badly once inaccessible.
|
||||
*/
|
||||
kmemleak_free_part(__hyp_bss_start, __hyp_bss_end - __hyp_bss_start);
|
||||
kmemleak_free_part(__va(hyp_mem_base), hyp_mem_size);
|
||||
return pkvm_drop_host_privileges();
|
||||
}
|
||||
|
||||
|
@ -12,10 +12,9 @@ static inline unsigned long exception_era(struct pt_regs *regs)
|
||||
return regs->csr_era;
|
||||
}
|
||||
|
||||
static inline int compute_return_era(struct pt_regs *regs)
|
||||
static inline void compute_return_era(struct pt_regs *regs)
|
||||
{
|
||||
regs->csr_era += 4;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* _ASM_BRANCH_H */
|
||||
|
@ -426,6 +426,11 @@ static inline void update_mmu_cache_pmd(struct vm_area_struct *vma,
|
||||
|
||||
#define kern_addr_valid(addr) (1)
|
||||
|
||||
static inline unsigned long pmd_pfn(pmd_t pmd)
|
||||
{
|
||||
return (pmd_val(pmd) & _PFN_MASK) >> _PFN_SHIFT;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
||||
|
||||
/* We don't have hardware dirty/accessed bits, generic_pmdp_establish is fine.*/
|
||||
@ -497,11 +502,6 @@ static inline pmd_t pmd_mkyoung(pmd_t pmd)
|
||||
return pmd;
|
||||
}
|
||||
|
||||
static inline unsigned long pmd_pfn(pmd_t pmd)
|
||||
{
|
||||
return (pmd_val(pmd) & _PFN_MASK) >> _PFN_SHIFT;
|
||||
}
|
||||
|
||||
static inline struct page *pmd_page(pmd_t pmd)
|
||||
{
|
||||
if (pmd_trans_huge(pmd))
|
||||
|
@ -263,7 +263,7 @@ void cpu_probe(void)
|
||||
|
||||
c->cputype = CPU_UNKNOWN;
|
||||
c->processor_id = read_cpucfg(LOONGARCH_CPUCFG0);
|
||||
c->fpu_vers = (read_cpucfg(LOONGARCH_CPUCFG2) >> 3) & 0x3;
|
||||
c->fpu_vers = (read_cpucfg(LOONGARCH_CPUCFG2) & CPUCFG2_FPVERS) >> 3;
|
||||
|
||||
c->fpu_csr0 = FPU_CSR_RN;
|
||||
c->fpu_mask = FPU_CSR_RSVD;
|
||||
|
@ -14,8 +14,6 @@
|
||||
|
||||
__REF
|
||||
|
||||
SYM_ENTRY(_stext, SYM_L_GLOBAL, SYM_A_NONE)
|
||||
|
||||
SYM_CODE_START(kernel_entry) # kernel entry point
|
||||
|
||||
/* Config direct window and set PG */
|
||||
|
@ -475,8 +475,7 @@ asmlinkage void noinstr do_ri(struct pt_regs *regs)
|
||||
|
||||
die_if_kernel("Reserved instruction in kernel code", regs);
|
||||
|
||||
if (unlikely(compute_return_era(regs) < 0))
|
||||
goto out;
|
||||
compute_return_era(regs);
|
||||
|
||||
if (unlikely(get_user(opcode, era) < 0)) {
|
||||
status = SIGSEGV;
|
||||
|
@ -37,6 +37,7 @@ SECTIONS
|
||||
HEAD_TEXT_SECTION
|
||||
|
||||
. = ALIGN(PECOFF_SEGMENT_ALIGN);
|
||||
_stext = .;
|
||||
.text : {
|
||||
TEXT_TEXT
|
||||
SCHED_TEXT
|
||||
|
@ -281,15 +281,16 @@ void setup_tlb_handler(int cpu)
|
||||
if (pcpu_handlers[cpu])
|
||||
return;
|
||||
|
||||
page = alloc_pages_node(cpu_to_node(cpu), GFP_KERNEL, get_order(vec_sz));
|
||||
page = alloc_pages_node(cpu_to_node(cpu), GFP_ATOMIC, get_order(vec_sz));
|
||||
if (!page)
|
||||
return;
|
||||
|
||||
addr = page_address(page);
|
||||
pcpu_handlers[cpu] = virt_to_phys(addr);
|
||||
pcpu_handlers[cpu] = (unsigned long)addr;
|
||||
memcpy((void *)addr, (void *)eentry, vec_sz);
|
||||
local_flush_icache_range((unsigned long)addr, (unsigned long)addr + vec_sz);
|
||||
csr_write64(pcpu_handlers[cpu], LOONGARCH_CSR_TLBRENTRY);
|
||||
csr_write64(pcpu_handlers[cpu], LOONGARCH_CSR_EENTRY);
|
||||
csr_write64(pcpu_handlers[cpu], LOONGARCH_CSR_MERRENTRY);
|
||||
csr_write64(pcpu_handlers[cpu] + 80*VECSIZE, LOONGARCH_CSR_TLBRENTRY);
|
||||
}
|
||||
#endif
|
||||
|
@ -111,8 +111,9 @@
|
||||
|
||||
clocks = <&cgu X1000_CLK_RTCLK>,
|
||||
<&cgu X1000_CLK_EXCLK>,
|
||||
<&cgu X1000_CLK_PCLK>;
|
||||
clock-names = "rtc", "ext", "pclk";
|
||||
<&cgu X1000_CLK_PCLK>,
|
||||
<&cgu X1000_CLK_TCU>;
|
||||
clock-names = "rtc", "ext", "pclk", "tcu";
|
||||
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <1>;
|
||||
|
@ -104,8 +104,9 @@
|
||||
|
||||
clocks = <&cgu X1830_CLK_RTCLK>,
|
||||
<&cgu X1830_CLK_EXCLK>,
|
||||
<&cgu X1830_CLK_PCLK>;
|
||||
clock-names = "rtc", "ext", "pclk";
|
||||
<&cgu X1830_CLK_PCLK>,
|
||||
<&cgu X1830_CLK_TCU>;
|
||||
clock-names = "rtc", "ext", "pclk", "tcu";
|
||||
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <1>;
|
||||
|
@ -44,6 +44,7 @@ static __init unsigned int ranchu_measure_hpt_freq(void)
|
||||
__func__);
|
||||
|
||||
rtc_base = of_iomap(np, 0);
|
||||
of_node_put(np);
|
||||
if (!rtc_base)
|
||||
panic("%s(): Failed to ioremap Goldfish RTC base!", __func__);
|
||||
|
||||
|
@ -208,6 +208,12 @@ void __init ltq_soc_init(void)
|
||||
of_address_to_resource(np_sysgpe, 0, &res_sys[2]))
|
||||
panic("Failed to get core resources");
|
||||
|
||||
of_node_put(np_status);
|
||||
of_node_put(np_ebu);
|
||||
of_node_put(np_sys1);
|
||||
of_node_put(np_syseth);
|
||||
of_node_put(np_sysgpe);
|
||||
|
||||
if ((request_mem_region(res_status.start, resource_size(&res_status),
|
||||
res_status.name) < 0) ||
|
||||
(request_mem_region(res_ebu.start, resource_size(&res_ebu),
|
||||
|
@ -408,6 +408,7 @@ int __init icu_of_init(struct device_node *node, struct device_node *parent)
|
||||
if (!ltq_eiu_membase)
|
||||
panic("Failed to remap eiu memory");
|
||||
}
|
||||
of_node_put(eiu_node);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -441,6 +441,10 @@ void __init ltq_soc_init(void)
|
||||
of_address_to_resource(np_ebu, 0, &res_ebu))
|
||||
panic("Failed to get core resources");
|
||||
|
||||
of_node_put(np_pmu);
|
||||
of_node_put(np_cgu);
|
||||
of_node_put(np_ebu);
|
||||
|
||||
if (!request_mem_region(res_pmu.start, resource_size(&res_pmu),
|
||||
res_pmu.name) ||
|
||||
!request_mem_region(res_cgu.start, resource_size(&res_cgu),
|
||||
|
@ -214,6 +214,8 @@ static void update_gic_frequency_dt(void)
|
||||
|
||||
if (of_update_property(node, &gic_frequency_prop) < 0)
|
||||
pr_err("error updating gic frequency property\n");
|
||||
|
||||
of_node_put(node);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -98,13 +98,18 @@ static int __init pic32_of_prepare_platform_data(struct of_dev_auxdata *lookup)
|
||||
np = of_find_compatible_node(NULL, NULL, lookup->compatible);
|
||||
if (np) {
|
||||
lookup->name = (char *)np->name;
|
||||
if (lookup->phys_addr)
|
||||
if (lookup->phys_addr) {
|
||||
of_node_put(np);
|
||||
continue;
|
||||
}
|
||||
if (!of_address_to_resource(np, 0, &res))
|
||||
lookup->phys_addr = res.start;
|
||||
of_node_put(np);
|
||||
}
|
||||
}
|
||||
|
||||
of_node_put(root);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -32,6 +32,9 @@ static unsigned int pic32_xlate_core_timer_irq(void)
|
||||
goto default_map;
|
||||
|
||||
irq = irq_of_parse_and_map(node, 0);
|
||||
|
||||
of_node_put(node);
|
||||
|
||||
if (!irq)
|
||||
goto default_map;
|
||||
|
||||
|
@ -40,6 +40,8 @@ __iomem void *plat_of_remap_node(const char *node)
|
||||
if (of_address_to_resource(np, 0, &res))
|
||||
panic("Failed to get resource for %s", node);
|
||||
|
||||
of_node_put(np);
|
||||
|
||||
if (!request_mem_region(res.start,
|
||||
resource_size(&res),
|
||||
res.name))
|
||||
|
@ -640,8 +640,6 @@ static int icu_get_irq(unsigned int irq)
|
||||
|
||||
printk(KERN_ERR "spurious ICU interrupt: %04x,%04x\n", pend1, pend2);
|
||||
|
||||
atomic_inc(&irq_err_count);
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -10,6 +10,7 @@ config PARISC
|
||||
select ARCH_WANT_FRAME_POINTERS
|
||||
select ARCH_HAS_ELF_RANDOMIZE
|
||||
select ARCH_HAS_STRICT_KERNEL_RWX
|
||||
select ARCH_HAS_STRICT_MODULE_RWX
|
||||
select ARCH_HAS_UBSAN_SANITIZE_ALL
|
||||
select ARCH_HAS_PTE_SPECIAL
|
||||
select ARCH_NO_SG_CHAIN
|
||||
|
@ -12,7 +12,7 @@ static inline void fb_pgprotect(struct file *file, struct vm_area_struct *vma,
|
||||
pgprot_val(vma->vm_page_prot) |= _PAGE_NO_CACHE;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_STI_CONSOLE) || defined(CONFIG_FB_STI)
|
||||
#if defined(CONFIG_FB_STI)
|
||||
int fb_is_primary_device(struct fb_info *info);
|
||||
#else
|
||||
static inline int fb_is_primary_device(struct fb_info *info)
|
||||
|
@ -722,7 +722,10 @@ void flush_anon_page(struct vm_area_struct *vma, struct page *page, unsigned lon
|
||||
return;
|
||||
|
||||
if (parisc_requires_coherency()) {
|
||||
flush_user_cache_page(vma, vmaddr);
|
||||
if (vma->vm_flags & VM_SHARED)
|
||||
flush_data_cache();
|
||||
else
|
||||
flush_user_cache_page(vma, vmaddr);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -102,7 +102,7 @@ decode_fpu(unsigned int Fpu_register[], unsigned int trap_counts[])
|
||||
* that happen. Want to keep this overhead low, but still provide
|
||||
* some information to the customer. All exits from this routine
|
||||
* need to restore Fpu_register[0]
|
||||
*/
|
||||
*/
|
||||
|
||||
bflags=(Fpu_register[0] & 0xf8000000);
|
||||
Fpu_register[0] &= 0x07ffffff;
|
||||
|
@ -1855,7 +1855,7 @@ void start_thread(struct pt_regs *regs, unsigned long start, unsigned long sp)
|
||||
tm_reclaim_current(0);
|
||||
#endif
|
||||
|
||||
memset(regs->gpr, 0, sizeof(regs->gpr));
|
||||
memset(®s->gpr[1], 0, sizeof(regs->gpr) - sizeof(regs->gpr[0]));
|
||||
regs->ctr = 0;
|
||||
regs->link = 0;
|
||||
regs->xer = 0;
|
||||
|
@ -2302,7 +2302,7 @@ static void __init prom_init_stdout(void)
|
||||
|
||||
static int __init prom_find_machine_type(void)
|
||||
{
|
||||
char compat[256];
|
||||
static char compat[256] __prombss;
|
||||
int len, i = 0;
|
||||
#ifdef CONFIG_PPC64
|
||||
phandle rtas;
|
||||
|
@ -1071,7 +1071,7 @@ static struct rtas_filter rtas_filters[] __ro_after_init = {
|
||||
{ "get-time-of-day", -1, -1, -1, -1, -1 },
|
||||
{ "ibm,get-vpd", -1, 0, -1, 1, 2 },
|
||||
{ "ibm,lpar-perftools", -1, 2, 3, -1, -1 },
|
||||
{ "ibm,platform-dump", -1, 4, 5, -1, -1 },
|
||||
{ "ibm,platform-dump", -1, 4, 5, -1, -1 }, /* Special cased */
|
||||
{ "ibm,read-slot-reset-state", -1, -1, -1, -1, -1 },
|
||||
{ "ibm,scan-log-dump", -1, 0, 1, -1, -1 },
|
||||
{ "ibm,set-dynamic-indicator", -1, 2, -1, -1, -1 },
|
||||
@ -1120,6 +1120,15 @@ static bool block_rtas_call(int token, int nargs,
|
||||
size = 1;
|
||||
|
||||
end = base + size - 1;
|
||||
|
||||
/*
|
||||
* Special case for ibm,platform-dump - NULL buffer
|
||||
* address is used to indicate end of dump processing
|
||||
*/
|
||||
if (!strcmp(f->name, "ibm,platform-dump") &&
|
||||
base == 0)
|
||||
return false;
|
||||
|
||||
if (!in_rmo_buf(base, end))
|
||||
goto err;
|
||||
}
|
||||
|
@ -935,12 +935,6 @@ void __init setup_arch(char **cmdline_p)
|
||||
/* Print various info about the machine that has been gathered so far. */
|
||||
print_system_info();
|
||||
|
||||
/* Reserve large chunks of memory for use by CMA for KVM. */
|
||||
kvm_cma_reserve();
|
||||
|
||||
/* Reserve large chunks of memory for us by CMA for hugetlb */
|
||||
gigantic_hugetlb_cma_reserve();
|
||||
|
||||
klp_init_thread_info(&init_task);
|
||||
|
||||
setup_initial_init_mm(_stext, _etext, _edata, _end);
|
||||
@ -955,6 +949,13 @@ void __init setup_arch(char **cmdline_p)
|
||||
|
||||
initmem_init();
|
||||
|
||||
/*
|
||||
* Reserve large chunks of memory for use by CMA for KVM and hugetlb. These must
|
||||
* be called after initmem_init(), so that pageblock_order is initialised.
|
||||
*/
|
||||
kvm_cma_reserve();
|
||||
gigantic_hugetlb_cma_reserve();
|
||||
|
||||
early_memtest(min_low_pfn << PAGE_SHIFT, max_low_pfn << PAGE_SHIFT);
|
||||
|
||||
if (ppc_md.setup_arch)
|
||||
|
7
arch/powerpc/platforms/microwatt/microwatt.h
Normal file
7
arch/powerpc/platforms/microwatt/microwatt.h
Normal file
@ -0,0 +1,7 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef _MICROWATT_H
|
||||
#define _MICROWATT_H
|
||||
|
||||
void microwatt_rng_init(void);
|
||||
|
||||
#endif /* _MICROWATT_H */
|
@ -11,6 +11,7 @@
|
||||
#include <asm/archrandom.h>
|
||||
#include <asm/cputable.h>
|
||||
#include <asm/machdep.h>
|
||||
#include "microwatt.h"
|
||||
|
||||
#define DARN_ERR 0xFFFFFFFFFFFFFFFFul
|
||||
|
||||
@ -29,7 +30,7 @@ static int microwatt_get_random_darn(unsigned long *v)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static __init int rng_init(void)
|
||||
void __init microwatt_rng_init(void)
|
||||
{
|
||||
unsigned long val;
|
||||
int i;
|
||||
@ -37,12 +38,7 @@ static __init int rng_init(void)
|
||||
for (i = 0; i < 10; i++) {
|
||||
if (microwatt_get_random_darn(&val)) {
|
||||
ppc_md.get_random_seed = microwatt_get_random_darn;
|
||||
return 0;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
pr_warn("Unable to use DARN for get_random_seed()\n");
|
||||
|
||||
return -EIO;
|
||||
}
|
||||
machine_subsys_initcall(, rng_init);
|
||||
|
@ -16,6 +16,8 @@
|
||||
#include <asm/xics.h>
|
||||
#include <asm/udbg.h>
|
||||
|
||||
#include "microwatt.h"
|
||||
|
||||
static void __init microwatt_init_IRQ(void)
|
||||
{
|
||||
xics_init();
|
||||
@ -32,10 +34,16 @@ static int __init microwatt_populate(void)
|
||||
}
|
||||
machine_arch_initcall(microwatt, microwatt_populate);
|
||||
|
||||
static void __init microwatt_setup_arch(void)
|
||||
{
|
||||
microwatt_rng_init();
|
||||
}
|
||||
|
||||
define_machine(microwatt) {
|
||||
.name = "microwatt",
|
||||
.probe = microwatt_probe,
|
||||
.init_IRQ = microwatt_init_IRQ,
|
||||
.setup_arch = microwatt_setup_arch,
|
||||
.progress = udbg_progress,
|
||||
.calibrate_decr = generic_calibrate_decr,
|
||||
};
|
||||
|
@ -42,4 +42,6 @@ ssize_t memcons_copy(struct memcons *mc, char *to, loff_t pos, size_t count);
|
||||
u32 __init memcons_get_size(struct memcons *mc);
|
||||
struct memcons *__init memcons_init(struct device_node *node, const char *mc_prop_name);
|
||||
|
||||
void pnv_rng_init(void);
|
||||
|
||||
#endif /* _POWERNV_H */
|
||||
|
@ -17,6 +17,7 @@
|
||||
#include <asm/prom.h>
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/smp.h>
|
||||
#include "powernv.h"
|
||||
|
||||
#define DARN_ERR 0xFFFFFFFFFFFFFFFFul
|
||||
|
||||
@ -28,7 +29,6 @@ struct powernv_rng {
|
||||
|
||||
static DEFINE_PER_CPU(struct powernv_rng *, powernv_rng);
|
||||
|
||||
|
||||
int powernv_hwrng_present(void)
|
||||
{
|
||||
struct powernv_rng *rng;
|
||||
@ -98,9 +98,6 @@ static int __init initialise_darn(void)
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
pr_warn("Unable to use DARN for get_random_seed()\n");
|
||||
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
@ -163,32 +160,55 @@ static __init int rng_create(struct device_node *dn)
|
||||
|
||||
rng_init_per_cpu(rng, dn);
|
||||
|
||||
pr_info_once("Registering arch random hook.\n");
|
||||
|
||||
ppc_md.get_random_seed = powernv_get_random_long;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static __init int rng_init(void)
|
||||
static int __init pnv_get_random_long_early(unsigned long *v)
|
||||
{
|
||||
struct device_node *dn;
|
||||
int rc;
|
||||
|
||||
if (!slab_is_available())
|
||||
return 0;
|
||||
|
||||
if (cmpxchg(&ppc_md.get_random_seed, pnv_get_random_long_early,
|
||||
NULL) != pnv_get_random_long_early)
|
||||
return 0;
|
||||
|
||||
for_each_compatible_node(dn, NULL, "ibm,power-rng") {
|
||||
rc = rng_create(dn);
|
||||
if (rc) {
|
||||
pr_err("Failed creating rng for %pOF (%d).\n",
|
||||
dn, rc);
|
||||
if (rng_create(dn))
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Create devices for hwrng driver */
|
||||
of_platform_device_create(dn, NULL, NULL);
|
||||
}
|
||||
|
||||
initialise_darn();
|
||||
if (!ppc_md.get_random_seed)
|
||||
return 0;
|
||||
return ppc_md.get_random_seed(v);
|
||||
}
|
||||
|
||||
void __init pnv_rng_init(void)
|
||||
{
|
||||
struct device_node *dn;
|
||||
|
||||
/* Prefer darn over the rest. */
|
||||
if (!initialise_darn())
|
||||
return;
|
||||
|
||||
dn = of_find_compatible_node(NULL, NULL, "ibm,power-rng");
|
||||
if (dn)
|
||||
ppc_md.get_random_seed = pnv_get_random_long_early;
|
||||
|
||||
of_node_put(dn);
|
||||
}
|
||||
|
||||
static int __init pnv_rng_late_init(void)
|
||||
{
|
||||
unsigned long v;
|
||||
/* In case it wasn't called during init for some other reason. */
|
||||
if (ppc_md.get_random_seed == pnv_get_random_long_early)
|
||||
pnv_get_random_long_early(&v);
|
||||
return 0;
|
||||
}
|
||||
machine_subsys_initcall(powernv, rng_init);
|
||||
machine_subsys_initcall(powernv, pnv_rng_late_init);
|
||||
|
@ -203,6 +203,8 @@ static void __init pnv_setup_arch(void)
|
||||
pnv_check_guarded_cores();
|
||||
|
||||
/* XXX PMCS */
|
||||
|
||||
pnv_rng_init();
|
||||
}
|
||||
|
||||
static void __init pnv_init(void)
|
||||
|
@ -122,4 +122,6 @@ void pseries_lpar_read_hblkrm_characteristics(void);
|
||||
static inline void pseries_lpar_read_hblkrm_characteristics(void) { }
|
||||
#endif
|
||||
|
||||
void pseries_rng_init(void);
|
||||
|
||||
#endif /* _PSERIES_PSERIES_H */
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include <asm/archrandom.h>
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/plpar_wrappers.h>
|
||||
#include "pseries.h"
|
||||
|
||||
|
||||
static int pseries_get_random_long(unsigned long *v)
|
||||
@ -24,19 +25,13 @@ static int pseries_get_random_long(unsigned long *v)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static __init int rng_init(void)
|
||||
void __init pseries_rng_init(void)
|
||||
{
|
||||
struct device_node *dn;
|
||||
|
||||
dn = of_find_compatible_node(NULL, NULL, "ibm,random");
|
||||
if (!dn)
|
||||
return -ENODEV;
|
||||
|
||||
pr_info("Registering arch random hook.\n");
|
||||
|
||||
return;
|
||||
ppc_md.get_random_seed = pseries_get_random_long;
|
||||
|
||||
of_node_put(dn);
|
||||
return 0;
|
||||
}
|
||||
machine_subsys_initcall(pseries, rng_init);
|
||||
|
@ -839,6 +839,7 @@ static void __init pSeries_setup_arch(void)
|
||||
}
|
||||
|
||||
ppc_md.pcibios_root_bridge_prepare = pseries_root_bridge_prepare;
|
||||
pseries_rng_init();
|
||||
}
|
||||
|
||||
static void pseries_panic(char *str)
|
||||
|
@ -75,20 +75,20 @@ asm volatile(ALTERNATIVE( \
|
||||
"nop\n\t" \
|
||||
"nop\n\t" \
|
||||
"nop", \
|
||||
"li t3, %2\n\t" \
|
||||
"slli t3, t3, %4\n\t" \
|
||||
"li t3, %1\n\t" \
|
||||
"slli t3, t3, %3\n\t" \
|
||||
"and t3, %0, t3\n\t" \
|
||||
"bne t3, zero, 2f\n\t" \
|
||||
"li t3, %3\n\t" \
|
||||
"slli t3, t3, %4\n\t" \
|
||||
"li t3, %2\n\t" \
|
||||
"slli t3, t3, %3\n\t" \
|
||||
"or %0, %0, t3\n\t" \
|
||||
"2:", THEAD_VENDOR_ID, \
|
||||
ERRATA_THEAD_PBMT, CONFIG_ERRATA_THEAD_PBMT) \
|
||||
: "+r"(_val) \
|
||||
: "0"(_val), \
|
||||
"I"(_PAGE_MTMASK_THEAD >> ALT_THEAD_PBMT_SHIFT), \
|
||||
: "I"(_PAGE_MTMASK_THEAD >> ALT_THEAD_PBMT_SHIFT), \
|
||||
"I"(_PAGE_PMA_THEAD >> ALT_THEAD_PBMT_SHIFT), \
|
||||
"I"(ALT_THEAD_PBMT_SHIFT))
|
||||
"I"(ALT_THEAD_PBMT_SHIFT) \
|
||||
: "t3")
|
||||
#else
|
||||
#define ALT_THEAD_PMA(_val)
|
||||
#endif
|
||||
|
@ -219,6 +219,11 @@ ssize_t copy_oldmem_page(struct iov_iter *iter, unsigned long pfn, size_t csize,
|
||||
unsigned long src;
|
||||
int rc;
|
||||
|
||||
if (!(iter_is_iovec(iter) || iov_iter_is_kvec(iter)))
|
||||
return -EINVAL;
|
||||
/* Multi-segment iterators are not supported */
|
||||
if (iter->nr_segs > 1)
|
||||
return -EINVAL;
|
||||
if (!csize)
|
||||
return 0;
|
||||
src = pfn_to_phys(pfn) + offset;
|
||||
@ -228,7 +233,10 @@ ssize_t copy_oldmem_page(struct iov_iter *iter, unsigned long pfn, size_t csize,
|
||||
rc = copy_oldmem_user(iter->iov->iov_base, src, csize);
|
||||
else
|
||||
rc = copy_oldmem_kernel(iter->kvec->iov_base, src, csize);
|
||||
return rc;
|
||||
if (rc < 0)
|
||||
return rc;
|
||||
iov_iter_advance(iter, csize);
|
||||
return csize;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -516,6 +516,26 @@ static int __hw_perf_event_init(struct perf_event *event, unsigned int type)
|
||||
return err;
|
||||
}
|
||||
|
||||
/* Events CPU_CYLCES and INSTRUCTIONS can be submitted with two different
|
||||
* attribute::type values:
|
||||
* - PERF_TYPE_HARDWARE:
|
||||
* - pmu->type:
|
||||
* Handle both type of invocations identical. They address the same hardware.
|
||||
* The result is different when event modifiers exclude_kernel and/or
|
||||
* exclude_user are also set.
|
||||
*/
|
||||
static int cpumf_pmu_event_type(struct perf_event *event)
|
||||
{
|
||||
u64 ev = event->attr.config;
|
||||
|
||||
if (cpumf_generic_events_basic[PERF_COUNT_HW_CPU_CYCLES] == ev ||
|
||||
cpumf_generic_events_basic[PERF_COUNT_HW_INSTRUCTIONS] == ev ||
|
||||
cpumf_generic_events_user[PERF_COUNT_HW_CPU_CYCLES] == ev ||
|
||||
cpumf_generic_events_user[PERF_COUNT_HW_INSTRUCTIONS] == ev)
|
||||
return PERF_TYPE_HARDWARE;
|
||||
return PERF_TYPE_RAW;
|
||||
}
|
||||
|
||||
static int cpumf_pmu_event_init(struct perf_event *event)
|
||||
{
|
||||
unsigned int type = event->attr.type;
|
||||
@ -525,7 +545,7 @@ static int cpumf_pmu_event_init(struct perf_event *event)
|
||||
err = __hw_perf_event_init(event, type);
|
||||
else if (event->pmu->type == type)
|
||||
/* Registered as unknown PMU */
|
||||
err = __hw_perf_event_init(event, PERF_TYPE_RAW);
|
||||
err = __hw_perf_event_init(event, cpumf_pmu_event_type(event));
|
||||
else
|
||||
return -ENOENT;
|
||||
|
||||
|
@ -193,8 +193,9 @@ static int paicrypt_event_init(struct perf_event *event)
|
||||
/* PAI crypto PMU registered as PERF_TYPE_RAW, check event type */
|
||||
if (a->type != PERF_TYPE_RAW && event->pmu->type != a->type)
|
||||
return -ENOENT;
|
||||
/* PAI crypto event must be valid */
|
||||
if (a->config > PAI_CRYPTO_BASE + paicrypt_cnt)
|
||||
/* PAI crypto event must be in valid range */
|
||||
if (a->config < PAI_CRYPTO_BASE ||
|
||||
a->config > PAI_CRYPTO_BASE + paicrypt_cnt)
|
||||
return -EINVAL;
|
||||
/* Allow only CPU wide operation, no process context for now. */
|
||||
if (event->hw.target || event->cpu == -1)
|
||||
@ -208,6 +209,12 @@ static int paicrypt_event_init(struct perf_event *event)
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
/* Event initialization sets last_tag to 0. When later on the events
|
||||
* are deleted and re-added, do not reset the event count value to zero.
|
||||
* Events are added, deleted and re-added when 2 or more events
|
||||
* are active at the same time.
|
||||
*/
|
||||
event->hw.last_tag = 0;
|
||||
cpump->event = event;
|
||||
event->destroy = paicrypt_event_destroy;
|
||||
|
||||
@ -242,9 +249,12 @@ static void paicrypt_start(struct perf_event *event, int flags)
|
||||
{
|
||||
u64 sum;
|
||||
|
||||
sum = paicrypt_getall(event); /* Get current value */
|
||||
local64_set(&event->hw.prev_count, sum);
|
||||
local64_set(&event->count, 0);
|
||||
if (!event->hw.last_tag) {
|
||||
event->hw.last_tag = 1;
|
||||
sum = paicrypt_getall(event); /* Get current value */
|
||||
local64_set(&event->count, 0);
|
||||
local64_set(&event->hw.prev_count, sum);
|
||||
}
|
||||
}
|
||||
|
||||
static int paicrypt_add(struct perf_event *event, int flags)
|
||||
|
@ -844,7 +844,7 @@ static int __sev_dbg_encrypt_user(struct kvm *kvm, unsigned long paddr,
|
||||
|
||||
/* If source buffer is not aligned then use an intermediate buffer */
|
||||
if (!IS_ALIGNED((unsigned long)vaddr, 16)) {
|
||||
src_tpage = alloc_page(GFP_KERNEL);
|
||||
src_tpage = alloc_page(GFP_KERNEL_ACCOUNT);
|
||||
if (!src_tpage)
|
||||
return -ENOMEM;
|
||||
|
||||
@ -865,7 +865,7 @@ static int __sev_dbg_encrypt_user(struct kvm *kvm, unsigned long paddr,
|
||||
if (!IS_ALIGNED((unsigned long)dst_vaddr, 16) || !IS_ALIGNED(size, 16)) {
|
||||
int dst_offset;
|
||||
|
||||
dst_tpage = alloc_page(GFP_KERNEL);
|
||||
dst_tpage = alloc_page(GFP_KERNEL_ACCOUNT);
|
||||
if (!dst_tpage) {
|
||||
ret = -ENOMEM;
|
||||
goto e_free;
|
||||
@ -1665,19 +1665,24 @@ static void sev_migrate_from(struct kvm *dst_kvm, struct kvm *src_kvm)
|
||||
{
|
||||
struct kvm_sev_info *dst = &to_kvm_svm(dst_kvm)->sev_info;
|
||||
struct kvm_sev_info *src = &to_kvm_svm(src_kvm)->sev_info;
|
||||
struct kvm_vcpu *dst_vcpu, *src_vcpu;
|
||||
struct vcpu_svm *dst_svm, *src_svm;
|
||||
struct kvm_sev_info *mirror;
|
||||
unsigned long i;
|
||||
|
||||
dst->active = true;
|
||||
dst->asid = src->asid;
|
||||
dst->handle = src->handle;
|
||||
dst->pages_locked = src->pages_locked;
|
||||
dst->enc_context_owner = src->enc_context_owner;
|
||||
dst->es_active = src->es_active;
|
||||
|
||||
src->asid = 0;
|
||||
src->active = false;
|
||||
src->handle = 0;
|
||||
src->pages_locked = 0;
|
||||
src->enc_context_owner = NULL;
|
||||
src->es_active = false;
|
||||
|
||||
list_cut_before(&dst->regions_list, &src->regions_list, &src->regions_list);
|
||||
|
||||
@ -1704,27 +1709,22 @@ static void sev_migrate_from(struct kvm *dst_kvm, struct kvm *src_kvm)
|
||||
list_del(&src->mirror_entry);
|
||||
list_add_tail(&dst->mirror_entry, &owner_sev_info->mirror_vms);
|
||||
}
|
||||
}
|
||||
|
||||
static int sev_es_migrate_from(struct kvm *dst, struct kvm *src)
|
||||
{
|
||||
unsigned long i;
|
||||
struct kvm_vcpu *dst_vcpu, *src_vcpu;
|
||||
struct vcpu_svm *dst_svm, *src_svm;
|
||||
|
||||
if (atomic_read(&src->online_vcpus) != atomic_read(&dst->online_vcpus))
|
||||
return -EINVAL;
|
||||
|
||||
kvm_for_each_vcpu(i, src_vcpu, src) {
|
||||
if (!src_vcpu->arch.guest_state_protected)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
kvm_for_each_vcpu(i, src_vcpu, src) {
|
||||
src_svm = to_svm(src_vcpu);
|
||||
dst_vcpu = kvm_get_vcpu(dst, i);
|
||||
kvm_for_each_vcpu(i, dst_vcpu, dst_kvm) {
|
||||
dst_svm = to_svm(dst_vcpu);
|
||||
|
||||
sev_init_vmcb(dst_svm);
|
||||
|
||||
if (!dst->es_active)
|
||||
continue;
|
||||
|
||||
/*
|
||||
* Note, the source is not required to have the same number of
|
||||
* vCPUs as the destination when migrating a vanilla SEV VM.
|
||||
*/
|
||||
src_vcpu = kvm_get_vcpu(dst_kvm, i);
|
||||
src_svm = to_svm(src_vcpu);
|
||||
|
||||
/*
|
||||
* Transfer VMSA and GHCB state to the destination. Nullify and
|
||||
* clear source fields as appropriate, the state now belongs to
|
||||
@ -1740,8 +1740,23 @@ static int sev_es_migrate_from(struct kvm *dst, struct kvm *src)
|
||||
src_svm->vmcb->control.vmsa_pa = INVALID_PAGE;
|
||||
src_vcpu->arch.guest_state_protected = false;
|
||||
}
|
||||
to_kvm_svm(src)->sev_info.es_active = false;
|
||||
to_kvm_svm(dst)->sev_info.es_active = true;
|
||||
}
|
||||
|
||||
static int sev_check_source_vcpus(struct kvm *dst, struct kvm *src)
|
||||
{
|
||||
struct kvm_vcpu *src_vcpu;
|
||||
unsigned long i;
|
||||
|
||||
if (!sev_es_guest(src))
|
||||
return 0;
|
||||
|
||||
if (atomic_read(&src->online_vcpus) != atomic_read(&dst->online_vcpus))
|
||||
return -EINVAL;
|
||||
|
||||
kvm_for_each_vcpu(i, src_vcpu, src) {
|
||||
if (!src_vcpu->arch.guest_state_protected)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1789,11 +1804,9 @@ int sev_vm_move_enc_context_from(struct kvm *kvm, unsigned int source_fd)
|
||||
if (ret)
|
||||
goto out_dst_vcpu;
|
||||
|
||||
if (sev_es_guest(source_kvm)) {
|
||||
ret = sev_es_migrate_from(kvm, source_kvm);
|
||||
if (ret)
|
||||
goto out_source_vcpu;
|
||||
}
|
||||
ret = sev_check_source_vcpus(kvm, source_kvm);
|
||||
if (ret)
|
||||
goto out_source_vcpu;
|
||||
|
||||
sev_migrate_from(kvm, source_kvm);
|
||||
kvm_vm_dead(source_kvm);
|
||||
@ -2914,7 +2927,7 @@ int sev_es_string_io(struct vcpu_svm *svm, int size, unsigned int port, int in)
|
||||
count, in);
|
||||
}
|
||||
|
||||
void sev_es_init_vmcb(struct vcpu_svm *svm)
|
||||
static void sev_es_init_vmcb(struct vcpu_svm *svm)
|
||||
{
|
||||
struct kvm_vcpu *vcpu = &svm->vcpu;
|
||||
|
||||
@ -2967,6 +2980,15 @@ void sev_es_init_vmcb(struct vcpu_svm *svm)
|
||||
}
|
||||
}
|
||||
|
||||
void sev_init_vmcb(struct vcpu_svm *svm)
|
||||
{
|
||||
svm->vmcb->control.nested_ctl |= SVM_NESTED_CTL_SEV_ENABLE;
|
||||
clr_exception_intercept(svm, UD_VECTOR);
|
||||
|
||||
if (sev_es_guest(svm->vcpu.kvm))
|
||||
sev_es_init_vmcb(svm);
|
||||
}
|
||||
|
||||
void sev_es_vcpu_reset(struct vcpu_svm *svm)
|
||||
{
|
||||
/*
|
||||
|
@ -1212,15 +1212,8 @@ static void init_vmcb(struct kvm_vcpu *vcpu)
|
||||
svm->vmcb->control.int_ctl |= V_GIF_ENABLE_MASK;
|
||||
}
|
||||
|
||||
if (sev_guest(vcpu->kvm)) {
|
||||
svm->vmcb->control.nested_ctl |= SVM_NESTED_CTL_SEV_ENABLE;
|
||||
clr_exception_intercept(svm, UD_VECTOR);
|
||||
|
||||
if (sev_es_guest(vcpu->kvm)) {
|
||||
/* Perform SEV-ES specific VMCB updates */
|
||||
sev_es_init_vmcb(svm);
|
||||
}
|
||||
}
|
||||
if (sev_guest(vcpu->kvm))
|
||||
sev_init_vmcb(svm);
|
||||
|
||||
svm_hv_init_vmcb(vmcb);
|
||||
init_vmcb_after_set_cpuid(vcpu);
|
||||
|
@ -649,10 +649,10 @@ void __init sev_set_cpu_caps(void);
|
||||
void __init sev_hardware_setup(void);
|
||||
void sev_hardware_unsetup(void);
|
||||
int sev_cpu_init(struct svm_cpu_data *sd);
|
||||
void sev_init_vmcb(struct vcpu_svm *svm);
|
||||
void sev_free_vcpu(struct kvm_vcpu *vcpu);
|
||||
int sev_handle_vmgexit(struct kvm_vcpu *vcpu);
|
||||
int sev_es_string_io(struct vcpu_svm *svm, int size, unsigned int port, int in);
|
||||
void sev_es_init_vmcb(struct vcpu_svm *svm);
|
||||
void sev_es_vcpu_reset(struct vcpu_svm *svm);
|
||||
void sev_vcpu_deliver_sipi_vector(struct kvm_vcpu *vcpu, u8 vector);
|
||||
void sev_es_prepare_switch_to_guest(struct sev_es_save_area *hostsa);
|
||||
|
@ -2173,7 +2173,7 @@ ENDPROC(ret_from_kernel_thread)
|
||||
|
||||
#ifdef CONFIG_HIBERNATION
|
||||
|
||||
.bss
|
||||
.section .bss, "aw"
|
||||
.align 4
|
||||
.Lsaved_regs:
|
||||
#if defined(__XTENSA_WINDOWED_ABI__)
|
||||
|
@ -154,6 +154,7 @@ static void __init calibrate_ccount(void)
|
||||
cpu = of_find_compatible_node(NULL, NULL, "cdns,xtensa-cpu");
|
||||
if (cpu) {
|
||||
clk = of_clk_get(cpu, 0);
|
||||
of_node_put(cpu);
|
||||
if (!IS_ERR(clk)) {
|
||||
ccount_freq = clk_get_rate(clk);
|
||||
return;
|
||||
|
@ -133,6 +133,7 @@ static int __init machine_setup(void)
|
||||
|
||||
if ((eth = of_find_compatible_node(eth, NULL, "opencores,ethoc")))
|
||||
update_local_mac(eth);
|
||||
of_node_put(eth);
|
||||
return 0;
|
||||
}
|
||||
arch_initcall(machine_setup);
|
||||
|
@ -322,19 +322,6 @@ void blk_cleanup_queue(struct request_queue *q)
|
||||
blk_mq_exit_queue(q);
|
||||
}
|
||||
|
||||
/*
|
||||
* In theory, request pool of sched_tags belongs to request queue.
|
||||
* However, the current implementation requires tag_set for freeing
|
||||
* requests, so free the pool now.
|
||||
*
|
||||
* Queue has become frozen, there can't be any in-queue requests, so
|
||||
* it is safe to free requests now.
|
||||
*/
|
||||
mutex_lock(&q->sysfs_lock);
|
||||
if (q->elevator)
|
||||
blk_mq_sched_free_rqs(q);
|
||||
mutex_unlock(&q->sysfs_lock);
|
||||
|
||||
/* @q is and will stay empty, shutdown and put */
|
||||
blk_put_queue(q);
|
||||
}
|
||||
|
@ -144,7 +144,6 @@ int disk_register_independent_access_ranges(struct gendisk *disk,
|
||||
}
|
||||
|
||||
for (i = 0; i < iars->nr_ia_ranges; i++) {
|
||||
iars->ia_range[i].queue = q;
|
||||
ret = kobject_init_and_add(&iars->ia_range[i].kobj,
|
||||
&blk_ia_range_ktype, &iars->kobj,
|
||||
"%d", i);
|
||||
|
@ -711,11 +711,6 @@ void blk_mq_debugfs_register(struct request_queue *q)
|
||||
}
|
||||
}
|
||||
|
||||
void blk_mq_debugfs_unregister(struct request_queue *q)
|
||||
{
|
||||
q->sched_debugfs_dir = NULL;
|
||||
}
|
||||
|
||||
static void blk_mq_debugfs_register_ctx(struct blk_mq_hw_ctx *hctx,
|
||||
struct blk_mq_ctx *ctx)
|
||||
{
|
||||
@ -746,6 +741,8 @@ void blk_mq_debugfs_register_hctx(struct request_queue *q,
|
||||
|
||||
void blk_mq_debugfs_unregister_hctx(struct blk_mq_hw_ctx *hctx)
|
||||
{
|
||||
if (!hctx->queue->debugfs_dir)
|
||||
return;
|
||||
debugfs_remove_recursive(hctx->debugfs_dir);
|
||||
hctx->sched_debugfs_dir = NULL;
|
||||
hctx->debugfs_dir = NULL;
|
||||
@ -773,6 +770,8 @@ void blk_mq_debugfs_register_sched(struct request_queue *q)
|
||||
{
|
||||
struct elevator_type *e = q->elevator->type;
|
||||
|
||||
lockdep_assert_held(&q->debugfs_mutex);
|
||||
|
||||
/*
|
||||
* If the parent directory has not been created yet, return, we will be
|
||||
* called again later on and the directory/files will be created then.
|
||||
@ -790,6 +789,8 @@ void blk_mq_debugfs_register_sched(struct request_queue *q)
|
||||
|
||||
void blk_mq_debugfs_unregister_sched(struct request_queue *q)
|
||||
{
|
||||
lockdep_assert_held(&q->debugfs_mutex);
|
||||
|
||||
debugfs_remove_recursive(q->sched_debugfs_dir);
|
||||
q->sched_debugfs_dir = NULL;
|
||||
}
|
||||
@ -811,6 +812,10 @@ static const char *rq_qos_id_to_name(enum rq_qos_id id)
|
||||
|
||||
void blk_mq_debugfs_unregister_rqos(struct rq_qos *rqos)
|
||||
{
|
||||
lockdep_assert_held(&rqos->q->debugfs_mutex);
|
||||
|
||||
if (!rqos->q->debugfs_dir)
|
||||
return;
|
||||
debugfs_remove_recursive(rqos->debugfs_dir);
|
||||
rqos->debugfs_dir = NULL;
|
||||
}
|
||||
@ -820,6 +825,8 @@ void blk_mq_debugfs_register_rqos(struct rq_qos *rqos)
|
||||
struct request_queue *q = rqos->q;
|
||||
const char *dir_name = rq_qos_id_to_name(rqos->id);
|
||||
|
||||
lockdep_assert_held(&q->debugfs_mutex);
|
||||
|
||||
if (rqos->debugfs_dir || !rqos->ops->debugfs_attrs)
|
||||
return;
|
||||
|
||||
@ -833,17 +840,13 @@ void blk_mq_debugfs_register_rqos(struct rq_qos *rqos)
|
||||
debugfs_create_files(rqos->debugfs_dir, rqos, rqos->ops->debugfs_attrs);
|
||||
}
|
||||
|
||||
void blk_mq_debugfs_unregister_queue_rqos(struct request_queue *q)
|
||||
{
|
||||
debugfs_remove_recursive(q->rqos_debugfs_dir);
|
||||
q->rqos_debugfs_dir = NULL;
|
||||
}
|
||||
|
||||
void blk_mq_debugfs_register_sched_hctx(struct request_queue *q,
|
||||
struct blk_mq_hw_ctx *hctx)
|
||||
{
|
||||
struct elevator_type *e = q->elevator->type;
|
||||
|
||||
lockdep_assert_held(&q->debugfs_mutex);
|
||||
|
||||
/*
|
||||
* If the parent debugfs directory has not been created yet, return;
|
||||
* We will be called again later on with appropriate parent debugfs
|
||||
@ -863,6 +866,10 @@ void blk_mq_debugfs_register_sched_hctx(struct request_queue *q,
|
||||
|
||||
void blk_mq_debugfs_unregister_sched_hctx(struct blk_mq_hw_ctx *hctx)
|
||||
{
|
||||
lockdep_assert_held(&hctx->queue->debugfs_mutex);
|
||||
|
||||
if (!hctx->queue->debugfs_dir)
|
||||
return;
|
||||
debugfs_remove_recursive(hctx->sched_debugfs_dir);
|
||||
hctx->sched_debugfs_dir = NULL;
|
||||
}
|
||||
|
@ -21,7 +21,6 @@ int __blk_mq_debugfs_rq_show(struct seq_file *m, struct request *rq);
|
||||
int blk_mq_debugfs_rq_show(struct seq_file *m, void *v);
|
||||
|
||||
void blk_mq_debugfs_register(struct request_queue *q);
|
||||
void blk_mq_debugfs_unregister(struct request_queue *q);
|
||||
void blk_mq_debugfs_register_hctx(struct request_queue *q,
|
||||
struct blk_mq_hw_ctx *hctx);
|
||||
void blk_mq_debugfs_unregister_hctx(struct blk_mq_hw_ctx *hctx);
|
||||
@ -36,16 +35,11 @@ void blk_mq_debugfs_unregister_sched_hctx(struct blk_mq_hw_ctx *hctx);
|
||||
|
||||
void blk_mq_debugfs_register_rqos(struct rq_qos *rqos);
|
||||
void blk_mq_debugfs_unregister_rqos(struct rq_qos *rqos);
|
||||
void blk_mq_debugfs_unregister_queue_rqos(struct request_queue *q);
|
||||
#else
|
||||
static inline void blk_mq_debugfs_register(struct request_queue *q)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void blk_mq_debugfs_unregister(struct request_queue *q)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void blk_mq_debugfs_register_hctx(struct request_queue *q,
|
||||
struct blk_mq_hw_ctx *hctx)
|
||||
{
|
||||
@ -87,10 +81,6 @@ static inline void blk_mq_debugfs_register_rqos(struct rq_qos *rqos)
|
||||
static inline void blk_mq_debugfs_unregister_rqos(struct rq_qos *rqos)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void blk_mq_debugfs_unregister_queue_rqos(struct request_queue *q)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_BLK_DEBUG_FS_ZONED
|
||||
|
@ -594,7 +594,9 @@ int blk_mq_init_sched(struct request_queue *q, struct elevator_type *e)
|
||||
if (ret)
|
||||
goto err_free_map_and_rqs;
|
||||
|
||||
mutex_lock(&q->debugfs_mutex);
|
||||
blk_mq_debugfs_register_sched(q);
|
||||
mutex_unlock(&q->debugfs_mutex);
|
||||
|
||||
queue_for_each_hw_ctx(q, hctx, i) {
|
||||
if (e->ops.init_hctx) {
|
||||
@ -607,7 +609,9 @@ int blk_mq_init_sched(struct request_queue *q, struct elevator_type *e)
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
mutex_lock(&q->debugfs_mutex);
|
||||
blk_mq_debugfs_register_sched_hctx(q, hctx);
|
||||
mutex_unlock(&q->debugfs_mutex);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -648,14 +652,21 @@ void blk_mq_exit_sched(struct request_queue *q, struct elevator_queue *e)
|
||||
unsigned int flags = 0;
|
||||
|
||||
queue_for_each_hw_ctx(q, hctx, i) {
|
||||
mutex_lock(&q->debugfs_mutex);
|
||||
blk_mq_debugfs_unregister_sched_hctx(hctx);
|
||||
mutex_unlock(&q->debugfs_mutex);
|
||||
|
||||
if (e->type->ops.exit_hctx && hctx->sched_data) {
|
||||
e->type->ops.exit_hctx(hctx, i);
|
||||
hctx->sched_data = NULL;
|
||||
}
|
||||
flags = hctx->flags;
|
||||
}
|
||||
|
||||
mutex_lock(&q->debugfs_mutex);
|
||||
blk_mq_debugfs_unregister_sched(q);
|
||||
mutex_unlock(&q->debugfs_mutex);
|
||||
|
||||
if (e->type->ops.exit_sched)
|
||||
e->type->ops.exit_sched(e);
|
||||
blk_mq_sched_tags_teardown(q, flags);
|
||||
|
@ -2765,15 +2765,20 @@ static inline struct request *blk_mq_get_cached_request(struct request_queue *q,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
rq_qos_throttle(q, *bio);
|
||||
|
||||
if (blk_mq_get_hctx_type((*bio)->bi_opf) != rq->mq_hctx->type)
|
||||
return NULL;
|
||||
if (op_is_flush(rq->cmd_flags) != op_is_flush((*bio)->bi_opf))
|
||||
return NULL;
|
||||
|
||||
rq->cmd_flags = (*bio)->bi_opf;
|
||||
/*
|
||||
* If any qos ->throttle() end up blocking, we will have flushed the
|
||||
* plug and hence killed the cached_rq list as well. Pop this entry
|
||||
* before we throttle.
|
||||
*/
|
||||
plug->cached_rq = rq_list_next(rq);
|
||||
rq_qos_throttle(q, *bio);
|
||||
|
||||
rq->cmd_flags = (*bio)->bi_opf;
|
||||
INIT_LIST_HEAD(&rq->queuelist);
|
||||
return rq;
|
||||
}
|
||||
|
@ -294,8 +294,6 @@ void rq_qos_wait(struct rq_wait *rqw, void *private_data,
|
||||
|
||||
void rq_qos_exit(struct request_queue *q)
|
||||
{
|
||||
blk_mq_debugfs_unregister_queue_rqos(q);
|
||||
|
||||
while (q->rq_qos) {
|
||||
struct rq_qos *rqos = q->rq_qos;
|
||||
q->rq_qos = rqos->next;
|
||||
|
@ -104,8 +104,11 @@ static inline void rq_qos_add(struct request_queue *q, struct rq_qos *rqos)
|
||||
|
||||
blk_mq_unfreeze_queue(q);
|
||||
|
||||
if (rqos->ops->debugfs_attrs)
|
||||
if (rqos->ops->debugfs_attrs) {
|
||||
mutex_lock(&q->debugfs_mutex);
|
||||
blk_mq_debugfs_register_rqos(rqos);
|
||||
mutex_unlock(&q->debugfs_mutex);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void rq_qos_del(struct request_queue *q, struct rq_qos *rqos)
|
||||
@ -129,7 +132,9 @@ static inline void rq_qos_del(struct request_queue *q, struct rq_qos *rqos)
|
||||
|
||||
blk_mq_unfreeze_queue(q);
|
||||
|
||||
mutex_lock(&q->debugfs_mutex);
|
||||
blk_mq_debugfs_unregister_rqos(rqos);
|
||||
mutex_unlock(&q->debugfs_mutex);
|
||||
}
|
||||
|
||||
typedef bool (acquire_inflight_cb_t)(struct rq_wait *rqw, void *private_data);
|
||||
|
@ -779,14 +779,6 @@ static void blk_release_queue(struct kobject *kobj)
|
||||
if (queue_is_mq(q))
|
||||
blk_mq_release(q);
|
||||
|
||||
blk_trace_shutdown(q);
|
||||
mutex_lock(&q->debugfs_mutex);
|
||||
debugfs_remove_recursive(q->debugfs_dir);
|
||||
mutex_unlock(&q->debugfs_mutex);
|
||||
|
||||
if (queue_is_mq(q))
|
||||
blk_mq_debugfs_unregister(q);
|
||||
|
||||
bioset_exit(&q->bio_split);
|
||||
|
||||
if (blk_queue_has_srcu(q))
|
||||
@ -836,17 +828,16 @@ int blk_register_queue(struct gendisk *disk)
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
if (queue_is_mq(q))
|
||||
__blk_mq_register_dev(dev, q);
|
||||
mutex_lock(&q->sysfs_lock);
|
||||
|
||||
mutex_lock(&q->debugfs_mutex);
|
||||
q->debugfs_dir = debugfs_create_dir(kobject_name(q->kobj.parent),
|
||||
blk_debugfs_root);
|
||||
mutex_unlock(&q->debugfs_mutex);
|
||||
|
||||
if (queue_is_mq(q)) {
|
||||
__blk_mq_register_dev(dev, q);
|
||||
if (queue_is_mq(q))
|
||||
blk_mq_debugfs_register(q);
|
||||
}
|
||||
|
||||
mutex_lock(&q->sysfs_lock);
|
||||
mutex_unlock(&q->debugfs_mutex);
|
||||
|
||||
ret = disk_register_independent_access_ranges(disk, NULL);
|
||||
if (ret)
|
||||
@ -948,8 +939,15 @@ void blk_unregister_queue(struct gendisk *disk)
|
||||
/* Now that we've deleted all child objects, we can delete the queue. */
|
||||
kobject_uevent(&q->kobj, KOBJ_REMOVE);
|
||||
kobject_del(&q->kobj);
|
||||
|
||||
mutex_unlock(&q->sysfs_dir_lock);
|
||||
|
||||
mutex_lock(&q->debugfs_mutex);
|
||||
blk_trace_shutdown(q);
|
||||
debugfs_remove_recursive(q->debugfs_dir);
|
||||
q->debugfs_dir = NULL;
|
||||
q->sched_debugfs_dir = NULL;
|
||||
q->rqos_debugfs_dir = NULL;
|
||||
mutex_unlock(&q->debugfs_mutex);
|
||||
|
||||
kobject_put(&disk_to_dev(disk)->kobj);
|
||||
}
|
||||
|
@ -623,6 +623,7 @@ void del_gendisk(struct gendisk *disk)
|
||||
* Prevent new I/O from crossing bio_queue_enter().
|
||||
*/
|
||||
blk_queue_start_drain(q);
|
||||
blk_mq_freeze_queue_wait(q);
|
||||
|
||||
if (!(disk->flags & GENHD_FL_HIDDEN)) {
|
||||
sysfs_remove_link(&disk_to_dev(disk)->kobj, "bdi");
|
||||
@ -646,12 +647,21 @@ void del_gendisk(struct gendisk *disk)
|
||||
pm_runtime_set_memalloc_noio(disk_to_dev(disk), false);
|
||||
device_del(disk_to_dev(disk));
|
||||
|
||||
blk_mq_freeze_queue_wait(q);
|
||||
|
||||
blk_throtl_cancel_bios(disk->queue);
|
||||
|
||||
blk_sync_queue(q);
|
||||
blk_flush_integrity();
|
||||
blk_mq_cancel_work_sync(q);
|
||||
|
||||
blk_mq_quiesce_queue(q);
|
||||
if (q->elevator) {
|
||||
mutex_lock(&q->sysfs_lock);
|
||||
elevator_exit(q);
|
||||
mutex_unlock(&q->sysfs_lock);
|
||||
}
|
||||
rq_qos_exit(q);
|
||||
blk_mq_unquiesce_queue(q);
|
||||
|
||||
/*
|
||||
* Allow using passthrough request again after the queue is torn down.
|
||||
*/
|
||||
@ -1120,31 +1130,6 @@ static const struct attribute_group *disk_attr_groups[] = {
|
||||
NULL
|
||||
};
|
||||
|
||||
static void disk_release_mq(struct request_queue *q)
|
||||
{
|
||||
blk_mq_cancel_work_sync(q);
|
||||
|
||||
/*
|
||||
* There can't be any non non-passthrough bios in flight here, but
|
||||
* requests stay around longer, including passthrough ones so we
|
||||
* still need to freeze the queue here.
|
||||
*/
|
||||
blk_mq_freeze_queue(q);
|
||||
|
||||
/*
|
||||
* Since the I/O scheduler exit code may access cgroup information,
|
||||
* perform I/O scheduler exit before disassociating from the block
|
||||
* cgroup controller.
|
||||
*/
|
||||
if (q->elevator) {
|
||||
mutex_lock(&q->sysfs_lock);
|
||||
elevator_exit(q);
|
||||
mutex_unlock(&q->sysfs_lock);
|
||||
}
|
||||
rq_qos_exit(q);
|
||||
__blk_mq_unfreeze_queue(q, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* disk_release - releases all allocated resources of the gendisk
|
||||
* @dev: the device representing this disk
|
||||
@ -1166,9 +1151,6 @@ static void disk_release(struct device *dev)
|
||||
might_sleep();
|
||||
WARN_ON_ONCE(disk_live(disk));
|
||||
|
||||
if (queue_is_mq(disk->queue))
|
||||
disk_release_mq(disk->queue);
|
||||
|
||||
blkcg_exit_queue(disk->queue);
|
||||
|
||||
disk_release_events(disk);
|
||||
|
@ -79,10 +79,6 @@ int bd_link_disk_holder(struct block_device *bdev, struct gendisk *disk)
|
||||
|
||||
WARN_ON_ONCE(!bdev->bd_holder);
|
||||
|
||||
/* FIXME: remove the following once add_disk() handles errors */
|
||||
if (WARN_ON(!bdev->bd_holder_dir))
|
||||
goto out_unlock;
|
||||
|
||||
holder = bd_find_holder_disk(bdev, disk);
|
||||
if (holder) {
|
||||
holder->refcnt++;
|
||||
|
@ -73,6 +73,7 @@ module_param(device_id_scheme, bool, 0444);
|
||||
static int only_lcd = -1;
|
||||
module_param(only_lcd, int, 0444);
|
||||
|
||||
static bool has_backlight;
|
||||
static int register_count;
|
||||
static DEFINE_MUTEX(register_count_mutex);
|
||||
static DEFINE_MUTEX(video_list_lock);
|
||||
@ -1222,6 +1223,9 @@ acpi_video_bus_get_one_device(struct acpi_device *device,
|
||||
acpi_video_device_bind(video, data);
|
||||
acpi_video_device_find_cap(data);
|
||||
|
||||
if (data->cap._BCM && data->cap._BCL)
|
||||
has_backlight = true;
|
||||
|
||||
mutex_lock(&video->device_list_lock);
|
||||
list_add_tail(&data->entry, &video->video_device_list);
|
||||
mutex_unlock(&video->device_list_lock);
|
||||
@ -2249,6 +2253,7 @@ void acpi_video_unregister(void)
|
||||
if (register_count) {
|
||||
acpi_bus_unregister_driver(&acpi_video_bus);
|
||||
register_count = 0;
|
||||
has_backlight = false;
|
||||
}
|
||||
mutex_unlock(®ister_count_mutex);
|
||||
}
|
||||
@ -2270,13 +2275,7 @@ void acpi_video_unregister_backlight(void)
|
||||
|
||||
bool acpi_video_handles_brightness_key_presses(void)
|
||||
{
|
||||
bool have_video_busses;
|
||||
|
||||
mutex_lock(&video_list_lock);
|
||||
have_video_busses = !list_empty(&video_bus_head);
|
||||
mutex_unlock(&video_list_lock);
|
||||
|
||||
return have_video_busses &&
|
||||
return has_backlight &&
|
||||
(report_key_events & REPORT_BRIGHTNESS_KEY_EVENTS);
|
||||
}
|
||||
EXPORT_SYMBOL(acpi_video_handles_brightness_key_presses);
|
||||
|
@ -558,7 +558,7 @@ static ssize_t hard_offline_page_store(struct device *dev,
|
||||
if (kstrtoull(buf, 0, &pfn) < 0)
|
||||
return -EINVAL;
|
||||
pfn >>= PAGE_SHIFT;
|
||||
ret = memory_failure(pfn, 0);
|
||||
ret = memory_failure(pfn, MF_SW_SIMULATED);
|
||||
if (ret == -EOPNOTSUPP)
|
||||
ret = 0;
|
||||
return ret ? ret : count;
|
||||
|
@ -252,6 +252,7 @@ static void regmap_irq_enable(struct irq_data *data)
|
||||
struct regmap_irq_chip_data *d = irq_data_get_irq_chip_data(data);
|
||||
struct regmap *map = d->map;
|
||||
const struct regmap_irq *irq_data = irq_to_regmap_irq(d, data->hwirq);
|
||||
unsigned int reg = irq_data->reg_offset / map->reg_stride;
|
||||
unsigned int mask, type;
|
||||
|
||||
type = irq_data->type.type_falling_val | irq_data->type.type_rising_val;
|
||||
@ -268,14 +269,14 @@ static void regmap_irq_enable(struct irq_data *data)
|
||||
* at the corresponding offset in regmap_irq_set_type().
|
||||
*/
|
||||
if (d->chip->type_in_mask && type)
|
||||
mask = d->type_buf[irq_data->reg_offset / map->reg_stride];
|
||||
mask = d->type_buf[reg] & irq_data->mask;
|
||||
else
|
||||
mask = irq_data->mask;
|
||||
|
||||
if (d->chip->clear_on_unmask)
|
||||
d->clear_status = true;
|
||||
|
||||
d->mask_buf[irq_data->reg_offset / map->reg_stride] &= ~mask;
|
||||
d->mask_buf[reg] &= ~mask;
|
||||
}
|
||||
|
||||
static void regmap_irq_disable(struct irq_data *data)
|
||||
@ -386,6 +387,7 @@ static inline int read_sub_irq_data(struct regmap_irq_chip_data *data,
|
||||
subreg = &chip->sub_reg_offsets[b];
|
||||
for (i = 0; i < subreg->num_regs; i++) {
|
||||
unsigned int offset = subreg->offset[i];
|
||||
unsigned int index = offset / map->reg_stride;
|
||||
|
||||
if (chip->not_fixed_stride)
|
||||
ret = regmap_read(map,
|
||||
@ -394,7 +396,7 @@ static inline int read_sub_irq_data(struct regmap_irq_chip_data *data,
|
||||
else
|
||||
ret = regmap_read(map,
|
||||
chip->status_base + offset,
|
||||
&data->status_buf[offset]);
|
||||
&data->status_buf[index]);
|
||||
|
||||
if (ret)
|
||||
break;
|
||||
|
@ -1880,8 +1880,7 @@ static int _regmap_raw_write_impl(struct regmap *map, unsigned int reg,
|
||||
*/
|
||||
bool regmap_can_raw_write(struct regmap *map)
|
||||
{
|
||||
return map->bus && map->bus->write && map->format.format_val &&
|
||||
map->format.format_reg;
|
||||
return map->write && map->format.format_val && map->format.format_reg;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(regmap_can_raw_write);
|
||||
|
||||
@ -2155,10 +2154,9 @@ int regmap_noinc_write(struct regmap *map, unsigned int reg,
|
||||
size_t write_len;
|
||||
int ret;
|
||||
|
||||
if (!map->bus)
|
||||
return -EINVAL;
|
||||
if (!map->bus->write)
|
||||
if (!map->write)
|
||||
return -ENOTSUPP;
|
||||
|
||||
if (val_len % map->format.val_bytes)
|
||||
return -EINVAL;
|
||||
if (!IS_ALIGNED(reg, map->reg_stride))
|
||||
@ -2278,7 +2276,7 @@ int regmap_bulk_write(struct regmap *map, unsigned int reg, const void *val,
|
||||
* Some devices don't support bulk write, for them we have a series of
|
||||
* single write operations.
|
||||
*/
|
||||
if (!map->bus || !map->format.parse_inplace) {
|
||||
if (!map->write || !map->format.parse_inplace) {
|
||||
map->lock(map->lock_arg);
|
||||
for (i = 0; i < val_count; i++) {
|
||||
unsigned int ival;
|
||||
@ -2904,6 +2902,9 @@ int regmap_noinc_read(struct regmap *map, unsigned int reg,
|
||||
size_t read_len;
|
||||
int ret;
|
||||
|
||||
if (!map->read)
|
||||
return -ENOTSUPP;
|
||||
|
||||
if (val_len % map->format.val_bytes)
|
||||
return -EINVAL;
|
||||
if (!IS_ALIGNED(reg, map->reg_stride))
|
||||
@ -3017,7 +3018,7 @@ int regmap_bulk_read(struct regmap *map, unsigned int reg, void *val,
|
||||
if (val_count == 0)
|
||||
return -EINVAL;
|
||||
|
||||
if (map->format.parse_inplace && (vol || map->cache_type == REGCACHE_NONE)) {
|
||||
if (map->read && map->format.parse_inplace && (vol || map->cache_type == REGCACHE_NONE)) {
|
||||
ret = regmap_raw_read(map, reg, val, val_bytes * val_count);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
@ -2114,9 +2114,11 @@ static void blkfront_closing(struct blkfront_info *info)
|
||||
return;
|
||||
|
||||
/* No more blkif_request(). */
|
||||
blk_mq_stop_hw_queues(info->rq);
|
||||
blk_mark_disk_dead(info->gd);
|
||||
set_capacity(info->gd, 0);
|
||||
if (info->rq && info->gd) {
|
||||
blk_mq_stop_hw_queues(info->rq);
|
||||
blk_mark_disk_dead(info->gd);
|
||||
set_capacity(info->gd, 0);
|
||||
}
|
||||
|
||||
for_each_rinfo(info, rinfo, i) {
|
||||
/* No more gnttab callback work. */
|
||||
@ -2457,16 +2459,19 @@ static int blkfront_remove(struct xenbus_device *xbdev)
|
||||
|
||||
dev_dbg(&xbdev->dev, "%s removed", xbdev->nodename);
|
||||
|
||||
del_gendisk(info->gd);
|
||||
if (info->gd)
|
||||
del_gendisk(info->gd);
|
||||
|
||||
mutex_lock(&blkfront_mutex);
|
||||
list_del(&info->info_list);
|
||||
mutex_unlock(&blkfront_mutex);
|
||||
|
||||
blkif_free(info, 0);
|
||||
xlbd_release_minors(info->gd->first_minor, info->gd->minors);
|
||||
blk_cleanup_disk(info->gd);
|
||||
blk_mq_free_tag_set(&info->tag_set);
|
||||
if (info->gd) {
|
||||
xlbd_release_minors(info->gd->first_minor, info->gd->minors);
|
||||
blk_cleanup_disk(info->gd);
|
||||
blk_mq_free_tag_set(&info->tag_set);
|
||||
}
|
||||
|
||||
kfree(info);
|
||||
return 0;
|
||||
|
@ -175,10 +175,9 @@ static int bt1_apb_request_rst(struct bt1_apb *apb)
|
||||
int ret;
|
||||
|
||||
apb->prst = devm_reset_control_get_optional_exclusive(apb->dev, "prst");
|
||||
if (IS_ERR(apb->prst)) {
|
||||
dev_warn(apb->dev, "Couldn't get reset control line\n");
|
||||
return PTR_ERR(apb->prst);
|
||||
}
|
||||
if (IS_ERR(apb->prst))
|
||||
return dev_err_probe(apb->dev, PTR_ERR(apb->prst),
|
||||
"Couldn't get reset control line\n");
|
||||
|
||||
ret = reset_control_deassert(apb->prst);
|
||||
if (ret)
|
||||
@ -199,10 +198,9 @@ static int bt1_apb_request_clk(struct bt1_apb *apb)
|
||||
int ret;
|
||||
|
||||
apb->pclk = devm_clk_get(apb->dev, "pclk");
|
||||
if (IS_ERR(apb->pclk)) {
|
||||
dev_err(apb->dev, "Couldn't get APB clock descriptor\n");
|
||||
return PTR_ERR(apb->pclk);
|
||||
}
|
||||
if (IS_ERR(apb->pclk))
|
||||
return dev_err_probe(apb->dev, PTR_ERR(apb->pclk),
|
||||
"Couldn't get APB clock descriptor\n");
|
||||
|
||||
ret = clk_prepare_enable(apb->pclk);
|
||||
if (ret) {
|
||||
|
@ -135,10 +135,9 @@ static int bt1_axi_request_rst(struct bt1_axi *axi)
|
||||
int ret;
|
||||
|
||||
axi->arst = devm_reset_control_get_optional_exclusive(axi->dev, "arst");
|
||||
if (IS_ERR(axi->arst)) {
|
||||
dev_warn(axi->dev, "Couldn't get reset control line\n");
|
||||
return PTR_ERR(axi->arst);
|
||||
}
|
||||
if (IS_ERR(axi->arst))
|
||||
return dev_err_probe(axi->dev, PTR_ERR(axi->arst),
|
||||
"Couldn't get reset control line\n");
|
||||
|
||||
ret = reset_control_deassert(axi->arst);
|
||||
if (ret)
|
||||
@ -159,10 +158,9 @@ static int bt1_axi_request_clk(struct bt1_axi *axi)
|
||||
int ret;
|
||||
|
||||
axi->aclk = devm_clk_get(axi->dev, "aclk");
|
||||
if (IS_ERR(axi->aclk)) {
|
||||
dev_err(axi->dev, "Couldn't get AXI Interconnect clock\n");
|
||||
return PTR_ERR(axi->aclk);
|
||||
}
|
||||
if (IS_ERR(axi->aclk))
|
||||
return dev_err_probe(axi->dev, PTR_ERR(axi->aclk),
|
||||
"Couldn't get AXI Interconnect clock\n");
|
||||
|
||||
ret = clk_prepare_enable(axi->aclk);
|
||||
if (ret) {
|
||||
|
@ -87,7 +87,7 @@ static struct fasync_struct *fasync;
|
||||
|
||||
/* Control how we warn userspace. */
|
||||
static struct ratelimit_state urandom_warning =
|
||||
RATELIMIT_STATE_INIT("warn_urandom_randomness", HZ, 3);
|
||||
RATELIMIT_STATE_INIT_FLAGS("urandom_warning", HZ, 3, RATELIMIT_MSG_ON_RELEASE);
|
||||
static int ratelimit_disable __read_mostly =
|
||||
IS_ENABLED(CONFIG_WARN_ALL_UNSEEDED_RANDOM);
|
||||
module_param_named(ratelimit_disable, ratelimit_disable, int, 0644);
|
||||
@ -408,7 +408,7 @@ static ssize_t get_random_bytes_user(struct iov_iter *iter)
|
||||
|
||||
/*
|
||||
* Immediately overwrite the ChaCha key at index 4 with random
|
||||
* bytes, in case userspace causes copy_to_user() below to sleep
|
||||
* bytes, in case userspace causes copy_to_iter() below to sleep
|
||||
* forever, so that we still retain forward secrecy in that case.
|
||||
*/
|
||||
crng_make_state(chacha_state, (u8 *)&chacha_state[4], CHACHA_KEY_SIZE);
|
||||
@ -1009,7 +1009,7 @@ void add_interrupt_randomness(int irq)
|
||||
if (new_count & MIX_INFLIGHT)
|
||||
return;
|
||||
|
||||
if (new_count < 64 && !time_is_before_jiffies(fast_pool->last + HZ))
|
||||
if (new_count < 1024 && !time_is_before_jiffies(fast_pool->last + HZ))
|
||||
return;
|
||||
|
||||
if (unlikely(!fast_pool->mix.func))
|
||||
|
@ -85,17 +85,9 @@ static int sp_get_irqs(struct sp_device *sp)
|
||||
struct sp_platform *sp_platform = sp->dev_specific;
|
||||
struct device *dev = sp->dev;
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
unsigned int i, count;
|
||||
int ret;
|
||||
|
||||
for (i = 0, count = 0; i < pdev->num_resources; i++) {
|
||||
struct resource *res = &pdev->resource[i];
|
||||
|
||||
if (resource_type(res) == IORESOURCE_IRQ)
|
||||
count++;
|
||||
}
|
||||
|
||||
sp_platform->irq_count = count;
|
||||
sp_platform->irq_count = platform_irq_count(pdev);
|
||||
|
||||
ret = platform_get_irq(pdev, 0);
|
||||
if (ret < 0) {
|
||||
@ -104,7 +96,7 @@ static int sp_get_irqs(struct sp_device *sp)
|
||||
}
|
||||
|
||||
sp->psp_irq = ret;
|
||||
if (count == 1) {
|
||||
if (sp_platform->irq_count == 1) {
|
||||
sp->ccp_irq = ret;
|
||||
} else {
|
||||
ret = platform_get_irq(pdev, 1);
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user