summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIan Romanick <idr@us.ibm.com>2007-08-22 11:45:43 -0700
committerIan Romanick <idr@us.ibm.com>2007-08-22 11:45:43 -0700
commit68ceead721aeb75b9faed6297407a320a83499e4 (patch)
tree29a83a029708680b7be5218da5f0ad916ae5e762 /src
parentda23218b067d9b1808fc1168737c79b3349af09e (diff)
parentbf5e2a5d33fbab07bc3606927c58a3a04a5c9b1e (diff)
Merge branch 'master' into pci-rework
Conflicts: src/savage_driver.h
Diffstat (limited to 'src')
-rw-r--r--src/savage_bci.h6
-rw-r--r--src/savage_driver.c104
-rw-r--r--src/savage_driver.h8
-rw-r--r--src/savage_exa.c142
-rw-r--r--src/savage_video.c32
5 files changed, 190 insertions, 102 deletions
diff --git a/src/savage_bci.h b/src/savage_bci.h
index 833a55d..410925d 100644
--- a/src/savage_bci.h
+++ b/src/savage_bci.h
@@ -118,6 +118,12 @@
#define BCI_SET_REGISTER_COUNT(count) ((count) << 16)
#define BCI_BITPLANE_WRITE_MASK 0xD7
#define BCI_BITPLANE_READ_MASK 0xD8
+#define BCI_GBD_1 0xE0
+#define BCI_GBD_2 0xE1
+#define BCI_PBD_1 0xE2
+#define BCI_PBD_2 0xE3
+#define BCI_SBD_1 0xE4
+#define BCI_SBD_2 0xE5
#define BCI_W_H(w, h) ((((h) << 16) | (w)) & 0x0FFF0FFF)
#define BCI_X_Y(x, y) ((((y) << 16) | (x)) & 0x0FFF0FFF)
diff --git a/src/savage_driver.c b/src/savage_driver.c
index c76147f..9975119 100644
--- a/src/savage_driver.c
+++ b/src/savage_driver.c
@@ -39,6 +39,8 @@
#include "config.h"
#endif
+#include <unistd.h>
+
#include "xf86RAC.h"
#include "shadowfb.h"
@@ -235,6 +237,7 @@ typedef enum {
,OPTION_DMA_MODE
,OPTION_AGP_MODE
,OPTION_AGP_SIZE
+ ,OPTION_DRI
} SavageOpts;
@@ -267,6 +270,7 @@ static const OptionInfoRec SavageOptions[] =
{ OPTION_DMA_MODE, "DmaMode", OPTV_ANYSTR, {0}, FALSE },
{ OPTION_AGP_MODE, "AGPMode", OPTV_INTEGER, {0}, FALSE },
{ OPTION_AGP_SIZE, "AGPSize", OPTV_INTEGER, {0}, FALSE },
+ { OPTION_DRI, "DRI", OPTV_BOOLEAN, {0}, TRUE },
#endif
{ -1, NULL, OPTV_NONE, {0}, FALSE }
};
@@ -770,9 +774,9 @@ static void SavageFreeRec(ScrnInfoPtr pScrn)
TRACE(( "SavageFreeRec(%x)\n", pScrn->driverPrivate ));
if (!pScrn->driverPrivate)
return;
+ SavageUnmapMem(pScrn, 1);
xfree(pScrn->driverPrivate);
pScrn->driverPrivate = NULL;
- SavageUnmapMem(pScrn, 1);
}
@@ -908,6 +912,63 @@ static void SavageDoDDC(ScrnInfoPtr pScrn)
}
}
+/* Copied from ddc/Property.c via nv */
+static DisplayModePtr
+SavageModesAdd(DisplayModePtr Modes, DisplayModePtr Additions)
+{
+ if (!Modes) {
+ if (Additions)
+ return Additions;
+ else
+ return NULL;
+ }
+
+ if (Additions) {
+ DisplayModePtr Mode = Modes;
+
+ while (Mode->next)
+ Mode = Mode->next;
+
+ Mode->next = Additions;
+ Additions->prev = Mode;
+ }
+
+ return Modes;
+}
+
+/* borrowed from nv */
+static void
+SavageAddPanelMode(ScrnInfoPtr pScrn)
+{
+ SavagePtr psav= SAVPTR(pScrn);
+ DisplayModePtr Mode = NULL;
+
+ Mode = xf86CVTMode(psav->PanelX, psav->PanelY, 60.00, TRUE, FALSE);
+ Mode->type = M_T_DRIVER | M_T_PREFERRED;
+ pScrn->monitor->Modes = SavageModesAdd(pScrn->monitor->Modes, Mode);
+
+ if ((pScrn->monitor->nHsync == 0) &&
+ (pScrn->monitor->nVrefresh == 0)) {
+ if (!Mode->HSync)
+ Mode->HSync = ((float) Mode->Clock ) / ((float) Mode->HTotal);
+ if (!Mode->VRefresh)
+ Mode->VRefresh = (1000.0 * ((float) Mode->Clock)) /
+ ((float) (Mode->HTotal * Mode->VTotal));
+
+ if (Mode->HSync < pScrn->monitor->hsync[0].lo)
+ pScrn->monitor->hsync[0].lo = Mode->HSync;
+ if (Mode->HSync > pScrn->monitor->hsync[0].hi)
+ pScrn->monitor->hsync[0].hi = Mode->HSync;
+ if (Mode->VRefresh < pScrn->monitor->vrefresh[0].lo)
+ pScrn->monitor->vrefresh[0].lo = Mode->VRefresh;
+ if (Mode->VRefresh > pScrn->monitor->vrefresh[0].hi)
+ pScrn->monitor->vrefresh[0].hi = Mode->VRefresh;
+
+ pScrn->monitor->nHsync = 1;
+ pScrn->monitor->nVrefresh = 1;
+ }
+}
+
static void SavageGetPanelInfo(ScrnInfoPtr pScrn)
{
SavagePtr psav= SAVPTR(pScrn);
@@ -1139,15 +1200,23 @@ static Bool SavagePreInit(ScrnInfoPtr pScrn, int flags)
if ((s = xf86GetOptValString(psav->Options, OPTION_ROTATE))) {
if(!xf86NameCmp(s, "CW")) {
/* accel is disabled below for shadowFB */
+ /* RandR is disabled when the Rotate option is used (does
+ * not work well together and scrambles the screen) */
+
psav->shadowFB = TRUE;
psav->rotate = 1;
+ xf86DisableRandR();
xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
- "Rotating screen clockwise - acceleration disabled\n");
+ "Rotating screen clockwise"
+ "- acceleration and RandR disabled\n");
} else if(!xf86NameCmp(s, "CCW")) {
psav->shadowFB = TRUE;
psav->rotate = -1;
- xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Rotating screen"
- "counter clockwise - acceleration disabled\n");
+ xf86DisableRandR();
+ xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
+ "Rotating screen counter clockwise"
+ " - acceleration and RandR disabled\n");
+
} else {
xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "\"%s\" is not a valid"
"value for Option \"Rotate\"\n", s);
@@ -1858,6 +1927,7 @@ static Bool SavagePreInit(ScrnInfoPtr pScrn, int flags)
if(psav->DisplayType == MT_LCD)
{
SavageGetPanelInfo(pScrn);
+ SavageAddPanelMode(pScrn);
}
#if 0
@@ -2997,6 +3067,9 @@ static Bool SavageScreenInit(int scrnIndex, ScreenPtr pScreen,
SavageEnableMMIO(pScrn);
+ if (!SavageMapMem(pScrn))
+ return FALSE;
+
psav->FBStart2nd = 0;
if (psav->overlayDepth) {
@@ -3018,8 +3091,12 @@ static Bool SavageScreenInit(int scrnIndex, ScreenPtr pScreen,
vgaHWBlankScreen(pScrn, TRUE);
#ifdef XF86DRI
- if (psav->IsSecondary) {
- psav->directRenderingEnabled = FALSE;
+ if (!xf86ReturnOptValBool(psav->Options, OPTION_DRI, TRUE)) {
+ psav->directRenderingEnabled = FALSE;
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "Direct rendering forced off\n");
+ } else if (psav->IsSecondary) {
+ psav->directRenderingEnabled = FALSE;
} else if (xf86IsEntityShared(psav->pEnt->index)) {
/* Xinerama has sync problem with DRI, disable it for now */
psav->directRenderingEnabled = FALSE;
@@ -3732,6 +3809,8 @@ static Bool SavageCloseScreen(int scrnIndex, ScreenPtr pScreen)
#ifdef XF86DRI
if (psav->directRenderingEnabled) {
SAVAGEDRICloseScreen(pScreen);
+ /* reset shadow values */
+ SavageInitShadowStatus(pScrn);
psav->directRenderingEnabled=FALSE;
}
#endif
@@ -3807,7 +3886,6 @@ void
SavageDoAdjustFrame(ScrnInfoPtr pScrn, int x, int y, int crtc2)
{
SavagePtr psav = SAVPTR(pScrn);
- DisplayModePtr currentMode = pScrn->currentMode;
int address=0,top=0,left=0,tile_height,tile_size;
TRACE(("SavageDoAdjustFrame(%d,%d,%x)\n", x, y, flags));
@@ -3838,15 +3916,6 @@ SavageDoAdjustFrame(ScrnInfoPtr pScrn, int x, int y, int crtc2)
address += pScrn->fbOffset;
- /*
- * because we align the viewport to the width and height of one tile
- * we should update the locate of frame
- */
- pScrn->frameX0 = left;
- pScrn->frameY0 = top;
- pScrn->frameX1 = left + currentMode->HDisplay - 1;
- pScrn->frameY1 = top + currentMode->VDisplay - 1;
-
if (psav->Chipset == S3_SAVAGE_MX) {
if (!crtc2) {
OUTREG32(PRI_STREAM_FBUF_ADDR0, address & 0xFFFFFFFC);
@@ -4065,9 +4134,6 @@ void SavageLoadPaletteSavage4(ScrnInfoPtr pScrn, int numColors, int *indicies,
}
static void SavageCalcClock(long freq, int min_m, int min_n1, int max_n1,
-
- /* Make sure linear addressing is enabled after the BIOS call. */
- /* Note that we must use an I/O port to do this. */
int min_n2, int max_n2, long freq_min,
long freq_max, unsigned int *mdiv,
unsigned int *ndiv, unsigned int *r)
diff --git a/src/savage_driver.h b/src/savage_driver.h
index cb6b557..9286c1e 100644
--- a/src/savage_driver.h
+++ b/src/savage_driver.h
@@ -180,10 +180,10 @@ typedef struct
#define SAVAGE_TV_ON 4
#define SAVAGE_DRIVER_NAME "savage"
-#define SAVAGE_DRIVER_VERSION "2.1.2"
-#define SAVAGE_VERSION_MAJOR 2
-#define SAVAGE_VERSION_MINOR 1
-#define SAVAGE_PATCHLEVEL 2
+#define SAVAGE_DRIVER_VERSION PACKAGE_VERSION
+#define SAVAGE_VERSION_MAJOR PACKAGE_VERSION_MAJOR
+#define SAVAGE_VERSION_MINOR PACKAGE_VERSION_MINOR
+#define SAVAGE_PATCHLEVEL PACKAGE_VERSION_PATCHLEVEL
#define SAVAGE_VERSION ((SAVAGE_VERSION_MAJOR << 24) | \
(SAVAGE_VERSION_MINOR << 16) | \
SAVAGE_PATCHLEVEL)
diff --git a/src/savage_exa.c b/src/savage_exa.c
index 8e6da38..aa6905a 100644
--- a/src/savage_exa.c
+++ b/src/savage_exa.c
@@ -95,29 +95,30 @@ static int SavageGetCopyROP(int rop) {
}
-static int SavageGetCopyROP_PM(int rop) {
+static int SavageGetSolidROP(int rop) {
- int ALUCopyROP_PM[16] =
+ int ALUSolidROP[16] =
{
- 0x00, /*ROP_0*/ /* not used */
- 0x75, /*ROP_DSPnoa*/
- 0x45, /*ROP_DPSnaon*/
- 0xCA, /*ROP_DPSDxax*/
- 0xD5, /*ROP_DPSana*/
- 0xAA, /*ROP_D*/ /* not used */
- 0x6A, /*ROP_DPSax*/
- 0xEA, /*ROP_DPSao*/
- 0x15, /*ROP_DPSaon*/
- 0x95, /*ROP_DPSaxn*/
- 0x55, /*ROP_Dn*/ /* not used */
- 0xD5, /*ROP_DPSanan*/
- 0x2E, /*ROP_PSDPxox*/ /* is that correct ? */
- 0xBA, /*ROP_DPSnao*/
- 0x75, /*ROP_DSPnoan*/
- 0xFF, /*ROP_1*/ /* not used */
+ /* GXclear */ 0x00, /* 0 */
+ /* GXand */ 0xA0, /* src AND dst */
+ /* GXandReverse */ 0x50, /* src AND NOT dst */
+ /* GXcopy */ 0xF0, /* src */
+ /* GXandInverted*/ 0x0A, /* NOT src AND dst */
+ /* GXnoop */ 0xAA, /* dst */
+ /* GXxor */ 0x5A, /* src XOR dst */
+ /* GXor */ 0xFA, /* src OR dst */
+ /* GXnor */ 0x05, /* NOT src AND NOT dst */
+ /* GXequiv */ 0xA5, /* NOT src XOR dst */
+ /* GXinvert */ 0x55, /* NOT dst */
+ /* GXorReverse */ 0xF5, /* src OR NOT dst */
+ /* GXcopyInverted*/ 0x0F, /* NOT src */
+ /* GXorInverted */ 0xAF, /* NOT src OR dst */
+ /* GXnand */ 0x5F, /* NOT src OR NOT dst */
+ /* GXset */ 0xFF, /* 1 */
+
};
- return (ALUCopyROP_PM[rop]);
+ return (ALUSolidROP[rop]);
}
@@ -171,14 +172,14 @@ SavageEXAInit(ScreenPtr pScreen)
if (psav->Chipset == S3_SAVAGE2000 ||
psav->Chipset == S3_SUPERSAVAGE) {
- psav->EXADriverPtr->pixmapOffsetAlign = 128; /* octword */
+ psav->EXADriverPtr->pixmapOffsetAlign = 16; /* octword */
} else {
- psav->EXADriverPtr->pixmapOffsetAlign = 64; /* qword */
+ psav->EXADriverPtr->pixmapOffsetAlign = 8; /* quadword */
}
/* engine has 12 bit coordinates */
- psav->EXADriverPtr->maxX = 4095;
- psav->EXADriverPtr->maxY = 4095;
+ psav->EXADriverPtr->maxX = 4096;
+ psav->EXADriverPtr->maxY = 4096;
/* Sync */
psav->EXADriverPtr->WaitMarker = SavageEXASync;
@@ -200,7 +201,7 @@ SavageEXAInit(ScreenPtr pScreen)
/* host data blit */
psav->EXADriverPtr->UploadToScreen = SavageUploadToScreen;
#endif
-#if 1
+#if 0
psav->EXADriverPtr->DownloadFromScreen = SavageDownloadFromScreen;
#endif
@@ -272,17 +273,52 @@ SavagePrepareSolid(PixmapPtr pPixmap, int alu, Pixel planemask, Pixel fg)
{
ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
SavagePtr psav = SAVPTR(pScrn);
- int cmd;
+ int cmd, rop;
BCI_GET_PTR;
- /*ErrorF("in preparesolid\n");*/
+ /* HW seems to ignore alpha */
+ if (pPixmap->drawable.bitsPerPixel == 32)
+ return FALSE;
cmd = BCI_CMD_RECT
| BCI_CMD_RECT_XP | BCI_CMD_RECT_YP
- | BCI_CMD_DEST_PBD_NEW | BCI_CMD_SRC_SOLID
- | BCI_CMD_SEND_COLOR;
-
- BCI_CMD_SET_ROP( cmd, SavageGetCopyROP(alu) );
+ | BCI_CMD_DEST_PBD /*BCI_CMD_DEST_PBD_NEW*/
+ | BCI_CMD_SRC_SOLID;
+
+#if 0
+ if (alu == 3 /*GXcopy*/) {
+ if (fg == 0)
+ alu = 0 /*GXclear*/;
+ else if (fg == planemask)
+ alu = 15 /*GXset*/;
+ }
+
+ if (EXA_PM_IS_SOLID(&pPixmap->drawable, planemask)) {
+ if (!((alu == 5 /*GXnoop*/) || (alu == 15 /*GXset*/) || (alu == 0 /*GXclear*/) || (alu == 10 /*GXinvert*/)))
+ cmd |= BCI_CMD_SEND_COLOR;
+ rop = SavageGetCopyROP(alu);
+ } else {
+ switch(alu) {
+ case 5 /*GXnoop*/:
+ break;
+ case 15 /*GXset*/:
+ case 0 /*GXclear*/:
+ case 10 /*GXinvert*/:
+ cmd |= BCI_CMD_SEND_COLOR;
+ fg = planemask;
+ break;
+ default:
+ cmd |= BCI_CMD_SEND_COLOR;
+ break;
+ }
+ rop = SavageGetSolidROP(alu);
+ }
+#else
+ cmd |= BCI_CMD_SEND_COLOR;
+ rop = SavageGetSolidROP(alu);
+#endif
+
+ BCI_CMD_SET_ROP( cmd, rop );
psav->pbd_offset = exaGetPixmapOffset(pPixmap);
psav->pbd_high = SavageSetBD(psav, pPixmap);
@@ -290,17 +326,18 @@ SavagePrepareSolid(PixmapPtr pPixmap, int alu, Pixel planemask, Pixel fg)
psav->SavedBciCmd = cmd;
psav->SavedFgColor = fg;
- psav->WaitQueue(psav,6);
+ psav->WaitQueue(psav,5);
BCI_SEND(BCI_SET_REGISTER
| BCI_SET_REGISTER_COUNT(1)
| BCI_BITPLANE_WRITE_MASK);
BCI_SEND(planemask);
- BCI_SEND(psav->SavedBciCmd);
+ BCI_SEND(BCI_SET_REGISTER
+ | BCI_SET_REGISTER_COUNT(2)
+ | BCI_PBD_1);
BCI_SEND(psav->pbd_offset);
BCI_SEND(psav->pbd_high);
- BCI_SEND(psav->SavedFgColor);
return TRUE;
}
@@ -313,11 +350,17 @@ SavageSolid(PixmapPtr pPixmap, int x1, int y1, int x2, int y2)
int w = x2 - x1;
int h = y2 - y1;
BCI_GET_PTR;
-
- if( !w || !h )
- return;
- psav->WaitQueue(psav,2);
+ /* yes, it has to be done this way... */
+ psav->WaitQueue(psav,4);
+ BCI_SEND(psav->SavedBciCmd);
+ /*BCI_SEND(psav->pbd_offset);
+ BCI_SEND(psav->pbd_high);*/
+#if 0
+ if ( psav->SavedBciCmd & BCI_CMD_SEND_COLOR )
+ BCI_SEND(psav->SavedFgColor);
+#endif
+ BCI_SEND(psav->SavedFgColor);
BCI_SEND(BCI_X_Y(x1, y1));
BCI_SEND(BCI_W_H(w, h));
@@ -412,18 +455,19 @@ SavageUploadToScreen(PixmapPtr pDst, int x, int y, int w, int h, char *src, int
ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum];
SavagePtr psav = SAVPTR(pScrn);
BCI_GET_PTR;
- int i, j, dwords, Bpp;
+ int i, j, dwords, queue, Bpp;
unsigned int cmd;
CARD32 * srcp;
Bpp = pDst->drawable.bitsPerPixel / 8;
- dwords = ((w * Bpp) + 3) >> 2;
+ dwords = (((w * Bpp) + 3) >> 2) * h;
psav->sbd_offset = exaGetPixmapOffset(pDst);
psav->sbd_high = SavageSetBD(psav, pDst);
cmd = BCI_CMD_RECT
| BCI_CMD_RECT_XP | BCI_CMD_RECT_YP
+ | BCI_CMD_CLIP_LR
| BCI_CMD_DEST_SBD_NEW
| BCI_CMD_SRC_COLOR; /* host color data */
@@ -442,17 +486,21 @@ SavageUploadToScreen(PixmapPtr pDst, int x, int y, int w, int h, char *src, int
BCI_SEND(BCI_X_Y(x, y));
BCI_SEND(BCI_W_H(w, h));
- for (i = 0; i < h; i++) {
- srcp = (CARD32 *)src;
- BCI_RESET;
- for (j = dwords; j > 0; j--) {
- CARD32 dw = *srcp;
- BCI_SEND(dw);
- srcp++;
+ srcp = (CARD32 *)src;
+ queue = 120 * 1024;
+ while (dwords) {
+ if (queue < 4) {
+ BCI_RESET;
+ queue = 120 * 1024;
}
- src += src_pitch;
+ BCI_SEND(*srcp);
+ queue -= 4;
+ dwords--;
+ srcp++;
}
+ /*exaWaitSync(pDst->drawable.pScreen);*/
+
return TRUE;
}
diff --git a/src/savage_video.c b/src/savage_video.c
index ed45b0f..64dcef1 100644
--- a/src/savage_video.c
+++ b/src/savage_video.c
@@ -1378,39 +1378,7 @@ SavageAllocateMemory(
}
offset = linear->offset * cpp;
}
-#if 0
- if(area) {
- if((area->box.y2 - area->box.y1) >= numlines)
- return area;
-
- if(xf86ResizeOffscreenArea(area, pScrn->displayWidth, numlines))
- return area;
-
- xf86FreeOffscreenArea(area);
- }
-
- pScreen = screenInfo.screens[pScrn->scrnIndex];
-
- xf86PurgeUnlockedOffscreenAreas(pScreen);
- new_area = xf86AllocateOffscreenArea(pScreen, pScrn->displayWidth,
- numlines, 0, NULL, NULL, NULL);
- if(!new_area) {
- int max_w, max_h;
-
- xf86QueryLargestOffscreenArea(pScreen, &max_w, &max_h, 0,
- FAVOR_WIDTH_THEN_AREA, PRIORITY_EXTREME);
-
- if((max_w < pScrn->displayWidth) || (max_h < numlines))
- return NULL;
-
- xf86PurgeUnlockedOffscreenAreas(pScreen);
- new_area = xf86AllocateOffscreenArea(pScreen, pScrn->displayWidth,
- numlines, 0, NULL, NULL, NULL);
- }
-
- return new_area;
-#endif
return offset;
}