Merge 1da38549dd
("Merge tag 'nfsd-5.15-3' of git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux") into android-mainline
Steps on the way to 5.15-rc5 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I8012063c0289b1b8a6044540c81c6cd9e8e1f341
This commit is contained in:
commit
8d3bbb3575
1
CREDITS
1
CREDITS
@ -971,6 +971,7 @@ D: PowerPC
|
||||
N: Daniel Drake
|
||||
E: dsd@gentoo.org
|
||||
D: USBAT02 CompactFlash support in usb-storage
|
||||
D: ZD1211RW wireless driver
|
||||
S: UK
|
||||
|
||||
N: Oleg Drokin
|
||||
|
@ -83,7 +83,7 @@ Example:
|
||||
#interrupt-cells = <2>;
|
||||
|
||||
switch0: switch@0 {
|
||||
compatible = "marvell,mv88e6390";
|
||||
compatible = "marvell,mv88e6190";
|
||||
reg = <0>;
|
||||
reset-gpios = <&gpio5 1 GPIO_ACTIVE_LOW>;
|
||||
|
||||
|
10
MAINTAINERS
10
MAINTAINERS
@ -1276,6 +1276,7 @@ F: drivers/input/mouse/bcm5974.c
|
||||
|
||||
APPLE DART IOMMU DRIVER
|
||||
M: Sven Peter <sven@svenpeter.dev>
|
||||
R: Alyssa Rosenzweig <alyssa@rosenzweig.io>
|
||||
L: iommu@lists.linux-foundation.org
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/iommu/apple,dart.yaml
|
||||
@ -1712,6 +1713,8 @@ F: drivers/*/*alpine*
|
||||
|
||||
ARM/APPLE MACHINE SUPPORT
|
||||
M: Hector Martin <marcan@marcan.st>
|
||||
M: Sven Peter <sven@svenpeter.dev>
|
||||
R: Alyssa Rosenzweig <alyssa@rosenzweig.io>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
W: https://asahilinux.org
|
||||
@ -2237,6 +2240,7 @@ F: arch/arm/mach-pxa/mioa701.c
|
||||
|
||||
ARM/MStar/Sigmastar Armv7 SoC support
|
||||
M: Daniel Palmer <daniel@thingy.jp>
|
||||
M: Romain Perier <romain.perier@gmail.com>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
W: http://linux-chenxing.org/
|
||||
@ -2713,6 +2717,7 @@ F: drivers/power/reset/keystone-reset.c
|
||||
|
||||
ARM/TEXAS INSTRUMENTS K3 ARCHITECTURE
|
||||
M: Nishanth Menon <nm@ti.com>
|
||||
M: Vignesh Raghavendra <vigneshr@ti.com>
|
||||
M: Tero Kristo <kristo@kernel.org>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Supported
|
||||
@ -8609,9 +8614,8 @@ F: Documentation/devicetree/bindings/iio/humidity/st,hts221.yaml
|
||||
F: drivers/iio/humidity/hts221*
|
||||
|
||||
HUAWEI ETHERNET DRIVER
|
||||
M: Bin Luo <luobin9@huawei.com>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Supported
|
||||
S: Orphan
|
||||
F: Documentation/networking/device_drivers/ethernet/huawei/hinic.rst
|
||||
F: drivers/net/ethernet/huawei/hinic/
|
||||
|
||||
@ -17807,7 +17811,6 @@ F: drivers/staging/nvec/
|
||||
|
||||
STAGING - OLPC SECONDARY DISPLAY CONTROLLER (DCON)
|
||||
M: Jens Frederich <jfrederich@gmail.com>
|
||||
M: Daniel Drake <dsd@laptop.org>
|
||||
M: Jon Nettleton <jon.nettleton@gmail.com>
|
||||
S: Maintained
|
||||
W: http://wiki.laptop.org/go/DCON
|
||||
@ -20713,7 +20716,6 @@ S: Maintained
|
||||
F: mm/zbud.c
|
||||
|
||||
ZD1211RW WIRELESS DRIVER
|
||||
M: Daniel Drake <dsd@gentoo.org>
|
||||
M: Ulrich Kunitz <kune@deine-taler.de>
|
||||
L: linux-wireless@vger.kernel.org
|
||||
L: zd1211-devs@lists.sourceforge.net (subscribers-only)
|
||||
|
@ -71,7 +71,6 @@ apb {
|
||||
isc: isc@f0008000 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_isc_base &pinctrl_isc_data_8bit &pinctrl_isc_data_9_10 &pinctrl_isc_data_11_12>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
qspi1: spi@f0024000 {
|
||||
|
@ -196,11 +196,13 @@ vddioddr: VDD_DDR {
|
||||
|
||||
regulator-state-standby {
|
||||
regulator-on-in-suspend;
|
||||
regulator-suspend-microvolt = <1350000>;
|
||||
regulator-mode = <4>;
|
||||
};
|
||||
|
||||
regulator-state-mem {
|
||||
regulator-on-in-suspend;
|
||||
regulator-suspend-microvolt = <1350000>;
|
||||
regulator-mode = <4>;
|
||||
};
|
||||
};
|
||||
@ -353,7 +355,10 @@ &gmac0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_gmac0_default &pinctrl_gmac0_txck_default &pinctrl_gmac0_phy_irq>;
|
||||
pinctrl-0 = <&pinctrl_gmac0_default
|
||||
&pinctrl_gmac0_mdio_default
|
||||
&pinctrl_gmac0_txck_default
|
||||
&pinctrl_gmac0_phy_irq>;
|
||||
phy-mode = "rgmii-id";
|
||||
status = "okay";
|
||||
|
||||
@ -368,7 +373,9 @@ &gmac1 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_gmac1_default &pinctrl_gmac1_phy_irq>;
|
||||
pinctrl-0 = <&pinctrl_gmac1_default
|
||||
&pinctrl_gmac1_mdio_default
|
||||
&pinctrl_gmac1_phy_irq>;
|
||||
phy-mode = "rmii";
|
||||
status = "okay";
|
||||
|
||||
@ -423,14 +430,20 @@ pinctrl_gmac0_default: gmac0_default {
|
||||
<PIN_PA15__G0_TXEN>,
|
||||
<PIN_PA30__G0_RXCK>,
|
||||
<PIN_PA18__G0_RXDV>,
|
||||
<PIN_PA22__G0_MDC>,
|
||||
<PIN_PA23__G0_MDIO>,
|
||||
<PIN_PA25__G0_125CK>;
|
||||
slew-rate = <0>;
|
||||
bias-disable;
|
||||
};
|
||||
|
||||
pinctrl_gmac0_mdio_default: gmac0_mdio_default {
|
||||
pinmux = <PIN_PA22__G0_MDC>,
|
||||
<PIN_PA23__G0_MDIO>;
|
||||
bias-disable;
|
||||
};
|
||||
|
||||
pinctrl_gmac0_txck_default: gmac0_txck_default {
|
||||
pinmux = <PIN_PA24__G0_TXCK>;
|
||||
slew-rate = <0>;
|
||||
bias-pull-up;
|
||||
};
|
||||
|
||||
@ -447,8 +460,13 @@ pinctrl_gmac1_default: gmac1_default {
|
||||
<PIN_PD25__G1_RX0>,
|
||||
<PIN_PD26__G1_RX1>,
|
||||
<PIN_PD27__G1_RXER>,
|
||||
<PIN_PD24__G1_RXDV>,
|
||||
<PIN_PD28__G1_MDC>,
|
||||
<PIN_PD24__G1_RXDV>;
|
||||
slew-rate = <0>;
|
||||
bias-disable;
|
||||
};
|
||||
|
||||
pinctrl_gmac1_mdio_default: gmac1_mdio_default {
|
||||
pinmux = <PIN_PD28__G1_MDC>,
|
||||
<PIN_PD29__G1_MDIO>;
|
||||
bias-disable;
|
||||
};
|
||||
@ -540,6 +558,7 @@ cmd_data {
|
||||
<PIN_PA8__SDMMC0_DAT5>,
|
||||
<PIN_PA9__SDMMC0_DAT6>,
|
||||
<PIN_PA10__SDMMC0_DAT7>;
|
||||
slew-rate = <0>;
|
||||
bias-pull-up;
|
||||
};
|
||||
|
||||
@ -547,6 +566,7 @@ ck_cd_rstn_vddsel {
|
||||
pinmux = <PIN_PA0__SDMMC0_CK>,
|
||||
<PIN_PA2__SDMMC0_RSTN>,
|
||||
<PIN_PA11__SDMMC0_DS>;
|
||||
slew-rate = <0>;
|
||||
bias-pull-up;
|
||||
};
|
||||
};
|
||||
@ -558,6 +578,7 @@ cmd_data {
|
||||
<PIN_PC0__SDMMC1_DAT1>,
|
||||
<PIN_PC1__SDMMC1_DAT2>,
|
||||
<PIN_PC2__SDMMC1_DAT3>;
|
||||
slew-rate = <0>;
|
||||
bias-pull-up;
|
||||
};
|
||||
|
||||
@ -566,6 +587,7 @@ ck_cd_rstn_vddsel {
|
||||
<PIN_PB28__SDMMC1_RSTN>,
|
||||
<PIN_PC5__SDMMC1_1V8SEL>,
|
||||
<PIN_PC4__SDMMC1_CD>;
|
||||
slew-rate = <0>;
|
||||
bias-pull-up;
|
||||
};
|
||||
};
|
||||
@ -577,11 +599,13 @@ cmd_data {
|
||||
<PIN_PD6__SDMMC2_DAT1>,
|
||||
<PIN_PD7__SDMMC2_DAT2>,
|
||||
<PIN_PD8__SDMMC2_DAT3>;
|
||||
slew-rate = <0>;
|
||||
bias-pull-up;
|
||||
};
|
||||
|
||||
ck {
|
||||
pinmux = <PIN_PD4__SDMMC2_CK>;
|
||||
slew-rate = <0>;
|
||||
bias-pull-up;
|
||||
};
|
||||
};
|
||||
@ -634,6 +658,15 @@ &sdmmc2 {
|
||||
pinctrl-0 = <&pinctrl_sdmmc2_default>;
|
||||
};
|
||||
|
||||
&shdwc {
|
||||
atmel,shdwc-debouncer = <976>;
|
||||
status = "okay";
|
||||
|
||||
input@0 {
|
||||
reg = <0>;
|
||||
};
|
||||
};
|
||||
|
||||
&spdifrx {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_spdifrx_default>;
|
||||
|
@ -56,6 +56,7 @@ eth {
|
||||
panel {
|
||||
compatible = "edt,etm0700g0dh6";
|
||||
pinctrl-0 = <&pinctrl_display_gpio>;
|
||||
pinctrl-names = "default";
|
||||
enable-gpios = <&gpio6 0 GPIO_ACTIVE_HIGH>;
|
||||
|
||||
port {
|
||||
@ -76,8 +77,7 @@ reg_usbh1_vbus: regulator-usbh1-vbus {
|
||||
regulator-name = "vbus";
|
||||
regulator-min-microvolt = <5000000>;
|
||||
regulator-max-microvolt = <5000000>;
|
||||
gpio = <&gpio1 2 GPIO_ACTIVE_HIGH>;
|
||||
enable-active-high;
|
||||
gpio = <&gpio1 2 0>;
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -5,6 +5,7 @@
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
#include <dt-bindings/interrupt-controller/irq.h>
|
||||
#include <dt-bindings/input/input.h>
|
||||
#include <dt-bindings/leds/common.h>
|
||||
#include <dt-bindings/pwm/pwm.h>
|
||||
|
||||
/ {
|
||||
@ -277,6 +278,7 @@ chan@0 {
|
||||
led-cur = /bits/ 8 <0x20>;
|
||||
max-cur = /bits/ 8 <0x60>;
|
||||
reg = <0>;
|
||||
color = <LED_COLOR_ID_RED>;
|
||||
};
|
||||
|
||||
chan@1 {
|
||||
@ -284,6 +286,7 @@ chan@1 {
|
||||
led-cur = /bits/ 8 <0x20>;
|
||||
max-cur = /bits/ 8 <0x60>;
|
||||
reg = <1>;
|
||||
color = <LED_COLOR_ID_GREEN>;
|
||||
};
|
||||
|
||||
chan@2 {
|
||||
@ -291,6 +294,7 @@ chan@2 {
|
||||
led-cur = /bits/ 8 <0x20>;
|
||||
max-cur = /bits/ 8 <0x60>;
|
||||
reg = <2>;
|
||||
color = <LED_COLOR_ID_BLUE>;
|
||||
};
|
||||
|
||||
chan@3 {
|
||||
@ -298,6 +302,7 @@ chan@3 {
|
||||
led-cur = /bits/ 8 <0x0>;
|
||||
max-cur = /bits/ 8 <0x0>;
|
||||
reg = <3>;
|
||||
color = <LED_COLOR_ID_WHITE>;
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -176,7 +176,18 @@ &fec {
|
||||
pinctrl-0 = <&pinctrl_enet>;
|
||||
phy-mode = "rgmii-id";
|
||||
phy-reset-gpios = <&gpio1 26 GPIO_ACTIVE_LOW>;
|
||||
phy-handle = <&phy>;
|
||||
status = "okay";
|
||||
|
||||
mdio {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
phy: ethernet-phy@1 {
|
||||
reg = <1>;
|
||||
qca,clk-out-frequency = <125000000>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&hdmi {
|
||||
|
@ -114,7 +114,7 @@ flash0: n25q256a@0 {
|
||||
compatible = "micron,n25q256a", "jedec,spi-nor";
|
||||
spi-max-frequency = <29000000>;
|
||||
spi-rx-bus-width = <4>;
|
||||
spi-tx-bus-width = <4>;
|
||||
spi-tx-bus-width = <1>;
|
||||
reg = <0>;
|
||||
};
|
||||
|
||||
@ -124,7 +124,7 @@ flash1: n25q256a@2 {
|
||||
compatible = "micron,n25q256a", "jedec,spi-nor";
|
||||
spi-max-frequency = <29000000>;
|
||||
spi-rx-bus-width = <4>;
|
||||
spi-tx-bus-width = <4>;
|
||||
spi-tx-bus-width = <1>;
|
||||
reg = <2>;
|
||||
};
|
||||
};
|
||||
|
@ -292,7 +292,7 @@ flash0: n25q256a@0 {
|
||||
compatible = "micron,n25q256a", "jedec,spi-nor";
|
||||
spi-max-frequency = <29000000>;
|
||||
spi-rx-bus-width = <4>;
|
||||
spi-tx-bus-width = <4>;
|
||||
spi-tx-bus-width = <1>;
|
||||
reg = <0>;
|
||||
};
|
||||
};
|
||||
|
@ -101,7 +101,7 @@ partition@280000 {
|
||||
|
||||
nand@1,0 {
|
||||
compatible = "ti,omap2-nand";
|
||||
reg = <0 0 4>; /* CS0, offset 0, IO size 4 */
|
||||
reg = <1 0 4>; /* CS1, offset 0, IO size 4 */
|
||||
interrupt-parent = <&gpmc>;
|
||||
interrupts = <0 IRQ_TYPE_NONE>, /* fifoevent */
|
||||
<1 IRQ_TYPE_NONE>; /* termcount */
|
||||
|
@ -198,7 +198,7 @@ cxo_board: cxo_board {
|
||||
clock-frequency = <19200000>;
|
||||
};
|
||||
|
||||
pxo_board {
|
||||
pxo_board: pxo_board {
|
||||
compatible = "fixed-clock";
|
||||
#clock-cells = <0>;
|
||||
clock-frequency = <27000000>;
|
||||
@ -1148,22 +1148,21 @@ tcsr: syscon@1a400000 {
|
||||
};
|
||||
|
||||
gpu: adreno-3xx@4300000 {
|
||||
compatible = "qcom,adreno-3xx";
|
||||
compatible = "qcom,adreno-320.2", "qcom,adreno";
|
||||
reg = <0x04300000 0x20000>;
|
||||
reg-names = "kgsl_3d0_reg_memory";
|
||||
interrupts = <GIC_SPI 80 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-names = "kgsl_3d0_irq";
|
||||
clock-names =
|
||||
"core_clk",
|
||||
"iface_clk",
|
||||
"mem_clk",
|
||||
"mem_iface_clk";
|
||||
"core",
|
||||
"iface",
|
||||
"mem",
|
||||
"mem_iface";
|
||||
clocks =
|
||||
<&mmcc GFX3D_CLK>,
|
||||
<&mmcc GFX3D_AHB_CLK>,
|
||||
<&mmcc GFX3D_AXI_CLK>,
|
||||
<&mmcc MMSS_IMEM_AHB_CLK>;
|
||||
qcom,chipid = <0x03020002>;
|
||||
|
||||
iommus = <&gfx3d 0
|
||||
&gfx3d 1
|
||||
@ -1306,7 +1305,7 @@ dsi0_phy: dsi-phy@4700200 {
|
||||
reg-names = "dsi_pll", "dsi_phy", "dsi_phy_regulator";
|
||||
clock-names = "iface_clk", "ref";
|
||||
clocks = <&mmcc DSI_M_AHB_CLK>,
|
||||
<&cxo_board>;
|
||||
<&pxo_board>;
|
||||
};
|
||||
|
||||
|
||||
|
@ -75,6 +75,17 @@ soc {
|
||||
#size-cells = <1>;
|
||||
ranges;
|
||||
|
||||
securam: securam@e0000000 {
|
||||
compatible = "microchip,sama7g5-securam", "atmel,sama5d2-securam", "mmio-sram";
|
||||
reg = <0xe0000000 0x4000>;
|
||||
clocks = <&pmc PMC_TYPE_PERIPHERAL 18>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges = <0 0xe0000000 0x4000>;
|
||||
no-memory-wc;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
secumod: secumod@e0004000 {
|
||||
compatible = "microchip,sama7g5-secumod", "atmel,sama5d2-secumod", "syscon";
|
||||
reg = <0xe0004000 0x4000>;
|
||||
@ -111,6 +122,17 @@ pmc: pmc@e0018000 {
|
||||
clock-names = "td_slck", "md_slck", "main_xtal";
|
||||
};
|
||||
|
||||
shdwc: shdwc@e001d010 {
|
||||
compatible = "microchip,sama7g5-shdwc", "syscon";
|
||||
reg = <0xe001d010 0x10>;
|
||||
clocks = <&clk32k 0>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
atmel,wakeup-rtc-timer;
|
||||
atmel,wakeup-rtt-timer;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
rtt: rtt@e001d020 {
|
||||
compatible = "microchip,sama7g5-rtt", "microchip,sam9x60-rtt", "atmel,at91sam9260-rtt";
|
||||
reg = <0xe001d020 0x30>;
|
||||
@ -137,6 +159,11 @@ ps_wdt: watchdog@e001d180 {
|
||||
clocks = <&clk32k 0>;
|
||||
};
|
||||
|
||||
chipid@e0020000 {
|
||||
compatible = "microchip,sama7g5-chipid";
|
||||
reg = <0xe0020000 0x8>;
|
||||
};
|
||||
|
||||
sdmmc0: mmc@e1204000 {
|
||||
compatible = "microchip,sama7g5-sdhci", "microchip,sam9x60-sdhci";
|
||||
reg = <0xe1204000 0x4000>;
|
||||
@ -515,6 +542,18 @@ spi11: spi@400 {
|
||||
};
|
||||
};
|
||||
|
||||
uddrc: uddrc@e3800000 {
|
||||
compatible = "microchip,sama7g5-uddrc";
|
||||
reg = <0xe3800000 0x4000>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
ddr3phy: ddr3phy@e3804000 {
|
||||
compatible = "microchip,sama7g5-ddr3phy";
|
||||
reg = <0xe3804000 0x1000>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
gic: interrupt-controller@e8c11000 {
|
||||
compatible = "arm,cortex-a7-gic";
|
||||
#interrupt-cells = <3>;
|
||||
|
@ -17,6 +17,7 @@
|
||||
* TAKE CARE WHEN MAINTAINING THIS FILE TO PROPAGATE ANY RELEVANT
|
||||
* CHANGES TO vexpress-v2m.dtsi!
|
||||
*/
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
|
||||
/ {
|
||||
v2m_fixed_3v3: fixed-regulator-0 {
|
||||
@ -101,16 +102,68 @@ led-8 {
|
||||
};
|
||||
|
||||
bus@8000000 {
|
||||
motherboard-bus {
|
||||
model = "V2M-P1";
|
||||
compatible = "simple-bus";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-map-mask = <0 63>;
|
||||
interrupt-map = <0 0 &gic GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 1 &gic GIC_SPI 1 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 2 &gic GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 3 &gic GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 4 &gic GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 5 &gic GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 6 &gic GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 7 &gic GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 8 &gic GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 9 &gic GIC_SPI 9 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 10 &gic GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 11 &gic GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 12 &gic GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 13 &gic GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 14 &gic GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 15 &gic GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 16 &gic GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 17 &gic GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 18 &gic GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 19 &gic GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 20 &gic GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 21 &gic GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 22 &gic GIC_SPI 22 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 23 &gic GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 24 &gic GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 25 &gic GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 26 &gic GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 27 &gic GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 28 &gic GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 29 &gic GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 30 &gic GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 31 &gic GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 32 &gic GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 33 &gic GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 34 &gic GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 35 &gic GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 36 &gic GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 37 &gic GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 38 &gic GIC_SPI 38 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 39 &gic GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 40 &gic GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 41 &gic GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 42 &gic GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH>;
|
||||
|
||||
motherboard-bus@8000000 {
|
||||
arm,hbi = <0x190>;
|
||||
arm,vexpress,site = <0>;
|
||||
arm,v2m-memory-map = "rs1";
|
||||
compatible = "arm,vexpress,v2m-p1", "simple-bus";
|
||||
#address-cells = <2>; /* SMB chipselect number and offset */
|
||||
#size-cells = <1>;
|
||||
#interrupt-cells = <1>;
|
||||
ranges;
|
||||
ranges = <0 0 0x08000000 0x04000000>,
|
||||
<1 0 0x14000000 0x04000000>,
|
||||
<2 0 0x18000000 0x04000000>,
|
||||
<3 0 0x1c000000 0x04000000>,
|
||||
<4 0 0x0c000000 0x04000000>,
|
||||
<5 0 0x10000000 0x04000000>;
|
||||
|
||||
nor_flash: flash@0 {
|
||||
compatible = "arm,vexpress-flash", "cfi-flash";
|
||||
@ -215,7 +268,7 @@ aaci@40000 {
|
||||
clock-names = "apb_pclk";
|
||||
};
|
||||
|
||||
mmci@50000 {
|
||||
mmc@50000 {
|
||||
compatible = "arm,pl180", "arm,primecell";
|
||||
reg = <0x050000 0x1000>;
|
||||
interrupts = <9>, <10>;
|
||||
@ -275,7 +328,7 @@ v2m_serial3: serial@c0000 {
|
||||
clock-names = "uartclk", "apb_pclk";
|
||||
};
|
||||
|
||||
wdt@f0000 {
|
||||
watchdog@f0000 {
|
||||
compatible = "arm,sp805", "arm,primecell";
|
||||
reg = <0x0f0000 0x1000>;
|
||||
interrupts = <0>;
|
||||
|
@ -17,18 +17,73 @@
|
||||
* TAKE CARE WHEN MAINTAINING THIS FILE TO PROPAGATE ANY RELEVANT
|
||||
* CHANGES TO vexpress-v2m-rs1.dtsi!
|
||||
*/
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
|
||||
/ {
|
||||
bus@4000000 {
|
||||
motherboard {
|
||||
model = "V2M-P1";
|
||||
bus@40000000 {
|
||||
compatible = "simple-bus";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges = <0x40000000 0x40000000 0x10000000>,
|
||||
<0x10000000 0x10000000 0x00020000>;
|
||||
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-map-mask = <0 63>;
|
||||
interrupt-map = <0 0 &gic GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 1 &gic GIC_SPI 1 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 2 &gic GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 3 &gic GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 4 &gic GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 5 &gic GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 6 &gic GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 7 &gic GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 8 &gic GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 9 &gic GIC_SPI 9 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 10 &gic GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 11 &gic GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 12 &gic GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 13 &gic GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 14 &gic GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 15 &gic GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 16 &gic GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 17 &gic GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 18 &gic GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 19 &gic GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 20 &gic GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 21 &gic GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 22 &gic GIC_SPI 22 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 23 &gic GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 24 &gic GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 25 &gic GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 26 &gic GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 27 &gic GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 28 &gic GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 29 &gic GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 30 &gic GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 31 &gic GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 32 &gic GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 33 &gic GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 34 &gic GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 35 &gic GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 36 &gic GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 37 &gic GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 38 &gic GIC_SPI 38 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 39 &gic GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 40 &gic GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 41 &gic GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 42 &gic GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH>;
|
||||
|
||||
motherboard-bus@40000000 {
|
||||
arm,hbi = <0x190>;
|
||||
arm,vexpress,site = <0>;
|
||||
compatible = "arm,vexpress,v2m-p1", "simple-bus";
|
||||
#address-cells = <2>; /* SMB chipselect number and offset */
|
||||
#size-cells = <1>;
|
||||
#interrupt-cells = <1>;
|
||||
ranges;
|
||||
ranges = <0 0 0x40000000 0x04000000>,
|
||||
<1 0 0x44000000 0x04000000>,
|
||||
<2 0 0x48000000 0x04000000>,
|
||||
<3 0 0x4c000000 0x04000000>,
|
||||
<7 0 0x10000000 0x00020000>;
|
||||
|
||||
flash@0,00000000 {
|
||||
compatible = "arm,vexpress-flash", "cfi-flash";
|
||||
|
@ -237,62 +237,7 @@ energy {
|
||||
};
|
||||
|
||||
bus@8000000 {
|
||||
compatible = "simple-bus";
|
||||
|
||||
#address-cells = <2>;
|
||||
#size-cells = <1>;
|
||||
ranges = <0 0 0 0x08000000 0x04000000>,
|
||||
<1 0 0 0x14000000 0x04000000>,
|
||||
<2 0 0 0x18000000 0x04000000>,
|
||||
<3 0 0 0x1c000000 0x04000000>,
|
||||
<4 0 0 0x0c000000 0x04000000>,
|
||||
<5 0 0 0x10000000 0x04000000>;
|
||||
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-map-mask = <0 0 63>;
|
||||
interrupt-map = <0 0 0 &gic 0 0 4>,
|
||||
<0 0 1 &gic 0 1 4>,
|
||||
<0 0 2 &gic 0 2 4>,
|
||||
<0 0 3 &gic 0 3 4>,
|
||||
<0 0 4 &gic 0 4 4>,
|
||||
<0 0 5 &gic 0 5 4>,
|
||||
<0 0 6 &gic 0 6 4>,
|
||||
<0 0 7 &gic 0 7 4>,
|
||||
<0 0 8 &gic 0 8 4>,
|
||||
<0 0 9 &gic 0 9 4>,
|
||||
<0 0 10 &gic 0 10 4>,
|
||||
<0 0 11 &gic 0 11 4>,
|
||||
<0 0 12 &gic 0 12 4>,
|
||||
<0 0 13 &gic 0 13 4>,
|
||||
<0 0 14 &gic 0 14 4>,
|
||||
<0 0 15 &gic 0 15 4>,
|
||||
<0 0 16 &gic 0 16 4>,
|
||||
<0 0 17 &gic 0 17 4>,
|
||||
<0 0 18 &gic 0 18 4>,
|
||||
<0 0 19 &gic 0 19 4>,
|
||||
<0 0 20 &gic 0 20 4>,
|
||||
<0 0 21 &gic 0 21 4>,
|
||||
<0 0 22 &gic 0 22 4>,
|
||||
<0 0 23 &gic 0 23 4>,
|
||||
<0 0 24 &gic 0 24 4>,
|
||||
<0 0 25 &gic 0 25 4>,
|
||||
<0 0 26 &gic 0 26 4>,
|
||||
<0 0 27 &gic 0 27 4>,
|
||||
<0 0 28 &gic 0 28 4>,
|
||||
<0 0 29 &gic 0 29 4>,
|
||||
<0 0 30 &gic 0 30 4>,
|
||||
<0 0 31 &gic 0 31 4>,
|
||||
<0 0 32 &gic 0 32 4>,
|
||||
<0 0 33 &gic 0 33 4>,
|
||||
<0 0 34 &gic 0 34 4>,
|
||||
<0 0 35 &gic 0 35 4>,
|
||||
<0 0 36 &gic 0 36 4>,
|
||||
<0 0 37 &gic 0 37 4>,
|
||||
<0 0 38 &gic 0 38 4>,
|
||||
<0 0 39 &gic 0 39 4>,
|
||||
<0 0 40 &gic 0 40 4>,
|
||||
<0 0 41 &gic 0 41 4>,
|
||||
<0 0 42 &gic 0 42 4>;
|
||||
ranges = <0x8000000 0 0x8000000 0x18000000>;
|
||||
};
|
||||
|
||||
site2: hsb@40000000 {
|
||||
|
@ -609,62 +609,7 @@ etm2_out_port: endpoint {
|
||||
};
|
||||
|
||||
smb: bus@8000000 {
|
||||
compatible = "simple-bus";
|
||||
|
||||
#address-cells = <2>;
|
||||
#size-cells = <1>;
|
||||
ranges = <0 0 0 0x08000000 0x04000000>,
|
||||
<1 0 0 0x14000000 0x04000000>,
|
||||
<2 0 0 0x18000000 0x04000000>,
|
||||
<3 0 0 0x1c000000 0x04000000>,
|
||||
<4 0 0 0x0c000000 0x04000000>,
|
||||
<5 0 0 0x10000000 0x04000000>;
|
||||
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-map-mask = <0 0 63>;
|
||||
interrupt-map = <0 0 0 &gic 0 0 4>,
|
||||
<0 0 1 &gic 0 1 4>,
|
||||
<0 0 2 &gic 0 2 4>,
|
||||
<0 0 3 &gic 0 3 4>,
|
||||
<0 0 4 &gic 0 4 4>,
|
||||
<0 0 5 &gic 0 5 4>,
|
||||
<0 0 6 &gic 0 6 4>,
|
||||
<0 0 7 &gic 0 7 4>,
|
||||
<0 0 8 &gic 0 8 4>,
|
||||
<0 0 9 &gic 0 9 4>,
|
||||
<0 0 10 &gic 0 10 4>,
|
||||
<0 0 11 &gic 0 11 4>,
|
||||
<0 0 12 &gic 0 12 4>,
|
||||
<0 0 13 &gic 0 13 4>,
|
||||
<0 0 14 &gic 0 14 4>,
|
||||
<0 0 15 &gic 0 15 4>,
|
||||
<0 0 16 &gic 0 16 4>,
|
||||
<0 0 17 &gic 0 17 4>,
|
||||
<0 0 18 &gic 0 18 4>,
|
||||
<0 0 19 &gic 0 19 4>,
|
||||
<0 0 20 &gic 0 20 4>,
|
||||
<0 0 21 &gic 0 21 4>,
|
||||
<0 0 22 &gic 0 22 4>,
|
||||
<0 0 23 &gic 0 23 4>,
|
||||
<0 0 24 &gic 0 24 4>,
|
||||
<0 0 25 &gic 0 25 4>,
|
||||
<0 0 26 &gic 0 26 4>,
|
||||
<0 0 27 &gic 0 27 4>,
|
||||
<0 0 28 &gic 0 28 4>,
|
||||
<0 0 29 &gic 0 29 4>,
|
||||
<0 0 30 &gic 0 30 4>,
|
||||
<0 0 31 &gic 0 31 4>,
|
||||
<0 0 32 &gic 0 32 4>,
|
||||
<0 0 33 &gic 0 33 4>,
|
||||
<0 0 34 &gic 0 34 4>,
|
||||
<0 0 35 &gic 0 35 4>,
|
||||
<0 0 36 &gic 0 36 4>,
|
||||
<0 0 37 &gic 0 37 4>,
|
||||
<0 0 38 &gic 0 38 4>,
|
||||
<0 0 39 &gic 0 39 4>,
|
||||
<0 0 40 &gic 0 40 4>,
|
||||
<0 0 41 &gic 0 41 4>,
|
||||
<0 0 42 &gic 0 42 4>;
|
||||
ranges = <0x8000000 0 0x8000000 0x18000000>;
|
||||
};
|
||||
|
||||
site2: hsb@40000000 {
|
||||
|
@ -207,62 +207,7 @@ temp-dcc {
|
||||
};
|
||||
|
||||
smb: bus@8000000 {
|
||||
compatible = "simple-bus";
|
||||
|
||||
#address-cells = <2>;
|
||||
#size-cells = <1>;
|
||||
ranges = <0 0 0x08000000 0x04000000>,
|
||||
<1 0 0x14000000 0x04000000>,
|
||||
<2 0 0x18000000 0x04000000>,
|
||||
<3 0 0x1c000000 0x04000000>,
|
||||
<4 0 0x0c000000 0x04000000>,
|
||||
<5 0 0x10000000 0x04000000>;
|
||||
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-map-mask = <0 0 63>;
|
||||
interrupt-map = <0 0 0 &gic 0 0 4>,
|
||||
<0 0 1 &gic 0 1 4>,
|
||||
<0 0 2 &gic 0 2 4>,
|
||||
<0 0 3 &gic 0 3 4>,
|
||||
<0 0 4 &gic 0 4 4>,
|
||||
<0 0 5 &gic 0 5 4>,
|
||||
<0 0 6 &gic 0 6 4>,
|
||||
<0 0 7 &gic 0 7 4>,
|
||||
<0 0 8 &gic 0 8 4>,
|
||||
<0 0 9 &gic 0 9 4>,
|
||||
<0 0 10 &gic 0 10 4>,
|
||||
<0 0 11 &gic 0 11 4>,
|
||||
<0 0 12 &gic 0 12 4>,
|
||||
<0 0 13 &gic 0 13 4>,
|
||||
<0 0 14 &gic 0 14 4>,
|
||||
<0 0 15 &gic 0 15 4>,
|
||||
<0 0 16 &gic 0 16 4>,
|
||||
<0 0 17 &gic 0 17 4>,
|
||||
<0 0 18 &gic 0 18 4>,
|
||||
<0 0 19 &gic 0 19 4>,
|
||||
<0 0 20 &gic 0 20 4>,
|
||||
<0 0 21 &gic 0 21 4>,
|
||||
<0 0 22 &gic 0 22 4>,
|
||||
<0 0 23 &gic 0 23 4>,
|
||||
<0 0 24 &gic 0 24 4>,
|
||||
<0 0 25 &gic 0 25 4>,
|
||||
<0 0 26 &gic 0 26 4>,
|
||||
<0 0 27 &gic 0 27 4>,
|
||||
<0 0 28 &gic 0 28 4>,
|
||||
<0 0 29 &gic 0 29 4>,
|
||||
<0 0 30 &gic 0 30 4>,
|
||||
<0 0 31 &gic 0 31 4>,
|
||||
<0 0 32 &gic 0 32 4>,
|
||||
<0 0 33 &gic 0 33 4>,
|
||||
<0 0 34 &gic 0 34 4>,
|
||||
<0 0 35 &gic 0 35 4>,
|
||||
<0 0 36 &gic 0 36 4>,
|
||||
<0 0 37 &gic 0 37 4>,
|
||||
<0 0 38 &gic 0 38 4>,
|
||||
<0 0 39 &gic 0 39 4>,
|
||||
<0 0 40 &gic 0 40 4>,
|
||||
<0 0 41 &gic 0 41 4>,
|
||||
<0 0 42 &gic 0 42 4>;
|
||||
ranges = <0 0x8000000 0x18000000>;
|
||||
};
|
||||
|
||||
site2: hsb@40000000 {
|
||||
|
@ -295,64 +295,6 @@ power-vd10-s3 {
|
||||
};
|
||||
};
|
||||
|
||||
smb: bus@4000000 {
|
||||
compatible = "simple-bus";
|
||||
|
||||
#address-cells = <2>;
|
||||
#size-cells = <1>;
|
||||
ranges = <0 0 0x40000000 0x04000000>,
|
||||
<1 0 0x44000000 0x04000000>,
|
||||
<2 0 0x48000000 0x04000000>,
|
||||
<3 0 0x4c000000 0x04000000>,
|
||||
<7 0 0x10000000 0x00020000>;
|
||||
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-map-mask = <0 0 63>;
|
||||
interrupt-map = <0 0 0 &gic 0 0 4>,
|
||||
<0 0 1 &gic 0 1 4>,
|
||||
<0 0 2 &gic 0 2 4>,
|
||||
<0 0 3 &gic 0 3 4>,
|
||||
<0 0 4 &gic 0 4 4>,
|
||||
<0 0 5 &gic 0 5 4>,
|
||||
<0 0 6 &gic 0 6 4>,
|
||||
<0 0 7 &gic 0 7 4>,
|
||||
<0 0 8 &gic 0 8 4>,
|
||||
<0 0 9 &gic 0 9 4>,
|
||||
<0 0 10 &gic 0 10 4>,
|
||||
<0 0 11 &gic 0 11 4>,
|
||||
<0 0 12 &gic 0 12 4>,
|
||||
<0 0 13 &gic 0 13 4>,
|
||||
<0 0 14 &gic 0 14 4>,
|
||||
<0 0 15 &gic 0 15 4>,
|
||||
<0 0 16 &gic 0 16 4>,
|
||||
<0 0 17 &gic 0 17 4>,
|
||||
<0 0 18 &gic 0 18 4>,
|
||||
<0 0 19 &gic 0 19 4>,
|
||||
<0 0 20 &gic 0 20 4>,
|
||||
<0 0 21 &gic 0 21 4>,
|
||||
<0 0 22 &gic 0 22 4>,
|
||||
<0 0 23 &gic 0 23 4>,
|
||||
<0 0 24 &gic 0 24 4>,
|
||||
<0 0 25 &gic 0 25 4>,
|
||||
<0 0 26 &gic 0 26 4>,
|
||||
<0 0 27 &gic 0 27 4>,
|
||||
<0 0 28 &gic 0 28 4>,
|
||||
<0 0 29 &gic 0 29 4>,
|
||||
<0 0 30 &gic 0 30 4>,
|
||||
<0 0 31 &gic 0 31 4>,
|
||||
<0 0 32 &gic 0 32 4>,
|
||||
<0 0 33 &gic 0 33 4>,
|
||||
<0 0 34 &gic 0 34 4>,
|
||||
<0 0 35 &gic 0 35 4>,
|
||||
<0 0 36 &gic 0 36 4>,
|
||||
<0 0 37 &gic 0 37 4>,
|
||||
<0 0 38 &gic 0 38 4>,
|
||||
<0 0 39 &gic 0 39 4>,
|
||||
<0 0 40 &gic 0 40 4>,
|
||||
<0 0 41 &gic 0 41 4>,
|
||||
<0 0 42 &gic 0 42 4>;
|
||||
};
|
||||
|
||||
site2: hsb@e0000000 {
|
||||
compatible = "simple-bus";
|
||||
#address-cells = <1>;
|
||||
|
@ -40,7 +40,9 @@ EXPORT_SYMBOL(sharpsl_param);
|
||||
|
||||
void sharpsl_save_param(void)
|
||||
{
|
||||
memcpy(&sharpsl_param, param_start(PARAM_BASE), sizeof(struct sharpsl_param_info));
|
||||
struct sharpsl_param_info *params = param_start(PARAM_BASE);
|
||||
|
||||
memcpy(&sharpsl_param, params, sizeof(*params));
|
||||
|
||||
if (sharpsl_param.comadj_keyword != COMADJ_MAGIC)
|
||||
sharpsl_param.comadj=-1;
|
||||
|
@ -76,6 +76,7 @@ CONFIG_REGULATOR_FIXED_VOLTAGE=y
|
||||
CONFIG_DRM=y
|
||||
CONFIG_DRM_PANEL_ILITEK_IL9322=y
|
||||
CONFIG_DRM_TVE200=y
|
||||
CONFIG_FB=y
|
||||
CONFIG_LOGO=y
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_MON=y
|
||||
|
@ -292,6 +292,7 @@ CONFIG_DRM_IMX_LDB=y
|
||||
CONFIG_DRM_IMX_HDMI=y
|
||||
CONFIG_DRM_ETNAVIV=y
|
||||
CONFIG_DRM_MXSFB=y
|
||||
CONFIG_FB=y
|
||||
CONFIG_FB_MODE_HELPERS=y
|
||||
CONFIG_LCD_CLASS_DEVICE=y
|
||||
CONFIG_LCD_L4F00242T03=y
|
||||
|
@ -456,6 +456,7 @@ CONFIG_PINCTRL_STMFX=y
|
||||
CONFIG_PINCTRL_PALMAS=y
|
||||
CONFIG_PINCTRL_OWL=y
|
||||
CONFIG_PINCTRL_S500=y
|
||||
CONFIG_PINCTRL_MSM=y
|
||||
CONFIG_PINCTRL_APQ8064=y
|
||||
CONFIG_PINCTRL_APQ8084=y
|
||||
CONFIG_PINCTRL_IPQ8064=y
|
||||
@ -725,6 +726,7 @@ CONFIG_DRM_PL111=m
|
||||
CONFIG_DRM_LIMA=m
|
||||
CONFIG_DRM_PANFROST=m
|
||||
CONFIG_DRM_ASPEED_GFX=m
|
||||
CONFIG_FB=y
|
||||
CONFIG_FB_EFI=y
|
||||
CONFIG_FB_WM8505=y
|
||||
CONFIG_FB_SH_MOBILE_LCDC=y
|
||||
@ -1122,6 +1124,7 @@ CONFIG_PHY_DM816X_USB=m
|
||||
CONFIG_OMAP_USB2=y
|
||||
CONFIG_TI_PIPE3=y
|
||||
CONFIG_TWL4030_USB=m
|
||||
CONFIG_RAS=y
|
||||
CONFIG_NVMEM_IMX_OCOTP=y
|
||||
CONFIG_ROCKCHIP_EFUSE=m
|
||||
CONFIG_NVMEM_SUNXI_SID=y
|
||||
|
@ -47,12 +47,26 @@ struct at91_pm_bu {
|
||||
unsigned long ddr_phy_calibration[BACKUP_DDR_PHY_CALIBRATION];
|
||||
};
|
||||
|
||||
/*
|
||||
* struct at91_pm_sfrbu_offsets: registers mapping for SFRBU
|
||||
* @pswbu: power switch BU control registers
|
||||
*/
|
||||
struct at91_pm_sfrbu_regs {
|
||||
struct {
|
||||
u32 key;
|
||||
u32 ctrl;
|
||||
u32 state;
|
||||
u32 softsw;
|
||||
} pswbu;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct at91_soc_pm - AT91 SoC power management data structure
|
||||
* @config_shdwc_ws: wakeup sources configuration function for SHDWC
|
||||
* @config_pmc_ws: wakeup srouces configuration function for PMC
|
||||
* @ws_ids: wakup sources of_device_id array
|
||||
* @data: PM data to be used on last phase of suspend
|
||||
* @sfrbu_regs: SFRBU registers mapping
|
||||
* @bu: backup unit mapped data (for backup mode)
|
||||
* @memcs: memory chip select
|
||||
*/
|
||||
@ -62,6 +76,7 @@ struct at91_soc_pm {
|
||||
const struct of_device_id *ws_ids;
|
||||
struct at91_pm_bu *bu;
|
||||
struct at91_pm_data data;
|
||||
struct at91_pm_sfrbu_regs sfrbu_regs;
|
||||
void *memcs;
|
||||
};
|
||||
|
||||
@ -356,9 +371,36 @@ static int at91_suspend_finish(unsigned long val)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void at91_pm_switch_ba_to_vbat(void)
|
||||
{
|
||||
unsigned int offset = offsetof(struct at91_pm_sfrbu_regs, pswbu);
|
||||
unsigned int val;
|
||||
|
||||
/* Just for safety. */
|
||||
if (!soc_pm.data.sfrbu)
|
||||
return;
|
||||
|
||||
val = readl(soc_pm.data.sfrbu + offset);
|
||||
|
||||
/* Already on VBAT. */
|
||||
if (!(val & soc_pm.sfrbu_regs.pswbu.state))
|
||||
return;
|
||||
|
||||
val &= ~soc_pm.sfrbu_regs.pswbu.softsw;
|
||||
val |= soc_pm.sfrbu_regs.pswbu.key | soc_pm.sfrbu_regs.pswbu.ctrl;
|
||||
writel(val, soc_pm.data.sfrbu + offset);
|
||||
|
||||
/* Wait for update. */
|
||||
val = readl(soc_pm.data.sfrbu + offset);
|
||||
while (val & soc_pm.sfrbu_regs.pswbu.state)
|
||||
val = readl(soc_pm.data.sfrbu + offset);
|
||||
}
|
||||
|
||||
static void at91_pm_suspend(suspend_state_t state)
|
||||
{
|
||||
if (soc_pm.data.mode == AT91_PM_BACKUP) {
|
||||
at91_pm_switch_ba_to_vbat();
|
||||
|
||||
cpu_suspend(0, at91_suspend_finish);
|
||||
|
||||
/* The SRAM is lost between suspend cycles */
|
||||
@ -589,18 +631,22 @@ static const struct of_device_id ramc_phy_ids[] __initconst = {
|
||||
{ /* Sentinel. */ },
|
||||
};
|
||||
|
||||
static __init void at91_dt_ramc(bool phy_mandatory)
|
||||
static __init int at91_dt_ramc(bool phy_mandatory)
|
||||
{
|
||||
struct device_node *np;
|
||||
const struct of_device_id *of_id;
|
||||
int idx = 0;
|
||||
void *standby = NULL;
|
||||
const struct ramc_info *ramc;
|
||||
int ret;
|
||||
|
||||
for_each_matching_node_and_match(np, ramc_ids, &of_id) {
|
||||
soc_pm.data.ramc[idx] = of_iomap(np, 0);
|
||||
if (!soc_pm.data.ramc[idx])
|
||||
panic(pr_fmt("unable to map ramc[%d] cpu registers\n"), idx);
|
||||
if (!soc_pm.data.ramc[idx]) {
|
||||
pr_err("unable to map ramc[%d] cpu registers\n", idx);
|
||||
ret = -ENOMEM;
|
||||
goto unmap_ramc;
|
||||
}
|
||||
|
||||
ramc = of_id->data;
|
||||
if (ramc) {
|
||||
@ -612,25 +658,42 @@ static __init void at91_dt_ramc(bool phy_mandatory)
|
||||
idx++;
|
||||
}
|
||||
|
||||
if (!idx)
|
||||
panic(pr_fmt("unable to find compatible ram controller node in dtb\n"));
|
||||
if (!idx) {
|
||||
pr_err("unable to find compatible ram controller node in dtb\n");
|
||||
ret = -ENODEV;
|
||||
goto unmap_ramc;
|
||||
}
|
||||
|
||||
/* Lookup for DDR PHY node, if any. */
|
||||
for_each_matching_node_and_match(np, ramc_phy_ids, &of_id) {
|
||||
soc_pm.data.ramc_phy = of_iomap(np, 0);
|
||||
if (!soc_pm.data.ramc_phy)
|
||||
panic(pr_fmt("unable to map ramc phy cpu registers\n"));
|
||||
if (!soc_pm.data.ramc_phy) {
|
||||
pr_err("unable to map ramc phy cpu registers\n");
|
||||
ret = -ENOMEM;
|
||||
goto unmap_ramc;
|
||||
}
|
||||
}
|
||||
|
||||
if (phy_mandatory && !soc_pm.data.ramc_phy)
|
||||
panic(pr_fmt("DDR PHY is mandatory!\n"));
|
||||
if (phy_mandatory && !soc_pm.data.ramc_phy) {
|
||||
pr_err("DDR PHY is mandatory!\n");
|
||||
ret = -ENODEV;
|
||||
goto unmap_ramc;
|
||||
}
|
||||
|
||||
if (!standby) {
|
||||
pr_warn("ramc no standby function available\n");
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
|
||||
at91_cpuidle_device.dev.platform_data = standby;
|
||||
|
||||
return 0;
|
||||
|
||||
unmap_ramc:
|
||||
while (idx)
|
||||
iounmap(soc_pm.data.ramc[--idx]);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void at91rm9200_idle(void)
|
||||
@ -1017,6 +1080,8 @@ static void __init at91_pm_init(void (*pm_idle)(void))
|
||||
|
||||
void __init at91rm9200_pm_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!IS_ENABLED(CONFIG_SOC_AT91RM9200))
|
||||
return;
|
||||
|
||||
@ -1028,7 +1093,9 @@ void __init at91rm9200_pm_init(void)
|
||||
soc_pm.data.standby_mode = AT91_PM_STANDBY;
|
||||
soc_pm.data.suspend_mode = AT91_PM_ULP0;
|
||||
|
||||
at91_dt_ramc(false);
|
||||
ret = at91_dt_ramc(false);
|
||||
if (ret)
|
||||
return;
|
||||
|
||||
/*
|
||||
* AT91RM9200 SDRAM low-power mode cannot be used with self-refresh.
|
||||
@ -1046,13 +1113,17 @@ void __init sam9x60_pm_init(void)
|
||||
static const int iomaps[] __initconst = {
|
||||
[AT91_PM_ULP1] = AT91_PM_IOMAP(SHDWC),
|
||||
};
|
||||
int ret;
|
||||
|
||||
if (!IS_ENABLED(CONFIG_SOC_SAM9X60))
|
||||
return;
|
||||
|
||||
at91_pm_modes_validate(modes, ARRAY_SIZE(modes));
|
||||
at91_pm_modes_init(iomaps, ARRAY_SIZE(iomaps));
|
||||
at91_dt_ramc(false);
|
||||
ret = at91_dt_ramc(false);
|
||||
if (ret)
|
||||
return;
|
||||
|
||||
at91_pm_init(NULL);
|
||||
|
||||
soc_pm.ws_ids = sam9x60_ws_ids;
|
||||
@ -1061,6 +1132,8 @@ void __init sam9x60_pm_init(void)
|
||||
|
||||
void __init at91sam9_pm_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!IS_ENABLED(CONFIG_SOC_AT91SAM9))
|
||||
return;
|
||||
|
||||
@ -1072,7 +1145,10 @@ void __init at91sam9_pm_init(void)
|
||||
soc_pm.data.standby_mode = AT91_PM_STANDBY;
|
||||
soc_pm.data.suspend_mode = AT91_PM_ULP0;
|
||||
|
||||
at91_dt_ramc(false);
|
||||
ret = at91_dt_ramc(false);
|
||||
if (ret)
|
||||
return;
|
||||
|
||||
at91_pm_init(at91sam9_idle);
|
||||
}
|
||||
|
||||
@ -1081,12 +1157,16 @@ void __init sama5_pm_init(void)
|
||||
static const int modes[] __initconst = {
|
||||
AT91_PM_STANDBY, AT91_PM_ULP0, AT91_PM_ULP0_FAST,
|
||||
};
|
||||
int ret;
|
||||
|
||||
if (!IS_ENABLED(CONFIG_SOC_SAMA5))
|
||||
return;
|
||||
|
||||
at91_pm_modes_validate(modes, ARRAY_SIZE(modes));
|
||||
at91_dt_ramc(false);
|
||||
ret = at91_dt_ramc(false);
|
||||
if (ret)
|
||||
return;
|
||||
|
||||
at91_pm_init(NULL);
|
||||
}
|
||||
|
||||
@ -1101,18 +1181,27 @@ void __init sama5d2_pm_init(void)
|
||||
[AT91_PM_BACKUP] = AT91_PM_IOMAP(SHDWC) |
|
||||
AT91_PM_IOMAP(SFRBU),
|
||||
};
|
||||
int ret;
|
||||
|
||||
if (!IS_ENABLED(CONFIG_SOC_SAMA5D2))
|
||||
return;
|
||||
|
||||
at91_pm_modes_validate(modes, ARRAY_SIZE(modes));
|
||||
at91_pm_modes_init(iomaps, ARRAY_SIZE(iomaps));
|
||||
at91_dt_ramc(false);
|
||||
ret = at91_dt_ramc(false);
|
||||
if (ret)
|
||||
return;
|
||||
|
||||
at91_pm_init(NULL);
|
||||
|
||||
soc_pm.ws_ids = sama5d2_ws_ids;
|
||||
soc_pm.config_shdwc_ws = at91_sama5d2_config_shdwc_ws;
|
||||
soc_pm.config_pmc_ws = at91_sama5d2_config_pmc_ws;
|
||||
|
||||
soc_pm.sfrbu_regs.pswbu.key = (0x4BD20C << 8);
|
||||
soc_pm.sfrbu_regs.pswbu.ctrl = BIT(0);
|
||||
soc_pm.sfrbu_regs.pswbu.softsw = BIT(1);
|
||||
soc_pm.sfrbu_regs.pswbu.state = BIT(3);
|
||||
}
|
||||
|
||||
void __init sama7_pm_init(void)
|
||||
@ -1127,18 +1216,27 @@ void __init sama7_pm_init(void)
|
||||
[AT91_PM_BACKUP] = AT91_PM_IOMAP(SFRBU) |
|
||||
AT91_PM_IOMAP(SHDWC),
|
||||
};
|
||||
int ret;
|
||||
|
||||
if (!IS_ENABLED(CONFIG_SOC_SAMA7))
|
||||
return;
|
||||
|
||||
at91_pm_modes_validate(modes, ARRAY_SIZE(modes));
|
||||
|
||||
at91_dt_ramc(true);
|
||||
ret = at91_dt_ramc(true);
|
||||
if (ret)
|
||||
return;
|
||||
|
||||
at91_pm_modes_init(iomaps, ARRAY_SIZE(iomaps));
|
||||
at91_pm_init(NULL);
|
||||
|
||||
soc_pm.ws_ids = sama7g5_ws_ids;
|
||||
soc_pm.config_pmc_ws = at91_sam9x60_config_pmc_ws;
|
||||
|
||||
soc_pm.sfrbu_regs.pswbu.key = (0x4BD20C << 8);
|
||||
soc_pm.sfrbu_regs.pswbu.ctrl = BIT(0);
|
||||
soc_pm.sfrbu_regs.pswbu.softsw = BIT(1);
|
||||
soc_pm.sfrbu_regs.pswbu.state = BIT(2);
|
||||
}
|
||||
|
||||
static int __init at91_pm_modes_select(char *str)
|
||||
|
@ -1014,31 +1014,55 @@ ENTRY(at91_pm_suspend_in_sram)
|
||||
mov tmp1, #0
|
||||
mcr p15, 0, tmp1, c7, c10, 4
|
||||
|
||||
ldr tmp1, [r0, #PM_DATA_PMC]
|
||||
str tmp1, .pmc_base
|
||||
ldr tmp1, [r0, #PM_DATA_RAMC0]
|
||||
str tmp1, .sramc_base
|
||||
ldr tmp1, [r0, #PM_DATA_RAMC1]
|
||||
str tmp1, .sramc1_base
|
||||
ldr tmp1, [r0, #PM_DATA_RAMC_PHY]
|
||||
str tmp1, .sramc_phy_base
|
||||
ldr tmp1, [r0, #PM_DATA_MEMCTRL]
|
||||
str tmp1, .memtype
|
||||
ldr tmp1, [r0, #PM_DATA_MODE]
|
||||
str tmp1, .pm_mode
|
||||
/* Flush tlb. */
|
||||
mov r4, #0
|
||||
mcr p15, 0, r4, c8, c7, 0
|
||||
|
||||
ldr tmp1, [r0, #PM_DATA_PMC_MCKR_OFFSET]
|
||||
str tmp1, .mckr_offset
|
||||
ldr tmp1, [r0, #PM_DATA_PMC_VERSION]
|
||||
str tmp1, .pmc_version
|
||||
/* Both ldrne below are here to preload their address in the TLB */
|
||||
ldr tmp1, [r0, #PM_DATA_MEMCTRL]
|
||||
str tmp1, .memtype
|
||||
ldr tmp1, [r0, #PM_DATA_MODE]
|
||||
str tmp1, .pm_mode
|
||||
|
||||
/*
|
||||
* ldrne below are here to preload their address in the TLB as access
|
||||
* to RAM may be limited while in self-refresh.
|
||||
*/
|
||||
ldr tmp1, [r0, #PM_DATA_PMC]
|
||||
str tmp1, .pmc_base
|
||||
cmp tmp1, #0
|
||||
ldrne tmp2, [tmp1, #0]
|
||||
|
||||
ldr tmp1, [r0, #PM_DATA_RAMC0]
|
||||
str tmp1, .sramc_base
|
||||
cmp tmp1, #0
|
||||
ldrne tmp2, [tmp1, #0]
|
||||
|
||||
ldr tmp1, [r0, #PM_DATA_RAMC1]
|
||||
str tmp1, .sramc1_base
|
||||
cmp tmp1, #0
|
||||
ldrne tmp2, [tmp1, #0]
|
||||
|
||||
#ifndef CONFIG_SOC_SAM_V4_V5
|
||||
/* ldrne below are here to preload their address in the TLB */
|
||||
ldr tmp1, [r0, #PM_DATA_RAMC_PHY]
|
||||
str tmp1, .sramc_phy_base
|
||||
cmp tmp1, #0
|
||||
ldrne tmp2, [tmp1, #0]
|
||||
|
||||
ldr tmp1, [r0, #PM_DATA_SHDWC]
|
||||
str tmp1, .shdwc
|
||||
cmp tmp1, #0
|
||||
ldrne tmp2, [tmp1, #0]
|
||||
|
||||
ldr tmp1, [r0, #PM_DATA_SFRBU]
|
||||
str tmp1, .sfrbu
|
||||
cmp tmp1, #0
|
||||
ldrne tmp2, [tmp1, #0x10]
|
||||
#endif
|
||||
|
||||
/* Active the self-refresh mode */
|
||||
at91_sramc_self_refresh_ena
|
||||
|
@ -11,7 +11,7 @@
|
||||
|
||||
#define LSR_THRE 0x20
|
||||
|
||||
static void putc(const char c)
|
||||
static inline void putc(const char c)
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -24,7 +24,7 @@ static void putc(const char c)
|
||||
*UART_THR = c;
|
||||
}
|
||||
|
||||
static void flush(void)
|
||||
static inline void flush(void)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -172,6 +172,9 @@ static void __init imx6q_init_machine(void)
|
||||
imx_get_soc_revision());
|
||||
|
||||
imx6q_enet_phy_init();
|
||||
|
||||
of_platform_default_populate(NULL, NULL, NULL);
|
||||
|
||||
imx_anatop_init();
|
||||
cpu_is_imx6q() ? imx6q_pm_init() : imx6dl_pm_init();
|
||||
imx6q_1588_init();
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include <linux/io.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/genalloc.h>
|
||||
#include <linux/irqchip/arm-gic.h>
|
||||
#include <linux/mfd/syscon.h>
|
||||
#include <linux/mfd/syscon/imx6q-iomuxc-gpr.h>
|
||||
#include <linux/of.h>
|
||||
@ -619,6 +620,7 @@ static void __init imx6_pm_common_init(const struct imx6_pm_socdata
|
||||
|
||||
static void imx6_pm_stby_poweroff(void)
|
||||
{
|
||||
gic_cpu_if_down(0);
|
||||
imx6_set_lpm(STOP_POWER_OFF);
|
||||
imx6q_suspend_finish(0);
|
||||
|
||||
|
@ -9,16 +9,4 @@
|
||||
/* REVISIT: omap1 legacy drivers still rely on this */
|
||||
#include <mach/soc.h>
|
||||
|
||||
/*
|
||||
* Bus address is physical address, except for OMAP-1510 Local Bus.
|
||||
* OMAP-1510 bus address is translated into a Local Bus address if the
|
||||
* OMAP bus type is lbus. We do the address translation based on the
|
||||
* device overriding the defaults used in the dma-mapping API.
|
||||
*/
|
||||
|
||||
/*
|
||||
* OMAP-1510 Local Bus address offset
|
||||
*/
|
||||
#define OMAP1510_LB_OFFSET UL(0x30000000)
|
||||
|
||||
#endif
|
||||
|
@ -11,6 +11,7 @@
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/dma-map-ops.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#include <asm/irq.h>
|
||||
|
||||
@ -206,8 +207,6 @@ static inline void udc_device_init(struct omap_usb_config *pdata)
|
||||
|
||||
#endif
|
||||
|
||||
#if IS_ENABLED(CONFIG_USB_OHCI_HCD)
|
||||
|
||||
/* The dmamask must be set for OHCI to work */
|
||||
static u64 ohci_dmamask = ~(u32)0;
|
||||
|
||||
@ -236,20 +235,15 @@ static struct platform_device ohci_device = {
|
||||
|
||||
static inline void ohci_device_init(struct omap_usb_config *pdata)
|
||||
{
|
||||
if (!IS_ENABLED(CONFIG_USB_OHCI_HCD))
|
||||
return;
|
||||
|
||||
if (cpu_is_omap7xx())
|
||||
ohci_resources[1].start = INT_7XX_USB_HHC_1;
|
||||
pdata->ohci_device = &ohci_device;
|
||||
pdata->ocpi_enable = &ocpi_enable;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static inline void ohci_device_init(struct omap_usb_config *pdata)
|
||||
{
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_USB_OTG) && defined(CONFIG_ARCH_OMAP_OTG)
|
||||
|
||||
static struct resource otg_resources[] = {
|
||||
@ -534,6 +528,79 @@ static u32 __init omap1_usb2_init(unsigned nwires, unsigned alt_pingroup)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP15XX
|
||||
/* OMAP-1510 OHCI has its own MMU for DMA */
|
||||
#define OMAP1510_LB_MEMSIZE 32 /* Should be same as SDRAM size */
|
||||
#define OMAP1510_LB_CLOCK_DIV 0xfffec10c
|
||||
#define OMAP1510_LB_MMU_CTL 0xfffec208
|
||||
#define OMAP1510_LB_MMU_LCK 0xfffec224
|
||||
#define OMAP1510_LB_MMU_LD_TLB 0xfffec228
|
||||
#define OMAP1510_LB_MMU_CAM_H 0xfffec22c
|
||||
#define OMAP1510_LB_MMU_CAM_L 0xfffec230
|
||||
#define OMAP1510_LB_MMU_RAM_H 0xfffec234
|
||||
#define OMAP1510_LB_MMU_RAM_L 0xfffec238
|
||||
|
||||
/*
|
||||
* Bus address is physical address, except for OMAP-1510 Local Bus.
|
||||
* OMAP-1510 bus address is translated into a Local Bus address if the
|
||||
* OMAP bus type is lbus.
|
||||
*/
|
||||
#define OMAP1510_LB_OFFSET UL(0x30000000)
|
||||
|
||||
/*
|
||||
* OMAP-1510 specific Local Bus clock on/off
|
||||
*/
|
||||
static int omap_1510_local_bus_power(int on)
|
||||
{
|
||||
if (on) {
|
||||
omap_writel((1 << 1) | (1 << 0), OMAP1510_LB_MMU_CTL);
|
||||
udelay(200);
|
||||
} else {
|
||||
omap_writel(0, OMAP1510_LB_MMU_CTL);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* OMAP-1510 specific Local Bus initialization
|
||||
* NOTE: This assumes 32MB memory size in OMAP1510LB_MEMSIZE.
|
||||
* See also arch/mach-omap/memory.h for __virt_to_dma() and
|
||||
* __dma_to_virt() which need to match with the physical
|
||||
* Local Bus address below.
|
||||
*/
|
||||
static int omap_1510_local_bus_init(void)
|
||||
{
|
||||
unsigned int tlb;
|
||||
unsigned long lbaddr, physaddr;
|
||||
|
||||
omap_writel((omap_readl(OMAP1510_LB_CLOCK_DIV) & 0xfffffff8) | 0x4,
|
||||
OMAP1510_LB_CLOCK_DIV);
|
||||
|
||||
/* Configure the Local Bus MMU table */
|
||||
for (tlb = 0; tlb < OMAP1510_LB_MEMSIZE; tlb++) {
|
||||
lbaddr = tlb * 0x00100000 + OMAP1510_LB_OFFSET;
|
||||
physaddr = tlb * 0x00100000 + PHYS_OFFSET;
|
||||
omap_writel((lbaddr & 0x0fffffff) >> 22, OMAP1510_LB_MMU_CAM_H);
|
||||
omap_writel(((lbaddr & 0x003ffc00) >> 6) | 0xc,
|
||||
OMAP1510_LB_MMU_CAM_L);
|
||||
omap_writel(physaddr >> 16, OMAP1510_LB_MMU_RAM_H);
|
||||
omap_writel((physaddr & 0x0000fc00) | 0x300, OMAP1510_LB_MMU_RAM_L);
|
||||
omap_writel(tlb << 4, OMAP1510_LB_MMU_LCK);
|
||||
omap_writel(0x1, OMAP1510_LB_MMU_LD_TLB);
|
||||
}
|
||||
|
||||
/* Enable the walking table */
|
||||
omap_writel(omap_readl(OMAP1510_LB_MMU_CTL) | (1 << 3), OMAP1510_LB_MMU_CTL);
|
||||
udelay(200);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void omap_1510_local_bus_reset(void)
|
||||
{
|
||||
omap_1510_local_bus_power(1);
|
||||
omap_1510_local_bus_init();
|
||||
}
|
||||
|
||||
/* ULPD_DPLL_CTRL */
|
||||
#define DPLL_IOB (1 << 13)
|
||||
@ -543,25 +610,6 @@ static u32 __init omap1_usb2_init(unsigned nwires, unsigned alt_pingroup)
|
||||
/* ULPD_APLL_CTRL */
|
||||
#define APLL_NDPLL_SWITCH (1 << 0)
|
||||
|
||||
static int omap_1510_usb_ohci_notifier(struct notifier_block *nb,
|
||||
unsigned long event, void *data)
|
||||
{
|
||||
struct device *dev = data;
|
||||
|
||||
if (event != BUS_NOTIFY_ADD_DEVICE)
|
||||
return NOTIFY_DONE;
|
||||
|
||||
if (strncmp(dev_name(dev), "ohci", 4) == 0 &&
|
||||
dma_direct_set_offset(dev, PHYS_OFFSET, OMAP1510_LB_OFFSET,
|
||||
(u64)-1))
|
||||
WARN_ONCE(1, "failed to set DMA offset\n");
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
static struct notifier_block omap_1510_usb_ohci_nb = {
|
||||
.notifier_call = omap_1510_usb_ohci_notifier,
|
||||
};
|
||||
|
||||
static void __init omap_1510_usb_init(struct omap_usb_config *config)
|
||||
{
|
||||
unsigned int val;
|
||||
@ -616,19 +664,19 @@ static void __init omap_1510_usb_init(struct omap_usb_config *config)
|
||||
}
|
||||
#endif
|
||||
|
||||
#if IS_ENABLED(CONFIG_USB_OHCI_HCD)
|
||||
if (config->register_host) {
|
||||
if (IS_ENABLED(CONFIG_USB_OHCI_HCD) && config->register_host) {
|
||||
int status;
|
||||
|
||||
bus_register_notifier(&platform_bus_type,
|
||||
&omap_1510_usb_ohci_nb);
|
||||
ohci_device.dev.platform_data = config;
|
||||
dma_direct_set_offset(&ohci_device.dev, PHYS_OFFSET,
|
||||
OMAP1510_LB_OFFSET, (u64)-1);
|
||||
status = platform_device_register(&ohci_device);
|
||||
if (status)
|
||||
pr_debug("can't register OHCI device, %d\n", status);
|
||||
/* hcd explicitly gates 48MHz */
|
||||
|
||||
config->lb_reset = omap_1510_local_bus_reset;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#else
|
||||
|
@ -3614,6 +3614,8 @@ int omap_hwmod_init_module(struct device *dev,
|
||||
oh->flags |= HWMOD_SWSUP_SIDLE_ACT;
|
||||
if (data->cfg->quirks & SYSC_QUIRK_SWSUP_MSTANDBY)
|
||||
oh->flags |= HWMOD_SWSUP_MSTANDBY;
|
||||
if (data->cfg->quirks & SYSC_QUIRK_CLKDM_NOAUTO)
|
||||
oh->flags |= HWMOD_CLKDM_NOAUTO;
|
||||
|
||||
error = omap_hwmod_check_module(dev, oh, data, sysc_fields,
|
||||
rev_offs, sysc_offs, syss_offs,
|
||||
|
@ -36,6 +36,10 @@
|
||||
* +-----+
|
||||
* |RSVD | JIT scratchpad
|
||||
* current ARM_SP => +-----+ <= (BPF_FP - STACK_SIZE + SCRATCH_SIZE)
|
||||
* | ... | caller-saved registers
|
||||
* +-----+
|
||||
* | ... | arguments passed on stack
|
||||
* ARM_SP during call => +-----|
|
||||
* | |
|
||||
* | ... | Function call stack
|
||||
* | |
|
||||
@ -63,6 +67,12 @@
|
||||
*
|
||||
* When popping registers off the stack at the end of a BPF function, we
|
||||
* reference them via the current ARM_FP register.
|
||||
*
|
||||
* Some eBPF operations are implemented via a call to a helper function.
|
||||
* Such calls are "invisible" in the eBPF code, so it is up to the calling
|
||||
* program to preserve any caller-saved ARM registers during the call. The
|
||||
* JIT emits code to push and pop those registers onto the stack, immediately
|
||||
* above the callee stack frame.
|
||||
*/
|
||||
#define CALLEE_MASK (1 << ARM_R4 | 1 << ARM_R5 | 1 << ARM_R6 | \
|
||||
1 << ARM_R7 | 1 << ARM_R8 | 1 << ARM_R9 | \
|
||||
@ -70,6 +80,8 @@
|
||||
#define CALLEE_PUSH_MASK (CALLEE_MASK | 1 << ARM_LR)
|
||||
#define CALLEE_POP_MASK (CALLEE_MASK | 1 << ARM_PC)
|
||||
|
||||
#define CALLER_MASK (1 << ARM_R0 | 1 << ARM_R1 | 1 << ARM_R2 | 1 << ARM_R3)
|
||||
|
||||
enum {
|
||||
/* Stack layout - these are offsets from (top of stack - 4) */
|
||||
BPF_R2_HI,
|
||||
@ -464,6 +476,7 @@ static inline int epilogue_offset(const struct jit_ctx *ctx)
|
||||
|
||||
static inline void emit_udivmod(u8 rd, u8 rm, u8 rn, struct jit_ctx *ctx, u8 op)
|
||||
{
|
||||
const int exclude_mask = BIT(ARM_R0) | BIT(ARM_R1);
|
||||
const s8 *tmp = bpf2a32[TMP_REG_1];
|
||||
|
||||
#if __LINUX_ARM_ARCH__ == 7
|
||||
@ -495,11 +508,17 @@ static inline void emit_udivmod(u8 rd, u8 rm, u8 rn, struct jit_ctx *ctx, u8 op)
|
||||
emit(ARM_MOV_R(ARM_R0, rm), ctx);
|
||||
}
|
||||
|
||||
/* Push caller-saved registers on stack */
|
||||
emit(ARM_PUSH(CALLER_MASK & ~exclude_mask), ctx);
|
||||
|
||||
/* Call appropriate function */
|
||||
emit_mov_i(ARM_IP, op == BPF_DIV ?
|
||||
(u32)jit_udiv32 : (u32)jit_mod32, ctx);
|
||||
emit_blx_r(ARM_IP, ctx);
|
||||
|
||||
/* Restore caller-saved registers from stack */
|
||||
emit(ARM_POP(CALLER_MASK & ~exclude_mask), ctx);
|
||||
|
||||
/* Save return value */
|
||||
if (rd != ARM_R0)
|
||||
emit(ARM_MOV_R(rd, ARM_R0), ctx);
|
||||
|
@ -115,7 +115,6 @@ v2m_refclk32khz: refclk32khz {
|
||||
|
||||
bus@8000000 {
|
||||
compatible = "arm,vexpress,v2m-p1", "simple-bus";
|
||||
arm,v2m-memory-map = "rs1";
|
||||
#address-cells = <2>; /* SMB chipselect number and offset */
|
||||
#size-cells = <1>;
|
||||
|
||||
|
@ -192,32 +192,9 @@ panel_in: endpoint {
|
||||
remote-endpoint = <&clcd_pads>;
|
||||
};
|
||||
};
|
||||
|
||||
panel-timing {
|
||||
clock-frequency = <63500127>;
|
||||
hactive = <1024>;
|
||||
hback-porch = <152>;
|
||||
hfront-porch = <48>;
|
||||
hsync-len = <104>;
|
||||
vactive = <768>;
|
||||
vback-porch = <23>;
|
||||
vfront-porch = <3>;
|
||||
vsync-len = <4>;
|
||||
};
|
||||
};
|
||||
|
||||
bus@8000000 {
|
||||
compatible = "simple-bus";
|
||||
|
||||
#address-cells = <2>;
|
||||
#size-cells = <1>;
|
||||
ranges = <0 0 0 0x08000000 0x04000000>,
|
||||
<1 0 0 0x14000000 0x04000000>,
|
||||
<2 0 0 0x18000000 0x04000000>,
|
||||
<3 0 0 0x1c000000 0x04000000>,
|
||||
<4 0 0 0x0c000000 0x04000000>,
|
||||
<5 0 0 0x10000000 0x04000000>;
|
||||
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-map-mask = <0 0 63>;
|
||||
interrupt-map = <0 0 0 &gic 0 0 GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>,
|
||||
|
@ -27,8 +27,6 @@ mailbox: mhu@2b1f0000 {
|
||||
reg = <0x0 0x2b1f0000 0x0 0x1000>;
|
||||
interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-names = "mhu_lpri_rx",
|
||||
"mhu_hpri_rx";
|
||||
#mbox-cells = <1>;
|
||||
clocks = <&soc_refclk100mhz>;
|
||||
clock-names = "apb_pclk";
|
||||
@ -804,16 +802,6 @@ memory@80000000 {
|
||||
};
|
||||
|
||||
bus@8000000 {
|
||||
compatible = "simple-bus";
|
||||
#address-cells = <2>;
|
||||
#size-cells = <1>;
|
||||
ranges = <0 0 0 0x08000000 0x04000000>,
|
||||
<1 0 0 0x14000000 0x04000000>,
|
||||
<2 0 0 0x18000000 0x04000000>,
|
||||
<3 0 0 0x1c000000 0x04000000>,
|
||||
<4 0 0 0x0c000000 0x04000000>,
|
||||
<5 0 0 0x10000000 0x04000000>;
|
||||
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-map-mask = <0 0 15>;
|
||||
interrupt-map = <0 0 0 &gic 0 GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>,
|
||||
|
@ -92,16 +92,23 @@ nmi-button {
|
||||
};
|
||||
|
||||
bus@8000000 {
|
||||
motherboard-bus {
|
||||
compatible = "simple-bus";
|
||||
#address-cells = <2>;
|
||||
#size-cells = <1>;
|
||||
ranges = <0 0x8000000 0 0x8000000 0x18000000>;
|
||||
|
||||
motherboard-bus@8000000 {
|
||||
compatible = "arm,vexpress,v2p-p1", "simple-bus";
|
||||
#address-cells = <2>; /* SMB chipselect number and offset */
|
||||
#size-cells = <1>;
|
||||
#interrupt-cells = <1>;
|
||||
ranges;
|
||||
model = "V2M-Juno";
|
||||
ranges = <0 0 0 0x08000000 0x04000000>,
|
||||
<1 0 0 0x14000000 0x04000000>,
|
||||
<2 0 0 0x18000000 0x04000000>,
|
||||
<3 0 0 0x1c000000 0x04000000>,
|
||||
<4 0 0 0x0c000000 0x04000000>,
|
||||
<5 0 0 0x10000000 0x04000000>;
|
||||
arm,hbi = <0x252>;
|
||||
arm,vexpress,site = <0>;
|
||||
arm,v2m-memory-map = "rs1";
|
||||
|
||||
flash@0 {
|
||||
/* 2 * 32MiB NOR Flash memory mounted on CS0 */
|
||||
@ -218,7 +225,7 @@ led7 {
|
||||
};
|
||||
};
|
||||
|
||||
mmci@50000 {
|
||||
mmc@50000 {
|
||||
compatible = "arm,pl180", "arm,primecell";
|
||||
reg = <0x050000 0x1000>;
|
||||
interrupts = <5>;
|
||||
@ -246,7 +253,7 @@ kmi@70000 {
|
||||
clock-names = "KMIREFCLK", "apb_pclk";
|
||||
};
|
||||
|
||||
wdt@f0000 {
|
||||
watchdog@f0000 {
|
||||
compatible = "arm,sp805", "arm,primecell";
|
||||
reg = <0x0f0000 0x10000>;
|
||||
interrupts = <7>;
|
||||
|
@ -133,17 +133,6 @@ panel_in: endpoint {
|
||||
};
|
||||
|
||||
bus@8000000 {
|
||||
compatible = "simple-bus";
|
||||
|
||||
#address-cells = <2>;
|
||||
#size-cells = <1>;
|
||||
ranges = <0 0 0 0x08000000 0x04000000>,
|
||||
<1 0 0 0x14000000 0x04000000>,
|
||||
<2 0 0 0x18000000 0x04000000>,
|
||||
<3 0 0 0x1c000000 0x04000000>,
|
||||
<4 0 0 0x0c000000 0x04000000>,
|
||||
<5 0 0 0x10000000 0x04000000>;
|
||||
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-map-mask = <0 0 63>;
|
||||
interrupt-map = <0 0 0 &gic GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>,
|
||||
|
@ -6,7 +6,7 @@
|
||||
*/
|
||||
/ {
|
||||
bus@8000000 {
|
||||
motherboard-bus {
|
||||
motherboard-bus@8000000 {
|
||||
arm,v2m-memory-map = "rs2";
|
||||
|
||||
iofpga-bus@300000000 {
|
||||
|
@ -77,13 +77,21 @@ dvimode {
|
||||
};
|
||||
|
||||
bus@8000000 {
|
||||
motherboard-bus {
|
||||
arm,v2m-memory-map = "rs1";
|
||||
compatible = "simple-bus";
|
||||
#address-cells = <2>;
|
||||
#size-cells = <1>;
|
||||
ranges = <0 0x8000000 0 0x8000000 0x18000000>;
|
||||
|
||||
motherboard-bus@8000000 {
|
||||
compatible = "arm,vexpress,v2m-p1", "simple-bus";
|
||||
#address-cells = <2>; /* SMB chipselect number and offset */
|
||||
#size-cells = <1>;
|
||||
#interrupt-cells = <1>;
|
||||
ranges;
|
||||
ranges = <0 0 0 0x08000000 0x04000000>,
|
||||
<1 0 0 0x14000000 0x04000000>,
|
||||
<2 0 0 0x18000000 0x04000000>,
|
||||
<3 0 0 0x1c000000 0x04000000>,
|
||||
<4 0 0 0x0c000000 0x04000000>,
|
||||
<5 0 0 0x10000000 0x04000000>;
|
||||
|
||||
flash@0 {
|
||||
compatible = "arm,vexpress-flash", "cfi-flash";
|
||||
@ -130,7 +138,7 @@ aaci@40000 {
|
||||
clock-names = "apb_pclk";
|
||||
};
|
||||
|
||||
mmci@50000 {
|
||||
mmc@50000 {
|
||||
compatible = "arm,pl180", "arm,primecell";
|
||||
reg = <0x050000 0x1000>;
|
||||
interrupts = <9>, <10>;
|
||||
@ -190,7 +198,7 @@ v2m_serial3: serial@c0000 {
|
||||
clock-names = "uartclk", "apb_pclk";
|
||||
};
|
||||
|
||||
wdt@f0000 {
|
||||
watchdog@f0000 {
|
||||
compatible = "arm,sp805", "arm,primecell";
|
||||
reg = <0x0f0000 0x1000>;
|
||||
interrupts = <0>;
|
||||
|
@ -145,61 +145,6 @@ temp-fpga {
|
||||
};
|
||||
|
||||
smb: bus@8000000 {
|
||||
compatible = "simple-bus";
|
||||
|
||||
#address-cells = <2>;
|
||||
#size-cells = <1>;
|
||||
ranges = <0 0 0 0x08000000 0x04000000>,
|
||||
<1 0 0 0x14000000 0x04000000>,
|
||||
<2 0 0 0x18000000 0x04000000>,
|
||||
<3 0 0 0x1c000000 0x04000000>,
|
||||
<4 0 0 0x0c000000 0x04000000>,
|
||||
<5 0 0 0x10000000 0x04000000>;
|
||||
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-map-mask = <0 0 63>;
|
||||
interrupt-map = <0 0 0 &gic GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 1 &gic GIC_SPI 1 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 2 &gic GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 3 &gic GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 4 &gic GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 5 &gic GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 6 &gic GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 7 &gic GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 8 &gic GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 9 &gic GIC_SPI 9 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 10 &gic GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 11 &gic GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 12 &gic GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 13 &gic GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 14 &gic GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 15 &gic GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 16 &gic GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 17 &gic GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 18 &gic GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 19 &gic GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 20 &gic GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 21 &gic GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 22 &gic GIC_SPI 22 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 23 &gic GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 24 &gic GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 25 &gic GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 26 &gic GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 27 &gic GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 28 &gic GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 29 &gic GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 30 &gic GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 31 &gic GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 32 &gic GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 33 &gic GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 34 &gic GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 35 &gic GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 36 &gic GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 37 &gic GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 38 &gic GIC_SPI 38 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 39 &gic GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 40 &gic GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 41 &gic GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 42 &gic GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH>;
|
||||
ranges = <0x8000000 0 0x8000000 0x18000000>;
|
||||
};
|
||||
};
|
||||
|
@ -405,9 +405,9 @@ esdhc1: mmc@2150000 {
|
||||
interrupts = <GIC_SPI 63 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clock-frequency = <0>; /* fixed up by bootloader */
|
||||
clocks = <&clockgen QORIQ_CLK_HWACCEL 1>;
|
||||
voltage-ranges = <1800 1800 3300 3300>;
|
||||
voltage-ranges = <1800 1800>;
|
||||
sdhci,auto-cmd12;
|
||||
broken-cd;
|
||||
non-removable;
|
||||
little-endian;
|
||||
bus-width = <4>;
|
||||
status = "disabled";
|
||||
|
@ -91,7 +91,7 @@ flash@0 {
|
||||
#size-cells = <1>;
|
||||
compatible = "jedec,spi-nor";
|
||||
spi-max-frequency = <80000000>;
|
||||
spi-tx-bus-width = <4>;
|
||||
spi-tx-bus-width = <1>;
|
||||
spi-rx-bus-width = <4>;
|
||||
};
|
||||
};
|
||||
|
@ -48,7 +48,7 @@ flash@0 {
|
||||
#size-cells = <1>;
|
||||
compatible = "jedec,spi-nor";
|
||||
spi-max-frequency = <80000000>;
|
||||
spi-tx-bus-width = <4>;
|
||||
spi-tx-bus-width = <1>;
|
||||
spi-rx-bus-width = <4>;
|
||||
};
|
||||
};
|
||||
|
@ -102,6 +102,7 @@ reg_vdd_arm: BUCK2 {
|
||||
regulator-min-microvolt = <850000>;
|
||||
regulator-max-microvolt = <950000>;
|
||||
regulator-boot-on;
|
||||
regulator-always-on;
|
||||
regulator-ramp-delay = <3125>;
|
||||
nxp,dvs-run-voltage = <950000>;
|
||||
nxp,dvs-standby-voltage = <850000>;
|
||||
|
@ -647,7 +647,7 @@ &iomuxc {
|
||||
pinctrl_hog: hoggrp {
|
||||
fsl,pins = <
|
||||
MX8MM_IOMUXC_NAND_CE0_B_GPIO3_IO1 0x40000159 /* M2_GDIS# */
|
||||
MX8MM_IOMUXC_GPIO1_IO12_GPIO1_IO12 0x40000041 /* M2_RST# */
|
||||
MX8MM_IOMUXC_GPIO1_IO13_GPIO1_IO13 0x40000041 /* M2_RST# */
|
||||
MX8MM_IOMUXC_NAND_DATA01_GPIO3_IO7 0x40000119 /* M2_OFF# */
|
||||
MX8MM_IOMUXC_GPIO1_IO15_GPIO1_IO15 0x40000159 /* M2_WDIS# */
|
||||
MX8MM_IOMUXC_SAI1_TXD2_GPIO4_IO14 0x40000041 /* AMP GPIO1 */
|
||||
|
@ -101,7 +101,7 @@ flash@0 {
|
||||
#size-cells = <1>;
|
||||
compatible = "jedec,spi-nor";
|
||||
spi-max-frequency = <80000000>;
|
||||
spi-tx-bus-width = <4>;
|
||||
spi-tx-bus-width = <1>;
|
||||
spi-rx-bus-width = <4>;
|
||||
};
|
||||
};
|
||||
|
@ -633,7 +633,7 @@ &iomuxc {
|
||||
pinctrl_hog: hoggrp {
|
||||
fsl,pins = <
|
||||
MX8MN_IOMUXC_NAND_CE0_B_GPIO3_IO1 0x40000159 /* M2_GDIS# */
|
||||
MX8MN_IOMUXC_GPIO1_IO12_GPIO1_IO12 0x40000041 /* M2_RST# */
|
||||
MX8MN_IOMUXC_GPIO1_IO13_GPIO1_IO13 0x40000041 /* M2_RST# */
|
||||
MX8MN_IOMUXC_NAND_DATA01_GPIO3_IO7 0x40000119 /* M2_OFF# */
|
||||
MX8MN_IOMUXC_GPIO1_IO15_GPIO1_IO15 0x40000159 /* M2_WDIS# */
|
||||
MX8MN_IOMUXC_SAI2_RXFS_GPIO4_IO21 0x40000041 /* APP GPIO1 */
|
||||
|
@ -74,7 +74,7 @@ som_flash: flash@0 {
|
||||
compatible = "jedec,spi-nor";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <80000000>;
|
||||
spi-tx-bus-width = <4>;
|
||||
spi-tx-bus-width = <1>;
|
||||
spi-rx-bus-width = <4>;
|
||||
};
|
||||
};
|
||||
|
@ -337,6 +337,8 @@ n25q256a: flash@0 {
|
||||
#size-cells = <1>;
|
||||
compatible = "micron,n25q256a", "jedec,spi-nor";
|
||||
spi-max-frequency = <29000000>;
|
||||
spi-tx-bus-width = <1>;
|
||||
spi-rx-bus-width = <4>;
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -281,7 +281,7 @@ flash@0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
reg = <0>;
|
||||
spi-tx-bus-width = <4>;
|
||||
spi-tx-bus-width = <1>;
|
||||
spi-rx-bus-width = <4>;
|
||||
m25p,fast-read;
|
||||
spi-max-frequency = <50000000>;
|
||||
|
@ -48,8 +48,10 @@ pm8150_0: pmic@0 {
|
||||
#size-cells = <0>;
|
||||
|
||||
pon: power-on@800 {
|
||||
compatible = "qcom,pm8916-pon";
|
||||
compatible = "qcom,pm8998-pon";
|
||||
reg = <0x0800>;
|
||||
mode-bootloader = <0x2>;
|
||||
mode-recovery = <0x1>;
|
||||
|
||||
pon_pwrkey: pwrkey {
|
||||
compatible = "qcom,pm8941-pwrkey";
|
||||
|
@ -804,6 +804,16 @@ lt9611_rst_pin: lt9611-rst-pin {
|
||||
};
|
||||
};
|
||||
|
||||
&pon_pwrkey {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&pon_resin {
|
||||
status = "okay";
|
||||
|
||||
linux,code = <KEY_VOLUMEDOWN>;
|
||||
};
|
||||
|
||||
&qupv3_id_0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
@ -273,7 +273,6 @@ sound: sound {
|
||||
"Headphone Jack", "HPOL",
|
||||
"Headphone Jack", "HPOR";
|
||||
|
||||
#sound-dai-cells = <0>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
@ -301,11 +300,11 @@ sound_multimedia1_codec: codec {
|
||||
};
|
||||
};
|
||||
|
||||
dai-link@2 {
|
||||
dai-link@5 {
|
||||
link-name = "MultiMedia2";
|
||||
reg = <2>;
|
||||
reg = <LPASS_DP_RX>;
|
||||
cpu {
|
||||
sound-dai = <&lpass_cpu 2>;
|
||||
sound-dai = <&lpass_cpu LPASS_DP_RX>;
|
||||
};
|
||||
|
||||
codec {
|
||||
@ -782,7 +781,7 @@ secondary_mi2s: mi2s@1 {
|
||||
qcom,playback-sd-lines = <0>;
|
||||
};
|
||||
|
||||
hdmi-primary@0 {
|
||||
hdmi@5 {
|
||||
reg = <LPASS_DP_RX>;
|
||||
};
|
||||
};
|
||||
|
@ -1850,9 +1850,9 @@ rpmhcc: clock-controller {
|
||||
|
||||
cpufreq_hw: cpufreq@18591000 {
|
||||
compatible = "qcom,cpufreq-epss";
|
||||
reg = <0 0x18591100 0 0x900>,
|
||||
<0 0x18592100 0 0x900>,
|
||||
<0 0x18593100 0 0x900>;
|
||||
reg = <0 0x18591000 0 0x1000>,
|
||||
<0 0x18592000 0 0x1000>,
|
||||
<0 0x18593000 0 0x1000>;
|
||||
clocks = <&rpmhcc RPMH_CXO_CLK>, <&gcc GCC_GPLL0>;
|
||||
clock-names = "xo", "alternate";
|
||||
#freq-domain-cells = <1>;
|
||||
|
@ -654,9 +654,20 @@ a2noc: interconnect@1704000 {
|
||||
compatible = "qcom,sdm660-a2noc";
|
||||
reg = <0x01704000 0xc100>;
|
||||
#interconnect-cells = <1>;
|
||||
clock-names = "bus", "bus_a";
|
||||
clock-names = "bus",
|
||||
"bus_a",
|
||||
"ipa",
|
||||
"ufs_axi",
|
||||
"aggre2_ufs_axi",
|
||||
"aggre2_usb3_axi",
|
||||
"cfg_noc_usb2_axi";
|
||||
clocks = <&rpmcc RPM_SMD_AGGR2_NOC_CLK>,
|
||||
<&rpmcc RPM_SMD_AGGR2_NOC_A_CLK>;
|
||||
<&rpmcc RPM_SMD_AGGR2_NOC_A_CLK>,
|
||||
<&rpmcc RPM_SMD_IPA_CLK>,
|
||||
<&gcc GCC_UFS_AXI_CLK>,
|
||||
<&gcc GCC_AGGRE2_UFS_AXI_CLK>,
|
||||
<&gcc GCC_AGGRE2_USB3_AXI_CLK>,
|
||||
<&gcc GCC_CFG_NOC_USB2_AXI_CLK>;
|
||||
};
|
||||
|
||||
mnoc: interconnect@1745000 {
|
||||
|
@ -128,23 +128,28 @@ camera_mem: memory@8bf00000 {
|
||||
no-map;
|
||||
};
|
||||
|
||||
wlan_msa_mem: memory@8c400000 {
|
||||
reg = <0 0x8c400000 0 0x100000>;
|
||||
ipa_fw_mem: memory@8c400000 {
|
||||
reg = <0 0x8c400000 0 0x10000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
gpu_mem: memory@8c515000 {
|
||||
reg = <0 0x8c515000 0 0x2000>;
|
||||
ipa_gsi_mem: memory@8c410000 {
|
||||
reg = <0 0x8c410000 0 0x5000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
ipa_fw_mem: memory@8c517000 {
|
||||
reg = <0 0x8c517000 0 0x5a000>;
|
||||
gpu_mem: memory@8c415000 {
|
||||
reg = <0 0x8c415000 0 0x2000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
adsp_mem: memory@8c600000 {
|
||||
reg = <0 0x8c600000 0 0x1a00000>;
|
||||
adsp_mem: memory@8c500000 {
|
||||
reg = <0 0x8c500000 0 0x1a00000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
wlan_msa_mem: memory@8df00000 {
|
||||
reg = <0 0x8df00000 0 0x100000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
|
@ -16,6 +16,17 @@
|
||||
#include "sdm850.dtsi"
|
||||
#include "pm8998.dtsi"
|
||||
|
||||
/*
|
||||
* Update following upstream (sdm845.dtsi) reserved
|
||||
* memory mappings for firmware loading to succeed
|
||||
* and enable the IPA device.
|
||||
*/
|
||||
/delete-node/ &ipa_fw_mem;
|
||||
/delete-node/ &ipa_gsi_mem;
|
||||
/delete-node/ &gpu_mem;
|
||||
/delete-node/ &adsp_mem;
|
||||
/delete-node/ &wlan_msa_mem;
|
||||
|
||||
/ {
|
||||
model = "Lenovo Yoga C630";
|
||||
compatible = "lenovo,yoga-c630", "qcom,sdm845";
|
||||
@ -58,6 +69,29 @@ panel_in_edp: endpoint {
|
||||
};
|
||||
};
|
||||
|
||||
/* Reserved memory changes for IPA */
|
||||
reserved-memory {
|
||||
wlan_msa_mem: memory@8c400000 {
|
||||
reg = <0 0x8c400000 0 0x100000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
gpu_mem: memory@8c515000 {
|
||||
reg = <0 0x8c515000 0 0x2000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
ipa_fw_mem: memory@8c517000 {
|
||||
reg = <0 0x8c517000 0 0x5a000>;
|
||||
no-map;
|
||||
};
|
||||
|
||||
adsp_mem: memory@8c600000 {
|
||||
reg = <0 0x8c600000 0 0x1a00000>;
|
||||
no-map;
|
||||
};
|
||||
};
|
||||
|
||||
sn65dsi86_refclk: sn65dsi86-refclk {
|
||||
compatible = "fixed-clock";
|
||||
#clock-cells = <0>;
|
||||
|
@ -154,7 +154,7 @@ fm1mac2: ethernet@e2000 {
|
||||
|
||||
fm1mac3: ethernet@e4000 {
|
||||
phy-handle = <&sgmii_aqr_phy3>;
|
||||
phy-connection-type = "sgmii-2500";
|
||||
phy-connection-type = "2500base-x";
|
||||
sleep = <&rcpm 0x20000000>;
|
||||
};
|
||||
|
||||
|
@ -122,17 +122,27 @@ static bool __send_ipi_mask_ex(const struct cpumask *mask, int vector,
|
||||
ipi_arg->reserved = 0;
|
||||
ipi_arg->vp_set.valid_bank_mask = 0;
|
||||
|
||||
if (!cpumask_equal(mask, cpu_present_mask)) {
|
||||
/*
|
||||
* Use HV_GENERIC_SET_ALL and avoid converting cpumask to VP_SET
|
||||
* when the IPI is sent to all currently present CPUs.
|
||||
*/
|
||||
if (!cpumask_equal(mask, cpu_present_mask) || exclude_self) {
|
||||
ipi_arg->vp_set.format = HV_GENERIC_SET_SPARSE_4K;
|
||||
if (exclude_self)
|
||||
nr_bank = cpumask_to_vpset_noself(&(ipi_arg->vp_set), mask);
|
||||
else
|
||||
nr_bank = cpumask_to_vpset(&(ipi_arg->vp_set), mask);
|
||||
}
|
||||
if (nr_bank < 0)
|
||||
goto ipi_mask_ex_done;
|
||||
if (!nr_bank)
|
||||
|
||||
/*
|
||||
* 'nr_bank <= 0' means some CPUs in cpumask can't be
|
||||
* represented in VP_SET. Return an error and fall back to
|
||||
* native (architectural) method of sending IPIs.
|
||||
*/
|
||||
if (nr_bank <= 0)
|
||||
goto ipi_mask_ex_done;
|
||||
} else {
|
||||
ipi_arg->vp_set.format = HV_GENERIC_SET_ALL;
|
||||
}
|
||||
|
||||
status = hv_do_rep_hypercall(HVCALL_SEND_IPI_EX, 0, nr_bank,
|
||||
ipi_arg, NULL);
|
||||
|
@ -1464,6 +1464,9 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = {
|
||||
/* Quirks that need to be set based on detected module */
|
||||
SYSC_QUIRK("aess", 0, 0, 0x10, -ENODEV, 0x40000000, 0xffffffff,
|
||||
SYSC_MODULE_QUIRK_AESS),
|
||||
/* Errata i893 handling for dra7 dcan1 and 2 */
|
||||
SYSC_QUIRK("dcan", 0x4ae3c000, 0x20, -ENODEV, -ENODEV, 0xa3170504, 0xffffffff,
|
||||
SYSC_QUIRK_CLKDM_NOAUTO),
|
||||
SYSC_QUIRK("dcan", 0x48480000, 0x20, -ENODEV, -ENODEV, 0xa3170504, 0xffffffff,
|
||||
SYSC_QUIRK_CLKDM_NOAUTO),
|
||||
SYSC_QUIRK("dss", 0x4832a000, 0, 0x10, 0x14, 0x00000020, 0xffffffff,
|
||||
@ -2954,6 +2957,7 @@ static int sysc_init_soc(struct sysc *ddata)
|
||||
break;
|
||||
case SOC_AM3:
|
||||
sysc_add_disabled(0x48310000); /* rng */
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -204,7 +204,7 @@ config INTEL_STRATIX10_RSU
|
||||
|
||||
config QCOM_SCM
|
||||
tristate "Qcom SCM driver"
|
||||
depends on ARM || ARM64
|
||||
depends on ARCH_QCOM || COMPILE_TEST
|
||||
depends on HAVE_ARM_SMCCC
|
||||
select RESET_CONTROLLER
|
||||
|
||||
|
@ -68,7 +68,7 @@ config ARM_SCMI_TRANSPORT_SMC
|
||||
|
||||
config ARM_SCMI_TRANSPORT_VIRTIO
|
||||
bool "SCMI transport based on VirtIO"
|
||||
depends on VIRTIO
|
||||
depends on VIRTIO=y || VIRTIO=ARM_SCMI_PROTOCOL
|
||||
select ARM_SCMI_HAVE_TRANSPORT
|
||||
select ARM_SCMI_HAVE_MSG
|
||||
help
|
||||
|
@ -110,18 +110,16 @@ static void scmi_finalize_message(struct scmi_vio_channel *vioch,
|
||||
if (vioch->is_rx) {
|
||||
scmi_vio_feed_vq_rx(vioch, msg);
|
||||
} else {
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&vioch->lock, flags);
|
||||
/* Here IRQs are assumed to be already disabled by the caller */
|
||||
spin_lock(&vioch->lock);
|
||||
list_add(&msg->list, &vioch->free_list);
|
||||
spin_unlock_irqrestore(&vioch->lock, flags);
|
||||
spin_unlock(&vioch->lock);
|
||||
}
|
||||
}
|
||||
|
||||
static void scmi_vio_complete_cb(struct virtqueue *vqueue)
|
||||
{
|
||||
unsigned long ready_flags;
|
||||
unsigned long flags;
|
||||
unsigned int length;
|
||||
struct scmi_vio_channel *vioch;
|
||||
struct scmi_vio_msg *msg;
|
||||
@ -140,7 +138,8 @@ static void scmi_vio_complete_cb(struct virtqueue *vqueue)
|
||||
goto unlock_ready_out;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&vioch->lock, flags);
|
||||
/* IRQs already disabled here no need to irqsave */
|
||||
spin_lock(&vioch->lock);
|
||||
if (cb_enabled) {
|
||||
virtqueue_disable_cb(vqueue);
|
||||
cb_enabled = false;
|
||||
@ -151,7 +150,7 @@ static void scmi_vio_complete_cb(struct virtqueue *vqueue)
|
||||
goto unlock_out;
|
||||
cb_enabled = true;
|
||||
}
|
||||
spin_unlock_irqrestore(&vioch->lock, flags);
|
||||
spin_unlock(&vioch->lock);
|
||||
|
||||
if (msg) {
|
||||
msg->rx_len = length;
|
||||
@ -161,11 +160,18 @@ static void scmi_vio_complete_cb(struct virtqueue *vqueue)
|
||||
scmi_finalize_message(vioch, msg);
|
||||
}
|
||||
|
||||
/*
|
||||
* Release ready_lock and re-enable IRQs between loop iterations
|
||||
* to allow virtio_chan_free() to possibly kick in and set the
|
||||
* flag vioch->ready to false even in between processing of
|
||||
* messages, so as to force outstanding messages to be ignored
|
||||
* when system is shutting down.
|
||||
*/
|
||||
spin_unlock_irqrestore(&vioch->ready_lock, ready_flags);
|
||||
}
|
||||
|
||||
unlock_out:
|
||||
spin_unlock_irqrestore(&vioch->lock, flags);
|
||||
spin_unlock(&vioch->lock);
|
||||
unlock_ready_out:
|
||||
spin_unlock_irqrestore(&vioch->ready_lock, ready_flags);
|
||||
}
|
||||
@ -384,8 +390,11 @@ static int scmi_vio_probe(struct virtio_device *vdev)
|
||||
struct virtqueue *vqs[VIRTIO_SCMI_VQ_MAX_CNT];
|
||||
|
||||
/* Only one SCMI VirtiO device allowed */
|
||||
if (scmi_vdev)
|
||||
return -EINVAL;
|
||||
if (scmi_vdev) {
|
||||
dev_err(dev,
|
||||
"One SCMI Virtio device was already initialized: only one allowed.\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
have_vq_rx = scmi_vio_have_vq_rx(vdev);
|
||||
vq_cnt = have_vq_rx ? VIRTIO_SCMI_VQ_MAX_CNT : 1;
|
||||
@ -428,16 +437,25 @@ static int scmi_vio_probe(struct virtio_device *vdev)
|
||||
}
|
||||
|
||||
vdev->priv = channels;
|
||||
scmi_vdev = vdev;
|
||||
/* Ensure initialized scmi_vdev is visible */
|
||||
smp_store_mb(scmi_vdev, vdev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void scmi_vio_remove(struct virtio_device *vdev)
|
||||
{
|
||||
/*
|
||||
* Once we get here, virtio_chan_free() will have already been called by
|
||||
* the SCMI core for any existing channel and, as a consequence, all the
|
||||
* virtio channels will have been already marked NOT ready, causing any
|
||||
* outstanding message on any vqueue to be ignored by complete_cb: now
|
||||
* we can just stop processing buffers and destroy the vqueues.
|
||||
*/
|
||||
vdev->config->reset(vdev);
|
||||
vdev->config->del_vqs(vdev);
|
||||
scmi_vdev = NULL;
|
||||
/* Ensure scmi_vdev is visible as NULL */
|
||||
smp_store_mb(scmi_vdev, NULL);
|
||||
}
|
||||
|
||||
static int scmi_vio_validate(struct virtio_device *vdev)
|
||||
@ -476,7 +494,7 @@ static int __init virtio_scmi_init(void)
|
||||
return register_virtio_driver(&virtio_scmi_driver);
|
||||
}
|
||||
|
||||
static void __exit virtio_scmi_exit(void)
|
||||
static void virtio_scmi_exit(void)
|
||||
{
|
||||
unregister_virtio_driver(&virtio_scmi_driver);
|
||||
}
|
||||
|
@ -780,7 +780,7 @@ struct gve_queue_page_list *gve_assign_rx_qpl(struct gve_priv *priv)
|
||||
gve_num_tx_qpls(priv));
|
||||
|
||||
/* we are out of rx qpls */
|
||||
if (id == priv->qpl_cfg.qpl_map_size)
|
||||
if (id == gve_num_tx_qpls(priv) + gve_num_rx_qpls(priv))
|
||||
return NULL;
|
||||
|
||||
set_bit(id, priv->qpl_cfg.qpl_id_map);
|
||||
|
@ -41,6 +41,7 @@ static void gve_get_stats(struct net_device *dev, struct rtnl_link_stats64 *s)
|
||||
{
|
||||
struct gve_priv *priv = netdev_priv(dev);
|
||||
unsigned int start;
|
||||
u64 packets, bytes;
|
||||
int ring;
|
||||
|
||||
if (priv->rx) {
|
||||
@ -48,10 +49,12 @@ static void gve_get_stats(struct net_device *dev, struct rtnl_link_stats64 *s)
|
||||
do {
|
||||
start =
|
||||
u64_stats_fetch_begin(&priv->rx[ring].statss);
|
||||
s->rx_packets += priv->rx[ring].rpackets;
|
||||
s->rx_bytes += priv->rx[ring].rbytes;
|
||||
packets = priv->rx[ring].rpackets;
|
||||
bytes = priv->rx[ring].rbytes;
|
||||
} while (u64_stats_fetch_retry(&priv->rx[ring].statss,
|
||||
start));
|
||||
s->rx_packets += packets;
|
||||
s->rx_bytes += bytes;
|
||||
}
|
||||
}
|
||||
if (priv->tx) {
|
||||
@ -59,10 +62,12 @@ static void gve_get_stats(struct net_device *dev, struct rtnl_link_stats64 *s)
|
||||
do {
|
||||
start =
|
||||
u64_stats_fetch_begin(&priv->tx[ring].statss);
|
||||
s->tx_packets += priv->tx[ring].pkt_done;
|
||||
s->tx_bytes += priv->tx[ring].bytes_done;
|
||||
packets = priv->tx[ring].pkt_done;
|
||||
bytes = priv->tx[ring].bytes_done;
|
||||
} while (u64_stats_fetch_retry(&priv->tx[ring].statss,
|
||||
start));
|
||||
s->tx_packets += packets;
|
||||
s->tx_bytes += bytes;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -82,6 +87,9 @@ static int gve_alloc_counter_array(struct gve_priv *priv)
|
||||
|
||||
static void gve_free_counter_array(struct gve_priv *priv)
|
||||
{
|
||||
if (!priv->counter_array)
|
||||
return;
|
||||
|
||||
dma_free_coherent(&priv->pdev->dev,
|
||||
priv->num_event_counters *
|
||||
sizeof(*priv->counter_array),
|
||||
@ -142,6 +150,9 @@ static int gve_alloc_stats_report(struct gve_priv *priv)
|
||||
|
||||
static void gve_free_stats_report(struct gve_priv *priv)
|
||||
{
|
||||
if (!priv->stats_report)
|
||||
return;
|
||||
|
||||
del_timer_sync(&priv->stats_report_timer);
|
||||
dma_free_coherent(&priv->pdev->dev, priv->stats_report_len,
|
||||
priv->stats_report, priv->stats_report_bus);
|
||||
@ -370,18 +381,19 @@ static void gve_free_notify_blocks(struct gve_priv *priv)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (priv->msix_vectors) {
|
||||
/* Free the irqs */
|
||||
for (i = 0; i < priv->num_ntfy_blks; i++) {
|
||||
struct gve_notify_block *block = &priv->ntfy_blocks[i];
|
||||
int msix_idx = i;
|
||||
if (!priv->msix_vectors)
|
||||
return;
|
||||
|
||||
irq_set_affinity_hint(priv->msix_vectors[msix_idx].vector,
|
||||
NULL);
|
||||
free_irq(priv->msix_vectors[msix_idx].vector, block);
|
||||
}
|
||||
free_irq(priv->msix_vectors[priv->mgmt_msix_idx].vector, priv);
|
||||
/* Free the irqs */
|
||||
for (i = 0; i < priv->num_ntfy_blks; i++) {
|
||||
struct gve_notify_block *block = &priv->ntfy_blocks[i];
|
||||
int msix_idx = i;
|
||||
|
||||
irq_set_affinity_hint(priv->msix_vectors[msix_idx].vector,
|
||||
NULL);
|
||||
free_irq(priv->msix_vectors[msix_idx].vector, block);
|
||||
}
|
||||
free_irq(priv->msix_vectors[priv->mgmt_msix_idx].vector, priv);
|
||||
dma_free_coherent(&priv->pdev->dev,
|
||||
priv->num_ntfy_blks * sizeof(*priv->ntfy_blocks),
|
||||
priv->ntfy_blocks, priv->ntfy_block_bus);
|
||||
@ -1185,9 +1197,10 @@ static void gve_handle_reset(struct gve_priv *priv)
|
||||
|
||||
void gve_handle_report_stats(struct gve_priv *priv)
|
||||
{
|
||||
int idx, stats_idx = 0, tx_bytes;
|
||||
unsigned int start = 0;
|
||||
struct stats *stats = priv->stats_report->stats;
|
||||
int idx, stats_idx = 0;
|
||||
unsigned int start = 0;
|
||||
u64 tx_bytes;
|
||||
|
||||
if (!gve_get_report_stats(priv))
|
||||
return;
|
||||
|
@ -104,8 +104,14 @@ static int gve_prefill_rx_pages(struct gve_rx_ring *rx)
|
||||
if (!rx->data.page_info)
|
||||
return -ENOMEM;
|
||||
|
||||
if (!rx->data.raw_addressing)
|
||||
if (!rx->data.raw_addressing) {
|
||||
rx->data.qpl = gve_assign_rx_qpl(priv);
|
||||
if (!rx->data.qpl) {
|
||||
kvfree(rx->data.page_info);
|
||||
rx->data.page_info = NULL;
|
||||
return -ENOMEM;
|
||||
}
|
||||
}
|
||||
for (i = 0; i < slots; i++) {
|
||||
if (!rx->data.raw_addressing) {
|
||||
struct page *page = rx->data.qpl->pages[i];
|
||||
|
@ -4871,7 +4871,8 @@ static void i40e_clear_interrupt_scheme(struct i40e_pf *pf)
|
||||
{
|
||||
int i;
|
||||
|
||||
i40e_free_misc_vector(pf);
|
||||
if (test_bit(__I40E_MISC_IRQ_REQUESTED, pf->state))
|
||||
i40e_free_misc_vector(pf);
|
||||
|
||||
i40e_put_lump(pf->irq_pile, pf->iwarp_base_vector,
|
||||
I40E_IWARP_IRQ_PILE_ID);
|
||||
@ -10113,7 +10114,7 @@ static int i40e_get_capabilities(struct i40e_pf *pf,
|
||||
if (pf->hw.aq.asq_last_status == I40E_AQ_RC_ENOMEM) {
|
||||
/* retry with a larger buffer */
|
||||
buf_len = data_size;
|
||||
} else if (pf->hw.aq.asq_last_status != I40E_AQ_RC_OK) {
|
||||
} else if (pf->hw.aq.asq_last_status != I40E_AQ_RC_OK || err) {
|
||||
dev_info(&pf->pdev->dev,
|
||||
"capability discovery failed, err %s aq_err %s\n",
|
||||
i40e_stat_str(&pf->hw, err),
|
||||
|
@ -1965,7 +1965,6 @@ static void iavf_watchdog_task(struct work_struct *work)
|
||||
}
|
||||
adapter->aq_required = 0;
|
||||
adapter->current_op = VIRTCHNL_OP_UNKNOWN;
|
||||
mutex_unlock(&adapter->crit_lock);
|
||||
queue_delayed_work(iavf_wq,
|
||||
&adapter->watchdog_task,
|
||||
msecs_to_jiffies(10));
|
||||
|
@ -252,6 +252,7 @@ struct mlx5e_params {
|
||||
struct {
|
||||
u16 mode;
|
||||
u8 num_tc;
|
||||
struct netdev_tc_txq tc_to_txq[TC_MAX_QUEUE];
|
||||
} mqprio;
|
||||
bool rx_cqe_compress_def;
|
||||
bool tunneled_offload_en;
|
||||
@ -845,6 +846,7 @@ struct mlx5e_priv {
|
||||
struct mlx5e_channel_stats channel_stats[MLX5E_MAX_NUM_CHANNELS];
|
||||
struct mlx5e_channel_stats trap_stats;
|
||||
struct mlx5e_ptp_stats ptp_stats;
|
||||
u16 stats_nch;
|
||||
u16 max_nch;
|
||||
u8 max_opened_tc;
|
||||
bool tx_ptp_opened;
|
||||
@ -1100,12 +1102,6 @@ int mlx5e_ethtool_set_pauseparam(struct mlx5e_priv *priv,
|
||||
struct ethtool_pauseparam *pauseparam);
|
||||
|
||||
/* mlx5e generic netdev management API */
|
||||
static inline unsigned int
|
||||
mlx5e_calc_max_nch(struct mlx5e_priv *priv, const struct mlx5e_profile *profile)
|
||||
{
|
||||
return priv->netdev->num_rx_queues / max_t(u8, profile->rq_groups, 1);
|
||||
}
|
||||
|
||||
static inline bool
|
||||
mlx5e_tx_mpwqe_supported(struct mlx5_core_dev *mdev)
|
||||
{
|
||||
@ -1114,11 +1110,13 @@ mlx5e_tx_mpwqe_supported(struct mlx5_core_dev *mdev)
|
||||
}
|
||||
|
||||
int mlx5e_priv_init(struct mlx5e_priv *priv,
|
||||
const struct mlx5e_profile *profile,
|
||||
struct net_device *netdev,
|
||||
struct mlx5_core_dev *mdev);
|
||||
void mlx5e_priv_cleanup(struct mlx5e_priv *priv);
|
||||
struct net_device *
|
||||
mlx5e_create_netdev(struct mlx5_core_dev *mdev, unsigned int txqs, unsigned int rxqs);
|
||||
mlx5e_create_netdev(struct mlx5_core_dev *mdev, const struct mlx5e_profile *profile,
|
||||
unsigned int txqs, unsigned int rxqs);
|
||||
int mlx5e_attach_netdev(struct mlx5e_priv *priv);
|
||||
void mlx5e_detach_netdev(struct mlx5e_priv *priv);
|
||||
void mlx5e_destroy_netdev(struct mlx5e_priv *priv);
|
||||
|
@ -35,7 +35,7 @@ static void mlx5e_hv_vhca_fill_stats(struct mlx5e_priv *priv, void *data,
|
||||
{
|
||||
int ch, i = 0;
|
||||
|
||||
for (ch = 0; ch < priv->max_nch; ch++) {
|
||||
for (ch = 0; ch < priv->stats_nch; ch++) {
|
||||
void *buf = data + i;
|
||||
|
||||
if (WARN_ON_ONCE(buf +
|
||||
@ -51,7 +51,7 @@ static void mlx5e_hv_vhca_fill_stats(struct mlx5e_priv *priv, void *data,
|
||||
static int mlx5e_hv_vhca_stats_buf_size(struct mlx5e_priv *priv)
|
||||
{
|
||||
return (sizeof(struct mlx5e_hv_vhca_per_ring_stats) *
|
||||
priv->max_nch);
|
||||
priv->stats_nch);
|
||||
}
|
||||
|
||||
static void mlx5e_hv_vhca_stats_work(struct work_struct *work)
|
||||
@ -100,7 +100,7 @@ static void mlx5e_hv_vhca_stats_control(struct mlx5_hv_vhca_agent *agent,
|
||||
sagent = &priv->stats_agent;
|
||||
|
||||
block->version = MLX5_HV_VHCA_STATS_VERSION;
|
||||
block->rings = priv->max_nch;
|
||||
block->rings = priv->stats_nch;
|
||||
|
||||
if (!block->command) {
|
||||
cancel_delayed_work_sync(&priv->stats_agent.work);
|
||||
|
@ -13,8 +13,6 @@ struct mlx5e_ptp_fs {
|
||||
bool valid;
|
||||
};
|
||||
|
||||
#define MLX5E_PTP_CHANNEL_IX 0
|
||||
|
||||
struct mlx5e_ptp_params {
|
||||
struct mlx5e_params params;
|
||||
struct mlx5e_sq_param txq_sq_param;
|
||||
@ -509,6 +507,7 @@ static int mlx5e_init_ptp_rq(struct mlx5e_ptp *c, struct mlx5e_params *params,
|
||||
rq->mdev = mdev;
|
||||
rq->hw_mtu = MLX5E_SW2HW_MTU(params, params->sw_mtu);
|
||||
rq->stats = &c->priv->ptp_stats.rq;
|
||||
rq->ix = MLX5E_PTP_CHANNEL_IX;
|
||||
rq->ptp_cyc2time = mlx5_rq_ts_translator(mdev);
|
||||
err = mlx5e_rq_set_handlers(rq, params, false);
|
||||
if (err)
|
||||
|
@ -8,6 +8,8 @@
|
||||
#include "en_stats.h"
|
||||
#include <linux/ptp_classify.h>
|
||||
|
||||
#define MLX5E_PTP_CHANNEL_IX 0
|
||||
|
||||
struct mlx5e_ptpsq {
|
||||
struct mlx5e_txqsq txqsq;
|
||||
struct mlx5e_cq ts_cq;
|
||||
|
@ -2036,6 +2036,17 @@ static int set_pflag_tx_port_ts(struct net_device *netdev, bool enable)
|
||||
}
|
||||
|
||||
new_params = priv->channels.params;
|
||||
/* Don't allow enabling TX-port-TS if MQPRIO mode channel offload is
|
||||
* active, since it defines explicitly which TC accepts the packet.
|
||||
* This conflicts with TX-port-TS hijacking the PTP traffic to a specific
|
||||
* HW TX-queue.
|
||||
*/
|
||||
if (enable && new_params.mqprio.mode == TC_MQPRIO_MODE_CHANNEL) {
|
||||
netdev_err(priv->netdev,
|
||||
"%s: MQPRIO mode channel offload is active, cannot set the TX-port-TS\n",
|
||||
__func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
MLX5E_SET_PFLAG(&new_params, MLX5E_PFLAG_TX_PORT_TS, enable);
|
||||
/* No need to verify SQ stop room as
|
||||
* ptpsq.txqsq.stop_room <= generic_sq->stop_room, and both
|
||||
|
@ -2264,7 +2264,7 @@ void mlx5e_set_netdev_mtu_boundaries(struct mlx5e_priv *priv)
|
||||
}
|
||||
|
||||
static int mlx5e_netdev_set_tcs(struct net_device *netdev, u16 nch, u8 ntc,
|
||||
struct tc_mqprio_qopt_offload *mqprio)
|
||||
struct netdev_tc_txq *tc_to_txq)
|
||||
{
|
||||
int tc, err;
|
||||
|
||||
@ -2282,11 +2282,8 @@ static int mlx5e_netdev_set_tcs(struct net_device *netdev, u16 nch, u8 ntc,
|
||||
for (tc = 0; tc < ntc; tc++) {
|
||||
u16 count, offset;
|
||||
|
||||
/* For DCB mode, map netdev TCs to offset 0
|
||||
* We have our own UP to TXQ mapping for QoS
|
||||
*/
|
||||
count = mqprio ? mqprio->qopt.count[tc] : nch;
|
||||
offset = mqprio ? mqprio->qopt.offset[tc] : 0;
|
||||
count = tc_to_txq[tc].count;
|
||||
offset = tc_to_txq[tc].offset;
|
||||
netdev_set_tc_queue(netdev, tc, count, offset);
|
||||
}
|
||||
|
||||
@ -2315,19 +2312,24 @@ int mlx5e_update_tx_netdev_queues(struct mlx5e_priv *priv)
|
||||
|
||||
static int mlx5e_update_netdev_queues(struct mlx5e_priv *priv)
|
||||
{
|
||||
struct netdev_tc_txq old_tc_to_txq[TC_MAX_QUEUE], *tc_to_txq;
|
||||
struct net_device *netdev = priv->netdev;
|
||||
int old_num_txqs, old_ntc;
|
||||
int num_rxqs, nch, ntc;
|
||||
int err;
|
||||
int i;
|
||||
|
||||
old_num_txqs = netdev->real_num_tx_queues;
|
||||
old_ntc = netdev->num_tc ? : 1;
|
||||
for (i = 0; i < ARRAY_SIZE(old_tc_to_txq); i++)
|
||||
old_tc_to_txq[i] = netdev->tc_to_txq[i];
|
||||
|
||||
nch = priv->channels.params.num_channels;
|
||||
ntc = mlx5e_get_dcb_num_tc(&priv->channels.params);
|
||||
ntc = priv->channels.params.mqprio.num_tc;
|
||||
num_rxqs = nch * priv->profile->rq_groups;
|
||||
tc_to_txq = priv->channels.params.mqprio.tc_to_txq;
|
||||
|
||||
err = mlx5e_netdev_set_tcs(netdev, nch, ntc, NULL);
|
||||
err = mlx5e_netdev_set_tcs(netdev, nch, ntc, tc_to_txq);
|
||||
if (err)
|
||||
goto err_out;
|
||||
err = mlx5e_update_tx_netdev_queues(priv);
|
||||
@ -2350,11 +2352,14 @@ static int mlx5e_update_netdev_queues(struct mlx5e_priv *priv)
|
||||
WARN_ON_ONCE(netif_set_real_num_tx_queues(netdev, old_num_txqs));
|
||||
|
||||
err_tcs:
|
||||
mlx5e_netdev_set_tcs(netdev, old_num_txqs / old_ntc, old_ntc, NULL);
|
||||
WARN_ON_ONCE(mlx5e_netdev_set_tcs(netdev, old_num_txqs / old_ntc, old_ntc,
|
||||
old_tc_to_txq));
|
||||
err_out:
|
||||
return err;
|
||||
}
|
||||
|
||||
static MLX5E_DEFINE_PREACTIVATE_WRAPPER_CTX(mlx5e_update_netdev_queues);
|
||||
|
||||
static void mlx5e_set_default_xps_cpumasks(struct mlx5e_priv *priv,
|
||||
struct mlx5e_params *params)
|
||||
{
|
||||
@ -2861,6 +2866,58 @@ static int mlx5e_modify_channels_vsd(struct mlx5e_channels *chs, bool vsd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void mlx5e_mqprio_build_default_tc_to_txq(struct netdev_tc_txq *tc_to_txq,
|
||||
int ntc, int nch)
|
||||
{
|
||||
int tc;
|
||||
|
||||
memset(tc_to_txq, 0, sizeof(*tc_to_txq) * TC_MAX_QUEUE);
|
||||
|
||||
/* Map netdev TCs to offset 0.
|
||||
* We have our own UP to TXQ mapping for DCB mode of QoS
|
||||
*/
|
||||
for (tc = 0; tc < ntc; tc++) {
|
||||
tc_to_txq[tc] = (struct netdev_tc_txq) {
|
||||
.count = nch,
|
||||
.offset = 0,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
static void mlx5e_mqprio_build_tc_to_txq(struct netdev_tc_txq *tc_to_txq,
|
||||
struct tc_mqprio_qopt *qopt)
|
||||
{
|
||||
int tc;
|
||||
|
||||
for (tc = 0; tc < TC_MAX_QUEUE; tc++) {
|
||||
tc_to_txq[tc] = (struct netdev_tc_txq) {
|
||||
.count = qopt->count[tc],
|
||||
.offset = qopt->offset[tc],
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
static void mlx5e_params_mqprio_dcb_set(struct mlx5e_params *params, u8 num_tc)
|
||||
{
|
||||
params->mqprio.mode = TC_MQPRIO_MODE_DCB;
|
||||
params->mqprio.num_tc = num_tc;
|
||||
mlx5e_mqprio_build_default_tc_to_txq(params->mqprio.tc_to_txq, num_tc,
|
||||
params->num_channels);
|
||||
}
|
||||
|
||||
static void mlx5e_params_mqprio_channel_set(struct mlx5e_params *params,
|
||||
struct tc_mqprio_qopt *qopt)
|
||||
{
|
||||
params->mqprio.mode = TC_MQPRIO_MODE_CHANNEL;
|
||||
params->mqprio.num_tc = qopt->num_tc;
|
||||
mlx5e_mqprio_build_tc_to_txq(params->mqprio.tc_to_txq, qopt);
|
||||
}
|
||||
|
||||
static void mlx5e_params_mqprio_reset(struct mlx5e_params *params)
|
||||
{
|
||||
mlx5e_params_mqprio_dcb_set(params, 1);
|
||||
}
|
||||
|
||||
static int mlx5e_setup_tc_mqprio_dcb(struct mlx5e_priv *priv,
|
||||
struct tc_mqprio_qopt *mqprio)
|
||||
{
|
||||
@ -2874,8 +2931,7 @@ static int mlx5e_setup_tc_mqprio_dcb(struct mlx5e_priv *priv,
|
||||
return -EINVAL;
|
||||
|
||||
new_params = priv->channels.params;
|
||||
new_params.mqprio.mode = TC_MQPRIO_MODE_DCB;
|
||||
new_params.mqprio.num_tc = tc ? tc : 1;
|
||||
mlx5e_params_mqprio_dcb_set(&new_params, tc ? tc : 1);
|
||||
|
||||
err = mlx5e_safe_switch_params(priv, &new_params,
|
||||
mlx5e_num_channels_changed_ctx, NULL, true);
|
||||
@ -2889,9 +2945,17 @@ static int mlx5e_mqprio_channel_validate(struct mlx5e_priv *priv,
|
||||
struct tc_mqprio_qopt_offload *mqprio)
|
||||
{
|
||||
struct net_device *netdev = priv->netdev;
|
||||
struct mlx5e_ptp *ptp_channel;
|
||||
int agg_count = 0;
|
||||
int i;
|
||||
|
||||
ptp_channel = priv->channels.ptp;
|
||||
if (ptp_channel && test_bit(MLX5E_PTP_STATE_TX, ptp_channel->state)) {
|
||||
netdev_err(netdev,
|
||||
"Cannot activate MQPRIO mode channel since it conflicts with TX port TS\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (mqprio->qopt.offset[0] != 0 || mqprio->qopt.num_tc < 1 ||
|
||||
mqprio->qopt.num_tc > MLX5E_MAX_NUM_MQPRIO_CH_TC)
|
||||
return -EINVAL;
|
||||
@ -2926,25 +2990,12 @@ static int mlx5e_mqprio_channel_validate(struct mlx5e_priv *priv,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mlx5e_mqprio_channel_set_tcs_ctx(struct mlx5e_priv *priv, void *ctx)
|
||||
{
|
||||
struct tc_mqprio_qopt_offload *mqprio = (struct tc_mqprio_qopt_offload *)ctx;
|
||||
struct net_device *netdev = priv->netdev;
|
||||
u8 num_tc;
|
||||
|
||||
if (priv->channels.params.mqprio.mode != TC_MQPRIO_MODE_CHANNEL)
|
||||
return -EINVAL;
|
||||
|
||||
num_tc = priv->channels.params.mqprio.num_tc;
|
||||
mlx5e_netdev_set_tcs(netdev, 0, num_tc, mqprio);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mlx5e_setup_tc_mqprio_channel(struct mlx5e_priv *priv,
|
||||
struct tc_mqprio_qopt_offload *mqprio)
|
||||
{
|
||||
mlx5e_fp_preactivate preactivate;
|
||||
struct mlx5e_params new_params;
|
||||
bool nch_changed;
|
||||
int err;
|
||||
|
||||
err = mlx5e_mqprio_channel_validate(priv, mqprio);
|
||||
@ -2952,12 +3003,12 @@ static int mlx5e_setup_tc_mqprio_channel(struct mlx5e_priv *priv,
|
||||
return err;
|
||||
|
||||
new_params = priv->channels.params;
|
||||
new_params.mqprio.mode = TC_MQPRIO_MODE_CHANNEL;
|
||||
new_params.mqprio.num_tc = mqprio->qopt.num_tc;
|
||||
err = mlx5e_safe_switch_params(priv, &new_params,
|
||||
mlx5e_mqprio_channel_set_tcs_ctx, mqprio, true);
|
||||
mlx5e_params_mqprio_channel_set(&new_params, &mqprio->qopt);
|
||||
|
||||
return err;
|
||||
nch_changed = mlx5e_get_dcb_num_tc(&priv->channels.params) > 1;
|
||||
preactivate = nch_changed ? mlx5e_num_channels_changed_ctx :
|
||||
mlx5e_update_netdev_queues_ctx;
|
||||
return mlx5e_safe_switch_params(priv, &new_params, preactivate, NULL, true);
|
||||
}
|
||||
|
||||
static int mlx5e_setup_tc_mqprio(struct mlx5e_priv *priv,
|
||||
@ -3065,7 +3116,7 @@ void mlx5e_fold_sw_stats64(struct mlx5e_priv *priv, struct rtnl_link_stats64 *s)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < priv->max_nch; i++) {
|
||||
for (i = 0; i < priv->stats_nch; i++) {
|
||||
struct mlx5e_channel_stats *channel_stats = &priv->channel_stats[i];
|
||||
struct mlx5e_rq_stats *xskrq_stats = &channel_stats->xskrq;
|
||||
struct mlx5e_rq_stats *rq_stats = &channel_stats->rq;
|
||||
@ -4186,13 +4237,11 @@ void mlx5e_build_nic_params(struct mlx5e_priv *priv, struct mlx5e_xsk *xsk, u16
|
||||
struct mlx5_core_dev *mdev = priv->mdev;
|
||||
u8 rx_cq_period_mode;
|
||||
|
||||
priv->max_nch = mlx5e_calc_max_nch(priv, priv->profile);
|
||||
|
||||
params->sw_mtu = mtu;
|
||||
params->hard_mtu = MLX5E_ETH_HARD_MTU;
|
||||
params->num_channels = min_t(unsigned int, MLX5E_MAX_NUM_CHANNELS / 2,
|
||||
priv->max_nch);
|
||||
params->mqprio.num_tc = 1;
|
||||
mlx5e_params_mqprio_reset(params);
|
||||
|
||||
/* Set an initial non-zero value, so that mlx5e_select_queue won't
|
||||
* divide by zero if called before first activating channels.
|
||||
@ -4682,8 +4731,35 @@ static const struct mlx5e_profile mlx5e_nic_profile = {
|
||||
.rx_ptp_support = true,
|
||||
};
|
||||
|
||||
static unsigned int
|
||||
mlx5e_calc_max_nch(struct mlx5_core_dev *mdev, struct net_device *netdev,
|
||||
const struct mlx5e_profile *profile)
|
||||
|
||||
{
|
||||
unsigned int max_nch, tmp;
|
||||
|
||||
/* core resources */
|
||||
max_nch = mlx5e_get_max_num_channels(mdev);
|
||||
|
||||
/* netdev rx queues */
|
||||
tmp = netdev->num_rx_queues / max_t(u8, profile->rq_groups, 1);
|
||||
max_nch = min_t(unsigned int, max_nch, tmp);
|
||||
|
||||
/* netdev tx queues */
|
||||
tmp = netdev->num_tx_queues;
|
||||
if (mlx5_qos_is_supported(mdev))
|
||||
tmp -= mlx5e_qos_max_leaf_nodes(mdev);
|
||||
if (MLX5_CAP_GEN(mdev, ts_cqe_to_dest_cqn))
|
||||
tmp -= profile->max_tc;
|
||||
tmp = tmp / profile->max_tc;
|
||||
max_nch = min_t(unsigned int, max_nch, tmp);
|
||||
|
||||
return max_nch;
|
||||
}
|
||||
|
||||
/* mlx5e generic netdev management API (move to en_common.c) */
|
||||
int mlx5e_priv_init(struct mlx5e_priv *priv,
|
||||
const struct mlx5e_profile *profile,
|
||||
struct net_device *netdev,
|
||||
struct mlx5_core_dev *mdev)
|
||||
{
|
||||
@ -4691,6 +4767,8 @@ int mlx5e_priv_init(struct mlx5e_priv *priv,
|
||||
priv->mdev = mdev;
|
||||
priv->netdev = netdev;
|
||||
priv->msglevel = MLX5E_MSG_LEVEL;
|
||||
priv->max_nch = mlx5e_calc_max_nch(mdev, netdev, profile);
|
||||
priv->stats_nch = priv->max_nch;
|
||||
priv->max_opened_tc = 1;
|
||||
|
||||
if (!alloc_cpumask_var(&priv->scratchpad.cpumask, GFP_KERNEL))
|
||||
@ -4734,7 +4812,8 @@ void mlx5e_priv_cleanup(struct mlx5e_priv *priv)
|
||||
}
|
||||
|
||||
struct net_device *
|
||||
mlx5e_create_netdev(struct mlx5_core_dev *mdev, unsigned int txqs, unsigned int rxqs)
|
||||
mlx5e_create_netdev(struct mlx5_core_dev *mdev, const struct mlx5e_profile *profile,
|
||||
unsigned int txqs, unsigned int rxqs)
|
||||
{
|
||||
struct net_device *netdev;
|
||||
int err;
|
||||
@ -4745,7 +4824,7 @@ mlx5e_create_netdev(struct mlx5_core_dev *mdev, unsigned int txqs, unsigned int
|
||||
return NULL;
|
||||
}
|
||||
|
||||
err = mlx5e_priv_init(netdev_priv(netdev), netdev, mdev);
|
||||
err = mlx5e_priv_init(netdev_priv(netdev), profile, netdev, mdev);
|
||||
if (err) {
|
||||
mlx5_core_err(mdev, "mlx5e_priv_init failed, err=%d\n", err);
|
||||
goto err_free_netdev;
|
||||
@ -4787,7 +4866,7 @@ int mlx5e_attach_netdev(struct mlx5e_priv *priv)
|
||||
clear_bit(MLX5E_STATE_DESTROYING, &priv->state);
|
||||
|
||||
/* max number of channels may have changed */
|
||||
max_nch = mlx5e_get_max_num_channels(priv->mdev);
|
||||
max_nch = mlx5e_calc_max_nch(priv->mdev, priv->netdev, profile);
|
||||
if (priv->channels.params.num_channels > max_nch) {
|
||||
mlx5_core_warn(priv->mdev, "MLX5E: Reducing number of channels to %d\n", max_nch);
|
||||
/* Reducing the number of channels - RXFH has to be reset, and
|
||||
@ -4795,7 +4874,18 @@ int mlx5e_attach_netdev(struct mlx5e_priv *priv)
|
||||
*/
|
||||
priv->netdev->priv_flags &= ~IFF_RXFH_CONFIGURED;
|
||||
priv->channels.params.num_channels = max_nch;
|
||||
if (priv->channels.params.mqprio.mode == TC_MQPRIO_MODE_CHANNEL) {
|
||||
mlx5_core_warn(priv->mdev, "MLX5E: Disabling MQPRIO channel mode\n");
|
||||
mlx5e_params_mqprio_reset(&priv->channels.params);
|
||||
}
|
||||
}
|
||||
if (max_nch != priv->max_nch) {
|
||||
mlx5_core_warn(priv->mdev,
|
||||
"MLX5E: Updating max number of channels from %u to %u\n",
|
||||
priv->max_nch, max_nch);
|
||||
priv->max_nch = max_nch;
|
||||
}
|
||||
|
||||
/* 1. Set the real number of queues in the kernel the first time.
|
||||
* 2. Set our default XPS cpumask.
|
||||
* 3. Build the RQT.
|
||||
@ -4860,7 +4950,7 @@ mlx5e_netdev_attach_profile(struct net_device *netdev, struct mlx5_core_dev *mde
|
||||
struct mlx5e_priv *priv = netdev_priv(netdev);
|
||||
int err;
|
||||
|
||||
err = mlx5e_priv_init(priv, netdev, mdev);
|
||||
err = mlx5e_priv_init(priv, new_profile, netdev, mdev);
|
||||
if (err) {
|
||||
mlx5_core_err(mdev, "mlx5e_priv_init failed, err=%d\n", err);
|
||||
return err;
|
||||
@ -4886,20 +4976,12 @@ mlx5e_netdev_attach_profile(struct net_device *netdev, struct mlx5_core_dev *mde
|
||||
int mlx5e_netdev_change_profile(struct mlx5e_priv *priv,
|
||||
const struct mlx5e_profile *new_profile, void *new_ppriv)
|
||||
{
|
||||
unsigned int new_max_nch = mlx5e_calc_max_nch(priv, new_profile);
|
||||
const struct mlx5e_profile *orig_profile = priv->profile;
|
||||
struct net_device *netdev = priv->netdev;
|
||||
struct mlx5_core_dev *mdev = priv->mdev;
|
||||
void *orig_ppriv = priv->ppriv;
|
||||
int err, rollback_err;
|
||||
|
||||
/* sanity */
|
||||
if (new_max_nch != priv->max_nch) {
|
||||
netdev_warn(netdev, "%s: Replacing profile with different max channels\n",
|
||||
__func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* cleanup old profile */
|
||||
mlx5e_detach_netdev(priv);
|
||||
priv->profile->cleanup(priv);
|
||||
@ -4995,7 +5077,7 @@ static int mlx5e_probe(struct auxiliary_device *adev,
|
||||
nch = mlx5e_get_max_num_channels(mdev);
|
||||
txqs = nch * profile->max_tc + ptp_txqs + qos_sqs;
|
||||
rxqs = nch * profile->rq_groups;
|
||||
netdev = mlx5e_create_netdev(mdev, txqs, rxqs);
|
||||
netdev = mlx5e_create_netdev(mdev, profile, txqs, rxqs);
|
||||
if (!netdev) {
|
||||
mlx5_core_err(mdev, "mlx5e_create_netdev failed\n");
|
||||
return -ENOMEM;
|
||||
|
@ -596,7 +596,6 @@ static void mlx5e_build_rep_params(struct net_device *netdev)
|
||||
MLX5_CQ_PERIOD_MODE_START_FROM_CQE :
|
||||
MLX5_CQ_PERIOD_MODE_START_FROM_EQE;
|
||||
|
||||
priv->max_nch = mlx5e_calc_max_nch(priv, priv->profile);
|
||||
params = &priv->channels.params;
|
||||
|
||||
params->num_channels = MLX5E_REP_PARAMS_DEF_NUM_CHANNELS;
|
||||
@ -1169,7 +1168,7 @@ mlx5e_vport_vf_rep_load(struct mlx5_core_dev *dev, struct mlx5_eswitch_rep *rep)
|
||||
nch = mlx5e_get_max_num_channels(dev);
|
||||
txqs = nch * profile->max_tc;
|
||||
rxqs = nch * profile->rq_groups;
|
||||
netdev = mlx5e_create_netdev(dev, txqs, rxqs);
|
||||
netdev = mlx5e_create_netdev(dev, profile, txqs, rxqs);
|
||||
if (!netdev) {
|
||||
mlx5_core_warn(dev,
|
||||
"Failed to create representor netdev for vport %d\n",
|
||||
|
@ -1001,14 +1001,9 @@ static inline void mlx5e_handle_csum(struct net_device *netdev,
|
||||
goto csum_unnecessary;
|
||||
|
||||
if (likely(is_last_ethertype_ip(skb, &network_depth, &proto))) {
|
||||
u8 ipproto = get_ip_proto(skb, network_depth, proto);
|
||||
|
||||
if (unlikely(ipproto == IPPROTO_SCTP))
|
||||
if (unlikely(get_ip_proto(skb, network_depth, proto) == IPPROTO_SCTP))
|
||||
goto csum_unnecessary;
|
||||
|
||||
if (unlikely(mlx5_ipsec_is_rx_flow(cqe)))
|
||||
goto csum_none;
|
||||
|
||||
stats->csum_complete++;
|
||||
skb->ip_summed = CHECKSUM_COMPLETE;
|
||||
skb->csum = csum_unfold((__force __sum16)cqe->check_sum);
|
||||
|
@ -34,6 +34,7 @@
|
||||
#include "en.h"
|
||||
#include "en_accel/tls.h"
|
||||
#include "en_accel/en_accel.h"
|
||||
#include "en/ptp.h"
|
||||
|
||||
static unsigned int stats_grps_num(struct mlx5e_priv *priv)
|
||||
{
|
||||
@ -450,7 +451,7 @@ static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(sw)
|
||||
|
||||
memset(s, 0, sizeof(*s));
|
||||
|
||||
for (i = 0; i < priv->max_nch; i++) {
|
||||
for (i = 0; i < priv->stats_nch; i++) {
|
||||
struct mlx5e_channel_stats *channel_stats =
|
||||
&priv->channel_stats[i];
|
||||
int j;
|
||||
@ -2076,7 +2077,7 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(ptp)
|
||||
if (priv->rx_ptp_opened) {
|
||||
for (i = 0; i < NUM_PTP_RQ_STATS; i++)
|
||||
sprintf(data + (idx++) * ETH_GSTRING_LEN,
|
||||
ptp_rq_stats_desc[i].format);
|
||||
ptp_rq_stats_desc[i].format, MLX5E_PTP_CHANNEL_IX);
|
||||
}
|
||||
return idx;
|
||||
}
|
||||
@ -2119,7 +2120,7 @@ static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(ptp) { return; }
|
||||
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(channels)
|
||||
{
|
||||
int max_nch = priv->max_nch;
|
||||
int max_nch = priv->stats_nch;
|
||||
|
||||
return (NUM_RQ_STATS * max_nch) +
|
||||
(NUM_CH_STATS * max_nch) +
|
||||
@ -2133,7 +2134,7 @@ static MLX5E_DECLARE_STATS_GRP_OP_NUM_STATS(channels)
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(channels)
|
||||
{
|
||||
bool is_xsk = priv->xsk.ever_used;
|
||||
int max_nch = priv->max_nch;
|
||||
int max_nch = priv->stats_nch;
|
||||
int i, j, tc;
|
||||
|
||||
for (i = 0; i < max_nch; i++)
|
||||
@ -2175,7 +2176,7 @@ static MLX5E_DECLARE_STATS_GRP_OP_FILL_STRS(channels)
|
||||
static MLX5E_DECLARE_STATS_GRP_OP_FILL_STATS(channels)
|
||||
{
|
||||
bool is_xsk = priv->xsk.ever_used;
|
||||
int max_nch = priv->max_nch;
|
||||
int max_nch = priv->stats_nch;
|
||||
int i, j, tc;
|
||||
|
||||
for (i = 0; i < max_nch; i++)
|
||||
|
@ -79,12 +79,16 @@ int esw_acl_egress_lgcy_setup(struct mlx5_eswitch *esw,
|
||||
int dest_num = 0;
|
||||
int err = 0;
|
||||
|
||||
if (MLX5_CAP_ESW_EGRESS_ACL(esw->dev, flow_counter)) {
|
||||
if (vport->egress.legacy.drop_counter) {
|
||||
drop_counter = vport->egress.legacy.drop_counter;
|
||||
} else if (MLX5_CAP_ESW_EGRESS_ACL(esw->dev, flow_counter)) {
|
||||
drop_counter = mlx5_fc_create(esw->dev, false);
|
||||
if (IS_ERR(drop_counter))
|
||||
if (IS_ERR(drop_counter)) {
|
||||
esw_warn(esw->dev,
|
||||
"vport[%d] configure egress drop rule counter err(%ld)\n",
|
||||
vport->vport, PTR_ERR(drop_counter));
|
||||
drop_counter = NULL;
|
||||
}
|
||||
vport->egress.legacy.drop_counter = drop_counter;
|
||||
}
|
||||
|
||||
@ -123,7 +127,7 @@ int esw_acl_egress_lgcy_setup(struct mlx5_eswitch *esw,
|
||||
flow_act.action = MLX5_FLOW_CONTEXT_ACTION_DROP;
|
||||
|
||||
/* Attach egress drop flow counter */
|
||||
if (!IS_ERR_OR_NULL(drop_counter)) {
|
||||
if (drop_counter) {
|
||||
flow_act.action |= MLX5_FLOW_CONTEXT_ACTION_COUNT;
|
||||
drop_ctr_dst.type = MLX5_FLOW_DESTINATION_TYPE_COUNTER;
|
||||
drop_ctr_dst.counter_id = mlx5_fc_id(drop_counter);
|
||||
@ -162,7 +166,7 @@ void esw_acl_egress_lgcy_cleanup(struct mlx5_eswitch *esw,
|
||||
esw_acl_egress_table_destroy(vport);
|
||||
|
||||
clean_drop_counter:
|
||||
if (!IS_ERR_OR_NULL(vport->egress.legacy.drop_counter)) {
|
||||
if (vport->egress.legacy.drop_counter) {
|
||||
mlx5_fc_destroy(esw->dev, vport->egress.legacy.drop_counter);
|
||||
vport->egress.legacy.drop_counter = NULL;
|
||||
}
|
||||
|
@ -160,7 +160,9 @@ int esw_acl_ingress_lgcy_setup(struct mlx5_eswitch *esw,
|
||||
|
||||
esw_acl_ingress_lgcy_rules_destroy(vport);
|
||||
|
||||
if (MLX5_CAP_ESW_INGRESS_ACL(esw->dev, flow_counter)) {
|
||||
if (vport->ingress.legacy.drop_counter) {
|
||||
counter = vport->ingress.legacy.drop_counter;
|
||||
} else if (MLX5_CAP_ESW_INGRESS_ACL(esw->dev, flow_counter)) {
|
||||
counter = mlx5_fc_create(esw->dev, false);
|
||||
if (IS_ERR(counter)) {
|
||||
esw_warn(esw->dev,
|
||||
|
@ -113,7 +113,7 @@ static void mlx5i_grp_sw_update_stats(struct mlx5e_priv *priv)
|
||||
struct mlx5e_sw_stats s = { 0 };
|
||||
int i, j;
|
||||
|
||||
for (i = 0; i < priv->max_nch; i++) {
|
||||
for (i = 0; i < priv->stats_nch; i++) {
|
||||
struct mlx5e_channel_stats *channel_stats;
|
||||
struct mlx5e_rq_stats *rq_stats;
|
||||
|
||||
@ -711,7 +711,7 @@ static int mlx5_rdma_setup_rn(struct ib_device *ibdev, u32 port_num,
|
||||
goto destroy_ht;
|
||||
}
|
||||
|
||||
err = mlx5e_priv_init(epriv, netdev, mdev);
|
||||
err = mlx5e_priv_init(epriv, prof, netdev, mdev);
|
||||
if (err)
|
||||
goto destroy_mdev_resources;
|
||||
|
||||
|
@ -448,22 +448,20 @@ static u64 find_target_cycles(struct mlx5_core_dev *mdev, s64 target_ns)
|
||||
return cycles_now + cycles_delta;
|
||||
}
|
||||
|
||||
static u64 perout_conf_internal_timer(struct mlx5_core_dev *mdev,
|
||||
s64 sec, u32 nsec)
|
||||
static u64 perout_conf_internal_timer(struct mlx5_core_dev *mdev, s64 sec)
|
||||
{
|
||||
struct timespec64 ts;
|
||||
struct timespec64 ts = {};
|
||||
s64 target_ns;
|
||||
|
||||
ts.tv_sec = sec;
|
||||
ts.tv_nsec = nsec;
|
||||
target_ns = timespec64_to_ns(&ts);
|
||||
|
||||
return find_target_cycles(mdev, target_ns);
|
||||
}
|
||||
|
||||
static u64 perout_conf_real_time(s64 sec, u32 nsec)
|
||||
static u64 perout_conf_real_time(s64 sec)
|
||||
{
|
||||
return (u64)nsec | (u64)sec << 32;
|
||||
return (u64)sec << 32;
|
||||
}
|
||||
|
||||
static int mlx5_perout_configure(struct ptp_clock_info *ptp,
|
||||
@ -474,6 +472,7 @@ static int mlx5_perout_configure(struct ptp_clock_info *ptp,
|
||||
container_of(ptp, struct mlx5_clock, ptp_info);
|
||||
struct mlx5_core_dev *mdev =
|
||||
container_of(clock, struct mlx5_core_dev, clock);
|
||||
bool rt_mode = mlx5_real_time_mode(mdev);
|
||||
u32 in[MLX5_ST_SZ_DW(mtpps_reg)] = {0};
|
||||
struct timespec64 ts;
|
||||
u32 field_select = 0;
|
||||
@ -501,8 +500,10 @@ static int mlx5_perout_configure(struct ptp_clock_info *ptp,
|
||||
|
||||
if (on) {
|
||||
bool rt_mode = mlx5_real_time_mode(mdev);
|
||||
u32 nsec;
|
||||
s64 sec;
|
||||
s64 sec = rq->perout.start.sec;
|
||||
|
||||
if (rq->perout.start.nsec)
|
||||
return -EINVAL;
|
||||
|
||||
pin_mode = MLX5_PIN_MODE_OUT;
|
||||
pattern = MLX5_OUT_PATTERN_PERIODIC;
|
||||
@ -513,14 +514,11 @@ static int mlx5_perout_configure(struct ptp_clock_info *ptp,
|
||||
if ((ns >> 1) != 500000000LL)
|
||||
return -EINVAL;
|
||||
|
||||
nsec = rq->perout.start.nsec;
|
||||
sec = rq->perout.start.sec;
|
||||
|
||||
if (rt_mode && sec > U32_MAX)
|
||||
return -EINVAL;
|
||||
|
||||
time_stamp = rt_mode ? perout_conf_real_time(sec, nsec) :
|
||||
perout_conf_internal_timer(mdev, sec, nsec);
|
||||
time_stamp = rt_mode ? perout_conf_real_time(sec) :
|
||||
perout_conf_internal_timer(mdev, sec);
|
||||
|
||||
field_select |= MLX5_MTPPS_FS_PIN_MODE |
|
||||
MLX5_MTPPS_FS_PATTERN |
|
||||
@ -538,6 +536,9 @@ static int mlx5_perout_configure(struct ptp_clock_info *ptp,
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (rt_mode)
|
||||
return 0;
|
||||
|
||||
return mlx5_set_mtppse(mdev, pin, 0,
|
||||
MLX5_EVENT_MODE_REPETETIVE & on);
|
||||
}
|
||||
@ -705,20 +706,14 @@ static void ts_next_sec(struct timespec64 *ts)
|
||||
static u64 perout_conf_next_event_timer(struct mlx5_core_dev *mdev,
|
||||
struct mlx5_clock *clock)
|
||||
{
|
||||
bool rt_mode = mlx5_real_time_mode(mdev);
|
||||
struct timespec64 ts;
|
||||
s64 target_ns;
|
||||
|
||||
if (rt_mode)
|
||||
ts = mlx5_ptp_gettimex_real_time(mdev, NULL);
|
||||
else
|
||||
mlx5_ptp_gettimex(&clock->ptp_info, &ts, NULL);
|
||||
|
||||
mlx5_ptp_gettimex(&clock->ptp_info, &ts, NULL);
|
||||
ts_next_sec(&ts);
|
||||
target_ns = timespec64_to_ns(&ts);
|
||||
|
||||
return rt_mode ? perout_conf_real_time(ts.tv_sec, ts.tv_nsec) :
|
||||
find_target_cycles(mdev, target_ns);
|
||||
return find_target_cycles(mdev, target_ns);
|
||||
}
|
||||
|
||||
static int mlx5_pps_event(struct notifier_block *nb,
|
||||
|
@ -13,8 +13,8 @@
|
||||
#endif
|
||||
|
||||
#define MLX5_MAX_IRQ_NAME (32)
|
||||
/* max irq_index is 255. three chars */
|
||||
#define MLX5_MAX_IRQ_IDX_CHARS (3)
|
||||
/* max irq_index is 2047, so four chars */
|
||||
#define MLX5_MAX_IRQ_IDX_CHARS (4)
|
||||
|
||||
#define MLX5_SFS_PER_CTRL_IRQ 64
|
||||
#define MLX5_IRQ_CTRL_SF_MAX 8
|
||||
@ -633,8 +633,9 @@ void mlx5_irq_table_destroy(struct mlx5_core_dev *dev)
|
||||
int mlx5_irq_table_get_sfs_vec(struct mlx5_irq_table *table)
|
||||
{
|
||||
if (table->sf_comp_pool)
|
||||
return table->sf_comp_pool->xa_num_irqs.max -
|
||||
table->sf_comp_pool->xa_num_irqs.min + 1;
|
||||
return min_t(int, num_online_cpus(),
|
||||
table->sf_comp_pool->xa_num_irqs.max -
|
||||
table->sf_comp_pool->xa_num_irqs.min + 1);
|
||||
else
|
||||
return mlx5_irq_table_get_num_comp(table);
|
||||
}
|
||||
|
@ -998,8 +998,8 @@ ocelot_vcap_block_find_filter_by_index(struct ocelot_vcap_block *block,
|
||||
}
|
||||
|
||||
struct ocelot_vcap_filter *
|
||||
ocelot_vcap_block_find_filter_by_id(struct ocelot_vcap_block *block, int cookie,
|
||||
bool tc_offload)
|
||||
ocelot_vcap_block_find_filter_by_id(struct ocelot_vcap_block *block,
|
||||
unsigned long cookie, bool tc_offload)
|
||||
{
|
||||
struct ocelot_vcap_filter *filter;
|
||||
|
||||
|
@ -1292,8 +1292,10 @@ int ionic_lif_addr_add(struct ionic_lif *lif, const u8 *addr)
|
||||
if (err && err != -EEXIST) {
|
||||
/* set the state back to NEW so we can try again later */
|
||||
f = ionic_rx_filter_by_addr(lif, addr);
|
||||
if (f && f->state == IONIC_FILTER_STATE_SYNCED)
|
||||
if (f && f->state == IONIC_FILTER_STATE_SYNCED) {
|
||||
f->state = IONIC_FILTER_STATE_NEW;
|
||||
set_bit(IONIC_LIF_F_FILTER_SYNC_NEEDED, lif->state);
|
||||
}
|
||||
|
||||
spin_unlock_bh(&lif->rx_filters.lock);
|
||||
|
||||
|
@ -349,9 +349,6 @@ void ionic_rx_filter_sync(struct ionic_lif *lif)
|
||||
list_for_each_entry_safe(sync_item, spos, &sync_add_list, list) {
|
||||
(void)ionic_lif_addr_add(lif, sync_item->f.cmd.mac.addr);
|
||||
|
||||
if (sync_item->f.state != IONIC_FILTER_STATE_SYNCED)
|
||||
set_bit(IONIC_LIF_F_FILTER_SYNC_NEEDED, lif->state);
|
||||
|
||||
list_del(&sync_item->list);
|
||||
devm_kfree(dev, sync_item);
|
||||
}
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include <linux/delay.h>
|
||||
#include <linux/mfd/syscon.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
|
||||
#include "stmmac_platform.h"
|
||||
|
||||
@ -1528,6 +1529,8 @@ static int rk_gmac_powerup(struct rk_priv_data *bsp_priv)
|
||||
return ret;
|
||||
}
|
||||
|
||||
pm_runtime_get_sync(dev);
|
||||
|
||||
if (bsp_priv->integrated_phy)
|
||||
rk_gmac_integrated_phy_powerup(bsp_priv);
|
||||
|
||||
@ -1539,6 +1542,8 @@ static void rk_gmac_powerdown(struct rk_priv_data *gmac)
|
||||
if (gmac->integrated_phy)
|
||||
rk_gmac_integrated_phy_powerdown(gmac);
|
||||
|
||||
pm_runtime_put_sync(&gmac->pdev->dev);
|
||||
|
||||
phy_power_on(gmac, false);
|
||||
gmac_clk_enable(gmac, false);
|
||||
}
|
||||
|
@ -477,6 +477,10 @@ bool stmmac_eee_init(struct stmmac_priv *priv)
|
||||
stmmac_lpi_entry_timer_config(priv, 0);
|
||||
del_timer_sync(&priv->eee_ctrl_timer);
|
||||
stmmac_set_eee_timer(priv, priv->hw, 0, eee_tw_timer);
|
||||
if (priv->hw->xpcs)
|
||||
xpcs_config_eee(priv->hw->xpcs,
|
||||
priv->plat->mult_fact_100ns,
|
||||
false);
|
||||
}
|
||||
mutex_unlock(&priv->lock);
|
||||
return false;
|
||||
@ -1038,7 +1042,7 @@ static void stmmac_mac_link_down(struct phylink_config *config,
|
||||
stmmac_mac_set(priv, priv->ioaddr, false);
|
||||
priv->eee_active = false;
|
||||
priv->tx_lpi_enabled = false;
|
||||
stmmac_eee_init(priv);
|
||||
priv->eee_enabled = stmmac_eee_init(priv);
|
||||
stmmac_set_eee_pls(priv, priv->hw, false);
|
||||
|
||||
if (priv->dma_cap.fpesel)
|
||||
|
@ -666,6 +666,10 @@ int xpcs_config_eee(struct dw_xpcs *xpcs, int mult_fact_100ns, int enable)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = xpcs_read(xpcs, MDIO_MMD_VEND2, DW_VR_MII_EEE_MCTRL0);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (enable) {
|
||||
/* Enable EEE */
|
||||
ret = DW_VR_MII_EEE_LTX_EN | DW_VR_MII_EEE_LRX_EN |
|
||||
@ -673,9 +677,6 @@ int xpcs_config_eee(struct dw_xpcs *xpcs, int mult_fact_100ns, int enable)
|
||||
DW_VR_MII_EEE_TX_EN_CTRL | DW_VR_MII_EEE_RX_EN_CTRL |
|
||||
mult_fact_100ns << DW_VR_MII_EEE_MULT_FACT_100NS_SHIFT;
|
||||
} else {
|
||||
ret = xpcs_read(xpcs, MDIO_MMD_VEND2, DW_VR_MII_EEE_MCTRL0);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
ret &= ~(DW_VR_MII_EEE_LTX_EN | DW_VR_MII_EEE_LRX_EN |
|
||||
DW_VR_MII_EEE_TX_QUIET_EN | DW_VR_MII_EEE_RX_QUIET_EN |
|
||||
DW_VR_MII_EEE_TX_EN_CTRL | DW_VR_MII_EEE_RX_EN_CTRL |
|
||||
@ -690,21 +691,28 @@ int xpcs_config_eee(struct dw_xpcs *xpcs, int mult_fact_100ns, int enable)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret |= DW_VR_MII_EEE_TRN_LPI;
|
||||
if (enable)
|
||||
ret |= DW_VR_MII_EEE_TRN_LPI;
|
||||
else
|
||||
ret &= ~DW_VR_MII_EEE_TRN_LPI;
|
||||
|
||||
return xpcs_write(xpcs, MDIO_MMD_VEND2, DW_VR_MII_EEE_MCTRL1, ret);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(xpcs_config_eee);
|
||||
|
||||
static int xpcs_config_aneg_c37_sgmii(struct dw_xpcs *xpcs, unsigned int mode)
|
||||
{
|
||||
int ret;
|
||||
int ret, mdio_ctrl;
|
||||
|
||||
/* For AN for C37 SGMII mode, the settings are :-
|
||||
* 1) VR_MII_AN_CTRL Bit(2:1)[PCS_MODE] = 10b (SGMII AN)
|
||||
* 2) VR_MII_AN_CTRL Bit(3) [TX_CONFIG] = 0b (MAC side SGMII)
|
||||
* 1) VR_MII_MMD_CTRL Bit(12) [AN_ENABLE] = 0b (Disable SGMII AN in case
|
||||
it is already enabled)
|
||||
* 2) VR_MII_AN_CTRL Bit(2:1)[PCS_MODE] = 10b (SGMII AN)
|
||||
* 3) VR_MII_AN_CTRL Bit(3) [TX_CONFIG] = 0b (MAC side SGMII)
|
||||
* DW xPCS used with DW EQoS MAC is always MAC side SGMII.
|
||||
* 3) VR_MII_DIG_CTRL1 Bit(9) [MAC_AUTO_SW] = 1b (Automatic
|
||||
* 4) VR_MII_DIG_CTRL1 Bit(9) [MAC_AUTO_SW] = 1b (Automatic
|
||||
* speed/duplex mode change by HW after SGMII AN complete)
|
||||
* 5) VR_MII_MMD_CTRL Bit(12) [AN_ENABLE] = 1b (Enable SGMII AN)
|
||||
*
|
||||
* Note: Since it is MAC side SGMII, there is no need to set
|
||||
* SR_MII_AN_ADV. MAC side SGMII receives AN Tx Config from
|
||||
@ -712,6 +720,17 @@ static int xpcs_config_aneg_c37_sgmii(struct dw_xpcs *xpcs, unsigned int mode)
|
||||
* between PHY and Link Partner. There is also no need to
|
||||
* trigger AN restart for MAC-side SGMII.
|
||||
*/
|
||||
mdio_ctrl = xpcs_read(xpcs, MDIO_MMD_VEND2, DW_VR_MII_MMD_CTRL);
|
||||
if (mdio_ctrl < 0)
|
||||
return mdio_ctrl;
|
||||
|
||||
if (mdio_ctrl & AN_CL37_EN) {
|
||||
ret = xpcs_write(xpcs, MDIO_MMD_VEND2, DW_VR_MII_MMD_CTRL,
|
||||
mdio_ctrl & ~AN_CL37_EN);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = xpcs_read(xpcs, MDIO_MMD_VEND2, DW_VR_MII_AN_CTRL);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
@ -736,7 +755,15 @@ static int xpcs_config_aneg_c37_sgmii(struct dw_xpcs *xpcs, unsigned int mode)
|
||||
else
|
||||
ret &= ~DW_VR_MII_DIG_CTRL1_MAC_AUTO_SW;
|
||||
|
||||
return xpcs_write(xpcs, MDIO_MMD_VEND2, DW_VR_MII_DIG_CTRL1, ret);
|
||||
ret = xpcs_write(xpcs, MDIO_MMD_VEND2, DW_VR_MII_DIG_CTRL1, ret);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (phylink_autoneg_inband(mode))
|
||||
ret = xpcs_write(xpcs, MDIO_MMD_VEND2, DW_VR_MII_MMD_CTRL,
|
||||
mdio_ctrl | AN_CL37_EN);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int xpcs_config_2500basex(struct dw_xpcs *xpcs)
|
||||
|
@ -538,10 +538,16 @@ int __mdiobus_register(struct mii_bus *bus, struct module *owner)
|
||||
bus->dev.groups = NULL;
|
||||
dev_set_name(&bus->dev, "%s", bus->id);
|
||||
|
||||
/* We need to set state to MDIOBUS_UNREGISTERED to correctly release
|
||||
* the device in mdiobus_free()
|
||||
*
|
||||
* State will be updated later in this function in case of success
|
||||
*/
|
||||
bus->state = MDIOBUS_UNREGISTERED;
|
||||
|
||||
err = device_register(&bus->dev);
|
||||
if (err) {
|
||||
pr_err("mii_bus %s failed to register\n", bus->id);
|
||||
put_device(&bus->dev);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -134,7 +134,7 @@ static const char * const sm_state_strings[] = {
|
||||
[SFP_S_LINK_UP] = "link_up",
|
||||
[SFP_S_TX_FAULT] = "tx_fault",
|
||||
[SFP_S_REINIT] = "reinit",
|
||||
[SFP_S_TX_DISABLE] = "rx_disable",
|
||||
[SFP_S_TX_DISABLE] = "tx_disable",
|
||||
};
|
||||
|
||||
static const char *sm_state_to_str(unsigned short sm_state)
|
||||
|
@ -767,6 +767,7 @@ enum rtl8152_flags {
|
||||
PHY_RESET,
|
||||
SCHEDULE_TASKLET,
|
||||
GREEN_ETHERNET,
|
||||
RX_EPROTO,
|
||||
};
|
||||
|
||||
#define DEVICE_ID_THINKPAD_THUNDERBOLT3_DOCK_GEN2 0x3082
|
||||
@ -1770,6 +1771,14 @@ static void read_bulk_callback(struct urb *urb)
|
||||
rtl_set_unplug(tp);
|
||||
netif_device_detach(tp->netdev);
|
||||
return;
|
||||
case -EPROTO:
|
||||
urb->actual_length = 0;
|
||||
spin_lock_irqsave(&tp->rx_lock, flags);
|
||||
list_add_tail(&agg->list, &tp->rx_done);
|
||||
spin_unlock_irqrestore(&tp->rx_lock, flags);
|
||||
set_bit(RX_EPROTO, &tp->flags);
|
||||
schedule_delayed_work(&tp->schedule, 1);
|
||||
return;
|
||||
case -ENOENT:
|
||||
return; /* the urb is in unlink state */
|
||||
case -ETIME:
|
||||
@ -2425,6 +2434,7 @@ static int rx_bottom(struct r8152 *tp, int budget)
|
||||
if (list_empty(&tp->rx_done))
|
||||
goto out1;
|
||||
|
||||
clear_bit(RX_EPROTO, &tp->flags);
|
||||
INIT_LIST_HEAD(&rx_queue);
|
||||
spin_lock_irqsave(&tp->rx_lock, flags);
|
||||
list_splice_init(&tp->rx_done, &rx_queue);
|
||||
@ -2441,7 +2451,7 @@ static int rx_bottom(struct r8152 *tp, int budget)
|
||||
|
||||
agg = list_entry(cursor, struct rx_agg, list);
|
||||
urb = agg->urb;
|
||||
if (urb->actual_length < ETH_ZLEN)
|
||||
if (urb->status != 0 || urb->actual_length < ETH_ZLEN)
|
||||
goto submit;
|
||||
|
||||
agg_free = rtl_get_free_rx(tp, GFP_ATOMIC);
|
||||
@ -6643,6 +6653,10 @@ static void rtl_work_func_t(struct work_struct *work)
|
||||
netif_carrier_ok(tp->netdev))
|
||||
tasklet_schedule(&tp->tx_tl);
|
||||
|
||||
if (test_and_clear_bit(RX_EPROTO, &tp->flags) &&
|
||||
!list_empty(&tp->rx_done))
|
||||
napi_schedule(&tp->napi);
|
||||
|
||||
mutex_unlock(&tp->control);
|
||||
|
||||
out1:
|
||||
|
@ -3,9 +3,7 @@ config ATH5K
|
||||
tristate "Atheros 5xxx wireless cards support"
|
||||
depends on (PCI || ATH25) && MAC80211
|
||||
select ATH_COMMON
|
||||
select MAC80211_LEDS
|
||||
select LEDS_CLASS
|
||||
select NEW_LEDS
|
||||
select MAC80211_LEDS if LEDS_CLASS=y || LEDS_CLASS=MAC80211
|
||||
select ATH5K_AHB if ATH25
|
||||
select ATH5K_PCI if !ATH25
|
||||
help
|
||||
|
@ -89,7 +89,8 @@ static const struct pci_device_id ath5k_led_devices[] = {
|
||||
|
||||
void ath5k_led_enable(struct ath5k_hw *ah)
|
||||
{
|
||||
if (test_bit(ATH_STAT_LEDSOFT, ah->status)) {
|
||||
if (IS_ENABLED(CONFIG_MAC80211_LEDS) &&
|
||||
test_bit(ATH_STAT_LEDSOFT, ah->status)) {
|
||||
ath5k_hw_set_gpio_output(ah, ah->led_pin);
|
||||
ath5k_led_off(ah);
|
||||
}
|
||||
@ -104,7 +105,8 @@ static void ath5k_led_on(struct ath5k_hw *ah)
|
||||
|
||||
void ath5k_led_off(struct ath5k_hw *ah)
|
||||
{
|
||||
if (!test_bit(ATH_STAT_LEDSOFT, ah->status))
|
||||
if (!IS_ENABLED(CONFIG_MAC80211_LEDS) ||
|
||||
!test_bit(ATH_STAT_LEDSOFT, ah->status))
|
||||
return;
|
||||
ath5k_hw_set_gpio(ah, ah->led_pin, !ah->led_on);
|
||||
}
|
||||
@ -146,7 +148,7 @@ ath5k_register_led(struct ath5k_hw *ah, struct ath5k_led *led,
|
||||
static void
|
||||
ath5k_unregister_led(struct ath5k_led *led)
|
||||
{
|
||||
if (!led->ah)
|
||||
if (!IS_ENABLED(CONFIG_MAC80211_LEDS) || !led->ah)
|
||||
return;
|
||||
led_classdev_unregister(&led->led_dev);
|
||||
ath5k_led_off(led->ah);
|
||||
@ -169,7 +171,7 @@ int ath5k_init_leds(struct ath5k_hw *ah)
|
||||
char name[ATH5K_LED_MAX_NAME_LEN + 1];
|
||||
const struct pci_device_id *match;
|
||||
|
||||
if (!ah->pdev)
|
||||
if (!IS_ENABLED(CONFIG_MAC80211_LEDS) || !ah->pdev)
|
||||
return 0;
|
||||
|
||||
#ifdef CONFIG_ATH5K_AHB
|
||||
|
@ -7463,23 +7463,18 @@ static s32 brcmf_translate_country_code(struct brcmf_pub *drvr, char alpha2[2],
|
||||
s32 found_index;
|
||||
int i;
|
||||
|
||||
country_codes = drvr->settings->country_codes;
|
||||
if (!country_codes) {
|
||||
brcmf_dbg(TRACE, "No country codes configured for device\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if ((alpha2[0] == ccreq->country_abbrev[0]) &&
|
||||
(alpha2[1] == ccreq->country_abbrev[1])) {
|
||||
brcmf_dbg(TRACE, "Country code already set\n");
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
country_codes = drvr->settings->country_codes;
|
||||
if (!country_codes) {
|
||||
brcmf_dbg(TRACE, "No country codes configured for device, using ISO3166 code and 0 rev\n");
|
||||
memset(ccreq, 0, sizeof(*ccreq));
|
||||
ccreq->country_abbrev[0] = alpha2[0];
|
||||
ccreq->country_abbrev[1] = alpha2[1];
|
||||
ccreq->ccode[0] = alpha2[0];
|
||||
ccreq->ccode[1] = alpha2[1];
|
||||
return 0;
|
||||
}
|
||||
|
||||
found_index = -1;
|
||||
for (i = 0; i < country_codes->table_size; i++) {
|
||||
cc = &country_codes->table[i];
|
||||
|
@ -160,6 +160,7 @@ static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw,
|
||||
mvm->ptk_icvlen = key->icv_len;
|
||||
mvm->gtk_ivlen = key->iv_len;
|
||||
mvm->gtk_icvlen = key->icv_len;
|
||||
mutex_unlock(&mvm->mutex);
|
||||
|
||||
/* don't upload key again */
|
||||
return;
|
||||
@ -360,11 +361,11 @@ static void iwl_mvm_wowlan_get_rsc_v5_data(struct ieee80211_hw *hw,
|
||||
if (sta) {
|
||||
rsc = data->rsc->ucast_rsc;
|
||||
} else {
|
||||
if (WARN_ON(data->gtks > ARRAY_SIZE(data->gtk_ids)))
|
||||
if (WARN_ON(data->gtks >= ARRAY_SIZE(data->gtk_ids)))
|
||||
return;
|
||||
data->gtk_ids[data->gtks] = key->keyidx;
|
||||
rsc = data->rsc->mcast_rsc[data->gtks % 2];
|
||||
if (WARN_ON(key->keyidx >
|
||||
if (WARN_ON(key->keyidx >=
|
||||
ARRAY_SIZE(data->rsc->mcast_key_id_map)))
|
||||
return;
|
||||
data->rsc->mcast_key_id_map[key->keyidx] = data->gtks % 2;
|
||||
|
@ -662,12 +662,13 @@ static bool __iwl_mvm_remove_time_event(struct iwl_mvm *mvm,
|
||||
u32 *uid)
|
||||
{
|
||||
u32 id;
|
||||
struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(te_data->vif);
|
||||
struct iwl_mvm_vif *mvmvif;
|
||||
enum nl80211_iftype iftype;
|
||||
|
||||
if (!te_data->vif)
|
||||
return false;
|
||||
|
||||
mvmvif = iwl_mvm_vif_from_mac80211(te_data->vif);
|
||||
iftype = te_data->vif->type;
|
||||
|
||||
/*
|
||||
|
@ -547,6 +547,8 @@ static const struct iwl_dev_info iwl_dev_info_table[] = {
|
||||
IWL_DEV_INFO(0x43F0, 0x0074, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x43F0, 0x0078, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x43F0, 0x007C, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x43F0, 0x1651, killer1650s_2ax_cfg_qu_b0_hr_b0, iwl_ax201_killer_1650s_name),
|
||||
IWL_DEV_INFO(0x43F0, 0x1652, killer1650i_2ax_cfg_qu_b0_hr_b0, iwl_ax201_killer_1650i_name),
|
||||
IWL_DEV_INFO(0x43F0, 0x2074, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0x43F0, 0x4070, iwl_ax201_cfg_qu_hr, NULL),
|
||||
IWL_DEV_INFO(0xA0F0, 0x0070, iwl_ax201_cfg_qu_hr, NULL),
|
||||
|
@ -62,8 +62,8 @@ void *mwifiex_process_sta_txpd(struct mwifiex_private *priv,
|
||||
|
||||
pkt_type = mwifiex_is_skb_mgmt_frame(skb) ? PKT_TYPE_MGMT : 0;
|
||||
|
||||
pad = ((void *)skb->data - (sizeof(*local_tx_pd) + hroom)-
|
||||
NULL) & (MWIFIEX_DMA_ALIGN_SZ - 1);
|
||||
pad = ((uintptr_t)skb->data - (sizeof(*local_tx_pd) + hroom)) &
|
||||
(MWIFIEX_DMA_ALIGN_SZ - 1);
|
||||
skb_push(skb, sizeof(*local_tx_pd) + pad);
|
||||
|
||||
local_tx_pd = (struct txpd *) skb->data;
|
||||
|
@ -475,8 +475,8 @@ void *mwifiex_process_uap_txpd(struct mwifiex_private *priv,
|
||||
|
||||
pkt_type = mwifiex_is_skb_mgmt_frame(skb) ? PKT_TYPE_MGMT : 0;
|
||||
|
||||
pad = ((void *)skb->data - (sizeof(*txpd) + hroom) - NULL) &
|
||||
(MWIFIEX_DMA_ALIGN_SZ - 1);
|
||||
pad = ((uintptr_t)skb->data - (sizeof(*txpd) + hroom)) &
|
||||
(MWIFIEX_DMA_ALIGN_SZ - 1);
|
||||
|
||||
skb_push(skb, sizeof(*txpd) + pad);
|
||||
|
||||
|
@ -3301,9 +3301,17 @@ static int hv_pci_bus_exit(struct hv_device *hdev, bool keep_devs)
|
||||
return 0;
|
||||
|
||||
if (!keep_devs) {
|
||||
/* Delete any children which might still exist. */
|
||||
struct list_head removed;
|
||||
|
||||
/* Move all present children to the list on stack */
|
||||
INIT_LIST_HEAD(&removed);
|
||||
spin_lock_irqsave(&hbus->device_list_lock, flags);
|
||||
list_for_each_entry_safe(hpdev, tmp, &hbus->children, list_entry) {
|
||||
list_for_each_entry_safe(hpdev, tmp, &hbus->children, list_entry)
|
||||
list_move_tail(&hpdev->list_entry, &removed);
|
||||
spin_unlock_irqrestore(&hbus->device_list_lock, flags);
|
||||
|
||||
/* Remove all children in the list */
|
||||
list_for_each_entry_safe(hpdev, tmp, &removed, list_entry) {
|
||||
list_del(&hpdev->list_entry);
|
||||
if (hpdev->pci_slot)
|
||||
pci_destroy_slot(hpdev->pci_slot);
|
||||
@ -3311,7 +3319,6 @@ static int hv_pci_bus_exit(struct hv_device *hdev, bool keep_devs)
|
||||
put_pcichild(hpdev);
|
||||
put_pcichild(hpdev);
|
||||
}
|
||||
spin_unlock_irqrestore(&hbus->device_list_lock, flags);
|
||||
}
|
||||
|
||||
ret = hv_send_resources_released(hdev);
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user