Skip to content

Commit

Permalink
Merge branch 'acpica'
Browse files Browse the repository at this point in the history
Merge ACPICA updates for 5.16-rc1:

 - Fix system-wide resume issue caused by evaluating control methods
   too early in the resume path (Rafael Wysocki).

 - Add support for Windows 2020 _OSI string (Mario Limonciello).

 - Add Generic Port Affinity type for SRAT (Alison Schofield).

 - Add disassembly support for the NHLT ACPI table (Bob Moore).

* acpica:
  ACPICA: Update version to 20210930
  ACPICA: iASL table disassembler: Added disassembly support for the NHLT ACPI table
  ACPICA: ACPI 6.4 SRAT: add Generic Port Affinity type
  ACPICA: Add support for Windows 2020 _OSI string
  ACPICA: Avoid evaluating methods too early during system resume
  • Loading branch information
rafaeljw committed Nov 2, 2021
2 parents d5a8fb6 + 93792be commit 9cb31aa
Show file tree
Hide file tree
Showing 9 changed files with 274 additions and 17 deletions.
2 changes: 2 additions & 0 deletions drivers/acpi/acpica/acglobal.h
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,8 @@ extern struct acpi_bit_register_info
acpi_gbl_bit_register_info[ACPI_NUM_BITREG];
ACPI_GLOBAL(u8, acpi_gbl_sleep_type_a);
ACPI_GLOBAL(u8, acpi_gbl_sleep_type_b);
ACPI_GLOBAL(u8, acpi_gbl_sleep_type_a_s0);
ACPI_GLOBAL(u8, acpi_gbl_sleep_type_b_s0);

/*****************************************************************************
*
Expand Down
8 changes: 2 additions & 6 deletions drivers/acpi/acpica/hwesleep.c
Original file line number Diff line number Diff line change
Expand Up @@ -147,17 +147,13 @@ acpi_status acpi_hw_extended_sleep(u8 sleep_state)

acpi_status acpi_hw_extended_wake_prep(u8 sleep_state)
{
acpi_status status;
u8 sleep_type_value;

ACPI_FUNCTION_TRACE(hw_extended_wake_prep);

status = acpi_get_sleep_type_data(ACPI_STATE_S0,
&acpi_gbl_sleep_type_a,
&acpi_gbl_sleep_type_b);
if (ACPI_SUCCESS(status)) {
if (acpi_gbl_sleep_type_a_s0 != ACPI_SLEEP_TYPE_INVALID) {
sleep_type_value =
((acpi_gbl_sleep_type_a << ACPI_X_SLEEP_TYPE_POSITION) &
((acpi_gbl_sleep_type_a_s0 << ACPI_X_SLEEP_TYPE_POSITION) &
ACPI_X_SLEEP_TYPE_MASK);

(void)acpi_write((u64)(sleep_type_value | ACPI_X_SLEEP_ENABLE),
Expand Down
11 changes: 4 additions & 7 deletions drivers/acpi/acpica/hwsleep.c
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ acpi_status acpi_hw_legacy_sleep(u8 sleep_state)

acpi_status acpi_hw_legacy_wake_prep(u8 sleep_state)
{
acpi_status status;
acpi_status status = AE_OK;
struct acpi_bit_register_info *sleep_type_reg_info;
struct acpi_bit_register_info *sleep_enable_reg_info;
u32 pm1a_control;
Expand All @@ -192,10 +192,7 @@ acpi_status acpi_hw_legacy_wake_prep(u8 sleep_state)
* This is unclear from the ACPI Spec, but it is required
* by some machines.
*/
status = acpi_get_sleep_type_data(ACPI_STATE_S0,
&acpi_gbl_sleep_type_a,
&acpi_gbl_sleep_type_b);
if (ACPI_SUCCESS(status)) {
if (acpi_gbl_sleep_type_a_s0 != ACPI_SLEEP_TYPE_INVALID) {
sleep_type_reg_info =
acpi_hw_get_bit_register_info(ACPI_BITREG_SLEEP_TYPE);
sleep_enable_reg_info =
Expand All @@ -216,9 +213,9 @@ acpi_status acpi_hw_legacy_wake_prep(u8 sleep_state)

/* Insert the SLP_TYP bits */

pm1a_control |= (acpi_gbl_sleep_type_a <<
pm1a_control |= (acpi_gbl_sleep_type_a_s0 <<
sleep_type_reg_info->bit_position);
pm1b_control |= (acpi_gbl_sleep_type_b <<
pm1b_control |= (acpi_gbl_sleep_type_b_s0 <<
sleep_type_reg_info->bit_position);

/* Write the control registers and ignore any errors */
Expand Down
7 changes: 7 additions & 0 deletions drivers/acpi/acpica/hwxfsleep.c
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,13 @@ acpi_status acpi_enter_sleep_state_prep(u8 sleep_state)
return_ACPI_STATUS(status);
}

status = acpi_get_sleep_type_data(ACPI_STATE_S0,
&acpi_gbl_sleep_type_a_s0,
&acpi_gbl_sleep_type_b_s0);
if (ACPI_FAILURE(status)) {
acpi_gbl_sleep_type_a_s0 = ACPI_SLEEP_TYPE_INVALID;
}

/* Execute the _PTS method (Prepare To Sleep) */

arg_list.count = 1;
Expand Down
1 change: 1 addition & 0 deletions drivers/acpi/acpica/utosi.c
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ static struct acpi_interface_info acpi_default_supported_interfaces[] = {
{"Windows 2018", NULL, 0, ACPI_OSI_WIN_10_RS4}, /* Windows 10 version 1803 - Added 11/2018 */
{"Windows 2018.2", NULL, 0, ACPI_OSI_WIN_10_RS5}, /* Windows 10 version 1809 - Added 11/2018 */
{"Windows 2019", NULL, 0, ACPI_OSI_WIN_10_19H1}, /* Windows 10 version 1903 - Added 08/2019 */
{"Windows 2020", NULL, 0, ACPI_OSI_WIN_10_20H1}, /* Windows 10 version 2004 - Added 08/2021 */

/* Feature Group Strings */

Expand Down
2 changes: 1 addition & 1 deletion include/acpi/acpixf.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

/* Current ACPICA subsystem version in YYYYMMDD format */

#define ACPI_CA_VERSION 0x20210730
#define ACPI_CA_VERSION 0x20210930

#include <acpi/acconfig.h>
#include <acpi/actypes.h>
Expand Down
250 changes: 249 additions & 1 deletion include/acpi/actbl2.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
#define ACPI_SIG_MSCT "MSCT" /* Maximum System Characteristics Table */
#define ACPI_SIG_MSDM "MSDM" /* Microsoft Data Management Table */
#define ACPI_SIG_NFIT "NFIT" /* NVDIMM Firmware Interface Table */
#define ACPI_SIG_NHLT "NHLT" /* Non HD Audio Link Table */
#define ACPI_SIG_PCCT "PCCT" /* Platform Communications Channel Table */
#define ACPI_SIG_PDTT "PDTT" /* Platform Debug Trigger Table */
#define ACPI_SIG_PHAT "PHAT" /* Platform Health Assessment Table */
Expand All @@ -46,7 +47,6 @@
#define ACPI_SIG_SBST "SBST" /* Smart Battery Specification Table */
#define ACPI_SIG_SDEI "SDEI" /* Software Delegated Exception Interface Table */
#define ACPI_SIG_SDEV "SDEV" /* Secure Devices table */
#define ACPI_SIG_NHLT "NHLT" /* Non-HDAudio Link Table */
#define ACPI_SIG_SVKL "SVKL" /* Storage Volume Key Location Table */

/*
Expand Down Expand Up @@ -1409,6 +1409,254 @@ struct nfit_device_handle {
#define ACPI_NFIT_GET_NODE_ID(handle) \
(((handle) & ACPI_NFIT_NODE_ID_MASK) >> ACPI_NFIT_NODE_ID_OFFSET)

/*******************************************************************************
*
* NHLT - Non HD Audio Link Table
*
* Conforms to: Intel Smart Sound Technology NHLT Specification
* Version 0.8.1, January 2020.
*
******************************************************************************/

/* Main table */

struct acpi_table_nhlt {
struct acpi_table_header header; /* Common ACPI table header */
u8 endpoint_count;
};

struct acpi_nhlt_endpoint {
u32 descriptor_length;
u8 link_type;
u8 instance_id;
u16 vendor_id;
u16 device_id;
u16 revision_id;
u32 subsystem_id;
u8 device_type;
u8 direction;
u8 virtual_bus_id;
};

/* Types for link_type field above */

#define ACPI_NHLT_RESERVED_HD_AUDIO 0
#define ACPI_NHLT_RESERVED_DSP 1
#define ACPI_NHLT_PDM 2
#define ACPI_NHLT_SSP 3
#define ACPI_NHLT_RESERVED_SLIMBUS 4
#define ACPI_NHLT_RESERVED_SOUNDWIRE 5
#define ACPI_NHLT_TYPE_RESERVED 6 /* 6 and above are reserved */

/* All other values above are reserved */

/* Values for device_id field above */

#define ACPI_NHLT_PDM_DMIC 0xAE20
#define ACPI_NHLT_BT_SIDEBAND 0xAE30
#define ACPI_NHLT_I2S_TDM_CODECS 0xAE23

/* Values for device_type field above */

/* SSP Link */

#define ACPI_NHLT_LINK_BT_SIDEBAND 0
#define ACPI_NHLT_LINK_FM 1
#define ACPI_NHLT_LINK_MODEM 2
/* 3 is reserved */
#define ACPI_NHLT_LINK_SSP_ANALOG_CODEC 4

/* PDM Link */

#define ACPI_NHLT_PDM_ON_CAVS_1P8 0
#define ACPI_NHLT_PDM_ON_CAVS_1P5 1

/* Values for Direction field above */

#define ACPI_NHLT_DIR_RENDER 0
#define ACPI_NHLT_DIR_CAPTURE 1
#define ACPI_NHLT_DIR_RENDER_LOOPBACK 2
#define ACPI_NHLT_DIR_RENDER_FEEDBACK 3
#define ACPI_NHLT_DIR_RESERVED 4 /* 4 and above are reserved */

struct acpi_nhlt_device_specific_config {
u32 capabilities_size;
u8 virtual_slot;
u8 config_type;
};

struct acpi_nhlt_device_specific_config_a {
u32 capabilities_size;
u8 virtual_slot;
u8 config_type;
u8 array_type;
};

/* Values for Config Type above */

#define ACPI_NHLT_TYPE_MIC_ARRAY 0x01
#define ACPI_NHLT_TYPE_GENERIC 0x00

/* Mask for Extension field of array_type */

#define ACPI_NHLT_ARRAY_TYPE_MASK 0x10

struct acpi_nhlt_device_specific_config_b {
u32 capabilities_size;
};

struct acpi_nhlt_device_specific_config_c {
u32 capabilities_size;
u8 virtual_slot;
};

struct acpi_nhlt_wave_extensible {
u16 format_tag;
u16 channel_count;
u32 samples_per_sec;
u32 avg_bytes_per_sec;
u16 block_align;
u16 bits_per_sample;
u16 extra_format_size;
u16 valid_bits_per_sample;
u32 channel_mask;
u8 sub_format_guid[16];
};

/* Values for channel_mask above */

#define ACPI_NHLT_SPKR_FRONT_LEFT 0x1
#define ACPI_NHLT_SPKR_FRONT_RIGHT 0x2
#define ACPI_NHLT_SPKR_FRONT_CENTER 0x4
#define ACPI_NHLT_SPKR_LOW_FREQ 0x8
#define ACPI_NHLT_SPKR_BACK_LEFT 0x10
#define ACPI_NHLT_SPKR_BACK_RIGHT 0x20
#define ACPI_NHLT_SPKR_FRONT_LEFT_OF_CENTER 0x40
#define ACPI_NHLT_SPKR_FRONT_RIGHT_OF_CENTER 0x80
#define ACPI_NHLT_SPKR_BACK_CENTER 0x100
#define ACPI_NHLT_SPKR_SIDE_LEFT 0x200
#define ACPI_NHLT_SPKR_SIDE_RIGHT 0x400
#define ACPI_NHLT_SPKR_TOP_CENTER 0x800
#define ACPI_NHLT_SPKR_TOP_FRONT_LEFT 0x1000
#define ACPI_NHLT_SPKR_TOP_FRONT_CENTER 0x2000
#define ACPI_NHLT_SPKR_TOP_FRONT_RIGHT 0x4000
#define ACPI_NHLT_SPKR_TOP_BACK_LEFT 0x8000
#define ACPI_NHLT_SPKR_TOP_BACK_CENTER 0x10000
#define ACPI_NHLT_SPKR_TOP_BACK_RIGHT 0x20000

struct acpi_nhlt_format_config {
struct acpi_nhlt_wave_extensible format;
u32 capability_size;
u8 capabilities[];
};

struct acpi_nhlt_formats_config {
u8 formats_count;
};

struct acpi_nhlt_device_specific_hdr {
u8 virtual_slot;
u8 config_type;
};

/* Types for config_type above */

#define ACPI_NHLT_GENERIC 0
#define ACPI_NHLT_MIC 1
#define ACPI_NHLT_RENDER 3

struct acpi_nhlt_mic_device_specific_config {
struct acpi_nhlt_device_specific_hdr device_config;
u8 array_type_ext;
};

/* Values for array_type_ext above */

#define SMALL_LINEAR_2ELEMENT 0x0A
#define BIG_LINEAR_2ELEMENT 0x0B
#define FIRST_GEOMETRY_LINEAR_4ELEMENT 0x0C
#define PLANAR_LSHAPED_4ELEMENT 0x0D
#define SECOND_GEOMETRY_LINEAR_4ELEMENT 0x0E
#define VENDOR_DEFINED 0x0F
#define ARRAY_TYPE_MASK 0x0F
#define ARRAY_TYPE_EXT_MASK 0x10

#define NO_EXTENSION 0x0
#define MIC_SNR_SENSITIVITY_EXT 0x1

struct acpi_nhlt_vendor_mic_config {
u8 type;
u8 panel;
u16 speaker_position_distance; // mm
u16 horizontal_offset; // mm
u16 vertical_offset; // mm
u8 frequency_low_band; // 5*hz
u8 frequency_high_band; // 500*hz
u16 direction_angle; // -180 - + 180
u16 elevation_angle; // -180 - + 180
u16 work_vertical_angle_begin; // -180 - + 180 with 2 deg step
u16 work_vertical_angle_end; // -180 - + 180 with 2 deg step
u16 work_horizontal_angle_begin; // -180 - + 180 with 2 deg step
u16 work_horizontal_angle_end; // -180 - + 180 with 2 deg step
};

/* Values for Type field above */

#define MIC_OMNIDIRECTIONAL 0
#define MIC_SUBCARDIOID 1
#define MIC_CARDIOID 2
#define MIC_SUPER_CARDIOID 3
#define MIC_HYPER_CARDIOID 4
#define MIC_8_SHAPED 5
#define MIC_VENDOR_DEFINED 7

/* Values for Panel field above */

#define MIC_TOP 0
#define MIC_BOTTOM 1
#define MIC_LEFT 2
#define MIC_RIGHT 3
#define MIC_FRONT 4
#define MIC_REAR 5

struct acpi_nhlt_vendor_mic_device_specific_config {
struct acpi_nhlt_mic_device_specific_config mic_array_device_config;
u8 number_of_microphones;
struct acpi_nhlt_vendor_mic_config mic_config[]; // indexed by number_of_microphones
};

/* Microphone SNR and Sensitivity extension */

struct acpi_nhlt_mic_snr_sensitivity_extension {
u32 SNR;
u32 sensitivity;
};

struct acpi_nhlt_render_feedback_device_specific_config {
struct acpi_nhlt_device_specific_config device_config;
u8 feedback_virtual_slot; // render slot in case of capture
u16 feedback_channels; // informative only
u16 feedback_valid_bits_per_sample;
};

/* Linux-specific structures */

struct acpi_nhlt_linux_specific_count {
u8 structure_count;
};

struct acpi_nhlt_linux_specific_data {
u8 device_id[16];
u8 device_instance_id;
u8 device_port_id;
u8 filler[18];
};

struct acpi_nhlt_table_terminator {
u32 terminator_value;
u32 terminator_signature;
};

/*******************************************************************************
*
* PCCT - Platform Communications Channel Table (ACPI 5.0)
Expand Down
9 changes: 7 additions & 2 deletions include/acpi/actbl3.h
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,8 @@ enum acpi_srat_type {
ACPI_SRAT_TYPE_GICC_AFFINITY = 3,
ACPI_SRAT_TYPE_GIC_ITS_AFFINITY = 4, /* ACPI 6.2 */
ACPI_SRAT_TYPE_GENERIC_AFFINITY = 5, /* ACPI 6.3 */
ACPI_SRAT_TYPE_RESERVED = 6 /* 5 and greater are reserved */
ACPI_SRAT_TYPE_GENERIC_PORT_AFFINITY = 6, /* ACPI 6.4 */
ACPI_SRAT_TYPE_RESERVED = 7 /* 7 and greater are reserved */
};

/*
Expand Down Expand Up @@ -272,7 +273,11 @@ struct acpi_srat_gic_its_affinity {
u32 its_id;
};

/* 5: Generic Initiator Affinity Structure (ACPI 6.3) */
/*
* Common structure for SRAT subtable types:
* 5: ACPI_SRAT_TYPE_GENERIC_AFFINITY
* 6: ACPI_SRAT_TYPE_GENERIC_PORT_AFFINITY
*/

struct acpi_srat_generic_affinity {
struct acpi_subtable_header header;
Expand Down
1 change: 1 addition & 0 deletions include/acpi/actypes.h
Original file line number Diff line number Diff line change
Expand Up @@ -1281,6 +1281,7 @@ typedef enum {
#define ACPI_OSI_WIN_10_RS4 0x12
#define ACPI_OSI_WIN_10_RS5 0x13
#define ACPI_OSI_WIN_10_19H1 0x14
#define ACPI_OSI_WIN_10_20H1 0x15

/* Definitions of getopt */

Expand Down

0 comments on commit 9cb31aa

Please sign in to comment.