From: Jonathan Cameron <Jonathan.Cameron@huawei.com>
To: <qemu-devel@nongnu.org>, <linux-cxl@vger.kernel.org>,
Fan Ni <fan.ni@samsung.com>, Michael Tsirkin <mst@redhat.com>
Cc: "Ira Weiny" <ira.weiny@intel.com>,
"Dave Jiang" <dave.jiang@intel.com>,
peter.maydell@linaro.org, "Davidlohr Bueso" <dave@stgolabs.net>,
"Hyeonggon Yoo" <42.hyeyoo@gmail.com>,
"Li Zhijian" <lizhijian@fujitsu.com>,
"Stefan Hajnoczi" <stefanha@gmail.com>,
linuxarm@huawei.com, "Philippe Mathieu-Daudé" <philmd@linaro.org>
Subject: [PATCH v2 06/12] hw/cxl/device: read from register values in mdev_reg_read()
Date: Fri, 26 Jan 2024 12:01:26 +0000 [thread overview]
Message-ID: <20240126120132.24248-7-Jonathan.Cameron@huawei.com> (raw)
In-Reply-To: <20240126120132.24248-1-Jonathan.Cameron@huawei.com>
From: Hyeonggon Yoo <42.hyeyoo@gmail.com>
In the current mdev_reg_read() implementation, it consistently returns
that the Media Status is Ready (01b). This was fine until commit
25a52959f99d ("hw/cxl: Add support for device sanitation") because the
media was presumed to be ready.
However, as per the CXL 3.0 spec "8.2.9.8.5.1 Sanitize (Opcode 4400h)",
during sanitation, the Media State should be set to Disabled (11b). The
mentioned commit correctly sets it to Disabled, but mdev_reg_read()
still returns Media Status as Ready.
To address this, update mdev_reg_read() to read register values instead
of returning dummy values.
Note that __toggle_media() managed to not only write something
that no one read, it did it to the wrong register storage and
so changed the reported mailbox size which was definitely not
the intent. That gets fixed as a side effect of allocating
separate state storage for this register.
Fixes: commit 25a52959f99d ("hw/cxl: Add support for device sanitation")
Signed-off-by: Hyeonggon Yoo <42.hyeyoo@gmail.com>
Reviewed-by: Fan Ni <fan.ni@samsung.com>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
---
Patch description expanded to cover the overwrite bug fixed almost
by accident in this patch.
---
include/hw/cxl/cxl_device.h | 9 +++++++--
hw/cxl/cxl-device-utils.c | 17 +++++++++++------
2 files changed, 18 insertions(+), 8 deletions(-)
diff --git a/include/hw/cxl/cxl_device.h b/include/hw/cxl/cxl_device.h
index befb5f884b..31d2afcd3d 100644
--- a/include/hw/cxl/cxl_device.h
+++ b/include/hw/cxl/cxl_device.h
@@ -202,6 +202,9 @@ typedef struct cxl_device_state {
};
};
+ /* Stash the memory device status value */
+ uint64_t memdev_status;
+
struct {
bool set;
uint64_t last_set;
@@ -353,8 +356,10 @@ static inline void __toggle_media(CXLDeviceState *cxl_dstate, int val)
{
uint64_t dev_status_reg;
- dev_status_reg = FIELD_DP64(0, CXL_MEM_DEV_STS, MEDIA_STATUS, val);
- cxl_dstate->mbox_reg_state64[R_CXL_MEM_DEV_STS] = dev_status_reg;
+ dev_status_reg = cxl_dstate->memdev_status;
+ dev_status_reg = FIELD_DP64(dev_status_reg, CXL_MEM_DEV_STS, MEDIA_STATUS,
+ val);
+ cxl_dstate->memdev_status = dev_status_reg;
}
#define cxl_dev_disable_media(cxlds) \
do { __toggle_media((cxlds), 0x3); } while (0)
diff --git a/hw/cxl/cxl-device-utils.c b/hw/cxl/cxl-device-utils.c
index 61a3c4dc2e..40b619ffd9 100644
--- a/hw/cxl/cxl-device-utils.c
+++ b/hw/cxl/cxl-device-utils.c
@@ -229,12 +229,9 @@ static void mailbox_reg_write(void *opaque, hwaddr offset, uint64_t value,
static uint64_t mdev_reg_read(void *opaque, hwaddr offset, unsigned size)
{
- uint64_t retval = 0;
-
- retval = FIELD_DP64(retval, CXL_MEM_DEV_STS, MEDIA_STATUS, 1);
- retval = FIELD_DP64(retval, CXL_MEM_DEV_STS, MBOX_READY, 1);
+ CXLDeviceState *cxl_dstate = opaque;
- return retval;
+ return cxl_dstate->memdev_status;
}
static void ro_reg_write(void *opaque, hwaddr offset, uint64_t value,
@@ -371,7 +368,15 @@ static void mailbox_reg_init_common(CXLDeviceState *cxl_dstate)
cxl_dstate->mbox_msi_n = msi_n;
}
-static void memdev_reg_init_common(CXLDeviceState *cxl_dstate) { }
+static void memdev_reg_init_common(CXLDeviceState *cxl_dstate)
+{
+ uint64_t memdev_status_reg;
+
+ memdev_status_reg = FIELD_DP64(0, CXL_MEM_DEV_STS, MEDIA_STATUS, 1);
+ memdev_status_reg = FIELD_DP64(memdev_status_reg, CXL_MEM_DEV_STS,
+ MBOX_READY, 1);
+ cxl_dstate->memdev_status = memdev_status_reg;
+}
void cxl_device_register_init_t3(CXLType3Dev *ct3d)
{
--
2.39.2
next prev parent reply other threads:[~2024-01-26 12:04 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-26 12:01 [PATCH v2 00/12 qemu] CXL emulation fixes and minor cleanup Jonathan Cameron
2024-01-26 12:01 ` [PATCH v2 01/12] cxl/cdat: Handle cdat table build errors Jonathan Cameron
2024-01-26 12:01 ` [PATCH v2 02/12] hw/mem/cxl_type3: Drop handling of failure of g_malloc0() and g_malloc() Jonathan Cameron
2024-01-26 12:01 ` [PATCH v2 03/12] hw/pci-bridge/cxl_upstream: Drop g_malloc() failure handling Jonathan Cameron
2024-01-26 12:01 ` [PATCH v2 04/12] cxl/cdat: Fix header sum value in CDAT checksum Jonathan Cameron
2024-01-26 12:01 ` [PATCH v2 05/12] hw/cxl/mbox: Remove dead code Jonathan Cameron
2024-01-26 12:01 ` Jonathan Cameron [this message]
2024-01-26 12:01 ` [PATCH v2 07/12] hw/cxl: Pass CXLComponentState to cache_mem_ops Jonathan Cameron
2024-01-26 12:01 ` [PATCH v2 08/12] hw/cxl: Pass NULL for a NULL MemoryRegionOps Jonathan Cameron
2024-01-26 12:01 ` [PATCH v2 09/12] hw/mem/cxl_type3: Fix potential divide by zero reported by coverity Jonathan Cameron
2024-01-26 12:01 ` [PATCH v2 10/12] tests/acpi: Allow update of DSDT.cxl Jonathan Cameron
2024-01-26 12:01 ` [PATCH v2 11/12] hw/i386: Fix _STA return value for ACPI0017 Jonathan Cameron
2024-01-26 12:01 ` [PATCH v2 12/12] tests/acpi: Update DSDT.cxl to reflect change _STA return value Jonathan Cameron
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=20240126120132.24248-7-Jonathan.Cameron@huawei.com \
--to=jonathan.cameron@huawei.com \
--cc=42.hyeyoo@gmail.com \
--cc=dave.jiang@intel.com \
--cc=dave@stgolabs.net \
--cc=fan.ni@samsung.com \
--cc=ira.weiny@intel.com \
--cc=linux-cxl@vger.kernel.org \
--cc=linuxarm@huawei.com \
--cc=lizhijian@fujitsu.com \
--cc=mst@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=philmd@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@gmail.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox