added preliminary flatpanel detection stuff

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@6844 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Rudolf Cornelissen
2004-03-01 20:00:16 +00:00
parent 4a6c7d6ffc
commit 3186091bdd
5 changed files with 101 additions and 11 deletions
@@ -5,7 +5,7 @@
Other authors:
Mark Watson;
Apsed;
Rudolf Cornelissen 10/2002-1/2004.
Rudolf Cornelissen 10/2002-2/2004.
*/
#ifndef DRIVERINTERFACE_H
@@ -200,10 +200,11 @@ typedef struct {
CH7005,
CH7006,
CH7007,
CH7008,
SAA7102,
SAA7103,
SAA7104,
SAA7108,
SAA7114,
SAA7105,
BT868,
BT869,
CX25870,
@@ -219,6 +220,8 @@ typedef struct {
uint32 card_type; /* see card_type enum above */
uint32 card_arch; /* see card_arch enum above */
bool laptop; /* mobile chipset or not ('internal' flatpanel!) */
uint16 panel_width; /* native horizontal resolution for laptop panels */
uint16 panel_height; /* navive vertical resolution for laptop panels */
uint32 tvout_chip_type; /* see tvchip_type enum above */
status_t pins_status; /* B_OK if read correctly, B_ERROR if faked */
bool sdram; /* TRUE if SDRAM card: needed info for 2D acceleration */
@@ -482,6 +482,9 @@
#define NVDAC_GENCTRL 0x00680600
#define NVDAC_TSTCTRL 0x00680608
#define NVDAC_TSTDATA 0x00680610
/* (flatpanel registers) */
#define NVDAC_FP_VDISPEND 0x00680800
#define NVDAC_FP_HDISPEND 0x00680820
/* secondary head */
#define NVDAC2_CURPOS 0x00682300
#define NVDAC2_PIXPLLC 0x00680520
@@ -489,6 +492,9 @@
#define NVDAC2_PIXPLLC2 0x0068057c /* NV31, NV36 only */
#define NVDAC2_GENCTRL 0x00682600
#define NVDAC2_TSTCTRL 0x00682608
/* (flatpanel registers) */
#define NVDAC2_FP_VDISPEND 0x00682800
#define NVDAC2_FP_HDISPEND 0x00682820
/* Nvidia CRTC indexed registers */
/* VGA standard registers: */
@@ -524,6 +530,7 @@
#define NVCRTCX_CURCTL2 0x2f
#define NVCRTCX_CURCTL1 0x30
#define NVCRTCX_CURCTL0 0x31
#define NVCRTCX_LCD 0x33
#define NVCRTCX_INTERLACE 0x39
#define NVCRTCX_EXTRA 0x41
#define NVCRTCX_OWNER 0x44
@@ -1,7 +1,7 @@
/* Authors:
Mark Watson 12/1999,
Apsed,
Rudolf Cornelissen 10/2002-2/2004
Rudolf Cornelissen 10/2002-3/2004
*/
#define MODULE_BIT 0x00008000
@@ -80,7 +80,7 @@ status_t nv_general_powerup()
{
status_t status;
LOG(1,("POWERUP: nVidia (open)BeOS Accelerant 0.09-final running.\n"));
LOG(1,("POWERUP: nVidia (open)BeOS Accelerant 0.10-1 running.\n"));
/* preset no laptop */
si->ps.laptop = false;
@@ -1,7 +1,7 @@
/* Read initialisation information from card */
/* some bits are hacks, where PINS is not known */
/* Author:
Rudolf Cornelissen 7/2003-1/2004
Rudolf Cornelissen 7/2003-3/2004
*/
#define MODULE_BIT 0x00002000
@@ -241,6 +241,73 @@ void fake_pins(void)
si->ps.tvout_chip_type = ???;
}
*/
/* detect if the BIOS enabled a LCD (internal panel or DVI) or TVout */
{
/* both TMDS transmitters (used for LCD/DVI) and TVencoders are slave devices */
bool slavedev1_active = false, slavedev2_active = false;
bool tvout1_active = false, tvout2_active = false;
/* check primary head: */
/* enable access to CRTC1 on dualhead cards */
if (si->ps.secondary_head) CRTCW(OWNER, 0x00);
/* unlock CRTC1 */
CRTCW(LOCK, 0x57);
CRTCW(VSYNCE ,(CRTCR(VSYNCE) & 0x7f));
/* detect active slave device (if any) */
slavedev1_active = (CRTCR(PIXEL) & 0x80);
if (slavedev1_active)
{
/* if the panel isn't selected, tvout is.. */
tvout1_active = !(CRTCR(LCD) & 0x01);
}
if (si->ps.secondary_head)
{
/* check secondary head: */
/* enable access to CRTC2 */
CRTCW(OWNER, 0x03);
/* unlock CRTC2 */
CRTCW(LOCK, 0x57);
CRTCW(VSYNCE ,(CRTCR(VSYNCE) & 0x7f));
/* detect active slave device (if any) */
slavedev2_active = (CRTCR(PIXEL) & 0x80);
if (slavedev2_active)
{
/* if the panel isn't selected, tvout is.. */
tvout2_active = !(CRTCR(LCD) & 0x01);
}
}
/* fixme: doing some logging, but (also) use for DVI outputs on non-laptops.. */
if (slavedev1_active && ! tvout1_active)
{
LOG(2,("CRTC1 is currently programmed for DFP\n"));
LOG(2,("panel size is %d x %d\n",
((DACR(FP_HDISPEND) & 0x0000ffff) + 1),
((DACR(FP_VDISPEND) & 0x0000ffff) + 1)));
}
if (slavedev2_active && ! tvout2_active)
{
LOG(2,("CRTC2 is currently programmed for DFP\n"));
LOG(2,("panel size is %d x %d\n",
((DAC2R(FP_HDISPEND) & 0x0000ffff) + 1),
((DAC2R(FP_VDISPEND) & 0x0000ffff) + 1)));
}
/* fixme?: assuming laptop panel always on CRTC1 for now... */
if (si->ps.laptop)
{
si->ps.panel_width = ((DACR(FP_HDISPEND) & 0x0000ffff) + 1);
si->ps.panel_height = ((DACR(FP_VDISPEND) & 0x0000ffff) + 1);
}
else
{
si->ps.panel_width = 0;
si->ps.panel_height = 0;
}
}
}
static void pinsnv4_fake(void)
@@ -666,17 +733,20 @@ void dump_pins(void)
case CH7007:
msg = "Chrontel CH7007";
break;
case CH7008:
msg = "Chrontel CH7008";
break;
case SAA7102:
msg = "Philips SAA7102";
break;
case SAA7103:
msg = "Philips SAA7103";
break;
case SAA7104:
msg = "Philips SAA7104";
break;
case SAA7108:
msg = "Philips SAA7108";
break;
case SAA7114:
msg = "Philips SAA7114";
case SAA7105:
msg = "Philips SAA7105";
break;
case BT868:
msg = "Brooktree/Conexant BT868";
@@ -707,5 +777,11 @@ void dump_pins(void)
if (si->ps.sdram) LOG(2,("SDRAM card\n")); else LOG(2,("SGRAM card\n"));
LOG(2,("laptop: "));
if (si->ps.laptop) LOG(2,("yes\n")); else LOG(2,("no\n"));
//fixme: testing...
// if (si->ps.laptop)
{
LOG(2,("panel width: %d\n", si->ps.panel_width));
LOG(2,("panel height: %d\n", si->ps.panel_height));
}
LOG(2,("INFO: end pinsdump.\n"));
}
@@ -4,6 +4,10 @@
</head>
<body>
<p><h2>Changes done for each driverversion:</h2></p>
<p><h1>head (0.10-1), (Rudolf)</h1></p>
<ul>
<li>Trying to detect digital flatpanels... (preliminary stuff)
</ul>
<p><h1>nv_driver 0.09, (Rudolf)</h1></p>
<ul>
<li>Fixed NV11 trouble with repeating screen(s) on the right side of the monitor;