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

Reply via email to