From: Sam Protsenko <semen.protsenko@linaro.org>
To: Marek Szyprowski <m.szyprowski@samsung.com>,
Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Cc: Janghyuck Kim <janghyuck.kim@samsung.com>,
linux-samsung-soc@vger.kernel.org, Will Deacon <will@kernel.org>,
iommu@lists.linux.dev, linux-kernel@vger.kernel.org,
iommu@lists.linux-foundation.org,
Cho KyongHo <pullip.cho@samsung.com>,
Robin Murphy <robin.murphy@arm.com>,
Sumit Semwal <sumit.semwal@linaro.org>,
linux-arm-kernel@lists.infradead.org
Subject: [PATCH 4/4] iommu/exynos: Add minimal support for SysMMU v7 with VM registers
Date: Sun, 3 Jul 2022 00:37:24 +0300 [thread overview]
Message-ID: <20220702213724.3949-5-semen.protsenko@linaro.org> (raw)
In-Reply-To: <20220702213724.3949-1-semen.protsenko@linaro.org>
Add minimal viable support for SysMMU v7.x, which can be found in modern
Exynos chips (like Exynos850). SysMMU v7.x may implement VM register
set, and those registers should be initialized properly if present.
Usually 8 translation domains are supported via VM registers (0..7), but
only n=0 (default) is used for now.
Changes are as follows:
- add enabling the default VID instance before enabling SysMMU
- use v7 VM register for setting the page table base address
- use v7 VM register for invalidation
Insights for those changes were taken by comparing the I/O dump
(writel() / readl() operations) for vendor driver and this upstream
driver.
It was tested on E850-96 board, which has SysMMU v7.4 with VM registers
present. The testing was done using "Emulated Translation" registers.
That allows initiating translations with no actual users of that IOMMU,
and checking the result by reading the TLB info from corresponding
registers.
Thanks to Marek, who did let me know it only takes a slight change of
registers to make this driver work with v7.
Signed-off-by: Sam Protsenko <semen.protsenko@linaro.org>
---
drivers/iommu/exynos-iommu.c | 16 ++++++++++++++--
1 file changed, 14 insertions(+), 2 deletions(-)
diff --git a/drivers/iommu/exynos-iommu.c b/drivers/iommu/exynos-iommu.c
index 47017e8945c5..b7b4833161bc 100644
--- a/drivers/iommu/exynos-iommu.c
+++ b/drivers/iommu/exynos-iommu.c
@@ -135,6 +135,8 @@ static u32 lv2ent_offset(sysmmu_iova_t iova)
#define CFG_SYSSEL (1 << 22) /* System MMU 3.2 only */
#define CFG_FLPDCACHE (1 << 20) /* System MMU 3.2+ only */
+#define CTRL_VM_ENABLE BIT(0)
+#define CTRL_VM_FAULT_MODE_STALL BIT(3)
#define CAPA0_CAPA1_EXIST BIT(11)
#define CAPA1_VCR_ENABLED BIT(14)
@@ -358,8 +360,10 @@ static void __sysmmu_tlb_invalidate(struct sysmmu_drvdata *data)
{
if (MMU_MAJ_VER(data->version) < 5)
writel(0x1, data->sfrbase + REG_MMU_FLUSH);
- else
+ else if (MMU_MAJ_VER(data->version) < 7)
writel(0x1, data->sfrbase + REG_V5_MMU_FLUSH_ALL);
+ else
+ writel(0x1, MMU_VM_REG(data, IDX_ALL_INV, 0));
}
static void __sysmmu_tlb_invalidate_entry(struct sysmmu_drvdata *data,
@@ -391,9 +395,11 @@ static void __sysmmu_set_ptbase(struct sysmmu_drvdata *data, phys_addr_t pgd)
{
if (MMU_MAJ_VER(data->version) < 5)
writel(pgd, data->sfrbase + REG_PT_BASE_ADDR);
- else
+ else if (MMU_MAJ_VER(data->version) < 7)
writel(pgd >> PAGE_SHIFT,
data->sfrbase + REG_V5_PT_BASE_PFN);
+ else
+ writel(pgd >> SPAGE_ORDER, MMU_VM_REG(data, IDX_FLPT_BASE, 0));
__sysmmu_tlb_invalidate(data);
}
@@ -571,6 +577,12 @@ static void __sysmmu_enable(struct sysmmu_drvdata *data)
writel(CTRL_BLOCK, data->sfrbase + REG_MMU_CTRL);
__sysmmu_init_config(data);
__sysmmu_set_ptbase(data, data->pgtable);
+ if (MMU_MAJ_VER(data->version) >= 7 && data->has_vcr) {
+ u32 ctrl = readl(MMU_VM_REG(data, IDX_CTRL_VM, 0));
+
+ ctrl |= CTRL_VM_ENABLE | CTRL_VM_FAULT_MODE_STALL;
+ writel(ctrl, MMU_VM_REG(data, IDX_CTRL_VM, 0));
+ }
writel(CTRL_ENABLE, data->sfrbase + REG_MMU_CTRL);
data->active = true;
spin_unlock_irqrestore(&data->lock, flags);
--
2.30.2
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
WARNING: multiple messages have this Message-ID (diff)
From: Sam Protsenko <semen.protsenko@linaro.org>
To: Marek Szyprowski <m.szyprowski@samsung.com>,
Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Cc: Joerg Roedel <joro@8bytes.org>, Will Deacon <will@kernel.org>,
Robin Murphy <robin.murphy@arm.com>,
Janghyuck Kim <janghyuck.kim@samsung.com>,
Cho KyongHo <pullip.cho@samsung.com>,
Daniel Mentz <danielmentz@google.com>,
Sumit Semwal <sumit.semwal@linaro.org>,
iommu@lists.linux-foundation.org, iommu@lists.linux.dev,
linux-arm-kernel@lists.infradead.org,
linux-samsung-soc@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH 4/4] iommu/exynos: Add minimal support for SysMMU v7 with VM registers
Date: Sun, 3 Jul 2022 00:37:24 +0300 [thread overview]
Message-ID: <20220702213724.3949-5-semen.protsenko@linaro.org> (raw)
Message-ID: <20220702213724.P1XGLJkP5Rv6OugTTVN2I4ZPp1c2jDEzOY3BIbl6CN8@z> (raw)
In-Reply-To: <20220702213724.3949-1-semen.protsenko@linaro.org>
Add minimal viable support for SysMMU v7.x, which can be found in modern
Exynos chips (like Exynos850). SysMMU v7.x may implement VM register
set, and those registers should be initialized properly if present.
Usually 8 translation domains are supported via VM registers (0..7), but
only n=0 (default) is used for now.
Changes are as follows:
- add enabling the default VID instance before enabling SysMMU
- use v7 VM register for setting the page table base address
- use v7 VM register for invalidation
Insights for those changes were taken by comparing the I/O dump
(writel() / readl() operations) for vendor driver and this upstream
driver.
It was tested on E850-96 board, which has SysMMU v7.4 with VM registers
present. The testing was done using "Emulated Translation" registers.
That allows initiating translations with no actual users of that IOMMU,
and checking the result by reading the TLB info from corresponding
registers.
Thanks to Marek, who did let me know it only takes a slight change of
registers to make this driver work with v7.
Signed-off-by: Sam Protsenko <semen.protsenko@linaro.org>
---
drivers/iommu/exynos-iommu.c | 16 ++++++++++++++--
1 file changed, 14 insertions(+), 2 deletions(-)
diff --git a/drivers/iommu/exynos-iommu.c b/drivers/iommu/exynos-iommu.c
index 47017e8945c5..b7b4833161bc 100644
--- a/drivers/iommu/exynos-iommu.c
+++ b/drivers/iommu/exynos-iommu.c
@@ -135,6 +135,8 @@ static u32 lv2ent_offset(sysmmu_iova_t iova)
#define CFG_SYSSEL (1 << 22) /* System MMU 3.2 only */
#define CFG_FLPDCACHE (1 << 20) /* System MMU 3.2+ only */
+#define CTRL_VM_ENABLE BIT(0)
+#define CTRL_VM_FAULT_MODE_STALL BIT(3)
#define CAPA0_CAPA1_EXIST BIT(11)
#define CAPA1_VCR_ENABLED BIT(14)
@@ -358,8 +360,10 @@ static void __sysmmu_tlb_invalidate(struct sysmmu_drvdata *data)
{
if (MMU_MAJ_VER(data->version) < 5)
writel(0x1, data->sfrbase + REG_MMU_FLUSH);
- else
+ else if (MMU_MAJ_VER(data->version) < 7)
writel(0x1, data->sfrbase + REG_V5_MMU_FLUSH_ALL);
+ else
+ writel(0x1, MMU_VM_REG(data, IDX_ALL_INV, 0));
}
static void __sysmmu_tlb_invalidate_entry(struct sysmmu_drvdata *data,
@@ -391,9 +395,11 @@ static void __sysmmu_set_ptbase(struct sysmmu_drvdata *data, phys_addr_t pgd)
{
if (MMU_MAJ_VER(data->version) < 5)
writel(pgd, data->sfrbase + REG_PT_BASE_ADDR);
- else
+ else if (MMU_MAJ_VER(data->version) < 7)
writel(pgd >> PAGE_SHIFT,
data->sfrbase + REG_V5_PT_BASE_PFN);
+ else
+ writel(pgd >> SPAGE_ORDER, MMU_VM_REG(data, IDX_FLPT_BASE, 0));
__sysmmu_tlb_invalidate(data);
}
@@ -571,6 +577,12 @@ static void __sysmmu_enable(struct sysmmu_drvdata *data)
writel(CTRL_BLOCK, data->sfrbase + REG_MMU_CTRL);
__sysmmu_init_config(data);
__sysmmu_set_ptbase(data, data->pgtable);
+ if (MMU_MAJ_VER(data->version) >= 7 && data->has_vcr) {
+ u32 ctrl = readl(MMU_VM_REG(data, IDX_CTRL_VM, 0));
+
+ ctrl |= CTRL_VM_ENABLE | CTRL_VM_FAULT_MODE_STALL;
+ writel(ctrl, MMU_VM_REG(data, IDX_CTRL_VM, 0));
+ }
writel(CTRL_ENABLE, data->sfrbase + REG_MMU_CTRL);
data->active = true;
spin_unlock_irqrestore(&data->lock, flags);
--
2.30.2
next prev parent reply other threads:[~2022-07-02 21:37 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-07-02 21:37 [PATCH 0/4] iommu/exynos: Add basic support for SysMMU v7 Sam Protsenko
2022-07-02 21:37 ` Sam Protsenko
2022-07-02 21:37 ` [PATCH 1/4] iommu/exynos: Set correct dma mask for SysMMU v5+ Sam Protsenko
2022-07-02 21:37 ` Sam Protsenko
2022-07-03 18:50 ` Krzysztof Kozlowski
2022-07-03 18:50 ` Krzysztof Kozlowski
2022-07-08 13:18 ` Sam Protsenko
2022-07-11 12:27 ` Krzysztof Kozlowski
2022-07-11 12:59 ` Robin Murphy
2022-07-02 21:37 ` [PATCH 2/4] iommu/exynos: Check if SysMMU v7 has VM registers Sam Protsenko
2022-07-02 21:37 ` Sam Protsenko
2022-07-03 19:10 ` Krzysztof Kozlowski
2022-07-03 19:10 ` Krzysztof Kozlowski
2022-07-08 13:34 ` Sam Protsenko
2022-07-02 21:37 ` [PATCH 3/4] iommu/exynos: Use lookup based approach to access v7 registers Sam Protsenko
2022-07-02 21:37 ` Sam Protsenko
2022-07-03 19:29 ` Krzysztof Kozlowski
2022-07-03 19:29 ` Krzysztof Kozlowski
2022-07-08 18:13 ` Sam Protsenko
2022-07-02 21:37 ` Sam Protsenko [this message]
2022-07-02 21:37 ` [PATCH 4/4] iommu/exynos: Add minimal support for SysMMU v7 with VM registers Sam Protsenko
2022-07-02 21:48 ` [PATCH 0/4] iommu/exynos: Add basic support for SysMMU v7 Sam Protsenko
2022-07-02 21:48 ` Sam Protsenko
2022-07-03 12:47 ` David Virag
2022-07-03 12:47 ` David Virag
2022-07-06 14:24 ` Sam Protsenko
2022-07-06 14:24 ` Sam Protsenko
2022-07-10 23:04 ` Sam Protsenko
2022-07-13 14:14 ` Sam Protsenko
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=20220702213724.3949-5-semen.protsenko@linaro.org \
--to=semen.protsenko@linaro.org \
--cc=iommu@lists.linux-foundation.org \
--cc=iommu@lists.linux.dev \
--cc=janghyuck.kim@samsung.com \
--cc=krzysztof.kozlowski@linaro.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-samsung-soc@vger.kernel.org \
--cc=m.szyprowski@samsung.com \
--cc=pullip.cho@samsung.com \
--cc=robin.murphy@arm.com \
--cc=sumit.semwal@linaro.org \
--cc=will@kernel.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox