Chameleon Applications

Chameleon Applications Svn Source Tree

Root/branches/iFabio/Chameleon/i386/modules/ATiGraphicsEnabler/ati.c

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

Archive Download this file

Revision: 307