@samitouri / QOSamiQemu / commits / 7df839591c

hw/cxl: Physical Port Info FMAPI - update to current spec and add defines.

Add a new cxl/cxl_ports.h header for field definitions related only to port commands. Bring field naming up to date with spec as 'version' bitmasks have been replaced with bitmasks of the specific features. Fix a small issue where a reserved value for USP was set to 2 rather than 0. Signed-off-by: Arpit Kumar <arpit1.kumar@samsung.com> Co-developed-by: Jonathan Cameron <jonathan.cameron@huawei.com> Signed-off-by: Jonathan Cameron <jonathan.cameron@huawei.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Message-Id: <20260204173223.44122-2-Jonathan.Cameron@huawei.com>

Arpit Kumar committed Feb 4, 2026 at 17:32 UTC 7df839591cf9354f7cc054ff6d01e16d46ff9f33
2 files changed +73 -11
hw/cxl/cxl-mailbox-utils.c
+20 -11
@@ -15,6 +15,7 @@
15 #include "hw/cxl/cxl.h"
16 #include "hw/cxl/cxl_events.h"
17 #include "hw/cxl/cxl_mailbox.h"
18 +#include "hw/cxl/cxl_port.h"
19 #include "hw/pci/pci.h"
20 #include "hw/pci-bridge/cxl_upstream_port.h"
21 #include "qemu/cutils.h"
@@ -565,16 +566,16 @@ static CXLRetCode cmd_get_physical_port_state(const struct cxl_cmd *cmd,
566 } QEMU_PACKED *in;
567
568 /*
568 - * CXL r3.1 Table 7-19: Get Physical Port State Port Information Block
569 + * CXL r3.2 Table 7-19: Get Physical Port State Port Information Block
570 * Format
571 */
572 struct cxl_fmapi_port_state_info_block {
573 uint8_t port_id;
574 uint8_t config_state;
574 - uint8_t connected_device_cxl_version;
575 + uint8_t connected_device_mode;
576 uint8_t rsv1;
577 uint8_t connected_device_type;
577 - uint8_t port_cxl_version_bitmask;
578 + uint8_t supported_cxl_mode_bitmask;
579 uint8_t max_link_width;
580 uint8_t negotiated_link_width;
581 uint8_t supported_link_speeds_vector;
@@ -623,21 +624,30 @@ static CXLRetCode cmd_get_physical_port_state(const struct cxl_cmd *cmd,
624 if (port_dev) { /* DSP */
625 PCIDevice *ds_dev = pci_bridge_get_sec_bus(PCI_BRIDGE(port_dev))
626 ->devices[0];
626 - port->config_state = 3;
627 + port->config_state = CXL_PORT_CONFIG_STATE_DSP;
628 if (ds_dev) {
629 if (object_dynamic_cast(OBJECT(ds_dev), TYPE_CXL_TYPE3)) {
629 - port->connected_device_type = 5; /* Assume MLD for now */
630 + /* Assume MLD for now */
631 + port->connected_device_type =
632 + CXL_PORT_CONNECTED_DEV_TYPE_3_MLD;
633 } else {
631 - port->connected_device_type = 1;
634 + port->connected_device_type =
635 + CXL_PORT_CONNECTED_DEV_TYPE_PCIE;
636 + port->connected_device_mode =
637 + CXL_PORT_CONNECTED_DEV_MODE_NOT_CXL_OR_DISCONN;
638 +
639 }
640 } else {
634 - port->connected_device_type = 0;
641 + port->connected_device_type = CXL_PORT_CONNECTED_DEV_TYPE_NONE;
642 + port->connected_device_mode =
643 + CXL_PORT_CONNECTED_DEV_MODE_NOT_CXL_OR_DISCONN;
644 }
645 port->supported_ld_count = 3;
646 } else if (usp->port == in->ports[i]) { /* USP */
647 port_dev = PCI_DEVICE(usp);
639 - port->config_state = 4;
640 - port->connected_device_type = 0;
648 + port->config_state = CXL_PORT_CONFIG_STATE_USP;
649 + port->connected_device_type = 0; /* Reserved for USP */
650 + port->connected_device_mode = 0; /* Reserved for USP */
651 } else {
652 return CXL_MBOX_INVALID_INPUT;
653 }
@@ -667,8 +677,7 @@ static CXLRetCode cmd_get_physical_port_state(const struct cxl_cmd *cmd,
677 port->ltssm_state = 0x7;
678 port->first_lane_num = 0;
679 port->link_state = 0;
670 - port->port_cxl_version_bitmask = 0x2;
671 - port->connected_device_cxl_version = 0x2;
680 + port->supported_cxl_mode_bitmask = CXL_PORT_SUPPORTS_68B_VH;
681 }
682
683 pl_size = sizeof(*out) + sizeof(*out->ports) * in->num_ports;
include/hw/cxl/cxl_port.h new
+53
@@ -0,0 +1,53 @@
1 +/* SPDX-License-Identifier: GPL-2.0-or-later */
2 +
3 +#ifndef CXL_PORT_H
4 +#define CXL_PORT_H
5 +
6 +/* CXL r3.2 Table 7-19: Get Physical Port State Port Information Block Format */
7 +#define CXL_PORT_CONFIG_STATE_DISABLED 0x0
8 +#define CXL_PORT_CONFIG_STATE_BIND_IN_PROGRESS 0x1
9 +#define CXL_PORT_CONFIG_STATE_UNBIND_IN_PROGRESS 0x2
10 +#define CXL_PORT_CONFIG_STATE_DSP 0x3
11 +#define CXL_PORT_CONFIG_STATE_USP 0x4
12 +#define CXL_PORT_CONFIG_STATE_FABRIC_PORT 0x5
13 +#define CXL_PORT_CONFIG_STATE_INVALID_PORT_ID 0xF
14 +
15 +#define CXL_PORT_CONNECTED_DEV_MODE_NOT_CXL_OR_DISCONN 0x00
16 +#define CXL_PORT_CONNECTED_DEV_MODE_RCD 0x01
17 +#define CXL_PORT_CONNECTED_DEV_MODE_68B_VH 0x02
18 +#define CXL_PORT_CONNECTED_DEV_MODE_256B 0x03
19 +#define CXL_PORT_CONNECTED_DEV_MODE_LO_256B 0x04
20 +#define CXL_PORT_CONNECTED_DEV_MODE_PBR 0x05
21 +
22 +#define CXL_PORT_CONNECTED_DEV_TYPE_NONE 0x00
23 +#define CXL_PORT_CONNECTED_DEV_TYPE_PCIE 0x01
24 +#define CXL_PORT_CONNECTED_DEV_TYPE_1 0x02
25 +#define CXL_PORT_CONNECTED_DEV_TYPE_2_OR_HBR_SWITCH 0x03
26 +#define CXL_PORT_CONNECTED_DEV_TYPE_3_SLD 0x04
27 +#define CXL_PORT_CONNECTED_DEV_TYPE_3_MLD 0x05
28 +#define CXL_PORT_CONNECTED_DEV_PBR_COMPONENT 0x06
29 +
30 +#define CXL_PORT_SUPPORTS_RCD BIT(0)
31 +#define CXL_PORT_SUPPORTS_68B_VH BIT(1)
32 +#define CXL_PORT_SUPPORTS_256B BIT(2)
33 +#define CXL_PORT_SUPPORTS_LO_256B BIT(3)
34 +#define CXL_PORT_SUPPORTS_PBR BIT(4)
35 +
36 +#define CXL_PORT_LTSSM_DETECT 0x00
37 +#define CXL_PORT_LTSSM_POLLING 0x01
38 +#define CXL_PORT_LTSSM_CONFIGURATION 0x02
39 +#define CXL_PORT_LTSSM_RECOVERY 0x03
40 +#define CXL_PORT_LTSSM_L0 0x04
41 +#define CXL_PORT_LTSSM_L0S 0x05
42 +#define CXL_PORT_LTSSM_L1 0x06
43 +#define CXL_PORT_LTSSM_L2 0x07
44 +#define CXL_PORT_LTSSM_DISABLED 0x08
45 +#define CXL_PORT_LTSSM_LOOPBACK 0x09
46 +#define CXL_PORT_LTSSM_HOT_RESET 0x0A
47 +
48 +#define CXL_PORT_LINK_STATE_FLAG_LANE_REVERSED BIT(0)
49 +#define CXL_PORT_LINK_STATE_FLAG_PERST_ASSERTED BIT(1)
50 +#define CXL_PORT_LINK_STATE_FLAG_PRSNT BIT(2)
51 +#define CXL_PORT_LINK_STATE_FLAG_POWER_OFF BIT(3)
52 +
53 +#endif /* CXL_PORT_H */