xref: /csrg-svn/sys/news3400/fb/fb_probe.c (revision 63260)
153893Smckusick /*
2*63260Sbostic  * Copyright (c) 1992, 1993
3*63260Sbostic  *	The Regents of the University of California.  All rights reserved.
453893Smckusick  *
553893Smckusick  * This code is derived from software contributed to Berkeley by
653893Smckusick  * Sony Corp. and Kazumasa Utashiro of Software Research Associates, Inc.
753893Smckusick  *
853893Smckusick  * %sccs.include.redist.c%
953893Smckusick  *
1053893Smckusick  * from: $Hdr: fb_probe.c,v 4.300 91/06/09 06:32:57 root Rel41 $ SONY
1153893Smckusick  *
12*63260Sbostic  *	@(#)fb_probe.c	8.1 (Berkeley) 06/11/93
1353893Smckusick  */
1453893Smckusick 
1553893Smckusick #ifdef IPC_MRX
1653893Smckusick #include "../../iop/framebuf.h"
1753893Smckusick #include "types.h"
1853893Smckusick #include "exec.h"
1953893Smckusick #include "romsw.h"
2053893Smckusick #else
2157178Sutashiro #include <news3400/iop/framebuf.h>
2257178Sutashiro #include <sys/types.h>
2357178Sutashiro #include <sys/exec.h>
2453893Smckusick #endif
2553893Smckusick 
2657178Sutashiro #include <news3400/fb/fbdefs.h>
2753893Smckusick 
2853893Smckusick #ifdef CPU_SINGLE
2953893Smckusick #define SW_CONSOLE	0x07
3053893Smckusick #define SW_NWB512	0x04
3153893Smckusick #define SW_NWB225	0x01
3253893Smckusick #define SW_FBPOP	0x02
3353893Smckusick #define SW_FBPOP1	0x06
3453893Smckusick #define SW_FBPOP2	0x03
3553893Smckusick #define SW_AUTOSEL	0x07
3653893Smckusick #endif
3753893Smckusick 
3853893Smckusick struct fbdev	*consfb;
3953893Smckusick int	nfbdev = 0;
4053893Smckusick 
4153893Smckusick static int	cons_dev = -1;
4253893Smckusick extern struct fbdevsw	fbdevsw[];
4353893Smckusick 
4453893Smckusick #ifdef news3400
4553893Smckusick struct autodev	autodev[] = {
4653893Smckusick 	-1, (char *)0xb8600000, (char *)0xb8610000,
4753893Smckusick 	-1, (char *)0xb8620000, (char *)0xb8630000,
4853893Smckusick 	-1, (char *)0xb8640000, (char *)0xb8650000,
4953893Smckusick 	-1, (char *)0xb8660000, (char *)0xb8670000,
5053893Smckusick 	-1, (char *)0xb8680000, (char *)0xb8690000,
5153893Smckusick 	-1, (char *)0xb86a0000, (char *)0xb86b0000,
5253893Smckusick 	-1, (char *)0xb86c0000, (char *)0xb86d0000,
5353893Smckusick 	-1, (char *)0xb86e0000, (char *)0xb86f0000,
5453893Smckusick };
5553893Smckusick 
5653893Smckusick #define AUTOSEL	1
5753893Smckusick #endif /* news3400 */
5853893Smckusick 
5953893Smckusick #ifdef news3800
6053893Smckusick struct autodev	autodev[] = {
6153893Smckusick 	-1, (char *)0xee600000, (char *)0xee610000,
6253893Smckusick 	-1, (char *)0xee620000, (char *)0xee630000,
6353893Smckusick 	-1, (char *)0xee640000, (char *)0xee650000,
6453893Smckusick 	-1, (char *)0xee660000, (char *)0xee670000,
6553893Smckusick 	-1, (char *)0xee680000, (char *)0xee690000,
6653893Smckusick 	-1, (char *)0xee6a0000, (char *)0xee6b0000,
6753893Smckusick 	-1, (char *)0xee6c0000, (char *)0xee6d0000,
6853893Smckusick 	-1, (char *)0xee6e0000, (char *)0xee6f0000,
6953893Smckusick };
7053893Smckusick 
7153893Smckusick #define AUTOSEL	1
7253893Smckusick #endif /* news3800 */
7353893Smckusick 
search_fbdev(type,unit)7453893Smckusick search_fbdev(type, unit)
7553893Smckusick 	int type;
7653893Smckusick 	int unit;
7753893Smckusick {
7853893Smckusick 	register int i;
7953893Smckusick 
8053893Smckusick 	if (type == 0) {
8153893Smckusick 		if (cons_dev < 0)
8253893Smckusick 			return (unit < nfbdev ? unit : -1);
8353893Smckusick 		if (unit == 0)
8453893Smckusick 			return (cons_dev);
8553893Smckusick 		for (i = 0; i < nfbdev; i++)
8653893Smckusick 			if (i != cons_dev && --unit == 0)
8753893Smckusick 				return (i);
8853893Smckusick 	} else {
8953893Smckusick 		for (i = 0; i < nfbdev; i++)
9053893Smckusick 			if (fbdev[i].type == type && fbdev[i].unit == unit)
9153893Smckusick 				return(i);
9253893Smckusick 	}
9353893Smckusick 	return (-1);
9453893Smckusick }
9553893Smckusick 
9653893Smckusick #ifdef AUTOSEL
search_autocons()9753893Smckusick search_autocons()
9853893Smckusick {
9953893Smckusick 	register int i;
10053893Smckusick 
10153893Smckusick 	for (i = 0; i < 8; i++)
10253893Smckusick 		if (autodev[i].type != -1)
10353893Smckusick 			return (autodev[i].type);
10453893Smckusick 	return (-1);
10553893Smckusick }
10653893Smckusick 
fb_auto_probe()10753893Smckusick fb_auto_probe()
10853893Smckusick {
10953893Smckusick 	register int i;
11053893Smckusick 
11153893Smckusick 	for (i = 0; i < 8; i++) {
11253893Smckusick 		if (badaddr(autodev[i].base, 1)) {
11353893Smckusick 			autodev[i].type = -1;
11453893Smckusick 			continue;
11553893Smckusick 		}
11653893Smckusick 		if (*(long *)autodev[i].base != OMAGIC) {
11753893Smckusick 			autodev[i].type = 1;
11853893Smckusick 			continue;
11953893Smckusick 		}
12053893Smckusick 		switch((*(int *)(autodev[i].base + 0x20))) {
12153893Smckusick 		case 0:
12253893Smckusick 			autodev[i].type = FB_NWB514;
12353893Smckusick 			break;
12453893Smckusick 		case 1:
12553893Smckusick 			autodev[i].type = FB_NWB251;
12653893Smckusick 			break;
12753893Smckusick 		case 2:
12853893Smckusick 			autodev[i].type = FB_NWB518;
12953893Smckusick 			break;
13053893Smckusick 		case 3:
13153893Smckusick 		case 8:
13253893Smckusick 			autodev[i].type = FB_NWB254;
13353893Smckusick 			break;
13453893Smckusick 		case 4:
13553893Smckusick 		case 0x10004:
13653893Smckusick 		case 0x20004:
13753893Smckusick 			autodev[i].type = FB_NWB257;
13853893Smckusick 			break;
13953893Smckusick 		case 0x10005:
14053893Smckusick 		case 0x20005:
14153893Smckusick 			autodev[i].type = FB_NWB256;
14253893Smckusick 			break;
14353893Smckusick 		case 6:
14453893Smckusick 			autodev[i].type = FB_SLB101;
14553893Smckusick 			break;
14653893Smckusick 		case 7:
14753893Smckusick 			autodev[i].type = FB_NWB255;
14853893Smckusick 			break;
14953893Smckusick 		default:
15053893Smckusick 			autodev[i].type = -1;
15153893Smckusick 			break;
15253893Smckusick 		}
15353893Smckusick 	}
15453893Smckusick }
15553893Smckusick #endif /* AUTOSEL */
15653893Smckusick 
cons_probe(dipsw)15753893Smckusick cons_probe(dipsw)
15853893Smckusick 	int dipsw;
15953893Smckusick {
16053893Smckusick 	switch (dipsw & SW_CONSOLE) {
16153893Smckusick 
16253893Smckusick 	case SW_NWB225:
16353893Smckusick 		cons_dev = search_fbdev(FB_NWB225, 0);
16453893Smckusick 		break;
16553893Smckusick 
16653893Smckusick 	case SW_NWB512:
16753893Smckusick 		cons_dev = search_fbdev(FB_NWB512, 0);
16853893Smckusick 		break;
16953893Smckusick 
17053893Smckusick #ifdef CPU_SINGLE
17153893Smckusick 	case SW_FBPOP:
17253893Smckusick 	case SW_FBPOP1:
17353893Smckusick 	case SW_FBPOP2:
17453893Smckusick 		if ((cons_dev = search_fbdev(FB_LCDM, 0)) >= 0)
17553893Smckusick 			break;
17653893Smckusick 		if ((cons_dev = search_fbdev(FB_POPM, 0)) >= 0)
17753893Smckusick 			break;
17853893Smckusick 		if ((cons_dev = search_fbdev(FB_POPC, 0)) >= 0)
17953893Smckusick 			break;
18053893Smckusick 		if ((cons_dev = search_fbdev(FB_NWB252, 0)) >= 0)
18153893Smckusick 			break;
18253893Smckusick 		if ((cons_dev = search_fbdev(FB_NWB253, 0)) >= 0)
18353893Smckusick 			break;
18453893Smckusick 		break;
18553893Smckusick #endif /* CPU_SINGLE */
18653893Smckusick 
18753893Smckusick #ifdef AUTOSEL
18853893Smckusick 	case SW_AUTOSEL:
18953893Smckusick 		cons_dev = search_fbdev(search_autocons(), 0);
19053893Smckusick 		break;
19153893Smckusick #endif
19253893Smckusick 
19353893Smckusick 	default:
19453893Smckusick 		cons_dev = -1;
19553893Smckusick 		break;
19653893Smckusick 	}
19753893Smckusick 	if (cons_dev == -1)
19853893Smckusick 		consfb = 0;
19953893Smckusick 	else
20053893Smckusick 		consfb = &fbdev[cons_dev];
20153893Smckusick }
20253893Smckusick 
fbbm_probe(dipsw)20353893Smckusick void fbbm_probe(dipsw)
20453893Smckusick 	int dipsw;
20553893Smckusick {
20653893Smckusick 	register int i, j;
20753893Smckusick 	register struct fbdevsw	*pfsw = fbdevsw;
20853893Smckusick 
20953893Smckusick 	j = 0;
21053893Smckusick 
21153893Smckusick #ifdef AUTOSEL
21253893Smckusick 	fb_auto_probe();
21353893Smckusick #endif
21453893Smckusick 
21553893Smckusick 	while (pfsw->num) {
21653893Smckusick 		for (i = 0; i < pfsw->num; i++) {
21753893Smckusick 			if (fbdev[j].type = (*pfsw->fb_probe)(i, &fbdev[j])) {
21853893Smckusick 				fbdev[j].unit = i;
21953893Smckusick 				(*pfsw->fb_setup)(&fbdev[j], dipsw);
22053893Smckusick 				j++;
22153893Smckusick 			}
22253893Smckusick 		}
22353893Smckusick 		pfsw++;
22453893Smckusick 	}
22553893Smckusick 	nfbdev = j;
22653893Smckusick 
22753893Smckusick 	cons_probe(dipsw);
22853893Smckusick }
229