diff options
Diffstat (limited to 'sys/arch')
159 files changed, 13171 insertions, 5194 deletions
diff --git a/sys/arch/alpha/README b/sys/arch/alpha/README index 0ee83f2b924..52ed304ea99 100644 --- a/sys/arch/alpha/README +++ b/sys/arch/alpha/README @@ -1,79 +1,75 @@ -$NetBSD: README,v 1.7 1995/11/23 02:33:17 cgd Exp $ +$NetBSD: README,v 1.8.4.1 1996/06/13 20:49:01 cgd Exp $ Obtaining NetBSD/Alpha sources and binaries: - NetBSD/Alpha sources and binaries are available from: + NetBSD/Alpha's sources, with the exceptions of the GNU + toolchain and X11 code, are integrated into NetBSD-current, + and are available from: + ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-current/ + + The latest NetBSD/Alpha binary snapshot, and source snapshots + for the toolchain and X11 code, can be found at: ftp://ftp.netbsd.org/pub/NetBSD/arch/alpha - See the README.files file there to figure out which of - the following items corresponds to what file(s) in the FTP - archive. - There are two sets of system binaries available: + Binary snapshots include two different set of system binaries: (1) an rz25 disk image, for first-time installation - (see below), and - (2) two tar files of the binaries, for updates. + (see below for instructions), and + (2) three tar files of the binaries, for updates. (one of the tar files is the contents of /etc, - one is everything else, except a kernel. + one contains X11 binaries, and the last is everything + else, except the kernel and the installed boot block.) There are no instructions on how to use these. Good luck! 8-) - There are also two precompiled kernels available: one generic - kernel which will prompt for a root device, and one which tries - to boot diskless. The generic kernel is included in the rz25 - disk image. - - X11 client binaries are packaged seperately. (There is no - server at this time.) + Binary snapshots include a kernel image which is the same + as the one on the rz25 disk image. - There are several sets of sources available: - (1) kernel source snapshot (complete kernel sources), - (2) compiler toolchain source snapshot (complete - toolchain sources), - (3) diffs to the NetBSD-current sources as of the date - of the release to make them match what's used on - the alpha port. (You should be able to get the - NetBSD-current sources, replace the kernel sources - with the ones i'm distributing, add in these - diffs and the toolchain sources, and compile up a - complete system.) - (4) diffs to the XFree86 3.1.2 sources to make them - work with NetBSD/Alpha. (If you add these to - the XFree86 3.1.2 sources, you should be able to - compile up the X clients.) + The sources provided seperately from the normal NetBSD-current + distribution are: + (1) complete compiler toolchain sources + (2) diffs against the XFree86 3.1.2 distribution to + make X work with NetBSD/Alpha. (Note that + at this time, the diffs are against 3.1.2, + i.e. not against 3.1.2D, etc.) - If you are interested in the NetBSD/Alpha port, I suggest that you - subscribe to the NetBSD "port-alpha" mailing list by sending an - email message to majordomo@netbsd.org with no subject and with a - body of "subscribe port-alpha" (without the quotes). For help on - using majordomo, send it mail with an empty subject and body. + If you are using or are interested in the NetBSD/Alpha port, I + suggest that you subscribe to the NetBSD "port-alpha" mailing list + by sending an email message to majordomo@netbsd.org with no + subject and with a body of "subscribe port-alpha" (without the + quotes). For help on using majordomo, send it mail with an empty + subject and body. In general, questions about NetBSD/Alpha + are best asked on that mailing list (rather than by sending me + mail directly). Installing the NetBSD/Alpha distribution: [ Note that these instructions are minimal; it's assumed that if you're going to be installing this, you're knowledgeable about - booting Alphas and doing other sysadmin-ish stuff, are willing - to look in your Alpha documentation, or are brave. If they're - really not good enough to get you running, get in touch with me - and I'll try to help you. ] + booting Alphas and doing sysadmin-ish stuff, are willing to look + in your Alpha documentation, or are brave. If they're really not + good enough to get you running, get in touch with me and I'll try + to help you. ] To install the NetBSD/Alpha distribution, you'll need a disk at least the size of an RZ25 -- about 406Mb. Once you've gotten the - binary distribution from me, gunzip it and dd it to the raw disk. - The binary distribution includes a disklabel and boot block, so you - don't need to do anything special to make it bootable. I created - the binary distribution's file systems with an older version (4.3 - Reno) of the Berkeley Fast File System format, so that you can - mount, read, and write them under OSF/1. - - Once you've dd'd the image to the disk, set your system to use a - serial console. Boot the Alpha with the NetBSD disk, supplying the - boot flag "-s". It should print something about "NetBSD/Alpha Boot - program", load the kernel, print a copyright, and print various - startup messages. Included among those startup messages will be - SCSI bus/id to device name mappings for all of the SCSI devices - that NetBSD recognizes. Eventually, it'll ask you for the name of - the root device. It expects something like "sd0", "sd1", etc., and - you should pick the name that corresponds to the NetBSD disk. + binary distribution, gunzip it and dd it to the raw disk. The binary + distribution includes a disklabel and boot block, so you don't need + to do anything special to make it bootable. The binary distribution's + file systems are created with an older version ("Level 1") of the + Berkeley Fast File System format, so that you can mount, read, and + write them under Digital UNIX. + + If your are using one of the supported systems that includes a + PCI bus, and have either a PCI VGA frame buffer of any type or + a ZLXp-E1 frame buffer, you may use it as console. (If you + are using your frame buffer as the console, you should use the + terminal type 'sun'.) Otherwise (if you are using a TurboChannel + Alpha or have a different kind of frame buffer, you have to use + a serial console.) + + Boot the Alpha with the NetBSD disk, supplying the boot flag "-s". + It should print something like "NetBSD/Alpha Boot program", load + the kernel, print a copyright, and print various startup messages. After a short while, you should be asked for the name of a shell to use; just hit return. You're advised to fsck the disk at this @@ -81,54 +77,42 @@ Installing the NetBSD/Alpha distribution: is partition 'd'), remount the root partition read-write (use mount -u root-dev /), and create some necessary system information files: /etc/hosts - /etc/resolv.conf (if you want to use DNS) - /etc/myname (the hostname of the machine) - /etc/mygate (the LAN's gateway's IP address, if your network - setup requires that it be named explicitly) - /etc/hostname.le0 (on TurboChannel machines, to describe - the enet addr, etc., for the Alpha's ethernet. The - format can be discerned by looking in /etc/netstart. - As an example, for my development machine, it's: - inet macallan.dssc.cs.cmu.edu 0xffff0000 128.2.255.255 - ^^^^^^^^^^^^^^^hostname ^^^netmask ^^^broadcast) - /etc/hostname.de0 (on PCI machines; same format as - hostname.le0 would have.) - /etc/fstab (a prototype is in /etc/fstab.sd) + /etc/resolv.conf + DNS resolver configuration information, if you + want to use DNS. + /etc/myname + The hostname of the machine. + /etc/mygate + The LAN's gateway's IP address, if your network + setup requires that a static route to the + gateway be created. + /etc/hostname.xxy + (where "xxy" is your machine's ethernet + interface name, e.g. "le0" for TurboChannel + machines or "de0" for PCI machines.) + The IP address, etc., for the named network + interface. (You can have multiple of these + files, for example, if the machine is + multi-homed.) The format can be discerned by + looking in /etc/netstart, and is typically + something like: + inet hostname.in.etc.hosts net.mask broadcast.addr + where the netmask is formatted as a hex number + (e.g. 0xffffff00), and the broadcast address + is formatted as an IP address (e.g. 128.2.255.255) + /etc/fstab + The file system information table for the system. + A prototype is in /etc/fstab.sd. (You can also create the files mentioned above by mounting the - disk's file systems under OSF/1 and filling in the appropriate - information.) + disk's file systems under Digital UNIX.) Once those files are created, you should be able to boot the system multi-user. To do so, halt the system and boot again from the - NetBSD disk, this time supplying the boot flags "-a". - - Once the system has booted, you should be able to log in over the - network. (Log in as root, at first, then use vipw to create user - account(s) and re-log in as the appropriate user.) If you used a - disk other than an RZ25, you may also want to edit the disk's - disklabel, and create one or more partitions to use the extra space. - -Using NetBSD/Alpha: - You'll probably want to NFS mount the sources from another machine; - that's what I do, and it works just fine. If you'd like tips on - good ways to keep the NetBSD sources under source control, just ask. - - A fair number of binaries don't work properly. For example, GDB - won't properly run programs or debug core files; someone needs - to write support for NetBSD/Alpha. - - As noted above, the SCSI code on TurboChannel machines is reliable - only when being used with one SCSI bus at a time; this is obviously - a bug. Additionally, the SCSI driver seems unhappy about dealing - with certain types of disk drives (e.g. the IBM Lightning). - - Because I've been working on getting the system up and running, then - out the door, I've not had much time to do performance analysis on - the kernel, nor tried to improve performance in any way. Some of - the code is awfully rough. That being said, on a lot of operations - I'm seeing performance comparable to that of OSF/1 on the same - hardware, so I've not gone too far wrong anywhere. + NetBSD disk, this time supplying the boot flag "-a". + If you used a disk other than an RZ25, you may want to edit the + disk's disklabel, and create one or more partitions after the + existing partitions to use the extra space. Chris Demetriou diff --git a/sys/arch/alpha/STATUS b/sys/arch/alpha/STATUS index 6f9d08c679b..587e159f5d8 100644 --- a/sys/arch/alpha/STATUS +++ b/sys/arch/alpha/STATUS @@ -1,7 +1,10 @@ -$NetBSD: STATUS,v 1.2 1995/11/23 02:33:26 cgd Exp $ +$NetBSD: STATUS,v 1.3.4.1 1996/06/13 20:49:04 cgd Exp $ NetBSD/Alpha's Status +If you find an inaccuracy in this file, can clarify it in any place, +etc., please send mail to me (cgd@cs.cmu.edu). + Supported hardware: @@ -9,54 +12,66 @@ Supported hardware: 600, but the rest should "just work) using the following peripherals: - Built-in serial ports - LANCE ethernet -- only the on-board interface. (see below.) - SCSI system -- it recognizes and can use both on-board SCSI - controller chips. However, it has trouble working with - both at the same time. + Supported hardware: + Built-in serial ports + Built-in LANCE ethernet. + Built-in SCSI chips (53c[f]94), though both + may not work at the same time. + + Things that may work but haven't been tested: + TurboChannel option slot LANCE (PMAD-A) Things are aren't supported: No frame buffers of any type. - Devices in TurboChannel option slots (see the + Other TurboChannel option boards (see the TODO.users file.) The ISDN/Audio chip. DEC 3000/300 family, with same hardware above. - *** NOTE THAT I HAVE NOT TESTED NEW KERNELS THOROUGHLY ON - DEC 3000/[3-900] SYSTEMS! - - AlphaStation {200,250,400} systems using the following + AlphaStation {200,250,255,400} systems using the following peripherals: - On-board NRC 53c810 SCSI. - On-board ns16550-based serial ports. - DC21040-based ethernet (on-board or in an option - slot). - DC21050-based PCI-PCI bridges (though other - types of PCI-PCI bridges should work). - PCI VGA video boards. - DEC ZLXp-E1 (DC21030-based, "TGA") video boards. - Keyboard. + Supported hardware: + NCR 53c810 SCSI (built-in or PCI board). + Built-in ns16550 serial ports. + DC21040-based ethernet (built-in or PCI board). + DC21140-based PCI ethernet boards. + DC21050-based PCI-PCI bridges (though other + types of PCI-PCI bridges should work). + PCI VGA video boards. + DEC ZLXp-E1 (DC21030-based, "TGA") video boards. + Keyboard. + PS/2-style mice. + + Things that may work but haven't been tested: + Built-in parallel ports. + ISA ns16x50-family serial port boards. + ISA ns16x50 multi-port serial boards. + Other NCR 53c8xx SCSI boards. Things that ARE NOT supported at this time: - DEC ZLXp-E2 and ZLXp-E3 video boards. - Mouse. - Sound hardware (Windows Sound System). + ISA VGA boards. + Sound hardware (including Windows Sound System + built-in on some machines). + DEC ZLXp-E2 and ZLXp-E3 PCI video boards. + Other PCI boards. AlphaStation 600 systems, with the same supported hardware - list as the AlphaStation {200,250,400} systems. (NOTE THAT - THAT MEANS THE AlphaStation 600's BUILT-IN SCSI CONTROLLERS - DO NOT WORK. You'll need to get a 53c810 board, or - something.) + list as the AlphaStation {200,250,255,400} systems. (NOTE + THAT THAT MEANS THE AlphaStation 600's BUILT-IN SCSI + CONTROLLERS DO NOT WORK. You'll need to get a 53c810 board, + or run diskless.) AlphaStation 500 systems may work, but + have not been tested. - AXPpci systems, with the same supported hardware list as - the AlphaStation {200,250,400} systems. (AXPpci support - was written by Jeffrey Hsu. Thanks, Jeff!) + AXPpci systems (including Multia), with the same supported + hardware list as the AlphaStation {200,250,255,400} systems. At this time none of the following systems are supported: - DECpc AXP systems (EISA-bus PC-like systems) - Alpha "server" systems + DECpc AXP 150 systems (EISA-bus PC-like systems) + Alpha "server" systems (other than perhaps the + AlphaServer 400, which might be an AlphaStation 400 + in disguise). Multiprocessor Alpha systems I was hoping to get a DECpc AXP port working "for free" based on @@ -66,28 +81,30 @@ NetBSD/Alpha run on the DECpc AXP system, get in touch and I'll do what I can to help you get started. -Console frame buffers & keyboard are supported only on the AlphaStation -and AXPpci families of machines. On the TurboChannel-baesd machines, -NetBSD/Alpha _must_ be used with a serial console. To configure various -Alpha systems to use a serial console, do the following depending on -the model: +Console frame buffers & keyboard are supported only with the frame +buffers and keyboards mentioned as supported above. On other systems +(including all TurboChannel-based machines), NetBSD/Alpha _must_ be used +with a serial console. To configure various Alpha systems to use a serial +console, do the following depending on the model: DEC 3000/[4-9]00's: Flip the appropriate switch on the back of the machine. - (See your owner's manual for more details.) DEC 3000/300 family machines: Boot the machine with the keyboard/mouse connector unplugged. - DECpc AXPs, AXPpcis, and AlphaStations: + DECpc AXPs, AlphaStations, and AXPpci systems: Get to the console prompt. Set the variable "console" to be "serial", and "init" or power cycle the system. +See your owner's manual for more details on how to set your machine +to use a serial console. + See the file src/sys/arch/alpha/README to find out how to get the -latest sources and/or binaries. +latest sources and binaries. Please see the file src/sys/arch/alpha/TODO.users for a list of things that users can do to help NetBSD/Alpha improve. If you're interested @@ -96,4 +113,4 @@ I'll do what I can to help. Chris Demetriou -cgd@netbsd.org +cgd@cs.cmu.edu diff --git a/sys/arch/alpha/TODO.users b/sys/arch/alpha/TODO.users index 410c973a7f1..c3d5f39ccfb 100644 --- a/sys/arch/alpha/TODO.users +++ b/sys/arch/alpha/TODO.users @@ -1,14 +1,14 @@ -$NetBSD: TODO.users,v 1.2 1995/11/23 02:33:29 cgd Exp $ +$NetBSD: TODO.users,v 1.3.4.1 1996/06/13 20:49:07 cgd Exp $ The NetBSD/Alpha "User" To-Do List -The following are things that I'd like to see "users" of NetBSD/Alpha do. -It's unlikely that I'll get around to them in any reasonable time -frame, and I think they _should_ get done. +The following are things that I'd like to see "users" of NetBSD/Alpha +do. It's unlikely that I'll get around to them in any reasonable time +frame, and I think they should get done. -If you think of something that should be added to this list (and don't -want to do it yourself, right then 8-), send me mail and I'll add it. +If you think of something that should be added to this list send me +mail and I'll add it. If you're planning to work on something on this list, send me mail and tell me about it, so that I can keep people from duplicating work. @@ -16,35 +16,23 @@ Once you've done something on this list, send me context diffs. Chris Demetriou -cgd@netbsd.org +cgd@cs.cmu.edu -- -Make GDB work. - (1) function arguments and local variables don't seem to work. - Test programs; find and fix bugs. In particular: (1) make sure accounting works - (2) figure out why strip doesn't seem to work - (3) last i checked, 'file' core dumped - (4) /usr/games - -Make TurboChannel option slots work reasonably. This will require - different sets of code to be written on the 3000/[4-9]00 and on the - 3000/300 families. It shouldn't be too hard, but you will need some - devices that live in option slots. + (2) last i checked, 'file' core dumped + (3) /usr/games -Once TC option slots work, somebody with a TC ethernet board should - make it work, for completeness. +Test TurboChannel option slot support. Write TurboChannel option +board drivers. Test PMAD-A (TC le) driver. Get the GNU tools to generate a.out binaries for the alpha. Once that - is done: - (1) make gprof work, then profile the kernel and tell me how - bad my assumptions lost. - (2) make the rest of the NetBSD a.out-manipulation tools (e.g. - nm) work. +is done, make the rest of the NetBSD a.out-manipulation tools (e.g. nm) +work. Make DDB work. (For completeness, may require a.out kernel binaries - and/or some ecoff symbol handling code to be written; the former - is strongly preferred.) +and/or some ecoff symbol handling code to be written; the former is +strongly preferred.) -Track down bugs caused by compiling the kernel with -O. (At least - some of these are likely to be code generation bugs.) +Track down any bugs caused by compiling the kernel with -O. (At least +some of these may be code generation bugs.) diff --git a/sys/arch/alpha/alpha/autoconf.c b/sys/arch/alpha/alpha/autoconf.c index c7e77b828fe..e81471449f2 100644 --- a/sys/arch/alpha/alpha/autoconf.c +++ b/sys/arch/alpha/alpha/autoconf.c @@ -1,30 +1,47 @@ -/* $NetBSD: autoconf.c,v 1.1 1995/02/13 23:06:49 cgd Exp $ */ +/* $NetBSD: autoconf.c,v 1.3.4.3 1996/06/14 20:42:41 cgd Exp $ */ /* - * Copyright (c) 1994, 1995 Carnegie-Mellon University. - * All rights reserved. + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. * - * Authors: Keith Bostic, Chris G. Demetriou - * - * Permission to use, copy, modify and distribute this software and - * its documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND - * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to + * This software was developed by the Computer Systems Engineering group + * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and + * contributed to Berkeley. * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 + * All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Lawrence Berkeley Laboratory. * - * any improvements or extensions that they make and grant Carnegie the - * rights to redistribute these changes. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)autoconf.c 8.4 (Berkeley) 10/1/93 */ #include <sys/param.h> @@ -36,6 +53,24 @@ #include <sys/device.h> #include <machine/autoconf.h> +#include <machine/prom.h> + +extern char root_device[17]; /* XXX */ + +struct device *booted_device; +int booted_partition; +struct bootdev_data *bootdev_data; +char boot_dev[128]; + +void parse_prom_bootdev __P((void)); +int atoi __P((char *)); + +struct device *parsedisk __P((char *str, int len, int defpart, dev_t *devp)); +static struct device *getdisk __P((char *str, int len, int defpart, + dev_t *devp)); +static int findblkmajor __P((struct device *dv)); +static char *findblkname __P((int)); +static int getstr __P((char *cp, int size)); /* * configure: @@ -46,18 +81,17 @@ configure() { extern int cold; + parse_prom_bootdev(); + (void)splhigh(); - if (config_rootfound("mainbus", "mainbus") == 0) + if (config_rootfound("mainbus", "mainbus") == NULL) panic("no mainbus found"); (void)spl0(); -#ifdef GENERIC - if ((boothowto & RB_ASKNAME) == 0) - setroot(); - setconf(); -#else + if (booted_device == NULL) + printf("WARNING: can't figure what device matches \"%s\"\n", + boot_dev); setroot(); -#endif swapconf(); cold = 0; } @@ -67,12 +101,11 @@ configure() */ swapconf() { - register struct swdevt *swp; - register int nblks; + struct swdevt *swp; + int nblks, maj; for (swp = swdevt; swp->sw_dev != NODEV; swp++) { - int maj = major(swp->sw_dev); - + maj = major(swp->sw_dev); if (maj > nblkdev) break; if (bdevsw[maj].d_psize) { @@ -83,62 +116,306 @@ swapconf() swp->sw_nblks = ctod(dtoc(swp->sw_nblks)); } } + dumpconf(); } -#define DOSWAP /* change swdevt and dumpdev */ -dev_t bootdev = 0; /* should be dev_t, but not until 32 bits */ - -static char devname[][2] = { - 'x','x', /* 0 = XX */ - 'x','x', /* 1 = XX */ - 'x','x', /* 2 = XX */ - 'x','x', /* 3 = XX */ - 'x','x', /* 4 = XX */ - 'x','x', /* 5 = XX */ - 'x','x', /* 6 = XX */ - 'x','x', /* 7 = XX */ - 's','d', /* 8 = sd */ +struct nam2blk { + char *name; + int maj; +} nam2blk[] = { + { "st", 2 }, + { "cd", 3 }, + { "sd", 8 }, +#if 0 + { "fd", XXX }, +#endif }; +static int +findblkmajor(dv) + struct device *dv; +{ + char *name = dv->dv_xname; + register int i; + + for (i = 0; i < sizeof(nam2blk)/sizeof(nam2blk[0]); ++i) + if (strncmp(name, nam2blk[i].name, strlen(nam2blk[0].name)) + == 0) + return (nam2blk[i].maj); + return (-1); +} + +static char * +findblkname(maj) + int maj; +{ + register int i; + + for (i = 0; i < sizeof(nam2blk)/sizeof(nam2blk[0]); ++i) + if (maj == nam2blk[i].maj) + return (nam2blk[i].name); + return (NULL); +} + +static struct device * +getdisk(str, len, defpart, devp) + char *str; + int len, defpart; + dev_t *devp; +{ + register struct device *dv; + + if ((dv = parsedisk(str, len, defpart, devp)) == NULL) { + printf("use one of:"); + for (dv = alldevs.tqh_first; dv != NULL; + dv = dv->dv_list.tqe_next) { + if (dv->dv_class == DV_DISK) + printf(" %s[a-h]", dv->dv_xname); +#ifdef NFSCLIENT + if (dv->dv_class == DV_IFNET) + printf(" %s", dv->dv_xname); +#endif + } + printf("\n"); + } + return (dv); +} + +struct device * +parsedisk(str, len, defpart, devp) + char *str; + int len, defpart; + dev_t *devp; +{ + register struct device *dv; + register char *cp, c; + int majdev, part; + + if (len == 0) + return (NULL); + cp = str + len - 1; + c = *cp; + if (c >= 'a' && c <= ('a' + MAXPARTITIONS - 1)) { + part = c - 'a'; + *cp = '\0'; + } else + part = defpart; + + for (dv = alldevs.tqh_first; dv != NULL; dv = dv->dv_list.tqe_next) { + if (dv->dv_class == DV_DISK && + strcmp(str, dv->dv_xname) == 0) { + majdev = findblkmajor(dv); + if (majdev < 0) + panic("parsedisk"); + *devp = MAKEDISKDEV(majdev, dv->dv_unit, part); + break; + } +#ifdef NFSCLIENT + if (dv->dv_class == DV_IFNET && + strcmp(str, dv->dv_xname) == 0) { + *devp = NODEV; + break; + } +#endif + } + + *cp = c; + return (dv); +} + /* * Attempt to find the device from which we were booted. * If we can do so, and not instructed not to do so, * change rootdev to correspond to the load device. + * + * XXX Actually, swap and root must be on the same type of device, + * (ie. DV_DISK or DV_IFNET) because of how (*mountroot) is written. + * That should be fixed. */ setroot() { - int majdev, mindev, unit, part, adaptor; - dev_t temp, orootdev; struct swdevt *swp; + struct device *dv; + register int len; + dev_t nrootdev, nswapdev = NODEV; + char buf[128], *rootdevname; + extern int (*mountroot) __P((void *)); + dev_t temp; + struct device *bootdv, *rootdv, *swapdv; + int bootpartition; +#if defined(NFSCLIENT) + extern char *nfsbootdevname; + extern int nfs_mountroot __P((void *)); +#endif +#if defined(FFS) + extern int ffs_mountroot __P((void *)); +#endif + + bootdv = booted_device; + bootpartition = booted_partition; -/*printf("howto %x bootdev %x ", boothowto, bootdev);*/ - if (boothowto & RB_DFLTROOT || - (bootdev & B_MAGICMASK) != (u_long)B_DEVMAGIC) - return; - majdev = (bootdev >> B_TYPESHIFT) & B_TYPEMASK; - if (majdev > sizeof(devname) / sizeof(devname[0])) - return; - adaptor = (bootdev >> B_ADAPTORSHIFT) & B_ADAPTORMASK; - part = (bootdev >> B_PARTITIONSHIFT) & B_PARTITIONMASK; - unit = (bootdev >> B_UNITSHIFT) & B_UNITMASK; - mindev = (unit * MAXPARTITIONS) + part; - orootdev = rootdev; - rootdev = makedev(majdev, mindev); /* - * If the original rootdev is the same as the one - * just calculated, don't need to adjust the swap configuration. + * If 'swap generic' and we couldn't determine root device, + * ask the user. */ - if (rootdev == orootdev) + if (mountroot == NULL && bootdv == NULL) + boothowto |= RB_ASKNAME; + + if (boothowto & RB_ASKNAME) { + for (;;) { + printf("root device"); + if (bootdv != NULL) + printf(" (default %s%c)", + bootdv->dv_xname, + bootdv->dv_class == DV_DISK + ? bootpartition + 'a' : ' '); + printf(": "); + len = getstr(buf, sizeof(buf)); + if (len == 0 && bootdv != NULL) { + strcpy(buf, bootdv->dv_xname); + len = strlen(buf); + } + if (len == 4 && !strcmp(buf, "halt")) + boot(RB_HALT); + if (len > 0 && buf[len - 1] == '*') { + buf[--len] = '\0'; + dv = getdisk(buf, len, 1, &nrootdev); + if (dv != NULL) { + rootdv = dv; + nswapdev = nrootdev; + goto gotswap; + } + } + dv = getdisk(buf, len, bootpartition, &nrootdev); + if (dv != NULL) { + rootdv = dv; + break; + } + } + + /* + * because swap must be on same device type as root, for + * network devices this is easy. + */ + if (rootdv->dv_class == DV_IFNET) { + swapdv = NULL; + goto gotswap; + } + for (;;) { + printf("swap device"); + printf(" (default %s%c)", rootdv->dv_xname, + rootdv->dv_class == DV_DISK?'b':' '); + printf(": "); + len = getstr(buf, sizeof(buf)); + if (len == 0) { + switch (rootdv->dv_class) { + case DV_IFNET: + nswapdev = NODEV; + break; + case DV_DISK: + nswapdev = MAKEDISKDEV(major(nrootdev), + DISKUNIT(nrootdev), 1); + break; + case DV_TAPE: + case DV_TTY: + case DV_DULL: + case DV_CPU: + break; + } + swapdv = rootdv; + break; + } + if (len == 4 && !strcmp(buf, "halt")) + boot(RB_HALT); + dv = getdisk(buf, len, 1, &nswapdev); + if (dv) { + if (dv->dv_class == DV_IFNET) + nswapdev = NODEV; + swapdv = dv; + break; + } + } +gotswap: + rootdev = nrootdev; + dumpdev = nswapdev; + swdevt[0].sw_dev = nswapdev; + swdevt[1].sw_dev = NODEV; + } else if (mountroot == NULL) { + int majdev; + + /* + * "swap generic" + */ + majdev = findblkmajor(bootdv); + if (majdev >= 0) { + /* + * Root and swap are on a disk. + */ + rootdv = swapdv = bootdv; + rootdev = MAKEDISKDEV(majdev, bootdv->dv_unit, + bootpartition); + nswapdev = dumpdev = + MAKEDISKDEV(majdev, bootdv->dv_unit, 1); + } else { + /* + * Root and swap are on a net. + */ + rootdv = swapdv = bootdv; + nswapdev = dumpdev = NODEV; + } + swdevt[0].sw_dev = nswapdev; + swdevt[1].sw_dev = NODEV; + } else { + /* + * `root DEV swap DEV': honour rootdev/swdevt. + * rootdev/swdevt/mountroot already properly set. + */ + + rootdevname = findblkname(major(rootdev)); + if (rootdevname == NULL) { + /* Root on NFS or unknown device. */ + strcpy(root_device, "??"); + } else { + /* Root on known block device. */ + sprintf(root_device, "%s%d%c", rootdevname, + DISKUNIT(rootdev), DISKPART(rootdev) + 'a'); + } + return; - printf("changing root device to %c%c%d%c\n", - devname[majdev][0], devname[majdev][1], - unit, part + 'a'); + } -#ifdef DOSWAP + switch (rootdv->dv_class) { +#if defined(NFSCLIENT) + case DV_IFNET: + strcpy(root_device, "??"); + mountroot = nfs_mountroot; + nfsbootdevname = rootdv->dv_xname; + return; +#endif +#if defined(FFS) + case DV_DISK: + mountroot = ffs_mountroot; + sprintf(root_device, "%s%c", rootdv->dv_xname, + DISKPART(rootdev) + 'a'); + printf("root on %s", root_device); + if (nswapdev != NODEV) + printf(" swap on %s%c", swapdv->dv_xname, + DISKPART(nswapdev) + 'a'); + printf("\n"); + break; +#endif + default: + printf("can't figure root, hope your kernel is right\n"); + return; + } + + /* + * Make the swap partition on the root drive the primary swap. + */ + temp = NODEV; for (swp = swdevt; swp->sw_dev != NODEV; swp++) { - if (majdev == major(swp->sw_dev) && - (mindev / MAXPARTITIONS) - == (minor(swp->sw_dev) / MAXPARTITIONS)) { + if (major(rootdev) == major(swp->sw_dev) && + DISKUNIT(rootdev) == DISKUNIT(swp->sw_dev)) { temp = swdevt[0].sw_dev; swdevt[0].sw_dev = swp->sw_dev; swp->sw_dev = temp; @@ -154,5 +431,154 @@ setroot() */ if (temp == dumpdev) dumpdev = swdevt[0].sw_dev; +} + +static int +getstr(cp, size) + register char *cp; + register int size; +{ + register char *lp; + register int c; + register int len; + + lp = cp; + len = 0; + for (;;) { + c = cngetc(); + switch (c) { + case '\n': + case '\r': + printf("\n"); + *lp++ = '\0'; + return (len); + case '\b': + case '\177': + case '#': + if (len) { + --len; + --lp; + printf("\b \b"); + } + continue; + case '@': + case 'u'&037: + len = 0; + lp = cp; + printf("\n"); + continue; + default: + if (len + 1 >= size || c < ' ') { + printf("\007"); + continue; + } + printf("%c", c); + ++len; + *lp++ = c; + } + } +} + +void +parse_prom_bootdev() +{ + static char hacked_boot_dev[128]; + static struct bootdev_data bd; + char *cp, *scp, *boot_fields[8]; + int i, done; + + booted_device = NULL; + booted_partition = 0; + bootdev_data = NULL; + + prom_getenv(PROM_E_BOOTED_DEV, boot_dev, sizeof(boot_dev)); + bcopy(boot_dev, hacked_boot_dev, sizeof hacked_boot_dev); +#if 0 + printf("parse_prom_bootdev: boot dev = \"%s\"\n", boot_dev); #endif + + i = 0; + scp = cp = hacked_boot_dev; + for (done = 0; !done; cp++) { + if (*cp != ' ' && *cp != '\0') + continue; + if (*cp == '\0') + done = 1; + + *cp = '\0'; + boot_fields[i++] = scp; + scp = cp + 1; + if (i == 8) + done = 1; + } + if (i != 8) + return; /* doesn't look like anything we know! */ + +#if 0 + printf("i = %d, done = %d\n", i, done); + for (i--; i >= 0; i--) + printf("%d = %s\n", i, boot_fields[i]); +#endif + + bd.protocol = boot_fields[0]; + bd.bus = atoi(boot_fields[1]); + bd.slot = atoi(boot_fields[2]); + bd.channel = atoi(boot_fields[3]); + bd.remote_address = boot_fields[4]; + bd.unit = atoi(boot_fields[5]); + bd.boot_dev_type = atoi(boot_fields[6]); + bd.ctrl_dev_type = boot_fields[7]; + +#if 0 + printf("parsed: proto = %s, bus = %d, slot = %d, channel = %d,\n", + bd.protocol, bd.bus, bd.slot, bd.channel); + printf("\tremote = %s, unit = %d, dev_type = %d, ctrl_type = %s\n", + bd.remote_address, bd.unit, bd.boot_dev_type, bd.ctrl_dev_type); +#endif + + bootdev_data = &bd; +} + +int +atoi(s) + char *s; +{ + int n, neg; + char c; + + n = 0; + neg = 0; + + while (*s == '-') { + s++; + neg = !neg; + } + + while (*s != '\0') { + if (*s < '0' && *s > '9') + break; + + n = (10 * n) + (*s - '0'); + s++; + } + + return (neg ? -n : n); +} + +void +device_register(dev, aux) + struct device *dev; + void *aux; +{ + extern void (*cpu_device_register) __P((struct device *dev, void *aux)); + + if (bootdev_data == NULL) { + /* + * There is no hope. + */ + + return; + } + + (*cpu_device_register)(dev, aux); } diff --git a/sys/arch/alpha/alpha/clock.c b/sys/arch/alpha/alpha/clock.c index ec01cf72089..9fb7678429a 100644 --- a/sys/arch/alpha/alpha/clock.c +++ b/sys/arch/alpha/alpha/clock.c @@ -1,4 +1,4 @@ -/* $NetBSD: clock.c,v 1.6 1995/12/20 00:38:53 cgd Exp $ */ +/* $NetBSD: clock.c,v 1.10 1996/04/23 15:26:06 cgd Exp $ */ /* * Copyright (c) 1988 University of Utah. @@ -51,32 +51,6 @@ #include <alpha/alpha/clockvar.h> -#include "ioasic.h" -#if NIOASIC -#include <dev/tc/tcreg.h> -#include <dev/tc/tcvar.h> -#include <dev/tc/ioasicvar.h> /* XXX */ -#endif - -#include "isa.h" -#if NISA -#include <dev/isa/isavar.h> /* XXX */ -#endif - -/* Definition of the driver for autoconfig. */ -static int clockmatch __P((struct device *, void *, void *)); -static void clockattach __P((struct device *, struct device *, void *)); -struct cfdriver clockcd = - { NULL, "clock", clockmatch, clockattach, DV_DULL, - sizeof(struct clock_softc) }; - -#if defined(DEC_3000_500) || defined(DEC_3000_300) || \ - defined(DEC_2000_300) || defined(DEC_2100_A50) || \ - defined(DEC_KN20AA) -void mcclock_attach __P((struct device *parent, - struct device *self, void *aux)); -#endif - #define SECMIN ((unsigned)60) /* seconds per minute */ #define SECHOUR ((unsigned)(60*SECMIN)) /* seconds per hour */ #define SECDAY ((unsigned)(24*SECHOUR)) /* seconds per day */ @@ -84,64 +58,29 @@ void mcclock_attach __P((struct device *parent, #define LEAPYEAR(year) (((year) % 4) == 0) -static int -clockmatch(parent, cfdata, aux) - struct device *parent; - void *cfdata; - void *aux; -{ - struct cfdata *cf = cfdata; - struct confargs *ca = aux; - -#if NIOASIC - if (parent->dv_cfdata->cf_driver == &ioasiccd) { - struct ioasicdev_attach_args *d = aux; +struct device *clockdev; +const struct clockfns *clockfns; +int clockinitted; - if (strncmp("TOY_RTC ", d->iada_modname, TC_ROM_LLEN)) - return (0); - } else -#endif -#if NISA - if ((parent->dv_cfdata->cf_driver == &isacd)) { - struct isadev_attach_args *ida = aux; - - /* XXX XXX XXX */ - if (ida->ida_port[0] != 0x70 && ida->ida_port[0] != -1) - return (0); - - ida->ida_port[0] = 0x70; /* XXX */ - ida->ida_nports[0] = 2; /* XXX */ - ida->ida_iosiz[0] = 0; - } else -#endif - return (0); - - return (1); -} - -static void -clockattach(parent, self, aux) - struct device *parent; - struct device *self; - void *aux; +void +clockattach(dev, fns) + struct device *dev; + const struct clockfns *fns; { /* - * XXX deal with other clock type, if the system - * XXX supports the other clock. get systype - * from RPB. - */ - mcclock_attach(parent, self, aux); - - /* * establish the clock interrupt; it's a special case */ set_clockintr(); #ifdef EVCNT_COUNTERS evcnt_attach(self, "intr", &clock_intr_evcnt); #endif - printf("\n"); + + if (clockfns != NULL) + panic("clockattach: multiple clocks"); + clockdev = dev; + clockfns = fns; } /* @@ -161,14 +100,14 @@ clockattach(parent, self, aux) * Start the real-time and statistics clocks. Leave stathz 0 since there * are no other timers available. */ +void cpu_initclocks() { extern int tickadj; struct clock_softc *csc; int fractick; - if (clockcd.cd_devs == NULL || - (csc = (struct clock_softc *)clockcd.cd_devs[0]) == NULL) + if (clockfns == NULL) panic("cpu_initclocks: no clock attached"); hz = 1024; /* 1024 Hz clock */ @@ -185,7 +124,7 @@ cpu_initclocks() /* * Get the clock started. */ - (*csc->sc_init)(csc); + (*clockfns->cf_init)(clockdev); } /* @@ -218,7 +157,6 @@ void inittodr(base) time_t base; { - struct clock_softc *csc = (struct clock_softc *)clockcd.cd_devs[0]; register int days, yr; struct clocktime ct; long deltat; @@ -232,9 +170,8 @@ inittodr(base) } else badbase = 0; - (*csc->sc_get)(csc, base, &ct); - - csc->sc_initted = 1; + (*clockfns->cf_get)(clockdev, base, &ct); + clockinitted = 1; /* simple sanity checks */ if (ct.year < 70 || ct.mon < 1 || ct.mon > 12 || ct.day < 1 || @@ -287,12 +224,11 @@ bad: void resettodr() { - struct clock_softc *csc = (struct clock_softc *)clockcd.cd_devs[0]; register int t, t2; struct clocktime ct; int s; - if (!csc->sc_initted) + if (!clockinitted) return; /* compute the day of week. */ @@ -324,17 +260,5 @@ resettodr() ct.min = t / SECMIN; ct.sec = t % SECMIN; - (*csc->sc_set)(csc, &ct); -} - -/* - * Wait "n" microseconds. This doesn't belong here. XXX. - */ -delay(n) - int n; -{ - register long N = cycles_per_usec * (n); - - while (N > 0) - N -= 3; + (*clockfns->cf_set)(clockdev, &ct); } diff --git a/sys/arch/alpha/alpha/clock_mc.c b/sys/arch/alpha/alpha/clock_mc.c deleted file mode 100644 index 04f6792703d..00000000000 --- a/sys/arch/alpha/alpha/clock_mc.c +++ /dev/null @@ -1,279 +0,0 @@ -/* $NetBSD: clock_mc.c,v 1.4 1995/12/20 00:38:57 cgd Exp $ */ - -/* - * Copyright (c) 1988 University of Utah. - * Copyright (c) 1992, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * the Systems Programming Group of the University of Utah Computer - * Science Department and Ralph Campbell. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * from: Utah Hdr: clock.c 1.18 91/01/21 - * - * @(#)clock.c 8.1 (Berkeley) 6/10/93 - */ - -#include <sys/param.h> -#include <sys/kernel.h> -#include <sys/systm.h> -#include <sys/device.h> - -#include <machine/autoconf.h> -#include <machine/pte.h> /* XXX */ - -#include <alpha/alpha/clockvar.h> -#include <dev/ic/mc146818reg.h> - -#include "ioasic.h" -#if NIOASIC -#include <dev/tc/tcreg.h> -#include <dev/tc/tcvar.h> -#include <dev/tc/ioasicvar.h> -#endif - -#include "isa.h" -#if NISA -#include <dev/isa/isareg.h> -#include <dev/isa/isavar.h> -#endif - -void mcclock_attach __P((struct device *parent, - struct device *self, void *aux)); -static void mcclock_init __P((struct clock_softc *csc)); -static void mcclock_get __P((struct clock_softc *csc, time_t base, - struct clocktime *ct)); -static void mcclock_set __P((struct clock_softc *csc, - struct clocktime *ct)); - -struct mcclockdata { - void (*mc_write) __P((struct clock_softc *csc, u_int reg, - u_int datum)); - u_int (*mc_read) __P((struct clock_softc *csc, u_int reg)); - __const void *mc_accessfns; - void *mc_accessarg; - void *mc_addr; -}; - -#define mc146818_write(sc, reg, datum) \ - (*((struct mcclockdata *)sc->sc_data)->mc_write)(sc, reg, datum) -#define mc146818_read(sc, reg) \ - (*((struct mcclockdata *)sc->sc_data)->mc_read)(sc, reg) - -#if NIOASIC -static void mc_write_tc __P((struct clock_softc *csc, u_int reg, - u_int datum)); -static u_int mc_read_tc __P((struct clock_softc *csc, u_int reg)); -static struct mcclockdata mcclockdata_tc = { mc_write_tc, mc_read_tc }; -#endif - -#if NISA -static void mc_write_isa __P((struct clock_softc *csc, u_int reg, - u_int datum)); -static u_int mc_read_isa __P((struct clock_softc *csc, u_int reg)); -static struct mcclockdata mcclockdata_isa = { mc_write_isa, mc_read_isa }; -#endif - -void -mcclock_attach(parent, self, aux) - struct device *parent; - struct device *self; - void *aux; -{ - struct clock_softc *csc = (struct clock_softc *)self; - struct isadev_attach_args *ida = aux; - register volatile struct chiptime *c; - - printf(": mc146818 or compatible"); - - csc->sc_init = mcclock_init; - csc->sc_get = mcclock_get; - csc->sc_set = mcclock_set; - -#if NIOASIC - if (parent->dv_cfdata->cf_driver == &ioasiccd) { - struct ioasicdev_attach_args *ioasicdev = aux; - - /* - * XXX should really allocate a new one and copy, or - * something. unlikely we'll have more than one... - */ - csc->sc_data = &mcclockdata_tc; - mcclockdata_tc.mc_addr = (void *)ioasicdev->iada_addr; - } else -#endif -#if NISA - if (parent->dv_cfdata->cf_driver == &isacd) { - /* - * XXX should really allocate a new one and copy, or - * something. unlikely we'll have more than one... - */ - csc->sc_data = &mcclockdata_isa; - mcclockdata_isa.mc_accessfns = ida->ida_piofns; - mcclockdata_isa.mc_accessarg = ida->ida_pioarg; - } else -#endif - { - printf("\n"); - panic("clockattach: can't tell what bus we're on"); - } - - /* Turn interrupts off, just in case. */ - mc146818_write(csc, MC_REGB, MC_REGB_BINARY | MC_REGB_24HR); -} - -static void -mcclock_init(csc) - struct clock_softc *csc; -{ - - mc146818_write(csc, MC_REGA, MC_BASE_32_KHz | MC_RATE_1024_Hz); - mc146818_write(csc, MC_REGB, - MC_REGB_PIE | MC_REGB_BINARY | MC_REGB_24HR); -} - -/* - * Get the time of day, based on the clock's value and/or the base value. - */ -static void -mcclock_get(csc, base, ct) - struct clock_softc *csc; - time_t base; - struct clocktime *ct; -{ - mc_todregs regs; - int s; - - s = splclock(); - MC146818_GETTOD(csc, ®s) - splx(s); - - ct->sec = regs[MC_SEC]; - ct->min = regs[MC_MIN]; - ct->hour = regs[MC_HOUR]; - ct->dow = regs[MC_DOW]; - ct->day = regs[MC_DOM]; - ct->mon = regs[MC_MONTH]; - ct->year = regs[MC_YEAR]; -} - -/* - * Reset the TODR based on the time value. - */ -static void -mcclock_set(csc, ct) - struct clock_softc *csc; - struct clocktime *ct; -{ - mc_todregs regs; - int s; - - s = splclock(); - MC146818_GETTOD(csc, ®s); - splx(s); - - regs[MC_SEC] = ct->sec; - regs[MC_MIN] = ct->min; - regs[MC_HOUR] = ct->hour; - regs[MC_DOW] = ct->dow; - regs[MC_DOM] = ct->day; - regs[MC_MONTH] = ct->mon; - regs[MC_YEAR] = ct->year; - - s = splclock(); - MC146818_PUTTOD(csc, ®s); - splx(s); -} - - -#if NIOASIC -struct tc_clockdatum { - u_char datum; - char pad[3]; -}; - -static void -mc_write_tc(csc, reg, datum) - struct clock_softc *csc; - u_int reg, datum; -{ - struct mcclockdata *mccdp; - struct tc_clockdatum *dp; - - mccdp = csc->sc_data; - dp = (struct tc_clockdatum *)(mccdp->mc_addr); - - dp[reg].datum = datum; -} - -static u_int -mc_read_tc(csc, reg) - struct clock_softc *csc; - u_int reg; -{ - struct mcclockdata *mccdp; - struct tc_clockdatum *dp; - - mccdp = csc->sc_data; - dp = (struct tc_clockdatum *)(mccdp->mc_addr); - - return (dp[reg].datum); -} -#endif /* NIOASIC */ - - -#if NISA -static void -mc_write_isa(csc, reg, datum) - struct clock_softc *csc; - u_int reg, datum; -{ - struct mcclockdata *cdp = csc->sc_data; - __const struct isa_pio_fns *ipf = cdp->mc_accessfns; - void *ipfa = cdp->mc_accessarg; - - OUTB(ipf, ipfa, IO_RTC, reg); - OUTB(ipf, ipfa, IO_RTC + 1, datum); -} - -static u_int -mc_read_isa(csc, reg) - struct clock_softc *csc; - u_int reg; -{ - struct mcclockdata *cdp = csc->sc_data; - __const struct isa_pio_fns *ipf = cdp->mc_accessfns; - void *ipfa = cdp->mc_accessarg; - - OUTB(ipf, ipfa, IO_RTC, reg); - return INB(ipf, ipfa, IO_RTC + 1); -} -#endif /* NISA */ diff --git a/sys/arch/alpha/alpha/clockvar.h b/sys/arch/alpha/alpha/clockvar.h index 912bbe78d54..42d50358e9a 100644 --- a/sys/arch/alpha/alpha/clockvar.h +++ b/sys/arch/alpha/alpha/clockvar.h @@ -1,4 +1,4 @@ -/* $NetBSD: clockvar.h,v 1.1 1995/06/28 02:44:59 cgd Exp $ */ +/* $NetBSD: clockvar.h,v 1.2 1996/04/17 22:01:21 cgd Exp $ */ /* * Copyright (c) 1994, 1995 Carnegie-Mellon University. @@ -48,30 +48,15 @@ struct clocktime { }; /* - * clockdesc structure: + * clockfns structure: * - * provides clock-specific functions to do necessary operations. + * function switch used by chip-independent clock code, to access + * chip-dependent routines. */ -struct clock_softc { - struct device sc_dev; - - /* - * The functions that all types of clock provide. - */ - void (*sc_attach) __P((struct device *parent, struct device *self, - void *aux)); - void (*sc_init) __P((struct clock_softc *csc)); - void (*sc_get) __P((struct clock_softc *csc, time_t base, - struct clocktime *ct)); - void (*sc_set) __P((struct clock_softc *csc, struct clocktime *ct)); - - /* - * Private storage for particular clock types. - */ - void *sc_data; - - /* - * Has the time been initialized? - */ - int sc_initted; +struct clockfns { + void (*cf_init) __P((struct device *)); + void (*cf_get) __P((struct device *, time_t, struct clocktime *)); + void (*cf_set) __P((struct device *, struct clocktime *)); }; + +void clockattach __P((struct device *, const struct clockfns *)); diff --git a/sys/arch/alpha/alpha/conf.c b/sys/arch/alpha/alpha/conf.c index 144cb4b712a..d96d609a037 100644 --- a/sys/arch/alpha/alpha/conf.c +++ b/sys/arch/alpha/alpha/conf.c @@ -1,4 +1,4 @@ -/* $NetBSD: conf.c,v 1.9 1995/08/17 17:40:42 thorpej Exp $ */ +/* $NetBSD: conf.c,v 1.11 1996/04/12 02:07:23 cgd Exp $ */ /*- * Copyright (c) 1991 The Regents of the University of California. @@ -45,6 +45,12 @@ int ttselect __P((dev_t, int, struct proc *)); +#ifndef LKM +#define lkmenodev enodev +#else +int lkmenodev(); +#endif + bdev_decl(sw); #include "st.h" bdev_decl(st); @@ -78,6 +84,18 @@ struct bdevsw bdevsw[] = }; int nblkdev = sizeof (bdevsw) / sizeof (bdevsw[0]); +/* open, close, read, write, ioctl, tty, mmap */ +#define cdev_wscons_init(c,n) { \ + dev_init(c,n,open), dev_init(c,n,close), dev_init(c,n,read), \ + dev_init(c,n,write), dev_init(c,n,ioctl), dev_init(c,n,stop), \ + dev_init(c,n,tty), ttselect, dev_init(c,n,mmap), D_TTY } + +/* open, close, write, ioctl */ +#define cdev_lpt_init(c,n) { \ + dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) enodev, \ + dev_init(c,n,write), dev_init(c,n,ioctl), (dev_type_stop((*))) enodev, \ + 0, seltrue, (dev_type_mmap((*))) enodev } + cdev_decl(cn); cdev_decl(ctty); #define mmread mmrw @@ -97,7 +115,7 @@ cdev_decl(tun); cdev_decl(sd); cdev_decl(vnd); cdev_decl(ccd); -dev_type_open(fdopen); +dev_type_open(filedescopen); #include "bpfilter.h" cdev_decl(bpf); cdev_decl(st); @@ -114,13 +132,18 @@ cdev_decl(scc); cdev_decl(lkm); #include "audio.h" cdev_decl(audio); -#include "wsc.h" -cdev_decl(wsc); +#include "wscons.h" +cdev_decl(wscons); #include "com.h" cdev_decl(com); +cdev_decl(kbd); +cdev_decl(ms); +#include "lpt.h" +cdev_decl(lpt); cdev_decl(prom); /* XXX XXX XXX */ + struct cdevsw cdevsw[] = { cdev_cn_init(1,cn), /* 0: virtual console */ @@ -133,7 +156,7 @@ struct cdevsw cdevsw[] = cdev_bpftun_init(NTUN,tun), /* 7: network tunnel */ cdev_disk_init(NSD,sd), /* 8: SCSI disk */ cdev_disk_init(NVND,vnd), /* 9: vnode disk driver */ - cdev_fd_init(1,fd), /* 10: file descriptor pseudo-dev */ + cdev_fd_init(1,filedesc), /* 10: file descriptor pseudo-dev */ cdev_bpftun_init(NBPFILTER,bpf),/* 11: Berkeley packet filter */ cdev_tape_init(NST,st), /* 12: SCSI tape */ cdev_disk_init(NCD,cd), /* 13: SCSI CD-ROM */ @@ -148,9 +171,13 @@ struct cdevsw cdevsw[] = cdev_lkm_dummy(), /* 22 */ cdev_tty_init(1,prom), /* 23: XXX prom console */ cdev_audio_init(NAUDIO,audio), /* 24: generic audio I/O */ - cdev_tty_init(NWSC,wsc), /* 25: workstation console */ + cdev_wscons_init(NWSCONS,wscons), /* 25: workstation console */ cdev_tty_init(NCOM,com), /* 26: ns16550 UART */ cdev_disk_init(NCCD,ccd), /* 27: concatenated disk driver */ + cdev_notdef(), /* 28 */ + cdev_mouse_init(NWSCONS,kbd), /* 29: /dev/kbd XXX */ + cdev_mouse_init(NWSCONS,ms), /* 30: /dev/mouse XXX */ + cdev_lpt_init(NLPT,lpt), /* 31: parallel printer */ }; int nchrdev = sizeof (cdevsw) / sizeof (cdevsw[0]); @@ -218,6 +245,10 @@ static int chrtoblktbl[] = { /* 25 */ NODEV, /* 26 */ NODEV, /* 27 */ 7, + /* 28 */ NODEV, + /* 29 */ NODEV, + /* 30 */ NODEV, + /* 31 */ NODEV, }; /* diff --git a/sys/arch/alpha/alpha/cpu.c b/sys/arch/alpha/alpha/cpu.c index dad5807610e..4f462e1de86 100644 --- a/sys/arch/alpha/alpha/cpu.c +++ b/sys/arch/alpha/alpha/cpu.c @@ -1,7 +1,7 @@ -/* $NetBSD: cpu.c,v 1.4 1995/11/23 02:33:48 cgd Exp $ */ +/* $NetBSD: cpu.c,v 1.9 1996/04/29 16:36:19 cgd Exp $ */ /* - * Copyright (c) 1994, 1995 Carnegie-Mellon University. + * Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -36,8 +36,14 @@ /* Definition of the driver for autoconfig. */ static int cpumatch(struct device *, void *, void *); static void cpuattach(struct device *, struct device *, void *); -struct cfdriver cpucd = - { NULL, "cpu", cpumatch, cpuattach, DV_DULL, sizeof (struct device) }; + +struct cfattach cpu_ca = { + sizeof(struct device), cpumatch, cpuattach +}; + +struct cfdriver cpu_cd = { + NULL, "cpu", DV_DULL +}; static int cpuprint __P((void *, char *pnp)); @@ -51,7 +57,7 @@ cpumatch(parent, cfdata, aux) struct confargs *ca = aux; /* make sure that we're looking for a CPU. */ - if (strcmp(ca->ca_name, cpucd.cd_name) != 0) + if (strcmp(ca->ca_name, cpu_cd.cd_name) != 0) return (0); return (1); @@ -67,11 +73,11 @@ cpuattach(parent, dev, aux) char *cpu_major[] = { "UNKNOWN MAJOR TYPE (0)", "EV3", /* PCS_PROC_EV3 */ - "EV4 (21064)", /* PCS_PROC_EV4 */ + "21064 (EV4)", /* PCS_PROC_EV4 */ "Simulator", /* PCS_PROC_SIMULATOR */ - "LCA4 (21066/21068)", /* PCS_PROC_LCA4 */ - "EV5 (21164)", /* PCS_PROC_EV5 */ - "EV45 (21064A)", /* PCS_PROC_EV45 */ + "21066/21068 (LCA4)", /* PCS_PROC_LCA4 */ + "21164 (EV5)", /* PCS_PROC_EV5 */ + "21064A (EV45)", /* PCS_PROC_EV45 */ }; int ncpu_major = sizeof(cpu_major) / sizeof(cpu_major[0]); char *dc21064_cpu_minor[] = { @@ -136,8 +142,8 @@ cpuattach(parent, dev, aux) printf("%sIEEE FP support", needcomma ? ", " : ""); needcomma = 1; } - if (p->pcs_proc_var & PCS_VAR_IOACCESS) { - printf("%shas I/O access", needcomma ? ", " : ""); + if (p->pcs_proc_var & PCS_VAR_PE) { + printf("%sPrimary Eligible", needcomma ? ", " : ""); needcomma = 1; } if (p->pcs_proc_var & PCS_VAR_RESERVED) diff --git a/sys/arch/alpha/alpha/dec_2100_a50.c b/sys/arch/alpha/alpha/dec_2100_a50.c index 3e7e4b67b2b..ec05c75687a 100644 --- a/sys/arch/alpha/alpha/dec_2100_a50.c +++ b/sys/arch/alpha/alpha/dec_2100_a50.c @@ -1,7 +1,7 @@ -/* $NetBSD: dec_2100_a50.c,v 1.3 1995/11/23 02:33:52 cgd Exp $ */ +/* $NetBSD: dec_2100_a50.c,v 1.6.4.2 1996/06/14 20:42:23 cgd Exp $ */ /* - * Copyright (c) 1995 Carnegie-Mellon University. + * Copyright (c) 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -29,11 +29,15 @@ #include <sys/param.h> #include <sys/device.h> +#include <sys/termios.h> #include <dev/cons.h> #include <machine/rpb.h> +#include <machine/autoconf.h> #include <dev/isa/isavar.h> +#include <dev/isa/comreg.h> +#include <dev/isa/comvar.h> #include <dev/pci/pcireg.h> #include <dev/pci/pcivar.h> @@ -42,42 +46,43 @@ #include <alpha/alpha/dec_2100_a50.h> +#include <scsi/scsi_all.h> +#include <scsi/scsiconf.h> + char * dec_2100_a50_modelname() { + static char s[80]; switch (hwrpb->rpb_variation & SV_ST_MASK) { case SV_ST_AVANTI: case SV_ST_AVANTI_XXX: /* XXX apparently the same? */ return "AlphaStation 400 4/233 (\"Avanti\")"; - break; case SV_ST_MUSTANG2_4_166: return "AlphaStation 200 4/166 (\"Mustang II\")"; - break; case SV_ST_MUSTANG2_4_233: return "AlphaStation 200 4/233 (\"Mustang II\")"; - break; case 0x2000: return "AlphaStation 250 4/266"; - break; case SV_ST_MUSTANG2_4_100: return "AlphaStation 200 4/100 (\"Mustang II\")"; - break; + + case 0xa800: + return "AlphaStation 255/233"; default: - printf("unknown system variation %lx\n", + sprintf(s, "DEC 2100/A50 (\"Avanti\") family, variation %lx", hwrpb->rpb_variation & SV_ST_MASK); - return NULL; + return s; } } void -dec_2100_a50_consinit(constype) - char *constype; +dec_2100_a50_consinit() { struct ctb *ctb; struct apecs_config *acp; @@ -88,32 +93,32 @@ dec_2100_a50_consinit(constype) ctb = (struct ctb *)(((caddr_t)hwrpb) + hwrpb->rpb_ctb_off); - printf("constype = %s\n", constype); - printf("ctb->ctb_term_type = 0x%lx\n", ctb->ctb_term_type); - printf("ctb->ctb_turboslot = 0x%lx\n", ctb->ctb_turboslot); - switch (ctb->ctb_term_type) { case 2: /* serial console ... */ /* XXX */ { - extern int comdefaultrate, comconsole; - extern int comconsaddr, comconsinit; + extern bus_chipset_tag_t comconsbc; /* set */ + extern bus_io_handle_t comcomsioh; /* set */ + extern int comconsaddr, comconsinit; /* set */ + extern int comdefaultrate; extern int comcngetc __P((dev_t)); extern void comcnputc __P((dev_t, int)); extern void comcnpollc __P((dev_t, int)); - extern __const struct isa_pio_fns *comconsipf; - extern __const void *comconsipfa; static struct consdev comcons = { NULL, NULL, comcngetc, comcnputc, comcnpollc, NODEV, 1 }; - cominit(acp->ac_piofns, acp->ac_pioarg, 0, - comdefaultrate); - comconsole = 0; /* XXX */ - comconsaddr = 0x3f8; /* XXX */ + /* Delay to allow PROM putchars to complete */ + DELAY(10000); + + comconsaddr = 0x3f8; comconsinit = 0; - comconsipf = acp->ac_piofns; - comconsipfa = acp->ac_pioarg; + comconsbc = &acp->ac_bc; + if (bus_io_map(comconsbc, comconsaddr, COM_NPORTS, + &comconsioh)) + panic("can't map serial console I/O ports"); + comconscflag = (TTYDEF_CFLAG & ~(CSIZE | PARENB)) | CS8; + cominit(comconsbc, comconsioh, comdefaultrate); cn_tab = &comcons; comcons.cn_dev = makedev(26, 0); /* XXX */ @@ -123,21 +128,103 @@ dec_2100_a50_consinit(constype) case 3: /* display console ... */ /* XXX */ - pci_display_console(acp->ac_conffns, acp->ac_confarg, - acp->ac_memfns, acp->ac_memarg, acp->ac_piofns, - acp->ac_pioarg, 0, ctb->ctb_turboslot & 0xffff, 0); + pci_display_console(&acp->ac_bc, &acp->ac_pc, + (ctb->ctb_turboslot >> 8) & 0xff, + ctb->ctb_turboslot & 0xff, 0); break; default: + printf("ctb->ctb_term_type = 0x%lx\n", ctb->ctb_term_type); + printf("ctb->ctb_turboslot = 0x%lx\n", ctb->ctb_turboslot); + panic("consinit: unknown console type %d\n", ctb->ctb_term_type); } } -dev_t -dec_2100_a50_bootdev(booted_dev) - char *booted_dev; +void +dec_2100_a50_device_register(dev, aux) + struct device *dev; + void *aux; { + static int found; + static struct device *pcidev, *scsidev; + struct bootdev_data *b = bootdev_data; + struct device *parent = dev->dv_parent; + struct cfdata *cf = dev->dv_cfdata; + struct cfdriver *cd = cf->cf_driver; + + if (found) + return; + + if (pcidev == NULL) { + if (strcmp(cd->cd_name, "pci")) + return; + else { + struct pcibus_attach_args *pba = aux; + + if (b->bus != pba->pba_bus) + return; + + pcidev = dev; +#if 0 + printf("\npcidev = %s\n", pcidev->dv_xname); +#endif + return; + } + } - panic("gack."); + if (scsidev == NULL) { + if (parent != pcidev) + return; + else { + struct pci_attach_args *pa = aux; + + if (b->slot != pa->pa_device) + return; + + /* XXX function? */ + + scsidev = dev; +#if 0 + printf("\nscsidev = %s\n", scsidev->dv_xname); +#endif + return; + } + } + + if (!strcmp(cd->cd_name, "sd") || + !strcmp(cd->cd_name, "st") || + !strcmp(cd->cd_name, "cd")) { + struct scsibus_attach_args *sa = aux; + + if (parent->dv_parent != scsidev) + return; + + if (b->unit / 100 != sa->sa_sc_link->target) + return; + + /* XXX LUN! */ + + switch (b->boot_dev_type) { + case 0: + if (strcmp(cd->cd_name, "sd") && + strcmp(cd->cd_name, "cd")) + return; + break; + case 1: + if (strcmp(cd->cd_name, "st")) + return; + break; + default: + return; + } + + /* we've found it! */ + booted_device = dev; +#if 0 + printf("\nbooted_device = %s\n", booted_device->dv_xname); +#endif + found = 1; + } } diff --git a/sys/arch/alpha/alpha/dec_2100_a50.h b/sys/arch/alpha/alpha/dec_2100_a50.h index 084ebaa171a..895517aad27 100644 --- a/sys/arch/alpha/alpha/dec_2100_a50.h +++ b/sys/arch/alpha/alpha/dec_2100_a50.h @@ -1,7 +1,7 @@ -/* $NetBSD: dec_2100_a50.h,v 1.2 1995/08/03 01:12:20 cgd Exp $ */ +/* $NetBSD: dec_2100_a50.h,v 1.2.6.2 1996/06/13 18:35:10 cgd Exp $ */ /* - * Copyright (c) 1995 Carnegie-Mellon University. + * Copyright (c) 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -28,5 +28,5 @@ */ char *dec_2100_a50_modelname __P((void)); -void dec_2100_a50_consinit __P((char *)); -dev_t dec_2100_a50_bootdev __P((char *)); +void dec_2100_a50_consinit __P((void)); +void dec_2100_a50_device_register __P((struct device *, void *)); diff --git a/sys/arch/alpha/alpha/dec_3000_300.c b/sys/arch/alpha/alpha/dec_3000_300.c index fa9b365309b..43e4254efb1 100644 --- a/sys/arch/alpha/alpha/dec_3000_300.c +++ b/sys/arch/alpha/alpha/dec_3000_300.c @@ -1,7 +1,7 @@ -/* $NetBSD: dec_3000_300.c,v 1.2 1995/08/03 01:12:21 cgd Exp $ */ +/* $NetBSD: dec_3000_300.c,v 1.2.6.2 1996/06/13 18:35:12 cgd Exp $ */ /* - * Copyright (c) 1995 Carnegie-Mellon University. + * Copyright (c) 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -28,8 +28,19 @@ */ #include <sys/param.h> +#include <sys/systm.h> +#include <sys/device.h> #include <machine/rpb.h> +#include <machine/autoconf.h> + +#include <dev/tc/tcvar.h> + +#include <alpha/tc/tcdsvar.h> + +#include <scsi/scsi_all.h> +#include <scsi/scsiconf.h> + char * dec_3000_300_modelname() { @@ -55,16 +66,74 @@ dec_3000_300_modelname() } void -dec_3000_300_consinit(constype) - char *constype; +dec_3000_300_consinit() { } -dev_t -dec_3000_300_bootdev(booted_dev) - char *booted_dev; +void +dec_3000_300_device_register(dev, aux) + struct device *dev; + void *aux; { + static int found; + static struct device *scsidev; + struct bootdev_data *b = bootdev_data; + struct device *parent = dev->dv_parent; + struct cfdata *cf = dev->dv_cfdata; + struct cfdriver *cd = cf->cf_driver; + + if (found) + return; + + if (strcmp(cd->cd_name, "esp") == 0) { + if (b->slot == 4 && + strcmp(parent->dv_cfdata->cf_driver->cd_name, "tcds") + == 0) { + struct tcdsdev_attach_args *tcdsdev = aux; - panic("gack."); + if (tcdsdev->tcdsda_slot == b->channel) { + scsidev = dev; +#if 0 + printf("\nscsidev = %s\n", dev->dv_xname); +#endif + } + } + } else if (strcmp(cd->cd_name, "sd") == 0 || + strcmp(cd->cd_name, "st") == 0 || + strcmp(cd->cd_name, "cd") == 0) { + struct scsibus_attach_args *sa = aux; + + if (scsidev == NULL) + return; + + if (parent->dv_parent != scsidev) + return; + + if (b->unit / 100 != sa->sa_sc_link->target) + return; + + /* XXX LUN! */ + + switch (b->boot_dev_type) { + case 0: + if (strcmp(cd->cd_name, "sd") && + strcmp(cd->cd_name, "cd")) + return; + break; + case 1: + if (strcmp(cd->cd_name, "st")) + return; + break; + default: + return; + } + + /* we've found it! */ + booted_device = dev; +#if 0 + printf("\nbooted_device = %s\n", booted_device->dv_xname); +#endif + found = 1; + } } diff --git a/sys/arch/alpha/alpha/dec_3000_300.h b/sys/arch/alpha/alpha/dec_3000_300.h index 56926a5ba73..bc350ff64ea 100644 --- a/sys/arch/alpha/alpha/dec_3000_300.h +++ b/sys/arch/alpha/alpha/dec_3000_300.h @@ -1,7 +1,7 @@ -/* $NetBSD: dec_3000_300.h,v 1.2 1995/08/03 01:12:23 cgd Exp $ */ +/* $NetBSD: dec_3000_300.h,v 1.2.6.2 1996/06/13 18:35:13 cgd Exp $ */ /* - * Copyright (c) 1995 Carnegie-Mellon University. + * Copyright (c) 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -28,5 +28,5 @@ */ char *dec_3000_300_modelname __P((void)); -void dec_3000_300_consinit __P((char *)); -dev_t dec_3000_300_bootdev __P((char *)); +void dec_3000_300_consinit __P((void)); +void dec_3000_300_device_register __P((struct device *, void *)); diff --git a/sys/arch/alpha/alpha/dec_3000_500.c b/sys/arch/alpha/alpha/dec_3000_500.c index 1cf1dac3d77..0581672da7c 100644 --- a/sys/arch/alpha/alpha/dec_3000_500.c +++ b/sys/arch/alpha/alpha/dec_3000_500.c @@ -1,7 +1,7 @@ -/* $NetBSD: dec_3000_500.c,v 1.1 1995/08/03 00:57:26 cgd Exp $ */ +/* $NetBSD: dec_3000_500.c,v 1.1.6.2 1996/06/13 18:35:15 cgd Exp $ */ /* - * Copyright (c) 1994, 1995 Carnegie-Mellon University. + * Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -28,8 +28,19 @@ */ #include <sys/param.h> +#include <sys/systm.h> +#include <sys/device.h> #include <machine/rpb.h> +#include <machine/autoconf.h> + +#include <dev/tc/tcvar.h> + +#include <alpha/tc/tcdsvar.h> + +#include <scsi/scsi_all.h> +#include <scsi/scsiconf.h> + char * dec_3000_500_modelname() { @@ -73,16 +84,74 @@ systype_flamingo: } void -dec_3000_500_consinit(constype) - char *constype; +dec_3000_500_consinit() { } -dev_t -dec_3000_500_bootdev(booted_dev) - char *booted_dev; +void +dec_3000_500_device_register(dev, aux) + struct device *dev; + void *aux; { - - panic("gack."); + static int found; + static struct device *scsidev; + struct bootdev_data *b = bootdev_data; + struct device *parent = dev->dv_parent; + struct cfdata *cf = dev->dv_cfdata; + struct cfdriver *cd = cf->cf_driver; + + if (found) + return; + + if (strcmp(cd->cd_name, "esp") == 0) { + if (b->slot == 6 && + strcmp(parent->dv_cfdata->cf_driver->cd_name, "tcds") + == 0) { + struct tcdsdev_attach_args *tcdsdev = aux; + + if (tcdsdev->tcdsda_slot == b->channel) { + scsidev = dev; +#if 0 + printf("\nscsidev = %s\n", dev->dv_xname); +#endif + } + } + } else if (strcmp(cd->cd_name, "sd") == 0 || + strcmp(cd->cd_name, "st") == 0 || + strcmp(cd->cd_name, "cd") == 0) { + struct scsibus_attach_args *sa = aux; + + if (scsidev == NULL) + return; + + if (parent->dv_parent != scsidev) + return; + + if (b->unit / 100 != sa->sa_sc_link->target) + return; + + /* XXX LUN! */ + + switch (b->boot_dev_type) { + case 0: + if (strcmp(cd->cd_name, "sd") && + strcmp(cd->cd_name, "cd")) + return; + break; + case 1: + if (strcmp(cd->cd_name, "st")) + return; + break; + default: + return; + } + + /* we've found it! */ + booted_device = dev; +#if 0 + printf("\nbooted_device = %s\n", booted_device->dv_xname); +#endif + found = 1; + } } diff --git a/sys/arch/alpha/alpha/dec_3000_500.h b/sys/arch/alpha/alpha/dec_3000_500.h index e597154f4fd..c45a5ed429a 100644 --- a/sys/arch/alpha/alpha/dec_3000_500.h +++ b/sys/arch/alpha/alpha/dec_3000_500.h @@ -1,7 +1,7 @@ -/* $NetBSD: dec_3000_500.h,v 1.2 1995/08/03 01:12:25 cgd Exp $ */ +/* $NetBSD: dec_3000_500.h,v 1.2.6.2 1996/06/13 18:35:17 cgd Exp $ */ /* - * Copyright (c) 1995 Carnegie-Mellon University. + * Copyright (c) 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -28,5 +28,5 @@ */ char *dec_3000_500_modelname __P((void)); -void dec_3000_500_consinit __P((char *)); -dev_t dec_3000_500_bootdev __P((char *)); +void dec_3000_500_consinit __P((void)); +void dec_3000_500_device_register __P((struct device *, void *)); diff --git a/sys/arch/alpha/alpha/dec_axppci_33.c b/sys/arch/alpha/alpha/dec_axppci_33.c index e688836b8f8..dd28dac0299 100644 --- a/sys/arch/alpha/alpha/dec_axppci_33.c +++ b/sys/arch/alpha/alpha/dec_axppci_33.c @@ -1,7 +1,7 @@ -/* $NetBSD: dec_axppci_33.c,v 1.1 1995/11/23 02:33:55 cgd Exp $ */ +/* $NetBSD: dec_axppci_33.c,v 1.4.4.2 1996/06/14 20:42:24 cgd Exp $ */ /* - * Copyright (c) 1995 Carnegie-Mellon University. + * Copyright (c) 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -29,11 +29,15 @@ #include <sys/param.h> #include <sys/device.h> +#include <sys/termios.h> #include <dev/cons.h> #include <machine/rpb.h> +#include <machine/autoconf.h> #include <dev/isa/isavar.h> +#include <dev/isa/comreg.h> +#include <dev/isa/comvar.h> #include <dev/pci/pcireg.h> #include <dev/pci/pcivar.h> @@ -42,6 +46,9 @@ #include <alpha/alpha/dec_axppci_33.h> +#include <scsi/scsi_all.h> +#include <scsi/scsiconf.h> + char * dec_axppci_33_modelname() { @@ -58,8 +65,7 @@ dec_axppci_33_modelname() } void -dec_axppci_33_consinit(constype) - char *constype; +dec_axppci_33_consinit() { struct ctb *ctb; struct lca_config *lcp; @@ -70,33 +76,32 @@ dec_axppci_33_consinit(constype) ctb = (struct ctb *)(((caddr_t)hwrpb) + hwrpb->rpb_ctb_off); - printf("constype = %s\n", constype); - printf("ctb->ctb_term_type = 0x%lx\n", ctb->ctb_term_type); - printf("ctb->ctb_turboslot = 0x%lx\n", ctb->ctb_turboslot); - switch (ctb->ctb_term_type) { case 2: /* serial console ... */ /* XXX */ { - extern int comdefaultrate, comconsole; - extern int comconsaddr, comconsinit; + extern bus_chipset_tag_t comconsbc; /* set */ + extern bus_io_handle_t comcomsioh; /* set */ + extern int comconsaddr, comconsinit; /* set */ + extern int comdefaultrate; extern int comcngetc __P((dev_t)); extern void comcnputc __P((dev_t, int)); extern void comcnpollc __P((dev_t, int)); - extern __const struct isa_pio_fns *comconsipf; - extern __const void *comconsipfa; static struct consdev comcons = { NULL, NULL, comcngetc, comcnputc, comcnpollc, NODEV, 1 }; + /* Delay to allow PROM putchars to complete */ + DELAY(10000); - cominit(lcp->lc_piofns, lcp->lc_pioarg, 0, - comdefaultrate); - comconsole = 0; /* XXX */ - comconsaddr = 0x3f8; /* XXX */ + comconsaddr = 0x3f8; comconsinit = 0; - comconsipf = lcp->lc_piofns; - comconsipfa = lcp->lc_pioarg; + comconsbc = &lcp->lc_bc; + if (bus_io_map(comconsbc, comconsaddr, COM_NPORTS, + &comconsioh)) + panic("can't map serial console I/O ports"); + comconscflag = (TTYDEF_CFLAG & ~(CSIZE | PARENB)) | CS8; + cominit(comconsbc, comconsioh, comdefaultrate); cn_tab = &comcons; comcons.cn_dev = makedev(26, 0); /* XXX */ @@ -106,21 +111,103 @@ dec_axppci_33_consinit(constype) case 3: /* display console ... */ /* XXX */ - pci_display_console(lcp->lc_conffns, lcp->lc_confarg, - lcp->lc_memfns, lcp->lc_memarg, lcp->lc_piofns, - lcp->lc_pioarg, 0, ctb->ctb_turboslot & 0xffff, 0); + pci_display_console(&lcp->lc_bc, &lcp->lc_pc, + (ctb->ctb_turboslot >> 8) & 0xff, + ctb->ctb_turboslot & 0xff, 0); break; default: + printf("ctb->ctb_term_type = 0x%lx\n", ctb->ctb_term_type); + printf("ctb->ctb_turboslot = 0x%lx\n", ctb->ctb_turboslot); + panic("consinit: unknown console type %d\n", ctb->ctb_term_type); } } -dev_t -dec_axppci_33_bootdev(booted_dev) - char *booted_dev; +void +dec_axppci_33_device_register(dev, aux) + struct device *dev; + void *aux; { + static int found; + static struct device *pcidev, *scsidev; + struct bootdev_data *b = bootdev_data; + struct device *parent = dev->dv_parent; + struct cfdata *cf = dev->dv_cfdata; + struct cfdriver *cd = cf->cf_driver; + + if (found) + return; + + if (pcidev == NULL) { + if (strcmp(cd->cd_name, "pci")) + return; + else { + struct pcibus_attach_args *pba = aux; + + if (b->bus != pba->pba_bus) + return; + + pcidev = dev; +#if 0 + printf("\npcidev = %s\n", pcidev->dv_xname); +#endif + return; + } + } + + if (scsidev == NULL) { + if (parent != pcidev) + return; + else { + struct pci_attach_args *pa = aux; + + if (b->slot != pa->pa_device) + return; + + /* XXX function? */ + + scsidev = dev; +#if 0 + printf("\nscsidev = %s\n", scsidev->dv_xname); +#endif + return; + } + } - panic("gack."); + if (!strcmp(cd->cd_name, "sd") || + !strcmp(cd->cd_name, "st") || + !strcmp(cd->cd_name, "cd")) { + struct scsibus_attach_args *sa = aux; + + if (parent->dv_parent != scsidev) + return; + + if (b->unit / 100 != sa->sa_sc_link->target) + return; + + /* XXX LUN! */ + + switch (b->boot_dev_type) { + case 0: + if (strcmp(cd->cd_name, "sd") && + strcmp(cd->cd_name, "cd")) + return; + break; + case 1: + if (strcmp(cd->cd_name, "st")) + return; + break; + default: + return; + } + + /* we've found it! */ + booted_device = dev; +#if 0 + printf("\nbooted_device = %s\n", booted_device->dv_xname); +#endif + found = 1; + } } diff --git a/sys/arch/alpha/alpha/dec_axppci_33.h b/sys/arch/alpha/alpha/dec_axppci_33.h index 1eb82dbbd56..79fe7325151 100644 --- a/sys/arch/alpha/alpha/dec_axppci_33.h +++ b/sys/arch/alpha/alpha/dec_axppci_33.h @@ -1,7 +1,7 @@ -/* $NetBSD: dec_axppci_33.h,v 1.1 1995/11/23 02:33:57 cgd Exp $ */ +/* $NetBSD: dec_axppci_33.h,v 1.1.4.2 1996/06/13 18:35:18 cgd Exp $ */ /* - * Copyright (c) 1995 Carnegie-Mellon University. + * Copyright (c) 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -28,5 +28,5 @@ */ char *dec_axppci_33_modelname __P((void)); -void dec_axppci_33_consinit __P((char *)); -dev_t dec_axppci_33_bootdev __P((char *)); +void dec_axppci_33_consinit __P((void)); +void dec_axppci_33_device_register __P((struct device *, void *)); diff --git a/sys/arch/alpha/alpha/dec_kn20aa.c b/sys/arch/alpha/alpha/dec_kn20aa.c index 789fa2f20b1..152d892c983 100644 --- a/sys/arch/alpha/alpha/dec_kn20aa.c +++ b/sys/arch/alpha/alpha/dec_kn20aa.c @@ -1,7 +1,7 @@ -/* $NetBSD: dec_kn20aa.c,v 1.1 1995/11/23 02:34:00 cgd Exp $ */ +/* $NetBSD: dec_kn20aa.c,v 1.4.4.2 1996/06/14 20:42:25 cgd Exp $ */ /* - * Copyright (c) 1995 Carnegie-Mellon University. + * Copyright (c) 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -29,11 +29,15 @@ #include <sys/param.h> #include <sys/device.h> +#include <sys/termios.h> #include <dev/cons.h> #include <machine/rpb.h> +#include <machine/autoconf.h> #include <dev/isa/isavar.h> +#include <dev/isa/comreg.h> +#include <dev/isa/comvar.h> #include <dev/pci/pcireg.h> #include <dev/pci/pcivar.h> @@ -42,6 +46,9 @@ #include <alpha/alpha/dec_kn20aa.h> +#include <scsi/scsi_all.h> +#include <scsi/scsiconf.h> + char * dec_kn20aa_modelname() { @@ -58,8 +65,7 @@ dec_kn20aa_modelname() } void -dec_kn20aa_consinit(constype) - char *constype; +dec_kn20aa_consinit() { struct ctb *ctb; struct cia_config *ccp; @@ -70,33 +76,32 @@ dec_kn20aa_consinit(constype) ctb = (struct ctb *)(((caddr_t)hwrpb) + hwrpb->rpb_ctb_off); - printf("constype = %s\n", constype); - printf("ctb->ctb_term_type = 0x%lx\n", ctb->ctb_term_type); - printf("ctb->ctb_turboslot = 0x%lx\n", ctb->ctb_turboslot); - switch (ctb->ctb_term_type) { case 2: /* serial console ... */ /* XXX */ { - extern int comdefaultrate, comconsole; - extern int comconsaddr, comconsinit; + extern bus_chipset_tag_t comconsbc; /* set */ + extern bus_io_handle_t comcomsioh; /* set */ + extern int comconsaddr, comconsinit; /* set */ + extern int comdefaultrate; extern int comcngetc __P((dev_t)); extern void comcnputc __P((dev_t, int)); extern void comcnpollc __P((dev_t, int)); - extern __const struct isa_pio_fns *comconsipf; - extern __const void *comconsipfa; static struct consdev comcons = { NULL, NULL, comcngetc, comcnputc, comcnpollc, NODEV, 1 }; + /* Delay to allow PROM putchars to complete */ + DELAY(10000); - cominit(ccp->cc_piofns, ccp->cc_pioarg, 0, - comdefaultrate); - comconsole = 0; /* XXX */ - comconsaddr = 0x3f8; /* XXX */ + comconsaddr = 0x3f8; comconsinit = 0; - comconsipf = ccp->cc_piofns; - comconsipfa = ccp->cc_pioarg; + comconsbc = &ccp->cc_bc; + if (bus_io_map(comconsbc, comconsaddr, COM_NPORTS, + &comconsioh)) + panic("can't map serial console I/O ports"); + comconscflag = (TTYDEF_CFLAG & ~(CSIZE | PARENB)) | CS8; + cominit(comconsbc, comconsioh, comdefaultrate); cn_tab = &comcons; comcons.cn_dev = makedev(26, 0); /* XXX */ @@ -106,21 +111,103 @@ dec_kn20aa_consinit(constype) case 3: /* display console ... */ /* XXX */ - pci_display_console(ccp->cc_conffns, ccp->cc_confarg, - ccp->cc_memfns, ccp->cc_memarg, ccp->cc_piofns, - ccp->cc_pioarg, 0, ctb->ctb_turboslot & 0xffff, 0); + pci_display_console(&ccp->cc_bc, &ccp->cc_pc, + (ctb->ctb_turboslot >> 8) & 0xff, + ctb->ctb_turboslot & 0xff, 0); break; default: + printf("ctb->ctb_term_type = 0x%lx\n", ctb->ctb_term_type); + printf("ctb->ctb_turboslot = 0x%lx\n", ctb->ctb_turboslot); + panic("consinit: unknown console type %d\n", ctb->ctb_term_type); } } -dev_t -dec_kn20aa_bootdev(booted_dev) - char *booted_dev; +void +dec_kn20aa_device_register(dev, aux) + struct device *dev; + void *aux; { + static int found; + static struct device *pcidev, *scsidev; + struct bootdev_data *b = bootdev_data; + struct device *parent = dev->dv_parent; + struct cfdata *cf = dev->dv_cfdata; + struct cfdriver *cd = cf->cf_driver; + + if (found) + return; + + if (pcidev == NULL) { + if (strcmp(cd->cd_name, "pci")) + return; + else { + struct pcibus_attach_args *pba = aux; + + if (b->bus != pba->pba_bus) + return; + + pcidev = dev; +#if 0 + printf("\npcidev = %s\n", pcidev->dv_xname); +#endif + return; + } + } + + if (scsidev == NULL) { + if (parent != pcidev) + return; + else { + struct pci_attach_args *pa = aux; + + if (b->slot != pa->pa_device) + return; + + /* XXX function? */ + + scsidev = dev; +#if 0 + printf("\nscsidev = %s\n", scsidev->dv_xname); +#endif + return; + } + } - panic("gack."); + if (!strcmp(cd->cd_name, "sd") || + !strcmp(cd->cd_name, "st") || + !strcmp(cd->cd_name, "cd")) { + struct scsibus_attach_args *sa = aux; + + if (parent->dv_parent != scsidev) + return; + + if (b->unit / 100 != sa->sa_sc_link->target) + return; + + /* XXX LUN! */ + + switch (b->boot_dev_type) { + case 0: + if (strcmp(cd->cd_name, "sd") && + strcmp(cd->cd_name, "cd")) + return; + break; + case 1: + if (strcmp(cd->cd_name, "st")) + return; + break; + default: + return; + } + + /* we've found it! */ + booted_device = dev; +#if 0 + printf("\nbooted_device = %s\n", booted_device->dv_xname); +#endif + found = 1; + } } diff --git a/sys/arch/alpha/alpha/dec_kn20aa.h b/sys/arch/alpha/alpha/dec_kn20aa.h index d078cca8c03..ef05246cd45 100644 --- a/sys/arch/alpha/alpha/dec_kn20aa.h +++ b/sys/arch/alpha/alpha/dec_kn20aa.h @@ -1,7 +1,7 @@ -/* $NetBSD: dec_kn20aa.h,v 1.1 1995/11/23 02:34:03 cgd Exp $ */ +/* $NetBSD: dec_kn20aa.h,v 1.1.4.2 1996/06/13 18:35:19 cgd Exp $ */ /* - * Copyright (c) 1995 Carnegie-Mellon University. + * Copyright (c) 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -28,5 +28,5 @@ */ char *dec_kn20aa_modelname __P((void)); -void dec_kn20aa_consinit __P((char *)); -dev_t dec_kn20aa_bootdev __P((char *)); +void dec_kn20aa_consinit __P((void)); +void dec_kn20aa_device_register __P((struct device *, void *)); diff --git a/sys/arch/alpha/alpha/disksubr.c b/sys/arch/alpha/alpha/disksubr.c index cec12b153df..9e3d2252742 100644 --- a/sys/arch/alpha/alpha/disksubr.c +++ b/sys/arch/alpha/alpha/disksubr.c @@ -1,7 +1,7 @@ -/* $NetBSD: disksubr.c,v 1.4 1996/01/07 22:01:38 thorpej Exp $ */ +/* $NetBSD: disksubr.c,v 1.6 1996/04/29 16:34:50 cgd Exp $ */ /* - * Copyright (c) 1994, 1995 Carnegie-Mellon University. + * Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Authors: Keith Bostic, Chris G. Demetriou @@ -43,7 +43,7 @@ extern struct device *bootdv; /* was this the boot device ? */ -int +void dk_establish(dk, dev) struct disk *dk; struct device *dev; @@ -57,14 +57,12 @@ dk_establish(dk, dev) if (bp == NULL) { printf("no boot path\n"); - return -1; } sprintf(name, "%s%d", bp->name, CRAZYMAP(bp->val[0])); if (strcmp(name, dev->dv_xname) == 0) { bootdv = dev; } #endif - return 1; } /* diff --git a/sys/arch/alpha/alpha/genassym.c b/sys/arch/alpha/alpha/genassym.c index 3eb7fcad1bb..6c4824dfb87 100644 --- a/sys/arch/alpha/alpha/genassym.c +++ b/sys/arch/alpha/alpha/genassym.c @@ -1,4 +1,4 @@ -/* $NetBSD: genassym.c,v 1.3 1995/11/23 02:34:06 cgd Exp $ */ +/* $NetBSD: genassym.c,v 1.4 1996/05/17 18:29:41 cgd Exp $ */ /* * Copyright (c) 1982, 1990, 1993 @@ -56,6 +56,7 @@ #include <err.h> void def __P((char *, long)); +int main __P((int argc, char **argv)); #define off(what, s, m) def(what, (int)offsetof(s, m)) @@ -69,7 +70,10 @@ def(what, val) err(1, "printf"); } -main() +int +main(argc, argv) + int argc; + char **argv; { /* general constants */ diff --git a/sys/arch/alpha/alpha/in_cksum.c b/sys/arch/alpha/alpha/in_cksum.c new file mode 100644 index 00000000000..7382354afd0 --- /dev/null +++ b/sys/arch/alpha/alpha/in_cksum.c @@ -0,0 +1,198 @@ +/* $NetBSD: in_cksum.c,v 1.2.4.1 1996/05/30 23:12:50 cgd Exp $ */ + +/* + * Copyright (c) 1988, 1992, 1993 + * The Regents of the University of California. All rights reserved. + * Copyright (c) 1996 + * Matt Thomas <matt@3am-software.com> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)in_cksum.c 8.1 (Berkeley) 6/10/93 + */ + +#include <sys/param.h> +#include <sys/mbuf.h> +#include <sys/systm.h> +#include <netinet/in.h> + +/* + * Checksum routine for Internet Protocol family headers + * (Portable Alpha version). + * + * This routine is very heavily used in the network + * code and should be modified for each CPU to be as fast as possible. + */ + +#define ADDCARRY(x) (x > 65535 ? x -= 65535 : x) +#define REDUCE32 \ + { \ + q_util.q = sum; \ + sum = q_util.s[0] + q_util.s[1] + q_util.s[2] + q_util.s[3]; \ + } +#define REDUCE16 \ + { \ + q_util.q = sum; \ + l_util.l = q_util.s[0] + q_util.s[1] + q_util.s[2] + q_util.s[3]; \ + sum = l_util.s[0] + l_util.s[1]; \ + ADDCARRY(sum); \ + } + +static const u_int32_t in_masks[] = { + /*0 bytes*/ /*1 byte*/ /*2 bytes*/ /*3 bytes*/ + 0x00000000, 0x000000FF, 0x0000FFFF, 0x00FFFFFF, /* offset 0 */ + 0x00000000, 0x0000FF00, 0x00FFFF00, 0xFFFFFF00, /* offset 1 */ + 0x00000000, 0x00FF0000, 0xFFFF0000, 0xFFFF0000, /* offset 2 */ + 0x00000000, 0xFF000000, 0xFF000000, 0xFF000000, /* offset 3 */ +}; + +union l_util { + u_int16_t s[2]; + u_int32_t l; +}; +union q_util { + u_int16_t s[4]; + u_int32_t l[2]; + u_int64_t q; +}; + +u_int64_t +in_cksumdata(buf, len) + register caddr_t buf; + register int len; +{ + const u_int32_t *lw = (u_int32_t *) buf; + u_int64_t sum = 0; + u_int64_t prefilled; + int offset; + union q_util q_util; + union l_util l_util; + + if ((3 & (long) lw) == 0 && len == 20) { + sum = (u_int64_t) lw[0] + lw[1] + lw[2] + lw[3] + lw[4]; + REDUCE32; + return sum; + } + + if ((offset = 3 & (long) lw) != 0) { + const u_int32_t *masks = in_masks + (offset << 2); + lw = (u_int32_t *) (((long) lw) - offset); + sum = *lw++ & masks[len >= 3 ? 3 : len]; + len -= 4 - offset; + if (len <= 0) { + REDUCE32; + return sum; + } + } +#if 0 + /* + * Force to cache line boundary. + */ + offset = 32 - (0x1f & (long) lw); + if (offset < 32 && len > offset) { + len -= offset; + if (4 & offset) { + sum += (u_int64_t) lw[0]; + lw += 1; + } + if (8 & offset) { + sum += (u_int64_t) lw[0] + lw[1]; + lw += 2; + } + if (16 & offset) { + sum += (u_int64_t) lw[0] + lw[1] + lw[2] + lw[3]; + lw += 4; + } + } +#endif + /* + * access prefilling to start load of next cache line. + * then add current cache line + * save result of prefilling for loop iteration. + */ + prefilled = lw[0]; + while ((len -= 32) >= 4) { + u_int64_t prefilling = lw[8]; + sum += prefilled + lw[1] + lw[2] + lw[3] + + lw[4] + lw[5] + lw[6] + lw[7]; + lw += 8; + prefilled = prefilling; + } + if (len >= 0) { + sum += prefilled + lw[1] + lw[2] + lw[3] + + lw[4] + lw[5] + lw[6] + lw[7]; + lw += 8; + } else { + len += 32; + } + while ((len -= 16) >= 0) { + sum += (u_int64_t) lw[0] + lw[1] + lw[2] + lw[3]; + lw += 4; + } + len += 16; + while ((len -= 4) >= 0) { + sum += (u_int64_t) *lw++; + } + len += 4; + if (len > 0) + sum += (u_int64_t) (in_masks[len] & *lw); + REDUCE32; + return sum; +} + +int +in_cksum(m, len) + register struct mbuf *m; + register int len; +{ + register u_int64_t sum = 0; + register int mlen = 0; + register int clen = 0; + register caddr_t addr; + union q_util q_util; + union l_util l_util; + + for (; m && len; m = m->m_next) { + if (m->m_len == 0) + continue; + mlen = m->m_len; + if (len < mlen) + mlen = len; + addr = mtod(m, caddr_t); + if ((clen ^ (long) addr) & 1) + sum += in_cksumdata(addr, mlen) << 8; + else + sum += in_cksumdata(addr, mlen); + + clen += mlen; + len -= mlen; + } + REDUCE16; + return (~sum & 0xffff); +} diff --git a/sys/arch/alpha/alpha/interrupt.c b/sys/arch/alpha/alpha/interrupt.c index 3b1b1eaadae..96dc58f7a10 100644 --- a/sys/arch/alpha/alpha/interrupt.c +++ b/sys/arch/alpha/alpha/interrupt.c @@ -1,4 +1,4 @@ -/* $NetBSD: interrupt.c,v 1.4 1995/11/23 02:34:08 cgd Exp $ */ +/* $NetBSD: interrupt.c,v 1.5 1996/04/23 13:54:32 cgd Exp $ */ /* * Copyright (c) 1994, 1995 Carnegie-Mellon University. @@ -128,7 +128,7 @@ machine_check(framep, logoutp, vec) { if (!mc_expected) - panic("machine check: vec %lx, pc = 0x%lx, ra = 0x%lx", + panic("machine check: vec 0x%lx, pc = 0x%lx, ra = 0x%lx", vec, framep->tf_pc, framep->tf_regs[FRAME_RA]); mc_expected = 0; diff --git a/sys/arch/alpha/alpha/locore.s b/sys/arch/alpha/alpha/locore.s index 50439438fde..0df2856b540 100644 --- a/sys/arch/alpha/alpha/locore.s +++ b/sys/arch/alpha/alpha/locore.s @@ -1,7 +1,7 @@ -/* $NetBSD: locore.s,v 1.7 1995/11/23 02:34:11 cgd Exp $ */ +/* $NetBSD: locore.s,v 1.13.4.1 1996/06/13 18:06:59 cgd Exp $ */ /* - * Copyright (c) 1994, 1995 Carnegie-Mellon University. + * Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -27,16 +27,22 @@ * rights to redistribute these changes. */ -#define LOCORE - #include <machine/asm.h> #ifndef EVCNT_COUNTERS #include <machine/intrcnt.h> #endif -#include "assym.s" +#include "assym.h" /* don't reorder instructions; paranoia. */ .set noreorder + .text + +/* + * This is for kvm_mkdb, and should be the address of the beginning + * of the kernel text segment (not necessarily the same as kernbase). + */ + EXPORT(kernel_text) +kernel_text: /* * bootstack: a temporary stack, for booting. @@ -51,13 +57,9 @@ bootstack: * Arguments: * a0 is the first free page frame number (PFN) * a1 is the page table base register (PTBR) - * a2 argc - * a3 argv - * a4 envp * * All arguments are passed to alpha_init(). */ - .text NESTED_NOPROFILE(__start,1,0,ra,0,0) br pv,1f 1: SETGP(pv) @@ -1621,3 +1623,11 @@ EXPORT(eintrcnt) .text /**************************************************************************/ + + .text +LEAF(rpcc,1) + rpcc v0 + RET + END(pal_mtpr_mces) + +/**************************************************************************/ diff --git a/sys/arch/alpha/alpha/machdep.c b/sys/arch/alpha/alpha/machdep.c index a5bcdea8398..bdc0d410c25 100644 --- a/sys/arch/alpha/alpha/machdep.c +++ b/sys/arch/alpha/alpha/machdep.c @@ -1,7 +1,7 @@ -/* $NetBSD: machdep.c,v 1.14 1996/01/04 22:21:33 jtc Exp $ */ +/* $NetBSD: machdep.c,v 1.19.4.5 1996/06/15 03:56:33 cgd Exp $ */ /* - * Copyright (c) 1994, 1995 Carnegie-Mellon University. + * Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -35,6 +35,7 @@ #include <sys/proc.h> #include <sys/buf.h> #include <sys/reboot.h> +#include <sys/device.h> #include <sys/conf.h> #include <sys/file.h> #ifdef REAL_CLISTS @@ -94,7 +95,7 @@ #include <net/netisr.h> #include "ether.h" -#include "le.h" /* XXX for le_iomem creation */ +#include "le_ioasic.h" /* for le_iomem creation */ vm_map_t buffer_map; @@ -135,7 +136,7 @@ u_int32_t no_optimize; /* the following is used externally (sysctl_hw) */ char machine[] = "alpha"; -char *cpu_model; +char cpu_model[128]; char *model_names[] = { "UNKNOWN (0)", "Alpha Demonstration Unit", @@ -174,18 +175,19 @@ int ncpus; /* various CPU-specific functions. */ char *(*cpu_modelname) __P((void)); -void (*cpu_consinit) __P((char *)); -dev_t (*cpu_bootdev) __P((char *)); +void (*cpu_consinit) __P((void)); +void (*cpu_device_register) __P((struct device *dev, void *aux)); char *cpu_iobus; -char *boot_file, *boot_flags, *boot_console, *boot_dev; +char boot_flags[64]; + +/* for cpu_sysctl() */ +char root_device[17]; int -alpha_init(pfn, ptb, argc, argv, envp) +alpha_init(pfn, ptb) u_long pfn; /* first free PFN number */ u_long ptb; /* PFN of current level 1 page table */ - u_long argc; - char *argv[], *envp[]; { extern char _end[]; caddr_t start, v; @@ -362,7 +364,7 @@ alpha_init(pfn, ptb, argc, argv, envp) case ST_DEC_3000_500: cpu_modelname = dec_3000_500_modelname; cpu_consinit = dec_3000_500_consinit; - cpu_bootdev = dec_3000_500_bootdev; + cpu_device_register = dec_3000_500_device_register; cpu_iobus = "tcasic"; break; #endif @@ -371,7 +373,7 @@ alpha_init(pfn, ptb, argc, argv, envp) case ST_DEC_3000_300: cpu_modelname = dec_3000_300_modelname; cpu_consinit = dec_3000_300_consinit; - cpu_bootdev = dec_3000_300_bootdev; + cpu_device_register = dec_3000_300_device_register; cpu_iobus = "tcasic"; break; #endif @@ -380,7 +382,7 @@ alpha_init(pfn, ptb, argc, argv, envp) case ST_DEC_2100_A50: cpu_modelname = dec_2100_a50_modelname; cpu_consinit = dec_2100_a50_consinit; - cpu_bootdev = dec_2100_a50_bootdev; + cpu_device_register = dec_2100_a50_device_register; cpu_iobus = "apecs"; break; #endif @@ -389,7 +391,7 @@ alpha_init(pfn, ptb, argc, argv, envp) case ST_DEC_KN20AA: cpu_modelname = dec_kn20aa_modelname; cpu_consinit = dec_kn20aa_consinit; - cpu_bootdev = dec_kn20aa_bootdev; + cpu_device_register = dec_kn20aa_device_register; cpu_iobus = "cia"; break; #endif @@ -398,7 +400,7 @@ alpha_init(pfn, ptb, argc, argv, envp) case ST_DEC_AXPPCI_33: cpu_modelname = dec_axppci_33_modelname; cpu_consinit = dec_axppci_33_consinit; - cpu_bootdev = dec_axppci_33_bootdev; + cpu_device_register = dec_axppci_33_device_register; cpu_iobus = "lca"; break; #endif @@ -407,7 +409,7 @@ alpha_init(pfn, ptb, argc, argv, envp) case ST_DEC_2000_300: cpu_modelname = dec_2000_300_modelname; cpu_consinit = dec_2000_300_consinit; - cpu_bootdev = dec_2000_300_bootdev; + cpu_device_register = dec_2000_300_device_register; cpu_iobus = "ibus"; XXX DEC 2000/300 NOT SUPPORTED break; @@ -417,8 +419,9 @@ alpha_init(pfn, ptb, argc, argv, envp) case ST_DEC_21000: cpu_modelname = dec_21000_modelname; cpu_consinit = dec_21000_consinit; - cpu_bootdev = dec_21000_bootdev; + cpu_device_register = dec_21000_device_register; cpu_iobus = "tlsb"; + XXX DEC 21000 NOT SUPPORTED break; #endif @@ -430,22 +433,30 @@ alpha_init(pfn, ptb, argc, argv, envp) model_names[cputype]); } - cpu_model = (*cpu_modelname)(); - if (cpu_model == NULL) - cpu_model = model_names[cputype]; + if ((*cpu_modelname)() != NULL) + strncpy(cpu_model, (*cpu_modelname)(), sizeof cpu_model - 1); + else + strncpy(cpu_model, model_names[cputype], sizeof cpu_model - 1); + cpu_model[sizeof cpu_model - 1] = '\0'; -#if NLE > 0 +#if NLE_IOASIC > 0 /* * Grab 128K at the top of physical memory for the lance chip * on machines where it does dma through the I/O ASIC. * It must be physically contiguous and aligned on a 128K boundary. + * + * Note that since this is conditional on the presence of + * IOASIC-attached 'le' units in the kernel config, the + * message buffer may move on these systems. This shouldn't + * be a problem, because once people have a kernel config that + * they use, they're going to stick with it. */ if (cputype == ST_DEC_3000_500 || cputype == ST_DEC_3000_300) { /* XXX possibly others? */ lastusablepage -= btoc(128 * 1024); le_iomem = (caddr_t)phystok0seg(ctob(lastusablepage + 1)); } -#endif /* NLE */ +#endif /* NLE_IOASIC */ /* * Initialize error message buffer (at end of core). @@ -490,14 +501,12 @@ alpha_init(pfn, ptb, argc, argv, envp) /* * Determine how many buffers to allocate. - * We allocate the BSD standard of 10% of memory for the first - * 2 Meg, and 5% of remaining memory for buffer space. Insure a + * We allocate 10% of memory for buffer space. Insure a * minimum of 16 buffers. We allocate 1/2 as many swap buffer * headers as file i/o buffers. */ if (bufpages == 0) - bufpages = (btoc(2 * 1024 * 1024) + physmem) / - (20 * CLSIZE); + bufpages = (physmem * 10) / (CLSIZE * 100); if (nbuf == 0) { nbuf = bufpages; if (nbuf < 16) @@ -538,70 +547,40 @@ alpha_init(pfn, ptb, argc, argv, envp) proc0.p_md.md_tf = (struct trapframe *)proc0paddr->u_pcb.pcb_ksp; /* - * figure out what arguments we have - */ - switch (argc) { - default: - printf("weird number of arguments from boot: %d\n", argc); - if (argc < 1) - break; - /* FALLTHRU */ - case 4: - boot_dev = argv[3]; - /* FALLTHRU */ - case 3: - boot_console = argv[2]; - /* FALLTHRU */ - case 2: - boot_flags = argv[1]; - /* FALLTHRU */ - case 1: - boot_file = argv[0]; - /* FALLTHRU */ - } - - /* - * Look at arguments and compute bootdev. - * XXX NOT HERE. + * Look at arguments passed to us and compute boothowto. */ + prom_getenv(PROM_E_BOOTED_OSFLAGS, boot_flags, sizeof(boot_flags)); #if 0 - { /* XXX */ - extern dev_t bootdev; /* XXX */ - bootdev = (*cpu_bootdev)(boot_dev); - } /* XXX */ + printf("boot flags = \"%s\"\n", boot_flags); #endif - /* - * Look at arguments passed to us and compute boothowto. - */ boothowto = RB_SINGLE; -#ifdef GENERIC - boothowto |= RB_ASKNAME; -#endif #ifdef KADB boothowto |= RB_KDB; #endif for (p = boot_flags; p && *p != '\0'; p++) { + /* + * Note that we'd really like to differentiate case here, + * but the Alpha AXP Architecture Reference Manual + * says that we shouldn't. + */ switch (*p) { case 'a': /* autoboot */ - case 'A': /* DEC's notion of autoboot */ + case 'A': boothowto &= ~RB_SINGLE; break; - case 'd': /* use compiled in default root */ - boothowto |= RB_DFLTROOT; + case 'n': /* askname */ + case 'N': + boothowto |= RB_ASKNAME; break; +#if 0 case 'm': /* mini root present in memory */ + case 'M': boothowto |= RB_MINIROOT; break; - - case 'n': /* ask for names */ - boothowto |= RB_ASKNAME; - break; - - case 'N': /* don't ask for names */ - boothowto &= ~RB_ASKNAME; +#endif } } @@ -621,13 +600,15 @@ alpha_init(pfn, ptb, argc, argv, envp) return (0); } +void consinit() { - (*cpu_consinit)(boot_console); + (*cpu_consinit)(); pmap_unmap_prom(); } +void cpu_startup() { register unsigned i; @@ -757,6 +738,7 @@ identifycpu() int waittime = -1; struct pcb dumppcb; +void boot(howto) int howto; { @@ -770,12 +752,6 @@ boot(howto) boothowto = howto; if ((howto & RB_NOSYNC) == 0 && waittime < 0) { - extern struct proc proc0; - - /* protect against curproc->p_stats.foo refs in sync XXX */ - if (curproc == NULL) - curproc = &proc0; - waittime = 0; vfs_shutdown(); /* @@ -1236,6 +1212,10 @@ cpu_sysctl(name, namelen, oldp, oldlenp, newp, newlen, p) consdev = NODEV; return (sysctl_rdstruct(oldp, oldlenp, newp, &consdev, sizeof consdev)); + + case CPU_ROOT_DEVICE: + return (sysctl_rdstring(oldp, oldlenp, newp, root_device)); + default: return (EOPNOTSUPP); } @@ -1319,7 +1299,7 @@ netintr() #endif #ifdef PPP if (netisr & (1 << NETISR_PPP)) { - netisr &= ~(1 << NETISR_CCITT); + netisr &= ~(1 << NETISR_PPP); pppintr(); } #endif @@ -1440,21 +1420,31 @@ microtime(tvp) splx(s); } +/* + * Wait "n" microseconds. + */ +int +delay(n) + int n; +{ + long N = cycles_per_usec * (n); + + while (N > 0) /* XXX */ + N -= 3; /* XXX */ +} + #if defined(COMPAT_OSF1) || 1 /* XXX */ void -cpu_exec_ecoff_setregs(p, pack, stack, retval) +cpu_exec_ecoff_setregs(p, epp, stack, retval) struct proc *p; - struct exec_package *pack; + struct exec_package *epp; u_long stack; register_t *retval; { - struct ecoff_aouthdr *eap; - - setregs(p, pack, stack, retval); + struct ecoff_exechdr *execp = (struct ecoff_exechdr *)epp->ep_hdr; - eap = (struct ecoff_aouthdr *) - ((caddr_t)pack->ep_hdr + sizeof(struct ecoff_filehdr)); - p->p_md.md_tf->tf_gp = eap->ea_gp_value; + setregs(p, epp, stack, retval); + p->p_md.md_tf->tf_gp = execp->a.gp_value; } /* @@ -1465,26 +1455,25 @@ cpu_exec_ecoff_setregs(p, pack, stack, retval) * */ int -cpu_exec_ecoff_hook(p, epp, eap) +cpu_exec_ecoff_hook(p, epp) struct proc *p; struct exec_package *epp; - struct ecoff_aouthdr *eap; { - struct ecoff_filehdr *efp = epp->ep_hdr; - extern struct emul emul_native; + struct ecoff_exechdr *execp = (struct ecoff_exechdr *)epp->ep_hdr; + extern struct emul emul_netbsd; #ifdef COMPAT_OSF1 extern struct emul emul_osf1; #endif - switch (efp->ef_magic) { + switch (execp->f.f_magic) { #ifdef COMPAT_OSF1 case ECOFF_MAGIC_ALPHA: epp->ep_emul = &emul_osf1; break; #endif - case ECOFF_MAGIC_NATIVE_ALPHA: - epp->ep_emul = &emul_native; + case ECOFF_MAGIC_NETBSD_ALPHA: + epp->ep_emul = &emul_netbsd; break; default: diff --git a/sys/arch/alpha/alpha/mainbus.c b/sys/arch/alpha/alpha/mainbus.c index 6ed51a575be..50c0feac4f8 100644 --- a/sys/arch/alpha/alpha/mainbus.c +++ b/sys/arch/alpha/alpha/mainbus.c @@ -1,7 +1,7 @@ -/* $NetBSD: mainbus.c,v 1.6 1995/12/20 00:18:50 cgd Exp $ */ +/* $NetBSD: mainbus.c,v 1.9 1996/04/12 06:07:35 cgd Exp $ */ /* - * Copyright (c) 1994, 1995 Carnegie-Mellon University. + * Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -44,9 +44,14 @@ struct mainbus_softc { static int mbmatch __P((struct device *, void *, void *)); static void mbattach __P((struct device *, struct device *, void *)); static int mbprint __P((void *, char *)); -struct cfdriver mainbuscd = - { NULL, "mainbus", mbmatch, mbattach, DV_DULL, - sizeof (struct mainbus_softc) }; + +struct cfattach mainbus_ca = { + sizeof(struct mainbus_softc), mbmatch, mbattach +}; + +struct cfdriver mainbus_cd = { + NULL, "mainbus", DV_DULL +}; void mb_intr_establish __P((struct confargs *, int (*)(void *), void *)); void mb_intr_disestablish __P((struct confargs *)); @@ -111,7 +116,7 @@ mbattach(parent, self, aux) nca.ca_slot = 0; nca.ca_offset = 0; nca.ca_bus = &sc->sc_bus; - if (config_found(self, &nca, mbprint)) + if (config_found(self, &nca, mbprint) != NULL) cpuattachcnt++; } if (ncpus != cpuattachcnt) diff --git a/sys/arch/alpha/alpha/mcclock.c b/sys/arch/alpha/alpha/mcclock.c new file mode 100644 index 00000000000..1a4c48b10eb --- /dev/null +++ b/sys/arch/alpha/alpha/mcclock.c @@ -0,0 +1,136 @@ +/* $NetBSD: mcclock.c,v 1.2 1996/04/17 22:22:32 cgd Exp $ */ + +/* + * Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ + +#include <sys/param.h> +#include <sys/kernel.h> +#include <sys/systm.h> +#include <sys/device.h> + +#include <alpha/alpha/clockvar.h> +#include <alpha/alpha/mcclockvar.h> +#include <dev/ic/mc146818reg.h> + +struct cfdriver mcclock_cd = { + NULL, "mcclock", DV_DULL, +}; + +void mcclock_init __P((struct device *)); +void mcclock_get __P((struct device *, time_t, struct clocktime *)); +void mcclock_set __P((struct device *, struct clocktime *)); + +const struct clockfns mcclock_clockfns = { + mcclock_init, mcclock_get, mcclock_set, +}; + +#define mc146818_write(dev, reg, datum) \ + (*(dev)->sc_busfns->mc_bf_write)(dev, reg, datum) +#define mc146818_read(dev, reg) \ + (*(dev)->sc_busfns->mc_bf_read)(dev, reg) + +void +mcclock_attach(sc, busfns) + struct mcclock_softc *sc; + const struct mcclock_busfns *busfns; +{ + + printf(": mc146818 or compatible"); + + sc->sc_busfns = busfns; + + /* Turn interrupts off, just in case. */ + mc146818_write(sc, MC_REGB, MC_REGB_BINARY | MC_REGB_24HR); + + clockattach(&sc->sc_dev, &mcclock_clockfns); +} + +void +mcclock_init(dev) + struct device *dev; +{ + struct mcclock_softc *sc = (struct mcclock_softc *)dev; + + mc146818_write(sc, MC_REGA, MC_BASE_32_KHz | MC_RATE_1024_Hz); + mc146818_write(sc, MC_REGB, + MC_REGB_PIE | MC_REGB_BINARY | MC_REGB_24HR); +} + +/* + * Get the time of day, based on the clock's value and/or the base value. + */ +void +mcclock_get(dev, base, ct) + struct device *dev; + time_t base; + struct clocktime *ct; +{ + struct mcclock_softc *sc = (struct mcclock_softc *)dev; + mc_todregs regs; + int s; + + s = splclock(); + MC146818_GETTOD(sc, ®s) + splx(s); + + ct->sec = regs[MC_SEC]; + ct->min = regs[MC_MIN]; + ct->hour = regs[MC_HOUR]; + ct->dow = regs[MC_DOW]; + ct->day = regs[MC_DOM]; + ct->mon = regs[MC_MONTH]; + ct->year = regs[MC_YEAR]; +} + +/* + * Reset the TODR based on the time value. + */ +void +mcclock_set(dev, ct) + struct device *dev; + struct clocktime *ct; +{ + struct mcclock_softc *sc = (struct mcclock_softc *)dev; + mc_todregs regs; + int s; + + s = splclock(); + MC146818_GETTOD(sc, ®s); + splx(s); + + regs[MC_SEC] = ct->sec; + regs[MC_MIN] = ct->min; + regs[MC_HOUR] = ct->hour; + regs[MC_DOW] = ct->dow; + regs[MC_DOM] = ct->day; + regs[MC_MONTH] = ct->mon; + regs[MC_YEAR] = ct->year; + + s = splclock(); + MC146818_PUTTOD(sc, ®s); + splx(s); +} diff --git a/sys/arch/alpha/include/pci_machdep.h b/sys/arch/alpha/alpha/mcclockvar.h index 5e474e396d2..049d3912eec 100644 --- a/sys/arch/alpha/include/pci_machdep.h +++ b/sys/arch/alpha/alpha/mcclockvar.h @@ -1,7 +1,7 @@ -/* $NetBSD: pci_machdep.h,v 1.1 1995/11/23 02:36:19 cgd Exp $ */ +/* $NetBSD: mcclockvar.h,v 1.2 1996/04/17 22:22:38 cgd Exp $ */ /* - * Copyright (c) 1995 Carnegie-Mellon University. + * Copyright (c) 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -26,11 +26,16 @@ * any improvements or extensions that they make and grant Carnegie the * rights to redistribute these changes. */ -/* - * Machine-specific definitions for PCI autoconfiguration. - */ -/* - * Configuration tag. - */ -typedef u_long pci_tag_t; +struct mcclock_softc { + struct device sc_dev; + const struct mcclock_busfns *sc_busfns; +}; + +struct mcclock_busfns { + void (*mc_bf_write) __P((struct mcclock_softc *, u_int, u_int)); + u_int (*mc_bf_read) __P((struct mcclock_softc *, u_int)); +}; + +void mcclock_attach __P((struct mcclock_softc *, + const struct mcclock_busfns *)); diff --git a/sys/arch/alpha/alpha/mem.c b/sys/arch/alpha/alpha/mem.c index 5f310eed697..3709b3104b8 100644 --- a/sys/arch/alpha/alpha/mem.c +++ b/sys/arch/alpha/alpha/mem.c @@ -1,4 +1,4 @@ -/* $NetBSD: mem.c,v 1.5 1995/11/23 02:34:21 cgd Exp $ */ +/* $NetBSD: mem.c,v 1.6 1996/04/12 02:06:21 cgd Exp $ */ /* * Copyright (c) 1988 University of Utah. @@ -112,7 +112,7 @@ kmemphys: #endif o = uio->uio_offset & PGOFSET; c = min(uio->uio_resid, (int)(NBPG - o)); - error = uiomove(phystok0seg(v), c, uio); + error = uiomove((caddr_t)phystok0seg(v), c, uio); continue; /* minor device 1 is kernel memory */ diff --git a/sys/arch/alpha/alpha/pmap.c b/sys/arch/alpha/alpha/pmap.c index 59804c9d9be..2ea0b3f140e 100644 --- a/sys/arch/alpha/alpha/pmap.c +++ b/sys/arch/alpha/alpha/pmap.c @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.c,v 1.7 1995/11/23 02:34:26 cgd Exp $ */ +/* $NetBSD: pmap.c,v 1.8 1996/04/12 02:09:24 cgd Exp $ */ /* * Copyright (c) 1991, 1993 @@ -267,6 +267,8 @@ void pmap_pvdump __P((vm_offset_t)); void pmap_check_wiring __P((char *, vm_offset_t)); #endif +#define PAGE_IS_MANAGED(pa) ((pa) >= vm_first_phys && (pa) < vm_last_phys) + /* pmap_remove_mapping flags */ #define PRM_TFLUSH 1 #define PRM_CFLUSH 2 @@ -406,8 +408,19 @@ pmap_bootstrap(firstaddr, ptaddr) /* Nothing to do; it's already zero'd */ avail_start = k0segtophys(firstaddr); - avail_end = alpha_ptob(1 + lastusablepage); +#if 1 + avail_end = alpha_ptob(lastusablepage + 1); mem_size = avail_end - avail_start; +#else + /* XXX why not lastusablepage + 1, & not include NBPG in mem_size? */ + avail_end = alpha_ptob(lastusablepage); + mem_size = NBPG + avail_end - avail_start; +#endif +#if 0 + printf("avail_start = 0x%lx\n", avail_start); + printf("avail_end = 0x%lx\n", avail_end); + printf("mem_size = 0x%lx\n", mem_size); +#endif virtual_avail = VM_MIN_KERNEL_ADDRESS; virtual_end = VM_MIN_KERNEL_ADDRESS + Sysmapsize * NBPG; @@ -522,6 +535,10 @@ pmap_init(phys_start, phys_end) */ vm_first_phys = phys_start; vm_last_phys = phys_end; +#if 0 + printf("vm_first_phys = 0x%lx\n", vm_first_phys); + printf("vm_last_phys = 0x%lx\n", vm_last_phys); +#endif pmap_initialized = TRUE; } @@ -769,7 +786,7 @@ pmap_page_protect(pa, prot) prot == VM_PROT_NONE && (pmapdebug & PDB_REMOVE)) printf("pmap_page_protect(%lx, %lx)\n", pa, prot); #endif - if (pa < vm_first_phys || pa >= vm_last_phys) + if (!PAGE_IS_MANAGED(pa)) return; switch (prot) { @@ -1015,7 +1032,7 @@ pmap_enter(pmap, va, pa, prot, wired) * Note that we raise IPL while manipulating pv_table * since pmap_enter can be called at interrupt time. */ - if (pa >= vm_first_phys && pa < vm_last_phys) { + if (PAGE_IS_MANAGED(pa)) { register pv_entry_t pv, npv; int s; @@ -1092,10 +1109,12 @@ validate: * Build the new PTE. */ npte = ((pa >> PGSHIFT) << PG_SHIFT) | pte_prot(pmap, prot) | PG_V; - if ((pmap_attributes[pa_index(pa)] & PMAP_ATTR_REF) == 0) - npte |= PG_FOR | PG_FOW | PG_FOE; - else if ((pmap_attributes[pa_index(pa)] & PMAP_ATTR_MOD) == 0) - npte |= PG_FOW; + if (PAGE_IS_MANAGED(pa)) { + if ((pmap_attributes[pa_index(pa)] & PMAP_ATTR_REF) == 0) + npte |= PG_FOR | PG_FOW | PG_FOE; + else if ((pmap_attributes[pa_index(pa)] & PMAP_ATTR_MOD) == 0) + npte |= PG_FOW; + } if (wired) npte |= PG_WIRED; #ifdef DEBUG @@ -1471,7 +1490,7 @@ pmap_pageable(pmap, sva, eva, pageable) if (!pmap_ste_v(pmap, sva)) return; pa = pmap_pte_pa(pmap_pte(pmap, sva)); - if (pa < vm_first_phys || pa >= vm_last_phys) + if (!PAGE_IS_MANAGED(pa)) return; pv = pa_to_pvh(pa); if (pv->pv_ptpte == NULL) @@ -1514,6 +1533,8 @@ pmap_clear_modify(pa) if (pmapdebug & PDB_FOLLOW) printf("pmap_clear_modify(%lx)\n", pa); #endif + if (!PAGE_IS_MANAGED(pa)) /* XXX why not panic? */ + return; if ((pmap_attributes[pa_index(pa)] & PMAP_ATTR_MOD) != 0) { pmap_changebit(pa, PG_FOW, TRUE); pmap_attributes[pa_index(pa)] &= ~PMAP_ATTR_MOD; @@ -1533,6 +1554,8 @@ void pmap_clear_reference(pa) if (pmapdebug & PDB_FOLLOW) printf("pmap_clear_reference(%lx)\n", pa); #endif + if (!PAGE_IS_MANAGED(pa)) /* XXX why not panic? */ + return; if ((pmap_attributes[pa_index(pa)] & PMAP_ATTR_REF) != 0) { pmap_changebit(pa, PG_FOR | PG_FOW | PG_FOE, TRUE); pmap_attributes[pa_index(pa)] &= ~PMAP_ATTR_REF; @@ -1552,6 +1575,8 @@ pmap_is_referenced(pa) { boolean_t rv; + if (!PAGE_IS_MANAGED(pa)) /* XXX why not panic? */ + return 0; rv = (pmap_attributes[pa_index(pa)] & PMAP_ATTR_REF) != 0; #ifdef DEBUG if (pmapdebug & PDB_FOLLOW) { @@ -1574,6 +1599,8 @@ pmap_is_modified(pa) { boolean_t rv; + if (!PAGE_IS_MANAGED(pa)) /* XXX why not panic? */ + return 0; rv = (pmap_attributes[pa_index(pa)] & PMAP_ATTR_MOD) != 0; #ifdef DEBUG if (pmapdebug & PDB_FOLLOW) { @@ -1709,7 +1736,7 @@ pmap_remove_mapping(pmap, va, pte, flags) /* * If this isn't a managed page, we are all done. */ - if (pa < vm_first_phys || pa >= vm_last_phys) + if (!PAGE_IS_MANAGED(pa)) return; /* * Otherwise remove it from the PV table @@ -1848,7 +1875,7 @@ pmap_changebit(pa, bit, setem) printf("pmap_changebit(%lx, %lx, %s)\n", pa, bit, setem ? "set" : "clear"); #endif - if (pa < vm_first_phys || pa >= vm_last_phys) + if (!PAGE_IS_MANAGED(pa)) return; #ifdef PMAPSTATS @@ -2156,6 +2183,10 @@ pmap_emulate_reference(p, v, user, write) if (pmapdebug & PDB_FOLLOW) printf("\tpa = 0x%lx\n", pa); #endif +#ifdef DIAGNOSTIC + if (!PAGE_IS_MANAGED(pa)) + printf("WARNING: pmap_emulate_reference(0x%lx, 0x%lx, %d, %d): pa 0x%lx not managed\n", p, v, user, write, pa); +#endif /* * Twiddle the appropriate bits to reflect the reference @@ -2177,6 +2208,7 @@ pmap_emulate_reference(p, v, user, write) #if 0 /* * This is apparently normal. Why? -- cgd + * XXX because was being called on unmanaged pages? */ printf("warning: pmap_changebit didn't."); #endif diff --git a/sys/arch/alpha/alpha/prom.c b/sys/arch/alpha/alpha/prom.c index 473a9290981..735ae81c85c 100644 --- a/sys/arch/alpha/alpha/prom.c +++ b/sys/arch/alpha/alpha/prom.c @@ -1,7 +1,7 @@ -/* $NetBSD: prom.c,v 1.4 1995/08/03 00:58:33 cgd Exp $ */ +/* $NetBSD: prom.c,v 1.5.4.2 1996/06/13 18:35:21 cgd Exp $ */ /* - * Copyright (c) 1992, 1994, 1995 Carnegie Mellon University + * Copyright (c) 1992, 1994, 1995, 1996 Carnegie Mellon University * All Rights Reserved. * * Permission to use, copy, modify and distribute this software and its @@ -207,6 +207,11 @@ prom_getenv(id, buf, len) TBIA(); /* XXX */ } /* XXX */ splx(s); + + if (ret.u.status & 0x4) + ret.u.retval = 0; + buf[ret.u.retval] = '\0'; + return (ret.bits); } @@ -226,7 +231,8 @@ prom_halt(halt) * we want to happen when we halt. */ p = (struct pcs *)((char *)hwrpb + hwrpb->rpb_pcs_off); - p->pcs_flags &= ~(PCS_RC | PCS_HALT_REQ); + /* XXX BIP should have been cleared long ago. */ + p->pcs_flags &= ~(PCS_RC | PCS_HALT_REQ | PCS_BIP); if (halt) p->pcs_flags |= PCS_HALT_STAY_HALTED; else diff --git a/sys/arch/alpha/alpha/prom_disp.s b/sys/arch/alpha/alpha/prom_disp.s index 6a4bb12685c..0a4f6a4c832 100644 --- a/sys/arch/alpha/alpha/prom_disp.s +++ b/sys/arch/alpha/alpha/prom_disp.s @@ -1,7 +1,7 @@ -/* $NetBSD: prom_disp.s,v 1.1 1995/02/13 23:07:10 cgd Exp $ */ +/* $NetBSD: prom_disp.s,v 1.4 1996/04/12 06:07:38 cgd Exp $ */ /* - * Copyright (c) 1994, 1995 Carnegie-Mellon University. + * Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -27,10 +27,10 @@ * rights to redistribute these changes. */ -#ifndef LOCORE -#include "../include/asm.h" -#include "../include/prom.h" -#include "../include/rpb.h" +#ifndef _LOCORE +#include <machine/asm.h> +#include <machine/prom.h> +#include <machine/rpb.h> #endif .globl prom_dispatch_v diff --git a/sys/arch/alpha/alpha/promcons.c b/sys/arch/alpha/alpha/promcons.c index 7a0a2ecf3d3..d958cf0577f 100644 --- a/sys/arch/alpha/alpha/promcons.c +++ b/sys/arch/alpha/alpha/promcons.c @@ -1,4 +1,4 @@ -/* $NetBSD: promcons.c,v 1.2 1995/06/28 02:45:19 cgd Exp $ */ +/* $NetBSD: promcons.c,v 1.2.6.1 1996/06/03 18:54:31 cgd Exp $ */ /* * Copyright (c) 1994, 1995 Carnegie-Mellon University. @@ -64,9 +64,10 @@ promopen(dev, flag, mode, p) s = spltty(); - if (!prom_tty[unit]) + if (!prom_tty[unit]) { tp = prom_tty[unit] = ttymalloc(); - else + tty_attach(tp); + } else tp = prom_tty[unit]; tp->t_oproc = promstart; diff --git a/sys/arch/alpha/alpha/swapgeneric.c b/sys/arch/alpha/alpha/swapgeneric.c index acfad0b11c2..fb6aa241464 100644 --- a/sys/arch/alpha/alpha/swapgeneric.c +++ b/sys/arch/alpha/alpha/swapgeneric.c @@ -1,11 +1,8 @@ -/* $NetBSD: swapgeneric.c,v 1.3 1995/03/24 15:03:02 cgd Exp $ */ +/* $NetBSD: swapgeneric.c,v 1.4.4.1 1996/06/13 18:02:37 cgd Exp $ */ /*- - * Copyright (c) 1990 The Regents of the University of California. - * All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * William Jolitz. + * Copyright (c) 1994 + * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -17,8 +14,8 @@ * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. + * This product includes software developed by the University of + * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. @@ -35,158 +32,22 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * @(#)swapgeneric.c 5.5 (Berkeley) 5/9/91 + * @(#)swapgeneric.c 8.2 (Berkeley) 3/21/94 + */ + +/* + * fake swapgeneric.c -- should do this differently. */ #include <sys/param.h> #include <sys/conf.h> -#include <sys/buf.h> -#include <sys/systm.h> -#include <sys/reboot.h> -#include <sys/device.h> -#include <sys/disklabel.h> - -#include <machine/pte.h> -#include "sd.h" -#include "cd.h" +int (*mountroot) __P((void *)) = NULL; /* tells autoconf.c that we are "generic" */ -/* - * Generic configuration; all in one - */ dev_t rootdev = NODEV; -dev_t argdev = NODEV; dev_t dumpdev = NODEV; -int nswap; -struct swdevt swdevt[] = { - { NODEV, 1, 0 }, - { NODEV, 0, 0 }, -}; -long dumplo; -int dmmin, dmmax, dmtext; - -#if NSD > 0 -extern struct cfdriver sdcd; -#endif -#if NCD > 0 -extern struct cfdriver cdcd; -#endif -struct genericconf { - struct cfdriver *gc_driver; - char *gc_name; - dev_t gc_major; -} genericconf[] = { -#if NSD > 0 - { &sdcd, "sd", 8 }, -#endif -#if NCD > 0 - { &cdcd, "cd", 3 }, -#endif - { 0 } +struct swdevt swdevt[] = { + { NODEV, 0, 0 }, /* to be filled in */ + { NODEV, 0, 0 } }; - -extern int ffs_mountroot(); -int (*mountroot)() = ffs_mountroot; - -setconf() -{ - register struct genericconf *gc; - int unit, swaponroot = 0; - - if (rootdev != NODEV) - goto doswap; - - if (genericconf[0].gc_driver == 0) - goto verybad; - - if (boothowto & RB_ASKNAME) { - char name[128]; -retry: - printf("root device? "); - gets(name); - - if (strcmp(name, "halt") == 0) - boot(RB_HALT); - - for (gc = genericconf; gc->gc_driver; gc++) - if (gc->gc_name[0] == name[0] && - gc->gc_name[1] == name[1]) - goto gotit; - goto bad; -gotit: - if (name[3] == '*') { - name[3] = name[4]; - swaponroot++; - } - if (name[2] >= '0' && name[2] <= '7' && name[3] == 0) { - unit = name[2] - '0'; - goto found; - } - printf("bad/missing unit number\n"); -bad: - printf("use:\n"); - for (gc = genericconf; gc->gc_driver; gc++) - printf("\t%s%%d\n", gc->gc_name); - printf("\thalt\n"); - goto retry; - } - unit = 0; - for (gc = genericconf; gc->gc_driver; gc++) { - if (gc->gc_driver->cd_ndevs > unit && - gc->gc_driver->cd_devs[unit]) { - printf("root on %s0\n", gc->gc_name); - goto found; - } - } -verybad: - printf("no suitable root\n"); - boot(RB_HALT); - -found: - rootdev = makedev(gc->gc_major, unit * MAXPARTITIONS); -doswap: - swdevt[0].sw_dev = argdev = dumpdev = - makedev(major(rootdev), minor(rootdev) + 1); - /* swap size and dumplo set during autoconfigure */ - if (swaponroot) - rootdev = dumpdev; -} - -gets(cp) - char *cp; -{ - register char *lp; - register c; - - lp = cp; - for (;;) { - printf("%c", c = cngetc()&0177); - switch (c) { - case '\n': - case '\r': - printf("%c", '\n'); - *lp++ = '\0'; - return; - case '\b': - case '\177': - if (lp > cp) { - printf(" \b"); - lp--; - } - continue; - case '#': - lp--; - if (lp < cp) - lp = cp; - continue; - case '@': - case 'u'&037: - lp = cp; - printf("%c", '\n'); - continue; - default: - *lp++ = c; - } - } -} diff --git a/sys/arch/alpha/alpha/vm_machdep.c b/sys/arch/alpha/alpha/vm_machdep.c index 5b31b6d23c2..32939382780 100644 --- a/sys/arch/alpha/alpha/vm_machdep.c +++ b/sys/arch/alpha/alpha/vm_machdep.c @@ -1,7 +1,7 @@ -/* $NetBSD: vm_machdep.c,v 1.6 1995/12/09 04:37:23 mycroft Exp $ */ +/* $NetBSD: vm_machdep.c,v 1.9 1996/04/23 15:26:10 cgd Exp $ */ /* - * Copyright (c) 1994, 1995 Carnegie-Mellon University. + * Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -246,14 +246,14 @@ cpu_fork(p1, p2) void cpu_set_kpc(p, pc) struct proc *p; - u_int64_t pc; + void (*pc) __P((struct proc *)); { struct pcb *pcbp; extern void proc_trampoline(); extern void rei(); pcbp = &p->p_addr->u_pcb; - pcbp->pcb_context[0] = pc; /* s0 - pc to invoke */ + pcbp->pcb_context[0] = (u_int64_t)pc; /* s0 - pc to invoke */ pcbp->pcb_context[1] = (u_int64_t)rei; /* s1 - return address */ pcbp->pcb_context[7] = (u_int64_t)proc_trampoline; /* ra - assembly magic */ @@ -318,22 +318,25 @@ cpu_swapout(p) * Both addresses are assumed to reside in the Sysmap, * and size must be a multiple of CLSIZE. */ +void pagemove(from, to, size) register caddr_t from, to; - int size; + size_t size; { register pt_entry_t *fpte, *tpte; + ssize_t todo; if (size % CLBYTES) panic("pagemove"); fpte = kvtopte(from); tpte = kvtopte(to); - while (size > 0) { + todo = size; /* if testing > 0, need sign... */ + while (todo > 0) { TBIS(from); *tpte++ = *fpte; *fpte = 0; fpte++; - size -= NBPG; + todo -= NBPG; from += NBPG; to += NBPG; } @@ -359,6 +362,7 @@ extern vm_map_t phys_map; * All requests are (re)mapped into kernel VA space via the useriomap * (a name with only slightly more meaning than "kernelmap") */ +void vmapbuf(bp, len) struct buf *bp; vm_size_t len; @@ -390,6 +394,7 @@ vmapbuf(bp, len) * Free the io map PTEs associated with this IO operation. * We also invalidate the TLB entries and restore the original b_addr. */ +void vunmapbuf(bp, len) struct buf *bp; vm_size_t len; diff --git a/sys/arch/alpha/compile/build_all b/sys/arch/alpha/compile/build_all index a0a470cd77d..abd8fe68ac8 100644 --- a/sys/arch/alpha/compile/build_all +++ b/sys/arch/alpha/compile/build_all @@ -1,15 +1,33 @@ #!/bin/sh - +# +# $NetBSD: build_all,v 1.4.4.1 1996/06/15 03:46:17 cgd Exp $ -dirlist=`find . -type d ! \( -name . -o -name CVS \) -prune | \ - sed -e s,./,, | sort` +cflist=`cd ../conf ; find . -type f ! -name "*[a-z.]*" ! -name ".*" | \ + sed -e 's,^\./,,'` -for dir in $dirlist; do - echo === $dir - echo "" - echo "***" - echo "" - (cd $dir ; time make -k) - echo "" - echo "***" +docmd() +{ + + echo " ===> $*" +# echo " eval ($*)" + eval "($*)" + echo " <===" +} + +docf() +{ + echo "===> $1" + ( + docmd "cd ../conf ; config $cf" + cd $cf + docmd "time make -k clean" + docmd "time make -k depend" + docmd "time make -k" + ) + echo "<===" echo "" +} + +for cf in $cflist; do + docf $cf done diff --git a/sys/arch/alpha/compile/rebuild_all b/sys/arch/alpha/compile/rebuild_all index fd619a5bcd5..2a0fa61fbc5 100644 --- a/sys/arch/alpha/compile/rebuild_all +++ b/sys/arch/alpha/compile/rebuild_all @@ -1,23 +1,33 @@ #!/bin/sh - +# +# $NetBSD: rebuild_all,v 1.4.4.1 1996/06/15 03:46:19 cgd Exp $ -dirlist=`find . -type d ! \( -name . -o -name CVS \) -prune | \ - sed -e s,./,, | sort` +cflist=`cd ../conf ; find . -type f ! -name "*[a-z.]*" ! -name ".*" | \ + sed -e 's,^\./,,'` -for dir in $dirlist; do - echo === $dir - echo "" - echo "***" - echo "" - (cd $dir ; time make -k clean) - echo "" - echo "***" - echo "" - (cd $dir ; time make -k depend) - echo "" - echo "***" - echo "" - (cd $dir ; time make -k) - echo "" - echo "***" - echo "" +docmd() +{ + + echo " ===> $*" +# echo " eval ($*)" + eval "($*)" + echo " <===" +} + +docf() +{ + echo "===> $1" + ( + # docmd "cd ../conf ; config $cf" + cd $cf + # docmd "time make -k clean" + # docmd "time make -k depend" + docmd "time make -k" + ) + echo "<===" + echo "" +} + +for cf in $cflist; do + docf $cf done diff --git a/sys/arch/alpha/conf/ALPHA b/sys/arch/alpha/conf/ALPHA index 73989072623..7bbfb44cfae 100644 --- a/sys/arch/alpha/conf/ALPHA +++ b/sys/arch/alpha/conf/ALPHA @@ -1,4 +1,4 @@ -# $NetBSD: ALPHA,v 1.8 1995/12/20 00:14:10 cgd Exp $ +# $NetBSD: ALPHA,v 1.14.4.4 1996/06/13 19:21:59 cgd Exp $ # # Alpha kernel with all the options you'd want, and more. @@ -6,9 +6,6 @@ include "std.alpha" maxusers 8 -# does not really do anything anymore, but this replaces "ident GENERIC" -options GENERIC - # CPU Support options DEC_3000_500 # Flamingo etc: 3000/[4-9]00* options DEC_3000_300 # Pelican etc: 3000/300* @@ -41,8 +38,9 @@ options NULLFS # Null file system layer options KERNFS # Kernel variable file system (/kern) options FDESC # File descriptor file system (/dev/fd) options PORTAL # Portal file system -options UMAP # User-mapping file system layer +options UMAPFS # User-mapping file system layer options PROCFS # Process file system (/proc) +options UNION # union file system # Networking options options INET # Internet protocol suite @@ -60,6 +58,7 @@ options COMPAT_43 # Binary compatibility with previous versions of NetBSD. #options COMPAT_09 options COMPAT_10 +options COMPAT_11 # OSF/1 binary compatibility -- CURRENTLY DOES NOT WORK #options COMPAT_OSF1 @@ -98,14 +97,17 @@ tc* at tcasic? # TurboChannel devices ioasic0 at tc? slot ? offset ? -clock0 at ioasic? offset ? -le0 at ioasic? offset ? +mcclock0 at ioasic? offset ? +le* at ioasic? offset ? scc0 at ioasic? offset ? scc1 at ioasic? offset ? tcds0 at tc? slot ? offset ? esp0 at tcds? slot ? esp1 at tcds? slot ? -#sfb* at tc? slot ? offset ? +cfb* at tc? slot ? offset ? +sfb* at tc? slot ? offset ? +le* at tc? slot ? offset ? +fta* at tc? slot ? offset ? # DEC DEFTA FDDI cards # PCI host bus adapter support apecs* at mainbus? @@ -120,12 +122,14 @@ pci* at ppb? # PCI devices de* at pci? +le* at pci? ncr* at pci? pceb* at pci? pcivga* at pci? ppb* at pci? sio* at pci? tga* at pci? +fpa* at pci? dev ? function ? # DEC DEFPA FDDI cards # ISA/EISA bus support isa* at pceb? @@ -133,14 +137,17 @@ eisa* at pceb? isa* at sio? # ISA devices -clock0 at isa? port 0x70 +mcclock0 at isa? port 0x70 pckbd0 at isa? port 0x60 irq 1 # PC-ish ISA keyboard -#pms0 at isa? port 0x60 irq 12 # PS/2 auxiliary +pms0 at isa? port 0x60 irq 12 # PS/2 auxiliary com0 at isa? port 0x3f8 irq 4 # standard serial ports com1 at isa? port 0x2f8 irq 3 lpt0 at isa? port 0x3bc irq 7 # standard parallel port #wss0 at isa? port 0x530 irq 9 drq 0 # Windows Sound System +# EISA devices +fea* at eisa? slot ? # DEC DEFEA FDDI cards + # SCSI bus support scsibus* at esp? scsibus* at ncr? @@ -150,10 +157,17 @@ sd* at scsibus? target ? lun ? st* at scsibus? target ? lun ? cd* at scsibus? target ? lun ? -pseudo-device bpfilter +# Workstation Console attachments +wscons* at cfb? +wscons* at pcivga? +wscons* at sfb? +wscons* at tga? + +pseudo-device bpfilter 16 pseudo-device loop -pseudo-device ppp -pseudo-device pty -pseudo-device sl -pseudo-device tun -pseudo-device vnd +pseudo-device ppp 4 +pseudo-device pty 64 +pseudo-device sl 4 +pseudo-device strip 4 +pseudo-device tun 4 +pseudo-device vnd 4 diff --git a/sys/arch/alpha/conf/BUNNY b/sys/arch/alpha/conf/BUNNY index aed65576e7e..61a913773a8 100644 --- a/sys/arch/alpha/conf/BUNNY +++ b/sys/arch/alpha/conf/BUNNY @@ -1,13 +1,9 @@ -# $NetBSD: BUNNY,v 1.3 1995/11/23 02:34:55 cgd Exp $ +# $NetBSD: BUNNY,v 1.5.4.1 1996/06/13 19:22:03 cgd Exp $ # # Kernel for bunnahabhain.pdl.cs.cmu.edu. # -# This kernel contains support for NO frame buffer devices; bunny -# is rack-mounted, and has no video boards. THIS KERNEL CANNOT BE -# USED ON MACHINES WITH FRAME BUFFERS. -# -# It also has no support for devices which aren't actually used -# (sound, parallel port, keyboard, mouse, SCSI tape or CD-ROM, etc.). +# Trimmed down kernel for AlphaStation [24]xx systems, with lots +# of buffer cache. include "std.alpha" @@ -42,7 +38,9 @@ options INET # Internet protocol suite options COMPAT_43 # Binary compatibility with previous versions of NetBSD. +#options COMPAT_09 options COMPAT_10 +options COMPAT_11 # Loadable Kernel Modules options LKM @@ -53,7 +51,7 @@ options LKM # Misc. options options PCIVERBOSE # recognize "unknown" PCI devices -config netbsd root on sd0 swap on sd0 +config netbsd swap generic mainbus0 at root cpu* at mainbus0 @@ -66,23 +64,36 @@ pci* at apecs? # PCI devices de* at pci? -ncr0 at pci? +ncr* at pci? +pcivga* at pci? sio* at pci? +tga* at pci? # ISA/EISA bus support isa* at sio? # ISA devices -clock0 at isa? port 0x70 +mcclock0 at isa? port 0x70 +pckbd0 at isa? port 0x60 irq 1 # PC-ish ISA keyboard +pms0 at isa? port 0x60 irq 12 # PS/2 auxiliary com0 at isa? port 0x3f8 irq 4 # standard serial ports com1 at isa? port 0x2f8 irq 3 +lpt0 at isa? port 0x3bc irq 7 # standard parallel port +#wss0 at isa? port 0x530 irq 9 drq 0 # Windows Sound System # SCSI bus support scsibus* at ncr? # SCSI devices sd* at scsibus? target ? lun ? +st* at scsibus? target ? lun ? +cd* at scsibus? target ? lun ? + +# Workstation Console attachments +wscons* at pcivga? +wscons* at tga? -pseudo-device bpfilter +pseudo-device bpfilter 16 pseudo-device loop -pseudo-device pty +pseudo-device pty 64 +pseudo-device vnd 4 diff --git a/sys/arch/alpha/conf/DILLY b/sys/arch/alpha/conf/DILLY deleted file mode 100644 index b8236ee54ba..00000000000 --- a/sys/arch/alpha/conf/DILLY +++ /dev/null @@ -1,96 +0,0 @@ -# $NetBSD: DILLY,v 1.1 1995/11/23 02:34:58 cgd Exp $ -# -# Kernel for dilrod.nas.nasa.gov, and AlphaStation 600. - -include "std.alpha" - -maxusers 16 - -# bump up the number of buffers, for quicker compiles -options BUFPAGES=2048 # 16M of buffer cache - -# CPU Support -options DEC_KN20AA # KN20AA: AlphaStation 600 - -# needs to be set per system -options TIMEZONE="5*60" # Minutes west of GMT (for param.c) -options DST=1 # Daylight savings rules (for param.c) - -# Standard system options -options SWAPPAGER, VNODEPAGER, DEVPAGER # Paging (mandatory) -options DEBUG, DIAGNOSTIC # Extra kernel debugging -options KTRACE # System call tracing support - -# File system options -options FIFO # POSIX fifo support (in all file systems) -options FFS # Fast file system -options MFS # Memory-based file system -options NFSCLIENT # Sun NFS-compatible file system client - -# Networking options -options INET # Internet protocol suite - -# 4.3BSD compatibility. Should be optional, but necessary for now. -options COMPAT_43 - -# Binary compatibility with previous versions of NetBSD. -options COMPAT_10 - -# Loadable Kernel Modules -options LKM - -# Disable kernel security. -#options INSECURE - -# Misc. options -options PCIVERBOSE # recognize "unknown" PCI devices - -config netbsd root on sd0 swap on sd0 - -mainbus0 at root -cpu* at mainbus0 - -# PCI host bus adapter support -cia* at mainbus? - -# PCI bus support -pci0 at cia? -pci* at ppb? - -# PCI devices -de* at pci? -ncr0 at pci0 dev 9 -ncr* at pci? -pceb* at pci? -pcivga* at pci? -ppb* at pci? -tga* at pci? - -# ISA and EISA bus support -isa* at pceb? -eisa* at pceb? - -# ISA devices -clock0 at isa? port 0x70 -pckbd0 at isa? port 0x60 irq 1 # PC-ish ISA keyboard -#pms0 at isa? port 0x60 irq 12 # PS/2 auxiliary -com0 at isa? port 0x3f8 irq 4 # standard serial ports -com1 at isa? port 0x2f8 irq 3 -lpt0 at isa? port 0x3bc irq 7 # standard parallel port -#wss0 at isa? port 0x530 irq 9 drq 0 # Windows Sound System - -# SCSI bus support -scsibus0 at ncr0 -scsibus* at ncr? - -# SCSI devices -sd0 at scsibus0 target 1 lun 0 -sd* at scsibus? target ? lun ? -st* at scsibus? target ? lun ? -cd* at scsibus? target ? lun ? - -pseudo-device bpfilter -pseudo-device loop -pseudo-device pty -pseudo-device sl -pseudo-device vnd diff --git a/sys/arch/alpha/conf/GENERIC b/sys/arch/alpha/conf/GENERIC index cd7717859b8..efd66410efd 100644 --- a/sys/arch/alpha/conf/GENERIC +++ b/sys/arch/alpha/conf/GENERIC @@ -1,4 +1,4 @@ -# $NetBSD: GENERIC,v 1.10 1995/12/20 00:14:14 cgd Exp $ +# $NetBSD: GENERIC,v 1.15.4.3 1996/06/13 19:22:07 cgd Exp $ # # Generic Alpha kernel. Enough to get booted, etc., but not much more. @@ -6,9 +6,6 @@ include "std.alpha" maxusers 8 -# does not really do anything anymore, but this replaces "ident GENERIC" -options GENERIC - # CPU Support options DEC_3000_500 # Flamingo etc: 3000/[4-9]00* options DEC_3000_300 # Pelican etc: 3000/300* @@ -40,7 +37,9 @@ options INET # Internet protocol suite options COMPAT_43 # Binary compatibility with previous versions of NetBSD. +#options COMPAT_09 options COMPAT_10 +options COMPAT_11 # OSF/1 binary compatibility -- CURRENTLY DOES NOT WORK #options COMPAT_OSF1 @@ -54,7 +53,9 @@ options LKM # Misc. options options PCIVERBOSE # recognize "unknown" PCI devices -config netbsd swap generic +config netbsd swap generic +#config netbsd root on sd0 swap on sd0 +#config netbsd root nfs swap nfs mainbus0 at root cpu* at mainbus0 @@ -67,14 +68,17 @@ tc* at tcasic? # TurboChannel devices ioasic0 at tc? slot ? offset ? -clock0 at ioasic? offset ? -le0 at ioasic? offset ? +mcclock0 at ioasic? offset ? +le* at ioasic? offset ? scc0 at ioasic? offset ? scc1 at ioasic? offset ? tcds0 at tc? slot ? offset ? esp0 at tcds? slot ? esp1 at tcds? slot ? -#sfb* at tc? slot ? offset ? +cfb* at tc? slot ? offset ? +sfb* at tc? slot ? offset ? +le* at tc? slot ? offset ? +fta* at tc? slot ? offset ? # DEC DEFTA FDDI cards # PCI host bus adapter support apecs* at mainbus? @@ -89,12 +93,14 @@ pci* at ppb? # PCI devices de* at pci? +le* at pci? ncr* at pci? pceb* at pci? pcivga* at pci? ppb* at pci? sio* at pci? tga* at pci? +fpa* at pci? dev ? function ? # DEC DEFPA FDDI cards # ISA/EISA bus support isa* at pceb? @@ -102,14 +108,17 @@ eisa* at pceb? isa* at sio? # ISA devices -clock0 at isa? port 0x70 +mcclock0 at isa? port 0x70 pckbd0 at isa? port 0x60 irq 1 # PC-ish ISA keyboard -#pms0 at isa? port 0x60 irq 12 # PS/2 auxiliary +pms0 at isa? port 0x60 irq 12 # PS/2 auxiliary com0 at isa? port 0x3f8 irq 4 # standard serial ports com1 at isa? port 0x2f8 irq 3 lpt0 at isa? port 0x3bc irq 7 # standard parallel port #wss0 at isa? port 0x530 irq 9 drq 0 # Windows Sound System +# EISA devices +fea* at eisa? slot ? # DEC DEFEA FDDI cards + # SCSI bus support scsibus* at esp? scsibus* at ncr? @@ -118,12 +127,15 @@ scsibus* at ncr? sd* at scsibus? target ? lun ? st* at scsibus? target ? lun ? cd* at scsibus? target ? lun ? -ch* at scsibus? target ? lun ? -ss* at scsibus? target ? lun ? -uk* at scsibus? target ? lun ? -pseudo-device bpfilter +# Workstation Console attachments +wscons* at cfb? +wscons* at pcivga? +wscons* at sfb? +wscons* at tga? + +pseudo-device bpfilter 16 pseudo-device loop -pseudo-device pty -pseudo-device sl -pseudo-device vnd +pseudo-device pty 64 +pseudo-device sl 4 +pseudo-device vnd 4 diff --git a/sys/arch/alpha/conf/GENERIC_NFS b/sys/arch/alpha/conf/GENERIC_NFS deleted file mode 100644 index cb7f540af64..00000000000 --- a/sys/arch/alpha/conf/GENERIC_NFS +++ /dev/null @@ -1,123 +0,0 @@ -# $NetBSD: GENERIC_NFS,v 1.4 1995/12/20 00:14:16 cgd Exp $ -# -# Generic Alpha kernel. Enough to get booted, etc., but not much more. - -include "std.alpha" - -maxusers 8 - -# CPU Support -options DEC_3000_500 # Flamingo etc: 3000/[4-9]00* -options DEC_3000_300 # Pelican etc: 3000/300* -options DEC_2100_A50 # Avanti etc: AlphaStation 400, 200, etc. -options DEC_KN20AA # KN20AA: AlphaStation 600 -options DEC_AXPPCI_33 # NoName: AXPpci33, etc. -#options DEC_2000_300 # "Jensen": 2000/300 (DECpc AXP 150) - -# needs to be set per system -options TIMEZONE="5*60" # Minutes west of GMT (for param.c) -options DST=1 # Daylight savings rules (for param.c) - -# Standard system options -options SWAPPAGER, VNODEPAGER, DEVPAGER # Paging (mandatory) -options DEBUG, DIAGNOSTIC # Extra kernel debugging -options KTRACE # System call tracing support - -# File system options -options FIFO # POSIX fifo support (in all file systems) -options FFS # Fast file system -options MFS # Memory-based file system -options NFSSERVER # Sun NFS-compatible file system server -options NFSCLIENT # Sun NFS-compatible file system client - -# Networking options -options INET # Internet protocol suite - -# 4.3BSD compatibility. Should be optional, but necessary for now. -options COMPAT_43 - -# Binary compatibility with previous versions of NetBSD. -options COMPAT_10 - -# OSF/1 binary compatibility -- CURRENTLY DOES NOT WORK -#options COMPAT_OSF1 - -# Loadable Kernel Modules -options LKM - -# Disable kernel security. -#options INSECURE - -# Misc. options -options PCIVERBOSE # recognize "unknown" PCI devices - -config netbsd_nfs root on nfs swap on nfs - -mainbus0 at root -cpu* at mainbus0 - -# TurboChannel host bus adapter support -tcasic* at mainbus0 - -# TurboChannel bus support -tc* at tcasic? - -# TurboChannel devices -ioasic0 at tc? slot ? offset ? -clock0 at ioasic? offset ? -le0 at ioasic? offset ? -scc0 at ioasic? offset ? -scc1 at ioasic? offset ? -tcds0 at tc? slot ? offset ? -esp0 at tcds? slot ? -esp1 at tcds? slot ? -#sfb* at tc? slot ? offset ? - -# PCI host bus adapter support -apecs* at mainbus? -cia* at mainbus? -lca* at mainbus? - -# PCI bus support -pci* at apecs? -pci* at cia? -pci* at lca? -pci* at ppb? - -# PCI devices -de* at pci? -ncr* at pci? -pceb* at pci? -pcivga* at pci? -ppb* at pci? -sio* at pci? -tga* at pci? - -# ISA/EISA bus support -isa* at pceb? -eisa* at pceb? -isa* at sio? - -# ISA devices -clock0 at isa? port 0x70 -pckbd0 at isa? port 0x60 irq 1 # PC-ish ISA keyboard -#pms0 at isa? port 0x60 irq 12 # PS/2 auxiliary -com0 at isa? port 0x3f8 irq 4 # standard serial ports -com1 at isa? port 0x2f8 irq 3 -lpt0 at isa? port 0x3bc irq 7 # standard parallel port -#wss0 at isa? port 0x530 irq 9 drq 0 # Windows Sound System - -# SCSI bus support -scsibus* at esp? -scsibus* at ncr? - -# SCSI devices -sd* at scsibus? target ? lun ? -st* at scsibus? target ? lun ? -cd* at scsibus? target ? lun ? - -pseudo-device bpfilter -pseudo-device loop -pseudo-device pty -pseudo-device sl -pseudo-device vnd diff --git a/sys/arch/alpha/conf/JURA b/sys/arch/alpha/conf/JURA index 9de2fa3bf2d..b1b6db317b3 100644 --- a/sys/arch/alpha/conf/JURA +++ b/sys/arch/alpha/conf/JURA @@ -1,6 +1,8 @@ -# $NetBSD: JURA,v 1.4 1995/11/23 02:35:09 cgd Exp $ +# $NetBSD: JURA,v 1.6.4.1 1996/06/13 19:22:10 cgd Exp $ # # Kernel for jura.pdl.cs.cmu.edu. +# +# THIS KERNEL DOES NOT CURRENTLY WORK, OR EVEN CONFIGURE! include "std.alpha" @@ -33,7 +35,9 @@ options INET # Internet protocol suite options COMPAT_43 # Binary compatibility with previous versions of NetBSD. +#options COMPAT_09 options COMPAT_10 +options COMPAT_11 # Loadable Kernel Modules options LKM @@ -47,9 +51,9 @@ ibus* at mainbus0 # "internal bus" jcombo* at ibus? # the VLSI combo chip isa* at jcombo? -clock0 at isa? port 0x70 +mcclock0 at isa? port 0x70 pckbd0 at isa? port 0x60 irq 1 # PC-ish ISA keyboard -#pms0 at isa? port 0x60 irq 12 # PS/2 auxiliary +pms0 at isa? port 0x60 irq 12 # PS/2 auxiliary com0 at isa? port 0x3f8 irq 4 # standard serial ports com1 at isa? port 0x2f8 irq 3 lpt0 at isa? port 0x3bc irq 7 # standard parallel port diff --git a/sys/arch/alpha/conf/Makefile.alpha b/sys/arch/alpha/conf/Makefile.alpha index b09846200a3..51acb060228 100644 --- a/sys/arch/alpha/conf/Makefile.alpha +++ b/sys/arch/alpha/conf/Makefile.alpha @@ -1,15 +1,15 @@ -# $NetBSD: Makefile.alpha,v 1.8 1995/11/23 02:35:16 cgd Exp $ -# +# $NetBSD: Makefile.alpha,v 1.16 1996/05/19 21:16:51 cgd Exp $ + # Makefile for NetBSD # # This makefile is constructed from a machine description: # config machineid # Most changes should be made in the machine description -# /sys/conf/``machineid'' +# /sys/arch/alpha/conf/``machineid'' # after which you should do -# config machineid +# config machineid # Machine generic makefile changes should be made in -# /sys/conf/Makefile.``machinetype'' +# /sys/arch/alpha/conf/Makefile.alpha # after which config should be rerun for all machines of that type. # # N.B.: NO DEPENDENCIES ON FOLLOWING FLAGS ARE VISIBLE TO MAKEFILE @@ -22,21 +22,21 @@ # PROF is set to -pg if profiling. AS?= as -AWK?= awk CC?= cc CPP?= cpp LD?= ld +STRIP?= strip -g -X -x TOUCH?= touch -f -c # source tree is located via $S relative to the compilation directory S= ../../../.. ALPHA= ../.. -INCLUDES= -I. -I$S/arch -I$S -I$S/sys -COPTS= ${INCLUDES} ${IDENT} -D_KERNEL -CFLAGS= -Werror -fno-builtin -mno-fp-regs ${DEBUG} ${COPTS} -Dalpha -#CFLAGS+=-Wmissing-prototypes -Wmissing-declarations -AFLAGS= ${COPTS} +INCLUDES= -I. -I$S/arch -I$S +CPPFLAGS= ${INCLUDES} ${IDENT} -D_KERNEL -Dalpha +CFLAGS= ${DEBUG} -O2 -Werror -mno-fp-regs +AFLAGS= -x assembler-with-cpp -traditional-cpp -D_LOCORE +LINKFLAGS= -N -Ttext fffffc0000230000 -e __start -G 4 ### find out what to use for libkern .include "$S/lib/libkern/Makefile.inc" @@ -59,103 +59,115 @@ LIBCOMPAT= ${COMPATLIB_PROF} # capitalized (e.g. C for a .c file), and CONFIG_DEP is _C if the file # is marked as config-dependent. -NORMAL_C= ${CC} -c ${CFLAGS} ${PROF} $< -NORMAL_C_C= ${CC} -c ${CFLAGS} ${PROF} ${PARAM} $< -NORMAL_S= rm -f $*.c; ln -s $< $*.c; \ - ${CC} ${AFLAGS} -I${ALPHA}/alpha -E $*.c > $*.i; \ - ${AS} -o $@ $*.i; rm -f $*.c $*.i -NORMAL_S_C= rm -f $*.c; ln -s $< $*.c; \ - ${CC} ${AFLAGS} ${PARAM} -I${ALPHA}/alpha -E $*.c > $*.i; \ - ${AS} -o $@ $*.i; rm -f $*.c $*.i +NORMAL_C= ${CC} ${CFLAGS} ${CPPFLAGS} ${PROF} -c $< +NORMAL_C_C= ${CC} ${CFLAGS} ${CPPFLAGS} ${PROF} ${PARAM} -c $< + +DRIVER_C= ${CC} ${CFLAGS} ${CPPFLAGS} ${PROF} -c $< +DRIVER_C_C= ${CC} ${CFLAGS} ${CPPFLAGS} ${PROF} ${PARAM} -c $< + +NORMAL_S= ${CC} ${AFLAGS} ${CPPFLAGS} -c $< +NORMAL_S_C= ${CC} ${AFLAGS} ${CPPFLAGS} ${PARAM} -c $< %OBJS %CFILES +%SFILES + # load lines for config "xxx" will be emitted as: # xxx: ${SYSTEM_DEP} swapxxx.o # ${SYSTEM_LD_HEAD} # ${SYSTEM_LD} swapxxx.o # ${SYSTEM_LD_TAIL} -DEBUG?= -.if ${DEBUG} == "-g" -LDX=-X -.else -LDX=-x -.endif -LDFLAGS= ${LDX} -G 4 -N -e __start -Ttext fffffc0000230000 -SYSTEM_OBJ= locore.o ${OBJS} param.o ioconf.o ${LIBKERN} \ - ${LIBCOMPAT} +SYSTEM_OBJ= locore.o \ + param.o ioconf.o ${OBJS} ${LIBKERN} ${LIBCOMPAT} SYSTEM_DEP= Makefile ${SYSTEM_OBJ} -SYSTEM_LD_HEAD= @echo loading $@; rm -f $@ -SYSTEM_LD= -@echo ${LD} ${LDFLAGS} -o $@ '$${SYSTEM_OBJ}' vers.o ${XXX}; \ - ${LD} ${LDFLAGS} -o $@ ${SYSTEM_OBJ} vers.o ${XXX} +SYSTEM_LD_HEAD= @rm -f $@ +SYSTEM_LD= @echo ${LD} ${LINKFLAGS} -o $@ '$${SYSTEM_OBJ}' vers.o; \ + ${LD} ${LINKFLAGS} -o $@ ${SYSTEM_OBJ} vers.o SYSTEM_LD_TAIL= @size $@; chmod 755 $@ + +DEBUG?= .if ${DEBUG} == "-g" -.if 0 -SYSTEM_LD_TAIL+=; echo cp $@ $@.gdb; rm -f $@.gdb; cp $@ $@.gdb; \ - echo strip -d $@; strip -d $@ +LINKFLAGS+= -X +SYSTEM_LD_TAIL+=; \ + echo cp $@ $@.gdb; rm -f $@.gdb; cp $@ $@.gdb; \ + echo ${STRIP} $@; ${STRIP} $@ .else -SYSTEM_LD_TAIL+=; echo cp $@ $@.gdb; rm -f $@.gdb; cp $@ $@.gdb; \ - echo strip -g -X -x $@; strip -g -X -x $@ -.endif +LINKFLAGS+= -x .endif %LOAD -newvers: - sh $S/conf/newvers.sh - ${CC} ${CFLAGS} -c vers.c +assym.h: genassym + ./genassym >assym.h -clean:: - rm -f eddep *netbsd netbsd.gdb tags tags1 *.[io] \ - [a-z]*.s Errs errs linterrs makelinks genassym +genassym: genassym.o + ${CC} -o $@ genassym.o + +genassym.o: ${ALPHA}/alpha/genassym.c + ${NORMAL_C_C} + +param.c: $S/conf/param.c + rm -f param.c + cp $S/conf/param.c . +param.o: param.c Makefile + ${NORMAL_C_C} -locore.o: ${ALPHA}/alpha/locore.s ${ALPHA}/alpha/pal.s \ - ${ALPHA}/alpha/prom_disp.s ${ALPHA}/include/intrcnt.h assym.s - ${NORMAL_S_C} +ioconf.o: ioconf.c + ${NORMAL_C} -# depend on maxusers -assym.s: Makefile +newvers: ${SYSTEM_DEP} ${SYSTEM_SWAP_DEP} + sh $S/conf/newvers.sh + ${CC} ${CFLAGS} ${CPPFLAGS} ${PROF} -c vers.c -./assym.s: assym.s -assym.s: genassym - ./genassym >assym.s -genassym: genassym.o - ${CC} -o $@ genassym.o +clean:: + rm -f eddep *netbsd netbsd.gdb tags *.[io] [a-z]*.s \ + [Ee]rrs linterrs makelinks genassym genassym.o assym.h -genassym.o: ${ALPHA}/alpha/genassym.c - ${CC} -c ${CFLAGS} ${PARAM} $< +lint: + @lint -hbxncez -DGENERIC -Dvolatile= ${CPPFLAGS} ${PARAM} -UKGDB \ + ${ALPHA}/alpha/Locore.c ${CFILES} ${ALPHA}/alpha/swapgeneric.c \ + ioconf.c param.c | \ + grep -v 'static function .* unused' -SRCS= ${CFILES} ${ALPHA}/alpha/genassym.c ioconf.c param.c -depend: .depend -.depend: ${SRCS} assym.s - mkdep ${COPTS} ${SRCS} - mkdep -a -p ${COPTS} ${ALPHA}/alpha/genassym.c +tags: + @echo "see $S/kern/Makefile for tags" links: egrep '#if' ${CFILES} | sed -f $S/conf/defines | \ sed -e 's/:.*//' -e 's/\.c/.o/' | sort -u > dontlink echo ${CFILES} | tr -s ' ' '\12' | sed 's/\.c/.o/' | \ sort -u | comm -23 - dontlink | \ - sed 's,../.*/\(.*.o\),rm -f \1;ln -s ../GENERIC/\1 \1,' > makelinks + sed 's,../.*/\(.*.o\),rm -f \1; ln -s ../GENERIC/\1 \1,' > makelinks sh makelinks && rm -f dontlink -tags: depend - sh $S/conf/systags.sh - rm -f tags1 - sed -e 's, ../, ,' tags > tags1 +SRCS= ${ALPHA}/alpha/locore.s \ + param.c ioconf.c ${CFILES} ${SFILES} +depend:: .depend +.depend: ${SRCS} assym.h param.c + mkdep ${AFLAGS} ${CPPFLAGS} ${ALPHA}/alpha/locore.s + mkdep -a ${CFLAGS} ${CPPFLAGS} param.c ioconf.c ${CFILES} + mkdep -a ${AFLAGS} ${CPPFLAGS} ${SFILES} + mkdep -a ${CFLAGS} ${CPPFLAGS} ${PARAM} ${ALPHA}/alpha/genassym.c -ioconf.o: ioconf.c - ${CC} -c ${CFLAGS} ioconf.c -param.c: $S/conf/param.c - rm -f param.c - cp $S/conf/param.c . +# depend on root or device configuration +autoconf.o conf.o: Makefile + +# depend on network or filesystem configuration +uipc_proto.o vfs_conf.o: Makefile -param.o: param.c Makefile - ${CC} -c ${CFLAGS} ${PARAM} param.c +# depend on maxusers +genassym.o machdep.o: Makefile + +# depend on CPU configuration +clock.o machdep.o apecs.o cia.o lca.o ioasic.o scc.o icasic.o: Makefile + + +locore.o: ${ALPHA}/alpha/locore.s assym.h + ${NORMAL_S} %RULES diff --git a/sys/arch/alpha/conf/NONAME b/sys/arch/alpha/conf/NONAME deleted file mode 100644 index 9bbe12ec924..00000000000 --- a/sys/arch/alpha/conf/NONAME +++ /dev/null @@ -1,89 +0,0 @@ -# $NetBSD: NONAME,v 1.1 1995/11/23 02:35:20 cgd Exp $ -# -# Should work on AXPpci33's (and maybe other AXPpci machines). - -include "std.alpha" - -maxusers 8 - -# CPU Support -options DEC_AXPPCI_33 # NoName: AXPpci33, etc. - -# needs to be set per system -options TIMEZONE="5*60" # Minutes west of GMT (for param.c) -options DST=1 # Daylight savings rules (for param.c) - -# Standard system options -options SWAPPAGER, VNODEPAGER, DEVPAGER # Paging (mandatory) -options DEBUG, DIAGNOSTIC # Extra kernel debugging -options KTRACE # System call tracing support - -# File system options -options FIFO # POSIX fifo support (in all file systems) -options FFS # Fast file system -options MFS # Memory-based file system -options NFSCLIENT # Sun NFS-compatible file system client - -# Networking options -options INET # Internet protocol suite - -# 4.3BSD compatibility. Should be optional, but necessary for now. -options COMPAT_43 - -# Binary compatibility with previous versions of NetBSD. -options COMPAT_10 - -# Loadable Kernel Modules -options LKM - -# Disable kernel security. -#options INSECURE - -# Misc. options -options PCIVERBOSE # recognize "unknown" PCI devices - -config netbsd root on sd0 swap on sd0 - -mainbus0 at root -cpu* at mainbus0 - -# PCI host bus adapter support -lca* at mainbus? - -# PCI bus support -pci* at lca? -pci* at ppb? - -# PCI devices -de* at pci? -ncr* at pci? -pcivga* at pci? -ppb* at pci? -sio* at pci? -tga* at pci? - -# ISA/EISA bus support -isa* at sio? - -# ISA devices -clock0 at isa? port 0x70 -pckbd0 at isa? port 0x60 irq 1 # PC-ish ISA keyboard -#pms0 at isa? port 0x60 irq 12 # PS/2 auxiliary -com0 at isa? port 0x3f8 irq 4 # standard serial ports -com1 at isa? port 0x2f8 irq 3 -lpt0 at isa? port 0x3bc irq 7 # standard parallel port -#wss0 at isa? port 0x530 irq 9 drq 0 # Windows Sound System - -# SCSI bus support -scsibus* at ncr? - -# SCSI devices -sd* at scsibus? target ? lun ? -st* at scsibus? target ? lun ? -cd* at scsibus? target ? lun ? - -pseudo-device bpfilter -pseudo-device loop -pseudo-device pty -pseudo-device sl -pseudo-device vnd diff --git a/sys/arch/alpha/conf/MACALLAN b/sys/arch/alpha/conf/NOSY index 2dfff09b113..bfd0d654f4c 100644 --- a/sys/arch/alpha/conf/MACALLAN +++ b/sys/arch/alpha/conf/NOSY @@ -1,6 +1,7 @@ -# $NetBSD: MACALLAN,v 1.7 1995/12/20 00:14:17 cgd Exp $ +# $NetBSD: NOSY,v 1.5.4.2 1996/06/13 19:22:15 cgd Exp $ +# +# Jason's DEC 3000/400 in the lab... # -# Kernel for macallan.dssc.cs.cmu.edu. include "std.alpha" @@ -10,7 +11,7 @@ maxusers 8 options DEC_3000_500 # Flamingo etc: 3000/[4-9]00* # needs to be set per system -options TIMEZONE="5*60" # Minutes west of GMT (for param.c) +options TIMEZONE="8*60" # Minutes west of GMT (for param.c) options DST=1 # Daylight savings rules (for param.c) # Standard system options @@ -22,7 +23,9 @@ options KTRACE # System call tracing support options FIFO # POSIX fifo support (in all file systems) options FFS # Fast file system options MFS # Memory-based file system +options NFSSERVER # Sun NFS-compatible file system server options NFSCLIENT # Sun NFS-compatible file system client +options UNION # Union filesystem # Networking options options INET # Internet protocol suite @@ -31,12 +34,20 @@ options INET # Internet protocol suite options COMPAT_43 # Binary compatibility with previous versions of NetBSD. +#options COMPAT_09 options COMPAT_10 +options COMPAT_11 + +# OSF/1 binary compatibility -- CURRENTLY DOES NOT WORK +#options COMPAT_OSF1 # Loadable Kernel Modules options LKM -config netbsd root on sd0 swap on sd0 and sd1 +# Disable kernel security. +options INSECURE + +config netbsd swap generic mainbus0 at root cpu* at mainbus0 @@ -49,27 +60,27 @@ tc* at tcasic? # TurboChannel devices ioasic0 at tc? slot ? offset ? -clock0 at ioasic? offset ? -le0 at ioasic? offset ? +mcclock0 at ioasic? offset ? +le* at ioasic? offset ? scc0 at ioasic? offset ? scc1 at ioasic? offset ? tcds0 at tc? slot ? offset ? esp0 at tcds? slot ? esp1 at tcds? slot ? -#sfb* at tc? slot ? offset ? +sfb* at tc? slot ? offset ? +fta* at tc? slot ? offset ? # DEC DEFTA FDDI cards # SCSI bus support -scsibus0 at esp0 scsibus* at esp? # SCSI devices -sd0 at scsibus0 target 0 lun 0 sd* at scsibus? target ? lun ? st* at scsibus? target ? lun ? cd* at scsibus? target ? lun ? -pseudo-device bpfilter +# Workstation Console attachments +wscons* at sfb? + +pseudo-device bpfilter 16 pseudo-device loop -pseudo-device pty -pseudo-device sl -pseudo-device vnd +pseudo-device pty 64 diff --git a/sys/arch/alpha/conf/TOMMY b/sys/arch/alpha/conf/TOMMY deleted file mode 100644 index e97ca816a92..00000000000 --- a/sys/arch/alpha/conf/TOMMY +++ /dev/null @@ -1,91 +0,0 @@ -# $NetBSD: TOMMY,v 1.3 1995/11/25 01:32:34 cgd Exp $ -# -# Kernel for tomintoul.pdl.cs.cmu.edu. -# Should work on AlphaStation 400s and AlphaStation 200s - -include "std.alpha" - -maxusers 8 - -# CPU Support -options DEC_2100_A50 # Avanti etc: AlphaStation 400, 200, etc. - -# needs to be set per system -options TIMEZONE="5*60" # Minutes west of GMT (for param.c) -options DST=1 # Daylight savings rules (for param.c) - -# Standard system options -options SWAPPAGER, VNODEPAGER, DEVPAGER # Paging (mandatory) -options DEBUG, DIAGNOSTIC # Extra kernel debugging -options KTRACE # System call tracing support - -# File system options -options FIFO # POSIX fifo support (in all file systems) -options FFS # Fast file system -options MFS # Memory-based file system -options NFSSERVER # Sun NFS-compatible file system server -options NFSCLIENT # Sun NFS-compatible file system client - -# Networking options -options INET # Internet protocol suite - -# 4.3BSD compatibility. Should be optional, but necessary for now. -options COMPAT_43 - -# Binary compatibility with previous versions of NetBSD. -options COMPAT_10 - -# Loadable Kernel Modules -options LKM - -# Disable kernel security. -#options INSECURE - -# Misc. options -options PCIVERBOSE # recognize "unknown" PCI devices - -config netbsd root on sd0 swap on sd0 - -mainbus0 at root -cpu* at mainbus0 - -# PCI host bus adapter support -apecs* at mainbus? - -# PCI bus support -pci* at apecs? -pci* at ppb? - -# PCI devices -de* at pci? -ncr0 at pci? -pcivga* at pci? -ppb* at pci? -sio* at pci? -tga* at pci? - -# ISA/EISA bus support -isa* at sio? - -# ISA devices -clock0 at isa? port 0x70 -pckbd0 at isa? port 0x60 irq 1 # PC-ish ISA keyboard -#pms0 at isa? port 0x60 irq 12 # PS/2 auxiliary -com0 at isa? port 0x3f8 irq 4 # standard serial ports -com1 at isa? port 0x2f8 irq 3 -lpt0 at isa? port 0x3bc irq 7 # standard parallel port -#wss0 at isa? port 0x530 irq 9 drq 0 # Windows Sound System - -# SCSI bus support -scsibus* at ncr? - -# SCSI devices -sd* at scsibus? target ? lun ? -st* at scsibus? target ? lun ? -cd* at scsibus? target ? lun ? - -pseudo-device bpfilter -pseudo-device loop -pseudo-device pty -pseudo-device sl -pseudo-device vnd diff --git a/sys/arch/alpha/conf/files.alpha b/sys/arch/alpha/conf/files.alpha index ef97fad1a46..b3c8bf12b56 100644 --- a/sys/arch/alpha/conf/files.alpha +++ b/sys/arch/alpha/conf/files.alpha @@ -1,4 +1,4 @@ -# $NetBSD: files.alpha,v 1.9 1995/12/20 00:14:19 cgd Exp $ +# $NetBSD: files.alpha,v 1.19.4.2 1996/05/30 23:20:37 cgd Exp $ # # alpha-specific configuration info @@ -12,9 +12,11 @@ maxusers 2 8 64 # Bus-independent devices # -device mainbus at root { } # no locators (yet?) +device mainbus { } # no locators (yet?) +attach mainbus at root -device cpu at mainbus { } # not really optional; can be a 'bus' +device cpu { } # not really optional; can be a 'bus' +attach cpu at mainbus file arch/alpha/alpha/cpu.c cpu @@ -29,30 +31,27 @@ major { sd = 8 } # -# ansi/sun console emulator -# - -define ansicons -file dev/pseudo/ansicons.c ansicons - - -# # raster console routines # +define raster include "../../../dev/rcons/files.rcons" - -define rcons -file dev/pseudo/rcons_init.c rcons -file dev/pseudo/rcons_subr.c rcons +file arch/alpha/wscons/wscons_rinit.c raster +file arch/alpha/wscons/wscons_rops.c raster # # "Workstation Console" glue; attaches frame buffer to emulator & kbd. -# XXX should be pseudo-device, with an ansicons attribute. # -define wsc # XXX should be pseudo-dev -file arch/alpha/pci/wscons.c wsc needs-flag +define wsconsdev {[console = -1]} +device wscons +attach wscons at wsconsdev +file arch/alpha/wscons/wscons.c wscons needs-flag +file arch/alpha/wscons/wscons_emul.c wscons + +file arch/alpha/wscons/event.c wscons +file arch/alpha/wscons/kbd.c wscons +file arch/alpha/wscons/ms.c wscons # @@ -61,44 +60,57 @@ file arch/alpha/pci/wscons.c wsc needs-flag include "../../../dev/tc/files.tc" -device tcasic at mainbus: tcbus +device tcasic: tcbus +attach tcasic at mainbus file arch/alpha/tc/tcasic.c tcasic -file arch/alpha/tc/tc_3000_500.c dec_3000_500 -file arch/alpha/tc/tc_3000_300.c dec_3000_300 +file arch/alpha/tc/tc_bus_io.c tcasic +file arch/alpha/tc/tc_bus_mem.c tcasic +file arch/alpha/tc/tc_3000_500.c tcasic & dec_3000_500 +file arch/alpha/tc/tc_3000_300.c tcasic & dec_3000_300 # the TurboChannel IOCTL ASIC -device ioasic at tc { offset = -1 } -file arch/alpha/tc/ioasic.c ioasic needs-flag - -# the TurboChannel clock (XXX) -# device clock at ioasic # not really optional -#file arch/alpha/alpha/clock.c clock - -# Smart Frame buffer (XXX NOT YET SUPPORTED) -device sfb at tc +device ioasic { offset = -1 } +attach ioasic at tc +file arch/alpha/tc/ioasic.c ioasic + +# Color Frame buffer +device cfb: raster, wsconsdev +attach cfb at tc +file arch/alpha/tc/cfb.c cfb + +# Smart Frame buffer +device sfb: raster, wsconsdev +attach sfb at tc file arch/alpha/tc/sfb.c sfb # 8530 UARTs -device scc at ioasic +device scc +attach scc at ioasic file arch/alpha/tc/scc.c scc needs-count # the TCDS ASIC -device tcds at tc { slot = -1 } +device tcds { slot = -1 } +attach tcds at tc file arch/alpha/tc/tcds.c tcds needs-count # 53C[F]90 SCSI -device esp at tcds: scsi +device esp: scsi +attach esp at tcds file arch/alpha/tc/esp.c esp needs-count file arch/alpha/tc/tcds_dma.c esp # Baseboard Lance ethernet. -device le at ioasic, tc: ether, ifnet -file dev/tc/if_le.c le needs-flag # for le_iomem +attach le at ioasic with le_ioasic +attach le at tc with le_tc +file dev/tc/if_le_dec.c (le_ioasic | le_tc) +file dev/tc/if_le_ioasic.c le_ioasic needs-flag #for le_iomem +file dev/tc/if_le_tc.c le_tc # # ISA Bus support # +include "../../../dev/pci/files.pci" # XXX some ISA devs are 'at pci' too. include "../../../dev/isa/files.isa" #file arch/alpha/isa/isafcns_jensen.c dec_2000_300 @@ -108,13 +120,15 @@ include "../../../dev/isa/files.isa" # ISA Bus devices # -device ibus at mainbus { } -device jcombo at ibus: isabus -device jeisa at ibus: eisabus +#device ibus at mainbus { } +#device jcombo at ibus: isabus +#device jeisa at ibus: eisabus -device pckbd at isa +device pckbd +attach pckbd at isa file arch/alpha/isa/pckbd.c pckbd needs-flag -device pms at isa +device pms +attach pms at isa file arch/alpha/isa/pms.c pms needs-flag @@ -129,23 +143,28 @@ include "../../../dev/eisa/files.eisa" # PCI Bus support # -include "../../../dev/pci/files.pci" +# include "../../../dev/pci/files.pci" XXX SEE ABOVE -device apecs at mainbus: pcibus +device apecs: pcibus +attach apecs at mainbus file arch/alpha/pci/apecs.c apecs -file arch/alpha/pci/apecs_isa.c apecs file arch/alpha/pci/apecs_pci.c apecs -device cia at mainbus: pcibus -file arch/alpha/pci/cia.c cia -file arch/alpha/pci/cia_isa.c cia -file arch/alpha/pci/cia_pci.c cia - -device lca at mainbus: pcibus +device lca: pcibus +attach lca at mainbus file arch/alpha/pci/lca.c lca -file arch/alpha/pci/lca_isa.c lca file arch/alpha/pci/lca_pci.c lca +file arch/alpha/pci/apecs_lca_bus_io.c apecs | lca +file arch/alpha/pci/apecs_lca_bus_mem.c apecs | lca + +device cia: pcibus +attach cia at mainbus +file arch/alpha/pci/cia.c cia +file arch/alpha/pci/cia_bus_io.c cia +file arch/alpha/pci/cia_bus_mem.c cia +file arch/alpha/pci/cia_pci.c cia + file arch/alpha/pci/pci_2100_a50.c dec_2100_a50 file arch/alpha/pci/pci_kn20aa.c dec_kn20aa file arch/alpha/pci/pci_axppci_33.c dec_axppci_33 @@ -157,15 +176,23 @@ file arch/alpha/pci/pci_axppci_33.c dec_axppci_33 file arch/alpha/pci/pci_machdep.c pci -device sio at pci: isabus -device pceb at pci: eisabus -file arch/alpha/pci/sio.c sio pceb needs-flag -file arch/alpha/pci/sio_pic.c sio pceb +device sio: isabus +attach sio at pci +device pceb: isabus, eisabus +attach pceb at pci +file arch/alpha/pci/sio.c sio | pceb needs-flag +file arch/alpha/pci/sio_pic.c sio | pceb -device tga at pci: rcons, wsc, ansicons +device tga: raster, wsconsdev +attach tga at pci file arch/alpha/pci/tga.c tga needs-flag +file arch/alpha/pci/tga_conf.c tga +file arch/alpha/pci/tga_bt463.c tga +file arch/alpha/pci/tga_bt485.c tga + -device pcivga at pci: wsc, ansicons +device pcivga: wsconsdev +attach pcivga at pci file arch/alpha/pci/pcivga.c pcivga needs-flag @@ -173,17 +200,19 @@ file arch/alpha/pci/pcivga.c pcivga needs-flag # Devices that can live on multiple busses # -device clock at isa, ioasic # not really optional -file arch/alpha/alpha/clock.c clock -file arch/alpha/alpha/clock_mc.c dec_3000_500 dec_2000_300 dec_3000_300 - dec_2100_a50 dec_kn20aa dec_axppci_33 - dec_21000 +device mcclock +attach mcclock at ioasic with mcclock_ioasic +attach mcclock at isa with mcclock_isa +file arch/alpha/alpha/mcclock.c mcclock +file arch/alpha/tc/mcclock_ioasic.c mcclock_ioasic +file arch/alpha/isa/mcclock_isa.c mcclock_isa # # Standard files # file arch/alpha/alpha/autoconf.c +file arch/alpha/alpha/clock.c file arch/alpha/alpha/conf.c file arch/alpha/alpha/interrupt.c file arch/alpha/alpha/machdep.c @@ -198,14 +227,14 @@ file arch/alpha/alpha/trap.c file arch/alpha/alpha/vm_machdep.c file arch/alpha/alpha/disksubr.c file dev/cons.c -file netinet/in_cksum.c # # Optional/miscellaneous files # -file netns/ns_cksum.c ns +file arch/alpha/alpha/in_cksum.c inet +file netns/ns_cksum.c ns # XXX file arch/alpha/alpha/promcons.c diff --git a/sys/arch/alpha/eisa/eisa_machdep.h b/sys/arch/alpha/eisa/eisa_machdep.h new file mode 100644 index 00000000000..0968ee61c9d --- /dev/null +++ b/sys/arch/alpha/eisa/eisa_machdep.h @@ -0,0 +1,64 @@ +/* $NetBSD: eisa_machdep.h,v 1.1 1996/04/12 05:39:51 cgd Exp $ */ + +/* + * Copyright (c) 1996 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ + +/* + * Types provided to machine-independent EISA code. + */ +typedef struct alpha_eisa_chipset *eisa_chipset_tag_t; +typedef int eisa_intr_handle_t; + +struct alpha_eisa_chipset { + void *ec_v; + + void (*ec_attach_hook) __P((struct device *, struct device *, + struct eisabus_attach_args *)); + int (*ec_maxslots) __P((void *)); + int (*ec_intr_map) __P((void *, u_int, + eisa_intr_handle_t *)); + const char *(*ec_intr_string) __P((void *, eisa_intr_handle_t)); + void *(*ec_intr_establish) __P((void *, eisa_intr_handle_t, + int, int, int (*)(void *), void *)); + void (*ec_intr_disestablish) __P((void *, void *)); +}; + +/* + * Functions provided to machine-independent EISA code. + */ +#define eisa_attach_hook(p, s, a) \ + (*(a)->eba_ec->ec_attach_hook)((p), (s), (a)) +#define eisa_maxslots(c) \ + (*(c)->ec_maxslots)((c)->ec_v) +#define eisa_intr_map(c, i, hp) \ + (*(c)->ec_intr_map)((c)->ec_v, (i), (hp)) +#define eisa_intr_string(c, h) \ + (*(c)->ec_intr_string)((c)->ec_v, (h)) +#define eisa_intr_establish(c, h, t, l, f, a) \ + (*(c)->ec_intr_establish)((c)->ec_v, (h), (t), (l), (f), (a)) +#define eisa_intr_disestablish(c, h) \ + (*(c)->ec_intr_disestablish)((c)->ec_v, (h)) diff --git a/sys/arch/alpha/include/ansi.h b/sys/arch/alpha/include/ansi.h index 7502ca628f9..77ee9bbf2bb 100644 --- a/sys/arch/alpha/include/ansi.h +++ b/sys/arch/alpha/include/ansi.h @@ -1,4 +1,4 @@ -/* $NetBSD: ansi.h,v 1.3 1995/11/23 02:35:41 cgd Exp $ */ +/* $NetBSD: ansi.h,v 1.4 1996/03/16 01:31:45 jtc Exp $ */ /*- * Copyright (c) 1990, 1993 @@ -73,6 +73,7 @@ typedef struct { * defined for ctype.h. */ #define _BSD_WCHAR_T_ int /* wchar_t */ +#define _BSD_WINT_T_ int /* wint_t */ #define _BSD_RUNE_T_ int /* rune_t */ #endif /* _ANSI_H_ */ diff --git a/sys/arch/alpha/include/asm.h b/sys/arch/alpha/include/asm.h index e76b4c586a1..8b54d605f69 100644 --- a/sys/arch/alpha/include/asm.h +++ b/sys/arch/alpha/include/asm.h @@ -1,7 +1,7 @@ -/* $NetBSD: asm.h,v 1.2 1995/11/23 02:35:45 cgd Exp $ */ +/* $NetBSD: asm.h,v 1.4 1996/04/12 01:36:51 cgd Exp $ */ /* - * Copyright (c) 1991,1990,1989,1994,1995 Carnegie Mellon University + * Copyright (c) 1991,1990,1989,1994,1995,1996 Carnegie Mellon University * All Rights Reserved. * * Permission to use, copy, modify and distribute this software and its @@ -600,6 +600,6 @@ _name_:; \ #define MF_FPCR(x) mf_fpcr x #define MT_FPCR(x) mt_fpcr x -#define JMP(loc) br zero,loc +#define JMP(loc) jmp zero,loc #define CONST(c,reg) ldiq reg, c diff --git a/sys/arch/alpha/include/autoconf.h b/sys/arch/alpha/include/autoconf.h index d4a10dd402f..78e62bc8a22 100644 --- a/sys/arch/alpha/include/autoconf.h +++ b/sys/arch/alpha/include/autoconf.h @@ -1,7 +1,7 @@ -/* $NetBSD: autoconf.h,v 1.2 1995/11/23 02:35:50 cgd Exp $ */ +/* $NetBSD: autoconf.h,v 1.2.4.2 1996/06/13 18:35:23 cgd Exp $ */ /* - * Copyright (c) 1994, 1995 Carnegie-Mellon University. + * Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -69,6 +69,17 @@ struct confargs { struct abus *ca_bus; /* bus device resides on. */ }; +struct bootdev_data { + char *protocol; + int bus; + int slot; + int channel; + char *remote_address; + int unit; + int boot_dev_type; + char *ctrl_dev_type; +}; + void set_clockintr __P((void)); void set_iointr __P((void (*)(void *, int))); int badaddr __P((void *, u_int64_t)); @@ -76,3 +87,7 @@ int badaddr __P((void *, u_int64_t)); #ifdef EVCNT_COUNTERS extern struct evcnt clock_intr_evcnt; #endif + +extern struct device *booted_device; +extern int booted_partition; +extern struct bootdev_data *bootdev_data; diff --git a/sys/arch/alpha/include/bus.h b/sys/arch/alpha/include/bus.h new file mode 100644 index 00000000000..5f3e8334261 --- /dev/null +++ b/sys/arch/alpha/include/bus.h @@ -0,0 +1,218 @@ +/* $NetBSD: bus.h,v 1.2.4.2 1996/06/13 17:44:45 cgd Exp $ */ + +/* + * Copyright (c) 1996 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ + +#ifndef _ALPHA_BUS_H_ +#define _ALPHA_BUS_H_ + +/* + * I/O addresses (in bus space) + */ +typedef u_long bus_io_addr_t; +typedef u_long bus_io_size_t; + +/* + * Memory addresses (in bus space) + */ +typedef u_long bus_mem_addr_t; +typedef u_long bus_mem_size_t; + +/* + * Access methods for bus resources, I/O space, and memory space. + */ +typedef struct alpha_bus_chipset *bus_chipset_tag_t; +typedef u_long bus_io_handle_t; +typedef u_long bus_mem_handle_t; + +struct alpha_bus_chipset { + /* I/O-space cookie */ + void *bc_i_v; + + /* I/O-space control functions */ + int (*bc_i_map) __P((void *v, bus_io_addr_t port, + bus_io_size_t size, bus_io_handle_t *iohp)); + void (*bc_i_unmap) __P((void *v, bus_io_handle_t ioh, + bus_io_size_t size)); + int (*bc_i_subregion) __P((void *v, bus_io_handle_t ioh, + bus_io_size_t offset, bus_io_size_t size, + bus_io_handle_t *nioh)); + + /* I/O-space read functions */ + u_int8_t (*bc_ir1) __P((void *v, bus_io_handle_t ioh, + bus_io_size_t off)); + u_int16_t (*bc_ir2) __P((void *v, bus_io_handle_t ioh, + bus_io_size_t off)); + u_int32_t (*bc_ir4) __P((void *v, bus_io_handle_t ioh, + bus_io_size_t off)); + u_int64_t (*bc_ir8) __P((void *v, bus_io_handle_t ioh, + bus_io_size_t off)); + + /* I/O-space read-multiple functions */ + void (*bc_irm1) __P((void *v, bus_io_handle_t ioh, + bus_io_size_t off, u_int8_t *addr, + bus_io_size_t count)); + void (*bc_irm2) __P((void *v, bus_io_handle_t ioh, + bus_io_size_t off, u_int16_t *addr, + bus_io_size_t count)); + void (*bc_irm4) __P((void *v, bus_io_handle_t ioh, + bus_io_size_t off, u_int32_t *addr, + bus_io_size_t count)); + void (*bc_irm8) __P((void *v, bus_io_handle_t ioh, + bus_io_size_t off, u_int64_t *addr, + bus_io_size_t count)); + + /* I/O-space write functions */ + void (*bc_iw1) __P((void *v, bus_io_handle_t ioh, + bus_io_size_t off, u_int8_t val)); + void (*bc_iw2) __P((void *v, bus_io_handle_t ioh, + bus_io_size_t off, u_int16_t val)); + void (*bc_iw4) __P((void *v, bus_io_handle_t ioh, + bus_io_size_t off, u_int32_t val)); + void (*bc_iw8) __P((void *v, bus_io_handle_t ioh, + bus_io_size_t off, u_int64_t val)); + + /* I/O-space write-multiple functions */ + void (*bc_iwm1) __P((void *v, bus_io_handle_t ioh, + bus_io_size_t off, const u_int8_t *addr, + bus_io_size_t count)); + void (*bc_iwm2) __P((void *v, bus_io_handle_t ioh, + bus_io_size_t off, const u_int16_t *addr, + bus_io_size_t count)); + void (*bc_iwm4) __P((void *v, bus_io_handle_t ioh, + bus_io_size_t off, const u_int32_t *addr, + bus_io_size_t count)); + void (*bc_iwm8) __P((void *v, bus_io_handle_t ioh, + bus_io_size_t off, const u_int64_t *addr, + bus_io_size_t count)); + + /* Mem-space cookie */ + void *bc_m_v; + + /* Mem-space control functions */ + int (*bc_m_map) __P((void *v, bus_mem_addr_t buspa, + bus_mem_size_t size, int cacheable, + bus_mem_handle_t *mhp)); + void (*bc_m_unmap) __P((void *v, bus_mem_handle_t mh, + bus_mem_size_t size)); + int (*bc_m_subregion) __P((void *v, bus_mem_handle_t memh, + bus_mem_size_t offset, bus_mem_size_t size, + bus_mem_handle_t *nmemh)); + + /* Mem-space read functions */ + u_int8_t (*bc_mr1) __P((void *v, bus_mem_handle_t memh, + bus_mem_size_t off)); + u_int16_t (*bc_mr2) __P((void *v, bus_mem_handle_t memh, + bus_mem_size_t off)); + u_int32_t (*bc_mr4) __P((void *v, bus_mem_handle_t memh, + bus_mem_size_t off)); + u_int64_t (*bc_mr8) __P((void *v, bus_mem_handle_t memh, + bus_mem_size_t off)); + + /* Mem-space write functions */ + void (*bc_mw1) __P((void *v, bus_mem_handle_t memh, + bus_mem_size_t off, u_int8_t val)); + void (*bc_mw2) __P((void *v, bus_mem_handle_t memh, + bus_mem_size_t off, u_int16_t val)); + void (*bc_mw4) __P((void *v, bus_mem_handle_t memh, + bus_mem_size_t off, u_int32_t val)); + void (*bc_mw8) __P((void *v, bus_mem_handle_t memh, + bus_mem_size_t off, u_int64_t val)); + + /* XXX THIS DOES NOT YET BELONG HERE */ + vm_offset_t (*bc_XXX_dmamap) __P((void *addr)); +}; + +#define __bc_CONCAT(A,B) __CONCAT(A,B) +#define __bc_ABC(A,B,C) __bc_CONCAT(A,__bc_CONCAT(B,C)) +#define __bc_ABCD(A,B,C,D) __bc_CONCAT(__bc_ABC(A,B,C),D) + +#define __bc_rd(t, h, o, sz, sp) \ + (*(t)->__bc_ABCD(bc_,sp,r,sz))((t)->__bc_ABC(bc_,sp,_v), h, o) + +#define __bc_wr(t, h, o, v, sz, sp) \ + (*(t)->__bc_ABCD(bc_,sp,w,sz))((t)->__bc_ABC(bc_,sp,_v), h, o, v) + +#define bus_io_map(t, port, size, iohp) \ + (*(t)->bc_i_map)((t)->bc_i_v, (port), (size), (iohp)) +#define bus_io_unmap(t, ioh, size) \ + (*(t)->bc_i_unmap)((t)->bc_i_v, (ioh), (size)) +#define bus_io_subregion(t, ioh, offset, size, nioh) \ + (*(t)->bc_i_unmap)((t)->bc_i_v, (ioh), (offset), (size), (nioh)) + +#define __bc_io_multi(t, h, o, a, s, dir, sz) \ + (*(t)->__bc_ABCD(bc_i,dir,m,sz))((t)->bc_i_v, h, o, a, s) + +#define bus_io_read_1(t, h, o) __bc_rd((t),(h),(o),1,i) +#define bus_io_read_2(t, h, o) __bc_rd((t),(h),(o),2,i) +#define bus_io_read_4(t, h, o) __bc_rd((t),(h),(o),4,i) +#define bus_io_read_8(t, h, o) __bc_rd((t),(h),(o),8,i) + +#define bus_io_read_multi_1(t, h, o, a, s) \ + __bc_io_multi((t),(h),(o),(a),(s),r,1) +#define bus_io_read_multi_2(t, h, o, a, s) \ + __bc_io_multi((t),(h),(o),(a),(s),r,2) +#define bus_io_read_multi_4(t, h, o, a, s) \ + __bc_io_multi((t),(h),(o),(a),(s),r,4) +#define bus_io_read_multi_8(t, h, o, a, s) \ + __bc_io_multi((t),(h),(o),(a),(s),r,8) + +#define bus_io_write_1(t, h, o, v) __bc_wr((t),(h),(o),(v),1,i) +#define bus_io_write_2(t, h, o, v) __bc_wr((t),(h),(o),(v),2,i) +#define bus_io_write_4(t, h, o, v) __bc_wr((t),(h),(o),(v),4,i) +#define bus_io_write_8(t, h, o, v) __bc_wr((t),(h),(o),(v),8,i) + +#define bus_io_write_multi_1(t, h, o, a, s) \ + __bc_io_multi((t),(h),(o),(a),(s),w,1) +#define bus_io_write_multi_2(t, h, o, a, s) \ + __bc_io_multi((t),(h),(o),(a),(s),w,2) +#define bus_io_write_multi_4(t, h, o, a, s) \ + __bc_io_multi((t),(h),(o),(a),(s),w,4) +#define bus_io_write_multi_8(t, h, o, a, s) \ + __bc_io_multi((t),(h),(o),(a),(s),w,8) + +#define bus_mem_map(t, bpa, size, cacheable, mhp) \ + (*(t)->bc_m_map)((t)->bc_m_v, (bpa), (size), (cacheable), (mhp)) +#define bus_mem_unmap(t, memh, size) \ + (*(t)->bc_m_unmap)((t)->bc_m_v, (memh), (size)) +#define bus_mem_subregion(t, memh, offset, size, nmemh) \ + (*(t)->bc_m_unmap)((t)->bc_i_v, (memh), (offset), (size), (nmemh)) + +#define bus_mem_read_1(t, h, o) __bc_rd((t),(h),(o),1,m) +#define bus_mem_read_2(t, h, o) __bc_rd((t),(h),(o),2,m) +#define bus_mem_read_4(t, h, o) __bc_rd((t),(h),(o),4,m) +#define bus_mem_read_8(t, h, o) __bc_rd((t),(h),(o),8,m) + +#define bus_mem_write_1(t, h, o, v) __bc_wr((t),(h),(o),(v),1,m) +#define bus_mem_write_2(t, h, o, v) __bc_wr((t),(h),(o),(v),2,m) +#define bus_mem_write_4(t, h, o, v) __bc_wr((t),(h),(o),(v),4,m) +#define bus_mem_write_8(t, h, o, v) __bc_wr((t),(h),(o),(v),8,m) + +/* XXX THIS DOES NOT BELONG HERE YET. */ +#define __alpha_bus_XXX_dmamap(t, va) (*(t)->bc_XXX_dmamap)((va)) + +#endif /* _ALPHA_BUS_H_ */ diff --git a/sys/arch/alpha/include/cdefs.h b/sys/arch/alpha/include/cdefs.h index d848e59f663..cd705e0db7d 100644 --- a/sys/arch/alpha/include/cdefs.h +++ b/sys/arch/alpha/include/cdefs.h @@ -32,9 +32,7 @@ #define _C_LABEL(x) _STRING(x) -#ifndef lint -#define __indr_reference(sym,msg) /* nothing */ -#endif +#define __indr_references(sym,msg) /* nothing */ #define __warn_references(sym,msg) /* nothing */ #endif /* !_MACHINE_CDEFS_H_ */ diff --git a/sys/arch/alpha/include/cfbreg.h b/sys/arch/alpha/include/cfbreg.h new file mode 100644 index 00000000000..3d5c21fb98d --- /dev/null +++ b/sys/arch/alpha/include/cfbreg.h @@ -0,0 +1,59 @@ +/* $NetBSD: cfbreg.h,v 1.1 1996/05/01 23:25:00 cgd Exp $ */ + +/* + * Copyright (c) 1996 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ + +/* + * Color Frame Buffer definitions, from: + * ``PMAG-BA TURBOchannel Color Frame Buffer Functional Specification + * (Revision 1.2)'', availalable via anonymous FTP from gatekeeper.dec.com. + * + * All definitions are in "dense" TurboChannel space. + */ + +/* + * Size of the CFB address space. + */ +#define CFB_SIZE 0x400000 + +/* + * Offsets into slot space of each functional unit. + */ +#define CFB_FB_OFFSET 0x000000 /* Frame buffer */ +#define CFB_FB_SIZE 0x100000 +#define CFB_RAMDAC_OFFSET 0x200000 /* Bt495 RAMDAC Registers */ +#define CFB_RAMDAC_SIZE 0x100000 +#define CFB_IREQCTRL_OFFSET 0x300000 /* IReq Control region */ +#define CFB_IREQCTRL_SIZE 0x080000 + +/* + * Bt459 RAMDAC registers (offsets from CFB_RAMDAC_OFFSET) + */ +#define CFB_RAMDAC_ADDRLOW 0x0000 /* Address register low byte */ +#define CFB_RAMDAC_ADDRHIGH 0x0004 /* Address register high byte */ +#define CFB_RAMDAC_REGDATA 0x0008 /* Register addressed by addr reg */ +#define CFB_RAMDAC_CMAPDATA 0x000c /* Colormap loc addressed by addr reg */ diff --git a/sys/arch/alpha/include/coff.h b/sys/arch/alpha/include/coff.h deleted file mode 100644 index 7516cb7e72a..00000000000 --- a/sys/arch/alpha/include/coff.h +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Mach Operating System - * Copyright (c) 1992,1993,1994,1995 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - */ -/* - * HISTORY - * Revision 1.1 1994/06/30 16:29:52 bostic - * coff.h - * - * Revision 2.3 93/01/19 08:59:12 danner - * Fix TXTOFF to cope with assembler/linker incoherence viz - * rounding in OMAGIC files. - * [93/01/15 af] - * - * Revision 2.2 93/01/14 17:12:13 danner - * Adapted for Alpha. - * [92/05/31 af] - * - */ -/* - * File: coff.h - * Author: Alessandro Forin, Carnegie Mellon University - * Date: 10/89 - * - * Structure definitions for COFF headers - */ - -struct filehdr { - unsigned short f_magic; /* magic number */ - unsigned short f_nscns; /* number of sections */ - int f_timdat; /* time & date stamp */ - vm_offset_t f_symptr; /* file pointer to symtab */ - int f_nsyms; /* number of symtab entries */ - unsigned short f_opthdr; /* sizeof(optional hdr) */ - unsigned short f_flags; /* flags */ -}; - -#define F_EXEC 0000002 - -#define ALPHAMAGIC 0603 - -struct scnhdr { - char s_name[8]; /* section name */ - vm_offset_t s_paddr; /* physical address */ - vm_offset_t s_vaddr; /* virtual address */ - vm_offset_t s_size; /* section size */ - vm_offset_t s_scnptr; /* file ptr to raw data for section */ - vm_offset_t s_relptr; /* file ptr to relocation */ - vm_offset_t s_lnnoptr; /* file ptr to line numbers */ - unsigned short s_nreloc; /* number of relocation entries */ - unsigned short s_nlnno; /* number of line number entries */ - int s_flags; /* flags */ -}; - -struct aouthdr { - short magic; /* see magic.h */ - short vstamp; /* version stamp */ - int pad; /* help for cross compilers */ - vm_offset_t tsize; /* text size in bytes, padded to FW */ - vm_offset_t dsize; /* initialized data size */ - vm_offset_t bsize; /* uninitialized data size */ - vm_offset_t entry; /* entry point, value of "start" */ - vm_offset_t text_start; /* base of text used for this file */ - vm_offset_t data_start; /* base of data used for this file */ - vm_offset_t bss_start; /* base of bss used for this file */ - int gprmask; /* general purpose register mask*/ - int fprmask; /* FPA register mask */ - vm_offset_t gp_value; /* the gp value used for this object*/ -}; - -struct exechdr { - struct filehdr f; - struct aouthdr a; -}; - -/* Linker and assembler screwed: .o are not aligned, images are */ -#define SCNROUND ((long)16) - -#define N_COFFBADMAG(a) \ - ((a).magic != OMAGIC && (a).magic != NMAGIC && (a).magic != ZMAGIC) - -#define N_COFFTXTOFF(f, a) \ - (((a).magic == ZMAGIC) ? 0 : \ - (((f).f_flags & F_EXEC) ? \ - (((sizeof(struct filehdr) + sizeof(struct aouthdr) + \ - (f).f_nscns * sizeof(struct scnhdr)) + SCNROUND-1) & ~(SCNROUND-1)) \ - : (sizeof(struct filehdr) + sizeof(struct aouthdr) + \ - (f).f_nscns * sizeof(struct scnhdr)))) diff --git a/sys/arch/alpha/include/cpu.h b/sys/arch/alpha/include/cpu.h index 27ad8c4606c..9c7281cb7f2 100644 --- a/sys/arch/alpha/include/cpu.h +++ b/sys/arch/alpha/include/cpu.h @@ -1,4 +1,4 @@ -/* $NetBSD: cpu.h,v 1.7 1995/12/21 05:01:32 mycroft Exp $ */ +/* $NetBSD: cpu.h,v 1.7.4.1 1996/06/14 20:42:44 cgd Exp $ */ /* * Copyright (c) 1988 University of Utah. @@ -115,11 +115,13 @@ extern u_int64_t ssir; * CTL_MACHDEP definitions. */ #define CPU_CONSDEV 1 /* dev_t: console terminal device */ -#define CPU_MAXID 2 /* number of valid machdep ids */ +#define CPU_ROOT_DEVICE 2 /* string: root device name */ +#define CPU_MAXID 3 /* number of valid machdep ids */ #define CTL_MACHDEP_NAMES { \ { 0, 0 }, \ { "console_device", CTLTYPE_STRUCT }, \ + { "root_device", CTLTYPE_STRING }, \ } #endif /* _ALPHA_CPU_H_ */ diff --git a/sys/arch/alpha/include/ecoff.h b/sys/arch/alpha/include/ecoff.h index 08427556592..b40c2242f2f 100644 --- a/sys/arch/alpha/include/ecoff.h +++ b/sys/arch/alpha/include/ecoff.h @@ -1,4 +1,4 @@ -/* $NetBSD: ecoff.h,v 1.2 1995/11/23 02:35:57 cgd Exp $ */ +/* $NetBSD: ecoff.h,v 1.3 1996/05/09 23:47:25 cgd Exp $ */ /* * Copyright (c) 1994 Adam Glass @@ -34,47 +34,49 @@ #define ECOFF_LDPGSZ 4096 #define ECOFF_PAD \ - u_short ea_bldrev; /* XXX */ + u_short bldrev; /* XXX */ #define ECOFF_MACHDEP \ - u_int ea_gprmask; \ - u_int ea_fprmask; \ - u_long ea_gp_value + u_int gprmask; \ + u_int fprmask; \ + u_long gp_value #define ECOFF_MAGIC_ALPHA 0603 -#define ECOFF_MAGIC_NATIVE_ALPHA 0605 -#define ECOFF_BADMAG(ex) \ - (ex->ef_magic != ECOFF_MAGIC_ALPHA && \ - ex->ef_magic != ECOFF_MAGIC_NATIVE_ALPHA) +#define ECOFF_MAGIC_NETBSD_ALPHA 0605 +#define ECOFF_BADMAG(ep) \ + ((ep)->f.f_magic != ECOFF_MAGIC_ALPHA && \ + (ep)->f.f_magic != ECOFF_MAGIC_NETBSD_ALPHA) -#define ECOFF_SEGMENT_ALIGNMENT(eap) (eap->ea_vstamp < 23 ? 8 : 16) +#define ECOFF_FLAG_EXEC 0002 +#define ECOFF_SEGMENT_ALIGNMENT(ep) \ + (((ep)->f.f_flags & ECOFF_FLAG_EXEC) == 0 ? 8 : 16) struct ecoff_symhdr { - int16_t sh_magic; - int16_t sh_vstamp; - int32_t sh_linemax; - int32_t sh_densenummax; - int32_t sh_procmax; - int32_t sh_lsymmax; - int32_t sh_optsymmax; - int32_t sh_auxxymmax; - int32_t sh_lstrmax; - int32_t sh_estrmax; - int32_t sh_fdmax; - int32_t sh_rfdmax; - int32_t sh_esymmax; - long sh_linesize; - long sh_lineoff; - long sh_densenumoff; - long sh_procoff; - long sh_lsymoff; - long sh_optsymoff; - long sh_auxsymoff; - long sh_lstroff; - long sh_estroff; - long sh_fdoff; - long sh_rfdoff; - long sh_esymoff; + int16_t magic; + int16_t vstamp; + int32_t lineMax; + int32_t densenumMax; + int32_t procMax; + int32_t lsymMax; + int32_t optsymMax; + int32_t auxsymMax; + int32_t lstrMax; + int32_t estrMax; + int32_t fdMax; + int32_t rfdMax; + int32_t esymMax; + long linesize; + long cbLineOffset; + long cbDnOffset; + long cbPdOffset; + long cbSymOffset; + long cbOptOffset; + long cbAuxOffset; + long cbSsOffset; + long cbSsExtOffset; + long cbFdOffset; + long cbRfdOffset; + long cbExtOffset; }; struct ecoff_extsym { diff --git a/sys/arch/alpha/include/eisa_machdep.h b/sys/arch/alpha/include/eisa_machdep.h deleted file mode 100644 index e69de29bb2d..00000000000 --- a/sys/arch/alpha/include/eisa_machdep.h +++ /dev/null diff --git a/sys/arch/alpha/include/fbio.h b/sys/arch/alpha/include/fbio.h new file mode 100644 index 00000000000..dd03eac5793 --- /dev/null +++ b/sys/arch/alpha/include/fbio.h @@ -0,0 +1,173 @@ +/* $NetBSD: fbio.h,v 1.2 1996/05/01 19:44:21 cgd Exp $ */ + +/* + * Copyright (c) 1992 Regents of the University of California. + * All rights reserved. + * + * This code is derived from software developed by the Computer Systems + * Engineering group at Lawrence Berkeley Laboratory under DARPA + * contract BG 91-66 and contributed to Berkeley. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)fbio.h 7.2 (Berkeley) 4/1/92 + */ + +/* + * Frame buffer ioctls (from Sprite, trimmed to essentials for X11). + */ + +/* + * Frame buffer type codes. + */ +#define FBTYPE_PM_MONO 0 /* never on the alpha */ +#define FBTYPE_PM_COLOR 1 /* never on the alpha */ +#define FBTYPE_CFB 2 /* CFB (TurboChannel) */ +#define FBTYPE_XCFB 3 /* ??? (TurboChannel) */ +#define FBTYPE_MFB 4 /* MFB (TurboChannel) */ +#define FBTYPE_SFB 5 /* SFB (TurboChannel) */ +#define FBTYPE_VGA 6 /* ISA or EISA VGA */ +#define FBTYPE_PCIVGA 7 /* PCI VGA */ +#define FBTYPE_TGA 8 /* TGA (PCI) */ +#define FBTYPE_SFBP 9 /* SFB+ (TurboChannel) */ + +#define FBTYPE_LASTPLUSONE 10 + +/* + * Frame buffer descriptor as returned by FBIOGTYPE. + */ +struct fbtype { + int fb_type; /* as defined above */ + int fb_height; /* in pixels */ + int fb_width; /* in pixels */ + int fb_depth; /* bits per pixel */ + int fb_cmsize; /* size of color map (entries) */ + int fb_size; /* total size in bytes */ +}; +#define FBIOGTYPE _IOR('F', 0, struct fbtype) + +#ifdef notdef +/* + * General purpose structure for passing info in and out of frame buffers + * (used for gp1) -- unsupported. + */ +struct fbinfo { + int fb_physaddr; /* physical frame buffer address */ + int fb_hwwidth; /* fb board width */ + int fb_hwheight; /* fb board height */ + int fb_addrdelta; /* phys addr diff between boards */ + u_char *fb_ropaddr; /* fb virtual addr */ + int fb_unit; /* minor devnum of fb */ +}; +#define FBIOGINFO _IOR('F', 2, struct fbinfo) +#endif + +/* + * Color map I/O. + */ +struct fbcmap { + int index; /* first element (0 origin) */ + int count; /* number of elements */ + u_char *red; /* red color map elements */ + u_char *green; /* green color map elements */ + u_char *blue; /* blue color map elements */ +}; +#define FBIOPUTCMAP _IOW('F', 3, struct fbcmap) +#define FBIOGETCMAP _IOW('F', 4, struct fbcmap) + +/* + * Set/get attributes. + */ +#define FB_ATTR_NDEVSPECIFIC 8 /* no. of device specific values */ +#define FB_ATTR_NEMUTYPES 4 /* no. of emulation types */ + +struct fbsattr { + int flags; /* flags; see below */ + int emu_type; /* emulation type (-1 if unused) */ + int dev_specific[FB_ATTR_NDEVSPECIFIC]; /* catchall */ +}; +#define FB_ATTR_AUTOINIT 1 /* emulation auto init flag */ +#define FB_ATTR_DEVSPECIFIC 2 /* dev. specific stuff valid flag */ + +struct fbgattr { + int real_type; /* real device type */ + int owner; /* PID of owner, 0 if myself */ + struct fbtype fbtype; /* fbtype info for real device */ + struct fbsattr sattr; /* see above */ + int emu_types[FB_ATTR_NEMUTYPES]; /* possible emulations */ + /* (-1 if unused) */ +}; +/* FBIOSATTR _IOW('F', 5, struct fbsattr) -- unsupported */ +#define FBIOGATTR _IOR('F', 6, struct fbgattr) + +/* + * Video control. + */ +#define FBVIDEO_OFF 0 +#define FBVIDEO_ON 1 + +#define FBIOSVIDEO _IOW('F', 7, int) +#define FBIOGVIDEO _IOR('F', 8, int) + +/* + * hardware cursor control + */ +struct fbcurpos { + short x; + short y; +}; + +#define FB_CUR_SETCUR 0x01 +#define FB_CUR_SETPOS 0x02 +#define FB_CUR_SETHOT 0x04 +#define FB_CUR_SETCMAP 0x08 +#define FB_CUR_SETSHAPE 0x10 +#define FB_CUR_SETALL 0x1F + +struct fbcursor { + short set; /* what to set */ + short enable; /* enable/disable cursor */ + struct fbcurpos pos; /* cursor's position */ + struct fbcurpos hot; /* cursor's hot spot */ + struct fbcmap cmap; /* color map info */ + struct fbcurpos size; /* cursor's bit map size */ + char *image; /* cursor's image bits */ + char *mask; /* cursor's mask bits */ +}; + +/* set/get cursor attributes/shape */ +#define FBIOSCURSOR _IOW('F', 24, struct fbcursor) +#define FBIOGCURSOR _IOWR('F', 25, struct fbcursor) + +/* set/get cursor position */ +#define FBIOSCURPOS _IOW('F', 26, struct fbcurpos) +#define FBIOGCURPOS _IOW('F', 27, struct fbcurpos) + +/* get max cursor size */ +#define FBIOGCURMAX _IOR('F', 28, struct fbcurpos) diff --git a/sys/arch/alpha/include/intr.h b/sys/arch/alpha/include/intr.h new file mode 100644 index 00000000000..8baab0eb85a --- /dev/null +++ b/sys/arch/alpha/include/intr.h @@ -0,0 +1,40 @@ +/* $NetBSD: intr.h,v 1.1 1996/04/12 01:42:17 cgd Exp $ */ + +/* + * Copyright (c) 1996 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ + +#define IPL_NONE 0 /* disable only this interrupt */ +#define IPL_BIO 1 /* disable block I/O interrupts */ +#define IPL_NET 2 /* disable network interrupts */ +#define IPL_TTY 3 /* disable terminal interrupts */ +#define IPL_CLOCK 4 /* disable clock interrupts */ +#define IPL_HIGH 5 /* disable all interrupts */ + +#define IST_NONE 0 /* none (dummy) */ +#define IST_PULSE 1 /* pulsed */ +#define IST_EDGE 2 /* edge-triggered */ +#define IST_LEVEL 3 /* level-triggered */ diff --git a/sys/arch/alpha/include/intrcnt.h b/sys/arch/alpha/include/intrcnt.h index abf39d0fc9c..046db247e30 100644 --- a/sys/arch/alpha/include/intrcnt.h +++ b/sys/arch/alpha/include/intrcnt.h @@ -1,4 +1,31 @@ +/* $NetBSD: intrcnt.h,v 1.4.4.2 1996/06/05 03:42:24 cgd Exp $ */ +/* + * Copyright (c) 1995, 1996 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ #define INTRNAMES_DEFINITION \ /* 0x00 */ ASCIZ "clock"; \ @@ -49,20 +76,49 @@ ASCIZ "kn20aa irq 28"; \ ASCIZ "kn20aa irq 29"; \ ASCIZ "kn20aa irq 30"; \ -/* 0x30 */ ASCIZ "kn20aa irq 31"; +/* 0x30 */ ASCIZ "kn20aa irq 31"; \ + ASCIZ "kn15 tc slot 0"; \ + ASCIZ "kn15 tc slot 1"; \ + ASCIZ "kn15 tc slot 2"; \ + ASCIZ "kn15 tc slot 3"; \ + ASCIZ "kn15 tc slot 4"; \ + ASCIZ "kn15 tc slot 5"; \ + ASCIZ "kn15 tcds"; \ + ASCIZ "kn15 ioasic"; \ + ASCIZ "kn15 sfb"; \ + ASCIZ "kn16 tc slot 0"; \ + ASCIZ "kn16 tc slot 1"; \ + ASCIZ "kn16 tcds"; \ + ASCIZ "kn16 ioasic"; \ + ASCIZ "kn16 sfb"; \ + ASCIZ "tcds esp 0"; \ +/* 0x40 */ ASCIZ "tcds esp 1"; \ + ASCIZ "ioasic le"; \ + ASCIZ "ioasic scc 0"; \ + ASCIZ "ioasic scc 1"; \ + ASCIZ "ioasic am79c30"; #define INTRCNT_DEFINITION \ /* 0x00 */ .quad 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0; \ /* 0x10 */ .quad 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0; \ /* 0x20 */ .quad 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0; \ -/* 0x30 */ .quad 0; +/* 0x30 */ .quad 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0; \ +/* 0x40 */ .quad 0, 0, 0, 0, 0; #define INTRCNT_CLOCK 0 -#define INTRCNT_ISA_IRQ (INTRCNT_CLOCK + 1) +#define INTRCNT_ISA_IRQ (INTRCNT_CLOCK + 1) #define INTRCNT_ISA_IRQ_LEN 16 -#define INTRCNT_KN20AA_IRQ (INTRCNT_ISA_IRQ + INTRCNT_ISA_IRQ_LEN) -#define INTRCNT_KN20AA_IRQ_LEN 32 +#define INTRCNT_KN20AA_IRQ (INTRCNT_ISA_IRQ + INTRCNT_ISA_IRQ_LEN) +#define INTRCNT_KN20AA_IRQ_LEN 32 +#define INTRCNT_KN15 (INTRCNT_KN20AA_IRQ + INTRCNT_KN20AA_IRQ_LEN) +#define INTRCNT_KN15_LEN 9 +#define INTRCNT_KN16 (INTRCNT_KN15 + INTRCNT_KN15_LEN) +#define INTRCNT_KN16_LEN 5 +#define INTRCNT_TCDS (INTRCNT_KN16 + INTRCNT_KN16_LEN) +#define INTRCNT_TCDS_LEN 2 +#define INTRCNT_IOASIC (INTRCNT_TCDS + INTRCNT_TCDS_LEN) +#define INTRCNT_IOASIC_LEN 4 -#ifndef LOCORE -extern long intrcnt[]; +#ifndef _LOCORE +extern volatile long intrcnt[]; #endif diff --git a/sys/arch/alpha/include/kbio.h b/sys/arch/alpha/include/kbio.h new file mode 100644 index 00000000000..f785fdce2e3 --- /dev/null +++ b/sys/arch/alpha/include/kbio.h @@ -0,0 +1,117 @@ +/* $NetBSD: kbio.h,v 1.1 1996/04/12 01:45:45 cgd Exp $ */ + +/* + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This software was developed by the Computer Systems Engineering group + * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and + * contributed to Berkeley. + * + * All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Lawrence Berkeley Laboratory. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)kbio.h 8.1 (Berkeley) 6/11/93 + */ + +#if 0 /* XXX */ +/* + * The following is a minimal emulation of Sun's `kio' structures + * and related operations necessary to make X11 happy (i.e., make it + * compile, and make old X11 binaries run). + */ + +/* + * The kiockey structure apparently gets and/or sets keyboard mappings. + * It seems to be kind of useless, but X11 uses it (according to the + * comments) to figure out when a Sun 386i has a type-4 keyboard but + * claims to have a type-3 keyboard. We need just enough to cause the + * appropriate ioctl to return the appropriate magic value. + * + * KIOCGETKEY fills in kio_entry from kio_station. Not sure what tablemask + * is for; X sets it before the call, so it is not an output, but we do not + * care anyway. KIOCSDIRECT is supposed to tell the kernel whether to send + * keys to the console or to X; we just send them to X whenever the keyboard + * is open at all. (XXX may need to change this later) + * + * Keyboard commands and types are defined in kbd.h as they are actually + * real hardware commands and type numbers. + */ +struct okiockey { /* Out-dated key translation structure */ + int kio_tablemask; /* whatever */ + u_char kio_station; /* key number */ + u_char kio_entry; /* HOLE if not present */ + char kio_text[10]; /* the silly escape sequences (unsupported) */ +}; + +struct kiockey { + int kio_tablemask; /* whatever */ + u_char kio_station; /* key number */ + u_short kio_entry; /* HOLE if not present */ + char kio_text[10]; /* the silly escape sequences (unsupported) */ +}; + +/* + * Values for kio_tablemask. These determine which table to read/modify + * in KIOC[SG]KEY ioctls. Currently, we only have "non-shift" and "shift" + * tables. + */ +#define KIOC_NOMASK 0x0 +#define KIOC_CAPSMASK 0x1 +#define KIOC_SHIFTMASK 0xe +#define KIOC_CTRLMASK 0x30 +#define KIOC_ALTGMASK 0x200 +#define KIOC_NUMLMASK 0x800 + +#define HOLE 0x302 /* value for kio_entry to say `really type 3' */ + +#define KIOCTRANS _IOW('k', 0, int) /* set translation mode */ + /* (we only accept TR_UNTRANS_EVENT) */ +#define KIOCGETKEY _IOWR('k', 2, struct okiockey) /* fill in kio_entry */ +#define KIOCGTRANS _IOR('k', 5, int) /* get translation mode */ +#define KIOCCMD _IOW('k', 8, int) /* X uses this to ring bell */ +#define KIOCTYPE _IOR('k', 9, int) /* get keyboard type */ +#endif /* 0 XXX */ +#define KIOCSDIRECT _IOW('k', 10, int) /* keys to console? */ +#if 0 /* XXX */ +#define KIOCSKEY _IOW('k', 12, struct kiockey) /* set xlat mode */ +#define KIOCGKEY _IOWR('k', 13, struct kiockey) /* get xlat mode */ +#define KIOCLAYOUT _IOR('k', 20, int) /* get keyboard layout */ +#define KIOCSLED _IOW('k', 14, char) /* set LED state */ +#define KIOCGLED _IOR('k', 15, char) /* get LED state */ + +#define TR_NONE 0 /* X compat, unsupported */ +#define TR_ASCII 1 /* X compat, unsupported */ +#define TR_EVENT 2 /* X compat, unsupported */ +#define TR_UNTRANS_EVENT 3 +#endif /* 0 XXX */ diff --git a/sys/arch/alpha/include/limits.h b/sys/arch/alpha/include/limits.h index 7fb490baef2..16cd93da86b 100644 --- a/sys/arch/alpha/include/limits.h +++ b/sys/arch/alpha/include/limits.h @@ -1,4 +1,4 @@ -/* $NetBSD: limits.h,v 1.1 1995/02/13 23:07:41 cgd Exp $ */ +/* $NetBSD: limits.h,v 1.2 1996/04/12 01:38:25 cgd Exp $ */ /* * Copyright (c) 1988, 1993 @@ -48,37 +48,48 @@ * These numbers work for pcc as well. The UINT_MAX and ULONG_MAX values * are written as hex so that GCC will be quiet about large integer constants. */ -#define SCHAR_MAX 127 /* min value for a signed char */ -#define SCHAR_MIN (-128) /* max value for a signed char */ +#define SCHAR_MAX 0x7f /* max value for a signed char */ +#define SCHAR_MIN (-0x7f-1) /* min value for a signed char */ -#define UCHAR_MAX 255 /* max value for an unsigned char */ -#define CHAR_MAX 127 /* max value for a char */ -#define CHAR_MIN (-128) /* min value for a char */ +#define UCHAR_MAX 0xffU /* max value for an unsigned char */ +#define CHAR_MAX 0x7f /* max value for a char */ +#define CHAR_MIN (-0x7f-1) /* min value for a char */ -#define USHRT_MAX 65535 /* max value for an unsigned short */ -#define SHRT_MAX 32767 /* max value for a short */ -#define SHRT_MIN (-32768) /* min value for a short */ +#define USHRT_MAX 0xffffU /* max value for an unsigned short */ +#define SHRT_MAX 0x7fff /* max value for a short */ +#define SHRT_MIN (-0x7fff-1) /* min value for a short */ -#define UINT_MAX 0xffffffff /* max value for an unsigned int */ -#define INT_MAX 2147483647 /* max value for an int */ -#define INT_MIN (-2147483647-1) /* min value for an int */ +#define UINT_MAX 0xffffffffU /* max value for an unsigned int */ +#define INT_MAX 0x7fffffff /* max value for an int */ +#define INT_MIN (-0x7fffffff-1) /* min value for an int */ -#define ULONG_MAX 0xffffffffffffffff /* max value for an unsigned long */ - /* max value for a long */ -#define LONG_MAX 0x7fffffffffffffff -#define LONG_MIN (-LONG_MAX-1) /* min value for a long */ +#define ULONG_MAX 0xffffffffffffffffUL /* max for an unsigned long */ +#define LONG_MAX 0x7fffffffffffffffL /* max for a long */ +#define LONG_MIN (-0x7fffffffffffffffL-1) /* min for a long */ #if !defined(_ANSI_SOURCE) -#define SSIZE_MAX INT_MAX /* max value for a ssize_t */ +#define SSIZE_MAX LONG_MAX /* max value for a ssize_t */ -#if !defined(_POSIX_SOURCE) -#define SIZE_T_MAX UINT_MAX /* max value for a size_t */ +#if !defined(_POSIX_SOURCE) && !defined(_XOPEN_SOURCE) +#define SIZE_T_MAX ULONG_MAX /* max value for a size_t */ -/* GCC requires that quad constants be written as expressions. */ -#define UQUAD_MAX ((u_quad_t)0-1) /* max value for a uquad_t */ - /* max value for a quad_t */ -#define QUAD_MAX ((quad_t)(UQUAD_MAX >> 1)) -#define QUAD_MIN (-QUAD_MAX-1) /* min value for a quad_t */ +/* Quads and longs are the same on the alpha */ +#define UQUAD_MAX (ULONG_MAX) /* max value for a uquad_t */ +#define QUAD_MAX (LONG_MAX) /* max value for a quad_t */ +#define QUAD_MIN (LONG_MIN) /* min value for a quad_t */ -#endif /* !_POSIX_SOURCE */ +#endif /* !_POSIX_SOURCE && !_XOPEN_SOURCE */ #endif /* !_ANSI_SOURCE */ + +#if (!defined(_ANSI_SOURCE)&&!defined(_POSIX_SOURCE)) || defined(_XOPEN_SOURCE) +#define LONG_BIT 64 +#define WORD_BIT 32 + +#define DBL_DIG 15 +#define DBL_MAX 1.7976931348623157E+308 +#define DBL_MIN 2.2250738585072014E-308 + +#define FLT_DIG 6 +#define FLT_MAX 3.40282347E+38F +#define FLT_MIN 1.17549435E-38F +#endif diff --git a/sys/arch/alpha/include/param.h b/sys/arch/alpha/include/param.h index ed6528e6cd3..73c09a51f81 100644 --- a/sys/arch/alpha/include/param.h +++ b/sys/arch/alpha/include/param.h @@ -1,4 +1,4 @@ -/* $NetBSD: param.h,v 1.10 1995/12/20 00:08:43 cgd Exp $ */ +/* $NetBSD: param.h,v 1.12 1996/03/04 05:04:10 cgd Exp $ */ /* * Copyright (c) 1988 University of Utah. @@ -45,7 +45,9 @@ /* * Machine dependent constants for the Alpha. */ +#define _MACHINE alpha #define MACHINE "alpha" +#define _MACHINE_ARCH alpha #define MACHINE_ARCH "alpha" #define MID_MACHINE MID_ALPHA @@ -157,7 +159,7 @@ #define splhigh() pal_swpipl(PSL_IPL_HIGH) #ifdef _KERNEL -#ifndef LOCORE +#ifndef _LOCORE /* This was calibrated empirically */ extern u_int64_t cycles_per_usec; diff --git a/sys/arch/alpha/include/prom.h b/sys/arch/alpha/include/prom.h index 66cda050fc4..26a70c0d82d 100644 --- a/sys/arch/alpha/include/prom.h +++ b/sys/arch/alpha/include/prom.h @@ -1,4 +1,4 @@ -/* $NetBSD: prom.h,v 1.1 1995/02/13 23:07:48 cgd Exp $ */ +/* $NetBSD: prom.h,v 1.2 1996/04/23 15:23:18 cgd Exp $ */ /* * Copyright (c) 1994, 1995 Carnegie-Mellon University. @@ -52,6 +52,7 @@ int prom_open __P((char *, int)); void putchar __P((int)); #endif +void prom_halt __P((int)) __attribute__((__noreturn__)); int prom_getenv __P((int, char *, int)); #endif diff --git a/sys/arch/alpha/include/psl.h b/sys/arch/alpha/include/psl.h index e14260c2bf6..f430f51ec2e 100644 --- a/sys/arch/alpha/include/psl.h +++ b/sys/arch/alpha/include/psl.h @@ -1,4 +1,4 @@ -/* $NetBSD: psl.h,v 1.4 1995/11/23 02:36:33 cgd Exp $ */ +/* $NetBSD: psl.h,v 1.5 1996/04/23 15:24:09 cgd Exp $ */ /* * Copyright (c) 1994, 1995 Carnegie-Mellon University. @@ -75,8 +75,8 @@ */ /* Flush all write buffers */ -static __inline int wbflush() { __asm __volatile("mb"); } /* XXX? wmb */ - +static __inline int wbflush() \ + { __asm __volatile("mb" : : : "memory"); } /* XXX? wmb */ #define IMB() pal_imb() /* Sync instruction cache w/data */ void alpha_mb __P((void)); /* Flush all write buffers */ @@ -84,6 +84,7 @@ void pal_imb __P((void)); /* Sync instruction cache */ u_int64_t pal_swpipl __P((u_int64_t)); /* write new IPL, return old */ u_int64_t profile_swpipl __P((u_int64_t)); /* pal_swpipl w/o profiling */ void pal_tbi __P((u_int64_t, void *)); /* Invalidate TLB entries */ +void pal_halt __P((void)) __attribute__((__noreturn__)); /* halt/reboot */ #endif /* _KERNEL */ #endif /* !__ALPHA_PSL_H__ */ diff --git a/sys/arch/alpha/include/pte.h b/sys/arch/alpha/include/pte.h index 95b3a84c06c..bdec6d7e8a2 100644 --- a/sys/arch/alpha/include/pte.h +++ b/sys/arch/alpha/include/pte.h @@ -1,4 +1,4 @@ -/* $NetBSD: pte.h,v 1.3 1995/11/23 02:36:37 cgd Exp $ */ +/* $NetBSD: pte.h,v 1.4 1996/02/01 22:28:56 mycroft Exp $ */ /* * Copyright (c) 1994, 1995 Carnegie-Mellon University. @@ -66,7 +66,7 @@ typedef u_int64_t pt_entry_t; #define K0SEG_END 0xfffffe0000000000 #define PHYS_UNCACHED 0x0000000040000000 -#if !defined(LOCORE) +#ifndef _LOCORE #define k0segtophys(x) ((vm_offset_t)(x) & 0x00000003ffffffff) #define phystok0seg(x) ((vm_offset_t)(x) | K0SEG_BEGIN) diff --git a/sys/arch/alpha/include/rpb.h b/sys/arch/alpha/include/rpb.h index c738b061ac7..c652f3bfc7b 100644 --- a/sys/arch/alpha/include/rpb.h +++ b/sys/arch/alpha/include/rpb.h @@ -1,4 +1,4 @@ -/* $NetBSD: rpb.h,v 1.6 1995/11/23 02:36:41 cgd Exp $ */ +/* $NetBSD: rpb.h,v 1.7 1996/04/29 16:23:11 cgd Exp $ */ /* * Copyright (c) 1994, 1995 Carnegie-Mellon University. @@ -169,7 +169,6 @@ struct pcs { #define PCS_PV 0x000040 /* PALcode valid */ #define PCS_PMV 0x000080 /* PALcode memory valid */ #define PCS_PL 0x000100 /* PALcode loaded */ -#define PCS_PE 0x000200 /* primary eligible (SMP) */ #define PCS_HALT_REQ 0xff0000 /* halt request mask */ #define PCS_HALT_DEFAULT 0x000000 @@ -227,7 +226,7 @@ struct pcs { #define PCS_VAR_VAXFP 0x0000000000000001 /* VAX FP support */ #define PCS_VAR_IEEEFP 0x0000000000000002 /* IEEE FP support */ -#define PCS_VAR_IOACCESS 0x0000000000000004 /* Has I/O access */ +#define PCS_VAR_PE 0x0000000000000004 /* Primary Eligible */ #define PCS_VAR_RESERVED 0xfffffffffffffff8 /* Reserved */ char pcs_proc_revision[8]; /* C0: only first 4 valid */ diff --git a/sys/arch/alpha/include/sfbreg.h b/sys/arch/alpha/include/sfbreg.h new file mode 100644 index 00000000000..dcef105d717 --- /dev/null +++ b/sys/arch/alpha/include/sfbreg.h @@ -0,0 +1,96 @@ +/* $NetBSD: sfbreg.h,v 1.1 1996/05/01 21:15:46 cgd Exp $ */ + +/* + * Copyright (c) 1996 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ + +/* + * Smart ("CXTurbo") Frame Buffer definitions, from: + * ``DEC 3000 300/400/500/600/700/800/900 AXP Models System Prgrammer's Manual'' + * (DEC order number EK-D3SYS-PM), section 6. + * + * All definitions are in "dense" TurboChannel space. + */ + +/* + * Size of the SFB address space. + */ +#define SFB_SIZE 0x1000000 + +/* + * Offsets into slot space of each functional unit. + */ +#define SFB_ASIC_OFFSET 0x0100000 /* SFB ASIC Control Registers */ +#define SFB_ASIC_SIZE 0x0020000 +#define SFB_RAMDAC_OFFSET 0x01c0000 /* Bt495 RAMDAC Registers */ +#define SFB_RAMDAC_SIZE 0x0040000 +#define SFB_FB_OFFSET 0x0200000 /* Frame buffer */ +#define SFB_FB_SIZE 0x0200000 +#define SFB_OSBM_OFFSET 0x0600000 /* Off-screen buffer memory */ +#define SFB_OSBM_SIZE 0x0200000 + +/* + * SFB ASIC registers (offsets from SFB_ASIC_OFFSET). + */ +#define SFB_ASIC_COPYBUF_0 0x0000 /* Copy buffer register 0 (R/W) */ +#define SFB_ASIC_COPYBUF_1 0x0004 /* Copy buffer register 1 (R/W) */ +#define SFB_ASIC_COPYBUF_2 0x0008 /* Copy buffer register 2 (R/W) */ +#define SFB_ASIC_COPYBUF_3 0x000c /* Copy buffer register 3 (R/W) */ +#define SFB_ASIC_COPYBUF_4 0x0010 /* Copy buffer register 4 (R/W) */ +#define SFB_ASIC_COPYBUF_5 0x0014 /* Copy buffer register 5 (R/W) */ +#define SFB_ASIC_COPYBUF_6 0x0018 /* Copy buffer register 6 (R/W) */ +#define SFB_ASIC_COPYBUF_7 0x001c /* Copy buffer register 7 (R/W) */ +#define SFB_ASIC_FG 0x0020 /* Foreground (R/W) */ +#define SFB_ASIC_BG 0x0024 /* Background (R/W) */ +#define SFB_ASIC_PLANEMASK 0x0028 /* PlaneMask (R/W) */ +#define SFB_ASIC_PIXELMASK 0x002c /* PixelMask (R/W) */ +#define SFB_ASIC_MODE 0x0030 /* Mode (R/W) */ +#define SFB_ASIC_ROP 0x0034 /* RasterOp (R/W) */ +#define SFB_ASIC_PIXELSHIFT 0x0038 /* PixelShift (R/W) */ +#define SFB_ASIC_ADDRESS 0x003c /* Address (R/W) */ +#define SFB_ASIC_BRES1 0x0040 /* Bresenham register 1 (R/W) */ +#define SFB_ASIC_BRES2 0x0044 /* Bresenham register 2 (R/W) */ +#define SFB_ASIC_BRES3 0x0048 /* Bresenham register 3 (R) (?) */ +#define SFB_ASIC_BCONT 0x004c /* Bcont (W) */ +#define SFB_ASIC_DEEP 0x0050 /* Deep (R/W) */ +#define SFB_ASIC_START 0x0054 /* Start (W) */ +#define SFB_ASIC_CLEAR_INTR 0x0058 /* Clear Interrupt (W) */ +#define SFB_ASIC_VIDEO_REFRESH 0x0060 /* Video refresh counter (R/W) */ +#define SFB_ASIC_VIDEO_HSETUP 0x0064 /* Video horizontal setup (R/W) */ +#define SFB_ASIC_VIDEO_VSETUP 0x0068 /* Video vertical setup (R/W) */ +#define SFB_ASIC_VIDEO_BASE 0x006c /* Video base address (R/W) */ +#define SFB_ASIC_VIDEO_VALID 0x0070 /* Video valid (W) */ +#define SFB_ASIC_ENABLE_INTR 0x0074 /* Enable/Disable Interrupts (W) */ +#define SFB_ASIC_TCCLK 0x0078 /* TCCLK count (R/W) */ +#define SFB_ASIC_VIDCLK 0x007c /* VIDCLK count (R/W) */ + +/* + * Bt459 RAMDAC registers (offsets from SFB_RAMDAC_OFFSET) + */ +#define SFB_RAMDAC_ADDRLOW 0x0000 /* Address register low byte */ +#define SFB_RAMDAC_ADDRHIGH 0x0004 /* Address register high byte */ +#define SFB_RAMDAC_REGDATA 0x0008 /* Register addressed by addr reg */ +#define SFB_RAMDAC_CMAPDATA 0x000c /* Colormap loc addressed by addr reg */ diff --git a/sys/arch/alpha/include/isa_machdep.h b/sys/arch/alpha/include/sysarch.h index a5636e42f51..a8a5493ab90 100644 --- a/sys/arch/alpha/include/isa_machdep.h +++ b/sys/arch/alpha/include/sysarch.h @@ -1,21 +1,21 @@ -/* $NetBSD: isa_machdep.h,v 1.1 1995/11/23 02:36:11 cgd Exp $ */ +/* $NetBSD: sysarch.h,v 1.1 1996/04/12 01:42:45 cgd Exp $ */ /* - * Copyright (c) 1995 Carnegie-Mellon University. + * Copyright (c) 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou - * + * * Permission to use, copy, modify and distribute this software and * its documentation is hereby granted, provided that both the copyright * notice and this permission notice appear in all copies of the * software, derivative works or modified versions, and any portions * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * + * * Carnegie Mellon requests users of this software to return to * * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU @@ -27,5 +27,16 @@ * rights to redistribute these changes. */ -/* not __ISA_MACHDEP_PIO_DEFINITIONS__ */ -/* not __ISA_MACHDEP_MEM_DEFINITIONS__ */ +#ifndef _ALPHA_SYSARCH_H_ +#define _ALPHA_SYSARCH_H_ + +static inline u_int64_t +alpha_rpcc() +{ + u_int64_t rv; + + __asm ("rpcc %0" : "=r" (rv)); + return (rv); +} + +#endif /* _ALPHA_SYSARCH_H_ */ diff --git a/sys/arch/alpha/pci/tgareg.h b/sys/arch/alpha/include/tgareg.h index 6c335cf9a28..fab595cc556 100644 --- a/sys/arch/alpha/pci/tgareg.h +++ b/sys/arch/alpha/include/tgareg.h @@ -1,7 +1,7 @@ -/* $NetBSD: tgareg.h,v 1.3 1995/11/23 02:38:28 cgd Exp $ */ +/* $NetBSD: tgareg.h,v 1.1 1996/04/12 01:44:23 cgd Exp $ */ /* - * Copyright (c) 1995 Carnegie-Mellon University. + * Copyright (c) 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -27,8 +27,8 @@ * rights to redistribute these changes. */ -#ifndef _ALPHA_PCI_TGAREG_H_ -#define _ALPHA_PCI_TGAREG_H_ +#ifndef _ALPHA_INCLUDE_TGAREG_H_ +#define _ALPHA_INCLUDE_TGAREG_H_ /* * Device-specific PCI register offsets and contents. @@ -50,7 +50,7 @@ * TGA Core Space register numbers and contents. */ -typedef int32_t tga_reg_t; +typedef u_int32_t tga_reg_t; #define TGA_REG_GCBR0 0x000 /* Copy buffer 0 */ #define TGA_REG_GCBR1 0x001 /* Copy buffer 1 */ @@ -156,4 +156,4 @@ typedef int32_t tga_reg_t; /* reserved 0x07f */ -#endif /* _ALPHA_PCI_TGAREG_H_ */ +#endif /* _ALPHA_INCLUDE_TGAREG_H_ */ diff --git a/sys/arch/alpha/include/vuid_event.h b/sys/arch/alpha/include/vuid_event.h new file mode 100644 index 00000000000..26c0e72590f --- /dev/null +++ b/sys/arch/alpha/include/vuid_event.h @@ -0,0 +1,87 @@ +/* $NetBSD: vuid_event.h,v 1.1 1996/04/12 01:45:47 cgd Exp $ */ + +/* + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This software was developed by the Computer Systems Engineering group + * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and + * contributed to Berkeley. + * + * All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Lawrence Berkeley Laboratory. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)vuid_event.h 8.1 (Berkeley) 6/11/93 + */ + +/* + * The following is a minimal emulation of Sun's `Firm_event' structures + * and related operations necessary to make X11 happy (i.e., make it + * compile, and make old X11 binaries run). + */ +typedef struct firm_event { + u_short id; /* key or MS_* or LOC_[XY]_DELTA */ + u_short pad; /* unused, at least by X11 */ + int value; /* VKEY_{UP,DOWN} or locator delta */ + struct timeval time; +} Firm_event; + +/* + * Special `id' fields. These weird numbers simply match the old binaries. + * Others are in 0..0x7f and are keyboard key numbers (keyboard dependent!). + */ +#define MS_LEFT 0x7f20 /* left mouse button */ +#define MS_MIDDLE 0x7f21 /* middle mouse button */ +#define MS_RIGHT 0x7f22 /* right mouse button */ +#define LOC_X_DELTA 0x7f80 /* mouse delta-X */ +#define LOC_Y_DELTA 0x7f81 /* mouse delta-Y */ +#define LOC_X_ABSOLUTE 0x7f82 /* X compat, unsupported */ +#define LOC_Y_ABSOLUTE 0x7f83 /* X compat, unsupported */ + +/* + * Special `value' fields. These apply to keys and mouse buttons. The + * value of a mouse delta is the delta. Note that positive deltas are + * left and up (not left and down as you might expect). + */ +#define VKEY_UP 0 /* key or button went up */ +#define VKEY_DOWN 1 /* key or button went down */ + +/* + * The following ioctls are clearly intended to take things in and out + * of `firm event' mode. Since we always run in this mode (as far as + * /dev/kbd and /dev/mouse are concerned, anyway), we always claim to + * be in this mode and reject anything else. + */ +#define VUIDSFORMAT _IOW('v', 1, int) +#define VUIDGFORMAT _IOR('v', 2, int) +#define VUID_FIRM_EVENT 1 /* the only format we support */ diff --git a/sys/arch/alpha/include/wsconsio.h b/sys/arch/alpha/include/wsconsio.h new file mode 100644 index 00000000000..58848e420f5 --- /dev/null +++ b/sys/arch/alpha/include/wsconsio.h @@ -0,0 +1,61 @@ +/* $NetBSD: wsconsio.h,v 1.1 1996/04/12 01:43:06 cgd Exp $ */ + +/* + * Copyright (c) 1995, 1996 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ + +/* + * Get keyboard type. Keyboard type definitions are below. + */ +#define WSCONSIO_KBD_GTYPE _IOR('W',100,int) +#define KBD_TYPE_LK201 0 /* lk-201 */ +#define KBD_TYPE_LK401 1 /* lk-401 */ +#define KBD_TYPE_PC 2 /* pc-like */ + +/* + * If arg is one, don't process scancodes into characters + */ +#define WSCONSIO_KBD_SCANCODES _IO('W',101,int) + +/* + * Bell ioctls. + */ + +struct wsconsio_bell_data { + int wbd_flags; + int wbd_pitch; /* pitch, in Hz. */ + int wbd_period; /* period, in milliseconds. */ + int wbd_volume; /* percentage of maximum volume. */ +}; + +#define WSCONSIO_BELLDATA_PITCH 0x01 /* pitch data present */ +#define WSCONSIO_BELLDATA_PERIOD 0x02 /* period data present */ +#define WSCONSIO_BELLDATA_VOLUME 0x04 /* volume data present */ + +#define WSCONSIO_BELL _IO('W',102) +#define WSCONSIO_COMPLEXBELL _IOW('W',103,struct wsconsio_bell_data) +#define WSCONSIO_SETBELL _IOW('W',104,struct wsconsio_bell_data) +#define WSCONSIO_GETBELL _IOR('W',105,struct wsconsio_bell_data) diff --git a/sys/arch/alpha/isa/isa_machdep.h b/sys/arch/alpha/isa/isa_machdep.h new file mode 100644 index 00000000000..051811ecafe --- /dev/null +++ b/sys/arch/alpha/isa/isa_machdep.h @@ -0,0 +1,53 @@ +/* $NetBSD: isa_machdep.h,v 1.2 1996/04/12 05:39:02 cgd Exp $ */ + +/* + * Copyright (c) 1996 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ + +/* + * Types provided to machine-independent ISA code. + */ +typedef struct alpha_isa_chipset *isa_chipset_tag_t; + +struct alpha_isa_chipset { + void *ic_v; + + void (*ic_attach_hook) __P((struct device *, struct device *, + struct isabus_attach_args *)); + void *(*ic_intr_establish) __P((void *, int, int, int, + int (*)(void *), void *)); + void (*ic_intr_disestablish) __P((void *, void *)); +}; + +/* + * Functions provided to machine-independent ISA code. + */ +#define isa_attach_hook(p, s, a) \ + (*(a)->iba_ic->ic_attach_hook)((p), (s), (a)) +#define isa_intr_establish(c, i, t, l, f, a) \ + (*(c)->ic_intr_establish)((c)->ic_v, (i), (t), (l), (f), (a)) +#define isa_intr_disestablish(c, h) \ + (*(c)->ic_intr_disestablish)((c)->ic_v, (h)) diff --git a/sys/arch/alpha/isa/isafcns_jensen.c b/sys/arch/alpha/isa/isafcns_jensen.c index 3e5624357b8..5ac135aea69 100644 --- a/sys/arch/alpha/isa/isafcns_jensen.c +++ b/sys/arch/alpha/isa/isafcns_jensen.c @@ -1,3 +1,31 @@ +/* $NetBSD: isafcns_jensen.c,v 1.2 1996/04/12 01:54:04 cgd Exp $ */ + +/* + * Copyright (c) 1995, 1996 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ #include <sys/types.h> #include <machine/pio.h> diff --git a/sys/arch/alpha/isa/mcclock_isa.c b/sys/arch/alpha/isa/mcclock_isa.c new file mode 100644 index 00000000000..fb9ac1f778b --- /dev/null +++ b/sys/arch/alpha/isa/mcclock_isa.c @@ -0,0 +1,120 @@ +/* $NetBSD: mcclock_isa.c,v 1.2 1996/04/17 22:22:46 cgd Exp $ */ + +/* + * Copyright (c) 1995, 1996 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ + +#include <sys/param.h> +#include <sys/kernel.h> +#include <sys/systm.h> +#include <sys/device.h> + +#include <machine/bus.h> + +#include <alpha/alpha/clockvar.h> +#include <alpha/alpha/mcclockvar.h> +#include <dev/ic/mc146818reg.h> +#include <dev/isa/isavar.h> + +struct mcclock_isa_softc { + struct mcclock_softc sc_mcclock; + + bus_chipset_tag_t sc_bc; + bus_io_handle_t sc_ioh; +}; + +int mcclock_isa_match __P((struct device *, void *, void *)); +void mcclock_isa_attach __P((struct device *, struct device *, void *)); + +struct cfattach mcclock_isa_ca = { + sizeof (struct mcclock_isa_softc), mcclock_isa_match, + mcclock_isa_attach, +}; + +void mcclock_isa_write __P((struct mcclock_softc *, u_int, u_int)); +u_int mcclock_isa_read __P((struct mcclock_softc *, u_int)); + +const struct mcclock_busfns mcclock_isa_busfns = { + mcclock_isa_write, mcclock_isa_read, +}; + +int +mcclock_isa_match(parent, match, aux) + struct device *parent; + void *match, *aux; +{ + struct isa_attach_args *ia = aux; + + if (ia->ia_iobase != 0x70 && ia->ia_iobase != -1) + return (0); + + ia->ia_iobase = 0x70; /* XXX */ + ia->ia_iosize = 2; /* XXX */ + ia->ia_msize = 0; + + return (1); +} + +void +mcclock_isa_attach(parent, self, aux) + struct device *parent, *self; + void *aux; +{ + struct isa_attach_args *ia = aux; + struct mcclock_isa_softc *sc = (struct mcclock_isa_softc *)self; + + sc->sc_bc = ia->ia_bc; + if (bus_io_map(sc->sc_bc, ia->ia_iobase, ia->ia_iosize, &sc->sc_ioh)) + panic("mcclock_isa_attach: couldn't map clock I/O space"); + + mcclock_attach(&sc->sc_mcclock, &mcclock_isa_busfns); +} + +void +mcclock_isa_write(mcsc, reg, datum) + struct mcclock_softc *mcsc; + u_int reg, datum; +{ + struct mcclock_isa_softc *sc = (struct mcclock_isa_softc *)mcsc; + bus_chipset_tag_t bc = sc->sc_bc; + bus_io_handle_t ioh = sc->sc_ioh; + + bus_io_write_1(bc, ioh, 0, reg); + bus_io_write_1(bc, ioh, 1, datum); +} + +u_int +mcclock_isa_read(mcsc, reg) + struct mcclock_softc *mcsc; + u_int reg; +{ + struct mcclock_isa_softc *sc = (struct mcclock_isa_softc *)mcsc; + bus_chipset_tag_t bc = sc->sc_bc; + bus_io_handle_t ioh = sc->sc_ioh; + + bus_io_write_1(bc, ioh, 0, reg); + return bus_io_read_1(bc, ioh, 1); +} diff --git a/sys/arch/alpha/isa/pckbd.c b/sys/arch/alpha/isa/pckbd.c index ab269620ef7..0a212449aeb 100644 --- a/sys/arch/alpha/isa/pckbd.c +++ b/sys/arch/alpha/isa/pckbd.c @@ -1,4 +1,4 @@ -/* $NetBSD: pckbd.c,v 1.3 1995/12/24 02:29:35 mycroft Exp $ */ +/* $NetBSD: pckbd.c,v 1.7 1996/05/05 01:41:53 thorpej Exp $ */ /*- * Copyright (c) 1993, 1994, 1995 Charles Hannum. All rights reserved. @@ -52,16 +52,18 @@ #include <sys/kernel.h> #include <sys/device.h> -#include <machine/cpu.h> +#include <machine/intr.h> +#include <machine/bus.h> #include <dev/isa/isareg.h> #include <dev/isa/isavar.h> #include <alpha/isa/pckbdreg.h> +#include <alpha/isa/spkrreg.h> +#include <alpha/isa/timerreg.h> +#include <machine/wsconsio.h> -#include "wsc.h" -#if NWSC -#include <alpha/pci/wsconsvar.h> -#endif +#include <alpha/wscons/wsconsvar.h> +#include "wscons.h" static volatile u_char ack, nak; /* Don't ask. */ static u_char async, kernel, polling; /* Really, you don't want to know. */ @@ -70,28 +72,58 @@ static u_char lock_state = 0x00, /* all off */ typematic_rate = 0xff, /* don't update until set by user */ old_typematic_rate = 0xff; -__const struct isa_intr_fns *pckbd_intr_fns; /* XXX */ -void *pckbd_intr_arg; /* XXX */ -__const struct isa_pio_fns *pckbd_pio_fns; /* XXX */ -void *pckbd_pio_arg; /* XXX */ +bus_chipset_tag_t pckbd_bc; +isa_chipset_tag_t pckbd_ic; + +bus_io_handle_t pckbd_data_ioh; +#define pckbd_out_ioh pckbd_data_ioh +bus_io_handle_t pckbd_status_ioh; +#define pckbd_cmd_ioh pckbd_status_ioh +bus_io_handle_t pckbd_timer_ioh; +bus_io_handle_t pckbd_pitaux_ioh; +bus_io_handle_t pckbd_delay_ioh; struct pckbd_softc { struct device sc_dev; void *sc_ih; + + int sc_bellactive; /* is the bell active? */ + int sc_bellpitch; /* last pitch programmed */ }; int pckbdprobe __P((struct device *, void *, void *)); void pckbdattach __P((struct device *, struct device *, void *)); int pckbdintr __P((void *)); -struct cfdriver pckbdcd = { - NULL, "pckbd", pckbdprobe, pckbdattach, DV_DULL, - sizeof(struct pckbd_softc) +struct cfattach pckbd_ca = { + sizeof(struct pckbd_softc), pckbdprobe, pckbdattach, }; -char *sget __P((void)); -int pccngetc __P((void *)); -void pccnpollc __P((void *, int)); +struct cfdriver pckbd_cd = { + NULL, "pckbd", DV_DULL, +}; + +int pckbd_cngetc __P((struct device *)); +void pckbd_cnpollc __P((struct device *, int)); +void pckbd_bell __P((struct device *, struct wsconsio_bell_data *)); +int pckbd_ioctl __P((struct device *, u_long, caddr_t, int, + struct proc *)); + +char *pckbd_translate __P((struct device *dev, int c)); + +#if NWSCONS +struct wscons_idev_spec pckbd_wscons_idev = { + pckbd_cngetc, + pckbd_cnpollc, + pckbd_bell, + pckbd_ioctl, + pckbd_translate, + 0x7f, /* key data mask */ + 0x80, /* key-up mask */ +}; +#endif + +void pckbd_bell_stop __P((void *)); /* * DANGER WIL ROBINSON -- the values of SCROLL, NUM, CAPS, and ALT are @@ -109,10 +141,10 @@ void pccnpollc __P((void *, int)); #define NONE 0x0400 /* no function */ #define KBD_DELAY \ - { u_char x = INB(pckbd_pio_fns, pckbd_pio_arg, 0x84); } \ - { u_char x = INB(pckbd_pio_fns, pckbd_pio_arg, 0x84); } \ - { u_char x = INB(pckbd_pio_fns, pckbd_pio_arg, 0x84); } \ - { u_char x = INB(pckbd_pio_fns, pckbd_pio_arg, 0x84); } + { u_char x = bus_io_read_1(pckbd_bc, pckbd_delay_ioh, 0); } \ + { u_char x = bus_io_read_1(pckbd_bc, pckbd_delay_ioh, 0); } \ + { u_char x = bus_io_read_1(pckbd_bc, pckbd_delay_ioh, 0); } \ + { u_char x = bus_io_read_1(pckbd_bc, pckbd_delay_ioh, 0); } static inline int kbd_wait_output() @@ -120,7 +152,7 @@ kbd_wait_output() u_int i; for (i = 100000; i; i--) - if ((INB(pckbd_pio_fns, pckbd_pio_arg, KBSTATP) & KBS_IBF) + if ((bus_io_read_1(pckbd_bc, pckbd_status_ioh, 0) & KBS_IBF) == 0) { KBD_DELAY; return 1; @@ -134,7 +166,7 @@ kbd_wait_input() u_int i; for (i = 100000; i; i--) - if ((INB(pckbd_pio_fns, pckbd_pio_arg, KBSTATP) & KBS_DIB) + if ((bus_io_read_1(pckbd_bc, pckbd_status_ioh, 0) & KBS_DIB) != 0) { KBD_DELAY; return 1; @@ -148,11 +180,11 @@ kbd_flush_input() u_int i; for (i = 10; i; i--) { - if ((INB(pckbd_pio_fns, pckbd_pio_arg, KBSTATP) & KBS_DIB) + if ((bus_io_read_1(pckbd_bc, pckbd_status_ioh, 0) & KBS_DIB) == 0) return; KBD_DELAY; - (void) INB(pckbd_pio_fns, pckbd_pio_arg, KBDATAP); + (void) bus_io_read_1(pckbd_bc, pckbd_data_ioh, 0); } } @@ -166,10 +198,10 @@ kbc_get8042cmd() if (!kbd_wait_output()) return -1; - OUTB(pckbd_pio_fns, pckbd_pio_arg, KBCMDP, K_RDCMDBYTE); + bus_io_write_1(pckbd_bc, pckbd_cmd_ioh, 0, K_RDCMDBYTE); if (!kbd_wait_input()) return -1; - return INB(pckbd_pio_fns, pckbd_pio_arg, KBDATAP); + return bus_io_read_1(pckbd_bc, pckbd_data_ioh, 0); } #endif @@ -183,10 +215,10 @@ kbc_put8042cmd(val) if (!kbd_wait_output()) return 0; - OUTB(pckbd_pio_fns, pckbd_pio_arg, KBCMDP, K_LDCMDBYTE); + bus_io_write_1(pckbd_bc, pckbd_cmd_ioh, 0, K_LDCMDBYTE); if (!kbd_wait_output()) return 0; - OUTB(pckbd_pio_fns, pckbd_pio_arg, KBOUTP, val); + bus_io_write_1(pckbd_bc, pckbd_out_ioh, 0, val); return 1; } @@ -205,16 +237,16 @@ kbd_cmd(val, polling) if (!kbd_wait_output()) return 0; ack = nak = 0; - OUTB(pckbd_pio_fns, pckbd_pio_arg, KBOUTP, val); + bus_io_write_1(pckbd_bc, pckbd_out_ioh, 0, val); if (polling) for (i = 100000; i; i--) { - if (INB(pckbd_pio_fns, pckbd_pio_arg, - KBSTATP) & KBS_DIB) { + if (bus_io_read_1(pckbd_bc, + pckbd_status_ioh, 0) & KBS_DIB) { register u_char c; KBD_DELAY; - c = INB(pckbd_pio_fns, pckbd_pio_arg, - KBDATAP); + c = bus_io_read_1(pckbd_bc, + pckbd_data_ioh, 0); if (c == KBR_ACK || c == KBR_ECHO) { ack = 1; return 1; @@ -231,8 +263,8 @@ kbd_cmd(val, polling) } else for (i = 100000; i; i--) { - (void) INB(pckbd_pio_fns, pckbd_pio_arg, - KBSTATP); + (void) bus_io_read_1(pckbd_bc, + pckbd_status_ioh, 0); if (ack) return 1; if (nak) @@ -252,11 +284,19 @@ pckbdprobe(parent, match, aux) struct device *parent; void *match, *aux; { - struct isadev_attach_args *ida = aux; + struct isa_attach_args *ia = aux; u_int i; - pckbd_pio_fns = ida->ida_piofns; /* XXX */ - pckbd_pio_arg = ida->ida_pioarg; /* XXX */ + pckbd_bc = ia->ia_bc; + pckbd_ic = ia->ia_ic; + + if (bus_io_map(pckbd_bc, KBDATAP, 1, &pckbd_data_ioh) || + bus_io_map(pckbd_bc, KBSTATP, 1, &pckbd_status_ioh) || + bus_io_map(pckbd_bc, IO_TIMER1, 4, &pckbd_timer_ioh) || + bus_io_map(pckbd_bc, PITAUX_PORT, 1, &pckbd_pitaux_ioh)) + return 0; + + pckbd_delay_ioh = ia->ia_delayioh; /* Enable interrupts and keyboard, etc. */ if (!kbc_put8042cmd(CMDBYTE)) { @@ -273,12 +313,12 @@ pckbdprobe(parent, match, aux) goto lose; } for (i = 600000; i; i--) - if ((INB(pckbd_pio_fns, pckbd_pio_arg, KBSTATP) & KBS_DIB) + if ((bus_io_read_1(pckbd_bc, pckbd_status_ioh, 0) & KBS_DIB) != 0) { KBD_DELAY; break; } - if (i == 0 || INB(pckbd_pio_fns, pckbd_pio_arg, KBDATAP) + if (i == 0 || bus_io_read_1(pckbd_bc, pckbd_data_ioh, 0) != KBR_RSTDONE) { printf("pcprobe: reset error %d\n", 2); goto lose; @@ -329,8 +369,8 @@ lose: */ #endif - ida->ida_nports[0] = 16; - ida->ida_iosiz[0] = 0; + ia->ia_iobase = 16; + ia->ia_iosize = 0; return 1; } @@ -340,20 +380,29 @@ pckbdattach(parent, self, aux) void *aux; { struct pckbd_softc *sc = (void *)self; - struct isadev_attach_args *ida = aux; - - pckbd_intr_fns = ida->ida_intrfns; /* XXX */ - pckbd_intr_arg = ida->ida_intrarg; /* XXX */ - pckbd_pio_fns = ida->ida_piofns; /* XXX */ - pckbd_pio_arg = ida->ida_pioarg; /* XXX */ - - sc->sc_ih = ISA_INTR_ESTABLISH(pckbd_intr_fns, pckbd_intr_arg, - ida->ida_irq[0], IST_EDGE, IPL_TTY, pckbdintr, sc); -#if NWSC + struct isa_attach_args *ia = aux; + + pckbd_bc = ia->ia_bc; + pckbd_ic = ia->ia_ic; + + if (bus_io_map(pckbd_bc, KBDATAP, 1, &pckbd_data_ioh) || + bus_io_map(pckbd_bc, KBSTATP, 1, &pckbd_status_ioh) || + bus_io_map(pckbd_bc, IO_TIMER1, 4, &pckbd_timer_ioh) || + bus_io_map(pckbd_bc, PITAUX_PORT, 1, &pckbd_pitaux_ioh)) + panic("pckbdattach couldn't map"); + + pckbd_delay_ioh = ia->ia_delayioh; + + sc->sc_ih = isa_intr_establish(pckbd_ic, ia->ia_irq, IST_EDGE, + IPL_TTY, pckbdintr, sc); + + sc->sc_bellactive = sc->sc_bellpitch = 0; + +#if NWSCONS printf("\n"); - wscattach_input(self, self, pccngetc, pccnpollc); + kbdattach(self, &pckbd_wscons_idev); #else - printf(": no wsc driver; no input possible\n"); + printf(": no wscons driver present; no input possible\n"); #endif } @@ -367,19 +416,35 @@ pckbdintr(arg) void *arg; { struct pckbd_softc *sc = arg; - u_char *cp; + u_char data; + static u_char last; - if ((INB(pckbd_pio_fns, pckbd_pio_arg, KBSTATP) & KBS_DIB) == 0) + if ((bus_io_read_1(pckbd_bc, pckbd_status_ioh, 0) & KBS_DIB) == 0) return 0; if (polling) return 1; do { - cp = sget(); -#if NWSC - if (cp) - wscons_kbdinput(cp); + KBD_DELAY; + data = bus_io_read_1(pckbd_bc, pckbd_data_ioh, 0); + + switch (data) { + case KBR_ACK: + ack = 1; + break; + case KBR_RESEND: + nak = 1; + break; + default: + /* Always ignore typematic keys */ + if (data == last) + break; + last = data; +#if NWSCONS + kbd_input(data); #endif - } while (INB(pckbd_pio_fns, pckbd_pio_arg, KBSTATP) & KBS_DIB); + break; + } + } while (bus_io_read_1(pckbd_bc, pckbd_status_ioh, 0) & KBS_DIB); return 1; } @@ -426,6 +491,23 @@ async_update() } } +int +pckbd_ioctl(dev, cmd, data, flag, p) + struct device *dev; + u_long cmd; + caddr_t data; + int flag; + struct proc *p; +{ + + switch (cmd) { + case WSCONSIO_KBD_GTYPE: + *(int *)data = KBD_TYPE_PC; + return 0; + } + return ENOTTY; +} + #if 0 int pcioctl(dev, cmd, data, flag, p) @@ -633,96 +715,18 @@ static Scan_def scan_codes[] = { * Get characters from the keyboard. If none are present, return NULL. */ char * -sget() +pckbd_translate(dev, c) + struct device *dev; + int c; { - u_char dt; + u_char dt = c; static u_char extended = 0, shift_state = 0; static u_char capchar[2]; -top: - KBD_DELAY; - dt = INB(pckbd_pio_fns, pckbd_pio_arg, KBDATAP); - - switch (dt) { - case KBR_ACK: - ack = 1; - goto loop; - case KBR_RESEND: - nak = 1; - goto loop; - } - -#if 0 - if (pc_xmode > 0) { -#if defined(DDB) && defined(XSERVER_DDB) - /* F12 enters the debugger while in X mode */ - if (dt == 88) - Debugger(); -#endif - capchar[0] = dt; - capchar[1] = 0; - /* - * Check for locking keys. - * - * XXX Setting the LEDs this way is a bit bogus. What if the - * keyboard has been remapped in X? - */ - switch (scan_codes[dt & 0x7f].type) { - case NUM: - if (dt & 0x80) { - shift_state &= ~NUM; - break; - } - if (shift_state & NUM) - break; - shift_state |= NUM; - lock_state ^= NUM; - async_update(); - break; - case CAPS: - if (dt & 0x80) { - shift_state &= ~CAPS; - break; - } - if (shift_state & CAPS) - break; - shift_state |= CAPS; - lock_state ^= CAPS; - async_update(); - break; - case SCROLL: - if (dt & 0x80) { - shift_state &= ~SCROLL; - break; - } - if (shift_state & SCROLL) - break; - shift_state |= SCROLL; - lock_state ^= SCROLL; - if ((lock_state & SCROLL) == 0) - wakeup((caddr_t)&lock_state); - async_update(); - break; - } - return capchar; - } -#endif /* 0 */ - - switch (dt) { - case KBR_EXTENDED: + if (dt == KBR_EXTENDED) { extended = 1; - goto loop; - } - -#ifdef DDB - /* - * Check for cntl-alt-esc. - */ - if ((dt == 1) && (shift_state & (CTL | ALT)) == (CTL | ALT)) { - Debugger(); - dt |= 0x80; /* discard esc (ddb discarded ctl-alt) */ + return NULL; } -#endif /* * Check for make/break. @@ -837,31 +841,43 @@ top: } extended = 0; -loop: - if ((INB(pckbd_pio_fns, pckbd_pio_arg, KBSTATP) & KBS_DIB) == 0) - return 0; - goto top; + return (NULL); } /* ARGSUSED */ int -pccngetc(cookie) - void *cookie; +pckbd_cngetc(dev) + struct device *dev; { register char *cp; - -#if 0 - if (pc_xmode > 0) - return 0; -#endif + u_char data; + static u_char last; do { - /* wait for byte */ - while ((INB(pckbd_pio_fns, pckbd_pio_arg, KBSTATP) & KBS_DIB) - == 0); - /* see if it's worthwhile */ - cp = sget(); + /* wait for byte */ + while ((bus_io_read_1(pckbd_bc, pckbd_status_ioh, 0) & KBS_DIB) + == 0) + KBD_DELAY; + KBD_DELAY; + + data = bus_io_read_1(pckbd_bc, pckbd_data_ioh, 0); + + if (data == KBR_ACK) { + ack = 1; + continue; + } + if (data == KBR_RESEND) { + nak = 1; + continue; + } + + /* Ignore typematic keys */ + if (data == last) + continue; + last = data; + + cp = pckbd_translate(NULL, data); } while (!cp); if (*cp == '\r') return '\n'; @@ -869,11 +885,11 @@ pccngetc(cookie) } void -pccnpollc(cookie, on) - void *cookie; +pckbd_cnpollc(dev, on) + struct device *dev; int on; { - struct pckbd_softc *sc = cookie; + struct pckbd_softc *sc = (struct pckbd_softc *)dev; polling = on; if (!on) { @@ -892,3 +908,59 @@ pccnpollc(cookie, on) } } } + +void +pckbd_bell(dev, wbd) + struct device *dev; + struct wsconsio_bell_data *wbd; +{ + struct pckbd_softc *sc = (struct pckbd_softc *)dev; + int pitch, period; + int s; + + pitch = wbd->wbd_pitch; + period = (wbd->wbd_period * hz) / 1000; + /* XXX volume ignored */ + + s = splhigh(); + if (sc->sc_bellactive) + untimeout(pckbd_bell_stop, sc); + splx(s); + if (pitch == 0 || period == 0) { + pckbd_bell_stop(sc); + sc->sc_bellpitch = 0; + return; + } + if (!sc->sc_bellactive || sc->sc_bellpitch != pitch) { + s = splhigh(); + bus_io_write_1(pckbd_bc, pckbd_timer_ioh, TIMER_MODE, + TIMER_SEL2 | TIMER_16BIT | TIMER_SQWAVE); + bus_io_write_1(pckbd_bc, pckbd_timer_ioh, TIMER_CNTR2, + TIMER_DIV(pitch) % 256); + bus_io_write_1(pckbd_bc, pckbd_timer_ioh, TIMER_CNTR2, + TIMER_DIV(pitch) / 256); + /* enable speaker */ + bus_io_write_1(pckbd_bc, pckbd_pitaux_ioh, 0, + bus_io_read_1(pckbd_bc, pckbd_pitaux_ioh, 0) | + PIT_SPKR); + splx(s); + } + sc->sc_bellpitch = pitch; + sc->sc_bellactive = 1; + timeout(pckbd_bell_stop, sc, period); +} + +void +pckbd_bell_stop(arg) + void *arg; +{ + struct pckbd_softc *sc = arg; + int s; + + /* disable bell */ + s = splhigh(); + bus_io_write_1(pckbd_bc, pckbd_pitaux_ioh, 0, + bus_io_read_1(pckbd_bc, pckbd_pitaux_ioh, 0) & ~PIT_SPKR); + sc->sc_bellactive = 0; + splx(s); +} diff --git a/sys/arch/alpha/isa/pms.c b/sys/arch/alpha/isa/pms.c new file mode 100644 index 00000000000..5fc6e3ae649 --- /dev/null +++ b/sys/arch/alpha/isa/pms.c @@ -0,0 +1,329 @@ +/* $NetBSD: pms.c,v 1.1 1996/04/12 01:53:06 cgd Exp $ */ + +/*- + * Copyright (c) 1994 Charles Hannum. + * Copyright (c) 1992, 1993 Erik Forsberg. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * THIS SOFTWARE IS PROVIDED BY ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN + * NO EVENT SHALL I BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * XXXX + * This is a hack. This driver should really be combined with the + * keyboard driver, since they go through the same buffer and use the + * same I/O ports. Frobbing the mouse and keyboard at the same time + * may result in dropped characters and/or corrupted mouse events. + */ + +#include "pms.h" +#if NPMS > 1 +#error Only one PS/2 style mouse may be configured into your system. +#endif + +#include <sys/param.h> +#include <sys/kernel.h> +#include <sys/systm.h> +#include <sys/buf.h> +#include <sys/malloc.h> +#include <sys/ioctl.h> +#include <sys/tty.h> +#include <sys/file.h> +#include <sys/select.h> +#include <sys/proc.h> +#include <sys/vnode.h> +#include <sys/device.h> + +#include <machine/intr.h> +#include <dev/isa/isavar.h> +#include <alpha/wscons/wsconsvar.h> + +#define PMS_DATA 0x60 /* offset for data port, read-write */ +#define PMS_CNTRL 0x64 /* offset for control port, write-only */ +#define PMS_STATUS 0x64 /* offset for status port, read-only */ +#define PMS_NPORTS 8 + +/* status bits */ +#define PMS_OBUF_FULL 0x01 +#define PMS_IBUF_FULL 0x02 + +/* controller commands */ +#define PMS_INT_ENABLE 0x47 /* enable controller interrupts */ +#define PMS_INT_DISABLE 0x65 /* disable controller interrupts */ +#define PMS_AUX_ENABLE 0xa8 /* enable auxiliary port */ +#define PMS_AUX_DISABLE 0xa7 /* disable auxiliary port */ +#define PMS_AUX_TEST 0xa9 /* test auxiliary port */ + +#define PMS_8042_CMD 0x65 + +/* mouse commands */ +#define PMS_SET_SCALE11 0xe6 /* set scaling 1:1 */ +#define PMS_SET_SCALE21 0xe7 /* set scaling 2:1 */ +#define PMS_SET_RES 0xe8 /* set resolution */ +#define PMS_GET_SCALE 0xe9 /* get scaling factor */ +#define PMS_SET_STREAM 0xea /* set streaming mode */ +#define PMS_SET_SAMPLE 0xf3 /* set sampling rate */ +#define PMS_DEV_ENABLE 0xf4 /* mouse on */ +#define PMS_DEV_DISABLE 0xf5 /* mouse off */ +#define PMS_RESET 0xff /* reset */ + +#define PMS_CHUNK 128 /* chunk size for read */ +#define PMS_BSIZE 1020 /* buffer size */ + +struct pms_softc { /* driver status information */ + struct device sc_dev; + + void *sc_ih; + + u_char sc_state; /* mouse driver state */ +#define PMS_OPEN 0x01 /* device is open */ +#define PMS_ASLP 0x02 /* waiting for mouse data */ + u_char sc_status; /* mouse button status */ + int sc_x, sc_y; /* accumulated motion in the X,Y axis */ +}; + +bus_chipset_tag_t pms_bc; +isa_chipset_tag_t pms_ic; +bus_io_handle_t pms_cntrl_ioh; +#define pms_status_ioh pms_cntrl_ioh +bus_io_handle_t pms_data_ioh; + +int pmsprobe __P((struct device *, void *, void *)); +void pmsattach __P((struct device *, struct device *, void *)); +int pmsintr __P((void *)); + +struct cfattach pms_ca = { + sizeof(struct pms_softc), pmsprobe, pmsattach, +}; + +struct cfdriver pms_cd = { + NULL, "pms", DV_TTY, +}; + +#define PMSUNIT(dev) (minor(dev)) + +int pms_enable __P((struct device *)); +int pms_disable __P((struct device *)); + +struct wscons_mdev_spec pms_mdev_spec = { + pms_enable, + pms_disable, +}; + +static inline void +pms_flush() +{ + u_char c; + + while (c = bus_io_read_1(pms_bc, pms_status_ioh, 0) & 0x03) + if ((c & PMS_OBUF_FULL) == PMS_OBUF_FULL) { + /* XXX - delay is needed to prevent some keyboards from + wedging when the system boots */ + delay(6); + (void) bus_io_read_1(pms_bc, pms_data_ioh, 0); + } +} + +static inline void +pms_dev_cmd(value) + u_char value; +{ + + pms_flush(); + bus_io_write_1(pms_bc, pms_cntrl_ioh, 0, 0xd4); + pms_flush(); + bus_io_write_1(pms_bc, pms_data_ioh, 0, value); +} + +static inline void +pms_aux_cmd(value) + u_char value; +{ + + pms_flush(); + bus_io_write_1(pms_bc, pms_cntrl_ioh, 0, value); +} + +static inline void +pms_pit_cmd(value) + u_char value; +{ + + pms_flush(); + bus_io_write_1(pms_bc, pms_cntrl_ioh, 0, 0x60); + pms_flush(); + bus_io_write_1(pms_bc, pms_data_ioh, 0, value); +} + +int +pmsprobe(parent, match, aux) + struct device *parent; + void *match, *aux; +{ + struct isa_attach_args *ia = aux; + u_char x; + + pms_bc = ia->ia_bc; + + if (ia->ia_iobase != 0x60) + return 0; + + if (bus_io_map(pms_bc, PMS_DATA, 1, &pms_data_ioh) || + bus_io_map(pms_bc, PMS_CNTRL, 1, &pms_cntrl_ioh)) + return 0; + + pms_dev_cmd(PMS_RESET); + pms_aux_cmd(PMS_AUX_TEST); + delay(1000); + x = bus_io_read_1(pms_bc, pms_data_ioh, 0); + pms_pit_cmd(PMS_INT_DISABLE); + if (x & 0x04) + return 0; + + ia->ia_iosize = PMS_NPORTS; + ia->ia_msize = 0; + return 1; +} + +void +pmsattach(parent, self, aux) + struct device *parent, *self; + void *aux; +{ + struct pms_softc *sc = (void *)self; + struct isa_attach_args *ia = aux; + + pms_bc = ia->ia_bc; + pms_ic = ia->ia_ic; + + if (bus_io_map(pms_bc, PMS_DATA, 1, &pms_data_ioh) || + bus_io_map(pms_bc, PMS_CNTRL, 1, &pms_cntrl_ioh)) { + printf(": can't map I/O ports!\n"); + return; + } + + msattach(self, &pms_mdev_spec); + + printf("\n"); + + /* Other initialization was done by pmsprobe. */ + sc->sc_state = 0; + + sc->sc_ih = isa_intr_establish(pms_ic, ia->ia_irq, IST_EDGE, IPL_TTY, + pmsintr, sc); +} + +int +pms_enable(dev) + struct device *dev; +{ + struct pms_softc *sc = (struct pms_softc *)dev; + + if (sc->sc_state & PMS_OPEN) + return EBUSY; + + sc->sc_state |= PMS_OPEN; + sc->sc_status = 0; + sc->sc_x = sc->sc_y = 0; + + /* Enable interrupts. */ + pms_dev_cmd(PMS_DEV_ENABLE); + pms_aux_cmd(PMS_AUX_ENABLE); +#if 0 + pms_dev_cmd(PMS_SET_RES); + pms_dev_cmd(3); /* 8 counts/mm */ + pms_dev_cmd(PMS_SET_SCALE21); + pms_dev_cmd(PMS_SET_SAMPLE); + pms_dev_cmd(100); /* 100 samples/sec */ + pms_dev_cmd(PMS_SET_STREAM); +#endif + pms_pit_cmd(PMS_INT_ENABLE); + + return 0; +} + +int +pms_disable(dev) + struct device *dev; +{ + struct pms_softc *sc = (struct pms_softc *)dev; + + /* Disable interrupts. */ + pms_dev_cmd(PMS_DEV_DISABLE); + pms_pit_cmd(PMS_INT_DISABLE); + pms_aux_cmd(PMS_AUX_DISABLE); + + sc->sc_state &= ~PMS_OPEN; + + return 0; +} + +/* Masks for the first byte of a packet */ +#define PS2LBUTMASK 0x01 +#define PS2RBUTMASK 0x02 +#define PS2MBUTMASK 0x04 + +int +pmsintr(arg) + void *arg; +{ + struct pms_softc *sc = arg; + static int state = 0; + static u_char buttons; + u_char changed; + static char dx, dy; + u_char buffer[5]; + + if ((sc->sc_state & PMS_OPEN) == 0) { + /* Interrupts are not expected. Discard the byte. */ + pms_flush(); + return 0; + } + + switch (state) { + + case 0: + buttons = bus_io_read_1(pms_bc, pms_data_ioh, 0); + if ((buttons & 0xc0) == 0) + ++state; + break; + + case 1: + dx = bus_io_read_1(pms_bc, pms_data_ioh, 0); + /* Bounding at -127 avoids a bug in XFree86. */ + dx = (dx == -128) ? -127 : dx; + ++state; + break; + + case 2: + dy = bus_io_read_1(pms_bc, pms_data_ioh, 0); + dy = (dy == -128) ? -127 : dy; + state = 0; + + buttons = ((buttons & PS2LBUTMASK) << 2) | + ((buttons & (PS2RBUTMASK | PS2MBUTMASK)) >> 1); + changed = (buttons ^ sc->sc_status); + sc->sc_status = buttons; + + if (dx || dy || changed) + ms_event(buttons, dx, dy); + break; + } + + return -1; +} diff --git a/sys/arch/alpha/isa/spkrreg.h b/sys/arch/alpha/isa/spkrreg.h new file mode 100644 index 00000000000..66bdf7f6651 --- /dev/null +++ b/sys/arch/alpha/isa/spkrreg.h @@ -0,0 +1,11 @@ +/* $NetBSD: spkrreg.h,v 1.1 1996/04/12 01:54:46 cgd Exp $ */ + +/* + * PIT port addresses and speaker control values + */ + +#define PITAUX_PORT 0x61 /* port of Programmable Peripheral Interface */ +#define PIT_ENABLETMR2 0x01 /* Enable timer/counter 2 */ +#define PIT_SPKRDATA 0x02 /* Direct to speaker */ + +#define PIT_SPKR (PIT_ENABLETMR2|PIT_SPKRDATA) diff --git a/sys/arch/alpha/isa/timerreg.h b/sys/arch/alpha/isa/timerreg.h new file mode 100644 index 00000000000..04f2804f2b7 --- /dev/null +++ b/sys/arch/alpha/isa/timerreg.h @@ -0,0 +1,100 @@ +/* $NetBSD: timerreg.h,v 1.1 1996/04/12 01:54:56 cgd Exp $ */ + +/*- + * Copyright (c) 1993 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * Register definitions for the Intel 8253 Programmable Interval Timer. + * + * This chip has three independent 16-bit down counters that can be + * read on the fly. There are three mode registers and three countdown + * registers. The countdown registers are addressed directly, via the + * first three I/O ports. The three mode registers are accessed via + * the fourth I/O port, with two bits in the mode byte indicating the + * register. (Why are hardware interfaces always so braindead?). + * + * To write a value into the countdown register, the mode register + * is first programmed with a command indicating the which byte of + * the two byte register is to be modified. The three possibilities + * are load msb (TMR_MR_MSB), load lsb (TMR_MR_LSB), or load lsb then + * msb (TMR_MR_BOTH). + * + * To read the current value ("on the fly") from the countdown register, + * you write a "latch" command into the mode register, then read the stable + * value from the corresponding I/O port. For example, you write + * TMR_MR_LATCH into the corresponding mode register. Presumably, + * after doing this, a write operation to the I/O port would result + * in undefined behavior (but hopefully not fry the chip). + * Reading in this manner has no side effects. + * + * The outputs of the three timers are connected as follows: + * + * timer 0 -> irq 0 + * timer 1 -> dma chan 0 (for dram refresh) + * timer 2 -> speaker (via keyboard controller) + * + * Timer 0 is used to call hardclock. + * Timer 2 is used to generate console beeps. + */ + +/* + * Frequency of all three count-down timers; (TIMER_FREQ/freq) is the + * appropriate count to generate a frequency of freq hz. + */ +#ifndef TIMER_FREQ +#define TIMER_FREQ 1193182 +#endif +#define TIMER_DIV(x) ((TIMER_FREQ+(x)/2)/(x)) + +/* + * Macros for specifying values to be written into a mode register. + */ +#define TIMER_CNTR0 0 /* timer 0 counter port */ +#define TIMER_CNTR1 1 /* timer 1 counter port */ +#define TIMER_CNTR2 2 /* timer 2 counter port */ +#define TIMER_MODE 3 /* timer mode port */ +#define TIMER_SEL0 0x00 /* select counter 0 */ +#define TIMER_SEL1 0x40 /* select counter 1 */ +#define TIMER_SEL2 0x80 /* select counter 2 */ +#define TIMER_INTTC 0x00 /* mode 0, intr on terminal cnt */ +#define TIMER_ONESHOT 0x02 /* mode 1, one shot */ +#define TIMER_RATEGEN 0x04 /* mode 2, rate generator */ +#define TIMER_SQWAVE 0x06 /* mode 3, square wave */ +#define TIMER_SWSTROBE 0x08 /* mode 4, s/w triggered strobe */ +#define TIMER_HWSTROBE 0x0a /* mode 5, h/w triggered strobe */ +#define TIMER_LATCH 0x00 /* latch counter for reading */ +#define TIMER_LSB 0x10 /* r/w counter LSB */ +#define TIMER_MSB 0x20 /* r/w counter MSB */ +#define TIMER_16BIT 0x30 /* r/w counter 16 bits, LSB first */ +#define TIMER_BCD 0x01 /* count in BCD */ + diff --git a/sys/arch/alpha/pci/apecs.c b/sys/arch/alpha/pci/apecs.c index 76fd9fec019..ec858ee1bab 100644 --- a/sys/arch/alpha/pci/apecs.c +++ b/sys/arch/alpha/pci/apecs.c @@ -1,7 +1,7 @@ -/* $NetBSD: apecs.c,v 1.4 1995/11/23 02:37:11 cgd Exp $ */ +/* $NetBSD: apecs.c,v 1.7 1996/04/12 06:08:01 cgd Exp $ */ /* - * Copyright (c) 1995 Carnegie-Mellon University. + * Copyright (c) 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -44,18 +44,20 @@ #include <dev/pci/pcivar.h> #include <alpha/pci/apecsreg.h> #include <alpha/pci/apecsvar.h> +#include <alpha/pci/pci_2100_a50.h> int apecsmatch __P((struct device *, void *, void *)); void apecsattach __P((struct device *, struct device *, void *)); -struct cfdriver apecscd = { - NULL, "apecs", apecsmatch, apecsattach, DV_DULL, - sizeof(struct apecs_softc) +struct cfattach apecs_ca = { + sizeof(struct apecs_softc), apecsmatch, apecsattach, }; -static int apecsprint __P((void *, char *pnp)); +struct cfdriver apecs_cd = { + NULL, "apecs", DV_DULL, +}; -#define REGVAL(r) (*(int32_t *)phystok0seg(r)) +static int apecsprint __P((void *, char *pnp)); /* There can be only one. */ int apecsfound; @@ -70,7 +72,7 @@ apecsmatch(parent, match, aux) struct confargs *ca = aux; /* Make sure that we're looking for an APECS. */ - if (strcmp(ca->ca_name, apecscd.cd_name) != 0) + if (strcmp(ca->ca_name, apecs_cd.cd_name) != 0) return (0); if (apecsfound) @@ -98,15 +100,9 @@ apecs_init(acp) * Can't set up SGMAP data here; can be called before malloc(). */ - acp->ac_conffns = &apecs_conf_fns; - acp->ac_confarg = acp; - acp->ac_dmafns = &apecs_dma_fns; - acp->ac_dmaarg = acp; - /* Interrupt routines set up in 'attach' */ - acp->ac_memfns = &apecs_mem_fns; - acp->ac_memarg = acp; - acp->ac_piofns = &apecs_pio_fns; - acp->ac_pioarg = acp; + apecs_lca_bus_io_init(&acp->ac_bc, acp); + apecs_lca_bus_mem_init(&acp->ac_bc, acp); + apecs_pci_init(&acp->ac_pc, acp); /* Turn off DMA window enables in PCI Base Reg 1. */ REGVAL(EPIC_PCI_BASE_1) = 0; @@ -120,10 +116,9 @@ apecsattach(parent, self, aux) struct device *parent, *self; void *aux; { - struct confargs *ca = aux; struct apecs_softc *sc = (struct apecs_softc *)self; struct apecs_config *acp; - struct pci_attach_args pa; + struct pcibus_attach_args pba; /* note that we've attached the chipset; can't have 2 APECSes. */ apecsfound = 1; @@ -151,31 +146,18 @@ apecsattach(parent, self, aux) switch (hwrpb->rpb_type) { #if defined(DEC_2100_A50) case ST_DEC_2100_A50: - pci_2100_a50_pickintr(acp->ac_conffns, acp->ac_confarg, - acp->ac_piofns, acp->ac_pioarg, - &acp->ac_intrfns, &acp->ac_intrarg); + pci_2100_a50_pickintr(acp); break; #endif default: panic("apecsattach: shouldn't be here, really..."); } - pa.pa_bus = 0; - pa.pa_maxdev = 32; - pa.pa_burstlog2 = 8; - - pa.pa_conffns = acp->ac_conffns; - pa.pa_confarg = acp->ac_confarg; - pa.pa_dmafns = acp->ac_dmafns; - pa.pa_dmaarg = acp->ac_dmaarg; - pa.pa_intrfns = acp->ac_intrfns; - pa.pa_intrarg = acp->ac_intrarg; - pa.pa_memfns = acp->ac_memfns; - pa.pa_memarg = acp->ac_memarg; - pa.pa_piofns = acp->ac_piofns; - pa.pa_pioarg = acp->ac_pioarg; - - config_found(self, &pa, apecsprint); + pba.pba_busname = "pci"; + pba.pba_bc = &acp->ac_bc; + pba.pba_pc = &acp->ac_pc; + pba.pba_bus = 0; + config_found(self, &pba, apecsprint); } static int @@ -183,11 +165,11 @@ apecsprint(aux, pnp) void *aux; char *pnp; { - register struct pci_attach_args *pa = aux; + register struct pcibus_attach_args *pba = aux; /* only PCIs can attach to APECSes; easy. */ if (pnp) - printf("pci at %s", pnp); - printf(" bus %d", pa->pa_bus); + printf("%s at %s", pba->pba_busname, pnp); + printf(" bus %d", pba->pba_bus); return (UNCONF); } diff --git a/sys/arch/alpha/pci/apecs_isa.c b/sys/arch/alpha/pci/apecs_isa.c deleted file mode 100644 index 1d2729475dc..00000000000 --- a/sys/arch/alpha/pci/apecs_isa.c +++ /dev/null @@ -1,346 +0,0 @@ -/* $NetBSD: apecs_isa.c,v 1.4 1995/11/23 02:37:13 cgd Exp $ */ - -/* - * Copyright (c) 1995 Carnegie-Mellon University. - * All rights reserved. - * - * Author: Chris G. Demetriou - * - * Permission to use, copy, modify and distribute this software and - * its documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND - * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie the - * rights to redistribute these changes. - */ - -#include <sys/param.h> -#include <sys/malloc.h> -#include <sys/syslog.h> -#include <sys/device.h> -#include <vm/vm.h> - -#include <dev/isa/isavar.h> - -#include <alpha/pci/apecsreg.h> -#include <alpha/pci/apecsvar.h> - -/* - * Allocation/deallocation functions. - */ -int apecs_pio_alloc __P((void *, isa_iooffset_t, isa_iosize_t)); -int apecs_pio_dealloc __P((void *, isa_iooffset_t, isa_iosize_t)); - -/* - * Byte functions. - */ -isa_byte_t apecs_inb __P((void *, isa_iooffset_t)); -#define apecs_insb 0 /* XXX */ -void apecs_outb __P((void *, isa_iooffset_t, isa_byte_t)); -#define apecs_outsb 0 /* XXX */ - -/* - * Word functions. - */ -isa_word_t apecs_inw __P((void *, isa_iooffset_t)); -#define apecs_insw 0 /* XXX */ -void apecs_outw __P((void *, isa_iooffset_t, isa_word_t)); -#define apecs_outsw 0 /* XXX */ - -/* - * Longword functions. - */ -isa_long_t apecs_inl __P((void *, isa_iooffset_t)); -#define apecs_insl 0 /* XXX */ -void apecs_outl __P((void *, isa_iooffset_t, isa_long_t)); -#define apecs_outsl 0 /* XXX */ - -__const struct pci_pio_fns apecs_pio_fns = { - /* Allocation/deallocation functions. */ - apecs_pio_alloc, apecs_pio_dealloc, - - /* Byte functions. */ - apecs_inb, apecs_insb, - apecs_outb, apecs_outsb, - - /* Word functions. */ - apecs_inw, apecs_insw, - apecs_outw, apecs_outsw, - - /* Longword functions. */ - apecs_inl, apecs_insl, - apecs_outl, apecs_outsl, -}; - -int -apecs_pio_alloc(ipfarg, start, size) - void *ipfarg; - isa_iooffset_t start; - isa_iosize_t size; -{ - - /* XXX should do something */ -} - -int -apecs_pio_dealloc(ipfarg, start, size) - void *ipfarg; - isa_iooffset_t start; - isa_iosize_t size; -{ - - /* XXX should do something */ -} - -isa_byte_t -apecs_inb(ipfa, ioaddr) - void *ipfa; - isa_iooffset_t ioaddr; -{ - u_int32_t *port, val; - isa_byte_t rval; - int offset; - - wbflush(); - offset = ioaddr & 3; - port = (int32_t *)phystok0seg(APECS_PCI_SIO | 0 << 3 | ioaddr << 5); - val = *port; - rval = ((val) >> (8 * offset)) & 0xff; -/* rval = val & 0xff; */ - - return rval; -} - -void -apecs_outb(ipfa, ioaddr, val) - void *ipfa; - isa_iooffset_t ioaddr; - isa_byte_t val; -{ - u_int32_t *port, nval; - int offset; - - offset = ioaddr & 3; - nval = val /*<< (8 * offset)*/; - nval = val << (8 * offset); - port = (int32_t *)phystok0seg(APECS_PCI_SIO | 0 << 3 | ioaddr << 5); - - *port = nval; - wbflush(); -} - -isa_word_t -apecs_inw(ipfa, ioaddr) - void *ipfa; - isa_iooffset_t ioaddr; -{ - u_int32_t *port, val; - isa_word_t rval; - int offset; - - wbflush(); - offset = ioaddr & 3; - port = (int32_t *)phystok0seg(APECS_PCI_SIO | 1 << 3 | ioaddr << 5); - val = *port; - rval = ((val) >> (8 * offset)) & 0xffff; - rval = val & 0xffff; - -panic("inw(0x%x) => 0x%x @ %p => 0x%x\n", ioaddr, val, port, rval); - - return rval; -} - -void -apecs_outw(ipfa, ioaddr, val) - void *ipfa; - isa_iooffset_t ioaddr; - isa_word_t val; -{ - u_int32_t *port, nval; - int offset; - - offset = ioaddr & 3; - nval = val /*<< (8 * offset)*/; - port = (int32_t *)phystok0seg(APECS_PCI_SIO | 1 << 3 | ioaddr << 5); - - *port = nval; - wbflush(); -} - -isa_long_t -apecs_inl(ipfa, ioaddr) - void *ipfa; - isa_iooffset_t ioaddr; -{ - u_int32_t *port, val; - isa_long_t rval; - int offset; - - wbflush(); - offset = ioaddr & 3; - port = (int32_t *)phystok0seg(APECS_PCI_SIO | 3 << 3 | ioaddr << 5); - val = *port; - rval = ((val) >> (8 * offset)) & 0xffffffff; - rval = val & 0xffffffff; - - return rval; -} - -void -apecs_outl(ipfa, ioaddr, val) - void *ipfa; - isa_iooffset_t ioaddr; - isa_long_t val; -{ - u_int32_t *port, nval; - int offset; - - offset = ioaddr & 3; - nval = val /*<< (8 * offset)*/; - port = (int32_t *)phystok0seg(APECS_PCI_SIO | 3 << 3 | ioaddr << 5); - - *port = nval; - wbflush(); -} - -/* XXX XXX XXX */ - -#define pf(fn, args) fn args { panic(__STRING(fn)); } - -void pf(apecs_dma_cascade, (void *idfa, isa_drq_t chan)) -void pf(apecs_dma_copytobuf, ()) -void pf(apecs_dma_copyfrombuf, ()) -void pf(apecs_dma_start, (void *idfa, vm_offset_t addr, - isa_msize_t size, isa_drq_t chan, int flags)) -void pf(apecs_dma_abort, (void *idfa, isa_drq_t chan)) -void pf(apecs_dma_done, (void *idfa, isa_drq_t chan)) - -int apecs_dma_map __P((void *, vm_offset_t, isa_msize_t, - isa_moffset_t *, int)); -void apecs_dma_unmap __P((void *, vm_offset_t, isa_msize_t, int, - isa_moffset_t *)); - -__const struct isa_dma_fns apecs_dma_fns = { - apecs_dma_cascade, - apecs_dma_map, - apecs_dma_unmap, - apecs_dma_copytobuf, - apecs_dma_copyfrombuf, - apecs_dma_start, - apecs_dma_abort, - apecs_dma_done, -}; - -int -apecs_dma_map(idfa, va, isasize, mappingsp, flags) - void *idfa; - vm_offset_t va; - isa_msize_t isasize; - isa_moffset_t *mappingsp; - int flags; -{ - struct apecs_config *acp = idfa; - long todo; - int i; - - if (ISA_DMA_NEEDCONTIG(flags) && isasize > NBPG || - ISA_DMA_SIZEBOUND(flags) != ISA_DMA_SIZEBOUND_NONE || - ISA_DMA_ADDRBOUND(flags) != ISA_DMA_ADDRBOUND_NONE) - panic("apecs_dma_map: punt"); - - i = 0; - todo = isasize; - - while (todo > 0) { - mappingsp[i] = vtophys(va) | 0x40000000; -#if 0 - printf("a_pd_m mapping %d: %lx -> %lx -> %lx\n", i, va, - vtophys(va), mappingsp[i]); -#endif - i++; - todo -= PAGE_SIZE - (va - trunc_page(va)); - va += PAGE_SIZE - (va - trunc_page(va)); - } - return (i); -} - -void -apecs_dma_unmap(idfa, va, isasize, nmappings, mappingsp) - void *idfa; - vm_offset_t va; - isa_msize_t isasize; - int nmappings; - isa_moffset_t *mappingsp; -{ - - printf("apecs_dma_unmap: called\n"); -} - -vm_offset_t apecs_mem_map __P((void *, isa_moffset_t, isa_msize_t, int)); -void apecs_mem_unmap __P((void *, vm_offset_t, isa_msize_t)); - -#if 0 -void apecs_mem_copytoisa __P((void *, char *, vm_offset_t, - isa_moffset_t, isa_msize_t)); -void apecs_mem_copyfromisa __P((void *, char *, vm_offset_t, - isa_moffset_t, isa_msize_t)); -void apecs_mem_zero __P((void *, vm_offset_t, isa_moffset_t, - isa_msize_t)); -#else -void pf(apecs_mem_copytoisa, ()) -void pf(apecs_mem_copyfromisa, ()) -void pf(apecs_mem_zero, ()) -#endif - -__const struct isa_mem_fns apecs_mem_fns = { - apecs_mem_map, - apecs_mem_unmap, - apecs_mem_copytoisa, - apecs_mem_copyfromisa, - apecs_mem_zero, -}; - -vm_offset_t -apecs_mem_map(imfa, isapa, isasize, cacheable) - void *imfa; - isa_moffset_t isapa; - isa_msize_t isasize; - int cacheable; -{ - vm_offset_t sbpa; - - /* XXX sanity checks on sizes, use of windows, etc. */ - - /* XXX MAGIC NUMBERS */ - if (cacheable) - sbpa = (isapa & 0xffffffff) | APECS_PCI_DENSE; - else - sbpa = ((isapa & 0x7ffffff) << 5) | APECS_PCI_SPARSE; - - return phystok0seg(sbpa); -} - -void -apecs_mem_unmap(imfa, va, isasize) - void *imfa; - vm_offset_t va; - isa_msize_t isasize; -{ - - /* XXX sanity checks on va */ - - /* Nothing to do; mapping was done in direct-mapped segment. */ -} diff --git a/sys/arch/alpha/pci/apecs_lca_bus_io.c b/sys/arch/alpha/pci/apecs_lca_bus_io.c new file mode 100644 index 00000000000..22e1aa3f050 --- /dev/null +++ b/sys/arch/alpha/pci/apecs_lca_bus_io.c @@ -0,0 +1,59 @@ +/* $NetBSD: apecs_lca_bus_io.c,v 1.2.4.1 1996/06/13 18:14:55 cgd Exp $ */ + +/* + * Copyright (c) 1996 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ + +#include <sys/param.h> +#include <sys/malloc.h> +#include <sys/syslog.h> +#include <sys/device.h> +#include <vm/vm.h> + +#include <machine/bus.h> + +#include <alpha/pci/apecsreg.h> +#include <alpha/pci/lcareg.h> + +#if (APECS_PCI_SIO != LCA_PCI_SIO) +#error Sparse I/O addresses do not match up? +#endif + +#define CHIP apecs_lca + +/* IO region 1 */ +#define CHIP_IO_W1_START(v) 0x00000000 +#define CHIP_IO_W1_END(v) 0x0003ffff +#define CHIP_IO_W1_BASE(v) APECS_PCI_SIO +#define CHIP_IO_W1_MASK(v) 0x00ffffff + +/* IO region 2 */ +#define CHIP_IO_W2_START(v) 0x00040000 /* XXX from HAXR2 */ +#define CHIP_IO_W2_END(v) 0xfffbffff /* XXX from HAXR2 */ +#define CHIP_IO_W2_BASE(v) APECS_PCI_SIO +#define CHIP_IO_W2_MASK(v) 0x00ffffff + +#include "pcs_bus_io_common.c" diff --git a/sys/arch/alpha/pci/apecs_lca_bus_mem.c b/sys/arch/alpha/pci/apecs_lca_bus_mem.c new file mode 100644 index 00000000000..72a892c37fe --- /dev/null +++ b/sys/arch/alpha/pci/apecs_lca_bus_mem.c @@ -0,0 +1,65 @@ +/* $NetBSD: apecs_lca_bus_mem.c,v 1.2.4.2 1996/06/13 18:14:58 cgd Exp $ */ + +/* + * Copyright (c) 1996 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ + +#include <sys/param.h> +#include <sys/malloc.h> +#include <sys/syslog.h> +#include <sys/device.h> +#include <vm/vm.h> + +#include <machine/bus.h> + +#include <alpha/pci/apecsreg.h> +#include <alpha/pci/lcareg.h> + +#if (APECS_PCI_SPARSE != LCA_PCI_SPARSE) || (APECS_PCI_DENSE != LCA_PCI_DENSE) +#error Memory addresses do not match up? +#endif + +#define CHIP apecs_lca + +/* Dense region 1 */ +#define CHIP_D_MEM_W1_START(v) 0x00000000 +#define CHIP_D_MEM_W1_END(v) 0xffffffff +#define CHIP_D_MEM_W1_BASE(v) APECS_PCI_DENSE +#define CHIP_D_MEM_W1_MASK(v) 0xffffffff + +/* Sparse region 1 */ +#define CHIP_S_MEM_W1_START(v) 0x00000000 +#define CHIP_S_MEM_W1_END(v) 0x00ffffff +#define CHIP_S_MEM_W1_BASE(v) APECS_PCI_SPARSE +#define CHIP_S_MEM_W1_MASK(v) 0x07ffffff + +/* Sparse region 2 */ +#define CHIP_S_MEM_W2_START(v) 0x01000000 /* XXX from HAXR1 */ +#define CHIP_S_MEM_W2_END(v) 0xfeffffff /* XXX from HAXR1 */ +#define CHIP_S_MEM_W2_BASE(v) APECS_PCI_SPARSE +#define CHIP_S_MEM_W2_MASK(v) 0x07ffffff + +#include "pcs_bus_mem_common.c" diff --git a/sys/arch/alpha/pci/apecs_pci.c b/sys/arch/alpha/pci/apecs_pci.c index 42be1862efa..0c30c45ecba 100644 --- a/sys/arch/alpha/pci/apecs_pci.c +++ b/sys/arch/alpha/pci/apecs_pci.c @@ -1,7 +1,7 @@ -/* $NetBSD: apecs_pci.c,v 1.4 1995/11/23 02:37:16 cgd Exp $ */ +/* $NetBSD: apecs_pci.c,v 1.6 1996/04/12 06:08:09 cgd Exp $ */ /* - * Copyright (c) 1995 Carnegie-Mellon University. + * Copyright (c) 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -38,33 +38,83 @@ #include <alpha/pci/apecsreg.h> #include <alpha/pci/apecsvar.h> -pci_confreg_t apecs_conf_read __P((void *, pci_conftag_t, pci_confoffset_t)); -void apecs_conf_write __P((void *, pci_conftag_t, - pci_confoffset_t, pci_confreg_t)); -int apecs_find_io __P((void *, pci_conftag_t, - pci_confoffset_t, pci_iooffset_t *, pci_iosize_t *)); -int apecs_find_mem __P((void *, pci_conftag_t, - pci_confoffset_t, pci_moffset_t *, pci_msize_t *, int *)); - -__const struct pci_conf_fns apecs_conf_fns = { - apecs_conf_read, - apecs_conf_write, - apecs_find_io, - apecs_find_mem, -}; - -pci_confreg_t +void apecs_attach_hook __P((struct device *, struct device *, + struct pcibus_attach_args *)); +int apecs_bus_maxdevs __P((void *, int)); +pcitag_t apecs_make_tag __P((void *, int, int, int)); +void apecs_decompose_tag __P((void *, pcitag_t, int *, int *, + int *)); +pcireg_t apecs_conf_read __P((void *, pcitag_t, int)); +void apecs_conf_write __P((void *, pcitag_t, int, pcireg_t)); + +void +apecs_pci_init(pc, v) + pci_chipset_tag_t pc; + void *v; +{ + + pc->pc_conf_v = v; + pc->pc_attach_hook = apecs_attach_hook; + pc->pc_bus_maxdevs = apecs_bus_maxdevs; + pc->pc_make_tag = apecs_make_tag; + pc->pc_decompose_tag = apecs_decompose_tag; + pc->pc_conf_read = apecs_conf_read; + pc->pc_conf_write = apecs_conf_write; +} + +void +apecs_attach_hook(parent, self, pba) + struct device *parent, *self; + struct pcibus_attach_args *pba; +{ +} + +int +apecs_bus_maxdevs(cpv, busno) + void *cpv; + int busno; +{ + + return 32; +} + +pcitag_t +apecs_make_tag(cpv, b, d, f) + void *cpv; + int b, d, f; +{ + + return (b << 16) | (d << 11) | (f << 8); +} + +void +apecs_decompose_tag(cpv, tag, bp, dp, fp) + void *cpv; + pcitag_t tag; + int *bp, *dp, *fp; +{ + + if (bp != NULL) + *bp = (tag >> 16) & 0xff; + if (dp != NULL) + *dp = (tag >> 11) & 0x1f; + if (fp != NULL) + *fp = (tag >> 8) & 0x7; +} + +pcireg_t apecs_conf_read(cpv, tag, offset) void *cpv; - pci_conftag_t tag; - pci_confoffset_t offset; + pcitag_t tag; + int offset; { struct apecs_config *acp = cpv; - pci_confreg_t *datap, data; + pcireg_t *datap, data; int s, secondary, ba; int32_t old_haxr2; /* XXX */ - secondary = PCI_TAG_BUS(tag) != 0; + /* secondary if bus # != 0 */ + pci_decompose_tag(&acp->ac_pc, tag, &secondary, 0, 0); if (secondary) { s = splhigh(); old_haxr2 = REGVAL(EPIC_HAXR2); @@ -73,12 +123,12 @@ apecs_conf_read(cpv, tag, offset) wbflush(); } - datap = (pci_confreg_t *)phystok0seg(APECS_PCI_CONF | + datap = (pcireg_t *)phystok0seg(APECS_PCI_CONF | tag << 5UL | /* XXX */ (offset & ~0x03) << 5 | /* XXX */ 0 << 5 | /* XXX */ 0x3 << 3); /* XXX */ - data = (pci_confreg_t)-1; + data = (pcireg_t)-1; if (!(ba = badaddr(datap, sizeof *datap))) data = *datap; @@ -100,16 +150,17 @@ apecs_conf_read(cpv, tag, offset) void apecs_conf_write(cpv, tag, offset, data) void *cpv; - pci_conftag_t tag; - pci_confoffset_t offset; - pci_confreg_t data; + pcitag_t tag; + int offset; + pcireg_t data; { struct apecs_config *acp = cpv; - pci_confreg_t *datap; + pcireg_t *datap; int s, secondary; int32_t old_haxr2; /* XXX */ - secondary = PCI_TAG_BUS(tag) != 0; + /* secondary if bus # != 0 */ + pci_decompose_tag(&acp->ac_pc, tag, &secondary, 0, 0); if (secondary) { s = splhigh(); old_haxr2 = REGVAL(EPIC_HAXR2); @@ -118,7 +169,7 @@ apecs_conf_write(cpv, tag, offset, data) wbflush(); } - datap = (pci_confreg_t *)phystok0seg(APECS_PCI_CONF | + datap = (pcireg_t *)phystok0seg(APECS_PCI_CONF | tag << 5UL | /* XXX */ (offset & ~0x03) << 5 | /* XXX */ 0 << 5 | /* XXX */ @@ -137,86 +188,3 @@ apecs_conf_write(cpv, tag, offset, data) reg, data, datap); #endif } - -int -apecs_find_io(cpv, tag, reg, iobasep, sizep) - void *cpv; - pci_conftag_t tag; - pci_confoffset_t reg; - pci_iooffset_t *iobasep; - pci_iosize_t *sizep; -{ - struct apecs_config *acp = cpv; - pci_confreg_t addrdata, sizedata; - pci_iooffset_t pci_iobase; - - if (reg < PCI_MAPREG_START || reg >= PCI_MAPREG_END || (reg & 3)) - panic("apecs_map_io: bad request"); - - addrdata = PCI_CONF_READ(acp->ac_conffns, acp->ac_confarg, tag, reg); - - PCI_CONF_WRITE(acp->ac_conffns, acp->ac_confarg, tag, reg, 0xffffffff); - sizedata = PCI_CONF_READ(acp->ac_conffns, acp->ac_confarg, tag, reg); - PCI_CONF_WRITE(acp->ac_conffns, acp->ac_confarg, tag, reg, addrdata); - - if (PCI_MAPREG_TYPE(addrdata) == PCI_MAPREG_TYPE_MEM) - panic("apecs_map_io: attempt to I/O map an memory region"); - - if (iobasep != NULL) - *iobasep = PCI_MAPREG_IO_ADDRESS(addrdata); - if (sizep != NULL) - *sizep = ~PCI_MAPREG_IO_ADDRESS(sizedata) + 1; - - return (0); -} - -int -apecs_find_mem(cpv, tag, reg, paddrp, sizep, cacheablep) - void *cpv; - pci_conftag_t tag; - pci_confoffset_t reg; - pci_moffset_t *paddrp; - pci_msize_t *sizep; - int *cacheablep; -{ - struct apecs_config *acp = cpv; - pci_confreg_t addrdata, sizedata; - - if (reg < PCI_MAPREG_START || reg >= PCI_MAPREG_END || (reg & 3)) - panic("apecs_map_mem: bad request"); - - /* - * The PROM has mapped the device for us. We take the address - * that's been assigned to the register, and figure out what - * physical and virtual addresses go with it... - */ - addrdata = PCI_CONF_READ(acp->ac_conffns, acp->ac_confarg, tag, reg); - - PCI_CONF_WRITE(acp->ac_conffns, acp->ac_confarg, tag, reg, 0xffffffff); - sizedata = PCI_CONF_READ(acp->ac_conffns, acp->ac_confarg, tag, reg); - PCI_CONF_WRITE(acp->ac_conffns, acp->ac_confarg, tag, reg, addrdata); - - if (PCI_MAPREG_TYPE(addrdata) == PCI_MAPREG_TYPE_IO) - panic("apecs_map_mem: attempt to memory map an I/O region"); - - switch (PCI_MAPREG_MEM_TYPE(addrdata)) { - case PCI_MAPREG_MEM_TYPE_32BIT: - case PCI_MAPREG_MEM_TYPE_32BIT_1M: - break; - case PCI_MAPREG_MEM_TYPE_64BIT: -/* XXX */ printf("apecs_map_mem: attempt to map 64-bit region\n"); -/* XXX */ break; - default: - printf("apecs_map_mem: reserved mapping type\n"); - return EINVAL; - } - - if (paddrp != NULL) - *paddrp = PCI_MAPREG_MEM_ADDRESS(addrdata); /* PCI addr */ - if (sizep != NULL) - *sizep = ~PCI_MAPREG_MEM_ADDRESS(sizedata) + 1; - if (cacheablep != NULL) - *cacheablep = PCI_MAPREG_MEM_CACHEABLE(addrdata); - - return 0; -} diff --git a/sys/arch/alpha/pci/apecsvar.h b/sys/arch/alpha/pci/apecsvar.h index a63cc275922..fe4cfdeba47 100644 --- a/sys/arch/alpha/pci/apecsvar.h +++ b/sys/arch/alpha/pci/apecsvar.h @@ -1,21 +1,21 @@ -/* $NetBSD: apecsvar.h,v 1.1 1995/11/23 02:37:21 cgd Exp $ */ +/* $NetBSD: apecsvar.h,v 1.3 1996/04/12 06:08:14 cgd Exp $ */ /* - * Copyright (c) 1995 Carnegie-Mellon University. + * Copyright (c) 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou - * + * * Permission to use, copy, modify and distribute this software and * its documentation is hereby granted, provided that both the copyright * notice and this permission notice appear in all copies of the * software, derivative works or modified versions, and any portions * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * + * * Carnegie Mellon requests users of this software to return to * * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU @@ -41,20 +41,8 @@ struct apecs_config { int ac_epic_pass2; int ac_memwidth; - __const struct pci_conf_fns *ac_conffns; - void *ac_confarg; - - __const struct pci_dma_fns *ac_dmafns; - void *ac_dmaarg; - - __const struct pci_intr_fns *ac_intrfns; - void *ac_intrarg; - - __const struct pci_mem_fns *ac_memfns; - void *ac_memarg; - - __const struct pci_pio_fns *ac_piofns; - void *ac_pioarg; + struct alpha_bus_chipset ac_bc; + struct alpha_pci_chipset ac_pc; }; struct apecs_softc { @@ -63,10 +51,5 @@ struct apecs_softc { struct apecs_config *sc_acp; }; -extern __const struct pci_conf_fns apecs_conf_fns; -extern __const struct pci_dma_fns apecs_dma_fns; -/* pci interrupt functions handled elsewhere */ -extern __const struct pci_mem_fns apecs_mem_fns; -extern __const struct pci_pio_fns apecs_pio_fns; - void apecs_init __P((struct apecs_config *)); +void apecs_pci_init __P((pci_chipset_tag_t, void *)); diff --git a/sys/arch/alpha/pci/bt485reg.h b/sys/arch/alpha/pci/bt485reg.h index 60623050e8a..6cd8a9258ae 100644 --- a/sys/arch/alpha/pci/bt485reg.h +++ b/sys/arch/alpha/pci/bt485reg.h @@ -1,7 +1,7 @@ -/* $NetBSD: bt485reg.h,v 1.2 1995/08/03 01:17:07 cgd Exp $ */ +/* $NetBSD: bt485reg.h,v 1.4 1996/04/12 06:08:17 cgd Exp $ */ /* - * Copyright (c) 1995 Carnegie-Mellon University. + * Copyright (c) 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -55,3 +55,10 @@ #define BT485_REG_CURSOR_Y_HIGH 0x0f #define BT485_REG_MAX 0x0f + +#define BT485_IREG_STATUS 0x00 +#define BT485_IREG_COMMAND_3 0x01 +#define BT485_IREG_COMMAND_4 0x02 +#define BT485_IREG_RSA 0x20 +#define BT485_IREG_GSA 0x21 +#define BT485_IREG_BSA 0x22 diff --git a/sys/arch/alpha/pci/cia.c b/sys/arch/alpha/pci/cia.c index fa2f49fc6cc..942a5ed0cee 100644 --- a/sys/arch/alpha/pci/cia.c +++ b/sys/arch/alpha/pci/cia.c @@ -1,7 +1,7 @@ -/* $NetBSD: cia.c,v 1.1 1995/11/23 02:37:24 cgd Exp $ */ +/* $NetBSD: cia.c,v 1.5.4.1 1996/06/10 00:02:39 cgd Exp $ */ /* - * Copyright (c) 1995 Carnegie-Mellon University. + * Copyright (c) 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -51,9 +51,12 @@ int ciamatch __P((struct device *, void *, void *)); void ciaattach __P((struct device *, struct device *, void *)); -struct cfdriver ciacd = { - NULL, "cia", ciamatch, ciaattach, DV_DULL, - sizeof(struct cia_softc) +struct cfattach cia_ca = { + sizeof(struct cia_softc), ciamatch, ciaattach, +}; + +struct cfdriver cia_cd = { + NULL, "cia", DV_DULL, }; static int ciaprint __P((void *, char *pnp)); @@ -73,7 +76,7 @@ ciamatch(parent, match, aux) struct confargs *ca = aux; /* Make sure that we're looking for a CIA. */ - if (strcmp(ca->ca_name, ciacd.cd_name) != 0) + if (strcmp(ca->ca_name, cia_cd.cd_name) != 0) return (0); if (ciafound) @@ -94,15 +97,12 @@ cia_init(ccp) * Can't set up SGMAP data here; can be called before malloc(). */ - ccp->cc_conffns = &cia_conf_fns; - ccp->cc_confarg = ccp; - ccp->cc_dmafns = &cia_dma_fns; - ccp->cc_dmaarg = ccp; - /* Interrupt routines set up in 'attach' */ - ccp->cc_memfns = &cia_mem_fns; - ccp->cc_memarg = ccp; - ccp->cc_piofns = &cia_pio_fns; - ccp->cc_pioarg = ccp; + cia_bus_io_init(&ccp->cc_bc, ccp); + cia_bus_mem_init(&ccp->cc_bc, ccp); + cia_pci_init(&ccp->cc_pc, ccp); + + ccp->cc_hae_mem = REGVAL(CIA_CSR_HAE_MEM); + ccp->cc_hae_io = REGVAL(CIA_CSR_HAE_IO); } void @@ -113,7 +113,7 @@ ciaattach(parent, self, aux) struct confargs *ca = aux; struct cia_softc *sc = (struct cia_softc *)self; struct cia_config *ccp; - struct pci_attach_args pa; + struct pcibus_attach_args pba; /* note that we've attached the chipset; can't have 2 CIAs. */ ciafound = 1; @@ -131,9 +131,7 @@ ciaattach(parent, self, aux) switch (hwrpb->rpb_type) { #if defined(DEC_KN20AA) case ST_DEC_KN20AA: - pci_kn20aa_pickintr(ccp->cc_conffns, ccp->cc_confarg, - ccp->cc_piofns, ccp->cc_pioarg, - &ccp->cc_intrfns, &ccp->cc_intrarg); + pci_kn20aa_pickintr(ccp); #ifdef EVCNT_COUNTERS evcnt_attach(self, "intr", &kn20aa_intr_evcnt); #endif @@ -143,22 +141,11 @@ ciaattach(parent, self, aux) panic("ciaattach: shouldn't be here, really..."); } - pa.pa_bus = 0; - pa.pa_maxdev = 32; - pa.pa_burstlog2 = 8; - - pa.pa_conffns = ccp->cc_conffns; - pa.pa_confarg = ccp->cc_confarg; - pa.pa_dmafns = ccp->cc_dmafns; - pa.pa_dmaarg = ccp->cc_dmaarg; - pa.pa_intrfns = ccp->cc_intrfns; - pa.pa_intrarg = ccp->cc_intrarg; - pa.pa_memfns = ccp->cc_memfns; - pa.pa_memarg = ccp->cc_memarg; - pa.pa_piofns = ccp->cc_piofns; - pa.pa_pioarg = ccp->cc_pioarg; - - config_found(self, &pa, ciaprint); + pba.pba_busname = "pci"; + pba.pba_bc = &ccp->cc_bc; + pba.pba_pc = &ccp->cc_pc; + pba.pba_bus = 0; + config_found(self, &pba, ciaprint); } static int @@ -166,11 +153,11 @@ ciaprint(aux, pnp) void *aux; char *pnp; { - register struct pci_attach_args *pa = aux; + register struct pcibus_attach_args *pba = aux; /* only PCIs can attach to CIAs; easy. */ if (pnp) - printf("pci at %s", pnp); - printf(" bus %d", pa->pa_bus); + printf("%s at %s", pba->pba_busname, pnp); + printf(" bus %d", pba->pba_bus); return (UNCONF); } diff --git a/sys/arch/alpha/pci/cia_bus_io.c b/sys/arch/alpha/pci/cia_bus_io.c new file mode 100644 index 00000000000..12934b17687 --- /dev/null +++ b/sys/arch/alpha/pci/cia_bus_io.c @@ -0,0 +1,63 @@ +/* $NetBSD: cia_bus_io.c,v 1.2.4.2 1996/06/13 18:14:59 cgd Exp $ */ + +/* + * Copyright (c) 1996 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ + +#include <sys/param.h> +#include <sys/malloc.h> +#include <sys/syslog.h> +#include <sys/device.h> +#include <vm/vm.h> + +#include <machine/bus.h> + +#include <alpha/pci/ciareg.h> +#include <alpha/pci/ciavar.h> + +#define CHIP cia + +/* IO region 1 */ +#define CHIP_IO_W1_START(v) \ + HAE_IO_REG1_START(((struct cia_config *)(v))->cc_hae_io) +#define CHIP_IO_W1_END(v) \ + (CHIP_IO_W1_START(v) + HAE_IO_REG1_MASK) +#define CHIP_IO_W1_BASE(v) \ + CIA_PCI_SIO1 +#define CHIP_IO_W1_MASK(v) \ + HAE_IO_REG1_MASK + +/* IO region 2 */ +#define CHIP_IO_W2_START(v) \ + HAE_IO_REG2_START(((struct cia_config *)(v))->cc_hae_io) +#define CHIP_IO_W2_END(v) \ + (CHIP_IO_W2_START(v) + HAE_IO_REG2_MASK) +#define CHIP_IO_W2_BASE(v) \ + CIA_PCI_SIO2 +#define CHIP_IO_W2_MASK(v) \ + HAE_IO_REG2_MASK + +#include "pcs_bus_io_common.c" diff --git a/sys/arch/alpha/pci/cia_bus_mem.c b/sys/arch/alpha/pci/cia_bus_mem.c new file mode 100644 index 00000000000..47413db910a --- /dev/null +++ b/sys/arch/alpha/pci/cia_bus_mem.c @@ -0,0 +1,79 @@ +/* $NetBSD: cia_bus_mem.c,v 1.2.4.2 1996/06/13 18:15:01 cgd Exp $ */ + +/* + * Copyright (c) 1996 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ + +#include <sys/param.h> +#include <sys/malloc.h> +#include <sys/syslog.h> +#include <sys/device.h> +#include <vm/vm.h> + +#include <machine/bus.h> + +#include <alpha/pci/ciareg.h> +#include <alpha/pci/ciavar.h> + +#define CHIP cia + +/* Dense region 1 */ +#define CHIP_D_MEM_W1_START(v) 0x00000000 +#define CHIP_D_MEM_W1_END(v) 0xffffffff +#define CHIP_D_MEM_W1_BASE(v) CIA_PCI_DENSE +#define CHIP_D_MEM_W1_MASK(v) 0xffffffff + +/* Sparse region 1 */ +#define CHIP_S_MEM_W1_START(v) \ + HAE_MEM_REG1_START(((struct cia_config *)(v))->cc_hae_mem) +#define CHIP_S_MEM_W1_END(v) \ + (CHIP_S_MEM_W1_START(v) + HAE_MEM_REG1_MASK) +#define CHIP_S_MEM_W1_BASE(v) \ + CIA_PCI_SMEM1 +#define CHIP_S_MEM_W1_MASK(v) \ + HAE_MEM_REG1_MASK + +/* Sparse region 2 */ +#define CHIP_S_MEM_W2_START(v) \ + HAE_MEM_REG2_START(((struct cia_config *)(v))->cc_hae_mem) +#define CHIP_S_MEM_W2_END(v) \ + (CHIP_S_MEM_W2_START(v) + HAE_MEM_REG2_MASK) +#define CHIP_S_MEM_W2_BASE(v) \ + CIA_PCI_SMEM2 +#define CHIP_S_MEM_W2_MASK(v) \ + HAE_MEM_REG2_MASK + +/* Sparse region 3 */ +#define CHIP_S_MEM_W3_START(v) \ + HAE_MEM_REG3_START(((struct cia_config *)(v))->cc_hae_mem) +#define CHIP_S_MEM_W3_END(v) \ + (CHIP_S_MEM_W3_START(v) + HAE_MEM_REG3_MASK) +#define CHIP_S_MEM_W3_BASE(v) \ + CIA_PCI_SMEM3 +#define CHIP_S_MEM_W3_MASK(v) \ + HAE_MEM_REG3_MASK + +#include "pcs_bus_mem_common.c" diff --git a/sys/arch/alpha/pci/cia_isa.c b/sys/arch/alpha/pci/cia_isa.c deleted file mode 100644 index 6ccb0ae4a3e..00000000000 --- a/sys/arch/alpha/pci/cia_isa.c +++ /dev/null @@ -1,346 +0,0 @@ -/* $NetBSD: cia_isa.c,v 1.1 1995/11/23 02:37:26 cgd Exp $ */ - -/* - * Copyright (c) 1995 Carnegie-Mellon University. - * All rights reserved. - * - * Author: Chris G. Demetriou - * - * Permission to use, copy, modify and distribute this software and - * its documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND - * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie the - * rights to redistribute these changes. - */ - -#include <sys/param.h> -#include <sys/malloc.h> -#include <sys/syslog.h> -#include <sys/device.h> -#include <vm/vm.h> - -#include <dev/isa/isavar.h> - -#include <alpha/pci/ciareg.h> -#include <alpha/pci/ciavar.h> - -/* - * Allocation/deallocation functions. - */ -int cia_pio_alloc __P((void *, isa_iooffset_t, isa_iosize_t)); -int cia_pio_dealloc __P((void *, isa_iooffset_t, isa_iosize_t)); - -/* - * Byte functions. - */ -isa_byte_t cia_inb __P((void *, isa_iooffset_t)); -#define cia_insb 0 /* XXX */ -void cia_outb __P((void *, isa_iooffset_t, isa_byte_t)); -#define cia_outsb 0 /* XXX */ - -/* - * Word functions. - */ -isa_word_t cia_inw __P((void *, isa_iooffset_t)); -#define cia_insw 0 /* XXX */ -void cia_outw __P((void *, isa_iooffset_t, isa_word_t)); -#define cia_outsw 0 /* XXX */ - -/* - * Longword functions. - */ -isa_long_t cia_inl __P((void *, isa_iooffset_t)); -#define cia_insl 0 /* XXX */ -void cia_outl __P((void *, isa_iooffset_t, isa_long_t)); -#define cia_outsl 0 /* XXX */ - -__const struct pci_pio_fns cia_pio_fns = { - /* Allocation/deallocation functions. */ - cia_pio_alloc, cia_pio_dealloc, - - /* Byte functions. */ - cia_inb, cia_insb, - cia_outb, cia_outsb, - - /* Word functions. */ - cia_inw, cia_insw, - cia_outw, cia_outsw, - - /* Longword functions. */ - cia_inl, cia_insl, - cia_outl, cia_outsl, -}; - -int -cia_pio_alloc(ipfarg, start, size) - void *ipfarg; - isa_iooffset_t start; - isa_iosize_t size; -{ - - /* XXX should do something */ -} - -int -cia_pio_dealloc(ipfarg, start, size) - void *ipfarg; - isa_iooffset_t start; - isa_iosize_t size; -{ - - /* XXX should do something */ -} - -isa_byte_t -cia_inb(ipfa, ioaddr) - void *ipfa; - isa_iooffset_t ioaddr; -{ - u_int32_t *port, val; - isa_byte_t rval; - int offset; - - wbflush(); - offset = ioaddr & 3; - port = (int32_t *)phystok0seg(CIA_PCI_SIO0 | 0 << 3 | ioaddr << 5); - val = *port; - rval = ((val) >> (8 * offset)) & 0xff; -/* rval = val & 0xff; */ - - return rval; -} - -void -cia_outb(ipfa, ioaddr, val) - void *ipfa; - isa_iooffset_t ioaddr; - isa_byte_t val; -{ - u_int32_t *port, nval; - int offset; - - offset = ioaddr & 3; - nval = val /*<< (8 * offset)*/; - nval = val << (8 * offset); - port = (int32_t *)phystok0seg(CIA_PCI_SIO0 | 0 << 3 | ioaddr << 5); - - *port = nval; - wbflush(); -} - -isa_word_t -cia_inw(ipfa, ioaddr) - void *ipfa; - isa_iooffset_t ioaddr; -{ - u_int32_t *port, val; - isa_word_t rval; - int offset; - - wbflush(); - offset = ioaddr & 3; - port = (int32_t *)phystok0seg(CIA_PCI_SIO0 | 1 << 3 | ioaddr << 5); - val = *port; - rval = ((val) >> (8 * offset)) & 0xffff; - rval = val & 0xffff; - -panic("inw(0x%x) => 0x%x @ %p => 0x%x\n", ioaddr, val, port, rval); - - return rval; -} - -void -cia_outw(ipfa, ioaddr, val) - void *ipfa; - isa_iooffset_t ioaddr; - isa_word_t val; -{ - u_int32_t *port, nval; - int offset; - - offset = ioaddr & 3; - nval = val /*<< (8 * offset)*/; - port = (int32_t *)phystok0seg(CIA_PCI_SIO0 | 1 << 3 | ioaddr << 5); - - *port = nval; - wbflush(); -} - -isa_long_t -cia_inl(ipfa, ioaddr) - void *ipfa; - isa_iooffset_t ioaddr; -{ - u_int32_t *port, val; - isa_long_t rval; - int offset; - - wbflush(); - offset = ioaddr & 3; - port = (int32_t *)phystok0seg(CIA_PCI_SIO0 | 3 << 3 | ioaddr << 5); - val = *port; - rval = ((val) >> (8 * offset)) & 0xffffffff; - rval = val & 0xffffffff; - - return rval; -} - -void -cia_outl(ipfa, ioaddr, val) - void *ipfa; - isa_iooffset_t ioaddr; - isa_long_t val; -{ - u_int32_t *port, nval; - int offset; - - offset = ioaddr & 3; - nval = val /*<< (8 * offset)*/; - port = (int32_t *)phystok0seg(CIA_PCI_SIO0 | 3 << 3 | ioaddr << 5); - - *port = nval; - wbflush(); -} - -/* XXX XXX XXX */ - -#define pf(fn, args) fn args { panic(__STRING(fn)); } - -void pf(cia_dma_cascade, (void *idfa, isa_drq_t chan)) -void pf(cia_dma_copytobuf, ()) -void pf(cia_dma_copyfrombuf, ()) -void pf(cia_dma_start, (void *idfa, vm_offset_t addr, - isa_msize_t size, isa_drq_t chan, int flags)) -void pf(cia_dma_abort, (void *idfa, isa_drq_t chan)) -void pf(cia_dma_done, (void *idfa, isa_drq_t chan)) - -int cia_dma_map __P((void *, vm_offset_t, isa_msize_t, - isa_moffset_t *, int)); -void cia_dma_unmap __P((void *, vm_offset_t, isa_msize_t, int, - isa_moffset_t *)); - -__const struct isa_dma_fns cia_dma_fns = { - cia_dma_cascade, - cia_dma_map, - cia_dma_unmap, - cia_dma_copytobuf, - cia_dma_copyfrombuf, - cia_dma_start, - cia_dma_abort, - cia_dma_done, -}; - -int -cia_dma_map(idfa, va, isasize, mappingsp, flags) - void *idfa; - vm_offset_t va; - isa_msize_t isasize; - isa_moffset_t *mappingsp; - int flags; -{ - struct apecs_config *acp = idfa; - long todo; - int i; - - if (ISA_DMA_NEEDCONTIG(flags) && isasize > NBPG || - ISA_DMA_SIZEBOUND(flags) != ISA_DMA_SIZEBOUND_NONE || - ISA_DMA_ADDRBOUND(flags) != ISA_DMA_ADDRBOUND_NONE) - panic("cia_dma_map: punt"); - - i = 0; - todo = isasize; - - while (todo > 0) { - mappingsp[i] = vtophys(va) | 0x40000000; -#if 0 - printf("a_pd_m mapping %d: %lx -> %lx -> %lx\n", i, va, - vtophys(va), mappingsp[i]); -#endif - i++; - todo -= PAGE_SIZE - (va - trunc_page(va)); - va += PAGE_SIZE - (va - trunc_page(va)); - } - return (i); -} - -void -cia_dma_unmap(idfa, va, isasize, nmappings, mappingsp) - void *idfa; - vm_offset_t va; - isa_msize_t isasize; - int nmappings; - isa_moffset_t *mappingsp; -{ - - printf("cia_dma_unmap: called\n"); -} - -vm_offset_t cia_mem_map __P((void *, isa_moffset_t, isa_msize_t, int)); -void cia_mem_unmap __P((void *, vm_offset_t, isa_msize_t)); - -#if 0 -void cia_mem_copytoisa __P((void *, char *, vm_offset_t, - isa_moffset_t, isa_msize_t)); -void cia_mem_copyfromisa __P((void *, char *, vm_offset_t, - isa_moffset_t, isa_msize_t)); -void cia_mem_zero __P((void *, vm_offset_t, isa_moffset_t, - isa_msize_t)); -#else -void pf(cia_mem_copytoisa, ()) -void pf(cia_mem_copyfromisa, ()) -void pf(cia_mem_zero, ()) -#endif - -__const struct isa_mem_fns cia_mem_fns = { - cia_mem_map, - cia_mem_unmap, - cia_mem_copytoisa, - cia_mem_copyfromisa, - cia_mem_zero, -}; - -vm_offset_t -cia_mem_map(imfa, isapa, isasize, cacheable) - void *imfa; - isa_moffset_t isapa; - isa_msize_t isasize; - int cacheable; -{ - vm_offset_t sbpa; - - /* XXX sanity checks on sizes, use of windows, etc. */ - - /* XXX MAGIC NUMBERS */ - if (cacheable) - sbpa = (isapa & 0xffffffff) | CIA_PCI_DENSE; - else - sbpa = ((isapa & 0x7ffffff) << 5) | CIA_PCI_SPARSE0; - - return phystok0seg(sbpa); -} - -void -cia_mem_unmap(imfa, va, isasize) - void *imfa; - vm_offset_t va; - isa_msize_t isasize; -{ - - /* XXX sanity checks on va */ - - /* Nothing to do; mapping was done in direct-mapped segment. */ -} diff --git a/sys/arch/alpha/pci/cia_pci.c b/sys/arch/alpha/pci/cia_pci.c index ef918cd84d6..4d9b592502b 100644 --- a/sys/arch/alpha/pci/cia_pci.c +++ b/sys/arch/alpha/pci/cia_pci.c @@ -1,7 +1,7 @@ -/* $NetBSD: cia_pci.c,v 1.1 1995/11/23 02:37:29 cgd Exp $ */ +/* $NetBSD: cia_pci.c,v 1.2 1996/04/12 23:37:10 cgd Exp $ */ /* - * Copyright (c) 1995 Carnegie-Mellon University. + * Copyright (c) 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -38,33 +38,83 @@ #include <alpha/pci/ciareg.h> #include <alpha/pci/ciavar.h> -pci_confreg_t cia_conf_read __P((void *, pci_conftag_t, pci_confoffset_t)); -void cia_conf_write __P((void *, pci_conftag_t, - pci_confoffset_t, pci_confreg_t)); -int cia_find_io __P((void *, pci_conftag_t, - pci_confoffset_t, pci_iooffset_t *, pci_iosize_t *)); -int cia_find_mem __P((void *, pci_conftag_t, - pci_confoffset_t, pci_moffset_t *, pci_msize_t *, int *)); - -__const struct pci_conf_fns cia_conf_fns = { - cia_conf_read, - cia_conf_write, - cia_find_io, - cia_find_mem, -}; - -pci_confreg_t +void cia_attach_hook __P((struct device *, struct device *, + struct pcibus_attach_args *)); +int cia_bus_maxdevs __P((void *, int)); +pcitag_t cia_make_tag __P((void *, int, int, int)); +void cia_decompose_tag __P((void *, pcitag_t, int *, int *, + int *)); +pcireg_t cia_conf_read __P((void *, pcitag_t, int)); +void cia_conf_write __P((void *, pcitag_t, int, pcireg_t)); + +void +cia_pci_init(pc, v) + pci_chipset_tag_t pc; + void *v; +{ + + pc->pc_conf_v = v; + pc->pc_attach_hook = cia_attach_hook; + pc->pc_bus_maxdevs = cia_bus_maxdevs; + pc->pc_make_tag = cia_make_tag; + pc->pc_decompose_tag = cia_decompose_tag; + pc->pc_conf_read = cia_conf_read; + pc->pc_conf_write = cia_conf_write; +} + +void +cia_attach_hook(parent, self, pba) + struct device *parent, *self; + struct pcibus_attach_args *pba; +{ +} + +int +cia_bus_maxdevs(cpv, busno) + void *cpv; + int busno; +{ + + return 32; +} + +pcitag_t +cia_make_tag(cpv, b, d, f) + void *cpv; + int b, d, f; +{ + + return (b << 16) | (d << 11) | (f << 8); +} + +void +cia_decompose_tag(cpv, tag, bp, dp, fp) + void *cpv; + pcitag_t tag; + int *bp, *dp, *fp; +{ + + if (bp != NULL) + *bp = (tag >> 16) & 0xff; + if (dp != NULL) + *dp = (tag >> 11) & 0x1f; + if (fp != NULL) + *fp = (tag >> 8) & 0x7; +} + +pcireg_t cia_conf_read(cpv, tag, offset) void *cpv; - pci_conftag_t tag; - pci_confoffset_t offset; + pcitag_t tag; + int offset; { - struct cia_config *acp = cpv; - pci_confreg_t *datap, data; + struct cia_config *ccp = cpv; + pcireg_t *datap, data; int s, secondary, ba; int32_t old_haxr2; /* XXX */ - secondary = PCI_TAG_BUS(tag) != 0; + /* secondary if bus # != 0 */ + pci_decompose_tag(&ccp->cc_pc, tag, &secondary, 0, 0); if (secondary) { s = splhigh(); old_haxr2 = REGVAL(CIA_CSRS + 0x480); /* XXX */ @@ -73,12 +123,12 @@ cia_conf_read(cpv, tag, offset) wbflush(); } - datap = (pci_confreg_t *)phystok0seg(CIA_PCI_CONF | + datap = (pcireg_t *)phystok0seg(CIA_PCI_CONF | tag << 5UL | /* XXX */ (offset & ~0x03) << 5 | /* XXX */ 0 << 5 | /* XXX */ 0x3 << 3); /* XXX */ - data = (pci_confreg_t)-1; + data = (pcireg_t)-1; if (!(ba = badaddr(datap, sizeof *datap))) data = *datap; @@ -100,16 +150,17 @@ cia_conf_read(cpv, tag, offset) void cia_conf_write(cpv, tag, offset, data) void *cpv; - pci_conftag_t tag; - pci_confoffset_t offset; - pci_confreg_t data; + pcitag_t tag; + int offset; + pcireg_t data; { - struct cia_config *acp = cpv; - pci_confreg_t *datap; + struct cia_config *ccp = cpv; + pcireg_t *datap; int s, secondary; int32_t old_haxr2; /* XXX */ - secondary = PCI_TAG_BUS(tag) != 0; + /* secondary if bus # != 0 */ + pci_decompose_tag(&ccp->cc_pc, tag, &secondary, 0, 0); if (secondary) { s = splhigh(); old_haxr2 = REGVAL(CIA_CSRS + 0x480); /* XXX */ @@ -118,7 +169,7 @@ cia_conf_write(cpv, tag, offset, data) wbflush(); } - datap = (pci_confreg_t *)phystok0seg(CIA_PCI_CONF | + datap = (pcireg_t *)phystok0seg(CIA_PCI_CONF | tag << 5UL | /* XXX */ (offset & ~0x03) << 5 | /* XXX */ 0 << 5 | /* XXX */ @@ -137,86 +188,3 @@ cia_conf_write(cpv, tag, offset, data) reg, data, datap); #endif } - -int -cia_find_io(cpv, tag, reg, iobasep, sizep) - void *cpv; - pci_conftag_t tag; - pci_confoffset_t reg; - pci_iooffset_t *iobasep; - pci_iosize_t *sizep; -{ - struct cia_config *acp = cpv; - pci_confreg_t addrdata, sizedata; - pci_iooffset_t pci_iobase; - - if (reg < PCI_MAPREG_START || reg >= PCI_MAPREG_END || (reg & 3)) - panic("cia_map_io: bad request"); - - addrdata = PCI_CONF_READ(acp->cc_conffns, acp->cc_confarg, tag, reg); - - PCI_CONF_WRITE(acp->cc_conffns, acp->cc_confarg, tag, reg, 0xffffffff); - sizedata = PCI_CONF_READ(acp->cc_conffns, acp->cc_confarg, tag, reg); - PCI_CONF_WRITE(acp->cc_conffns, acp->cc_confarg, tag, reg, addrdata); - - if (PCI_MAPREG_TYPE(addrdata) == PCI_MAPREG_TYPE_MEM) - panic("cia_map_io: attempt to I/O map an memory region"); - - if (iobasep != NULL) - *iobasep = PCI_MAPREG_IO_ADDRESS(addrdata); - if (sizep != NULL) - *sizep = ~PCI_MAPREG_IO_ADDRESS(sizedata) + 1; - - return (0); -} - -int -cia_find_mem(cpv, tag, reg, paddrp, sizep, cacheablep) - void *cpv; - pci_conftag_t tag; - pci_confoffset_t reg; - pci_moffset_t *paddrp; - pci_msize_t *sizep; - int *cacheablep; -{ - struct cia_config *acp = cpv; - pci_confreg_t addrdata, sizedata; - - if (reg < PCI_MAPREG_START || reg >= PCI_MAPREG_END || (reg & 3)) - panic("cia_map_mem: bad request"); - - /* - * The PROM has mapped the device for us. We take the address - * that's been assigned to the register, and figure out what - * physical and virtual addresses go with it... - */ - addrdata = PCI_CONF_READ(acp->cc_conffns, acp->cc_confarg, tag, reg); - - PCI_CONF_WRITE(acp->cc_conffns, acp->cc_confarg, tag, reg, 0xffffffff); - sizedata = PCI_CONF_READ(acp->cc_conffns, acp->cc_confarg, tag, reg); - PCI_CONF_WRITE(acp->cc_conffns, acp->cc_confarg, tag, reg, addrdata); - - if (PCI_MAPREG_TYPE(addrdata) == PCI_MAPREG_TYPE_IO) - panic("cia_map_mem: attempt to memory map an I/O region"); - - switch (PCI_MAPREG_MEM_TYPE(addrdata)) { - case PCI_MAPREG_MEM_TYPE_32BIT: - case PCI_MAPREG_MEM_TYPE_32BIT_1M: - break; - case PCI_MAPREG_MEM_TYPE_64BIT: -/* XXX */ printf("cia_map_mem: attempt to map 64-bit region\n"); -/* XXX */ break; - default: - printf("cia_map_mem: reserved mapping type\n"); - return EINVAL; - } - - if (paddrp != NULL) - *paddrp = PCI_MAPREG_MEM_ADDRESS(addrdata); /* PCI addr */ - if (sizep != NULL) - *sizep = ~PCI_MAPREG_MEM_ADDRESS(sizedata) + 1; - if (cacheablep != NULL) - *cacheablep = PCI_MAPREG_MEM_CACHEABLE(addrdata); - - return 0; -} diff --git a/sys/arch/alpha/pci/ciareg.h b/sys/arch/alpha/pci/ciareg.h index 5fc6ae9435a..403afa6e3de 100644 --- a/sys/arch/alpha/pci/ciareg.h +++ b/sys/arch/alpha/pci/ciareg.h @@ -1,7 +1,7 @@ -/* $NetBSD: ciareg.h,v 1.1 1995/11/23 02:37:31 cgd Exp $ */ +/* $NetBSD: ciareg.h,v 1.1.4.3 1996/06/13 18:35:27 cgd Exp $ */ /* - * Copyright (c) 1995 Carnegie-Mellon University. + * Copyright (c) 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -38,14 +38,34 @@ /* * Base addresses */ -#define CIA_PCI_SPARSE0 0x8000000000L -#define CIA_PCI_SPARSE1 0x8400000000L -#define CIA_PCI_SPARSE2 0x8500000000L -#define CIA_PCI_SIO0 0x8580000000L -#define CIA_PCI_SIO1 0x85c0000000L +#define CIA_PCI_SMEM1 0x8000000000L +#define CIA_PCI_SMEM2 0x8400000000L +#define CIA_PCI_SMEM3 0x8500000000L +#define CIA_PCI_SIO1 0x8580000000L +#define CIA_PCI_SIO2 0x85c0000000L #define CIA_PCI_DENSE 0x8600000000L #define CIA_PCI_CONF 0x8700000000L #define CIA_PCI_IACK 0x8720000000L #define CIA_CSRS 0x8740000000L #define CIA_PCI_MC_CSRS 0x8750000000L #define CIA_PCI_ATRANS 0x8760000000L + +/* + * General CSRs + */ + +#define CIA_CSR_HAE_MEM (CIA_CSRS + 0x400) + +#define HAE_MEM_REG1_START(x) (((u_int32_t)(x) & 0xe0000000) << 0) +#define HAE_MEM_REG1_MASK 0x1fffffff +#define HAE_MEM_REG2_START(x) (((u_int32_t)(x) & 0x0000f800) << 16) +#define HAE_MEM_REG2_MASK 0x07ffffff +#define HAE_MEM_REG3_START(x) (((u_int32_t)(x) & 0x000000fc) << 16) +#define HAE_MEM_REG3_MASK 0x03ffffff + +#define CIA_CSR_HAE_IO (CIA_CSRS + 0x440) + +#define HAE_IO_REG1_START(x) 0 +#define HAE_IO_REG1_MASK 0x01ffffff +#define HAE_IO_REG2_START(x) (((u_int32_t)(x) & 0xfe000000) << 0) +#define HAE_IO_REG2_MASK 0x01ffffff diff --git a/sys/arch/alpha/pci/ciavar.h b/sys/arch/alpha/pci/ciavar.h index d9241010d89..0a96fe7347b 100644 --- a/sys/arch/alpha/pci/ciavar.h +++ b/sys/arch/alpha/pci/ciavar.h @@ -1,7 +1,7 @@ -/* $NetBSD: ciavar.h,v 1.1 1995/11/23 02:37:35 cgd Exp $ */ +/* $NetBSD: ciavar.h,v 1.3.4.1 1996/06/10 00:04:12 cgd Exp $ */ /* - * Copyright (c) 1995 Carnegie-Mellon University. + * Copyright (c) 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -37,20 +37,11 @@ * do their dirty work (and more!). */ struct cia_config { - __const struct pci_conf_fns *cc_conffns; - void *cc_confarg; + struct alpha_bus_chipset cc_bc; + struct alpha_pci_chipset cc_pc; - __const struct pci_dma_fns *cc_dmafns; - void *cc_dmaarg; - - __const struct pci_intr_fns *cc_intrfns; - void *cc_intrarg; - - __const struct pci_mem_fns *cc_memfns; - void *cc_memarg; - - __const struct pci_pio_fns *cc_piofns; - void *cc_pioarg; + u_int32_t cc_hae_mem; + u_int32_t cc_hae_io; }; struct cia_softc { @@ -60,10 +51,8 @@ struct cia_softc { /* XXX SGMAP info */ }; -extern __const struct pci_conf_fns cia_conf_fns; -extern __const struct pci_dma_fns cia_dma_fns; -/* pci interrupt functions handled elsewhere */ -extern __const struct pci_mem_fns cia_mem_fns; -extern __const struct pci_pio_fns cia_pio_fns; - void cia_init __P((struct cia_config *)); +void cia_pci_init __P((pci_chipset_tag_t, void *)); + +void cia_bus_mem_init __P((bus_chipset_tag_t bc, void *memv)); +void cia_bus_io_init __P((bus_chipset_tag_t bc, void *iov)); diff --git a/sys/arch/alpha/pci/lca.c b/sys/arch/alpha/pci/lca.c index ac6514fee99..164dd0714be 100644 --- a/sys/arch/alpha/pci/lca.c +++ b/sys/arch/alpha/pci/lca.c @@ -1,10 +1,10 @@ -/* $NetBSD: lca.c,v 1.1 1995/11/23 02:37:38 cgd Exp $ */ +/* $NetBSD: lca.c,v 1.5 1996/04/23 14:00:53 cgd Exp $ */ /* - * Copyright (c) 1995 Carnegie-Mellon University. + * Copyright (c) 1995, 1996 Carnegie-Mellon University. * All rights reserved. * - * Author: Jeffrey Hsu + * Authors: Jeffrey Hsu and Chris G. Demetriou * * Permission to use, copy, modify and distribute this software and * its documentation is hereby granted, provided that both the copyright @@ -48,9 +48,12 @@ int lcamatch __P((struct device *, void *, void *)); void lcaattach __P((struct device *, struct device *, void *)); -struct cfdriver lcacd = { - NULL, "lca", lcamatch, lcaattach, DV_DULL, - sizeof(struct lca_softc) +struct cfattach lca_ca = { + sizeof(struct lca_softc), lcamatch, lcaattach, +}; + +struct cfdriver lca_cd = { + NULL, "lca", DV_DULL, }; static int lcaprint __P((void *, char *pnp)); @@ -68,7 +71,7 @@ lcamatch(parent, match, aux) struct confargs *ca = aux; /* Make sure that we're looking for a LCA. */ - if (strcmp(ca->ca_name, lcacd.cd_name) != 0) + if (strcmp(ca->ca_name, lca_cd.cd_name) != 0) return (0); if (lcafound) @@ -89,20 +92,33 @@ lca_init(lcp) * Can't set up SGMAP data here; can be called before malloc(). */ - lcp->lc_conffns = &lca_conf_fns; - lcp->lc_confarg = lcp; - lcp->lc_dmafns = &lca_dma_fns; - lcp->lc_dmaarg = lcp; - /* Interrupt routines set up in 'attach' */ - lcp->lc_memfns = &lca_mem_fns; - lcp->lc_memarg = lcp; - lcp->lc_piofns = &lca_pio_fns; - lcp->lc_pioarg = lcp; + apecs_lca_bus_io_init(&lcp->lc_bc, lcp); + apecs_lca_bus_mem_init(&lcp->lc_bc, lcp); + lca_pci_init(&lcp->lc_pc, lcp); -/* -printf("lca_init: before IOC_HAE=0x%x\n", REGVAL(LCA_IOC_HAE)); - REGVAL(LCA_IOC_HAE) = 0; */ + /* + * Refer to ``DECchip 21066 and DECchip 21068 Alpha AXP Microprocessors + * Hardware Reference Manual''. + * ... + */ + /* + * According to section 6.4.1, all bits of the IOC_HAE register are + * undefined after reset. Bits <31:27> are write-only. However, we + * cannot blindly set it to zero. The serial ROM code that initializes + * the PCI devices' address spaces, allocates sparse memory blocks in + * the range that must use the IOC_HAE register for address translation, + * and sets this register accordingly (see section 6.4.14). + * + * IOC_HAE left AS IS. + */ + + /* According to section 6.4.2, all bits of the IOC_CONF register are + * undefined after reset. Bits <1:0> are write-only. Set them to + * 0x00 for PCI Type 0 configuration access. + * + * IOC_CONF set to ZERO. + */ REGVAL(LCA_IOC_CONF) = 0; /* Turn off DMA window enables in Window Base Registers */ @@ -142,10 +158,9 @@ lcaattach(parent, self, aux) struct device *parent, *self; void *aux; { - struct confargs *ca = aux; struct lca_softc *sc = (struct lca_softc *)self; struct lca_config *lcp; - struct pci_attach_args pa; + struct pcibus_attach_args pba; /* note that we've attached the chipset; can't have 2 LCAs. */ /* Um, not sure about this. XXX JH */ @@ -167,31 +182,18 @@ lcaattach(parent, self, aux) switch (hwrpb->rpb_type) { #if defined(DEC_AXPPCI_33) case ST_DEC_AXPPCI_33: - pci_axppci_33_pickintr(lcp->lc_conffns, lcp->lc_confarg, - lcp->lc_piofns, lcp->lc_pioarg, - &lcp->lc_intrfns, &lcp->lc_intrarg); + pci_axppci_33_pickintr(lcp); break; #endif default: panic("lcaattach: shouldn't be here, really..."); } - pa.pa_bus = 0; - pa.pa_maxdev = 13; - pa.pa_burstlog2 = 8; - - pa.pa_conffns = lcp->lc_conffns; - pa.pa_confarg = lcp->lc_confarg; - pa.pa_dmafns = lcp->lc_dmafns; - pa.pa_dmaarg = lcp->lc_dmaarg; - pa.pa_intrfns = lcp->lc_intrfns; - pa.pa_intrarg = lcp->lc_intrarg; - pa.pa_memfns = lcp->lc_memfns; - pa.pa_memarg = lcp->lc_memarg; - pa.pa_piofns = lcp->lc_piofns; - pa.pa_pioarg = lcp->lc_pioarg; - - config_found(self, &pa, lcaprint); + pba.pba_busname = "pci"; + pba.pba_bc = &lcp->lc_bc; + pba.pba_pc = &lcp->lc_pc; + pba.pba_bus = 0; + config_found(self, &pba, lcaprint); } static int @@ -199,12 +201,11 @@ lcaprint(aux, pnp) void *aux; char *pnp; { - register struct pci_attach_args *pa = aux; + register struct pcibus_attach_args *pba = aux; - /* what does this do? XXX JH */ /* only PCIs can attach to LCAes; easy. */ if (pnp) - printf("pci at %s", pnp); - printf(" bus %d", pa->pa_bus); + printf("%s at %s", pba->pba_busname, pnp); + printf(" bus %d", pba->pba_bus); return (UNCONF); } diff --git a/sys/arch/alpha/pci/lca_isa.c b/sys/arch/alpha/pci/lca_isa.c deleted file mode 100644 index 205d8708663..00000000000 --- a/sys/arch/alpha/pci/lca_isa.c +++ /dev/null @@ -1,346 +0,0 @@ -/* $NetBSD: lca_isa.c,v 1.1 1995/11/23 02:37:40 cgd Exp $ */ - -/* - * Copyright (c) 1995 Carnegie-Mellon University. - * All rights reserved. - * - * Author: Jeffrey Hsu - * - * Permission to use, copy, modify and distribute this software and - * its documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND - * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie the - * rights to redistribute these changes. - */ - -#include <sys/param.h> -#include <sys/malloc.h> -#include <sys/syslog.h> -#include <sys/device.h> -#include <vm/vm.h> - -#include <dev/isa/isavar.h> - -#include <alpha/pci/lcareg.h> -#include <alpha/pci/lcavar.h> - -/* - * Allocation/deallocation functions. - */ -int lca_pio_alloc __P((void *, isa_iooffset_t, isa_iosize_t)); -int lca_pio_dealloc __P((void *, isa_iooffset_t, isa_iosize_t)); - -/* - * Byte functions. - */ -isa_byte_t lca_inb __P((void *, isa_iooffset_t)); -#define lca_insb 0 /* XXX */ -void lca_outb __P((void *, isa_iooffset_t, isa_byte_t)); -#define lca_outsb 0 /* XXX */ - -/* - * Word functions. - */ -isa_word_t lca_inw __P((void *, isa_iooffset_t)); -#define lca_insw 0 /* XXX */ -void lca_outw __P((void *, isa_iooffset_t, isa_word_t)); -#define lca_outsw 0 /* XXX */ - -/* - * Longword functions. - */ -isa_long_t lca_inl __P((void *, isa_iooffset_t)); -#define lca_insl 0 /* XXX */ -void lca_outl __P((void *, isa_iooffset_t, isa_long_t)); -#define lca_outsl 0 /* XXX */ - -__const struct pci_pio_fns lca_pio_fns = { - /* Allocation/deallocation functions. */ - lca_pio_alloc, lca_pio_dealloc, - - /* Byte functions. */ - lca_inb, lca_insb, - lca_outb, lca_outsb, - - /* Word functions. */ - lca_inw, lca_insw, - lca_outw, lca_outsw, - - /* Longword functions. */ - lca_inl, lca_insl, - lca_outl, lca_outsl, -}; - -int -lca_pio_alloc(ipfarg, start, size) - void *ipfarg; - isa_iooffset_t start; - isa_iosize_t size; -{ - - /* XXX should do something */ -} - -int -lca_pio_dealloc(ipfarg, start, size) - void *ipfarg; - isa_iooffset_t start; - isa_iosize_t size; -{ - - /* XXX should do something */ -} - -isa_byte_t -lca_inb(ipfa, ioaddr) - void *ipfa; - isa_iooffset_t ioaddr; -{ - u_int32_t *port, val; - isa_byte_t rval; - int offset; - - wbflush(); - offset = ioaddr & 3; - port = (int32_t *)phystok0seg(LCA_PCI_SIO | 0 << 3 | ioaddr << 5); - val = *port; - rval = ((val) >> (8 * offset)) & 0xff; -/* rval = val & 0xff; */ - - return rval; -} - -void -lca_outb(ipfa, ioaddr, val) - void *ipfa; - isa_iooffset_t ioaddr; - isa_byte_t val; -{ - u_int32_t *port, nval; - int offset; - - offset = ioaddr & 3; - nval = val /*<< (8 * offset)*/; - nval = val << (8 * offset); - port = (int32_t *)phystok0seg(LCA_PCI_SIO | 0 << 3 | ioaddr << 5); - - *port = nval; - wbflush(); -} - -isa_word_t -lca_inw(ipfa, ioaddr) - void *ipfa; - isa_iooffset_t ioaddr; -{ - u_int32_t *port, val; - isa_word_t rval; - int offset; - - wbflush(); - offset = ioaddr & 3; - port = (int32_t *)phystok0seg(LCA_PCI_SIO | 1 << 3 | ioaddr << 5); - val = *port; - rval = ((val) >> (8 * offset)) & 0xffff; - rval = val & 0xffff; - -panic("inw(0x%x) => 0x%x @ %p => 0x%x\n", ioaddr, val, port, rval); - - return rval; -} - -void -lca_outw(ipfa, ioaddr, val) - void *ipfa; - isa_iooffset_t ioaddr; - isa_word_t val; -{ - u_int32_t *port, nval; - int offset; - - offset = ioaddr & 3; - nval = val /*<< (8 * offset)*/; - port = (int32_t *)phystok0seg(LCA_PCI_SIO | 1 << 3 | ioaddr << 5); - - *port = nval; - wbflush(); -} - -isa_long_t -lca_inl(ipfa, ioaddr) - void *ipfa; - isa_iooffset_t ioaddr; -{ - u_int32_t *port, val; - isa_long_t rval; - int offset; - - wbflush(); - offset = ioaddr & 3; - port = (int32_t *)phystok0seg(LCA_PCI_SIO | 3 << 3 | ioaddr << 5); - val = *port; - rval = ((val) >> (8 * offset)) & 0xffffffff; - rval = val & 0xffffffff; - - return rval; -} - -void -lca_outl(ipfa, ioaddr, val) - void *ipfa; - isa_iooffset_t ioaddr; - isa_long_t val; -{ - u_int32_t *port, nval; - int offset; - - offset = ioaddr & 3; - nval = val /*<< (8 * offset)*/; - port = (int32_t *)phystok0seg(LCA_PCI_SIO | 3 << 3 | ioaddr << 5); - - *port = nval; - wbflush(); -} - -/* XXX XXX XXX */ - -#define pf(fn, args) fn args { panic(__STRING(fn)); } - -void pf(lca_dma_cascade, (void *idfa, isa_drq_t chan)) -void pf(lca_dma_copytobuf, ()) -void pf(lca_dma_copyfrombuf, ()) -void pf(lca_dma_start, (void *idfa, vm_offset_t addr, - isa_msize_t size, isa_drq_t chan, int flags)) -void pf(lca_dma_abort, (void *idfa, isa_drq_t chan)) -void pf(lca_dma_done, (void *idfa, isa_drq_t chan)) - -int lca_dma_map __P((void *, vm_offset_t, isa_msize_t, - isa_moffset_t *, int)); -void lca_dma_unmap __P((void *, vm_offset_t, isa_msize_t, int, - isa_moffset_t *)); - -__const struct isa_dma_fns lca_dma_fns = { - lca_dma_cascade, - lca_dma_map, - lca_dma_unmap, - lca_dma_copytobuf, - lca_dma_copyfrombuf, - lca_dma_start, - lca_dma_abort, - lca_dma_done, -}; - -int -lca_dma_map(idfa, va, isasize, mappingsp, flags) - void *idfa; - vm_offset_t va; - isa_msize_t isasize; - isa_moffset_t *mappingsp; - int flags; -{ - struct lca_config *acp = idfa; - long todo; - int i; - - if (ISA_DMA_NEEDCONTIG(flags) && isasize > NBPG || - ISA_DMA_SIZEBOUND(flags) != ISA_DMA_SIZEBOUND_NONE || - ISA_DMA_ADDRBOUND(flags) != ISA_DMA_ADDRBOUND_NONE) - panic("lca_dma_map: punt"); - - i = 0; - todo = isasize; - - while (todo > 0) { - mappingsp[i] = vtophys(va) | 0x40000000; -#if 0 - printf("a_pd_m mapping %d: %lx -> %lx -> %lx\n", i, va, - vtophys(va), mappingsp[i]); -#endif - i++; - todo -= PAGE_SIZE - (va - trunc_page(va)); - va += PAGE_SIZE - (va - trunc_page(va)); - } - return (i); -} - -void -lca_dma_unmap(idfa, va, isasize, nmappings, mappingsp) - void *idfa; - vm_offset_t va; - isa_msize_t isasize; - int nmappings; - isa_moffset_t *mappingsp; -{ - - printf("lca_dma_unmap: called\n"); -} - -vm_offset_t lca_mem_map __P((void *, isa_moffset_t, isa_msize_t, int)); -void lca_mem_unmap __P((void *, vm_offset_t, isa_msize_t)); - -#if 0 -void lca_mem_copytoisa __P((void *, char *, vm_offset_t, - isa_moffset_t, isa_msize_t)); -void lca_mem_copyfromisa __P((void *, char *, vm_offset_t, - isa_moffset_t, isa_msize_t)); -void lca_mem_zero __P((void *, vm_offset_t, isa_moffset_t, - isa_msize_t)); -#else -void pf(lca_mem_copytoisa, ()) -void pf(lca_mem_copyfromisa, ()) -void pf(lca_mem_zero, ()) -#endif - -__const struct isa_mem_fns lca_mem_fns = { - lca_mem_map, - lca_mem_unmap, - lca_mem_copytoisa, - lca_mem_copyfromisa, - lca_mem_zero, -}; - -vm_offset_t -lca_mem_map(imfa, isapa, isasize, cacheable) - void *imfa; - isa_moffset_t isapa; - isa_msize_t isasize; - int cacheable; -{ - vm_offset_t sbpa; - - /* XXX sanity checks on sizes, use of windows, etc. */ - - /* XXX MAGIC NUMBERS */ - if (cacheable) - sbpa = (isapa & 0xffffffff) | LCA_PCI_DENSE; - else - sbpa = ((isapa & 0x7ffffff) << 5) | LCA_PCI_SPARSE; - - return phystok0seg(sbpa); -} - -void -lca_mem_unmap(imfa, va, isasize) - void *imfa; - vm_offset_t va; - isa_msize_t isasize; -{ - - /* XXX sanity checks on va */ - - /* Nothing to do; mapping was done in direct-mapped segment. */ -} diff --git a/sys/arch/alpha/pci/lca_pci.c b/sys/arch/alpha/pci/lca_pci.c index 1b151dcefb9..8d11ddd5ff3 100644 --- a/sys/arch/alpha/pci/lca_pci.c +++ b/sys/arch/alpha/pci/lca_pci.c @@ -1,10 +1,10 @@ -/* $NetBSD: lca_pci.c,v 1.1 1995/11/23 02:37:42 cgd Exp $ */ +/* $NetBSD: lca_pci.c,v 1.3 1996/04/23 14:01:00 cgd Exp $ */ /* - * Copyright (c) 1995 Carnegie-Mellon University. + * Copyright (c) 1995, 1996 Carnegie-Mellon University. * All rights reserved. * - * Author: Jeffrey Hsu + * Author: Chris G. Demetriou * * Permission to use, copy, modify and distribute this software and * its documentation is hereby granted, provided that both the copyright @@ -38,62 +38,119 @@ #include <alpha/pci/lcareg.h> #include <alpha/pci/lcavar.h> -pci_confreg_t lca_conf_read __P((void *, pci_conftag_t, pci_confoffset_t)); -void lca_conf_write __P((void *, pci_conftag_t, - pci_confoffset_t, pci_confreg_t)); -int lca_find_io __P((void *, pci_conftag_t, - pci_confoffset_t, pci_iooffset_t *, pci_iosize_t *)); -int lca_find_mem __P((void *, pci_conftag_t, - pci_confoffset_t, pci_moffset_t *, pci_msize_t *, int *)); - -__const struct pci_conf_fns lca_conf_fns = { - lca_conf_read, - lca_conf_write, - lca_find_io, - lca_find_mem, -}; - -pci_confreg_t -lca_conf_read(cpv, tag, offset) +void lca_attach_hook __P((struct device *, struct device *, + struct pcibus_attach_args *)); +int lca_bus_maxdevs __P((void *, int)); +pcitag_t lca_make_tag __P((void *, int, int, int)); +void lca_decompose_tag __P((void *, pcitag_t, int *, int *, + int *)); +pcireg_t lca_conf_read __P((void *, pcitag_t, int)); +void lca_conf_write __P((void *, pcitag_t, int, pcireg_t)); + +void +lca_pci_init(pc, v) + pci_chipset_tag_t pc; + void *v; +{ + + pc->pc_conf_v = v; + pc->pc_attach_hook = lca_attach_hook; + pc->pc_bus_maxdevs = lca_bus_maxdevs; + pc->pc_make_tag = lca_make_tag; + pc->pc_decompose_tag = lca_decompose_tag; + pc->pc_conf_read = lca_conf_read; + pc->pc_conf_write = lca_conf_write; +} + +void +lca_attach_hook(parent, self, pba) + struct device *parent, *self; + struct pcibus_attach_args *pba; +{ +} + +int +lca_bus_maxdevs(cpv, busno) + void *cpv; + int busno; +{ + + if (busno == 0) + return 16; + else + return 32; +} + +pcitag_t +lca_make_tag(cpv, b, d, f) void *cpv; - pci_conftag_t tag; - pci_confoffset_t offset; + int b, d, f; { - pci_confreg_t *datap, data; - int s, secondary, ba; - int32_t old_ioc_conf; /* XXX */ - u_int64_t dev_sel; - dev_sel = 1 << PCI_TAG_DEVICE(tag) + 11; + return (b << 16) | (d << 11) | (f << 8); +} + +void +lca_decompose_tag(cpv, tag, bp, dp, fp) + void *cpv; + pcitag_t tag; + int *bp, *dp, *fp; +{ + + if (bp != NULL) + *bp = (tag >> 16) & 0xff; + if (dp != NULL) + *dp = (tag >> 11) & 0x1f; + if (fp != NULL) + *fp = (tag >> 8) & 0x7; +} + +pcireg_t +lca_conf_read(cpv, tag, offset) + void *cpv; + pcitag_t tag; + int offset; +{ + struct lca_config *lcp = cpv; + pcireg_t *datap, data; + int s, secondary, device, ba; - secondary = PCI_TAG_BUS(tag) != 0; + /* secondary if bus # != 0 */ + pci_decompose_tag(&lcp->lc_pc, tag, &secondary, &device, 0); if (secondary) { s = splhigh(); - old_ioc_conf = REGVAL(LCA_IOC_CONF); wbflush(); - REGVAL(LCA_IOC_CONF) = old_ioc_conf | 0x1; + REGVAL(LCA_IOC_CONF) = 0x01; wbflush(); + } else { + /* + * on the LCA, must frob the tag used for + * devices on the primary bus, in the same ways + * as is used by type 1 configuration cycles + * on PCs. + */ + tag = (1 << (device + 11)) | (tag & 0x7ff); } - datap = (pci_confreg_t *)phystok0seg(LCA_PCI_CONF | - dev_sel << 5UL | /* XXX */ + datap = (pcireg_t *)phystok0seg(LCA_PCI_CONF | + tag << 5UL | /* XXX */ (offset & ~0x03) << 5 | /* XXX */ 0 << 5 | /* XXX */ 0x3 << 3); /* XXX */ - data = (pci_confreg_t)-1; + data = (pcireg_t)-1; if (!(ba = badaddr(datap, sizeof *datap))) data = *datap; if (secondary) { wbflush(); - REGVAL(LCA_IOC_CONF) = old_ioc_conf; + REGVAL(LCA_IOC_CONF) = 0x00; wbflush(); splx(s); } #if 0 - printf("lca_conf_read: tag 0x%x, offset 0x%x -> %x @ %p%s\n", tag, - offset, data, datap, ba ? " (badaddr)" : ""); + printf("lca_conf_read: tag 0x%lx, reg 0x%lx -> %x @ %p%s\n", tag, reg, + data, datap, ba ? " (badaddr)" : ""); #endif return data; @@ -102,28 +159,33 @@ lca_conf_read(cpv, tag, offset) void lca_conf_write(cpv, tag, offset, data) void *cpv; - pci_conftag_t tag; - pci_confoffset_t offset; - pci_confreg_t data; + pcitag_t tag; + int offset; + pcireg_t data; { - pci_confreg_t *datap; - int s, secondary; - int32_t old_ioc_conf; /* XXX */ - int32_t dev_sel; - - dev_sel = 1 << PCI_TAG_DEVICE(tag) + 11; + struct lca_config *lcp = cpv; + pcireg_t *datap; + int s, secondary, device; - secondary = PCI_TAG_BUS(tag) != 0; + /* secondary if bus # != 0 */ + pci_decompose_tag(&lcp->lc_pc, tag, &secondary, &device, 0); if (secondary) { s = splhigh(); - old_ioc_conf = REGVAL(LCA_IOC_CONF); wbflush(); - REGVAL(LCA_IOC_CONF) = old_ioc_conf | 0x1; + REGVAL(LCA_IOC_CONF) = 0x01; wbflush(); + } else { + /* + * on the LCA, must frob the tag used for + * devices on the primary bus, in the same ways + * as is used by type 1 configuration cycles + * on PCs. + */ + tag = (1 << (device + 11)) | (tag & 0x7ff); } - datap = (pci_confreg_t *)phystok0seg(LCA_PCI_CONF | - dev_sel << 5UL | /* XXX */ + datap = (pcireg_t *)phystok0seg(LCA_PCI_CONF | + tag << 5UL | /* XXX */ (offset & ~0x03) << 5 | /* XXX */ 0 << 5 | /* XXX */ 0x3 << 3); /* XXX */ @@ -131,96 +193,13 @@ lca_conf_write(cpv, tag, offset, data) if (secondary) { wbflush(); - REGVAL(LCA_IOC_CONF) = old_ioc_conf; + REGVAL(LCA_IOC_CONF) = 0x00; wbflush(); splx(s); } #if 0 - printf("lca_conf_write: tag 0x%x, offset 0x%x -> 0x%x @ %p\n", tag, - offset, data, datap); + printf("lca_conf_write: tag 0x%lx, reg 0x%lx -> 0x%x @ %p\n", tag, + reg, data, datap); #endif } - -int -lca_find_io(cpv, tag, reg, iobasep, sizep) - void *cpv; - pci_conftag_t tag; - pci_confoffset_t reg; - pci_iooffset_t *iobasep; - pci_iosize_t *sizep; -{ - struct lca_config *lcp = cpv; - pci_confreg_t addrdata, sizedata; - pci_iooffset_t pci_iobase; - - if (reg < PCI_MAPREG_START || reg >= PCI_MAPREG_END || (reg & 3)) - panic("lca_map_io: bad request"); - - addrdata = PCI_CONF_READ(lcp->lc_conffns, lcp->lc_confarg, tag, reg); - - PCI_CONF_WRITE(lcp->lc_conffns, lcp->lc_confarg, tag, reg, 0xffffffff); - sizedata = PCI_CONF_READ(lcp->lc_conffns, lcp->lc_confarg, tag, reg); - PCI_CONF_WRITE(lcp->lc_conffns, lcp->lc_confarg, tag, reg, addrdata); - - if (PCI_MAPREG_TYPE(addrdata) == PCI_MAPREG_TYPE_MEM) - panic("lca_map_io: attempt to I/O map an memory region"); - - if (iobasep != NULL) - *iobasep = PCI_MAPREG_IO_ADDRESS(addrdata); - if (sizep != NULL) - *sizep = ~PCI_MAPREG_IO_ADDRESS(sizedata) + 1; - - return (0); -} - -int -lca_find_mem(cpv, tag, reg, paddrp, sizep, cacheablep) - void *cpv; - pci_conftag_t tag; - pci_confoffset_t reg; - pci_moffset_t *paddrp; - pci_msize_t *sizep; - int *cacheablep; -{ - struct lca_config *lcp = cpv; - pci_confreg_t addrdata, sizedata; - - if (reg < PCI_MAPREG_START || reg >= PCI_MAPREG_END || (reg & 3)) - panic("lca_map_mem: bad request"); - - /* - * The PROM has mapped the device for us. We take the address - * that's been assigned to the register, and figure out what - * physical and virtual addresses go with it... - */ - addrdata = PCI_CONF_READ(lcp->lc_conffns, lcp->lc_confarg, tag, reg); - - PCI_CONF_WRITE(lcp->lc_conffns, lcp->lc_confarg, tag, reg, 0xffffffff); - sizedata = PCI_CONF_READ(lcp->lc_conffns, lcp->lc_confarg, tag, reg); - PCI_CONF_WRITE(lcp->lc_conffns, lcp->lc_confarg, tag, reg, addrdata); - - if (PCI_MAPREG_TYPE(addrdata) == PCI_MAPREG_TYPE_IO) - panic("lca_map_mem: attempt to memory map an I/O region"); - - switch (PCI_MAPREG_MEM_TYPE(addrdata)) { - case PCI_MAPREG_MEM_TYPE_32BIT: - case PCI_MAPREG_MEM_TYPE_32BIT_1M: - break; - case PCI_MAPREG_MEM_TYPE_64BIT: -/* XXX */ printf("lca_map_mem: attempt to map 64-bit region\n"); -/* XXX */ break; - default: - printf("lca_map_mem: reserved mapping type\n"); - return EINVAL; - } - - if (paddrp != NULL) - *paddrp = PCI_MAPREG_MEM_ADDRESS(addrdata); /* PCI addr */ - if (sizep != NULL) - *sizep = ~PCI_MAPREG_MEM_ADDRESS(sizedata) + 1; - if (cacheablep != NULL) - *cacheablep = PCI_MAPREG_MEM_CACHEABLE(addrdata); - - return 0; -} diff --git a/sys/arch/alpha/pci/lcareg.h b/sys/arch/alpha/pci/lcareg.h index ac876e3110d..2a36401be8d 100644 --- a/sys/arch/alpha/pci/lcareg.h +++ b/sys/arch/alpha/pci/lcareg.h @@ -1,4 +1,4 @@ -/* $NetBSD: lcareg.h,v 1.1 1995/11/23 02:37:44 cgd Exp $ */ +/* $NetBSD: lcareg.h,v 1.2 1996/04/23 14:03:46 cgd Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. @@ -45,6 +45,8 @@ #define LCA_IOC_HAE LCA_IOC_BASE /* Host Address Extension */ #define LCA_IOC_CONF (LCA_IOC_BASE + 0x020) /* Configuration Cycle Type */ +#define LCA_IOC_STAT0 (LCA_IOC_BASE + 0x040) /* Status 0 */ +#define LCA_IOC_STAT1 (LCA_IOC_BASE + 0x060) /* Status 1 */ #define LCA_IOC_W_BASE0 (LCA_IOC_BASE + 0x100) /* Window Base */ #define LCA_IOC_W_MASK0 (LCA_IOC_BASE + 0x140) /* Window Mask */ diff --git a/sys/arch/alpha/pci/lcavar.h b/sys/arch/alpha/pci/lcavar.h index 80c70807172..1b2cf4bf816 100644 --- a/sys/arch/alpha/pci/lcavar.h +++ b/sys/arch/alpha/pci/lcavar.h @@ -1,7 +1,7 @@ -/* $NetBSD: lcavar.h,v 1.1 1995/11/23 02:37:47 cgd Exp $ */ +/* $NetBSD: lcavar.h,v 1.3 1996/04/12 06:08:35 cgd Exp $ */ /* - * Copyright (c) 1995 Carnegie-Mellon University. + * Copyright (c) 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Jeffrey Hsu @@ -37,20 +37,8 @@ * do their dirty work (and more!). */ struct lca_config { - __const struct pci_conf_fns *lc_conffns; - void *lc_confarg; - - __const struct pci_dma_fns *lc_dmafns; - void *lc_dmaarg; - - __const struct pci_intr_fns *lc_intrfns; - void *lc_intrarg; - - __const struct pci_mem_fns *lc_memfns; - void *lc_memarg; - - __const struct pci_pio_fns *lc_piofns; - void *lc_pioarg; + struct alpha_bus_chipset lc_bc; + struct alpha_pci_chipset lc_pc; }; struct lca_softc { @@ -59,10 +47,5 @@ struct lca_softc { struct lca_config *sc_lcp; }; -extern __const struct pci_conf_fns lca_conf_fns; -extern __const struct pci_dma_fns lca_dma_fns; -/* pci interrupt functions handled elsewhere */ -extern __const struct pci_mem_fns lca_mem_fns; -extern __const struct pci_pio_fns lca_pio_fns; - void lca_init __P((struct lca_config *)); +void lca_pci_init __P((pci_chipset_tag_t, void *)); diff --git a/sys/arch/alpha/pci/pci_2100_a50.c b/sys/arch/alpha/pci/pci_2100_a50.c index 06fbc924b02..b9420c5ce01 100644 --- a/sys/arch/alpha/pci/pci_2100_a50.c +++ b/sys/arch/alpha/pci/pci_2100_a50.c @@ -1,7 +1,7 @@ -/* $NetBSD: pci_2100_a50.c,v 1.4 1995/12/24 02:29:42 mycroft Exp $ */ +/* $NetBSD: pci_2100_a50.c,v 1.7 1996/04/23 14:15:55 cgd Exp $ */ /* - * Copyright (c) 1995 Carnegie-Mellon University. + * Copyright (c) 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -35,6 +35,9 @@ #include <sys/device.h> #include <vm/vm.h> +#include <machine/bus.h> +#include <machine/intr.h> + #include <dev/isa/isavar.h> #include <dev/pci/pcireg.h> #include <dev/pci/pcivar.h> @@ -43,45 +46,72 @@ #include <alpha/pci/pci_2100_a50.h> #include <alpha/pci/siovar.h> +#include <alpha/pci/sioreg.h> #include "sio.h" -void *dec_2100_a50_pci_map_int __P((void *, pci_conftag_t, - pci_intr_pin_t, pci_intr_line_t, int, - int (*func)(void *), void *, char *)); -void dec_2100_a50_pci_unmap_int __P((void *, void *)); +int dec_2100_a50_intr_map __P((void *, pcitag_t, int, int, + pci_intr_handle_t *)); +const char *dec_2100_a50_intr_string __P((void *, pci_intr_handle_t)); +void *dec_2100_a50_intr_establish __P((void *, pci_intr_handle_t, + int, int (*func)(void *), void *)); +void dec_2100_a50_intr_disestablish __P((void *, void *)); -__const struct pci_intr_fns dec_2100_a50_pci_intr_fns = { - dec_2100_a50_pci_map_int, - dec_2100_a50_pci_unmap_int, -}; +#define APECS_SIO_DEVICE 7 /* XXX */ -void * -dec_2100_a50_pci_map_int(acv, tag, pin, line, level, func, arg, what) +void +pci_2100_a50_pickintr(acp) + struct apecs_config *acp; +{ + bus_chipset_tag_t bc = &acp->ac_bc; + pci_chipset_tag_t pc = &acp->ac_pc; + pcireg_t sioclass; + int sioII; + + /* XXX MAGIC NUMBER */ + sioclass = pci_conf_read(pc, pci_make_tag(pc, 0, 7, 0), PCI_CLASS_REG); + sioII = (sioclass & 0xff) >= 3; + + if (!sioII) + printf("WARNING: SIO NOT SIO II... NO BETS...\n"); + + pc->pc_intr_v = acp; + pc->pc_intr_map = dec_2100_a50_intr_map; + pc->pc_intr_string = dec_2100_a50_intr_string; + pc->pc_intr_establish = dec_2100_a50_intr_establish; + pc->pc_intr_disestablish = dec_2100_a50_intr_disestablish; + +#if NSIO + sio_intr_setup(bc); + set_iointr(&sio_iointr); +#else + panic("pci_2100_a50_pickintr: no I/O interrupt handler (no sio)"); +#endif +} + +int +dec_2100_a50_intr_map(acv, bustag, buspin, line, ihp) void *acv; - pci_conftag_t tag; - pci_intr_pin_t pin; - pci_intr_line_t line; - int level; - int (*func) __P((void *)); - void *arg; - char *what; + pcitag_t bustag; + int buspin, line; + pci_intr_handle_t *ihp; { struct apecs_config *acp = acv; - int bus, device, pirq; - pci_confreg_t irreg, pirqreg; + pci_chipset_tag_t pc = &acp->ac_pc; + int device, pirq; + pcireg_t pirqreg; u_int8_t pirqline; - if (pin == 0) { + if (buspin == 0) { /* No IRQ used. */ - return 0; + return 1; } - if (pin > 4) { - printf("pci_map_int: bad interrupt pin %d\n", pin); - return NULL; + if (buspin > 4) { + printf("pci_map_int: bad interrupt pin %d\n", buspin); + return 1; } - device = PCI_TAG_DEVICE(tag); + pci_decompose_tag(pc, bustag, NULL, &device, NULL); switch (device) { case 6: /* NCR SCSI */ @@ -89,7 +119,8 @@ dec_2100_a50_pci_map_int(acv, tag, pin, line, level, func, arg, what) break; case 11: /* slot 1 */ - switch (pin) { + case 14: /* slot 3 */ + switch (buspin) { case PCI_INTERRUPT_PIN_A: case PCI_INTERRUPT_PIN_D: pirq = 0; @@ -104,7 +135,7 @@ dec_2100_a50_pci_map_int(acv, tag, pin, line, level, func, arg, what) break; case 12: /* slot 2 */ - switch (pin) { + switch (buspin) { case PCI_INTERRUPT_PIN_A: case PCI_INTERRUPT_PIN_D: pirq = 1; @@ -119,7 +150,7 @@ dec_2100_a50_pci_map_int(acv, tag, pin, line, level, func, arg, what) break; case 13: /* slot 3 */ - switch (pin) { + switch (buspin) { case PCI_INTERRUPT_PIN_A: case PCI_INTERRUPT_PIN_D: pirq = 2; @@ -134,64 +165,54 @@ dec_2100_a50_pci_map_int(acv, tag, pin, line, level, func, arg, what) break; } - pirqreg = PCI_CONF_READ(acp->ac_conffns, acp->ac_confarg, - PCI_MAKE_TAG(0, 7, 0), 0x60); /* XXX */ + pirqreg = pci_conf_read(pc, pci_make_tag(pc, 0, APECS_SIO_DEVICE, 0), + SIO_PCIREG_PIRQ_RTCTRL); #if 0 printf("pci_2100_a50_map_int: device %d pin %c: pirq %d, reg = %x\n", - device, '@' + pin, pirq, pirqreg); + device, '@' + buspin, pirq, pirqreg); #endif pirqline = (pirqreg >> (pirq * 8)) & 0xff; if ((pirqline & 0x80) != 0) - return 0; /* not routed? */ + return 1; pirqline &= 0xf; #if 0 printf("pci_2100_a50_map_int: device %d pin %c: mapped to line %d\n", - device, '@' + pin, pirqline); + device, '@' + buspin, pirqline); #endif -#if NSIO - return ISA_INTR_ESTABLISH(&sio_isa_intr_fns, NULL, /* XXX */ - pirqline, IST_LEVEL, level, func, arg); -#else - panic("dec_2100_a50_pci_map_int: no sio!"); -#endif + *ihp = pirqline; + return (0); } -void -dec_2100_a50_pci_unmap_int(pifa, cookie) - void *pifa; - void *cookie; +const char * +dec_2100_a50_intr_string(acv, ih) + void *acv; + pci_intr_handle_t ih; { + struct apecs_config *acp = acv; - panic("dec_2100_a50_pci_unmap_int not implemented"); /* XXX */ + return sio_intr_string(NULL /*XXX*/, ih); } -void -pci_2100_a50_pickintr(pcf, pcfa, ppf, ppfa, pifp, pifap) - __const struct pci_conf_fns *pcf; - __const struct pci_pio_fns *ppf; - void *pcfa, *ppfa; - __const struct pci_intr_fns **pifp; - void **pifap; +void * +dec_2100_a50_intr_establish(acv, ih, level, func, arg) + void *acv, *arg; + pci_intr_handle_t ih; + int level; + int (*func) __P((void *)); { - pci_confreg_t sioclass; - int sioII; + struct apecs_config *acp = acv; - /* XXX MAGIC NUMBER */ - sioclass = PCI_CONF_READ(pcf, pcfa, PCI_MAKE_TAG(0, 7, 0), - PCI_CLASS_REG); - sioII = (sioclass & 0xff) >= 3; + return sio_intr_establish(NULL /*XXX*/, ih, IST_LEVEL, level, func, + arg); +} - if (!sioII) - printf("WARNING: SIO NOT SIO II... NO BETS...\n"); +void +dec_2100_a50_intr_disestablish(acv, cookie) + void *acv, *cookie; +{ + struct apecs_config *acp = acv; - *pifp = &dec_2100_a50_pci_intr_fns; - *pifap = pcfa; /* XXX assumes apecs_config ptr */ -#if NSIO - sio_intr_setup(ppf, ppfa); - set_iointr(&sio_iointr); -#else - panic("pci_2100_a50_pickintr: no I/O interrupt handler (no sio)"); -#endif + sio_intr_disestablish(NULL /*XXX*/, cookie); } diff --git a/sys/arch/alpha/pci/pci_2100_a50.h b/sys/arch/alpha/pci/pci_2100_a50.h index 08c22aef089..ed450aa2f97 100644 --- a/sys/arch/alpha/pci/pci_2100_a50.h +++ b/sys/arch/alpha/pci/pci_2100_a50.h @@ -1,7 +1,7 @@ -/* $NetBSD: pci_2100_a50.h,v 1.1 1995/11/23 02:37:51 cgd Exp $ */ +/* $NetBSD: pci_2100_a50.h,v 1.3 1996/04/12 06:08:42 cgd Exp $ */ /* - * Copyright (c) 1995 Carnegie-Mellon University. + * Copyright (c) 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -27,6 +27,4 @@ * rights to redistribute these changes. */ -void pci_2100_a50_pickintr __P((__const struct pci_conf_fns *, void *, - __const struct pci_pio_fns *, void *, - __const struct pci_intr_fns **, void **)); +void pci_2100_a50_pickintr __P((struct apecs_config *)); diff --git a/sys/arch/alpha/pci/pci_axppci_33.c b/sys/arch/alpha/pci/pci_axppci_33.c index 2cfb453226b..008f5111636 100644 --- a/sys/arch/alpha/pci/pci_axppci_33.c +++ b/sys/arch/alpha/pci/pci_axppci_33.c @@ -1,10 +1,10 @@ -/* $NetBSD: pci_axppci_33.c,v 1.2 1995/12/24 02:29:43 mycroft Exp $ */ +/* $NetBSD: pci_axppci_33.c,v 1.5 1996/04/23 14:15:28 cgd Exp $ */ /* - * Copyright (c) 1995 Carnegie-Mellon University. + * Copyright (c) 1995, 1996 Carnegie-Mellon University. * All rights reserved. * - * Author: Jeffrey Hsu + * Authors: Jeffrey Hsu and Chris G. Demetriou * * Permission to use, copy, modify and distribute this software and * its documentation is hereby granted, provided that both the copyright @@ -35,6 +35,9 @@ #include <sys/device.h> #include <vm/vm.h> +#include <machine/bus.h> +#include <machine/intr.h> + #include <dev/isa/isavar.h> #include <dev/pci/pcireg.h> #include <dev/pci/pcivar.h> @@ -42,47 +45,74 @@ #include <alpha/pci/lcavar.h> #include <alpha/pci/pci_axppci_33.h> - #include <alpha/pci/siovar.h> +#include <alpha/pci/sioreg.h> #include "sio.h" -void *dec_axppci_33_pci_map_int __P((void *, pci_conftag_t, - pci_intr_pin_t, pci_intr_line_t, int, - int (*func)(void *), void *, char *)); -void dec_axppci_33_pci_unmap_int __P((void *, void *)); +int dec_axppci_33_intr_map __P((void *, pcitag_t, int, int, + pci_intr_handle_t *)); +const char *dec_axppci_33_intr_string __P((void *, pci_intr_handle_t)); +void *dec_axppci_33_intr_establish __P((void *, pci_intr_handle_t, + int, int (*func)(void *), void *)); +void dec_axppci_33_intr_disestablish __P((void *, void *)); -__const struct pci_intr_fns dec_axppci_33_pci_intr_fns = { - dec_axppci_33_pci_map_int, - dec_axppci_33_pci_unmap_int, -}; +#define LCA_SIO_DEVICE 7 /* XXX */ -void * -dec_axppci_33_pci_map_int(lcv, tag, pin, line, level, func, arg, what) +void +pci_axppci_33_pickintr(lcp) + struct lca_config *lcp; +{ + bus_chipset_tag_t bc = &lcp->lc_bc; + pci_chipset_tag_t pc = &lcp->lc_pc; + pcireg_t sioclass; + int sioII; + + /* XXX MAGIC NUMBER */ + sioclass = pci_conf_read(pc, pci_make_tag(pc, 0, LCA_SIO_DEVICE, 0), + PCI_CLASS_REG); + sioII = (sioclass & 0xff) >= 3; + + if (!sioII) + printf("WARNING: SIO NOT SIO II... NO BETS...\n"); + + pc->pc_intr_v = lcp; + pc->pc_intr_map = dec_axppci_33_intr_map; + pc->pc_intr_string = dec_axppci_33_intr_string; + pc->pc_intr_establish = dec_axppci_33_intr_establish; + pc->pc_intr_disestablish = dec_axppci_33_intr_disestablish; + +#if NSIO + sio_intr_setup(bc); + set_iointr(&sio_iointr); +#else + panic("pci_axppci_33_pickintr: no I/O interrupt handler (no sio)"); +#endif +} + +int +dec_axppci_33_intr_map(lcv, bustag, buspin, line, ihp) void *lcv; - pci_conftag_t tag; - pci_intr_pin_t pin; - pci_intr_line_t line; - int level; - int (*func) __P((void *)); - void *arg; - char *what; + pcitag_t bustag; + int buspin, line; + pci_intr_handle_t *ihp; { struct lca_config *lcp = lcv; - int bus, device, pirq; - pci_confreg_t irreg, pirqreg; + pci_chipset_tag_t pc = &lcp->lc_pc; + int device, pirq; + pcireg_t pirqreg; u_int8_t pirqline; - if (pin == 0) { + if (buspin == 0) { /* No IRQ used. */ - return 0; + return 1; } - if (pin > 4) { - printf("dec_axppci_33_map_int: bad interrupt pin %d\n", pin); - return NULL; + if (buspin > 4) { + printf("pci_map_int: bad interrupt pin %d\n", buspin); + return 1; } - device = PCI_TAG_DEVICE(tag); + pci_decompose_tag(pc, bustag, NULL, &device, NULL); switch (device) { case 6: /* NCR SCSI */ @@ -90,7 +120,7 @@ dec_axppci_33_pci_map_int(lcv, tag, pin, line, level, func, arg, what) break; case 11: /* slot 1 */ - switch (pin) { + switch (buspin) { case PCI_INTERRUPT_PIN_A: case PCI_INTERRUPT_PIN_D: pirq = 0; @@ -105,7 +135,7 @@ dec_axppci_33_pci_map_int(lcv, tag, pin, line, level, func, arg, what) break; case 12: /* slot 2 */ - switch (pin) { + switch (buspin) { case PCI_INTERRUPT_PIN_A: case PCI_INTERRUPT_PIN_D: pirq = 1; @@ -120,7 +150,7 @@ dec_axppci_33_pci_map_int(lcv, tag, pin, line, level, func, arg, what) break; case 8: /* slot 3 */ - switch (pin) { + switch (buspin) { case PCI_INTERRUPT_PIN_A: case PCI_INTERRUPT_PIN_D: pirq = 2; @@ -139,66 +169,54 @@ dec_axppci_33_pci_map_int(lcv, tag, pin, line, level, func, arg, what) panic("dec_axppci_33_pci_map_int: bad device number"); } -#define LCA_SIO_DEVICE 7 /* XXX */ - - pirqreg = PCI_CONF_READ(lcp->lc_conffns, lcp->lc_confarg, - PCI_MAKE_TAG(0, LCA_SIO_DEVICE, 0), 0x60); /* XXX */ + pirqreg = pci_conf_read(pc, pci_make_tag(pc, 0, LCA_SIO_DEVICE, 0), + SIO_PCIREG_PIRQ_RTCTRL); #if 0 - printf("dec_pci_axppci_33_map_int: device %d pin %c: pirq %d, reg = %x\n", - device, '@' + pin, pirq, pirqreg); + printf("pci_axppci_33_map_int: device %d pin %c: pirq %d, reg = %x\n", + device, '@' + buspin, pirq, pirqreg); #endif pirqline = (pirqreg >> (pirq * 8)) & 0xff; if ((pirqline & 0x80) != 0) - return 0; /* not routed? */ + return 1; /* not routed? */ pirqline &= 0xf; #if 0 - printf("dec_pci_axppci_33_map_int: device %d pin %c: mapped to line %d\n", - device, '@' + pin, pirqline); + printf("pci_axppci_33_map_int: device %d pin %c: mapped to line %d\n", + device, '@' + buspin, pirqline); #endif -#if NSIO - return ISA_INTR_ESTABLISH(&sio_isa_intr_fns, NULL, /* XXX */ - pirqline, IST_LEVEL, level, func, arg); -#else - panic("dec_axppci_33_pci_map_int: no sio!"); -#endif + *ihp = pirqline; + return (0); } -void -dec_axppci_33_pci_unmap_int(pifa, cookie) - void *pifa; - void *cookie; +const char * +dec_axppci_33_intr_string(lcv, ih) + void *lcv; + pci_intr_handle_t ih; { + struct lca_config *lcp = lcv; - panic("dec_axppci_33_pci_unmap_int not implemented"); /* XXX */ + return sio_intr_string(NULL /*XXX*/, ih); } -void -pci_axppci_33_pickintr(pcf, pcfa, ppf, ppfa, pifp, pifap) - __const struct pci_conf_fns *pcf; - __const struct pci_pio_fns *ppf; - void *pcfa, *ppfa; - __const struct pci_intr_fns **pifp; - void **pifap; +void * +dec_axppci_33_intr_establish(lcv, ih, level, func, arg) + void *lcv, *arg; + pci_intr_handle_t ih; + int level; + int (*func) __P((void *)); { - pci_confreg_t sioclass; - int sioII; + struct lca_config *lcp = lcv; - /* XXX MAGIC NUMBER */ - sioclass = PCI_CONF_READ(pcf, pcfa, PCI_MAKE_TAG(0, LCA_SIO_DEVICE, 0), - PCI_CLASS_REG); - sioII = (sioclass & 0xff) >= 3; + return sio_intr_establish(NULL /*XXX*/, ih, IST_LEVEL, level, func, + arg); +} - if (!sioII) - printf("WARNING: SIO NOT SIO II... NO BETS...\n"); +void +dec_axppci_33_intr_disestablish(lcv, cookie) + void *lcv, *cookie; +{ + struct lca_config *lcp = lcv; - *pifp = &dec_axppci_33_pci_intr_fns; - *pifap = pcfa; /* XXX assumes apecs_config ptr */ -#if NSIO - sio_intr_setup(ppf, ppfa); - set_iointr(&sio_iointr); -#else - panic("pci_axppci_33_pickintr: no I/O interrupt handler (no sio)"); -#endif + sio_intr_disestablish(NULL /*XXX*/, cookie); } diff --git a/sys/arch/alpha/pci/pci_axppci_33.h b/sys/arch/alpha/pci/pci_axppci_33.h index 342eb0dfd71..27dfa1f4b04 100644 --- a/sys/arch/alpha/pci/pci_axppci_33.h +++ b/sys/arch/alpha/pci/pci_axppci_33.h @@ -1,10 +1,10 @@ -/* $NetBSD: pci_axppci_33.h,v 1.1 1995/11/23 02:37:56 cgd Exp $ */ +/* $NetBSD: pci_axppci_33.h,v 1.3 1996/04/12 06:08:47 cgd Exp $ */ /* - * Copyright (c) 1995 Carnegie-Mellon University. + * Copyright (c) 1995, 1996 Carnegie-Mellon University. * All rights reserved. * - * Author: Jeffrey Hsu + * Author: Chris G. Demetriou * * Permission to use, copy, modify and distribute this software and * its documentation is hereby granted, provided that both the copyright @@ -27,6 +27,4 @@ * rights to redistribute these changes. */ -void pci_axppci_33_pickintr __P((__const struct pci_conf_fns *, void *, - __const struct pci_pio_fns *, void *, - __const struct pci_intr_fns **, void **)); +void pci_axppci_33_pickintr __P((struct lca_config *)); diff --git a/sys/arch/alpha/pci/pci_kn20aa.c b/sys/arch/alpha/pci/pci_kn20aa.c index f8cff214e01..6a5582c7cd3 100644 --- a/sys/arch/alpha/pci/pci_kn20aa.c +++ b/sys/arch/alpha/pci/pci_kn20aa.c @@ -1,7 +1,7 @@ -/* $NetBSD: pci_kn20aa.c,v 1.2 1995/12/24 02:29:45 mycroft Exp $ */ +/* $NetBSD: pci_kn20aa.c,v 1.3.4.2 1996/06/13 18:35:31 cgd Exp $ */ /* - * Copyright (c) 1995 Carnegie-Mellon University. + * Copyright (c) 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -55,14 +55,12 @@ #include <alpha/pci/siovar.h> #endif -void *kn20aa_pci_map_int __P((void *, pci_conftag_t, pci_intr_pin_t, - pci_intr_line_t, int, int (*func)(void *), void *, char *)); -void kn20aa_pci_unmap_int __P((void *, void *)); - -__const struct pci_intr_fns kn20aa_pci_intr_fns = { - kn20aa_pci_map_int, - kn20aa_pci_unmap_int, -}; +int dec_kn20aa_intr_map __P((void *, pcitag_t, int, int, + pci_intr_handle_t *)); +const char *dec_kn20aa_intr_string __P((void *, pci_intr_handle_t)); +void *dec_kn20aa_intr_establish __P((void *, pci_intr_handle_t, + int, int (*func)(void *), void *)); +void dec_kn20aa_intr_disestablish __P((void *, void *)); #define KN20AA_PCEB_IRQ 31 #define KN20AA_MAX_IRQ 32 @@ -90,25 +88,25 @@ struct kn20aa_intrhand *kn20aa_attach_intr __P((struct kn20aa_intrchain *, int, int (*) (void *), void *)); void -pci_kn20aa_pickintr(pcf, pcfa, ppf, ppfa, pifp, pifap) - __const struct pci_conf_fns *pcf; - __const struct pci_pio_fns *ppf; - void *pcfa, *ppfa; - __const struct pci_intr_fns **pifp; - void **pifap; +pci_kn20aa_pickintr(ccp) + struct cia_config *ccp; { int i; struct kn20aa_intrhand *nintrhand; - + bus_chipset_tag_t bc = &ccp->cc_bc; + pci_chipset_tag_t pc = &ccp->cc_pc; for (i = 0; i < KN20AA_MAX_IRQ; i++) TAILQ_INIT(&kn20aa_pci_intrs[i]); - *pifp = &kn20aa_pci_intr_fns; - *pifap = NULL; /* XXX ? */ + pc->pc_intr_v = ccp; + pc->pc_intr_map = dec_kn20aa_intr_map; + pc->pc_intr_string = dec_kn20aa_intr_string; + pc->pc_intr_establish = dec_kn20aa_intr_establish; + pc->pc_intr_disestablish = dec_kn20aa_intr_disestablish; #if NSIO - sio_intr_setup(ppf, ppfa); + sio_intr_setup(bc); #endif set_iointr(kn20aa_iointr); @@ -121,27 +119,25 @@ pci_kn20aa_pickintr(pcf, pcfa, ppf, ppfa, pifp, pifap) #endif } -void * -kn20aa_pci_map_int(ccv, tag, pin, line, level, func, arg, what) - void *ccv; - pci_conftag_t tag; - pci_intr_pin_t pin; - pci_intr_line_t line; - int level; - int (*func) __P((void *)); - void *arg; - char *what; +int +dec_kn20aa_intr_map(ccv, bustag, buspin, line, ihp) + void *ccv; + pcitag_t bustag; + int buspin, line; + pci_intr_handle_t *ihp; { + struct cia_config *ccp = ccv; + pci_chipset_tag_t pc = &ccp->cc_pc; int device; int kn20aa_slot, kn20aa_irq; void *ih; - if (pin == 0) { + if (buspin == 0) { /* No IRQ used. */ return 0; } - if (pin > 4) { - printf("pci_map_int: bad interrupt pin %d\n", pin); + if (buspin > 4) { + printf("pci_map_int: bad interrupt pin %d\n", buspin); return NULL; } @@ -152,7 +148,8 @@ kn20aa_pci_map_int(ccv, tag, pin, line, level, func, arg, what) * The DEC engineers who did this hardware obviously engaged * in random drug testing. */ - switch (device = PCI_TAG_DEVICE(tag)) { + pci_decompose_tag(pc, bustag, NULL, &device, NULL); + switch (device) { case 11: case 12: kn20aa_slot = (device - 11) + 0; @@ -175,29 +172,56 @@ kn20aa_pci_map_int(ccv, tag, pin, line, level, func, arg, what) device); } - kn20aa_irq = (kn20aa_slot * 4) + pin - 1; + kn20aa_irq = (kn20aa_slot * 4) + buspin - 1; if (kn20aa_irq > KN20AA_MAX_IRQ) panic("pci_kn20aa_map_int: kn20aa_irq too large (%d)\n", kn20aa_irq); -#if 0 - printf("kn20aa_attach_intr: func 0x%lx, arg 0x%lx, level %d, irq %d\n", - func, arg, level, kn20aa_irq); -#endif + *ihp = kn20aa_irq; +} - ih = kn20aa_attach_intr(&kn20aa_pci_intrs[kn20aa_irq], level, - func, arg); - kn20aa_enable_intr(kn20aa_irq); - return (ih); +const char * +dec_kn20aa_intr_string(ccv, ih) + void *ccv; + pci_intr_handle_t ih; +{ + struct cia_config *ccp = ccv; + static char irqstr[15]; /* 11 + 2 + NULL + sanity */ + + if (ih > KN20AA_MAX_IRQ) + panic("dec_kn20aa_a50_intr_string: bogus kn20aa IRQ 0x%x\n", + ih); + + sprintf(irqstr, "kn20aa irq %d", ih); + return (irqstr); } -void -kn20aa_pci_unmap_int(pifa, cookie) - void *pifa; +void * +dec_kn20aa_intr_establish(ccv, ih, level, func, arg) + void *ccv, *arg; + pci_intr_handle_t ih; + int level; + int (*func) __P((void *)); +{ + struct cia_config *ccp = ccv; void *cookie; + + if (ih > KN20AA_MAX_IRQ) + panic("dec_kn20aa_intr_establish: bogus kn20aa IRQ 0x%x\n", + ih); + + cookie = kn20aa_attach_intr(&kn20aa_pci_intrs[ih], level, func, arg); + kn20aa_enable_intr(ih); + return (cookie); +} + +void +dec_kn20aa_intr_disestablish(ccv, cookie) + void *ccv, *cookie; { + struct cia_config *ccp = ccv; - panic("kn20aa_pci_unmap_int not implemented"); /* XXX */ + panic("dec_kn20aa_intr_disestablish not implemented"); /* XXX */ } /* diff --git a/sys/arch/alpha/pci/pci_kn20aa.h b/sys/arch/alpha/pci/pci_kn20aa.h index 4e499317ea0..dfbd89e3f05 100644 --- a/sys/arch/alpha/pci/pci_kn20aa.h +++ b/sys/arch/alpha/pci/pci_kn20aa.h @@ -1,4 +1,4 @@ -/* $NetBSD: pci_kn20aa.h,v 1.1 1995/11/23 02:38:05 cgd Exp $ */ +/* $NetBSD: pci_kn20aa.h,v 1.2 1996/04/13 00:24:35 cgd Exp $ */ /* * Copyright (c) 1995 Carnegie-Mellon University. @@ -27,9 +27,7 @@ * rights to redistribute these changes. */ -void pci_kn20aa_pickintr __P((__const struct pci_conf_fns *, void *, - __const struct pci_pio_fns *, void *, - __const struct pci_intr_fns **, void **)); +void pci_kn20aa_pickintr __P((struct cia_config *)); #ifdef EVCNT_COUNTERS extern struct evcnt kn20aa_intr_evcnt; diff --git a/sys/arch/alpha/pci/pci_machdep.c b/sys/arch/alpha/pci/pci_machdep.c index 02eb57caeaa..b0a8e04c6d3 100644 --- a/sys/arch/alpha/pci/pci_machdep.c +++ b/sys/arch/alpha/pci/pci_machdep.c @@ -1,7 +1,7 @@ -/* $NetBSD: pci_machdep.c,v 1.3 1995/11/23 02:38:07 cgd Exp $ */ +/* $NetBSD: pci_machdep.c,v 1.5 1996/04/12 06:08:49 cgd Exp $ */ /* - * Copyright (c) 1995 Carnegie-Mellon University. + * Copyright (c) 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -37,7 +37,6 @@ #include <sys/systm.h> #include <sys/errno.h> #include <sys/device.h> - #include <vm/vm.h> #include <dev/isa/isavar.h> @@ -56,41 +55,44 @@ #endif void -pci_display_console(pcf, pcfa, pmf, pmfa, ppf, ppfa, bus, device, function) - __const struct pci_conf_fns *pcf; - __const struct pci_mem_fns *pmf; - __const struct pci_pio_fns *ppf; - void *pcfa, *pmfa, *ppfa; - pci_bus_t bus; - pci_device_t device; - pci_function_t function; +pci_display_console(bc, pc, bus, device, function) + bus_chipset_tag_t bc; + pci_chipset_tag_t pc; + int bus, device, function; { - pci_conftag_t tag; - pci_confreg_t id, class; + pcitag_t tag; + pcireg_t id, class; + int match, nmatch; + void (*fn) __P((bus_chipset_tag_t, pci_chipset_tag_t, int, int, int)); - tag = PCI_MAKE_TAG(bus, device, function); - id = PCI_CONF_READ(pcf, pcfa, tag, PCI_ID_REG); + tag = pci_make_tag(pc, bus, device, function); + id = pci_conf_read(pc, tag, PCI_ID_REG); if (id == 0 || id == 0xffffffff) panic("pci_display_console: no device at %d/%d/%d", bus, device, function); - class = PCI_CONF_READ(pcf, pcfa, tag, PCI_CLASS_REG); + class = pci_conf_read(pc, tag, PCI_CLASS_REG); + + match = 0; + fn = NULL; #if NPCIVGA - if (DEVICE_IS_PCIVGA(class, id)) { - pcivga_console(pcf, pcfa, pmf, pmfa, ppf, ppfa, bus, - device, function); - return; + nmatch = DEVICE_IS_PCIVGA(class, id); + if (nmatch > match) { + match = nmatch; + fn = pcivga_console; } #endif - #if NTGA - if (DEVICE_IS_TGA(class, id)) { - tga_console(pcf, pcfa, pmf, pmfa, ppf, ppfa, bus, - device, function); - return; + nmatch = DEVICE_IS_TGA(class, id); + if (nmatch > match) { + match = nmatch; + fn = tga_console; } #endif - panic("pci_display_console: unconfigured device at %d/%d/%d", + if (fn != NULL) + (*fn)(bc, pc, bus, device, function); + else + panic("pci_display_console: unconfigured device at %d/%d/%d", bus, device, function); } diff --git a/sys/arch/alpha/pci/pci_machdep.h b/sys/arch/alpha/pci/pci_machdep.h new file mode 100644 index 00000000000..1a4c5074fcb --- /dev/null +++ b/sys/arch/alpha/pci/pci_machdep.h @@ -0,0 +1,87 @@ +/* $NetBSD: pci_machdep.h,v 1.4 1996/04/12 06:08:52 cgd Exp $ */ + +/* + * Copyright (c) 1996 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ + +/* + * Machine-specific definitions for PCI autoconfiguration. + */ + +/* + * Types provided to machine-independent PCI code + */ +typedef struct alpha_pci_chipset *pci_chipset_tag_t; +typedef u_long pcitag_t; +typedef u_long pci_intr_handle_t; + +/* + * alpha-specific PCI structure and type definitions. + * NOT TO BE USED DIRECTLY BY MACHINE INDEPENDENT CODE. + */ +struct alpha_pci_chipset { + void *pc_conf_v; + void (*pc_attach_hook) __P((struct device *, + struct device *, struct pcibus_attach_args *)); + int (*pc_bus_maxdevs) __P((void *, int)); + pcitag_t (*pc_make_tag) __P((void *, int, int, int)); + void (*pc_decompose_tag) __P((void *, pcitag_t, int *, + int *, int *)); + pcireg_t (*pc_conf_read) __P((void *, pcitag_t, int)); + void (*pc_conf_write) __P((void *, pcitag_t, int, pcireg_t)); + + void *pc_intr_v; + int (*pc_intr_map) __P((void *, pcitag_t, int, int, + pci_intr_handle_t *)); + const char *(*pc_intr_string) __P((void *, pci_intr_handle_t)); + void *(*pc_intr_establish) __P((void *, pci_intr_handle_t, + int, int (*)(void *), void *)); + void (*pc_intr_disestablish) __P((void *, void *)); +}; + +/* + * Functions provided to machine-independent PCI code. + */ +#define pci_attach_hook(p, s, pba) \ + (*(pba)->pba_pc->pc_attach_hook)((p), (s), (pba)) +#define pci_bus_maxdevs(c, b) \ + (*(c)->pc_bus_maxdevs)((c)->pc_conf_v, (b)) +#define pci_make_tag(c, b, d, f) \ + (*(c)->pc_make_tag)((c)->pc_conf_v, (b), (d), (f)) +#define pci_decompose_tag(c, t, bp, dp, fp) \ + (*(c)->pc_decompose_tag)((c)->pc_conf_v, (t), (bp), (dp), (fp)) +#define pci_conf_read(c, t, r) \ + (*(c)->pc_conf_read)((c)->pc_conf_v, (t), (r)) +#define pci_conf_write(c, t, r, v) \ + (*(c)->pc_conf_write)((c)->pc_conf_v, (t), (r), (v)) +#define pci_intr_map(c, it, ip, il, ihp) \ + (*(c)->pc_intr_map)((c)->pc_intr_v, (it), (ip), (il), (ihp)) +#define pci_intr_string(c, ih) \ + (*(c)->pc_intr_string)((c)->pc_intr_v, (ih)) +#define pci_intr_establish(c, ih, l, h, a) \ + (*(c)->pc_intr_establish)((c)->pc_intr_v, (ih), (l), (h), (a)) +#define pci_intr_disestablish(c, iv) \ + (*(c)->pc_intr_disestablish)((c)->pc_intr_v, (iv)) diff --git a/sys/arch/alpha/pci/pcivga.c b/sys/arch/alpha/pci/pcivga.c index 5f62ab3fa73..96c3cfdadf9 100644 --- a/sys/arch/alpha/pci/pcivga.c +++ b/sys/arch/alpha/pci/pcivga.c @@ -1,7 +1,7 @@ -/* $NetBSD: pcivga.c,v 1.4 1995/12/24 02:29:47 mycroft Exp $ */ +/* $NetBSD: pcivga.c,v 1.8 1996/04/17 21:49:58 cgd Exp $ */ /* - * Copyright (c) 1995 Carnegie-Mellon University. + * Copyright (c) 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -36,39 +36,41 @@ #include <machine/autoconf.h> #include <machine/pte.h> -#include <dev/pseudo/ansicons.h> #include <dev/pci/pcireg.h> #include <dev/pci/pcivar.h> #include <dev/pci/pcidevs.h> #include <alpha/pci/pcivgavar.h> -#include <alpha/pci/wsconsvar.h> +#include <alpha/wscons/wsconsvar.h> + +#define PCIVGA_6845_ADDR 0x24 +#define PCIVGA_6845_DATA 0x25 int pcivgamatch __P((struct device *, void *, void *)); void pcivgaattach __P((struct device *, struct device *, void *)); +int pcivgaprint __P((void *, char *)); + +struct cfattach pcivga_ca = { + sizeof(struct pcivga_softc), pcivgamatch, pcivgaattach, +}; -struct cfdriver pcivgacd = { - NULL, "pcivga", pcivgamatch, pcivgaattach, DV_DULL, - sizeof(struct pcivga_softc) +struct cfdriver pcivga_cd = { + NULL, "pcivga", DV_DULL, }; -void pcivga_getdevconfig __P((__const struct pci_conf_fns *, void *, - __const struct pci_mem_fns *, void *, - __const struct pci_pio_fns *, void *, - pci_conftag_t tag, struct pcivga_devconfig *dc)); +void pcivga_getdevconfig __P((bus_chipset_tag_t, pci_chipset_tag_t, + pcitag_t, struct pcivga_devconfig *dc)); struct pcivga_devconfig pcivga_console_dc; -void pcivga_cursor __P((void *, int, int)); +void pcivga_cursor __P((void *, int, int, int)); void pcivga_putstr __P((void *, int, int, char *, int)); void pcivga_copycols __P((void *, int, int, int,int)); void pcivga_erasecols __P((void *, int, int, int)); void pcivga_copyrows __P((void *, int, int, int)); void pcivga_eraserows __P((void *, int, int)); -void pcivga_bell __P((void *)); /* XXX */ -struct ansicons_functions pcivga_acf = { - pcivga_bell, +struct wscons_emulfuncs pcivga_emulfuncs = { pcivga_cursor, pcivga_putstr, pcivga_copycols, @@ -77,7 +79,9 @@ struct ansicons_functions pcivga_acf = { pcivga_eraserows, }; -#define PCIVGAUNIT(dev) minor(dev) +int pcivgaioctl __P((struct device *, u_long, caddr_t, int, + struct proc *)); +int pcivgammap __P((struct device *, off_t, int)); int pcivgamatch(parent, match, aux) @@ -85,55 +89,71 @@ pcivgamatch(parent, match, aux) void *match, *aux; { struct cfdata *cf = match; - struct pcidev_attach_args *pda = aux; + struct pci_attach_args *pa = aux; /* * If it's prehistoric/vga or display/vga, we match. */ - if (PCI_CLASS(pda->pda_class) == PCI_CLASS_PREHISTORIC && - PCI_SUBCLASS(pda->pda_class) == PCI_SUBCLASS_PREHISTORIC_VGA) + if (PCI_CLASS(pa->pa_class) == PCI_CLASS_PREHISTORIC && + PCI_SUBCLASS(pa->pa_class) == PCI_SUBCLASS_PREHISTORIC_VGA) return (1); - if (PCI_CLASS(pda->pda_class) == PCI_CLASS_DISPLAY && - PCI_SUBCLASS(pda->pda_class) == PCI_SUBCLASS_DISPLAY_VGA) + if (PCI_CLASS(pa->pa_class) == PCI_CLASS_DISPLAY && + PCI_SUBCLASS(pa->pa_class) == PCI_SUBCLASS_DISPLAY_VGA) return (1); return (0); } void -pcivga_getdevconfig(pcf, pcfa, pmf, pmfa, ppf, ppfa, tag, dc) - __const struct pci_conf_fns *pcf; - __const struct pci_mem_fns *pmf; - __const struct pci_pio_fns *ppf; - void *pcfa, *pmfa, *ppfa; - pci_conftag_t tag; +pcivga_getdevconfig(bc, pc, tag, dc) + bus_chipset_tag_t bc; + pci_chipset_tag_t pc; + pcitag_t tag; struct pcivga_devconfig *dc; { + bus_io_handle_t ioh; + int cpos; - dc->dc_pcf = pcf; - dc->dc_pcfa = pcfa; - dc->dc_pmf = pmf; - dc->dc_pmfa = pmfa; - dc->dc_ppf = ppf; - dc->dc_ppfa = ppfa; + dc->dc_bc = bc; + dc->dc_pc = pc; dc->dc_pcitag = tag; /* XXX deal with mapping foo */ - /* XXX */ - dc->dc_crtat = (u_short *)PCI_MEM_MAP(pmf, pmfa, 0xb8000, 0x8000, 1); - dc->dc_iobase = 0x3d4; /* XXX */ + if (bus_mem_map(bc, 0xb8000, 0x8000, 0, &dc->dc_memh)) + panic("pcivga_getdevconfig: couldn't map memory"); + if (bus_io_map(bc, 0x3b0, 0x30, &ioh)) + panic("pcivga_getdevconfig: couldn't map io"); + dc->dc_ioh = ioh; dc->dc_nrow = 25; dc->dc_ncol = 80; + dc->dc_ccol = dc->dc_crow = 0; + bus_io_write_1(bc, ioh, PCIVGA_6845_ADDR, 14); + cpos = bus_io_read_1(bc, ioh, PCIVGA_6845_DATA) << 8; + bus_io_write_1(bc, ioh, PCIVGA_6845_ADDR, 15); + cpos |= bus_io_read_1(bc, ioh, PCIVGA_6845_DATA); + + dc->dc_crow = cpos / dc->dc_ncol; + dc->dc_ccol = cpos % dc->dc_ncol; + dc->dc_so = 0; +#if 0 dc->dc_at = 0x00 | 0xf; /* black bg | white fg */ dc->dc_so_at = 0x00 | 0xf | 0x80; /* black bg | white fg | blink */ /* clear screen, frob cursor, etc.? */ pcivga_eraserows(dc, 0, dc->dc_nrow); +#endif + /* + * XXX DEC HAS SWITCHED THE CODES FOR BLUE AND RED!!! + * XXX Therefore, though the comments say "blue bg", the code uses + * XXX the value for a red background! + */ + dc->dc_at = 0x40 | 0x0f; /* blue bg | white fg */ + dc->dc_so_at = 0x40 | 0x0f | 0x80; /* blue bg | white fg | blink */ } void @@ -141,29 +161,26 @@ pcivgaattach(parent, self, aux) struct device *parent, *self; void *aux; { - struct pcidev_attach_args *pda = aux; + struct pci_attach_args *pa = aux; struct pcivga_softc *sc = (struct pcivga_softc *)self; + struct wscons_attach_args waa; + struct wscons_odev_spec *wo; char devinfo[256]; int console; - console = (pda->pda_tag == pcivga_console_dc.dc_pcitag); + console = (pa->pa_tag == pcivga_console_dc.dc_pcitag); if (console) sc->sc_dc = &pcivga_console_dc; else { sc->sc_dc = (struct pcivga_devconfig *) malloc(sizeof(struct pcivga_devconfig), M_DEVBUF, M_WAITOK); - pcivga_getdevconfig(pda->pda_conffns, pda->pda_confarg, - pda->pda_memfns, pda->pda_memarg, pda->pda_piofns, - pda->pda_memarg, pda->pda_tag, sc->sc_dc); - } - if (sc->sc_dc->dc_crtat == NULL) { - printf(": couldn't map memory space; punt!\n"); - return; + pcivga_getdevconfig(pa->pa_bc, pa->pa_pc, pa->pa_tag, + sc->sc_dc); } - pci_devinfo(pda->pda_id, pda->pda_class, 0, devinfo); + pci_devinfo(pa->pa_id, pa->pa_class, 0, devinfo); printf(": %s (rev. 0x%02x)\n", devinfo, - PCI_REVISION(pda->pda_class)); + PCI_REVISION(pa->pa_class)); #if 0 if (sc->sc_dc->dc_tgaconf == NULL) { @@ -180,94 +197,120 @@ pcivgaattach(parent, self, aux) #if 0 pci_intrdata = pci_conf_read(sc->sc_pcitag, PCI_INTERRUPT_REG); if (PCI_INTERRUPT_PIN(pci_intrdata) != PCI_INTERRUPT_PIN_NONE) { - sc->sc_intr = pci_map_int(sc->sc_pcitag, IPL_TTY, tgaintr, sc, - sc->sc_dev.dv_xname); + sc->sc_intr = pci_map_int(sc->sc_pcitag, IPL_TTY, tgaintr, sc); if (sc->sc_intr == NULL) printf("%s: WARNING: couldn't map interrupt\n", sc->sc_dev.dv_xname); } #endif - if (!wscattach_output(self, console, &sc->sc_dc->dc_ansicons, - &pcivga_acf, sc->sc_dc, sc->sc_dc->dc_nrow, sc->sc_dc->dc_ncol, - 0, 0)) { - panic("pcivgaattach: wscattach failed"); - /* NOTREACHED */ - } + waa.waa_isconsole = console; + wo = &waa.waa_odev_spec; + wo->wo_ef = &pcivga_emulfuncs; + wo->wo_efa = sc->sc_dc; + wo->wo_nrows = sc->sc_dc->dc_nrow; + wo->wo_ncols = sc->sc_dc->dc_ncol; + wo->wo_crow = sc->sc_dc->dc_crow; + wo->wo_ccol = sc->sc_dc->dc_ccol; + wo->wo_ioctl = pcivgaioctl; + wo->wo_mmap = pcivgammap; + + config_found(self, &waa, pcivgaprint); } -#if 0 int -tgammap(dev, offset, nprot) - dev_t dev; - int offset; - int nprot; +pcivgaprint(aux, pnp) + void *aux; + char *pnp; { - struct pcivga_softc *sc = pcivgacd.cd_devs[TGAUNIT(dev)]; - if (offset > sc->sc_dc->dc_pcivgaconf->pcivgac_cspace_size) - return -1; - return alpha_btop(sc->sc_dc->dc_paddr + offset); + if (pnp) + printf("wscons at %s", pnp); + return (UNCONF); } + +int +pcivgaioctl(dev, cmd, data, flag, p) + struct device *dev; + u_long cmd; + caddr_t data; + int flag; + struct proc *p; +{ + + return -1; /* XXX */ +} + +int +pcivgammap(dev, offset, prot) + struct device *dev; + off_t offset; + int prot; +{ + struct pcivga_softc *sc = (struct pcivga_softc *)dev; + int rv; + + rv = -1; +#if 0 /* XXX */ + if (offset >= 0 && offset < 0x100000) { /* 1MB */ + /* Deal with mapping the VGA memory */ + if (offset >= 0xb8000 && offset < 0xc0000) { + offset -= 0xb8000; + rv = alpha_btop(k0segtophys(sc->sc_dc->dc_crtat) + + offset); + } + } else { + /* XXX should do something with PCI memory */ + rv = -1; + } #endif + return rv; +} void -pcivga_console(pcf, pcfa, pmf, pmfa, ppf, ppfa, bus, device, function) - __const struct pci_conf_fns *pcf; - __const struct pci_mem_fns *pmf; - __const struct pci_pio_fns *ppf; - void *pcfa, *pmfa, *ppfa; - pci_bus_t bus; - pci_device_t device; - pci_function_t function; +pcivga_console(bc, pc, bus, device, function) + bus_chipset_tag_t bc; + pci_chipset_tag_t pc; + int bus, device, function; { struct pcivga_devconfig *dcp = &pcivga_console_dc; + struct wscons_odev_spec wo; - pcivga_getdevconfig(pcf, pcfa, pmf, pmfa, ppf, ppfa, - PCI_MAKE_TAG(bus, device, function), dcp); + pcivga_getdevconfig(bc, pc, + pci_make_tag(pc, bus, device, function), dcp); - /* sanity checks */ - if (dcp->dc_crtat == NULL) - panic("pcivga_console(%d, %d): couldn't map memory space", - device, function); -#if 0 - if (dcp->dc_pcivgaconf == NULL) - panic("pcivga_console(%d, %d): unknown board configuration", - device, function); -#endif + wo.wo_ef = &pcivga_emulfuncs; + wo.wo_efa = dcp; + wo.wo_nrows = dcp->dc_nrow; + wo.wo_ncols = dcp->dc_ncol; + wo.wo_crow = dcp->dc_crow; + wo.wo_ccol = dcp->dc_ccol; + /* ioctl and mmap are unused until real attachment. */ - wsc_console(&dcp->dc_ansicons, &pcivga_acf, dcp, - dcp->dc_nrow, dcp->dc_ncol, 0, 0); + wscons_attach_console(&wo); } /* * The following functions implement the MI ANSI terminal emulation on * a VGA display. */ -void /* XXX */ -pcivga_bell(id) /* XXX */ - void *id; /* XXX */ -{ /* XXX */ - /* XXX */ - printf("pcivga_bell: unimplemented\n"); /* XXX */ -} /* XXX */ - void -pcivga_cursor(id, row, col) +pcivga_cursor(id, on, row, col) void *id; - int row, col; + int on, row, col; { struct pcivga_devconfig *dc = id; + bus_chipset_tag_t bc = dc->dc_bc; + bus_io_handle_t ioh = dc->dc_ioh; int pos; #if 0 printf("pcivga_cursor: %d %d\n", row, col); #endif /* turn the cursor off */ - if (row == -1 || col == -1) { - dc->dc_crow = dc->dc_ccol = PCIVGA_CURSOR_OFF; - - /* XXX disable cursor??? */ + if (!on) { + /* XXX disable cursor how??? */ + dc->dc_crow = dc->dc_ccol = -1; } else { dc->dc_crow = row; dc->dc_ccol = col; @@ -275,10 +318,10 @@ pcivga_cursor(id, row, col) pos = row * dc->dc_ncol + col; - OUTB(dc->dc_ppf, dc->dc_ppfa, dc->dc_iobase, 14); - OUTB(dc->dc_ppf, dc->dc_ppfa, dc->dc_iobase+1, pos >> 8); - OUTB(dc->dc_ppf, dc->dc_ppfa, dc->dc_iobase, 15); - OUTB(dc->dc_ppf, dc->dc_ppfa, dc->dc_iobase+1, pos); + bus_io_write_1(bc, ioh, PCIVGA_6845_ADDR, 14); + bus_io_write_1(bc, ioh, PCIVGA_6845_DATA, pos >> 8); + bus_io_write_1(bc, ioh, PCIVGA_6845_ADDR, 15); + bus_io_write_1(bc, ioh, PCIVGA_6845_DATA, pos); } void @@ -289,20 +332,16 @@ pcivga_putstr(id, row, col, cp, len) int len; { struct pcivga_devconfig *dc = id; + bus_chipset_tag_t bc = dc->dc_bc; + bus_mem_handle_t memh = dc->dc_memh; char *dcp; - int i; + int i, off; - for (i = 0; i < len; i++, cp++) { - dcp = (char *)&dc->dc_crtat[row * dc->dc_ncol + col]; -#if 0 -printf("*cp = %c, attr = 0x%x\n", *cp, dc->dc_so ? dc->dc_so_at : dc->dc_at); -printf("was: %c/", *dcp); -#endif - *dcp++ = *cp; -#if 0 -printf("0x%x\n", *dcp); -#endif - *dcp++ = dc->dc_so ? dc->dc_so_at : dc->dc_at; + off = (row * dc->dc_ncol + col) * 2; + for (i = 0; i < len; i++, cp++, off += 2) { + bus_mem_write_1(bc, memh, off, *cp); + bus_mem_write_1(bc, memh, off + 1, + dc->dc_so ? dc->dc_so_at : dc->dc_at); } } @@ -312,16 +351,20 @@ pcivga_copycols(id, row, srccol, dstcol, ncols) int row, srccol, dstcol, ncols; { struct pcivga_devconfig *dc = id; - u_short *ssp, *dsp; - int nclr; + bus_chipset_tag_t bc = dc->dc_bc; + bus_mem_handle_t memh = dc->dc_memh; + bus_mem_size_t srcoff, srcend, dstoff; -#if 0 - printf("pcivga_copycols: row %d: %d, %d -> %d\n", row, srccol, ncols, - dstcol); -#endif - ssp = &dc->dc_crtat[row * dc->dc_ncol + srccol]; - dsp = &dc->dc_crtat[row * dc->dc_ncol + dstcol]; - bcopy(ssp, dsp, ncols * sizeof(u_short)); + /* + * YUCK. Need bus copy functions. + */ + srcoff = (row * dc->dc_ncol + srccol) * 2; + srcend = srcoff + ncols * 2; + dstoff = (row * dc->dc_ncol + dstcol) * 2; + + for (; srcoff < srcend; srcoff += 2, dstoff += 2) + bus_mem_write_2(bc, memh, dstoff, + bus_mem_read_2(bc, memh, srcoff)); } void @@ -330,15 +373,20 @@ pcivga_erasecols(id, row, startcol, ncols) int row, startcol, ncols; { struct pcivga_devconfig *dc = id; - u_short *ssp; - int i; + bus_chipset_tag_t bc = dc->dc_bc; + bus_mem_handle_t memh = dc->dc_memh; + bus_mem_size_t off, endoff; + u_int16_t val; -#if 0 - printf("pcivga_erasecols: row %d: %d, %d\n", row, startcol, ncols); -#endif - ssp = &dc->dc_crtat[row * dc->dc_ncol + startcol]; - for (i = 0; i < ncols; i++) - *ssp++ = (dc->dc_at << 8) | ' '; + /* + * YUCK. Need bus 'set' functions. + */ + off = (row * dc->dc_ncol + startcol) * 2; + endoff = off + ncols * 2; + val = (dc->dc_at << 8) | ' '; + + for (; off < endoff; off += 2) + bus_mem_write_2(bc, memh, off, val); } void @@ -347,15 +395,20 @@ pcivga_copyrows(id, srcrow, dstrow, nrows) int srcrow, dstrow, nrows; { struct pcivga_devconfig *dc = id; - u_short *ssp, *dsp; - int nclr; + bus_chipset_tag_t bc = dc->dc_bc; + bus_mem_handle_t memh = dc->dc_memh; + bus_mem_size_t srcoff, srcend, dstoff; -#if 0 - printf("pcivga_copyrows: %d, %d -> %d\n", srcrow, nrows, dstrow); -#endif - ssp = &dc->dc_crtat[srcrow * dc->dc_ncol + 0]; - dsp = &dc->dc_crtat[dstrow * dc->dc_ncol + 0]; - bcopy(ssp, dsp, nrows * dc->dc_ncol * sizeof(u_short)); + /* + * YUCK. Need bus copy functions. + */ + srcoff = (srcrow * dc->dc_ncol + 0) * 2; + srcend = srcoff + (nrows * dc->dc_ncol * 2); + dstoff = (dstrow * dc->dc_ncol + 0) * 2; + + for (; srcoff < srcend; srcoff += 2, dstoff += 2) + bus_mem_write_2(bc, memh, dstoff, + bus_mem_read_2(bc, memh, srcoff)); } void @@ -364,13 +417,18 @@ pcivga_eraserows(id, startrow, nrows) int startrow, nrows; { struct pcivga_devconfig *dc = id; - u_short *ssp; - int i; + bus_chipset_tag_t bc = dc->dc_bc; + bus_mem_handle_t memh = dc->dc_memh; + bus_mem_size_t off, endoff; + u_int16_t val; -#if 0 - printf("pcivga_eraserows: %d, %d\n", startrow, nrows); -#endif - ssp = &dc->dc_crtat[startrow * dc->dc_ncol + 0]; - for (i = 0; i < nrows * dc->dc_ncol; i++) - *ssp++ = (dc->dc_at << 8) | ' '; + /* + * YUCK. Need bus 'set' functions. + */ + off = (startrow * dc->dc_ncol + 0) * 2; + endoff = off + (nrows * dc->dc_ncol) * 2; + val = (dc->dc_at << 8) | ' '; + + for (; off < endoff; off += 2) + bus_mem_write_2(bc, memh, off, val); } diff --git a/sys/arch/alpha/pci/pcivgavar.h b/sys/arch/alpha/pci/pcivgavar.h index 579ad4ca0a4..da42958de3f 100644 --- a/sys/arch/alpha/pci/pcivgavar.h +++ b/sys/arch/alpha/pci/pcivgavar.h @@ -1,7 +1,7 @@ -/* $NetBSD: pcivgavar.h,v 1.3 1995/11/23 02:38:13 cgd Exp $ */ +/* $NetBSD: pcivgavar.h,v 1.5 1996/04/12 06:08:58 cgd Exp $ */ /* - * Copyright (c) 1995 Carnegie-Mellon University. + * Copyright (c) 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -27,20 +27,14 @@ * rights to redistribute these changes. */ -#include <dev/pseudo/ansicons.h> - struct pcivga_devconfig { - __const struct pci_conf_fns *dc_pcf; - void *dc_pcfa; - __const struct pci_mem_fns *dc_pmf; - void *dc_pmfa; - __const struct pci_pio_fns *dc_ppf; - void *dc_ppfa; + bus_chipset_tag_t dc_bc; + pci_chipset_tag_t dc_pc; - pci_tag_t dc_pcitag; /* PCI tag */ + pcitag_t dc_pcitag; /* PCI tag */ - u_int16_t *dc_crtat; /* VGA screen memory */ - int dc_iobase; /* VGA I/O address */ + bus_io_handle_t dc_ioh; + bus_mem_handle_t dc_memh; int dc_ncol, dc_nrow; /* screen width & height */ int dc_ccol, dc_crow; /* current cursor position */ @@ -48,8 +42,6 @@ struct pcivga_devconfig { char dc_so; /* in standout mode? */ char dc_at; /* normal attributes */ char dc_so_at; /* standout attributes */ - - struct ansicons dc_ansicons; /* ansi console emulator info XXX */ }; struct pcivga_softc { @@ -59,15 +51,11 @@ struct pcivga_softc { void *sc_intr; /* interrupt handler info */ }; -#define PCIVGA_CURSOR_OFF -1 /* pass to pcivga_cpos to disable */ - #define DEVICE_IS_PCIVGA(class, id) \ - ((PCI_CLASS(class) == PCI_CLASS_DISPLAY && \ + (((PCI_CLASS(class) == PCI_CLASS_DISPLAY && \ PCI_SUBCLASS(class) == PCI_SUBCLASS_DISPLAY_VGA) || \ (PCI_CLASS(class) == PCI_CLASS_PREHISTORIC && \ - PCI_SUBCLASS(class) == PCI_SUBCLASS_PREHISTORIC_VGA)) + PCI_SUBCLASS(class) == PCI_SUBCLASS_PREHISTORIC_VGA)) ? 1 : 0) -void pcivga_console __P((__const struct pci_conf_fns *, void *, - __const struct pci_mem_fns *, void *, - __const struct pci_pio_fns *, void *, - pci_bus_t, pci_device_t, pci_function_t)); +void pcivga_console __P((bus_chipset_tag_t, pci_chipset_tag_t, int, int, + int)); diff --git a/sys/arch/alpha/pci/pcs_bus_io_common.c b/sys/arch/alpha/pci/pcs_bus_io_common.c new file mode 100644 index 00000000000..3d1e904467b --- /dev/null +++ b/sys/arch/alpha/pci/pcs_bus_io_common.c @@ -0,0 +1,488 @@ +/* $NetBSD: pcs_bus_io_common.c,v 1.2.4.2 1996/06/13 18:16:59 cgd Exp $ */ + +/* + * Copyright (c) 1995, 1996 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ + +/* + * Common PCI Chipset "bus I/O" functions, for chipsets which have to + * deal with only a single PCI interface chip in a machine. + * + * uses: + * CHIP name of the 'chip' it's being compiled for. + * CHIP_IO_BASE Sparse I/O space base to use. + */ + +#define __C(A,B) __CONCAT(A,B) +#define __S(S) __STRING(S) + +int __C(CHIP,_io_map) __P((void *, bus_io_addr_t, bus_io_size_t, + bus_io_handle_t *)); +void __C(CHIP,_io_unmap) __P((void *, bus_io_handle_t, + bus_io_size_t)); +int __C(CHIP,_io_subregion) __P((void *, bus_io_handle_t, + bus_io_size_t, bus_io_size_t, bus_io_handle_t *)); +u_int8_t __C(CHIP,_io_read_1) __P((void *, bus_io_handle_t, + bus_io_size_t)); +u_int16_t __C(CHIP,_io_read_2) __P((void *, bus_io_handle_t, + bus_io_size_t)); +u_int32_t __C(CHIP,_io_read_4) __P((void *, bus_io_handle_t, + bus_io_size_t)); +u_int64_t __C(CHIP,_io_read_8) __P((void *, bus_io_handle_t, + bus_io_size_t)); +void __C(CHIP,_io_read_multi_1) __P((void *, bus_io_handle_t, + bus_io_size_t, u_int8_t *, bus_io_size_t)); +void __C(CHIP,_io_read_multi_2) __P((void *, bus_io_handle_t, + bus_io_size_t, u_int16_t *, bus_io_size_t)); +void __C(CHIP,_io_read_multi_4) __P((void *, bus_io_handle_t, + bus_io_size_t, u_int32_t *, bus_io_size_t)); +void __C(CHIP,_io_read_multi_8) __P((void *, bus_io_handle_t, + bus_io_size_t, u_int64_t *, bus_io_size_t)); +void __C(CHIP,_io_write_1) __P((void *, bus_io_handle_t, + bus_io_size_t, u_int8_t)); +void __C(CHIP,_io_write_2) __P((void *, bus_io_handle_t, + bus_io_size_t, u_int16_t)); +void __C(CHIP,_io_write_4) __P((void *, bus_io_handle_t, + bus_io_size_t, u_int32_t)); +void __C(CHIP,_io_write_8) __P((void *, bus_io_handle_t, + bus_io_size_t, u_int64_t)); +void __C(CHIP,_io_write_multi_1) __P((void *, bus_io_handle_t, + bus_io_size_t, const u_int8_t *, bus_io_size_t)); +void __C(CHIP,_io_write_multi_2) __P((void *, bus_io_handle_t, + bus_io_size_t, const u_int16_t *, bus_io_size_t)); +void __C(CHIP,_io_write_multi_4) __P((void *, bus_io_handle_t, + bus_io_size_t, const u_int32_t *, bus_io_size_t)); +void __C(CHIP,_io_write_multi_8) __P((void *, bus_io_handle_t, + bus_io_size_t, const u_int64_t *, bus_io_size_t)); + +void +__C(CHIP,_bus_io_init)(bc, iov) + bus_chipset_tag_t bc; + void *iov; +{ + + bc->bc_i_v = iov; + + bc->bc_i_map = __C(CHIP,_io_map); + bc->bc_i_unmap = __C(CHIP,_io_unmap); + bc->bc_i_subregion = __C(CHIP,_io_subregion); + + bc->bc_ir1 = __C(CHIP,_io_read_1); + bc->bc_ir2 = __C(CHIP,_io_read_2); + bc->bc_ir4 = __C(CHIP,_io_read_4); + bc->bc_ir8 = __C(CHIP,_io_read_8); + + bc->bc_irm1 = __C(CHIP,_io_read_multi_1); + bc->bc_irm2 = __C(CHIP,_io_read_multi_2); + bc->bc_irm4 = __C(CHIP,_io_read_multi_4); + bc->bc_irm8 = __C(CHIP,_io_read_multi_8); + + bc->bc_iw1 = __C(CHIP,_io_write_1); + bc->bc_iw2 = __C(CHIP,_io_write_2); + bc->bc_iw4 = __C(CHIP,_io_write_4); + bc->bc_iw8 = __C(CHIP,_io_write_8); + + bc->bc_iwm1 = __C(CHIP,_io_write_multi_1); + bc->bc_iwm2 = __C(CHIP,_io_write_multi_2); + bc->bc_iwm4 = __C(CHIP,_io_write_multi_4); + bc->bc_iwm8 = __C(CHIP,_io_write_multi_8); +} + +int +__C(CHIP,_io_map)(v, ioaddr, iosize, iohp) + void *v; + bus_io_addr_t ioaddr; + bus_io_size_t iosize; + bus_io_handle_t *iohp; +{ + +#ifdef CHIP_IO_W1_START + if (ioaddr >= CHIP_IO_W1_START(v) && + ioaddr <= CHIP_IO_W1_END(v)) { + *iohp = (phystok0seg(CHIP_IO_W1_BASE(v)) >> 5) + + (ioaddr & CHIP_IO_W1_MASK(v)); + } else +#endif +#ifdef CHIP_IO_W2_START + if (ioaddr >= CHIP_IO_W2_START(v) && + ioaddr <= CHIP_IO_W2_END(v)) { + *iohp = (phystok0seg(CHIP_IO_W2_BASE(v)) >> 5) + + (ioaddr & CHIP_IO_W2_MASK(v)); + } else +#endif + { + printf("\n"); +#ifdef CHIP_IO_W1_START + printf("%s: window[1]=0x%lx-0x%lx\n", + __S(__C(CHIP,_io_map)), CHIP_IO_W1_START(v), + CHIP_IO_W1_END(v)-1); +#endif +#ifdef CHIP_IO_W2_START + printf("%s: window[2]=0x%lx-0x%lx\n", + __S(__C(CHIP,_io_map)), CHIP_IO_W2_START(v), + CHIP_IO_W2_END(v)-1); +#endif + panic("%s: don't know how to map %lx non-cacheable\n", + __S(__C(CHIP,_io_map)), ioaddr); + } + + return (0); +} + +void +__C(CHIP,_io_unmap)(v, ioh, iosize) + void *v; + bus_io_handle_t ioh; + bus_io_size_t iosize; +{ + + /* XXX nothing to do. */ +} + +int +__C(CHIP,_io_subregion)(v, ioh, offset, size, nioh) + void *v; + bus_io_handle_t ioh, *nioh; + bus_io_size_t offset, size; +{ + + *nioh = ioh + offset; + return (0); +} + +u_int8_t +__C(CHIP,_io_read_1)(v, ioh, off) + void *v; + bus_io_handle_t ioh; + bus_io_size_t off; +{ + register bus_io_handle_t tmpioh; + register u_int32_t *port, val; + register u_int8_t rval; + register int offset; + + wbflush(); + + tmpioh = ioh + off; + offset = tmpioh & 3; + port = (u_int32_t *)((tmpioh << 5) | (0 << 3)); + val = *port; + rval = ((val) >> (8 * offset)) & 0xff; + + return rval; +} + +u_int16_t +__C(CHIP,_io_read_2)(v, ioh, off) + void *v; + bus_io_handle_t ioh; + bus_io_size_t off; +{ + register bus_io_handle_t tmpioh; + register u_int32_t *port, val; + register u_int16_t rval; + register int offset; + + wbflush(); + + tmpioh = ioh + off; + offset = tmpioh & 3; + port = (u_int32_t *)((tmpioh << 5) | (1 << 3)); + val = *port; + rval = ((val) >> (8 * offset)) & 0xffff; + + return rval; +} + +u_int32_t +__C(CHIP,_io_read_4)(v, ioh, off) + void *v; + bus_io_handle_t ioh; + bus_io_size_t off; +{ + register bus_io_handle_t tmpioh; + register u_int32_t *port, val; + register u_int32_t rval; + register int offset; + + wbflush(); + + tmpioh = ioh + off; + offset = tmpioh & 3; + port = (u_int32_t *)((tmpioh << 5) | (3 << 3)); + val = *port; +#if 0 + rval = ((val) >> (8 * offset)) & 0xffffffff; +#else + rval = val; +#endif + + return rval; +} + +u_int64_t +__C(CHIP,_io_read_8)(v, ioh, off) + void *v; + bus_io_handle_t ioh; + bus_io_size_t off; +{ + + /* XXX XXX XXX */ + panic("%s not implemented\n", __S(__C(CHIP,_io_read_8))); +} + +void +__C(CHIP,_io_read_multi_1)(v, ioh, off, addr, count) + void *v; + bus_io_handle_t ioh; + bus_io_size_t off, count; + u_int8_t *addr; +{ + register bus_io_handle_t tmpioh; + register u_int32_t *port, val; + register int offset; + + wbflush(); + + while (count--) { + tmpioh = ioh + off; + offset = tmpioh & 3; + port = (u_int32_t *)((tmpioh << 5) | (0 << 3)); + val = *port; + *addr++ = ((val) >> (8 * offset)) & 0xff; + off++; + } +} + +void +__C(CHIP,_io_read_multi_2)(v, ioh, off, addr, count) + void *v; + bus_io_handle_t ioh; + bus_io_size_t off, count; + u_int16_t *addr; +{ + register bus_io_handle_t tmpioh; + register u_int32_t *port, val; + register int offset; + + wbflush(); + + while (count--) { + tmpioh = ioh + off; + offset = tmpioh & 3; + port = (u_int32_t *)((tmpioh << 5) | (1 << 3)); + val = *port; + *addr++ = ((val) >> (8 * offset)) & 0xffff; + off++; + } +} + +void +__C(CHIP,_io_read_multi_4)(v, ioh, off, addr, count) + void *v; + bus_io_handle_t ioh; + bus_io_size_t off, count; + u_int32_t *addr; +{ + register bus_io_handle_t tmpioh; + register u_int32_t *port, val; + register int offset; + + wbflush(); + + while (count--) { + tmpioh = ioh + off; + offset = tmpioh & 3; + port = (u_int32_t *)((tmpioh << 5) | (3 << 3)); + val = *port; +#if 0 + *addr++ = ((val) >> (8 * offset)) & 0xffffffff; +#else + *addr++ = val; +#endif + off++; + } +} + +void +__C(CHIP,_io_read_multi_8)(v, ioh, off, addr, count) + void *v; + bus_io_handle_t ioh; + bus_io_size_t off, count; + u_int64_t *addr; +{ + + /* XXX XXX XXX */ + panic("%s not implemented\n", __S(__C(CHIP,_io_read_multi_8))); +} + +void +__C(CHIP,_io_write_1)(v, ioh, off, val) + void *v; + bus_io_handle_t ioh; + bus_io_size_t off; + u_int8_t val; +{ + register bus_io_handle_t tmpioh; + register u_int32_t *port, nval; + register int offset; + + tmpioh = ioh + off; + offset = tmpioh & 3; + nval = val << (8 * offset); + port = (u_int32_t *)((tmpioh << 5) | (0 << 3)); + *port = nval; + wbflush(); +} + +void +__C(CHIP,_io_write_2)(v, ioh, off, val) + void *v; + bus_io_handle_t ioh; + bus_io_size_t off; + u_int16_t val; +{ + register bus_io_handle_t tmpioh; + register u_int32_t *port, nval; + register int offset; + + tmpioh = ioh + off; + offset = tmpioh & 3; + nval = val << (8 * offset); + port = (u_int32_t *)((tmpioh << 5) | (1 << 3)); + *port = nval; + wbflush(); +} + +void +__C(CHIP,_io_write_4)(v, ioh, off, val) + void *v; + bus_io_handle_t ioh; + bus_io_size_t off; + u_int32_t val; +{ + register bus_io_handle_t tmpioh; + register u_int32_t *port, nval; + register int offset; + + tmpioh = ioh + off; + offset = tmpioh & 3; + nval = val /*<< (8 * offset)*/; + port = (u_int32_t *)((tmpioh << 5) | (3 << 3)); + *port = nval; + wbflush(); +} + +void +__C(CHIP,_io_write_8)(v, ioh, off, val) + void *v; + bus_io_handle_t ioh; + bus_io_size_t off; + u_int64_t val; +{ + + /* XXX XXX XXX */ + panic("%s not implemented\n", __S(__C(CHIP,_io_write_8))); + wbflush(); +} + +void +__C(CHIP,_io_write_multi_1)(v, ioh, off, addr, count) + void *v; + bus_io_handle_t ioh; + bus_io_size_t off, count; + const u_int8_t *addr; +{ + register bus_io_handle_t tmpioh; + register u_int32_t *port, nval; + register int offset; + + while (count--) { + tmpioh = ioh + off; + offset = tmpioh & 3; + nval = (*addr++) << (8 * offset); + port = (u_int32_t *)((tmpioh << 5) | (0 << 3)); + *port = nval; + off++; + } + wbflush(); +} + +void +__C(CHIP,_io_write_multi_2)(v, ioh, off, addr, count) + void *v; + bus_io_handle_t ioh; + bus_io_size_t off, count; + const u_int16_t *addr; +{ + register bus_io_handle_t tmpioh; + register u_int32_t *port, nval; + register int offset; + + while (count--) { + tmpioh = ioh + off; + offset = tmpioh & 3; + nval = (*addr++) << (8 * offset); + port = (u_int32_t *)((tmpioh << 5) | (1 << 3)); + *port = nval; + off++; + } + wbflush(); +} + +void +__C(CHIP,_io_write_multi_4)(v, ioh, off, addr, count) + void *v; + bus_io_handle_t ioh; + bus_io_size_t off, count; + const u_int32_t *addr; +{ + register bus_io_handle_t tmpioh; + register u_int32_t *port, nval; + register int offset; + + while (count--) { + tmpioh = ioh + off; + offset = tmpioh & 3; + nval = (*addr++) /*<< (8 * offset)*/; + port = (u_int32_t *)((tmpioh << 5) | (3 << 3)); + *port = nval; + off++; + } + wbflush(); +} + +void +__C(CHIP,_io_write_multi_8)(v, ioh, off, addr, count) + void *v; + bus_io_handle_t ioh; + bus_io_size_t off, count; + const u_int64_t *addr; +{ + + /* XXX XXX XXX */ + panic("%s not implemented\n", __S(__C(CHIP,_io_write_multi_8))); +} diff --git a/sys/arch/alpha/pci/pcs_bus_mem_common.c b/sys/arch/alpha/pci/pcs_bus_mem_common.c new file mode 100644 index 00000000000..3697a497a15 --- /dev/null +++ b/sys/arch/alpha/pci/pcs_bus_mem_common.c @@ -0,0 +1,378 @@ +/* $NetBSD: pcs_bus_mem_common.c,v 1.1.4.4 1996/06/13 18:17:01 cgd Exp $ */ + +/* + * Copyright (c) 1995, 1996 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ + +/* + * Common PCI Chipset "bus I/O" functions, for chipsets which have to + * deal with only a single PCI interface chip in a machine. + * + * uses: + * CHIP name of the 'chip' it's being compiled for. + * CHIP_D_MEM_BASE Dense Mem space base to use. + * CHIP_S_MEM_BASE Sparse Mem space base to use. + */ + +#define __C(A,B) __CONCAT(A,B) +#define __S(S) __STRING(S) + +int __C(CHIP,_mem_map) __P((void *, bus_mem_addr_t, bus_mem_size_t, + int, bus_mem_handle_t *)); +void __C(CHIP,_mem_unmap) __P((void *, bus_mem_handle_t, + bus_mem_size_t)); +int __C(CHIP,_mem_subregion) __P((void *, bus_mem_handle_t, + bus_mem_size_t, bus_mem_size_t, bus_mem_handle_t *)); +u_int8_t __C(CHIP,_mem_read_1) __P((void *, bus_mem_handle_t, + bus_mem_size_t)); +u_int16_t __C(CHIP,_mem_read_2) __P((void *, bus_mem_handle_t, + bus_mem_size_t)); +u_int32_t __C(CHIP,_mem_read_4) __P((void *, bus_mem_handle_t, + bus_mem_size_t)); +u_int64_t __C(CHIP,_mem_read_8) __P((void *, bus_mem_handle_t, + bus_mem_size_t)); +void __C(CHIP,_mem_write_1) __P((void *, bus_mem_handle_t, + bus_mem_size_t, u_int8_t)); +void __C(CHIP,_mem_write_2) __P((void *, bus_mem_handle_t, + bus_mem_size_t, u_int16_t)); +void __C(CHIP,_mem_write_4) __P((void *, bus_mem_handle_t, + bus_mem_size_t, u_int32_t)); +void __C(CHIP,_mem_write_8) __P((void *, bus_mem_handle_t, + bus_mem_size_t, u_int64_t)); + +/* XXX DOES NOT BELONG */ +vm_offset_t __C(CHIP,_XXX_dmamap) __P((void *)); + +void +__C(CHIP,_bus_mem_init)(bc, memv) + bus_chipset_tag_t bc; + void *memv; +{ + + bc->bc_m_v = memv; + + bc->bc_m_map = __C(CHIP,_mem_map); + bc->bc_m_unmap = __C(CHIP,_mem_unmap); + bc->bc_m_subregion = __C(CHIP,_mem_subregion); + + bc->bc_mr1 = __C(CHIP,_mem_read_1); + bc->bc_mr2 = __C(CHIP,_mem_read_2); + bc->bc_mr4 = __C(CHIP,_mem_read_4); + bc->bc_mr8 = __C(CHIP,_mem_read_8); + + bc->bc_mw1 = __C(CHIP,_mem_write_1); + bc->bc_mw2 = __C(CHIP,_mem_write_2); + bc->bc_mw4 = __C(CHIP,_mem_write_4); + bc->bc_mw8 = __C(CHIP,_mem_write_8); + + /* XXX DOES NOT BELONG */ + bc->bc_XXX_dmamap = __C(CHIP,_XXX_dmamap); +} + +int +__C(CHIP,_mem_map)(v, memaddr, memsize, cacheable, memhp) + void *v; + bus_mem_addr_t memaddr; + bus_mem_size_t memsize; + int cacheable; + bus_mem_handle_t *memhp; +{ + + if (cacheable) { +#ifdef CHIP_D_MEM_W1_START + if (memaddr >= CHIP_D_MEM_W1_START(v) && + memaddr <= CHIP_D_MEM_W1_END(v)) { + *memhp = phystok0seg(CHIP_D_MEM_W1_BASE(v)) + + (memaddr & CHIP_D_MEM_W1_MASK(v)); + } else +#endif + { + printf("\n"); +#ifdef CHIP_D_MEM_W1_START + printf("%s: window[1]=0x%lx-0x%lx\n", + __S(__C(CHIP,_mem_map)), CHIP_D_MEM_W1_START(v), + CHIP_D_MEM_W1_END(v)-1); +#endif + panic("%s: don't know how to map %lx cacheable\n", + __S(__C(CHIP,_mem_map)), memaddr); + } + } else { +#ifdef CHIP_S_MEM_W1_START + if (memaddr >= CHIP_S_MEM_W1_START(v) && + memaddr <= CHIP_S_MEM_W1_END(v)) { + *memhp = (phystok0seg(CHIP_S_MEM_W1_BASE(v)) >> 5) + + (memaddr & CHIP_S_MEM_W1_MASK(v)); + } else +#endif +#ifdef CHIP_S_MEM_W2_START + if (memaddr >= CHIP_S_MEM_W2_START(v) && + memaddr <= CHIP_S_MEM_W2_END(v)) { + *memhp = (phystok0seg(CHIP_S_MEM_W2_BASE(v)) >> 5) + + (memaddr & CHIP_S_MEM_W2_MASK(v)); + } else +#endif +#ifdef CHIP_S_MEM_W3_START + if (memaddr >= CHIP_S_MEM_W3_START(v) && + memaddr <= CHIP_S_MEM_W3_END(v)) { + *memhp = (phystok0seg(CHIP_S_MEM_W3_BASE(v)) >> 5) + + (memaddr & CHIP_S_MEM_W3_MASK(v)); + } else +#endif + { + printf("\n"); +#ifdef CHIP_S_MEM_W1_START + printf("%s: window[1]=0x%lx-0x%lx\n", + __S(__C(CHIP,_mem_map)), CHIP_S_MEM_W1_START(v), + CHIP_S_MEM_W1_END(v)-1); +#endif +#ifdef CHIP_S_MEM_W2_START + printf("%s: window[2]=0x%lx-0x%lx\n", + __S(__C(CHIP,_mem_map)), CHIP_S_MEM_W2_START(v), + CHIP_S_MEM_W2_END(v)-1); +#endif +#ifdef CHIP_S_MEM_W3_START + printf("%s: window[3]=0x%lx-0x%lx\n", + __S(__C(CHIP,_mem_map)), CHIP_S_MEM_W3_START(v), + CHIP_S_MEM_W3_END(v)-1); +#endif + panic("%s: don't know how to map %lx non-cacheable\n", + __S(__C(CHIP,_mem_map)), memaddr); + } + } + + return (0); +} + +void +__C(CHIP,_mem_unmap)(v, memh, memsize) + void *v; + bus_mem_handle_t memh; + bus_mem_size_t memsize; +{ + + /* XXX nothing to do. */ +} + +int +__C(CHIP,_mem_subregion)(v, memh, offset, size, nmemh) + void *v; + bus_mem_handle_t memh, *nmemh; + bus_mem_size_t offset, size; +{ + + *nmemh = memh + offset; + return (0); +} + +u_int8_t +__C(CHIP,_mem_read_1)(v, memh, off) + void *v; + bus_mem_handle_t memh; + bus_mem_size_t off; +{ + register bus_mem_handle_t tmpmemh; + register u_int32_t *port, val; + register u_int8_t rval; + register int offset; + + wbflush(); + + if ((memh >> 63) != 0) + return (*(u_int8_t *)(memh + off)); + + tmpmemh = memh + off; + offset = tmpmemh & 3; + port = (u_int32_t *)((tmpmemh << 5) | (0 << 3)); + val = *port; + rval = ((val) >> (8 * offset)) & 0xff; + + return rval; +} + +u_int16_t +__C(CHIP,_mem_read_2)(v, memh, off) + void *v; + bus_mem_handle_t memh; + bus_mem_size_t off; +{ + register bus_mem_handle_t tmpmemh; + register u_int32_t *port, val; + register u_int16_t rval; + register int offset; + + wbflush(); + + if ((memh >> 63) != 0) + return (*(u_int16_t *)(memh + off)); + + tmpmemh = memh + off; + offset = tmpmemh & 3; + port = (u_int32_t *)((tmpmemh << 5) | (1 << 3)); + val = *port; + rval = ((val) >> (8 * offset)) & 0xffff; + + return rval; +} + +u_int32_t +__C(CHIP,_mem_read_4)(v, memh, off) + void *v; + bus_mem_handle_t memh; + bus_mem_size_t off; +{ + register bus_mem_handle_t tmpmemh; + register u_int32_t *port, val; + register u_int32_t rval; + register int offset; + + wbflush(); + + if ((memh >> 63) != 0) + return (*(u_int32_t *)(memh + off)); + + tmpmemh = memh + off; + offset = tmpmemh & 3; + port = (u_int32_t *)((tmpmemh << 5) | (3 << 3)); + val = *port; +#if 0 + rval = ((val) >> (8 * offset)) & 0xffffffff; +#else + rval = val; +#endif + + return rval; +} + +u_int64_t +__C(CHIP,_mem_read_8)(v, memh, off) + void *v; + bus_mem_handle_t memh; + bus_mem_size_t off; +{ + + wbflush(); + + if ((memh >> 63) != 0) + return (*(u_int64_t *)(memh + off)); + + /* XXX XXX XXX */ + panic("%s not implemented\n", __S(__C(CHIP,_mem_read_8))); +} + +void +__C(CHIP,_mem_write_1)(v, memh, off, val) + void *v; + bus_mem_handle_t memh; + bus_mem_size_t off; + u_int8_t val; +{ + register bus_mem_handle_t tmpmemh; + register u_int32_t *port, nval; + register int offset; + + if ((memh >> 63) != 0) + (*(u_int8_t *)(memh + off)) = val; + else { + tmpmemh = memh + off; + offset = tmpmemh & 3; + nval = val << (8 * offset); + port = (u_int32_t *)((tmpmemh << 5) | (0 << 3)); + *port = nval; + } + wbflush(); +} + +void +__C(CHIP,_mem_write_2)(v, memh, off, val) + void *v; + bus_mem_handle_t memh; + bus_mem_size_t off; + u_int16_t val; +{ + register bus_mem_handle_t tmpmemh; + register u_int32_t *port, nval; + register int offset; + + if ((memh >> 63) != 0) + (*(u_int16_t *)(memh + off)) = val; + else { + tmpmemh = memh + off; + offset = tmpmemh & 3; + nval = val << (8 * offset); + port = (u_int32_t *)((tmpmemh << 5) | (1 << 3)); + *port = nval; + } + wbflush(); +} + +void +__C(CHIP,_mem_write_4)(v, memh, off, val) + void *v; + bus_mem_handle_t memh; + bus_mem_size_t off; + u_int32_t val; +{ + register bus_mem_handle_t tmpmemh; + register u_int32_t *port, nval; + register int offset; + + if ((memh >> 63) != 0) + (*(u_int32_t *)(memh + off)) = val; + else { + tmpmemh = memh + off; + offset = tmpmemh & 3; + nval = val /*<< (8 * offset)*/; + port = (u_int32_t *)((tmpmemh << 5) | (3 << 3)); + *port = nval; + } + wbflush(); +} + +void +__C(CHIP,_mem_write_8)(v, memh, off, val) + void *v; + bus_mem_handle_t memh; + bus_mem_size_t off; + u_int64_t val; +{ + + if ((memh >> 63) != 0) + (*(u_int64_t *)(memh + off)) = val; + else { + /* XXX XXX XXX */ + panic("%s not implemented\n", + __S(__C(CHIP,_mem_write_8))); + } + wbflush(); +} + +vm_offset_t +__C(CHIP,_XXX_dmamap)(addr) + void *addr; +{ + + return (vtophys(addr) | 0x40000000); +} diff --git a/sys/arch/alpha/pci/sio.c b/sys/arch/alpha/pci/sio.c index a8b6b8a0a24..a43bcef227d 100644 --- a/sys/arch/alpha/pci/sio.c +++ b/sys/arch/alpha/pci/sio.c @@ -1,7 +1,7 @@ -/* $NetBSD: sio.c,v 1.3 1995/11/23 02:38:16 cgd Exp $ */ +/* $NetBSD: sio.c,v 1.8 1996/04/13 00:23:34 cgd Exp $ */ /* - * Copyright (c) 1995 Carnegie-Mellon University. + * Copyright (c) 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -32,6 +32,9 @@ #include <sys/kernel.h> #include <sys/device.h> +#include <machine/intr.h> +#include <machine/bus.h> + #include <dev/isa/isavar.h> #include <dev/eisa/eisavar.h> @@ -44,17 +47,37 @@ int siomatch __P((struct device *, void *, void *)); void sioattach __P((struct device *, struct device *, void *)); -struct cfdriver siocd = { - NULL, "sio", siomatch, sioattach, DV_DULL, sizeof(struct device) +struct cfattach sio_ca = { + sizeof(struct device), siomatch, sioattach, +}; + +struct cfdriver sio_cd = { + NULL, "sio", DV_DULL, }; int pcebmatch __P((struct device *, void *, void *)); -struct cfdriver pcebcd = { - NULL, "pceb", pcebmatch, sioattach, DV_DULL, sizeof(struct device) +struct cfattach pceb_ca = { + sizeof(struct device), pcebmatch, sioattach, +}; + +struct cfdriver pceb_cd = { + NULL, "pceb", DV_DULL, }; -static int sioprint __P((void *, char *pnp)); +union sio_attach_args { + const char *sa_name; /* XXX should be common */ + struct isabus_attach_args sa_iba; + struct eisabus_attach_args sa_eba; +}; + +int sioprint __P((void *, char *pnp)); +void sio_isa_attach_hook __P((struct device *, struct device *, + struct isabus_attach_args *)); +void sio_eisa_attach_hook __P((struct device *, struct device *, + struct eisabus_attach_args *)); +int sio_eisa_maxslots __P((void *)); +int sio_eisa_intr_map __P((void *, u_int, eisa_intr_handle_t *)); int siomatch(parent, match, aux) @@ -62,10 +85,10 @@ siomatch(parent, match, aux) void *match, *aux; { struct cfdata *cf = match; - struct pcidev_attach_args *pda = aux; + struct pci_attach_args *pa = aux; - if (PCI_VENDOR(pda->pda_id) != PCI_VENDOR_INTEL || - PCI_PRODUCT(pda->pda_id) != PCI_PRODUCT_INTEL_SIO) + if (PCI_VENDOR(pa->pa_id) != PCI_VENDOR_INTEL || + PCI_PRODUCT(pa->pa_id) != PCI_PRODUCT_INTEL_SIO) return (0); return (1); @@ -77,10 +100,10 @@ pcebmatch(parent, match, aux) void *match, *aux; { struct cfdata *cf = match; - struct pcidev_attach_args *pda = aux; + struct pci_attach_args *pa = aux; - if (PCI_VENDOR(pda->pda_id) != PCI_VENDOR_INTEL || - PCI_PRODUCT(pda->pda_id) != PCI_PRODUCT_INTEL_PCEB) + if (PCI_VENDOR(pa->pa_id) != PCI_VENDOR_INTEL || + PCI_PRODUCT(pa->pa_id) != PCI_PRODUCT_INTEL_PCEB) return (0); return (1); @@ -91,23 +114,24 @@ sioattach(parent, self, aux) struct device *parent, *self; void *aux; { - struct pcidev_attach_args *pda = aux; - struct isa_attach_args ia; - struct eisa_attach_args ea; + struct pci_attach_args *pa = aux; + struct alpha_isa_chipset ic; + struct alpha_eisa_chipset ec; + union sio_attach_args sa; int sio, haseisa; char devinfo[256]; - sio = (PCI_PRODUCT(pda->pda_id) == PCI_PRODUCT_INTEL_SIO); - haseisa = (PCI_PRODUCT(pda->pda_id) == PCI_PRODUCT_INTEL_PCEB); + sio = (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_SIO); + haseisa = (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_PCEB); - pci_devinfo(pda->pda_id, pda->pda_class, 0, devinfo); + pci_devinfo(pa->pa_id, pa->pa_class, 0, devinfo); printf(": %s (rev. 0x%02x)\n", devinfo, - PCI_REVISION(pda->pda_class)); + PCI_REVISION(pa->pa_class)); if (sio) { pci_revision_t rev; - rev = PCI_REVISION(pda->pda_class); + rev = PCI_REVISION(pa->pa_class); if (rev < 3) printf("%s: WARNING: SIO I SUPPORT UNTESTED\n", @@ -118,44 +142,89 @@ sioattach(parent, self, aux) evcnt_attach(self, "intr", &sio_intr_evcnt); #endif - ia.ia_bus = BUS_ISA; - ia.ia_dmafns = pda->pda_dmafns; - ia.ia_dmaarg = pda->pda_dmaarg; - ia.ia_intrfns = &sio_isa_intr_fns; - ia.ia_intrarg = NULL; /* XXX needs nothing */ - ia.ia_memfns = pda->pda_memfns; - ia.ia_memarg = pda->pda_memarg; - ia.ia_piofns = pda->pda_piofns; - ia.ia_pioarg = pda->pda_pioarg; - config_found(self, &ia, sioprint); - if (haseisa) { - ea.ea_bus = BUS_EISA; - ea.ea_dmafns = pda->pda_dmafns; - ea.ea_dmaarg = pda->pda_dmaarg; - ea.ea_intrfns = &sio_isa_intr_fns; - ea.ea_intrarg = NULL; /* XXX needs nothing */ - ea.ea_memfns = pda->pda_memfns; - ea.ea_memarg = pda->pda_memarg; - ea.ea_piofns = pda->pda_piofns; - ea.ea_pioarg = pda->pda_pioarg; - config_found(self, &ea, sioprint); + ec.ec_v = NULL; + ec.ec_attach_hook = sio_eisa_attach_hook; + ec.ec_maxslots = sio_eisa_maxslots; + ec.ec_intr_map = sio_eisa_intr_map; + ec.ec_intr_string = sio_intr_string; + ec.ec_intr_establish = sio_intr_establish; + ec.ec_intr_disestablish = sio_intr_disestablish; + + sa.sa_eba.eba_busname = "eisa"; + sa.sa_eba.eba_bc = pa->pa_bc; + sa.sa_eba.eba_ec = &ec; + config_found(self, &sa.sa_eba, sioprint); } + + ic.ic_v = NULL; + ic.ic_attach_hook = sio_isa_attach_hook; + ic.ic_intr_establish = sio_intr_establish; + ic.ic_intr_disestablish = sio_intr_disestablish; + + sa.sa_iba.iba_busname = "isa"; + sa.sa_iba.iba_bc = pa->pa_bc; + sa.sa_iba.iba_ic = ⁣ + config_found(self, &sa.sa_iba, sioprint); } -static int +int sioprint(aux, pnp) void *aux; char *pnp; { - register struct isa_attach_args *ia = aux; - - /* - * XXX Assumes that the first fields of 'struct isa_attach_args' - * XXX and 'struct eisa_attach_args' are the same. - */ + register union sio_attach_args *sa = aux; if (pnp) - printf("%s at %s", isa_bustype_name(ia->ia_bus), pnp); + printf("%s at %s", sa->sa_name, pnp); return (UNCONF); } + +void +sio_isa_attach_hook(parent, self, iba) + struct device *parent, *self; + struct isabus_attach_args *iba; +{ + + /* Nothing to do. */ +} + +void +sio_eisa_attach_hook(parent, self, eba) + struct device *parent, *self; + struct eisabus_attach_args *eba; +{ + + /* Nothing to do. */ +} + +int +sio_eisa_maxslots(v) + void *v; +{ + + return 16; /* as good a number as any. only 8, maybe? */ +} + +int +sio_eisa_intr_map(v, irq, ihp) + void *v; + u_int irq; + eisa_intr_handle_t *ihp; +{ + +#define ICU_LEN 16 /* number of ISA IRQs (XXX) */ + + if (irq >= ICU_LEN) { + printf("sio_eisa_intr_map: bad IRQ %d\n", irq); + *ihp = -1; + return 1; + } + if (irq == 2) { + printf("sio_eisa_intr_map: changed IRQ 2 to IRQ 9\n"); + irq = 9; + } + + *ihp = irq; + return 0; +} diff --git a/sys/arch/alpha/pci/sio_pic.c b/sys/arch/alpha/pci/sio_pic.c index b7d7af43858..6ad39660d5f 100644 --- a/sys/arch/alpha/pci/sio_pic.c +++ b/sys/arch/alpha/pci/sio_pic.c @@ -1,7 +1,7 @@ -/* $NetBSD: sio_pic.c,v 1.3 1995/12/24 02:29:49 mycroft Exp $ */ +/* $NetBSD: sio_pic.c,v 1.7.4.3 1996/06/05 22:50:23 cgd Exp $ */ /* - * Copyright (c) 1995 Carnegie-Mellon University. + * Copyright (c) 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -33,6 +33,9 @@ #include <sys/malloc.h> #include <sys/syslog.h> +#include <machine/intr.h> +#include <machine/bus.h> + #include <dev/isa/isareg.h> #include <dev/isa/isavar.h> #include <alpha/pci/siovar.h> @@ -56,21 +59,10 @@ /* * Private functions and variables. */ -static void *sio_intr_establish __P((void *, isa_irq_t, - int, int, int (*)(void *), void *)); -static void sio_intr_disestablish __P((void *, void *)); -static void sio_strayintr __P((isa_irq_t)); - -static __const struct isa_pio_fns *sio_ipf; /* XXX */ -static void *sio_ipfa; /* XXX */ - -void sio_intr_setup __P((__const struct isa_pio_fns *, void *)); -void sio_iointr __P((void *framep, int vec)); +static void sio_strayintr __P((int)); -struct isa_intr_fns sio_isa_intr_fns = { - sio_intr_establish, - sio_intr_disestablish, -}; +bus_chipset_tag_t sio_bc; +bus_io_handle_t sio_ioh_icu1, sio_ioh_icu2, sio_ioh_elcr; /* * Interrupt handler chains. sio_intr_establish() inserts a handler into @@ -131,7 +123,7 @@ sio_setirqstat(irq, enabled, type) int icu, bit; #if 0 - printf("sio_setirqstat: irq %d, %s, %s\n", irq, + printf("sio_setirqstat: irq %d: %s, %s\n", irq, enabled ? "enabled" : "disabled", isa_intr_typename(type)); #endif @@ -140,10 +132,10 @@ sio_setirqstat(irq, enabled, type) icu = irq / 8; bit = irq % 8; - ocw1[0] = INB(sio_ipf, sio_ipfa, IO_ICU1 + 1); - ocw1[1] = INB(sio_ipf, sio_ipfa, IO_ICU2 + 1); - elcr[0] = INB(sio_ipf, sio_ipfa, 0x4d0); /* XXX */ - elcr[1] = INB(sio_ipf, sio_ipfa, 0x4d1); /* XXX */ + ocw1[0] = bus_io_read_1(sio_bc, sio_ioh_icu1, 1); + ocw1[1] = bus_io_read_1(sio_bc, sio_ioh_icu2, 1); + elcr[0] = bus_io_read_1(sio_bc, sio_ioh_elcr, 0); /* XXX */ + elcr[1] = bus_io_read_1(sio_bc, sio_ioh_elcr, 1); /* XXX */ /* * interrupt enable: set bit to mask (disable) interrupt. @@ -178,39 +170,42 @@ sio_setirqstat(irq, enabled, type) (ocw1[1] & ~initial_ocw1[1]) != 0 || (elcr[0] & initial_elcr[0]) != initial_elcr[0] || (elcr[1] & initial_elcr[1]) != initial_elcr[1]) { - printf("sio_sis: initial: ocw = (%2x,%2x), elcr = (%2x,%2X)\n", + printf("sio_sis: initial: ocw = (%2x,%2x), elcr = (%2x,%2x)\n", initial_ocw1[0], initial_ocw1[1], initial_elcr[0], initial_elcr[1]); - printf(" current: ocw = (%2x,%2x), elcr = (%2x,%2X)\n", + printf(" current: ocw = (%2x,%2x), elcr = (%2x,%2x)\n", ocw1[0], ocw1[1], elcr[0], elcr[1]); panic("sio_setirqstat: hosed"); } #endif - OUTB(sio_ipf, sio_ipfa, IO_ICU1 + 1, ocw1[0]); - OUTB(sio_ipf, sio_ipfa, IO_ICU2 + 1, ocw1[1]); - OUTB(sio_ipf, sio_ipfa, 0x4d0, elcr[0]); /* XXX */ - OUTB(sio_ipf, sio_ipfa, 0x4d1, elcr[1]); /* XXX */ + bus_io_write_1(sio_bc, sio_ioh_icu1, 1, ocw1[0]); + bus_io_write_1(sio_bc, sio_ioh_icu2, 1, ocw1[1]); + bus_io_write_1(sio_bc, sio_ioh_elcr, 0, elcr[0]); /* XXX */ + bus_io_write_1(sio_bc, sio_ioh_elcr, 1, elcr[1]); /* XXX */ } void -sio_intr_setup(ipf, ipfa) - __const struct isa_pio_fns *ipf; - void *ipfa; +sio_intr_setup(bc) + bus_chipset_tag_t bc; { int i; - sio_ipf = ipf; - sio_ipfa = ipfa; + sio_bc = bc; + + if (bus_io_map(sio_bc, IO_ICU1, IO_ICUSIZE, &sio_ioh_icu1) || + bus_io_map(sio_bc, IO_ICU2, IO_ICUSIZE, &sio_ioh_icu2) || + bus_io_map(sio_bc, 0x4d0, 2, &sio_ioh_elcr)) + panic("sio_intr_setup: can't map I/O ports"); #ifdef BROKEN_PROM_CONSOLE /* * Remember the initial values, because the prom is stupid. */ - initial_ocw1[0] = INB(sio_ipf, sio_ipfa, IO_ICU1 + 1); - initial_ocw1[1] = INB(sio_ipf, sio_ipfa, IO_ICU2 + 1); - initial_elcr[0] = INB(sio_ipf, sio_ipfa, 0x4d0); /* XXX */ - initial_elcr[1] = INB(sio_ipf, sio_ipfa, 0x4d1); /* XXX */ + initial_ocw1[0] = bus_io_read_1(sio_bc, sio_ioh_icu1, 1); + initial_ocw1[1] = bus_io_read_1(sio_bc, sio_ioh_icu2, 1); + initial_elcr[0] = bus_io_read_1(sio_bc, sio_ioh_elcr, 0); /* XXX */ + initial_elcr[1] = bus_io_read_1(sio_bc, sio_ioh_elcr, 1); /* XXX */ #if 0 printf("initial_ocw1[0] = 0x%x\n", initial_ocw1[0]); printf("initial_ocw1[1] = 0x%x\n", initial_ocw1[1]); @@ -262,14 +257,27 @@ sio_intr_setup(ipf, ipfa) } } +const char * +sio_intr_string(v, irq) + void *v; + int irq; +{ + static char irqstr[12]; /* 8 + 2 + NULL + sanity */ + + if (irq == 0 || irq >= ICU_LEN || irq == 2) + panic("sio_intr_string: bogus IRQ 0x%x\n", irq); + + sprintf(irqstr, "isa irq %d", irq); + return (irqstr); +} + void * -sio_intr_establish(siifa, irq, type, level, ih_fun, ih_arg) - void *siifa; - isa_irq_t irq; +sio_intr_establish(v, irq, type, level, ih_fun, ih_arg) + void *v, *ih_arg; + int irq; int type; int level; int (*ih_fun)(void *); - void *ih_arg; { struct intrhand **p, *c, *ih; extern int cold; @@ -288,10 +296,18 @@ sio_intr_establish(siifa, irq, type, level, ih_fun, ih_arg) if (type == sio_intrsharetype[irq]) break; case IST_PULSE: - if (type != IST_NONE) - panic("intr_establish: can't share %s with %s", - isa_intrsharetype_name(sio_intrsharetype[irq]), - isa_intrsharetype_name(type)); + if (type != IST_NONE) { + if (sio_intrhand[irq] == NULL) { + printf("sio_intr_establish: irq %d: warning: using %s on %s\n", + irq, isa_intr_typename(type), + isa_intr_typename(sio_intrsharetype[irq])); + type = sio_intrsharetype[irq]; + } else { + panic("sio_intr_establish: irq %d: can't share %s with %s", + irq, isa_intr_typename(type), + isa_intr_typename(sio_intrsharetype[irq])); + } + } break; } @@ -320,12 +336,12 @@ sio_intr_establish(siifa, irq, type, level, ih_fun, ih_arg) } void -sio_intr_disestablish(siifa, handler) - void *siifa; - void *handler; +sio_intr_disestablish(v, cookie) + void *v; + void *cookie; { - printf("sio_intr_disestablish(%lx)\n", handler); + printf("sio_intr_disestablish(%lx)\n", cookie); /* XXX */ /* XXX NEVER ALLOW AN INITIALLY-ENABLED INTERRUPT TO BE DISABLED */ @@ -337,7 +353,7 @@ sio_intr_disestablish(siifa, handler) */ void sio_strayintr(irq) - isa_irq_t irq; + int irq; { if (++sio_strayintrcnt[irq] <= STRAY_MAX) @@ -401,8 +417,8 @@ sio_iointr(framep, vec) * by the interrupt handler. */ if (irq > 7) - OUTB(sio_ipf, sio_ipfa, - IO_ICU2 + 0, 0x20 | (irq & 0x07)); /* XXX */ - OUTB(sio_ipf, sio_ipfa, - IO_ICU1 + 0, 0x20 | (irq > 7 ? 2 : irq)); /* XXX */ + bus_io_write_1(sio_bc, + sio_ioh_icu2, 0, 0x20 | (irq & 0x07)); /* XXX */ + bus_io_write_1(sio_bc, + sio_ioh_icu1, 0, 0x20 | (irq > 7 ? 2 : irq)); /* XXX */ } diff --git a/sys/arch/alpha/pci/sioreg.h b/sys/arch/alpha/pci/sioreg.h new file mode 100644 index 00000000000..3be1f87288f --- /dev/null +++ b/sys/arch/alpha/pci/sioreg.h @@ -0,0 +1,129 @@ +/* $NetBSD: sioreg.h,v 1.1 1996/04/23 14:10:53 cgd Exp $ */ + +/* + * Copyright (c) 1996 BBN Corporation. + * BBN Systems and Technologies Division + * 10 Moulton Street + * Cambridge, Ma. 02138 + * 617-873-3000 + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice and this permission appear in all copies and in + * supporting documentation, and that the name of BBN Corporation not be used + * in advertising or publicity pertaining to distribution of the software + * without specific, written prior permission. BBN makes no representations + * about the suitability of this software for any purposes. It is provided + * "AS IS" without express or implied warranties. + */ + +/* + * Intel 82378 System I/O (SIO) Chip + * + * Taken from the Intel "Peripheral Components" manual, 1995 Edition. + */ + + +/* + * Device-specific PCI Configuration Registers + */ + +/* + * PCI Control Registers + */ +#define SIO_PCIREG_PCICON 0x40 /* PCI Control */ +#define SIO_PCIREG_PAC 0x41 /* PCI Arbiter Control */ +#define SIO_PCIREG_PAPC 0x42 /* PCI Arbiter Priority Control */ +#define SIO_PCIREG_ARBPRIX 0x43 /* PCI Arbiter Priority Control Ext. */ + +/* + * Memory Chip Select Registers + */ +#define SIO_PCIREG_MEMCSCON 0x44 /* MEMCS# Control */ +#define SIO_PCIREG_MEMCSBOH 0x45 /* MEMCS# Bottom of Hole */ +#define SIO_PCIREG_MEMCSTOH 0x46 /* MEMCS# Top of Hole */ +#define SIO_PCIREG_MEMCSTOM 0x47 /* MEMCS# Top of Memory */ + +#define SIO_PCIREG_MAR1 0x54 /* MEMCS# Attribute 1 */ +#define SIO_PCIREG_MAR2 0x55 /* MEMCS# Attribute 2 */ +#define SIO_PCIREG_MAR3 0x56 /* MEMCS# Attribute 3 */ +#define SIO_PCIREG_DMASGRB 0x57 /* DMA Scatter/Gather Rel. Base Addr. */ + +/* + * ISA Address Decoder Registers + */ +#define SIO_PCIREG_IADCON 0x48 /* ISA Address Decoder Control */ +#define SIO_PCIREG_IADRBE 0x49 /* ISA Addr. Decoder ROM Block Enable */ +#define SIO_PCIREG_IADBOH 0x4A /* ISA Addr. Decoder Bottom of Hole */ +#define SIO_PCIREG_IADTOH 0x4B /* ISA Addr. Decoder Top of Hole */ + +/* + * Clocks and Timers + */ +#define SIO_PCIREG_ICRT 0x4C /* ISA Controller Recovery Timer */ +#define SIO_PCIREG_ICD 0x4D /* ISA Clock Divisor */ + +#define SIO_PCIREG_ 0x80 /* BIOS Timer Base Address */ + +#define SIO_PCIREG_CTLTMRL 0xAC /* Clock Throttle STPCLK# Low Timer */ +#define SIO_PCIREG_CTLTMRH 0xAE /* Clock Throttle STPCLK# High Timer */ + +/* + * Miscellaneous + */ +#define SIO_PCIREG_UBCSA 0x4E /* Utility Bus Chip Select A */ +#define SIO_PCIREG_UBCSB 0x4F /* Utility Bus Chip Select B */ + +/* + * PIRQ# Route Control + */ +#define SIO_PCIREG_PIRQ0 0x60 /* PIRQ0 Route Control */ +#define SIO_PCIREG_PIRQ1 0x61 /* PIRQ1 Route Control */ +#define SIO_PCIREG_PIRQ2 0x62 /* PIRQ2 Route Control */ +#define SIO_PCIREG_PIRQ3 0x63 /* PIRQ3 Route Control */ +#define SIO_PCIREG_PIRQ_RTCTRL SIO_PCIREG_PIRQ0 + +/* + * System Management Interrupt (SMI) + */ +#define SIO_PCIREG_SMICNTL 0xA0 /* SMI Control */ +#define SIO_PCIREG_SMIEN 0xA2 /* SMI Enable */ +#define SIO_PCIREG_SEE 0xA4 /* System Event Enable */ +#define SIO_PCIREG_FTMR 0xA8 /* Fast Off Timer */ +#define SIO_PCIREG_SMIREQ 0xAA /* SMI Request */ + + +/* + * Non-Configuration Registers + */ + +/* + * Control + */ +#define SIO_REG_RSTUB 0x060 /* Reset UBus */ +#define SIO_REG_NMICTRL 0x061 /* NMI Status and Control */ +#define SIO_REG_CMOSRAM 0x070 /* CMOS RAM Address and NMI Mask */ +#define SIO_REG_NMIMASK 0x070 /* CMOS RAM Address and NMI Mask */ +#define SIO_REG_PORT92 0x092 /* Port 92 */ +#define SIO_REG_CPERR 0x0F0 /* Coprocessor Error */ + +/* + * Interrupt + */ +#define SIO_REG_ICU1 0x020 /* Intr. Controller #1 Control */ +#define SIO_REG_ICU1MASK 0x021 /* Intr. Controller #1 Mask */ +#define SIO_REG_ICU2 0x0A0 /* Intr. Controller #2 Control */ +#define SIO_REG_ICU2MASK 0x0A1 /* Intr. Controller #2 Mask */ +#define SIO_REG_ICU1ELC 0x4D0 /* #1's Edge/Level Control */ +#define SIO_REG_ICU2ELC 0x4D1 /* #2's Edge/Level Control */ +#define SIO_ICUSIZE 16 /* I/O Port Sizes */ + +/* + * Timer + */ +/* XXX need Timer definitions */ + +/* + * DMA + */ +/* XXX need DMA definitions */ diff --git a/sys/arch/alpha/pci/siovar.h b/sys/arch/alpha/pci/siovar.h index 746b9a89abb..84bcfabcedd 100644 --- a/sys/arch/alpha/pci/siovar.h +++ b/sys/arch/alpha/pci/siovar.h @@ -1,7 +1,7 @@ -/* $NetBSD: siovar.h,v 1.1 1995/11/23 02:38:22 cgd Exp $ */ +/* $NetBSD: siovar.h,v 1.3 1996/04/12 06:09:06 cgd Exp $ */ /* - * Copyright (c) 1995 Carnegie-Mellon University. + * Copyright (c) 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -27,10 +27,14 @@ * rights to redistribute these changes. */ -void sio_intr_setup __P((__const struct isa_pio_fns *, void *)); +void sio_intr_setup __P((bus_chipset_tag_t)); void sio_iointr __P((void *framep, int vec)); +const char *sio_intr_string __P((void *, int)); +void *sio_intr_establish __P((void *, int, int, int, int (*)(void *), + void *)); +void sio_intr_disestablish __P((void *, void *)); + #ifdef EVCNT_COUNTERS extern struct evcnt sio_intr_evcnt; #endif -extern __const struct isa_intr_fns sio_isa_intr_fns; diff --git a/sys/arch/alpha/pci/tga.c b/sys/arch/alpha/pci/tga.c index 739c0d812c1..efec7a02a81 100644 --- a/sys/arch/alpha/pci/tga.c +++ b/sys/arch/alpha/pci/tga.c @@ -1,7 +1,7 @@ -/* $NetBSD: tga.c,v 1.3 1995/11/23 02:38:25 cgd Exp $ */ +/* $NetBSD: tga.c,v 1.6 1996/04/12 06:09:08 cgd Exp $ */ /* - * Copyright (c) 1995 Carnegie-Mellon University. + * Copyright (c) 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -32,48 +32,49 @@ #include <sys/kernel.h> #include <sys/device.h> #include <sys/malloc.h> +#include <sys/buf.h> #include <sys/conf.h> +#include <sys/ioctl.h> -#include <dev/rcons/raster.h> -#include <dev/pseudo/rcons.h> -#include <dev/pseudo/ansicons.h> +#include <machine/bus.h> +#include <machine/intr.h> #include <dev/pci/pcireg.h> #include <dev/pci/pcivar.h> #include <dev/pci/pcidevs.h> -#include <alpha/pci/tgareg.h> +#include <machine/tgareg.h> #include <alpha/pci/tgavar.h> #include <alpha/pci/bt485reg.h> -#include <alpha/pci/wsconsvar.h> + +#include <dev/rcons/raster.h> +#include <alpha/wscons/wscons_raster.h> +#include <alpha/wscons/wsconsvar.h> +#include <machine/fbio.h> #include <machine/autoconf.h> #include <machine/pte.h> int tgamatch __P((struct device *, void *, void *)); void tgaattach __P((struct device *, struct device *, void *)); +int tgaprint __P((void *, char *)); -struct cfdriver tgacd = { - NULL, "tga", tgamatch, tgaattach, DV_DULL, sizeof(struct tga_softc) +struct cfattach tga_ca = { + sizeof(struct tga_softc), tgamatch, tgaattach, }; -int tga_identify __P((tga_reg_t *)); -__const struct tga_conf *tga_getconf __P((int)); -void tga_getdevconfig __P((__const struct pci_conf_fns *, void *, - __const struct pci_mem_fns *, void *, - pci_conftag_t tag, struct tga_devconfig *dc)); +struct cfdriver tga_cd = { + NULL, "tga", DV_DULL, +}; -void tga_bell __P((void *)); /* XXX */ +int tga_identify __P((tga_reg_t *)); +const struct tga_conf *tga_getconf __P((int)); +void tga_getdevconfig __P((bus_chipset_tag_t bc, pci_chipset_tag_t pc, + pcitag_t tag, struct tga_devconfig *dc)); struct tga_devconfig tga_console_dc; -#if 0 -dev_decl(tga, mmap); -dev_decl(tga, ioctl); -#endif - -struct ansicons_functions tga_acf = { - tga_bell, - rcons_cursor, /* could use hardware cursor; who cares? */ +struct wscons_emulfuncs tga_emulfuncs = { + rcons_cursor, /* could use hardware cursor; punt */ rcons_putstr, rcons_copycols, rcons_erasecols, @@ -81,110 +82,11 @@ struct ansicons_functions tga_acf = { rcons_eraserows, }; -#define TGAUNIT(dev) minor(dev) +int tgaioctl __P((struct device *, u_long, caddr_t, int, struct proc *)); +int tgammap __P((struct device *, off_t, int)); -void tga_builtin_set_cpos __P((struct tga_devconfig *, int, int)); -void tga_builtin_get_cpos __P((struct tga_devconfig *, int *, int *)); - -__const struct tga_ramdac_conf tga_ramdac_bt463 = { - "Bt463", - tga_builtin_set_cpos, - tga_builtin_get_cpos, - /* XXX */ -}; - -void tga_bt485_wr_reg __P((volatile tga_reg_t *, u_int, u_int8_t)); -u_int8_t tga_bt485_rd_reg __P((volatile tga_reg_t *, u_int)); - -void tga_bt485_set_cpos __P((struct tga_devconfig *, int, int)); -void tga_bt485_get_cpos __P((struct tga_devconfig *, int *, int *)); - -__const struct tga_ramdac_conf tga_ramdac_bt485 = { - "Bt485", - tga_bt485_set_cpos, - tga_bt485_get_cpos, - /* XXX */ -}; - -#undef KB -#define KB * 1024 -#undef MB -#define MB * 1024 * 1024 - -__const struct tga_conf tga_configs[TGA_TYPE_UNKNOWN] = { - /* TGA_TYPE_T8_01 */ - { - "T8-01", - &tga_ramdac_bt485, - 8, - 4 MB, - 2 KB, - 1, { 2 MB, 0 }, { 1 MB, 0 }, - 0, { 0, 0 }, { 0, 0 }, - }, - /* TGA_TYPE_T8_02 */ - { - "T8-02", - &tga_ramdac_bt485, - 8, - 4 MB, - 4 KB, - 1, { 2 MB, 0 }, { 2 MB, 0 }, - 0, { 0, 0 }, { 0, 0 }, - }, - /* TGA_TYPE_T8_22 */ - { - "T8-22", - &tga_ramdac_bt485, - 8, - 8 MB, - 4 KB, - 1, { 4 MB, 0 }, { 2 MB, 0 }, - 1, { 6 MB, 0 }, { 2 MB, 0 }, - }, - /* TGA_TYPE_T8_44 */ - { - "T8-44", - &tga_ramdac_bt485, - 8, - 16 MB, - 4 KB, - 2, { 8 MB, 12 MB }, { 2 MB, 2 MB }, - 2, { 10 MB, 14 MB }, { 2 MB, 2 MB }, - }, - /* TGA_TYPE_T32_04 */ - { - "T32-04", - &tga_ramdac_bt463, - 32, - 16 MB, - 8 KB, - 1, { 8 MB, 0 }, { 4 MB, 0 }, - 0, { 0, 0 }, { 0, 0 }, - }, - /* TGA_TYPE_T32_08 */ - { - "T32-08", - &tga_ramdac_bt463, - 32, - 16 MB, - 16 KB, - 1, { 8 MB, 0 }, { 8 MB, 0 }, - 0, { 0, 0 }, { 0, 0 }, - }, - /* TGA_TYPE_T32_88 */ - { - "T32-88", - &tga_ramdac_bt463, - 32, - 32 MB, - 16 KB, - 1, { 16 MB, 0 }, { 8 MB, 0 }, - 1, { 24 MB, 0 }, { 8 MB, 0 }, - }, -}; -#undef KB -#undef MB +void tga_blank __P((struct tga_devconfig *)); +void tga_unblank __P((struct tga_devconfig *)); int tgamatch(parent, match, aux) @@ -192,113 +94,43 @@ tgamatch(parent, match, aux) void *match, *aux; { struct cfdata *cf = match; - struct pcidev_attach_args *pda = aux; + struct pci_attach_args *pa = aux; - if (PCI_VENDOR(pda->pda_id) != PCI_VENDOR_DEC || - PCI_PRODUCT(pda->pda_id) != PCI_PRODUCT_DEC_21030) + if (PCI_VENDOR(pa->pa_id) != PCI_VENDOR_DEC || + PCI_PRODUCT(pa->pa_id) != PCI_PRODUCT_DEC_21030) return (0); - return (1); -} - -int -tga_identify(regs) - tga_reg_t *regs; -{ - int type; - int deep, addrmask, wide; - - deep = (regs[TGA_REG_GDER] & 0x1) != 0; /* XXX */ - addrmask = ((regs[TGA_REG_GDER] >> 2) & 0x7); /* XXX */ - wide = (regs[TGA_REG_GDER] & 0x200) == 0; /* XXX */ - - type = TGA_TYPE_UNKNOWN; - - if (!deep) { - /* 8bpp frame buffer */ - - if (addrmask == 0x0) { - /* 4MB core map; T8-01 or T8-02 */ - - if (!wide) - type = TGA_TYPE_T8_01; - else - type = TGA_TYPE_T8_02; - } else if (addrmask == 0x1) { - /* 8MB core map; T8-22 */ - - if (wide) /* sanity */ - type = TGA_TYPE_T8_22; - } else if (addrmask == 0x3) { - /* 16MB core map; T8-44 */ - - if (wide) /* sanity */ - type = TGA_TYPE_T8_44; - } - } else { - /* 32bpp frame buffer */ - - if (addrmask == 0x3) { - /* 16MB core map; T32-04 or T32-08 */ - - if (!wide) - type = TGA_TYPE_T32_04; - else - type = TGA_TYPE_T32_08; - } else if (addrmask == 0x7) { - /* 32MB core map; T32-88 */ - - if (wide) /* sanity */ - type = TGA_TYPE_T32_88; - } - } - - return (type); -} - -__const struct tga_conf * -tga_getconf(type) - int type; -{ - - if (type >= 0 && type < TGA_TYPE_UNKNOWN) - return &tga_configs[type]; - - return (NULL); + return (10); } void -tga_getdevconfig(pcf, pcfa, pmf, pmfa, tag, dc) - __const struct pci_conf_fns *pcf; - __const struct pci_mem_fns *pmf; - void *pcfa, *pmfa; - pci_conftag_t tag; +tga_getdevconfig(bc, pc, tag, dc) + bus_chipset_tag_t bc; + pci_chipset_tag_t pc; + pcitag_t tag; struct tga_devconfig *dc; { - __const struct tga_conf *tgac; - __const struct tga_ramdac_conf *tgar; + const struct tga_conf *tgac; + const struct tga_ramdac_conf *tgar; struct raster *rap; struct rcons *rcp; - pci_msize_t pcisize; + bus_mem_size_t pcisize; int i, cacheable; - dc->dc_pcf = pcf; - dc->dc_pcfa = pcfa; - dc->dc_pmf = pmf; - dc->dc_pmfa = pmfa; + dc->dc_bc = bc; + dc->dc_pc = pc; dc->dc_pcitag = tag; /* XXX MAGIC NUMBER */ - PCI_FIND_MEM(pcf, pcfa, tag, 0x10, &dc->dc_pcipaddr, &pcisize, + pci_mem_find(pc, tag, 0x10, &dc->dc_pcipaddr, &pcisize, &cacheable); if (!cacheable) /* sanity */ panic("tga_getdevconfig: memory not cacheable?"); - dc->dc_vaddr = PCI_MEM_MAP(pmf, pmfa, dc->dc_pcipaddr, pcisize, 1); - if (dc->dc_vaddr == 0) + /* XXX XXX XXX */ + if (bus_mem_map(bc, dc->dc_pcipaddr, pcisize, 1, &dc->dc_vaddr)) return; - dc->dc_paddr = k0segtophys(dc->dc_vaddr); /* XXX */ dc->dc_regs = (tga_reg_t *)(dc->dc_vaddr + TGA_MEM_CREGS); @@ -332,15 +164,26 @@ tga_getdevconfig(pcf, pcfa, pmf, pmfa, tag, dc) dc->dc_rowbytes = dc->dc_wid * (dc->dc_tgaconf->tgac_phys_depth / 8); if ((dc->dc_regs[TGA_REG_VHCR] & 0x00000001) != 0 && /* XXX */ - (dc->dc_regs[TGA_REG_VHCR] & 0x80000000) != 0) /* XXX */ + (dc->dc_regs[TGA_REG_VHCR] & 0x80000000) != 0) { /* XXX */ dc->dc_wid -= 4; + /* + * XXX XXX turning off 'odd' shouldn't be necesssary, + * XXX XXX but i can't make X work with the weird size. + */ + dc->dc_regs[TGA_REG_VHCR] &= ~0x80000001; + dc->dc_rowbytes = + dc->dc_wid * (dc->dc_tgaconf->tgac_phys_depth / 8); + } dc->dc_ht = (dc->dc_regs[TGA_REG_VVCR] & 0x7ff); /* XXX */ /* XXX this seems to be what DEC does */ + dc->dc_regs[TGA_REG_CCBR] = 0; dc->dc_regs[TGA_REG_VVBR] = 1; dc->dc_videobase = dc->dc_vaddr + tgac->tgac_dbuf[0] + 1 * tgac->tgac_vvbr_units; + dc->dc_blanked = 1; + tga_unblank(dc); /* * Set all bits in the pixel mask, to enable writes to all pixels. @@ -349,15 +192,6 @@ tga_getdevconfig(pcf, pcfa, pmf, pmfa, tag, dc) */ dc->dc_regs[TGA_REG_GPXR_P] = 0xffffffff; - /* disable the cursor */ - (*tgar->tgar_set_cpos)(dc, TGA_CURSOR_OFF, 0); - - /* init black and white color map entries to 'sane' values. */ -#if 0 - (*tgar->tga_set_cmap)(dc, 0, 0, 0, 0); - (*tgar->tga_set_cmap)(dc, 255, 0xff, 0xff, 0xff); -#endif - /* clear the screen */ for (i = 0; i < dc->dc_ht * dc->dc_rowbytes; i += sizeof(u_int32_t)) *(u_int32_t *)(dc->dc_videobase + i) = 0; @@ -384,27 +218,56 @@ tgaattach(parent, self, aux) struct device *parent, *self; void *aux; { - struct pcidev_attach_args *pda = aux; + struct pci_attach_args *pa = aux; struct tga_softc *sc = (struct tga_softc *)self; - pci_revision_t rev; + struct wscons_attach_args waa; + struct wscons_odev_spec *wo; + pci_intr_handle_t intrh; + const char *intrstr; + u_int8_t rev; int console; - console = (pda->pda_tag == tga_console_dc.dc_pcitag); + console = (pa->pa_tag == tga_console_dc.dc_pcitag); if (console) sc->sc_dc = &tga_console_dc; else { sc->sc_dc = (struct tga_devconfig *) malloc(sizeof(struct tga_devconfig), M_DEVBUF, M_WAITOK); - tga_getdevconfig(pda->pda_conffns, pda->pda_confarg, - pda->pda_memfns, pda->pda_memarg, pda->pda_tag, sc->sc_dc); + tga_getdevconfig(pa->pa_bc, pa->pa_pc, pa->pa_tag, sc->sc_dc); } if (sc->sc_dc->dc_vaddr == NULL) { printf(": couldn't map memory space; punt!\n"); return; } + /* XXX say what's going on. */ + if (sc->sc_dc->dc_tgaconf->tgac_ramdac->tgar_intr != NULL) { + if (pci_intr_map(pa->pa_pc, pa->pa_intrtag, pa->pa_intrpin, + pa->pa_intrline, &intrh)) { + printf(": couldn't map interrupt"); + return; + } + intrstr = pci_intr_string(pa->pa_pc, intrh); + sc->sc_intr = pci_intr_establish(pa->pa_pc, intrh, IPL_TTY, + sc->sc_dc->dc_tgaconf->tgac_ramdac->tgar_intr, sc->sc_dc); + if (sc->sc_intr == NULL) { + printf(": couldn't establish interrupt"); + if (intrstr != NULL) + printf("at %s", intrstr); + printf("\n"); + return; + } + } + + /* + * Initialize the RAMDAC and allocate any private storage it needs. + * Initialization includes disabling cursor, setting a sane + * colormap, etc. + */ + (*sc->sc_dc->dc_tgaconf->tgac_ramdac->tgar_init)(sc->sc_dc, 1); + printf(": DC21030 "); - rev = PCI_REVISION(pda->pda_class); + rev = PCI_REVISION(pa->pa_class); switch (rev) { case 1: case 2: case 3: printf("step %c", 'A' + rev - 1); @@ -426,216 +289,276 @@ tgaattach(parent, self, aux) sc->sc_dc->dc_tgaconf->tgac_phys_depth, sc->sc_dc->dc_tgaconf->tgac_ramdac->tgar_name); -#if 0 - /* XXX intr foo? */ -#endif + if (intrstr != NULL) + printf("%s: interrupting at %s\n", sc->sc_dev.dv_xname, + intrstr); + + waa.waa_isconsole = console; + wo = &waa.waa_odev_spec; + wo->wo_ef = &tga_emulfuncs; + wo->wo_efa = &sc->sc_dc->dc_rcons; + wo->wo_nrows = sc->sc_dc->dc_rcons.rc_maxrow; + wo->wo_ncols = sc->sc_dc->dc_rcons.rc_maxcol; + wo->wo_crow = 0; + wo->wo_ccol = 0; + wo->wo_ioctl = tgaioctl; + wo->wo_mmap = tgammap; + + config_found(self, &waa, tgaprint); +} - if (!wscattach_output(self, console, &sc->sc_dc->dc_ansicons, &tga_acf, - &sc->sc_dc->dc_rcons, sc->sc_dc->dc_rcons.rc_maxrow, - sc->sc_dc->dc_rcons.rc_maxcol, 0, 0)) { - panic("tgaattach: wscattach failed"); - /* NOTREACHED */ - } +int +tgaprint(aux, pnp) + void *aux; + char *pnp; +{ + + if (pnp) + printf("wscons at %s", pnp); + return (UNCONF); } -#if 0 int tgaioctl(dev, cmd, data, flag, p) - dev_t dev; + struct device *dev; u_long cmd; caddr_t data; int flag; struct proc *p; { - struct tga_softc *sc = tgacd.cd_devs[TGAUNIT(dev)]; + struct tga_softc *sc = (struct tga_softc *)dev; + struct tga_devconfig *dc = sc->sc_dc; + const struct tga_ramdac_conf *tgar = dc->dc_tgaconf->tgac_ramdac; + + switch (cmd) { + case FBIOGTYPE: +#define fbt ((struct fbtype *)data) + fbt->fb_type = FBTYPE_TGA; + fbt->fb_height = sc->sc_dc->dc_ht; + fbt->fb_width = sc->sc_dc->dc_wid; + fbt->fb_depth = sc->sc_dc->dc_tgaconf->tgac_phys_depth; + fbt->fb_cmsize = 256; /* XXX ??? */ + fbt->fb_size = sc->sc_dc->dc_tgaconf->tgac_cspace_size; +#undef fbt + return (0); + + case FBIOPUTCMAP: + return (*tgar->tgar_set_cmap)(dc, (struct fbcmap *)data); + + case FBIOGETCMAP: + return (*tgar->tgar_get_cmap)(dc, (struct fbcmap *)data); + + case FBIOGATTR: + return (ENOTTY); /* XXX ? */ - return (ENOTTY); + case FBIOSVIDEO: + if (*(int *)data == FBVIDEO_OFF) + tga_blank(sc->sc_dc); + else + tga_unblank(sc->sc_dc); + return (0); + + case FBIOGVIDEO: + *(int *)data = dc->dc_blanked ? FBVIDEO_OFF : FBVIDEO_ON; + return (0); + + case FBIOSCURSOR: + return (*tgar->tgar_set_cursor)(dc, (struct fbcursor *)data); + + case FBIOGCURSOR: + return (*tgar->tgar_get_cursor)(dc, (struct fbcursor *)data); + + case FBIOSCURPOS: + return (*tgar->tgar_set_curpos)(dc, (struct fbcurpos *)data); + + case FBIOGCURPOS: + return (*tgar->tgar_get_curpos)(dc, (struct fbcurpos *)data); + + case FBIOGCURMAX: + return (*tgar->tgar_get_curmax)(dc, (struct fbcurpos *)data); + } + return (-1); } int -tgammap(dev, offset, nprot) - dev_t dev; - int offset; - int nprot; +tgammap(dev, offset, prot) + struct device *dev; + off_t offset; + int prot; { - struct tga_softc *sc = tgacd.cd_devs[TGAUNIT(dev)]; + struct tga_softc *sc = (struct tga_softc *)dev; if (offset > sc->sc_dc->dc_tgaconf->tgac_cspace_size) return -1; return alpha_btop(sc->sc_dc->dc_paddr + offset); } -#endif void -tga_bell(id) - void *id; +tga_console(bc, pc, bus, device, function) + bus_chipset_tag_t bc; + pci_chipset_tag_t pc; + int bus, device, function; { + struct tga_devconfig *dcp = &tga_console_dc; + struct wscons_odev_spec wo; + + tga_getdevconfig(bc, pc, pci_make_tag(pc, bus, device, function), dcp); - /* XXX */ - printf("tga_bell: not implemented\n"); + /* sanity checks */ + if (dcp->dc_vaddr == NULL) + panic("tga_console(%d, %d): couldn't map memory space", + device, function); + if (dcp->dc_tgaconf == NULL) + panic("tga_console(%d, %d): unknown board configuration", + device, function); + + /* + * Initialize the RAMDAC but DO NOT allocate any private storage. + * Initialization includes disabling cursor, setting a sane + * colormap, etc. It will be reinitialized in tgaattach(). + */ + (*dcp->dc_tgaconf->tgac_ramdac->tgar_init)(dcp, 0); + + wo.wo_ef = &tga_emulfuncs; + wo.wo_efa = &dcp->dc_rcons; + wo.wo_nrows = dcp->dc_rcons.rc_maxrow; + wo.wo_ncols = dcp->dc_rcons.rc_maxcol; + wo.wo_crow = 0; + wo.wo_ccol = 0; + /* ioctl and mmap are unused until real attachment. */ + + wscons_attach_console(&wo); } +/* + * Functions to blank and unblank the display. + */ void -tga_builtin_set_cpos(dc, x, y) +tga_blank(dc) struct tga_devconfig *dc; - int x, y; { - if (x == TGA_CURSOR_OFF || y == TGA_CURSOR_OFF) { - - dc->dc_regs[TGA_REG_VVVR] &= ~0x04; /* XXX */ - wbflush(); - return; + if (!dc->dc_blanked) { + dc->dc_blanked = 1; + dc->dc_regs[TGA_REG_VVVR] |= 0x02; /* XXX */ } - - /* - * TGA builtin cursor is 0-based, and position is top-left corner. - */ - dc->dc_regs[TGA_REG_CXYR] = - (x & 0xfff) | ((y & 0xfff) << 12); /* XXX */ - wbflush(); } void -tga_builtin_get_cpos(dc, xp, yp) +tga_unblank(dc) struct tga_devconfig *dc; - int *xp, *yp; { - tga_reg_t regval; - if ((dc->dc_regs[TGA_REG_VVVR] & 0x04) == 0) { /* XXX */ - *xp = *yp = TGA_CURSOR_OFF; - return; + if (dc->dc_blanked) { + dc->dc_blanked = 0; + dc->dc_regs[TGA_REG_VVVR] &= ~0x02; /* XXX */ } - - regval = dc->dc_regs[TGA_REG_CXYR]; - *xp = regval & 0xfff; /* XXX */ - *yp = (regval >> 12) & 0xfff; /* XXX */ } /* - * Bt485-specific functions. + * Functions to manipulate the built-in cursor handing hardware. */ - -void -tga_bt485_wr_reg(tgaregs, btreg, val) - volatile tga_reg_t *tgaregs; - u_int btreg; - u_int8_t val; +int +tga_builtin_set_cursor(dc, fbc) + struct tga_devconfig *dc; + struct fbcursor *fbc; { + int v, count; - if (btreg > BT485_REG_MAX) - panic("tga_bt485_wr_reg: reg %d out of range\n", btreg); + v = fbc->set; +#if 0 + if (v & FB_CUR_SETCMAP) /* XXX should be supported */ + return EINVAL; + if (v & FB_CUR_SETSHAPE) { + if ((u_int)fbc->size.x != 64 || (u_int)fbc->size.y > 64) + return (EINVAL); + /* The cursor is 2 bits deep, and there is no mask */ + count = (fbc->size.y * 64 * 2) / NBBY; + if (!useracc(fbc->image, count, B_READ)) + return (EFAULT); + } + if (v & FB_CUR_SETHOT) /* not supported */ + return EINVAL; +#endif - tgaregs[TGA_REG_EPDR] = (btreg << 9) | (0 << 8 ) | val; /* XXX */ - wbflush(); + /* parameters are OK; do it */ + if (v & FB_CUR_SETCUR) { + if (fbc->enable) + dc->dc_regs[TGA_REG_VVVR] |= 0x04; /* XXX */ + else + dc->dc_regs[TGA_REG_VVVR] &= ~0x04; /* XXX */ + } +#if 0 + if (v & FB_CUR_SETPOS) { + dc->dc_regs[TGA_REG_CXYR] = + ((fbc->pos.y & 0xfff) << 12) | (fbc->pos.x & 0xfff); + } + if (v & FB_CUR_SETCMAP) { + /* XXX */ + } + if (v & FB_CUR_SETSHAPE) { + dc->dc_regs[TGA_REG_CCBR] = + (dc->dc_regs[TGA_REG_CCBR] & ~0xfc00) | (fbc->size.y << 10); + copyin(fbc->image, (char *)(dc->dc_vaddr + + (dc->dc_regs[TGA_REG_CCBR] & 0x3ff)), + count); /* can't fail. */ + } +#endif + return (0); } -u_int8_t -tga_bt485_rd_reg(tgaregs, btreg) - volatile tga_reg_t *tgaregs; - u_int btreg; +int +tga_builtin_get_cursor(dc, fbc) + struct tga_devconfig *dc; + struct fbcursor *fbc; { - tga_reg_t rdval; - - if (btreg > BT485_REG_MAX) - panic("tga_bt485_rd_reg: reg %d out of range\n", btreg); - - tgaregs[TGA_REG_EPSR] = (btreg << 1) | 0x1; /* XXX */ - wbflush(); - - rdval = tgaregs[TGA_REG_EPDR]; - return (rdval >> 16) & 0xff; /* XXX */ + int count, error; + + fbc->set = FB_CUR_SETALL & ~(FB_CUR_SETHOT | FB_CUR_SETCMAP); + fbc->enable = (dc->dc_regs[TGA_REG_VVVR] & 0x04) != 0; + fbc->pos.x = dc->dc_regs[TGA_REG_CXYR] & 0xfff; + fbc->pos.y = (dc->dc_regs[TGA_REG_CXYR] >> 12) & 0xfff; + fbc->size.x = 64; + fbc->size.y = (dc->dc_regs[TGA_REG_CCBR] >> 10) & 0x3f; + + if (fbc->image != NULL) { + count = (fbc->size.y * 64 * 2) / NBBY; + error = copyout((char *)(dc->dc_vaddr + + (dc->dc_regs[TGA_REG_CCBR] & 0x3ff)), + fbc->image, count); + if (error) + return (error); + /* No mask */ + } + /* XXX No color map */ + return (0); } -void -tga_bt485_set_cpos(dc, x, y) +int +tga_builtin_set_curpos(dc, fbp) struct tga_devconfig *dc; - int x, y; + struct fbcurpos *fbp; { - if (x == TGA_CURSOR_OFF || y == TGA_CURSOR_OFF) { - u_int8_t regval; - - regval = tga_bt485_rd_reg(dc->dc_regs, BT485_REG_COMMAND_2); - regval &= ~0x03; /* XXX */ - regval |= 0x00; /* XXX */ - tga_bt485_wr_reg(dc->dc_regs, BT485_REG_COMMAND_2, regval); - return; - } - - /* - * RAMDAC cursors are 1-based, and position is bottom-right - * of displayed cursor! - */ - x += 64; - y += 64; - - /* XXX CONSTANTS */ - tga_bt485_rd_reg(dc->dc_regs, BT485_REG_CURSOR_X_LOW/*, - x & 0xff*/); - tga_bt485_rd_reg(dc->dc_regs, BT485_REG_CURSOR_X_HIGH/*, - (x >> 8) & 0x0f*/); - tga_bt485_rd_reg(dc->dc_regs, BT485_REG_CURSOR_Y_LOW/*, - y & 0xff*/); - tga_bt485_rd_reg(dc->dc_regs, BT485_REG_CURSOR_Y_HIGH/*, - (y >> 8) & 0x0f*/); + dc->dc_regs[TGA_REG_CXYR] = + ((fbp->y & 0xfff) << 12) | (fbp->x & 0xfff); } -void -tga_bt485_get_cpos(dc, xp, yp) +int +tga_builtin_get_curpos(dc, fbp) struct tga_devconfig *dc; - int *xp, *yp; + struct fbcurpos *fbp; { - u_int8_t regval; - regval = tga_bt485_rd_reg(dc->dc_regs, BT485_REG_COMMAND_2); - if ((regval & 0x03) == 0x00) { /* XXX */ - *xp = *yp = TGA_CURSOR_OFF; - return; - } - - regval = tga_bt485_rd_reg(dc->dc_regs, BT485_REG_CURSOR_X_LOW); - *xp = regval; - regval = tga_bt485_rd_reg(dc->dc_regs, BT485_REG_CURSOR_X_HIGH); - *xp |= regval << 8; /* XXX */ - - regval = tga_bt485_rd_reg(dc->dc_regs, BT485_REG_CURSOR_Y_LOW); - *yp = regval; - regval = tga_bt485_rd_reg(dc->dc_regs, BT485_REG_CURSOR_Y_HIGH); - *yp |= regval << 8; /* XXX */ - - /* - * RAMDAC cursors are 1-based, and position is bottom-right - * of displayed cursor! - */ - (*xp) -= 64; - (*yp) -= 64; + fbp->x = dc->dc_regs[TGA_REG_CXYR] & 0xfff; + fbp->y = (dc->dc_regs[TGA_REG_CXYR] >> 12) & 0xfff; } -void -tga_console(pcf, pcfa, pmf, pmfa, ppf, ppfa, bus, device, function) - __const struct pci_conf_fns *pcf; - __const struct pci_mem_fns *pmf; - __const struct pci_pio_fns *ppf; - void *pcfa, *pmfa, *ppfa; - pci_bus_t bus; - pci_device_t device; - pci_function_t function; +int +tga_builtin_get_curmax(dc, fbp) + struct tga_devconfig *dc; + struct fbcurpos *fbp; { - struct tga_devconfig *dcp = &tga_console_dc; - - tga_getdevconfig(pcf, pcfa, pmf, pmfa, - PCI_MAKE_TAG(bus, device, function), dcp); - - /* sanity checks */ - if (dcp->dc_vaddr == NULL) - panic("tga_console(%d, %d): couldn't map memory space", - device, function); - if (dcp->dc_tgaconf == NULL) - panic("tga_console(%d, %d): unknown board configuration", - device, function); - wsc_console(&dcp->dc_ansicons, &tga_acf, &dcp->dc_rcons, - dcp->dc_rcons.rc_maxrow, dcp->dc_rcons.rc_maxcol, 0, 0); + fbp->x = fbp->y = 64; } diff --git a/sys/arch/alpha/pci/wsconsvar.h b/sys/arch/alpha/pci/tga_bt463.c index 77347e07faa..8d581be2ffa 100644 --- a/sys/arch/alpha/pci/wsconsvar.h +++ b/sys/arch/alpha/pci/tga_bt463.c @@ -1,21 +1,21 @@ -/* $NetBSD: wsconsvar.h,v 1.1 1995/11/23 02:38:39 cgd Exp $ */ +/* $NetBSD: tga_bt463.c,v 1.2 1996/04/12 06:09:13 cgd Exp $ */ /* - * Copyright (c) 1995 Carnegie-Mellon University. + * Copyright (c) 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou - * + * * Permission to use, copy, modify and distribute this software and * its documentation is hereby granted, provided that both the copyright * notice and this permission notice appear in all copies of the * software, derivative works or modified versions, and any portions * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * + * * Carnegie Mellon requests users of this software to return to * * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU @@ -27,14 +27,25 @@ * rights to redistribute these changes. */ -struct device; -struct ansicons; -struct ansicons_functions; +#include <sys/param.h> +#include <sys/device.h> + +#include <dev/pci/pcivar.h> +#include <machine/tgareg.h> +#include <alpha/pci/tgavar.h> +#include <alpha/pci/bt485reg.h> + +#include <machine/fbio.h> -int wscattach_output __P((struct device *, int, struct ansicons *, - struct ansicons_functions *, void *, int, int, int, int)); -void wscattach_input __P((struct device *, void *, int (*)(void *), - void (*)(void *, int))); -void wscons_kbdinput __P((char *)); -void wsc_console __P((struct ansicons *, struct ansicons_functions *, - void *, int, int, int, int)); +const struct tga_ramdac_conf tga_ramdac_bt463 = { + "Bt463", +#if 0 + NULL, /* XXX SET CMAP */ + NULL, /* XXX GET CMAP */ + tga_builtin_set_cursor, + tga_builtin_get_cursor, + tga_builtin_set_curpos, + tga_builtin_get_curpos, + tga_builtin_get_curmax, +#endif +}; diff --git a/sys/arch/alpha/pci/tga_bt485.c b/sys/arch/alpha/pci/tga_bt485.c new file mode 100644 index 00000000000..45fb5f65b7e --- /dev/null +++ b/sys/arch/alpha/pci/tga_bt485.c @@ -0,0 +1,586 @@ +/* $NetBSD: tga_bt485.c,v 1.2 1996/04/12 06:09:16 cgd Exp $ */ + +/* + * Copyright (c) 1995, 1996 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ + +#include <sys/param.h> +#include <sys/device.h> +#include <sys/buf.h> +#include <sys/kernel.h> +#include <sys/malloc.h> + +#include <dev/pci/pcivar.h> +#include <machine/tgareg.h> +#include <alpha/pci/tgavar.h> +#include <alpha/pci/bt485reg.h> + +#include <machine/fbio.h> + +/* + * Functions exported via the RAMDAC configuration table. + */ +void tga_bt485_init __P((struct tga_devconfig *, int)); +int tga_bt485_intr __P((void *)); +int tga_bt485_set_cmap __P((struct tga_devconfig *, struct fbcmap *)); +int tga_bt485_get_cmap __P((struct tga_devconfig *, struct fbcmap *)); +int tga_bt485_set_cursor __P((struct tga_devconfig *, struct fbcursor *)); +int tga_bt485_get_cursor __P((struct tga_devconfig *, struct fbcursor *)); +int tga_bt485_set_curpos __P((struct tga_devconfig *, struct fbcurpos *)); +int tga_bt485_get_curpos __P((struct tga_devconfig *, struct fbcurpos *)); +int tga_bt485_get_curmax __P((struct tga_devconfig *, struct fbcurpos *)); + +const struct tga_ramdac_conf tga_ramdac_bt485 = { + "Bt485", + tga_bt485_init, + tga_bt485_intr, + tga_bt485_set_cmap, + tga_bt485_get_cmap, + tga_bt485_set_cursor, + tga_bt485_get_cursor, + tga_bt485_set_curpos, + tga_bt485_get_curpos, + tga_bt485_get_curmax, +}; + +/* + * Private data. + */ +struct bt485data { + int changed; /* what changed; see below */ + int curenb; /* cursor enabled */ + struct fbcurpos curpos; /* current cursor position */ + struct fbcurpos curhot; /* cursor hotspot */ + char curcmap_r[2]; /* cursor colormap */ + char curcmap_g[2]; + char curcmap_b[2]; + struct fbcurpos cursize; /* current cursor size */ + char curimage[512]; /* cursor image data */ + char curmask[512]; /* cursor mask data */ + char cmap_r[256]; /* colormap */ + char cmap_g[256]; + char cmap_b[256]; +}; + +#define DATA_ENB_CHANGED 0x01 /* cursor enable changed */ +#define DATA_CURCMAP_CHANGED 0x02 /* cursor colormap changed */ +#define DATA_CURSHAPE_CHANGED 0x04 /* cursor size, image, mask changed */ +#define DATA_CMAP_CHANGED 0x08 /* colormap changed */ +#define DATA_ALL_CHANGED 0x0f + +#define CURSOR_MAX_SIZE 64 + +/* + * Internal functions. + */ +inline void tga_bt485_wr_d __P((volatile tga_reg_t *, u_int, u_int8_t)); +inline u_int8_t tga_bt485_rd_d __P((volatile tga_reg_t *, u_int)); +inline void tga_bt485_wr_i __P((volatile tga_reg_t *, u_int8_t, u_int8_t)); +inline u_int8_t tga_bt485_rd_i __P((volatile tga_reg_t *, u_int8_t)); +void tga_bt485_update __P((struct tga_devconfig *, struct bt485data *)); +void tga_bt485_update_curpos __P((struct tga_devconfig *, struct bt485data *)); + +#define tga_bt485_sched_update(dc) \ + ((dc)->dc_regs[TGA_REG_SISR] = 0x00010000) /* XXX */ + +/*****************************************************************************/ + +/* + * Functions exported via the RAMDAC configuration table. + */ + +void +tga_bt485_init(dc, alloc) + struct tga_devconfig *dc; + int alloc; +{ + u_int8_t regval; + struct bt485data tmp, *data; + int i; + + /* + * Init the BT485 for normal operation. + */ + + /* + * Allow indirect register access. (Actually, this is + * already enabled. In fact, if it is _disabled_, for + * some reason the monitor appears to lose sync!!! (?!?!) + */ + regval = tga_bt485_rd_d(dc->dc_regs, BT485_REG_COMMAND_0); + regval |= 0x80; + tga_bt485_wr_d(dc->dc_regs, BT485_REG_COMMAND_0, regval); + + /* Set the RAMDAC to 8BPP (no interestion options). */ + tga_bt485_wr_d(dc->dc_regs, BT485_REG_COMMAND_1, 0x40); + + /* Disable the cursor (for now) */ + regval = tga_bt485_rd_d(dc->dc_regs, BT485_REG_COMMAND_2); + regval &= ~0x03; + tga_bt485_wr_d(dc->dc_regs, BT485_REG_COMMAND_2, regval); + + /* Use a 64x64x2 cursor */ + regval = tga_bt485_rd_d(dc->dc_regs, BT485_IREG_COMMAND_3); + regval |= 0x04; + tga_bt485_wr_d(dc->dc_regs, BT485_IREG_COMMAND_3, regval); + + /* + * If we should allocate a new private info struct, do so. + * Otherwise, use the one we have (if it's there), or + * use the temporary one on the stack. + */ + if (alloc) { + if (dc->dc_ramdac_private != NULL) + panic("tga_bt485_init: already have private struct"); + dc->dc_ramdac_private = malloc(sizeof *data, M_DEVBUF, + M_WAITOK); + } + if (dc->dc_ramdac_private != NULL) + data = dc->dc_ramdac_private; + else + data = &tmp; + + /* + * Initalize the RAMDAC info struct to hold all of our + * data, and fill it in. + */ + data->changed = DATA_ALL_CHANGED; + + data->curenb = 0; /* cursor disabled */ + data->curpos.x = data->curpos.y = 0; /* right now at 0,0 */ + data->curhot.x = data->curhot.y = 0; /* hot spot at 0,0 */ + + /* initial cursor colormap: 0 is black, 1 is white */ + data->curcmap_r[0] = data->curcmap_g[0] = data->curcmap_b[0] = 0; + data->curcmap_r[1] = data->curcmap_g[1] = data->curcmap_b[1] = 0xff; + + /* initial cursor data: 64x64 block of white. */ + data->cursize.x = data->cursize.y = 64; + for (i = 0; i < 512; i++) + data->curimage[i] = data->curmask[i] = 0xff; + + /* Initial colormap: 0 is black, everything else is white */ + data->cmap_r[0] = data->cmap_g[0] = data->cmap_b[0] = 0; + for (i = 1; i < 256; i++) + data->cmap_r[i] = data->cmap_g[i] = data->cmap_b[i] = 255; + + tga_bt485_update(dc, data); + + dc->dc_regs[TGA_REG_SISR] = 0x00000001; /* XXX */ +} + +int +tga_bt485_set_cmap(dc, fbc) + struct tga_devconfig *dc; + struct fbcmap *fbc; +{ + struct bt485data *data = dc->dc_ramdac_private; + int error, count, index, s; + + if ((u_int)fbc->index >= 256 || + ((u_int)fbc->index + (u_int)fbc->count) > 256) + return (EINVAL); + if (!useracc(fbc->red, fbc->count, B_READ) || + !useracc(fbc->green, fbc->count, B_READ) || + !useracc(fbc->blue, fbc->count, B_READ)) + return (EFAULT); + + s = spltty(); + + index = fbc->index; + count = fbc->count; + copyin(fbc->red, &data->cmap_r[index], count); + copyin(fbc->green, &data->cmap_g[index], count); + copyin(fbc->blue, &data->cmap_b[index], count); + + data->changed |= DATA_CMAP_CHANGED; + + tga_bt485_sched_update(dc); + splx(s); + + return (0); +} + +int +tga_bt485_get_cmap(dc, fbc) + struct tga_devconfig *dc; + struct fbcmap *fbc; +{ + struct bt485data *data = dc->dc_ramdac_private; + int error, count, index; + + if ((u_int)fbc->index >= 256 || + ((u_int)fbc->index + (u_int)fbc->count) > 256) + return (EINVAL); + + count = fbc->count; + index = fbc->index; + + error = copyout(&data->cmap_r[index], fbc->red, count); + if (error) + return (error); + error = copyout(&data->cmap_g[index], fbc->green, count); + if (error) + return (error); + error = copyout(&data->cmap_b[index], fbc->blue, count); + return (error); +} + +int +tga_bt485_set_cursor(dc, fbc) + struct tga_devconfig *dc; + struct fbcursor *fbc; +{ + struct bt485data *data = dc->dc_ramdac_private; + int error, count, index, v, s; + + v = fbc->set; + + /* + * For SETCMAP and SETSHAPE, verify that parameters are OK + * before we do anything that we can't recover from. + */ + if (v & FB_CUR_SETCMAP) { + if ((u_int)fbc->cmap.index > 2 || + ((u_int)fbc->cmap.index + (u_int)fbc->cmap.count) > 2) + return (EINVAL); + count = fbc->cmap.count; + if (!useracc(fbc->cmap.red, count, B_READ) || + !useracc(fbc->cmap.green, count, B_READ) || + !useracc(fbc->cmap.blue, count, B_READ)) + return (EFAULT); + } + if (v & FB_CUR_SETSHAPE) { + if ((u_int)fbc->size.x > CURSOR_MAX_SIZE || + (u_int)fbc->size.y > CURSOR_MAX_SIZE) + return (EINVAL); + count = (CURSOR_MAX_SIZE / NBBY) * data->cursize.y; + if (!useracc(fbc->image, count, B_READ) || + !useracc(fbc->mask, count, B_READ)) + return (EFAULT); + } + + if (v & (FB_CUR_SETPOS | FB_CUR_SETCUR)) { + if (v & FB_CUR_SETPOS) + data->curpos = fbc->pos; + if (v & FB_CUR_SETCUR) + data->curhot = fbc->hot; + tga_bt485_update_curpos(dc, data); + } + + s = spltty(); + + /* Parameters are OK; perform the requested operations. */ + if (v & FB_CUR_SETCUR) { + data->curenb = fbc->enable; + data->changed |= DATA_ENB_CHANGED; + } + if (v & FB_CUR_SETCMAP) { + count = fbc->cmap.count; + index = fbc->cmap.index; + copyin(fbc->cmap.red, &data->cmap_r[index], count); + copyin(fbc->cmap.green, &data->cmap_g[index], count); + copyin(fbc->cmap.blue, &data->cmap_b[index], count); + data->changed |= DATA_CURCMAP_CHANGED; + } + if (v & FB_CUR_SETSHAPE) { + data->cursize = fbc->size; + count = (CURSOR_MAX_SIZE / NBBY) * data->cursize.y; + bzero(data->curimage, sizeof data->curimage); + bzero(data->curmask, sizeof data->curmask); + copyin(fbc->image, data->curimage, count); /* can't fail */ + copyin(fbc->mask, data->curmask, count); /* can't fail */ + data->changed |= DATA_CURSHAPE_CHANGED; + } + + if (data->changed) + tga_bt485_sched_update(dc); + splx(s); + + return (0); +} + +int +tga_bt485_get_cursor(dc, fbc) + struct tga_devconfig *dc; + struct fbcursor *fbc; +{ + struct bt485data *data = dc->dc_ramdac_private; + int error, count; + + fbc->set = FB_CUR_SETALL; /* we return everything they want */ + fbc->enable = data->curenb; /* SETCUR */ + fbc->pos = data->curpos; /* SETPOS */ + fbc->hot = data->curhot; /* SETHOT */ + + fbc->cmap.index = 0; /* SETCMAP */ + fbc->cmap.count = 2; + if (fbc->cmap.red != NULL) { + error = copyout(data->curcmap_r, fbc->cmap.red, 2); + if (error) + return (error); + } + if (fbc->cmap.green != NULL) { + error = copyout(data->curcmap_g, fbc->cmap.green, 2); + if (error) + return (error); + } + if (fbc->cmap.blue != NULL) { + error = copyout(data->curcmap_b, fbc->cmap.blue, 2); + if (error) + return (error); + } + + fbc->size = data->cursize; /* SETSHAPE */ + if (fbc->image != NULL) { + count = (CURSOR_MAX_SIZE / NBBY) * data->cursize.y; + error = copyout(data->curimage, fbc->image, count); + if (error) + return (error); + error = copyout(data->curmask, fbc->mask, count); + if (error) + return (error); + } + + return (0); +} + +int +tga_bt485_set_curpos(dc, fbp) + struct tga_devconfig *dc; + struct fbcurpos *fbp; +{ + struct bt485data *data = dc->dc_ramdac_private; + + data->curpos = *fbp; + tga_bt485_update_curpos(dc, data); + + return (0); +} + +int +tga_bt485_get_curpos(dc, fbp) + struct tga_devconfig *dc; + struct fbcurpos *fbp; +{ + struct bt485data *data = dc->dc_ramdac_private; + + *fbp = data->curpos; + return (0); +} + +int +tga_bt485_get_curmax(dc, fbp) + struct tga_devconfig *dc; + struct fbcurpos *fbp; +{ + struct bt485data *data = dc->dc_ramdac_private; + + fbp->x = fbp->y = CURSOR_MAX_SIZE; + return (0); +} + +int +tga_bt485_intr(v) + void *v; +{ + struct tga_devconfig *dc = v; + + if ((dc->dc_regs[TGA_REG_SISR] & 0x00010001) != 0x00010001) + return 0; + tga_bt485_update(dc, dc->dc_ramdac_private); + dc->dc_regs[TGA_REG_SISR] = 0x00000001; + return (1); +} + +/*****************************************************************************/ + +/* + * Internal functions. + */ + +inline void +tga_bt485_wr_d(tgaregs, btreg, val) + volatile tga_reg_t *tgaregs; + u_int btreg; + u_int8_t val; +{ + + if (btreg > BT485_REG_MAX) + panic("tga_bt485_wr_d: reg %d out of range\n", btreg); + + tgaregs[TGA_REG_EPDR] = (btreg << 9) | (0 << 8 ) | val; /* XXX */ + wbflush(); +} + +inline u_int8_t +tga_bt485_rd_d(tgaregs, btreg) + volatile tga_reg_t *tgaregs; + u_int btreg; +{ + tga_reg_t rdval; + + if (btreg > BT485_REG_MAX) + panic("tga_bt485_rd_d: reg %d out of range\n", btreg); + + tgaregs[TGA_REG_EPSR] = (btreg << 1) | 0x1; /* XXX */ + wbflush(); + + rdval = tgaregs[TGA_REG_EPDR]; + return (rdval >> 16) & 0xff; /* XXX */ +} + +inline void +tga_bt485_wr_i(tgaregs, ireg, val) + volatile tga_reg_t *tgaregs; + u_int8_t ireg; + u_int8_t val; +{ + tga_bt485_wr_d(tgaregs, BT485_REG_PCRAM_WRADDR, ireg); + tga_bt485_wr_d(tgaregs, BT485_REG_EXTENDED, val); +} + +inline u_int8_t +tga_bt485_rd_i(tgaregs, ireg) + volatile tga_reg_t *tgaregs; + u_int8_t ireg; +{ + tga_bt485_wr_d(tgaregs, BT485_REG_PCRAM_WRADDR, ireg); + return (tga_bt485_rd_d(tgaregs, BT485_REG_EXTENDED)); +} + +void +tga_bt485_update(dc, data) + struct tga_devconfig *dc; + struct bt485data *data; +{ + u_int8_t regval; + int count, i, v; + + v = data->changed; + data->changed = 0; + + if (v & DATA_ENB_CHANGED) { + regval = tga_bt485_rd_d(dc->dc_regs, BT485_REG_COMMAND_2); + if (data->curenb) + regval |= 0x01; + else + regval &= ~0x03; + tga_bt485_wr_d(dc->dc_regs, BT485_REG_COMMAND_2, regval); + } + + if (v & DATA_CURCMAP_CHANGED) { + /* addr[9:0] assumed to be 0 */ + /* set addr[7:0] to 1 */ + tga_bt485_wr_d(dc->dc_regs, BT485_REG_COC_WRADDR, 0x01); + + /* spit out the cursor data */ + for (i = 0; i < 2; i++) { + tga_bt485_wr_d(dc->dc_regs, BT485_REG_COCDATA, + data->curcmap_r[i]); + tga_bt485_wr_d(dc->dc_regs, BT485_REG_COCDATA, + data->curcmap_g[i]); + tga_bt485_wr_d(dc->dc_regs, BT485_REG_COCDATA, + data->curcmap_b[i]); + } + } + + if (v & DATA_CURSHAPE_CHANGED) { + count = (CURSOR_MAX_SIZE / NBBY) * data->cursize.y; + + /* + * Write the cursor image data: + * set addr[9:8] to 0, + * set addr[7:0] to 0, + * spit it all out. + */ + regval = tga_bt485_rd_i(dc->dc_regs, + BT485_IREG_COMMAND_3); + regval &= ~0x03; + tga_bt485_wr_i(dc->dc_regs, BT485_IREG_COMMAND_3, + regval); + tga_bt485_wr_d(dc->dc_regs, BT485_REG_PCRAM_WRADDR, 0); + for (i = 0; i < count; i++) + tga_bt485_wr_d(dc->dc_regs, BT485_REG_CURSOR_RAM, + data->curimage[i]); + + /* + * Write the cursor mask data: + * set addr[9:8] to 2, + * set addr[7:0] to 0, + * spit it all out. + */ + regval = tga_bt485_rd_i(dc->dc_regs, + BT485_IREG_COMMAND_3); + regval &= ~0x03; regval |= 0x02; + tga_bt485_wr_i(dc->dc_regs, BT485_IREG_COMMAND_3, + regval); + tga_bt485_wr_d(dc->dc_regs, BT485_REG_PCRAM_WRADDR, 0); + for (i = 0; i < count; i++) + tga_bt485_wr_d(dc->dc_regs, BT485_REG_CURSOR_RAM, + data->curmask[i]); + + /* set addr[9:0] back to 0 */ + regval = tga_bt485_rd_i(dc->dc_regs, BT485_IREG_COMMAND_3); + regval &= ~0x03; + tga_bt485_wr_i(dc->dc_regs, BT485_IREG_COMMAND_3, regval); + } + + if (v & DATA_CMAP_CHANGED) { + /* addr[9:0] assumed to be 0 */ + /* set addr[7:0] to 0 */ + tga_bt485_wr_d(dc->dc_regs, BT485_REG_PCRAM_WRADDR, 0x00); + + /* spit out the cursor data */ + for (i = 0; i < 256; i++) { + tga_bt485_wr_d(dc->dc_regs, BT485_REG_PALETTE, + data->cmap_r[i]); + tga_bt485_wr_d(dc->dc_regs, BT485_REG_PALETTE, + data->cmap_g[i]); + tga_bt485_wr_d(dc->dc_regs, BT485_REG_PALETTE, + data->cmap_b[i]); + } + } +} + +void +tga_bt485_update_curpos(dc, data) + struct tga_devconfig *dc; + struct bt485data *data; +{ + int s, x, y; + + s = spltty(); + + x = data->curpos.x + CURSOR_MAX_SIZE - data->curhot.x; + y = data->curpos.y + CURSOR_MAX_SIZE - data->curhot.y; + tga_bt485_wr_d(dc->dc_regs, BT485_REG_CURSOR_X_LOW, x & 0xff); + tga_bt485_wr_d(dc->dc_regs, BT485_REG_CURSOR_X_HIGH, (x >> 8) & 0x0f); + tga_bt485_wr_d(dc->dc_regs, BT485_REG_CURSOR_Y_LOW, y & 0xff); + tga_bt485_wr_d(dc->dc_regs, BT485_REG_CURSOR_Y_HIGH, (y >> 8) & 0x0f); + + splx(s); +} diff --git a/sys/arch/alpha/pci/tga_conf.c b/sys/arch/alpha/pci/tga_conf.c new file mode 100644 index 00000000000..114e6964789 --- /dev/null +++ b/sys/arch/alpha/pci/tga_conf.c @@ -0,0 +1,183 @@ +/* $NetBSD: tga_conf.c,v 1.2 1996/04/12 06:09:18 cgd Exp $ */ + +/* + * Copyright (c) 1995, 1996 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ + +#include <sys/param.h> +#include <sys/device.h> + +#include <dev/pci/pcivar.h> +#include <machine/tgareg.h> +#include <alpha/pci/tgavar.h> + +#undef KB +#define KB * 1024 +#undef MB +#define MB * 1024 * 1024 + +static const struct tga_conf tga_configs[TGA_TYPE_UNKNOWN] = { + /* TGA_TYPE_T8_01 */ + { + "T8-01", + &tga_ramdac_bt485, + 8, + 4 MB, + 2 KB, + 1, { 2 MB, 0 }, { 1 MB, 0 }, + 0, { 0, 0 }, { 0, 0 }, + }, + /* TGA_TYPE_T8_02 */ + { + "T8-02", + &tga_ramdac_bt485, + 8, + 4 MB, + 4 KB, + 1, { 2 MB, 0 }, { 2 MB, 0 }, + 0, { 0, 0 }, { 0, 0 }, + }, + /* TGA_TYPE_T8_22 */ + { + "T8-22", + &tga_ramdac_bt485, + 8, + 8 MB, + 4 KB, + 1, { 4 MB, 0 }, { 2 MB, 0 }, + 1, { 6 MB, 0 }, { 2 MB, 0 }, + }, + /* TGA_TYPE_T8_44 */ + { + "T8-44", + &tga_ramdac_bt485, + 8, + 16 MB, + 4 KB, + 2, { 8 MB, 12 MB }, { 2 MB, 2 MB }, + 2, { 10 MB, 14 MB }, { 2 MB, 2 MB }, + }, + /* TGA_TYPE_T32_04 */ + { + "T32-04", + &tga_ramdac_bt463, + 32, + 16 MB, + 8 KB, + 1, { 8 MB, 0 }, { 4 MB, 0 }, + 0, { 0, 0 }, { 0, 0 }, + }, + /* TGA_TYPE_T32_08 */ + { + "T32-08", + &tga_ramdac_bt463, + 32, + 16 MB, + 16 KB, + 1, { 8 MB, 0 }, { 8 MB, 0 }, + 0, { 0, 0 }, { 0, 0 }, + }, + /* TGA_TYPE_T32_88 */ + { + "T32-88", + &tga_ramdac_bt463, + 32, + 32 MB, + 16 KB, + 1, { 16 MB, 0 }, { 8 MB, 0 }, + 1, { 24 MB, 0 }, { 8 MB, 0 }, + }, +}; + +#undef KB +#undef MB + +int +tga_identify(regs) + tga_reg_t *regs; +{ + int type; + int deep, addrmask, wide; + + deep = (regs[TGA_REG_GDER] & 0x1) != 0; /* XXX */ + addrmask = ((regs[TGA_REG_GDER] >> 2) & 0x7); /* XXX */ + wide = (regs[TGA_REG_GDER] & 0x200) == 0; /* XXX */ + + type = TGA_TYPE_UNKNOWN; + + if (!deep) { + /* 8bpp frame buffer */ + + if (addrmask == 0x0) { + /* 4MB core map; T8-01 or T8-02 */ + + if (!wide) + type = TGA_TYPE_T8_01; + else + type = TGA_TYPE_T8_02; + } else if (addrmask == 0x1) { + /* 8MB core map; T8-22 */ + + if (wide) /* sanity */ + type = TGA_TYPE_T8_22; + } else if (addrmask == 0x3) { + /* 16MB core map; T8-44 */ + + if (wide) /* sanity */ + type = TGA_TYPE_T8_44; + } + } else { + /* 32bpp frame buffer */ + + if (addrmask == 0x3) { + /* 16MB core map; T32-04 or T32-08 */ + + if (!wide) + type = TGA_TYPE_T32_04; + else + type = TGA_TYPE_T32_08; + } else if (addrmask == 0x7) { + /* 32MB core map; T32-88 */ + + if (wide) /* sanity */ + type = TGA_TYPE_T32_88; + } + } + + return (type); +} + +const struct tga_conf * +tga_getconf(type) + int type; +{ + + if (type >= 0 && type < TGA_TYPE_UNKNOWN) + return &tga_configs[type]; + + return (NULL); +} + diff --git a/sys/arch/alpha/pci/tgavar.h b/sys/arch/alpha/pci/tgavar.h index b1ab195c624..f4cad9b7777 100644 --- a/sys/arch/alpha/pci/tgavar.h +++ b/sys/arch/alpha/pci/tgavar.h @@ -1,7 +1,7 @@ -/* $NetBSD: tgavar.h,v 1.3 1995/11/23 02:38:31 cgd Exp $ */ +/* $NetBSD: tgavar.h,v 1.5 1996/04/12 06:09:21 cgd Exp $ */ /* - * Copyright (c) 1995 Carnegie-Mellon University. + * Copyright (c) 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -27,27 +27,40 @@ * rights to redistribute these changes. */ -#include <alpha/pci/tgareg.h> +#include <machine/tgareg.h> #include <dev/rcons/raster.h> -#include <dev/pseudo/rcons.h> -#include <dev/pseudo/ansicons.h> +#include <alpha/wscons/wsconsvar.h> +#include <alpha/wscons/wscons_raster.h> struct tga_devconfig; +struct fbcmap; +struct fbcursor; +struct fbcurpos; struct tga_ramdac_conf { char *tgar_name; - void (*tgar_set_cpos) __P((struct tga_devconfig *, int, int)); - void (*tgar_get_cpos) __P((struct tga_devconfig *, int *, int *)); - /* set cursor shape */ - /* set cursor location */ - /* set cursor colormap? */ - /* set colormap? */ + void (*tgar_init) __P((struct tga_devconfig *, int)); + int (*tgar_intr) __P((void *)); + int (*tgar_set_cmap) __P((struct tga_devconfig *, + struct fbcmap *)); + int (*tgar_get_cmap) __P((struct tga_devconfig *, + struct fbcmap *)); + int (*tgar_set_cursor) __P((struct tga_devconfig *, + struct fbcursor *)); + int (*tgar_get_cursor) __P((struct tga_devconfig *, + struct fbcursor *)); + int (*tgar_set_curpos) __P((struct tga_devconfig *, + struct fbcurpos *)); + int (*tgar_get_curpos) __P((struct tga_devconfig *, + struct fbcurpos *)); + int (*tgar_get_curmax) __P((struct tga_devconfig *, + struct fbcurpos *)); }; struct tga_conf { char *tgac_name; /* name for this board type */ - __const struct tga_ramdac_conf + const struct tga_ramdac_conf *tgac_ramdac; /* the RAMDAC type; see above */ int tgac_phys_depth; /* physical frame buffer depth */ vm_size_t tgac_cspace_size; /* core space size */ @@ -63,20 +76,16 @@ struct tga_conf { }; struct tga_devconfig { - __const struct pci_conf_fns *dc_pcf; - void *dc_pcfa; - __const struct pci_mem_fns *dc_pmf; - void *dc_pmfa; - __const struct pci_pio_fns *dc_ppf; - void *dc_ppfa; + bus_chipset_tag_t dc_bc; + pci_chipset_tag_t dc_pc; - pci_conftag_t dc_pcitag; /* PCI tag */ - pci_moffset_t dc_pcipaddr; /* PCI phys addr. */ + pcitag_t dc_pcitag; /* PCI tag */ + bus_mem_addr_t dc_pcipaddr; /* PCI phys addr. */ tga_reg_t *dc_regs; /* registers; XXX: need aliases */ int dc_tga_type; /* the device type; see below */ - __const struct tga_conf *dc_tgaconf; /* device buffer configuration */ + const struct tga_conf *dc_tgaconf; /* device buffer configuration */ vm_offset_t dc_vaddr; /* memory space virtual base address */ vm_offset_t dc_paddr; /* memory space physical base address */ @@ -89,7 +98,9 @@ struct tga_devconfig { struct raster dc_raster; /* raster description */ struct rcons dc_rcons; /* raster blitter control info */ - struct ansicons dc_ansicons; /* ansi console emulator info XXX */ + + int dc_blanked; /* currently had video disabled */ + void *dc_ramdac_private; /* RAMDAC private storage */ }; struct tga_softc { @@ -97,6 +108,7 @@ struct tga_softc { struct tga_devconfig *sc_dc; /* device configuration */ void *sc_intr; /* interrupt handler info */ + /* XXX should record intr fns/arg */ }; #define TGA_TYPE_T8_01 0 /* 8bpp, 1MB */ @@ -108,13 +120,20 @@ struct tga_softc { #define TGA_TYPE_T32_88 6 /* 32bpp, 16MB */ #define TGA_TYPE_UNKNOWN 7 /* unknown */ -#define TGA_CURSOR_OFF -1 /* pass to tgar_cpos to disable */ - #define DEVICE_IS_TGA(class, id) \ - (PCI_VENDOR(id) == PCI_VENDOR_DEC && \ - PCI_PRODUCT(id) == PCI_PRODUCT_DEC_21030) + ((PCI_VENDOR(id) == PCI_VENDOR_DEC && \ + PCI_PRODUCT(id) == PCI_PRODUCT_DEC_21030) ? 10 : 0) + +void tga_console __P((bus_chipset_tag_t, pci_chipset_tag_t, int, int, int)); + +int tga_identify __P((tga_reg_t *)); +const struct tga_conf *tga_getconf __P((int)); + +extern const struct tga_ramdac_conf tga_ramdac_bt463; +extern const struct tga_ramdac_conf tga_ramdac_bt485; -void tga_console __P((__const struct pci_conf_fns *, void *, - __const struct pci_mem_fns *, void *, - __const struct pci_pio_fns *, void *, - pci_bus_t, pci_device_t, pci_function_t)); +int tga_builtin_set_cursor __P((struct tga_devconfig *, struct fbcursor *)); +int tga_builtin_get_cursor __P((struct tga_devconfig *, struct fbcursor *)); +int tga_builtin_set_curpos __P((struct tga_devconfig *, struct fbcurpos *)); +int tga_builtin_get_curpos __P((struct tga_devconfig *, struct fbcurpos *)); +int tga_builtin_get_curmax __P((struct tga_devconfig *, struct fbcurpos *)); diff --git a/sys/arch/alpha/pci/wscons.c b/sys/arch/alpha/pci/wscons.c deleted file mode 100644 index fa5a988cf09..00000000000 --- a/sys/arch/alpha/pci/wscons.c +++ /dev/null @@ -1,383 +0,0 @@ -/* $NetBSD: wscons.c,v 1.3 1995/11/23 02:38:36 cgd Exp $ */ - -/* - * Copyright (c) 1995 Carnegie-Mellon University. - * All rights reserved. - * - * Author: Chris G. Demetriou - * - * Permission to use, copy, modify and distribute this software and - * its documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND - * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie the - * rights to redistribute these changes. - */ - -#include <sys/param.h> -#include <sys/device.h> -#include <sys/kernel.h> -#include <sys/conf.h> -#include <sys/systm.h> -#include <sys/ioctl.h> -#include <sys/proc.h> -#include <sys/tty.h> -#include <sys/termios.h> - -#include <dev/cons.h> -#include <dev/pseudo/ansicons.h> -#include <alpha/pci/wsconsvar.h> - -#define NWSC 16 /* XXX XXX XXX */ - -#define WSCUNIT(dev) minor(dev) - -struct wsc_softc { - int sc_flags; - - struct device *sc_odev; - struct ansicons *sc_ansicons; - - struct tty *sc_tty; -}; - -#define WSC_INPUT 0x01 -#define WSC_OUTPUT 0x02 -#define WSC_ALIVE (WSC_INPUT | WSC_OUTPUT) - -struct wsc_softc wsc_sc[NWSC]; /* XXX XXX XXX */ -int nwsc = NWSC; -int nextiwsc; -int nextowsc; - -void wscstart __P((struct tty *)); -int wscparam __P((struct tty *, struct termios *)); - -int wsccngetc __P((dev_t)); -void wsccnputc __P((dev_t, int)); -void wsccnpollc __P((dev_t, int)); - -struct ansicons *wsc_console_ansicons; -void *wsc_input_arg; -int (*wsc_console_getc) __P((void *)) = NULL; -void (*wsc_console_pollc) __P((void *, int)) = NULL; -struct consdev wsccons = { NULL, NULL, wsccngetc, wsccnputc, - wsccnpollc, NODEV, 1 }; - -int wsc_kbdfocusunit = -1; /* XXX */ - -int -wscattach_output(dev, console, acp, acf, acfarg, mrow, mcol, crow, ccol) - struct device *dev; - int console; - struct ansicons *acp; - struct ansicons_functions *acf; - void *acfarg; - int mrow, mcol, crow, ccol; -{ - - if (nextowsc >= nwsc) - return 0; - - wsc_sc[nextowsc].sc_odev = dev; - wsc_sc[nextowsc].sc_ansicons = acp; - - if (wsc_kbdfocusunit == -1) - wsc_kbdfocusunit = nextowsc; - - if (!console) - ansicons_attach(acp, acf, acfarg, mrow, mcol, crow, ccol); - else { - wsc_kbdfocusunit = nextowsc; - wsccons.cn_dev = makedev(25, nextowsc); - } - - wsc_sc[nextowsc].sc_flags |= WSC_OUTPUT; - wsc_sc[nextowsc].sc_tty = ttymalloc(); - - printf("wsc%d: %s attached as output\n", nextowsc, dev->dv_xname); - if (console) - printf("wsc%d: console\n", nextowsc); - - nextowsc++; - return 1; -} - -void -wscattach_input(dev, cookie, getc, pollc) - struct device *dev; - void *cookie; - int (*getc) __P((void *)); - void (*pollc) __P((void *, int)); -{ - - printf("wsc: %s attached as input device\n", dev->dv_xname); - - wsc_input_arg = cookie; - wsc_console_getc = getc; - wsc_console_pollc = pollc; -} - -int -wscopen(dev, flag, mode, p) - dev_t dev; - int flag, mode; - struct proc *p; -{ - struct wsc_softc *sc; - int unit = WSCUNIT(dev); - struct tty *tp; - - if (unit >= nwsc) - return ENXIO; - sc = &wsc_sc[unit]; - if (sc == 0) - return ENXIO; - - if ((sc->sc_flags & WSC_ALIVE) == 0) - return ENXIO; - - if (!sc->sc_tty) - panic("wscopen: no tty!"); - tp = sc->sc_tty; - - tp->t_oproc = wscstart; - tp->t_param = wscparam; - tp->t_dev = dev; - if ((tp->t_state & TS_ISOPEN) == 0) { - tp->t_state |= TS_WOPEN; - ttychars(tp); - tp->t_iflag = TTYDEF_IFLAG; - tp->t_oflag = TTYDEF_OFLAG; - tp->t_cflag = TTYDEF_CFLAG; - tp->t_lflag = TTYDEF_LFLAG; - tp->t_ispeed = tp->t_ospeed = TTYDEF_SPEED; - wscparam(tp, &tp->t_termios); - ttsetwater(tp); - } else if ((tp->t_state & TS_XCLUDE) != 0 && p->p_ucred->cr_uid != 0) - return EBUSY; - tp->t_state |= TS_CARR_ON; - - return ((*linesw[tp->t_line].l_open)(dev, tp)); -} - -int -wscclose(dev, flag, mode, p) - dev_t dev; - int flag, mode; - struct proc *p; -{ - struct wsc_softc *sc = &wsc_sc[WSCUNIT(dev)]; - struct tty *tp = sc->sc_tty; - - (*linesw[tp->t_line].l_close)(tp, flag); - ttyclose(tp); -#ifdef notyet /* XXX */ - ttyfree(tp); -#endif - return(0); -} - -int -wscread(dev, uio, flag) - dev_t dev; - struct uio *uio; - int flag; -{ - struct wsc_softc *sc = &wsc_sc[WSCUNIT(dev)]; - struct tty *tp = sc->sc_tty; - - return ((*linesw[tp->t_line].l_read)(tp, uio, flag)); -} - -int -wscwrite(dev, uio, flag) - dev_t dev; - struct uio *uio; - int flag; -{ - struct wsc_softc *sc = &wsc_sc[WSCUNIT(dev)]; - struct tty *tp = sc->sc_tty; - - return ((*linesw[tp->t_line].l_write)(tp, uio, flag)); -} - -struct tty * -wsctty(dev) - dev_t dev; -{ - struct wsc_softc *sc = &wsc_sc[WSCUNIT(dev)]; - struct tty *tp = sc->sc_tty; - - return (tp); -} - -int -wscioctl(dev, cmd, data, flag, p) - dev_t dev; - u_long cmd; - caddr_t data; - int flag; - struct proc *p; -{ - struct wsc_softc *sc = &wsc_sc[WSCUNIT(dev)]; - struct tty *tp = sc->sc_tty; - int error; - - error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flag, p); - if (error >= 0) - return error; - error = ttioctl(tp, cmd, data, flag, p); - if (error >= 0) - return error; - - switch (cmd) { - default: - return (ENOTTY); - } - -#ifdef DIAGNOSTIC - panic("wscioctl: impossible"); -#endif -} - -void -wscstart(tp) - register struct tty *tp; -{ - register int s, n, i; - char buf[OBUFSIZ]; - - s = spltty(); - if (tp->t_state & (TS_TIMEOUT | TS_BUSY | TS_TTSTOP)) { - splx(s); - return; - } - tp->t_state |= TS_BUSY; - splx(s); - n = q_to_b(&tp->t_outq, buf, sizeof(buf)); - for (i = 0; i < n; ++i) - buf[i] &= 0177; /* strip parity (argh) */ - ansicons_input(wsc_sc[WSCUNIT(tp->t_dev)].sc_ansicons, buf, n); - - s = spltty(); - tp->t_state &= ~TS_BUSY; - /* Come back if there's more to do */ - if (tp->t_outq.c_cc) { - tp->t_state |= TS_TIMEOUT; - timeout(ttrstrt, tp, 1); - } - if (tp->t_outq.c_cc <= tp->t_lowat) { - if (tp->t_state&TS_ASLEEP) { - tp->t_state &= ~TS_ASLEEP; - wakeup((caddr_t)&tp->t_outq); - } - selwakeup(&tp->t_wsel); - } - splx(s); -} - -void -wscstop(tp, flag) - struct tty *tp; - int flag; -{ - -} - -/* - * Set line parameters. - */ -int -wscparam(tp, t) - struct tty *tp; - struct termios *t; -{ - - tp->t_ispeed = t->c_ispeed; - tp->t_ospeed = t->c_ospeed; - tp->t_cflag = t->c_cflag; - return 0; -} - -/* - * keyboard input! - */ -void -wscons_kbdinput(cp) - char *cp; -{ - struct wsc_softc *sc; - struct tty *tp; - - if (wsc_kbdfocusunit == -1) - return; - - sc = &wsc_sc[wsc_kbdfocusunit]; - tp = sc->sc_tty; - - while (*cp) - (*linesw[tp->t_line].l_rint)(*cp++, tp); -} - -/* - * XXX CONSOLE HANDLING GUNK. - */ - -void -wsc_console(acp, acf, acfarg, mrow, mcol, crow, ccol) - struct ansicons *acp; - struct ansicons_functions *acf; - void *acfarg; - int mrow, mcol, crow, ccol; -{ - - wsc_console_ansicons = acp; - ansicons_attach(acp, acf, acfarg, mrow, mcol, crow, ccol); - - cn_tab = &wsccons; -} - -void -wsccnputc(dev, ic) - dev_t dev; - int ic; -{ - char c = ic; - - ansicons_input(wsc_console_ansicons, &c, 1); -} - -int -wsccngetc(dev) - dev_t dev; -{ - - if (wsc_console_getc != NULL) - return (*wsc_console_getc)(wsc_input_arg); - else - return '\0'; -} - -void -wsccnpollc(dev, i) - dev_t dev; - int i; -{ - - if (wsc_console_pollc != NULL) - (*wsc_console_pollc)(wsc_input_arg, i); -} diff --git a/sys/arch/alpha/stand/OSFpal.c b/sys/arch/alpha/stand/OSFpal.c index bfe46b2d727..54fed6eca06 100644 --- a/sys/arch/alpha/stand/OSFpal.c +++ b/sys/arch/alpha/stand/OSFpal.c @@ -1,3 +1,31 @@ +/* $NetBSD: OSFpal.c,v 1.2 1996/04/12 06:09:30 cgd Exp $ */ + +/* + * Copyright (c) 1994, 1996 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Keith Bostic + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ #include <sys/types.h> diff --git a/sys/arch/alpha/stand/bbinfo.h b/sys/arch/alpha/stand/bbinfo.h index 8da100b28db..e83faf540f7 100644 --- a/sys/arch/alpha/stand/bbinfo.h +++ b/sys/arch/alpha/stand/bbinfo.h @@ -1,3 +1,31 @@ +/* $NetBSD: bbinfo.h,v 1.2 1996/04/12 06:09:34 cgd Exp $ */ + +/* + * Copyright (c) 1995, 1996 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ struct bbinfoloc { u_int64_t magic1; diff --git a/sys/arch/alpha/stand/boot/Makefile b/sys/arch/alpha/stand/boot/Makefile index 23c3c283e7c..1c79f284abb 100644 --- a/sys/arch/alpha/stand/boot/Makefile +++ b/sys/arch/alpha/stand/boot/Makefile @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.5 1995/11/23 02:39:20 cgd Exp $ +# $NetBSD: Makefile,v 1.6 1996/04/12 01:35:15 cgd Exp $ .PATH: ${.CURDIR}/.. ${.CURDIR}/../../../../lib/libsa @@ -6,7 +6,7 @@ BOOT_PROG = boot BOOT_RELOC = ${SECONDARY_LOAD_ADDRESS} BOOT_SRCS = start.S boot.c disk.c conf.c prom.c prom_disp.S OSFpal.c -BOOT_SRCS+= alloc.c bzero.c close.c dev.c devopen.c disklabel.c +BOOT_SRCS+= alloc.c bzero.c close.c dev.c devopen.c disklabel.c dkcksum.c BOOT_SRCS+= getfile.c gets.c ioctl.c lseek.c open.c printf.c read.c BOOT_SRCS+= strcmp.c ufs.c write.c bcopy.c filesystem.c strlen.c BOOT_SRCS+= ntohl.c prom_swpal.S diff --git a/sys/arch/alpha/stand/boot/boot.c b/sys/arch/alpha/stand/boot/boot.c index 0abbb15e7e8..85daa6aa43e 100644 --- a/sys/arch/alpha/stand/boot/boot.c +++ b/sys/arch/alpha/stand/boot/boot.c @@ -1,4 +1,4 @@ -/* $NetBSD: boot.c,v 1.4 1995/11/23 02:39:27 cgd Exp $ */ +/* $NetBSD: boot.c,v 1.6 1996/05/10 00:15:08 cgd Exp $ */ /* * Copyright (c) 1992, 1993 @@ -43,15 +43,15 @@ #include <sys/param.h> #include <sys/exec.h> +#include <sys/exec_ecoff.h> #include <machine/prom.h> -#include "include/coff.h" #define _KERNEL #include "include/pte.h" static int aout_exec __P((int, struct exec *, u_int64_t *)); -static int coff_exec __P((int, struct exechdr *, u_int64_t *)); +static int coff_exec __P((int, struct ecoff_exechdr *, u_int64_t *)); static int loadfile __P((char *, u_int64_t *)); char line[64] = "/netbsd"; @@ -160,7 +160,7 @@ loadfile(fname, entryp) struct devices *dp; union { struct exec aout; - struct exechdr coff; + struct ecoff_exechdr coff; } hdr; ssize_t nr; int fd, rval; @@ -179,7 +179,7 @@ loadfile(fname, entryp) } /* Exec a.out or COFF. */ - rval = N_COFFBADMAG(hdr.coff.a) ? + rval = ECOFF_BADMAG(&hdr.coff) ? /* XXX check aouthdr */ aout_exec(fd, &hdr.aout, entryp) : coff_exec(fd, &hdr.coff, entryp); @@ -237,13 +237,13 @@ aout_exec(fd, aout, entryp) static int coff_exec(fd, coff, entryp) int fd; - struct exechdr *coff; + struct ecoff_exechdr *coff; u_int64_t *entryp; { /* Read in text. */ (void)printf("%lu", coff->a.tsize); - (void)lseek(fd, N_COFFTXTOFF(coff->f, coff->a), 0); + (void)lseek(fd, ECOFF_TXTOFF(coff), 0); if (read(fd, (void *)coff->a.text_start, coff->a.tsize) != coff->a.tsize) { (void)printf("read text: %d\n", errno); diff --git a/sys/arch/alpha/stand/boot/version b/sys/arch/alpha/stand/boot/version index a7634431ffb..40daa71ed5d 100644 --- a/sys/arch/alpha/stand/boot/version +++ b/sys/arch/alpha/stand/boot/version @@ -1,7 +1,8 @@ -$NetBSD: version,v 1.4 1995/11/23 02:40:09 cgd Exp $ +$NetBSD: version,v 1.5 1996/05/09 23:54:18 cgd Exp $ 1.1: Initial version 1.2: don't forget the Id string! 1.3: make it work on AlphaStations -1.4: Re-import from master sources. -1.5: Complete rewrite of boot block code. +1.4-1: Re-import from master sources +1.4-2: Complete rewrite of boot block code +1.5: Update for new ECOFF headers diff --git a/sys/arch/alpha/stand/bootxx.c b/sys/arch/alpha/stand/bootxx.c index 48c21f3c7fa..3707a45fa5a 100644 --- a/sys/arch/alpha/stand/bootxx.c +++ b/sys/arch/alpha/stand/bootxx.c @@ -1,3 +1,32 @@ +/* $NetBSD: bootxx.c,v 1.2 1996/04/12 06:09:36 cgd Exp $ */ + +/* + * Copyright (c) 1995 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ + #include <sys/param.h> #include <machine/prom.h> diff --git a/sys/arch/alpha/stand/headersize.c b/sys/arch/alpha/stand/headersize.c index f586ff2d734..23d64a5556d 100644 --- a/sys/arch/alpha/stand/headersize.c +++ b/sys/arch/alpha/stand/headersize.c @@ -1,7 +1,7 @@ -/* $NetBSD: headersize.c,v 1.1 1995/11/23 02:38:59 cgd Exp $ */ +/* $NetBSD: headersize.c,v 1.3.4.1 1996/06/13 18:35:33 cgd Exp $ */ /* - * Copyright (c) 1995 Carnegie-Mellon University. + * Copyright (c) 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -29,19 +29,20 @@ #include <sys/types.h> #include <sys/exec.h> -#include <machine/coff.h> +#include <sys/exec_ecoff.h> #define HDR_BUFSIZE 512 main() { char buf[HDR_BUFSIZE]; + struct ecoff_exechdr *execp; if (read(0, &buf, HDR_BUFSIZE) < HDR_BUFSIZE) { perror("read"); exit(1); } + execp = (struct ecoff_exechdr *)buf; - printf("%d\n", N_COFFTXTOFF(*((struct filehdr *)buf), - *((struct aouthdr *)(buf + sizeof(struct filehdr)))) ); + printf("%d\n", ECOFF_TXTOFF(execp)); } diff --git a/sys/arch/alpha/stand/prom_disp.S b/sys/arch/alpha/stand/prom_disp.S index aed575a0d98..cfb06148f0a 100644 --- a/sys/arch/alpha/stand/prom_disp.S +++ b/sys/arch/alpha/stand/prom_disp.S @@ -1,7 +1,7 @@ -/* $NetBSD: prom_disp.S,v 1.1 1995/11/23 02:39:10 cgd Exp $ */ +/* $NetBSD: prom_disp.S,v 1.3 1996/04/12 06:09:38 cgd Exp $ */ /* - * Copyright (c) 1994, 1995 Carnegie-Mellon University. + * Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -27,7 +27,7 @@ * rights to redistribute these changes. */ -#ifndef LOCORE +#ifndef _LOCORE #include "include/asm.h" #include "include/prom.h" #include "include/rpb.h" diff --git a/sys/arch/alpha/tc/cfb.c b/sys/arch/alpha/tc/cfb.c new file mode 100644 index 00000000000..1de6783756b --- /dev/null +++ b/sys/arch/alpha/tc/cfb.c @@ -0,0 +1,346 @@ +/* $NetBSD: cfb.c,v 1.1 1996/05/01 23:25:03 cgd Exp $ */ + +/* + * Copyright (c) 1995, 1996 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/kernel.h> +#include <sys/device.h> +#include <sys/malloc.h> +#include <sys/buf.h> +#include <sys/conf.h> +#include <sys/ioctl.h> + +#include <machine/bus.h> +#include <machine/intr.h> + +#include <dev/tc/tcvar.h> +#include <machine/cfbreg.h> +#include <alpha/tc/cfbvar.h> +#if 0 +#include <alpha/tc/bt459reg.h> +#endif + +#include <dev/rcons/raster.h> +#include <alpha/wscons/wscons_raster.h> +#include <alpha/wscons/wsconsvar.h> +#include <machine/fbio.h> + +#include <machine/autoconf.h> +#include <machine/pte.h> + +int cfbmatch __P((struct device *, void *, void *)); +void cfbattach __P((struct device *, struct device *, void *)); +int cfbprint __P((void *, char *)); + +struct cfattach cfb_ca = { + sizeof(struct cfb_softc), cfbmatch, cfbattach, +}; + +struct cfdriver cfb_cd = { + NULL, "cfb", DV_DULL, +}; + +void cfb_getdevconfig __P((tc_addr_t dense_addr, struct cfb_devconfig *dc)); +struct cfb_devconfig cfb_console_dc; + +struct wscons_emulfuncs cfb_emulfuncs = { + rcons_cursor, /* could use hardware cursor; punt */ + rcons_putstr, + rcons_copycols, + rcons_erasecols, + rcons_copyrows, + rcons_eraserows, +}; + +int cfbioctl __P((struct device *, u_long, caddr_t, int, struct proc *)); +int cfbmmap __P((struct device *, off_t, int)); + +int cfbintr __P((void *)); + +int +cfbmatch(parent, match, aux) + struct device *parent; + void *match, *aux; +{ + struct cfdata *cf = match; + struct tc_attach_args *ta = aux; + + if (strncmp("PMAG-BA ", ta->ta_modname, TC_ROM_LLEN) != 0) + return (0); + + return (10); +} + +void +cfb_getdevconfig(dense_addr, dc) + tc_addr_t dense_addr; + struct cfb_devconfig *dc; +{ + struct raster *rap; + struct rcons *rcp; + char *ramdacregp; + int i; + + dc->dc_vaddr = dense_addr; + dc->dc_paddr = k0segtophys(dc->dc_vaddr); /* XXX */ + dc->dc_size = CFB_SIZE; + + ramdacregp = (char *)dc->dc_vaddr + CFB_RAMDAC_OFFSET; + + dc->dc_wid = 1024; + dc->dc_ht = 864; + dc->dc_depth = 8; /* 8 plane */ + dc->dc_rowbytes = dc->dc_wid * (dc->dc_depth / 8); + + dc->dc_videobase = dc->dc_vaddr + CFB_FB_OFFSET; + + /* Initialize the RAMDAC/colormap */ + /* start XXX XXX XXX */ + (*(volatile u_int32_t *)(ramdacregp + CFB_RAMDAC_ADDRLOW)) = 0; + (*(volatile u_int32_t *)(ramdacregp + CFB_RAMDAC_ADDRHIGH)) = 0; + tc_wmb(); + for (i = 0; i < 256; i++) { + (*(volatile u_int32_t *)(ramdacregp + CFB_RAMDAC_CMAPDATA)) = + i ? 0xff : 0; + tc_wmb(); + (*(volatile u_int32_t *)(ramdacregp + CFB_RAMDAC_CMAPDATA)) = + i ? 0xff : 0; + tc_wmb(); + (*(volatile u_int32_t *)(ramdacregp + CFB_RAMDAC_CMAPDATA)) = + i ? 0xff : 0; + tc_wmb(); + } + /* end XXX XXX XXX */ + + /* clear the screen */ + for (i = 0; i < dc->dc_ht * dc->dc_rowbytes; i += sizeof(u_int32_t)) + *(u_int32_t *)(dc->dc_videobase + i) = 0x00000000; + + rap = &dc->dc_raster; + rap->width = dc->dc_wid; + rap->height = dc->dc_ht; + rap->depth = 8; + rap->linelongs = dc->dc_rowbytes / sizeof(u_int32_t); + rap->pixels = (u_int32_t *)dc->dc_videobase; + + /* initialize the raster console blitter */ + rcp = &dc->dc_rcons; + rcp->rc_sp = rap; + rcp->rc_crow = rcp->rc_ccol = -1; + rcp->rc_crowp = &rcp->rc_crow; + rcp->rc_ccolp = &rcp->rc_ccol; + rcons_init(rcp, 34, 80); +} + +void +cfbattach(parent, self, aux) + struct device *parent, *self; + void *aux; +{ + struct cfb_softc *sc = (struct cfb_softc *)self; + struct tc_attach_args *ta = aux; + struct wscons_attach_args waa; + struct wscons_odev_spec *wo; + int console; + char *x; + + console = 0; /* XXX */ + if (console) + sc->sc_dc = &cfb_console_dc; + else { + sc->sc_dc = (struct cfb_devconfig *) + malloc(sizeof(struct cfb_devconfig), M_DEVBUF, M_WAITOK); + cfb_getdevconfig(ta->ta_addr, sc->sc_dc); + } + if (sc->sc_dc->dc_vaddr == NULL) { + printf(": couldn't map memory space; punt!\n"); + return; + } + printf(": %d x %d, %dbpp\n", sc->sc_dc->dc_wid, sc->sc_dc->dc_ht, + sc->sc_dc->dc_depth); + + /* Establish an interrupt handler, and clear any pending interrupts */ + tc_intr_establish(parent, ta->ta_cookie, TC_IPL_TTY, cfbintr, sc); + *(volatile u_int32_t *)(sc->sc_dc->dc_vaddr + CFB_IREQCTRL_OFFSET) = 0; + + /* initialize the raster */ + waa.waa_isconsole = console; + wo = &waa.waa_odev_spec; + wo->wo_ef = &cfb_emulfuncs; + wo->wo_efa = &sc->sc_dc->dc_rcons; + wo->wo_nrows = sc->sc_dc->dc_rcons.rc_maxrow; + wo->wo_ncols = sc->sc_dc->dc_rcons.rc_maxcol; + wo->wo_crow = 0; + wo->wo_ccol = 0; + wo->wo_ioctl = cfbioctl; + wo->wo_mmap = cfbmmap; + + config_found(self, &waa, cfbprint); +} + +int +cfbprint(aux, pnp) + void *aux; + char *pnp; +{ + + if (pnp) + printf("wscons at %s", pnp); + return (UNCONF); +} + +int +cfbioctl(dev, cmd, data, flag, p) + struct device *dev; + u_long cmd; + caddr_t data; + int flag; + struct proc *p; +{ + struct cfb_softc *sc = (struct cfb_softc *)dev; + struct cfb_devconfig *dc = sc->sc_dc; + + switch (cmd) { + case FBIOGTYPE: +#define fbt ((struct fbtype *)data) + fbt->fb_type = FBTYPE_CFB; + fbt->fb_height = sc->sc_dc->dc_ht; + fbt->fb_width = sc->sc_dc->dc_wid; + fbt->fb_depth = sc->sc_dc->dc_depth; + fbt->fb_cmsize = 256; /* XXX ??? */ + fbt->fb_size = sc->sc_dc->dc_size; +#undef fbt + return (0); + +#if 0 + case FBIOPUTCMAP: + return (*tgar->tgar_set_cmap)(dc, (struct fbcmap *)data); + + case FBIOGETCMAP: + return (*tgar->tgar_get_cmap)(dc, (struct fbcmap *)data); +#endif + + case FBIOGATTR: + return (ENOTTY); /* XXX ? */ + +#if 0 + case FBIOSVIDEO: + if (*(int *)data == FBVIDEO_OFF) + cfb_blank(sc->sc_dc); + else + cfb_unblank(sc->sc_dc); + return (0); +#endif + + case FBIOGVIDEO: + *(int *)data = dc->dc_blanked ? FBVIDEO_OFF : FBVIDEO_ON; + return (0); + +#if 0 + case FBIOSCURSOR: + return (*tgar->tgar_set_cursor)(dc, (struct fbcursor *)data); + + case FBIOGCURSOR: + return (*tgar->tgar_get_cursor)(dc, (struct fbcursor *)data); + + case FBIOSCURPOS: + return (*tgar->tgar_set_curpos)(dc, (struct fbcurpos *)data); + + case FBIOGCURPOS: + return (*tgar->tgar_get_curpos)(dc, (struct fbcurpos *)data); + + case FBIOGCURMAX: + return (*tgar->tgar_get_curmax)(dc, (struct fbcurpos *)data); +#endif + } + return (-1); +} + +int +cfbmmap(dev, offset, prot) + struct device *dev; + off_t offset; + int prot; +{ + struct cfb_softc *sc = (struct cfb_softc *)dev; + + if (offset > CFB_SIZE) + return -1; + return alpha_btop(sc->sc_dc->dc_paddr + offset); +} + +int +cfbintr(v) + void *v; +{ + struct cfb_softc *sc = v; + + *(volatile u_int32_t *)(sc->sc_dc->dc_vaddr + CFB_IREQCTRL_OFFSET) = 0; + + return (1); +} + +#if 0 +void +tga_console(bc, pc, bus, device, function) + bus_chipset_tag_t bc; + pci_chipset_tag_t pc; + int bus, device, function; +{ + struct tga_devconfig *dcp = &tga_console_dc; + struct wscons_odev_spec wo; + + tga_getdevconfig(bc, pc, pci_make_tag(pc, bus, device, function), dcp); + + /* sanity checks */ + if (dcp->dc_vaddr == NULL) + panic("tga_console(%d, %d): couldn't map memory space", + device, function); + if (dcp->dc_tgaconf == NULL) + panic("tga_console(%d, %d): unknown board configuration", + device, function); + + /* + * Initialize the RAMDAC but DO NOT allocate any private storage. + * Initialization includes disabling cursor, setting a sane + * colormap, etc. It will be reinitialized in tgaattach(). + */ + (*dcp->dc_tgaconf->tgac_ramdac->tgar_init)(dcp, 0); + + wo.wo_ef = &tga_emulfuncs; + wo.wo_efa = &dcp->dc_rcons; + wo.wo_nrows = dcp->dc_rcons.rc_maxrow; + wo.wo_ncols = dcp->dc_rcons.rc_maxcol; + wo.wo_crow = 0; + wo.wo_ccol = 0; + /* ioctl and mmap are unused until real attachment. */ + + wscons_attach_console(&wo); +} +#endif diff --git a/sys/arch/alpha/tc/cfbvar.h b/sys/arch/alpha/tc/cfbvar.h new file mode 100644 index 00000000000..bd90951e812 --- /dev/null +++ b/sys/arch/alpha/tc/cfbvar.h @@ -0,0 +1,62 @@ +/* $NetBSD: cfbvar.h,v 1.1 1996/05/01 23:25:04 cgd Exp $ */ + +/* + * Copyright (c) 1995, 1996 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ + +#include <machine/cfbreg.h> +#include <dev/rcons/raster.h> +#include <alpha/wscons/wsconsvar.h> +#include <alpha/wscons/wscons_raster.h> + +struct cfb_devconfig; +struct fbcmap; +struct fbcursor; +struct fbcurpos; + +struct cfb_devconfig { + vm_offset_t dc_vaddr; /* memory space virtual base address */ + vm_offset_t dc_paddr; /* memory space physical base address */ + vm_offset_t dc_size; /* size of slot memory */ + + int dc_wid; /* width of frame buffer */ + int dc_ht; /* height of frame buffer */ + int dc_depth; /* depth, bits per pixel */ + int dc_rowbytes; /* bytes in a FB scan line */ + + vm_offset_t dc_videobase; /* base of flat frame buffer */ + + struct raster dc_raster; /* raster description */ + struct rcons dc_rcons; /* raster blitter control info */ + + int dc_blanked; /* currently has video disabled */ +}; + +struct cfb_softc { + struct device sc_dev; + + struct cfb_devconfig *sc_dc; /* device configuration */ +}; diff --git a/sys/arch/alpha/tc/esp.c b/sys/arch/alpha/tc/esp.c index a7ec01b33ae..d1b4a2d2605 100644 --- a/sys/arch/alpha/tc/esp.c +++ b/sys/arch/alpha/tc/esp.c @@ -1,4 +1,4 @@ -/* $NetBSD: esp.c,v 1.6 1995/12/20 00:40:21 cgd Exp $ */ +/* $NetBSD: esp.c,v 1.8.4.1 1996/06/05 00:39:03 cgd Exp $ */ /* * Copyright (c) 1994 Peter Galbavy @@ -93,9 +93,12 @@ int esp_debug = 0; /*ESP_SHOWPHASE|ESP_SHOWMISC|ESP_SHOWTRAC|ESP_SHOWCMDS;*/ /*static*/ void esp_abort __P((struct esp_softc *, struct ecb *)); /* Linkup to the rest of the kernel */ -struct cfdriver espcd = { - NULL, "esp", espmatch, espattach, - DV_DULL, sizeof(struct esp_softc) +struct cfattach esp_ca = { + sizeof(struct esp_softc), espmatch, espattach, +}; + +struct cfdriver esp_cd = { + NULL, "esp", DV_DULL, }; struct scsi_adapter esp_switch = { @@ -190,8 +193,8 @@ espattach(parent, self, aux) mapiodev(ca->ca_ra.ra_reg, 0, ca->ca_ra.ra_len, ca->ca_bustype); } #else - sc->sc_reg = (volatile u_int32_t *)tcdsdev->tcdsda_tc.tcda_addr; - sc->sc_cookie = tcdsdev->tcdsda_tc.tcda_cookie; + sc->sc_reg = (volatile u_int32_t *)tcdsdev->tcdsda_addr; + sc->sc_cookie = tcdsdev->tcdsda_cookie; sc->sc_dma = tcdsdev->tcdsda_sc; printf(": address %x", sc->sc_reg); @@ -213,7 +216,7 @@ espattach(parent, self, aux) sc->sc_freq = ((struct sbus_softc *) sc->sc_dev.dv_parent)->sc_clockfreq; #else - if (parent->dv_cfdata->cf_driver == &tcdscd) { + if (parent->dv_cfdata->cf_driver == &tcds_cd) { sc->sc_id = tcdsdev->tcdsda_id; sc->sc_freq = tcdsdev->tcdsda_freq; } else { @@ -367,8 +370,8 @@ espattach(parent, self, aux) sc->sc_ih.ih_fun = (void *) espintr; sc->sc_ih.ih_arg = sc; intr_establish(sc->sc_pri, &sc->sc_ih); -#endif evcnt_attach(&sc->sc_dev, "intr", &sc->sc_intrcnt); +#endif /* * fill in the prototype scsi_link. @@ -889,7 +892,7 @@ esp_done(ecb) if (xs->error == XS_SENSE) { printf("sense=%2x; ", xs->sense.error_code); if (xs->sense.error_code == 0x70) - printf("extcode: %x; ", xs->sense.extended_flags); + printf("extcode: %x; ", xs->sense.flags); } } if ((xs->resid || xs->error > XS_SENSE) && esp_debug & ESP_SHOWMISC) { diff --git a/sys/arch/alpha/tc/ioasic.c b/sys/arch/alpha/tc/ioasic.c index 209c0e68314..2e154efd1e3 100644 --- a/sys/arch/alpha/tc/ioasic.c +++ b/sys/arch/alpha/tc/ioasic.c @@ -1,7 +1,7 @@ -/* $NetBSD: ioasic.c,v 1.1 1995/12/20 00:43:20 cgd Exp $ */ +/* $NetBSD: ioasic.c,v 1.4.4.1 1996/06/05 00:39:05 cgd Exp $ */ /* - * Copyright (c) 1994, 1995 Carnegie-Mellon University. + * Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Keith Bostic, Chris G. Demetriou @@ -35,6 +35,9 @@ #include <machine/autoconf.h> #include <machine/pte.h> #include <machine/rpb.h> +#ifndef EVCNT_COUNTERS +#include <machine/intrcnt.h> +#endif #include <dev/tc/tcvar.h> #include <alpha/tc/ioasicreg.h> @@ -51,9 +54,14 @@ struct ioasic_softc { int ioasicmatch __P((struct device *, void *, void *)); void ioasicattach __P((struct device *, struct device *, void *)); int ioasicprint(void *, char *); -struct cfdriver ioasiccd = - { NULL, "ioasic", ioasicmatch, ioasicattach, DV_DULL, - sizeof(struct ioasic_softc) }; + +struct cfattach ioasic_ca = { + sizeof(struct ioasic_softc), ioasicmatch, ioasicattach, +}; + +struct cfdriver ioasic_cd = { + NULL, "ioasic", DV_DULL, +}; int ioasic_intr __P((void *)); int ioasic_intrnull __P((void *)); @@ -75,7 +83,8 @@ struct ioasic_dev { void *iad_cookie; u_int32_t iad_intrbits; } ioasic_devs[] = { - { "lance ", 0x000c0000, C(IOASIC_DEV_LANCE), IOASIC_INTR_LANCE, }, + /* XXX lance name */ + { "lance", 0x000c0000, C(IOASIC_DEV_LANCE), IOASIC_INTR_LANCE, }, { "z8530 ", 0x00100000, C(IOASIC_DEV_SCC0), IOASIC_INTR_SCC_0, }, { "z8530 ", 0x00180000, C(IOASIC_DEV_SCC1), IOASIC_INTR_SCC_1, }, { "TOY_RTC ", 0x00200000, C(IOASIC_DEV_BOGUS), 0, }, @@ -101,10 +110,10 @@ ioasicmatch(parent, cfdata, aux) void *cfdata; void *aux; { - struct tcdev_attach_args *tcdev = aux; + struct tc_attach_args *ta = aux; /* Make sure that we're looking for this type of device. */ - if (strncmp("FLAMG-IO", tcdev->tcda_modname, TC_ROM_LLEN)) + if (strncmp("FLAMG-IO", ta->ta_modname, TC_ROM_LLEN)) return (0); /* Check that it can actually exist. */ @@ -123,15 +132,15 @@ ioasicattach(parent, self, aux) void *aux; { struct ioasic_softc *sc = (struct ioasic_softc *)self; - struct tcdev_attach_args *tcdev = aux; + struct tc_attach_args *ta = aux; struct ioasicdev_attach_args ioasicdev; u_long i; ioasicfound = 1; - sc->sc_base = tcdev->tcda_addr; + sc->sc_base = ta->ta_addr; ioasic_base = sc->sc_base; /* XXX XXX XXX */ - sc->sc_cookie = tcdev->tcda_cookie; + sc->sc_cookie = ta->ta_cookie; #ifdef DEC_3000_300 if (cputype == ST_DEC_3000_300) { @@ -292,10 +301,18 @@ ioasic_intr(val) sir = *sirp; +#ifdef EVCNT_COUNTERS + /* No interrupt counting via evcnt counters */ + XXX BREAK HERE XXX +#else /* !EVCNT_COUNTERS */ +#define INCRINTRCNT(slot) intrcnt[INTRCNT_IOASIC + slot]++ +#endif /* EVCNT_COUNTERS */ + /* XXX DUPLICATION OF INTERRUPT BIT INFORMATION... */ #define CHECKINTR(slot, bits) \ if (sir & bits) { \ ifound = 1; \ + INCRINTRCNT(slot); \ (*ioasicintrs[slot].iai_func) \ (ioasicintrs[slot].iai_arg); \ } @@ -335,42 +352,3 @@ ioasic_lance_dma_setup(v) IOASIC_CSR_DMAEN_LANCE; tc_mb(); } - -#ifdef DEC_3000_300 -void -ioasic_intr_300_opt0_enable(enable) - int enable; -{ - - if (enable) - *(volatile u_int32_t *)IOASIC_REG_IMSK(ioasic_base) |= - IOASIC_INTR_300_OPT0; - else - *(volatile u_int32_t *)IOASIC_REG_IMSK(ioasic_base) &= - ~IOASIC_INTR_300_OPT0; -} - -void -ioasic_intr_300_opt1_enable(enable) - int enable; -{ - - if (enable) - *(volatile u_int32_t *)IOASIC_REG_IMSK(ioasic_base) |= - IOASIC_INTR_300_OPT1; - else - *(volatile u_int32_t *)IOASIC_REG_IMSK(ioasic_base) &= - ~IOASIC_INTR_300_OPT1; -} - -void -ioasic_300_opts_isintr(opt0, opt1) - int *opt0, *opt1; -{ - u_int32_t sir; - - sir = *(volatile u_int32_t *)IOASIC_REG_INTR(ioasic_base); - *opt0 = sir & IOASIC_INTR_300_OPT0; - *opt1 = sir & IOASIC_INTR_300_OPT1; -} -#endif diff --git a/sys/arch/alpha/tc/mcclock_ioasic.c b/sys/arch/alpha/tc/mcclock_ioasic.c new file mode 100644 index 00000000000..340a75f82c1 --- /dev/null +++ b/sys/arch/alpha/tc/mcclock_ioasic.c @@ -0,0 +1,112 @@ +/* $NetBSD: mcclock_ioasic.c,v 1.2 1996/04/17 22:22:58 cgd Exp $ */ + +/* + * Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ + +#include <sys/param.h> +#include <sys/kernel.h> +#include <sys/systm.h> +#include <sys/device.h> + +#include <alpha/alpha/clockvar.h> +#include <alpha/alpha/mcclockvar.h> +#include <dev/ic/mc146818reg.h> +#include <dev/tc/tcreg.h> +#include <dev/tc/tcvar.h> +#include <dev/tc/ioasicvar.h> /* XXX */ + +struct mcclock_ioasic_clockdatum { + u_char datum; + char pad[3]; +}; + +struct mcclock_ioasic_softc { + struct mcclock_softc sc_mcclock; + + struct mcclock_ioasic_clockdatum *sc_dp; +}; + +int mcclock_ioasic_match __P((struct device *, void *, void *)); +void mcclock_ioasic_attach __P((struct device *, struct device *, void *)); + +struct cfattach mcclock_ioasic_ca = { + sizeof (struct mcclock_ioasic_softc), mcclock_ioasic_match, + mcclock_ioasic_attach, +}; + +void mcclock_ioasic_write __P((struct mcclock_softc *, u_int, u_int)); +u_int mcclock_ioasic_read __P((struct mcclock_softc *, u_int)); + +const struct mcclock_busfns mcclock_ioasic_busfns = { + mcclock_ioasic_write, mcclock_ioasic_read, +}; + +int +mcclock_ioasic_match(parent, match, aux) + struct device *parent; + void *match, *aux; +{ + struct ioasicdev_attach_args *d = aux; + + if (strncmp("TOY_RTC ", d->iada_modname, TC_ROM_LLEN)) + return (0); + + return (1); +} + +void +mcclock_ioasic_attach(parent, self, aux) + struct device *parent, *self; + void *aux; +{ + struct ioasicdev_attach_args *ioasicdev = aux; + struct mcclock_ioasic_softc *sc = (struct mcclock_ioasic_softc *)self; + + sc->sc_dp = (struct mcclock_ioasic_clockdatum *)ioasicdev->iada_addr; + + mcclock_attach(&sc->sc_mcclock, &mcclock_ioasic_busfns); +} + +void +mcclock_ioasic_write(dev, reg, datum) + struct mcclock_softc *dev; + u_int reg, datum; +{ + struct mcclock_ioasic_softc *sc = (struct mcclock_ioasic_softc *)dev; + + sc->sc_dp[reg].datum = datum; +} + +u_int +mcclock_ioasic_read(dev, reg) + struct mcclock_softc *dev; + u_int reg; +{ + struct mcclock_ioasic_softc *sc = (struct mcclock_ioasic_softc *)dev; + + return (sc->sc_dp[reg].datum); +} diff --git a/sys/arch/alpha/tc/scc.c b/sys/arch/alpha/tc/scc.c index cb2f4718217..c8b30499bb0 100644 --- a/sys/arch/alpha/tc/scc.c +++ b/sys/arch/alpha/tc/scc.c @@ -1,7 +1,7 @@ -/* $NetBSD: scc.c,v 1.11 1995/12/20 00:43:24 cgd Exp $ */ +/* $NetBSD: scc.c,v 1.16.4.2 1996/06/03 19:44:41 cgd Exp $ */ /* - * Copyright (c) 1991,1990,1989,1994,1995 Carnegie Mellon University + * Copyright (c) 1991,1990,1989,1994,1995,1996 Carnegie Mellon University * All Rights Reserved. * * Permission to use, copy, modify and distribute this software and its @@ -63,7 +63,7 @@ * @(#)scc.c 8.2 (Berkeley) 11/30/93 */ -#include <scc.h> +#include "scc.h" #if NSCC > 0 /* * Intel 82530 dual usart chip driver. Supports the serial port(s) on the @@ -175,8 +175,14 @@ struct speedtab sccspeedtab[] = { /* Definition of the driver for autoconfig. */ static int sccmatch(struct device *, void *, void *); static void sccattach(struct device *, struct device *, void *); -struct cfdriver scccd = - { NULL, "scc", sccmatch, sccattach, DV_TTY, sizeof (struct scc_softc) }; + +struct cfattach scc_ca = { + sizeof (struct scc_softc), sccmatch, sccattach, +}; + +struct cfdriver scc_cd = { + NULL, "scc", DV_TTY, +}; int sccGetc __P((dev_t)); void sccPutc __P((dev_t, int)); @@ -299,6 +305,8 @@ sccattach(parent, self, aux) for (cntr = 0; cntr < 2; cntr++) { pdp->p_addr = (void *)sccaddr; tp = scc_tty[sc->sc_dv.dv_unit * 2 + cntr] = ttymalloc(); + if (cntr == 0) + tty_attach(tp); pdp->p_arg = (long)tp; pdp->p_fcn = (void (*)())0; tp->t_dev = (dev_t)((sc->sc_dv.dv_unit << 1) | cntr); @@ -349,7 +357,7 @@ sccattach(parent, self, aux) s = spltty(); ctty.t_dev = makedev(SCCDEV, sc->sc_dv.dv_unit == 0 ? SCCCOMM2_PORT : SCCCOMM3_PORT); - cterm.c_cflag = CS8; + cterm.c_cflag = (TTYDEF_CFLAG & ~(CSIZE | PARENB)) | CS8; cterm.c_ospeed = cterm.c_ispeed = 9600; (void) sccparam(&ctty, &cterm); DELAY(1000); @@ -457,9 +465,9 @@ sccopen(dev, flag, mode, p) int s, error = 0; unit = SCCUNIT(dev); - if (unit >= scccd.cd_ndevs) + if (unit >= scc_cd.cd_ndevs) return (ENXIO); - sc = scccd.cd_devs[unit]; + sc = scc_cd.cd_devs[unit]; if (!sc) return (ENXIO); @@ -467,8 +475,10 @@ sccopen(dev, flag, mode, p) if (sc->scc_pdma[line].p_addr == NULL) return (ENXIO); tp = scc_tty[minor(dev)]; - if (tp == NULL) + if (tp == NULL) { tp = scc_tty[minor(dev)] = ttymalloc(); + tty_attach(tp); + } tp->t_oproc = sccstart; tp->t_param = sccparam; tp->t_dev = dev; @@ -514,7 +524,7 @@ sccclose(dev, flag, mode, p) int flag, mode; struct proc *p; { - register struct scc_softc *sc = scccd.cd_devs[SCCUNIT(dev)]; + register struct scc_softc *sc = scc_cd.cd_devs[SCCUNIT(dev)]; register struct tty *tp; register int line; @@ -586,7 +596,7 @@ sccioctl(dev, cmd, data, flag, p) return (error); line = SCCLINE(dev); - sc = scccd.cd_devs[SCCUNIT(dev)]; + sc = scc_cd.cd_devs[SCCUNIT(dev)]; switch (cmd) { case TIOCSBRK: @@ -671,7 +681,7 @@ sccparam(tp, t) return (0); } - sc = scccd.cd_devs[SCCUNIT(tp->t_dev)]; + sc = scc_cd.cd_devs[SCCUNIT(tp->t_dev)]; line = SCCLINE(tp->t_dev); regs = (scc_regmap_t *)sc->scc_pdma[line].p_addr; @@ -786,7 +796,7 @@ sccintr(xxxunit) register int cc, chan, rr1, rr2, rr3; int overrun = 0; - sc = scccd.cd_devs[unit]; + sc = scc_cd.cd_devs[unit]; regs = (scc_regmap_t *)sc->scc_pdma[0].p_addr; unit <<= 1; for (;;) { @@ -948,7 +958,7 @@ sccstart(tp) u_char temp; int s, sendone; - sc = scccd.cd_devs[SCCUNIT(tp->t_dev)]; + sc = scc_cd.cd_devs[SCCUNIT(tp->t_dev)]; dp = &sc->scc_pdma[SCCLINE(tp->t_dev)]; regs = (scc_regmap_t *)dp->p_addr; s = spltty(); @@ -982,6 +992,7 @@ sccstart(tp) } goto out; } +#if 0 if (tp->t_flags & (RAW|LITOUT)) cc = ndqb(&tp->t_outq, 0); else { @@ -993,6 +1004,9 @@ sccstart(tp) goto out; } } +#else + cc = ndqb(&tp->t_outq, 0); +#endif tp->t_state |= TS_BUSY; dp->p_end = dp->p_mem = tp->t_outq.c_cf; dp->p_end += cc; @@ -1034,7 +1048,7 @@ sccstop(tp, flag) register struct scc_softc *sc; register int s; - sc = scccd.cd_devs[SCCUNIT(tp->t_dev)]; + sc = scc_cd.cd_devs[SCCUNIT(tp->t_dev)]; dp = &sc->scc_pdma[SCCLINE(tp->t_dev)]; s = spltty(); if (tp->t_state & TS_BUSY) { @@ -1058,7 +1072,7 @@ sccmctl(dev, bits, how) register u_char value; int s; - sc = scccd.cd_devs[SCCUNIT(dev)]; + sc = scc_cd.cd_devs[SCCUNIT(dev)]; line = SCCLINE(dev); regs = (scc_regmap_t *)sc->scc_pdma[line].p_addr; s = spltty(); @@ -1122,7 +1136,7 @@ scc_modem_intr(dev) register u_char value; int s; - sc = scccd.cd_devs[SCCUNIT(dev)]; + sc = scc_cd.cd_devs[SCCUNIT(dev)]; tp = scc_tty[minor(dev)]; chan = SCCLINE(dev); regs = (scc_regmap_t *)sc->scc_pdma[chan].p_addr; @@ -1160,7 +1174,7 @@ sccGetc(dev) int s; line = SCCLINE(dev); - sc = scccd.cd_devs[SCCUNIT(dev)]; + sc = scc_cd.cd_devs[SCCUNIT(dev)]; regs = (scc_regmap_t *)sc->scc_pdma[line].p_addr; if (!regs) return (0); @@ -1202,7 +1216,7 @@ sccPutc(dev, c) s = splhigh(); line = SCCLINE(dev); - sc = scccd.cd_devs[SCCUNIT(dev)]; + sc = scc_cd.cd_devs[SCCUNIT(dev)]; regs = (scc_regmap_t *)sc->scc_pdma[line].p_addr; /* diff --git a/sys/arch/alpha/tc/sfb.c b/sys/arch/alpha/tc/sfb.c new file mode 100644 index 00000000000..acf0d68da63 --- /dev/null +++ b/sys/arch/alpha/tc/sfb.c @@ -0,0 +1,411 @@ +/* $NetBSD: sfb.c,v 1.1 1996/05/01 21:15:50 cgd Exp $ */ + +/* + * Copyright (c) 1995, 1996 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/kernel.h> +#include <sys/device.h> +#include <sys/malloc.h> +#include <sys/buf.h> +#include <sys/conf.h> +#include <sys/ioctl.h> + +#include <machine/bus.h> +#include <machine/intr.h> + +#include <dev/tc/tcvar.h> +#include <machine/sfbreg.h> +#include <alpha/tc/sfbvar.h> +#if 0 +#include <alpha/tc/bt459reg.h> +#endif + +#include <dev/rcons/raster.h> +#include <alpha/wscons/wscons_raster.h> +#include <alpha/wscons/wsconsvar.h> +#include <machine/fbio.h> + +#include <machine/autoconf.h> +#include <machine/pte.h> + +int sfbmatch __P((struct device *, void *, void *)); +void sfbattach __P((struct device *, struct device *, void *)); +int sfbprint __P((void *, char *)); + +struct cfattach sfb_ca = { + sizeof(struct sfb_softc), sfbmatch, sfbattach, +}; + +struct cfdriver sfb_cd = { + NULL, "sfb", DV_DULL, +}; + +void sfb_getdevconfig __P((tc_addr_t dense_addr, struct sfb_devconfig *dc)); +struct sfb_devconfig sfb_console_dc; + +struct wscons_emulfuncs sfb_emulfuncs = { + rcons_cursor, /* could use hardware cursor; punt */ + rcons_putstr, + rcons_copycols, + rcons_erasecols, + rcons_copyrows, + rcons_eraserows, +}; + +int sfbioctl __P((struct device *, u_long, caddr_t, int, struct proc *)); +int sfbmmap __P((struct device *, off_t, int)); + +#if 0 +void sfb_blank __P((struct sfb_devconfig *)); +void sfb_unblank __P((struct sfb_devconfig *)); +#endif + +int +sfbmatch(parent, match, aux) + struct device *parent; + void *match, *aux; +{ + struct cfdata *cf = match; + struct tc_attach_args *ta = aux; + + if (strncmp("PMAGB-BA", ta->ta_modname, TC_ROM_LLEN) != 0) + return (0); + + return (10); +} + +void +sfb_getdevconfig(dense_addr, dc) + tc_addr_t dense_addr; + struct sfb_devconfig *dc; +{ + struct raster *rap; + struct rcons *rcp; + char *regp, *ramdacregp; + int i; + + dc->dc_vaddr = dense_addr; + dc->dc_paddr = k0segtophys(dc->dc_vaddr); /* XXX */ + dc->dc_size = SFB_SIZE; + + regp = (char *)dc->dc_vaddr + SFB_ASIC_OFFSET; + ramdacregp = (char *)dc->dc_vaddr + SFB_RAMDAC_OFFSET; + + dc->dc_wid = + (*(volatile u_int32_t *)(regp + SFB_ASIC_VIDEO_HSETUP) & 0x1ff) * 4; + dc->dc_ht = + (*(volatile u_int32_t *)(regp + SFB_ASIC_VIDEO_VSETUP) & 0x7ff); + + switch (*(volatile u_int32_t *)(regp + SFB_ASIC_DEEP)) { + case 0: + case 1: /* XXX by the book; wrong? */ + dc->dc_depth = 8; /* 8 plane */ + break; + case 2: + dc->dc_depth = 16; /* 16 plane */ + break; + case 4: + dc->dc_depth = 32; /* 32 plane */ + break; + default: + dc->dc_depth = 8; /* XXX can't happen? */ + break; + } + + dc->dc_rowbytes = dc->dc_wid * (dc->dc_depth / 8); + + dc->dc_videobase = dc->dc_vaddr + SFB_FB_OFFSET + + ((*(volatile u_int32_t *)(regp + SFB_ASIC_VIDEO_BASE)) * + 4096 * (dc->dc_depth / 8)); + + (*(volatile u_int32_t *)(regp + SFB_ASIC_MODE)) = 0; + tc_wmb(); + (*(volatile u_int32_t *)(regp + SFB_ASIC_VIDEO_VALID)) = 1; + tc_wmb(); + + /* + * Set all bits in the pixel mask, to enable writes to all pixels. + * It seems that the console firmware clears some of them + * under some circumstances, which causes cute vertical stripes. + */ + (*(volatile u_int32_t *)(regp + SFB_ASIC_PIXELMASK)) = 0xffffffff; + tc_wmb(); + (*(volatile u_int32_t *)(regp + SFB_ASIC_PLANEMASK)) = 0xffffffff; + tc_wmb(); + + /* Initialize the RAMDAC/colormap */ + /* start XXX XXX XXX */ + (*(volatile u_int32_t *)(ramdacregp + SFB_RAMDAC_ADDRLOW)) = 0; + (*(volatile u_int32_t *)(ramdacregp + SFB_RAMDAC_ADDRHIGH)) = 0; + tc_wmb(); + for (i = 0; i < 256; i++) { + (*(volatile u_int32_t *)(ramdacregp + SFB_RAMDAC_CMAPDATA)) = + i ? 0xff : 0; + tc_wmb(); + (*(volatile u_int32_t *)(ramdacregp + SFB_RAMDAC_CMAPDATA)) = + i ? 0xff : 0; + tc_wmb(); + (*(volatile u_int32_t *)(ramdacregp + SFB_RAMDAC_CMAPDATA)) = + i ? 0xff : 0; + tc_wmb(); + } + /* end XXX XXX XXX */ + + /* clear the screen */ + for (i = 0; i < dc->dc_ht * dc->dc_rowbytes; i += sizeof(u_int32_t)) + *(u_int32_t *)(dc->dc_videobase + i) = 0x00000000; + + /* initialize the raster */ + rap = &dc->dc_raster; + rap->width = dc->dc_wid; + rap->height = dc->dc_ht; + rap->depth = 8; + rap->linelongs = dc->dc_rowbytes / sizeof(u_int32_t); + rap->pixels = (u_int32_t *)dc->dc_videobase; + + /* initialize the raster console blitter */ + rcp = &dc->dc_rcons; + rcp->rc_sp = rap; + rcp->rc_crow = rcp->rc_ccol = -1; + rcp->rc_crowp = &rcp->rc_crow; + rcp->rc_ccolp = &rcp->rc_ccol; + rcons_init(rcp, 34, 80); +} + +void +sfbattach(parent, self, aux) + struct device *parent, *self; + void *aux; +{ + struct sfb_softc *sc = (struct sfb_softc *)self; + struct tc_attach_args *ta = aux; + struct wscons_attach_args waa; + struct wscons_odev_spec *wo; + int console; + char *x; + + console = 0; /* XXX */ + if (console) + sc->sc_dc = &sfb_console_dc; + else { + sc->sc_dc = (struct sfb_devconfig *) + malloc(sizeof(struct sfb_devconfig), M_DEVBUF, M_WAITOK); + sfb_getdevconfig(ta->ta_addr, sc->sc_dc); + } + if (sc->sc_dc->dc_vaddr == NULL) { + printf(": couldn't map memory space; punt!\n"); + return; + } + printf(": %d x %d, %dbpp\n", sc->sc_dc->dc_wid, sc->sc_dc->dc_ht, + sc->sc_dc->dc_depth); + +#if 0 + x = (char *)ta->ta_addr + SFB_ASIC_OFFSET; + printf("%s: Video Base Address = 0x%x\n", self->dv_xname, + *(u_int32_t *)(x + SFB_ASIC_VIDEO_BASE)); + printf("%s: Horizontal Setup = 0x%x\n", self->dv_xname, + *(u_int32_t *)(x + SFB_ASIC_VIDEO_HSETUP)); + printf("%s: Vertical Setup = 0x%x\n", self->dv_xname, + *(u_int32_t *)(x + SFB_ASIC_VIDEO_VSETUP)); +#endif + + waa.waa_isconsole = console; + wo = &waa.waa_odev_spec; + wo->wo_ef = &sfb_emulfuncs; + wo->wo_efa = &sc->sc_dc->dc_rcons; + wo->wo_nrows = sc->sc_dc->dc_rcons.rc_maxrow; + wo->wo_ncols = sc->sc_dc->dc_rcons.rc_maxcol; + wo->wo_crow = 0; + wo->wo_ccol = 0; + wo->wo_ioctl = sfbioctl; + wo->wo_mmap = sfbmmap; + + config_found(self, &waa, sfbprint); +} + +int +sfbprint(aux, pnp) + void *aux; + char *pnp; +{ + + if (pnp) + printf("wscons at %s", pnp); + return (UNCONF); +} + +int +sfbioctl(dev, cmd, data, flag, p) + struct device *dev; + u_long cmd; + caddr_t data; + int flag; + struct proc *p; +{ + struct sfb_softc *sc = (struct sfb_softc *)dev; + struct sfb_devconfig *dc = sc->sc_dc; + + switch (cmd) { + case FBIOGTYPE: +#define fbt ((struct fbtype *)data) + fbt->fb_type = FBTYPE_SFB; + fbt->fb_height = sc->sc_dc->dc_ht; + fbt->fb_width = sc->sc_dc->dc_wid; + fbt->fb_depth = sc->sc_dc->dc_depth; + fbt->fb_cmsize = 256; /* XXX ??? */ + fbt->fb_size = sc->sc_dc->dc_size; +#undef fbt + return (0); + +#if 0 + case FBIOPUTCMAP: + return (*tgar->tgar_set_cmap)(dc, (struct fbcmap *)data); + + case FBIOGETCMAP: + return (*tgar->tgar_get_cmap)(dc, (struct fbcmap *)data); +#endif + + case FBIOGATTR: + return (ENOTTY); /* XXX ? */ + +#if 0 + case FBIOSVIDEO: + if (*(int *)data == FBVIDEO_OFF) + sfb_blank(sc->sc_dc); + else + sfb_unblank(sc->sc_dc); + return (0); +#endif + + case FBIOGVIDEO: + *(int *)data = dc->dc_blanked ? FBVIDEO_OFF : FBVIDEO_ON; + return (0); + +#if 0 + case FBIOSCURSOR: + return (*tgar->tgar_set_cursor)(dc, (struct fbcursor *)data); + + case FBIOGCURSOR: + return (*tgar->tgar_get_cursor)(dc, (struct fbcursor *)data); + + case FBIOSCURPOS: + return (*tgar->tgar_set_curpos)(dc, (struct fbcurpos *)data); + + case FBIOGCURPOS: + return (*tgar->tgar_get_curpos)(dc, (struct fbcurpos *)data); + + case FBIOGCURMAX: + return (*tgar->tgar_get_curmax)(dc, (struct fbcurpos *)data); +#endif + } + return (-1); +} + +int +sfbmmap(dev, offset, prot) + struct device *dev; + off_t offset; + int prot; +{ + struct sfb_softc *sc = (struct sfb_softc *)dev; + + if (offset > SFB_SIZE) + return -1; + return alpha_btop(sc->sc_dc->dc_paddr + offset); +} + +#if 0 +void +tga_console(bc, pc, bus, device, function) + bus_chipset_tag_t bc; + pci_chipset_tag_t pc; + int bus, device, function; +{ + struct tga_devconfig *dcp = &tga_console_dc; + struct wscons_odev_spec wo; + + tga_getdevconfig(bc, pc, pci_make_tag(pc, bus, device, function), dcp); + + /* sanity checks */ + if (dcp->dc_vaddr == NULL) + panic("tga_console(%d, %d): couldn't map memory space", + device, function); + if (dcp->dc_tgaconf == NULL) + panic("tga_console(%d, %d): unknown board configuration", + device, function); + + /* + * Initialize the RAMDAC but DO NOT allocate any private storage. + * Initialization includes disabling cursor, setting a sane + * colormap, etc. It will be reinitialized in tgaattach(). + */ + (*dcp->dc_tgaconf->tgac_ramdac->tgar_init)(dcp, 0); + + wo.wo_ef = &tga_emulfuncs; + wo.wo_efa = &dcp->dc_rcons; + wo.wo_nrows = dcp->dc_rcons.rc_maxrow; + wo.wo_ncols = dcp->dc_rcons.rc_maxcol; + wo.wo_crow = 0; + wo.wo_ccol = 0; + /* ioctl and mmap are unused until real attachment. */ + + wscons_attach_console(&wo); +} +#endif + +#if 0 +/* + * Functions to blank and unblank the display. + */ +void +sfb_blank(dc) + struct sfb_devconfig *dc; +{ + char *regp = (char *)dc->dc_vaddr + SFB_ASIC_OFFSET; + + if (!dc->dc_blanked) { + dc->dc_blanked = 1; + *(volatile u_int32_t *)(regp + SFB_ASIC_VIDEO_VALID) = 0; + tc_wmb(); + } +} + +void +sfb_unblank(dc) + struct sfb_devconfig *dc; +{ + char *regp = (char *)dc->dc_vaddr + SFB_ASIC_OFFSET; + + if (dc->dc_blanked) { + dc->dc_blanked = 0; + *(volatile u_int32_t *)(regp + SFB_ASIC_VIDEO_VALID) = 1; + tc_wmb(); + } +} +#endif diff --git a/sys/arch/alpha/tc/sfbvar.h b/sys/arch/alpha/tc/sfbvar.h new file mode 100644 index 00000000000..afcd451f0f0 --- /dev/null +++ b/sys/arch/alpha/tc/sfbvar.h @@ -0,0 +1,62 @@ +/* $NetBSD: sfbvar.h,v 1.1 1996/05/01 21:15:51 cgd Exp $ */ + +/* + * Copyright (c) 1995, 1996 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ + +#include <machine/sfbreg.h> +#include <dev/rcons/raster.h> +#include <alpha/wscons/wsconsvar.h> +#include <alpha/wscons/wscons_raster.h> + +struct sfb_devconfig; +struct fbcmap; +struct fbcursor; +struct fbcurpos; + +struct sfb_devconfig { + vm_offset_t dc_vaddr; /* memory space virtual base address */ + vm_offset_t dc_paddr; /* memory space physical base address */ + vm_offset_t dc_size; /* size of slot memory */ + + int dc_wid; /* width of frame buffer */ + int dc_ht; /* height of frame buffer */ + int dc_depth; /* depth, bits per pixel */ + int dc_rowbytes; /* bytes in a FB scan line */ + + vm_offset_t dc_videobase; /* base of flat frame buffer */ + + struct raster dc_raster; /* raster description */ + struct rcons dc_rcons; /* raster blitter control info */ + + int dc_blanked; /* currently has video disabled */ +}; + +struct sfb_softc { + struct device sc_dev; + + struct sfb_devconfig *sc_dc; /* device configuration */ +}; diff --git a/sys/arch/alpha/tc/tc_3000_300.c b/sys/arch/alpha/tc/tc_3000_300.c index 571afab6148..0321893acdb 100644 --- a/sys/arch/alpha/tc/tc_3000_300.c +++ b/sys/arch/alpha/tc/tc_3000_300.c @@ -1,7 +1,7 @@ -/* $NetBSD: tc_3000_300.c,v 1.4 1995/12/20 00:43:27 cgd Exp $ */ +/* $NetBSD: tc_3000_300.c,v 1.7.4.1 1996/06/05 00:39:06 cgd Exp $ */ /* - * Copyright (c) 1994, 1995 Carnegie-Mellon University. + * Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -32,10 +32,14 @@ #include <machine/autoconf.h> #include <machine/pte.h> +#ifndef EVCNT_COUNTERS +#include <machine/intrcnt.h> +#endif #include <dev/tc/tcvar.h> #include <alpha/tc/tc_conf.h> #include <alpha/tc/tc_3000_300.h> +#include <alpha/tc/ioasicreg.h> void tc_3000_300_intr_setup __P((void)); void tc_3000_300_intr_establish __P((struct device *, void *, @@ -48,6 +52,14 @@ int tc_3000_300_intrnull __P((void *)); #define C(x) ((void *)(u_long)x) #define KV(x) (phystok0seg(x)) +/* + * We have to read and modify the IOASIC registers directly, because + * the TC option slot interrupt request and mask bits are stored there, + * and the ioasic code isn't initted when we need to frob some interrupt + * bits. + */ +#define DEC_3000_300_IOASIC_ADDR KV(0x1a0000000) + struct tc_slotdesc tc_3000_300_slots[] = { { KV(0x100000000), C(TC_3000_300_DEV_OPT0), }, /* 0 - opt slot 0 */ { KV(0x120000000), C(TC_3000_300_DEV_OPT1), }, /* 1 - opt slot 1 */ @@ -71,21 +83,17 @@ struct tcintr { void *tci_arg; } tc_3000_300_intr[TC_3000_300_NCOOKIES]; -/* XXX */ -void ioasic_intr_300_opt0_enable __P((int)); -void ioasic_intr_300_opt1_enable __P((int)); -void ioasic_300_opts_isintr __P((int *, int *)); - void tc_3000_300_intr_setup() { + volatile u_int32_t *imskp; u_long i; /* - * Sisable all interrupts that we can (can't disable builtins). + * Disable all interrupts that we can (can't disable builtins). */ - ioasic_intr_300_opt0_enable(0); - ioasic_intr_300_opt1_enable(0); + imskp = (volatile u_int32_t *)IOASIC_REG_IMSK(DEC_3000_300_IOASIC_ADDR); + *imskp &= ~(IOASIC_INTR_300_OPT0 | IOASIC_INTR_300_OPT1); /* * Set up interrupt handlers. @@ -103,6 +111,7 @@ tc_3000_300_intr_establish(tcadev, cookie, level, func, arg) tc_intrlevel_t level; int (*func) __P((void *)); { + volatile u_int32_t *imskp; u_long dev = (u_long)cookie; #ifdef DIAGNOSTIC @@ -115,12 +124,13 @@ tc_3000_300_intr_establish(tcadev, cookie, level, func, arg) tc_3000_300_intr[dev].tci_func = func; tc_3000_300_intr[dev].tci_arg = arg; + imskp = (volatile u_int32_t *)IOASIC_REG_IMSK(DEC_3000_300_IOASIC_ADDR); switch (dev) { case TC_3000_300_DEV_OPT0: - ioasic_intr_300_opt0_enable(1); + *imskp |= IOASIC_INTR_300_OPT0; break; case TC_3000_300_DEV_OPT1: - ioasic_intr_300_opt1_enable(1); + *imskp |= IOASIC_INTR_300_OPT1; break; default: /* interrupts for builtins always enabled */ @@ -133,6 +143,7 @@ tc_3000_300_intr_disestablish(tcadev, cookie) struct device *tcadev; void *cookie; { + volatile u_int32_t *imskp; u_long dev = (u_long)cookie; #ifdef DIAGNOSTIC @@ -143,12 +154,13 @@ tc_3000_300_intr_disestablish(tcadev, cookie) panic("tc_3000_300_intr_disestablish: cookie %d bad intr", dev); + imskp = (volatile u_int32_t *)IOASIC_REG_IMSK(DEC_3000_300_IOASIC_ADDR); switch (dev) { case TC_3000_300_DEV_OPT0: - ioasic_intr_300_opt0_enable(0); + *imskp &= ~IOASIC_INTR_300_OPT0; break; case TC_3000_300_DEV_OPT1: - ioasic_intr_300_opt1_enable(0); + *imskp &= ~IOASIC_INTR_300_OPT1; break; default: /* interrupts for builtins always enabled */ @@ -173,7 +185,7 @@ tc_3000_300_iointr(framep, vec) void *framep; int vec; { - u_int32_t ir; + u_int32_t tcir, ioasicir, ioasicimr; int opt0intr, opt1intr, ifound; #ifdef DIAGNOSTIC @@ -190,33 +202,53 @@ tc_3000_300_iointr(framep, vec) tc_syncbus(); /* find out what interrupts/errors occurred */ - ir = *(volatile u_int32_t *)TC_3000_300_IR; - ioasic_300_opts_isintr(&opt0intr, &opt1intr); + tcir = *(volatile u_int32_t *)TC_3000_300_IR; + ioasicir = *(volatile u_int32_t *) + IOASIC_REG_INTR(DEC_3000_300_IOASIC_ADDR); + ioasicimr = *(volatile u_int32_t *) + IOASIC_REG_IMSK(DEC_3000_300_IOASIC_ADDR); tc_mb(); + /* Ignore interrupts that aren't enabled out. */ + ioasicir &= ioasicimr; + /* clear the interrupts/errors we found. */ - *(volatile u_int32_t *)TC_3000_300_IR = ir; + *(volatile u_int32_t *)TC_3000_300_IR = tcir; /* XXX can't clear TC option slot interrupts here? */ tc_wmb(); ifound = 0; + +#ifdef EVCNT_COUNTERS + /* No interrupt counting via evcnt counters */ + XXX BREAK HERE XXX +#else /* !EVCNT_COUNTERS */ +#define INCRINTRCNT(slot) intrcnt[INTRCNT_KN16 + slot]++ +#endif /* EVCNT_COUNTERS */ + #define CHECKINTR(slot, flag) \ - if (flag) { \ + if (flag) { \ ifound = 1; \ + INCRINTRCNT(slot); \ (*tc_3000_300_intr[slot].tci_func) \ (tc_3000_300_intr[slot].tci_arg); \ } /* Do them in order of priority; highest slot # first. */ - CHECKINTR(TC_3000_300_DEV_CXTURBO, ir & TC_3000_300_IR_CXTURBO); - CHECKINTR(TC_3000_300_DEV_IOASIC, ir & TC_3000_300_IR_IOASIC); - CHECKINTR(TC_3000_300_DEV_TCDS, ir & TC_3000_300_IR_TCDS); - CHECKINTR(TC_3000_300_DEV_OPT1, opt1intr); - CHECKINTR(TC_3000_300_DEV_OPT0, opt0intr); + CHECKINTR(TC_3000_300_DEV_CXTURBO, + tcir & TC_3000_300_IR_CXTURBO); + CHECKINTR(TC_3000_300_DEV_IOASIC, + (tcir & TC_3000_300_IR_IOASIC) && + (ioasicir & ~(IOASIC_INTR_300_OPT1|IOASIC_INTR_300_OPT0))); + CHECKINTR(TC_3000_300_DEV_TCDS, tcir & TC_3000_300_IR_TCDS); + CHECKINTR(TC_3000_300_DEV_OPT1, + ioasicir & IOASIC_INTR_300_OPT1); + CHECKINTR(TC_3000_300_DEV_OPT0, + ioasicir & IOASIC_INTR_300_OPT0); #undef CHECKINTR #ifdef DIAGNOSTIC #define PRINTINTR(msg, bits) \ - if (ir & bits) \ + if (tcir & bits) \ printf(msg); PRINTINTR("BCache tag parity error\n", TC_3000_300_IR_BCTAGPARITY); diff --git a/sys/arch/alpha/tc/tc_3000_500.c b/sys/arch/alpha/tc/tc_3000_500.c index 1ac7250e57c..336ce43e8ad 100644 --- a/sys/arch/alpha/tc/tc_3000_500.c +++ b/sys/arch/alpha/tc/tc_3000_500.c @@ -1,7 +1,7 @@ -/* $NetBSD: tc_3000_500.c,v 1.3 1995/12/20 00:43:30 cgd Exp $ */ +/* $NetBSD: tc_3000_500.c,v 1.4.4.3 1996/06/13 18:35:35 cgd Exp $ */ /* - * Copyright (c) 1994, 1995 Carnegie-Mellon University. + * Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -32,6 +32,9 @@ #include <machine/autoconf.h> #include <machine/pte.h> +#ifndef EVCNT_COUNTERS +#include <machine/intrcnt.h> +#endif #include <dev/tc/tcvar.h> #include <alpha/tc/tc_conf.h> @@ -86,19 +89,21 @@ struct tcintr { void *tci_arg; } tc_3000_500_intr[TC_3000_500_NCOOKIES]; +u_int32_t tc_3000_500_imask; /* intrs we want to ignore; mirrors IMR. */ + void tc_3000_500_intr_setup() { u_long i; - u_int32_t imr; /* - * Disable all slot interrupts. + * Disable all slot interrupts. Note that this cannot + * actually disable CXTurbo, TCDS, and IOASIC interrupts. */ - imr = *(volatile u_int32_t *)TC_3000_500_IMR_READ; + tc_3000_500_imask = *(volatile u_int32_t *)TC_3000_500_IMR_READ; for (i = 0; i < TC_3000_500_NCOOKIES; i++) - imr |= tc_3000_500_intrbits[i]; - *(volatile u_int32_t *)TC_3000_500_IMR_WRITE = imr; + tc_3000_500_imask |= tc_3000_500_intrbits[i]; + *(volatile u_int32_t *)TC_3000_500_IMR_WRITE = tc_3000_500_imask; tc_mb(); /* @@ -118,7 +123,6 @@ tc_3000_500_intr_establish(tcadev, cookie, level, func, arg) int (*func) __P((void *)); { u_long dev = (u_long)cookie; - u_int32_t imr; #ifdef DIAGNOSTIC /* XXX bounds-check cookie. */ @@ -130,9 +134,8 @@ tc_3000_500_intr_establish(tcadev, cookie, level, func, arg) tc_3000_500_intr[dev].tci_func = func; tc_3000_500_intr[dev].tci_arg = arg; - imr = *(volatile u_int32_t *)TC_3000_500_IMR_READ; - imr &= ~tc_3000_500_intrbits[dev]; - *(volatile u_int32_t *)TC_3000_500_IMR_WRITE = imr; + tc_3000_500_imask &= ~tc_3000_500_intrbits[dev]; + *(volatile u_int32_t *)TC_3000_500_IMR_WRITE = tc_3000_500_imask; tc_mb(); } @@ -142,7 +145,6 @@ tc_3000_500_intr_disestablish(tcadev, cookie) void *cookie; { u_long dev = (u_long)cookie; - u_int32_t imr; #ifdef DIAGNOSTIC /* XXX bounds-check cookie. */ @@ -152,9 +154,8 @@ tc_3000_500_intr_disestablish(tcadev, cookie) panic("tc_3000_500_intr_disestablish: cookie %d bad intr", dev); - imr = *(volatile u_int32_t *)TC_3000_500_IMR_READ; - imr |= tc_3000_500_intrbits[dev]; - *(volatile u_int32_t *)TC_3000_500_IMR_WRITE = imr; + tc_3000_500_imask |= tc_3000_500_intrbits[dev]; + *(volatile u_int32_t *)TC_3000_500_IMR_WRITE = tc_3000_500_imask; tc_mb(); tc_3000_500_intr[dev].tci_func = tc_3000_500_intrnull; @@ -192,10 +193,22 @@ tc_3000_500_iointr(framep, vec) tc_syncbus(); ir = *(volatile u_int32_t *)TC_3000_500_IR_CLEAR; + /* Ignore interrupts that we haven't enabled. */ + ir &= ~(tc_3000_500_imask & 0x1ff); + ifound = 0; + +#ifdef EVCNT_COUNTERS + /* No interrupt counting via evcnt counters */ + XXX BREAK HERE XXX +#else /* !EVCNT_COUNTERS */ +#define INCRINTRCNT(slot) intrcnt[INTRCNT_KN15 + slot]++ +#endif /* EVCNT_COUNTERS */ + #define CHECKINTR(slot) \ if (ir & tc_3000_500_intrbits[slot]) { \ ifound = 1; \ + INCRINTRCNT(slot); \ (*tc_3000_500_intr[slot].tci_func) \ (tc_3000_500_intr[slot].tci_arg); \ } diff --git a/sys/arch/alpha/tc/tc_bus_io.c b/sys/arch/alpha/tc/tc_bus_io.c new file mode 100644 index 00000000000..5bd03d0254e --- /dev/null +++ b/sys/arch/alpha/tc/tc_bus_io.c @@ -0,0 +1,318 @@ +/* $NetBSD: tc_bus_io.c,v 1.1.4.1 1996/06/13 17:41:51 cgd Exp $ */ + +/* + * Copyright (c) 1996 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ + +/* + * TurboChannel "bus I/O" functions: + * These functions make no sense for TC, and just panic. + */ + +#include <sys/param.h> +#include <sys/malloc.h> +#include <sys/syslog.h> +#include <sys/device.h> +#include <vm/vm.h> + +#include <machine/bus.h> + +int tc_io_map __P((void *, bus_io_addr_t, bus_io_size_t, + bus_io_handle_t *)); +void tc_io_unmap __P((void *, bus_io_handle_t, + bus_io_size_t)); +int tc_io_subregion __P((void *, bus_io_handle_t, bus_io_size_t, + bus_io_size_t, bus_io_handle_t *)); +u_int8_t tc_io_read_1 __P((void *, bus_io_handle_t, + bus_io_size_t)); +u_int16_t tc_io_read_2 __P((void *, bus_io_handle_t, + bus_io_size_t)); +u_int32_t tc_io_read_4 __P((void *, bus_io_handle_t, + bus_io_size_t)); +u_int64_t tc_io_read_8 __P((void *, bus_io_handle_t, + bus_io_size_t)); +void tc_io_read_multi_1 __P((void *, bus_io_handle_t, + bus_io_size_t, u_int8_t *, bus_io_size_t)); +void tc_io_read_multi_2 __P((void *, bus_io_handle_t, + bus_io_size_t, u_int16_t *, bus_io_size_t)); +void tc_io_read_multi_4 __P((void *, bus_io_handle_t, + bus_io_size_t, u_int32_t *, bus_io_size_t)); +void tc_io_read_multi_8 __P((void *, bus_io_handle_t, + bus_io_size_t, u_int64_t *, bus_io_size_t)); +void tc_io_write_1 __P((void *, bus_io_handle_t, + bus_io_size_t, u_int8_t)); +void tc_io_write_2 __P((void *, bus_io_handle_t, + bus_io_size_t, u_int16_t)); +void tc_io_write_4 __P((void *, bus_io_handle_t, + bus_io_size_t, u_int32_t)); +void tc_io_write_8 __P((void *, bus_io_handle_t, + bus_io_size_t, u_int64_t)); +void tc_io_write_multi_1 __P((void *, bus_io_handle_t, + bus_io_size_t, const u_int8_t *, bus_io_size_t)); +void tc_io_write_multi_2 __P((void *, bus_io_handle_t, + bus_io_size_t, const u_int16_t *, bus_io_size_t)); +void tc_io_write_multi_4 __P((void *, bus_io_handle_t, + bus_io_size_t, const u_int32_t *, bus_io_size_t)); +void tc_io_write_multi_8 __P((void *, bus_io_handle_t, + bus_io_size_t, const u_int64_t *, bus_io_size_t)); + +void +tc_bus_io_init(bc, iov) + bus_chipset_tag_t bc; + void *iov; +{ + + bc->bc_i_v = iov; + + bc->bc_i_map = tc_io_map; + bc->bc_i_unmap = tc_io_unmap; + bc->bc_i_subregion = tc_io_subregion; + + bc->bc_ir1 = tc_io_read_1; + bc->bc_ir2 = tc_io_read_2; + bc->bc_ir4 = tc_io_read_4; + bc->bc_ir8 = tc_io_read_8; + + bc->bc_irm1 = tc_io_read_multi_1; + bc->bc_irm2 = tc_io_read_multi_2; + bc->bc_irm4 = tc_io_read_multi_4; + bc->bc_irm8 = tc_io_read_multi_8; + + bc->bc_iw1 = tc_io_write_1; + bc->bc_iw2 = tc_io_write_2; + bc->bc_iw4 = tc_io_write_4; + bc->bc_iw8 = tc_io_write_8; + + bc->bc_iwm1 = tc_io_write_multi_1; + bc->bc_iwm2 = tc_io_write_multi_2; + bc->bc_iwm4 = tc_io_write_multi_4; + bc->bc_iwm8 = tc_io_write_multi_8; +} + +static const char *tc_bus_io_panicstr = "tc_io_%s nonsensical; unimplemented"; + +int +tc_io_map(v, ioaddr, iosize, iohp) + void *v; + bus_io_addr_t ioaddr; + bus_io_size_t iosize; + bus_io_handle_t *iohp; +{ + + panic(tc_bus_io_panicstr, "map"); +} + +void +tc_io_unmap(v, ioh, iosize) + void *v; + bus_io_handle_t ioh; + bus_io_size_t iosize; +{ + + panic(tc_bus_io_panicstr, "unmap"); +} + +int +tc_io_subregion(v, ioh, offset, size, nioh) + void *v; + bus_io_handle_t ioh, *nioh; + bus_io_size_t offset, size; +{ + + panic(tc_bus_io_panicstr, "subregion"); +} + +u_int8_t +tc_io_read_1(v, ioh, off) + void *v; + bus_io_handle_t ioh; + bus_io_size_t off; +{ + + panic(tc_bus_io_panicstr, "read_1"); +} + +u_int16_t +tc_io_read_2(v, ioh, off) + void *v; + bus_io_handle_t ioh; + bus_io_size_t off; +{ + + panic(tc_bus_io_panicstr, "read_2"); +} + +u_int32_t +tc_io_read_4(v, ioh, off) + void *v; + bus_io_handle_t ioh; + bus_io_size_t off; +{ + + panic(tc_bus_io_panicstr, "read_4"); +} + +u_int64_t +tc_io_read_8(v, ioh, off) + void *v; + bus_io_handle_t ioh; + bus_io_size_t off; +{ + + panic(tc_bus_io_panicstr, "read_8"); +} + +void +tc_io_read_multi_1(v, ioh, off, addr, count) + void *v; + bus_io_handle_t ioh; + bus_io_size_t off, count; + u_int8_t *addr; +{ + + panic(tc_bus_io_panicstr, "read_multi_1"); +} + +void +tc_io_read_multi_2(v, ioh, off, addr, count) + void *v; + bus_io_handle_t ioh; + bus_io_size_t off, count; + u_int16_t *addr; +{ + + panic(tc_bus_io_panicstr, "read_multi_2"); +} + +void +tc_io_read_multi_4(v, ioh, off, addr, count) + void *v; + bus_io_handle_t ioh; + bus_io_size_t off, count; + u_int32_t *addr; +{ + + panic(tc_bus_io_panicstr, "read_multi_4"); +} + +void +tc_io_read_multi_8(v, ioh, off, addr, count) + void *v; + bus_io_handle_t ioh; + bus_io_size_t off, count; + u_int64_t *addr; +{ + + panic(tc_bus_io_panicstr, "read_multi_8"); +} + +void +tc_io_write_1(v, ioh, off, val) + void *v; + bus_io_handle_t ioh; + bus_io_size_t off; + u_int8_t val; +{ + + panic(tc_bus_io_panicstr, "write_1"); +} + +void +tc_io_write_2(v, ioh, off, val) + void *v; + bus_io_handle_t ioh; + bus_io_size_t off; + u_int16_t val; +{ + + panic(tc_bus_io_panicstr, "write_2"); +} + +void +tc_io_write_4(v, ioh, off, val) + void *v; + bus_io_handle_t ioh; + bus_io_size_t off; + u_int32_t val; +{ + + panic(tc_bus_io_panicstr, "write_4"); +} + +void +tc_io_write_8(v, ioh, off, val) + void *v; + bus_io_handle_t ioh; + bus_io_size_t off; + u_int64_t val; +{ + + panic(tc_bus_io_panicstr, "write_8"); +} + +void +tc_io_write_multi_1(v, ioh, off, addr, count) + void *v; + bus_io_handle_t ioh; + bus_io_size_t off, count; + const u_int8_t *addr; +{ + + panic(tc_bus_io_panicstr, "write_multi_1"); +} + +void +tc_io_write_multi_2(v, ioh, off, addr, count) + void *v; + bus_io_handle_t ioh; + bus_io_size_t off, count; + const u_int16_t *addr; +{ + + panic(tc_bus_io_panicstr, "write_multi_2"); +} + +void +tc_io_write_multi_4(v, ioh, off, addr, count) + void *v; + bus_io_handle_t ioh; + bus_io_size_t off, count; + const u_int32_t *addr; +{ + + panic(tc_bus_io_panicstr, "write_multi_4"); +} + +void +tc_io_write_multi_8(v, ioh, off, addr, count) + void *v; + bus_io_handle_t ioh; + bus_io_size_t off, count; + const u_int64_t *addr; +{ + + panic(tc_bus_io_panicstr, "write_multi_8"); +} diff --git a/sys/arch/alpha/tc/tc_bus_mem.c b/sys/arch/alpha/tc/tc_bus_mem.c new file mode 100644 index 00000000000..922dd831a8b --- /dev/null +++ b/sys/arch/alpha/tc/tc_bus_mem.c @@ -0,0 +1,313 @@ +/* $NetBSD: tc_bus_mem.c,v 1.2.4.2 1996/06/13 17:42:51 cgd Exp $ */ + +/* + * Copyright (c) 1996 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ + +/* + * Common TurboChannel Chipset "bus memory" functions. + */ + +#include <sys/param.h> +#include <sys/malloc.h> +#include <sys/syslog.h> +#include <sys/device.h> +#include <vm/vm.h> + +#include <machine/bus.h> +#include <dev/tc/tcvar.h> + +int tc_mem_map __P((void *, bus_mem_addr_t, bus_mem_size_t, + int, bus_mem_handle_t *)); +void tc_mem_unmap __P((void *, bus_mem_handle_t, + bus_mem_size_t)); +int tc_mem_subregion __P((void *, bus_mem_handle_t, bus_mem_size_t, + bus_mem_size_t, bus_mem_handle_t *)); +u_int8_t tc_mem_read_1 __P((void *, bus_mem_handle_t, + bus_mem_size_t)); +u_int16_t tc_mem_read_2 __P((void *, bus_mem_handle_t, + bus_mem_size_t)); +u_int32_t tc_mem_read_4 __P((void *, bus_mem_handle_t, + bus_mem_size_t)); +u_int64_t tc_mem_read_8 __P((void *, bus_mem_handle_t, + bus_mem_size_t)); +void tc_mem_write_1 __P((void *, bus_mem_handle_t, + bus_mem_size_t, u_int8_t)); +void tc_mem_write_2 __P((void *, bus_mem_handle_t, + bus_mem_size_t, u_int16_t)); +void tc_mem_write_4 __P((void *, bus_mem_handle_t, + bus_mem_size_t, u_int32_t)); +void tc_mem_write_8 __P((void *, bus_mem_handle_t, + bus_mem_size_t, u_int64_t)); + +/* XXX DOES NOT BELONG */ +vm_offset_t tc_XXX_dmamap __P((void *)); + +void +tc_bus_mem_init(bc, memv) + bus_chipset_tag_t bc; + void *memv; +{ + + bc->bc_m_v = memv; + + bc->bc_m_map = tc_mem_map; + bc->bc_m_unmap = tc_mem_unmap; + bc->bc_m_subregion = tc_mem_subregion; + + bc->bc_mr1 = tc_mem_read_1; + bc->bc_mr2 = tc_mem_read_2; + bc->bc_mr4 = tc_mem_read_4; + bc->bc_mr8 = tc_mem_read_8; + + bc->bc_mw1 = tc_mem_write_1; + bc->bc_mw2 = tc_mem_write_2; + bc->bc_mw4 = tc_mem_write_4; + bc->bc_mw8 = tc_mem_write_8; + + /* XXX DOES NOT BELONG */ + bc->bc_XXX_dmamap = tc_XXX_dmamap; +} + +int +tc_mem_map(v, memaddr, memsize, cacheable, memhp) + void *v; + bus_mem_addr_t memaddr; + bus_mem_size_t memsize; + int cacheable; + bus_mem_handle_t *memhp; +{ + + if (memaddr & 0x7) + panic("tc_mem_map needs 8 byte alignment"); + if (cacheable) + *memhp = phystok0seg(memaddr); + else + *memhp = phystok0seg(TC_DENSE_TO_SPARSE(memaddr)); + return (0); +} + +void +tc_mem_unmap(v, memh, memsize) + void *v; + bus_mem_handle_t memh; + bus_mem_size_t memsize; +{ + + /* XXX nothing to do. */ +} + +int +tc_mem_subregion(v, memh, offset, size, nmemh) + void *v; + bus_mem_handle_t memh, *nmemh; + bus_mem_size_t offset, size; +{ + + /* Disallow subregioning that would make the handle unaligned. */ + if ((offset & 0x7) != 0) + return (1); + + if ((memh & TC_SPACE_SPARSE) != 0) + *nmemh = memh + (offset << 1); + else + *nmemh = memh + offset; + + return (0); +} + +u_int8_t +tc_mem_read_1(v, memh, off) + void *v; + bus_mem_handle_t memh; + bus_mem_size_t off; +{ + volatile u_int8_t *p; + + wbflush(); + + if ((memh & TC_SPACE_SPARSE) != 0) + panic("tc_mem_read_1 not implemented for sparse space"); + + p = (u_int8_t *)(memh + off); + return (*p); +} + +u_int16_t +tc_mem_read_2(v, memh, off) + void *v; + bus_mem_handle_t memh; + bus_mem_size_t off; +{ + volatile u_int16_t *p; + + wbflush(); + + if ((memh & TC_SPACE_SPARSE) != 0) + panic("tc_mem_read_2 not implemented for sparse space"); + + p = (u_int16_t *)(memh + off); + return (*p); +} + +u_int32_t +tc_mem_read_4(v, memh, off) + void *v; + bus_mem_handle_t memh; + bus_mem_size_t off; +{ + volatile u_int32_t *p; + + wbflush(); + + if ((memh & TC_SPACE_SPARSE) != 0) + /* Nothing special to do for 4-byte sparse space accesses */ + p = (u_int32_t *)(memh + (off << 1)); + else + p = (u_int32_t *)(memh + off); + return (*p); +} + +u_int64_t +tc_mem_read_8(v, memh, off) + void *v; + bus_mem_handle_t memh; + bus_mem_size_t off; +{ + volatile u_int64_t *p; + + wbflush(); + + if ((memh & TC_SPACE_SPARSE) != 0) + panic("tc_mem_read_8 not implemented for sparse space"); + + p = (u_int64_t *)(memh + off); + return (*p); +} + +void +tc_mem_write_1(v, memh, off, val) + void *v; + bus_mem_handle_t memh; + bus_mem_size_t off; + u_int8_t val; +{ + + if ((memh & TC_SPACE_SPARSE) != 0) { + volatile u_int64_t *p, v; + u_int64_t shift, msk; + + shift = off & 0x3; + off &= 0x3; + + p = (u_int64_t *)(memh + (off << 1)); + + msk = ~(0x1 << shift) & 0xf; + v = (msk << 32) | (((u_int64_t)val) << (shift * 8)); + + *p = val; + } else { + volatile u_int8_t *p; + + p = (u_int8_t *)(memh + off); + *p = val; + } + wbflush(); +} + +void +tc_mem_write_2(v, memh, off, val) + void *v; + bus_mem_handle_t memh; + bus_mem_size_t off; + u_int16_t val; +{ + + if ((memh & TC_SPACE_SPARSE) != 0) { + volatile u_int64_t *p, v; + u_int64_t shift, msk; + + shift = off & 0x2; + off &= 0x3; + + p = (u_int64_t *)(memh + (off << 1)); + + msk = ~(0x3 << shift) & 0xf; + v = (msk << 32) | (((u_int64_t)val) << (shift * 8)); + + *p = val; + } else { + volatile u_int16_t *p; + + p = (u_int16_t *)(memh + off); + *p = val; + } + wbflush(); +} + +void +tc_mem_write_4(v, memh, off, val) + void *v; + bus_mem_handle_t memh; + bus_mem_size_t off; + u_int32_t val; +{ + volatile u_int32_t *p; + + if ((memh & TC_SPACE_SPARSE) != 0) + /* Nothing special to do for 4-byte sparse space accesses */ + p = (u_int32_t *)(memh + (off << 1)); + else + p = (u_int32_t *)(memh + off); + *p = val; + wbflush(); +} + +void +tc_mem_write_8(v, memh, off, val) + void *v; + bus_mem_handle_t memh; + bus_mem_size_t off; + u_int64_t val; +{ + volatile u_int64_t *p; + + if ((memh & TC_SPACE_SPARSE) != 0) + panic("tc_mem_read_8 not implemented for sparse space"); + + p = (u_int64_t *)(memh + off); + *p = val; + wbflush(); +} + +/* XXX DOES NOT BELONG */ +vm_offset_t +tc_XXX_dmamap(addr) + void *addr; +{ + + return (vtophys(addr)); +} diff --git a/sys/arch/alpha/include/tc_machdep.h b/sys/arch/alpha/tc/tc_machdep.h index 5287f43b048..5287f43b048 100644 --- a/sys/arch/alpha/include/tc_machdep.h +++ b/sys/arch/alpha/tc/tc_machdep.h diff --git a/sys/arch/alpha/tc/tcasic.c b/sys/arch/alpha/tc/tcasic.c index 9524b08957f..742029d3f54 100644 --- a/sys/arch/alpha/tc/tcasic.c +++ b/sys/arch/alpha/tc/tcasic.c @@ -1,7 +1,7 @@ -/* $NetBSD: tcasic.c,v 1.1 1995/12/20 00:43:34 cgd Exp $ */ +/* $NetBSD: tcasic.c,v 1.5 1996/05/17 23:58:43 cgd Exp $ */ /* - * Copyright (c) 1994, 1995 Carnegie-Mellon University. + * Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -39,9 +39,14 @@ /* Definition of the driver for autoconfig. */ int tcasicmatch(struct device *, void *, void *); void tcasicattach(struct device *, struct device *, void *); -struct cfdriver tcasiccd = - { NULL, "tcasic", tcasicmatch, tcasicattach, DV_DULL, - sizeof (struct device) }; + +struct cfattach tcasic_ca = { + sizeof (struct device), tcasicmatch, tcasicattach, +}; + +struct cfdriver tcasic_cd = { + NULL, "tcasic", DV_DULL, +}; int tcasicprint __P((void *, char *)); @@ -59,7 +64,7 @@ tcasicmatch(parent, cfdata, aux) struct confargs *ca = aux; /* Make sure that we're looking for a TurboChannel ASIC. */ - if (strcmp(ca->ca_name, tcasiccd.cd_name)) + if (strcmp(ca->ca_name, tcasic_cd.cd_name)) return (0); /* Make sure that the system supports a TurboChannel ASIC. */ @@ -78,54 +83,61 @@ tcasicattach(parent, self, aux) struct device *self; void *aux; { - struct tc_attach_args tc; + struct tcbus_attach_args tba; void (*intr_setup) __P((void)); void (*iointr) __P((void *, int)); + struct alpha_bus_chipset bc; + printf("\n"); tcasicfound = 1; switch (cputype) { #ifdef DEC_3000_500 case ST_DEC_3000_500: - printf(": 25MHz\n"); intr_setup = tc_3000_500_intr_setup; iointr = tc_3000_500_iointr; - tc.tca_nslots = tc_3000_500_nslots; - tc.tca_slots = tc_3000_500_slots; - tc.tca_nbuiltins = tc_3000_500_nbuiltins; - tc.tca_builtins = tc_3000_500_builtins; - tc.tca_intr_establish = tc_3000_500_intr_establish; - tc.tca_intr_disestablish = tc_3000_500_intr_disestablish; + tba.tba_busname = "tc"; + tba.tba_speed = TC_SPEED_25_MHZ; + tba.tba_nslots = tc_3000_500_nslots; + tba.tba_slots = tc_3000_500_slots; + tba.tba_nbuiltins = tc_3000_500_nbuiltins; + tba.tba_builtins = tc_3000_500_builtins; + tba.tba_intr_establish = tc_3000_500_intr_establish; + tba.tba_intr_disestablish = tc_3000_500_intr_disestablish; break; #endif /* DEC_3000_500 */ #ifdef DEC_3000_300 case ST_DEC_3000_300: - printf(": 12.5MHz\n"); intr_setup = tc_3000_300_intr_setup; iointr = tc_3000_300_iointr; - tc.tca_nslots = tc_3000_300_nslots; - tc.tca_slots = tc_3000_300_slots; - tc.tca_nbuiltins = tc_3000_300_nbuiltins; - tc.tca_builtins = tc_3000_300_builtins; - tc.tca_intr_establish = tc_3000_300_intr_establish; - tc.tca_intr_disestablish = tc_3000_300_intr_disestablish; + tba.tba_busname = "tc"; + tba.tba_speed = TC_SPEED_12_5_MHZ; + tba.tba_nslots = tc_3000_300_nslots; + tba.tba_slots = tc_3000_300_slots; + tba.tba_nbuiltins = tc_3000_300_nbuiltins; + tba.tba_builtins = tc_3000_300_builtins; + tba.tba_intr_establish = tc_3000_300_intr_establish; + tba.tba_intr_disestablish = tc_3000_300_intr_disestablish; break; #endif /* DEC_3000_300 */ default: - printf("\n"); panic("tcasicattach: bad cputype"); } + tc_bus_io_init(&bc, NULL); + tc_bus_mem_init(&bc, NULL); + tba.tba_bc = &bc; + (*intr_setup)(); set_iointr(iointr); - config_found(self, &tc, tcasicprint); + config_found(self, &tba, tcasicprint); } int diff --git a/sys/arch/alpha/tc/tcds.c b/sys/arch/alpha/tc/tcds.c index 6c0c6490fec..940ac21c698 100644 --- a/sys/arch/alpha/tc/tcds.c +++ b/sys/arch/alpha/tc/tcds.c @@ -1,7 +1,7 @@ -/* $NetBSD: tcds.c,v 1.6 1995/12/20 00:40:29 cgd Exp $ */ +/* $NetBSD: tcds.c,v 1.9.4.2 1996/06/05 01:32:26 cgd Exp $ */ /* - * Copyright (c) 1994, 1995 Carnegie-Mellon University. + * Copyright (c) 1994, 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Keith Bostic, Chris G. Demetriou @@ -34,6 +34,9 @@ #include <machine/pte.h> #include <machine/rpb.h> +#ifndef EVCNT_COUNTERS +#include <machine/intrcnt.h> +#endif #include <dev/tc/tcreg.h> #include <dev/tc/tcvar.h> @@ -55,8 +58,14 @@ struct tcds_softc { int tcdsmatch __P((struct device *, void *, void *)); void tcdsattach __P((struct device *, struct device *, void *)); int tcdsprint(void *, char *); -struct cfdriver tcdscd = - { NULL, "tcds", tcdsmatch, tcdsattach, DV_DULL, sizeof(struct tcds_softc) }; + +struct cfattach tcds_ca = { + sizeof(struct tcds_softc), tcdsmatch, tcdsattach, +}; + +struct cfdriver tcds_cd = { + NULL, "tcds", DV_DULL, +}; /*static*/ int tcds_intr __P((void *)); /*static*/ int tcds_intrnull __P((void *)); @@ -67,11 +76,11 @@ tcdsmatch(parent, cfdata, aux) void *cfdata; void *aux; { - struct tcdev_attach_args *tcdev = aux; + struct tc_attach_args *ta = aux; extern int cputype; /* Make sure that we're looking for this type of device. */ - if (strncmp("PMAZ-DS ", tcdev->tcda_modname, TC_ROM_LLEN)) + if (strncmp("PMAZ-DS ", ta->ta_modname, TC_ROM_LLEN)) return (0); /* PMAZ-FS? */ @@ -88,7 +97,7 @@ tcdsattach(parent, self, aux) void *aux; { struct tcds_softc *sc = (struct tcds_softc *)self; - struct tcdev_attach_args *tcdev = aux; + struct tc_attach_args *ta = aux; struct tcdsdev_attach_args tcdsdev; struct tcds_slotconfig *slotc; int i; @@ -96,8 +105,8 @@ tcdsattach(parent, self, aux) printf("\n"); - sc->sc_base = tcdev->tcda_addr; - sc->sc_cookie = tcdev->tcda_cookie; + sc->sc_base = ta->ta_addr; + sc->sc_cookie = ta->ta_cookie; sc->sc_cir = TCDS_REG(sc->sc_base, TCDS_CIR); sc->sc_imer = TCDS_REG(sc->sc_base, TCDS_IMER); @@ -196,11 +205,11 @@ tcdsprint(aux, pnp) void *aux; char *pnp; { - struct tcdev_attach_args *tcdev = aux; + struct tc_attach_args *ta = aux; if (pnp) - printf("%s at %s", tcdev->tcda_modname, pnp); - printf(" slot 0x%lx", tcdev->tcda_slot); + printf("%s at %s", ta->ta_modname, pnp); + printf(" slot %d", ta->ta_slot); return (UNCONF); } @@ -349,8 +358,16 @@ tcds_intr(val) tc_syncbus(); wbflush(); +#ifdef EVCNT_COUNTERS + /* No interrupt counting via evcnt counters */ + XXX BREAK HERE XXX +#else +#define INCRINTRCNT(slot) intrcnt[INTRCNT_TCDS + slot]++ +#endif + #define CHECKINTR(slot) \ if (ir & sc->sc_slots[slot].sc_intrbits) { \ + INCRINTRCNT(slot); \ (void)(*sc->sc_slots[slot].sc_intrhand) \ (sc->sc_slots[slot].sc_intrarg); \ } diff --git a/sys/arch/alpha/tc/tcdsvar.h b/sys/arch/alpha/tc/tcdsvar.h index 5bee7191694..540db9c8538 100644 --- a/sys/arch/alpha/tc/tcdsvar.h +++ b/sys/arch/alpha/tc/tcdsvar.h @@ -1,7 +1,7 @@ -/* $NetBSD: tcdsvar.h,v 1.1 1995/12/20 00:40:41 cgd Exp $ */ +/* $NetBSD: tcdsvar.h,v 1.3 1996/04/12 06:10:18 cgd Exp $ */ /* - * Copyright (c) 1995 Carnegie-Mellon University. + * Copyright (c) 1995, 1996 Carnegie-Mellon University. * All rights reserved. * * Author: Chris G. Demetriou @@ -66,16 +66,16 @@ struct tcds_slotconfig { }; struct tcdsdev_attach_args { - struct tcdev_attach_args tcdsda_tc; + struct tc_attach_args tcdsda_ta; struct tcds_slotconfig *tcdsda_sc; u_int tcdsda_id; u_int tcdsda_freq; }; -#define tcdsda_modname tcdsda_tc.tcda_modname -#define tcdsda_slot tcdsda_tc.tcda_slot -#define tcdsda_offset tcdsda_tc.tcda_offset -#define tcdsda_addr tcdsda_tc.tcda_addr -#define tcdsda_cookie tcdsda_tc.tcda_cookie +#define tcdsda_modname tcdsda_ta.ta_modname +#define tcdsda_slot tcdsda_ta.ta_slot +#define tcdsda_offset tcdsda_ta.ta_offset +#define tcdsda_addr tcdsda_ta.ta_addr +#define tcdsda_cookie tcdsda_ta.ta_cookie #define TCDS_REG(base, off) \ (volatile u_int32_t *)TC_DENSE_TO_SPARSE((base) + (off)) @@ -105,4 +105,4 @@ int tcds_dmaintr __P((struct tcds_slotconfig *)); * The TCDS (bus) cfdriver, so that subdevices can more * easily tell what bus they're on. */ -extern struct cfdriver tcdscd; +extern struct cfdriver tcds_cd; diff --git a/sys/arch/alpha/wscons/ascii.h b/sys/arch/alpha/wscons/ascii.h new file mode 100644 index 00000000000..dc4775022c9 --- /dev/null +++ b/sys/arch/alpha/wscons/ascii.h @@ -0,0 +1,10 @@ +/* $NetBSD: ascii.h,v 1.1 1996/04/12 02:00:42 cgd Exp $ */ + +#define ASCII_BEL 0x07 /* bell */ +#define ASCII_BS 0x08 /* backspace */ +#define ASCII_HT 0x09 /* horizontal tab */ +#define ASCII_LF 0x0a /* line feed */ +#define ASCII_VT 0x0b /* vertical tab(?); up one line */ +#define ASCII_NP 0x0c /* next page; form feed */ +#define ASCII_CR 0x0d /* carriage return */ +#define ASCII_ESC 0x1b /* escape */ diff --git a/sys/arch/alpha/wscons/event.c b/sys/arch/alpha/wscons/event.c new file mode 100644 index 00000000000..3c34d962c83 --- /dev/null +++ b/sys/arch/alpha/wscons/event.c @@ -0,0 +1,172 @@ +/* $NetBSD: event.c,v 1.1.4.1 1996/05/29 22:26:54 cgd Exp $ */ + +/* + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This software was developed by the Computer Systems Engineering group + * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and + * contributed to Berkeley. + * + * All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Lawrence Berkeley Laboratory. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)event.c 8.1 (Berkeley) 6/11/93 + */ + +/* + * Internal `Firm_event' interface for the keyboard and mouse drivers. + */ + +#include <sys/param.h> +#include <sys/fcntl.h> +#include <sys/malloc.h> +#include <sys/proc.h> +#include <sys/systm.h> +#include <sys/vnode.h> + +#include <machine/vuid_event.h> +#include <alpha/wscons/event_var.h> + +/* + * Initialize a firm_event queue. + */ +void +ev_init(ev) + register struct evvar *ev; +{ + + ev->ev_get = ev->ev_put = 0; + ev->ev_q = malloc((u_long)EV_QSIZE * sizeof(struct firm_event), + M_DEVBUF, M_WAITOK); + bzero((caddr_t)ev->ev_q, EV_QSIZE * sizeof(struct firm_event)); +} + +/* + * Tear down a firm_event queue. + */ +void +ev_fini(ev) + register struct evvar *ev; +{ + + free(ev->ev_q, M_DEVBUF); +} + +/* + * User-level interface: read, select. + * (User cannot write an event queue.) + */ +int +ev_read(ev, uio, flags) + register struct evvar *ev; + struct uio *uio; + int flags; +{ + int s, n, cnt, error; + + /* + * Make sure we can return at least 1. + */ + if (uio->uio_resid < sizeof(struct firm_event)) + return (EMSGSIZE); /* ??? */ + s = splev(); + while (ev->ev_get == ev->ev_put) { + if (flags & IO_NDELAY) { + splx(s); + return (EWOULDBLOCK); + } + ev->ev_wanted = 1; + error = tsleep((caddr_t)ev, PEVENT | PCATCH, "firm_event", 0); + if (error) { + splx(s); + return (error); + } + } + /* + * Move firm_events from tail end of queue (there is at least one + * there). + */ + if (ev->ev_put < ev->ev_get) + cnt = EV_QSIZE - ev->ev_get; /* events in [get..QSIZE) */ + else + cnt = ev->ev_put - ev->ev_get; /* events in [get..put) */ + splx(s); + n = howmany(uio->uio_resid, sizeof(struct firm_event)); + if (cnt > n) + cnt = n; + error = uiomove((caddr_t)&ev->ev_q[ev->ev_get], + cnt * sizeof(struct firm_event), uio); + n -= cnt; + /* + * If we do not wrap to 0, used up all our space, or had an error, + * stop. Otherwise move from front of queue to put index, if there + * is anything there to move. + */ + if ((ev->ev_get = (ev->ev_get + cnt) % EV_QSIZE) != 0 || + n == 0 || error || (cnt = ev->ev_put) == 0) + return (error); + if (cnt > n) + cnt = n; + error = uiomove((caddr_t)&ev->ev_q[0], + cnt * sizeof(struct firm_event), uio); + ev->ev_get = cnt; + return (error); +} + +int +ev_select(ev, rw, p) + register struct evvar *ev; + int rw; + struct proc *p; +{ + int s = splev(); + + switch (rw) { + + case FREAD: + /* succeed if there is something to read */ + if (ev->ev_get != ev->ev_put) { + splx(s); + return (1); + } + selrecord(p, &ev->ev_sel); + break; + + case FWRITE: + splx(s); + return (1); /* always fails => never blocks */ + } + splx(s); + return (0); +} diff --git a/sys/arch/alpha/wscons/event_var.h b/sys/arch/alpha/wscons/event_var.h new file mode 100644 index 00000000000..b63213d315f --- /dev/null +++ b/sys/arch/alpha/wscons/event_var.h @@ -0,0 +1,87 @@ +/* $NetBSD: event_var.h,v 1.1 1996/04/12 02:00:45 cgd Exp $ */ + +/* + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This software was developed by the Computer Systems Engineering group + * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and + * contributed to Berkeley. + * + * All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Lawrence Berkeley Laboratory. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)event_var.h 8.1 (Berkeley) 6/11/93 + */ + +/* + * Internal `Firm_event' interface for the keyboard and mouse drivers. + * The drivers are expected not to place events in the queue above spltty(), + * i.e., are expected to run off serial ports. + */ + +/* EV_QSIZE should be a power of two so that `%' is fast */ +#define EV_QSIZE 256 /* may need tuning; this uses 2k */ + +struct evvar { + u_int ev_get; /* get (read) index (modified synchronously) */ + volatile u_int ev_put; /* put (write) index (modified by interrupt) */ + struct selinfo ev_sel; /* process selecting */ + struct proc *ev_io; /* process that opened queue (can get SIGIO) */ + char ev_wanted; /* wake up on input ready */ + char ev_async; /* send SIGIO on input ready */ + struct firm_event *ev_q;/* circular buffer (queue) of events */ +}; + +#define splev() spltty() + +#define EV_WAKEUP(ev) { \ + selwakeup(&(ev)->ev_sel); \ + if ((ev)->ev_wanted) { \ + (ev)->ev_wanted = 0; \ + wakeup((caddr_t)(ev)); \ + } \ + if ((ev)->ev_async) \ + psignal((ev)->ev_io, SIGIO); \ +} + +void ev_init __P((struct evvar *)); +void ev_fini __P((struct evvar *)); +int ev_read __P((struct evvar *, struct uio *, int)); +int ev_select __P((struct evvar *, int, struct proc *)); + +/* + * PEVENT is set just above PSOCK, which is just above TTIPRI, on the + * theory that mouse and keyboard `user' input should be quick. + */ +#define PEVENT 23 diff --git a/sys/arch/alpha/wscons/kbd.c b/sys/arch/alpha/wscons/kbd.c new file mode 100644 index 00000000000..67cd26fcee5 --- /dev/null +++ b/sys/arch/alpha/wscons/kbd.c @@ -0,0 +1,334 @@ +/* $NetBSD: kbd.c,v 1.1 1996/04/12 02:00:46 cgd Exp $ */ + +/* + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This software was developed by the Computer Systems Engineering group + * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and + * contributed to Berkeley. + * + * All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Lawrence Berkeley Laboratory. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)kbd.c 8.2 (Berkeley) 10/30/93 + */ + +/* + * Keyboard driver (/dev/kbd -- note that we do not have minor numbers + * [yet?]). Translates incoming bytes to ASCII or to `firm_events' and + * passes them up to the appropriate reader. + */ + +#include <sys/param.h> +#include <sys/conf.h> +#include <sys/device.h> +#include <sys/ioctl.h> +#include <sys/kernel.h> +#include <sys/proc.h> +#include <sys/syslog.h> +#include <sys/systm.h> +#include <sys/tty.h> + +#include <machine/autoconf.h> + +#include <machine/vuid_event.h> +#include <machine/kbio.h> /* XXX FOR KIOCSDIRECT */ +#include <machine/wsconsio.h> /* XXX for bell ioctls */ +#include <alpha/wscons/event_var.h> +#include <alpha/wscons/wsconsvar.h> + +struct kbd_softc { + struct device *k_idev; /* the input device */ + struct wscons_idev_spec k_ispec; /* the input device information */ + + int k_evmode; /* set if we should produce events */ + struct evvar k_events; /* event queue state */ + char *k_repeatcp; /* repeated character (string) */ + int k_repeating; /* we've called timeout() */ + int k_repeat_start; /* how long (ms) until repeat */ + int k_repeat_step; /* how long (ms) until more repeats */ + + struct wsconsio_bell_data k_belldata; +} kbd_softc; + +void +kbdattach(idev, ispec) + struct device *idev; + struct wscons_idev_spec *ispec; +{ + register struct kbd_softc *k = &kbd_softc; + + /* + * It would be nice if the repeat rates were in ticks. + * However, if they were, we couldn't set them here, as + * hz might not be set up yet! + */ + k->k_repeat_start = 200; + k->k_repeat_step = 50; + + k->k_belldata.wbd_pitch = 1500; /* 1500 Hz */ + k->k_belldata.wbd_period = 100; /* 100 ms */ + k->k_belldata.wbd_volume = 50; /* 50% volume */ + + k->k_idev = idev; + k->k_ispec = *ispec; +} + +void +kbd_repeat(void *arg) +{ + struct kbd_softc *k = (struct kbd_softc *)arg; + int s = spltty(); + + if (k->k_repeating && k->k_repeatcp != NULL) { + wscons_input(k->k_repeatcp); + timeout(kbd_repeat, k, (hz * k->k_repeat_step) / 1000); + } + splx(s); +} + +void +kbd_input(register int c) +{ + register struct kbd_softc *k = &kbd_softc; + register struct firm_event *fe; + register int put; + char *cp; + + if (k->k_repeating) { + k->k_repeating = 0; + untimeout(kbd_repeat, k); + } + + /* + * If /dev/kbd is not connected in event mode translate and + * send upstream. + */ + if (!k->k_evmode) { + cp = (*k->k_ispec.wi_translate)(k->k_idev, c); + if (cp != NULL) { + wscons_input(cp); + k->k_repeating = 1; + k->k_repeatcp = cp; + timeout(kbd_repeat, k, (hz * k->k_repeat_start) / 1000); + } + return; + } + + /* + * Keyboard is generating events. Turn this keystroke into an + * event and put it in the queue. If the queue is full, the + * keystroke is lost (sorry!). + */ + put = k->k_events.ev_put; + fe = &k->k_events.ev_q[put]; + put = (put + 1) % EV_QSIZE; + if (put == k->k_events.ev_get) { + log(LOG_WARNING, "keyboard event queue overflow\n"); /* ??? */ + return; + } + fe->id = c & k->k_ispec.wi_keymask; + fe->value = (c & k->k_ispec.wi_keyupmask) != 0 ? VKEY_UP : VKEY_DOWN; + microtime(&fe->time); + k->k_events.ev_put = put; + EV_WAKEUP(&k->k_events); +} + +int +kbdopen(dev_t dev, int flags, int mode, struct proc *p) +{ + int s; + struct tty *tp; + + if (kbd_softc.k_events.ev_io) + return (EBUSY); + kbd_softc.k_events.ev_io = p; + ev_init(&kbd_softc.k_events); + kbd_softc.k_evmode = 1; + return (0); +} + +int +kbdclose(dev_t dev, int flags, int mode, struct proc *p) +{ + + /* + * Turn off event mode, dump the queue, and close the keyboard + * unless it is supplying console input. + */ + kbd_softc.k_evmode = 0; + ev_fini(&kbd_softc.k_events); + kbd_softc.k_events.ev_io = NULL; + return (0); +} + +int +kbdread(dev_t dev, struct uio *uio, int flags) +{ + + return (ev_read(&kbd_softc.k_events, uio, flags)); +} + +/* this routine should not exist, but is convenient to write here for now */ +int +kbdwrite(dev_t dev, struct uio *uio, int flags) +{ + + return (EOPNOTSUPP); +} + +int +kbdioctl(dev_t dev, u_long cmd, register caddr_t data, int flag, struct proc *p) +{ + struct kbd_softc *k = &kbd_softc; + struct wsconsio_bell_data *wbd; + int rv; + + rv = ENOTTY; + switch (cmd) { +#if 0 + case KIOCSDIRECT: + k->k_evmode = *(int *)data; + return (0); +#endif + + case FIONBIO: /* we will remove this someday (soon???) */ + return (0); + + case FIOASYNC: + k->k_events.ev_async = *(int *)data != 0; + return (0); + + case TIOCSPGRP: + if (*(int *)data != k->k_events.ev_io->p_pgid) + return (EPERM); + return (0); + + case WSCONSIO_BELL: + if (k->k_ispec.wi_bell != NULL) + (*k->k_ispec.wi_bell)(k->k_idev, &k->k_belldata); + return (0); + + case WSCONSIO_COMPLEXBELL: + if (k->k_ispec.wi_bell != NULL) { + wbd = (struct wsconsio_bell_data *)data; + if ((wbd->wbd_flags & WSCONSIO_BELLDATA_PITCH) == 0) + wbd->wbd_pitch = k->k_belldata.wbd_pitch; + if ((wbd->wbd_flags & WSCONSIO_BELLDATA_PERIOD) == 0) + wbd->wbd_period = k->k_belldata.wbd_period; + if ((wbd->wbd_flags & WSCONSIO_BELLDATA_VOLUME) == 0) + wbd->wbd_volume = k->k_belldata.wbd_volume; + + (*k->k_ispec.wi_bell)(k->k_idev, wbd); + } + return (0); + + case WSCONSIO_SETBELL: + wbd = (struct wsconsio_bell_data *)data; + if ((wbd->wbd_flags & WSCONSIO_BELLDATA_PITCH) != 0) + k->k_belldata.wbd_pitch = wbd->wbd_pitch; + if ((wbd->wbd_flags & WSCONSIO_BELLDATA_PERIOD) != 0) + k->k_belldata.wbd_period = wbd->wbd_period; + if ((wbd->wbd_flags & WSCONSIO_BELLDATA_VOLUME) != 0) + k->k_belldata.wbd_volume = wbd->wbd_volume; + return (0); + + case WSCONSIO_GETBELL: + wbd = (struct wsconsio_bell_data *)data; + wbd->wbd_flags = WSCONSIO_BELLDATA_PITCH | + WSCONSIO_BELLDATA_PERIOD | WSCONSIO_BELLDATA_VOLUME; + wbd->wbd_pitch = k->k_belldata.wbd_pitch; + wbd->wbd_period = k->k_belldata.wbd_period; + wbd->wbd_volume = k->k_belldata.wbd_volume ; + return (0); + +#if 0 /* XXX */ + /* XXX KEY-REPEAT RATE SETTING */ +#endif /* XXX */ + + default: + if (k->k_ispec.wi_ioctl != NULL) + rv = (*k->k_ispec.wi_ioctl)(k->k_idev, cmd, data, + flag, p); + } + return (rv); +} + +int +kbdselect(dev_t dev, int rw, struct proc *p) +{ + + return (ev_select(&kbd_softc.k_events, rw, p)); +} + +/* Ring the console bell. (For wscons terminal emulator and other code) */ +void +wscons_kbd_bell() +{ + struct kbd_softc *k = &kbd_softc; + + if (k->k_ispec.wi_bell != NULL) + (*k->k_ispec.wi_bell)(k->k_idev, &k->k_belldata); +} + +/* + * Console handling functions. + */ + +int +kbd_cngetc(dev) + dev_t dev; +{ + struct kbd_softc *k = &kbd_softc; + + if (kbd_softc.k_evmode) /* XXX? */ + return 0; + if (k->k_ispec.wi_getc != NULL) + return (*k->k_ispec.wi_getc)(k->k_idev); + else + return 0; +} + +void +kbd_cnpollc(dev, on) + dev_t dev; + int on; +{ + struct kbd_softc *k = &kbd_softc; + + if (kbd_softc.k_evmode) /* XXX? */ + return; + if (k->k_ispec.wi_pollc != NULL) + (*k->k_ispec.wi_pollc)(k->k_idev, on); +} diff --git a/sys/arch/alpha/wscons/ms.c b/sys/arch/alpha/wscons/ms.c new file mode 100644 index 00000000000..240a0b4bfd6 --- /dev/null +++ b/sys/arch/alpha/wscons/ms.c @@ -0,0 +1,285 @@ +/* $NetBSD: ms.c,v 1.1 1996/04/12 02:00:47 cgd Exp $ */ + +/* + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This software was developed by the Computer Systems Engineering group + * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and + * contributed to Berkeley. + * + * All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Lawrence Berkeley Laboratory. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ms.c 8.1 (Berkeley) 6/11/93 + */ + +/* + * Mouse driver. + */ + +#include <sys/param.h> +#include <sys/conf.h> +#include <sys/ioctl.h> +#include <sys/kernel.h> +#include <sys/proc.h> +#include <sys/syslog.h> +#include <sys/systm.h> +#include <sys/tty.h> + +#include <machine/vuid_event.h> +#include <alpha/wscons/event_var.h> +#include <alpha/wscons/wsconsvar.h> + +struct ms_softc { + struct device *ms_dev; + struct wscons_mdev_spec ms_spec; + char ms_mb; /* mouse button state */ + char ms_ub; /* user button state */ + int ms_dx; /* delta-x */ + int ms_dy; /* delta-y */ + volatile int ms_ready; /* event queue is ready */ + struct evvar ms_events; /* event queue state */ +} ms_softc; + +void +msattach(mdev, mspec) + struct device *mdev; + struct wscons_mdev_spec *mspec; +{ + register struct ms_softc *m = &ms_softc; + + m->ms_dev = mdev; + m->ms_spec = *mspec; +} + +void +ms_event(buttons, dx, dy) + char buttons; /* 0 is up */ + int dx, dy; +{ + register struct firm_event *fe; + register struct ms_softc *ms = &ms_softc; + register int mb, ub, d, get, put, any; + static const char to_one[] = { 1, 2, 2, 4, 4, 4, 4 }; + static const int to_id[] = { MS_RIGHT, MS_MIDDLE, 0, MS_LEFT }; + + /* + * Discard input if not ready. + */ + if (ms->ms_ready == 0) + return; + + ms->ms_mb = (buttons) & 0x7; + ms->ms_dx += dx; + ms->ms_dy += dy; + + /* + * We have at least one event (mouse button, delta-X, or + * delta-Y; possibly all three, and possibly three separate + * button events). Deliver these events until we are out + * of changes or out of room. As events get delivered, + * mark them `unchanged'. + */ + any = 0; + get = ms->ms_events.ev_get; + put = ms->ms_events.ev_put; + fe = &ms->ms_events.ev_q[put]; + + /* NEXT prepares to put the next event, backing off if necessary */ +#define NEXT \ + if ((++put) % EV_QSIZE == get) { \ + put--; \ + goto out; \ + } + /* ADVANCE completes the `put' of the event */ +#define ADVANCE \ + fe++; \ + if (put >= EV_QSIZE) { \ + put = 0; \ + fe = &ms->ms_events.ev_q[0]; \ + } \ + any = 1 + + mb = ms->ms_mb; + ub = ms->ms_ub; + while ((d = mb ^ ub) != 0) { + /* + * Mouse button change. Convert up to three changes + * to the `first' change, and drop it into the event queue. + */ + NEXT; + d = to_one[d - 1]; /* from 1..7 to {1,2,4} */ + fe->id = to_id[d - 1]; /* from {1,2,4} to ID */ + fe->value = mb & d ? VKEY_DOWN : VKEY_UP; + fe->time = time; + ADVANCE; + ub ^= d; + } + if (ms->ms_dx) { + NEXT; + fe->id = LOC_X_DELTA; + fe->value = ms->ms_dx; + fe->time = time; + ADVANCE; + ms->ms_dx = 0; + } + if (ms->ms_dy) { + NEXT; + fe->id = LOC_Y_DELTA; + fe->value = ms->ms_dy; + fe->time = time; + ADVANCE; + ms->ms_dy = 0; + } +out: + if (any) { + ms->ms_ub = ub; + ms->ms_events.ev_put = put; + EV_WAKEUP(&ms->ms_events); + } +} + +int +msopen(dev, flags, mode, p) + dev_t dev; + int flags, mode; + struct proc *p; +{ + int s, error; + + if (ms_softc.ms_dev == NULL) /* never attached! */ + return (ENXIO); + + if (ms_softc.ms_events.ev_io) + return (EBUSY); + + ms_softc.ms_events.ev_io = p; + ev_init(&ms_softc.ms_events); /* may cause sleep */ + + ms_softc.ms_ready = 1; /* start accepting events */ + + error = (*ms_softc.ms_spec.wm_enable)(ms_softc.ms_dev); + + if (error) { + ms_softc.ms_ready = 0; /* stop accepting events */ + ev_fini(&ms_softc.ms_events); + ms_softc.ms_events.ev_io = NULL; + return (error); + } + + return (0); +} + +int +msclose(dev, flags, mode, p) + dev_t dev; + int flags, mode; + struct proc *p; +{ + + (*ms_softc.ms_spec.wm_disable)(ms_softc.ms_dev); + + ms_softc.ms_ready = 0; /* stop accepting events */ + ev_fini(&ms_softc.ms_events); + ms_softc.ms_events.ev_io = NULL; + return (0); +} + +int +msread(dev, uio, flags) + dev_t dev; + struct uio *uio; + int flags; +{ + + return (ev_read(&ms_softc.ms_events, uio, flags)); +} + +/* this routine should not exist, but is convenient to write here for now */ +int +mswrite(dev, uio, flags) + dev_t dev; + struct uio *uio; + int flags; +{ + + return (EOPNOTSUPP); +} + +int +msioctl(dev, cmd, data, flag, p) + dev_t dev; + u_long cmd; + register caddr_t data; + int flag; + struct proc *p; +{ + int s; + + switch (cmd) { + + case FIONBIO: /* we will remove this someday (soon???) */ + return (0); + + case FIOASYNC: + ms_softc.ms_events.ev_async = *(int *)data != 0; + return (0); + + case TIOCSPGRP: + if (*(int *)data != ms_softc.ms_events.ev_io->p_pgid) + return (EPERM); + return (0); + + case VUIDGFORMAT: + /* we only do firm_events */ + *(int *)data = VUID_FIRM_EVENT; + return (0); + + case VUIDSFORMAT: + if (*(int *)data != VUID_FIRM_EVENT) + return (EINVAL); + return (0); + } + return (ENOTTY); +} + +int +msselect(dev, rw, p) + dev_t dev; + int rw; + struct proc *p; +{ + + return (ev_select(&ms_softc.ms_events, rw, p)); +} diff --git a/sys/arch/alpha/wscons/wscons.c b/sys/arch/alpha/wscons/wscons.c new file mode 100644 index 00000000000..2845895227d --- /dev/null +++ b/sys/arch/alpha/wscons/wscons.c @@ -0,0 +1,495 @@ +/* $NetBSD: wscons.c,v 1.3.4.1 1996/06/03 18:54:35 cgd Exp $ */ + +/* + * Copyright (c) 1995, 1996 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ + +#include <sys/param.h> +#include <sys/device.h> +#include <sys/kernel.h> +#include <sys/conf.h> +#include <sys/systm.h> +#include <sys/malloc.h> +#include <sys/ioctl.h> +#include <sys/proc.h> +#include <sys/tty.h> +#include <sys/termios.h> + +#include <dev/cons.h> +#include <alpha/wscons/wsconsvar.h> +#include <alpha/wscons/wscons_emul.h> +#include <machine/wsconsio.h> + +cdev_decl(wscons); + +/* Macros to clear/set/test flags. */ +#define SET(t, f) (t) |= (f) +#define CLR(t, f) (t) &= ~(f) +#define ISSET(t, f) ((t) & (f)) + +/* + * Autoconfiguration glue. + */ +struct wscons_softc { + struct device sc_dev; + + struct wscons_emul_data *sc_emul_data; + struct tty *sc_tty; + + wscons_ioctl_t sc_ioctl; + wscons_mmap_t sc_mmap; +}; + +int wsconsmatch __P((struct device *, void *, void *)); +void wsconsattach __P((struct device *, struct device *, void *)); + +struct cfattach wscons_ca = { + sizeof (struct wscons_softc), wsconsmatch, wsconsattach, +}; + +struct cfdriver wscons_cd = { + NULL, "wscons", DV_TTY, +}; + +/* + * Console handing functions and variables. + */ +int wscons_console_attached; /* polled console fns attached */ +int wscons_console_unit = -1; +struct wscons_emul_data wscons_console_emul_data; + +int wscons_cngetc __P((dev_t)); +void wscons_cnputc __P((dev_t, int)); +void wscons_cnpollc __P((dev_t, int)); + +struct consdev wscons_consdev = + { NULL, NULL, wscons_cngetc, wscons_cnputc, wscons_cnpollc, NODEV, 1 }; + +/* + * Input focus handling: where characters from the keyboard are sent. + */ +int wscons_input_focus = -1; + +/* + * TTY interface helpers. + */ + +#define WSCUNIT(dev) minor(dev) + +void wsconsstart __P((struct tty *)); +int wsconsparam __P((struct tty *, struct termios *)); + + +/* + * Output device selection and attachment. + */ + +int +wsconsmatch(parent, cfdata, aux) + struct device *parent; + void *cfdata; + void *aux; +{ + struct wscons_attach_args *waa = aux; + struct cfdata *cf = cfdata; + + if (waa->waa_isconsole && wscons_console_unit != -1) + panic("wsconsmatch: multiple consoles?"); + + /* If console-ness specified... */ + if (cf->wsconscf_console != -1) { + /* + * If exact match, return match with high priority, + * else return don't match. + */ + if ((cf->wsconscf_console && waa->waa_isconsole) || + (!cf->wsconscf_console && !waa->waa_isconsole)) + return (10); + else + return (0); + } + + /* Otherwise match with low priority. */ + return (1); +} + +void +wsconsattach(parent, self, aux) + struct device *parent, *self; + void *aux; +{ + struct wscons_attach_args *waa = aux; + struct wscons_softc *sc = (struct wscons_softc *)self; + int console; + + console = waa->waa_isconsole; + if (console) + printf(": console"); + + /* + * If output has already been set up, record it now. Otherwise, + * do the setup. + */ + if (console) { + sc->sc_emul_data = &wscons_console_emul_data; + wscons_console_unit = sc->sc_dev.dv_unit; + wscons_consdev.cn_dev = + makedev(25, wscons_console_unit); /* XXX */ + } else { + sc->sc_emul_data = malloc(sizeof(*sc->sc_emul_data), M_DEVBUF, + M_WAITOK); + wscons_emul_attach(sc->sc_emul_data, &waa->waa_odev_spec); + } + + /* + * Set wscons input focus if this is the console device, + * or if we've not yet set the input focus. + */ + if (console || wscons_input_focus == -1) + wscons_input_focus = sc->sc_dev.dv_unit; + + /* + * Set up the device's tty structure. + */ + sc->sc_tty = ttymalloc(); + tty_attach(sc->sc_tty); + + /* + * Record other relevant information: ioctl and mmap functions. + */ + sc->sc_ioctl = waa->waa_odev_spec.wo_ioctl; + sc->sc_mmap = waa->waa_odev_spec.wo_mmap; + + printf("\n"); +} + + +/* + * Keyboard input handling. + */ + +void +wscons_input(cp) + char *cp; +{ + struct wscons_softc *sc; + struct tty *tp; + + if (wscons_input_focus == -1) + return; + +#ifdef DIAGNOSTIC + if (wscons_input_focus >= wscons_cd.cd_ndevs) + panic("wscons_input: bogus input focus"); + sc = wscons_cd.cd_devs[wscons_input_focus]; + if (sc == NULL) + panic("wscons_input: null input device"); + tp = sc->sc_tty; + if (tp == NULL) + panic("wscons_input: no tty"); +#else + sc = wscons_cd.cd_devs[wscons_input_focus]; + tp = sc->sc_tty; +#endif + + while (*cp) + (*linesw[tp->t_line].l_rint)(*cp++, tp); +} + + +/* + * Console (output) tty-handling functions. + */ + +int +wsconsopen(dev, flag, mode, p) + dev_t dev; + int flag, mode; + struct proc *p; +{ + struct wscons_softc *sc; + int unit = WSCUNIT(dev), newopen, rv; + struct tty *tp; + + if (unit >= wscons_cd.cd_ndevs) + return ENXIO; + sc = wscons_cd.cd_devs[unit]; + if (sc == NULL) + return ENXIO; + +#ifdef DIAGNOSTIC + if (!sc->sc_tty) + panic("wscopen: no tty!"); +#endif + tp = sc->sc_tty; + + tp->t_oproc = wsconsstart; + tp->t_param = wsconsparam; + tp->t_dev = dev; + newopen = (tp->t_state & TS_ISOPEN) == 0; + if (newopen) { + tp->t_state |= TS_WOPEN; + ttychars(tp); + tp->t_iflag = TTYDEF_IFLAG; + tp->t_oflag = TTYDEF_OFLAG; + tp->t_cflag = TTYDEF_CFLAG; + tp->t_lflag = TTYDEF_LFLAG; + tp->t_ispeed = tp->t_ospeed = TTYDEF_SPEED; + wsconsparam(tp, &tp->t_termios); + ttsetwater(tp); + } else if ((tp->t_state & TS_XCLUDE) != 0 && p->p_ucred->cr_uid != 0) + return EBUSY; + tp->t_state |= TS_CARR_ON; + + rv = ((*linesw[tp->t_line].l_open)(dev, tp)); + if (newopen && (rv == 0)) { + /* set window sizes to be correct */ + tp->t_winsize.ws_row = sc->sc_emul_data->ac_nrow; + tp->t_winsize.ws_col = sc->sc_emul_data->ac_ncol; + } + return (rv); +} + +int +wsconsclose(dev, flag, mode, p) + dev_t dev; + int flag, mode; + struct proc *p; +{ + struct wscons_softc *sc = wscons_cd.cd_devs[WSCUNIT(dev)]; + struct tty *tp = sc->sc_tty; + + (*linesw[tp->t_line].l_close)(tp, flag); + ttyclose(tp); + return(0); +} + +int +wsconsread(dev, uio, flag) + dev_t dev; + struct uio *uio; + int flag; +{ + struct wscons_softc *sc = wscons_cd.cd_devs[WSCUNIT(dev)]; + struct tty *tp = sc->sc_tty; + + return ((*linesw[tp->t_line].l_read)(tp, uio, flag)); +} + +int +wsconswrite(dev, uio, flag) + dev_t dev; + struct uio *uio; + int flag; +{ + struct wscons_softc *sc = wscons_cd.cd_devs[WSCUNIT(dev)]; + struct tty *tp = sc->sc_tty; + + return ((*linesw[tp->t_line].l_write)(tp, uio, flag)); +} + +struct tty * +wsconstty(dev) + dev_t dev; +{ + struct wscons_softc *sc = wscons_cd.cd_devs[WSCUNIT(dev)]; + struct tty *tp = sc->sc_tty; + + return (tp); +} + +int +wsconsioctl(dev, cmd, data, flag, p) + dev_t dev; + u_long cmd; + caddr_t data; + int flag; + struct proc *p; +{ + struct wscons_softc *sc = wscons_cd.cd_devs[WSCUNIT(dev)]; + struct tty *tp = sc->sc_tty; + int error; + + /* do the line discipline ioctls first */ + error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flag, p); + if (error >= 0) + return error; + + /* then the tty ioctls */ + error = ttioctl(tp, cmd, data, flag, p); + if (error >= 0) + return error; + + /* then the underlying frame buffer device ioctls */ + if (sc->sc_ioctl != NULL) + error = (*sc->sc_ioctl)(sc->sc_dev.dv_parent, cmd, data, + flag, p); + if (error >= 0) + return error; + + /* + * then the keyboard ioctls, if we have input focus. + * This is done last because it's a special case: it will + * return ENOTTY (not -1) if it can't figure out what + * to do with the request. + */ + if (WSCUNIT(dev) == wscons_input_focus) + error = kbdioctl(0, cmd, data, flag, p); /* XXX dev */ + else + error = ENOTTY; + + return (error); +} + +int +wsconsmmap(dev, offset, prot) + dev_t dev; + int offset; /* XXX */ + int prot; +{ + struct wscons_softc *sc = wscons_cd.cd_devs[WSCUNIT(dev)]; + + if (sc->sc_ioctl != NULL) + return (*sc->sc_mmap)(sc->sc_dev.dv_parent, offset, prot); + else + return -1; +} + +void +wsconsstart(tp) + register struct tty *tp; +{ + struct wscons_softc *sc; + register int s, n, i; + char buf[OBUFSIZ]; + + s = spltty(); + if (tp->t_state & (TS_TIMEOUT | TS_BUSY | TS_TTSTOP)) { + splx(s); + return; + } + tp->t_state |= TS_BUSY; + splx(s); + + n = q_to_b(&tp->t_outq, buf, sizeof(buf)); + for (i = 0; i < n; ++i) + buf[i] &= 0177; /* strip parity (argh) */ + + sc = wscons_cd.cd_devs[WSCUNIT(tp->t_dev)]; + wscons_emul_input(sc->sc_emul_data, buf, n); + + s = spltty(); + tp->t_state &= ~TS_BUSY; + /* Come back if there's more to do */ + if (tp->t_outq.c_cc) { + tp->t_state |= TS_TIMEOUT; + timeout(ttrstrt, tp, 1); + } + if (tp->t_outq.c_cc <= tp->t_lowat) { + if (tp->t_state&TS_ASLEEP) { + tp->t_state &= ~TS_ASLEEP; + wakeup((caddr_t)&tp->t_outq); + } + selwakeup(&tp->t_wsel); + } + splx(s); +} + +int +wsconsstop(tp, flag) + struct tty *tp; + int flag; +{ + int s; + + /* XXX ??? */ + s = spltty(); + if (ISSET(tp->t_state, TS_BUSY)) + if (!ISSET(tp->t_state, TS_TTSTOP)) + SET(tp->t_state, TS_FLUSH); + splx(s); +} + +/* + * Set line parameters. + */ +int +wsconsparam(tp, t) + struct tty *tp; + struct termios *t; +{ + + tp->t_ispeed = t->c_ispeed; + tp->t_ospeed = t->c_ospeed; + tp->t_cflag = t->c_cflag; + return 0; +} + + +/* + * Polled-console handing setup and manipulation. + */ + +void +wscons_attach_console(wo) + const struct wscons_odev_spec *wo; +{ + + if (wscons_console_attached) + panic("wscons_attach_console: multiple times"); + + wscons_emul_attach(&wscons_console_emul_data, wo); + cn_tab = &wscons_consdev; + wscons_console_attached = 1; +} + +void +wscons_cnputc(dev, ic) + dev_t dev; + int ic; +{ + char c = ic; + + if (wscons_console_attached) + wscons_emul_input(&wscons_console_emul_data, &c, 1); +} + +int +wscons_cngetc(dev) + dev_t dev; +{ + + return kbd_cngetc(dev); /* XXX XXX */ +} + +void +wscons_cnpollc(dev, i) + dev_t dev; + int i; +{ + + kbd_cngetc(dev, i); /* XXX XXX */ +} diff --git a/sys/arch/alpha/wscons/wscons_emul.c b/sys/arch/alpha/wscons/wscons_emul.c new file mode 100644 index 00000000000..cb218fd5cd0 --- /dev/null +++ b/sys/arch/alpha/wscons/wscons_emul.c @@ -0,0 +1,416 @@ +/* $NetBSD: wscons_emul.c,v 1.2 1996/04/12 06:10:29 cgd Exp $ */ + +/* + * Copyright (c) 1995, 1996 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ + +/* + * Console emulator for a 'generic' ANSI X3.64 console. + */ + +#include <sys/param.h> +#include <sys/systm.h> +#include <alpha/wscons/wsconsvar.h> +#include <alpha/wscons/wscons_emul.h> +#include <alpha/wscons/ascii.h> + +void +wscons_emul_attach(we, wo) + struct wscons_emul_data *we; + const struct wscons_odev_spec *wo; +{ + int i; + +#ifdef DIAGNOSTIC + if (we == NULL || wo == NULL) + panic("wscons_emul_attach: bogus args"); + if (wo->wo_ef == NULL) + panic("wscons_emul_attach: bogus emul functions"); +#endif + if (wo->wo_nrows < 0 || wo->wo_ncols < 0) + panic("wscons_emul_attach: bogus size"); + if (wo->wo_crow < 0 || wo->wo_ccol < 0 || + wo->wo_crow >= wo->wo_nrows || wo->wo_ccol >= wo->wo_ncols) + panic("wscons_emul_attach: bogus location (n: %d/%d, c: %d/%d", + wo->wo_nrows, wo->wo_ncols, wo->wo_crow, wo->wo_ccol); + + we->ac_state = ANSICONS_STATE_NORMAL; + we->ac_ef = wo->wo_ef; + we->ac_efa = wo->wo_efa; + + we->ac_nrow = wo->wo_nrows; + we->ac_ncol = wo->wo_ncols; + + we->ac_crow = wo->wo_crow; + we->ac_ccol = wo->wo_ccol; + + for (i = 0; i < ANSICONS_NARGS; i++) + we->ac_args[i] = 0; + + (*we->ac_ef->wef_cursor)(we->ac_efa, 1, we->ac_crow, we->ac_ccol); +} + +static inline int +wscons_emul_input_normal(we, c) + struct wscons_emul_data *we; + char c; +{ + int newstate = ANSICONS_STATE_NORMAL; + int n; + + switch (c) { + case ASCII_BEL: + wscons_kbd_bell(); + break; + + case ASCII_BS: + if (we->ac_ccol > 0) + we->ac_ccol--; + break; + + case ASCII_HT: + n = 8 - (we->ac_ccol & 7); + if (we->ac_ccol + n >= we->ac_ncol) + n = we->ac_ncol - we->ac_ccol - 1; + + (*we->ac_ef->wef_erasecols)(we->ac_efa, we->ac_crow, + we->ac_ccol, we->ac_ccol + n); + + we->ac_ccol += n; + break; + + case ASCII_LF: + if (we->ac_crow < we->ac_nrow - 1) { + we->ac_crow++; + break; + } + +#ifdef DIAGNOSTIC + if (we->ac_crow >= we->ac_nrow) + panic("wscons_emul: didn't scroll (1)"); +#endif + +#if 0 + (*we->ac_ef->wef_copyrows)(we->ac_efa, 1, 0, + we->ac_nrow - 1); + (*we->ac_ef->wef_eraserows)(we->ac_efa, + we->ac_nrow - 1, 1); +#else + (*we->ac_ef->wef_copyrows)(we->ac_efa, 10, 0, + we->ac_nrow - 10); + (*we->ac_ef->wef_eraserows)(we->ac_efa, + we->ac_nrow - 10, 10); + we->ac_crow -= 10 - 1; +#endif + break; + + case ASCII_VT: + if (we->ac_crow > 0) + we->ac_crow--; + break; + + case ASCII_NP: + (*we->ac_ef->wef_eraserows)(we->ac_efa, + 0, we->ac_nrow - 1); + + we->ac_ccol = 0; + we->ac_crow = 0; + break; + + case ASCII_CR: + we->ac_ccol = 0; + break; + + case ASCII_ESC: + if (we->ac_state == ANSICONS_STATE_NORMAL) { + newstate = ANSICONS_STATE_HAVEESC; + break; + } + /* else fall through; we're printing one out */ + + default: + (*we->ac_ef->wef_putstr)(we->ac_efa, + we->ac_crow, we->ac_ccol, &c, 1); + we->ac_ccol++; + + /* if the current column is still on the current line, done. */ + if (we->ac_ccol < we->ac_ncol) + break; + + /* wrap the column around. */ + we->ac_ccol = 0; + + /* if the current row isn't the last, increment and leave. */ + if (we->ac_crow < we->ac_nrow - 1) { + we->ac_crow++; + break; + } + +#ifdef DIAGNOSTIC + /* check against row overflow */ + if (we->ac_crow >= we->ac_nrow) + panic("wscons_emul: didn't scroll (2)"); +#endif + +#if 0 + /* scroll all of the rows up one; leave current row # alone */ + (*we->ac_ef->wef_copyrows)(we->ac_efa, 1, 0, + we->ac_nrow - 1); + (*we->ac_ef->wef_eraserows)(we->ac_efa, + we->ac_nrow - 1, 1); +#else + (*we->ac_ef->wef_copyrows)(we->ac_efa, 10, 0, + we->ac_nrow - 10); + (*we->ac_ef->wef_eraserows)(we->ac_efa, + we->ac_nrow - 10, 10); + we->ac_crow -= 10 - 1; +#endif + break; + } + + return newstate; +} + +static inline int +wscons_emul_input_haveesc(we, c) + struct wscons_emul_data *we; + char c; +{ + int newstate = ANSICONS_STATE_NORMAL; + int i; + + switch (c) { + case '[': + for (i = 0; i < ANSICONS_NARGS; i++) + we->ac_args[i] = 0; + newstate = ANSICONS_STATE_CONTROL; + break; + + default: + wscons_emul_input_normal(we, ASCII_ESC); /* special cased */ + newstate = wscons_emul_input_normal(we, c); + break; + } + + return newstate; +} + +static inline void +wscons_emul_docontrol(we, c) + struct wscons_emul_data *we; + char c; +{ + int n, m; + +#if 0 + printf("control: %c: %d, %d\n", c, we->ac_args[0], we->ac_args[1]); +#endif + switch (c) { + case 'A': /* Cursor Up */ + n = we->ac_args[0] ? we->ac_args[0] : 1; + n = min(n, we->ac_crow); + we->ac_crow -= n; + break; + + case 'B': /* Cursor Down */ + n = we->ac_args[0] ? we->ac_args[0] : 1; + n = min(n, we->ac_nrow - we->ac_crow - 1); + we->ac_crow += n; + break; + + case 'C': /* Cursor Forward */ + n = we->ac_args[0] ? we->ac_args[0] : 1; + n = min(n, we->ac_ncol - we->ac_ccol - 1); + we->ac_ccol += n; + break; + + case 'D': /* Cursor Backward */ + n = we->ac_args[0] ? we->ac_args[0] : 1; + n = min(n, we->ac_ccol); + we->ac_ccol -= n; + break; + + case 'E': /* Cursor Next Line */ + n = we->ac_args[0] ? we->ac_args[0] : 1; + n = min(n, we->ac_nrow - we->ac_crow - 1); + we->ac_crow += n; + we->ac_ccol = 0; + break; + + case 'f': /* Horizontal and Vertical Position */ + case 'H': /* Cursor Position */ + m = we->ac_args[1] ? we->ac_args[1] : 1; /* arg 1 */ + m = min(m, we->ac_nrow); + + n = we->ac_args[0] ? we->ac_args[0] : 1; /* arg 2 */ + n = min(n, we->ac_ncol); + + we->ac_crow = m - 1; + we->ac_ccol = n - 1; + break; + + case 'J': /* Erase in Display */ + (*we->ac_ef->wef_erasecols)(we->ac_efa, we->ac_crow, + we->ac_ccol, we->ac_ncol - we->ac_ccol); + if (we->ac_crow + 1 < we->ac_nrow) + (*we->ac_ef->wef_eraserows)(we->ac_efa, + we->ac_crow + 1, we->ac_nrow - we->ac_crow - 1); + break; + + case 'K': /* Erase in Line */ + (*we->ac_ef->wef_erasecols)(we->ac_efa, we->ac_crow, + we->ac_ccol, we->ac_ncol - we->ac_ccol); + break; + + case 'L': /* Insert Line */ + { + int copy_src, copy_dst, copy_nlines; + + n = we->ac_args[0] ? we->ac_args[0] : 1; + n = min(n, we->ac_nrow - we->ac_crow); + + copy_src = we->ac_crow; + copy_dst = we->ac_crow + n; + copy_nlines = we->ac_nrow - copy_dst; + if (copy_nlines > 0) + (*we->ac_ef->wef_copyrows)(we->ac_efa, + copy_src, copy_dst, copy_nlines); + + (*we->ac_ef->wef_eraserows)(we->ac_efa, + we->ac_crow, n); + } + break; + + case 'M': /* Delete Line */ + { + int copy_src, copy_dst, copy_nlines; + + n = we->ac_args[0] ? we->ac_args[0] : 1; + n = min(n, we->ac_nrow - we->ac_crow); + + copy_src = we->ac_crow + n; + copy_dst = we->ac_crow; + copy_nlines = we->ac_nrow - copy_src; + if (copy_nlines > 0) + (*we->ac_ef->wef_copyrows)(we->ac_efa, + copy_src, copy_dst, copy_nlines); + + (*we->ac_ef->wef_eraserows)(we->ac_efa, + we->ac_crow + copy_nlines, + we->ac_nrow - (we->ac_crow + copy_nlines)); + } + break; + + case 'P': /* Delete Character */ + { + int copy_src, copy_dst, copy_ncols; + + n = we->ac_args[0] ? we->ac_args[0] : 1; + n = min(n, we->ac_ncol - we->ac_ccol); + + copy_src = we->ac_ccol + n; + copy_dst = we->ac_ccol; + copy_ncols = we->ac_ncol - copy_src; + if (copy_ncols > 0) + (*we->ac_ef->wef_copycols)(we->ac_efa, + we->ac_crow, copy_src, copy_dst, + copy_ncols); + + (*we->ac_ef->wef_erasecols)(we->ac_efa, + we->ac_crow, we->ac_ccol + copy_ncols, + we->ac_ncol - (we->ac_ccol + copy_ncols)); + break; + } + break; + } +} + +static inline int +wscons_emul_input_control(we, c) + struct wscons_emul_data *we; + char c; +{ + int newstate = ANSICONS_STATE_CONTROL; + int i; + + switch (c) { + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + we->ac_args[0] *= 10; + we->ac_args[0] += c - '0'; + break; + + case ';': + for (i = 0; i < ANSICONS_NARGS - 1; i++) + we->ac_args[i + 1] = we->ac_args[i]; + we->ac_args[0] = 0; + break; + + default: + wscons_emul_docontrol(we, c); + newstate = ANSICONS_STATE_NORMAL; + break; + } + + return newstate; +} + +void +wscons_emul_input(we, cp, n) + struct wscons_emul_data *we; + char *cp; + int n; +{ + int newstate; + + (*we->ac_ef->wef_cursor)(we->ac_efa, 0, we->ac_crow, we->ac_ccol); + for (; n; n--, cp++) { + switch (we->ac_state) { + case ANSICONS_STATE_NORMAL: + newstate = wscons_emul_input_normal(we, *cp); + break; + + case ANSICONS_STATE_HAVEESC: + newstate = wscons_emul_input_haveesc(we, *cp); + break; + + case ANSICONS_STATE_CONTROL: + newstate = wscons_emul_input_control(we, *cp); + break; + + default: +#ifdef DIAGNOSTIC + panic("wscons_emul: invalid state %d\n", we->ac_state); +#endif + /* try to recover, if things get screwed up... */ + newstate = ANSICONS_STATE_NORMAL; + break; + } + + we->ac_state = newstate; + } + (*we->ac_ef->wef_cursor)(we->ac_efa, 1, we->ac_crow, we->ac_ccol); +} diff --git a/sys/arch/alpha/wscons/wscons_emul.h b/sys/arch/alpha/wscons/wscons_emul.h new file mode 100644 index 00000000000..acae6a9b158 --- /dev/null +++ b/sys/arch/alpha/wscons/wscons_emul.h @@ -0,0 +1,50 @@ +/* $NetBSD: wscons_emul.h,v 1.2 1996/04/12 06:10:32 cgd Exp $ */ + +/* + * Copyright (c) 1995, 1996 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ + +#define ANSICONS_NARGS 4 + +struct wscons_emul_data { + int ac_state; /* current state; see below */ + + const struct wscons_emulfuncs *ac_ef; /* emul. callback functions */ + void *ac_efa; /* arg. for callbacks */ + + int ac_nrow, ac_ncol; /* number of rows/columns */ + int ac_crow, ac_ccol; /* current row/column */ + + u_int ac_args[ANSICONS_NARGS]; /* emulation args */ +}; + +#define ANSICONS_STATE_NORMAL 0 /* normal processing */ +#define ANSICONS_STATE_HAVEESC 1 /* seen start of ctl seq */ +#define ANSICONS_STATE_CONTROL 2 /* processing ctl seq */ + +void wscons_emul_attach __P((struct wscons_emul_data *, + const struct wscons_odev_spec *)); +void wscons_emul_input __P((struct wscons_emul_data *, char *, int)); diff --git a/sys/arch/alpha/wscons/wscons_raster.h b/sys/arch/alpha/wscons/wscons_raster.h new file mode 100644 index 00000000000..33edc0cab95 --- /dev/null +++ b/sys/arch/alpha/wscons/wscons_raster.h @@ -0,0 +1,93 @@ +/* $NetBSD: wscons_raster.h,v 1.1 1996/04/12 02:00:51 cgd Exp $ */ + +/* + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This software was developed by the Computer Systems Engineering group + * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and + * contributed to Berkeley. + * + * All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Lawrence Berkeley Laboratory. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)fbvar.h 8.1 (Berkeley) 6/11/93 + */ + +#ifndef _DEV_PSEUDO_RCONS_H_ +#define _DEV_PSEUDO_RCONS_H_ + +struct rcons { + /* Console raster. Filled in before rcons_init(). */ + struct raster *rc_sp; /* frame buffer raster */ + int *rc_crowp; /* ptr to cursror row */ + int *rc_ccolp; /* ptr to cursror column */ + + /* Number of rows/columns on raster. Filled in by rcons_init(). */ + int rc_maxrow; /* emulator height of screen */ + int rc_maxcol; /* emulator width of screen */ + + /* Font information. Filled in by rcons_init(). */ + struct raster_font *rc_font; /* font and related info */ + int rc_font_ascent; /* distance from font to char origin */ + + /* Raster console state. Filled in by rcons_init(). */ + u_int rc_bits; /* see defines below */ + int rc_xorigin; /* x origin for first column */ + int rc_yorigin; /* y origin for first row */ + int rc_raswidth; /* raster width for row copies */ + int rc_ras_blank; /* current screen blank raster op */ + + /* Internal cursor row and column. XXX Weird Sun cursor pointers. */ + int rc_crow; /* internal cursror row */ + int rc_ccol; /* ptr to cursror column */ +}; + +#define RC_STANDOUT 0x001 /* standout mode */ +/* #define RC_BOLD 0x? /* boldface mode */ +#define RC_INVERT 0x002 /* inverted screen colors */ +#define RC_CURSOR 0x004 /* cursor currently displayed */ + +/* Initialization functions. */ +void rcons_init __P((struct rcons *rc, int mrow, int mcol)); + +/* Console emulation interface functions. See ansicons.h for more info. */ +void rcons_cursor __P((void *, int, int, int)); +void rcons_invert __P((void *, int)); +void rcons_putstr __P((void *, int, int, char *, int)); +void rcons_copycols __P((void *, int, int, int, int)); +void rcons_erasecols __P((void *, int, int, int)); +void rcons_copyrows __P((void *, int, int, int)); +void rcons_eraserows __P((void *, int, int)); + +#endif /* _DEV_PSEUDO_RCONS_H_ */ diff --git a/sys/arch/alpha/wscons/wscons_rfont.h b/sys/arch/alpha/wscons/wscons_rfont.h new file mode 100644 index 00000000000..c836524b372 --- /dev/null +++ b/sys/arch/alpha/wscons/wscons_rfont.h @@ -0,0 +1,1010 @@ +/* $NetBSD: wscons_rfont.h,v 1.1 1996/04/12 02:00:52 cgd Exp $ */ + +/* + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to the Computer Systems + * Engineering Group at Lawrence Berkeley Laboratory and to the University + * of California at Berkeley by Jef Poskanzer. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)gallant19.h 8.1 (Berkeley) 6/11/93 + */ + +static u_int32_t gallant19_32_pixels[] = { + 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x000018c0, 0x000003c0, 0x000030c0, + 0x000030c0, 0x00001ee0, 0x00000000, 0x00000000, 0x00002000, 0x0000e000, + 0x00006000, 0x00006fc0, 0x00006060, 0x00006060, 0x00007060, 0x00004f80, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_32 = { 12, 22, 1, 1, gallant19_32_pixels, 0 }; + +static u_int32_t gallant19_33_pixels[] = { + 0x00000000, + 0x06000000, 0x06000000, 0x06000060, 0x06000060, 0x06000060, 0x060031e0, + 0x06006060, 0x06006060, 0x060070e0, 0x06001e70, 0x06000000, 0x00000000, + 0x00000000, 0x06000000, 0x06000000, 0x000030c0, 0x00006060, 0x00006000, + 0x00003000, 0x00000f80, 0x00000000 +}; +static struct raster gallant19_33 = { 12, 22, 1, 1, gallant19_33_pixels, 0 }; + +static u_int32_t gallant19_34_pixels[] = { + 0x00000000, + 0x19800c00, 0x19801e00, 0x19800000, 0x19800000, 0x19800000, 0x19800000, + 0x00000000, 0x000031e0, 0x000060c0, 0x00003180, 0x00006000, 0x00003fe0, + 0x00004020, 0x00007fc0, 0x00001000, 0x00007000, 0x00003000, 0x000039c0, + 0x000030c0, 0x000030c0, 0x00000000 +}; +static struct raster gallant19_34 = { 12, 22, 1, 1, gallant19_34_pixels, 0 }; + +static u_int32_t gallant19_35_pixels[] = { + 0x00000000, + 0x03300600, 0x03300600, 0x03300600, 0x06601f80, 0x1ff00000, 0x1ff00000, + 0x0cc00000, 0x0cc000c0, 0x19800000, 0x198000c0, 0x7fc000c0, 0x7fc000c0, + 0x330000c0, 0x660000c0, 0x660030c0, 0x00001f00, 0x00006000, 0x00006000, + 0x00006000, 0x00006300, 0x00000000 +}; +static struct raster gallant19_35 = { 12, 22, 1, 1, gallant19_35_pixels, 0 }; + +static u_int32_t gallant19_36_pixels[] = { + 0x00000000, + 0x06000600, 0x1f800600, 0x3fc00600, 0x66e00600, 0x66600600, 0x66001f80, + 0x3e000000, 0x1f800000, 0x07c00000, 0x06600000, 0x06600000, 0x66606ee0, + 0x7fc06660, 0x3f806660, 0x06006660, 0x0000ef70, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_36 = { 12, 22, 1, 1, gallant19_36_pixels, 0 }; + +static u_int32_t gallant19_37_pixels[] = { + 0x00000000, + 0x38600000, 0x44c00000, 0x44c00000, 0x458011c0, 0x39806060, 0x03006060, + 0x03007040, 0x06001f00, 0x0c000000, 0x0c000000, 0x19c00000, 0x1a200000, + 0x32200000, 0x322071c0, 0x61c06060, 0x00006060, 0x00006040, 0x00007f00, + 0x00006000, 0x00006000, 0x00000000 +}; +static struct raster gallant19_37 = { 12, 22, 1, 1, gallant19_37_pixels, 0 }; + +static u_int32_t gallant19_38_pixels[] = { + 0x00000000, + 0x07000060, 0x0f800060, 0x18c00000, 0x18c00000, 0x18c00000, 0x0f8034c0, + 0x1e003000, 0x3e003000, 0x77003000, 0x63607800, 0x61e00000, 0x61c00000, + 0x61800000, 0x3fe00000, 0x1e600000, 0x000030c0, 0x00003800, 0x00000780, + 0x000020c0, 0x00003f80, 0x00000000 +}; +static struct raster gallant19_38 = { 12, 22, 1, 1, gallant19_38_pixels, 0 }; + +static u_int32_t gallant19_39_pixels[] = { + 0x00000000, + 0x0c000c20, 0x1e000780, 0x1e000000, 0x06000000, 0x06000000, 0x0c000000, + 0x18000000, 0x100030c0, 0x000030c0, 0x000030c0, 0x000030c0, 0x00001e60, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00006020, + 0x00003040, 0x00001880, 0x00000000 +}; +static struct raster gallant19_39 = { 12, 22, 1, 1, gallant19_39_pixels, 0 }; + +static u_int32_t gallant19_40_pixels[] = { + 0x00000000, + 0x00c06620, 0x01803b40, 0x03801980, 0x03001980, 0x07000000, 0x06000000, + 0x06000000, 0x06000000, 0x06000000, 0x06007040, 0x07001d00, 0x03000700, + 0x038011c0, 0x0180f1f0, 0x00c00000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00006020, 0x00000000 +}; +static struct raster gallant19_40 = { 12, 22, 1, 1, gallant19_40_pixels, 0 }; + +static u_int32_t gallant19_41_pixels[] = { + 0x00000000, + 0x30000000, 0x180060e0, 0x1c000380, 0x0c000e00, 0x0e003820, 0x06007fe0, + 0x06000000, 0x06000000, 0x060001c0, 0x06000300, 0x0e000180, 0x0c000300, + 0x1c000300, 0x18000180, 0x30000300, 0x000001c0, 0x00000000, 0x00000000, + 0x00000600, 0x00000600, 0x00000000 +}; +static struct raster gallant19_41 = { 12, 22, 1, 1, gallant19_41_pixels, 0 }; + +static u_int32_t gallant19_42_pixels[] = { + 0x00000000, + 0x00003800, 0x00000c00, 0x00001800, 0x00000c00, 0x0f000c00, 0x06001800, + 0x66600c00, 0x76e03800, 0x19800000, 0x00000000, 0x19800000, 0x76e00000, + 0x66600000, 0x06000000, 0x0f001c20, 0x000036c0, 0x00004380, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_42 = { 12, 22, 1, 1, gallant19_42_pixels, 0 }; + +static u_int32_t gallant19_43_pixels[] = { + 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x06000000, + 0x06000000, 0x06000000, 0x06000000, 0x7fe00000, 0x7fe00000, 0x06000000, + 0x06000000, 0x06000000, 0x06000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_43 = { 12, 22, 1, 1, gallant19_43_pixels, 0 }; + +static u_int32_t gallant19_44_pixels[] = { + 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x0c000000, 0x1e000000, 0x1e000000, 0x06000000, 0x06000000, 0x0c000000, + 0x18000000, 0x10000000, 0x00000000 +}; +static struct raster gallant19_44 = { 12, 22, 1, 1, gallant19_44_pixels, 0 }; + +static u_int32_t gallant19_45_pixels[] = { + 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x7fe00000, 0x7fe00000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_45 = { 12, 22, 1, 1, gallant19_45_pixels, 0 }; + +static u_int32_t gallant19_46_pixels[] = { + 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0c000000, + 0x1e000000, 0x1e000000, 0x0c000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_46 = { 12, 22, 1, 1, gallant19_46_pixels, 0 }; + +static u_int32_t gallant19_47_pixels[] = { + 0x00000000, + 0x00600000, 0x00c00000, 0x00c00000, 0x01800000, 0x01800000, 0x03000000, + 0x03000000, 0x06000000, 0x0c000000, 0x0c000000, 0x18000000, 0x18000000, + 0x30000000, 0x30000000, 0x60000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_47 = { 12, 22, 1, 1, gallant19_47_pixels, 0 }; + +static u_int32_t gallant19_48_pixels[] = { + 0x00000000, + 0x07000000, 0x0f800000, 0x11800000, 0x10c00000, 0x30c00000, 0x30c00000, + 0x30c00000, 0x30c00000, 0x30c00000, 0x30c00000, 0x30c00000, 0x30800000, + 0x18800000, 0x1f000000, 0x0e000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_48 = { 12, 22, 1, 1, gallant19_48_pixels, 0 }; + +static u_int32_t gallant19_49_pixels[] = { + 0x00000000, + 0x02000000, 0x06000000, 0x0e000000, 0x1e000000, 0x36000000, 0x06000000, + 0x06000000, 0x06000000, 0x06000000, 0x06000000, 0x06000000, 0x06000000, + 0x06000000, 0x06000000, 0x3fc00000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_49 = { 12, 22, 1, 1, gallant19_49_pixels, 0 }; + +static u_int32_t gallant19_50_pixels[] = { + 0x00000000, + 0x1f000000, 0x3f800000, 0x61c00000, 0x40c00000, 0x00c00000, 0x00c00000, + 0x00c00000, 0x01800000, 0x03000000, 0x06000000, 0x0c000000, 0x18000000, + 0x30200000, 0x7fe00000, 0x7fe00000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_50 = { 12, 22, 1, 1, gallant19_50_pixels, 0 }; + +static u_int32_t gallant19_51_pixels[] = { + 0x00000000, + 0x0f800000, 0x1fc00000, 0x20e00000, 0x40600000, 0x00600000, 0x00e00000, + 0x07c00000, 0x0fc00000, 0x00e00000, 0x00600000, 0x00600000, 0x40600000, + 0x60400000, 0x3f800000, 0x1f000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_51 = { 12, 22, 1, 1, gallant19_51_pixels, 0 }; + +static u_int32_t gallant19_52_pixels[] = { + 0x00000000, + 0x01800000, 0x03800000, 0x03800000, 0x05800000, 0x05800000, 0x09800000, + 0x09800000, 0x11800000, 0x11800000, 0x21800000, 0x3fe00000, 0x7fe00000, + 0x01800000, 0x01800000, 0x01800000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_52 = { 12, 22, 1, 1, gallant19_52_pixels, 0 }; + +static u_int32_t gallant19_53_pixels[] = { + 0x00000000, + 0x0fc00000, 0x0fc00000, 0x10000000, 0x10000000, 0x20000000, 0x3f800000, + 0x31c00000, 0x00e00000, 0x00600000, 0x00600000, 0x00600000, 0x40600000, + 0x60600000, 0x30c00000, 0x1f800000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_53 = { 12, 22, 1, 1, gallant19_53_pixels, 0 }; + +static u_int32_t gallant19_54_pixels[] = { + 0x00000000, + 0x07000000, 0x0c000000, 0x18000000, 0x30000000, 0x30000000, 0x60000000, + 0x67800000, 0x6fc00000, 0x70e00000, 0x60600000, 0x60600000, 0x60600000, + 0x70400000, 0x3f800000, 0x1f000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_54 = { 12, 22, 1, 1, gallant19_54_pixels, 0 }; + +static u_int32_t gallant19_55_pixels[] = { + 0x00000000, + 0x1fe00000, 0x3fe00000, 0x60400000, 0x00400000, 0x00c00000, 0x00800000, + 0x00800000, 0x01800000, 0x01000000, 0x01000000, 0x03000000, 0x02000000, + 0x02000000, 0x06000000, 0x04000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_55 = { 12, 22, 1, 1, gallant19_55_pixels, 0 }; + +static u_int32_t gallant19_56_pixels[] = { + 0x00000000, + 0x0f000000, 0x11800000, 0x30c00000, 0x30c00000, 0x30c00000, 0x18800000, + 0x0d000000, 0x06000000, 0x0b000000, 0x11800000, 0x30c00000, 0x30c00000, + 0x30c00000, 0x18800000, 0x0f000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_56 = { 12, 22, 1, 1, gallant19_56_pixels, 0 }; + +static u_int32_t gallant19_57_pixels[] = { + 0x00000000, + 0x0f800000, 0x11c00000, 0x20e00000, 0x60600000, 0x60600000, 0x60600000, + 0x70e00000, 0x3f600000, 0x1e600000, 0x00600000, 0x00c00000, 0x00c00000, + 0x01800000, 0x07000000, 0x3c000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_57 = { 12, 22, 1, 1, gallant19_57_pixels, 0 }; + +static u_int32_t gallant19_58_pixels[] = { + 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0c000000, + 0x1e000000, 0x1e000000, 0x0c000000, 0x00000000, 0x00000000, 0x0c000000, + 0x1e000000, 0x1e000000, 0x0c000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_58 = { 12, 22, 1, 1, gallant19_58_pixels, 0 }; + +static u_int32_t gallant19_59_pixels[] = { + 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x0c000000, 0x1e000000, 0x1e000000, 0x0c000000, 0x00000000, 0x00000000, + 0x0c000000, 0x1e000000, 0x1e000000, 0x06000000, 0x06000000, 0x0c000000, + 0x18000000, 0x10000000, 0x00000000 +}; +static struct raster gallant19_59 = { 12, 22, 1, 1, gallant19_59_pixels, 0 }; + +static u_int32_t gallant19_60_pixels[] = { + 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00600000, + 0x01c00000, 0x07000000, 0x1e000000, 0x78000000, 0x78000000, 0x1e000000, + 0x07000000, 0x01c00000, 0x00600000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_60 = { 12, 22, 1, 1, gallant19_60_pixels, 0 }; + +static u_int32_t gallant19_61_pixels[] = { + 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x7fc00000, 0x7fc00000, 0x00000000, 0x00000000, 0x7fc00000, + 0x7fc00000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_61 = { 12, 22, 1, 1, gallant19_61_pixels, 0 }; + +static u_int32_t gallant19_62_pixels[] = { + 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x60000000, + 0x38000000, 0x1e000000, 0x07800000, 0x01e00000, 0x01e00000, 0x07800000, + 0x1e000000, 0x38000000, 0x60000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_62 = { 12, 22, 1, 1, gallant19_62_pixels, 0 }; + +static u_int32_t gallant19_63_pixels[] = { + 0x00000000, + 0x0f000000, 0x1f800000, 0x39c00000, 0x20c00000, 0x00c00000, 0x00c00000, + 0x01800000, 0x03000000, 0x06000000, 0x0c000000, 0x0c000000, 0x00000000, + 0x00000000, 0x0c000000, 0x0c000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_63 = { 12, 22, 1, 1, gallant19_63_pixels, 0 }; + +static u_int32_t gallant19_64_pixels[] = { + 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x0f800000, 0x3fc00000, 0x30600000, + 0x60600000, 0x67200000, 0x6fa00000, 0x6ca00000, 0x6ca00000, 0x67e00000, + 0x60000000, 0x30000000, 0x3fe00000, 0x0fe00000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_64 = { 12, 22, 1, 1, gallant19_64_pixels, 0 }; + +static u_int32_t gallant19_65_pixels[] = { + 0x00000000, + 0x00000000, 0x06000000, 0x06000000, 0x0b000000, 0x0b000000, 0x09000000, + 0x11800000, 0x11800000, 0x10800000, 0x3fc00000, 0x20c00000, 0x20400000, + 0x40600000, 0x40600000, 0xe0f00000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_65 = { 12, 22, 1, 1, gallant19_65_pixels, 0 }; + +static u_int32_t gallant19_66_pixels[] = { + 0x00000000, + 0x00000000, 0xff000000, 0x60800000, 0x60c00000, 0x60c00000, 0x60c00000, + 0x61800000, 0x7f800000, 0x60c00000, 0x60600000, 0x60600000, 0x60600000, + 0x60600000, 0x60c00000, 0xff800000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_66 = { 12, 22, 1, 1, gallant19_66_pixels, 0 }; + +static u_int32_t gallant19_67_pixels[] = { + 0x00000000, + 0x00000000, 0x0fc00000, 0x10600000, 0x20200000, 0x20000000, 0x60000000, + 0x60000000, 0x60000000, 0x60000000, 0x60000000, 0x60000000, 0x20000000, + 0x30200000, 0x18400000, 0x0f800000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_67 = { 12, 22, 1, 1, gallant19_67_pixels, 0 }; + +static u_int32_t gallant19_68_pixels[] = { + 0x00000000, + 0x00000000, 0xff000000, 0x61c00000, 0x60c00000, 0x60600000, 0x60600000, + 0x60600000, 0x60600000, 0x60600000, 0x60600000, 0x60600000, 0x60600000, + 0x60400000, 0x61800000, 0xfe000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_68 = { 12, 22, 1, 1, gallant19_68_pixels, 0 }; + +static u_int32_t gallant19_69_pixels[] = { + 0x00000000, + 0x00000000, 0x7fc00000, 0x30400000, 0x30400000, 0x30000000, 0x30000000, + 0x30800000, 0x3f800000, 0x30800000, 0x30000000, 0x30000000, 0x30000000, + 0x30200000, 0x30200000, 0x7fe00000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_69 = { 12, 22, 1, 1, gallant19_69_pixels, 0 }; + +static u_int32_t gallant19_70_pixels[] = { + 0x00000000, + 0x00000000, 0x7fc00000, 0x30400000, 0x30400000, 0x30000000, 0x30000000, + 0x30800000, 0x3f800000, 0x30800000, 0x30000000, 0x30000000, 0x30000000, + 0x30000000, 0x30000000, 0x78000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_70 = { 12, 22, 1, 1, gallant19_70_pixels, 0 }; + +static u_int32_t gallant19_71_pixels[] = { + 0x00000000, + 0x00000000, 0x0fc00000, 0x10600000, 0x20200000, 0x20000000, 0x60000000, + 0x60000000, 0x60000000, 0x60000000, 0x61f00000, 0x60600000, 0x20600000, + 0x30600000, 0x18600000, 0x0f800000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_71 = { 12, 22, 1, 1, gallant19_71_pixels, 0 }; + +static u_int32_t gallant19_72_pixels[] = { + 0x00000000, + 0x00000000, 0xf0f00000, 0x60600000, 0x60600000, 0x60600000, 0x60600000, + 0x60600000, 0x7fe00000, 0x60600000, 0x60600000, 0x60600000, 0x60600000, + 0x60600000, 0x60600000, 0xf0f00000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_72 = { 12, 22, 1, 1, gallant19_72_pixels, 0 }; + +static u_int32_t gallant19_73_pixels[] = { + 0x00000000, + 0x00000000, 0x1f800000, 0x06000000, 0x06000000, 0x06000000, 0x06000000, + 0x06000000, 0x06000000, 0x06000000, 0x06000000, 0x06000000, 0x06000000, + 0x06000000, 0x06000000, 0x1f800000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_73 = { 12, 22, 1, 1, gallant19_73_pixels, 0 }; + +static u_int32_t gallant19_74_pixels[] = { + 0x00000000, + 0x00000000, 0x1f800000, 0x06000000, 0x06000000, 0x06000000, 0x06000000, + 0x06000000, 0x06000000, 0x06000000, 0x06000000, 0x06000000, 0x06000000, + 0x06000000, 0x06000000, 0x06000000, 0x06000000, 0x06000000, 0x04000000, + 0x38000000, 0x30000000, 0x00000000 +}; +static struct raster gallant19_74 = { 12, 22, 1, 1, gallant19_74_pixels, 0 }; + +static u_int32_t gallant19_75_pixels[] = { + 0x00000000, + 0x00000000, 0xf0e00000, 0x61800000, 0x63000000, 0x66000000, 0x6c000000, + 0x78000000, 0x78000000, 0x7c000000, 0x6e000000, 0x67000000, 0x63800000, + 0x61c00000, 0x60e00000, 0xf0700000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_75 = { 12, 22, 1, 1, gallant19_75_pixels, 0 }; + +static u_int32_t gallant19_76_pixels[] = { + 0x00000000, + 0x00000000, 0x78000000, 0x30000000, 0x30000000, 0x30000000, 0x30000000, + 0x30000000, 0x30000000, 0x30000000, 0x30000000, 0x30000000, 0x30000000, + 0x30200000, 0x30200000, 0x7fe00000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_76 = { 12, 22, 1, 1, gallant19_76_pixels, 0 }; + +static u_int32_t gallant19_77_pixels[] = { + 0x00000000, + 0x00000000, 0xe0700000, 0x60e00000, 0x70e00000, 0x70e00000, 0x70e00000, + 0x59600000, 0x59600000, 0x59600000, 0x4d600000, 0x4e600000, 0x4e600000, + 0x44600000, 0x44600000, 0xe4f00000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_77 = { 12, 22, 1, 1, gallant19_77_pixels, 0 }; + +static u_int32_t gallant19_78_pixels[] = { + 0x00000000, + 0x00000000, 0xc0700000, 0x60200000, 0x70200000, 0x78200000, 0x58200000, + 0x4c200000, 0x46200000, 0x47200000, 0x43200000, 0x41a00000, 0x40e00000, + 0x40e00000, 0x40600000, 0xe0300000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_78 = { 12, 22, 1, 1, gallant19_78_pixels, 0 }; + +static u_int32_t gallant19_79_pixels[] = { + 0x00000000, + 0x00000000, 0x0f000000, 0x11c00000, 0x20c00000, 0x20600000, 0x60600000, + 0x60600000, 0x60600000, 0x60600000, 0x60600000, 0x60600000, 0x20400000, + 0x30400000, 0x18800000, 0x0f000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_79 = { 12, 22, 1, 1, gallant19_79_pixels, 0 }; + +static u_int32_t gallant19_80_pixels[] = { + 0x00000000, + 0x00000000, 0x7f800000, 0x30c00000, 0x30600000, 0x30600000, 0x30600000, + 0x30c00000, 0x37800000, 0x30000000, 0x30000000, 0x30000000, 0x30000000, + 0x30000000, 0x30000000, 0x78000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_80 = { 12, 22, 1, 1, gallant19_80_pixels, 0 }; + +static u_int32_t gallant19_81_pixels[] = { + 0x00000000, + 0x00000000, 0x0f000000, 0x11c00000, 0x20c00000, 0x20600000, 0x60600000, + 0x60600000, 0x60600000, 0x60600000, 0x60600000, 0x60600000, 0x30400000, + 0x38400000, 0x1f800000, 0x0e000000, 0x1f000000, 0x23900000, 0x01e00000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_81 = { 12, 22, 1, 1, gallant19_81_pixels, 0 }; + +static u_int32_t gallant19_82_pixels[] = { + 0x00000000, + 0x00000000, 0xff000000, 0x61800000, 0x60c00000, 0x60c00000, 0x60c00000, + 0x60800000, 0x7f000000, 0x7c000000, 0x6e000000, 0x67000000, 0x63800000, + 0x61c00000, 0x60e00000, 0xf0700000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_82 = { 12, 22, 1, 1, gallant19_82_pixels, 0 }; + +static u_int32_t gallant19_83_pixels[] = { + 0x00000000, + 0x00000000, 0x1fe00000, 0x30600000, 0x60200000, 0x60200000, 0x70000000, + 0x3c000000, 0x1e000000, 0x07800000, 0x01c00000, 0x00e00000, 0x40600000, + 0x40600000, 0x60c00000, 0x7f800000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_83 = { 12, 22, 1, 1, gallant19_83_pixels, 0 }; + +static u_int32_t gallant19_84_pixels[] = { + 0x00000000, + 0x00000000, 0x7fe00000, 0x46200000, 0x06000000, 0x06000000, 0x06000000, + 0x06000000, 0x06000000, 0x06000000, 0x06000000, 0x06000000, 0x06000000, + 0x06000000, 0x06000000, 0x1f800000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_84 = { 12, 22, 1, 1, gallant19_84_pixels, 0 }; + +static u_int32_t gallant19_85_pixels[] = { + 0x00000000, + 0x00000000, 0xf0700000, 0x60200000, 0x60200000, 0x60200000, 0x60200000, + 0x60200000, 0x60200000, 0x60200000, 0x60200000, 0x60200000, 0x60200000, + 0x70400000, 0x3fc00000, 0x1f800000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_85 = { 12, 22, 1, 1, gallant19_85_pixels, 0 }; + +static u_int32_t gallant19_86_pixels[] = { + 0x00000000, + 0x00000000, 0xe0e00000, 0x60400000, 0x30800000, 0x30800000, 0x30800000, + 0x19000000, 0x19000000, 0x19000000, 0x0c000000, 0x0e000000, 0x0e000000, + 0x04000000, 0x04000000, 0x04000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_86 = { 12, 22, 1, 1, gallant19_86_pixels, 0 }; + +static u_int32_t gallant19_87_pixels[] = { + 0x00000000, + 0x00000000, 0xfef00000, 0x66200000, 0x66200000, 0x66200000, 0x76200000, + 0x77400000, 0x33400000, 0x37400000, 0x3bc00000, 0x3b800000, 0x19800000, + 0x19800000, 0x19800000, 0x19800000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_87 = { 12, 22, 1, 1, gallant19_87_pixels, 0 }; + +static u_int32_t gallant19_88_pixels[] = { + 0x00000000, + 0x00000000, 0xf0700000, 0x60200000, 0x30400000, 0x38800000, 0x18800000, + 0x0d000000, 0x06000000, 0x06000000, 0x0b000000, 0x11800000, 0x11c00000, + 0x20c00000, 0x40600000, 0xe0f00000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_88 = { 12, 22, 1, 1, gallant19_88_pixels, 0 }; + +static u_int32_t gallant19_89_pixels[] = { + 0x00000000, + 0x00000000, 0xf0700000, 0x60200000, 0x30400000, 0x18800000, 0x18800000, + 0x0d000000, 0x06000000, 0x06000000, 0x06000000, 0x06000000, 0x06000000, + 0x06000000, 0x06000000, 0x0f000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_89 = { 12, 22, 1, 1, gallant19_89_pixels, 0 }; + +static u_int32_t gallant19_90_pixels[] = { + 0x00000000, + 0x00000000, 0x3fe00000, 0x20c00000, 0x00c00000, 0x01800000, 0x01800000, + 0x03000000, 0x03000000, 0x06000000, 0x06000000, 0x0c000000, 0x0c000000, + 0x18000000, 0x18200000, 0x3fe00000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_90 = { 12, 22, 1, 1, gallant19_90_pixels, 0 }; + +static u_int32_t gallant19_91_pixels[] = { + 0x00000000, + 0x07c00000, 0x07c00000, 0x06000000, 0x06000000, 0x06000000, 0x06000000, + 0x06000000, 0x06000000, 0x06000000, 0x06000000, 0x06000000, 0x06000000, + 0x06000000, 0x07c00000, 0x07c00000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_91 = { 12, 22, 1, 1, gallant19_91_pixels, 0 }; + +static u_int32_t gallant19_92_pixels[] = { + 0x00000000, + 0x60000000, 0x60000000, 0x30000000, 0x30000000, 0x18000000, 0x18000000, + 0x0c000000, 0x0c000000, 0x06000000, 0x03000000, 0x03000000, 0x01800000, + 0x01800000, 0x00c00000, 0x00c00000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_92 = { 12, 22, 1, 1, gallant19_92_pixels, 0 }; + +static u_int32_t gallant19_93_pixels[] = { + 0x00000000, + 0x7c000000, 0x7c000000, 0x0c000000, 0x0c000000, 0x0c000000, 0x0c000000, + 0x0c000000, 0x0c000000, 0x0c000000, 0x0c000000, 0x0c000000, 0x0c000000, + 0x0c000000, 0x7c000000, 0x7c000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_93 = { 12, 22, 1, 1, gallant19_93_pixels, 0 }; + +static u_int32_t gallant19_94_pixels[] = { + 0x00000000, + 0x04000000, 0x0e000000, 0x1b000000, 0x31800000, 0x60c00000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_94 = { 12, 22, 1, 1, gallant19_94_pixels, 0 }; + +static u_int32_t gallant19_95_pixels[] = { + 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xfff00000, 0xfff00000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_95 = { 12, 22, 1, 1, gallant19_95_pixels, 0 }; + +static u_int32_t gallant19_96_pixels[] = { + 0x00000000, + 0x01000000, 0x03000000, 0x06000000, 0x06000000, 0x07800000, 0x07800000, + 0x03000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_96 = { 12, 22, 1, 1, gallant19_96_pixels, 0 }; + +static u_int32_t gallant19_97_pixels[] = { + 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0f800000, + 0x18c00000, 0x10c00000, 0x03c00000, 0x1cc00000, 0x30c00000, 0x30c00000, + 0x30c00000, 0x39c00000, 0x1ee00000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_97 = { 12, 22, 1, 1, gallant19_97_pixels, 0 }; + +static u_int32_t gallant19_98_pixels[] = { + 0x00000000, + 0x20000000, 0x60000000, 0xe0000000, 0x60000000, 0x60000000, 0x67800000, + 0x6fc00000, 0x70e00000, 0x60600000, 0x60600000, 0x60600000, 0x60600000, + 0x70600000, 0x78c00000, 0x4f800000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_98 = { 12, 22, 1, 1, gallant19_98_pixels, 0 }; + +static u_int32_t gallant19_99_pixels[] = { + 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x1f800000, + 0x31c00000, 0x20c00000, 0x60000000, 0x60000000, 0x60000000, 0x60000000, + 0x70400000, 0x30c00000, 0x1f800000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_99 = { 12, 22, 1, 1, gallant19_99_pixels, 0 }; + +static u_int32_t gallant19_100_pixels[] = { + 0x00000000, + 0x00600000, 0x00e00000, 0x00600000, 0x00600000, 0x00600000, 0x0f600000, + 0x31e00000, 0x20e00000, 0x60600000, 0x60600000, 0x60600000, 0x60600000, + 0x70e00000, 0x39600000, 0x1e700000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_100 = { 12, 22, 1, 1, gallant19_100_pixels, 0 }; + +static u_int32_t gallant19_101_pixels[] = { + 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0f000000, + 0x30c00000, 0x60600000, 0x60600000, 0x7fe00000, 0x60000000, 0x60000000, + 0x30000000, 0x18600000, 0x0f800000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_101 = { 12, 22, 1, 1, gallant19_101_pixels, 0 }; + +static u_int32_t gallant19_102_pixels[] = { + 0x00000000, + 0x03800000, 0x04c00000, 0x04c00000, 0x0c000000, 0x0c000000, 0x0c000000, + 0x0c000000, 0x1f800000, 0x0c000000, 0x0c000000, 0x0c000000, 0x0c000000, + 0x0c000000, 0x0c000000, 0x1e000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_102 = { 12, 22, 1, 1, gallant19_102_pixels, 0 }; + +static u_int32_t gallant19_103_pixels[] = { + 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x1f200000, + 0x31e00000, 0x60c00000, 0x60c00000, 0x60c00000, 0x31800000, 0x3f000000, + 0x60000000, 0x7fc00000, 0x3fe00000, 0x20600000, 0x40200000, 0x40200000, + 0x7fc00000, 0x3f800000, 0x00000000 +}; +static struct raster gallant19_103 = { 12, 22, 1, 1, gallant19_103_pixels, 0 }; + +static u_int32_t gallant19_104_pixels[] = { + 0x00000000, + 0x10000000, 0x30000000, 0x70000000, 0x30000000, 0x30000000, 0x37800000, + 0x39c00000, 0x30c00000, 0x30c00000, 0x30c00000, 0x30c00000, 0x30c00000, + 0x30c00000, 0x30c00000, 0x79e00000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_104 = { 12, 22, 1, 1, gallant19_104_pixels, 0 }; + +static u_int32_t gallant19_105_pixels[] = { + 0x00000000, + 0x00000000, 0x06000000, 0x06000000, 0x00000000, 0x00000000, 0x1e000000, + 0x06000000, 0x06000000, 0x06000000, 0x06000000, 0x06000000, 0x06000000, + 0x06000000, 0x06000000, 0x1f800000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_105 = { 12, 22, 1, 1, gallant19_105_pixels, 0 }; + +static u_int32_t gallant19_106_pixels[] = { + 0x00000000, + 0x00000000, 0x00c00000, 0x00c00000, 0x00000000, 0x00000000, 0x03c00000, + 0x00c00000, 0x00c00000, 0x00c00000, 0x00c00000, 0x00c00000, 0x00c00000, + 0x00c00000, 0x00c00000, 0x00c00000, 0x20c00000, 0x30c00000, 0x38800000, + 0x1f000000, 0x0e000000, 0x00000000 +}; +static struct raster gallant19_106 = { 12, 22, 1, 1, gallant19_106_pixels, 0 }; + +static u_int32_t gallant19_107_pixels[] = { + 0x00000000, + 0x60000000, 0xe0000000, 0x60000000, 0x60000000, 0x60000000, 0x61c00000, + 0x63000000, 0x66000000, 0x7c000000, 0x78000000, 0x7c000000, 0x6e000000, + 0x67000000, 0x63800000, 0xf1e00000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_107 = { 12, 22, 1, 1, gallant19_107_pixels, 0 }; + +static u_int32_t gallant19_108_pixels[] = { + 0x00000000, + 0x1e000000, 0x06000000, 0x06000000, 0x06000000, 0x06000000, 0x06000000, + 0x06000000, 0x06000000, 0x06000000, 0x06000000, 0x06000000, 0x06000000, + 0x06000000, 0x06000000, 0x1f800000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_108 = { 12, 22, 1, 1, gallant19_108_pixels, 0 }; + +static u_int32_t gallant19_109_pixels[] = { + 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xddc00000, + 0x6ee00000, 0x66600000, 0x66600000, 0x66600000, 0x66600000, 0x66600000, + 0x66600000, 0x66600000, 0xef700000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_109 = { 12, 22, 1, 1, gallant19_109_pixels, 0 }; + +static u_int32_t gallant19_110_pixels[] = { + 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x27800000, + 0x79c00000, 0x30c00000, 0x30c00000, 0x30c00000, 0x30c00000, 0x30c00000, + 0x30c00000, 0x30c00000, 0x79e00000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_110 = { 12, 22, 1, 1, gallant19_110_pixels, 0 }; + +static u_int32_t gallant19_111_pixels[] = { + 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0f800000, + 0x11c00000, 0x20e00000, 0x60600000, 0x60600000, 0x60600000, 0x60600000, + 0x70400000, 0x38800000, 0x1f000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_111 = { 12, 22, 1, 1, gallant19_111_pixels, 0 }; + +static u_int32_t gallant19_112_pixels[] = { + 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xef800000, + 0x71c00000, 0x60e00000, 0x60600000, 0x60600000, 0x60600000, 0x60600000, + 0x60400000, 0x70800000, 0x7f000000, 0x60000000, 0x60000000, 0x60000000, + 0x60000000, 0xf0000000, 0x00000000 +}; +static struct raster gallant19_112 = { 12, 22, 1, 1, gallant19_112_pixels, 0 }; + +static u_int32_t gallant19_113_pixels[] = { + 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0f200000, + 0x11e00000, 0x20e00000, 0x60600000, 0x60600000, 0x60600000, 0x60600000, + 0x70600000, 0x38e00000, 0x1fe00000, 0x00600000, 0x00600000, 0x00600000, + 0x00600000, 0x00f00000, 0x00000000 +}; +static struct raster gallant19_113 = { 12, 22, 1, 1, gallant19_113_pixels, 0 }; + +static u_int32_t gallant19_114_pixels[] = { + 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x73800000, + 0x34c00000, 0x38c00000, 0x30000000, 0x30000000, 0x30000000, 0x30000000, + 0x30000000, 0x30000000, 0x78000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_114 = { 12, 22, 1, 1, gallant19_114_pixels, 0 }; + +static u_int32_t gallant19_115_pixels[] = { + 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x1fc00000, + 0x30c00000, 0x30400000, 0x38000000, 0x1e000000, 0x07800000, 0x01c00000, + 0x20c00000, 0x30c00000, 0x3f800000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_115 = { 12, 22, 1, 1, gallant19_115_pixels, 0 }; + +static u_int32_t gallant19_116_pixels[] = { + 0x00000000, + 0x00000000, 0x00000000, 0x04000000, 0x04000000, 0x0c000000, 0x7fc00000, + 0x0c000000, 0x0c000000, 0x0c000000, 0x0c000000, 0x0c000000, 0x0c000000, + 0x0c200000, 0x0e400000, 0x07800000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_116 = { 12, 22, 1, 1, gallant19_116_pixels, 0 }; + +static u_int32_t gallant19_117_pixels[] = { + 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x79e00000, + 0x30c00000, 0x30c00000, 0x30c00000, 0x30c00000, 0x30c00000, 0x30c00000, + 0x30c00000, 0x39c00000, 0x1e600000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_117 = { 12, 22, 1, 1, gallant19_117_pixels, 0 }; + +static u_int32_t gallant19_118_pixels[] = { + 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xf0700000, + 0x60200000, 0x30400000, 0x30400000, 0x18800000, 0x18800000, 0x0d000000, + 0x0d000000, 0x06000000, 0x06000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_118 = { 12, 22, 1, 1, gallant19_118_pixels, 0 }; + +static u_int32_t gallant19_119_pixels[] = { + 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff700000, + 0x66200000, 0x66200000, 0x66200000, 0x37400000, 0x3b400000, 0x3b400000, + 0x19800000, 0x19800000, 0x19800000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_119 = { 12, 22, 1, 1, gallant19_119_pixels, 0 }; + +static u_int32_t gallant19_120_pixels[] = { + 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xf8f00000, + 0x70400000, 0x38800000, 0x1d000000, 0x0e000000, 0x07000000, 0x0b800000, + 0x11c00000, 0x20e00000, 0xf1f00000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_120 = { 12, 22, 1, 1, gallant19_120_pixels, 0 }; + +static u_int32_t gallant19_121_pixels[] = { + 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xf0f00000, + 0x60200000, 0x30400000, 0x30400000, 0x18800000, 0x18800000, 0x0d000000, + 0x0d000000, 0x06000000, 0x06000000, 0x04000000, 0x0c000000, 0x08000000, + 0x78000000, 0x70000000, 0x00000000 +}; +static struct raster gallant19_121 = { 12, 22, 1, 1, gallant19_121_pixels, 0 }; + +static u_int32_t gallant19_122_pixels[] = { + 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x7fe00000, + 0x60e00000, 0x41c00000, 0x03800000, 0x07000000, 0x0e000000, 0x1c000000, + 0x38200000, 0x70600000, 0x7fe00000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_122 = { 12, 22, 1, 1, gallant19_122_pixels, 0 }; + +static u_int32_t gallant19_123_pixels[] = { + 0x00000000, + 0x01c00000, 0x03000000, 0x03000000, 0x01800000, 0x01800000, 0x01800000, + 0x03000000, 0x07000000, 0x03000000, 0x01800000, 0x01800000, 0x01800000, + 0x03000000, 0x03000000, 0x01c00000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_123 = { 12, 22, 1, 1, gallant19_123_pixels, 0 }; + +static u_int32_t gallant19_124_pixels[] = { + 0x00000000, + 0x06000000, 0x06000000, 0x06000000, 0x06000000, 0x06000000, 0x06000000, + 0x06000000, 0x06000000, 0x06000000, 0x06000000, 0x06000000, 0x06000000, + 0x06000000, 0x06000000, 0x06000000, 0x06000000, 0x06000000, 0x06000000, + 0x06000000, 0x06000000, 0x00000000 +}; +static struct raster gallant19_124 = { 12, 22, 1, 1, gallant19_124_pixels, 0 }; + +static u_int32_t gallant19_125_pixels[] = { + 0x00000000, + 0x38000000, 0x0c000000, 0x0c000000, 0x18000000, 0x18000000, 0x18000000, + 0x0c000000, 0x0e000000, 0x0c000000, 0x18000000, 0x18000000, 0x18000000, + 0x0c000000, 0x0c000000, 0x38000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_125 = { 12, 22, 1, 1, gallant19_125_pixels, 0 }; + +static u_int32_t gallant19_126_pixels[] = { + 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x1c200000, 0x3e600000, 0x36c00000, 0x67c00000, + 0x43800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000 +}; +static struct raster gallant19_126 = { 12, 22, 1, 1, gallant19_126_pixels, 0 }; + +#define null2 {0}, {0} +#define null4 null2, null2 +#define null8 null4, null4 +#define null16 null8, null8 +#define null32 null16, null16 +#define null64 null32, null32 +#define null128 null64, null64 + +struct raster_font gallant19 = { + 12, 22, 15, RASFONT_FIXEDWIDTH|RASFONT_NOVERTICALMOVEMENT, + { + null32, + { &gallant19_32, 0, -15, 12, 0 }, + { &gallant19_33, 0, -15, 12, 0 }, + { &gallant19_34, 0, -15, 12, 0 }, + { &gallant19_35, 0, -15, 12, 0 }, + { &gallant19_36, 0, -15, 12, 0 }, + { &gallant19_37, 0, -15, 12, 0 }, + { &gallant19_38, 0, -15, 12, 0 }, + { &gallant19_39, 0, -15, 12, 0 }, + { &gallant19_40, 0, -15, 12, 0 }, + { &gallant19_41, 0, -15, 12, 0 }, + { &gallant19_42, 0, -15, 12, 0 }, + { &gallant19_43, 0, -15, 12, 0 }, + { &gallant19_44, 0, -15, 12, 0 }, + { &gallant19_45, 0, -15, 12, 0 }, + { &gallant19_46, 0, -15, 12, 0 }, + { &gallant19_47, 0, -15, 12, 0 }, + { &gallant19_48, 0, -15, 12, 0 }, + { &gallant19_49, 0, -15, 12, 0 }, + { &gallant19_50, 0, -15, 12, 0 }, + { &gallant19_51, 0, -15, 12, 0 }, + { &gallant19_52, 0, -15, 12, 0 }, + { &gallant19_53, 0, -15, 12, 0 }, + { &gallant19_54, 0, -15, 12, 0 }, + { &gallant19_55, 0, -15, 12, 0 }, + { &gallant19_56, 0, -15, 12, 0 }, + { &gallant19_57, 0, -15, 12, 0 }, + { &gallant19_58, 0, -15, 12, 0 }, + { &gallant19_59, 0, -15, 12, 0 }, + { &gallant19_60, 0, -15, 12, 0 }, + { &gallant19_61, 0, -15, 12, 0 }, + { &gallant19_62, 0, -15, 12, 0 }, + { &gallant19_63, 0, -15, 12, 0 }, + { &gallant19_64, 0, -15, 12, 0 }, + { &gallant19_65, 0, -15, 12, 0 }, + { &gallant19_66, 0, -15, 12, 0 }, + { &gallant19_67, 0, -15, 12, 0 }, + { &gallant19_68, 0, -15, 12, 0 }, + { &gallant19_69, 0, -15, 12, 0 }, + { &gallant19_70, 0, -15, 12, 0 }, + { &gallant19_71, 0, -15, 12, 0 }, + { &gallant19_72, 0, -15, 12, 0 }, + { &gallant19_73, 0, -15, 12, 0 }, + { &gallant19_74, 0, -15, 12, 0 }, + { &gallant19_75, 0, -15, 12, 0 }, + { &gallant19_76, 0, -15, 12, 0 }, + { &gallant19_77, 0, -15, 12, 0 }, + { &gallant19_78, 0, -15, 12, 0 }, + { &gallant19_79, 0, -15, 12, 0 }, + { &gallant19_80, 0, -15, 12, 0 }, + { &gallant19_81, 0, -15, 12, 0 }, + { &gallant19_82, 0, -15, 12, 0 }, + { &gallant19_83, 0, -15, 12, 0 }, + { &gallant19_84, 0, -15, 12, 0 }, + { &gallant19_85, 0, -15, 12, 0 }, + { &gallant19_86, 0, -15, 12, 0 }, + { &gallant19_87, 0, -15, 12, 0 }, + { &gallant19_88, 0, -15, 12, 0 }, + { &gallant19_89, 0, -15, 12, 0 }, + { &gallant19_90, 0, -15, 12, 0 }, + { &gallant19_91, 0, -15, 12, 0 }, + { &gallant19_92, 0, -15, 12, 0 }, + { &gallant19_93, 0, -15, 12, 0 }, + { &gallant19_94, 0, -15, 12, 0 }, + { &gallant19_95, 0, -15, 12, 0 }, + { &gallant19_96, 0, -15, 12, 0 }, + { &gallant19_97, 0, -15, 12, 0 }, + { &gallant19_98, 0, -15, 12, 0 }, + { &gallant19_99, 0, -15, 12, 0 }, + { &gallant19_100, 0, -15, 12, 0 }, + { &gallant19_101, 0, -15, 12, 0 }, + { &gallant19_102, 0, -15, 12, 0 }, + { &gallant19_103, 0, -15, 12, 0 }, + { &gallant19_104, 0, -15, 12, 0 }, + { &gallant19_105, 0, -15, 12, 0 }, + { &gallant19_106, 0, -15, 12, 0 }, + { &gallant19_107, 0, -15, 12, 0 }, + { &gallant19_108, 0, -15, 12, 0 }, + { &gallant19_109, 0, -15, 12, 0 }, + { &gallant19_110, 0, -15, 12, 0 }, + { &gallant19_111, 0, -15, 12, 0 }, + { &gallant19_112, 0, -15, 12, 0 }, + { &gallant19_113, 0, -15, 12, 0 }, + { &gallant19_114, 0, -15, 12, 0 }, + { &gallant19_115, 0, -15, 12, 0 }, + { &gallant19_116, 0, -15, 12, 0 }, + { &gallant19_117, 0, -15, 12, 0 }, + { &gallant19_118, 0, -15, 12, 0 }, + { &gallant19_119, 0, -15, 12, 0 }, + { &gallant19_120, 0, -15, 12, 0 }, + { &gallant19_121, 0, -15, 12, 0 }, + { &gallant19_122, 0, -15, 12, 0 }, + { &gallant19_123, 0, -15, 12, 0 }, + { &gallant19_124, 0, -15, 12, 0 }, + { &gallant19_125, 0, -15, 12, 0 }, + { &gallant19_126, 0, -15, 12, 0 }, + { 0 }, + null128 + }, +#ifdef COLORFONT_CACHE + (struct raster_fontcache*) -1 +#endif /*COLORFONT_CACHE*/ +}; diff --git a/sys/arch/alpha/wscons/wscons_rinit.c b/sys/arch/alpha/wscons/wscons_rinit.c new file mode 100644 index 00000000000..7b7348a3746 --- /dev/null +++ b/sys/arch/alpha/wscons/wscons_rinit.c @@ -0,0 +1,134 @@ +/* $NetBSD: wscons_rinit.c,v 1.1 1996/04/12 02:00:54 cgd Exp $ */ + +/* + * Copyright (c) 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * This software was developed by the Computer Systems Engineering group + * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and + * contributed to Berkeley. + * + * All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Lawrence Berkeley Laboratory. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)rcons_font.c 8.1 (Berkeley) 6/11/93 + */ + +#include <sys/param.h> +#include <sys/kernel.h> +#include <sys/device.h> + +#include <dev/rcons/raster.h> +#include <alpha/wscons/wscons_raster.h> + +#include <alpha/wscons/wscons_rfont.h> + +void +rcons_initfont(rc, fp) + struct rcons *rc; + struct raster_font *fp; +{ + static int initfontdone; + + rc->rc_font = fp; + + /* Get distance to top and bottom of font from font origin */ + rc->rc_font_ascent = -(rc->rc_font->chars)['a'].homey; + +#if !defined(MSBYTE_FIRST) && !defined(MSBIT_FIRST) /* XXX other cases */ + /* swap byte order on font data. ick. */ + if (!initfontdone) { + int ch, i, n, bit; + u_int32_t *pix, npix; + + for (ch = 0; ch < 256; ch++) { + if (rc->rc_font->chars[ch].r == 0) + continue; + + n = rc->rc_font->chars[ch].r->linelongs * + rc->rc_font->chars[ch].r->height; + pix = rc->rc_font->chars[ch].r->pixels; + + for (i = 0; i < n; i++) { + npix = 0; + for (bit = 0; bit < 32; bit++) + if (pix[i] & (1 << bit)) + npix |= (1 << (31 - bit)); + pix[i] = npix; + } + } + } +#endif + + initfontdone = 1; +} + +void +rcons_init(rc, mrow, mcol) + struct rcons *rc; + int mrow, mcol; +{ + struct raster *rp = rc->rc_sp; + int i; + + rcons_initfont(rc, &gallant19); + + i = rp->height / rc->rc_font->height; + rc->rc_maxrow = min(i, mrow); + + i = rp->width / rc->rc_font->width; + rc->rc_maxcol = min(i, mcol); + + /* Center emulator screen (but align x origin to 32 bits) */ + rc->rc_xorigin = + ((rp->width - rc->rc_maxcol * rc->rc_font->width) / 2) & ~0x1f; + rc->rc_yorigin = + (rp->height - rc->rc_maxrow * rc->rc_font->height) / 2; + + /* Raster width used for row copies */ + rc->rc_raswidth = rc->rc_maxcol * rc->rc_font->width; + if (rc->rc_raswidth & 0x1f) { + /* Pad to 32 bits */ + i = (rc->rc_raswidth + 0x1f) & ~0x1f; + /* Make sure width isn't too wide */ + if (rc->rc_xorigin + i <= rp->width) + rc->rc_raswidth = i; + } + + rc->rc_ras_blank = RAS_CLEAR; + rc->rc_bits = 0; + + /* If cursor position given, assume it's there and drawn. */ + if (*rc->rc_crowp != -1 && *rc->rc_ccolp != -1) + rc->rc_bits |= RC_CURSOR; +} diff --git a/sys/arch/alpha/wscons/wscons_rops.c b/sys/arch/alpha/wscons/wscons_rops.c new file mode 100644 index 00000000000..f571bf184d3 --- /dev/null +++ b/sys/arch/alpha/wscons/wscons_rops.c @@ -0,0 +1,217 @@ +/* $NetBSD: wscons_rops.c,v 1.1 1996/04/12 02:00:55 cgd Exp $ */ + +/* + * Copyright (c) 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * This software was developed by the Computer Systems Engineering group + * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and + * contributed to Berkeley. + * + * All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Lawrence Berkeley Laboratory. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)rcons_subr.c 8.1 (Berkeley) 6/11/93 + */ + +#include <sys/param.h> +#include <sys/device.h> + +#include <dev/rcons/raster.h> +#include <alpha/wscons/wscons_raster.h> + +/* + * Paint (or unpaint) the cursor. + * Pays no lip service to hardware cursors. + */ +void +rcons_cursor(id, on, row, col) + void *id; + int on, row, col; +{ + register struct rcons *rc = id; + register int x, y; + + /* turn the cursor off */ + if (!on) { + /* make sure it's on */ + if ((rc->rc_bits & RC_CURSOR) == 0) + return; + + row = *rc->rc_crowp; + col = *rc->rc_ccolp; + } else { + /* unpaint the old copy. */ + *rc->rc_crowp = row; + *rc->rc_ccolp = col; + } + + x = col * rc->rc_font->width + rc->rc_xorigin; + y = row * rc->rc_font->height + rc->rc_yorigin; + + raster_op(rc->rc_sp, x, y, +#ifdef notdef + /* XXX This is the right way but too slow */ + rc->rc_font->chars[(int)' '].r->width, + rc->rc_font->chars[(int)' '].r->height, +#else + rc->rc_font->width, rc->rc_font->height, +#endif + RAS_INVERT, + (struct raster *) 0, 0, 0); + + rc->rc_bits ^= RC_CURSOR; +} + +/* + * Actually write a string to the frame buffer. + */ +void +rcons_putstr(id, row, col, str, n) + void *id; + int row, col, n; + char *str; +{ + struct rcons *rc = id; + register int x, y, op; + + x = col * rc->rc_font->width + rc->rc_xorigin; + y = row * rc->rc_font->height + rc->rc_font_ascent + rc->rc_yorigin; + + op = RAS_SRC; + if (((rc->rc_bits & RC_STANDOUT) != 0) ^ + ((rc->rc_bits & RC_INVERT) != 0)) + op = RAS_NOT(op); + raster_textn(rc->rc_sp, x, y, op, rc->rc_font, str, n); +} + +/* + * Possibly change to white-on-black or black-on-white modes. + */ +void +rcons_invert(id, inverted) + void *id; + int inverted; +{ + struct rcons *rc = id; + + if (((rc->rc_bits & RC_INVERT) != 0) ^ inverted) { + /* Invert the display */ + raster_op(rc->rc_sp, 0, 0, rc->rc_sp->width, rc->rc_sp->height, + RAS_INVERT, (struct raster *) 0, 0, 0); + + /* Swap things around */ + rc->rc_ras_blank = RAS_NOT(rc->rc_ras_blank); + rc->rc_bits ^= RC_INVERT; + } +} + +/* + * Copy columns (characters) in a row (line). + */ +void +rcons_copycols(id, row, srccol, dstcol, ncols) + void *id; + int row, srccol, dstcol, ncols; +{ + struct rcons *rc = id; + int y, srcx, dstx, nx; + + y = rc->rc_yorigin + rc->rc_font->height * row; + srcx = rc->rc_xorigin + rc->rc_font->width * srccol; + dstx = rc->rc_xorigin + rc->rc_font->width * dstcol; + nx = rc->rc_font->width * ncols; + + raster_op(rc->rc_sp, dstx, y, + nx, rc->rc_font->height, RAS_SRC, + rc->rc_sp, srcx, y); +} + +/* + * Clear columns (characters) in a row (line). + */ +void +rcons_erasecols(id, row, startcol, ncols) + void *id; + int row, startcol, ncols; +{ + struct rcons *rc = id; + int y, startx, nx; + + y = rc->rc_yorigin + rc->rc_font->height * row; + startx = rc->rc_xorigin + rc->rc_font->width * startcol; + nx = rc->rc_font->width * ncols; + + raster_op(rc->rc_sp, startx, y, + nx, rc->rc_font->height, rc->rc_ras_blank, + (struct raster *) 0, 0, 0); +} + +/* + * Copy rows (lines). + */ +void +rcons_copyrows(id, srcrow, dstrow, nrows) + void *id; + int srcrow, dstrow, nrows; +{ + struct rcons *rc = id; + int srcy, dsty, ny; + + srcy = rc->rc_yorigin + rc->rc_font->height * srcrow; + dsty = rc->rc_yorigin + rc->rc_font->height * dstrow; + ny = rc->rc_font->height * nrows; + + raster_op(rc->rc_sp, rc->rc_xorigin, dsty, + rc->rc_raswidth, ny, RAS_SRC, + rc->rc_sp, rc->rc_xorigin, srcy); +} + +/* + * Erase rows (lines). + */ +void +rcons_eraserows(id, startrow, nrows) + void *id; + int startrow, nrows; +{ + struct rcons *rc = id; + int starty, ny; + + starty = rc->rc_yorigin + rc->rc_font->height * startrow; + ny = rc->rc_font->height * nrows; + + raster_op(rc->rc_sp, rc->rc_xorigin, starty, + rc->rc_raswidth, ny, rc->rc_ras_blank, + (struct raster *) 0, 0, 0); +} diff --git a/sys/arch/alpha/wscons/wsconsvar.h b/sys/arch/alpha/wscons/wsconsvar.h new file mode 100644 index 00000000000..433480d52ea --- /dev/null +++ b/sys/arch/alpha/wscons/wsconsvar.h @@ -0,0 +1,111 @@ +/* $NetBSD: wsconsvar.h,v 1.2 1996/04/12 06:10:36 cgd Exp $ */ + +/* + * Copyright (c) 1995, 1996 Carnegie-Mellon University. + * All rights reserved. + * + * Author: Chris G. Demetriou + * + * Permission to use, copy, modify and distribute this software and + * its documentation is hereby granted, provided that both the copyright + * notice and this permission notice appear in all copies of the + * software, derivative works or modified versions, and any portions + * thereof, and that both notices appear in supporting documentation. + * + * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" + * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND + * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. + * + * Carnegie Mellon requests users of this software to return to + * + * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU + * School of Computer Science + * Carnegie Mellon University + * Pittsburgh PA 15213-3890 + * + * any improvements or extensions that they make and grant Carnegie the + * rights to redistribute these changes. + */ + +#ifndef _ALPHA_WSCONS_WSCONSVAR_H_ +#define _ALPHA_WSCONS_WSCONSVAR_H_ + +struct device; + +typedef int (*wscons_ioctl_t) __P((struct device *dev, u_long cmd, + caddr_t data, int flag, struct proc *p)); +typedef int (*wscons_mmap_t) __P((struct device *dev, off_t off, + int prot)); + +struct wscons_emulfuncs { + void (*wef_cursor) __P((void *c, int on, int row, int col)); + void (*wef_putstr) __P((void *c, int row, int col, char *cp, + int n)); + + void (*wef_copycols) __P((void *c, int row, int srccol, int dstcol, + int ncols)); + void (*wef_erasecols) __P((void *c, int row, int startcol, + int ncols)); + + void (*wef_copyrows) __P((void *c, int srcrow, int dstrow, + int nrows)); + void (*wef_eraserows) __P((void *c, int row, int nrows)); +}; + +struct wscons_odev_spec { + const struct wscons_emulfuncs *wo_ef; /* emulation functions */ + void *wo_efa; /* emulation function cookie */ + + int wo_nrows, wo_ncols; /* number of rows & cols */ + int wo_crow, wo_ccol; /* current row & col */ + + wscons_ioctl_t wo_ioctl; + wscons_mmap_t wo_mmap; +}; + +struct wsconsio_bell_data; + +struct wscons_idev_spec { + int (*wi_getc) __P((struct device *c)); + void (*wi_pollc) __P((struct device *c, int on)); + void (*wi_bell) __P((struct device *c, struct wsconsio_bell_data *)); + wscons_ioctl_t wi_ioctl; + char *(*wi_translate) __P((struct device *c, int code)); + int wi_keymask; /* keyboard code mask */ + int wi_keyupmask; /* key went up (vs. down) */ +}; + +struct wscons_mdev_spec { + int (*wm_enable) __P((struct device *)); + int (*wm_disable) __P((struct device *)); +}; + +struct wscons_attach_args { /* attaches output device */ + int waa_isconsole; /* is it the console unit? */ + struct wscons_odev_spec waa_odev_spec; /* mostly ignored if cons. */ +}; + +#define wsconscf_console cf_loc[0] /* spec'd to be console? */ + +/* + * Attach the console output device. This is called _very_ early + * on in the boot process. + */ +void wscons_attach_console __P((const struct wscons_odev_spec *)); + +/* + * Attach the console input device. At this point, it's assumed + * that there can be only one. This happens after the input device + * has been probed. (XXX boot -d won't work...) + */ +void wscons_attach_input __P((struct device *, + const struct wscons_idev_spec *)); + +/* + * Transfer a string of characters from the console input device to + * the wscons buffer. (XXX raw scancodes? pass ioctl, or something? + * then need length.) + */ +void wscons_input __P((char *)); + +#endif /* _ALPHA_WSCONS_WSCONSVAR_H_ */ |