Commit 14e473e1 authored by Ben Widawsky's avatar Ben Widawsky Committed by Dan Williams

cxl/hdm: Require all decoders to be enumerated

In preparation for region provisioning all device decoders need to be
enumerated since DPA allocations are calculated by summing the
capacities of all decoders in a set. I.e. the programming for decoder[N]
depends on the state of decoder[N-1], so skipping over decoders that
fail to initialize prevents accurate DPA accounting.
Signed-off-by: default avatarBen Widawsky <bwidawsk@kernel.org>
[djbw: reword changelog]
Reviewed-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
Link: https://lore.kernel.org/r/165603879664.551046.6863805202478861026.stgit@dwillia2-xfhSigned-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent d3b75029
...@@ -199,7 +199,7 @@ int devm_cxl_enumerate_decoders(struct cxl_hdm *cxlhdm) ...@@ -199,7 +199,7 @@ int devm_cxl_enumerate_decoders(struct cxl_hdm *cxlhdm)
{ {
void __iomem *hdm = cxlhdm->regs.hdm_decoder; void __iomem *hdm = cxlhdm->regs.hdm_decoder;
struct cxl_port *port = cxlhdm->port; struct cxl_port *port = cxlhdm->port;
int i, committed, failed; int i, committed;
u32 ctrl; u32 ctrl;
/* /*
...@@ -219,7 +219,7 @@ int devm_cxl_enumerate_decoders(struct cxl_hdm *cxlhdm) ...@@ -219,7 +219,7 @@ int devm_cxl_enumerate_decoders(struct cxl_hdm *cxlhdm)
if (committed != cxlhdm->decoder_count) if (committed != cxlhdm->decoder_count)
msleep(20); msleep(20);
for (i = 0, failed = 0; i < cxlhdm->decoder_count; i++) { for (i = 0; i < cxlhdm->decoder_count; i++) {
int target_map[CXL_DECODER_MAX_INTERLEAVE] = { 0 }; int target_map[CXL_DECODER_MAX_INTERLEAVE] = { 0 };
int rc, target_count = cxlhdm->target_count; int rc, target_count = cxlhdm->target_count;
struct cxl_decoder *cxld; struct cxl_decoder *cxld;
...@@ -237,8 +237,7 @@ int devm_cxl_enumerate_decoders(struct cxl_hdm *cxlhdm) ...@@ -237,8 +237,7 @@ int devm_cxl_enumerate_decoders(struct cxl_hdm *cxlhdm)
rc = init_hdm_decoder(port, cxld, target_map, hdm, i); rc = init_hdm_decoder(port, cxld, target_map, hdm, i);
if (rc) { if (rc) {
put_device(&cxld->dev); put_device(&cxld->dev);
failed++; return rc;
continue;
} }
rc = add_hdm_decoder(port, cxld, target_map); rc = add_hdm_decoder(port, cxld, target_map);
if (rc) { if (rc) {
...@@ -248,11 +247,6 @@ int devm_cxl_enumerate_decoders(struct cxl_hdm *cxlhdm) ...@@ -248,11 +247,6 @@ int devm_cxl_enumerate_decoders(struct cxl_hdm *cxlhdm)
} }
} }
if (failed == cxlhdm->decoder_count) {
dev_err(&port->dev, "No valid decoders found\n");
return -ENXIO;
}
return 0; return 0;
} }
EXPORT_SYMBOL_NS_GPL(devm_cxl_enumerate_decoders, CXL); EXPORT_SYMBOL_NS_GPL(devm_cxl_enumerate_decoders, CXL);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment