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