Commit 04ed5109 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'acpi-4.15-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm

Pull ACPI updates from Rafael Wysocki:
 "These update ACPICA to upstream revision 20170831, fix APEI to use the
  fixmap instead of ioremap_page_range(), add an operation region driver
  for TI PMIC TPS68470, add support for PCC subspace IDs to the ACPI
  CPPC driver, fix a few assorted issues and clean up some code.

  Specifics:

   - Update the ACPICA code to upstream revision 20170831 including
      * PDTT table header support (Bob Moore).
      * Cleanup and extension of internal string-to-integer conversion
        functions (Bob Moore).
      * Support for 64-bit hardware accesses (Lv Zheng).
      * ACPI PM Timer code adjustment to deal with 64-bit return values
        of acpi_hw_read() (Bob Moore).
      * Support for deferred table verification in acpiexec (Lv Zheng).

   - Fix APEI to use the fixmap instead of ioremap_page_range() which
     cannot work correctly the way the code in there attempted to use it
     and drop some code that's not necessary any more after that change
     (James Morse).

   - Clean up the APEI support code and make it use 64-bit timestamps
     (Arnd Bergmann, Dongjiu Geng, Jan Beulich).

   - Add operation region driver for TI PMIC TPS68470 (Rajmohan Mani).

   - Add support for PCC subspace IDs to the ACPI CPPC driver (George
     Cherian).

   - Fix an ACPI EC driver regression related to the handling of EC
     events during the "noirq" phases of system suspend/resume (Lv
     Zheng).

   - Delay the initialization of the lid state in the ACPI button driver
     to fix issues appearing on some systems (Hans de Goede).

   - Extend the KIOX000A "device always present" quirk to cover all
     affected BIOS versions (Hans de Goede).

   - Clean up some code in the ACPI core and drivers (Colin Ian King,
     Gustavo Silva)"

* tag 'acpi-4.15-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: (24 commits)
  ACPI: Mark expected switch fall-throughs
  ACPI / LPSS: Remove redundant initialization of clk
  ACPI / CPPC: Make CPPC ACPI driver aware of PCC subspace IDs
  mailbox: PCC: Move the MAX_PCC_SUBSPACES definition to header file
  ACPI / sysfs: Make function param_set_trace_method_name() static
  ACPI / button: Delay acpi_lid_initialize_state() until first user space open
  ACPI / EC: Fix regression related to triggering source of EC event handling
  APEI / ERST: use 64-bit timestamps
  ACPI / APEI: Remove arch_apei_flush_tlb_one()
  arm64: mm: Remove arch_apei_flush_tlb_one()
  ACPI / APEI: Remove ghes_ioremap_area
  ACPI / APEI: Replace ioremap_page_range() with fixmap
  ACPI / APEI: remove the unused dead-code for SEA/NMI notification type
  ACPI / x86: Extend KIOX000A quirk to cover all affected BIOS versions
  ACPI / APEI: adjust a local variable type in ghes_ioremap_pfn_irq()
  ACPICA: Update version to 20170831
  ACPICA: Update acpi_get_timer for 64-bit interface to acpi_hw_read
  ACPICA: String conversions: Update to add new behaviors
  ACPICA: String conversions: Cleanup/format comments. No functional changes
  ACPICA: Restructure/cleanup all string-to-integer conversion functions
  ...
parents bd2cd7d5 eb5fcc31
...@@ -126,18 +126,6 @@ static inline const char *acpi_get_enable_method(int cpu) ...@@ -126,18 +126,6 @@ static inline const char *acpi_get_enable_method(int cpu)
*/ */
#define acpi_disable_cmcff 1 #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);
/*
* 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 */ #endif /* CONFIG_ACPI_APEI */
#ifdef CONFIG_ACPI_NUMA #ifdef CONFIG_ACPI_NUMA
......
...@@ -51,6 +51,13 @@ enum fixed_addresses { ...@@ -51,6 +51,13 @@ enum fixed_addresses {
FIX_EARLYCON_MEM_BASE, FIX_EARLYCON_MEM_BASE,
FIX_TEXT_POKE0, FIX_TEXT_POKE0,
#ifdef CONFIG_ACPI_APEI_GHES
/* Used for GHES mapping from assorted contexts */
FIX_APEI_GHES_IRQ,
FIX_APEI_GHES_NMI,
#endif /* CONFIG_ACPI_APEI_GHES */
__end_of_permanent_fixed_addresses, __end_of_permanent_fixed_addresses,
/* /*
......
...@@ -778,6 +778,10 @@ void __init early_fixmap_init(void) ...@@ -778,6 +778,10 @@ void __init early_fixmap_init(void)
} }
} }
/*
* Unusually, this is 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.
*/
void __set_fixmap(enum fixed_addresses idx, void __set_fixmap(enum fixed_addresses idx,
phys_addr_t phys, pgprot_t flags) phys_addr_t phys, pgprot_t flags)
{ {
......
...@@ -104,6 +104,12 @@ enum fixed_addresses { ...@@ -104,6 +104,12 @@ enum fixed_addresses {
FIX_GDT_REMAP_BEGIN, FIX_GDT_REMAP_BEGIN,
FIX_GDT_REMAP_END = FIX_GDT_REMAP_BEGIN + NR_CPUS - 1, FIX_GDT_REMAP_END = FIX_GDT_REMAP_BEGIN + NR_CPUS - 1,
#ifdef CONFIG_ACPI_APEI_GHES
/* Used for GHES mapping from assorted contexts */
FIX_APEI_GHES_IRQ,
FIX_APEI_GHES_NMI,
#endif
__end_of_permanent_fixed_addresses, __end_of_permanent_fixed_addresses,
/* /*
......
...@@ -52,8 +52,3 @@ void arch_apei_report_mem_error(int sev, struct cper_sec_mem_err *mem_err) ...@@ -52,8 +52,3 @@ void arch_apei_report_mem_error(int sev, struct cper_sec_mem_err *mem_err)
apei_mce_report_mem_error(sev, mem_err); apei_mce_report_mem_error(sev, mem_err);
#endif #endif
} }
void arch_apei_flush_tlb_one(unsigned long addr)
{
__flush_tlb_one(addr);
}
...@@ -541,4 +541,20 @@ if ARM64 ...@@ -541,4 +541,20 @@ if ARM64
source "drivers/acpi/arm64/Kconfig" source "drivers/acpi/arm64/Kconfig"
endif endif
config TPS68470_PMIC_OPREGION
bool "ACPI operation region support for TPS68470 PMIC"
depends on MFD_TPS68470
help
This config adds ACPI operation region support for TI TPS68470 PMIC.
TPS68470 device is an advanced power management unit that powers
a Compact Camera Module (CCM), generates clocks for image sensors,
drives a dual LED for flash and incorporates two LED drivers for
general purpose indicators.
This driver enables ACPI operation region support control voltage
regulators and clocks.
This option is a bool as it provides an ACPI operation
region, which must be available before any of the devices
using this, are probed.
endif # ACPI endif # ACPI
...@@ -109,6 +109,8 @@ obj-$(CONFIG_CHT_WC_PMIC_OPREGION) += pmic/intel_pmic_chtwc.o ...@@ -109,6 +109,8 @@ obj-$(CONFIG_CHT_WC_PMIC_OPREGION) += pmic/intel_pmic_chtwc.o
obj-$(CONFIG_ACPI_CONFIGFS) += acpi_configfs.o obj-$(CONFIG_ACPI_CONFIGFS) += acpi_configfs.o
obj-$(CONFIG_TPS68470_PMIC_OPREGION) += pmic/tps68470_pmic.o
video-objs += acpi_video.o video_detect.o video-objs += acpi_video.o video_detect.o
obj-y += dptf/ obj-y += dptf/
......
...@@ -265,6 +265,7 @@ static void acpi_ac_notify(struct acpi_device *device, u32 event) ...@@ -265,6 +265,7 @@ static void acpi_ac_notify(struct acpi_device *device, u32 event)
default: default:
ACPI_DEBUG_PRINT((ACPI_DB_INFO, ACPI_DEBUG_PRINT((ACPI_DB_INFO,
"Unsupported event [0x%x]\n", event)); "Unsupported event [0x%x]\n", event));
/* fall through */
case ACPI_AC_NOTIFY_STATUS: case ACPI_AC_NOTIFY_STATUS:
case ACPI_NOTIFY_BUS_CHECK: case ACPI_NOTIFY_BUS_CHECK:
case ACPI_NOTIFY_DEVICE_CHECK: case ACPI_NOTIFY_DEVICE_CHECK:
......
...@@ -362,7 +362,7 @@ static int register_device_clock(struct acpi_device *adev, ...@@ -362,7 +362,7 @@ static int register_device_clock(struct acpi_device *adev,
{ {
const struct lpss_device_desc *dev_desc = pdata->dev_desc; const struct lpss_device_desc *dev_desc = pdata->dev_desc;
const char *devname = dev_name(&adev->dev); const char *devname = dev_name(&adev->dev);
struct clk *clk = ERR_PTR(-ENODEV); struct clk *clk;
struct lpss_clk_data *clk_data; struct lpss_clk_data *clk_data;
const char *parent, *clk_name; const char *parent, *clk_name;
void __iomem *prv_base; void __iomem *prv_base;
......
...@@ -82,6 +82,7 @@ static int acpi_processor_errata_piix4(struct pci_dev *dev) ...@@ -82,6 +82,7 @@ static int acpi_processor_errata_piix4(struct pci_dev *dev)
* PIIX4 models. * PIIX4 models.
*/ */
errata.piix4.throttle = 1; errata.piix4.throttle = 1;
/* fall through*/
case 2: /* PIIX4E */ case 2: /* PIIX4E */
case 3: /* PIIX4M */ case 3: /* PIIX4M */
......
...@@ -178,6 +178,7 @@ acpi-y += \ ...@@ -178,6 +178,7 @@ acpi-y += \
utresrc.o \ utresrc.o \
utstate.o \ utstate.o \
utstring.o \ utstring.o \
utstrsuppt.o \
utstrtoul64.o \ utstrtoul64.o \
utxface.o \ utxface.o \
utxfinit.o \ utxfinit.o \
......
...@@ -66,9 +66,9 @@ acpi_status ...@@ -66,9 +66,9 @@ acpi_status
acpi_hw_validate_register(struct acpi_generic_address *reg, acpi_hw_validate_register(struct acpi_generic_address *reg,
u8 max_bit_width, u64 *address); u8 max_bit_width, u64 *address);
acpi_status acpi_hw_read(u32 *value, struct acpi_generic_address *reg); acpi_status acpi_hw_read(u64 *value, struct acpi_generic_address *reg);
acpi_status acpi_hw_write(u32 value, struct acpi_generic_address *reg); acpi_status acpi_hw_write(u64 value, struct acpi_generic_address *reg);
struct acpi_bit_register_info *acpi_hw_get_bit_register_info(u32 register_id); struct acpi_bit_register_info *acpi_hw_get_bit_register_info(u32 register_id);
......
...@@ -101,7 +101,8 @@ typedef const struct acpi_exdump_info { ...@@ -101,7 +101,8 @@ typedef const struct acpi_exdump_info {
*/ */
acpi_status acpi_status
acpi_ex_convert_to_integer(union acpi_operand_object *obj_desc, acpi_ex_convert_to_integer(union acpi_operand_object *obj_desc,
union acpi_operand_object **result_desc, u32 flags); union acpi_operand_object **result_desc,
u32 implicit_conversion);
acpi_status acpi_status
acpi_ex_convert_to_buffer(union acpi_operand_object *obj_desc, acpi_ex_convert_to_buffer(union acpi_operand_object *obj_desc,
...@@ -424,9 +425,6 @@ acpi_ex_store_object_to_node(union acpi_operand_object *source_desc, ...@@ -424,9 +425,6 @@ acpi_ex_store_object_to_node(union acpi_operand_object *source_desc,
struct acpi_walk_state *walk_state, struct acpi_walk_state *walk_state,
u8 implicit_conversion); u8 implicit_conversion);
#define ACPI_IMPLICIT_CONVERSION TRUE
#define ACPI_NO_IMPLICIT_CONVERSION FALSE
/* /*
* exstoren - resolve/store object * exstoren - resolve/store object
*/ */
......
...@@ -141,6 +141,11 @@ extern const char *acpi_gbl_ptyp_decode[]; ...@@ -141,6 +141,11 @@ extern const char *acpi_gbl_ptyp_decode[];
#define ACPI_MSG_SUFFIX \ #define ACPI_MSG_SUFFIX \
acpi_os_printf (" (%8.8X/%s-%u)\n", ACPI_CA_VERSION, module_name, line_number) acpi_os_printf (" (%8.8X/%s-%u)\n", ACPI_CA_VERSION, module_name, line_number)
/* Flags to indicate implicit or explicit string-to-integer conversion */
#define ACPI_IMPLICIT_CONVERSION TRUE
#define ACPI_NO_IMPLICIT_CONVERSION FALSE
/* Types for Resource descriptor entries */ /* Types for Resource descriptor entries */
#define ACPI_INVALID_RESOURCE 0 #define ACPI_INVALID_RESOURCE 0
...@@ -197,15 +202,31 @@ void acpi_ut_strlwr(char *src_string); ...@@ -197,15 +202,31 @@ void acpi_ut_strlwr(char *src_string);
int acpi_ut_stricmp(char *string1, char *string2); int acpi_ut_stricmp(char *string1, char *string2);
acpi_status acpi_ut_strtoul64(char *string, u32 flags, u64 *ret_integer); /*
* utstrsuppt - string-to-integer conversion support functions
*/
acpi_status acpi_ut_convert_octal_string(char *string, u64 *return_value);
acpi_status acpi_ut_convert_decimal_string(char *string, u64 *return_value_ptr);
acpi_status acpi_ut_convert_hex_string(char *string, u64 *return_value_ptr);
char acpi_ut_remove_whitespace(char **string);
char acpi_ut_remove_leading_zeros(char **string);
u8 acpi_ut_detect_hex_prefix(char **string);
u8 acpi_ut_detect_octal_prefix(char **string);
/* /*
* Values for Flags above * utstrtoul64 - string-to-integer conversion functions
* Note: LIMIT values correspond to acpi_gbl_integer_byte_width values (4/8)
*/ */
#define ACPI_STRTOUL_32BIT 0x04 /* 4 bytes */ acpi_status acpi_ut_strtoul64(char *string, u64 *ret_integer);
#define ACPI_STRTOUL_64BIT 0x08 /* 8 bytes */
#define ACPI_STRTOUL_BASE16 0x10 /* Default: Base10/16 */ u64 acpi_ut_explicit_strtoul64(char *string);
u64 acpi_ut_implicit_strtoul64(char *string);
/* /*
* utglobal - Global data structures and procedures * utglobal - Global data structures and procedures
......
...@@ -277,10 +277,7 @@ acpi_db_convert_to_object(acpi_object_type type, ...@@ -277,10 +277,7 @@ acpi_db_convert_to_object(acpi_object_type type,
default: default:
object->type = ACPI_TYPE_INTEGER; object->type = ACPI_TYPE_INTEGER;
status = acpi_ut_strtoul64(string, status = acpi_ut_strtoul64(string, &object->integer.value);
(acpi_gbl_integer_byte_width |
ACPI_STRTOUL_BASE16),
&object->integer.value);
break; break;
} }
......
...@@ -134,7 +134,7 @@ acpi_ds_get_predicate_value(struct acpi_walk_state *walk_state, ...@@ -134,7 +134,7 @@ acpi_ds_get_predicate_value(struct acpi_walk_state *walk_state,
* object. Implicitly convert the argument if necessary. * object. Implicitly convert the argument if necessary.
*/ */
status = acpi_ex_convert_to_integer(obj_desc, &local_obj_desc, status = acpi_ex_convert_to_integer(obj_desc, &local_obj_desc,
ACPI_STRTOUL_BASE16); ACPI_IMPLICIT_CONVERSION);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
goto cleanup; goto cleanup;
} }
......
...@@ -390,8 +390,8 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info *gpe_xrupt_list) ...@@ -390,8 +390,8 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info *gpe_xrupt_list)
struct acpi_gpe_handler_info *gpe_handler_info; struct acpi_gpe_handler_info *gpe_handler_info;
u32 int_status = ACPI_INTERRUPT_NOT_HANDLED; u32 int_status = ACPI_INTERRUPT_NOT_HANDLED;
u8 enabled_status_byte; u8 enabled_status_byte;
u32 status_reg; u64 status_reg;
u32 enable_reg; u64 enable_reg;
acpi_cpu_flags flags; acpi_cpu_flags flags;
u32 i; u32 i;
u32 j; u32 j;
...@@ -472,7 +472,7 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info *gpe_xrupt_list) ...@@ -472,7 +472,7 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info *gpe_xrupt_list)
gpe_register_info->base_gpe_number, gpe_register_info->base_gpe_number,
gpe_register_info->base_gpe_number + gpe_register_info->base_gpe_number +
(ACPI_GPE_REGISTER_WIDTH - 1), (ACPI_GPE_REGISTER_WIDTH - 1),
status_reg, enable_reg, (u32)status_reg, (u32)enable_reg,
gpe_register_info->enable_for_run, gpe_register_info->enable_for_run,
gpe_register_info->enable_for_wake)); gpe_register_info->enable_for_wake));
......
...@@ -156,7 +156,7 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0, ...@@ -156,7 +156,7 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
status = status =
acpi_ex_convert_to_integer(local_operand1, &temp_operand1, acpi_ex_convert_to_integer(local_operand1, &temp_operand1,
ACPI_STRTOUL_BASE16); ACPI_IMPLICIT_CONVERSION);
break; break;
case ACPI_TYPE_BUFFER: case ACPI_TYPE_BUFFER:
......
...@@ -60,7 +60,7 @@ acpi_ex_convert_to_ascii(u64 integer, u16 base, u8 *string, u8 max_length); ...@@ -60,7 +60,7 @@ acpi_ex_convert_to_ascii(u64 integer, u16 base, u8 *string, u8 max_length);
* PARAMETERS: obj_desc - Object to be converted. Must be an * PARAMETERS: obj_desc - Object to be converted. Must be an
* Integer, Buffer, or String * Integer, Buffer, or String
* result_desc - Where the new Integer object is returned * result_desc - Where the new Integer object is returned
* flags - Used for string conversion * implicit_conversion - Used for string conversion
* *
* RETURN: Status * RETURN: Status
* *
...@@ -70,14 +70,14 @@ acpi_ex_convert_to_ascii(u64 integer, u16 base, u8 *string, u8 max_length); ...@@ -70,14 +70,14 @@ acpi_ex_convert_to_ascii(u64 integer, u16 base, u8 *string, u8 max_length);
acpi_status acpi_status
acpi_ex_convert_to_integer(union acpi_operand_object *obj_desc, acpi_ex_convert_to_integer(union acpi_operand_object *obj_desc,
union acpi_operand_object **result_desc, u32 flags) union acpi_operand_object **result_desc,
u32 implicit_conversion)
{ {
union acpi_operand_object *return_desc; union acpi_operand_object *return_desc;
u8 *pointer; u8 *pointer;
u64 result; u64 result;
u32 i; u32 i;
u32 count; u32 count;
acpi_status status;
ACPI_FUNCTION_TRACE_PTR(ex_convert_to_integer, obj_desc); ACPI_FUNCTION_TRACE_PTR(ex_convert_to_integer, obj_desc);
...@@ -123,12 +123,18 @@ acpi_ex_convert_to_integer(union acpi_operand_object *obj_desc, ...@@ -123,12 +123,18 @@ acpi_ex_convert_to_integer(union acpi_operand_object *obj_desc,
* hexadecimal as per the ACPI specification. The only exception (as * hexadecimal as per the ACPI specification. The only exception (as
* of ACPI 3.0) is that the to_integer() operator allows both decimal * of ACPI 3.0) is that the to_integer() operator allows both decimal
* and hexadecimal strings (hex prefixed with "0x"). * and hexadecimal strings (hex prefixed with "0x").
*
* Explicit conversion is used only by to_integer.
* All other string-to-integer conversions are implicit conversions.
*/ */
status = acpi_ut_strtoul64(ACPI_CAST_PTR(char, pointer), if (implicit_conversion) {
(acpi_gbl_integer_byte_width | result =
flags), &result); acpi_ut_implicit_strtoul64(ACPI_CAST_PTR
if (ACPI_FAILURE(status)) { (char, pointer));
return_ACPI_STATUS(status); } else {
result =
acpi_ut_explicit_strtoul64(ACPI_CAST_PTR
(char, pointer));
} }
break; break;
...@@ -631,7 +637,7 @@ acpi_ex_convert_to_target_type(acpi_object_type destination_type, ...@@ -631,7 +637,7 @@ acpi_ex_convert_to_target_type(acpi_object_type destination_type,
*/ */
status = status =
acpi_ex_convert_to_integer(source_desc, result_desc, acpi_ex_convert_to_integer(source_desc, result_desc,
ACPI_STRTOUL_BASE16); ACPI_IMPLICIT_CONVERSION);
break; break;
case ACPI_TYPE_STRING: case ACPI_TYPE_STRING:
......
...@@ -330,7 +330,7 @@ acpi_ex_do_logical_op(u16 opcode, ...@@ -330,7 +330,7 @@ acpi_ex_do_logical_op(u16 opcode,
case ACPI_TYPE_INTEGER: case ACPI_TYPE_INTEGER:
status = acpi_ex_convert_to_integer(operand1, &local_operand1, status = acpi_ex_convert_to_integer(operand1, &local_operand1,
ACPI_STRTOUL_BASE16); ACPI_IMPLICIT_CONVERSION);
break; break;
case ACPI_TYPE_STRING: case ACPI_TYPE_STRING:
......
...@@ -415,7 +415,7 @@ acpi_ex_resolve_operands(u16 opcode, ...@@ -415,7 +415,7 @@ acpi_ex_resolve_operands(u16 opcode,
* Known as "Implicit Source Operand Conversion" * Known as "Implicit Source Operand Conversion"
*/ */
status = acpi_ex_convert_to_integer(obj_desc, stack_ptr, status = acpi_ex_convert_to_integer(obj_desc, stack_ptr,
ACPI_STRTOUL_BASE16); ACPI_IMPLICIT_CONVERSION);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
if (status == AE_TYPE) { if (status == AE_TYPE) {
ACPI_ERROR((AE_INFO, ACPI_ERROR((AE_INFO,
......
...@@ -99,7 +99,7 @@ acpi_hw_low_set_gpe(struct acpi_gpe_event_info *gpe_event_info, u32 action) ...@@ -99,7 +99,7 @@ acpi_hw_low_set_gpe(struct acpi_gpe_event_info *gpe_event_info, u32 action)
{ {
struct acpi_gpe_register_info *gpe_register_info; struct acpi_gpe_register_info *gpe_register_info;
acpi_status status = AE_OK; acpi_status status = AE_OK;
u32 enable_mask; u64 enable_mask;
u32 register_bit; u32 register_bit;
ACPI_FUNCTION_ENTRY(); ACPI_FUNCTION_ENTRY();
...@@ -214,7 +214,7 @@ acpi_status ...@@ -214,7 +214,7 @@ acpi_status
acpi_hw_get_gpe_status(struct acpi_gpe_event_info *gpe_event_info, acpi_hw_get_gpe_status(struct acpi_gpe_event_info *gpe_event_info,
acpi_event_status *event_status) acpi_event_status *event_status)
{ {
u32 in_byte; u64 in_byte;
u32 register_bit; u32 register_bit;
struct acpi_gpe_register_info *gpe_register_info; struct acpi_gpe_register_info *gpe_register_info;
acpi_event_status local_event_status = 0; acpi_event_status local_event_status = 0;
......
...@@ -220,16 +220,15 @@ acpi_hw_validate_register(struct acpi_generic_address *reg, ...@@ -220,16 +220,15 @@ acpi_hw_validate_register(struct acpi_generic_address *reg,
* *
* RETURN: Status * RETURN: Status
* *
* DESCRIPTION: Read from either memory or IO space. This is a 32-bit max * DESCRIPTION: Read from either memory or IO space. This is a 64-bit max
* version of acpi_read, used internally since the overhead of * version of acpi_read.
* 64-bit values is not needed.
* *
* LIMITATIONS: <These limitations also apply to acpi_hw_write> * LIMITATIONS: <These limitations also apply to acpi_hw_write>
* space_ID must be system_memory or system_IO. * space_ID must be system_memory or system_IO.
* *
******************************************************************************/ ******************************************************************************/
acpi_status acpi_hw_read(u32 *value, struct acpi_generic_address *reg) acpi_status acpi_hw_read(u64 *value, struct acpi_generic_address *reg)
{ {
u64 address; u64 address;
u8 access_width; u8 access_width;
...@@ -244,17 +243,17 @@ acpi_status acpi_hw_read(u32 *value, struct acpi_generic_address *reg) ...@@ -244,17 +243,17 @@ acpi_status acpi_hw_read(u32 *value, struct acpi_generic_address *reg)
/* Validate contents of the GAS register */ /* Validate contents of the GAS register */
status = acpi_hw_validate_register(reg, 32, &address); status = acpi_hw_validate_register(reg, 64, &address);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
return (status); return (status);
} }
/* /*
* Initialize entire 32-bit return value to zero, convert access_width * Initialize entire 64-bit return value to zero, convert access_width
* into number of bits based * into number of bits based
*/ */
*value = 0; *value = 0;
access_width = acpi_hw_get_access_bit_width(address, reg, 32); access_width = acpi_hw_get_access_bit_width(address, reg, 64);
bit_width = reg->bit_offset + reg->bit_width; bit_width = reg->bit_offset + reg->bit_width;
bit_offset = reg->bit_offset; bit_offset = reg->bit_offset;
...@@ -265,7 +264,7 @@ acpi_status acpi_hw_read(u32 *value, struct acpi_generic_address *reg) ...@@ -265,7 +264,7 @@ acpi_status acpi_hw_read(u32 *value, struct acpi_generic_address *reg)
index = 0; index = 0;
while (bit_width) { while (bit_width) {
if (bit_offset >= access_width) { if (bit_offset >= access_width) {
value32 = 0; value64 = 0;
bit_offset -= access_width; bit_offset -= access_width;
} else { } else {
if (reg->space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) { if (reg->space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) {
...@@ -276,7 +275,6 @@ acpi_status acpi_hw_read(u32 *value, struct acpi_generic_address *reg) ...@@ -276,7 +275,6 @@ acpi_status acpi_hw_read(u32 *value, struct acpi_generic_address *reg)
ACPI_DIV_8 ACPI_DIV_8
(access_width), (access_width),
&value64, access_width); &value64, access_width);
value32 = (u32)value64;
} else { /* ACPI_ADR_SPACE_SYSTEM_IO, validated earlier */ } else { /* ACPI_ADR_SPACE_SYSTEM_IO, validated earlier */
status = acpi_hw_read_port((acpi_io_address) status = acpi_hw_read_port((acpi_io_address)
...@@ -286,15 +284,16 @@ acpi_status acpi_hw_read(u32 *value, struct acpi_generic_address *reg) ...@@ -286,15 +284,16 @@ acpi_status acpi_hw_read(u32 *value, struct acpi_generic_address *reg)
(access_width), (access_width),
&value32, &value32,
access_width); access_width);
value64 = (u64)value32;
} }
} }
/* /*
* Use offset style bit writes because "Index * AccessWidth" is * Use offset style bit writes because "Index * AccessWidth" is
* ensured to be less than 32-bits by acpi_hw_validate_register(). * ensured to be less than 64-bits by acpi_hw_validate_register().
*/ */
ACPI_SET_BITS(value, index * access_width, ACPI_SET_BITS(value, index * access_width,
ACPI_MASK_BITS_ABOVE_32(access_width), value32); ACPI_MASK_BITS_ABOVE_64(access_width), value64);
bit_width -= bit_width -=
bit_width > access_width ? access_width : bit_width; bit_width > access_width ? access_width : bit_width;
...@@ -302,8 +301,9 @@ acpi_status acpi_hw_read(u32 *value, struct acpi_generic_address *reg) ...@@ -302,8 +301,9 @@ acpi_status acpi_hw_read(u32 *value, struct acpi_generic_address *reg)
} }
ACPI_DEBUG_PRINT((ACPI_DB_IO, ACPI_DEBUG_PRINT((ACPI_DB_IO,
"Read: %8.8X width %2d from %8.8X%8.8X (%s)\n", "Read: %8.8X%8.8X width %2d from %8.8X%8.8X (%s)\n",
*value, access_width, ACPI_FORMAT_UINT64(address), ACPI_FORMAT_UINT64(*value), access_width,
ACPI_FORMAT_UINT64(address),
acpi_ut_get_region_name(reg->space_id))); acpi_ut_get_region_name(reg->space_id)));
return (status); return (status);
...@@ -318,20 +318,18 @@ acpi_status acpi_hw_read(u32 *value, struct acpi_generic_address *reg) ...@@ -318,20 +318,18 @@ acpi_status acpi_hw_read(u32 *value, struct acpi_generic_address *reg)
* *
* RETURN: Status * RETURN: Status
* *
* DESCRIPTION: Write to either memory or IO space. This is a 32-bit max * DESCRIPTION: Write to either memory or IO space. This is a 64-bit max
* version of acpi_write, used internally since the overhead of * version of acpi_write.
* 64-bit values is not needed.
* *
******************************************************************************/ ******************************************************************************/
acpi_status acpi_hw_write(u32 value, struct acpi_generic_address *reg) acpi_status acpi_hw_write(u64 value, struct acpi_generic_address *reg)
{ {
u64 address; u64 address;
u8 access_width; u8 access_width;
u32 bit_width; u32 bit_width;
u8 bit_offset; u8 bit_offset;
u64 value64; u64 value64;
u32 value32;
u8 index; u8 index;
acpi_status status; acpi_status status;
...@@ -339,14 +337,14 @@ acpi_status acpi_hw_write(u32 value, struct acpi_generic_address *reg) ...@@ -339,14 +337,14 @@ acpi_status acpi_hw_write(u32 value, struct acpi_generic_address *reg)
/* Validate contents of the GAS register */ /* Validate contents of the GAS register */
status = acpi_hw_validate_register(reg, 32, &address); status = acpi_hw_validate_register(reg, 64, &address);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
return (status); return (status);
} }
/* Convert access_width into number of bits based */ /* Convert access_width into number of bits based */
access_width = acpi_hw_get_access_bit_width(address, reg, 32); access_width = acpi_hw_get_access_bit_width(address, reg, 64);
bit_width = reg->bit_offset + reg->bit_width; bit_width = reg->bit_offset + reg->bit_width;
bit_offset = reg->bit_offset; bit_offset = reg->bit_offset;
...@@ -358,16 +356,15 @@ acpi_status acpi_hw_write(u32 value, struct acpi_generic_address *reg) ...@@ -358,16 +356,15 @@ acpi_status acpi_hw_write(u32 value, struct acpi_generic_address *reg)
while (bit_width) { while (bit_width) {
/* /*
* Use offset style bit reads because "Index * AccessWidth" is * Use offset style bit reads because "Index * AccessWidth" is
* ensured to be less than 32-bits by acpi_hw_validate_register(). * ensured to be less than 64-bits by acpi_hw_validate_register().
*/ */
value32 = ACPI_GET_BITS(&value, index * access_width, value64 = ACPI_GET_BITS(&value, index * access_width,
ACPI_MASK_BITS_ABOVE_32(access_width)); ACPI_MASK_BITS_ABOVE_64(access_width));
if (bit_offset >= access_width) { if (bit_offset >= access_width) {
bit_offset -= access_width; bit_offset -= access_width;
} else { } else {
if (reg->space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) { if (reg->space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) {
value64 = (u64)value32;
status = status =
acpi_os_write_memory((acpi_physical_address) acpi_os_write_memory((acpi_physical_address)
address + address +
...@@ -382,7 +379,7 @@ acpi_status acpi_hw_write(u32 value, struct acpi_generic_address *reg) ...@@ -382,7 +379,7 @@ acpi_status acpi_hw_write(u32 value, struct acpi_generic_address *reg)
index * index *
ACPI_DIV_8 ACPI_DIV_8
(access_width), (access_width),
value32, (u32)value64,
access_width); access_width);
} }
} }
...@@ -397,8 +394,9 @@ acpi_status acpi_hw_write(u32 value, struct acpi_generic_address *reg) ...@@ -397,8 +394,9 @@ acpi_status acpi_hw_write(u32 value, struct acpi_generic_address *reg)
} }
ACPI_DEBUG_PRINT((ACPI_DB_IO, ACPI_DEBUG_PRINT((ACPI_DB_IO,
"Wrote: %8.8X width %2d to %8.8X%8.8X (%s)\n", "Wrote: %8.8X%8.8X width %2d to %8.8X%8.8X (%s)\n",
value, access_width, ACPI_FORMAT_UINT64(address), ACPI_FORMAT_UINT64(value), access_width,
ACPI_FORMAT_UINT64(address),
acpi_ut_get_region_name(reg->space_id))); acpi_ut_get_region_name(reg->space_id)));
return (status); return (status);
...@@ -526,6 +524,7 @@ acpi_status acpi_hw_write_pm1_control(u32 pm1a_control, u32 pm1b_control) ...@@ -526,6 +524,7 @@ acpi_status acpi_hw_write_pm1_control(u32 pm1a_control, u32 pm1b_control)
acpi_status acpi_hw_register_read(u32 register_id, u32 *return_value) acpi_status acpi_hw_register_read(u32 register_id, u32 *return_value)
{ {
u32 value = 0; u32 value = 0;
u64 value64;
acpi_status status; acpi_status status;
ACPI_FUNCTION_TRACE(hw_register_read); ACPI_FUNCTION_TRACE(hw_register_read);
...@@ -564,12 +563,14 @@ acpi_status acpi_hw_register_read(u32 register_id, u32 *return_value) ...@@ -564,12 +563,14 @@ acpi_status acpi_hw_register_read(u32 register_id, u32 *return_value)
case ACPI_REGISTER_PM2_CONTROL: /* 8-bit access */ case ACPI_REGISTER_PM2_CONTROL: /* 8-bit access */
status = status =
acpi_hw_read(&value, &acpi_gbl_FADT.xpm2_control_block); acpi_hw_read(&value64, &acpi_gbl_FADT.xpm2_control_block);
value = (u32)value64;
break; break;
case ACPI_REGISTER_PM_TIMER: /* 32-bit access */ case ACPI_REGISTER_PM_TIMER: /* 32-bit access */
status = acpi_hw_read(&value, &acpi_gbl_FADT.xpm_timer_block); status = acpi_hw_read(&value64, &acpi_gbl_FADT.xpm_timer_block);
value = (u32)value64;
break; break;
case ACPI_REGISTER_SMI_COMMAND_BLOCK: /* 8-bit access */ case ACPI_REGISTER_SMI_COMMAND_BLOCK: /* 8-bit access */
...@@ -586,7 +587,7 @@ acpi_status acpi_hw_register_read(u32 register_id, u32 *return_value) ...@@ -586,7 +587,7 @@ acpi_status acpi_hw_register_read(u32 register_id, u32 *return_value)
} }
if (ACPI_SUCCESS(status)) { if (ACPI_SUCCESS(status)) {
*return_value = value; *return_value = (u32)value;
} }
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
...@@ -622,6 +623,7 @@ acpi_status acpi_hw_register_write(u32 register_id, u32 value) ...@@ -622,6 +623,7 @@ acpi_status acpi_hw_register_write(u32 register_id, u32 value)
{ {
acpi_status status; acpi_status status;
u32 read_value; u32 read_value;
u64 read_value64;
ACPI_FUNCTION_TRACE(hw_register_write); ACPI_FUNCTION_TRACE(hw_register_write);
...@@ -685,11 +687,12 @@ acpi_status acpi_hw_register_write(u32 register_id, u32 value) ...@@ -685,11 +687,12 @@ acpi_status acpi_hw_register_write(u32 register_id, u32 value)
* as per the ACPI spec. * as per the ACPI spec.
*/ */
status = status =
acpi_hw_read(&read_value, acpi_hw_read(&read_value64,
&acpi_gbl_FADT.xpm2_control_block); &acpi_gbl_FADT.xpm2_control_block);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
goto exit; goto exit;
} }
read_value = (u32)read_value64;
/* Insert the bits to be preserved */ /* Insert the bits to be preserved */
...@@ -745,22 +748,25 @@ acpi_hw_read_multiple(u32 *value, ...@@ -745,22 +748,25 @@ acpi_hw_read_multiple(u32 *value,
{ {
u32 value_a = 0; u32 value_a = 0;
u32 value_b = 0; u32 value_b = 0;
u64 value64;
acpi_status status; acpi_status status;
/* The first register is always required */ /* The first register is always required */
status = acpi_hw_read(&value_a, register_a); status = acpi_hw_read(&value64, register_a);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
return (status); return (status);
} }
value_a = (u32)value64;
/* Second register is optional */ /* Second register is optional */
if (register_b->address) { if (register_b->address) {
status = acpi_hw_read(&value_b, register_b); status = acpi_hw_read(&value64, register_b);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
return (status); return (status);
} }
value_b = (u32)value64;
} }
/* /*
......
...@@ -94,6 +94,7 @@ ACPI_EXPORT_SYMBOL(acpi_get_timer_resolution) ...@@ -94,6 +94,7 @@ ACPI_EXPORT_SYMBOL(acpi_get_timer_resolution)
acpi_status acpi_get_timer(u32 * ticks) acpi_status acpi_get_timer(u32 * ticks)
{ {
acpi_status status; acpi_status status;
u64 timer_value;
ACPI_FUNCTION_TRACE(acpi_get_timer); ACPI_FUNCTION_TRACE(acpi_get_timer);
...@@ -107,7 +108,14 @@ acpi_status acpi_get_timer(u32 * ticks) ...@@ -107,7 +108,14 @@ acpi_status acpi_get_timer(u32 * ticks)
return_ACPI_STATUS(AE_SUPPORT); return_ACPI_STATUS(AE_SUPPORT);
} }
status = acpi_hw_read(ticks, &acpi_gbl_FADT.xpm_timer_block); status = acpi_hw_read(&timer_value, &acpi_gbl_FADT.xpm_timer_block);
if (ACPI_SUCCESS(status)) {
/* ACPI PM Timer is defined to be 32 bits (PM_TMR_LEN) */
*ticks = (u32)timer_value;
}
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
......
...@@ -125,76 +125,12 @@ ACPI_EXPORT_SYMBOL(acpi_reset) ...@@ -125,76 +125,12 @@ ACPI_EXPORT_SYMBOL(acpi_reset)
******************************************************************************/ ******************************************************************************/
acpi_status acpi_read(u64 *return_value, struct acpi_generic_address *reg) acpi_status acpi_read(u64 *return_value, struct acpi_generic_address *reg)
{ {
u32 value_lo;
u32 value_hi;
u32 width;
u64 address;
acpi_status status; acpi_status status;
ACPI_FUNCTION_NAME(acpi_read); ACPI_FUNCTION_NAME(acpi_read);
if (!return_value) { status = acpi_hw_read(return_value, reg);
return (AE_BAD_PARAMETER);
}
/* Validate contents of the GAS register. Allow 64-bit transfers */
status = acpi_hw_validate_register(reg, 64, &address);
if (ACPI_FAILURE(status)) {
return (status);
}
/*
* Two address spaces supported: Memory or I/O. PCI_Config is
* not supported here because the GAS structure is insufficient
*/
if (reg->space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) {
status = acpi_os_read_memory((acpi_physical_address)
address, return_value,
reg->bit_width);
if (ACPI_FAILURE(status)) {
return (status);
}
} else { /* ACPI_ADR_SPACE_SYSTEM_IO, validated earlier */
value_lo = 0;
value_hi = 0;
width = reg->bit_width;
if (width == 64) {
width = 32; /* Break into two 32-bit transfers */
}
status = acpi_hw_read_port((acpi_io_address)
address, &value_lo, width);
if (ACPI_FAILURE(status)) {
return (status);
}
if (reg->bit_width == 64) {
/* Read the top 32 bits */
status = acpi_hw_read_port((acpi_io_address)
(address + 4), &value_hi,
32);
if (ACPI_FAILURE(status)) {
return (status); return (status);
}
}
/* Set the return value only if status is AE_OK */
*return_value = (value_lo | ((u64)value_hi << 32));
}
ACPI_DEBUG_PRINT((ACPI_DB_IO,
"Read: %8.8X%8.8X width %2d from %8.8X%8.8X (%s)\n",
ACPI_FORMAT_UINT64(*return_value), reg->bit_width,
ACPI_FORMAT_UINT64(address),
acpi_ut_get_region_name(reg->space_id)));
return (AE_OK);
} }
ACPI_EXPORT_SYMBOL(acpi_read) ACPI_EXPORT_SYMBOL(acpi_read)
...@@ -213,59 +149,11 @@ ACPI_EXPORT_SYMBOL(acpi_read) ...@@ -213,59 +149,11 @@ ACPI_EXPORT_SYMBOL(acpi_read)
******************************************************************************/ ******************************************************************************/
acpi_status acpi_write(u64 value, struct acpi_generic_address *reg) acpi_status acpi_write(u64 value, struct acpi_generic_address *reg)
{ {
u32 width;
u64 address;
acpi_status status; acpi_status status;
ACPI_FUNCTION_NAME(acpi_write); ACPI_FUNCTION_NAME(acpi_write);
/* Validate contents of the GAS register. Allow 64-bit transfers */ status = acpi_hw_write(value, reg);
status = acpi_hw_validate_register(reg, 64, &address);
if (ACPI_FAILURE(status)) {
return (status);
}
/*
* Two address spaces supported: Memory or IO. PCI_Config is
* not supported here because the GAS structure is insufficient
*/
if (reg->space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) {
status = acpi_os_write_memory((acpi_physical_address)
address, value, reg->bit_width);
if (ACPI_FAILURE(status)) {
return (status);
}
} else { /* ACPI_ADR_SPACE_SYSTEM_IO, validated earlier */
width = reg->bit_width;
if (width == 64) {
width = 32; /* Break into two 32-bit transfers */
}
status = acpi_hw_write_port((acpi_io_address)
address, ACPI_LODWORD(value),
width);
if (ACPI_FAILURE(status)) {
return (status);
}
if (reg->bit_width == 64) {
status = acpi_hw_write_port((acpi_io_address)
(address + 4),
ACPI_HIDWORD(value), 32);
if (ACPI_FAILURE(status)) {
return (status);
}
}
}
ACPI_DEBUG_PRINT((ACPI_DB_IO,
"Wrote: %8.8X%8.8X width %2d to %8.8X%8.8X (%s)\n",
ACPI_FORMAT_UINT64(value), reg->bit_width,
ACPI_FORMAT_UINT64(address),
acpi_ut_get_region_name(reg->space_id)));
return (status); return (status);
} }
......
...@@ -78,8 +78,8 @@ acpi_ns_convert_to_integer(union acpi_operand_object *original_object, ...@@ -78,8 +78,8 @@ acpi_ns_convert_to_integer(union acpi_operand_object *original_object,
/* String-to-Integer conversion */ /* String-to-Integer conversion */
status = acpi_ut_strtoul64(original_object->string.pointer, status =
acpi_gbl_integer_byte_width, &value); acpi_ut_strtoul64(original_object->string.pointer, &value);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
return (status); return (status);
} }
......
...@@ -173,10 +173,13 @@ acpi_status ACPI_INIT_FUNCTION acpi_reallocate_root_table(void) ...@@ -173,10 +173,13 @@ acpi_status ACPI_INIT_FUNCTION acpi_reallocate_root_table(void)
ACPI_FUNCTION_TRACE(acpi_reallocate_root_table); ACPI_FUNCTION_TRACE(acpi_reallocate_root_table);
/* /*
* Only reallocate the root table if the host provided a static buffer * If there are tables unverified, it is required to reallocate the
* for the table array in the call to acpi_initialize_tables. * root table list to clean up invalid table entries. Otherwise only
* reallocate the root table list if the host provided a static buffer
* for the table array in the call to acpi_initialize_tables().
*/ */
if (acpi_gbl_root_table_list.flags & ACPI_ROOT_ORIGIN_ALLOCATED) { if ((acpi_gbl_root_table_list.flags & ACPI_ROOT_ORIGIN_ALLOCATED) &&
acpi_gbl_enable_table_validation) {
return_ACPI_STATUS(AE_SUPPORT); return_ACPI_STATUS(AE_SUPPORT);
} }
......
This diff is collapsed.
This diff is collapsed.
...@@ -1061,7 +1061,7 @@ static int erst_writer(struct pstore_record *record) ...@@ -1061,7 +1061,7 @@ static int erst_writer(struct pstore_record *record)
rcd->hdr.error_severity = CPER_SEV_FATAL; rcd->hdr.error_severity = CPER_SEV_FATAL;
/* timestamp valid. platform_id, partition_id are invalid */ /* timestamp valid. platform_id, partition_id are invalid */
rcd->hdr.validation_bits = CPER_VALID_TIMESTAMP; rcd->hdr.validation_bits = CPER_VALID_TIMESTAMP;
rcd->hdr.timestamp = get_seconds(); rcd->hdr.timestamp = ktime_get_real_seconds();
rcd->hdr.record_length = sizeof(*rcd) + record->size; rcd->hdr.record_length = sizeof(*rcd) + record->size;
rcd->hdr.creator_id = CPER_CREATOR_PSTORE; rcd->hdr.creator_id = CPER_CREATOR_PSTORE;
rcd->hdr.notification_type = CPER_NOTIFY_MCE; rcd->hdr.notification_type = CPER_NOTIFY_MCE;
......
...@@ -51,6 +51,7 @@ ...@@ -51,6 +51,7 @@
#include <acpi/actbl1.h> #include <acpi/actbl1.h>
#include <acpi/ghes.h> #include <acpi/ghes.h>
#include <acpi/apei.h> #include <acpi/apei.h>
#include <asm/fixmap.h>
#include <asm/tlbflush.h> #include <asm/tlbflush.h>
#include <ras/ras_event.h> #include <ras/ras_event.h>
...@@ -112,22 +113,10 @@ static DEFINE_MUTEX(ghes_list_mutex); ...@@ -112,22 +113,10 @@ static DEFINE_MUTEX(ghes_list_mutex);
* Because the memory area used to transfer hardware error information * Because the memory area used to transfer hardware error information
* from BIOS to Linux can be determined only in NMI, IRQ or timer * from BIOS to Linux can be determined only in NMI, IRQ or timer
* handler, but general ioremap can not be used in atomic context, so * handler, but general ioremap can not be used in atomic context, so
* a special version of atomic ioremap is implemented for that. * the fixmap is used instead.
*/ *
* These 2 spinlocks are used to prevent the fixmap entries from being used
/* * simultaneously.
* Two virtual pages are used, one for IRQ/PROCESS context, the other for
* NMI context (optionally).
*/
#define GHES_IOREMAP_PAGES 2
#define GHES_IOREMAP_IRQ_PAGE(base) (base)
#define GHES_IOREMAP_NMI_PAGE(base) ((base) + PAGE_SIZE)
/* virtual memory area for atomic ioremap */
static struct vm_struct *ghes_ioremap_area;
/*
* These 2 spinlock is used to prevent atomic ioremap virtual memory
* area from being mapped simultaneously.
*/ */
static DEFINE_RAW_SPINLOCK(ghes_ioremap_lock_nmi); static DEFINE_RAW_SPINLOCK(ghes_ioremap_lock_nmi);
static DEFINE_SPINLOCK(ghes_ioremap_lock_irq); static DEFINE_SPINLOCK(ghes_ioremap_lock_irq);
...@@ -140,71 +129,38 @@ static atomic_t ghes_estatus_cache_alloced; ...@@ -140,71 +129,38 @@ static atomic_t ghes_estatus_cache_alloced;
static int ghes_panic_timeout __read_mostly = 30; static int ghes_panic_timeout __read_mostly = 30;
static int ghes_ioremap_init(void)
{
ghes_ioremap_area = __get_vm_area(PAGE_SIZE * GHES_IOREMAP_PAGES,
VM_IOREMAP, VMALLOC_START, VMALLOC_END);
if (!ghes_ioremap_area) {
pr_err(GHES_PFX "Failed to allocate virtual memory area for atomic ioremap.\n");
return -ENOMEM;
}
return 0;
}
static void ghes_ioremap_exit(void)
{
free_vm_area(ghes_ioremap_area);
}
static void __iomem *ghes_ioremap_pfn_nmi(u64 pfn) static void __iomem *ghes_ioremap_pfn_nmi(u64 pfn)
{ {
unsigned long vaddr;
phys_addr_t paddr; phys_addr_t paddr;
pgprot_t prot; pgprot_t prot;
vaddr = (unsigned long)GHES_IOREMAP_NMI_PAGE(ghes_ioremap_area->addr);
paddr = pfn << PAGE_SHIFT; paddr = pfn << PAGE_SHIFT;
prot = arch_apei_get_mem_attribute(paddr); prot = arch_apei_get_mem_attribute(paddr);
ioremap_page_range(vaddr, vaddr + PAGE_SIZE, paddr, prot); __set_fixmap(FIX_APEI_GHES_NMI, paddr, prot);
return (void __iomem *)vaddr; return (void __iomem *) fix_to_virt(FIX_APEI_GHES_NMI);
} }
static void __iomem *ghes_ioremap_pfn_irq(u64 pfn) static void __iomem *ghes_ioremap_pfn_irq(u64 pfn)
{ {
unsigned long vaddr, paddr; phys_addr_t paddr;
pgprot_t prot; pgprot_t prot;
vaddr = (unsigned long)GHES_IOREMAP_IRQ_PAGE(ghes_ioremap_area->addr);
paddr = pfn << PAGE_SHIFT; paddr = pfn << PAGE_SHIFT;
prot = arch_apei_get_mem_attribute(paddr); prot = arch_apei_get_mem_attribute(paddr);
__set_fixmap(FIX_APEI_GHES_IRQ, paddr, prot);
ioremap_page_range(vaddr, vaddr + PAGE_SIZE, paddr, prot); return (void __iomem *) fix_to_virt(FIX_APEI_GHES_IRQ);
return (void __iomem *)vaddr;
} }
static void ghes_iounmap_nmi(void __iomem *vaddr_ptr) static void ghes_iounmap_nmi(void)
{ {
unsigned long vaddr = (unsigned long __force)vaddr_ptr; clear_fixmap(FIX_APEI_GHES_NMI);
void *base = ghes_ioremap_area->addr;
BUG_ON(vaddr != (unsigned long)GHES_IOREMAP_NMI_PAGE(base));
unmap_kernel_range_noflush(vaddr, PAGE_SIZE);
arch_apei_flush_tlb_one(vaddr);
} }
static void ghes_iounmap_irq(void __iomem *vaddr_ptr) static void ghes_iounmap_irq(void)
{ {
unsigned long vaddr = (unsigned long __force)vaddr_ptr; clear_fixmap(FIX_APEI_GHES_IRQ);
void *base = ghes_ioremap_area->addr;
BUG_ON(vaddr != (unsigned long)GHES_IOREMAP_IRQ_PAGE(base));
unmap_kernel_range_noflush(vaddr, PAGE_SIZE);
arch_apei_flush_tlb_one(vaddr);
} }
static int ghes_estatus_pool_init(void) static int ghes_estatus_pool_init(void)
...@@ -360,10 +316,10 @@ static void ghes_copy_tofrom_phys(void *buffer, u64 paddr, u32 len, ...@@ -360,10 +316,10 @@ static void ghes_copy_tofrom_phys(void *buffer, u64 paddr, u32 len,
paddr += trunk; paddr += trunk;
buffer += trunk; buffer += trunk;
if (in_nmi) { if (in_nmi) {
ghes_iounmap_nmi(vaddr); ghes_iounmap_nmi();
raw_spin_unlock(&ghes_ioremap_lock_nmi); raw_spin_unlock(&ghes_ioremap_lock_nmi);
} else { } else {
ghes_iounmap_irq(vaddr); ghes_iounmap_irq();
spin_unlock_irqrestore(&ghes_ioremap_lock_irq, flags); spin_unlock_irqrestore(&ghes_ioremap_lock_irq, flags);
} }
} }
...@@ -851,17 +807,8 @@ static void ghes_sea_remove(struct ghes *ghes) ...@@ -851,17 +807,8 @@ static void ghes_sea_remove(struct ghes *ghes)
synchronize_rcu(); synchronize_rcu();
} }
#else /* CONFIG_ACPI_APEI_SEA */ #else /* CONFIG_ACPI_APEI_SEA */
static inline void ghes_sea_add(struct ghes *ghes) static inline void ghes_sea_add(struct ghes *ghes) { }
{ static inline void ghes_sea_remove(struct ghes *ghes) { }
pr_err(GHES_PFX "ID: %d, trying to add SEA notification which is not supported\n",
ghes->generic->header.source_id);
}
static inline void ghes_sea_remove(struct ghes *ghes)
{
pr_err(GHES_PFX "ID: %d, trying to remove SEA notification which is not supported\n",
ghes->generic->header.source_id);
}
#endif /* CONFIG_ACPI_APEI_SEA */ #endif /* CONFIG_ACPI_APEI_SEA */
#ifdef CONFIG_HAVE_ACPI_APEI_NMI #ifdef CONFIG_HAVE_ACPI_APEI_NMI
...@@ -1063,23 +1010,9 @@ static void ghes_nmi_init_cxt(void) ...@@ -1063,23 +1010,9 @@ static void ghes_nmi_init_cxt(void)
init_irq_work(&ghes_proc_irq_work, ghes_proc_in_irq); init_irq_work(&ghes_proc_irq_work, ghes_proc_in_irq);
} }
#else /* CONFIG_HAVE_ACPI_APEI_NMI */ #else /* CONFIG_HAVE_ACPI_APEI_NMI */
static inline void ghes_nmi_add(struct ghes *ghes) static inline void ghes_nmi_add(struct ghes *ghes) { }
{ static inline void ghes_nmi_remove(struct ghes *ghes) { }
pr_err(GHES_PFX "ID: %d, trying to add NMI notification which is not supported!\n", static inline void ghes_nmi_init_cxt(void) { }
ghes->generic->header.source_id);
BUG();
}
static inline void ghes_nmi_remove(struct ghes *ghes)
{
pr_err(GHES_PFX "ID: %d, trying to remove NMI notification which is not supported!\n",
ghes->generic->header.source_id);
BUG();
}
static inline void ghes_nmi_init_cxt(void)
{
}
#endif /* CONFIG_HAVE_ACPI_APEI_NMI */ #endif /* CONFIG_HAVE_ACPI_APEI_NMI */
static int ghes_probe(struct platform_device *ghes_dev) static int ghes_probe(struct platform_device *ghes_dev)
...@@ -1284,13 +1217,9 @@ static int __init ghes_init(void) ...@@ -1284,13 +1217,9 @@ static int __init ghes_init(void)
ghes_nmi_init_cxt(); ghes_nmi_init_cxt();
rc = ghes_ioremap_init();
if (rc)
goto err;
rc = ghes_estatus_pool_init(); rc = ghes_estatus_pool_init();
if (rc) if (rc)
goto err_ioremap_exit; goto err;
rc = ghes_estatus_pool_expand(GHES_ESTATUS_CACHE_AVG_SIZE * rc = ghes_estatus_pool_expand(GHES_ESTATUS_CACHE_AVG_SIZE *
GHES_ESTATUS_CACHE_ALLOCED_MAX); GHES_ESTATUS_CACHE_ALLOCED_MAX);
...@@ -1314,8 +1243,6 @@ static int __init ghes_init(void) ...@@ -1314,8 +1243,6 @@ static int __init ghes_init(void)
return 0; return 0;
err_pool_exit: err_pool_exit:
ghes_estatus_pool_exit(); ghes_estatus_pool_exit();
err_ioremap_exit:
ghes_ioremap_exit();
err: err:
return rc; return rc;
} }
......
...@@ -390,6 +390,7 @@ static void acpi_button_notify(struct acpi_device *device, u32 event) ...@@ -390,6 +390,7 @@ static void acpi_button_notify(struct acpi_device *device, u32 event)
{ {
struct acpi_button *button = acpi_driver_data(device); struct acpi_button *button = acpi_driver_data(device);
struct input_dev *input; struct input_dev *input;
int users;
switch (event) { switch (event) {
case ACPI_FIXED_HARDWARE_EVENT: case ACPI_FIXED_HARDWARE_EVENT:
...@@ -398,6 +399,10 @@ static void acpi_button_notify(struct acpi_device *device, u32 event) ...@@ -398,6 +399,10 @@ static void acpi_button_notify(struct acpi_device *device, u32 event)
case ACPI_BUTTON_NOTIFY_STATUS: case ACPI_BUTTON_NOTIFY_STATUS:
input = button->input; input = button->input;
if (button->type == ACPI_BUTTON_TYPE_LID) { if (button->type == ACPI_BUTTON_TYPE_LID) {
mutex_lock(&button->input->mutex);
users = button->input->users;
mutex_unlock(&button->input->mutex);
if (users)
acpi_lid_update_state(device); acpi_lid_update_state(device);
} else { } else {
int keycode; int keycode;
...@@ -442,12 +447,24 @@ static int acpi_button_resume(struct device *dev) ...@@ -442,12 +447,24 @@ static int acpi_button_resume(struct device *dev)
struct acpi_button *button = acpi_driver_data(device); struct acpi_button *button = acpi_driver_data(device);
button->suspended = false; button->suspended = false;
if (button->type == ACPI_BUTTON_TYPE_LID) if (button->type == ACPI_BUTTON_TYPE_LID && button->input->users)
acpi_lid_initialize_state(device); acpi_lid_initialize_state(device);
return 0; return 0;
} }
#endif #endif
static int acpi_lid_input_open(struct input_dev *input)
{
struct acpi_device *device = input_get_drvdata(input);
struct acpi_button *button = acpi_driver_data(device);
button->last_state = !!acpi_lid_evaluate_state(device);
button->last_time = ktime_get();
acpi_lid_initialize_state(device);
return 0;
}
static int acpi_button_add(struct acpi_device *device) static int acpi_button_add(struct acpi_device *device)
{ {
struct acpi_button *button; struct acpi_button *button;
...@@ -488,8 +505,7 @@ static int acpi_button_add(struct acpi_device *device) ...@@ -488,8 +505,7 @@ static int acpi_button_add(struct acpi_device *device)
strcpy(name, ACPI_BUTTON_DEVICE_NAME_LID); strcpy(name, ACPI_BUTTON_DEVICE_NAME_LID);
sprintf(class, "%s/%s", sprintf(class, "%s/%s",
ACPI_BUTTON_CLASS, ACPI_BUTTON_SUBCLASS_LID); ACPI_BUTTON_CLASS, ACPI_BUTTON_SUBCLASS_LID);
button->last_state = !!acpi_lid_evaluate_state(device); input->open = acpi_lid_input_open;
button->last_time = ktime_get();
} else { } else {
printk(KERN_ERR PREFIX "Unsupported hid [%s]\n", hid); printk(KERN_ERR PREFIX "Unsupported hid [%s]\n", hid);
error = -ENODEV; error = -ENODEV;
...@@ -522,11 +538,11 @@ static int acpi_button_add(struct acpi_device *device) ...@@ -522,11 +538,11 @@ static int acpi_button_add(struct acpi_device *device)
break; break;
} }
input_set_drvdata(input, device);
error = input_register_device(input); error = input_register_device(input);
if (error) if (error)
goto err_remove_fs; goto err_remove_fs;
if (button->type == ACPI_BUTTON_TYPE_LID) { if (button->type == ACPI_BUTTON_TYPE_LID) {
acpi_lid_initialize_state(device);
/* /*
* This assumes there's only one lid device, or if there are * This assumes there's only one lid device, or if there are
* more we only care about the last one... * more we only care about the last one...
......
This diff is collapsed.
...@@ -482,6 +482,7 @@ int dock_notify(struct acpi_device *adev, u32 event) ...@@ -482,6 +482,7 @@ int dock_notify(struct acpi_device *adev, u32 event)
surprise_removal = 1; surprise_removal = 1;
event = ACPI_NOTIFY_EJECT_REQUEST; event = ACPI_NOTIFY_EJECT_REQUEST;
/* Fall back */ /* Fall back */
/* fall through */
case ACPI_NOTIFY_EJECT_REQUEST: case ACPI_NOTIFY_EJECT_REQUEST:
begin_undock(ds); begin_undock(ds);
if ((immediate_undock && !(ds->flags & DOCK_IS_ATA)) if ((immediate_undock && !(ds->flags & DOCK_IS_ATA))
......
...@@ -486,7 +486,10 @@ static inline void __acpi_ec_enable_event(struct acpi_ec *ec) ...@@ -486,7 +486,10 @@ static inline void __acpi_ec_enable_event(struct acpi_ec *ec)
{ {
if (!test_and_set_bit(EC_FLAGS_QUERY_ENABLED, &ec->flags)) if (!test_and_set_bit(EC_FLAGS_QUERY_ENABLED, &ec->flags))
ec_log_drv("event unblocked"); ec_log_drv("event unblocked");
if (!test_bit(EC_FLAGS_QUERY_PENDING, &ec->flags)) /*
* Unconditionally invoke this once after enabling the event
* handling mechanism to detect the pending events.
*/
advance_transaction(ec); advance_transaction(ec);
} }
...@@ -1456,11 +1459,10 @@ static int ec_install_handlers(struct acpi_ec *ec, bool handle_events) ...@@ -1456,11 +1459,10 @@ static int ec_install_handlers(struct acpi_ec *ec, bool handle_events)
if (test_bit(EC_FLAGS_STARTED, &ec->flags) && if (test_bit(EC_FLAGS_STARTED, &ec->flags) &&
ec->reference_count >= 1) ec->reference_count >= 1)
acpi_ec_enable_gpe(ec, true); acpi_ec_enable_gpe(ec, true);
/* EC is fully operational, allow queries */
acpi_ec_enable_event(ec);
} }
} }
/* EC is fully operational, allow queries */
acpi_ec_enable_event(ec);
return 0; return 0;
} }
......
This diff is collapsed.
...@@ -381,6 +381,7 @@ unsigned int acpi_dev_get_irq_type(int triggering, int polarity) ...@@ -381,6 +381,7 @@ unsigned int acpi_dev_get_irq_type(int triggering, int polarity)
case ACPI_ACTIVE_BOTH: case ACPI_ACTIVE_BOTH:
if (triggering == ACPI_EDGE_SENSITIVE) if (triggering == ACPI_EDGE_SENSITIVE)
return IRQ_TYPE_EDGE_BOTH; return IRQ_TYPE_EDGE_BOTH;
/* fall through */
default: default:
return IRQ_TYPE_NONE; return IRQ_TYPE_NONE;
} }
......
...@@ -169,7 +169,8 @@ module_param_cb(debug_level, &param_ops_debug_level, &acpi_dbg_level, 0644); ...@@ -169,7 +169,8 @@ module_param_cb(debug_level, &param_ops_debug_level, &acpi_dbg_level, 0644);
static char trace_method_name[1024]; static char trace_method_name[1024];
int param_set_trace_method_name(const char *val, const struct kernel_param *kp) static int param_set_trace_method_name(const char *val,
const struct kernel_param *kp)
{ {
u32 saved_flags = 0; u32 saved_flags = 0;
bool is_abs_path = true; bool is_abs_path = true;
......
...@@ -71,18 +71,34 @@ static const struct always_present_id always_present_ids[] = { ...@@ -71,18 +71,34 @@ static const struct always_present_id always_present_ids[] = {
DMI_MATCH(DMI_PRODUCT_NAME, "Venue 11 Pro 7130"), DMI_MATCH(DMI_PRODUCT_NAME, "Venue 11 Pro 7130"),
}), }),
/* /*
* The GPD win BIOS dated 20170320 has disabled the accelerometer, the * The GPD win BIOS dated 20170221 has disabled the accelerometer, the
* drivers sometimes cause crashes under Windows and this is how the * drivers sometimes cause crashes under Windows and this is how the
* manufacturer has solved this :| Note that the the DMI data is less * manufacturer has solved this :| Note that the the DMI data is less
* generic then it seems, a board_vendor of "AMI Corporation" is quite * generic then it seems, a board_vendor of "AMI Corporation" is quite
* rare and a board_name of "Default String" also is rare. * rare and a board_name of "Default String" also is rare.
*
* Unfortunately the GPD pocket also uses these strings and its BIOS
* was copy-pasted from the GPD win, so it has a disabled KIOX000A
* node which we should not enable, thus we also check the BIOS date.
*/ */
ENTRY("KIOX000A", "1", ICPU(INTEL_FAM6_ATOM_AIRMONT), {
DMI_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"),
DMI_MATCH(DMI_BOARD_NAME, "Default string"),
DMI_MATCH(DMI_PRODUCT_NAME, "Default string"),
DMI_MATCH(DMI_BIOS_DATE, "02/21/2017")
}),
ENTRY("KIOX000A", "1", ICPU(INTEL_FAM6_ATOM_AIRMONT), { ENTRY("KIOX000A", "1", ICPU(INTEL_FAM6_ATOM_AIRMONT), {
DMI_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"), DMI_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"),
DMI_MATCH(DMI_BOARD_NAME, "Default string"), DMI_MATCH(DMI_BOARD_NAME, "Default string"),
DMI_MATCH(DMI_PRODUCT_NAME, "Default string"), DMI_MATCH(DMI_PRODUCT_NAME, "Default string"),
DMI_MATCH(DMI_BIOS_DATE, "03/20/2017") DMI_MATCH(DMI_BIOS_DATE, "03/20/2017")
}), }),
ENTRY("KIOX000A", "1", ICPU(INTEL_FAM6_ATOM_AIRMONT), {
DMI_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"),
DMI_MATCH(DMI_BOARD_NAME, "Default string"),
DMI_MATCH(DMI_PRODUCT_NAME, "Default string"),
DMI_MATCH(DMI_BIOS_DATE, "05/25/2017")
}),
}; };
bool acpi_device_always_present(struct acpi_device *adev) bool acpi_device_always_present(struct acpi_device *adev)
......
...@@ -69,7 +69,6 @@ ...@@ -69,7 +69,6 @@
#include "mailbox.h" #include "mailbox.h"
#define MAX_PCC_SUBSPACES 256
#define MBOX_IRQ_NAME "pcc-mbox" #define MBOX_IRQ_NAME "pcc-mbox"
static struct mbox_chan *pcc_mbox_channels; static struct mbox_chan *pcc_mbox_channels;
......
...@@ -126,8 +126,12 @@ struct acpi_exception_info { ...@@ -126,8 +126,12 @@ struct acpi_exception_info {
#define AE_NOT_CONFIGURED EXCEP_ENV (0x001C) #define AE_NOT_CONFIGURED EXCEP_ENV (0x001C)
#define AE_ACCESS EXCEP_ENV (0x001D) #define AE_ACCESS EXCEP_ENV (0x001D)
#define AE_IO_ERROR EXCEP_ENV (0x001E) #define AE_IO_ERROR EXCEP_ENV (0x001E)
#define AE_NUMERIC_OVERFLOW EXCEP_ENV (0x001F)
#define AE_HEX_OVERFLOW EXCEP_ENV (0x0020)
#define AE_DECIMAL_OVERFLOW EXCEP_ENV (0x0021)
#define AE_OCTAL_OVERFLOW EXCEP_ENV (0x0022)
#define AE_CODE_ENV_MAX 0x001E #define AE_CODE_ENV_MAX 0x0022
/* /*
* Programmer exceptions * Programmer exceptions
...@@ -263,7 +267,15 @@ static const struct acpi_exception_info acpi_gbl_exception_names_env[] = { ...@@ -263,7 +267,15 @@ static const struct acpi_exception_info acpi_gbl_exception_names_env[] = {
EXCEP_TXT("AE_NOT_CONFIGURED", EXCEP_TXT("AE_NOT_CONFIGURED",
"The interface is not part of the current subsystem configuration"), "The interface is not part of the current subsystem configuration"),
EXCEP_TXT("AE_ACCESS", "Permission denied for the requested operation"), EXCEP_TXT("AE_ACCESS", "Permission denied for the requested operation"),
EXCEP_TXT("AE_IO_ERROR", "An I/O error occurred") EXCEP_TXT("AE_IO_ERROR", "An I/O error occurred"),
EXCEP_TXT("AE_NUMERIC_OVERFLOW",
"Overflow during string-to-integer conversion"),
EXCEP_TXT("AE_HEX_OVERFLOW",
"Overflow during ASCII hex-to-binary conversion"),
EXCEP_TXT("AE_DECIMAL_OVERFLOW",
"Overflow during ASCII decimal-to-binary conversion"),
EXCEP_TXT("AE_OCTAL_OVERFLOW",
"Overflow during ASCII octal-to-binary conversion")
}; };
static const struct acpi_exception_info acpi_gbl_exception_names_pgm[] = { static const struct acpi_exception_info acpi_gbl_exception_names_pgm[] = {
......
...@@ -46,7 +46,7 @@ ...@@ -46,7 +46,7 @@
/* Current ACPICA subsystem version in YYYYMMDD format */ /* Current ACPICA subsystem version in YYYYMMDD format */
#define ACPI_CA_VERSION 0x20170728 #define ACPI_CA_VERSION 0x20170831
#include <acpi/acconfig.h> #include <acpi/acconfig.h>
#include <acpi/actypes.h> #include <acpi/actypes.h>
......
...@@ -69,6 +69,7 @@ ...@@ -69,6 +69,7 @@
#define ACPI_SIG_HEST "HEST" /* Hardware Error Source Table */ #define ACPI_SIG_HEST "HEST" /* Hardware Error Source Table */
#define ACPI_SIG_MADT "APIC" /* Multiple APIC Description Table */ #define ACPI_SIG_MADT "APIC" /* Multiple APIC Description Table */
#define ACPI_SIG_MSCT "MSCT" /* Maximum System Characteristics Table */ #define ACPI_SIG_MSCT "MSCT" /* Maximum System Characteristics Table */
#define ACPI_SIG_PDTT "PDTT" /* Processor Debug Trigger Table */
#define ACPI_SIG_PPTT "PPTT" /* Processor Properties Topology Table */ #define ACPI_SIG_PPTT "PPTT" /* Processor Properties Topology Table */
#define ACPI_SIG_SBST "SBST" /* Smart Battery Specification Table */ #define ACPI_SIG_SBST "SBST" /* Smart Battery Specification Table */
#define ACPI_SIG_SLIT "SLIT" /* System Locality Distance Information Table */ #define ACPI_SIG_SLIT "SLIT" /* System Locality Distance Information Table */
...@@ -1280,6 +1281,35 @@ struct acpi_nfit_flush_address { ...@@ -1280,6 +1281,35 @@ struct acpi_nfit_flush_address {
u64 hint_address[1]; /* Variable length */ u64 hint_address[1]; /* Variable length */
}; };
/*******************************************************************************
*
* PDTT - Processor Debug Trigger Table (ACPI 6.2)
* Version 0
*
******************************************************************************/
struct acpi_table_pdtt {
struct acpi_table_header header; /* Common ACPI table header */
u8 trigger_count;
u8 reserved[3];
u32 array_offset;
};
/*
* PDTT Communication Channel Identifier Structure.
* The number of these structures is defined by trigger_count above,
* starting at array_offset.
*/
struct acpi_pdtt_channel {
u16 sub_channel_id;
};
/* Mask and Flags for above */
#define ACPI_PDTT_SUBCHANNEL_ID_MASK 0x00FF
#define ACPI_PDTT_RUNTIME_TRIGGER (1<<8)
#define ACPI_PPTT_WAIT_COMPLETION (1<<9)
/******************************************************************************* /*******************************************************************************
* *
* PPTT - Processor Properties Topology Table (ACPI 6.2) * PPTT - Processor Properties Topology Table (ACPI 6.2)
......
...@@ -51,7 +51,6 @@ int erst_clear(u64 record_id); ...@@ -51,7 +51,6 @@ int erst_clear(u64 record_id);
int arch_apei_enable_cmcff(struct acpi_hest_header *hest_hdr, void *data); int arch_apei_enable_cmcff(struct acpi_hest_header *hest_hdr, void *data);
void arch_apei_report_mem_error(int sev, struct cper_sec_mem_err *mem_err); void arch_apei_report_mem_error(int sev, struct cper_sec_mem_err *mem_err);
void arch_apei_flush_tlb_one(unsigned long addr);
#endif #endif
#endif #endif
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include <linux/mailbox_controller.h> #include <linux/mailbox_controller.h>
#include <linux/mailbox_client.h> #include <linux/mailbox_client.h>
#define MAX_PCC_SUBSPACES 256
#ifdef CONFIG_PCC #ifdef CONFIG_PCC
extern struct mbox_chan *pcc_mbox_request_channel(struct mbox_client *cl, extern struct mbox_chan *pcc_mbox_request_channel(struct mbox_client *cl,
int subspace_id); int subspace_id);
......
...@@ -39,6 +39,7 @@ TOOL_OBJS = \ ...@@ -39,6 +39,7 @@ TOOL_OBJS = \
utnonansi.o\ utnonansi.o\
utprint.o\ utprint.o\
utstring.o\ utstring.o\
utstrsuppt.o\
utstrtoul64.o\ utstrtoul64.o\
utxferror.o\ utxferror.o\
oslinuxtbl.o\ oslinuxtbl.o\
......
...@@ -287,8 +287,7 @@ int ap_dump_table_by_address(char *ascii_address) ...@@ -287,8 +287,7 @@ int ap_dump_table_by_address(char *ascii_address)
/* Convert argument to an integer physical address */ /* Convert argument to an integer physical address */
status = acpi_ut_strtoul64(ascii_address, ACPI_STRTOUL_64BIT, status = acpi_ut_strtoul64(ascii_address, &long_address);
&long_address);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
fprintf(stderr, "%s: Could not convert to a physical address\n", fprintf(stderr, "%s: Could not convert to a physical address\n",
ascii_address); ascii_address);
......
...@@ -208,9 +208,7 @@ static int ap_do_options(int argc, char **argv) ...@@ -208,9 +208,7 @@ static int ap_do_options(int argc, char **argv)
case 'r': /* Dump tables from specified RSDP */ case 'r': /* Dump tables from specified RSDP */
status = status =
acpi_ut_strtoul64(acpi_gbl_optarg, acpi_ut_strtoul64(acpi_gbl_optarg, &gbl_rsdp_base);
ACPI_STRTOUL_64BIT,
&gbl_rsdp_base);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
fprintf(stderr, fprintf(stderr,
"%s: Could not convert to a physical address\n", "%s: Could not convert to a physical address\n",
......
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