diff options
Diffstat (limited to 'drivers/cxl/core')
| -rw-r--r-- | drivers/cxl/core/features.c | 3 | ||||
| -rw-r--r-- | drivers/cxl/core/port.c | 26 | ||||
| -rw-r--r-- | drivers/cxl/core/region.c | 11 | ||||
| -rw-r--r-- | drivers/cxl/core/trace.h | 2 | 
4 files changed, 22 insertions, 20 deletions
| diff --git a/drivers/cxl/core/features.c b/drivers/cxl/core/features.c index 7c750599ea69..4bc484b46f43 100644 --- a/drivers/cxl/core/features.c +++ b/drivers/cxl/core/features.c @@ -371,6 +371,9 @@ cxl_feature_info(struct cxl_features_state *cxlfs,  {  	struct cxl_feat_entry *feat; +	if (!cxlfs || !cxlfs->entries) +		return ERR_PTR(-EOPNOTSUPP); +  	for (int i = 0; i < cxlfs->entries->num_features; i++) {  		feat = &cxlfs->entries->ent[i];  		if (uuid_equal(uuid, &feat->uuid)) diff --git a/drivers/cxl/core/port.c b/drivers/cxl/core/port.c index d5f71eb1ade8..8128fd2b5b31 100644 --- a/drivers/cxl/core/port.c +++ b/drivers/cxl/core/port.c @@ -1182,6 +1182,20 @@ __devm_cxl_add_dport(struct cxl_port *port, struct device *dport_dev,  	if (rc)  		return ERR_PTR(rc); +	/* +	 * Setup port register if this is the first dport showed up. Having +	 * a dport also means that there is at least 1 active link. +	 */ +	if (port->nr_dports == 1 && +	    port->component_reg_phys != CXL_RESOURCE_NONE) { +		rc = cxl_port_setup_regs(port, port->component_reg_phys); +		if (rc) { +			xa_erase(&port->dports, (unsigned long)dport->dport_dev); +			return ERR_PTR(rc); +		} +		port->component_reg_phys = CXL_RESOURCE_NONE; +	} +  	get_device(dport_dev);  	rc = devm_add_action_or_reset(host, cxl_dport_remove, dport);  	if (rc) @@ -1200,18 +1214,6 @@ __devm_cxl_add_dport(struct cxl_port *port, struct device *dport_dev,  	cxl_debugfs_create_dport_dir(dport); -	/* -	 * Setup port register if this is the first dport showed up. Having -	 * a dport also means that there is at least 1 active link. -	 */ -	if (port->nr_dports == 1 && -	    port->component_reg_phys != CXL_RESOURCE_NONE) { -		rc = cxl_port_setup_regs(port, port->component_reg_phys); -		if (rc) -			return ERR_PTR(rc); -		port->component_reg_phys = CXL_RESOURCE_NONE; -	} -  	return dport;  } diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c index e14c1d305b22..b06fee1978ba 100644 --- a/drivers/cxl/core/region.c +++ b/drivers/cxl/core/region.c @@ -839,7 +839,7 @@ static int match_free_decoder(struct device *dev, const void *data)  }  static bool region_res_match_cxl_range(const struct cxl_region_params *p, -				       struct range *range) +				       const struct range *range)  {  	if (!p->res)  		return false; @@ -3398,10 +3398,7 @@ static int match_region_by_range(struct device *dev, const void *data)  	p = &cxlr->params;  	guard(rwsem_read)(&cxl_rwsem.region); -	if (p->res && p->res->start == r->start && p->res->end == r->end) -		return 1; - -	return 0; +	return region_res_match_cxl_range(p, r);  }  static int cxl_extended_linear_cache_resize(struct cxl_region *cxlr, @@ -3666,14 +3663,14 @@ static int validate_region_offset(struct cxl_region *cxlr, u64 offset)  	if (offset < p->cache_size) {  		dev_err(&cxlr->dev, -			"Offset %#llx is within extended linear cache %pr\n", +			"Offset %#llx is within extended linear cache %pa\n",  			offset, &p->cache_size);  		return -EINVAL;  	}  	region_size = resource_size(p->res);  	if (offset >= region_size) { -		dev_err(&cxlr->dev, "Offset %#llx exceeds region size %pr\n", +		dev_err(&cxlr->dev, "Offset %#llx exceeds region size %pa\n",  			offset, ®ion_size);  		return -EINVAL;  	} diff --git a/drivers/cxl/core/trace.h b/drivers/cxl/core/trace.h index a53ec4798b12..a972e4ef1936 100644 --- a/drivers/cxl/core/trace.h +++ b/drivers/cxl/core/trace.h @@ -1068,7 +1068,7 @@ TRACE_EVENT(cxl_poison,  			__entry->hpa = cxl_dpa_to_hpa(cxlr, cxlmd,  						      __entry->dpa);  			if (__entry->hpa != ULLONG_MAX && cxlr->params.cache_size) -				__entry->hpa_alias0 = __entry->hpa + +				__entry->hpa_alias0 = __entry->hpa -  						      cxlr->params.cache_size;  			else  				__entry->hpa_alias0 = ULLONG_MAX; | 
