summaryrefslogtreecommitdiff
path: root/chips/frc.c
diff options
context:
space:
mode:
authorThomas Bushnell <thomas@gnu.org>1997-02-25 21:28:37 +0000
committerThomas Bushnell <thomas@gnu.org>1997-02-25 21:28:37 +0000
commitf07a4c844da9f0ecae5bbee1ab94be56505f26f7 (patch)
tree12b07c7e578fc1a5f53dbfde2632408491ff2a70 /chips/frc.c
Initial source
Diffstat (limited to 'chips/frc.c')
-rw-r--r--chips/frc.c150
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