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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.