mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-23 15:32:33 +00:00
layerscape: add ls1088ardb device support
LS1088A is an ARMv8 implementation combining eight ARM A53 processor cores. The LS1088ARDB is an evaluatoin platform that supports the LS1088A family SoCs. Features summary: - Eight 64-bit ARM v8 Cortex-A53 CPUs - Data path acceleration architecture 2.0 (DPAA2) - Ethernet interfaces - QUADSPI flash, 3 PCIe, 2 USB, 1 SD, 2 DUARTs etc Signed-off-by: Yutang Jiang <yutang.jiang@nxp.com>
This commit is contained in:
parent
c6d3a62919
commit
1866368a8a
@ -169,6 +169,8 @@ CONFIG_I2C=y
|
||||
CONFIG_I2C_BOARDINFO=y
|
||||
CONFIG_I2C_CHARDEV=y
|
||||
CONFIG_I2C_IMX=y
|
||||
CONFIG_I2C_MUX=y
|
||||
CONFIG_I2C_MUX_PCA954x=y
|
||||
# CONFIG_IMX2_WDT is not set
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_IOMMU_HELPER=y
|
||||
@ -296,3 +298,14 @@ CONFIG_XPS=y
|
||||
CONFIG_ZLIB_INFLATE=y
|
||||
CONFIG_MTD_SPI_NOR=y
|
||||
CONFIG_SPI_FSL_QUADSPI=y
|
||||
CONFIG_FSL_MC_BUS=y
|
||||
CONFIG_FSL_MC_RESTOOL=y
|
||||
CONFIG_FSL_MC_DPIO=y
|
||||
# CONFIG_FSL_QBMAN_DEBUG is not set
|
||||
CONFIG_FSL_DPAA2=y
|
||||
CONFIG_FSL_DPAA2_ETH=y
|
||||
# CONFIG_FSL_DPAA2_ETH_USE_ERR_QUEUE is not set
|
||||
CONFIG_FSL_DPAA2_MAC=y
|
||||
# CONFIG_FSL_DPAA2_MAC_NETDEVS is not set
|
||||
CONFIG_FSL_DPAA2_EVB=y
|
||||
CONFIG_FSL_DPAA2_ETHSW=y
|
||||
|
@ -92,4 +92,18 @@ endif
|
||||
endef
|
||||
TARGET_DEVICES += ls1012ardb
|
||||
|
||||
define Device/ls1088ardb
|
||||
DEVICE_TITLE := ls1088ardb-$(SUBTARGET)
|
||||
DEVICE_PACKAGES += rcw-layerscape-ls1088ardb uboot-layerscape-$(SUBTARGET)-ls1088ardb mc-binary-ls1088ardb
|
||||
ifeq ($(SUBTARGET),64b)
|
||||
DEVICE_DTS = freescale/fsl-ls1088a-rdb
|
||||
endif
|
||||
ifeq ($(SUBTARGET),32b)
|
||||
DEVICE_DTS = ../../../arm64/boot/dts/freescale/fsl-ls1088a-rdb
|
||||
endif
|
||||
IMAGE/firmware.bin = append-ls-dtb $$(DEVICE_DTS) | pad-to 1M | append-kernel | pad-to 6M | \
|
||||
append-ls-rootfs-ext4 $(1) 17M | check-size 24117249
|
||||
endef
|
||||
TARGET_DEVICES += ls1088ardb
|
||||
|
||||
$(eval $(call BuildImage))
|
||||
|
@ -0,0 +1,790 @@
|
||||
From cbacf87fa6fb262c98033405f15697798c3a9c5d Mon Sep 17 00:00:00 2001
|
||||
From: Zhao Qiang <qiang.zhao@nxp.com>
|
||||
Date: Sun, 9 Oct 2016 14:31:50 +0800
|
||||
Subject: [PATCH 135/141] arm64: Add DTS support for FSL's LS1088ARDB
|
||||
|
||||
Signed-off-by: Zhao Qiang <qiang.zhao@nxp.com>
|
||||
---
|
||||
arch/arm64/boot/dts/freescale/Makefile | 1 +
|
||||
arch/arm64/boot/dts/freescale/fsl-ls1088a-rdb.dts | 203 ++++++++
|
||||
arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi | 557 +++++++++++++++++++++
|
||||
3 files changed, 761 insertions(+)
|
||||
create mode 100644 arch/arm64/boot/dts/freescale/fsl-ls1088a-rdb.dts
|
||||
create mode 100644 arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi
|
||||
|
||||
--- a/arch/arm64/boot/dts/freescale/Makefile
|
||||
+++ b/arch/arm64/boot/dts/freescale/Makefile
|
||||
@@ -5,6 +5,7 @@ dtb-$(CONFIG_ARCH_LAYERSCAPE) += fsl-ls1
|
||||
dtb-$(CONFIG_ARCH_LAYERSCAPE) += fsl-ls1012a-rdb.dtb
|
||||
dtb-$(CONFIG_ARCH_LAYERSCAPE) += fsl-ls1012a-frdm.dtb
|
||||
dtb-$(CONFIG_ARCH_LAYERSCAPE) += fsl-ls1046a-rdb.dtb
|
||||
+dtb-$(CONFIG_ARCH_LAYERSCAPE) += fsl-ls1088a-rdb.dtb
|
||||
|
||||
always := $(dtb-y)
|
||||
subdir-y := $(dts-dirs)
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/freescale/fsl-ls1088a-rdb.dts
|
||||
@@ -0,0 +1,203 @@
|
||||
+/*
|
||||
+ * Device Tree file for Freescale LS1088a RDB board
|
||||
+ *
|
||||
+ * Copyright (C) 2015, Freescale Semiconductor
|
||||
+ *
|
||||
+ * This file is licensed under the terms of the GNU General Public
|
||||
+ * License version 2. This program is licensed "as is" without any
|
||||
+ * warranty of any kind, whether express or implied.
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "fsl-ls1088a.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ model = "Freescale Layerscape 1088a RDB Board";
|
||||
+ compatible = "fsl,ls1088a-rdb", "fsl,ls1088a";
|
||||
+};
|
||||
+
|
||||
+&esdhc {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&ifc {
|
||||
+ status = "disabled";
|
||||
+};
|
||||
+
|
||||
+&ftm0 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&i2c0 {
|
||||
+ status = "okay";
|
||||
+ pca9547@77 {
|
||||
+ compatible = "philips,pca9547";
|
||||
+ reg = <0x77>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ i2c@2 {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ reg = <0x2>;
|
||||
+
|
||||
+ ina220@40 {
|
||||
+ compatible = "ti,ina220";
|
||||
+ reg = <0x40>;
|
||||
+ shunt-resistor = <1000>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ i2c@3 {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ reg = <0x3>;
|
||||
+
|
||||
+ rtc@51 {
|
||||
+ compatible = "nxp,pcf2129";
|
||||
+ reg = <0x51>;
|
||||
+ /* IRQ10_B */
|
||||
+ interrupts = <0 150 0x4>;
|
||||
+ };
|
||||
+
|
||||
+ adt7461a@4c {
|
||||
+ compatible = "adt7461a";
|
||||
+ reg = <0x4c>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&i2c1 {
|
||||
+ status = "disabled";
|
||||
+};
|
||||
+
|
||||
+&i2c2 {
|
||||
+ status = "disabled";
|
||||
+};
|
||||
+
|
||||
+&i2c3 {
|
||||
+ status = "disabled";
|
||||
+};
|
||||
+
|
||||
+&dspi {
|
||||
+ status = "disabled";
|
||||
+};
|
||||
+
|
||||
+&qspi {
|
||||
+ status = "okay";
|
||||
+ qflash0: s25fs512s@0 {
|
||||
+ compatible = "spansion,m25p80";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ spi-max-frequency = <20000000>;
|
||||
+ reg = <0>;
|
||||
+ };
|
||||
+
|
||||
+ qflash1: s25fs512s@1 {
|
||||
+ compatible = "spansion,m25p80";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ spi-max-frequency = <20000000>;
|
||||
+ reg = <1>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&sata0 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&usb0 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&usb1 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&serial0 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&serial1 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&emdio1 {
|
||||
+ /* Freescale F104 PHY1 */
|
||||
+ mdio1_phy1: emdio1_phy@1 {
|
||||
+ reg = <0x1c>;
|
||||
+ phy-connection-type = "qsgmii";
|
||||
+ };
|
||||
+ mdio1_phy2: emdio1_phy@2 {
|
||||
+ reg = <0x1d>;
|
||||
+ phy-connection-type = "qsgmii";
|
||||
+ };
|
||||
+ mdio1_phy3: emdio1_phy@3 {
|
||||
+ reg = <0x1e>;
|
||||
+ phy-connection-type = "qsgmii";
|
||||
+ };
|
||||
+ mdio1_phy4: emdio1_phy@4 {
|
||||
+ reg = <0x1f>;
|
||||
+ phy-connection-type = "qsgmii";
|
||||
+ };
|
||||
+ /* F104 PHY2 */
|
||||
+ mdio1_phy5: emdio1_phy@5 {
|
||||
+ reg = <0x0c>;
|
||||
+ phy-connection-type = "qsgmii";
|
||||
+ };
|
||||
+ mdio1_phy6: emdio1_phy@6 {
|
||||
+ reg = <0x0d>;
|
||||
+ phy-connection-type = "qsgmii";
|
||||
+ };
|
||||
+ mdio1_phy7: emdio1_phy@7 {
|
||||
+ reg = <0x0e>;
|
||||
+ phy-connection-type = "qsgmii";
|
||||
+ };
|
||||
+ mdio1_phy8: emdio1_phy@8 {
|
||||
+ reg = <0x0f>;
|
||||
+ phy-connection-type = "qsgmii";
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&emdio2 {
|
||||
+ /* Aquantia AQR105 10G PHY */
|
||||
+ mdio2_phy1: emdio2_phy@1 {
|
||||
+ compatible = "ethernet-phy-ieee802.3-c45";
|
||||
+ reg = <0x0>;
|
||||
+ phy-connection-type = "xfi";
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+/* DPMAC connections to external PHYs
|
||||
+ * based on LS1088A RM RevC - $24.1.2 SerDes Options
|
||||
+ */
|
||||
+/* DPMAC1 is 10G SFP+, fixed link */
|
||||
+&dpmac2 {
|
||||
+ phy-handle = <&mdio2_phy1>;
|
||||
+};
|
||||
+&dpmac3 {
|
||||
+ phy-handle = <&mdio1_phy5>;
|
||||
+};
|
||||
+&dpmac4 {
|
||||
+ phy-handle = <&mdio1_phy6>;
|
||||
+};
|
||||
+&dpmac5 {
|
||||
+ phy-handle = <&mdio1_phy7>;
|
||||
+};
|
||||
+&dpmac6 {
|
||||
+ phy-handle = <&mdio1_phy8>;
|
||||
+};
|
||||
+&dpmac7 {
|
||||
+ phy-handle = <&mdio1_phy1>;
|
||||
+};
|
||||
+&dpmac8 {
|
||||
+ phy-handle = <&mdio1_phy2>;
|
||||
+};
|
||||
+&dpmac9 {
|
||||
+ phy-handle = <&mdio1_phy3>;
|
||||
+};
|
||||
+&dpmac10 {
|
||||
+ phy-handle = <&mdio1_phy4>;
|
||||
+};
|
||||
--- /dev/null
|
||||
+++ b/arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi
|
||||
@@ -0,0 +1,557 @@
|
||||
+/*
|
||||
+ * Device Tree Include file for Freescale Layerscape-1088A family SoC.
|
||||
+ *
|
||||
+ * Copyright (C) 2015, Freescale Semiconductor
|
||||
+ *
|
||||
+ */
|
||||
+
|
||||
+/memreserve/ 0x80000000 0x00010000;
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "fsl,ls1088a";
|
||||
+ interrupt-parent = <&gic>;
|
||||
+ #address-cells = <2>;
|
||||
+ #size-cells = <2>;
|
||||
+
|
||||
+ cpus {
|
||||
+ #address-cells = <2>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ /* We have 2 clusters having 4 Cortex-A57 cores each */
|
||||
+ cpu0: cpu@0 {
|
||||
+ device_type = "cpu";
|
||||
+ compatible = "arm,cortex-a53";
|
||||
+ reg = <0x0 0x0>;
|
||||
+ clocks = <&clockgen 1 0>;
|
||||
+ };
|
||||
+
|
||||
+ cpu1: cpu@1 {
|
||||
+ device_type = "cpu";
|
||||
+ compatible = "arm,cortex-a53";
|
||||
+ reg = <0x0 0x1>;
|
||||
+ clocks = <&clockgen 1 0>;
|
||||
+ };
|
||||
+
|
||||
+ cpu2: cpu@2 {
|
||||
+ device_type = "cpu";
|
||||
+ compatible = "arm,cortex-a53";
|
||||
+ reg = <0x0 0x2>;
|
||||
+ clocks = <&clockgen 1 0>;
|
||||
+ };
|
||||
+
|
||||
+ cpu3: cpu@3 {
|
||||
+ device_type = "cpu";
|
||||
+ compatible = "arm,cortex-a53";
|
||||
+ reg = <0x0 0x3>;
|
||||
+ clocks = <&clockgen 1 0>;
|
||||
+ };
|
||||
+
|
||||
+ cpu4: cpu@100 {
|
||||
+ device_type = "cpu";
|
||||
+ compatible = "arm,cortex-a53";
|
||||
+ reg = <0x0 0x100>;
|
||||
+ clocks = <&clockgen 1 1>;
|
||||
+ };
|
||||
+
|
||||
+ cpu5: cpu@101 {
|
||||
+ device_type = "cpu";
|
||||
+ compatible = "arm,cortex-a53";
|
||||
+ reg = <0x0 0x101>;
|
||||
+ clocks = <&clockgen 1 1>;
|
||||
+ };
|
||||
+
|
||||
+ cpu6: cpu@102 {
|
||||
+ device_type = "cpu";
|
||||
+ compatible = "arm,cortex-a53";
|
||||
+ reg = <0x0 0x102>;
|
||||
+ clocks = <&clockgen 1 1>;
|
||||
+ };
|
||||
+
|
||||
+ cpu7: cpu@103 {
|
||||
+ device_type = "cpu";
|
||||
+ compatible = "arm,cortex-a53";
|
||||
+ reg = <0x0 0x103>;
|
||||
+ clocks = <&clockgen 1 1>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ pmu {
|
||||
+ compatible = "arm,armv8-pmuv3";
|
||||
+ interrupts = <1 7 0x8>; /* PMU PPI, Level low type */
|
||||
+ };
|
||||
+
|
||||
+ gic: interrupt-controller@6000000 {
|
||||
+ compatible = "arm,gic-v3";
|
||||
+ reg = <0x0 0x06000000 0 0x10000>, /* GIC Dist */
|
||||
+ <0x0 0x06100000 0 0x100000>, /* GICR(RD_base+SGI_base)*/
|
||||
+ <0x0 0x0c0c0000 0 0x2000>, /* GICC */
|
||||
+ <0x0 0x0c0d0000 0 0x1000>, /* GICH */
|
||||
+ <0x0 0x0c0e0000 0 0x20000>; /* GICV */
|
||||
+ #interrupt-cells = <3>;
|
||||
+ #address-cells = <2>;
|
||||
+ #size-cells = <2>;
|
||||
+ ranges;
|
||||
+ interrupt-controller;
|
||||
+ interrupts = <1 9 0x4>;
|
||||
+
|
||||
+ its: gic-its@6020000 {
|
||||
+ compatible = "arm,gic-v3-its";
|
||||
+ msi-controller;
|
||||
+ reg = <0x0 0x6020000 0 0x20000>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ sysclk: sysclk {
|
||||
+ compatible = "fixed-clock";
|
||||
+ #clock-cells = <0>;
|
||||
+ clock-frequency = <100000000>;
|
||||
+ clock-output-names = "sysclk";
|
||||
+ };
|
||||
+
|
||||
+ clockgen: clocking@1300000 {
|
||||
+ compatible = "fsl,ls2080a-clockgen", "fsl,ls1088a-clockgen";
|
||||
+ reg = <0 0x1300000 0 0xa0000>;
|
||||
+ #clock-cells = <2>;
|
||||
+ clocks = <&sysclk>;
|
||||
+ };
|
||||
+
|
||||
+ serial0: serial@21c0500 {
|
||||
+ device_type = "serial";
|
||||
+ compatible = "fsl,ns16550", "ns16550a";
|
||||
+ reg = <0x0 0x21c0500 0x0 0x100>;
|
||||
+ clocks = <&clockgen 4 3>;
|
||||
+ interrupts = <0 32 0x4>; /* Level high type */
|
||||
+ };
|
||||
+
|
||||
+ serial1: serial@21c0600 {
|
||||
+ device_type = "serial";
|
||||
+ compatible = "fsl,ns16550", "ns16550a";
|
||||
+ reg = <0x0 0x21c0600 0x0 0x100>;
|
||||
+ clocks = <&clockgen 4 3>;
|
||||
+ interrupts = <0 32 0x4>; /* Level high type */
|
||||
+ };
|
||||
+
|
||||
+ gpio0: gpio@2300000 {
|
||||
+ compatible = "fsl,qoriq-gpio";
|
||||
+ reg = <0x0 0x2300000 0x0 0x10000>;
|
||||
+ interrupts = <0 36 0x4>; /* Level high type */
|
||||
+ gpio-controller;
|
||||
+ little-endian;
|
||||
+ #gpio-cells = <2>;
|
||||
+ interrupt-controller;
|
||||
+ #interrupt-cells = <2>;
|
||||
+ };
|
||||
+
|
||||
+ gpio1: gpio@2310000 {
|
||||
+ compatible = "fsl,qoriq-gpio";
|
||||
+ reg = <0x0 0x2310000 0x0 0x10000>;
|
||||
+ interrupts = <0 36 0x4>; /* Level high type */
|
||||
+ gpio-controller;
|
||||
+ little-endian;
|
||||
+ #gpio-cells = <2>;
|
||||
+ interrupt-controller;
|
||||
+ #interrupt-cells = <2>;
|
||||
+ };
|
||||
+
|
||||
+ gpio2: gpio@2320000 {
|
||||
+ compatible = "fsl,qoriq-gpio";
|
||||
+ reg = <0x0 0x2320000 0x0 0x10000>;
|
||||
+ interrupts = <0 37 0x4>; /* Level high type */
|
||||
+ gpio-controller;
|
||||
+ little-endian;
|
||||
+ #gpio-cells = <2>;
|
||||
+ interrupt-controller;
|
||||
+ #interrupt-cells = <2>;
|
||||
+ };
|
||||
+
|
||||
+ gpio3: gpio@2330000 {
|
||||
+ compatible = "fsl,qoriq-gpio";
|
||||
+ reg = <0x0 0x2330000 0x0 0x10000>;
|
||||
+ interrupts = <0 37 0x4>; /* Level high type */
|
||||
+ gpio-controller;
|
||||
+ little-endian;
|
||||
+ #gpio-cells = <2>;
|
||||
+ interrupt-controller;
|
||||
+ #interrupt-cells = <2>;
|
||||
+ };
|
||||
+
|
||||
+ /* TODO: WRIOP (CCSR?) */
|
||||
+ emdio1: mdio@0x8B96000 { /* WRIOP0: 0x8B8_0000, E-MDIO1: 0x1_6000 */
|
||||
+ compatible = "fsl,fman-memac-mdio";
|
||||
+ reg = <0x0 0x8B96000 0x0 0x1000>;
|
||||
+ device_type = "mdio";
|
||||
+ little-endian; /* force the driver in LE mode */
|
||||
+
|
||||
+ /* Not necessary on the QDS, but needed on the RDB */
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ };
|
||||
+
|
||||
+ emdio2: mdio@0x8B97000 { /* WRIOP0: 0x8B8_0000, E-MDIO2: 0x1_7000 */
|
||||
+ compatible = "fsl,fman-memac-mdio";
|
||||
+ reg = <0x0 0x8B97000 0x0 0x1000>;
|
||||
+ device_type = "mdio";
|
||||
+ little-endian; /* force the driver in LE mode */
|
||||
+
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ };
|
||||
+
|
||||
+ ifc: ifc@2240000 {
|
||||
+ compatible = "fsl,ifc", "simple-bus";
|
||||
+ reg = <0x0 0x2240000 0x0 0x20000>;
|
||||
+ interrupts = <0 21 0x4>; /* Level high type */
|
||||
+ little-endian;
|
||||
+ #address-cells = <2>;
|
||||
+ #size-cells = <1>;
|
||||
+
|
||||
+ ranges = <0 0 0x5 0x80000000 0x08000000
|
||||
+ 2 0 0x5 0x30000000 0x00010000
|
||||
+ 3 0 0x5 0x20000000 0x00010000>;
|
||||
+ };
|
||||
+
|
||||
+ esdhc: esdhc@2140000 {
|
||||
+ compatible = "fsl,ls2080a-esdhc", "fsl,ls1088a-esdhc", "fsl,esdhc";
|
||||
+ reg = <0x0 0x2140000 0x0 0x10000>;
|
||||
+ interrupts = <0 28 0x4>; /* Level high type */
|
||||
+ clock-frequency = <0>;
|
||||
+ voltage-ranges = <1800 1800 3300 3300>;
|
||||
+ sdhci,auto-cmd12;
|
||||
+ little-endian;
|
||||
+ bus-width = <4>;
|
||||
+ };
|
||||
+
|
||||
+ ftm0: ftm0@2800000 {
|
||||
+ compatible = "fsl,ftm-alarm";
|
||||
+ reg = <0x0 0x2800000 0x0 0x10000>;
|
||||
+ interrupts = <0 44 4>;
|
||||
+ };
|
||||
+
|
||||
+ reset: reset@1E60000 {
|
||||
+ compatible = "fsl,ls-reset";
|
||||
+ reg = <0x0 0x1E60000 0x0 0x10000>;
|
||||
+ };
|
||||
+
|
||||
+ dspi: dspi@2100000 {
|
||||
+ compatible = "fsl,ls2085a-dspi", "fsl,ls1088a-dspi";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ reg = <0x0 0x2100000 0x0 0x10000>;
|
||||
+ interrupts = <0 26 0x4>; /* Level high type */
|
||||
+ clocks = <&clockgen 4 3>;
|
||||
+ clock-names = "dspi";
|
||||
+ spi-num-chipselects = <5>;
|
||||
+ bus-num = <0>;
|
||||
+ };
|
||||
+
|
||||
+ i2c0: i2c@2000000 {
|
||||
+ compatible = "fsl,vf610-i2c";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ reg = <0x0 0x2000000 0x0 0x10000>;
|
||||
+ interrupts = <0 34 0x4>; /* Level high type */
|
||||
+ clock-names = "i2c";
|
||||
+ clocks = <&clockgen 4 3>;
|
||||
+ };
|
||||
+
|
||||
+ i2c1: i2c@2010000 {
|
||||
+ compatible = "fsl,vf610-i2c";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ reg = <0x0 0x2010000 0x0 0x10000>;
|
||||
+ interrupts = <0 34 0x4>; /* Level high type */
|
||||
+ clock-names = "i2c";
|
||||
+ clocks = <&clockgen 4 3>;
|
||||
+ };
|
||||
+
|
||||
+ i2c2: i2c@2020000 {
|
||||
+ compatible = "fsl,vf610-i2c";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ reg = <0x0 0x2020000 0x0 0x10000>;
|
||||
+ interrupts = <0 35 0x4>; /* Level high type */
|
||||
+ clock-names = "i2c";
|
||||
+ clocks = <&clockgen 4 3>;
|
||||
+ };
|
||||
+
|
||||
+ i2c3: i2c@2030000 {
|
||||
+ compatible = "fsl,vf610-i2c";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ reg = <0x0 0x2030000 0x0 0x10000>;
|
||||
+ interrupts = <0 35 0x4>; /* Level high type */
|
||||
+ clock-names = "i2c";
|
||||
+ clocks = <&clockgen 4 3>;
|
||||
+ };
|
||||
+
|
||||
+ qspi: quadspi@20c0000 {
|
||||
+ compatible = "fsl,ls2080a-qspi", "fsl,ls1088a-qspi";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ reg = <0x0 0x20c0000 0x0 0x10000>,
|
||||
+ <0x0 0x20000000 0x0 0x10000000>;
|
||||
+ reg-names = "QuadSPI", "QuadSPI-memory";
|
||||
+ interrupts = <0 25 0x4>; /* Level high type */
|
||||
+ clocks = <&clockgen 4 3>, <&clockgen 4 3>;
|
||||
+ clock-names = "qspi_en", "qspi";
|
||||
+ };
|
||||
+
|
||||
+ pcie@3400000 {
|
||||
+ compatible = "fsl,ls1088a-pcie", "snps,dw-pcie";
|
||||
+ reg = <0x00 0x03400000 0x0 0x00100000 /* controller registers */
|
||||
+ 0x20 0x00000000 0x0 0x00002000>; /* configuration space */
|
||||
+ reg-names = "regs", "config";
|
||||
+ interrupts = <0 108 0x4>; /* aer interrupt */
|
||||
+ interrupt-names = "aer";
|
||||
+ #address-cells = <3>;
|
||||
+ #size-cells = <2>;
|
||||
+ device_type = "pci";
|
||||
+ dma-coherent;
|
||||
+ num-lanes = <4>;
|
||||
+ bus-range = <0x0 0xff>;
|
||||
+ ranges = <0x81000000 0x0 0x00000000 0x20 0x00010000 0x0 0x00010000 /* downstream I/O */
|
||||
+ 0x82000000 0x0 0x40000000 0x20 0x40000000 0x0 0x40000000>; /* non-prefetchable memory */
|
||||
+ msi-parent = <&its>;
|
||||
+ #interrupt-cells = <1>;
|
||||
+ interrupt-map-mask = <0 0 0 7>;
|
||||
+ interrupt-map = <0000 0 0 1 &gic 0 0 0 109 4>,
|
||||
+ <0000 0 0 2 &gic 0 0 0 110 4>,
|
||||
+ <0000 0 0 3 &gic 0 0 0 111 4>,
|
||||
+ <0000 0 0 4 &gic 0 0 0 112 4>;
|
||||
+ };
|
||||
+ pcie@3500000 {
|
||||
+ compatible = "fsl,ls1088a-pcie", "snps,dw-pcie";
|
||||
+ reg = <0x00 0x03500000 0x0 0x00100000 /* controller registers */
|
||||
+ 0x28 0x00000000 0x0 0x00002000>; /* configuration space */
|
||||
+ reg-names = "regs", "config";
|
||||
+ interrupts = <0 113 0x4>; /* aer interrupt */
|
||||
+ interrupt-names = "aer";
|
||||
+ #address-cells = <3>;
|
||||
+ #size-cells = <2>;
|
||||
+ device_type = "pci";
|
||||
+ dma-coherent;
|
||||
+ num-lanes = <4>;
|
||||
+ bus-range = <0x0 0xff>;
|
||||
+ ranges = <0x81000000 0x0 0x00000000 0x28 0x00010000 0x0 0x00010000 /* downstream I/O */
|
||||
+ 0x82000000 0x0 0x40000000 0x28 0x40000000 0x0 0x40000000>; /* non-prefetchable memory */
|
||||
+ msi-parent = <&its>;
|
||||
+ #interrupt-cells = <1>;
|
||||
+ interrupt-map-mask = <0 0 0 7>;
|
||||
+ interrupt-map = <0000 0 0 1 &gic 0 0 0 114 4>,
|
||||
+ <0000 0 0 2 &gic 0 0 0 115 4>,
|
||||
+ <0000 0 0 3 &gic 0 0 0 116 4>,
|
||||
+ <0000 0 0 4 &gic 0 0 0 117 4>;
|
||||
+ };
|
||||
+
|
||||
+ pcie@3600000 {
|
||||
+ compatible = "fsl,ls1088a-pcie", "snps,dw-pcie";
|
||||
+ reg = <0x00 0x03600000 0x0 0x00100000 /* controller registers */
|
||||
+ 0x30 0x00000000 0x0 0x00002000>; /* configuration space */
|
||||
+ reg-names = "regs", "config";
|
||||
+ interrupts = <0 118 0x4>; /* aer interrupt */
|
||||
+ interrupt-names = "aer";
|
||||
+ #address-cells = <3>;
|
||||
+ #size-cells = <2>;
|
||||
+ device_type = "pci";
|
||||
+ dma-coherent;
|
||||
+ num-lanes = <8>;
|
||||
+ bus-range = <0x0 0xff>;
|
||||
+ ranges = <0x81000000 0x0 0x00000000 0x30 0x00010000 0x0 0x00010000 /* downstream I/O */
|
||||
+ 0x82000000 0x0 0x40000000 0x30 0x40000000 0x0 0x40000000>; /* non-prefetchable memory */
|
||||
+ msi-parent = <&its>;
|
||||
+ #interrupt-cells = <1>;
|
||||
+ interrupt-map-mask = <0 0 0 7>;
|
||||
+ interrupt-map = <0000 0 0 1 &gic 0 0 0 119 4>,
|
||||
+ <0000 0 0 2 &gic 0 0 0 120 4>,
|
||||
+ <0000 0 0 3 &gic 0 0 0 121 4>,
|
||||
+ <0000 0 0 4 &gic 0 0 0 122 4>;
|
||||
+ };
|
||||
+
|
||||
+ sata0: sata@3200000 {
|
||||
+ compatible = "fsl,ls1088a-ahci", "fsl,ls1043a-ahci";
|
||||
+ reg = <0x0 0x3200000 0x0 0x10000>;
|
||||
+ interrupts = <0 133 0x4>; /* Level high type */
|
||||
+ clocks = <&clockgen 4 3>;
|
||||
+ };
|
||||
+
|
||||
+ usb0: usb3@3100000 {
|
||||
+ compatible = "snps,dwc3";
|
||||
+ reg = <0x0 0x3100000 0x0 0x10000>;
|
||||
+ interrupts = <0 80 0x4>; /* Level high type */
|
||||
+ dr_mode = "host";
|
||||
+ configure-gfladj;
|
||||
+ snps,dis_rxdet_inp3_quirk;
|
||||
+ };
|
||||
+
|
||||
+ usb1: usb3@3110000 {
|
||||
+ compatible = "snps,dwc3";
|
||||
+ reg = <0x0 0x3110000 0x0 0x10000>;
|
||||
+ interrupts = <0 81 0x4>; /* Level high type */
|
||||
+ dr_mode = "host";
|
||||
+ configure-gfladj;
|
||||
+ snps,dis_rxdet_inp3_quirk;
|
||||
+ };
|
||||
+
|
||||
+ smmu: iommu@5000000 {
|
||||
+ compatible = "arm,mmu-500";
|
||||
+ reg = <0 0x5000000 0 0x800000>;
|
||||
+ #global-interrupts = <12>;
|
||||
+ interrupts = <0 13 4>, /* global secure fault */
|
||||
+ <0 14 4>, /* combined secure interrupt */
|
||||
+ <0 15 4>, /* global non-secure fault */
|
||||
+ <0 16 4>, /* combined non-secure interrupt */
|
||||
+ /* performance counter interrupts 0-7 */
|
||||
+ <0 211 4>,
|
||||
+ <0 212 4>,
|
||||
+ <0 213 4>,
|
||||
+ <0 214 4>,
|
||||
+ <0 215 4>,
|
||||
+ <0 216 4>,
|
||||
+ <0 217 4>,
|
||||
+ <0 218 4>,
|
||||
+ /* per context interrupt, 64 interrupts */
|
||||
+ <0 146 4>,
|
||||
+ <0 147 4>,
|
||||
+ <0 148 4>,
|
||||
+ <0 149 4>,
|
||||
+ <0 150 4>,
|
||||
+ <0 151 4>,
|
||||
+ <0 152 4>,
|
||||
+ <0 153 4>,
|
||||
+ <0 154 4>,
|
||||
+ <0 155 4>,
|
||||
+ <0 156 4>,
|
||||
+ <0 157 4>,
|
||||
+ <0 158 4>,
|
||||
+ <0 159 4>,
|
||||
+ <0 160 4>,
|
||||
+ <0 161 4>,
|
||||
+ <0 162 4>,
|
||||
+ <0 163 4>,
|
||||
+ <0 164 4>,
|
||||
+ <0 165 4>,
|
||||
+ <0 166 4>,
|
||||
+ <0 167 4>,
|
||||
+ <0 168 4>,
|
||||
+ <0 169 4>,
|
||||
+ <0 170 4>,
|
||||
+ <0 171 4>,
|
||||
+ <0 172 4>,
|
||||
+ <0 173 4>,
|
||||
+ <0 174 4>,
|
||||
+ <0 175 4>,
|
||||
+ <0 176 4>,
|
||||
+ <0 177 4>,
|
||||
+ <0 178 4>,
|
||||
+ <0 179 4>,
|
||||
+ <0 180 4>,
|
||||
+ <0 181 4>,
|
||||
+ <0 182 4>,
|
||||
+ <0 183 4>,
|
||||
+ <0 184 4>,
|
||||
+ <0 185 4>,
|
||||
+ <0 186 4>,
|
||||
+ <0 187 4>,
|
||||
+ <0 188 4>,
|
||||
+ <0 189 4>,
|
||||
+ <0 190 4>,
|
||||
+ <0 191 4>,
|
||||
+ <0 192 4>,
|
||||
+ <0 193 4>,
|
||||
+ <0 194 4>,
|
||||
+ <0 195 4>,
|
||||
+ <0 196 4>,
|
||||
+ <0 197 4>,
|
||||
+ <0 198 4>,
|
||||
+ <0 199 4>,
|
||||
+ <0 200 4>,
|
||||
+ <0 201 4>,
|
||||
+ <0 202 4>,
|
||||
+ <0 203 4>,
|
||||
+ <0 204 4>,
|
||||
+ <0 205 4>,
|
||||
+ <0 206 4>,
|
||||
+ <0 207 4>,
|
||||
+ <0 208 4>,
|
||||
+ <0 209 4>;
|
||||
+ mmu-masters = <&fsl_mc 0x300 0>;
|
||||
+ };
|
||||
+
|
||||
+ timer {
|
||||
+ compatible = "arm,armv8-timer";
|
||||
+ interrupts = <1 13 0x1>,/*Phy Secure PPI, edge triggered*/
|
||||
+ <1 14 0x1>, /*Phy Non-Secure PPI, edge triggered*/
|
||||
+ <1 11 0x1>, /*Virtual PPI, edge triggered */
|
||||
+ <1 10 0x1>; /*Hypervisor PPI, edge triggered */
|
||||
+ };
|
||||
+
|
||||
+ fsl_mc: fsl-mc@80c000000 {
|
||||
+ compatible = "fsl,qoriq-mc";
|
||||
+ #stream-id-cells = <2>;
|
||||
+ reg = <0x00000008 0x0c000000 0 0x40>, /* MC portal base */
|
||||
+ <0x00000000 0x08340000 0 0x40000>; /* MC control reg */
|
||||
+ msi-parent = <&its>;
|
||||
+ #address-cells = <3>;
|
||||
+ #size-cells = <1>;
|
||||
+
|
||||
+ /*
|
||||
+ * Region type 0x0 - MC portals
|
||||
+ * Region type 0x1 - QBMAN portals
|
||||
+ */
|
||||
+ ranges = <0x0 0x0 0x0 0x8 0x0c000000 0x4000000
|
||||
+ 0x1 0x0 0x0 0x8 0x18000000 0x8000000>;
|
||||
+
|
||||
+ dpmacs {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ dpmac1: dpmac@1 {
|
||||
+ compatible = "fsl,qoriq-mc-dpmac";
|
||||
+ reg = <1>;
|
||||
+ };
|
||||
+ dpmac2: dpmac@2 {
|
||||
+ compatible = "fsl,qoriq-mc-dpmac";
|
||||
+ reg = <2>;
|
||||
+ };
|
||||
+ dpmac3: dpmac@3 {
|
||||
+ compatible = "fsl,qoriq-mc-dpmac";
|
||||
+ reg = <3>;
|
||||
+ };
|
||||
+ dpmac4: dpmac@4 {
|
||||
+ compatible = "fsl,qoriq-mc-dpmac";
|
||||
+ reg = <4>;
|
||||
+ };
|
||||
+ dpmac5: dpmac@5 {
|
||||
+ compatible = "fsl,qoriq-mc-dpmac";
|
||||
+ reg = <5>;
|
||||
+ };
|
||||
+ dpmac6: dpmac@6 {
|
||||
+ compatible = "fsl,qoriq-mc-dpmac";
|
||||
+ reg = <6>;
|
||||
+ };
|
||||
+ dpmac7: dpmac@7 {
|
||||
+ compatible = "fsl,qoriq-mc-dpmac";
|
||||
+ reg = <7>;
|
||||
+ };
|
||||
+ dpmac8: dpmac@8 {
|
||||
+ compatible = "fsl,qoriq-mc-dpmac";
|
||||
+ reg = <8>;
|
||||
+ };
|
||||
+ dpmac9: dpmac@9 {
|
||||
+ compatible = "fsl,qoriq-mc-dpmac";
|
||||
+ reg = <9>;
|
||||
+ };
|
||||
+ dpmac10: dpmac@10 {
|
||||
+ compatible = "fsl,qoriq-mc-dpmac";
|
||||
+ reg = <0xa>;
|
||||
+ };
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+
|
||||
+ memory@80000000 {
|
||||
+ device_type = "memory";
|
||||
+ reg = <0x00000000 0x80000000 0 0x80000000>;
|
||||
+ /* DRAM space 1 - 2 GB DRAM */
|
||||
+ };
|
||||
+};
|
@ -0,0 +1,69 @@
|
||||
From caaab508dc2ba749d8394b5934353b1c47f37d75 Mon Sep 17 00:00:00 2001
|
||||
From: Zhao Qiang <qiang.zhao@nxp.com>
|
||||
Date: Sun, 9 Oct 2016 15:14:16 +0800
|
||||
Subject: [PATCH 139/141] ls1088ardb: add ITS file
|
||||
|
||||
Signed-off-by: Zhao Qiang <qiang.zhao@nxp.com>
|
||||
---
|
||||
kernel-ls1088a-rdb.its | 55 ++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 55 insertions(+)
|
||||
create mode 100644 kernel-ls1088a-rdb.its
|
||||
|
||||
--- /dev/null
|
||||
+++ b/kernel-ls1088a-rdb.its
|
||||
@@ -0,0 +1,55 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2015, Freescale Semiconductor
|
||||
+ *
|
||||
+ * Raghav Dogra <raghav@freescale.com>
|
||||
+ *
|
||||
+ * This file is licensed under the terms of the GNU General Public
|
||||
+ * License version 2. This program is licensed "as is" without any
|
||||
+ * warranty of any kind, whether express or implied.
|
||||
+ */
|
||||
+
|
||||
+/dts-v1/;
|
||||
+
|
||||
+/ {
|
||||
+ description = "Simulator Image file for the LS1088A Linux Kernel";
|
||||
+ #address-cells = <1>;
|
||||
+
|
||||
+ images {
|
||||
+ kernel@1 {
|
||||
+ description = "ARM64 Linux kernel";
|
||||
+ data = /incbin/("./arch/arm64/boot/Image.gz");
|
||||
+ type = "kernel";
|
||||
+ arch = "arm64";
|
||||
+ os = "linux";
|
||||
+ compression = "gzip";
|
||||
+ load = <0x80080000>;
|
||||
+ entry = <0x80080000>;
|
||||
+ };
|
||||
+ fdt@1 {
|
||||
+ description = "Flattened Device Tree blob";
|
||||
+ data = /incbin/("./arch/arm64/boot/dts/freescale/fsl-ls1088a-rdb.dtb");
|
||||
+ type = "flat_dt";
|
||||
+ arch = "arm64";
|
||||
+ compression = "none";
|
||||
+ load = <0x90000000>;
|
||||
+ };
|
||||
+ ramdisk@1 {
|
||||
+ description = "LS2 Ramdisk";
|
||||
+ data = /incbin/("./fsl-image-core-ls1088ardb-be.ext2.gz");
|
||||
+ type = "ramdisk";
|
||||
+ arch = "arm64";
|
||||
+ os = "linux";
|
||||
+ compression = "none";
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ configurations {
|
||||
+ default = "config@1";
|
||||
+ config@1 {
|
||||
+ description = "Boot Linux kernel";
|
||||
+ kernel = "kernel@1";
|
||||
+ fdt = "fdt@1";
|
||||
+ ramdisk = "ramdisk@1";
|
||||
+ };
|
||||
+ };
|
||||
+};
|
@ -0,0 +1,62 @@
|
||||
From 89b3b66aa955fed15585a4ba7120cf63f9e92aba Mon Sep 17 00:00:00 2001
|
||||
From: Zhao Qiang <qiang.zhao@nxp.com>
|
||||
Date: Thu, 13 Oct 2016 10:19:08 +0800
|
||||
Subject: [PATCH 141/141] caam: add caam node for ls1088a
|
||||
|
||||
Signed-off-by: Zhao Qiang <qiang.zhao@nxp.com>
|
||||
---
|
||||
arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi | 43 ++++++++++++++++++++++++
|
||||
1 file changed, 43 insertions(+)
|
||||
|
||||
--- a/arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi
|
||||
+++ b/arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi
|
||||
@@ -485,6 +485,49 @@
|
||||
<1 10 0x1>; /*Hypervisor PPI, edge triggered */
|
||||
};
|
||||
|
||||
+ crypto: crypto@8000000 {
|
||||
+ compatible = "fsl,sec-v5.4", "fsl,sec-v5.0",
|
||||
+ "fsl,sec-v4.0";
|
||||
+ fsl,sec-era = <8>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+ ranges = <0x0 0x00 0x8000000 0x100000>;
|
||||
+ reg = <0x00 0x8000000 0x0 0x100000>;
|
||||
+ interrupts = <0 139 0x4>;
|
||||
+
|
||||
+ sec_jr0: jr@10000 {
|
||||
+ compatible = "fsl,sec-v5.4-job-ring",
|
||||
+ "fsl,sec-v5.0-job-ring",
|
||||
+ "fsl,sec-v4.0-job-ring";
|
||||
+ reg = <0x10000 0x10000>;
|
||||
+ interrupts = <0 140 0x4>;
|
||||
+ };
|
||||
+
|
||||
+ sec_jr1: jr@20000 {
|
||||
+ compatible = "fsl,sec-v5.4-job-ring",
|
||||
+ "fsl,sec-v5.0-job-ring",
|
||||
+ "fsl,sec-v4.0-job-ring";
|
||||
+ reg = <0x20000 0x10000>;
|
||||
+ interrupts = <0 141 0x4>;
|
||||
+ };
|
||||
+
|
||||
+ sec_jr2: jr@30000 {
|
||||
+ compatible = "fsl,sec-v5.4-job-ring",
|
||||
+ "fsl,sec-v5.0-job-ring",
|
||||
+ "fsl,sec-v4.0-job-ring";
|
||||
+ reg = <0x30000 0x10000>;
|
||||
+ interrupts = <0 142 0x4>;
|
||||
+ };
|
||||
+
|
||||
+ sec_jr3: jr@40000 {
|
||||
+ compatible = "fsl,sec-v5.4-job-ring",
|
||||
+ "fsl,sec-v5.0-job-ring",
|
||||
+ "fsl,sec-v4.0-job-ring";
|
||||
+ reg = <0x40000 0x10000>;
|
||||
+ interrupts = <0 143 0x4>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
fsl_mc: fsl-mc@80c000000 {
|
||||
compatible = "fsl,qoriq-mc";
|
||||
#stream-id-cells = <2>;
|
@ -0,0 +1,44 @@
|
||||
From 72b250c04f543d4eeda06b32e699444b15cac5cc Mon Sep 17 00:00:00 2001
|
||||
From: "ying.zhang" <ying.zhang22455@nxp.com>
|
||||
Date: Sat, 17 Dec 2016 00:39:28 +0800
|
||||
Subject: [PATCH 226/226] mtd:spi-nor:fsl-quadspi:Enable fast-read for
|
||||
LS1088ARDB
|
||||
|
||||
Add fast-read mode for LS1088ARDB board.
|
||||
|
||||
Signed-off-by: Yuan Yao <yao.yuan@nxp.com>
|
||||
Integrated-by: Jiang Yutang <yutang.jiang@nxp.com>
|
||||
---
|
||||
arch/arm64/boot/dts/freescale/fsl-ls1088a-rdb.dts | 2 ++
|
||||
arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi | 1 +
|
||||
2 files changed, 3 insertions(+)
|
||||
|
||||
--- a/arch/arm64/boot/dts/freescale/fsl-ls1088a-rdb.dts
|
||||
+++ b/arch/arm64/boot/dts/freescale/fsl-ls1088a-rdb.dts
|
||||
@@ -91,6 +91,7 @@
|
||||
compatible = "spansion,m25p80";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
+ m25p,fast-read;
|
||||
spi-max-frequency = <20000000>;
|
||||
reg = <0>;
|
||||
};
|
||||
@@ -99,6 +100,7 @@
|
||||
compatible = "spansion,m25p80";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
+ m25p,fast-read;
|
||||
spi-max-frequency = <20000000>;
|
||||
reg = <1>;
|
||||
};
|
||||
--- a/arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi
|
||||
+++ b/arch/arm64/boot/dts/freescale/fsl-ls1088a.dtsi
|
||||
@@ -294,6 +294,7 @@
|
||||
interrupts = <0 25 0x4>; /* Level high type */
|
||||
clocks = <&clockgen 4 3>, <&clockgen 4 3>;
|
||||
clock-names = "qspi_en", "qspi";
|
||||
+ fsl,qspi-has-second-chip;
|
||||
};
|
||||
|
||||
pcie@3400000 {
|
||||
|
@ -0,0 +1,53 @@
|
||||
From 0ac69de37277aec31d18a8c7b9d9a3a65b629526 Mon Sep 17 00:00:00 2001
|
||||
From: Yangbo Lu <yangbo.lu@nxp.com>
|
||||
Date: Wed, 12 Oct 2016 16:30:57 +0800
|
||||
Subject: [PATCH 144/226] dpaa: call arch_setup_dma_ops before using dma_ops
|
||||
|
||||
A previous patch caused dpaa call trace. This patch provides
|
||||
a temporary workaround for this until this is fixed by upstream.
|
||||
|
||||
Fixes: 1dccb598df54 ("arm64: simplify dma_get_ops")
|
||||
Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
|
||||
---
|
||||
.../ethernet/freescale/sdk_dpaa/dpaa_eth_common.c | 12 ++++++------
|
||||
drivers/staging/fsl_qbman/qman_high.c | 1 +
|
||||
2 files changed, 7 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_common.c
|
||||
+++ b/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_common.c
|
||||
@@ -754,6 +754,12 @@ dpa_bp_alloc(struct dpa_bp *dpa_bp)
|
||||
goto pdev_register_failed;
|
||||
}
|
||||
|
||||
+#ifdef CONFIG_FMAN_ARM
|
||||
+ /* force coherency */
|
||||
+ pdev->dev.archdata.dma_coherent = true;
|
||||
+ arch_setup_dma_ops(&pdev->dev, 0, 0, NULL, true);
|
||||
+#endif
|
||||
+
|
||||
err = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(40));
|
||||
if (err)
|
||||
goto pdev_mask_failed;
|
||||
@@ -765,12 +771,6 @@ dpa_bp_alloc(struct dpa_bp *dpa_bp)
|
||||
goto pdev_mask_failed;
|
||||
}
|
||||
|
||||
-#ifdef CONFIG_FMAN_ARM
|
||||
- /* force coherency */
|
||||
- pdev->dev.archdata.dma_coherent = true;
|
||||
- arch_setup_dma_ops(&pdev->dev, 0, 0, NULL, true);
|
||||
-#endif
|
||||
-
|
||||
dpa_bp->dev = &pdev->dev;
|
||||
|
||||
if (dpa_bp->seed_cb) {
|
||||
--- a/drivers/staging/fsl_qbman/qman_high.c
|
||||
+++ b/drivers/staging/fsl_qbman/qman_high.c
|
||||
@@ -662,6 +662,7 @@ struct qman_portal *qman_create_portal(
|
||||
portal->pdev->dev.coherent_dma_mask = DMA_BIT_MASK(40);
|
||||
portal->pdev->dev.dma_mask = &portal->pdev->dev.coherent_dma_mask;
|
||||
#else
|
||||
+ arch_setup_dma_ops(&portal->pdev->dev, 0, 0, NULL, false);
|
||||
if (dma_set_mask(&portal->pdev->dev, DMA_BIT_MASK(40))) {
|
||||
pr_err("qman_portal - dma_set_mask() failed\n");
|
||||
goto fail_devadd;
|
@ -0,0 +1,400 @@
|
||||
From 8ebb892cd56d14e72580ab36c3b5eb2d4603a7fe Mon Sep 17 00:00:00 2001
|
||||
From: "J. German Rivera" <German.Rivera@freescale.com>
|
||||
Date: Wed, 6 Jan 2016 16:03:21 -0600
|
||||
Subject: [PATCH 145/226] staging: fsl-mc: Added generic MSI support for
|
||||
FSL-MC devices
|
||||
|
||||
Created an MSI domain for the fsl-mc bus-- including functions
|
||||
to create a domain, find a domain, alloc/free domain irqs, and
|
||||
bus specific overrides for domain and irq_chip ops.
|
||||
|
||||
Signed-off-by: J. German Rivera <German.Rivera@freescale.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/Kconfig | 1 +
|
||||
drivers/staging/fsl-mc/bus/Makefile | 1 +
|
||||
drivers/staging/fsl-mc/bus/mc-msi.c | 276 +++++++++++++++++++++++++++
|
||||
drivers/staging/fsl-mc/include/dprc.h | 2 +-
|
||||
drivers/staging/fsl-mc/include/mc-private.h | 17 ++
|
||||
drivers/staging/fsl-mc/include/mc.h | 17 ++
|
||||
6 files changed, 313 insertions(+), 1 deletion(-)
|
||||
create mode 100644 drivers/staging/fsl-mc/bus/mc-msi.c
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/Kconfig
|
||||
+++ b/drivers/staging/fsl-mc/bus/Kconfig
|
||||
@@ -9,6 +9,7 @@
|
||||
config FSL_MC_BUS
|
||||
tristate "Freescale Management Complex (MC) bus driver"
|
||||
depends on OF && ARM64
|
||||
+ select GENERIC_MSI_IRQ_DOMAIN
|
||||
help
|
||||
Driver to enable the bus infrastructure for the Freescale
|
||||
QorIQ Management Complex (fsl-mc). The fsl-mc is a hardware
|
||||
--- a/drivers/staging/fsl-mc/bus/Makefile
|
||||
+++ b/drivers/staging/fsl-mc/bus/Makefile
|
||||
@@ -13,5 +13,6 @@ mc-bus-driver-objs := mc-bus.o \
|
||||
dpmng.o \
|
||||
dprc-driver.o \
|
||||
mc-allocator.o \
|
||||
+ mc-msi.o \
|
||||
dpmcp.o \
|
||||
dpbp.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/staging/fsl-mc/bus/mc-msi.c
|
||||
@@ -0,0 +1,276 @@
|
||||
+/*
|
||||
+ * Freescale Management Complex (MC) bus driver MSI support
|
||||
+ *
|
||||
+ * Copyright (C) 2015 Freescale Semiconductor, Inc.
|
||||
+ * Author: German Rivera <German.Rivera@freescale.com>
|
||||
+ *
|
||||
+ * This file is licensed under the terms of the GNU General Public
|
||||
+ * License version 2. This program is licensed "as is" without any
|
||||
+ * warranty of any kind, whether express or implied.
|
||||
+ */
|
||||
+
|
||||
+#include "../include/mc-private.h"
|
||||
+#include <linux/of_device.h>
|
||||
+#include <linux/of_address.h>
|
||||
+#include <linux/irqchip/arm-gic-v3.h>
|
||||
+#include <linux/of_irq.h>
|
||||
+#include <linux/irq.h>
|
||||
+#include <linux/irqdomain.h>
|
||||
+#include <linux/msi.h>
|
||||
+#include "../include/mc-sys.h"
|
||||
+#include "dprc-cmd.h"
|
||||
+
|
||||
+static void fsl_mc_msi_set_desc(msi_alloc_info_t *arg,
|
||||
+ struct msi_desc *desc)
|
||||
+{
|
||||
+ arg->desc = desc;
|
||||
+ arg->hwirq = (irq_hw_number_t)desc->fsl_mc.msi_index;
|
||||
+}
|
||||
+
|
||||
+static void fsl_mc_msi_update_dom_ops(struct msi_domain_info *info)
|
||||
+{
|
||||
+ struct msi_domain_ops *ops = info->ops;
|
||||
+
|
||||
+ if (WARN_ON(!ops))
|
||||
+ return;
|
||||
+
|
||||
+ /*
|
||||
+ * set_desc should not be set by the caller
|
||||
+ */
|
||||
+ if (WARN_ON(ops->set_desc))
|
||||
+ return;
|
||||
+
|
||||
+ ops->set_desc = fsl_mc_msi_set_desc;
|
||||
+}
|
||||
+
|
||||
+static void __fsl_mc_msi_write_msg(struct fsl_mc_device *mc_bus_dev,
|
||||
+ struct fsl_mc_device_irq *mc_dev_irq)
|
||||
+{
|
||||
+ int error;
|
||||
+ struct fsl_mc_device *owner_mc_dev = mc_dev_irq->mc_dev;
|
||||
+ struct msi_desc *msi_desc = mc_dev_irq->msi_desc;
|
||||
+ struct dprc_irq_cfg irq_cfg;
|
||||
+
|
||||
+ /*
|
||||
+ * msi_desc->msg.address is 0x0 when this function is invoked in
|
||||
+ * the free_irq() code path. In this case, for the MC, we don't
|
||||
+ * really need to "unprogram" the MSI, so we just return.
|
||||
+ */
|
||||
+ if (msi_desc->msg.address_lo == 0x0 && msi_desc->msg.address_hi == 0x0)
|
||||
+ return;
|
||||
+
|
||||
+ if (WARN_ON(!owner_mc_dev))
|
||||
+ return;
|
||||
+
|
||||
+ irq_cfg.paddr = ((u64)msi_desc->msg.address_hi << 32) |
|
||||
+ msi_desc->msg.address_lo;
|
||||
+ irq_cfg.val = msi_desc->msg.data;
|
||||
+ irq_cfg.user_irq_id = msi_desc->irq;
|
||||
+
|
||||
+ if (owner_mc_dev == mc_bus_dev) {
|
||||
+ /*
|
||||
+ * IRQ is for the mc_bus_dev's DPRC itself
|
||||
+ */
|
||||
+ error = dprc_set_irq(mc_bus_dev->mc_io,
|
||||
+ MC_CMD_FLAG_INTR_DIS | MC_CMD_FLAG_PRI,
|
||||
+ mc_bus_dev->mc_handle,
|
||||
+ mc_dev_irq->dev_irq_index,
|
||||
+ &irq_cfg);
|
||||
+ if (error < 0) {
|
||||
+ dev_err(&owner_mc_dev->dev,
|
||||
+ "dprc_set_irq() failed: %d\n", error);
|
||||
+ }
|
||||
+ } else {
|
||||
+ /*
|
||||
+ * IRQ is for for a child device of mc_bus_dev
|
||||
+ */
|
||||
+ error = dprc_set_obj_irq(mc_bus_dev->mc_io,
|
||||
+ MC_CMD_FLAG_INTR_DIS | MC_CMD_FLAG_PRI,
|
||||
+ mc_bus_dev->mc_handle,
|
||||
+ owner_mc_dev->obj_desc.type,
|
||||
+ owner_mc_dev->obj_desc.id,
|
||||
+ mc_dev_irq->dev_irq_index,
|
||||
+ &irq_cfg);
|
||||
+ if (error < 0) {
|
||||
+ dev_err(&owner_mc_dev->dev,
|
||||
+ "dprc_obj_set_irq() failed: %d\n", error);
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * NOTE: This function is invoked with interrupts disabled
|
||||
+ */
|
||||
+static void fsl_mc_msi_write_msg(struct irq_data *irq_data,
|
||||
+ struct msi_msg *msg)
|
||||
+{
|
||||
+ struct msi_desc *msi_desc = irq_data_get_msi_desc(irq_data);
|
||||
+ struct fsl_mc_device *mc_bus_dev = to_fsl_mc_device(msi_desc->dev);
|
||||
+ struct fsl_mc_bus *mc_bus = to_fsl_mc_bus(mc_bus_dev);
|
||||
+ struct fsl_mc_device_irq *mc_dev_irq =
|
||||
+ &mc_bus->irq_resources[msi_desc->fsl_mc.msi_index];
|
||||
+
|
||||
+ WARN_ON(mc_dev_irq->msi_desc != msi_desc);
|
||||
+ msi_desc->msg = *msg;
|
||||
+
|
||||
+ /*
|
||||
+ * Program the MSI (paddr, value) pair in the device:
|
||||
+ */
|
||||
+ __fsl_mc_msi_write_msg(mc_bus_dev, mc_dev_irq);
|
||||
+}
|
||||
+
|
||||
+static void fsl_mc_msi_update_chip_ops(struct msi_domain_info *info)
|
||||
+{
|
||||
+ struct irq_chip *chip = info->chip;
|
||||
+
|
||||
+ if (WARN_ON((!chip)))
|
||||
+ return;
|
||||
+
|
||||
+ /*
|
||||
+ * irq_write_msi_msg should not be set by the caller
|
||||
+ */
|
||||
+ if (WARN_ON(chip->irq_write_msi_msg))
|
||||
+ return;
|
||||
+
|
||||
+ chip->irq_write_msi_msg = fsl_mc_msi_write_msg;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * fsl_mc_msi_create_irq_domain - Create a fsl-mc MSI interrupt domain
|
||||
+ * @np: Optional device-tree node of the interrupt controller
|
||||
+ * @info: MSI domain info
|
||||
+ * @parent: Parent irq domain
|
||||
+ *
|
||||
+ * Updates the domain and chip ops and creates a fsl-mc MSI
|
||||
+ * interrupt domain.
|
||||
+ *
|
||||
+ * Returns:
|
||||
+ * A domain pointer or NULL in case of failure.
|
||||
+ */
|
||||
+struct irq_domain *fsl_mc_msi_create_irq_domain(struct fwnode_handle *fwnode,
|
||||
+ struct msi_domain_info *info,
|
||||
+ struct irq_domain *parent)
|
||||
+{
|
||||
+ struct irq_domain *domain;
|
||||
+
|
||||
+ if (info->flags & MSI_FLAG_USE_DEF_DOM_OPS)
|
||||
+ fsl_mc_msi_update_dom_ops(info);
|
||||
+ if (info->flags & MSI_FLAG_USE_DEF_CHIP_OPS)
|
||||
+ fsl_mc_msi_update_chip_ops(info);
|
||||
+
|
||||
+ domain = msi_create_irq_domain(fwnode, info, parent);
|
||||
+ if (domain)
|
||||
+ domain->bus_token = DOMAIN_BUS_FSL_MC_MSI;
|
||||
+
|
||||
+ return domain;
|
||||
+}
|
||||
+
|
||||
+int fsl_mc_find_msi_domain(struct device *mc_platform_dev,
|
||||
+ struct irq_domain **mc_msi_domain)
|
||||
+{
|
||||
+ struct irq_domain *msi_domain;
|
||||
+ struct device_node *mc_of_node = mc_platform_dev->of_node;
|
||||
+
|
||||
+ msi_domain = of_msi_get_domain(mc_platform_dev, mc_of_node,
|
||||
+ DOMAIN_BUS_FSL_MC_MSI);
|
||||
+ if (!msi_domain) {
|
||||
+ pr_err("Unable to find fsl-mc MSI domain for %s\n",
|
||||
+ mc_of_node->full_name);
|
||||
+
|
||||
+ return -ENOENT;
|
||||
+ }
|
||||
+
|
||||
+ *mc_msi_domain = msi_domain;
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void fsl_mc_msi_free_descs(struct device *dev)
|
||||
+{
|
||||
+ struct msi_desc *desc, *tmp;
|
||||
+
|
||||
+ list_for_each_entry_safe(desc, tmp, dev_to_msi_list(dev), list) {
|
||||
+ list_del(&desc->list);
|
||||
+ free_msi_entry(desc);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static int fsl_mc_msi_alloc_descs(struct device *dev, unsigned int irq_count)
|
||||
+
|
||||
+{
|
||||
+ unsigned int i;
|
||||
+ int error;
|
||||
+ struct msi_desc *msi_desc;
|
||||
+
|
||||
+ for (i = 0; i < irq_count; i++) {
|
||||
+ msi_desc = alloc_msi_entry(dev);
|
||||
+ if (!msi_desc) {
|
||||
+ dev_err(dev, "Failed to allocate msi entry\n");
|
||||
+ error = -ENOMEM;
|
||||
+ goto cleanup_msi_descs;
|
||||
+ }
|
||||
+
|
||||
+ msi_desc->fsl_mc.msi_index = i;
|
||||
+ msi_desc->nvec_used = 1;
|
||||
+ INIT_LIST_HEAD(&msi_desc->list);
|
||||
+ list_add_tail(&msi_desc->list, dev_to_msi_list(dev));
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
+cleanup_msi_descs:
|
||||
+ fsl_mc_msi_free_descs(dev);
|
||||
+ return error;
|
||||
+}
|
||||
+
|
||||
+int fsl_mc_msi_domain_alloc_irqs(struct device *dev,
|
||||
+ unsigned int irq_count)
|
||||
+{
|
||||
+ struct irq_domain *msi_domain;
|
||||
+ int error;
|
||||
+
|
||||
+ if (WARN_ON(!list_empty(dev_to_msi_list(dev))))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ error = fsl_mc_msi_alloc_descs(dev, irq_count);
|
||||
+ if (error < 0)
|
||||
+ return error;
|
||||
+
|
||||
+ msi_domain = dev_get_msi_domain(dev);
|
||||
+ if (WARN_ON(!msi_domain)) {
|
||||
+ error = -EINVAL;
|
||||
+ goto cleanup_msi_descs;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * NOTE: Calling this function will trigger the invocation of the
|
||||
+ * its_fsl_mc_msi_prepare() callback
|
||||
+ */
|
||||
+ error = msi_domain_alloc_irqs(msi_domain, dev, irq_count);
|
||||
+
|
||||
+ if (error) {
|
||||
+ dev_err(dev, "Failed to allocate IRQs\n");
|
||||
+ goto cleanup_msi_descs;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
+cleanup_msi_descs:
|
||||
+ fsl_mc_msi_free_descs(dev);
|
||||
+ return error;
|
||||
+}
|
||||
+
|
||||
+void fsl_mc_msi_domain_free_irqs(struct device *dev)
|
||||
+{
|
||||
+ struct irq_domain *msi_domain;
|
||||
+
|
||||
+ msi_domain = dev_get_msi_domain(dev);
|
||||
+ if (WARN_ON(!msi_domain))
|
||||
+ return;
|
||||
+
|
||||
+ msi_domain_free_irqs(msi_domain, dev);
|
||||
+
|
||||
+ if (WARN_ON(list_empty(dev_to_msi_list(dev))))
|
||||
+ return;
|
||||
+
|
||||
+ fsl_mc_msi_free_descs(dev);
|
||||
+}
|
||||
--- a/drivers/staging/fsl-mc/include/dprc.h
|
||||
+++ b/drivers/staging/fsl-mc/include/dprc.h
|
||||
@@ -176,7 +176,7 @@ int dprc_reset_container(struct fsl_mc_i
|
||||
* @user_irq_id: A user defined number associated with this IRQ
|
||||
*/
|
||||
struct dprc_irq_cfg {
|
||||
- u64 paddr;
|
||||
+ phys_addr_t paddr;
|
||||
u32 val;
|
||||
int user_irq_id;
|
||||
};
|
||||
--- a/drivers/staging/fsl-mc/include/mc-private.h
|
||||
+++ b/drivers/staging/fsl-mc/include/mc-private.h
|
||||
@@ -26,6 +26,9 @@
|
||||
strcmp(_obj_type, "dpmcp") == 0 || \
|
||||
strcmp(_obj_type, "dpcon") == 0)
|
||||
|
||||
+struct irq_domain;
|
||||
+struct msi_domain_info;
|
||||
+
|
||||
/**
|
||||
* struct fsl_mc - Private data of a "fsl,qoriq-mc" platform device
|
||||
* @root_mc_bus_dev: MC object device representing the root DPRC
|
||||
@@ -79,11 +82,13 @@ struct fsl_mc_resource_pool {
|
||||
* @resource_pools: array of resource pools (one pool per resource type)
|
||||
* for this MC bus. These resources represent allocatable entities
|
||||
* from the physical DPRC.
|
||||
+ * @irq_resources: Pointer to array of IRQ objects for the IRQ pool
|
||||
* @scan_mutex: Serializes bus scanning
|
||||
*/
|
||||
struct fsl_mc_bus {
|
||||
struct fsl_mc_device mc_dev;
|
||||
struct fsl_mc_resource_pool resource_pools[FSL_MC_NUM_POOL_TYPES];
|
||||
+ struct fsl_mc_device_irq *irq_resources;
|
||||
struct mutex scan_mutex; /* serializes bus scanning */
|
||||
};
|
||||
|
||||
@@ -116,4 +121,16 @@ int __must_check fsl_mc_resource_allocat
|
||||
|
||||
void fsl_mc_resource_free(struct fsl_mc_resource *resource);
|
||||
|
||||
+struct irq_domain *fsl_mc_msi_create_irq_domain(struct fwnode_handle *fwnode,
|
||||
+ struct msi_domain_info *info,
|
||||
+ struct irq_domain *parent);
|
||||
+
|
||||
+int fsl_mc_find_msi_domain(struct device *mc_platform_dev,
|
||||
+ struct irq_domain **mc_msi_domain);
|
||||
+
|
||||
+int fsl_mc_msi_domain_alloc_irqs(struct device *dev,
|
||||
+ unsigned int irq_count);
|
||||
+
|
||||
+void fsl_mc_msi_domain_free_irqs(struct device *dev);
|
||||
+
|
||||
#endif /* _FSL_MC_PRIVATE_H_ */
|
||||
--- a/drivers/staging/fsl-mc/include/mc.h
|
||||
+++ b/drivers/staging/fsl-mc/include/mc.h
|
||||
@@ -104,6 +104,23 @@ struct fsl_mc_resource {
|
||||
};
|
||||
|
||||
/**
|
||||
+ * struct fsl_mc_device_irq - MC object device message-based interrupt
|
||||
+ * @msi_desc: pointer to MSI descriptor allocated by fsl_mc_msi_alloc_descs()
|
||||
+ * @mc_dev: MC object device that owns this interrupt
|
||||
+ * @dev_irq_index: device-relative IRQ index
|
||||
+ * @resource: MC generic resource associated with the interrupt
|
||||
+ */
|
||||
+struct fsl_mc_device_irq {
|
||||
+ struct msi_desc *msi_desc;
|
||||
+ struct fsl_mc_device *mc_dev;
|
||||
+ u8 dev_irq_index;
|
||||
+ struct fsl_mc_resource resource;
|
||||
+};
|
||||
+
|
||||
+#define to_fsl_mc_irq(_mc_resource) \
|
||||
+ container_of(_mc_resource, struct fsl_mc_device_irq, resource)
|
||||
+
|
||||
+/**
|
||||
* Bit masks for a MC object device (struct fsl_mc_device) flags
|
||||
*/
|
||||
#define FSL_MC_IS_DPRC 0x0001
|
@ -0,0 +1,167 @@
|
||||
From 85cb8ae26b6c69f0a118f32b7b7cd4f22d782da3 Mon Sep 17 00:00:00 2001
|
||||
From: "J. German Rivera" <German.Rivera@freescale.com>
|
||||
Date: Wed, 6 Jan 2016 16:03:22 -0600
|
||||
Subject: [PATCH 146/226] staging: fsl-mc: Added GICv3-ITS support for FSL-MC
|
||||
MSIs
|
||||
|
||||
Added platform-specific MSI support layer for FSL-MC devices.
|
||||
|
||||
Signed-off-by: J. German Rivera <German.Rivera@freescale.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/Makefile | 1 +
|
||||
.../staging/fsl-mc/bus/irq-gic-v3-its-fsl-mc-msi.c | 127 ++++++++++++++++++++
|
||||
drivers/staging/fsl-mc/include/mc-private.h | 4 +
|
||||
3 files changed, 132 insertions(+)
|
||||
create mode 100644 drivers/staging/fsl-mc/bus/irq-gic-v3-its-fsl-mc-msi.c
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/Makefile
|
||||
+++ b/drivers/staging/fsl-mc/bus/Makefile
|
||||
@@ -14,5 +14,6 @@ mc-bus-driver-objs := mc-bus.o \
|
||||
dprc-driver.o \
|
||||
mc-allocator.o \
|
||||
mc-msi.o \
|
||||
+ irq-gic-v3-its-fsl-mc-msi.o \
|
||||
dpmcp.o \
|
||||
dpbp.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/staging/fsl-mc/bus/irq-gic-v3-its-fsl-mc-msi.c
|
||||
@@ -0,0 +1,127 @@
|
||||
+/*
|
||||
+ * Freescale Management Complex (MC) bus driver MSI support
|
||||
+ *
|
||||
+ * Copyright (C) 2015 Freescale Semiconductor, Inc.
|
||||
+ * Author: German Rivera <German.Rivera@freescale.com>
|
||||
+ *
|
||||
+ * This file is licensed under the terms of the GNU General Public
|
||||
+ * License version 2. This program is licensed "as is" without any
|
||||
+ * warranty of any kind, whether express or implied.
|
||||
+ */
|
||||
+
|
||||
+#include "../include/mc-private.h"
|
||||
+#include <linux/of_device.h>
|
||||
+#include <linux/of_address.h>
|
||||
+#include <linux/irqchip/arm-gic-v3.h>
|
||||
+#include <linux/irq.h>
|
||||
+#include <linux/msi.h>
|
||||
+#include <linux/of.h>
|
||||
+#include <linux/of_irq.h>
|
||||
+#include "../include/mc-sys.h"
|
||||
+#include "dprc-cmd.h"
|
||||
+
|
||||
+static struct irq_chip its_msi_irq_chip = {
|
||||
+ .name = "fsl-mc-bus-msi",
|
||||
+ .irq_mask = irq_chip_mask_parent,
|
||||
+ .irq_unmask = irq_chip_unmask_parent,
|
||||
+ .irq_eoi = irq_chip_eoi_parent,
|
||||
+ .irq_set_affinity = msi_domain_set_affinity
|
||||
+};
|
||||
+
|
||||
+static int its_fsl_mc_msi_prepare(struct irq_domain *msi_domain,
|
||||
+ struct device *dev,
|
||||
+ int nvec, msi_alloc_info_t *info)
|
||||
+{
|
||||
+ struct fsl_mc_device *mc_bus_dev;
|
||||
+ struct msi_domain_info *msi_info;
|
||||
+
|
||||
+ if (WARN_ON(dev->bus != &fsl_mc_bus_type))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ mc_bus_dev = to_fsl_mc_device(dev);
|
||||
+ if (WARN_ON(!(mc_bus_dev->flags & FSL_MC_IS_DPRC)))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ /*
|
||||
+ * Set the device Id to be passed to the GIC-ITS:
|
||||
+ *
|
||||
+ * NOTE: This device id corresponds to the IOMMU stream ID
|
||||
+ * associated with the DPRC object (ICID).
|
||||
+ */
|
||||
+ info->scratchpad[0].ul = mc_bus_dev->icid;
|
||||
+ msi_info = msi_get_domain_info(msi_domain->parent);
|
||||
+ return msi_info->ops->msi_prepare(msi_domain->parent, dev, nvec, info);
|
||||
+}
|
||||
+
|
||||
+static struct msi_domain_ops its_fsl_mc_msi_ops = {
|
||||
+ .msi_prepare = its_fsl_mc_msi_prepare,
|
||||
+};
|
||||
+
|
||||
+static struct msi_domain_info its_fsl_mc_msi_domain_info = {
|
||||
+ .flags = (MSI_FLAG_USE_DEF_DOM_OPS | MSI_FLAG_USE_DEF_CHIP_OPS),
|
||||
+ .ops = &its_fsl_mc_msi_ops,
|
||||
+ .chip = &its_msi_irq_chip,
|
||||
+};
|
||||
+
|
||||
+static const struct of_device_id its_device_id[] = {
|
||||
+ { .compatible = "arm,gic-v3-its", },
|
||||
+ {},
|
||||
+};
|
||||
+
|
||||
+int __init its_fsl_mc_msi_init(void)
|
||||
+{
|
||||
+ struct device_node *np;
|
||||
+ struct irq_domain *parent;
|
||||
+ struct irq_domain *mc_msi_domain;
|
||||
+
|
||||
+ for (np = of_find_matching_node(NULL, its_device_id); np;
|
||||
+ np = of_find_matching_node(np, its_device_id)) {
|
||||
+ if (!of_property_read_bool(np, "msi-controller"))
|
||||
+ continue;
|
||||
+
|
||||
+ parent = irq_find_matching_host(np, DOMAIN_BUS_NEXUS);
|
||||
+ if (!parent || !msi_get_domain_info(parent)) {
|
||||
+ pr_err("%s: unable to locate ITS domain\n",
|
||||
+ np->full_name);
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ mc_msi_domain = fsl_mc_msi_create_irq_domain(
|
||||
+ of_node_to_fwnode(np),
|
||||
+ &its_fsl_mc_msi_domain_info,
|
||||
+ parent);
|
||||
+ if (!mc_msi_domain) {
|
||||
+ pr_err("%s: unable to create fsl-mc domain\n",
|
||||
+ np->full_name);
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ WARN_ON(mc_msi_domain->
|
||||
+ host_data != &its_fsl_mc_msi_domain_info);
|
||||
+
|
||||
+ pr_info("fsl-mc MSI: %s domain created\n", np->full_name);
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+void its_fsl_mc_msi_cleanup(void)
|
||||
+{
|
||||
+ struct device_node *np;
|
||||
+
|
||||
+ for (np = of_find_matching_node(NULL, its_device_id); np;
|
||||
+ np = of_find_matching_node(np, its_device_id)) {
|
||||
+ struct irq_domain *mc_msi_domain = irq_find_matching_host(
|
||||
+ np,
|
||||
+ DOMAIN_BUS_FSL_MC_MSI);
|
||||
+
|
||||
+ if (!of_property_read_bool(np, "msi-controller"))
|
||||
+ continue;
|
||||
+
|
||||
+ mc_msi_domain = irq_find_matching_host(np,
|
||||
+ DOMAIN_BUS_FSL_MC_MSI);
|
||||
+ if (mc_msi_domain &&
|
||||
+ mc_msi_domain->host_data == &its_fsl_mc_msi_domain_info)
|
||||
+ irq_domain_remove(mc_msi_domain);
|
||||
+ }
|
||||
+}
|
||||
--- a/drivers/staging/fsl-mc/include/mc-private.h
|
||||
+++ b/drivers/staging/fsl-mc/include/mc-private.h
|
||||
@@ -133,4 +133,8 @@ int fsl_mc_msi_domain_alloc_irqs(struct
|
||||
|
||||
void fsl_mc_msi_domain_free_irqs(struct device *dev);
|
||||
|
||||
+int __init its_fsl_mc_msi_init(void);
|
||||
+
|
||||
+void its_fsl_mc_msi_cleanup(void);
|
||||
+
|
||||
#endif /* _FSL_MC_PRIVATE_H_ */
|
@ -0,0 +1,326 @@
|
||||
From 23b09c6b4162a8264b600f35d7048256a7afc0cd Mon Sep 17 00:00:00 2001
|
||||
From: "J. German Rivera" <German.Rivera@freescale.com>
|
||||
Date: Wed, 6 Jan 2016 16:03:23 -0600
|
||||
Subject: [PATCH 147/226] staging: fsl-mc: Extended MC bus allocator to
|
||||
include IRQs
|
||||
|
||||
All the IRQs for DPAA2 objects in the same DPRC must use
|
||||
the ICID of that DPRC, as their device Id in the GIC-ITS.
|
||||
Thus, all these IRQs must share the same ITT table in the GIC.
|
||||
As a result, a pool of IRQs with the same device Id must be
|
||||
preallocated per DPRC (fsl-mc bus instance). So, the fsl-mc
|
||||
bus object allocator is extended to also provide services
|
||||
to allocate IRQs to DPAA2 devices, from their parent fsl-mc bus
|
||||
IRQ pool.
|
||||
|
||||
Signed-off-by: J. German Rivera <German.Rivera@freescale.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/mc-allocator.c | 199 +++++++++++++++++++++++++++
|
||||
drivers/staging/fsl-mc/include/mc-private.h | 15 ++
|
||||
drivers/staging/fsl-mc/include/mc.h | 9 ++
|
||||
3 files changed, 223 insertions(+)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/mc-allocator.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/mc-allocator.c
|
||||
@@ -15,6 +15,7 @@
|
||||
#include "../include/dpcon-cmd.h"
|
||||
#include "dpmcp-cmd.h"
|
||||
#include "dpmcp.h"
|
||||
+#include <linux/msi.h>
|
||||
|
||||
/**
|
||||
* fsl_mc_resource_pool_add_device - add allocatable device to a resource
|
||||
@@ -160,6 +161,7 @@ static const char *const fsl_mc_pool_typ
|
||||
[FSL_MC_POOL_DPMCP] = "dpmcp",
|
||||
[FSL_MC_POOL_DPBP] = "dpbp",
|
||||
[FSL_MC_POOL_DPCON] = "dpcon",
|
||||
+ [FSL_MC_POOL_IRQ] = "irq",
|
||||
};
|
||||
|
||||
static int __must_check object_type_to_pool_type(const char *object_type,
|
||||
@@ -465,6 +467,203 @@ void fsl_mc_object_free(struct fsl_mc_de
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(fsl_mc_object_free);
|
||||
|
||||
+/*
|
||||
+ * Initialize the interrupt pool associated with a MC bus.
|
||||
+ * It allocates a block of IRQs from the GIC-ITS
|
||||
+ */
|
||||
+int fsl_mc_populate_irq_pool(struct fsl_mc_bus *mc_bus,
|
||||
+ unsigned int irq_count)
|
||||
+{
|
||||
+ unsigned int i;
|
||||
+ struct msi_desc *msi_desc;
|
||||
+ struct fsl_mc_device_irq *irq_resources;
|
||||
+ struct fsl_mc_device_irq *mc_dev_irq;
|
||||
+ int error;
|
||||
+ struct fsl_mc_device *mc_bus_dev = &mc_bus->mc_dev;
|
||||
+ struct fsl_mc_resource_pool *res_pool =
|
||||
+ &mc_bus->resource_pools[FSL_MC_POOL_IRQ];
|
||||
+
|
||||
+ if (WARN_ON(irq_count == 0 ||
|
||||
+ irq_count > FSL_MC_IRQ_POOL_MAX_TOTAL_IRQS))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ error = fsl_mc_msi_domain_alloc_irqs(&mc_bus_dev->dev, irq_count);
|
||||
+ if (error < 0)
|
||||
+ return error;
|
||||
+
|
||||
+ irq_resources = devm_kzalloc(&mc_bus_dev->dev,
|
||||
+ sizeof(*irq_resources) * irq_count,
|
||||
+ GFP_KERNEL);
|
||||
+ if (!irq_resources) {
|
||||
+ error = -ENOMEM;
|
||||
+ goto cleanup_msi_irqs;
|
||||
+ }
|
||||
+
|
||||
+ for (i = 0; i < irq_count; i++) {
|
||||
+ mc_dev_irq = &irq_resources[i];
|
||||
+
|
||||
+ /*
|
||||
+ * NOTE: This mc_dev_irq's MSI addr/value pair will be set
|
||||
+ * by the fsl_mc_msi_write_msg() callback
|
||||
+ */
|
||||
+ mc_dev_irq->resource.type = res_pool->type;
|
||||
+ mc_dev_irq->resource.data = mc_dev_irq;
|
||||
+ mc_dev_irq->resource.parent_pool = res_pool;
|
||||
+ INIT_LIST_HEAD(&mc_dev_irq->resource.node);
|
||||
+ list_add_tail(&mc_dev_irq->resource.node, &res_pool->free_list);
|
||||
+ }
|
||||
+
|
||||
+ for_each_msi_entry(msi_desc, &mc_bus_dev->dev) {
|
||||
+ mc_dev_irq = &irq_resources[msi_desc->fsl_mc.msi_index];
|
||||
+ mc_dev_irq->msi_desc = msi_desc;
|
||||
+ mc_dev_irq->resource.id = msi_desc->irq;
|
||||
+ }
|
||||
+
|
||||
+ res_pool->max_count = irq_count;
|
||||
+ res_pool->free_count = irq_count;
|
||||
+ mc_bus->irq_resources = irq_resources;
|
||||
+ return 0;
|
||||
+
|
||||
+cleanup_msi_irqs:
|
||||
+ fsl_mc_msi_domain_free_irqs(&mc_bus_dev->dev);
|
||||
+ return error;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(fsl_mc_populate_irq_pool);
|
||||
+
|
||||
+/**
|
||||
+ * Teardown the interrupt pool associated with an MC bus.
|
||||
+ * It frees the IRQs that were allocated to the pool, back to the GIC-ITS.
|
||||
+ */
|
||||
+void fsl_mc_cleanup_irq_pool(struct fsl_mc_bus *mc_bus)
|
||||
+{
|
||||
+ struct fsl_mc_device *mc_bus_dev = &mc_bus->mc_dev;
|
||||
+ struct fsl_mc_resource_pool *res_pool =
|
||||
+ &mc_bus->resource_pools[FSL_MC_POOL_IRQ];
|
||||
+
|
||||
+ if (WARN_ON(!mc_bus->irq_resources))
|
||||
+ return;
|
||||
+
|
||||
+ if (WARN_ON(res_pool->max_count == 0))
|
||||
+ return;
|
||||
+
|
||||
+ if (WARN_ON(res_pool->free_count != res_pool->max_count))
|
||||
+ return;
|
||||
+
|
||||
+ INIT_LIST_HEAD(&res_pool->free_list);
|
||||
+ res_pool->max_count = 0;
|
||||
+ res_pool->free_count = 0;
|
||||
+ mc_bus->irq_resources = NULL;
|
||||
+ fsl_mc_msi_domain_free_irqs(&mc_bus_dev->dev);
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(fsl_mc_cleanup_irq_pool);
|
||||
+
|
||||
+/**
|
||||
+ * It allocates the IRQs required by a given MC object device. The
|
||||
+ * IRQs are allocated from the interrupt pool associated with the
|
||||
+ * MC bus that contains the device, if the device is not a DPRC device.
|
||||
+ * Otherwise, the IRQs are allocated from the interrupt pool associated
|
||||
+ * with the MC bus that represents the DPRC device itself.
|
||||
+ */
|
||||
+int __must_check fsl_mc_allocate_irqs(struct fsl_mc_device *mc_dev)
|
||||
+{
|
||||
+ int i;
|
||||
+ int irq_count;
|
||||
+ int res_allocated_count = 0;
|
||||
+ int error = -EINVAL;
|
||||
+ struct fsl_mc_device_irq **irqs = NULL;
|
||||
+ struct fsl_mc_bus *mc_bus;
|
||||
+ struct fsl_mc_resource_pool *res_pool;
|
||||
+
|
||||
+ if (WARN_ON(mc_dev->irqs))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ irq_count = mc_dev->obj_desc.irq_count;
|
||||
+ if (WARN_ON(irq_count == 0))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ if (strcmp(mc_dev->obj_desc.type, "dprc") == 0)
|
||||
+ mc_bus = to_fsl_mc_bus(mc_dev);
|
||||
+ else
|
||||
+ mc_bus = to_fsl_mc_bus(to_fsl_mc_device(mc_dev->dev.parent));
|
||||
+
|
||||
+ if (WARN_ON(!mc_bus->irq_resources))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ res_pool = &mc_bus->resource_pools[FSL_MC_POOL_IRQ];
|
||||
+ if (res_pool->free_count < irq_count) {
|
||||
+ dev_err(&mc_dev->dev,
|
||||
+ "Not able to allocate %u irqs for device\n", irq_count);
|
||||
+ return -ENOSPC;
|
||||
+ }
|
||||
+
|
||||
+ irqs = devm_kzalloc(&mc_dev->dev, irq_count * sizeof(irqs[0]),
|
||||
+ GFP_KERNEL);
|
||||
+ if (!irqs)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ for (i = 0; i < irq_count; i++) {
|
||||
+ struct fsl_mc_resource *resource;
|
||||
+
|
||||
+ error = fsl_mc_resource_allocate(mc_bus, FSL_MC_POOL_IRQ,
|
||||
+ &resource);
|
||||
+ if (error < 0)
|
||||
+ goto error_resource_alloc;
|
||||
+
|
||||
+ irqs[i] = to_fsl_mc_irq(resource);
|
||||
+ res_allocated_count++;
|
||||
+
|
||||
+ WARN_ON(irqs[i]->mc_dev);
|
||||
+ irqs[i]->mc_dev = mc_dev;
|
||||
+ irqs[i]->dev_irq_index = i;
|
||||
+ }
|
||||
+
|
||||
+ mc_dev->irqs = irqs;
|
||||
+ return 0;
|
||||
+
|
||||
+error_resource_alloc:
|
||||
+ for (i = 0; i < res_allocated_count; i++) {
|
||||
+ irqs[i]->mc_dev = NULL;
|
||||
+ fsl_mc_resource_free(&irqs[i]->resource);
|
||||
+ }
|
||||
+
|
||||
+ return error;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(fsl_mc_allocate_irqs);
|
||||
+
|
||||
+/*
|
||||
+ * It frees the IRQs that were allocated for a MC object device, by
|
||||
+ * returning them to the corresponding interrupt pool.
|
||||
+ */
|
||||
+void fsl_mc_free_irqs(struct fsl_mc_device *mc_dev)
|
||||
+{
|
||||
+ int i;
|
||||
+ int irq_count;
|
||||
+ struct fsl_mc_bus *mc_bus;
|
||||
+ struct fsl_mc_device_irq **irqs = mc_dev->irqs;
|
||||
+
|
||||
+ if (WARN_ON(!irqs))
|
||||
+ return;
|
||||
+
|
||||
+ irq_count = mc_dev->obj_desc.irq_count;
|
||||
+
|
||||
+ if (strcmp(mc_dev->obj_desc.type, "dprc") == 0)
|
||||
+ mc_bus = to_fsl_mc_bus(mc_dev);
|
||||
+ else
|
||||
+ mc_bus = to_fsl_mc_bus(to_fsl_mc_device(mc_dev->dev.parent));
|
||||
+
|
||||
+ if (WARN_ON(!mc_bus->irq_resources))
|
||||
+ return;
|
||||
+
|
||||
+ for (i = 0; i < irq_count; i++) {
|
||||
+ WARN_ON(!irqs[i]->mc_dev);
|
||||
+ irqs[i]->mc_dev = NULL;
|
||||
+ fsl_mc_resource_free(&irqs[i]->resource);
|
||||
+ }
|
||||
+
|
||||
+ mc_dev->irqs = NULL;
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(fsl_mc_free_irqs);
|
||||
+
|
||||
/**
|
||||
* fsl_mc_allocator_probe - callback invoked when an allocatable device is
|
||||
* being added to the system
|
||||
--- a/drivers/staging/fsl-mc/include/mc-private.h
|
||||
+++ b/drivers/staging/fsl-mc/include/mc-private.h
|
||||
@@ -30,6 +30,16 @@ struct irq_domain;
|
||||
struct msi_domain_info;
|
||||
|
||||
/**
|
||||
+ * Maximum number of total IRQs that can be pre-allocated for an MC bus'
|
||||
+ * IRQ pool
|
||||
+ */
|
||||
+#define FSL_MC_IRQ_POOL_MAX_TOTAL_IRQS 256
|
||||
+
|
||||
+struct device_node;
|
||||
+struct irq_domain;
|
||||
+struct msi_domain_info;
|
||||
+
|
||||
+/**
|
||||
* struct fsl_mc - Private data of a "fsl,qoriq-mc" platform device
|
||||
* @root_mc_bus_dev: MC object device representing the root DPRC
|
||||
* @num_translation_ranges: number of entries in addr_translation_ranges
|
||||
@@ -137,4 +147,9 @@ int __init its_fsl_mc_msi_init(void);
|
||||
|
||||
void its_fsl_mc_msi_cleanup(void);
|
||||
|
||||
+int fsl_mc_populate_irq_pool(struct fsl_mc_bus *mc_bus,
|
||||
+ unsigned int irq_count);
|
||||
+
|
||||
+void fsl_mc_cleanup_irq_pool(struct fsl_mc_bus *mc_bus);
|
||||
+
|
||||
#endif /* _FSL_MC_PRIVATE_H_ */
|
||||
--- a/drivers/staging/fsl-mc/include/mc.h
|
||||
+++ b/drivers/staging/fsl-mc/include/mc.h
|
||||
@@ -14,12 +14,14 @@
|
||||
#include <linux/device.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/list.h>
|
||||
+#include <linux/interrupt.h>
|
||||
#include "../include/dprc.h"
|
||||
|
||||
#define FSL_MC_VENDOR_FREESCALE 0x1957
|
||||
|
||||
struct fsl_mc_device;
|
||||
struct fsl_mc_io;
|
||||
+struct fsl_mc_bus;
|
||||
|
||||
/**
|
||||
* struct fsl_mc_driver - MC object device driver object
|
||||
@@ -75,6 +77,7 @@ enum fsl_mc_pool_type {
|
||||
FSL_MC_POOL_DPMCP = 0x0, /* corresponds to "dpmcp" in the MC */
|
||||
FSL_MC_POOL_DPBP, /* corresponds to "dpbp" in the MC */
|
||||
FSL_MC_POOL_DPCON, /* corresponds to "dpcon" in the MC */
|
||||
+ FSL_MC_POOL_IRQ,
|
||||
|
||||
/*
|
||||
* NOTE: New resource pool types must be added before this entry
|
||||
@@ -141,6 +144,7 @@ struct fsl_mc_device_irq {
|
||||
* NULL if none.
|
||||
* @obj_desc: MC description of the DPAA device
|
||||
* @regions: pointer to array of MMIO region entries
|
||||
+ * @irqs: pointer to array of pointers to interrupts allocated to this device
|
||||
* @resource: generic resource associated with this MC object device, if any.
|
||||
*
|
||||
* Generic device object for MC object devices that are "attached" to a
|
||||
@@ -172,6 +176,7 @@ struct fsl_mc_device {
|
||||
struct fsl_mc_io *mc_io;
|
||||
struct dprc_obj_desc obj_desc;
|
||||
struct resource *regions;
|
||||
+ struct fsl_mc_device_irq **irqs;
|
||||
struct fsl_mc_resource *resource;
|
||||
};
|
||||
|
||||
@@ -215,6 +220,10 @@ int __must_check fsl_mc_object_allocate(
|
||||
|
||||
void fsl_mc_object_free(struct fsl_mc_device *mc_adev);
|
||||
|
||||
+int __must_check fsl_mc_allocate_irqs(struct fsl_mc_device *mc_dev);
|
||||
+
|
||||
+void fsl_mc_free_irqs(struct fsl_mc_device *mc_dev);
|
||||
+
|
||||
extern struct bus_type fsl_mc_bus_type;
|
||||
|
||||
#endif /* _FSL_MC_H_ */
|
@ -0,0 +1,44 @@
|
||||
From 0f2a65dea2024b7898e3c0b42e0a7864d6538567 Mon Sep 17 00:00:00 2001
|
||||
From: "J. German Rivera" <German.Rivera@freescale.com>
|
||||
Date: Wed, 6 Jan 2016 16:03:24 -0600
|
||||
Subject: [PATCH 148/226] staging: fsl-mc: Changed DPRC built-in portal's
|
||||
mc_io to be atomic
|
||||
|
||||
The DPRC built-in portal's mc_io is used to send commands to the MC
|
||||
to program MSIs for MC objects. This is done by the
|
||||
fsl_mc_msi_write_msg() callback, which is invoked by the generic MSI
|
||||
layer with interrupts disabled. As a result, the mc_io used in
|
||||
fsl_mc_msi_write_msg needs to be an atomic mc_io.
|
||||
|
||||
Signed-off-by: J. German Rivera <German.Rivera@freescale.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/dprc-driver.c | 4 +++-
|
||||
drivers/staging/fsl-mc/bus/mc-bus.c | 3 ++-
|
||||
2 files changed, 5 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/dprc-driver.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/dprc-driver.c
|
||||
@@ -396,7 +396,9 @@ static int dprc_probe(struct fsl_mc_devi
|
||||
error = fsl_create_mc_io(&mc_dev->dev,
|
||||
mc_dev->regions[0].start,
|
||||
region_size,
|
||||
- NULL, 0, &mc_dev->mc_io);
|
||||
+ NULL,
|
||||
+ FSL_MC_IO_ATOMIC_CONTEXT_PORTAL,
|
||||
+ &mc_dev->mc_io);
|
||||
if (error < 0)
|
||||
return error;
|
||||
}
|
||||
--- a/drivers/staging/fsl-mc/bus/mc-bus.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/mc-bus.c
|
||||
@@ -702,7 +702,8 @@ static int fsl_mc_bus_probe(struct platf
|
||||
mc_portal_phys_addr = res.start;
|
||||
mc_portal_size = resource_size(&res);
|
||||
error = fsl_create_mc_io(&pdev->dev, mc_portal_phys_addr,
|
||||
- mc_portal_size, NULL, 0, &mc_io);
|
||||
+ mc_portal_size, NULL,
|
||||
+ FSL_MC_IO_ATOMIC_CONTEXT_PORTAL, &mc_io);
|
||||
if (error < 0)
|
||||
return error;
|
||||
|
@ -0,0 +1,109 @@
|
||||
From 78ab7589777526022757e9c95b9d5864786eb4e5 Mon Sep 17 00:00:00 2001
|
||||
From: "J. German Rivera" <German.Rivera@freescale.com>
|
||||
Date: Wed, 6 Jan 2016 16:03:25 -0600
|
||||
Subject: [PATCH 149/226] staging: fsl-mc: Populate the IRQ pool for an MC bus
|
||||
instance
|
||||
|
||||
Scan the corresponding DPRC container to get total count
|
||||
of IRQs needed by all its child DPAA2 objects. Then,
|
||||
preallocate a set of MSI IRQs with the DPRC's ICID
|
||||
(GIT-ITS device Id) to populate the the DPRC's IRQ pool.
|
||||
Each child DPAA2 object in the DPRC and the DPRC object itself
|
||||
will allocate their necessary MSI IRQs from the DPRC's IRQ pool,
|
||||
in their driver probe function.
|
||||
|
||||
Signed-off-by: J. German Rivera <German.Rivera@freescale.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/dprc-driver.c | 24 ++++++++++++++++++++++--
|
||||
drivers/staging/fsl-mc/include/mc-private.h | 3 ++-
|
||||
2 files changed, 24 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/dprc-driver.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/dprc-driver.c
|
||||
@@ -241,6 +241,7 @@ static void dprc_cleanup_all_resource_po
|
||||
* dprc_scan_objects - Discover objects in a DPRC
|
||||
*
|
||||
* @mc_bus_dev: pointer to the fsl-mc device that represents a DPRC object
|
||||
+ * @total_irq_count: total number of IRQs needed by objects in the DPRC.
|
||||
*
|
||||
* Detects objects added and removed from a DPRC and synchronizes the
|
||||
* state of the Linux bus driver, MC by adding and removing
|
||||
@@ -254,11 +255,13 @@ static void dprc_cleanup_all_resource_po
|
||||
* populated before they can get allocation requests from probe callbacks
|
||||
* of the device drivers for the non-allocatable devices.
|
||||
*/
|
||||
-int dprc_scan_objects(struct fsl_mc_device *mc_bus_dev)
|
||||
+int dprc_scan_objects(struct fsl_mc_device *mc_bus_dev,
|
||||
+ unsigned int *total_irq_count)
|
||||
{
|
||||
int num_child_objects;
|
||||
int dprc_get_obj_failures;
|
||||
int error;
|
||||
+ unsigned int irq_count = mc_bus_dev->obj_desc.irq_count;
|
||||
struct dprc_obj_desc *child_obj_desc_array = NULL;
|
||||
|
||||
error = dprc_get_obj_count(mc_bus_dev->mc_io,
|
||||
@@ -307,6 +310,7 @@ int dprc_scan_objects(struct fsl_mc_devi
|
||||
continue;
|
||||
}
|
||||
|
||||
+ irq_count += obj_desc->irq_count;
|
||||
dev_dbg(&mc_bus_dev->dev,
|
||||
"Discovered object: type %s, id %d\n",
|
||||
obj_desc->type, obj_desc->id);
|
||||
@@ -319,6 +323,7 @@ int dprc_scan_objects(struct fsl_mc_devi
|
||||
}
|
||||
}
|
||||
|
||||
+ *total_irq_count = irq_count;
|
||||
dprc_remove_devices(mc_bus_dev, child_obj_desc_array,
|
||||
num_child_objects);
|
||||
|
||||
@@ -344,6 +349,7 @@ EXPORT_SYMBOL_GPL(dprc_scan_objects);
|
||||
int dprc_scan_container(struct fsl_mc_device *mc_bus_dev)
|
||||
{
|
||||
int error;
|
||||
+ unsigned int irq_count;
|
||||
struct fsl_mc_bus *mc_bus = to_fsl_mc_bus(mc_bus_dev);
|
||||
|
||||
dprc_init_all_resource_pools(mc_bus_dev);
|
||||
@@ -352,11 +358,25 @@ int dprc_scan_container(struct fsl_mc_de
|
||||
* Discover objects in the DPRC:
|
||||
*/
|
||||
mutex_lock(&mc_bus->scan_mutex);
|
||||
- error = dprc_scan_objects(mc_bus_dev);
|
||||
+ error = dprc_scan_objects(mc_bus_dev, &irq_count);
|
||||
mutex_unlock(&mc_bus->scan_mutex);
|
||||
if (error < 0)
|
||||
goto error;
|
||||
|
||||
+ if (dev_get_msi_domain(&mc_bus_dev->dev) && !mc_bus->irq_resources) {
|
||||
+ if (irq_count > FSL_MC_IRQ_POOL_MAX_TOTAL_IRQS) {
|
||||
+ dev_warn(&mc_bus_dev->dev,
|
||||
+ "IRQs needed (%u) exceed IRQs preallocated (%u)\n",
|
||||
+ irq_count, FSL_MC_IRQ_POOL_MAX_TOTAL_IRQS);
|
||||
+ }
|
||||
+
|
||||
+ error = fsl_mc_populate_irq_pool(
|
||||
+ mc_bus,
|
||||
+ FSL_MC_IRQ_POOL_MAX_TOTAL_IRQS);
|
||||
+ if (error < 0)
|
||||
+ goto error;
|
||||
+ }
|
||||
+
|
||||
return 0;
|
||||
error:
|
||||
dprc_cleanup_all_resource_pools(mc_bus_dev);
|
||||
--- a/drivers/staging/fsl-mc/include/mc-private.h
|
||||
+++ b/drivers/staging/fsl-mc/include/mc-private.h
|
||||
@@ -114,7 +114,8 @@ void fsl_mc_device_remove(struct fsl_mc_
|
||||
|
||||
int dprc_scan_container(struct fsl_mc_device *mc_bus_dev);
|
||||
|
||||
-int dprc_scan_objects(struct fsl_mc_device *mc_bus_dev);
|
||||
+int dprc_scan_objects(struct fsl_mc_device *mc_bus_dev,
|
||||
+ unsigned int *total_irq_count);
|
||||
|
||||
int __init dprc_driver_init(void);
|
||||
|
@ -0,0 +1,103 @@
|
||||
From 15bfab2641c61fb50a876860e8909ab84d2b8701 Mon Sep 17 00:00:00 2001
|
||||
From: "J. German Rivera" <German.Rivera@freescale.com>
|
||||
Date: Wed, 6 Jan 2016 16:03:26 -0600
|
||||
Subject: [PATCH 150/226] staging: fsl-mc: set MSI domain for DPRC objects
|
||||
|
||||
THE MSI domain associated with a root DPRC object is
|
||||
obtained form the device tree. Child DPRCs inherit
|
||||
the parent DPRC MSI domain.
|
||||
|
||||
Signed-off-by: J. German Rivera <German.Rivera@freescale.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/dprc-driver.c | 39 ++++++++++++++++++++++++++++++
|
||||
1 file changed, 39 insertions(+)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/dprc-driver.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/dprc-driver.c
|
||||
@@ -13,6 +13,7 @@
|
||||
#include "../include/mc-sys.h"
|
||||
#include <linux/module.h>
|
||||
#include <linux/slab.h>
|
||||
+#include <linux/interrupt.h>
|
||||
#include "dprc-cmd.h"
|
||||
|
||||
struct dprc_child_objs {
|
||||
@@ -398,11 +399,16 @@ static int dprc_probe(struct fsl_mc_devi
|
||||
{
|
||||
int error;
|
||||
size_t region_size;
|
||||
+ struct device *parent_dev = mc_dev->dev.parent;
|
||||
struct fsl_mc_bus *mc_bus = to_fsl_mc_bus(mc_dev);
|
||||
+ bool msi_domain_set = false;
|
||||
|
||||
if (WARN_ON(strcmp(mc_dev->obj_desc.type, "dprc") != 0))
|
||||
return -EINVAL;
|
||||
|
||||
+ if (WARN_ON(dev_get_msi_domain(&mc_dev->dev)))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
if (!mc_dev->mc_io) {
|
||||
/*
|
||||
* This is a child DPRC:
|
||||
@@ -421,6 +427,30 @@ static int dprc_probe(struct fsl_mc_devi
|
||||
&mc_dev->mc_io);
|
||||
if (error < 0)
|
||||
return error;
|
||||
+ /*
|
||||
+ * Inherit parent MSI domain:
|
||||
+ */
|
||||
+ dev_set_msi_domain(&mc_dev->dev,
|
||||
+ dev_get_msi_domain(parent_dev));
|
||||
+ msi_domain_set = true;
|
||||
+ } else {
|
||||
+ /*
|
||||
+ * This is a root DPRC
|
||||
+ */
|
||||
+ struct irq_domain *mc_msi_domain;
|
||||
+
|
||||
+ if (WARN_ON(parent_dev->bus == &fsl_mc_bus_type))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ error = fsl_mc_find_msi_domain(parent_dev,
|
||||
+ &mc_msi_domain);
|
||||
+ if (error < 0) {
|
||||
+ dev_warn(&mc_dev->dev,
|
||||
+ "WARNING: MC bus without interrupt support\n");
|
||||
+ } else {
|
||||
+ dev_set_msi_domain(&mc_dev->dev, mc_msi_domain);
|
||||
+ msi_domain_set = true;
|
||||
+ }
|
||||
}
|
||||
|
||||
error = dprc_open(mc_dev->mc_io, 0, mc_dev->obj_desc.id,
|
||||
@@ -446,6 +476,9 @@ error_cleanup_open:
|
||||
(void)dprc_close(mc_dev->mc_io, 0, mc_dev->mc_handle);
|
||||
|
||||
error_cleanup_mc_io:
|
||||
+ if (msi_domain_set)
|
||||
+ dev_set_msi_domain(&mc_dev->dev, NULL);
|
||||
+
|
||||
fsl_destroy_mc_io(mc_dev->mc_io);
|
||||
return error;
|
||||
}
|
||||
@@ -463,6 +496,7 @@ error_cleanup_mc_io:
|
||||
static int dprc_remove(struct fsl_mc_device *mc_dev)
|
||||
{
|
||||
int error;
|
||||
+ struct fsl_mc_bus *mc_bus = to_fsl_mc_bus(mc_dev);
|
||||
|
||||
if (WARN_ON(strcmp(mc_dev->obj_desc.type, "dprc") != 0))
|
||||
return -EINVAL;
|
||||
@@ -475,6 +509,11 @@ static int dprc_remove(struct fsl_mc_dev
|
||||
if (error < 0)
|
||||
dev_err(&mc_dev->dev, "dprc_close() failed: %d\n", error);
|
||||
|
||||
+ if (dev_get_msi_domain(&mc_dev->dev)) {
|
||||
+ fsl_mc_cleanup_irq_pool(mc_bus);
|
||||
+ dev_set_msi_domain(&mc_dev->dev, NULL);
|
||||
+ }
|
||||
+
|
||||
dev_info(&mc_dev->dev, "DPRC device unbound from driver");
|
||||
return 0;
|
||||
}
|
@ -0,0 +1,72 @@
|
||||
From 22aa842ae501ea8724afd45fcb0d7b17a67cb950 Mon Sep 17 00:00:00 2001
|
||||
From: "J. German Rivera" <German.Rivera@freescale.com>
|
||||
Date: Wed, 6 Jan 2016 16:03:27 -0600
|
||||
Subject: [PATCH 151/226] staging: fsl-mc: Fixed bug in dprc_probe() error
|
||||
path
|
||||
|
||||
Destroy mc_io in error path in dprc_probe() only if the mc_io was
|
||||
created in this function.
|
||||
|
||||
Signed-off-by: J. German Rivera <German.Rivera@freescale.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/dprc-driver.c | 17 ++++++++++++++---
|
||||
1 file changed, 14 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/dprc-driver.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/dprc-driver.c
|
||||
@@ -401,6 +401,7 @@ static int dprc_probe(struct fsl_mc_devi
|
||||
size_t region_size;
|
||||
struct device *parent_dev = mc_dev->dev.parent;
|
||||
struct fsl_mc_bus *mc_bus = to_fsl_mc_bus(mc_dev);
|
||||
+ bool mc_io_created = false;
|
||||
bool msi_domain_set = false;
|
||||
|
||||
if (WARN_ON(strcmp(mc_dev->obj_desc.type, "dprc") != 0))
|
||||
@@ -413,6 +414,9 @@ static int dprc_probe(struct fsl_mc_devi
|
||||
/*
|
||||
* This is a child DPRC:
|
||||
*/
|
||||
+ if (WARN_ON(parent_dev->bus != &fsl_mc_bus_type))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
if (WARN_ON(mc_dev->obj_desc.region_count == 0))
|
||||
return -EINVAL;
|
||||
|
||||
@@ -427,6 +431,9 @@ static int dprc_probe(struct fsl_mc_devi
|
||||
&mc_dev->mc_io);
|
||||
if (error < 0)
|
||||
return error;
|
||||
+
|
||||
+ mc_io_created = true;
|
||||
+
|
||||
/*
|
||||
* Inherit parent MSI domain:
|
||||
*/
|
||||
@@ -457,7 +464,7 @@ static int dprc_probe(struct fsl_mc_devi
|
||||
&mc_dev->mc_handle);
|
||||
if (error < 0) {
|
||||
dev_err(&mc_dev->dev, "dprc_open() failed: %d\n", error);
|
||||
- goto error_cleanup_mc_io;
|
||||
+ goto error_cleanup_msi_domain;
|
||||
}
|
||||
|
||||
mutex_init(&mc_bus->scan_mutex);
|
||||
@@ -475,11 +482,15 @@ static int dprc_probe(struct fsl_mc_devi
|
||||
error_cleanup_open:
|
||||
(void)dprc_close(mc_dev->mc_io, 0, mc_dev->mc_handle);
|
||||
|
||||
-error_cleanup_mc_io:
|
||||
+error_cleanup_msi_domain:
|
||||
if (msi_domain_set)
|
||||
dev_set_msi_domain(&mc_dev->dev, NULL);
|
||||
|
||||
- fsl_destroy_mc_io(mc_dev->mc_io);
|
||||
+ if (mc_io_created) {
|
||||
+ fsl_destroy_mc_io(mc_dev->mc_io);
|
||||
+ mc_dev->mc_io = NULL;
|
||||
+ }
|
||||
+
|
||||
return error;
|
||||
}
|
||||
|
@ -0,0 +1,301 @@
|
||||
From aa83997b14c31b34d9af24cb42726b55fa630464 Mon Sep 17 00:00:00 2001
|
||||
From: "J. German Rivera" <German.Rivera@freescale.com>
|
||||
Date: Wed, 6 Jan 2016 16:03:28 -0600
|
||||
Subject: [PATCH 152/226] staging: fsl-mc: Added DPRC interrupt handler
|
||||
|
||||
The interrupt handler for DPRC IRQs is added. DPRC IRQs are
|
||||
generated for hot plug events related to DPAA2 objects in a given
|
||||
DPRC. These events include, creating/destroying DPAA2 objects in
|
||||
the DPRC, changing the "plugged" state of DPAA2 objects and moving
|
||||
objects between DPRCs.
|
||||
|
||||
Signed-off-by: J. German Rivera <German.Rivera@freescale.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/dprc-driver.c | 247 ++++++++++++++++++++++++++++++
|
||||
1 file changed, 247 insertions(+)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/dprc-driver.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/dprc-driver.c
|
||||
@@ -14,6 +14,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/interrupt.h>
|
||||
+#include <linux/msi.h>
|
||||
#include "dprc-cmd.h"
|
||||
|
||||
struct dprc_child_objs {
|
||||
@@ -386,6 +387,230 @@ error:
|
||||
EXPORT_SYMBOL_GPL(dprc_scan_container);
|
||||
|
||||
/**
|
||||
+ * dprc_irq0_handler - Regular ISR for DPRC interrupt 0
|
||||
+ *
|
||||
+ * @irq: IRQ number of the interrupt being handled
|
||||
+ * @arg: Pointer to device structure
|
||||
+ */
|
||||
+static irqreturn_t dprc_irq0_handler(int irq_num, void *arg)
|
||||
+{
|
||||
+ return IRQ_WAKE_THREAD;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * dprc_irq0_handler_thread - Handler thread function for DPRC interrupt 0
|
||||
+ *
|
||||
+ * @irq: IRQ number of the interrupt being handled
|
||||
+ * @arg: Pointer to device structure
|
||||
+ */
|
||||
+static irqreturn_t dprc_irq0_handler_thread(int irq_num, void *arg)
|
||||
+{
|
||||
+ int error;
|
||||
+ u32 status;
|
||||
+ struct device *dev = (struct device *)arg;
|
||||
+ struct fsl_mc_device *mc_dev = to_fsl_mc_device(dev);
|
||||
+ struct fsl_mc_bus *mc_bus = to_fsl_mc_bus(mc_dev);
|
||||
+ struct fsl_mc_io *mc_io = mc_dev->mc_io;
|
||||
+ struct msi_desc *msi_desc = mc_dev->irqs[0]->msi_desc;
|
||||
+
|
||||
+ dev_dbg(dev, "DPRC IRQ %d triggered on CPU %u\n",
|
||||
+ irq_num, smp_processor_id());
|
||||
+
|
||||
+ if (WARN_ON(!(mc_dev->flags & FSL_MC_IS_DPRC)))
|
||||
+ return IRQ_HANDLED;
|
||||
+
|
||||
+ mutex_lock(&mc_bus->scan_mutex);
|
||||
+ if (WARN_ON(!msi_desc || msi_desc->irq != (u32)irq_num))
|
||||
+ goto out;
|
||||
+
|
||||
+ error = dprc_get_irq_status(mc_io, 0, mc_dev->mc_handle, 0,
|
||||
+ &status);
|
||||
+ if (error < 0) {
|
||||
+ dev_err(dev,
|
||||
+ "dprc_get_irq_status() failed: %d\n", error);
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ error = dprc_clear_irq_status(mc_io, 0, mc_dev->mc_handle, 0,
|
||||
+ status);
|
||||
+ if (error < 0) {
|
||||
+ dev_err(dev,
|
||||
+ "dprc_clear_irq_status() failed: %d\n", error);
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ if (status & (DPRC_IRQ_EVENT_OBJ_ADDED |
|
||||
+ DPRC_IRQ_EVENT_OBJ_REMOVED |
|
||||
+ DPRC_IRQ_EVENT_CONTAINER_DESTROYED |
|
||||
+ DPRC_IRQ_EVENT_OBJ_DESTROYED |
|
||||
+ DPRC_IRQ_EVENT_OBJ_CREATED)) {
|
||||
+ unsigned int irq_count;
|
||||
+
|
||||
+ error = dprc_scan_objects(mc_dev, &irq_count);
|
||||
+ if (error < 0) {
|
||||
+ /*
|
||||
+ * If the error is -ENXIO, we ignore it, as it indicates
|
||||
+ * that the object scan was aborted, as we detected that
|
||||
+ * an object was removed from the DPRC in the MC, while
|
||||
+ * we were scanning the DPRC.
|
||||
+ */
|
||||
+ if (error != -ENXIO) {
|
||||
+ dev_err(dev, "dprc_scan_objects() failed: %d\n",
|
||||
+ error);
|
||||
+ }
|
||||
+
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ if (irq_count > FSL_MC_IRQ_POOL_MAX_TOTAL_IRQS) {
|
||||
+ dev_warn(dev,
|
||||
+ "IRQs needed (%u) exceed IRQs preallocated (%u)\n",
|
||||
+ irq_count, FSL_MC_IRQ_POOL_MAX_TOTAL_IRQS);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+out:
|
||||
+ mutex_unlock(&mc_bus->scan_mutex);
|
||||
+ return IRQ_HANDLED;
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * Disable and clear interrupt for a given DPRC object
|
||||
+ */
|
||||
+static int disable_dprc_irq(struct fsl_mc_device *mc_dev)
|
||||
+{
|
||||
+ int error;
|
||||
+ struct fsl_mc_io *mc_io = mc_dev->mc_io;
|
||||
+
|
||||
+ WARN_ON(mc_dev->obj_desc.irq_count != 1);
|
||||
+
|
||||
+ /*
|
||||
+ * Disable generation of interrupt, while we configure it:
|
||||
+ */
|
||||
+ error = dprc_set_irq_enable(mc_io, 0, mc_dev->mc_handle, 0, 0);
|
||||
+ if (error < 0) {
|
||||
+ dev_err(&mc_dev->dev,
|
||||
+ "Disabling DPRC IRQ failed: dprc_set_irq_enable() failed: %d\n",
|
||||
+ error);
|
||||
+ return error;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * Disable all interrupt causes for the interrupt:
|
||||
+ */
|
||||
+ error = dprc_set_irq_mask(mc_io, 0, mc_dev->mc_handle, 0, 0x0);
|
||||
+ if (error < 0) {
|
||||
+ dev_err(&mc_dev->dev,
|
||||
+ "Disabling DPRC IRQ failed: dprc_set_irq_mask() failed: %d\n",
|
||||
+ error);
|
||||
+ return error;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * Clear any leftover interrupts:
|
||||
+ */
|
||||
+ error = dprc_clear_irq_status(mc_io, 0, mc_dev->mc_handle, 0, ~0x0U);
|
||||
+ if (error < 0) {
|
||||
+ dev_err(&mc_dev->dev,
|
||||
+ "Disabling DPRC IRQ failed: dprc_clear_irq_status() failed: %d\n",
|
||||
+ error);
|
||||
+ return error;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int register_dprc_irq_handler(struct fsl_mc_device *mc_dev)
|
||||
+{
|
||||
+ int error;
|
||||
+ struct fsl_mc_device_irq *irq = mc_dev->irqs[0];
|
||||
+
|
||||
+ WARN_ON(mc_dev->obj_desc.irq_count != 1);
|
||||
+
|
||||
+ /*
|
||||
+ * NOTE: devm_request_threaded_irq() invokes the device-specific
|
||||
+ * function that programs the MSI physically in the device
|
||||
+ */
|
||||
+ error = devm_request_threaded_irq(&mc_dev->dev,
|
||||
+ irq->msi_desc->irq,
|
||||
+ dprc_irq0_handler,
|
||||
+ dprc_irq0_handler_thread,
|
||||
+ IRQF_NO_SUSPEND | IRQF_ONESHOT,
|
||||
+ "FSL MC DPRC irq0",
|
||||
+ &mc_dev->dev);
|
||||
+ if (error < 0) {
|
||||
+ dev_err(&mc_dev->dev,
|
||||
+ "devm_request_threaded_irq() failed: %d\n",
|
||||
+ error);
|
||||
+ return error;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int enable_dprc_irq(struct fsl_mc_device *mc_dev)
|
||||
+{
|
||||
+ int error;
|
||||
+
|
||||
+ /*
|
||||
+ * Enable all interrupt causes for the interrupt:
|
||||
+ */
|
||||
+ error = dprc_set_irq_mask(mc_dev->mc_io, 0, mc_dev->mc_handle, 0,
|
||||
+ ~0x0u);
|
||||
+ if (error < 0) {
|
||||
+ dev_err(&mc_dev->dev,
|
||||
+ "Enabling DPRC IRQ failed: dprc_set_irq_mask() failed: %d\n",
|
||||
+ error);
|
||||
+
|
||||
+ return error;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * Enable generation of the interrupt:
|
||||
+ */
|
||||
+ error = dprc_set_irq_enable(mc_dev->mc_io, 0, mc_dev->mc_handle, 0, 1);
|
||||
+ if (error < 0) {
|
||||
+ dev_err(&mc_dev->dev,
|
||||
+ "Enabling DPRC IRQ failed: dprc_set_irq_enable() failed: %d\n",
|
||||
+ error);
|
||||
+
|
||||
+ return error;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * Setup interrupt for a given DPRC device
|
||||
+ */
|
||||
+static int dprc_setup_irq(struct fsl_mc_device *mc_dev)
|
||||
+{
|
||||
+ int error;
|
||||
+
|
||||
+ error = fsl_mc_allocate_irqs(mc_dev);
|
||||
+ if (error < 0)
|
||||
+ return error;
|
||||
+
|
||||
+ error = disable_dprc_irq(mc_dev);
|
||||
+ if (error < 0)
|
||||
+ goto error_free_irqs;
|
||||
+
|
||||
+ error = register_dprc_irq_handler(mc_dev);
|
||||
+ if (error < 0)
|
||||
+ goto error_free_irqs;
|
||||
+
|
||||
+ error = enable_dprc_irq(mc_dev);
|
||||
+ if (error < 0)
|
||||
+ goto error_free_irqs;
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
+error_free_irqs:
|
||||
+ fsl_mc_free_irqs(mc_dev);
|
||||
+ return error;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
* dprc_probe - callback invoked when a DPRC is being bound to this driver
|
||||
*
|
||||
* @mc_dev: Pointer to fsl-mc device representing a DPRC
|
||||
@@ -476,6 +701,13 @@ static int dprc_probe(struct fsl_mc_devi
|
||||
if (error < 0)
|
||||
goto error_cleanup_open;
|
||||
|
||||
+ /*
|
||||
+ * Configure interrupt for the DPRC object associated with this MC bus:
|
||||
+ */
|
||||
+ error = dprc_setup_irq(mc_dev);
|
||||
+ if (error < 0)
|
||||
+ goto error_cleanup_open;
|
||||
+
|
||||
dev_info(&mc_dev->dev, "DPRC device bound to driver");
|
||||
return 0;
|
||||
|
||||
@@ -494,6 +726,15 @@ error_cleanup_msi_domain:
|
||||
return error;
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * Tear down interrupt for a given DPRC object
|
||||
+ */
|
||||
+static void dprc_teardown_irq(struct fsl_mc_device *mc_dev)
|
||||
+{
|
||||
+ (void)disable_dprc_irq(mc_dev);
|
||||
+ fsl_mc_free_irqs(mc_dev);
|
||||
+}
|
||||
+
|
||||
/**
|
||||
* dprc_remove - callback invoked when a DPRC is being unbound from this driver
|
||||
*
|
||||
@@ -514,6 +755,12 @@ static int dprc_remove(struct fsl_mc_dev
|
||||
if (WARN_ON(!mc_dev->mc_io))
|
||||
return -EINVAL;
|
||||
|
||||
+ if (WARN_ON(!mc_bus->irq_resources))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ if (dev_get_msi_domain(&mc_dev->dev))
|
||||
+ dprc_teardown_irq(mc_dev);
|
||||
+
|
||||
device_for_each_child(&mc_dev->dev, NULL, __fsl_mc_device_remove);
|
||||
dprc_cleanup_all_resource_pools(mc_dev);
|
||||
error = dprc_close(mc_dev->mc_io, 0, mc_dev->mc_handle);
|
@ -0,0 +1,59 @@
|
||||
From f588a135d9260f2e7fe29b0bb0b5294fc9c99f6c Mon Sep 17 00:00:00 2001
|
||||
From: "J. German Rivera" <German.Rivera@freescale.com>
|
||||
Date: Wed, 6 Jan 2016 16:03:29 -0600
|
||||
Subject: [PATCH 153/226] staging: fsl-mc: Added MSI support to the MC bus
|
||||
driver
|
||||
|
||||
Initialize/Cleanup ITS-MSI support for the MC bus driver at driver
|
||||
init/exit time. Associate an MSI domain with each DPAA2 child device.
|
||||
|
||||
Signed-off-by: J. German Rivera <German.Rivera@freescale.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/mc-bus.c | 12 ++++++++++++
|
||||
1 file changed, 12 insertions(+)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/mc-bus.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/mc-bus.c
|
||||
@@ -16,6 +16,8 @@
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/limits.h>
|
||||
+#include <linux/bitops.h>
|
||||
+#include <linux/msi.h>
|
||||
#include "../include/dpmng.h"
|
||||
#include "../include/mc-sys.h"
|
||||
#include "dprc-cmd.h"
|
||||
@@ -472,6 +474,8 @@ int fsl_mc_device_add(struct dprc_obj_de
|
||||
mc_dev->icid = parent_mc_dev->icid;
|
||||
mc_dev->dma_mask = FSL_MC_DEFAULT_DMA_MASK;
|
||||
mc_dev->dev.dma_mask = &mc_dev->dma_mask;
|
||||
+ dev_set_msi_domain(&mc_dev->dev,
|
||||
+ dev_get_msi_domain(&parent_mc_dev->dev));
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -833,8 +837,15 @@ static int __init fsl_mc_bus_driver_init
|
||||
if (error < 0)
|
||||
goto error_cleanup_dprc_driver;
|
||||
|
||||
+ error = its_fsl_mc_msi_init();
|
||||
+ if (error < 0)
|
||||
+ goto error_cleanup_mc_allocator;
|
||||
+
|
||||
return 0;
|
||||
|
||||
+error_cleanup_mc_allocator:
|
||||
+ fsl_mc_allocator_driver_exit();
|
||||
+
|
||||
error_cleanup_dprc_driver:
|
||||
dprc_driver_exit();
|
||||
|
||||
@@ -856,6 +867,7 @@ static void __exit fsl_mc_bus_driver_exi
|
||||
if (WARN_ON(!mc_dev_cache))
|
||||
return;
|
||||
|
||||
+ its_fsl_mc_msi_cleanup();
|
||||
fsl_mc_allocator_driver_exit();
|
||||
dprc_driver_exit();
|
||||
platform_driver_unregister(&fsl_mc_bus_driver);
|
@ -0,0 +1,39 @@
|
||||
From 6ce3c078c4eac406b38de689c8e366d7345a51ba Mon Sep 17 00:00:00 2001
|
||||
From: Janani Ravichandran <janani.rvchndrn@gmail.com>
|
||||
Date: Thu, 11 Feb 2016 18:00:25 -0500
|
||||
Subject: [PATCH 154/226] staging: fsl-mc: Remove unneeded parentheses
|
||||
|
||||
Remove unneeded parentheses on the right hand side of assignment
|
||||
statements.
|
||||
Semantic patch:
|
||||
|
||||
@@
|
||||
expression a, b, c;
|
||||
@@
|
||||
|
||||
(
|
||||
a = (b == c)
|
||||
|
|
||||
a =
|
||||
- (
|
||||
b
|
||||
- )
|
||||
)
|
||||
|
||||
Signed-off-by: Janani Ravichandran <janani.rvchndrn@gmail.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/dprc-driver.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/dprc-driver.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/dprc-driver.c
|
||||
@@ -129,7 +129,7 @@ static void check_plugged_state_change(s
|
||||
{
|
||||
int error;
|
||||
u32 plugged_flag_at_mc =
|
||||
- (obj_desc->state & DPRC_OBJ_STATE_PLUGGED);
|
||||
+ obj_desc->state & DPRC_OBJ_STATE_PLUGGED;
|
||||
|
||||
if (plugged_flag_at_mc !=
|
||||
(mc_dev->obj_desc.state & DPRC_OBJ_STATE_PLUGGED)) {
|
@ -0,0 +1,30 @@
|
||||
From 322ff2fe86ec4dead2d2bceb20b624c72bdd1405 Mon Sep 17 00:00:00 2001
|
||||
From: Thierry Reding <treding@nvidia.com>
|
||||
Date: Mon, 15 Feb 2016 14:22:22 +0100
|
||||
Subject: [PATCH 155/226] staging: fsl-mc: Do not allow building as a module
|
||||
|
||||
This driver uses functionality (MSI IRQ domain) whose symbols aren't
|
||||
exported, and hence the modular build fails. While arguably there might
|
||||
be reasons to make these symbols available to modules, that change would
|
||||
be fairly involved and the set of exported functions should be carefully
|
||||
auditioned. Fix the build failure for now by marking the driver boolean.
|
||||
|
||||
Cc: J. German Rivera <German.Rivera@freescale.com>
|
||||
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Thierry Reding <treding@nvidia.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/Kconfig | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/Kconfig
|
||||
+++ b/drivers/staging/fsl-mc/bus/Kconfig
|
||||
@@ -7,7 +7,7 @@
|
||||
#
|
||||
|
||||
config FSL_MC_BUS
|
||||
- tristate "Freescale Management Complex (MC) bus driver"
|
||||
+ bool "Freescale Management Complex (MC) bus driver"
|
||||
depends on OF && ARM64
|
||||
select GENERIC_MSI_IRQ_DOMAIN
|
||||
help
|
@ -0,0 +1,43 @@
|
||||
From b2e5cfb43faf26517d191de65121f1a40166340f Mon Sep 17 00:00:00 2001
|
||||
From: Thierry Reding <treding@nvidia.com>
|
||||
Date: Mon, 15 Feb 2016 14:22:23 +0100
|
||||
Subject: [PATCH 156/226] staging: fsl-mc: Avoid section mismatch
|
||||
|
||||
The fsl_mc_allocator_driver_exit() function is marked __exit, but is
|
||||
called by the error handling code in fsl_mc_allocator_driver_init().
|
||||
This results in a section mismatch, which in turn could lead to
|
||||
executing random code.
|
||||
|
||||
Remove the __exit annotation to fix this.
|
||||
|
||||
Cc: J. German Rivera <German.Rivera@freescale.com>
|
||||
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Signed-off-by: Thierry Reding <treding@nvidia.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/mc-allocator.c | 2 +-
|
||||
drivers/staging/fsl-mc/include/mc-private.h | 2 +-
|
||||
2 files changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/mc-allocator.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/mc-allocator.c
|
||||
@@ -756,7 +756,7 @@ int __init fsl_mc_allocator_driver_init(
|
||||
return fsl_mc_driver_register(&fsl_mc_allocator_driver);
|
||||
}
|
||||
|
||||
-void __exit fsl_mc_allocator_driver_exit(void)
|
||||
+void fsl_mc_allocator_driver_exit(void)
|
||||
{
|
||||
fsl_mc_driver_unregister(&fsl_mc_allocator_driver);
|
||||
}
|
||||
--- a/drivers/staging/fsl-mc/include/mc-private.h
|
||||
+++ b/drivers/staging/fsl-mc/include/mc-private.h
|
||||
@@ -123,7 +123,7 @@ void dprc_driver_exit(void);
|
||||
|
||||
int __init fsl_mc_allocator_driver_init(void);
|
||||
|
||||
-void __exit fsl_mc_allocator_driver_exit(void);
|
||||
+void fsl_mc_allocator_driver_exit(void);
|
||||
|
||||
int __must_check fsl_mc_resource_allocate(struct fsl_mc_bus *mc_bus,
|
||||
enum fsl_mc_pool_type pool_type,
|
@ -0,0 +1,45 @@
|
||||
From 5f82c6ff69f3a4bb635e619a893292bea711421e Mon Sep 17 00:00:00 2001
|
||||
From: Janani Ravichandran <janani.rvchndrn@gmail.com>
|
||||
Date: Thu, 18 Feb 2016 17:22:50 -0500
|
||||
Subject: [PATCH 157/226] staging: fsl-mc: Remove unneeded else following a
|
||||
return
|
||||
|
||||
Remove unnecessary else when there is a return statement in the
|
||||
corresponding if block. Coccinelle patch used:
|
||||
|
||||
@rule1@
|
||||
expression e1;
|
||||
@@
|
||||
|
||||
if (e1) { ... return ...; }
|
||||
- else{
|
||||
...
|
||||
- }
|
||||
|
||||
@rule2@
|
||||
expression e2;
|
||||
statement s1;
|
||||
@@
|
||||
|
||||
if(e2) { ... return ...; }
|
||||
- else
|
||||
s1
|
||||
|
||||
Signed-off-by: Janani Ravichandran <janani.rvchndrn@gmail.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/mc-bus.c | 3 +--
|
||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/mc-bus.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/mc-bus.c
|
||||
@@ -248,8 +248,7 @@ static bool fsl_mc_is_root_dprc(struct d
|
||||
fsl_mc_get_root_dprc(dev, &root_dprc_dev);
|
||||
if (!root_dprc_dev)
|
||||
return false;
|
||||
- else
|
||||
- return dev == root_dprc_dev;
|
||||
+ return dev == root_dprc_dev;
|
||||
}
|
||||
|
||||
static int get_dprc_icid(struct fsl_mc_io *mc_io,
|
@ -0,0 +1,43 @@
|
||||
From d9605741556a15dceed105afd7369d644aa46207 Mon Sep 17 00:00:00 2001
|
||||
From: Janani Ravichandran <janani.rvchndrn@gmail.com>
|
||||
Date: Thu, 25 Feb 2016 14:46:11 -0500
|
||||
Subject: [PATCH 158/226] staging: fsl-mc: Drop unneeded void pointer cast
|
||||
|
||||
Void pointers need not be cast to other pointer types.
|
||||
Semantic patch used:
|
||||
|
||||
@r@
|
||||
expression x;
|
||||
void *e;
|
||||
type T;
|
||||
identifier f;
|
||||
@@
|
||||
|
||||
(
|
||||
*((T *)e)
|
||||
|
|
||||
((T *)x) [...]
|
||||
|
|
||||
((T *)x)->f
|
||||
|
|
||||
- (T *)
|
||||
e
|
||||
)
|
||||
|
||||
Signed-off-by: Janani Ravichandran <janani.rvchndrn@gmail.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/dprc-driver.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/dprc-driver.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/dprc-driver.c
|
||||
@@ -407,7 +407,7 @@ static irqreturn_t dprc_irq0_handler_thr
|
||||
{
|
||||
int error;
|
||||
u32 status;
|
||||
- struct device *dev = (struct device *)arg;
|
||||
+ struct device *dev = arg;
|
||||
struct fsl_mc_device *mc_dev = to_fsl_mc_device(dev);
|
||||
struct fsl_mc_bus *mc_bus = to_fsl_mc_bus(mc_dev);
|
||||
struct fsl_mc_io *mc_io = mc_dev->mc_io;
|
@ -0,0 +1,73 @@
|
||||
From ecd7b5d9616e50f48a400749f17db19fd8a43f25 Mon Sep 17 00:00:00 2001
|
||||
From: Bhaktipriya Shridhar <bhaktipriya96@gmail.com>
|
||||
Date: Sun, 28 Feb 2016 23:58:05 +0530
|
||||
Subject: [PATCH 159/226] staging: fsl-mc: bus: Eliminate double function call
|
||||
|
||||
A call to irq_find_matching_host was already made and the result
|
||||
has been stored in mc_msi_domain. mc_msi_domain is again reassigned
|
||||
using the same function call which is redundant.
|
||||
|
||||
irq_find_matching_host returns/locates a domain for a given fwnode.
|
||||
The domain is identified using device node and bus_token(if several
|
||||
domains have same device node but different purposes they can be
|
||||
distinguished using bus-specific token).
|
||||
http://www.bricktou.com/include/linux/irqdomain_irq_find_matching_host_en.html
|
||||
|
||||
Also, of_property_read_bool finds and reads a boolean from a property
|
||||
device node from which the property value is to be read. It doesn't
|
||||
alter the device node.
|
||||
http://lists.infradead.org/pipermail/linux-arm-kernel/2012-February/083698.html
|
||||
|
||||
Since, both the function calls have the same device node and bus_token,
|
||||
the return values shall be the same. Hence, the second call has been
|
||||
removed.
|
||||
|
||||
This was done using Coccinelle:
|
||||
|
||||
@r@
|
||||
idexpression *x;
|
||||
identifier f;
|
||||
position p1,p2;
|
||||
@@
|
||||
|
||||
x@p1 = f(...)
|
||||
... when != x
|
||||
(
|
||||
x@p2 = f(...)
|
||||
)
|
||||
|
||||
@script:python@
|
||||
p1 << r.p1;
|
||||
p2 << r.p2;
|
||||
@@
|
||||
|
||||
if (p1[0].line == p2[0].line):
|
||||
cocci.include_match(False)
|
||||
|
||||
@@
|
||||
idexpression *x;
|
||||
identifier f;
|
||||
position r.p1,r.p2;
|
||||
@@
|
||||
|
||||
*x@p1 = f(...)
|
||||
...
|
||||
*x@p2 = f(...)
|
||||
|
||||
Signed-off-by: Bhaktipriya Shridhar <bhaktipriya96@gmail.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
.../staging/fsl-mc/bus/irq-gic-v3-its-fsl-mc-msi.c | 2 --
|
||||
1 file changed, 2 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/irq-gic-v3-its-fsl-mc-msi.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/irq-gic-v3-its-fsl-mc-msi.c
|
||||
@@ -118,8 +118,6 @@ void its_fsl_mc_msi_cleanup(void)
|
||||
if (!of_property_read_bool(np, "msi-controller"))
|
||||
continue;
|
||||
|
||||
- mc_msi_domain = irq_find_matching_host(np,
|
||||
- DOMAIN_BUS_FSL_MC_MSI);
|
||||
if (mc_msi_domain &&
|
||||
mc_msi_domain->host_data == &its_fsl_mc_msi_domain_info)
|
||||
irq_domain_remove(mc_msi_domain);
|
@ -0,0 +1,96 @@
|
||||
From 8727f71717b449a4c74a5a599374c05822d525f7 Mon Sep 17 00:00:00 2001
|
||||
From: Bhumika Goyal <bhumirks@gmail.com>
|
||||
Date: Fri, 4 Mar 2016 19:14:52 +0530
|
||||
Subject: [PATCH 160/226] Staging: fsl-mc: Replace pr_debug with dev_dbg
|
||||
|
||||
This patch replaces pr_debug calls with dev_dbg when the device structure
|
||||
is available as dev_* prints identifying information about the struct
|
||||
device.
|
||||
Done using coccinelle:
|
||||
|
||||
@r exists@
|
||||
identifier f, s;
|
||||
identifier x;
|
||||
position p;
|
||||
@@
|
||||
f(...,struct s *x,...) {
|
||||
<+...
|
||||
when != x == NULL
|
||||
\(pr_err@p\|pr_debug@p\|pr_info\)(...);
|
||||
...+>
|
||||
}
|
||||
|
||||
@r2@
|
||||
identifier fld2;
|
||||
identifier r.s;
|
||||
@@
|
||||
|
||||
struct s {
|
||||
...
|
||||
struct device *fld2;
|
||||
...
|
||||
};
|
||||
|
||||
@@
|
||||
identifier r.x,r2.fld2;
|
||||
position r.p;
|
||||
@@
|
||||
|
||||
(
|
||||
-pr_err@p
|
||||
+dev_err
|
||||
(
|
||||
+ &x->fld2,
|
||||
...)
|
||||
|
|
||||
- pr_debug@p
|
||||
+ dev_dbg
|
||||
(
|
||||
+ &x->fld2,
|
||||
...)
|
||||
|
|
||||
- pr_info@p
|
||||
+ dev_info
|
||||
(
|
||||
+ &x->fld2,
|
||||
...)
|
||||
)
|
||||
|
||||
Signed-off-by: Bhumika Goyal <bhumirks@gmail.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/mc-sys.c | 9 ++++++---
|
||||
1 file changed, 6 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/mc-sys.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/mc-sys.c
|
||||
@@ -328,7 +328,8 @@ static int mc_polling_wait_preemptible(s
|
||||
MC_CMD_COMPLETION_POLLING_MAX_SLEEP_USECS);
|
||||
|
||||
if (time_after_eq(jiffies, jiffies_until_timeout)) {
|
||||
- pr_debug("MC command timed out (portal: %#llx, obj handle: %#x, command: %#x)\n",
|
||||
+ dev_dbg(&mc_io->dev,
|
||||
+ "MC command timed out (portal: %#llx, obj handle: %#x, command: %#x)\n",
|
||||
mc_io->portal_phys_addr,
|
||||
(unsigned int)
|
||||
MC_CMD_HDR_READ_TOKEN(cmd->header),
|
||||
@@ -369,7 +370,8 @@ static int mc_polling_wait_atomic(struct
|
||||
udelay(MC_CMD_COMPLETION_POLLING_MAX_SLEEP_USECS);
|
||||
timeout_usecs -= MC_CMD_COMPLETION_POLLING_MAX_SLEEP_USECS;
|
||||
if (timeout_usecs == 0) {
|
||||
- pr_debug("MC command timed out (portal: %#llx, obj handle: %#x, command: %#x)\n",
|
||||
+ dev_dbg(&mc_io->dev,
|
||||
+ "MC command timed out (portal: %#llx, obj handle: %#x, command: %#x)\n",
|
||||
mc_io->portal_phys_addr,
|
||||
(unsigned int)
|
||||
MC_CMD_HDR_READ_TOKEN(cmd->header),
|
||||
@@ -424,7 +426,8 @@ int mc_send_command(struct fsl_mc_io *mc
|
||||
goto common_exit;
|
||||
|
||||
if (status != MC_CMD_STATUS_OK) {
|
||||
- pr_debug("MC command failed: portal: %#llx, obj handle: %#x, command: %#x, status: %s (%#x)\n",
|
||||
+ dev_dbg(&mc_io->dev,
|
||||
+ "MC command failed: portal: %#llx, obj handle: %#x, command: %#x, status: %s (%#x)\n",
|
||||
mc_io->portal_phys_addr,
|
||||
(unsigned int)MC_CMD_HDR_READ_TOKEN(cmd->header),
|
||||
(unsigned int)MC_CMD_HDR_READ_CMDID(cmd->header),
|
@ -0,0 +1,83 @@
|
||||
From 79b4625a6ab72251e00aa94ee22a6bfe32dbeeda Mon Sep 17 00:00:00 2001
|
||||
From: Bhumika Goyal <bhumirks@gmail.com>
|
||||
Date: Fri, 4 Mar 2016 19:15:55 +0530
|
||||
Subject: [PATCH 161/226] Staging: fsl-mc: Replace pr_err with dev_err
|
||||
|
||||
This patch replaces pr_err calls with dev_err when the device structure
|
||||
is available as dev_* prints identifying information about the struct device.
|
||||
Done using coccinelle:
|
||||
|
||||
@r exists@
|
||||
identifier f, s;
|
||||
identifier x;
|
||||
position p;
|
||||
@@
|
||||
f(...,struct s *x,...) {
|
||||
<+...
|
||||
when != x == NULL
|
||||
\(pr_err@p\|pr_debug@p\|pr_info\)(...);
|
||||
...+>
|
||||
}
|
||||
|
||||
@r2@
|
||||
identifier fld2;
|
||||
identifier r.s;
|
||||
@@
|
||||
|
||||
struct s {
|
||||
...
|
||||
struct device *fld2;
|
||||
...
|
||||
};
|
||||
|
||||
@@
|
||||
identifier r.x,r2.fld2;
|
||||
position r.p;
|
||||
@@
|
||||
|
||||
(
|
||||
-pr_err@p
|
||||
+dev_err
|
||||
(
|
||||
+ &x->fld2,
|
||||
...)
|
||||
|
|
||||
- pr_debug@p
|
||||
+ dev_dbg
|
||||
(
|
||||
+ &x->fld2,
|
||||
...)
|
||||
|
|
||||
- pr_info@p
|
||||
+ dev_info
|
||||
(
|
||||
+ &x->fld2,
|
||||
...)
|
||||
)
|
||||
|
||||
Signed-off-by: Bhumika Goyal <bhumirks@gmail.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/mc-bus.c | 5 +++--
|
||||
1 file changed, 3 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/mc-bus.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/mc-bus.c
|
||||
@@ -260,14 +260,15 @@ static int get_dprc_icid(struct fsl_mc_i
|
||||
|
||||
error = dprc_open(mc_io, 0, container_id, &dprc_handle);
|
||||
if (error < 0) {
|
||||
- pr_err("dprc_open() failed: %d\n", error);
|
||||
+ dev_err(&mc_io->dev, "dprc_open() failed: %d\n", error);
|
||||
return error;
|
||||
}
|
||||
|
||||
memset(&attr, 0, sizeof(attr));
|
||||
error = dprc_get_attributes(mc_io, 0, dprc_handle, &attr);
|
||||
if (error < 0) {
|
||||
- pr_err("dprc_get_attributes() failed: %d\n", error);
|
||||
+ dev_err(&mc_io->dev, "dprc_get_attributes() failed: %d\n",
|
||||
+ error);
|
||||
goto common_cleanup;
|
||||
}
|
||||
|
@ -0,0 +1,48 @@
|
||||
From 83e0f572a74bceeb3736b19b929c91d12d1d6d80 Mon Sep 17 00:00:00 2001
|
||||
From: Cihangir Akturk <cakturk@gmail.com>
|
||||
Date: Mon, 14 Mar 2016 18:14:06 +0200
|
||||
Subject: [PATCH 162/226] staging: fsl-mc: fix incorrect type passed to
|
||||
dev_dbg macros
|
||||
|
||||
dev_dbg macros expect const struct device ** as its second
|
||||
argument but here the argument we are passing is of type
|
||||
struct device ** this patch fixes this error.
|
||||
|
||||
Fixes: de71daf5c839 ("Staging: fsl-mc: Replace pr_debug with dev_dbg")
|
||||
Cc: Bhumika Goyal <bhumirks@gmail.com>
|
||||
Reported-by: Guenter Roeck <linux@roeck-us.net>
|
||||
Signed-off-by: Cihangir Akturk <cakturk@gmail.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/mc-sys.c | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/mc-sys.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/mc-sys.c
|
||||
@@ -328,7 +328,7 @@ static int mc_polling_wait_preemptible(s
|
||||
MC_CMD_COMPLETION_POLLING_MAX_SLEEP_USECS);
|
||||
|
||||
if (time_after_eq(jiffies, jiffies_until_timeout)) {
|
||||
- dev_dbg(&mc_io->dev,
|
||||
+ dev_dbg(mc_io->dev,
|
||||
"MC command timed out (portal: %#llx, obj handle: %#x, command: %#x)\n",
|
||||
mc_io->portal_phys_addr,
|
||||
(unsigned int)
|
||||
@@ -370,7 +370,7 @@ static int mc_polling_wait_atomic(struct
|
||||
udelay(MC_CMD_COMPLETION_POLLING_MAX_SLEEP_USECS);
|
||||
timeout_usecs -= MC_CMD_COMPLETION_POLLING_MAX_SLEEP_USECS;
|
||||
if (timeout_usecs == 0) {
|
||||
- dev_dbg(&mc_io->dev,
|
||||
+ dev_dbg(mc_io->dev,
|
||||
"MC command timed out (portal: %#llx, obj handle: %#x, command: %#x)\n",
|
||||
mc_io->portal_phys_addr,
|
||||
(unsigned int)
|
||||
@@ -426,7 +426,7 @@ int mc_send_command(struct fsl_mc_io *mc
|
||||
goto common_exit;
|
||||
|
||||
if (status != MC_CMD_STATUS_OK) {
|
||||
- dev_dbg(&mc_io->dev,
|
||||
+ dev_dbg(mc_io->dev,
|
||||
"MC command failed: portal: %#llx, obj handle: %#x, command: %#x, status: %s (%#x)\n",
|
||||
mc_io->portal_phys_addr,
|
||||
(unsigned int)MC_CMD_HDR_READ_TOKEN(cmd->header),
|
@ -0,0 +1,38 @@
|
||||
From 79929c151efbc047a8a82f9cafcb9238465caa86 Mon Sep 17 00:00:00 2001
|
||||
From: Cihangir Akturk <cakturk@gmail.com>
|
||||
Date: Mon, 14 Mar 2016 18:14:07 +0200
|
||||
Subject: [PATCH 163/226] staging: fsl-mc: fix incorrect type passed to
|
||||
dev_err macros
|
||||
|
||||
dev_err macros expect const struct device ** as its second
|
||||
argument, but here the argument we are passing is of typ
|
||||
struct device **. This patch fixes this error.
|
||||
|
||||
Fixes: 454b0ec8bf99 ("Staging: fsl-mc: Replace pr_err with dev_err")
|
||||
Cc: Bhumika Goyal <bhumirks@gmail.com>
|
||||
Reported-by: Guenter Roeck <linux@roeck-us.net>
|
||||
Signed-off-by: Cihangir Akturk <cakturk@gmail.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/mc-bus.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/mc-bus.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/mc-bus.c
|
||||
@@ -260,14 +260,14 @@ static int get_dprc_icid(struct fsl_mc_i
|
||||
|
||||
error = dprc_open(mc_io, 0, container_id, &dprc_handle);
|
||||
if (error < 0) {
|
||||
- dev_err(&mc_io->dev, "dprc_open() failed: %d\n", error);
|
||||
+ dev_err(mc_io->dev, "dprc_open() failed: %d\n", error);
|
||||
return error;
|
||||
}
|
||||
|
||||
memset(&attr, 0, sizeof(attr));
|
||||
error = dprc_get_attributes(mc_io, 0, dprc_handle, &attr);
|
||||
if (error < 0) {
|
||||
- dev_err(&mc_io->dev, "dprc_get_attributes() failed: %d\n",
|
||||
+ dev_err(mc_io->dev, "dprc_get_attributes() failed: %d\n",
|
||||
error);
|
||||
goto common_cleanup;
|
||||
}
|
@ -0,0 +1,207 @@
|
||||
From d36a6b361a3a181559daebcf32e11ab18431a854 Mon Sep 17 00:00:00 2001
|
||||
From: Cihangir Akturk <cakturk@gmail.com>
|
||||
Date: Sat, 9 Apr 2016 21:45:18 +0300
|
||||
Subject: [PATCH 164/226] staging: fsl-mc: get rid of mutex_locked variables
|
||||
|
||||
Remove mutex_locked variables which are used to determine whether mutex is
|
||||
locked, instead add another label to unlock mutex on premature exits due to
|
||||
an error.
|
||||
|
||||
This patch also addresses the folowing warnings reported by coccinelle:
|
||||
|
||||
drivers/staging/fsl-mc/bus/mc-allocator.c:237:1-7: preceding lock on line 204
|
||||
drivers/staging/fsl-mc/bus/mc-allocator.c:89:1-7: preceding lock on line 57
|
||||
drivers/staging/fsl-mc/bus/mc-allocator.c:157:1-7: preceding lock on line 124
|
||||
|
||||
Signed-off-by: Cihangir Akturk <cakturk@gmail.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/mc-allocator.c | 61 ++++++++++++-----------------
|
||||
1 file changed, 24 insertions(+), 37 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/mc-allocator.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/mc-allocator.c
|
||||
@@ -39,7 +39,6 @@ static int __must_check fsl_mc_resource_
|
||||
struct fsl_mc_resource *resource;
|
||||
struct fsl_mc_device *mc_bus_dev = &mc_bus->mc_dev;
|
||||
int error = -EINVAL;
|
||||
- bool mutex_locked = false;
|
||||
|
||||
if (WARN_ON(pool_type < 0 || pool_type >= FSL_MC_NUM_POOL_TYPES))
|
||||
goto out;
|
||||
@@ -55,13 +54,12 @@ static int __must_check fsl_mc_resource_
|
||||
goto out;
|
||||
|
||||
mutex_lock(&res_pool->mutex);
|
||||
- mutex_locked = true;
|
||||
|
||||
if (WARN_ON(res_pool->max_count < 0))
|
||||
- goto out;
|
||||
+ goto out_unlock;
|
||||
if (WARN_ON(res_pool->free_count < 0 ||
|
||||
res_pool->free_count > res_pool->max_count))
|
||||
- goto out;
|
||||
+ goto out_unlock;
|
||||
|
||||
resource = devm_kzalloc(&mc_bus_dev->dev, sizeof(*resource),
|
||||
GFP_KERNEL);
|
||||
@@ -69,7 +67,7 @@ static int __must_check fsl_mc_resource_
|
||||
error = -ENOMEM;
|
||||
dev_err(&mc_bus_dev->dev,
|
||||
"Failed to allocate memory for fsl_mc_resource\n");
|
||||
- goto out;
|
||||
+ goto out_unlock;
|
||||
}
|
||||
|
||||
resource->type = pool_type;
|
||||
@@ -82,10 +80,9 @@ static int __must_check fsl_mc_resource_
|
||||
res_pool->free_count++;
|
||||
res_pool->max_count++;
|
||||
error = 0;
|
||||
+out_unlock:
|
||||
+ mutex_unlock(&res_pool->mutex);
|
||||
out:
|
||||
- if (mutex_locked)
|
||||
- mutex_unlock(&res_pool->mutex);
|
||||
-
|
||||
return error;
|
||||
}
|
||||
|
||||
@@ -106,7 +103,6 @@ static int __must_check fsl_mc_resource_
|
||||
struct fsl_mc_resource_pool *res_pool;
|
||||
struct fsl_mc_resource *resource;
|
||||
int error = -EINVAL;
|
||||
- bool mutex_locked = false;
|
||||
|
||||
if (WARN_ON(!FSL_MC_IS_ALLOCATABLE(mc_dev->obj_desc.type)))
|
||||
goto out;
|
||||
@@ -122,13 +118,12 @@ static int __must_check fsl_mc_resource_
|
||||
goto out;
|
||||
|
||||
mutex_lock(&res_pool->mutex);
|
||||
- mutex_locked = true;
|
||||
|
||||
if (WARN_ON(res_pool->max_count <= 0))
|
||||
- goto out;
|
||||
+ goto out_unlock;
|
||||
if (WARN_ON(res_pool->free_count <= 0 ||
|
||||
res_pool->free_count > res_pool->max_count))
|
||||
- goto out;
|
||||
+ goto out_unlock;
|
||||
|
||||
/*
|
||||
* If the device is currently allocated, its resource is not
|
||||
@@ -139,7 +134,7 @@ static int __must_check fsl_mc_resource_
|
||||
dev_err(&mc_bus_dev->dev,
|
||||
"Device %s cannot be removed from resource pool\n",
|
||||
dev_name(&mc_dev->dev));
|
||||
- goto out;
|
||||
+ goto out_unlock;
|
||||
}
|
||||
|
||||
list_del(&resource->node);
|
||||
@@ -150,10 +145,9 @@ static int __must_check fsl_mc_resource_
|
||||
devm_kfree(&mc_bus_dev->dev, resource);
|
||||
mc_dev->resource = NULL;
|
||||
error = 0;
|
||||
+out_unlock:
|
||||
+ mutex_unlock(&res_pool->mutex);
|
||||
out:
|
||||
- if (mutex_locked)
|
||||
- mutex_unlock(&res_pool->mutex);
|
||||
-
|
||||
return error;
|
||||
}
|
||||
|
||||
@@ -188,21 +182,19 @@ int __must_check fsl_mc_resource_allocat
|
||||
struct fsl_mc_resource *resource;
|
||||
struct fsl_mc_device *mc_bus_dev = &mc_bus->mc_dev;
|
||||
int error = -EINVAL;
|
||||
- bool mutex_locked = false;
|
||||
|
||||
BUILD_BUG_ON(ARRAY_SIZE(fsl_mc_pool_type_strings) !=
|
||||
FSL_MC_NUM_POOL_TYPES);
|
||||
|
||||
*new_resource = NULL;
|
||||
if (WARN_ON(pool_type < 0 || pool_type >= FSL_MC_NUM_POOL_TYPES))
|
||||
- goto error;
|
||||
+ goto out;
|
||||
|
||||
res_pool = &mc_bus->resource_pools[pool_type];
|
||||
if (WARN_ON(res_pool->mc_bus != mc_bus))
|
||||
- goto error;
|
||||
+ goto out;
|
||||
|
||||
mutex_lock(&res_pool->mutex);
|
||||
- mutex_locked = true;
|
||||
resource = list_first_entry_or_null(&res_pool->free_list,
|
||||
struct fsl_mc_resource, node);
|
||||
|
||||
@@ -212,28 +204,26 @@ int __must_check fsl_mc_resource_allocat
|
||||
dev_err(&mc_bus_dev->dev,
|
||||
"No more resources of type %s left\n",
|
||||
fsl_mc_pool_type_strings[pool_type]);
|
||||
- goto error;
|
||||
+ goto out_unlock;
|
||||
}
|
||||
|
||||
if (WARN_ON(resource->type != pool_type))
|
||||
- goto error;
|
||||
+ goto out_unlock;
|
||||
if (WARN_ON(resource->parent_pool != res_pool))
|
||||
- goto error;
|
||||
+ goto out_unlock;
|
||||
if (WARN_ON(res_pool->free_count <= 0 ||
|
||||
res_pool->free_count > res_pool->max_count))
|
||||
- goto error;
|
||||
+ goto out_unlock;
|
||||
|
||||
list_del(&resource->node);
|
||||
INIT_LIST_HEAD(&resource->node);
|
||||
|
||||
res_pool->free_count--;
|
||||
+ error = 0;
|
||||
+out_unlock:
|
||||
mutex_unlock(&res_pool->mutex);
|
||||
*new_resource = resource;
|
||||
- return 0;
|
||||
-error:
|
||||
- if (mutex_locked)
|
||||
- mutex_unlock(&res_pool->mutex);
|
||||
-
|
||||
+out:
|
||||
return error;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(fsl_mc_resource_allocate);
|
||||
@@ -241,26 +231,23 @@ EXPORT_SYMBOL_GPL(fsl_mc_resource_alloca
|
||||
void fsl_mc_resource_free(struct fsl_mc_resource *resource)
|
||||
{
|
||||
struct fsl_mc_resource_pool *res_pool;
|
||||
- bool mutex_locked = false;
|
||||
|
||||
res_pool = resource->parent_pool;
|
||||
if (WARN_ON(resource->type != res_pool->type))
|
||||
- goto out;
|
||||
+ return;
|
||||
|
||||
mutex_lock(&res_pool->mutex);
|
||||
- mutex_locked = true;
|
||||
if (WARN_ON(res_pool->free_count < 0 ||
|
||||
res_pool->free_count >= res_pool->max_count))
|
||||
- goto out;
|
||||
+ goto out_unlock;
|
||||
|
||||
if (WARN_ON(!list_empty(&resource->node)))
|
||||
- goto out;
|
||||
+ goto out_unlock;
|
||||
|
||||
list_add_tail(&resource->node, &res_pool->free_list);
|
||||
res_pool->free_count++;
|
||||
-out:
|
||||
- if (mutex_locked)
|
||||
- mutex_unlock(&res_pool->mutex);
|
||||
+out_unlock:
|
||||
+ mutex_unlock(&res_pool->mutex);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(fsl_mc_resource_free);
|
||||
|
@ -0,0 +1,49 @@
|
||||
From 7b3bffea6d36f396faf1814088f03a6b8efe1ccb Mon Sep 17 00:00:00 2001
|
||||
From: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Date: Mon, 11 Apr 2016 11:48:37 -0500
|
||||
Subject: [PATCH 165/226] staging: fsl-mc: TODO updates
|
||||
|
||||
remove 3 of the remaining TODO items:
|
||||
|
||||
-multiple root fsl-mc buses-- done in patch series starting with
|
||||
commit 14f928054a05 ("staging: fsl-mc: abstract test for existence
|
||||
of fsl-mc bus")
|
||||
|
||||
-interrupt support-- done in patch series starting with
|
||||
commit 9b1b282ccd81 ("irqdomain: Added domain bus token
|
||||
DOMAIN_BUS_FSL_MC_MSI")
|
||||
|
||||
-MC command serialization-- done in commit 63f2be5c3b358 ("staging:
|
||||
fsl-mc: Added serialization to mc_send_command()")
|
||||
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Acked-by: German Rivera <german.rivera@nxp.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/TODO | 13 -------------
|
||||
1 file changed, 13 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/TODO
|
||||
+++ b/drivers/staging/fsl-mc/TODO
|
||||
@@ -1,21 +1,8 @@
|
||||
-* Decide if multiple root fsl-mc buses will be supported per Linux instance,
|
||||
- and if so add support for this.
|
||||
-
|
||||
* Add at least one device driver for a DPAA2 object (child device of the
|
||||
fsl-mc bus). Most likely candidate for this is adding DPAA2 Ethernet
|
||||
driver support, which depends on drivers for several objects: DPNI,
|
||||
DPIO, DPMAC. Other pre-requisites include:
|
||||
|
||||
- * interrupt support. for meaningful driver support we need
|
||||
- interrupts, and thus need message interrupt support by the bus
|
||||
- driver.
|
||||
- -Note: this has dependencies on generic MSI support work
|
||||
- in process upstream, see [1] and [2].
|
||||
-
|
||||
- * Management Complex (MC) command serialization. locking mechanisms
|
||||
- are needed by drivers to serialize commands sent to the MC, including
|
||||
- from atomic context.
|
||||
-
|
||||
* MC firmware uprev. The MC firmware upon which the fsl-mc
|
||||
bus driver and DPAA2 object drivers are based is continuing
|
||||
to evolve, so minor updates are needed to keep in sync with binary
|
@ -0,0 +1,279 @@
|
||||
From 720bf9c9a6fdff63ecc4b382a5092c0020fb7b42 Mon Sep 17 00:00:00 2001
|
||||
From: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Date: Mon, 11 Apr 2016 11:48:42 -0500
|
||||
Subject: [PATCH 166/226] staging: fsl-mc: DPAA2 overview readme update
|
||||
|
||||
incorporated feedback from review comments, other misc cleanup/tweaks
|
||||
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Acked-by: German Rivera <german.rivera@nxp.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/README.txt | 138 +++++++++++++++++++++----------------
|
||||
1 file changed, 80 insertions(+), 58 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/README.txt
|
||||
+++ b/drivers/staging/fsl-mc/README.txt
|
||||
@@ -11,11 +11,11 @@ Contents summary
|
||||
-Overview of DPAA2 objects
|
||||
-DPAA2 Linux driver architecture overview
|
||||
-bus driver
|
||||
- -dprc driver
|
||||
+ -DPRC driver
|
||||
-allocator
|
||||
- -dpio driver
|
||||
+ -DPIO driver
|
||||
-Ethernet
|
||||
- -mac
|
||||
+ -MAC
|
||||
|
||||
DPAA2 Overview
|
||||
--------------
|
||||
@@ -37,6 +37,9 @@ interfaces, an L2 switch, or accelerator
|
||||
The MC provides memory-mapped I/O command interfaces (MC portals)
|
||||
which DPAA2 software drivers use to operate on DPAA2 objects:
|
||||
|
||||
+The diagram below shows an overview of the DPAA2 resource management
|
||||
+architecture:
|
||||
+
|
||||
+--------------------------------------+
|
||||
| OS |
|
||||
| DPAA2 drivers |
|
||||
@@ -77,13 +80,13 @@ DPIO objects.
|
||||
|
||||
Overview of DPAA2 Objects
|
||||
-------------------------
|
||||
-The section provides a brief overview of some key objects
|
||||
-in the DPAA2 hardware. A simple scenario is described illustrating
|
||||
-the objects involved in creating a network interfaces.
|
||||
+The section provides a brief overview of some key DPAA2 objects.
|
||||
+A simple scenario is described illustrating the objects involved
|
||||
+in creating a network interfaces.
|
||||
|
||||
-DPRC (Datapath Resource Container)
|
||||
|
||||
- A DPRC is an container object that holds all the other
|
||||
+ A DPRC is a container object that holds all the other
|
||||
types of DPAA2 objects. In the example diagram below there
|
||||
are 8 objects of 5 types (DPMCP, DPIO, DPBP, DPNI, and DPMAC)
|
||||
in the container.
|
||||
@@ -101,23 +104,23 @@ the objects involved in creating a netwo
|
||||
| |
|
||||
+---------------------------------------------------------+
|
||||
|
||||
- From the point of view of an OS, a DPRC is bus-like. Like
|
||||
- a plug-and-play bus, such as PCI, DPRC commands can be used to
|
||||
- enumerate the contents of the DPRC, discover the hardware
|
||||
- objects present (including mappable regions and interrupts).
|
||||
+ From the point of view of an OS, a DPRC behaves similar to a plug and
|
||||
+ play bus, like PCI. DPRC commands can be used to enumerate the contents
|
||||
+ of the DPRC, discover the hardware objects present (including mappable
|
||||
+ regions and interrupts).
|
||||
|
||||
- dprc.1 (bus)
|
||||
+ DPRC.1 (bus)
|
||||
|
|
||||
+--+--------+-------+-------+-------+
|
||||
| | | | |
|
||||
- dpmcp.1 dpio.1 dpbp.1 dpni.1 dpmac.1
|
||||
- dpmcp.2 dpio.2
|
||||
- dpmcp.3
|
||||
+ DPMCP.1 DPIO.1 DPBP.1 DPNI.1 DPMAC.1
|
||||
+ DPMCP.2 DPIO.2
|
||||
+ DPMCP.3
|
||||
|
||||
Hardware objects can be created and destroyed dynamically, providing
|
||||
the ability to hot plug/unplug objects in and out of the DPRC.
|
||||
|
||||
- A DPRC has a mappable mmio region (an MC portal) that can be used
|
||||
+ A DPRC has a mappable MMIO region (an MC portal) that can be used
|
||||
to send MC commands. It has an interrupt for status events (like
|
||||
hotplug).
|
||||
|
||||
@@ -137,10 +140,11 @@ the objects involved in creating a netwo
|
||||
A typical Ethernet NIC is monolithic-- the NIC device contains TX/RX
|
||||
queuing mechanisms, configuration mechanisms, buffer management,
|
||||
physical ports, and interrupts. DPAA2 uses a more granular approach
|
||||
- utilizing multiple hardware objects. Each object has specialized
|
||||
- functions, and are used together by software to provide Ethernet network
|
||||
- interface functionality. This approach provides efficient use of finite
|
||||
- hardware resources, flexibility, and performance advantages.
|
||||
+ utilizing multiple hardware objects. Each object provides specialized
|
||||
+ functions. Groups of these objects are used by software to provide
|
||||
+ Ethernet network interface functionality. This approach provides
|
||||
+ efficient use of finite hardware resources, flexibility, and
|
||||
+ performance advantages.
|
||||
|
||||
The diagram below shows the objects needed for a simple
|
||||
network interface configuration on a system with 2 CPUs.
|
||||
@@ -168,46 +172,52 @@ the objects involved in creating a netwo
|
||||
|
||||
Below the objects are described. For each object a brief description
|
||||
is provided along with a summary of the kinds of operations the object
|
||||
- supports and a summary of key resources of the object (mmio regions
|
||||
- and irqs).
|
||||
+ supports and a summary of key resources of the object (MMIO regions
|
||||
+ and IRQs).
|
||||
|
||||
-DPMAC (Datapath Ethernet MAC): represents an Ethernet MAC, a
|
||||
hardware device that connects to an Ethernet PHY and allows
|
||||
physical transmission and reception of Ethernet frames.
|
||||
- -mmio regions: none
|
||||
- -irqs: dpni link change
|
||||
+ -MMIO regions: none
|
||||
+ -IRQs: DPNI link change
|
||||
-commands: set link up/down, link config, get stats,
|
||||
- irq config, enable, reset
|
||||
+ IRQ config, enable, reset
|
||||
|
||||
-DPNI (Datapath Network Interface): contains TX/RX queues,
|
||||
- network interface configuration, and rx buffer pool configuration
|
||||
- mechanisms.
|
||||
- -mmio regions: none
|
||||
- -irqs: link state
|
||||
+ network interface configuration, and RX buffer pool configuration
|
||||
+ mechanisms. The TX/RX queues are in memory and are identified by
|
||||
+ queue number.
|
||||
+ -MMIO regions: none
|
||||
+ -IRQs: link state
|
||||
-commands: port config, offload config, queue config,
|
||||
- parse/classify config, irq config, enable, reset
|
||||
+ parse/classify config, IRQ config, enable, reset
|
||||
|
||||
-DPIO (Datapath I/O): provides interfaces to enqueue and dequeue
|
||||
- packets and do hardware buffer pool management operations. For
|
||||
- optimum performance there is typically DPIO per CPU. This allows
|
||||
- each CPU to perform simultaneous enqueue/dequeue operations.
|
||||
- -mmio regions: queue operations, buffer mgmt
|
||||
- -irqs: data availability, congestion notification, buffer
|
||||
+ packets and do hardware buffer pool management operations. The DPAA2
|
||||
+ architecture separates the mechanism to access queues (the DPIO object)
|
||||
+ from the queues themselves. The DPIO provides an MMIO interface to
|
||||
+ enqueue/dequeue packets. To enqueue something a descriptor is written
|
||||
+ to the DPIO MMIO region, which includes the target queue number.
|
||||
+ There will typically be one DPIO assigned to each CPU. This allows all
|
||||
+ CPUs to simultaneously perform enqueue/dequeued operations. DPIOs are
|
||||
+ expected to be shared by different DPAA2 drivers.
|
||||
+ -MMIO regions: queue operations, buffer management
|
||||
+ -IRQs: data availability, congestion notification, buffer
|
||||
pool depletion
|
||||
- -commands: irq config, enable, reset
|
||||
+ -commands: IRQ config, enable, reset
|
||||
|
||||
-DPBP (Datapath Buffer Pool): represents a hardware buffer
|
||||
pool.
|
||||
- -mmio regions: none
|
||||
- -irqs: none
|
||||
+ -MMIO regions: none
|
||||
+ -IRQs: none
|
||||
-commands: enable, reset
|
||||
|
||||
-DPMCP (Datapath MC Portal): provides an MC command portal.
|
||||
Used by drivers to send commands to the MC to manage
|
||||
objects.
|
||||
- -mmio regions: MC command portal
|
||||
- -irqs: command completion
|
||||
- -commands: irq config, enable, reset
|
||||
+ -MMIO regions: MC command portal
|
||||
+ -IRQs: command completion
|
||||
+ -commands: IRQ config, enable, reset
|
||||
|
||||
Object Connections
|
||||
------------------
|
||||
@@ -268,22 +278,22 @@ of each driver follows.
|
||||
| Stack |
|
||||
+------------+ +------------+
|
||||
| Allocator |. . . . . . . | Ethernet |
|
||||
- |(dpmcp,dpbp)| | (dpni) |
|
||||
+ |(DPMCP,DPBP)| | (DPNI) |
|
||||
+-.----------+ +---+---+----+
|
||||
. . ^ |
|
||||
. . <data avail, | |<enqueue,
|
||||
. . tx confirm> | | dequeue>
|
||||
+-------------+ . | |
|
||||
| DPRC driver | . +---+---V----+ +---------+
|
||||
- | (dprc) | . . . . . .| DPIO driver| | MAC |
|
||||
- +----------+--+ | (dpio) | | (dpmac) |
|
||||
+ | (DPRC) | . . . . . .| DPIO driver| | MAC |
|
||||
+ +----------+--+ | (DPIO) | | (DPMAC) |
|
||||
| +------+-----+ +-----+---+
|
||||
|<dev add/remove> | |
|
||||
| | |
|
||||
+----+--------------+ | +--+---+
|
||||
- | mc-bus driver | | | PHY |
|
||||
+ | MC-bus driver | | | PHY |
|
||||
| | | |driver|
|
||||
- | /fsl-mc@80c000000 | | +--+---+
|
||||
+ | /soc/fsl-mc | | +--+---+
|
||||
+-------------------+ | |
|
||||
| |
|
||||
================================ HARDWARE =========|=================|======
|
||||
@@ -298,25 +308,27 @@ of each driver follows.
|
||||
|
||||
A brief description of each driver is provided below.
|
||||
|
||||
- mc-bus driver
|
||||
+ MC-bus driver
|
||||
-------------
|
||||
- The mc-bus driver is a platform driver and is probed from an
|
||||
- "/fsl-mc@xxxx" node in the device tree passed in by boot firmware.
|
||||
- It is responsible for bootstrapping the DPAA2 kernel infrastructure.
|
||||
+ The MC-bus driver is a platform driver and is probed from a
|
||||
+ node in the device tree (compatible "fsl,qoriq-mc") passed in by boot
|
||||
+ firmware. It is responsible for bootstrapping the DPAA2 kernel
|
||||
+ infrastructure.
|
||||
Key functions include:
|
||||
-registering a new bus type named "fsl-mc" with the kernel,
|
||||
and implementing bus call-backs (e.g. match/uevent/dev_groups)
|
||||
- -implemeting APIs for DPAA2 driver registration and for device
|
||||
+ -implementing APIs for DPAA2 driver registration and for device
|
||||
add/remove
|
||||
- -creates an MSI irq domain
|
||||
- -do a device add of the 'root' DPRC device, which is needed
|
||||
- to bootstrap things
|
||||
+ -creates an MSI IRQ domain
|
||||
+ -doing a 'device add' to expose the 'root' DPRC, in turn triggering
|
||||
+ a bind of the root DPRC to the DPRC driver
|
||||
|
||||
DPRC driver
|
||||
-----------
|
||||
- The dprc-driver is bound DPRC objects and does runtime management
|
||||
+ The DPRC driver is bound to DPRC objects and does runtime management
|
||||
of a bus instance. It performs the initial bus scan of the DPRC
|
||||
- and handles interrupts for container events such as hot plug.
|
||||
+ and handles interrupts for container events such as hot plug by
|
||||
+ re-scanning the DPRC.
|
||||
|
||||
Allocator
|
||||
----------
|
||||
@@ -334,14 +346,20 @@ A brief description of each driver is pr
|
||||
DPIO driver
|
||||
-----------
|
||||
The DPIO driver is bound to DPIO objects and provides services that allow
|
||||
- other drivers such as the Ethernet driver to receive and transmit data.
|
||||
+ other drivers such as the Ethernet driver to enqueue and dequeue data for
|
||||
+ their respective objects.
|
||||
Key services include:
|
||||
-data availability notifications
|
||||
-hardware queuing operations (enqueue and dequeue of data)
|
||||
-hardware buffer pool management
|
||||
|
||||
+ To transmit a packet the Ethernet driver puts data on a queue and
|
||||
+ invokes a DPIO API. For receive, the Ethernet driver registers
|
||||
+ a data availability notification callback. To dequeue a packet
|
||||
+ a DPIO API is used.
|
||||
+
|
||||
There is typically one DPIO object per physical CPU for optimum
|
||||
- performance, allowing each CPU to simultaneously enqueue
|
||||
+ performance, allowing different CPUs to simultaneously enqueue
|
||||
and dequeue data.
|
||||
|
||||
The DPIO driver operates on behalf of all DPAA2 drivers
|
||||
@@ -362,3 +380,7 @@ A brief description of each driver is pr
|
||||
by the appropriate PHY driver via an mdio bus. The MAC driver
|
||||
plays a role of being a proxy between the PHY driver and the
|
||||
MC. It does this proxy via the MC commands to a DPMAC object.
|
||||
+ If the PHY driver signals a link change, the MAC driver notifies
|
||||
+ the MC via a DPMAC command. If a network interface is brought
|
||||
+ up or down, the MC notifies the DPMAC driver via an interrupt and
|
||||
+ the driver can take appropriate action.
|
@ -0,0 +1,123 @@
|
||||
From fa245614c92ffbdaec6a56552032432b5343b1dc Mon Sep 17 00:00:00 2001
|
||||
From: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Date: Mon, 11 Apr 2016 11:48:48 -0500
|
||||
Subject: [PATCH 167/226] staging: fsl-mc: update dpmcp binary interface to
|
||||
v3.0
|
||||
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Acked-by: German Rivera <german.rivera@nxp.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/dpmcp-cmd.h | 5 ++---
|
||||
drivers/staging/fsl-mc/bus/dpmcp.c | 35 ++------------------------------
|
||||
drivers/staging/fsl-mc/bus/dpmcp.h | 10 ++-------
|
||||
3 files changed, 6 insertions(+), 44 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/dpmcp-cmd.h
|
||||
+++ b/drivers/staging/fsl-mc/bus/dpmcp-cmd.h
|
||||
@@ -33,8 +33,8 @@
|
||||
#define _FSL_DPMCP_CMD_H
|
||||
|
||||
/* DPMCP Version */
|
||||
-#define DPMCP_VER_MAJOR 2
|
||||
-#define DPMCP_VER_MINOR 1
|
||||
+#define DPMCP_VER_MAJOR 3
|
||||
+#define DPMCP_VER_MINOR 0
|
||||
|
||||
/* Command IDs */
|
||||
#define DPMCP_CMDID_CLOSE 0x800
|
||||
@@ -52,6 +52,5 @@
|
||||
#define DPMCP_CMDID_SET_IRQ_MASK 0x014
|
||||
#define DPMCP_CMDID_GET_IRQ_MASK 0x015
|
||||
#define DPMCP_CMDID_GET_IRQ_STATUS 0x016
|
||||
-#define DPMCP_CMDID_CLEAR_IRQ_STATUS 0x017
|
||||
|
||||
#endif /* _FSL_DPMCP_CMD_H */
|
||||
--- a/drivers/staging/fsl-mc/bus/dpmcp.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/dpmcp.c
|
||||
@@ -213,7 +213,7 @@ int dpmcp_set_irq(struct fsl_mc_io *mc_i
|
||||
cmd.params[0] |= mc_enc(0, 8, irq_index);
|
||||
cmd.params[0] |= mc_enc(32, 32, irq_cfg->val);
|
||||
cmd.params[1] |= mc_enc(0, 64, irq_cfg->paddr);
|
||||
- cmd.params[2] |= mc_enc(0, 32, irq_cfg->user_irq_id);
|
||||
+ cmd.params[2] |= mc_enc(0, 32, irq_cfg->irq_num);
|
||||
|
||||
/* send command to mc*/
|
||||
return mc_send_command(mc_io, &cmd);
|
||||
@@ -254,7 +254,7 @@ int dpmcp_get_irq(struct fsl_mc_io *mc_i
|
||||
/* retrieve response parameters */
|
||||
irq_cfg->val = (u32)mc_dec(cmd.params[0], 0, 32);
|
||||
irq_cfg->paddr = (u64)mc_dec(cmd.params[1], 0, 64);
|
||||
- irq_cfg->user_irq_id = (int)mc_dec(cmd.params[2], 0, 32);
|
||||
+ irq_cfg->irq_num = (int)mc_dec(cmd.params[2], 0, 32);
|
||||
*type = (int)mc_dec(cmd.params[2], 32, 32);
|
||||
return 0;
|
||||
}
|
||||
@@ -435,37 +435,6 @@ int dpmcp_get_irq_status(struct fsl_mc_i
|
||||
}
|
||||
|
||||
/**
|
||||
- * dpmcp_clear_irq_status() - Clear a pending interrupt's status
|
||||
- *
|
||||
- * @mc_io: Pointer to MC portal's I/O object
|
||||
- * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
|
||||
- * @token: Token of DPMCP object
|
||||
- * @irq_index: The interrupt index to configure
|
||||
- * @status: Bits to clear (W1C) - one bit per cause:
|
||||
- * 0 = don't change
|
||||
- * 1 = clear status bit
|
||||
- *
|
||||
- * Return: '0' on Success; Error code otherwise.
|
||||
- */
|
||||
-int dpmcp_clear_irq_status(struct fsl_mc_io *mc_io,
|
||||
- u32 cmd_flags,
|
||||
- u16 token,
|
||||
- u8 irq_index,
|
||||
- u32 status)
|
||||
-{
|
||||
- struct mc_command cmd = { 0 };
|
||||
-
|
||||
- /* prepare command */
|
||||
- cmd.header = mc_encode_cmd_header(DPMCP_CMDID_CLEAR_IRQ_STATUS,
|
||||
- cmd_flags, token);
|
||||
- cmd.params[0] |= mc_enc(0, 32, status);
|
||||
- cmd.params[0] |= mc_enc(32, 8, irq_index);
|
||||
-
|
||||
- /* send command to mc*/
|
||||
- return mc_send_command(mc_io, &cmd);
|
||||
-}
|
||||
-
|
||||
-/**
|
||||
* dpmcp_get_attributes - Retrieve DPMCP attributes.
|
||||
*
|
||||
* @mc_io: Pointer to MC portal's I/O object
|
||||
--- a/drivers/staging/fsl-mc/bus/dpmcp.h
|
||||
+++ b/drivers/staging/fsl-mc/bus/dpmcp.h
|
||||
@@ -82,12 +82,12 @@ int dpmcp_reset(struct fsl_mc_io *mc_io,
|
||||
* struct dpmcp_irq_cfg - IRQ configuration
|
||||
* @paddr: Address that must be written to signal a message-based interrupt
|
||||
* @val: Value to write into irq_addr address
|
||||
- * @user_irq_id: A user defined number associated with this IRQ
|
||||
+ * @irq_num: A user defined number associated with this IRQ
|
||||
*/
|
||||
struct dpmcp_irq_cfg {
|
||||
uint64_t paddr;
|
||||
uint32_t val;
|
||||
- int user_irq_id;
|
||||
+ int irq_num;
|
||||
};
|
||||
|
||||
int dpmcp_set_irq(struct fsl_mc_io *mc_io,
|
||||
@@ -133,12 +133,6 @@ int dpmcp_get_irq_status(struct fsl_mc_i
|
||||
uint8_t irq_index,
|
||||
uint32_t *status);
|
||||
|
||||
-int dpmcp_clear_irq_status(struct fsl_mc_io *mc_io,
|
||||
- uint32_t cmd_flags,
|
||||
- uint16_t token,
|
||||
- uint8_t irq_index,
|
||||
- uint32_t status);
|
||||
-
|
||||
/**
|
||||
* struct dpmcp_attr - Structure representing DPMCP attributes
|
||||
* @id: DPMCP object ID
|
@ -0,0 +1,208 @@
|
||||
From de0fa9842d52e4e80576d378f32aa9ca76a4270b Mon Sep 17 00:00:00 2001
|
||||
From: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Date: Mon, 11 Apr 2016 11:48:54 -0500
|
||||
Subject: [PATCH 168/226] staging: fsl-mc: update dpbp binary interface to
|
||||
v2.2
|
||||
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Acked-by: German Rivera <german.rivera@nxp.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/dpbp.c | 77 ++++++++++++++++++++++++++++-
|
||||
drivers/staging/fsl-mc/include/dpbp-cmd.h | 4 +-
|
||||
drivers/staging/fsl-mc/include/dpbp.h | 51 ++++++++++++++++++-
|
||||
3 files changed, 127 insertions(+), 5 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/dpbp.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/dpbp.c
|
||||
@@ -293,7 +293,7 @@ int dpbp_set_irq(struct fsl_mc_io *mc_io
|
||||
cmd.params[0] |= mc_enc(0, 8, irq_index);
|
||||
cmd.params[0] |= mc_enc(32, 32, irq_cfg->val);
|
||||
cmd.params[1] |= mc_enc(0, 64, irq_cfg->addr);
|
||||
- cmd.params[2] |= mc_enc(0, 32, irq_cfg->user_irq_id);
|
||||
+ cmd.params[2] |= mc_enc(0, 32, irq_cfg->irq_num);
|
||||
|
||||
/* send command to mc*/
|
||||
return mc_send_command(mc_io, &cmd);
|
||||
@@ -334,7 +334,7 @@ int dpbp_get_irq(struct fsl_mc_io *mc_io
|
||||
/* retrieve response parameters */
|
||||
irq_cfg->val = (u32)mc_dec(cmd.params[0], 0, 32);
|
||||
irq_cfg->addr = (u64)mc_dec(cmd.params[1], 0, 64);
|
||||
- irq_cfg->user_irq_id = (int)mc_dec(cmd.params[2], 0, 32);
|
||||
+ irq_cfg->irq_num = (int)mc_dec(cmd.params[2], 0, 32);
|
||||
*type = (int)mc_dec(cmd.params[2], 32, 32);
|
||||
return 0;
|
||||
}
|
||||
@@ -502,6 +502,7 @@ int dpbp_get_irq_status(struct fsl_mc_io
|
||||
/* prepare command */
|
||||
cmd.header = mc_encode_cmd_header(DPBP_CMDID_GET_IRQ_STATUS,
|
||||
cmd_flags, token);
|
||||
+ cmd.params[0] |= mc_enc(0, 32, *status);
|
||||
cmd.params[0] |= mc_enc(32, 8, irq_index);
|
||||
|
||||
/* send command to mc*/
|
||||
@@ -580,3 +581,75 @@ int dpbp_get_attributes(struct fsl_mc_io
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(dpbp_get_attributes);
|
||||
+
|
||||
+/**
|
||||
+ * dpbp_set_notifications() - Set notifications towards software
|
||||
+ * @mc_io: Pointer to MC portal's I/O object
|
||||
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
|
||||
+ * @token: Token of DPBP object
|
||||
+ * @cfg: notifications configuration
|
||||
+ *
|
||||
+ * Return: '0' on Success; Error code otherwise.
|
||||
+ */
|
||||
+int dpbp_set_notifications(struct fsl_mc_io *mc_io,
|
||||
+ u32 cmd_flags,
|
||||
+ u16 token,
|
||||
+ struct dpbp_notification_cfg *cfg)
|
||||
+{
|
||||
+ struct mc_command cmd = { 0 };
|
||||
+
|
||||
+ /* prepare command */
|
||||
+ cmd.header = mc_encode_cmd_header(DPBP_CMDID_SET_NOTIFICATIONS,
|
||||
+ cmd_flags,
|
||||
+ token);
|
||||
+
|
||||
+ cmd.params[0] |= mc_enc(0, 32, cfg->depletion_entry);
|
||||
+ cmd.params[0] |= mc_enc(32, 32, cfg->depletion_exit);
|
||||
+ cmd.params[1] |= mc_enc(0, 32, cfg->surplus_entry);
|
||||
+ cmd.params[1] |= mc_enc(32, 32, cfg->surplus_exit);
|
||||
+ cmd.params[2] |= mc_enc(0, 16, cfg->options);
|
||||
+ cmd.params[3] |= mc_enc(0, 64, cfg->message_ctx);
|
||||
+ cmd.params[4] |= mc_enc(0, 64, cfg->message_iova);
|
||||
+
|
||||
+ /* send command to mc*/
|
||||
+ return mc_send_command(mc_io, &cmd);
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * dpbp_get_notifications() - Get the notifications configuration
|
||||
+ * @mc_io: Pointer to MC portal's I/O object
|
||||
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
|
||||
+ * @token: Token of DPBP object
|
||||
+ * @cfg: notifications configuration
|
||||
+ *
|
||||
+ * Return: '0' on Success; Error code otherwise.
|
||||
+ */
|
||||
+int dpbp_get_notifications(struct fsl_mc_io *mc_io,
|
||||
+ u32 cmd_flags,
|
||||
+ u16 token,
|
||||
+ struct dpbp_notification_cfg *cfg)
|
||||
+{
|
||||
+ struct mc_command cmd = { 0 };
|
||||
+ int err;
|
||||
+
|
||||
+ /* prepare command */
|
||||
+ cmd.header = mc_encode_cmd_header(DPBP_CMDID_GET_NOTIFICATIONS,
|
||||
+ cmd_flags,
|
||||
+ token);
|
||||
+
|
||||
+ /* send command to mc*/
|
||||
+ err = mc_send_command(mc_io, &cmd);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+
|
||||
+ /* retrieve response parameters */
|
||||
+ cfg->depletion_entry = (u32)mc_dec(cmd.params[0], 0, 32);
|
||||
+ cfg->depletion_exit = (u32)mc_dec(cmd.params[0], 32, 32);
|
||||
+ cfg->surplus_entry = (u32)mc_dec(cmd.params[1], 0, 32);
|
||||
+ cfg->surplus_exit = (u32)mc_dec(cmd.params[1], 32, 32);
|
||||
+ cfg->options = (u16)mc_dec(cmd.params[2], 0, 16);
|
||||
+ cfg->message_ctx = (u64)mc_dec(cmd.params[3], 0, 64);
|
||||
+ cfg->message_iova = (u64)mc_dec(cmd.params[4], 0, 64);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
--- a/drivers/staging/fsl-mc/include/dpbp-cmd.h
|
||||
+++ b/drivers/staging/fsl-mc/include/dpbp-cmd.h
|
||||
@@ -34,7 +34,7 @@
|
||||
|
||||
/* DPBP Version */
|
||||
#define DPBP_VER_MAJOR 2
|
||||
-#define DPBP_VER_MINOR 1
|
||||
+#define DPBP_VER_MINOR 2
|
||||
|
||||
/* Command IDs */
|
||||
#define DPBP_CMDID_CLOSE 0x800
|
||||
@@ -57,4 +57,6 @@
|
||||
#define DPBP_CMDID_GET_IRQ_STATUS 0x016
|
||||
#define DPBP_CMDID_CLEAR_IRQ_STATUS 0x017
|
||||
|
||||
+#define DPBP_CMDID_SET_NOTIFICATIONS 0x01b0
|
||||
+#define DPBP_CMDID_GET_NOTIFICATIONS 0x01b1
|
||||
#endif /* _FSL_DPBP_CMD_H */
|
||||
--- a/drivers/staging/fsl-mc/include/dpbp.h
|
||||
+++ b/drivers/staging/fsl-mc/include/dpbp.h
|
||||
@@ -85,12 +85,12 @@ int dpbp_reset(struct fsl_mc_io *mc_io,
|
||||
* struct dpbp_irq_cfg - IRQ configuration
|
||||
* @addr: Address that must be written to signal a message-based interrupt
|
||||
* @val: Value to write into irq_addr address
|
||||
- * @user_irq_id: A user defined number associated with this IRQ
|
||||
+ * @irq_num: A user defined number associated with this IRQ
|
||||
*/
|
||||
struct dpbp_irq_cfg {
|
||||
u64 addr;
|
||||
u32 val;
|
||||
- int user_irq_id;
|
||||
+ int irq_num;
|
||||
};
|
||||
|
||||
int dpbp_set_irq(struct fsl_mc_io *mc_io,
|
||||
@@ -168,6 +168,53 @@ int dpbp_get_attributes(struct fsl_mc_io
|
||||
u16 token,
|
||||
struct dpbp_attr *attr);
|
||||
|
||||
+/**
|
||||
+ * DPBP notifications options
|
||||
+ */
|
||||
+
|
||||
+/**
|
||||
+ * BPSCN write will attempt to allocate into a cache (coherent write)
|
||||
+ */
|
||||
+#define DPBP_NOTIF_OPT_COHERENT_WRITE 0x00000001
|
||||
+
|
||||
+/**
|
||||
+ * struct dpbp_notification_cfg - Structure representing DPBP notifications
|
||||
+ * towards software
|
||||
+ * @depletion_entry: below this threshold the pool is "depleted";
|
||||
+ * set it to '0' to disable it
|
||||
+ * @depletion_exit: greater than or equal to this threshold the pool exit its
|
||||
+ * "depleted" state
|
||||
+ * @surplus_entry: above this threshold the pool is in "surplus" state;
|
||||
+ * set it to '0' to disable it
|
||||
+ * @surplus_exit: less than or equal to this threshold the pool exit its
|
||||
+ * "surplus" state
|
||||
+ * @message_iova: MUST be given if either 'depletion_entry' or 'surplus_entry'
|
||||
+ * is not '0' (enable); I/O virtual address (must be in DMA-able memory),
|
||||
+ * must be 16B aligned.
|
||||
+ * @message_ctx: The context that will be part of the BPSCN message and will
|
||||
+ * be written to 'message_iova'
|
||||
+ * @options: Mask of available options; use 'DPBP_NOTIF_OPT_<X>' values
|
||||
+ */
|
||||
+struct dpbp_notification_cfg {
|
||||
+ u32 depletion_entry;
|
||||
+ u32 depletion_exit;
|
||||
+ u32 surplus_entry;
|
||||
+ u32 surplus_exit;
|
||||
+ u64 message_iova;
|
||||
+ u64 message_ctx;
|
||||
+ u16 options;
|
||||
+};
|
||||
+
|
||||
+int dpbp_set_notifications(struct fsl_mc_io *mc_io,
|
||||
+ u32 cmd_flags,
|
||||
+ u16 token,
|
||||
+ struct dpbp_notification_cfg *cfg);
|
||||
+
|
||||
+int dpbp_get_notifications(struct fsl_mc_io *mc_io,
|
||||
+ u32 cmd_flags,
|
||||
+ u16 token,
|
||||
+ struct dpbp_notification_cfg *cfg);
|
||||
+
|
||||
/** @} */
|
||||
|
||||
#endif /* __FSL_DPBP_H */
|
@ -0,0 +1,206 @@
|
||||
From 45dce4cd82ddc618ade56747620a2a29f7d9a99d Mon Sep 17 00:00:00 2001
|
||||
From: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Date: Mon, 11 Apr 2016 11:48:59 -0500
|
||||
Subject: [PATCH 169/226] staging: fsl-mc: update dprc binary interface to
|
||||
v5.1
|
||||
|
||||
The meaning of the "status" parameter in dprc_get_irq_status
|
||||
has changed, and this patch updates the flib and caller
|
||||
of the API.
|
||||
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Acked-by: German Rivera <german.rivera@nxp.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/dprc-cmd.h | 4 ++--
|
||||
drivers/staging/fsl-mc/bus/dprc-driver.c | 1 +
|
||||
drivers/staging/fsl-mc/bus/dprc.c | 26 +++++++++++++-------------
|
||||
drivers/staging/fsl-mc/bus/mc-msi.c | 2 +-
|
||||
drivers/staging/fsl-mc/include/dprc.h | 19 ++++++++++++-------
|
||||
5 files changed, 29 insertions(+), 23 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/dprc-cmd.h
|
||||
+++ b/drivers/staging/fsl-mc/bus/dprc-cmd.h
|
||||
@@ -41,8 +41,8 @@
|
||||
#define _FSL_DPRC_CMD_H
|
||||
|
||||
/* DPRC Version */
|
||||
-#define DPRC_VER_MAJOR 4
|
||||
-#define DPRC_VER_MINOR 0
|
||||
+#define DPRC_VER_MAJOR 5
|
||||
+#define DPRC_VER_MINOR 1
|
||||
|
||||
/* Command IDs */
|
||||
#define DPRC_CMDID_CLOSE 0x800
|
||||
--- a/drivers/staging/fsl-mc/bus/dprc-driver.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/dprc-driver.c
|
||||
@@ -423,6 +423,7 @@ static irqreturn_t dprc_irq0_handler_thr
|
||||
if (WARN_ON(!msi_desc || msi_desc->irq != (u32)irq_num))
|
||||
goto out;
|
||||
|
||||
+ status = 0;
|
||||
error = dprc_get_irq_status(mc_io, 0, mc_dev->mc_handle, 0,
|
||||
&status);
|
||||
if (error < 0) {
|
||||
--- a/drivers/staging/fsl-mc/bus/dprc.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/dprc.c
|
||||
@@ -265,7 +265,7 @@ int dprc_get_irq(struct fsl_mc_io *mc_io
|
||||
/* retrieve response parameters */
|
||||
irq_cfg->val = mc_dec(cmd.params[0], 0, 32);
|
||||
irq_cfg->paddr = mc_dec(cmd.params[1], 0, 64);
|
||||
- irq_cfg->user_irq_id = mc_dec(cmd.params[2], 0, 32);
|
||||
+ irq_cfg->irq_num = mc_dec(cmd.params[2], 0, 32);
|
||||
*type = mc_dec(cmd.params[2], 32, 32);
|
||||
|
||||
return 0;
|
||||
@@ -296,7 +296,7 @@ int dprc_set_irq(struct fsl_mc_io *mc_io
|
||||
cmd.params[0] |= mc_enc(32, 8, irq_index);
|
||||
cmd.params[0] |= mc_enc(0, 32, irq_cfg->val);
|
||||
cmd.params[1] |= mc_enc(0, 64, irq_cfg->paddr);
|
||||
- cmd.params[2] |= mc_enc(0, 32, irq_cfg->user_irq_id);
|
||||
+ cmd.params[2] |= mc_enc(0, 32, irq_cfg->irq_num);
|
||||
|
||||
/* send command to mc*/
|
||||
return mc_send_command(mc_io, &cmd);
|
||||
@@ -466,6 +466,7 @@ int dprc_get_irq_status(struct fsl_mc_io
|
||||
/* prepare command */
|
||||
cmd.header = mc_encode_cmd_header(DPRC_CMDID_GET_IRQ_STATUS,
|
||||
cmd_flags, token);
|
||||
+ cmd.params[0] |= mc_enc(0, 32, *status);
|
||||
cmd.params[0] |= mc_enc(32, 8, irq_index);
|
||||
|
||||
/* send command to mc*/
|
||||
@@ -948,6 +949,7 @@ int dprc_get_obj(struct fsl_mc_io *mc_io
|
||||
obj_desc->state = mc_dec(cmd.params[1], 32, 32);
|
||||
obj_desc->ver_major = mc_dec(cmd.params[2], 0, 16);
|
||||
obj_desc->ver_minor = mc_dec(cmd.params[2], 16, 16);
|
||||
+ obj_desc->flags = mc_dec(cmd.params[2], 32, 16);
|
||||
obj_desc->type[0] = mc_dec(cmd.params[3], 0, 8);
|
||||
obj_desc->type[1] = mc_dec(cmd.params[3], 8, 8);
|
||||
obj_desc->type[2] = mc_dec(cmd.params[3], 16, 8);
|
||||
@@ -1042,6 +1044,7 @@ int dprc_get_obj_desc(struct fsl_mc_io *
|
||||
obj_desc->state = (u32)mc_dec(cmd.params[1], 32, 32);
|
||||
obj_desc->ver_major = (u16)mc_dec(cmd.params[2], 0, 16);
|
||||
obj_desc->ver_minor = (u16)mc_dec(cmd.params[2], 16, 16);
|
||||
+ obj_desc->flags = mc_dec(cmd.params[2], 32, 16);
|
||||
obj_desc->type[0] = (char)mc_dec(cmd.params[3], 0, 8);
|
||||
obj_desc->type[1] = (char)mc_dec(cmd.params[3], 8, 8);
|
||||
obj_desc->type[2] = (char)mc_dec(cmd.params[3], 16, 8);
|
||||
@@ -1108,7 +1111,7 @@ int dprc_set_obj_irq(struct fsl_mc_io *m
|
||||
cmd.params[0] |= mc_enc(32, 8, irq_index);
|
||||
cmd.params[0] |= mc_enc(0, 32, irq_cfg->val);
|
||||
cmd.params[1] |= mc_enc(0, 64, irq_cfg->paddr);
|
||||
- cmd.params[2] |= mc_enc(0, 32, irq_cfg->user_irq_id);
|
||||
+ cmd.params[2] |= mc_enc(0, 32, irq_cfg->irq_num);
|
||||
cmd.params[2] |= mc_enc(32, 32, obj_id);
|
||||
cmd.params[3] |= mc_enc(0, 8, obj_type[0]);
|
||||
cmd.params[3] |= mc_enc(8, 8, obj_type[1]);
|
||||
@@ -1189,7 +1192,7 @@ int dprc_get_obj_irq(struct fsl_mc_io *m
|
||||
/* retrieve response parameters */
|
||||
irq_cfg->val = (u32)mc_dec(cmd.params[0], 0, 32);
|
||||
irq_cfg->paddr = (u64)mc_dec(cmd.params[1], 0, 64);
|
||||
- irq_cfg->user_irq_id = (int)mc_dec(cmd.params[2], 0, 32);
|
||||
+ irq_cfg->irq_num = (int)mc_dec(cmd.params[2], 0, 32);
|
||||
*type = (int)mc_dec(cmd.params[2], 32, 32);
|
||||
|
||||
return 0;
|
||||
@@ -1437,14 +1440,8 @@ EXPORT_SYMBOL(dprc_set_obj_label);
|
||||
* @endpoint1: Endpoint 1 configuration parameters
|
||||
* @endpoint2: Endpoint 2 configuration parameters
|
||||
* @cfg: Connection configuration. The connection configuration is ignored for
|
||||
- * connections made to DPMAC objects, where rate is set according to
|
||||
- * MAC configuration.
|
||||
- * The committed rate is the guaranteed rate for the connection.
|
||||
- * The maximum rate is an upper limit allowed for the connection; it is
|
||||
- * expected to be equal or higher than the committed rate.
|
||||
- * When committed and maximum rates are both zero, the connection is set
|
||||
- * to "best effort" mode, having lower priority compared to connections
|
||||
- * with committed or maximum rates.
|
||||
+ * connections made to DPMAC objects, where rate is retrieved from the
|
||||
+ * MAC configuration.
|
||||
*
|
||||
* Return: '0' on Success; Error code otherwise.
|
||||
*/
|
||||
@@ -1555,7 +1552,10 @@ int dprc_disconnect(struct fsl_mc_io *mc
|
||||
* @token: Token of DPRC object
|
||||
* @endpoint1: Endpoint 1 configuration parameters
|
||||
* @endpoint2: Returned endpoint 2 configuration parameters
|
||||
-* @state: Returned link state: 1 - link is up, 0 - link is down
|
||||
+* @state: Returned link state:
|
||||
+* 1 - link is up;
|
||||
+* 0 - link is down;
|
||||
+* -1 - no connection (endpoint2 information is irrelevant)
|
||||
*
|
||||
* Return: '0' on Success; -ENAVAIL if connection does not exist.
|
||||
*/
|
||||
--- a/drivers/staging/fsl-mc/bus/mc-msi.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/mc-msi.c
|
||||
@@ -65,7 +65,7 @@ static void __fsl_mc_msi_write_msg(struc
|
||||
irq_cfg.paddr = ((u64)msi_desc->msg.address_hi << 32) |
|
||||
msi_desc->msg.address_lo;
|
||||
irq_cfg.val = msi_desc->msg.data;
|
||||
- irq_cfg.user_irq_id = msi_desc->irq;
|
||||
+ irq_cfg.irq_num = msi_desc->irq;
|
||||
|
||||
if (owner_mc_dev == mc_bus_dev) {
|
||||
/*
|
||||
--- a/drivers/staging/fsl-mc/include/dprc.h
|
||||
+++ b/drivers/staging/fsl-mc/include/dprc.h
|
||||
@@ -94,11 +94,6 @@ int dprc_close(struct fsl_mc_io *mc_io,
|
||||
*/
|
||||
#define DPRC_CFG_OPT_TOPOLOGY_CHANGES_ALLOWED 0x00000008
|
||||
|
||||
-/* IOMMU bypass - indicates whether objects of this container are permitted
|
||||
- * to bypass the IOMMU.
|
||||
- */
|
||||
-#define DPRC_CFG_OPT_IOMMU_BYPASS 0x00000010
|
||||
-
|
||||
/* AIOP - Indicates that container belongs to AIOP. */
|
||||
#define DPRC_CFG_OPT_AIOP 0x00000020
|
||||
|
||||
@@ -173,12 +168,12 @@ int dprc_reset_container(struct fsl_mc_i
|
||||
* struct dprc_irq_cfg - IRQ configuration
|
||||
* @paddr: Address that must be written to signal a message-based interrupt
|
||||
* @val: Value to write into irq_addr address
|
||||
- * @user_irq_id: A user defined number associated with this IRQ
|
||||
+ * @irq_num: A user defined number associated with this IRQ
|
||||
*/
|
||||
struct dprc_irq_cfg {
|
||||
phys_addr_t paddr;
|
||||
u32 val;
|
||||
- int user_irq_id;
|
||||
+ int irq_num;
|
||||
};
|
||||
|
||||
int dprc_set_irq(struct fsl_mc_io *mc_io,
|
||||
@@ -353,6 +348,14 @@ int dprc_get_obj_count(struct fsl_mc_io
|
||||
#define DPRC_OBJ_STATE_PLUGGED 0x00000002
|
||||
|
||||
/**
|
||||
+ * Shareability flag - Object flag indicating no memory shareability.
|
||||
+ * the object generates memory accesses that are non coherent with other
|
||||
+ * masters;
|
||||
+ * user is responsible for proper memory handling through IOMMU configuration.
|
||||
+ */
|
||||
+#define DPRC_OBJ_FLAG_NO_MEM_SHAREABILITY 0x0001
|
||||
+
|
||||
+/**
|
||||
* struct dprc_obj_desc - Object descriptor, returned from dprc_get_obj()
|
||||
* @type: Type of object: NULL terminated string
|
||||
* @id: ID of logical object resource
|
||||
@@ -363,6 +366,7 @@ int dprc_get_obj_count(struct fsl_mc_io
|
||||
* @region_count: Number of mappable regions supported by the object
|
||||
* @state: Object state: combination of DPRC_OBJ_STATE_ states
|
||||
* @label: Object label
|
||||
+ * @flags: Object's flags
|
||||
*/
|
||||
struct dprc_obj_desc {
|
||||
char type[16];
|
||||
@@ -374,6 +378,7 @@ struct dprc_obj_desc {
|
||||
u8 region_count;
|
||||
u32 state;
|
||||
char label[16];
|
||||
+ u16 flags;
|
||||
};
|
||||
|
||||
int dprc_get_obj(struct fsl_mc_io *mc_io,
|
@ -0,0 +1,136 @@
|
||||
From 9382e1723e4de9832407f7e65bd4812b31e5a51d Mon Sep 17 00:00:00 2001
|
||||
From: Itai Katz <itai.katz@nxp.com>
|
||||
Date: Mon, 11 Apr 2016 11:55:40 -0500
|
||||
Subject: [PATCH 170/226] staging: fsl-mc: don't use object versions to make
|
||||
binding decisions
|
||||
|
||||
Up until now if the object version expected by a driver (in the API header
|
||||
file) did not match the actual object version in the MC hardware the bus
|
||||
driver refused to bind the object to the driver or printed out WARN_ON
|
||||
dumps.
|
||||
|
||||
This patch removes those checks, and the responsibility of object version
|
||||
checking should now be done in the object drivers themselves. If the actual
|
||||
version discovered is not supported, the driver's probe function should fail.
|
||||
Drivers should use version checks to support new features and provide
|
||||
backwards compatibility if at all possible.
|
||||
|
||||
This patch also removes the checks that caused bus driver probing to fail
|
||||
if the overall MC version discovered did not match the firmware version
|
||||
from the API header...this was too strict. The overall MC version is
|
||||
informational like a release number, and continues to be printed in the
|
||||
boot log.
|
||||
|
||||
Signed-off-by: Itai Katz <itai.katz@nxp.com>
|
||||
(Stuart: reworded commit log)
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Acked-by: German Rivera <german.rivera@nxp.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/dprc-driver.c | 4 +--
|
||||
drivers/staging/fsl-mc/bus/mc-allocator.c | 6 -----
|
||||
drivers/staging/fsl-mc/bus/mc-bus.c | 38 +----------------------------
|
||||
3 files changed, 2 insertions(+), 46 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/dprc-driver.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/dprc-driver.c
|
||||
@@ -780,9 +780,7 @@ static int dprc_remove(struct fsl_mc_dev
|
||||
static const struct fsl_mc_device_match_id match_id_table[] = {
|
||||
{
|
||||
.vendor = FSL_MC_VENDOR_FREESCALE,
|
||||
- .obj_type = "dprc",
|
||||
- .ver_major = DPRC_VER_MAJOR,
|
||||
- .ver_minor = DPRC_VER_MINOR},
|
||||
+ .obj_type = "dprc"},
|
||||
{.vendor = 0x0},
|
||||
};
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/mc-allocator.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/mc-allocator.c
|
||||
@@ -709,20 +709,14 @@ static const struct fsl_mc_device_match_
|
||||
{
|
||||
.vendor = FSL_MC_VENDOR_FREESCALE,
|
||||
.obj_type = "dpbp",
|
||||
- .ver_major = DPBP_VER_MAJOR,
|
||||
- .ver_minor = DPBP_VER_MINOR
|
||||
},
|
||||
{
|
||||
.vendor = FSL_MC_VENDOR_FREESCALE,
|
||||
.obj_type = "dpmcp",
|
||||
- .ver_major = DPMCP_VER_MAJOR,
|
||||
- .ver_minor = DPMCP_VER_MINOR
|
||||
},
|
||||
{
|
||||
.vendor = FSL_MC_VENDOR_FREESCALE,
|
||||
.obj_type = "dpcon",
|
||||
- .ver_major = DPCON_VER_MAJOR,
|
||||
- .ver_minor = DPCON_VER_MINOR
|
||||
},
|
||||
{.vendor = 0x0},
|
||||
};
|
||||
--- a/drivers/staging/fsl-mc/bus/mc-bus.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/mc-bus.c
|
||||
@@ -40,8 +40,6 @@ static int fsl_mc_bus_match(struct devic
|
||||
struct fsl_mc_device *mc_dev = to_fsl_mc_device(dev);
|
||||
struct fsl_mc_driver *mc_drv = to_fsl_mc_driver(drv);
|
||||
bool found = false;
|
||||
- bool major_version_mismatch = false;
|
||||
- bool minor_version_mismatch = false;
|
||||
|
||||
if (WARN_ON(!fsl_mc_bus_exists()))
|
||||
goto out;
|
||||
@@ -64,32 +62,12 @@ static int fsl_mc_bus_match(struct devic
|
||||
for (id = mc_drv->match_id_table; id->vendor != 0x0; id++) {
|
||||
if (id->vendor == mc_dev->obj_desc.vendor &&
|
||||
strcmp(id->obj_type, mc_dev->obj_desc.type) == 0) {
|
||||
- if (id->ver_major == mc_dev->obj_desc.ver_major) {
|
||||
- found = true;
|
||||
- if (id->ver_minor != mc_dev->obj_desc.ver_minor)
|
||||
- minor_version_mismatch = true;
|
||||
- } else {
|
||||
- major_version_mismatch = true;
|
||||
- }
|
||||
+ found = true;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
- if (major_version_mismatch) {
|
||||
- dev_warn(dev,
|
||||
- "Major version mismatch: driver version %u.%u, MC object version %u.%u\n",
|
||||
- id->ver_major, id->ver_minor,
|
||||
- mc_dev->obj_desc.ver_major,
|
||||
- mc_dev->obj_desc.ver_minor);
|
||||
- } else if (minor_version_mismatch) {
|
||||
- dev_warn(dev,
|
||||
- "Minor version mismatch: driver version %u.%u, MC object version %u.%u\n",
|
||||
- id->ver_major, id->ver_minor,
|
||||
- mc_dev->obj_desc.ver_major,
|
||||
- mc_dev->obj_desc.ver_minor);
|
||||
- }
|
||||
-
|
||||
out:
|
||||
dev_dbg(dev, "%smatched\n", found ? "" : "not ");
|
||||
return found;
|
||||
@@ -722,20 +700,6 @@ static int fsl_mc_bus_probe(struct platf
|
||||
"Freescale Management Complex Firmware version: %u.%u.%u\n",
|
||||
mc_version.major, mc_version.minor, mc_version.revision);
|
||||
|
||||
- if (mc_version.major < MC_VER_MAJOR) {
|
||||
- dev_err(&pdev->dev,
|
||||
- "ERROR: MC firmware version not supported by driver (driver version: %u.%u)\n",
|
||||
- MC_VER_MAJOR, MC_VER_MINOR);
|
||||
- error = -ENOTSUPP;
|
||||
- goto error_cleanup_mc_io;
|
||||
- }
|
||||
-
|
||||
- if (mc_version.major > MC_VER_MAJOR) {
|
||||
- dev_warn(&pdev->dev,
|
||||
- "WARNING: driver may not support newer MC firmware features (driver version: %u.%u)\n",
|
||||
- MC_VER_MAJOR, MC_VER_MINOR);
|
||||
- }
|
||||
-
|
||||
error = get_mc_addr_translation_ranges(&pdev->dev,
|
||||
&mc->translation_ranges,
|
||||
&mc->num_translation_ranges);
|
@ -0,0 +1,29 @@
|
||||
From 3657147d6fea1977c07373325626bf50fe15bcfc Mon Sep 17 00:00:00 2001
|
||||
From: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Date: Mon, 11 Apr 2016 11:49:13 -0500
|
||||
Subject: [PATCH 171/226] staging: fsl-mc: set up coherent dma ops for added
|
||||
devices
|
||||
|
||||
Unless discovered devices have the no shareability flag set,
|
||||
set up coherent dma ops for them.
|
||||
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Acked-by: German Rivera <german.rivera@nxp.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/mc-bus.c | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/mc-bus.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/mc-bus.c
|
||||
@@ -469,6 +469,10 @@ int fsl_mc_device_add(struct dprc_obj_de
|
||||
goto error_cleanup_dev;
|
||||
}
|
||||
|
||||
+ /* Objects are coherent, unless 'no shareability' flag set. */
|
||||
+ if (!(obj_desc->flags & DPRC_OBJ_FLAG_NO_MEM_SHAREABILITY))
|
||||
+ arch_setup_dma_ops(&mc_dev->dev, 0, 0, NULL, true);
|
||||
+
|
||||
/*
|
||||
* The device-specific probe callback will get invoked by device_add()
|
||||
*/
|
@ -0,0 +1,30 @@
|
||||
From f7011c18a26d40a07b837a79d0efdad795ad7250 Mon Sep 17 00:00:00 2001
|
||||
From: Itai Katz <itai.katz@nxp.com>
|
||||
Date: Mon, 11 Apr 2016 11:55:48 -0500
|
||||
Subject: [PATCH 172/226] staging: fsl-mc: set cacheable flag for added
|
||||
devices if applicable
|
||||
|
||||
Some DPAA2 devices have mmio regions that should be mapped as
|
||||
cacheable by drivers. Set IORESOURCE_CACHEABLE in the region's
|
||||
flags if applicable.
|
||||
|
||||
Signed-off-by: Itai Katz <itai.katz@nxp.com>
|
||||
[Stuart: update subject and commit message]
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Acked-by: German Rivera <german.rivera@nxp.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/mc-bus.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/mc-bus.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/mc-bus.c
|
||||
@@ -354,6 +354,8 @@ static int fsl_mc_device_get_mmio_region
|
||||
regions[i].end = regions[i].start + region_desc.size - 1;
|
||||
regions[i].name = "fsl-mc object MMIO region";
|
||||
regions[i].flags = IORESOURCE_IO;
|
||||
+ if (region_desc.flags & DPRC_REGION_CACHEABLE)
|
||||
+ regions[i].flags |= IORESOURCE_CACHEABLE;
|
||||
}
|
||||
|
||||
mc_dev->regions = regions;
|
@ -0,0 +1,106 @@
|
||||
From 2df13a365ecda7e3321cf9d4e1a9ebd63e58c28b Mon Sep 17 00:00:00 2001
|
||||
From: Itai Katz <itai.katz@nxp.com>
|
||||
Date: Mon, 11 Apr 2016 11:55:55 -0500
|
||||
Subject: [PATCH 173/226] staging: fsl-mc: get version of root dprc from MC
|
||||
hardware
|
||||
|
||||
The root dprc is discovered as a platform device in the device tree. The
|
||||
version of that dprc was previously set using hardcoded values from the API
|
||||
header in the kernel). This patch removes the use of the hardcoded version
|
||||
numbers and instead reads the actual dprc version from the hardware.
|
||||
|
||||
Signed-off-by: Itai Katz <itai.katz@nxp.com>
|
||||
(Stuart: resolved merge conflict, updated commit subject/log)
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Acked-by: German Rivera <german.rivera@nxp.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/mc-bus.c | 45 ++++++++++++++++++++++++++++-------
|
||||
1 file changed, 37 insertions(+), 8 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/mc-bus.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/mc-bus.c
|
||||
@@ -229,11 +229,10 @@ static bool fsl_mc_is_root_dprc(struct d
|
||||
return dev == root_dprc_dev;
|
||||
}
|
||||
|
||||
-static int get_dprc_icid(struct fsl_mc_io *mc_io,
|
||||
- int container_id, u16 *icid)
|
||||
+static int get_dprc_attr(struct fsl_mc_io *mc_io,
|
||||
+ int container_id, struct dprc_attributes *attr)
|
||||
{
|
||||
u16 dprc_handle;
|
||||
- struct dprc_attributes attr;
|
||||
int error;
|
||||
|
||||
error = dprc_open(mc_io, 0, container_id, &dprc_handle);
|
||||
@@ -242,15 +241,14 @@ static int get_dprc_icid(struct fsl_mc_i
|
||||
return error;
|
||||
}
|
||||
|
||||
- memset(&attr, 0, sizeof(attr));
|
||||
- error = dprc_get_attributes(mc_io, 0, dprc_handle, &attr);
|
||||
+ memset(attr, 0, sizeof(struct dprc_attributes));
|
||||
+ error = dprc_get_attributes(mc_io, 0, dprc_handle, attr);
|
||||
if (error < 0) {
|
||||
dev_err(mc_io->dev, "dprc_get_attributes() failed: %d\n",
|
||||
error);
|
||||
goto common_cleanup;
|
||||
}
|
||||
|
||||
- *icid = attr.icid;
|
||||
error = 0;
|
||||
|
||||
common_cleanup:
|
||||
@@ -258,6 +256,34 @@ common_cleanup:
|
||||
return error;
|
||||
}
|
||||
|
||||
+static int get_dprc_icid(struct fsl_mc_io *mc_io,
|
||||
+ int container_id, u16 *icid)
|
||||
+{
|
||||
+ struct dprc_attributes attr;
|
||||
+ int error;
|
||||
+
|
||||
+ error = get_dprc_attr(mc_io, container_id, &attr);
|
||||
+ if (error == 0)
|
||||
+ *icid = attr.icid;
|
||||
+
|
||||
+ return error;
|
||||
+}
|
||||
+
|
||||
+static int get_dprc_version(struct fsl_mc_io *mc_io,
|
||||
+ int container_id, u16 *major, u16 *minor)
|
||||
+{
|
||||
+ struct dprc_attributes attr;
|
||||
+ int error;
|
||||
+
|
||||
+ error = get_dprc_attr(mc_io, container_id, &attr);
|
||||
+ if (error == 0) {
|
||||
+ *major = attr.version.major;
|
||||
+ *minor = attr.version.minor;
|
||||
+ }
|
||||
+
|
||||
+ return error;
|
||||
+}
|
||||
+
|
||||
static int translate_mc_addr(struct fsl_mc_device *mc_dev,
|
||||
enum dprc_region_type mc_region_type,
|
||||
u64 mc_offset, phys_addr_t *phys_addr)
|
||||
@@ -719,11 +745,14 @@ static int fsl_mc_bus_probe(struct platf
|
||||
goto error_cleanup_mc_io;
|
||||
}
|
||||
|
||||
+ error = get_dprc_version(mc_io, container_id,
|
||||
+ &obj_desc.ver_major, &obj_desc.ver_minor);
|
||||
+ if (error < 0)
|
||||
+ goto error_cleanup_mc_io;
|
||||
+
|
||||
obj_desc.vendor = FSL_MC_VENDOR_FREESCALE;
|
||||
strcpy(obj_desc.type, "dprc");
|
||||
obj_desc.id = container_id;
|
||||
- obj_desc.ver_major = DPRC_VER_MAJOR;
|
||||
- obj_desc.ver_minor = DPRC_VER_MINOR;
|
||||
obj_desc.irq_count = 1;
|
||||
obj_desc.region_count = 0;
|
||||
|
@ -0,0 +1,90 @@
|
||||
From 653898b483e5448084b15214a8c20959b418dbe7 Mon Sep 17 00:00:00 2001
|
||||
From: Itai Katz <itai.katz@nxp.com>
|
||||
Date: Mon, 11 Apr 2016 11:56:05 -0500
|
||||
Subject: [PATCH 174/226] staging: fsl-mc: add dprc version check
|
||||
|
||||
The dprc driver supports dprc version 5.0 and above.
|
||||
This patch adds the code to check the version.
|
||||
|
||||
Signed-off-by: Itai Katz <itai.katz@nxp.com>
|
||||
(Stuart: resolved merge conflicts, split dpseci quirk into separate patch)
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Acked-by: German Rivera <german.rivera@nxp.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/dprc-cmd.h | 6 +++---
|
||||
drivers/staging/fsl-mc/bus/dprc-driver.c | 19 +++++++++++++++++++
|
||||
drivers/staging/fsl-mc/bus/mc-bus.c | 1 +
|
||||
drivers/staging/fsl-mc/include/mc-private.h | 2 ++
|
||||
4 files changed, 25 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/dprc-cmd.h
|
||||
+++ b/drivers/staging/fsl-mc/bus/dprc-cmd.h
|
||||
@@ -40,9 +40,9 @@
|
||||
#ifndef _FSL_DPRC_CMD_H
|
||||
#define _FSL_DPRC_CMD_H
|
||||
|
||||
-/* DPRC Version */
|
||||
-#define DPRC_VER_MAJOR 5
|
||||
-#define DPRC_VER_MINOR 1
|
||||
+/* Minimal supported DPRC Version */
|
||||
+#define DPRC_MIN_VER_MAJOR 5
|
||||
+#define DPRC_MIN_VER_MINOR 0
|
||||
|
||||
/* Command IDs */
|
||||
#define DPRC_CMDID_CLOSE 0x800
|
||||
--- a/drivers/staging/fsl-mc/bus/dprc-driver.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/dprc-driver.c
|
||||
@@ -693,6 +693,25 @@ static int dprc_probe(struct fsl_mc_devi
|
||||
goto error_cleanup_msi_domain;
|
||||
}
|
||||
|
||||
+ error = dprc_get_attributes(mc_dev->mc_io, 0, mc_dev->mc_handle,
|
||||
+ &mc_bus->dprc_attr);
|
||||
+ if (error < 0) {
|
||||
+ dev_err(&mc_dev->dev, "dprc_get_attributes() failed: %d\n",
|
||||
+ error);
|
||||
+ goto error_cleanup_open;
|
||||
+ }
|
||||
+
|
||||
+ if (mc_bus->dprc_attr.version.major < DPRC_MIN_VER_MAJOR ||
|
||||
+ (mc_bus->dprc_attr.version.major == DPRC_MIN_VER_MAJOR &&
|
||||
+ mc_bus->dprc_attr.version.minor < DPRC_MIN_VER_MINOR)) {
|
||||
+ dev_err(&mc_dev->dev,
|
||||
+ "ERROR: DPRC version %d.%d not supported\n",
|
||||
+ mc_bus->dprc_attr.version.major,
|
||||
+ mc_bus->dprc_attr.version.minor);
|
||||
+ error = -ENOTSUPP;
|
||||
+ goto error_cleanup_open;
|
||||
+ }
|
||||
+
|
||||
mutex_init(&mc_bus->scan_mutex);
|
||||
|
||||
/*
|
||||
--- a/drivers/staging/fsl-mc/bus/mc-bus.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/mc-bus.c
|
||||
@@ -745,6 +745,7 @@ static int fsl_mc_bus_probe(struct platf
|
||||
goto error_cleanup_mc_io;
|
||||
}
|
||||
|
||||
+ memset(&obj_desc, 0, sizeof(struct dprc_obj_desc));
|
||||
error = get_dprc_version(mc_io, container_id,
|
||||
&obj_desc.ver_major, &obj_desc.ver_minor);
|
||||
if (error < 0)
|
||||
--- a/drivers/staging/fsl-mc/include/mc-private.h
|
||||
+++ b/drivers/staging/fsl-mc/include/mc-private.h
|
||||
@@ -94,12 +94,14 @@ struct fsl_mc_resource_pool {
|
||||
* from the physical DPRC.
|
||||
* @irq_resources: Pointer to array of IRQ objects for the IRQ pool
|
||||
* @scan_mutex: Serializes bus scanning
|
||||
+ * @dprc_attr: DPRC attributes
|
||||
*/
|
||||
struct fsl_mc_bus {
|
||||
struct fsl_mc_device mc_dev;
|
||||
struct fsl_mc_resource_pool resource_pools[FSL_MC_NUM_POOL_TYPES];
|
||||
struct fsl_mc_device_irq *irq_resources;
|
||||
struct mutex scan_mutex; /* serializes bus scanning */
|
||||
+ struct dprc_attributes dprc_attr;
|
||||
};
|
||||
|
||||
#define to_fsl_mc_bus(_mc_dev) \
|
@ -0,0 +1,38 @@
|
||||
From 5366dc8896ca7cf028db73643860821b189a1dfd Mon Sep 17 00:00:00 2001
|
||||
From: Horia Geanta <horia.geanta@nxp.com>
|
||||
Date: Mon, 11 Apr 2016 11:50:26 -0500
|
||||
Subject: [PATCH 175/226] staging: fsl-mc: add quirk handling for dpseci
|
||||
objects < 4.0
|
||||
|
||||
dpseci objects < 4.0 are not coherent-- in spite of the fact
|
||||
that the MC reports them to be coherent in certain versions.
|
||||
Add a special case to set the no shareability flag for dpseci
|
||||
objects < 4.0.
|
||||
|
||||
Signed-off-by: Horia Geanta <horia.geanta@nxp.com>
|
||||
(Stuart: reworded commit message, updated comment in patch)
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Acked-by: German Rivera <german.rivera@nxp.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/dprc-driver.c | 9 +++++++++
|
||||
1 file changed, 9 insertions(+)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/dprc-driver.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/dprc-driver.c
|
||||
@@ -312,6 +312,15 @@ int dprc_scan_objects(struct fsl_mc_devi
|
||||
continue;
|
||||
}
|
||||
|
||||
+ /*
|
||||
+ * add a quirk for all versions of dpsec < 4.0...none
|
||||
+ * are coherent regardless of what the MC reports.
|
||||
+ */
|
||||
+ if ((strcmp(obj_desc->type, "dpseci") == 0) &&
|
||||
+ (obj_desc->ver_major < 4))
|
||||
+ obj_desc->flags |=
|
||||
+ DPRC_OBJ_FLAG_NO_MEM_SHAREABILITY;
|
||||
+
|
||||
irq_count += obj_desc->irq_count;
|
||||
dev_dbg(&mc_bus_dev->dev,
|
||||
"Discovered object: type %s, id %d\n",
|
@ -0,0 +1,56 @@
|
||||
From 035789ffb3b89b9764d7cc79d209a5795c18fa93 Mon Sep 17 00:00:00 2001
|
||||
From: Itai Katz <itai.katz@nxp.com>
|
||||
Date: Mon, 11 Apr 2016 11:56:11 -0500
|
||||
Subject: [PATCH 176/226] staging: fsl-mc: add dpmcp version check
|
||||
|
||||
The dpmcp driver supports dpmcp version 3.0 and above.
|
||||
This patch adds the code to check the version.
|
||||
|
||||
Signed-off-by: Itai Katz <itai.katz@nxp.com>
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Acked-by: German Rivera <german.rivera@nxp.com>
|
||||
|
||||
drivers/staging/fsl-mc/bus/dpmcp-cmd.h | 6 +++---
|
||||
drivers/staging/fsl-mc/bus/mc-allocator.c | 11 +++++++++++
|
||||
2 files changed, 14 insertions(+), 3 deletions(-)
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/dpmcp-cmd.h | 6 +++---
|
||||
drivers/staging/fsl-mc/bus/mc-allocator.c | 11 +++++++++++
|
||||
2 files changed, 14 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/dpmcp-cmd.h
|
||||
+++ b/drivers/staging/fsl-mc/bus/dpmcp-cmd.h
|
||||
@@ -32,9 +32,9 @@
|
||||
#ifndef _FSL_DPMCP_CMD_H
|
||||
#define _FSL_DPMCP_CMD_H
|
||||
|
||||
-/* DPMCP Version */
|
||||
-#define DPMCP_VER_MAJOR 3
|
||||
-#define DPMCP_VER_MINOR 0
|
||||
+/* Minimal supported DPMCP Version */
|
||||
+#define DPMCP_MIN_VER_MAJOR 3
|
||||
+#define DPMCP_MIN_VER_MINOR 0
|
||||
|
||||
/* Command IDs */
|
||||
#define DPMCP_CMDID_CLOSE 0x800
|
||||
--- a/drivers/staging/fsl-mc/bus/mc-allocator.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/mc-allocator.c
|
||||
@@ -297,6 +297,17 @@ int __must_check fsl_mc_portal_allocate(
|
||||
if (WARN_ON(!dpmcp_dev))
|
||||
goto error_cleanup_resource;
|
||||
|
||||
+ if (dpmcp_dev->obj_desc.ver_major < DPMCP_MIN_VER_MAJOR ||
|
||||
+ (dpmcp_dev->obj_desc.ver_major == DPMCP_MIN_VER_MAJOR &&
|
||||
+ dpmcp_dev->obj_desc.ver_minor < DPMCP_MIN_VER_MINOR)) {
|
||||
+ dev_err(&dpmcp_dev->dev,
|
||||
+ "ERROR: Version %d.%d of DPMCP not supported.\n",
|
||||
+ dpmcp_dev->obj_desc.ver_major,
|
||||
+ dpmcp_dev->obj_desc.ver_minor);
|
||||
+ error = -ENOTSUPP;
|
||||
+ goto error_cleanup_resource;
|
||||
+ }
|
||||
+
|
||||
if (WARN_ON(dpmcp_dev->obj_desc.region_count == 0))
|
||||
goto error_cleanup_resource;
|
||||
|
@ -0,0 +1,30 @@
|
||||
From 324147c1a6806301d9441a8d83c7c5ac880140cd Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Horia=20Geant=C4=83?= <horia.geanta@nxp.com>
|
||||
Date: Mon, 11 Apr 2016 11:56:16 -0500
|
||||
Subject: [PATCH 177/226] staging: fsl-mc: return -EINVAL for all
|
||||
fsl_mc_portal_allocate() failures
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
There are some error paths that allow for a NULL new_mc_io and err = 0
|
||||
return code. Return -EINVAL instead.
|
||||
|
||||
Signed-off-by: Horia Geantă <horia.geanta@nxp.com>
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Acked-by: German Rivera <german.rivera@nxp.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/mc-allocator.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/mc-allocator.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/mc-allocator.c
|
||||
@@ -293,6 +293,7 @@ int __must_check fsl_mc_portal_allocate(
|
||||
if (error < 0)
|
||||
return error;
|
||||
|
||||
+ error = -EINVAL;
|
||||
dpmcp_dev = resource->data;
|
||||
if (WARN_ON(!dpmcp_dev))
|
||||
goto error_cleanup_resource;
|
@ -0,0 +1,47 @@
|
||||
From 9821898bbfa5a21254baafe19b3cc97516fc6019 Mon Sep 17 00:00:00 2001
|
||||
From: Matthias Brugger <mbrugger@suse.com>
|
||||
Date: Thu, 14 Apr 2016 23:24:26 +0200
|
||||
Subject: [PATCH 178/226] staging: fsl-mc: bus: Drop warning
|
||||
|
||||
When updating the irq_chip and msi_domain_ops, the code checkes for
|
||||
already present functions.
|
||||
When more then one ITS controller are present in the system,
|
||||
irq_chip and msi_domain_ops got already set and a warning is invoked.
|
||||
|
||||
This patch deletes the warning, as the funtions are just already set to
|
||||
the needed callbacks.
|
||||
|
||||
Signed-off-by: Matthias Brugger <mbrugger@suse.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/mc-msi.c | 12 ++++--------
|
||||
1 file changed, 4 insertions(+), 8 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/mc-msi.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/mc-msi.c
|
||||
@@ -37,10 +37,8 @@ static void fsl_mc_msi_update_dom_ops(st
|
||||
/*
|
||||
* set_desc should not be set by the caller
|
||||
*/
|
||||
- if (WARN_ON(ops->set_desc))
|
||||
- return;
|
||||
-
|
||||
- ops->set_desc = fsl_mc_msi_set_desc;
|
||||
+ if (ops->set_desc == NULL)
|
||||
+ ops->set_desc = fsl_mc_msi_set_desc;
|
||||
}
|
||||
|
||||
static void __fsl_mc_msi_write_msg(struct fsl_mc_device *mc_bus_dev,
|
||||
@@ -129,10 +127,8 @@ static void fsl_mc_msi_update_chip_ops(s
|
||||
/*
|
||||
* irq_write_msi_msg should not be set by the caller
|
||||
*/
|
||||
- if (WARN_ON(chip->irq_write_msi_msg))
|
||||
- return;
|
||||
-
|
||||
- chip->irq_write_msi_msg = fsl_mc_msi_write_msg;
|
||||
+ if (chip->irq_write_msi_msg == NULL)
|
||||
+ chip->irq_write_msi_msg = fsl_mc_msi_write_msg;
|
||||
}
|
||||
|
||||
/**
|
@ -0,0 +1,54 @@
|
||||
From 227c693741ce1fbf0ad146c87f03369334941f2e Mon Sep 17 00:00:00 2001
|
||||
From: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Date: Wed, 22 Jun 2016 16:40:42 -0500
|
||||
Subject: [PATCH 179/226] staging: fsl-mc: add support for the modalias sysfs
|
||||
attribute
|
||||
|
||||
In order to support uevent based module loading implement modalias support
|
||||
for the fsl-mc bus driver. Aliases are based on vendor and object/device
|
||||
id and are of the form "fsl-mc:vNdN".
|
||||
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/mc-bus.c | 25 +++++++++++++++++++++++++
|
||||
1 file changed, 25 insertions(+)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/mc-bus.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/mc-bus.c
|
||||
@@ -82,10 +82,35 @@ static int fsl_mc_bus_uevent(struct devi
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static ssize_t modalias_show(struct device *dev, struct device_attribute *attr,
|
||||
+ char *buf)
|
||||
+{
|
||||
+ struct fsl_mc_device *mc_dev = to_fsl_mc_device(dev);
|
||||
+
|
||||
+ return sprintf(buf, "fsl-mc:v%08Xd%s\n", mc_dev->obj_desc.vendor,
|
||||
+ mc_dev->obj_desc.type);
|
||||
+}
|
||||
+static DEVICE_ATTR_RO(modalias);
|
||||
+
|
||||
+static struct attribute *fsl_mc_dev_attrs[] = {
|
||||
+ &dev_attr_modalias.attr,
|
||||
+ NULL,
|
||||
+};
|
||||
+
|
||||
+static const struct attribute_group fsl_mc_dev_group = {
|
||||
+ .attrs = fsl_mc_dev_attrs,
|
||||
+};
|
||||
+
|
||||
+static const struct attribute_group *fsl_mc_dev_groups[] = {
|
||||
+ &fsl_mc_dev_group,
|
||||
+ NULL,
|
||||
+};
|
||||
+
|
||||
struct bus_type fsl_mc_bus_type = {
|
||||
.name = "fsl-mc",
|
||||
.match = fsl_mc_bus_match,
|
||||
.uevent = fsl_mc_bus_uevent,
|
||||
+ .dev_groups = fsl_mc_dev_groups,
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(fsl_mc_bus_type);
|
||||
|
@ -0,0 +1,32 @@
|
||||
From 721966c3990bc4596c6270afc1ea68c756b72f0d Mon Sep 17 00:00:00 2001
|
||||
From: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Date: Wed, 22 Jun 2016 16:40:43 -0500
|
||||
Subject: [PATCH 180/226] staging: fsl-mc: implement uevent callback and set
|
||||
the modalias
|
||||
|
||||
Replace placeholder code in the uevent callback to properly
|
||||
set the MODALIAS env variable.
|
||||
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/mc-bus.c | 8 +++++++-
|
||||
1 file changed, 7 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/mc-bus.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/mc-bus.c
|
||||
@@ -78,7 +78,13 @@ out:
|
||||
*/
|
||||
static int fsl_mc_bus_uevent(struct device *dev, struct kobj_uevent_env *env)
|
||||
{
|
||||
- pr_debug("%s invoked\n", __func__);
|
||||
+ struct fsl_mc_device *mc_dev = to_fsl_mc_device(dev);
|
||||
+
|
||||
+ if (add_uevent_var(env, "MODALIAS=fsl-mc:v%08Xd%s",
|
||||
+ mc_dev->obj_desc.vendor,
|
||||
+ mc_dev->obj_desc.type))
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
@ -0,0 +1,85 @@
|
||||
From c7b1e04ae4f47323800ca2b3d3430ecf1d9ed7df Mon Sep 17 00:00:00 2001
|
||||
From: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Date: Wed, 22 Jun 2016 16:40:44 -0500
|
||||
Subject: [PATCH 181/226] staging: fsl-mc: clean up the device id struct
|
||||
|
||||
-rename the struct used for fsl-mc device ids to be more
|
||||
consistent with other busses
|
||||
-remove the now obsolete and unused version fields
|
||||
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/dprc-driver.c | 2 +-
|
||||
drivers/staging/fsl-mc/bus/mc-allocator.c | 2 +-
|
||||
drivers/staging/fsl-mc/bus/mc-bus.c | 2 +-
|
||||
drivers/staging/fsl-mc/include/mc.h | 10 +++-------
|
||||
4 files changed, 6 insertions(+), 10 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/dprc-driver.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/dprc-driver.c
|
||||
@@ -805,7 +805,7 @@ static int dprc_remove(struct fsl_mc_dev
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static const struct fsl_mc_device_match_id match_id_table[] = {
|
||||
+static const struct fsl_mc_device_id match_id_table[] = {
|
||||
{
|
||||
.vendor = FSL_MC_VENDOR_FREESCALE,
|
||||
.obj_type = "dprc"},
|
||||
--- a/drivers/staging/fsl-mc/bus/mc-allocator.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/mc-allocator.c
|
||||
@@ -717,7 +717,7 @@ static int fsl_mc_allocator_remove(struc
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static const struct fsl_mc_device_match_id match_id_table[] = {
|
||||
+static const struct fsl_mc_device_id match_id_table[] = {
|
||||
{
|
||||
.vendor = FSL_MC_VENDOR_FREESCALE,
|
||||
.obj_type = "dpbp",
|
||||
--- a/drivers/staging/fsl-mc/bus/mc-bus.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/mc-bus.c
|
||||
@@ -36,7 +36,7 @@ static bool fsl_mc_is_root_dprc(struct d
|
||||
*/
|
||||
static int fsl_mc_bus_match(struct device *dev, struct device_driver *drv)
|
||||
{
|
||||
- const struct fsl_mc_device_match_id *id;
|
||||
+ const struct fsl_mc_device_id *id;
|
||||
struct fsl_mc_device *mc_dev = to_fsl_mc_device(dev);
|
||||
struct fsl_mc_driver *mc_drv = to_fsl_mc_driver(drv);
|
||||
bool found = false;
|
||||
--- a/drivers/staging/fsl-mc/include/mc.h
|
||||
+++ b/drivers/staging/fsl-mc/include/mc.h
|
||||
@@ -39,7 +39,7 @@ struct fsl_mc_bus;
|
||||
*/
|
||||
struct fsl_mc_driver {
|
||||
struct device_driver driver;
|
||||
- const struct fsl_mc_device_match_id *match_id_table;
|
||||
+ const struct fsl_mc_device_id *match_id_table;
|
||||
int (*probe)(struct fsl_mc_device *dev);
|
||||
int (*remove)(struct fsl_mc_device *dev);
|
||||
void (*shutdown)(struct fsl_mc_device *dev);
|
||||
@@ -51,20 +51,16 @@ struct fsl_mc_driver {
|
||||
container_of(_drv, struct fsl_mc_driver, driver)
|
||||
|
||||
/**
|
||||
- * struct fsl_mc_device_match_id - MC object device Id entry for driver matching
|
||||
+ * struct fsl_mc_device_id - MC object device Id entry for driver matching
|
||||
* @vendor: vendor ID
|
||||
* @obj_type: MC object type
|
||||
- * @ver_major: MC object version major number
|
||||
- * @ver_minor: MC object version minor number
|
||||
*
|
||||
* Type of entries in the "device Id" table for MC object devices supported by
|
||||
* a MC object device driver. The last entry of the table has vendor set to 0x0
|
||||
*/
|
||||
-struct fsl_mc_device_match_id {
|
||||
+struct fsl_mc_device_id {
|
||||
u16 vendor;
|
||||
const char obj_type[16];
|
||||
- u32 ver_major;
|
||||
- u32 ver_minor;
|
||||
};
|
||||
|
||||
/**
|
@ -0,0 +1,98 @@
|
||||
From bd83c4253992d263cb83108e26b4687058f11deb Mon Sep 17 00:00:00 2001
|
||||
From: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Date: Wed, 22 Jun 2016 16:40:45 -0500
|
||||
Subject: [PATCH 182/226] staging: fsl-mc: add support for device table
|
||||
matching
|
||||
|
||||
Move the definition of fsl_mc_device_id to its proper location in
|
||||
mod_devicetable.h, and add fsl-mc bus support to devicetable-offsets.c
|
||||
and file2alias.c to enable device table matching. With this patch udev
|
||||
based module loading of fsl-mc drivers is supported.
|
||||
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/include/mc.h | 13 -------------
|
||||
include/linux/mod_devicetable.h | 16 ++++++++++++++++
|
||||
scripts/mod/devicetable-offsets.c | 4 ++++
|
||||
scripts/mod/file2alias.c | 12 ++++++++++++
|
||||
4 files changed, 32 insertions(+), 13 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/include/mc.h
|
||||
+++ b/drivers/staging/fsl-mc/include/mc.h
|
||||
@@ -51,19 +51,6 @@ struct fsl_mc_driver {
|
||||
container_of(_drv, struct fsl_mc_driver, driver)
|
||||
|
||||
/**
|
||||
- * struct fsl_mc_device_id - MC object device Id entry for driver matching
|
||||
- * @vendor: vendor ID
|
||||
- * @obj_type: MC object type
|
||||
- *
|
||||
- * Type of entries in the "device Id" table for MC object devices supported by
|
||||
- * a MC object device driver. The last entry of the table has vendor set to 0x0
|
||||
- */
|
||||
-struct fsl_mc_device_id {
|
||||
- u16 vendor;
|
||||
- const char obj_type[16];
|
||||
-};
|
||||
-
|
||||
-/**
|
||||
* enum fsl_mc_pool_type - Types of allocatable MC bus resources
|
||||
*
|
||||
* Entries in these enum are used as indices in the array of resource
|
||||
--- a/include/linux/mod_devicetable.h
|
||||
+++ b/include/linux/mod_devicetable.h
|
||||
@@ -657,4 +657,20 @@ struct ulpi_device_id {
|
||||
kernel_ulong_t driver_data;
|
||||
};
|
||||
|
||||
+/**
|
||||
+ * struct fsl_mc_device_id - MC object device identifier
|
||||
+ * @vendor: vendor ID
|
||||
+ * @obj_type: MC object type
|
||||
+ * @ver_major: MC object version major number
|
||||
+ * @ver_minor: MC object version minor number
|
||||
+ *
|
||||
+ * Type of entries in the "device Id" table for MC object devices supported by
|
||||
+ * a MC object device driver. The last entry of the table has vendor set to 0x0
|
||||
+ */
|
||||
+struct fsl_mc_device_id {
|
||||
+ __u16 vendor;
|
||||
+ const char obj_type[16];
|
||||
+};
|
||||
+
|
||||
+
|
||||
#endif /* LINUX_MOD_DEVICETABLE_H */
|
||||
--- a/scripts/mod/devicetable-offsets.c
|
||||
+++ b/scripts/mod/devicetable-offsets.c
|
||||
@@ -202,5 +202,9 @@ int main(void)
|
||||
DEVID_FIELD(hda_device_id, rev_id);
|
||||
DEVID_FIELD(hda_device_id, api_version);
|
||||
|
||||
+ DEVID(fsl_mc_device_id);
|
||||
+ DEVID_FIELD(fsl_mc_device_id, vendor);
|
||||
+ DEVID_FIELD(fsl_mc_device_id, obj_type);
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
--- a/scripts/mod/file2alias.c
|
||||
+++ b/scripts/mod/file2alias.c
|
||||
@@ -1271,6 +1271,18 @@ static int do_hda_entry(const char *file
|
||||
}
|
||||
ADD_TO_DEVTABLE("hdaudio", hda_device_id, do_hda_entry);
|
||||
|
||||
+/* Looks like: fsl-mc:vNdN */
|
||||
+static int do_fsl_mc_entry(const char *filename, void *symval,
|
||||
+ char *alias)
|
||||
+{
|
||||
+ DEF_FIELD(symval, fsl_mc_device_id, vendor);
|
||||
+ DEF_FIELD_ADDR(symval, fsl_mc_device_id, obj_type);
|
||||
+
|
||||
+ sprintf(alias, "fsl-mc:v%08Xd%s", vendor, *obj_type);
|
||||
+ return 1;
|
||||
+}
|
||||
+ADD_TO_DEVTABLE("fslmc", fsl_mc_device_id, do_fsl_mc_entry);
|
||||
+
|
||||
/* Does namelen bytes of name exactly match the symbol? */
|
||||
static bool sym_is(const char *name, unsigned namelen, const char *symbol)
|
||||
{
|
@ -0,0 +1,23 @@
|
||||
From 4087dc71f82a71c25f9d051773094f4ae3f4238d Mon Sep 17 00:00:00 2001
|
||||
From: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Date: Wed, 22 Jun 2016 16:40:46 -0500
|
||||
Subject: [PATCH 183/226] staging: fsl-mc: export mc_get_version
|
||||
|
||||
some drivers (built as modules) rely on mc_get_version()
|
||||
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/dpmng.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/dpmng.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/dpmng.c
|
||||
@@ -67,6 +67,7 @@ int mc_get_version(struct fsl_mc_io *mc_
|
||||
|
||||
return 0;
|
||||
}
|
||||
+EXPORT_SYMBOL(mc_get_version);
|
||||
|
||||
/**
|
||||
* dpmng_get_container_id() - Get container ID associated with a given portal.
|
@ -0,0 +1,77 @@
|
||||
From 82981b28f3a8a7f4ac61d8dc87a0abaeebfbe6dc Mon Sep 17 00:00:00 2001
|
||||
From: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Date: Wed, 22 Jun 2016 16:40:47 -0500
|
||||
Subject: [PATCH 184/226] staging: fsl-mc: make fsl_mc_is_root_dprc() global
|
||||
|
||||
make fsl_mc_is_root_dprc() global so that the dprc driver
|
||||
can use it
|
||||
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/mc-bus.c | 28 +++++++++++++---------------
|
||||
drivers/staging/fsl-mc/include/mc.h | 2 ++
|
||||
2 files changed, 15 insertions(+), 15 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/mc-bus.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/mc-bus.c
|
||||
@@ -24,8 +24,6 @@
|
||||
|
||||
static struct kmem_cache *mc_dev_cache;
|
||||
|
||||
-static bool fsl_mc_is_root_dprc(struct device *dev);
|
||||
-
|
||||
/**
|
||||
* fsl_mc_bus_match - device to driver matching callback
|
||||
* @dev: the MC object device structure to match against
|
||||
@@ -247,19 +245,6 @@ static void fsl_mc_get_root_dprc(struct
|
||||
}
|
||||
}
|
||||
|
||||
-/**
|
||||
- * fsl_mc_is_root_dprc - function to check if a given device is a root dprc
|
||||
- */
|
||||
-static bool fsl_mc_is_root_dprc(struct device *dev)
|
||||
-{
|
||||
- struct device *root_dprc_dev;
|
||||
-
|
||||
- fsl_mc_get_root_dprc(dev, &root_dprc_dev);
|
||||
- if (!root_dprc_dev)
|
||||
- return false;
|
||||
- return dev == root_dprc_dev;
|
||||
-}
|
||||
-
|
||||
static int get_dprc_attr(struct fsl_mc_io *mc_io,
|
||||
int container_id, struct dprc_attributes *attr)
|
||||
{
|
||||
@@ -424,6 +409,19 @@ error_cleanup_regions:
|
||||
}
|
||||
|
||||
/**
|
||||
+ * fsl_mc_is_root_dprc - function to check if a given device is a root dprc
|
||||
+ */
|
||||
+bool fsl_mc_is_root_dprc(struct device *dev)
|
||||
+{
|
||||
+ struct device *root_dprc_dev;
|
||||
+
|
||||
+ fsl_mc_get_root_dprc(dev, &root_dprc_dev);
|
||||
+ if (!root_dprc_dev)
|
||||
+ return false;
|
||||
+ return dev == root_dprc_dev;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
* Add a newly discovered MC object device to be visible in Linux
|
||||
*/
|
||||
int fsl_mc_device_add(struct dprc_obj_desc *obj_desc,
|
||||
--- a/drivers/staging/fsl-mc/include/mc.h
|
||||
+++ b/drivers/staging/fsl-mc/include/mc.h
|
||||
@@ -207,6 +207,8 @@ int __must_check fsl_mc_allocate_irqs(st
|
||||
|
||||
void fsl_mc_free_irqs(struct fsl_mc_device *mc_dev);
|
||||
|
||||
+bool fsl_mc_is_root_dprc(struct device *dev);
|
||||
+
|
||||
extern struct bus_type fsl_mc_bus_type;
|
||||
|
||||
#endif /* _FSL_MC_H_ */
|
@ -0,0 +1,62 @@
|
||||
From 4e55a4c296d3a93c95320cdac0b8e72f3cfefb98 Mon Sep 17 00:00:00 2001
|
||||
From: Bharat Bhushan <Bharat.Bhushan@nxp.com>
|
||||
Date: Wed, 22 Jun 2016 16:40:48 -0500
|
||||
Subject: [PATCH 185/226] staging: fsl-mc: fix asymmetry in destroy of mc_io
|
||||
|
||||
An mc_io represents a mapped MC portal. Previously, an mc_io was
|
||||
created for the root dprc in fsl_mc_bus_probe() and for child dprcs
|
||||
in dprc_probe(). But the free of that data structure happened in the
|
||||
general bus remove callback. This asymmetry resulted in some bugs due
|
||||
to unwanted destroys of mc_io object in some scenarios (e.g. vfio).
|
||||
|
||||
Fix this bug by making things symmetric-- mc_io created in
|
||||
fsl_mc_bus_probe() is freed in fsl_mc_bus_remove(). The mc_io created
|
||||
in dprc_probe() is freed in dprc_remove().
|
||||
|
||||
Signed-off-by: Bharat Bhushan <Bharat.Bhushan@nxp.com>
|
||||
[Stuart: added check for root dprc and reworded commit message]
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/dprc-driver.c | 5 +++++
|
||||
drivers/staging/fsl-mc/bus/mc-bus.c | 8 ++++----
|
||||
2 files changed, 9 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/dprc-driver.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/dprc-driver.c
|
||||
@@ -801,6 +801,11 @@ static int dprc_remove(struct fsl_mc_dev
|
||||
dev_set_msi_domain(&mc_dev->dev, NULL);
|
||||
}
|
||||
|
||||
+ if (!fsl_mc_is_root_dprc(&mc_dev->dev)) {
|
||||
+ fsl_destroy_mc_io(mc_dev->mc_io);
|
||||
+ mc_dev->mc_io = NULL;
|
||||
+ }
|
||||
+
|
||||
dev_info(&mc_dev->dev, "DPRC device unbound from driver");
|
||||
return 0;
|
||||
}
|
||||
--- a/drivers/staging/fsl-mc/bus/mc-bus.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/mc-bus.c
|
||||
@@ -579,10 +579,6 @@ void fsl_mc_device_remove(struct fsl_mc_
|
||||
|
||||
if (strcmp(mc_dev->obj_desc.type, "dprc") == 0) {
|
||||
mc_bus = to_fsl_mc_bus(mc_dev);
|
||||
- if (mc_dev->mc_io) {
|
||||
- fsl_destroy_mc_io(mc_dev->mc_io);
|
||||
- mc_dev->mc_io = NULL;
|
||||
- }
|
||||
|
||||
if (fsl_mc_is_root_dprc(&mc_dev->dev)) {
|
||||
if (atomic_read(&root_dprc_count) > 0)
|
||||
@@ -810,6 +806,10 @@ static int fsl_mc_bus_remove(struct plat
|
||||
return -EINVAL;
|
||||
|
||||
fsl_mc_device_remove(mc->root_mc_bus_dev);
|
||||
+
|
||||
+ fsl_destroy_mc_io(mc->root_mc_bus_dev->mc_io);
|
||||
+ mc->root_mc_bus_dev->mc_io = NULL;
|
||||
+
|
||||
dev_info(&pdev->dev, "Root MC bus device removed");
|
||||
return 0;
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
From 159abffaa5e2acf910b5e4cdca81a7b6d2dd958f Mon Sep 17 00:00:00 2001
|
||||
From: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Date: Wed, 22 Jun 2016 16:40:49 -0500
|
||||
Subject: [PATCH 186/226] staging: fsl-mc: dprc: add missing irq free
|
||||
|
||||
add missing free of the Linux irq when tearing down interrupts
|
||||
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/dprc-driver.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/dprc-driver.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/dprc-driver.c
|
||||
@@ -760,7 +760,12 @@ error_cleanup_msi_domain:
|
||||
*/
|
||||
static void dprc_teardown_irq(struct fsl_mc_device *mc_dev)
|
||||
{
|
||||
+ struct fsl_mc_device_irq *irq = mc_dev->irqs[0];
|
||||
+
|
||||
(void)disable_dprc_irq(mc_dev);
|
||||
+
|
||||
+ devm_free_irq(&mc_dev->dev, irq->msi_desc->irq, &mc_dev->dev);
|
||||
+
|
||||
fsl_mc_free_irqs(mc_dev);
|
||||
}
|
||||
|
@ -0,0 +1,41 @@
|
||||
From b104ed7497745e2e6da214b37ef22edaf38098c7 Mon Sep 17 00:00:00 2001
|
||||
From: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Date: Wed, 22 Jun 2016 16:40:50 -0500
|
||||
Subject: [PATCH 187/226] staging: fsl-mc: dprc: fix ordering problem freeing
|
||||
resources in remove of dprc
|
||||
|
||||
When unbinding a dprc from the dprc driver the cleanup of
|
||||
the resource pools must happen after irq pool cleanup
|
||||
is done.
|
||||
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/dprc-driver.c | 10 ++++++----
|
||||
1 file changed, 6 insertions(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/dprc-driver.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/dprc-driver.c
|
||||
@@ -796,16 +796,18 @@ static int dprc_remove(struct fsl_mc_dev
|
||||
dprc_teardown_irq(mc_dev);
|
||||
|
||||
device_for_each_child(&mc_dev->dev, NULL, __fsl_mc_device_remove);
|
||||
- dprc_cleanup_all_resource_pools(mc_dev);
|
||||
- error = dprc_close(mc_dev->mc_io, 0, mc_dev->mc_handle);
|
||||
- if (error < 0)
|
||||
- dev_err(&mc_dev->dev, "dprc_close() failed: %d\n", error);
|
||||
|
||||
if (dev_get_msi_domain(&mc_dev->dev)) {
|
||||
fsl_mc_cleanup_irq_pool(mc_bus);
|
||||
dev_set_msi_domain(&mc_dev->dev, NULL);
|
||||
}
|
||||
|
||||
+ dprc_cleanup_all_resource_pools(mc_dev);
|
||||
+
|
||||
+ error = dprc_close(mc_dev->mc_io, 0, mc_dev->mc_handle);
|
||||
+ if (error < 0)
|
||||
+ dev_err(&mc_dev->dev, "dprc_close() failed: %d\n", error);
|
||||
+
|
||||
if (!fsl_mc_is_root_dprc(&mc_dev->dev)) {
|
||||
fsl_destroy_mc_io(mc_dev->mc_io);
|
||||
mc_dev->mc_io = NULL;
|
@ -0,0 +1,48 @@
|
||||
From f5f9462cb947922817225b69240740e637de0149 Mon Sep 17 00:00:00 2001
|
||||
From: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Date: Wed, 22 Jun 2016 16:40:51 -0500
|
||||
Subject: [PATCH 188/226] staging: fsl-mc: properly set hwirq in msi set_desc
|
||||
|
||||
For an MSI domain the hwirq is an arbitrary but unique
|
||||
id to identify an interrupt. Previously the hwirq was set to
|
||||
the MSI index of the interrupt, but that only works if there is
|
||||
one DPRC. Additional DPRCs require an expanded namespace. Use
|
||||
both the ICID (which is unique per DPRC) and the MSI index to
|
||||
compose a hwirq value.
|
||||
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/mc-msi.c | 17 ++++++++++++++++-
|
||||
1 file changed, 16 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/mc-msi.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/mc-msi.c
|
||||
@@ -20,11 +20,26 @@
|
||||
#include "../include/mc-sys.h"
|
||||
#include "dprc-cmd.h"
|
||||
|
||||
+/*
|
||||
+ * Generate a unique ID identifying the interrupt (only used within the MSI
|
||||
+ * irqdomain. Combine the icid with the interrupt index.
|
||||
+ */
|
||||
+static irq_hw_number_t fsl_mc_domain_calc_hwirq(struct fsl_mc_device *dev,
|
||||
+ struct msi_desc *desc)
|
||||
+{
|
||||
+ /*
|
||||
+ * Make the base hwirq value for ICID*10000 so it is readable
|
||||
+ * as a decimal value in /proc/interrupts.
|
||||
+ */
|
||||
+ return (irq_hw_number_t)(desc->fsl_mc.msi_index + (dev->icid * 10000));
|
||||
+}
|
||||
+
|
||||
static void fsl_mc_msi_set_desc(msi_alloc_info_t *arg,
|
||||
struct msi_desc *desc)
|
||||
{
|
||||
arg->desc = desc;
|
||||
- arg->hwirq = (irq_hw_number_t)desc->fsl_mc.msi_index;
|
||||
+ arg->hwirq = fsl_mc_domain_calc_hwirq(to_fsl_mc_device(desc->dev),
|
||||
+ desc);
|
||||
}
|
||||
|
||||
static void fsl_mc_msi_update_dom_ops(struct msi_domain_info *info)
|
@ -0,0 +1,964 @@
|
||||
From 95c8565453e068db2664b5ee9cb0b7eced9a8d24 Mon Sep 17 00:00:00 2001
|
||||
From: Ioana Radulescu <ruxandra.radulescu@freescale.com>
|
||||
Date: Fri, 3 Jul 2015 19:02:45 +0300
|
||||
Subject: [PATCH 189/226] staging: fsl-mc: update dpcon binary interface to
|
||||
v2.2
|
||||
|
||||
-this includes adding the command building/parsing
|
||||
wrapper functions
|
||||
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@freescale.com>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/Makefile | 3 +-
|
||||
drivers/staging/fsl-mc/bus/dpcon.c | 407 ++++++++++++++++++++++++++++
|
||||
drivers/staging/fsl-mc/include/dpcon-cmd.h | 102 ++++++-
|
||||
drivers/staging/fsl-mc/include/dpcon.h | 407 ++++++++++++++++++++++++++++
|
||||
4 files changed, 917 insertions(+), 2 deletions(-)
|
||||
create mode 100644 drivers/staging/fsl-mc/bus/dpcon.c
|
||||
create mode 100644 drivers/staging/fsl-mc/include/dpcon.h
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/Makefile
|
||||
+++ b/drivers/staging/fsl-mc/bus/Makefile
|
||||
@@ -16,4 +16,5 @@ mc-bus-driver-objs := mc-bus.o \
|
||||
mc-msi.o \
|
||||
irq-gic-v3-its-fsl-mc-msi.o \
|
||||
dpmcp.o \
|
||||
- dpbp.o
|
||||
+ dpbp.o \
|
||||
+ dpcon.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/staging/fsl-mc/bus/dpcon.c
|
||||
@@ -0,0 +1,407 @@
|
||||
+/* Copyright 2013-2015 Freescale Semiconductor Inc.
|
||||
+ *
|
||||
+ * Redistribution and use in source and binary forms, with or without
|
||||
+ * modification, are permitted provided that the following conditions are met:
|
||||
+ * * Redistributions of source code must retain the above copyright
|
||||
+ * notice, this list of conditions and the following disclaimer.
|
||||
+ * * Redistributions in binary form must reproduce the above copyright
|
||||
+ * notice, this list of conditions and the following disclaimer in the
|
||||
+ * documentation and/or other materials provided with the distribution.
|
||||
+ * * Neither the name of the above-listed copyright holders nor the
|
||||
+ * names of any contributors may be used to endorse or promote products
|
||||
+ * derived from this software without specific prior written permission.
|
||||
+ *
|
||||
+ *
|
||||
+ * ALTERNATIVELY, this software may be distributed under the terms of the
|
||||
+ * GNU General Public License ("GPL") as published by the Free Software
|
||||
+ * Foundation, either version 2 of that License or (at your option) any
|
||||
+ * later version.
|
||||
+ *
|
||||
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
|
||||
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
+ * POSSIBILITY OF SUCH DAMAGE.
|
||||
+ */
|
||||
+#include "../include/mc-sys.h"
|
||||
+#include "../include/mc-cmd.h"
|
||||
+#include "../include/dpcon.h"
|
||||
+#include "../include/dpcon-cmd.h"
|
||||
+
|
||||
+int dpcon_open(struct fsl_mc_io *mc_io,
|
||||
+ uint32_t cmd_flags,
|
||||
+ int dpcon_id,
|
||||
+ uint16_t *token)
|
||||
+{
|
||||
+ struct mc_command cmd = { 0 };
|
||||
+ int err;
|
||||
+
|
||||
+ /* prepare command */
|
||||
+ cmd.header = mc_encode_cmd_header(DPCON_CMDID_OPEN,
|
||||
+ cmd_flags,
|
||||
+ 0);
|
||||
+ DPCON_CMD_OPEN(cmd, dpcon_id);
|
||||
+
|
||||
+ /* send command to mc*/
|
||||
+ err = mc_send_command(mc_io, &cmd);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+
|
||||
+ /* retrieve response parameters */
|
||||
+ *token = MC_CMD_HDR_READ_TOKEN(cmd.header);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+EXPORT_SYMBOL(dpcon_open);
|
||||
+
|
||||
+int dpcon_close(struct fsl_mc_io *mc_io,
|
||||
+ uint32_t cmd_flags,
|
||||
+ uint16_t token)
|
||||
+{
|
||||
+ struct mc_command cmd = { 0 };
|
||||
+
|
||||
+ /* prepare command */
|
||||
+ cmd.header = mc_encode_cmd_header(DPCON_CMDID_CLOSE,
|
||||
+ cmd_flags,
|
||||
+ token);
|
||||
+
|
||||
+ /* send command to mc*/
|
||||
+ return mc_send_command(mc_io, &cmd);
|
||||
+}
|
||||
+EXPORT_SYMBOL(dpcon_close);
|
||||
+
|
||||
+int dpcon_create(struct fsl_mc_io *mc_io,
|
||||
+ uint32_t cmd_flags,
|
||||
+ const struct dpcon_cfg *cfg,
|
||||
+ uint16_t *token)
|
||||
+{
|
||||
+ struct mc_command cmd = { 0 };
|
||||
+ int err;
|
||||
+
|
||||
+ /* prepare command */
|
||||
+ cmd.header = mc_encode_cmd_header(DPCON_CMDID_CREATE,
|
||||
+ cmd_flags,
|
||||
+ 0);
|
||||
+ DPCON_CMD_CREATE(cmd, cfg);
|
||||
+
|
||||
+ /* send command to mc*/
|
||||
+ err = mc_send_command(mc_io, &cmd);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+
|
||||
+ /* retrieve response parameters */
|
||||
+ *token = MC_CMD_HDR_READ_TOKEN(cmd.header);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+int dpcon_destroy(struct fsl_mc_io *mc_io,
|
||||
+ uint32_t cmd_flags,
|
||||
+ uint16_t token)
|
||||
+{
|
||||
+ struct mc_command cmd = { 0 };
|
||||
+
|
||||
+ /* prepare command */
|
||||
+ cmd.header = mc_encode_cmd_header(DPCON_CMDID_DESTROY,
|
||||
+ cmd_flags,
|
||||
+ token);
|
||||
+
|
||||
+ /* send command to mc*/
|
||||
+ return mc_send_command(mc_io, &cmd);
|
||||
+}
|
||||
+
|
||||
+int dpcon_enable(struct fsl_mc_io *mc_io,
|
||||
+ uint32_t cmd_flags,
|
||||
+ uint16_t token)
|
||||
+{
|
||||
+ struct mc_command cmd = { 0 };
|
||||
+
|
||||
+ /* prepare command */
|
||||
+ cmd.header = mc_encode_cmd_header(DPCON_CMDID_ENABLE,
|
||||
+ cmd_flags,
|
||||
+ token);
|
||||
+
|
||||
+ /* send command to mc*/
|
||||
+ return mc_send_command(mc_io, &cmd);
|
||||
+}
|
||||
+EXPORT_SYMBOL(dpcon_enable);
|
||||
+
|
||||
+int dpcon_disable(struct fsl_mc_io *mc_io,
|
||||
+ uint32_t cmd_flags,
|
||||
+ uint16_t token)
|
||||
+{
|
||||
+ struct mc_command cmd = { 0 };
|
||||
+
|
||||
+ /* prepare command */
|
||||
+ cmd.header = mc_encode_cmd_header(DPCON_CMDID_DISABLE,
|
||||
+ cmd_flags,
|
||||
+ token);
|
||||
+
|
||||
+ /* send command to mc*/
|
||||
+ return mc_send_command(mc_io, &cmd);
|
||||
+}
|
||||
+EXPORT_SYMBOL(dpcon_disable);
|
||||
+
|
||||
+int dpcon_is_enabled(struct fsl_mc_io *mc_io,
|
||||
+ uint32_t cmd_flags,
|
||||
+ uint16_t token,
|
||||
+ int *en)
|
||||
+{
|
||||
+ struct mc_command cmd = { 0 };
|
||||
+ int err;
|
||||
+ /* prepare command */
|
||||
+ cmd.header = mc_encode_cmd_header(DPCON_CMDID_IS_ENABLED,
|
||||
+ cmd_flags,
|
||||
+ token);
|
||||
+
|
||||
+ /* send command to mc*/
|
||||
+ err = mc_send_command(mc_io, &cmd);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+
|
||||
+ /* retrieve response parameters */
|
||||
+ DPCON_RSP_IS_ENABLED(cmd, *en);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+int dpcon_reset(struct fsl_mc_io *mc_io,
|
||||
+ uint32_t cmd_flags,
|
||||
+ uint16_t token)
|
||||
+{
|
||||
+ struct mc_command cmd = { 0 };
|
||||
+
|
||||
+ /* prepare command */
|
||||
+ cmd.header = mc_encode_cmd_header(DPCON_CMDID_RESET,
|
||||
+ cmd_flags, token);
|
||||
+
|
||||
+ /* send command to mc*/
|
||||
+ return mc_send_command(mc_io, &cmd);
|
||||
+}
|
||||
+
|
||||
+int dpcon_set_irq(struct fsl_mc_io *mc_io,
|
||||
+ uint32_t cmd_flags,
|
||||
+ uint16_t token,
|
||||
+ uint8_t irq_index,
|
||||
+ struct dpcon_irq_cfg *irq_cfg)
|
||||
+{
|
||||
+ struct mc_command cmd = { 0 };
|
||||
+
|
||||
+ /* prepare command */
|
||||
+ cmd.header = mc_encode_cmd_header(DPCON_CMDID_SET_IRQ,
|
||||
+ cmd_flags,
|
||||
+ token);
|
||||
+ DPCON_CMD_SET_IRQ(cmd, irq_index, irq_cfg);
|
||||
+
|
||||
+ /* send command to mc*/
|
||||
+ return mc_send_command(mc_io, &cmd);
|
||||
+}
|
||||
+
|
||||
+int dpcon_get_irq(struct fsl_mc_io *mc_io,
|
||||
+ uint32_t cmd_flags,
|
||||
+ uint16_t token,
|
||||
+ uint8_t irq_index,
|
||||
+ int *type,
|
||||
+ struct dpcon_irq_cfg *irq_cfg)
|
||||
+{
|
||||
+ struct mc_command cmd = { 0 };
|
||||
+ int err;
|
||||
+
|
||||
+ /* prepare command */
|
||||
+ cmd.header = mc_encode_cmd_header(DPCON_CMDID_GET_IRQ,
|
||||
+ cmd_flags,
|
||||
+ token);
|
||||
+ DPCON_CMD_GET_IRQ(cmd, irq_index);
|
||||
+
|
||||
+ /* send command to mc*/
|
||||
+ err = mc_send_command(mc_io, &cmd);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+
|
||||
+ /* retrieve response parameters */
|
||||
+ DPCON_RSP_GET_IRQ(cmd, *type, irq_cfg);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+int dpcon_set_irq_enable(struct fsl_mc_io *mc_io,
|
||||
+ uint32_t cmd_flags,
|
||||
+ uint16_t token,
|
||||
+ uint8_t irq_index,
|
||||
+ uint8_t en)
|
||||
+{
|
||||
+ struct mc_command cmd = { 0 };
|
||||
+
|
||||
+ /* prepare command */
|
||||
+ cmd.header = mc_encode_cmd_header(DPCON_CMDID_SET_IRQ_ENABLE,
|
||||
+ cmd_flags,
|
||||
+ token);
|
||||
+ DPCON_CMD_SET_IRQ_ENABLE(cmd, irq_index, en);
|
||||
+
|
||||
+ /* send command to mc*/
|
||||
+ return mc_send_command(mc_io, &cmd);
|
||||
+}
|
||||
+
|
||||
+int dpcon_get_irq_enable(struct fsl_mc_io *mc_io,
|
||||
+ uint32_t cmd_flags,
|
||||
+ uint16_t token,
|
||||
+ uint8_t irq_index,
|
||||
+ uint8_t *en)
|
||||
+{
|
||||
+ struct mc_command cmd = { 0 };
|
||||
+ int err;
|
||||
+
|
||||
+ /* prepare command */
|
||||
+ cmd.header = mc_encode_cmd_header(DPCON_CMDID_GET_IRQ_ENABLE,
|
||||
+ cmd_flags,
|
||||
+ token);
|
||||
+ DPCON_CMD_GET_IRQ_ENABLE(cmd, irq_index);
|
||||
+
|
||||
+ /* send command to mc*/
|
||||
+ err = mc_send_command(mc_io, &cmd);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+
|
||||
+ /* retrieve response parameters */
|
||||
+ DPCON_RSP_GET_IRQ_ENABLE(cmd, *en);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+int dpcon_set_irq_mask(struct fsl_mc_io *mc_io,
|
||||
+ uint32_t cmd_flags,
|
||||
+ uint16_t token,
|
||||
+ uint8_t irq_index,
|
||||
+ uint32_t mask)
|
||||
+{
|
||||
+ struct mc_command cmd = { 0 };
|
||||
+
|
||||
+ /* prepare command */
|
||||
+ cmd.header = mc_encode_cmd_header(DPCON_CMDID_SET_IRQ_MASK,
|
||||
+ cmd_flags,
|
||||
+ token);
|
||||
+ DPCON_CMD_SET_IRQ_MASK(cmd, irq_index, mask);
|
||||
+
|
||||
+ /* send command to mc*/
|
||||
+ return mc_send_command(mc_io, &cmd);
|
||||
+}
|
||||
+
|
||||
+int dpcon_get_irq_mask(struct fsl_mc_io *mc_io,
|
||||
+ uint32_t cmd_flags,
|
||||
+ uint16_t token,
|
||||
+ uint8_t irq_index,
|
||||
+ uint32_t *mask)
|
||||
+{
|
||||
+ struct mc_command cmd = { 0 };
|
||||
+ int err;
|
||||
+
|
||||
+ /* prepare command */
|
||||
+ cmd.header = mc_encode_cmd_header(DPCON_CMDID_GET_IRQ_MASK,
|
||||
+ cmd_flags,
|
||||
+ token);
|
||||
+ DPCON_CMD_GET_IRQ_MASK(cmd, irq_index);
|
||||
+
|
||||
+ /* send command to mc*/
|
||||
+ err = mc_send_command(mc_io, &cmd);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+
|
||||
+ /* retrieve response parameters */
|
||||
+ DPCON_RSP_GET_IRQ_MASK(cmd, *mask);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+int dpcon_get_irq_status(struct fsl_mc_io *mc_io,
|
||||
+ uint32_t cmd_flags,
|
||||
+ uint16_t token,
|
||||
+ uint8_t irq_index,
|
||||
+ uint32_t *status)
|
||||
+{
|
||||
+ struct mc_command cmd = { 0 };
|
||||
+ int err;
|
||||
+
|
||||
+ /* prepare command */
|
||||
+ cmd.header = mc_encode_cmd_header(DPCON_CMDID_GET_IRQ_STATUS,
|
||||
+ cmd_flags,
|
||||
+ token);
|
||||
+ DPCON_CMD_GET_IRQ_STATUS(cmd, irq_index, *status);
|
||||
+
|
||||
+ /* send command to mc*/
|
||||
+ err = mc_send_command(mc_io, &cmd);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+
|
||||
+ /* retrieve response parameters */
|
||||
+ DPCON_RSP_GET_IRQ_STATUS(cmd, *status);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+int dpcon_clear_irq_status(struct fsl_mc_io *mc_io,
|
||||
+ uint32_t cmd_flags,
|
||||
+ uint16_t token,
|
||||
+ uint8_t irq_index,
|
||||
+ uint32_t status)
|
||||
+{
|
||||
+ struct mc_command cmd = { 0 };
|
||||
+
|
||||
+ /* prepare command */
|
||||
+ cmd.header = mc_encode_cmd_header(DPCON_CMDID_CLEAR_IRQ_STATUS,
|
||||
+ cmd_flags,
|
||||
+ token);
|
||||
+ DPCON_CMD_CLEAR_IRQ_STATUS(cmd, irq_index, status);
|
||||
+
|
||||
+ /* send command to mc*/
|
||||
+ return mc_send_command(mc_io, &cmd);
|
||||
+}
|
||||
+
|
||||
+int dpcon_get_attributes(struct fsl_mc_io *mc_io,
|
||||
+ uint32_t cmd_flags,
|
||||
+ uint16_t token,
|
||||
+ struct dpcon_attr *attr)
|
||||
+{
|
||||
+ struct mc_command cmd = { 0 };
|
||||
+ int err;
|
||||
+
|
||||
+ /* prepare command */
|
||||
+ cmd.header = mc_encode_cmd_header(DPCON_CMDID_GET_ATTR,
|
||||
+ cmd_flags,
|
||||
+ token);
|
||||
+
|
||||
+ /* send command to mc*/
|
||||
+ err = mc_send_command(mc_io, &cmd);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+
|
||||
+ /* retrieve response parameters */
|
||||
+ DPCON_RSP_GET_ATTR(cmd, attr);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+EXPORT_SYMBOL(dpcon_get_attributes);
|
||||
+
|
||||
+int dpcon_set_notification(struct fsl_mc_io *mc_io,
|
||||
+ uint32_t cmd_flags,
|
||||
+ uint16_t token,
|
||||
+ struct dpcon_notification_cfg *cfg)
|
||||
+{
|
||||
+ struct mc_command cmd = { 0 };
|
||||
+
|
||||
+ /* prepare command */
|
||||
+ cmd.header = mc_encode_cmd_header(DPCON_CMDID_SET_NOTIFICATION,
|
||||
+ cmd_flags,
|
||||
+ token);
|
||||
+ DPCON_CMD_SET_NOTIFICATION(cmd, cfg);
|
||||
+
|
||||
+ /* send command to mc*/
|
||||
+ return mc_send_command(mc_io, &cmd);
|
||||
+}
|
||||
+EXPORT_SYMBOL(dpcon_set_notification);
|
||||
+
|
||||
--- a/drivers/staging/fsl-mc/include/dpcon-cmd.h
|
||||
+++ b/drivers/staging/fsl-mc/include/dpcon-cmd.h
|
||||
@@ -34,7 +34,7 @@
|
||||
|
||||
/* DPCON Version */
|
||||
#define DPCON_VER_MAJOR 2
|
||||
-#define DPCON_VER_MINOR 1
|
||||
+#define DPCON_VER_MINOR 2
|
||||
|
||||
/* Command IDs */
|
||||
#define DPCON_CMDID_CLOSE 0x800
|
||||
@@ -59,4 +59,104 @@
|
||||
|
||||
#define DPCON_CMDID_SET_NOTIFICATION 0x100
|
||||
|
||||
+/* cmd, param, offset, width, type, arg_name */
|
||||
+#define DPCON_CMD_OPEN(cmd, dpcon_id) \
|
||||
+ MC_CMD_OP(cmd, 0, 0, 32, int, dpcon_id)
|
||||
+
|
||||
+/* cmd, param, offset, width, type, arg_name */
|
||||
+#define DPCON_CMD_CREATE(cmd, cfg) \
|
||||
+ MC_CMD_OP(cmd, 0, 0, 8, uint8_t, cfg->num_priorities)
|
||||
+
|
||||
+/* cmd, param, offset, width, type, arg_name */
|
||||
+#define DPCON_RSP_IS_ENABLED(cmd, en) \
|
||||
+ MC_RSP_OP(cmd, 0, 0, 1, int, en)
|
||||
+
|
||||
+/* cmd, param, offset, width, type, arg_name */
|
||||
+#define DPCON_CMD_SET_IRQ(cmd, irq_index, irq_cfg) \
|
||||
+do { \
|
||||
+ MC_CMD_OP(cmd, 0, 0, 8, uint8_t, irq_index);\
|
||||
+ MC_CMD_OP(cmd, 0, 32, 32, uint32_t, irq_cfg->val);\
|
||||
+ MC_CMD_OP(cmd, 1, 0, 64, uint64_t, irq_cfg->addr);\
|
||||
+ MC_CMD_OP(cmd, 2, 0, 32, int, irq_cfg->irq_num); \
|
||||
+} while (0)
|
||||
+
|
||||
+/* cmd, param, offset, width, type, arg_name */
|
||||
+#define DPCON_CMD_GET_IRQ(cmd, irq_index) \
|
||||
+ MC_CMD_OP(cmd, 0, 32, 8, uint8_t, irq_index)
|
||||
+
|
||||
+/* cmd, param, offset, width, type, arg_name */
|
||||
+#define DPCON_RSP_GET_IRQ(cmd, type, irq_cfg) \
|
||||
+do { \
|
||||
+ MC_RSP_OP(cmd, 0, 0, 32, uint32_t, irq_cfg->val);\
|
||||
+ MC_RSP_OP(cmd, 1, 0, 64, uint64_t, irq_cfg->addr);\
|
||||
+ MC_RSP_OP(cmd, 2, 0, 32, int, irq_cfg->irq_num); \
|
||||
+ MC_RSP_OP(cmd, 2, 32, 32, int, type);\
|
||||
+} while (0)
|
||||
+
|
||||
+/* cmd, param, offset, width, type, arg_name */
|
||||
+#define DPCON_CMD_SET_IRQ_ENABLE(cmd, irq_index, en) \
|
||||
+do { \
|
||||
+ MC_CMD_OP(cmd, 0, 0, 8, uint8_t, en); \
|
||||
+ MC_CMD_OP(cmd, 0, 32, 8, uint8_t, irq_index);\
|
||||
+} while (0)
|
||||
+
|
||||
+/* cmd, param, offset, width, type, arg_name */
|
||||
+#define DPCON_CMD_GET_IRQ_ENABLE(cmd, irq_index) \
|
||||
+ MC_CMD_OP(cmd, 0, 32, 8, uint8_t, irq_index)
|
||||
+
|
||||
+/* cmd, param, offset, width, type, arg_name */
|
||||
+#define DPCON_RSP_GET_IRQ_ENABLE(cmd, en) \
|
||||
+ MC_RSP_OP(cmd, 0, 0, 8, uint8_t, en)
|
||||
+
|
||||
+/* cmd, param, offset, width, type, arg_name */
|
||||
+#define DPCON_CMD_SET_IRQ_MASK(cmd, irq_index, mask) \
|
||||
+do { \
|
||||
+ MC_CMD_OP(cmd, 0, 0, 32, uint32_t, mask); \
|
||||
+ MC_CMD_OP(cmd, 0, 32, 8, uint8_t, irq_index);\
|
||||
+} while (0)
|
||||
+
|
||||
+/* cmd, param, offset, width, type, arg_name */
|
||||
+#define DPCON_CMD_GET_IRQ_MASK(cmd, irq_index) \
|
||||
+ MC_CMD_OP(cmd, 0, 32, 8, uint8_t, irq_index)
|
||||
+
|
||||
+/* cmd, param, offset, width, type, arg_name */
|
||||
+#define DPCON_RSP_GET_IRQ_MASK(cmd, mask) \
|
||||
+ MC_RSP_OP(cmd, 0, 0, 32, uint32_t, mask)
|
||||
+
|
||||
+/* cmd, param, offset, width, type, arg_name */
|
||||
+#define DPCON_CMD_GET_IRQ_STATUS(cmd, irq_index, status) \
|
||||
+do { \
|
||||
+ MC_CMD_OP(cmd, 0, 0, 32, uint32_t, status);\
|
||||
+ MC_CMD_OP(cmd, 0, 32, 8, uint8_t, irq_index);\
|
||||
+} while (0)
|
||||
+
|
||||
+/* cmd, param, offset, width, type, arg_name */
|
||||
+#define DPCON_RSP_GET_IRQ_STATUS(cmd, status) \
|
||||
+ MC_RSP_OP(cmd, 0, 0, 32, uint32_t, status)
|
||||
+
|
||||
+/* cmd, param, offset, width, type, arg_name */
|
||||
+#define DPCON_CMD_CLEAR_IRQ_STATUS(cmd, irq_index, status) \
|
||||
+do { \
|
||||
+ MC_CMD_OP(cmd, 0, 0, 32, uint32_t, status); \
|
||||
+ MC_CMD_OP(cmd, 0, 32, 8, uint8_t, irq_index);\
|
||||
+} while (0)
|
||||
+
|
||||
+/* cmd, param, offset, width, type, arg_name */
|
||||
+#define DPCON_RSP_GET_ATTR(cmd, attr) \
|
||||
+do { \
|
||||
+ MC_RSP_OP(cmd, 0, 0, 32, int, attr->id);\
|
||||
+ MC_RSP_OP(cmd, 0, 32, 16, uint16_t, attr->qbman_ch_id);\
|
||||
+ MC_RSP_OP(cmd, 0, 48, 8, uint8_t, attr->num_priorities);\
|
||||
+ MC_RSP_OP(cmd, 1, 0, 16, uint16_t, attr->version.major);\
|
||||
+ MC_RSP_OP(cmd, 1, 16, 16, uint16_t, attr->version.minor);\
|
||||
+} while (0)
|
||||
+
|
||||
+/* cmd, param, offset, width, type, arg_name */
|
||||
+#define DPCON_CMD_SET_NOTIFICATION(cmd, cfg) \
|
||||
+do { \
|
||||
+ MC_CMD_OP(cmd, 0, 0, 32, int, cfg->dpio_id);\
|
||||
+ MC_CMD_OP(cmd, 0, 32, 8, uint8_t, cfg->priority);\
|
||||
+ MC_CMD_OP(cmd, 1, 0, 64, uint64_t, cfg->user_ctx);\
|
||||
+} while (0)
|
||||
+
|
||||
#endif /* _FSL_DPCON_CMD_H */
|
||||
--- /dev/null
|
||||
+++ b/drivers/staging/fsl-mc/include/dpcon.h
|
||||
@@ -0,0 +1,407 @@
|
||||
+/* Copyright 2013-2015 Freescale Semiconductor Inc.
|
||||
+ *
|
||||
+ * Redistribution and use in source and binary forms, with or without
|
||||
+ * modification, are permitted provided that the following conditions are met:
|
||||
+ * * Redistributions of source code must retain the above copyright
|
||||
+ * notice, this list of conditions and the following disclaimer.
|
||||
+ * * Redistributions in binary form must reproduce the above copyright
|
||||
+ * notice, this list of conditions and the following disclaimer in the
|
||||
+ * documentation and/or other materials provided with the distribution.
|
||||
+ * * Neither the name of the above-listed copyright holders nor the
|
||||
+ * names of any contributors may be used to endorse or promote products
|
||||
+ * derived from this software without specific prior written permission.
|
||||
+ *
|
||||
+ *
|
||||
+ * ALTERNATIVELY, this software may be distributed under the terms of the
|
||||
+ * GNU General Public License ("GPL") as published by the Free Software
|
||||
+ * Foundation, either version 2 of that License or (at your option) any
|
||||
+ * later version.
|
||||
+ *
|
||||
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
|
||||
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
+ * POSSIBILITY OF SUCH DAMAGE.
|
||||
+ */
|
||||
+#ifndef __FSL_DPCON_H
|
||||
+#define __FSL_DPCON_H
|
||||
+
|
||||
+/* Data Path Concentrator API
|
||||
+ * Contains initialization APIs and runtime control APIs for DPCON
|
||||
+ */
|
||||
+
|
||||
+struct fsl_mc_io;
|
||||
+
|
||||
+/** General DPCON macros */
|
||||
+
|
||||
+/**
|
||||
+ * Use it to disable notifications; see dpcon_set_notification()
|
||||
+ */
|
||||
+#define DPCON_INVALID_DPIO_ID (int)(-1)
|
||||
+
|
||||
+/**
|
||||
+ * dpcon_open() - Open a control session for the specified object
|
||||
+ * @mc_io: Pointer to MC portal's I/O object
|
||||
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
|
||||
+ * @dpcon_id: DPCON unique ID
|
||||
+ * @token: Returned token; use in subsequent API calls
|
||||
+ *
|
||||
+ * This function can be used to open a control session for an
|
||||
+ * already created object; an object may have been declared in
|
||||
+ * the DPL or by calling the dpcon_create() function.
|
||||
+ * This function returns a unique authentication token,
|
||||
+ * associated with the specific object ID and the specific MC
|
||||
+ * portal; this token must be used in all subsequent commands for
|
||||
+ * this specific object.
|
||||
+ *
|
||||
+ * Return: '0' on Success; Error code otherwise.
|
||||
+ */
|
||||
+int dpcon_open(struct fsl_mc_io *mc_io,
|
||||
+ uint32_t cmd_flags,
|
||||
+ int dpcon_id,
|
||||
+ uint16_t *token);
|
||||
+
|
||||
+/**
|
||||
+ * dpcon_close() - Close the control session of the object
|
||||
+ * @mc_io: Pointer to MC portal's I/O object
|
||||
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
|
||||
+ * @token: Token of DPCON object
|
||||
+ *
|
||||
+ * After this function is called, no further operations are
|
||||
+ * allowed on the object without opening a new control session.
|
||||
+ *
|
||||
+ * Return: '0' on Success; Error code otherwise.
|
||||
+ */
|
||||
+int dpcon_close(struct fsl_mc_io *mc_io,
|
||||
+ uint32_t cmd_flags,
|
||||
+ uint16_t token);
|
||||
+
|
||||
+/**
|
||||
+ * struct dpcon_cfg - Structure representing DPCON configuration
|
||||
+ * @num_priorities: Number of priorities for the DPCON channel (1-8)
|
||||
+ */
|
||||
+struct dpcon_cfg {
|
||||
+ uint8_t num_priorities;
|
||||
+};
|
||||
+
|
||||
+/**
|
||||
+ * dpcon_create() - Create the DPCON object.
|
||||
+ * @mc_io: Pointer to MC portal's I/O object
|
||||
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
|
||||
+ * @cfg: Configuration structure
|
||||
+ * @token: Returned token; use in subsequent API calls
|
||||
+ *
|
||||
+ * Create the DPCON object, allocate required resources and
|
||||
+ * perform required initialization.
|
||||
+ *
|
||||
+ * The object can be created either by declaring it in the
|
||||
+ * DPL file, or by calling this function.
|
||||
+ *
|
||||
+ * This function returns a unique authentication token,
|
||||
+ * associated with the specific object ID and the specific MC
|
||||
+ * portal; this token must be used in all subsequent calls to
|
||||
+ * this specific object. For objects that are created using the
|
||||
+ * DPL file, call dpcon_open() function to get an authentication
|
||||
+ * token first.
|
||||
+ *
|
||||
+ * Return: '0' on Success; Error code otherwise.
|
||||
+ */
|
||||
+int dpcon_create(struct fsl_mc_io *mc_io,
|
||||
+ uint32_t cmd_flags,
|
||||
+ const struct dpcon_cfg *cfg,
|
||||
+ uint16_t *token);
|
||||
+
|
||||
+/**
|
||||
+ * dpcon_destroy() - Destroy the DPCON object and release all its resources.
|
||||
+ * @mc_io: Pointer to MC portal's I/O object
|
||||
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
|
||||
+ * @token: Token of DPCON object
|
||||
+ *
|
||||
+ * Return: '0' on Success; error code otherwise.
|
||||
+ */
|
||||
+int dpcon_destroy(struct fsl_mc_io *mc_io,
|
||||
+ uint32_t cmd_flags,
|
||||
+ uint16_t token);
|
||||
+
|
||||
+/**
|
||||
+ * dpcon_enable() - Enable the DPCON
|
||||
+ * @mc_io: Pointer to MC portal's I/O object
|
||||
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
|
||||
+ * @token: Token of DPCON object
|
||||
+ *
|
||||
+ * Return: '0' on Success; Error code otherwise
|
||||
+ */
|
||||
+int dpcon_enable(struct fsl_mc_io *mc_io,
|
||||
+ uint32_t cmd_flags,
|
||||
+ uint16_t token);
|
||||
+
|
||||
+/**
|
||||
+ * dpcon_disable() - Disable the DPCON
|
||||
+ * @mc_io: Pointer to MC portal's I/O object
|
||||
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
|
||||
+ * @token: Token of DPCON object
|
||||
+ *
|
||||
+ * Return: '0' on Success; Error code otherwise
|
||||
+ */
|
||||
+int dpcon_disable(struct fsl_mc_io *mc_io,
|
||||
+ uint32_t cmd_flags,
|
||||
+ uint16_t token);
|
||||
+
|
||||
+/**
|
||||
+ * dpcon_is_enabled() - Check if the DPCON is enabled.
|
||||
+ * @mc_io: Pointer to MC portal's I/O object
|
||||
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
|
||||
+ * @token: Token of DPCON object
|
||||
+ * @en: Returns '1' if object is enabled; '0' otherwise
|
||||
+ *
|
||||
+ * Return: '0' on Success; Error code otherwise.
|
||||
+ */
|
||||
+int dpcon_is_enabled(struct fsl_mc_io *mc_io,
|
||||
+ uint32_t cmd_flags,
|
||||
+ uint16_t token,
|
||||
+ int *en);
|
||||
+
|
||||
+/**
|
||||
+ * dpcon_reset() - Reset the DPCON, returns the object to initial state.
|
||||
+ * @mc_io: Pointer to MC portal's I/O object
|
||||
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
|
||||
+ * @token: Token of DPCON object
|
||||
+ *
|
||||
+ * Return: '0' on Success; Error code otherwise.
|
||||
+ */
|
||||
+int dpcon_reset(struct fsl_mc_io *mc_io,
|
||||
+ uint32_t cmd_flags,
|
||||
+ uint16_t token);
|
||||
+
|
||||
+/**
|
||||
+ * struct dpcon_irq_cfg - IRQ configuration
|
||||
+ * @addr: Address that must be written to signal a message-based interrupt
|
||||
+ * @val: Value to write into irq_addr address
|
||||
+ * @irq_num: A user defined number associated with this IRQ
|
||||
+ */
|
||||
+struct dpcon_irq_cfg {
|
||||
+ uint64_t addr;
|
||||
+ uint32_t val;
|
||||
+ int irq_num;
|
||||
+};
|
||||
+
|
||||
+/**
|
||||
+ * dpcon_set_irq() - Set IRQ information for the DPCON to trigger an interrupt.
|
||||
+ * @mc_io: Pointer to MC portal's I/O object
|
||||
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
|
||||
+ * @token: Token of DPCON object
|
||||
+ * @irq_index: Identifies the interrupt index to configure
|
||||
+ * @irq_cfg: IRQ configuration
|
||||
+ * Return: '0' on Success; Error code otherwise.
|
||||
+ */
|
||||
+int dpcon_set_irq(struct fsl_mc_io *mc_io,
|
||||
+ uint32_t cmd_flags,
|
||||
+ uint16_t token,
|
||||
+ uint8_t irq_index,
|
||||
+ struct dpcon_irq_cfg *irq_cfg);
|
||||
+
|
||||
+/**
|
||||
+ * dpcon_get_irq() - Get IRQ information from the DPCON.
|
||||
+ *
|
||||
+ * @mc_io: Pointer to MC portal's I/O object
|
||||
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
|
||||
+ * @token: Token of DPCON object
|
||||
+ * @irq_index: The interrupt index to configure
|
||||
+ * @type: Interrupt type: 0 represents message interrupt
|
||||
+ * type (both irq_addr and irq_val are valid)
|
||||
+ * @irq_cfg: IRQ attributes
|
||||
+ *
|
||||
+ * Return: '0' on Success; Error code otherwise.
|
||||
+ */
|
||||
+int dpcon_get_irq(struct fsl_mc_io *mc_io,
|
||||
+ uint32_t cmd_flags,
|
||||
+ uint16_t token,
|
||||
+ uint8_t irq_index,
|
||||
+ int *type,
|
||||
+ struct dpcon_irq_cfg *irq_cfg);
|
||||
+
|
||||
+/**
|
||||
+ * dpcon_set_irq_enable() - Set overall interrupt state.
|
||||
+ * @mc_io: Pointer to MC portal's I/O object
|
||||
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
|
||||
+ * @token: Token of DPCON object
|
||||
+ * @irq_index: The interrupt index to configure
|
||||
+ * @en: Interrupt state - enable = 1, disable = 0
|
||||
+ *
|
||||
+ * Allows GPP software to control when interrupts are generated.
|
||||
+ * Each interrupt can have up to 32 causes. The enable/disable control's the
|
||||
+ * overall interrupt state. if the interrupt is disabled no causes will cause
|
||||
+ * an interrupt.
|
||||
+ *
|
||||
+ * Return: '0' on Success; Error code otherwise.
|
||||
+ */
|
||||
+int dpcon_set_irq_enable(struct fsl_mc_io *mc_io,
|
||||
+ uint32_t cmd_flags,
|
||||
+ uint16_t token,
|
||||
+ uint8_t irq_index,
|
||||
+ uint8_t en);
|
||||
+
|
||||
+/**
|
||||
+ * dpcon_get_irq_enable() - Get overall interrupt state.
|
||||
+ * @mc_io: Pointer to MC portal's I/O object
|
||||
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
|
||||
+ * @token: Token of DPCON object
|
||||
+ * @irq_index: The interrupt index to configure
|
||||
+ * @en: Returned interrupt state - enable = 1, disable = 0
|
||||
+ *
|
||||
+ * Return: '0' on Success; Error code otherwise.
|
||||
+ */
|
||||
+int dpcon_get_irq_enable(struct fsl_mc_io *mc_io,
|
||||
+ uint32_t cmd_flags,
|
||||
+ uint16_t token,
|
||||
+ uint8_t irq_index,
|
||||
+ uint8_t *en);
|
||||
+
|
||||
+/**
|
||||
+ * dpcon_set_irq_mask() - Set interrupt mask.
|
||||
+ * @mc_io: Pointer to MC portal's I/O object
|
||||
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
|
||||
+ * @token: Token of DPCON object
|
||||
+ * @irq_index: The interrupt index to configure
|
||||
+ * @mask: Event mask to trigger interrupt;
|
||||
+ * each bit:
|
||||
+ * 0 = ignore event
|
||||
+ * 1 = consider event for asserting IRQ
|
||||
+ *
|
||||
+ * Every interrupt can have up to 32 causes and the interrupt model supports
|
||||
+ * masking/unmasking each cause independently
|
||||
+ *
|
||||
+ * Return: '0' on Success; Error code otherwise.
|
||||
+ */
|
||||
+int dpcon_set_irq_mask(struct fsl_mc_io *mc_io,
|
||||
+ uint32_t cmd_flags,
|
||||
+ uint16_t token,
|
||||
+ uint8_t irq_index,
|
||||
+ uint32_t mask);
|
||||
+
|
||||
+/**
|
||||
+ * dpcon_get_irq_mask() - Get interrupt mask.
|
||||
+ * @mc_io: Pointer to MC portal's I/O object
|
||||
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
|
||||
+ * @token: Token of DPCON object
|
||||
+ * @irq_index: The interrupt index to configure
|
||||
+ * @mask: Returned event mask to trigger interrupt
|
||||
+ *
|
||||
+ * Every interrupt can have up to 32 causes and the interrupt model supports
|
||||
+ * masking/unmasking each cause independently
|
||||
+ *
|
||||
+ * Return: '0' on Success; Error code otherwise.
|
||||
+ */
|
||||
+int dpcon_get_irq_mask(struct fsl_mc_io *mc_io,
|
||||
+ uint32_t cmd_flags,
|
||||
+ uint16_t token,
|
||||
+ uint8_t irq_index,
|
||||
+ uint32_t *mask);
|
||||
+
|
||||
+/**
|
||||
+ * dpcon_get_irq_status() - Get the current status of any pending interrupts.
|
||||
+ * @mc_io: Pointer to MC portal's I/O object
|
||||
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
|
||||
+ * @token: Token of DPCON object
|
||||
+ * @irq_index: The interrupt index to configure
|
||||
+ * @status: interrupts status - one bit per cause:
|
||||
+ * 0 = no interrupt pending
|
||||
+ * 1 = interrupt pending
|
||||
+ *
|
||||
+ * Return: '0' on Success; Error code otherwise.
|
||||
+ */
|
||||
+int dpcon_get_irq_status(struct fsl_mc_io *mc_io,
|
||||
+ uint32_t cmd_flags,
|
||||
+ uint16_t token,
|
||||
+ uint8_t irq_index,
|
||||
+ uint32_t *status);
|
||||
+
|
||||
+/**
|
||||
+ * dpcon_clear_irq_status() - Clear a pending interrupt's status
|
||||
+ * @mc_io: Pointer to MC portal's I/O object
|
||||
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
|
||||
+ * @token: Token of DPCON object
|
||||
+ * @irq_index: The interrupt index to configure
|
||||
+ * @status: bits to clear (W1C) - one bit per cause:
|
||||
+ * 0 = don't change
|
||||
+ * 1 = clear status bit
|
||||
+ *
|
||||
+ * Return: '0' on Success; Error code otherwise.
|
||||
+ */
|
||||
+int dpcon_clear_irq_status(struct fsl_mc_io *mc_io,
|
||||
+ uint32_t cmd_flags,
|
||||
+ uint16_t token,
|
||||
+ uint8_t irq_index,
|
||||
+ uint32_t status);
|
||||
+
|
||||
+/**
|
||||
+ * struct dpcon_attr - Structure representing DPCON attributes
|
||||
+ * @id: DPCON object ID
|
||||
+ * @version: DPCON version
|
||||
+ * @qbman_ch_id: Channel ID to be used by dequeue operation
|
||||
+ * @num_priorities: Number of priorities for the DPCON channel (1-8)
|
||||
+ */
|
||||
+struct dpcon_attr {
|
||||
+ int id;
|
||||
+ /**
|
||||
+ * struct version - DPCON version
|
||||
+ * @major: DPCON major version
|
||||
+ * @minor: DPCON minor version
|
||||
+ */
|
||||
+ struct {
|
||||
+ uint16_t major;
|
||||
+ uint16_t minor;
|
||||
+ } version;
|
||||
+ uint16_t qbman_ch_id;
|
||||
+ uint8_t num_priorities;
|
||||
+};
|
||||
+
|
||||
+/**
|
||||
+ * dpcon_get_attributes() - Retrieve DPCON attributes.
|
||||
+ * @mc_io: Pointer to MC portal's I/O object
|
||||
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
|
||||
+ * @token: Token of DPCON object
|
||||
+ * @attr: Object's attributes
|
||||
+ *
|
||||
+ * Return: '0' on Success; Error code otherwise.
|
||||
+ */
|
||||
+int dpcon_get_attributes(struct fsl_mc_io *mc_io,
|
||||
+ uint32_t cmd_flags,
|
||||
+ uint16_t token,
|
||||
+ struct dpcon_attr *attr);
|
||||
+
|
||||
+/**
|
||||
+ * struct dpcon_notification_cfg - Structure representing notification parameters
|
||||
+ * @dpio_id: DPIO object ID; must be configured with a notification channel;
|
||||
+ * to disable notifications set it to 'DPCON_INVALID_DPIO_ID';
|
||||
+ * @priority: Priority selection within the DPIO channel; valid values
|
||||
+ * are 0-7, depending on the number of priorities in that channel
|
||||
+ * @user_ctx: User context value provided with each CDAN message
|
||||
+ */
|
||||
+struct dpcon_notification_cfg {
|
||||
+ int dpio_id;
|
||||
+ uint8_t priority;
|
||||
+ uint64_t user_ctx;
|
||||
+};
|
||||
+
|
||||
+/**
|
||||
+ * dpcon_set_notification() - Set DPCON notification destination
|
||||
+ * @mc_io: Pointer to MC portal's I/O object
|
||||
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
|
||||
+ * @token: Token of DPCON object
|
||||
+ * @cfg: Notification parameters
|
||||
+ *
|
||||
+ * Return: '0' on Success; Error code otherwise
|
||||
+ */
|
||||
+int dpcon_set_notification(struct fsl_mc_io *mc_io,
|
||||
+ uint32_t cmd_flags,
|
||||
+ uint16_t token,
|
||||
+ struct dpcon_notification_cfg *cfg);
|
||||
+
|
||||
+#endif /* __FSL_DPCON_H */
|
@ -0,0 +1,59 @@
|
||||
From 75b607ff8725eac74f3375b3370f7d121d1827a3 Mon Sep 17 00:00:00 2001
|
||||
From: Lijun Pan <Lijun.Pan@freescale.com>
|
||||
Date: Mon, 8 Feb 2016 17:40:14 -0600
|
||||
Subject: [PATCH 190/226] staging: fsl-mc: root dprc rescan attribute to sync
|
||||
kernel with MC
|
||||
|
||||
Introduce the rescan attribute as a device attribute to
|
||||
synchronize the fsl-mc bus objects and the MC firmware.
|
||||
|
||||
To rescan the root dprc only, e.g.
|
||||
echo 1 > /sys/bus/fsl-mc/devices/dprc.1/rescan
|
||||
|
||||
Signed-off-by: Lijun Pan <Lijun.Pan@freescale.com>
|
||||
[Stuart: resolved merge conflict]
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/mc-bus.c | 29 +++++++++++++++++++++++++++++
|
||||
1 file changed, 29 insertions(+)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/mc-bus.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/mc-bus.c
|
||||
@@ -96,8 +96,37 @@ static ssize_t modalias_show(struct devi
|
||||
}
|
||||
static DEVICE_ATTR_RO(modalias);
|
||||
|
||||
+static ssize_t rescan_store(struct device *dev,
|
||||
+ struct device_attribute *attr,
|
||||
+ const char *buf, size_t count)
|
||||
+{
|
||||
+ unsigned long val;
|
||||
+ unsigned int irq_count;
|
||||
+ struct fsl_mc_device *root_mc_dev;
|
||||
+ struct fsl_mc_bus *root_mc_bus;
|
||||
+
|
||||
+ if (!fsl_mc_is_root_dprc(dev))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ root_mc_dev = to_fsl_mc_device(dev);
|
||||
+ root_mc_bus = to_fsl_mc_bus(root_mc_dev);
|
||||
+
|
||||
+ if (kstrtoul(buf, 0, &val) < 0)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ if (val) {
|
||||
+ mutex_lock(&root_mc_bus->scan_mutex);
|
||||
+ dprc_scan_objects(root_mc_dev, &irq_count);
|
||||
+ mutex_unlock(&root_mc_bus->scan_mutex);
|
||||
+ }
|
||||
+
|
||||
+ return count;
|
||||
+}
|
||||
+static DEVICE_ATTR_WO(rescan);
|
||||
+
|
||||
static struct attribute *fsl_mc_dev_attrs[] = {
|
||||
&dev_attr_modalias.attr,
|
||||
+ &dev_attr_rescan.attr,
|
||||
NULL,
|
||||
};
|
||||
|
@ -0,0 +1,78 @@
|
||||
From 417d71b1e291725c01893bf1553478924d05952f Mon Sep 17 00:00:00 2001
|
||||
From: Lijun Pan <Lijun.Pan@freescale.com>
|
||||
Date: Mon, 8 Feb 2016 17:40:16 -0600
|
||||
Subject: [PATCH 191/226] staging: fsl-mc: bus rescan attribute to sync kernel
|
||||
with MC
|
||||
|
||||
Introduce the rescan attribute as a bus attribute to
|
||||
synchronize the fsl-mc bus objects and the MC firmware.
|
||||
|
||||
To rescan the fsl-mc bus, e.g.,
|
||||
echo 1 > /sys/bus/fsl-mc/rescan
|
||||
|
||||
Signed-off-by: Lijun Pan <Lijun.Pan@freescale.com>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/mc-bus.c | 47 +++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 47 insertions(+)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/mc-bus.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/mc-bus.c
|
||||
@@ -139,11 +139,58 @@ static const struct attribute_group *fsl
|
||||
NULL,
|
||||
};
|
||||
|
||||
+static int scan_fsl_mc_bus(struct device *dev, void *data)
|
||||
+{
|
||||
+ unsigned int irq_count;
|
||||
+ struct fsl_mc_device *root_mc_dev;
|
||||
+ struct fsl_mc_bus *root_mc_bus;
|
||||
+
|
||||
+ if (fsl_mc_is_root_dprc(dev)) {
|
||||
+ root_mc_dev = to_fsl_mc_device(dev);
|
||||
+ root_mc_bus = to_fsl_mc_bus(root_mc_dev);
|
||||
+ mutex_lock(&root_mc_bus->scan_mutex);
|
||||
+ dprc_scan_objects(root_mc_dev, &irq_count);
|
||||
+ mutex_unlock(&root_mc_bus->scan_mutex);
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static ssize_t bus_rescan_store(struct bus_type *bus,
|
||||
+ const char *buf, size_t count)
|
||||
+{
|
||||
+ unsigned long val;
|
||||
+
|
||||
+ if (kstrtoul(buf, 0, &val) < 0)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ if (val)
|
||||
+ bus_for_each_dev(bus, NULL, NULL, scan_fsl_mc_bus);
|
||||
+
|
||||
+ return count;
|
||||
+}
|
||||
+static BUS_ATTR(rescan, (S_IWUSR | S_IWGRP), NULL, bus_rescan_store);
|
||||
+
|
||||
+static struct attribute *fsl_mc_bus_attrs[] = {
|
||||
+ &bus_attr_rescan.attr,
|
||||
+ NULL,
|
||||
+};
|
||||
+
|
||||
+static const struct attribute_group fsl_mc_bus_group = {
|
||||
+ .attrs = fsl_mc_bus_attrs,
|
||||
+};
|
||||
+
|
||||
+static const struct attribute_group *fsl_mc_bus_groups[] = {
|
||||
+ &fsl_mc_bus_group,
|
||||
+ NULL,
|
||||
+};
|
||||
+
|
||||
struct bus_type fsl_mc_bus_type = {
|
||||
.name = "fsl-mc",
|
||||
.match = fsl_mc_bus_match,
|
||||
.uevent = fsl_mc_bus_uevent,
|
||||
.dev_groups = fsl_mc_dev_groups,
|
||||
+ .bus_groups = fsl_mc_bus_groups,
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(fsl_mc_bus_type);
|
||||
|
@ -0,0 +1,193 @@
|
||||
From 2b9110586a96afc0d0e246835da176c48ae7c973 Mon Sep 17 00:00:00 2001
|
||||
From: "J. German Rivera" <German.Rivera@freescale.com>
|
||||
Date: Fri, 13 Mar 2015 15:03:32 -0500
|
||||
Subject: [PATCH 192/226] staging: fsl-mc: Propagate driver_override for a
|
||||
child DPRC's children
|
||||
|
||||
When a child DPRC is bound to the vfio_fsl_mc driver via driver_override,
|
||||
its own children should not be bound to corresponding host kernel
|
||||
drivers, but instead should be bound to the vfio_fsl_mc driver as
|
||||
well.
|
||||
|
||||
Currently, when a child container is scanned by the vfio_fsl_mc driver,
|
||||
child devices found are automatically bound to corresponding host kernel
|
||||
drivers (e.g., DPMCP and DPBP objects are bound to the fsl_mc_allocator
|
||||
driver, DPNI objects are bound to the ldpaa_eth driver, etc), Then,
|
||||
the user has to manually unbind these child devices from their drivers,
|
||||
set the driver_override sysfs attribute to vfio_fsl_mc driver, for each
|
||||
of them and rebind them.
|
||||
|
||||
Signed-off-by: J. German Rivera <German.Rivera@freescale.com>
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/dprc-driver.c | 14 ++++++++++----
|
||||
drivers/staging/fsl-mc/bus/mc-bus.c | 20 +++++++++++++++++---
|
||||
drivers/staging/fsl-mc/include/mc-private.h | 2 ++
|
||||
drivers/staging/fsl-mc/include/mc.h | 2 ++
|
||||
4 files changed, 31 insertions(+), 7 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/dprc-driver.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/dprc-driver.c
|
||||
@@ -152,6 +152,8 @@ static void check_plugged_state_change(s
|
||||
* dprc_add_new_devices - Adds devices to the logical bus for a DPRC
|
||||
*
|
||||
* @mc_bus_dev: pointer to the fsl-mc device that represents a DPRC object
|
||||
+ * @driver_override: driver override to apply to new objects found in the DPRC,
|
||||
+ * or NULL, if none.
|
||||
* @obj_desc_array: array of device descriptors for child devices currently
|
||||
* present in the physical DPRC.
|
||||
* @num_child_objects_in_mc: number of entries in obj_desc_array
|
||||
@@ -161,6 +163,7 @@ static void check_plugged_state_change(s
|
||||
* in the physical DPRC.
|
||||
*/
|
||||
static void dprc_add_new_devices(struct fsl_mc_device *mc_bus_dev,
|
||||
+ const char *driver_override,
|
||||
struct dprc_obj_desc *obj_desc_array,
|
||||
int num_child_objects_in_mc)
|
||||
{
|
||||
@@ -184,7 +187,7 @@ static void dprc_add_new_devices(struct
|
||||
}
|
||||
|
||||
error = fsl_mc_device_add(obj_desc, NULL, &mc_bus_dev->dev,
|
||||
- &child_dev);
|
||||
+ driver_override, &child_dev);
|
||||
if (error < 0)
|
||||
continue;
|
||||
}
|
||||
@@ -243,6 +246,8 @@ static void dprc_cleanup_all_resource_po
|
||||
* dprc_scan_objects - Discover objects in a DPRC
|
||||
*
|
||||
* @mc_bus_dev: pointer to the fsl-mc device that represents a DPRC object
|
||||
+ * @driver_override: driver override to apply to new objects found in the DPRC,
|
||||
+ * or NULL, if none.
|
||||
* @total_irq_count: total number of IRQs needed by objects in the DPRC.
|
||||
*
|
||||
* Detects objects added and removed from a DPRC and synchronizes the
|
||||
@@ -258,6 +263,7 @@ static void dprc_cleanup_all_resource_po
|
||||
* of the device drivers for the non-allocatable devices.
|
||||
*/
|
||||
int dprc_scan_objects(struct fsl_mc_device *mc_bus_dev,
|
||||
+ const char *driver_override,
|
||||
unsigned int *total_irq_count)
|
||||
{
|
||||
int num_child_objects;
|
||||
@@ -338,7 +344,7 @@ int dprc_scan_objects(struct fsl_mc_devi
|
||||
dprc_remove_devices(mc_bus_dev, child_obj_desc_array,
|
||||
num_child_objects);
|
||||
|
||||
- dprc_add_new_devices(mc_bus_dev, child_obj_desc_array,
|
||||
+ dprc_add_new_devices(mc_bus_dev, driver_override, child_obj_desc_array,
|
||||
num_child_objects);
|
||||
|
||||
if (child_obj_desc_array)
|
||||
@@ -369,7 +375,7 @@ int dprc_scan_container(struct fsl_mc_de
|
||||
* Discover objects in the DPRC:
|
||||
*/
|
||||
mutex_lock(&mc_bus->scan_mutex);
|
||||
- error = dprc_scan_objects(mc_bus_dev, &irq_count);
|
||||
+ error = dprc_scan_objects(mc_bus_dev, NULL, &irq_count);
|
||||
mutex_unlock(&mc_bus->scan_mutex);
|
||||
if (error < 0)
|
||||
goto error;
|
||||
@@ -456,7 +462,7 @@ static irqreturn_t dprc_irq0_handler_thr
|
||||
DPRC_IRQ_EVENT_OBJ_CREATED)) {
|
||||
unsigned int irq_count;
|
||||
|
||||
- error = dprc_scan_objects(mc_dev, &irq_count);
|
||||
+ error = dprc_scan_objects(mc_dev, NULL, &irq_count);
|
||||
if (error < 0) {
|
||||
/*
|
||||
* If the error is -ENXIO, we ignore it, as it indicates
|
||||
--- a/drivers/staging/fsl-mc/bus/mc-bus.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/mc-bus.c
|
||||
@@ -116,7 +116,7 @@ static ssize_t rescan_store(struct devic
|
||||
|
||||
if (val) {
|
||||
mutex_lock(&root_mc_bus->scan_mutex);
|
||||
- dprc_scan_objects(root_mc_dev, &irq_count);
|
||||
+ dprc_scan_objects(root_mc_dev, NULL, &irq_count);
|
||||
mutex_unlock(&root_mc_bus->scan_mutex);
|
||||
}
|
||||
|
||||
@@ -149,7 +149,7 @@ static int scan_fsl_mc_bus(struct device
|
||||
root_mc_dev = to_fsl_mc_device(dev);
|
||||
root_mc_bus = to_fsl_mc_bus(root_mc_dev);
|
||||
mutex_lock(&root_mc_bus->scan_mutex);
|
||||
- dprc_scan_objects(root_mc_dev, &irq_count);
|
||||
+ dprc_scan_objects(root_mc_dev, NULL, &irq_count);
|
||||
mutex_unlock(&root_mc_bus->scan_mutex);
|
||||
}
|
||||
|
||||
@@ -503,6 +503,7 @@ bool fsl_mc_is_root_dprc(struct device *
|
||||
int fsl_mc_device_add(struct dprc_obj_desc *obj_desc,
|
||||
struct fsl_mc_io *mc_io,
|
||||
struct device *parent_dev,
|
||||
+ const char *driver_override,
|
||||
struct fsl_mc_device **new_mc_dev)
|
||||
{
|
||||
int error;
|
||||
@@ -535,6 +536,18 @@ int fsl_mc_device_add(struct dprc_obj_de
|
||||
|
||||
mc_dev->obj_desc = *obj_desc;
|
||||
mc_dev->mc_io = mc_io;
|
||||
+ if (driver_override) {
|
||||
+ /*
|
||||
+ * We trust driver_override, so we don't need to use
|
||||
+ * kstrndup() here
|
||||
+ */
|
||||
+ mc_dev->driver_override = kstrdup(driver_override, GFP_KERNEL);
|
||||
+ if (!mc_dev->driver_override) {
|
||||
+ error = -ENOMEM;
|
||||
+ goto error_cleanup_dev;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
device_initialize(&mc_dev->dev);
|
||||
mc_dev->dev.parent = parent_dev;
|
||||
mc_dev->dev.bus = &fsl_mc_bus_type;
|
||||
@@ -858,7 +871,8 @@ static int fsl_mc_bus_probe(struct platf
|
||||
obj_desc.irq_count = 1;
|
||||
obj_desc.region_count = 0;
|
||||
|
||||
- error = fsl_mc_device_add(&obj_desc, mc_io, &pdev->dev, &mc_bus_dev);
|
||||
+ error = fsl_mc_device_add(&obj_desc, mc_io, &pdev->dev, NULL,
|
||||
+ &mc_bus_dev);
|
||||
if (error < 0)
|
||||
goto error_cleanup_mc_io;
|
||||
|
||||
--- a/drivers/staging/fsl-mc/include/mc-private.h
|
||||
+++ b/drivers/staging/fsl-mc/include/mc-private.h
|
||||
@@ -110,6 +110,7 @@ struct fsl_mc_bus {
|
||||
int __must_check fsl_mc_device_add(struct dprc_obj_desc *obj_desc,
|
||||
struct fsl_mc_io *mc_io,
|
||||
struct device *parent_dev,
|
||||
+ const char *driver_override,
|
||||
struct fsl_mc_device **new_mc_dev);
|
||||
|
||||
void fsl_mc_device_remove(struct fsl_mc_device *mc_dev);
|
||||
@@ -117,6 +118,7 @@ void fsl_mc_device_remove(struct fsl_mc_
|
||||
int dprc_scan_container(struct fsl_mc_device *mc_bus_dev);
|
||||
|
||||
int dprc_scan_objects(struct fsl_mc_device *mc_bus_dev,
|
||||
+ const char *driver_override,
|
||||
unsigned int *total_irq_count);
|
||||
|
||||
int __init dprc_driver_init(void);
|
||||
--- a/drivers/staging/fsl-mc/include/mc.h
|
||||
+++ b/drivers/staging/fsl-mc/include/mc.h
|
||||
@@ -129,6 +129,7 @@ struct fsl_mc_device_irq {
|
||||
* @regions: pointer to array of MMIO region entries
|
||||
* @irqs: pointer to array of pointers to interrupts allocated to this device
|
||||
* @resource: generic resource associated with this MC object device, if any.
|
||||
+ * @driver_override: Driver name to force a match
|
||||
*
|
||||
* Generic device object for MC object devices that are "attached" to a
|
||||
* MC bus.
|
||||
@@ -161,6 +162,7 @@ struct fsl_mc_device {
|
||||
struct resource *regions;
|
||||
struct fsl_mc_device_irq **irqs;
|
||||
struct fsl_mc_resource *resource;
|
||||
+ const char *driver_override;
|
||||
};
|
||||
|
||||
#define to_fsl_mc_device(_dev) \
|
@ -0,0 +1,111 @@
|
||||
From 0bda83c15b2ecfc45fac0656df15d4f4fa65afa9 Mon Sep 17 00:00:00 2001
|
||||
From: Bharat Bhushan <bharat.bhushan@freescale.com>
|
||||
Date: Wed, 18 Mar 2015 17:32:59 -0500
|
||||
Subject: [PATCH 193/226] staging: fsl-mc: add device binding path
|
||||
'driver_override'
|
||||
|
||||
This patch is required for vfio-fsl-mc meta driver to successfully bind
|
||||
layerscape container devices for device passthrough. This patch adds
|
||||
a mechanism to allow a layerscape device to specify a driver rather than
|
||||
a layerscape driver provide a device match.
|
||||
|
||||
This patch is based on following proposed patches for PCI and platform devices
|
||||
- https://lkml.org/lkml/2014/4/8/571 :- For Platform devices
|
||||
- http://lists-archives.com/linux-kernel/28030441-pci-introduce-new-device-binding-path-using-pci_dev-driver_override.html :- For PCI devices
|
||||
|
||||
Example to allow a device (dprc.1) to specifically bind
|
||||
with driver (vfio-fsl-mc):-
|
||||
- echo vfio-fsl-mc > /sys/bus/fsl-mc/devices/dprc.1/driver_override
|
||||
- echo dprc.1 > /sys/bus/fsl-mc/drivers/fsl_mc_dprc/unbind
|
||||
- echo dprc.1 > /sys/bus/fsl-mc/drivers/vfio-fsl-mc/bind
|
||||
|
||||
Signed-off-by: J. German Rivera <German.Rivera@freescale.com>
|
||||
(Stuart: resolved merge conflicts)
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/mc-bus.c | 53 +++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 53 insertions(+)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/mc-bus.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/mc-bus.c
|
||||
@@ -42,6 +42,12 @@ static int fsl_mc_bus_match(struct devic
|
||||
if (WARN_ON(!fsl_mc_bus_exists()))
|
||||
goto out;
|
||||
|
||||
+ /* When driver_override is set, only bind to the matching driver */
|
||||
+ if (mc_dev->driver_override) {
|
||||
+ found = !strcmp(mc_dev->driver_override, mc_drv->driver.name);
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
if (!mc_drv->match_id_table)
|
||||
goto out;
|
||||
|
||||
@@ -96,6 +102,50 @@ static ssize_t modalias_show(struct devi
|
||||
}
|
||||
static DEVICE_ATTR_RO(modalias);
|
||||
|
||||
+static ssize_t driver_override_store(struct device *dev,
|
||||
+ struct device_attribute *attr,
|
||||
+ const char *buf, size_t count)
|
||||
+{
|
||||
+ struct fsl_mc_device *mc_dev = to_fsl_mc_device(dev);
|
||||
+ const char *driver_override, *old = mc_dev->driver_override;
|
||||
+ char *cp;
|
||||
+
|
||||
+ if (WARN_ON(dev->bus != &fsl_mc_bus_type))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ if (count > PATH_MAX)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ driver_override = kstrndup(buf, count, GFP_KERNEL);
|
||||
+ if (!driver_override)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ cp = strchr(driver_override, '\n');
|
||||
+ if (cp)
|
||||
+ *cp = '\0';
|
||||
+
|
||||
+ if (strlen(driver_override)) {
|
||||
+ mc_dev->driver_override = driver_override;
|
||||
+ } else {
|
||||
+ kfree(driver_override);
|
||||
+ mc_dev->driver_override = NULL;
|
||||
+ }
|
||||
+
|
||||
+ kfree(old);
|
||||
+
|
||||
+ return count;
|
||||
+}
|
||||
+
|
||||
+static ssize_t driver_override_show(struct device *dev,
|
||||
+ struct device_attribute *attr, char *buf)
|
||||
+{
|
||||
+ struct fsl_mc_device *mc_dev = to_fsl_mc_device(dev);
|
||||
+
|
||||
+ return sprintf(buf, "%s\n", mc_dev->driver_override);
|
||||
+}
|
||||
+
|
||||
+static DEVICE_ATTR_RW(driver_override);
|
||||
+
|
||||
static ssize_t rescan_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
@@ -127,6 +177,7 @@ static DEVICE_ATTR_WO(rescan);
|
||||
static struct attribute *fsl_mc_dev_attrs[] = {
|
||||
&dev_attr_modalias.attr,
|
||||
&dev_attr_rescan.attr,
|
||||
+ &dev_attr_driver_override.attr,
|
||||
NULL,
|
||||
};
|
||||
|
||||
@@ -677,6 +728,8 @@ void fsl_mc_device_remove(struct fsl_mc_
|
||||
}
|
||||
}
|
||||
|
||||
+ kfree(mc_dev->driver_override);
|
||||
+ mc_dev->driver_override = NULL;
|
||||
if (mc_bus)
|
||||
devm_kfree(mc_dev->dev.parent, mc_bus);
|
||||
else
|
@ -0,0 +1,47 @@
|
||||
From 552d628c887d970b9a97d8db2629adc4820fb8e3 Mon Sep 17 00:00:00 2001
|
||||
From: Bharat Bhushan <Bharat.Bhushan@freescale.com>
|
||||
Date: Thu, 16 Jul 2015 14:44:24 +0530
|
||||
Subject: [PATCH 194/226] staging: fsl-mc: export irq cleanup for vfio to use
|
||||
|
||||
VFIO driver needs these basic functions for
|
||||
setting up itt/its of dprc's bound to it.
|
||||
|
||||
Signed-off-by: Bharat Bhushan <Bharat.Bhushan@freescale.com>
|
||||
(Stuart: resolved merge conflict, commit log cleanup)
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/dprc-driver.c | 4 ++--
|
||||
drivers/staging/fsl-mc/include/mc-private.h | 4 ++++
|
||||
2 files changed, 6 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/dprc-driver.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/dprc-driver.c
|
||||
@@ -193,7 +193,7 @@ static void dprc_add_new_devices(struct
|
||||
}
|
||||
}
|
||||
|
||||
-static void dprc_init_all_resource_pools(struct fsl_mc_device *mc_bus_dev)
|
||||
+void dprc_init_all_resource_pools(struct fsl_mc_device *mc_bus_dev)
|
||||
{
|
||||
int pool_type;
|
||||
struct fsl_mc_bus *mc_bus = to_fsl_mc_bus(mc_bus_dev);
|
||||
@@ -234,7 +234,7 @@ static void dprc_cleanup_resource_pool(s
|
||||
WARN_ON(free_count != res_pool->free_count);
|
||||
}
|
||||
|
||||
-static void dprc_cleanup_all_resource_pools(struct fsl_mc_device *mc_bus_dev)
|
||||
+void dprc_cleanup_all_resource_pools(struct fsl_mc_device *mc_bus_dev)
|
||||
{
|
||||
int pool_type;
|
||||
|
||||
--- a/drivers/staging/fsl-mc/include/mc-private.h
|
||||
+++ b/drivers/staging/fsl-mc/include/mc-private.h
|
||||
@@ -157,4 +157,8 @@ int fsl_mc_populate_irq_pool(struct fsl_
|
||||
|
||||
void fsl_mc_cleanup_irq_pool(struct fsl_mc_bus *mc_bus);
|
||||
|
||||
+void dprc_init_all_resource_pools(struct fsl_mc_device *mc_bus_dev);
|
||||
+
|
||||
+void dprc_cleanup_all_resource_pools(struct fsl_mc_device *mc_bus_dev);
|
||||
+
|
||||
#endif /* _FSL_MC_PRIVATE_H_ */
|
@ -0,0 +1,88 @@
|
||||
From 71d19cd1107fa435d056e08e7d7ef7d8f714cf35 Mon Sep 17 00:00:00 2001
|
||||
From: Lijun Pan <Lijun.Pan@freescale.com>
|
||||
Date: Fri, 31 Jul 2015 15:07:32 -0500
|
||||
Subject: [PATCH 195/226] increment MC_CMD_COMPLETION_TIMEOUT_MS
|
||||
|
||||
5000ms is barely enough for dpsw/dpdmux creation.
|
||||
If MC firmware could run faster, we would decrement the value later on.
|
||||
|
||||
Signed-off-by: Lijun Pan <Lijun.Pan@freescale.com>
|
||||
(Stuart: resolved merge conflict)
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/mc-sys.c | 38 +++++++++++++++--------------------
|
||||
1 file changed, 16 insertions(+), 22 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/mc-sys.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/mc-sys.c
|
||||
@@ -43,8 +43,10 @@
|
||||
|
||||
/**
|
||||
* Timeout in milliseconds to wait for the completion of an MC command
|
||||
+ * 5000 ms is barely enough for dpsw/dpdmux creation
|
||||
+ * TODO: if MC firmware could response faster, we should decrease this value
|
||||
*/
|
||||
-#define MC_CMD_COMPLETION_TIMEOUT_MS 500
|
||||
+#define MC_CMD_COMPLETION_TIMEOUT_MS 5000
|
||||
|
||||
/*
|
||||
* usleep_range() min and max values used to throttle down polling
|
||||
@@ -327,17 +329,8 @@ static int mc_polling_wait_preemptible(s
|
||||
usleep_range(MC_CMD_COMPLETION_POLLING_MIN_SLEEP_USECS,
|
||||
MC_CMD_COMPLETION_POLLING_MAX_SLEEP_USECS);
|
||||
|
||||
- if (time_after_eq(jiffies, jiffies_until_timeout)) {
|
||||
- dev_dbg(mc_io->dev,
|
||||
- "MC command timed out (portal: %#llx, obj handle: %#x, command: %#x)\n",
|
||||
- mc_io->portal_phys_addr,
|
||||
- (unsigned int)
|
||||
- MC_CMD_HDR_READ_TOKEN(cmd->header),
|
||||
- (unsigned int)
|
||||
- MC_CMD_HDR_READ_CMDID(cmd->header));
|
||||
-
|
||||
+ if (time_after_eq(jiffies, jiffies_until_timeout))
|
||||
return -ETIMEDOUT;
|
||||
- }
|
||||
}
|
||||
|
||||
*mc_status = status;
|
||||
@@ -369,17 +362,8 @@ static int mc_polling_wait_atomic(struct
|
||||
|
||||
udelay(MC_CMD_COMPLETION_POLLING_MAX_SLEEP_USECS);
|
||||
timeout_usecs -= MC_CMD_COMPLETION_POLLING_MAX_SLEEP_USECS;
|
||||
- if (timeout_usecs == 0) {
|
||||
- dev_dbg(mc_io->dev,
|
||||
- "MC command timed out (portal: %#llx, obj handle: %#x, command: %#x)\n",
|
||||
- mc_io->portal_phys_addr,
|
||||
- (unsigned int)
|
||||
- MC_CMD_HDR_READ_TOKEN(cmd->header),
|
||||
- (unsigned int)
|
||||
- MC_CMD_HDR_READ_CMDID(cmd->header));
|
||||
-
|
||||
+ if (timeout_usecs == 0)
|
||||
return -ETIMEDOUT;
|
||||
- }
|
||||
}
|
||||
|
||||
*mc_status = status;
|
||||
@@ -422,9 +406,19 @@ int mc_send_command(struct fsl_mc_io *mc
|
||||
else
|
||||
error = mc_polling_wait_atomic(mc_io, cmd, &status);
|
||||
|
||||
- if (error < 0)
|
||||
+ if (error < 0) {
|
||||
+ if (error == -ETIMEDOUT) {
|
||||
+ pr_debug("MC command timed out (portal: %#llx, obj handle: %#x, command: %#x)\n",
|
||||
+ mc_io->portal_phys_addr,
|
||||
+ (unsigned int)
|
||||
+ MC_CMD_HDR_READ_TOKEN(cmd->header),
|
||||
+ (unsigned int)
|
||||
+ MC_CMD_HDR_READ_CMDID(cmd->header));
|
||||
+ }
|
||||
goto common_exit;
|
||||
|
||||
+ }
|
||||
+
|
||||
if (status != MC_CMD_STATUS_OK) {
|
||||
dev_dbg(mc_io->dev,
|
||||
"MC command failed: portal: %#llx, obj handle: %#x, command: %#x, status: %s (%#x)\n",
|
@ -0,0 +1,45 @@
|
||||
From 12b1317fb3ab5b56efd833fa3b22965adf1d2c96 Mon Sep 17 00:00:00 2001
|
||||
From: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Date: Fri, 15 Apr 2016 17:07:16 -0500
|
||||
Subject: [PATCH 196/226] staging: fsl-mc: make fsl_mc_get_root_dprc public
|
||||
|
||||
this is needed by other components (e.g. vfio) to find
|
||||
the root dprc
|
||||
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/mc-bus.c | 3 ++-
|
||||
drivers/staging/fsl-mc/include/mc.h | 3 +++
|
||||
2 files changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/mc-bus.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/mc-bus.c
|
||||
@@ -358,7 +358,7 @@ EXPORT_SYMBOL_GPL(fsl_mc_bus_exists);
|
||||
/**
|
||||
* fsl_mc_get_root_dprc - function to traverse to the root dprc
|
||||
*/
|
||||
-static void fsl_mc_get_root_dprc(struct device *dev,
|
||||
+void fsl_mc_get_root_dprc(struct device *dev,
|
||||
struct device **root_dprc_dev)
|
||||
{
|
||||
if (WARN_ON(!dev)) {
|
||||
@@ -371,6 +371,7 @@ static void fsl_mc_get_root_dprc(struct
|
||||
*root_dprc_dev = (*root_dprc_dev)->parent;
|
||||
}
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(fsl_mc_get_root_dprc);
|
||||
|
||||
static int get_dprc_attr(struct fsl_mc_io *mc_io,
|
||||
int container_id, struct dprc_attributes *attr)
|
||||
--- a/drivers/staging/fsl-mc/include/mc.h
|
||||
+++ b/drivers/staging/fsl-mc/include/mc.h
|
||||
@@ -191,6 +191,9 @@ void fsl_mc_driver_unregister(struct fsl
|
||||
|
||||
bool fsl_mc_bus_exists(void);
|
||||
|
||||
+void fsl_mc_get_root_dprc(struct device *dev,
|
||||
+ struct device **root_dprc_dev);
|
||||
+
|
||||
int __must_check fsl_mc_portal_allocate(struct fsl_mc_device *mc_dev,
|
||||
u16 mc_io_flags,
|
||||
struct fsl_mc_io **new_mc_io);
|
@ -0,0 +1,489 @@
|
||||
From fb4881d149742e4c5595aca8bf86c99d2ea155ad Mon Sep 17 00:00:00 2001
|
||||
From: Lijun Pan <Lijun.Pan@freescale.com>
|
||||
Date: Mon, 8 Feb 2016 17:40:18 -0600
|
||||
Subject: [PATCH 197/226] staging: fsl-mc: Management Complex restool driver
|
||||
|
||||
The kernel support for the restool (a user space resource management
|
||||
tool) is a driver for the /dev/dprc.N device file.
|
||||
Its purpose is to provide an ioctl interface,
|
||||
which the restool uses to interact with the MC bus driver
|
||||
and with the MC firmware.
|
||||
We allocate a dpmcp at driver initialization,
|
||||
and keep that dpmcp until driver exit.
|
||||
We use that dpmcp by default.
|
||||
If that dpmcp is in use, we create another portal at run time
|
||||
and destroy the newly created portal after use.
|
||||
The ioctl RESTOOL_SEND_MC_COMMAND sends user space command to fsl-mc
|
||||
bus and utilizes the fsl-mc bus to communicate with MC firmware.
|
||||
The ioctl RESTOOL_DPRC_SYNC request the mc-bus launch
|
||||
objects scan under root dprc.
|
||||
In order to support multiple root dprc, we utilize the bus notify
|
||||
mechanism to scan fsl_mc_bus_type for the newly added root dprc.
|
||||
After discovering the root dprc, it creates a miscdevice
|
||||
/dev/dprc.N to associate with this root dprc.
|
||||
|
||||
Signed-off-by: Lijun Pan <Lijun.Pan@freescale.com>
|
||||
[Stuart: minor fix to resolve compile error]
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
---
|
||||
Documentation/ioctl/ioctl-number.txt | 1 +
|
||||
drivers/staging/fsl-mc/bus/Kconfig | 7 +-
|
||||
drivers/staging/fsl-mc/bus/Makefile | 3 +
|
||||
drivers/staging/fsl-mc/bus/mc-ioctl.h | 22 ++
|
||||
drivers/staging/fsl-mc/bus/mc-restool.c | 392 +++++++++++++++++++++++++++++++
|
||||
5 files changed, 424 insertions(+), 1 deletion(-)
|
||||
create mode 100644 drivers/staging/fsl-mc/bus/mc-ioctl.h
|
||||
create mode 100644 drivers/staging/fsl-mc/bus/mc-restool.c
|
||||
|
||||
--- a/Documentation/ioctl/ioctl-number.txt
|
||||
+++ b/Documentation/ioctl/ioctl-number.txt
|
||||
@@ -170,6 +170,7 @@ Code Seq#(hex) Include File Comments
|
||||
'R' 00-1F linux/random.h conflict!
|
||||
'R' 01 linux/rfkill.h conflict!
|
||||
'R' C0-DF net/bluetooth/rfcomm.h
|
||||
+'R' E0-EF drivers/staging/fsl-mc/bus/mc-ioctl.h
|
||||
'S' all linux/cdrom.h conflict!
|
||||
'S' 80-81 scsi/scsi_ioctl.h conflict!
|
||||
'S' 82-FF scsi/scsi.h conflict!
|
||||
--- a/drivers/staging/fsl-mc/bus/Kconfig
|
||||
+++ b/drivers/staging/fsl-mc/bus/Kconfig
|
||||
@@ -22,4 +22,9 @@ config FSL_MC_BUS
|
||||
Only enable this option when building the kernel for
|
||||
Freescale QorQIQ LS2xxxx SoCs.
|
||||
|
||||
-
|
||||
+config FSL_MC_RESTOOL
|
||||
+ tristate "Freescale Management Complex (MC) restool driver"
|
||||
+ depends on FSL_MC_BUS
|
||||
+ help
|
||||
+ Driver that provides kernel support for the Freescale Management
|
||||
+ Complex resource manager user-space tool.
|
||||
--- a/drivers/staging/fsl-mc/bus/Makefile
|
||||
+++ b/drivers/staging/fsl-mc/bus/Makefile
|
||||
@@ -18,3 +18,6 @@ mc-bus-driver-objs := mc-bus.o \
|
||||
dpmcp.o \
|
||||
dpbp.o \
|
||||
dpcon.o
|
||||
+
|
||||
+# MC restool kernel support
|
||||
+obj-$(CONFIG_FSL_MC_RESTOOL) += mc-restool.o
|
||||
--- /dev/null
|
||||
+++ b/drivers/staging/fsl-mc/bus/mc-ioctl.h
|
||||
@@ -0,0 +1,22 @@
|
||||
+/*
|
||||
+ * Freescale Management Complex (MC) ioclt interface
|
||||
+ *
|
||||
+ * Copyright (C) 2014 Freescale Semiconductor, Inc.
|
||||
+ * Author: Lijun Pan <Lijun.Pan@freescale.com>
|
||||
+ *
|
||||
+ * This file is licensed under the terms of the GNU General Public
|
||||
+ * License version 2. This program is licensed "as is" without any
|
||||
+ * warranty of any kind, whether express or implied.
|
||||
+ */
|
||||
+#ifndef _FSL_MC_IOCTL_H_
|
||||
+#define _FSL_MC_IOCTL_H_
|
||||
+
|
||||
+#include <linux/ioctl.h>
|
||||
+#include "../include/mc-sys.h"
|
||||
+
|
||||
+#define RESTOOL_IOCTL_TYPE 'R'
|
||||
+
|
||||
+#define RESTOOL_SEND_MC_COMMAND \
|
||||
+ _IOWR(RESTOOL_IOCTL_TYPE, 0xE0, struct mc_command)
|
||||
+
|
||||
+#endif /* _FSL_MC_IOCTL_H_ */
|
||||
--- /dev/null
|
||||
+++ b/drivers/staging/fsl-mc/bus/mc-restool.c
|
||||
@@ -0,0 +1,392 @@
|
||||
+/*
|
||||
+ * Freescale Management Complex (MC) restool driver
|
||||
+ *
|
||||
+ * Copyright (C) 2014 Freescale Semiconductor, Inc.
|
||||
+ * Author: Lijun Pan <Lijun.Pan@freescale.com>
|
||||
+ *
|
||||
+ * This file is licensed under the terms of the GNU General Public
|
||||
+ * License version 2. This program is licensed "as is" without any
|
||||
+ * warranty of any kind, whether express or implied.
|
||||
+ */
|
||||
+
|
||||
+#include "../include/mc-private.h"
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/fs.h>
|
||||
+#include <linux/miscdevice.h>
|
||||
+#include <linux/mm.h>
|
||||
+#include <linux/slab.h>
|
||||
+#include <linux/uaccess.h>
|
||||
+#include <linux/mutex.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include "mc-ioctl.h"
|
||||
+#include "../include/mc-sys.h"
|
||||
+#include "../include/mc-cmd.h"
|
||||
+#include "../include/dpmng.h"
|
||||
+
|
||||
+/**
|
||||
+ * Maximum number of DPRCs that can be opened at the same time
|
||||
+ */
|
||||
+#define MAX_DPRC_HANDLES 64
|
||||
+
|
||||
+/**
|
||||
+ * restool_misc - information associated with the newly added miscdevice
|
||||
+ * @misc: newly created miscdevice associated with root dprc
|
||||
+ * @miscdevt: device id of this miscdevice
|
||||
+ * @list: a linked list node representing this miscdevcie
|
||||
+ * @static_mc_io: pointer to the static MC I/O object used by the restool
|
||||
+ * @dynamic_instance_count: number of dynamically created instances
|
||||
+ * @static_instance_in_use: static instance is in use or not
|
||||
+ * @mutex: mutex lock to serialze the open/release operations
|
||||
+ * @dev: root dprc associated with this miscdevice
|
||||
+ */
|
||||
+struct restool_misc {
|
||||
+ struct miscdevice misc;
|
||||
+ dev_t miscdevt;
|
||||
+ struct list_head list;
|
||||
+ struct fsl_mc_io *static_mc_io;
|
||||
+ u32 dynamic_instance_count;
|
||||
+ bool static_instance_in_use;
|
||||
+ struct mutex mutex; /* serialze the open/release operations */
|
||||
+ struct device *dev;
|
||||
+};
|
||||
+
|
||||
+/*
|
||||
+ * initialize a global list to link all
|
||||
+ * the miscdevice nodes (struct restool_misc)
|
||||
+ */
|
||||
+static LIST_HEAD(misc_list);
|
||||
+static DEFINE_MUTEX(misc_list_mutex);
|
||||
+
|
||||
+static int fsl_mc_restool_dev_open(struct inode *inode, struct file *filep)
|
||||
+{
|
||||
+ struct fsl_mc_device *root_mc_dev;
|
||||
+ int error;
|
||||
+ struct fsl_mc_io *dynamic_mc_io = NULL;
|
||||
+ struct restool_misc *restool_misc = NULL;
|
||||
+ struct restool_misc *restool_misc_cursor;
|
||||
+
|
||||
+ mutex_lock(&misc_list_mutex);
|
||||
+
|
||||
+ list_for_each_entry(restool_misc_cursor, &misc_list, list) {
|
||||
+ if (restool_misc_cursor->miscdevt == inode->i_rdev) {
|
||||
+ restool_misc = restool_misc_cursor;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ mutex_unlock(&misc_list_mutex);
|
||||
+
|
||||
+ if (!restool_misc)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ if (WARN_ON(!restool_misc->dev))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ mutex_lock(&restool_misc->mutex);
|
||||
+
|
||||
+ if (!restool_misc->static_instance_in_use) {
|
||||
+ restool_misc->static_instance_in_use = true;
|
||||
+ filep->private_data = restool_misc->static_mc_io;
|
||||
+ } else {
|
||||
+ dynamic_mc_io = kzalloc(sizeof(*dynamic_mc_io), GFP_KERNEL);
|
||||
+ if (!dynamic_mc_io) {
|
||||
+ error = -ENOMEM;
|
||||
+ goto err_unlock;
|
||||
+ }
|
||||
+
|
||||
+ root_mc_dev = to_fsl_mc_device(restool_misc->dev);
|
||||
+ error = fsl_mc_portal_allocate(root_mc_dev, 0, &dynamic_mc_io);
|
||||
+ if (error < 0) {
|
||||
+ pr_err("Not able to allocate MC portal\n");
|
||||
+ goto free_dynamic_mc_io;
|
||||
+ }
|
||||
+ ++restool_misc->dynamic_instance_count;
|
||||
+ filep->private_data = dynamic_mc_io;
|
||||
+ }
|
||||
+
|
||||
+ mutex_unlock(&restool_misc->mutex);
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
+free_dynamic_mc_io:
|
||||
+ kfree(dynamic_mc_io);
|
||||
+err_unlock:
|
||||
+ mutex_unlock(&restool_misc->mutex);
|
||||
+
|
||||
+ return error;
|
||||
+}
|
||||
+
|
||||
+static int fsl_mc_restool_dev_release(struct inode *inode, struct file *filep)
|
||||
+{
|
||||
+ struct fsl_mc_io *local_mc_io = filep->private_data;
|
||||
+ struct restool_misc *restool_misc = NULL;
|
||||
+ struct restool_misc *restool_misc_cursor;
|
||||
+
|
||||
+ if (WARN_ON(!filep->private_data))
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ mutex_lock(&misc_list_mutex);
|
||||
+
|
||||
+ list_for_each_entry(restool_misc_cursor, &misc_list, list) {
|
||||
+ if (restool_misc_cursor->miscdevt == inode->i_rdev) {
|
||||
+ restool_misc = restool_misc_cursor;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ mutex_unlock(&misc_list_mutex);
|
||||
+
|
||||
+ if (!restool_misc)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ mutex_lock(&restool_misc->mutex);
|
||||
+
|
||||
+ if (WARN_ON(restool_misc->dynamic_instance_count == 0 &&
|
||||
+ !restool_misc->static_instance_in_use)) {
|
||||
+ mutex_unlock(&restool_misc->mutex);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ /* Globally clean up opened/untracked handles */
|
||||
+ fsl_mc_portal_reset(local_mc_io);
|
||||
+
|
||||
+ /*
|
||||
+ * must check
|
||||
+ * whether local_mc_io is dynamic or static instance
|
||||
+ * Otherwise it will free up the reserved portal by accident
|
||||
+ * or even not free up the dynamic allocated portal
|
||||
+ * if 2 or more instances running concurrently
|
||||
+ */
|
||||
+ if (local_mc_io == restool_misc->static_mc_io) {
|
||||
+ restool_misc->static_instance_in_use = false;
|
||||
+ } else {
|
||||
+ fsl_mc_portal_free(local_mc_io);
|
||||
+ kfree(filep->private_data);
|
||||
+ --restool_misc->dynamic_instance_count;
|
||||
+ }
|
||||
+
|
||||
+ filep->private_data = NULL;
|
||||
+ mutex_unlock(&restool_misc->mutex);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int restool_send_mc_command(unsigned long arg,
|
||||
+ struct fsl_mc_io *local_mc_io)
|
||||
+{
|
||||
+ int error;
|
||||
+ struct mc_command mc_cmd;
|
||||
+
|
||||
+ if (copy_from_user(&mc_cmd, (void __user *)arg, sizeof(mc_cmd)))
|
||||
+ return -EFAULT;
|
||||
+
|
||||
+ /*
|
||||
+ * Send MC command to the MC:
|
||||
+ */
|
||||
+ error = mc_send_command(local_mc_io, &mc_cmd);
|
||||
+ if (error < 0)
|
||||
+ return error;
|
||||
+
|
||||
+ if (copy_to_user((void __user *)arg, &mc_cmd, sizeof(mc_cmd)))
|
||||
+ return -EFAULT;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static long
|
||||
+fsl_mc_restool_dev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
+{
|
||||
+ int error;
|
||||
+
|
||||
+ switch (cmd) {
|
||||
+ case RESTOOL_SEND_MC_COMMAND:
|
||||
+ error = restool_send_mc_command(arg, file->private_data);
|
||||
+ break;
|
||||
+ default:
|
||||
+ pr_err("%s: unexpected ioctl call number\n", __func__);
|
||||
+ error = -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ return error;
|
||||
+}
|
||||
+
|
||||
+static const struct file_operations fsl_mc_restool_dev_fops = {
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .open = fsl_mc_restool_dev_open,
|
||||
+ .release = fsl_mc_restool_dev_release,
|
||||
+ .unlocked_ioctl = fsl_mc_restool_dev_ioctl,
|
||||
+};
|
||||
+
|
||||
+static int restool_add_device_file(struct device *dev)
|
||||
+{
|
||||
+ u32 name1 = 0;
|
||||
+ char name2[20] = {0};
|
||||
+ int error;
|
||||
+ struct fsl_mc_device *root_mc_dev;
|
||||
+ struct restool_misc *restool_misc;
|
||||
+
|
||||
+ if (dev->bus == &platform_bus_type && dev->driver_data) {
|
||||
+ if (sscanf(dev_name(dev), "%x.%s", &name1, name2) != 2)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
+ if (strcmp(name2, "fsl-mc") == 0)
|
||||
+ pr_debug("platform's root dprc name is: %s\n",
|
||||
+ dev_name(&(((struct fsl_mc *)
|
||||
+ (dev->driver_data))->root_mc_bus_dev->dev)));
|
||||
+ }
|
||||
+
|
||||
+ if (!fsl_mc_is_root_dprc(dev))
|
||||
+ return 0;
|
||||
+
|
||||
+ restool_misc = kzalloc(sizeof(*restool_misc), GFP_KERNEL);
|
||||
+ if (!restool_misc)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ restool_misc->dev = dev;
|
||||
+ root_mc_dev = to_fsl_mc_device(dev);
|
||||
+ error = fsl_mc_portal_allocate(root_mc_dev, 0,
|
||||
+ &restool_misc->static_mc_io);
|
||||
+ if (error < 0) {
|
||||
+ pr_err("Not able to allocate MC portal\n");
|
||||
+ goto free_restool_misc;
|
||||
+ }
|
||||
+
|
||||
+ restool_misc->misc.minor = MISC_DYNAMIC_MINOR;
|
||||
+ restool_misc->misc.name = dev_name(dev);
|
||||
+ restool_misc->misc.fops = &fsl_mc_restool_dev_fops;
|
||||
+
|
||||
+ error = misc_register(&restool_misc->misc);
|
||||
+ if (error < 0) {
|
||||
+ pr_err("misc_register() failed: %d\n", error);
|
||||
+ goto free_portal;
|
||||
+ }
|
||||
+
|
||||
+ restool_misc->miscdevt = restool_misc->misc.this_device->devt;
|
||||
+ mutex_init(&restool_misc->mutex);
|
||||
+ mutex_lock(&misc_list_mutex);
|
||||
+ list_add(&restool_misc->list, &misc_list);
|
||||
+ mutex_unlock(&misc_list_mutex);
|
||||
+
|
||||
+ pr_info("/dev/%s driver registered\n", dev_name(dev));
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
+free_portal:
|
||||
+ fsl_mc_portal_free(restool_misc->static_mc_io);
|
||||
+free_restool_misc:
|
||||
+ kfree(restool_misc);
|
||||
+
|
||||
+ return error;
|
||||
+}
|
||||
+
|
||||
+static int restool_bus_notifier(struct notifier_block *nb,
|
||||
+ unsigned long action, void *data)
|
||||
+{
|
||||
+ int error;
|
||||
+ struct device *dev = data;
|
||||
+
|
||||
+ switch (action) {
|
||||
+ case BUS_NOTIFY_ADD_DEVICE:
|
||||
+ error = restool_add_device_file(dev);
|
||||
+ if (error)
|
||||
+ return error;
|
||||
+ break;
|
||||
+ case BUS_NOTIFY_DEL_DEVICE:
|
||||
+ case BUS_NOTIFY_REMOVED_DEVICE:
|
||||
+ case BUS_NOTIFY_BIND_DRIVER:
|
||||
+ case BUS_NOTIFY_BOUND_DRIVER:
|
||||
+ case BUS_NOTIFY_UNBIND_DRIVER:
|
||||
+ case BUS_NOTIFY_UNBOUND_DRIVER:
|
||||
+ break;
|
||||
+ default:
|
||||
+ pr_err("%s: unrecognized device action from %s\n", __func__,
|
||||
+ dev_name(dev));
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int add_to_restool(struct device *dev, void *data)
|
||||
+{
|
||||
+ return restool_add_device_file(dev);
|
||||
+}
|
||||
+
|
||||
+static int __init fsl_mc_restool_driver_init(void)
|
||||
+{
|
||||
+ int error;
|
||||
+ struct notifier_block *nb;
|
||||
+
|
||||
+ nb = kzalloc(sizeof(*nb), GFP_KERNEL);
|
||||
+ if (!nb)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ nb->notifier_call = restool_bus_notifier;
|
||||
+ error = bus_register_notifier(&fsl_mc_bus_type, nb);
|
||||
+ if (error)
|
||||
+ goto free_nb;
|
||||
+
|
||||
+ /*
|
||||
+ * This driver runs after fsl-mc bus driver runs.
|
||||
+ * Hence, many of the root dprcs are already attached to fsl-mc bus
|
||||
+ * In order to make sure we find all the root dprcs,
|
||||
+ * we need to scan the fsl_mc_bus_type.
|
||||
+ */
|
||||
+ error = bus_for_each_dev(&fsl_mc_bus_type, NULL, NULL, add_to_restool);
|
||||
+ if (error) {
|
||||
+ bus_unregister_notifier(&fsl_mc_bus_type, nb);
|
||||
+ kfree(nb);
|
||||
+ pr_err("restool driver registration failure\n");
|
||||
+ return error;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
+free_nb:
|
||||
+ kfree(nb);
|
||||
+ return error;
|
||||
+}
|
||||
+
|
||||
+module_init(fsl_mc_restool_driver_init);
|
||||
+
|
||||
+static void __exit fsl_mc_restool_driver_exit(void)
|
||||
+{
|
||||
+ struct restool_misc *restool_misc;
|
||||
+ struct restool_misc *restool_misc_tmp;
|
||||
+ char name1[20] = {0};
|
||||
+ u32 name2 = 0;
|
||||
+
|
||||
+ list_for_each_entry_safe(restool_misc, restool_misc_tmp,
|
||||
+ &misc_list, list) {
|
||||
+ if (sscanf(restool_misc->misc.name, "%4s.%u", name1, &name2)
|
||||
+ != 2)
|
||||
+ continue;
|
||||
+
|
||||
+ pr_debug("name1=%s,name2=%u\n", name1, name2);
|
||||
+ pr_debug("misc-device: %s\n", restool_misc->misc.name);
|
||||
+ if (strcmp(name1, "dprc") != 0)
|
||||
+ continue;
|
||||
+
|
||||
+ if (WARN_ON(!restool_misc->static_mc_io))
|
||||
+ return;
|
||||
+
|
||||
+ if (WARN_ON(restool_misc->dynamic_instance_count != 0))
|
||||
+ return;
|
||||
+
|
||||
+ if (WARN_ON(restool_misc->static_instance_in_use))
|
||||
+ return;
|
||||
+
|
||||
+ misc_deregister(&restool_misc->misc);
|
||||
+ pr_info("/dev/%s driver unregistered\n",
|
||||
+ restool_misc->misc.name);
|
||||
+ fsl_mc_portal_free(restool_misc->static_mc_io);
|
||||
+ list_del(&restool_misc->list);
|
||||
+ kfree(restool_misc);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+module_exit(fsl_mc_restool_driver_exit);
|
||||
+
|
||||
+MODULE_AUTHOR("Freescale Semiconductor Inc.");
|
||||
+MODULE_DESCRIPTION("Freescale's MC restool driver");
|
||||
+MODULE_LICENSE("GPL");
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,35 @@
|
||||
From a4150e8ec8da3add3933dd026c7154dcca2ee2e7 Mon Sep 17 00:00:00 2001
|
||||
From: Mihai Caraman <mihai.caraman@freescale.com>
|
||||
Date: Tue, 5 Apr 2016 14:47:57 +0000
|
||||
Subject: [PATCH 199/226] dpaa2-dpio: Cosmetic cleanup
|
||||
|
||||
Replace obsolete terms.
|
||||
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/dpio/fsl_qbman_base.h | 2 +-
|
||||
drivers/staging/fsl-mc/bus/dpio/qbman_portal.h | 2 +-
|
||||
2 files changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/dpio/fsl_qbman_base.h
|
||||
+++ b/drivers/staging/fsl-mc/bus/dpio/fsl_qbman_base.h
|
||||
@@ -51,7 +51,7 @@ struct qbman_block_desc {
|
||||
* Descriptor for a QBMan software portal, expressed in terms that make sense to
|
||||
* the user context. Ie. on MC, this information is likely to be true-physical,
|
||||
* and instantiated statically at compile-time. On GPP, this information is
|
||||
- * likely to be obtained via "discovery" over a partition's "layerscape bus"
|
||||
+ * likely to be obtained via "discovery" over a partition's "MC bus"
|
||||
* (ie. in response to a MC portal command), and would take into account any
|
||||
* virtualisation of the GPP user's address space and/or interrupt numbering.
|
||||
*/
|
||||
--- a/drivers/staging/fsl-mc/bus/dpio/qbman_portal.h
|
||||
+++ b/drivers/staging/fsl-mc/bus/dpio/qbman_portal.h
|
||||
@@ -138,7 +138,7 @@ static inline void *qbman_swp_mc_complet
|
||||
/* This struct locates a sub-field within a QBMan portal (CENA) cacheline which
|
||||
* is either serving as a configuration command or a query result. The
|
||||
* representation is inherently little-endian, as the indexing of the words is
|
||||
- * itself little-endian in nature and layerscape is little endian for anything
|
||||
+ * itself little-endian in nature and DPAA2 is little endian for anything
|
||||
* that crosses a word boundary too (64-bit fields are the obvious examples).
|
||||
*/
|
||||
struct qb_attr_code {
|
@ -0,0 +1,26 @@
|
||||
From 3cc23880ecb98efe2d868254201ac58f945d9e1d Mon Sep 17 00:00:00 2001
|
||||
From: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Date: Wed, 15 Jun 2016 14:05:08 -0500
|
||||
Subject: [PATCH 200/226] staging: fsl-mc: dpio driver match id cleanup
|
||||
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
---
|
||||
drivers/staging/fsl-mc/bus/dpio/dpio-drv.c | 4 +---
|
||||
1 file changed, 1 insertion(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-mc/bus/dpio/dpio-drv.c
|
||||
+++ b/drivers/staging/fsl-mc/bus/dpio/dpio-drv.c
|
||||
@@ -364,12 +364,10 @@ err_mcportal:
|
||||
return err;
|
||||
}
|
||||
|
||||
-static const struct fsl_mc_device_match_id dpaa2_dpio_match_id_table[] = {
|
||||
+static const struct fsl_mc_device_id dpaa2_dpio_match_id_table[] = {
|
||||
{
|
||||
.vendor = FSL_MC_VENDOR_FREESCALE,
|
||||
.obj_type = "dpio",
|
||||
- .ver_major = DPIO_VER_MAJOR,
|
||||
- .ver_minor = DPIO_VER_MINOR
|
||||
},
|
||||
{ .vendor = 0x0 }
|
||||
};
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,37 @@
|
||||
From 727de4692d731655dea96702aa099f4f4d3a5203 Mon Sep 17 00:00:00 2001
|
||||
From: Bogdan Hamciuc <bogdan.hamciuc@nxp.com>
|
||||
Date: Mon, 21 Mar 2016 16:10:01 +0200
|
||||
Subject: [PATCH 203/226] fsl-dpaa2: eth: Update description of DPNI counters
|
||||
|
||||
Update description of DPNI counters presented with "ethtool -S".
|
||||
|
||||
Signed-off-by: Bogdan Hamciuc <bogdan.hamciuc@nxp.com>
|
||||
(cherry picked from commit f68aab60355d00af13fdff2ded7bf38809beacd3)
|
||||
---
|
||||
drivers/staging/fsl-dpaa2/ethernet/dpaa2-ethtool.c | 9 ++++++---
|
||||
1 file changed, 6 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-dpaa2/ethernet/dpaa2-ethtool.c
|
||||
+++ b/drivers/staging/fsl-dpaa2/ethernet/dpaa2-ethtool.c
|
||||
@@ -39,15 +39,18 @@
|
||||
char dpaa2_ethtool_stats[][ETH_GSTRING_LEN] = {
|
||||
"rx frames",
|
||||
"rx bytes",
|
||||
- "rx frames dropped",
|
||||
- "rx err frames",
|
||||
+ /* rx frames filtered/policed */
|
||||
+ "rx filtered frames",
|
||||
+ /* rx frames dropped with errors */
|
||||
+ "rx discarded frames",
|
||||
"rx mcast frames",
|
||||
"rx mcast bytes",
|
||||
"rx bcast frames",
|
||||
"rx bcast bytes",
|
||||
"tx frames",
|
||||
"tx bytes",
|
||||
- "tx err frames",
|
||||
+ /* tx frames dropped with errors */
|
||||
+ "tx discarded frames",
|
||||
};
|
||||
|
||||
#define DPAA2_ETH_NUM_STATS ARRAY_SIZE(dpaa2_ethtool_stats)
|
@ -0,0 +1,38 @@
|
||||
From 9a38e2ce3b46a2bdc90b4ad190a26f9418909450 Mon Sep 17 00:00:00 2001
|
||||
From: Bogdan Hamciuc <bogdan.hamciuc@nxp.com>
|
||||
Date: Tue, 29 Mar 2016 13:23:50 +0300
|
||||
Subject: [PATCH 204/226] fsl-dpaa2: eth: dpni: Clear compiler warnings
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Clear two warnings given by -Wcast-qual:
|
||||
warning: cast discards ‘__attribute__((const))’ qualifier from pointer
|
||||
target type
|
||||
|
||||
Signed-off-by: Bogdan Hamciuc <bogdan.hamciuc@nxp.com>
|
||||
(cherry picked from commit 96d14f291c2750e8b09268cecb84bfe7f013294d)
|
||||
---
|
||||
drivers/staging/fsl-dpaa2/ethernet/dpni.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-dpaa2/ethernet/dpni.c
|
||||
+++ b/drivers/staging/fsl-dpaa2/ethernet/dpni.c
|
||||
@@ -128,7 +128,7 @@ int dpni_prepare_extended_cfg(const stru
|
||||
int dpni_extract_extended_cfg(struct dpni_extended_cfg *cfg,
|
||||
const uint8_t *ext_cfg_buf)
|
||||
{
|
||||
- uint64_t *ext_params = (uint64_t *)ext_cfg_buf;
|
||||
+ const uint64_t *ext_params = (const uint64_t *)ext_cfg_buf;
|
||||
|
||||
DPNI_EXT_EXTENDED_CFG(ext_params, cfg);
|
||||
|
||||
@@ -1651,7 +1651,7 @@ void dpni_prepare_early_drop(const struc
|
||||
void dpni_extract_early_drop(struct dpni_early_drop_cfg *cfg,
|
||||
const uint8_t *early_drop_buf)
|
||||
{
|
||||
- uint64_t *ext_params = (uint64_t *)early_drop_buf;
|
||||
+ const uint64_t *ext_params = (const uint64_t *)early_drop_buf;
|
||||
|
||||
DPNI_EXT_EARLY_DROP(ext_params, cfg);
|
||||
}
|
@ -0,0 +1,57 @@
|
||||
From 51106cb1fd14dfbf62c2760921463376f56ac732 Mon Sep 17 00:00:00 2001
|
||||
From: Bogdan Purcareata <bogdan.purcareata@nxp.com>
|
||||
Date: Tue, 21 Jun 2016 18:40:47 +0000
|
||||
Subject: [PATCH 205/226] fsl-dpaa2: eth: sanitize supported private flags
|
||||
|
||||
On linux-v4.6 with CONFIG_MACVLAN=y, when bringing up a ni interface, the
|
||||
network stack crashes due to a segfault. This is related to the
|
||||
macvlan_device_event notifier, which registers itself to all the network
|
||||
interface in the system.
|
||||
|
||||
The notifier reads the netdev private flags and incorrectly qualifies
|
||||
the interface as a macvlan port, since both the IFF_MACVLAN_PORT and
|
||||
IFF_PROMISC flags have the same offset. Code spelunking reveals that
|
||||
IFF_PROMISC is only used as an interface flag, not a private interface
|
||||
flag.
|
||||
|
||||
A similar situation happens with IFF_ALLMULTI, which overlaps with
|
||||
IFF_BRIDGE_PORT. No info on the consequences of this, since I haven't
|
||||
tested bridge scenarios. The interface can still be set in allmulti
|
||||
mode using userspace tools (e.g. ifconfig).
|
||||
|
||||
IFF_MULTICAST overlaps with IFF_UNICAST_FLT, therefore the current code
|
||||
has no effect as it is. The closest multicast activation based on device
|
||||
capabilities has been seen in the case of the Aeroflex Gaisler Ethernet
|
||||
MAC (aeroflex/greth.c) - here, the runtime (not private) flag is set on
|
||||
device probe. On a side node, ether_setup enables IFF_MULTICAST by default.
|
||||
|
||||
Remove IFF_PROMISC, IFF_ALLMULTI and IFF_MULTICAST from device capabilities
|
||||
init.
|
||||
|
||||
Signed-off-by: Bogdan Purcareata <bogdan.purcareata@nxp.com>
|
||||
---
|
||||
drivers/staging/fsl-dpaa2/ethernet/dpaa2-eth.c | 7 +------
|
||||
1 file changed, 1 insertion(+), 6 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-dpaa2/ethernet/dpaa2-eth.c
|
||||
+++ b/drivers/staging/fsl-dpaa2/ethernet/dpaa2-eth.c
|
||||
@@ -1176,18 +1176,13 @@ static int dpaa2_eth_init(struct net_dev
|
||||
u32 options = priv->dpni_attrs.options;
|
||||
|
||||
/* Capabilities listing */
|
||||
- supported |= IFF_LIVE_ADDR_CHANGE | IFF_PROMISC | IFF_ALLMULTI;
|
||||
+ supported |= IFF_LIVE_ADDR_CHANGE;
|
||||
|
||||
if (options & DPNI_OPT_UNICAST_FILTER)
|
||||
supported |= IFF_UNICAST_FLT;
|
||||
else
|
||||
not_supported |= IFF_UNICAST_FLT;
|
||||
|
||||
- if (options & DPNI_OPT_MULTICAST_FILTER)
|
||||
- supported |= IFF_MULTICAST;
|
||||
- else
|
||||
- not_supported |= IFF_MULTICAST;
|
||||
-
|
||||
net_dev->priv_flags |= supported;
|
||||
net_dev->priv_flags &= ~not_supported;
|
||||
|
@ -0,0 +1,26 @@
|
||||
From 7e536d0c2f870b39480268c20af6fc3d21abe611 Mon Sep 17 00:00:00 2001
|
||||
From: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Date: Wed, 15 Jun 2016 14:03:43 -0500
|
||||
Subject: [PATCH 206/226] fsl-dpaa2: eth: match id cleanup
|
||||
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
---
|
||||
drivers/staging/fsl-dpaa2/ethernet/dpaa2-eth.c | 4 +---
|
||||
1 file changed, 1 insertion(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-dpaa2/ethernet/dpaa2-eth.c
|
||||
+++ b/drivers/staging/fsl-dpaa2/ethernet/dpaa2-eth.c
|
||||
@@ -2787,12 +2787,10 @@ static int dpaa2_eth_remove(struct fsl_m
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static const struct fsl_mc_device_match_id dpaa2_eth_match_id_table[] = {
|
||||
+static const struct fsl_mc_device_id dpaa2_eth_match_id_table[] = {
|
||||
{
|
||||
.vendor = FSL_MC_VENDOR_FREESCALE,
|
||||
.obj_type = "dpni",
|
||||
- .ver_major = DPNI_VER_MAJOR,
|
||||
- .ver_minor = DPNI_VER_MINOR
|
||||
},
|
||||
{ .vendor = 0x0 }
|
||||
};
|
@ -0,0 +1,22 @@
|
||||
From 8557c8a3823b341607e16048d8318a1958eab3a9 Mon Sep 17 00:00:00 2001
|
||||
From: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Date: Thu, 12 May 2016 17:52:28 -0500
|
||||
Subject: [PATCH 207/226] fsl-dpaa2: eth: add device table to driver
|
||||
|
||||
this is needed to have the driver loaded as a module
|
||||
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
---
|
||||
drivers/staging/fsl-dpaa2/ethernet/dpaa2-eth.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/drivers/staging/fsl-dpaa2/ethernet/dpaa2-eth.c
|
||||
+++ b/drivers/staging/fsl-dpaa2/ethernet/dpaa2-eth.c
|
||||
@@ -2794,6 +2794,7 @@ static const struct fsl_mc_device_id dpa
|
||||
},
|
||||
{ .vendor = 0x0 }
|
||||
};
|
||||
+MODULE_DEVICE_TABLE(fslmc, dpaa2_eth_match_id_table);
|
||||
|
||||
static struct fsl_mc_driver dpaa2_eth_driver = {
|
||||
.driver = {
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,182 @@
|
||||
From bb42890533f9592e8d30654b4e0b19c3cf7caaec Mon Sep 17 00:00:00 2001
|
||||
From: Ioana Radulescu <ruxandra.radulescu@nxp.com>
|
||||
Date: Fri, 1 Apr 2016 18:38:18 +0300
|
||||
Subject: [PATCH 209/226] staging: fsl-dpaa2/mac: Interrupt code cleanup
|
||||
|
||||
Cleanup and a couple of minor fixes for the interrupt
|
||||
handling code:
|
||||
* Removed a few unnecessary checks, unify format for others
|
||||
* Don't print error/debug messages in interrupt handler
|
||||
* No need to explicitly disable DPMAC interrupts before
|
||||
configuring them
|
||||
* Use unlikely in interrupt handler routine error checks
|
||||
* if status register is zero or we're unable to read its value,
|
||||
return IRQ_NONE instead of IRQ_HANDLED
|
||||
* always clear the entire status register, not just the bit(s)
|
||||
that were treated
|
||||
|
||||
Signed-off-by: Ioana Radulescu <ruxandra.radulescu@nxp.com>
|
||||
(cherry picked from commit 4b46eec16c56e4f453ca1558af9aceaf6ffe831a)
|
||||
(Stuart:resolved merge conflict)
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
---
|
||||
drivers/staging/fsl-dpaa2/mac/mac.c | 77 ++++++++---------------------------
|
||||
1 file changed, 16 insertions(+), 61 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-dpaa2/mac/mac.c
|
||||
+++ b/drivers/staging/fsl-dpaa2/mac/mac.c
|
||||
@@ -132,7 +132,7 @@ static void dpaa2_mac_link_changed(struc
|
||||
}
|
||||
|
||||
/* IRQ bits that we handle */
|
||||
-static const u32 dpmac_irq_mask = DPMAC_IRQ_EVENT_LINK_CFG_REQ;
|
||||
+static const u32 dpmac_irq_mask = DPMAC_IRQ_EVENT_LINK_CFG_REQ;
|
||||
|
||||
#ifdef CONFIG_FSL_DPAA2_MAC_NETDEVS
|
||||
static netdev_tx_t dpaa2_mac_drop_frame(struct sk_buff *skb,
|
||||
@@ -345,16 +345,13 @@ static const struct ethtool_ops dpaa2_ma
|
||||
};
|
||||
#endif /* CONFIG_FSL_DPAA2_MAC_NETDEVS */
|
||||
|
||||
-static int configure_link(struct dpaa2_mac_priv *priv,
|
||||
- struct dpmac_link_cfg *cfg)
|
||||
+static void configure_link(struct dpaa2_mac_priv *priv,
|
||||
+ struct dpmac_link_cfg *cfg)
|
||||
{
|
||||
struct phy_device *phydev = priv->netdev->phydev;
|
||||
|
||||
- if (!phydev) {
|
||||
- dev_warn(priv->netdev->dev.parent,
|
||||
- "asked to change PHY settings but PHY ref is NULL, ignoring\n");
|
||||
- return 0;
|
||||
- }
|
||||
+ if (unlikely(!phydev))
|
||||
+ return;
|
||||
|
||||
phydev->speed = cfg->rate;
|
||||
phydev->duplex = !!(cfg->options & DPMAC_LINK_OPT_HALF_DUPLEX);
|
||||
@@ -368,8 +365,6 @@ static int configure_link(struct dpaa2_m
|
||||
}
|
||||
|
||||
phy_start_aneg(phydev);
|
||||
-
|
||||
- return 0;
|
||||
}
|
||||
|
||||
static irqreturn_t dpaa2_mac_irq_handler(int irq_num, void *arg)
|
||||
@@ -378,53 +373,29 @@ static irqreturn_t dpaa2_mac_irq_handler
|
||||
struct fsl_mc_device *mc_dev = to_fsl_mc_device(dev);
|
||||
struct dpaa2_mac_priv *priv = dev_get_drvdata(dev);
|
||||
struct dpmac_link_cfg link_cfg;
|
||||
- u8 irq_index = DPMAC_IRQ_INDEX;
|
||||
- u32 status, clear = 0;
|
||||
+ u32 status;
|
||||
int err;
|
||||
|
||||
- if (mc_dev->irqs[0]->msi_desc->irq != irq_num) {
|
||||
- dev_err(dev, "received unexpected interrupt %d!\n", irq_num);
|
||||
- goto err;
|
||||
- }
|
||||
-
|
||||
err = dpmac_get_irq_status(mc_dev->mc_io, 0, mc_dev->mc_handle,
|
||||
- irq_index, &status);
|
||||
- if (err) {
|
||||
- dev_err(dev, "dpmac_get_irq_status err %d\n", err);
|
||||
- clear = ~0x0u;
|
||||
- goto out;
|
||||
- }
|
||||
+ DPMAC_IRQ_INDEX, &status);
|
||||
+ if (unlikely(err || !status))
|
||||
+ return IRQ_NONE;
|
||||
|
||||
/* DPNI-initiated link configuration; 'ifconfig up' also calls this */
|
||||
if (status & DPMAC_IRQ_EVENT_LINK_CFG_REQ) {
|
||||
- dev_dbg(dev, "DPMAC IRQ %d - LINK_CFG_REQ\n", irq_num);
|
||||
- clear |= DPMAC_IRQ_EVENT_LINK_CFG_REQ;
|
||||
-
|
||||
err = dpmac_get_link_cfg(mc_dev->mc_io, 0, mc_dev->mc_handle,
|
||||
&link_cfg);
|
||||
- if (err) {
|
||||
- dev_err(dev, "dpmac_get_link_cfg err %d\n", err);
|
||||
+ if (unlikely(err))
|
||||
goto out;
|
||||
- }
|
||||
|
||||
- err = configure_link(priv, &link_cfg);
|
||||
- if (err) {
|
||||
- dev_err(dev, "cannot configure link\n");
|
||||
- goto out;
|
||||
- }
|
||||
+ configure_link(priv, &link_cfg);
|
||||
}
|
||||
|
||||
out:
|
||||
- err = dpmac_clear_irq_status(mc_dev->mc_io, 0, mc_dev->mc_handle,
|
||||
- irq_index, clear);
|
||||
- if (err < 0)
|
||||
- dev_err(&mc_dev->dev, "dpmac_clear_irq_status() err %d\n", err);
|
||||
+ dpmac_clear_irq_status(mc_dev->mc_io, 0, mc_dev->mc_handle,
|
||||
+ DPMAC_IRQ_INDEX, status);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
-
|
||||
-err:
|
||||
- dev_warn(dev, "DPMAC IRQ %d was not handled!\n", irq_num);
|
||||
- return IRQ_NONE;
|
||||
}
|
||||
|
||||
static int setup_irqs(struct fsl_mc_device *mc_dev)
|
||||
@@ -437,19 +408,6 @@ static int setup_irqs(struct fsl_mc_devi
|
||||
return err;
|
||||
}
|
||||
|
||||
- err = dpmac_set_irq_mask(mc_dev->mc_io, 0, mc_dev->mc_handle,
|
||||
- DPMAC_IRQ_INDEX, dpmac_irq_mask);
|
||||
- if (err < 0) {
|
||||
- dev_err(&mc_dev->dev, "dpmac_set_irq_mask err %d\n", err);
|
||||
- goto free_irq;
|
||||
- }
|
||||
- err = dpmac_set_irq_enable(mc_dev->mc_io, 0, mc_dev->mc_handle,
|
||||
- DPMAC_IRQ_INDEX, 0);
|
||||
- if (err) {
|
||||
- dev_err(&mc_dev->dev, "dpmac_set_irq_enable err %d\n", err);
|
||||
- goto free_irq;
|
||||
- }
|
||||
-
|
||||
err = devm_request_threaded_irq(&mc_dev->dev,
|
||||
mc_dev->irqs[0]->msi_desc->irq,
|
||||
NULL, &dpaa2_mac_irq_handler,
|
||||
@@ -463,7 +421,7 @@ static int setup_irqs(struct fsl_mc_devi
|
||||
|
||||
err = dpmac_set_irq_mask(mc_dev->mc_io, 0, mc_dev->mc_handle,
|
||||
DPMAC_IRQ_INDEX, dpmac_irq_mask);
|
||||
- if (err < 0) {
|
||||
+ if (err) {
|
||||
dev_err(&mc_dev->dev, "dpmac_set_irq_mask err %d\n", err);
|
||||
goto free_irq;
|
||||
}
|
||||
@@ -490,12 +448,12 @@ static void teardown_irqs(struct fsl_mc_
|
||||
|
||||
err = dpmac_set_irq_mask(mc_dev->mc_io, 0, mc_dev->mc_handle,
|
||||
DPMAC_IRQ_INDEX, dpmac_irq_mask);
|
||||
- if (err < 0)
|
||||
+ if (err)
|
||||
dev_err(&mc_dev->dev, "dpmac_set_irq_mask err %d\n", err);
|
||||
|
||||
err = dpmac_set_irq_enable(mc_dev->mc_io, 0, mc_dev->mc_handle,
|
||||
DPMAC_IRQ_INDEX, 0);
|
||||
- if (err < 0)
|
||||
+ if (err)
|
||||
dev_err(&mc_dev->dev, "dpmac_set_irq_enable err %d\n", err);
|
||||
|
||||
devm_free_irq(&mc_dev->dev, mc_dev->irqs[0]->msi_desc->irq, &mc_dev->dev);
|
||||
@@ -562,9 +520,6 @@ static int dpaa2_mac_probe(struct fsl_mc
|
||||
phy_interface_t if_mode;
|
||||
int err = 0;
|
||||
|
||||
- /* just being completely paranoid */
|
||||
- if (!mc_dev)
|
||||
- return -EFAULT;
|
||||
dev = &mc_dev->dev;
|
||||
|
||||
/* prepare a net_dev structure to make the phy lib API happy */
|
@ -0,0 +1,42 @@
|
||||
From e74b6010eca026625ba4e39c80620320ca777deb Mon Sep 17 00:00:00 2001
|
||||
From: Ioana Radulescu <ruxandra.radulescu@nxp.com>
|
||||
Date: Tue, 5 Apr 2016 13:35:14 +0300
|
||||
Subject: [PATCH 210/226] staging: fsl-dpaa2/mac: Fix unregister_netdev issue
|
||||
|
||||
We only register the netdevice associated with a mac object if
|
||||
ONFIG_FSL_DPAA2_MAC_NETDEV is set, but we always unregister it
|
||||
during device remove(). Fix this by ifdef-ing the unregister
|
||||
operation.
|
||||
|
||||
Also ifdef the change in netdevice name as it only makes sense
|
||||
under this option.
|
||||
|
||||
Signed-off-by: Ioana Radulescu <ruxandra.radulescu@nxp.com>
|
||||
(cherry picked from commit dd6a5313e194168d46fef495a6e3bc5207801473)
|
||||
---
|
||||
drivers/staging/fsl-dpaa2/mac/mac.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
--- a/drivers/staging/fsl-dpaa2/mac/mac.c
|
||||
+++ b/drivers/staging/fsl-dpaa2/mac/mac.c
|
||||
@@ -534,7 +534,10 @@ static int dpaa2_mac_probe(struct fsl_mc
|
||||
priv->netdev = netdev;
|
||||
|
||||
SET_NETDEV_DEV(netdev, dev);
|
||||
+
|
||||
+#ifdef CONFIG_FSL_DPAA2_MAC_NETDEVS
|
||||
snprintf(netdev->name, IFNAMSIZ, "mac%d", mc_dev->obj_desc.id);
|
||||
+#endif
|
||||
|
||||
dev_set_drvdata(dev, priv);
|
||||
|
||||
@@ -684,7 +687,9 @@ static int dpaa2_mac_remove(struct fsl_m
|
||||
struct device *dev = &mc_dev->dev;
|
||||
struct dpaa2_mac_priv *priv = dev_get_drvdata(dev);
|
||||
|
||||
+#ifdef CONFIG_FSL_DPAA2_MAC_NETDEVS
|
||||
unregister_netdev(priv->netdev);
|
||||
+#endif
|
||||
teardown_irqs(priv->mc_dev);
|
||||
dpmac_close(priv->mc_dev->mc_io, 0, priv->mc_dev->mc_handle);
|
||||
fsl_mc_portal_free(priv->mc_dev->mc_io);
|
@ -0,0 +1,42 @@
|
||||
From b4d01330c66cbab3563c58f66f73f55726c09aec Mon Sep 17 00:00:00 2001
|
||||
From: Ioana Radulescu <ruxandra.radulescu@nxp.com>
|
||||
Date: Tue, 5 Apr 2016 17:54:14 +0300
|
||||
Subject: [PATCH 211/226] staging: fsl-dpaa2/mac: Don't call devm_free_irq
|
||||
|
||||
MAC interrupts are registered with devm_request_threaded_irq(), so
|
||||
there's no need to explicitly unregister them in case of a probe
|
||||
error or at device remove, as the kernel will take care of that for us.
|
||||
|
||||
Signed-off-by: Ioana Radulescu <ruxandra.radulescu@nxp.com>
|
||||
(cherry picked from commit 58e0fd23ade4b13e0a3c7e5f201802013e12df1c)
|
||||
(Stuart: resolved merge conflict)
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
---
|
||||
drivers/staging/fsl-dpaa2/mac/mac.c | 5 +----
|
||||
1 file changed, 1 insertion(+), 4 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-dpaa2/mac/mac.c
|
||||
+++ b/drivers/staging/fsl-dpaa2/mac/mac.c
|
||||
@@ -429,13 +429,11 @@ static int setup_irqs(struct fsl_mc_devi
|
||||
DPMAC_IRQ_INDEX, 1);
|
||||
if (err) {
|
||||
dev_err(&mc_dev->dev, "dpmac_set_irq_enable err %d\n", err);
|
||||
- goto unregister_irq;
|
||||
+ goto free_irq;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
-unregister_irq:
|
||||
- devm_free_irq(&mc_dev->dev, mc_dev->irqs[0]->msi_desc->irq, &mc_dev->dev);
|
||||
free_irq:
|
||||
fsl_mc_free_irqs(mc_dev);
|
||||
|
||||
@@ -456,7 +454,6 @@ static void teardown_irqs(struct fsl_mc_
|
||||
if (err)
|
||||
dev_err(&mc_dev->dev, "dpmac_set_irq_enable err %d\n", err);
|
||||
|
||||
- devm_free_irq(&mc_dev->dev, mc_dev->irqs[0]->msi_desc->irq, &mc_dev->dev);
|
||||
fsl_mc_free_irqs(mc_dev);
|
||||
}
|
||||
|
@ -0,0 +1,43 @@
|
||||
From e554a03fe11719db373be3c54ce8f230a98dd5e4 Mon Sep 17 00:00:00 2001
|
||||
From: Ioana Radulescu <ruxandra.radulescu@nxp.com>
|
||||
Date: Wed, 6 Apr 2016 15:05:47 +0300
|
||||
Subject: [PATCH 212/226] staging: fsl-dpaa2/mac: Use of_property_read_32()
|
||||
|
||||
Simplify reading of the dpmac id from device tree.
|
||||
|
||||
Signed-off-by: Ioana Radulescu <ruxandra.radulescu@nxp.com>
|
||||
(cherry picked from commit b0562bda063f95923bcd8b78dea84a6e0587d3da)
|
||||
---
|
||||
drivers/staging/fsl-dpaa2/mac/mac.c | 13 +++++--------
|
||||
1 file changed, 5 insertions(+), 8 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-dpaa2/mac/mac.c
|
||||
+++ b/drivers/staging/fsl-dpaa2/mac/mac.c
|
||||
@@ -461,9 +461,8 @@ static struct device_node *lookup_node(s
|
||||
{
|
||||
struct device_node *dpmacs, *dpmac = NULL;
|
||||
struct device_node *mc_node = dev->of_node;
|
||||
- const void *id;
|
||||
- int lenp;
|
||||
- int dpmac_id_be32 = cpu_to_be32(dpmac_id);
|
||||
+ u32 id;
|
||||
+ int err;
|
||||
|
||||
dpmacs = of_find_node_by_name(mc_node, "dpmacs");
|
||||
if (!dpmacs) {
|
||||
@@ -472,12 +471,10 @@ static struct device_node *lookup_node(s
|
||||
}
|
||||
|
||||
while ((dpmac = of_get_next_child(dpmacs, dpmac))) {
|
||||
- id = of_get_property(dpmac, "reg", &lenp);
|
||||
- if (!id || lenp != sizeof(int)) {
|
||||
- dev_warn(dev, "Unsuitable reg property in dpmac node\n");
|
||||
+ err = of_property_read_u32(dpmac, "reg", &id);
|
||||
+ if (err)
|
||||
continue;
|
||||
- }
|
||||
- if (*(int *)id == dpmac_id_be32)
|
||||
+ if (id == dpmac_id)
|
||||
return dpmac;
|
||||
}
|
||||
|
@ -0,0 +1,61 @@
|
||||
From 3e4dc755337ca86d29c9f21f5225a77595aee032 Mon Sep 17 00:00:00 2001
|
||||
From: Ioana Radulescu <ruxandra.radulescu@nxp.com>
|
||||
Date: Wed, 6 Apr 2016 12:12:06 +0300
|
||||
Subject: [PATCH 213/226] staging: fsl-dpaa2/mac: Remove version checks
|
||||
|
||||
We intend to ensure backward compatibility with all MC versions
|
||||
going forward, so we don't require an exact version match anymore
|
||||
between MAC driver, DPMAC API version and DPMAC object version in
|
||||
MC firmware.
|
||||
|
||||
Signed-off-by: Ioana Radulescu <ruxandra.radulescu@nxp.com>
|
||||
(cherry picked from commit eafc210ef421fb0dca67b67bf1a2fe98cd060c31)
|
||||
---
|
||||
drivers/staging/fsl-dpaa2/mac/mac.c | 29 ++---------------------------
|
||||
1 file changed, 2 insertions(+), 27 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-dpaa2/mac/mac.c
|
||||
+++ b/drivers/staging/fsl-dpaa2/mac/mac.c
|
||||
@@ -481,30 +481,6 @@ static struct device_node *lookup_node(s
|
||||
return NULL;
|
||||
}
|
||||
|
||||
-static int check_dpmac_version(struct dpaa2_mac_priv *priv)
|
||||
-{
|
||||
- struct device *dev = &priv->mc_dev->dev;
|
||||
- int mc_version = priv->attr.version.major;
|
||||
-
|
||||
- /* Check that the FLIB-defined version matches the one reported by MC */
|
||||
- if (mc_version != DPMAC_VER_MAJOR) {
|
||||
- dev_err(dev, "DPMAC FLIB version mismatch: MC says %d, we have %d\n",
|
||||
- mc_version, DPMAC_VER_MAJOR);
|
||||
- return -EINVAL;
|
||||
- }
|
||||
-
|
||||
- /* ... and that we actually support it */
|
||||
- if (mc_version < DPAA2_SUPPORTED_DPMAC_VERSION) {
|
||||
- dev_err(dev, "Unsupported DPMAC FLIB version (%d)\n",
|
||||
- mc_version);
|
||||
- return -EINVAL;
|
||||
- }
|
||||
-
|
||||
- dev_dbg(dev, "Using DPMAC FLIB version %d\n", mc_version);
|
||||
-
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
static int dpaa2_mac_probe(struct fsl_mc_device *mc_dev)
|
||||
{
|
||||
struct device *dev;
|
||||
@@ -558,9 +534,8 @@ static int dpaa2_mac_probe(struct fsl_mc
|
||||
goto err_close;
|
||||
}
|
||||
|
||||
- err = check_dpmac_version(priv);
|
||||
- if (err)
|
||||
- goto err_close;
|
||||
+ dev_info_once(dev, "Using DPMAC API %d.%d\n",
|
||||
+ priv->attr.version.major, priv->attr.version.minor);
|
||||
|
||||
/* Look up the DPMAC node in the device-tree. */
|
||||
dpmac_node = lookup_node(dev, priv->attr.id);
|
@ -0,0 +1,26 @@
|
||||
From 137f5f17bad655024d18123b1be696ad6b9ec729 Mon Sep 17 00:00:00 2001
|
||||
From: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Date: Wed, 15 Jun 2016 14:04:32 -0500
|
||||
Subject: [PATCH 214/226] staging: fsl-dpaa2/mac: match id cleanup
|
||||
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
---
|
||||
drivers/staging/fsl-dpaa2/mac/mac.c | 4 +---
|
||||
1 file changed, 1 insertion(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-dpaa2/mac/mac.c
|
||||
+++ b/drivers/staging/fsl-dpaa2/mac/mac.c
|
||||
@@ -670,12 +670,10 @@ static int dpaa2_mac_remove(struct fsl_m
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static const struct fsl_mc_device_match_id dpaa2_mac_match_id_table[] = {
|
||||
+static const struct fsl_mc_device_id dpaa2_mac_match_id_table[] = {
|
||||
{
|
||||
.vendor = FSL_MC_VENDOR_FREESCALE,
|
||||
.obj_type = "dpmac",
|
||||
- .ver_major = DPMAC_VER_MAJOR,
|
||||
- .ver_minor = DPMAC_VER_MINOR,
|
||||
},
|
||||
{}
|
||||
};
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,69 @@
|
||||
From 4efb592d8a931669df5df04bedcae8cbc85c3700 Mon Sep 17 00:00:00 2001
|
||||
From: Razvan Stefanescu <razvan.stefanescu@freescale.com>
|
||||
Date: Wed, 17 Feb 2016 16:31:01 +0200
|
||||
Subject: [PATCH 216/226] dpaa2-evb: Fix interrupt handling
|
||||
|
||||
Mask only the events handled by the driver - DPDMUX_IRQ_EVENT_LINK_CHANGED.
|
||||
|
||||
Use clear-on-read mechanism for the interrupt status and avoid calling
|
||||
dpdmux_clear_irq_status(). Status contains the events handled (only link
|
||||
state change for the moment) and masks the first 16-bits, as they are used
|
||||
to store the interface ID that generated the event.
|
||||
|
||||
Signed-off-by: Razvan Stefanescu <razvan.stefanescu@freescale.com>
|
||||
---
|
||||
drivers/staging/fsl-dpaa2/evb/evb.c | 20 ++++++++++----------
|
||||
1 file changed, 10 insertions(+), 10 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-dpaa2/evb/evb.c
|
||||
+++ b/drivers/staging/fsl-dpaa2/evb/evb.c
|
||||
@@ -151,7 +151,9 @@ static irqreturn_t _evb_irq0_handler_thr
|
||||
struct fsl_mc_io *io = priv->mc_io;
|
||||
uint16_t token = priv->mux_handle;
|
||||
int irq_index = DPDMUX_IRQ_INDEX_IF;
|
||||
- uint32_t status = 0, clear = 0;
|
||||
+
|
||||
+ /* Mask the events and the if_id reserved bits to be cleared on read */
|
||||
+ uint32_t status = DPDMUX_IRQ_EVENT_LINK_CHANGED | 0xFFFF0000;
|
||||
int err;
|
||||
|
||||
/* Sanity check */
|
||||
@@ -163,23 +165,21 @@ static irqreturn_t _evb_irq0_handler_thr
|
||||
err = dpdmux_get_irq_status(io, 0, token, irq_index, &status);
|
||||
if (unlikely(err)) {
|
||||
netdev_err(netdev, "Can't get irq status (err %d)", err);
|
||||
- clear = 0xffffffff;
|
||||
+ err = dpdmux_clear_irq_status(io, 0, token, irq_index,
|
||||
+ 0xFFFFFFFF);
|
||||
+ if (unlikely(err))
|
||||
+ netdev_err(netdev, "Can't clear irq status (err %d)",
|
||||
+ err);
|
||||
goto out;
|
||||
}
|
||||
|
||||
- /* FIXME clear irq status */
|
||||
-
|
||||
if (status & DPDMUX_IRQ_EVENT_LINK_CHANGED) {
|
||||
- clear |= DPDMUX_IRQ_EVENT_LINK_CHANGED;
|
||||
-
|
||||
err = evb_links_state_update(priv);
|
||||
if (unlikely(err))
|
||||
goto out;
|
||||
}
|
||||
+
|
||||
out:
|
||||
- err = dpdmux_clear_irq_status(io, 0, token, irq_index, clear);
|
||||
- if (unlikely(err))
|
||||
- netdev_err(netdev, "Can't clear irq status (err %d)", err);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
@@ -191,7 +191,7 @@ static int evb_setup_irqs(struct fsl_mc_
|
||||
int err = 0;
|
||||
struct fsl_mc_device_irq *irq;
|
||||
const int irq_index = DPDMUX_IRQ_INDEX_IF;
|
||||
- uint32_t mask = ~0x0u; /* FIXME: unmask handled irqs */
|
||||
+ uint32_t mask = DPDMUX_IRQ_EVENT_LINK_CHANGED;
|
||||
|
||||
err = fsl_mc_allocate_irqs(evb_dev);
|
||||
if (unlikely(err)) {
|
@ -0,0 +1,43 @@
|
||||
From 213c59501bbd6da8c56e95f90f8a8c6af2682002 Mon Sep 17 00:00:00 2001
|
||||
From: Razvan Stefanescu <razvan.stefanescu@freescale.com>
|
||||
Date: Thu, 18 Feb 2016 10:54:40 +0200
|
||||
Subject: [PATCH 217/226] dpaa2-evb: Add object version check
|
||||
|
||||
Abort probing if DPDMUX object version is smaller than required.
|
||||
|
||||
Signed-off-by: Razvan Stefanescu <razvan.stefanescu@freescale.com>
|
||||
---
|
||||
drivers/staging/fsl-dpaa2/evb/evb.c | 15 +++++++++++++++
|
||||
1 file changed, 15 insertions(+)
|
||||
|
||||
--- a/drivers/staging/fsl-dpaa2/evb/evb.c
|
||||
+++ b/drivers/staging/fsl-dpaa2/evb/evb.c
|
||||
@@ -44,6 +44,10 @@
|
||||
#include "dpdmux.h"
|
||||
#include "dpdmux-cmd.h"
|
||||
|
||||
+/* Minimal supported DPDMUX version */
|
||||
+#define DPDMUX_MIN_VER_MAJOR 5
|
||||
+#define DPDMUX_MIN_VER_MINOR 0
|
||||
+
|
||||
/* IRQ index */
|
||||
#define DPDMUX_MAX_IRQ_NUM 2
|
||||
|
||||
@@ -1004,6 +1008,17 @@ static int evb_init(struct fsl_mc_device
|
||||
goto err_close;
|
||||
}
|
||||
|
||||
+ /* Minimum supported DPDMUX version check */
|
||||
+ if (priv->attr.version.major < DPDMUX_MIN_VER_MAJOR ||
|
||||
+ (priv->attr.version.major == DPDMUX_MIN_VER_MAJOR &&
|
||||
+ priv->attr.version.minor < DPDMUX_MIN_VER_MINOR)) {
|
||||
+ dev_err(dev, "DPDMUX version %d.%d not supported. Use %d.%d or greater.\n",
|
||||
+ priv->attr.version.major, priv->attr.version.minor,
|
||||
+ DPDMUX_MIN_VER_MAJOR, DPDMUX_MIN_VER_MAJOR);
|
||||
+ err = -ENOTSUPP;
|
||||
+ goto err_close;
|
||||
+ }
|
||||
+
|
||||
err = dpdmux_reset(priv->mc_io, 0, priv->mux_handle);
|
||||
if (unlikely(err)) {
|
||||
dev_err(dev, "dpdmux_reset err %d\n", err);
|
@ -0,0 +1,20 @@
|
||||
From 54d026dafa1f7d17758615736123917cc4f3f203 Mon Sep 17 00:00:00 2001
|
||||
From: Mihai Caraman <mihai.caraman@freescale.com>
|
||||
Date: Tue, 5 Apr 2016 14:12:10 +0000
|
||||
Subject: [PATCH 218/226] dpaa2-evb: Cosmetic cleanup
|
||||
|
||||
Replace obsolete terms.
|
||||
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
---
|
||||
drivers/staging/fsl-dpaa2/evb/evb.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/staging/fsl-dpaa2/evb/evb.c
|
||||
+++ b/drivers/staging/fsl-dpaa2/evb/evb.c
|
||||
@@ -1228,4 +1228,4 @@ static struct fsl_mc_driver evb_drv = {
|
||||
module_fsl_mc_driver(evb_drv);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
-MODULE_DESCRIPTION("Layerscape DPAA Edge Virtual Bridge driver (prototype)");
|
||||
+MODULE_DESCRIPTION("DPAA2 Edge Virtual Bridge driver (prototype)");
|
@ -0,0 +1,26 @@
|
||||
From 744bd6494a51443c2a7d32ed76e94e4fc5bd2404 Mon Sep 17 00:00:00 2001
|
||||
From: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Date: Thu, 14 Jul 2016 17:32:23 -0500
|
||||
Subject: [PATCH 219/226] dpaa2-evb: match id cleanup
|
||||
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
---
|
||||
drivers/staging/fsl-dpaa2/evb/evb.c | 4 +---
|
||||
1 file changed, 1 insertion(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-dpaa2/evb/evb.c
|
||||
+++ b/drivers/staging/fsl-dpaa2/evb/evb.c
|
||||
@@ -1205,12 +1205,10 @@ err_free_netdev:
|
||||
return err;
|
||||
}
|
||||
|
||||
-static const struct fsl_mc_device_match_id evb_match_id_table[] = {
|
||||
+static const struct fsl_mc_device_id evb_match_id_table[] = {
|
||||
{
|
||||
.vendor = FSL_MC_VENDOR_FREESCALE,
|
||||
.obj_type = "dpdmux",
|
||||
- .ver_major = DPDMUX_VER_MAJOR,
|
||||
- .ver_minor = DPDMUX_VER_MINOR,
|
||||
},
|
||||
{}
|
||||
};
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,26 @@
|
||||
From 535826c8b725f752e5da17ea576d6d96e7d53f13 Mon Sep 17 00:00:00 2001
|
||||
From: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Date: Fri, 15 Jul 2016 13:13:41 -0500
|
||||
Subject: [PATCH 221/226] dpaa2-ethsw: match id cleanup
|
||||
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
---
|
||||
drivers/staging/fsl-dpaa2/ethsw/switch.c | 4 +---
|
||||
1 file changed, 1 insertion(+), 3 deletions(-)
|
||||
|
||||
--- a/drivers/staging/fsl-dpaa2/ethsw/switch.c
|
||||
+++ b/drivers/staging/fsl-dpaa2/ethsw/switch.c
|
||||
@@ -1685,12 +1685,10 @@ err_free_netdev:
|
||||
return err;
|
||||
}
|
||||
|
||||
-static const struct fsl_mc_device_match_id ethsw_match_id_table[] = {
|
||||
+static const struct fsl_mc_device_id ethsw_match_id_table[] = {
|
||||
{
|
||||
.vendor = FSL_MC_VENDOR_FREESCALE,
|
||||
.obj_type = "dpsw",
|
||||
- .ver_major = DPSW_VER_MAJOR,
|
||||
- .ver_minor = DPSW_VER_MINOR,
|
||||
},
|
||||
{}
|
||||
};
|
@ -0,0 +1,21 @@
|
||||
From c51ed10a001d3fd5b80b7bb92f2d5182f1d9fa5a Mon Sep 17 00:00:00 2001
|
||||
From: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Date: Thu, 25 Aug 2016 16:10:12 -0500
|
||||
Subject: [PATCH 222/226] dpaa2-ethsw: fix compile error on backport to 4.4
|
||||
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
---
|
||||
drivers/staging/fsl-dpaa2/ethsw/switch.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/staging/fsl-dpaa2/ethsw/switch.c
|
||||
+++ b/drivers/staging/fsl-dpaa2/ethsw/switch.c
|
||||
@@ -1625,7 +1625,7 @@ ethsw_probe(struct fsl_mc_device *sw_dev
|
||||
|
||||
rtnl_lock();
|
||||
|
||||
- err = netdev_master_upper_dev_link(port_netdev, netdev, NULL, NULL);
|
||||
+ err = netdev_master_upper_dev_link(port_netdev, netdev);
|
||||
if (err) {
|
||||
dev_err(dev, "netdev_master_upper_dev_link error %d\n",
|
||||
err);
|
@ -0,0 +1,26 @@
|
||||
From b565bd9a6011819ff66bd4fa0a50f7e54dff2753 Mon Sep 17 00:00:00 2001
|
||||
From: "J. German Rivera" <German.Rivera@freescale.com>
|
||||
Date: Wed, 6 Jan 2016 16:03:19 -0600
|
||||
Subject: [PATCH 223/226] irqdomain: Added domain bus token
|
||||
DOMAIN_BUS_FSL_MC_MSI
|
||||
|
||||
Since an FSL-MC bus is a new bus type that is neither PCI nor
|
||||
PLATFORM, we need a new domain bus token to disambiguate the
|
||||
IRQ domain for FSL-MC MSIs.
|
||||
|
||||
Signed-off-by: J. German Rivera <German.Rivera@freescale.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
include/linux/irqdomain.h | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
--- a/include/linux/irqdomain.h
|
||||
+++ b/include/linux/irqdomain.h
|
||||
@@ -73,6 +73,7 @@ enum irq_domain_bus_token {
|
||||
DOMAIN_BUS_PCI_MSI,
|
||||
DOMAIN_BUS_PLATFORM_MSI,
|
||||
DOMAIN_BUS_NEXUS,
|
||||
+ DOMAIN_BUS_FSL_MC_MSI,
|
||||
};
|
||||
|
||||
/**
|
@ -0,0 +1,40 @@
|
||||
From 359c7977e003781024154da61e55181b92b12bdf Mon Sep 17 00:00:00 2001
|
||||
From: "J. German Rivera" <German.Rivera@freescale.com>
|
||||
Date: Wed, 6 Jan 2016 16:03:20 -0600
|
||||
Subject: [PATCH 224/226] fsl-mc: msi: Added FSL-MC-specific member to the
|
||||
msi_desc's union
|
||||
|
||||
FSL-MC is a bus type different from PCI and platform, so it needs
|
||||
its own member in the msi_desc's union.
|
||||
|
||||
Signed-off-by: J. German Rivera <German.Rivera@freescale.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
include/linux/msi.h | 9 +++++++++
|
||||
1 file changed, 9 insertions(+)
|
||||
|
||||
--- a/include/linux/msi.h
|
||||
+++ b/include/linux/msi.h
|
||||
@@ -33,6 +33,14 @@ struct platform_msi_desc {
|
||||
};
|
||||
|
||||
/**
|
||||
+ * fsl_mc_msi_desc - FSL-MC device specific msi descriptor data
|
||||
+ * @msi_index: The index of the MSI descriptor
|
||||
+ */
|
||||
+struct fsl_mc_msi_desc {
|
||||
+ u16 msi_index;
|
||||
+};
|
||||
+
|
||||
+/**
|
||||
* struct msi_desc - Descriptor structure for MSI based interrupts
|
||||
* @list: List head for management
|
||||
* @irq: The base interrupt number
|
||||
@@ -87,6 +95,7 @@ struct msi_desc {
|
||||
* tree wide cleanup.
|
||||
*/
|
||||
struct platform_msi_desc platform;
|
||||
+ struct fsl_mc_msi_desc fsl_mc;
|
||||
};
|
||||
};
|
||||
|
@ -0,0 +1,21 @@
|
||||
From dbdf9b1fe83f88090d88bce980885df4fac46162 Mon Sep 17 00:00:00 2001
|
||||
From: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
Date: Thu, 25 Aug 2016 11:17:52 -0500
|
||||
Subject: [PATCH 225/226] dpaa2-evb: fix 4.4 backport compile error
|
||||
|
||||
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
|
||||
---
|
||||
drivers/staging/fsl-dpaa2/evb/evb.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/drivers/staging/fsl-dpaa2/evb/evb.c
|
||||
+++ b/drivers/staging/fsl-dpaa2/evb/evb.c
|
||||
@@ -1153,7 +1153,7 @@ static int evb_probe(struct fsl_mc_devic
|
||||
}
|
||||
|
||||
rtnl_lock();
|
||||
- err = netdev_master_upper_dev_link(port_netdev, netdev, NULL, NULL);
|
||||
+ err = netdev_master_upper_dev_link(port_netdev, netdev);
|
||||
if (unlikely(err)) {
|
||||
dev_err(dev, "netdev_master_upper_dev_link err %d\n",
|
||||
err);
|
@ -0,0 +1,24 @@
|
||||
From f6f7c6ecdecfb75412a17205d9ac4905f6bc2851 Mon Sep 17 00:00:00 2001
|
||||
From: Rai Harninder <harninder.rai@nxp.com>
|
||||
Date: Thu, 18 Feb 2016 16:35:35 +0530
|
||||
Subject: [PATCH 136/141] drivers/mmc: Add compatible string for LS1088A
|
||||
|
||||
Signed-off-by: Rai Harninder <harninder.rai@nxp.com>
|
||||
Signed-off-by: Pratiyush Mohan Srivastava <pratiyush.srivastava@nxp.com>
|
||||
Signed-off-by: Raghav Dogra <raghav.dogra@nxp.com>
|
||||
---
|
||||
drivers/mmc/host/sdhci-pltfm.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
--- a/drivers/mmc/host/sdhci-pltfm.c
|
||||
+++ b/drivers/mmc/host/sdhci-pltfm.c
|
||||
@@ -93,6 +93,9 @@ void sdhci_get_of_property(struct platfo
|
||||
if (of_device_is_compatible(np, "fsl,p2020-rev1-esdhc"))
|
||||
host->quirks |= SDHCI_QUIRK_BROKEN_DMA;
|
||||
|
||||
+ if (of_device_is_compatible(np, "fsl,ls1088a-esdhc"))
|
||||
+ host->quirks &= ~SDHCI_QUIRK_BROKEN_CARD_DETECTION;
|
||||
+
|
||||
if (of_device_is_compatible(np, "fsl,p2020-esdhc") ||
|
||||
of_device_is_compatible(np, "fsl,p1010-esdhc") ||
|
||||
of_device_is_compatible(np, "fsl,t4240-esdhc") ||
|
@ -0,0 +1,38 @@
|
||||
From 1aeb63c52ade1219032161fcdb923aa4c62b3796 Mon Sep 17 00:00:00 2001
|
||||
From: Prabhakar Kushwaha <prabhakar.kushwaha@nxp.com>
|
||||
Date: Sun, 9 Oct 2016 14:52:49 +0800
|
||||
Subject: [PATCH 137/141] armv8: ls1088a: Add PCIe compatible
|
||||
|
||||
commit: 1a089a382b187c80390f022d1e3f3749b2adcc64
|
||||
[don't apply dtsi]
|
||||
|
||||
Signed-off-by: Prabhakar Kushwaha <prabhakar.kushwaha@nxp.com>
|
||||
Integrated-by: Zhao Qiang <qiang.zhao@nxp.com>
|
||||
---
|
||||
drivers/pci/host/pci-layerscape.c | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
--- a/drivers/pci/host/pci-layerscape.c
|
||||
+++ b/drivers/pci/host/pci-layerscape.c
|
||||
@@ -215,6 +215,13 @@ static struct ls_pcie_drvdata ls1046_drv
|
||||
.ops = &ls_pcie_host_ops,
|
||||
};
|
||||
|
||||
+static struct ls_pcie_drvdata ls1088_drvdata = {
|
||||
+ .lut_offset = 0x80000,
|
||||
+ .ltssm_shift = 0,
|
||||
+ .lut_dbg = 0x407fc,
|
||||
+ .ops = &ls_pcie_host_ops,
|
||||
+};
|
||||
+
|
||||
static struct ls_pcie_drvdata ls2080_drvdata = {
|
||||
.lut_offset = 0x80000,
|
||||
.ltssm_shift = 0,
|
||||
@@ -227,6 +234,7 @@ static const struct of_device_id ls_pcie
|
||||
{ .compatible = "fsl,ls1021a-pcie", .data = &ls1021_drvdata },
|
||||
{ .compatible = "fsl,ls1043a-pcie", .data = &ls1043_drvdata },
|
||||
{ .compatible = "fsl,ls1046a-pcie", .data = &ls1046_drvdata },
|
||||
+ { .compatible = "fsl,ls1088a-pcie", .data = &ls1088_drvdata },
|
||||
{ .compatible = "fsl,ls2080a-pcie", .data = &ls2080_drvdata },
|
||||
{ .compatible = "fsl,ls2085a-pcie", .data = &ls2080_drvdata },
|
||||
{ },
|
Loading…
Reference in New Issue
Block a user