{
u64 ecclog = readq(imc->window + ECC_ERROR_LOG_OFFSET);
- - if (ecclog & (ECC_ERROR_LOG_CE | ECC_ERROR_LOG_UE)) {
- - /* Clear CE/UE bits by writing 1s */
- - writeq(ecclog, imc->window + ECC_ERROR_LOG_OFFSET);
- - return ecclog;
- - }
+ + /*
+ + * Quirk: The ECC_ERROR_LOG register of certain SoCs may contain
+ + * the invalid value ~0. This will result in a flood of invalid
+ + * error reports in polling mode. Skip it.
+ + */
+ + if (ecclog == ~0)
+ + return 0;
+
- return 0;
+ + /* Neither a CE nor a UE. Skip it.*/
+ + if (!(ecclog & (ECC_ERROR_LOG_CE | ECC_ERROR_LOG_UE)))
+ + return 0;
+
- return 0;
+ + /* Clear CE/UE bits by writing 1s */
+ + writeq(ecclog, imc->window + ECC_ERROR_LOG_OFFSET);
+ +
+ + return ecclog;
}
static void errsts_clear(struct igen6_imc *imc)