From: Ming-Fan Chen <ming-fan.chen@mediatek.com>
To: Rob Herring <robh+dt@kernel.org>,
Matthias Brugger <matthias.bgg@gmail.com>
Cc: Yong Wu <yong.wu@mediatek.com>, Evan Green <evgreen@chromium.org>,
Joerg Roedel <jroedel@suse.de>, <devicetree@vger.kernel.org>,
<linux-kernel@vger.kernel.org>,
<linux-arm-kernel@lists.infradead.org>,
<linux-mediatek@lists.infradead.org>, <wsd_upstream@mediatek.com>,
Ming-Fan Chen <ming-fan.chen@mediatek.com>
Subject: [PATCH v2 2/2] memory: mtk-smi: Add bandwidth initial golden setting for MT6779
Date: Mon, 9 Dec 2019 14:19:31 +0800 [thread overview]
Message-ID: <1575872371-671-4-git-send-email-ming-fan.chen@mediatek.com> (raw)
In-Reply-To: <1575872371-671-1-git-send-email-ming-fan.chen@mediatek.com>
SMI bandwidth initial golden setting for MT6779 make sure
better performance of memory control for multimedia modules.
Signed-off-by: Ming-Fan Chen <ming-fan.chen@mediatek.com>
---
drivers/memory/mtk-smi.c | 143 +++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 142 insertions(+), 1 deletion(-)
diff --git a/drivers/memory/mtk-smi.c b/drivers/memory/mtk-smi.c
index 439d7d8..6b18b71 100644
--- a/drivers/memory/mtk-smi.c
+++ b/drivers/memory/mtk-smi.c
@@ -41,21 +41,49 @@
#define SMI_LARB_NONSEC_CON(id) (0x380 + ((id) * 4))
#define F_MMU_EN BIT(0)
+#define SMI_LARB_CMD_THRT_CON 0x24
+#define SMI_LARB_SW_FLAG 0x40
+#define SMI_LARB_OSTDL_PORT 0x200
+#define SMI_LARB_OSTDL_PORTx(id) (SMI_LARB_OSTDL_PORT + (((id) & 0x1f) << 2))
+
/* SMI COMMON */
+#define SMI_L1LEN 0x100
+#define SMI_L1ARB0 0x104
+#define SMI_L1ARB(id) (SMI_L1ARB0 + (((id) & 0x7) << 2))
+
#define SMI_BUS_SEL 0x220
#define SMI_BUS_LARB_SHIFT(larbid) ((larbid) << 1)
/* All are MMU0 defaultly. Only specialize mmu1 here. */
#define F_MMU1_LARB(larbid) (0x1 << SMI_BUS_LARB_SHIFT(larbid))
+#define SMI_M4U_TH 0x234
+#define SMI_FIFO_TH1 0x238
+#define SMI_FIFO_TH2 0x23c
+#define SMI_DCM 0x300
+#define SMI_DUMMY 0x444
+
+#define SMI_LARB_PORT_NR_MAX 32
+#define SMI_LARB_MISC_NR 2
+#define SMI_COMMON_MISC_NR 6
+
enum mtk_smi_gen {
MTK_SMI_GEN1,
MTK_SMI_GEN2
};
+struct mtk_smi_reg_pair {
+ u16 offset;
+ u32 value;
+};
+
struct mtk_smi_common_plat {
enum mtk_smi_gen gen;
bool has_gals;
u32 bus_sel; /* Balance some larbs to enter mmu0 or mmu1 */
+ bool has_bwc;
+ u8 larb_nr;
+ const u16 *l1arb;
+ const struct mtk_smi_reg_pair *misc;
};
struct mtk_smi_larb_gen {
@@ -63,6 +91,9 @@ struct mtk_smi_larb_gen {
void (*config_port)(struct device *);
unsigned int larb_direct_to_common_mask;
bool has_gals;
+ bool has_bwc;
+ const u8 (*ostdl)[SMI_LARB_PORT_NR_MAX];
+ const struct mtk_smi_reg_pair (*misc)[SMI_LARB_MISC_NR];
};
struct mtk_smi {
@@ -161,6 +192,8 @@ static void mtk_smi_larb_config_port_gen2_general(struct device *dev)
struct mtk_smi_larb *larb = dev_get_drvdata(dev);
u32 reg;
int i;
+ const u8 *ostdl;
+ const struct mtk_smi_reg_pair *misc;
if (BIT(larb->larbid) & larb->larb_gen->larb_direct_to_common_mask)
return;
@@ -170,6 +203,20 @@ static void mtk_smi_larb_config_port_gen2_general(struct device *dev)
reg |= F_MMU_EN;
writel(reg, larb->base + SMI_LARB_NONSEC_CON(i));
}
+
+ if (!larb->larb_gen->has_bwc)
+ return;
+
+ for (i = 0, ostdl = larb->larb_gen->ostdl[larb->larbid];
+ i < SMI_LARB_PORT_NR_MAX; i++)
+ writel_relaxed(ostdl[i],
+ larb->base + SMI_LARB_OSTDL_PORTx(i));
+
+ for (i = 0, misc = larb->larb_gen->misc[larb->larbid];
+ i < SMI_LARB_MISC_NR; i++)
+ writel_relaxed(misc[i].value,
+ larb->base + misc[i].offset);
+ wmb(); /* make sure settings are written */
}
static void mtk_smi_larb_config_port_mt8173(struct device *dev)
@@ -239,6 +286,55 @@ static void mtk_smi_larb_config_port_gen1(struct device *dev)
.larb_direct_to_common_mask = BIT(8) | BIT(9), /* bdpsys */
};
+static const u8 mtk_smi_larb_mt6779_ostdl[][SMI_LARB_PORT_NR_MAX] = {
+ {0x28, 0x28, 0x01, 0x28, 0x01, 0x01, 0x0a, 0x0a, 0x28,},
+ {0x28, 0x01, 0x28, 0x28, 0x0a, 0x01, 0x01, 0x0d, 0x0d, 0x07,
+ 0x01, 0x07, 0x01, 0x28,},
+ {0x18, 0x01, 0x08, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02,
+ 0x01, 0x01},
+ {0x01, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x04, 0x02, 0x01,
+ 0x04, 0x01, 0x01, 0x01, 0x01, 0x04, 0x0b, 0x13, 0x14,},
+ {},
+ {0x13, 0x0f, 0x0d, 0x07, 0x07, 0x04, 0x03, 0x01, 0x03, 0x01,
+ 0x05, 0x0c, 0x01, 0x01, 0x08, 0x06, 0x02, 0x01, 0x08, 0x08,
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,},
+ {0x01, 0x01, 0x01,},
+ {0x01, 0x01, 0x01, 0x01,},
+ {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,},
+ {0x1f, 0x1a, 0x02, 0x04, 0x1f, 0x02, 0x14, 0x01, 0x1f, 0x04,
+ 0x04, 0x01, 0x01, 0x01, 0x02, 0x02, 0x04, 0x02, 0x01, 0x02,
+ 0x04, 0x02, 0x02, 0x01,},
+ {0x1f, 0x1a, 0x02, 0x04, 0x1f, 0x02, 0x14, 0x01, 0x1f, 0x1a,
+ 0x02, 0x04, 0x1f, 0x02, 0x14, 0x01, 0x01, 0x02, 0x02, 0x04,
+ 0x02, 0x0a, 0x02, 0x02, 0x04, 0x02, 0x0a, 0x02, 0x04, 0x02, 0x04,},
+ {0x01, 0x01, 0x01, 0x01, 0x01,},
+};
+
+static const struct mtk_smi_reg_pair
+mtk_smi_larb_mt6779_misc[][SMI_LARB_MISC_NR] = {
+ {{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
+ {{SMI_LARB_CMD_THRT_CON, 0x300256}, {SMI_LARB_SW_FLAG, 0x1},},
+ {{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
+ {},
+ {{SMI_LARB_CMD_THRT_CON, 0x300256}, {SMI_LARB_SW_FLAG, 0x1},},
+ {{SMI_LARB_CMD_THRT_CON, 0x300256}, {SMI_LARB_SW_FLAG, 0x1},},
+ {{SMI_LARB_CMD_THRT_CON, 0x300256}, {SMI_LARB_SW_FLAG, 0x1},},
+ {{SMI_LARB_CMD_THRT_CON, 0x300256}, {SMI_LARB_SW_FLAG, 0x1},},
+ {{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
+ {{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
+ {{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
+};
+
+static const struct mtk_smi_larb_gen mtk_smi_larb_mt6779 = {
+ .config_port = mtk_smi_larb_config_port_gen2_general,
+ .larb_direct_to_common_mask =
+ BIT(4) | BIT(6) | BIT(11) | BIT(12) | BIT(13),
+ /* DUMMY | IPU0 | IPU1 | CCU | MDLA */
+ .has_bwc = true,
+ .ostdl = mtk_smi_larb_mt6779_ostdl,
+ .misc = mtk_smi_larb_mt6779_misc,
+};
+
static const struct mtk_smi_larb_gen mtk_smi_larb_mt8183 = {
.has_gals = true,
.config_port = mtk_smi_larb_config_port_gen2_general,
@@ -260,6 +356,10 @@ static void mtk_smi_larb_config_port_gen1(struct device *dev)
.data = &mtk_smi_larb_mt2712
},
{
+ .compatible = "mediatek,mt6779-smi-larb",
+ .data = &mtk_smi_larb_mt6779
+ },
+ {
.compatible = "mediatek,mt8183-smi-larb",
.data = &mtk_smi_larb_mt8183
},
@@ -386,6 +486,31 @@ static int __maybe_unused mtk_smi_larb_suspend(struct device *dev)
.gen = MTK_SMI_GEN2,
};
+static const u16 mtk_smi_common_mt6779_l1arb[] = {
+ 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000,
+};
+
+static const struct
+mtk_smi_reg_pair mtk_smi_common_mt6779_misc[SMI_COMMON_MISC_NR] = {
+ {SMI_L1LEN, 0xb},
+ {SMI_M4U_TH, 0xe100e10},
+ {SMI_FIFO_TH1, 0x506090a},
+ {SMI_FIFO_TH2, 0x506090a},
+ {SMI_DCM, 0x4f1},
+ {SMI_DUMMY, 0x1},
+};
+
+static const struct mtk_smi_common_plat mtk_smi_common_mt6779 = {
+ .gen = MTK_SMI_GEN2,
+ .has_gals = true,
+ .bus_sel = F_MMU1_LARB(1) | F_MMU1_LARB(2) | F_MMU1_LARB(4) |
+ F_MMU1_LARB(5) | F_MMU1_LARB(6) | F_MMU1_LARB(7),
+ .has_bwc = true,
+ .larb_nr = ARRAY_SIZE(mtk_smi_common_mt6779_l1arb),
+ .l1arb = mtk_smi_common_mt6779_l1arb,
+ .misc = mtk_smi_common_mt6779_misc,
+};
+
static const struct mtk_smi_common_plat mtk_smi_common_mt8183 = {
.gen = MTK_SMI_GEN2,
.has_gals = true,
@@ -407,6 +532,10 @@ static int __maybe_unused mtk_smi_larb_suspend(struct device *dev)
.data = &mtk_smi_common_gen2,
},
{
+ .compatible = "mediatek,mt6779-smi-common",
+ .data = &mtk_smi_common_mt6779,
+ },
+ {
.compatible = "mediatek,mt8183-smi-common",
.data = &mtk_smi_common_mt8183,
},
@@ -484,7 +613,7 @@ static int __maybe_unused mtk_smi_common_resume(struct device *dev)
{
struct mtk_smi *common = dev_get_drvdata(dev);
u32 bus_sel = common->plat->bus_sel;
- int ret;
+ int i, ret;
ret = mtk_smi_clk_enable(common);
if (ret) {
@@ -494,6 +623,18 @@ static int __maybe_unused mtk_smi_common_resume(struct device *dev)
if (common->plat->gen == MTK_SMI_GEN2 && bus_sel)
writel(bus_sel, common->base + SMI_BUS_SEL);
+
+ if (!common->plat->has_bwc)
+ return 0;
+
+ for (i = 0; i < common->plat->larb_nr; i++)
+ writel_relaxed(common->plat->l1arb[i],
+ common->base + SMI_L1ARB(i));
+
+ for (i = 0; i < SMI_COMMON_MISC_NR; i++)
+ writel_relaxed(common->plat->misc[i].value,
+ common->base + common->plat->misc[i].value);
+ wmb(); /* make sure settings are written */
return 0;
}
--
1.7.9.5
WARNING: multiple messages have this Message-ID (diff)
From: Ming-Fan Chen <ming-fan.chen@mediatek.com>
To: Rob Herring <robh+dt@kernel.org>,
Matthias Brugger <matthias.bgg@gmail.com>
Cc: devicetree@vger.kernel.org, Joerg Roedel <jroedel@suse.de>,
wsd_upstream@mediatek.com, linux-kernel@vger.kernel.org,
Evan Green <evgreen@chromium.org>,
linux-mediatek@lists.infradead.org,
Yong Wu <yong.wu@mediatek.com>,
Ming-Fan Chen <ming-fan.chen@mediatek.com>,
linux-arm-kernel@lists.infradead.org
Subject: [PATCH v2 2/2] memory: mtk-smi: Add bandwidth initial golden setting for MT6779
Date: Mon, 9 Dec 2019 14:19:31 +0800 [thread overview]
Message-ID: <1575872371-671-4-git-send-email-ming-fan.chen@mediatek.com> (raw)
In-Reply-To: <1575872371-671-1-git-send-email-ming-fan.chen@mediatek.com>
SMI bandwidth initial golden setting for MT6779 make sure
better performance of memory control for multimedia modules.
Signed-off-by: Ming-Fan Chen <ming-fan.chen@mediatek.com>
---
drivers/memory/mtk-smi.c | 143 +++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 142 insertions(+), 1 deletion(-)
diff --git a/drivers/memory/mtk-smi.c b/drivers/memory/mtk-smi.c
index 439d7d8..6b18b71 100644
--- a/drivers/memory/mtk-smi.c
+++ b/drivers/memory/mtk-smi.c
@@ -41,21 +41,49 @@
#define SMI_LARB_NONSEC_CON(id) (0x380 + ((id) * 4))
#define F_MMU_EN BIT(0)
+#define SMI_LARB_CMD_THRT_CON 0x24
+#define SMI_LARB_SW_FLAG 0x40
+#define SMI_LARB_OSTDL_PORT 0x200
+#define SMI_LARB_OSTDL_PORTx(id) (SMI_LARB_OSTDL_PORT + (((id) & 0x1f) << 2))
+
/* SMI COMMON */
+#define SMI_L1LEN 0x100
+#define SMI_L1ARB0 0x104
+#define SMI_L1ARB(id) (SMI_L1ARB0 + (((id) & 0x7) << 2))
+
#define SMI_BUS_SEL 0x220
#define SMI_BUS_LARB_SHIFT(larbid) ((larbid) << 1)
/* All are MMU0 defaultly. Only specialize mmu1 here. */
#define F_MMU1_LARB(larbid) (0x1 << SMI_BUS_LARB_SHIFT(larbid))
+#define SMI_M4U_TH 0x234
+#define SMI_FIFO_TH1 0x238
+#define SMI_FIFO_TH2 0x23c
+#define SMI_DCM 0x300
+#define SMI_DUMMY 0x444
+
+#define SMI_LARB_PORT_NR_MAX 32
+#define SMI_LARB_MISC_NR 2
+#define SMI_COMMON_MISC_NR 6
+
enum mtk_smi_gen {
MTK_SMI_GEN1,
MTK_SMI_GEN2
};
+struct mtk_smi_reg_pair {
+ u16 offset;
+ u32 value;
+};
+
struct mtk_smi_common_plat {
enum mtk_smi_gen gen;
bool has_gals;
u32 bus_sel; /* Balance some larbs to enter mmu0 or mmu1 */
+ bool has_bwc;
+ u8 larb_nr;
+ const u16 *l1arb;
+ const struct mtk_smi_reg_pair *misc;
};
struct mtk_smi_larb_gen {
@@ -63,6 +91,9 @@ struct mtk_smi_larb_gen {
void (*config_port)(struct device *);
unsigned int larb_direct_to_common_mask;
bool has_gals;
+ bool has_bwc;
+ const u8 (*ostdl)[SMI_LARB_PORT_NR_MAX];
+ const struct mtk_smi_reg_pair (*misc)[SMI_LARB_MISC_NR];
};
struct mtk_smi {
@@ -161,6 +192,8 @@ static void mtk_smi_larb_config_port_gen2_general(struct device *dev)
struct mtk_smi_larb *larb = dev_get_drvdata(dev);
u32 reg;
int i;
+ const u8 *ostdl;
+ const struct mtk_smi_reg_pair *misc;
if (BIT(larb->larbid) & larb->larb_gen->larb_direct_to_common_mask)
return;
@@ -170,6 +203,20 @@ static void mtk_smi_larb_config_port_gen2_general(struct device *dev)
reg |= F_MMU_EN;
writel(reg, larb->base + SMI_LARB_NONSEC_CON(i));
}
+
+ if (!larb->larb_gen->has_bwc)
+ return;
+
+ for (i = 0, ostdl = larb->larb_gen->ostdl[larb->larbid];
+ i < SMI_LARB_PORT_NR_MAX; i++)
+ writel_relaxed(ostdl[i],
+ larb->base + SMI_LARB_OSTDL_PORTx(i));
+
+ for (i = 0, misc = larb->larb_gen->misc[larb->larbid];
+ i < SMI_LARB_MISC_NR; i++)
+ writel_relaxed(misc[i].value,
+ larb->base + misc[i].offset);
+ wmb(); /* make sure settings are written */
}
static void mtk_smi_larb_config_port_mt8173(struct device *dev)
@@ -239,6 +286,55 @@ static void mtk_smi_larb_config_port_gen1(struct device *dev)
.larb_direct_to_common_mask = BIT(8) | BIT(9), /* bdpsys */
};
+static const u8 mtk_smi_larb_mt6779_ostdl[][SMI_LARB_PORT_NR_MAX] = {
+ {0x28, 0x28, 0x01, 0x28, 0x01, 0x01, 0x0a, 0x0a, 0x28,},
+ {0x28, 0x01, 0x28, 0x28, 0x0a, 0x01, 0x01, 0x0d, 0x0d, 0x07,
+ 0x01, 0x07, 0x01, 0x28,},
+ {0x18, 0x01, 0x08, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02,
+ 0x01, 0x01},
+ {0x01, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x04, 0x02, 0x01,
+ 0x04, 0x01, 0x01, 0x01, 0x01, 0x04, 0x0b, 0x13, 0x14,},
+ {},
+ {0x13, 0x0f, 0x0d, 0x07, 0x07, 0x04, 0x03, 0x01, 0x03, 0x01,
+ 0x05, 0x0c, 0x01, 0x01, 0x08, 0x06, 0x02, 0x01, 0x08, 0x08,
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,},
+ {0x01, 0x01, 0x01,},
+ {0x01, 0x01, 0x01, 0x01,},
+ {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,},
+ {0x1f, 0x1a, 0x02, 0x04, 0x1f, 0x02, 0x14, 0x01, 0x1f, 0x04,
+ 0x04, 0x01, 0x01, 0x01, 0x02, 0x02, 0x04, 0x02, 0x01, 0x02,
+ 0x04, 0x02, 0x02, 0x01,},
+ {0x1f, 0x1a, 0x02, 0x04, 0x1f, 0x02, 0x14, 0x01, 0x1f, 0x1a,
+ 0x02, 0x04, 0x1f, 0x02, 0x14, 0x01, 0x01, 0x02, 0x02, 0x04,
+ 0x02, 0x0a, 0x02, 0x02, 0x04, 0x02, 0x0a, 0x02, 0x04, 0x02, 0x04,},
+ {0x01, 0x01, 0x01, 0x01, 0x01,},
+};
+
+static const struct mtk_smi_reg_pair
+mtk_smi_larb_mt6779_misc[][SMI_LARB_MISC_NR] = {
+ {{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
+ {{SMI_LARB_CMD_THRT_CON, 0x300256}, {SMI_LARB_SW_FLAG, 0x1},},
+ {{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
+ {},
+ {{SMI_LARB_CMD_THRT_CON, 0x300256}, {SMI_LARB_SW_FLAG, 0x1},},
+ {{SMI_LARB_CMD_THRT_CON, 0x300256}, {SMI_LARB_SW_FLAG, 0x1},},
+ {{SMI_LARB_CMD_THRT_CON, 0x300256}, {SMI_LARB_SW_FLAG, 0x1},},
+ {{SMI_LARB_CMD_THRT_CON, 0x300256}, {SMI_LARB_SW_FLAG, 0x1},},
+ {{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
+ {{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
+ {{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
+};
+
+static const struct mtk_smi_larb_gen mtk_smi_larb_mt6779 = {
+ .config_port = mtk_smi_larb_config_port_gen2_general,
+ .larb_direct_to_common_mask =
+ BIT(4) | BIT(6) | BIT(11) | BIT(12) | BIT(13),
+ /* DUMMY | IPU0 | IPU1 | CCU | MDLA */
+ .has_bwc = true,
+ .ostdl = mtk_smi_larb_mt6779_ostdl,
+ .misc = mtk_smi_larb_mt6779_misc,
+};
+
static const struct mtk_smi_larb_gen mtk_smi_larb_mt8183 = {
.has_gals = true,
.config_port = mtk_smi_larb_config_port_gen2_general,
@@ -260,6 +356,10 @@ static void mtk_smi_larb_config_port_gen1(struct device *dev)
.data = &mtk_smi_larb_mt2712
},
{
+ .compatible = "mediatek,mt6779-smi-larb",
+ .data = &mtk_smi_larb_mt6779
+ },
+ {
.compatible = "mediatek,mt8183-smi-larb",
.data = &mtk_smi_larb_mt8183
},
@@ -386,6 +486,31 @@ static int __maybe_unused mtk_smi_larb_suspend(struct device *dev)
.gen = MTK_SMI_GEN2,
};
+static const u16 mtk_smi_common_mt6779_l1arb[] = {
+ 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000,
+};
+
+static const struct
+mtk_smi_reg_pair mtk_smi_common_mt6779_misc[SMI_COMMON_MISC_NR] = {
+ {SMI_L1LEN, 0xb},
+ {SMI_M4U_TH, 0xe100e10},
+ {SMI_FIFO_TH1, 0x506090a},
+ {SMI_FIFO_TH2, 0x506090a},
+ {SMI_DCM, 0x4f1},
+ {SMI_DUMMY, 0x1},
+};
+
+static const struct mtk_smi_common_plat mtk_smi_common_mt6779 = {
+ .gen = MTK_SMI_GEN2,
+ .has_gals = true,
+ .bus_sel = F_MMU1_LARB(1) | F_MMU1_LARB(2) | F_MMU1_LARB(4) |
+ F_MMU1_LARB(5) | F_MMU1_LARB(6) | F_MMU1_LARB(7),
+ .has_bwc = true,
+ .larb_nr = ARRAY_SIZE(mtk_smi_common_mt6779_l1arb),
+ .l1arb = mtk_smi_common_mt6779_l1arb,
+ .misc = mtk_smi_common_mt6779_misc,
+};
+
static const struct mtk_smi_common_plat mtk_smi_common_mt8183 = {
.gen = MTK_SMI_GEN2,
.has_gals = true,
@@ -407,6 +532,10 @@ static int __maybe_unused mtk_smi_larb_suspend(struct device *dev)
.data = &mtk_smi_common_gen2,
},
{
+ .compatible = "mediatek,mt6779-smi-common",
+ .data = &mtk_smi_common_mt6779,
+ },
+ {
.compatible = "mediatek,mt8183-smi-common",
.data = &mtk_smi_common_mt8183,
},
@@ -484,7 +613,7 @@ static int __maybe_unused mtk_smi_common_resume(struct device *dev)
{
struct mtk_smi *common = dev_get_drvdata(dev);
u32 bus_sel = common->plat->bus_sel;
- int ret;
+ int i, ret;
ret = mtk_smi_clk_enable(common);
if (ret) {
@@ -494,6 +623,18 @@ static int __maybe_unused mtk_smi_common_resume(struct device *dev)
if (common->plat->gen == MTK_SMI_GEN2 && bus_sel)
writel(bus_sel, common->base + SMI_BUS_SEL);
+
+ if (!common->plat->has_bwc)
+ return 0;
+
+ for (i = 0; i < common->plat->larb_nr; i++)
+ writel_relaxed(common->plat->l1arb[i],
+ common->base + SMI_L1ARB(i));
+
+ for (i = 0; i < SMI_COMMON_MISC_NR; i++)
+ writel_relaxed(common->plat->misc[i].value,
+ common->base + common->plat->misc[i].value);
+ wmb(); /* make sure settings are written */
return 0;
}
--
1.7.9.5
_______________________________________________
Linux-mediatek mailing list
Linux-mediatek@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-mediatek
WARNING: multiple messages have this Message-ID (diff)
From: Ming-Fan Chen <ming-fan.chen@mediatek.com>
To: Rob Herring <robh+dt@kernel.org>,
Matthias Brugger <matthias.bgg@gmail.com>
Cc: devicetree@vger.kernel.org, Joerg Roedel <jroedel@suse.de>,
wsd_upstream@mediatek.com, linux-kernel@vger.kernel.org,
Evan Green <evgreen@chromium.org>,
linux-mediatek@lists.infradead.org,
Yong Wu <yong.wu@mediatek.com>,
Ming-Fan Chen <ming-fan.chen@mediatek.com>,
linux-arm-kernel@lists.infradead.org
Subject: [PATCH v2 2/2] memory: mtk-smi: Add bandwidth initial golden setting for MT6779
Date: Mon, 9 Dec 2019 14:19:31 +0800 [thread overview]
Message-ID: <1575872371-671-4-git-send-email-ming-fan.chen@mediatek.com> (raw)
In-Reply-To: <1575872371-671-1-git-send-email-ming-fan.chen@mediatek.com>
SMI bandwidth initial golden setting for MT6779 make sure
better performance of memory control for multimedia modules.
Signed-off-by: Ming-Fan Chen <ming-fan.chen@mediatek.com>
---
drivers/memory/mtk-smi.c | 143 +++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 142 insertions(+), 1 deletion(-)
diff --git a/drivers/memory/mtk-smi.c b/drivers/memory/mtk-smi.c
index 439d7d8..6b18b71 100644
--- a/drivers/memory/mtk-smi.c
+++ b/drivers/memory/mtk-smi.c
@@ -41,21 +41,49 @@
#define SMI_LARB_NONSEC_CON(id) (0x380 + ((id) * 4))
#define F_MMU_EN BIT(0)
+#define SMI_LARB_CMD_THRT_CON 0x24
+#define SMI_LARB_SW_FLAG 0x40
+#define SMI_LARB_OSTDL_PORT 0x200
+#define SMI_LARB_OSTDL_PORTx(id) (SMI_LARB_OSTDL_PORT + (((id) & 0x1f) << 2))
+
/* SMI COMMON */
+#define SMI_L1LEN 0x100
+#define SMI_L1ARB0 0x104
+#define SMI_L1ARB(id) (SMI_L1ARB0 + (((id) & 0x7) << 2))
+
#define SMI_BUS_SEL 0x220
#define SMI_BUS_LARB_SHIFT(larbid) ((larbid) << 1)
/* All are MMU0 defaultly. Only specialize mmu1 here. */
#define F_MMU1_LARB(larbid) (0x1 << SMI_BUS_LARB_SHIFT(larbid))
+#define SMI_M4U_TH 0x234
+#define SMI_FIFO_TH1 0x238
+#define SMI_FIFO_TH2 0x23c
+#define SMI_DCM 0x300
+#define SMI_DUMMY 0x444
+
+#define SMI_LARB_PORT_NR_MAX 32
+#define SMI_LARB_MISC_NR 2
+#define SMI_COMMON_MISC_NR 6
+
enum mtk_smi_gen {
MTK_SMI_GEN1,
MTK_SMI_GEN2
};
+struct mtk_smi_reg_pair {
+ u16 offset;
+ u32 value;
+};
+
struct mtk_smi_common_plat {
enum mtk_smi_gen gen;
bool has_gals;
u32 bus_sel; /* Balance some larbs to enter mmu0 or mmu1 */
+ bool has_bwc;
+ u8 larb_nr;
+ const u16 *l1arb;
+ const struct mtk_smi_reg_pair *misc;
};
struct mtk_smi_larb_gen {
@@ -63,6 +91,9 @@ struct mtk_smi_larb_gen {
void (*config_port)(struct device *);
unsigned int larb_direct_to_common_mask;
bool has_gals;
+ bool has_bwc;
+ const u8 (*ostdl)[SMI_LARB_PORT_NR_MAX];
+ const struct mtk_smi_reg_pair (*misc)[SMI_LARB_MISC_NR];
};
struct mtk_smi {
@@ -161,6 +192,8 @@ static void mtk_smi_larb_config_port_gen2_general(struct device *dev)
struct mtk_smi_larb *larb = dev_get_drvdata(dev);
u32 reg;
int i;
+ const u8 *ostdl;
+ const struct mtk_smi_reg_pair *misc;
if (BIT(larb->larbid) & larb->larb_gen->larb_direct_to_common_mask)
return;
@@ -170,6 +203,20 @@ static void mtk_smi_larb_config_port_gen2_general(struct device *dev)
reg |= F_MMU_EN;
writel(reg, larb->base + SMI_LARB_NONSEC_CON(i));
}
+
+ if (!larb->larb_gen->has_bwc)
+ return;
+
+ for (i = 0, ostdl = larb->larb_gen->ostdl[larb->larbid];
+ i < SMI_LARB_PORT_NR_MAX; i++)
+ writel_relaxed(ostdl[i],
+ larb->base + SMI_LARB_OSTDL_PORTx(i));
+
+ for (i = 0, misc = larb->larb_gen->misc[larb->larbid];
+ i < SMI_LARB_MISC_NR; i++)
+ writel_relaxed(misc[i].value,
+ larb->base + misc[i].offset);
+ wmb(); /* make sure settings are written */
}
static void mtk_smi_larb_config_port_mt8173(struct device *dev)
@@ -239,6 +286,55 @@ static void mtk_smi_larb_config_port_gen1(struct device *dev)
.larb_direct_to_common_mask = BIT(8) | BIT(9), /* bdpsys */
};
+static const u8 mtk_smi_larb_mt6779_ostdl[][SMI_LARB_PORT_NR_MAX] = {
+ {0x28, 0x28, 0x01, 0x28, 0x01, 0x01, 0x0a, 0x0a, 0x28,},
+ {0x28, 0x01, 0x28, 0x28, 0x0a, 0x01, 0x01, 0x0d, 0x0d, 0x07,
+ 0x01, 0x07, 0x01, 0x28,},
+ {0x18, 0x01, 0x08, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02,
+ 0x01, 0x01},
+ {0x01, 0x03, 0x02, 0x01, 0x01, 0x01, 0x01, 0x04, 0x02, 0x01,
+ 0x04, 0x01, 0x01, 0x01, 0x01, 0x04, 0x0b, 0x13, 0x14,},
+ {},
+ {0x13, 0x0f, 0x0d, 0x07, 0x07, 0x04, 0x03, 0x01, 0x03, 0x01,
+ 0x05, 0x0c, 0x01, 0x01, 0x08, 0x06, 0x02, 0x01, 0x08, 0x08,
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,},
+ {0x01, 0x01, 0x01,},
+ {0x01, 0x01, 0x01, 0x01,},
+ {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,},
+ {0x1f, 0x1a, 0x02, 0x04, 0x1f, 0x02, 0x14, 0x01, 0x1f, 0x04,
+ 0x04, 0x01, 0x01, 0x01, 0x02, 0x02, 0x04, 0x02, 0x01, 0x02,
+ 0x04, 0x02, 0x02, 0x01,},
+ {0x1f, 0x1a, 0x02, 0x04, 0x1f, 0x02, 0x14, 0x01, 0x1f, 0x1a,
+ 0x02, 0x04, 0x1f, 0x02, 0x14, 0x01, 0x01, 0x02, 0x02, 0x04,
+ 0x02, 0x0a, 0x02, 0x02, 0x04, 0x02, 0x0a, 0x02, 0x04, 0x02, 0x04,},
+ {0x01, 0x01, 0x01, 0x01, 0x01,},
+};
+
+static const struct mtk_smi_reg_pair
+mtk_smi_larb_mt6779_misc[][SMI_LARB_MISC_NR] = {
+ {{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
+ {{SMI_LARB_CMD_THRT_CON, 0x300256}, {SMI_LARB_SW_FLAG, 0x1},},
+ {{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
+ {},
+ {{SMI_LARB_CMD_THRT_CON, 0x300256}, {SMI_LARB_SW_FLAG, 0x1},},
+ {{SMI_LARB_CMD_THRT_CON, 0x300256}, {SMI_LARB_SW_FLAG, 0x1},},
+ {{SMI_LARB_CMD_THRT_CON, 0x300256}, {SMI_LARB_SW_FLAG, 0x1},},
+ {{SMI_LARB_CMD_THRT_CON, 0x300256}, {SMI_LARB_SW_FLAG, 0x1},},
+ {{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
+ {{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
+ {{SMI_LARB_CMD_THRT_CON, 0x370256}, {SMI_LARB_SW_FLAG, 0x1},},
+};
+
+static const struct mtk_smi_larb_gen mtk_smi_larb_mt6779 = {
+ .config_port = mtk_smi_larb_config_port_gen2_general,
+ .larb_direct_to_common_mask =
+ BIT(4) | BIT(6) | BIT(11) | BIT(12) | BIT(13),
+ /* DUMMY | IPU0 | IPU1 | CCU | MDLA */
+ .has_bwc = true,
+ .ostdl = mtk_smi_larb_mt6779_ostdl,
+ .misc = mtk_smi_larb_mt6779_misc,
+};
+
static const struct mtk_smi_larb_gen mtk_smi_larb_mt8183 = {
.has_gals = true,
.config_port = mtk_smi_larb_config_port_gen2_general,
@@ -260,6 +356,10 @@ static void mtk_smi_larb_config_port_gen1(struct device *dev)
.data = &mtk_smi_larb_mt2712
},
{
+ .compatible = "mediatek,mt6779-smi-larb",
+ .data = &mtk_smi_larb_mt6779
+ },
+ {
.compatible = "mediatek,mt8183-smi-larb",
.data = &mtk_smi_larb_mt8183
},
@@ -386,6 +486,31 @@ static int __maybe_unused mtk_smi_larb_suspend(struct device *dev)
.gen = MTK_SMI_GEN2,
};
+static const u16 mtk_smi_common_mt6779_l1arb[] = {
+ 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000,
+};
+
+static const struct
+mtk_smi_reg_pair mtk_smi_common_mt6779_misc[SMI_COMMON_MISC_NR] = {
+ {SMI_L1LEN, 0xb},
+ {SMI_M4U_TH, 0xe100e10},
+ {SMI_FIFO_TH1, 0x506090a},
+ {SMI_FIFO_TH2, 0x506090a},
+ {SMI_DCM, 0x4f1},
+ {SMI_DUMMY, 0x1},
+};
+
+static const struct mtk_smi_common_plat mtk_smi_common_mt6779 = {
+ .gen = MTK_SMI_GEN2,
+ .has_gals = true,
+ .bus_sel = F_MMU1_LARB(1) | F_MMU1_LARB(2) | F_MMU1_LARB(4) |
+ F_MMU1_LARB(5) | F_MMU1_LARB(6) | F_MMU1_LARB(7),
+ .has_bwc = true,
+ .larb_nr = ARRAY_SIZE(mtk_smi_common_mt6779_l1arb),
+ .l1arb = mtk_smi_common_mt6779_l1arb,
+ .misc = mtk_smi_common_mt6779_misc,
+};
+
static const struct mtk_smi_common_plat mtk_smi_common_mt8183 = {
.gen = MTK_SMI_GEN2,
.has_gals = true,
@@ -407,6 +532,10 @@ static int __maybe_unused mtk_smi_larb_suspend(struct device *dev)
.data = &mtk_smi_common_gen2,
},
{
+ .compatible = "mediatek,mt6779-smi-common",
+ .data = &mtk_smi_common_mt6779,
+ },
+ {
.compatible = "mediatek,mt8183-smi-common",
.data = &mtk_smi_common_mt8183,
},
@@ -484,7 +613,7 @@ static int __maybe_unused mtk_smi_common_resume(struct device *dev)
{
struct mtk_smi *common = dev_get_drvdata(dev);
u32 bus_sel = common->plat->bus_sel;
- int ret;
+ int i, ret;
ret = mtk_smi_clk_enable(common);
if (ret) {
@@ -494,6 +623,18 @@ static int __maybe_unused mtk_smi_common_resume(struct device *dev)
if (common->plat->gen == MTK_SMI_GEN2 && bus_sel)
writel(bus_sel, common->base + SMI_BUS_SEL);
+
+ if (!common->plat->has_bwc)
+ return 0;
+
+ for (i = 0; i < common->plat->larb_nr; i++)
+ writel_relaxed(common->plat->l1arb[i],
+ common->base + SMI_L1ARB(i));
+
+ for (i = 0; i < SMI_COMMON_MISC_NR; i++)
+ writel_relaxed(common->plat->misc[i].value,
+ common->base + common->plat->misc[i].value);
+ wmb(); /* make sure settings are written */
return 0;
}
--
1.7.9.5
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2019-12-09 6:20 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-12-09 6:19 [PATCH v2] memory: mtk-smi: Add bandwidth initial setting for MT6779 Ming-Fan Chen
2019-12-09 6:19 ` Ming-Fan Chen
2019-12-09 6:19 ` Ming-Fan Chen
2019-12-09 6:19 ` [PATCH v2 0/2] " Ming-Fan Chen
2019-12-09 6:19 ` Ming-Fan Chen
2019-12-09 6:19 ` Ming-Fan Chen
2019-12-09 6:19 ` [PATCH v2 1/2] dt-bindings: mediatek: Add binding for MT6779 SMI Ming-Fan Chen
2019-12-09 6:19 ` Ming-Fan Chen
2019-12-09 6:19 ` Ming-Fan Chen
2019-12-13 19:10 ` Rob Herring
2019-12-13 19:10 ` Rob Herring
2019-12-13 19:10 ` Rob Herring
2019-12-09 6:19 ` Ming-Fan Chen [this message]
2019-12-09 6:19 ` [PATCH v2 2/2] memory: mtk-smi: Add bandwidth initial golden setting for MT6779 Ming-Fan Chen
2019-12-09 6:19 ` Ming-Fan Chen
2019-12-27 7:21 ` Yong Wu
2019-12-27 7:21 ` Yong Wu
2019-12-27 7:21 ` Yong Wu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1575872371-671-4-git-send-email-ming-fan.chen@mediatek.com \
--to=ming-fan.chen@mediatek.com \
--cc=devicetree@vger.kernel.org \
--cc=evgreen@chromium.org \
--cc=jroedel@suse.de \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mediatek@lists.infradead.org \
--cc=matthias.bgg@gmail.com \
--cc=robh+dt@kernel.org \
--cc=wsd_upstream@mediatek.com \
--cc=yong.wu@mediatek.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.