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