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; }