1209ff23fSmrg/*
2209ff23fSmrg * Copyright 2007  Egbert Eich   <eich@novell.com>
3209ff23fSmrg * Copyright 2007  Luc Verhaegen <lverhaegen@novell.com>
4209ff23fSmrg * Copyright 2007  Matthias Hopf <mhopf@novell.com>
5209ff23fSmrg * Copyright 2007  Advanced Micro Devices, Inc.
6209ff23fSmrg *
7209ff23fSmrg * Permission is hereby granted, free of charge, to any person obtaining a
8209ff23fSmrg * copy of this software and associated documentation files (the "Software"),
9209ff23fSmrg * to deal in the Software without restriction, including without limitation
10209ff23fSmrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11209ff23fSmrg * and/or sell copies of the Software, and to permit persons to whom the
12209ff23fSmrg * Software is furnished to do so, subject to the following conditions:
13209ff23fSmrg *
14209ff23fSmrg * The above copyright notice and this permission notice shall be included in
15209ff23fSmrg * all copies or substantial portions of the Software.
16209ff23fSmrg *
17209ff23fSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18209ff23fSmrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19209ff23fSmrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20209ff23fSmrg * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
21209ff23fSmrg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22209ff23fSmrg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23209ff23fSmrg * OTHER DEALINGS IN THE SOFTWARE.
24209ff23fSmrg */
25209ff23fSmrg
26209ff23fSmrg
27209ff23fSmrg#ifndef RHD_ATOMBIOS_H_
28209ff23fSmrg# define RHD_ATOMBIOS_H_
29209ff23fSmrg
30209ff23fSmrg//#include "radeon.h"
31209ff23fSmrg
32209ff23fSmrg# ifdef ATOM_BIOS
33209ff23fSmrg
34209ff23fSmrgtypedef enum _AtomBiosRequestID {
35209ff23fSmrg    ATOMBIOS_INIT,
36209ff23fSmrg    ATOMBIOS_TEARDOWN,
37209ff23fSmrg# ifdef ATOM_BIOS_PARSER
38209ff23fSmrg    ATOMBIOS_EXEC,
39209ff23fSmrg#endif
40209ff23fSmrg    ATOMBIOS_ALLOCATE_FB_SCRATCH,
41209ff23fSmrg    ATOMBIOS_GET_CONNECTORS,
42209ff23fSmrg    ATOMBIOS_GET_PANEL_MODE,
43209ff23fSmrg    ATOMBIOS_GET_PANEL_EDID,
44209ff23fSmrg    GET_DEFAULT_ENGINE_CLOCK,
45209ff23fSmrg    GET_DEFAULT_MEMORY_CLOCK,
46209ff23fSmrg    GET_MAX_PIXEL_CLOCK_PLL_OUTPUT,
47209ff23fSmrg    GET_MIN_PIXEL_CLOCK_PLL_OUTPUT,
48209ff23fSmrg    GET_MAX_PIXEL_CLOCK_PLL_INPUT,
49209ff23fSmrg    GET_MIN_PIXEL_CLOCK_PLL_INPUT,
50209ff23fSmrg    GET_MAX_PIXEL_CLK,
51209ff23fSmrg    GET_REF_CLOCK,
52209ff23fSmrg    GET_FW_FB_START,
53209ff23fSmrg    GET_FW_FB_SIZE,
54209ff23fSmrg    ATOM_TMDS_FREQUENCY,
55209ff23fSmrg    ATOM_TMDS_PLL_CHARGE_PUMP,
56209ff23fSmrg    ATOM_TMDS_PLL_DUTY_CYCLE,
57209ff23fSmrg    ATOM_TMDS_PLL_VCO_GAIN,
58209ff23fSmrg    ATOM_TMDS_PLL_VOLTAGE_SWING,
59209ff23fSmrg    ATOM_LVDS_SUPPORTED_REFRESH_RATE,
60209ff23fSmrg    ATOM_LVDS_OFF_DELAY,
61209ff23fSmrg    ATOM_LVDS_SEQ_DIG_ONTO_DE,
62209ff23fSmrg    ATOM_LVDS_SEQ_DE_TO_BL,
63209ff23fSmrg    ATOM_LVDS_DITHER,
64209ff23fSmrg    ATOM_LVDS_DUALLINK,
65209ff23fSmrg    ATOM_LVDS_24BIT,
66209ff23fSmrg    ATOM_LVDS_GREYLVL,
67209ff23fSmrg    ATOM_LVDS_FPDI,
68209ff23fSmrg    ATOM_GPIO_QUERIES,
69209ff23fSmrg    ATOM_GPIO_I2C_CLK_MASK,
70209ff23fSmrg    ATOM_DAC1_BG_ADJ,
71209ff23fSmrg    ATOM_DAC1_DAC_ADJ,
72209ff23fSmrg    ATOM_DAC1_FORCE,
73209ff23fSmrg    ATOM_DAC2_CRTC2_BG_ADJ,
74209ff23fSmrg    ATOM_DAC2_CRTC2_DAC_ADJ,
75209ff23fSmrg    ATOM_DAC2_CRTC2_FORCE,
76209ff23fSmrg    ATOM_DAC2_CRTC2_MUX_REG_IND,
77209ff23fSmrg    ATOM_DAC2_CRTC2_MUX_REG_INFO,
78209ff23fSmrg    ATOMBIOS_GET_CV_MODES,
79209ff23fSmrg    FUNC_END
80209ff23fSmrg} AtomBiosRequestID;
81209ff23fSmrg
82209ff23fSmrgtypedef enum _AtomBiosResult {
83209ff23fSmrg    ATOM_SUCCESS,
84209ff23fSmrg    ATOM_FAILED,
85209ff23fSmrg    ATOM_NOT_IMPLEMENTED
86209ff23fSmrg} AtomBiosResult;
87209ff23fSmrg
88209ff23fSmrgtypedef struct AtomExec {
89209ff23fSmrg    int index;
90209ff23fSmrg    pointer pspace;
91209ff23fSmrg    pointer *dataSpace;
92209ff23fSmrg} AtomExecRec, *AtomExecPtr;
93209ff23fSmrg
94209ff23fSmrgtypedef struct AtomFb {
95209ff23fSmrg    unsigned int start;
96209ff23fSmrg    unsigned int size;
97209ff23fSmrg} AtomFbRec, *AtomFbPtr;
98209ff23fSmrg
99209ff23fSmrgtypedef union AtomBiosArg
100209ff23fSmrg{
101209ff23fSmrg    uint32_t val;
102209ff23fSmrg    struct rhdConnectorInfo	*connectorInfo;
103209ff23fSmrg    unsigned char*		EDIDBlock;
104209ff23fSmrg    atomBiosHandlePtr		atomhandle;
105209ff23fSmrg    DisplayModePtr		modes;
106209ff23fSmrg    AtomExecRec			exec;
107209ff23fSmrg    AtomFbRec			fb;
10868105dcbSveego    ScrnInfoPtr                 pScrn;
109209ff23fSmrg} AtomBiosArgRec, *AtomBiosArgPtr;
110209ff23fSmrg
111209ff23fSmrgextern AtomBiosResult
11268105dcbSveegoRHDAtomBiosFunc(ScrnInfoPtr pScrn, atomBiosHandlePtr handle,
113209ff23fSmrg		AtomBiosRequestID id, AtomBiosArgPtr data);
114209ff23fSmrg
115209ff23fSmrgextern Bool
116209ff23fSmrgRADEONGetATOMConnectorInfoFromBIOSObject (ScrnInfoPtr pScrn);
117209ff23fSmrgextern Bool
118209ff23fSmrgRADEONGetATOMConnectorInfoFromBIOSConnectorTable (ScrnInfoPtr pScrn);
119209ff23fSmrg
120209ff23fSmrgextern int
121ad43ddacSmrgatombios_clk_gating_setup(ScrnInfoPtr pScrn, Bool enable);
122209ff23fSmrg
123209ff23fSmrgextern int
124ad43ddacSmrgatombios_static_pwrmgt_setup(ScrnInfoPtr pScrn, Bool enable);
125ad43ddacSmrg
126ad43ddacSmrgextern int
127ad43ddacSmrgatombios_set_engine_clock(ScrnInfoPtr pScrn, uint32_t engclock);
128ad43ddacSmrg
129ad43ddacSmrgextern int
130ad43ddacSmrgatombios_set_memory_clock(ScrnInfoPtr pScrn, uint32_t memclock);
131209ff23fSmrg
132209ff23fSmrgextern Bool
133209ff23fSmrgRADEONGetATOMTVInfo(xf86OutputPtr output);
134209ff23fSmrg
135209ff23fSmrgextern int
136b7e1c893Smrgatombios_external_tmds_setup(xf86OutputPtr output, int action);
137209ff23fSmrg
138209ff23fSmrgextern void
139209ff23fSmrgatombios_get_command_table_version(atomBiosHandlePtr atomBIOS, int index, int *major, int *minor);
140209ff23fSmrg
141b7e1c893Smrgextern xf86MonPtr
142b7e1c893Smrgradeon_atom_get_edid(xf86OutputPtr output);
143b7e1c893Smrg
144209ff23fSmrgBool
145209ff23fSmrgrhdAtomASICInit(atomBiosHandlePtr handle);
146209ff23fSmrg
147209ff23fSmrg# include "xf86int10.h"
148209ff23fSmrg# ifdef ATOM_BIOS_PARSER
149209ff23fSmrg#  define INT8 INT8
150209ff23fSmrg#  define INT16 INT16
151209ff23fSmrg#  define INT32 INT32
152209ff23fSmrg#  include "CD_Common_Types.h"
153209ff23fSmrg# else
154209ff23fSmrg#  ifndef ULONG
155209ff23fSmrgtypedef unsigned int ULONG;
156209ff23fSmrg#   define ULONG ULONG
157209ff23fSmrg#  endif
158209ff23fSmrg#  ifndef UCHAR
159209ff23fSmrgtypedef unsigned char UCHAR;
160209ff23fSmrg#   define UCHAR UCHAR
161209ff23fSmrg#  endif
162209ff23fSmrg#  ifndef USHORT
163209ff23fSmrgtypedef unsigned short USHORT;
164209ff23fSmrg#   define USHORT USHORT
165209ff23fSmrg#  endif
166209ff23fSmrg# endif
167209ff23fSmrg
168209ff23fSmrg# include "atombios.h"
169209ff23fSmrg# include "ObjectID.h"
170209ff23fSmrg
171209ff23fSmrg
172209ff23fSmrg/*
173209ff23fSmrg * This works around a bug in atombios.h where
174209ff23fSmrg * ATOM_MAX_SUPPORTED_DEVICE_INFO is specified incorrectly.
175209ff23fSmrg */
176209ff23fSmrg
177209ff23fSmrg#define ATOM_MAX_SUPPORTED_DEVICE_INFO_HD (ATOM_DEVICE_RESERVEDF_INDEX+1)
178209ff23fSmrgtypedef struct _ATOM_SUPPORTED_DEVICES_INFO_HD
179209ff23fSmrg{
180209ff23fSmrg    ATOM_COMMON_TABLE_HEADER      sHeader;
181209ff23fSmrg    USHORT                        usDeviceSupport;
182209ff23fSmrg    ATOM_CONNECTOR_INFO_I2C       asConnInfo[ATOM_MAX_SUPPORTED_DEVICE_INFO_HD];
183209ff23fSmrg    ATOM_CONNECTOR_INC_SRC_BITMAP asIntSrcInfo[ATOM_MAX_SUPPORTED_DEVICE_INFO_HD];
184209ff23fSmrg} ATOM_SUPPORTED_DEVICES_INFO_HD;
185209ff23fSmrg
186209ff23fSmrgtypedef struct _atomDataTables
187209ff23fSmrg{
188209ff23fSmrg    unsigned char                       *UtilityPipeLine;
189209ff23fSmrg    ATOM_MULTIMEDIA_CAPABILITY_INFO     *MultimediaCapabilityInfo;
190209ff23fSmrg    ATOM_MULTIMEDIA_CONFIG_INFO         *MultimediaConfigInfo;
191209ff23fSmrg    ATOM_STANDARD_VESA_TIMING           *StandardVESA_Timing;
192209ff23fSmrg    union {
193209ff23fSmrg        void                            *base;
194209ff23fSmrg        ATOM_FIRMWARE_INFO              *FirmwareInfo;
195209ff23fSmrg        ATOM_FIRMWARE_INFO_V1_2         *FirmwareInfo_V_1_2;
196209ff23fSmrg        ATOM_FIRMWARE_INFO_V1_3         *FirmwareInfo_V_1_3;
197209ff23fSmrg        ATOM_FIRMWARE_INFO_V1_4         *FirmwareInfo_V_1_4;
1980974d292Smrg        ATOM_FIRMWARE_INFO_V2_1         *FirmwareInfo_V_2_1;
199209ff23fSmrg    } FirmwareInfo;
200209ff23fSmrg    ATOM_DAC_INFO                       *DAC_Info;
201209ff23fSmrg    union {
202209ff23fSmrg        void                            *base;
203209ff23fSmrg        ATOM_LVDS_INFO                  *LVDS_Info;
204209ff23fSmrg        ATOM_LVDS_INFO_V12              *LVDS_Info_v12;
205209ff23fSmrg    } LVDS_Info;
206209ff23fSmrg    ATOM_TMDS_INFO                      *TMDS_Info;
207b7e1c893Smrg    union {
208b7e1c893Smrg	void                            *base;
209b7e1c893Smrg	ATOM_ANALOG_TV_INFO             *AnalogTV_Info;
210b7e1c893Smrg	ATOM_ANALOG_TV_INFO_V1_2        *AnalogTV_Info_v1_2;
211b7e1c893Smrg    } AnalogTV_Info;
212209ff23fSmrg    union {
213209ff23fSmrg        void                            *base;
214209ff23fSmrg        ATOM_SUPPORTED_DEVICES_INFO     *SupportedDevicesInfo;
215209ff23fSmrg        ATOM_SUPPORTED_DEVICES_INFO_2   *SupportedDevicesInfo_2;
216209ff23fSmrg        ATOM_SUPPORTED_DEVICES_INFO_2d1 *SupportedDevicesInfo_2d1;
217209ff23fSmrg        ATOM_SUPPORTED_DEVICES_INFO_HD  *SupportedDevicesInfo_HD;
218209ff23fSmrg    } SupportedDevicesInfo;
219209ff23fSmrg    ATOM_GPIO_I2C_INFO                  *GPIO_I2C_Info;
220209ff23fSmrg    ATOM_VRAM_USAGE_BY_FIRMWARE         *VRAM_UsageByFirmware;
221209ff23fSmrg    ATOM_GPIO_PIN_LUT                   *GPIO_Pin_LUT;
222209ff23fSmrg    ATOM_VESA_TO_INTENAL_MODE_LUT       *VESA_ToInternalModeLUT;
223209ff23fSmrg    union {
224209ff23fSmrg        void                            *base;
225209ff23fSmrg        ATOM_COMPONENT_VIDEO_INFO       *ComponentVideoInfo;
226209ff23fSmrg        ATOM_COMPONENT_VIDEO_INFO_V21   *ComponentVideoInfo_v21;
227209ff23fSmrg    } ComponentVideoInfo;
228209ff23fSmrg/**/unsigned char                       *PowerPlayInfo;
229209ff23fSmrg    COMPASSIONATE_DATA                  *CompassionateData;
230209ff23fSmrg    ATOM_DISPLAY_DEVICE_PRIORITY_INFO   *SaveRestoreInfo;
231209ff23fSmrg/**/unsigned char                       *PPLL_SS_Info;
232209ff23fSmrg    ATOM_OEM_INFO                       *OemInfo;
233209ff23fSmrg    ATOM_XTMDS_INFO                     *XTMDS_Info;
234209ff23fSmrg    ATOM_ASIC_MVDD_INFO                 *MclkSS_Info;
235209ff23fSmrg    ATOM_OBJECT_HEADER                  *Object_Header;
236209ff23fSmrg    INDIRECT_IO_ACCESS                  *IndirectIOAccess;
237209ff23fSmrg    ATOM_MC_INIT_PARAM_TABLE            *MC_InitParameter;
238209ff23fSmrg/**/unsigned char                       *ASIC_VDDC_Info;
239209ff23fSmrg    ATOM_ASIC_INTERNAL_SS_INFO          *ASIC_InternalSS_Info;
240209ff23fSmrg/**/unsigned char                       *TV_VideoMode;
241209ff23fSmrg    union {
242209ff23fSmrg        void                            *base;
243209ff23fSmrg        ATOM_VRAM_INFO_V2               *VRAM_Info_v2;
244209ff23fSmrg        ATOM_VRAM_INFO_V3               *VRAM_Info_v3;
245209ff23fSmrg    } VRAM_Info;
246209ff23fSmrg    ATOM_MEMORY_TRAINING_INFO           *MemoryTrainingInfo;
247209ff23fSmrg    union {
248209ff23fSmrg        void                            *base;
249209ff23fSmrg        ATOM_INTEGRATED_SYSTEM_INFO     *IntegratedSystemInfo;
250209ff23fSmrg        ATOM_INTEGRATED_SYSTEM_INFO_V2  *IntegratedSystemInfo_v2;
251209ff23fSmrg    } IntegratedSystemInfo;
252209ff23fSmrg    ATOM_ASIC_PROFILING_INFO            *ASIC_ProfilingInfo;
253209ff23fSmrg    ATOM_VOLTAGE_OBJECT_INFO            *VoltageObjectInfo;
254209ff23fSmrg    ATOM_POWER_SOURCE_INFO              *PowerSourceInfo;
255209ff23fSmrg} atomDataTables, *atomDataTablesPtr;
256209ff23fSmrg
257209ff23fSmrgtypedef struct _atomBiosHandle {
25868105dcbSveego    ScrnInfoPtr pScrn;
259209ff23fSmrg    unsigned char *BIOSBase;
260209ff23fSmrg    atomDataTablesPtr atomDataPtr;
261209ff23fSmrg    unsigned int cmd_offset;
262209ff23fSmrg    pointer *scratchBase;
263209ff23fSmrg    uint32_t fbBase;
264209ff23fSmrg#if XSERVER_LIBPCIACCESS
265209ff23fSmrg    struct pci_device *device;
266209ff23fSmrg#else
267209ff23fSmrg    PCITAG PciTag;
268209ff23fSmrg#endif
269209ff23fSmrg    unsigned int BIOSImageSize;
270209ff23fSmrg} atomBiosHandleRec;
271209ff23fSmrg
272209ff23fSmrg# endif
273209ff23fSmrg
274209ff23fSmrgextern Bool
275ad43ddacSmrgRADEONATOMGetTVTimings(ScrnInfoPtr pScrn, int index, DisplayModePtr mode);
276ad43ddacSmrg
277ad43ddacSmrgextern void
278ad43ddacSmrgRADEONATOMGetIGPInfo(ScrnInfoPtr pScrn);
279ad43ddacSmrg
280ad43ddacSmrgextern Bool
281ad43ddacSmrgRADEONGetATOMClockInfo(ScrnInfoPtr pScrn);
282209ff23fSmrg
283b7e1c893Smrgextern uint32_t
284b7e1c893Smrgradeon_get_device_index(uint32_t device_support);
285b7e1c893Smrgextern radeon_encoder_ptr
286b7e1c893Smrgradeon_get_encoder(xf86OutputPtr output);
287b7e1c893Smrgextern Bool
288b7e1c893Smrgradeon_add_encoder(ScrnInfoPtr pScrn, uint32_t encoder_id, uint32_t device_support);
289b7e1c893Smrgextern uint32_t
290b7e1c893Smrgradeon_get_encoder_id_from_supported_device(ScrnInfoPtr pScrn, uint32_t supported_device, int dac);
291b7e1c893Smrg
2920974d292Smrgvoid atombios_set_output_crtc_source(xf86OutputPtr output);
293209ff23fSmrg#endif /*  RHD_ATOMBIOS_H_ */
294