mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
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

  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®