1 /* $NetBSD: acpivar.h,v 1.93 2024/12/18 21:19:52 jmcneill Exp $ */ 2 3 /* 4 * Copyright 2001 Wasabi Systems, Inc. 5 * All rights reserved. 6 * 7 * Written by Jason R. Thorpe for Wasabi Systems, Inc. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 3. All advertising materials mentioning features or use of this software 18 * must display the following acknowledgement: 19 * This product includes software developed for the NetBSD Project by 20 * Wasabi Systems, Inc. 21 * 4. The name of Wasabi Systems, Inc. may not be used to endorse 22 * or promote products derived from this software without specific prior 23 * written permission. 24 * 25 * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND 26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 27 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 28 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC 29 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 30 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 31 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 32 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 33 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 34 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 35 * POSSIBILITY OF SUCH DAMAGE. 36 */ 37 38 #ifndef _SYS_DEV_ACPI_ACPIVAR_H 39 #define _SYS_DEV_ACPI_ACPIVAR_H 40 41 /* 42 * This file defines the ACPI interface provided to the rest of the 43 * kernel, as well as the autoconfiguration structures for ACPI 44 * support. 45 */ 46 47 #include <sys/bus.h> 48 #include <dev/pci/pcivar.h> 49 #include <dev/isa/isavar.h> 50 51 #include <dev/acpi/acpica.h> 52 #include <dev/acpi/acpi_util.h> 53 54 #include <dev/sysmon/sysmonvar.h> 55 56 /* 57 * This structure is used to attach the ACPI "bus". 58 */ 59 struct acpibus_attach_args { 60 bus_space_tag_t aa_iot; /* PCI I/O space tag */ 61 bus_space_tag_t aa_memt; /* PCI MEM space tag */ 62 pci_chipset_tag_t aa_pc; /* PCI chipset */ 63 int aa_pciflags; /* PCI bus flags */ 64 isa_chipset_tag_t aa_ic; /* ISA chipset */ 65 bus_dma_tag_t aa_dmat; /* PCI DMA tag */ 66 bus_dma_tag_t aa_dmat64; /* PCI 64bit DMA tag */ 67 }; 68 69 /* 70 * PCI information for ACPI device nodes that correspond to PCI devices. 71 * 72 * Remarks: 73 * 74 * ap_bus <= 255 75 * ap_device <= 31 76 * ap_function <= 7 or ap_function == 0xFFFF 77 * ap_downbus <= 255 78 * 79 * Validity of some fields depends on the value of ap_flags: 80 * 81 * ap_segment always valid 82 * ap_bus, ap_device, ap_function valid for PCI devices 83 * ap_downbus valid for PCI bridges 84 * 85 * The device and function numbers are encoded in the value returned by 86 * _ADR. A function number of 0xFFFF is used to refer to all the 87 * functions on a PCI device (ACPI 4.0a, p. 200). 88 */ 89 struct acpi_pci_info { 90 pci_chipset_tag_t ap_pc; /* PCI chipset tag */ 91 uint16_t ap_flags; /* Flags (cf. below) */ 92 uint16_t ap_segment; /* PCI segment group */ 93 uint16_t ap_bus; /* PCI bus */ 94 uint16_t ap_device; /* PCI device */ 95 uint16_t ap_function; /* PCI function */ 96 uint16_t ap_downbus; /* PCI bridge downstream bus */ 97 }; 98 99 /* 100 * Flags for PCI information. 101 */ 102 #define ACPI_PCI_INFO_DEVICE __BIT(0) /* PCI device */ 103 #define ACPI_PCI_INFO_BRIDGE __BIT(1) /* PCI bridge */ 104 105 /* Represents a device node dependency. */ 106 struct acpi_devnodedep { 107 SIMPLEQ_ENTRY(acpi_devnodedep) dd_list; 108 struct acpi_devnode *dd_node; 109 }; 110 111 /* 112 * An ACPI device node. 113 * 114 * Remarks: 115 * 116 * ad_device NULL if no device has attached to the node 117 * ad_root never NULL 118 * ad_parent only NULL if root of the tree ("\") 119 * ad_pciinfo NULL if not a PCI device 120 * ad_wakedev NULL if no wakeup capabilities 121 * ad_notify NULL if there is no notify handler 122 * ad_devinfo never NULL 123 * ad_handle never NULL 124 * 125 * Each ACPI device node is associated with its handle. The function 126 * acpi_match_node() can be used to get the node structure from a handle. 127 */ 128 struct acpi_devnode { 129 device_t ad_device; /* Device */ 130 device_t ad_root; /* Backpointer to acpi_softc */ 131 struct acpi_devnode *ad_parent; /* Backpointer to parent */ 132 struct acpi_pci_info *ad_pciinfo; /* PCI info */ 133 struct acpi_wakedev *ad_wakedev; /* Device wake */ 134 ACPI_NOTIFY_HANDLER ad_notify; /* Device notify */ 135 ACPI_DEVICE_INFO *ad_devinfo; /* Device info */ 136 ACPI_HANDLE ad_handle; /* Device handle */ 137 char ad_name[5]; /* Device name */ 138 uint32_t ad_flags; /* Device flags */ 139 uint32_t ad_type; /* Device type */ 140 int ad_state; /* Device power state */ 141 bus_dma_tag_t ad_dmat; /* Bus DMA tag for device */ 142 bus_dma_tag_t ad_dmat64; /* Bus DMA tag for device (64-bit) */ 143 144 device_t ad_gpiodev; /* GPIO controller device */ 145 int (*ad_gpio_translate)(void *, ACPI_RESOURCE_GPIO *, void **); 146 void *ad_gpio_priv; /* private data for translate */ 147 148 SIMPLEQ_ENTRY(acpi_devnode) ad_list; 149 SIMPLEQ_ENTRY(acpi_devnode) ad_child_list; 150 SIMPLEQ_HEAD(, acpi_devnode) ad_child_head; 151 SIMPLEQ_HEAD(, acpi_devnodedep) ad_deps; 152 153 bool ad_scanned; /* private: acpi_rescan state */ 154 }; 155 156 /* 157 * ACPI driver capabilities (ad_flags). 158 */ 159 #define ACPI_DEVICE_POWER __BIT(0) /* Support for D-states */ 160 #define ACPI_DEVICE_WAKEUP __BIT(1) /* Support for wake-up */ 161 #define ACPI_DEVICE_EJECT __BIT(2) /* Support for "ejection" */ 162 #define ACPI_DEVICE_DOCK __BIT(3) /* Support for docking */ 163 164 /* 165 * Software state of the ACPI subsystem. 166 */ 167 struct acpi_softc { 168 device_t sc_dev; /* base device info */ 169 device_t sc_apmbus; /* APM pseudo-bus */ 170 device_t sc_hpet; /* hpet(4) pseudo-bus */ 171 device_t sc_wdrt; /* acpiwdrt(4) pseudo-bus */ 172 173 struct acpi_devnode *sc_root; /* root of the device tree */ 174 175 bus_space_tag_t sc_iot; /* PCI I/O space tag */ 176 bus_space_tag_t sc_memt; /* PCI MEM space tag */ 177 int sc_pciflags; /* PCI bus flags */ 178 int sc_pci_bus; /* internal PCI fixup */ 179 isa_chipset_tag_t sc_ic; /* ISA chipset tag */ 180 bus_dma_tag_t sc_dmat; /* PCI DMA tag */ 181 bus_dma_tag_t sc_dmat64; /* PCI 64bit DMA tag */ 182 183 void *sc_sdhook; /* shutdown hook */ 184 185 int sc_quirks; 186 int sc_sleepstate; 187 int sc_sleepstates; 188 189 struct sysmon_pswitch sc_smpsw_power; 190 struct sysmon_pswitch sc_smpsw_sleep; 191 192 SIMPLEQ_HEAD(, acpi_devnode) sc_head; 193 194 /* 195 * Move this section to the other pseudo-bus child pointers 196 * after pullup -- putting it here avoids potential ABI 197 * compatibility issues with kernel modules. 198 */ 199 device_t sc_apei; /* apei(4) pseudo-bus */ 200 }; 201 202 /* 203 * acpi_attach_args: 204 * 205 * Used to attach a device instance to the acpi "bus". 206 */ 207 struct acpi_attach_args { 208 struct acpi_devnode *aa_node; /* ACPI device node */ 209 bus_space_tag_t aa_iot; /* PCI I/O space tag */ 210 bus_space_tag_t aa_memt; /* PCI MEM space tag */ 211 pci_chipset_tag_t aa_pc; /* PCI chipset tag */ 212 int aa_pciflags; /* PCI bus flags */ 213 isa_chipset_tag_t aa_ic; /* ISA chipset */ 214 bus_dma_tag_t aa_dmat; /* PCI DMA tag */ 215 bus_dma_tag_t aa_dmat64; /* PCI 64bit DMA tag */ 216 }; 217 218 /* ACPI driver matching scores. */ 219 #define ACPI_MATCHSCORE_HID 100 /* matched _HID */ 220 #define ACPI_MATCHSCORE_CID_MAX 49 221 #define ACPI_MATCHSCORE_CID 10 /* matched _CID or _DSD 222 * "compatible" 223 */ 224 #define ACPI_MATCHSCORE_CLS 1 /* matched _CLS */ 225 226 /* 227 * ACPI resources: 228 * 229 * acpi_io I/O ports 230 * acpi_iorange I/O port range 231 * acpi_mem memory region 232 * acpi_memrange memory range 233 * acpi_irq Interrupt Request 234 * acpi_drq DMA request 235 */ 236 struct acpi_io { 237 SIMPLEQ_ENTRY(acpi_io) ar_list; 238 int ar_index; 239 uint32_t ar_base; 240 uint32_t ar_length; 241 }; 242 243 struct acpi_iorange { 244 SIMPLEQ_ENTRY(acpi_iorange) ar_list; 245 int ar_index; 246 uint32_t ar_low; 247 uint32_t ar_high; 248 uint32_t ar_length; 249 uint32_t ar_align; 250 }; 251 252 struct acpi_mem { 253 SIMPLEQ_ENTRY(acpi_mem) ar_list; 254 int ar_index; 255 bus_addr_t ar_base; 256 bus_size_t ar_length; 257 bus_addr_t ar_xbase; /* translated base address */ 258 }; 259 260 struct acpi_memrange { 261 SIMPLEQ_ENTRY(acpi_memrange) ar_list; 262 int ar_index; 263 bus_addr_t ar_low; 264 bus_addr_t ar_high; 265 bus_size_t ar_length; 266 bus_size_t ar_align; 267 }; 268 269 struct acpi_irq { 270 SIMPLEQ_ENTRY(acpi_irq) ar_list; 271 int ar_index; 272 uint32_t ar_irq; 273 uint32_t ar_type; 274 }; 275 276 struct acpi_drq { 277 SIMPLEQ_ENTRY(acpi_drq) ar_list; 278 int ar_index; 279 uint32_t ar_drq; 280 }; 281 282 struct acpi_resources { 283 SIMPLEQ_HEAD(, acpi_io) ar_io; 284 int ar_nio; 285 286 SIMPLEQ_HEAD(, acpi_iorange) ar_iorange; 287 int ar_niorange; 288 289 SIMPLEQ_HEAD(, acpi_mem) ar_mem; 290 int ar_nmem; 291 292 SIMPLEQ_HEAD(, acpi_memrange) ar_memrange; 293 int ar_nmemrange; 294 295 SIMPLEQ_HEAD(, acpi_irq) ar_irq; 296 int ar_nirq; 297 298 SIMPLEQ_HEAD(, acpi_drq) ar_drq; 299 int ar_ndrq; 300 }; 301 302 /* 303 * acpi_resource_parse_ops: 304 * 305 * The client of ACPI resources specifies these operations 306 * when the resources are parsed. 307 */ 308 struct acpi_resource_parse_ops { 309 void (*init)(device_t, void *, void **); 310 void (*fini)(device_t, void *); 311 312 void (*ioport)(device_t, void *, uint32_t, uint32_t); 313 void (*iorange)(device_t, void *, uint32_t, uint32_t, 314 uint32_t, uint32_t); 315 316 void (*memory)(device_t, void *, uint64_t, uint64_t, uint64_t); 317 void (*memrange)(device_t, void *, uint64_t, uint64_t, 318 uint64_t, uint64_t); 319 320 void (*irq)(device_t, void *, uint32_t, uint32_t); 321 void (*drq)(device_t, void *, uint32_t); 322 323 void (*start_dep)(device_t, void *, int); 324 void (*end_dep)(device_t, void *); 325 }; 326 327 extern struct acpi_softc *acpi_softc; 328 extern int acpi_active; 329 330 extern const struct acpi_resource_parse_ops acpi_resource_parse_ops_default; 331 extern const struct acpi_resource_parse_ops acpi_resource_parse_ops_quiet; 332 333 int acpi_probe(void); 334 void acpi_disable(void); 335 int acpi_check(device_t, const char *); 336 337 int acpi_compatible_match(const struct acpi_attach_args *, 338 const struct device_compatible_entry *); 339 const struct device_compatible_entry * 340 acpi_compatible_lookup(const struct acpi_attach_args *, 341 const struct device_compatible_entry *); 342 343 bool acpi_device_present(ACPI_HANDLE); 344 345 int acpi_reset(void); 346 347 ACPI_PHYSICAL_ADDRESS acpi_OsGetRootPointer(void); 348 349 bool acpi_register_notify(struct acpi_devnode *, 350 ACPI_NOTIFY_HANDLER); 351 void acpi_deregister_notify(struct acpi_devnode *); 352 353 ACPI_STATUS acpi_resource_parse(device_t, ACPI_HANDLE, const char *, 354 void *, const struct acpi_resource_parse_ops *); 355 ACPI_STATUS acpi_resource_parse_any(device_t, ACPI_HANDLE, const char *, 356 void *, const struct acpi_resource_parse_ops *); 357 void acpi_resource_print(device_t, struct acpi_resources *); 358 void acpi_resource_cleanup(struct acpi_resources *); 359 360 void * acpi_pci_link_devbyhandle(ACPI_HANDLE); 361 void acpi_pci_link_add_reference(void *, pci_chipset_tag_t, int, 362 int, int, int); 363 int acpi_pci_link_route_interrupt(void *, pci_chipset_tag_t, int, 364 int *, int *, int *); 365 char * acpi_pci_link_name(void *); 366 ACPI_HANDLE acpi_pci_link_handle(void *); 367 void acpi_pci_link_state(void); 368 void acpi_pci_link_resume(void); 369 370 struct acpi_io *acpi_res_io(struct acpi_resources *, int); 371 struct acpi_iorange *acpi_res_iorange(struct acpi_resources *, int); 372 struct acpi_mem *acpi_res_mem(struct acpi_resources *, int); 373 struct acpi_memrange *acpi_res_memrange(struct acpi_resources *, int); 374 struct acpi_irq *acpi_res_irq(struct acpi_resources *, int); 375 struct acpi_drq *acpi_res_drq(struct acpi_resources *, int); 376 377 /* 378 * Sleep state transition. 379 */ 380 void acpi_enter_sleep_state(int); 381 382 /* 383 * MADT. 384 */ 385 #define ACPI_PLATFORM_INT_PMI 1 386 #define ACPI_PLATFORM_INT_INIT 2 387 #define ACPI_PLATFORM_INT_CERR 3 388 389 ACPI_STATUS acpi_madt_map(void); 390 void acpi_madt_unmap(void); 391 void acpi_madt_walk(ACPI_STATUS (*)(ACPI_SUBTABLE_HEADER *, 392 void *), void *); 393 394 /* 395 * GTDT. 396 */ 397 ACPI_STATUS acpi_gtdt_map(void); 398 void acpi_gtdt_unmap(void); 399 void acpi_gtdt_walk(ACPI_STATUS (*)(ACPI_GTDT_HEADER *, 400 void *), void *); 401 402 /* 403 * Quirk handling. 404 */ 405 struct acpi_quirk { 406 const char *aq_tabletype; /* Type of table */ 407 const char *aq_oemid; /* "OemId" field */ 408 int aq_oemrev; /* "OemRev" field */ 409 int aq_cmpop; /* "OemRev" comparison */ 410 const char *aq_tabid; /* "TableId */ 411 int aq_quirks; /* The actual quirk */ 412 }; 413 414 #define ACPI_QUIRK_BROKEN 0x00000001 /* totally broken */ 415 #define ACPI_QUIRK_BADPCI 0x00000002 /* bad PCI hierarchy */ 416 #define ACPI_QUIRK_BADBBN 0x00000004 /* _BBN broken */ 417 #define ACPI_QUIRK_IRQ0 0x00000008 /* bad 0->2 irq override */ 418 #define ACPI_QUIRK_OLDBIOS 0x00000010 /* BIOS date blacklisted */ 419 420 int acpi_find_quirks(void); 421 422 #ifdef ACPI_DEBUG 423 void acpi_debug_init(void); 424 #endif 425 426 bus_dma_tag_t acpi_get_dma_tag(struct acpi_softc *, struct acpi_devnode *); 427 bus_dma_tag_t acpi_get_dma64_tag(struct acpi_softc *, struct acpi_devnode *); 428 pci_chipset_tag_t acpi_get_pci_chipset_tag(struct acpi_softc *, int, int); 429 430 /* 431 * Misc routines with vectors updated by acpiverbose module. 432 */ 433 extern void (*acpi_print_verbose)(struct acpi_softc *); 434 extern void (*acpi_print_dev)(const char *); 435 436 void acpi_load_verbose(void); 437 extern int acpi_verbose_loaded; 438 439 #endif /* !_SYS_DEV_ACPI_ACPIVAR_H */ 440