We have bought a number of Dells with the OEM RadeonVE card.  I can 
certainly confirm that they are strange compared to the out-of-box 
Radeon VE QY, although the PCI vendor id is identical.  Have a look at:

    http://wetlogic.net/stewart/xfree-radeon-ve/radeon-ve-dell.jpg

to see the card and the single connector on the board.  Unlike the 
retail version of the board I have, this board does not duplicate 
output on both connectors, but instead displays only on cable 1 (the 
blue connector on the Y-adaptor in the picture), and nothing at all
on cable 2. 

When I tried a dual-head configuration that works successfully on a
retail version of the Radeon VE versions, I found two problems which
I patched:

  - The first problem is that the primary interface does not report
    the BIOS value that radeon_driver.c expects in the function
    RADEONGetBIOSParameters().  Instead, it reports only a CRT on
    the secondary connector.  In the single-headed case this works
    correctly. 

    In the dual-head case things would also work correctly except
    that when RADEONPreInit() is called on the second screen instance,
    it checks for BypassSecondary and quite silently returns FALSE.
    This stumped me for a long time since there were no error 
    messages in the X log file that indicated why Screen 1 was 
    completely ignored in my XF86Config-4.

    I'm not sure I understand why it is an error ifthe BIOS 
    doesn't claim to detect a second monitor.  Does this mean
    the user must reboot in order to attach a second monitor, or
    in many cases just because it happened to be off at boot time?
    In my patch, I commented the return out, but I think it's 
    worth opening a discussion (I'm not on Xpert, so please Cc
    me).  The behavior as a result of this change is that if 
    there's a second screen definition and the card is multi-head,
    and there's at least one monitor attached, the second monitor
    is pre-initted.

  - The second problem is that the secondary monitor on the OEM
    Dell Radeon VE uses DAC2 for output.  There was actually a
    bit of commented out code in RADEONInitCrtc2Registers() already,
    so I simply added an option named "Crt2Dac2" and tested for
    it there.  The true maintainers of this code may want to add
    another boolean field to RADEONEntRec and hunt for the option
    elsewhere, if they think that's cleaner.

    Thesecond screen definition in my XF86Config-4 now looks like:

        Section "Device"
            Identifier "ATI Radeon 1"
            Driver "radeon"
            BoardName "Radeon"
            BusID "PCI:1:0:0"
            Option "AGPMode" "4"
            Option "Crt2Dac2"
            Screen 1
        EndSection

  The third problem, which I didn't deal with, is that the DDC info
for the two monitors attached was swapped.  In other words, the DDC 
info listed for screen 0 (the monitor displaying the settings listed
in the "Screen 0" Section, also the monitor connected to the first
cable) appeared in the section of the log file dedicated to screen 1,
and vice versa.  This wasn't a big enough problem for me to solve, 
and since it's hard to solve it without yet another option, I decided
to forego it.

  Anyway, I hope this helps some people.  Here it is, based on 
4.2.99.1 (CVS as of yesterday):

--- xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_driver.c.orig     Mon Apr 22 
13:55:48 2002
+++ xc/programs/Xserver/hw/xfree86/drivers/ati/radeon_driver.c  Tue Apr 23 10:53:56 
+2002
@@ -132,7 +132,8 @@
 #endif
     OPTION_CRT_SCREEN,
     OPTION_PANEL_SIZE,
-    OPTION_FBDEV
+    OPTION_FBDEV,
+    OPTION_CRT2_DAC2
 } RADEONOpts;
 
 const OptionInfoRec RADEONOptions[] = {
@@ -153,6 +154,7 @@
     { OPTION_CRT_SCREEN,   "CrtScreen",        OPTV_BOOLEAN, {0}, FALSE},
     { OPTION_PANEL_SIZE,   "PanelSize",        OPTV_ANYSTR,  {0}, FALSE },
     { OPTION_FBDEV,        "UseFBDev",         OPTV_BOOLEAN, {0}, FALSE },
+    { OPTION_CRT2_DAC2,    "Crt2Dac2",         OPTV_BOOLEAN, {0}, FALSE },
     { -1,                  NULL,               OPTV_NONE,    {0}, FALSE }
 };
 
@@ -2181,7 +2183,12 @@
             pPriv = xf86GetEntityPrivate(pScrn->entityList[0], 
                     gRADEONEntityIndex);
             pRADEONEnt = pPriv->ptr;
-            if(pRADEONEnt->BypassSecondary) return FALSE;
+            /* XXX Note to Maintainer: The only reason we would be here
+            * is if the user entered a second "Screen" definition for
+            * this card, presumably because there are two screens.
+            * Shouldn't this automatically override presumed BIOS settings?
+             * if(pRADEONEnt->BypassSecondary) return FALSE;
+            */
             pRADEONEnt->pSecondaryScrn = pScrn;
         }
         else
@@ -3846,6 +3853,9 @@
         save->disp_output_cntl = 
             ((info->SavedReg.disp_output_cntl & ~(CARD32)RADEON_DISP_DAC_SOURCE_MASK)
             | RADEON_DISP_DAC_SOURCE_CRTC2);
+    else if (xf86ReturnOptValBool(info->Options, OPTION_CRT2_DAC2, FALSE))
+        save->dac2_cntl = info->SavedReg.dac2_cntl 
+                      | RADEON_DAC2_DAC2_CLK_SEL;
     else
         save->dac2_cntl = info->SavedReg.dac2_cntl 
                       /*| RADEON_DAC2_DAC2_CLK_SEL*/



_______________________________________________
Xpert mailing list
[EMAIL PROTECTED]
http://XFree86.Org/mailman/listinfo/xpert

Reply via email to