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
19extern "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
28struct 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
78extern 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)
88extern "C" {
89#endif
90
91// General
92status_t InitAccelerant(int fd);
93ssize_t  AccelerantCloneInfoSize(void);
94void	 GetAccelerantCloneInfo(void* data);
95status_t CloneAccelerant(void* data);
96void	 UninitAccelerant(void);
97status_t GetAccelerantDeviceInfo(accelerant_device_info* adi);
98sem_id	 AccelerantRetraceSemaphore(void);
99
100// Mode Configuration
101uint32	 AccelerantModeCount(void);
102status_t GetModeList(display_mode* dm);
103status_t ProposeDisplayMode(display_mode* target, const display_mode* low,
104					const display_mode* high);
105status_t SetDisplayMode(display_mode* mode_to_set);
106status_t GetDisplayMode(display_mode* current_mode);
107status_t GetFrameBufferConfig(frame_buffer_config* a_frame_buffer);
108status_t GetPixelClockLimits(display_mode* dm, uint32* low, uint32* high);
109status_t MoveDisplay(uint16 h_display_start, uint16 v_display_start);
110status_t GetTimingConstraints(display_timing_constraints* dtc);
111void	 Mach64_SetIndexedColors(uint count, uint8 first, uint8* color_data,
112					uint32 flags);
113void	 Rage128_SetIndexedColors(uint count, uint8 first, uint8* color_data,
114					uint32 flags);
115status_t GetPreferredDisplayMode(display_mode* preferredMode);
116status_t GetEdidInfo(void* info, size_t size, uint32* _version);
117
118// DPMS
119uint32   Mach64_DPMSCapabilities(void);
120uint32   Mach64_GetDPMSMode(void);
121status_t Mach64_SetDPMSMode(uint32 dpms_flags);
122
123uint32   Rage128_DPMSCapabilities(void);
124uint32   Rage128_GetDPMSMode(void);
125status_t Rage128_SetDPMSMode(uint32 dpms_flags);
126
127// Cursor
128status_t SetCursorShape(uint16 width, uint16 height, uint16 hot_x, uint16 hot_y,
129					uint8* andMask, uint8* xorMask);
130void	 MoveCursor(uint16 x, uint16 y);
131
132// Engine Management
133uint32   AccelerantEngineCount(void);
134status_t AcquireEngine(uint32 capabilities, uint32 max_wait, sync_token* st,
135					engine_token** et);
136status_t ReleaseEngine(engine_token* et, sync_token* st);
137void	 WaitEngineIdle(void);
138status_t GetSyncToken(engine_token* et, sync_token* st);
139status_t SyncToToken(sync_token* st);
140
141// 2D acceleration
142void	 Mach64_FillRectangle(engine_token* et, uint32 color,
143					fill_rect_params* list, uint32 count);
144void	 Mach64_FillSpan(engine_token* et, uint32 color, uint16* list,
145					uint32 count);
146void	 Mach64_InvertRectangle(engine_token* et, fill_rect_params* list,
147					uint32 count);
148void	 Mach64_ScreenToScreenBlit(engine_token* et, blit_params* list,
149					uint32 count);
150
151void	 Rage128_FillRectangle(engine_token* et, uint32 color,
152					fill_rect_params* list, uint32 count);
153void	 Rage128_FillSpan(engine_token* et, uint32 color, uint16* list,
154					uint32 count);
155void	 Rage128_InvertRectangle(engine_token* et, fill_rect_params* list,
156					uint32 count);
157void	 Rage128_ScreenToScreenBlit(engine_token* et, blit_params* list,
158					uint32 count);
159
160// Video_overlay
161uint32		OverlayCount(const display_mode* dm);
162const uint32* OverlaySupportedSpaces(const display_mode* dm);
163uint32		OverlaySupportedFeatures(uint32 a_color_space);
164const overlay_buffer* AllocateOverlayBuffer(color_space cs, uint16 width,
165					uint16 height);
166status_t	ReleaseOverlayBuffer(const overlay_buffer* ob);
167status_t	GetOverlayConstraints(const display_mode* dm,
168					const overlay_buffer* ob, overlay_constraints* oc);
169overlay_token AllocateOverlay(void);
170status_t	ReleaseOverlay(overlay_token ot);
171status_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
184status_t CreateModeList(bool (*checkMode)(const display_mode* mode));
185uint16	 GetVesaModeNumber(const display_mode& mode, uint8 bitsPerPixel);
186bool	 IsModeUsable(const display_mode* mode);
187
188// Mach64 functions.
189
190bool	 Mach64_DisplayOverlay(const overlay_window* window,
191				const overlay_buffer* buffer);
192void	 Mach64_StopOverlay(void);
193
194void	 Mach64_EngineReset(void);
195void	 Mach64_EngineInit(const DisplayModeEx& mode);
196
197bool	 Mach64_LoadCursorImage(int width, int height, uint8* and_mask,
198				uint8* xor_mask);
199void	 Mach64_SetCursorPosition(int x, int y);
200void	 Mach64_ShowCursor(bool bShow);
201
202void	 Mach64_AdjustFrame(const DisplayModeEx& mode);
203status_t Mach64_SetDisplayMode(const DisplayModeEx& mode);
204void	 Mach64_SetFunctionPointers(void);
205
206int		 Mach64_Divide(int numerator, int denom, int shift,
207				const int roundingKind);
208void	 Mach64_ReduceRatio(int* numerator, int* denominator);
209
210
211// Rage128 functions.
212
213bool	 Rage128_DisplayOverlay(const overlay_window* window,
214				const overlay_buffer* buffer);
215void	 Rage128_StopOverlay(void);
216
217void	 Rage128_EngineFlush(void);
218void	 Rage128_EngineReset(void);
219void	 Rage128_EngineInit(const DisplayModeEx& mode);
220
221bool	 Rage128_GetEdidInfo(void);
222
223bool	 Rage128_LoadCursorImage(int width, int height, uint8* and_mask,
224				uint8* xor_mask);
225void	 Rage128_SetCursorPosition(int x, int y);
226void	 Rage128_ShowCursor(bool bShow);
227
228void	 Rage128_AdjustFrame(const DisplayModeEx& mode);
229status_t Rage128_SetDisplayMode(const DisplayModeEx& mode);
230void	 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