cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

acpi.h (42605B)


      1/* SPDX-License-Identifier: GPL-2.0-or-later */
      2/*
      3 * acpi.h - ACPI Interface
      4 *
      5 * Copyright (C) 2001 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
      6 */
      7
      8#ifndef _LINUX_ACPI_H
      9#define _LINUX_ACPI_H
     10
     11#include <linux/errno.h>
     12#include <linux/ioport.h>	/* for struct resource */
     13#include <linux/irqdomain.h>
     14#include <linux/resource_ext.h>
     15#include <linux/device.h>
     16#include <linux/property.h>
     17#include <linux/uuid.h>
     18
     19#ifndef _LINUX
     20#define _LINUX
     21#endif
     22#include <acpi/acpi.h>
     23
     24#ifdef	CONFIG_ACPI
     25
     26#include <linux/list.h>
     27#include <linux/mod_devicetable.h>
     28#include <linux/dynamic_debug.h>
     29#include <linux/module.h>
     30#include <linux/mutex.h>
     31
     32#include <acpi/acpi_bus.h>
     33#include <acpi/acpi_drivers.h>
     34#include <acpi/acpi_numa.h>
     35#include <acpi/acpi_io.h>
     36#include <asm/acpi.h>
     37
     38static inline acpi_handle acpi_device_handle(struct acpi_device *adev)
     39{
     40	return adev ? adev->handle : NULL;
     41}
     42
     43#define ACPI_COMPANION(dev)		to_acpi_device_node((dev)->fwnode)
     44#define ACPI_COMPANION_SET(dev, adev)	set_primary_fwnode(dev, (adev) ? \
     45	acpi_fwnode_handle(adev) : NULL)
     46#define ACPI_HANDLE(dev)		acpi_device_handle(ACPI_COMPANION(dev))
     47#define ACPI_HANDLE_FWNODE(fwnode)	\
     48				acpi_device_handle(to_acpi_device_node(fwnode))
     49
     50static inline struct fwnode_handle *acpi_alloc_fwnode_static(void)
     51{
     52	struct fwnode_handle *fwnode;
     53
     54	fwnode = kzalloc(sizeof(struct fwnode_handle), GFP_KERNEL);
     55	if (!fwnode)
     56		return NULL;
     57
     58	fwnode_init(fwnode, &acpi_static_fwnode_ops);
     59
     60	return fwnode;
     61}
     62
     63static inline void acpi_free_fwnode_static(struct fwnode_handle *fwnode)
     64{
     65	if (WARN_ON(!is_acpi_static_node(fwnode)))
     66		return;
     67
     68	kfree(fwnode);
     69}
     70
     71/**
     72 * ACPI_DEVICE_CLASS - macro used to describe an ACPI device with
     73 * the PCI-defined class-code information
     74 *
     75 * @_cls : the class, subclass, prog-if triple for this device
     76 * @_msk : the class mask for this device
     77 *
     78 * This macro is used to create a struct acpi_device_id that matches a
     79 * specific PCI class. The .id and .driver_data fields will be left
     80 * initialized with the default value.
     81 */
     82#define ACPI_DEVICE_CLASS(_cls, _msk)	.cls = (_cls), .cls_msk = (_msk),
     83
     84static inline bool has_acpi_companion(struct device *dev)
     85{
     86	return is_acpi_device_node(dev->fwnode);
     87}
     88
     89static inline void acpi_preset_companion(struct device *dev,
     90					 struct acpi_device *parent, u64 addr)
     91{
     92	ACPI_COMPANION_SET(dev, acpi_find_child_device(parent, addr, false));
     93}
     94
     95static inline const char *acpi_dev_name(struct acpi_device *adev)
     96{
     97	return dev_name(&adev->dev);
     98}
     99
    100struct device *acpi_get_first_physical_node(struct acpi_device *adev);
    101
    102enum acpi_irq_model_id {
    103	ACPI_IRQ_MODEL_PIC = 0,
    104	ACPI_IRQ_MODEL_IOAPIC,
    105	ACPI_IRQ_MODEL_IOSAPIC,
    106	ACPI_IRQ_MODEL_PLATFORM,
    107	ACPI_IRQ_MODEL_GIC,
    108	ACPI_IRQ_MODEL_COUNT
    109};
    110
    111extern enum acpi_irq_model_id	acpi_irq_model;
    112
    113enum acpi_interrupt_id {
    114	ACPI_INTERRUPT_PMI	= 1,
    115	ACPI_INTERRUPT_INIT,
    116	ACPI_INTERRUPT_CPEI,
    117	ACPI_INTERRUPT_COUNT
    118};
    119
    120#define	ACPI_SPACE_MEM		0
    121
    122enum acpi_address_range_id {
    123	ACPI_ADDRESS_RANGE_MEMORY = 1,
    124	ACPI_ADDRESS_RANGE_RESERVED = 2,
    125	ACPI_ADDRESS_RANGE_ACPI = 3,
    126	ACPI_ADDRESS_RANGE_NVS	= 4,
    127	ACPI_ADDRESS_RANGE_COUNT
    128};
    129
    130
    131/* Table Handlers */
    132union acpi_subtable_headers {
    133	struct acpi_subtable_header common;
    134	struct acpi_hmat_structure hmat;
    135	struct acpi_prmt_module_header prmt;
    136	struct acpi_cedt_header cedt;
    137};
    138
    139typedef int (*acpi_tbl_table_handler)(struct acpi_table_header *table);
    140
    141typedef int (*acpi_tbl_entry_handler)(union acpi_subtable_headers *header,
    142				      const unsigned long end);
    143
    144typedef int (*acpi_tbl_entry_handler_arg)(union acpi_subtable_headers *header,
    145					  void *arg, const unsigned long end);
    146
    147/* Debugger support */
    148
    149struct acpi_debugger_ops {
    150	int (*create_thread)(acpi_osd_exec_callback function, void *context);
    151	ssize_t (*write_log)(const char *msg);
    152	ssize_t (*read_cmd)(char *buffer, size_t length);
    153	int (*wait_command_ready)(bool single_step, char *buffer, size_t length);
    154	int (*notify_command_complete)(void);
    155};
    156
    157struct acpi_debugger {
    158	const struct acpi_debugger_ops *ops;
    159	struct module *owner;
    160	struct mutex lock;
    161};
    162
    163#ifdef CONFIG_ACPI_DEBUGGER
    164int __init acpi_debugger_init(void);
    165int acpi_register_debugger(struct module *owner,
    166			   const struct acpi_debugger_ops *ops);
    167void acpi_unregister_debugger(const struct acpi_debugger_ops *ops);
    168int acpi_debugger_create_thread(acpi_osd_exec_callback function, void *context);
    169ssize_t acpi_debugger_write_log(const char *msg);
    170ssize_t acpi_debugger_read_cmd(char *buffer, size_t buffer_length);
    171int acpi_debugger_wait_command_ready(void);
    172int acpi_debugger_notify_command_complete(void);
    173#else
    174static inline int acpi_debugger_init(void)
    175{
    176	return -ENODEV;
    177}
    178
    179static inline int acpi_register_debugger(struct module *owner,
    180					 const struct acpi_debugger_ops *ops)
    181{
    182	return -ENODEV;
    183}
    184
    185static inline void acpi_unregister_debugger(const struct acpi_debugger_ops *ops)
    186{
    187}
    188
    189static inline int acpi_debugger_create_thread(acpi_osd_exec_callback function,
    190					      void *context)
    191{
    192	return -ENODEV;
    193}
    194
    195static inline int acpi_debugger_write_log(const char *msg)
    196{
    197	return -ENODEV;
    198}
    199
    200static inline int acpi_debugger_read_cmd(char *buffer, u32 buffer_length)
    201{
    202	return -ENODEV;
    203}
    204
    205static inline int acpi_debugger_wait_command_ready(void)
    206{
    207	return -ENODEV;
    208}
    209
    210static inline int acpi_debugger_notify_command_complete(void)
    211{
    212	return -ENODEV;
    213}
    214#endif
    215
    216#define BAD_MADT_ENTRY(entry, end) (					    \
    217		(!entry) || (unsigned long)entry + sizeof(*entry) > end ||  \
    218		((struct acpi_subtable_header *)entry)->length < sizeof(*entry))
    219
    220struct acpi_subtable_proc {
    221	int id;
    222	acpi_tbl_entry_handler handler;
    223	acpi_tbl_entry_handler_arg handler_arg;
    224	void *arg;
    225	int count;
    226};
    227
    228void __iomem *__acpi_map_table(unsigned long phys, unsigned long size);
    229void __acpi_unmap_table(void __iomem *map, unsigned long size);
    230int early_acpi_boot_init(void);
    231int acpi_boot_init (void);
    232void acpi_boot_table_prepare (void);
    233void acpi_boot_table_init (void);
    234int acpi_mps_check (void);
    235int acpi_numa_init (void);
    236
    237int acpi_locate_initial_tables (void);
    238void acpi_reserve_initial_tables (void);
    239void acpi_table_init_complete (void);
    240int acpi_table_init (void);
    241
    242#ifdef CONFIG_ACPI_TABLE_LIB
    243#define EXPORT_SYMBOL_ACPI_LIB(x) EXPORT_SYMBOL_NS_GPL(x, ACPI)
    244#define __init_or_acpilib
    245#define __initdata_or_acpilib
    246#else
    247#define EXPORT_SYMBOL_ACPI_LIB(x)
    248#define __init_or_acpilib __init
    249#define __initdata_or_acpilib __initdata
    250#endif
    251
    252int acpi_table_parse(char *id, acpi_tbl_table_handler handler);
    253int __init_or_acpilib acpi_table_parse_entries(char *id,
    254		unsigned long table_size, int entry_id,
    255		acpi_tbl_entry_handler handler, unsigned int max_entries);
    256int __init_or_acpilib acpi_table_parse_entries_array(char *id,
    257		unsigned long table_size, struct acpi_subtable_proc *proc,
    258		int proc_num, unsigned int max_entries);
    259int acpi_table_parse_madt(enum acpi_madt_type id,
    260			  acpi_tbl_entry_handler handler,
    261			  unsigned int max_entries);
    262int __init_or_acpilib
    263acpi_table_parse_cedt(enum acpi_cedt_type id,
    264		      acpi_tbl_entry_handler_arg handler_arg, void *arg);
    265
    266int acpi_parse_mcfg (struct acpi_table_header *header);
    267void acpi_table_print_madt_entry (struct acpi_subtable_header *madt);
    268
    269/* the following numa functions are architecture-dependent */
    270void acpi_numa_slit_init (struct acpi_table_slit *slit);
    271
    272#if defined(CONFIG_X86) || defined(CONFIG_IA64) || defined(CONFIG_LOONGARCH)
    273void acpi_numa_processor_affinity_init (struct acpi_srat_cpu_affinity *pa);
    274#else
    275static inline void
    276acpi_numa_processor_affinity_init(struct acpi_srat_cpu_affinity *pa) { }
    277#endif
    278
    279void acpi_numa_x2apic_affinity_init(struct acpi_srat_x2apic_cpu_affinity *pa);
    280
    281#ifdef CONFIG_ARM64
    282void acpi_numa_gicc_affinity_init(struct acpi_srat_gicc_affinity *pa);
    283void acpi_arch_dma_setup(struct device *dev, u64 *dma_addr, u64 *dma_size);
    284#else
    285static inline void
    286acpi_numa_gicc_affinity_init(struct acpi_srat_gicc_affinity *pa) { }
    287static inline void
    288acpi_arch_dma_setup(struct device *dev, u64 *dma_addr, u64 *dma_size) { }
    289#endif
    290
    291int acpi_numa_memory_affinity_init (struct acpi_srat_mem_affinity *ma);
    292
    293#ifndef PHYS_CPUID_INVALID
    294typedef u32 phys_cpuid_t;
    295#define PHYS_CPUID_INVALID (phys_cpuid_t)(-1)
    296#endif
    297
    298static inline bool invalid_logical_cpuid(u32 cpuid)
    299{
    300	return (int)cpuid < 0;
    301}
    302
    303static inline bool invalid_phys_cpuid(phys_cpuid_t phys_id)
    304{
    305	return phys_id == PHYS_CPUID_INVALID;
    306}
    307
    308/* Validate the processor object's proc_id */
    309bool acpi_duplicate_processor_id(int proc_id);
    310/* Processor _CTS control */
    311struct acpi_processor_power;
    312
    313#ifdef CONFIG_ACPI_PROCESSOR_CSTATE
    314bool acpi_processor_claim_cst_control(void);
    315int acpi_processor_evaluate_cst(acpi_handle handle, u32 cpu,
    316				struct acpi_processor_power *info);
    317#else
    318static inline bool acpi_processor_claim_cst_control(void) { return false; }
    319static inline int acpi_processor_evaluate_cst(acpi_handle handle, u32 cpu,
    320					      struct acpi_processor_power *info)
    321{
    322	return -ENODEV;
    323}
    324#endif
    325
    326#ifdef CONFIG_ACPI_HOTPLUG_CPU
    327/* Arch dependent functions for cpu hotplug support */
    328int acpi_map_cpu(acpi_handle handle, phys_cpuid_t physid, u32 acpi_id,
    329		 int *pcpu);
    330int acpi_unmap_cpu(int cpu);
    331#endif /* CONFIG_ACPI_HOTPLUG_CPU */
    332
    333#ifdef CONFIG_ACPI_HOTPLUG_IOAPIC
    334int acpi_get_ioapic_id(acpi_handle handle, u32 gsi_base, u64 *phys_addr);
    335#endif
    336
    337int acpi_register_ioapic(acpi_handle handle, u64 phys_addr, u32 gsi_base);
    338int acpi_unregister_ioapic(acpi_handle handle, u32 gsi_base);
    339int acpi_ioapic_registered(acpi_handle handle, u32 gsi_base);
    340void acpi_irq_stats_init(void);
    341extern u32 acpi_irq_handled;
    342extern u32 acpi_irq_not_handled;
    343extern unsigned int acpi_sci_irq;
    344extern bool acpi_no_s5;
    345#define INVALID_ACPI_IRQ	((unsigned)-1)
    346static inline bool acpi_sci_irq_valid(void)
    347{
    348	return acpi_sci_irq != INVALID_ACPI_IRQ;
    349}
    350
    351extern int sbf_port;
    352extern unsigned long acpi_realmode_flags;
    353
    354int acpi_register_gsi (struct device *dev, u32 gsi, int triggering, int polarity);
    355int acpi_gsi_to_irq (u32 gsi, unsigned int *irq);
    356int acpi_isa_irq_to_gsi (unsigned isa_irq, u32 *gsi);
    357
    358void acpi_set_irq_model(enum acpi_irq_model_id model,
    359			struct fwnode_handle *fwnode);
    360
    361struct irq_domain *acpi_irq_create_hierarchy(unsigned int flags,
    362					     unsigned int size,
    363					     struct fwnode_handle *fwnode,
    364					     const struct irq_domain_ops *ops,
    365					     void *host_data);
    366
    367#ifdef CONFIG_X86_IO_APIC
    368extern int acpi_get_override_irq(u32 gsi, int *trigger, int *polarity);
    369#else
    370static inline int acpi_get_override_irq(u32 gsi, int *trigger, int *polarity)
    371{
    372	return -1;
    373}
    374#endif
    375/*
    376 * This function undoes the effect of one call to acpi_register_gsi().
    377 * If this matches the last registration, any IRQ resources for gsi
    378 * are freed.
    379 */
    380void acpi_unregister_gsi (u32 gsi);
    381
    382struct pci_dev;
    383
    384int acpi_pci_irq_enable (struct pci_dev *dev);
    385void acpi_penalize_isa_irq(int irq, int active);
    386bool acpi_isa_irq_available(int irq);
    387#ifdef CONFIG_PCI
    388void acpi_penalize_sci_irq(int irq, int trigger, int polarity);
    389#else
    390static inline void acpi_penalize_sci_irq(int irq, int trigger,
    391					int polarity)
    392{
    393}
    394#endif
    395void acpi_pci_irq_disable (struct pci_dev *dev);
    396
    397extern int ec_read(u8 addr, u8 *val);
    398extern int ec_write(u8 addr, u8 val);
    399extern int ec_transaction(u8 command,
    400                          const u8 *wdata, unsigned wdata_len,
    401                          u8 *rdata, unsigned rdata_len);
    402extern acpi_handle ec_get_handle(void);
    403
    404extern bool acpi_is_pnp_device(struct acpi_device *);
    405
    406#if defined(CONFIG_ACPI_WMI) || defined(CONFIG_ACPI_WMI_MODULE)
    407
    408typedef void (*wmi_notify_handler) (u32 value, void *context);
    409
    410extern acpi_status wmi_evaluate_method(const char *guid, u8 instance,
    411					u32 method_id,
    412					const struct acpi_buffer *in,
    413					struct acpi_buffer *out);
    414extern acpi_status wmi_query_block(const char *guid, u8 instance,
    415					struct acpi_buffer *out);
    416extern acpi_status wmi_set_block(const char *guid, u8 instance,
    417					const struct acpi_buffer *in);
    418extern acpi_status wmi_install_notify_handler(const char *guid,
    419					wmi_notify_handler handler, void *data);
    420extern acpi_status wmi_remove_notify_handler(const char *guid);
    421extern acpi_status wmi_get_event_data(u32 event, struct acpi_buffer *out);
    422extern bool wmi_has_guid(const char *guid);
    423extern char *wmi_get_acpi_device_uid(const char *guid);
    424
    425#endif	/* CONFIG_ACPI_WMI */
    426
    427#define ACPI_VIDEO_OUTPUT_SWITCHING			0x0001
    428#define ACPI_VIDEO_DEVICE_POSTING			0x0002
    429#define ACPI_VIDEO_ROM_AVAILABLE			0x0004
    430#define ACPI_VIDEO_BACKLIGHT				0x0008
    431#define ACPI_VIDEO_BACKLIGHT_FORCE_VENDOR		0x0010
    432#define ACPI_VIDEO_BACKLIGHT_FORCE_VIDEO		0x0020
    433#define ACPI_VIDEO_OUTPUT_SWITCHING_FORCE_VENDOR	0x0040
    434#define ACPI_VIDEO_OUTPUT_SWITCHING_FORCE_VIDEO		0x0080
    435#define ACPI_VIDEO_BACKLIGHT_DMI_VENDOR			0x0100
    436#define ACPI_VIDEO_BACKLIGHT_DMI_VIDEO			0x0200
    437#define ACPI_VIDEO_OUTPUT_SWITCHING_DMI_VENDOR		0x0400
    438#define ACPI_VIDEO_OUTPUT_SWITCHING_DMI_VIDEO		0x0800
    439
    440extern char acpi_video_backlight_string[];
    441extern long acpi_is_video_device(acpi_handle handle);
    442extern int acpi_blacklisted(void);
    443extern void acpi_osi_setup(char *str);
    444extern bool acpi_osi_is_win8(void);
    445
    446#ifdef CONFIG_ACPI_NUMA
    447int acpi_map_pxm_to_node(int pxm);
    448int acpi_get_node(acpi_handle handle);
    449
    450/**
    451 * pxm_to_online_node - Map proximity ID to online node
    452 * @pxm: ACPI proximity ID
    453 *
    454 * This is similar to pxm_to_node(), but always returns an online
    455 * node.  When the mapped node from a given proximity ID is offline, it
    456 * looks up the node distance table and returns the nearest online node.
    457 *
    458 * ACPI device drivers, which are called after the NUMA initialization has
    459 * completed in the kernel, can call this interface to obtain their device
    460 * NUMA topology from ACPI tables.  Such drivers do not have to deal with
    461 * offline nodes.  A node may be offline when SRAT memory entry does not exist,
    462 * or NUMA is disabled, ex. "numa=off" on x86.
    463 */
    464static inline int pxm_to_online_node(int pxm)
    465{
    466	int node = pxm_to_node(pxm);
    467
    468	return numa_map_to_online_node(node);
    469}
    470#else
    471static inline int pxm_to_online_node(int pxm)
    472{
    473	return 0;
    474}
    475static inline int acpi_map_pxm_to_node(int pxm)
    476{
    477	return 0;
    478}
    479static inline int acpi_get_node(acpi_handle handle)
    480{
    481	return 0;
    482}
    483#endif
    484extern int acpi_paddr_to_node(u64 start_addr, u64 size);
    485
    486extern int pnpacpi_disabled;
    487
    488#define PXM_INVAL	(-1)
    489
    490bool acpi_dev_resource_memory(struct acpi_resource *ares, struct resource *res);
    491bool acpi_dev_resource_io(struct acpi_resource *ares, struct resource *res);
    492bool acpi_dev_resource_address_space(struct acpi_resource *ares,
    493				     struct resource_win *win);
    494bool acpi_dev_resource_ext_address_space(struct acpi_resource *ares,
    495					 struct resource_win *win);
    496unsigned long acpi_dev_irq_flags(u8 triggering, u8 polarity, u8 shareable);
    497unsigned int acpi_dev_get_irq_type(int triggering, int polarity);
    498bool acpi_dev_resource_interrupt(struct acpi_resource *ares, int index,
    499				 struct resource *res);
    500
    501void acpi_dev_free_resource_list(struct list_head *list);
    502int acpi_dev_get_resources(struct acpi_device *adev, struct list_head *list,
    503			   int (*preproc)(struct acpi_resource *, void *),
    504			   void *preproc_data);
    505int acpi_dev_get_dma_resources(struct acpi_device *adev,
    506			       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_HIBERNATION
    526extern int acpi_check_s4_hw_signature;
    527#endif
    528
    529#ifdef CONFIG_PM_SLEEP
    530void __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		3
    552#define OSC_CXL_CAPABILITY_DWORDS		5
    553
    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			0x00000001
    570#define OSC_SB_PPC_OST_SUPPORT			0x00000002
    571#define OSC_SB_PR3_SUPPORT			0x00000004
    572#define OSC_SB_HOTPLUG_OST_SUPPORT		0x00000008
    573#define OSC_SB_APEI_SUPPORT			0x00000010
    574#define OSC_SB_CPC_SUPPORT			0x00000020
    575#define OSC_SB_CPCV2_SUPPORT			0x00000040
    576#define OSC_SB_PCLPI_SUPPORT			0x00000080
    577#define OSC_SB_OSLPI_SUPPORT			0x00000100
    578#define OSC_SB_CPC_DIVERSE_HIGH_SUPPORT		0x00001000
    579#define OSC_SB_GENERIC_INITIATOR_SUPPORT	0x00002000
    580#define OSC_SB_CPC_FLEXIBLE_ADR_SPACE		0x00004000
    581#define OSC_SB_NATIVE_USB4_SUPPORT		0x00040000
    582#define OSC_SB_PRM_SUPPORT			0x00200000
    583
    584extern bool osc_sb_apei_support_acked;
    585extern bool osc_pc_lpi_support_confirmed;
    586extern bool osc_sb_native_usb4_support_confirmed;
    587extern bool osc_sb_cppc2_support_acked;
    588extern bool osc_cpc_flexible_adr_space_confirmed;
    589
    590/* USB4 Capabilities */
    591#define OSC_USB_USB3_TUNNELING			0x00000001
    592#define OSC_USB_DP_TUNNELING			0x00000002
    593#define OSC_USB_PCIE_TUNNELING			0x00000004
    594#define OSC_USB_XDOMAIN				0x00000008
    595
    596extern u32 osc_sb_native_usb4_control;
    597
    598/* PCI Host Bridge _OSC: Capabilities DWORD 2: Support Field */
    599#define OSC_PCI_EXT_CONFIG_SUPPORT		0x00000001
    600#define OSC_PCI_ASPM_SUPPORT			0x00000002
    601#define OSC_PCI_CLOCK_PM_SUPPORT		0x00000004
    602#define OSC_PCI_SEGMENT_GROUPS_SUPPORT		0x00000008
    603#define OSC_PCI_MSI_SUPPORT			0x00000010
    604#define OSC_PCI_EDR_SUPPORT			0x00000080
    605#define OSC_PCI_HPX_TYPE_3_SUPPORT		0x00000100
    606
    607/* PCI Host Bridge _OSC: Capabilities DWORD 3: Control Field */
    608#define OSC_PCI_EXPRESS_NATIVE_HP_CONTROL	0x00000001
    609#define OSC_PCI_SHPC_NATIVE_HP_CONTROL		0x00000002
    610#define OSC_PCI_EXPRESS_PME_CONTROL		0x00000004
    611#define OSC_PCI_EXPRESS_AER_CONTROL		0x00000008
    612#define OSC_PCI_EXPRESS_CAPABILITY_CONTROL	0x00000010
    613#define OSC_PCI_EXPRESS_LTR_CONTROL		0x00000020
    614#define OSC_PCI_EXPRESS_DPC_CONTROL		0x00000080
    615
    616/* CXL _OSC: Capabilities DWORD 4: Support Field */
    617#define OSC_CXL_1_1_PORT_REG_ACCESS_SUPPORT	0x00000001
    618#define OSC_CXL_2_0_PORT_DEV_REG_ACCESS_SUPPORT	0x00000002
    619#define OSC_CXL_PROTOCOL_ERR_REPORTING_SUPPORT	0x00000004
    620#define OSC_CXL_NATIVE_HP_SUPPORT		0x00000008
    621
    622/* CXL _OSC: Capabilities DWORD 5: Control Field */
    623#define OSC_CXL_ERROR_REPORTING_CONTROL		0x00000001
    624
    625static inline u32 acpi_osc_ctx_get_pci_control(struct acpi_osc_context *context)
    626{
    627	u32 *ret = context->ret.pointer;
    628
    629	return ret[OSC_CONTROL_DWORD];
    630}
    631
    632static inline u32 acpi_osc_ctx_get_cxl_control(struct acpi_osc_context *context)
    633{
    634	u32 *ret = context->ret.pointer;
    635
    636	return ret[OSC_EXT_CONTROL_DWORD];
    637}
    638
    639#define ACPI_GSB_ACCESS_ATTRIB_QUICK		0x00000002
    640#define ACPI_GSB_ACCESS_ATTRIB_SEND_RCV         0x00000004
    641#define ACPI_GSB_ACCESS_ATTRIB_BYTE		0x00000006
    642#define ACPI_GSB_ACCESS_ATTRIB_WORD		0x00000008
    643#define ACPI_GSB_ACCESS_ATTRIB_BLOCK		0x0000000A
    644#define ACPI_GSB_ACCESS_ATTRIB_MULTIBYTE	0x0000000B
    645#define ACPI_GSB_ACCESS_ATTRIB_WORD_CALL	0x0000000C
    646#define ACPI_GSB_ACCESS_ATTRIB_BLOCK_CALL	0x0000000D
    647#define ACPI_GSB_ACCESS_ATTRIB_RAW_BYTES	0x0000000E
    648#define ACPI_GSB_ACCESS_ATTRIB_RAW_PROCESS	0x0000000F
    649
    650/* Enable _OST when all relevant hotplug operations are enabled */
    651#if defined(CONFIG_ACPI_HOTPLUG_CPU) &&			\
    652	defined(CONFIG_ACPI_HOTPLUG_MEMORY) &&		\
    653	defined(CONFIG_ACPI_CONTAINER)
    654#define ACPI_HOTPLUG_OST
    655#endif
    656
    657/* _OST Source Event Code (OSPM Action) */
    658#define ACPI_OST_EC_OSPM_SHUTDOWN		0x100
    659#define ACPI_OST_EC_OSPM_EJECT			0x103
    660#define ACPI_OST_EC_OSPM_INSERTION		0x200
    661
    662/* _OST General Processing Status Code */
    663#define ACPI_OST_SC_SUCCESS			0x0
    664#define ACPI_OST_SC_NON_SPECIFIC_FAILURE	0x1
    665#define ACPI_OST_SC_UNRECOGNIZED_NOTIFY		0x2
    666
    667/* _OST OS Shutdown Processing (0x100) Status Code */
    668#define ACPI_OST_SC_OS_SHUTDOWN_DENIED		0x80
    669#define ACPI_OST_SC_OS_SHUTDOWN_IN_PROGRESS	0x81
    670#define ACPI_OST_SC_OS_SHUTDOWN_COMPLETED	0x82
    671#define ACPI_OST_SC_OS_SHUTDOWN_NOT_SUPPORTED	0x83
    672
    673/* _OST Ejection Request (0x3, 0x103) Status Code */
    674#define ACPI_OST_SC_EJECT_NOT_SUPPORTED		0x80
    675#define ACPI_OST_SC_DEVICE_IN_USE		0x81
    676#define ACPI_OST_SC_DEVICE_BUSY			0x82
    677#define ACPI_OST_SC_EJECT_DEPENDENCY_BUSY	0x83
    678#define ACPI_OST_SC_EJECT_IN_PROGRESS		0x84
    679
    680/* _OST Insertion Request (0x200) Status Code */
    681#define ACPI_OST_SC_INSERT_IN_PROGRESS		0x80
    682#define ACPI_OST_SC_DRIVER_LOAD_FAILURE		0x81
    683#define ACPI_OST_SC_INSERT_NOT_SUPPORTED	0x82
    684
    685enum acpi_predicate {
    686	all_versions,
    687	less_than_or_equal,
    688	equal,
    689	greater_than_or_equal,
    690};
    691
    692/* Table must be terminted by a NULL entry */
    693struct acpi_platform_list {
    694	char	oem_id[ACPI_OEM_ID_SIZE+1];
    695	char	oem_table_id[ACPI_OEM_TABLE_ID_SIZE+1];
    696	u32	oem_revision;
    697	char	*table;
    698	enum acpi_predicate pred;
    699	char	*reason;
    700	u32	data;
    701};
    702int acpi_match_platform_list(const struct acpi_platform_list *plat);
    703
    704extern void acpi_early_init(void);
    705extern void acpi_subsystem_init(void);
    706extern void arch_post_acpi_subsys_init(void);
    707
    708extern int acpi_nvs_register(__u64 start, __u64 size);
    709
    710extern int acpi_nvs_for_each_region(int (*func)(__u64, __u64, void *),
    711				    void *data);
    712
    713const struct acpi_device_id *acpi_match_device(const struct acpi_device_id *ids,
    714					       const struct device *dev);
    715
    716const void *acpi_device_get_match_data(const struct device *dev);
    717extern bool acpi_driver_match_device(struct device *dev,
    718				     const struct device_driver *drv);
    719int acpi_device_uevent_modalias(struct device *, struct kobj_uevent_env *);
    720int acpi_device_modalias(struct device *, char *, int);
    721
    722struct platform_device *acpi_create_platform_device(struct acpi_device *,
    723						    const struct property_entry *);
    724#define ACPI_PTR(_ptr)	(_ptr)
    725
    726static inline void acpi_device_set_enumerated(struct acpi_device *adev)
    727{
    728	adev->flags.visited = true;
    729}
    730
    731static inline void acpi_device_clear_enumerated(struct acpi_device *adev)
    732{
    733	adev->flags.visited = false;
    734}
    735
    736enum acpi_reconfig_event  {
    737	ACPI_RECONFIG_DEVICE_ADD = 0,
    738	ACPI_RECONFIG_DEVICE_REMOVE,
    739};
    740
    741int acpi_reconfig_notifier_register(struct notifier_block *nb);
    742int acpi_reconfig_notifier_unregister(struct notifier_block *nb);
    743
    744#ifdef CONFIG_ACPI_GTDT
    745int acpi_gtdt_init(struct acpi_table_header *table, int *platform_timer_count);
    746int acpi_gtdt_map_ppi(int type);
    747bool acpi_gtdt_c3stop(int type);
    748int acpi_arch_timer_mem_init(struct arch_timer_mem *timer_mem, int *timer_count);
    749#endif
    750
    751#ifndef ACPI_HAVE_ARCH_SET_ROOT_POINTER
    752static inline void acpi_arch_set_root_pointer(u64 addr)
    753{
    754}
    755#endif
    756
    757#ifndef ACPI_HAVE_ARCH_GET_ROOT_POINTER
    758static inline u64 acpi_arch_get_root_pointer(void)
    759{
    760	return 0;
    761}
    762#endif
    763
    764int acpi_get_local_address(acpi_handle handle, u32 *addr);
    765
    766#else	/* !CONFIG_ACPI */
    767
    768#define acpi_disabled 1
    769
    770#define ACPI_COMPANION(dev)		(NULL)
    771#define ACPI_COMPANION_SET(dev, adev)	do { } while (0)
    772#define ACPI_HANDLE(dev)		(NULL)
    773#define ACPI_HANDLE_FWNODE(fwnode)	(NULL)
    774#define ACPI_DEVICE_CLASS(_cls, _msk)	.cls = (0), .cls_msk = (0),
    775
    776#include <acpi/acpi_numa.h>
    777
    778struct fwnode_handle;
    779
    780static inline bool acpi_dev_found(const char *hid)
    781{
    782	return false;
    783}
    784
    785static inline bool acpi_dev_present(const char *hid, const char *uid, s64 hrv)
    786{
    787	return false;
    788}
    789
    790struct acpi_device;
    791
    792static inline bool
    793acpi_dev_hid_uid_match(struct acpi_device *adev, const char *hid2, const char *uid2)
    794{
    795	return false;
    796}
    797
    798static inline struct acpi_device *
    799acpi_dev_get_first_match_dev(const char *hid, const char *uid, s64 hrv)
    800{
    801	return NULL;
    802}
    803
    804static inline bool acpi_reduced_hardware(void)
    805{
    806	return false;
    807}
    808
    809static inline void acpi_dev_put(struct acpi_device *adev) {}
    810
    811static inline bool is_acpi_node(const struct fwnode_handle *fwnode)
    812{
    813	return false;
    814}
    815
    816static inline bool is_acpi_device_node(const struct fwnode_handle *fwnode)
    817{
    818	return false;
    819}
    820
    821static inline struct acpi_device *to_acpi_device_node(const struct fwnode_handle *fwnode)
    822{
    823	return NULL;
    824}
    825
    826static inline bool is_acpi_data_node(const struct fwnode_handle *fwnode)
    827{
    828	return false;
    829}
    830
    831static inline struct acpi_data_node *to_acpi_data_node(const struct fwnode_handle *fwnode)
    832{
    833	return NULL;
    834}
    835
    836static inline bool acpi_data_node_match(const struct fwnode_handle *fwnode,
    837					const char *name)
    838{
    839	return false;
    840}
    841
    842static inline struct fwnode_handle *acpi_fwnode_handle(struct acpi_device *adev)
    843{
    844	return NULL;
    845}
    846
    847static inline bool has_acpi_companion(struct device *dev)
    848{
    849	return false;
    850}
    851
    852static inline void acpi_preset_companion(struct device *dev,
    853					 struct acpi_device *parent, u64 addr)
    854{
    855}
    856
    857static inline const char *acpi_dev_name(struct acpi_device *adev)
    858{
    859	return NULL;
    860}
    861
    862static inline struct device *acpi_get_first_physical_node(struct acpi_device *adev)
    863{
    864	return NULL;
    865}
    866
    867static inline void acpi_early_init(void) { }
    868static inline void acpi_subsystem_init(void) { }
    869
    870static inline int early_acpi_boot_init(void)
    871{
    872	return 0;
    873}
    874static inline int acpi_boot_init(void)
    875{
    876	return 0;
    877}
    878
    879static inline void acpi_boot_table_prepare(void)
    880{
    881}
    882
    883static inline void acpi_boot_table_init(void)
    884{
    885}
    886
    887static inline int acpi_mps_check(void)
    888{
    889	return 0;
    890}
    891
    892static inline int acpi_check_resource_conflict(struct resource *res)
    893{
    894	return 0;
    895}
    896
    897static inline int acpi_check_region(resource_size_t start, resource_size_t n,
    898				    const char *name)
    899{
    900	return 0;
    901}
    902
    903struct acpi_table_header;
    904static inline int acpi_table_parse(char *id,
    905				int (*handler)(struct acpi_table_header *))
    906{
    907	return -ENODEV;
    908}
    909
    910static inline int acpi_nvs_register(__u64 start, __u64 size)
    911{
    912	return 0;
    913}
    914
    915static inline int acpi_nvs_for_each_region(int (*func)(__u64, __u64, void *),
    916					   void *data)
    917{
    918	return 0;
    919}
    920
    921struct acpi_device_id;
    922
    923static inline const struct acpi_device_id *acpi_match_device(
    924	const struct acpi_device_id *ids, const struct device *dev)
    925{
    926	return NULL;
    927}
    928
    929static inline const void *acpi_device_get_match_data(const struct device *dev)
    930{
    931	return NULL;
    932}
    933
    934static inline bool acpi_driver_match_device(struct device *dev,
    935					    const struct device_driver *drv)
    936{
    937	return false;
    938}
    939
    940static inline union acpi_object *acpi_evaluate_dsm(acpi_handle handle,
    941						   const guid_t *guid,
    942						   u64 rev, u64 func,
    943						   union acpi_object *argv4)
    944{
    945	return NULL;
    946}
    947
    948static inline int acpi_device_uevent_modalias(struct device *dev,
    949				struct kobj_uevent_env *env)
    950{
    951	return -ENODEV;
    952}
    953
    954static inline int acpi_device_modalias(struct device *dev,
    955				char *buf, int size)
    956{
    957	return -ENODEV;
    958}
    959
    960static inline struct platform_device *
    961acpi_create_platform_device(struct acpi_device *adev,
    962			    const struct property_entry *properties)
    963{
    964	return NULL;
    965}
    966
    967static inline bool acpi_dma_supported(const struct acpi_device *adev)
    968{
    969	return false;
    970}
    971
    972static inline enum dev_dma_attr acpi_get_dma_attr(struct acpi_device *adev)
    973{
    974	return DEV_DMA_NOT_SUPPORTED;
    975}
    976
    977static inline int acpi_dma_get_range(struct device *dev, u64 *dma_addr,
    978				     u64 *offset, u64 *size)
    979{
    980	return -ENODEV;
    981}
    982
    983static inline int acpi_dma_configure(struct device *dev,
    984				     enum dev_dma_attr attr)
    985{
    986	return 0;
    987}
    988
    989static inline int acpi_dma_configure_id(struct device *dev,
    990					enum dev_dma_attr attr,
    991					const u32 *input_id)
    992{
    993	return 0;
    994}
    995
    996#define ACPI_PTR(_ptr)	(NULL)
    997
    998static inline void acpi_device_set_enumerated(struct acpi_device *adev)
    999{
   1000}
   1001
   1002static inline void acpi_device_clear_enumerated(struct acpi_device *adev)
   1003{
   1004}
   1005
   1006static inline int acpi_reconfig_notifier_register(struct notifier_block *nb)
   1007{
   1008	return -EINVAL;
   1009}
   1010
   1011static inline int acpi_reconfig_notifier_unregister(struct notifier_block *nb)
   1012{
   1013	return -EINVAL;
   1014}
   1015
   1016static inline struct acpi_device *acpi_resource_consumer(struct resource *res)
   1017{
   1018	return NULL;
   1019}
   1020
   1021static inline int acpi_get_local_address(acpi_handle handle, u32 *addr)
   1022{
   1023	return -ENODEV;
   1024}
   1025
   1026static inline int acpi_register_wakeup_handler(int wake_irq,
   1027	bool (*wakeup)(void *context), void *context)
   1028{
   1029	return -ENXIO;
   1030}
   1031
   1032static inline void acpi_unregister_wakeup_handler(
   1033	bool (*wakeup)(void *context), void *context) { }
   1034
   1035struct acpi_osc_context;
   1036static inline u32 acpi_osc_ctx_get_pci_control(struct acpi_osc_context *context)
   1037{
   1038	return 0;
   1039}
   1040
   1041static inline u32 acpi_osc_ctx_get_cxl_control(struct acpi_osc_context *context)
   1042{
   1043	return 0;
   1044}
   1045
   1046#endif	/* !CONFIG_ACPI */
   1047
   1048#ifdef CONFIG_ACPI_HOTPLUG_IOAPIC
   1049int acpi_ioapic_add(acpi_handle root);
   1050#else
   1051static inline int acpi_ioapic_add(acpi_handle root) { return 0; }
   1052#endif
   1053
   1054#ifdef CONFIG_ACPI
   1055void acpi_os_set_prepare_sleep(int (*func)(u8 sleep_state,
   1056			       u32 pm1a_ctrl,  u32 pm1b_ctrl));
   1057
   1058acpi_status acpi_os_prepare_sleep(u8 sleep_state,
   1059				  u32 pm1a_control, u32 pm1b_control);
   1060
   1061void acpi_os_set_prepare_extended_sleep(int (*func)(u8 sleep_state,
   1062				        u32 val_a,  u32 val_b));
   1063
   1064acpi_status acpi_os_prepare_extended_sleep(u8 sleep_state,
   1065					   u32 val_a, u32 val_b);
   1066#ifdef CONFIG_X86
   1067struct acpi_s2idle_dev_ops {
   1068	struct list_head list_node;
   1069	void (*prepare)(void);
   1070	void (*restore)(void);
   1071};
   1072int acpi_register_lps0_dev(struct acpi_s2idle_dev_ops *arg);
   1073void acpi_unregister_lps0_dev(struct acpi_s2idle_dev_ops *arg);
   1074#endif /* CONFIG_X86 */
   1075#ifndef CONFIG_IA64
   1076void arch_reserve_mem_area(acpi_physical_address addr, size_t size);
   1077#else
   1078static inline void arch_reserve_mem_area(acpi_physical_address addr,
   1079					  size_t size)
   1080{
   1081}
   1082#endif /* CONFIG_X86 */
   1083#else
   1084#define acpi_os_set_prepare_sleep(func, pm1a_ctrl, pm1b_ctrl) do { } while (0)
   1085#endif
   1086
   1087#if defined(CONFIG_ACPI) && defined(CONFIG_PM)
   1088int acpi_dev_suspend(struct device *dev, bool wakeup);
   1089int acpi_dev_resume(struct device *dev);
   1090int acpi_subsys_runtime_suspend(struct device *dev);
   1091int acpi_subsys_runtime_resume(struct device *dev);
   1092int acpi_dev_pm_attach(struct device *dev, bool power_on);
   1093bool acpi_storage_d3(struct device *dev);
   1094bool acpi_dev_state_d0(struct device *dev);
   1095#else
   1096static inline int acpi_subsys_runtime_suspend(struct device *dev) { return 0; }
   1097static inline int acpi_subsys_runtime_resume(struct device *dev) { return 0; }
   1098static inline int acpi_dev_pm_attach(struct device *dev, bool power_on)
   1099{
   1100	return 0;
   1101}
   1102static inline bool acpi_storage_d3(struct device *dev)
   1103{
   1104	return false;
   1105}
   1106static inline bool acpi_dev_state_d0(struct device *dev)
   1107{
   1108	return true;
   1109}
   1110#endif
   1111
   1112#if defined(CONFIG_ACPI) && defined(CONFIG_PM_SLEEP)
   1113int acpi_subsys_prepare(struct device *dev);
   1114void acpi_subsys_complete(struct device *dev);
   1115int acpi_subsys_suspend_late(struct device *dev);
   1116int acpi_subsys_suspend_noirq(struct device *dev);
   1117int acpi_subsys_suspend(struct device *dev);
   1118int acpi_subsys_freeze(struct device *dev);
   1119int acpi_subsys_poweroff(struct device *dev);
   1120void acpi_ec_mark_gpe_for_wake(void);
   1121void acpi_ec_set_gpe_wake_mask(u8 action);
   1122#else
   1123static inline int acpi_subsys_prepare(struct device *dev) { return 0; }
   1124static inline void acpi_subsys_complete(struct device *dev) {}
   1125static inline int acpi_subsys_suspend_late(struct device *dev) { return 0; }
   1126static inline int acpi_subsys_suspend_noirq(struct device *dev) { return 0; }
   1127static inline int acpi_subsys_suspend(struct device *dev) { return 0; }
   1128static inline int acpi_subsys_freeze(struct device *dev) { return 0; }
   1129static inline int acpi_subsys_poweroff(struct device *dev) { return 0; }
   1130static inline void acpi_ec_mark_gpe_for_wake(void) {}
   1131static inline void acpi_ec_set_gpe_wake_mask(u8 action) {}
   1132#endif
   1133
   1134#ifdef CONFIG_ACPI
   1135__printf(3, 4)
   1136void acpi_handle_printk(const char *level, acpi_handle handle,
   1137			const char *fmt, ...);
   1138void acpi_evaluation_failure_warn(acpi_handle handle, const char *name,
   1139				  acpi_status status);
   1140#else	/* !CONFIG_ACPI */
   1141static inline __printf(3, 4) void
   1142acpi_handle_printk(const char *level, void *handle, const char *fmt, ...) {}
   1143static inline void acpi_evaluation_failure_warn(acpi_handle handle,
   1144						const char *name,
   1145						acpi_status status) {}
   1146#endif	/* !CONFIG_ACPI */
   1147
   1148#if defined(CONFIG_ACPI) && defined(CONFIG_DYNAMIC_DEBUG)
   1149__printf(3, 4)
   1150void __acpi_handle_debug(struct _ddebug *descriptor, acpi_handle handle, const char *fmt, ...);
   1151#endif
   1152
   1153/*
   1154 * acpi_handle_<level>: Print message with ACPI prefix and object path
   1155 *
   1156 * These interfaces acquire the global namespace mutex to obtain an object
   1157 * path.  In interrupt context, it shows the object path as <n/a>.
   1158 */
   1159#define acpi_handle_emerg(handle, fmt, ...)				\
   1160	acpi_handle_printk(KERN_EMERG, handle, fmt, ##__VA_ARGS__)
   1161#define acpi_handle_alert(handle, fmt, ...)				\
   1162	acpi_handle_printk(KERN_ALERT, handle, fmt, ##__VA_ARGS__)
   1163#define acpi_handle_crit(handle, fmt, ...)				\
   1164	acpi_handle_printk(KERN_CRIT, handle, fmt, ##__VA_ARGS__)
   1165#define acpi_handle_err(handle, fmt, ...)				\
   1166	acpi_handle_printk(KERN_ERR, handle, fmt, ##__VA_ARGS__)
   1167#define acpi_handle_warn(handle, fmt, ...)				\
   1168	acpi_handle_printk(KERN_WARNING, handle, fmt, ##__VA_ARGS__)
   1169#define acpi_handle_notice(handle, fmt, ...)				\
   1170	acpi_handle_printk(KERN_NOTICE, handle, fmt, ##__VA_ARGS__)
   1171#define acpi_handle_info(handle, fmt, ...)				\
   1172	acpi_handle_printk(KERN_INFO, handle, fmt, ##__VA_ARGS__)
   1173
   1174#if defined(DEBUG)
   1175#define acpi_handle_debug(handle, fmt, ...)				\
   1176	acpi_handle_printk(KERN_DEBUG, handle, fmt, ##__VA_ARGS__)
   1177#else
   1178#if defined(CONFIG_DYNAMIC_DEBUG)
   1179#define acpi_handle_debug(handle, fmt, ...)				\
   1180	_dynamic_func_call(fmt, __acpi_handle_debug,			\
   1181			   handle, pr_fmt(fmt), ##__VA_ARGS__)
   1182#else
   1183#define acpi_handle_debug(handle, fmt, ...)				\
   1184({									\
   1185	if (0)								\
   1186		acpi_handle_printk(KERN_DEBUG, handle, fmt, ##__VA_ARGS__); \
   1187	0;								\
   1188})
   1189#endif
   1190#endif
   1191
   1192#if defined(CONFIG_ACPI) && defined(CONFIG_GPIOLIB)
   1193bool acpi_gpio_get_irq_resource(struct acpi_resource *ares,
   1194				struct acpi_resource_gpio **agpio);
   1195bool acpi_gpio_get_io_resource(struct acpi_resource *ares,
   1196			       struct acpi_resource_gpio **agpio);
   1197int acpi_dev_gpio_irq_get_by(struct acpi_device *adev, const char *name, int index);
   1198#else
   1199static inline bool acpi_gpio_get_irq_resource(struct acpi_resource *ares,
   1200					      struct acpi_resource_gpio **agpio)
   1201{
   1202	return false;
   1203}
   1204static inline bool acpi_gpio_get_io_resource(struct acpi_resource *ares,
   1205					     struct acpi_resource_gpio **agpio)
   1206{
   1207	return false;
   1208}
   1209static inline int acpi_dev_gpio_irq_get_by(struct acpi_device *adev,
   1210					   const char *name, int index)
   1211{
   1212	return -ENXIO;
   1213}
   1214#endif
   1215
   1216static inline int acpi_dev_gpio_irq_get(struct acpi_device *adev, int index)
   1217{
   1218	return acpi_dev_gpio_irq_get_by(adev, NULL, index);
   1219}
   1220
   1221/* Device properties */
   1222
   1223#ifdef CONFIG_ACPI
   1224int acpi_dev_get_property(const struct acpi_device *adev, const char *name,
   1225			  acpi_object_type type, const union acpi_object **obj);
   1226int __acpi_node_get_property_reference(const struct fwnode_handle *fwnode,
   1227				const char *name, size_t index, size_t num_args,
   1228				struct fwnode_reference_args *args);
   1229
   1230static inline int acpi_node_get_property_reference(
   1231				const struct fwnode_handle *fwnode,
   1232				const char *name, size_t index,
   1233				struct fwnode_reference_args *args)
   1234{
   1235	return __acpi_node_get_property_reference(fwnode, name, index,
   1236		NR_FWNODE_REFERENCE_ARGS, args);
   1237}
   1238
   1239static inline bool acpi_dev_has_props(const struct acpi_device *adev)
   1240{
   1241	return !list_empty(&adev->data.properties);
   1242}
   1243
   1244struct acpi_device_properties *
   1245acpi_data_add_props(struct acpi_device_data *data, const guid_t *guid,
   1246		    const union acpi_object *properties);
   1247
   1248int acpi_node_prop_get(const struct fwnode_handle *fwnode, const char *propname,
   1249		       void **valptr);
   1250
   1251struct fwnode_handle *acpi_get_next_subnode(const struct fwnode_handle *fwnode,
   1252					    struct fwnode_handle *child);
   1253
   1254struct acpi_probe_entry;
   1255typedef bool (*acpi_probe_entry_validate_subtbl)(struct acpi_subtable_header *,
   1256						 struct acpi_probe_entry *);
   1257
   1258#define ACPI_TABLE_ID_LEN	5
   1259
   1260/**
   1261 * struct acpi_probe_entry - boot-time probing entry
   1262 * @id:			ACPI table name
   1263 * @type:		Optional subtable type to match
   1264 *			(if @id contains subtables)
   1265 * @subtable_valid:	Optional callback to check the validity of
   1266 *			the subtable
   1267 * @probe_table:	Callback to the driver being probed when table
   1268 *			match is successful
   1269 * @probe_subtbl:	Callback to the driver being probed when table and
   1270 *			subtable match (and optional callback is successful)
   1271 * @driver_data:	Sideband data provided back to the driver
   1272 */
   1273struct acpi_probe_entry {
   1274	__u8 id[ACPI_TABLE_ID_LEN];
   1275	__u8 type;
   1276	acpi_probe_entry_validate_subtbl subtable_valid;
   1277	union {
   1278		acpi_tbl_table_handler probe_table;
   1279		acpi_tbl_entry_handler probe_subtbl;
   1280	};
   1281	kernel_ulong_t driver_data;
   1282};
   1283
   1284#define ACPI_DECLARE_PROBE_ENTRY(table, name, table_id, subtable,	\
   1285				 valid, data, fn)			\
   1286	static const struct acpi_probe_entry __acpi_probe_##name	\
   1287		__used __section("__" #table "_acpi_probe_table") = {	\
   1288			.id = table_id,					\
   1289			.type = subtable,				\
   1290			.subtable_valid = valid,			\
   1291			.probe_table = fn,				\
   1292			.driver_data = data,				\
   1293		}
   1294
   1295#define ACPI_DECLARE_SUBTABLE_PROBE_ENTRY(table, name, table_id,	\
   1296					  subtable, valid, data, fn)	\
   1297	static const struct acpi_probe_entry __acpi_probe_##name	\
   1298		__used __section("__" #table "_acpi_probe_table") = {	\
   1299			.id = table_id,					\
   1300			.type = subtable,				\
   1301			.subtable_valid = valid,			\
   1302			.probe_subtbl = fn,				\
   1303			.driver_data = data,				\
   1304		}
   1305
   1306#define ACPI_PROBE_TABLE(name)		__##name##_acpi_probe_table
   1307#define ACPI_PROBE_TABLE_END(name)	__##name##_acpi_probe_table_end
   1308
   1309int __acpi_probe_device_table(struct acpi_probe_entry *start, int nr);
   1310
   1311#define acpi_probe_device_table(t)					\
   1312	({ 								\
   1313		extern struct acpi_probe_entry ACPI_PROBE_TABLE(t),	\
   1314			                       ACPI_PROBE_TABLE_END(t);	\
   1315		__acpi_probe_device_table(&ACPI_PROBE_TABLE(t),		\
   1316					  (&ACPI_PROBE_TABLE_END(t) -	\
   1317					   &ACPI_PROBE_TABLE(t)));	\
   1318	})
   1319#else
   1320static inline int acpi_dev_get_property(struct acpi_device *adev,
   1321					const char *name, acpi_object_type type,
   1322					const union acpi_object **obj)
   1323{
   1324	return -ENXIO;
   1325}
   1326
   1327static inline int
   1328__acpi_node_get_property_reference(const struct fwnode_handle *fwnode,
   1329				const char *name, size_t index, size_t num_args,
   1330				struct fwnode_reference_args *args)
   1331{
   1332	return -ENXIO;
   1333}
   1334
   1335static inline int
   1336acpi_node_get_property_reference(const struct fwnode_handle *fwnode,
   1337				 const char *name, size_t index,
   1338				 struct fwnode_reference_args *args)
   1339{
   1340	return -ENXIO;
   1341}
   1342
   1343static inline int acpi_node_prop_get(const struct fwnode_handle *fwnode,
   1344				     const char *propname,
   1345				     void **valptr)
   1346{
   1347	return -ENXIO;
   1348}
   1349
   1350static inline struct fwnode_handle *
   1351acpi_get_next_subnode(const struct fwnode_handle *fwnode,
   1352		      struct fwnode_handle *child)
   1353{
   1354	return NULL;
   1355}
   1356
   1357static inline struct fwnode_handle *
   1358acpi_graph_get_next_endpoint(const struct fwnode_handle *fwnode,
   1359			     struct fwnode_handle *prev)
   1360{
   1361	return ERR_PTR(-ENXIO);
   1362}
   1363
   1364static inline int
   1365acpi_graph_get_remote_endpoint(const struct fwnode_handle *fwnode,
   1366			       struct fwnode_handle **remote,
   1367			       struct fwnode_handle **port,
   1368			       struct fwnode_handle **endpoint)
   1369{
   1370	return -ENXIO;
   1371}
   1372
   1373#define ACPI_DECLARE_PROBE_ENTRY(table, name, table_id, subtable, valid, data, fn) \
   1374	static const void * __acpi_table_##name[]			\
   1375		__attribute__((unused))					\
   1376		 = { (void *) table_id,					\
   1377		     (void *) subtable,					\
   1378		     (void *) valid,					\
   1379		     (void *) fn,					\
   1380		     (void *) data }
   1381
   1382#define acpi_probe_device_table(t)	({ int __r = 0; __r;})
   1383#endif
   1384
   1385#ifdef CONFIG_ACPI_TABLE_UPGRADE
   1386void acpi_table_upgrade(void);
   1387#else
   1388static inline void acpi_table_upgrade(void) { }
   1389#endif
   1390
   1391#if defined(CONFIG_ACPI) && defined(CONFIG_ACPI_WATCHDOG)
   1392extern bool acpi_has_watchdog(void);
   1393#else
   1394static inline bool acpi_has_watchdog(void) { return false; }
   1395#endif
   1396
   1397#ifdef CONFIG_ACPI_SPCR_TABLE
   1398extern bool qdf2400_e44_present;
   1399int acpi_parse_spcr(bool enable_earlycon, bool enable_console);
   1400#else
   1401static inline int acpi_parse_spcr(bool enable_earlycon, bool enable_console)
   1402{
   1403	return 0;
   1404}
   1405#endif
   1406
   1407#if IS_ENABLED(CONFIG_ACPI_GENERIC_GSI)
   1408int acpi_irq_get(acpi_handle handle, unsigned int index, struct resource *res);
   1409#else
   1410static inline
   1411int acpi_irq_get(acpi_handle handle, unsigned int index, struct resource *res)
   1412{
   1413	return -EINVAL;
   1414}
   1415#endif
   1416
   1417#ifdef CONFIG_ACPI_LPIT
   1418int lpit_read_residency_count_address(u64 *address);
   1419#else
   1420static inline int lpit_read_residency_count_address(u64 *address)
   1421{
   1422	return -EINVAL;
   1423}
   1424#endif
   1425
   1426#ifdef CONFIG_ACPI_PPTT
   1427int acpi_pptt_cpu_is_thread(unsigned int cpu);
   1428int find_acpi_cpu_topology(unsigned int cpu, int level);
   1429int find_acpi_cpu_topology_cluster(unsigned int cpu);
   1430int find_acpi_cpu_topology_package(unsigned int cpu);
   1431int find_acpi_cpu_topology_hetero_id(unsigned int cpu);
   1432int find_acpi_cpu_cache_topology(unsigned int cpu, int level);
   1433#else
   1434static inline int acpi_pptt_cpu_is_thread(unsigned int cpu)
   1435{
   1436	return -EINVAL;
   1437}
   1438static inline int find_acpi_cpu_topology(unsigned int cpu, int level)
   1439{
   1440	return -EINVAL;
   1441}
   1442static inline int find_acpi_cpu_topology_cluster(unsigned int cpu)
   1443{
   1444	return -EINVAL;
   1445}
   1446static inline int find_acpi_cpu_topology_package(unsigned int cpu)
   1447{
   1448	return -EINVAL;
   1449}
   1450static inline int find_acpi_cpu_topology_hetero_id(unsigned int cpu)
   1451{
   1452	return -EINVAL;
   1453}
   1454static inline int find_acpi_cpu_cache_topology(unsigned int cpu, int level)
   1455{
   1456	return -EINVAL;
   1457}
   1458#endif
   1459
   1460#ifdef CONFIG_ACPI_PCC
   1461void acpi_init_pcc(void);
   1462#else
   1463static inline void acpi_init_pcc(void) { }
   1464#endif
   1465
   1466#ifdef CONFIG_ACPI
   1467extern void acpi_device_notify(struct device *dev);
   1468extern void acpi_device_notify_remove(struct device *dev);
   1469#else
   1470static inline void acpi_device_notify(struct device *dev) { }
   1471static inline void acpi_device_notify_remove(struct device *dev) { }
   1472#endif
   1473
   1474#endif	/*_LINUX_ACPI_H*/