Module Name: src
Committed By: riastradh
Date: Fri Mar 22 20:48:14 UTC 2024
Modified Files:
src/sys/dev/acpi: apei_einj.c apei_erst.c apei_reg.c apei_reg.h
Log Message:
apei(4): Simplify EINJ/ERST register access now that it's pre-mapped.
PR kern/58046
To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/sys/dev/acpi/apei_einj.c
cvs rdiff -u -r1.2 -r1.3 src/sys/dev/acpi/apei_erst.c \
src/sys/dev/acpi/apei_reg.c src/sys/dev/acpi/apei_reg.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/acpi/apei_einj.c
diff -u src/sys/dev/acpi/apei_einj.c:1.4 src/sys/dev/acpi/apei_einj.c:1.5
--- src/sys/dev/acpi/apei_einj.c:1.4 Fri Mar 22 20:48:05 2024
+++ src/sys/dev/acpi/apei_einj.c Fri Mar 22 20:48:14 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: apei_einj.c,v 1.4 2024/03/22 20:48:05 riastradh Exp $ */
+/* $NetBSD: apei_einj.c,v 1.5 2024/03/22 20:48:14 riastradh Exp $ */
/*-
* Copyright (c) 2024 The NetBSD Foundation, Inc.
@@ -44,7 +44,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: apei_einj.c,v 1.4 2024/03/22 20:48:05 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: apei_einj.c,v 1.5 2024/03/22 20:48:14 riastradh Exp $");
#include <sys/types.h>
@@ -399,7 +399,6 @@ apei_einj_instfunc(ACPI_WHEA_HEADER *hea
void *cookie, uint32_t *ipp, uint32_t maxip)
{
struct apei_einj_machine *M = cookie;
- ACPI_STATUS rv = AE_OK;
/*
* Abbreviate some of the intermediate quantities to make the
@@ -434,43 +433,26 @@ apei_einj_instfunc(ACPI_WHEA_HEADER *hea
*/
switch (header->Instruction) {
case ACPI_EINJ_READ_REGISTER:
- rv = apei_read_register(reg, map, Mask, &M->y);
- if (ACPI_FAILURE(rv))
- break;
+ M->y = apei_read_register(reg, map, Mask);
break;
case ACPI_EINJ_READ_REGISTER_VALUE: {
uint64_t v;
- rv = apei_read_register(reg, map, Mask, &v);
- if (ACPI_FAILURE(rv))
- break;
+ v = apei_read_register(reg, map, Mask);
M->y = (v == Value ? 1 : 0);
break;
}
case ACPI_EINJ_WRITE_REGISTER:
- rv = apei_write_register(reg, map, Mask, preserve_register,
- M->x);
+ apei_write_register(reg, map, Mask, preserve_register, M->x);
break;
case ACPI_EINJ_WRITE_REGISTER_VALUE:
- rv = apei_write_register(reg, map, Mask, preserve_register,
- Value);
+ apei_write_register(reg, map, Mask, preserve_register, Value);
break;
case ACPI_EINJ_NOOP:
break;
- default:
- rv = AE_ERROR;
+ default: /* XXX unreachable */
break;
}
-
- /*
- * If any register I/O failed, print the failure message. This
- * could be more specific about exactly what failed, but that
- * takes a little more effort to write.
- */
- if (ACPI_FAILURE(rv)) {
- aprint_debug_dev(M->sc->sc_dev, "%s: failed: %s\n", __func__,
- AcpiFormatException(rv));
- }
}
/*
Index: src/sys/dev/acpi/apei_erst.c
diff -u src/sys/dev/acpi/apei_erst.c:1.2 src/sys/dev/acpi/apei_erst.c:1.3
--- src/sys/dev/acpi/apei_erst.c:1.2 Fri Mar 22 20:48:05 2024
+++ src/sys/dev/acpi/apei_erst.c Fri Mar 22 20:48:14 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: apei_erst.c,v 1.2 2024/03/22 20:48:05 riastradh Exp $ */
+/* $NetBSD: apei_erst.c,v 1.3 2024/03/22 20:48:14 riastradh Exp $ */
/*-
* Copyright (c) 2024 The NetBSD Foundation, Inc.
@@ -36,7 +36,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: apei_erst.c,v 1.2 2024/03/22 20:48:05 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: apei_erst.c,v 1.3 2024/03/22 20:48:14 riastradh Exp $");
#include <sys/param.h>
#include <sys/types.h>
@@ -376,7 +376,6 @@ apei_erst_instfunc(ACPI_WHEA_HEADER *hea
void *cookie, uint32_t *ipp, uint32_t maxip)
{
struct apei_erst_machine *const M = cookie;
- ACPI_STATUS rv = AE_OK;
/*
* Abbreviate some of the intermediate quantities to make the
@@ -411,35 +410,31 @@ apei_erst_instfunc(ACPI_WHEA_HEADER *hea
*/
switch (header->Instruction) {
case ACPI_ERST_READ_REGISTER:
- rv = apei_read_register(reg, map, Mask, &M->y);
+ M->y = apei_read_register(reg, map, Mask);
break;
case ACPI_ERST_READ_REGISTER_VALUE: {
uint64_t v;
- rv = apei_read_register(reg, map, Mask, &v);
- if (ACPI_FAILURE(rv))
- break;
+ v = apei_read_register(reg, map, Mask);
M->y = (v == Value ? 1 : 0);
break;
}
case ACPI_ERST_WRITE_REGISTER:
- rv = apei_write_register(reg, map, Mask, preserve_register,
- M->x);
+ apei_write_register(reg, map, Mask, preserve_register, M->x);
break;
case ACPI_ERST_WRITE_REGISTER_VALUE:
- rv = apei_write_register(reg, map, Mask, preserve_register,
- Value);
+ apei_write_register(reg, map, Mask, preserve_register, Value);
break;
case ACPI_ERST_NOOP:
break;
case ACPI_ERST_LOAD_VAR1:
- rv = apei_read_register(reg, map, Mask, &M->var1);
+ M->var1 = apei_read_register(reg, map, Mask);
break;
case ACPI_ERST_LOAD_VAR2:
- rv = apei_read_register(reg, map, Mask, &M->var2);
+ M->var2 = apei_read_register(reg, map, Mask);
break;
case ACPI_ERST_STORE_VAR1:
- rv = apei_write_register(reg, map, Mask, preserve_register,
+ apei_write_register(reg, map, Mask, preserve_register,
M->var1);
break;
case ACPI_ERST_ADD:
@@ -464,25 +459,17 @@ apei_erst_instfunc(ACPI_WHEA_HEADER *hea
case ACPI_ERST_ADD_VALUE: {
uint64_t v;
- rv = apei_read_register(reg, map, Mask, &v);
- if (ACPI_FAILURE(rv))
- break;
-
+ v = apei_read_register(reg, map, Mask);
v += Value;
-
- rv = apei_write_register(reg, map, Mask, preserve_register, v);
+ apei_write_register(reg, map, Mask, preserve_register, v);
break;
}
case ACPI_ERST_SUBTRACT_VALUE: {
uint64_t v;
- rv = apei_read_register(reg, map, Mask, &v);
- if (ACPI_FAILURE(rv))
- break;
-
+ v = apei_read_register(reg, map, Mask);
v -= Value;
-
- rv = apei_write_register(reg, map, Mask, preserve_register, v);
+ apei_write_register(reg, map, Mask, preserve_register, v);
break;
}
case ACPI_ERST_STALL:
@@ -490,64 +477,37 @@ apei_erst_instfunc(ACPI_WHEA_HEADER *hea
break;
case ACPI_ERST_STALL_WHILE_TRUE:
for (;;) {
- uint64_t v;
-
- rv = apei_read_register(reg, map, Mask, &v);
- if (ACPI_FAILURE(rv))
- break;
- if (v != Value)
+ if (apei_read_register(reg, map, Mask) != Value)
break;
DELAY(M->var1);
}
break;
- case ACPI_ERST_SKIP_NEXT_IF_TRUE: {
- uint64_t v;
-
- rv = apei_read_register(reg, map, Mask, &v);
- if (ACPI_FAILURE(rv))
- break;
-
+ case ACPI_ERST_SKIP_NEXT_IF_TRUE:
/*
* If reading the register yields Value, skip the next
* instruction -- unless that would run past the end of
* the instruction buffer.
*/
- if (v == Value) {
+ if (apei_read_register(reg, map, Mask) == Value) {
if (*ipp < maxip)
(*ipp)++;
}
break;
- }
case ACPI_ERST_GOTO:
if (Value >= maxip) /* paranoia */
*ipp = maxip;
else
*ipp = Value;
break;
- case ACPI_ERST_SET_SRC_ADDRESS_BASE: {
- uint64_t v;
-
- rv = apei_read_register(reg, map, Mask, &v);
- if (ACPI_FAILURE(rv))
- break;
- M->src_base = v;
+ case ACPI_ERST_SET_SRC_ADDRESS_BASE:
+ M->src_base = apei_read_register(reg, map, Mask);
break;
- }
- case ACPI_ERST_SET_DST_ADDRESS_BASE: {
- uint64_t v;
-
- rv = apei_read_register(reg, map, Mask, &v);
- if (ACPI_FAILURE(rv))
- break;
- M->src_base = v;
+ case ACPI_ERST_SET_DST_ADDRESS_BASE:
+ M->src_base = apei_read_register(reg, map, Mask);
break;
- }
case ACPI_ERST_MOVE_DATA: {
- uint64_t v;
+ const uint64_t v = apei_read_register(reg, map, Mask);
- rv = apei_read_register(reg, map, Mask, &v);
- if (ACPI_FAILURE(rv))
- break;
/*
* XXX This might not work in nasty contexts unless we
* pre-allocate a virtual page for the mapping.
@@ -555,19 +515,9 @@ apei_erst_instfunc(ACPI_WHEA_HEADER *hea
apei_pmemmove(M->dst_base + v, M->src_base + v, M->var2);
break;
}
- default:
+ default: /* XXX unreachable */
break;
}
-
- /*
- * If any register I/O failed, print the failure message. This
- * could be more specific about exactly what failed, but that
- * takes a little more effort to write.
- */
- if (ACPI_FAILURE(rv)) {
- aprint_debug_dev(M->sc->sc_dev, "%s: failed: %s\n", __func__,
- AcpiFormatException(rv));
- }
}
/*
Index: src/sys/dev/acpi/apei_reg.c
diff -u src/sys/dev/acpi/apei_reg.c:1.2 src/sys/dev/acpi/apei_reg.c:1.3
--- src/sys/dev/acpi/apei_reg.c:1.2 Fri Mar 22 20:48:05 2024
+++ src/sys/dev/acpi/apei_reg.c Fri Mar 22 20:48:14 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: apei_reg.c,v 1.2 2024/03/22 20:48:05 riastradh Exp $ */
+/* $NetBSD: apei_reg.c,v 1.3 2024/03/22 20:48:14 riastradh Exp $ */
/*-
* Copyright (c) 2024 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: apei_reg.c,v 1.2 2024/03/22 20:48:05 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: apei_reg.c,v 1.3 2024/03/22 20:48:14 riastradh Exp $");
#include <sys/types.h>
@@ -43,16 +43,16 @@ __KERNEL_RCSID(0, "$NetBSD: apei_reg.c,v
* apei_read_register(Register, map, Mask, &X)
*
* Read from Register mapped at map, shifted out of position and
- * then masked with Mask, and store the result in X.
+ * then masked with Mask, and return the result.
*
* https://uefi.org/specs/ACPI/6.5/18_Platform_Error_Interfaces.html#read-register
*
* (I'm guessing this applies to both ERST and EINJ, even though
* that section is under the ERST part.)
*/
-ACPI_STATUS
+uint64_t
apei_read_register(ACPI_GENERIC_ADDRESS *Register, struct apei_mapreg *map,
- uint64_t Mask, uint64_t *p)
+ uint64_t Mask)
{
const uint8_t BitOffset = Register->BitOffset;
uint64_t X;
@@ -61,8 +61,7 @@ apei_read_register(ACPI_GENERIC_ADDRESS
X >>= BitOffset;
X &= Mask;
- *p = X;
- return AE_OK;
+ return X;
}
/*
@@ -79,7 +78,7 @@ apei_read_register(ACPI_GENERIC_ADDRESS
* https://uefi.org/sites/default/files/resources/ACPI_5_1release.pdf#page=714
* which has been lost in more recent versions of the spec.
*/
-ACPI_STATUS
+void
apei_write_register(ACPI_GENERIC_ADDRESS *Register, struct apei_mapreg *map,
uint64_t Mask, bool preserve_register, uint64_t X)
{
@@ -95,5 +94,4 @@ apei_write_register(ACPI_GENERIC_ADDRESS
X |= Y;
}
apei_mapreg_write(Register, map, X);
- return AE_OK;
}
Index: src/sys/dev/acpi/apei_reg.h
diff -u src/sys/dev/acpi/apei_reg.h:1.2 src/sys/dev/acpi/apei_reg.h:1.3
--- src/sys/dev/acpi/apei_reg.h:1.2 Fri Mar 22 20:48:05 2024
+++ src/sys/dev/acpi/apei_reg.h Fri Mar 22 20:48:14 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: apei_reg.h,v 1.2 2024/03/22 20:48:05 riastradh Exp $ */
+/* $NetBSD: apei_reg.h,v 1.3 2024/03/22 20:48:14 riastradh Exp $ */
/*-
* Copyright (c) 2024 The NetBSD Foundation, Inc.
@@ -33,11 +33,12 @@
#include <dev/acpi/acpivar.h>
+struct acpi_generic_address;
struct apei_mapreg;
-ACPI_STATUS apei_read_register(ACPI_GENERIC_ADDRESS *, struct apei_mapreg *,
- uint64_t, uint64_t *);
-ACPI_STATUS apei_write_register(ACPI_GENERIC_ADDRESS *, struct apei_mapreg *,
+uint64_t apei_read_register(struct acpi_generic_address *,
+ struct apei_mapreg *, uint64_t);
+void apei_write_register(struct acpi_generic_address *, struct apei_mapreg *,
uint64_t, bool, uint64_t);
#endif /* _SYS_DEV_ACPI_APEI_REG_H_ */