summaryrefslogtreecommitdiff
path: root/shared-core/radeon_ms_combios.h
blob: fbceadf2c769ecfc03fe238df1132950d46f5a62 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
/*
 * Copyright 2006-2007 Advanced Micro Devices, Inc.
 * Copyright 2007 Jérôme Glisse
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 * OTHER DEALINGS IN THE SOFTWARE.
 */
/*
 * Authors:
 *    Jérôme Glisse <glisse@freedesktop.org>
 */
#ifndef __RADEON_MS_COMBIOS_H__
#define __RADEON_MS_COMBIOS_H__

#pragma pack(1)

#define ROM_HEADER                      0x48

struct combios_header
{
    uint8_t  ucTypeDefinition;
    uint8_t  ucExtFunctionCode;
    uint8_t  ucOemID1;
    uint8_t  ucOemID2;
    uint8_t  ucBiosMajorRev;
    uint8_t  ucBiosMinorRev;
    uint16_t usStructureSize;
    uint16_t usPointerToSmi;
    uint16_t usPointerToPmid;
    uint16_t usPointerToInitTable;
    uint16_t usPointerToCrcChecksumBlock;
    uint16_t usPointerToConfigFilename;
    uint16_t usPointerToLogonMessage;
    uint16_t usPointerToMiscInfo;
    uint16_t usPciBusDevInitCode;
    uint16_t usBiosRuntimeSegmentAddress;
    uint16_t usIoBaseAddress;
    uint16_t usSubsystemVendorID;
    uint16_t usSubsystemID;
    uint16_t usPostVendorID;
    uint16_t usInt10Offset;
    uint16_t usInt10Segment;
    uint16_t usMonitorInfo;
    uint16_t usPointerToConfigBlock;
    uint16_t usPointerToDacDelayInfo;
    uint16_t usPointerToCapDataStruct;
    uint16_t usPointerToInternalCrtTables;
    uint16_t usPointerToPllInfoBlock;
    uint16_t usPointerToTVInfoTable;
    uint16_t usPointerToDFPInfoTable;
    uint16_t usPointerToHWConfigTable;
    uint16_t usPointerToMMConfigTable;
    uint32_t ulTVStdPatchTableSignature;
    uint16_t usPointerToTVStdPatchTable;
    uint16_t usPointerToPanelInfoTable;
    uint16_t usPointerToAsicInfoTable;
    uint16_t usPointerToAuroraInfoTable;
    uint16_t usPointerToPllInitTable;
    uint16_t usPointerToMemoryConfigTable;
    uint16_t usPointerToSaveMaskTable;
    uint16_t usPointerHardCodedEdid;
    uint16_t usPointerToExtendedInitTable1;
    uint16_t usPointerToExtendedInitTable2;
    uint16_t usPointerToDynamicClkTable;
    uint16_t usPointerToReservedMemoryTable;
    uint16_t usPointerToBridgetInitTable;
    uint16_t usPointerToExtTMDSInitTable;
    uint16_t usPointerToMemClkInfoTable;
    uint16_t usPointerToExtDACTable;
    uint16_t usPointerToMiscInfoTable;
};

struct combios_pll_block
{
    /* Usually 6 */
    uint8_t  ucPLLBiosVersion;
    /* Size in bytes */
    uint8_t  ucStructureSize;
    /* Dot clock entry used for accelerated modes */
    uint8_t  ucDotClockEntry;
    /* Dot clock entry used for extended VGA modes */
    uint8_t  ucDotClockEntryVga;
    /* Offset into internal clock table used for by VGA parameter table */
    uint16_t usPointerToInternalClock;
    /* Offset into actual programmed frequency table at POST */
    uint16_t usPointerToFreqTable;
    /* XCLK setting, (memory clock in 10 KHz units) */
    uint16_t usXclkSetting;
    /* MCLK setting, (engine clock in 10 KHz units) */
    uint16_t usMclkSetting;
    /* Number of PLL information block to follow, currently value is 3 */
    uint8_t  ucPllInfoBlockNumber;
    /* Size of each PLL information block */
    uint8_t  ucPllInfoBlockSize;
    /* Reference frequency of the dot clock */
    uint16_t usDotClockRefFreq;
    /* Reference Divider of the dot clock */
    uint16_t usDotClockRefDiv;
    /* Min Frequency supported before post divider for the dot clock */
    uint32_t ulDotClockMinFreq;
    /* Max Frequency can be supported for the dot clock */
    uint32_t ulDotClockMaxFreq;
    /* Reference frequency of the MCLK, engine clock */
    uint16_t usMclkRefFreq;
    /* Reference Divider of the MCLK, engine clock */
    uint16_t usMclkRefDiv;
    /* Min Frequency supported before post divider for MCLK, engine clock */
    uint32_t ulMclkMinFreq;
    /* Max Frequency can be supported for the MCLK, engine clock */
    uint32_t ulMclkMaxFreq;
    /* Reference frequency of the XCLK, memory clock */
    uint16_t usXclkRefFreq;
    /* Reference Divider of the XCLK, memory clock */
    uint16_t usXclkRefDiv;
    /* Min Frequency supported before post divider for XCLK, memory clock */
    uint32_t ulXclkMinFreq;
    /* Max Frequency can be supported for the XCLK, memory clock */
    uint32_t ulXclkMaxFreq;

    /*this is the PLL Information Table Extended structure version 10 */
    uint8_t  ucNumberOfExtendedPllBlocks;
    uint8_t  ucSizePLLDefinition;
    uint16_t ulCrystalFrequencyPixelClock_pll;
    uint32_t ulMinInputPixelClockPLLFrequency;
    uint32_t ulMaxInputPixelClockPLLFrequency;
    uint32_t ulMinOutputPixelClockPLLFrequency;
    uint32_t ulMaxOutputPixelClockPLLFrequency;

    /*version 11 */
    uint16_t ulCrystalFrequencyEngineClock_pll;
    uint32_t ulMinInputFrequencyEngineClock_pll;
    uint32_t ulMaxInputFrequencyEngineClock_pll;
    uint32_t ulMinOutputFrequencyEngineClock_pll;
    uint32_t ulMaxOutputFrequencyEngineClock_pll;
    uint16_t ulCrystalFrequencyMemoryClock_pll;
    uint32_t ulMinInputFrequencyMemoryClock_pll;
    uint32_t ulMaxInputFrequencyMemoryClock_pll;
    uint32_t ulMinOutputFrequencyMemoryClock_pll;
    uint32_t ulMaxOutputFrequencyMemoryClock_pll;
    uint32_t ulMaximumDACOutputFrequency;
};

#define MAX_NO_OF_LCD_RES_TIMING                25

struct panel_information_table
{
    uint8_t  ucPanelIdentification;
    uint8_t  ucPanelIDString[24];
    uint16_t usHorizontalSize;
    uint16_t usVerticalSize;
    uint16_t usFlatPanelType;
    uint8_t  ucRedBitsPerPrimary;
    uint8_t  ucGreenBitsPerPrimary;
    uint8_t  ucBlueBitsPerPrimary;
    uint8_t  ucReservedBitsPerPrimary;
    uint8_t  ucPanelCaps;
    uint8_t  ucPowerSequenceDelayStepsInMS;
    uint8_t  ucSupportedRefreshRateExtended;
    uint16_t usExtendedPanelInfoTable;
    uint16_t usPtrToHalfFrameBufferInformationTable;
    uint16_t usVccOntoBlOn;
    uint16_t usOffDelay;
    uint16_t usRefDiv;
    uint8_t  ucPostDiv;
    uint16_t usFeedBackDiv;
    uint8_t  ucSpreadSpectrumType;
    uint16_t usSpreadSpectrumPercentage;
    uint8_t  ucBackLightLevel;
    uint8_t  ucBiasLevel;
    uint8_t  ucPowerSequenceDelay;
    uint32_t ulPanelData;
    uint8_t  ucPanelRefreshRateData;
    uint16_t usSupportedRefreshRate;
    uint16_t usModeTableOffset[MAX_NO_OF_LCD_RES_TIMING];
};

struct extended_panel_info_table
{
    uint8_t  ucExtendedPanelInfoTableVer;
    uint8_t  ucSSDelay;
    uint8_t  ucSSStepSizeIndex;
};

struct lcd_mode_table_center
{
    uint16_t usHorizontalRes;
    uint16_t usVerticalRes;
    uint8_t  ucModeType;
    uint16_t usOffset2ExpParamTable;
    uint16_t usOffset2TvParamTable;
    uint16_t usPixelClock;
    uint16_t usPixelClockAdjustment;
    uint16_t usFpPos;
    uint8_t  ucReserved;
    uint8_t  ucMiscBits;
    uint16_t usCrtcHTotal;
    uint16_t usCrtcHDisp;
    uint16_t usCrtcHSyncStrt;
    uint8_t  ucCrtcHSyncWid;
    uint16_t usCrtcVTotal;
    uint16_t usCrtcVDisp;
    uint16_t usCrtcVSyncStrt;
    uint8_t  ucOvrWidTop;
};

struct lcd_mode_table_exp
{
    uint16_t usPixelClock;
    uint16_t usPixelClockAdjustment;
    uint16_t usFpPos;
    uint8_t  ucReserved;
    uint8_t  ucMiscBits;
    uint16_t usCrtcHTotal;
    uint16_t usCrtcHDisp;
    uint16_t usCrtcHSyncStrt;
    uint8_t  ucCrtcHSyncWid;
    uint16_t usCrtcVTotal;
    uint16_t usCrtcVDisp;
    uint16_t usCrtcVSyncStrt;
    uint8_t  ucOvrWidTop;
    uint16_t usHorizontalBlendRatio;
    uint32_t ulVgaVertStretching;
    uint16_t usCopVertStretching;
    uint16_t usVgaExtVertStretching;
};

struct tmds_pll_cntl_block
{
    uint16_t usClockUpperRange;
    uint32_t ulPllSetting;
};

#define MAX_PLL_CNTL_ENTRIES                    8

struct combios_dfp_info_table
{
    uint8_t                     ucDFPInfoTableRev;
    uint8_t                     ucDFPInfoTableSize;
    uint16_t                    usOffsetDetailedTimingTable;
    uint8_t                     ucReserved;
    uint8_t                     ucNumberOfClockRanges;
    uint16_t                    usMaxPixelClock;
    uint32_t                    ulInitValueTmdsPllCntl;
    uint32_t                    ulFinalValueTmdsPllCntl;
    struct tmds_pll_cntl_block  sTmdsPllCntlBlock[MAX_PLL_CNTL_ENTRIES];
};

struct combios_exttmds_table_header
{
    uint8_t  ucTableRev;
    uint16_t usTableSize;
    uint8_t  ucNoBlocks;
};

struct combios_exttmds_block_header
{
    uint16_t usMaxFreq;
    uint8_t  ucI2CSlaveAddr;
    uint8_t  ucI2CLine;
    uint8_t  ucConnectorId;
    uint8_t  ucFlags;
};

/* Connector table - applicable from Piglet and later ASICs
    byte 0     (embedded revision)
        [7:4]    = number of chips (valid number 1 - 15)
        [3:0]    = revision number of table (valid number 1 - 15)

    byte 1 (Chip info)
        [7:4]    = chip number, max. 15 (valid number 1 - 15)
        [3:0]    = number of connectors for that chip, (valid number 1 - 15)
                   (number of connectors = number of 'Connector info' entries
                    for that chip)

    byte 2,3 (Connector info)
        [15:12]    - connector type
            = 0     - no connector
            = 1     - proprietary
            = 2     - CRT
            = 3     - DVI-I
            = 4      - DVI-D
            = 5-15    - reserved for future expansion
        [11:8]    - DDC line pair used for that connector
            = 0     - no DDC
            = 1     - MONID 0/1
            = 2     - DVI_DDC
            = 3     - VGA_DDC
            = 4     - CRT2_DDC
            = 5-15    - reserved for future expansion
        [5] - bit indicating presence of multiplexer for TV,CRT2
        [7:6]    - reserved for future expansion
        [4]    - TMDS type
            = 0     - internal TMDS
            = 1      - external TMDS
        [3:1]    - reserved for future expansion
        [0]    - DAC associated with that connector
            = 0    - CRT DAC
            = 1    - non-CRT DAC (e.g. TV DAC, external DAC ..)

    byte 4,5,6...     - byte 4,5 can be another "Connector info" word
                      describing another connector
                     - or byte 5 is a "Chip info" byte for anther chip,
                      then start with byte 5,6 to describe connectors
                      for that chip
                    - or byte 5 = 0 if all connectors for all chips on
                      board have been described, no more connector left
                      to describe.
*/
#define BIOS_CONNECTOR_INFO__TYPE__MASK                   0xF000
#define BIOS_CONNECTOR_INFO__TYPE__SHIFT                  0x0000000C
#define BIOS_CONNECTOR_TYPE__NONE                         0x00000000
#define BIOS_CONNECTOR_TYPE__PROPRIETARY                  0x00000001
#define BIOS_CONNECTOR_TYPE__CRT                          0x00000002
#define BIOS_CONNECTOR_TYPE__DVI_I                        0x00000003
#define BIOS_CONNECTOR_TYPE__DVI_D                        0x00000004

#define BIOS_CONNECTOR_INFO__DDC_LINE__MASK               0x0F00
#define BIOS_CONNECTOR_INFO__DDC_LINE__SHIFT              0x00000008
#define BIOS_DDC_LINE__NONE                               0x00000000
#define BIOS_DDC_LINE__MONID01                            0x00000001
#define BIOS_DDC_LINE__DVI                                0x00000002
#define BIOS_DDC_LINE__VGA                                0x00000003
#define BIOS_DDC_LINE__CRT2                               0x00000004
#define BIOS_DDC_LINE__GPIOPAD                            0x00000005
#define BIOS_DDC_LINE__ZV_LCDPAD                          0x00000006

#define BIOS_CONNECTOR_INFO__TMDS_TYPE__MASK              0x0010
#define BIOS_CONNECTOR_INFO__TMDS_TYPE__SHIFT             0x00000004
#define BIOS_TMDS_TYPE__INTERNAL                          0x00000000
#define BIOS_TMDS_TYPE__EXTERNAL                          0x00000001

#define BIOS_CONNECTOR_INFO__DAC_TYPE__MASK               0x0001
#define BIOS_CONNECTOR_INFO__DAC_TYPE__SHIFT              0x00000000
#define BIOS_DAC_TYPE__CRT                                0x00000000
#define BIOS_DAC_TYPE__NON_CRT                            0x00000001

#define BIOS_CONNECTOR_INFO__MUX_MASK                     0x00000020
#define BIOS_CONNECTOR_INFO__MUX_SHIFT                    0x00000005

#define BIOS_CHIPINFO_HEADER__CHIP_NUMBER__MASK           0xF0
#define BIOS_CHIPINFO_HEADER__CHIP_NUMBER__SHIFT          0x00000004

#define BIOS_CHIPINFO_HEADER__NUMBER_OF_CONNECTORS__MASK  0x0F
#define BIOS_CHIPINFO_HEADER__NUMBER_OF_CONNECTORS__SHIFT 0x00000000

#define BIOS_CHIPINFO__MAX_NUMBER_OF_CONNECTORS           0x00000010

struct combios_connector_chip_info
{
    uint8_t  ucChipHeader;
    uint16_t sConnectorInfo[BIOS_CHIPINFO__MAX_NUMBER_OF_CONNECTORS];
};

#define BIOS_CONNECTOR_HEADER__NUMBER_OF_CHIPS__MASK      0xF0
#define BIOS_CONNECTOR_HEADER__NUMBER_OF_CHIPS__SHIFT     0x00000004

#define BIOS_CONNECTOR_HEADER__TABLE_REVISION__MASK       0x0F
#define BIOS_CONNECTOR_HEADER__TABLE_REVISION__SHIFT      0x00000000

struct combios_connector_table
{
    uint8_t                            ucConnectorHeader;
    struct combios_connector_chip_info sChipConnectorInfo[0x10];
};

#pragma pack()

int combios_parse(unsigned char *rom, struct combios_header *header);

#endif