1 /** @file
2   Header file for GpioLib.
3   All function in this library is available for PEI, DXE, and SMM
4 
5   @note: When GPIO pads are owned by ME Firmware, BIOS/host should not
6          attempt to access these GPIO Pads registers, registers value
7          returned in this case will be 0xFF.
8 
9 Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
10 SPDX-License-Identifier: BSD-2-Clause-Patent
11 
12 **/
13 #ifndef _GPIO_LIB_H_
14 #define _GPIO_LIB_H_
15 
16 #include <GpioConfig.h>
17 
18 typedef struct {
19   GPIO_PAD           GpioPad;
20   GPIO_CONFIG        GpioConfig;
21 } GPIO_INIT_CONFIG;
22 /**
23   This procedure will initialize multiple GPIO pins. Use GPIO_INIT_CONFIG structure.
24   Structure contains fields that can be used to configure each pad.
25   Pad not configured using GPIO_INIT_CONFIG will be left with hardware default values.
26   Separate fields could be set to hardware default if it does not matter, except
27   GpioPad and PadMode.
28   Some GpioPads are configured and switched to native mode by RC, those include:
29   SerialIo pins, ISH pins, ClkReq Pins
30 
31   @param[in] NumberofItem               Number of GPIO pads to be updated
32   @param[in] GpioInitTableAddress       GPIO initialization table
33 
34   @retval EFI_SUCCESS                   The function completed successfully
35   @retval EFI_INVALID_PARAMETER         Invalid group or pad number
36 **/
37 EFI_STATUS
38 GpioConfigurePads (
39   IN UINT32                    NumberOfItems,
40   IN GPIO_INIT_CONFIG          *GpioInitTableAddress
41   );
42 
43 //
44 // Functions for setting/getting multiple GpioPad settings
45 //
46 
47 /**
48   This procedure will read multiple GPIO settings
49 
50   @param[in]  GpioPad                   GPIO Pad
51   @param[out] GpioData                  GPIO data structure
52 
53   @retval EFI_SUCCESS                   The function completed successfully
54   @retval EFI_INVALID_PARAMETER         Invalid GpioPad
55 **/
56 EFI_STATUS
57 GpioGetPadConfig (
58   IN  GPIO_PAD               GpioPad,
59   OUT GPIO_CONFIG            *GpioData
60   );
61 
62 /**
63   This procedure will configure multiple GPIO settings
64 
65   @param[in] GpioPad                    GPIO Pad
66   @param[in] GpioData                   GPIO data structure
67 
68   @retval EFI_SUCCESS                   The function completed successfully
69   @retval EFI_INVALID_PARAMETER         Invalid GpioPad
70 **/
71 EFI_STATUS
72 GpioSetPadConfig (
73   IN GPIO_PAD                  GpioPad,
74   IN GPIO_CONFIG               *GpioData
75   );
76 
77 //
78 // Functions for setting/getting single GpioPad properties
79 //
80 
81 /**
82   This procedure will set GPIO output level
83 
84   @param[in] GpioPad              GPIO pad
85   @param[in] Value                Output value
86                                   0: OutputLow, 1: OutputHigh
87 
88   @retval EFI_SUCCESS             The function completed successfully
89   @retval EFI_INVALID_PARAMETER   Invalid GpioPad
90 **/
91 EFI_STATUS
92 GpioSetOutputValue (
93   IN GPIO_PAD                  GpioPad,
94   IN UINT32                    Value
95   );
96 
97 /**
98   This procedure will get GPIO output level
99 
100   @param[in]  GpioPad             GPIO pad
101   @param[out] OutputVal           GPIO Output value
102                                   0: OutputLow, 1: OutputHigh
103 
104   @retval EFI_SUCCESS             The function completed successfully
105   @retval EFI_INVALID_PARAMETER   Invalid GpioPad
106 **/
107 EFI_STATUS
108 GpioGetOutputValue (
109   IN GPIO_PAD                  GpioPad,
110   OUT UINT32                   *OutputVal
111   );
112 
113 /**
114   This procedure will get GPIO input level
115 
116   @param[in]  GpioPad             GPIO pad
117   @param[out] InputVal            GPIO Input value
118                                   0: InputLow, 1: InputHigh
119 
120   @retval EFI_SUCCESS             The function completed successfully
121   @retval EFI_INVALID_PARAMETER   Invalid GpioPad
122 **/
123 EFI_STATUS
124 GpioGetInputValue (
125   IN GPIO_PAD                  GpioPad,
126   OUT UINT32                   *InputVal
127   );
128 
129 /**
130   This procedure will get GPIO IOxAPIC interrupt number
131 
132   @param[in]  GpioPad             GPIO pad
133   @param[out] IrqNum              IRQ number
134 
135   @retval EFI_SUCCESS             The function completed successfully
136   @retval EFI_INVALID_PARAMETER   Invalid GpioPad
137 **/
138 EFI_STATUS
139 GpioGetPadIoApicIrqNumber (
140   IN GPIO_PAD                  GpioPad,
141   OUT UINT32                   *IrqNum
142   );
143 
144 /**
145   This procedure will configure GPIO input inversion
146 
147   @param[in] GpioPad              GPIO pad
148   @param[in] Value                Value for GPIO input inversion
149                                   0: No input inversion, 1: Invert input
150 
151   @retval EFI_SUCCESS             The function completed successfully
152   @retval EFI_INVALID_PARAMETER   Invalid GpioPad
153 **/
154 EFI_STATUS
155 GpioSetInputInversion (
156   IN GPIO_PAD                  GpioPad,
157   IN UINT32                    Value
158   );
159 
160 /**
161   This procedure will get GPIO pad input inversion value
162 
163   @param[in] GpioPad              GPIO pad
164   @param[out] InvertState         GPIO inversion state
165                                   0: No input inversion, 1: Inverted input
166 
167   @retval EFI_SUCCESS             The function completed successfully
168   @retval EFI_INVALID_PARAMETER   Invalid GpioPad
169 **/
170 EFI_STATUS
171 GpioGetInputInversion (
172   IN GPIO_PAD                  GpioPad,
173   OUT UINT32                   *InvertState
174   );
175 
176 /**
177   This procedure will set GPIO interrupt settings
178 
179   @param[in] GpioPad              GPIO pad
180   @param[in] Value                Value of Level/Edge
181                                   use GPIO_INT_CONFIG as argument
182 
183   @retval EFI_SUCCESS             The function completed successfully
184   @retval EFI_INVALID_PARAMETER   Invalid GpioPad
185 **/
186 EFI_STATUS
187 GpioSetPadInterruptConfig (
188   IN GPIO_PAD                 GpioPad,
189   IN GPIO_INT_CONFIG          Value
190   );
191 
192 /**
193   This procedure will set GPIO electrical settings
194 
195   @param[in] GpioPad              GPIO pad
196   @param[in] Value                Value of termination
197                                   use GPIO_ELECTRICAL_CONFIG as argument
198 
199   @retval EFI_SUCCESS             The function completed successfully
200   @retval EFI_INVALID_PARAMETER   Invalid GpioPad
201 **/
202 EFI_STATUS
203 GpioSetPadElectricalConfig (
204   IN GPIO_PAD                  GpioPad,
205   IN GPIO_ELECTRICAL_CONFIG    Value
206   );
207 
208 /**
209   This procedure will set GPIO Reset settings
210 
211   @param[in] GpioPad              GPIO pad
212   @param[in] Value                Value for Pad Reset Configuration
213                                   use GPIO_RESET_CONFIG as argument
214 
215   @retval EFI_SUCCESS             The function completed successfully
216   @retval EFI_INVALID_PARAMETER   Invalid GpioPad
217 **/
218 EFI_STATUS
219 GpioSetPadResetConfig (
220   IN GPIO_PAD                  GpioPad,
221   IN GPIO_RESET_CONFIG         Value
222   );
223 
224 /**
225   This procedure will get GPIO Reset settings
226 
227   @param[in] GpioPad              GPIO pad
228   @param[in] Value                Value of Pad Reset Configuration
229                                   based on GPIO_RESET_CONFIG
230 
231   @retval EFI_SUCCESS             The function completed successfully
232   @retval EFI_INVALID_PARAMETER   Invalid GpioPad
233 **/
234 EFI_STATUS
235 GpioGetPadResetConfig (
236   IN GPIO_PAD                  GpioPad,
237   IN GPIO_RESET_CONFIG         *Value
238   );
239 
240 /**
241   This procedure will get GPIO Host Software Pad Ownership for certain group
242 
243   @param[in]  Group               GPIO group
244   @param[in]  DwNum               Host Ownership register number for current group.
245                                   For group which has less then 32 pads per group DwNum must be 0.
246   @param[out] HostSwRegVal        Value of Host Software Pad Ownership register
247                                   Bit position - PadNumber
248                                   Bit value - 0: ACPI Mode, 1: GPIO Driver mode
249 
250   @retval EFI_SUCCESS             The function completed successfully
251   @retval EFI_INVALID_PARAMETER   Invalid group or DwNum parameter number
252 **/
253 EFI_STATUS
254 GpioGetHostSwOwnershipForGroupDw (
255   IN  GPIO_GROUP                  Group,
256   IN  UINT32                      DwNum,
257   OUT UINT32                      *HostSwRegVal
258   );
259 
260 /**
261   This procedure will get GPIO Host Software Pad Ownership for certain group
262 
263   @param[in]  Group               GPIO group
264   @param[in]  DwNum               Host Ownership register number for current group
265                                   For group which has less then 32 pads per group DwNum must be 0.
266   @param[in]  HostSwRegVal        Value of Host Software Pad Ownership register
267                                   Bit position - PadNumber
268                                   Bit value - 0: ACPI Mode, 1: GPIO Driver mode
269 
270   @retval EFI_SUCCESS             The function completed successfully
271   @retval EFI_INVALID_PARAMETER   Invalid group or DwNum parameter number
272 **/
273 EFI_STATUS
274 GpioSetHostSwOwnershipForGroupDw (
275   IN GPIO_GROUP                   Group,
276   IN UINT32                       DwNum,
277   IN UINT32                       HostSwRegVal
278   );
279 
280 /**
281   This procedure will get Gpio Pad Host Software Ownership
282 
283   @param[in] GpioPad              GPIO pad
284   @param[out] PadHostSwOwn        Value of Host Software Pad Owner
285                                   0: ACPI Mode, 1: GPIO Driver mode
286 
287   @retval EFI_SUCCESS             The function completed successfully
288   @retval EFI_INVALID_PARAMETER   Invalid GpioPad
289 **/
290 EFI_STATUS
291 GpioGetHostSwOwnershipForPad (
292   IN GPIO_PAD                 GpioPad,
293   OUT UINT32                  *PadHostSwOwn
294   );
295 
296 /**
297   This procedure will set Gpio Pad Host Software Ownership
298 
299   @param[in] GpioPad              GPIO pad
300   @param[in]  PadHostSwOwn        Pad Host Software Owner
301                                   0: ACPI Mode, 1: GPIO Driver mode
302 
303   @retval EFI_SUCCESS             The function completed successfully
304   @retval EFI_INVALID_PARAMETER   Invalid GpioPad
305 **/
306 EFI_STATUS
307 GpioSetHostSwOwnershipForPad (
308   IN GPIO_PAD                  GpioPad,
309   IN UINT32                    PadHostSwOwn
310   );
311 
312 ///
313 /// Possible values of Pad Ownership
314 /// If Pad is not under Host ownership then GPIO registers
315 /// are not accessible by host (e.g. BIOS) and reading them
316 /// will return 0xFFs.
317 ///
318 typedef enum {
319   GpioPadOwnHost = 0x0,
320   GpioPadOwnCsme = 0x1,
321   GpioPadOwnIsh  = 0x2,
322 } GPIO_PAD_OWN;
323 
324 /**
325   This procedure will get Gpio Pad Ownership
326 
327   @param[in] GpioPad              GPIO pad
328   @param[out] PadOwnVal           Value of Pad Ownership
329 
330   @retval EFI_SUCCESS             The function completed successfully
331   @retval EFI_INVALID_PARAMETER   Invalid GpioPad
332 **/
333 EFI_STATUS
334 GpioGetPadOwnership (
335   IN  GPIO_PAD                GpioPad,
336   OUT GPIO_PAD_OWN            *PadOwnVal
337   );
338 
339 /**
340   This procedure will check state of Pad Config Lock for pads within one group
341 
342   @param[in]  Group               GPIO group
343   @param[in]  DwNum               PadCfgLock register number for current group.
344                                   For group which has less then 32 pads per group DwNum must be 0.
345   @param[out] PadCfgLockRegVal    Value of PadCfgLock register
346                                   Bit position - PadNumber
347                                   Bit value - 0: NotLocked, 1: Locked
348 
349   @retval EFI_SUCCESS             The function completed successfully
350   @retval EFI_INVALID_PARAMETER   Invalid group or DwNum parameter number
351 **/
352 EFI_STATUS
353 GpioGetPadCfgLockForGroupDw (
354   IN  GPIO_GROUP                  Group,
355   IN  UINT32                      DwNum,
356   OUT UINT32                      *PadCfgLockRegVal
357   );
358 
359 /**
360   This procedure will check state of Pad Config Lock for selected pad
361 
362   @param[in]  GpioPad             GPIO pad
363   @param[out] PadCfgLock          PadCfgLock for selected pad
364                                   0: NotLocked, 1: Locked
365 
366   @retval EFI_SUCCESS             The function completed successfully
367   @retval EFI_INVALID_PARAMETER   Invalid GpioPad
368 **/
369 EFI_STATUS
370 GpioGetPadCfgLock (
371   IN GPIO_PAD                   GpioPad,
372   OUT UINT32                    *PadCfgLock
373   );
374 
375 /**
376   This procedure will check state of Pad Config Tx Lock for pads within one group
377 
378   @param[in]  Group               GPIO group
379   @param[in]  DwNum               PadCfgLockTx register number for current group.
380                                   For group which has less then 32 pads per group DwNum must be 0.
381   @param[out] PadCfgLockTxRegVal  Value of PadCfgLockTx register
382                                   Bit position - PadNumber
383                                   Bit value - 0: NotLockedTx, 1: LockedTx
384 
385   @retval EFI_SUCCESS             The function completed successfully
386   @retval EFI_INVALID_PARAMETER   Invalid group or DwNum parameter number
387 **/
388 EFI_STATUS
389 GpioGetPadCfgLockTxForGroupDw (
390   IN  GPIO_GROUP                  Group,
391   IN  UINT32                      DwNum,
392   OUT UINT32                      *PadCfgLockTxRegVal
393   );
394 
395 /**
396   This procedure will check state of Pad Config Tx Lock for selected pad
397 
398   @param[in]  GpioPad             GPIO pad
399   @param[out] PadCfgLock          PadCfgLockTx for selected pad
400                                   0: NotLockedTx, 1: LockedTx
401 
402   @retval EFI_SUCCESS             The function completed successfully
403   @retval EFI_INVALID_PARAMETER   Invalid GpioPad
404 **/
405 EFI_STATUS
406 GpioGetPadCfgLockTx (
407   IN GPIO_PAD                   GpioPad,
408   OUT UINT32                    *PadCfgLockTx
409   );
410 
411 /**
412   This procedure will clear PadCfgLock for selected pads within one group.
413   Unlocking a pad will cause an SMI (if enabled)
414 
415   @param[in]  Group               GPIO group
416   @param[in]  DwNum               PadCfgLock register number for current group.
417                                   For group which has less then 32 pads per group DwNum must be 0.
418   @param[in]  PadsToUnlock        Bitmask for pads which are going to be unlocked,
419                                   Bit position - PadNumber
420                                   Bit value - 0: DoNotUnlock, 1: Unlock
421 
422   @retval EFI_SUCCESS             The function completed successfully
423   @retval EFI_INVALID_PARAMETER   Invalid group or pad number
424 **/
425 EFI_STATUS
426 GpioUnlockPadCfgForGroupDw (
427   IN GPIO_GROUP                Group,
428   IN UINT32                    DwNum,
429   IN UINT32                    PadsToUnlock
430   );
431 
432 /**
433   This procedure will clear PadCfgLock for selected pad.
434   Unlocking a pad will cause an SMI (if enabled)
435 
436   @param[in] GpioPad              GPIO pad
437 
438   @retval EFI_SUCCESS             The function completed successfully
439   @retval EFI_INVALID_PARAMETER   Invalid GpioPad
440 **/
441 EFI_STATUS
442 GpioUnlockPadCfg (
443   IN GPIO_PAD                   GpioPad
444   );
445 
446 /**
447   This procedure will set PadCfgLock for selected pads within one group
448 
449   @param[in]  Group               GPIO group
450   @param[in]  DwNum               PadCfgLock register number for current group.
451                                   For group which has less then 32 pads per group DwNum must be 0.
452   @param[in]  PadsToLock          Bitmask for pads which are going to be locked,
453                                   Bit position - PadNumber
454                                   Bit value - 0: DoNotLock, 1: Lock
455 
456   @retval EFI_SUCCESS             The function completed successfully
457   @retval EFI_INVALID_PARAMETER   Invalid group or DwNum parameter number
458 **/
459 EFI_STATUS
460 GpioLockPadCfgForGroupDw (
461   IN GPIO_GROUP                   Group,
462   IN UINT32                       DwNum,
463   IN UINT32                       PadsToLock
464   );
465 
466 /**
467   This procedure will set PadCfgLock for selected pad
468 
469   @param[in] GpioPad              GPIO pad
470 
471   @retval EFI_SUCCESS             The function completed successfully
472   @retval EFI_INVALID_PARAMETER   Invalid GpioPad
473 **/
474 EFI_STATUS
475 GpioLockPadCfg (
476   IN GPIO_PAD                   GpioPad
477   );
478 
479 /**
480   This procedure will clear PadCfgLockTx for selected pads within one group.
481   Unlocking a pad will cause an SMI (if enabled)
482 
483   @param[in]  Group               GPIO group
484   @param[in]  DwNum               PadCfgLockTx register number for current group.
485                                   For group which has less then 32 pads per group DwNum must be 0.
486   @param[in]  PadsToUnlockTx      Bitmask for pads which are going to be unlocked,
487                                   Bit position - PadNumber
488                                   Bit value - 0: DoNotUnLockTx, 1: LockTx
489 
490   @retval EFI_SUCCESS             The function completed successfully
491   @retval EFI_INVALID_PARAMETER   Invalid group or pad number
492 **/
493 EFI_STATUS
494 GpioUnlockPadCfgTxForGroupDw (
495   IN GPIO_GROUP                Group,
496   IN UINT32                    DwNum,
497   IN UINT32                    PadsToUnlockTx
498   );
499 
500 /**
501   This procedure will clear PadCfgLockTx for selected pad.
502   Unlocking a pad will cause an SMI (if enabled)
503 
504   @param[in] GpioPad              GPIO pad
505 
506   @retval EFI_SUCCESS             The function completed successfully
507   @retval EFI_INVALID_PARAMETER   Invalid GpioPad
508 **/
509 EFI_STATUS
510 GpioUnlockPadCfgTx (
511   IN GPIO_PAD                   GpioPad
512   );
513 
514 /**
515   This procedure will set PadCfgLockTx for selected pads within one group
516 
517   @param[in]  Group               GPIO group
518   @param[in]  DwNum               PadCfgLock register number for current group.
519                                   For group which has less then 32 pads per group DwNum must be 0.
520   @param[in]  PadsToLockTx        Bitmask for pads which are going to be locked,
521                                   Bit position - PadNumber
522                                   Bit value - 0: DoNotLockTx, 1: LockTx
523 
524   @retval EFI_SUCCESS             The function completed successfully
525   @retval EFI_INVALID_PARAMETER   Invalid group or DwNum parameter number
526 **/
527 EFI_STATUS
528 GpioLockPadCfgTxForGroupDw (
529   IN GPIO_GROUP                   Group,
530   IN UINT32                       DwNum,
531   IN UINT32                       PadsToLockTx
532   );
533 
534 /**
535   This procedure will set PadCfgLockTx for selected pad
536 
537   @param[in] GpioPad              GPIO pad
538 
539   @retval EFI_SUCCESS             The function completed successfully
540   @retval EFI_INVALID_PARAMETER   Invalid GpioPad
541 **/
542 EFI_STATUS
543 GpioLockPadCfgTx (
544   IN GPIO_PAD                   GpioPad
545   );
546 
547 /**
548   This procedure will get Group to GPE mapping.
549   Refer to BWG and EDS for GPIO GPE information.
550 
551   @param[out] GroupToGpeDw0       GPIO group to be mapped to GPE_DW0
552   @param[out] GroupToGpeDw1       GPIO group to be mapped to GPE_DW1
553   @param[out] GroupToGpeDw2       GPIO group to be mapped to GPE_DW2
554 
555   @retval EFI_SUCCESS             The function completed successfully
556   @retval EFI_INVALID_PARAMETER   Invalid group or pad number
557 **/
558 EFI_STATUS
559 GpioGetGroupToGpeDwX (
560   IN GPIO_GROUP               *GroupToGpeDw0,
561   IN GPIO_GROUP               *GroupToGpeDw1,
562   IN GPIO_GROUP               *GroupToGpeDw2
563   );
564 
565 /**
566   This procedure will set Group to GPE mapping.
567   Refer to BWG and EDS for GPIO GPE information.
568 
569   @param[in]  GroupToGpeDw0       GPIO group to be mapped to GPE_DW0
570   @param[in]  GroupToGpeDw1       GPIO group to be mapped to GPE_DW1
571   @param[in]  GroupToGpeDw2       GPIO group to be mapped to GPE_DW2
572 
573   @retval EFI_SUCCESS             The function completed successfully
574   @retval EFI_INVALID_PARAMETER   Invalid group or pad number
575 **/
576 EFI_STATUS
577 GpioSetGroupToGpeDwX (
578   IN GPIO_GROUP                GroupToGpeDw0,
579   IN GPIO_GROUP                GroupToGpeDw1,
580   IN GPIO_GROUP                GroupToGpeDw2
581   );
582 
583 /**
584   This procedure will get GPE number for provided GpioPad.
585   PCH allows to configure mapping between GPIO groups and related GPE (GpioSetGroupToGpeDwX())
586   what results in the fact that certain Pad can cause different General Purpose Event. Only three
587   GPIO groups can be mapped to cause unique GPE (1-tier), all others groups will be under one common
588   event (GPE_111 for 2-tier).
589 
590   1-tier:
591   Returned GpeNumber is in range <0,95>. GpioGetGpeNumber() can be used
592   to determine what _LXX ACPI method would be called on event on selected GPIO pad
593 
594   2-tier:
595   Returned GpeNumber is 0x6F (111). All GPIO pads which are not mapped to 1-tier GPE
596   will be under one master GPE_111 which is linked to _L6F ACPI method. If it is needed to determine
597   what Pad from 2-tier has caused the event, _L6F method should check GPI_GPE_STS and GPI_GPE_EN
598   registers for all GPIO groups not mapped to 1-tier GPE.
599 
600   @param[in]  GpioPad             GPIO pad
601   @param[out] GpeNumber           GPE number
602 
603   @retval EFI_SUCCESS             The function completed successfully
604   @retval EFI_INVALID_PARAMETER   Invalid GpioPad
605 **/
606 EFI_STATUS
607 GpioGetGpeNumber (
608   IN GPIO_PAD                   GpioPad,
609   OUT UINT32                    *GpeNumber
610   );
611 
612 /**
613   This procedure is used to clear SMI STS for a specified Pad
614 
615   @param[in]  GpioPad             GPIO pad
616 
617   @retval EFI_SUCCESS             The function completed successfully
618   @retval EFI_INVALID_PARAMETER   Invalid GpioPad
619 **/
620 EFI_STATUS
621 GpioClearGpiSmiSts (
622   IN GPIO_PAD                   GpioPad
623   );
624 
625 /**
626   This procedure is used by Smi Dispatcher and will clear
627   all GPI SMI Status bits
628 
629   @retval EFI_SUCCESS             The function completed successfully
630 **/
631 EFI_STATUS
632 GpioClearAllGpiSmiSts (
633   VOID
634   );
635 
636 /**
637   This procedure is used to disable all GPI SMI
638 
639   @retval EFI_SUCCESS             The function completed successfully
640 **/
641 EFI_STATUS
642 GpioDisableAllGpiSmi (
643   VOID
644   );
645 
646 /**
647   This procedure is used to register GPI SMI dispatch function.
648 
649   @param[in]  GpioPad             GPIO pad
650   @param[out] GpiNum              GPI number
651 
652   @retval EFI_SUCCESS             The function completed successfully
653   @retval EFI_INVALID_PARAMETER   Invalid GpioPad
654 **/
655 EFI_STATUS
656 GpioGetGpiSmiNum (
657   IN GPIO_PAD          GpioPad,
658   OUT UINTN            *GpiNum
659   );
660 
661 /**
662   This procedure is used to check GPIO inputs belongs to 2 tier or 1 tier architecture
663 
664   @param[in]  GpioPad             GPIO pad
665 
666   @retval     Data                0 means 1-tier, 1 means 2-tier
667 **/
668 BOOLEAN
669 GpioCheckFor2Tier (
670   IN GPIO_PAD                  GpioPad
671   );
672 
673 /**
674   This procedure is used to clear GPE STS for a specified GpioPad
675 
676   @param[in]  GpioPad             GPIO pad
677 
678   @retval EFI_SUCCESS             The function completed successfully
679   @retval EFI_INVALID_PARAMETER   Invalid GpioPad
680 **/
681 EFI_STATUS
682 GpioClearGpiGpeSts (
683   IN GPIO_PAD                  GpioPad
684   );
685 
686 /**
687   This procedure is used to read GPE STS for a specified Pad
688 
689   @param[in]  GpioPad             GPIO pad
690   @param[out] Data                GPE STS data
691 
692   @retval EFI_SUCCESS             The function completed successfully
693   @retval EFI_INVALID_PARAMETER   Invalid GpioPad
694 **/
695 EFI_STATUS
696 GpioGetGpiGpeSts (
697   IN GPIO_PAD                  GpioPad,
698   OUT UINT32*                  Data
699   );
700 
701 #endif // _GPIO_LIB_H_
702