Revert "staging: tidspbridge - deprecate reserve/unreserve_memory funtions"
[pandora-kernel.git] / drivers / staging / tidspbridge / rmgr / proc.c
index 44c26e1..e5fec57 100644 (file)
@@ -29,7 +29,6 @@
 #include <dspbridge/dbc.h>
 
 /*  ----------------------------------- OS Adaptation Layer */
-#include <dspbridge/cfg.h>
 #include <dspbridge/list.h>
 #include <dspbridge/ntfy.h>
 #include <dspbridge/sync.h>
@@ -53,6 +52,7 @@
 #include <dspbridge/msg.h>
 #include <dspbridge/dspioctl.h>
 #include <dspbridge/drv.h>
+#include <_tiomap.h>
 
 /*  ----------------------------------- This */
 #include <dspbridge/proc.h>
@@ -280,6 +280,7 @@ proc_attach(u32 processor_id,
        struct proc_object *p_proc_object = NULL;
        struct mgr_object *hmgr_obj = NULL;
        struct drv_object *hdrv_obj = NULL;
+       struct drv_data *drv_datap = dev_get_drvdata(bridge);
        u8 dev_type;
 
        DBC_REQUIRE(refs > 0);
@@ -291,9 +292,13 @@ proc_attach(u32 processor_id,
        }
 
        /* Get the Driver and Manager Object Handles */
-       status = cfg_get_object((u32 *) &hdrv_obj, REG_DRV_OBJECT);
-       if (!status)
-               status = cfg_get_object((u32 *) &hmgr_obj, REG_MGR_OBJECT);
+       if (!drv_datap || !drv_datap->drv_object || !drv_datap->mgr_object) {
+               status = -ENODATA;
+               pr_err("%s: Failed to get object handles\n", __func__);
+       } else {
+               hdrv_obj = drv_datap->drv_object;
+               hmgr_obj = drv_datap->mgr_object;
+       }
 
        if (!status) {
                /* Get the Device Object */
@@ -393,18 +398,29 @@ static int get_exec_file(struct cfg_devnode *dev_node_obj,
 {
        u8 dev_type;
        s32 len;
+       struct drv_data *drv_datap = dev_get_drvdata(bridge);
 
        dev_get_dev_type(hdev_obj, (u8 *) &dev_type);
+
+       if (!exec_file)
+               return -EFAULT;
+
        if (dev_type == DSP_UNIT) {
-               return cfg_get_exec_file(dev_node_obj, size, exec_file);
-       } else if (dev_type == IVA_UNIT) {
-               if (iva_img) {
-                       len = strlen(iva_img);
-                       strncpy(exec_file, iva_img, len + 1);
-                       return 0;
-               }
+               if (!drv_datap || !drv_datap->base_img)
+                       return -EFAULT;
+
+               if (strlen(drv_datap->base_img) > size)
+                       return -EINVAL;
+
+               strcpy(exec_file, drv_datap->base_img);
+       } else if (dev_type == IVA_UNIT && iva_img) {
+               len = strlen(iva_img);
+               strncpy(exec_file, iva_img, len + 1);
+       } else {
+               return -ENOENT;
        }
-       return -ENOENT;
+
+       return 0;
 }
 
 /*
@@ -429,6 +445,7 @@ int proc_auto_start(struct cfg_devnode *dev_node_obj,
        char sz_exec_file[MAXCMDLINELEN];
        char *argv[2];
        struct mgr_object *hmgr_obj = NULL;
+       struct drv_data *drv_datap = dev_get_drvdata(bridge);
        u8 dev_type;
 
        DBC_REQUIRE(refs > 0);
@@ -436,9 +453,13 @@ int proc_auto_start(struct cfg_devnode *dev_node_obj,
        DBC_REQUIRE(hdev_obj != NULL);
 
        /* Create a Dummy PROC Object */
-       status = cfg_get_object((u32 *) &hmgr_obj, REG_MGR_OBJECT);
-       if (status)
+       if (!drv_datap || !drv_datap->mgr_object) {
+               status = -ENODATA;
+               pr_err("%s: Failed to retrieve the object handle\n", __func__);
                goto func_end;
+       } else {
+               hmgr_obj = drv_datap->mgr_object;
+       }
 
        p_proc_object = kzalloc(sizeof(struct proc_object), GFP_KERNEL);
        if (p_proc_object == NULL) {
@@ -1337,7 +1358,6 @@ int proc_map(void *hprocessor, void *pmpu_addr, u32 ul_size,
        int status = 0;
        struct proc_object *p_proc_object = (struct proc_object *)hprocessor;
        struct dmm_map_object *map_obj;
-       u32 tmp_addr = 0;
 
 #ifdef CONFIG_TIDSPBRIDGE_CACHE_LINE_CHECK
        if ((ul_map_attr & BUFMODE_MASK) != RBUF) {
@@ -1370,24 +1390,27 @@ int proc_map(void *hprocessor, void *pmpu_addr, u32 ul_size,
 
        /* Add mapping to the page tables. */
        if (!status) {
-
-               /* Mapped address = MSB of VA | LSB of PA */
-               tmp_addr = (va_align | ((u32) pmpu_addr & (PG_SIZE4K - 1)));
                /* mapped memory resource tracking */
-               map_obj = add_mapping_info(pr_ctxt, pa_align, tmp_addr,
+               map_obj = add_mapping_info(pr_ctxt, pa_align, va_align,
                                                size_align);
-               if (!map_obj)
+               if (!map_obj) {
                        status = -ENOMEM;
-               else
-                       status = (*p_proc_object->intf_fxns->pfn_brd_mem_map)
-                           (p_proc_object->hbridge_context, pa_align, va_align,
-                            size_align, ul_map_attr, map_obj->pages);
+               } else {
+                       va_align = user_to_dsp_map(
+                               p_proc_object->hbridge_context->dsp_mmu,
+                               pa_align, va_align, size_align,
+                               map_obj->pages);
+                       if (IS_ERR_VALUE(va_align))
+                               status = (int)va_align;
+               }
        }
        if (!status) {
                /* Mapped address = MSB of VA | LSB of PA */
-               *pp_map_addr = (void *) tmp_addr;
+               map_obj->dsp_addr = (va_align |
+                                       ((u32)pmpu_addr & (PG_SIZE4K - 1)));
+               *pp_map_addr = (void *)map_obj->dsp_addr;
        } else {
-               remove_mapping_information(pr_ctxt, tmp_addr, size_align);
+               remove_mapping_information(pr_ctxt, va_align, size_align);
                dmm_un_map_memory(dmm_mgr, va_align, &size_align);
        }
        mutex_unlock(&proc_lock);
@@ -1492,7 +1515,6 @@ int proc_reserve_memory(void *hprocessor, u32 ul_size,
        struct dmm_object *dmm_mgr;
        int status = 0;
        struct proc_object *p_proc_object = (struct proc_object *)hprocessor;
-       struct dmm_rsv_object *rsv_obj;
 
        if (!p_proc_object) {
                status = -EFAULT;
@@ -1506,22 +1528,6 @@ int proc_reserve_memory(void *hprocessor, u32 ul_size,
        }
 
        status = dmm_reserve_memory(dmm_mgr, ul_size, (u32 *) pp_rsv_addr);
-       if (status != 0)
-               goto func_end;
-
-       /*
-        * A successful reserve should be followed by insertion of rsv_obj
-        * into dmm_rsv_list, so that reserved memory resource tracking
-        * remains uptodate
-        */
-       rsv_obj = kmalloc(sizeof(struct dmm_rsv_object), GFP_KERNEL);
-       if (rsv_obj) {
-               rsv_obj->dsp_reserved_addr = (u32) *pp_rsv_addr;
-               spin_lock(&pr_ctxt->dmm_rsv_lock);
-               list_add(&rsv_obj->link, &pr_ctxt->dmm_rsv_list);
-               spin_unlock(&pr_ctxt->dmm_rsv_lock);
-       }
-
 func_end:
        dev_dbg(bridge, "%s: hprocessor: 0x%p ul_size: 0x%x pp_rsv_addr: 0x%p "
                "status 0x%x\n", __func__, hprocessor,
@@ -1701,10 +1707,9 @@ int proc_un_map(void *hprocessor, void *map_addr,
         */
        status = dmm_un_map_memory(dmm_mgr, (u32) va_align, &size_align);
        /* Remove mapping from the page tables. */
-       if (!status) {
-               status = (*p_proc_object->intf_fxns->pfn_brd_mem_un_map)
-                   (p_proc_object->hbridge_context, va_align, size_align);
-       }
+       if (!status)
+               status = user_to_dsp_unmap(
+                       p_proc_object->hbridge_context->dsp_mmu, va_align);
 
        mutex_unlock(&proc_lock);
        if (status)
@@ -1734,7 +1739,6 @@ int proc_un_reserve_memory(void *hprocessor, void *prsv_addr,
        struct dmm_object *dmm_mgr;
        int status = 0;
        struct proc_object *p_proc_object = (struct proc_object *)hprocessor;
-       struct dmm_rsv_object *rsv_obj;
 
        if (!p_proc_object) {
                status = -EFAULT;
@@ -1748,24 +1752,6 @@ int proc_un_reserve_memory(void *hprocessor, void *prsv_addr,
        }
 
        status = dmm_un_reserve_memory(dmm_mgr, (u32) prsv_addr);
-       if (status != 0)
-               goto func_end;
-
-       /*
-        * A successful unreserve should be followed by removal of rsv_obj
-        * from dmm_rsv_list, so that reserved memory resource tracking
-        * remains uptodate
-        */
-       spin_lock(&pr_ctxt->dmm_rsv_lock);
-       list_for_each_entry(rsv_obj, &pr_ctxt->dmm_rsv_list, link) {
-               if (rsv_obj->dsp_reserved_addr == (u32) prsv_addr) {
-                       list_del(&rsv_obj->link);
-                       kfree(rsv_obj);
-                       break;
-               }
-       }
-       spin_unlock(&pr_ctxt->dmm_rsv_lock);
-
 func_end:
        dev_dbg(bridge, "%s: hprocessor: 0x%p prsv_addr: 0x%p status: 0x%x\n",
                __func__, hprocessor, prsv_addr, status);