Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/nathanw_sa]: src/sys/dev/dmover dmover(9) -- an interface to hardware-as...
details: https://anonhg.NetBSD.org/src/rev/6ce03e4774c2
branches: nathanw_sa
changeset: 506090:6ce03e4774c2
user: thorpej <thorpej%NetBSD.org@localhost>
date: Fri Aug 02 00:30:39 2002 +0000
description:
dmover(9) -- an interface to hardware-assisted data movers. This allows
clients to use a hardware-assisted data mover to clear a region of memory,
fill a region of memory with a specific value, copy a region of memory,
and perform simple boolean operations such as XOR on multiple regions
of memory.
Included here is a software back-end which can serve as an example of
how to write a back-end (and also provides a fall-back in case hardware
for a given function is not available), as well as a dmoverio(4) pseudo-
device which provides access to dmover(9) to userland via a message
passing interface.
dmover(9) is still a work-in-progress -- a few minor changes to the
interface are expected.
diffstat:
sys/dev/dmover/dmover_io.h | 92 ++++++++++++++++++
sys/dev/dmover/dmover_process.c | 199 ++++++++++++++++++++++++++++++++++++++++
sys/dev/dmover/dmover_request.c | 145 +++++++++++++++++++++++++++++
sys/dev/dmover/dmover_session.c | 137 +++++++++++++++++++++++++++
sys/dev/dmover/files.dmover | 19 +++
5 files changed, 592 insertions(+), 0 deletions(-)
diffs (truncated from 612 to 300 lines):
diff -r 715c153ee49e -r 6ce03e4774c2 sys/dev/dmover/dmover_io.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/dev/dmover/dmover_io.h Fri Aug 02 00:30:39 2002 +0000
@@ -0,0 +1,92 @@
+/* $NetBSD: dmover_io.h,v 1.1.2.2 2002/08/02 00:30:39 thorpej Exp $ */
+
+/*
+ * Copyright (c) 2002 Wasabi Systems, Inc.
+ * All rights reserved.
+ *
+ * Written by Jason R. Thorpe for Wasabi Systems, Inc.
+ *
+ * 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 for the NetBSD Project by
+ * Wasabi Systems, Inc.
+ * 4. The name of Wasabi Systems, Inc. may not be used to endorse
+ * or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``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 WASABI SYSTEMS, INC
+ * 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.
+ */
+
+#ifndef _DMOVER_DMOVER_IO_H_
+#define _DMOVER_DMOVER_IO_H_
+
+#include <sys/ioccom.h>
+#include <sys/uio.h>
+
+typedef struct {
+ struct iovec *dmbuf_iov;
+ u_int dmbuf_iovcnt;
+} dmio_buffer;
+
+/*
+ * dmio_usrreq:
+ *
+ * Request structure passed from user-space.
+ */
+struct dmio_usrreq {
+ /* Output buffer. */
+ dmio_buffer req_outbuf;
+
+ /* Input buffer. */
+ union {
+ uint8_t _immediate[8];
+ dmio_buffer *_inbuf;
+ } _req_inbuf_un;
+
+#define req_immediate _req_inbuf_un._immediate
+#define req_inbuf _req_inbuf_un._inbuf
+
+ uint32_t req_id; /* request ID; passed in response */
+};
+
+/*
+ * dmio_usrresp:
+ *
+ * Response structure passed to user-space.
+ */
+struct dmio_usrresp {
+ uint32_t resp_id; /* request ID */
+ int resp_error; /* error, 0 if success */
+};
+
+/*
+ * DMIO_SETFUNC:
+ *
+ * Ioctl to set the function type for the session.
+ */
+#define DMIO_SETFUNC _IOW('D', 0, struct dmio_setfunc)
+
+#define DMIO_MAX_FUNCNAME 64
+struct dmio_setfunc {
+ char dsf_name[DMIO_MAX_FUNCNAME];
+};
+
+#endif /* _DMOVER_DMOVER_IO_H_ */
diff -r 715c153ee49e -r 6ce03e4774c2 sys/dev/dmover/dmover_process.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/dev/dmover/dmover_process.c Fri Aug 02 00:30:39 2002 +0000
@@ -0,0 +1,199 @@
+/* $NetBSD: dmover_process.c,v 1.1.2.2 2002/08/02 00:30:39 thorpej Exp $ */
+
+/*
+ * Copyright (c) 2002 Wasabi Systems, Inc.
+ * All rights reserved.
+ *
+ * Written by Jason R. Thorpe for Wasabi Systems, Inc.
+ *
+ * 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 for the NetBSD Project by
+ * Wasabi Systems, Inc.
+ * 4. The name of Wasabi Systems, Inc. may not be used to endorse
+ * or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``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 WASABI SYSTEMS, INC
+ * 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.
+ */
+
+/*
+ * dmover_process.c: Processing engine for dmover-api.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: dmover_process.c,v 1.1.2.2 2002/08/02 00:30:39 thorpej Exp $");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/proc.h>
+
+#include <machine/intr.h>
+
+#include <dev/dmover/dmovervar.h>
+
+TAILQ_HEAD(, dmover_request) dmover_completed_q;
+struct simplelock dmover_completed_q_slock; /* must be held at splbio */
+
+void *dmover_completed_si;
+
+void dmover_complete(void *);
+
+/*
+ * dmover_process_init:
+ *
+ * Initialize the processing engine.
+ */
+void
+dmover_process_initialize(void)
+{
+
+ TAILQ_INIT(&dmover_completed_q);
+ simple_lock_init(&dmover_completed_q_slock);
+
+ dmover_completed_si = softintr_establish(IPL_SOFTCLOCK,
+ dmover_complete, NULL);
+}
+
+/*
+ * dmover_process: [client interface function]
+ *
+ * Submit a tranform request for processing.
+ */
+void
+dmover_process(struct dmover_request *dreq)
+{
+ struct dmover_session *dses = dreq->dreq_session;
+ struct dmover_assignment *das;
+ struct dmover_backend *dmb;
+ int s;
+
+#ifdef DIAGNOSTIC
+ if ((dreq->dreq_flags & DMOVER_REQ_WAIT) != 0 &&
+ dreq->dreq_callback != NULL)
+ panic("dmover_process: WAIT used with callback");
+#endif
+
+ /* Clear unwanted flag bits. */
+ dreq->dreq_flags &= __DMOVER_REQ_FLAGS_PRESERVE;
+
+ s = splbio();
+
+ /* XXXLOCK */
+
+ /* XXX Right now, the back-end is statically assigned. */
+ das = &dses->__dses_assignment;
+
+ dmb = das->das_backend;
+ dreq->dreq_assignment = das;
+
+ dmover_session_insque(dses, dreq);
+
+ /* XXX Currently, both buffers must be of same type. */
+ if (das->das_algdesc->dad_ninputs != 0 &&
+ dreq->dreq_inbuf_type != dreq->dreq_outbuf_type) {
+ dreq->dreq_error = EINVAL;
+ dreq->dreq_flags |= DMOVER_REQ_ERROR;
+ /* XXXUNLOCK */
+ splx(s);
+ dmover_done(dreq);
+ return;
+ }
+
+ dmover_backend_insque(dmb, dreq);
+
+ /* XXXUNLOCK */
+
+ splx(s);
+
+ /* Kick the back-end into action. */
+ (*dmb->dmb_process)(das->das_backend);
+
+ if (dreq->dreq_flags & DMOVER_REQ_WAIT) {
+ s = splbio();
+ /* XXXLOCK */
+ while ((dreq->dreq_flags & DMOVER_REQ_DONE) == 0)
+ (void) tsleep(dreq, PRIBIO, "dmover", 0);
+ /* XXXUNLOCK */
+ splx(s);
+ }
+}
+
+/*
+ * dmover_done: [back-end interface function]
+ *
+ * Back-end notification that the dmover is done.
+ */
+void
+dmover_done(struct dmover_request *dreq)
+{
+ struct dmover_session *dses = dreq->dreq_session;
+ int s;
+
+ s = splbio();
+
+ /* XXXLOCK */
+
+ dmover_session_remque(dses, dreq);
+ /* backend has removed it from its queue */
+
+ /* XXXUNLOCK */
+
+ dreq->dreq_flags |= DMOVER_REQ_DONE;
+ dreq->dreq_flags &= ~DMOVER_REQ_RUNNING;
+ dreq->dreq_assignment = NULL;
+
+ if (dreq->dreq_callback != NULL) {
+ simple_lock(&dmover_completed_q_slock);
+ TAILQ_INSERT_TAIL(&dmover_completed_q, dreq, dreq_dmbq);
+ simple_unlock(&dmover_completed_q_slock);
+ softintr_schedule(dmover_completed_si);
+ } else if (dreq->dreq_flags & DMOVER_REQ_WAIT)
+ wakeup(dreq);
+
+ splx(s);
+}
+
+/*
+ * dmover_complete:
+ *
+ * Complete a request by invoking the callback.
+ */
+void
+dmover_complete(void *arg)
+{
+ struct dmover_request *dreq;
+ int s;
+
+ for (;;) {
+ s = splbio();
+ simple_lock(&dmover_completed_q_slock);
+ if ((dreq = TAILQ_FIRST(&dmover_completed_q)) != NULL)
+ TAILQ_REMOVE(&dmover_completed_q, dreq, dreq_dmbq);
+ simple_unlock(&dmover_completed_q_slock);
+ splx(s);
+
+ if (dreq == NULL)
+ return;
+
+ (*dreq->dreq_callback)(dreq);
+ }
+}
diff -r 715c153ee49e -r 6ce03e4774c2 sys/dev/dmover/dmover_request.c
Home |
Main Index |
Thread Index |
Old Index