Implement TDX Connect enforced sequences for TSM unbind. The enforced sequences are:
1. STOP TDI via TDISP message STOP_INTERFACE 2. Private MMIO unmap from Secure EPT 3. Trusted Device Context Table cleanup for the TDI 4. TDI ownership reclaim and metadata free Step 2 is the responsibility of KVM, step 3 is for IOMMU driver. So TDX TSM driver needs to invoke TSM handlers for external collaboration. Signed-off-by: Xu Yilun <yilun...@linux.intel.com> --- drivers/virt/coco/host/tdx_tsm.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/drivers/virt/coco/host/tdx_tsm.c b/drivers/virt/coco/host/tdx_tsm.c index beb65f45b478..66d6019812ca 100644 --- a/drivers/virt/coco/host/tdx_tsm.c +++ b/drivers/virt/coco/host/tdx_tsm.c @@ -87,6 +87,15 @@ static struct pci_tdi *tdx_tsm_bind(struct pci_dev *pdev, { int ret; + if (!pdev->trusted_dma_owner || + !pdev->driver->tsm_handler || + !pdev->driver->tsm_handler->disable_mmio || + !pdev->driver->tsm_handler->recover_mmio || + !pdev->driver->tsm_handler->disable_trusted_dma) { + pci_err(pdev, "%s no driver or driver not support bind\n", __func__); + return NULL; + } + struct tdx_tdi *ttdi __free(kfree) = kzalloc(sizeof(*ttdi), GFP_KERNEL); if (!ttdi) @@ -137,15 +146,15 @@ static struct pci_tdi *tdx_tsm_bind(struct pci_dev *pdev, static void tdx_tsm_unbind(struct pci_tdi *tdi) { struct tdx_tdi *ttdi = to_tdx_tdi(tdi); + struct pci_dev *pdev = tdi->pdev; - /* - * TODO: In fact devif cannot be freed before TDI's private MMIOs and - * private DMA are unmapped. Will handle this restriction later. - */ tdx_tdi_request(ttdi, TDX_TDI_REQ_STOP); + pdev->driver->tsm_handler->disable_mmio(pdev); + pdev->driver->tsm_handler->disable_trusted_dma(pdev); tdx_tdi_mmiomt_free(ttdi); tdx_tdi_devif_free(ttdi); tdx_tdi_devifmt_free(ttdi); + pdev->driver->tsm_handler->recover_mmio(pdev); pci_dev_put(ttdi->tdi.dsm_dev); kfree(ttdi); } -- 2.25.1