Jump to content

Editing personalities in older ATI Framebuffers (Iago & friends)


0xdeadbeef
 Share

7 posts in this topic

Recommended Posts

Thanks to great work by bcc9, mucha, dong and everyone else, things are moving with regard to the newer ati framebuffers. I was wondering if there is anyone out there with older cards like me (HD Mobility 2400) that might be interested in trying to get the older framebuffers working with this new information.

 

The newer cards have the transmitter and encoder as separate units, but in the older cards these are one unit.

 

here is the personality table from Iago:

 

02 00 00 00 40 00 00 00  09 00 00 00 00 01 01 12
00 10 00 00 16 00 00 00  C4 00 00 00 10 00 02 11

 

This corresponds with the dumps from an iMac 2400XT vbios:

 

dump from bcc9's tool:

 

ATOM BIOS Rom: 
SubsystemVendorID: 0x106b SubsystemID: 0x0084
IOBaseAddress: 0x0000
Filename: 13B22505.011
BIOS Bootup Message: 

113-B22505-011 M74 GDDR3_16Mx32 64bit 128MB 650e/800m					   


PCI ID: 1002:94c8
Connector at index 0
Type [@offset 44716]: DVI-I (2)
Encoder [@offset 44720]: INTERNAL_KLDSCP_DAC1 (0x15)
i2cid [@offset 44782]: 0x90, OSX senseid: 0x1
Connector at index 1
Type [@offset 44726]: DVI-I (2)
Encoder [@offset 44730]: INTERNAL_KLDSCP_TMDS1 (0x13)
i2cid [@offset 44782]: 0x90, OSX senseid: 0x1
Connector at index 2
Type [@offset 44736]: LVDS (7)
Encoder [@offset 44740]: INTERNAL_LVTM1 (0xf)
i2cid [@offset 44825]: 0x91, OSX senseid: 0x2
Connector at index 3
Type [@offset 44746]: DVI-I (2)
Encoder [@offset 44750]: INTERNAL_KLDSCP_DAC2 (0x16)

 

and from redsock_bios_decoder:

 

 

13B22505.011:


113-B22505-011 M74 GDDR3_16Mx32 64bit 128MB 650e/800m					   


Subsystem Vendor ID: 106b
   Subsystem ID: 84
Object Header Structure Size: 208
Connector Object Table Offset: 3c
Router Object Table Offset: 0
Encoder Object Table Offset: 94
Display Path Table Offset: 10
Connector Object Id [1] which is [DVI_I]
encoder obj id [0x15] which is [INTERNAL_KLDSCP_DAC1 (osx txmit 0x00 enc 0x10?)] linkb: false
Connector Object Id [1] which is [DVI_I]
encoder obj id [0x13] which is [INTERNAL_KLDSCP_TMDS1] linkb: false
Connector Object Id [14] which is [LVDS]
encoder obj id [0xf] which is [INTERNAL_LVTM1] linkb: false
Connector Object Id [1] which is [DVI_I]
encoder obj id [0x16] which is [INTERNAL_KLDSCP_DAC2] linkb: false

 

 

And here are the dumps from my 2400 mobility

 

bcc9:

 

ATOM BIOS Rom: 
SubsystemVendorID: 0x1179 SubsystemID: 0xff00
IOBaseAddress: 0x0000
Filename: BR26685.BIN 
BIOS Bootup Message: 

Minnesota M72M GDDR2 128/256M 400m/450e									 


PCI ID: 1002:94c9
Connector at index 0
Type [@offset 44480]: VGA (1)
Encoder [@offset 44484]: INTERNAL_KLDSCP_DAC1 (0x15)
i2cid [@offset 44560]: 0x90, OSX senseid: 0x1
Connector at index 1
Type [@offset 44490]: HDMI-A (11)
Encoder [@offset 44494]: INTERNAL_KLDSCP_TMDS1 (0x13)
i2cid [@offset 44583]: 0x91, OSX senseid: 0x2
Connector at index 2
Type [@offset 44500]: 9 pin DIN (9)
Encoder [@offset 44504]: INTERNAL_KLDSCP_DAC2 (0x16)
Connector at index 3
Type [@offset 44510]: LVDS (7)
Encoder [@offset 44514]: INTERNAL_LVTM1 (0xf)
i2cid [@offset 44637]: 0x14, OSX senseid: 0x5

 

 

and radeon_bios_dump:

 

 

BR26685.BIN :


Minnesota M72M GDDR2 128/256M 400m/450e									 


Subsystem Vendor ID: 1179
   Subsystem ID: ff00
Object Header Structure Size: 256
Connector Object Table Offset: 3c
Router Object Table Offset: 0
Encoder Object Table Offset: c4
Display Path Table Offset: 10
Connector Object Id [5] which is [VGA]
encoder obj id [0x15] which is [INTERNAL_KLDSCP_DAC1 (osx txmit 0x00 enc 0x10?)] linkb: false
Connector Object Id [12] which is [HDMI_TYPE_A]
encoder obj id [0x13] which is [INTERNAL_KLDSCP_TMDS1] linkb: false
Connector Object Id [15] which is [DIN]
encoder obj id [0x16] which is [INTERNAL_KLDSCP_DAC2] linkb: false
Connector Object Id [14] which is [LVDS]
encoder obj id [0xf] which is [INTERNAL_LVTM1] linkb: false

 

 

And RadeonDump output for my card (internal only connected):

 

[RadeonHD]: rhdAtomConnectorInfo
[RadeonHD]: rhdAtomConnectorInfoFromObjectHeader
[RadeonHD]: ObjectTable - size: 252, BIOS - size: 65536 TableOffset: 60 object_header_end: 312
[RadeonHD]: Object: ID: 3105 name: VGA type: 3 id: 5
[RadeonHD]: rhdAtomGetConnectorID
[RadeonHD]:  * SrcObject: ID: 2115 name: INTERNAL_KLDSCP_DAC1 enum: 1
[RadeonHD]:  - Record Type: 1
[RadeonHD]:	rhdAtomDDCFromI2CRecord:  I2C Record: HW_Line[0] EngineID: 1 I2CAddr: 0
[RadeonHD]: rhdAtomGetDDCIndex
[RadeonHD]:  Found DDC GPIO Index: 0
[RadeonHD]:  - Record Type: 4
[RadeonHD]: rhdAtomDeviceTagsFromRecord
[RadeonHD]:	NumberOfDevice: 1
[RadeonHD]:	Devices: CRT1
[RadeonHD]: Object: ID: 310c name: HDMI_TYPE_A type: 3 id: c
[RadeonHD]: rhdAtomGetConnectorID
[RadeonHD]:  * SrcObject: ID: 2113 name: INTERNAL_KLDSCP_TMDS1 enum: 1
[RadeonHD]:  - Record Type: 1
[RadeonHD]:	rhdAtomDDCFromI2CRecord:  I2C Record: HW_Line[1] EngineID: 1 I2CAddr: 0
[RadeonHD]: rhdAtomGetDDCIndex
[RadeonHD]:  Found DDC GPIO Index: 1
[RadeonHD]:  - Record Type: 2
[RadeonHD]:	rhdAtomHPDFromRecord:  HPD Record: GPIO ID: 6 Plugged_PinState: 0
[RadeonHD]: rhdAtomParseGPIOLutForHPD
[RadeonHD]:	rhdAtomParseGPIOLutForHPD: GPIO PinID: 6 Index: 1fa5 Shift: 0
[RadeonHD]:  - Record Type: 4
[RadeonHD]: rhdAtomDeviceTagsFromRecord
[RadeonHD]:	NumberOfDevice: 1
[RadeonHD]:	Devices: DFP1
[RadeonHD]: Object: ID: 310f name: 7PIN_DIN type: 3 id: f
[RadeonHD]: rhdAtomGetConnectorID
[RadeonHD]:  * SrcObject: ID: 2116 name: INTERNAL_KLDSCP_DAC2 enum: 1
[RadeonHD]:  - Record Type: 4
[RadeonHD]: rhdAtomDeviceTagsFromRecord
[RadeonHD]:	NumberOfDevice: 2
[RadeonHD]:	Devices: TV1 CV
[RadeonHD]: Object: ID: 310e name: LVDS type: 3 id: e
[RadeonHD]: rhdAtomGetConnectorID
[RadeonHD]:  * SrcObject: ID: 210f name: INTERNAL_LVTM1 enum: 1
[RadeonHD]:  - Record Type: 1
[RadeonHD]:	rhdAtomDDCFromI2CRecord:  I2C Record: GPIO_ID[4] EngineID: 1 I2CAddr: 0
[RadeonHD]: rhdAtomGetDDCIndex
[RadeonHD]:  Found DDC GPIO Index: 4
[RadeonHD]:  - Record Type: 4
[RadeonHD]: rhdAtomDeviceTagsFromRecord
[RadeonHD]:	NumberOfDevice: 1
[RadeonHD]:	Devices: LCD1
[RadeonHD]: Connector[0] {RHD_CONNECTOR_VGA, "VGA CRT1", RHD_DDC_0, RHD_HPD_NONE, { RHD_OUTPUT_DACA, RHD_OUTPUT_NONE } }
[RadeonHD]: Connector[1] {RHD_CONNECTOR_DVI_SINGLE, "HDMI_TYPE_A DFP1", RHD_DDC_1, RHD_HPD_0, { RHD_OUTPUT_TMDSA, RHD_OUTPUT_NONE } }
[RadeonHD]: Connector[2] {RHD_CONNECTOR_TV, "7PIN_DIN TV1 CV", RHD_DDC_NONE, RHD_HPD_NONE, { RHD_OUTPUT_DACB, RHD_OUTPUT_NONE } }
[RadeonHD]: Connector[3] {RHD_CONNECTOR_PANEL, "LVDS LCD1", RHD_DDC_4, RHD_HPD_NONE, { RHD_OUTPUT_LVTMA, RHD_OUTPUT_NONE } }
[RadeonHD]: Call to AtomBIOS Get Connectors succeeded
[RadeonHD]: RHDHPDSave
[RadeonHD]: RHDHPDSet
[RadeonHD]: RHDConnectorsInit: 0 (VGA CRT1) type 1, ddc 0, hpd 0
[RadeonHD]: RHDI2CFunc
[RadeonHD]: RHDDACAInit
[RadeonHD]: RHDOutputAdd
[RadeonHD]: Attaching Output DAC A to Connector VGA 1
[RadeonHD]: RHDConnectorsInit: 1 (HDMI_TYPE_A DFP1) type 3, ddc 1, hpd 1
[RadeonHD]: RHDI2CFunc
[RadeonHD]: RHDTMDSAInit
[RadeonHD]: RHDHdmiInit
[RadeonHD]: RHDOutputAdd
[RadeonHD]: Attaching Output TMDS A to Connector DVI-D 1
[RadeonHD]: RHDConnectorsInit: 2 (7PIN_DIN TV1 CV) type 5, ddc 255, hpd 0
[RadeonHD]: RHDDACBInit
[RadeonHD]: RHDOutputAdd
[RadeonHD]: Attaching Output DAC B to Connector TV 7PIN_DIN
[RadeonHD]: RHDConnectorsInit: 3 (LVDS LCD1) type 4, ddc 4, hpd 0
[RadeonHD]: RHDI2CFunc
[RadeonHD]: RHDLVTMAInit
[RadeonHD]: RHDAtomBiosFunc
[RadeonHD]: rhdAtomLvdsInfoQuery
.....

Listing modesetting layout:
[RadeonHD]: CRTC 1: tied to PLL 1 and LUT A:
[RadeonHD]: 	Outputs: LVDS (PANEL)[RadeonHD]: 
[RadeonHD]: CRTC 2: unused
[RadeonHD]: 	Unused Outputs: DAC A[RadeonHD]: , TMDS A[RadeonHD]: , DAC B[RadeonHD]: 
[RadeonHD]: RHDModesPoolCreate
[RadeonHD]: rhdCreateModesListAndValidate
[RadeonHD]: Validating Modes from Monitor "LVDS Panel" on "PANEL"

 

 

 

I have tried many different combinations of sense_id and encoder id without success, but the i2cid and sense from my own vbios appears to be weird with regard to the iMac one, as if it is obtained by a different method.

If anyone else is prepared to help investigate this further, I'd like to hear your results, if any.

 

One more thing: I'm not sure if having a dual-link 1440x900 lvds panel has some bearing on this: any thoughts?

Link to comment
Share on other sites

Misha Vakulich's HD 4650m works with 1600x900 (QE/CI). Check this.

 

 

Thanks crazybirdy - yes the dual-link dsdt edit is next on my agenda. In all the patching and messing around with Iago and Wormy framebuffers over the years, I've never managed to actually get the panel detected at all. My guess is the newer personalities are pretty much useless for these older cards because of the old cards' hard-coded transmitter/encoder layout. But you never know if you'll get lucky.

Link to comment
Share on other sites

  • 2 weeks later...

Mobility HD2400 10.6.7

 

Well now, no luck with getting the sense to detect my internal LCD at all,

so I have abandoned personality editing for the moment.

 

BUT! First the good news: I managed to get my internal to switch on at full resolution using Iago at last!

 

Here's how: Using ATY_Init and 10.6.7 kexts

 

Add your EDID to key AAPL00,override-no-connect ( This causes the framebuffer to completely ignore the first entry in the connector table)

 

@0,override-no-connect will NOT work.

 

My colours were all messed up, setting @0,display-link-component-bits to 6 fixed this.

 

Now the bad news: I'm still getting a random black flicker every 1/2 to 1 second: playing with inverter and backlight settings

doesn't seem to have any effect,and X2000 gives me a white screen with a mangled square cursor.

 

Wonder if the flicker is due to AppleDisplay being loaded instead of AppleBacklightDisplay, or a PM prob, or if I need some

more injector values like display-power-sequence, etc.

 

Any ideas?

Link to comment
Share on other sites

Ok doesn't look like anyone is paying attention, but I'll write this here for the record anyway :D

 

 

The DDC sense for ATIFramebuffer is proxied through the ATIXXXXContoller - when the connector

info is read from the table, the sense id is sent off to DDCProxy with a pointer to the card controller.

 

To find a list of possible sense id's for your card, look in your controller kext for function:

RVXXXSharedController::hwGetSenseConfig().

 

Here is the one from ATI2400Controller:

RV610SharedController::hwGetSenseConfig(unsigned long, SenseDataInfo &) proc near
__text:0001A364										; CODE XREF: RV610SharedController::getSenseData(ulong)+1Cp
__text:0001A364										; RV610SharedController::setSenseData(ulong,uchar)+27p ...
__text:0001A364
__text:0001A364 arg_4		   = dword ptr  0Ch
__text:0001A364 arg_8		   = dword ptr  10h
__text:0001A364
__text:0001A364				 push	ebp
__text:0001A365				 mov	 ebp, esp
__text:0001A367				 mov	 eax, [ebp+arg_8]
__text:0001A36A				 mov	 dword ptr [eax+18h], 1
__text:0001A371				 mov	 dword ptr [eax+20h], 100h
__text:0001A378				 mov	 dword ptr [eax+1Ch], 1
__text:0001A37F				 mov	 dword ptr [eax+24h], 100h
__text:0001A386				 mov	 dword ptr [eax+10h], 101h
__text:0001A38D				 mov	 dword ptr [eax+14h], 0
__text:0001A394				 mov	 edx, [ebp+arg_4]
__text:0001A397				 and	 edx, 0Fh									 ; MASK OUT HARDWARE ASSIST FLAG
__text:0001A39A				 cmp	 edx, 7		 ; switch 8 cases
__text:0001A39D				 ja	  short loc_1A3A6; default
__text:0001A39D										; jumptable 0001A39F cases 0,5,6  ; DO NOTHING INVALID SENSE IDs
__text:0001A39F				 jmp	 ds:off_61CE0[edx*4]; switch jump
__text:0001A3A6
__text:0001A3A6 loc_1A3A6:							
__text:0001A3A6				 mov	 eax, 0E00002F0h; default
__text:0001A3A6										; jumptable 0001A39F cases 0,5,6  SENSE IDs 0,5,6
__text:0001A3AB				 jmp	 locret_1A46E
__text:0001A3B0; ---------------------------------------------------------------------------
__text:0001A3B0
__text:0001A3B0 loc_1A3B0:							 
__text:0001A3B0				 mov	 dword ptr [eax], 7E48h; jumptable 0001A39F case 1  SENSE ID 1
__text:0001A3B6				 mov	 dword ptr [eax+4], 7E40h
__text:0001A3BD				 mov	 dword ptr [eax+8], 7E44h
__text:0001A3C4				 mov	 dword ptr [eax+0Ch], 7E4Ch
__text:0001A3CB				 jmp	 loc_1A46C
__text:0001A3D0; ---------------------------------------------------------------------------
__text:0001A3D0
__text:0001A3D0 loc_1A3D0:						   
__text:0001A3D0				 mov	 dword ptr [eax], 7E58h; jumptable 0001A39F case 2  SENSE ID 2
__text:0001A3D6				 mov	 dword ptr [eax+4], 7E50h
__text:0001A3DD				 mov	 dword ptr [eax+8], 7E54h
__text:0001A3E4				 mov	 dword ptr [eax+0Ch], 7E5Ch
__text:0001A3EB				 jmp	 short loc_1A46C
__text:0001A3ED; ---------------------------------------------------------------------------
__text:0001A3ED
__text:0001A3ED loc_1A3ED:						 
__text:0001A3ED				 mov	 dword ptr [eax], 7E68h; jumptable 0001A39F case 3 SENSE ID 3
__text:0001A3F3				 mov	 dword ptr [eax+4], 7E60h
__text:0001A3FA				 mov	 dword ptr [eax+8], 7E64h
__text:0001A401				 mov	 dword ptr [eax+0Ch], 7E6Ch
__text:0001A408				 jmp	 short loc_1A46C
__text:0001A40A; ---------------------------------------------------------------------------
__text:0001A40A
__text:0001A40A loc_1A40A:					   
__text:0001A40A				 mov	 dword ptr [eax], 7E08h; jumptable 0001A39F case 4 SENSE ID 4
__text:0001A410				 mov	 dword ptr [eax+4], 7E00h
__text:0001A417				 mov	 dword ptr [eax+8], 7E04h
__text:0001A41E				 mov	 dword ptr [eax+0Ch], 7E0Ch
__text:0001A425				 jmp	 short loc_1A46C
__text:0001A427; ---------------------------------------------------------------------------
__text:0001A427
__text:0001A427 loc_1A427:							
__text:0001A427				 mov	 dword ptr [eax], 0AC8h; jumptable 0001A39F case 7 SENSE ID 7
__text:0001A42D				 mov	 dword ptr [eax+4], 0AC0h
__text:0001A434				 mov	 dword ptr [eax+8], 0AC4h
__text:0001A43B				 mov	 dword ptr [eax+0Ch], 0ACCh
__text:0001A442				 mov	 dword ptr [eax+18h], 1
__text:0001A449				 mov	 dword ptr [eax+20h], 2
__text:0001A450				 mov	 dword ptr [eax+1Ch], 1
__text:0001A457				 mov	 dword ptr [eax+24h], 2
__text:0001A45E				 mov	 dword ptr [eax+10h], 3
__text:0001A465				 mov	 dword ptr [eax+14h], 0
__text:0001A46C
__text:0001A46C loc_1A46C:						 
__text:0001A46C				 xor	 eax, eax
__text:0001A46E
__text:0001A46E locret_1A46E:						  
__text:0001A46E				 leave
__text:0001A46F				 retn
__text:0001A46F RV610SharedController::hwGetSenseConfig(unsigned long, SenseDataInfo &) endp

 

 

 

 

Now it just so happens, SENSE ID 7 is what works to detect my panel ( The ROM utilities returned 0x5 for sense_id which is totally wrong)

 

 

Hope this info helps.

Link to comment
Share on other sites

 Share

×
×
  • Create New...