diff mbox series

[v3,13/40] cxl/core/port: Make passthrough decoder init implicit

Message ID 164298418778.3018233.13573986275832546547.stgit@dwillia2-desk3.amr.corp.intel.com
State Accepted
Commit d2b61ed2ff63fd9f294db8399c7a680ea7fe8a23
Headers show
Series CXL.mem Topology Discovery and Hotplug Support | expand

Commit Message

Dan Williams Jan. 24, 2022, 12:29 a.m. UTC
From: Ben Widawsky <ben.widawsky@intel.com>

Unused CXL decoders, or ports which use a passthrough decoder (no HDM
decoder registers) are expected to be initialized in a specific way.
Since upcoming drivers will want the same initialization, and it was
already a requirement to have consumers of the API configure the decoder
specific to their needs, initialize to this passthrough state by
default.

Signed-off-by: Ben Widawsky <ben.widawsky@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
---
 drivers/cxl/acpi.c      |    5 -----
 drivers/cxl/core/port.c |    9 ++++++++-
 2 files changed, 8 insertions(+), 6 deletions(-)

Comments

Jonathan Cameron Jan. 31, 2022, 2:56 p.m. UTC | #1
On Sun, 23 Jan 2022 16:29:47 -0800
Dan Williams <dan.j.williams@intel.com> wrote:

> From: Ben Widawsky <ben.widawsky@intel.com>
> 
> Unused CXL decoders, or ports which use a passthrough decoder (no HDM
> decoder registers) are expected to be initialized in a specific way.
> Since upcoming drivers will want the same initialization, and it was
> already a requirement to have consumers of the API configure the decoder
> specific to their needs, initialize to this passthrough state by
> default.
> 
> Signed-off-by: Ben Widawsky <ben.widawsky@intel.com>
> Signed-off-by: Dan Williams <dan.j.williams@intel.com>

Make sense to me.

Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

> ---
>  drivers/cxl/acpi.c      |    5 -----
>  drivers/cxl/core/port.c |    9 ++++++++-
>  2 files changed, 8 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/cxl/acpi.c b/drivers/cxl/acpi.c
> index 0b267eabb15e..4e8086525edc 100644
> --- a/drivers/cxl/acpi.c
> +++ b/drivers/cxl/acpi.c
> @@ -264,11 +264,6 @@ static int add_host_bridge_uport(struct device *match, void *arg)
>  	if (IS_ERR(cxld))
>  		return PTR_ERR(cxld);
>  
> -	cxld->interleave_ways = 1;
> -	cxld->interleave_granularity = PAGE_SIZE;
> -	cxld->target_type = CXL_DECODER_EXPANDER;
> -	cxld->platform_res = (struct resource)DEFINE_RES_MEM(0, 0);
> -
>  	device_lock(&port->dev);
>  	dport = list_first_entry(&port->dports, typeof(*dport), list);
>  	device_unlock(&port->dev);
> diff --git a/drivers/cxl/core/port.c b/drivers/cxl/core/port.c
> index 2910c36a0e58..826b300ba950 100644
> --- a/drivers/cxl/core/port.c
> +++ b/drivers/cxl/core/port.c
> @@ -505,7 +505,8 @@ static int decoder_populate_targets(struct cxl_decoder *cxld,
>   * some address space for CXL.mem utilization. A decoder is expected to be
>   * configured by the caller before registering.
>   *
> - * Return: A new cxl decoder to be registered by cxl_decoder_add()
> + * Return: A new cxl decoder to be registered by cxl_decoder_add(). The decoder
> + *	   is initialized to be a "passthrough" decoder.
>   */
>  static struct cxl_decoder *cxl_decoder_alloc(struct cxl_port *port,
>  					     unsigned int nr_targets)
> @@ -537,6 +538,12 @@ static struct cxl_decoder *cxl_decoder_alloc(struct cxl_port *port,
>  	else
>  		cxld->dev.type = &cxl_decoder_switch_type;
>  
> +	/* Pre initialize an "empty" decoder */
> +	cxld->interleave_ways = 1;
> +	cxld->interleave_granularity = PAGE_SIZE;
> +	cxld->target_type = CXL_DECODER_EXPANDER;
> +	cxld->platform_res = (struct resource)DEFINE_RES_MEM(0, 0);
> +
>  	return cxld;
>  err:
>  	kfree(cxld);
>
diff mbox series

Patch

diff --git a/drivers/cxl/acpi.c b/drivers/cxl/acpi.c
index 0b267eabb15e..4e8086525edc 100644
--- a/drivers/cxl/acpi.c
+++ b/drivers/cxl/acpi.c
@@ -264,11 +264,6 @@  static int add_host_bridge_uport(struct device *match, void *arg)
 	if (IS_ERR(cxld))
 		return PTR_ERR(cxld);
 
-	cxld->interleave_ways = 1;
-	cxld->interleave_granularity = PAGE_SIZE;
-	cxld->target_type = CXL_DECODER_EXPANDER;
-	cxld->platform_res = (struct resource)DEFINE_RES_MEM(0, 0);
-
 	device_lock(&port->dev);
 	dport = list_first_entry(&port->dports, typeof(*dport), list);
 	device_unlock(&port->dev);
diff --git a/drivers/cxl/core/port.c b/drivers/cxl/core/port.c
index 2910c36a0e58..826b300ba950 100644
--- a/drivers/cxl/core/port.c
+++ b/drivers/cxl/core/port.c
@@ -505,7 +505,8 @@  static int decoder_populate_targets(struct cxl_decoder *cxld,
  * some address space for CXL.mem utilization. A decoder is expected to be
  * configured by the caller before registering.
  *
- * Return: A new cxl decoder to be registered by cxl_decoder_add()
+ * Return: A new cxl decoder to be registered by cxl_decoder_add(). The decoder
+ *	   is initialized to be a "passthrough" decoder.
  */
 static struct cxl_decoder *cxl_decoder_alloc(struct cxl_port *port,
 					     unsigned int nr_targets)
@@ -537,6 +538,12 @@  static struct cxl_decoder *cxl_decoder_alloc(struct cxl_port *port,
 	else
 		cxld->dev.type = &cxl_decoder_switch_type;
 
+	/* Pre initialize an "empty" decoder */
+	cxld->interleave_ways = 1;
+	cxld->interleave_granularity = PAGE_SIZE;
+	cxld->target_type = CXL_DECODER_EXPANDER;
+	cxld->platform_res = (struct resource)DEFINE_RES_MEM(0, 0);
+
 	return cxld;
 err:
 	kfree(cxld);