xref: /haiku/src/add-ons/accelerants/ati/accelerant.h (revision 68ea01249e1e2088933cb12f9c28d4e5c5d1c9ef)
1 /*
2 	Copyright 2007-2011 Haiku, Inc.  All rights reserved.
3 	Distributed under the terms of the MIT license.
4 
5 	Authors:
6 	Gerald Zajac
7 */
8 
9 #ifndef _ACCELERANT_H
10 #define _ACCELERANT_H
11 
12 #include "DriverInterface.h"
13 
14 
15 
16 #undef TRACE
17 
18 #ifdef ENABLE_DEBUG_TRACE
19 extern "C" void  _sPrintf(const char* format, ...);
20 #	define TRACE(x...) _sPrintf("ati: " x)
21 #else
22 #	define TRACE(x...) ;
23 #endif
24 
25 
26 // Global data used by various source files of the accelerant.
27 
28 struct AccelerantInfo {
29 	int			deviceFileDesc;		// file descriptor of kernel driver
30 
31 	SharedInfo*	sharedInfo;			// address of info shared between accelerants & driver
32 	area_id		sharedInfoArea;		// shared info area ID
33 
34 	uint8*		regs;				// base address of MMIO register area
35 	area_id		regsArea;			// MMIO register area ID
36 
37 	display_mode* modeList;			// list of standard display modes
38 	area_id		modeListArea;		// mode list area ID
39 
40 	bool		bAccelerantIsClone;	// true if this is a cloned accelerant
41 
42 	// Pointers to various global accelerant functions.
43 	//-------------------------------------------------
44 
45 	// Pointers to wait handlers.
46 	void	(*WaitForFifo)(uint32);
47 	void	(*WaitForIdle)();
48 
49 	// Pointers to DPMS functions.
50 	uint32	(*DPMSCapabilities)(void);
51 	uint32	(*GetDPMSMode)(void);
52 	status_t (*SetDPMSMode)(uint32 dpms_flags);
53 
54 	// Pointers to cursor functions.
55 	bool	(*LoadCursorImage)(int width, int height, uint8* and_mask,
56 				uint8* xor_mask);
57 	void	(*SetCursorPosition)(int x, int y);
58 	void	(*ShowCursor)(bool bShow);
59 
60 	// Pointers to 2D acceleration functions.
61 	void	(*FillRectangle)(engine_token*, uint32 color, fill_rect_params*,
62 				uint32 count);
63 	void	(*FillSpan)(engine_token*, uint32 color, uint16* list,
64 				uint32 count);
65 	void	(*InvertRectangle)(engine_token*, fill_rect_params*, uint32 count);
66 	void	(*ScreenToScreenBlit)(engine_token*, blit_params*, uint32 count);
67 
68 	// Pointers to other functions.
69 	void	 (*AdjustFrame)(const DisplayModeEx& mode);
70 	status_t (*ChipInit)(void);
71 	bool	 (*GetColorSpaceParams)(int colorSpace, uint8& bpp,
72 				uint32& maxPixelClk);
73 	status_t (*SetDisplayMode)(const DisplayModeEx& mode);
74 	void	 (*SetIndexedColors)(uint count, uint8 first, uint8* color_data,
75 				uint32 flags);
76 };
77 
78 extern AccelerantInfo gInfo;
79 
80 
81 // Prototypes of the interface functions called by the app_server.  Note that
82 // the functions that are unique to a particular chip family, will be prefixed
83 // with the name of the family, and the functions that are applicable to all
84 // chips will have no prefix.
85 //================================================================
86 
87 #if defined(__cplusplus)
88 extern "C" {
89 #endif
90 
91 // General
92 status_t InitAccelerant(int fd);
93 ssize_t  AccelerantCloneInfoSize(void);
94 void	 GetAccelerantCloneInfo(void* data);
95 status_t CloneAccelerant(void* data);
96 void	 UninitAccelerant(void);
97 status_t GetAccelerantDeviceInfo(accelerant_device_info* adi);
98 sem_id	 AccelerantRetraceSemaphore(void);
99 
100 // Mode Configuration
101 uint32	 AccelerantModeCount(void);
102 status_t GetModeList(display_mode* dm);
103 status_t ProposeDisplayMode(display_mode* target, const display_mode* low,
104 					const display_mode* high);
105 status_t SetDisplayMode(display_mode* mode_to_set);
106 status_t GetDisplayMode(display_mode* current_mode);
107 status_t GetFrameBufferConfig(frame_buffer_config* a_frame_buffer);
108 status_t GetPixelClockLimits(display_mode* dm, uint32* low, uint32* high);
109 status_t MoveDisplay(uint16 h_display_start, uint16 v_display_start);
110 status_t GetTimingConstraints(display_timing_constraints* dtc);
111 void	 Mach64_SetIndexedColors(uint count, uint8 first, uint8* color_data,
112 					uint32 flags);
113 void	 Rage128_SetIndexedColors(uint count, uint8 first, uint8* color_data,
114 					uint32 flags);
115 status_t GetPreferredDisplayMode(display_mode* preferredMode);
116 status_t GetEdidInfo(void* info, size_t size, uint32* _version);
117 
118 // DPMS
119 uint32   Mach64_DPMSCapabilities(void);
120 uint32   Mach64_GetDPMSMode(void);
121 status_t Mach64_SetDPMSMode(uint32 dpms_flags);
122 
123 uint32   Rage128_DPMSCapabilities(void);
124 uint32   Rage128_GetDPMSMode(void);
125 status_t Rage128_SetDPMSMode(uint32 dpms_flags);
126 
127 // Cursor
128 status_t SetCursorShape(uint16 width, uint16 height, uint16 hot_x, uint16 hot_y,
129 					uint8* andMask, uint8* xorMask);
130 void	 MoveCursor(uint16 x, uint16 y);
131 
132 // Engine Management
133 uint32   AccelerantEngineCount(void);
134 status_t AcquireEngine(uint32 capabilities, uint32 max_wait, sync_token* st,
135 					engine_token** et);
136 status_t ReleaseEngine(engine_token* et, sync_token* st);
137 void	 WaitEngineIdle(void);
138 status_t GetSyncToken(engine_token* et, sync_token* st);
139 status_t SyncToToken(sync_token* st);
140 
141 // 2D acceleration
142 void	 Mach64_FillRectangle(engine_token* et, uint32 color,
143 					fill_rect_params* list, uint32 count);
144 void	 Mach64_FillSpan(engine_token* et, uint32 color, uint16* list,
145 					uint32 count);
146 void	 Mach64_InvertRectangle(engine_token* et, fill_rect_params* list,
147 					uint32 count);
148 void	 Mach64_ScreenToScreenBlit(engine_token* et, blit_params* list,
149 					uint32 count);
150 
151 void	 Rage128_FillRectangle(engine_token* et, uint32 color,
152 					fill_rect_params* list, uint32 count);
153 void	 Rage128_FillSpan(engine_token* et, uint32 color, uint16* list,
154 					uint32 count);
155 void	 Rage128_InvertRectangle(engine_token* et, fill_rect_params* list,
156 					uint32 count);
157 void	 Rage128_ScreenToScreenBlit(engine_token* et, blit_params* list,
158 					uint32 count);
159 
160 // Video_overlay
161 uint32		OverlayCount(const display_mode* dm);
162 const uint32* OverlaySupportedSpaces(const display_mode* dm);
163 uint32		OverlaySupportedFeatures(uint32 a_color_space);
164 const overlay_buffer* AllocateOverlayBuffer(color_space cs, uint16 width,
165 					uint16 height);
166 status_t	ReleaseOverlayBuffer(const overlay_buffer* ob);
167 status_t	GetOverlayConstraints(const display_mode* dm,
168 					const overlay_buffer* ob, overlay_constraints* oc);
169 overlay_token AllocateOverlay(void);
170 status_t	ReleaseOverlay(overlay_token ot);
171 status_t	ConfigureOverlay(overlay_token ot, const overlay_buffer* ob,
172 					const overlay_window* ow, const overlay_view* ov);
173 
174 #if defined(__cplusplus)
175 }
176 #endif
177 
178 
179 
180 // Prototypes for other functions that are called from source files other than
181 // where they are defined.
182 //============================================================================
183 
184 status_t CreateModeList(bool (*checkMode)(const display_mode* mode));
185 uint16	 GetVesaModeNumber(const display_mode& mode, uint8 bitsPerPixel);
186 bool	 IsModeUsable(const display_mode* mode);
187 
188 // Mach64 functions.
189 
190 bool	 Mach64_DisplayOverlay(const overlay_window* window,
191 				const overlay_buffer* buffer);
192 void	 Mach64_StopOverlay(void);
193 
194 void	 Mach64_EngineReset(void);
195 void	 Mach64_EngineInit(const DisplayModeEx& mode);
196 
197 bool	 Mach64_LoadCursorImage(int width, int height, uint8* and_mask,
198 				uint8* xor_mask);
199 void	 Mach64_SetCursorPosition(int x, int y);
200 void	 Mach64_ShowCursor(bool bShow);
201 
202 void	 Mach64_AdjustFrame(const DisplayModeEx& mode);
203 status_t Mach64_SetDisplayMode(const DisplayModeEx& mode);
204 void	 Mach64_SetFunctionPointers(void);
205 
206 int		 Mach64_Divide(int numerator, int denom, int shift,
207 				const int roundingKind);
208 void	 Mach64_ReduceRatio(int* numerator, int* denominator);
209 
210 
211 // Rage128 functions.
212 
213 bool	 Rage128_DisplayOverlay(const overlay_window* window,
214 				const overlay_buffer* buffer);
215 void	 Rage128_StopOverlay(void);
216 
217 void	 Rage128_EngineFlush(void);
218 void	 Rage128_EngineReset(void);
219 void	 Rage128_EngineInit(const DisplayModeEx& mode);
220 
221 bool	 Rage128_GetEdidInfo(void);
222 
223 bool	 Rage128_LoadCursorImage(int width, int height, uint8* and_mask,
224 				uint8* xor_mask);
225 void	 Rage128_SetCursorPosition(int x, int y);
226 void	 Rage128_ShowCursor(bool bShow);
227 
228 void	 Rage128_AdjustFrame(const DisplayModeEx& mode);
229 status_t Rage128_SetDisplayMode(const DisplayModeEx& mode);
230 void	 Rage128_SetFunctionPointers(void);
231 
232 
233 // Macros for memory mapped I/O for both Mach64 and Rage128 chips.
234 //================================================================
235 
236 #define INREG8(addr)		*((vuint8*)(gInfo.regs + addr))
237 #define INREG16(addr)		*((vuint16*)(gInfo.regs + addr))
238 #define INREG(addr)			*((vuint32*)(gInfo.regs + addr))
239 
240 #define OUTREG8(addr, val)	*((vuint8*)(gInfo.regs + addr)) = val
241 #define OUTREG16(addr, val)	*((vuint16*)(gInfo.regs + addr)) = val
242 #define OUTREG(addr, val)	*((vuint32*)(gInfo.regs + addr)) = val
243 
244 // Write a value to an 32-bit reg using a mask.  The mask selects the
245 // bits to be modified.
246 #define OUTREGM(addr, value, mask)	\
247 	(OUTREG(addr, (INREG(addr) & ~(mask)) | ((value) & (mask))))
248 
249 
250 #endif	// _ACCELERANT_H
251