summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKaleb Keithley <kaleb@freedesktop.org>2004-02-23 21:35:30 +0000
committerKaleb Keithley <kaleb@freedesktop.org>2004-02-23 21:35:30 +0000
commit71687eeaa94c5b1ce1fbb11ff27d4e69c73a4a1d (patch)
treecca7300580523a9ef1b66009aea0f96ea1cc5248
parent775f4085e0939561304642567ae0395f8a2f534d (diff)
merge most of XFree86 RC3 (4.3.99.903) from vendor branch.XORG-RELEASE-1-BASE
bug #214
-rw-r--r--man/i810.man13
-rw-r--r--src/common.h4
-rw-r--r--src/i810_accel.c69
-rw-r--r--src/i810_driver.c40
-rw-r--r--src/i810_reg.h3
-rw-r--r--src/i830.h3
-rw-r--r--src/i830_accel.c52
-rw-r--r--src/i830_driver.c38
8 files changed, 110 insertions, 112 deletions
diff --git a/man/i810.man b/man/i810.man
index 33246e96..a4f18565 100644
--- a/man/i810.man
+++ b/man/i810.man
@@ -1,4 +1,4 @@
-.\" $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/i810.man,v 1.5 2003/10/18 02:27:07 dawes Exp $
+.\" $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/i810.man,v 1.6 2004/01/07 03:43:19 dawes Exp $
.\" shorthand for double quote that works everywhere.
.ds q \N'34'
.TH I810 __drivermansuffix__ __vendorversion__
@@ -116,6 +116,13 @@ The following driver
.B Options
are supported for the 830M and later chipsets:
.TP
+.BI "Option \*qVBERestore\*q \*q" boolean \*q
+Enable or disable the use of VBE save/restore for saving and restoring
+the initial text mode. This is disabled by default because it causes
+lockups on some platforms. However, there are some cases where it must
+enabled for the correct restoration of the initial video mode. If you are
+having a problem with that, try enabling this option. Default: Disabled.
+.TP
.BI "Option \*qVideoKey\*q \*q" integer \*q
This is the same as the
.B \*qColorKey\*q
@@ -123,8 +130,8 @@ option described above. It is provided for compatibility with most
other drivers.
.TP
.BI "Option \*qXVideo\*q \*q" boolean \*q
-Disable or enable XVideo support.
-Default: XVideo is enabled for configurations where it is supported.
+Disable or enable XVideo support. Default: XVideo is enabled for
+configurations where it is supported.
.SH "SEE ALSO"
diff --git a/src/common.h b/src/common.h
index 3d32432c..729e78d3 100644
--- a/src/common.h
+++ b/src/common.h
@@ -27,7 +27,7 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
**************************************************************************/
-/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/common.h,v 1.9 2003/09/24 02:43:23 dawes Exp $ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/common.h,v 1.10 2004/01/03 02:11:53 dawes Exp $ */
/*
* Authors:
@@ -257,8 +257,10 @@ extern void I830DPRINTF_stub(const char *filename, int line,
* preprocessor symbol, and equal to zero.
*/
#if 1
+#ifndef I810_DEBUG
#define I810_DEBUG 0
#endif
+#endif
#ifndef I810_DEBUG
#warning "Debugging enabled - expect reduced performance"
extern int I810_DEBUG;
diff --git a/src/i810_accel.c b/src/i810_accel.c
index d8467424..dd196320 100644
--- a/src/i810_accel.c
+++ b/src/i810_accel.c
@@ -25,7 +25,7 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
**************************************************************************/
-/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/i810_accel.c,v 1.19 2003/04/24 18:00:24 eich Exp $ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/i810_accel.c,v 1.22 2004/01/03 02:11:53 dawes Exp $ */
/*
* Reformatted with GNU indent (2.2.8), using the following options:
@@ -48,47 +48,9 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include "xf86_ansic.h"
#include "xf86.h"
-
+#include "xaarop.h"
#include "i810.h"
-static unsigned int i810Rop[16] = {
- 0x00, /* GXclear */
- 0x88, /* GXand */
- 0x44, /* GXandReverse */
- 0xCC, /* GXcopy */
- 0x22, /* GXandInvert */
- 0xAA, /* GXnoop */
- 0x66, /* GXxor */
- 0xEE, /* GXor */
- 0x11, /* GXnor */
- 0x99, /* GXequiv */
- 0x55, /* GXinvert */
- 0xDD, /* GXorReverse */
- 0x33, /* GXcopyInvert */
- 0xBB, /* GXorInverted */
- 0x77, /* GXnand */
- 0xFF /* GXset */
-};
-
-static unsigned int i810PatternRop[16] = {
- 0x00, /* GXclear */
- 0xA0, /* GXand */
- 0x50, /* GXandReverse */
- 0xF0, /* GXcopy */
- 0x0A, /* GXandInvert */
- 0xAA, /* GXnoop */
- 0x5A, /* GXxor */
- 0xFA, /* GXor */
- 0x05, /* GXnor */
- 0xA5, /* GXequiv */
- 0x55, /* GXinvert */
- 0xF5, /* GXorReverse */
- 0x0F, /* GXcopyInvert */
- 0xAF, /* GXorInverted */
- 0x5F, /* GXnand */
- 0xFF /* GXset */
-};
-
static void I810SetupForMono8x8PatternFill(ScrnInfoPtr pScrn,
int pattx, int patty,
int fg, int bg, int rop,
@@ -130,10 +92,7 @@ I810AccelInit(ScreenPtr pScreen)
pI810->bufferOffset = 0;
infoPtr->Flags = LINEAR_FRAMEBUFFER | OFFSCREEN_PIXMAPS;
- /* There is a bit blt bug in 24 bpp. This is a problem, but
- * at least without the pixmap cache we can pass the test suite */
- if (pScrn->depth != 24)
- infoPtr->Flags |= PIXMAP_CACHE;
+ infoPtr->Flags |= PIXMAP_CACHE;
/* Sync
*/
@@ -334,7 +293,7 @@ I810SetupForSolidFill(ScrnInfoPtr pScrn, int color, int rop,
/* Color blit, p166 */
pI810->BR[13] = (BR13_SOLID_PATTERN |
- (i810PatternRop[rop] << 16) |
+ (XAAPatternROP[rop] << 16) |
(pScrn->displayWidth * pI810->cpp));
pI810->BR[16] = color;
}
@@ -380,7 +339,7 @@ I810SetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir, int ydir, int rop,
if (xdir == -1)
pI810->BR[13] |= BR13_RIGHT_TO_LEFT;
- pI810->BR[13] |= i810Rop[rop] << 16;
+ pI810->BR[13] |= XAACopyROP[rop] << 16;
pI810->BR[18] = 0;
}
@@ -401,9 +360,12 @@ I810SubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int x1, int y1,
* This was developed empirically so it may not catch all
* cases.
*/
+#define I810_MWIDTH 8
+
if ( !(pI810->BR[13] & BR13_RIGHT_TO_LEFT) && (y2 - y1) < 3
- && (y2 - y1) >= 0 && (x2 - x1) <= (w + 4) && (w > 4))
- w = 4;
+ && (y2 - y1) >= 0 && (x2 - x1) <= (w + I810_MWIDTH)
+ && (w > I810_MWIDTH))
+ w = I810_MWIDTH;
do {
if (pI810->BR[13] & BR13_PITCH_SIGN_BIT) {
@@ -441,7 +403,10 @@ I810SubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int x1, int y1,
break;
x2 += w;
x1 += w;
- w = w_back;
+ if (w_back > I810_MWIDTH)
+ w = I810_MWIDTH;
+ else
+ w = w_back;
} while (1);
}
@@ -460,9 +425,9 @@ I810SetupForMono8x8PatternFill(ScrnInfoPtr pScrn, int pattx, int patty,
pI810->BR[18] = bg;
pI810->BR[19] = fg;
pI810->BR[13] = (pScrn->displayWidth * pI810->cpp);
- pI810->BR[13] |= i810PatternRop[rop] << 16;
+ pI810->BR[13] |= XAAPatternROP[rop] << 16;
if (bg == -1)
- pI810->BR[13] |= BR13_MONO_TRANSPCY;
+ pI810->BR[13] |= BR13_MONO_PATN_TRANS;
}
static void
@@ -524,7 +489,7 @@ I810SetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
fg, bg, rop, planemask);
pI810->BR[13] = (pScrn->displayWidth * pI810->cpp);
- pI810->BR[13] |= i810Rop[rop] << 16;
+ pI810->BR[13] |= XAACopyROP[rop] << 16;
pI810->BR[13] |= (1 << 27);
if (bg == -1)
pI810->BR[13] |= BR13_MONO_TRANSPCY;
diff --git a/src/i810_driver.c b/src/i810_driver.c
index e1f565f2..ee927432 100644
--- a/src/i810_driver.c
+++ b/src/i810_driver.c
@@ -25,8 +25,7 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
**************************************************************************/
-/* $XdotOrg: xc/programs/Xserver/hw/xfree86/drivers/i810/i810_driver.c,v 1.1.4.2 2003/12/06 13:24:24 kaleb Exp $ */
-/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/i810_driver.c,v 1.98 2003/12/07 18:28:07 dawes Exp $ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/i810_driver.c,v 1.102 2004/01/02 22:16:18 dawes Exp $ */
/*
* Reformatted with GNU indent (2.2.8), using the following options:
@@ -245,6 +244,8 @@ const char *I810xaaSymbols[] = {
"XAACreateInfoRec",
"XAADestroyInfoRec",
"XAAInit",
+ "XAACopyROP",
+ "XAAPatternROP",
NULL
};
@@ -377,6 +378,7 @@ i810Setup(pointer module, pointer opts, int *errmaj, int *errmin)
I810drmSymbols,
I810driSymbols,
I810shadowSymbols,
+ driShadowFBSymbols,
#endif
I810vbeSymbols, vbeOptionalSymbols,
I810ddcSymbols, I810int10Symbols, NULL);
@@ -2220,10 +2222,39 @@ Bool
I810SwitchMode(int scrnIndex, DisplayModePtr mode, int flags)
{
ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
+ I810Ptr pI810 = I810PTR(pScrn);
if (I810_DEBUG & DEBUG_VERBOSE_CURSOR)
ErrorF("I810SwitchMode %p %x\n", (void *)mode, flags);
+#ifdef XF86DRI
+ if (pI810->directRenderingEnabled) {
+ if (I810_DEBUG & DEBUG_VERBOSE_DRI)
+ ErrorF("calling dri lock\n");
+ DRILock(screenInfo.screens[scrnIndex], 0);
+ pI810->LockHeld = 1;
+ }
+#endif
+
+ if (pI810->AccelInfoRec != NULL) {
+ I810RefreshRing(pScrn);
+ I810Sync(pScrn);
+ pI810->AccelInfoRec->NeedToSync = FALSE;
+ }
+ I810Restore(pScrn);
+
+#ifdef XF86DRI
+ if (!I810DRIEnter(pScrn)) {
+ return FALSE;
+ }
+ if (pI810->directRenderingEnabled) {
+ if (I810_DEBUG & DEBUG_VERBOSE_DRI)
+ ErrorF("calling dri unlock\n");
+ DRIUnlock(screenInfo.screens[scrnIndex]);
+ pI810->LockHeld = 0;
+ }
+#endif
+
return I810ModeInit(pScrn, mode);
}
@@ -2357,6 +2388,11 @@ I810CloseScreen(int scrnIndex, ScreenPtr pScreen)
XAAInfoRecPtr infoPtr = pI810->AccelInfoRec;
if (pScrn->vtSema == TRUE) {
+ if (pI810->AccelInfoRec != NULL) {
+ I810RefreshRing(pScrn);
+ I810Sync(pScrn);
+ pI810->AccelInfoRec->NeedToSync = FALSE;
+ }
I810Restore(pScrn);
vgaHWLock(hwp);
}
diff --git a/src/i810_reg.h b/src/i810_reg.h
index c935982a..b21a89dd 100644
--- a/src/i810_reg.h
+++ b/src/i810_reg.h
@@ -1,4 +1,4 @@
-/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/i810_reg.h,v 1.13 2003/02/06 04:18:04 dawes Exp $ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/i810_reg.h,v 1.14 2004/01/02 20:22:17 dawes Exp $ */
/**************************************************************************
Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
@@ -497,6 +497,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#define BR13_RIGHT_TO_LEFT 0x40000000
#define BR13_LEFT_TO_RIGHT 0x00000000
#define BR13_MONO_TRANSPCY 0x20000000
+#define BR13_MONO_PATN_TRANS 0x10000000
#define BR13_USE_DYN_DEPTH 0x04000000
#define BR13_DYN_8BPP 0x00000000
#define BR13_DYN_16BPP 0x01000000
diff --git a/src/i830.h b/src/i830.h
index 6b1efa49..75ae7663 100644
--- a/src/i830.h
+++ b/src/i830.h
@@ -27,7 +27,7 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
**************************************************************************/
-/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/i830.h,v 1.11 2003/10/21 04:13:40 dawes Exp $ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/i830.h,v 1.12 2004/01/07 03:43:19 dawes Exp $ */
/*
* Authors:
@@ -302,6 +302,7 @@ typedef struct _I830Rec {
int yoffset;
int SaveGeneration;
+ Bool vbeRestoreWorkaround;
} I830Rec;
#define I830PTR(p) ((I830Ptr)((p)->driverPrivate))
diff --git a/src/i830_accel.c b/src/i830_accel.c
index 63dce22d..ee67e399 100644
--- a/src/i830_accel.c
+++ b/src/i830_accel.c
@@ -32,7 +32,7 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
**************************************************************************/
-/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/i830_accel.c,v 1.8 2003/04/24 18:00:24 eich Exp $ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/i830_accel.c,v 1.9 2003/12/22 12:27:07 alanh Exp $ */
/*
* Reformatted with GNU indent (2.2.8), using the following options:
@@ -55,48 +55,10 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include "xf86_ansic.h"
#include "xf86.h"
-
+#include "xaarop.h"
#include "i830.h"
#include "i810_reg.h"
-static unsigned int i810Rop[16] = {
- 0x00, /* GXclear */
- 0x88, /* GXand */
- 0x44, /* GXandReverse */
- 0xCC, /* GXcopy */
- 0x22, /* GXandInvert */
- 0xAA, /* GXnoop */
- 0x66, /* GXxor */
- 0xEE, /* GXor */
- 0x11, /* GXnor */
- 0x99, /* GXequiv */
- 0x55, /* GXinvert */
- 0xDD, /* GXorReverse */
- 0x33, /* GXcopyInvert */
- 0xBB, /* GXorInverted */
- 0x77, /* GXnand */
- 0xFF /* GXset */
-};
-
-static unsigned int i810PatternRop[16] = {
- 0x00, /* GXclear */
- 0xA0, /* GXand */
- 0x50, /* GXandReverse */
- 0xF0, /* GXcopy */
- 0x0A, /* GXandInvert */
- 0xAA, /* GXnoop */
- 0x5A, /* GXxor */
- 0xFA, /* GXor */
- 0x05, /* GXnor */
- 0xA5, /* GXequiv */
- 0x55, /* GXinvert */
- 0xF5, /* GXorReverse */
- 0x0F, /* GXcopyInvert */
- 0xAF, /* GXorInverted */
- 0x5F, /* GXnand */
- 0xFF /* GXset */
-};
-
int
I830WaitLpRing(ScrnInfoPtr pScrn, int n, int timeout_millis)
{
@@ -397,7 +359,7 @@ I830SetupForSolidFill(ScrnInfoPtr pScrn, int color, int rop,
ErrorF("I830SetupForFillRectSolid color: %x rop: %x mask: %x\n",
color, rop, planemask);
- pI830->BR[13] = ((i810PatternRop[rop] << 16) |
+ pI830->BR[13] = ((XAAPatternROP[rop] << 16) |
(pScrn->displayWidth * pI830->cpp));
pI830->BR[16] = color;
@@ -453,7 +415,7 @@ I830SetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir, int ydir, int rop,
xdir, ydir, rop, planemask, transparency_color);
pI830->BR[13] = (pScrn->displayWidth * pI830->cpp);
- pI830->BR[13] |= i810Rop[rop] << 16;
+ pI830->BR[13] |= XAACopyROP[rop] << 16;
switch (pScrn->bitsPerPixel) {
case 8:
@@ -519,7 +481,7 @@ I830SetupForMono8x8PatternFill(ScrnInfoPtr pScrn, int pattx, int patty,
pI830->BR[19] = fg;
pI830->BR[13] = (pScrn->displayWidth * pI830->cpp); /* In bytes */
- pI830->BR[13] |= i810PatternRop[rop] << 16;
+ pI830->BR[13] |= XAAPatternROP[rop] << 16;
if (bg == -1)
pI830->BR[13] |= (1 << 28);
@@ -608,7 +570,7 @@ I830SetupForScanlineCPUToScreenColorExpandFill(ScrnInfoPtr pScrn,
/* Fill out register values */
pI830->BR[13] = (pScrn->displayWidth * pI830->cpp);
- pI830->BR[13] |= i810Rop[rop] << 16;
+ pI830->BR[13] |= XAACopyROP[rop] << 16;
if (bg == -1)
pI830->BR[13] |= (1 << 29);
@@ -697,7 +659,7 @@ I830SetupForScanlineImageWrite(ScrnInfoPtr pScrn, int rop,
/* Fill out register values */
pI830->BR[13] = (pScrn->displayWidth * pI830->cpp);
- pI830->BR[13] |= i810Rop[rop] << 16;
+ pI830->BR[13] |= XAACopyROP[rop] << 16;
switch (pScrn->bitsPerPixel) {
case 8:
diff --git a/src/i830_driver.c b/src/i830_driver.c
index 539dcece..aa8dee2e 100644
--- a/src/i830_driver.c
+++ b/src/i830_driver.c
@@ -1,4 +1,4 @@
-/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/i830_driver.c,v 1.47 2003/11/03 14:47:28 alanh Exp $ */
+/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/i810/i830_driver.c,v 1.49 2004/01/25 16:57:48 dawes Exp $ */
/**************************************************************************
Copyright 2001 VA Linux Systems Inc., Fremont, California.
@@ -201,7 +201,8 @@ typedef enum {
OPTION_PAGEFLIP,
OPTION_XVIDEO,
OPTION_VIDEO_KEY,
- OPTION_COLOR_KEY
+ OPTION_COLOR_KEY,
+ OPTION_VBE_RESTORE
} I830Opts;
static OptionInfoRec I830BIOSOptions[] = {
@@ -213,6 +214,7 @@ static OptionInfoRec I830BIOSOptions[] = {
{OPTION_XVIDEO, "XVideo", OPTV_BOOLEAN, {0}, TRUE},
{OPTION_COLOR_KEY, "ColorKey", OPTV_INTEGER, {0}, FALSE},
{OPTION_VIDEO_KEY, "VideoKey", OPTV_INTEGER, {0}, FALSE},
+ {OPTION_VBE_RESTORE, "VBERestore", OPTV_BOOLEAN, {0}, FALSE},
{-1, NULL, OPTV_NONE, {0}, FALSE}
};
/* *INDENT-ON* */
@@ -2124,6 +2126,16 @@ I830BIOSPreInit(ScrnInfoPtr pScrn, int flags)
VBEFreeVBEInfo(pI830->vbeInfo);
vbeFree(pVbe);
+ /* Use the VBE mode restore workaround by default. */
+ pI830->vbeRestoreWorkaround = TRUE;
+ from = X_DEFAULT;
+ if (xf86ReturnOptValBool(pI830->Options, OPTION_VBE_RESTORE, FALSE)) {
+ pI830->vbeRestoreWorkaround = FALSE;
+ from = X_CONFIG;
+ }
+ xf86DrvMsg(pScrn->scrnIndex, from, "VBE Restore workaround: %s.\n",
+ pI830->vbeRestoreWorkaround ? "enabled" : "disabled");
+
#if defined(XF86DRI)
/* Load the dri module if requested. */
if (xf86ReturnOptValBool(pI830->Options, OPTION_DRI, FALSE) &&
@@ -2329,10 +2341,6 @@ SaveHWState(ScrnInfoPtr pScrn)
vgaHWUnlock(hwp);
vgaHWSave(pScrn, vgaReg, VGA_SR_FONTS);
-#ifndef I845G_VBE_WORKAROUND
-#define I845G_VBE_WORKAROUND 1
-#endif
-
pVesa = pI830->vesa;
/*
* This save/restore method doesn't work for 845G BIOS, or for some
@@ -2344,7 +2352,7 @@ SaveHWState(ScrnInfoPtr pScrn)
* registers, turning off the irq & breaking the kernel module
* behaviour.
*/
- if (!I845G_VBE_WORKAROUND) {
+ if (!pI830->vbeRestoreWorkaround) {
CARD16 imr = INREG16(IMR);
CARD16 ier = INREG16(IER);
CARD16 hwstam = INREG16(HWSTAM);
@@ -2540,6 +2548,22 @@ I830VESASetMode(ScrnInfoPtr pScrn, DisplayModePtr pMode)
}
/*
+ * Test if the extendedRefresh BIOS function is supported.
+ */
+ if (pI830->useExtendedRefresh && !pI830->vesa->useDefaultRefresh &&
+ (mode & (1 << 11)) && data && data->data && data->block) {
+ if (!SetRefreshRate(pScrn, mode, 60)) {
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "BIOS call 0x5f05 not supported, "
+ "setting refresh with VBE 3 method.\n");
+ pI830->useExtendedRefresh = FALSE;
+ pI830->enableDisplays = FALSE;
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "Not using BIOS call 0x5f64 to enable displays.\n");
+ }
+ }
+
+ /*
* The BIOS may not set a scanline pitch that would require more video
* memory than it's aware of. We check for this later, and set it
* explicitly if necessary.