1ae115bc7Smrj /******************************************************************************
2ae115bc7Smrj *
3ae115bc7Smrj * Module Name: hwgpe - Low level GPE enable/disable/clear functions
4ae115bc7Smrj *
5ae115bc7Smrj *****************************************************************************/
6ae115bc7Smrj
726f3cdf0SGordon Ross /*
8*385cc6b4SJerry Jelinek * Copyright (C) 2000 - 2016, Intel Corp.
9ae115bc7Smrj * All rights reserved.
10ae115bc7Smrj *
1126f3cdf0SGordon Ross * Redistribution and use in source and binary forms, with or without
1226f3cdf0SGordon Ross * modification, are permitted provided that the following conditions
1326f3cdf0SGordon Ross * are met:
1426f3cdf0SGordon Ross * 1. Redistributions of source code must retain the above copyright
1526f3cdf0SGordon Ross * notice, this list of conditions, and the following disclaimer,
1626f3cdf0SGordon Ross * without modification.
1726f3cdf0SGordon Ross * 2. Redistributions in binary form must reproduce at minimum a disclaimer
1826f3cdf0SGordon Ross * substantially similar to the "NO WARRANTY" disclaimer below
1926f3cdf0SGordon Ross * ("Disclaimer") and any redistribution must be conditioned upon
2026f3cdf0SGordon Ross * including a substantially similar Disclaimer requirement for further
2126f3cdf0SGordon Ross * binary redistribution.
2226f3cdf0SGordon Ross * 3. Neither the names of the above-listed copyright holders nor the names
2326f3cdf0SGordon Ross * of any contributors may be used to endorse or promote products derived
2426f3cdf0SGordon Ross * from this software without specific prior written permission.
25ae115bc7Smrj *
2626f3cdf0SGordon Ross * Alternatively, this software may be distributed under the terms of the
2726f3cdf0SGordon Ross * GNU General Public License ("GPL") version 2 as published by the Free
2826f3cdf0SGordon Ross * Software Foundation.
29ae115bc7Smrj *
3026f3cdf0SGordon Ross * NO WARRANTY
3126f3cdf0SGordon Ross * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
3226f3cdf0SGordon Ross * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3326f3cdf0SGordon Ross * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
3426f3cdf0SGordon Ross * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3526f3cdf0SGordon Ross * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
3626f3cdf0SGordon Ross * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
3726f3cdf0SGordon Ross * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
3826f3cdf0SGordon Ross * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
3926f3cdf0SGordon Ross * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
4026f3cdf0SGordon Ross * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
4126f3cdf0SGordon Ross * POSSIBILITY OF SUCH DAMAGES.
4226f3cdf0SGordon Ross */
43ae115bc7Smrj
44ae115bc7Smrj #include "acpi.h"
45aa2aa9a6SDana Myers #include "accommon.h"
46ae115bc7Smrj #include "acevents.h"
47ae115bc7Smrj
48ae115bc7Smrj #define _COMPONENT ACPI_HARDWARE
49ae115bc7Smrj ACPI_MODULE_NAME ("hwgpe")
50ae115bc7Smrj
51*385cc6b4SJerry Jelinek #if (!ACPI_REDUCED_HARDWARE) /* Entire module */
52*385cc6b4SJerry Jelinek
53ae115bc7Smrj /* Local prototypes */
54ae115bc7Smrj
55ae115bc7Smrj static ACPI_STATUS
56ae115bc7Smrj AcpiHwEnableWakeupGpeBlock (
57ae115bc7Smrj ACPI_GPE_XRUPT_INFO *GpeXruptInfo,
58aa2aa9a6SDana Myers ACPI_GPE_BLOCK_INFO *GpeBlock,
59aa2aa9a6SDana Myers void *Context);
60ae115bc7Smrj
61*385cc6b4SJerry Jelinek static ACPI_STATUS
62*385cc6b4SJerry Jelinek AcpiHwGpeEnableWrite (
63*385cc6b4SJerry Jelinek UINT8 EnableMask,
64*385cc6b4SJerry Jelinek ACPI_GPE_REGISTER_INFO *GpeRegisterInfo);
65*385cc6b4SJerry Jelinek
66db2bae30SDana Myers
67db2bae30SDana Myers /******************************************************************************
68db2bae30SDana Myers *
6926f3cdf0SGordon Ross * FUNCTION: AcpiHwGetGpeRegisterBit
7026f3cdf0SGordon Ross *
7126f3cdf0SGordon Ross * PARAMETERS: GpeEventInfo - Info block for the GPE
7226f3cdf0SGordon Ross *
7326f3cdf0SGordon Ross * RETURN: Register mask with a one in the GPE bit position
7426f3cdf0SGordon Ross *
7526f3cdf0SGordon Ross * DESCRIPTION: Compute the register mask for this GPE. One bit is set in the
7626f3cdf0SGordon Ross * correct position for the input GPE.
7726f3cdf0SGordon Ross *
7826f3cdf0SGordon Ross ******************************************************************************/
7926f3cdf0SGordon Ross
8026f3cdf0SGordon Ross UINT32
AcpiHwGetGpeRegisterBit(ACPI_GPE_EVENT_INFO * GpeEventInfo)8126f3cdf0SGordon Ross AcpiHwGetGpeRegisterBit (
82*385cc6b4SJerry Jelinek ACPI_GPE_EVENT_INFO *GpeEventInfo)
8326f3cdf0SGordon Ross {
8426f3cdf0SGordon Ross
8526f3cdf0SGordon Ross return ((UINT32) 1 <<
86*385cc6b4SJerry Jelinek (GpeEventInfo->GpeNumber - GpeEventInfo->RegisterInfo->BaseGpeNumber));
8726f3cdf0SGordon Ross }
8826f3cdf0SGordon Ross
8926f3cdf0SGordon Ross
9026f3cdf0SGordon Ross /******************************************************************************
9126f3cdf0SGordon Ross *
9226f3cdf0SGordon Ross * FUNCTION: AcpiHwLowSetGpe
93db2bae30SDana Myers *
94db2bae30SDana Myers * PARAMETERS: GpeEventInfo - Info block for the GPE to be disabled
9526f3cdf0SGordon Ross * Action - Enable or disable
96db2bae30SDana Myers *
97db2bae30SDana Myers * RETURN: Status
98db2bae30SDana Myers *
9926f3cdf0SGordon Ross * DESCRIPTION: Enable or disable a single GPE in the parent enable register.
100*385cc6b4SJerry Jelinek * The EnableMask field of the involved GPE register must be
101*385cc6b4SJerry Jelinek * updated by the caller if necessary.
102db2bae30SDana Myers *
103db2bae30SDana Myers ******************************************************************************/
104db2bae30SDana Myers
105db2bae30SDana Myers ACPI_STATUS
AcpiHwLowSetGpe(ACPI_GPE_EVENT_INFO * GpeEventInfo,UINT32 Action)10626f3cdf0SGordon Ross AcpiHwLowSetGpe (
10726f3cdf0SGordon Ross ACPI_GPE_EVENT_INFO *GpeEventInfo,
10826f3cdf0SGordon Ross UINT32 Action)
109db2bae30SDana Myers {
110db2bae30SDana Myers ACPI_GPE_REGISTER_INFO *GpeRegisterInfo;
111db2bae30SDana Myers ACPI_STATUS Status;
112db2bae30SDana Myers UINT32 EnableMask;
11326f3cdf0SGordon Ross UINT32 RegisterBit;
11426f3cdf0SGordon Ross
11526f3cdf0SGordon Ross
11626f3cdf0SGordon Ross ACPI_FUNCTION_ENTRY ();
117db2bae30SDana Myers
118db2bae30SDana Myers
119db2bae30SDana Myers /* Get the info block for the entire GPE register */
120db2bae30SDana Myers
121db2bae30SDana Myers GpeRegisterInfo = GpeEventInfo->RegisterInfo;
122db2bae30SDana Myers if (!GpeRegisterInfo)
123db2bae30SDana Myers {
124db2bae30SDana Myers return (AE_NOT_EXIST);
125db2bae30SDana Myers }
126db2bae30SDana Myers
127db2bae30SDana Myers /* Get current value of the enable register that contains this GPE */
128db2bae30SDana Myers
12957190917SDana Myers Status = AcpiHwRead (&EnableMask, &GpeRegisterInfo->EnableAddress);
130db2bae30SDana Myers if (ACPI_FAILURE (Status))
131db2bae30SDana Myers {
132db2bae30SDana Myers return (Status);
133db2bae30SDana Myers }
134db2bae30SDana Myers
13526f3cdf0SGordon Ross /* Set or clear just the bit that corresponds to this GPE */
136db2bae30SDana Myers
137*385cc6b4SJerry Jelinek RegisterBit = AcpiHwGetGpeRegisterBit (GpeEventInfo);
13826f3cdf0SGordon Ross switch (Action)
13926f3cdf0SGordon Ross {
14026f3cdf0SGordon Ross case ACPI_GPE_CONDITIONAL_ENABLE:
141db2bae30SDana Myers
142*385cc6b4SJerry Jelinek /* Only enable if the corresponding EnableMask bit is set */
14326f3cdf0SGordon Ross
144*385cc6b4SJerry Jelinek if (!(RegisterBit & GpeRegisterInfo->EnableMask))
14526f3cdf0SGordon Ross {
14626f3cdf0SGordon Ross return (AE_BAD_PARAMETER);
14726f3cdf0SGordon Ross }
14826f3cdf0SGordon Ross
14926f3cdf0SGordon Ross /*lint -fallthrough */
15026f3cdf0SGordon Ross
15126f3cdf0SGordon Ross case ACPI_GPE_ENABLE:
152*385cc6b4SJerry Jelinek
15326f3cdf0SGordon Ross ACPI_SET_BIT (EnableMask, RegisterBit);
15426f3cdf0SGordon Ross break;
15526f3cdf0SGordon Ross
15626f3cdf0SGordon Ross case ACPI_GPE_DISABLE:
157*385cc6b4SJerry Jelinek
15826f3cdf0SGordon Ross ACPI_CLEAR_BIT (EnableMask, RegisterBit);
15926f3cdf0SGordon Ross break;
16026f3cdf0SGordon Ross
16126f3cdf0SGordon Ross default:
162*385cc6b4SJerry Jelinek
163*385cc6b4SJerry Jelinek ACPI_ERROR ((AE_INFO, "Invalid GPE Action, %u", Action));
16426f3cdf0SGordon Ross return (AE_BAD_PARAMETER);
16526f3cdf0SGordon Ross }
166db2bae30SDana Myers
167db2bae30SDana Myers /* Write the updated enable mask */
168db2bae30SDana Myers
16957190917SDana Myers Status = AcpiHwWrite (EnableMask, &GpeRegisterInfo->EnableAddress);
170db2bae30SDana Myers return (Status);
171db2bae30SDana Myers }
172db2bae30SDana Myers
173db2bae30SDana Myers
174ae115bc7Smrj /******************************************************************************
175ae115bc7Smrj *
176ae115bc7Smrj * FUNCTION: AcpiHwClearGpe
177ae115bc7Smrj *
178ae115bc7Smrj * PARAMETERS: GpeEventInfo - Info block for the GPE to be cleared
179ae115bc7Smrj *
180ae115bc7Smrj * RETURN: Status
181ae115bc7Smrj *
182ae115bc7Smrj * DESCRIPTION: Clear the status bit for a single GPE.
183ae115bc7Smrj *
184ae115bc7Smrj ******************************************************************************/
185ae115bc7Smrj
186ae115bc7Smrj ACPI_STATUS
AcpiHwClearGpe(ACPI_GPE_EVENT_INFO * GpeEventInfo)187ae115bc7Smrj AcpiHwClearGpe (
188ae115bc7Smrj ACPI_GPE_EVENT_INFO *GpeEventInfo)
189ae115bc7Smrj {
19026f3cdf0SGordon Ross ACPI_GPE_REGISTER_INFO *GpeRegisterInfo;
191ae115bc7Smrj ACPI_STATUS Status;
19226f3cdf0SGordon Ross UINT32 RegisterBit;
193ae115bc7Smrj
194ae115bc7Smrj
195ae115bc7Smrj ACPI_FUNCTION_ENTRY ();
196ae115bc7Smrj
19726f3cdf0SGordon Ross /* Get the info block for the entire GPE register */
198ae115bc7Smrj
19926f3cdf0SGordon Ross GpeRegisterInfo = GpeEventInfo->RegisterInfo;
20026f3cdf0SGordon Ross if (!GpeRegisterInfo)
20126f3cdf0SGordon Ross {
20226f3cdf0SGordon Ross return (AE_NOT_EXIST);
20326f3cdf0SGordon Ross }
204db2bae30SDana Myers
205ae115bc7Smrj /*
206ae115bc7Smrj * Write a one to the appropriate bit in the status register to
207ae115bc7Smrj * clear this GPE.
208ae115bc7Smrj */
209*385cc6b4SJerry Jelinek RegisterBit = AcpiHwGetGpeRegisterBit (GpeEventInfo);
21026f3cdf0SGordon Ross
211*385cc6b4SJerry Jelinek Status = AcpiHwWrite (RegisterBit, &GpeRegisterInfo->StatusAddress);
212ae115bc7Smrj return (Status);
213ae115bc7Smrj }
214ae115bc7Smrj
215ae115bc7Smrj
216ae115bc7Smrj /******************************************************************************
217ae115bc7Smrj *
218ae115bc7Smrj * FUNCTION: AcpiHwGetGpeStatus
219ae115bc7Smrj *
220ae115bc7Smrj * PARAMETERS: GpeEventInfo - Info block for the GPE to queried
221ae115bc7Smrj * EventStatus - Where the GPE status is returned
222ae115bc7Smrj *
223ae115bc7Smrj * RETURN: Status
224ae115bc7Smrj *
225ae115bc7Smrj * DESCRIPTION: Return the status of a single GPE.
226ae115bc7Smrj *
227ae115bc7Smrj ******************************************************************************/
228ae115bc7Smrj
229ae115bc7Smrj ACPI_STATUS
AcpiHwGetGpeStatus(ACPI_GPE_EVENT_INFO * GpeEventInfo,ACPI_EVENT_STATUS * EventStatus)230ae115bc7Smrj AcpiHwGetGpeStatus (
231ae115bc7Smrj ACPI_GPE_EVENT_INFO *GpeEventInfo,
232ae115bc7Smrj ACPI_EVENT_STATUS *EventStatus)
233ae115bc7Smrj {
234ae115bc7Smrj UINT32 InByte;
23526f3cdf0SGordon Ross UINT32 RegisterBit;
236ae115bc7Smrj ACPI_GPE_REGISTER_INFO *GpeRegisterInfo;
237ae115bc7Smrj ACPI_EVENT_STATUS LocalEventStatus = 0;
23826f3cdf0SGordon Ross ACPI_STATUS Status;
239ae115bc7Smrj
240ae115bc7Smrj
241ae115bc7Smrj ACPI_FUNCTION_ENTRY ();
242ae115bc7Smrj
243ae115bc7Smrj
244ae115bc7Smrj if (!EventStatus)
245ae115bc7Smrj {
246ae115bc7Smrj return (AE_BAD_PARAMETER);
247ae115bc7Smrj }
248ae115bc7Smrj
249*385cc6b4SJerry Jelinek /* GPE currently handled? */
250*385cc6b4SJerry Jelinek
251*385cc6b4SJerry Jelinek if (ACPI_GPE_DISPATCH_TYPE (GpeEventInfo->Flags) !=
252*385cc6b4SJerry Jelinek ACPI_GPE_DISPATCH_NONE)
253*385cc6b4SJerry Jelinek {
254*385cc6b4SJerry Jelinek LocalEventStatus |= ACPI_EVENT_FLAG_HAS_HANDLER;
255*385cc6b4SJerry Jelinek }
256*385cc6b4SJerry Jelinek
257ae115bc7Smrj /* Get the info block for the entire GPE register */
258ae115bc7Smrj
259ae115bc7Smrj GpeRegisterInfo = GpeEventInfo->RegisterInfo;
260ae115bc7Smrj
261ae115bc7Smrj /* Get the register bitmask for this GPE */
262ae115bc7Smrj
263*385cc6b4SJerry Jelinek RegisterBit = AcpiHwGetGpeRegisterBit (GpeEventInfo);
264ae115bc7Smrj
265ae115bc7Smrj /* GPE currently enabled? (enabled for runtime?) */
266ae115bc7Smrj
267ae115bc7Smrj if (RegisterBit & GpeRegisterInfo->EnableForRun)
268ae115bc7Smrj {
269ae115bc7Smrj LocalEventStatus |= ACPI_EVENT_FLAG_ENABLED;
270ae115bc7Smrj }
271ae115bc7Smrj
272ae115bc7Smrj /* GPE enabled for wake? */
273ae115bc7Smrj
274ae115bc7Smrj if (RegisterBit & GpeRegisterInfo->EnableForWake)
275ae115bc7Smrj {
276ae115bc7Smrj LocalEventStatus |= ACPI_EVENT_FLAG_WAKE_ENABLED;
277ae115bc7Smrj }
278ae115bc7Smrj
279*385cc6b4SJerry Jelinek /* GPE currently enabled (enable bit == 1)? */
280*385cc6b4SJerry Jelinek
281*385cc6b4SJerry Jelinek Status = AcpiHwRead (&InByte, &GpeRegisterInfo->EnableAddress);
282*385cc6b4SJerry Jelinek if (ACPI_FAILURE (Status))
283*385cc6b4SJerry Jelinek {
284*385cc6b4SJerry Jelinek return (Status);
285*385cc6b4SJerry Jelinek }
286*385cc6b4SJerry Jelinek
287*385cc6b4SJerry Jelinek if (RegisterBit & InByte)
288*385cc6b4SJerry Jelinek {
289*385cc6b4SJerry Jelinek LocalEventStatus |= ACPI_EVENT_FLAG_ENABLE_SET;
290*385cc6b4SJerry Jelinek }
291*385cc6b4SJerry Jelinek
292ae115bc7Smrj /* GPE currently active (status bit == 1)? */
293ae115bc7Smrj
29457190917SDana Myers Status = AcpiHwRead (&InByte, &GpeRegisterInfo->StatusAddress);
295ae115bc7Smrj if (ACPI_FAILURE (Status))
296ae115bc7Smrj {
29726f3cdf0SGordon Ross return (Status);
298ae115bc7Smrj }
299ae115bc7Smrj
300ae115bc7Smrj if (RegisterBit & InByte)
301ae115bc7Smrj {
302*385cc6b4SJerry Jelinek LocalEventStatus |= ACPI_EVENT_FLAG_STATUS_SET;
303ae115bc7Smrj }
304ae115bc7Smrj
305ae115bc7Smrj /* Set return value */
306ae115bc7Smrj
307ae115bc7Smrj (*EventStatus) = LocalEventStatus;
30826f3cdf0SGordon Ross return (AE_OK);
309ae115bc7Smrj }
310ae115bc7Smrj
311ae115bc7Smrj
312ae115bc7Smrj /******************************************************************************
313ae115bc7Smrj *
314*385cc6b4SJerry Jelinek * FUNCTION: AcpiHwGpeEnableWrite
315*385cc6b4SJerry Jelinek *
316*385cc6b4SJerry Jelinek * PARAMETERS: EnableMask - Bit mask to write to the GPE register
317*385cc6b4SJerry Jelinek * GpeRegisterInfo - Gpe Register info
318*385cc6b4SJerry Jelinek *
319*385cc6b4SJerry Jelinek * RETURN: Status
320*385cc6b4SJerry Jelinek *
321*385cc6b4SJerry Jelinek * DESCRIPTION: Write the enable mask byte to the given GPE register.
322*385cc6b4SJerry Jelinek *
323*385cc6b4SJerry Jelinek ******************************************************************************/
324*385cc6b4SJerry Jelinek
325*385cc6b4SJerry Jelinek static ACPI_STATUS
AcpiHwGpeEnableWrite(UINT8 EnableMask,ACPI_GPE_REGISTER_INFO * GpeRegisterInfo)326*385cc6b4SJerry Jelinek AcpiHwGpeEnableWrite (
327*385cc6b4SJerry Jelinek UINT8 EnableMask,
328*385cc6b4SJerry Jelinek ACPI_GPE_REGISTER_INFO *GpeRegisterInfo)
329*385cc6b4SJerry Jelinek {
330*385cc6b4SJerry Jelinek ACPI_STATUS Status;
331*385cc6b4SJerry Jelinek
332*385cc6b4SJerry Jelinek
333*385cc6b4SJerry Jelinek GpeRegisterInfo->EnableMask = EnableMask;
334*385cc6b4SJerry Jelinek
335*385cc6b4SJerry Jelinek Status = AcpiHwWrite (EnableMask, &GpeRegisterInfo->EnableAddress);
336*385cc6b4SJerry Jelinek return (Status);
337*385cc6b4SJerry Jelinek }
338*385cc6b4SJerry Jelinek
339*385cc6b4SJerry Jelinek
340*385cc6b4SJerry Jelinek /******************************************************************************
341*385cc6b4SJerry Jelinek *
342ae115bc7Smrj * FUNCTION: AcpiHwDisableGpeBlock
343ae115bc7Smrj *
344ae115bc7Smrj * PARAMETERS: GpeXruptInfo - GPE Interrupt info
345ae115bc7Smrj * GpeBlock - Gpe Block info
346ae115bc7Smrj *
347ae115bc7Smrj * RETURN: Status
348ae115bc7Smrj *
349ae115bc7Smrj * DESCRIPTION: Disable all GPEs within a single GPE block
350ae115bc7Smrj *
351ae115bc7Smrj ******************************************************************************/
352ae115bc7Smrj
353ae115bc7Smrj ACPI_STATUS
AcpiHwDisableGpeBlock(ACPI_GPE_XRUPT_INFO * GpeXruptInfo,ACPI_GPE_BLOCK_INFO * GpeBlock,void * Context)354ae115bc7Smrj AcpiHwDisableGpeBlock (
355ae115bc7Smrj ACPI_GPE_XRUPT_INFO *GpeXruptInfo,
356aa2aa9a6SDana Myers ACPI_GPE_BLOCK_INFO *GpeBlock,
357aa2aa9a6SDana Myers void *Context)
358ae115bc7Smrj {
359ae115bc7Smrj UINT32 i;
360ae115bc7Smrj ACPI_STATUS Status;
361ae115bc7Smrj
362ae115bc7Smrj
363ae115bc7Smrj /* Examine each GPE Register within the block */
364ae115bc7Smrj
365ae115bc7Smrj for (i = 0; i < GpeBlock->RegisterCount; i++)
366ae115bc7Smrj {
367ae115bc7Smrj /* Disable all GPEs in this register */
368ae115bc7Smrj
369*385cc6b4SJerry Jelinek Status = AcpiHwGpeEnableWrite (0x00, &GpeBlock->RegisterInfo[i]);
370ae115bc7Smrj if (ACPI_FAILURE (Status))
371ae115bc7Smrj {
372ae115bc7Smrj return (Status);
373ae115bc7Smrj }
374ae115bc7Smrj }
375ae115bc7Smrj
376ae115bc7Smrj return (AE_OK);
377ae115bc7Smrj }
378ae115bc7Smrj
379ae115bc7Smrj
380ae115bc7Smrj /******************************************************************************
381ae115bc7Smrj *
382ae115bc7Smrj * FUNCTION: AcpiHwClearGpeBlock
383ae115bc7Smrj *
384ae115bc7Smrj * PARAMETERS: GpeXruptInfo - GPE Interrupt info
385ae115bc7Smrj * GpeBlock - Gpe Block info
386ae115bc7Smrj *
387ae115bc7Smrj * RETURN: Status
388ae115bc7Smrj *
389ae115bc7Smrj * DESCRIPTION: Clear status bits for all GPEs within a single GPE block
390ae115bc7Smrj *
391ae115bc7Smrj ******************************************************************************/
392ae115bc7Smrj
393ae115bc7Smrj ACPI_STATUS
AcpiHwClearGpeBlock(ACPI_GPE_XRUPT_INFO * GpeXruptInfo,ACPI_GPE_BLOCK_INFO * GpeBlock,void * Context)394ae115bc7Smrj AcpiHwClearGpeBlock (
395ae115bc7Smrj ACPI_GPE_XRUPT_INFO *GpeXruptInfo,
396aa2aa9a6SDana Myers ACPI_GPE_BLOCK_INFO *GpeBlock,
397aa2aa9a6SDana Myers void *Context)
398ae115bc7Smrj {
399ae115bc7Smrj UINT32 i;
400ae115bc7Smrj ACPI_STATUS Status;
401ae115bc7Smrj
402ae115bc7Smrj
403ae115bc7Smrj /* Examine each GPE Register within the block */
404ae115bc7Smrj
405ae115bc7Smrj for (i = 0; i < GpeBlock->RegisterCount; i++)
406ae115bc7Smrj {
407ae115bc7Smrj /* Clear status on all GPEs in this register */
408ae115bc7Smrj
40957190917SDana Myers Status = AcpiHwWrite (0xFF, &GpeBlock->RegisterInfo[i].StatusAddress);
410ae115bc7Smrj if (ACPI_FAILURE (Status))
411ae115bc7Smrj {
412ae115bc7Smrj return (Status);
413ae115bc7Smrj }
414ae115bc7Smrj }
415ae115bc7Smrj
416ae115bc7Smrj return (AE_OK);
417ae115bc7Smrj }
418ae115bc7Smrj
419ae115bc7Smrj
420ae115bc7Smrj /******************************************************************************
421ae115bc7Smrj *
422ae115bc7Smrj * FUNCTION: AcpiHwEnableRuntimeGpeBlock
423ae115bc7Smrj *
424ae115bc7Smrj * PARAMETERS: GpeXruptInfo - GPE Interrupt info
425ae115bc7Smrj * GpeBlock - Gpe Block info
426ae115bc7Smrj *
427ae115bc7Smrj * RETURN: Status
428ae115bc7Smrj *
429ae115bc7Smrj * DESCRIPTION: Enable all "runtime" GPEs within a single GPE block. Includes
430ae115bc7Smrj * combination wake/run GPEs.
431ae115bc7Smrj *
432ae115bc7Smrj ******************************************************************************/
433ae115bc7Smrj
434ae115bc7Smrj ACPI_STATUS
AcpiHwEnableRuntimeGpeBlock(ACPI_GPE_XRUPT_INFO * GpeXruptInfo,ACPI_GPE_BLOCK_INFO * GpeBlock,void * Context)435ae115bc7Smrj AcpiHwEnableRuntimeGpeBlock (
436ae115bc7Smrj ACPI_GPE_XRUPT_INFO *GpeXruptInfo,
437aa2aa9a6SDana Myers ACPI_GPE_BLOCK_INFO *GpeBlock,
438aa2aa9a6SDana Myers void *Context)
439ae115bc7Smrj {
440ae115bc7Smrj UINT32 i;
441ae115bc7Smrj ACPI_STATUS Status;
442*385cc6b4SJerry Jelinek ACPI_GPE_REGISTER_INFO *GpeRegisterInfo;
443ae115bc7Smrj
444ae115bc7Smrj
445ae115bc7Smrj /* NOTE: assumes that all GPEs are currently disabled */
446ae115bc7Smrj
447ae115bc7Smrj /* Examine each GPE Register within the block */
448ae115bc7Smrj
449ae115bc7Smrj for (i = 0; i < GpeBlock->RegisterCount; i++)
450ae115bc7Smrj {
451*385cc6b4SJerry Jelinek GpeRegisterInfo = &GpeBlock->RegisterInfo[i];
452*385cc6b4SJerry Jelinek if (!GpeRegisterInfo->EnableForRun)
453ae115bc7Smrj {
454ae115bc7Smrj continue;
455ae115bc7Smrj }
456ae115bc7Smrj
457ae115bc7Smrj /* Enable all "runtime" GPEs in this register */
458ae115bc7Smrj
459*385cc6b4SJerry Jelinek Status = AcpiHwGpeEnableWrite (GpeRegisterInfo->EnableForRun,
460*385cc6b4SJerry Jelinek GpeRegisterInfo);
461ae115bc7Smrj if (ACPI_FAILURE (Status))
462ae115bc7Smrj {
463ae115bc7Smrj return (Status);
464ae115bc7Smrj }
465ae115bc7Smrj }
466ae115bc7Smrj
467ae115bc7Smrj return (AE_OK);
468ae115bc7Smrj }
469ae115bc7Smrj
470ae115bc7Smrj
471ae115bc7Smrj /******************************************************************************
472ae115bc7Smrj *
473ae115bc7Smrj * FUNCTION: AcpiHwEnableWakeupGpeBlock
474ae115bc7Smrj *
475ae115bc7Smrj * PARAMETERS: GpeXruptInfo - GPE Interrupt info
476ae115bc7Smrj * GpeBlock - Gpe Block info
477ae115bc7Smrj *
478ae115bc7Smrj * RETURN: Status
479ae115bc7Smrj *
480ae115bc7Smrj * DESCRIPTION: Enable all "wake" GPEs within a single GPE block. Includes
481ae115bc7Smrj * combination wake/run GPEs.
482ae115bc7Smrj *
483ae115bc7Smrj ******************************************************************************/
484ae115bc7Smrj
485ae115bc7Smrj static ACPI_STATUS
AcpiHwEnableWakeupGpeBlock(ACPI_GPE_XRUPT_INFO * GpeXruptInfo,ACPI_GPE_BLOCK_INFO * GpeBlock,void * Context)486ae115bc7Smrj AcpiHwEnableWakeupGpeBlock (
487ae115bc7Smrj ACPI_GPE_XRUPT_INFO *GpeXruptInfo,
488aa2aa9a6SDana Myers ACPI_GPE_BLOCK_INFO *GpeBlock,
489aa2aa9a6SDana Myers void *Context)
490ae115bc7Smrj {
491ae115bc7Smrj UINT32 i;
492ae115bc7Smrj ACPI_STATUS Status;
493*385cc6b4SJerry Jelinek ACPI_GPE_REGISTER_INFO *GpeRegisterInfo;
494ae115bc7Smrj
495ae115bc7Smrj
496ae115bc7Smrj /* Examine each GPE Register within the block */
497ae115bc7Smrj
498ae115bc7Smrj for (i = 0; i < GpeBlock->RegisterCount; i++)
499ae115bc7Smrj {
500*385cc6b4SJerry Jelinek GpeRegisterInfo = &GpeBlock->RegisterInfo[i];
501ae115bc7Smrj
502*385cc6b4SJerry Jelinek /*
503*385cc6b4SJerry Jelinek * Enable all "wake" GPEs in this register and disable the
504*385cc6b4SJerry Jelinek * remaining ones.
505*385cc6b4SJerry Jelinek */
506*385cc6b4SJerry Jelinek Status = AcpiHwGpeEnableWrite (GpeRegisterInfo->EnableForWake,
507*385cc6b4SJerry Jelinek GpeRegisterInfo);
508ae115bc7Smrj if (ACPI_FAILURE (Status))
509ae115bc7Smrj {
510ae115bc7Smrj return (Status);
511ae115bc7Smrj }
512ae115bc7Smrj }
513ae115bc7Smrj
514ae115bc7Smrj return (AE_OK);
515ae115bc7Smrj }
516ae115bc7Smrj
517ae115bc7Smrj
518ae115bc7Smrj /******************************************************************************
519ae115bc7Smrj *
520ae115bc7Smrj * FUNCTION: AcpiHwDisableAllGpes
521ae115bc7Smrj *
522ae115bc7Smrj * PARAMETERS: None
523ae115bc7Smrj *
524ae115bc7Smrj * RETURN: Status
525ae115bc7Smrj *
526ae115bc7Smrj * DESCRIPTION: Disable and clear all GPEs in all GPE blocks
527ae115bc7Smrj *
528ae115bc7Smrj ******************************************************************************/
529ae115bc7Smrj
530ae115bc7Smrj ACPI_STATUS
AcpiHwDisableAllGpes(void)531ae115bc7Smrj AcpiHwDisableAllGpes (
532ae115bc7Smrj void)
533ae115bc7Smrj {
534ae115bc7Smrj ACPI_STATUS Status;
535ae115bc7Smrj
536ae115bc7Smrj
537ae115bc7Smrj ACPI_FUNCTION_TRACE (HwDisableAllGpes);
538ae115bc7Smrj
539ae115bc7Smrj
540aa2aa9a6SDana Myers Status = AcpiEvWalkGpeList (AcpiHwDisableGpeBlock, NULL);
541aa2aa9a6SDana Myers Status = AcpiEvWalkGpeList (AcpiHwClearGpeBlock, NULL);
542ae115bc7Smrj return_ACPI_STATUS (Status);
543ae115bc7Smrj }
544ae115bc7Smrj
545ae115bc7Smrj
546ae115bc7Smrj /******************************************************************************
547ae115bc7Smrj *
548ae115bc7Smrj * FUNCTION: AcpiHwEnableAllRuntimeGpes
549ae115bc7Smrj *
550ae115bc7Smrj * PARAMETERS: None
551ae115bc7Smrj *
552ae115bc7Smrj * RETURN: Status
553ae115bc7Smrj *
554ae115bc7Smrj * DESCRIPTION: Enable all "runtime" GPEs, in all GPE blocks
555ae115bc7Smrj *
556ae115bc7Smrj ******************************************************************************/
557ae115bc7Smrj
558ae115bc7Smrj ACPI_STATUS
AcpiHwEnableAllRuntimeGpes(void)559ae115bc7Smrj AcpiHwEnableAllRuntimeGpes (
560ae115bc7Smrj void)
561ae115bc7Smrj {
562ae115bc7Smrj ACPI_STATUS Status;
563ae115bc7Smrj
564ae115bc7Smrj
565ae115bc7Smrj ACPI_FUNCTION_TRACE (HwEnableAllRuntimeGpes);
566ae115bc7Smrj
567ae115bc7Smrj
568aa2aa9a6SDana Myers Status = AcpiEvWalkGpeList (AcpiHwEnableRuntimeGpeBlock, NULL);
569ae115bc7Smrj return_ACPI_STATUS (Status);
570ae115bc7Smrj }
571ae115bc7Smrj
572ae115bc7Smrj
573ae115bc7Smrj /******************************************************************************
574ae115bc7Smrj *
575ae115bc7Smrj * FUNCTION: AcpiHwEnableAllWakeupGpes
576ae115bc7Smrj *
577ae115bc7Smrj * PARAMETERS: None
578ae115bc7Smrj *
579ae115bc7Smrj * RETURN: Status
580ae115bc7Smrj *
581ae115bc7Smrj * DESCRIPTION: Enable all "wakeup" GPEs, in all GPE blocks
582ae115bc7Smrj *
583ae115bc7Smrj ******************************************************************************/
584ae115bc7Smrj
585ae115bc7Smrj ACPI_STATUS
AcpiHwEnableAllWakeupGpes(void)586ae115bc7Smrj AcpiHwEnableAllWakeupGpes (
587ae115bc7Smrj void)
588ae115bc7Smrj {
589ae115bc7Smrj ACPI_STATUS Status;
590ae115bc7Smrj
591ae115bc7Smrj
592ae115bc7Smrj ACPI_FUNCTION_TRACE (HwEnableAllWakeupGpes);
593ae115bc7Smrj
594ae115bc7Smrj
595aa2aa9a6SDana Myers Status = AcpiEvWalkGpeList (AcpiHwEnableWakeupGpeBlock, NULL);
596ae115bc7Smrj return_ACPI_STATUS (Status);
597ae115bc7Smrj }
598ae115bc7Smrj
599*385cc6b4SJerry Jelinek #endif /* !ACPI_REDUCED_HARDWARE */
600