1/*	$NetBSD: amdgpu_bios_parser_common.c,v 1.2 2021/12/18 23:45:00 riastradh Exp $	*/
2
3/*
4 * Copyright 2012-15 Advanced Micro Devices, Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22 * OTHER DEALINGS IN THE SOFTWARE.
23 *
24 * Authors: AMD
25 *
26 */
27
28#include <sys/cdefs.h>
29__KERNEL_RCSID(0, "$NetBSD: amdgpu_bios_parser_common.c,v 1.2 2021/12/18 23:45:00 riastradh Exp $");
30
31#include "bios_parser_common.h"
32#include "include/grph_object_ctrl_defs.h"
33
34static enum object_type object_type_from_bios_object_id(uint32_t bios_object_id)
35{
36	uint32_t bios_object_type = (bios_object_id & OBJECT_TYPE_MASK)
37				>> OBJECT_TYPE_SHIFT;
38	enum object_type object_type;
39
40	switch (bios_object_type) {
41	case GRAPH_OBJECT_TYPE_GPU:
42		object_type = OBJECT_TYPE_GPU;
43		break;
44	case GRAPH_OBJECT_TYPE_ENCODER:
45		object_type = OBJECT_TYPE_ENCODER;
46		break;
47	case GRAPH_OBJECT_TYPE_CONNECTOR:
48		object_type = OBJECT_TYPE_CONNECTOR;
49		break;
50	case GRAPH_OBJECT_TYPE_ROUTER:
51		object_type = OBJECT_TYPE_ROUTER;
52		break;
53	case GRAPH_OBJECT_TYPE_GENERIC:
54		object_type = OBJECT_TYPE_GENERIC;
55		break;
56	default:
57		object_type = OBJECT_TYPE_UNKNOWN;
58		break;
59	}
60
61	return object_type;
62}
63
64static enum object_enum_id enum_id_from_bios_object_id(uint32_t bios_object_id)
65{
66	uint32_t bios_enum_id =
67			(bios_object_id & ENUM_ID_MASK) >> ENUM_ID_SHIFT;
68	enum object_enum_id id;
69
70	switch (bios_enum_id) {
71	case GRAPH_OBJECT_ENUM_ID1:
72		id = ENUM_ID_1;
73		break;
74	case GRAPH_OBJECT_ENUM_ID2:
75		id = ENUM_ID_2;
76		break;
77	case GRAPH_OBJECT_ENUM_ID3:
78		id = ENUM_ID_3;
79		break;
80	case GRAPH_OBJECT_ENUM_ID4:
81		id = ENUM_ID_4;
82		break;
83	case GRAPH_OBJECT_ENUM_ID5:
84		id = ENUM_ID_5;
85		break;
86	case GRAPH_OBJECT_ENUM_ID6:
87		id = ENUM_ID_6;
88		break;
89	case GRAPH_OBJECT_ENUM_ID7:
90		id = ENUM_ID_7;
91		break;
92	default:
93		id = ENUM_ID_UNKNOWN;
94		break;
95	}
96
97	return id;
98}
99
100static uint32_t gpu_id_from_bios_object_id(uint32_t bios_object_id)
101{
102	return (bios_object_id & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT;
103}
104
105static enum encoder_id encoder_id_from_bios_object_id(uint32_t bios_object_id)
106{
107	uint32_t bios_encoder_id = gpu_id_from_bios_object_id(bios_object_id);
108	enum encoder_id id;
109
110	switch (bios_encoder_id) {
111	case ENCODER_OBJECT_ID_INTERNAL_LVDS:
112		id = ENCODER_ID_INTERNAL_LVDS;
113		break;
114	case ENCODER_OBJECT_ID_INTERNAL_TMDS1:
115		id = ENCODER_ID_INTERNAL_TMDS1;
116		break;
117	case ENCODER_OBJECT_ID_INTERNAL_TMDS2:
118		id = ENCODER_ID_INTERNAL_TMDS2;
119		break;
120	case ENCODER_OBJECT_ID_INTERNAL_DAC1:
121		id = ENCODER_ID_INTERNAL_DAC1;
122		break;
123	case ENCODER_OBJECT_ID_INTERNAL_DAC2:
124		id = ENCODER_ID_INTERNAL_DAC2;
125		break;
126	case ENCODER_OBJECT_ID_INTERNAL_LVTM1:
127		id = ENCODER_ID_INTERNAL_LVTM1;
128		break;
129	case ENCODER_OBJECT_ID_HDMI_INTERNAL:
130		id = ENCODER_ID_INTERNAL_HDMI;
131		break;
132	case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1:
133		id = ENCODER_ID_INTERNAL_KLDSCP_TMDS1;
134		break;
135	case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1:
136		id = ENCODER_ID_INTERNAL_KLDSCP_DAC1;
137		break;
138	case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2:
139		id = ENCODER_ID_INTERNAL_KLDSCP_DAC2;
140		break;
141	case ENCODER_OBJECT_ID_MVPU_FPGA:
142		id = ENCODER_ID_EXTERNAL_MVPU_FPGA;
143		break;
144	case ENCODER_OBJECT_ID_INTERNAL_DDI:
145		id = ENCODER_ID_INTERNAL_DDI;
146		break;
147	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY:
148		id = ENCODER_ID_INTERNAL_UNIPHY;
149		break;
150	case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA:
151		id = ENCODER_ID_INTERNAL_KLDSCP_LVTMA;
152		break;
153	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1:
154		id = ENCODER_ID_INTERNAL_UNIPHY1;
155		break;
156	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2:
157		id = ENCODER_ID_INTERNAL_UNIPHY2;
158		break;
159	case ENCODER_OBJECT_ID_ALMOND: /* ENCODER_OBJECT_ID_NUTMEG */
160		id = ENCODER_ID_EXTERNAL_NUTMEG;
161		break;
162	case ENCODER_OBJECT_ID_TRAVIS:
163		id = ENCODER_ID_EXTERNAL_TRAVIS;
164		break;
165	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3:
166		id = ENCODER_ID_INTERNAL_UNIPHY3;
167		break;
168	default:
169		id = ENCODER_ID_UNKNOWN;
170		ASSERT(0);
171		break;
172	}
173
174	return id;
175}
176
177static enum connector_id connector_id_from_bios_object_id(
178	uint32_t bios_object_id)
179{
180	uint32_t bios_connector_id = gpu_id_from_bios_object_id(bios_object_id);
181
182	enum connector_id id;
183
184	switch (bios_connector_id) {
185	case CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I:
186		id = CONNECTOR_ID_SINGLE_LINK_DVII;
187		break;
188	case CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I:
189		id = CONNECTOR_ID_DUAL_LINK_DVII;
190		break;
191	case CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D:
192		id = CONNECTOR_ID_SINGLE_LINK_DVID;
193		break;
194	case CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D:
195		id = CONNECTOR_ID_DUAL_LINK_DVID;
196		break;
197	case CONNECTOR_OBJECT_ID_VGA:
198		id = CONNECTOR_ID_VGA;
199		break;
200	case CONNECTOR_OBJECT_ID_HDMI_TYPE_A:
201		id = CONNECTOR_ID_HDMI_TYPE_A;
202		break;
203	case CONNECTOR_OBJECT_ID_LVDS:
204		id = CONNECTOR_ID_LVDS;
205		break;
206	case CONNECTOR_OBJECT_ID_PCIE_CONNECTOR:
207		id = CONNECTOR_ID_PCIE;
208		break;
209	case CONNECTOR_OBJECT_ID_HARDCODE_DVI:
210		id = CONNECTOR_ID_HARDCODE_DVI;
211		break;
212	case CONNECTOR_OBJECT_ID_DISPLAYPORT:
213		id = CONNECTOR_ID_DISPLAY_PORT;
214		break;
215	case CONNECTOR_OBJECT_ID_eDP:
216		id = CONNECTOR_ID_EDP;
217		break;
218	case CONNECTOR_OBJECT_ID_MXM:
219		id = CONNECTOR_ID_MXM;
220		break;
221	default:
222		id = CONNECTOR_ID_UNKNOWN;
223		break;
224	}
225
226	return id;
227}
228
229static enum generic_id generic_id_from_bios_object_id(uint32_t bios_object_id)
230{
231	uint32_t bios_generic_id = gpu_id_from_bios_object_id(bios_object_id);
232
233	enum generic_id id;
234
235	switch (bios_generic_id) {
236	case GENERIC_OBJECT_ID_MXM_OPM:
237		id = GENERIC_ID_MXM_OPM;
238		break;
239	case GENERIC_OBJECT_ID_GLSYNC:
240		id = GENERIC_ID_GLSYNC;
241		break;
242	case GENERIC_OBJECT_ID_STEREO_PIN:
243		id = GENERIC_ID_STEREO;
244		break;
245	default:
246		id = GENERIC_ID_UNKNOWN;
247		break;
248	}
249
250	return id;
251}
252
253static uint32_t id_from_bios_object_id(enum object_type type,
254	uint32_t bios_object_id)
255{
256	switch (type) {
257	case OBJECT_TYPE_GPU:
258		return gpu_id_from_bios_object_id(bios_object_id);
259	case OBJECT_TYPE_ENCODER:
260		return (uint32_t)encoder_id_from_bios_object_id(bios_object_id);
261	case OBJECT_TYPE_CONNECTOR:
262		return (uint32_t)connector_id_from_bios_object_id(
263				bios_object_id);
264	case OBJECT_TYPE_GENERIC:
265		return generic_id_from_bios_object_id(bios_object_id);
266	default:
267		return 0;
268	}
269}
270
271struct graphics_object_id object_id_from_bios_object_id(uint32_t bios_object_id)
272{
273	enum object_type type;
274	enum object_enum_id enum_id;
275	struct graphics_object_id go_id = { 0 };
276
277	type = object_type_from_bios_object_id(bios_object_id);
278
279	if (OBJECT_TYPE_UNKNOWN == type)
280		return go_id;
281
282	enum_id = enum_id_from_bios_object_id(bios_object_id);
283
284	if (ENUM_ID_UNKNOWN == enum_id)
285		return go_id;
286
287	go_id = dal_graphics_object_id_init(
288			id_from_bios_object_id(type, bios_object_id), enum_id, type);
289
290	return go_id;
291}
292
293
294