Merge remote-tracking branch 'mkp-scsi/4.7/scsi-fixes' into fixes
[sfrench/cifs-2.6.git] / drivers / gpu / drm / amd / powerplay / eventmgr / eventmanagement.c
1 /*
2  * Copyright 2015 Advanced Micro Devices, Inc.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included in
12  * all copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20  * OTHER DEALINGS IN THE SOFTWARE.
21  *
22  */
23 #include "eventmanagement.h"
24 #include "eventmgr.h"
25 #include "eventactionchains.h"
26
27 int pem_init_event_action_chains(struct pp_eventmgr *eventmgr)
28 {
29         int i;
30
31         for (i = 0; i < AMD_PP_EVENT_MAX; i++)
32                 eventmgr->event_chain[i] = NULL;
33
34         eventmgr->event_chain[AMD_PP_EVENT_SUSPEND] = pem_get_suspend_action_chain(eventmgr);
35         eventmgr->event_chain[AMD_PP_EVENT_INITIALIZE] = pem_get_initialize_action_chain(eventmgr);
36         eventmgr->event_chain[AMD_PP_EVENT_UNINITIALIZE] = pem_get_uninitialize_action_chain(eventmgr);
37         eventmgr->event_chain[AMD_PP_EVENT_POWER_SOURCE_CHANGE] = pem_get_power_source_change_action_chain(eventmgr);
38         eventmgr->event_chain[AMD_PP_EVENT_HIBERNATE] = pem_get_hibernate_action_chain(eventmgr);
39         eventmgr->event_chain[AMD_PP_EVENT_RESUME] = pem_get_resume_action_chain(eventmgr);
40         eventmgr->event_chain[AMD_PP_EVENT_THERMAL_NOTIFICATION] = pem_get_thermal_notification_action_chain(eventmgr);
41         eventmgr->event_chain[AMD_PP_EVENT_VBIOS_NOTIFICATION] = pem_get_vbios_notification_action_chain(eventmgr);
42         eventmgr->event_chain[AMD_PP_EVENT_ENTER_THERMAL_STATE] = pem_get_enter_thermal_state_action_chain(eventmgr);
43         eventmgr->event_chain[AMD_PP_EVENT_EXIT_THERMAL_STATE] = pem_get_exit_thermal_state_action_chain(eventmgr);
44         eventmgr->event_chain[AMD_PP_EVENT_ENABLE_POWER_PLAY] = pem_get_enable_powerplay_action_chain(eventmgr);
45         eventmgr->event_chain[AMD_PP_EVENT_DISABLE_POWER_PLAY] = pem_get_disable_powerplay_action_chain(eventmgr);
46         eventmgr->event_chain[AMD_PP_EVENT_ENABLE_OVER_DRIVE_TEST] = pem_get_enable_overdrive_test_action_chain(eventmgr);
47         eventmgr->event_chain[AMD_PP_EVENT_DISABLE_OVER_DRIVE_TEST] = pem_get_disable_overdrive_test_action_chain(eventmgr);
48         eventmgr->event_chain[AMD_PP_EVENT_ENABLE_GFX_CLOCK_GATING] = pem_get_enable_gfx_clock_gating_action_chain(eventmgr);
49         eventmgr->event_chain[AMD_PP_EVENT_DISABLE_GFX_CLOCK_GATING] = pem_get_disable_gfx_clock_gating_action_chain(eventmgr);
50         eventmgr->event_chain[AMD_PP_EVENT_ENABLE_CGPG] = pem_get_enable_cgpg_action_chain(eventmgr);
51         eventmgr->event_chain[AMD_PP_EVENT_DISABLE_CGPG] = pem_get_disable_cgpg_action_chain(eventmgr);
52         eventmgr->event_chain[AMD_PP_EVENT_COMPLETE_INIT] = pem_get_complete_init_action_chain(eventmgr);
53         eventmgr->event_chain[AMD_PP_EVENT_SCREEN_ON] = pem_get_screen_on_action_chain(eventmgr);
54         eventmgr->event_chain[AMD_PP_EVENT_SCREEN_OFF] = pem_get_screen_off_action_chain(eventmgr);
55         eventmgr->event_chain[AMD_PP_EVENT_PRE_SUSPEND] = pem_get_pre_suspend_action_chain(eventmgr);
56         eventmgr->event_chain[AMD_PP_EVENT_PRE_RESUME] = pem_get_pre_resume_action_chain(eventmgr);
57         eventmgr->event_chain[AMD_PP_EVENT_ENABLE_USER_STATE] = pem_enable_user_state_action_chain(eventmgr);
58         eventmgr->event_chain[AMD_PP_EVENT_READJUST_POWER_STATE] = pem_readjust_power_state_action_chain(eventmgr);
59         eventmgr->event_chain[AMD_PP_EVENT_DISPLAY_CONFIG_CHANGE] = pem_display_config_change_action_chain(eventmgr);
60         return 0;
61 }
62
63 int pem_excute_event_chain(struct pp_eventmgr *eventmgr, const struct action_chain *event_chain, struct pem_event_data *event_data)
64 {
65         const pem_event_action * const *paction_chain;
66         const pem_event_action *psub_chain;
67         int tmp_result = 0;
68         int result = 0;
69
70         if (eventmgr == NULL || event_chain == NULL || event_data == NULL)
71                 return -EINVAL;
72
73         for (paction_chain = event_chain->action_chain; NULL != *paction_chain; paction_chain++) {
74                 if (0 != result)
75                         return result;
76
77                 for (psub_chain = *paction_chain; NULL != *psub_chain; psub_chain++) {
78                         tmp_result = (*psub_chain)(eventmgr, event_data);
79                         if (0 == result)
80                                 result = tmp_result;
81                 }
82         }
83
84         return result;
85 }
86
87 const struct action_chain *pem_get_suspend_action_chain(struct pp_eventmgr *eventmgr)
88 {
89         return &suspend_action_chain;
90 }
91
92 const struct action_chain *pem_get_initialize_action_chain(struct pp_eventmgr *eventmgr)
93 {
94         return &initialize_action_chain;
95 }
96
97 const struct action_chain *pem_get_uninitialize_action_chain(struct pp_eventmgr *eventmgr)
98 {
99         return &uninitialize_action_chain;
100 }
101
102 const struct action_chain *pem_get_power_source_change_action_chain(struct pp_eventmgr *eventmgr)
103 {
104         return &power_source_change_action_chain_pp_enabled;  /* other case base on feature info*/
105 }
106
107 const struct action_chain *pem_get_resume_action_chain(struct pp_eventmgr *eventmgr)
108 {
109         return &resume_action_chain;
110 }
111
112 const struct action_chain *pem_get_hibernate_action_chain(struct pp_eventmgr *eventmgr)
113 {
114         return NULL;
115 }
116
117 const struct action_chain *pem_get_thermal_notification_action_chain(struct pp_eventmgr *eventmgr)
118 {
119         return NULL;
120 }
121
122 const struct action_chain *pem_get_vbios_notification_action_chain(struct pp_eventmgr *eventmgr)
123 {
124         return NULL;
125 }
126
127 const struct action_chain *pem_get_enter_thermal_state_action_chain(struct pp_eventmgr *eventmgr)
128 {
129         return NULL;
130 }
131
132 const struct action_chain *pem_get_exit_thermal_state_action_chain(struct pp_eventmgr *eventmgr)
133 {
134         return NULL;
135 }
136
137 const struct action_chain *pem_get_enable_powerplay_action_chain(struct pp_eventmgr *eventmgr)
138 {
139         return NULL;
140 }
141
142 const struct action_chain *pem_get_disable_powerplay_action_chain(struct pp_eventmgr *eventmgr)
143 {
144         return NULL;
145 }
146
147 const struct action_chain *pem_get_enable_overdrive_test_action_chain(struct pp_eventmgr *eventmgr)
148 {
149         return NULL;
150 }
151
152 const struct action_chain *pem_get_disable_overdrive_test_action_chain(struct pp_eventmgr *eventmgr)
153 {
154         return NULL;
155 }
156
157 const struct action_chain *pem_get_enable_gfx_clock_gating_action_chain(struct pp_eventmgr *eventmgr)
158 {
159         return &enable_gfx_clock_gating_action_chain;
160 }
161
162 const struct action_chain *pem_get_disable_gfx_clock_gating_action_chain(struct pp_eventmgr *eventmgr)
163 {
164         return &disable_gfx_clock_gating_action_chain;
165 }
166
167 const struct action_chain *pem_get_enable_cgpg_action_chain(struct pp_eventmgr *eventmgr)
168 {
169         return &enable_cgpg_action_chain;
170 }
171
172 const struct action_chain *pem_get_disable_cgpg_action_chain(struct pp_eventmgr *eventmgr)
173 {
174         return &disable_cgpg_action_chain;
175 }
176
177 const struct action_chain *pem_get_complete_init_action_chain(struct pp_eventmgr *eventmgr)
178 {
179         return &complete_init_action_chain;
180 }
181
182 const struct action_chain *pem_get_screen_on_action_chain(struct pp_eventmgr *eventmgr)
183 {
184         return NULL;
185 }
186
187 const struct action_chain *pem_get_screen_off_action_chain(struct pp_eventmgr *eventmgr)
188 {
189         return NULL;
190 }
191
192 const struct action_chain *pem_get_pre_suspend_action_chain(struct pp_eventmgr *eventmgr)
193 {
194         return NULL;
195 }
196
197 const struct action_chain *pem_get_pre_resume_action_chain(struct pp_eventmgr *eventmgr)
198 {
199         return NULL;
200 }
201
202 const struct action_chain *pem_enable_user_state_action_chain(struct pp_eventmgr *eventmgr)
203 {
204         return &enable_user_state_action_chain;
205 }
206
207 const struct action_chain *pem_readjust_power_state_action_chain(struct pp_eventmgr *eventmgr)
208 {
209         return &readjust_power_state_action_chain;
210 }
211
212 const struct action_chain *pem_display_config_change_action_chain(struct pp_eventmgr *eventmgr)
213 {
214         return &display_config_change_action_chain;
215 }