1 | /* |
2 | * Copyright 2012-15 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 | * Authors: AMD |
23 | * |
24 | */ |
25 | |
26 | #include "bios_parser_common.h" |
27 | #include "include/grph_object_ctrl_defs.h" |
28 | |
29 | static enum object_type object_type_from_bios_object_id(uint32_t bios_object_id) |
30 | { |
31 | uint32_t bios_object_type = (bios_object_id & OBJECT_TYPE_MASK) |
32 | >> OBJECT_TYPE_SHIFT; |
33 | enum object_type object_type; |
34 | |
35 | switch (bios_object_type) { |
36 | case GRAPH_OBJECT_TYPE_GPU: |
37 | object_type = OBJECT_TYPE_GPU; |
38 | break; |
39 | case GRAPH_OBJECT_TYPE_ENCODER: |
40 | object_type = OBJECT_TYPE_ENCODER; |
41 | break; |
42 | case GRAPH_OBJECT_TYPE_CONNECTOR: |
43 | object_type = OBJECT_TYPE_CONNECTOR; |
44 | break; |
45 | case GRAPH_OBJECT_TYPE_ROUTER: |
46 | object_type = OBJECT_TYPE_ROUTER; |
47 | break; |
48 | case GRAPH_OBJECT_TYPE_GENERIC: |
49 | object_type = OBJECT_TYPE_GENERIC; |
50 | break; |
51 | default: |
52 | object_type = OBJECT_TYPE_UNKNOWN; |
53 | break; |
54 | } |
55 | |
56 | return object_type; |
57 | } |
58 | |
59 | static enum object_enum_id enum_id_from_bios_object_id(uint32_t bios_object_id) |
60 | { |
61 | uint32_t bios_enum_id = |
62 | (bios_object_id & ENUM_ID_MASK) >> ENUM_ID_SHIFT; |
63 | enum object_enum_id id; |
64 | |
65 | switch (bios_enum_id) { |
66 | case GRAPH_OBJECT_ENUM_ID1: |
67 | id = ENUM_ID_1; |
68 | break; |
69 | case GRAPH_OBJECT_ENUM_ID2: |
70 | id = ENUM_ID_2; |
71 | break; |
72 | case GRAPH_OBJECT_ENUM_ID3: |
73 | id = ENUM_ID_3; |
74 | break; |
75 | case GRAPH_OBJECT_ENUM_ID4: |
76 | id = ENUM_ID_4; |
77 | break; |
78 | case GRAPH_OBJECT_ENUM_ID5: |
79 | id = ENUM_ID_5; |
80 | break; |
81 | case GRAPH_OBJECT_ENUM_ID6: |
82 | id = ENUM_ID_6; |
83 | break; |
84 | case GRAPH_OBJECT_ENUM_ID7: |
85 | id = ENUM_ID_7; |
86 | break; |
87 | default: |
88 | id = ENUM_ID_UNKNOWN; |
89 | break; |
90 | } |
91 | |
92 | return id; |
93 | } |
94 | |
95 | static uint32_t gpu_id_from_bios_object_id(uint32_t bios_object_id) |
96 | { |
97 | return (bios_object_id & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT; |
98 | } |
99 | |
100 | static enum encoder_id encoder_id_from_bios_object_id(uint32_t bios_object_id) |
101 | { |
102 | uint32_t bios_encoder_id = gpu_id_from_bios_object_id(bios_object_id); |
103 | enum encoder_id id; |
104 | |
105 | switch (bios_encoder_id) { |
106 | case ENCODER_OBJECT_ID_INTERNAL_LVDS: |
107 | id = ENCODER_ID_INTERNAL_LVDS; |
108 | break; |
109 | case ENCODER_OBJECT_ID_INTERNAL_TMDS1: |
110 | id = ENCODER_ID_INTERNAL_TMDS1; |
111 | break; |
112 | case ENCODER_OBJECT_ID_INTERNAL_TMDS2: |
113 | id = ENCODER_ID_INTERNAL_TMDS2; |
114 | break; |
115 | case ENCODER_OBJECT_ID_INTERNAL_DAC1: |
116 | id = ENCODER_ID_INTERNAL_DAC1; |
117 | break; |
118 | case ENCODER_OBJECT_ID_INTERNAL_DAC2: |
119 | id = ENCODER_ID_INTERNAL_DAC2; |
120 | break; |
121 | case ENCODER_OBJECT_ID_INTERNAL_LVTM1: |
122 | id = ENCODER_ID_INTERNAL_LVTM1; |
123 | break; |
124 | case ENCODER_OBJECT_ID_HDMI_INTERNAL: |
125 | id = ENCODER_ID_INTERNAL_HDMI; |
126 | break; |
127 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1: |
128 | id = ENCODER_ID_INTERNAL_KLDSCP_TMDS1; |
129 | break; |
130 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1: |
131 | id = ENCODER_ID_INTERNAL_KLDSCP_DAC1; |
132 | break; |
133 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2: |
134 | id = ENCODER_ID_INTERNAL_KLDSCP_DAC2; |
135 | break; |
136 | case ENCODER_OBJECT_ID_MVPU_FPGA: |
137 | id = ENCODER_ID_EXTERNAL_MVPU_FPGA; |
138 | break; |
139 | case ENCODER_OBJECT_ID_INTERNAL_DDI: |
140 | id = ENCODER_ID_INTERNAL_DDI; |
141 | break; |
142 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: |
143 | id = ENCODER_ID_INTERNAL_UNIPHY; |
144 | break; |
145 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: |
146 | id = ENCODER_ID_INTERNAL_KLDSCP_LVTMA; |
147 | break; |
148 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: |
149 | id = ENCODER_ID_INTERNAL_UNIPHY1; |
150 | break; |
151 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: |
152 | id = ENCODER_ID_INTERNAL_UNIPHY2; |
153 | break; |
154 | case ENCODER_OBJECT_ID_ALMOND: /* ENCODER_OBJECT_ID_NUTMEG */ |
155 | id = ENCODER_ID_EXTERNAL_NUTMEG; |
156 | break; |
157 | case ENCODER_OBJECT_ID_TRAVIS: |
158 | id = ENCODER_ID_EXTERNAL_TRAVIS; |
159 | break; |
160 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3: |
161 | id = ENCODER_ID_INTERNAL_UNIPHY3; |
162 | break; |
163 | default: |
164 | id = ENCODER_ID_UNKNOWN; |
165 | ASSERT(0); |
166 | break; |
167 | } |
168 | |
169 | return id; |
170 | } |
171 | |
172 | static enum connector_id connector_id_from_bios_object_id( |
173 | uint32_t bios_object_id) |
174 | { |
175 | uint32_t bios_connector_id = gpu_id_from_bios_object_id(bios_object_id); |
176 | |
177 | enum connector_id id; |
178 | |
179 | switch (bios_connector_id) { |
180 | case CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I: |
181 | id = CONNECTOR_ID_SINGLE_LINK_DVII; |
182 | break; |
183 | case CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I: |
184 | id = CONNECTOR_ID_DUAL_LINK_DVII; |
185 | break; |
186 | case CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D: |
187 | id = CONNECTOR_ID_SINGLE_LINK_DVID; |
188 | break; |
189 | case CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D: |
190 | id = CONNECTOR_ID_DUAL_LINK_DVID; |
191 | break; |
192 | case CONNECTOR_OBJECT_ID_VGA: |
193 | id = CONNECTOR_ID_VGA; |
194 | break; |
195 | case CONNECTOR_OBJECT_ID_HDMI_TYPE_A: |
196 | id = CONNECTOR_ID_HDMI_TYPE_A; |
197 | break; |
198 | case CONNECTOR_OBJECT_ID_LVDS: |
199 | id = CONNECTOR_ID_LVDS; |
200 | break; |
201 | case CONNECTOR_OBJECT_ID_PCIE_CONNECTOR: |
202 | id = CONNECTOR_ID_PCIE; |
203 | break; |
204 | case CONNECTOR_OBJECT_ID_HARDCODE_DVI: |
205 | id = CONNECTOR_ID_HARDCODE_DVI; |
206 | break; |
207 | case CONNECTOR_OBJECT_ID_DISPLAYPORT: |
208 | id = CONNECTOR_ID_DISPLAY_PORT; |
209 | break; |
210 | case CONNECTOR_OBJECT_ID_eDP: |
211 | id = CONNECTOR_ID_EDP; |
212 | break; |
213 | case CONNECTOR_OBJECT_ID_MXM: |
214 | id = CONNECTOR_ID_MXM; |
215 | break; |
216 | case CONNECTOR_OBJECT_ID_USBC: |
217 | id = CONNECTOR_ID_USBC; |
218 | break; |
219 | default: |
220 | id = CONNECTOR_ID_UNKNOWN; |
221 | break; |
222 | } |
223 | |
224 | return id; |
225 | } |
226 | |
227 | static enum generic_id generic_id_from_bios_object_id(uint32_t bios_object_id) |
228 | { |
229 | uint32_t bios_generic_id = gpu_id_from_bios_object_id(bios_object_id); |
230 | |
231 | enum generic_id id; |
232 | |
233 | switch (bios_generic_id) { |
234 | case GENERIC_OBJECT_ID_MXM_OPM: |
235 | id = GENERIC_ID_MXM_OPM; |
236 | break; |
237 | case GENERIC_OBJECT_ID_GLSYNC: |
238 | id = GENERIC_ID_GLSYNC; |
239 | break; |
240 | case GENERIC_OBJECT_ID_STEREO_PIN: |
241 | id = GENERIC_ID_STEREO; |
242 | break; |
243 | default: |
244 | id = GENERIC_ID_UNKNOWN; |
245 | break; |
246 | } |
247 | |
248 | return id; |
249 | } |
250 | |
251 | static uint32_t id_from_bios_object_id(enum object_type type, |
252 | uint32_t bios_object_id) |
253 | { |
254 | switch (type) { |
255 | case OBJECT_TYPE_GPU: |
256 | return gpu_id_from_bios_object_id(bios_object_id); |
257 | case OBJECT_TYPE_ENCODER: |
258 | return (uint32_t)encoder_id_from_bios_object_id(bios_object_id); |
259 | case OBJECT_TYPE_CONNECTOR: |
260 | return (uint32_t)connector_id_from_bios_object_id( |
261 | bios_object_id); |
262 | case OBJECT_TYPE_GENERIC: |
263 | return generic_id_from_bios_object_id(bios_object_id); |
264 | default: |
265 | return 0; |
266 | } |
267 | } |
268 | |
269 | struct graphics_object_id object_id_from_bios_object_id(uint32_t bios_object_id) |
270 | { |
271 | enum object_type type; |
272 | enum object_enum_id enum_id; |
273 | struct graphics_object_id go_id = { 0 }; |
274 | |
275 | type = object_type_from_bios_object_id(bios_object_id); |
276 | |
277 | if (OBJECT_TYPE_UNKNOWN == type) |
278 | return go_id; |
279 | |
280 | enum_id = enum_id_from_bios_object_id(bios_object_id); |
281 | |
282 | if (ENUM_ID_UNKNOWN == enum_id) |
283 | return go_id; |
284 | |
285 | go_id = dal_graphics_object_id_init( |
286 | id: id_from_bios_object_id(type, bios_object_id), enum_id, type); |
287 | |
288 | return go_id; |
289 | } |
290 | |
291 | |
292 | |