From: Nicolin Chen <nicolinc@nvidia.com>
To: Vasant Hegde <vasant.hegde@amd.com>
Cc: <jgg@nvidia.com>, <kevin.tian@intel.com>, <corbet@lwn.net>,
<will@kernel.org>, <bagasdotme@gmail.com>, <robin.murphy@arm.com>,
<joro@8bytes.org>, <thierry.reding@gmail.com>,
<vdumpa@nvidia.com>, <jonathanh@nvidia.com>, <shuah@kernel.org>,
<jsnitsel@redhat.com>, <nathan@kernel.org>,
<peterz@infradead.org>, <yi.l.liu@intel.com>,
<mshavit@google.com>, <praan@google.com>,
<zhangzekun11@huawei.com>, <iommu@lists.linux.dev>,
<linux-doc@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
<linux-arm-kernel@lists.infradead.org>,
<linux-tegra@vger.kernel.org>, <linux-kselftest@vger.kernel.org>,
<patches@lists.linux.dev>, <mochs@nvidia.com>,
<alok.a.tiwari@oracle.com>,
Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
Subject: Re: [PATCH v2 10/22] iommufd/viommmu: Add IOMMUFD_CMD_VCMDQ_ALLOC ioctl
Date: Mon, 28 Apr 2025 23:45:20 -0700 [thread overview]
Message-ID: <aBB1gLfahnLmn0N1@Asurada-Nvidia> (raw)
In-Reply-To: <b8338b47-6fbf-44ac-9b99-3555997c9f36@amd.com>
On Tue, Apr 29, 2025 at 11:04:06AM +0530, Vasant Hegde wrote:
> On 4/29/2025 1:32 AM, Nicolin Chen wrote:
> > On Mon, Apr 28, 2025 at 05:42:27PM +0530, Vasant Hegde wrote:
> >>> +/**
> >>> + * struct iommu_vcmdq_alloc - ioctl(IOMMU_VCMDQ_ALLOC)
> >>> + * @size: sizeof(struct iommu_vcmdq_alloc)
> >>> + * @flags: Must be 0
> >>> + * @viommu_id: Virtual IOMMU ID to associate the virtual command queue with
> >>> + * @type: One of enum iommu_vcmdq_type
> >>> + * @index: The logical index to the virtual command queue per virtual IOMMU, for
> >>> + * a multi-queue model
> >>> + * @out_vcmdq_id: The ID of the new virtual command queue
> >>> + * @addr: Base address of the queue memory in the guest physical address space
> >>
> >> Sorry. I didn't get this part.
> >>
> >> So here `addr` is command queue base address like
> >> - NVIDIA's virtual command queue
> >> - AMD vIOMMU's command buffer
> >>
> >> .. and it will allocate vcmdq for each buffer type. Is that the correct
> >> understanding?
> >
> > Yes. For AMD "vIOMMU", it needs a new type for iommufd vIOMMU:
> > IOMMU_VIOMMU_TYPE_AMD_VIOMMU,
> >
> > For AMD "vIOMMU" command buffer, it needs a new type too:
> > IOMMU_VCMDQ_TYPE_AMD_VIOMMU, /* Kdoc it to be Command Buffer */
>
> You are suggesting we define one type for AMD and use it for all buffers like
> command buffer, event log, PPR buffet etc? and use iommu_vcmdq_alloc->index to
> identity different buffer type?
We have vEVENTQ for event logging and FAULT_QUEUE for PRI, but both
are not for hardware accelerated use cases.
I didn't check the details of AMD's event log and PPR buffers. But
they seem to be the same ring buffers and can be consumed by guest
kernel directly?
Will the hardware replace the physical device ID in the event with
the virtual device ID when injecting the event to a guest event/PPR
queue? If so, yea, I think you can define them separately using the
vCMDQ infrastructures:
- IOMMU_VCMDQ_TYPE_AMD_VIOMMU_CMDBUF
- IOMMU_VCMDQ_TYPE_AMD_VIOMMU_EVENTLOG
- IOMMU_VCMDQ_TYPE_AMD_VIOMMU_PPRLOG
(@Kevin @Jason Hmm, in this case we might want to revert the naming
"vCMDQ" back to "vQEUEUE", once Vasant confirms.)
Each of them will be allocated on top of one vIOMMU object.
As for index, it really depends on how vIOMMU manages those vCMDQ
objects. In NVIDIA case, each VINTF can support multiple vCMDQs of
the same type (like smp in CPU term). If AMD is a similar case, yea,
apply an index to each of them is a good idea. Otherwise, if vIOMMU
could only have three queues and their types are different, perhaps
the driver-level vIOMMU structure could just hold three pointers to
manage them without using the index.
> > Then, use IOMMUFD_CMD_VIOMMU_ALLOC ioctl to allocate an vIOMMU
> > obj, and use IOMMUFD_CMD_VCMDQ_ALLOC ioctl(s) to allocate vCMDQ
> > objs.
> >
> >> In case of AMD vIOMMU, buffer base address is programmed in different register
> >> (ex: MMIO Offset 0008h Command Buffer Base Address Register) and buffer
> >> enable/disable is done via different register (ex: MMIO Offset 0018h IOMMU
> >> Control Register). And we need to communicate both to hypervisor. Not sure this
> >> API can accommodate this as addr seems to be mandatory.
> >
> > NVIDIA's CMDQV has all three of them too. What we do here is to
> > let VMM trap the buffer base address (in guest physical address
> > space) and forward it to kernel using this @addr. Then, kernel
> > will translate this @addr to host physical address space, and
> > program the physical address and size to the register.
>
> Right. For AMD IOMMU 1st 4K of MMIO space (which contains all buffer base
> address registers) is not accelerated. So we can trap it and pass GPA, size to
> iommufd.
Yes.
> .. but programming base register (like Command buffer base addr) is not
> sufficient. We have to enable the command buffer by setting particular bit in
> Control register. So at high level flow is something like below (@Suravee,
> correct me if I missed something here).
>
> From guest side :
> Write command bufer base addr, size (MMIO offset 0x08)
> Set MMIO Offset 0x18[bit 12]
> Also we need to program few other bits that are not related to these buffers
> like `Completion wait interrupt enable`.
>
> From VMM side:
> We need to trap both register and pass it to iommufd
>
> From Host AMD IOMMU driver:
> We have to program VFCntlMMIO Offset {16’b[GuestID], 6’b10_0000}
>
>
> We need a way to pass Control register details to iommufd -> AMD driver so that
> we can program the VF control MMIO register.
>
> Since iommu_vcmdq_alloc structure doesn't have user_data, how do we communicate
> control register?
BIT(12) is the CMD enable bit. VMM can trap that as the trigger to
forward the base address/length and other info.
And you'd likely need to define a driver structure:
// Add this to struct iommu_vcmdq_alloc;
+ * @data_len: Length of the type specific data
+ * @data_uptr: User pointer to the type specific data
..
+ __u32 data_len;
+ __aligned_u64 data_uptr;
// Refer to my patch in the v1 series that handles the user_data:
// https://lore.kernel.org/linux-iommu/5cd2c7c4d92c79baf0cfc59e2a6b3e1db4e86ab8.1744353300.git.nicolinc@nvidia.com/
// Define a driver structure
struct iommu_vcmdq_amd_viommu_cmdbuf {
__u32 flags;
__u32 data;
};
Thanks
Nicolin
next prev parent reply other threads:[~2025-04-29 6:45 UTC|newest]
Thread overview: 146+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-04-26 5:57 [PATCH v2 00/22] iommufd: Add vIOMMU infrastructure (Part-4 vCMDQ) Nicolin Chen
2025-04-26 5:57 ` [PATCH v2 01/22] iommufd/viommu: Add driver-allocated vDEVICE support Nicolin Chen
2025-04-27 6:23 ` Baolu Lu
2025-04-28 0:41 ` Tian, Kevin
2025-04-28 18:08 ` Nicolin Chen
2025-04-26 5:57 ` [PATCH v2 02/22] iommu: Pass in a driver-level user data structure to viommu_alloc op Nicolin Chen
2025-04-27 6:31 ` Baolu Lu
2025-04-28 17:19 ` Nicolin Chen
2025-04-28 17:28 ` Pranjal Shrivastava
2025-04-26 5:57 ` [PATCH v2 03/22] iommufd/viommu: Allow driver-specific user data for a vIOMMU object Nicolin Chen
2025-04-27 6:36 ` Baolu Lu
2025-04-28 17:52 ` Pranjal Shrivastava
2025-04-30 14:58 ` ALOK TIWARI
2025-04-26 5:57 ` [PATCH v2 04/22] iommu: Add iommu_copy_struct_to_user helper Nicolin Chen
2025-04-27 6:39 ` Baolu Lu
2025-04-28 17:50 ` Pranjal Shrivastava
2025-04-28 18:21 ` Nicolin Chen
2025-04-29 8:31 ` Pranjal Shrivastava
2025-04-26 5:58 ` [PATCH v2 05/22] iommufd: Add iommufd_struct_destroy to revert iommufd_viommu_alloc Nicolin Chen
2025-04-27 6:55 ` Baolu Lu
2025-04-28 17:24 ` Nicolin Chen
2025-04-26 5:58 ` [PATCH v2 06/22] iommufd/selftest: Support user_data in mock_viommu_alloc Nicolin Chen
2025-04-28 18:56 ` Pranjal Shrivastava
2025-04-26 5:58 ` [PATCH v2 07/22] iommufd/selftest: Add covearge for viommu data Nicolin Chen
2025-04-28 19:02 ` Pranjal Shrivastava
2025-04-26 5:58 ` [PATCH v2 08/22] iommufd: Abstract iopt_pin_pages and iopt_unpin_pages helpers Nicolin Chen
2025-04-27 7:22 ` Baolu Lu
2025-04-28 17:41 ` Nicolin Chen
2025-05-05 15:01 ` Jason Gunthorpe
2025-05-05 15:44 ` Nicolin Chen
2025-05-05 15:55 ` Jason Gunthorpe
2025-05-05 16:03 ` Nicolin Chen
2025-05-05 16:05 ` Jason Gunthorpe
2025-05-05 16:19 ` Nicolin Chen
2025-05-05 16:56 ` Jason Gunthorpe
2025-04-28 20:14 ` Pranjal Shrivastava
2025-04-28 22:12 ` Nicolin Chen
2025-04-28 23:34 ` Nicolin Chen
2025-04-29 18:03 ` Pranjal Shrivastava
2025-05-06 9:36 ` Tian, Kevin
2025-05-06 19:17 ` Nicolin Chen
2025-05-07 7:22 ` Tian, Kevin
2025-05-07 7:36 ` Nicolin Chen
2025-05-07 7:51 ` Tian, Kevin
2025-04-26 5:58 ` [PATCH v2 09/22] iommufd/viommu: Introduce IOMMUFD_OBJ_VCMDQ and its related struct Nicolin Chen
2025-04-28 1:09 ` Baolu Lu
2025-04-28 18:10 ` Nicolin Chen
2025-05-05 15:02 ` Jason Gunthorpe
2025-05-05 15:45 ` Nicolin Chen
2025-04-28 21:01 ` Pranjal Shrivastava
2025-04-26 5:58 ` [PATCH v2 10/22] iommufd/viommmu: Add IOMMUFD_CMD_VCMDQ_ALLOC ioctl Nicolin Chen
2025-04-28 1:32 ` Baolu Lu
2025-04-28 18:58 ` Nicolin Chen
2025-04-29 6:11 ` Baolu Lu
2025-04-28 12:12 ` Vasant Hegde
2025-04-28 20:02 ` Nicolin Chen
2025-04-29 5:34 ` Vasant Hegde
2025-04-29 6:45 ` Nicolin Chen [this message]
2025-04-29 10:22 ` Vasant Hegde
2025-04-29 17:14 ` Nicolin Chen
2025-04-30 4:22 ` Vasant Hegde
2025-04-30 8:01 ` Nicolin Chen
2025-04-30 10:21 ` Vasant Hegde
2025-05-06 9:25 ` Tian, Kevin
2025-05-06 20:12 ` Nicolin Chen
2025-05-07 7:25 ` Tian, Kevin
2025-05-07 7:37 ` Nicolin Chen
2025-05-07 12:33 ` Jason Gunthorpe
2025-05-07 20:51 ` Nicolin Chen
2025-04-28 21:34 ` Pranjal Shrivastava
2025-04-28 22:44 ` Nicolin Chen
2025-04-29 8:28 ` Pranjal Shrivastava
2025-04-29 18:10 ` Pranjal Shrivastava
2025-04-29 18:15 ` Nicolin Chen
2025-04-29 18:57 ` Pranjal Shrivastava
2025-04-26 5:58 ` [PATCH v2 11/22] iommufd: Add for-driver helpers iommufd_vcmdq_depend/undepend() Nicolin Chen
2025-04-28 2:22 ` Baolu Lu
2025-04-28 18:17 ` Nicolin Chen
2025-04-29 12:40 ` Pranjal Shrivastava
2025-04-29 17:10 ` Nicolin Chen
2025-04-29 17:59 ` Pranjal Shrivastava
2025-04-29 18:07 ` Nicolin Chen
2025-04-29 18:44 ` Pranjal Shrivastava
2025-04-26 5:58 ` [PATCH v2 12/22] iommufd/selftest: Add coverage for IOMMUFD_CMD_VCMDQ_ALLOC Nicolin Chen
2025-04-26 5:58 ` [PATCH v2 13/22] iommufd: Add mmap interface Nicolin Chen
2025-04-28 2:50 ` Baolu Lu
2025-04-28 18:54 ` Nicolin Chen
2025-05-05 16:50 ` Jason Gunthorpe
2025-05-05 17:21 ` Nicolin Chen
2025-05-05 17:28 ` Jason Gunthorpe
2025-05-05 20:07 ` Nicolin Chen
2025-05-06 9:22 ` Tian, Kevin
2025-05-06 12:55 ` Jason Gunthorpe
2025-05-06 12:54 ` Jason Gunthorpe
2025-05-06 20:54 ` Nicolin Chen
2025-05-07 12:36 ` Jason Gunthorpe
2025-05-07 20:49 ` Nicolin Chen
2025-04-29 20:24 ` Pranjal Shrivastava
2025-04-29 20:34 ` Pranjal Shrivastava
2025-04-29 20:39 ` Nicolin Chen
2025-04-29 20:55 ` Pranjal Shrivastava
2025-04-29 21:05 ` Nicolin Chen
2025-04-29 21:35 ` Pranjal Shrivastava
2025-04-29 21:46 ` Nicolin Chen
2025-04-29 21:57 ` Pranjal Shrivastava
2025-05-05 16:55 ` Jason Gunthorpe
2025-05-05 17:27 ` Nicolin Chen
2025-05-05 17:31 ` Jason Gunthorpe
2025-05-05 19:50 ` Nicolin Chen
2025-05-06 12:52 ` Jason Gunthorpe
2025-05-06 19:30 ` Nicolin Chen
2025-05-07 12:39 ` Jason Gunthorpe
2025-05-07 21:09 ` Nicolin Chen
2025-05-07 22:08 ` Jason Gunthorpe
2025-05-08 3:49 ` Nicolin Chen
2025-05-08 9:15 ` Tian, Kevin
2025-05-08 12:12 ` Jason Gunthorpe
2025-05-08 17:14 ` Nicolin Chen
2025-05-05 18:47 ` Pranjal Shrivastava
2025-04-26 5:58 ` [PATCH v2 14/22] iommufd/selftest: Add coverage for the new " Nicolin Chen
2025-04-26 5:58 ` [PATCH v2 15/22] Documentation: userspace-api: iommufd: Update vCMDQ Nicolin Chen
2025-04-28 14:31 ` Bagas Sanjaya
2025-04-28 19:00 ` Nicolin Chen
2025-04-26 5:58 ` [PATCH v2 16/22] iommu/arm-smmu-v3-iommufd: Add vsmmu_alloc impl op Nicolin Chen
2025-04-29 21:36 ` Pranjal Shrivastava
2025-04-26 5:58 ` [PATCH v2 17/22] iommu/arm-smmu-v3-iommufd: Support implementation-defined hw_info Nicolin Chen
2025-04-29 21:44 ` Pranjal Shrivastava
2025-04-26 5:58 ` [PATCH v2 18/22] iommu/tegra241-cmdqv: Use request_threaded_irq Nicolin Chen
2025-04-29 21:47 ` Pranjal Shrivastava
2025-04-26 5:58 ` [PATCH v2 19/22] iommu/tegra241-cmdqv: Simplify deinit flow in tegra241_cmdqv_remove_vintf() Nicolin Chen
2025-04-29 22:05 ` Pranjal Shrivastava
2025-04-26 5:58 ` [PATCH v2 20/22] iommu/tegra241-cmdqv: Do not statically map LVCMDQs Nicolin Chen
2025-04-29 20:43 ` ALOK TIWARI
2025-04-29 22:32 ` Pranjal Shrivastava
2025-04-29 22:37 ` Nicolin Chen
2025-04-26 5:58 ` [PATCH v2 21/22] iommu/tegra241-cmdqv: Add user-space use support Nicolin Chen
2025-04-29 19:47 ` ALOK TIWARI
2025-04-29 21:12 ` Nicolin Chen
2025-04-30 21:59 ` Pranjal Shrivastava
2025-04-30 22:39 ` Nicolin Chen
2025-05-01 0:54 ` Nicolin Chen
2025-05-01 21:46 ` Pranjal Shrivastava
2025-05-01 21:45 ` Pranjal Shrivastava
2025-04-26 5:58 ` [PATCH v2 22/22] iommu/tegra241-cmdqv: Add IOMMU_VEVENTQ_TYPE_TEGRA241_CMDQV support Nicolin Chen
2025-04-30 15:07 ` ALOK TIWARI
2025-04-30 22:03 ` Pranjal Shrivastava
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=aBB1gLfahnLmn0N1@Asurada-Nvidia \
--to=nicolinc@nvidia.com \
--cc=alok.a.tiwari@oracle.com \
--cc=bagasdotme@gmail.com \
--cc=corbet@lwn.net \
--cc=iommu@lists.linux.dev \
--cc=jgg@nvidia.com \
--cc=jonathanh@nvidia.com \
--cc=joro@8bytes.org \
--cc=jsnitsel@redhat.com \
--cc=kevin.tian@intel.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-tegra@vger.kernel.org \
--cc=mochs@nvidia.com \
--cc=mshavit@google.com \
--cc=nathan@kernel.org \
--cc=patches@lists.linux.dev \
--cc=peterz@infradead.org \
--cc=praan@google.com \
--cc=robin.murphy@arm.com \
--cc=shuah@kernel.org \
--cc=suravee.suthikulpanit@amd.com \
--cc=thierry.reding@gmail.com \
--cc=vasant.hegde@amd.com \
--cc=vdumpa@nvidia.com \
--cc=will@kernel.org \
--cc=yi.l.liu@intel.com \
--cc=zhangzekun11@huawei.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).