Deleted Added
full compact
28c28
< * $Id: fb.c,v 1.4 1999/05/30 16:51:23 phk Exp $
---
> * $Id: fb.c,v 1.5 1999/05/31 11:24:38 phk Exp $
36a37
> #include <sys/bus.h>
38a40,41
> #include <sys/uio.h>
> #include <sys/fbio.h>
40c43,44
< #include <machine/console.h>
---
> #include <vm/vm.h>
> #include <vm/pmap.h>
51a56
> static int vid_malloc;
59,61d63
<
< #define ARRAY_DELTA 4
<
63a66
> #endif
65c68,70
< static void
---
> #define ARRAY_DELTA 4
>
> static int
69a75
> #ifdef FB_INSTALL_CDEV
70a77
> #endif
73a81,83
> if (!vid_malloc)
> return ENOMEM;
>
77a88
> #ifdef FB_INSTALL_CDEV
78a90
> #endif
81d92
< bzero(new_cdevsw, sizeof(*new_cdevsw)*newsize);
83a95,96
> #ifdef FB_INSTALL_CDEV
> bzero(new_cdevsw, sizeof(*new_cdevsw)*newsize);
84a98
> #endif
87a102
> #ifdef FB_INSTALL_CDEV
88a104
> #endif
91a108
> #ifdef FB_INSTALL_CDEV
92a110
> #endif
97a116,117
>
> return 0;
100c120,124
< #endif /* FB_INSTALL_CDEV */
---
> static void
> vid_malloc_init(void *arg)
> {
> vid_malloc = TRUE;
> }
101a126,127
> SYSINIT(vid_mem, SI_SUB_KMEM, SI_ORDER_ANY, vid_malloc_init, NULL);
>
123,124c149,150
< video_driver_t **list;
< video_driver_t *p;
---
> const video_driver_t **list;
> const video_driver_t *p;
131,132c157,160
< if (index >= adapters)
< return -1;
---
> if (index >= adapters) {
> if (vid_realloc_array())
> return -1;
> }
136c164
< list = (video_driver_t **)videodriver_set.ls_items;
---
> list = (const video_driver_t **)videodriver_set.ls_items;
165,166c193,194
< video_driver_t **list;
< video_driver_t *p;
---
> const video_driver_t **list;
> const video_driver_t *p;
168c196
< list = (video_driver_t **)videodriver_set.ls_items;
---
> list = (const video_driver_t **)videodriver_set.ls_items;
254,255c282,283
< video_driver_t **list;
< video_driver_t *p;
---
> const video_driver_t **list;
> const video_driver_t *p;
257c285
< list = (video_driver_t **)videodriver_set.ls_items;
---
> list = (const video_driver_t **)videodriver_set.ls_items;
272c300
< #define DRIVER_NAME "fb"
---
> #define FB_DRIVER_NAME "fb"
275a304,349
> #if experimental
>
> static devclass_t fb_devclass;
>
> static int fbprobe(device_t dev);
> static int fbattach(device_t dev);
>
> static device_method_t fb_methods[] = {
> DEVMETHOD(device_probe, fbprobe),
> DEVMETHOD(device_attach, fbattach),
>
> DEVMETHOD(bus_print_child, bus_generic_print_child),
> { 0, 0 }
> };
>
> static driver_t fb_driver = {
> FB_DRIVER_NAME,
> fb_methods,
> 0,
> };
>
> static int
> fbprobe(device_t dev)
> {
> int unit;
>
> unit = device_get_unit(dev);
> if (unit >= adapters)
> return ENXIO;
> if (adapter[unit] == NULL)
> return ENXIO;
>
> device_set_desc(dev, "generic frame buffer");
> return 0;
> }
>
> static int
> fbattach(device_t dev)
> {
> printf("fbattach: about to attach children\n");
> bus_generic_attach(dev);
> return 0;
> }
>
> #endif /* experimental */
>
279,280d352
< #if notyet
<
282a355,356
> static d_read_t fbread;
> static d_write_t fbwrite;
286c360
< #define CDEV_MAJOR 141 /* XXX */
---
> #define CDEV_MAJOR 123 /* XXX */
291,292c365,366
< /* read */ noread,
< /* write */ nowrite,
---
> /* read */ fbread,
> /* write */ fbwrite,
300c374
< /* name */ DRIVER_NAME,
---
> /* name */ FB_DRIVER_NAME,
323,324d396
< #endif /* notyet */
<
326c398
< fb_attach(dev_t dev, video_adapter *adp, struct cdevsw *cdevsw)
---
> fb_attach(dev_t dev, video_adapter_t *adp, struct cdevsw *cdevsw)
342,344d413
< if (adp->va_index + 1 >= adapters)
< vid_realloc_array();
<
350c419
< fb_detach(dev_t dev, video_adapter *adp, struct cdevsw *cdevsw)
---
> fb_detach(dev_t dev, video_adapter_t *adp, struct cdevsw *cdevsw)
366a436,594
> static int
> fbopen(dev_t dev, int flag, int mode, struct proc *p)
> {
> int unit;
>
> unit = FB_UNIT(dev);
> if (unit >= adapters)
> return ENXIO;
> if (vidcdevsw[unit] == NULL)
> return ENXIO;
> return (*vidcdevsw[unit]->d_open)(makedev(0, adapter[unit]->va_minor),
> flag, mode, p);
> }
>
> static int
> fbclose(dev_t dev, int flag, int mode, struct proc *p)
> {
> int unit;
>
> unit = FB_UNIT(dev);
> if (vidcdevsw[unit] == NULL)
> return ENXIO;
> return (*vidcdevsw[unit]->d_close)(makedev(0, adapter[unit]->va_minor),
> flag, mode, p);
> }
>
> static int
> fbread(dev_t dev, struct uio *uio, int flag)
> {
> int unit;
>
> unit = FB_UNIT(dev);
> if (vidcdevsw[unit] == NULL)
> return ENXIO;
> return (*vidcdevsw[unit]->d_read)(makedev(0, adapter[unit]->va_minor),
> uio, flag);
> }
>
> static int
> fbwrite(dev_t dev, struct uio *uio, int flag)
> {
> int unit;
>
> unit = FB_UNIT(dev);
> if (vidcdevsw[unit] == NULL)
> return ENXIO;
> return (*vidcdevsw[unit]->d_write)(makedev(0, adapter[unit]->va_minor),
> uio, flag);
> }
>
> static int
> fbioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct proc *p)
> {
> int unit;
>
> unit = FB_UNIT(dev);
> if (vidcdevsw[unit] == NULL)
> return ENXIO;
> return (*vidcdevsw[unit]->d_ioctl)(makedev(0, adapter[unit]->va_minor),
> cmd, arg, flag, p);
> }
>
> static int
> fbmmap(dev_t dev, vm_offset_t offset, int nprot)
> {
> int unit;
>
> unit = FB_UNIT(dev);
> if (vidcdevsw[unit] == NULL)
> return ENXIO;
> return (*vidcdevsw[unit]->d_mmap)(makedev(0, adapter[unit]->va_minor),
> offset, nprot);
> }
>
> #if experimental
> DEV_DRIVER_MODULE(fb, ???, fb_driver, fb_devclass,
> CDEV_MAJOR, NOMAJ, fb_cdevsw, 0, 0);
> #endif
>
> /*
> * Generic frame buffer cdev driver functions
> * Frame buffer subdrivers may call these functions to implement common
> * driver functions.
> */
>
> int genfbopen(genfb_softc_t *sc, video_adapter_t *adp, int flag, int mode,
> struct proc *p)
> {
> int s;
>
> s = spltty();
> if (!(sc->gfb_flags & FB_OPEN))
> sc->gfb_flags |= FB_OPEN;
> splx(s);
> return 0;
> }
>
> int genfbclose(genfb_softc_t *sc, video_adapter_t *adp, int flag, int mode,
> struct proc *p)
> {
> int s;
>
> s = spltty();
> sc->gfb_flags &= ~FB_OPEN;
> splx(s);
> return 0;
> }
>
> int genfbread(genfb_softc_t *sc, video_adapter_t *adp, struct uio *uio,
> int flag)
> {
> int size;
> int offset;
> int error;
> int len;
>
> error = 0;
> size = adp->va_buffer_size/adp->va_info.vi_planes;
> while (uio->uio_resid > 0) {
> if (uio->uio_offset >= size)
> break;
> offset = uio->uio_offset%adp->va_window_size;
> len = imin(uio->uio_resid, size - uio->uio_offset);
> len = imin(len, adp->va_window_size - offset);
> if (len <= 0)
> break;
> (*vidsw[adp->va_index]->set_win_org)(adp, uio->uio_offset);
> error = uiomove((caddr_t)(adp->va_window + offset), len, uio);
> if (error)
> break;
> }
> return error;
> }
>
> int genfbwrite(genfb_softc_t *sc, video_adapter_t *adp, struct uio *uio,
> int flag)
> {
> return ENODEV;
> }
>
> int genfbioctl(genfb_softc_t *sc, video_adapter_t *adp, u_long cmd,
> caddr_t arg, int flag, struct proc *p)
> {
> int error;
>
> if (adp == NULL) /* XXX */
> return ENXIO;
> error = (*vidsw[adp->va_index]->ioctl)(adp, cmd, arg);
> if (error == ENOIOCTL)
> error = ENODEV;
> return error;
> }
>
> int genfbmmap(genfb_softc_t *sc, video_adapter_t *adp, vm_offset_t offset,
> int prot)
> {
> return (*vidsw[adp->va_index]->mmap)(adp, offset, prot);
> }
>
381a610
> { KD_TGA, "TGA" },
391a621,626
> /*
> * Generic low-level frame buffer functions
> * The low-level functions in the frame buffer subdriver may use these
> * functions.
> */
>
399c634
< DRIVER_NAME, adp->va_index, driver, adp->va_unit, adp->va_name,
---
> FB_DRIVER_NAME, adp->va_index, driver, adp->va_unit, adp->va_name,
402c637
< DRIVER_NAME, adp->va_index,
---
> FB_DRIVER_NAME, adp->va_index,
406c641
< DRIVER_NAME, adp->va_index,
---
> FB_DRIVER_NAME, adp->va_index,
408,411c643,646
< printf("%s%d: window:0x%x size:%dk gran:%dk, buf:0x%x size:%dk\n",
< DRIVER_NAME, adp->va_index,
< adp->va_window, (int)adp->va_window_size/1024,
< (int)adp->va_window_gran/1024, adp->va_buffer,
---
> printf("%s%d: window:%p size:%dk gran:%dk, buf:%p size:%dk\n",
> FB_DRIVER_NAME, adp->va_index,
> (void *)adp->va_window, (int)adp->va_window_size/1024,
> (int)adp->va_window_gran/1024, (void *)adp->va_buffer,
434a670,827
>
> int
> fb_type(int adp_type)
> {
> static struct {
> int fb_type;
> int va_type;
> } types[] = {
> { FBTYPE_MDA, KD_MONO },
> { FBTYPE_HERCULES, KD_HERCULES },
> { FBTYPE_CGA, KD_CGA },
> { FBTYPE_EGA, KD_EGA },
> { FBTYPE_VGA, KD_VGA },
> { FBTYPE_PC98, KD_PC98 },
> { FBTYPE_TGA, KD_TGA },
> };
> int i;
>
> for (i = 0; i < sizeof(types)/sizeof(types[0]); ++i) {
> if (types[i].va_type == adp_type)
> return types[i].fb_type;
> }
> return -1;
> }
>
> int
> fb_commonioctl(video_adapter_t *adp, u_long cmd, caddr_t arg)
> {
> int error;
> int s;
>
> /* assert(adp != NULL) */
>
> error = 0;
> s = spltty();
>
> switch (cmd) {
>
> case FBIO_ADAPTER: /* get video adapter index */
> *(int *)arg = adp->va_index;
> break;
>
> case FBIO_ADPTYPE: /* get video adapter type */
> *(int *)arg = adp->va_type;
> break;
>
> case FBIO_ADPINFO: /* get video adapter info */
> ((video_adapter_info_t *)arg)->va_index = adp->va_index;
> ((video_adapter_info_t *)arg)->va_type = adp->va_type;
> bcopy(adp->va_name, ((video_adapter_info_t *)arg)->va_name,
> imin(strlen(adp->va_name) + 1,
> sizeof(((video_adapter_info_t *)arg)->va_name)));
> ((video_adapter_info_t *)arg)->va_unit = adp->va_unit;
> ((video_adapter_info_t *)arg)->va_flags = adp->va_flags;
> ((video_adapter_info_t *)arg)->va_io_base = adp->va_io_base;
> ((video_adapter_info_t *)arg)->va_io_size = adp->va_io_size;
> ((video_adapter_info_t *)arg)->va_crtc_addr = adp->va_crtc_addr;
> ((video_adapter_info_t *)arg)->va_mem_base = adp->va_mem_base;
> ((video_adapter_info_t *)arg)->va_mem_size = adp->va_mem_size;
> ((video_adapter_info_t *)arg)->va_window
> = vtophys(adp->va_window);
> ((video_adapter_info_t *)arg)->va_window_size
> = adp->va_window_size;
> ((video_adapter_info_t *)arg)->va_window_gran
> = adp->va_window_gran;
> ((video_adapter_info_t *)arg)->va_window_orig
> = adp->va_window_orig;
> ((video_adapter_info_t *)arg)->va_unused0
> = (adp->va_buffer) ? vtophys(adp->va_buffer) : 0;
> ((video_adapter_info_t *)arg)->va_buffer_size
> = adp->va_buffer_size;
> ((video_adapter_info_t *)arg)->va_mode = adp->va_mode;
> ((video_adapter_info_t *)arg)->va_initial_mode
> = adp->va_initial_mode;
> ((video_adapter_info_t *)arg)->va_initial_bios_mode
> = adp->va_initial_bios_mode;
> ((video_adapter_info_t *)arg)->va_line_width
> = adp->va_line_width;
> ((video_adapter_info_t *)arg)->va_disp_start.x
> = adp->va_disp_start.x;
> ((video_adapter_info_t *)arg)->va_disp_start.y
> = adp->va_disp_start.y;
> break;
>
> case FBIO_MODEINFO: /* get mode information */
> error = (*vidsw[adp->va_index]->get_info)(adp,
> ((video_info_t *)arg)->vi_mode,
> (video_info_t *)arg);
> if (error)
> error = ENODEV;
> break;
>
> case FBIO_FINDMODE: /* find a matching video mode */
> error = (*vidsw[adp->va_index]->query_mode)(adp,
> (video_info_t *)arg);
> if (error < 0) {
> error = EINVAL;
> } else {
> error = (*vidsw[adp->va_index]->get_info)(adp,
> error, (video_info_t *)arg);
> if (error)
> error = ENODEV; /* shouldn't happen */
> }
> break;
>
> case FBIO_GETMODE: /* get video mode */
> *(int *)arg = adp->va_mode;
> break;
>
> case FBIO_SETMODE: /* set video mode */
> error = (*vidsw[adp->va_index]->set_mode)(adp, *(int *)arg);
> if (error)
> error = ENODEV; /* EINVAL? */
> break;
>
> case FBIO_GETWINORG: /* get frame buffer window origin */
> *(u_int *)arg = adp->va_window_orig;
> break;
>
> case FBIO_GETDISPSTART: /* get display start address */
> ((video_display_start_t *)arg)->x = adp->va_disp_start.x;
> ((video_display_start_t *)arg)->y = adp->va_disp_start.y;
> break;
>
> case FBIO_GETLINEWIDTH: /* get scan line width in bytes */
> *(u_int *)arg = adp->va_line_width;
> break;
>
> case FBIO_GETPALETTE: /* get color palette */
> case FBIO_SETPALETTE: /* set color palette */
> /* XXX */
>
> case FBIOPUTCMAP:
> case FBIOGETCMAP:
> /* XXX */
>
> case FBIO_SETWINORG: /* set frame buffer window origin */
> case FBIO_SETDISPSTART: /* set display start address */
> case FBIO_SETLINEWIDTH: /* set scan line width in pixel */
>
> case FBIOGTYPE:
> case FBIOGATTR:
> case FBIOSVIDEO:
> case FBIOGVIDEO:
> case FBIOSCURSOR:
> case FBIOGCURSOR:
> case FBIOSCURPOS:
> case FBIOGCURPOS:
> case FBIOGCURMAX:
>
> default:
> error = ENODEV;
> break;
> }
>
> splx(s);
> return error;
> }