From: Jonathan Cameron <Jonathan.Cameron@Huawei.com>
To: "Kobayashi,Daisuke" <kobayashi.da-06@fujitsu.com>
Cc: <kobayashi.da-06@jp.fujitsu.com>, <linux-cxl@vger.kernel.org>,
<y-goto@fujitsu.com>, <linux-pci@vger.kernel.org>, <mj@ucw.cz>,
<dan.j.williams@intel.com>
Subject: Re: [PATCH v7 1/2] cxl/core/regs: Add rcd_regs initialization at __rcrb_to_component()
Date: Tue, 4 Jun 2024 17:25:35 +0100 [thread overview]
Message-ID: <20240604172535.00000230@Huawei.com> (raw)
In-Reply-To: <20240510073710.98953-2-kobayashi.da-06@fujitsu.com>
On Fri, 10 May 2024 16:37:09 +0900
"Kobayashi,Daisuke" <kobayashi.da-06@fujitsu.com> wrote:
> Add rcd_regs and its initialization at __rcrb_to_component() to cache
This rcd_regs doesn't immediately align with what is in the code. I'd just
call it out as
Add caching of Link Status, Link Control and Link Capability registers for
a Restricted CXL Device to struct cxl_rcrb_info.
> the cxl1.1 device link status information. Reduce access to the memory
> map area where the RCRB is located by caching the cxl1.1 device
> link status information.
Why do we care about accessing that memory mapped area?
Avoiding the walk to find the offset might be an alternative as then
we could directly read these registers when needed.
So handle these similarly to aer_cap.
That will allow for them changing at runtime without carefully needing
to update the cached values.
>
> Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
New day, new comments :(
> Signed-off-by: "Kobayashi,Daisuke" <kobayashi.da-06@fujitsu.com>
> ---
> drivers/cxl/core/core.h | 4 ++++
> drivers/cxl/core/regs.c | 16 ++++++++++++++++
> drivers/cxl/cxl.h | 3 +++
> 3 files changed, 23 insertions(+)
>
> diff --git a/drivers/cxl/core/core.h b/drivers/cxl/core/core.h
> index 3b64fb1b9ed0..42e3483b4a14 100644
> --- a/drivers/cxl/core/core.h
> +++ b/drivers/cxl/core/core.h
> @@ -75,6 +75,10 @@ resource_size_t __rcrb_to_component(struct device *dev,
> enum cxl_rcrb which);
> u16 cxl_rcrb_to_aer(struct device *dev, resource_size_t rcrb);
>
> +#define PCI_RCRB_CAP_LIST_ID_MASK GENMASK(7, 0)
> +#define PCI_RCRB_CAP_HDR_ID_MASK GENMASK(7, 0)
> +#define PCI_RCRB_CAP_HDR_NEXT_MASK GENMASK(15, 8)
> +
> extern struct rw_semaphore cxl_dpa_rwsem;
> extern struct rw_semaphore cxl_region_rwsem;
>
> diff --git a/drivers/cxl/core/regs.c b/drivers/cxl/core/regs.c
> index 372786f80955..1ad58c464488 100644
> --- a/drivers/cxl/core/regs.c
> +++ b/drivers/cxl/core/regs.c
> @@ -514,6 +514,8 @@ resource_size_t __rcrb_to_component(struct device *dev, struct cxl_rcrb_info *ri
> u32 bar0, bar1;
> u16 cmd;
> u32 id;
> + u16 offset;
> + u32 cap_hdr;
>
> if (which == CXL_RCRB_UPSTREAM)
> rcrb += SZ_4K;
> @@ -537,6 +539,20 @@ resource_size_t __rcrb_to_component(struct device *dev, struct cxl_rcrb_info *ri
> cmd = readw(addr + PCI_COMMAND);
> bar0 = readl(addr + PCI_BASE_ADDRESS_0);
> bar1 = readl(addr + PCI_BASE_ADDRESS_1);
> + offset = FIELD_GET(PCI_RCRB_CAP_LIST_ID_MASK, readw(addr + PCI_CAPABILITY_LIST));
> + cap_hdr = readl(addr + offset);
> + while ((FIELD_GET(PCI_RCRB_CAP_HDR_ID_MASK, cap_hdr)) != PCI_CAP_ID_EXP) {
> + offset = FIELD_GET(PCI_RCRB_CAP_HDR_NEXT_MASK, cap_hdr);
> + if (offset == 0 || offset > SZ_4K)
> + break;
> + cap_hdr = readl(addr + offset);
> + }
> + if (offset) {
> + ri->rcd_lnkcap = readl(addr + offset + PCI_EXP_LNKCAP);
> + ri->rcd_lnkctrl = readl(addr + offset + PCI_EXP_LNKCTL);
> + ri->rcd_lnkstatus = readl(addr + offset + PCI_EXP_LNKSTA);
> + }
> +
> iounmap(addr);
> release_mem_region(rcrb, SZ_4K);
>
> diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h
> index 003feebab79b..808818ccc255 100644
> --- a/drivers/cxl/cxl.h
> +++ b/drivers/cxl/cxl.h
> @@ -646,6 +646,9 @@ cxl_find_dport_by_dev(struct cxl_port *port, const struct device *dport_dev)
>
> struct cxl_rcrb_info {
> resource_size_t base;
> + u16 rcd_lnkstatus;
> + u16 rcd_lnkctrl;
> + u32 rcd_lnkcap;
> u16 aer_cap;
> };
>
next prev parent reply other threads:[~2024-06-04 16:25 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-05-10 7:37 [PATCH v7 0/2] cxl: Export cxl1.1 device link status to sysfs Kobayashi,Daisuke
2024-05-10 7:37 ` [PATCH v7 1/2] cxl/core/regs: Add rcd_regs initialization at __rcrb_to_component() Kobayashi,Daisuke
2024-06-04 16:25 ` Jonathan Cameron [this message]
2024-05-10 7:37 ` [PATCH v7 2/2] cxl/pci: Add sysfs attribute for CXL 1.1 device link status Kobayashi,Daisuke
2024-06-04 16:32 ` Jonathan Cameron
2024-06-05 7:21 ` Daisuke Kobayashi (Fujitsu)
2024-06-05 17:38 ` Jonathan Cameron
2024-05-27 4:57 ` [PATCH v7 0/2] cxl: Export cxl1.1 device link status to sysfs Daisuke Kobayashi (Fujitsu)
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=20240604172535.00000230@Huawei.com \
--to=jonathan.cameron@huawei.com \
--cc=dan.j.williams@intel.com \
--cc=kobayashi.da-06@fujitsu.com \
--cc=kobayashi.da-06@jp.fujitsu.com \
--cc=linux-cxl@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=mj@ucw.cz \
--cc=y-goto@fujitsu.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