/****************************************************************************/	
/*Portion I: Definitions  shared between VBIOS and Driver                   */
/****************************************************************************/


#ifndef _SHORT_ATOMBIOS_H
#define _SHORT_ATOMBIOS_H

#define ATOM_VERSION_MAJOR                   0x00020000
#define ATOM_VERSION_MINOR                   0x00000002

#define ATOM_HEADER_VERSION (ATOM_VERSION_MAJOR | ATOM_VERSION_MINOR)


#pragma pack(1)                                       /* BIOS data must use byte aligment */

/*  Define offset to location of ROM header. */

#define OFFSET_TO_POINTER_TO_ATOM_ROM_HEADER		0x00000048L
#define OFFSET_TO_ATOM_ROM_IMAGE_SIZE				    0x00000002L

typedef struct _ATOM_COMMON_TABLE_HEADER
{
	UINT16 usStructureSize;
	UINT8  ucTableFormatRevision;   /*Change it when the Parser is not backward compatible */
	UINT8  ucTableContentRevision;  /*Change it only when the table needs to change but the firmware */
                                  /*Image can't be updated, while Driver needs to carry the new table! */
} ATOM_COMMON_TABLE_HEADER;

typedef struct _ATOM_ROM_HEADER
{
	ATOM_COMMON_TABLE_HEADER		sHeader;
	UINT8	 uaFirmWareSignature[4];    /*Signature to distinguish between Atombios and non-atombios, 
											 +                                      atombios should init it as "ATOM", don't change the position */
	UINT16 usBiosRuntimeSegmentAddress;
	UINT16 usProtectedModeInfoOffset;
	UINT16 usConfigFilenameOffset;
	UINT16 usCRC_BlockOffset;
	UINT16 usBIOS_BootupMessageOffset;
	UINT16 usInt10Offset;
	UINT16 usPciBusDevInitCode;
	UINT16 usIoBaseAddress;
	UINT16 usSubsystemVendorID;
	UINT16 usSubsystemID;
	UINT16 usPCI_InfoOffset; 
	UINT16 usMasterCommandTableOffset; /*Offset for SW to get all command table offsets, Don't change the position */
	UINT16 usMasterDataTableOffset;   /*Offset for SW to get all data table offsets, Don't change the position */
	UINT8  ucExtendedFunctionCode;
	UINT8  ucReserved;
} ATOM_ROM_HEADER;

/****************************************************************************/	
// Structure used in Data.mtb
/****************************************************************************/	
typedef struct _ATOM_MASTER_LIST_OF_DATA_TABLES
{
	UINT16        UtilityPipeLine;	        // Offest for the utility to get parser info,Don't change this position!
	UINT16        MultimediaCapabilityInfo; // Only used by MM Lib,latest version 1.1, not configuable from Bios, need to include the table to build Bios 
	UINT16        MultimediaConfigInfo;     // Only used by MM Lib,latest version 2.1, not configuable from Bios, need to include the table to build Bios
	UINT16        StandardVESA_Timing;      // Only used by Bios
	UINT16        FirmwareInfo;             // Shared by various SW components,latest version 1.4
	UINT16        DAC_Info;                 // Will be obsolete from R600
	UINT16        LVDS_Info;                // Shared by various SW components,latest version 1.1 
	UINT16        TMDS_Info;                // Will be obsolete from R600
	UINT16        AnalogTV_Info;            // Shared by various SW components,latest version 1.1 
	UINT16        SupportedDevicesInfo;     // Will be obsolete from R600
	UINT16        GPIO_I2C_Info;            // Shared by various SW components,latest version 1.2 will be used from R600           
	UINT16        VRAM_UsageByFirmware;     // Shared by various SW components,latest version 1.3 will be used from R600
	UINT16        GPIO_Pin_LUT;             // Shared by various SW components,latest version 1.1
	UINT16        VESA_ToInternalModeLUT;   // Only used by Bios
	UINT16        ComponentVideoInfo;       // Shared by various SW components,latest version 2.1 will be used from R600
	UINT16        PowerPlayInfo;            // Shared by various SW components,latest version 2.1,new design from R600
	UINT16        CompassionateData;        // Will be obsolete from R600
	UINT16        SaveRestoreInfo;          // Only used by Bios
	UINT16        PPLL_SS_Info;             // Shared by various SW components,latest version 1.2, used to call SS_Info, change to new name because of int ASIC SS info
	UINT16        OemInfo;                  // Defined and used by external SW, should be obsolete soon
	UINT16        XTMDS_Info;               // Will be obsolete from R600
	UINT16        MclkSS_Info;              // Shared by various SW components,latest version 1.1, only enabled when ext SS chip is used
	UINT16        Object_Header;            // Shared by various SW components,latest version 1.1
	UINT16        IndirectIOAccess;         // Only used by Bios,this table position can't change at all!!
	UINT16        MC_InitParameter;         // Only used by command table
	UINT16        ASIC_VDDC_Info;						// Will be obsolete from R600
	UINT16        ASIC_InternalSS_Info;			// New tabel name from R600, used to be called "ASIC_MVDDC_Info"
	UINT16        TV_VideoMode;							// Only used by command table
	UINT16        VRAM_Info;								// Only used by command table, latest version 1.3
	UINT16        MemoryTrainingInfo;				// Used for VBIOS and Diag utility for memory training purpose since R600. the new table rev start from 2.1
	UINT16        IntegratedSystemInfo;			// Shared by various SW components
	UINT16        ASIC_ProfilingInfo;				// New table name from R600, used to be called "ASIC_VDDCI_Info" for pre-R600
	UINT16        VoltageObjectInfo;				// Shared by various SW components, latest version 1.1
	UINT16				PowerSourceInfo;					// Shared by various SW components, latest versoin 1.1
} ATOM_MASTER_LIST_OF_DATA_TABLES;

typedef struct _ATOM_MASTER_DATA_TABLE
{ 
	ATOM_COMMON_TABLE_HEADER sHeader;  
	ATOM_MASTER_LIST_OF_DATA_TABLES   ListOfDataTables;
} ATOM_MASTER_DATA_TABLE;

typedef union _ATOM_MODE_MISC_INFO_ACCESS
{ 
	UINT16              usAccess;
} ATOM_MODE_MISC_INFO_ACCESS;

/****************************************************************************/	
// Structure used in StandardVESA_TimingTable
//                   AnalogTV_InfoTable 
//                   ComponentVideoInfoTable
/****************************************************************************/	
typedef struct _ATOM_MODE_TIMING
{
	UINT16  usCRTC_H_Total;
	UINT16  usCRTC_H_Disp;
	UINT16  usCRTC_H_SyncStart;
	UINT16  usCRTC_H_SyncWidth;
	UINT16  usCRTC_V_Total;
	UINT16  usCRTC_V_Disp;
	UINT16  usCRTC_V_SyncStart;
	UINT16  usCRTC_V_SyncWidth;
	UINT16  usPixelClock;					                 //in 10Khz unit
	ATOM_MODE_MISC_INFO_ACCESS  susModeMiscInfo;
	UINT16  usCRTC_OverscanRight;
	UINT16  usCRTC_OverscanLeft;
	UINT16  usCRTC_OverscanBottom;
	UINT16  usCRTC_OverscanTop;
	UINT16  usReserve;
	UINT8   ucInternalModeNumber;
	UINT8   ucRefreshRate;
} ATOM_MODE_TIMING;

typedef struct _ATOM_DTD_FORMAT
{
	UINT16  usPixClk;
	UINT16  usHActive;
	UINT16  usHBlanking_Time;
	UINT16  usVActive;
	UINT16  usVBlanking_Time;			
	UINT16  usHSyncOffset;
	UINT16  usHSyncWidth;
	UINT16  usVSyncOffset;
	UINT16  usVSyncWidth;
	UINT16  usImageHSize;
	UINT16  usImageVSize;
	UINT8   ucHBorder;
	UINT8   ucVBorder;
	ATOM_MODE_MISC_INFO_ACCESS susModeMiscInfo;
	UINT8   ucInternalModeNumber;
	UINT8   ucRefreshRate;
} ATOM_DTD_FORMAT;

typedef struct _ATOM_LVDS_INFO_V12
{
	ATOM_COMMON_TABLE_HEADER sHeader;  
	ATOM_DTD_FORMAT     sLCDTiming;
	UINT16              usExtInfoTableOffset;
	UINT16              usSupportedRefreshRate;     //Refer to panel info table in ATOMBIOS extension Spec.
	UINT16              usOffDelayInMs;
	UINT8               ucPowerSequenceDigOntoDEin10Ms;
	UINT8               ucPowerSequenceDEtoBLOnin10Ms;
	UINT8               ucLVDS_Misc;            // Bit0:{=0:single, =1:dual},Bit1 {=0:666RGB, =1:888RGB},Bit2:3:{Grey level}
												// Bit4:{=0:LDI format for RGB888, =1 FPDI format for RGB888}
	                                            // Bit5:{=0:Spatial Dithering disabled;1 Spatial Dithering enabled}
	                                            // Bit6:{=0:Temporal Dithering disabled;1 Temporal Dithering enabled}
	UINT8               ucPanelDefaultRefreshRate;
	UINT8               ucPanelIdentification;
	UINT8               ucSS_Id;
	UINT16              usLCDVenderID;
	UINT16              usLCDProductID;
	UINT8               ucLCDPanel_SpecialHandlingCap; 
	UINT8								ucPanelInfoSize;					//  start from ATOM_DTD_FORMAT to end of panel info, include ExtInfoTable
	UINT8               ucReserved[2];
} ATOM_LVDS_INFO_V12;
	
	
typedef struct _ATOM_STANDARD_VESA_TIMING
{
	ATOM_COMMON_TABLE_HEADER sHeader;  
	char * 				 aModeTimings;      // 16 is not the real array number, just for initial allocation
} ATOM_STANDARD_VESA_TIMING;

#pragma pack()

#endif