This patch series refactor existing support for Identify Switch Device and Get Physical Port State by utilizing physical ports (USP & DSP) information stored during enumeration.
Additionally, it introduces new support for Physical Port Control of Physical Switch Command Set as per CXL spec r3.2 Section 7.6.7.1.3. It primarily constitutes two logic: -Assert-Deassert PERST: Assert PERST involves physical port to be in hold reset phase for minimum 100ms. No other physical port control request are entertained until Deassert PERST command for the given port is issued. -Reset PPB: cold reset of physical port (completing enter->hold->exit phases). Tested using libcxl-mi interface[1]: All active ports and all opcodes per active port is tested. Also, tested against possible edge cases manually since the interface currently dosen't support run time input. Typical Qemu topology (1 USP + 3 DSP's in a switch with 2 CXLType3 devices connected to the 2 DSP's): FM="-object memory-backend-file,id=cxl-mem1,mem-path=$TMP_DIR/t3_cxl1.raw,size=256M \ -object memory-backend-file,id=cxl-lsa1,mem-path=$TMP_DIR/t3_lsa1.raw,size=1M \ -object memory-backend-file,id=cxl-mem2,mem-path=$TMP_DIR/t3_cxl2.raw,size=512M \ -object memory-backend-file,id=cxl-lsa2,mem-path=$TMP_DIR/t3_lsa2.raw,size=512M \ -device pxb-cxl,bus_nr=12,bus=pcie.0,id=cxl.1,hdm_for_passthrough=true \ -device cxl-rp,port=0,bus=cxl.1,id=cxl_rp_port0,chassis=0,slot=2 \ -device cxl-upstream,port=2,sn=1234,bus=cxl_rp_port0,id=us0,addr=0.0,multifunction=on, \ -device cxl-switch-mailbox-cci,bus=cxl_rp_port0,addr=0.1,target=us0 \ -device cxl-downstream,port=0,bus=us0,id=swport0,chassis=0,slot=4 \ -device cxl-downstream,port=1,bus=us0,id=swport1,chassis=0,slot=5 \ -device cxl-downstream,port=3,bus=us0,id=swport2,chassis=0,slot=6 \ -device cxl-type3,bus=swport0,memdev=cxl-mem1,id=cxl-pmem1,lsa=cxl-lsa1,sn=3 \ -device cxl-type3,bus=swport2,memdev=cxl-mem2,id=cxl-pmem2,lsa=cxl-lsa2,sn=4 \ -machine cxl-fmw.0.targets.0=cxl.1,cxl-fmw.0.size=4G,cxl-fmw.0.interleave-granularity=1k \ -device i2c_mctp_cxl,bus=aspeed.i2c.bus.0,address=4,target=us0 \ -device i2c_mctp_cxl,bus=aspeed.i2c.bus.0,address=5,target=cxl-pmem1 \ -device i2c_mctp_cxl,bus=aspeed.i2c.bus.0,address=6,target=cxl-pmem2 \ -device virtio-rng-pci,bus=swport1" Tested multiple Qemu topologies: -without any devices connected to downstream ports. -with virtio-rng-pci devices connected to downstream ports. -with CXLType3 devices connected to downstream ports. -with different unique values of ports (both upstream and downstream). Changes from v3 (https://lore.kernel.org/qemu-devel/20250909160316.00000...@huawei.com/T/): -Namespaced the defines with cleaner prefix for Get Physical Port State Port Information Block members. -switch CCI implementation instead of switch FM interface as per Jonathan's review comments, hence moved perst members initializations from: cxl_initialize_usp_mctpcci() -> cxl_initialize_mailbox_swcci(). [1] https://github.com/computexpresslink/libcxlmi/commit/35fe68bd9a31469f832a87694d7b18d2d50be5b8 The patches are generated against the Johnathan's tree https://gitlab.com/jic23/qemu.git and branch cxl-2025-07-03. Signed-off-by: Arpit Kumar <arpit1.ku...@samsung.com> Arpit Kumar (2): hw/cxl: Refactored Identify Switch Device & Get Physical Port State hw/cxl: Add Physical Port Control (Opcode 5102h) hw/cxl/cxl-mailbox-utils.c | 368 +++++++++++++++------- include/hw/cxl/cxl_device.h | 76 +++++ include/hw/cxl/cxl_mailbox.h | 1 + include/hw/pci-bridge/cxl_upstream_port.h | 9 + 4 files changed, 348 insertions(+), 106 deletions(-) -- 2.34.1