[RFC PATCH 26/30] coco/tdx_tsm: Add bind()/unbind()/guest_req() handlers prototype
Xu Yilun
yilun.xu at linux.intel.com
Thu May 29 05:35:09 UTC 2025
Add basic skeleton for bind()/unbind()/guest_req() handlers.
Specifically, tdx_tdi_devifmt/devif_create() declare the TDI ownership
to TD. tdx_tdi_mmiomt_create() declares the MMIO ownership to TD.
tdx_tdi_request(TDX_TDI_REQ_BIND) locks the TDI.
No detailed TDX Connect implementation.
Signed-off-by: Xu Yilun <yilun.xu at linux.intel.com>
---
drivers/virt/coco/host/tdx_tsm.c | 83 ++++++++++++++++++++++++++++++--
1 file changed, 80 insertions(+), 3 deletions(-)
diff --git a/drivers/virt/coco/host/tdx_tsm.c b/drivers/virt/coco/host/tdx_tsm.c
index d1a8384d8339..beb65f45b478 100644
--- a/drivers/virt/coco/host/tdx_tsm.c
+++ b/drivers/virt/coco/host/tdx_tsm.c
@@ -44,10 +44,49 @@ static struct tdx_tdi *to_tdx_tdi(struct pci_tdi *tdi)
return container_of(tdi, struct tdx_tdi, tdi);
}
+static int tdx_tdi_devifmt_create(struct tdx_tdi *ttdi)
+{
+ return 0;
+}
+
+static void tdx_tdi_devifmt_free(struct tdx_tdi *ttdi)
+{
+}
+
+static int tdx_tdi_mmiomt_create(struct tdx_tdi *ttdi)
+{
+ return 0;
+}
+
+static void tdx_tdi_mmiomt_free(struct tdx_tdi *ttdi)
+{
+}
+
+static int tdx_tdi_devif_create(struct tdx_tdi *ttdi)
+{
+ return 0;
+}
+
+static void tdx_tdi_devif_free(struct tdx_tdi *ttdi)
+{
+}
+
+#define TDX_TDI_REQ_BIND 1
+#define TDX_TDI_REQ_START 2
+#define TDX_TDI_REQ_GET_STATE 3
+#define TDX_TDI_REQ_STOP 4
+
+static int tdx_tdi_request(struct tdx_tdi *ttdi, unsigned int req)
+{
+ return 0;
+}
+
static struct pci_tdi *tdx_tsm_bind(struct pci_dev *pdev,
struct pci_dev *dsm_dev,
struct kvm *kvm, u64 tdi_id)
{
+ int ret;
+
struct tdx_tdi *ttdi __free(kfree) =
kzalloc(sizeof(*ttdi), GFP_KERNEL);
if (!ttdi)
@@ -58,17 +97,55 @@ static struct pci_tdi *tdx_tsm_bind(struct pci_dev *pdev,
ttdi->tdi.dsm_dev = pci_dev_get(dsm_dev);
ttdi->tdi.kvm = kvm;
- /*TODO: TDX Module required operations */
+ ret = tdx_tdi_devifmt_create(ttdi);
+ if (ret) {
+ pci_err(pdev, "fail to init devifmt\n");
+ goto put_dsm_dev;
+ }
+
+ ret = tdx_tdi_devif_create(ttdi);
+ if (ret) {
+ pci_err(pdev, "%s fail to init devif\n", __func__);
+ goto devifmt_free;
+ }
+
+ ret = tdx_tdi_mmiomt_create(ttdi);
+ if (ret) {
+ pci_err(pdev, "%s fail to create mmiomt\n", __func__);
+ goto devif_free;
+ }
+
+ ret = tdx_tdi_request(ttdi, TDX_TDI_REQ_BIND);
+ if (ret) {
+ pci_err(pdev, "%s fial to request bind\n", __func__);
+ goto mmiomt_free;
+ }
return &no_free_ptr(ttdi)->tdi;
+
+mmiomt_free:
+ tdx_tdi_mmiomt_free(ttdi);
+devif_free:
+ tdx_tdi_devif_free(ttdi);
+devifmt_free:
+ tdx_tdi_devifmt_free(ttdi);
+put_dsm_dev:
+ pci_dev_put(dsm_dev);
+ return NULL;
}
static void tdx_tsm_unbind(struct pci_tdi *tdi)
{
struct tdx_tdi *ttdi = to_tdx_tdi(tdi);
- /*TODO: TDX Module required operations */
-
+ /*
+ * 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);
+ tdx_tdi_mmiomt_free(ttdi);
+ tdx_tdi_devif_free(ttdi);
+ tdx_tdi_devifmt_free(ttdi);
pci_dev_put(ttdi->tdi.dsm_dev);
kfree(ttdi);
}
--
2.25.1
More information about the dri-devel
mailing list