GNU Linux-libre 4.14.266-gnu1
[releases.git] / drivers / gpu / drm / amd / powerplay / inc / eventmanager.h
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 #ifndef _EVENT_MANAGER_H_
24 #define _EVENT_MANAGER_H_
25
26 #include "power_state.h"
27 #include "pp_power_source.h"
28 #include "hardwaremanager.h"
29 #include "pp_asicblocks.h"
30
31 struct pp_eventmgr;
32 enum amd_pp_event;
33
34 enum PEM_EventDataValid {
35         PEM_EventDataValid_RequestedStateID = 0,
36         PEM_EventDataValid_RequestedUILabel,
37         PEM_EventDataValid_NewPowerState,
38         PEM_EventDataValid_RequestedPowerSource,
39         PEM_EventDataValid_RequestedClocks,
40         PEM_EventDataValid_CurrentTemperature,
41         PEM_EventDataValid_AsicBlocks,
42         PEM_EventDataValid_ODParameters,
43         PEM_EventDataValid_PXAdapterPrefs,
44         PEM_EventDataValid_PXUserPrefs,
45         PEM_EventDataValid_PXSwitchReason,
46         PEM_EventDataValid_PXSwitchPhase,
47         PEM_EventDataValid_HdVideo,
48         PEM_EventDataValid_BacklightLevel,
49         PEM_EventDatavalid_VariBrightParams,
50         PEM_EventDataValid_VariBrightLevel,
51         PEM_EventDataValid_VariBrightImmediateChange,
52         PEM_EventDataValid_PercentWhite,
53         PEM_EventDataValid_SdVideo,
54         PEM_EventDataValid_HTLinkChangeReason,
55         PEM_EventDataValid_HWBlocks,
56         PEM_EventDataValid_RequestedThermalState,
57         PEM_EventDataValid_MvcVideo,
58         PEM_EventDataValid_Max
59 };
60
61 typedef enum PEM_EventDataValid PEM_EventDataValid;
62
63 /* Number of bits in ULONG variable */
64 #define PEM_MAX_NUM_EVENTDATAVALID_BITS_PER_FIELD (sizeof(unsigned long)*8)
65
66 /* Number of ULONG entries used by event data valid bits */
67 #define PEM_MAX_NUM_EVENTDATAVALID_ULONG_ENTRIES                                 \
68                 ((PEM_EventDataValid_Max + PEM_MAX_NUM_EVENTDATAVALID_BITS_PER_FIELD - 1) /  \
69                 PEM_MAX_NUM_EVENTDATAVALID_BITS_PER_FIELD)
70
71 static inline void pem_set_event_data_valid(unsigned long *fields, PEM_EventDataValid valid_field)
72 {
73         fields[valid_field / PEM_MAX_NUM_EVENTDATAVALID_BITS_PER_FIELD] |=
74                 (1UL << (valid_field % PEM_MAX_NUM_EVENTDATAVALID_BITS_PER_FIELD));
75 }
76
77 static inline void pem_unset_event_data_valid(unsigned long *fields, PEM_EventDataValid valid_field)
78 {
79         fields[valid_field / PEM_MAX_NUM_EVENTDATAVALID_BITS_PER_FIELD] &=
80                 ~(1UL << (valid_field % PEM_MAX_NUM_EVENTDATAVALID_BITS_PER_FIELD));
81 }
82
83 static inline unsigned long pem_is_event_data_valid(const unsigned long *fields, PEM_EventDataValid valid_field)
84 {
85         return fields[valid_field / PEM_MAX_NUM_EVENTDATAVALID_BITS_PER_FIELD] &
86                 (1UL << (valid_field % PEM_MAX_NUM_EVENTDATAVALID_BITS_PER_FIELD));
87 }
88
89 struct pem_event_data {
90         unsigned long   valid_fields[100];
91         unsigned long   requested_state_id;
92         enum PP_StateUILabel requested_ui_label;
93         struct pp_power_state  *pnew_power_state;
94         enum pp_power_source  requested_power_source;
95         struct PP_Clocks       requested_clocks;
96         bool         skip_state_adjust_rules;
97         struct phm_asic_blocks  asic_blocks;
98         /* to doPP_ThermalState requestedThermalState;
99         enum ThermalStateRequestSrc requestThermalStateSrc;
100         PP_Temperature  currentTemperature;*/
101
102 };
103
104 int pem_handle_event(struct pp_eventmgr *eventmgr, enum amd_pp_event event,
105                      struct pem_event_data *event_data);
106
107 bool pem_is_hw_access_blocked(struct pp_eventmgr *eventmgr);
108
109 #endif /* _EVENT_MANAGER_H_ */