diff options
| -rw-r--r-- | drivers/staging/tidspbridge/include/dspbridge/drv.h | 4 | ||||
| -rw-r--r-- | drivers/staging/tidspbridge/rmgr/drv.c | 11 | ||||
| -rw-r--r-- | drivers/staging/tidspbridge/rmgr/drv_interface.c | 2 | ||||
| -rw-r--r-- | drivers/staging/tidspbridge/rmgr/proc.c | 36 |
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 | |||
| 1531 | func_end: | 1548 | func_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 | |||
| 1755 | func_end: | 1791 | func_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); |
