diff options
Diffstat (limited to 'chips/frc.c')
-rw-r--r-- | chips/frc.c | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/chips/frc.c b/chips/frc.c new file mode 100644 index 0000000..7f033c3 --- /dev/null +++ b/chips/frc.c @@ -0,0 +1,150 @@ +/* + * Mach Operating System + * Copyright (c) 1993,1992 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. + */ +/* + * File: frc.c + * Author: Alessandro Forin, Carnegie Mellon University + * Date: 3/92 + * + * Generic, mappable free running counter driver. + */ + +#include <frc.h> +#if NFRC > 0 + +#include <mach/std_types.h> +#include <chips/busses.h> +#include <device/device_types.h> + +/* + * Machine defines + * All you need to do to get this working on a + * random box is to define one macro and provide + * the correct virtual address. + */ +#include <platforms.h> +#ifdef DECSTATION +#define btop(x) mips_btop(x) +#endif /* DECSTATION */ + +/* + * Autoconf info + */ + +static vm_offset_t frc_std[NFRC] = { 0 }; +static vm_size_t frc_offset[NFRC] = { 0 }; +static struct bus_device *frc_info[NFRC]; +static int frc_probe(vm_offset_t,struct bus_ctlr *); +static void frc_attach(struct bus_device *); + +struct bus_driver frc_driver = + { frc_probe, 0, frc_attach, 0, frc_std, "frc", frc_info, }; + +/* + * Externally visible functions + */ +io_return_t frc_openclose(int,int); /* user */ +vm_offset_t frc_mmap(int,vm_offset_t,vm_prot_t); +void frc_set_address(int,vm_size_t); + +/* + * FRC's in kernel virtual memory. For in-kernel timestamps. + */ +vm_offset_t frc_address[NFRC]; + +/* machine-specific setups */ +void +frc_set_address( + int unit, + vm_size_t offset) +{ + if (unit < NFRC) { + frc_offset[unit] = offset; + } +} + + +/* + * Probe chip to see if it is there + */ +static frc_probe ( + vm_offset_t reg, + struct bus_ctlr *ui) +{ + /* see if something present at the given address */ + if (check_memory(reg, 0)) { + frc_address[ui->unit] = 0; + return 0; + } + frc_std[ui->unit] = (vm_offset_t) reg; + printf("[mappable] "); + return 1; +} + +static void +frc_attach ( + struct bus_device *ui) +{ + if (ui->unit < NFRC) { + frc_address[ui->unit] = + (vm_offset_t) frc_std[ui->unit] + frc_offset[ui->unit]; + printf(": free running counter %d at kernel vaddr 0x%x", + ui->unit, frc_address[ui->unit]); + } + else + panic("frc: unknown unit number"); /* shouldn't happen */ +} + +int frc_intr() +{ + /* we do not expect interrupts */ + panic("frc_intr"); +} + +io_return_t +frc_openclose( + int dev, + int flag) +{ + if (frc_std[dev]) + return D_SUCCESS; + else + return D_NO_SUCH_DEVICE; +} + +vm_offset_t +frc_mmap( + int dev, + vm_offset_t off, + vm_prot_t prot) +{ + vm_offset_t addr; + if ((prot & VM_PROT_WRITE) || (off >= PAGE_SIZE) ) + return (-1); + addr = (vm_offset_t) frc_std[dev] + frc_offset[dev]; + return btop(pmap_extract(pmap_kernel(), addr)); +} + +#endif |