Re: [PATCH 4/6] PCI/TSM: Add pci_tsm_bind() helper for instantiating TDIs

dan.j.williams
2025-11-06T00:12:04Z

Jonathan Cameron wrote:
> On Tue, 4 Nov 2025 20:00:53 -0800
> Dan Williams <dan.j.williams@intel.com> wrote:
>
> > After a PCIe device has established a secure link and session between a TEE
> > Security Manager (TSM) and its local Device Security Manager (DSM), the
> > device or its subfunctions are candidates to be bound to a private memory
> > context, a TVM. A PCIe device function interface assigned to a TVM is a TEE
> > Device Interface (TDI).
> >
> > The pci_tsm_bind() requests the low-level TSM driver to associate the
> > device with private MMIO and private IOMMU context resources of a given TVM
> > represented by a @kvm argument. A device in the bound state corresponds to
> > the TDISP protocol LOCKED state and awaits validation by the TVM. It is a
> > 'struct pci_tsm_link_ops' operation because, similar to IDE establishment,
> > it involves host side resource establishment and context setup on behalf of
> > the guest. It is also expected to be performed lazily to allow for
> > operation of the device in non-confidential "shared" context for pre-lock
> > configuration.
> >
> > Co-developed-by: Xu Yilun <yilun.xu@linux.intel.com>
> > Signed-off-by: Xu Yilun <yilun.xu@linux.intel.com>
> > Signed-off-by: Dan Williams <dan.j.williams@intel.com>
> Trivial comments only from me.
>
> > diff --git a/drivers/pci/tsm.c b/drivers/pci/tsm.c
> > index 6a2849f77adc..f0e38d7fee38 100644
> > --- a/drivers/pci/tsm.c
> > +++ b/drivers/pci/tsm.c
>
>
[..]
> > + /* Resolve races to bind a TDI */
> > + if (pdev->tsm->tdi) {
> > + if (pdev->tsm->tdi->kvm == kvm)
> > + return 0;
> I'd flip so the error case is out of line. Then drop the else.
>
>
> if (pdev->tsm->tdi->kvm != kvm)
> return -EBUSY;
>
> return 0;

Looks good.

diff --git a/drivers/pci/tsm.c b/drivers/pci/tsm.c
index 7df2a681ed19..001afdf00de6 100644
--- a/drivers/pci/tsm.c
+++ b/drivers/pci/tsm.c
@@ -381,10 +381,9 @@ int pci_tsm_bind(struct pci_dev *pdev, struct kvm *kvm, u32 tdi_id)

/* Resolve races to bind a TDI */
if (pdev->tsm->tdi) {
- if (pdev->tsm->tdi->kvm == kvm)
- return 0;
- else
+ if (pdev->tsm->tdi->kvm != kvm)
return -EBUSY;
+ return 0;
}

tdi = to_pci_tsm_ops(pdev->tsm)->bind(pdev, kvm, tdi_id);