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_ */