[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