evgpeblk.c 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180
  1. /******************************************************************************
  2. *
  3. * Module Name: evgpeblk - GPE block creation and initialization.
  4. *
  5. *****************************************************************************/
  6. /*
  7. * Copyright (C) 2000 - 2005, R. Byron Moore
  8. * All rights reserved.
  9. *
  10. * Redistribution and use in source and binary forms, with or without
  11. * modification, are permitted provided that the following conditions
  12. * are met:
  13. * 1. Redistributions of source code must retain the above copyright
  14. * notice, this list of conditions, and the following disclaimer,
  15. * without modification.
  16. * 2. Redistributions in binary form must reproduce at minimum a disclaimer
  17. * substantially similar to the "NO WARRANTY" disclaimer below
  18. * ("Disclaimer") and any redistribution must be conditioned upon
  19. * including a substantially similar Disclaimer requirement for further
  20. * binary redistribution.
  21. * 3. Neither the names of the above-listed copyright holders nor the names
  22. * of any contributors may be used to endorse or promote products derived
  23. * from this software without specific prior written permission.
  24. *
  25. * Alternatively, this software may be distributed under the terms of the
  26. * GNU General Public License ("GPL") version 2 as published by the Free
  27. * Software Foundation.
  28. *
  29. * NO WARRANTY
  30. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  31. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  32. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
  33. * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  34. * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  35. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  36. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  37. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  38. * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
  39. * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  40. * POSSIBILITY OF SUCH DAMAGES.
  41. */
  42. #include <acpi/acpi.h>
  43. #include <acpi/acevents.h>
  44. #include <acpi/acnamesp.h>
  45. #define _COMPONENT ACPI_EVENTS
  46. ACPI_MODULE_NAME ("evgpeblk")
  47. /* Local prototypes */
  48. static acpi_status
  49. acpi_ev_save_method_info (
  50. acpi_handle obj_handle,
  51. u32 level,
  52. void *obj_desc,
  53. void **return_value);
  54. static acpi_status
  55. acpi_ev_match_prw_and_gpe (
  56. acpi_handle obj_handle,
  57. u32 level,
  58. void *info,
  59. void **return_value);
  60. static struct acpi_gpe_xrupt_info *
  61. acpi_ev_get_gpe_xrupt_block (
  62. u32 interrupt_number);
  63. static acpi_status
  64. acpi_ev_delete_gpe_xrupt (
  65. struct acpi_gpe_xrupt_info *gpe_xrupt);
  66. static acpi_status
  67. acpi_ev_install_gpe_block (
  68. struct acpi_gpe_block_info *gpe_block,
  69. u32 interrupt_number);
  70. static acpi_status
  71. acpi_ev_create_gpe_info_blocks (
  72. struct acpi_gpe_block_info *gpe_block);
  73. /*******************************************************************************
  74. *
  75. * FUNCTION: acpi_ev_valid_gpe_event
  76. *
  77. * PARAMETERS: gpe_event_info - Info for this GPE
  78. *
  79. * RETURN: TRUE if the gpe_event is valid
  80. *
  81. * DESCRIPTION: Validate a GPE event. DO NOT CALL FROM INTERRUPT LEVEL.
  82. * Should be called only when the GPE lists are semaphore locked
  83. * and not subject to change.
  84. *
  85. ******************************************************************************/
  86. u8
  87. acpi_ev_valid_gpe_event (
  88. struct acpi_gpe_event_info *gpe_event_info)
  89. {
  90. struct acpi_gpe_xrupt_info *gpe_xrupt_block;
  91. struct acpi_gpe_block_info *gpe_block;
  92. ACPI_FUNCTION_ENTRY ();
  93. /* No need for spin lock since we are not changing any list elements */
  94. /* Walk the GPE interrupt levels */
  95. gpe_xrupt_block = acpi_gbl_gpe_xrupt_list_head;
  96. while (gpe_xrupt_block) {
  97. gpe_block = gpe_xrupt_block->gpe_block_list_head;
  98. /* Walk the GPE blocks on this interrupt level */
  99. while (gpe_block) {
  100. if ((&gpe_block->event_info[0] <= gpe_event_info) &&
  101. (&gpe_block->event_info[((acpi_size) gpe_block->register_count) * 8] > gpe_event_info)) {
  102. return (TRUE);
  103. }
  104. gpe_block = gpe_block->next;
  105. }
  106. gpe_xrupt_block = gpe_xrupt_block->next;
  107. }
  108. return (FALSE);
  109. }
  110. /*******************************************************************************
  111. *
  112. * FUNCTION: acpi_ev_walk_gpe_list
  113. *
  114. * PARAMETERS: gpe_walk_callback - Routine called for each GPE block
  115. * Flags - ACPI_NOT_ISR or ACPI_ISR
  116. *
  117. * RETURN: Status
  118. *
  119. * DESCRIPTION: Walk the GPE lists.
  120. *
  121. ******************************************************************************/
  122. acpi_status
  123. acpi_ev_walk_gpe_list (
  124. ACPI_GPE_CALLBACK gpe_walk_callback,
  125. u32 flags)
  126. {
  127. struct acpi_gpe_block_info *gpe_block;
  128. struct acpi_gpe_xrupt_info *gpe_xrupt_info;
  129. acpi_status status = AE_OK;
  130. ACPI_FUNCTION_TRACE ("ev_walk_gpe_list");
  131. acpi_os_acquire_lock (acpi_gbl_gpe_lock, flags);
  132. /* Walk the interrupt level descriptor list */
  133. gpe_xrupt_info = acpi_gbl_gpe_xrupt_list_head;
  134. while (gpe_xrupt_info) {
  135. /* Walk all Gpe Blocks attached to this interrupt level */
  136. gpe_block = gpe_xrupt_info->gpe_block_list_head;
  137. while (gpe_block) {
  138. /* One callback per GPE block */
  139. status = gpe_walk_callback (gpe_xrupt_info, gpe_block);
  140. if (ACPI_FAILURE (status)) {
  141. goto unlock_and_exit;
  142. }
  143. gpe_block = gpe_block->next;
  144. }
  145. gpe_xrupt_info = gpe_xrupt_info->next;
  146. }
  147. unlock_and_exit:
  148. acpi_os_release_lock (acpi_gbl_gpe_lock, flags);
  149. return_ACPI_STATUS (status);
  150. }
  151. /*******************************************************************************
  152. *
  153. * FUNCTION: acpi_ev_delete_gpe_handlers
  154. *
  155. * PARAMETERS: gpe_xrupt_info - GPE Interrupt info
  156. * gpe_block - Gpe Block info
  157. *
  158. * RETURN: Status
  159. *
  160. * DESCRIPTION: Delete all Handler objects found in the GPE data structs.
  161. * Used only prior to termination.
  162. *
  163. ******************************************************************************/
  164. acpi_status
  165. acpi_ev_delete_gpe_handlers (
  166. struct acpi_gpe_xrupt_info *gpe_xrupt_info,
  167. struct acpi_gpe_block_info *gpe_block)
  168. {
  169. struct acpi_gpe_event_info *gpe_event_info;
  170. acpi_native_uint i;
  171. acpi_native_uint j;
  172. ACPI_FUNCTION_TRACE ("ev_delete_gpe_handlers");
  173. /* Examine each GPE Register within the block */
  174. for (i = 0; i < gpe_block->register_count; i++) {
  175. /* Now look at the individual GPEs in this byte register */
  176. for (j = 0; j < ACPI_GPE_REGISTER_WIDTH; j++) {
  177. gpe_event_info = &gpe_block->event_info[(i * ACPI_GPE_REGISTER_WIDTH) + j];
  178. if ((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) ==
  179. ACPI_GPE_DISPATCH_HANDLER) {
  180. ACPI_MEM_FREE (gpe_event_info->dispatch.handler);
  181. gpe_event_info->dispatch.handler = NULL;
  182. gpe_event_info->flags &= ~ACPI_GPE_DISPATCH_MASK;
  183. }
  184. }
  185. }
  186. return_ACPI_STATUS (AE_OK);
  187. }
  188. /*******************************************************************************
  189. *
  190. * FUNCTION: acpi_ev_save_method_info
  191. *
  192. * PARAMETERS: Callback from walk_namespace
  193. *
  194. * RETURN: Status
  195. *
  196. * DESCRIPTION: Called from acpi_walk_namespace. Expects each object to be a
  197. * control method under the _GPE portion of the namespace.
  198. * Extract the name and GPE type from the object, saving this
  199. * information for quick lookup during GPE dispatch
  200. *
  201. * The name of each GPE control method is of the form:
  202. * "_Lxx" or "_Exx"
  203. * Where:
  204. * L - means that the GPE is level triggered
  205. * E - means that the GPE is edge triggered
  206. * xx - is the GPE number [in HEX]
  207. *
  208. ******************************************************************************/
  209. static acpi_status
  210. acpi_ev_save_method_info (
  211. acpi_handle obj_handle,
  212. u32 level,
  213. void *obj_desc,
  214. void **return_value)
  215. {
  216. struct acpi_gpe_block_info *gpe_block = (void *) obj_desc;
  217. struct acpi_gpe_event_info *gpe_event_info;
  218. u32 gpe_number;
  219. char name[ACPI_NAME_SIZE + 1];
  220. u8 type;
  221. acpi_status status;
  222. ACPI_FUNCTION_TRACE ("ev_save_method_info");
  223. /*
  224. * _Lxx and _Exx GPE method support
  225. *
  226. * 1) Extract the name from the object and convert to a string
  227. */
  228. ACPI_MOVE_32_TO_32 (name,
  229. &((struct acpi_namespace_node *) obj_handle)->name.integer);
  230. name[ACPI_NAME_SIZE] = 0;
  231. /*
  232. * 2) Edge/Level determination is based on the 2nd character
  233. * of the method name
  234. *
  235. * NOTE: Default GPE type is RUNTIME. May be changed later to WAKE
  236. * if a _PRW object is found that points to this GPE.
  237. */
  238. switch (name[1]) {
  239. case 'L':
  240. type = ACPI_GPE_LEVEL_TRIGGERED;
  241. break;
  242. case 'E':
  243. type = ACPI_GPE_EDGE_TRIGGERED;
  244. break;
  245. default:
  246. /* Unknown method type, just ignore it! */
  247. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
  248. "Unknown GPE method type: %s (name not of form _Lxx or _Exx)\n",
  249. name));
  250. return_ACPI_STATUS (AE_OK);
  251. }
  252. /* Convert the last two characters of the name to the GPE Number */
  253. gpe_number = ACPI_STRTOUL (&name[2], NULL, 16);
  254. if (gpe_number == ACPI_UINT32_MAX) {
  255. /* Conversion failed; invalid method, just ignore it */
  256. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
  257. "Could not extract GPE number from name: %s (name is not of form _Lxx or _Exx)\n",
  258. name));
  259. return_ACPI_STATUS (AE_OK);
  260. }
  261. /* Ensure that we have a valid GPE number for this GPE block */
  262. if ((gpe_number < gpe_block->block_base_number) ||
  263. (gpe_number >= (gpe_block->block_base_number + (gpe_block->register_count * 8)))) {
  264. /*
  265. * Not valid for this GPE block, just ignore it
  266. * However, it may be valid for a different GPE block, since GPE0 and GPE1
  267. * methods both appear under \_GPE.
  268. */
  269. return_ACPI_STATUS (AE_OK);
  270. }
  271. /*
  272. * Now we can add this information to the gpe_event_info block
  273. * for use during dispatch of this GPE. Default type is RUNTIME, although
  274. * this may change when the _PRW methods are executed later.
  275. */
  276. gpe_event_info = &gpe_block->event_info[gpe_number - gpe_block->block_base_number];
  277. gpe_event_info->flags = (u8) (type | ACPI_GPE_DISPATCH_METHOD |
  278. ACPI_GPE_TYPE_RUNTIME);
  279. gpe_event_info->dispatch.method_node = (struct acpi_namespace_node *) obj_handle;
  280. /* Update enable mask, but don't enable the HW GPE as of yet */
  281. status = acpi_ev_enable_gpe (gpe_event_info, FALSE);
  282. ACPI_DEBUG_PRINT ((ACPI_DB_LOAD,
  283. "Registered GPE method %s as GPE number 0x%.2X\n",
  284. name, gpe_number));
  285. return_ACPI_STATUS (status);
  286. }
  287. /*******************************************************************************
  288. *
  289. * FUNCTION: acpi_ev_match_prw_and_gpe
  290. *
  291. * PARAMETERS: Callback from walk_namespace
  292. *
  293. * RETURN: Status. NOTE: We ignore errors so that the _PRW walk is
  294. * not aborted on a single _PRW failure.
  295. *
  296. * DESCRIPTION: Called from acpi_walk_namespace. Expects each object to be a
  297. * Device. Run the _PRW method. If present, extract the GPE
  298. * number and mark the GPE as a WAKE GPE.
  299. *
  300. ******************************************************************************/
  301. static acpi_status
  302. acpi_ev_match_prw_and_gpe (
  303. acpi_handle obj_handle,
  304. u32 level,
  305. void *info,
  306. void **return_value)
  307. {
  308. struct acpi_gpe_walk_info *gpe_info = (void *) info;
  309. struct acpi_namespace_node *gpe_device;
  310. struct acpi_gpe_block_info *gpe_block;
  311. struct acpi_namespace_node *target_gpe_device;
  312. struct acpi_gpe_event_info *gpe_event_info;
  313. union acpi_operand_object *pkg_desc;
  314. union acpi_operand_object *obj_desc;
  315. u32 gpe_number;
  316. acpi_status status;
  317. ACPI_FUNCTION_TRACE ("ev_match_prw_and_gpe");
  318. /* Check for a _PRW method under this device */
  319. status = acpi_ut_evaluate_object (obj_handle, METHOD_NAME__PRW,
  320. ACPI_BTYPE_PACKAGE, &pkg_desc);
  321. if (ACPI_FAILURE (status)) {
  322. /* Ignore all errors from _PRW, we don't want to abort the subsystem */
  323. return_ACPI_STATUS (AE_OK);
  324. }
  325. /* The returned _PRW package must have at least two elements */
  326. if (pkg_desc->package.count < 2) {
  327. goto cleanup;
  328. }
  329. /* Extract pointers from the input context */
  330. gpe_device = gpe_info->gpe_device;
  331. gpe_block = gpe_info->gpe_block;
  332. /*
  333. * The _PRW object must return a package, we are only interested
  334. * in the first element
  335. */
  336. obj_desc = pkg_desc->package.elements[0];
  337. if (ACPI_GET_OBJECT_TYPE (obj_desc) == ACPI_TYPE_INTEGER) {
  338. /* Use FADT-defined GPE device (from definition of _PRW) */
  339. target_gpe_device = acpi_gbl_fadt_gpe_device;
  340. /* Integer is the GPE number in the FADT described GPE blocks */
  341. gpe_number = (u32) obj_desc->integer.value;
  342. }
  343. else if (ACPI_GET_OBJECT_TYPE (obj_desc) == ACPI_TYPE_PACKAGE) {
  344. /* Package contains a GPE reference and GPE number within a GPE block */
  345. if ((obj_desc->package.count < 2) ||
  346. (ACPI_GET_OBJECT_TYPE (obj_desc->package.elements[0]) != ACPI_TYPE_LOCAL_REFERENCE) ||
  347. (ACPI_GET_OBJECT_TYPE (obj_desc->package.elements[1]) != ACPI_TYPE_INTEGER)) {
  348. goto cleanup;
  349. }
  350. /* Get GPE block reference and decode */
  351. target_gpe_device = obj_desc->package.elements[0]->reference.node;
  352. gpe_number = (u32) obj_desc->package.elements[1]->integer.value;
  353. }
  354. else {
  355. /* Unknown type, just ignore it */
  356. goto cleanup;
  357. }
  358. /*
  359. * Is this GPE within this block?
  360. *
  361. * TRUE iff these conditions are true:
  362. * 1) The GPE devices match.
  363. * 2) The GPE index(number) is within the range of the Gpe Block
  364. * associated with the GPE device.
  365. */
  366. if ((gpe_device == target_gpe_device) &&
  367. (gpe_number >= gpe_block->block_base_number) &&
  368. (gpe_number < gpe_block->block_base_number + (gpe_block->register_count * 8))) {
  369. gpe_event_info = &gpe_block->event_info[gpe_number - gpe_block->block_base_number];
  370. /* Mark GPE for WAKE-ONLY but WAKE_DISABLED */
  371. gpe_event_info->flags &= ~(ACPI_GPE_WAKE_ENABLED | ACPI_GPE_RUN_ENABLED);
  372. status = acpi_ev_set_gpe_type (gpe_event_info, ACPI_GPE_TYPE_WAKE);
  373. if (ACPI_FAILURE (status)) {
  374. goto cleanup;
  375. }
  376. status = acpi_ev_update_gpe_enable_masks (gpe_event_info, ACPI_GPE_DISABLE);
  377. }
  378. cleanup:
  379. acpi_ut_remove_reference (pkg_desc);
  380. return_ACPI_STATUS (AE_OK);
  381. }
  382. /*******************************************************************************
  383. *
  384. * FUNCTION: acpi_ev_get_gpe_xrupt_block
  385. *
  386. * PARAMETERS: interrupt_number - Interrupt for a GPE block
  387. *
  388. * RETURN: A GPE interrupt block
  389. *
  390. * DESCRIPTION: Get or Create a GPE interrupt block. There is one interrupt
  391. * block per unique interrupt level used for GPEs.
  392. * Should be called only when the GPE lists are semaphore locked
  393. * and not subject to change.
  394. *
  395. ******************************************************************************/
  396. static struct acpi_gpe_xrupt_info *
  397. acpi_ev_get_gpe_xrupt_block (
  398. u32 interrupt_number)
  399. {
  400. struct acpi_gpe_xrupt_info *next_gpe_xrupt;
  401. struct acpi_gpe_xrupt_info *gpe_xrupt;
  402. acpi_status status;
  403. ACPI_FUNCTION_TRACE ("ev_get_gpe_xrupt_block");
  404. /* No need for lock since we are not changing any list elements here */
  405. next_gpe_xrupt = acpi_gbl_gpe_xrupt_list_head;
  406. while (next_gpe_xrupt) {
  407. if (next_gpe_xrupt->interrupt_number == interrupt_number) {
  408. return_PTR (next_gpe_xrupt);
  409. }
  410. next_gpe_xrupt = next_gpe_xrupt->next;
  411. }
  412. /* Not found, must allocate a new xrupt descriptor */
  413. gpe_xrupt = ACPI_MEM_CALLOCATE (sizeof (struct acpi_gpe_xrupt_info));
  414. if (!gpe_xrupt) {
  415. return_PTR (NULL);
  416. }
  417. gpe_xrupt->interrupt_number = interrupt_number;
  418. /* Install new interrupt descriptor with spin lock */
  419. acpi_os_acquire_lock (acpi_gbl_gpe_lock, ACPI_NOT_ISR);
  420. if (acpi_gbl_gpe_xrupt_list_head) {
  421. next_gpe_xrupt = acpi_gbl_gpe_xrupt_list_head;
  422. while (next_gpe_xrupt->next) {
  423. next_gpe_xrupt = next_gpe_xrupt->next;
  424. }
  425. next_gpe_xrupt->next = gpe_xrupt;
  426. gpe_xrupt->previous = next_gpe_xrupt;
  427. }
  428. else {
  429. acpi_gbl_gpe_xrupt_list_head = gpe_xrupt;
  430. }
  431. acpi_os_release_lock (acpi_gbl_gpe_lock, ACPI_NOT_ISR);
  432. /* Install new interrupt handler if not SCI_INT */
  433. if (interrupt_number != acpi_gbl_FADT->sci_int) {
  434. status = acpi_os_install_interrupt_handler (interrupt_number,
  435. acpi_ev_gpe_xrupt_handler, gpe_xrupt);
  436. if (ACPI_FAILURE (status)) {
  437. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
  438. "Could not install GPE interrupt handler at level 0x%X\n",
  439. interrupt_number));
  440. return_PTR (NULL);
  441. }
  442. }
  443. return_PTR (gpe_xrupt);
  444. }
  445. /*******************************************************************************
  446. *
  447. * FUNCTION: acpi_ev_delete_gpe_xrupt
  448. *
  449. * PARAMETERS: gpe_xrupt - A GPE interrupt info block
  450. *
  451. * RETURN: Status
  452. *
  453. * DESCRIPTION: Remove and free a gpe_xrupt block. Remove an associated
  454. * interrupt handler if not the SCI interrupt.
  455. *
  456. ******************************************************************************/
  457. static acpi_status
  458. acpi_ev_delete_gpe_xrupt (
  459. struct acpi_gpe_xrupt_info *gpe_xrupt)
  460. {
  461. acpi_status status;
  462. ACPI_FUNCTION_TRACE ("ev_delete_gpe_xrupt");
  463. /* We never want to remove the SCI interrupt handler */
  464. if (gpe_xrupt->interrupt_number == acpi_gbl_FADT->sci_int) {
  465. gpe_xrupt->gpe_block_list_head = NULL;
  466. return_ACPI_STATUS (AE_OK);
  467. }
  468. /* Disable this interrupt */
  469. status = acpi_os_remove_interrupt_handler (gpe_xrupt->interrupt_number,
  470. acpi_ev_gpe_xrupt_handler);
  471. if (ACPI_FAILURE (status)) {
  472. return_ACPI_STATUS (status);
  473. }
  474. /* Unlink the interrupt block with lock */
  475. acpi_os_acquire_lock (acpi_gbl_gpe_lock, ACPI_NOT_ISR);
  476. if (gpe_xrupt->previous) {
  477. gpe_xrupt->previous->next = gpe_xrupt->next;
  478. }
  479. if (gpe_xrupt->next) {
  480. gpe_xrupt->next->previous = gpe_xrupt->previous;
  481. }
  482. acpi_os_release_lock (acpi_gbl_gpe_lock, ACPI_NOT_ISR);
  483. /* Free the block */
  484. ACPI_MEM_FREE (gpe_xrupt);
  485. return_ACPI_STATUS (AE_OK);
  486. }
  487. /*******************************************************************************
  488. *
  489. * FUNCTION: acpi_ev_install_gpe_block
  490. *
  491. * PARAMETERS: gpe_block - New GPE block
  492. * interrupt_number - Xrupt to be associated with this GPE block
  493. *
  494. * RETURN: Status
  495. *
  496. * DESCRIPTION: Install new GPE block with mutex support
  497. *
  498. ******************************************************************************/
  499. static acpi_status
  500. acpi_ev_install_gpe_block (
  501. struct acpi_gpe_block_info *gpe_block,
  502. u32 interrupt_number)
  503. {
  504. struct acpi_gpe_block_info *next_gpe_block;
  505. struct acpi_gpe_xrupt_info *gpe_xrupt_block;
  506. acpi_status status;
  507. ACPI_FUNCTION_TRACE ("ev_install_gpe_block");
  508. status = acpi_ut_acquire_mutex (ACPI_MTX_EVENTS);
  509. if (ACPI_FAILURE (status)) {
  510. return_ACPI_STATUS (status);
  511. }
  512. gpe_xrupt_block = acpi_ev_get_gpe_xrupt_block (interrupt_number);
  513. if (!gpe_xrupt_block) {
  514. status = AE_NO_MEMORY;
  515. goto unlock_and_exit;
  516. }
  517. /* Install the new block at the end of the list with lock */
  518. acpi_os_acquire_lock (acpi_gbl_gpe_lock, ACPI_NOT_ISR);
  519. if (gpe_xrupt_block->gpe_block_list_head) {
  520. next_gpe_block = gpe_xrupt_block->gpe_block_list_head;
  521. while (next_gpe_block->next) {
  522. next_gpe_block = next_gpe_block->next;
  523. }
  524. next_gpe_block->next = gpe_block;
  525. gpe_block->previous = next_gpe_block;
  526. }
  527. else {
  528. gpe_xrupt_block->gpe_block_list_head = gpe_block;
  529. }
  530. gpe_block->xrupt_block = gpe_xrupt_block;
  531. acpi_os_release_lock (acpi_gbl_gpe_lock, ACPI_NOT_ISR);
  532. unlock_and_exit:
  533. status = acpi_ut_release_mutex (ACPI_MTX_EVENTS);
  534. return_ACPI_STATUS (status);
  535. }
  536. /*******************************************************************************
  537. *
  538. * FUNCTION: acpi_ev_delete_gpe_block
  539. *
  540. * PARAMETERS: gpe_block - Existing GPE block
  541. *
  542. * RETURN: Status
  543. *
  544. * DESCRIPTION: Remove a GPE block
  545. *
  546. ******************************************************************************/
  547. acpi_status
  548. acpi_ev_delete_gpe_block (
  549. struct acpi_gpe_block_info *gpe_block)
  550. {
  551. acpi_status status;
  552. ACPI_FUNCTION_TRACE ("ev_install_gpe_block");
  553. status = acpi_ut_acquire_mutex (ACPI_MTX_EVENTS);
  554. if (ACPI_FAILURE (status)) {
  555. return_ACPI_STATUS (status);
  556. }
  557. /* Disable all GPEs in this block */
  558. status = acpi_hw_disable_gpe_block (gpe_block->xrupt_block, gpe_block);
  559. if (!gpe_block->previous && !gpe_block->next) {
  560. /* This is the last gpe_block on this interrupt */
  561. status = acpi_ev_delete_gpe_xrupt (gpe_block->xrupt_block);
  562. if (ACPI_FAILURE (status)) {
  563. goto unlock_and_exit;
  564. }
  565. }
  566. else {
  567. /* Remove the block on this interrupt with lock */
  568. acpi_os_acquire_lock (acpi_gbl_gpe_lock, ACPI_NOT_ISR);
  569. if (gpe_block->previous) {
  570. gpe_block->previous->next = gpe_block->next;
  571. }
  572. else {
  573. gpe_block->xrupt_block->gpe_block_list_head = gpe_block->next;
  574. }
  575. if (gpe_block->next) {
  576. gpe_block->next->previous = gpe_block->previous;
  577. }
  578. acpi_os_release_lock (acpi_gbl_gpe_lock, ACPI_NOT_ISR);
  579. }
  580. /* Free the gpe_block */
  581. ACPI_MEM_FREE (gpe_block->register_info);
  582. ACPI_MEM_FREE (gpe_block->event_info);
  583. ACPI_MEM_FREE (gpe_block);
  584. unlock_and_exit:
  585. status = acpi_ut_release_mutex (ACPI_MTX_EVENTS);
  586. return_ACPI_STATUS (status);
  587. }
  588. /*******************************************************************************
  589. *
  590. * FUNCTION: acpi_ev_create_gpe_info_blocks
  591. *
  592. * PARAMETERS: gpe_block - New GPE block
  593. *
  594. * RETURN: Status
  595. *
  596. * DESCRIPTION: Create the register_info and event_info blocks for this GPE block
  597. *
  598. ******************************************************************************/
  599. static acpi_status
  600. acpi_ev_create_gpe_info_blocks (
  601. struct acpi_gpe_block_info *gpe_block)
  602. {
  603. struct acpi_gpe_register_info *gpe_register_info = NULL;
  604. struct acpi_gpe_event_info *gpe_event_info = NULL;
  605. struct acpi_gpe_event_info *this_event;
  606. struct acpi_gpe_register_info *this_register;
  607. acpi_native_uint i;
  608. acpi_native_uint j;
  609. acpi_status status;
  610. ACPI_FUNCTION_TRACE ("ev_create_gpe_info_blocks");
  611. /* Allocate the GPE register information block */
  612. gpe_register_info = ACPI_MEM_CALLOCATE (
  613. (acpi_size) gpe_block->register_count *
  614. sizeof (struct acpi_gpe_register_info));
  615. if (!gpe_register_info) {
  616. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
  617. "Could not allocate the gpe_register_info table\n"));
  618. return_ACPI_STATUS (AE_NO_MEMORY);
  619. }
  620. /*
  621. * Allocate the GPE event_info block. There are eight distinct GPEs
  622. * per register. Initialization to zeros is sufficient.
  623. */
  624. gpe_event_info = ACPI_MEM_CALLOCATE (
  625. ((acpi_size) gpe_block->register_count *
  626. ACPI_GPE_REGISTER_WIDTH) *
  627. sizeof (struct acpi_gpe_event_info));
  628. if (!gpe_event_info) {
  629. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
  630. "Could not allocate the gpe_event_info table\n"));
  631. status = AE_NO_MEMORY;
  632. goto error_exit;
  633. }
  634. /* Save the new Info arrays in the GPE block */
  635. gpe_block->register_info = gpe_register_info;
  636. gpe_block->event_info = gpe_event_info;
  637. /*
  638. * Initialize the GPE Register and Event structures. A goal of these
  639. * tables is to hide the fact that there are two separate GPE register sets
  640. * in a given gpe hardware block, the status registers occupy the first half,
  641. * and the enable registers occupy the second half.
  642. */
  643. this_register = gpe_register_info;
  644. this_event = gpe_event_info;
  645. for (i = 0; i < gpe_block->register_count; i++) {
  646. /* Init the register_info for this GPE register (8 GPEs) */
  647. this_register->base_gpe_number = (u8) (gpe_block->block_base_number +
  648. (i * ACPI_GPE_REGISTER_WIDTH));
  649. ACPI_STORE_ADDRESS (this_register->status_address.address,
  650. (gpe_block->block_address.address
  651. + i));
  652. ACPI_STORE_ADDRESS (this_register->enable_address.address,
  653. (gpe_block->block_address.address
  654. + i
  655. + gpe_block->register_count));
  656. this_register->status_address.address_space_id = gpe_block->block_address.address_space_id;
  657. this_register->enable_address.address_space_id = gpe_block->block_address.address_space_id;
  658. this_register->status_address.register_bit_width = ACPI_GPE_REGISTER_WIDTH;
  659. this_register->enable_address.register_bit_width = ACPI_GPE_REGISTER_WIDTH;
  660. this_register->status_address.register_bit_offset = ACPI_GPE_REGISTER_WIDTH;
  661. this_register->enable_address.register_bit_offset = ACPI_GPE_REGISTER_WIDTH;
  662. /* Init the event_info for each GPE within this register */
  663. for (j = 0; j < ACPI_GPE_REGISTER_WIDTH; j++) {
  664. this_event->register_bit = acpi_gbl_decode_to8bit[j];
  665. this_event->register_info = this_register;
  666. this_event++;
  667. }
  668. /*
  669. * Clear the status/enable registers. Note that status registers
  670. * are cleared by writing a '1', while enable registers are cleared
  671. * by writing a '0'.
  672. */
  673. status = acpi_hw_low_level_write (ACPI_GPE_REGISTER_WIDTH, 0x00,
  674. &this_register->enable_address);
  675. if (ACPI_FAILURE (status)) {
  676. goto error_exit;
  677. }
  678. status = acpi_hw_low_level_write (ACPI_GPE_REGISTER_WIDTH, 0xFF,
  679. &this_register->status_address);
  680. if (ACPI_FAILURE (status)) {
  681. goto error_exit;
  682. }
  683. this_register++;
  684. }
  685. return_ACPI_STATUS (AE_OK);
  686. error_exit:
  687. if (gpe_register_info) {
  688. ACPI_MEM_FREE (gpe_register_info);
  689. }
  690. if (gpe_event_info) {
  691. ACPI_MEM_FREE (gpe_event_info);
  692. }
  693. return_ACPI_STATUS (status);
  694. }
  695. /*******************************************************************************
  696. *
  697. * FUNCTION: acpi_ev_create_gpe_block
  698. *
  699. * PARAMETERS: gpe_device - Handle to the parent GPE block
  700. * gpe_block_address - Address and space_iD
  701. * register_count - Number of GPE register pairs in the block
  702. * gpe_block_base_number - Starting GPE number for the block
  703. * interrupt_number - H/W interrupt for the block
  704. * return_gpe_block - Where the new block descriptor is returned
  705. *
  706. * RETURN: Status
  707. *
  708. * DESCRIPTION: Create and Install a block of GPE registers
  709. *
  710. ******************************************************************************/
  711. acpi_status
  712. acpi_ev_create_gpe_block (
  713. struct acpi_namespace_node *gpe_device,
  714. struct acpi_generic_address *gpe_block_address,
  715. u32 register_count,
  716. u8 gpe_block_base_number,
  717. u32 interrupt_number,
  718. struct acpi_gpe_block_info **return_gpe_block)
  719. {
  720. struct acpi_gpe_block_info *gpe_block;
  721. struct acpi_gpe_event_info *gpe_event_info;
  722. acpi_native_uint i;
  723. acpi_native_uint j;
  724. u32 wake_gpe_count;
  725. u32 gpe_enabled_count;
  726. acpi_status status;
  727. struct acpi_gpe_walk_info gpe_info;
  728. ACPI_FUNCTION_TRACE ("ev_create_gpe_block");
  729. if (!register_count) {
  730. return_ACPI_STATUS (AE_OK);
  731. }
  732. /* Allocate a new GPE block */
  733. gpe_block = ACPI_MEM_CALLOCATE (sizeof (struct acpi_gpe_block_info));
  734. if (!gpe_block) {
  735. return_ACPI_STATUS (AE_NO_MEMORY);
  736. }
  737. /* Initialize the new GPE block */
  738. gpe_block->register_count = register_count;
  739. gpe_block->block_base_number = gpe_block_base_number;
  740. gpe_block->node = gpe_device;
  741. ACPI_MEMCPY (&gpe_block->block_address, gpe_block_address,
  742. sizeof (struct acpi_generic_address));
  743. /* Create the register_info and event_info sub-structures */
  744. status = acpi_ev_create_gpe_info_blocks (gpe_block);
  745. if (ACPI_FAILURE (status)) {
  746. ACPI_MEM_FREE (gpe_block);
  747. return_ACPI_STATUS (status);
  748. }
  749. /* Install the new block in the global list(s) */
  750. status = acpi_ev_install_gpe_block (gpe_block, interrupt_number);
  751. if (ACPI_FAILURE (status)) {
  752. ACPI_MEM_FREE (gpe_block);
  753. return_ACPI_STATUS (status);
  754. }
  755. /* Find all GPE methods (_Lxx, _Exx) for this block */
  756. status = acpi_ns_walk_namespace (ACPI_TYPE_METHOD, gpe_device,
  757. ACPI_UINT32_MAX, ACPI_NS_WALK_NO_UNLOCK, acpi_ev_save_method_info,
  758. gpe_block, NULL);
  759. /*
  760. * Runtime option: Should Wake GPEs be enabled at runtime? The default
  761. * is No, they should only be enabled just as the machine goes to sleep.
  762. */
  763. if (acpi_gbl_leave_wake_gpes_disabled) {
  764. /*
  765. * Differentiate RUNTIME vs WAKE GPEs, via the _PRW control methods.
  766. * (Each GPE that has one or more _PRWs that reference it is by
  767. * definition a WAKE GPE and will not be enabled while the machine
  768. * is running.)
  769. */
  770. gpe_info.gpe_block = gpe_block;
  771. gpe_info.gpe_device = gpe_device;
  772. status = acpi_ns_walk_namespace (ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
  773. ACPI_UINT32_MAX, ACPI_NS_WALK_UNLOCK, acpi_ev_match_prw_and_gpe,
  774. &gpe_info, NULL);
  775. }
  776. /*
  777. * Enable all GPEs in this block that are 1) "runtime" or "run/wake" GPEs,
  778. * and 2) have a corresponding _Lxx or _Exx method. All other GPEs must
  779. * be enabled via the acpi_enable_gpe() external interface.
  780. */
  781. wake_gpe_count = 0;
  782. gpe_enabled_count = 0;
  783. for (i = 0; i < gpe_block->register_count; i++) {
  784. for (j = 0; j < 8; j++) {
  785. /* Get the info block for this particular GPE */
  786. gpe_event_info = &gpe_block->event_info[(i * ACPI_GPE_REGISTER_WIDTH) + j];
  787. if (((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) == ACPI_GPE_DISPATCH_METHOD) &&
  788. (gpe_event_info->flags & ACPI_GPE_TYPE_RUNTIME)) {
  789. gpe_enabled_count++;
  790. }
  791. if (gpe_event_info->flags & ACPI_GPE_TYPE_WAKE) {
  792. wake_gpe_count++;
  793. }
  794. }
  795. }
  796. /* Dump info about this GPE block */
  797. ACPI_DEBUG_PRINT ((ACPI_DB_INIT,
  798. "GPE %02X to %02X [%4.4s] %u regs on int 0x%X\n",
  799. (u32) gpe_block->block_base_number,
  800. (u32) (gpe_block->block_base_number +
  801. ((gpe_block->register_count * ACPI_GPE_REGISTER_WIDTH) -1)),
  802. gpe_device->name.ascii,
  803. gpe_block->register_count,
  804. interrupt_number));
  805. /* Enable all valid GPEs found above */
  806. status = acpi_hw_enable_runtime_gpe_block (NULL, gpe_block);
  807. ACPI_DEBUG_PRINT ((ACPI_DB_INIT,
  808. "Found %u Wake, Enabled %u Runtime GPEs in this block\n",
  809. wake_gpe_count, gpe_enabled_count));
  810. /* Return the new block */
  811. if (return_gpe_block) {
  812. (*return_gpe_block) = gpe_block;
  813. }
  814. return_ACPI_STATUS (AE_OK);
  815. }
  816. /*******************************************************************************
  817. *
  818. * FUNCTION: acpi_ev_gpe_initialize
  819. *
  820. * PARAMETERS: None
  821. *
  822. * RETURN: Status
  823. *
  824. * DESCRIPTION: Initialize the GPE data structures
  825. *
  826. ******************************************************************************/
  827. acpi_status
  828. acpi_ev_gpe_initialize (
  829. void)
  830. {
  831. u32 register_count0 = 0;
  832. u32 register_count1 = 0;
  833. u32 gpe_number_max = 0;
  834. acpi_status status;
  835. ACPI_FUNCTION_TRACE ("ev_gpe_initialize");
  836. status = acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE);
  837. if (ACPI_FAILURE (status)) {
  838. return_ACPI_STATUS (status);
  839. }
  840. /*
  841. * Initialize the GPE Block(s) defined in the FADT
  842. *
  843. * Why the GPE register block lengths are divided by 2: From the ACPI Spec,
  844. * section "General-Purpose Event Registers", we have:
  845. *
  846. * "Each register block contains two registers of equal length
  847. * GPEx_STS and GPEx_EN (where x is 0 or 1). The length of the
  848. * GPE0_STS and GPE0_EN registers is equal to half the GPE0_LEN
  849. * The length of the GPE1_STS and GPE1_EN registers is equal to
  850. * half the GPE1_LEN. If a generic register block is not supported
  851. * then its respective block pointer and block length values in the
  852. * FADT table contain zeros. The GPE0_LEN and GPE1_LEN do not need
  853. * to be the same size."
  854. */
  855. /*
  856. * Determine the maximum GPE number for this machine.
  857. *
  858. * Note: both GPE0 and GPE1 are optional, and either can exist without
  859. * the other.
  860. *
  861. * If EITHER the register length OR the block address are zero, then that
  862. * particular block is not supported.
  863. */
  864. if (acpi_gbl_FADT->gpe0_blk_len &&
  865. acpi_gbl_FADT->xgpe0_blk.address) {
  866. /* GPE block 0 exists (has both length and address > 0) */
  867. register_count0 = (u16) (acpi_gbl_FADT->gpe0_blk_len / 2);
  868. gpe_number_max = (register_count0 * ACPI_GPE_REGISTER_WIDTH) - 1;
  869. /* Install GPE Block 0 */
  870. status = acpi_ev_create_gpe_block (acpi_gbl_fadt_gpe_device,
  871. &acpi_gbl_FADT->xgpe0_blk, register_count0, 0,
  872. acpi_gbl_FADT->sci_int, &acpi_gbl_gpe_fadt_blocks[0]);
  873. if (ACPI_FAILURE (status)) {
  874. ACPI_REPORT_ERROR ((
  875. "Could not create GPE Block 0, %s\n",
  876. acpi_format_exception (status)));
  877. }
  878. }
  879. if (acpi_gbl_FADT->gpe1_blk_len &&
  880. acpi_gbl_FADT->xgpe1_blk.address) {
  881. /* GPE block 1 exists (has both length and address > 0) */
  882. register_count1 = (u16) (acpi_gbl_FADT->gpe1_blk_len / 2);
  883. /* Check for GPE0/GPE1 overlap (if both banks exist) */
  884. if ((register_count0) &&
  885. (gpe_number_max >= acpi_gbl_FADT->gpe1_base)) {
  886. ACPI_REPORT_ERROR ((
  887. "GPE0 block (GPE 0 to %d) overlaps the GPE1 block (GPE %d to %d) - Ignoring GPE1\n",
  888. gpe_number_max, acpi_gbl_FADT->gpe1_base,
  889. acpi_gbl_FADT->gpe1_base +
  890. ((register_count1 * ACPI_GPE_REGISTER_WIDTH) - 1)));
  891. /* Ignore GPE1 block by setting the register count to zero */
  892. register_count1 = 0;
  893. }
  894. else {
  895. /* Install GPE Block 1 */
  896. status = acpi_ev_create_gpe_block (acpi_gbl_fadt_gpe_device,
  897. &acpi_gbl_FADT->xgpe1_blk, register_count1,
  898. acpi_gbl_FADT->gpe1_base,
  899. acpi_gbl_FADT->sci_int, &acpi_gbl_gpe_fadt_blocks[1]);
  900. if (ACPI_FAILURE (status)) {
  901. ACPI_REPORT_ERROR ((
  902. "Could not create GPE Block 1, %s\n",
  903. acpi_format_exception (status)));
  904. }
  905. /*
  906. * GPE0 and GPE1 do not have to be contiguous in the GPE number
  907. * space. However, GPE0 always starts at GPE number zero.
  908. */
  909. gpe_number_max = acpi_gbl_FADT->gpe1_base +
  910. ((register_count1 * ACPI_GPE_REGISTER_WIDTH) - 1);
  911. }
  912. }
  913. /* Exit if there are no GPE registers */
  914. if ((register_count0 + register_count1) == 0) {
  915. /* GPEs are not required by ACPI, this is OK */
  916. ACPI_DEBUG_PRINT ((ACPI_DB_INIT,
  917. "There are no GPE blocks defined in the FADT\n"));
  918. status = AE_OK;
  919. goto cleanup;
  920. }
  921. /* Check for Max GPE number out-of-range */
  922. if (gpe_number_max > ACPI_GPE_MAX) {
  923. ACPI_REPORT_ERROR (("Maximum GPE number from FADT is too large: 0x%X\n",
  924. gpe_number_max));
  925. status = AE_BAD_VALUE;
  926. goto cleanup;
  927. }
  928. cleanup:
  929. (void) acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
  930. return_ACPI_STATUS (AE_OK);
  931. }