From: Srirangan Madhavan <smadhavan@nvidia.com>
To: Alison Schofield <alison.schofield@intel.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>,
Dave Jiang <dave.jiang@intel.com>,
Davidlohr Bueso <dave@stgolabs.net>,
Ira Weiny <ira.weiny@intel.com>,
Jonathan Cameron <jic23@kernel.org>,
Vishal Verma <vishal.l.verma@intel.com>,
linux-cxl@vger.kernel.org, linux-pci@vger.kernel.org,
linux-kernel@vger.kernel.org,
Alex Williamson <alex.williamson@redhat.com>,
vsethi@nvidia.com, alwilliamson@nvidia.com,
Sai Yashwanth Reddy Kancherla <skancherla@nvidia.com>,
Vishal Aslot <vaslot@nvidia.com>,
Manish Honap <mhonap@nvidia.com>, Jiandi An <jan@nvidia.com>,
Richard Cheng <icheng@nvidia.com>,
linux-tegra@vger.kernel.org
Subject: Re: [PATCH v15 09/16] PCI/CXL: Cache endpoint HDM state during PCI enumeration
Date: Thu, 29 Oct 2026 18:11:57 -0700 [thread overview]
Message-ID: <8263da30-f226-443a-a00c-9aefcee2b3ec@nvidia.com> (raw)
In-Reply-To: <auK7MxeCI2fsUNZC@aschofie-mobl2.lan>
On 10/28/26 8:19 PM, Alison Schofield wrote:
> External email: Use caution opening links or attachments
>
>
> On Sun, Oct 11, 2026 at 02:14:15AM +0000, Srirangan Madhavan wrote:
>> Cache HDM state in pci_dev->hdm after BAR resource setup and before driver
>> binding, so reset can restore it without a bound CXL driver.
>>
>> Save the HDM register location, decoder settings, and Device DVSEC state.
>> Validate capability reads and decoder counts, and restore PCI_COMMAND
>> after temporary MMIO access, reporting restoration failures.
>>
>> Keep PCI discovery separate from shared HDM helpers. Move cxl_rwsem into
>> built-in state code and protect cache publication with its DPA lock, so
>> the cache remains usable when cxl_core is modular.
>
> Hi Srirangan,
>
> I felt the large-ness of this patch, so I'm coming back to the top
> here to add this comment after doing the inline review below.
>
> The commit message doesn't mention much of the preparation work that's
> included. Could that prep be presented first in prep patches, and then
> add the new code? Something like:
>
> cxl: Build register block helpers into the kernel
> - regs.o moves from cxl_core into the built-in objects
> - devm_cxl_iomap_block(), cxl_rcrb_to_aer(), __rcrb_to_component()
> and cxl_rcd_component_reg_phys() gain exports
> - cxl_find_regblock() and cxl_setup_regs() move to include/cxl/pci.h
> - struct cxl_register_map gains bar and bar_offset
>
> cxl: Move cxl_rwsem into built-in code
> - a new hdm_state.c holds cxl_rwsem and its export, and hdm.c drops it
>
Thank you for the break down. In v16 I moved the preparation into
separate patches before the PCI HDM cache patch:
Patch 8: cxl: Move cxl_rwsem into built-in code
Patch 10: cxl: Build register block helpers into the kernel
>> @@ -8,7 +8,6 @@ CFLAGS_trace.o = -DTRACE_INCLUDE_PATH=. -I$(src)
>>
>> cxl_core-y := port.o
>> cxl_core-y += pmem.o
>> -cxl_core-y += regs.o
>
> Does all of reg.c need to be built in? I'm implying that that you'd
> only build in the part that PCI core needs and leave the rest in
> cxl_core. Maybe moving more code around is not worth it. Just noticing.
>
>
> snip
>
I understand that adding in reg.c includes the unused parts of it.
But I looked at splitting out only the helpers needed by PCI, and that
would move roughly 300-400 lines into a separate file. I kept the whole
file built in for now to avoid that code movement.
Please let me know if you feel that this needs to be moved after v16,
I'll add a patch for that.
>
>> +static int cxl_hdm_read_decoder_settings(struct device *dev,
>> + struct cxl_endpoint_decoder_settings *settings,
>> + void __iomem *hdm, int id)
>> +{
>> + u64 base, size;
>> + u32 ctrl;
>> + int rc;
>> +
>> + ctrl = readl(hdm + CXL_HDM_DECODER0_CTRL_OFFSET(id));
>> + base = ((u64)readl(hdm + CXL_HDM_DECODER0_BASE_HIGH_OFFSET(id)) << 32) |
>> + readl(hdm + CXL_HDM_DECODER0_BASE_LOW_OFFSET(id));
>> + size = ((u64)readl(hdm + CXL_HDM_DECODER0_SIZE_HIGH_OFFSET(id)) << 32) |
>> + readl(hdm + CXL_HDM_DECODER0_SIZE_LOW_OFFSET(id));
>> + rc = cxl_hdm_unpack_decoder(&settings->config, id, ctrl, base, size);
>
>
> This duplicates work of init_hdm_decoder().
> Could the new shared helper _unpack_decoder() grow to do the register
> reads also, so the code is shared. Also, then you could do the reads
> in low then high order, like init_hdm_decoder() does and like the
> rest of the CXL code reads its Low/High register pairs.
>
> snip
>
Done in v16
>> +}
>
> Add a blank line before the final return please. (subsystem style)
>
> snip
>
Added in v16.
>>
>> +static void cxl_hdm_cache_dvsec_ctrl(struct pci_dev *pdev, u16 ctrl)
>> +{
>> + guard(rwsem_write)(&cxl_rwsem.dpa);
>> + if (!pdev->hdm)
>> + return;
>> +
>> + pdev->hdm->dvsec_ctrl = ctrl;
>> + pdev->hdm->dvsec_ctrl_valid = true;
>
>
>
> Could hdm_state.c add accessors for this, like the existing
> cxl_hdm_cache_present() and cxl_hdm_cache_publish()? That way cxl_core
> doesn't write pdev->hdm directly and the dpa locking stays in one place.
> The same could be done for cxl_hdm_get_cached_info() and
> cxl_hdm_check_decoder_count() added in Patch 8/16.
>
>
Done in v16:
Patch 9, cxl: Refresh cached PCI HDM decoder settings, moves the decoder
refresh and decoder-count checks into hdm_state.c.
Patch 11, PCI/CXL: Cache endpoint HDM state during PCI enumeration,
moves the DVSEC control update there as well.
These functions take cxl_rwsem.dpa, so the callers no longer access
pdev->hdm directly.
>
> Can this function end in a single return, with the 0 or 1 result
> in a variable, so that the cache is updated in one place?
>
> snip
>
Fixed in v16.
>> @@ -200,6 +200,7 @@ void __iomem *devm_cxl_iomap_block(struct device *dev, resource_size_t addr,
>>
>> return ret_val;
>> }
>> +EXPORT_SYMBOL_NS_GPL(devm_cxl_iomap_block, "CXL");
>
>
> Why not EXPORT_SYMBOL_FOR_MODULES(..., "cxl_core") here, like the hdm_regs.c
> helpers?
>
> snip
>
I changed this to use EXPORT_SYMBOL_FOR_MODULES in v16 patch 10.
>> +static struct cxl_hdm_info *__cxl_pci_hdm_read_info(struct pci_dev *pdev,
>> + struct cxl_register_map *map,
>> + int dvsec)
>> +{
>> + struct cxl_reg_map *hdm_map = &map->component_map.hdm_decoder;
>> + resource_size_t hdm_offset;
>> + void __iomem *hdm;
>> + int decoder_count;
>> + u16 dvsec_ctrl;
>> + int rc;
>> +
>> + hdm = cxl_pci_hdm_map_regs(pdev, map, &hdm_offset, &decoder_count);
>> + if (IS_ERR(hdm))
>> + return ERR_CAST(hdm);
>> +
>> + rc = pci_read_config_word(pdev, dvsec + PCI_DVSEC_CXL_CTRL,
>> + &dvsec_ctrl);
>> + if (rc) {
>> + rc = pcibios_err_to_errno(rc);
>> + goto out_unmap;
>> + }
>> +
>> + struct cxl_hdm_info *info =
>> + kzalloc_flex(*info, settings, decoder_count, GFP_KERNEL);
>
> Move declaration to top of func.
> checkpatch should be complaining about mixing statement & declarations.
>
>
Done in v16. But I rechecked and for some reason checkpatch is not
flagging this.
>> + if (!info) {
>> + rc = -ENOMEM;
>> + goto out_unmap;
>
>
> This returns the __cxl_pci_hdm_read_info() result from two places, and then
> has three more returns after a failed PCI_COMMAND restore. Try to end in a
> single return. Li Ming's suggestion to warn and keep the info on a failed
> restore would also reduce the tail to one return info
>
>
Ack. Fixed this in v16.
>> + return rc;
>> + if (!(cap & PCI_DVSEC_CXL_MEM_CAPABLE) ||
>> + !cxl_dvsec_hdm_count_valid(FIELD_GET(PCI_DVSEC_CXL_HDM_COUNT, cap)))
>> + return 0;
>> +
>
> This cache is built for every function w CXL.mem, not just type2.
> So I believe we are needlessly reading Type decoders at PCI enumeration.
>
> Can this check the capability bits like cxl_reset_function() does
> and limit this work to type2 devices that can use it?
>
> snip to end...
>
> -- Alison
Done in v16 patch 11. Cache initialization now checks for CXL.cache,
CXL.mem, CXL Reset, and Reset Memory Clear capability before reading the
HDM decoder state.
--
Regards,
Srirangan
next prev parent reply other threads:[~2026-10-30 1:12 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-11 2:14 [PATCH v15 00/16] PCI/CXL: Add CXL reset support for Type 2 devices Srirangan Madhavan
2026-10-11 2:14 ` [PATCH v15 01/16] cxl: Drop stale decoder interleave limit comment Srirangan Madhavan
2026-10-27 4:13 ` Alison Schofield
2026-10-11 2:14 ` [PATCH v15 02/16] cxl: Share CXL port upstream PCI device lookup Srirangan Madhavan
2026-10-11 2:14 ` [PATCH v15 03/16] cxl: Move decoder declarations to shared header Srirangan Madhavan
2026-10-11 2:14 ` [PATCH v15 04/16] cxl: Embed decoder configuration in a standalone structure Srirangan Madhavan
2026-10-11 2:14 ` [PATCH v15 05/16] cxl: Introduce endpoint HDM decoder settings Srirangan Madhavan
2026-10-26 22:20 ` Dave Jiang
2026-10-27 6:23 ` Li Ming
2026-10-11 2:14 ` [PATCH v15 06/16] cxl: Move HDM decoder helpers to built-in code Srirangan Madhavan
2026-10-26 22:32 ` Dave Jiang
2026-10-27 6:24 ` Li Ming
2026-10-11 2:14 ` [PATCH v15 07/16] cxl: Share HDM decoder register unpacking Srirangan Madhavan
2026-10-26 22:41 ` Dave Jiang
2026-10-27 6:31 ` Li Ming
2026-10-11 2:14 ` [PATCH v15 08/16] cxl: Refresh cached PCI HDM decoder settings Srirangan Madhavan
2026-10-26 22:56 ` Dave Jiang
2026-10-27 6:50 ` Li Ming
2026-10-11 2:14 ` [PATCH v15 09/16] PCI/CXL: Cache endpoint HDM state during PCI enumeration Srirangan Madhavan
2026-10-27 8:07 ` Li Ming
2026-10-29 3:19 ` Alison Schofield
2026-10-30 1:11 ` Srirangan Madhavan [this message]
2026-10-29 7:02 ` Li Ming
2026-10-11 2:14 ` [PATCH v15 10/16] PCI/CXL: Add CXL Device Reset sequencing Srirangan Madhavan
2026-10-28 3:01 ` Li Ming
2026-10-30 1:23 ` Srirangan Madhavan
2026-10-30 1:33 ` Srirangan Madhavan
2026-10-11 2:14 ` [PATCH v15 11/16] cxl: Validate and synchronize HDM ranges around reset Srirangan Madhavan
2026-10-27 3:25 ` Alison Schofield
2026-10-29 23:47 ` Srirangan Madhavan
2026-10-27 4:32 ` Alison Schofield
2026-10-30 1:43 ` Srirangan Madhavan
2026-10-11 2:14 ` [PATCH v15 12/16] PCI/CXL: Reject reset with unsafe function scope Srirangan Madhavan
2026-10-11 2:14 ` [PATCH v15 13/16] PCI/CXL: Restore CXL state after PCI reset Srirangan Madhavan
2026-10-27 3:56 ` Alison Schofield
2026-10-30 0:46 ` Srirangan Madhavan
2026-10-11 2:14 ` [PATCH v15 14/16] PCI/CXL: Expose CXL Reset as a PCI reset method Srirangan Madhavan
2026-10-11 2:14 ` [PATCH v15 15/16] PCI/CXL: Restore CXL state after CXL bus reset Srirangan Madhavan
2026-10-11 2:14 ` [PATCH v15 16/16] tools/testing/cxl: Add HDM decoder range checks Srirangan Madhavan
2026-10-27 2:41 ` Alison Schofield
2026-10-30 0:48 ` Srirangan Madhavan
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=8263da30-f226-443a-a00c-9aefcee2b3ec@nvidia.com \
--to=smadhavan@nvidia.com \
--cc=alex.williamson@redhat.com \
--cc=alison.schofield@intel.com \
--cc=alwilliamson@nvidia.com \
--cc=bhelgaas@google.com \
--cc=dave.jiang@intel.com \
--cc=dave@stgolabs.net \
--cc=icheng@nvidia.com \
--cc=ira.weiny@intel.com \
--cc=jan@nvidia.com \
--cc=jic23@kernel.org \
--cc=linux-cxl@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=linux-tegra@vger.kernel.org \
--cc=mhonap@nvidia.com \
--cc=skancherla@nvidia.com \
--cc=vaslot@nvidia.com \
--cc=vishal.l.verma@intel.com \
--cc=vsethi@nvidia.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
all inboxes | Powered by JetHome®