ACPI updates for 6.3-rc1
- Drop port I/O validation for some regions to avoid AML failures due to rejections of legitimate port I/O writes (Mario Limonciello). - Constify acpi_get_handle() pathname argument to allow its callers to pass const pathnames to it (Sakari Ailus). - Prevent acpi_ns_simple_repair() from crashing in some cases when AE_AML_NO_RETURN_VALUE should be returned (Daniil Tatianin). - Fix typo in CDAT DSMAS struct definition (Lukas Wunner). - Drop an unnecessary (void *) conversion from the ACPI processor driver (Zhou jie). - Modify the ACPI processor performance library code to use the "no limit" frequency QoS as appropriate and adjust the intel_pstate driver accordingly (Rafael Wysocki). - Add support for NBFT to the ACPI table parser (Stuart Hayes). - Introduce list of known non-PNP devices to avoid enumerating some of them as PNP devices (Rafael Wysocki). - Add x86 ACPI paths to the ACPI entry in MAINTAINERS to allow scripts to report the actual maintainers information (Rafael Wysocki). - Add two more entries to the ACPI IRQ override quirk list (Adam Niederer, Werner Sembach). - Add a pmic_i2c_address entry for Intel Bay Trail Crystal Cove to allow intel_soc_pmic_exec_mipi_pmic_seq_element() to be used with the Bay Trail Crystal Cove PMIC OpRegion driver (Hans de Goede). - Add comments with DSDT power OpRegion field names to the ACPI PMIC driver (Hans de Goede). - Fix string termination handling in the ACPI battery driver (Armin Wolf). - Limit error type to 32-bit width in the ACPI APEI error injection code (Shuai Xue). - Fix Lenovo Ideapad Z570 DMI match in the ACPI backlight driver (Hans de Goede). - Silence missing prototype warnings in some places in the ACPI-related code (Ammar Faizi). - Make kobj_type structures used in the ACPI code constant (Thomas Weißschuh). - Correct spelling in firmware-guide/ACPI (Randy Dunlap). - Clarify the meaning of Explicit and Implicit in the _DSD GPIO properties documentation (Andy Shevchenko). - Fix some kernel-doc comments in the ACPI CPPC library code (Yang Li). -----BEGIN PGP SIGNATURE----- iQJGBAABCAAwFiEE4fcc61cGeeHD/fCwgsRv/nhiVHEFAmPuJQISHHJqd0Byand5 c29ja2kubmV0AAoJEILEb/54YlRxZgwP/1gGRN2zb/gd1ErItRs5A8UxUJM4a0JG QnQlGVUFHOrBwAzU0lFc+zx6ahuVLcZLNClS2LrFah0Dp1k03A1ahhUDvPrekj3g u4IfHtVR4w4dVCwyVD01hvgRhuQVP6cTxLVDfTaa7ix23wLciahwxPgPUp6dZeNl r8CnX1Z+MN9Hn6YZEz1CemFj66lsYeWgeteT0Z7/T9yOTNTZHkLsQ4H7UlMu6XcU 54/FuTZ3KqgppqORKvxakbVQm/+w53bho1wjqrSRntWY+iIEOxzb9H77+fR9zR07 arkLuSYw5sRQ1eOANuH2fbQhAb68+aOJ9808mtGOSwQeUSm3KVFrXEepP1k/7N6O gYSIMeyBzYQ4CNMUNhwNDDfgmFaXhYA8kGJOVAO8Rxb+kq8itNU+JzKvFHe5gR6w A7hi0ZCFvWazEqAThJ2G03PJTJgE2xxzRjJqPzJ3XrUrRwEhjFi2YByjSYXtRIgW E+9FDLk1yf776Z4h9fsV+MB2QtcA9k1InJjUiemjV3SbGzF7bFj7JXipOZuOduzu pZVNLwbTdHobY0Wh3u3keZ1rUSBGIwH7nYaAcIpvNRN4NDYsPN/9Bo43JAzl+r0v 0iOD79cbjBuLslt1VhZjr0UDarzkkkZNoN/GCV3uoB6O6sKVQ8fWvWbJLm+fRX+L 2iu+oOl+ky80 =BoTs -----END PGP SIGNATURE----- Merge tag 'acpi-6.3-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm Pull ACPI updates from Rafael Wysocki: "These fix a frequency limit issue in the ACPI processor performance library code, fix a few issues in the ACPICA code, improve Crystal Cove support in the ACPI PMIC driver, fix string handling in the ACPI battery driver, add IRQ override quirks for a few machines more, fix other assorted problems and clean up code and documentation. Specifics: - Drop port I/O validation for some regions to avoid AML failures due to rejections of legitimate port I/O writes (Mario Limonciello) - Constify acpi_get_handle() pathname argument to allow its callers to pass const pathnames to it (Sakari Ailus) - Prevent acpi_ns_simple_repair() from crashing in some cases when AE_AML_NO_RETURN_VALUE should be returned (Daniil Tatianin) - Fix typo in CDAT DSMAS struct definition (Lukas Wunner) - Drop an unnecessary (void *) conversion from the ACPI processor driver (Zhou jie) - Modify the ACPI processor performance library code to use the "no limit" frequency QoS as appropriate and adjust the intel_pstate driver accordingly (Rafael Wysocki) - Add support for NBFT to the ACPI table parser (Stuart Hayes) - Introduce list of known non-PNP devices to avoid enumerating some of them as PNP devices (Rafael Wysocki) - Add x86 ACPI paths to the ACPI entry in MAINTAINERS to allow scripts to report the actual maintainers information (Rafael Wysocki) - Add two more entries to the ACPI IRQ override quirk list (Adam Niederer, Werner Sembach) - Add a pmic_i2c_address entry for Intel Bay Trail Crystal Cove to allow intel_soc_pmic_exec_mipi_pmic_seq_element() to be used with the Bay Trail Crystal Cove PMIC OpRegion driver (Hans de Goede) - Add comments with DSDT power OpRegion field names to the ACPI PMIC driver (Hans de Goede) - Fix string termination handling in the ACPI battery driver (Armin Wolf) - Limit error type to 32-bit width in the ACPI APEI error injection code (Shuai Xue) - Fix Lenovo Ideapad Z570 DMI match in the ACPI backlight driver (Hans de Goede) - Silence missing prototype warnings in some places in the ACPI-related code (Ammar Faizi) - Make kobj_type structures used in the ACPI code constant (Thomas Weißschuh) - Correct spelling in firmware-guide/ACPI (Randy Dunlap) - Clarify the meaning of Explicit and Implicit in the _DSD GPIO properties documentation (Andy Shevchenko) - Fix some kernel-doc comments in the ACPI CPPC library code (Yang Li)" * tag 'acpi-6.3-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: (25 commits) ACPI: make kobj_type structures constant Documentation: firmware-guide: gpio-properties: Clarify Explicit and Implicit ACPICA: Fix typo in CDAT DSMAS struct definition ACPI: resource: Do IRQ override on all TongFang GMxRGxx ACPI: resource: Add IRQ overrides for MAINGEAR Vector Pro 2 models ACPI: CPPC: Fix some kernel-doc comments ACPI: video: Fix Lenovo Ideapad Z570 DMI match Documentation: firmware-guide/ACPI: correct spelling ACPI: PMIC: Add comments with DSDT power opregion field names ACPI: battery: Increase maximum string length ACPI: battery: Fix buffer overread if not NUL-terminated ACPI: APEI: EINJ: Limit error type to 32-bit width MAINTAINERS: Add x86 ACPI paths to the ACPI entry ACPI: battery: Fix missing NUL-termination with large strings ACPI: PNP: Introduce list of known non-PNP devices ACPICA: nsrepair: handle cases without a return value correctly ACPI: Silence missing prototype warnings cpufreq: intel_pstate: Drop ACPI _PSS states table patching ACPI: processor: perflib: Avoid updating frequency QoS unnecessarily ACPI: processor: perflib: Use the "no limit" frequency QoS ...
This commit is contained in:
commit
88af9b164c
|
@ -34,7 +34,7 @@ state upon the last _LID evaluation. There won't be difference when the
|
|||
_LID control method is evaluated during the runtime, the problem is its
|
||||
initial returning value. When the AML tables implement this control method
|
||||
with cached value, the initial returning value is likely not reliable.
|
||||
There are platforms always retun "closed" as initial lid state.
|
||||
There are platforms always return "closed" as initial lid state.
|
||||
|
||||
Restrictions of the lid state change notifications
|
||||
==================================================
|
||||
|
|
|
@ -67,17 +67,30 @@ state of the output pin which driver should use during its initialization.
|
|||
Linux tries to use common sense here and derives the state from the bias
|
||||
and polarity settings. The table below shows the expectations:
|
||||
|
||||
========= ============= ==============
|
||||
Pull Bias Polarity Requested...
|
||||
========= ============= ==============
|
||||
Implicit x AS IS (assumed firmware configured for us)
|
||||
Explicit x (no _DSD) as Pull Bias (Up == High, Down == Low),
|
||||
assuming non-active (Polarity = !Pull Bias)
|
||||
Down Low as low, assuming active
|
||||
Down High as low, assuming non-active
|
||||
Up Low as high, assuming non-active
|
||||
Up High as high, assuming active
|
||||
========= ============= ==============
|
||||
+-------------+-------------+-----------------------------------------------+
|
||||
| Pull Bias | Polarity | Requested... |
|
||||
+=============+=============+===============================================+
|
||||
| Implicit |
|
||||
+-------------+-------------+-----------------------------------------------+
|
||||
| **Default** | x | AS IS (assumed firmware configured it for us) |
|
||||
+-------------+-------------+-----------------------------------------------+
|
||||
| Explicit |
|
||||
+-------------+-------------+-----------------------------------------------+
|
||||
| **None** | x | AS IS (assumed firmware configured it for us) |
|
||||
| | | with no Pull Bias |
|
||||
+-------------+-------------+-----------------------------------------------+
|
||||
| **Up** | x (no _DSD) | |
|
||||
| +-------------+ as high, assuming non-active |
|
||||
| | Low | |
|
||||
| +-------------+-----------------------------------------------+
|
||||
| | High | as high, assuming active |
|
||||
+-------------+-------------+-----------------------------------------------+
|
||||
| **Down** | x (no _DSD) | |
|
||||
| +-------------+ as low, assuming non-active |
|
||||
| | High | |
|
||||
| +-------------+-----------------------------------------------+
|
||||
| | Low | as low, assuming active |
|
||||
+-------------+-------------+-----------------------------------------------+
|
||||
|
||||
That said, for our above example the both GPIOs, since the bias setting
|
||||
is explicit and _DSD is present, will be treated as active with a high
|
||||
|
|
|
@ -31,7 +31,7 @@ Description Table). The XSDT always points to the FADT (Fixed ACPI
|
|||
Description Table) using its first entry, the data within the FADT
|
||||
includes various fixed-length entries that describe fixed ACPI features
|
||||
of the hardware. The FADT contains a pointer to the DSDT
|
||||
(Differentiated System Descripition Table). The XSDT also contains
|
||||
(Differentiated System Description Table). The XSDT also contains
|
||||
entries pointing to possibly multiple SSDTs (Secondary System
|
||||
Description Table).
|
||||
|
||||
|
|
|
@ -361,6 +361,8 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
|
|||
F: Documentation/ABI/testing/configfs-acpi
|
||||
F: Documentation/ABI/testing/sysfs-bus-acpi
|
||||
F: Documentation/firmware-guide/acpi/
|
||||
F: arch/x86/kernel/acpi/
|
||||
F: arch/x86/pci/acpi.c
|
||||
F: drivers/acpi/
|
||||
F: drivers/pci/*/*acpi*
|
||||
F: drivers/pci/*acpi*
|
||||
|
@ -19918,7 +19920,8 @@ L: linux-pm@vger.kernel.org
|
|||
S: Supported
|
||||
B: https://bugzilla.kernel.org
|
||||
F: Documentation/power/
|
||||
F: arch/x86/kernel/acpi/
|
||||
F: arch/x86/kernel/acpi/sleep*
|
||||
F: arch/x86/kernel/acpi/wakeup*
|
||||
F: drivers/base/power/
|
||||
F: include/linux/freezer.h
|
||||
F: include/linux/pm.h
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include <linux/acpi.h>
|
||||
#include <asm/msr.h>
|
||||
#include <asm/tsc.h>
|
||||
#include "internal.h"
|
||||
|
||||
struct lpit_residency_info {
|
||||
struct acpi_generic_address gaddr;
|
||||
|
|
|
@ -348,10 +348,22 @@ static bool acpi_pnp_match(const char *idstr, const struct acpi_device_id **matc
|
|||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* If one of the device IDs below is present in the list of device IDs of a
|
||||
* given ACPI device object, the PNP scan handler will not attach to that
|
||||
* object, because there is a proper non-PNP driver in the kernel for the
|
||||
* device represented by it.
|
||||
*/
|
||||
static const struct acpi_device_id acpi_nonpnp_device_ids[] = {
|
||||
{"INTC1080"},
|
||||
{"INTC1081"},
|
||||
{""},
|
||||
};
|
||||
|
||||
static int acpi_pnp_attach(struct acpi_device *adev,
|
||||
const struct acpi_device_id *id)
|
||||
{
|
||||
return 1;
|
||||
return !!acpi_match_device_ids(adev, acpi_nonpnp_device_ids);
|
||||
}
|
||||
|
||||
static struct acpi_scan_handler acpi_pnp_handler = {
|
||||
|
|
|
@ -23,8 +23,8 @@ acpi_hw_validate_io_request(acpi_io_address address, u32 bit_width);
|
|||
*
|
||||
* The table is used to implement the Microsoft port access rules that
|
||||
* first appeared in Windows XP. Some ports are always illegal, and some
|
||||
* ports are only illegal if the BIOS calls _OSI with a win_XP string or
|
||||
* later (meaning that the BIOS itelf is post-XP.)
|
||||
* ports are only illegal if the BIOS calls _OSI with nothing newer than
|
||||
* the specific _OSI strings.
|
||||
*
|
||||
* This provides ACPICA with the desired port protections and
|
||||
* Microsoft compatibility.
|
||||
|
@ -145,7 +145,8 @@ acpi_hw_validate_io_request(acpi_io_address address, u32 bit_width)
|
|||
|
||||
/* Port illegality may depend on the _OSI calls made by the BIOS */
|
||||
|
||||
if (acpi_gbl_osi_data >= port_info->osi_dependency) {
|
||||
if (port_info->osi_dependency == ACPI_ALWAYS_ILLEGAL ||
|
||||
acpi_gbl_osi_data == port_info->osi_dependency) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_VALUES,
|
||||
"Denied AML access to port 0x%8.8X%8.8X/%X (%s 0x%.4X-0x%.4X)\n",
|
||||
ACPI_FORMAT_UINT64(address),
|
||||
|
|
|
@ -181,8 +181,9 @@ acpi_ns_simple_repair(struct acpi_evaluate_info *info,
|
|||
* Try to fix if there was no return object. Warning if failed to fix.
|
||||
*/
|
||||
if (!return_object) {
|
||||
if (expected_btypes && (!(expected_btypes & ACPI_RTYPE_NONE))) {
|
||||
if (package_index != ACPI_NOT_PACKAGE_ELEMENT) {
|
||||
if (expected_btypes) {
|
||||
if (!(expected_btypes & ACPI_RTYPE_NONE) &&
|
||||
package_index != ACPI_NOT_PACKAGE_ELEMENT) {
|
||||
ACPI_WARN_PREDEFINED((AE_INFO,
|
||||
info->full_pathname,
|
||||
ACPI_WARN_ALWAYS,
|
||||
|
@ -196,14 +197,15 @@ acpi_ns_simple_repair(struct acpi_evaluate_info *info,
|
|||
if (ACPI_SUCCESS(status)) {
|
||||
return (AE_OK); /* Repair was successful */
|
||||
}
|
||||
} else {
|
||||
}
|
||||
|
||||
if (expected_btypes != ACPI_RTYPE_NONE) {
|
||||
ACPI_WARN_PREDEFINED((AE_INFO,
|
||||
info->full_pathname,
|
||||
ACPI_WARN_ALWAYS,
|
||||
"Missing expected return value"));
|
||||
return (AE_AML_NO_RETURN_VALUE);
|
||||
}
|
||||
|
||||
return (AE_AML_NO_RETURN_VALUE);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -44,7 +44,7 @@ static char *acpi_ns_copy_device_id(struct acpi_pnp_device_id *dest,
|
|||
|
||||
acpi_status
|
||||
acpi_get_handle(acpi_handle parent,
|
||||
acpi_string pathname, acpi_handle *ret_handle)
|
||||
const char *pathname, acpi_handle *ret_handle)
|
||||
{
|
||||
acpi_status status;
|
||||
struct acpi_namespace_node *node = NULL;
|
||||
|
|
|
@ -616,6 +616,10 @@ static int error_type_set(void *data, u64 val)
|
|||
u32 available_error_type = 0;
|
||||
u32 tval, vendor;
|
||||
|
||||
/* Only low 32 bits for error type are valid */
|
||||
if (val & GENMASK_ULL(63, 32))
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* Vendor defined types have 0x80000000 bit set, and
|
||||
* are not enumerated by ACPI_EINJ_GET_ERROR_TYPE
|
||||
|
|
|
@ -42,6 +42,8 @@
|
|||
#define ACPI_BATTERY_STATE_CHARGING 0x2
|
||||
#define ACPI_BATTERY_STATE_CRITICAL 0x4
|
||||
|
||||
#define MAX_STRING_LENGTH 64
|
||||
|
||||
MODULE_AUTHOR("Paul Diefenbaugh");
|
||||
MODULE_AUTHOR("Alexey Starikovskiy <astarikovskiy@suse.de>");
|
||||
MODULE_DESCRIPTION("ACPI Battery Driver");
|
||||
|
@ -118,10 +120,10 @@ struct acpi_battery {
|
|||
int capacity_granularity_1;
|
||||
int capacity_granularity_2;
|
||||
int alarm;
|
||||
char model_number[32];
|
||||
char serial_number[32];
|
||||
char type[32];
|
||||
char oem_info[32];
|
||||
char model_number[MAX_STRING_LENGTH];
|
||||
char serial_number[MAX_STRING_LENGTH];
|
||||
char type[MAX_STRING_LENGTH];
|
||||
char oem_info[MAX_STRING_LENGTH];
|
||||
int state;
|
||||
int power_unit;
|
||||
unsigned long flags;
|
||||
|
@ -437,16 +439,25 @@ static int extract_package(struct acpi_battery *battery,
|
|||
element = &package->package.elements[i];
|
||||
if (offsets[i].mode) {
|
||||
u8 *ptr = (u8 *)battery + offsets[i].offset;
|
||||
u32 len = MAX_STRING_LENGTH;
|
||||
|
||||
if (element->type == ACPI_TYPE_STRING ||
|
||||
element->type == ACPI_TYPE_BUFFER)
|
||||
strncpy(ptr, element->string.pointer, 32);
|
||||
else if (element->type == ACPI_TYPE_INTEGER) {
|
||||
strncpy(ptr, (u8 *)&element->integer.value,
|
||||
sizeof(u64));
|
||||
ptr[sizeof(u64)] = 0;
|
||||
} else
|
||||
switch (element->type) {
|
||||
case ACPI_TYPE_BUFFER:
|
||||
if (len > element->buffer.length + 1)
|
||||
len = element->buffer.length + 1;
|
||||
|
||||
fallthrough;
|
||||
case ACPI_TYPE_STRING:
|
||||
strscpy(ptr, element->string.pointer, len);
|
||||
|
||||
break;
|
||||
case ACPI_TYPE_INTEGER:
|
||||
strscpy(ptr, (u8 *)&element->integer.value, sizeof(u64) + 1);
|
||||
|
||||
break;
|
||||
default:
|
||||
*ptr = 0; /* don't have value */
|
||||
}
|
||||
} else {
|
||||
int *x = (int *)((u8 *)battery + offsets[i].offset);
|
||||
*x = (element->type == ACPI_TYPE_INTEGER) ?
|
||||
|
|
|
@ -193,7 +193,7 @@ static struct attribute *cppc_attrs[] = {
|
|||
};
|
||||
ATTRIBUTE_GROUPS(cppc);
|
||||
|
||||
static struct kobj_type cppc_ktype = {
|
||||
static const struct kobj_type cppc_ktype = {
|
||||
.sysfs_ops = &kobj_sysfs_ops,
|
||||
.default_groups = cppc_groups,
|
||||
};
|
||||
|
@ -595,6 +595,7 @@ bool __weak cpc_supported_by_cpu(void)
|
|||
|
||||
/**
|
||||
* pcc_data_alloc() - Allocate the pcc_data memory for pcc subspace
|
||||
* @pcc_ss_id: PCC Subspace index as in the PCC client ACPI package.
|
||||
*
|
||||
* Check and allocate the cppc_pcc_data memory.
|
||||
* In some processor configurations it is possible that same subspace
|
||||
|
@ -1603,6 +1604,7 @@ EXPORT_SYMBOL_GPL(cppc_set_perf);
|
|||
|
||||
/**
|
||||
* cppc_get_transition_latency - returns frequency transition latency in ns
|
||||
* @cpu_num: CPU number for per_cpu().
|
||||
*
|
||||
* ACPI CPPC does not explicitly specify how a platform can specify the
|
||||
* transition latency for performance change requests. The closest we have
|
||||
|
|
|
@ -78,7 +78,7 @@ static void acpi_data_node_release(struct kobject *kobj)
|
|||
complete(&dn->kobj_done);
|
||||
}
|
||||
|
||||
static struct kobj_type acpi_data_node_ktype = {
|
||||
static const struct kobj_type acpi_data_node_ktype = {
|
||||
.sysfs_ops = &acpi_data_node_sysfs_ops,
|
||||
.default_groups = acpi_data_node_default_groups,
|
||||
.release = acpi_data_node_release,
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include <linux/acpi.h>
|
||||
#include <linux/pci.h>
|
||||
#include <acpi/acpi.h>
|
||||
#include "internal.h"
|
||||
|
||||
struct acpi_pci_ioapic {
|
||||
acpi_handle root_handle;
|
||||
|
|
|
@ -283,6 +283,7 @@ static const struct intel_pmic_opregion_data intel_crc_pmic_opregion_data = {
|
|||
.power_table_count= ARRAY_SIZE(power_table),
|
||||
.thermal_table = thermal_table,
|
||||
.thermal_table_count = ARRAY_SIZE(thermal_table),
|
||||
.pmic_i2c_address = 0x6e,
|
||||
};
|
||||
|
||||
static int intel_crc_pmic_opregion_probe(struct platform_device *pdev)
|
||||
|
|
|
@ -20,19 +20,19 @@
|
|||
#define CHTDC_TI_GPADC 0x5a
|
||||
|
||||
static struct pmic_table chtdc_ti_power_table[] = {
|
||||
{ .address = 0x00, .reg = 0x41 },
|
||||
{ .address = 0x04, .reg = 0x42 },
|
||||
{ .address = 0x08, .reg = 0x43 },
|
||||
{ .address = 0x0c, .reg = 0x45 },
|
||||
{ .address = 0x10, .reg = 0x46 },
|
||||
{ .address = 0x14, .reg = 0x47 },
|
||||
{ .address = 0x18, .reg = 0x48 },
|
||||
{ .address = 0x1c, .reg = 0x49 },
|
||||
{ .address = 0x20, .reg = 0x4a },
|
||||
{ .address = 0x24, .reg = 0x4b },
|
||||
{ .address = 0x28, .reg = 0x4c },
|
||||
{ .address = 0x2c, .reg = 0x4d },
|
||||
{ .address = 0x30, .reg = 0x4e },
|
||||
{ .address = 0x00, .reg = 0x41 }, /* LDO1 */
|
||||
{ .address = 0x04, .reg = 0x42 }, /* LDO2 */
|
||||
{ .address = 0x08, .reg = 0x43 }, /* LDO3 */
|
||||
{ .address = 0x0c, .reg = 0x45 }, /* LDO5 */
|
||||
{ .address = 0x10, .reg = 0x46 }, /* LDO6 */
|
||||
{ .address = 0x14, .reg = 0x47 }, /* LDO7 */
|
||||
{ .address = 0x18, .reg = 0x48 }, /* LDO8 */
|
||||
{ .address = 0x1c, .reg = 0x49 }, /* LDO9 */
|
||||
{ .address = 0x20, .reg = 0x4a }, /* LD10 */
|
||||
{ .address = 0x24, .reg = 0x4b }, /* LD11 */
|
||||
{ .address = 0x28, .reg = 0x4c }, /* LD12 */
|
||||
{ .address = 0x2c, .reg = 0x4d }, /* LD13 */
|
||||
{ .address = 0x30, .reg = 0x4e }, /* LD14 */
|
||||
};
|
||||
|
||||
static struct pmic_table chtdc_ti_thermal_table[] = {
|
||||
|
|
|
@ -147,7 +147,7 @@ static void lapic_timer_check_state(int state, struct acpi_processor *pr,
|
|||
|
||||
static void __lapic_timer_propagate_broadcast(void *arg)
|
||||
{
|
||||
struct acpi_processor *pr = (struct acpi_processor *) arg;
|
||||
struct acpi_processor *pr = arg;
|
||||
|
||||
if (pr->power.timer_broadcast_on_state < INT_MAX)
|
||||
tick_broadcast_enable();
|
||||
|
|
|
@ -53,6 +53,8 @@ static int acpi_processor_get_platform_limit(struct acpi_processor *pr)
|
|||
{
|
||||
acpi_status status = 0;
|
||||
unsigned long long ppc = 0;
|
||||
s32 qos_value;
|
||||
int index;
|
||||
int ret;
|
||||
|
||||
if (!pr)
|
||||
|
@ -72,17 +74,30 @@ static int acpi_processor_get_platform_limit(struct acpi_processor *pr)
|
|||
}
|
||||
}
|
||||
|
||||
pr_debug("CPU %d: _PPC is %d - frequency %s limited\n", pr->id,
|
||||
(int)ppc, ppc ? "" : "not");
|
||||
index = ppc;
|
||||
|
||||
pr->performance_platform_limit = (int)ppc;
|
||||
|
||||
if (ppc >= pr->performance->state_count ||
|
||||
unlikely(!freq_qos_request_active(&pr->perflib_req)))
|
||||
if (pr->performance_platform_limit == index ||
|
||||
ppc >= pr->performance->state_count)
|
||||
return 0;
|
||||
|
||||
ret = freq_qos_update_request(&pr->perflib_req,
|
||||
pr->performance->states[ppc].core_frequency * 1000);
|
||||
pr_debug("CPU %d: _PPC is %d - frequency %s limited\n", pr->id,
|
||||
index, index ? "is" : "is not");
|
||||
|
||||
pr->performance_platform_limit = index;
|
||||
|
||||
if (unlikely(!freq_qos_request_active(&pr->perflib_req)))
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* If _PPC returns 0, it means that all of the available states can be
|
||||
* used ("no limit").
|
||||
*/
|
||||
if (index == 0)
|
||||
qos_value = FREQ_QOS_MAX_DEFAULT_VALUE;
|
||||
else
|
||||
qos_value = pr->performance->states[index].core_frequency * 1000;
|
||||
|
||||
ret = freq_qos_update_request(&pr->perflib_req, qos_value);
|
||||
if (ret < 0) {
|
||||
pr_warn("Failed to update perflib freq constraint: CPU%d (%d)\n",
|
||||
pr->id, ret);
|
||||
|
@ -166,9 +181,16 @@ void acpi_processor_ppc_init(struct cpufreq_policy *policy)
|
|||
if (!pr)
|
||||
continue;
|
||||
|
||||
/*
|
||||
* Reset performance_platform_limit in case there is a stale
|
||||
* value in it, so as to make it match the "no limit" QoS value
|
||||
* below.
|
||||
*/
|
||||
pr->performance_platform_limit = 0;
|
||||
|
||||
ret = freq_qos_add_request(&policy->constraints,
|
||||
&pr->perflib_req,
|
||||
FREQ_QOS_MAX, INT_MAX);
|
||||
&pr->perflib_req, FREQ_QOS_MAX,
|
||||
FREQ_QOS_MAX_DEFAULT_VALUE);
|
||||
if (ret < 0)
|
||||
pr_err("Failed to add freq constraint for CPU%d (%d)\n",
|
||||
cpu, ret);
|
||||
|
|
|
@ -467,17 +467,34 @@ static const struct dmi_system_id lenovo_laptop[] = {
|
|||
{ }
|
||||
};
|
||||
|
||||
static const struct dmi_system_id schenker_gm_rg[] = {
|
||||
static const struct dmi_system_id tongfang_gm_rg[] = {
|
||||
{
|
||||
.ident = "XMG CORE 15 (M22)",
|
||||
.ident = "TongFang GMxRGxx/XMG CORE 15 (M22)/TUXEDO Stellaris 15 Gen4 AMD",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "SchenkerTechnologiesGmbH"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "GMxRGxx"),
|
||||
},
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
static const struct dmi_system_id maingear_laptop[] = {
|
||||
{
|
||||
.ident = "MAINGEAR Vector Pro 2 15",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Micro Electronics Inc"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "MG-VCP2-15A3070T"),
|
||||
}
|
||||
},
|
||||
{
|
||||
.ident = "MAINGEAR Vector Pro 2 17",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Micro Electronics Inc"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "MG-VCP2-17A3070T"),
|
||||
},
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
struct irq_override_cmp {
|
||||
const struct dmi_system_id *system;
|
||||
unsigned char irq;
|
||||
|
@ -492,7 +509,8 @@ static const struct irq_override_cmp override_table[] = {
|
|||
{ asus_laptop, 1, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW, 0, false },
|
||||
{ lenovo_laptop, 6, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW, 0, true },
|
||||
{ lenovo_laptop, 10, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW, 0, true },
|
||||
{ schenker_gm_rg, 1, ACPI_EDGE_SENSITIVE, ACPI_ACTIVE_LOW, 1, true },
|
||||
{ tongfang_gm_rg, 1, ACPI_EDGE_SENSITIVE, ACPI_ACTIVE_LOW, 1, true },
|
||||
{ maingear_laptop, 1, ACPI_EDGE_SENSITIVE, ACPI_ACTIVE_LOW, 1, true },
|
||||
};
|
||||
|
||||
static bool acpi_dev_irq_override(u32 gsi, u8 triggering, u8 polarity,
|
||||
|
|
|
@ -953,7 +953,7 @@ static struct attribute *hotplug_profile_attrs[] = {
|
|||
};
|
||||
ATTRIBUTE_GROUPS(hotplug_profile);
|
||||
|
||||
static struct kobj_type acpi_hotplug_profile_ktype = {
|
||||
static const struct kobj_type acpi_hotplug_profile_ktype = {
|
||||
.sysfs_ops = &kobj_sysfs_ops,
|
||||
.default_groups = hotplug_profile_groups,
|
||||
};
|
||||
|
|
|
@ -555,7 +555,8 @@ static const char table_sigs[][ACPI_NAMESEG_SIZE] __initconst = {
|
|||
ACPI_SIG_WDDT, ACPI_SIG_WDRT, ACPI_SIG_DSDT, ACPI_SIG_FADT,
|
||||
ACPI_SIG_PSDT, ACPI_SIG_RSDT, ACPI_SIG_XSDT, ACPI_SIG_SSDT,
|
||||
ACPI_SIG_IORT, ACPI_SIG_NFIT, ACPI_SIG_HMAT, ACPI_SIG_PPTT,
|
||||
ACPI_SIG_NHLT, ACPI_SIG_AEST, ACPI_SIG_CEDT, ACPI_SIG_AGDI };
|
||||
ACPI_SIG_NHLT, ACPI_SIG_AEST, ACPI_SIG_CEDT, ACPI_SIG_AGDI,
|
||||
ACPI_SIG_NBFT };
|
||||
|
||||
#define ACPI_HEADER_SIZE sizeof(struct acpi_table_header)
|
||||
|
||||
|
|
|
@ -434,7 +434,7 @@ static const struct dmi_system_id video_detect_dmi_table[] = {
|
|||
/* Lenovo Ideapad Z570 */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "102434U"),
|
||||
DMI_MATCH(DMI_PRODUCT_VERSION, "Ideapad Z570"),
|
||||
},
|
||||
},
|
||||
{
|
||||
|
|
|
@ -452,20 +452,6 @@ static void intel_pstate_init_acpi_perf_limits(struct cpufreq_policy *policy)
|
|||
(u32) cpu->acpi_perf_data.states[i].control);
|
||||
}
|
||||
|
||||
/*
|
||||
* The _PSS table doesn't contain whole turbo frequency range.
|
||||
* This just contains +1 MHZ above the max non turbo frequency,
|
||||
* with control value corresponding to max turbo ratio. But
|
||||
* when cpufreq set policy is called, it will call with this
|
||||
* max frequency, which will cause a reduced performance as
|
||||
* this driver uses real max turbo frequency as the max
|
||||
* frequency. So correct this frequency in _PSS table to
|
||||
* correct max turbo frequency based on the turbo state.
|
||||
* Also need to convert to MHz as _PSS freq is in MHz.
|
||||
*/
|
||||
if (!global.turbo_disabled)
|
||||
cpu->acpi_perf_data.states[0].core_frequency =
|
||||
policy->cpuinfo.max_freq / 1000;
|
||||
cpu->valid_pss_table = true;
|
||||
pr_debug("_PPC limits will be enforced\n");
|
||||
|
||||
|
|
|
@ -526,7 +526,7 @@ ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
|||
struct acpi_buffer *ret_path_ptr))
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_get_handle(acpi_handle parent,
|
||||
acpi_string pathname,
|
||||
const char *pathname,
|
||||
acpi_handle *ret_handle))
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_attach_data(acpi_handle object,
|
||||
|
|
|
@ -50,6 +50,8 @@
|
|||
#define ACPI_SIG_S3PT "S3PT" /* S3 Performance (sub)Table */
|
||||
#define ACPI_SIG_PCCS "PCC" /* PCC Shared Memory Region */
|
||||
|
||||
#define ACPI_SIG_NBFT "NBFT" /* NVMe Boot Firmware Table */
|
||||
|
||||
/* Reserved table signatures */
|
||||
|
||||
#define ACPI_SIG_MATR "MATR" /* Memory Address Translation Table */
|
||||
|
@ -344,7 +346,7 @@ enum acpi_cdat_type {
|
|||
|
||||
/* Subtable 0: Device Scoped Memory Affinity Structure (DSMAS) */
|
||||
|
||||
struct acpi_cadt_dsmas {
|
||||
struct acpi_cdat_dsmas {
|
||||
u8 dsmad_handle;
|
||||
u8 flags;
|
||||
u16 reserved;
|
||||
|
|
Loading…
Reference in New Issue