On 26/06/25 12:19PM, Alison Schofield wrote: >On Tue, Jun 17, 2025 at 06:09:39PM +0530, Neeraj Kumar wrote: >> Add cxl_find_root_decoder to find root decoder on cxl bus. It is used to >> find root decoder during region creation > >Does the existing to_cxl_root_decoder() provide what you need here? > Hi Alison, Actually, my need is to find decoder0.0 from port1, with which endpoint device is connected. Here i am already using to_cxl_root_decoder() inside cxl_find_root_decoder(). In cxl_find_root_decoder(), First i am finding dev which is required by to_cxl_root_decoder() struct cxl_root_decoder *cxl_find_root_decoder(struct cxl_port *port) { struct cxl_root *cxl_root __free(put_cxl_root) = find_cxl_root(port); struct device *dev = device_find_child(&cxl_root->port.dev, NULL, match_root_decoder); return to_cxl_root_decoder(dev); } Thanks, Neeraj >> >> Signed-off-by: Neeraj Kumar >> --- >> drivers/cxl/core/port.c | 26 ++++++++++++++++++++++++++ >> drivers/cxl/cxl.h | 1 + >> 2 files changed, 27 insertions(+) >> >> diff --git a/drivers/cxl/core/port.c b/drivers/cxl/core/port.c >> index 2452f7c15b2d..94d9322b8e38 100644 >> --- a/drivers/cxl/core/port.c >> +++ b/drivers/cxl/core/port.c >> @@ -513,6 +513,32 @@ struct cxl_switch_decoder *to_cxl_switch_decoder(struct device *dev) >> } >> EXPORT_SYMBOL_NS_GPL(to_cxl_switch_decoder, "CXL"); >> >> +static int match_root_decoder(struct device *dev, void *data) >> +{ >> + return is_root_decoder(dev); >> +} >> + >> +/** >> + * cxl_find_root_decoder() - find a cxl root decoder on cxl bus >> + * @port: any descendant port in root-cxl-port topology >> + */ >> +struct cxl_root_decoder *cxl_find_root_decoder(struct cxl_port *port) >> +{ >> + struct cxl_root *cxl_root __free(put_cxl_root) = find_cxl_root(port); >> + struct device *dev; >> + >> + if (!cxl_root) >> + return NULL; >> + >> + dev = device_find_child(&cxl_root->port.dev, NULL, match_root_decoder); >> + >> + if (!dev) >> + return NULL; >> + >> + return to_cxl_root_decoder(dev); >> +} >> +EXPORT_SYMBOL_NS_GPL(cxl_find_root_decoder, "CXL"); >> + >> static void cxl_ep_release(struct cxl_ep *ep) >> { >> put_device(ep->ep); >> diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h >> index 30c80e04cb27..2c6a782d0941 100644 >> --- a/drivers/cxl/cxl.h >> +++ b/drivers/cxl/cxl.h >> @@ -871,6 +871,7 @@ bool is_cxl_nvdimm_bridge(struct device *dev); >> int devm_cxl_add_nvdimm(struct cxl_port *parent_port, struct cxl_memdev *cxlmd); >> struct cxl_nvdimm_bridge *cxl_find_nvdimm_bridge(struct cxl_port *port); >> void cxl_region_discovery(struct cxl_port *port); >> +struct cxl_root_decoder *cxl_find_root_decoder(struct cxl_port *port); >> >> #ifdef CONFIG_CXL_REGION >> bool is_cxl_pmem_region(struct device *dev); >> -- >> 2.34.1 >> >>