#ifndef RADEON_HD_H
#define RADEON_HD_H
#include "lock.h"
#include "radeon_reg.h"
#include "avivo_reg.h"
#include "r600_reg.h"
#include "r700_reg.h"
#include "evergreen_reg.h"
#include "ni_reg.h"
#include "si_reg.h"
#include "sea_reg.h"
#include "vol_reg.h"
#include "car_reg.h"
#include "pol_reg.h"
#include <Accelerant.h>
#include <Drivers.h>
#include <edid.h>
#include <PCI.h>
#define VENDOR_ID_ATI 0x1002
#define CHIP_STD (1 << 0)
#define CHIP_X2 (1 << 1)
#define CHIP_IGP (1 << 2)
#define CHIP_MOBILE (1 << 3)
#define CHIP_DISCREET (1 << 4)
#define CHIP_APU (1 << 5)
#define DEVICE_NAME "radeon_hd"
#define RADEON_ACCELERANT_NAME "radeon_hd.accelerant"
#define MAX_NAME_LENGTH 32
#define EDID_BOOT_INFO "vesa_edid/v1"
#define MODES_BOOT_INFO "vesa_modes/v1"
#define RHD_POWER_ON 0
#define RHD_POWER_RESET 1
#define RHD_POWER_SHUTDOWN 2
#define RHD_POWER_UNKNOWN 3
enum radeon_chipset {
RADEON_R420 = 0,
RADEON_R423,
RADEON_RV410,
RADEON_RS400,
RADEON_RS480,
RADEON_RS600,
RADEON_RS690,
RADEON_RS740,
RADEON_RV515,
RADEON_R520,
RADEON_RV530,
RADEON_RV560,
RADEON_RV570,
RADEON_R580,
RADEON_R600,
RADEON_RV610,
RADEON_RV630,
RADEON_RV670,
RADEON_RV620,
RADEON_RV635,
RADEON_RS780,
RADEON_RS880,
RADEON_RV770,
RADEON_RV730,
RADEON_RV710,
RADEON_RV740,
RADEON_CEDAR,
RADEON_REDWOOD,
RADEON_JUNIPER,
RADEON_CYPRESS,
RADEON_HEMLOCK,
RADEON_PALM,
RADEON_SUMO,
RADEON_SUMO2,
RADEON_CAICOS,
RADEON_TURKS,
RADEON_BARTS,
RADEON_CAYMAN,
RADEON_ANTILLES,
RADEON_CAPEVERDE,
RADEON_PITCAIRN,
RADEON_TAHITI,
RADEON_ARUBA,
RADEON_OLAND,
RADEON_HAINAN,
RADEON_KAVERI,
RADEON_BONAIRE,
RADEON_KABINI,
RADEON_MULLINS,
RADEON_HAWAII,
RADEON_TOPAZ,
RADEON_TONGA,
RADEON_FIJI,
RADEON_CARRIZO,
RADEON_STONEY,
RADEON_POLARIS10,
RADEON_POLARIS11,
RADEON_POLARIS12,
RADEON_VEGAM,
RADEON_VEGA10,
RADEON_VEGA12,
RADEON_VEGA20,
RADEON_RAVEN,
RADEON_NAVI,
};
static const char radeon_chip_name[][MAX_NAME_LENGTH] = {
"R420",
"R423",
"RV410",
"RS400",
"RS480",
"RS600",
"RS690",
"RS740",
"RV515",
"R520",
"RV530",
"RV560",
"RV570",
"R580",
"R600",
"RV610",
"RV630",
"RV670",
"RV620",
"RV635",
"RS780",
"RS880",
"RV770",
"RV730",
"RV710",
"RV740",
"Cedar",
"Redwood",
"Juniper",
"Cypress",
"Hemlock",
"Palm",
"Sumo",
"Sumo2",
"Caicos",
"Turks",
"Barts",
"Cayman",
"Antilles",
"Cape Verde",
"Pitcairn",
"Tahiti",
"Aruba",
"Oland",
"Hainan",
"Kaveri",
"Bonaire",
"Kabini",
"Mullins",
"Hawaii",
"Topaz",
"Tonga",
"Fiji",
"Carrizo",
"Stoney Ridge",
"Polaris 11",
"Polaris 10",
"Polaris 12",
"Vega Mobile",
"Vega 10",
"Vega 12",
"Vega 20",
"Raven",
"Navi",
};
struct ring_buffer {
struct lock lock;
uint32 register_base;
uint32 offset;
uint32 size;
uint32 position;
uint32 space_left;
uint8* base;
};
struct radeon_shared_info {
uint32 deviceIndex;
uint32 pciID;
uint32 pciRev;
area_id mode_list_area;
uint32 mode_count;
bool has_rom;
area_id rom_area;
uint32 rom_phys;
uint32 rom_size;
uint8* rom;
display_mode current_mode;
uint32 bytes_per_row;
uint32 bits_per_pixel;
uint32 dpms_mode;
area_id registers_area;
uint8* status_page;
addr_t physical_status_page;
uint32 graphics_memory_size;
uint8* frame_buffer;
area_id frame_buffer_area;
addr_t frame_buffer_phys;
uint32 frame_buffer_size;
bool has_edid;
edid1_info edid_info;
struct lock accelerant_lock;
struct lock engine_lock;
ring_buffer primary_ring_buffer;
char deviceName[MAX_NAME_LENGTH];
uint16 chipsetID;
char chipsetName[MAX_NAME_LENGTH];
uint32 chipsetFlags;
uint8 dceMajor;
uint8 dceMinor;
uint16 color_data[3 * 256];
};
#define RADEON_PRIVATE_DATA_MAGIC 'rdhd'
enum {
RADEON_GET_PRIVATE_DATA = B_DEVICE_OP_CODES_END + 1,
RADEON_GET_DEVICE_NAME,
RADEON_ALLOCATE_GRAPHICS_MEMORY,
RADEON_FREE_GRAPHICS_MEMORY
};
struct radeon_get_private_data {
uint32 magic;
area_id shared_info_area;
};
struct radeon_allocate_graphics_memory {
uint32 magic;
uint32 size;
uint32 alignment;
uint32 flags;
uint32 buffer_base;
};
struct radeon_free_graphics_memory {
uint32 magic;
uint32 buffer_base;
};
#define R6XX_CONFIG_APER_SIZE 0x5430
#define OLD_CONFIG_APER_SIZE 0x0108
#define CONFIG_MEMSIZE 0x5428
#define CONFIG_MEMSIZE_TAHITI 0x03de
#endif