From: Jonathan Cameron <Jonathan.Cameron@Huawei.com>
To: Alexey Kardashevskiy <aik@amd.com>
Cc: <kvm@vger.kernel.org>, <iommu@lists.linux.dev>,
<linux-coco@lists.linux.dev>, <linux-pci@vger.kernel.org>,
"Suravee Suthikulpanit" <suravee.suthikulpanit@amd.com>,
Alex Williamson <alex.williamson@redhat.com>,
Dan Williams <dan.j.williams@intel.com>,
<pratikrajesh.sampat@amd.com>, <michael.day@amd.com>,
<david.kaplan@amd.com>, <dhaval.giani@amd.com>,
Santosh Shukla <santosh.shukla@amd.com>,
Tom Lendacky <thomas.lendacky@amd.com>,
"Michael Roth" <michael.roth@amd.com>,
Alexander Graf <agraf@suse.de>,
"Nikunj A Dadhania" <nikunj@amd.com>,
Vasant Hegde <vasant.hegde@amd.com>,
"Lukas Wunner" <lukas@wunner.de>
Subject: Re: [RFC PATCH 08/21] crypto/ccp: Implement SEV TIO firmware interface
Date: Wed, 28 Aug 2024 16:39:31 +0100 [thread overview]
Message-ID: <20240828163931.0000673b@Huawei.com> (raw)
In-Reply-To: <20240823132137.336874-9-aik@amd.com>
On Fri, 23 Aug 2024 23:21:22 +1000
Alexey Kardashevskiy <aik@amd.com> wrote:
> Implement SEV TIO PSP command wrappers in sev-dev-tio.c, these make
> SPDM calls and store the data in the SEV-TIO-specific structs.
>
> Implement tsm_ops for the hypervisor, the TSM module will call these
> when loaded on the host and its tsm_set_ops() is called. The HV ops
> are implemented in sev-dev-tsm.c.
>
> Signed-off-by: Alexey Kardashevskiy <aik@amd.com>
Superficial comments online inline.
Jonathan
> ---
> drivers/crypto/ccp/Makefile | 2 +
> arch/x86/include/asm/sev.h | 20 +
> drivers/crypto/ccp/sev-dev-tio.h | 105 ++
> drivers/crypto/ccp/sev-dev.h | 2 +
> include/linux/psp-sev.h | 60 +
> drivers/crypto/ccp/sev-dev-tio.c | 1565 ++++++++++++++++++++
> drivers/crypto/ccp/sev-dev-tsm.c | 397 +++++
> drivers/crypto/ccp/sev-dev.c | 10 +-
> 8 files changed, 2159 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/crypto/ccp/Makefile b/drivers/crypto/ccp/Makefile
> index 394484929dae..d9871465dd08 100644
> --- a/drivers/crypto/ccp/Makefile
> +++ b/drivers/crypto/ccp/Makefile
> @@ -11,6 +11,8 @@ ccp-$(CONFIG_PCI) += sp-pci.o
> ccp-$(CONFIG_CRYPTO_DEV_SP_PSP) += psp-dev.o \
> sev-dev.o \
> tee-dev.o \
> + sev-dev-tio.o \
> + sev-dev-tsm.o \
spaces vs tabs. I guess go for consistency.
> platform-access.o \
> dbc.o \
> hsti.o
> diff --git a/drivers/crypto/ccp/sev-dev-tio.c b/drivers/crypto/ccp/sev-dev-tio.c
> new file mode 100644
> index 000000000000..42741b17c747
> --- /dev/null
> +++ b/drivers/crypto/ccp/sev-dev-tio.c
> @@ -0,0 +1,1565 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +static size_t sla_dobj_id_to_size(u8 id)
> +{
> + size_t n;
> +
> + BUILD_BUG_ON(sizeof(struct spdm_dobj_hdr_resp) != 0x10);
> + switch (id) {
> + case SPDM_DOBJ_ID_REQ:
> + n = sizeof(struct spdm_dobj_hdr_req);
> + break;
> + case SPDM_DOBJ_ID_RESP:
> + n = sizeof(struct spdm_dobj_hdr_resp);
> + break;
> + case SPDM_DOBJ_ID_CERTIFICATE:
> + n = sizeof(struct spdm_dobj_hdr_cert);
> + break;
> + case SPDM_DOBJ_ID_MEASUREMENT:
> + n = sizeof(struct spdm_dobj_hdr_meas);
> + break;
> + case SPDM_DOBJ_ID_REPORT:
> + n = sizeof(struct spdm_dobj_hdr_report);
> + break;
> + default:
> + WARN_ON(1);
> + n = 0;
> + break;
> + }
> +
> + return n;
Early returns will make this more readable.
> +}
> +/**
> + * struct sev_data_tio_dev_connect - TIO_DEV_CONNECT
> + *
> + * @length: Length in bytes of this command buffer.
> + * @spdm_ctrl: SPDM control structure defined in Section 5.1.
> + * @device_id: The PCIe Routing Identifier of the device to connect to.
> + * @root_port_id: The PCIe Routing Identifier of the root port of the device.
> + * @segment_id: The PCIe Segment Identifier of the device to connect to.
Doesn't seem to be there.
> + * @dev_ctx_sla: Scatter list address of the device context buffer.
> + * @tc_mask: Bitmask of the traffic classes to initialize for SEV-TIO usage.
> + * Setting the kth bit of the TC_MASK to 1 indicates that the traffic
> + * class k will be initialized.
> + * @cert_slot: Slot number of the certificate requested for constructing the SPDM session.
> + * @ide_stream_id: IDE stream IDs to be associated with this device.
> + * Valid only if corresponding bit in TC_MASK is set.
> + */
> +struct sev_data_tio_dev_connect {
> + u32 length;
> + u32 reserved1;
> + struct spdm_ctrl spdm_ctrl;
> + u8 reserved2[8];
> + struct sla_addr_t dev_ctx_sla;
> + u8 tc_mask;
> + u8 cert_slot;
> + u8 reserved3[6];
> + u8 ide_stream_id[8];
> + u8 reserved4[8];
> +} __packed;
> +
> +/**
> + * struct sev_data_tio_guest_request - TIO_GUEST_REQUEST command
> + *
> + * @length: Length in bytes of this command buffer
> + * @spdm_ctrl: SPDM control structure defined in Chapter 2.
Some more fields that aren't documented. They all should be for
kernel-doc or the scripts will moan.
I'd just run the script and fixup all the warnings and errors.
> + * @gctx_paddr: system physical address of guest context page
> + * @tdi_ctx_paddr: SPA of page donated by hypervisor
> + * @req_paddr: system physical address of request page
> + * @res_paddr: system physical address of response page
> + */
> +struct sev_data_tio_guest_request {
> + u32 length; /* In */
> + u32 reserved;
> + struct spdm_ctrl spdm_ctrl; /* In */
> + struct sla_addr_t dev_ctx_sla;
> + struct sla_addr_t tdi_ctx_sla;
> + u64 gctx_paddr;
> + u64 req_paddr; /* In */
> + u64 res_paddr; /* In */
> +} __packed;
> +
> +int sev_tio_tdi_status(struct tsm_dev_tio *dev_data, struct tsm_tdi_tio *tdi_data,
> + struct tsm_spdm *spdm)
> +{
> + struct sev_tio_tdi_status_data *data = (struct sev_tio_tdi_status_data *) dev_data->data;
> + struct sev_data_tio_tdi_status status = {
> + .length = sizeof(status),
> + .dev_ctx_sla = dev_data->dev_ctx,
> + .tdi_ctx_sla = tdi_data->tdi_ctx,
> + };
> + int ret;
> +
> + if (IS_SLA_NULL(dev_data->dev_ctx) || IS_SLA_NULL(tdi_data->tdi_ctx))
> + return -ENXIO;
> +
> + memset(data, 0, sizeof(*data));
> +
> + spdm_ctrl_init(spdm, &status.spdm_ctrl, dev_data);
> + status.status_paddr = __psp_pa(data);
> +
> + ret = sev_tio_do_cmd(SEV_CMD_TIO_TDI_STATUS, &status, sizeof(status),
> + &dev_data->psp_ret, dev_data, spdm);
> +
> + return ret;
return sev_tio_do_cmd()
Same in other similar cases.
> +}
> diff --git a/drivers/crypto/ccp/sev-dev-tsm.c b/drivers/crypto/ccp/sev-dev-tsm.c
> new file mode 100644
> index 000000000000..a11dea482d4b
> --- /dev/null
> +++ b/drivers/crypto/ccp/sev-dev-tsm.c
> @@ -0,0 +1,397 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +
> +// Interface to CCP/SEV-TIO for generic PCIe TDISP module
> +
> +#include <linux/pci.h>
> +#include <linux/pci-doe.h>
> +#include <linux/tsm.h>
> +
> +#include <linux/smp.h>
> +#include <asm/sev-common.h>
> +
> +#include "psp-dev.h"
> +#include "sev-dev.h"
> +#include "sev-dev-tio.h"
> +
> +static int mkret(int ret, struct tsm_dev_tio *dev_data)
> +{
> + if (ret)
> + return ret;
> +
> + if (dev_data->psp_ret == SEV_RET_SUCCESS)
> + return 0;
> +
> + pr_err("PSP returned an error %d\n", dev_data->psp_ret);
I'm not totally convinced this is worth while vs simply checking
at call sites.
> + return -EINVAL;
> +}
> +
> +static int dev_connect(struct tsm_dev *tdev, void *private_data)
> +{
> + u16 device_id = pci_dev_id(tdev->pdev);
> + u16 root_port_id = 0; // FIXME: this is NOT PCI id, need to figure out how to calculate this
> + u8 segment_id = tdev->pdev->bus ? pci_domain_nr(tdev->pdev->bus) : 0;
> + struct tsm_dev_tio *dev_data = tdev->data;
> + int ret;
> +
> + if (!dev_data) {
> + dev_data = kzalloc(sizeof(*dev_data), GFP_KERNEL);
> + if (!dev_data)
> + return -ENOMEM;
> +
> + ret = sev_tio_dev_create(dev_data, device_id, root_port_id, segment_id);
> + if (ret)
> + goto free_exit;
> +
> + tdev->data = dev_data;
> + }
...
> +
> +free_exit:
> + sev_tio_dev_reclaim(dev_data, &tdev->spdm);
> + kfree(dev_data);
Correct to free even if not allocated here?
Perhaps a comment if so.
> +
> + return ret;
> +}
> +
> +static int ide_refresh(struct tsm_dev *tdev, void *private_data)
> +{
> + struct tsm_dev_tio *dev_data = tdev->data;
> + int ret;
> +
> + if (!dev_data)
> + return -ENODEV;
> +
> + ret = sev_tio_ide_refresh(dev_data, &tdev->spdm);
> +
> + return ret;
return sev_tio_ide_refresh()
> +}
> +
> +static int tdi_create(struct tsm_tdi *tdi)
> +{
> + struct tsm_tdi_tio *tdi_data = tdi->data;
> + int ret;
> +
> + if (tdi_data)
> + return -EBUSY;
> +
> + tdi_data = kzalloc(sizeof(*tdi_data), GFP_KERNEL);
> + if (!tdi_data)
> + return -ENOMEM;
> +
> + ret = sev_tio_tdi_create(tdi->tdev->data, tdi_data, pci_dev_id(tdi->pdev),
> + tdi->rseg, tdi->rseg_valid);
> + if (ret)
> + kfree(tdi_data);
if (ret) {
kfree(tdi_data);
return ret;
}
tid->data = tdi_data;
return 0;
is slightly longer but a more standard form so easier to review.
> + else
> + tdi->data = tdi_data;
> +
> + return ret;
> +}
> +
> +
> +static int guest_request(struct tsm_tdi *tdi, u32 guest_rid, u64 kvmid, void *req_data,
Probably wrap nearer 80 chars.
> + enum tsm_tdisp_state *state, void *private_data)
> +{
> + struct tsm_dev_tio *dev_data = tdi->tdev->data;
> + struct tio_guest_request *req = req_data;
> + int ret;
> +
> + if (!tdi->data)
> + return -EFAULT;
> +
> + if (dev_data->cmd == 0) {
> + ret = sev_tio_guest_request(&req->data, guest_rid, kvmid,
> + dev_data, tdi->data, &tdi->tdev->spdm);
> + req->fw_err = dev_data->psp_ret;
If the above returned an error is psp_ret always set? I think not.
So maybe separate if (ret) condition, then set this and finally call
the code below.
> + ret = mkret(ret, dev_data);
> + if (ret > 0)
> + return ret;
> + } else if (dev_data->cmd == SEV_CMD_TIO_GUEST_REQUEST) {
> + ret = sev_tio_continue(dev_data, &tdi->tdev->spdm);
> + ret = mkret(ret, dev_data);
> + if (ret > 0)
> + return ret;
> + }
> +
> + if (dev_data->cmd == 0 && state) {
> + ret = sev_tio_tdi_status(tdi->tdev->data, tdi->data, &tdi->tdev->spdm);
> + ret = mkret(ret, dev_data);
> + if (ret > 0)
> + return ret;
> + } else if (dev_data->cmd == SEV_CMD_TIO_TDI_STATUS) {
> + ret = sev_tio_continue(dev_data, &tdi->tdev->spdm);
> + ret = mkret(ret, dev_data);
> + if (ret > 0)
> + return ret;
> +
> + ret = sev_tio_tdi_status_fin(tdi->tdev->data, tdi->data, state);
> + }
> +
> + return ret;
> +}
> +
> +static int tdi_status(struct tsm_tdi *tdi, void *private_data, struct tsm_tdi_status *ts)
> +{
> + struct tsm_dev_tio *dev_data = tdi->tdev->data;
> + int ret;
> +
> + if (!tdi->data)
> + return -ENODEV;
> +
> +#if 0 /* Not implemented yet */
> + if (dev_data->cmd == 0) {
> + ret = sev_tio_tdi_info(tdi->tdev->data, tdi->data, ts);
> + ret = mkret(ret, dev_data);
> + if (ret)
> + return ret;
> + }
> +#endif
> +
> + if (dev_data->cmd == 0) {
> + ret = sev_tio_tdi_status(tdi->tdev->data, tdi->data, &tdi->tdev->spdm);
> + ret = mkret(ret, dev_data);
> + if (ret)
> + return ret;
> +
> + ret = sev_tio_tdi_status_fin(tdi->tdev->data, tdi->data, &ts->state);
Given code as it stands. Might as well return here.
> + } else if (dev_data->cmd == SEV_CMD_TIO_TDI_STATUS) {
Making this just an if.
> + ret = sev_tio_continue(dev_data, &tdi->tdev->spdm);
> + ret = mkret(ret, dev_data);
> + if (ret)
> + return ret;
> +
> + ret = sev_tio_tdi_status_fin(tdi->tdev->data, tdi->data, &ts->state);
and here.
> + } else {
Making this the inline code as no need for else.
> + pci_err(tdi->pdev, "Wrong state, cmd 0x%x in flight\n",
> + dev_data->cmd);
> + }
> +
> + return ret;
> +}
> +
> +struct tsm_ops sev_tsm_ops = {
> + .dev_connect = dev_connect,
> + .dev_reclaim = dev_reclaim,
> + .dev_status = dev_status,
> + .ide_refresh = ide_refresh,
> + .tdi_bind = tdi_bind,
> + .tdi_reclaim = tdi_reclaim,
> + .guest_request = guest_request,
> + .tdi_status = tdi_status,
> +};
next prev parent reply other threads:[~2024-08-28 15:39 UTC|newest]
Thread overview: 128+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-23 13:21 [RFC PATCH 00/21] Secure VFIO, TDISP, SEV TIO Alexey Kardashevskiy
2024-08-23 13:21 ` [RFC PATCH 01/21] tsm-report: Rename module to reflect what it does Alexey Kardashevskiy
2024-08-23 22:17 ` Bjorn Helgaas
2024-08-28 13:49 ` Jonathan Cameron
2024-08-30 0:13 ` Dan Williams
2024-09-02 1:29 ` Alexey Kardashevskiy
2024-08-23 13:21 ` [RFC PATCH 02/21] pci/doe: Define protocol types and make those public Alexey Kardashevskiy
2024-08-23 22:18 ` Bjorn Helgaas
2024-08-30 2:15 ` Dan Williams
2024-08-23 13:21 ` [RFC PATCH 03/21] pci: Define TEE-IO bit in PCIe device capabilities Alexey Kardashevskiy
2024-08-23 22:19 ` Bjorn Helgaas
2024-08-28 13:54 ` Jonathan Cameron
2024-08-30 2:21 ` Dan Williams
2024-08-30 4:04 ` Alexey Kardashevskiy
2024-08-30 21:37 ` Dan Williams
2024-08-23 13:21 ` [RFC PATCH 04/21] PCI/IDE: Define Integrity and Data Encryption (IDE) extended capability Alexey Kardashevskiy
2024-08-23 22:28 ` Bjorn Helgaas
2024-08-28 14:24 ` Jonathan Cameron
2024-08-30 2:41 ` Dan Williams
2024-08-23 13:21 ` [RFC PATCH 05/21] crypto/ccp: Make some SEV helpers public Alexey Kardashevskiy
2024-08-30 2:45 ` Dan Williams
2024-08-23 13:21 ` [RFC PATCH 06/21] crypto: ccp: Enable SEV-TIO feature in the PSP when supported Alexey Kardashevskiy
2024-08-28 14:32 ` Jonathan Cameron
2024-09-03 21:27 ` Dan Williams
2024-09-05 2:29 ` Alexey Kardashevskiy
2024-09-05 17:40 ` Dan Williams
2024-08-23 13:21 ` [RFC PATCH 07/21] pci/tdisp: Introduce tsm module Alexey Kardashevskiy
2024-08-27 12:32 ` Jason Gunthorpe
2024-08-28 3:00 ` Alexey Kardashevskiy
2024-08-28 23:42 ` Jason Gunthorpe
2024-08-29 0:00 ` Dan Williams
2024-08-29 0:09 ` Jason Gunthorpe
2024-08-29 0:20 ` Dan Williams
2024-08-29 12:03 ` Jason Gunthorpe
2024-08-29 4:57 ` Alexey Kardashevskiy
2024-08-29 12:07 ` Jason Gunthorpe
2024-09-02 0:52 ` Alexey Kardashevskiy
2024-08-28 15:04 ` Jonathan Cameron
2024-09-02 6:50 ` Aneesh Kumar K.V
2024-09-02 7:26 ` Alexey Kardashevskiy
2024-09-03 23:51 ` Dan Williams
2024-09-04 11:13 ` Alexey Kardashevskiy
2024-09-04 23:28 ` Dan Williams
2024-08-23 13:21 ` [RFC PATCH 08/21] crypto/ccp: Implement SEV TIO firmware interface Alexey Kardashevskiy
2024-08-28 15:39 ` Jonathan Cameron [this message]
2024-08-23 13:21 ` [RFC PATCH 09/21] kvm: Export kvm_vm_set_mem_attributes Alexey Kardashevskiy
2024-08-23 13:21 ` [RFC PATCH 10/21] vfio: Export helper to get vfio_device from fd Alexey Kardashevskiy
2024-08-23 13:21 ` [RFC PATCH 11/21] KVM: SEV: Add TIO VMGEXIT and bind TDI Alexey Kardashevskiy
2024-08-29 10:08 ` Xu Yilun
2024-08-30 4:00 ` Alexey Kardashevskiy
2024-08-30 7:02 ` Xu Yilun
2024-09-02 1:24 ` Alexey Kardashevskiy
2024-09-13 13:50 ` Zhi Wang
2024-09-13 22:08 ` Dan Williams
2024-09-14 2:47 ` Tian, Kevin
2024-09-14 5:19 ` Zhi Wang
2024-09-18 10:45 ` Xu Yilun
2024-09-20 3:41 ` Tian, Kevin
2024-08-23 13:21 ` [RFC PATCH 12/21] KVM: IOMMUFD: MEMFD: Map private pages Alexey Kardashevskiy
2024-08-26 8:39 ` Tian, Kevin
2024-08-26 12:30 ` Jason Gunthorpe
2024-08-29 9:34 ` Xu Yilun
2024-08-29 12:15 ` Jason Gunthorpe
2024-08-30 3:47 ` Alexey Kardashevskiy
2024-08-30 12:35 ` Jason Gunthorpe
2024-09-02 1:09 ` Alexey Kardashevskiy
2024-09-02 23:52 ` Jason Gunthorpe
2024-09-03 0:03 ` Alexey Kardashevskiy
2024-09-03 0:37 ` Jason Gunthorpe
2024-08-30 5:20 ` Xu Yilun
2024-08-30 12:36 ` Jason Gunthorpe
2024-09-03 20:34 ` Dan Williams
2024-09-04 0:02 ` Jason Gunthorpe
2024-09-04 0:59 ` Dan Williams
2024-09-05 8:29 ` Tian, Kevin
2024-09-05 12:02 ` Jason Gunthorpe
2024-09-05 12:07 ` Tian, Kevin
2024-09-05 12:00 ` Jason Gunthorpe
2024-09-05 12:17 ` Tian, Kevin
2024-09-05 12:23 ` Jason Gunthorpe
2024-09-05 20:53 ` Dan Williams
2024-09-05 23:06 ` Jason Gunthorpe
2024-09-06 2:46 ` Tian, Kevin
2024-09-06 13:54 ` Jason Gunthorpe
2024-09-06 2:41 ` Tian, Kevin
2024-08-27 2:27 ` Alexey Kardashevskiy
2024-08-27 2:31 ` Tian, Kevin
2024-09-15 21:07 ` Jason Gunthorpe
2024-09-20 21:10 ` Vishal Annapurve
2024-09-23 5:35 ` Tian, Kevin
2024-09-23 6:34 ` Vishal Annapurve
2024-09-23 8:24 ` Tian, Kevin
2024-09-23 16:02 ` Jason Gunthorpe
2024-09-23 23:52 ` Tian, Kevin
2024-09-24 12:07 ` Jason Gunthorpe
2024-09-25 8:44 ` Vishal Annapurve
2024-09-25 15:41 ` Jason Gunthorpe
2024-09-23 20:53 ` Vishal Annapurve
2024-09-23 23:55 ` Tian, Kevin
2024-08-23 13:21 ` [RFC PATCH 13/21] KVM: X86: Handle private MMIO as shared Alexey Kardashevskiy
2024-08-30 16:57 ` Xu Yilun
2024-09-02 2:22 ` Alexey Kardashevskiy
2024-09-03 5:13 ` Xu Yilun
2024-09-06 3:31 ` Alexey Kardashevskiy
2024-09-09 10:07 ` Xu Yilun
2024-09-10 1:28 ` Alexey Kardashevskiy
2024-08-23 13:21 ` [RFC PATCH 14/21] RFC: iommu/iommufd/amd: Add IOMMU_HWPT_TRUSTED flag, tweak DTE's DomainID, IOTLB Alexey Kardashevskiy
2024-08-27 12:17 ` Jason Gunthorpe
2024-08-23 13:21 ` [RFC PATCH 15/21] coco/sev-guest: Allow multiple source files in the driver Alexey Kardashevskiy
2024-08-23 13:21 ` [RFC PATCH 16/21] coco/sev-guest: Make SEV-to-PSP request helpers public Alexey Kardashevskiy
2024-08-23 13:21 ` [RFC PATCH 17/21] coco/sev-guest: Implement the guest side of things Alexey Kardashevskiy
2024-08-28 15:54 ` Jonathan Cameron
2024-09-14 7:19 ` Zhi Wang
2024-09-16 1:18 ` Alexey Kardashevskiy
2024-08-23 13:21 ` [RFC PATCH 18/21] RFC: pci: Add BUS_NOTIFY_PCI_BUS_MASTER event Alexey Kardashevskiy
2024-08-23 13:21 ` [RFC PATCH 19/21] sev-guest: Stop changing encrypted page state for TDISP devices Alexey Kardashevskiy
2024-08-23 13:21 ` [RFC PATCH 20/21] pci: Allow encrypted MMIO mapping via sysfs Alexey Kardashevskiy
2024-08-23 22:37 ` Bjorn Helgaas
2024-09-02 8:22 ` Alexey Kardashevskiy
2024-09-03 21:46 ` Bjorn Helgaas
2024-08-23 13:21 ` [RFC PATCH 21/21] pci: Define pci_iomap_range_encrypted Alexey Kardashevskiy
2024-08-28 20:43 ` [RFC PATCH 00/21] Secure VFIO, TDISP, SEV TIO Dan Williams
2024-08-29 14:13 ` Alexey Kardashevskiy
2024-08-29 23:41 ` Dan Williams
2024-08-30 4:38 ` Alexey Kardashevskiy
2024-08-30 21:57 ` Dan Williams
2024-09-05 8:21 ` Tian, Kevin
2024-09-03 15:56 ` Sean Christopherson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240828163931.0000673b@Huawei.com \
--to=jonathan.cameron@huawei.com \
--cc=agraf@suse.de \
--cc=aik@amd.com \
--cc=alex.williamson@redhat.com \
--cc=dan.j.williams@intel.com \
--cc=david.kaplan@amd.com \
--cc=dhaval.giani@amd.com \
--cc=iommu@lists.linux.dev \
--cc=kvm@vger.kernel.org \
--cc=linux-coco@lists.linux.dev \
--cc=linux-pci@vger.kernel.org \
--cc=lukas@wunner.de \
--cc=michael.day@amd.com \
--cc=michael.roth@amd.com \
--cc=nikunj@amd.com \
--cc=pratikrajesh.sampat@amd.com \
--cc=santosh.shukla@amd.com \
--cc=suravee.suthikulpanit@amd.com \
--cc=thomas.lendacky@amd.com \
--cc=vasant.hegde@amd.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).