modified head selection code for most NV40 architecture cards since their BIOSes behave differently. This should fix black or disabled screens if the secondary connector has a VGA screen while the first one is disconnected. verified on NV43, NV44, G71 and G72 over here. Bumped version to 1.05.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33255 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Rudolf Cornelissen 2009-09-23 19:17:35 +00:00
parent d46c72cd75
commit 51e7cfd2bb
3 changed files with 38 additions and 25 deletions

View File

@ -92,7 +92,7 @@ status_t nv_general_powerup()
{
status_t status;
LOG(1,("POWERUP: Haiku nVidia Accelerant 1.04 running.\n"));
LOG(1,("POWERUP: Haiku nVidia Accelerant 1.05 running.\n"));
/* log VBLANK INT usability status */
if (si->ps.int_assigned)

View File

@ -1,7 +1,7 @@
/* Read initialisation information from card */
/* some bits are hacks, where PINS is not known */
/* Author:
Rudolf Cornelissen 7/2003-8/2009
Rudolf Cornelissen 7/2003-9/2009
*/
#define MODULE_BIT 0x00002000
@ -2768,10 +2768,33 @@ static void setup_output_matrix()
si->ps.crtc2_prim = true;
break;
case 0x20: /* nothing on head 1, analog panel or CRT on head 2 */
LOG(2,("INFO: head 1 has nothing connected;\n"));
LOG(2,("INFO: head 2 has an analog panel or CRT:\n"));
LOG(2,("INFO: defaulting to head 2 for primary use.\n"));
si->ps.crtc2_prim = true;
if (si->ps.card_arch < NV40A) {
LOG(2,("INFO: head 1 has nothing connected;\n"));
LOG(2,("INFO: head 2 has an analog panel or CRT:\n"));
LOG(2,("INFO: defaulting to head 2 for primary use.\n"));
si->ps.crtc2_prim = true;
} else {
switch (si->ps.card_type) {
case NV40: /* Geforce 6800 AGP was confirmed OK 'in the old days' */
case NV41: /* Geforce 6800 type as well - needs to be confirmed (guessing) */
case NV45: /* Geforce 6800 PCIe - needs to be confirmed (guessing) */
LOG(2,("INFO: head 1 has nothing connected;\n"));
LOG(2,("INFO: head 2 has an analog panel or CRT:\n"));
LOG(2,("INFO: defaulting to head 2 for primary use.\n"));
si->ps.crtc2_prim = true;
break;
default:
/* newer NV40 architecture cards contains (an) additional switch(es)
* to connect a CRTC/DAC combination to a connector. The BIOSes of
* these cards connect head1 to connectors 1 and 2 simultaneously if
* only one VGA screen is found being on connector 2. Which is the
* case here.
* Confirmed on NV43, NV44, G71 and G72. */
LOG(2,("INFO: Both card outputs are connected to head 1;\n"));
LOG(2,("INFO: defaulting to head 1 for primary use.\n"));
break;
}
}
break;
case 0x30: /* nothing on head 1, both types on head 2 */
LOG(2,("INFO: head 1 has nothing connected;\n"));
@ -2809,23 +2832,12 @@ static void setup_output_matrix()
LOG(2,("INFO: defaulting to head 1 for primary use.\n"));
break;
case 0x32: /* more than two monitors connected to just two outputs: illegal! */
//general fixme:
//NV40 architecture contains (an) additional switch(es) to
//connect a CRTC/DAC combination to a connector. We can't work as
//usual (yet) because this interferes via BIOS card pre-programming.
//
//Also: it looks as if each pixelclock PLL can select different CRTC's
//as well now via a new register: one PLL can be driving both CRTC's
//and there's nothing we can do about that (yet). (DVI/dualhead trouble)
if (si->ps.card_arch < NV40A)
{
LOG(2,("INFO: illegal monitor setup ($%02x):\n", si->ps.monitors));
/* head 2 takes precedence because it has a digital panel while
* head 1 has not. */
LOG(2,("INFO: defaulting to head 2 for primary use.\n"));
si->ps.crtc2_prim = true;
break;
}
LOG(2,("INFO: illegal monitor setup ($%02x):\n", si->ps.monitors));
/* head 2 takes precedence because it has a digital panel while
* head 1 has not. */
LOG(2,("INFO: defaulting to head 2 for primary use.\n"));
si->ps.crtc2_prim = true;
break;
default: /* more than two monitors connected to just two outputs: illegal! */
LOG(2,("INFO: illegal monitor setup ($%02x):\n", si->ps.monitors));
LOG(2,("INFO: defaulting to head 1 for primary use.\n"));

View File

@ -4,7 +4,7 @@
</head>
<body>
<p><h2>Changes done for each driverversion:</h2></p>
<p><h1>head (SVN 1.04, Rudolf)</h1></p>
<p><h1>head (SVN 1.05, Rudolf)</h1></p>
<ul>
<li>Fixed driver assuming enabling AGP mode succeeded on some occasions if it did not block it itself. Blocking AGP mode completely via the AGP busmanager (option 'block_agp') resulted in a crashing acceleration engine because it was setup for AGP transfers instead of using PCI transfers. Error was solved with help from user kraton.
<li>Fixed shared_info struct problem occuring when 3D 'accelerant' is used (tested Alpha 4.1): the TVencoder type definition list apparantly gets some memory assigned these days when done inside the definition of shared_info. Moved encoder list outside the shared_info definition.
@ -29,7 +29,8 @@
<li>Finally(!) fixed PLL selection trouble on NV40 architecture (Geforce 6xxx and 7xxx) cards. Now dualhead should (almost) always work OK, and now low-res bootscreens should nolonger result in 'frequency out of range' messages on DVI connected screens;
<li>Fixed shivering display on some systems (confirmed a Geforce 5200 laptop): Pixelclocks should <strong>never</strong> be setup for spread spectrum on analog connections;
<li>Added full HDTV mode (1920x1080p) to exported modelist: Haiku's Screen preflet allows you to set this mode now if your screen supports it;
<li>Improved modeline scaling for digitally connected screens: this fixes missing SYNC pulses on some setups. The screen nolonger shows shifted pictures (this happened mostly on 640x480 resolution).
<li>Improved modeline scaling for digitally connected screens: this fixes missing SYNC pulses on some setups. The screen nolonger shows shifted pictures (this happened mostly on 640x480 resolution);
<li>Modified head selection code on NV40 architecture cards except for NV40, NV41 and NV45. The cards affected have differently behaving BIOSes. This should fix black or disabled screens if the secondary connector was used for VGA while the first one was not connected.
</ul>
<p><h1>nv_driver 0.80 (Rudolf)</h1></p>
<ul>