2 Copyright 2007-2008 Haiku, Inc. All rights reserved.
3 Distributed under the terms of the MIT license.
12 #include "DriverInterface.h"
13 #include "register_io.h"
19 #ifdef ENABLE_DEBUG_TRACE
20 extern "C" void _sPrintf(const char* format
, ...);
21 # define TRACE(x...) _sPrintf("S3: " x)
23 # define TRACE(x...) ;
27 // Global data used by various source files of the accelerant.
29 struct AccelerantInfo
{
30 int deviceFileDesc
; // file descriptor of kernel driver
32 SharedInfo
* sharedInfo
; // address of info shared between accelerants & driver
33 area_id sharedInfoArea
; // shared info area ID
35 uint8
* regs
; // base address of MMIO register area
36 area_id regsArea
; // MMIO register area ID
38 display_mode
* modeList
; // list of standard display modes
39 area_id modeListArea
; // mode list area ID
41 bool bAccelerantIsClone
; // true if this is a cloned accelerant
43 // Pointers to wait handlers.
44 void (*WaitQueue
)(uint32
);
45 void (*WaitIdleEmpty
)();
47 // Pointers to DPMS functions.
48 uint32 (*DPMSCapabilities
)(void);
49 uint32 (*GetDPMSMode
)(void);
50 status_t (*SetDPMSMode
)(uint32 dpms_flags
);
52 // Pointers to cursor functions.
53 bool (*LoadCursorImage
)(int width
, int height
, uint8
* and_mask
, uint8
* xor_mask
);
54 void (*SetCursorPosition
)(int x
, int y
);
55 void (*ShowCursor
)(bool bShow
);
57 // Pointers to 2D acceleration functions.
58 void (*FillRectangle
)(engine_token
*, uint32 color
, fill_rect_params
*, uint32 count
);
59 void (*FillSpan
)(engine_token
*, uint32 color
, uint16
* list
, uint32 count
);
60 void (*InvertRectangle
)(engine_token
*, fill_rect_params
*, uint32 count
);
61 void (*ScreenToScreenBlit
)(engine_token
*, blit_params
*, uint32 count
);
63 // Pointers to other functions.
64 void (*AdjustFrame
)(const DisplayModeEx
& mode
);
65 status_t (*ChipInit
)(void);
66 bool (*GetColorSpaceParams
)(int colorSpace
, uint32
& bpp
, uint32
& maxPixelClk
);
67 bool (*SetDisplayMode
)(const DisplayModeEx
& mode
);
68 void (*SetIndexedColors
)(uint count
, uint8 first
, uint8
* color_data
, uint32 flags
);
71 extern AccelerantInfo gInfo
;
74 // Prototypes of the interface functions called by the app_server. Note that
75 // the functions that are unique to a particular chip family, will be prefixed
76 // with the name of the family, and the functions that are applicable to all
77 // chips will have no prefix.
78 //================================================================
80 #if defined(__cplusplus)
85 status_t
InitAccelerant(int fd
);
86 ssize_t
AccelerantCloneInfoSize(void);
87 void GetAccelerantCloneInfo(void* data
);
88 status_t
CloneAccelerant(void* data
);
89 void UninitAccelerant(void);
90 status_t
GetAccelerantDeviceInfo(accelerant_device_info
* adi
);
91 sem_id
AccelerantRetraceSemaphore(void);
94 uint32
AccelerantModeCount(void);
95 status_t
GetModeList(display_mode
* dm
);
96 status_t
ProposeDisplayMode(display_mode
* target
, const display_mode
* low
, const display_mode
* high
);
97 status_t
SetDisplayMode(display_mode
* mode_to_set
);
98 status_t
GetDisplayMode(display_mode
* current_mode
);
99 status_t
GetFrameBufferConfig(frame_buffer_config
* a_frame_buffer
);
100 status_t
GetPixelClockLimits(display_mode
* dm
, uint32
* low
, uint32
* high
);
101 status_t
MoveDisplay(uint16 h_display_start
, uint16 v_display_start
);
102 status_t
GetTimingConstraints(display_timing_constraints
* dtc
);
103 void Savage_SetIndexedColors(uint count
, uint8 first
, uint8
* color_data
, uint32 flags
);
104 void Trio64_SetIndexedColors(uint count
, uint8 first
, uint8
* color_data
, uint32 flags
);
105 void Virge_SetIndexedColors(uint count
, uint8 first
, uint8
* color_data
, uint32 flags
);
106 status_t
GetPreferredDisplayMode(display_mode
* preferredMode
);
107 status_t
GetEdidInfo(void* info
, size_t size
, uint32
* _version
);
110 uint32
Savage_DPMSCapabilities(void);
111 uint32
Savage_GetDPMSMode(void);
112 status_t
Savage_SetDPMSMode(uint32 dpms_flags
);
114 uint32
Trio64_DPMSCapabilities(void);
115 uint32
Trio64_GetDPMSMode(void);
116 status_t
Trio64_SetDPMSMode(uint32 dpms_flags
);
118 uint32
Virge_DPMSCapabilities(void);
119 uint32
Virge_GetDPMSMode(void);
120 status_t
Virge_SetDPMSMode(uint32 dpms_flags
);
123 status_t
SetCursorShape(uint16 width
, uint16 height
, uint16 hot_x
, uint16 hot_y
,
124 uint8
* andMask
, uint8
* xorMask
);
125 void MoveCursor(uint16 x
, uint16 y
);
126 void Savage_ShowCursor(bool bShow
);
127 void Trio64_ShowCursor(bool bShow
);
128 void Virge_ShowCursor(bool bShow
);
131 uint32
AccelerantEngineCount(void);
132 status_t
AcquireEngine(uint32 capabilities
, uint32 max_wait
, sync_token
* st
, engine_token
** et
);
133 status_t
ReleaseEngine(engine_token
* et
, sync_token
* st
);
134 void WaitEngineIdle(void);
135 status_t
GetSyncToken(engine_token
* et
, sync_token
* st
);
136 status_t
SyncToToken(sync_token
* st
);
139 void Savage_FillRectangle(engine_token
* et
, uint32 color
, fill_rect_params
* list
, uint32 count
);
140 void Savage_FillSpan(engine_token
* et
, uint32 color
, uint16
* list
, uint32 count
);
141 void Savage_InvertRectangle(engine_token
* et
, fill_rect_params
* list
, uint32 count
);
142 void Savage_ScreenToScreenBlit(engine_token
* et
, blit_params
* list
, uint32 count
);
144 void Trio64_FillRectangle(engine_token
* et
, uint32 color
, fill_rect_params
* list
, uint32 count
);
145 void Trio64_FillSpan(engine_token
* et
, uint32 color
, uint16
* list
, uint32 count
);
146 void Trio64_InvertRectangle(engine_token
* et
, fill_rect_params
* list
, uint32 count
);
147 void Trio64_ScreenToScreenBlit(engine_token
* et
, blit_params
* list
, uint32 count
);
149 void Virge_FillRectangle(engine_token
* et
, uint32 color
, fill_rect_params
* list
, uint32 count
);
150 void Virge_FillSpan(engine_token
* et
, uint32 color
, uint16
* list
, uint32 count
);
151 void Virge_InvertRectangle(engine_token
* et
, fill_rect_params
* list
, uint32 count
);
152 void Virge_ScreenToScreenBlit(engine_token
* et
, blit_params
* list
, uint32 count
);
154 #if defined(__cplusplus)
160 // Prototypes for other functions that are called from source files other than
161 // where they are defined.
162 //============================================================================
164 status_t
CreateModeList(bool (*checkMode
)(const display_mode
* mode
),
165 bool (*getEdid
)(edid1_info
& edidInfo
));
166 void InitCrtcTimingValues(const DisplayModeEx
& mode
, int horzScaleFactor
, uint8 crtc
[],
167 uint8
& cr3b
, uint8
& cr3c
, uint8
& cr5d
, uint8
& cr5e
);
168 bool IsModeUsable(const display_mode
* mode
);
172 bool Savage_GetEdidInfo(edid1_info
& edidInfo
);
174 bool Savage_LoadCursorImage(int width
, int height
, uint8
* and_mask
, uint8
* xor_mask
);
175 void Savage_SetCursorPosition(int x
, int y
);
177 void Savage_AdjustFrame(const DisplayModeEx
& mode
);
178 bool Savage_SetDisplayMode(const DisplayModeEx
& mode
);
179 void Savage_SetFunctionPointers(void);
183 bool Trio64_LoadCursorImage(int width
, int height
, uint8
* and_mask
, uint8
* xor_mask
);
184 void Trio64_SetCursorPosition(int x
, int y
);
186 void Trio64_AdjustFrame(const DisplayModeEx
& mode
);
187 bool Trio64_SetDisplayMode(const DisplayModeEx
& mode
);
188 void Trio64_SetFunctionPointers(void);
192 bool Virge_GetEdidInfo(edid1_info
& edidInfo
);
194 bool Virge_LoadCursorImage(int width
, int height
, uint8
* and_mask
, uint8
* xor_mask
);
195 void Virge_SetCursorPosition(int x
, int y
);
197 void Virge_AdjustFrame(const DisplayModeEx
& mode
);
198 bool Virge_SetDisplayMode(const DisplayModeEx
& mode
);
199 void Virge_SetFunctionPointers(void);