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