]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - include/acpi/acpi_bus.h
Merge branch 'acpi-cleanup' into acpi-hotplug
[mirror_ubuntu-bionic-kernel.git] / include / acpi / acpi_bus.h
CommitLineData
1da177e4
LT
1/*
2 * acpi_bus.h - ACPI Bus Driver ($Revision: 22 $)
3 *
4 * Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
5 * Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
6 *
7 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or (at
12 * your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful, but
15 * WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License along
20 * with this program; if not, write to the Free Software Foundation, Inc.,
21 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
22 *
23 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
24 */
25
26#ifndef __ACPI_BUS_H__
27#define __ACPI_BUS_H__
28
5b327265 29#include <linux/device.h>
1da177e4 30
1da177e4
LT
31/* TBD: Make dynamic */
32#define ACPI_MAX_HANDLES 10
33struct acpi_handle_list {
4be44fcd
LB
34 u32 count;
35 acpi_handle handles[ACPI_MAX_HANDLES];
1da177e4
LT
36};
37
1da177e4
LT
38/* acpi_utils.h */
39acpi_status
4be44fcd
LB
40acpi_extract_package(union acpi_object *package,
41 struct acpi_buffer *format, struct acpi_buffer *buffer);
1da177e4 42acpi_status
4be44fcd
LB
43acpi_evaluate_integer(acpi_handle handle,
44 acpi_string pathname,
27663c58 45 struct acpi_object_list *arguments, unsigned long long *data);
1da177e4 46acpi_status
4be44fcd
LB
47acpi_evaluate_reference(acpi_handle handle,
48 acpi_string pathname,
49 struct acpi_object_list *arguments,
50 struct acpi_handle_list *list);
275c58d7
TK
51acpi_status
52acpi_evaluate_hotplug_ost(acpi_handle handle, u32 source_event,
53 u32 status_code, struct acpi_buffer *status_buf);
1da177e4 54
38ac0f1b 55acpi_status
8ede06ab 56acpi_get_physical_device_location(acpi_handle handle, struct acpi_pld_info **pld);
952c63e9
JL
57
58bool acpi_has_method(acpi_handle handle, char *name);
0db98202
JL
59acpi_status acpi_execute_simple_method(acpi_handle handle, char *method,
60 u64 arg);
7d2421f8
JL
61acpi_status acpi_evaluate_ej0(acpi_handle handle);
62acpi_status acpi_evaluate_lck(acpi_handle handle, int lock);
ebf4df8d
JL
63bool acpi_ata_match(acpi_handle handle);
64bool acpi_bay_match(acpi_handle handle);
65bool acpi_dock_match(acpi_handle handle);
952c63e9 66
76f58584 67#ifdef CONFIG_ACPI
1da177e4
LT
68
69#include <linux/proc_fs.h>
70
71#define ACPI_BUS_FILE_ROOT "acpi"
4be44fcd 72extern struct proc_dir_entry *acpi_root_dir;
1da177e4 73
1da177e4 74enum acpi_bus_device_type {
4be44fcd 75 ACPI_BUS_TYPE_DEVICE = 0,
1da177e4
LT
76 ACPI_BUS_TYPE_POWER,
77 ACPI_BUS_TYPE_PROCESSOR,
78 ACPI_BUS_TYPE_THERMAL,
1da177e4
LT
79 ACPI_BUS_TYPE_POWER_BUTTON,
80 ACPI_BUS_TYPE_SLEEP_BUTTON,
81 ACPI_BUS_DEVICE_TYPE_COUNT
82};
83
84struct acpi_driver;
85struct acpi_device;
86
ca589f94
RW
87/*
88 * ACPI Scan Handler
89 * -----------------
90 */
91
a33ec399 92struct acpi_hotplug_profile {
3f8055c3 93 struct kobject kobj;
a33ec399 94 bool enabled:1;
3338db00 95 int (*scan_dependent)(struct acpi_device *adev);
a33ec399
RW
96};
97
3f8055c3
RW
98static inline struct acpi_hotplug_profile *to_acpi_hotplug_profile(
99 struct kobject *kobj)
100{
101 return container_of(kobj, struct acpi_hotplug_profile, kobj);
102}
103
ca589f94
RW
104struct acpi_scan_handler {
105 const struct acpi_device_id *ids;
106 struct list_head list_node;
107 int (*attach)(struct acpi_device *dev, const struct acpi_device_id *id);
108 void (*detach)(struct acpi_device *dev);
a33ec399 109 struct acpi_hotplug_profile hotplug;
ca589f94
RW
110};
111
1da177e4
LT
112/*
113 * ACPI Driver
114 * -----------
115 */
116
4be44fcd 117typedef int (*acpi_op_add) (struct acpi_device * device);
51fac838 118typedef int (*acpi_op_remove) (struct acpi_device * device);
46ec8598 119typedef void (*acpi_op_notify) (struct acpi_device * device, u32 event);
1da177e4
LT
120
121struct acpi_device_ops {
4be44fcd
LB
122 acpi_op_add add;
123 acpi_op_remove remove;
46ec8598 124 acpi_op_notify notify;
1da177e4
LT
125};
126
6d278131
BH
127#define ACPI_DRIVER_ALL_NOTIFY_EVENTS 0x1 /* system AND device events */
128
1da177e4 129struct acpi_driver {
4be44fcd
LB
130 char name[80];
131 char class[80];
8c8eb78f 132 const struct acpi_device_id *ids; /* Supported Hardware IDs */
6d278131 133 unsigned int flags;
4be44fcd 134 struct acpi_device_ops ops;
d43ec68e 135 struct device_driver drv;
1890a97a 136 struct module *owner;
1da177e4
LT
137};
138
139/*
140 * ACPI Device
141 * -----------
142 */
143
144/* Status (_STA) */
145
146struct acpi_device_status {
4be44fcd
LB
147 u32 present:1;
148 u32 enabled:1;
149 u32 show_in_ui:1;
150 u32 functional:1;
151 u32 battery_present:1;
152 u32 reserved:27;
1da177e4
LT
153};
154
1da177e4
LT
155/* Flags */
156
157struct acpi_device_flags {
4be44fcd 158 u32 dynamic_status:1;
4be44fcd
LB
159 u32 removable:1;
160 u32 ejectable:1;
4be44fcd 161 u32 power_manageable:1;
209d3b17 162 u32 match_driver:1;
202317a5
RW
163 u32 initialized:1;
164 u32 visited:1;
165 u32 reserved:25;
1da177e4
LT
166};
167
1da177e4
LT
168/* File System */
169
170struct acpi_device_dir {
4be44fcd 171 struct proc_dir_entry *entry;
1da177e4
LT
172};
173
174#define acpi_device_dir(d) ((d)->dir.entry)
175
1da177e4
LT
176/* Plug and Play */
177
24c5c4c2 178typedef char acpi_bus_id[8];
4be44fcd 179typedef unsigned long acpi_bus_address;
4be44fcd
LB
180typedef char acpi_device_name[40];
181typedef char acpi_device_class[20];
1da177e4 182
7f47fa6c
BH
183struct acpi_hardware_id {
184 struct list_head list;
185 char *id;
186};
187
d4e1a692
TK
188struct acpi_pnp_type {
189 u32 hardware_id:1;
190 u32 bus_address:1;
191 u32 reserved:30;
192};
193
1da177e4 194struct acpi_device_pnp {
d4e1a692
TK
195 acpi_bus_id bus_id; /* Object name */
196 struct acpi_pnp_type type; /* ID type */
4be44fcd 197 acpi_bus_address bus_address; /* _ADR */
d4e1a692 198 char *unique_id; /* _UID */
7f47fa6c 199 struct list_head ids; /* _HID and _CIDs */
4be44fcd
LB
200 acpi_device_name device_name; /* Driver-determined */
201 acpi_device_class device_class; /* " */
d1efe3c3 202 union acpi_object *str_obj; /* unicode string for _STR method */
bb74ac23 203 unsigned long sun; /* _SUN */
1da177e4
LT
204};
205
206#define acpi_device_bid(d) ((d)->pnp.bus_id)
207#define acpi_device_adr(d) ((d)->pnp.bus_address)
620e112c 208const char *acpi_device_hid(struct acpi_device *device);
1da177e4
LT
209#define acpi_device_name(d) ((d)->pnp.device_name)
210#define acpi_device_class(d) ((d)->pnp.device_class)
211
1da177e4
LT
212/* Power Management */
213
214struct acpi_device_power_flags {
4be44fcd
LB
215 u32 explicit_get:1; /* _PSC present? */
216 u32 power_resources:1; /* Power resources */
217 u32 inrush_current:1; /* Serialize Dx->D0 */
218 u32 power_removed:1; /* Optimize Dx->D0 */
644f17ad
MW
219 u32 ignore_parent:1; /* Power is independent of parent power state */
220 u32 reserved:27;
1da177e4
LT
221};
222
223struct acpi_device_power_state {
224 struct {
4be44fcd 225 u8 valid:1;
1399dfcd 226 u8 os_accessible:1;
4be44fcd
LB
227 u8 explicit_set:1; /* _PSx present? */
228 u8 reserved:6;
229 } flags;
230 int power; /* % Power (compared to D0) */
231 int latency; /* Dx->D0 time (microseconds) */
0b224527 232 struct list_head resources; /* Power resources referenced */
1da177e4
LT
233};
234
235struct acpi_device_power {
4be44fcd 236 int state; /* Current state */
1da177e4 237 struct acpi_device_power_flags flags;
b4a03b9a 238 struct acpi_device_power_state states[ACPI_D_STATE_COUNT]; /* Power states (D0-D3Cold) */
1da177e4
LT
239};
240
1da177e4
LT
241/* Performance Management */
242
243struct acpi_device_perf_flags {
4be44fcd 244 u8 reserved:8;
1da177e4
LT
245};
246
247struct acpi_device_perf_state {
248 struct {
4be44fcd
LB
249 u8 valid:1;
250 u8 reserved:7;
251 } flags;
252 u8 power; /* % Power (compared to P0) */
253 u8 performance; /* % Performance ( " ) */
254 int latency; /* Px->P0 time (microseconds) */
1da177e4
LT
255};
256
257struct acpi_device_perf {
4be44fcd 258 int state;
1da177e4 259 struct acpi_device_perf_flags flags;
4be44fcd 260 int state_count;
1da177e4
LT
261 struct acpi_device_perf_state *states;
262};
263
264/* Wakeup Management */
265struct acpi_device_wakeup_flags {
4be44fcd
LB
266 u8 valid:1; /* Can successfully enable wakeup? */
267 u8 run_wake:1; /* Run-Wake GPE devices */
b67ea761 268 u8 notifier_present:1; /* Wake-up notify handler has been installed */
1da177e4
LT
269};
270
1da177e4 271struct acpi_device_wakeup {
4be44fcd 272 acpi_handle gpe_device;
439913ff
LM
273 u64 gpe_number;
274 u64 sleep_state;
993cbe59 275 struct list_head resources;
4be44fcd 276 struct acpi_device_wakeup_flags flags;
9b83ccd2 277 int prepare_count;
1da177e4
LT
278};
279
1033f904 280struct acpi_device_physical_node {
007ccfcf 281 unsigned int node_id;
1033f904
LT
282 struct list_head node;
283 struct device *dev;
683058e3 284 bool put_online:1;
1033f904 285};
1da177e4 286
1033f904 287/* Device */
1da177e4 288struct acpi_device {
caaa6efb
BH
289 int device_type;
290 acpi_handle handle; /* no handle for fixed hardware */
4be44fcd
LB
291 struct acpi_device *parent;
292 struct list_head children;
293 struct list_head node;
294 struct list_head wakeup_list;
d783156e 295 struct list_head del_list;
1da177e4
LT
296 struct acpi_device_status status;
297 struct acpi_device_flags flags;
4be44fcd 298 struct acpi_device_pnp pnp;
1da177e4
LT
299 struct acpi_device_power power;
300 struct acpi_device_wakeup wakeup;
4be44fcd
LB
301 struct acpi_device_perf performance;
302 struct acpi_device_dir dir;
ca589f94 303 struct acpi_scan_handler *handler;
4be44fcd
LB
304 struct acpi_driver *driver;
305 void *driver_data;
5b327265 306 struct device dev;
007ccfcf 307 unsigned int physical_node_count;
1033f904
LT
308 struct list_head physical_node_list;
309 struct mutex physical_node_lock;
b1c0f99b 310 void (*remove)(struct acpi_device *);
1da177e4
LT
311};
312
db89b4f0
PM
313static inline void *acpi_driver_data(struct acpi_device *d)
314{
315 return d->driver_data;
316}
317
d43ec68e
PM
318#define to_acpi_device(d) container_of(d, struct acpi_device, dev)
319#define to_acpi_driver(d) container_of(d, struct acpi_driver, drv)
1da177e4 320
25db115b
RW
321static inline void acpi_set_device_status(struct acpi_device *adev, u32 sta)
322{
323 *((u32 *)&adev->status) = sta;
324}
325
55955aad
DB
326/* acpi_device.dev.bus == &acpi_bus_type */
327extern struct bus_type acpi_bus_type;
328
1da177e4
LT
329/*
330 * Events
331 * ------
332 */
333
334struct acpi_bus_event {
4be44fcd
LB
335 struct list_head node;
336 acpi_device_class device_class;
337 acpi_bus_id bus_id;
338 u32 type;
339 u32 data;
1da177e4
LT
340};
341
99e0d2fc 342extern struct kobject *acpi_kobj;
962ce8ca 343extern int acpi_bus_generate_netlink_event(const char*, const char*, u8, int);
8e4319c4 344void acpi_bus_private_data_handler(acpi_handle, void *);
20733939 345int acpi_bus_get_private_data(acpi_handle, void **);
9ee85241
ZR
346extern int acpi_notifier_call_chain(struct acpi_device *, u32, u32);
347extern int register_acpi_notifier(struct notifier_block *);
348extern int unregister_acpi_notifier(struct notifier_block *);
6bd00a61 349
1da177e4
LT
350/*
351 * External Functions
352 */
353
354int acpi_bus_get_device(acpi_handle handle, struct acpi_device **device);
402ac536
BH
355acpi_status acpi_bus_get_status_handle(acpi_handle handle,
356 unsigned long long *sta);
4be44fcd 357int acpi_bus_get_status(struct acpi_device *device);
9ce4e607 358
4be44fcd 359int acpi_bus_set_power(acpi_handle handle, int state);
96bfd3ce 360const char *acpi_power_state_string(int state);
ad0c3b0e 361int acpi_device_get_power(struct acpi_device *device, int *state);
078eb126 362int acpi_device_set_power(struct acpi_device *device, int state);
9ce4e607 363int acpi_bus_init_power(struct acpi_device *device);
b9e95fc6 364int acpi_device_fix_up_power(struct acpi_device *device);
25eed407 365int acpi_bus_update_power(acpi_handle handle, int *state_p);
3737b2b1 366bool acpi_bus_power_manageable(acpi_handle handle);
ec4602a9
RW
367
368#ifdef CONFIG_PM
eb9d0fe4 369bool acpi_bus_can_wakeup(acpi_handle handle);
ec4602a9
RW
370#else
371static inline bool acpi_bus_can_wakeup(acpi_handle handle) { return false; }
372#endif
9ce4e607 373
3757b948
RW
374void acpi_scan_lock_acquire(void);
375void acpi_scan_lock_release(void);
ca589f94 376int acpi_scan_add_handler(struct acpi_scan_handler *handler);
4be44fcd 377int acpi_bus_register_driver(struct acpi_driver *driver);
06ea8e08 378void acpi_bus_unregister_driver(struct acpi_driver *driver);
b8bd759a 379int acpi_bus_scan(acpi_handle handle);
bfee26db 380void acpi_bus_trim(struct acpi_device *start);
fd350943 381acpi_status acpi_bus_get_ejd(acpi_handle handle, acpi_handle * ejd);
8c8eb78f
TR
382int acpi_match_device_ids(struct acpi_device *device,
383 const struct acpi_device_id *ids);
1da177e4
LT
384int acpi_create_dir(struct acpi_device *);
385void acpi_remove_dir(struct acpi_device *);
386
202317a5
RW
387static inline bool acpi_device_enumerated(struct acpi_device *adev)
388{
389 return adev && adev->flags.initialized && adev->flags.visited;
390}
391
7b98118a
RW
392typedef void (*acpi_hp_callback)(void *data, u32 src);
393
394acpi_status acpi_hotplug_execute(acpi_hp_callback func, void *data, u32 src);
0d2cf8f5
MW
395
396/**
397 * module_acpi_driver(acpi_driver) - Helper macro for registering an ACPI driver
398 * @__acpi_driver: acpi_driver struct
399 *
400 * Helper macro for ACPI drivers which do not do anything special in module
401 * init/exit. This eliminates a lot of boilerplate. Each module may only
402 * use this macro once, and calling it replaces module_init() and module_exit()
403 */
404#define module_acpi_driver(__acpi_driver) \
405 module_driver(__acpi_driver, acpi_bus_register_driver, \
406 acpi_bus_unregister_driver)
407
4e10d12a
DSL
408/*
409 * Bind physical devices with ACPI devices
410 */
4e10d12a 411struct acpi_bus_type {
4be44fcd 412 struct list_head list;
53540098
RW
413 const char *name;
414 bool (*match)(struct device *dev);
4be44fcd 415 int (*find_device) (struct device *, acpi_handle *);
11909ca1
RW
416 void (*setup)(struct device *);
417 void (*cleanup)(struct device *);
4e10d12a
DSL
418};
419int register_acpi_bus_type(struct acpi_bus_type *);
420int unregister_acpi_bus_type(struct acpi_bus_type *);
22c13f9d 421
76d56de5 422struct acpi_pci_root {
76d56de5 423 struct acpi_device * device;
76d56de5
AC
424 struct pci_bus *bus;
425 u16 segment;
6ad95513 426 struct resource secondary; /* downstream bus range */
76d56de5
AC
427
428 u32 osc_support_set; /* _OSC state of support bits */
429 u32 osc_control_set; /* _OSC state of control bits */
f4b57a3b 430 phys_addr_t mcfg_addr;
76d56de5
AC
431};
432
4e10d12a 433/* helper */
60f75b8e
RW
434acpi_handle acpi_find_child(acpi_handle, u64, bool);
435static inline acpi_handle acpi_get_child(acpi_handle handle, u64 addr)
436{
437 return acpi_find_child(handle, addr, false);
438}
7b199811 439void acpi_preset_companion(struct device *dev, acpi_handle parent, u64 addr);
27558203 440int acpi_is_root_bridge(acpi_handle);
76d56de5 441struct acpi_pci_root *acpi_pci_find_root(acpi_handle handle);
4e10d12a 442
b67ea761
RW
443int acpi_enable_wakeup_device_power(struct acpi_device *dev, int state);
444int acpi_disable_wakeup_device_power(struct acpi_device *dev);
445
aa338601 446#ifdef CONFIG_PM
ec2cd81c
RW
447acpi_status acpi_add_pm_notifier(struct acpi_device *adev,
448 acpi_notify_handler handler, void *context);
449acpi_status acpi_remove_pm_notifier(struct acpi_device *adev,
450 acpi_notify_handler handler);
ee85f543 451int acpi_pm_device_sleep_state(struct device *, int *, int);
761afb86 452#else
ec2cd81c
RW
453static inline acpi_status acpi_add_pm_notifier(struct acpi_device *adev,
454 acpi_notify_handler handler,
455 void *context)
456{
457 return AE_SUPPORT;
458}
459static inline acpi_status acpi_remove_pm_notifier(struct acpi_device *adev,
460 acpi_notify_handler handler)
461{
462 return AE_SUPPORT;
463}
b25c77ef 464static inline int acpi_pm_device_sleep_state(struct device *d, int *p, int m)
296699de
RW
465{
466 if (p)
467 *p = ACPI_STATE_D0;
b25c77ef 468
8ad928d5
RW
469 return (m >= ACPI_STATE_D0 && m <= ACPI_STATE_D3_COLD) ?
470 m : ACPI_STATE_D0;
296699de 471}
761afb86
RW
472#endif
473
bdda27fb 474#ifdef CONFIG_PM_RUNTIME
dee8370c 475int __acpi_device_run_wake(struct acpi_device *, bool);
b24e5098 476int acpi_pm_device_run_wake(struct device *, bool);
761afb86 477#else
dee8370c
RW
478static inline int __acpi_device_run_wake(struct acpi_device *adev, bool en)
479{
480 return -ENODEV;
481}
b24e5098
LM
482static inline int acpi_pm_device_run_wake(struct device *dev, bool enable)
483{
484 return -ENODEV;
485}
bdda27fb
RW
486#endif
487
488#ifdef CONFIG_PM_SLEEP
dee8370c 489int __acpi_device_sleep_wake(struct acpi_device *, u32, bool);
bdda27fb
RW
490int acpi_pm_device_sleep_wake(struct device *, bool);
491#else
dee8370c
RW
492static inline int __acpi_device_sleep_wake(struct acpi_device *adev,
493 u32 target_state, bool enable)
494{
495 return -ENODEV;
496}
f7a1b860
DH
497static inline int acpi_pm_device_sleep_wake(struct device *dev, bool enable)
498{
499 return -ENODEV;
500}
761afb86 501#endif
fd4aff1a 502
99926a8c
DR
503#ifdef CONFIG_ACPI_SLEEP
504u32 acpi_target_system_state(void);
505#else
506static inline u32 acpi_target_system_state(void) { return ACPI_STATE_S0; }
507#endif
508
078eb126
RW
509static inline bool acpi_device_power_manageable(struct acpi_device *adev)
510{
511 return adev->flags.power_manageable;
512}
513
514static inline bool acpi_device_can_wakeup(struct acpi_device *adev)
515{
516 return adev->wakeup.flags.valid;
517}
518
1399dfcd
AL
519static inline bool acpi_device_can_poweroff(struct acpi_device *adev)
520{
521 return adev->power.states[ACPI_STATE_D3_COLD].flags.os_accessible;
522}
523
66886d6f
MG
524#else /* CONFIG_ACPI */
525
7ae30986
LB
526static inline int register_acpi_bus_type(void *bus) { return 0; }
527static inline int unregister_acpi_bus_type(void *bus) { return 0; }
66886d6f 528
fd350943 529#endif /* CONFIG_ACPI */
1da177e4
LT
530
531#endif /*__ACPI_BUS_H__*/