From: Ethan Chen via <qemu-devel@nongnu.org>
To: Alistair Francis <alistair23@gmail.com>
Cc: <qemu-devel@nongnu.org>, <richard.henderson@linaro.org>,
<pbonzini@redhat.com>, <peterx@redhat.com>, <david@redhat.com>,
<philmd@linaro.org>, <palmer@dabbelt.com>,
<alistair.francis@wdc.com>, <bmeng.cn@gmail.com>,
<liwei1518@gmail.com>, <dbarboza@ventanamicro.com>,
<zhiwei_liu@linux.alibaba.com>, <qemu-riscv@nongnu.org>
Subject: Re: [PATCH v8 5/8] hw/misc/riscv_iopmp: Add API to set up IOPMP protection for system memory
Date: Mon, 12 Aug 2024 10:44:03 +0800 [thread overview]
Message-ID: <Zrl285mkcFd8BO75@ethan84-VirtualBox> (raw)
In-Reply-To: <CAKmqyKPPp2Dhti9KMPa=jgYyGJzgMsiGYMFSVTbMmpsrnaRsDQ@mail.gmail.com>
On Mon, Aug 12, 2024 at 10:47:33AM +1000, Alistair Francis wrote:
> [EXTERNAL MAIL]
>
> On Fri, Aug 9, 2024 at 8:11 PM Ethan Chen <ethan84@andestech.com> wrote:
> >
> > On Thu, Aug 08, 2024 at 02:23:56PM +1000, Alistair Francis wrote:
> > >
> > > On Mon, Jul 15, 2024 at 8:13 PM Ethan Chen via <qemu-devel@nongnu.org> wrote:
> > > >
> > > > To enable system memory transactions through the IOPMP, memory regions must
> > > > be moved to the IOPMP downstream and then replaced with IOMMUs for IOPMP
> > > > translation.
> > > >
> > > > The iopmp_setup_system_memory() function copies subregions of system memory
> > > > to create the IOPMP downstream and then replaces the specified memory
> > > > regions in system memory with the IOMMU regions of the IOPMP. It also
> > > > adds entries to a protection map that records the relationship between
> > > > physical address regions and the IOPMP, which is used by the IOPMP DMA
> > > > API to send transaction information.
> > > >
> > > > Signed-off-by: Ethan Chen <ethan84@andestech.com>
> > > > ---
> > > > hw/misc/riscv_iopmp.c | 61 +++++++++++++++++++++++++++++++++++
> > > > include/hw/misc/riscv_iopmp.h | 3 ++
> > > > 2 files changed, 64 insertions(+)
> > > >
> > > > diff --git a/hw/misc/riscv_iopmp.c b/hw/misc/riscv_iopmp.c
> > > > index db43e3c73f..e62ac57437 100644
> > > > --- a/hw/misc/riscv_iopmp.c
> > > > +++ b/hw/misc/riscv_iopmp.c
> > > > @@ -1151,4 +1151,65 @@ iopmp_register_types(void)
> > > > type_register_static(&iopmp_iommu_memory_region_info);
> > > > }
> > > >
> > > > +/*
> > > > + * Copies subregions from the source memory region to the destination memory
> > > > + * region
> > > > + */
> > > > +static void copy_memory_subregions(MemoryRegion *src_mr, MemoryRegion *dst_mr)
>
> Maybe `alias_memory_subregions()` or `link_memory_subregions()`
> instead of `copy_memory_subregions()`.
Thanks for the suggestion. I will clarify it.
>
> > > > +{
> > > > + int32_t priority;
> > > > + hwaddr addr;
> > > > + MemoryRegion *alias, *subregion;
> > > > + QTAILQ_FOREACH(subregion, &src_mr->subregions, subregions_link) {
> > > > + priority = subregion->priority;
> > > > + addr = subregion->addr;
> > > > + alias = g_malloc0(sizeof(MemoryRegion));
> > > > + memory_region_init_alias(alias, NULL, subregion->name, subregion, 0,
> > > > + memory_region_size(subregion));
> > > > + memory_region_add_subregion_overlap(dst_mr, addr, alias, priority);
> > > > + }
> > > > +}
> > >
> > > This seems strange. Do we really need to do this?
> > >
> > > I haven't looked at the memory_region stuff for awhile, but this seems
> > > clunky and prone to breakage.
> > >
> > > We already link s->iommu with the system memory
> > >
> >
> > s->iommu occupies the address of the protected devices in system
> > memory. Since IOPMP does not alter address, the target address space
> > must differ from system memory to avoid infinite recursive iommu access.
> >
> > The transaction will be redirected to a downstream memory region, which
> > is almost identical to system memory but without the iommu memory
> > region of IOPMP.
> >
> > This function serves as a helper to create that downstream memory region.
>
> What I don't understand is that we already have target_mr as a
> subregion of downstream, is that not enough?
>
Did you mean the target_mr in iopmp_setup_system_memory? It specifies
the container that IOPMP wants to protect. We don't create
separate iommus for each subregion. We create a single iommu for the
entire container (system memory).
The access to target_mr (system memory) which has iommu region of
IOPMP, will be translated to downstream which has protected device
regions.
Thanks,
Ethan Chen
next prev parent reply other threads:[~2024-08-12 2:45 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-15 9:56 [PATCH v8 0/8] Support RISC-V IOPMP Ethan Chen via
2024-07-15 9:56 ` [PATCH v8 1/8] memory: Introduce memory region fetch operation Ethan Chen via
2024-07-15 9:56 ` [PATCH v8 2/8] system/physmem: Support IOMMU granularity smaller than TARGET_PAGE size Ethan Chen via
2024-08-08 4:12 ` Alistair Francis
2024-07-15 9:56 ` [PATCH v8 3/8] target/riscv: Add support for IOPMP Ethan Chen via
2024-08-08 4:13 ` Alistair Francis
2024-07-15 9:56 ` [PATCH v8 4/8] hw/misc/riscv_iopmp: Add RISC-V IOPMP device Ethan Chen via
2024-08-08 3:56 ` Alistair Francis
2024-08-09 9:42 ` Ethan Chen via
2024-08-12 0:42 ` Alistair Francis
2024-08-09 10:03 ` Ethan Chen via
2024-07-15 10:12 ` [PATCH v8 5/8] hw/misc/riscv_iopmp: Add API to set up IOPMP protection for system memory Ethan Chen via
2024-08-08 4:23 ` Alistair Francis
2024-08-09 10:11 ` Ethan Chen via
2024-08-12 0:47 ` Alistair Francis
2024-08-12 2:44 ` Ethan Chen via [this message]
2024-07-15 10:14 ` [PATCH v8 6/8] hw/misc/riscv_iopmp: Add API to configure RISCV CPU IOPMP support Ethan Chen via
2024-08-08 4:25 ` Alistair Francis
2024-08-09 9:56 ` Ethan Chen via
2024-07-15 10:14 ` [PATCH v8 7/8] hw/misc/riscv_iopmp: Add DMA operation with IOPMP support API Ethan Chen via
2024-07-15 10:14 ` [PATCH v8 8/8] hw/riscv/virt: Add IOPMP support Ethan Chen via
2024-08-08 4:01 ` Alistair Francis
2024-08-09 10:14 ` Ethan Chen via
2024-08-12 0:48 ` Alistair Francis
2024-08-12 2:55 ` Ethan Chen via
2024-11-05 18:36 ` [PATCH v8 0/8] Support RISC-V IOPMP Daniel Henrique Barboza
2024-11-08 1:16 ` Ethan Chen via
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=Zrl285mkcFd8BO75@ethan84-VirtualBox \
--to=qemu-devel@nongnu.org \
--cc=alistair.francis@wdc.com \
--cc=alistair23@gmail.com \
--cc=bmeng.cn@gmail.com \
--cc=david@redhat.com \
--cc=dbarboza@ventanamicro.com \
--cc=ethan84@andestech.com \
--cc=liwei1518@gmail.com \
--cc=palmer@dabbelt.com \
--cc=pbonzini@redhat.com \
--cc=peterx@redhat.com \
--cc=philmd@linaro.org \
--cc=qemu-riscv@nongnu.org \
--cc=richard.henderson@linaro.org \
--cc=zhiwei_liu@linux.alibaba.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 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).