diff options
Diffstat (limited to 'drivers/staging/tidspbridge/rmgr')
-rw-r--r-- | drivers/staging/tidspbridge/rmgr/dbdcd.c | 8 | ||||
-rw-r--r-- | drivers/staging/tidspbridge/rmgr/drv.c | 74 | ||||
-rw-r--r-- | drivers/staging/tidspbridge/rmgr/drv_interface.c | 29 | ||||
-rw-r--r-- | drivers/staging/tidspbridge/rmgr/dspdrv.c | 12 | ||||
-rw-r--r-- | drivers/staging/tidspbridge/rmgr/mgr.c | 52 | ||||
-rw-r--r-- | drivers/staging/tidspbridge/rmgr/nldr.c | 17 | ||||
-rw-r--r-- | drivers/staging/tidspbridge/rmgr/node.c | 58 | ||||
-rw-r--r-- | drivers/staging/tidspbridge/rmgr/proc.c | 245 | ||||
-rw-r--r-- | drivers/staging/tidspbridge/rmgr/strm.c | 12 |
9 files changed, 181 insertions, 326 deletions
diff --git a/drivers/staging/tidspbridge/rmgr/dbdcd.c b/drivers/staging/tidspbridge/rmgr/dbdcd.c index f71e860..3581a55 100644 --- a/drivers/staging/tidspbridge/rmgr/dbdcd.c +++ b/drivers/staging/tidspbridge/rmgr/dbdcd.c @@ -487,6 +487,10 @@ int dcd_get_object_def(struct dcd_manager *hdcd_mgr, /* Allocate zeroed buffer. */ psz_coff_buf = kzalloc(ul_len + 4, GFP_KERNEL); + if (psz_coff_buf == NULL) { + status = -ENOMEM; + goto func_end; + } #ifdef _DB_TIOMAP if (strstr(dcd_key->path, "iva") == NULL) { /* Locate section by objectID and read its content. */ @@ -571,6 +575,10 @@ int dcd_get_objects(struct dcd_manager *hdcd_mgr, /* Allocate zeroed buffer. */ psz_coff_buf = kzalloc(ul_len + 4, GFP_KERNEL); + if (psz_coff_buf == NULL) { + status = -ENOMEM; + goto func_cont; + } #ifdef _DB_TIOMAP if (strstr(sz_coff_path, "iva") == NULL) { /* Locate section by objectID and read its content. */ diff --git a/drivers/staging/tidspbridge/rmgr/drv.c b/drivers/staging/tidspbridge/rmgr/drv.c index 8a8dea6..91cc1685 100644 --- a/drivers/staging/tidspbridge/rmgr/drv.c +++ b/drivers/staging/tidspbridge/rmgr/drv.c @@ -27,7 +27,6 @@ #include <dspbridge/dbc.h> /* ----------------------------------- OS Adaptation Layer */ -#include <dspbridge/cfg.h> #include <dspbridge/list.h> /* ----------------------------------- This */ @@ -147,7 +146,6 @@ int drv_remove_all_dmm_res_elements(void *process_ctxt) struct process_context *ctxt = (struct process_context *)process_ctxt; int status = 0; struct dmm_map_object *temp_map, *map_obj; - struct dmm_rsv_object *temp_rsv, *rsv_obj; /* Free DMM mapped memory resources */ list_for_each_entry_safe(map_obj, temp_map, &ctxt->dmm_map_list, link) { @@ -157,16 +155,6 @@ int drv_remove_all_dmm_res_elements(void *process_ctxt) pr_err("%s: proc_un_map failed!" " status = 0x%xn", __func__, status); } - - /* Free DMM reserved memory resources */ - list_for_each_entry_safe(rsv_obj, temp_rsv, &ctxt->dmm_rsv_list, link) { - status = proc_un_reserve_memory(ctxt->hprocessor, (void *) - rsv_obj->dsp_reserved_addr, - ctxt); - if (status) - pr_err("%s: proc_un_reserve_memory failed!" - " status = 0x%xn", __func__, status); - } return status; } @@ -309,6 +297,7 @@ int drv_create(struct drv_object **drv_obj) { int status = 0; struct drv_object *pdrv_object = NULL; + struct drv_data *drv_datap = dev_get_drvdata(bridge); DBC_REQUIRE(drv_obj != NULL); DBC_REQUIRE(refs > 0); @@ -335,9 +324,16 @@ int drv_create(struct drv_object **drv_obj) } else { status = -ENOMEM; } - /* Store the DRV Object in the Registry */ - if (!status) - status = cfg_set_object((u32) pdrv_object, REG_DRV_OBJECT); + /* Store the DRV Object in the driver data */ + if (!status) { + if (drv_datap) { + drv_datap->drv_object = (void *)pdrv_object; + } else { + status = -EPERM; + pr_err("%s: Failed to store DRV object\n", __func__); + } + } + if (!status) { *drv_obj = pdrv_object; } else { @@ -374,6 +370,7 @@ int drv_destroy(struct drv_object *driver_obj) { int status = 0; struct drv_object *pdrv_object = (struct drv_object *)driver_obj; + struct drv_data *drv_datap = dev_get_drvdata(bridge); DBC_REQUIRE(refs > 0); DBC_REQUIRE(pdrv_object); @@ -386,8 +383,13 @@ int drv_destroy(struct drv_object *driver_obj) kfree(pdrv_object->dev_list); kfree(pdrv_object->dev_node_string); kfree(pdrv_object); - /* Update the DRV Object in Registry to be 0 */ - (void)cfg_set_object(0, REG_DRV_OBJECT); + /* Update the DRV Object in the driver data */ + if (drv_datap) { + drv_datap->drv_object = NULL; + } else { + status = -EPERM; + pr_err("%s: Failed to store DRV object\n", __func__); + } return status; } @@ -438,11 +440,15 @@ u32 drv_get_first_dev_object(void) { u32 dw_dev_object = 0; struct drv_object *pdrv_obj; + struct drv_data *drv_datap = dev_get_drvdata(bridge); - if (!cfg_get_object((u32 *) &pdrv_obj, REG_DRV_OBJECT)) { + if (drv_datap && drv_datap->drv_object) { + pdrv_obj = drv_datap->drv_object; if ((pdrv_obj->dev_list != NULL) && !LST_IS_EMPTY(pdrv_obj->dev_list)) dw_dev_object = (u32) lst_first(pdrv_obj->dev_list); + } else { + pr_err("%s: Failed to retrieve the object handle\n", __func__); } return dw_dev_object; @@ -458,14 +464,17 @@ u32 drv_get_first_dev_extension(void) { u32 dw_dev_extension = 0; struct drv_object *pdrv_obj; + struct drv_data *drv_datap = dev_get_drvdata(bridge); - if (!cfg_get_object((u32 *) &pdrv_obj, REG_DRV_OBJECT)) { - + if (drv_datap && drv_datap->drv_object) { + pdrv_obj = drv_datap->drv_object; if ((pdrv_obj->dev_node_string != NULL) && !LST_IS_EMPTY(pdrv_obj->dev_node_string)) { dw_dev_extension = (u32) lst_first(pdrv_obj->dev_node_string); } + } else { + pr_err("%s: Failed to retrieve the object handle\n", __func__); } return dw_dev_extension; @@ -482,18 +491,22 @@ u32 drv_get_next_dev_object(u32 hdev_obj) { u32 dw_next_dev_object = 0; struct drv_object *pdrv_obj; + struct drv_data *drv_datap = dev_get_drvdata(bridge); DBC_REQUIRE(hdev_obj != 0); - if (!cfg_get_object((u32 *) &pdrv_obj, REG_DRV_OBJECT)) { - + if (drv_datap && drv_datap->drv_object) { + pdrv_obj = drv_datap->drv_object; if ((pdrv_obj->dev_list != NULL) && !LST_IS_EMPTY(pdrv_obj->dev_list)) { dw_next_dev_object = (u32) lst_next(pdrv_obj->dev_list, (struct list_head *) hdev_obj); } + } else { + pr_err("%s: Failed to retrieve the object handle\n", __func__); } + return dw_next_dev_object; } @@ -509,16 +522,20 @@ u32 drv_get_next_dev_extension(u32 dev_extension) { u32 dw_dev_extension = 0; struct drv_object *pdrv_obj; + struct drv_data *drv_datap = dev_get_drvdata(bridge); DBC_REQUIRE(dev_extension != 0); - if (!cfg_get_object((u32 *) &pdrv_obj, REG_DRV_OBJECT)) { + if (drv_datap && drv_datap->drv_object) { + pdrv_obj = drv_datap->drv_object; if ((pdrv_obj->dev_node_string != NULL) && !LST_IS_EMPTY(pdrv_obj->dev_node_string)) { dw_dev_extension = (u32) lst_next(pdrv_obj->dev_node_string, (struct list_head *)dev_extension); } + } else { + pr_err("%s: Failed to retrieve the object handle\n", __func__); } return dw_dev_extension; @@ -616,6 +633,7 @@ int drv_request_resources(u32 dw_context, u32 *dev_node_strg) int status = 0; struct drv_object *pdrv_object; struct drv_ext *pszdev_node; + struct drv_data *drv_datap = dev_get_drvdata(bridge); DBC_REQUIRE(dw_context != 0); DBC_REQUIRE(dev_node_strg != NULL); @@ -626,7 +644,11 @@ int drv_request_resources(u32 dw_context, u32 *dev_node_strg) * list. */ - status = cfg_get_object((u32 *) &pdrv_object, REG_DRV_OBJECT); + if (!drv_datap || !drv_datap->drv_object) + status = -ENODATA; + else + pdrv_object = drv_datap->drv_object; + if (!status) { pszdev_node = kzalloc(sizeof(struct drv_ext), GFP_KERNEL); if (pszdev_node) { @@ -710,7 +732,6 @@ static int request_bridge_resources(struct cfg_hostres *res) host_res->dw_sys_ctrl_base = ioremap(OMAP_SYSC_BASE, OMAP_SYSC_SIZE); dev_dbg(bridge, "dw_mem_base[0] 0x%x\n", host_res->dw_mem_base[0]); dev_dbg(bridge, "dw_mem_base[3] 0x%x\n", host_res->dw_mem_base[3]); - dev_dbg(bridge, "dw_dmmu_base %p\n", host_res->dw_dmmu_base); /* for 24xx base port is not mapping the mamory for DSP * internal memory TODO Do a ioremap here */ @@ -764,8 +785,6 @@ int drv_request_bridge_res_dsp(void **phost_resources) OMAP_PER_PRM_SIZE); host_res->dw_core_pm_base = (u32) ioremap(OMAP_CORE_PRM_BASE, OMAP_CORE_PRM_SIZE); - host_res->dw_dmmu_base = ioremap(OMAP_DMMU_BASE, - OMAP_DMMU_SIZE); dev_dbg(bridge, "dw_mem_base[0] 0x%x\n", host_res->dw_mem_base[0]); @@ -777,7 +796,6 @@ int drv_request_bridge_res_dsp(void **phost_resources) host_res->dw_mem_base[3]); dev_dbg(bridge, "dw_mem_base[4] 0x%x\n", host_res->dw_mem_base[4]); - dev_dbg(bridge, "dw_dmmu_base %p\n", host_res->dw_dmmu_base); shm_size = drv_datap->shm_size; if (shm_size >= 0x10000) { diff --git a/drivers/staging/tidspbridge/rmgr/drv_interface.c b/drivers/staging/tidspbridge/rmgr/drv_interface.c index 7b3a7d0..34be43f 100644 --- a/drivers/staging/tidspbridge/rmgr/drv_interface.c +++ b/drivers/staging/tidspbridge/rmgr/drv_interface.c @@ -18,6 +18,8 @@ /* ----------------------------------- Host OS */ +#include <plat/dsp.h> + #include <dspbridge/host_os.h> #include <linux/types.h> #include <linux/platform_device.h> @@ -39,7 +41,6 @@ #include <dspbridge/dbc.h> /* ----------------------------------- OS Adaptation Layer */ -#include <dspbridge/services.h> #include <dspbridge/clk.h> #include <dspbridge/sync.h> @@ -54,7 +55,6 @@ /* ----------------------------------- This */ #include <drv_interface.h> -#include <dspbridge/cfg.h> #include <dspbridge/resourcecleanup.h> #include <dspbridge/chnl.h> #include <dspbridge/proc.h> @@ -66,7 +66,6 @@ #include <mach-omap2/omap3-opp.h> #endif -#define BRIDGE_NAME "C6410" /* ----------------------------------- Globals */ #define DRIVER_NAME "DspBridge" #define DSPBRIDGE_VERSION "0.3" @@ -172,7 +171,7 @@ const struct omap_opp vdd1_rate_table_bridge[] = { #endif #endif -struct dspbridge_platform_data *omap_dspbridge_pdata; +struct omap_dsp_platform_data *omap_dspbridge_pdata; u32 vdd1_dsp_freq[6][4] = { {0, 0, 0, 0}, @@ -219,8 +218,8 @@ void bridge_recover_schedule(void) static int dspbridge_scale_notification(struct notifier_block *op, unsigned long val, void *ptr) { - struct dspbridge_platform_data *pdata = - omap_dspbridge_dev->dev.platform_data; + struct omap_dsp_platform_data *pdata = + omap_dspbridge_dev->dev.platform_data; if (CPUFREQ_POSTCHANGE == val && pdata->dsp_get_opp) pwr_pm_post_scale(PRCM_VDD1, pdata->dsp_get_opp()); @@ -243,7 +242,7 @@ static struct notifier_block iva_clk_notifier = { */ static int omap3_bridge_startup(struct platform_device *pdev) { - struct dspbridge_platform_data *pdata = pdev->dev.platform_data; + struct omap_dsp_platform_data *pdata = pdev->dev.platform_data; struct drv_data *drv_datap = NULL; u32 phys_membase, phys_memsize; int err; @@ -272,7 +271,6 @@ static int omap3_bridge_startup(struct platform_device *pdev) #endif dsp_clk_init(); - services_init(); drv_datap = kzalloc(sizeof(struct drv_data), GFP_KERNEL); if (!drv_datap) { @@ -329,7 +327,6 @@ err1: CPUFREQ_TRANSITION_NOTIFIER); #endif dsp_clk_exit(); - services_exit(); return err; } @@ -395,11 +392,14 @@ static int __devexit omap34_xx_bridge_remove(struct platform_device *pdev) dev_t devno; bool ret; int status = 0; - void *hdrv_obj = NULL; + struct drv_data *drv_datap = dev_get_drvdata(bridge); - status = cfg_get_object((u32 *) &hdrv_obj, REG_DRV_OBJECT); - if (status) + /* Retrieve the Object handle from the driver data */ + if (!drv_datap || !drv_datap->drv_object) { + status = -ENODATA; + pr_err("%s: Failed to retrieve the object handle\n", __func__); goto func_cont; + } #ifdef CONFIG_TIDSPBRIDGE_DVFS if (cpufreq_unregister_notifier(&iva_clk_notifier, @@ -419,7 +419,6 @@ func_cont: mem_ext_phys_pool_release(); dsp_clk_exit(); - services_exit(); devno = MKDEV(driver_major, 0); cdev_del(&bridge_cdev); @@ -466,7 +465,7 @@ static int BRIDGE_RESUME(struct platform_device *pdev) static struct platform_driver bridge_driver = { .driver = { - .name = BRIDGE_NAME, + .name = "omap-dsp", }, .probe = omap34_xx_bridge_probe, .remove = __devexit_p(omap34_xx_bridge_remove), @@ -510,8 +509,6 @@ static int bridge_open(struct inode *ip, struct file *filp) pr_ctxt->res_state = PROC_RES_ALLOCATED; spin_lock_init(&pr_ctxt->dmm_map_lock); INIT_LIST_HEAD(&pr_ctxt->dmm_map_list); - spin_lock_init(&pr_ctxt->dmm_rsv_lock); - INIT_LIST_HEAD(&pr_ctxt->dmm_rsv_list); pr_ctxt->node_id = kzalloc(sizeof(struct idr), GFP_KERNEL); if (pr_ctxt->node_id) { diff --git a/drivers/staging/tidspbridge/rmgr/dspdrv.c b/drivers/staging/tidspbridge/rmgr/dspdrv.c index 714f348..7a6fc73 100644 --- a/drivers/staging/tidspbridge/rmgr/dspdrv.c +++ b/drivers/staging/tidspbridge/rmgr/dspdrv.c @@ -26,9 +26,6 @@ /* ----------------------------------- Trace & Debug */ #include <dspbridge/dbc.h> -/* ----------------------------------- OS Adaptation Layer */ -#include <dspbridge/cfg.h> - /* ----------------------------------- Platform Manager */ #include <dspbridge/drv.h> #include <dspbridge/dev.h> @@ -121,6 +118,7 @@ bool dsp_deinit(u32 device_context) bool ret = true; u32 device_node; struct mgr_object *mgr_obj = NULL; + struct drv_data *drv_datap = dev_get_drvdata(bridge); while ((device_node = drv_get_first_dev_extension()) != 0) { (void)dev_remove_device((struct cfg_devnode *)device_node); @@ -131,10 +129,14 @@ bool dsp_deinit(u32 device_context) (void)drv_destroy((struct drv_object *)device_context); - /* Get the Manager Object from Registry + /* Get the Manager Object from driver data * MGR Destroy will unload the DCD dll */ - if (!cfg_get_object((u32 *) &mgr_obj, REG_MGR_OBJECT)) + if (drv_datap && drv_datap->mgr_object) { + mgr_obj = drv_datap->mgr_object; (void)mgr_destroy(mgr_obj); + } else { + pr_err("%s: Failed to retrieve the object handle\n", __func__); + } api_exit(); diff --git a/drivers/staging/tidspbridge/rmgr/mgr.c b/drivers/staging/tidspbridge/rmgr/mgr.c index 57a39b9..0ea89a1 100644 --- a/drivers/staging/tidspbridge/rmgr/mgr.c +++ b/drivers/staging/tidspbridge/rmgr/mgr.c @@ -20,6 +20,9 @@ #include <linux/types.h> +/* ----------------------------------- Host OS */ +#include <dspbridge/host_os.h> + /* ----------------------------------- DSP/BIOS Bridge */ #include <dspbridge/dbdefs.h> @@ -27,7 +30,6 @@ #include <dspbridge/dbc.h> /* ----------------------------------- OS Adaptation Layer */ -#include <dspbridge/cfg.h> #include <dspbridge/sync.h> /* ----------------------------------- Others */ @@ -58,6 +60,7 @@ int mgr_create(struct mgr_object **mgr_obj, { int status = 0; struct mgr_object *pmgr_obj = NULL; + struct drv_data *drv_datap = dev_get_drvdata(bridge); DBC_REQUIRE(mgr_obj != NULL); DBC_REQUIRE(refs > 0); @@ -67,7 +70,14 @@ int mgr_create(struct mgr_object **mgr_obj, status = dcd_create_manager(ZLDLLNAME, &pmgr_obj->hdcd_mgr); if (!status) { /* If succeeded store the handle in the MGR Object */ - status = cfg_set_object((u32) pmgr_obj, REG_MGR_OBJECT); + if (drv_datap) { + drv_datap->mgr_object = (void *)pmgr_obj; + } else { + status = -EPERM; + pr_err("%s: Failed to store MGR object\n", + __func__); + } + if (!status) { *mgr_obj = pmgr_obj; } else { @@ -94,6 +104,7 @@ int mgr_destroy(struct mgr_object *hmgr_obj) { int status = 0; struct mgr_object *pmgr_obj = (struct mgr_object *)hmgr_obj; + struct drv_data *drv_datap = dev_get_drvdata(bridge); DBC_REQUIRE(refs > 0); DBC_REQUIRE(hmgr_obj); @@ -103,8 +114,13 @@ int mgr_destroy(struct mgr_object *hmgr_obj) dcd_destroy_manager(hmgr_obj->hdcd_mgr); kfree(pmgr_obj); - /* Update the Registry with NULL for MGR Object */ - (void)cfg_set_object(0, REG_MGR_OBJECT); + /* Update the driver data with NULL for MGR Object */ + if (drv_datap) { + drv_datap->mgr_object = NULL; + } else { + status = -EPERM; + pr_err("%s: Failed to store MGR object\n", __func__); + } return status; } @@ -123,6 +139,7 @@ int mgr_enum_node_info(u32 node_id, struct dsp_ndbprops *pndb_props, u32 node_index = 0; struct dcd_genericobj gen_obj; struct mgr_object *pmgr_obj = NULL; + struct drv_data *drv_datap = dev_get_drvdata(bridge); DBC_REQUIRE(pndb_props != NULL); DBC_REQUIRE(pu_num_nodes != NULL); @@ -130,10 +147,14 @@ int mgr_enum_node_info(u32 node_id, struct dsp_ndbprops *pndb_props, DBC_REQUIRE(refs > 0); *pu_num_nodes = 0; - /* Get The Manager Object from the Registry */ - status = cfg_get_object((u32 *) &pmgr_obj, REG_MGR_OBJECT); - if (status) + /* Get the Manager Object from the driver data */ + if (!drv_datap || !drv_datap->mgr_object) { + status = -ENODATA; + pr_err("%s: Failed to retrieve the object handle\n", __func__); goto func_cont; + } else { + pmgr_obj = drv_datap->mgr_object; + } DBC_ASSERT(pmgr_obj); /* Forever loop till we hit failed or no more items in the @@ -195,6 +216,7 @@ int mgr_enum_processor_info(u32 processor_id, struct drv_object *hdrv_obj; u8 dev_type; struct cfg_devnode *dev_node; + struct drv_data *drv_datap = dev_get_drvdata(bridge); bool proc_detect = false; DBC_REQUIRE(processor_info != NULL); @@ -203,7 +225,15 @@ int mgr_enum_processor_info(u32 processor_id, DBC_REQUIRE(refs > 0); *pu_num_procs = 0; - status = cfg_get_object((u32 *) &hdrv_obj, REG_DRV_OBJECT); + + /* Retrieve the Object handle from the driver data */ + if (!drv_datap || !drv_datap->drv_object) { + status = -ENODATA; + pr_err("%s: Failed to retrieve the object handle\n", __func__); + } else { + hdrv_obj = drv_datap->drv_object; + } + if (!status) { status = drv_get_dev_object(processor_id, hdrv_obj, &hdev_obj); if (!status) { @@ -219,8 +249,10 @@ int mgr_enum_processor_info(u32 processor_id, if (status) goto func_end; - /* Get The Manager Object from the Registry */ - if (cfg_get_object((u32 *) &pmgr_obj, REG_MGR_OBJECT)) { + /* Get The Manager Object from the driver data */ + if (drv_datap && drv_datap->mgr_object) { + pmgr_obj = drv_datap->mgr_object; + } else { dev_dbg(bridge, "%s: Failed to get MGR Object\n", __func__); goto func_end; } diff --git a/drivers/staging/tidspbridge/rmgr/nldr.c b/drivers/staging/tidspbridge/rmgr/nldr.c index d8f4eeb..a6ae007 100644 --- a/drivers/staging/tidspbridge/rmgr/nldr.c +++ b/drivers/staging/tidspbridge/rmgr/nldr.c @@ -35,7 +35,7 @@ #include <dspbridge/uuidutil.h> #include <dspbridge/nldr.h> -#include <linux/gcd.h> +#include <linux/lcm.h> /* Name of section containing dynamic load mem */ #define DYNMEMSECT ".dspbridge_mem" @@ -304,7 +304,6 @@ static void unload_ovly(struct nldr_nodeobject *nldr_node_obj, enum nldr_phase phase); static bool find_in_persistent_lib_array(struct nldr_nodeobject *nldr_node_obj, struct dbll_library_obj *lib); -static u32 find_lcm(u32 a, u32 b); /* * ======== nldr_allocate ======== @@ -1637,7 +1636,7 @@ static int remote_alloc(void **ref, u16 mem_sect, u32 size, (size + nldr_obj->us_dsp_word_size - 1) / nldr_obj->us_dsp_word_size; /* Modify memory 'align' to account for DSP cache line size */ - align = find_lcm(GEM_CACHE_LINE_SIZE, align); + align = lcm(GEM_CACHE_LINE_SIZE, align); dev_dbg(bridge, "%s: memory align to 0x%x\n", __func__, align); if (segmnt_id != -1) { rmm_addr_obj->segid = segmnt_id; @@ -1880,18 +1879,6 @@ static bool find_in_persistent_lib_array(struct nldr_nodeobject *nldr_node_obj, return false; } -/* - * ================ Find LCM (Least Common Multiplier === - */ -static u32 find_lcm(u32 a, u32 b) -{ - u32 ret; - - ret = a * b / gcd(a, b); - - return ret; -} - #ifdef CONFIG_TIDSPBRIDGE_BACKTRACE /** * nldr_find_addr() - Find the closest symbol to the given address based on diff --git a/drivers/staging/tidspbridge/rmgr/node.c b/drivers/staging/tidspbridge/rmgr/node.c index 6e9441e..a660247 100644 --- a/drivers/staging/tidspbridge/rmgr/node.c +++ b/drivers/staging/tidspbridge/rmgr/node.c @@ -27,7 +27,6 @@ #include <dspbridge/dbc.h> /* ----------------------------------- OS Adaptation Layer */ -#include <dspbridge/cfg.h> #include <dspbridge/list.h> #include <dspbridge/memdefs.h> #include <dspbridge/proc.h> @@ -57,7 +56,6 @@ /* ----------------------------------- This */ #include <dspbridge/nodepriv.h> #include <dspbridge/node.h> -#include <dspbridge/dmm.h> /* Static/Dynamic Loader includes */ #include <dspbridge/dbll.h> @@ -318,10 +316,6 @@ int node_allocate(struct proc_object *hprocessor, u32 mapped_addr = 0; u32 map_attrs = 0x0; struct dsp_processorstate proc_state; -#ifdef DSP_DMM_DEBUG - struct dmm_object *dmm_mgr; - struct proc_object *p_proc_object = (struct proc_object *)hprocessor; -#endif void *node_res; @@ -431,34 +425,12 @@ int node_allocate(struct proc_object *hprocessor, if (status) goto func_cont; - status = proc_reserve_memory(hprocessor, - pnode->create_args.asa.task_arg_obj. - heap_size + PAGE_SIZE, - (void **)&(pnode->create_args.asa. - task_arg_obj.udsp_heap_res_addr), - pr_ctxt); - if (status) { - pr_err("%s: Failed to reserve memory for heap: 0x%x\n", - __func__, status); - goto func_cont; - } -#ifdef DSP_DMM_DEBUG - status = dmm_get_handle(p_proc_object, &dmm_mgr); - if (!dmm_mgr) { - status = DSP_EHANDLE; - goto func_cont; - } - - dmm_mem_map_dump(dmm_mgr); -#endif - map_attrs |= DSP_MAPLITTLEENDIAN; map_attrs |= DSP_MAPELEMSIZE32; map_attrs |= DSP_MAPVIRTUALADDR; status = proc_map(hprocessor, (void *)attr_in->pgpp_virt_addr, pnode->create_args.asa.task_arg_obj.heap_size, - (void *)pnode->create_args.asa.task_arg_obj. - udsp_heap_res_addr, (void **)&mapped_addr, map_attrs, + NULL, (void **)&mapped_addr, map_attrs, pr_ctxt); if (status) pr_err("%s: Failed to map memory for Heap: 0x%x\n", @@ -2506,25 +2478,20 @@ static void delete_node(struct node_object *hnode, struct process_context *pr_ctxt) { struct node_mgr *hnode_mgr; - struct cmm_xlatorobject *xlator; struct bridge_drv_interface *intf_fxns; u32 i; enum node_type node_type; struct stream_chnl stream; struct node_msgargs node_msg_args; struct node_taskargs task_arg_obj; -#ifdef DSP_DMM_DEBUG - struct dmm_object *dmm_mgr; - struct proc_object *p_proc_object = - (struct proc_object *)hnode->hprocessor; -#endif + int status; if (!hnode) goto func_end; hnode_mgr = hnode->hnode_mgr; if (!hnode_mgr) goto func_end; - xlator = hnode->xlator; + node_type = node_get_type(hnode); if (node_type != NODE_DEVICE) { node_msg_args = hnode->create_args.asa.node_msg_args; @@ -2578,19 +2545,6 @@ static void delete_node(struct node_object *hnode, status = proc_un_map(hnode->hprocessor, (void *) task_arg_obj.udsp_heap_addr, pr_ctxt); - - status = proc_un_reserve_memory(hnode->hprocessor, - (void *) - task_arg_obj. - udsp_heap_res_addr, - pr_ctxt); -#ifdef DSP_DMM_DEBUG - status = dmm_get_handle(p_proc_object, &dmm_mgr); - if (dmm_mgr) - dmm_mem_map_dump(dmm_mgr); - else - status = DSP_EHANDLE; -#endif } } if (node_type != NODE_MESSAGE) { @@ -2620,11 +2574,7 @@ static void delete_node(struct node_object *hnode, hnode->dcd_props.obj_data.node_obj.pstr_i_alg_name = NULL; /* Free all SM address translator resources */ - if (xlator) { - (void)cmm_xlator_delete(xlator, true); /* force free */ - xlator = NULL; - } - + kfree(hnode->xlator); kfree(hnode->nldr_node_obj); hnode->nldr_node_obj = NULL; hnode->hnode_mgr = NULL; diff --git a/drivers/staging/tidspbridge/rmgr/proc.c b/drivers/staging/tidspbridge/rmgr/proc.c index 44c26e1..7a15a02 100644 --- a/drivers/staging/tidspbridge/rmgr/proc.c +++ b/drivers/staging/tidspbridge/rmgr/proc.c @@ -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> @@ -40,7 +39,6 @@ #include <dspbridge/cod.h> #include <dspbridge/dev.h> #include <dspbridge/procpriv.h> -#include <dspbridge/dmm.h> /* ----------------------------------- Resource Manager */ #include <dspbridge/mgr.h> @@ -53,6 +51,7 @@ #include <dspbridge/msg.h> #include <dspbridge/dspioctl.h> #include <dspbridge/drv.h> +#include <_tiomap.h> /* ----------------------------------- This */ #include <dspbridge/proc.h> @@ -152,34 +151,21 @@ static struct dmm_map_object *add_mapping_info(struct process_context *pr_ctxt, return map_obj; } -static int match_exact_map_obj(struct dmm_map_object *map_obj, - u32 dsp_addr, u32 size) -{ - if (map_obj->dsp_addr == dsp_addr && map_obj->size != size) - pr_err("%s: addr match (0x%x), size don't (0x%x != 0x%x)\n", - __func__, dsp_addr, map_obj->size, size); - - return map_obj->dsp_addr == dsp_addr && - map_obj->size == size; -} - static void remove_mapping_information(struct process_context *pr_ctxt, - u32 dsp_addr, u32 size) + u32 dsp_addr) { struct dmm_map_object *map_obj; - pr_debug("%s: looking for virt 0x%x size 0x%x\n", __func__, - dsp_addr, size); + pr_debug("%s: looking for virt 0x%x\n", __func__, dsp_addr); spin_lock(&pr_ctxt->dmm_map_lock); list_for_each_entry(map_obj, &pr_ctxt->dmm_map_list, link) { - pr_debug("%s: candidate: mpu_addr 0x%x virt 0x%x size 0x%x\n", + pr_debug("%s: candidate: mpu_addr 0x%x virt 0x%x\n", __func__, map_obj->mpu_addr, - map_obj->dsp_addr, - map_obj->size); + map_obj->dsp_addr); - if (match_exact_map_obj(map_obj, dsp_addr, size)) { + if (map_obj->dsp_addr == dsp_addr) { pr_debug("%s: match, deleting map info\n", __func__); list_del(&map_obj->link); kfree(map_obj->dma_info.sg); @@ -280,6 +266,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 +278,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 +384,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 +431,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 +439,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) { @@ -1070,7 +1077,6 @@ int proc_load(void *hprocessor, const s32 argc_index, s32 cnew_envp; /* " " in new_envp[] */ s32 nproc_id = 0; /* Anticipate MP version. */ struct dcd_manager *hdcd_handle; - struct dmm_object *dmm_mgr; u32 dw_ext_end; u32 proc_id; int brd_state; @@ -1261,25 +1267,6 @@ int proc_load(void *hprocessor, const s32 argc_index, if (!status) status = cod_get_sym_value(cod_mgr, EXTEND, &dw_ext_end); - - /* Reset DMM structs and add an initial free chunk */ - if (!status) { - status = - dev_get_dmm_mgr(p_proc_object->hdev_obj, - &dmm_mgr); - if (dmm_mgr) { - /* Set dw_ext_end to DMM START u8 - * address */ - dw_ext_end = - (dw_ext_end + 1) * DSPWORDSIZE; - /* DMM memory is from EXT_END */ - status = dmm_create_tables(dmm_mgr, - dw_ext_end, - DMMPOOLSIZE); - } else { - status = -EFAULT; - } - } } } /* Restore the original argv[0] */ @@ -1332,12 +1319,10 @@ int proc_map(void *hprocessor, void *pmpu_addr, u32 ul_size, { u32 va_align; u32 pa_align; - struct dmm_object *dmm_mgr; u32 size_align; 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) { @@ -1362,33 +1347,30 @@ int proc_map(void *hprocessor, void *pmpu_addr, u32 ul_size, } /* Critical section */ mutex_lock(&proc_lock); - dmm_get_handle(p_proc_object, &dmm_mgr); - if (dmm_mgr) - status = dmm_map_memory(dmm_mgr, va_align, size_align); - else - status = -EFAULT; /* 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); - dmm_un_map_memory(dmm_mgr, va_align, &size_align); + remove_mapping_information(pr_ctxt, va_align); } mutex_unlock(&proc_lock); @@ -1481,55 +1463,6 @@ func_end: } /* - * ======== proc_reserve_memory ======== - * Purpose: - * Reserve a virtually contiguous region of DSP address space. - */ -int proc_reserve_memory(void *hprocessor, u32 ul_size, - void **pp_rsv_addr, - struct process_context *pr_ctxt) -{ - 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; - goto func_end; - } - - status = dmm_get_handle(p_proc_object, &dmm_mgr); - if (!dmm_mgr) { - status = -EFAULT; - goto func_end; - } - - 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, - ul_size, pp_rsv_addr, status); - return status; -} - -/* * ======== proc_start ======== * Purpose: * Start a processor running. @@ -1677,9 +1610,7 @@ int proc_un_map(void *hprocessor, void *map_addr, { int status = 0; struct proc_object *p_proc_object = (struct proc_object *)hprocessor; - struct dmm_object *dmm_mgr; u32 va_align; - u32 size_align; va_align = PG_ALIGN_LOW((u32) map_addr, PG_SIZE4K); if (!p_proc_object) { @@ -1687,24 +1618,11 @@ int proc_un_map(void *hprocessor, void *map_addr, goto func_end; } - status = dmm_get_handle(hprocessor, &dmm_mgr); - if (!dmm_mgr) { - status = -EFAULT; - goto func_end; - } - /* Critical section */ mutex_lock(&proc_lock); - /* - * Update DMM structures. Get the size to unmap. - * This function returns error if the VA is not mapped - */ - 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); - } + status = user_to_dsp_unmap(p_proc_object->hbridge_context->dsp_mmu, + va_align); mutex_unlock(&proc_lock); if (status) @@ -1715,7 +1633,7 @@ int proc_un_map(void *hprocessor, void *map_addr, * from dmm_map_list, so that mapped memory resource tracking * remains uptodate */ - remove_mapping_information(pr_ctxt, (u32) map_addr, size_align); + remove_mapping_information(pr_ctxt, (u32) map_addr); func_end: dev_dbg(bridge, "%s: hprocessor: 0x%p map_addr: 0x%p status: 0x%x\n", @@ -1724,55 +1642,6 @@ func_end: } /* - * ======== proc_un_reserve_memory ======== - * Purpose: - * Frees a previously reserved region of DSP address space. - */ -int proc_un_reserve_memory(void *hprocessor, void *prsv_addr, - struct process_context *pr_ctxt) -{ - 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; - goto func_end; - } - - status = dmm_get_handle(p_proc_object, &dmm_mgr); - if (!dmm_mgr) { - status = -EFAULT; - goto func_end; - } - - 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); - return status; -} - -/* * ======== = proc_monitor ======== == * Purpose: * Place the Processor in Monitor State. This is an internal diff --git a/drivers/staging/tidspbridge/rmgr/strm.c b/drivers/staging/tidspbridge/rmgr/strm.c index ef2ec94..2e42714 100644 --- a/drivers/staging/tidspbridge/rmgr/strm.c +++ b/drivers/staging/tidspbridge/rmgr/strm.c @@ -42,7 +42,6 @@ /* ----------------------------------- This */ #include <dspbridge/strm.h> -#include <dspbridge/cfg.h> #include <dspbridge/resourcecleanup.h> /* ----------------------------------- Defines, Data Structures, Typedefs */ @@ -835,16 +834,9 @@ static int delete_strm(struct strm_object *stream_obj) * is invalid. */ status = (*intf_fxns->pfn_chnl_close) (stream_obj->chnl_obj); - /* Free all SM address translator resources */ - if (!status) { - if (stream_obj->xlator) { - /* force free */ - (void)cmm_xlator_delete(stream_obj-> - xlator, - true); - } - } } + /* Free all SM address translator resources */ + kfree(stream_obj->xlator); kfree(stream_obj); } else { status = -EFAULT; |