Chameleon

Chameleon Svn Source Tree

Root/branches/meklortOld/i386/modules/GraphicsEnabler/ati.c

Source at commit 1166 created 13 years 10 days ago.
By meklort, Fixed recent Makefile changes. Please do not use /Users/evan/SourceCode/tmp/chameleon/trunk or VPATH. the *only* time you should use /Users/evan/SourceCode/tmp/chameleon/trunk is when setting the SRCROOT variable. Also note that very soon make pkg is going to be removed. The pkg build script in trunk is very out of date. Instead please use the package maker at http://forge.voodooprojects.org/p/chameleonApplications/. Once this is ready for trunk it will be merged.
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
46const char *ati_compatible_0[]= { "@0,compatible", "ATY,%s" };
47const char *ati_compatible_1[]= { "@1,compatible", "ATY,%s" };
48const char *ati_device_type_0[]= { "@0,device_type", "display" };
49const char *ati_device_type_1[]= { "@1,device_type", "display" };
50const char *ati_device_type[]= { "device_type", "ATY,%sParent" };
51const char *ati_name_0[]= { "@0,name", "ATY,%s" };
52const char *ati_name_1[]= { "@1,name", "ATY,%s" };
53const char *ati_name[]= { "name", "ATY,%sParent" };
54const char *ati_efidisplay_0[]= { "@0,ATY,EFIDisplay", "TMDSB" };
55struct ati_data_key ati_connector_type_0= { 0x04, "@0,connector-type", {0x00, 0x04, 0x00, 0x00} };
56struct ati_data_key ati_connector_type_1= { 0x04, "@1,connector-type", {0x04, 0x00, 0x00, 0x00} };
57struct ati_data_key ati_display_con_fl_type_0= { 0x04, "@0,display-connect-flags", {0x00, 0x00, 0x04, 0x00} };
58const char *ati_display_type_0[]= { "@0,display-type", "LCD" };
59const char *ati_display_type_1[]= { "@1,display-type", "NONE" };
60struct ati_data_key ati_aux_power_conn= { 0x04, "AAPL,aux-power-connected", {0x01, 0x00, 0x00, 0x00} };
61struct ati_data_key ati_backlight_ctrl= { 0x04, "AAPL,backlight-control", {0x00, 0x00, 0x00, 0x00} };
62struct ati_data_key ati_aapl01_coher= { 0x04, "AAPL01,Coherency", {0x01, 0x00, 0x00, 0x00} };
63const char *ati_card_no[]= { "ATY,Card#", "109-B77101-00" };
64const char *ati_copyright[]= { "ATY,Copyright", "Copyright AMD Inc. All Rights Reserved. 2005-2009" };
65const char *ati_efi_compile_d[]= { "ATY,EFICompileDate", "Jan 26 2009" };
66struct ati_data_key ati_efi_disp_conf= { 0x08, "ATY,EFIDispConfig", {0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01} };
67struct ati_data_key ati_efi_drv_type= { 0x01, "ATY,EFIDriverType", {0x02} };
68struct ati_data_key ati_efi_enbl_mode= { 0x01, "ATY,EFIEnabledMode", {0x01} };
69struct ati_data_key ati_efi_init_stat= { 0x04, "ATY,EFIHWInitStatus", {0x00, 0x00, 0x00, 0x00} };
70struct ati_data_key ati_efi_orientation= { 0x02, "ATY,EFIOrientation", {0x02, 0x00} };
71const char *ati_efi_version[]= { "ATY,EFIVersion", "01.00.318" };
72const char *ati_efi_versionB[]= { "ATY,EFIVersionB", "113-SBSJ1G04-00R-02" };
73const char *ati_efi_versionE[]= { "ATY,EFIVersionE", "113-B7710A-318" };
74struct ati_data_key ati_mclk= { 0x04, "ATY,MCLK", {0x70, 0x2e, 0x11, 0x00} };
75struct ati_data_key ati_mem_rev_id= { 0x02, "ATY,MemRevisionID", {0x03, 0x00} };
76struct ati_data_key ati_mem_vend_id= { 0x02, "ATY,MemVendorID", {0x02, 0x00} };
77const char *ati_mrt[]= { "ATY,MRT", " " };
78const char *ati_romno[]= { "ATY,Rom#", "113-B7710C-176" };
79struct ati_data_key ati_sclk= { 0x04, "ATY,SCLK", {0x28, 0xdb, 0x0b, 0x00} };
80struct ati_data_key ati_vendor_id= { 0x02, "ATY,VendorID", {0x02, 0x10} };
81struct 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} };
82struct 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} };
83struct 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} };
84///non 48xx keys
85const char *ati_efidisplay_0_n4[]= { "@0,ATY,EFIDisplay", "TMDSA" };
86struct ati_data_key ati_connector_type_0_n4= { 0x04, "@0,connector-type", {0x04, 0x00, 0x00, 0x00} };
87struct ati_data_key ati_connector_type_1_n4= { 0x04, "@1,connector-type", {0x00, 0x02, 0x00, 0x00} };
88struct 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} };
89struct ati_data_key ati_fb_offset_n4= { 0x08, "ATY,FrameBufferOffset", {0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00} };
90struct ati_data_key ati_hwgpio_n4= { 0x04, "ATY,HWGPIO", {0x23, 0xa8, 0x48, 0x00} };
91struct ati_data_key ati_iospace_offset_n4= { 0x08, "ATY,IOSpaceOffset", {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00} };
92struct ati_data_key ati_mclk_n4= { 0x04, "ATY,MCLK", {0x00, 0x35, 0x0c, 0x00} };
93struct ati_data_key ati_sclk_n4= { 0x04, "ATY,SCLK", {0x60, 0xae, 0x0a, 0x00} };
94struct ati_data_key ati_refclk_n4= { 0x04, "ATY,RefCLK", {0x8c, 0x0a, 0x00, 0x00} };
95struct ati_data_key ati_regspace_offset_n4= { 0x08, "ATY,RegisterSpaceOffset", {0x00, 0x00, 0x00, 0x00, 0x90, 0xa2, 0x00, 0x00} };
96struct ati_data_key ati_vram_memsize_0= { 0x08, "@0,VRAM,memsize", {0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00} };
97struct ati_data_key ati_vram_memsize_1= { 0x08, "@1,VRAM,memsize", {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} };
98struct ati_data_key ati_aapl_blackscr_prefs_0_n4= { 0x04, "AAPL00,blackscreen-preferences", {0x00, 0x00, 0x00, 0x00} };
99struct ati_data_key ati_aapl_blackscr_prefs_1_n4= { 0x04, "AAPL01,blackscreen-preferences", {0x00, 0x00, 0x00, 0x00} };
100struct ati_data_key ati_swgpio_info_n4= { 0x04, "ATY,SWGPIO Info", {0x00, 0x48, 0xa8, 0x23} };
101struct ati_data_key ati_efi_orientation_n4= { 0x01, "ATY,EFIOrientation", {0x08} };
102struct 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} };
103struct 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} };
104
105struct pcir_s {
106uint32_t signature;
107uint16_t vid;
108uint16_t devid;
109};
110
111// Known cards as of 2008/08/26
112struct ati_chipsets_t ATIKnownChipsets[] = {
113{ 0x00000000, "Unknown" } ,
114{ 0x10029589, "ATI Radeon 2600 Series"} ,
115{ 0x10029588, "ATI Radeon 2600 Series"} ,
116{ 0x100294C3, "ATI Radeon 2400 Series"} ,
117{ 0x100294C4, "ATI Radeon 2400 Series"} ,
118{ 0x100294C6, "ATI Radeon 2400 Series"} ,
119{ 0x10029400, "ATI Radeon 2900 Series"} ,
120{ 0x10029405, "ATI Radeon 2900GT Series"} ,
121{ 0x10029581, "ATI Radeon 2600 Series"} ,
122{ 0x10029583, "ATI Radeon 2600 Series"} ,
123{ 0x10029586, "ATI Radeon 2600 Series"} ,
124{ 0x10029587, "ATI Radeon 2600 Series"} ,
125{ 0x100294C9, "ATI Radeon 2400 Series"} ,
126{ 0x10029501, "ATI Radeon 3800 Series"} ,
127{ 0x10029505, "ATI Radeon 3800 Series"} ,
128{ 0x10029515, "ATI Radeon 3800 Series"} ,
129{ 0x10029507, "ATI Radeon 3800 Series"} ,
130{ 0x10029500, "ATI Radeon 3800 Series"} ,
131{ 0x1002950F, "ATI Radeon 3800X2 Series"} ,
132{ 0x100295C5, "ATI Radeon 3400 Series"} ,
133{ 0x100295C7, "ATI Radeon 3400 Series"} ,
134{ 0x100295C0, "ATI Radeon 3400 Series"} ,
135{ 0x10029596, "ATI Radeon 3600 Series"} ,
136{ 0x10029590, "ATI Radeon 3600 Series"} ,
137{ 0x10029599, "ATI Radeon 3600 Series"} ,
138{ 0x10029597, "ATI Radeon 3600 Series"} ,
139{ 0x10029598, "ATI Radeon 3600 Series"} ,
140{ 0x10029442, "ATI Radeon 4850 Series"} ,
141{ 0x10029440, "ATI Radeon 4870 Series"} ,
142{ 0x1002944C, "ATI Radeon 4830 Series"} ,
143{ 0x10029460, "ATI Radeon 4890 Series"} ,
144{ 0x10029462, "ATI Radeon 4890 Series"} ,
145{ 0x10029441, "ATI Radeon 4870X2 Series"} ,
146{ 0x10029443, "ATI Radeon 4850X2 Series"} ,
147{ 0x10029444, "ATI Radeon 4800 Series"} ,
148{ 0x10029446, "ATI Radeon 4800 Series"} ,
149{ 0x1002944E, "ATI Radeon 4730 Series"} ,
150{ 0x10029450, "ATI Radeon 4800 Series"} ,
151{ 0x10029452, "ATI Radeon 4800 Series"} ,
152{ 0x10029456, "ATI Radeon 4800 Series"} ,
153{ 0x1002944A, "ATI Radeon 4800 Mobility Series"} ,
154{ 0x1002945A, "ATI Radeon 4800 Mobility Series"} ,
155{ 0x1002945B, "ATI Radeon 4800 Mobility Series"} ,
156{ 0x1002944B, "ATI Radeon 4800 Mobility Series"} ,
157{ 0x10029490, "ATI Radeon 4670 Series"} ,
158{ 0x10029498, "ATI Radeon 4650 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
178struct 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
351 if ((uint8_t)biosimage[0] == 0x55 && (uint8_t)biosimage[1] == 0xaa)
352 {
353 struct pci_rom_pci_header_t *rom_pci_header;
354 rom_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 {
360 return true;
361 printf("Card was POSTed\n");
362 }
363 }
364 }
365 return false;
366 printf("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}
434printf("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 ;)
670devprop_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, rading 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) {
747printf("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: 1166