acpi/ghes: Change ghes fill logic to work with only one source

Extending to multiple sources require a BIOS pointer to the
beginning of the HEST table, which in turn requires a backward-compatible
code.

So, the current code supports only one source. Ensure that and simplify
the code.

Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
Message-Id: <66bddd42a64c8515ad98b9975d953b4a70ffcc6d.1736945236.git.mchehab+huawei@kernel.org>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
Mauro Carvalho Chehab 2025-01-15 13:50:31 +01:00 committed by Michael S. Tsirkin
parent 1cd59b8981
commit 47935fc1e5

View File

@ -387,15 +387,13 @@ static void get_hw_error_offsets(uint64_t ghes_addr,
* As the current version supports only one source, the ack offset is * As the current version supports only one source, the ack offset is
* just sizeof(uint64_t). * just sizeof(uint64_t).
*/ */
*read_ack_register_addr = ghes_addr + *read_ack_register_addr = ghes_addr + sizeof(uint64_t);
ACPI_GHES_ERROR_SOURCE_COUNT * sizeof(uint64_t);
} }
void ghes_record_cper_errors(const void *cper, size_t len, void ghes_record_cper_errors(const void *cper, size_t len,
uint16_t source_id, Error **errp) uint16_t source_id, Error **errp)
{ {
uint64_t cper_addr = 0, read_ack_register_addr = 0, read_ack_register; uint64_t cper_addr = 0, read_ack_register_addr = 0, read_ack_register;
uint64_t start_addr;
AcpiGedState *acpi_ged_state; AcpiGedState *acpi_ged_state;
AcpiGhesState *ags; AcpiGhesState *ags;
@ -412,11 +410,9 @@ void ghes_record_cper_errors(const void *cper, size_t len,
} }
ags = &acpi_ged_state->ghes_state; ags = &acpi_ged_state->ghes_state;
start_addr = le64_to_cpu(ags->hw_error_le); assert(ACPI_GHES_ERROR_SOURCE_COUNT == 1);
get_hw_error_offsets(le64_to_cpu(ags->hw_error_le),
start_addr += source_id * sizeof(uint64_t); &cper_addr, &read_ack_register_addr);
get_hw_error_offsets(start_addr, &cper_addr, &read_ack_register_addr);
if (!cper_addr) { if (!cper_addr) {
error_setg(errp, "can not find Generic Error Status Block"); error_setg(errp, "can not find Generic Error Status Block");