[PATCH v14 25/34] cxl/port: Map Port component registers before switchport init

Terry Bowman posted 34 patches 3 weeks, 4 days ago
There is a newer version of this series
[PATCH v14 25/34] cxl/port: Map Port component registers before switchport init
Posted by Terry Bowman 3 weeks, 4 days ago
Port HDM registers must be mapped before calling
devm_cxl_switch_port_decoders_setup(). Invoke a call to this function
in cxl_port_add_dport().

Signed-off-by: Terry Bowman <terry.bowman@amd.com>
---
 drivers/cxl/core/port.c | 3 ++-
 drivers/cxl/cxlpci.h    | 3 +++
 drivers/cxl/port.c      | 5 +++++
 3 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/drivers/cxl/core/port.c b/drivers/cxl/core/port.c
index 2c4e28e7975c..3f730511f11d 100644
--- a/drivers/cxl/core/port.c
+++ b/drivers/cxl/core/port.c
@@ -778,7 +778,7 @@ static int cxl_setup_comp_regs(struct device *host, struct cxl_register_map *map
 	return cxl_setup_regs(map);
 }
 
-static int cxl_port_setup_regs(struct cxl_port *port,
+int cxl_port_setup_regs(struct cxl_port *port,
 			resource_size_t component_reg_phys)
 {
 	if (dev_is_platform(port->uport_dev))
@@ -786,6 +786,7 @@ static int cxl_port_setup_regs(struct cxl_port *port,
 	return cxl_setup_comp_regs(&port->dev, &port->reg_map,
 				   component_reg_phys);
 }
+EXPORT_SYMBOL_NS_GPL(cxl_port_setup_regs, "CXL");
 
 static int cxl_dport_setup_regs(struct device *host, struct cxl_dport *dport,
 				resource_size_t component_reg_phys)
diff --git a/drivers/cxl/cxlpci.h b/drivers/cxl/cxlpci.h
index ef4496b4e55e..532506595d0f 100644
--- a/drivers/cxl/cxlpci.h
+++ b/drivers/cxl/cxlpci.h
@@ -99,4 +99,7 @@ static inline void devm_cxl_port_ras_setup(struct cxl_port *port)
 }
 #endif
 
+int cxl_port_setup_regs(struct cxl_port *port,
+			resource_size_t component_reg_phys);
+
 #endif /* __CXL_PCI_H__ */
diff --git a/drivers/cxl/port.c b/drivers/cxl/port.c
index d76b4b532064..f8a33dbf8222 100644
--- a/drivers/cxl/port.c
+++ b/drivers/cxl/port.c
@@ -278,6 +278,11 @@ static struct cxl_dport *cxl_port_add_dport(struct cxl_port *port,
 		return ERR_CAST(port_group);
 
 	if (port->nr_dports == 0) {
+
+		rc = cxl_port_setup_regs(port, port->component_reg_phys);
+		if (rc)
+			return ERR_PTR(rc);
+
 		rc = devm_cxl_switch_port_decoders_setup(port);
 		if (rc)
 			return ERR_PTR(rc);
-- 
2.34.1
Re: [PATCH v14 25/34] cxl/port: Map Port component registers before switchport init
Posted by Jonathan Cameron 3 weeks, 3 days ago
On Wed, 14 Jan 2026 12:20:46 -0600
Terry Bowman <terry.bowman@amd.com> wrote:

> Port HDM registers must be mapped before calling
> devm_cxl_switch_port_decoders_setup(). Invoke a call to this function
> in cxl_port_add_dport().
As I read that description, there is a bisection break before this
in that if you build up to patch 24, they won't be mapped before
it is called.

Maybe this needs squashing with an earlier patch, or if it is for
some reason safe, then add a comment here on why.

> 
> Signed-off-by: Terry Bowman <terry.bowman@amd.com>
> ---
>  drivers/cxl/core/port.c | 3 ++-
>  drivers/cxl/cxlpci.h    | 3 +++
>  drivers/cxl/port.c      | 5 +++++
>  3 files changed, 10 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/cxl/core/port.c b/drivers/cxl/core/port.c
> index 2c4e28e7975c..3f730511f11d 100644
> --- a/drivers/cxl/core/port.c
> +++ b/drivers/cxl/core/port.c
> @@ -778,7 +778,7 @@ static int cxl_setup_comp_regs(struct device *host, struct cxl_register_map *map
>  	return cxl_setup_regs(map);
>  }
>  
> -static int cxl_port_setup_regs(struct cxl_port *port,
> +int cxl_port_setup_regs(struct cxl_port *port,
>  			resource_size_t component_reg_phys)
>  {
>  	if (dev_is_platform(port->uport_dev))
> @@ -786,6 +786,7 @@ static int cxl_port_setup_regs(struct cxl_port *port,
>  	return cxl_setup_comp_regs(&port->dev, &port->reg_map,
>  				   component_reg_phys);
>  }
> +EXPORT_SYMBOL_NS_GPL(cxl_port_setup_regs, "CXL");
>  
>  static int cxl_dport_setup_regs(struct device *host, struct cxl_dport *dport,
>  				resource_size_t component_reg_phys)
> diff --git a/drivers/cxl/cxlpci.h b/drivers/cxl/cxlpci.h
> index ef4496b4e55e..532506595d0f 100644
> --- a/drivers/cxl/cxlpci.h
> +++ b/drivers/cxl/cxlpci.h
> @@ -99,4 +99,7 @@ static inline void devm_cxl_port_ras_setup(struct cxl_port *port)
>  }
>  #endif
>  
> +int cxl_port_setup_regs(struct cxl_port *port,
> +			resource_size_t component_reg_phys);
> +
>  #endif /* __CXL_PCI_H__ */
> diff --git a/drivers/cxl/port.c b/drivers/cxl/port.c
> index d76b4b532064..f8a33dbf8222 100644
> --- a/drivers/cxl/port.c
> +++ b/drivers/cxl/port.c
> @@ -278,6 +278,11 @@ static struct cxl_dport *cxl_port_add_dport(struct cxl_port *port,
>  		return ERR_CAST(port_group);
>  
>  	if (port->nr_dports == 0) {
> +
> +		rc = cxl_port_setup_regs(port, port->component_reg_phys);
> +		if (rc)
> +			return ERR_PTR(rc);
> +
>  		rc = devm_cxl_switch_port_decoders_setup(port);
>  		if (rc)
>  			return ERR_PTR(rc);
Re: [PATCH v14 25/34] cxl/port: Map Port component registers before switchport init
Posted by Dave Jiang 3 weeks, 3 days ago

On 1/14/26 11:20 AM, Terry Bowman wrote:
> Port HDM registers must be mapped before calling
> devm_cxl_switch_port_decoders_setup(). Invoke a call to this function
> in cxl_port_add_dport().

s/Invoke.../Map the per port component registers when the first dport is being enumerated./
> 
> Signed-off-by: Terry Bowman <terry.bowman@amd.com>

Reviewed-by: Dave Jiang <dave.jiang@intel.com>


> ---
>  drivers/cxl/core/port.c | 3 ++-
>  drivers/cxl/cxlpci.h    | 3 +++
>  drivers/cxl/port.c      | 5 +++++
>  3 files changed, 10 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/cxl/core/port.c b/drivers/cxl/core/port.c
> index 2c4e28e7975c..3f730511f11d 100644
> --- a/drivers/cxl/core/port.c
> +++ b/drivers/cxl/core/port.c
> @@ -778,7 +778,7 @@ static int cxl_setup_comp_regs(struct device *host, struct cxl_register_map *map
>  	return cxl_setup_regs(map);
>  }
>  
> -static int cxl_port_setup_regs(struct cxl_port *port,
> +int cxl_port_setup_regs(struct cxl_port *port,
>  			resource_size_t component_reg_phys)
>  {
>  	if (dev_is_platform(port->uport_dev))
> @@ -786,6 +786,7 @@ static int cxl_port_setup_regs(struct cxl_port *port,
>  	return cxl_setup_comp_regs(&port->dev, &port->reg_map,
>  				   component_reg_phys);
>  }
> +EXPORT_SYMBOL_NS_GPL(cxl_port_setup_regs, "CXL");
>  
>  static int cxl_dport_setup_regs(struct device *host, struct cxl_dport *dport,
>  				resource_size_t component_reg_phys)
> diff --git a/drivers/cxl/cxlpci.h b/drivers/cxl/cxlpci.h
> index ef4496b4e55e..532506595d0f 100644
> --- a/drivers/cxl/cxlpci.h
> +++ b/drivers/cxl/cxlpci.h
> @@ -99,4 +99,7 @@ static inline void devm_cxl_port_ras_setup(struct cxl_port *port)
>  }
>  #endif
>  
> +int cxl_port_setup_regs(struct cxl_port *port,
> +			resource_size_t component_reg_phys);
> +
>  #endif /* __CXL_PCI_H__ */
> diff --git a/drivers/cxl/port.c b/drivers/cxl/port.c
> index d76b4b532064..f8a33dbf8222 100644
> --- a/drivers/cxl/port.c
> +++ b/drivers/cxl/port.c
> @@ -278,6 +278,11 @@ static struct cxl_dport *cxl_port_add_dport(struct cxl_port *port,
>  		return ERR_CAST(port_group);
>  
>  	if (port->nr_dports == 0) {
> +
> +		rc = cxl_port_setup_regs(port, port->component_reg_phys);
> +		if (rc)
> +			return ERR_PTR(rc);
> +
>  		rc = devm_cxl_switch_port_decoders_setup(port);
>  		if (rc)
>  			return ERR_PTR(rc);