On Tue, 25 Jan 2022 19:09:25 -0800 Dan Williams <dan.j.williams@xxxxxxxxx> wrote: > Unlike the decoder enumeration for "root decoders" described by platform > firmware, standard coders can be enumerated from the component registers > space once the base address has been identified (via PCI, ACPI, or > another mechanism). > > Add common infrastructure for HDM (Host-managed-Device-Memory) Decoder > enumeration and share it between host-bridge, upstream switch port, and > cxl_test defined decoders. > > The locking model for switch level decoders is to hold the port lock > over the enumeration. This facilitates moving the dport and decoder > enumeration to a 'port' driver. For now, the only enumerator of decoder > resources is the cxl_acpi root driver. > > [ben: fixup kdoc] > Signed-off-by: Dan Williams <dan.j.williams@xxxxxxxxx> One trivial thing noticed. > --- > Changes since v3: > - Fixup kdoc for devm_cxl_enumerate_decoders() (Ben) > - Cleanup a sparse warning around __iomem usage (Ben) ... > +/** > + * devm_cxl_setup_hdm - map HDM decoder component registers > + * @port: cxl_port to map I think you drop it again later in the series, but it would be nice to avoid kernel doc warnings whilst the host parameter is here. > + */ > +struct cxl_hdm *devm_cxl_setup_hdm(struct device *host, struct cxl_port *port) > +{ > + struct device *dev = &port->dev; > + void __iomem *crb, *hdm; > + struct cxl_hdm *cxlhdm; > + > + cxlhdm = devm_kzalloc(host, sizeof(*cxlhdm), GFP_KERNEL); > + if (!cxlhdm) > + return ERR_PTR(-ENOMEM); > + > + cxlhdm->port = port; > + crb = devm_cxl_iomap_block(host, port->component_reg_phys, > + CXL_COMPONENT_REG_BLOCK_SIZE); > + if (!crb) { > + dev_err(dev, "No component registers mapped\n"); > + return ERR_PTR(-ENXIO); > + } > + > + hdm = map_hdm_decoder_regs(port, crb); > + if (IS_ERR(hdm)) > + return ERR_CAST(hdm); > + cxlhdm->regs.hdm_decoder = hdm; > + > + parse_hdm_decoder_caps(cxlhdm); > + if (cxlhdm->decoder_count == 0) { > + dev_err(dev, "Spec violation. Caps invalid\n"); > + return ERR_PTR(-ENXIO); > + } > + > + return cxlhdm; > +} > +EXPORT_SYMBOL_NS_GPL(devm_cxl_setup_hdm, CXL); >