From: Stephen Boyd <swboyd@chromium.org> To: linux-kernel@vger.kernel.org Cc: linux-arm-msm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, devicetree@vger.kernel.org, Evan Green <evgreen@chromium.org>, Rob Herring <robh+dt@kernel.org>, Bjorn Andersson <bjorn.andersson@linaro.org>, Andy Gross <agross@kernel.org>, Will Deacon <will.deacon@arm.com>, Catalin Marinas <catalin.marinas@arm.com>, Dan Williams <dan.j.williams@intel.com> Subject: [RFC/PATCH 3/5] memremap: Add support for read-only memory mappings Date: Fri, 17 May 2019 09:47:44 -0700 [thread overview] Message-ID: <20190517164746.110786-4-swboyd@chromium.org> (raw) In-Reply-To: <20190517164746.110786-1-swboyd@chromium.org> Sometimes we have memories that are supposed to be read-only, but when we map these regions the best we can do is map them as write-back with MEMREMAP_WB. Introduce a read-only memory mapping (MEMREMAP_RO) that allows us to map reserved memory regions as read-only. This way, we're less likely to see these special memory regions become corrupted by stray writes to them. Cc: Evan Green <evgreen@chromium.org> Cc: Rob Herring <robh+dt@kernel.org> Cc: Bjorn Andersson <bjorn.andersson@linaro.org> Cc: Andy Gross <agross@kernel.org> Cc: Will Deacon <will.deacon@arm.com> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Dan Williams <dan.j.williams@intel.com> Signed-off-by: Stephen Boyd <swboyd@chromium.org> --- include/linux/io.h | 1 + kernel/iomem.c | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/include/linux/io.h b/include/linux/io.h index 32e30e8fb9db..16c7f4498869 100644 --- a/include/linux/io.h +++ b/include/linux/io.h @@ -159,6 +159,7 @@ enum { MEMREMAP_WC = 1 << 2, MEMREMAP_ENC = 1 << 3, MEMREMAP_DEC = 1 << 4, + MEMREMAP_RO = 1 << 5, }; void *memremap(resource_size_t offset, size_t size, unsigned long flags); diff --git a/kernel/iomem.c b/kernel/iomem.c index f7525e14ebc6..8d3cf74a32cb 100644 --- a/kernel/iomem.c +++ b/kernel/iomem.c @@ -19,6 +19,13 @@ static void *arch_memremap_wb(resource_size_t offset, unsigned long size) } #endif +#ifndef arch_memremap_ro +static void *arch_memremap_ro(resource_size_t offset, unsigned long size) +{ + return NULL; +} +#endif + #ifndef arch_memremap_can_ram_remap static bool arch_memremap_can_ram_remap(resource_size_t offset, size_t size, unsigned long flags) @@ -84,7 +91,10 @@ void *memremap(resource_size_t offset, size_t size, unsigned long flags) } /* Try all mapping types requested until one returns non-NULL */ - if (flags & MEMREMAP_WB) { + if ((flags & MEMREMAP_RO) && is_ram != REGION_INTERSECTS) + addr = arch_memremap_ro(offset, size); + + if (!addr && (flags & MEMREMAP_WB)) { /* * MEMREMAP_WB is special in that it can be satisifed * from the direct map. Some archs depend on the @@ -103,7 +113,8 @@ void *memremap(resource_size_t offset, size_t size, unsigned long flags) * address mapping. Enforce that this mapping is not aliasing * System RAM. */ - if (!addr && is_ram == REGION_INTERSECTS && flags != MEMREMAP_WB) { + if (!addr && is_ram == REGION_INTERSECTS && + (flags != MEMREMAP_WB || flags != MEMREMAP_RO)) { WARN_ONCE(1, "memremap attempted on ram %pa size: %#lx\n", &offset, (unsigned long) size); return NULL; -- Sent by a computer through tubes
WARNING: multiple messages have this Message-ID (diff)
From: Stephen Boyd <swboyd@chromium.org> To: linux-kernel@vger.kernel.org Cc: devicetree@vger.kernel.org, linux-arm-msm@vger.kernel.org, Will Deacon <will.deacon@arm.com>, Andy Gross <agross@kernel.org>, Evan Green <evgreen@chromium.org>, Bjorn Andersson <bjorn.andersson@linaro.org>, Rob Herring <robh+dt@kernel.org>, Catalin Marinas <catalin.marinas@arm.com>, Dan Williams <dan.j.williams@intel.com>, linux-arm-kernel@lists.infradead.org Subject: [RFC/PATCH 3/5] memremap: Add support for read-only memory mappings Date: Fri, 17 May 2019 09:47:44 -0700 [thread overview] Message-ID: <20190517164746.110786-4-swboyd@chromium.org> (raw) In-Reply-To: <20190517164746.110786-1-swboyd@chromium.org> Sometimes we have memories that are supposed to be read-only, but when we map these regions the best we can do is map them as write-back with MEMREMAP_WB. Introduce a read-only memory mapping (MEMREMAP_RO) that allows us to map reserved memory regions as read-only. This way, we're less likely to see these special memory regions become corrupted by stray writes to them. Cc: Evan Green <evgreen@chromium.org> Cc: Rob Herring <robh+dt@kernel.org> Cc: Bjorn Andersson <bjorn.andersson@linaro.org> Cc: Andy Gross <agross@kernel.org> Cc: Will Deacon <will.deacon@arm.com> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Dan Williams <dan.j.williams@intel.com> Signed-off-by: Stephen Boyd <swboyd@chromium.org> --- include/linux/io.h | 1 + kernel/iomem.c | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/include/linux/io.h b/include/linux/io.h index 32e30e8fb9db..16c7f4498869 100644 --- a/include/linux/io.h +++ b/include/linux/io.h @@ -159,6 +159,7 @@ enum { MEMREMAP_WC = 1 << 2, MEMREMAP_ENC = 1 << 3, MEMREMAP_DEC = 1 << 4, + MEMREMAP_RO = 1 << 5, }; void *memremap(resource_size_t offset, size_t size, unsigned long flags); diff --git a/kernel/iomem.c b/kernel/iomem.c index f7525e14ebc6..8d3cf74a32cb 100644 --- a/kernel/iomem.c +++ b/kernel/iomem.c @@ -19,6 +19,13 @@ static void *arch_memremap_wb(resource_size_t offset, unsigned long size) } #endif +#ifndef arch_memremap_ro +static void *arch_memremap_ro(resource_size_t offset, unsigned long size) +{ + return NULL; +} +#endif + #ifndef arch_memremap_can_ram_remap static bool arch_memremap_can_ram_remap(resource_size_t offset, size_t size, unsigned long flags) @@ -84,7 +91,10 @@ void *memremap(resource_size_t offset, size_t size, unsigned long flags) } /* Try all mapping types requested until one returns non-NULL */ - if (flags & MEMREMAP_WB) { + if ((flags & MEMREMAP_RO) && is_ram != REGION_INTERSECTS) + addr = arch_memremap_ro(offset, size); + + if (!addr && (flags & MEMREMAP_WB)) { /* * MEMREMAP_WB is special in that it can be satisifed * from the direct map. Some archs depend on the @@ -103,7 +113,8 @@ void *memremap(resource_size_t offset, size_t size, unsigned long flags) * address mapping. Enforce that this mapping is not aliasing * System RAM. */ - if (!addr && is_ram == REGION_INTERSECTS && flags != MEMREMAP_WB) { + if (!addr && is_ram == REGION_INTERSECTS && + (flags != MEMREMAP_WB || flags != MEMREMAP_RO)) { WARN_ONCE(1, "memremap attempted on ram %pa size: %#lx\n", &offset, (unsigned long) size); return NULL; -- Sent by a computer through tubes _______________________________________________ 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-05-17 16:48 UTC|newest] Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-05-17 16:47 [RFC/PATCH 0/5] Read-only memremap() proposal Stephen Boyd 2019-05-17 16:47 ` Stephen Boyd 2019-05-17 16:47 ` [RFC/PATCH 1/5] reserved_mem: Add a devm_memremap_reserved_mem() API Stephen Boyd 2019-05-17 16:47 ` Stephen Boyd 2019-06-13 22:51 ` Rob Herring 2019-06-13 22:51 ` Rob Herring 2019-05-17 16:47 ` [RFC/PATCH 2/5] soc: qcom: cmd-db: Migrate to devm_memremap_reserved_mem() Stephen Boyd 2019-05-17 16:47 ` Stephen Boyd 2019-05-17 16:47 ` Stephen Boyd [this message] 2019-05-17 16:47 ` [RFC/PATCH 3/5] memremap: Add support for read-only memory mappings Stephen Boyd 2019-05-17 16:47 ` [RFC/PATCH 4/5] arm64: Add support for arch_memremap_ro() Stephen Boyd 2019-05-17 16:47 ` Stephen Boyd 2019-06-03 15:56 ` Catalin Marinas 2019-06-03 15:56 ` Catalin Marinas 2019-06-04 16:54 ` Stephen Boyd 2019-06-04 16:54 ` Stephen Boyd 2019-05-17 16:47 ` [RFC/PATCH 5/5] soc: qcom: cmd-db: Map with read-only mappings Stephen Boyd 2019-05-17 16:47 ` Stephen Boyd 2019-05-17 17:35 ` [RFC/PATCH 0/5] Read-only memremap() proposal Bjorn Andersson 2019-05-17 17:35 ` Bjorn Andersson
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=20190517164746.110786-4-swboyd@chromium.org \ --to=swboyd@chromium.org \ --cc=agross@kernel.org \ --cc=bjorn.andersson@linaro.org \ --cc=catalin.marinas@arm.com \ --cc=dan.j.williams@intel.com \ --cc=devicetree@vger.kernel.org \ --cc=evgreen@chromium.org \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-arm-msm@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=robh+dt@kernel.org \ --cc=will.deacon@arm.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: linkBe 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.