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