xref: /titanic_50/usr/src/uts/intel/io/acpica/hardware/hwgpe.c (revision 385cc6b4ad1792caef3f84eb61eed3f27085801f)
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