From: Christophe Milard <[email protected]>

Implementation of the device query function for the linux-gen ODP.

Signed-off-by: Christophe Milard <[email protected]>
---
/** Email created from pull request 16 (heyi-linaro:driver-framework)
 ** https://github.com/Linaro/odp/pull/16
 ** Patch: https://github.com/Linaro/odp/pull/16.patch
 ** Base sha: bac3806356694060d30bf3c83e4133410fecd9ab
 ** Merge commit sha: 8038f288f85db54e1a242e91ded59675313317bf
 **/
 platform/linux-generic/drv_driver.c | 37 +++++++++++++++++++++++++++++++++++++
 1 file changed, 37 insertions(+)

diff --git a/platform/linux-generic/drv_driver.c 
b/platform/linux-generic/drv_driver.c
index 60edde1..3e4780b 100644
--- a/platform/linux-generic/drv_driver.c
+++ b/platform/linux-generic/drv_driver.c
@@ -391,6 +391,43 @@ static void device_destroy_terminate(odpdrv_device_t 
drv_device)
        _odp_ishm_pool_free(list_elt_pool, device);
 }
 
+odpdrv_device_t *odpdrv_device_query(odpdrv_enumr_t enumr, const char *address)
+{
+       _odpdrv_device_t *dev;
+       odpdrv_device_t *res;
+       int index = 0;
+
+       int size = sizeof(odpdrv_device_t); /* for the ODPDRV_DEVICE_INVALID */
+
+       /* parse the list of device a first time to determine the size of
+        * the memory to be allocated:
+        */
+       dev_list_read_lock();
+       dev = device_lst.head;
+       while (dev) {
+               if ((dev->param.enumerator == enumr) &&
+                   ((address == NULL) ||
+                    (strcmp(dev->param.address, address) == 0)))
+                       size += sizeof(odpdrv_device_t);
+               dev = dev->next;
+       }
+
+       /* then fill the list: */
+       res = (odpdrv_device_t *)malloc(size);
+       dev = device_lst.head;
+       while (dev) {
+               if ((dev->param.enumerator == enumr) &&
+                   ((address == NULL) ||
+                    (strcmp(dev->param.address, address) == 0)))
+                       res[index++] = (odpdrv_device_t)dev;
+               dev = dev->next;
+       }
+       dev_list_read_unlock();
+       res[index++] = ODPDRV_DEVICE_INVALID;
+
+       return res; /* must be freed by caller! */
+}
+
 odpdrv_devio_t odpdrv_devio_register(odpdrv_devio_param_t *param)
 {
        ODP_ERR("NOT Supported yet! Driver %s Registration!\n.",

Reply via email to