You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
409 lines
14 KiB
409 lines
14 KiB
From 9a151d87fb084a914ad76f77be78f720448fa201 Mon Sep 17 00:00:00 2001 |
|
From: Adam Jackson <ajax@redhat.com> |
|
Date: Tue, 25 Jan 2022 13:37:14 -0500 |
|
Subject: [PATCH xf86-video-fbdev] mustard: Enable linking with -z now |
|
|
|
The xfree86 design loads the fb, fbdev, and shadow modules _after_ the |
|
driver is loaded, which means we need to dlsym^WLoaderSymbol for the API |
|
we need ourselves. |
|
--- |
|
src/fbdev.c | 152 ++++++++++++++++++++++++++++++++++++++-------------- |
|
1 file changed, 113 insertions(+), 39 deletions(-) |
|
|
|
diff --git a/src/fbdev.c b/src/fbdev.c |
|
index e4f66a2..ee3a716 100644 |
|
--- a/src/fbdev.c |
|
+++ b/src/fbdev.c |
|
@@ -77,6 +77,75 @@ static Bool FBDevDriverFunc(ScrnInfoPtr pScrn, xorgDriverFuncOp op, |
|
|
|
enum { FBDEV_ROTATE_NONE=0, FBDEV_ROTATE_CW=270, FBDEV_ROTATE_UD=180, FBDEV_ROTATE_CCW=90 }; |
|
|
|
+static typeof(fbdevHWAdjustFrame) *my_fbdevHWAdjustFrame; |
|
+static typeof(fbdevHWDPMSSet) *my_fbdevHWDPMSSet; |
|
+static typeof(fbdevHWEnterVT) *my_fbdevHWEnterVT; |
|
+static typeof(fbdevHWGetDepth) *my_fbdevHWGetDepth; |
|
+static typeof(fbdevHWGetLineLength) *my_fbdevHWGetLineLength; |
|
+static typeof(fbdevHWGetName) *my_fbdevHWGetName; |
|
+static typeof(fbdevHWGetType) *my_fbdevHWGetType; |
|
+static typeof(fbdevHWGetVidmem) *my_fbdevHWGetVidmem; |
|
+static typeof(fbdevHWInit) *my_fbdevHWInit; |
|
+static typeof(fbdevHWLeaveVT) *my_fbdevHWLeaveVT; |
|
+static typeof(fbdevHWLinearOffset) *my_fbdevHWLinearOffset; |
|
+static typeof(fbdevHWLoadPalette) *my_fbdevHWLoadPalette; |
|
+static typeof(fbdevHWMapVidmem) *my_fbdevHWMapVidmem; |
|
+static typeof(fbdevHWModeInit) *my_fbdevHWModeInit; |
|
+static typeof(fbdevHWProbe) *my_fbdevHWProbe; |
|
+static typeof(fbdevHWRestore) *my_fbdevHWRestore; |
|
+static typeof(fbdevHWSave) *my_fbdevHWSave; |
|
+static typeof(fbdevHWSaveScreen) *my_fbdevHWSaveScreen; |
|
+static typeof(fbdevHWSetVideoModes) *my_fbdevHWSetVideoModes; |
|
+static typeof(fbdevHWSwitchMode) *my_fbdevHWSwitchMode; |
|
+static typeof(fbdevHWUnmapVidmem) *my_fbdevHWUnmapVidmem; |
|
+static typeof(fbdevHWUseBuildinMode) *my_fbdevHWUseBuildinMode; |
|
+static typeof(fbdevHWValidMode) *my_fbdevHWValidMode; |
|
+ |
|
+static void |
|
+bind_fbdevhw(void) |
|
+{ |
|
+ my_fbdevHWAdjustFrame = LoaderSymbol("fbdevHWAdjustFrame"); |
|
+ my_fbdevHWDPMSSet = LoaderSymbol("fbdevHWDPMSSet"); |
|
+ my_fbdevHWEnterVT = LoaderSymbol("fbdevHWEnterVT"); |
|
+ my_fbdevHWGetDepth = LoaderSymbol("fbdevHWGetDepth"); |
|
+ my_fbdevHWGetLineLength = LoaderSymbol("fbdevHWGetLineLength"); |
|
+ my_fbdevHWGetName = LoaderSymbol("fbdevHWGetName"); |
|
+ my_fbdevHWGetType = LoaderSymbol("fbdevHWGetType"); |
|
+ my_fbdevHWGetVidmem = LoaderSymbol("fbdevHWGetVidmem"); |
|
+ my_fbdevHWInit = LoaderSymbol("fbdevHWInit"); |
|
+ my_fbdevHWLeaveVT = LoaderSymbol("fbdevHWLeaveVT"); |
|
+ my_fbdevHWLinearOffset = LoaderSymbol("fbdevHWLinearOffset"); |
|
+ my_fbdevHWLoadPalette = LoaderSymbol("fbdevHWLoadPalette"); |
|
+ my_fbdevHWMapVidmem = LoaderSymbol("fbdevHWMapVidmem"); |
|
+ my_fbdevHWModeInit = LoaderSymbol("fbdevHWModeInit"); |
|
+ my_fbdevHWProbe = LoaderSymbol("fbdevHWProbe"); |
|
+ my_fbdevHWRestore = LoaderSymbol("fbdevHWRestore"); |
|
+ my_fbdevHWSave = LoaderSymbol("fbdevHWSave"); |
|
+ my_fbdevHWSaveScreen = LoaderSymbol("fbdevHWSaveScreen"); |
|
+ my_fbdevHWSetVideoModes = LoaderSymbol("fbdevHWSetVideoModes"); |
|
+ my_fbdevHWSwitchMode = LoaderSymbol("fbdevHWSwitchMode"); |
|
+ my_fbdevHWUnmapVidmem = LoaderSymbol("fbdevHWUnmapVidmem"); |
|
+ my_fbdevHWUseBuildinMode = LoaderSymbol("fbdevHWUseBuildinMode"); |
|
+ my_fbdevHWValidMode = LoaderSymbol("fbdevHWValidMode"); |
|
+} |
|
+ |
|
+static typeof(shadowAdd) *my_shadowAdd; |
|
+static typeof(shadowRemove) *my_shadowRemove; |
|
+static typeof(shadowSetup) *my_shadowSetup; |
|
+static typeof(shadowUpdate32to24) *my_shadowUpdate32to24; |
|
+static typeof(shadowUpdatePacked) *my_shadowUpdatePacked; |
|
+static typeof(shadowUpdateRotatePacked) *my_shadowUpdateRotatePacked; |
|
+ |
|
+static void |
|
+bind_shadow(void) |
|
+{ |
|
+ my_shadowAdd = LoaderSymbol("shadowAdd"); |
|
+ my_shadowRemove = LoaderSymbol("shadowRemove"); |
|
+ my_shadowSetup = LoaderSymbol("shadowSetup"); |
|
+ my_shadowUpdate32to24 = LoaderSymbol("shadowUpdate32to24"); |
|
+ my_shadowUpdatePacked = LoaderSymbol("shadowUpdatePacked"); |
|
+ my_shadowUpdateRotatePacked = LoaderSymbol("shadowUpdateRotatePacked"); |
|
+} |
|
|
|
/* -------------------------------------------------------------------- */ |
|
|
|
@@ -235,31 +304,31 @@ FBDevIdentify(int flags) |
|
static Bool |
|
fbdevSwitchMode(ScrnInfoPtr pScrn, DisplayModePtr mode) |
|
{ |
|
- return fbdevHWSwitchMode(pScrn, mode); |
|
+ return my_fbdevHWSwitchMode(pScrn, mode); |
|
} |
|
|
|
static void |
|
fbdevAdjustFrame(ScrnInfoPtr pScrn, int x, int y) |
|
{ |
|
- fbdevHWAdjustFrame(pScrn, x, y); |
|
+ my_fbdevHWAdjustFrame(pScrn, x, y); |
|
} |
|
|
|
static Bool |
|
fbdevEnterVT(ScrnInfoPtr pScrn) |
|
{ |
|
- return fbdevHWEnterVT(pScrn); |
|
+ return my_fbdevHWEnterVT(pScrn); |
|
} |
|
|
|
static void |
|
fbdevLeaveVT(ScrnInfoPtr pScrn) |
|
{ |
|
- fbdevHWLeaveVT(pScrn); |
|
+ my_fbdevHWLeaveVT(pScrn); |
|
} |
|
|
|
static ModeStatus |
|
fbdevValidMode(ScrnInfoPtr pScrn, DisplayModePtr mode, Bool verbose, int flags) |
|
{ |
|
- return fbdevHWValidMode(pScrn, mode, verbose, flags); |
|
+ return my_fbdevHWValidMode(pScrn, mode, verbose, flags); |
|
} |
|
|
|
#ifdef XSERVER_LIBPCIACCESS |
|
@@ -270,6 +339,7 @@ static Bool FBDevPciProbe(DriverPtr drv, int entity_num, |
|
|
|
if (!xf86LoadDrvSubModule(drv, "fbdevhw")) |
|
return FALSE; |
|
+ bind_fbdevhw(); |
|
|
|
pScrn = xf86ConfigPciEntity(NULL, 0, entity_num, NULL, NULL, |
|
NULL, NULL, NULL, NULL); |
|
@@ -279,7 +349,7 @@ static Bool FBDevPciProbe(DriverPtr drv, int entity_num, |
|
pScrn->entityInstanceList[0]); |
|
|
|
device = xf86FindOptionValue(devSection->options, "fbdev"); |
|
- if (fbdevHWProbe(dev, device, NULL)) { |
|
+ if (my_fbdevHWProbe(dev, device, NULL)) { |
|
pScrn->driverVersion = FBDEV_VERSION; |
|
pScrn->driverName = FBDEV_DRIVER_NAME; |
|
pScrn->name = FBDEV_NAME; |
|
@@ -332,7 +402,8 @@ FBDevProbe(DriverPtr drv, int flags) |
|
|
|
if (!xf86LoadDrvSubModule(drv, "fbdevhw")) |
|
return FALSE; |
|
- |
|
+ bind_fbdevhw(); |
|
+ |
|
for (i = 0; i < numDevSections; i++) { |
|
Bool isIsa = FALSE; |
|
Bool isPci = FALSE; |
|
@@ -355,7 +426,7 @@ FBDevProbe(DriverPtr drv, int flags) |
|
0; |
|
|
|
} |
|
- if (fbdevHWProbe(NULL,dev,NULL)) { |
|
+ if (my_fbdevHWProbe(NULL,dev,NULL)) { |
|
pScrn = NULL; |
|
if (isPci) { |
|
#ifndef XSERVER_LIBPCIACCESS |
|
@@ -459,11 +530,11 @@ FBDevPreInit(ScrnInfoPtr pScrn, int flags) |
|
pci_dev = fPtr->pEnt->location.id.pci; |
|
#endif |
|
/* open device */ |
|
- if (!fbdevHWInit(pScrn, pci_dev, |
|
+ if (!my_fbdevHWInit(pScrn, pci_dev, |
|
xf86FindOptionValue(fPtr->pEnt->device->options, |
|
"fbdev"))) |
|
return FALSE; |
|
- default_depth = fbdevHWGetDepth(pScrn,&fbbpp); |
|
+ default_depth = my_fbdevHWGetDepth(pScrn,&fbbpp); |
|
|
|
if (default_depth == 8) do { |
|
/* trust the command line */ |
|
@@ -531,10 +602,10 @@ FBDevPreInit(ScrnInfoPtr pScrn, int flags) |
|
pScrn->progClock = TRUE; |
|
pScrn->rgbBits = 8; |
|
pScrn->chipset = "fbdev"; |
|
- pScrn->videoRam = fbdevHWGetVidmem(pScrn); |
|
+ pScrn->videoRam = my_fbdevHWGetVidmem(pScrn); |
|
|
|
xf86DrvMsg(pScrn->scrnIndex, X_INFO, "hardware: %s (video memory:" |
|
- " %dkB)\n", fbdevHWGetName(pScrn), pScrn->videoRam/1024); |
|
+ " %dkB)\n", my_fbdevHWGetName(pScrn), pScrn->videoRam/1024); |
|
|
|
/* handle options */ |
|
xf86CollectOptions(pScrn, NULL); |
|
@@ -591,7 +662,7 @@ FBDevPreInit(ScrnInfoPtr pScrn, int flags) |
|
/* select video modes */ |
|
|
|
xf86DrvMsg(pScrn->scrnIndex, X_INFO, "checking modes against framebuffer device...\n"); |
|
- fbdevHWSetVideoModes(pScrn); |
|
+ my_fbdevHWSetVideoModes(pScrn); |
|
|
|
xf86DrvMsg(pScrn->scrnIndex, X_INFO, "checking modes against monitor...\n"); |
|
{ |
|
@@ -606,7 +677,7 @@ FBDevPreInit(ScrnInfoPtr pScrn, int flags) |
|
} |
|
|
|
if (NULL == pScrn->modes) |
|
- fbdevHWUseBuildinMode(pScrn); |
|
+ my_fbdevHWUseBuildinMode(pScrn); |
|
pScrn->currentMode = pScrn->modes; |
|
|
|
/* First approximation, may be refined in ScreenInit */ |
|
@@ -618,7 +689,7 @@ FBDevPreInit(ScrnInfoPtr pScrn, int flags) |
|
xf86SetDpi(pScrn, 0, 0); |
|
|
|
/* Load bpp-specific modules */ |
|
- switch ((type = fbdevHWGetType(pScrn))) |
|
+ switch ((type = my_fbdevHWGetType(pScrn))) |
|
{ |
|
case FBDEVHW_PACKED_PIXELS: |
|
switch (pScrn->bitsPerPixel) |
|
@@ -671,6 +742,7 @@ FBDevPreInit(ScrnInfoPtr pScrn, int flags) |
|
FBDevFreeRec(pScrn); |
|
return FALSE; |
|
} |
|
+ bind_shadow(); |
|
} |
|
|
|
TRACE_EXIT("PreInit"); |
|
@@ -681,20 +753,20 @@ static void |
|
fbdevUpdate32to24(ScreenPtr pScreen, shadowBufPtr pBuf) |
|
{ |
|
#ifdef HAVE_SHADOW_3224 |
|
- shadowUpdate32to24(pScreen, pBuf); |
|
+ my_shadowUpdate32to24(pScreen, pBuf); |
|
#endif |
|
} |
|
|
|
static void |
|
fbdevUpdateRotatePacked(ScreenPtr pScreen, shadowBufPtr pBuf) |
|
{ |
|
- shadowUpdateRotatePacked(pScreen, pBuf); |
|
+ my_shadowUpdateRotatePacked(pScreen, pBuf); |
|
} |
|
|
|
static void |
|
fbdevUpdatePacked(ScreenPtr pScreen, shadowBufPtr pBuf) |
|
{ |
|
- shadowUpdatePacked(pScreen, pBuf); |
|
+ my_shadowUpdatePacked(pScreen, pBuf); |
|
} |
|
|
|
static Bool |
|
@@ -722,7 +794,7 @@ FBDevCreateScreenResources(ScreenPtr pScreen) |
|
else |
|
update = fbdevUpdatePacked; |
|
|
|
- if (!shadowAdd(pScreen, pPixmap, update, FBDevWindowLinear, fPtr->rotate, |
|
+ if (!my_shadowAdd(pScreen, pPixmap, update, FBDevWindowLinear, fPtr->rotate, |
|
NULL)) { |
|
return FALSE; |
|
} |
|
@@ -736,7 +808,7 @@ FBDevShadowInit(ScreenPtr pScreen) |
|
ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); |
|
FBDevPtr fPtr = FBDEVPTR(pScrn); |
|
|
|
- if (!shadowSetup(pScreen)) { |
|
+ if (!my_shadowSetup(pScreen)) { |
|
return FALSE; |
|
} |
|
|
|
@@ -749,19 +821,19 @@ FBDevShadowInit(ScreenPtr pScreen) |
|
static void |
|
fbdevLoadPalette(ScrnInfoPtr pScrn, int num, int *i, LOCO *col, VisualPtr pVis) |
|
{ |
|
- fbdevHWLoadPalette(pScrn, num, i, col, pVis); |
|
+ my_fbdevHWLoadPalette(pScrn, num, i, col, pVis); |
|
} |
|
|
|
static void |
|
fbdevDPMSSet(ScrnInfoPtr pScrn, int mode, int flags) |
|
{ |
|
- fbdevHWDPMSSet(pScrn, mode, flags); |
|
+ my_fbdevHWDPMSSet(pScrn, mode, flags); |
|
} |
|
|
|
static Bool |
|
fbdevSaveScreen(ScreenPtr pScreen, int mode) |
|
{ |
|
- return fbdevHWSaveScreen(pScreen, mode); |
|
+ return my_fbdevHWSaveScreen(pScreen, mode); |
|
} |
|
|
|
static Bool |
|
@@ -773,6 +845,8 @@ FBDevScreenInit(SCREEN_INIT_ARGS_DECL) |
|
int init_picture = 0; |
|
int ret, flags; |
|
int type; |
|
+ typeof(fbScreenInit) *my_fbScreenInit = LoaderSymbol("fbScreenInit"); |
|
+ typeof(fbPictureInit) *my_fbPictureInit = LoaderSymbol("fbPictureInit"); |
|
|
|
TRACE_ENTER("FBDevScreenInit"); |
|
|
|
@@ -786,21 +860,21 @@ FBDevScreenInit(SCREEN_INIT_ARGS_DECL) |
|
pScrn->offset.red,pScrn->offset.green,pScrn->offset.blue); |
|
#endif |
|
|
|
- if (NULL == (fPtr->fbmem = fbdevHWMapVidmem(pScrn))) { |
|
+ if (NULL == (fPtr->fbmem = my_fbdevHWMapVidmem(pScrn))) { |
|
xf86DrvMsg(pScrn->scrnIndex,X_ERROR,"mapping of video memory" |
|
" failed\n"); |
|
return FALSE; |
|
} |
|
- fPtr->fboff = fbdevHWLinearOffset(pScrn); |
|
+ fPtr->fboff = my_fbdevHWLinearOffset(pScrn); |
|
|
|
- fbdevHWSave(pScrn); |
|
+ my_fbdevHWSave(pScrn); |
|
|
|
- if (!fbdevHWModeInit(pScrn, pScrn->currentMode)) { |
|
+ if (!my_fbdevHWModeInit(pScrn, pScrn->currentMode)) { |
|
xf86DrvMsg(pScrn->scrnIndex,X_ERROR,"mode initialization failed\n"); |
|
return FALSE; |
|
} |
|
- fbdevHWSaveScreen(pScreen, SCREEN_SAVER_ON); |
|
- fbdevHWAdjustFrame(ADJUST_FRAME_ARGS(pScrn, 0, 0)); |
|
+ my_fbdevHWSaveScreen(pScreen, SCREEN_SAVER_ON); |
|
+ my_fbdevHWAdjustFrame(ADJUST_FRAME_ARGS(pScrn, 0, 0)); |
|
|
|
/* mi layer */ |
|
miClearVisualTypes(); |
|
@@ -834,7 +908,7 @@ FBDevScreenInit(SCREEN_INIT_ARGS_DECL) |
|
} else if (!fPtr->shadowFB) { |
|
/* FIXME: this doesn't work for all cases, e.g. when each scanline |
|
has a padding which is independent from the depth (controlfb) */ |
|
- pScrn->displayWidth = fbdevHWGetLineLength(pScrn) / |
|
+ pScrn->displayWidth = my_fbdevHWGetLineLength(pScrn) / |
|
(pScrn->bitsPerPixel / 8); |
|
|
|
if (pScrn->displayWidth != pScrn->virtualX) { |
|
@@ -862,7 +936,7 @@ FBDevScreenInit(SCREEN_INIT_ARGS_DECL) |
|
} |
|
} |
|
|
|
- switch ((type = fbdevHWGetType(pScrn))) |
|
+ switch ((type = my_fbdevHWGetType(pScrn))) |
|
{ |
|
case FBDEVHW_PACKED_PIXELS: |
|
switch (pScrn->bitsPerPixel) { |
|
@@ -870,7 +944,7 @@ FBDevScreenInit(SCREEN_INIT_ARGS_DECL) |
|
case 16: |
|
case 24: |
|
case 32: |
|
- ret = fbScreenInit(pScreen, fPtr->shadowFB ? fPtr->shadow |
|
+ ret = my_fbScreenInit(pScreen, fPtr->shadowFB ? fPtr->shadow |
|
: fPtr->fbstart, pScrn->virtualX, |
|
pScrn->virtualY, pScrn->xDpi, |
|
pScrn->yDpi, pScrn->displayWidth, |
|
@@ -935,7 +1009,7 @@ FBDevScreenInit(SCREEN_INIT_ARGS_DECL) |
|
} |
|
|
|
/* must be after RGB ordering fixed */ |
|
- if (init_picture && !fbPictureInit(pScreen, NULL, 0)) |
|
+ if (init_picture && !my_fbPictureInit(pScreen, NULL, 0)) |
|
xf86DrvMsg(pScrn->scrnIndex, X_WARNING, |
|
"Render extension initialisation failed\n"); |
|
|
|
@@ -966,7 +1040,7 @@ FBDevScreenInit(SCREEN_INIT_ARGS_DECL) |
|
miDCInitialize(pScreen, xf86GetPointerScreenFuncs()); |
|
|
|
/* colormap */ |
|
- switch ((type = fbdevHWGetType(pScrn))) |
|
+ switch ((type = my_fbdevHWGetType(pScrn))) |
|
{ |
|
/* XXX It would be simpler to use miCreateDefColormap() in all cases. */ |
|
case FBDEVHW_PACKED_PIXELS: |
|
@@ -1032,10 +1106,10 @@ FBDevCloseScreen(CLOSE_SCREEN_ARGS_DECL) |
|
ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); |
|
FBDevPtr fPtr = FBDEVPTR(pScrn); |
|
|
|
- fbdevHWRestore(pScrn); |
|
- fbdevHWUnmapVidmem(pScrn); |
|
+ my_fbdevHWRestore(pScrn); |
|
+ my_fbdevHWUnmapVidmem(pScrn); |
|
if (fPtr->shadow) { |
|
- shadowRemove(pScreen, pScreen->GetScreenPixmap(pScreen)); |
|
+ my_shadowRemove(pScreen, pScreen->GetScreenPixmap(pScreen)); |
|
free(fPtr->shadow); |
|
fPtr->shadow = NULL; |
|
} |
|
@@ -1070,7 +1144,7 @@ FBDevWindowLinear(ScreenPtr pScreen, CARD32 row, CARD32 offset, int mode, |
|
if (fPtr->lineLength) |
|
*size = fPtr->lineLength; |
|
else |
|
- *size = fPtr->lineLength = fbdevHWGetLineLength(pScrn); |
|
+ *size = fPtr->lineLength = my_fbdevHWGetLineLength(pScrn); |
|
|
|
return ((CARD8 *)fPtr->fbstart + row * fPtr->lineLength + offset); |
|
} |
|
@@ -1225,7 +1299,7 @@ FBDevDGAAddModes(ScrnInfoPtr pScrn) |
|
if (fPtr->lineLength) |
|
pDGAMode->bytesPerScanline = fPtr->lineLength; |
|
else |
|
- pDGAMode->bytesPerScanline = fPtr->lineLength = fbdevHWGetLineLength(pScrn); |
|
+ pDGAMode->bytesPerScanline = fPtr->lineLength = my_fbdevHWGetLineLength(pScrn); |
|
|
|
pDGAMode->imageWidth = pMode->HDisplay; |
|
pDGAMode->imageHeight = pMode->VDisplay; |
|
-- |
|
2.34.1 |
|
|
|
|