1592 lines · c
1/* SPDX-License-Identifier: GPL-2.0-or-later */2/*3 * acpi.h - ACPI Interface4 *5 * Copyright (C) 2001 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>6 */7 8#ifndef _LINUX_ACPI_H9#define _LINUX_ACPI_H10 11#include <linux/errno.h>12#include <linux/ioport.h> /* for struct resource */13#include <linux/resource_ext.h>14#include <linux/device.h>15#include <linux/mod_devicetable.h>16#include <linux/property.h>17#include <linux/uuid.h>18#include <linux/node.h>19 20struct irq_domain;21struct irq_domain_ops;22 23#ifndef _LINUX24#define _LINUX25#endif26#include <acpi/acpi.h>27#include <acpi/acpi_numa.h>28 29#ifdef CONFIG_ACPI30 31#include <linux/list.h>32#include <linux/dynamic_debug.h>33#include <linux/module.h>34#include <linux/mutex.h>35#include <linux/fw_table.h>36 37#include <acpi/acpi_bus.h>38#include <acpi/acpi_drivers.h>39#include <acpi/acpi_io.h>40#include <asm/acpi.h>41 42#ifdef CONFIG_ACPI_TABLE_LIB43#define EXPORT_SYMBOL_ACPI_LIB(x) EXPORT_SYMBOL_NS_GPL(x, ACPI)44#define __init_or_acpilib45#define __initdata_or_acpilib46#else47#define EXPORT_SYMBOL_ACPI_LIB(x)48#define __init_or_acpilib __init49#define __initdata_or_acpilib __initdata50#endif51 52static inline acpi_handle acpi_device_handle(struct acpi_device *adev)53{54 return adev ? adev->handle : NULL;55}56 57#define ACPI_COMPANION(dev) to_acpi_device_node((dev)->fwnode)58#define ACPI_COMPANION_SET(dev, adev) set_primary_fwnode(dev, (adev) ? \59 acpi_fwnode_handle(adev) : NULL)60#define ACPI_HANDLE(dev) acpi_device_handle(ACPI_COMPANION(dev))61#define ACPI_HANDLE_FWNODE(fwnode) \62 acpi_device_handle(to_acpi_device_node(fwnode))63 64static inline struct fwnode_handle *acpi_alloc_fwnode_static(void)65{66 struct fwnode_handle *fwnode;67 68 fwnode = kzalloc(sizeof(struct fwnode_handle), GFP_KERNEL);69 if (!fwnode)70 return NULL;71 72 fwnode_init(fwnode, &acpi_static_fwnode_ops);73 74 return fwnode;75}76 77static inline void acpi_free_fwnode_static(struct fwnode_handle *fwnode)78{79 if (WARN_ON(!is_acpi_static_node(fwnode)))80 return;81 82 kfree(fwnode);83}84 85static inline bool has_acpi_companion(struct device *dev)86{87 return is_acpi_device_node(dev->fwnode);88}89 90static inline void acpi_preset_companion(struct device *dev,91 struct acpi_device *parent, u64 addr)92{93 ACPI_COMPANION_SET(dev, acpi_find_child_device(parent, addr, false));94}95 96static inline const char *acpi_dev_name(struct acpi_device *adev)97{98 return dev_name(&adev->dev);99}100 101struct device *acpi_get_first_physical_node(struct acpi_device *adev);102 103enum acpi_irq_model_id {104 ACPI_IRQ_MODEL_PIC = 0,105 ACPI_IRQ_MODEL_IOAPIC,106 ACPI_IRQ_MODEL_IOSAPIC,107 ACPI_IRQ_MODEL_PLATFORM,108 ACPI_IRQ_MODEL_GIC,109 ACPI_IRQ_MODEL_LPIC,110 ACPI_IRQ_MODEL_RINTC,111 ACPI_IRQ_MODEL_COUNT112};113 114extern enum acpi_irq_model_id acpi_irq_model;115 116enum acpi_interrupt_id {117 ACPI_INTERRUPT_PMI = 1,118 ACPI_INTERRUPT_INIT,119 ACPI_INTERRUPT_CPEI,120 ACPI_INTERRUPT_COUNT121};122 123#define ACPI_SPACE_MEM 0124 125enum acpi_address_range_id {126 ACPI_ADDRESS_RANGE_MEMORY = 1,127 ACPI_ADDRESS_RANGE_RESERVED = 2,128 ACPI_ADDRESS_RANGE_ACPI = 3,129 ACPI_ADDRESS_RANGE_NVS = 4,130 ACPI_ADDRESS_RANGE_COUNT131};132 133 134/* Table Handlers */135typedef int (*acpi_tbl_table_handler)(struct acpi_table_header *table);136 137/* Debugger support */138 139struct acpi_debugger_ops {140 int (*create_thread)(acpi_osd_exec_callback function, void *context);141 ssize_t (*write_log)(const char *msg);142 ssize_t (*read_cmd)(char *buffer, size_t length);143 int (*wait_command_ready)(bool single_step, char *buffer, size_t length);144 int (*notify_command_complete)(void);145};146 147struct acpi_debugger {148 const struct acpi_debugger_ops *ops;149 struct module *owner;150 struct mutex lock;151};152 153#ifdef CONFIG_ACPI_DEBUGGER154int __init acpi_debugger_init(void);155int acpi_register_debugger(struct module *owner,156 const struct acpi_debugger_ops *ops);157void acpi_unregister_debugger(const struct acpi_debugger_ops *ops);158int acpi_debugger_create_thread(acpi_osd_exec_callback function, void *context);159ssize_t acpi_debugger_write_log(const char *msg);160ssize_t acpi_debugger_read_cmd(char *buffer, size_t buffer_length);161int acpi_debugger_wait_command_ready(void);162int acpi_debugger_notify_command_complete(void);163#else164static inline int acpi_debugger_init(void)165{166 return -ENODEV;167}168 169static inline int acpi_register_debugger(struct module *owner,170 const struct acpi_debugger_ops *ops)171{172 return -ENODEV;173}174 175static inline void acpi_unregister_debugger(const struct acpi_debugger_ops *ops)176{177}178 179static inline int acpi_debugger_create_thread(acpi_osd_exec_callback function,180 void *context)181{182 return -ENODEV;183}184 185static inline int acpi_debugger_write_log(const char *msg)186{187 return -ENODEV;188}189 190static inline int acpi_debugger_read_cmd(char *buffer, u32 buffer_length)191{192 return -ENODEV;193}194 195static inline int acpi_debugger_wait_command_ready(void)196{197 return -ENODEV;198}199 200static inline int acpi_debugger_notify_command_complete(void)201{202 return -ENODEV;203}204#endif205 206#define BAD_MADT_ENTRY(entry, end) ( \207 (!entry) || (unsigned long)entry + sizeof(*entry) > end || \208 ((struct acpi_subtable_header *)entry)->length < sizeof(*entry))209 210void __iomem *__acpi_map_table(unsigned long phys, unsigned long size);211void __acpi_unmap_table(void __iomem *map, unsigned long size);212int early_acpi_boot_init(void);213int acpi_boot_init (void);214void acpi_boot_table_prepare (void);215void acpi_boot_table_init (void);216int acpi_mps_check (void);217int acpi_numa_init (void);218 219int acpi_locate_initial_tables (void);220void acpi_reserve_initial_tables (void);221void acpi_table_init_complete (void);222int acpi_table_init (void);223 224int acpi_table_parse(char *id, acpi_tbl_table_handler handler);225int __init_or_acpilib acpi_table_parse_entries(char *id,226 unsigned long table_size, int entry_id,227 acpi_tbl_entry_handler handler, unsigned int max_entries);228int __init_or_acpilib acpi_table_parse_entries_array(char *id,229 unsigned long table_size, struct acpi_subtable_proc *proc,230 int proc_num, unsigned int max_entries);231int acpi_table_parse_madt(enum acpi_madt_type id,232 acpi_tbl_entry_handler handler,233 unsigned int max_entries);234int __init_or_acpilib235acpi_table_parse_cedt(enum acpi_cedt_type id,236 acpi_tbl_entry_handler_arg handler_arg, void *arg);237 238int acpi_parse_mcfg (struct acpi_table_header *header);239void acpi_table_print_madt_entry (struct acpi_subtable_header *madt);240 241#if defined(CONFIG_X86) || defined(CONFIG_LOONGARCH)242void acpi_numa_processor_affinity_init (struct acpi_srat_cpu_affinity *pa);243#else244static inline void245acpi_numa_processor_affinity_init(struct acpi_srat_cpu_affinity *pa) { }246#endif247 248void acpi_numa_x2apic_affinity_init(struct acpi_srat_x2apic_cpu_affinity *pa);249 250#if defined(CONFIG_ARM64) || defined(CONFIG_LOONGARCH)251void acpi_arch_dma_setup(struct device *dev);252#else253static inline void acpi_arch_dma_setup(struct device *dev) { }254#endif255 256#ifdef CONFIG_ARM64257void acpi_numa_gicc_affinity_init(struct acpi_srat_gicc_affinity *pa);258#else259static inline void260acpi_numa_gicc_affinity_init(struct acpi_srat_gicc_affinity *pa) { }261#endif262 263#ifdef CONFIG_RISCV264void acpi_numa_rintc_affinity_init(struct acpi_srat_rintc_affinity *pa);265#else266static inline void acpi_numa_rintc_affinity_init(struct acpi_srat_rintc_affinity *pa) { }267#endif268 269#ifndef PHYS_CPUID_INVALID270typedef u32 phys_cpuid_t;271#define PHYS_CPUID_INVALID (phys_cpuid_t)(-1)272#endif273 274static inline bool invalid_logical_cpuid(u32 cpuid)275{276 return (int)cpuid < 0;277}278 279static inline bool invalid_phys_cpuid(phys_cpuid_t phys_id)280{281 return phys_id == PHYS_CPUID_INVALID;282}283 284 285int __init acpi_get_madt_revision(void);286 287/* Validate the processor object's proc_id */288bool acpi_duplicate_processor_id(int proc_id);289/* Processor _CTS control */290struct acpi_processor_power;291 292#ifdef CONFIG_ACPI_PROCESSOR_CSTATE293bool acpi_processor_claim_cst_control(void);294int acpi_processor_evaluate_cst(acpi_handle handle, u32 cpu,295 struct acpi_processor_power *info);296#else297static inline bool acpi_processor_claim_cst_control(void) { return false; }298static inline int acpi_processor_evaluate_cst(acpi_handle handle, u32 cpu,299 struct acpi_processor_power *info)300{301 return -ENODEV;302}303#endif304 305#ifdef CONFIG_ACPI_HOTPLUG_CPU306/* Arch dependent functions for cpu hotplug support */307int acpi_map_cpu(acpi_handle handle, phys_cpuid_t physid, u32 acpi_id,308 int *pcpu);309int acpi_unmap_cpu(int cpu);310#endif /* CONFIG_ACPI_HOTPLUG_CPU */311 312acpi_handle acpi_get_processor_handle(int cpu);313 314#ifdef CONFIG_ACPI_HOTPLUG_IOAPIC315int acpi_get_ioapic_id(acpi_handle handle, u32 gsi_base, u64 *phys_addr);316#endif317 318int acpi_register_ioapic(acpi_handle handle, u64 phys_addr, u32 gsi_base);319int acpi_unregister_ioapic(acpi_handle handle, u32 gsi_base);320int acpi_ioapic_registered(acpi_handle handle, u32 gsi_base);321void acpi_irq_stats_init(void);322extern u32 acpi_irq_handled;323extern u32 acpi_irq_not_handled;324extern unsigned int acpi_sci_irq;325extern bool acpi_no_s5;326#define INVALID_ACPI_IRQ ((unsigned)-1)327static inline bool acpi_sci_irq_valid(void)328{329 return acpi_sci_irq != INVALID_ACPI_IRQ;330}331 332extern int sbf_port;333extern unsigned long acpi_realmode_flags;334 335int acpi_register_gsi (struct device *dev, u32 gsi, int triggering, int polarity);336int acpi_gsi_to_irq (u32 gsi, unsigned int *irq);337int acpi_isa_irq_to_gsi (unsigned isa_irq, u32 *gsi);338 339void acpi_set_irq_model(enum acpi_irq_model_id model,340 struct fwnode_handle *(*)(u32));341void acpi_set_gsi_to_irq_fallback(u32 (*)(u32));342 343struct irq_domain *acpi_irq_create_hierarchy(unsigned int flags,344 unsigned int size,345 struct fwnode_handle *fwnode,346 const struct irq_domain_ops *ops,347 void *host_data);348 349#ifdef CONFIG_X86_IO_APIC350extern int acpi_get_override_irq(u32 gsi, int *trigger, int *polarity);351#else352static inline int acpi_get_override_irq(u32 gsi, int *trigger, int *polarity)353{354 return -1;355}356#endif357/*358 * This function undoes the effect of one call to acpi_register_gsi().359 * If this matches the last registration, any IRQ resources for gsi360 * are freed.361 */362void acpi_unregister_gsi (u32 gsi);363 364struct pci_dev;365 366struct acpi_prt_entry *acpi_pci_irq_lookup(struct pci_dev *dev, int pin);367int acpi_pci_irq_enable (struct pci_dev *dev);368void acpi_penalize_isa_irq(int irq, int active);369bool acpi_isa_irq_available(int irq);370#ifdef CONFIG_PCI371void acpi_penalize_sci_irq(int irq, int trigger, int polarity);372#else373static inline void acpi_penalize_sci_irq(int irq, int trigger,374 int polarity)375{376}377#endif378void acpi_pci_irq_disable (struct pci_dev *dev);379 380extern int ec_read(u8 addr, u8 *val);381extern int ec_write(u8 addr, u8 val);382extern int ec_transaction(u8 command,383 const u8 *wdata, unsigned wdata_len,384 u8 *rdata, unsigned rdata_len);385extern acpi_handle ec_get_handle(void);386 387extern bool acpi_is_pnp_device(struct acpi_device *);388 389#if defined(CONFIG_ACPI_WMI) || defined(CONFIG_ACPI_WMI_MODULE)390 391typedef void (*wmi_notify_handler) (union acpi_object *data, void *context);392 393int wmi_instance_count(const char *guid);394 395extern acpi_status wmi_evaluate_method(const char *guid, u8 instance,396 u32 method_id,397 const struct acpi_buffer *in,398 struct acpi_buffer *out);399extern acpi_status wmi_query_block(const char *guid, u8 instance,400 struct acpi_buffer *out);401extern acpi_status wmi_set_block(const char *guid, u8 instance,402 const struct acpi_buffer *in);403extern acpi_status wmi_install_notify_handler(const char *guid,404 wmi_notify_handler handler, void *data);405extern acpi_status wmi_remove_notify_handler(const char *guid);406extern bool wmi_has_guid(const char *guid);407extern char *wmi_get_acpi_device_uid(const char *guid);408 409#endif /* CONFIG_ACPI_WMI */410 411#define ACPI_VIDEO_OUTPUT_SWITCHING 0x0001412#define ACPI_VIDEO_DEVICE_POSTING 0x0002413#define ACPI_VIDEO_ROM_AVAILABLE 0x0004414#define ACPI_VIDEO_BACKLIGHT 0x0008415#define ACPI_VIDEO_BACKLIGHT_FORCE_VENDOR 0x0010416#define ACPI_VIDEO_BACKLIGHT_FORCE_VIDEO 0x0020417#define ACPI_VIDEO_OUTPUT_SWITCHING_FORCE_VENDOR 0x0040418#define ACPI_VIDEO_OUTPUT_SWITCHING_FORCE_VIDEO 0x0080419#define ACPI_VIDEO_BACKLIGHT_DMI_VENDOR 0x0100420#define ACPI_VIDEO_BACKLIGHT_DMI_VIDEO 0x0200421#define ACPI_VIDEO_OUTPUT_SWITCHING_DMI_VENDOR 0x0400422#define ACPI_VIDEO_OUTPUT_SWITCHING_DMI_VIDEO 0x0800423 424extern char acpi_video_backlight_string[];425extern long acpi_is_video_device(acpi_handle handle);426 427extern void acpi_osi_setup(char *str);428extern bool acpi_osi_is_win8(void);429 430#ifdef CONFIG_ACPI_THERMAL_LIB431int thermal_acpi_active_trip_temp(struct acpi_device *adev, int id, int *ret_temp);432int thermal_acpi_passive_trip_temp(struct acpi_device *adev, int *ret_temp);433int thermal_acpi_hot_trip_temp(struct acpi_device *adev, int *ret_temp);434int thermal_acpi_critical_trip_temp(struct acpi_device *adev, int *ret_temp);435#endif436 437#ifdef CONFIG_ACPI_HMAT438int acpi_get_genport_coordinates(u32 uid, struct access_coordinate *coord);439#else440static inline int acpi_get_genport_coordinates(u32 uid,441 struct access_coordinate *coord)442{443 return -EOPNOTSUPP;444}445#endif446 447#ifdef CONFIG_ACPI_NUMA448int acpi_map_pxm_to_node(int pxm);449int acpi_get_node(acpi_handle handle);450 451/**452 * pxm_to_online_node - Map proximity ID to online node453 * @pxm: ACPI proximity ID454 *455 * This is similar to pxm_to_node(), but always returns an online456 * node. When the mapped node from a given proximity ID is offline, it457 * looks up the node distance table and returns the nearest online node.458 *459 * ACPI device drivers, which are called after the NUMA initialization has460 * completed in the kernel, can call this interface to obtain their device461 * NUMA topology from ACPI tables. Such drivers do not have to deal with462 * offline nodes. A node may be offline when SRAT memory entry does not exist,463 * or NUMA is disabled, ex. "numa=off" on x86.464 */465static inline int pxm_to_online_node(int pxm)466{467 int node = pxm_to_node(pxm);468 469 return numa_map_to_online_node(node);470}471#else472static inline int pxm_to_online_node(int pxm)473{474 return 0;475}476static inline int acpi_map_pxm_to_node(int pxm)477{478 return 0;479}480static inline int acpi_get_node(acpi_handle handle)481{482 return 0;483}484#endif485extern int pnpacpi_disabled;486 487#define PXM_INVAL (-1)488 489bool acpi_dev_resource_memory(struct acpi_resource *ares, struct resource *res);490bool acpi_dev_resource_io(struct acpi_resource *ares, struct resource *res);491bool acpi_dev_resource_address_space(struct acpi_resource *ares,492 struct resource_win *win);493bool acpi_dev_resource_ext_address_space(struct acpi_resource *ares,494 struct resource_win *win);495unsigned long acpi_dev_irq_flags(u8 triggering, u8 polarity, u8 shareable, u8 wake_capable);496unsigned int acpi_dev_get_irq_type(int triggering, int polarity);497bool acpi_dev_resource_interrupt(struct acpi_resource *ares, int index,498 struct resource *res);499 500void acpi_dev_free_resource_list(struct list_head *list);501int acpi_dev_get_resources(struct acpi_device *adev, struct list_head *list,502 int (*preproc)(struct acpi_resource *, void *),503 void *preproc_data);504int acpi_dev_get_dma_resources(struct acpi_device *adev,505 struct list_head *list);506int acpi_dev_get_memory_resources(struct acpi_device *adev, struct list_head *list);507int acpi_dev_filter_resource_type(struct acpi_resource *ares,508 unsigned long types);509 510static inline int acpi_dev_filter_resource_type_cb(struct acpi_resource *ares,511 void *arg)512{513 return acpi_dev_filter_resource_type(ares, (unsigned long)arg);514}515 516struct acpi_device *acpi_resource_consumer(struct resource *res);517 518int acpi_check_resource_conflict(const struct resource *res);519 520int acpi_check_region(resource_size_t start, resource_size_t n,521 const char *name);522 523int acpi_resources_are_enforced(void);524 525#ifdef CONFIG_HIBERNATION526extern int acpi_check_s4_hw_signature;527#endif528 529#ifdef CONFIG_PM_SLEEP530void __init acpi_old_suspend_ordering(void);531void __init acpi_nvs_nosave(void);532void __init acpi_nvs_nosave_s3(void);533void __init acpi_sleep_no_blacklist(void);534#endif /* CONFIG_PM_SLEEP */535 536int acpi_register_wakeup_handler(537 int wake_irq, bool (*wakeup)(void *context), void *context);538void acpi_unregister_wakeup_handler(539 bool (*wakeup)(void *context), void *context);540 541struct acpi_osc_context {542 char *uuid_str; /* UUID string */543 int rev;544 struct acpi_buffer cap; /* list of DWORD capabilities */545 struct acpi_buffer ret; /* free by caller if success */546};547 548acpi_status acpi_run_osc(acpi_handle handle, struct acpi_osc_context *context);549 550/* Number of _OSC capability DWORDS depends on bridge type */551#define OSC_PCI_CAPABILITY_DWORDS 3552#define OSC_CXL_CAPABILITY_DWORDS 5553 554/* Indexes into _OSC Capabilities Buffer (DWORDs 2 to 5 are device-specific) */555#define OSC_QUERY_DWORD 0 /* DWORD 1 */556#define OSC_SUPPORT_DWORD 1 /* DWORD 2 */557#define OSC_CONTROL_DWORD 2 /* DWORD 3 */558#define OSC_EXT_SUPPORT_DWORD 3 /* DWORD 4 */559#define OSC_EXT_CONTROL_DWORD 4 /* DWORD 5 */560 561/* _OSC Capabilities DWORD 1: Query/Control and Error Returns (generic) */562#define OSC_QUERY_ENABLE 0x00000001 /* input */563#define OSC_REQUEST_ERROR 0x00000002 /* return */564#define OSC_INVALID_UUID_ERROR 0x00000004 /* return */565#define OSC_INVALID_REVISION_ERROR 0x00000008 /* return */566#define OSC_CAPABILITIES_MASK_ERROR 0x00000010 /* return */567 568/* Platform-Wide Capabilities _OSC: Capabilities DWORD 2: Support Field */569#define OSC_SB_PAD_SUPPORT 0x00000001570#define OSC_SB_PPC_OST_SUPPORT 0x00000002571#define OSC_SB_PR3_SUPPORT 0x00000004572#define OSC_SB_HOTPLUG_OST_SUPPORT 0x00000008573#define OSC_SB_APEI_SUPPORT 0x00000010574#define OSC_SB_CPC_SUPPORT 0x00000020575#define OSC_SB_CPCV2_SUPPORT 0x00000040576#define OSC_SB_PCLPI_SUPPORT 0x00000080577#define OSC_SB_OSLPI_SUPPORT 0x00000100578#define OSC_SB_FAST_THERMAL_SAMPLING_SUPPORT 0x00000200579#define OSC_SB_OVER_16_PSTATES_SUPPORT 0x00000400580#define OSC_SB_GED_SUPPORT 0x00000800581#define OSC_SB_CPC_DIVERSE_HIGH_SUPPORT 0x00001000582#define OSC_SB_IRQ_RESOURCE_SOURCE_SUPPORT 0x00002000583#define OSC_SB_CPC_FLEXIBLE_ADR_SPACE 0x00004000584#define OSC_SB_GENERIC_INITIATOR_SUPPORT 0x00020000585#define OSC_SB_NATIVE_USB4_SUPPORT 0x00040000586#define OSC_SB_BATTERY_CHARGE_LIMITING_SUPPORT 0x00080000587#define OSC_SB_PRM_SUPPORT 0x00200000588#define OSC_SB_FFH_OPR_SUPPORT 0x00400000589 590extern bool osc_sb_apei_support_acked;591extern bool osc_pc_lpi_support_confirmed;592extern bool osc_sb_native_usb4_support_confirmed;593extern bool osc_sb_cppc2_support_acked;594extern bool osc_cpc_flexible_adr_space_confirmed;595 596/* USB4 Capabilities */597#define OSC_USB_USB3_TUNNELING 0x00000001598#define OSC_USB_DP_TUNNELING 0x00000002599#define OSC_USB_PCIE_TUNNELING 0x00000004600#define OSC_USB_XDOMAIN 0x00000008601 602extern u32 osc_sb_native_usb4_control;603 604/* PCI Host Bridge _OSC: Capabilities DWORD 2: Support Field */605#define OSC_PCI_EXT_CONFIG_SUPPORT 0x00000001606#define OSC_PCI_ASPM_SUPPORT 0x00000002607#define OSC_PCI_CLOCK_PM_SUPPORT 0x00000004608#define OSC_PCI_SEGMENT_GROUPS_SUPPORT 0x00000008609#define OSC_PCI_MSI_SUPPORT 0x00000010610#define OSC_PCI_EDR_SUPPORT 0x00000080611#define OSC_PCI_HPX_TYPE_3_SUPPORT 0x00000100612 613/* PCI Host Bridge _OSC: Capabilities DWORD 3: Control Field */614#define OSC_PCI_EXPRESS_NATIVE_HP_CONTROL 0x00000001615#define OSC_PCI_SHPC_NATIVE_HP_CONTROL 0x00000002616#define OSC_PCI_EXPRESS_PME_CONTROL 0x00000004617#define OSC_PCI_EXPRESS_AER_CONTROL 0x00000008618#define OSC_PCI_EXPRESS_CAPABILITY_CONTROL 0x00000010619#define OSC_PCI_EXPRESS_LTR_CONTROL 0x00000020620#define OSC_PCI_EXPRESS_DPC_CONTROL 0x00000080621 622/* CXL _OSC: Capabilities DWORD 4: Support Field */623#define OSC_CXL_1_1_PORT_REG_ACCESS_SUPPORT 0x00000001624#define OSC_CXL_2_0_PORT_DEV_REG_ACCESS_SUPPORT 0x00000002625#define OSC_CXL_PROTOCOL_ERR_REPORTING_SUPPORT 0x00000004626#define OSC_CXL_NATIVE_HP_SUPPORT 0x00000008627 628/* CXL _OSC: Capabilities DWORD 5: Control Field */629#define OSC_CXL_ERROR_REPORTING_CONTROL 0x00000001630 631static inline u32 acpi_osc_ctx_get_pci_control(struct acpi_osc_context *context)632{633 u32 *ret = context->ret.pointer;634 635 return ret[OSC_CONTROL_DWORD];636}637 638static inline u32 acpi_osc_ctx_get_cxl_control(struct acpi_osc_context *context)639{640 u32 *ret = context->ret.pointer;641 642 return ret[OSC_EXT_CONTROL_DWORD];643}644 645#define ACPI_GSB_ACCESS_ATTRIB_QUICK 0x00000002646#define ACPI_GSB_ACCESS_ATTRIB_SEND_RCV 0x00000004647#define ACPI_GSB_ACCESS_ATTRIB_BYTE 0x00000006648#define ACPI_GSB_ACCESS_ATTRIB_WORD 0x00000008649#define ACPI_GSB_ACCESS_ATTRIB_BLOCK 0x0000000A650#define ACPI_GSB_ACCESS_ATTRIB_MULTIBYTE 0x0000000B651#define ACPI_GSB_ACCESS_ATTRIB_WORD_CALL 0x0000000C652#define ACPI_GSB_ACCESS_ATTRIB_BLOCK_CALL 0x0000000D653#define ACPI_GSB_ACCESS_ATTRIB_RAW_BYTES 0x0000000E654#define ACPI_GSB_ACCESS_ATTRIB_RAW_PROCESS 0x0000000F655 656/* Enable _OST when all relevant hotplug operations are enabled */657#if defined(CONFIG_ACPI_HOTPLUG_CPU) && \658 defined(CONFIG_ACPI_HOTPLUG_MEMORY) && \659 defined(CONFIG_ACPI_CONTAINER)660#define ACPI_HOTPLUG_OST661#endif662 663/* _OST Source Event Code (OSPM Action) */664#define ACPI_OST_EC_OSPM_SHUTDOWN 0x100665#define ACPI_OST_EC_OSPM_EJECT 0x103666#define ACPI_OST_EC_OSPM_INSERTION 0x200667 668/* _OST General Processing Status Code */669#define ACPI_OST_SC_SUCCESS 0x0670#define ACPI_OST_SC_NON_SPECIFIC_FAILURE 0x1671#define ACPI_OST_SC_UNRECOGNIZED_NOTIFY 0x2672 673/* _OST OS Shutdown Processing (0x100) Status Code */674#define ACPI_OST_SC_OS_SHUTDOWN_DENIED 0x80675#define ACPI_OST_SC_OS_SHUTDOWN_IN_PROGRESS 0x81676#define ACPI_OST_SC_OS_SHUTDOWN_COMPLETED 0x82677#define ACPI_OST_SC_OS_SHUTDOWN_NOT_SUPPORTED 0x83678 679/* _OST Ejection Request (0x3, 0x103) Status Code */680#define ACPI_OST_SC_EJECT_NOT_SUPPORTED 0x80681#define ACPI_OST_SC_DEVICE_IN_USE 0x81682#define ACPI_OST_SC_DEVICE_BUSY 0x82683#define ACPI_OST_SC_EJECT_DEPENDENCY_BUSY 0x83684#define ACPI_OST_SC_EJECT_IN_PROGRESS 0x84685 686/* _OST Insertion Request (0x200) Status Code */687#define ACPI_OST_SC_INSERT_IN_PROGRESS 0x80688#define ACPI_OST_SC_DRIVER_LOAD_FAILURE 0x81689#define ACPI_OST_SC_INSERT_NOT_SUPPORTED 0x82690 691enum acpi_predicate {692 all_versions,693 less_than_or_equal,694 equal,695 greater_than_or_equal,696};697 698/* Table must be terminted by a NULL entry */699struct acpi_platform_list {700 char oem_id[ACPI_OEM_ID_SIZE+1];701 char oem_table_id[ACPI_OEM_TABLE_ID_SIZE+1];702 u32 oem_revision;703 char *table;704 enum acpi_predicate pred;705 char *reason;706 u32 data;707};708int acpi_match_platform_list(const struct acpi_platform_list *plat);709 710extern void acpi_early_init(void);711extern void acpi_subsystem_init(void);712 713extern int acpi_nvs_register(__u64 start, __u64 size);714 715extern int acpi_nvs_for_each_region(int (*func)(__u64, __u64, void *),716 void *data);717 718const struct acpi_device_id *acpi_match_acpi_device(const struct acpi_device_id *ids,719 const struct acpi_device *adev);720 721const struct acpi_device_id *acpi_match_device(const struct acpi_device_id *ids,722 const struct device *dev);723 724const void *acpi_device_get_match_data(const struct device *dev);725extern bool acpi_driver_match_device(struct device *dev,726 const struct device_driver *drv);727int acpi_device_uevent_modalias(const struct device *, struct kobj_uevent_env *);728int acpi_device_modalias(struct device *, char *, int);729 730struct platform_device *acpi_create_platform_device(struct acpi_device *,731 const struct property_entry *);732#define ACPI_PTR(_ptr) (_ptr)733 734static inline void acpi_device_set_enumerated(struct acpi_device *adev)735{736 adev->flags.visited = true;737}738 739static inline void acpi_device_clear_enumerated(struct acpi_device *adev)740{741 adev->flags.visited = false;742}743 744enum acpi_reconfig_event {745 ACPI_RECONFIG_DEVICE_ADD = 0,746 ACPI_RECONFIG_DEVICE_REMOVE,747};748 749int acpi_reconfig_notifier_register(struct notifier_block *nb);750int acpi_reconfig_notifier_unregister(struct notifier_block *nb);751 752#ifdef CONFIG_ACPI_GTDT753int acpi_gtdt_init(struct acpi_table_header *table, int *platform_timer_count);754int acpi_gtdt_map_ppi(int type);755bool acpi_gtdt_c3stop(int type);756int acpi_arch_timer_mem_init(struct arch_timer_mem *timer_mem, int *timer_count);757#endif758 759#ifndef ACPI_HAVE_ARCH_SET_ROOT_POINTER760static inline void acpi_arch_set_root_pointer(u64 addr)761{762}763#endif764 765#ifndef ACPI_HAVE_ARCH_GET_ROOT_POINTER766static inline u64 acpi_arch_get_root_pointer(void)767{768 return 0;769}770#endif771 772int acpi_get_local_u64_address(acpi_handle handle, u64 *addr);773int acpi_get_local_address(acpi_handle handle, u32 *addr);774const char *acpi_get_subsystem_id(acpi_handle handle);775 776#else /* !CONFIG_ACPI */777 778#define acpi_disabled 1779 780#define ACPI_COMPANION(dev) (NULL)781#define ACPI_COMPANION_SET(dev, adev) do { } while (0)782#define ACPI_HANDLE(dev) (NULL)783#define ACPI_HANDLE_FWNODE(fwnode) (NULL)784 785/* Get rid of the -Wunused-variable for adev */786#define acpi_dev_uid_match(adev, uid2) (adev && false)787#define acpi_dev_hid_uid_match(adev, hid2, uid2) (adev && false)788 789struct fwnode_handle;790 791static inline bool acpi_dev_found(const char *hid)792{793 return false;794}795 796static inline bool acpi_dev_present(const char *hid, const char *uid, s64 hrv)797{798 return false;799}800 801struct acpi_device;802 803static inline int acpi_dev_uid_to_integer(struct acpi_device *adev, u64 *integer)804{805 return -ENODEV;806}807 808static inline struct acpi_device *809acpi_dev_get_first_match_dev(const char *hid, const char *uid, s64 hrv)810{811 return NULL;812}813 814static inline bool acpi_reduced_hardware(void)815{816 return false;817}818 819static inline void acpi_dev_put(struct acpi_device *adev) {}820 821static inline bool is_acpi_node(const struct fwnode_handle *fwnode)822{823 return false;824}825 826static inline bool is_acpi_device_node(const struct fwnode_handle *fwnode)827{828 return false;829}830 831static inline struct acpi_device *to_acpi_device_node(const struct fwnode_handle *fwnode)832{833 return NULL;834}835 836static inline bool is_acpi_data_node(const struct fwnode_handle *fwnode)837{838 return false;839}840 841static inline struct acpi_data_node *to_acpi_data_node(const struct fwnode_handle *fwnode)842{843 return NULL;844}845 846static inline bool acpi_data_node_match(const struct fwnode_handle *fwnode,847 const char *name)848{849 return false;850}851 852static inline struct fwnode_handle *acpi_fwnode_handle(struct acpi_device *adev)853{854 return NULL;855}856 857static inline bool has_acpi_companion(struct device *dev)858{859 return false;860}861 862static inline void acpi_preset_companion(struct device *dev,863 struct acpi_device *parent, u64 addr)864{865}866 867static inline const char *acpi_dev_name(struct acpi_device *adev)868{869 return NULL;870}871 872static inline struct device *acpi_get_first_physical_node(struct acpi_device *adev)873{874 return NULL;875}876 877static inline void acpi_early_init(void) { }878static inline void acpi_subsystem_init(void) { }879 880static inline int early_acpi_boot_init(void)881{882 return 0;883}884static inline int acpi_boot_init(void)885{886 return 0;887}888 889static inline void acpi_boot_table_prepare(void)890{891}892 893static inline void acpi_boot_table_init(void)894{895}896 897static inline int acpi_mps_check(void)898{899 return 0;900}901 902static inline int acpi_check_resource_conflict(struct resource *res)903{904 return 0;905}906 907static inline int acpi_check_region(resource_size_t start, resource_size_t n,908 const char *name)909{910 return 0;911}912 913struct acpi_table_header;914static inline int acpi_table_parse(char *id,915 int (*handler)(struct acpi_table_header *))916{917 return -ENODEV;918}919 920static inline int acpi_nvs_register(__u64 start, __u64 size)921{922 return 0;923}924 925static inline int acpi_nvs_for_each_region(int (*func)(__u64, __u64, void *),926 void *data)927{928 return 0;929}930 931struct acpi_device_id;932 933static inline const struct acpi_device_id *acpi_match_acpi_device(934 const struct acpi_device_id *ids, const struct acpi_device *adev)935{936 return NULL;937}938 939static inline const struct acpi_device_id *acpi_match_device(940 const struct acpi_device_id *ids, const struct device *dev)941{942 return NULL;943}944 945static inline const void *acpi_device_get_match_data(const struct device *dev)946{947 return NULL;948}949 950static inline bool acpi_driver_match_device(struct device *dev,951 const struct device_driver *drv)952{953 return false;954}955 956static inline bool acpi_check_dsm(acpi_handle handle, const guid_t *guid,957 u64 rev, u64 funcs)958{959 return false;960}961 962static inline union acpi_object *acpi_evaluate_dsm(acpi_handle handle,963 const guid_t *guid,964 u64 rev, u64 func,965 union acpi_object *argv4)966{967 return NULL;968}969 970static inline union acpi_object *acpi_evaluate_dsm_typed(acpi_handle handle,971 const guid_t *guid,972 u64 rev, u64 func,973 union acpi_object *argv4,974 acpi_object_type type)975{976 return NULL;977}978 979static inline int acpi_device_uevent_modalias(const struct device *dev,980 struct kobj_uevent_env *env)981{982 return -ENODEV;983}984 985static inline int acpi_device_modalias(struct device *dev,986 char *buf, int size)987{988 return -ENODEV;989}990 991static inline struct platform_device *992acpi_create_platform_device(struct acpi_device *adev,993 const struct property_entry *properties)994{995 return NULL;996}997 998static inline bool acpi_dma_supported(const struct acpi_device *adev)999{1000 return false;1001}1002 1003static inline enum dev_dma_attr acpi_get_dma_attr(struct acpi_device *adev)1004{1005 return DEV_DMA_NOT_SUPPORTED;1006}1007 1008static inline int acpi_dma_get_range(struct device *dev, const struct bus_dma_region **map)1009{1010 return -ENODEV;1011}1012 1013static inline int acpi_dma_configure(struct device *dev,1014 enum dev_dma_attr attr)1015{1016 return 0;1017}1018 1019static inline int acpi_dma_configure_id(struct device *dev,1020 enum dev_dma_attr attr,1021 const u32 *input_id)1022{1023 return 0;1024}1025 1026#define ACPI_PTR(_ptr) (NULL)1027 1028static inline void acpi_device_set_enumerated(struct acpi_device *adev)1029{1030}1031 1032static inline void acpi_device_clear_enumerated(struct acpi_device *adev)1033{1034}1035 1036static inline int acpi_reconfig_notifier_register(struct notifier_block *nb)1037{1038 return -EINVAL;1039}1040 1041static inline int acpi_reconfig_notifier_unregister(struct notifier_block *nb)1042{1043 return -EINVAL;1044}1045 1046static inline struct acpi_device *acpi_resource_consumer(struct resource *res)1047{1048 return NULL;1049}1050 1051static inline int acpi_get_local_address(acpi_handle handle, u32 *addr)1052{1053 return -ENODEV;1054}1055 1056static inline const char *acpi_get_subsystem_id(acpi_handle handle)1057{1058 return ERR_PTR(-ENODEV);1059}1060 1061static inline int acpi_register_wakeup_handler(int wake_irq,1062 bool (*wakeup)(void *context), void *context)1063{1064 return -ENXIO;1065}1066 1067static inline void acpi_unregister_wakeup_handler(1068 bool (*wakeup)(void *context), void *context) { }1069 1070struct acpi_osc_context;1071static inline u32 acpi_osc_ctx_get_pci_control(struct acpi_osc_context *context)1072{1073 return 0;1074}1075 1076static inline u32 acpi_osc_ctx_get_cxl_control(struct acpi_osc_context *context)1077{1078 return 0;1079}1080 1081static inline bool acpi_sleep_state_supported(u8 sleep_state)1082{1083 return false;1084}1085 1086static inline acpi_handle acpi_get_processor_handle(int cpu)1087{1088 return NULL;1089}1090 1091#endif /* !CONFIG_ACPI */1092 1093extern void arch_post_acpi_subsys_init(void);1094 1095#ifdef CONFIG_ACPI_HOTPLUG_IOAPIC1096int acpi_ioapic_add(acpi_handle root);1097#else1098static inline int acpi_ioapic_add(acpi_handle root) { return 0; }1099#endif1100 1101#ifdef CONFIG_ACPI1102void acpi_os_set_prepare_sleep(int (*func)(u8 sleep_state,1103 u32 pm1a_ctrl, u32 pm1b_ctrl));1104 1105acpi_status acpi_os_prepare_sleep(u8 sleep_state,1106 u32 pm1a_control, u32 pm1b_control);1107 1108void acpi_os_set_prepare_extended_sleep(int (*func)(u8 sleep_state,1109 u32 val_a, u32 val_b));1110 1111acpi_status acpi_os_prepare_extended_sleep(u8 sleep_state,1112 u32 val_a, u32 val_b);1113#if defined(CONFIG_SUSPEND) && defined(CONFIG_X86)1114struct acpi_s2idle_dev_ops {1115 struct list_head list_node;1116 void (*prepare)(void);1117 void (*check)(void);1118 void (*restore)(void);1119};1120int acpi_register_lps0_dev(struct acpi_s2idle_dev_ops *arg);1121void acpi_unregister_lps0_dev(struct acpi_s2idle_dev_ops *arg);1122int acpi_get_lps0_constraint(struct acpi_device *adev);1123#else /* CONFIG_SUSPEND && CONFIG_X86 */1124static inline int acpi_get_lps0_constraint(struct device *dev)1125{1126 return ACPI_STATE_UNKNOWN;1127}1128#endif /* CONFIG_SUSPEND && CONFIG_X86 */1129void arch_reserve_mem_area(acpi_physical_address addr, size_t size);1130#else1131#define acpi_os_set_prepare_sleep(func, pm1a_ctrl, pm1b_ctrl) do { } while (0)1132#endif1133 1134#if defined(CONFIG_ACPI) && defined(CONFIG_PM)1135int acpi_dev_suspend(struct device *dev, bool wakeup);1136int acpi_dev_resume(struct device *dev);1137int acpi_subsys_runtime_suspend(struct device *dev);1138int acpi_subsys_runtime_resume(struct device *dev);1139int acpi_dev_pm_attach(struct device *dev, bool power_on);1140bool acpi_storage_d3(struct device *dev);1141bool acpi_dev_state_d0(struct device *dev);1142#else1143static inline int acpi_subsys_runtime_suspend(struct device *dev) { return 0; }1144static inline int acpi_subsys_runtime_resume(struct device *dev) { return 0; }1145static inline int acpi_dev_pm_attach(struct device *dev, bool power_on)1146{1147 return 0;1148}1149static inline bool acpi_storage_d3(struct device *dev)1150{1151 return false;1152}1153static inline bool acpi_dev_state_d0(struct device *dev)1154{1155 return true;1156}1157#endif1158 1159#if defined(CONFIG_ACPI) && defined(CONFIG_PM_SLEEP)1160int acpi_subsys_prepare(struct device *dev);1161void acpi_subsys_complete(struct device *dev);1162int acpi_subsys_suspend_late(struct device *dev);1163int acpi_subsys_suspend_noirq(struct device *dev);1164int acpi_subsys_suspend(struct device *dev);1165int acpi_subsys_freeze(struct device *dev);1166int acpi_subsys_poweroff(struct device *dev);1167void acpi_ec_mark_gpe_for_wake(void);1168void acpi_ec_set_gpe_wake_mask(u8 action);1169int acpi_subsys_restore_early(struct device *dev);1170#else1171static inline int acpi_subsys_prepare(struct device *dev) { return 0; }1172static inline void acpi_subsys_complete(struct device *dev) {}1173static inline int acpi_subsys_suspend_late(struct device *dev) { return 0; }1174static inline int acpi_subsys_suspend_noirq(struct device *dev) { return 0; }1175static inline int acpi_subsys_suspend(struct device *dev) { return 0; }1176static inline int acpi_subsys_freeze(struct device *dev) { return 0; }1177static inline int acpi_subsys_poweroff(struct device *dev) { return 0; }1178static inline int acpi_subsys_restore_early(struct device *dev) { return 0; }1179static inline void acpi_ec_mark_gpe_for_wake(void) {}1180static inline void acpi_ec_set_gpe_wake_mask(u8 action) {}1181#endif1182 1183#ifdef CONFIG_ACPI1184char *acpi_handle_path(acpi_handle handle);1185__printf(3, 4)1186void acpi_handle_printk(const char *level, acpi_handle handle,1187 const char *fmt, ...);1188void acpi_evaluation_failure_warn(acpi_handle handle, const char *name,1189 acpi_status status);1190#else /* !CONFIG_ACPI */1191static inline __printf(3, 4) void1192acpi_handle_printk(const char *level, void *handle, const char *fmt, ...) {}1193static inline void acpi_evaluation_failure_warn(acpi_handle handle,1194 const char *name,1195 acpi_status status) {}1196#endif /* !CONFIG_ACPI */1197 1198#if defined(CONFIG_ACPI) && defined(CONFIG_DYNAMIC_DEBUG)1199__printf(3, 4)1200void __acpi_handle_debug(struct _ddebug *descriptor, acpi_handle handle, const char *fmt, ...);1201#endif1202 1203/*1204 * acpi_handle_<level>: Print message with ACPI prefix and object path1205 *1206 * These interfaces acquire the global namespace mutex to obtain an object1207 * path. In interrupt context, it shows the object path as <n/a>.1208 */1209#define acpi_handle_emerg(handle, fmt, ...) \1210 acpi_handle_printk(KERN_EMERG, handle, fmt, ##__VA_ARGS__)1211#define acpi_handle_alert(handle, fmt, ...) \1212 acpi_handle_printk(KERN_ALERT, handle, fmt, ##__VA_ARGS__)1213#define acpi_handle_crit(handle, fmt, ...) \1214 acpi_handle_printk(KERN_CRIT, handle, fmt, ##__VA_ARGS__)1215#define acpi_handle_err(handle, fmt, ...) \1216 acpi_handle_printk(KERN_ERR, handle, fmt, ##__VA_ARGS__)1217#define acpi_handle_warn(handle, fmt, ...) \1218 acpi_handle_printk(KERN_WARNING, handle, fmt, ##__VA_ARGS__)1219#define acpi_handle_notice(handle, fmt, ...) \1220 acpi_handle_printk(KERN_NOTICE, handle, fmt, ##__VA_ARGS__)1221#define acpi_handle_info(handle, fmt, ...) \1222 acpi_handle_printk(KERN_INFO, handle, fmt, ##__VA_ARGS__)1223 1224#if defined(DEBUG)1225#define acpi_handle_debug(handle, fmt, ...) \1226 acpi_handle_printk(KERN_DEBUG, handle, fmt, ##__VA_ARGS__)1227#else1228#if defined(CONFIG_DYNAMIC_DEBUG)1229#define acpi_handle_debug(handle, fmt, ...) \1230 _dynamic_func_call(fmt, __acpi_handle_debug, \1231 handle, pr_fmt(fmt), ##__VA_ARGS__)1232#else1233#define acpi_handle_debug(handle, fmt, ...) \1234({ \1235 if (0) \1236 acpi_handle_printk(KERN_DEBUG, handle, fmt, ##__VA_ARGS__); \1237 0; \1238})1239#endif1240#endif1241 1242#if defined(CONFIG_ACPI) && defined(CONFIG_GPIOLIB)1243bool acpi_gpio_get_irq_resource(struct acpi_resource *ares,1244 struct acpi_resource_gpio **agpio);1245bool acpi_gpio_get_io_resource(struct acpi_resource *ares,1246 struct acpi_resource_gpio **agpio);1247int acpi_dev_gpio_irq_wake_get_by(struct acpi_device *adev, const char *con_id, int index,1248 bool *wake_capable);1249#else1250static inline bool acpi_gpio_get_irq_resource(struct acpi_resource *ares,1251 struct acpi_resource_gpio **agpio)1252{1253 return false;1254}1255static inline bool acpi_gpio_get_io_resource(struct acpi_resource *ares,1256 struct acpi_resource_gpio **agpio)1257{1258 return false;1259}1260static inline int acpi_dev_gpio_irq_wake_get_by(struct acpi_device *adev, const char *con_id,1261 int index, bool *wake_capable)1262{1263 return -ENXIO;1264}1265#endif1266 1267static inline int acpi_dev_gpio_irq_wake_get(struct acpi_device *adev, int index,1268 bool *wake_capable)1269{1270 return acpi_dev_gpio_irq_wake_get_by(adev, NULL, index, wake_capable);1271}1272 1273static inline int acpi_dev_gpio_irq_get_by(struct acpi_device *adev, const char *con_id,1274 int index)1275{1276 return acpi_dev_gpio_irq_wake_get_by(adev, con_id, index, NULL);1277}1278 1279static inline int acpi_dev_gpio_irq_get(struct acpi_device *adev, int index)1280{1281 return acpi_dev_gpio_irq_wake_get_by(adev, NULL, index, NULL);1282}1283 1284/* Device properties */1285 1286#ifdef CONFIG_ACPI1287int acpi_dev_get_property(const struct acpi_device *adev, const char *name,1288 acpi_object_type type, const union acpi_object **obj);1289int __acpi_node_get_property_reference(const struct fwnode_handle *fwnode,1290 const char *name, size_t index, size_t num_args,1291 struct fwnode_reference_args *args);1292 1293static inline int acpi_node_get_property_reference(1294 const struct fwnode_handle *fwnode,1295 const char *name, size_t index,1296 struct fwnode_reference_args *args)1297{1298 return __acpi_node_get_property_reference(fwnode, name, index,1299 NR_FWNODE_REFERENCE_ARGS, args);1300}1301 1302static inline bool acpi_dev_has_props(const struct acpi_device *adev)1303{1304 return !list_empty(&adev->data.properties);1305}1306 1307struct acpi_device_properties *1308acpi_data_add_props(struct acpi_device_data *data, const guid_t *guid,1309 union acpi_object *properties);1310 1311int acpi_node_prop_get(const struct fwnode_handle *fwnode, const char *propname,1312 void **valptr);1313 1314struct fwnode_handle *acpi_get_next_subnode(const struct fwnode_handle *fwnode,1315 struct fwnode_handle *child);1316 1317struct acpi_probe_entry;1318typedef bool (*acpi_probe_entry_validate_subtbl)(struct acpi_subtable_header *,1319 struct acpi_probe_entry *);1320 1321#define ACPI_TABLE_ID_LEN 51322 1323/**1324 * struct acpi_probe_entry - boot-time probing entry1325 * @id: ACPI table name1326 * @type: Optional subtable type to match1327 * (if @id contains subtables)1328 * @subtable_valid: Optional callback to check the validity of1329 * the subtable1330 * @probe_table: Callback to the driver being probed when table1331 * match is successful1332 * @probe_subtbl: Callback to the driver being probed when table and1333 * subtable match (and optional callback is successful)1334 * @driver_data: Sideband data provided back to the driver1335 */1336struct acpi_probe_entry {1337 __u8 id[ACPI_TABLE_ID_LEN];1338 __u8 type;1339 acpi_probe_entry_validate_subtbl subtable_valid;1340 union {1341 acpi_tbl_table_handler probe_table;1342 acpi_tbl_entry_handler probe_subtbl;1343 };1344 kernel_ulong_t driver_data;1345};1346 1347void arch_sort_irqchip_probe(struct acpi_probe_entry *ap_head, int nr);1348 1349#define ACPI_DECLARE_PROBE_ENTRY(table, name, table_id, subtable, \1350 valid, data, fn) \1351 static const struct acpi_probe_entry __acpi_probe_##name \1352 __used __section("__" #table "_acpi_probe_table") = { \1353 .id = table_id, \1354 .type = subtable, \1355 .subtable_valid = valid, \1356 .probe_table = fn, \1357 .driver_data = data, \1358 }1359 1360#define ACPI_DECLARE_SUBTABLE_PROBE_ENTRY(table, name, table_id, \1361 subtable, valid, data, fn) \1362 static const struct acpi_probe_entry __acpi_probe_##name \1363 __used __section("__" #table "_acpi_probe_table") = { \1364 .id = table_id, \1365 .type = subtable, \1366 .subtable_valid = valid, \1367 .probe_subtbl = fn, \1368 .driver_data = data, \1369 }1370 1371#define ACPI_PROBE_TABLE(name) __##name##_acpi_probe_table1372#define ACPI_PROBE_TABLE_END(name) __##name##_acpi_probe_table_end1373 1374int __acpi_probe_device_table(struct acpi_probe_entry *start, int nr);1375 1376#define acpi_probe_device_table(t) \1377 ({ \1378 extern struct acpi_probe_entry ACPI_PROBE_TABLE(t), \1379 ACPI_PROBE_TABLE_END(t); \1380 __acpi_probe_device_table(&ACPI_PROBE_TABLE(t), \1381 (&ACPI_PROBE_TABLE_END(t) - \1382 &ACPI_PROBE_TABLE(t))); \1383 })1384#else1385static inline int acpi_dev_get_property(struct acpi_device *adev,1386 const char *name, acpi_object_type type,1387 const union acpi_object **obj)1388{1389 return -ENXIO;1390}1391 1392static inline int1393__acpi_node_get_property_reference(const struct fwnode_handle *fwnode,1394 const char *name, size_t index, size_t num_args,1395 struct fwnode_reference_args *args)1396{1397 return -ENXIO;1398}1399 1400static inline int1401acpi_node_get_property_reference(const struct fwnode_handle *fwnode,1402 const char *name, size_t index,1403 struct fwnode_reference_args *args)1404{1405 return -ENXIO;1406}1407 1408static inline int acpi_node_prop_get(const struct fwnode_handle *fwnode,1409 const char *propname,1410 void **valptr)1411{1412 return -ENXIO;1413}1414 1415static inline struct fwnode_handle *1416acpi_get_next_subnode(const struct fwnode_handle *fwnode,1417 struct fwnode_handle *child)1418{1419 return NULL;1420}1421 1422static inline struct fwnode_handle *1423acpi_graph_get_next_endpoint(const struct fwnode_handle *fwnode,1424 struct fwnode_handle *prev)1425{1426 return ERR_PTR(-ENXIO);1427}1428 1429static inline int1430acpi_graph_get_remote_endpoint(const struct fwnode_handle *fwnode,1431 struct fwnode_handle **remote,1432 struct fwnode_handle **port,1433 struct fwnode_handle **endpoint)1434{1435 return -ENXIO;1436}1437 1438#define ACPI_DECLARE_PROBE_ENTRY(table, name, table_id, subtable, valid, data, fn) \1439 static const void * __acpi_table_##name[] \1440 __attribute__((unused)) \1441 = { (void *) table_id, \1442 (void *) subtable, \1443 (void *) valid, \1444 (void *) fn, \1445 (void *) data }1446 1447#define acpi_probe_device_table(t) ({ int __r = 0; __r;})1448#endif1449 1450#ifdef CONFIG_ACPI_TABLE_UPGRADE1451void acpi_table_upgrade(void);1452#else1453static inline void acpi_table_upgrade(void) { }1454#endif1455 1456#if defined(CONFIG_ACPI) && defined(CONFIG_ACPI_WATCHDOG)1457extern bool acpi_has_watchdog(void);1458#else1459static inline bool acpi_has_watchdog(void) { return false; }1460#endif1461 1462#ifdef CONFIG_ACPI_SPCR_TABLE1463extern bool qdf2400_e44_present;1464int acpi_parse_spcr(bool enable_earlycon, bool enable_console);1465#else1466static inline int acpi_parse_spcr(bool enable_earlycon, bool enable_console)1467{1468 return 0;1469}1470#endif1471 1472#if IS_ENABLED(CONFIG_ACPI_GENERIC_GSI)1473int acpi_irq_get(acpi_handle handle, unsigned int index, struct resource *res);1474#else1475static inline1476int acpi_irq_get(acpi_handle handle, unsigned int index, struct resource *res)1477{1478 return -EINVAL;1479}1480#endif1481 1482#ifdef CONFIG_ACPI_LPIT1483int lpit_read_residency_count_address(u64 *address);1484#else1485static inline int lpit_read_residency_count_address(u64 *address)1486{1487 return -EINVAL;1488}1489#endif1490 1491#ifdef CONFIG_ACPI_PROCESSOR_IDLE1492#ifndef arch_get_idle_state_flags1493static inline unsigned int arch_get_idle_state_flags(u32 arch_flags)1494{1495 return 0;1496}1497#endif1498#endif /* CONFIG_ACPI_PROCESSOR_IDLE */1499 1500#ifdef CONFIG_ACPI_PPTT1501int acpi_pptt_cpu_is_thread(unsigned int cpu);1502int find_acpi_cpu_topology(unsigned int cpu, int level);1503int find_acpi_cpu_topology_cluster(unsigned int cpu);1504int find_acpi_cpu_topology_package(unsigned int cpu);1505int find_acpi_cpu_topology_hetero_id(unsigned int cpu);1506#else1507static inline int acpi_pptt_cpu_is_thread(unsigned int cpu)1508{1509 return -EINVAL;1510}1511static inline int find_acpi_cpu_topology(unsigned int cpu, int level)1512{1513 return -EINVAL;1514}1515static inline int find_acpi_cpu_topology_cluster(unsigned int cpu)1516{1517 return -EINVAL;1518}1519static inline int find_acpi_cpu_topology_package(unsigned int cpu)1520{1521 return -EINVAL;1522}1523static inline int find_acpi_cpu_topology_hetero_id(unsigned int cpu)1524{1525 return -EINVAL;1526}1527#endif1528 1529#ifdef CONFIG_ARM641530void acpi_arm_init(void);1531#else1532static inline void acpi_arm_init(void) { }1533#endif1534 1535#ifdef CONFIG_RISCV1536void acpi_riscv_init(void);1537#else1538static inline void acpi_riscv_init(void) { }1539#endif1540 1541#ifdef CONFIG_ACPI_PCC1542void acpi_init_pcc(void);1543#else1544static inline void acpi_init_pcc(void) { }1545#endif1546 1547#ifdef CONFIG_ACPI_FFH1548void acpi_init_ffh(void);1549extern int acpi_ffh_address_space_arch_setup(void *handler_ctxt,1550 void **region_ctxt);1551extern int acpi_ffh_address_space_arch_handler(acpi_integer *value,1552 void *region_context);1553#else1554static inline void acpi_init_ffh(void) { }1555#endif1556 1557#ifdef CONFIG_ACPI1558extern void acpi_device_notify(struct device *dev);1559extern void acpi_device_notify_remove(struct device *dev);1560#else1561static inline void acpi_device_notify(struct device *dev) { }1562static inline void acpi_device_notify_remove(struct device *dev) { }1563#endif1564 1565static inline void acpi_use_parent_companion(struct device *dev)1566{1567 ACPI_COMPANION_SET(dev, ACPI_COMPANION(dev->parent));1568}1569 1570#ifdef CONFIG_ACPI_HMAT1571int hmat_update_target_coordinates(int nid, struct access_coordinate *coord,1572 enum access_coordinate_class access);1573#else1574static inline int hmat_update_target_coordinates(int nid,1575 struct access_coordinate *coord,1576 enum access_coordinate_class access)1577{1578 return -EOPNOTSUPP;1579}1580#endif1581 1582#ifdef CONFIG_ACPI_NUMA1583bool acpi_node_backed_by_real_pxm(int nid);1584#else1585static inline bool acpi_node_backed_by_real_pxm(int nid)1586{1587 return false;1588}1589#endif1590 1591#endif /*_LINUX_ACPI_H*/1592