cxl_probe_component_regs(&port->dev, crb, &map.component_map);
        if (!map.component_map.hdm_decoder.valid) {
-               dev_err(&port->dev, "HDM decoder registers invalid\n");
-               return -ENXIO;
+               dev_dbg(&port->dev, "HDM decoder registers not implemented\n");
+               /* unique error code to indicate no HDM decoder capability */
+               return -ENODEV;
        }
 
        return cxl_map_component_regs(&port->dev, regs, &map,
 
        if (rc < 0)
                return rc;
 
-       if (rc == 1)
-               return devm_cxl_add_passthrough_decoder(port);
-
        cxlhdm = devm_cxl_setup_hdm(port, NULL);
-       if (IS_ERR(cxlhdm))
+       if (!IS_ERR(cxlhdm))
+               return devm_cxl_enumerate_decoders(cxlhdm, NULL);
+
+       if (PTR_ERR(cxlhdm) != -ENODEV) {
+               dev_err(&port->dev, "Failed to map HDM decoder capability\n");
                return PTR_ERR(cxlhdm);
+       }
+
+       if (rc == 1) {
+               dev_dbg(&port->dev, "Fallback to passthrough decoder\n");
+               return devm_cxl_add_passthrough_decoder(port);
+       }
 
-       return devm_cxl_enumerate_decoders(cxlhdm, NULL);
+       dev_err(&port->dev, "HDM decoder capability not found\n");
+       return -ENXIO;
 }
 
 static int cxl_endpoint_port_probe(struct cxl_port *port)