Chameleon

Chameleon Svn Source Tree

Root/branches/azimutz/CleanCut/i386/libsaio/ati.c

1/*
2 * ATI injector
3 *
4 * Copyright (C) 2009 Jasmin Fazlic, iNDi, netkas
5 *
6 * ATI injector is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * ATI driver and injector is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with ATI injector. If not, see <http://www.gnu.org/licenses/>.
18 */
19/*
20 * Alternatively you can choose to comply with APSL
21 */
22
23
24#include "libsaio.h"
25#include "boot.h"
26#include "bootstruct.h"
27#include "pci.h"
28#include "platform.h"
29#include "device_inject.h"
30#include "ati.h"
31
32#ifndef DEBUG_ATI
33#define DEBUG_ATI 0
34#endif
35
36#if DEBUG_ATI
37#define DBG(x...)printf(x)
38#else
39#define DBG(x...)
40#endif
41
42#define MAX_NUM_DCB_ENTRIES 16
43
44#define TYPE_GROUPED 0xff
45
46extern uint32_t devices_number;
47
48const char *ati_compatible_0[] = { "@0,compatible", "ATY,%s" };
49const char *ati_compatible_1[] = { "@1,compatible", "ATY,%s" };
50const char *ati_device_type_0[] = { "@0,device_type", "display" };
51const char *ati_device_type_1[] = { "@1,device_type", "display" };
52const char *ati_device_type[] = { "device_type", "ATY,%sParent" };
53const char *ati_name_0[] = { "@0,name", "ATY,%s" };
54const char *ati_name_1[] = { "@1,name", "ATY,%s" };
55const char *ati_name[] = { "name", "ATY,%sParent" };
56const char *ati_efidisplay_0[] = { "@0,ATY,EFIDisplay", "TMDSB" };
57struct ati_data_key ati_connector_type_0 = { 0x04, "@0,connector-type", {0x00, 0x04, 0x00, 0x00} };
58struct ati_data_key ati_connector_type_1 = { 0x04, "@1,connector-type", {0x04, 0x00, 0x00, 0x00} };
59struct ati_data_key ati_display_con_fl_type_0 = { 0x04, "@0,display-connect-flags", {0x00, 0x00, 0x04, 0x00} };
60const char *ati_display_type_0[] = { "@0,display-type", "LCD" };
61const char *ati_display_type_1[] = { "@1,display-type", "NONE" };
62struct ati_data_key ati_aux_power_conn = { 0x04, "AAPL,aux-power-connected", {0x01, 0x00, 0x00, 0x00} };
63struct ati_data_key ati_backlight_ctrl = { 0x04, "AAPL,backlight-control", {0x00, 0x00, 0x00, 0x00} };
64struct ati_data_key ati_aapl01_coher = { 0x04, "AAPL01,Coherency", {0x01, 0x00, 0x00, 0x00} };
65const char *ati_card_no[] = { "ATY,Card#", "109-B77101-00" };
66const char *ati_copyright[] = { "ATY,Copyright", "Copyright AMD Inc. All Rights Reserved. 2005-2009" };
67const char *ati_efi_compile_d[] = { "ATY,EFICompileDate", "Jan 26 2009" };
68struct ati_data_key ati_efi_disp_conf = { 0x08, "ATY,EFIDispConfig", {0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01} };
69struct ati_data_key ati_efi_drv_type = { 0x01, "ATY,EFIDriverType", {0x02} };
70struct ati_data_key ati_efi_enbl_mode = { 0x01, "ATY,EFIEnabledMode", {0x01} };
71struct ati_data_key ati_efi_init_stat = { 0x04, "ATY,EFIHWInitStatus", {0x00, 0x00, 0x00, 0x00} };
72struct ati_data_key ati_efi_orientation = { 0x02, "ATY,EFIOrientation", {0x02, 0x00} };
73const char *ati_efi_version[] = { "ATY,EFIVersion", "01.00.318" };
74const char *ati_efi_versionB[] = { "ATY,EFIVersionB", "113-SBSJ1G04-00R-02" };
75const char *ati_efi_versionE[] = { "ATY,EFIVersionE", "113-B7710A-318" };
76struct ati_data_key ati_mclk = { 0x04, "ATY,MCLK", {0x70, 0x2e, 0x11, 0x00} };
77struct ati_data_key ati_mem_rev_id = { 0x02, "ATY,MemRevisionID", {0x03, 0x00} };
78struct ati_data_key ati_mem_vend_id = { 0x02, "ATY,MemVendorID", {0x02, 0x00} };
79const char *ati_mrt[] = { "ATY,MRT", " " };
80const char *ati_romno[] = { "ATY,Rom#", "113-B7710C-176" };
81struct ati_data_key ati_sclk = { 0x04, "ATY,SCLK", {0x28, 0xdb, 0x0b, 0x00} };
82struct ati_data_key ati_vendor_id = { 0x02, "ATY,VendorID", {0x02, 0x10} };
83struct ati_data_key ati_platform_info = { 0x80, "ATY,PlatformInfo", {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} };
84struct ati_data_key ati_mvad = { 0x40, "MVAD", {0x3f, 0x5c, 0x82, 0x02, 0xff, 0x90, 0x00, 0x54, 0x60, 0x00, 0xac, 0x10, 0xa0, 0x17, 0x00, 0x03, 0xb0, 0x68, 0x00, 0x0a, 0xa0, 0x0a, 0x30, 0x00, 0x20, 0x00, 0x40, 0x06, 0x6e, 0x06, 0x03, 0x00, 0x06, 0x00, 0x40, 0x06, 0x00, 0x0a, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x10, 0x06, 0x92, 0x20, 0x00, 0x03} };
85struct ati_data_key ati_saved_config = { 0x100, "saved-config", {0x3f, 0x5c, 0x82, 0x02, 0xff, 0x90, 0x00, 0x54, 0x60, 0x00, 0xac, 0x10, 0xa0, 0x17, 0x00, 0x03, 0xb0, 0x68, 0x00, 0x0a, 0xa0, 0x0a, 0x30, 0x00, 0x20, 0x00, 0x40, 0x06, 0x6e, 0x06, 0x03, 0x00, 0x06, 0x00, 0x40, 0x06, 0x00, 0x0a, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x10, 0x06, 0x92, 0x20, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xee, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x31, 0x30, 0x50, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x32, 0x32, 0x32, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} };
86///non 48xx keys
87const char *ati_efidisplay_0_n4[] = { "@0,ATY,EFIDisplay", "TMDSA" };
88struct ati_data_key ati_connector_type_0_n4 = { 0x04, "@0,connector-type", {0x04, 0x00, 0x00, 0x00} };
89struct ati_data_key ati_connector_type_1_n4 = { 0x04, "@1,connector-type", {0x00, 0x02, 0x00, 0x00} };
90struct ati_data_key ati_aapl_emc_disp_list_n4 = { 0x40, "AAPL,EMC-Display-List", {0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x10, 0x00, 0x00, 0x1b, 0x92, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x10, 0x00, 0x00, 0x1c, 0x92, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x10, 0x00, 0x00, 0x21, 0x92, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} };
91struct ati_data_key ati_fb_offset_n4 = { 0x08, "ATY,FrameBufferOffset", {0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00} };
92struct ati_data_key ati_hwgpio_n4 = { 0x04, "ATY,HWGPIO", {0x23, 0xa8, 0x48, 0x00} };
93struct ati_data_key ati_iospace_offset_n4 = { 0x08, "ATY,IOSpaceOffset", {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00} };
94struct ati_data_key ati_mclk_n4 = { 0x04, "ATY,MCLK", {0x00, 0x35, 0x0c, 0x00} };
95struct ati_data_key ati_sclk_n4 = { 0x04, "ATY,SCLK", {0x60, 0xae, 0x0a, 0x00} };
96struct ati_data_key ati_refclk_n4 = { 0x04, "ATY,RefCLK", {0x8c, 0x0a, 0x00, 0x00} };
97struct ati_data_key ati_regspace_offset_n4 = { 0x08, "ATY,RegisterSpaceOffset", {0x00, 0x00, 0x00, 0x00, 0x90, 0xa2, 0x00, 0x00} };
98struct ati_data_key ati_vram_memsize_0 = { 0x08, "@0,VRAM,memsize", {0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00} };
99struct ati_data_key ati_vram_memsize_1 = { 0x08, "@1,VRAM,memsize", {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} };
100struct ati_data_key ati_aapl_blackscr_prefs_0_n4 = { 0x04, "AAPL00,blackscreen-preferences", {0x00, 0x00, 0x00, 0x00} };
101struct ati_data_key ati_aapl_blackscr_prefs_1_n4 = { 0x04, "AAPL01,blackscreen-preferences", {0x00, 0x00, 0x00, 0x00} };
102struct ati_data_key ati_swgpio_info_n4 = { 0x04, "ATY,SWGPIO Info", {0x00, 0x48, 0xa8, 0x23} };
103struct ati_data_key ati_efi_orientation_n4 = { 0x01, "ATY,EFIOrientation", {0x08} };
104struct ati_data_key ati_mvad_n4 = { 0x100, "MVAD", {0x3e, 0x5c, 0x82, 0x00, 0xff, 0x90, 0x00, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x3c, 0x80, 0x07, 0x20, 0x08, 0x30, 0x00, 0x20, 0x00, 0xb0, 0x04, 0xd3, 0x04, 0x03, 0x00, 0x06, 0x00, 0xb0, 0x04, 0x80, 0x07, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x90, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x31, 0x30, 0x50, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x32, 0x32, 0x32, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} };
105struct ati_data_key ati_saved_config_n4 = { 0x100, "saved-config", {0x3e, 0x5c, 0x82, 0x00, 0xff, 0x90, 0x00, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x3c, 0x80, 0x07, 0x20, 0x08, 0x30, 0x00, 0x20, 0x00, 0xb0, 0x04, 0xd3, 0x04, 0x03, 0x00, 0x06, 0x00, 0xb0, 0x04, 0x80, 0x07, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x90, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x31, 0x30, 0x50, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x32, 0x32, 0x32, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} };
106
107struct pcir_s {
108uint32_t signature;
109uint16_t vid;
110uint16_t devid;
111};
112
113// Known cards as of 2008/08/26
114static struct ati_chipsets_t ATIKnownChipsets[] = {
115{ 0x00000000, "Unknown" } ,
116{ 0x10029589, "ATI Radeon 2600 Series"} ,
117{ 0x10029588, "ATI Radeon 2600 Series"} ,
118{ 0x100294C3, "ATI Radeon 2400 Series"} ,
119{ 0x100294C4, "ATI Radeon 2400 Series"} ,
120{ 0x100294C6, "ATI Radeon 2400 Series"} ,
121{ 0x10029400, "ATI Radeon 2900 Series"} ,
122{ 0x10029405, "ATI Radeon 2900GT Series"} ,
123{ 0x10029581, "ATI Radeon 2600 Series"} ,
124{ 0x10029583, "ATI Radeon 2600 Series"} ,
125{ 0x10029586, "ATI Radeon 2600 Series"} ,
126{ 0x10029587, "ATI Radeon 2600 Series"} ,
127{ 0x100294C9, "ATI Radeon 2400 Series"} ,
128{ 0x10029501, "ATI Radeon 3800 Series"} ,
129{ 0x10029505, "ATI Radeon 3800 Series"} ,
130{ 0x10029515, "ATI Radeon 3800 Series"} ,
131{ 0x10029507, "ATI Radeon 3800 Series"} ,
132{ 0x10029500, "ATI Radeon 3800 Series"} ,
133{ 0x1002950F, "ATI Radeon 3800X2 Series"} ,
134{ 0x100295C5, "ATI Radeon 3400 Series"} ,
135{ 0x100295C7, "ATI Radeon 3400 Series"} ,
136{ 0x100295C0, "ATI Radeon 3400 Series"} ,
137{ 0x10029596, "ATI Radeon 3600 Series"} ,
138{ 0x10029590, "ATI Radeon 3600 Series"} ,
139{ 0x10029599, "ATI Radeon 3600 Series"} ,
140{ 0x10029597, "ATI Radeon 3600 Series"} ,
141{ 0x10029598, "ATI Radeon 3600 Series"} ,
142{ 0x10029442, "ATI Radeon 4850 Series"} ,
143{ 0x10029440, "ATI Radeon 4870 Series"} ,
144{ 0x1002944C, "ATI Radeon 4830 Series"} ,
145{ 0x10029460, "ATI Radeon 4890 Series"} ,
146{ 0x10029462, "ATI Radeon 4890 Series"} ,
147{ 0x10029441, "ATI Radeon 4870X2 Series"} ,
148{ 0x10029443, "ATI Radeon 4850X2 Series"} ,
149{ 0x10029444, "ATI Radeon 4800 Series"} ,
150{ 0x10029446, "ATI Radeon 4800 Series"} ,
151{ 0x1002944E, "ATI Radeon 4730 Series"} ,
152{ 0x10029450, "ATI Radeon 4800 Series"} ,
153{ 0x10029452, "ATI Radeon 4800 Series"} ,
154{ 0x10029456, "ATI Radeon 4800 Series"} ,
155{ 0x1002944A, "ATI Radeon 4800 Mobility Series"} ,
156{ 0x1002945A, "ATI Radeon 4800 Mobility Series"} ,
157{ 0x1002945B, "ATI Radeon 4800 Mobility Series"} ,
158{ 0x1002944B, "ATI Radeon 4800 Mobility Series"} ,
159{ 0x10029490, "ATI Radeon 4600 Series"} ,
160{ 0x10029498, "ATI Radeon 4600 Series"} ,
161{ 0x1002949E, "ATI Radeon 4600 Series"} ,
162{ 0x10029480, "ATI Radeon 4600 Series"} ,
163{ 0x10029488, "ATI Radeon 4600 Series"} ,
164{ 0x10029540, "ATI Radeon 4500 Series"} ,
165{ 0x10029541, "ATI Radeon 4500 Series"} ,
166{ 0x1002954E, "ATI Radeon 4500 Series"} ,
167{ 0x10029552, "ATI Radeon 4300 Mobility Series"} ,
168{ 0x10029553, "ATI Radeon 4500 Mobility Series"} ,
169{ 0x1002954F, "ATI Radeon 4300 Series"} ,
170 { 0x100294B3, "ATI Radeon 4770 Series"} ,
171 { 0x100294B5, "ATI Radeon 4770 Series"} ,
172 { 0x100268B8, "ATI Radeon 5700 Series"} ,
173 { 0x100268BE, "ATI Radeon 5700 Series"} ,
174 { 0x10026898, "ATI Radeon 5800 Series"} ,
175 { 0x10026899, "ATI Radeon 5800 Series"}
176};
177
178static struct ati_chipsets_t ATIKnownFramebuffers[] = {
179{ 0x00000000, "Megalodon" },
180{ 0x10029589, "Lamna"} ,
181{ 0x10029588, "Lamna"} ,
182{ 0x100294C3, "Iago"} ,
183{ 0x100294C4, "Iago"} ,
184{ 0x100294C6, "Iago"} ,
185{ 0x10029400, "Franklin"} ,
186{ 0x10029405, "Franklin"} ,
187{ 0x10029581, "Hypoprion"} ,
188{ 0x10029583, "Hypoprion"} ,
189{ 0x10029586, "Hypoprion"} ,
190{ 0x10029587, "Hypoprion"} ,
191{ 0x100294C9, "Iago"} ,
192{ 0x10029501, "Megalodon"} ,
193{ 0x10029505, "Megalodon"} ,
194{ 0x10029515, "Megalodon"} ,
195{ 0x10029507, "Megalodon"} ,
196{ 0x10029500, "Megalodon"} ,
197{ 0x1002950F, "Triakis"} ,
198{ 0x100295C5, "Iago"} ,
199{ 0x100295C7, "Iago"} ,
200{ 0x100295C0, "Iago"} ,
201{ 0x10029596, "Megalodon"} ,
202{ 0x10029590, "Megalodon"} ,
203{ 0x10029599, "Megalodon"} ,
204{ 0x10029597, "Megalodon"} ,
205{ 0x10029598, "Megalodon"} ,
206{ 0x10029442, "Motmot"} ,
207{ 0x10029440, "Motmot"} ,
208{ 0x1002944C, "Motmot"} ,
209{ 0x10029460, "Motmot"} ,
210{ 0x10029462, "Motmot"} ,
211{ 0x10029441, "Motmot"} ,
212{ 0x10029443, "Motmot"} ,
213{ 0x10029444, "Motmot"} ,
214{ 0x10029446, "Motmot"} ,
215{ 0x1002944E, "Motmot"} ,
216{ 0x10029450, "Motmot"} ,
217{ 0x10029452, "Motmot"} ,
218{ 0x10029456, "Motmot"} ,
219{ 0x1002944A, "Motmot"} ,
220{ 0x1002945A, "Motmot"} ,
221{ 0x1002945B, "Motmot"} ,
222{ 0x1002944B, "Motmot"} ,
223 { 0x10029490, "Peregrine"} ,
224 { 0x10029498, "Peregrine"} ,
225 { 0x1002949E, "Peregrine"} ,
226 { 0x10029480, "Peregrine"} ,
227 { 0x10029488, "Peregrine"} ,
228 { 0x10029540, "Peregrine"} ,
229 { 0x10029541, "Peregrine"} ,
230 { 0x1002954E, "Peregrine"} ,
231 { 0x10029552, "Peregrine"} ,
232 { 0x10029553, "Peregrine"} ,
233 { 0x1002954F, "Peregrine"} ,
234 { 0x100294B3, "Peregrine"},
235 { 0x100294B5, "Peregrine"},
236 { 0x100268B8, "Motmot"},
237 { 0x100268BE, "Motmot"},
238 { 0x10026898, "Motmot"},
239 { 0x10026899, "Motmot"}
240};
241
242static uint32_t accessROM(pci_dt_t *ati_dev, unsigned int mode)
243{
244uint32_tbar[7];
245volatile uint32_t*regs;
246
247bar[2] = pci_config_read32(ati_dev->dev.addr, 0x18 );
248regs = (uint32_t *) (bar[2] & ~0x0f);
249
250if (mode) {
251if (mode != 1) {
252return 0xe00002c7;
253}
254REG32W(0x179c, 0x00080000);
255REG32W(0x1798, 0x00080721);
256REG32W(0x17a0, 0x00080621);
257REG32W(0x1600, 0x14030300);
258REG32W(0x1798, 0x21);
259REG32W(0x17a0, 0x21);
260REG32W(0x179c, 0x00);
261REG32W(0x17a0, 0x21);
262REG32W(0x1798, 0x21);
263REG32W(0x1798, 0x21);
264} else {
265REG32W(0x1600, 0x14030302);
266REG32W(0x1798, 0x21);
267REG32W(0x17a0, 0x21);
268REG32W(0x179c, 0x00080000);
269REG32W(0x17a0, 0x00080621);
270REG32W(0x1798, 0x00080721);
271REG32W(0x1798, 0x21);
272REG32W(0x17a0, 0x21);
273REG32W(0x179c, 0x00);
274REG32W(0x1604, 0x0400e9fc);
275REG32W(0x161c, 0x00);
276REG32W(0x1620, 0x9f);
277REG32W(0x1618, 0x00040004);
278REG32W(0x161c, 0x00);
279REG32W(0x1604, 0xe9fc);
280REG32W(0x179c, 0x00080000);
281REG32W(0x1798, 0x00080721);
282REG32W(0x17a0, 0x00080621);
283REG32W(0x1798, 0x21);
284REG32W(0x17a0, 0x21);
285REG32W(0x179c, 0x00);
286}
287return 0;
288}
289
290static uint8_t *readAtomBIOS(pci_dt_t *ati_dev)
291{
292uint32_tbar[7];
293uint32_t*BIOSBase;
294uint32_tcounter;
295volatile uint32_t*regs;
296
297bar[2] = pci_config_read32(ati_dev->dev.addr, 0x18 );
298regs = (volatile uint32_t *) (bar[2] & ~0x0f);
299accessROM(ati_dev, 0);
300REG32W(0xa8, 0);
301REG32R(0xac);
302REG32W(0xa8, 0);
303REG32R(0xac);
304
305BIOSBase = malloc(0x10000);
306REG32W(0xa8, 0);
307BIOSBase[0] = REG32R(0xac);
308counter = 4;
309do {
310REG32W(0xa8, counter);
311BIOSBase[counter/4] = REG32R(0xac);
312counter +=4;
313} while (counter != 0x10000);
314accessROM((pci_dt_t *)regs, 1);
315
316if (*(uint16_t *)BIOSBase != 0xAA55) {
317printf("Wrong BIOS signature: %04x\n", *(uint16_t *)BIOSBase);
318return 0;
319}
320return (uint8_t *)BIOSBase;
321}
322
323#define R5XX_CONFIG_MEMSIZE0x00F8
324#define R6XX_CONFIG_MEMSIZE0x5428
325
326uint32_t getvramsizekb(pci_dt_t *ati_dev)
327{
328uint32_tbar[7];
329uint32_tsize;
330volatile uint32_t*regs;
331
332bar[2] = pci_config_read32(ati_dev->dev.addr, 0x18 );
333regs = (uint32_t *) (bar[2] & ~0x0f);
334if (ati_dev->device_id < 0x9400) {
335size = (REG32R(R5XX_CONFIG_MEMSIZE)) >> 10;
336} else {
337size = (REG32R(R6XX_CONFIG_MEMSIZE)) >> 10;
338}
339return size;
340}
341
342#define AVIVO_D1CRTC_CONTROL0x6080
343#define AVIVO_CRTC_EN(1<<0)
344#define AVIVO_D2CRTC_CONTROL0x6880
345
346static bool radeon_card_posted(pci_dt_t *ati_dev)
347{
348// if devid matches biosimage(from legacy) devid - posted card, fails with X2/crossfire cards.
349/*char *biosimage = 0xC0000;
350
351if ((uint8_t)biosimage[0] == 0x55 && (uint8_t)biosimage[1] == 0xaa)
352{
353struct pci_rom_pci_header_t *rom_pci_header;
354rom_pci_header = (struct pci_rom_pci_header_t*)(biosimage + (uint8_t)biosimage[24] + (uint8_t)biosimage[25]*256);
355
356 if (rom_pci_header->signature == 0x52494350)
357{
358 if (rom_pci_header->device == ati_dev->device_id)
359{
360return true;
361printf("Card was POSTed\n");
362}
363}
364}
365return false;
366printf("Card was not POSTed\n");
367*/
368//fails yet
369uint32_tbar[7];
370uint32_tval;
371volatile uint32_t*regs;
372
373bar[2] = pci_config_read32(ati_dev->dev.addr, 0x18);
374regs = (uint32_t *) (bar[2] & ~0x0f);
375
376val = REG32R(AVIVO_D1CRTC_CONTROL) | REG32R(AVIVO_D2CRTC_CONTROL);
377if (val & AVIVO_CRTC_EN) {
378return true;
379} else {
380return false;
381}
382}
383
384static uint32_t load_ati_bios_file(const char *filename, uint8_t *buf, int bufsize)
385{
386intfd;
387intsize;
388
389if ((fd = open_bvdev("bt(0,0)", filename, 0)) < 0) {
390return 0;
391}
392size = file_size(fd);
393if (size > bufsize) {
394printf("Filesize of %s is bigger than expected! Truncating to 0x%x Bytes!\n", filename, bufsize);
395size = bufsize;
396}
397size = read(fd, (char *)buf, size);
398close(fd);
399return size > 0 ? size : 0;
400}
401
402static char *get_ati_model(uint32_t id)
403{
404inti;
405
406for (i=0; i< (sizeof(ATIKnownChipsets) / sizeof(ATIKnownChipsets[0])); i++) {
407if (ATIKnownChipsets[i].device == id) {
408return ATIKnownChipsets[i].name;
409}
410}
411return ATIKnownChipsets[0].name;
412}
413
414static char *get_ati_fb(uint32_t id)
415{
416inti;
417
418for (i=0; i< (sizeof(ATIKnownFramebuffers) / sizeof(ATIKnownFramebuffers[0])); i++) {
419if (ATIKnownFramebuffers[i].device == id) {
420return ATIKnownFramebuffers[i].name;
421}
422}
423return ATIKnownFramebuffers[0].name;
424}
425
426static int devprop_add_iopciconfigspace(struct DevPropDevice *device, pci_dt_t *ati_dev)
427{
428inti;
429uint8_t*config_space;
430
431if (!device || !ati_dev) {
432return 0;
433}
434verbose("dumping pci config space, 256 bytes\n");
435config_space = malloc(256);
436for (i=0; i<=255; i++) {
437config_space[i] = pci_config_read8( ati_dev->dev.addr, i);
438}
439devprop_add_value(device, "ATY,PCIConfigSpace", config_space, 256);
440free (config_space);
441return 1;
442}
443
444static int devprop_add_ati_template_4xxx(struct DevPropDevice *device)
445{
446if(!device)
447return 0;
448
449//if(!DP_ADD_TEMP_VAL(device, ati_compatible_0))
450//return 0;
451//if(!DP_ADD_TEMP_VAL(device, ati_compatible_1))
452//return 0;
453if(!DP_ADD_TEMP_VAL(device, ati_device_type_0))
454return 0;
455if(!DP_ADD_TEMP_VAL(device, ati_device_type_1))
456return 0;
457//if(!DP_ADD_TEMP_VAL(device, ati_device_type))
458//return 0;
459//if(!DP_ADD_TEMP_VAL(device, ati_name_0))
460//return 0;
461//if(!DP_ADD_TEMP_VAL(device, ati_name_1))
462//return 0;
463//if(!DP_ADD_TEMP_VAL(device, ati_name))
464//return 0;
465if(!DP_ADD_TEMP_VAL(device, ati_efidisplay_0))
466return 0;
467if(!DP_ADD_TEMP_VAL(device, ati_display_type_0))
468return 0;
469if(!DP_ADD_TEMP_VAL(device, ati_display_type_1))
470return 0;
471//if(!DP_ADD_TEMP_VAL(device, ati_slot_name))
472//return 0;
473if(!DP_ADD_TEMP_VAL(device, ati_card_no))
474return 0;
475if(!DP_ADD_TEMP_VAL(device, ati_copyright))
476return 0;
477if(!DP_ADD_TEMP_VAL(device, ati_efi_compile_d))
478return 0;
479if(!DP_ADD_TEMP_VAL(device, ati_efi_version))
480return 0;
481if(!DP_ADD_TEMP_VAL(device, ati_efi_versionB))
482return 0;
483if(!DP_ADD_TEMP_VAL(device, ati_efi_versionE))
484return 0;
485if(!DP_ADD_TEMP_VAL(device, ati_mrt))
486return 0;
487if(!DP_ADD_TEMP_VAL(device, ati_romno))
488return 0;
489if(!DP_ADD_TEMP_VAL(device, ati_name_1))
490return 0;
491if(!DP_ADD_TEMP_VAL_DATA(device, ati_connector_type_0))
492return 0;
493if(!DP_ADD_TEMP_VAL_DATA(device, ati_connector_type_1))
494return 0;
495if(!DP_ADD_TEMP_VAL_DATA(device, ati_display_con_fl_type_0))
496return 0;
497if(!DP_ADD_TEMP_VAL_DATA(device, ati_aux_power_conn))
498return 0;
499if(!DP_ADD_TEMP_VAL_DATA(device, ati_backlight_ctrl))
500return 0;
501if(!DP_ADD_TEMP_VAL_DATA(device, ati_aapl01_coher))
502return 0;
503if(!DP_ADD_TEMP_VAL_DATA(device, ati_efi_disp_conf))
504return 0;
505if(!DP_ADD_TEMP_VAL_DATA(device, ati_efi_drv_type))
506return 0;
507if(!DP_ADD_TEMP_VAL_DATA(device, ati_efi_enbl_mode))
508return 0;
509if(!DP_ADD_TEMP_VAL_DATA(device, ati_efi_init_stat))
510return 0;
511if(!DP_ADD_TEMP_VAL_DATA(device, ati_efi_orientation))
512return 0;
513if(!DP_ADD_TEMP_VAL_DATA(device, ati_mclk))
514return 0;
515if(!DP_ADD_TEMP_VAL_DATA(device, ati_mem_rev_id))
516return 0;
517if(!DP_ADD_TEMP_VAL_DATA(device, ati_mem_vend_id))
518return 0;
519if(!DP_ADD_TEMP_VAL_DATA(device, ati_sclk))
520return 0;
521if(!DP_ADD_TEMP_VAL_DATA(device, ati_vendor_id))
522return 0;
523if(!DP_ADD_TEMP_VAL_DATA(device, ati_platform_info))
524return 0;
525if(!DP_ADD_TEMP_VAL_DATA(device, ati_mvad))
526return 0;
527if(!DP_ADD_TEMP_VAL_DATA(device, ati_saved_config))
528return 0;
529return 1;
530}
531
532static int devprop_add_ati_template(struct DevPropDevice *device)
533{
534if(!device)
535return 0;
536
537if(!DP_ADD_TEMP_VAL_DATA(device, ati_platform_info))
538return 0;
539if(!DP_ADD_TEMP_VAL(device, ati_device_type_0))
540return 0;
541if(!DP_ADD_TEMP_VAL(device, ati_device_type_1))
542return 0;
543if(!DP_ADD_TEMP_VAL(device, ati_efidisplay_0_n4))
544return 0;
545//if(!DP_ADD_TEMP_VAL(device, ati_slot_name_n4))
546//return 0;
547if(!DP_ADD_TEMP_VAL(device, ati_card_no))
548return 0;
549if(!DP_ADD_TEMP_VAL(device, ati_copyright))
550return 0;
551if(!DP_ADD_TEMP_VAL(device, ati_efi_compile_d))
552return 0;
553if(!DP_ADD_TEMP_VAL(device, ati_efi_version))
554return 0;
555if(!DP_ADD_TEMP_VAL(device, ati_efi_versionB))
556return 0;
557if(!DP_ADD_TEMP_VAL(device, ati_efi_versionE))
558return 0;
559if(!DP_ADD_TEMP_VAL(device, ati_mrt))
560return 0;
561if(!DP_ADD_TEMP_VAL(device, ati_romno))
562return 0;
563if(!DP_ADD_TEMP_VAL(device, ati_name_1))
564return 0;
565if(!DP_ADD_TEMP_VAL_DATA(device, ati_connector_type_0_n4))
566return 0;
567if(!DP_ADD_TEMP_VAL_DATA(device, ati_connector_type_1_n4))
568return 0;
569if(!DP_ADD_TEMP_VAL_DATA(device, ati_aux_power_conn))
570return 0;
571if(!DP_ADD_TEMP_VAL_DATA(device, ati_backlight_ctrl))
572return 0;
573if(!DP_ADD_TEMP_VAL_DATA(device, ati_aapl01_coher))
574return 0;
575if(!DP_ADD_TEMP_VAL_DATA(device, ati_efi_drv_type))
576return 0;
577if(!DP_ADD_TEMP_VAL_DATA(device, ati_efi_enbl_mode))
578return 0;
579if(!DP_ADD_TEMP_VAL_DATA(device, ati_mem_rev_id))
580return 0;
581if(!DP_ADD_TEMP_VAL_DATA(device, ati_mem_vend_id))
582return 0;
583if(!DP_ADD_TEMP_VAL_DATA(device, ati_vendor_id))
584return 0;
585if(!DP_ADD_TEMP_VAL_DATA(device, ati_aapl_emc_disp_list_n4))
586return 0;
587if(!DP_ADD_TEMP_VAL_DATA(device, ati_fb_offset_n4))
588return 0;
589if(!DP_ADD_TEMP_VAL_DATA(device, ati_hwgpio_n4))
590return 0;
591if(!DP_ADD_TEMP_VAL_DATA(device, ati_iospace_offset_n4))
592return 0;
593if(!DP_ADD_TEMP_VAL_DATA(device, ati_mclk_n4))
594return 0;
595if(!DP_ADD_TEMP_VAL_DATA(device, ati_sclk_n4))
596return 0;
597if(!DP_ADD_TEMP_VAL_DATA(device, ati_refclk_n4))
598return 0;
599if(!DP_ADD_TEMP_VAL_DATA(device, ati_regspace_offset_n4))
600return 0;
601if(!DP_ADD_TEMP_VAL_DATA(device, ati_efi_orientation_n4))
602return 0;
603if(!DP_ADD_TEMP_VAL_DATA(device, ati_aapl_blackscr_prefs_0_n4))
604return 0;
605if(!DP_ADD_TEMP_VAL_DATA(device, ati_aapl_blackscr_prefs_1_n4))
606return 0;
607if(!DP_ADD_TEMP_VAL_DATA(device, ati_swgpio_info_n4))
608return 0;
609if(!DP_ADD_TEMP_VAL_DATA(device, ati_efi_orientation_n4))
610return 0;
611if(!DP_ADD_TEMP_VAL_DATA(device, ati_mvad_n4))
612return 0;
613if(!DP_ADD_TEMP_VAL_DATA(device, ati_saved_config_n4))
614return 0;
615return 1;
616}
617
618
619bool setup_ati_devprop(pci_dt_t *ati_dev)
620{
621struct DevPropDevice*device;
622char*devicepath;
623char*model;
624char*framebuffer;
625chartmp[64];
626uint8_t*rom = NULL;
627uint32_trom_size = 0;
628uint8_t*bios;
629uint32_tbios_size;
630uint32_tvram_size;
631uint32_tboot_display;
632uint8_tcmd;
633booldoit;
634booltoFree;
635
636devicepath = get_pci_dev_path(ati_dev);
637
638cmd = pci_config_read8(ati_dev->dev.addr, 4);
639verbose("old pci command - %x\n", cmd);
640if (cmd == 0) {
641pci_config_write8(ati_dev->dev.addr, 4, 6);
642cmd = pci_config_read8(ati_dev->dev.addr, 4);
643verbose("new pci command - %x\n", cmd);
644}
645
646model = get_ati_model((ati_dev->vendor_id << 16) | ati_dev->device_id);
647framebuffer = get_ati_fb((ati_dev->vendor_id << 16) | ati_dev->device_id);
648if (!string) {
649string = devprop_create_string();
650}
651device = devprop_add_device(string, devicepath);
652if (!device) {
653printf("Failed initializing dev-prop string dev-entry, press any key...\n");
654getc();
655return false;
656}
657
658/* FIXME: for primary graphics card only */
659if (radeon_card_posted(ati_dev)) {
660boot_display = 1;
661} else {
662boot_display = 0;
663}
664verbose("boot display - %x\n", boot_display);
665devprop_add_value(device, "@0,AAPL,boot-display", (uint8_t*)&boot_display, 4);
666
667if((framebuffer[0] == 'M' && framebuffer[1] == 'o' && framebuffer[2] == 't') ||
668 (framebuffer[0] == 'S' && framebuffer[1] == 'h' && framebuffer[2] == 'r') ||
669 (framebuffer[0] == 'P' && framebuffer[1] == 'e' && framebuffer[2] == 'r')) //faster than strcmp ;)
670 devprop_add_ati_template_4xxx(device);
671else {
672devprop_add_ati_template(device);
673vram_size = getvramsizekb(ati_dev) * 1024;
674if ((vram_size > 0x80000000) || (vram_size == 0)) {
675vram_size = 0x10000000;//vram reported wrong, defaulting to 256 mb
676}
677devprop_add_value(device, "VRAM,totalsize", (uint8_t*)&vram_size, 4);
678ati_vram_memsize_0.data[6] = (vram_size >> 16) & 0xFF; //4,5 are 0x00 anyway
679ati_vram_memsize_0.data[7] = (vram_size >> 24) & 0xFF;
680ati_vram_memsize_1.data[6] = (vram_size >> 16) & 0xFF; //4,5 are 0x00 anyway
681ati_vram_memsize_1.data[7] = (vram_size >> 24) & 0xFF;
682DP_ADD_TEMP_VAL_DATA(device, ati_vram_memsize_0);
683DP_ADD_TEMP_VAL_DATA(device, ati_vram_memsize_1);
684devprop_add_iopciconfigspace(device, ati_dev);
685}
686devprop_add_value(device, "model", (uint8_t*)model, (strlen(model) + 1));
687devprop_add_value(device, "ATY,DeviceID", (uint8_t*)&ati_dev->device_id, 2);
688
689//fb setup
690sprintf(tmp, "Slot-%x",devices_number);
691devprop_add_value(device, "AAPL,slot-name", (uint8_t*)tmp, strlen(tmp) + 1);
692devices_number++;
693
694sprintf(tmp, ati_compatible_0[1], framebuffer);
695devprop_add_value(device, (char *) ati_compatible_0[0], (uint8_t *)tmp, strlen(tmp) + 1);
696
697sprintf(tmp, ati_compatible_1[1], framebuffer);
698devprop_add_value(device, (char *) ati_compatible_1[0], (uint8_t *)tmp, strlen(tmp) + 1);
699
700sprintf(tmp, ati_device_type[1], framebuffer);
701devprop_add_value(device, (char *) ati_device_type[0], (uint8_t *)tmp, strlen(tmp) + 1);
702
703sprintf(tmp, ati_name[1], framebuffer);
704devprop_add_value(device, (char *) ati_name[0], (uint8_t *)tmp, strlen(tmp) + 1);
705
706sprintf(tmp, ati_name_0[1], framebuffer);
707devprop_add_value(device, (char *) ati_name_0[0], (uint8_t *)tmp, strlen(tmp) + 1);
708
709sprintf(tmp, ati_name_1[1], framebuffer);
710devprop_add_value(device, (char *) ati_name_1[0], (uint8_t *)tmp, strlen(tmp) + 1);
711
712sprintf(tmp, "/Extra/%04x_%04x.rom", (uint16_t)ati_dev->vendor_id, (uint16_t)ati_dev->device_id);
713if (getBoolForKey(kUseAtiROM, &doit, &bootInfo->bootConfig) && doit) {
714verbose("looking for ati video bios file %s\n", tmp);
715rom = malloc(0x20000);
716rom_size = load_ati_bios_file(tmp, rom, 0x20000);
717if (rom_size > 0) {
718verbose("Using ATI Video BIOS File %s (%d Bytes)\n", tmp, rom_size);
719if (rom_size > 0x10000) {
720rom_size = 0x10000; //we dont need rest anyway;
721}
722} else {
723printf("ERROR: unable to open ATI Video BIOS File %s\n", tmp);
724}
725}
726if (rom_size == 0) {
727if (boot_display) {// no custom rom
728bios = NULL;// try to dump from legacy space, otherwise can result in 100% fan speed
729} else {
730// readAtomBios result in bug on some cards (100% fan speed and black screen),
731// not using it for posted card, reading from legacy space instead
732bios = readAtomBIOS(ati_dev);
733}
734} else {
735bios = rom;//going custom rom way
736verbose("Using rom %s\n", tmp);
737}
738if (bios == NULL) {
739bios = (uint8_t *)0x000C0000;
740toFree = false;
741verbose("Not going to use bios image file\n");
742} else {
743toFree = true;
744}
745
746if (bios[0] == 0x55 && bios[1] == 0xaa) {
747verbose("Found bios image\n");
748bios_size = bios[2] * 512;
749
750struct pci_rom_pci_header_t *rom_pci_header;
751rom_pci_header = (struct pci_rom_pci_header_t*)(bios + bios[24] + bios[25]*256);
752
753if (rom_pci_header->signature == 0x52494350) {
754if (rom_pci_header->device != ati_dev->device_id) {
755verbose("Bios image (%x) doesnt match card (%x), ignoring\n", rom_pci_header->device, ati_dev->device_id);
756} else {
757if (toFree) {
758verbose("Adding binimage to card %x from mmio space with size %x\n", ati_dev->device_id, bios_size);
759} else {
760verbose("Adding binimage to card %x from legacy space with size %x\n", ati_dev->device_id, bios_size);
761}
762devprop_add_value(device, "ATY,bin_image", bios, bios_size);
763}
764} else {
765verbose("Wrong pci header signature %x\n", rom_pci_header->signature);
766}
767} else {
768verbose("Bios image not found at %x, content %x %x\n", bios, bios[0], bios[1]);
769}
770if (toFree) {
771free(bios);
772}
773stringdata = malloc(sizeof(uint8_t) * string->length);
774memcpy(stringdata, (uint8_t*)devprop_generate_string(string), string->length);
775stringlength = string->length;
776
777return true;
778}
779

Archive Download this file

Revision: 400