Rev 1498 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1498 | Rev 2216 | ||
---|---|---|---|
Line 6... | Line 6... | ||
6 | 6 | ||
7 | /****************************************************************************** |
7 | /****************************************************************************** |
8 | * |
8 | * |
9 | * 1. Copyright Notice |
9 | * 1. Copyright Notice |
10 | * |
10 | * |
11 | * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. |
11 | * Some or all of this work - Copyright (c) 1999 - 2011, Intel Corp. |
12 | * All rights reserved. |
12 | * All rights reserved. |
13 | * |
13 | * |
14 | * 2. License |
14 | * 2. License |
15 | * |
15 | * |
Line 175... | Line 175... | ||
175 | ACPI_EXPORT_SYMBOL (AcpiInstallExceptionHandler) |
175 | ACPI_EXPORT_SYMBOL (AcpiInstallExceptionHandler) |
Line 176... | Line 176... | ||
176 | 176 | ||
177 | 177 | ||
- | 178 | /******************************************************************************* |
|
- | 179 | * |
|
- | 180 | * FUNCTION: AcpiInstallGlobalEventHandler |
|
- | 181 | * |
|
- | 182 | * PARAMETERS: Handler - Pointer to the global event handler function |
|
- | 183 | * Context - Value passed to the handler on each event |
|
- | 184 | * |
|
- | 185 | * RETURN: Status |
|
- | 186 | * |
|
- | 187 | * DESCRIPTION: Saves the pointer to the handler function. The global handler |
|
- | 188 | * is invoked upon each incoming GPE and Fixed Event. It is |
|
- | 189 | * invoked at interrupt level at the time of the event dispatch. |
|
- | 190 | * Can be used to update event counters, etc. |
|
- | 191 | * |
|
- | 192 | ******************************************************************************/ |
|
- | 193 | ||
- | 194 | ACPI_STATUS |
|
- | 195 | AcpiInstallGlobalEventHandler ( |
|
- | 196 | ACPI_GBL_EVENT_HANDLER Handler, |
|
- | 197 | void *Context) |
|
- | 198 | { |
|
- | 199 | ACPI_STATUS Status; |
|
- | 200 | ||
- | 201 | ||
- | 202 | ACPI_FUNCTION_TRACE (AcpiInstallGlobalEventHandler); |
|
- | 203 | ||
- | 204 | ||
- | 205 | /* Parameter validation */ |
|
- | 206 | ||
- | 207 | if (!Handler) |
|
- | 208 | { |
|
- | 209 | return_ACPI_STATUS (AE_BAD_PARAMETER); |
|
- | 210 | } |
|
- | 211 | ||
- | 212 | Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS); |
|
- | 213 | if (ACPI_FAILURE (Status)) |
|
- | 214 | { |
|
- | 215 | return_ACPI_STATUS (Status); |
|
- | 216 | } |
|
- | 217 | ||
- | 218 | /* Don't allow two handlers. */ |
|
- | 219 | ||
- | 220 | if (AcpiGbl_GlobalEventHandler) |
|
- | 221 | { |
|
- | 222 | Status = AE_ALREADY_EXISTS; |
|
- | 223 | goto Cleanup; |
|
- | 224 | } |
|
- | 225 | ||
- | 226 | AcpiGbl_GlobalEventHandler = Handler; |
|
- | 227 | AcpiGbl_GlobalEventHandlerContext = Context; |
|
- | 228 | ||
- | 229 | ||
- | 230 | Cleanup: |
|
- | 231 | (void) AcpiUtReleaseMutex (ACPI_MTX_EVENTS); |
|
- | 232 | return_ACPI_STATUS (Status); |
|
- | 233 | } |
|
- | 234 | ||
- | 235 | ACPI_EXPORT_SYMBOL (AcpiInstallGlobalEventHandler) |
|
- | 236 | ||
- | 237 | ||
178 | /******************************************************************************* |
238 | /******************************************************************************* |
179 | * |
239 | * |
180 | * FUNCTION: AcpiInstallFixedEventHandler |
240 | * FUNCTION: AcpiInstallFixedEventHandler |
181 | * |
241 | * |
182 | * PARAMETERS: Event - Event type to enable. |
242 | * PARAMETERS: Event - Event type to enable. |
Line 689... | Line 749... | ||
689 | ACPI_STATUS |
749 | ACPI_STATUS |
690 | AcpiInstallGpeHandler ( |
750 | AcpiInstallGpeHandler ( |
691 | ACPI_HANDLE GpeDevice, |
751 | ACPI_HANDLE GpeDevice, |
692 | UINT32 GpeNumber, |
752 | UINT32 GpeNumber, |
693 | UINT32 Type, |
753 | UINT32 Type, |
694 | ACPI_EVENT_HANDLER Address, |
754 | ACPI_GPE_HANDLER Address, |
695 | void *Context) |
755 | void *Context) |
696 | { |
756 | { |
697 | ACPI_GPE_EVENT_INFO *GpeEventInfo; |
757 | ACPI_GPE_EVENT_INFO *GpeEventInfo; |
698 | ACPI_HANDLER_INFO *Handler; |
758 | ACPI_GPE_HANDLER_INFO *Handler; |
699 | ACPI_STATUS Status; |
759 | ACPI_STATUS Status; |
700 | ACPI_CPU_FLAGS Flags; |
760 | ACPI_CPU_FLAGS Flags; |
Line 701... | Line 761... | ||
701 | 761 | ||
Line 714... | Line 774... | ||
714 | if (ACPI_FAILURE (Status)) |
774 | if (ACPI_FAILURE (Status)) |
715 | { |
775 | { |
716 | return_ACPI_STATUS (Status); |
776 | return_ACPI_STATUS (Status); |
717 | } |
777 | } |
Line -... | Line 778... | ||
- | 778 | ||
- | 779 | /* Allocate and init handler object (before lock) */ |
|
- | 780 | ||
- | 781 | Handler = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_GPE_HANDLER_INFO)); |
|
- | 782 | if (!Handler) |
|
- | 783 | { |
|
- | 784 | Status = AE_NO_MEMORY; |
|
- | 785 | goto UnlockAndExit; |
|
- | 786 | } |
|
- | 787 | ||
- | 788 | Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock); |
|
718 | 789 | ||
Line 719... | Line 790... | ||
719 | /* Ensure that we have a valid GPE number */ |
790 | /* Ensure that we have a valid GPE number */ |
720 | 791 | ||
721 | GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber); |
792 | GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber); |
722 | if (!GpeEventInfo) |
793 | if (!GpeEventInfo) |
723 | { |
794 | { |
724 | Status = AE_BAD_PARAMETER; |
795 | Status = AE_BAD_PARAMETER; |
Line 725... | Line 796... | ||
725 | goto UnlockAndExit; |
796 | goto FreeAndExit; |
Line 726... | Line 797... | ||
726 | } |
797 | } |
727 | 798 | ||
728 | /* Make sure that there isn't a handler there already */ |
799 | /* Make sure that there isn't a handler there already */ |
729 | 800 | ||
730 | if ((GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK) == |
801 | if ((GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK) == |
731 | ACPI_GPE_DISPATCH_HANDLER) |
- | |
732 | { |
- | |
733 | Status = AE_ALREADY_EXISTS; |
- | |
734 | goto UnlockAndExit; |
- | |
735 | } |
- | |
736 | - | ||
737 | /* Allocate and init handler object */ |
- | |
738 | - | ||
739 | Handler = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_HANDLER_INFO)); |
- | |
740 | if (!Handler) |
802 | ACPI_GPE_DISPATCH_HANDLER) |
Line 741... | Line 803... | ||
741 | { |
803 | { |
742 | Status = AE_NO_MEMORY; |
804 | Status = AE_ALREADY_EXISTS; |
743 | goto UnlockAndExit; |
805 | goto FreeAndExit; |
- | 806 | } |
|
- | 807 | ||
Line -... | Line 808... | ||
- | 808 | Handler->Address = Address; |
|
- | 809 | Handler->Context = Context; |
|
- | 810 | Handler->MethodNode = GpeEventInfo->Dispatch.MethodNode; |
|
744 | } |
811 | Handler->OriginalFlags = (UINT8) (GpeEventInfo->Flags & |
- | 812 | (ACPI_GPE_XRUPT_TYPE_MASK | ACPI_GPE_DISPATCH_MASK)); |
|
- | 813 | ||
- | 814 | /* |
|
- | 815 | * If the GPE is associated with a method, it may have been enabled |
|
- | 816 | * automatically during initialization, in which case it has to be |
|
- | 817 | * disabled now to avoid spurious execution of the handler. |
|
- | 818 | */ |
|
Line 745... | Line 819... | ||
745 | 819 | if (((Handler->OriginalFlags & ACPI_GPE_DISPATCH_METHOD) || |
|
- | 820 | (Handler->OriginalFlags & ACPI_GPE_DISPATCH_NOTIFY)) && |
|
746 | Handler->Address = Address; |
821 | GpeEventInfo->RuntimeCount) |
747 | Handler->Context = Context; |
822 | { |
- | 823 | Handler->OriginallyEnabled = TRUE; |
|
748 | Handler->MethodNode = GpeEventInfo->Dispatch.MethodNode; |
824 | (void) AcpiEvRemoveGpeReference (GpeEventInfo); |
749 | 825 | ||
Line 750... | Line 826... | ||
750 | /* Disable the GPE before installing the handler */ |
826 | /* Sanity check of original type against new type */ |
Line 751... | Line -... | ||
751 | - | ||
752 | Status = AcpiEvDisableGpe (GpeEventInfo); |
827 | |
Line 753... | Line 828... | ||
753 | if (ACPI_FAILURE (Status)) |
828 | if (Type != (UINT32) (GpeEventInfo->Flags & ACPI_GPE_XRUPT_TYPE_MASK)) |
Line 754... | Line 829... | ||
754 | { |
829 | { |
755 | goto UnlockAndExit; |
830 | ACPI_WARNING ((AE_INFO, "GPE type mismatch (level/edge)")); |
Line 756... | Line 831... | ||
756 | } |
831 | } |
Line 757... | Line 832... | ||
757 | 832 | } |
|
758 | /* Install the handler */ |
833 | |
759 | 834 | /* Install the handler */ |
|
- | 835 | ||
- | 836 | GpeEventInfo->Dispatch.Handler = Handler; |
|
- | 837 | ||
- | 838 | /* Setup up dispatch flags to indicate handler (vs. method/notify) */ |
|
- | 839 | ||
760 | Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock); |
840 | GpeEventInfo->Flags &= ~(ACPI_GPE_XRUPT_TYPE_MASK | ACPI_GPE_DISPATCH_MASK); |
Line 761... | Line 841... | ||
761 | GpeEventInfo->Dispatch.Handler = Handler; |
841 | GpeEventInfo->Flags |= (UINT8) (Type | ACPI_GPE_DISPATCH_HANDLER); |
Line 793... | Line 873... | ||
793 | 873 | ||
794 | ACPI_STATUS |
874 | ACPI_STATUS |
795 | AcpiRemoveGpeHandler ( |
875 | AcpiRemoveGpeHandler ( |
796 | ACPI_HANDLE GpeDevice, |
876 | ACPI_HANDLE GpeDevice, |
797 | UINT32 GpeNumber, |
877 | UINT32 GpeNumber, |
798 | ACPI_EVENT_HANDLER Address) |
878 | ACPI_GPE_HANDLER Address) |
799 | { |
879 | { |
800 | ACPI_GPE_EVENT_INFO *GpeEventInfo; |
880 | ACPI_GPE_EVENT_INFO *GpeEventInfo; |
801 | ACPI_HANDLER_INFO *Handler; |
881 | ACPI_GPE_HANDLER_INFO *Handler; |
802 | ACPI_STATUS Status; |
882 | ACPI_STATUS Status; |
Line 803... | Line 883... | ||
803 | ACPI_CPU_FLAGS Flags; |
883 | ACPI_CPU_FLAGS Flags; |
Line 817... | Line 897... | ||
817 | if (ACPI_FAILURE (Status)) |
897 | if (ACPI_FAILURE (Status)) |
818 | { |
898 | { |
819 | return_ACPI_STATUS (Status); |
899 | return_ACPI_STATUS (Status); |
820 | } |
900 | } |
Line -... | Line 901... | ||
- | 901 | ||
- | 902 | Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock); |
|
821 | 903 | ||
Line 822... | Line 904... | ||
822 | /* Ensure that we have a valid GPE number */ |
904 | /* Ensure that we have a valid GPE number */ |
823 | 905 | ||
824 | GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber); |
906 | GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber); |
Line 843... | Line 925... | ||
843 | { |
925 | { |
844 | Status = AE_BAD_PARAMETER; |
926 | Status = AE_BAD_PARAMETER; |
845 | goto UnlockAndExit; |
927 | goto UnlockAndExit; |
846 | } |
928 | } |
Line 847... | Line -... | ||
847 | - | ||
848 | /* Disable the GPE before removing the handler */ |
- | |
849 | - | ||
850 | Status = AcpiEvDisableGpe (GpeEventInfo); |
- | |
851 | if (ACPI_FAILURE (Status)) |
- | |
852 | { |
- | |
853 | goto UnlockAndExit; |
- | |
854 | } |
- | |
855 | 929 | ||
Line 856... | Line -... | ||
856 | /* Remove the handler */ |
- | |
857 | 930 | /* Remove the handler */ |
|
Line 858... | Line 931... | ||
858 | Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock); |
931 | |
Line 859... | Line 932... | ||
859 | Handler = GpeEventInfo->Dispatch.Handler; |
932 | Handler = GpeEventInfo->Dispatch.Handler; |
- | 933 | ||
- | 934 | /* Restore Method node (if any), set dispatch flags */ |
|
- | 935 | ||
- | 936 | GpeEventInfo->Dispatch.MethodNode = Handler->MethodNode; |
|
- | 937 | GpeEventInfo->Flags &= |
|
- | 938 | ~(ACPI_GPE_XRUPT_TYPE_MASK | ACPI_GPE_DISPATCH_MASK); |
|
- | 939 | GpeEventInfo->Flags |= Handler->OriginalFlags; |
|
- | 940 | ||
- | 941 | /* |
|
860 | 942 | * If the GPE was previously associated with a method and it was |
|
861 | /* Restore Method node (if any), set dispatch flags */ |
943 | * enabled, it should be enabled at this point to restore the |
862 | 944 | * post-initialization configuration. |
|
863 | GpeEventInfo->Dispatch.MethodNode = Handler->MethodNode; |
945 | */ |
864 | GpeEventInfo->Flags &= ~ACPI_GPE_DISPATCH_MASK; /* Clear bits */ |
946 | if ((Handler->OriginalFlags & ACPI_GPE_DISPATCH_METHOD) && |
865 | if (Handler->MethodNode) |
- | |
Line 866... | Line 947... | ||
866 | { |
947 | Handler->OriginallyEnabled) |
Line 867... | Line 948... | ||
867 | GpeEventInfo->Flags |= ACPI_GPE_DISPATCH_METHOD; |
948 | { |
Line 868... | Line 949... | ||
868 | } |
949 | (void) AcpiEvAddGpeReference (GpeEventInfo); |
- | 950 | } |
|
869 | AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags); |
951 | |
870 | 952 | /* Now we can free the handler object */ |
|
871 | /* Now we can free the handler object */ |
953 | |
Line 872... | Line 954... | ||
872 | 954 | ACPI_FREE (Handler); |