From: Jonathan Cameron <Jonathan.Cameron@huawei.com>
To: Arpit Kumar <arpit1.kumar@samsung.com>
Cc: <qemu-devel@nongnu.org>, <gost.dev@samsung.com>,
<linux-cxl@vger.kernel.org>, <dave@stgolabs.net>,
<vishak.g@samsung.com>, <krish.reddy@samsung.com>,
<a.manzanares@samsung.com>, <alok.rathore@samsung.com>,
<cpgs@samsung.com>
Subject: Re: [PATCH v4 2/2] hw/cxl: Add Physical Port Control (Opcode 5102h)
Date: Wed, 17 Sep 2025 17:05:33 +0100 [thread overview]
Message-ID: <20250917170533.00003f03@huawei.com> (raw)
In-Reply-To: <20250916080736.1266083-3-arpit1.kumar@samsung.com>
On Tue, 16 Sep 2025 13:37:36 +0530
Arpit Kumar <arpit1.kumar@samsung.com> wrote:
> -added assert-deassert PERST implementation
> for physical ports (both USP and DSP's).
> -assert PERST involves bg operation for holding 100ms.
> -reset PPB implementation for physical ports.
>
> Signed-off-by: Arpit Kumar <arpit1.kumar@samsung.com>
See below for why but I've picked this up with this and a define move that
was needed to build it where I've queued it up.
Thanks!
diff --git a/hw/cxl/cxl-mailbox-utils.c b/hw/cxl/cxl-mailbox-utils.c
index 6f7291e6ad..1d16d033c7 100644
--- a/hw/cxl/cxl-mailbox-utils.c
+++ b/hw/cxl/cxl-mailbox-utils.c
@@ -607,7 +607,7 @@ static void *bg_assertcb(void *opaque)
return NULL;
}
-static CXLRetCode deassert_perst(Object *obj, uint8_t pn, CXLUpstreamPort *pp)
+static CXLRetCode cxl_deassert_perst(Object *obj, uint8_t pn, CXLUpstreamPort *pp)
{
if (!pp->pports.perst[pn].issued_assert_perst) {
return CXL_MBOX_INTERNAL_ERROR;
@@ -623,7 +623,7 @@ static CXLRetCode deassert_perst(Object *obj, uint8_t pn, CXLUpstreamPort *pp)
return CXL_MBOX_SUCCESS;
}
-static CXLRetCode assert_perst(Object *obj, uint8_t pn, CXLUpstreamPort *pp)
+static CXLRetCode cxl_assert_perst(Object *obj, uint8_t pn, CXLUpstreamPort *pp)
{
if (pp->pports.perst[pn].issued_assert_perst ||
pp->pports.perst[pn].asrt_time < ASSERT_WAIT_TIME_MS) {
@@ -668,7 +668,6 @@ static CXLRetCode cmd_physical_port_control(const struct cxl_cmd *cmd,
CXLUpstreamPort *pp = CXL_USP(cci->d);
PCIDevice *dev;
uint8_t pn;
- uint8_t ret = CXL_MBOX_SUCCESS;
struct cxl_fmapi_get_physical_port_control_req_pl {
uint8_t ppb_id;
@@ -691,22 +690,19 @@ static CXLRetCode cmd_physical_port_control(const struct cxl_cmd *cmd,
switch (in->ports_op) {
case 0:
- ret = assert_perst(OBJECT(&dev->qdev), pn, pp);
- break;
+ return cxl_assert_perst(OBJECT(&dev->qdev), pn, pp);
case 1:
- ret = deassert_perst(OBJECT(&dev->qdev), pn, pp);
- break;
+ return cxl_deassert_perst(OBJECT(&dev->qdev), pn, pp);
case 2:
if (pp->pports.perst[pn].issued_assert_perst ||
pp->pports.perst[pn].asrt_time < ASSERT_WAIT_TIME_MS) {
return CXL_MBOX_INTERNAL_ERROR;
}
device_cold_reset(&dev->qdev);
- break;
+ return CXL_MBOX_SUCCESS;
default:
return CXL_MBOX_INVALID_INPUT;
}
- return ret;
}
> ---
> hw/cxl/cxl-mailbox-utils.c | 139 ++++++++++++++++++++++
> include/hw/cxl/cxl_device.h | 9 ++
> include/hw/cxl/cxl_mailbox.h | 1 +
Had to move the define for now that went in here because I'm carrying this
further up my tree than Anisa's patch that moved this as a precursor
to the MCTP support.
> include/hw/pci-bridge/cxl_upstream_port.h | 1 +
> 4 files changed, 150 insertions(+)
>
> diff --git a/hw/cxl/cxl-mailbox-utils.c b/hw/cxl/cxl-mailbox-utils.c
> index 2a104dd337..8cccb2c0ed 100644
> --- a/hw/cxl/cxl-mailbox-utils.c
> +++ b/hw/cxl/cxl-mailbox-utils.c
> @@ -541,6 +541,120 @@ static CXLRetCode cmd_get_physical_port_state(const struct cxl_cmd *cmd,
> return CXL_MBOX_SUCCESS;
> }
>
> +static void *bg_assertcb(void *opaque)
> +{
> + CXLPhyPortPerst *perst = opaque;
> +
> + /* holding reset phase for 100ms */
> + while (perst->asrt_time--) {
> + usleep(1000);
> + }
> + perst->issued_assert_perst = true;
> + return NULL;
> +}
> +
> +static CXLRetCode deassert_perst(Object *obj, uint8_t pn, CXLUpstreamPort *pp)
I think we want to namespace these to cxl given these are not
a PCI standard thing. So when I pick these up I'll prefix with cxl_
> +{
> + if (!pp->pports.perst[pn].issued_assert_perst) {
> + return CXL_MBOX_INTERNAL_ERROR;
> + }
> +
> + QEMU_LOCK_GUARD(&pp->pports.perst[pn].lock);
> + resettable_release_reset(obj, RESET_TYPE_COLD);
> + pp->pports.perst[pn].issued_assert_perst = false;
> + pp->pports.pport_info[pn].link_state_flags &=
> + ~CXL_PORT_LINK_STATE_FLAG_PERST_ASSERTED;
> + pp->pports.perst[pn].asrt_time = ASSERT_WAIT_TIME_MS;
> +
> + return CXL_MBOX_SUCCESS;
> +}
> +
> +static CXLRetCode assert_perst(Object *obj, uint8_t pn, CXLUpstreamPort *pp)
> +{
> + if (pp->pports.perst[pn].issued_assert_perst ||
> + pp->pports.perst[pn].asrt_time < ASSERT_WAIT_TIME_MS) {
> + return CXL_MBOX_INTERNAL_ERROR;
> + }
> +
> + QEMU_LOCK_GUARD(&pp->pports.perst[pn].lock);
> + pp->pports.pport_info[pn].link_state_flags |=
> + CXL_PORT_LINK_STATE_FLAG_PERST_ASSERTED;
> + resettable_assert_reset(obj, RESET_TYPE_COLD);
> + qemu_thread_create(&pp->pports.perst[pn].asrt_thread, "assert_thread",
> + bg_assertcb, &pp->pports.perst[pn], QEMU_THREAD_DETACHED);
> +
> + return CXL_MBOX_SUCCESS;
> +}
> +
> +static struct PCIDevice *cxl_find_port_dev(uint8_t pn, CXLCCI *cci)
> +{
> + CXLUpstreamPort *pp = CXL_USP(cci->d);
> + PCIBus *bus = &PCI_BRIDGE(cci->d)->sec_bus;
> +
> + if (pp->pports.pport_info[pn].current_port_config_state ==
> + CXL_PORT_CONFIG_STATE_USP) {
> + return pci_bridge_get_device(bus);
> + }
> +
> + if (pp->pports.pport_info[pn].current_port_config_state ==
> + CXL_PORT_CONFIG_STATE_DSP) {
> + return pcie_find_port_by_pn(bus, pn);
> + }
> + return NULL;
> +}
> +
> +/* CXL r3.2 Section 7.6.7.1.3: Get Physical Port Control (Opcode 5102h) */
> +static CXLRetCode cmd_physical_port_control(const struct cxl_cmd *cmd,
> + uint8_t *payload_in,
> + size_t len_in,
> + uint8_t *payload_out,
> + size_t *len_out,
> + CXLCCI *cci)
> +{
> + CXLUpstreamPort *pp = CXL_USP(cci->d);
> + PCIDevice *dev;
> + uint8_t pn;
> + uint8_t ret = CXL_MBOX_SUCCESS;
> +
> + struct cxl_fmapi_get_physical_port_control_req_pl {
> + uint8_t ppb_id;
> + uint8_t ports_op;
> + } QEMU_PACKED *in = (void *)payload_in;
> +
> + if (len_in < sizeof(*in)) {
> + return CXL_MBOX_INVALID_PAYLOAD_LENGTH;
> + }
> +
> + pn = in->ppb_id;
> + if (pp->pports.pport_info[pn].port_id != pn) {
> + return CXL_MBOX_INTERNAL_ERROR;
> + }
> +
> + dev = cxl_find_port_dev(pn, cci);
> + if (!dev) {
> + return CXL_MBOX_INTERNAL_ERROR;
> + }
> +
> + switch (in->ports_op) {
> + case 0:
> + ret = assert_perst(OBJECT(&dev->qdev), pn, pp);
To me, direct returns are clearer here.
return cxl_assert_perst();
I tweaked this and the other case statements in here. That lets
me drop the local variable ret and the return code hidden up top.
> + break;
> + case 1:
> + ret = deassert_perst(OBJECT(&dev->qdev), pn, pp);
> + break;
> + case 2:
> + if (pp->pports.perst[pn].issued_assert_perst ||
> + pp->pports.perst[pn].asrt_time < ASSERT_WAIT_TIME_MS) {
> + return CXL_MBOX_INTERNAL_ERROR;
> + }
> + device_cold_reset(&dev->qdev);
> + break;
> + default:
> + return CXL_MBOX_INVALID_INPUT;
> + }
> + return ret;
> +}
> +
> /* CXL r3.1 Section 8.2.9.1.2: Background Operation Status (Opcode 0002h) */
> static CXLRetCode cmd_infostat_bg_op_sts(const struct cxl_cmd *cmd,
> uint8_t *payload_in,
> @@ -4347,6 +4461,8 @@ static const struct cxl_cmd cxl_cmd_set_sw[256][256] = {
> cmd_identify_switch_device, 0, 0 },
> [PHYSICAL_SWITCH][GET_PHYSICAL_PORT_STATE] = { "SWITCH_PHYSICAL_PORT_STATS",
> cmd_get_physical_port_state, ~0, 0 },
> + [PHYSICAL_SWITCH][PHYSICAL_PORT_CONTROL] = { "SWITCH_PHYSICAL_PORT_CONTROL",
> + cmd_physical_port_control, 2, 0 },
> [TUNNEL][MANAGEMENT_COMMAND] = { "TUNNEL_MANAGEMENT_COMMAND",
> cmd_tunnel_management_cmd, ~0, 0 },
> };
> @@ -4702,11 +4818,34 @@ static CXLRetCode cxl_set_phy_port_info(CXLCCI *cci)
> void cxl_initialize_mailbox_swcci(CXLCCI *cci, DeviceState *intf,
> DeviceState *d, size_t payload_max)
> {
> + CXLUpstreamPort *pp;
> + uint8_t pn = 0;
> +
> cxl_copy_cci_commands(cci, cxl_cmd_set_sw);
> cci->d = d;
> cci->intf = intf;
> cxl_init_cci(cci, payload_max);
> cxl_set_phy_port_info(cci);
> + /* physical port control */
> + pp = CXL_USP(cci->d);
> + for (int byte_index = 0; byte_index < (CXL_MAX_PHY_PORTS / BITS_PER_BYTE);
> + byte_index++) {
> + unsigned char byte = pp->pports.active_port_bitmask[byte_index];
> +
> + for (int bit_index = 0; bit_index < 8; bit_index++, pn++) {
> + if (((byte) & (1 << bit_index)) != 0) {
> + qemu_mutex_init(&pp->pports.perst[pn].lock);
> + pp->pports.perst[pn].issued_assert_perst = false;
> + /*
> + * Assert PERST involves physical port to be in
> + * hold reset phase for minimum 100ms. No other
> + * physical port control requests are entertained
> + * until Deassert PERST command.
> + */
> + pp->pports.perst[pn].asrt_time = ASSERT_WAIT_TIME_MS;
> + }
> + }
> + }
> }
>
> void cxl_initialize_mailbox_t3(CXLCCI *cci, DeviceState *d, size_t payload_max)
WARNING: multiple messages have this Message-ID (diff)
From: Jonathan Cameron via <qemu-devel@nongnu.org>
To: Arpit Kumar <arpit1.kumar@samsung.com>
Cc: <qemu-devel@nongnu.org>, <gost.dev@samsung.com>,
<linux-cxl@vger.kernel.org>, <dave@stgolabs.net>,
<vishak.g@samsung.com>, <krish.reddy@samsung.com>,
<a.manzanares@samsung.com>, <alok.rathore@samsung.com>,
<cpgs@samsung.com>
Subject: Re: [PATCH v4 2/2] hw/cxl: Add Physical Port Control (Opcode 5102h)
Date: Wed, 17 Sep 2025 17:05:33 +0100 [thread overview]
Message-ID: <20250917170533.00003f03@huawei.com> (raw)
In-Reply-To: <20250916080736.1266083-3-arpit1.kumar@samsung.com>
On Tue, 16 Sep 2025 13:37:36 +0530
Arpit Kumar <arpit1.kumar@samsung.com> wrote:
> -added assert-deassert PERST implementation
> for physical ports (both USP and DSP's).
> -assert PERST involves bg operation for holding 100ms.
> -reset PPB implementation for physical ports.
>
> Signed-off-by: Arpit Kumar <arpit1.kumar@samsung.com>
See below for why but I've picked this up with this and a define move that
was needed to build it where I've queued it up.
Thanks!
diff --git a/hw/cxl/cxl-mailbox-utils.c b/hw/cxl/cxl-mailbox-utils.c
index 6f7291e6ad..1d16d033c7 100644
--- a/hw/cxl/cxl-mailbox-utils.c
+++ b/hw/cxl/cxl-mailbox-utils.c
@@ -607,7 +607,7 @@ static void *bg_assertcb(void *opaque)
return NULL;
}
-static CXLRetCode deassert_perst(Object *obj, uint8_t pn, CXLUpstreamPort *pp)
+static CXLRetCode cxl_deassert_perst(Object *obj, uint8_t pn, CXLUpstreamPort *pp)
{
if (!pp->pports.perst[pn].issued_assert_perst) {
return CXL_MBOX_INTERNAL_ERROR;
@@ -623,7 +623,7 @@ static CXLRetCode deassert_perst(Object *obj, uint8_t pn, CXLUpstreamPort *pp)
return CXL_MBOX_SUCCESS;
}
-static CXLRetCode assert_perst(Object *obj, uint8_t pn, CXLUpstreamPort *pp)
+static CXLRetCode cxl_assert_perst(Object *obj, uint8_t pn, CXLUpstreamPort *pp)
{
if (pp->pports.perst[pn].issued_assert_perst ||
pp->pports.perst[pn].asrt_time < ASSERT_WAIT_TIME_MS) {
@@ -668,7 +668,6 @@ static CXLRetCode cmd_physical_port_control(const struct cxl_cmd *cmd,
CXLUpstreamPort *pp = CXL_USP(cci->d);
PCIDevice *dev;
uint8_t pn;
- uint8_t ret = CXL_MBOX_SUCCESS;
struct cxl_fmapi_get_physical_port_control_req_pl {
uint8_t ppb_id;
@@ -691,22 +690,19 @@ static CXLRetCode cmd_physical_port_control(const struct cxl_cmd *cmd,
switch (in->ports_op) {
case 0:
- ret = assert_perst(OBJECT(&dev->qdev), pn, pp);
- break;
+ return cxl_assert_perst(OBJECT(&dev->qdev), pn, pp);
case 1:
- ret = deassert_perst(OBJECT(&dev->qdev), pn, pp);
- break;
+ return cxl_deassert_perst(OBJECT(&dev->qdev), pn, pp);
case 2:
if (pp->pports.perst[pn].issued_assert_perst ||
pp->pports.perst[pn].asrt_time < ASSERT_WAIT_TIME_MS) {
return CXL_MBOX_INTERNAL_ERROR;
}
device_cold_reset(&dev->qdev);
- break;
+ return CXL_MBOX_SUCCESS;
default:
return CXL_MBOX_INVALID_INPUT;
}
- return ret;
}
> ---
> hw/cxl/cxl-mailbox-utils.c | 139 ++++++++++++++++++++++
> include/hw/cxl/cxl_device.h | 9 ++
> include/hw/cxl/cxl_mailbox.h | 1 +
Had to move the define for now that went in here because I'm carrying this
further up my tree than Anisa's patch that moved this as a precursor
to the MCTP support.
> include/hw/pci-bridge/cxl_upstream_port.h | 1 +
> 4 files changed, 150 insertions(+)
>
> diff --git a/hw/cxl/cxl-mailbox-utils.c b/hw/cxl/cxl-mailbox-utils.c
> index 2a104dd337..8cccb2c0ed 100644
> --- a/hw/cxl/cxl-mailbox-utils.c
> +++ b/hw/cxl/cxl-mailbox-utils.c
> @@ -541,6 +541,120 @@ static CXLRetCode cmd_get_physical_port_state(const struct cxl_cmd *cmd,
> return CXL_MBOX_SUCCESS;
> }
>
> +static void *bg_assertcb(void *opaque)
> +{
> + CXLPhyPortPerst *perst = opaque;
> +
> + /* holding reset phase for 100ms */
> + while (perst->asrt_time--) {
> + usleep(1000);
> + }
> + perst->issued_assert_perst = true;
> + return NULL;
> +}
> +
> +static CXLRetCode deassert_perst(Object *obj, uint8_t pn, CXLUpstreamPort *pp)
I think we want to namespace these to cxl given these are not
a PCI standard thing. So when I pick these up I'll prefix with cxl_
> +{
> + if (!pp->pports.perst[pn].issued_assert_perst) {
> + return CXL_MBOX_INTERNAL_ERROR;
> + }
> +
> + QEMU_LOCK_GUARD(&pp->pports.perst[pn].lock);
> + resettable_release_reset(obj, RESET_TYPE_COLD);
> + pp->pports.perst[pn].issued_assert_perst = false;
> + pp->pports.pport_info[pn].link_state_flags &=
> + ~CXL_PORT_LINK_STATE_FLAG_PERST_ASSERTED;
> + pp->pports.perst[pn].asrt_time = ASSERT_WAIT_TIME_MS;
> +
> + return CXL_MBOX_SUCCESS;
> +}
> +
> +static CXLRetCode assert_perst(Object *obj, uint8_t pn, CXLUpstreamPort *pp)
> +{
> + if (pp->pports.perst[pn].issued_assert_perst ||
> + pp->pports.perst[pn].asrt_time < ASSERT_WAIT_TIME_MS) {
> + return CXL_MBOX_INTERNAL_ERROR;
> + }
> +
> + QEMU_LOCK_GUARD(&pp->pports.perst[pn].lock);
> + pp->pports.pport_info[pn].link_state_flags |=
> + CXL_PORT_LINK_STATE_FLAG_PERST_ASSERTED;
> + resettable_assert_reset(obj, RESET_TYPE_COLD);
> + qemu_thread_create(&pp->pports.perst[pn].asrt_thread, "assert_thread",
> + bg_assertcb, &pp->pports.perst[pn], QEMU_THREAD_DETACHED);
> +
> + return CXL_MBOX_SUCCESS;
> +}
> +
> +static struct PCIDevice *cxl_find_port_dev(uint8_t pn, CXLCCI *cci)
> +{
> + CXLUpstreamPort *pp = CXL_USP(cci->d);
> + PCIBus *bus = &PCI_BRIDGE(cci->d)->sec_bus;
> +
> + if (pp->pports.pport_info[pn].current_port_config_state ==
> + CXL_PORT_CONFIG_STATE_USP) {
> + return pci_bridge_get_device(bus);
> + }
> +
> + if (pp->pports.pport_info[pn].current_port_config_state ==
> + CXL_PORT_CONFIG_STATE_DSP) {
> + return pcie_find_port_by_pn(bus, pn);
> + }
> + return NULL;
> +}
> +
> +/* CXL r3.2 Section 7.6.7.1.3: Get Physical Port Control (Opcode 5102h) */
> +static CXLRetCode cmd_physical_port_control(const struct cxl_cmd *cmd,
> + uint8_t *payload_in,
> + size_t len_in,
> + uint8_t *payload_out,
> + size_t *len_out,
> + CXLCCI *cci)
> +{
> + CXLUpstreamPort *pp = CXL_USP(cci->d);
> + PCIDevice *dev;
> + uint8_t pn;
> + uint8_t ret = CXL_MBOX_SUCCESS;
> +
> + struct cxl_fmapi_get_physical_port_control_req_pl {
> + uint8_t ppb_id;
> + uint8_t ports_op;
> + } QEMU_PACKED *in = (void *)payload_in;
> +
> + if (len_in < sizeof(*in)) {
> + return CXL_MBOX_INVALID_PAYLOAD_LENGTH;
> + }
> +
> + pn = in->ppb_id;
> + if (pp->pports.pport_info[pn].port_id != pn) {
> + return CXL_MBOX_INTERNAL_ERROR;
> + }
> +
> + dev = cxl_find_port_dev(pn, cci);
> + if (!dev) {
> + return CXL_MBOX_INTERNAL_ERROR;
> + }
> +
> + switch (in->ports_op) {
> + case 0:
> + ret = assert_perst(OBJECT(&dev->qdev), pn, pp);
To me, direct returns are clearer here.
return cxl_assert_perst();
I tweaked this and the other case statements in here. That lets
me drop the local variable ret and the return code hidden up top.
> + break;
> + case 1:
> + ret = deassert_perst(OBJECT(&dev->qdev), pn, pp);
> + break;
> + case 2:
> + if (pp->pports.perst[pn].issued_assert_perst ||
> + pp->pports.perst[pn].asrt_time < ASSERT_WAIT_TIME_MS) {
> + return CXL_MBOX_INTERNAL_ERROR;
> + }
> + device_cold_reset(&dev->qdev);
> + break;
> + default:
> + return CXL_MBOX_INVALID_INPUT;
> + }
> + return ret;
> +}
> +
> /* CXL r3.1 Section 8.2.9.1.2: Background Operation Status (Opcode 0002h) */
> static CXLRetCode cmd_infostat_bg_op_sts(const struct cxl_cmd *cmd,
> uint8_t *payload_in,
> @@ -4347,6 +4461,8 @@ static const struct cxl_cmd cxl_cmd_set_sw[256][256] = {
> cmd_identify_switch_device, 0, 0 },
> [PHYSICAL_SWITCH][GET_PHYSICAL_PORT_STATE] = { "SWITCH_PHYSICAL_PORT_STATS",
> cmd_get_physical_port_state, ~0, 0 },
> + [PHYSICAL_SWITCH][PHYSICAL_PORT_CONTROL] = { "SWITCH_PHYSICAL_PORT_CONTROL",
> + cmd_physical_port_control, 2, 0 },
> [TUNNEL][MANAGEMENT_COMMAND] = { "TUNNEL_MANAGEMENT_COMMAND",
> cmd_tunnel_management_cmd, ~0, 0 },
> };
> @@ -4702,11 +4818,34 @@ static CXLRetCode cxl_set_phy_port_info(CXLCCI *cci)
> void cxl_initialize_mailbox_swcci(CXLCCI *cci, DeviceState *intf,
> DeviceState *d, size_t payload_max)
> {
> + CXLUpstreamPort *pp;
> + uint8_t pn = 0;
> +
> cxl_copy_cci_commands(cci, cxl_cmd_set_sw);
> cci->d = d;
> cci->intf = intf;
> cxl_init_cci(cci, payload_max);
> cxl_set_phy_port_info(cci);
> + /* physical port control */
> + pp = CXL_USP(cci->d);
> + for (int byte_index = 0; byte_index < (CXL_MAX_PHY_PORTS / BITS_PER_BYTE);
> + byte_index++) {
> + unsigned char byte = pp->pports.active_port_bitmask[byte_index];
> +
> + for (int bit_index = 0; bit_index < 8; bit_index++, pn++) {
> + if (((byte) & (1 << bit_index)) != 0) {
> + qemu_mutex_init(&pp->pports.perst[pn].lock);
> + pp->pports.perst[pn].issued_assert_perst = false;
> + /*
> + * Assert PERST involves physical port to be in
> + * hold reset phase for minimum 100ms. No other
> + * physical port control requests are entertained
> + * until Deassert PERST command.
> + */
> + pp->pports.perst[pn].asrt_time = ASSERT_WAIT_TIME_MS;
> + }
> + }
> + }
> }
>
> void cxl_initialize_mailbox_t3(CXLCCI *cci, DeviceState *d, size_t payload_max)
next prev parent reply other threads:[~2025-09-17 16:05 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <CGME20250916080757epcas5p2db403c9648f7818b22413d90acb4fdd4@epcas5p2.samsung.com>
2025-09-16 8:07 ` [PATCH v4 0/2] FM-API Physical Switch Command Set Support Arpit Kumar
2025-09-16 8:07 ` [PATCH v4 1/2] hw/cxl: Refactored Identify Switch Device & Get Physical Port State Arpit Kumar
2025-09-17 15:55 ` Jonathan Cameron
2025-09-17 15:55 ` Jonathan Cameron via
2025-09-19 11:03 ` Arpit Kumar
2025-09-30 14:26 ` Jonathan Cameron
2025-09-30 14:26 ` Jonathan Cameron via
2025-09-16 8:07 ` [PATCH v4 2/2] hw/cxl: Add Physical Port Control (Opcode 5102h) Arpit Kumar
2025-09-17 16:05 ` Jonathan Cameron [this message]
2025-09-17 16:05 ` Jonathan Cameron via
2025-09-19 11:16 ` Arpit Kumar
2025-09-17 16:29 ` Jonathan Cameron
2025-09-17 16:29 ` Jonathan Cameron via
2025-09-19 11:21 ` Arpit Kumar
2026-01-27 15:23 ` [PATCH v4 0/2] FM-API Physical Switch Command Set Support Jonathan Cameron
2026-01-27 15:23 ` Jonathan Cameron via qemu development
2026-01-30 12:03 ` Arpit Kumar
2026-01-30 12:31 ` Jonathan Cameron
2026-01-30 12:31 ` Jonathan Cameron via qemu development
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=20250917170533.00003f03@huawei.com \
--to=jonathan.cameron@huawei.com \
--cc=a.manzanares@samsung.com \
--cc=alok.rathore@samsung.com \
--cc=arpit1.kumar@samsung.com \
--cc=cpgs@samsung.com \
--cc=dave@stgolabs.net \
--cc=gost.dev@samsung.com \
--cc=krish.reddy@samsung.com \
--cc=linux-cxl@vger.kernel.org \
--cc=qemu-devel@nongnu.org \
--cc=vishak.g@samsung.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.