mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
support for Amlogic SPI Flash Controller IP
Merge series from Xianwei Zhao <xianwei.zhao@amlogic.com>: This Flash Controller is derived by adding an SPI path to the original raw NAND controller. This controller supports two modes: raw mode and SPI mode. The raw mode has already been implemented in the community (drivers/mtd/nand/raw/meson_nand.c). This submission supports the SPI mode. Add the drivers and bindings corresponding to the SPI Flash Controller.
This commit is contained in:
1
.mailmap
1
.mailmap
@@ -589,6 +589,7 @@ Nikolay Aleksandrov <razor@blackwall.org> <nikolay@redhat.com>
|
||||
Nikolay Aleksandrov <razor@blackwall.org> <nikolay@cumulusnetworks.com>
|
||||
Nikolay Aleksandrov <razor@blackwall.org> <nikolay@nvidia.com>
|
||||
Nikolay Aleksandrov <razor@blackwall.org> <nikolay@isovalent.com>
|
||||
Nobuhiro Iwamatsu <nobuhiro.iwamatsu.x90@mail.toshiba> <nobuhiro1.iwamatsu@toshiba.co.jp>
|
||||
Odelu Kukatla <quic_okukatla@quicinc.com> <okukatla@codeaurora.org>
|
||||
Oleksandr Natalenko <oleksandr@natalenko.name> <oleksandr@redhat.com>
|
||||
Oleksij Rempel <linux@rempel-privat.de> <bug-track@fisher-privat.net>
|
||||
|
||||
82
Documentation/devicetree/bindings/spi/amlogic,a4-spifc.yaml
Normal file
82
Documentation/devicetree/bindings/spi/amlogic,a4-spifc.yaml
Normal file
@@ -0,0 +1,82 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
# Copyright (C) 2025 Amlogic, Inc. All rights reserved
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/spi/amlogic,a4-spifc.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: SPI flash controller for Amlogic ARM SoCs
|
||||
|
||||
maintainers:
|
||||
- Liang Yang <liang.yang@amlogic.com>
|
||||
- Feng Chen <feng.chen@amlogic.com>
|
||||
- Xianwei Zhao <xianwei.zhao@amlogic.com>
|
||||
|
||||
description:
|
||||
The Amlogic SPI flash controller is an extended version of the Amlogic NAND
|
||||
flash controller. It supports SPI Nor Flash and SPI NAND Flash(where the Host
|
||||
ECC HW engine could be enabled).
|
||||
|
||||
allOf:
|
||||
- $ref: /schemas/spi/spi-controller.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: amlogic,a4-spifc
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
items:
|
||||
- description: clock apb gate
|
||||
- description: clock used for the controller
|
||||
|
||||
clock-names:
|
||||
items:
|
||||
- const: gate
|
||||
- const: core
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
amlogic,rx-adj:
|
||||
description:
|
||||
Number of clock cycles by which sampling is delayed.
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
enum: [0, 1, 2, 3]
|
||||
default: 0
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- clocks
|
||||
- clock-names
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
sfc0: spi@fe08d000 {
|
||||
compatible = "amlogic,a4-spifc";
|
||||
reg = <0xfe08d000 0x800>;
|
||||
clocks = <&clkc_periphs 31>,
|
||||
<&clkc_periphs 102>;
|
||||
clock-names = "gate", "core";
|
||||
|
||||
pinctrl-0 = <&spiflash_default>;
|
||||
pinctrl-names = "default";
|
||||
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
flash@0 {
|
||||
compatible = "spi-nand";
|
||||
reg = <0>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
nand-ecc-engine = <&sfc0>;
|
||||
nand-ecc-strength = <8>;
|
||||
nand-ecc-step-size = <512>;
|
||||
};
|
||||
};
|
||||
@@ -433,9 +433,8 @@ Threaded NAPI
|
||||
|
||||
Threaded NAPI is an operating mode that uses dedicated kernel
|
||||
threads rather than software IRQ context for NAPI processing.
|
||||
The configuration is per netdevice and will affect all
|
||||
NAPI instances of that device. Each NAPI instance will spawn a separate
|
||||
thread (called ``napi/${ifc-name}-${napi-id}``).
|
||||
Each threaded NAPI instance will spawn a separate thread
|
||||
(called ``napi/${ifc-name}-${napi-id}``).
|
||||
|
||||
It is recommended to pin each kernel thread to a single CPU, the same
|
||||
CPU as the CPU which services the interrupt. Note that the mapping
|
||||
|
||||
@@ -2253,8 +2253,15 @@ device_setup
|
||||
Default: 0x0000
|
||||
ignore_ctl_error
|
||||
Ignore any USB-controller regarding mixer interface (default: no)
|
||||
``ignore_ctl_error=1`` may help when you get an error at accessing
|
||||
the mixer element such as URB error -22. This happens on some
|
||||
buggy USB device or the controller. This workaround corresponds to
|
||||
the ``quirk_flags`` bit 14, too.
|
||||
autoclock
|
||||
Enable auto-clock selection for UAC2 devices (default: yes)
|
||||
lowlatency
|
||||
Enable low latency playback mode (default: yes).
|
||||
Could disable it to switch back to the old mode if face a regression.
|
||||
quirk_alias
|
||||
Quirk alias list, pass strings like ``0123abcd:5678beef``, which
|
||||
applies the existing quirk for the device 5678:beef to a new
|
||||
@@ -2284,6 +2291,11 @@ delayed_register
|
||||
The driver prints a message like "Found post-registration device
|
||||
assignment: 1234abcd:04" for such a device, so that user can
|
||||
notice the need.
|
||||
skip_validation
|
||||
Skip unit descriptor validation (default: no).
|
||||
The option is used to ignores the validation errors with the hexdump
|
||||
of the unit descriptor instead of a driver probe error, so that we
|
||||
can check its details.
|
||||
quirk_flags
|
||||
Contains the bit flags for various device specific workarounds.
|
||||
Applied to the corresponding card index.
|
||||
@@ -2307,6 +2319,16 @@ quirk_flags
|
||||
* bit 16: Set up the interface at first like UAC1
|
||||
* bit 17: Apply the generic implicit feedback sync mode
|
||||
* bit 18: Don't apply implicit feedback sync mode
|
||||
* bit 19: Don't closed interface during setting sample rate
|
||||
* bit 20: Force an interface reset whenever stopping & restarting
|
||||
a stream
|
||||
* bit 21: Do not set PCM rate (frequency) when only one rate is
|
||||
available for the given endpoint.
|
||||
* bit 22: Set the fixed resolution 16 for Mic Capture Volume
|
||||
* bit 23: Set the fixed resolution 384 for Mic Capture Volume
|
||||
* bit 24: Set minimum volume control value as mute for devices
|
||||
where the lowest playback value represents muted state instead
|
||||
of minimum audible volume
|
||||
|
||||
This module supports multiple devices, autoprobe and hotplugging.
|
||||
|
||||
@@ -2314,10 +2336,9 @@ NB: ``nrpacks`` parameter can be modified dynamically via sysfs.
|
||||
Don't put the value over 20. Changing via sysfs has no sanity
|
||||
check.
|
||||
|
||||
NB: ``ignore_ctl_error=1`` may help when you get an error at accessing
|
||||
the mixer element such as URB error -22. This happens on some
|
||||
buggy USB device or the controller. This workaround corresponds to
|
||||
the ``quirk_flags`` bit 14, too.
|
||||
NB: ``ignore_ctl_error=1`` just provides a quick way to work around the
|
||||
issues. If you have a buggy device that requires these quirks, please
|
||||
report it to the upstream.
|
||||
|
||||
NB: ``quirk_alias`` option is provided only for testing / development.
|
||||
If you want to have a proper support, contact to upstream for
|
||||
|
||||
24
MAINTAINERS
24
MAINTAINERS
@@ -1318,6 +1318,16 @@ S: Maintained
|
||||
F: Documentation/devicetree/bindings/rtc/amlogic,a4-rtc.yaml
|
||||
F: drivers/rtc/rtc-amlogic-a4.c
|
||||
|
||||
AMLOGIC SPIFC DRIVER
|
||||
M: Liang Yang <liang.yang@amlogic.com>
|
||||
M: Feng Chen <feng.chen@amlogic.com>
|
||||
M: Xianwei Zhao <xianwei.zhao@amlogic.com>
|
||||
L: linux-amlogic@lists.infradead.org
|
||||
L: linux-spi@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/spi/amlogic,a4-spifc.yaml
|
||||
F: drivers/spi/spi-amlogic-spifc-a4.c
|
||||
|
||||
AMLOGIC SPISG DRIVER
|
||||
M: Sunny Luo <sunny.luo@amlogic.com>
|
||||
M: Xianwei Zhao <xianwei.zhao@amlogic.com>
|
||||
@@ -3526,7 +3536,7 @@ F: Documentation/devicetree/bindings/arm/ti/nspire.yaml
|
||||
F: arch/arm/boot/dts/nspire/
|
||||
|
||||
ARM/TOSHIBA VISCONTI ARCHITECTURE
|
||||
M: Nobuhiro Iwamatsu <nobuhiro1.iwamatsu@toshiba.co.jp>
|
||||
M: Nobuhiro Iwamatsu <nobuhiro.iwamatsu.x90@mail.toshiba>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Supported
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/iwamatsu/linux-visconti.git
|
||||
@@ -3667,6 +3677,7 @@ F: drivers/virt/coco/arm-cca-guest/
|
||||
F: drivers/virt/coco/pkvm-guest/
|
||||
F: tools/testing/selftests/arm64/
|
||||
X: arch/arm64/boot/dts/
|
||||
X: arch/arm64/configs/defconfig
|
||||
|
||||
ARROW SPEEDCHIPS XRS7000 SERIES ETHERNET SWITCH DRIVER
|
||||
M: George McCollister <george.mccollister@gmail.com>
|
||||
@@ -7820,7 +7831,7 @@ Q: https://patchwork.freedesktop.org/project/nouveau/
|
||||
Q: https://gitlab.freedesktop.org/drm/nouveau/-/merge_requests
|
||||
B: https://gitlab.freedesktop.org/drm/nouveau/-/issues
|
||||
C: irc://irc.oftc.net/nouveau
|
||||
T: git https://gitlab.freedesktop.org/drm/nouveau.git
|
||||
T: git https://gitlab.freedesktop.org/drm/misc/kernel.git
|
||||
F: drivers/gpu/drm/nouveau/
|
||||
F: include/uapi/drm/nouveau_drm.h
|
||||
|
||||
@@ -10388,7 +10399,7 @@ S: Maintained
|
||||
F: drivers/input/touchscreen/goodix*
|
||||
|
||||
GOOGLE ETHERNET DRIVERS
|
||||
M: Jeroen de Borst <jeroendb@google.com>
|
||||
M: Joshua Washington <joshwash@google.com>
|
||||
M: Harshitha Ramamurthy <hramamurthy@google.com>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
@@ -17850,6 +17861,7 @@ F: net/ipv6/tcp*.c
|
||||
NETWORKING [TLS]
|
||||
M: John Fastabend <john.fastabend@gmail.com>
|
||||
M: Jakub Kicinski <kuba@kernel.org>
|
||||
M: Sabrina Dubroca <sd@queasysnail.net>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
F: include/net/tls.h
|
||||
@@ -24252,6 +24264,12 @@ S: Maintained
|
||||
F: Documentation/devicetree/bindings/input/allwinner,sun4i-a10-lradc-keys.yaml
|
||||
F: drivers/input/keyboard/sun4i-lradc-keys.c
|
||||
|
||||
SUNDANCE NETWORK DRIVER
|
||||
M: Denis Kirjanov <dkirjanov@suse.de>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/net/ethernet/dlink/sundance.c
|
||||
|
||||
SUNPLUS ETHERNET DRIVER
|
||||
M: Wells Lu <wellslutw@gmail.com>
|
||||
L: netdev@vger.kernel.org
|
||||
|
||||
2
Makefile
2
Makefile
@@ -2,7 +2,7 @@
|
||||
VERSION = 6
|
||||
PATCHLEVEL = 17
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc4
|
||||
EXTRAVERSION = -rc5
|
||||
NAME = Baby Opossum Posse
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
||||
@@ -387,6 +387,8 @@
|
||||
|
||||
&sdmmc1 {
|
||||
bus-width = <4>;
|
||||
no-1-8-v;
|
||||
sdhci-caps-mask = <0x0 0x00200000>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_sdmmc1_default>;
|
||||
status = "okay";
|
||||
|
||||
@@ -272,7 +272,7 @@
|
||||
phy-mode = "rmii";
|
||||
phy-handle = <&phy0>;
|
||||
assigned-clocks = <&cru SCLK_MAC_SRC>;
|
||||
assigned-clock-rates= <50000000>;
|
||||
assigned-clock-rates = <50000000>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&rmii_pins>;
|
||||
status = "okay";
|
||||
|
||||
@@ -250,9 +250,9 @@
|
||||
&i2s0 {
|
||||
/delete-property/ pinctrl-0;
|
||||
rockchip,trcm-sync-rx-only;
|
||||
pinctrl-0 = <&i2s0m0_sclk_rx>,
|
||||
<&i2s0m0_lrck_rx>,
|
||||
<&i2s0m0_sdi0>;
|
||||
pinctrl-0 = <&i2s0m0_sclk_rx>,
|
||||
<&i2s0m0_lrck_rx>,
|
||||
<&i2s0m0_sdi0>;
|
||||
pinctrl-names = "default";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
config ARCH_MICROCHIP
|
||||
bool
|
||||
|
||||
menuconfig ARCH_AT91
|
||||
bool "AT91/Microchip SoCs"
|
||||
depends on (CPU_LITTLE_ENDIAN && (ARCH_MULTI_V4T || ARCH_MULTI_V5)) || \
|
||||
@@ -8,6 +11,7 @@ menuconfig ARCH_AT91
|
||||
select GPIOLIB
|
||||
select PINCTRL
|
||||
select SOC_BUS
|
||||
select ARCH_MICROCHIP
|
||||
|
||||
if ARCH_AT91
|
||||
config SOC_SAMV7
|
||||
|
||||
@@ -14,6 +14,9 @@
|
||||
#size-cells = <2>;
|
||||
|
||||
aliases {
|
||||
serial0 = &uart0;
|
||||
serial1 = &uart1;
|
||||
serial2 = &uart2;
|
||||
serial3 = &uart3;
|
||||
};
|
||||
|
||||
|
||||
@@ -555,6 +555,7 @@
|
||||
pinctrl-2 = <&pinctrl_usdhc2_200mhz>, <&pinctrl_usdhc2_gpio>;
|
||||
cd-gpios = <&gpio2 12 GPIO_ACTIVE_LOW>;
|
||||
vmmc-supply = <®_usdhc2_vmmc>;
|
||||
vqmmc-supply = <&ldo5>;
|
||||
bus-width = <4>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@@ -609,6 +609,7 @@
|
||||
pinctrl-2 = <&pinctrl_usdhc2_200mhz>, <&pinctrl_usdhc2_gpio>;
|
||||
cd-gpios = <&gpio2 12 GPIO_ACTIVE_LOW>;
|
||||
vmmc-supply = <®_usdhc2_vmmc>;
|
||||
vqmmc-supply = <&ldo5>;
|
||||
bus-width = <4>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@@ -467,6 +467,10 @@
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
®_usdhc2_vqmmc {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&sai5 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_sai5>;
|
||||
@@ -876,8 +880,7 @@
|
||||
<MX8MP_IOMUXC_SD2_DATA0__USDHC2_DATA0 0x1d2>,
|
||||
<MX8MP_IOMUXC_SD2_DATA1__USDHC2_DATA1 0x1d2>,
|
||||
<MX8MP_IOMUXC_SD2_DATA2__USDHC2_DATA2 0x1d2>,
|
||||
<MX8MP_IOMUXC_SD2_DATA3__USDHC2_DATA3 0x1d2>,
|
||||
<MX8MP_IOMUXC_GPIO1_IO04__USDHC2_VSELECT 0xc0>;
|
||||
<MX8MP_IOMUXC_SD2_DATA3__USDHC2_DATA3 0x1d2>;
|
||||
};
|
||||
|
||||
pinctrl_usdhc2_100mhz: usdhc2-100mhzgrp {
|
||||
@@ -886,8 +889,7 @@
|
||||
<MX8MP_IOMUXC_SD2_DATA0__USDHC2_DATA0 0x1d4>,
|
||||
<MX8MP_IOMUXC_SD2_DATA1__USDHC2_DATA1 0x1d4>,
|
||||
<MX8MP_IOMUXC_SD2_DATA2__USDHC2_DATA2 0x1d4>,
|
||||
<MX8MP_IOMUXC_SD2_DATA3__USDHC2_DATA3 0x1d4>,
|
||||
<MX8MP_IOMUXC_GPIO1_IO04__USDHC2_VSELECT 0xc0>;
|
||||
<MX8MP_IOMUXC_SD2_DATA3__USDHC2_DATA3 0x1d4>;
|
||||
};
|
||||
|
||||
pinctrl_usdhc2_200mhz: usdhc2-200mhzgrp {
|
||||
@@ -896,8 +898,7 @@
|
||||
<MX8MP_IOMUXC_SD2_DATA0__USDHC2_DATA0 0x1d4>,
|
||||
<MX8MP_IOMUXC_SD2_DATA1__USDHC2_DATA1 0x1d4>,
|
||||
<MX8MP_IOMUXC_SD2_DATA2__USDHC2_DATA2 0x1d4>,
|
||||
<MX8MP_IOMUXC_SD2_DATA3__USDHC2_DATA3 0x1d4>,
|
||||
<MX8MP_IOMUXC_GPIO1_IO04__USDHC2_VSELECT 0xc0>;
|
||||
<MX8MP_IOMUXC_SD2_DATA3__USDHC2_DATA3 0x1d4>;
|
||||
};
|
||||
|
||||
pinctrl_usdhc2_gpio: usdhc2-gpiogrp {
|
||||
|
||||
@@ -604,6 +604,10 @@
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
®_usdhc2_vqmmc {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&sai3 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_sai3>;
|
||||
@@ -983,8 +987,7 @@
|
||||
<MX8MP_IOMUXC_SD2_DATA0__USDHC2_DATA0 0x1d2>,
|
||||
<MX8MP_IOMUXC_SD2_DATA1__USDHC2_DATA1 0x1d2>,
|
||||
<MX8MP_IOMUXC_SD2_DATA2__USDHC2_DATA2 0x1d2>,
|
||||
<MX8MP_IOMUXC_SD2_DATA3__USDHC2_DATA3 0x1d2>,
|
||||
<MX8MP_IOMUXC_GPIO1_IO04__USDHC2_VSELECT 0xc0>;
|
||||
<MX8MP_IOMUXC_SD2_DATA3__USDHC2_DATA3 0x1d2>;
|
||||
};
|
||||
|
||||
pinctrl_usdhc2_100mhz: usdhc2-100mhzgrp {
|
||||
@@ -993,8 +996,7 @@
|
||||
<MX8MP_IOMUXC_SD2_DATA0__USDHC2_DATA0 0x1d4>,
|
||||
<MX8MP_IOMUXC_SD2_DATA1__USDHC2_DATA1 0x1d4>,
|
||||
<MX8MP_IOMUXC_SD2_DATA2__USDHC2_DATA2 0x1d4>,
|
||||
<MX8MP_IOMUXC_SD2_DATA3__USDHC2_DATA3 0x1d4>,
|
||||
<MX8MP_IOMUXC_GPIO1_IO04__USDHC2_VSELECT 0xc0>;
|
||||
<MX8MP_IOMUXC_SD2_DATA3__USDHC2_DATA3 0x1d4>;
|
||||
};
|
||||
|
||||
pinctrl_usdhc2_200mhz: usdhc2-200mhzgrp {
|
||||
@@ -1003,8 +1005,7 @@
|
||||
<MX8MP_IOMUXC_SD2_DATA0__USDHC2_DATA0 0x1d4>,
|
||||
<MX8MP_IOMUXC_SD2_DATA1__USDHC2_DATA1 0x1d4>,
|
||||
<MX8MP_IOMUXC_SD2_DATA2__USDHC2_DATA2 0x1d4>,
|
||||
<MX8MP_IOMUXC_SD2_DATA3__USDHC2_DATA3 0x1d4>,
|
||||
<MX8MP_IOMUXC_GPIO1_IO04__USDHC2_VSELECT 0xc0>;
|
||||
<MX8MP_IOMUXC_SD2_DATA3__USDHC2_DATA3 0x1d4>;
|
||||
};
|
||||
|
||||
pinctrl_usdhc2_gpio: usdhc2-gpiogrp {
|
||||
|
||||
@@ -16,13 +16,18 @@
|
||||
reg = <0x0 0x40000000 0 0x80000000>;
|
||||
};
|
||||
|
||||
/* identical to buck4_reg, but should never change */
|
||||
reg_vcc3v3: regulator-vcc3v3 {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "VCC3V3";
|
||||
regulator-min-microvolt = <3300000>;
|
||||
reg_usdhc2_vqmmc: regulator-usdhc2-vqmmc {
|
||||
compatible = "regulator-gpio";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_reg_usdhc2_vqmmc>;
|
||||
regulator-name = "V_SD2";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
regulator-always-on;
|
||||
gpios = <&gpio1 4 GPIO_ACTIVE_HIGH>;
|
||||
states = <1800000 0x1>,
|
||||
<3300000 0x0>;
|
||||
vin-supply = <&ldo5_reg>;
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
|
||||
@@ -173,17 +178,21 @@
|
||||
read-only;
|
||||
reg = <0x53>;
|
||||
pagesize = <16>;
|
||||
vcc-supply = <®_vcc3v3>;
|
||||
vcc-supply = <&buck4_reg>;
|
||||
};
|
||||
|
||||
m24c64: eeprom@57 {
|
||||
compatible = "atmel,24c64";
|
||||
reg = <0x57>;
|
||||
pagesize = <32>;
|
||||
vcc-supply = <®_vcc3v3>;
|
||||
vcc-supply = <&buck4_reg>;
|
||||
};
|
||||
};
|
||||
|
||||
&usdhc2 {
|
||||
vqmmc-supply = <®_usdhc2_vqmmc>;
|
||||
};
|
||||
|
||||
&usdhc3 {
|
||||
pinctrl-names = "default", "state_100mhz", "state_200mhz";
|
||||
pinctrl-0 = <&pinctrl_usdhc3>;
|
||||
@@ -193,7 +202,7 @@
|
||||
non-removable;
|
||||
no-sd;
|
||||
no-sdio;
|
||||
vmmc-supply = <®_vcc3v3>;
|
||||
vmmc-supply = <&buck4_reg>;
|
||||
vqmmc-supply = <&buck5_reg>;
|
||||
status = "okay";
|
||||
};
|
||||
@@ -233,6 +242,10 @@
|
||||
fsl,pins = <MX8MP_IOMUXC_SD2_RESET_B__GPIO2_IO19 0x10>;
|
||||
};
|
||||
|
||||
pinctrl_reg_usdhc2_vqmmc: regusdhc2vqmmcgrp {
|
||||
fsl,pins = <MX8MP_IOMUXC_GPIO1_IO04__GPIO1_IO04 0xc0>;
|
||||
};
|
||||
|
||||
pinctrl_usdhc3: usdhc3grp {
|
||||
fsl,pins = <MX8MP_IOMUXC_NAND_WE_B__USDHC3_CLK 0x194>,
|
||||
<MX8MP_IOMUXC_NAND_WP_B__USDHC3_CMD 0x1d4>,
|
||||
|
||||
@@ -80,17 +80,17 @@
|
||||
flexcan1_phy: can-phy0 {
|
||||
compatible = "nxp,tjr1443";
|
||||
#phy-cells = <0>;
|
||||
max-bitrate = <1000000>;
|
||||
max-bitrate = <8000000>;
|
||||
enable-gpios = <&i2c6_pcal6416 6 GPIO_ACTIVE_HIGH>;
|
||||
standby-gpios = <&i2c6_pcal6416 5 GPIO_ACTIVE_HIGH>;
|
||||
standby-gpios = <&i2c6_pcal6416 5 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
flexcan2_phy: can-phy1 {
|
||||
compatible = "nxp,tjr1443";
|
||||
#phy-cells = <0>;
|
||||
max-bitrate = <1000000>;
|
||||
enable-gpios = <&i2c6_pcal6416 4 GPIO_ACTIVE_HIGH>;
|
||||
standby-gpios = <&i2c6_pcal6416 3 GPIO_ACTIVE_HIGH>;
|
||||
max-bitrate = <8000000>;
|
||||
enable-gpios = <&i2c4_gpio_expander_21 4 GPIO_ACTIVE_HIGH>;
|
||||
standby-gpios = <&i2c4_gpio_expander_21 3 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
reg_vref_1v8: regulator-1p8v {
|
||||
|
||||
@@ -1843,7 +1843,7 @@
|
||||
<GIC_SPI 294 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&scmi_clk IMX95_CLK_VPU>,
|
||||
<&vpu_blk_ctrl IMX95_CLK_VPUBLK_JPEG_ENC>;
|
||||
assigned-clocks = <&vpu_blk_ctrl IMX95_CLK_VPUBLK_JPEG_DEC>;
|
||||
assigned-clocks = <&vpu_blk_ctrl IMX95_CLK_VPUBLK_JPEG_ENC>;
|
||||
assigned-clock-parents = <&scmi_clk IMX95_CLK_VPUJPEG>;
|
||||
power-domains = <&scmi_devpd IMX95_PD_VPU>;
|
||||
};
|
||||
|
||||
@@ -72,7 +72,7 @@
|
||||
};
|
||||
|
||||
vcc_cam_avdd: regulator-vcc-cam-avdd {
|
||||
compatible = "regulator-fixed";
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "vcc_cam_avdd";
|
||||
gpio = <&gpio3 RK_PC0 GPIO_ACTIVE_LOW>;
|
||||
pinctrl-names = "default";
|
||||
@@ -83,7 +83,7 @@
|
||||
};
|
||||
|
||||
vcc_cam_dovdd: regulator-vcc-cam-dovdd {
|
||||
compatible = "regulator-fixed";
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "vcc_cam_dovdd";
|
||||
gpio = <&gpio3 RK_PC1 GPIO_ACTIVE_LOW>;
|
||||
pinctrl-names = "default";
|
||||
@@ -94,7 +94,7 @@
|
||||
};
|
||||
|
||||
vcc_cam_dvdd: regulator-vcc-cam-dvdd {
|
||||
compatible = "regulator-fixed";
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "vcc_cam_dvdd";
|
||||
gpio = <&gpio3 RK_PC5 GPIO_ACTIVE_HIGH>;
|
||||
enable-active-high;
|
||||
@@ -106,7 +106,7 @@
|
||||
};
|
||||
|
||||
vcc_lens_afvdd: regulator-vcc-lens-afvdd {
|
||||
compatible = "regulator-fixed";
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "vcc_lens_afvdd";
|
||||
gpio = <&gpio3 RK_PB2 GPIO_ACTIVE_LOW>;
|
||||
pinctrl-names = "default";
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
};
|
||||
|
||||
cam_afvdd_2v8: regulator-cam-afvdd-2v8 {
|
||||
compatible = "regulator-fixed";
|
||||
compatible = "regulator-fixed";
|
||||
gpio = <&pca9670 2 GPIO_ACTIVE_LOW>;
|
||||
regulator-max-microvolt = <2800000>;
|
||||
regulator-min-microvolt = <2800000>;
|
||||
@@ -35,7 +35,7 @@
|
||||
};
|
||||
|
||||
cam_avdd_2v8: regulator-cam-avdd-2v8 {
|
||||
compatible = "regulator-fixed";
|
||||
compatible = "regulator-fixed";
|
||||
gpio = <&pca9670 4 GPIO_ACTIVE_LOW>;
|
||||
regulator-max-microvolt = <2800000>;
|
||||
regulator-min-microvolt = <2800000>;
|
||||
@@ -44,7 +44,7 @@
|
||||
};
|
||||
|
||||
cam_dovdd_1v8: regulator-cam-dovdd-1v8 {
|
||||
compatible = "regulator-fixed";
|
||||
compatible = "regulator-fixed";
|
||||
gpio = <&pca9670 3 GPIO_ACTIVE_LOW>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
regulator-min-microvolt = <1800000>;
|
||||
|
||||
@@ -260,6 +260,6 @@
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&usb_host_ohci{
|
||||
&usb_host_ohci {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@@ -609,7 +609,7 @@
|
||||
|
||||
bluetooth {
|
||||
compatible = "brcm,bcm4345c5";
|
||||
interrupts-extended = <&gpio3 RK_PA7 GPIO_ACTIVE_HIGH>;
|
||||
interrupts-extended = <&gpio3 RK_PA7 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-names = "host-wakeup";
|
||||
clocks = <&rk808 RK808_CLKOUT1>;
|
||||
clock-names = "lpo";
|
||||
|
||||
@@ -959,6 +959,7 @@
|
||||
reg = <0>;
|
||||
m25p,fast-read;
|
||||
spi-max-frequency = <10000000>;
|
||||
vcc-supply = <&vcc_3v0>;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -754,6 +754,7 @@
|
||||
compatible = "jedec,spi-nor";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <10000000>;
|
||||
vcc-supply = <&vcc_1v8>;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
};
|
||||
|
||||
cam_afvdd_2v8: regulator-cam-afvdd-2v8 {
|
||||
compatible = "regulator-fixed";
|
||||
compatible = "regulator-fixed";
|
||||
gpio = <&pca9670 2 GPIO_ACTIVE_LOW>;
|
||||
regulator-max-microvolt = <2800000>;
|
||||
regulator-min-microvolt = <2800000>;
|
||||
@@ -35,7 +35,7 @@
|
||||
};
|
||||
|
||||
cam_avdd_2v8: regulator-cam-avdd-2v8 {
|
||||
compatible = "regulator-fixed";
|
||||
compatible = "regulator-fixed";
|
||||
gpio = <&pca9670 4 GPIO_ACTIVE_LOW>;
|
||||
regulator-max-microvolt = <2800000>;
|
||||
regulator-min-microvolt = <2800000>;
|
||||
@@ -44,7 +44,7 @@
|
||||
};
|
||||
|
||||
cam_dovdd_1v8: regulator-cam-dovdd-1v8 {
|
||||
compatible = "regulator-fixed";
|
||||
compatible = "regulator-fixed";
|
||||
gpio = <&pca9670 3 GPIO_ACTIVE_LOW>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
regulator-min-microvolt = <1800000>;
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
gpios = <&gpio4 RK_PA1 GPIO_ACTIVE_LOW>;
|
||||
linux,default-trigger = "default-on";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 =<&blue_led>;
|
||||
pinctrl-0 = <&blue_led>;
|
||||
};
|
||||
|
||||
led-1 {
|
||||
@@ -62,7 +62,7 @@
|
||||
gpios = <&gpio0 RK_PB7 GPIO_ACTIVE_LOW>;
|
||||
linux,default-trigger = "heartbeat";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 =<&heartbeat_led>;
|
||||
pinctrl-0 = <&heartbeat_led>;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -302,8 +302,7 @@
|
||||
ð1m0_tx_bus2
|
||||
ð1m0_rx_bus2
|
||||
ð1m0_rgmii_clk
|
||||
ð1m0_rgmii_bus
|
||||
ðm0_clk1_25m_out>;
|
||||
ð1m0_rgmii_bus>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@@ -784,7 +783,6 @@
|
||||
rgmii_phy0: phy@1 {
|
||||
compatible = "ethernet-phy-ieee802.3-c22";
|
||||
reg = <0x1>;
|
||||
clocks = <&cru REFCLKO25M_GMAC0_OUT>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&gmac0_rst>;
|
||||
reset-assert-us = <20000>;
|
||||
@@ -797,7 +795,6 @@
|
||||
rgmii_phy1: phy@1 {
|
||||
compatible = "ethernet-phy-ieee802.3-c22";
|
||||
reg = <0x1>;
|
||||
clocks = <&cru REFCLKO25M_GMAC1_OUT>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&gmac1_rst>;
|
||||
reset-assert-us = <20000>;
|
||||
|
||||
@@ -250,6 +250,7 @@
|
||||
compatible = "belling,bl24c16a", "atmel,24c16";
|
||||
reg = <0x50>;
|
||||
pagesize = <16>;
|
||||
read-only;
|
||||
vcc-supply = <&vcc_3v3_pmu>;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -77,7 +77,7 @@
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&hp_detect>;
|
||||
simple-audio-card,aux-devs = <&speaker_amp>, <&headphone_amp>;
|
||||
simple-audio-card,hp-det-gpios = <&gpio1 RK_PD3 GPIO_ACTIVE_LOW>;
|
||||
simple-audio-card,hp-det-gpios = <&gpio1 RK_PD3 GPIO_ACTIVE_HIGH>;
|
||||
simple-audio-card,widgets =
|
||||
"Microphone", "Onboard Microphone",
|
||||
"Microphone", "Microphone Jack",
|
||||
|
||||
@@ -365,6 +365,8 @@
|
||||
max-frequency = <200000000>;
|
||||
mmc-hs400-1_8v;
|
||||
mmc-hs400-enhanced-strobe;
|
||||
vmmc-supply = <&vcc_3v3_s3>;
|
||||
vqmmc-supply = <&vcc_1v8_s3>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
|
||||
@@ -68,6 +68,22 @@
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pcie30phy {
|
||||
data-lanes = <1 1 2 2>;
|
||||
};
|
||||
|
||||
&pcie3x2 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pcie3x2_rst>;
|
||||
reset-gpios = <&gpio4 RK_PB0 GPIO_ACTIVE_HIGH>;
|
||||
vpcie3v3-supply = <&vcc3v3_pcie30>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pcie3x4 {
|
||||
num-lanes = <2>;
|
||||
};
|
||||
|
||||
&pinctrl {
|
||||
hdmirx {
|
||||
hdmirx_hpd: hdmirx-5v-detection {
|
||||
@@ -90,11 +106,23 @@
|
||||
};
|
||||
};
|
||||
|
||||
pcie3 {
|
||||
pcie3x2_rst: pcie3x2-rst {
|
||||
rockchip,pins = <4 RK_PB0 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
};
|
||||
|
||||
sound {
|
||||
hp_detect: hp-detect {
|
||||
rockchip,pins = <4 RK_PC3 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
};
|
||||
|
||||
usb {
|
||||
vcc5v0_host_en: vcc5v0-host-en {
|
||||
rockchip,pins = <1 RK_PA1 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&vcc3v3_pcie2x1l0 {
|
||||
@@ -103,3 +131,10 @@
|
||||
pinctrl-0 = <&pcie2_0_vcc3v3_en>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&vcc5v0_host {
|
||||
enable-active-high;
|
||||
gpio = <&gpio1 RK_PA1 GPIO_ACTIVE_HIGH>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&vcc5v0_host_en>;
|
||||
};
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
compatible = "operating-points-v2";
|
||||
opp-shared;
|
||||
|
||||
opp-1200000000{
|
||||
opp-1200000000 {
|
||||
opp-hz = /bits/ 64 <1200000000>;
|
||||
opp-microvolt = <750000 750000 950000>;
|
||||
clock-latency-ns = <40000>;
|
||||
@@ -49,7 +49,7 @@
|
||||
compatible = "operating-points-v2";
|
||||
opp-shared;
|
||||
|
||||
opp-1200000000{
|
||||
opp-1200000000 {
|
||||
opp-hz = /bits/ 64 <1200000000>;
|
||||
opp-microvolt = <750000 750000 950000>;
|
||||
clock-latency-ns = <40000>;
|
||||
|
||||
@@ -320,9 +320,9 @@
|
||||
&i2c3 {
|
||||
status = "okay";
|
||||
|
||||
es8388: audio-codec@10 {
|
||||
es8388: audio-codec@11 {
|
||||
compatible = "everest,es8388", "everest,es8328";
|
||||
reg = <0x10>;
|
||||
reg = <0x11>;
|
||||
clocks = <&cru I2S1_8CH_MCLKOUT>;
|
||||
AVDD-supply = <&vcc_3v3_s0>;
|
||||
DVDD-supply = <&vcc_1v8_s0>;
|
||||
|
||||
@@ -19,6 +19,7 @@ struct mod_arch_specific {
|
||||
|
||||
/* for CONFIG_DYNAMIC_FTRACE */
|
||||
struct plt_entry *ftrace_trampolines;
|
||||
struct plt_entry *init_ftrace_trampolines;
|
||||
};
|
||||
|
||||
u64 module_emit_plt_entry(struct module *mod, Elf64_Shdr *sechdrs,
|
||||
|
||||
@@ -2,6 +2,7 @@ SECTIONS {
|
||||
.plt 0 : { BYTE(0) }
|
||||
.init.plt 0 : { BYTE(0) }
|
||||
.text.ftrace_trampoline 0 : { BYTE(0) }
|
||||
.init.text.ftrace_trampoline 0 : { BYTE(0) }
|
||||
|
||||
#ifdef CONFIG_KASAN_SW_TAGS
|
||||
/*
|
||||
|
||||
@@ -17,7 +17,12 @@
|
||||
#ifndef __ASM_BITSPERLONG_H
|
||||
#define __ASM_BITSPERLONG_H
|
||||
|
||||
#if defined(__KERNEL__) && !defined(__aarch64__)
|
||||
/* Used by the compat vDSO */
|
||||
#define __BITS_PER_LONG 32
|
||||
#else
|
||||
#define __BITS_PER_LONG 64
|
||||
#endif
|
||||
|
||||
#include <asm-generic/bitsperlong.h>
|
||||
|
||||
|
||||
@@ -258,10 +258,17 @@ int ftrace_update_ftrace_func(ftrace_func_t func)
|
||||
return ftrace_modify_code(pc, 0, new, false);
|
||||
}
|
||||
|
||||
static struct plt_entry *get_ftrace_plt(struct module *mod)
|
||||
static struct plt_entry *get_ftrace_plt(struct module *mod, unsigned long addr)
|
||||
{
|
||||
#ifdef CONFIG_MODULES
|
||||
struct plt_entry *plt = mod->arch.ftrace_trampolines;
|
||||
struct plt_entry *plt = NULL;
|
||||
|
||||
if (within_module_mem_type(addr, mod, MOD_INIT_TEXT))
|
||||
plt = mod->arch.init_ftrace_trampolines;
|
||||
else if (within_module_mem_type(addr, mod, MOD_TEXT))
|
||||
plt = mod->arch.ftrace_trampolines;
|
||||
else
|
||||
return NULL;
|
||||
|
||||
return &plt[FTRACE_PLT_IDX];
|
||||
#else
|
||||
@@ -332,7 +339,7 @@ static bool ftrace_find_callable_addr(struct dyn_ftrace *rec,
|
||||
if (WARN_ON(!mod))
|
||||
return false;
|
||||
|
||||
plt = get_ftrace_plt(mod);
|
||||
plt = get_ftrace_plt(mod, pc);
|
||||
if (!plt) {
|
||||
pr_err("ftrace: no module PLT for %ps\n", (void *)*addr);
|
||||
return false;
|
||||
|
||||
@@ -283,7 +283,7 @@ int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr *sechdrs,
|
||||
unsigned long core_plts = 0;
|
||||
unsigned long init_plts = 0;
|
||||
Elf64_Sym *syms = NULL;
|
||||
Elf_Shdr *pltsec, *tramp = NULL;
|
||||
Elf_Shdr *pltsec, *tramp = NULL, *init_tramp = NULL;
|
||||
int i;
|
||||
|
||||
/*
|
||||
@@ -298,6 +298,9 @@ int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr *sechdrs,
|
||||
else if (!strcmp(secstrings + sechdrs[i].sh_name,
|
||||
".text.ftrace_trampoline"))
|
||||
tramp = sechdrs + i;
|
||||
else if (!strcmp(secstrings + sechdrs[i].sh_name,
|
||||
".init.text.ftrace_trampoline"))
|
||||
init_tramp = sechdrs + i;
|
||||
else if (sechdrs[i].sh_type == SHT_SYMTAB)
|
||||
syms = (Elf64_Sym *)sechdrs[i].sh_addr;
|
||||
}
|
||||
@@ -363,5 +366,12 @@ int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr *sechdrs,
|
||||
tramp->sh_size = NR_FTRACE_PLTS * sizeof(struct plt_entry);
|
||||
}
|
||||
|
||||
if (init_tramp) {
|
||||
init_tramp->sh_type = SHT_NOBITS;
|
||||
init_tramp->sh_flags = SHF_EXECINSTR | SHF_ALLOC;
|
||||
init_tramp->sh_addralign = __alignof__(struct plt_entry);
|
||||
init_tramp->sh_size = NR_FTRACE_PLTS * sizeof(struct plt_entry);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -466,6 +466,17 @@ static int module_init_ftrace_plt(const Elf_Ehdr *hdr,
|
||||
__init_plt(&plts[FTRACE_PLT_IDX], FTRACE_ADDR);
|
||||
|
||||
mod->arch.ftrace_trampolines = plts;
|
||||
|
||||
s = find_section(hdr, sechdrs, ".init.text.ftrace_trampoline");
|
||||
if (!s)
|
||||
return -ENOEXEC;
|
||||
|
||||
plts = (void *)s->sh_addr;
|
||||
|
||||
__init_plt(&plts[FTRACE_PLT_IDX], FTRACE_ADDR);
|
||||
|
||||
mod->arch.init_ftrace_trampolines = plts;
|
||||
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -273,6 +273,7 @@ CONFIG_DM9102=m
|
||||
CONFIG_ULI526X=m
|
||||
CONFIG_PCMCIA_XIRCOM=m
|
||||
CONFIG_DL2K=m
|
||||
CONFIG_SUNDANCE=m
|
||||
CONFIG_PCMCIA_FMVJ18X=m
|
||||
CONFIG_E100=m
|
||||
CONFIG_E1000=m
|
||||
|
||||
@@ -433,6 +433,7 @@ CONFIG_DM9102=m
|
||||
CONFIG_ULI526X=m
|
||||
CONFIG_PCMCIA_XIRCOM=m
|
||||
CONFIG_DL2K=m
|
||||
CONFIG_SUNDANCE=m
|
||||
CONFIG_S2IO=m
|
||||
CONFIG_FEC_MPC52xx=m
|
||||
CONFIG_GIANFAR=m
|
||||
|
||||
@@ -65,7 +65,7 @@ config RISCV
|
||||
select ARCH_SUPPORTS_HUGE_PFNMAP if TRANSPARENT_HUGEPAGE
|
||||
select ARCH_SUPPORTS_HUGETLBFS if MMU
|
||||
# LLD >= 14: https://github.com/llvm/llvm-project/issues/50505
|
||||
select ARCH_SUPPORTS_LTO_CLANG if LLD_VERSION >= 140000
|
||||
select ARCH_SUPPORTS_LTO_CLANG if LLD_VERSION >= 140000 && CMODEL_MEDANY
|
||||
select ARCH_SUPPORTS_LTO_CLANG_THIN if LLD_VERSION >= 140000
|
||||
select ARCH_SUPPORTS_MSEAL_SYSTEM_MAPPINGS if 64BIT && MMU
|
||||
select ARCH_SUPPORTS_PAGE_TABLE_CHECK if MMU
|
||||
|
||||
@@ -91,7 +91,7 @@
|
||||
#endif
|
||||
|
||||
.macro asm_per_cpu dst sym tmp
|
||||
REG_L \tmp, TASK_TI_CPU_NUM(tp)
|
||||
lw \tmp, TASK_TI_CPU_NUM(tp)
|
||||
slli \tmp, \tmp, PER_CPU_OFFSET_SHIFT
|
||||
la \dst, __per_cpu_offset
|
||||
add \dst, \dst, \tmp
|
||||
|
||||
@@ -209,7 +209,7 @@ do { \
|
||||
err = 0; \
|
||||
break; \
|
||||
__gu_failed: \
|
||||
x = 0; \
|
||||
x = (__typeof__(x))0; \
|
||||
err = -EFAULT; \
|
||||
} while (0)
|
||||
|
||||
@@ -311,7 +311,7 @@ do { \
|
||||
do { \
|
||||
if (!IS_ENABLED(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && \
|
||||
!IS_ALIGNED((uintptr_t)__gu_ptr, sizeof(*__gu_ptr))) { \
|
||||
__inttype(x) ___val = (__inttype(x))x; \
|
||||
__typeof__(*(__gu_ptr)) ___val = (x); \
|
||||
if (__asm_copy_to_user_sum_enabled(__gu_ptr, &(___val), sizeof(*__gu_ptr))) \
|
||||
goto label; \
|
||||
break; \
|
||||
@@ -438,10 +438,10 @@ unsigned long __must_check clear_user(void __user *to, unsigned long n)
|
||||
}
|
||||
|
||||
#define __get_kernel_nofault(dst, src, type, err_label) \
|
||||
__get_user_nocheck(*((type *)(dst)), (type *)(src), err_label)
|
||||
__get_user_nocheck(*((type *)(dst)), (__force __user type *)(src), err_label)
|
||||
|
||||
#define __put_kernel_nofault(dst, src, type, err_label) \
|
||||
__put_user_nocheck(*((type *)(src)), (type *)(dst), err_label)
|
||||
__put_user_nocheck(*((type *)(src)), (__force __user type *)(dst), err_label)
|
||||
|
||||
static __must_check __always_inline bool user_access_begin(const void __user *ptr, size_t len)
|
||||
{
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
* a0 = &new_vmalloc[BIT_WORD(cpu)]
|
||||
* a1 = BIT_MASK(cpu)
|
||||
*/
|
||||
REG_L a2, TASK_TI_CPU(tp)
|
||||
lw a2, TASK_TI_CPU(tp)
|
||||
/*
|
||||
* Compute the new_vmalloc element position:
|
||||
* (cpu / 64) * 8 = (cpu >> 6) << 3
|
||||
|
||||
@@ -28,7 +28,7 @@ static int riscv_kexec_elf_load(struct kimage *image, struct elfhdr *ehdr,
|
||||
int i;
|
||||
int ret = 0;
|
||||
size_t size;
|
||||
struct kexec_buf kbuf;
|
||||
struct kexec_buf kbuf = {};
|
||||
const struct elf_phdr *phdr;
|
||||
|
||||
kbuf.image = image;
|
||||
@@ -66,7 +66,7 @@ static int elf_find_pbase(struct kimage *image, unsigned long kernel_len,
|
||||
{
|
||||
int i;
|
||||
int ret;
|
||||
struct kexec_buf kbuf;
|
||||
struct kexec_buf kbuf = {};
|
||||
const struct elf_phdr *phdr;
|
||||
unsigned long lowest_paddr = ULONG_MAX;
|
||||
unsigned long lowest_vaddr = ULONG_MAX;
|
||||
|
||||
@@ -41,7 +41,7 @@ static void *image_load(struct kimage *image,
|
||||
struct riscv_image_header *h;
|
||||
u64 flags;
|
||||
bool be_image, be_kernel;
|
||||
struct kexec_buf kbuf;
|
||||
struct kexec_buf kbuf = {};
|
||||
int ret;
|
||||
|
||||
/* Check Image header */
|
||||
|
||||
@@ -261,7 +261,7 @@ int load_extra_segments(struct kimage *image, unsigned long kernel_start,
|
||||
int ret;
|
||||
void *fdt;
|
||||
unsigned long initrd_pbase = 0UL;
|
||||
struct kexec_buf kbuf;
|
||||
struct kexec_buf kbuf = {};
|
||||
char *modified_cmdline = NULL;
|
||||
|
||||
kbuf.image = image;
|
||||
|
||||
@@ -1356,7 +1356,7 @@ int bpf_jit_emit_insn(const struct bpf_insn *insn, struct rv_jit_context *ctx,
|
||||
emit_mv(rd, rs, ctx);
|
||||
#ifdef CONFIG_SMP
|
||||
/* Load current CPU number in T1 */
|
||||
emit_ld(RV_REG_T1, offsetof(struct thread_info, cpu),
|
||||
emit_lw(RV_REG_T1, offsetof(struct thread_info, cpu),
|
||||
RV_REG_TP, ctx);
|
||||
/* Load address of __per_cpu_offset array in T2 */
|
||||
emit_addr(RV_REG_T2, (u64)&__per_cpu_offset, extra_pass, ctx);
|
||||
@@ -1763,7 +1763,7 @@ int bpf_jit_emit_insn(const struct bpf_insn *insn, struct rv_jit_context *ctx,
|
||||
*/
|
||||
if (insn->src_reg == 0 && insn->imm == BPF_FUNC_get_smp_processor_id) {
|
||||
/* Load current CPU number in R0 */
|
||||
emit_ld(bpf_to_rv_reg(BPF_REG_0, ctx), offsetof(struct thread_info, cpu),
|
||||
emit_lw(bpf_to_rv_reg(BPF_REG_0, ctx), offsetof(struct thread_info, cpu),
|
||||
RV_REG_TP, ctx);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -36,6 +36,9 @@ static inline bool pgtable_l5_enabled(void)
|
||||
#define pgtable_l5_enabled() cpu_feature_enabled(X86_FEATURE_LA57)
|
||||
#endif /* USE_EARLY_PGTABLE_L5 */
|
||||
|
||||
#define ARCH_PAGE_TABLE_SYNC_MASK \
|
||||
(pgtable_l5_enabled() ? PGTBL_PGD_MODIFIED : PGTBL_P4D_MODIFIED)
|
||||
|
||||
extern unsigned int pgdir_shift;
|
||||
extern unsigned int ptrs_per_p4d;
|
||||
|
||||
|
||||
@@ -223,6 +223,24 @@ static void sync_global_pgds(unsigned long start, unsigned long end)
|
||||
sync_global_pgds_l4(start, end);
|
||||
}
|
||||
|
||||
/*
|
||||
* Make kernel mappings visible in all page tables in the system.
|
||||
* This is necessary except when the init task populates kernel mappings
|
||||
* during the boot process. In that case, all processes originating from
|
||||
* the init task copies the kernel mappings, so there is no issue.
|
||||
* Otherwise, missing synchronization could lead to kernel crashes due
|
||||
* to missing page table entries for certain kernel mappings.
|
||||
*
|
||||
* Synchronization is performed at the top level, which is the PGD in
|
||||
* 5-level paging systems. But in 4-level paging systems, however,
|
||||
* pgd_populate() is a no-op, so synchronization is done at the P4D level.
|
||||
* sync_global_pgds() handles this difference between paging levels.
|
||||
*/
|
||||
void arch_sync_kernel_mappings(unsigned long start, unsigned long end)
|
||||
{
|
||||
sync_global_pgds(start, end);
|
||||
}
|
||||
|
||||
/*
|
||||
* NOTE: This function is marked __ref because it calls __init function
|
||||
* (alloc_bootmem_pages). It's safe to do it ONLY when after_bootmem == 0.
|
||||
|
||||
@@ -49,6 +49,18 @@ static int __crypto_sha1_import(struct sha1_ctx *ctx, const void *in)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __crypto_sha1_export_core(const struct sha1_ctx *ctx, void *out)
|
||||
{
|
||||
memcpy(out, ctx, offsetof(struct sha1_ctx, buf));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __crypto_sha1_import_core(struct sha1_ctx *ctx, const void *in)
|
||||
{
|
||||
memcpy(ctx, in, offsetof(struct sha1_ctx, buf));
|
||||
return 0;
|
||||
}
|
||||
|
||||
const u8 sha1_zero_message_hash[SHA1_DIGEST_SIZE] = {
|
||||
0xda, 0x39, 0xa3, 0xee, 0x5e, 0x6b, 0x4b, 0x0d,
|
||||
0x32, 0x55, 0xbf, 0xef, 0x95, 0x60, 0x18, 0x90,
|
||||
@@ -94,6 +106,16 @@ static int crypto_sha1_import(struct shash_desc *desc, const void *in)
|
||||
return __crypto_sha1_import(SHA1_CTX(desc), in);
|
||||
}
|
||||
|
||||
static int crypto_sha1_export_core(struct shash_desc *desc, void *out)
|
||||
{
|
||||
return __crypto_sha1_export_core(SHA1_CTX(desc), out);
|
||||
}
|
||||
|
||||
static int crypto_sha1_import_core(struct shash_desc *desc, const void *in)
|
||||
{
|
||||
return __crypto_sha1_import_core(SHA1_CTX(desc), in);
|
||||
}
|
||||
|
||||
#define HMAC_SHA1_KEY(tfm) ((struct hmac_sha1_key *)crypto_shash_ctx(tfm))
|
||||
#define HMAC_SHA1_CTX(desc) ((struct hmac_sha1_ctx *)shash_desc_ctx(desc))
|
||||
|
||||
@@ -143,6 +165,19 @@ static int crypto_hmac_sha1_import(struct shash_desc *desc, const void *in)
|
||||
return __crypto_sha1_import(&ctx->sha_ctx, in);
|
||||
}
|
||||
|
||||
static int crypto_hmac_sha1_export_core(struct shash_desc *desc, void *out)
|
||||
{
|
||||
return __crypto_sha1_export_core(&HMAC_SHA1_CTX(desc)->sha_ctx, out);
|
||||
}
|
||||
|
||||
static int crypto_hmac_sha1_import_core(struct shash_desc *desc, const void *in)
|
||||
{
|
||||
struct hmac_sha1_ctx *ctx = HMAC_SHA1_CTX(desc);
|
||||
|
||||
ctx->ostate = HMAC_SHA1_KEY(desc->tfm)->ostate;
|
||||
return __crypto_sha1_import_core(&ctx->sha_ctx, in);
|
||||
}
|
||||
|
||||
static struct shash_alg algs[] = {
|
||||
{
|
||||
.base.cra_name = "sha1",
|
||||
@@ -157,6 +192,8 @@ static struct shash_alg algs[] = {
|
||||
.digest = crypto_sha1_digest,
|
||||
.export = crypto_sha1_export,
|
||||
.import = crypto_sha1_import,
|
||||
.export_core = crypto_sha1_export_core,
|
||||
.import_core = crypto_sha1_import_core,
|
||||
.descsize = sizeof(struct sha1_ctx),
|
||||
.statesize = SHA1_SHASH_STATE_SIZE,
|
||||
},
|
||||
@@ -175,6 +212,8 @@ static struct shash_alg algs[] = {
|
||||
.digest = crypto_hmac_sha1_digest,
|
||||
.export = crypto_hmac_sha1_export,
|
||||
.import = crypto_hmac_sha1_import,
|
||||
.export_core = crypto_hmac_sha1_export_core,
|
||||
.import_core = crypto_hmac_sha1_import_core,
|
||||
.descsize = sizeof(struct hmac_sha1_ctx),
|
||||
.statesize = SHA1_SHASH_STATE_SIZE,
|
||||
},
|
||||
|
||||
@@ -50,6 +50,19 @@ static int __crypto_sha256_import(struct __sha256_ctx *ctx, const void *in)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __crypto_sha256_export_core(const struct __sha256_ctx *ctx,
|
||||
void *out)
|
||||
{
|
||||
memcpy(out, ctx, offsetof(struct __sha256_ctx, buf));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __crypto_sha256_import_core(struct __sha256_ctx *ctx, const void *in)
|
||||
{
|
||||
memcpy(ctx, in, offsetof(struct __sha256_ctx, buf));
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* SHA-224 */
|
||||
|
||||
const u8 sha224_zero_message_hash[SHA224_DIGEST_SIZE] = {
|
||||
@@ -98,6 +111,16 @@ static int crypto_sha224_import(struct shash_desc *desc, const void *in)
|
||||
return __crypto_sha256_import(&SHA224_CTX(desc)->ctx, in);
|
||||
}
|
||||
|
||||
static int crypto_sha224_export_core(struct shash_desc *desc, void *out)
|
||||
{
|
||||
return __crypto_sha256_export_core(&SHA224_CTX(desc)->ctx, out);
|
||||
}
|
||||
|
||||
static int crypto_sha224_import_core(struct shash_desc *desc, const void *in)
|
||||
{
|
||||
return __crypto_sha256_import_core(&SHA224_CTX(desc)->ctx, in);
|
||||
}
|
||||
|
||||
/* SHA-256 */
|
||||
|
||||
const u8 sha256_zero_message_hash[SHA256_DIGEST_SIZE] = {
|
||||
@@ -146,6 +169,16 @@ static int crypto_sha256_import(struct shash_desc *desc, const void *in)
|
||||
return __crypto_sha256_import(&SHA256_CTX(desc)->ctx, in);
|
||||
}
|
||||
|
||||
static int crypto_sha256_export_core(struct shash_desc *desc, void *out)
|
||||
{
|
||||
return __crypto_sha256_export_core(&SHA256_CTX(desc)->ctx, out);
|
||||
}
|
||||
|
||||
static int crypto_sha256_import_core(struct shash_desc *desc, const void *in)
|
||||
{
|
||||
return __crypto_sha256_import_core(&SHA256_CTX(desc)->ctx, in);
|
||||
}
|
||||
|
||||
/* HMAC-SHA224 */
|
||||
|
||||
#define HMAC_SHA224_KEY(tfm) ((struct hmac_sha224_key *)crypto_shash_ctx(tfm))
|
||||
@@ -198,6 +231,21 @@ static int crypto_hmac_sha224_import(struct shash_desc *desc, const void *in)
|
||||
return __crypto_sha256_import(&ctx->ctx.sha_ctx, in);
|
||||
}
|
||||
|
||||
static int crypto_hmac_sha224_export_core(struct shash_desc *desc, void *out)
|
||||
{
|
||||
return __crypto_sha256_export_core(&HMAC_SHA224_CTX(desc)->ctx.sha_ctx,
|
||||
out);
|
||||
}
|
||||
|
||||
static int crypto_hmac_sha224_import_core(struct shash_desc *desc,
|
||||
const void *in)
|
||||
{
|
||||
struct hmac_sha224_ctx *ctx = HMAC_SHA224_CTX(desc);
|
||||
|
||||
ctx->ctx.ostate = HMAC_SHA224_KEY(desc->tfm)->key.ostate;
|
||||
return __crypto_sha256_import_core(&ctx->ctx.sha_ctx, in);
|
||||
}
|
||||
|
||||
/* HMAC-SHA256 */
|
||||
|
||||
#define HMAC_SHA256_KEY(tfm) ((struct hmac_sha256_key *)crypto_shash_ctx(tfm))
|
||||
@@ -250,6 +298,21 @@ static int crypto_hmac_sha256_import(struct shash_desc *desc, const void *in)
|
||||
return __crypto_sha256_import(&ctx->ctx.sha_ctx, in);
|
||||
}
|
||||
|
||||
static int crypto_hmac_sha256_export_core(struct shash_desc *desc, void *out)
|
||||
{
|
||||
return __crypto_sha256_export_core(&HMAC_SHA256_CTX(desc)->ctx.sha_ctx,
|
||||
out);
|
||||
}
|
||||
|
||||
static int crypto_hmac_sha256_import_core(struct shash_desc *desc,
|
||||
const void *in)
|
||||
{
|
||||
struct hmac_sha256_ctx *ctx = HMAC_SHA256_CTX(desc);
|
||||
|
||||
ctx->ctx.ostate = HMAC_SHA256_KEY(desc->tfm)->key.ostate;
|
||||
return __crypto_sha256_import_core(&ctx->ctx.sha_ctx, in);
|
||||
}
|
||||
|
||||
/* Algorithm definitions */
|
||||
|
||||
static struct shash_alg algs[] = {
|
||||
@@ -266,6 +329,8 @@ static struct shash_alg algs[] = {
|
||||
.digest = crypto_sha224_digest,
|
||||
.export = crypto_sha224_export,
|
||||
.import = crypto_sha224_import,
|
||||
.export_core = crypto_sha224_export_core,
|
||||
.import_core = crypto_sha224_import_core,
|
||||
.descsize = sizeof(struct sha224_ctx),
|
||||
.statesize = SHA256_SHASH_STATE_SIZE,
|
||||
},
|
||||
@@ -282,6 +347,8 @@ static struct shash_alg algs[] = {
|
||||
.digest = crypto_sha256_digest,
|
||||
.export = crypto_sha256_export,
|
||||
.import = crypto_sha256_import,
|
||||
.export_core = crypto_sha256_export_core,
|
||||
.import_core = crypto_sha256_import_core,
|
||||
.descsize = sizeof(struct sha256_ctx),
|
||||
.statesize = SHA256_SHASH_STATE_SIZE,
|
||||
},
|
||||
@@ -300,6 +367,8 @@ static struct shash_alg algs[] = {
|
||||
.digest = crypto_hmac_sha224_digest,
|
||||
.export = crypto_hmac_sha224_export,
|
||||
.import = crypto_hmac_sha224_import,
|
||||
.export_core = crypto_hmac_sha224_export_core,
|
||||
.import_core = crypto_hmac_sha224_import_core,
|
||||
.descsize = sizeof(struct hmac_sha224_ctx),
|
||||
.statesize = SHA256_SHASH_STATE_SIZE,
|
||||
},
|
||||
@@ -318,6 +387,8 @@ static struct shash_alg algs[] = {
|
||||
.digest = crypto_hmac_sha256_digest,
|
||||
.export = crypto_hmac_sha256_export,
|
||||
.import = crypto_hmac_sha256_import,
|
||||
.export_core = crypto_hmac_sha256_export_core,
|
||||
.import_core = crypto_hmac_sha256_import_core,
|
||||
.descsize = sizeof(struct hmac_sha256_ctx),
|
||||
.statesize = SHA256_SHASH_STATE_SIZE,
|
||||
},
|
||||
|
||||
@@ -50,6 +50,19 @@ static int __crypto_sha512_import(struct __sha512_ctx *ctx, const void *in)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __crypto_sha512_export_core(const struct __sha512_ctx *ctx,
|
||||
void *out)
|
||||
{
|
||||
memcpy(out, ctx, offsetof(struct __sha512_ctx, buf));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __crypto_sha512_import_core(struct __sha512_ctx *ctx, const void *in)
|
||||
{
|
||||
memcpy(ctx, in, offsetof(struct __sha512_ctx, buf));
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* SHA-384 */
|
||||
|
||||
const u8 sha384_zero_message_hash[SHA384_DIGEST_SIZE] = {
|
||||
@@ -100,6 +113,16 @@ static int crypto_sha384_import(struct shash_desc *desc, const void *in)
|
||||
return __crypto_sha512_import(&SHA384_CTX(desc)->ctx, in);
|
||||
}
|
||||
|
||||
static int crypto_sha384_export_core(struct shash_desc *desc, void *out)
|
||||
{
|
||||
return __crypto_sha512_export_core(&SHA384_CTX(desc)->ctx, out);
|
||||
}
|
||||
|
||||
static int crypto_sha384_import_core(struct shash_desc *desc, const void *in)
|
||||
{
|
||||
return __crypto_sha512_import_core(&SHA384_CTX(desc)->ctx, in);
|
||||
}
|
||||
|
||||
/* SHA-512 */
|
||||
|
||||
const u8 sha512_zero_message_hash[SHA512_DIGEST_SIZE] = {
|
||||
@@ -152,6 +175,16 @@ static int crypto_sha512_import(struct shash_desc *desc, const void *in)
|
||||
return __crypto_sha512_import(&SHA512_CTX(desc)->ctx, in);
|
||||
}
|
||||
|
||||
static int crypto_sha512_export_core(struct shash_desc *desc, void *out)
|
||||
{
|
||||
return __crypto_sha512_export_core(&SHA512_CTX(desc)->ctx, out);
|
||||
}
|
||||
|
||||
static int crypto_sha512_import_core(struct shash_desc *desc, const void *in)
|
||||
{
|
||||
return __crypto_sha512_import_core(&SHA512_CTX(desc)->ctx, in);
|
||||
}
|
||||
|
||||
/* HMAC-SHA384 */
|
||||
|
||||
#define HMAC_SHA384_KEY(tfm) ((struct hmac_sha384_key *)crypto_shash_ctx(tfm))
|
||||
@@ -204,6 +237,21 @@ static int crypto_hmac_sha384_import(struct shash_desc *desc, const void *in)
|
||||
return __crypto_sha512_import(&ctx->ctx.sha_ctx, in);
|
||||
}
|
||||
|
||||
static int crypto_hmac_sha384_export_core(struct shash_desc *desc, void *out)
|
||||
{
|
||||
return __crypto_sha512_export_core(&HMAC_SHA384_CTX(desc)->ctx.sha_ctx,
|
||||
out);
|
||||
}
|
||||
|
||||
static int crypto_hmac_sha384_import_core(struct shash_desc *desc,
|
||||
const void *in)
|
||||
{
|
||||
struct hmac_sha384_ctx *ctx = HMAC_SHA384_CTX(desc);
|
||||
|
||||
ctx->ctx.ostate = HMAC_SHA384_KEY(desc->tfm)->key.ostate;
|
||||
return __crypto_sha512_import_core(&ctx->ctx.sha_ctx, in);
|
||||
}
|
||||
|
||||
/* HMAC-SHA512 */
|
||||
|
||||
#define HMAC_SHA512_KEY(tfm) ((struct hmac_sha512_key *)crypto_shash_ctx(tfm))
|
||||
@@ -256,6 +304,21 @@ static int crypto_hmac_sha512_import(struct shash_desc *desc, const void *in)
|
||||
return __crypto_sha512_import(&ctx->ctx.sha_ctx, in);
|
||||
}
|
||||
|
||||
static int crypto_hmac_sha512_export_core(struct shash_desc *desc, void *out)
|
||||
{
|
||||
return __crypto_sha512_export_core(&HMAC_SHA512_CTX(desc)->ctx.sha_ctx,
|
||||
out);
|
||||
}
|
||||
|
||||
static int crypto_hmac_sha512_import_core(struct shash_desc *desc,
|
||||
const void *in)
|
||||
{
|
||||
struct hmac_sha512_ctx *ctx = HMAC_SHA512_CTX(desc);
|
||||
|
||||
ctx->ctx.ostate = HMAC_SHA512_KEY(desc->tfm)->key.ostate;
|
||||
return __crypto_sha512_import_core(&ctx->ctx.sha_ctx, in);
|
||||
}
|
||||
|
||||
/* Algorithm definitions */
|
||||
|
||||
static struct shash_alg algs[] = {
|
||||
@@ -272,6 +335,8 @@ static struct shash_alg algs[] = {
|
||||
.digest = crypto_sha384_digest,
|
||||
.export = crypto_sha384_export,
|
||||
.import = crypto_sha384_import,
|
||||
.export_core = crypto_sha384_export_core,
|
||||
.import_core = crypto_sha384_import_core,
|
||||
.descsize = sizeof(struct sha384_ctx),
|
||||
.statesize = SHA512_SHASH_STATE_SIZE,
|
||||
},
|
||||
@@ -288,6 +353,8 @@ static struct shash_alg algs[] = {
|
||||
.digest = crypto_sha512_digest,
|
||||
.export = crypto_sha512_export,
|
||||
.import = crypto_sha512_import,
|
||||
.export_core = crypto_sha512_export_core,
|
||||
.import_core = crypto_sha512_import_core,
|
||||
.descsize = sizeof(struct sha512_ctx),
|
||||
.statesize = SHA512_SHASH_STATE_SIZE,
|
||||
},
|
||||
@@ -306,6 +373,8 @@ static struct shash_alg algs[] = {
|
||||
.digest = crypto_hmac_sha384_digest,
|
||||
.export = crypto_hmac_sha384_export,
|
||||
.import = crypto_hmac_sha384_import,
|
||||
.export_core = crypto_hmac_sha384_export_core,
|
||||
.import_core = crypto_hmac_sha384_import_core,
|
||||
.descsize = sizeof(struct hmac_sha384_ctx),
|
||||
.statesize = SHA512_SHASH_STATE_SIZE,
|
||||
},
|
||||
@@ -324,6 +393,8 @@ static struct shash_alg algs[] = {
|
||||
.digest = crypto_hmac_sha512_digest,
|
||||
.export = crypto_hmac_sha512_export,
|
||||
.import = crypto_hmac_sha512_import,
|
||||
.export_core = crypto_hmac_sha512_export_core,
|
||||
.import_core = crypto_hmac_sha512_import_core,
|
||||
.descsize = sizeof(struct hmac_sha512_ctx),
|
||||
.statesize = SHA512_SHASH_STATE_SIZE,
|
||||
},
|
||||
|
||||
@@ -677,7 +677,7 @@ static void ivpu_bo_unbind_all_user_contexts(struct ivpu_device *vdev)
|
||||
static void ivpu_dev_fini(struct ivpu_device *vdev)
|
||||
{
|
||||
ivpu_jobs_abort_all(vdev);
|
||||
ivpu_pm_cancel_recovery(vdev);
|
||||
ivpu_pm_disable_recovery(vdev);
|
||||
ivpu_pm_disable(vdev);
|
||||
ivpu_prepare_for_reset(vdev);
|
||||
ivpu_shutdown(vdev);
|
||||
|
||||
@@ -417,10 +417,10 @@ void ivpu_pm_init(struct ivpu_device *vdev)
|
||||
ivpu_dbg(vdev, PM, "Autosuspend delay = %d\n", delay);
|
||||
}
|
||||
|
||||
void ivpu_pm_cancel_recovery(struct ivpu_device *vdev)
|
||||
void ivpu_pm_disable_recovery(struct ivpu_device *vdev)
|
||||
{
|
||||
drm_WARN_ON(&vdev->drm, delayed_work_pending(&vdev->pm->job_timeout_work));
|
||||
cancel_work_sync(&vdev->pm->recovery_work);
|
||||
disable_work_sync(&vdev->pm->recovery_work);
|
||||
}
|
||||
|
||||
void ivpu_pm_enable(struct ivpu_device *vdev)
|
||||
|
||||
@@ -25,7 +25,7 @@ struct ivpu_pm_info {
|
||||
void ivpu_pm_init(struct ivpu_device *vdev);
|
||||
void ivpu_pm_enable(struct ivpu_device *vdev);
|
||||
void ivpu_pm_disable(struct ivpu_device *vdev);
|
||||
void ivpu_pm_cancel_recovery(struct ivpu_device *vdev);
|
||||
void ivpu_pm_disable_recovery(struct ivpu_device *vdev);
|
||||
|
||||
int ivpu_pm_suspend_cb(struct device *dev);
|
||||
int ivpu_pm_resume_cb(struct device *dev);
|
||||
|
||||
@@ -937,8 +937,10 @@ static u32 *iort_rmr_alloc_sids(u32 *sids, u32 count, u32 id_start,
|
||||
|
||||
new_sids = krealloc_array(sids, count + new_count,
|
||||
sizeof(*new_sids), GFP_KERNEL);
|
||||
if (!new_sids)
|
||||
if (!new_sids) {
|
||||
kfree(sids);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for (i = count; i < total_count; i++)
|
||||
new_sids[i] = id_start++;
|
||||
|
||||
@@ -119,7 +119,7 @@ int cpc_read_ffh(int cpu, struct cpc_reg *reg, u64 *val)
|
||||
|
||||
*val = data.ret.value;
|
||||
|
||||
return (data.ret.error) ? sbi_err_map_linux_errno(data.ret.error) : 0;
|
||||
return data.ret.error;
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
@@ -148,7 +148,7 @@ int cpc_write_ffh(int cpu, struct cpc_reg *reg, u64 val)
|
||||
|
||||
smp_call_function_single(cpu, cppc_ffh_csr_write, &data, 1);
|
||||
|
||||
return (data.ret.error) ? sbi_err_map_linux_errno(data.ret.error) : 0;
|
||||
return data.ret.error;
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
|
||||
@@ -380,6 +380,28 @@ static const struct file_operations force_devcoredump_fops = {
|
||||
.write = force_devcd_write,
|
||||
};
|
||||
|
||||
static void vhci_debugfs_init(struct vhci_data *data)
|
||||
{
|
||||
struct hci_dev *hdev = data->hdev;
|
||||
|
||||
debugfs_create_file("force_suspend", 0644, hdev->debugfs, data,
|
||||
&force_suspend_fops);
|
||||
|
||||
debugfs_create_file("force_wakeup", 0644, hdev->debugfs, data,
|
||||
&force_wakeup_fops);
|
||||
|
||||
if (IS_ENABLED(CONFIG_BT_MSFTEXT))
|
||||
debugfs_create_file("msft_opcode", 0644, hdev->debugfs, data,
|
||||
&msft_opcode_fops);
|
||||
|
||||
if (IS_ENABLED(CONFIG_BT_AOSPEXT))
|
||||
debugfs_create_file("aosp_capable", 0644, hdev->debugfs, data,
|
||||
&aosp_capable_fops);
|
||||
|
||||
debugfs_create_file("force_devcoredump", 0644, hdev->debugfs, data,
|
||||
&force_devcoredump_fops);
|
||||
}
|
||||
|
||||
static int __vhci_create_device(struct vhci_data *data, __u8 opcode)
|
||||
{
|
||||
struct hci_dev *hdev;
|
||||
@@ -434,22 +456,8 @@ static int __vhci_create_device(struct vhci_data *data, __u8 opcode)
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
debugfs_create_file("force_suspend", 0644, hdev->debugfs, data,
|
||||
&force_suspend_fops);
|
||||
|
||||
debugfs_create_file("force_wakeup", 0644, hdev->debugfs, data,
|
||||
&force_wakeup_fops);
|
||||
|
||||
if (IS_ENABLED(CONFIG_BT_MSFTEXT))
|
||||
debugfs_create_file("msft_opcode", 0644, hdev->debugfs, data,
|
||||
&msft_opcode_fops);
|
||||
|
||||
if (IS_ENABLED(CONFIG_BT_AOSPEXT))
|
||||
debugfs_create_file("aosp_capable", 0644, hdev->debugfs, data,
|
||||
&aosp_capable_fops);
|
||||
|
||||
debugfs_create_file("force_devcoredump", 0644, hdev->debugfs, data,
|
||||
&force_devcoredump_fops);
|
||||
if (!IS_ERR_OR_NULL(hdev->debugfs))
|
||||
vhci_debugfs_init(data);
|
||||
|
||||
hci_skb_pkt_type(skb) = HCI_VENDOR_PKT;
|
||||
|
||||
@@ -651,6 +659,21 @@ static int vhci_open(struct inode *inode, struct file *file)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void vhci_debugfs_remove(struct hci_dev *hdev)
|
||||
{
|
||||
debugfs_lookup_and_remove("force_suspend", hdev->debugfs);
|
||||
|
||||
debugfs_lookup_and_remove("force_wakeup", hdev->debugfs);
|
||||
|
||||
if (IS_ENABLED(CONFIG_BT_MSFTEXT))
|
||||
debugfs_lookup_and_remove("msft_opcode", hdev->debugfs);
|
||||
|
||||
if (IS_ENABLED(CONFIG_BT_AOSPEXT))
|
||||
debugfs_lookup_and_remove("aosp_capable", hdev->debugfs);
|
||||
|
||||
debugfs_lookup_and_remove("force_devcoredump", hdev->debugfs);
|
||||
}
|
||||
|
||||
static int vhci_release(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct vhci_data *data = file->private_data;
|
||||
@@ -662,6 +685,8 @@ static int vhci_release(struct inode *inode, struct file *file)
|
||||
hdev = data->hdev;
|
||||
|
||||
if (hdev) {
|
||||
if (!IS_ERR_OR_NULL(hdev->debugfs))
|
||||
vhci_debugfs_remove(hdev);
|
||||
hci_unregister_dev(hdev);
|
||||
hci_free_dev(hdev);
|
||||
}
|
||||
|
||||
@@ -128,7 +128,6 @@ static ssize_t altr_sdr_mc_err_inject_write(struct file *file,
|
||||
|
||||
ptemp = dma_alloc_coherent(mci->pdev, 16, &dma_handle, GFP_KERNEL);
|
||||
if (!ptemp) {
|
||||
dma_free_coherent(mci->pdev, 16, ptemp, dma_handle);
|
||||
edac_printk(KERN_ERR, EDAC_MC,
|
||||
"Inject: Buffer Allocation error\n");
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -3,6 +3,9 @@
|
||||
# GPIO infrastructure and drivers
|
||||
#
|
||||
|
||||
config GPIOLIB_LEGACY
|
||||
def_bool y
|
||||
|
||||
menuconfig GPIOLIB
|
||||
bool "GPIO Support"
|
||||
help
|
||||
@@ -12,9 +15,6 @@ menuconfig GPIOLIB
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
config GPIOLIB_LEGACY
|
||||
def_bool y
|
||||
|
||||
if GPIOLIB
|
||||
|
||||
config GPIOLIB_FASTPATH_LIMIT
|
||||
|
||||
@@ -448,7 +448,7 @@ static int psp_sw_init(struct amdgpu_ip_block *ip_block)
|
||||
psp->cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
|
||||
if (!psp->cmd) {
|
||||
dev_err(adev->dev, "Failed to allocate memory to command buffer!\n");
|
||||
ret = -ENOMEM;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
adev->psp.xgmi_context.supports_extended_data =
|
||||
|
||||
@@ -1462,17 +1462,12 @@ static int dce_v10_0_audio_init(struct amdgpu_device *adev)
|
||||
|
||||
static void dce_v10_0_audio_fini(struct amdgpu_device *adev)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!amdgpu_audio)
|
||||
return;
|
||||
|
||||
if (!adev->mode_info.audio.enabled)
|
||||
return;
|
||||
|
||||
for (i = 0; i < adev->mode_info.audio.num_pins; i++)
|
||||
dce_v10_0_audio_enable(adev, &adev->mode_info.audio.pin[i], false);
|
||||
|
||||
adev->mode_info.audio.enabled = false;
|
||||
}
|
||||
|
||||
|
||||
@@ -1511,17 +1511,12 @@ static int dce_v11_0_audio_init(struct amdgpu_device *adev)
|
||||
|
||||
static void dce_v11_0_audio_fini(struct amdgpu_device *adev)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!amdgpu_audio)
|
||||
return;
|
||||
|
||||
if (!adev->mode_info.audio.enabled)
|
||||
return;
|
||||
|
||||
for (i = 0; i < adev->mode_info.audio.num_pins; i++)
|
||||
dce_v11_0_audio_enable(adev, &adev->mode_info.audio.pin[i], false);
|
||||
|
||||
adev->mode_info.audio.enabled = false;
|
||||
}
|
||||
|
||||
|
||||
@@ -1451,17 +1451,12 @@ static int dce_v6_0_audio_init(struct amdgpu_device *adev)
|
||||
|
||||
static void dce_v6_0_audio_fini(struct amdgpu_device *adev)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!amdgpu_audio)
|
||||
return;
|
||||
|
||||
if (!adev->mode_info.audio.enabled)
|
||||
return;
|
||||
|
||||
for (i = 0; i < adev->mode_info.audio.num_pins; i++)
|
||||
dce_v6_0_audio_enable(adev, &adev->mode_info.audio.pin[i], false);
|
||||
|
||||
adev->mode_info.audio.enabled = false;
|
||||
}
|
||||
|
||||
|
||||
@@ -1443,17 +1443,12 @@ static int dce_v8_0_audio_init(struct amdgpu_device *adev)
|
||||
|
||||
static void dce_v8_0_audio_fini(struct amdgpu_device *adev)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!amdgpu_audio)
|
||||
return;
|
||||
|
||||
if (!adev->mode_info.audio.enabled)
|
||||
return;
|
||||
|
||||
for (i = 0; i < adev->mode_info.audio.num_pins; i++)
|
||||
dce_v8_0_audio_enable(adev, &adev->mode_info.audio.pin[i], false);
|
||||
|
||||
adev->mode_info.audio.enabled = false;
|
||||
}
|
||||
|
||||
|
||||
@@ -641,8 +641,9 @@ static int mes_v11_0_misc_op(struct amdgpu_mes *mes,
|
||||
break;
|
||||
case MES_MISC_OP_CHANGE_CONFIG:
|
||||
if ((mes->adev->mes.sched_version & AMDGPU_MES_VERSION_MASK) < 0x63) {
|
||||
dev_err(mes->adev->dev, "MES FW version must be larger than 0x63 to support limit single process feature.\n");
|
||||
return -EINVAL;
|
||||
dev_warn_once(mes->adev->dev,
|
||||
"MES FW version must be larger than 0x63 to support limit single process feature.\n");
|
||||
return 0;
|
||||
}
|
||||
misc_pkt.opcode = MESAPI_MISC__CHANGE_CONFIG;
|
||||
misc_pkt.change_config.opcode =
|
||||
|
||||
@@ -1377,7 +1377,7 @@ static int sdma_v6_0_sw_init(struct amdgpu_ip_block *ip_block)
|
||||
|
||||
switch (amdgpu_ip_version(adev, SDMA0_HWIP, 0)) {
|
||||
case IP_VERSION(6, 0, 0):
|
||||
if ((adev->sdma.instance[0].fw_version >= 24) && !adev->sdma.disable_uq)
|
||||
if ((adev->sdma.instance[0].fw_version >= 27) && !adev->sdma.disable_uq)
|
||||
adev->userq_funcs[AMDGPU_HW_IP_DMA] = &userq_mes_funcs;
|
||||
break;
|
||||
case IP_VERSION(6, 0, 1):
|
||||
@@ -1385,11 +1385,11 @@ static int sdma_v6_0_sw_init(struct amdgpu_ip_block *ip_block)
|
||||
adev->userq_funcs[AMDGPU_HW_IP_DMA] = &userq_mes_funcs;
|
||||
break;
|
||||
case IP_VERSION(6, 0, 2):
|
||||
if ((adev->sdma.instance[0].fw_version >= 21) && !adev->sdma.disable_uq)
|
||||
if ((adev->sdma.instance[0].fw_version >= 23) && !adev->sdma.disable_uq)
|
||||
adev->userq_funcs[AMDGPU_HW_IP_DMA] = &userq_mes_funcs;
|
||||
break;
|
||||
case IP_VERSION(6, 0, 3):
|
||||
if ((adev->sdma.instance[0].fw_version >= 25) && !adev->sdma.disable_uq)
|
||||
if ((adev->sdma.instance[0].fw_version >= 27) && !adev->sdma.disable_uq)
|
||||
adev->userq_funcs[AMDGPU_HW_IP_DMA] = &userq_mes_funcs;
|
||||
break;
|
||||
case IP_VERSION(6, 1, 0):
|
||||
|
||||
@@ -8381,8 +8381,7 @@ static int amdgpu_dm_connector_get_modes(struct drm_connector *connector)
|
||||
drm_add_modes_noedid(connector, 1920, 1080);
|
||||
} else {
|
||||
amdgpu_dm_connector_ddc_get_modes(connector, drm_edid);
|
||||
if (encoder && (connector->connector_type != DRM_MODE_CONNECTOR_eDP) &&
|
||||
(connector->connector_type != DRM_MODE_CONNECTOR_LVDS))
|
||||
if (encoder)
|
||||
amdgpu_dm_connector_add_common_modes(encoder, connector);
|
||||
amdgpu_dm_connector_add_freesync_modes(connector, drm_edid);
|
||||
}
|
||||
|
||||
@@ -520,6 +520,15 @@ void dpp1_dppclk_control(
|
||||
REG_UPDATE(DPP_CONTROL, DPP_CLOCK_ENABLE, 0);
|
||||
}
|
||||
|
||||
void dpp_force_disable_cursor(struct dpp *dpp_base)
|
||||
{
|
||||
struct dcn10_dpp *dpp = TO_DCN10_DPP(dpp_base);
|
||||
|
||||
/* Force disable cursor */
|
||||
REG_UPDATE(CURSOR0_CONTROL, CUR0_ENABLE, 0);
|
||||
dpp_base->pos.cur0_ctl.bits.cur0_enable = 0;
|
||||
}
|
||||
|
||||
static const struct dpp_funcs dcn10_dpp_funcs = {
|
||||
.dpp_read_state = dpp_read_state,
|
||||
.dpp_reset = dpp_reset,
|
||||
|
||||
@@ -1525,4 +1525,6 @@ void dpp1_construct(struct dcn10_dpp *dpp1,
|
||||
|
||||
void dpp1_cm_get_gamut_remap(struct dpp *dpp_base,
|
||||
struct dpp_grph_csc_adjustment *adjust);
|
||||
void dpp_force_disable_cursor(struct dpp *dpp_base);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1494,6 +1494,7 @@ static struct dpp_funcs dcn30_dpp_funcs = {
|
||||
.dpp_dppclk_control = dpp1_dppclk_control,
|
||||
.dpp_set_hdr_multiplier = dpp3_set_hdr_multiplier,
|
||||
.dpp_get_gamut_remap = dpp3_cm_get_gamut_remap,
|
||||
.dpp_force_disable_cursor = dpp_force_disable_cursor,
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -528,3 +528,75 @@ void dcn314_disable_link_output(struct dc_link *link,
|
||||
|
||||
apply_symclk_on_tx_off_wa(link);
|
||||
}
|
||||
|
||||
/**
|
||||
* dcn314_dpp_pg_control - DPP power gate control.
|
||||
*
|
||||
* @hws: dce_hwseq reference.
|
||||
* @dpp_inst: DPP instance reference.
|
||||
* @power_on: true if we want to enable power gate, false otherwise.
|
||||
*
|
||||
* Enable or disable power gate in the specific DPP instance.
|
||||
* If power gating is disabled, will force disable cursor in the DPP instance.
|
||||
*/
|
||||
void dcn314_dpp_pg_control(
|
||||
struct dce_hwseq *hws,
|
||||
unsigned int dpp_inst,
|
||||
bool power_on)
|
||||
{
|
||||
uint32_t power_gate = power_on ? 0 : 1;
|
||||
uint32_t pwr_status = power_on ? 0 : 2;
|
||||
|
||||
|
||||
if (hws->ctx->dc->debug.disable_dpp_power_gate) {
|
||||
/* Workaround for DCN314 with disabled power gating */
|
||||
if (!power_on) {
|
||||
|
||||
/* Force disable cursor if power gating is disabled */
|
||||
struct dpp *dpp = hws->ctx->dc->res_pool->dpps[dpp_inst];
|
||||
if (dpp && dpp->funcs->dpp_force_disable_cursor)
|
||||
dpp->funcs->dpp_force_disable_cursor(dpp);
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (REG(DOMAIN1_PG_CONFIG) == 0)
|
||||
return;
|
||||
|
||||
switch (dpp_inst) {
|
||||
case 0: /* DPP0 */
|
||||
REG_UPDATE(DOMAIN1_PG_CONFIG,
|
||||
DOMAIN1_POWER_GATE, power_gate);
|
||||
|
||||
REG_WAIT(DOMAIN1_PG_STATUS,
|
||||
DOMAIN1_PGFSM_PWR_STATUS, pwr_status,
|
||||
1, 1000);
|
||||
break;
|
||||
case 1: /* DPP1 */
|
||||
REG_UPDATE(DOMAIN3_PG_CONFIG,
|
||||
DOMAIN3_POWER_GATE, power_gate);
|
||||
|
||||
REG_WAIT(DOMAIN3_PG_STATUS,
|
||||
DOMAIN3_PGFSM_PWR_STATUS, pwr_status,
|
||||
1, 1000);
|
||||
break;
|
||||
case 2: /* DPP2 */
|
||||
REG_UPDATE(DOMAIN5_PG_CONFIG,
|
||||
DOMAIN5_POWER_GATE, power_gate);
|
||||
|
||||
REG_WAIT(DOMAIN5_PG_STATUS,
|
||||
DOMAIN5_PGFSM_PWR_STATUS, pwr_status,
|
||||
1, 1000);
|
||||
break;
|
||||
case 3: /* DPP3 */
|
||||
REG_UPDATE(DOMAIN7_PG_CONFIG,
|
||||
DOMAIN7_POWER_GATE, power_gate);
|
||||
|
||||
REG_WAIT(DOMAIN7_PG_STATUS,
|
||||
DOMAIN7_PGFSM_PWR_STATUS, pwr_status,
|
||||
1, 1000);
|
||||
break;
|
||||
default:
|
||||
BREAK_TO_DEBUGGER();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,4 +47,6 @@ void dcn314_dpp_root_clock_control(struct dce_hwseq *hws, unsigned int dpp_inst,
|
||||
|
||||
void dcn314_disable_link_output(struct dc_link *link, const struct link_resource *link_res, enum signal_type signal);
|
||||
|
||||
void dcn314_dpp_pg_control(struct dce_hwseq *hws, unsigned int dpp_inst, bool power_on);
|
||||
|
||||
#endif /* __DC_HWSS_DCN314_H__ */
|
||||
|
||||
@@ -141,6 +141,7 @@ static const struct hwseq_private_funcs dcn314_private_funcs = {
|
||||
.enable_power_gating_plane = dcn314_enable_power_gating_plane,
|
||||
.dpp_root_clock_control = dcn314_dpp_root_clock_control,
|
||||
.hubp_pg_control = dcn31_hubp_pg_control,
|
||||
.dpp_pg_control = dcn314_dpp_pg_control,
|
||||
.program_all_writeback_pipes_in_tree = dcn30_program_all_writeback_pipes_in_tree,
|
||||
.update_odm = dcn314_update_odm,
|
||||
.dsc_pg_control = dcn314_dsc_pg_control,
|
||||
|
||||
@@ -349,6 +349,9 @@ struct dpp_funcs {
|
||||
struct dpp *dpp_base,
|
||||
enum dc_color_space color_space,
|
||||
struct dc_csc_transform cursor_csc_color_matrix);
|
||||
|
||||
void (*dpp_force_disable_cursor)(struct dpp *dpp_base);
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -392,6 +392,17 @@ static int __maybe_unused ti_sn65dsi86_resume(struct device *dev)
|
||||
|
||||
gpiod_set_value_cansleep(pdata->enable_gpio, 1);
|
||||
|
||||
/*
|
||||
* After EN is deasserted and an external clock is detected, the bridge
|
||||
* will sample GPIO3:1 to determine its frequency. The driver will
|
||||
* overwrite this setting in ti_sn_bridge_set_refclk_freq(). But this is
|
||||
* racy. Thus we have to wait a couple of us. According to the datasheet
|
||||
* the GPIO lines has to be stable at least 5 us (td5) but it seems that
|
||||
* is not enough and the refclk frequency value is still lost or
|
||||
* overwritten by the bridge itself. Waiting for 20us seems to work.
|
||||
*/
|
||||
usleep_range(20, 30);
|
||||
|
||||
/*
|
||||
* If we have a reference clock we can enable communication w/ the
|
||||
* panel (including the aux channel) w/out any need for an input clock
|
||||
|
||||
@@ -18,7 +18,7 @@ gv100_fence_emit32(struct nouveau_channel *chan, u64 virtual, u32 sequence)
|
||||
struct nvif_push *push = &chan->chan.push;
|
||||
int ret;
|
||||
|
||||
ret = PUSH_WAIT(push, 8);
|
||||
ret = PUSH_WAIT(push, 13);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -32,6 +32,11 @@ gv100_fence_emit32(struct nouveau_channel *chan, u64 virtual, u32 sequence)
|
||||
NVDEF(NVC36F, SEM_EXECUTE, PAYLOAD_SIZE, 32BIT) |
|
||||
NVDEF(NVC36F, SEM_EXECUTE, RELEASE_TIMESTAMP, DIS));
|
||||
|
||||
PUSH_MTHD(push, NVC36F, MEM_OP_A, 0,
|
||||
MEM_OP_B, 0,
|
||||
MEM_OP_C, NVDEF(NVC36F, MEM_OP_C, MEMBAR_TYPE, SYS_MEMBAR),
|
||||
MEM_OP_D, NVDEF(NVC36F, MEM_OP_D, OPERATION, MEMBAR));
|
||||
|
||||
PUSH_MTHD(push, NVC36F, NON_STALL_INTERRUPT, 0);
|
||||
|
||||
PUSH_KICK(push);
|
||||
|
||||
@@ -7,6 +7,91 @@
|
||||
|
||||
#define NVC36F_NON_STALL_INTERRUPT (0x00000020)
|
||||
#define NVC36F_NON_STALL_INTERRUPT_HANDLE 31:0
|
||||
// NOTE - MEM_OP_A and MEM_OP_B have been replaced in gp100 with methods for
|
||||
// specifying the page address for a targeted TLB invalidate and the uTLB for
|
||||
// a targeted REPLAY_CANCEL for UVM.
|
||||
// The previous MEM_OP_A/B functionality is in MEM_OP_C/D, with slightly
|
||||
// rearranged fields.
|
||||
#define NVC36F_MEM_OP_A (0x00000028)
|
||||
#define NVC36F_MEM_OP_A_TLB_INVALIDATE_CANCEL_TARGET_CLIENT_UNIT_ID 5:0 // only relevant for REPLAY_CANCEL_TARGETED
|
||||
#define NVC36F_MEM_OP_A_TLB_INVALIDATE_INVALIDATION_SIZE 5:0 // Used to specify size of invalidate, used for invalidates which are not of the REPLAY_CANCEL_TARGETED type
|
||||
#define NVC36F_MEM_OP_A_TLB_INVALIDATE_CANCEL_TARGET_GPC_ID 10:6 // only relevant for REPLAY_CANCEL_TARGETED
|
||||
#define NVC36F_MEM_OP_A_TLB_INVALIDATE_CANCEL_MMU_ENGINE_ID 6:0 // only relevant for REPLAY_CANCEL_VA_GLOBAL
|
||||
#define NVC36F_MEM_OP_A_TLB_INVALIDATE_SYSMEMBAR 11:11
|
||||
#define NVC36F_MEM_OP_A_TLB_INVALIDATE_SYSMEMBAR_EN 0x00000001
|
||||
#define NVC36F_MEM_OP_A_TLB_INVALIDATE_SYSMEMBAR_DIS 0x00000000
|
||||
#define NVC36F_MEM_OP_A_TLB_INVALIDATE_TARGET_ADDR_LO 31:12
|
||||
#define NVC36F_MEM_OP_B (0x0000002c)
|
||||
#define NVC36F_MEM_OP_B_TLB_INVALIDATE_TARGET_ADDR_HI 31:0
|
||||
#define NVC36F_MEM_OP_C (0x00000030)
|
||||
#define NVC36F_MEM_OP_C_MEMBAR_TYPE 2:0
|
||||
#define NVC36F_MEM_OP_C_MEMBAR_TYPE_SYS_MEMBAR 0x00000000
|
||||
#define NVC36F_MEM_OP_C_MEMBAR_TYPE_MEMBAR 0x00000001
|
||||
#define NVC36F_MEM_OP_C_TLB_INVALIDATE_PDB 0:0
|
||||
#define NVC36F_MEM_OP_C_TLB_INVALIDATE_PDB_ONE 0x00000000
|
||||
#define NVC36F_MEM_OP_C_TLB_INVALIDATE_PDB_ALL 0x00000001 // Probably nonsensical for MMU_TLB_INVALIDATE_TARGETED
|
||||
#define NVC36F_MEM_OP_C_TLB_INVALIDATE_GPC 1:1
|
||||
#define NVC36F_MEM_OP_C_TLB_INVALIDATE_GPC_ENABLE 0x00000000
|
||||
#define NVC36F_MEM_OP_C_TLB_INVALIDATE_GPC_DISABLE 0x00000001
|
||||
#define NVC36F_MEM_OP_C_TLB_INVALIDATE_REPLAY 4:2 // only relevant if GPC ENABLE
|
||||
#define NVC36F_MEM_OP_C_TLB_INVALIDATE_REPLAY_NONE 0x00000000
|
||||
#define NVC36F_MEM_OP_C_TLB_INVALIDATE_REPLAY_START 0x00000001
|
||||
#define NVC36F_MEM_OP_C_TLB_INVALIDATE_REPLAY_START_ACK_ALL 0x00000002
|
||||
#define NVC36F_MEM_OP_C_TLB_INVALIDATE_REPLAY_CANCEL_TARGETED 0x00000003
|
||||
#define NVC36F_MEM_OP_C_TLB_INVALIDATE_REPLAY_CANCEL_GLOBAL 0x00000004
|
||||
#define NVC36F_MEM_OP_C_TLB_INVALIDATE_REPLAY_CANCEL_VA_GLOBAL 0x00000005
|
||||
#define NVC36F_MEM_OP_C_TLB_INVALIDATE_ACK_TYPE 6:5 // only relevant if GPC ENABLE
|
||||
#define NVC36F_MEM_OP_C_TLB_INVALIDATE_ACK_TYPE_NONE 0x00000000
|
||||
#define NVC36F_MEM_OP_C_TLB_INVALIDATE_ACK_TYPE_GLOBALLY 0x00000001
|
||||
#define NVC36F_MEM_OP_C_TLB_INVALIDATE_ACK_TYPE_INTRANODE 0x00000002
|
||||
#define NVC36F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE 9:7 //only relevant for REPLAY_CANCEL_VA_GLOBAL
|
||||
#define NVC36F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_READ 0
|
||||
#define NVC36F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_WRITE 1
|
||||
#define NVC36F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_ATOMIC_STRONG 2
|
||||
#define NVC36F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_RSVRVD 3
|
||||
#define NVC36F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_ATOMIC_WEAK 4
|
||||
#define NVC36F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_ATOMIC_ALL 5
|
||||
#define NVC36F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_WRITE_AND_ATOMIC 6
|
||||
#define NVC36F_MEM_OP_C_TLB_INVALIDATE_ACCESS_TYPE_VIRT_ALL 7
|
||||
#define NVC36F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL 9:7 // Invalidate affects this level and all below
|
||||
#define NVC36F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_ALL 0x00000000 // Invalidate tlb caches at all levels of the page table
|
||||
#define NVC36F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_PTE_ONLY 0x00000001
|
||||
#define NVC36F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE0 0x00000002
|
||||
#define NVC36F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE1 0x00000003
|
||||
#define NVC36F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE2 0x00000004
|
||||
#define NVC36F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE3 0x00000005
|
||||
#define NVC36F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE4 0x00000006
|
||||
#define NVC36F_MEM_OP_C_TLB_INVALIDATE_PAGE_TABLE_LEVEL_UP_TO_PDE5 0x00000007
|
||||
#define NVC36F_MEM_OP_C_TLB_INVALIDATE_PDB_APERTURE 11:10 // only relevant if PDB_ONE
|
||||
#define NVC36F_MEM_OP_C_TLB_INVALIDATE_PDB_APERTURE_VID_MEM 0x00000000
|
||||
#define NVC36F_MEM_OP_C_TLB_INVALIDATE_PDB_APERTURE_SYS_MEM_COHERENT 0x00000002
|
||||
#define NVC36F_MEM_OP_C_TLB_INVALIDATE_PDB_APERTURE_SYS_MEM_NONCOHERENT 0x00000003
|
||||
#define NVC36F_MEM_OP_C_TLB_INVALIDATE_PDB_ADDR_LO 31:12 // only relevant if PDB_ONE
|
||||
#define NVC36F_MEM_OP_C_ACCESS_COUNTER_CLR_TARGETED_NOTIFY_TAG 19:0
|
||||
// MEM_OP_D MUST be preceded by MEM_OPs A-C.
|
||||
#define NVC36F_MEM_OP_D (0x00000034)
|
||||
#define NVC36F_MEM_OP_D_TLB_INVALIDATE_PDB_ADDR_HI 26:0 // only relevant if PDB_ONE
|
||||
#define NVC36F_MEM_OP_D_OPERATION 31:27
|
||||
#define NVC36F_MEM_OP_D_OPERATION_MEMBAR 0x00000005
|
||||
#define NVC36F_MEM_OP_D_OPERATION_MMU_TLB_INVALIDATE 0x00000009
|
||||
#define NVC36F_MEM_OP_D_OPERATION_MMU_TLB_INVALIDATE_TARGETED 0x0000000a
|
||||
#define NVC36F_MEM_OP_D_OPERATION_L2_PEERMEM_INVALIDATE 0x0000000d
|
||||
#define NVC36F_MEM_OP_D_OPERATION_L2_SYSMEM_INVALIDATE 0x0000000e
|
||||
// CLEAN_LINES is an alias for Tegra/GPU IP usage
|
||||
#define NVC36F_MEM_OP_B_OPERATION_L2_INVALIDATE_CLEAN_LINES 0x0000000e
|
||||
#define NVC36F_MEM_OP_D_OPERATION_L2_CLEAN_COMPTAGS 0x0000000f
|
||||
#define NVC36F_MEM_OP_D_OPERATION_L2_FLUSH_DIRTY 0x00000010
|
||||
#define NVC36F_MEM_OP_D_OPERATION_L2_WAIT_FOR_SYS_PENDING_READS 0x00000015
|
||||
#define NVC36F_MEM_OP_D_OPERATION_ACCESS_COUNTER_CLR 0x00000016
|
||||
#define NVC36F_MEM_OP_D_ACCESS_COUNTER_CLR_TYPE 1:0
|
||||
#define NVC36F_MEM_OP_D_ACCESS_COUNTER_CLR_TYPE_MIMC 0x00000000
|
||||
#define NVC36F_MEM_OP_D_ACCESS_COUNTER_CLR_TYPE_MOMC 0x00000001
|
||||
#define NVC36F_MEM_OP_D_ACCESS_COUNTER_CLR_TYPE_ALL 0x00000002
|
||||
#define NVC36F_MEM_OP_D_ACCESS_COUNTER_CLR_TYPE_TARGETED 0x00000003
|
||||
#define NVC36F_MEM_OP_D_ACCESS_COUNTER_CLR_TARGETED_TYPE 2:2
|
||||
#define NVC36F_MEM_OP_D_ACCESS_COUNTER_CLR_TARGETED_TYPE_MIMC 0x00000000
|
||||
#define NVC36F_MEM_OP_D_ACCESS_COUNTER_CLR_TARGETED_TYPE_MOMC 0x00000001
|
||||
#define NVC36F_MEM_OP_D_ACCESS_COUNTER_CLR_TARGETED_BANK 6:3
|
||||
#define NVC36F_SEM_ADDR_LO (0x0000005c)
|
||||
#define NVC36F_SEM_ADDR_LO_OFFSET 31:2
|
||||
#define NVC36F_SEM_ADDR_HI (0x00000060)
|
||||
|
||||
@@ -350,6 +350,8 @@ nvkm_fifo_dtor(struct nvkm_engine *engine)
|
||||
nvkm_chid_unref(&fifo->chid);
|
||||
|
||||
nvkm_event_fini(&fifo->nonstall.event);
|
||||
if (fifo->func->nonstall_dtor)
|
||||
fifo->func->nonstall_dtor(fifo);
|
||||
mutex_destroy(&fifo->mutex);
|
||||
|
||||
if (fifo->func->dtor)
|
||||
|
||||
@@ -517,19 +517,11 @@ ga100_fifo_nonstall_intr(struct nvkm_inth *inth)
|
||||
static void
|
||||
ga100_fifo_nonstall_block(struct nvkm_event *event, int type, int index)
|
||||
{
|
||||
struct nvkm_fifo *fifo = container_of(event, typeof(*fifo), nonstall.event);
|
||||
struct nvkm_runl *runl = nvkm_runl_get(fifo, index, 0);
|
||||
|
||||
nvkm_inth_block(&runl->nonstall.inth);
|
||||
}
|
||||
|
||||
static void
|
||||
ga100_fifo_nonstall_allow(struct nvkm_event *event, int type, int index)
|
||||
{
|
||||
struct nvkm_fifo *fifo = container_of(event, typeof(*fifo), nonstall.event);
|
||||
struct nvkm_runl *runl = nvkm_runl_get(fifo, index, 0);
|
||||
|
||||
nvkm_inth_allow(&runl->nonstall.inth);
|
||||
}
|
||||
|
||||
const struct nvkm_event_func
|
||||
@@ -564,12 +556,26 @@ ga100_fifo_nonstall_ctor(struct nvkm_fifo *fifo)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
nvkm_inth_allow(&runl->nonstall.inth);
|
||||
|
||||
nr = max(nr, runl->id + 1);
|
||||
}
|
||||
|
||||
return nr;
|
||||
}
|
||||
|
||||
void
|
||||
ga100_fifo_nonstall_dtor(struct nvkm_fifo *fifo)
|
||||
{
|
||||
struct nvkm_runl *runl;
|
||||
|
||||
nvkm_runl_foreach(runl, fifo) {
|
||||
if (runl->nonstall.vector < 0)
|
||||
continue;
|
||||
nvkm_inth_block(&runl->nonstall.inth);
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
ga100_fifo_runl_ctor(struct nvkm_fifo *fifo)
|
||||
{
|
||||
@@ -599,6 +605,7 @@ ga100_fifo = {
|
||||
.runl_ctor = ga100_fifo_runl_ctor,
|
||||
.mmu_fault = &tu102_fifo_mmu_fault,
|
||||
.nonstall_ctor = ga100_fifo_nonstall_ctor,
|
||||
.nonstall_dtor = ga100_fifo_nonstall_dtor,
|
||||
.nonstall = &ga100_fifo_nonstall,
|
||||
.runl = &ga100_runl,
|
||||
.runq = &ga100_runq,
|
||||
|
||||
@@ -30,6 +30,7 @@ ga102_fifo = {
|
||||
.runl_ctor = ga100_fifo_runl_ctor,
|
||||
.mmu_fault = &tu102_fifo_mmu_fault,
|
||||
.nonstall_ctor = ga100_fifo_nonstall_ctor,
|
||||
.nonstall_dtor = ga100_fifo_nonstall_dtor,
|
||||
.nonstall = &ga100_fifo_nonstall,
|
||||
.runl = &ga100_runl,
|
||||
.runq = &ga100_runq,
|
||||
|
||||
@@ -41,6 +41,7 @@ struct nvkm_fifo_func {
|
||||
void (*start)(struct nvkm_fifo *, unsigned long *);
|
||||
|
||||
int (*nonstall_ctor)(struct nvkm_fifo *);
|
||||
void (*nonstall_dtor)(struct nvkm_fifo *);
|
||||
const struct nvkm_event_func *nonstall;
|
||||
|
||||
const struct nvkm_runl_func *runl;
|
||||
@@ -200,6 +201,7 @@ u32 tu102_chan_doorbell_handle(struct nvkm_chan *);
|
||||
|
||||
int ga100_fifo_runl_ctor(struct nvkm_fifo *);
|
||||
int ga100_fifo_nonstall_ctor(struct nvkm_fifo *);
|
||||
void ga100_fifo_nonstall_dtor(struct nvkm_fifo *);
|
||||
extern const struct nvkm_event_func ga100_fifo_nonstall;
|
||||
extern const struct nvkm_runl_func ga100_runl;
|
||||
extern const struct nvkm_runq_func ga100_runq;
|
||||
|
||||
@@ -601,6 +601,7 @@ r535_fifo_new(const struct nvkm_fifo_func *hw, struct nvkm_device *device,
|
||||
rm->chan.func = &r535_chan;
|
||||
rm->nonstall = &ga100_fifo_nonstall;
|
||||
rm->nonstall_ctor = ga100_fifo_nonstall_ctor;
|
||||
rm->nonstall_dtor = ga100_fifo_nonstall_dtor;
|
||||
|
||||
return nvkm_fifo_new_(rm, device, type, inst, pfifo);
|
||||
}
|
||||
|
||||
@@ -391,7 +391,8 @@ EXPORT_SYMBOL(drm_sched_entity_set_priority);
|
||||
* Add a callback to the current dependency of the entity to wake up the
|
||||
* scheduler when the entity becomes available.
|
||||
*/
|
||||
static bool drm_sched_entity_add_dependency_cb(struct drm_sched_entity *entity)
|
||||
static bool drm_sched_entity_add_dependency_cb(struct drm_sched_entity *entity,
|
||||
struct drm_sched_job *sched_job)
|
||||
{
|
||||
struct drm_gpu_scheduler *sched = entity->rq->sched;
|
||||
struct dma_fence *fence = entity->dependency;
|
||||
@@ -421,6 +422,10 @@ static bool drm_sched_entity_add_dependency_cb(struct drm_sched_entity *entity)
|
||||
entity->dependency = fence;
|
||||
}
|
||||
|
||||
if (trace_drm_sched_job_unschedulable_enabled() &&
|
||||
!test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &entity->dependency->flags))
|
||||
trace_drm_sched_job_unschedulable(sched_job, entity->dependency);
|
||||
|
||||
if (!dma_fence_add_callback(entity->dependency, &entity->cb,
|
||||
drm_sched_entity_wakeup))
|
||||
return true;
|
||||
@@ -461,10 +466,8 @@ struct drm_sched_job *drm_sched_entity_pop_job(struct drm_sched_entity *entity)
|
||||
|
||||
while ((entity->dependency =
|
||||
drm_sched_job_dependency(sched_job, entity))) {
|
||||
if (drm_sched_entity_add_dependency_cb(entity)) {
|
||||
trace_drm_sched_job_unschedulable(sched_job, entity->dependency);
|
||||
if (drm_sched_entity_add_dependency_cb(entity, sched_job))
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* skip jobs from entity that marked guilty */
|
||||
|
||||
@@ -819,8 +819,7 @@ static int xe_bo_move(struct ttm_buffer_object *ttm_bo, bool evict,
|
||||
return ret;
|
||||
}
|
||||
|
||||
tt_has_data = ttm && (ttm_tt_is_populated(ttm) ||
|
||||
(ttm->page_flags & TTM_TT_FLAG_SWAPPED));
|
||||
tt_has_data = ttm && (ttm_tt_is_populated(ttm) || ttm_tt_is_swapped(ttm));
|
||||
|
||||
move_lacks_source = !old_mem || (handle_system_ccs ? (!bo->ccs_cleared) :
|
||||
(!mem_type_is_vram(old_mem_type) && !tt_has_data));
|
||||
|
||||
@@ -379,7 +379,7 @@ static int ina238_write_in(struct device *dev, u32 attr, int channel,
|
||||
regval = clamp_val(val, -163, 163);
|
||||
regval = (regval * 1000 * 4) /
|
||||
(INA238_SHUNT_VOLTAGE_LSB * data->gain);
|
||||
regval = clamp_val(regval, S16_MIN, S16_MAX);
|
||||
regval = clamp_val(regval, S16_MIN, S16_MAX) & 0xffff;
|
||||
|
||||
switch (attr) {
|
||||
case hwmon_in_max:
|
||||
@@ -517,9 +517,10 @@ static int ina238_write_power(struct device *dev, u32 attr, long val)
|
||||
* Unsigned postive values. Compared against the 24-bit power register,
|
||||
* lower 8-bits are truncated. Same conversion to/from uW as POWER
|
||||
* register.
|
||||
* The first clamp_val() is to establish a baseline to avoid overflows.
|
||||
*/
|
||||
regval = clamp_val(val, 0, LONG_MAX);
|
||||
regval = div_u64(val * 4 * 100 * data->rshunt, data->config->power_calculate_factor *
|
||||
regval = clamp_val(val, 0, LONG_MAX / 2);
|
||||
regval = div_u64(regval * 4 * 100 * data->rshunt, data->config->power_calculate_factor *
|
||||
1000ULL * INA238_FIXED_SHUNT * data->gain);
|
||||
regval = clamp_val(regval >> 8, 0, U16_MAX);
|
||||
|
||||
@@ -572,7 +573,7 @@ static int ina238_write_temp(struct device *dev, u32 attr, long val)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
/* Signed */
|
||||
regval = clamp_val(val, -40000, 125000);
|
||||
val = clamp_val(val, -40000, 125000);
|
||||
regval = div_s64(val * 10000, data->config->temp_lsb) << data->config->temp_shift;
|
||||
regval = clamp_val(regval, S16_MIN, S16_MAX) & (0xffff << data->config->temp_shift);
|
||||
|
||||
|
||||
@@ -561,15 +561,14 @@ static int mlxreg_fan_cooling_config(struct device *dev, struct mlxreg_fan *fan)
|
||||
if (!pwm->connected)
|
||||
continue;
|
||||
pwm->fan = fan;
|
||||
/* Set minimal PWM speed. */
|
||||
pwm->last_hwmon_state = MLXREG_FAN_PWM_DUTY2STATE(MLXREG_FAN_MIN_DUTY);
|
||||
pwm->cdev = devm_thermal_of_cooling_device_register(dev, NULL, mlxreg_fan_name[i],
|
||||
pwm, &mlxreg_fan_cooling_ops);
|
||||
if (IS_ERR(pwm->cdev)) {
|
||||
dev_err(dev, "Failed to register cooling device\n");
|
||||
return PTR_ERR(pwm->cdev);
|
||||
}
|
||||
|
||||
/* Set minimal PWM speed. */
|
||||
pwm->last_hwmon_state = MLXREG_FAN_PWM_DUTY2STATE(MLXREG_FAN_MIN_DUTY);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -1052,7 +1052,7 @@ static const struct pci_device_id i801_ids[] = {
|
||||
{ PCI_DEVICE_DATA(INTEL, METEOR_LAKE_P_SMBUS, FEATURES_ICH5 | FEATURE_TCO_CNL) },
|
||||
{ PCI_DEVICE_DATA(INTEL, METEOR_LAKE_SOC_S_SMBUS, FEATURES_ICH5 | FEATURE_TCO_CNL) },
|
||||
{ PCI_DEVICE_DATA(INTEL, METEOR_LAKE_PCH_S_SMBUS, FEATURES_ICH5 | FEATURE_TCO_CNL) },
|
||||
{ PCI_DEVICE_DATA(INTEL, BIRCH_STREAM_SMBUS, FEATURES_ICH5 | FEATURE_TCO_CNL) },
|
||||
{ PCI_DEVICE_DATA(INTEL, BIRCH_STREAM_SMBUS, FEATURES_ICH5) },
|
||||
{ PCI_DEVICE_DATA(INTEL, ARROW_LAKE_H_SMBUS, FEATURES_ICH5 | FEATURE_TCO_CNL) },
|
||||
{ PCI_DEVICE_DATA(INTEL, PANTHER_LAKE_H_SMBUS, FEATURES_ICH5 | FEATURE_TCO_CNL) },
|
||||
{ PCI_DEVICE_DATA(INTEL, PANTHER_LAKE_P_SMBUS, FEATURES_ICH5 | FEATURE_TCO_CNL) },
|
||||
|
||||
@@ -99,6 +99,9 @@ static int rtl9300_i2c_config_xfer(struct rtl9300_i2c *i2c, struct rtl9300_i2c_c
|
||||
{
|
||||
u32 val, mask;
|
||||
|
||||
if (len < 1 || len > 16)
|
||||
return -EINVAL;
|
||||
|
||||
val = chan->bus_freq << RTL9300_I2C_MST_CTRL2_SCL_FREQ_OFS;
|
||||
mask = RTL9300_I2C_MST_CTRL2_SCL_FREQ_MASK;
|
||||
|
||||
@@ -222,15 +225,6 @@ static int rtl9300_i2c_smbus_xfer(struct i2c_adapter *adap, u16 addr, unsigned s
|
||||
}
|
||||
|
||||
switch (size) {
|
||||
case I2C_SMBUS_QUICK:
|
||||
ret = rtl9300_i2c_config_xfer(i2c, chan, addr, 0);
|
||||
if (ret)
|
||||
goto out_unlock;
|
||||
ret = rtl9300_i2c_reg_addr_set(i2c, 0, 0);
|
||||
if (ret)
|
||||
goto out_unlock;
|
||||
break;
|
||||
|
||||
case I2C_SMBUS_BYTE:
|
||||
if (read_write == I2C_SMBUS_WRITE) {
|
||||
ret = rtl9300_i2c_config_xfer(i2c, chan, addr, 0);
|
||||
@@ -312,9 +306,9 @@ out_unlock:
|
||||
|
||||
static u32 rtl9300_i2c_func(struct i2c_adapter *a)
|
||||
{
|
||||
return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE |
|
||||
I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA |
|
||||
I2C_FUNC_SMBUS_BLOCK_DATA;
|
||||
return I2C_FUNC_SMBUS_BYTE | I2C_FUNC_SMBUS_BYTE_DATA |
|
||||
I2C_FUNC_SMBUS_WORD_DATA | I2C_FUNC_SMBUS_BLOCK_DATA |
|
||||
I2C_FUNC_SMBUS_I2C_BLOCK;
|
||||
}
|
||||
|
||||
static const struct i2c_algorithm rtl9300_i2c_algo = {
|
||||
@@ -323,7 +317,7 @@ static const struct i2c_algorithm rtl9300_i2c_algo = {
|
||||
};
|
||||
|
||||
static struct i2c_adapter_quirks rtl9300_i2c_quirks = {
|
||||
.flags = I2C_AQ_NO_CLK_STRETCH,
|
||||
.flags = I2C_AQ_NO_CLK_STRETCH | I2C_AQ_NO_ZERO_LEN,
|
||||
.max_read_len = 16,
|
||||
.max_write_len = 16,
|
||||
};
|
||||
@@ -353,7 +347,7 @@ static int rtl9300_i2c_probe(struct platform_device *pdev)
|
||||
|
||||
platform_set_drvdata(pdev, i2c);
|
||||
|
||||
if (device_get_child_node_count(dev) >= RTL9300_I2C_MUX_NCHAN)
|
||||
if (device_get_child_node_count(dev) > RTL9300_I2C_MUX_NCHAN)
|
||||
return dev_err_probe(dev, -EINVAL, "Too many channels\n");
|
||||
|
||||
device_for_each_child_node(dev, child) {
|
||||
|
||||
@@ -51,14 +51,14 @@ void dsp_hwec_enable(struct dsp *dsp, const char *arg)
|
||||
goto _do;
|
||||
|
||||
{
|
||||
char *dup, *tok, *name, *val;
|
||||
char *dup, *next, *tok, *name, *val;
|
||||
int tmp;
|
||||
|
||||
dup = kstrdup(arg, GFP_ATOMIC);
|
||||
dup = next = kstrdup(arg, GFP_ATOMIC);
|
||||
if (!dup)
|
||||
return;
|
||||
|
||||
while ((tok = strsep(&dup, ","))) {
|
||||
while ((tok = strsep(&next, ","))) {
|
||||
if (!strlen(tok))
|
||||
continue;
|
||||
name = strsep(&tok, "=");
|
||||
|
||||
@@ -9125,6 +9125,11 @@ void md_do_sync(struct md_thread *thread)
|
||||
}
|
||||
|
||||
action = md_sync_action(mddev);
|
||||
if (action == ACTION_FROZEN || action == ACTION_IDLE) {
|
||||
set_bit(MD_RECOVERY_INTR, &mddev->recovery);
|
||||
goto skip;
|
||||
}
|
||||
|
||||
desc = md_sync_action_name(action);
|
||||
mddev->last_sync_action = action;
|
||||
|
||||
|
||||
@@ -1225,7 +1225,7 @@ static void alloc_behind_master_bio(struct r1bio *r1_bio,
|
||||
int i = 0;
|
||||
struct bio *behind_bio = NULL;
|
||||
|
||||
behind_bio = bio_alloc_bioset(NULL, vcnt, 0, GFP_NOIO,
|
||||
behind_bio = bio_alloc_bioset(NULL, vcnt, bio->bi_opf, GFP_NOIO,
|
||||
&r1_bio->mddev->bio_set);
|
||||
|
||||
/* discard op, we don't support writezero/writesame yet */
|
||||
|
||||
@@ -779,7 +779,8 @@ int mv88e6xxx_port_setup_leds(struct mv88e6xxx_chip *chip, int port)
|
||||
continue;
|
||||
if (led_num > 1) {
|
||||
dev_err(dev, "invalid LED specified port %d\n", port);
|
||||
return -EINVAL;
|
||||
ret = -EINVAL;
|
||||
goto err_put_led;
|
||||
}
|
||||
|
||||
if (led_num == 0)
|
||||
@@ -823,17 +824,25 @@ int mv88e6xxx_port_setup_leds(struct mv88e6xxx_chip *chip, int port)
|
||||
init_data.devname_mandatory = true;
|
||||
init_data.devicename = kasprintf(GFP_KERNEL, "%s:0%d:0%d", chip->info->name,
|
||||
port, led_num);
|
||||
if (!init_data.devicename)
|
||||
return -ENOMEM;
|
||||
if (!init_data.devicename) {
|
||||
ret = -ENOMEM;
|
||||
goto err_put_led;
|
||||
}
|
||||
|
||||
ret = devm_led_classdev_register_ext(dev, l, &init_data);
|
||||
kfree(init_data.devicename);
|
||||
|
||||
if (ret) {
|
||||
dev_err(dev, "Failed to init LED %d for port %d", led_num, port);
|
||||
return ret;
|
||||
goto err_put_led;
|
||||
}
|
||||
}
|
||||
|
||||
fwnode_handle_put(leds);
|
||||
return 0;
|
||||
|
||||
err_put_led:
|
||||
fwnode_handle_put(led);
|
||||
fwnode_handle_put(leds);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -4397,7 +4397,7 @@ static void bnxt_alloc_one_rx_ring_netmem(struct bnxt *bp,
|
||||
for (i = 0; i < bp->rx_agg_ring_size; i++) {
|
||||
if (bnxt_alloc_rx_netmem(bp, rxr, prod, GFP_KERNEL)) {
|
||||
netdev_warn(bp->dev, "init'ed rx ring %d with %d/%d pages only\n",
|
||||
ring_nr, i, bp->rx_ring_size);
|
||||
ring_nr, i, bp->rx_agg_ring_size);
|
||||
break;
|
||||
}
|
||||
prod = NEXT_RX_AGG(prod);
|
||||
|
||||
@@ -1223,12 +1223,13 @@ static int macb_tx_complete(struct macb_queue *queue, int budget)
|
||||
{
|
||||
struct macb *bp = queue->bp;
|
||||
u16 queue_index = queue - bp->queues;
|
||||
unsigned long flags;
|
||||
unsigned int tail;
|
||||
unsigned int head;
|
||||
int packets = 0;
|
||||
u32 bytes = 0;
|
||||
|
||||
spin_lock(&queue->tx_ptr_lock);
|
||||
spin_lock_irqsave(&queue->tx_ptr_lock, flags);
|
||||
head = queue->tx_head;
|
||||
for (tail = queue->tx_tail; tail != head && packets < budget; tail++) {
|
||||
struct macb_tx_skb *tx_skb;
|
||||
@@ -1291,7 +1292,7 @@ static int macb_tx_complete(struct macb_queue *queue, int budget)
|
||||
CIRC_CNT(queue->tx_head, queue->tx_tail,
|
||||
bp->tx_ring_size) <= MACB_TX_WAKEUP_THRESH(bp))
|
||||
netif_wake_subqueue(bp->dev, queue_index);
|
||||
spin_unlock(&queue->tx_ptr_lock);
|
||||
spin_unlock_irqrestore(&queue->tx_ptr_lock, flags);
|
||||
|
||||
return packets;
|
||||
}
|
||||
@@ -1707,8 +1708,9 @@ static void macb_tx_restart(struct macb_queue *queue)
|
||||
{
|
||||
struct macb *bp = queue->bp;
|
||||
unsigned int head_idx, tbqp;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock(&queue->tx_ptr_lock);
|
||||
spin_lock_irqsave(&queue->tx_ptr_lock, flags);
|
||||
|
||||
if (queue->tx_head == queue->tx_tail)
|
||||
goto out_tx_ptr_unlock;
|
||||
@@ -1720,19 +1722,20 @@ static void macb_tx_restart(struct macb_queue *queue)
|
||||
if (tbqp == head_idx)
|
||||
goto out_tx_ptr_unlock;
|
||||
|
||||
spin_lock_irq(&bp->lock);
|
||||
spin_lock(&bp->lock);
|
||||
macb_writel(bp, NCR, macb_readl(bp, NCR) | MACB_BIT(TSTART));
|
||||
spin_unlock_irq(&bp->lock);
|
||||
spin_unlock(&bp->lock);
|
||||
|
||||
out_tx_ptr_unlock:
|
||||
spin_unlock(&queue->tx_ptr_lock);
|
||||
spin_unlock_irqrestore(&queue->tx_ptr_lock, flags);
|
||||
}
|
||||
|
||||
static bool macb_tx_complete_pending(struct macb_queue *queue)
|
||||
{
|
||||
bool retval = false;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock(&queue->tx_ptr_lock);
|
||||
spin_lock_irqsave(&queue->tx_ptr_lock, flags);
|
||||
if (queue->tx_head != queue->tx_tail) {
|
||||
/* Make hw descriptor updates visible to CPU */
|
||||
rmb();
|
||||
@@ -1740,7 +1743,7 @@ static bool macb_tx_complete_pending(struct macb_queue *queue)
|
||||
if (macb_tx_desc(queue, queue->tx_tail)->ctrl & MACB_BIT(TX_USED))
|
||||
retval = true;
|
||||
}
|
||||
spin_unlock(&queue->tx_ptr_lock);
|
||||
spin_unlock_irqrestore(&queue->tx_ptr_lock, flags);
|
||||
return retval;
|
||||
}
|
||||
|
||||
@@ -2308,6 +2311,7 @@ static netdev_tx_t macb_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
struct macb_queue *queue = &bp->queues[queue_index];
|
||||
unsigned int desc_cnt, nr_frags, frag_size, f;
|
||||
unsigned int hdrlen;
|
||||
unsigned long flags;
|
||||
bool is_lso;
|
||||
netdev_tx_t ret = NETDEV_TX_OK;
|
||||
|
||||
@@ -2368,7 +2372,7 @@ static netdev_tx_t macb_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
desc_cnt += DIV_ROUND_UP(frag_size, bp->max_tx_length);
|
||||
}
|
||||
|
||||
spin_lock_bh(&queue->tx_ptr_lock);
|
||||
spin_lock_irqsave(&queue->tx_ptr_lock, flags);
|
||||
|
||||
/* This is a hard error, log it. */
|
||||
if (CIRC_SPACE(queue->tx_head, queue->tx_tail,
|
||||
@@ -2392,15 +2396,15 @@ static netdev_tx_t macb_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
netdev_tx_sent_queue(netdev_get_tx_queue(bp->dev, queue_index),
|
||||
skb->len);
|
||||
|
||||
spin_lock_irq(&bp->lock);
|
||||
spin_lock(&bp->lock);
|
||||
macb_writel(bp, NCR, macb_readl(bp, NCR) | MACB_BIT(TSTART));
|
||||
spin_unlock_irq(&bp->lock);
|
||||
spin_unlock(&bp->lock);
|
||||
|
||||
if (CIRC_SPACE(queue->tx_head, queue->tx_tail, bp->tx_ring_size) < 1)
|
||||
netif_stop_subqueue(dev, queue_index);
|
||||
|
||||
unlock:
|
||||
spin_unlock_bh(&queue->tx_ptr_lock);
|
||||
spin_unlock_irqrestore(&queue->tx_ptr_lock, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1493,13 +1493,17 @@ static int bgx_init_of_phy(struct bgx *bgx)
|
||||
* this cortina phy, for which there is no driver
|
||||
* support, ignore it.
|
||||
*/
|
||||
if (phy_np &&
|
||||
!of_device_is_compatible(phy_np, "cortina,cs4223-slice")) {
|
||||
/* Wait until the phy drivers are available */
|
||||
pd = of_phy_find_device(phy_np);
|
||||
if (!pd)
|
||||
goto defer;
|
||||
bgx->lmac[lmac].phydev = pd;
|
||||
if (phy_np) {
|
||||
if (!of_device_is_compatible(phy_np, "cortina,cs4223-slice")) {
|
||||
/* Wait until the phy drivers are available */
|
||||
pd = of_phy_find_device(phy_np);
|
||||
if (!pd) {
|
||||
of_node_put(phy_np);
|
||||
goto defer;
|
||||
}
|
||||
bgx->lmac[lmac].phydev = pd;
|
||||
}
|
||||
of_node_put(phy_np);
|
||||
}
|
||||
|
||||
lmac++;
|
||||
@@ -1515,11 +1519,11 @@ defer:
|
||||
* for phy devices we may have already found.
|
||||
*/
|
||||
while (lmac) {
|
||||
lmac--;
|
||||
if (bgx->lmac[lmac].phydev) {
|
||||
put_device(&bgx->lmac[lmac].phydev->mdio.dev);
|
||||
bgx->lmac[lmac].phydev = NULL;
|
||||
}
|
||||
lmac--;
|
||||
}
|
||||
of_node_put(node);
|
||||
return -EPROBE_DEFER;
|
||||
|
||||
@@ -32,4 +32,24 @@ config DL2K
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called dl2k.
|
||||
|
||||
config SUNDANCE
|
||||
tristate "Sundance Alta support"
|
||||
depends on PCI
|
||||
select CRC32
|
||||
select MII
|
||||
help
|
||||
This driver is for the Sundance "Alta" chip.
|
||||
More specific information and updates are available from
|
||||
<http://www.scyld.com/network/sundance.html>.
|
||||
|
||||
config SUNDANCE_MMIO
|
||||
bool "Use MMIO instead of PIO"
|
||||
depends on SUNDANCE
|
||||
help
|
||||
Enable memory-mapped I/O for interaction with Sundance NIC registers.
|
||||
Do NOT enable this by default, PIO (enabled when MMIO is disabled)
|
||||
is known to solve bugs on certain chips.
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
endif # NET_VENDOR_DLINK
|
||||
|
||||
@@ -4,3 +4,4 @@
|
||||
#
|
||||
|
||||
obj-$(CONFIG_DL2K) += dl2k.o
|
||||
obj-$(CONFIG_SUNDANCE) += sundance.o
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user