analog output switching updates: not ready yet...
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@7297 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -132,9 +132,9 @@ status_t SET_DISPLAY_MODE(display_mode *mode_to_set)
|
|||||||
/* set output connectors assignment if possible */
|
/* set output connectors assignment if possible */
|
||||||
if ((target.flags & DUALHEAD_BITS) == DUALHEAD_SWITCH)
|
if ((target.flags & DUALHEAD_BITS) == DUALHEAD_SWITCH)
|
||||||
/* invert output assignment in switch mode */
|
/* invert output assignment in switch mode */
|
||||||
nv_general_output_select(true);
|
nv_general_head_select(true);
|
||||||
else
|
else
|
||||||
nv_general_output_select(false);
|
nv_general_head_select(false);
|
||||||
|
|
||||||
/* set the pixel clock PLL(s) */
|
/* set the pixel clock PLL(s) */
|
||||||
LOG(8,("SETMODE: target clock %dkHz\n",target.timing.pixel_clock));
|
LOG(8,("SETMODE: target clock %dkHz\n",target.timing.pixel_clock));
|
||||||
@@ -263,7 +263,7 @@ status_t SET_DISPLAY_MODE(display_mode *mode_to_set)
|
|||||||
// cross = false;
|
// cross = false;
|
||||||
// }
|
// }
|
||||||
/* set output connectors assignment if possible */
|
/* set output connectors assignment if possible */
|
||||||
nv_general_output_select(false);
|
nv_general_head_select(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(target.space)
|
switch(target.space)
|
||||||
|
|||||||
@@ -874,6 +874,9 @@ return nv_general_bios_to_powergraphics();
|
|||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* this routine switches the CRTC/DAC sets to 'connectors', but only for analog
|
||||||
|
* outputs. We need this to make sure the analog 'switch' is set in the same way the
|
||||||
|
* digital 'switch' is set by the BIOS or we might not be able to use dualhead. */
|
||||||
status_t nv_general_output_select(bool cross)
|
status_t nv_general_output_select(bool cross)
|
||||||
{
|
{
|
||||||
/* make sure this call is warranted */
|
/* make sure this call is warranted */
|
||||||
@@ -881,12 +884,11 @@ status_t nv_general_output_select(bool cross)
|
|||||||
{
|
{
|
||||||
/* NV11 cards can't switch heads; we lack info to switch heads via outputs
|
/* NV11 cards can't switch heads; we lack info to switch heads via outputs
|
||||||
* if flatpanels are used */
|
* if flatpanels are used */
|
||||||
//fixme: nolonger used: will be removed later on.
|
if (si->ps.card_type != NV11)
|
||||||
if (0)//(si->ps.card_type != NV11) && !si->ps.tmds1_active && !si->ps.tmds2_active)
|
|
||||||
{
|
{
|
||||||
if (cross)
|
if (cross)
|
||||||
{
|
{
|
||||||
LOG(4,("INIT: switching outputs to be cross-connected\n"));
|
LOG(4,("INIT: switching analog outputs to be cross-connected\n"));
|
||||||
|
|
||||||
/* enable head 2 on connector 1 */
|
/* enable head 2 on connector 1 */
|
||||||
/* (b8 = select CRTC (head) for output,
|
/* (b8 = select CRTC (head) for output,
|
||||||
@@ -898,7 +900,7 @@ status_t nv_general_output_select(bool cross)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LOG(4,("INIT: switching outputs to be straight-through\n"));
|
LOG(4,("INIT: switching analog outputs to be straight-through\n"));
|
||||||
|
|
||||||
/* enable head 1 on connector 1 */
|
/* enable head 1 on connector 1 */
|
||||||
DACW(OUTPUT, 0x00000001);
|
DACW(OUTPUT, 0x00000001);
|
||||||
@@ -908,35 +910,37 @@ status_t nv_general_output_select(bool cross)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* make sure we have outputs wired straight through first */
|
LOG(4,("INIT: NV11 analog outputs are hardwired to be straight-through\n"));
|
||||||
if (si->ps.card_type == NV11)
|
}
|
||||||
{
|
return B_OK;
|
||||||
LOG(4,("INIT: NV11 outputs are hardwired to be straight-through\n"));
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LOG(4,("INIT: switching outputs to be straight-through\n"));
|
return B_ERROR;
|
||||||
|
|
||||||
/* enable head 1 on connector 1 */
|
|
||||||
DACW(OUTPUT, 0x00000001);
|
|
||||||
/* enable head 2 on connector 2 */
|
|
||||||
DAC2W(OUTPUT, 0x00000101);
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* now invert CRTC use to do switching */
|
/* this routine switches CRTC/DAC set use. We need this because it's unknown howto
|
||||||
|
* switch digital panels to/from a specific CRTC/DAC set. */
|
||||||
|
status_t nv_general_head_select(bool cross)
|
||||||
|
{
|
||||||
|
/* make sure this call is warranted */
|
||||||
|
if (si->ps.secondary_head)
|
||||||
|
{
|
||||||
|
/* invert CRTC/DAC use to do switching */
|
||||||
if (cross)
|
if (cross)
|
||||||
{
|
{
|
||||||
LOG(4,("INIT: switching CRTC use to be cross-connected\n"));
|
LOG(4,("INIT: switching CRTC/DAC use to be cross-connected\n"));
|
||||||
si->crtc_switch_mode = !si->ps.crtc2_prim;
|
si->crtc_switch_mode = !si->ps.crtc2_prim;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LOG(4,("INIT: switching CRTC use to be straight-through\n"));
|
LOG(4,("INIT: switching CRTC/DAC use to be straight-through\n"));
|
||||||
si->crtc_switch_mode = si->ps.crtc2_prim;
|
si->crtc_switch_mode = si->ps.crtc2_prim;
|
||||||
}
|
}
|
||||||
/* update CRTC and DAC functions access */
|
/* update CRTC and DAC functions access */
|
||||||
setup_virtualized_heads(si->crtc_switch_mode);
|
setup_virtualized_heads(si->crtc_switch_mode);
|
||||||
}
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -947,8 +951,7 @@ status_t nv_general_output_select(bool cross)
|
|||||||
|
|
||||||
/* basic change of card state from VGA to enhanced mode:
|
/* basic change of card state from VGA to enhanced mode:
|
||||||
* Should work from VGA BIOS POST init state. */
|
* Should work from VGA BIOS POST init state. */
|
||||||
static
|
static status_t nv_general_bios_to_powergraphics()
|
||||||
status_t nv_general_bios_to_powergraphics()
|
|
||||||
{
|
{
|
||||||
LOG(2, ("INIT: Skipping card coldstart!\n"));
|
LOG(2, ("INIT: Skipping card coldstart!\n"));
|
||||||
|
|
||||||
|
|||||||
@@ -246,9 +246,58 @@ void fake_pins(void)
|
|||||||
/* find out the BIOS preprogrammed panel use status... */
|
/* find out the BIOS preprogrammed panel use status... */
|
||||||
detect_panels();
|
detect_panels();
|
||||||
|
|
||||||
|
//in progress!
|
||||||
|
if (si->ps.secondary_head)
|
||||||
|
{
|
||||||
|
if (si->ps.card_type != NV11)
|
||||||
|
{
|
||||||
|
uint8 monitors = 0x00;
|
||||||
|
|
||||||
|
/* presetup by the card's BIOS, we can't change this (lack of info) */
|
||||||
|
if (si->ps.tmds1_active) monitors |= 0x01;
|
||||||
|
if (si->ps.tmds2_active) monitors |= 0x02;
|
||||||
|
//fixme: checkout NV25, NV18, NV11... NV34 must use DAC _and_ DAC2 for det.
|
||||||
|
/* connect analog outputs straight through */
|
||||||
|
nv_general_output_select(false);
|
||||||
|
/* sense analog monitor on primary connector */
|
||||||
|
if (nv_dac_crt_connected()) monitors |= 0x04;
|
||||||
|
/* cross connect analog outputs */
|
||||||
|
nv_general_output_select(true);
|
||||||
|
/* sense analog monitor on secondary connector */
|
||||||
|
if (nv_dac_crt_connected()) monitors |= 0x08;
|
||||||
|
/* re-connect analog outputs straight through */
|
||||||
|
nv_general_output_select(false);
|
||||||
|
|
||||||
|
//fixme! two monitors on one DAC _can_ happen!!! (switch analog outputs then!)
|
||||||
|
switch (monitors)
|
||||||
|
{
|
||||||
|
case 0x01: /* digital panel on DAC1, nothing on DAC2 */
|
||||||
|
case 0x04: /* analog panel or CRT on DAC1, nothing on DAC2 */
|
||||||
|
case 0x05: /* both types on DAC1, nothing on DAC2 (shouldn't happen) */
|
||||||
|
LOG(2,("INFO: head 1 has a monitor only: defaulting to head 1 use\n"));
|
||||||
|
break;
|
||||||
|
case 0x02: /* digital panel on DAC2, nothing on DAC1 */
|
||||||
|
case 0x08: /* analog panel or CRT on DAC2, nothing on DAC1 */
|
||||||
|
case 0x0a: /* both types on DAC2, nothing on DAC1 (shouldn't happen) */
|
||||||
|
LOG(2,("INFO: head 2 has a monitor only: defaulting to head 2 use\n"));
|
||||||
|
si->ps.crtc2_prim = true;
|
||||||
|
break;
|
||||||
|
default: /* monitors found on both DACs, or nothing found at all */
|
||||||
|
LOG(2,("INFO: head 2 has a monitor only: defaulting to head 2 use\n"));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOG(4,("INFO: NV11 outputs are hardwired to be straight-through\n"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//
|
||||||
|
|
||||||
|
//fixme: remove..
|
||||||
/* if no panel, but one analog monitor is detected, and it's on the secondary
|
/* if no panel, but one analog monitor is detected, and it's on the secondary
|
||||||
* head on dualhead cards, we use that head as primary head */
|
* head on dualhead cards, we use that head as primary head */
|
||||||
if (si->ps.secondary_head && !si->ps.tmds1_active && !si->ps.tmds2_active)
|
/* if (si->ps.secondary_head && !si->ps.tmds1_active && !si->ps.tmds2_active)
|
||||||
{
|
{
|
||||||
if (nv_dac2_crt_connected() && !nv_dac_crt_connected())
|
if (nv_dac2_crt_connected() && !nv_dac_crt_connected())
|
||||||
{
|
{
|
||||||
@@ -256,6 +305,7 @@ void fake_pins(void)
|
|||||||
si->ps.crtc2_prim = true;
|
si->ps.crtc2_prim = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
/* select other CRTC for primary head use if specified by user in settings file */
|
/* select other CRTC for primary head use if specified by user in settings file */
|
||||||
if (si->ps.secondary_head && si->settings.switchhead)
|
if (si->ps.secondary_head && si->settings.switchhead)
|
||||||
@@ -449,7 +499,7 @@ static void detect_panels()
|
|||||||
* we use that head as primary head */
|
* we use that head as primary head */
|
||||||
if (si->ps.secondary_head && si->ps.tmds2_active && !si->ps.tmds1_active)
|
if (si->ps.secondary_head && si->ps.tmds2_active && !si->ps.tmds1_active)
|
||||||
{
|
{
|
||||||
LOG(2,("INFO: CRTC2 has a panel only: defaulting to CRTC2 use\n"));
|
LOG(2,("INFO: CRTC2 has a panel only: defaulting to CRTC2 for primary use\n"));
|
||||||
si->ps.crtc2_prim = true;
|
si->ps.crtc2_prim = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ status_t nv_general_powerup(void);
|
|||||||
status_t nv_set_cas_latency(void);
|
status_t nv_set_cas_latency(void);
|
||||||
void setup_virtualized_heads(bool);
|
void setup_virtualized_heads(bool);
|
||||||
status_t nv_general_output_select(bool);
|
status_t nv_general_output_select(bool);
|
||||||
|
status_t nv_general_head_select(bool);
|
||||||
status_t nv_general_wait_retrace(void);
|
status_t nv_general_wait_retrace(void);
|
||||||
status_t nv_general_validate_pic_size (display_mode *target, uint32 *bytes_per_row, bool *acc_mode);
|
status_t nv_general_validate_pic_size (display_mode *target, uint32 *bytes_per_row, bool *acc_mode);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user