From: Nicholas Piggin <npiggin@gmail.com>
To: linuxppc-dev@lists.ozlabs.org
Cc: Nicholas Piggin <npiggin@gmail.com>
Subject: [RFC PATCH 10/10] powerpc/powernv: OPAL V4 Implement vm_map/unmap service
Date: Sat, 2 May 2020 21:19:14 +1000 [thread overview]
Message-ID: <20200502111914.166578-11-npiggin@gmail.com> (raw)
In-Reply-To: <20200502111914.166578-1-npiggin@gmail.com>
This implements os_vm_map, os_vm_unmap. OPAL uses EA regions that
is specifies in OPAL_FIND_VM_AREA for these mappings, so provided
the page tables are allocated at init-time and not freed, these
services can be provided without memory allocation / blocking.
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
---
arch/powerpc/include/asm/opal-api.h | 2 +
arch/powerpc/platforms/powernv/opal.c | 57 +++++++++++++++++++++++++++
2 files changed, 59 insertions(+)
diff --git a/arch/powerpc/include/asm/opal-api.h b/arch/powerpc/include/asm/opal-api.h
index 1b2f176677fc..97c5e5423827 100644
--- a/arch/powerpc/include/asm/opal-api.h
+++ b/arch/powerpc/include/asm/opal-api.h
@@ -1205,6 +1205,8 @@ struct opal_vm_area {
struct opal_os_ops {
__be64 os_printf; /* void printf(int32_t level, const char *str) */
+ __be64 os_vm_map; /* int64_t os_vm_map(uint64_t ea, uint64_t pa, uint64_t flags) */
+ __be64 os_vm_unmap; /* void os_vm_unmap(uint64_t ea) */
};
#endif /* __ASSEMBLY__ */
diff --git a/arch/powerpc/platforms/powernv/opal.c b/arch/powerpc/platforms/powernv/opal.c
index 0fbfcd088c58..93b9afaf33b3 100644
--- a/arch/powerpc/platforms/powernv/opal.c
+++ b/arch/powerpc/platforms/powernv/opal.c
@@ -1095,6 +1095,61 @@ static pgprot_t opal_vm_flags_to_prot(uint64_t flags)
return prot;
}
+static int64_t os_vm_map(uint64_t ea, uint64_t pa, uint64_t flags)
+{
+ struct mm_struct *mm = opal_mm;
+ spinlock_t *ptl;
+ pte_t pte, *ptep;
+ pgprot_t prot;
+
+ if (WARN_ON_ONCE(!opal_mm_enabled))
+ return -EINVAL;
+
+ if (WARN_ON_ONCE(!(mfmsr() & (MSR_IR|MSR_DR))))
+ return -EINVAL;
+
+ /* mm should be active_mm if MMU is on here */
+
+// printk("os_vm_map 0x%llx->0x%llx flags=0x%llx\n", ea, pa, flags);
+
+ prot = opal_vm_flags_to_prot(flags);
+
+ pte = pfn_pte(pa >> PAGE_SHIFT, PAGE_KERNEL_X);
+
+ ptep = get_locked_pte(mm, ea, &ptl);
+ set_pte_at(mm, ea, ptep, pte);
+ pte_unmap_unlock(ptep, ptl);
+
+ return 0;
+}
+
+static void os_vm_unmap(uint64_t ea)
+{
+ struct mm_struct *mm = opal_mm;
+ spinlock_t *ptl;
+ pte_t *ptep;
+
+ if (WARN_ON_ONCE(!opal_mm_enabled))
+ return;
+
+ if (WARN_ON_ONCE(!(mfmsr() & (MSR_IR|MSR_DR))))
+ return;
+
+// printk("os_vm_unmap 0x%llx\n", ea);
+
+ /* mm should be active_mm if MMU is on here */
+
+ ptep = get_locked_pte(mm, ea, &ptl);
+ pte_clear(mm, ea, ptep);
+ pte_unmap_unlock(ptep, ptl);
+
+ /*
+ * This leaves potential TLBs in other CPUs for this EA, but it is
+ * only used by this CPU. Can't do a broadcast flush here, no IPIs.
+ */
+ local_flush_tlb_mm(mm);
+}
+
static int __init opal_init_mm(void)
{
struct mm_struct *mm;
@@ -1174,6 +1229,8 @@ static int __init opal_init_early(void)
memset(&opal_os_ops, 0, sizeof(opal_os_ops));
opal_os_ops.os_printf = cpu_to_be64(&os_printf);
+ opal_os_ops.os_vm_map = cpu_to_be64(&os_vm_map);
+ opal_os_ops.os_vm_unmap = cpu_to_be64(&os_vm_unmap);
if (opal_register_os_ops(&opal_os_ops, sizeof(opal_os_ops))) {
pr_warn("OPAL register OS ops failed, firmware will run in v3 mode.\n");
} else {
--
2.23.0
prev parent reply other threads:[~2020-05-02 11:57 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-05-02 11:19 [RFC PATCH 00/10] OPAL V4 Nicholas Piggin
2020-05-02 11:19 ` [RFC PATCH 01/10] kallsyms: architecture specific symbol lookups Nicholas Piggin
2020-05-02 11:19 ` [RFC PATCH 02/10] powerpc/powernv: Wire up OPAL address lookups Nicholas Piggin
2020-05-02 11:19 ` [RFC PATCH 03/10] powerpc/powernv: Use OPAL_REPORT_TRAP to cope with trap interrupts from OPAL Nicholas Piggin
2020-05-02 11:19 ` [RFC PATCH 04/10] powerpc/powernv: avoid polling in opal_get_chars Nicholas Piggin
2020-05-02 11:19 ` [RFC PATCH 05/10] powerpc/powernv: Don't translate kernel addresses to real addresses for OPAL Nicholas Piggin
2020-05-02 11:19 ` [RFC PATCH 06/10] powerpc/powernv: opal use new opal call entry point if it exists Nicholas Piggin
2020-05-06 7:02 ` Gautham R Shenoy
2020-05-02 11:19 ` [RFC PATCH 07/10] powerpc/powernv: Add OPAL_FIND_VM_AREA API Nicholas Piggin
2020-05-02 11:19 ` [RFC PATCH 08/10] powerpc/powernv: Set up an mm context to call OPAL in Nicholas Piggin
2020-05-02 11:19 ` [RFC PATCH 09/10] powerpc/powernv: OPAL V4 OS services Nicholas Piggin
2020-05-02 11:19 ` Nicholas Piggin [this message]
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=20200502111914.166578-11-npiggin@gmail.com \
--to=npiggin@gmail.com \
--cc=linuxppc-dev@lists.ozlabs.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;
as well as URLs for NNTP newsgroup(s).