0,0 → 1,645 |
|
#include "pci.h" |
|
#include "rhd_regs.h" |
|
typedef struct _ScrnInfoRec *ScrnInfoPtr; |
typedef struct RHDRec *RHDPtr; |
|
typedef struct { |
int frameX0; |
int frameY0; |
int virtualX; |
int virtualY; |
int depth; |
int fbbpp; |
// rgb weight; |
// rgb blackColour; |
// rgb whiteColour; |
int defaultVisual; |
char ** modes; |
pointer options; |
} DispRec, *DispPtr; |
|
|
typedef struct _ScrnInfoRec |
{ |
int scrnIndex; |
RHDPtr rhdPtr; |
// int driverVersion; |
char * driverName; /* canonical name used in */ |
/* the config file */ |
// ScreenPtr pScreen; /* Pointer to the ScreenRec */ |
// int scrnIndex; /* Number of this screen */ |
// Bool configured; /* Is this screen valid */ |
// int origIndex; /* initial number assigned to |
// * this screen before |
// * finalising the number of |
// * available screens */ |
|
/* Display-wide screenInfo values needed by this screen */ |
// int imageByteOrder; |
// int bitmapScanlineUnit; |
// int bitmapScanlinePad; |
// int bitmapBitOrder; |
// int numFormats; |
// PixmapFormatRec formats[MAXFORMATS]; |
// PixmapFormatRec fbFormat; |
|
int bitsPerPixel; /* fb bpp */ |
// Pix24Flags pixmap24; /* pixmap pref for depth 24 */ |
int depth; /* depth of default visual */ |
// MessageType depthFrom; /* set from config? */ |
// MessageType bitsPerPixelFrom; /* set from config? */ |
// rgb weight; /* r/g/b weights */ |
// rgb mask; /* rgb masks */ |
// rgb offset; /* rgb offsets */ |
// int rgbBits; /* Number of bits in r/g/b */ |
// Gamma gamma; /* Gamma of the monitor */ |
// int defaultVisual; /* default visual class */ |
int maxHValue; /* max horizontal timing */ |
int maxVValue; /* max vertical timing value */ |
int virtualX; /* Virtual width */ |
int virtualY; /* Virtual height */ |
int xInc; /* Horizontal timing increment */ |
// MessageType virtualFrom; /* set from config? */ |
int displayWidth; /* memory pitch */ |
int frameX0; /* viewport position */ |
int frameY0; |
int frameX1; |
int frameY1; |
int zoomLocked; /* Disallow mode changes */ |
DisplayModePtr modePool; /* list of compatible modes */ |
DisplayModePtr modes; /* list of actual modes */ |
DisplayModePtr currentMode; /* current mode |
* This was previously |
* overloaded with the modes |
* field, which is a pointer |
* into a circular list */ |
// confScreenPtr confScreen; /* Screen config info */ |
// MonPtr monitor; /* Monitor information */ |
DispPtr display; /* Display information */ |
// int * entityList; /* List of device entities */ |
// int numEntities; |
int widthmm; /* physical display dimensions in mm */ |
int heightmm; |
int xDpi; /* width DPI */ |
int yDpi; /* height DPI */ |
char * name; /* Name to prefix messages */ |
// pointer driverPrivate; /* Driver private area */ |
// DevUnion * privates; /* Other privates can hook in |
// * here */ |
// DriverPtr drv; /* xf86DriverList[] entry */ |
// pointer module; /* Pointer to module head */ |
// int colorKey; |
// int overlayFlags; |
|
/* Some of these may be moved out of here into the driver private area */ |
|
// char * chipset; /* chipset name */ |
// char * ramdac; /* ramdac name */ |
// char * clockchip; /* clock name */ |
// Bool progClock; /* clock is programmable */ |
// int numClocks; /* number of clocks */ |
// int clock[MAXCLOCKS]; /* list of clock frequencies */ |
// int videoRam; /* amount of video ram (kb) */ |
// unsigned long biosBase; /* Base address of video BIOS */ |
// unsigned long memPhysBase; /* Physical address of FB */ |
// unsigned long fbOffset; /* Offset of FB in the above */ |
// IOADDRESS domainIOBase; /* Domain I/O base address */ |
// int memClk; /* memory clock */ |
// int textClockFreq; /* clock of text mode */ |
// Bool flipPixels; /* swap default black/white */ |
// pointer options; |
|
// int chipID; |
// int chipRev; |
// int racMemFlags; |
// int racIoFlags; |
// pointer access; |
// xf86CurrentAccessPtr CurrentAccess; |
// resType resourceType; |
// pointer busAccess; |
|
/* Allow screens to be enabled/disabled individually */ |
// Bool vtSema; |
// DevUnion pixmapPrivate; /* saved devPrivate from pixmap */ |
|
/* hw cursor moves at SIGIO time */ |
// Bool silkenMouse; |
|
/* Storage for clockRanges and adjustFlags for use with the VidMode ext */ |
// ClockRangesPtr clockRanges; |
// int adjustFlags; |
|
/* |
* These can be used when the minor ABI version is incremented. |
* The NUM_* parameters must be reduced appropriately to keep the |
* structure size and alignment unchanged. |
*/ |
// int reservedInt[NUM_RESERVED_INTS]; |
|
// int * entityInstanceList; |
// pointer reservedPtr[NUM_RESERVED_POINTERS]; |
|
/* |
* Driver entry points. |
* |
*/ |
|
/* |
xf86ProbeProc *Probe; |
xf86PreInitProc *PreInit; |
xf86ScreenInitProc *ScreenInit; |
xf86SwitchModeProc *SwitchMode; |
xf86AdjustFrameProc *AdjustFrame; |
xf86EnterVTProc *EnterVT; |
xf86LeaveVTProc *LeaveVT; |
xf86FreeScreenProc *FreeScreen; |
xf86ValidModeProc *ValidMode; |
xf86EnableDisableFBAccessProc *EnableDisableFBAccess; |
xf86SetDGAModeProc *SetDGAMode; |
xf86ChangeGammaProc *ChangeGamma; |
xf86PointerMovedProc *PointerMoved; |
xf86PMEventProc *PMEvent; |
xf86HandleMessageProc *HandleMessage; |
xf86DPMSSetProc *DPMSSet; |
xf86LoadPaletteProc *LoadPalette; |
xf86SetOverscanProc *SetOverscan; |
xorgRRFuncProc *RRFunc; |
*/ |
/* |
* This can be used when the minor ABI version is incremented. |
* The NUM_* parameter must be reduced appropriately to keep the |
* structure size and alignment unchanged. |
*/ |
// funcPointer reservedFuncs[NUM_RESERVED_FUNCS]; |
|
} ScrnInfoRec; |
|
|
|
#pragma pack(push, 1) |
typedef struct |
{ |
CARD16 device; |
CARD16 family; |
}PciChipset_t; |
#pragma pack(pop) |
|
#define VENDOR_ATI 0x1002 |
|
enum RHD_CHIPSETS { |
RHD_UNKNOWN = 0, |
/* R500 */ |
RHD_RV505, |
RHD_RV515, |
RHD_RV516, |
RHD_R520, |
RHD_RV530, |
RHD_RV535, |
RHD_RV550, |
RHD_RV560, |
RHD_RV570, |
RHD_R580, |
/* R500 Mobility */ |
RHD_M52, |
RHD_M54, |
RHD_M56, |
RHD_M58, |
RHD_M62, |
RHD_M64, |
RHD_M66, |
RHD_M68, |
RHD_M71, |
/* R500 integrated */ |
RHD_RS600, |
RHD_RS690, |
RHD_RS740, |
/* R600 */ |
RHD_R600, |
RHD_RV610, |
RHD_RV630, |
/* R600 Mobility */ |
RHD_M72, |
RHD_M74, |
RHD_M76, |
/* RV670 came into existence after RV6x0 and M7x */ |
RHD_RV670, |
RHD_M88, |
RHD_R680, |
RHD_RV620, |
RHD_M82, |
RHD_RV635, |
RHD_M86, |
RHD_RS780, |
RHD_RV770, |
RHD_R700, |
RHD_M98, |
RHD_RV730, |
RHD_M96, |
RHD_RV710, |
RHD_CHIP_END |
}; |
|
enum RHD_FAMILIES { |
RHD_FAMILY_UNKNOWN = 0, |
RHD_FAMILY_RV515, |
RHD_FAMILY_R520, |
RHD_FAMILY_RV530, |
RHD_FAMILY_RV560, |
RHD_FAMILY_RV570, |
RHD_FAMILY_R580, |
RHD_FAMILY_RS690, |
RHD_FAMILY_R600, |
RHD_FAMILY_RV610, |
RHD_FAMILY_RV630, |
RHD_FAMILY_RV670, |
RHD_FAMILY_RV620, |
RHD_FAMILY_RV635, |
RHD_FAMILY_RS780 |
}; |
|
enum RHD_HPD_USAGE { |
RHD_HPD_USAGE_AUTO = 0, |
RHD_HPD_USAGE_OFF, |
RHD_HPD_USAGE_NORMAL, |
RHD_HPD_USAGE_SWAP, |
RHD_HPD_USAGE_AUTO_SWAP, |
RHD_HPD_USAGE_AUTO_OFF |
}; |
|
enum RHD_TV_MODE { |
RHD_TV_NONE = 0, |
RHD_TV_NTSC = 1, |
RHD_TV_NTSCJ = 1 << 2, |
RHD_TV_PAL = 1 << 3, |
RHD_TV_PALM = 1 << 4, |
RHD_TV_PALCN = 1 << 5, |
RHD_TV_PALN = 1 << 6, |
RHD_TV_PAL60 = 1 << 7, |
RHD_TV_SECAM = 1 << 8, |
RHD_TV_CV = 1 << 9 |
}; |
|
enum rhdPropertyAction { |
rhdPropertyCheck, |
rhdPropertyGet, |
rhdPropertySet |
}; |
|
union rhdPropertyData |
{ |
CARD32 integer; |
char *string; |
Bool Bool; |
}; |
|
#define RHD_CONNECTORS_MAX 6 |
|
/* Just define where which PCI BAR lives for now. Will deal with different |
* locations as soon as cards with a different BAR layout arrives. |
*/ |
#define RHD_FB_BAR 0 |
#define RHD_MMIO_BAR 2 |
|
/* More realistic powermanagement */ |
#define RHD_POWER_ON 0 |
#define RHD_POWER_RESET 1 /* off temporarily */ |
#define RHD_POWER_SHUTDOWN 2 /* long term shutdown */ |
#define RHD_POWER_UNKNOWN 3 /* initial state */ |
|
#define RHD_MEM_GART 1 |
#define RHD_MEM_FB 2 |
|
|
enum rhdCardType { |
RHD_CARD_NONE, |
RHD_CARD_AGP, |
RHD_CARD_PCIE |
}; |
|
enum { |
RHD_PCI_CAPID_AGP = 0x02, |
RHD_PCI_CAPID_PCIE = 0x10 |
}; |
|
typedef struct BIOSScratchOutputPrivate rhdOutputDriverPrivate; |
typedef struct _rhdI2CRec *rhdI2CPtr; |
typedef struct _atomBiosHandle *atomBiosHandlePtr; |
typedef struct _rhdShadowRec *rhdShadowPtr; |
|
typedef struct _RHDopt { |
Bool set; |
union { |
Bool bool; |
int integer; |
unsigned long uslong; |
double real; |
double freq; |
char *string; |
} val; |
} RHDOpt, *RHDOptPtr; |
|
|
//////////////////////////// |
typedef enum |
{ |
CONNECTOR_NONE, // 0 |
CONNECTOR_VGA, // 1 |
CONNECTOR_DVI_I, // 2 |
CONNECTOR_DVI_D, // 3 |
CONNECTOR_DVI_A, // 4 |
CONNECTOR_STV, // 5 |
CONNECTOR_CTV, // 6 |
CONNECTOR_LVDS, // 7 |
CONNECTOR_DIGITAL, // 8 |
CONNECTOR_SCART, // 9 |
CONNECTOR_HDMI_TYPE_A, // 10 |
CONNECTOR_HDMI_TYPE_B, // 11 |
CONNECTOR_0XC, // 12 |
CONNECTOR_0XD, // 13 |
CONNECTOR_DIN, // 14 |
CONNECTOR_DISPLAY_PORT, // 15 |
CONNECTOR_UNSUPPORTED |
} RADEONConnectorType; |
|
typedef enum |
{ |
DAC_NONE = 0, |
DAC_PRIMARY = 1, |
DAC_TVDAC = 2, |
DAC_EXT = 3 |
} RADEONDacType; |
|
typedef enum |
{ |
TMDS_NONE = 0, |
TMDS_INT = 1, |
TMDS_EXT = 2, |
TMDS_LVTMA = 3, |
TMDS_DDIA = 4 |
} RADEONTmdsType; |
|
typedef struct |
{ |
Bool valid; |
CARD32 mask_clk_reg; |
CARD32 mask_data_reg; |
CARD32 put_clk_reg; |
CARD32 put_data_reg; |
CARD32 get_clk_reg; |
CARD32 get_data_reg; |
CARD32 mask_clk_mask; |
CARD32 mask_data_mask; |
CARD32 put_clk_mask; |
CARD32 put_data_mask; |
CARD32 get_clk_mask; |
CARD32 get_data_mask; |
} RADEONI2CBusRec, *RADEONI2CBusPtr; |
|
typedef struct { |
RADEONDacType DACType; |
RADEONTmdsType TMDSType; |
RADEONConnectorType ConnectorType; |
Bool valid; |
int output_id; |
int devices; |
int hpd_mask; |
RADEONI2CBusRec ddc_i2c; |
} RADEONBIOSConnector; |
|
/////////////////////////////////////////// |
|
|
|
typedef struct RHDRec |
{ |
ScrnInfoPtr pScrn; |
int scrnIndex; |
|
CARD32 MMIOBase; |
CARD32 MMIOMapSize; |
CARD32 videoRam; |
|
enum RHD_HPD_USAGE hpdUsage; |
RHDOpt forceReduced; |
|
CARD32 FbBase; /* map base of fb */ |
CARD32 FbIntAddress; /* card internal address of FB */ |
CARD32 FbIntSize; /* card internal FB aperture size */ |
|
CARD32 FbMapSize; |
|
CARD32 FbFreeStart; |
CARD32 FbFreeSize; |
|
/* visible part of the framebuffer */ |
unsigned int FbScanoutStart; |
unsigned int FbScanoutSize; |
|
unsigned char* BIOSCopy; |
|
enum RHD_CHIPSETS ChipSet; |
struct rhdCard *Card; |
char *chipset_name; |
|
Bool IsMobility; |
Bool IsIGP; |
Bool HasCRTC2; |
Bool HasSingleDAC; |
Bool InternalTVOut; |
|
u32_t bus; |
u32_t devfn; |
|
PCITAG PciTag; |
PCITAG NBPciTag; |
|
CARD16 PciDeviceID; |
enum rhdCardType cardType; |
|
CARD16 subvendor_id; |
CARD16 subdevice_id; |
pciVideoRec pci; |
|
struct _I2CBusRec **I2C; /* I2C bus list */ |
atomBiosHandlePtr atomBIOS; /* handle for AtomBIOS */ |
|
struct rhdMC *MC; |
struct rhdVGA *VGA; |
struct rhdCrtc *Crtc[2]; |
struct rhdPLL *PLLs[2]; /* Pixelclock PLLs */ |
|
struct rhdLUTStore *LUTStore; |
struct rhdLUT *LUT[2]; |
|
struct rhdConnector *Connector[RHD_CONNECTORS_MAX]; |
|
struct rhdOutput *Outputs; |
|
struct rhdHPD *HPD; /* Hot plug detect subsystem */ |
enum RHD_TV_MODE tvMode; |
struct rhdMonitor *ConfigMonitor; |
|
struct mem_block *fb_heap; |
struct mem_block *gart_heap; |
|
RHDOpt scaleTypeOpt; |
|
int verbosity; |
|
|
/* AtomBIOS usage */ |
RHDOpt UseAtomBIOS; |
CARD32 UseAtomFlags; |
|
struct rhdOutput *DigEncoderOutput[2]; |
}RHD_t; |
|
typedef struct { |
int token; /* id of the token */ |
const char * name; /* token name */ |
} SymTabRec, *SymTabPtr; |
|
extern inline CARD32 _RHDRegRead(RHDPtr rhdPtr, CARD16 offset) |
{ |
return *(volatile CARD32 *)((CARD8*)(rhdPtr->MMIOBase + offset)); |
} |
|
extern inline void |
_RHDRegWrite(RHDPtr rhdPtr, CARD16 offset, CARD32 value) |
{ |
*(volatile CARD32 *)((CARD8 *)(rhdPtr->MMIOBase + offset)) = value; |
} |
|
extern inline void |
_RHDRegMask(RHDPtr rhdPtr, CARD16 offset, CARD32 value, CARD32 mask) |
{ |
CARD32 tmp; |
|
tmp = _RHDRegRead(rhdPtr, offset); |
tmp &= ~mask; |
tmp |= (value & mask); |
_RHDRegWrite(rhdPtr, offset, tmp); |
}; |
|
extern inline CARD32 |
_RHDReadPLL(RHDPtr rhdPtr, CARD16 offset) |
{ |
_RHDRegWrite(rhdPtr, CLOCK_CNTL_INDEX, (offset & PLL_ADDR)); |
return _RHDRegRead(rhdPtr, CLOCK_CNTL_DATA); |
} |
|
extern inline void |
_RHDWritePLL(RHDPtr rhdPtr, CARD16 offset, CARD32 data) |
{ |
_RHDRegWrite(rhdPtr, CLOCK_CNTL_INDEX, (offset & PLL_ADDR) | PLL_WR_EN); |
_RHDRegWrite(rhdPtr, CLOCK_CNTL_DATA, data); |
} |
|
|
enum RHD_FAMILIES RHDFamily(enum RHD_CHIPSETS chipset); |
|
extern CARD32 _RHDReadMC(int scrnIndex, CARD32 addr); |
#define RHDReadMC(ptr,addr) _RHDReadMC((int)(ptr),(addr)) |
|
extern void _RHDWriteMC(int scrnIndex, CARD32 addr, CARD32 data); |
#define RHDWriteMC(ptr,addr,value) _RHDWriteMC((int)(ptr),(addr),(value)) |
|
#define RHDRegRead(ptr, offset) \ |
_RHDRegRead((RHDPtr)((ptr)->scrnIndex), (offset)) |
|
#define RHDRegWrite(ptr, offset, value) \ |
_RHDRegWrite((RHDPtr)((ptr)->scrnIndex), (offset), (value)) |
|
#define RHDRegMask(ptr, offset, value, mask) \ |
_RHDRegMask((RHDPtr)((ptr)->scrnIndex), (offset), (value), (mask)) |
|
#define RHDRegMaskD(ptr, offset, value, mask) \ |
RHDRegMask(ptr, offset, value, mask) |
|
char * RhdAppendString(char *s1, const char *s2); |
|
|
|
#define LOG_DEBUG 0 |
|
#define X_ERROR 0 |
#define X_WARNING 1 |
#define X_INFO 2 |
#define X_NONE 3 |
#define X_PROBED 4 |
|
/* |
#ifdef DBG_ALL |
#undef DBG_CALL |
#undef DBG_MSG |
#undef DBG_CAIL |
|
#define DBG_CALL |
#define DBG_MSG |
#define DBG_CAIL |
#endif |
*/ |
|
|
#ifdef DBG_CALL |
#define RHDFUNC(ptr) dbgprintf("FUNCTION: %s\n", __func__) |
#else |
#define RHDFUNC(ptr) |
#endif |
|
#ifdef DBG_MSG |
#define xf86Msg(a, format,...) dbgprintf(format,##__VA_ARGS__) |
#define xf86MsgVerb(a,b,format,...) dbgprintf(format,##__VA_ARGS__) |
#define xf86DrvMsg(a,b,format,...) dbgprintf(format,##__VA_ARGS__) |
#define xf86DrvMsgVerb(a,b,c,format,...) dbgprintf(format,##__VA_ARGS__) |
#define xf86VDrvMsgVerb(a,b,c,format,...) dbgprintf(format,##__VA_ARGS__) |
|
#define RHDDebug(a,format,...) dbgprintf(format,##__VA_ARGS__) |
#define RHDDebugCont(format,...) dbgprintf(format,##__VA_ARGS__) |
#define RHDDebugVerb(a,b,format,...) dbgprintf(format,##__VA_ARGS__) |
#else |
#define xf86Msg(a, format,...) |
#define xf86MsgVerb(a,b,format,...) |
#define xf86DrvMsg(a,b,format,...) |
#define xf86DrvMsgVerb(a,b,c,format,...) |
#define xf86VDrvMsgVerb(a,b,c,format,...) |
|
#define RHDDebug(a,format,...) |
#define RHDDebugCont(format,...) |
#define RHDDebugVerb(a,b,format,...) |
#endif |
|
#ifdef DBG_CAIL |
#define CAILFUNC(a) dbgprintf("CAIL: %s\n", __func__) |
#define CailDebug(a,format,...) dbgprintf(format,##__VA_ARGS__) |
#else |
#define CAILFUNC(a) |
#define CailDebug(a,format,...) |
#endif |
|
#define DBG(x) x |
#define ErrorF dbgprintf |
|
#define ASSERT(expr) |
|
#define ASSERTF(expr,format) |
|
#define RHDPTRI(p) ((RHDPtr)((p)->scrnIndex)) |
#define RHDPTR(p) ((p)->rhdPtr) |
|
#define RHDFUNCI(scrnIndex) RHDDebug(scrnIndex, "FUNCTION: %s\n", __func__) |
|
enum atomSubSystem { |
atomUsageCrtc, |
atomUsagePLL, |
atomUsageOutput, |
atomUsageAny |
}; |
|
extern Bool RHDUseAtom(RHDPtr rhdPtr, enum RHD_CHIPSETS *BlackList, enum atomSubSystem subsys); |
|
//git://anongit.freedesktop.org/git/xorg/driver/xf86-video-nv |
//git://anongit.freedesktop.org/git/nouveau/xf86-video-nouveau |