@@ -41,6 +41,12 @@ enum MemoryError_t
MEMORY_ERROR_UE = 1,
};
+/**
+ * PRD flag: xscom_read and xscom_write return proper return codes on error.
+ * Previous implementations may have incorrectly ignored failures.
+ */
+#define OPAL_PRD_FLAGS_HAS_XSCOM_RC (1ul << 0)
+
struct host_interfaces {
/** Interface version. */
uint64_t interface_version;
@@ -297,13 +297,14 @@ int hservice_scom_read(uint64_t chip_id, uint64_t addr, void *buf)
"failed: %m", chip_id, addr);
return 0;
}
+ rc = (int)scom.rc;
- pr_debug("SCOM: read: chip 0x%lx, addr 0x%lx, val 0x%lx",
- chip_id, addr, scom.data);
+ pr_debug("SCOM: read: chip 0x%lx, addr 0x%lx, val 0x%lx, rc %d",
+ chip_id, addr, scom.data, rc);
*(uint64_t *)buf = htobe64(scom.data);
- return 0;
+ return rc;
}
int hservice_scom_write(uint64_t chip_id, uint64_t addr,
@@ -322,11 +323,12 @@ int hservice_scom_write(uint64_t chip_id, uint64_t addr,
"failed: %m", chip_id, addr);
return 0;
}
+ rc = (int)scom.rc;
- pr_debug("SCOM: write: chip 0x%lx, addr 0x%lx, val 0x%lx",
- chip_id, addr, scom.data);
+ pr_debug("SCOM: write: chip 0x%lx, addr 0x%lx, val 0x%lx, rc %d",
+ chip_id, addr, scom.data, rc);
- return 0;
+ return rc;
}
uint64_t hservice_get_reserved_mem(const char *name, uint32_t instance)
@@ -651,7 +653,7 @@ int hservice_memory_error(uint64_t i_start_addr, uint64_t i_endAddr,
uint64_t hservice_get_prd_flags(void)
{
- return 0;
+ return OPAL_PRD_FLAGS_HAS_XSCOM_RC;
}
int hservices_init(struct opal_prd_ctx *ctx, void *code)