summaryrefslogtreecommitdiff
path: root/sys/pci/xrpu.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/pci/xrpu.c')
-rw-r--r--sys/pci/xrpu.c216
1 files changed, 28 insertions, 188 deletions
diff --git a/sys/pci/xrpu.c b/sys/pci/xrpu.c
index 25a90a471d8f2..b46a3952dbcdd 100644
--- a/sys/pci/xrpu.c
+++ b/sys/pci/xrpu.c
@@ -6,7 +6,7 @@
* this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
* ----------------------------------------------------------------------------
*
- * $Id: xrpu.c,v 1.5 1998/12/14 06:32:58 dillon Exp $
+ * $Id: xrpu.c,v 1.1 1998/05/30 18:28:11 phk Exp $
*
* A very simple device driver for PCI cards based on Xilinx 6200 series
* FPGA/RPU devices. Current Functionality is to allow you to open and
@@ -17,199 +17,52 @@
*
*/
-#include "xrpu.h"
+#ifndef DEVFS
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/conf.h>
#include <sys/kernel.h>
-#include <sys/malloc.h>
-#include <sys/timepps.h>
#include <sys/devfsext.h>
-#include <sys/xrpuio.h>
#include <pci/pcireg.h>
#include <pci/pcivar.h>
-static const char* xrpu_probe (pcici_t tag, pcidi_t type);
+static char* xrpu_probe (pcici_t tag, pcidi_t type);
static void xrpu_attach (pcici_t tag, int unit);
static u_long xrpu_count;
-static void xrpu_poll_pps(struct timecounter *tc);
-
-/*
- * Device driver initialization stuff
- */
-
-static d_open_t xrpu_open;
-static d_close_t xrpu_close;
-static d_ioctl_t xrpu_ioctl;
-static d_mmap_t xrpu_mmap;
-
-#define CDEV_MAJOR 100
-static struct cdevsw xrpudevsw = {
- xrpu_open, xrpu_close, noread, nowrite,
- xrpu_ioctl, nullstop, noreset, nodevtotty,
- seltrue, xrpu_mmap, nostrategy, "xrpu",
- NULL, -1
-};
-
-static MALLOC_DEFINE(M_XRPU, "xrpu", "XRPU related");
-
-#define dev2unit(devt) (minor(devt) & 0xff)
-#define dev2pps(devt) ((minor(devt) >> 16)-1)
-
-static struct softc {
- pcici_t tag;
- enum { NORMAL, TIMECOUNTER } mode;
- vm_offset_t virbase, physbase;
- u_int *virbase62;
- struct timecounter tc;
- u_int *trigger, *latch, dummy;
- struct {
- pps_params_t params;
- pps_info_t info;
- int cap;
- u_int *assert, last_assert;
- u_int *clear, last_clear;
- } pps[XRPU_MAX_PPS];
-} *softc[NXRPU];
-
-static unsigned
-xrpu_get_timecount(struct timecounter *tc)
-{
- struct softc *sc = tc->tc_priv;
-
- sc->dummy += *sc->trigger;
- return (*sc->latch & tc->tc_counter_mask);
-}
-
-void
-xrpu_poll_pps(struct timecounter *tc)
-{
- struct softc *sc = tc->tc_priv;
- int i;
- unsigned count1, ppscount;
-
- for (i = 0; i < XRPU_MAX_PPS; i++) {
- if (sc->pps[i].assert) {
- ppscount = *(sc->pps[i].assert) & tc->tc_counter_mask;
- do {
- count1 = ppscount;
- ppscount = *(sc->pps[i].assert) & tc->tc_counter_mask;
- } while (ppscount != count1);
- if (ppscount != sc->pps[i].last_assert) {
- timecounter_timespec(ppscount, &sc->pps[i].info.assert_timestamp);
- if (sc->pps[i].params.mode & PPS_OFFSETASSERT) {
- timespecadd(&sc->pps[i].info.assert_timestamp,
- &sc->pps[i].params.assert_offset);
- if (sc->pps[i].info.assert_timestamp.tv_nsec < 0) {
- sc->pps[i].info.assert_timestamp.tv_nsec += 1000000000;
- sc->pps[i].info.assert_timestamp.tv_sec -= 1;
- }
- }
- sc->pps[i].info.assert_sequence++;
- sc->pps[i].last_assert = ppscount;
- }
- }
- if (sc->pps[i].clear) {
- ppscount = *(sc->pps[i].clear) & tc->tc_counter_mask;
- do {
- count1 = ppscount;
- ppscount = *(sc->pps[i].clear) & tc->tc_counter_mask;
- } while (ppscount != count1);
- if (ppscount != sc->pps[i].last_clear) {
- timecounter_timespec(ppscount, &sc->pps[i].info.clear_timestamp);
- if (sc->pps[i].params.mode & PPS_OFFSETASSERT) {
- timespecadd(&sc->pps[i].info.clear_timestamp,
- &sc->pps[i].params.clear_offset);
- if (sc->pps[i].info.clear_timestamp.tv_nsec < 0) {
- sc->pps[i].info.clear_timestamp.tv_nsec += 1000000000;
- sc->pps[i].info.clear_timestamp.tv_sec -= 1;
- }
- }
- sc->pps[i].info.clear_sequence++;
- sc->pps[i].last_clear = ppscount;
- }
- }
- }
-}
+static vm_offset_t virbase, physbase;
static int
-xrpu_open(dev_t dev, int flag, int mode, struct proc *p)
+xrpuopen(dev_t dev, int flag, int mode, struct proc *p)
{
return (0);
}
static int
-xrpu_close(dev_t dev, int flag, int mode, struct proc *p)
+xrpuclose(dev_t dev, int flag, int mode, struct proc *p)
{
return (0);
}
static int
-xrpu_mmap(dev_t dev, vm_offset_t offset, int nprot)
+xrpummap(dev_t dev, int offset, int nprot)
{
- struct softc *sc = softc[dev2unit(dev)];
if (offset >= 0x1000000)
return (-1);
- return (i386_btop(sc->physbase + offset));
+ return (i386_btop(physbase + offset));
}
-static int
-xrpu_ioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct proc *pr)
-{
- struct softc *sc = softc[dev2unit(dev)];
- int i, error;
-
- if (sc->mode == TIMECOUNTER) {
- i = dev2pps(dev);
- if (i < 0 || i >= XRPU_MAX_PPS)
- return ENODEV;
- if (!sc->pps[i].cap)
- return ENODEV;
- error = std_pps_ioctl(cmd, arg, &sc->pps[i].params,
- &sc->pps[i].info, sc->pps[i].cap);
- return (error);
- }
-
- if (cmd == XRPU_IOC_TIMECOUNTING) {
- struct xrpu_timecounting *xt = (struct xrpu_timecounting *)arg;
-
- /* Name SHALL be zero terminated */
- xt->xt_name[sizeof xt->xt_name - 1] = '\0';
- i = strlen(xt->xt_name);
- sc->tc.tc_name = (char *)malloc(i + 1, M_XRPU, M_WAITOK);
- strcpy(sc->tc.tc_name, xt->xt_name);
- sc->tc.tc_frequency = xt->xt_frequency;
- sc->tc.tc_get_timecount = xrpu_get_timecount;
- sc->tc.tc_poll_pps = xrpu_poll_pps;
- sc->tc.tc_priv = sc;
- sc->tc.tc_counter_mask = xt->xt_mask;
- sc->trigger = sc->virbase62 + xt->xt_addr_trigger;
- sc->latch = sc->virbase62 + xt->xt_addr_latch;
+/*
+ * Device driver initialization stuff
+ */
- for (i = 0; i < XRPU_MAX_PPS; i++) {
- if (xt->xt_pps[i].xt_addr_assert == 0
- && xt->xt_pps[i].xt_addr_clear == 0)
- continue;
- devfs_add_devswf(&xrpudevsw, (i+1)<<16, DV_CHR, UID_ROOT, GID_WHEEL, 0600,
- "xpps%d", i);
- /* DEVFS */
- if (xt->xt_pps[i].xt_addr_assert) {
- sc->pps[i].assert = sc->virbase62 + xt->xt_pps[i].xt_addr_assert;
- sc->pps[i].cap |= PPS_CAPTUREASSERT | PPS_OFFSETASSERT;
- }
- if (xt->xt_pps[i].xt_addr_clear) {
- sc->pps[i].clear = sc->virbase62 + xt->xt_pps[i].xt_addr_clear;
- sc->pps[i].cap |= PPS_CAPTURECLEAR | PPS_OFFSETCLEAR;
- }
- }
- sc->mode = TIMECOUNTER;
- init_timecounter(&sc->tc);
- return (0);
- }
- error = ENOTTY;
- return (error);
-}
+#define CDEV_MAJOR 100
+static struct cdevsw xrpudevsw = {
+ xrpuopen, xrpuclose, noread, nowrite,
+ noioctl, nullstop, noreset, nodevtotty,
+ seltrue, xrpummap, nostrategy, "xrpu",
+ NULL, -1
+};
/*
* PCI initialization stuff
@@ -225,15 +78,13 @@ static struct pci_device xrpu_device = {
DATA_SET (pcidevice_set, xrpu_device);
-static const char*
+static char*
xrpu_probe (pcici_t tag, pcidi_t typea)
{
- u_int id;
+ int data = pci_conf_read(tag, PCI_CLASS_REG);
+ u_int id = pci_conf_read(tag, PCI_ID_REG);
const char *vendor, *chip, *type;
- (void)pci_conf_read(tag, PCI_CLASS_REG);
- id = pci_conf_read(tag, PCI_ID_REG);
-
vendor = chip = type = 0;
if (id == 0x6216133e) {
@@ -245,27 +96,16 @@ xrpu_probe (pcici_t tag, pcidi_t typea)
static void
xrpu_attach (pcici_t tag, int unit)
{
- struct softc *sc;
- dev_t cdev = makedev(CDEV_MAJOR, unit);
-
- sc = (struct softc *)malloc(sizeof *sc, M_XRPU, M_WAITOK);
- softc[unit] = sc;
- bzero(sc, sizeof *sc);
-
- sc->tag = tag;
- sc->mode = NORMAL;
-
- pci_map_mem(tag, PCI_MAP_REG_START, &sc->virbase, &sc->physbase);
+ dev_t cdev = makedev(CDEV_MAJOR, 0);
- sc->virbase62 = (u_int *)(sc->virbase + 0x800000);
+ pci_map_mem(tag, PCI_MAP_REG_START, &virbase, &physbase);
- if (bootverbose)
- printf("Mapped physbase %#lx to virbase %#lx\n",
- (u_long)sc->physbase, (u_long)sc->virbase);
+ printf("Mapped physbase %#lx to virbase %#lx\n",
+ (u_long)physbase, (u_long)virbase);
- if (!unit)
- cdevsw_add(&cdev, &xrpudevsw, NULL);
+ cdevsw_add(&cdev, &xrpudevsw, NULL);
devfs_add_devswf(&xrpudevsw, 0, DV_CHR, UID_ROOT, GID_WHEEL, 0600,
- "xrpu%d", unit);
+ "xrpu0");
}
+#endif /* DEVFS */