DeviceQueues: Small changes to interface and Adding empty c functions
authorRoni Häcki <roni.haecki@inf.ethz.ch>
Wed, 13 Jul 2016 15:31:47 +0000 (17:31 +0200)
committerRoni Häcki <roni.haecki@inf.ethz.ch>
Wed, 13 Jul 2016 15:31:47 +0000 (17:31 +0200)
Signed-off-by: Roni Häcki <roni.haecki@inf.ethz.ch>

include/device_interfaces/device_queue_interface.h
lib/device_interfaces/Hakefile [new file with mode: 0644]
lib/device_interfaces/device_queue_interface.c [new file with mode: 0644]
lib/device_interfaces/region_pool.c [new file with mode: 0644]
lib/device_interfaces/region_pool.h [new file with mode: 0644]

index 478e91f..d2c59af 100644 (file)
 
 #include <barrelfish/barrelfish.h>
 
+#define MAX_DEVICE_NAME 256
+
 typedef uint32_t regionid_t;
 typedef uint32_t bufferid_t;
 
+struct region_pool;
+
+
 /**
  * Represent the device queue itself
  */
@@ -22,13 +27,16 @@ struct device_queue {
 
     uint32_t queue_id;
 
+    // device type
+    uint8_t device_type;
+
     // name of the device
-    char* device_name;
+    char device_name[MAX_DEVICE_NAME];
     // pointer to device queue state
     void* q_state;
 
     //TODO Other state needed ...
-    
+    struct region_pool* pool;
 };
 
 
@@ -41,7 +49,11 @@ struct device_queue_buffer {
     lpaddr_t base;
     // length of the buffer
     size_t len;
-}
+    // READ/WRITE permissions
+    uint8_t flags;
+    // buffer chaining for dst, result etc.
+    struct device_queue_buffer* next;
+};
 
 /*
  * ===========================================================================
@@ -83,8 +95,8 @@ errval_t device_queue_destroy(struct device_queue *qp);
  * Datapath functions
  * ===========================================================================
  */
-
-/**
+/*
+ *
  * @brief enqueue a buffer into the device queue
  *
  * @param q             The device queue to call the operation on
@@ -98,13 +110,14 @@ errval_t device_queue_destroy(struct device_queue *qp);
  * @returns error on failure or SYS_ERR_OK on success
  *
  */
+/*
 errval_t device_queue_enqueue(struct device_queue *q,
                               regionid_t region_id,
                               lpaddr_t base,
                               size_t length,
                               bufferid_t buffer_id,
                               char* misc_flags);
-
+*/
 /**
  * @brief enqueue some memory into the device queue
  *
@@ -135,12 +148,13 @@ errval_t device_queue_enqueue(struct device_queue *q,
  * @returns error on failure or SYS_ERR_OK on success
  *
  */
+/*
 errval_t device_queue_dequeue(struct device_queue *q,
                               regionid_t* region_id,
                               lpaddr_t* base,
                               size_t* length,
                               bufferid_t* buffer_id);
-
+*/
 /**
  * @brief dequeue a buffer from the device queue
  *
@@ -151,7 +165,7 @@ errval_t device_queue_dequeue(struct device_queue *q,
  *
  */
 errval_t device_queue_dequeue(struct device_queue *q,
-                              struct device_queue_buf** buf);
+                              struct device_queue_buffer** buf);
 /*
  * ===========================================================================
  * Control Path
@@ -185,9 +199,9 @@ errval_t device_queue_register(struct device_queue *q,
 * @returns error on failure or SYS_ERR_OK on success
 *
 */
-errval_t device_queue_register(struct device_queue *q,
-                               regionid_t region_id,
-                               struct capref* cap);
+errval_t device_queue_deregister(struct device_queue *q,
+                                 regionid_t region_id,
+                                 struct capref* cap);
 
 /**
 * @brief Send a notification about new buffers on the queue
diff --git a/lib/device_interfaces/Hakefile b/lib/device_interfaces/Hakefile
new file mode 100644 (file)
index 0000000..308f6a6
--- /dev/null
@@ -0,0 +1,21 @@
+--------------------------------------------------------------------------
+-- Copyright (c) 2016, ETH Zurich.
+-- All rights reserved.
+--
+-- This file is distributed under the terms in the attached LICENSE file.
+-- If you do not find this file, copies can be found by writing to:
+-- ETH Zurich D-INFK, Universitaetstr. 6, CH-8092 Zurich. Attn: Systems Group.
+--
+-- Hakefile for lib/device_interfaces
+-- 
+-- Provides a general interface for device drivers.
+--
+--------------------------------------------------------------------------
+
+[
+    build library { 
+        target = "device_interface",
+        cFiles = ["device_queue_interface.c", "region_pool.c"],
+        addCFlags = [ "-DLIBRARY" ]
+    }
+]
diff --git a/lib/device_interfaces/device_queue_interface.c b/lib/device_interfaces/device_queue_interface.c
new file mode 100644 (file)
index 0000000..1ef5f17
--- /dev/null
@@ -0,0 +1,218 @@
+/*
+ * Copyright (c) 2016 ETH Zurich.
+ * All rights reserved.
+ *
+ * This file is distributed under the terms in the attached LICENSE file.
+ * If you do not find this file, copies can be found by writing to:
+ * ETH Zurich D-INFK, Universitaetstr. 6, CH-8092 Zurich. Attn: Systems Group.
+ */
+
+#include <barrelfish/barrelfish.h>
+#include <device_interfaces/device_queue_interface.h>
+#include "region_pool.h"
+ /*
+ * ===========================================================================
+ * Device queue creation and destruction
+ * ===========================================================================
+ */
+
+
+ /**
+  * @brief creates a queue 
+  *
+  * @param q             Return pointer to the device_queue (handle)
+  * @param device_name   Device name of the device to which this queue belongs
+  *                      (Driver itself is running in a separate process)
+  * @param misc          Anything you can think of that makes sense for the device
+  *                      and its driver?
+  *
+  * @returns error on failure or SYS_ERR_OK on success
+  */
+
+errval_t device_queue_create(struct device_queue **q,
+                             char* device_name,
+                             char* misc)
+{
+    USER_PANIC("NIY\n");
+    return SYS_ERR_OK;
+}
+
+
+ /**
+  * @brief destroys the device queue
+  *
+  * @param q           The queue state to free (and the device queue to be 
+                       shut down in the driver)
+  *
+  * @returns error on failure or SYS_ERR_OK on success
+  */
+errval_t device_queue_destroy(struct device_queue *qp)
+{
+    USER_PANIC("NIY\n");
+    return SYS_ERR_OK;
+}
+
+/*
+ * ===========================================================================
+ * Datapath functions
+ * ===========================================================================
+ */
+
+/**
+ * @brief enqueue a buffer into the device queue
+ *
+ * @param q             The device queue to call the operation on
+ * @param region_id     Id of the memory region the buffer belongs to
+ * @param base          Physical address of the start of the enqueued buffer
+ * @param lenght        Lenght of the enqueued buffer
+ * @param buffer_id     The buffer id of the enqueue buffer (TODO only for 
+ *                      fixed size buffers?)
+ * @param misc_flags    Any other argument that makes sense to the device queue
+ *
+ * @returns error on failure or SYS_ERR_OK on success
+ *
+ */
+/*
+errval_t device_queue_enqueue(struct device_queue *q,
+                              regionid_t region_id,
+                              lpaddr_t base,
+                              size_t length,
+                              bufferid_t buffer_id,
+                              char* misc_flags)
+{
+    USER_PANIC("NIY\n");
+    return SYS_ERR_OK;
+}
+*/
+/**
+ * @brief enqueue some memory into the device queue
+ *
+ * @param q             The device queue to call the operation on
+ * @param buf           Buffer to enqueue (includes physical address, lenght, 
+ *                      region id and buffer id)
+ * @param misc_flags    Any other argument that makes sense to the device queue
+ *
+ * @returns error on failure or SYS_ERR_OK on success
+ *
+ */
+errval_t device_queue_enqueue(struct device_queue *q,
+                              struct device_queue_buffer* buf,
+                              char* misc_flags)
+{
+    USER_PANIC("NIY\n");
+    return SYS_ERR_OK;
+}
+
+/**
+ * @brief dequeue a buffer from the device queue
+ *
+ * @param q             The device queue to call the operation on
+ * @param region_id     Return pointer to the id of the memory 
+ *                      region the buffer belongs to
+ * @param base          Return pointer to the physical address of 
+ *                      the of the buffer
+ * @param lenght        Return pointer to the lenght of the dequeue buffer
+ * @param buffer_id     Return pointer to thehe buffer id of the dequeued buffer
+ *
+ * @returns error on failure or SYS_ERR_OK on success
+ *
+ */
+/*
+errval_t device_queue_dequeue(struct device_queue *q,
+                              regionid_t* region_id,
+                              lpaddr_t* base,
+                              size_t* length,
+                              bufferid_t* buffer_id)
+{
+    USER_PANIC("NIY\n");
+    return SYS_ERR_OK;
+}
+*/
+/**
+ * @brief dequeue a buffer from the device queue
+ *
+ * @param q             The device queue to call the operation on
+ * @param buf           Return pointer to the dequeued buffer
+ *
+ * @returns error on failure or SYS_ERR_OK on success
+ *
+ */
+errval_t device_queue_dequeue(struct device_queue *q,
+                              struct device_queue_buffer** buf)
+{
+    USER_PANIC("NIY\n");
+    return SYS_ERR_OK;
+}
+
+/*
+ * ===========================================================================
+ * Control Path
+ * =========================================================================== 
+*/
+
+/**
+* @brief Add a memory region that can be used as buffers to 
+*        the device queue
+*
+* @param q              The device queue to call the operation on
+* @param cap            A Capability for some memory
+* @param region_id      Return pointer to a region id that is assigned
+*                       to the memory
+*
+* @returns error on failure or SYS_ERR_OK on success
+*
+*/
+errval_t device_queue_register(struct device_queue *q,
+                               struct capref cap,
+                               regionid_t* region_id)
+{
+    USER_PANIC("NIY\n");
+    return SYS_ERR_OK;
+}
+
+/**
+* @brief Remove a memory region 
+*
+* @param q              The device queue to call the operation on
+* @param region_id      The region id to remove from the device 
+*                       queues memory
+* @param cap            The capability to the removed memory
+*
+* @returns error on failure or SYS_ERR_OK on success
+*
+*/
+errval_t device_queue_deregister(struct device_queue *q,
+                                 regionid_t region_id,
+                                 struct capref* cap)
+{
+    USER_PANIC("NIY\n");
+    return SYS_ERR_OK;
+}
+/**
+* @brief Send a notification about new buffers on the queue
+*
+* @param q      The device queue to call the operation on
+*
+* @returns error on failure or SYS_ERR_OK on success
+*
+*/
+errval_t device_queue_sync(struct device_queue *q)
+{
+    USER_PANIC("NIY\n");
+    return SYS_ERR_OK;
+}
+/**
+* @brief Send a control message to the device queue
+*
+* @param q      The device queue to call the operation on
+* @param ctrl   A sting encoding the control message
+*
+* @returns error on failure or SYS_ERR_OK on success
+*
+*/
+errval_t device_queue_control(struct device_queue *q,
+                              char* ctrl)
+{
+    USER_PANIC("NIY\n");
+    return SYS_ERR_OK;
+}
diff --git a/lib/device_interfaces/region_pool.c b/lib/device_interfaces/region_pool.c
new file mode 100644 (file)
index 0000000..8dfa765
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2016 ETH Zurich.
+ * All rights reserved.
+ *
+ * This file is distributed under the terms in the attached LICENSE file.
+ * If you do not find this file, copies can be found by writing to:
+ * ETH Zurich D-INFK, Universitaetstr. 6, CH-8092 Zurich. Attn: Systems Group.
+ */
+
+#include <barrelfish/barrelfish.h>
+#include "region_pool.h"
+
+errval_t region_pool_init(struct region_pool** pool)
+{
+    USER_PANIC("NIY\n");
+    return SYS_ERR_OK;
+}
+
+errval_t region_pool_add_region(struct region_pool* pool, 
+                                struct region* region,
+                                uint32_t* region_id)
+{
+    USER_PANIC("NIY\n");
+    return SYS_ERR_OK;
+}
+
+errval_t region_pool_remove_region(struct region_pool* pool, 
+                                   uint32_t region_id,
+                                   struct region** region)
+{
+    USER_PANIC("NIY\n");
+    return SYS_ERR_OK;
+}
+
+
diff --git a/lib/device_interfaces/region_pool.h b/lib/device_interfaces/region_pool.h
new file mode 100644 (file)
index 0000000..0eea0c0
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2016 ETH Zurich.
+ * All rights reserved.
+ *
+ * This file is distributed under the terms in the attached LICENSE file.
+ * If you do not find this file, copies can be found by writing to:
+ * ETH Zurich D-INFK, Universitaetstr. 6, CH-8092 Zurich. Attn: Systems Group.
+ */
+#ifndef REGION_POOL_H_
+#define REGION_POOL_H_ 1
+
+
+#include <barrelfish/barrelfish.h>
+
+#define INIT_POOL_SIZE 128
+struct buffer_pool;
+
+struct region {
+    domainid_t domain_id; // TODO needed?
+    // ID of the region
+    uint32_t region_id;
+    // Base address of the region
+    lpaddr_t base_addr;
+    // Capability of the region
+    struct capref* cap;
+};
+
+struct region_pool {
+
+    // IDs are "hashed" may have to increase size at some point
+    uint16_t region_pool_size;
+    // number of regions in pool
+    uint16_t num_regions;
+
+    // random offset where regions ids start from
+    uint64_t region_offset;
+
+    // TODO structure to store regions
+    struct region** pool;
+};
+
+
+errval_t region_pool_init(struct region_pool** pool);
+
+errval_t region_pool_add_region(struct region_pool* pool, 
+                                struct region* region,
+                                uint32_t* region_id);
+
+errval_t region_pool_remove_region(struct region_pool* pool, 
+                                   uint32_t region_id,
+                                   struct region** region);
+
+
+#endif /* REGION_POOL_H_ */