@@ -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);
}
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@linux.intel.com> --- drivers/virt/coco/host/tdx_tsm.c | 83 ++++++++++++++++++++++++++++++-- 1 file changed, 80 insertions(+), 3 deletions(-)