Home | History | Annotate | Line # | Download | only in bios
      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 
     34 static 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 
     64 static 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 
    100 static 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 
    105 static 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 
    177 static 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 
    229 static 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 
    253 static 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 
    271 struct 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