Skip to content

Commit

Permalink
ACPI, APEI, EINJ: Remove memory range validation for CXL error types
Browse files Browse the repository at this point in the history
This patch is a follow up to the discussion at [1], and builds on Tony's
CXL error patch at [2].

The new CXL error types will use the Memory Address field in the
SET_ERROR_TYPE_WITH_ADDRESS structure in order to target a CXL 1.1
compliant memory-mapped Downstream port. The value of the Memory Address
will be in the port's MMIO range, and it will not represent physical
(normal or persistent) memory.

Allow error injection for CXL 1.1 systems by skipping memory range
validation for CXL error injection types.

Output trying to inject CXL.mem error without patch:

# echo 0x8000 > error_type
# echo 6 > flags
# echo 0x3cd5d2000000 > param1
# echo 0xFFFFFFFFFFFFF000 > param2
# echo 0 > param3
# echo 0x400000 > param4
# echo 1 > error_inject
-bash: echo: write error: Invalid argument

[1]: https://lore.kernel.org/linux-acpi/20221206205234.606073-1-Benjamin.Cheatham@amd.com/
[2]: https://lore.kernel.org/linux-cxl/CAJZ5v0hNQUfWViqxbJ5B4JCGJUuHpWWSpqpCFWPNpGuagoFbsQ@mail.gmail.com/T/#t

Signed-off-by: Yazen Ghannam <yazen.ghannam@amd.com>
Signed-off-by: Ben Cheatham <benjamin.cheatham@amd.com>
  • Loading branch information
yghannam authored and intel-lab-lkp committed Mar 29, 2023
1 parent 2a0bc40 commit f0c4824
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 1 deletion.
13 changes: 12 additions & 1 deletion drivers/acpi/apei/einj.c
Expand Up @@ -37,6 +37,13 @@
ACPI_EINJ_MEMORY_UNCORRECTABLE | \
ACPI_EINJ_MEMORY_FATAL)

#define CXL_ERROR_MASK (ACPI_EINJ_CXL_CACHE_CORRECTABLE | \
ACPI_EINJ_CXL_CACHE_UNCORRECTABLE | \
ACPI_EINJ_CXL_CACHE_FATAL | \
ACPI_EINJ_CXL_MEM_CORRECTABLE | \
ACPI_EINJ_CXL_MEM_UNCORRECTABLE | \
ACPI_EINJ_CXL_MEM_FATAL)

/*
* ACPI version 5 provides a SET_ERROR_TYPE_WITH_ADDRESS action.
*/
Expand Down Expand Up @@ -517,6 +524,7 @@ static int einj_error_inject(u32 type, u32 flags, u64 param1, u64 param2,
u64 param3, u64 param4)
{
int rc;
u32 available_error_types = 0;
u64 base_addr, size;

/* If user manually set "flags", make sure it is legal */
Expand All @@ -537,8 +545,11 @@ static int einj_error_inject(u32 type, u32 flags, u64 param1, u64 param2,
if (type & ACPI5_VENDOR_BIT) {
if (vendor_flags != SETWA_FLAGS_MEM)
goto inject;
} else if (!(type & MEM_ERROR_MASK) && !(flags & SETWA_FLAGS_MEM))
} else if (!(type & MEM_ERROR_MASK) && !(flags & SETWA_FLAGS_MEM)) {
goto inject;
} else if (type & CXL_ERROR_MASK) {
goto inject;
}

/*
* Disallow crazy address masks that give BIOS leeway to pick
Expand Down
6 changes: 6 additions & 0 deletions include/acpi/actbl1.h
Expand Up @@ -1044,6 +1044,12 @@ enum acpi_einj_command_status {
#define ACPI_EINJ_PLATFORM_CORRECTABLE (1<<9)
#define ACPI_EINJ_PLATFORM_UNCORRECTABLE (1<<10)
#define ACPI_EINJ_PLATFORM_FATAL (1<<11)
#define ACPI_EINJ_CXL_CACHE_CORRECTABLE BIT(12)
#define ACPI_EINJ_CXL_CACHE_UNCORRECTABLE BIT(13)
#define ACPI_EINJ_CXL_CACHE_FATAL BIT(14)
#define ACPI_EINJ_CXL_MEM_CORRECTABLE BIT(15)
#define ACPI_EINJ_CXL_MEM_UNCORRECTABLE BIT(16)
#define ACPI_EINJ_CXL_MEM_FATAL BIT(17)
#define ACPI_EINJ_VENDOR_DEFINED (1<<31)

/*******************************************************************************
Expand Down

0 comments on commit f0c4824

Please sign in to comment.