Re: X breaks in CD-based installer environment
On Sun, 2002-04-28 at 23:15, Michel Dänzer wrote:
> patch attached
... for real this time...
--
Earthling Michel Dänzer (MrCooper)/ Debian GNU/Linux (powerpc) developer
XFree86 and DRI project member / CS student, Free Software enthusiast
Index: fbdevhw.c
===================================================================
RCS file: /cvs/xc/programs/Xserver/hw/xfree86/fbdevhw/fbdevhw.c,v
retrieving revision 1.27
diff -u -r1.27 fbdevhw.c
--- fbdevhw.c 2001/10/31 22:50:29 1.27
+++ fbdevhw.c 2002/04/28 21:06:22
@@ -300,30 +300,39 @@
}
static int
-fbdev_open(char *dev, char** namep)
+fbdev_open(int scrnIndex, char *dev, char** namep)
{
struct fb_fix_screeninfo fix;
int fd;
/* try argument (from XF86Config) first */
- if ((NULL == dev) || ((fd = open(dev,O_RDWR,0)) == -1)) {
+ if (dev) {
+ fd = open(dev,O_RDWR,0);
+ } else {
/* second: environment variable */
dev = getenv("FRAMEBUFFER");
if ((NULL == dev) || ((fd = open(dev,O_RDWR,0)) == -1)) {
/* last try: default device */
- if (-1 == (fd = open("/dev/fb0",O_RDWR,0)))
- return -1;
+ dev = "/dev/fb0";
+ fd = open(dev,O_RDWR,0);
}
}
+
+ if (fd == -1) {
+ xf86DrvMsg(scrnIndex, X_ERROR,
+ "open %s: %s\n", dev, strerror(errno));
+ return -1;
+ }
+
if (namep) {
if (-1 == ioctl(fd,FBIOGET_FSCREENINFO,(void*)(&fix))) {
*namep = NULL;
+ xf86DrvMsg(scrnIndex, X_ERROR,
+ "FBIOGET_FSCREENINFO: %s\n", strerror(errno));
return -1;
} else {
- if (namep) {
- *namep = xnfalloc(16);
- strncpy(*namep,fix.id,16);
- }
+ *namep = xnfalloc(16);
+ strncpy(*namep,fix.id,16);
}
}
return fd;
@@ -339,7 +348,7 @@
if (pPci)
fd = fbdev_open_pci(pPci,namep);
else
- fd = fbdev_open(device,namep);
+ fd = fbdev_open(-1,device,namep);
if (-1 == fd)
return FALSE;
@@ -361,7 +370,7 @@
if (pPci)
fPtr->fd = fbdev_open_pci(pPci,NULL);
else
- fPtr->fd = fbdev_open(device,NULL);
+ fPtr->fd = fbdev_open(pScrn->scrnIndex,device,NULL);
if (-1 == fPtr->fd)
return FALSE;
@@ -545,7 +554,8 @@
fPtr->fbmem = mmap(NULL, fPtr->fbmem_len, PROT_READ | PROT_WRITE,
MAP_SHARED, fPtr->fd, 0);
if (-1 == (long)fPtr->fbmem) {
- perror("mmap fbmem");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "mmap fbmem: %s\n", strerror(errno));
fPtr->fbmem = NULL;
} else {
/* Perhaps we'd better add fboff to fbmem and return 0 in
@@ -576,7 +586,8 @@
TRACE_ENTER("UnmapVidmem");
if (NULL != fPtr->fbmem) {
if (-1 == munmap(fPtr->fbmem, fPtr->fbmem_len))
- perror("munmap fbmem");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "munmap fbmem: %s\n", strerror(errno));
fPtr->fbmem = NULL;
}
return TRUE;
@@ -594,7 +605,8 @@
/* tell the kernel not to use accels to speed up console scrolling */
fPtr->var.accel_flags = 0;
if (0 != ioctl(fPtr->fd,FBIOPUT_VSCREENINFO,(void*)(&fPtr->var))) {
- perror("FBIOPUT_VSCREENINFO");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "FBIOPUT_VSCREENINFO: %s\n", strerror(errno));
return FALSE;
}
mmio_off = (unsigned long) fPtr->fix.mmio_start & ~PAGE_MASK;
@@ -605,7 +617,8 @@
fPtr->mmio = mmap(NULL, fPtr->mmio_len, PROT_READ | PROT_WRITE,
MAP_SHARED, fPtr->fd, fPtr->fbmem_len);
if (-1 == (long)fPtr->mmio) {
- perror("mmap mmio");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "mmap mmio: %s\n", strerror(errno));
fPtr->mmio = NULL;
} else
fPtr->mmio += mmio_off;
@@ -621,7 +634,8 @@
TRACE_ENTER("UnmapMMIO");
if (NULL != fPtr->mmio) {
if (-1 == munmap((void *)((unsigned long)fPtr->mmio & PAGE_MASK), fPtr->mmio_len))
- perror("munmap mmio");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "munmap mmio: %s\n", strerror(errno));
fPtr->mmio = NULL;
/* FIXME: restore var.accel_flags [geert] */
}
@@ -646,16 +660,19 @@
/* set */
if (0 != ioctl(fPtr->fd,FBIOPUT_VSCREENINFO,(void*)(&fPtr->var))) {
- perror("FBIOPUT_VSCREENINFO");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "FBIOPUT_VSCREENINFO: %s\n", strerror(errno));
return FALSE;
}
/* read back */
if (0 != ioctl(fPtr->fd,FBIOGET_FSCREENINFO,(void*)(&fPtr->fix))) {
- perror("FBIOGET_FSCREENINFO");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "FBIOGET_FSCREENINFO: %s\n", strerror(errno));
return FALSE;
}
if (0 != ioctl(fPtr->fd,FBIOGET_VSCREENINFO,(void*)(&fPtr->var))) {
- perror("FBIOGET_VSCREENINFO");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "FBIOGET_VSCREENINFO: %s\n", strerror(errno));
return FALSE;
}
return TRUE;
@@ -672,7 +689,8 @@
TRACE_ENTER("Save");
if (0 != ioctl(fPtr->fd,FBIOGET_VSCREENINFO,(void*)(&fPtr->saved_var)))
- perror("FBIOGET_VSCREENINFO");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "FBIOGET_VSCREENINFO: %s\n", strerror(errno));
}
void
@@ -682,7 +700,8 @@
TRACE_ENTER("Restore");
if (0 != ioctl(fPtr->fd,FBIOPUT_VSCREENINFO,(void*)(&fPtr->saved_var)))
- perror("FBIOPUT_VSCREENINFO");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "FBIOPUT_VSCREENINFO: %s\n", strerror(errno));
}
/* -------------------------------------------------------------------- */
@@ -712,7 +731,8 @@
blue = (colors[indices[i]].blue << 8) |
colors[indices[i]].blue;
if (-1 == ioctl(fPtr->fd,FBIOPUTCMAP,(void*)&cmap))
- perror("ioctl FBIOPUTCMAP");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "FBIOPUTCMAP: %s\n", strerror(errno));
}
}
@@ -731,7 +751,8 @@
xfree2fbdev_timing(mode, &var);
var.activate = FB_ACTIVATE_TEST;
if (0 != ioctl(fPtr->fd,FBIOPUT_VSCREENINFO,(void*)(&fPtr->var))) {
- perror("FBIOPUT_VSCREENINFO");
+ xf86DrvMsg(scrnIndex, X_ERROR,
+ "FBIOPUT_VSCREENINFO: %s\n", strerror(errno));
return MODE_BAD;
}
return MODE_OK;
@@ -746,7 +767,8 @@
TRACE_ENTER("SwitchMode");
xfree2fbdev_timing(mode, &fPtr->var);
if (0 != ioctl(fPtr->fd,FBIOPUT_VSCREENINFO,(void*)(&fPtr->var))) {
- perror("FBIOPUT_VSCREENINFO");
+ xf86DrvMsg(scrnIndex, X_ERROR,
+ "FBIOPUT_VSCREENINFO: %s\n", strerror(errno));
return FALSE;
}
return TRUE;
@@ -762,7 +784,8 @@
fPtr->var.xoffset = x;
fPtr->var.yoffset = y;
if (-1 == ioctl(fPtr->fd,FBIOPAN_DISPLAY,(void*)&fPtr->var))
- perror("ioctl FBIOPAN_DISPLAY");
+ xf86DrvMsg(scrnIndex, X_ERROR,
+ "FBIOPAN_DISPLAY: %s\n", strerror(errno));
}
Bool
@@ -813,7 +836,8 @@
}
if (-1 == ioctl(fPtr->fd, FBIOBLANK, (void *)fbmode))
- perror("ioctl FBIOBLANK");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "FBIOBLANK: %s\n", strerror(errno));
}
Bool
@@ -828,8 +852,11 @@
unblank = xf86IsUnblank(mode);
- if (-1 == ioctl(fPtr->fd, FBIOBLANK, (void *)(1-unblank)))
+ if (-1 == ioctl(fPtr->fd, FBIOBLANK, (void *)(1-unblank))) {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "FBIOBLANK: %s\n", strerror(errno));
return FALSE;
+ }
return TRUE;
}
Reply to: