Commit d2c2ba69 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki

Merge branches 'acpi-soc', 'acpi-battery', 'acpi-video', 'acpi-cppc' and 'acpi-apei'

* acpi-soc:
  ACPI / LPSS: enable hard LLP for DMA
  ACPI / APD: Add clock frequency for future AMD I2C controller

* acpi-battery:
  ACPI / battery: If _BIX fails, retry with _BIF

* acpi-video:
  ACPI / video: Add force_native quirk for HP Pavilion dv6
  ACPI / video: Add force_native quirk for Dell XPS 17 L702X
  ACPI / video: Move ACPI_VIDEO_NOTIFY_* defines to acpi/video.h

* acpi-cppc:
  ACPI / CPPC: set an error code on probe error path

* acpi-apei:
  ACPI / APEI / ARM64: APEI initial support for ARM64
  ACPI / APEI: Fix NMI notification handling
...@@ -52,6 +52,7 @@ config ARM64 ...@@ -52,6 +52,7 @@ config ARM64
select GENERIC_TIME_VSYSCALL select GENERIC_TIME_VSYSCALL
select HANDLE_DOMAIN_IRQ select HANDLE_DOMAIN_IRQ
select HARDIRQS_SW_RESEND select HARDIRQS_SW_RESEND
select HAVE_ACPI_APEI if (ACPI && EFI)
select HAVE_ALIGNED_STRUCT_PAGE if SLUB select HAVE_ALIGNED_STRUCT_PAGE if SLUB
select HAVE_ARCH_AUDITSYSCALL select HAVE_ARCH_AUDITSYSCALL
select HAVE_ARCH_BITREVERSE select HAVE_ARCH_BITREVERSE
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include <asm/cputype.h> #include <asm/cputype.h>
#include <asm/smp_plat.h> #include <asm/smp_plat.h>
#include <asm/tlbflush.h>
/* Macros for consistency checks of the GICC subtable of MADT */ /* Macros for consistency checks of the GICC subtable of MADT */
#define ACPI_MADT_GICC_LENGTH \ #define ACPI_MADT_GICC_LENGTH \
...@@ -114,8 +115,28 @@ static inline const char *acpi_get_enable_method(int cpu) ...@@ -114,8 +115,28 @@ static inline const char *acpi_get_enable_method(int cpu)
} }
#ifdef CONFIG_ACPI_APEI #ifdef CONFIG_ACPI_APEI
/*
* acpi_disable_cmcff is used in drivers/acpi/apei/hest.c for disabling
* IA-32 Architecture Corrected Machine Check (CMC) Firmware-First mode
* with a kernel command line parameter "acpi=nocmcoff". But we don't
* have this IA-32 specific feature on ARM64, this definition is only
* for compatibility.
*/
#define acpi_disable_cmcff 1
pgprot_t arch_apei_get_mem_attribute(phys_addr_t addr); pgprot_t arch_apei_get_mem_attribute(phys_addr_t addr);
#endif
/*
* Despite its name, this function must still broadcast the TLB
* invalidation in order to ensure other CPUs don't end up with junk
* entries as a result of speculation. Unusually, its also called in
* IRQ context (ghes_iounmap_irq) so if we ever need to use IPIs for
* TLB broadcasting, then we're in trouble here.
*/
static inline void arch_apei_flush_tlb_one(unsigned long addr)
{
flush_tlb_kernel_range(addr, addr + PAGE_SIZE);
}
#endif /* CONFIG_ACPI_APEI */
#ifdef CONFIG_ACPI_NUMA #ifdef CONFIG_ACPI_NUMA
int arm64_acpi_numa_init(void); int arm64_acpi_numa_init(void);
......
...@@ -24,9 +24,6 @@ int arch_apei_enable_cmcff(struct acpi_hest_header *hest_hdr, void *data) ...@@ -24,9 +24,6 @@ int arch_apei_enable_cmcff(struct acpi_hest_header *hest_hdr, void *data)
struct acpi_hest_ia_corrected *cmc; struct acpi_hest_ia_corrected *cmc;
struct acpi_hest_ia_error_bank *mc_bank; struct acpi_hest_ia_error_bank *mc_bank;
if (hest_hdr->type != ACPI_HEST_TYPE_IA32_CORRECTED_CHECK)
return 0;
cmc = (struct acpi_hest_ia_corrected *)hest_hdr; cmc = (struct acpi_hest_ia_corrected *)hest_hdr;
if (!cmc->enabled) if (!cmc->enabled)
return 0; return 0;
......
...@@ -77,6 +77,11 @@ static const struct apd_device_desc cz_i2c_desc = { ...@@ -77,6 +77,11 @@ static const struct apd_device_desc cz_i2c_desc = {
.fixed_clk_rate = 133000000, .fixed_clk_rate = 133000000,
}; };
static const struct apd_device_desc wt_i2c_desc = {
.setup = acpi_apd_setup,
.fixed_clk_rate = 150000000,
};
static struct property_entry uart_properties[] = { static struct property_entry uart_properties[] = {
PROPERTY_ENTRY_U32("reg-io-width", 4), PROPERTY_ENTRY_U32("reg-io-width", 4),
PROPERTY_ENTRY_U32("reg-shift", 2), PROPERTY_ENTRY_U32("reg-shift", 2),
...@@ -156,7 +161,7 @@ static const struct acpi_device_id acpi_apd_device_ids[] = { ...@@ -156,7 +161,7 @@ static const struct acpi_device_id acpi_apd_device_ids[] = {
/* Generic apd devices */ /* Generic apd devices */
#ifdef CONFIG_X86_AMD_PLATFORM_DEVICE #ifdef CONFIG_X86_AMD_PLATFORM_DEVICE
{ "AMD0010", APD_ADDR(cz_i2c_desc) }, { "AMD0010", APD_ADDR(cz_i2c_desc) },
{ "AMDI0010", APD_ADDR(cz_i2c_desc) }, { "AMDI0010", APD_ADDR(wt_i2c_desc) },
{ "AMD0020", APD_ADDR(cz_uart_desc) }, { "AMD0020", APD_ADDR(cz_uart_desc) },
{ "AMDI0020", APD_ADDR(cz_uart_desc) }, { "AMDI0020", APD_ADDR(cz_uart_desc) },
{ "AMD0030", }, { "AMD0030", },
......
...@@ -718,13 +718,14 @@ static int acpi_lpss_resume_early(struct device *dev) ...@@ -718,13 +718,14 @@ static int acpi_lpss_resume_early(struct device *dev)
#define LPSS_GPIODEF0_DMA1_D3 BIT(2) #define LPSS_GPIODEF0_DMA1_D3 BIT(2)
#define LPSS_GPIODEF0_DMA2_D3 BIT(3) #define LPSS_GPIODEF0_DMA2_D3 BIT(3)
#define LPSS_GPIODEF0_DMA_D3_MASK GENMASK(3, 2) #define LPSS_GPIODEF0_DMA_D3_MASK GENMASK(3, 2)
#define LPSS_GPIODEF0_DMA_LLP BIT(13)
static DEFINE_MUTEX(lpss_iosf_mutex); static DEFINE_MUTEX(lpss_iosf_mutex);
static void lpss_iosf_enter_d3_state(void) static void lpss_iosf_enter_d3_state(void)
{ {
u32 value1 = 0; u32 value1 = 0;
u32 mask1 = LPSS_GPIODEF0_DMA_D3_MASK; u32 mask1 = LPSS_GPIODEF0_DMA_D3_MASK | LPSS_GPIODEF0_DMA_LLP;
u32 value2 = LPSS_PMCSR_D3hot; u32 value2 = LPSS_PMCSR_D3hot;
u32 mask2 = LPSS_PMCSR_Dx_MASK; u32 mask2 = LPSS_PMCSR_Dx_MASK;
/* /*
...@@ -768,8 +769,9 @@ static void lpss_iosf_enter_d3_state(void) ...@@ -768,8 +769,9 @@ static void lpss_iosf_enter_d3_state(void)
static void lpss_iosf_exit_d3_state(void) static void lpss_iosf_exit_d3_state(void)
{ {
u32 value1 = LPSS_GPIODEF0_DMA1_D3 | LPSS_GPIODEF0_DMA2_D3; u32 value1 = LPSS_GPIODEF0_DMA1_D3 | LPSS_GPIODEF0_DMA2_D3 |
u32 mask1 = LPSS_GPIODEF0_DMA_D3_MASK; LPSS_GPIODEF0_DMA_LLP;
u32 mask1 = LPSS_GPIODEF0_DMA_D3_MASK | LPSS_GPIODEF0_DMA_LLP;
u32 value2 = LPSS_PMCSR_D0; u32 value2 = LPSS_PMCSR_D0;
u32 mask2 = LPSS_PMCSR_Dx_MASK; u32 mask2 = LPSS_PMCSR_Dx_MASK;
......
...@@ -43,17 +43,6 @@ ...@@ -43,17 +43,6 @@
#define ACPI_VIDEO_BUS_NAME "Video Bus" #define ACPI_VIDEO_BUS_NAME "Video Bus"
#define ACPI_VIDEO_DEVICE_NAME "Video Device" #define ACPI_VIDEO_DEVICE_NAME "Video Device"
#define ACPI_VIDEO_NOTIFY_SWITCH 0x80
#define ACPI_VIDEO_NOTIFY_PROBE 0x81
#define ACPI_VIDEO_NOTIFY_CYCLE 0x82
#define ACPI_VIDEO_NOTIFY_NEXT_OUTPUT 0x83
#define ACPI_VIDEO_NOTIFY_PREV_OUTPUT 0x84
#define ACPI_VIDEO_NOTIFY_CYCLE_BRIGHTNESS 0x85
#define ACPI_VIDEO_NOTIFY_INC_BRIGHTNESS 0x86
#define ACPI_VIDEO_NOTIFY_DEC_BRIGHTNESS 0x87
#define ACPI_VIDEO_NOTIFY_ZERO_BRIGHTNESS 0x88
#define ACPI_VIDEO_NOTIFY_DISPLAY_OFF 0x89
#define MAX_NAME_LEN 20 #define MAX_NAME_LEN 20
......
...@@ -852,6 +852,8 @@ static int ghes_notify_nmi(unsigned int cmd, struct pt_regs *regs) ...@@ -852,6 +852,8 @@ static int ghes_notify_nmi(unsigned int cmd, struct pt_regs *regs)
if (ghes_read_estatus(ghes, 1)) { if (ghes_read_estatus(ghes, 1)) {
ghes_clear_estatus(ghes); ghes_clear_estatus(ghes);
continue; continue;
} else {
ret = NMI_HANDLED;
} }
sev = ghes_severity(ghes->estatus->error_severity); sev = ghes_severity(ghes->estatus->error_severity);
...@@ -863,11 +865,10 @@ static int ghes_notify_nmi(unsigned int cmd, struct pt_regs *regs) ...@@ -863,11 +865,10 @@ static int ghes_notify_nmi(unsigned int cmd, struct pt_regs *regs)
__process_error(ghes); __process_error(ghes);
ghes_clear_estatus(ghes); ghes_clear_estatus(ghes);
ret = NMI_HANDLED;
} }
#ifdef CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG #ifdef CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG
if (ret == NMI_HANDLED)
irq_work_queue(&ghes_proc_irq_work); irq_work_queue(&ghes_proc_irq_work);
#endif #endif
atomic_dec(&ghes_in_nmi); atomic_dec(&ghes_in_nmi);
......
...@@ -123,7 +123,13 @@ EXPORT_SYMBOL_GPL(apei_hest_parse); ...@@ -123,7 +123,13 @@ EXPORT_SYMBOL_GPL(apei_hest_parse);
*/ */
static int __init hest_parse_cmc(struct acpi_hest_header *hest_hdr, void *data) static int __init hest_parse_cmc(struct acpi_hest_header *hest_hdr, void *data)
{ {
return arch_apei_enable_cmcff(hest_hdr, data); if (hest_hdr->type != ACPI_HEST_TYPE_IA32_CORRECTED_CHECK)
return 0;
if (!acpi_disable_cmcff)
return !arch_apei_enable_cmcff(hest_hdr, data);
return 0;
} }
struct ghes_arr { struct ghes_arr {
...@@ -232,8 +238,9 @@ void __init acpi_hest_init(void) ...@@ -232,8 +238,9 @@ void __init acpi_hest_init(void)
goto err; goto err;
} }
if (!acpi_disable_cmcff) rc = apei_hest_parse(hest_parse_cmc, NULL);
apei_hest_parse(hest_parse_cmc, NULL); if (rc)
goto err;
if (!ghes_disable) { if (!ghes_disable) {
rc = apei_hest_parse(hest_parse_ghes_count, &ghes_count); rc = apei_hest_parse(hest_parse_ghes_count, &ghes_count);
......
...@@ -430,39 +430,24 @@ static int acpi_battery_get_status(struct acpi_battery *battery) ...@@ -430,39 +430,24 @@ static int acpi_battery_get_status(struct acpi_battery *battery)
return 0; return 0;
} }
static int acpi_battery_get_info(struct acpi_battery *battery)
static int extract_battery_info(const int use_bix,
struct acpi_battery *battery,
const struct acpi_buffer *buffer)
{ {
int result = -EFAULT; int result = -EFAULT;
acpi_status status = 0;
char *name = test_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags) ?
"_BIX" : "_BIF";
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
if (!acpi_battery_present(battery))
return 0;
mutex_lock(&battery->lock);
status = acpi_evaluate_object(battery->device->handle, name,
NULL, &buffer);
mutex_unlock(&battery->lock);
if (ACPI_FAILURE(status)) { if (use_bix && battery_bix_broken_package)
ACPI_EXCEPTION((AE_INFO, status, "Evaluating %s", name)); result = extract_package(battery, buffer->pointer,
return -ENODEV;
}
if (battery_bix_broken_package)
result = extract_package(battery, buffer.pointer,
extended_info_offsets + 1, extended_info_offsets + 1,
ARRAY_SIZE(extended_info_offsets) - 1); ARRAY_SIZE(extended_info_offsets) - 1);
else if (test_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags)) else if (use_bix)
result = extract_package(battery, buffer.pointer, result = extract_package(battery, buffer->pointer,
extended_info_offsets, extended_info_offsets,
ARRAY_SIZE(extended_info_offsets)); ARRAY_SIZE(extended_info_offsets));
else else
result = extract_package(battery, buffer.pointer, result = extract_package(battery, buffer->pointer,
info_offsets, ARRAY_SIZE(info_offsets)); info_offsets, ARRAY_SIZE(info_offsets));
kfree(buffer.pointer);
if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags)) if (test_bit(ACPI_BATTERY_QUIRK_PERCENTAGE_CAPACITY, &battery->flags))
battery->full_charge_capacity = battery->design_capacity; battery->full_charge_capacity = battery->design_capacity;
if (test_bit(ACPI_BATTERY_QUIRK_THINKPAD_MAH, &battery->flags) && if (test_bit(ACPI_BATTERY_QUIRK_THINKPAD_MAH, &battery->flags) &&
...@@ -483,6 +468,45 @@ static int acpi_battery_get_info(struct acpi_battery *battery) ...@@ -483,6 +468,45 @@ static int acpi_battery_get_info(struct acpi_battery *battery)
return result; return result;
} }
static int acpi_battery_get_info(struct acpi_battery *battery)
{
const int xinfo = test_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags);
int use_bix;
int result = -ENODEV;
if (!acpi_battery_present(battery))
return 0;
for (use_bix = xinfo ? 1 : 0; use_bix >= 0; use_bix--) {
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
acpi_status status = AE_ERROR;
mutex_lock(&battery->lock);
status = acpi_evaluate_object(battery->device->handle,
use_bix ? "_BIX":"_BIF",
NULL, &buffer);
mutex_unlock(&battery->lock);
if (ACPI_FAILURE(status)) {
ACPI_EXCEPTION((AE_INFO, status, "Evaluating %s",
use_bix ? "_BIX":"_BIF"));
} else {
result = extract_battery_info(use_bix,
battery,
&buffer);
kfree(buffer.pointer);
break;
}
}
if (!result && !use_bix && xinfo)
pr_warn(FW_BUG "The _BIX method is broken, using _BIF.\n");
return result;
}
static int acpi_battery_get_state(struct acpi_battery *battery) static int acpi_battery_get_state(struct acpi_battery *battery)
{ {
int result = 0; int result = 0;
......
...@@ -784,8 +784,10 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr) ...@@ -784,8 +784,10 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr)
/* Add per logical CPU nodes for reading its feedback counters. */ /* Add per logical CPU nodes for reading its feedback counters. */
cpu_dev = get_cpu_device(pr->id); cpu_dev = get_cpu_device(pr->id);
if (!cpu_dev) if (!cpu_dev) {
ret = -EINVAL;
goto out_free; goto out_free;
}
ret = kobject_init_and_add(&cpc_ptr->kobj, &cppc_ktype, &cpu_dev->kobj, ret = kobject_init_and_add(&cpc_ptr->kobj, &cppc_ktype, &cpu_dev->kobj,
"acpi_cppc"); "acpi_cppc");
......
...@@ -296,6 +296,26 @@ static const struct dmi_system_id video_detect_dmi_table[] = { ...@@ -296,6 +296,26 @@ static const struct dmi_system_id video_detect_dmi_table[] = {
DMI_MATCH(DMI_PRODUCT_NAME, "Vostro V131"), DMI_MATCH(DMI_PRODUCT_NAME, "Vostro V131"),
}, },
}, },
{
/* https://bugzilla.redhat.com/show_bug.cgi?id=1123661 */
.callback = video_detect_force_native,
.ident = "Dell XPS 17 L702X",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
DMI_MATCH(DMI_PRODUCT_NAME, "Dell System XPS L702X"),
},
},
{
/* https://bugzilla.redhat.com/show_bug.cgi?id=1204476 */
/* https://bugs.launchpad.net/ubuntu/+source/linux-lts-trusty/+bug/1416940 */
.callback = video_detect_force_native,
.ident = "HP Pavilion dv6",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv6 Notebook PC"),
},
},
{ }, { },
}; };
......
...@@ -30,6 +30,17 @@ struct acpi_device; ...@@ -30,6 +30,17 @@ struct acpi_device;
#define ACPI_VIDEO_DISPLAY_LEGACY_PANEL 0x0110 #define ACPI_VIDEO_DISPLAY_LEGACY_PANEL 0x0110
#define ACPI_VIDEO_DISPLAY_LEGACY_TV 0x0200 #define ACPI_VIDEO_DISPLAY_LEGACY_TV 0x0200
#define ACPI_VIDEO_NOTIFY_SWITCH 0x80
#define ACPI_VIDEO_NOTIFY_PROBE 0x81
#define ACPI_VIDEO_NOTIFY_CYCLE 0x82
#define ACPI_VIDEO_NOTIFY_NEXT_OUTPUT 0x83
#define ACPI_VIDEO_NOTIFY_PREV_OUTPUT 0x84
#define ACPI_VIDEO_NOTIFY_CYCLE_BRIGHTNESS 0x85
#define ACPI_VIDEO_NOTIFY_INC_BRIGHTNESS 0x86
#define ACPI_VIDEO_NOTIFY_DEC_BRIGHTNESS 0x87
#define ACPI_VIDEO_NOTIFY_ZERO_BRIGHTNESS 0x88
#define ACPI_VIDEO_NOTIFY_DISPLAY_OFF 0x89
enum acpi_backlight_type { enum acpi_backlight_type {
acpi_backlight_undef = -1, acpi_backlight_undef = -1,
acpi_backlight_none = 0, acpi_backlight_none = 0,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment