Chameleon

Chameleon Svn Source Tree

Root/branches/prasys/i386/libsaio/ati.c

  • Property svn:executable set to *
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 "bootstruct.h"
26#include "pci.h"
27#include "platform.h"
28#include "device_inject.h"
29#include "ati.h"
30
31#ifndef DEBUG_ATI
32#define DEBUG_ATI 0
33#endif
34
35#if DEBUG_ATI
36#define DBG(x...)printf(x)
37#else
38#define DBG(x...)
39#endif
40
41#define MAX_NUM_DCB_ENTRIES 16
42
43#define TYPE_GROUPED 0xff
44
45extern uint32_t devices_number;
46
47const char *ati_compatible_0[]={ "@0,compatible","ATY,%s"};
48const char *ati_compatible_1[]={ "@1,compatible","ATY,%s"};
49const char *ati_device_type_0[]={ "@0,device_type","display"};
50const char *ati_device_type_1[]={ "@1,device_type","display"};
51const char *ati_device_type[]={ "device_type","ATY,%sParent"};
52const char *ati_name_0[]={ "@0,name","ATY,%s"};
53const char *ati_name_1[]={ "@1,name","ATY,%s"};
54const char *ati_name[]={ "name","ATY,%sParent"};
55const char *ati_efidisplay_0[]={ "@0,ATY,EFIDisplay","TMDSB"};
56struct ati_data_key ati_connector_type_0={ 0x04, "@0,connector-type", {0x00, 0x04, 0x00, 0x00} };
57struct ati_data_key ati_connector_type_1={ 0x04, "@1,connector-type",{0x04, 0x00, 0x00, 0x00}};
58struct ati_data_key ati_display_con_fl_type_0={ 0x04, "@0,display-connect-flags",{0x00, 0x00, 0x04, 0x00}};
59const char *ati_display_type_0[]={ "@0,display-type","LCD"};
60const char *ati_display_type_1[]={ "@1,display-type","NONE"};
61struct ati_data_key ati_aux_power_conn={ 0x04, "AAPL,aux-power-connected",{0x01, 0x00, 0x00, 0x00}};
62struct ati_data_key ati_backlight_ctrl={ 0x04, "AAPL,backlight-control",{0x00, 0x00, 0x00, 0x00}};
63//const char *ati_slot_name[]={ "AAPL,slot-name","Slot-1"};
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//const char *ati_slot_name_n4[]={ "AAPL,slot-name","Slot-2"};
107
108
109
110
111struct pcir_s {
112uint32_t signature;
113uint16_t vid;
114uint16_t devid;
115};
116
117
118static uint16_t swap16(uint16_t toswap) {
119return (((toswap & 0x00FF) << 8) | ((toswap & 0xFF00) >> 8));
120}
121
122static uint32_t swap32(uint32_t toswap) {
123return ((toswap & 0x000000FF) << 24) |
124((toswap & 0x0000FF00) << 8 ) |
125((toswap & 0x00FF0000) >> 8 ) |
126((toswap & 0xFF000000) >> 24);
127}
128
129// Known cards as of 2008/08/26
130static struct ati_chipsets_t ATIKnownChipsets[] = {
131{ 0x00000000, "Unknown" },
132{ 0x10029589, "ATI Radeon 2600 Series"} ,
133{ 0x10029588, "ATI Radeon 2600 Series"} ,
134{ 0x100294C3, "ATI Radeon 2400 Series"} ,
135{ 0x100294C4, "ATI Radeon 2400 Series"} ,
136{ 0x100294C6, "ATI Radeon 2400 Series"} ,
137{ 0x10029400, "ATI Radeon 2900 Series"} ,
138{ 0x10029405, "ATI Radeon 2900GT Series"} ,
139{ 0x10029581, "ATI Radeon 2600 Series"} ,
140{ 0x10029583, "ATI Radeon 2600 Series"} ,
141{ 0x10029586, "ATI Radeon 2600 Series"} ,
142{ 0x10029587, "ATI Radeon 2600 Series"} ,
143{ 0x100294C9, "ATI Radeon 2400 Series"} ,
144{ 0x10029501, "ATI Radeon 3800 Series"} ,
145{ 0x10029505, "ATI Radeon 3800 Series"} ,
146{ 0x10029515, "ATI Radeon 3800 Series"} ,
147{ 0x10029507, "ATI Radeon 3800 Series"} ,
148{ 0x10029500, "ATI Radeon 3800 Series"} ,
149{ 0x1002950F, "ATI Radeon 3800X2 Series"} ,
150{ 0x100295C5, "ATI Radeon 3400 Series"} ,
151{ 0x100295C7, "ATI Radeon 3400 Series"} ,
152{ 0x100295C0, "ATI Radeon 3400 Series"} ,
153{ 0x10029596, "ATI Radeon 3600 Series"} ,
154{ 0x10029590, "ATI Radeon 3600 Series"} ,
155{ 0x10029599, "ATI Radeon 3600 Series"} ,
156{ 0x10029597, "ATI Radeon 3600 Series"} ,
157{ 0x10029598, "ATI Radeon 3600 Series"} ,
158{ 0x10029442, "ATI Radeon 4850 Series"} ,
159{ 0x10029440, "ATI Radeon 4870 Series"} ,
160{ 0x1002944C, "ATI Radeon 4830 Series"} ,
161{ 0x10029460, "ATI Radeon 4890 Series"} ,
162{ 0x10029462, "ATI Radeon 4890 Series"} ,
163{ 0x10029441, "ATI Radeon 4870X2 Series"} ,
164{ 0x10029443, "ATI Radeon 4850X2 Series"} ,
165{ 0x10029444, "ATI Radeon 4800 Series"} ,
166{ 0x10029446, "ATI Radeon 4800 Series"} ,
167{ 0x1002944E, "ATI Radeon 4730 Series"} ,
168{ 0x10029450, "ATI Radeon 4800 Series"} ,
169{ 0x10029452, "ATI Radeon 4800 Series"} ,
170{ 0x10029456, "ATI Radeon 4800 Series"} ,
171{ 0x1002944A, "ATI Radeon 4800 Mobility Series"} ,
172{ 0x1002945A, "ATI Radeon 4800 Mobility Series"} ,
173{ 0x1002945B, "ATI Radeon 4800 Mobility Series"} ,
174{ 0x1002944B, "ATI Radeon 4800 Mobility Series"} ,
175{ 0x10029490, "ATI Radeon 4670 Series"} ,
176{ 0x10029498, "ATI Radeon 4650 Series"} ,
177{ 0x1002949E, "ATI Radeon 4600 Series"} ,
178{ 0x10029480, "ATI Radeon 4600 Series"} ,
179{ 0x10029488, "ATI Radeon 4600 Series"} ,
180{ 0x10029540, "ATI Radeon 4500 Series"} ,
181{ 0x10029541, "ATI Radeon 4500 Series"} ,
182{ 0x1002954E, "ATI Radeon 4500 Series"} ,
183{ 0x10029552, "ATI Radeon 4300 Mobility Series"} ,
184{ 0x10029553, "ATI Radeon 4500 Mobility Series"} ,
185{ 0x1002954F, "ATI Radeon 4300 Series"},
186{ 0x100294B3, "ATI Radeon 4770 Series"},
187{ 0x100294B5, "ATI Radeon 4770 Series"},
188{ 0x100268B8, "ATI Radeon 5700 Series"},
189{ 0x100268BE, "ATI Radeon 5700 Series"},
190{ 0x10026898, "ATI Radeon 5800 Series"},
191{ 0x10026899, "ATI Radeon 5800 Series"},
192};
193
194static struct ati_chipsets_t ATIKnownFramebuffers[] = {
195{ 0x00000000, "Megalodon" },
196{ 0x10029589, "Lamna"} ,
197{ 0x10029588, "Lamna"} ,
198{ 0x100294C3, "Iago"} ,
199{ 0x100294C4, "Iago"} ,
200{ 0x100294C6, "Iago"} ,
201{ 0x10029400, "Franklin"} ,
202{ 0x10029405, "Franklin"} ,
203{ 0x10029581, "Hypoprion"} ,
204{ 0x10029583, "Hypoprion"} ,
205{ 0x10029586, "Hypoprion"} ,
206{ 0x10029587, "Hypoprion"} ,
207{ 0x100294C9, "Iago"} ,
208{ 0x10029501, "Megalodon"} ,
209{ 0x10029505, "Megalodon"} ,
210{ 0x10029515, "Megalodon"} ,
211{ 0x10029507, "Megalodon"} ,
212{ 0x10029500, "Megalodon"} ,
213{ 0x1002950F, "Triakis"} ,
214{ 0x100295C5, "Iago"} ,
215{ 0x100295C7, "Iago"} ,
216{ 0x100295C0, "Iago"} ,
217{ 0x10029596, "Megalodon"} ,
218{ 0x10029590, "Megalodon"} ,
219{ 0x10029599, "Megalodon"} ,
220{ 0x10029597, "Megalodon"} ,
221{ 0x10029598, "Megalodon"} ,
222{ 0x10029442, "Motmot"} ,
223{ 0x10029440, "Motmot"} ,
224{ 0x1002944C, "Motmot"} ,
225{ 0x10029460, "Motmot"} ,
226{ 0x10029462, "Motmot"} ,
227{ 0x10029441, "Motmot"} ,
228{ 0x10029443, "Motmot"} ,
229{ 0x10029444, "Motmot"} ,
230{ 0x10029446, "Motmot"} ,
231{ 0x1002944E, "Motmot"} ,
232{ 0x10029450, "Motmot"} ,
233{ 0x10029452, "Motmot"} ,
234{ 0x10029456, "Motmot"} ,
235{ 0x1002944A, "Motmot"} ,
236{ 0x1002945A, "Motmot"} ,
237{ 0x1002945B, "Motmot"} ,
238{ 0x1002944B, "Motmot"} ,
239{ 0x10029490, "Peregrine"} ,
240{ 0x10029498, "Peregrine"} ,
241{ 0x1002949E, "Peregrine"} ,
242{ 0x10029480, "Peregrine"} ,
243{ 0x10029488, "Peregrine"} ,
244{ 0x10029540, "Peregrine"} ,
245{ 0x10029541, "Peregrine"} ,
246{ 0x1002954E, "Peregrine"} ,
247{ 0x10029552, "Peregrine"} ,
248{ 0x10029553, "Peregrine"} ,
249{ 0x1002954F, "Peregrine"} ,
250{ 0x100294B3, "Peregrine"},
251{ 0x100294B5, "Peregrine"},
252{ 0x100268B8, "Motmot"},
253{ 0x100268BE, "Motmot"},
254{ 0x10026898, "Motmot"},
255{ 0x10026899, "Motmot"},
256};
257
258unsigned int accessROM(pci_dt_t *ati_dev, unsigned int mode)
259{
260uint32_tbar[7];
261volatile uint8_t *regs;
262
263bar[2] = pci_config_read32(ati_dev->dev.addr, 0x18 );
264regs = (uint8_t *) (bar[2] & ~0x0f);
265
266if(mode)
267{
268if(mode != 1) return 0xe00002c7;
269REG32W(0x179c, 0x00080000);
270REG32W(0x1798, 0x00080721);
271REG32W(0x17a0, 0x00080621);
272REG32W(0x1600, 0x14030300);
273REG32W(0x1798, 0x21);
274REG32W(0x17a0, 0x21);
275REG32W(0x179c, 0x00);
276REG32W(0x17a0, 0x21);
277REG32W(0x1798, 0x21);
278REG32W(0x1798, 0x21);
279} else {
280REG32W(0x1600, 0x14030302);
281REG32W(0x1798, 0x21);
282REG32W(0x17a0, 0x21);
283REG32W(0x179c, 0x00080000);
284REG32W(0x17a0, 0x00080621);
285REG32W(0x1798, 0x00080721);
286REG32W(0x1798, 0x21);
287REG32W(0x17a0, 0x21);
288REG32W(0x179c, 0x00);
289REG32W(0x1604, 0x0400e9fc);
290REG32W(0x161c, 0x00);
291REG32W(0x1620, 0x9f);
292REG32W(0x1618, 0x00040004);
293REG32W(0x161c, 0x00);
294REG32W(0x1604, 0xe9fc);
295REG32W(0x179c, 0x00080000);
296REG32W(0x1798, 0x00080721);
297REG32W(0x17a0, 0x00080621);
298REG32W(0x1798, 0x21);
299REG32W(0x17a0, 0x21);
300REG32W(0x179c, 0x00);
301}
302return 0;
303}
304
305unsigned char * readAtomBIOS(pci_dt_t *ati_dev)
306{
307uint32_tbar[7];
308unsigned int * BIOSBase = NULL;
309unsigned int counter;
310volatile uint8_t *regs;
311
312bar[2] = pci_config_read32(ati_dev->dev.addr, 0x18 );
313regs = (uint8_t *) (bar[2] & ~0x0f);
314accessROM(ati_dev, 0);
315REG32W(0xa8, 0);
316REG32R(0xac);
317REG32W(0xa8, 0);
318REG32R(0xac);
319
320BIOSBase = malloc(0x10000);
321if(BIOSBase)
322{
323REG32W(0xa8, 0);
324BIOSBase[0] = REG32R(0xac);
325counter = 4;
326do
327{
328REG32W(0xa8, counter);
329BIOSBase[counter/4] = REG32R(0xac);
330counter +=4;
331}
332while(counter != 0x10000);
333}
334accessROM(regs, 1);
335
336if ((* (UInt16 *)BIOSBase) != 0xAA55) {
337printf("Wrong BIOS signature: %04x\n", (* (UInt16 *)BIOSBase));
338return 0;
339}
340return (unsigned char *)BIOSBase;
341}
342
343#define R5XX_CONFIG_MEMSIZE 0x00F8
344#define R6XX_CONFIG_MEMSIZE 0x5428
345
346uint32_t getvramsizekb(pci_dt_t *ati_dev)
347{
348uint32_tbar[7];
349volatile uint8_t *regs;
350uint32_tRamSize = 0;
351
352bar[2] = pci_config_read32(ati_dev->dev.addr, 0x18 );
353regs = (uint8_t *) (bar[2] & ~0x0f);
354if (ati_dev->device_id < 0x9400)
355RamSize = (REG32R(R5XX_CONFIG_MEMSIZE)) >> 10;
356else
357RamSize = (REG32R(R6XX_CONFIG_MEMSIZE)) >> 10;
358
359return RamSize;
360}
361
362#define AVIVO_D1CRTC_CONTROL 0x6080
363#define AVIVO_CRTC_EN (1<<0)
364#define AVIVO_D2CRTC_CONTROL 0x6880
365
366bool
367radeon_card_posted(pci_dt_t *ati_dev)
368{
369// if devid matches biosimage(from legacy) devid - posted card, fails with X2/crossfire cards.
370/*char *biosimage = 0xC0000;
371
372if ((uint8_t)biosimage[0] == 0x55 && (uint8_t)biosimage[1] == 0xaa)
373{
374struct pci_rom_pci_header_t *rom_pci_header;
375rom_pci_header = (struct pci_rom_pci_header_t*)(biosimage + (uint8_t)biosimage[24] + (uint8_t)biosimage[25]*256);
376
377 if (rom_pci_header->signature == 0x52494350)
378{
379 if (rom_pci_header->device == ati_dev->device_id)
380{
381return TRUE;
382printf("Card was POSTed\n");
383}
384}
385}
386return FALSE;
387printf("Card was not POSTed\n");
388*/
389 //fails yet
390uint32_tbar[7];
391volatile uint8_t *regs;
392
393bar[2] = pci_config_read32(ati_dev->dev.addr, 0x18 );
394regs = (uint8_t *) (bar[2] & ~0x0f);
395
396 uint32_t val;
397
398val = REG32R(AVIVO_D1CRTC_CONTROL) | REG32R(AVIVO_D2CRTC_CONTROL);
399if (val & AVIVO_CRTC_EN)
400return TRUE;
401
402 return FALSE;
403
404}
405
406uint32_t load_ati_bios_file(char *filename, char *buffer)
407{
408intfd, size;
409chardirspec[128];
410
411// Check Extra on booting partition
412sprintf(dirspec, "/Extra/%s", filename);
413fd = open(dirspec, 0);
414if (fd < 0)
415{
416// Fall back to booter partition
417sprintf(dirspec, "bt(0,0)/Extra/%s", filename);
418fd=open (dirspec, 0);
419if (fd < 0)
420return 0;
421}
422
423size = read(fd, buffer, file_size (fd));
424close (fd);
425return size;
426}
427
428static uint8_t read8(uint8_t *ptr, uint16_t offset) {
429return ptr[offset];
430}
431
432static uint16_t read16(uint8_t *ptr, uint16_t offset) {
433uint8_t ret[2];
434ret[0] = ptr[offset+1];
435ret[1] = ptr[offset];
436return *((uint16_t*)&ret);
437}
438
439static uint32_t read32(uint8_t *ptr, uint16_t offset) {
440uint8_t ret[4];
441ret[0] = ptr[offset+3];
442ret[1] = ptr[offset+2];
443ret[2] = ptr[offset+1];
444ret[3] = ptr[offset];
445return *((uint32_t*)&ret);
446}
447
448
449char *get_ati_model(uint32_t id) {
450int i=0;
451for(i = 0; i < (sizeof(ATIKnownChipsets) / sizeof(ATIKnownChipsets[0])); i++) {
452if(ATIKnownChipsets[i].device == id)
453return ATIKnownChipsets[i].name;
454}
455return ATIKnownChipsets[0].name;
456}
457
458char *get_ati_fb(uint32_t id) {
459int i=0;
460for(i = 0; i < (sizeof(ATIKnownFramebuffers) / sizeof(ATIKnownFramebuffers[0])); i++) {
461if(ATIKnownFramebuffers[i].device == id)
462return ATIKnownFramebuffers[i].name;
463}
464return ATIKnownFramebuffers[0].name;
465}
466int devprop_add_iopciconfigspace(struct DevPropDevice *device, pci_dt_t *ati_dev)
467{
468if(!device)
469return 0;
470if(!ati_dev)
471return 0;
472printf("dumping pci config space, 256 bytes\n");
473int i;
474uint8_t *config_space;
475config_space = malloc(256);
476for(i=0; i<=255; i++)
477config_space[i] = pci_config_read8( ati_dev->dev.addr, i);
478devprop_add_value(device, "ATY,PCIConfigSpace", config_space, 256);
479free(config_space);
480return 1;
481}
482
483int devprop_add_ati_template_4xxx(struct DevPropDevice *device)
484{
485if(!device)
486return 0;
487
488//if(!DP_ADD_TEMP_VAL(device, ati_compatible_0))
489//return 0;
490//if(!DP_ADD_TEMP_VAL(device, ati_compatible_1))
491//return 0;
492if(!DP_ADD_TEMP_VAL(device, ati_device_type_0))
493return 0;
494if(!DP_ADD_TEMP_VAL(device, ati_device_type_1))
495return 0;
496//if(!DP_ADD_TEMP_VAL(device, ati_device_type))
497//return 0;
498//if(!DP_ADD_TEMP_VAL(device, ati_name_0))
499//return 0;
500//if(!DP_ADD_TEMP_VAL(device, ati_name_1))
501//return 0;
502//if(!DP_ADD_TEMP_VAL(device, ati_name))
503//return 0;
504if(!DP_ADD_TEMP_VAL(device, ati_efidisplay_0))
505return 0;
506if(!DP_ADD_TEMP_VAL(device, ati_display_type_0))
507return 0;
508if(!DP_ADD_TEMP_VAL(device, ati_display_type_1))
509return 0;
510//if(!DP_ADD_TEMP_VAL(device, ati_slot_name))
511//return 0;
512if(!DP_ADD_TEMP_VAL(device, ati_card_no))
513return 0;
514if(!DP_ADD_TEMP_VAL(device, ati_copyright))
515return 0;
516if(!DP_ADD_TEMP_VAL(device, ati_efi_compile_d))
517return 0;
518if(!DP_ADD_TEMP_VAL(device, ati_efi_version))
519return 0;
520if(!DP_ADD_TEMP_VAL(device, ati_efi_versionB))
521return 0;
522if(!DP_ADD_TEMP_VAL(device, ati_efi_versionE))
523return 0;
524if(!DP_ADD_TEMP_VAL(device, ati_mrt))
525return 0;
526if(!DP_ADD_TEMP_VAL(device, ati_romno))
527return 0;
528if(!DP_ADD_TEMP_VAL(device, ati_name_1))
529return 0;
530if(!DP_ADD_TEMP_VAL_DATA(device, ati_connector_type_0))
531return 0;
532if(!DP_ADD_TEMP_VAL_DATA(device, ati_connector_type_1))
533return 0;
534if(!DP_ADD_TEMP_VAL_DATA(device, ati_display_con_fl_type_0))
535return 0;
536if(!DP_ADD_TEMP_VAL_DATA(device, ati_aux_power_conn))
537return 0;
538if(!DP_ADD_TEMP_VAL_DATA(device, ati_backlight_ctrl))
539return 0;
540if(!DP_ADD_TEMP_VAL_DATA(device, ati_aapl01_coher))
541return 0;
542if(!DP_ADD_TEMP_VAL_DATA(device, ati_efi_disp_conf))
543return 0;
544if(!DP_ADD_TEMP_VAL_DATA(device, ati_efi_drv_type))
545return 0;
546if(!DP_ADD_TEMP_VAL_DATA(device, ati_efi_enbl_mode))
547return 0;
548if(!DP_ADD_TEMP_VAL_DATA(device, ati_efi_init_stat))
549return 0;
550if(!DP_ADD_TEMP_VAL_DATA(device, ati_efi_orientation))
551return 0;
552if(!DP_ADD_TEMP_VAL_DATA(device, ati_mclk))
553return 0;
554if(!DP_ADD_TEMP_VAL_DATA(device, ati_mem_rev_id))
555return 0;
556if(!DP_ADD_TEMP_VAL_DATA(device, ati_mem_vend_id))
557return 0;
558if(!DP_ADD_TEMP_VAL_DATA(device, ati_sclk))
559return 0;
560if(!DP_ADD_TEMP_VAL_DATA(device, ati_vendor_id))
561return 0;
562if(!DP_ADD_TEMP_VAL_DATA(device, ati_platform_info))
563return 0;
564if(!DP_ADD_TEMP_VAL_DATA(device, ati_mvad))
565return 0;
566if(!DP_ADD_TEMP_VAL_DATA(device, ati_saved_config))
567return 0;
568return 1;
569}
570
571int devprop_add_ati_template(struct DevPropDevice *device)
572{
573if(!device)
574return 0;
575if(!DP_ADD_TEMP_VAL_DATA(device, ati_platform_info))
576return 0;
577if(!DP_ADD_TEMP_VAL(device, ati_device_type_0))
578return 0;
579if(!DP_ADD_TEMP_VAL(device, ati_device_type_1))
580return 0;
581if(!DP_ADD_TEMP_VAL(device, ati_efidisplay_0_n4))
582return 0;
583//if(!DP_ADD_TEMP_VAL(device, ati_slot_name_n4))
584//return 0;
585if(!DP_ADD_TEMP_VAL(device, ati_card_no))
586return 0;
587if(!DP_ADD_TEMP_VAL(device, ati_copyright))
588return 0;
589if(!DP_ADD_TEMP_VAL(device, ati_efi_compile_d))
590return 0;
591if(!DP_ADD_TEMP_VAL(device, ati_efi_version))
592return 0;
593if(!DP_ADD_TEMP_VAL(device, ati_efi_versionB))
594return 0;
595if(!DP_ADD_TEMP_VAL(device, ati_efi_versionE))
596return 0;
597if(!DP_ADD_TEMP_VAL(device, ati_mrt))
598return 0;
599if(!DP_ADD_TEMP_VAL(device, ati_romno))
600return 0;
601if(!DP_ADD_TEMP_VAL(device, ati_name_1))
602return 0;
603if(!DP_ADD_TEMP_VAL_DATA(device, ati_connector_type_0_n4))
604return 0;
605if(!DP_ADD_TEMP_VAL_DATA(device, ati_connector_type_1_n4))
606return 0;
607if(!DP_ADD_TEMP_VAL_DATA(device, ati_aux_power_conn))
608return 0;
609if(!DP_ADD_TEMP_VAL_DATA(device, ati_backlight_ctrl))
610return 0;
611if(!DP_ADD_TEMP_VAL_DATA(device, ati_aapl01_coher))
612return 0;
613if(!DP_ADD_TEMP_VAL_DATA(device, ati_efi_drv_type))
614return 0;
615if(!DP_ADD_TEMP_VAL_DATA(device, ati_efi_enbl_mode))
616return 0;
617if(!DP_ADD_TEMP_VAL_DATA(device, ati_mem_rev_id))
618return 0;
619if(!DP_ADD_TEMP_VAL_DATA(device, ati_mem_vend_id))
620return 0;
621if(!DP_ADD_TEMP_VAL_DATA(device, ati_vendor_id))
622return 0;
623if(!DP_ADD_TEMP_VAL_DATA(device, ati_aapl_emc_disp_list_n4))
624return 0;
625if(!DP_ADD_TEMP_VAL_DATA(device, ati_fb_offset_n4))
626return 0;
627if(!DP_ADD_TEMP_VAL_DATA(device, ati_hwgpio_n4))
628return 0;
629if(!DP_ADD_TEMP_VAL_DATA(device, ati_iospace_offset_n4))
630return 0;
631if(!DP_ADD_TEMP_VAL_DATA(device, ati_mclk_n4))
632return 0;
633if(!DP_ADD_TEMP_VAL_DATA(device, ati_sclk_n4))
634return 0;
635if(!DP_ADD_TEMP_VAL_DATA(device, ati_refclk_n4))
636return 0;
637if(!DP_ADD_TEMP_VAL_DATA(device, ati_regspace_offset_n4))
638return 0;
639if(!DP_ADD_TEMP_VAL_DATA(device, ati_efi_orientation_n4))
640return 0;
641if(!DP_ADD_TEMP_VAL_DATA(device, ati_aapl_blackscr_prefs_0_n4))
642return 0;
643if(!DP_ADD_TEMP_VAL_DATA(device, ati_aapl_blackscr_prefs_1_n4))
644return 0;
645if(!DP_ADD_TEMP_VAL_DATA(device, ati_swgpio_info_n4))
646return 0;
647if(!DP_ADD_TEMP_VAL_DATA(device, ati_efi_orientation_n4))
648return 0;
649if(!DP_ADD_TEMP_VAL_DATA(device, ati_mvad_n4))
650return 0;
651if(!DP_ADD_TEMP_VAL_DATA(device, ati_saved_config_n4))
652return 0;
653return 1;
654}
655
656
657bool setup_ati_devprop(pci_dt_t *ati_dev)
658{
659intlen;
660char*devicepath;
661volatile uint8_t *regs;
662uint32_tbar[7];
663
664char*model;
665char*framebuffer;
666chartmpString[64];
667char*rom=0;
668uint32_trom_size=0;
669char*biosimage = 0;
670uint32_tbiosimage_size = 0;
671uint8_ttoFree = 0;
672char romfilename[32];
673const char *val;
674 int len1;
675uint32_tvram_size=0;
676uint8_tcmd=0;
677
678devicepath = get_pci_dev_path(ati_dev);
679
680cmd = pci_config_read8( ati_dev->dev.addr, 4);
681printf("old pci command - %x\n", cmd);
682if( cmd == 0) {
683 pci_config_write8(ati_dev->dev.addr, 4, 6);
684 cmd = pci_config_read8( ati_dev->dev.addr, 4);
685 printf("new pci command - %x\n", cmd);
686};
687
688model = get_ati_model((ati_dev->vendor_id << 16) | ati_dev->device_id);
689
690framebuffer = get_ati_fb((ati_dev->vendor_id << 16) | ati_dev->device_id);
691if (!string)
692string = devprop_create_string();
693
694struct DevPropDevice *device = malloc(sizeof(struct DevPropDevice));
695device = devprop_add_device(string, devicepath);
696
697if(!device)
698{
699printf("Failed initializing dev-prop string dev-entry, press any key...\n");
700getc();
701return false;
702}
703
704/* FIXME: for primary graphics card only */
705uint32_t boot_display = 0x00000001;
706if(radeon_card_posted(ati_dev)) boot_display=0x01;
707else boot_display=0x00;
708printf("boot display - %x\n", boot_display);
709devprop_add_value(device, "@0,AAPL,boot-display", (uint8_t*)&boot_display, 4);
710
711if((framebuffer[0] == 'M' && framebuffer[1] == 'o' && framebuffer[2] == 't') || (framebuffer[0] == 'S' && framebuffer[1] == 'h' && framebuffer[2] == 'r') || (framebuffer[0] == 'P' && framebuffer[1] == 'e' && framebuffer[2] == 'r')) //faster than strcmp ;)
712devprop_add_ati_template_4xxx(device);
713else
714{
715devprop_add_ati_template(device);
716vram_size = getvramsizekb(ati_dev) * 1024;
717if ((vram_size > 0x80000000) || (vram_size == 0)) vram_size = 0x10000000; //vram reported wrong, defaulting to 256 mb
718devprop_add_value(device, "VRAM,totalsize", (uint8_t*)&vram_size, 4);
719ati_vram_memsize_0.data[6] = (vram_size >> 16) & 0xFF; //4,5 are 0x00 anyway
720ati_vram_memsize_0.data[7] = (vram_size >> 24) & 0xFF;
721ati_vram_memsize_1.data[6] = (vram_size >> 16) & 0xFF; //4,5 are 0x00 anyway
722ati_vram_memsize_1.data[7] = (vram_size >> 24) & 0xFF;
723DP_ADD_TEMP_VAL_DATA(device, ati_vram_memsize_0);
724DP_ADD_TEMP_VAL_DATA(device, ati_vram_memsize_1);
725devprop_add_iopciconfigspace(device, ati_dev);
726}
727devprop_add_value(device, "model", (uint8_t*)model, (strlen(model) + 1));
728devprop_add_value(device, "ATY,DeviceID", (uint8_t*)&ati_dev->device_id, 2);
729//fb setup
730
731char tmp[10];
732
733sprintf(tmp, "Slot-%x",devices_number);
734devprop_add_value(device, "AAPL,slot-name", tmp, strlen(tmp));
735devices_number++;
736
737sprintf(tmpString, ati_compatible_0[1], framebuffer);
738devprop_add_value(device, (char *) ati_compatible_0[0], (uint8_t *)tmpString, strlen(tmpString)+1);
739
740sprintf(tmpString, ati_compatible_1[1], framebuffer);
741devprop_add_value(device, (char *) ati_compatible_1[0], (uint8_t *)tmpString, strlen(tmpString)+1);
742
743sprintf(tmpString, ati_device_type[1], framebuffer);
744devprop_add_value(device, (char *) ati_device_type[0], (uint8_t *)tmpString, strlen(tmpString)+1);
745
746sprintf(tmpString, ati_name[1], framebuffer);
747devprop_add_value(device, (char *) ati_name[0], (uint8_t *)tmpString, strlen(tmpString)+1);
748
749sprintf(tmpString, ati_name_0[1], framebuffer);
750devprop_add_value(device, (char *) ati_name_0[0], (uint8_t *)tmpString, strlen(tmpString)+1);
751
752sprintf(tmpString, ati_name_1[1], framebuffer);
753devprop_add_value(device, (char *) ati_name_1[0], (uint8_t *)tmpString, strlen(tmpString)+1);
754//code for loading bios from file, in form - rom_devid_vendif.rom
755if (getValueForKey("-useatirom", &val, &len1, &bootInfo->bootConfig))
756{
757sprintf(romfilename, "ati_%04x_%04x.rom", (uint16_t)ati_dev->device_id, (uint16_t)ati_dev->vendor_id);
758printf("looking for file /Extra/%s\n", romfilename);
759rom = malloc(0x20000);
760rom_size = load_ati_bios_file((char *)romfilename, (char *)rom);
761if(rom_size > 0x10000) rom_size = 0x10000; //we dont need rest anyway;
762if(rom_size == 0) printf("file not found\n");
763};
764{
765if(rom_size == 0)
766{
767if(boot_display) // no custom rom
768biosimage = 0; //try to dump from legacy space, otherwise can result in 100% fan speed
769else
770biosimage = readAtomBIOS(ati_dev); //readAtomBios result in bug on some cards (100% fan speed and black screen),
771 //not using it for posted card, rading from legacy space instead
772} else {
773biosimage = rom; //going custom rom way
774printf("Using rom %s\n", romfilename);
775}
776if(biosimage == 0)
777{
778biosimage = 0xC0000;
779toFree = 0;
780printf("Not going to use bios image file\n");
781} else toFree = 1;
782
783if ((uint8_t)biosimage[0] == 0x55 && (uint8_t)biosimage[1] == 0xaa)
784{
785printf("Found bios image\n");
786biosimage_size = (uint8_t)biosimage[2] * 512;
787
788struct pci_rom_pci_header_t *rom_pci_header;
789rom_pci_header = (struct pci_rom_pci_header_t*)(biosimage + (uint8_t)biosimage[24] + (uint8_t)biosimage[25]*256);
790
791 if (rom_pci_header->signature == 0x52494350)
792{
793 if (rom_pci_header->device != ati_dev->device_id)
794{
795printf("Bios image (%x) doesnt match card (%x), ignoring\n", rom_pci_header->device, ati_dev->device_id);
796} else {
797if(toFree)
798printf("Adding binimage to card %x from mmio space with size %x\n", ati_dev->device_id, biosimage_size);
799else
800printf("Adding binimage to card %x from legacy space with size %x\n", ati_dev->device_id, biosimage_size);
801devprop_add_value(device, "ATY,bin_image", (uint8_t*) biosimage, biosimage_size);
802}
803} else printf("Wrong pci header signature %x\n", rom_pci_header->signature);
804
805} else printf("Bios image not found at %x, content %x %x\n", biosimage, (uint8_t)biosimage[0], (uint8_t)biosimage[1]);
806if(toFree) free(biosimage);
807}
808stringdata = malloc(sizeof(uint8_t) * string->length);
809if(!stringdata)
810{
811printf("no stringdata press a key...\n");
812getc();
813return false;
814}
815
816memcpy(stringdata, (uint8_t*)devprop_generate_string(string), string->length);
817stringlength = string->length;
818
819return true;
820}
821

Archive Download this file

Revision: 65