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