summaryrefslogtreecommitdiffstats
path: root/sys/dev/syscons/scvidctl.c
diff options
context:
space:
mode:
authoryokota <yokota@FreeBSD.org>1999-01-11 03:18:56 +0000
committeryokota <yokota@FreeBSD.org>1999-01-11 03:18:56 +0000
commitae16d918a316eb60407be875de416efb373a652f (patch)
tree114e5de93fcbb59a8cff261d560719502d115314 /sys/dev/syscons/scvidctl.c
parentf24a0f863faf18c039916001f2cc71561fc29b38 (diff)
downloadFreeBSD-src-ae16d918a316eb60407be875de416efb373a652f.zip
FreeBSD-src-ae16d918a316eb60407be875de416efb373a652f.tar.gz
The first stage of console driver reorganization: activate new
keyboard and video card drivers. Because of the changes, you are required to update your kernel configuration file now! The files in sys/dev/syscons are still i386-specific (but less so than before), and won't compile for alpha and PC98 yet. syscons still directly accesses the video card registers here and there; this will be rectified in the later stages.
Diffstat (limited to 'sys/dev/syscons/scvidctl.c')
-rw-r--r--sys/dev/syscons/scvidctl.c161
1 files changed, 123 insertions, 38 deletions
diff --git a/sys/dev/syscons/scvidctl.c b/sys/dev/syscons/scvidctl.c
index 065dee2..f267e6e 100644
--- a/sys/dev/syscons/scvidctl.c
+++ b/sys/dev/syscons/scvidctl.c
@@ -23,7 +23,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $Id: scvidctl.c,v 1.4 1998/09/29 02:00:56 ache Exp $
+ * $Id: $
*/
#include "sc.h"
@@ -40,11 +40,36 @@
#include <machine/apm_bios.h>
#include <machine/console.h>
-#include <i386/isa/videoio.h>
-#include <i386/isa/syscons.h>
-
-/* video ioctl */
-
+#include <dev/fb/fbreg.h>
+#include <dev/syscons/syscons.h>
+
+/* for compatibility with previous versions */
+typedef struct old_video_adapter {
+ int va_index;
+ int va_type;
+ int va_flags;
+#define V_ADP_COLOR (1<<0)
+#define V_ADP_MODECHANGE (1<<1)
+#define V_ADP_STATESAVE (1<<2)
+#define V_ADP_STATELOAD (1<<3)
+#define V_ADP_FONT (1<<4)
+#define V_ADP_PALETTE (1<<5)
+#define V_ADP_BORDER (1<<6)
+#define V_ADP_VESA (1<<7)
+ int va_crtc_addr;
+ u_int va_window; /* virtual address */
+ size_t va_window_size;
+ size_t va_window_gran;
+ u_int va_buffer; /* virtual address */
+ size_t va_buffer_size;
+ int va_initial_mode;
+ int va_initial_bios_mode;
+ int va_mode;
+} old_video_adapter_t;
+
+#define OLD_CONS_ADPINFO _IOWR('c', 101, old_video_adapter_t)
+
+/* variables */
extern scr_stat *cur_console;
extern int fonts_loaded;
extern int sc_history_size;
@@ -54,15 +79,13 @@ int
sc_set_text_mode(scr_stat *scp, struct tty *tp, int mode, int xsize, int ysize,
int fontsize)
{
- video_adapter_t *adp;
video_info_t info;
int error;
int s;
int i;
- if ((*biosvidsw.get_info)(scp->adp, mode, &info))
+ if ((*vidsw[scp->ad]->get_info)(scp->adp, mode, &info))
return ENODEV;
- adp = get_adapter(scp);
/* adjust argument values */
if (fontsize <= 0)
@@ -108,12 +131,14 @@ sc_set_text_mode(scr_stat *scp, struct tty *tp, int mode, int xsize, int ysize,
scp->font_size = fontsize;
scp->xsize = xsize;
scp->ysize = ysize;
+ scp->xoff = 0;
+ scp->yoff = 0;
scp->xpixel = scp->xsize*8;
scp->ypixel = scp->ysize*fontsize;
/* allocate buffers */
sc_alloc_scr_buffer(scp, TRUE, TRUE);
- if (ISMOUSEAVAIL(adp->va_flags))
+ if (ISMOUSEAVAIL(scp->adp->va_flags))
sc_alloc_cut_buffer(scp, FALSE);
sc_alloc_history_buffer(scp, sc_history_size, i, FALSE);
splx(s);
@@ -137,14 +162,12 @@ sc_set_text_mode(scr_stat *scp, struct tty *tp, int mode, int xsize, int ysize,
int
sc_set_graphics_mode(scr_stat *scp, struct tty *tp, int mode)
{
- video_adapter_t *adp;
video_info_t info;
int error;
int s;
- if ((*biosvidsw.get_info)(scp->adp, mode, &info))
+ if ((*vidsw[scp->ad]->get_info)(scp->adp, mode, &info))
return ENODEV;
- adp = get_adapter(scp);
/* stop screen saver, etc */
s = spltty();
@@ -157,6 +180,8 @@ sc_set_graphics_mode(scr_stat *scp, struct tty *tp, int mode)
scp->status |= (UNKNOWN_MODE | GRAPHICS_MODE);
scp->status &= ~PIXEL_MODE;
scp->mode = mode;
+ scp->xoff = 0;
+ scp->yoff = 0;
scp->xpixel = info.vi_width;
scp->ypixel = info.vi_height;
scp->xsize = info.vi_width/8;
@@ -187,15 +212,13 @@ int
sc_set_pixel_mode(scr_stat *scp, struct tty *tp, int xsize, int ysize,
int fontsize)
{
- video_adapter_t *adp;
video_info_t info;
int error;
int s;
int i;
- if ((*biosvidsw.get_info)(scp->adp, scp->mode, &info))
+ if ((*vidsw[scp->ad]->get_info)(scp->adp, scp->mode, &info))
return ENODEV; /* this shouldn't happen */
- adp = get_adapter(scp);
#ifdef SC_VIDEO_DEBUG
if (scp->scr_buf != NULL) {
@@ -230,7 +253,7 @@ sc_set_pixel_mode(scr_stat *scp, struct tty *tp, int xsize, int ysize,
printf("set_pixel_mode(): mode:%x, col:%d, row:%d, font:%d\n",
scp->mode, xsize, ysize, fontsize);
printf("set_pixel_mode(): window:%x, %dx%d, xoff:%d, yoff:%d\n",
- adp->va_window, info.vi_width, info.vi_height,
+ scp->adp->va_window, info.vi_width, info.vi_height,
(info.vi_width/8 - xsize)/2,
(info.vi_height/fontsize - ysize)/2);
}
@@ -274,7 +297,7 @@ sc_set_pixel_mode(scr_stat *scp, struct tty *tp, int xsize, int ysize,
/* allocate buffers */
sc_alloc_scr_buffer(scp, TRUE, TRUE);
- if (ISMOUSEAVAIL(adp->va_flags))
+ if (ISMOUSEAVAIL(scp->adp->va_flags))
sc_alloc_cut_buffer(scp, FALSE);
sc_alloc_history_buffer(scp, sc_history_size, i, FALSE);
splx(s);
@@ -304,7 +327,6 @@ int
sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p)
{
scr_stat *scp;
- video_adapter_t *adp;
int error;
int s;
@@ -313,19 +335,66 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p)
switch (cmd) {
case CONS_CURRENT: /* get current adapter type */
- adp = get_adapter(scp);
- *(int *)data = adp->va_type;
+ if (scp->adp == NULL)
+ return ENODEV;
+ *(int *)data = scp->adp->va_type;
return 0;
case CONS_CURRENTADP: /* get current adapter index */
- *(int *)data = scp->adp;
+ *(int *)data = scp->ad;
+ return 0;
+
+ case OLD_CONS_ADPINFO: /* adapter information */
+ if (scp->adp == NULL)
+ return ENODEV;
+ ((old_video_adapter_t *)data)->va_index = scp->adp->va_index;
+ ((old_video_adapter_t *)data)->va_type = scp->adp->va_type;
+ ((old_video_adapter_t *)data)->va_flags = scp->adp->va_flags;
+ ((old_video_adapter_t *)data)->va_crtc_addr = scp->adp->va_crtc_addr;
+ ((old_video_adapter_t *)data)->va_window = scp->adp->va_window;
+ ((old_video_adapter_t *)data)->va_window_size
+ = scp->adp->va_window_size;
+ ((old_video_adapter_t *)data)->va_window_gran
+ = scp->adp->va_window_gran;
+ ((old_video_adapter_t *)data)->va_buffer = scp->adp->va_buffer;
+ ((old_video_adapter_t *)data)->va_buffer_size
+ = scp->adp->va_buffer_size;
+ ((old_video_adapter_t *)data)->va_mode = scp->adp->va_mode;
+ ((old_video_adapter_t *)data)->va_initial_mode
+ = scp->adp->va_initial_mode;
+ ((old_video_adapter_t *)data)->va_initial_bios_mode
+ = scp->adp->va_initial_bios_mode;
return 0;
case CONS_ADPINFO: /* adapter information */
- adp = (*biosvidsw.adapter)(((video_adapter_t *)data)->va_index);
- if (adp == NULL)
+ if (scp->adp == NULL)
return ENODEV;
- bcopy(adp, data, sizeof(*adp));
+ ((video_adapter_info_t *)data)->va_index = scp->adp->va_index;
+ ((video_adapter_info_t *)data)->va_type = scp->adp->va_type;
+ bcopy(scp->adp->va_name, ((video_adapter_info_t *)data)->va_name,
+ imin(strlen(scp->adp->va_name) + 1,
+ sizeof(((video_adapter_info_t *)data)->va_name)));
+ ((video_adapter_info_t *)data)->va_unit = scp->adp->va_unit;
+ ((video_adapter_info_t *)data)->va_flags = scp->adp->va_flags;
+ ((video_adapter_info_t *)data)->va_io_base = scp->adp->va_io_base;
+ ((video_adapter_info_t *)data)->va_io_size = scp->adp->va_io_size;
+ ((video_adapter_info_t *)data)->va_crtc_addr = scp->adp->va_crtc_addr;
+ ((video_adapter_info_t *)data)->va_mem_base = scp->adp->va_mem_base;
+ ((video_adapter_info_t *)data)->va_mem_size = scp->adp->va_mem_size;
+ ((video_adapter_info_t *)data)->va_window = scp->adp->va_window;
+ ((video_adapter_info_t *)data)->va_window_size
+ = scp->adp->va_window_size;
+ ((video_adapter_info_t *)data)->va_window_gran
+ = scp->adp->va_window_gran;
+ ((video_adapter_info_t *)data)->va_buffer = scp->adp->va_buffer;
+ ((video_adapter_info_t *)data)->va_buffer_size
+ = scp->adp->va_buffer_size;
+ ((video_adapter_info_t *)data)->va_mode = scp->adp->va_mode;
+ ((video_adapter_info_t *)data)->va_mode_flags = scp->adp->va_mode_flags;
+ ((video_adapter_info_t *)data)->va_initial_mode
+ = scp->adp->va_initial_mode;
+ ((video_adapter_info_t *)data)->va_initial_bios_mode
+ = scp->adp->va_initial_bios_mode;
return 0;
case CONS_GET: /* get current video mode */
@@ -333,16 +402,16 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p)
return 0;
case CONS_MODEINFO: /* get mode information */
- return ((*biosvidsw.get_info)(scp->adp,
+ return ((*vidsw[scp->ad]->get_info)(scp->adp,
((video_info_t *)data)->vi_mode, (video_info_t *)data)
? ENODEV : 0);
case CONS_FINDMODE: /* find a matching video mode */
- return ((*biosvidsw.query_mode)(scp->adp, (video_info_t *)data)
+ return ((*vidsw[scp->ad]->query_mode)(scp->adp, (video_info_t *)data)
? ENODEV : 0);
case CONS_SETWINORG:
- return ((*biosvidsw.set_win_org)(scp->adp, *(u_int *)data)
+ return ((*vidsw[scp->ad]->set_win_org)(scp->adp, *(u_int *)data)
? ENODEV : 0);
/* generic text modes */
@@ -363,8 +432,13 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p)
case SW_ENH_B80x25: case SW_ENH_C80x25:
case SW_ENH_B80x43: case SW_ENH_C80x43:
case SW_EGAMONO80x25:
- adp = get_adapter(scp);
- if (!(adp->va_flags & V_ADP_MODECHANGE))
+
+#ifdef PC98
+ /* PC98 TEXT MODES */
+ case SW_PC98_80x25:
+ case SW_PC98_80x30:
+#endif
+ if (!(scp->adp->va_flags & V_ADP_MODECHANGE))
return ENODEV;
return sc_set_text_mode(scp, tp, cmd & 0xff, 0, 0, 0);
@@ -374,8 +448,7 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p)
case SW_CG640x350: case SW_ENH_CG640:
case SW_BG640x480: case SW_CG640x480: case SW_VGA_CG320:
case SW_VGA_MODEX:
- adp = get_adapter(scp);
- if (!(adp->va_flags & V_ADP_MODECHANGE))
+ if (!(scp->adp->va_flags & V_ADP_MODECHANGE))
return ENODEV;
return sc_set_graphics_mode(scp, tp, cmd & 0xff);
@@ -390,8 +463,7 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p)
return EINVAL;
/* restore fonts & palette ! */
#if 0
- adp = get_adapter(scp);
- if (ISFONTAVAIL(adp->va_flags)
+ if (ISFONTAVAIL(scp->adp->va_flags)
&& !(scp->status & (GRAPHICS_MODE | PIXEL_MODE)))
/*
* FONT KLUDGE
@@ -405,10 +477,10 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p)
copy_font(scp, LOAD, 16, font_16);
}
#endif
- load_palette(scp, palette);
+ load_palette(scp->adp, palette);
/* move hardware cursor out of the way */
- (*biosvidsw.set_hw_cursor)(scp->adp, -1, -1);
+ (*vidsw[scp->ad]->set_hw_cursor)(scp->adp, -1, -1);
/* FALL THROUGH */
@@ -424,6 +496,7 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p)
splx(s);
return error;
}
+#ifndef PC98
scp->status |= UNKNOWN_MODE;
splx(s);
/* no restore fonts & palette */
@@ -431,6 +504,14 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p)
set_mode(scp);
sc_clear_screen(scp);
scp->status &= ~UNKNOWN_MODE;
+#else /* PC98 */
+ scp->status &= ~UNKNOWN_MODE;
+ /* no restore fonts & palette */
+ if (scp == cur_console)
+ set_mode(scp);
+ sc_clear_screen(scp);
+ splx(s);
+#endif /* PC98 */
return 0;
case KD_PIXEL: /* pixel (raster) display */
@@ -448,7 +529,7 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p)
splx(s);
if (scp == cur_console) {
set_mode(scp);
- load_palette(scp, palette);
+ load_palette(scp->adp, palette);
}
sc_clear_screen(scp);
scp->status &= ~UNKNOWN_MODE;
@@ -462,6 +543,10 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p)
}
scp->status |= UNKNOWN_MODE;
splx(s);
+#ifdef PC98
+ if (scp == cur_console)
+ set_mode(scp);
+#endif
return 0;
default:
@@ -486,7 +571,7 @@ sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p)
case KDSBORDER: /* set border color of this (virtual) console */
scp->border = *data;
if (scp == cur_console)
- set_border(cur_console, scp->border);
+ set_border(scp, scp->border);
return 0;
}
OpenPOWER on IntegriCloud