Subversion Repositories Kolibri OS

Rev

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);