1a90ebd77SClemens Zeidler/*
22613175eSAlexander von Gluck IV * Copyright 2006-2011, Haiku, Inc. All Rights Reserved.
3a90ebd77SClemens Zeidler * Distributed under the terms of the MIT License.
4a90ebd77SClemens Zeidler *
5a90ebd77SClemens Zeidler * Authors:
6a90ebd77SClemens Zeidler *		Axel D��rfler, axeld@pinc-software.de
775f51fc7SAlexander von Gluck IV *		Alexander von Gluck IV, kallisti5@unixzen.com
8a90ebd77SClemens Zeidler */
9a90ebd77SClemens Zeidler#ifndef RADEON_HD_H
10a90ebd77SClemens Zeidler#define RADEON_HD_H
11a90ebd77SClemens Zeidler
12a90ebd77SClemens Zeidler
13a90ebd77SClemens Zeidler#include "lock.h"
14a90ebd77SClemens Zeidler
156da3f7d4SAlexander von Gluck IV#include "radeon_reg.h"
166da3f7d4SAlexander von Gluck IV
171b69f339SAlexander von Gluck IV//#include "r500_reg.h"  // Not used atm. DCE 0
181b69f339SAlexander von Gluck IV#include "avivo_reg.h"		// DCE 1
191b69f339SAlexander von Gluck IV#include "r600_reg.h"		// DCE 2
201b69f339SAlexander von Gluck IV#include "r700_reg.h"		// DCE 3
211b69f339SAlexander von Gluck IV#include "evergreen_reg.h"	// DCE 4
221b69f339SAlexander von Gluck IV#include "ni_reg.h"			// DCE 5
231b69f339SAlexander von Gluck IV#include "si_reg.h"			// DCE 6
241b69f339SAlexander von Gluck IV#include "sea_reg.h"		// DCE 8
251b69f339SAlexander von Gluck IV#include "vol_reg.h"		// DCE 10
261b69f339SAlexander von Gluck IV#include "car_reg.h"		// DCE 11
272613175eSAlexander von Gluck IV
28a90ebd77SClemens Zeidler#include <Accelerant.h>
29a90ebd77SClemens Zeidler#include <Drivers.h>
302613175eSAlexander von Gluck IV#include <edid.h>
31a90ebd77SClemens Zeidler#include <PCI.h>
32a90ebd77SClemens Zeidler
33a90ebd77SClemens Zeidler
34c9c7be9aSAlexander von Gluck IV#define VENDOR_ID_ATI	0x1002
35c9c7be9aSAlexander von Gluck IV
36d5c8ef5dSAlexander von Gluck IV// Card chipset flags
37d5c8ef5dSAlexander von Gluck IV#define CHIP_STD		(1 << 0) // Standard chipset
384ce958fcSAlexander von Gluck IV#define CHIP_X2			(1 << 1) // Dual cpu
394ce958fcSAlexander von Gluck IV#define CHIP_IGP		(1 << 2) // IGP chipset
404ce958fcSAlexander von Gluck IV#define CHIP_MOBILE		(1 << 3) // Mobile chipset
414ce958fcSAlexander von Gluck IV#define CHIP_DISCREET	(1 << 4) // Discreet chipset
424ce958fcSAlexander von Gluck IV#define CHIP_APU		(1 << 5) // APU chipset
432613175eSAlexander von Gluck IV
44a90ebd77SClemens Zeidler#define DEVICE_NAME				"radeon_hd"
45a90ebd77SClemens Zeidler#define RADEON_ACCELERANT_NAME	"radeon_hd.accelerant"
46a90ebd77SClemens Zeidler
4742eed3baSAlexander von Gluck IV#define MAX_NAME_LENGTH		32
4842eed3baSAlexander von Gluck IV
492613175eSAlexander von Gluck IV// Used to collect EDID from boot loader
502613175eSAlexander von Gluck IV#define EDID_BOOT_INFO "vesa_edid/v1"
512613175eSAlexander von Gluck IV#define MODES_BOOT_INFO "vesa_modes/v1"
522613175eSAlexander von Gluck IV
5358ddd30bSAlexander von Gluck IV#define RHD_POWER_ON       0
5458ddd30bSAlexander von Gluck IV#define RHD_POWER_RESET    1   /* off temporarily */
5558ddd30bSAlexander von Gluck IV#define RHD_POWER_SHUTDOWN 2   /* long term shutdown */
5658ddd30bSAlexander von Gluck IV#define RHD_POWER_UNKNOWN  3   /* initial state */
5758ddd30bSAlexander von Gluck IV
5875f51fc7SAlexander von Gluck IV
5976a3e009SAlexander von Gluck IV// Radeon Chipsets
6042eed3baSAlexander von Gluck IV// !! Must match chipset names below
6176a3e009SAlexander von Gluck IVenum radeon_chipset {
6276a3e009SAlexander von Gluck IV	RADEON_R420 = 0,	//r400, Radeon X700-X850
630188ca92SAlexander von Gluck IV	RADEON_R423,
640188ca92SAlexander von Gluck IV	RADEON_RV410,
650188ca92SAlexander von Gluck IV	RADEON_RS400,
660188ca92SAlexander von Gluck IV	RADEON_RS480,
670188ca92SAlexander von Gluck IV	RADEON_RS600,
680188ca92SAlexander von Gluck IV	RADEON_RS690,
690188ca92SAlexander von Gluck IV	RADEON_RS740,
7076a3e009SAlexander von Gluck IV	RADEON_RV515,
7199118351SAlexander von Gluck IV	RADEON_R520,		//r500, DCE 1.0
7299118351SAlexander von Gluck IV	RADEON_RV530,		// DCE 1.0
7399118351SAlexander von Gluck IV	RADEON_RV560,		// DCE 1.0
7499118351SAlexander von Gluck IV	RADEON_RV570,		// DCE 1.0
7599118351SAlexander von Gluck IV	RADEON_R580,		// DCE 1.0
7699118351SAlexander von Gluck IV	RADEON_R600,		//r600, DCE 2.0
7799118351SAlexander von Gluck IV	RADEON_RV610,		// DCE 2.0
7899118351SAlexander von Gluck IV	RADEON_RV630,		// DCE 2.0
7999118351SAlexander von Gluck IV	RADEON_RV670,		// DCE 2.0
8099118351SAlexander von Gluck IV	RADEON_RV620,		// DCE 3.0
8199118351SAlexander von Gluck IV	RADEON_RV635,		// DCE 3.0
8299118351SAlexander von Gluck IV	RADEON_RS780,		// DCE 3.0
8399118351SAlexander von Gluck IV	RADEON_RS880,		// DCE 3.0
8499118351SAlexander von Gluck IV	RADEON_RV770,		//r700, DCE 3.1
8599118351SAlexander von Gluck IV	RADEON_RV730,		// DCE 3.2
8699118351SAlexander von Gluck IV	RADEON_RV710,		// DCE 3.2
8799118351SAlexander von Gluck IV	RADEON_RV740,		// DCE 3.2
8899118351SAlexander von Gluck IV	RADEON_CEDAR,		//Evergreen, DCE 4.0
8999118351SAlexander von Gluck IV	RADEON_REDWOOD,		// DCE 4.0
9099118351SAlexander von Gluck IV	RADEON_JUNIPER,		// DCE 4.0
9199118351SAlexander von Gluck IV	RADEON_CYPRESS,		// DCE 4.0
9299118351SAlexander von Gluck IV	RADEON_HEMLOCK,		// DCE 4.0?
9399118351SAlexander von Gluck IV	RADEON_PALM,		//Fusion APU (NI), DCE 4.1
9499118351SAlexander von Gluck IV	RADEON_SUMO,		// DCE 4.1
9599118351SAlexander von Gluck IV	RADEON_SUMO2,		// DCE 4.1
9699118351SAlexander von Gluck IV	RADEON_CAICOS,		//Nothern Islands, DCE 5.0
9799118351SAlexander von Gluck IV	RADEON_TURKS,		// DCE 5.0
9899118351SAlexander von Gluck IV	RADEON_BARTS,		// DCE 5.0
9999118351SAlexander von Gluck IV	RADEON_CAYMAN,		// DCE 5.0
10099118351SAlexander von Gluck IV	RADEON_ANTILLES,	// DCE 5.0?
10199118351SAlexander von Gluck IV	RADEON_CAPEVERDE,	//Southern Islands, DCE 6.0
10299118351SAlexander von Gluck IV	RADEON_PITCAIRN,	// DCE 6.0
10399118351SAlexander von Gluck IV	RADEON_TAHITI,		// DCE 6.0
10499118351SAlexander von Gluck IV	RADEON_ARUBA,		// DCE 6.1 Trinity/Richland
10599118351SAlexander von Gluck IV	RADEON_OLAND,		// DCE 6.4
10642eed3baSAlexander von Gluck IV	RADEON_HAINAN,		// NO DCE, only compute
10799118351SAlexander von Gluck IV	RADEON_KAVERI,		//Sea Islands, DCE 8.1
10899118351SAlexander von Gluck IV	RADEON_BONAIRE,		// DCE 8.2
10999118351SAlexander von Gluck IV	RADEON_KABINI,		// DCE 8.3
110e321d716SAlexander von Gluck IV	RADEON_MULLINS,		// DCE 8.3
111bf8fe3ddSAlexander von Gluck IV	RADEON_HAWAII,		// DCE 8.5
112bf8fe3ddSAlexander von Gluck IV	RADEON_TOPAZ,		//Volcanic Islands, NO DCE
113bf8fe3ddSAlexander von Gluck IV	RADEON_TONGA,		// DCE 10.0
1143853f362SAlexander von Gluck IV	RADEON_FIJI,		// DCE 10.1?
11530d631c8SAlexander von Gluck IV	RADEON_CARRIZO,		// DCE 11.0
1163853f362SAlexander von Gluck IV	RADEON_STONEY,		// DCE 11.1?
1173853f362SAlexander von Gluck IV	RADEON_POLARIS11,	//Artic Islands, DCE 12.1?
1183853f362SAlexander von Gluck IV	RADEON_POLARIS10,	// DCE 12.0?
1193853f362SAlexander von Gluck IV	RADEON_POLARIS12,	// DCE 12.2?
1203853f362SAlexander von Gluck IV	RADEON_VEGAM,		// DCE 13.0?
1213853f362SAlexander von Gluck IV	RADEON_VEGA10,		// DCE 13.0?
1223853f362SAlexander von Gluck IV	RADEON_VEGA12,		// DCE 13.0?
1233853f362SAlexander von Gluck IV	RADEON_VEGA20,		// DCE 13.0?
1243853f362SAlexander von Gluck IV	RADEON_RAVEN,		// DCE 13?
12576a3e009SAlexander von Gluck IV};
12676a3e009SAlexander von Gluck IV
12742eed3baSAlexander von Gluck IV// !! Must match chipset families above
12842eed3baSAlexander von Gluck IVstatic const char radeon_chip_name[][MAX_NAME_LENGTH] = {
12942eed3baSAlexander von Gluck IV	"R420",
13042eed3baSAlexander von Gluck IV	"R423",
13142eed3baSAlexander von Gluck IV	"RV410",
13242eed3baSAlexander von Gluck IV	"RS400",
13342eed3baSAlexander von Gluck IV	"RS480",
13442eed3baSAlexander von Gluck IV	"RS600",
13542eed3baSAlexander von Gluck IV	"RS690",
13642eed3baSAlexander von Gluck IV	"RS740",
13742eed3baSAlexander von Gluck IV	"RV515",
13842eed3baSAlexander von Gluck IV	"R520",
13942eed3baSAlexander von Gluck IV	"RV530",
14042eed3baSAlexander von Gluck IV	"RV560",
14142eed3baSAlexander von Gluck IV	"RV570",
14242eed3baSAlexander von Gluck IV	"R580",
14342eed3baSAlexander von Gluck IV	"R600",
14442eed3baSAlexander von Gluck IV	"RV610",
14542eed3baSAlexander von Gluck IV	"RV630",
14642eed3baSAlexander von Gluck IV	"RV670",
14742eed3baSAlexander von Gluck IV	"RV620",
14842eed3baSAlexander von Gluck IV	"RV635",
14942eed3baSAlexander von Gluck IV	"RS780",
15042eed3baSAlexander von Gluck IV	"RS880",
15142eed3baSAlexander von Gluck IV	"RV770",
15242eed3baSAlexander von Gluck IV	"RV730",
15342eed3baSAlexander von Gluck IV	"RV710",
15442eed3baSAlexander von Gluck IV	"RV740",
15542eed3baSAlexander von Gluck IV	"Cedar",
15642eed3baSAlexander von Gluck IV	"Redwood",
15742eed3baSAlexander von Gluck IV	"Juniper",
15842eed3baSAlexander von Gluck IV	"Cypress",
15942eed3baSAlexander von Gluck IV	"Hemlock",
16042eed3baSAlexander von Gluck IV	"Palm",
16142eed3baSAlexander von Gluck IV	"Sumo",
16242eed3baSAlexander von Gluck IV	"Sumo2",
16342eed3baSAlexander von Gluck IV	"Caicos",
16442eed3baSAlexander von Gluck IV	"Turks",
16542eed3baSAlexander von Gluck IV	"Barts",
16642eed3baSAlexander von Gluck IV	"Cayman",
16742eed3baSAlexander von Gluck IV	"Antilles",
16842eed3baSAlexander von Gluck IV	"Cape Verde",
16942eed3baSAlexander von Gluck IV	"Pitcairn",
17042eed3baSAlexander von Gluck IV	"Tahiti",
17142eed3baSAlexander von Gluck IV	"Aruba",
17242eed3baSAlexander von Gluck IV	"Oland",
17342eed3baSAlexander von Gluck IV	"Hainan",
17442eed3baSAlexander von Gluck IV	"Kaveri",
17542eed3baSAlexander von Gluck IV	"Bonaire",
176e321d716SAlexander von Gluck IV	"Kabini",
177e321d716SAlexander von Gluck IV	"Mullins",
178bf8fe3ddSAlexander von Gluck IV	"Hawaii",
179bf8fe3ddSAlexander von Gluck IV	"Topaz",
180bf8fe3ddSAlexander von Gluck IV	"Tonga",
1813853f362SAlexander von Gluck IV	"Fiji",
18230d631c8SAlexander von Gluck IV	"Carrizo",
1833853f362SAlexander von Gluck IV	"Stoney Ridge",
1843853f362SAlexander von Gluck IV	"Polaris 11",
1853853f362SAlexander von Gluck IV	"Polaris 10",
1863853f362SAlexander von Gluck IV	"Polaris 12",
1873853f362SAlexander von Gluck IV	"Vega Mobile",
1883853f362SAlexander von Gluck IV	"Vega 10",
1893853f362SAlexander von Gluck IV	"Vega 12",
1903853f362SAlexander von Gluck IV	"Vega 20",
1913853f362SAlexander von Gluck IV	"Raven",
19242eed3baSAlexander von Gluck IV};
19342eed3baSAlexander von Gluck IV
19476a3e009SAlexander von Gluck IV
195a90ebd77SClemens Zeidlerstruct ring_buffer {
196a90ebd77SClemens Zeidler	struct lock		lock;
197a90ebd77SClemens Zeidler	uint32			register_base;
198a90ebd77SClemens Zeidler	uint32			offset;
199a90ebd77SClemens Zeidler	uint32			size;
200a90ebd77SClemens Zeidler	uint32			position;
201a90ebd77SClemens Zeidler	uint32			space_left;
202a90ebd77SClemens Zeidler	uint8*			base;
203a90ebd77SClemens Zeidler};
204a90ebd77SClemens Zeidler
205917235a8SAlexander von Gluck IV
206a90ebd77SClemens Zeidlerstruct overlay_registers;
207a90ebd77SClemens Zeidler
208917235a8SAlexander von Gluck IV
209a90ebd77SClemens Zeidlerstruct radeon_shared_info {
210359b926fSAlexander von Gluck IV	uint32			deviceIndex;		// accelerant index
21138f17b01SAlexander von Gluck IV	uint32			pciID;				// device pci id
21238f17b01SAlexander von Gluck IV	uint32			pciRev;				// device pci revision
213a90ebd77SClemens Zeidler	area_id			mode_list_area;		// area containing display mode list
214a90ebd77SClemens Zeidler	uint32			mode_count;
215a90ebd77SClemens Zeidler
2165cf44ddaSAlexander von Gluck IV	bool			has_rom;			// was rom mapped?
2173f98c183SAlexander von Gluck IV	area_id			rom_area;			// area of mapped rom
21822582a29SAlexander von Gluck IV	uint32			rom_phys;			// rom base location
21922582a29SAlexander von Gluck IV	uint32			rom_size;			// rom size
2205cf44ddaSAlexander von Gluck IV	uint8*			rom;				// cloned, memory mapped PCI ROM
221ef2909a1SAlexander von Gluck IV
222a90ebd77SClemens Zeidler	display_mode	current_mode;
223a90ebd77SClemens Zeidler	uint32			bytes_per_row;
224a90ebd77SClemens Zeidler	uint32			bits_per_pixel;
225a90ebd77SClemens Zeidler	uint32			dpms_mode;
226a90ebd77SClemens Zeidler
227a90ebd77SClemens Zeidler	area_id			registers_area;			// area of memory mapped registers
228a90ebd77SClemens Zeidler	uint8*			status_page;
229a90ebd77SClemens Zeidler	addr_t			physical_status_page;
230a90ebd77SClemens Zeidler	uint32			graphics_memory_size;
23190af9543SAlexander von Gluck IV
2323be5e036SAlexander von Gluck IV	uint8*			frame_buffer;			// virtual memory mapped FB
23346af8165SAlexander von Gluck IV	area_id			frame_buffer_area;		// area of memory mapped FB
23446af8165SAlexander von Gluck IV	addr_t			frame_buffer_phys;		// card PCI BAR address of FB
23546af8165SAlexander von Gluck IV	uint32			frame_buffer_size;		// FB size mapped
236a90ebd77SClemens Zeidler
2372613175eSAlexander von Gluck IV	bool			has_edid;
2382613175eSAlexander von Gluck IV	edid1_info		edid_info;
2392613175eSAlexander von Gluck IV
240a90ebd77SClemens Zeidler	struct lock		accelerant_lock;
241a90ebd77SClemens Zeidler	struct lock		engine_lock;
242a90ebd77SClemens Zeidler
243a90ebd77SClemens Zeidler	ring_buffer		primary_ring_buffer;
244a90ebd77SClemens Zeidler
245a90ebd77SClemens Zeidler	int32			overlay_channel_used;
246a90ebd77SClemens Zeidler	bool			overlay_active;
247a90ebd77SClemens Zeidler	uint32			overlay_token;
248a90ebd77SClemens Zeidler	addr_t			physical_overlay_registers;
249a90ebd77SClemens Zeidler	uint32			overlay_offset;
250a90ebd77SClemens Zeidler
251a90ebd77SClemens Zeidler	bool			hardware_cursor_enabled;
252a90ebd77SClemens Zeidler	sem_id			vblank_sem;
253a90ebd77SClemens Zeidler
254a90ebd77SClemens Zeidler	uint8*			cursor_memory;
255a90ebd77SClemens Zeidler	addr_t			physical_cursor_memory;
256a90ebd77SClemens Zeidler	uint32			cursor_buffer_offset;
257a90ebd77SClemens Zeidler	uint32			cursor_format;
258a90ebd77SClemens Zeidler	bool			cursor_visible;
259a90ebd77SClemens Zeidler	uint16			cursor_hot_x;
260a90ebd77SClemens Zeidler	uint16			cursor_hot_y;
261a90ebd77SClemens Zeidler
26242eed3baSAlexander von Gluck IV	char			deviceName[MAX_NAME_LENGTH];
263359b926fSAlexander von Gluck IV	uint16			chipsetID;
26442eed3baSAlexander von Gluck IV	char			chipsetName[MAX_NAME_LENGTH];
265d5c8ef5dSAlexander von Gluck IV	uint32			chipsetFlags;
266a4ba3a0fSAlexander von Gluck IV	uint8			dceMajor;
267a4ba3a0fSAlexander von Gluck IV	uint8			dceMinor;
2687d9c1f30SBill Randle
2697d9c1f30SBill Randle	uint16			color_data[3 * 256];    // colour lookup table
270a90ebd77SClemens Zeidler};
271a90ebd77SClemens Zeidler
272a90ebd77SClemens Zeidler//----------------- ioctl() interface ----------------
273a90ebd77SClemens Zeidler
274a90ebd77SClemens Zeidler// magic code for ioctls
275a90ebd77SClemens Zeidler#define RADEON_PRIVATE_DATA_MAGIC		'rdhd'
276a90ebd77SClemens Zeidler
277a90ebd77SClemens Zeidler// list ioctls
278a90ebd77SClemens Zeidlerenum {
279a90ebd77SClemens Zeidler	RADEON_GET_PRIVATE_DATA = B_DEVICE_OP_CODES_END + 1,
280a90ebd77SClemens Zeidler
281a90ebd77SClemens Zeidler	RADEON_GET_DEVICE_NAME,
282a90ebd77SClemens Zeidler	RADEON_ALLOCATE_GRAPHICS_MEMORY,
283a90ebd77SClemens Zeidler	RADEON_FREE_GRAPHICS_MEMORY
284a90ebd77SClemens Zeidler};
285a90ebd77SClemens Zeidler
286a90ebd77SClemens Zeidler// retrieve the area_id of the kernel/accelerant shared info
287a90ebd77SClemens Zeidlerstruct radeon_get_private_data {
288a90ebd77SClemens Zeidler	uint32	magic;				// magic number
289a90ebd77SClemens Zeidler	area_id	shared_info_area;
290a90ebd77SClemens Zeidler};
291a90ebd77SClemens Zeidler
292a90ebd77SClemens Zeidler// allocate graphics memory
293a90ebd77SClemens Zeidlerstruct radeon_allocate_graphics_memory {
294a90ebd77SClemens Zeidler	uint32	magic;
295a90ebd77SClemens Zeidler	uint32	size;
296a90ebd77SClemens Zeidler	uint32	alignment;
297a90ebd77SClemens Zeidler	uint32	flags;
298a90ebd77SClemens Zeidler	uint32	buffer_base;
299a90ebd77SClemens Zeidler};
300a90ebd77SClemens Zeidler
301a90ebd77SClemens Zeidler// free graphics memory
302a90ebd77SClemens Zeidlerstruct radeon_free_graphics_memory {
303a90ebd77SClemens Zeidler	uint32 	magic;
304a90ebd77SClemens Zeidler	uint32	buffer_base;
305a90ebd77SClemens Zeidler};
306a90ebd77SClemens Zeidler
3076c43ea63SAlexander von Gluck IV// registers
3086c43ea63SAlexander von Gluck IV#define R6XX_CONFIG_APER_SIZE			0x5430	// r600>
3096c43ea63SAlexander von Gluck IV#define OLD_CONFIG_APER_SIZE			0x0108	// <r600
310025d4eedSAlexander von Gluck IV#define CONFIG_MEMSIZE                  0x5428	// r600>
311217c0b1dSAlexander von Gluck IV
31275f51fc7SAlexander von Gluck IV// PCI bridge memory management
313a90ebd77SClemens Zeidler
314a90ebd77SClemens Zeidler// overlay
315a90ebd77SClemens Zeidler
316a90ebd77SClemens Zeidler#define RADEON_OVERLAY_UPDATE			0x30000
317a90ebd77SClemens Zeidler#define RADEON_OVERLAY_TEST				0x30004
318a90ebd77SClemens Zeidler#define RADEON_OVERLAY_STATUS			0x30008
319a90ebd77SClemens Zeidler#define RADEON_OVERLAY_EXTENDED_STATUS	0x3000c
320a90ebd77SClemens Zeidler#define RADEON_OVERLAY_GAMMA_5			0x30010
321a90ebd77SClemens Zeidler#define RADEON_OVERLAY_GAMMA_4			0x30014
322a90ebd77SClemens Zeidler#define RADEON_OVERLAY_GAMMA_3			0x30018
323a90ebd77SClemens Zeidler#define RADEON_OVERLAY_GAMMA_2			0x3001c
324a90ebd77SClemens Zeidler#define RADEON_OVERLAY_GAMMA_1			0x30020
325a90ebd77SClemens Zeidler#define RADEON_OVERLAY_GAMMA_0			0x30024
326a90ebd77SClemens Zeidler
327a90ebd77SClemens Zeidlerstruct overlay_scale {
328a90ebd77SClemens Zeidler	uint32 _reserved0 : 3;
329a90ebd77SClemens Zeidler	uint32 horizontal_scale_fraction : 12;
330a90ebd77SClemens Zeidler	uint32 _reserved1 : 1;
331a90ebd77SClemens Zeidler	uint32 horizontal_downscale_factor : 3;
332a90ebd77SClemens Zeidler	uint32 _reserved2 : 1;
333a90ebd77SClemens Zeidler	uint32 vertical_scale_fraction : 12;
334a90ebd77SClemens Zeidler};
335a90ebd77SClemens Zeidler
336a90ebd77SClemens Zeidler#define OVERLAY_FORMAT_RGB15			0x2
337a90ebd77SClemens Zeidler#define OVERLAY_FORMAT_RGB16			0x3
338a90ebd77SClemens Zeidler#define OVERLAY_FORMAT_RGB32			0x1
339a90ebd77SClemens Zeidler#define OVERLAY_FORMAT_YCbCr422			0x8
340a90ebd77SClemens Zeidler#define OVERLAY_FORMAT_YCbCr411			0x9
341a90ebd77SClemens Zeidler#define OVERLAY_FORMAT_YCbCr420			0xc
342a90ebd77SClemens Zeidler
343a90ebd77SClemens Zeidler#define OVERLAY_MIRROR_NORMAL			0x0
344a90ebd77SClemens Zeidler#define OVERLAY_MIRROR_HORIZONTAL		0x1
345a90ebd77SClemens Zeidler#define OVERLAY_MIRROR_VERTICAL			0x2
346a90ebd77SClemens Zeidler
347a90ebd77SClemens Zeidler// The real overlay registers are written to using an update buffer
348a90ebd77SClemens Zeidler
349a90ebd77SClemens Zeidlerstruct overlay_registers {
350a90ebd77SClemens Zeidler	uint32 buffer_rgb0;
351a90ebd77SClemens Zeidler	uint32 buffer_rgb1;
352a90ebd77SClemens Zeidler	uint32 buffer_u0;
353a90ebd77SClemens Zeidler	uint32 buffer_v0;
354a90ebd77SClemens Zeidler	uint32 buffer_u1;
355a90ebd77SClemens Zeidler	uint32 buffer_v1;
356a90ebd77SClemens Zeidler	// (0x18) OSTRIDE - overlay stride
357a90ebd77SClemens Zeidler	uint16 stride_rgb;
358a90ebd77SClemens Zeidler	uint16 stride_uv;
359a90ebd77SClemens Zeidler	// (0x1c) YRGB_VPH - Y/RGB vertical phase
360a90ebd77SClemens Zeidler	uint16 vertical_phase0_rgb;
361a90ebd77SClemens Zeidler	uint16 vertical_phase1_rgb;
362a90ebd77SClemens Zeidler	// (0x20) UV_VPH - UV vertical phase
363a90ebd77SClemens Zeidler	uint16 vertical_phase0_uv;
364a90ebd77SClemens Zeidler	uint16 vertical_phase1_uv;
365a90ebd77SClemens Zeidler	// (0x24) HORZ_PH - horizontal phase
366a90ebd77SClemens Zeidler	uint16 horizontal_phase_rgb;
367a90ebd77SClemens Zeidler	uint16 horizontal_phase_uv;
368a90ebd77SClemens Zeidler	// (0x28) INIT_PHS - initial phase shift
369a90ebd77SClemens Zeidler	uint32 initial_vertical_phase0_shift_rgb0 : 4;
370a90ebd77SClemens Zeidler	uint32 initial_vertical_phase1_shift_rgb0 : 4;
371a90ebd77SClemens Zeidler	uint32 initial_horizontal_phase_shift_rgb0 : 4;
372a90ebd77SClemens Zeidler	uint32 initial_vertical_phase0_shift_uv : 4;
373a90ebd77SClemens Zeidler	uint32 initial_vertical_phase1_shift_uv : 4;
374a90ebd77SClemens Zeidler	uint32 initial_horizontal_phase_shift_uv : 4;
375a90ebd77SClemens Zeidler	uint32 _reserved0 : 8;
376a90ebd77SClemens Zeidler	// (0x2c) DWINPOS - destination window position
377a90ebd77SClemens Zeidler	uint16 window_left;
378a90ebd77SClemens Zeidler	uint16 window_top;
379a90ebd77SClemens Zeidler	// (0x30) DWINSZ - destination window size
380a90ebd77SClemens Zeidler	uint16 window_width;
381a90ebd77SClemens Zeidler	uint16 window_height;
382a90ebd77SClemens Zeidler	// (0x34) SWIDTH - source width
383a90ebd77SClemens Zeidler	uint16 source_width_rgb;
384a90ebd77SClemens Zeidler	uint16 source_width_uv;
385a90ebd77SClemens Zeidler	// (0x38) SWITDHSW - source width in 8 byte steps
386a90ebd77SClemens Zeidler	uint16 source_bytes_per_row_rgb;
387a90ebd77SClemens Zeidler	uint16 source_bytes_per_row_uv;
388a90ebd77SClemens Zeidler	uint16 source_height_rgb;
389a90ebd77SClemens Zeidler	uint16 source_height_uv;
390a90ebd77SClemens Zeidler	overlay_scale scale_rgb;
391a90ebd77SClemens Zeidler	overlay_scale scale_uv;
392a90ebd77SClemens Zeidler	// (0x48) OCLRC0 - overlay color correction 0
393a90ebd77SClemens Zeidler	uint32 brightness_correction : 8;		// signed, -128 to 127
394a90ebd77SClemens Zeidler	uint32 _reserved1 : 10;
395a90ebd77SClemens Zeidler	uint32 contrast_correction : 9;			// fixed point: 3.6 bits
396a90ebd77SClemens Zeidler	uint32 _reserved2 : 5;
397a90ebd77SClemens Zeidler	// (0x4c) OCLRC1 - overlay color correction 1
398a90ebd77SClemens Zeidler	uint32 saturation_cos_correction : 10;	// fixed point: 3.7 bits
399a90ebd77SClemens Zeidler	uint32 _reserved3 : 6;
400a90ebd77SClemens Zeidler	uint32 saturation_sin_correction : 11;	// signed fixed point: 3.7 bits
401a90ebd77SClemens Zeidler	uint32 _reserved4 : 5;
402a90ebd77SClemens Zeidler	// (0x50) DCLRKV - destination color key value
403a90ebd77SClemens Zeidler	uint32 color_key_blue : 8;
404a90ebd77SClemens Zeidler	uint32 color_key_green : 8;
405a90ebd77SClemens Zeidler	uint32 color_key_red : 8;
406a90ebd77SClemens Zeidler	uint32 _reserved5 : 8;
407a90ebd77SClemens Zeidler	// (0x54) DCLRKM - destination color key mask
408a90ebd77SClemens Zeidler	uint32 color_key_mask_blue : 8;
409a90ebd77SClemens Zeidler	uint32 color_key_mask_green : 8;
410a90ebd77SClemens Zeidler	uint32 color_key_mask_red : 8;
411a90ebd77SClemens Zeidler	uint32 _reserved6 : 7;
412a90ebd77SClemens Zeidler	uint32 color_key_enabled : 1;
413a90ebd77SClemens Zeidler	// (0x58) SCHRKVH - source chroma key high value
414a90ebd77SClemens Zeidler	uint32 source_chroma_key_high_red : 8;
415a90ebd77SClemens Zeidler	uint32 source_chroma_key_high_blue : 8;
416a90ebd77SClemens Zeidler	uint32 source_chroma_key_high_green : 8;
417a90ebd77SClemens Zeidler	uint32 _reserved7 : 8;
418a90ebd77SClemens Zeidler	// (0x5c) SCHRKVL - source chroma key low value
419a90ebd77SClemens Zeidler	uint32 source_chroma_key_low_red : 8;
420a90ebd77SClemens Zeidler	uint32 source_chroma_key_low_blue : 8;
421a90ebd77SClemens Zeidler	uint32 source_chroma_key_low_green : 8;
422a90ebd77SClemens Zeidler	uint32 _reserved8 : 8;
423a90ebd77SClemens Zeidler	// (0x60) SCHRKEN - source chroma key enable
424a90ebd77SClemens Zeidler	uint32 _reserved9 : 24;
425a90ebd77SClemens Zeidler	uint32 source_chroma_key_red_enabled : 1;
426a90ebd77SClemens Zeidler	uint32 source_chroma_key_blue_enabled : 1;
427a90ebd77SClemens Zeidler	uint32 source_chroma_key_green_enabled : 1;
428a90ebd77SClemens Zeidler	uint32 _reserved10 : 5;
429a90ebd77SClemens Zeidler	// (0x64) OCONFIG - overlay configuration
430a90ebd77SClemens Zeidler	uint32 _reserved11 : 3;
431a90ebd77SClemens Zeidler	uint32 color_control_output_mode : 1;
432a90ebd77SClemens Zeidler	uint32 yuv_to_rgb_bypass : 1;
433a90ebd77SClemens Zeidler	uint32 _reserved12 : 11;
434a90ebd77SClemens Zeidler	uint32 gamma2_enabled : 1;
435a90ebd77SClemens Zeidler	uint32 _reserved13 : 1;
436a90ebd77SClemens Zeidler	uint32 select_pipe : 1;
437a90ebd77SClemens Zeidler	uint32 slot_time : 8;
438a90ebd77SClemens Zeidler	uint32 _reserved14 : 5;
439a90ebd77SClemens Zeidler	// (0x68) OCOMD - overlay command
440a90ebd77SClemens Zeidler	uint32 overlay_enabled : 1;
441a90ebd77SClemens Zeidler	uint32 active_field : 1;
442a90ebd77SClemens Zeidler	uint32 active_buffer : 2;
443a90ebd77SClemens Zeidler	uint32 test_mode : 1;
444a90ebd77SClemens Zeidler	uint32 buffer_field_mode : 1;
445a90ebd77SClemens Zeidler	uint32 _reserved15 : 1;
446a90ebd77SClemens Zeidler	uint32 tv_flip_field_enabled : 1;
447a90ebd77SClemens Zeidler	uint32 _reserved16 : 1;
448a90ebd77SClemens Zeidler	uint32 tv_flip_field_parity : 1;
449a90ebd77SClemens Zeidler	uint32 source_format : 4;
450a90ebd77SClemens Zeidler	uint32 ycbcr422_order : 2;
451a90ebd77SClemens Zeidler	uint32 _reserved18 : 1;
452a90ebd77SClemens Zeidler	uint32 mirroring_mode : 2;
453a90ebd77SClemens Zeidler	uint32 _reserved19 : 13;
454a90ebd77SClemens Zeidler
455a90ebd77SClemens Zeidler	uint32 _reserved20;
456a90ebd77SClemens Zeidler
457a90ebd77SClemens Zeidler	uint32 start_0y;
458a90ebd77SClemens Zeidler	uint32 start_1y;
459a90ebd77SClemens Zeidler	uint32 start_0u;
460a90ebd77SClemens Zeidler	uint32 start_0v;
461a90ebd77SClemens Zeidler	uint32 start_1u;
462a90ebd77SClemens Zeidler	uint32 start_1v;
463a90ebd77SClemens Zeidler	uint32 _reserved21[6];
464a90ebd77SClemens Zeidler#if 0
465a90ebd77SClemens Zeidler	// (0x70) AWINPOS - alpha blend window position
466a90ebd77SClemens Zeidler	uint32 awinpos;
467a90ebd77SClemens Zeidler	// (0x74) AWINSZ - alpha blend window size
468a90ebd77SClemens Zeidler	uint32 awinsz;
469a90ebd77SClemens Zeidler
470a90ebd77SClemens Zeidler	uint32 _reserved21[10];
471a90ebd77SClemens Zeidler#endif
472a90ebd77SClemens Zeidler
473a90ebd77SClemens Zeidler	// (0xa0) FASTHSCALE - fast horizontal downscale (strangely enough,
474a90ebd77SClemens Zeidler	// the next two registers switch the usual Y/RGB vs. UV order)
475a90ebd77SClemens Zeidler	uint16 horizontal_scale_uv;
476a90ebd77SClemens Zeidler	uint16 horizontal_scale_rgb;
477a90ebd77SClemens Zeidler	// (0xa4) UVSCALEV - vertical downscale
478a90ebd77SClemens Zeidler	uint16 vertical_scale_uv;
479a90ebd77SClemens Zeidler	uint16 vertical_scale_rgb;
480a90ebd77SClemens Zeidler
481a90ebd77SClemens Zeidler	uint32 _reserved22[86];
482a90ebd77SClemens Zeidler
483a90ebd77SClemens Zeidler	// (0x200) polyphase filter coefficients
484a90ebd77SClemens Zeidler	uint16 vertical_coefficients_rgb[128];
485a90ebd77SClemens Zeidler	uint16 horizontal_coefficients_rgb[128];
486a90ebd77SClemens Zeidler
487a90ebd77SClemens Zeidler	uint32	_reserved23[64];
488a90ebd77SClemens Zeidler
489a90ebd77SClemens Zeidler	// (0x500)
490a90ebd77SClemens Zeidler	uint16 vertical_coefficients_uv[128];
491a90ebd77SClemens Zeidler	uint16 horizontal_coefficients_uv[128];
492a90ebd77SClemens Zeidler};
493a90ebd77SClemens Zeidler
494a90ebd77SClemens Zeidler
495a90ebd77SClemens Zeidlerstruct hardware_status {
496a90ebd77SClemens Zeidler	uint32	interrupt_status_register;
497a90ebd77SClemens Zeidler	uint32	_reserved0[3];
498a90ebd77SClemens Zeidler	void*	primary_ring_head_storage;
499a90ebd77SClemens Zeidler	uint32	_reserved1[3];
500a90ebd77SClemens Zeidler	void*	secondary_ring_0_head_storage;
501a90ebd77SClemens Zeidler	void*	secondary_ring_1_head_storage;
502a90ebd77SClemens Zeidler	uint32	_reserved2[2];
503a90ebd77SClemens Zeidler	void*	binning_head_storage;
504a90ebd77SClemens Zeidler	uint32	_reserved3[3];
505a90ebd77SClemens Zeidler	uint32	store[1008];
506a90ebd77SClemens Zeidler};
507a90ebd77SClemens Zeidler
508a90ebd77SClemens Zeidler#endif	/* RADEON_HD_H */
509