[PATCH 09/16] acpi: pcct: add type 5 according to ACPI 6.4 (manti 2010)
Colin Ian King
colin.king at canonical.com
Tue Jan 26 20:50:40 UTC 2021
On 26/01/2021 20:30, Alex Hung wrote:
> Also refactor type 0 & and fix typos in type 3/4
>
> Signed-off-by: Alex Hung <alex.hung at canonical.com>
> ---
> src/acpi/pcct/pcct.c | 60 +++++++++++++++++++++++++++++--------
> src/lib/include/fwts_acpi.h | 16 ++++++++++
> 2 files changed, 64 insertions(+), 12 deletions(-)
>
> diff --git a/src/acpi/pcct/pcct.c b/src/acpi/pcct/pcct.c
> index acffd6d5..a013a036 100644
> --- a/src/acpi/pcct/pcct.c
> +++ b/src/acpi/pcct/pcct.c
> @@ -56,6 +56,21 @@ static void gas_messages(fwts_framework *fw, uint8_t type, fwts_acpi_gas *gas, b
> FWTS_GAS_ADDR_SPACE_ID_FFH);
> }
>
> +static void gas_messages2(fwts_framework *fw, uint8_t type, fwts_acpi_gas *gas, bool *passed)
> +{
> + char label[20];
> +
> + fwts_log_info_simp_int(fw, " Address Space ID ", gas->address_space_id);
> + fwts_log_info_simp_int(fw, " Register Bit Width ", gas->register_bit_width);
> + fwts_log_info_simp_int(fw, " Register Bit Offset ", gas->register_bit_offset);
> + fwts_log_info_simp_int(fw, " Access Size ", gas->access_width);
> + fwts_log_info_simp_int(fw, " Address ", gas->address);
> +
> + snprintf(label, 20, "Subspace Type % " PRId8, type);
try to avoid hard coded values, use sizeof(label) instead of 20 in the
snprintf()
> + fwts_acpi_space_id_check(fw, "PCCT", label, passed, gas->address_space_id, 2,
> + FWTS_GAS_ADDR_SPACE_ID_SYSTEM_MEMORY, FWTS_GAS_ADDR_SPACE_ID_SYSTEM_IO);
> +}
> +
> static void memory_length(fwts_framework *fw, uint8_t type, uint64_t memory_range, uint64_t min_length, bool *passed)
> {
> switch (type) {
> @@ -84,7 +99,6 @@ static void memory_length(fwts_framework *fw, uint8_t type, uint64_t memory_rang
>
> static void generic_comm_test(fwts_framework *fw, fwts_acpi_table_pcct_subspace_type_0 *entry, bool *passed)
> {
> - fwts_acpi_gas *gas = &entry->doorbell_register;
> uint64_t reserved;
>
> reserved = (uint64_t) entry->reserved[0] + ((uint64_t) entry->reserved[1] << 8) +
> @@ -95,19 +109,12 @@ static void generic_comm_test(fwts_framework *fw, fwts_acpi_table_pcct_subspace_
> fwts_log_info_simp_int(fw, " Base Address: ", entry->base_address);
> memory_length(fw, entry->header.type, entry->length, 8, passed);
> fwts_log_info_verbatim(fw, " Doorbell Register:");
> - fwts_log_info_simp_int(fw, " Address Space ID ", gas->address_space_id);
> - fwts_log_info_simp_int(fw, " Register Bit Width ", gas->register_bit_width);
> - fwts_log_info_simp_int(fw, " Register Bit Offset ", gas->register_bit_offset);
> - fwts_log_info_simp_int(fw, " Access Size ", gas->access_width);
> - fwts_log_info_simp_int(fw, " Address ", gas->address);
> + gas_messages2(fw, entry->header.type, &entry->doorbell_register, passed);
> fwts_log_info_simp_int(fw, " Doorbell Preserve: ", entry->doorbell_preserve);
> fwts_log_info_simp_int(fw, " Doorbell Write: ", entry->doorbell_write);
> fwts_log_info_simp_int(fw, " Nominal Latency: ", entry->nominal_latency);
> fwts_log_info_simp_int(fw, " Max Periodic Access Rate: ", entry->max_periodic_access_rate);
> fwts_log_info_simp_int(fw, " Min Request Turnaround Time: ", entry->min_request_turnaround_time);
> -
> - fwts_acpi_space_id_check(fw, "PCCT", "Subspace Type 0", passed, gas->address_space_id, 2,
> - FWTS_GAS_ADDR_SPACE_ID_SYSTEM_MEMORY, FWTS_GAS_ADDR_SPACE_ID_SYSTEM_IO);
> }
>
> static void hw_reduced_comm_test_type1(fwts_framework *fw, fwts_acpi_table_pcct_subspace_type_1 *entry, bool *passed)
> @@ -164,10 +171,10 @@ static void extended_pcc_test(fwts_framework *fw, fwts_acpi_table_pcct_subspace_
> fwts_log_info_simp_int(fw, " Nominal Latency: ", entry->nominal_latency);
> fwts_log_info_simp_int(fw, " Max Periodic Access Rate: ", entry->max_periodic_access_rate);
> fwts_log_info_simp_int(fw, " Min Request Turnaround Time: ", entry->min_request_turnaround_time);
> - fwts_log_info_verbatim(fw, " Command Complete Check Register:");
> + fwts_log_info_verbatim(fw, " Platform Int Ack Register:");
> gas_messages(fw, entry->header.type, &entry->platform_ack_register, passed);
> - fwts_log_info_simp_int(fw, " Doorbell Ack Preserve: ", entry->platform_ack_preserve);
> - fwts_log_info_simp_int(fw, " Doorbell Ack Write: ", entry->platform_ack_write);
> + fwts_log_info_verbatim(fw, " Platform Int Ack Preserve: 0x%16.16" PRIx64, entry->platform_ack_preserve);
> + fwts_log_info_verbatim(fw, " Platform Int Ack Write: 0x%16.16" PRIx64, entry->platform_ack_write);
> fwts_log_info_simp_int(fw, " Reserved: ", entry->reserved2);
> fwts_log_info_verbatim(fw, " Cmd Complete Check Register:");
> gas_messages(fw, entry->header.type, &entry->cmd_complete_register, passed);
> @@ -183,6 +190,25 @@ static void extended_pcc_test(fwts_framework *fw, fwts_acpi_table_pcct_subspace_
> fwts_acpi_reserved_bits_check(fw, "PCCT", "Platform Interrupt Flags", entry->platform_interrupt_flags, sizeof(uint8_t), 2, 7, passed);
> }
>
> +static void hw_registers_based_comm_test(fwts_framework *fw, fwts_acpi_table_pcct_subspace_type_5 *entry, bool *passed)
> +{
> + fwts_log_info_simp_int(fw, " Version: ", entry->version);
> + fwts_log_info_simp_int(fw, " Base Address: ", entry->base_address);
> + fwts_log_info_simp_int(fw, " Shared Memory Range Length: ", entry->shared_memory_range_length);
> + fwts_log_info_verbatim(fw, " Doorbell Register:");
> + gas_messages2(fw, entry->header.type, &entry->doorbell_register, passed);
> + fwts_log_info_simp_int(fw, " Doorbell Preserve: ", entry->doorbell_preserve);
> + fwts_log_info_simp_int(fw, " Doorbell Write: ", entry->doorbell_write);
> + fwts_log_info_verbatim(fw, " Cmd Complete Check Register:");
> + gas_messages2(fw, entry->header.type, &entry->cmd_complete_register, passed);
> + fwts_log_info_simp_int(fw, " Cmd Complete Check Mask: ", entry->cmd_complete_mask);
> + fwts_log_info_verbatim(fw, " Error Status Register:");
> + gas_messages2(fw, entry->header.type, &entry->error_status_register, passed);
> + fwts_log_info_simp_int(fw, " Error Status Mask: ", entry->error_status_mask);
> + fwts_log_info_simp_int(fw, " Nominal Latency: ", entry->nominal_latency);
> + fwts_log_info_simp_int(fw, " Min Request Turnaround Time: ", entry->min_request_turnaround_time);
> +}
> +
> static int pcct_test1(fwts_framework *fw)
> {
> fwts_acpi_table_pcct *pcct = (fwts_acpi_table_pcct*) table->data;
> @@ -265,6 +291,16 @@ static int pcct_test1(fwts_framework *fw)
>
> extended_pcc_test(fw, subspace, &passed);
>
> + } else if (pcct_sub->type == 5) {
> + fwts_acpi_table_pcct_subspace_type_5 *subspace = (fwts_acpi_table_pcct_subspace_type_5 *) pcct_sub;
> +
> + if(!subspace_length_equal(fw, 0, sizeof(fwts_acpi_table_pcct_subspace_type_5), pcct_sub->length)) {
> + passed = false;
> + break;
> + }
> +
> + hw_registers_based_comm_test(fw, subspace, &passed);
> +
> } else {
> passed = false;
> fwts_failed(fw, LOG_LEVEL_HIGH,
> diff --git a/src/lib/include/fwts_acpi.h b/src/lib/include/fwts_acpi.h
> index a00b0660..0f92bce1 100644
> --- a/src/lib/include/fwts_acpi.h
> +++ b/src/lib/include/fwts_acpi.h
> @@ -1553,6 +1553,22 @@ typedef struct {
> uint64_t error_status_mask;
> } __attribute__ ((packed)) fwts_acpi_table_pcct_subspace_type_3_4;
>
> +typedef struct {
> + fwts_acpi_table_pcct_subspace_header header;
> + uint16_t version;
> + uint64_t base_address;
> + uint64_t shared_memory_range_length;
> + fwts_acpi_gas doorbell_register;
> + uint64_t doorbell_preserve;
> + uint64_t doorbell_write;
> + fwts_acpi_gas cmd_complete_register;
> + uint64_t cmd_complete_mask;
> + fwts_acpi_gas error_status_register;
> + uint64_t error_status_mask;
> + uint32_t nominal_latency;
> + uint32_t min_request_turnaround_time;
> +} __attribute__ ((packed)) fwts_acpi_table_pcct_subspace_type_5;
> +
> /*
> * ACPI SPCR (Serial Port Console Redirection Table)
> * http://msdn.microsoft.com/en-us/library/windows/hardware/dn639132(v=vs.85).aspx
>
More information about the fwts-devel
mailing list