19 #include <linux/types.h>
58 #define MAXCMDLINELEN 255
59 #define PROC_ENVPROCID "PROC_ID=%d"
60 #define MAXPROCIDLEN (8 + 5)
61 #define PROC_DFLT_TIMEOUT 10000
62 #define PWR_TIMEOUT 500
63 #define EXTEND "_EXT_END"
65 #define DSP_CACHE_LINE 128
67 #define BUFMODE_MASK (3 << 14)
104 static int proc_monitor(
struct proc_object *proc_obj);
105 static s32 get_envp_count(
char **envp);
106 static char **prepend_envp(
char **new_envp,
char **envp,
s32 envp_elems,
107 s32 cnew_envp,
char *sz_var);
117 pr_debug(
"%s: adding map info: mpu_addr 0x%x virt 0x%x size 0x%x\n",
123 pr_err(
"%s: kzalloc failed\n", __func__);
126 INIT_LIST_HEAD(&map_obj->
link);
128 map_obj->
pages = kcalloc(num_usr_pgs,
sizeof(
struct page *),
130 if (!map_obj->
pages) {
131 pr_err(
"%s: kzalloc failed\n", __func__);
151 if (map_obj->
dsp_addr == dsp_addr && map_obj->
size != size)
152 pr_err(
"%s: addr match (0x%x), size don't (0x%x != 0x%x)\n",
153 __func__, dsp_addr, map_obj->
size, size);
155 return map_obj->
dsp_addr == dsp_addr &&
159 static void remove_mapping_information(
struct process_context *pr_ctxt,
164 pr_debug(
"%s: looking for virt 0x%x size 0x%x\n", __func__,
169 pr_debug(
"%s: candidate: mpu_addr 0x%x virt 0x%x size 0x%x\n",
175 if (match_exact_map_obj(map_obj, dsp_addr, size)) {
176 pr_debug(
"%s: match, deleting map info\n", __func__);
183 pr_debug(
"%s: candidate didn't match\n", __func__);
186 pr_err(
"%s: failed to find given map info\n", __func__);
191 static int match_containing_map_obj(
struct dmm_map_object *map_obj,
196 return mpu_addr >= map_obj->
mpu_addr &&
197 mpu_addr + size <= map_obj_end;
205 pr_debug(
"%s: looking for mpu_addr 0x%x size 0x%x\n", __func__,
210 pr_debug(
"%s: candidate: mpu_addr 0x%x virt 0x%x size 0x%x\n",
215 if (match_containing_map_obj(map_obj, mpu_addr, size)) {
220 pr_debug(
"%s: no match!\n", __func__);
229 static int find_first_page_in_cache(
struct dmm_map_object *map_obj,
230 unsigned long mpu_addr)
234 int pg_index = requested_base_page - mapped_base_page;
236 if (pg_index < 0 || pg_index >= map_obj->
num_usr_pgs) {
237 pr_err(
"%s: failed (got %d)\n", __func__, pg_index);
241 pr_debug(
"%s: first page is %d\n", __func__, pg_index);
248 pr_debug(
"%s: looking for pg_i %d, num_usr_pgs: %d\n", __func__,
252 pr_err(
"%s: requested pg_i %d is out of mapped range\n",
257 return map_obj->
pages[pg_i];
287 pr_err(
"%s: Failed to get object handles\n", __func__);
306 if (p_proc_object ==
NULL) {
310 p_proc_object->
dev_obj = hdev_obj;
311 p_proc_object->
mgr_obj = hmgr_obj;
316 INIT_LIST_HEAD(&p_proc_object->
proc_list);
328 kfree(p_proc_object);
330 kfree(p_proc_object);
354 is_already_attached);
356 if (p_proc_object->is_already_attached)
359 if (p_proc_object->ntfy_obj) {
360 ntfy_delete(p_proc_object->ntfy_obj);
361 kfree(p_proc_object->ntfy_obj);
364 kfree(p_proc_object);
367 *ph_processor = (
void *)p_proc_object;
374 kfree(p_proc_object);
380 static int get_exec_file(
struct cfg_devnode *dev_node_obj,
382 u32 size,
char *exec_file)
394 if (!drv_datap || !drv_datap->
base_img)
439 pr_err(
"%s: Failed to retrieve the object handle\n", __func__);
446 if (p_proc_object ==
NULL) {
450 p_proc_object->
dev_obj = hdev_obj;
451 p_proc_object->
mgr_obj = hmgr_obj;
468 status = get_exec_file(dev_node_obj, hdev_obj,
sizeof(sz_exec_file),
471 argv[0] = sz_exec_file;
474 status =
proc_load(p_proc_object, 1, (
const char **)argv,
NULL);
481 kfree(p_proc_object);
525 if (!((*p_proc_object->
intf_fxns->dev_cntrl)
557 ntfy_delete(p_proc_object->
ntfy_obj);
565 (
u32) p_proc_object);
567 kfree(p_proc_object);
583 u32 node_tab_size,
u32 *pu_num_nodes,
618 page = get_mapping_page(map_obj, pg_i);
620 pr_err(
"%s: no page for %08lx\n", __func__, start);
623 }
else if (IS_ERR(page)) {
624 pr_err(
"%s: err page for %08lx(%lu)\n", __func__, start,
633 sg_set_page(&sg[
i], page, rest, offset);
641 pr_err(
"%s: bad number of sg iterations\n", __func__);
650 static int memory_regain_ownership(
struct dmm_map_object *map_obj,
654 unsigned long first_data_page = start >>
PAGE_SHIFT;
655 unsigned long last_data_page = ((
u32)(start + len - 1) >>
PAGE_SHIFT);
657 unsigned long num_pages = last_data_page - first_data_page + 1;
663 if (dma_info->
dir != dir || dma_info->
num_pages != num_pages) {
664 pr_err(
"%s: dma info doesn't match given params\n", __func__);
670 pr_debug(
"%s: dma_map_sg unmapped\n", __func__);
686 unsigned long first_data_page = start >>
PAGE_SHIFT;
687 unsigned long last_data_page = ((
u32)(start + len - 1) >>
PAGE_SHIFT);
689 unsigned long num_pages = last_data_page - first_data_page + 1;
691 pg_i = find_first_page_in_cache(map_obj, start);
693 pr_err(
"%s: failed to find first page in cache\n", __func__);
698 sg = kcalloc(num_pages,
sizeof(*sg),
GFP_KERNEL);
700 pr_err(
"%s: kcalloc failed\n", __func__);
715 ret = build_dma_sg(map_obj, start, len, pg_i);
719 sg_num =
dma_map_sg(bridge, sg, num_pages, dir);
721 pr_err(
"%s: dma_map_sg failed: %d\n", __func__, sg_num);
726 pr_debug(
"%s: dma_map_sg mapped %d elements\n", __func__, sg_num);
751 pr_debug(
"%s: addr 0x%x, size 0x%x, type %d\n", __func__,
758 map_obj = find_containing_mapping(pr_ctxt, (
u32) pmpu_addr, ul_size);
760 pr_err(
"%s: find_containing_mapping failed\n", __func__);
765 if (memory_give_ownership(map_obj, (
u32) pmpu_addr, ul_size, dir)) {
766 pr_err(
"%s: InValid address parameters %p %x\n",
767 __func__, pmpu_addr, ul_size);
791 pr_debug(
"%s: addr 0x%x, size 0x%x, type %d\n", __func__,
798 map_obj = find_containing_mapping(pr_ctxt, (
u32) pmpu_addr, ul_size);
800 pr_err(
"%s: find_containing_mapping failed\n", __func__);
805 if (memory_regain_ownership(map_obj, (
u32) pmpu_addr, ul_size, dir)) {
806 pr_err(
"%s: InValid address parameters %p %x\n",
807 __func__, pmpu_addr, ul_size);
823 u32 ul_size,
u32 ul_flags)
849 u32 resource_info_size)
858 if (!p_proc_object) {
862 switch (resource_type) {
894 io_get_proc_load(hio_mgr,
922 *device_obj = p_proc_object->
dev_obj;
947 status = (*p_proc_object->
intf_fxns->brd_status)
950 switch (brd_status) {
975 dev_dbg(bridge,
"%s, results: status: 0x%x proc_state_obj: 0x%x\n",
976 __func__, status, proc_state_obj->
proc_state);
1007 const char **user_args,
const char **user_envp)
1027 #ifdef OPT_LOAD_TIME_INSTRUMENTATION
1032 #if defined(CONFIG_TIDSPBRIDGE_DVFS) && !defined(CONFIG_CPU_FREQ)
1033 struct dspbridge_platform_data *
pdata =
1037 #ifdef OPT_LOAD_TIME_INSTRUMENTATION
1040 if (!p_proc_object) {
1054 status = proc_monitor(hprocessor);
1059 pargv0 = (
char *)user_args[0];
1061 envp_elems = get_envp_count((
char **)user_envp);
1062 cnew_envp = (envp_elems ? (envp_elems + 1) : (envp_elems + 2));
1063 new_envp = kzalloc(cnew_envp *
sizeof(
char **),
GFP_KERNEL);
1068 dev_dbg(bridge,
"%s: Proc ID string overflow\n",
1073 prepend_envp(new_envp, (
char **)user_envp,
1074 envp_elems, cnew_envp, sz_proc_id);
1077 (
u32 *) &hdcd_handle);
1108 (
u32 *) &hdcd_handle);
1117 (
char *)user_args[0]);
1126 kzalloc((
strlen(user_args[0]) +
1131 (
char *)user_args[0],
1132 (
strlen((
char *)user_args[0]) +
1153 status = (*p_proc_object->
intf_fxns->io_on_loaded)
1162 #if defined(CONFIG_TIDSPBRIDGE_DVFS) && !defined(CONFIG_CPU_FREQ)
1163 if (pdata->cpu_set_freq)
1164 (*pdata->cpu_set_freq) (pdata->mpu_speed[VDD1_OPP5]);
1166 status =
cod_load_base(cod_mgr, argc_index, (
char **)user_args,
1170 if (status == -
EBADF) {
1171 dev_dbg(bridge,
"%s: Failure to Load the EXE\n",
1175 pr_err(
"%s: Couldn't parse the file\n",
1180 #if defined(CONFIG_TIDSPBRIDGE_DVFS) && !defined(CONFIG_CPU_FREQ)
1181 if (pdata->cpu_set_freq)
1182 (*pdata->cpu_set_freq) (pdata->mpu_speed[VDD1_OPP1]);
1188 status = (*p_proc_object->
intf_fxns->brd_set_state)
1228 user_args[0] = pargv0;
1230 if (!((*p_proc_object->
intf_fxns->brd_status)
1232 pr_info(
"%s: Processor Loaded %s\n", __func__, pargv0);
1246 pr_err(
"%s: Processor failed to load\n", __func__);
1249 #ifdef OPT_LOAD_TIME_INSTRUMENTATION
1255 dev_dbg(bridge,
"%s: time to load %d sec and %d usec\n", __func__,
1267 void *req_addr,
void **pp_map_addr,
u32 ul_map_attr,
1279 #ifdef CONFIG_TIDSPBRIDGE_CACHE_LINE_CHECK
1283 pr_err(
"%s: not aligned: 0x%x (%d)\n", __func__,
1284 (
u32)pmpu_addr, ul_size);
1296 if (!p_proc_object) {
1312 tmp_addr = (va_align | ((
u32) pmpu_addr & (
PG_SIZE4K - 1)));
1314 map_obj = add_mapping_info(pr_ctxt, pa_align, tmp_addr,
1319 status = (*p_proc_object->
intf_fxns->brd_mem_map)
1321 size_align, ul_map_attr, map_obj->
pages);
1325 *pp_map_addr = (
void *) tmp_addr;
1327 remove_mapping_information(pr_ctxt, tmp_addr, size_align);
1336 dev_dbg(bridge,
"%s: hprocessor %p, pmpu_addr %p, ul_size %x, "
1337 "req_addr %p, ul_map_attr %x, pp_map_addr %p, va_align %x, "
1338 "pa_align %x, size_align %x status 0x%x\n", __func__,
1339 hprocessor, pmpu_addr, ul_size, req_addr, ul_map_attr,
1340 pp_map_addr, va_align, pa_align, size_align, status);
1359 if (!p_proc_object) {
1380 status = ntfy_register(p_proc_object->
ntfy_obj,
1381 hnotification, event_mask,
1392 if ((event_mask == 0) && status) {
1431 if (!p_proc_object) {
1460 dev_dbg(bridge,
"%s: hprocessor: 0x%p ul_size: 0x%x pp_rsv_addr: 0x%p "
1461 "status 0x%x\n", __func__, hprocessor,
1462 ul_size, pp_rsv_addr, status);
1479 if (!p_proc_object) {
1498 status = (*p_proc_object->
intf_fxns->brd_start)
1524 if (!((*p_proc_object->
intf_fxns->brd_status)
1526 pr_info(
"%s: dsp in running state\n", __func__);
1529 pr_err(
"%s: Failed to start the dsp\n", __func__);
1549 u32 node_tab_size = 1;
1551 u32 nodes_allocated = 0;
1553 if (!p_proc_object) {
1559 if (!status && hnode_mgr) {
1561 &num_nodes, &nodes_allocated);
1562 if ((status == -
EINVAL) || (nodes_allocated > 0)) {
1563 pr_err(
"%s: Can't stop device, active nodes = %d \n",
1564 __func__, nodes_allocated);
1574 dev_dbg(bridge,
"%s: processor in standby mode\n", __func__);
1586 pr_err(
"%s: Failed to stop the processor\n", __func__);
1608 if (!p_proc_object) {
1628 status = (*p_proc_object->
intf_fxns->brd_mem_un_map)
1640 remove_mapping_information(pr_ctxt, (
u32) map_addr, size_align);
1646 dev_dbg(bridge,
"%s: hprocessor: 0x%p map_addr: 0x%p status: 0x%x\n",
1647 __func__, hprocessor, map_addr, status);
1664 if (!p_proc_object) {
1695 dev_dbg(bridge,
"%s: hprocessor: 0x%p prsv_addr: 0x%p status: 0x%x\n",
1696 __func__, hprocessor, prsv_addr, status);
1717 static int proc_monitor(
struct proc_object *proc_obj)
1734 if (!((*proc_obj->
intf_fxns->brd_monitor)
1748 static s32 get_envp_count(
char **envp)
1767 static char **prepend_envp(
char **new_envp,
char **envp,
s32 envp_elems,
1768 s32 cnew_envp,
char *sz_var)
1770 char **pp_envp = new_envp;
1773 *new_envp++ = sz_var;
1776 while (envp_elems--)
1777 *new_envp++ = *envp++;
1780 if (envp_elems == 0)
1796 if (!p_proc_object) {
1801 ntfy_notify(p_proc_object->
ntfy_obj, events);
1817 if (!p_proc_object) {