aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorFelipe Contreras <felipe.contreras@gmail.com>2010-11-10 13:09:22 -0500
committerOmar Ramirez Luna <omar.ramirez@ti.com>2010-11-10 19:34:42 -0500
commita28903501cb7f7b1ad52c1e981aed2738ae7c434 (patch)
treeabcaea6c4d6c772cb07e7081ec39e71f6e0912ca /drivers
parent2fa28a5182869968a388d34f8d809aa07a0d4046 (diff)
Revert "staging: tidspbridge - remove reserved memory clean up"
This reverts commit db348ca36e5881cd1d2e5caa6eee7d0237d07a3d. Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com> Signed-off-by: Omar Ramirez Luna <omar.ramirez@ti.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/staging/tidspbridge/include/dspbridge/drv.h4
-rw-r--r--drivers/staging/tidspbridge/rmgr/drv.c11
-rw-r--r--drivers/staging/tidspbridge/rmgr/drv_interface.c2
-rw-r--r--drivers/staging/tidspbridge/rmgr/proc.c36
4 files changed, 53 insertions, 0 deletions
diff --git a/drivers/staging/tidspbridge/include/dspbridge/drv.h b/drivers/staging/tidspbridge/include/dspbridge/drv.h
index 427f38b7b43a..c1f363ec9afa 100644
--- a/drivers/staging/tidspbridge/include/dspbridge/drv.h
+++ b/drivers/staging/tidspbridge/include/dspbridge/drv.h
@@ -165,6 +165,10 @@ struct process_context {
165 struct list_head dmm_map_list; 165 struct list_head dmm_map_list;
166 spinlock_t dmm_map_lock; 166 spinlock_t dmm_map_lock;
167 167
168 /* DMM reserved memory resources */
169 struct list_head dmm_rsv_list;
170 spinlock_t dmm_rsv_lock;
171
168 /* DSP Heap resources */ 172 /* DSP Heap resources */
169 struct dspheap_res_object *pdspheap_list; 173 struct dspheap_res_object *pdspheap_list;
170 174
diff --git a/drivers/staging/tidspbridge/rmgr/drv.c b/drivers/staging/tidspbridge/rmgr/drv.c
index 91cc168516e5..0c857b93416a 100644
--- a/drivers/staging/tidspbridge/rmgr/drv.c
+++ b/drivers/staging/tidspbridge/rmgr/drv.c
@@ -146,6 +146,7 @@ int drv_remove_all_dmm_res_elements(void *process_ctxt)
146 struct process_context *ctxt = (struct process_context *)process_ctxt; 146 struct process_context *ctxt = (struct process_context *)process_ctxt;
147 int status = 0; 147 int status = 0;
148 struct dmm_map_object *temp_map, *map_obj; 148 struct dmm_map_object *temp_map, *map_obj;
149 struct dmm_rsv_object *temp_rsv, *rsv_obj;
149 150
150 /* Free DMM mapped memory resources */ 151 /* Free DMM mapped memory resources */
151 list_for_each_entry_safe(map_obj, temp_map, &ctxt->dmm_map_list, link) { 152 list_for_each_entry_safe(map_obj, temp_map, &ctxt->dmm_map_list, link) {
@@ -155,6 +156,16 @@ int drv_remove_all_dmm_res_elements(void *process_ctxt)
155 pr_err("%s: proc_un_map failed!" 156 pr_err("%s: proc_un_map failed!"
156 " status = 0x%xn", __func__, status); 157 " status = 0x%xn", __func__, status);
157 } 158 }
159
160 /* Free DMM reserved memory resources */
161 list_for_each_entry_safe(rsv_obj, temp_rsv, &ctxt->dmm_rsv_list, link) {
162 status = proc_un_reserve_memory(ctxt->hprocessor, (void *)
163 rsv_obj->dsp_reserved_addr,
164 ctxt);
165 if (status)
166 pr_err("%s: proc_un_reserve_memory failed!"
167 " status = 0x%xn", __func__, status);
168 }
158 return status; 169 return status;
159} 170}
160 171
diff --git a/drivers/staging/tidspbridge/rmgr/drv_interface.c b/drivers/staging/tidspbridge/rmgr/drv_interface.c
index 34be43fec044..324fcdffb3b3 100644
--- a/drivers/staging/tidspbridge/rmgr/drv_interface.c
+++ b/drivers/staging/tidspbridge/rmgr/drv_interface.c
@@ -509,6 +509,8 @@ static int bridge_open(struct inode *ip, struct file *filp)
509 pr_ctxt->res_state = PROC_RES_ALLOCATED; 509 pr_ctxt->res_state = PROC_RES_ALLOCATED;
510 spin_lock_init(&pr_ctxt->dmm_map_lock); 510 spin_lock_init(&pr_ctxt->dmm_map_lock);
511 INIT_LIST_HEAD(&pr_ctxt->dmm_map_list); 511 INIT_LIST_HEAD(&pr_ctxt->dmm_map_list);
512 spin_lock_init(&pr_ctxt->dmm_rsv_lock);
513 INIT_LIST_HEAD(&pr_ctxt->dmm_rsv_list);
512 514
513 pr_ctxt->node_id = kzalloc(sizeof(struct idr), GFP_KERNEL); 515 pr_ctxt->node_id = kzalloc(sizeof(struct idr), GFP_KERNEL);
514 if (pr_ctxt->node_id) { 516 if (pr_ctxt->node_id) {
diff --git a/drivers/staging/tidspbridge/rmgr/proc.c b/drivers/staging/tidspbridge/rmgr/proc.c
index e5fec5729037..59c946bb3ed2 100644
--- a/drivers/staging/tidspbridge/rmgr/proc.c
+++ b/drivers/staging/tidspbridge/rmgr/proc.c
@@ -1515,6 +1515,7 @@ int proc_reserve_memory(void *hprocessor, u32 ul_size,
1515 struct dmm_object *dmm_mgr; 1515 struct dmm_object *dmm_mgr;
1516 int status = 0; 1516 int status = 0;
1517 struct proc_object *p_proc_object = (struct proc_object *)hprocessor; 1517 struct proc_object *p_proc_object = (struct proc_object *)hprocessor;
1518 struct dmm_rsv_object *rsv_obj;
1518 1519
1519 if (!p_proc_object) { 1520 if (!p_proc_object) {
1520 status = -EFAULT; 1521 status = -EFAULT;
@@ -1528,6 +1529,22 @@ int proc_reserve_memory(void *hprocessor, u32 ul_size,
1528 } 1529 }
1529 1530
1530 status = dmm_reserve_memory(dmm_mgr, ul_size, (u32 *) pp_rsv_addr); 1531 status = dmm_reserve_memory(dmm_mgr, ul_size, (u32 *) pp_rsv_addr);
1532 if (status != 0)
1533 goto func_end;
1534
1535 /*
1536 * A successful reserve should be followed by insertion of rsv_obj
1537 * into dmm_rsv_list, so that reserved memory resource tracking
1538 * remains uptodate
1539 */
1540 rsv_obj = kmalloc(sizeof(struct dmm_rsv_object), GFP_KERNEL);
1541 if (rsv_obj) {
1542 rsv_obj->dsp_reserved_addr = (u32) *pp_rsv_addr;
1543 spin_lock(&pr_ctxt->dmm_rsv_lock);
1544 list_add(&rsv_obj->link, &pr_ctxt->dmm_rsv_list);
1545 spin_unlock(&pr_ctxt->dmm_rsv_lock);
1546 }
1547
1531func_end: 1548func_end:
1532 dev_dbg(bridge, "%s: hprocessor: 0x%p ul_size: 0x%x pp_rsv_addr: 0x%p " 1549 dev_dbg(bridge, "%s: hprocessor: 0x%p ul_size: 0x%x pp_rsv_addr: 0x%p "
1533 "status 0x%x\n", __func__, hprocessor, 1550 "status 0x%x\n", __func__, hprocessor,
@@ -1739,6 +1756,7 @@ int proc_un_reserve_memory(void *hprocessor, void *prsv_addr,
1739 struct dmm_object *dmm_mgr; 1756 struct dmm_object *dmm_mgr;
1740 int status = 0; 1757 int status = 0;
1741 struct proc_object *p_proc_object = (struct proc_object *)hprocessor; 1758 struct proc_object *p_proc_object = (struct proc_object *)hprocessor;
1759 struct dmm_rsv_object *rsv_obj;
1742 1760
1743 if (!p_proc_object) { 1761 if (!p_proc_object) {
1744 status = -EFAULT; 1762 status = -EFAULT;
@@ -1752,6 +1770,24 @@ int proc_un_reserve_memory(void *hprocessor, void *prsv_addr,
1752 } 1770 }
1753 1771
1754 status = dmm_un_reserve_memory(dmm_mgr, (u32) prsv_addr); 1772 status = dmm_un_reserve_memory(dmm_mgr, (u32) prsv_addr);
1773 if (status != 0)
1774 goto func_end;
1775
1776 /*
1777 * A successful unreserve should be followed by removal of rsv_obj
1778 * from dmm_rsv_list, so that reserved memory resource tracking
1779 * remains uptodate
1780 */
1781 spin_lock(&pr_ctxt->dmm_rsv_lock);
1782 list_for_each_entry(rsv_obj, &pr_ctxt->dmm_rsv_list, link) {
1783 if (rsv_obj->dsp_reserved_addr == (u32) prsv_addr) {
1784 list_del(&rsv_obj->link);
1785 kfree(rsv_obj);
1786 break;
1787 }
1788 }
1789 spin_unlock(&pr_ctxt->dmm_rsv_lock);
1790
1755func_end: 1791func_end:
1756 dev_dbg(bridge, "%s: hprocessor: 0x%p prsv_addr: 0x%p status: 0x%x\n", 1792 dev_dbg(bridge, "%s: hprocessor: 0x%p prsv_addr: 0x%p status: 0x%x\n",
1757 __func__, hprocessor, prsv_addr, status); 1793 __func__, hprocessor, prsv_addr, status);