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...@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