Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/drivers/acpi/acpica/evsci.c
15109 views
1
/*******************************************************************************
2
*
3
* Module Name: evsci - System Control Interrupt configuration and
4
* legacy to ACPI mode state transition functions
5
*
6
******************************************************************************/
7
8
/*
9
* Copyright (C) 2000 - 2011, Intel Corp.
10
* All rights reserved.
11
*
12
* Redistribution and use in source and binary forms, with or without
13
* modification, are permitted provided that the following conditions
14
* are met:
15
* 1. Redistributions of source code must retain the above copyright
16
* notice, this list of conditions, and the following disclaimer,
17
* without modification.
18
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
19
* substantially similar to the "NO WARRANTY" disclaimer below
20
* ("Disclaimer") and any redistribution must be conditioned upon
21
* including a substantially similar Disclaimer requirement for further
22
* binary redistribution.
23
* 3. Neither the names of the above-listed copyright holders nor the names
24
* of any contributors may be used to endorse or promote products derived
25
* from this software without specific prior written permission.
26
*
27
* Alternatively, this software may be distributed under the terms of the
28
* GNU General Public License ("GPL") version 2 as published by the Free
29
* Software Foundation.
30
*
31
* NO WARRANTY
32
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
33
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
34
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
35
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
36
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
37
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
38
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
41
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
42
* POSSIBILITY OF SUCH DAMAGES.
43
*/
44
45
#include <acpi/acpi.h>
46
#include "accommon.h"
47
#include "acevents.h"
48
49
#define _COMPONENT ACPI_EVENTS
50
ACPI_MODULE_NAME("evsci")
51
52
/* Local prototypes */
53
static u32 ACPI_SYSTEM_XFACE acpi_ev_sci_xrupt_handler(void *context);
54
55
/*******************************************************************************
56
*
57
* FUNCTION: acpi_ev_sci_xrupt_handler
58
*
59
* PARAMETERS: Context - Calling Context
60
*
61
* RETURN: Status code indicates whether interrupt was handled.
62
*
63
* DESCRIPTION: Interrupt handler that will figure out what function or
64
* control method to call to deal with a SCI.
65
*
66
******************************************************************************/
67
68
static u32 ACPI_SYSTEM_XFACE acpi_ev_sci_xrupt_handler(void *context)
69
{
70
struct acpi_gpe_xrupt_info *gpe_xrupt_list = context;
71
u32 interrupt_handled = ACPI_INTERRUPT_NOT_HANDLED;
72
73
ACPI_FUNCTION_TRACE(ev_sci_xrupt_handler);
74
75
/*
76
* We are guaranteed by the ACPI CA initialization/shutdown code that
77
* if this interrupt handler is installed, ACPI is enabled.
78
*/
79
80
/*
81
* Fixed Events:
82
* Check for and dispatch any Fixed Events that have occurred
83
*/
84
interrupt_handled |= acpi_ev_fixed_event_detect();
85
86
/*
87
* General Purpose Events:
88
* Check for and dispatch any GPEs that have occurred
89
*/
90
interrupt_handled |= acpi_ev_gpe_detect(gpe_xrupt_list);
91
92
return_UINT32(interrupt_handled);
93
}
94
95
/*******************************************************************************
96
*
97
* FUNCTION: acpi_ev_gpe_xrupt_handler
98
*
99
* PARAMETERS: Context - Calling Context
100
*
101
* RETURN: Status code indicates whether interrupt was handled.
102
*
103
* DESCRIPTION: Handler for GPE Block Device interrupts
104
*
105
******************************************************************************/
106
107
u32 ACPI_SYSTEM_XFACE acpi_ev_gpe_xrupt_handler(void *context)
108
{
109
struct acpi_gpe_xrupt_info *gpe_xrupt_list = context;
110
u32 interrupt_handled = ACPI_INTERRUPT_NOT_HANDLED;
111
112
ACPI_FUNCTION_TRACE(ev_gpe_xrupt_handler);
113
114
/*
115
* We are guaranteed by the ACPI CA initialization/shutdown code that
116
* if this interrupt handler is installed, ACPI is enabled.
117
*/
118
119
/* GPEs: Check for and dispatch any GPEs that have occurred */
120
121
interrupt_handled |= acpi_ev_gpe_detect(gpe_xrupt_list);
122
123
return_UINT32(interrupt_handled);
124
}
125
126
/******************************************************************************
127
*
128
* FUNCTION: acpi_ev_install_sci_handler
129
*
130
* PARAMETERS: none
131
*
132
* RETURN: Status
133
*
134
* DESCRIPTION: Installs SCI handler.
135
*
136
******************************************************************************/
137
138
u32 acpi_ev_install_sci_handler(void)
139
{
140
u32 status = AE_OK;
141
142
ACPI_FUNCTION_TRACE(ev_install_sci_handler);
143
144
status =
145
acpi_os_install_interrupt_handler((u32) acpi_gbl_FADT.sci_interrupt,
146
acpi_ev_sci_xrupt_handler,
147
acpi_gbl_gpe_xrupt_list_head);
148
return_ACPI_STATUS(status);
149
}
150
151
/******************************************************************************
152
*
153
* FUNCTION: acpi_ev_remove_sci_handler
154
*
155
* PARAMETERS: none
156
*
157
* RETURN: E_OK if handler uninstalled OK, E_ERROR if handler was not
158
* installed to begin with
159
*
160
* DESCRIPTION: Remove the SCI interrupt handler. No further SCIs will be
161
* taken.
162
*
163
* Note: It doesn't seem important to disable all events or set the event
164
* enable registers to their original values. The OS should disable
165
* the SCI interrupt level when the handler is removed, so no more
166
* events will come in.
167
*
168
******************************************************************************/
169
170
acpi_status acpi_ev_remove_sci_handler(void)
171
{
172
acpi_status status;
173
174
ACPI_FUNCTION_TRACE(ev_remove_sci_handler);
175
176
/* Just let the OS remove the handler and disable the level */
177
178
status =
179
acpi_os_remove_interrupt_handler((u32) acpi_gbl_FADT.sci_interrupt,
180
acpi_ev_sci_xrupt_handler);
181
182
return_ACPI_STATUS(status);
183
}
184
185