1/*
2 * Copyright 2006-2008, Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Axel Dörfler, axeld@pinc-software.de
7 */
8#ifndef INTEL_EXTREME_ACCELERANT_H
9#define INTEL_EXTREME_ACCELERANT_H
10
11
12#include "intel_extreme.h"
13
14#include <edid.h>
15#include <video_overlay.h>
16
17
18struct overlay {
19	overlay_buffer	buffer;
20	addr_t			buffer_base;
21	uint32			buffer_offset;
22	addr_t			state_base;
23	uint32			state_offset;
24};
25
26struct overlay_frame {
27	int16			h_start;
28	int16			v_start;
29	uint16			width;
30	uint16			height;
31};
32
33struct accelerant_info {
34	uint8*			registers;
35	area_id			regs_area;
36
37	intel_shared_info* shared_info;
38	area_id			shared_info_area;
39
40	display_mode*	mode_list;		// cloned list of standard display modes
41	area_id			mode_list_area;
42
43	struct overlay_registers* overlay_registers;
44	overlay*		current_overlay;
45	overlay_view	last_overlay_view;
46	overlay_frame	last_overlay_frame;
47	uint32			last_horizontal_overlay_scale;
48	uint32			last_vertical_overlay_scale;
49	uint32			overlay_position_buffer_offset;
50
51	edid1_info		edid_info;
52	bool			has_edid;
53
54	// limited 3D support for overlay on i965
55	addr_t			context_base;
56	uint32			context_offset;
57	bool			context_set;
58
59	int				device;
60	uint8			head_mode;
61	bool			is_clone;
62
63	// LVDS panel mode passed from the bios/startup.
64	display_mode	lvds_panel_mode;
65};
66
67#define HEAD_MODE_A_ANALOG		0x01
68#define HEAD_MODE_B_DIGITAL		0x02
69#define HEAD_MODE_CLONE			0x03
70#define HEAD_MODE_LVDS_PANEL	0x08
71
72extern accelerant_info* gInfo;
73
74// register access
75
76inline uint32
77read32(uint32 encodedRegister)
78{
79	return *(volatile uint32*)(gInfo->registers
80		+ gInfo->shared_info->register_blocks[REGISTER_BLOCK(encodedRegister)]
81		+ REGISTER_REGISTER(encodedRegister));
82}
83
84inline void
85write32(uint32 encodedRegister, uint32 value)
86{
87	*(volatile uint32*)(gInfo->registers
88		+ gInfo->shared_info->register_blocks[REGISTER_BLOCK(encodedRegister)]
89		+ REGISTER_REGISTER(encodedRegister)) = value;
90}
91
92
93// dpms.cpp
94extern void enable_display_plane(bool enable);
95extern void set_display_power_mode(uint32 mode);
96
97// engine.cpp
98extern void uninit_ring_buffer(ring_buffer &ringBuffer);
99extern void setup_ring_buffer(ring_buffer &ringBuffer, const char* name);
100
101// modes.cpp
102extern void wait_for_vblank(void);
103extern void set_frame_buffer_base(void);
104extern void save_lvds_mode(void);
105extern status_t create_mode_list(void);
106
107// memory.cpp
108extern void intel_free_memory(uint32 base);
109extern status_t intel_allocate_memory(size_t size, uint32 flags, uint32 &base);
110
111#endif	/* INTEL_EXTREME_ACCELERANT_H */
112