All of lore.kernel.org
 help / color / mirror / Atom feed
From: Aneesh Kumar K.V <aneesh.kumar@kernel.org>
To: Jason Gunthorpe <jgg@ziepe.ca>
Cc: Nicolin Chen <nicolinc@nvidia.com>,
	linux-coco@lists.linux.dev, kvmarm@lists.linux.dev,
	linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org, Alexey Kardashevskiy <aik@amd.com>,
	Catalin Marinas <catalin.marinas@arm.com>,
	Dan Williams <dan.j.williams@intel.com>,
	Joerg Roedel <joro@8bytes.org>,
	Jonathan Cameron <jic23@kernel.org>,
	Marc Zyngier <maz@kernel.org>,
	Pranjal Shrivastava <praan@google.com>,
	Robin Murphy <robin.murphy@arm.com>,
	Samuel Ortiz <sameo@rivosinc.com>,
	Steven Price <steven.price@arm.com>,
	Suzuki K Poulose <Suzuki.Poulose@arm.com>,
	Will Deacon <will@kernel.org>,
	Xu Yilun <yilun.xu@linux.intel.com>
Subject: Re: [RFC PATCH v4 03/16] iommu/arm-smmu-v3: Add initial pSMMU realm viommu plumbing
Date: Thu, 03 Sep 2026 11:18:47 +0530	[thread overview]
Message-ID: <yq5a8q5izxz4.fsf@kernel.org> (raw)
In-Reply-To: <20260902235609.GG2890729@ziepe.ca>

Jason Gunthorpe <jgg@ziepe.ca> writes:

> On Wed, Sep 02, 2026 at 10:09:15PM +0530, Aneesh Kumar K.V wrote:
>> static int arm_realm_smmu_v3_vdevice_init(struct iommufd_vdevice *vdev)
>> {
>> 	struct device *dev = iommufd_vdevice_to_device(vdev);
>> 	struct kvm *kvm = vdev->viommu->kvm_file->private_data;
>> 	struct arm_smmu_device *smmu;
>> 	struct arm_smmu_stream *stream;
>> 	struct arm_smmu_master *master;
>> 	unsigned long rmi_ret = 0;
>> 	unsigned long l2_sid;
>> 	int ret;
>> 
>> 	if (!tsm_is_configured(dev))
>> 		return 0;
>> 
>> 	master = dev_iommu_priv_get(dev);
>> 	/* FIXME which stream to pick */
>> 	/* At this moment, iommufd only supports PCI device that has one SID */
>> 	stream = &master->streams[0];
>> 	smmu = master->smmu;
>> 
>> 	l2_sid = ALIGN_DOWN(stream->id, STRTAB_NUM_L2_STES);
>> 
>> 	{
>> 		guard(mutex)(&smmu->realm.mutex);
>> 
>> 		if (!arm_realm_smmu_active(smmu))
>> 			return -EINVAL;
>> 
>> 		ret = rmi_psmmu_st_l2_create(smmu->base_phys, l2_sid,
>> 					     &rmi_ret);
>> 		if (ret || rmi_ret) {
>> 			if (!ret)
>> 				return -EIO;
>> 			if (RMI_RETURN_STATUS(rmi_ret) != RMI_ERROR_PSMMU_ST ||
>> 			    RMI_RETURN_INDEX(rmi_ret) != 2) {
>> 				dev_warn(dev, "failed to create realm stream mapping\n");
>> 				return -EIO;
>> 			}
>> 			/* The L2 stream table already exists. */
>> 		}
>> 	}
>> 
>> 	vdev->destroy = arm_realm_smmu_v3_vdevice_destroy;
>> 	return tsm_bind(dev, kvm, vdev->virt_id);
>
> I think we should drop tsm_bind() as an abstraction. It doesn't make
> sense to take that round about path when we are calling RMIs directly
> above. It was intended to be an abstraction, but it isn't working out
> with this viommu based abstraction.
>

I was considering using the viommu only for explicit pSMMU/vSMMU setup,
SID/STE management, and realm stream-table creation. I expected other
operations, such as vdevice creation and lock/run state transitions, to
be driven by IOMMUFD ioctls and dispatched to the TSM backend through
abstractions such as tsm_bind() and tsm_guest_req(). This results in the
following split:

- Arm SMMU: pSMMU/vSMMU setup, SID/STE management, and Realm
  stream-table creation.
- PCI TSM: device association, bind lifetime, DSM lookup, and TDI state.
- arm-cca-host: PDEV/VDEV operations, TDISP transitions, reports,
  measurements, and IDE interaction.
- IOMMUFD: route userspace requests using the vdevice ID.


>
>> @@ -513,10 +514,16 @@ static ssize_t cca_tsm_guest_req(struct pci_tdi *tdi,
>>  		if (copy_from_user((void *)&req_obj, req.user, req_len))
>>  			return -EFAULT;
>>  
>> -		if (req_obj.tdi_state != RHI_DA_TDI_CONFIG_RUN)
>> +		switch (req_obj.tdi_state) {
>> +		case RHI_DA_TDI_CONFIG_UNLOCKED:
>> +			return cca_vdev_device_unlock(pdev);
>> +		case RHI_DA_TDI_CONFIG_LOCKED:
>> +			return cca_vdev_device_lock(pdev);
>> +		case RHI_DA_TDI_CONFIG_RUN:
>> +			return cca_vdev_device_start(pdev);
>> +		default:
>>  			return -EINVAL;
>> -
>> -		return cca_vdev_device_start(pdev);
>> +		}
>>  	}
>
> This stuff cannot flow through sysfs. The VMM must support running in
> a sandbox so it cannot easially call out to sysfs while the VM is
> running. That makes the sandboxing more complex and ugly. The flow we
> have now relies on fd passing from the launcher into the sandbox to
> get things like vfio and iommufd into the VMM.
>

This does not go through sysfs. It uses the following IOMMUFD ioctl:

IOCTL_OP(IOMMU_VDEVICE_TSM_REQ, iommufd_vdevice_tsm_req_ioctl,
	 struct iommu_vdevice_tsm_req, tsm_code),

I need to spend more time considering your suggestion to handle guest
requests through viommu_ops rather than as TSM backend operations. The
split described below seemed more natural to me.

- Arm SMMU: pSMMU/vSMMU setup, SID/STE management, and Realm
  stream-table creation.
- PCI TSM: device association, bind lifetime, DSM lookup, and TDI state.
- arm-cca-host: PDEV/VDEV operations, TDISP transitions, reports,
  measurements, and IDE interaction.
- IOMMUFD: route userspace requests using the vdevice ID.

It is not yet clear to me whether operations such as MMIO validation
(TSM_REQ_VALIDATE_MMIO), setting the TDI lock/unlock/run state
(TSM_REQ_SET_TDI_STATE), querying TDISP object details
(TSM_REQ_OBJECT_INFO), and reading or regenerating TDISP objects
(TSM_REQ_READ_OBJECT and TSM_REQ_REGEN_OBJECT) belong in viommu_ops.

Meanwhile, I will clean up my changes and post them as a patch series so
that we can review them more closely?

>
> So these actions really should work the same way unless there is a
> strong reason to do otherwise.
>
> Given these are all acting on bound devices, and those can only be
> created by iommufd, it makes more sense to feed the operations through
> iommufd into the viommu and vdevice ops. AMD wanted to create such
> general command ops anyhow for their viommu emulation (non cc).
>
> And.. then you don't need struct pci_tdi. The vdevice is effectively
> the tdi and the existing locking scheme in iommufd for vdevice takes
> care of everything the tsm code was trying to do, except in a way that
> applies to every viommu out there.. This actually makes a lot of sense
> because the tdi is not really separable from vfio. You cannot have a
> tdi without a kvm and you cannot link a pci dev to a kvm without vfio.
>
> Finally, there is really nothing about the viommu_ops that has much to
> do with smmuv3. It would be fairly straightforward for the tsm_ops to
> be able to create the viommu and provide the viommu_ops. We can get
> there based on the IOMMU_VIOMMU_TYPE_ARM_REALM_SMMUV3.
>
> This then would open up a much nicer split where arm-cca-guest.ko can
> provide a realm smmuv3, and inside those viommu_ops are all the realm
> & tdi related ops, psmmu, vsmmu, vdevice, "guest req".
>
> The arm-cca-guest can just make a simple function call to SMMUv3 to
> get the phys and interrupts. Somehow I think Will would like this
> better than adding to SMMUv3.
>
> Now that the viommu stuff is more developed on the iommufd end, and
> the RMM spec is more complete with vsmmu, I think this arrangement
> becomes visible.
>
> What do you think?
>
> Jason

-aneesh


  reply	other threads:[~2026-09-03  5:49 UTC|newest]

Thread overview: 54+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-04-27  8:53 [RFC PATCH v4 00/16] coco/TSM: Implement host-side support for Arm CCA TDISP setup Aneesh Kumar K.V (Arm)
2026-04-27  8:53 ` [RFC PATCH v4 01/16] iommu/arm-smmu-v3: Discover RME support and realm IRQ topology Aneesh Kumar K.V (Arm)
2026-08-29 18:22   ` Nicolin Chen
2026-09-01  8:46     ` Aneesh Kumar K.V
2026-09-01 14:32       ` Jason Gunthorpe
2026-04-27  8:53 ` [RFC PATCH v4 02/16] iommu/arm-smmu-v3: Save the programmed MSI message in msi_desc Aneesh Kumar K.V (Arm)
2026-04-27  8:53 ` [RFC PATCH v4 03/16] iommu/arm-smmu-v3: Add initial pSMMU realm viommu plumbing Aneesh Kumar K.V (Arm)
2026-08-29 20:00   ` Nicolin Chen
2026-09-01  9:17     ` Aneesh Kumar K.V
2026-09-01 10:06       ` Aneesh Kumar K.V
2026-09-01 14:34         ` Jason Gunthorpe
2026-09-01 17:13           ` Nicolin Chen
2026-09-01 17:18             ` Nicolin Chen
2026-09-01 17:45               ` Jason Gunthorpe
2026-09-01 17:42             ` Jason Gunthorpe
2026-09-01 19:08               ` Nicolin Chen
2026-09-02  0:21                 ` Nicolin Chen
2026-09-02  1:51                 ` Jason Gunthorpe
2026-09-02 13:10             ` Aneesh Kumar K.V
2026-09-02  9:00           ` Aneesh Kumar K.V
2026-09-02 12:17             ` Jason Gunthorpe
2026-09-02 13:15               ` Aneesh Kumar K.V
2026-09-02 16:39                 ` Aneesh Kumar K.V
2026-09-02 23:56                   ` Jason Gunthorpe
2026-09-03  5:48                     ` Aneesh Kumar K.V [this message]
2026-09-03 17:17                       ` Jason Gunthorpe
2026-09-07  9:45                         ` Aneesh Kumar K.V
2026-09-07 12:52                           ` Jason Gunthorpe
2026-09-09 10:09                             ` Aneesh Kumar K.V
2026-09-09 12:46                               ` Jason Gunthorpe
2026-09-10  9:52                                 ` Tian, Kevin
2026-09-10 12:46                                   ` Jason Gunthorpe
2026-09-02 19:30                 ` Jason Gunthorpe
2026-09-03  5:28                   ` Aneesh Kumar K.V
2026-09-03 14:47                     ` Jason Gunthorpe
2026-09-03 15:13                       ` Suzuki K Poulose
2026-09-03 17:19                         ` Jason Gunthorpe
2026-09-01 17:36       ` Nicolin Chen
2026-04-27  8:53 ` [RFC PATCH v4 04/16] iommu/arm-smmu-v3: Track realm pSMMU users with refcount_t Aneesh Kumar K.V (Arm)
2026-04-27  8:53 ` [RFC PATCH v4 05/16] coco: host: arm64: Add support for virtual device communication Aneesh Kumar K.V (Arm)
2026-04-27  8:53 ` [RFC PATCH v4 06/16] coco: host: arm64: Add support for RMM vdev objects Aneesh Kumar K.V (Arm)
2026-04-27  8:53 ` [RFC PATCH v4 07/16] coco: host: arm64: Add pdev stream key refresh and purge helpers Aneesh Kumar K.V (Arm)
2026-04-27  8:53 ` [RFC PATCH v4 08/16] coco: host: arm64: Add helpers to unlock and destroy RMM vdev Aneesh Kumar K.V (Arm)
2026-04-27  8:53 ` [RFC PATCH v4 09/16] coco: host: arm64: Add support for da object read RHI handling Aneesh Kumar K.V (Arm)
2026-04-27  8:53 ` [RFC PATCH v4 10/16] coco: host: arm64: Add helper for cached object fetches Aneesh Kumar K.V (Arm)
2026-04-27  8:53 ` [RFC PATCH v4 11/16] coco: host: arm64: Fetch interface report via RMI Aneesh Kumar K.V (Arm)
2026-04-27  8:53 ` [RFC PATCH v4 12/16] coco: host: arm64: Fetch device measurements " Aneesh Kumar K.V (Arm)
2026-04-27  8:53 ` [RFC PATCH v4 13/16] coco: host: KVM: arm64: Handle vdev validate-mapping exits Aneesh Kumar K.V (Arm)
2026-04-27  8:53 ` [RFC PATCH v4 14/16] KVM: arm64: Unmap device mappings when a private granule is destroyed Aneesh Kumar K.V (Arm)
2026-04-27  8:53 ` [RFC PATCH v4 15/16] coco: host: arm64: Transition vdevs to TDISP RUN state Aneesh Kumar K.V (Arm)
2026-04-27  8:53 ` [RFC PATCH v4 16/16] KVM: arm64: CCA: enable DA in realm create parameters Aneesh Kumar K.V (Arm)
2026-08-31 18:08 ` [RFC PATCH v4 00/16] coco/TSM: Implement host-side support for Arm CCA TDISP setup Jason Gunthorpe
2026-09-01 12:44   ` Aneesh Kumar K.V
2026-09-01 13:07     ` Jason Gunthorpe

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=yq5a8q5izxz4.fsf@kernel.org \
    --to=aneesh.kumar@kernel.org \
    --cc=Suzuki.Poulose@arm.com \
    --cc=aik@amd.com \
    --cc=catalin.marinas@arm.com \
    --cc=dan.j.williams@intel.com \
    --cc=jgg@ziepe.ca \
    --cc=jic23@kernel.org \
    --cc=joro@8bytes.org \
    --cc=kvmarm@lists.linux.dev \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-coco@lists.linux.dev \
    --cc=linux-kernel@vger.kernel.org \
    --cc=maz@kernel.org \
    --cc=nicolinc@nvidia.com \
    --cc=praan@google.com \
    --cc=robin.murphy@arm.com \
    --cc=sameo@rivosinc.com \
    --cc=steven.price@arm.com \
    --cc=will@kernel.org \
    --cc=yilun.xu@linux.intel.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 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.