Commit f58893b0b7 for qemu.org
commit f58893b0b73759cd12bcae4b5d0956cbf9fc7923
Author: Marc-André Lureau <marcandre.lureau@redhat.com>
Date: Thu May 7 16:35:28 2026 +0400
spdm-socket: convert SpdmTransportType to QAPI enum
Replace the hand-written SpdmTransportType C enum and QEnumLookup
table with a QAPI schema definition in qapi/sockets.json. Update
all users in hw/nvme/ctrl.c to use the QAPI-generated enum constants
(SPDM_TRANSPORT_TYPE_* instead of SPDM_SOCKET_TRANSPORT_TYPE_*).
Reviewed-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
diff --git a/backends/spdm-socket.c b/backends/spdm-socket.c
index b625a65d28..826efc276d 100644
--- a/backends/spdm-socket.c
+++ b/backends/spdm-socket.c
@@ -13,6 +13,7 @@
#include "qemu/osdep.h"
#include "system/spdm-socket.h"
#include "qapi/error.h"
+#include "qapi/qapi-types-sockets.h"
#include "hw/core/qdev-properties.h"
#include "hw/core/qdev-properties-system.h"
#include "hw/core/qdev-prop-internal.h"
@@ -205,7 +206,7 @@ static bool spdm_socket_command_valid(uint32_t command)
}
}
-uint32_t spdm_socket_receive(const int socket, uint32_t transport_type,
+uint32_t spdm_socket_receive(const int socket, SpdmTransportType transport_type,
void *rsp, uint32_t rsp_len)
{
uint32_t command;
@@ -223,13 +224,14 @@ uint32_t spdm_socket_receive(const int socket, uint32_t transport_type,
}
bool spdm_socket_send(const int socket, uint32_t socket_cmd,
- uint32_t transport_type, void *req, uint32_t req_len)
+ SpdmTransportType transport_type, void *req,
+ uint32_t req_len)
{
return send_platform_data(socket, transport_type, socket_cmd, req,
req_len);
}
-uint32_t spdm_socket_rsp(const int socket, uint32_t transport_type,
+uint32_t spdm_socket_rsp(const int socket, SpdmTransportType transport_type,
void *req, uint32_t req_len,
void *rsp, uint32_t rsp_len)
{
@@ -244,27 +246,16 @@ uint32_t spdm_socket_rsp(const int socket, uint32_t transport_type,
return spdm_socket_receive(socket, transport_type, rsp, rsp_len);
}
-void spdm_socket_close(const int socket, uint32_t transport_type)
+void spdm_socket_close(const int socket, SpdmTransportType transport_type)
{
send_platform_data(socket, transport_type,
SPDM_SOCKET_COMMAND_SHUTDOWN, NULL, 0);
}
-const QEnumLookup SpdmTransport_lookup = {
- .array = (const char *const[]) {
- [SPDM_SOCKET_TRANSPORT_TYPE_UNSPEC] = "unspecified",
- [SPDM_SOCKET_TRANSPORT_TYPE_MCTP] = "mctp",
- [SPDM_SOCKET_TRANSPORT_TYPE_PCI_DOE] = "doe",
- [SPDM_SOCKET_TRANSPORT_TYPE_SCSI] = "scsi",
- [SPDM_SOCKET_TRANSPORT_TYPE_NVME] = "nvme",
- },
- .size = SPDM_SOCKET_TRANSPORT_TYPE_MAX
-};
-
const PropertyInfo qdev_prop_spdm_trans = {
.type = "SpdmTransportType",
.description = "Spdm Transport, doe/nvme/mctp/scsi/unspecified",
- .enum_table = &SpdmTransport_lookup,
+ .enum_table = &SpdmTransportType_lookup,
.get = qdev_propinfo_get_enum,
.set = qdev_propinfo_set_enum,
.set_default_value = qdev_propinfo_set_default_value_enum,
diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c
index 4893cf7e74..c662d968db 100644
--- a/hw/nvme/ctrl.c
+++ b/hw/nvme/ctrl.c
@@ -7489,14 +7489,14 @@ static uint16_t nvme_sec_prot_spdm_send(NvmeCtrl *n, NvmeRequest *req)
}
spdm_res = spdm_socket_send(n->spdm_socket, SPDM_SOCKET_STORAGE_CMD_IF_SEND,
- SPDM_SOCKET_TRANSPORT_TYPE_NVME, sec_buf,
+ SPDM_TRANSPORT_TYPE_NVME, sec_buf,
transport_transfer_len);
if (!spdm_res) {
return NVME_DATA_TRAS_ERROR | NVME_DNR;
}
/* The responder shall ack with message status */
- recvd = spdm_socket_receive(n->spdm_socket, SPDM_SOCKET_TRANSPORT_TYPE_NVME,
+ recvd = spdm_socket_receive(n->spdm_socket, SPDM_TRANSPORT_TYPE_NVME,
&nvme_cmd_status,
SPDM_SOCKET_MAX_MSG_STATUS_LEN);
@@ -7552,14 +7552,14 @@ static uint16_t nvme_sec_prot_spdm_receive(NvmeCtrl *n, NvmeRequest *req)
/* Forward if_recv to the SPDM Server with SPSP0 */
spdm_res = spdm_socket_send(n->spdm_socket, SPDM_SOCKET_STORAGE_CMD_IF_RECV,
- SPDM_SOCKET_TRANSPORT_TYPE_NVME,
+ SPDM_TRANSPORT_TYPE_NVME,
&hdr, sizeof(hdr));
if (!spdm_res) {
return NVME_DATA_TRAS_ERROR | NVME_DNR;
}
/* The responder shall ack with message status */
- recvd = spdm_socket_receive(n->spdm_socket, SPDM_SOCKET_TRANSPORT_TYPE_NVME,
+ recvd = spdm_socket_receive(n->spdm_socket, SPDM_TRANSPORT_TYPE_NVME,
&nvme_cmd_status,
SPDM_SOCKET_MAX_MSG_STATUS_LEN);
if (recvd < SPDM_SOCKET_MAX_MSG_STATUS_LEN) {
@@ -7579,7 +7579,7 @@ static uint16_t nvme_sec_prot_spdm_receive(NvmeCtrl *n, NvmeRequest *req)
}
recvd = spdm_socket_receive(n->spdm_socket,
- SPDM_SOCKET_TRANSPORT_TYPE_NVME,
+ SPDM_TRANSPORT_TYPE_NVME,
rsp_spdm_buf, alloc_len);
if (!recvd) {
return NVME_DATA_TRAS_ERROR | NVME_DNR;
@@ -9097,7 +9097,7 @@ static bool pcie_doe_spdm_rsp(DOECap *doe_cap)
uint32_t rsp_len = SPDM_SOCKET_MAX_MESSAGE_BUFFER_SIZE;
uint32_t recvd = spdm_socket_rsp(doe_cap->spdm_socket,
- SPDM_SOCKET_TRANSPORT_TYPE_PCI_DOE,
+ SPDM_TRANSPORT_TYPE_DOE,
req, req_len, rsp, rsp_len);
doe_cap->read_mbox_len += DIV_ROUND_UP(recvd, 4);
@@ -9199,7 +9199,7 @@ static bool nvme_init_pci(NvmeCtrl *n, PCIDevice *pci_dev, Error **errp)
uint16_t doe_offset = PCI_CONFIG_SPACE_SIZE;
switch (pci_dev->spdm_trans) {
- case SPDM_SOCKET_TRANSPORT_TYPE_PCI_DOE:
+ case SPDM_TRANSPORT_TYPE_DOE:
if (n->params.sriov_max_vfs) {
doe_offset += PCI_ARI_SIZEOF;
}
@@ -9214,7 +9214,7 @@ static bool nvme_init_pci(NvmeCtrl *n, PCIDevice *pci_dev, Error **errp)
return false;
}
break;
- case SPDM_SOCKET_TRANSPORT_TYPE_NVME:
+ case SPDM_TRANSPORT_TYPE_NVME:
n->spdm_socket = spdm_socket_connect(pci_dev->spdm_port, errp);
if (n->spdm_socket < 0) {
return false;
@@ -9716,10 +9716,10 @@ static void nvme_exit(PCIDevice *pci_dev)
assert(!(pci_dev->doe_spdm.spdm_socket > 0 && n->spdm_socket >= 0));
if (pci_dev->doe_spdm.spdm_socket > 0) {
spdm_socket_close(pci_dev->doe_spdm.spdm_socket,
- SPDM_SOCKET_TRANSPORT_TYPE_PCI_DOE);
+ SPDM_TRANSPORT_TYPE_DOE);
} else if (n->spdm_socket >= 0) {
spdm_socket_close(pci_dev->doe_spdm.spdm_socket,
- SPDM_SOCKET_TRANSPORT_TYPE_NVME);
+ SPDM_TRANSPORT_TYPE_NVME);
}
if (n->pmr.dev) {
@@ -9778,7 +9778,7 @@ static const Property nvme_props[] = {
DEFINE_PROP_UINT16("mqes", NvmeCtrl, params.mqes, 0x7ff),
DEFINE_PROP_UINT16("spdm_port", PCIDevice, spdm_port, 0),
DEFINE_PROP_SPDM_TRANS("spdm_trans", PCIDevice, spdm_trans,
- SPDM_SOCKET_TRANSPORT_TYPE_PCI_DOE),
+ SPDM_TRANSPORT_TYPE_DOE),
DEFINE_PROP_BOOL("ctratt.mem", NvmeCtrl, params.ctratt.mem, false),
DEFINE_PROP_BOOL("atomic.dn", NvmeCtrl, params.atomic_dn, 0),
DEFINE_PROP_UINT16("atomic.awun", NvmeCtrl, params.atomic_awun, 0),
@@ -9856,7 +9856,7 @@ static void nvme_pci_write_config(PCIDevice *dev, uint32_t address,
/* DOE is only initialised if SPDM over DOE is used */
if (pcie_find_capability(dev, PCI_EXT_CAP_ID_DOE) &&
- dev->spdm_trans == SPDM_SOCKET_TRANSPORT_TYPE_PCI_DOE) {
+ dev->spdm_trans == SPDM_TRANSPORT_TYPE_DOE) {
pcie_doe_write_config(&dev->doe_spdm, address, val, len);
}
pci_default_write_config(dev, address, val, len);
@@ -9869,7 +9869,7 @@ static uint32_t nvme_pci_read_config(PCIDevice *dev, uint32_t address, int len)
uint32_t val;
if (dev->spdm_port && pcie_find_capability(dev, PCI_EXT_CAP_ID_DOE) &&
- (dev->spdm_trans == SPDM_SOCKET_TRANSPORT_TYPE_PCI_DOE)) {
+ (dev->spdm_trans == SPDM_TRANSPORT_TYPE_DOE)) {
if (pcie_doe_read_config(&dev->doe_spdm, address, len, &val)) {
return val;
}
diff --git a/include/system/spdm-socket.h b/include/system/spdm-socket.h
index 00cb0e97f3..b5a68d3d60 100644
--- a/include/system/spdm-socket.h
+++ b/include/system/spdm-socket.h
@@ -23,6 +23,8 @@
#ifndef SPDM_REQUESTER_H
#define SPDM_REQUESTER_H
+#include "qapi/qapi-types-sockets.h"
+
/**
* spdm_socket_connect: connect to an external SPDM socket
* @port: port to connect to
@@ -37,7 +39,7 @@ int spdm_socket_connect(uint16_t port, Error **errp);
/**
* spdm_socket_rsp: send and receive a message to a SPDM server
* @socket: socket returned from spdm_socket_connect()
- * @transport_type: SPDM_SOCKET_TRANSPORT_TYPE_* macro
+ * @transport_type: the SPDM transport type
* @req: request buffer
* @req_len: request buffer length
* @rsp: response buffer
@@ -46,14 +48,14 @@ int spdm_socket_connect(uint16_t port, Error **errp);
* Send platform data to a SPDM server on socket and then receive
* a response.
*/
-uint32_t spdm_socket_rsp(const int socket, uint32_t transport_type,
+uint32_t spdm_socket_rsp(const int socket, SpdmTransportType transport_type,
void *req, uint32_t req_len,
void *rsp, uint32_t rsp_len);
/**
* spdm_socket_rsp: Receive a message from an SPDM server
* @socket: socket returned from spdm_socket_connect()
- * @transport_type: SPDM_SOCKET_TRANSPORT_TYPE_* macro
+ * @transport_type: the SPDM transport type
* @rsp: response buffer
* @rsp_len: response buffer length
*
@@ -61,14 +63,14 @@ uint32_t spdm_socket_rsp(const int socket, uint32_t transport_type,
* received or 0 on failure. This can be used to receive a message from the SPDM
* server without sending anything first.
*/
-uint32_t spdm_socket_receive(const int socket, uint32_t transport_type,
+uint32_t spdm_socket_receive(const int socket, SpdmTransportType transport_type,
void *rsp, uint32_t rsp_len);
/**
* spdm_socket_rsp: Sends a message to an SPDM server
* @socket: socket returned from spdm_socket_connect()
* @socket_cmd: socket command type (normal/if_recv/if_send etc...)
- * @transport_type: SPDM_SOCKET_TRANSPORT_TYPE_* macro
+ * @transport_type: the SPDM transport type
* @req: request buffer
* @req_len: request buffer length
*
@@ -77,16 +79,17 @@ uint32_t spdm_socket_receive(const int socket, uint32_t transport_type,
* spdm_socket_receive().
*/
bool spdm_socket_send(const int socket, uint32_t socket_cmd,
- uint32_t transport_type, void *req, uint32_t req_len);
+ SpdmTransportType transport_type, void *req,
+ uint32_t req_len);
/**
* spdm_socket_close: send a shutdown command to the server
* @socket: socket returned from spdm_socket_connect()
- * @transport_type: SPDM_SOCKET_TRANSPORT_TYPE_* macro
+ * @transport_type: the SPDM transport type
*
* This will issue a shutdown command to the server.
*/
-void spdm_socket_close(const int socket, uint32_t transport_type);
+void spdm_socket_close(const int socket, SpdmTransportType transport_type);
/*
* Defines the transport encoding for SPDM, this information shall be passed
@@ -115,15 +118,6 @@ typedef struct {
#define SPDM_SOCKET_MAX_MESSAGE_BUFFER_SIZE 0x1200
#define SPDM_SOCKET_MAX_MSG_STATUS_LEN 0x02
-typedef enum SpdmTransportType {
- SPDM_SOCKET_TRANSPORT_TYPE_UNSPEC = 0,
- SPDM_SOCKET_TRANSPORT_TYPE_MCTP,
- SPDM_SOCKET_TRANSPORT_TYPE_PCI_DOE,
- SPDM_SOCKET_TRANSPORT_TYPE_SCSI,
- SPDM_SOCKET_TRANSPORT_TYPE_NVME,
- SPDM_SOCKET_TRANSPORT_TYPE_MAX
-} SpdmTransportType;
-
extern const PropertyInfo qdev_prop_spdm_trans;
#define DEFINE_PROP_SPDM_TRANS(_name, _state, _field, _default) \
diff --git a/qapi/sockets.json b/qapi/sockets.json
index 473be2ac58..a9a8006c22 100644
--- a/qapi/sockets.json
+++ b/qapi/sockets.json
@@ -252,3 +252,23 @@
'unix': 'UnixSocketAddress',
'vsock': 'VsockSocketAddress',
'fd': 'FdSocketAddress' } }
+
+##
+# @SpdmTransportType:
+#
+# SPDM transport type
+#
+# @unspecified: Unspecified transport
+#
+# @mctp: MCTP transport
+#
+# @doe: PCI Data Object Exchange (DOE) transport
+#
+# @scsi: SCSI transport
+#
+# @nvme: NVMe transport
+#
+# Since: 11.2
+##
+{ 'enum': 'SpdmTransportType',
+ 'data': [ 'unspecified', 'mctp', 'doe', 'scsi', 'nvme' ] }