Skip to content

Commit cecbb5d

Browse files
committed
cxl/hdm: Default CXL_DEVTYPE_DEVMEM decoders to CXL_DECODER_DEVMEM
In preparation for device-memory region creation, arrange for decoders of CXL_DEVTYPE_DEVMEM memdevs to default to CXL_DECODER_DEVMEM for their target type. Revisit this if a device ever shows up that wants to offer mixed HDM-H (Host-Only Memory) and HDM-DB support, or an CXL_DEVTYPE_DEVMEM device that supports HDM-H. Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> Reviewed-by: Dave Jiang <dave.jiang@intel.com> Link: https://lore.kernel.org/r/168679261945.3436160.11673393474107374595.stgit@dwillia2-xfh.jf.intel.com Signed-off-by: Dan Williams <dan.j.williams@intel.com>
1 parent 5aa39a9 commit cecbb5d

2 files changed

Lines changed: 27 additions & 10 deletions

File tree

drivers/cxl/core/hdm.c

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -572,7 +572,7 @@ static void cxld_set_type(struct cxl_decoder *cxld, u32 *ctrl)
572572
{
573573
u32p_replace_bits(ctrl,
574574
!!(cxld->target_type == CXL_DECODER_HOSTONLYMEM),
575-
CXL_HDM_DECODER0_CTRL_TYPE);
575+
CXL_HDM_DECODER0_CTRL_HOSTONLY);
576576
}
577577

578578
static int cxlsd_set_targets(struct cxl_switch_decoder *cxlsd, u64 *tgt)
@@ -794,8 +794,8 @@ static int init_hdm_decoder(struct cxl_port *port, struct cxl_decoder *cxld,
794794
int *target_map, void __iomem *hdm, int which,
795795
u64 *dpa_base, struct cxl_endpoint_dvsec_info *info)
796796
{
797+
struct cxl_endpoint_decoder *cxled = NULL;
797798
u64 size, base, skip, dpa_size, lo, hi;
798-
struct cxl_endpoint_decoder *cxled;
799799
bool committed;
800800
u32 remainder;
801801
int i, rc;
@@ -828,6 +828,8 @@ static int init_hdm_decoder(struct cxl_port *port, struct cxl_decoder *cxld,
828828
return -ENXIO;
829829
}
830830

831+
if (info)
832+
cxled = to_cxl_endpoint_decoder(&cxld->dev);
831833
cxld->hpa_range = (struct range) {
832834
.start = base,
833835
.end = base + size - 1,
@@ -838,7 +840,7 @@ static int init_hdm_decoder(struct cxl_port *port, struct cxl_decoder *cxld,
838840
cxld->flags |= CXL_DECODER_F_ENABLE;
839841
if (ctrl & CXL_HDM_DECODER0_CTRL_LOCK)
840842
cxld->flags |= CXL_DECODER_F_LOCK;
841-
if (FIELD_GET(CXL_HDM_DECODER0_CTRL_TYPE, ctrl))
843+
if (FIELD_GET(CXL_HDM_DECODER0_CTRL_HOSTONLY, ctrl))
842844
cxld->target_type = CXL_DECODER_HOSTONLYMEM;
843845
else
844846
cxld->target_type = CXL_DECODER_DEVMEM;
@@ -857,12 +859,28 @@ static int init_hdm_decoder(struct cxl_port *port, struct cxl_decoder *cxld,
857859
}
858860
port->commit_end = cxld->id;
859861
} else {
860-
/* unless / until type-2 drivers arrive, assume type-3 */
861-
if (FIELD_GET(CXL_HDM_DECODER0_CTRL_TYPE, ctrl) == 0) {
862-
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;
863882
writel(ctrl, hdm + CXL_HDM_DECODER0_CTRL_OFFSET(which));
864883
}
865-
cxld->target_type = CXL_DECODER_HOSTONLYMEM;
866884
}
867885
rc = eiw_to_ways(FIELD_GET(CXL_HDM_DECODER0_CTRL_IW_MASK, ctrl),
868886
&cxld->interleave_ways);
@@ -881,7 +899,7 @@ static int init_hdm_decoder(struct cxl_port *port, struct cxl_decoder *cxld,
881899
port->id, cxld->id, cxld->hpa_range.start, cxld->hpa_range.end,
882900
cxld->interleave_ways, cxld->interleave_granularity);
883901

884-
if (!info) {
902+
if (!cxled) {
885903
lo = readl(hdm + CXL_HDM_DECODER0_TL_LOW(which));
886904
hi = readl(hdm + CXL_HDM_DECODER0_TL_HIGH(which));
887905
target_list.value = (hi << 32) + lo;
@@ -904,7 +922,6 @@ static int init_hdm_decoder(struct cxl_port *port, struct cxl_decoder *cxld,
904922
lo = readl(hdm + CXL_HDM_DECODER0_SKIP_LOW(which));
905923
hi = readl(hdm + CXL_HDM_DECODER0_SKIP_HIGH(which));
906924
skip = (hi << 32) + lo;
907-
cxled = to_cxl_endpoint_decoder(&cxld->dev);
908925
rc = devm_cxl_dpa_reserve(cxled, *dpa_base + skip, dpa_size, skip);
909926
if (rc) {
910927
dev_err(&port->dev,

drivers/cxl/cxl.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656
#define CXL_HDM_DECODER0_CTRL_COMMIT BIT(9)
5757
#define CXL_HDM_DECODER0_CTRL_COMMITTED BIT(10)
5858
#define CXL_HDM_DECODER0_CTRL_COMMIT_ERROR BIT(11)
59-
#define CXL_HDM_DECODER0_CTRL_TYPE BIT(12)
59+
#define CXL_HDM_DECODER0_CTRL_HOSTONLY BIT(12)
6060
#define CXL_HDM_DECODER0_TL_LOW(i) (0x20 * (i) + 0x24)
6161
#define CXL_HDM_DECODER0_TL_HIGH(i) (0x20 * (i) + 0x28)
6262
#define CXL_HDM_DECODER0_SKIP_LOW(i) CXL_HDM_DECODER0_TL_LOW(i)

0 commit comments

Comments
 (0)