cxl/core/port: Make passthrough decoder init implicit
authorBen Widawsky <ben.widawsky@intel.com>
Mon, 24 Jan 2022 00:29:47 +0000 (16:29 -0800)
committerDan Williams <dan.j.williams@intel.com>
Wed, 9 Feb 2022 06:57:29 +0000 (22:57 -0800)
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>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Link: https://lore.kernel.org/r/164298418778.3018233.13573986275832546547.stgit@dwillia2-desk3.amr.corp.intel.com
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
drivers/cxl/acpi.c
drivers/cxl/core/port.c

index 0b267eabb15ed697a956e756706b9a52d99c64bb..4e8086525edcca1c005ddba86e8f127571499509 100644 (file)
@@ -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);
index 88ffec71464a90d342a7576809b1190dd753dae5..73ff42a0547366ed54f3c1c041193d066df5c350 100644 (file)
@@ -505,7 +505,8 @@ out_unlock:
  * 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);