From: Jonathan Cameron <Jonathan.Cameron@Huawei.com>
To: Dan Williams <dan.j.williams@intel.com>
Cc: <linux-cxl@vger.kernel.org>, <stable@vger.kernel.org>
Subject: Re: [PATCH 2/5] cxl/hdm: Use 4-byte reads to retrieve HDM decoder base+limit
Date: Mon, 15 May 2023 11:46:07 +0100 [thread overview]
Message-ID: <20230515114607.00004647@Huawei.com> (raw)
In-Reply-To: <168149844056.792294.8224490474529733736.stgit@dwillia2-xfh.jf.intel.com>
On Fri, 14 Apr 2023 11:54:00 -0700
Dan Williams <dan.j.williams@intel.com> wrote:
> The CXL specification mandates that 4-byte registers must be accessed
> with 4-byte access cycles. CXL 3.0 8.2.3 "Component Register Layout and
> Definition" states that the behavior is undefined if (2) 32-bit
> registers are accessed as an 8-byte quantity. It turns out that at least
> one hardware implementation is sensitive to this in practice. The @size
> variable results in zero with:
>
> size = readq(hdm + CXL_HDM_DECODER0_SIZE_LOW_OFFSET(which));
>
> ...and the correct size with:
>
> lo = readl(hdm + CXL_HDM_DECODER0_SIZE_LOW_OFFSET(which));
> hi = readl(hdm + CXL_HDM_DECODER0_SIZE_HIGH_OFFSET(which));
> size = (hi << 32) + lo;
Hmm. Annoying that there isn't an always present split version of the
ioread64_hi_lo like there effectively is for hi_low_readq()
Mind you, why was this using the ioread64_hi_lo() variant rather
than hi_lo_readq()? Far as I can tell that wouldn't have suffered
from this problem in the first place.
There is at least one other direct user of that function, so maybe
we should just use it here as well?
Jonathan
>
> Fixes: d17d0540a0db ("cxl/core/hdm: Add CXL standard decoder enumeration to the core")
> Cc: <stable@vger.kernel.org>
> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
> ---
> drivers/cxl/core/hdm.c | 20 +++++++++++++-------
> 1 file changed, 13 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/cxl/core/hdm.c b/drivers/cxl/core/hdm.c
> index 35b338b716fe..6fdf7981ddc7 100644
> --- a/drivers/cxl/core/hdm.c
> +++ b/drivers/cxl/core/hdm.c
> @@ -1,6 +1,5 @@
> // SPDX-License-Identifier: GPL-2.0-only
> /* Copyright(c) 2022 Intel Corporation. All rights reserved. */
> -#include <linux/io-64-nonatomic-hi-lo.h>
> #include <linux/seq_file.h>
> #include <linux/device.h>
> #include <linux/delay.h>
> @@ -785,8 +784,8 @@ static int init_hdm_decoder(struct cxl_port *port, struct cxl_decoder *cxld,
> int *target_map, void __iomem *hdm, int which,
> u64 *dpa_base, struct cxl_endpoint_dvsec_info *info)
> {
> + u64 size, base, skip, dpa_size, lo, hi;
> struct cxl_endpoint_decoder *cxled;
> - u64 size, base, skip, dpa_size;
> bool committed;
> u32 remainder;
> int i, rc;
> @@ -801,8 +800,12 @@ static int init_hdm_decoder(struct cxl_port *port, struct cxl_decoder *cxld,
> which, info);
>
> ctrl = readl(hdm + CXL_HDM_DECODER0_CTRL_OFFSET(which));
> - base = ioread64_hi_lo(hdm + CXL_HDM_DECODER0_BASE_LOW_OFFSET(which));
> - size = ioread64_hi_lo(hdm + CXL_HDM_DECODER0_SIZE_LOW_OFFSET(which));
> + lo = readl(hdm + CXL_HDM_DECODER0_BASE_LOW_OFFSET(which));
> + hi = readl(hdm + CXL_HDM_DECODER0_BASE_HIGH_OFFSET(which));
> + base = (hi << 32) + lo;
> + lo = readl(hdm + CXL_HDM_DECODER0_SIZE_LOW_OFFSET(which));
> + hi = readl(hdm + CXL_HDM_DECODER0_SIZE_HIGH_OFFSET(which));
> + size = (hi << 32) + lo;
> committed = !!(ctrl & CXL_HDM_DECODER0_CTRL_COMMITTED);
> cxld->commit = cxl_decoder_commit;
> cxld->reset = cxl_decoder_reset;
> @@ -865,8 +868,9 @@ static int init_hdm_decoder(struct cxl_port *port, struct cxl_decoder *cxld,
> return rc;
>
> if (!info) {
> - target_list.value =
> - ioread64_hi_lo(hdm + CXL_HDM_DECODER0_TL_LOW(which));
> + lo = readl(hdm + CXL_HDM_DECODER0_TL_LOW(which));
> + hi = readl(hdm + CXL_HDM_DECODER0_TL_HIGH(which));
> + target_list.value = (hi << 32) + lo;
> for (i = 0; i < cxld->interleave_ways; i++)
> target_map[i] = target_list.target_id[i];
>
> @@ -883,7 +887,9 @@ static int init_hdm_decoder(struct cxl_port *port, struct cxl_decoder *cxld,
> port->id, cxld->id, size, cxld->interleave_ways);
> return -ENXIO;
> }
> - skip = ioread64_hi_lo(hdm + CXL_HDM_DECODER0_SKIP_LOW(which));
> + lo = readl(hdm + CXL_HDM_DECODER0_SKIP_LOW(which));
> + hi = readl(hdm + CXL_HDM_DECODER0_SKIP_HIGH(which));
> + skip = (hi << 32) + lo;
> cxled = to_cxl_endpoint_decoder(&cxld->dev);
> rc = devm_cxl_dpa_reserve(cxled, *dpa_base + skip, dpa_size, skip);
> if (rc) {
>
next prev parent reply other threads:[~2023-05-15 10:46 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-04-14 18:53 [PATCH 0/5] cxl/hdm: Decoder enumeration fixes Dan Williams
2023-04-14 18:53 ` [PATCH 1/5] cxl/hdm: Fail upon detecting 0-sized decoders Dan Williams
2023-04-14 20:11 ` Alison Schofield
2023-04-14 21:19 ` Dave Jiang
2023-05-15 10:38 ` Jonathan Cameron
2023-04-14 18:54 ` [PATCH 2/5] cxl/hdm: Use 4-byte reads to retrieve HDM decoder base+limit Dan Williams
2023-04-14 20:32 ` Alison Schofield
2023-04-14 20:44 ` Dan Williams
2023-04-14 21:22 ` Dave Jiang
2023-05-15 10:46 ` Jonathan Cameron [this message]
2023-04-14 18:54 ` [PATCH 3/5] cxl/core: Drop unused io-64-nonatomic-lo-hi.h Dan Williams
2023-04-14 20:33 ` Alison Schofield
2023-04-14 21:22 ` Dave Jiang
2023-05-15 10:48 ` Jonathan Cameron
2023-04-14 18:54 ` [PATCH 4/5] cxl/port: Scan single-target ports for decoders Dan Williams
2023-04-14 20:55 ` Alison Schofield
2023-04-14 21:24 ` Dave Jiang
2023-04-17 16:48 ` Jonathan Cameron
2023-04-14 18:54 ` [PATCH 5/5] cxl/hdm: Add more HDM decoder debug messages at startup Dan Williams
2023-04-14 21:06 ` Alison Schofield
2023-04-14 21:25 ` Dave Jiang
2023-05-15 10:52 ` 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=20230515114607.00004647@Huawei.com \
--to=jonathan.cameron@huawei.com \
--cc=dan.j.williams@intel.com \
--cc=linux-cxl@vger.kernel.org \
--cc=stable@vger.kernel.org \
/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