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>, <mj@ucw.cz>, <dan.j.williams@intel.com>
Subject: Re: [PATCH v9 1/2] cxl/core/regs: Add rcd_pcie_cap initialization at __rcrb_to_component()
Date: Mon, 10 Jun 2024 11:43:22 +0100 [thread overview]
Message-ID: <20240610114322.000031b8@Huawei.com> (raw)
In-Reply-To: <20240610082222.22772-2-kobayashi.da-06@fujitsu.com>
On Mon, 10 Jun 2024 17:22:21 +0900
"Kobayashi,Daisuke" <kobayashi.da-06@fujitsu.com> wrote:
> Add rcd_pcie_cap and its initialization at __rcrb_to_component() to cache
> the offset of cxl1.1 device link status information. By caching it, avoid
> the walking memory map area to find the offset when output the register value.
>
> Signed-off-by: "Kobayashi,Daisuke" <kobayashi.da-06@fujitsu.com>
Hi.
This is getting closer, but a few minor comments inline on the implementation.
Thanks,
Jonathan
> ---
> drivers/cxl/core/core.h | 4 ++++
> drivers/cxl/core/regs.c | 26 +++++++++++++++++++++++++-
> drivers/cxl/cxl.h | 9 +++++++++
> 3 files changed, 38 insertions(+), 1 deletion(-)
>
> 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..cc1ce5e032e2 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,17 @@ 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)
If offset > SZ_4K?
I'd make it 0 at the check inside the loop.
> + ri->rcd_pcie_cap = offset;
> +
> iounmap(addr);
> release_mem_region(rcrb, SZ_4K);
>
> @@ -572,8 +585,19 @@ resource_size_t __rcrb_to_component(struct device *dev, struct cxl_rcrb_info *ri
> resource_size_t cxl_rcd_component_reg_phys(struct device *dev,
> struct cxl_dport *dport)
> {
> + void __iomem *dport_pcie_cap = NULL;
> + resource_size_t rcd_pcie_offset, ret;
blank line here.
I'd also reduce the scope of rcd_pcie_offset.
> if (!dport->rch)
> return CXL_RESOURCE_NONE;
> - return __rcrb_to_component(dev, &dport->rcrb, CXL_RCRB_UPSTREAM);
> +
> + ret = __rcrb_to_component(dev, &dport->rcrb, CXL_RCRB_UPSTREAM);
> + if (dport->rcrb.rcd_pcie_cap) {
> + rcd_pcie_offset = dport->rcrb.base + dport->rcrb.rcd_pcie_cap;
> + dport_pcie_cap = devm_cxl_iomap_block(dev, rcd_pcie_offset,
> + sizeof(u8) * 0x42);
Something odd here with alignment. I guess tab width 4 rather than 8 in your editor?
Also, add a define for the 0x42 I think.
Directly assign into dport->regs.rcd_pcie_cap having made change suggested below.
> + }
> + dport->regs.rcd_pcie_cap = dport_pcie_cap;
Why not move this in the brackets? I think you can rely on the regs
structuring being initialized to zero for the 'else' path.
> +
> + return ret;
> }
>
next prev parent reply other threads:[~2024-06-10 10:43 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-10 8:22 [PATCH v9 0/2] cxl: Export cxl1.1 device link status to sysfs Kobayashi,Daisuke
2024-06-10 8:22 ` [PATCH v9 1/2] cxl/core/regs: Add rcd_pcie_cap initialization at __rcrb_to_component() Kobayashi,Daisuke
2024-06-10 10:43 ` Jonathan Cameron [this message]
2024-06-10 8:22 ` [PATCH v9 2/2] cxl/pci: Add sysfs attribute for CXL 1.1 device link status Kobayashi,Daisuke
2024-06-10 10:46 ` 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=20240610114322.000031b8@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=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 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.