netkas.org forum
July 18, 2019, 02:24:34 AM *
Welcome, Guest. Please login or register.
Did you miss your activation email?

Login with username, password and session length
News: Information for registering users http://forum.netkas.org/index.php/topic,2246.0.html
 
   Home   Help Search Login Register  
Pages: [1]
  Print  
Author Topic: thoughts on why a 3 Monitor setup using 5xxx cards in Lion doesn’t work  (Read 6291 times)
calvintml
Full Member
***
Offline Offline

Posts: 131


« on: July 30, 2011, 12:57:12 AM »

As many people have noted, getting three monitors to work using 5xxx cards in Lion has been tricky.  The only solution up until now is to have two active displayport connections and one passive connection.  This is possible for people with either the apple version of the card (2x mini displayports) or for people with eyefinity versions of the cards (5x or 6x mini displayports).  But with people with the more common 1x displayport + 2x dvi, this solution doesn’t work, because you can only have a max of 1 active displayport connections.

What’s strange is that apple claims this is normal function: http://support.apple.com/kb/TS3477
“If you use three displays, you should connect at least two of them with a Mini DisplayPort. You can also use the Apple Mini DisplayPort to Dual-Link DVI adapter or the Apple Mini DisplayPort to VGA adapter or just connect the devices to the graphics card using their native Mini DisplayPort connectors.”

This is pretty lame considering this was not the case with 10.6.7 kexts. 

Another interesting thing is that 3 monitors are recognized by default using the lion kexts.  If you just plug in three monitors without making any kext alterations, then you see all three monitors are recognizd.  Unfortunately, without editing the kexts, displayport monitors don’t work even though they are recognized.  In another post (http://forum.netkas.org/index.php/topic,1069.0.html) I indicated how to get displayport working in 5xxx cards, by editing the Info.plist to set CFG_FORCE_ICLK to true. The thing is that after you enable this feature, only two of three monitors are recognized.  So on the one hand, you enable CFG_FORCE_ICLK and 3 monitors are recognized, but only two work.  If you disable CFG_FORCE_ICLK only two monitors are recognized, and thus only two work. The situation is obviously not ideal.  Another thing I noticed is that although the ATI6000Controller has the CFG_FORCE_ICLK code, it does not need to be enabled for displayport to work on those cards.

Below is the code following CFG_FORCE_ICLK from the decompiled ATI5000Controller from Lion GM. Perhaps someone can tweak it so that whatever is disabling 3 monitors from working can be worked around:

Code:
  ATIController__getConfigProperty(a1, "CFG_FORCE_ICLK", &v19, 1);
  if ( !v19 )
  {
    if ( AtomBiosProxy__getExternalClock(*(_DWORD *)(a1 + 196)) )
      *(_BYTE *)(*(_DWORD *)(a1 + 636) + 345) = -1;
  }
  v2 = 0;
  v1 = 0;
  do
  {
    v3 = 59808;
    if ( v1 < 2 )
      v3 = 27040;
    v17 = v3;
    v4 = 59816;
    if ( v1 < 2 )
      v4 = 27048;
    v5 = 60200;
    if ( v1 < 2 )
      v5 = 27432;
    (*(void (__cdecl **)(int, int, signed int))(*(_DWORD *)a1 + 1684))(a1, v2 + v5, 2);
    (*(void (__cdecl **)(int, int, signed int))(*(_DWORD *)a1 + 1684))(a1, v2 + v4, -1);
    (*(void (__cdecl **)(_DWORD, int, signed int))(*(_DWORD *)a1 + 1684))(a1, v2 + v17, 4128831);
    v2 += 3072;
    ++v1;
  }
  while ( v1 != 6 );
  v7 = a1;
  R800SharedController__rmsw32(a1, 11272, 1, 0, 0);
  (*(void (__cdecl **)(int, signed int, signed int))(*(_DWORD *)v7 + 1684))(v7, 11264, -1893728223);
  v8 = *(void (__cdecl **)(_DWORD, _DWORD, _DWORD))(*(_DWORD *)a1 + 1684);
  v9 = (*(int (__cdecl **)(int, signed int))(*(_DWORD *)v7 + 1696))(v7, 15896);
  v8(a1, 15896, v9 | 0x11);
  v10 = *(void (__cdecl **)(_DWORD, _DWORD, _DWORD))(*(_DWORD *)a1 + 1684);
  v11 = (*(int (__cdecl **)(int, signed int))(*(_DWORD *)v7 + 1696))(v7, 15872);
  v10(a1, 15872, v11 & 0xFFFFFFFE);
  v12 = *(void (__cdecl **)(_DWORD, _DWORD, _DWORD))(*(_DWORD *)a1 + 1684);
  v13 = (*(int (__cdecl **)(_DWORD, signed int))(*(_DWORD *)v7 + 1696))(v7, 24820);
  v12(a1, 24820, v13);
  v14 = *(void (__cdecl **)(_DWORD, _DWORD, _DWORD))(*(_DWORD *)a1 + 1684);
  v15 = (*(int (__cdecl **)(_DWORD, signed int))(*(_DWORD *)v7 + 1696))(v7, 24824);
  v14(a1, 24824, v15);
  (*(void (__cdecl **)(int))(*(_DWORD *)v7 + 1808))(v7);
  v6 = *(_DWORD *)(a1 + 636);
  if ( *(_BYTE *)(v6 + 419) )
    (*(void (__cdecl **)(int, signed int, bool))(*(_DWORD *)a1 + 1720))(
      a1,
      1 << *(_BYTE *)(v6 + 420),
      *(_BYTE *)(v6 + 421) != 0);
  ATI5000Controller__hwInitializeRingBuffer(a1);
  ATI5000Controller__hwInitializeDCLK(a1);
  return R800SharedController__hwInitializeDisplay(a1);
}
Logged
Pages: [1]
  Print  
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2015, Simple Machines Valid XHTML 1.0! Valid CSS!