Skip to content

Commit aeaefab

Browse files
committed
Merge branch 'for-6.5/cxl-type-2' into for-6.5/cxl
Pick up the driver cleanups identified in preparation for CXL "type-2" (accelerator) device support. The major change here from a conflict generation perspective is the split of 'struct cxl_memdev_state' from the core 'struct cxl_dev_state'. Since an accelerator may not care about all the optional features that are standard on a CXL "type-3" (host-only memory expander) device. A silent conflict also occurs with the move of the endpoint port to be a formal property of a 'struct cxl_memdev' rather than drvdata.
2 parents 867eab6 + 8f0220a commit aeaefab

20 files changed

Lines changed: 594 additions & 549 deletions

File tree

drivers/cxl/acpi.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ static int cxl_parse_cfmws(union acpi_subtable_headers *header, void *arg,
258258

259259
cxld = &cxlrd->cxlsd.cxld;
260260
cxld->flags = cfmws_to_decoder_flags(cfmws->restrictions);
261-
cxld->target_type = CXL_DECODER_EXPANDER;
261+
cxld->target_type = CXL_DECODER_HOSTONLYMEM;
262262
cxld->hpa_range = (struct range) {
263263
.start = res->start,
264264
.end = res->end,

drivers/cxl/core/hdm.c

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -570,8 +570,9 @@ static void cxld_set_interleave(struct cxl_decoder *cxld, u32 *ctrl)
570570

571571
static void cxld_set_type(struct cxl_decoder *cxld, u32 *ctrl)
572572
{
573-
u32p_replace_bits(ctrl, !!(cxld->target_type == 3),
574-
CXL_HDM_DECODER0_CTRL_TYPE);
573+
u32p_replace_bits(ctrl,
574+
!!(cxld->target_type == CXL_DECODER_HOSTONLYMEM),
575+
CXL_HDM_DECODER0_CTRL_HOSTONLY);
575576
}
576577

577578
static int cxlsd_set_targets(struct cxl_switch_decoder *cxlsd, u64 *tgt)
@@ -764,7 +765,7 @@ static int cxl_setup_hdm_decoder_from_dvsec(
764765
if (!len)
765766
return -ENOENT;
766767

767-
cxld->target_type = CXL_DECODER_EXPANDER;
768+
cxld->target_type = CXL_DECODER_HOSTONLYMEM;
768769
cxld->commit = NULL;
769770
cxld->reset = NULL;
770771
cxld->hpa_range = info->dvsec_range[which];
@@ -793,8 +794,8 @@ static int init_hdm_decoder(struct cxl_port *port, struct cxl_decoder *cxld,
793794
int *target_map, void __iomem *hdm, int which,
794795
u64 *dpa_base, struct cxl_endpoint_dvsec_info *info)
795796
{
797+
struct cxl_endpoint_decoder *cxled = NULL;
796798
u64 size, base, skip, dpa_size, lo, hi;
797-
struct cxl_endpoint_decoder *cxled;
798799
bool committed;
799800
u32 remainder;
800801
int i, rc;
@@ -827,6 +828,8 @@ static int init_hdm_decoder(struct cxl_port *port, struct cxl_decoder *cxld,
827828
return -ENXIO;
828829
}
829830

831+
if (info)
832+
cxled = to_cxl_endpoint_decoder(&cxld->dev);
830833
cxld->hpa_range = (struct range) {
831834
.start = base,
832835
.end = base + size - 1,
@@ -837,10 +840,10 @@ static int init_hdm_decoder(struct cxl_port *port, struct cxl_decoder *cxld,
837840
cxld->flags |= CXL_DECODER_F_ENABLE;
838841
if (ctrl & CXL_HDM_DECODER0_CTRL_LOCK)
839842
cxld->flags |= CXL_DECODER_F_LOCK;
840-
if (FIELD_GET(CXL_HDM_DECODER0_CTRL_TYPE, ctrl))
841-
cxld->target_type = CXL_DECODER_EXPANDER;
843+
if (FIELD_GET(CXL_HDM_DECODER0_CTRL_HOSTONLY, ctrl))
844+
cxld->target_type = CXL_DECODER_HOSTONLYMEM;
842845
else
843-
cxld->target_type = CXL_DECODER_ACCELERATOR;
846+
cxld->target_type = CXL_DECODER_DEVMEM;
844847
if (cxld->id != port->commit_end + 1) {
845848
dev_warn(&port->dev,
846849
"decoder%d.%d: Committed out of order\n",
@@ -856,12 +859,28 @@ static int init_hdm_decoder(struct cxl_port *port, struct cxl_decoder *cxld,
856859
}
857860
port->commit_end = cxld->id;
858861
} else {
859-
/* unless / until type-2 drivers arrive, assume type-3 */
860-
if (FIELD_GET(CXL_HDM_DECODER0_CTRL_TYPE, ctrl) == 0) {
861-
ctrl |= CXL_HDM_DECODER0_CTRL_TYPE;
862+
if (cxled) {
863+
struct cxl_memdev *cxlmd = cxled_to_memdev(cxled);
864+
struct cxl_dev_state *cxlds = cxlmd->cxlds;
865+
866+
/*
867+
* Default by devtype until a device arrives that needs
868+
* more precision.
869+
*/
870+
if (cxlds->type == CXL_DEVTYPE_CLASSMEM)
871+
cxld->target_type = CXL_DECODER_HOSTONLYMEM;
872+
else
873+
cxld->target_type = CXL_DECODER_DEVMEM;
874+
} else {
875+
/* To be overridden by region type at commit time */
876+
cxld->target_type = CXL_DECODER_HOSTONLYMEM;
877+
}
878+
879+
if (!FIELD_GET(CXL_HDM_DECODER0_CTRL_HOSTONLY, ctrl) &&
880+
cxld->target_type == CXL_DECODER_HOSTONLYMEM) {
881+
ctrl |= CXL_HDM_DECODER0_CTRL_HOSTONLY;
862882
writel(ctrl, hdm + CXL_HDM_DECODER0_CTRL_OFFSET(which));
863883
}
864-
cxld->target_type = CXL_DECODER_EXPANDER;
865884
}
866885
rc = eiw_to_ways(FIELD_GET(CXL_HDM_DECODER0_CTRL_IW_MASK, ctrl),
867886
&cxld->interleave_ways);
@@ -880,7 +899,7 @@ static int init_hdm_decoder(struct cxl_port *port, struct cxl_decoder *cxld,
880899
port->id, cxld->id, cxld->hpa_range.start, cxld->hpa_range.end,
881900
cxld->interleave_ways, cxld->interleave_granularity);
882901

883-
if (!info) {
902+
if (!cxled) {
884903
lo = readl(hdm + CXL_HDM_DECODER0_TL_LOW(which));
885904
hi = readl(hdm + CXL_HDM_DECODER0_TL_HIGH(which));
886905
target_list.value = (hi << 32) + lo;
@@ -903,7 +922,6 @@ static int init_hdm_decoder(struct cxl_port *port, struct cxl_decoder *cxld,
903922
lo = readl(hdm + CXL_HDM_DECODER0_SKIP_LOW(which));
904923
hi = readl(hdm + CXL_HDM_DECODER0_SKIP_HIGH(which));
905924
skip = (hi << 32) + lo;
906-
cxled = to_cxl_endpoint_decoder(&cxld->dev);
907925
rc = devm_cxl_dpa_reserve(cxled, *dpa_base + skip, dpa_size, skip);
908926
if (rc) {
909927
dev_err(&port->dev,

0 commit comments

Comments
 (0)