The 1st generation MediaTek PCIe host bridge cannot handle Message Signaled Interrupts (MSIs). The core PCI code is not aware that MSI is not available. This results in warnings of the form: WARNING: CPU: 2 PID: 112 at include/linux/msi.h:219 pci_msi_setup_msi_irqs.constprop.8+0x64/0x6c Modules linked in: ahci(+) libahci libata sd_mod scsi_mod gpio_button_hotplug CPU: 2 PID: 112 Comm: kmodloader Not tainted 5.10.52 #0 Hardware name: Mediatek Cortex-A7 (Device Tree) Import patches that introduce the 'no_msi' attribute to signal missing MSI support to the core PCI. Refresh patches: - 000-spi-fix-fifo.patch - 330-mtk-bmt-support.patch - 510-net-mediatek-add-flow-offload-for-mt7623.patch - 601-PCI-mediatek-Use-regmap-to-get-shared-pcie-cfg-base.patch - 610-pcie-mediatek-fix-clearing-interrupt-status.patch - 700-net-ethernet-mtk_eth_soc-add-support-for-coherent-DM.patch - 710-pci-pcie-mediatek-add-support-for-coherent-DMA.patch Signed-off-by: Nick Hainke <vincent@systemli.org>
85 lines
2.5 KiB
Diff
85 lines
2.5 KiB
Diff
From: Felix Fietkau <nbd@nbd.name>
|
|
Date: Fri, 4 Sep 2020 18:36:06 +0200
|
|
Subject: [PATCH] net: ethernet: mtk_eth_soc: add support for coherent DMA
|
|
|
|
It improves performance by eliminating the need for a cache flush on rx and tx
|
|
|
|
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|
---
|
|
|
|
--- a/arch/arm64/boot/dts/mediatek/mt7622.dtsi
|
|
+++ b/arch/arm64/boot/dts/mediatek/mt7622.dtsi
|
|
@@ -364,7 +364,7 @@
|
|
};
|
|
|
|
cci_control2: slave-if@5000 {
|
|
- compatible = "arm,cci-400-ctrl-if";
|
|
+ compatible = "arm,cci-400-ctrl-if", "syscon";
|
|
interface-type = "ace";
|
|
reg = <0x5000 0x1000>;
|
|
};
|
|
@@ -976,6 +976,8 @@
|
|
power-domains = <&scpsys MT7622_POWER_DOMAIN_ETHSYS>;
|
|
mediatek,ethsys = <ðsys>;
|
|
mediatek,sgmiisys = <&sgmiisys>;
|
|
+ mediatek,cci-control = <&cci_control2>;
|
|
+ dma-coherent;
|
|
#address-cells = <1>;
|
|
#size-cells = <0>;
|
|
status = "disabled";
|
|
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
|
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
|
|
@@ -9,6 +9,7 @@
|
|
#include <linux/of_device.h>
|
|
#include <linux/of_mdio.h>
|
|
#include <linux/of_net.h>
|
|
+#include <linux/of_address.h>
|
|
#include <linux/mfd/syscon.h>
|
|
#include <linux/regmap.h>
|
|
#include <linux/clk.h>
|
|
@@ -2494,6 +2495,13 @@ static int mtk_hw_init(struct mtk_eth *e
|
|
if (ret)
|
|
goto err_disable_pm;
|
|
|
|
+ if (of_dma_is_coherent(eth->dev->of_node)) {
|
|
+ u32 mask = ETHSYS_DMA_AG_MAP_PDMA | ETHSYS_DMA_AG_MAP_QDMA |
|
|
+ ETHSYS_DMA_AG_MAP_PPE;
|
|
+
|
|
+ regmap_update_bits(eth->ethsys, ETHSYS_DMA_AG_MAP, mask, mask);
|
|
+ }
|
|
+
|
|
if (MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628)) {
|
|
ret = device_reset(eth->dev);
|
|
if (ret) {
|
|
@@ -3076,6 +3084,16 @@ static int mtk_probe(struct platform_dev
|
|
}
|
|
}
|
|
|
|
+ if (of_dma_is_coherent(pdev->dev.of_node)) {
|
|
+ struct regmap *cci;
|
|
+
|
|
+ cci = syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
|
|
+ "mediatek,cci-control");
|
|
+ /* enable CPU/bus coherency */
|
|
+ if (!IS_ERR(cci))
|
|
+ regmap_write(cci, 0, 3);
|
|
+ }
|
|
+
|
|
if (MTK_HAS_CAPS(eth->soc->caps, MTK_SGMII)) {
|
|
eth->sgmii = devm_kzalloc(eth->dev, sizeof(*eth->sgmii),
|
|
GFP_KERNEL);
|
|
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
|
|
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
|
|
@@ -450,6 +450,12 @@
|
|
#define RSTCTRL_FE BIT(6)
|
|
#define RSTCTRL_PPE BIT(31)
|
|
|
|
+/* ethernet dma channel agent map */
|
|
+#define ETHSYS_DMA_AG_MAP 0x408
|
|
+#define ETHSYS_DMA_AG_MAP_PDMA BIT(0)
|
|
+#define ETHSYS_DMA_AG_MAP_QDMA BIT(1)
|
|
+#define ETHSYS_DMA_AG_MAP_PPE BIT(2)
|
|
+
|
|
/* SGMII subsystem config registers */
|
|
/* Register to auto-negotiation restart */
|
|
#define SGMSYS_PCS_CONTROL_1 0x0
|