1/*
2	Copyright 2007-2008 Haiku, Inc.  All rights reserved.
3	Distributed under the terms of the MIT license.
4
5	Authors:
6	Gerald Zajac 2007-2008
7*/
8
9#ifndef _ACCEL_H
10#define _ACCEL_H
11
12#include "DriverInterface.h"
13#include "register_io.h"
14
15
16
17#undef TRACE
18
19#ifdef ENABLE_DEBUG_TRACE
20extern "C" void  _sPrintf(const char* format, ...);
21#	define TRACE(x...) _sPrintf("S3: " x)
22#else
23#	define TRACE(x...) ;
24#endif
25
26
27// Global data used by various source files of the accelerant.
28
29struct AccelerantInfo {
30	int			 deviceFileDesc;	// file descriptor of kernel driver
31
32	SharedInfo*	 sharedInfo;		// address of info shared between accelerants & driver
33	area_id		 sharedInfoArea;	// shared info area ID
34
35	uint8*		 regs;				// base address of MMIO register area
36	area_id		 regsArea;			// MMIO register area ID
37
38	display_mode* modeList;			// list of standard display modes
39	area_id		 modeListArea;		// mode list area ID
40
41	bool	bAccelerantIsClone;		// true if this is a cloned accelerant
42
43	// Pointers to wait handlers.
44	void	(*WaitQueue)(uint32);
45	void	(*WaitIdleEmpty)();
46
47	// Pointers to DPMS functions.
48	uint32	(*DPMSCapabilities)(void);
49	uint32	(*GetDPMSMode)(void);
50	status_t (*SetDPMSMode)(uint32 dpms_flags);
51
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);
56
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);
62
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);
69};
70
71extern AccelerantInfo gInfo;
72
73
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//================================================================
79
80#if defined(__cplusplus)
81extern "C" {
82#endif
83
84// General
85status_t InitAccelerant(int fd);
86ssize_t  AccelerantCloneInfoSize(void);
87void	 GetAccelerantCloneInfo(void* data);
88status_t CloneAccelerant(void* data);
89void	 UninitAccelerant(void);
90status_t GetAccelerantDeviceInfo(accelerant_device_info* adi);
91sem_id	 AccelerantRetraceSemaphore(void);
92
93// Mode Configuration
94uint32	 AccelerantModeCount(void);
95status_t GetModeList(display_mode* dm);
96status_t ProposeDisplayMode(display_mode* target, const display_mode* low, const display_mode* high);
97status_t SetDisplayMode(display_mode* mode_to_set);
98status_t GetDisplayMode(display_mode* current_mode);
99status_t GetFrameBufferConfig(frame_buffer_config* a_frame_buffer);
100status_t GetPixelClockLimits(display_mode* dm, uint32* low, uint32* high);
101status_t MoveDisplay(uint16 h_display_start, uint16 v_display_start);
102status_t GetTimingConstraints(display_timing_constraints* dtc);
103void	 Savage_SetIndexedColors(uint count, uint8 first, uint8* color_data, uint32 flags);
104void	 Trio64_SetIndexedColors(uint count, uint8 first, uint8* color_data, uint32 flags);
105void	 Virge_SetIndexedColors(uint count, uint8 first, uint8* color_data, uint32 flags);
106status_t GetPreferredDisplayMode(display_mode* preferredMode);
107status_t GetEdidInfo(void* info, size_t size, uint32* _version);
108
109// DPMS
110uint32   Savage_DPMSCapabilities(void);
111uint32   Savage_GetDPMSMode(void);
112status_t Savage_SetDPMSMode(uint32 dpms_flags);
113
114uint32   Trio64_DPMSCapabilities(void);
115uint32   Trio64_GetDPMSMode(void);
116status_t Trio64_SetDPMSMode(uint32 dpms_flags);
117
118uint32   Virge_DPMSCapabilities(void);
119uint32   Virge_GetDPMSMode(void);
120status_t Virge_SetDPMSMode(uint32 dpms_flags);
121
122// Cursor
123status_t SetCursorShape(uint16 width, uint16 height, uint16 hot_x, uint16 hot_y,
124						uint8* andMask, uint8* xorMask);
125void	 MoveCursor(uint16 x, uint16 y);
126void	 Savage_ShowCursor(bool bShow);
127void	 Trio64_ShowCursor(bool bShow);
128void	 Virge_ShowCursor(bool bShow);
129
130// Engine Management
131uint32   AccelerantEngineCount(void);
132status_t AcquireEngine(uint32 capabilities, uint32 max_wait, sync_token* st, engine_token** et);
133status_t ReleaseEngine(engine_token* et, sync_token* st);
134void	 WaitEngineIdle(void);
135status_t GetSyncToken(engine_token* et, sync_token* st);
136status_t SyncToToken(sync_token* st);
137
138// 2D acceleration
139void	 Savage_FillRectangle(engine_token* et, uint32 color, fill_rect_params* list, uint32 count);
140void	 Savage_FillSpan(engine_token* et, uint32 color, uint16* list, uint32 count);
141void	 Savage_InvertRectangle(engine_token* et, fill_rect_params* list, uint32 count);
142void	 Savage_ScreenToScreenBlit(engine_token* et, blit_params* list, uint32 count);
143
144void	 Trio64_FillRectangle(engine_token* et, uint32 color, fill_rect_params* list, uint32 count);
145void	 Trio64_FillSpan(engine_token* et, uint32 color, uint16* list, uint32 count);
146void	 Trio64_InvertRectangle(engine_token* et, fill_rect_params* list, uint32 count);
147void	 Trio64_ScreenToScreenBlit(engine_token* et, blit_params* list, uint32 count);
148
149void	 Virge_FillRectangle(engine_token* et, uint32 color, fill_rect_params* list, uint32 count);
150void	 Virge_FillSpan(engine_token* et, uint32 color, uint16* list, uint32 count);
151void	 Virge_InvertRectangle(engine_token* et, fill_rect_params* list, uint32 count);
152void	 Virge_ScreenToScreenBlit(engine_token* et, blit_params* list, uint32 count);
153
154#if defined(__cplusplus)
155}
156#endif
157
158
159
160// Prototypes for other functions that are called from source files other than
161// where they are defined.
162//============================================================================
163
164status_t CreateModeList(bool (*checkMode)(const display_mode* mode),
165						bool (*getEdid)(edid1_info& edidInfo));
166void	 InitCrtcTimingValues(const DisplayModeEx& mode, int horzScaleFactor, uint8 crtc[],
167							  uint8& cr3b, uint8& cr3c, uint8& cr5d, uint8& cr5e);
168bool	 IsModeUsable(const display_mode* mode);
169
170// Savage functions.
171
172bool	 Savage_GetEdidInfo(edid1_info& edidInfo);
173
174bool	 Savage_LoadCursorImage(int width, int height, uint8* and_mask, uint8* xor_mask);
175void	 Savage_SetCursorPosition(int x, int y);
176
177void	 Savage_AdjustFrame(const DisplayModeEx& mode);
178bool	 Savage_SetDisplayMode(const DisplayModeEx& mode);
179void	 Savage_SetFunctionPointers(void);
180
181// Trio64 functions.
182
183bool	 Trio64_LoadCursorImage(int width, int height, uint8* and_mask, uint8* xor_mask);
184void	 Trio64_SetCursorPosition(int x, int y);
185
186void	 Trio64_AdjustFrame(const DisplayModeEx& mode);
187bool	 Trio64_SetDisplayMode(const DisplayModeEx& mode);
188void	 Trio64_SetFunctionPointers(void);
189
190// Virge functions.
191
192bool	 Virge_GetEdidInfo(edid1_info& edidInfo);
193
194bool	 Virge_LoadCursorImage(int width, int height, uint8* and_mask, uint8* xor_mask);
195void	 Virge_SetCursorPosition(int x, int y);
196
197void	 Virge_AdjustFrame(const DisplayModeEx& mode);
198bool	 Virge_SetDisplayMode(const DisplayModeEx& mode);
199void	 Virge_SetFunctionPointers(void);
200
201
202#endif	// _ACCEL_H
203