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