1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
2 | /* |
3 | * acpi/internal.h |
4 | * For use by Linux/ACPI infrastructure, not drivers |
5 | * |
6 | * Copyright (c) 2009, Intel Corporation. |
7 | */ |
8 | |
9 | #ifndef _ACPI_INTERNAL_H_ |
10 | #define _ACPI_INTERNAL_H_ |
11 | |
12 | #include <linux/idr.h> |
13 | |
14 | extern struct acpi_device *acpi_root; |
15 | |
16 | int early_acpi_osi_init(void); |
17 | int acpi_osi_init(void); |
18 | acpi_status acpi_os_initialize1(void); |
19 | void acpi_scan_init(void); |
20 | #ifdef CONFIG_PCI |
21 | void acpi_pci_root_init(void); |
22 | void acpi_pci_link_init(void); |
23 | #else |
24 | static inline void acpi_pci_root_init(void) {} |
25 | static inline void acpi_pci_link_init(void) {} |
26 | #endif |
27 | void acpi_processor_init(void); |
28 | void acpi_platform_init(void); |
29 | void acpi_pnp_init(void); |
30 | void acpi_int340x_thermal_init(void); |
31 | int acpi_sysfs_init(void); |
32 | void acpi_gpe_apply_masked_gpes(void); |
33 | void acpi_container_init(void); |
34 | void acpi_memory_hotplug_init(void); |
35 | #ifdef CONFIG_ACPI_HOTPLUG_IOAPIC |
36 | void pci_ioapic_remove(struct acpi_pci_root *root); |
37 | int acpi_ioapic_remove(struct acpi_pci_root *root); |
38 | #else |
39 | static inline void pci_ioapic_remove(struct acpi_pci_root *root) { return; } |
40 | static inline int acpi_ioapic_remove(struct acpi_pci_root *root) { return 0; } |
41 | #endif |
42 | #ifdef CONFIG_ACPI_DOCK |
43 | void register_dock_dependent_device(struct acpi_device *adev, |
44 | acpi_handle dshandle); |
45 | int dock_notify(struct acpi_device *adev, u32 event); |
46 | void acpi_dock_add(struct acpi_device *adev); |
47 | #else |
48 | static inline void register_dock_dependent_device(struct acpi_device *adev, |
49 | acpi_handle dshandle) {} |
50 | static inline int dock_notify(struct acpi_device *adev, u32 event) { return -ENODEV; } |
51 | static inline void acpi_dock_add(struct acpi_device *adev) {} |
52 | #endif |
53 | #ifdef CONFIG_X86 |
54 | void acpi_cmos_rtc_init(void); |
55 | #else |
56 | static inline void acpi_cmos_rtc_init(void) {} |
57 | #endif |
58 | int acpi_rev_override_setup(char *str); |
59 | |
60 | void acpi_sysfs_add_hotplug_profile(struct acpi_hotplug_profile *hotplug, |
61 | const char *name); |
62 | int acpi_scan_add_handler_with_hotplug(struct acpi_scan_handler *handler, |
63 | const char *hotplug_profile_name); |
64 | void acpi_scan_hotplug_enabled(struct acpi_hotplug_profile *hotplug, bool val); |
65 | |
66 | #ifdef CONFIG_DEBUG_FS |
67 | extern struct dentry *acpi_debugfs_dir; |
68 | void acpi_debugfs_init(void); |
69 | #else |
70 | static inline void acpi_debugfs_init(void) { return; } |
71 | #endif |
72 | #ifdef CONFIG_PCI |
73 | void acpi_lpss_init(void); |
74 | #else |
75 | static inline void acpi_lpss_init(void) {} |
76 | #endif |
77 | |
78 | void acpi_apd_init(void); |
79 | |
80 | acpi_status acpi_hotplug_schedule(struct acpi_device *adev, u32 src); |
81 | bool acpi_queue_hotplug_work(struct work_struct *work); |
82 | void acpi_device_hotplug(struct acpi_device *adev, u32 src); |
83 | bool acpi_scan_is_offline(struct acpi_device *adev, bool uevent); |
84 | |
85 | acpi_status acpi_sysfs_table_handler(u32 event, void *table, void *context); |
86 | void acpi_scan_table_notify(void); |
87 | |
88 | /* -------------------------------------------------------------------------- |
89 | Device Node Initialization / Removal |
90 | -------------------------------------------------------------------------- */ |
91 | #define ACPI_STA_DEFAULT (ACPI_STA_DEVICE_PRESENT | ACPI_STA_DEVICE_ENABLED | \ |
92 | ACPI_STA_DEVICE_UI | ACPI_STA_DEVICE_FUNCTIONING) |
93 | |
94 | extern struct list_head acpi_bus_id_list; |
95 | |
96 | struct acpi_device_bus_id { |
97 | const char *bus_id; |
98 | struct ida instance_ida; |
99 | struct list_head node; |
100 | }; |
101 | |
102 | void acpi_init_device_object(struct acpi_device *device, acpi_handle handle, |
103 | int type, void (*release)(struct device *)); |
104 | int acpi_tie_acpi_dev(struct acpi_device *adev); |
105 | int acpi_device_add(struct acpi_device *device); |
106 | int acpi_device_setup_files(struct acpi_device *dev); |
107 | void acpi_device_remove_files(struct acpi_device *dev); |
108 | void acpi_device_add_finalize(struct acpi_device *device); |
109 | void acpi_free_pnp_ids(struct acpi_device_pnp *pnp); |
110 | bool acpi_device_is_present(const struct acpi_device *adev); |
111 | bool acpi_device_is_battery(struct acpi_device *adev); |
112 | bool acpi_device_is_first_physical_node(struct acpi_device *adev, |
113 | const struct device *dev); |
114 | int acpi_bus_register_early_device(int type); |
115 | |
116 | /* -------------------------------------------------------------------------- |
117 | Device Matching and Notification |
118 | -------------------------------------------------------------------------- */ |
119 | const struct acpi_device *acpi_companion_match(const struct device *dev); |
120 | int __acpi_device_uevent_modalias(const struct acpi_device *adev, |
121 | struct kobj_uevent_env *env); |
122 | |
123 | /* -------------------------------------------------------------------------- |
124 | Power Resource |
125 | -------------------------------------------------------------------------- */ |
126 | void acpi_power_resources_list_free(struct list_head *list); |
127 | int (union acpi_object *package, unsigned int start, |
128 | struct list_head *list); |
129 | struct acpi_device *acpi_add_power_resource(acpi_handle handle); |
130 | void acpi_power_add_remove_device(struct acpi_device *adev, bool add); |
131 | int acpi_power_wakeup_list_init(struct list_head *list, int *system_level); |
132 | int acpi_device_sleep_wake(struct acpi_device *dev, |
133 | int enable, int sleep_state, int dev_state); |
134 | int acpi_power_get_inferred_state(struct acpi_device *device, int *state); |
135 | int acpi_power_on_resources(struct acpi_device *device, int state); |
136 | int acpi_power_transition(struct acpi_device *device, int state); |
137 | void acpi_turn_off_unused_power_resources(void); |
138 | |
139 | /* -------------------------------------------------------------------------- |
140 | Device Power Management |
141 | -------------------------------------------------------------------------- */ |
142 | int acpi_device_get_power(struct acpi_device *device, int *state); |
143 | int acpi_wakeup_device_init(void); |
144 | |
145 | /* -------------------------------------------------------------------------- |
146 | Processor |
147 | -------------------------------------------------------------------------- */ |
148 | #ifdef CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC |
149 | void acpi_early_processor_control_setup(void); |
150 | void acpi_early_processor_set_pdc(void); |
151 | |
152 | void acpi_proc_quirk_mwait_check(void); |
153 | bool processor_physically_present(acpi_handle handle); |
154 | #else |
155 | static inline void acpi_early_processor_control_setup(void) {} |
156 | #endif |
157 | |
158 | /* -------------------------------------------------------------------------- |
159 | Embedded Controller |
160 | -------------------------------------------------------------------------- */ |
161 | |
162 | enum acpi_ec_event_state { |
163 | EC_EVENT_READY = 0, /* Event work can be submitted */ |
164 | EC_EVENT_IN_PROGRESS, /* Event work is pending or being processed */ |
165 | EC_EVENT_COMPLETE, /* Event work processing has completed */ |
166 | }; |
167 | |
168 | struct acpi_ec { |
169 | acpi_handle handle; |
170 | acpi_handle address_space_handler_holder; |
171 | int gpe; |
172 | int irq; |
173 | unsigned long command_addr; |
174 | unsigned long data_addr; |
175 | bool global_lock; |
176 | unsigned long flags; |
177 | unsigned long reference_count; |
178 | struct mutex mutex; |
179 | wait_queue_head_t wait; |
180 | struct list_head list; |
181 | struct transaction *curr; |
182 | spinlock_t lock; |
183 | struct work_struct work; |
184 | unsigned long timestamp; |
185 | enum acpi_ec_event_state event_state; |
186 | unsigned int events_to_process; |
187 | unsigned int events_in_progress; |
188 | unsigned int queries_in_progress; |
189 | bool busy_polling; |
190 | unsigned int polling_guard; |
191 | }; |
192 | |
193 | extern struct acpi_ec *first_ec; |
194 | |
195 | /* If we find an EC via the ECDT, we need to keep a ptr to its context */ |
196 | /* External interfaces use first EC only, so remember */ |
197 | typedef int (*acpi_ec_query_func) (void *data); |
198 | |
199 | void acpi_ec_init(void); |
200 | void acpi_ec_ecdt_probe(void); |
201 | void acpi_ec_dsdt_probe(void); |
202 | void acpi_ec_block_transactions(void); |
203 | void acpi_ec_unblock_transactions(void); |
204 | int acpi_ec_add_query_handler(struct acpi_ec *ec, u8 query_bit, |
205 | acpi_handle handle, acpi_ec_query_func func, |
206 | void *data); |
207 | void acpi_ec_remove_query_handler(struct acpi_ec *ec, u8 query_bit); |
208 | |
209 | #ifdef CONFIG_PM_SLEEP |
210 | void acpi_ec_flush_work(void); |
211 | bool acpi_ec_dispatch_gpe(void); |
212 | #endif |
213 | |
214 | |
215 | /*-------------------------------------------------------------------------- |
216 | Suspend/Resume |
217 | -------------------------------------------------------------------------- */ |
218 | #ifdef CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT |
219 | extern bool acpi_s2idle_wakeup(void); |
220 | extern int acpi_sleep_init(void); |
221 | #else |
222 | static inline bool acpi_s2idle_wakeup(void) { return false; } |
223 | static inline int acpi_sleep_init(void) { return -ENXIO; } |
224 | #endif |
225 | |
226 | #ifdef CONFIG_ACPI_SLEEP |
227 | void acpi_sleep_proc_init(void); |
228 | int suspend_nvs_alloc(void); |
229 | void suspend_nvs_free(void); |
230 | int suspend_nvs_save(void); |
231 | void suspend_nvs_restore(void); |
232 | #else |
233 | static inline void acpi_sleep_proc_init(void) {} |
234 | static inline int suspend_nvs_alloc(void) { return 0; } |
235 | static inline void suspend_nvs_free(void) {} |
236 | static inline int suspend_nvs_save(void) { return 0; } |
237 | static inline void suspend_nvs_restore(void) {} |
238 | #endif |
239 | |
240 | #ifdef CONFIG_X86 |
241 | bool force_storage_d3(void); |
242 | #else |
243 | static inline bool force_storage_d3(void) |
244 | { |
245 | return false; |
246 | } |
247 | #endif |
248 | |
249 | /*-------------------------------------------------------------------------- |
250 | Device properties |
251 | -------------------------------------------------------------------------- */ |
252 | #define ACPI_DT_NAMESPACE_HID "PRP0001" |
253 | |
254 | void acpi_init_properties(struct acpi_device *adev); |
255 | void acpi_free_properties(struct acpi_device *adev); |
256 | |
257 | #ifdef CONFIG_X86 |
258 | void (struct acpi_device *adev); |
259 | #else |
260 | static inline void acpi_extract_apple_properties(struct acpi_device *adev) {} |
261 | #endif |
262 | |
263 | /*-------------------------------------------------------------------------- |
264 | Watchdog |
265 | -------------------------------------------------------------------------- */ |
266 | |
267 | #ifdef CONFIG_ACPI_WATCHDOG |
268 | void acpi_watchdog_init(void); |
269 | #else |
270 | static inline void acpi_watchdog_init(void) {} |
271 | #endif |
272 | |
273 | #ifdef CONFIG_ACPI_LPIT |
274 | void acpi_init_lpit(void); |
275 | #else |
276 | static inline void acpi_init_lpit(void) { } |
277 | #endif |
278 | |
279 | #endif /* _ACPI_INTERNAL_H_ */ |
280 | |