Commit 4f551c8f authored by Felipe Contreras's avatar Felipe Contreras Committed by Greg Kroah-Hartman

staging: ti dspbridge: add _BACKTRACE config

We only want this code when testing.
Signed-off-by: default avatarFelipe Contreras <felipe.contreras@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 1ceea253
...@@ -81,3 +81,10 @@ config TIDSPBRIDGE_NTFY_PWRERR ...@@ -81,3 +81,10 @@ config TIDSPBRIDGE_NTFY_PWRERR
Enable notifications to registered clients on the event of power errror Enable notifications to registered clients on the event of power errror
trying to suspend bridge driver. Say Y, to signal this event as a fatal trying to suspend bridge driver. Say Y, to signal this event as a fatal
error, this will require a bridge restart to recover. error, this will require a bridge restart to recover.
config TIDSPBRIDGE_BACKTRACE
bool "Dump backtraces on fatal errors"
depends on TIDSPBRIDGE
help
Enable useful information to backtrace fatal errors. Say Y if you
want to dump information for testing purposes.
...@@ -114,7 +114,7 @@ struct io_mgr { ...@@ -114,7 +114,7 @@ struct io_mgr {
struct mgr_processorextinfo ext_proc_info; struct mgr_processorextinfo ext_proc_info;
struct cmm_object *hcmm_mgr; /* Shared Mem Mngr */ struct cmm_object *hcmm_mgr; /* Shared Mem Mngr */
struct work_struct io_workq; /* workqueue */ struct work_struct io_workq; /* workqueue */
#ifdef CONFIG_TIDSPBRIDGE_DEBUG #if defined(CONFIG_TIDSPBRIDGE_BACKTRACE) || defined(CONFIG_TIDSPBRIDGE_DEBUG)
u32 ul_trace_buffer_begin; /* Trace message start address */ u32 ul_trace_buffer_begin; /* Trace message start address */
u32 ul_trace_buffer_end; /* Trace message end address */ u32 ul_trace_buffer_end; /* Trace message end address */
u32 ul_trace_buffer_current; /* Trace message current address */ u32 ul_trace_buffer_current; /* Trace message current address */
...@@ -210,7 +210,7 @@ int bridge_io_create(OUT struct io_mgr **phIOMgr, ...@@ -210,7 +210,7 @@ int bridge_io_create(OUT struct io_mgr **phIOMgr,
} }
/* Initialize chnl_mgr object */ /* Initialize chnl_mgr object */
#ifdef CONFIG_TIDSPBRIDGE_DEBUG #if defined(CONFIG_TIDSPBRIDGE_BACKTRACE) || defined(CONFIG_TIDSPBRIDGE_DEBUG)
pio_mgr->pmsg = NULL; pio_mgr->pmsg = NULL;
#endif #endif
pio_mgr->hchnl_mgr = hchnl_mgr; pio_mgr->hchnl_mgr = hchnl_mgr;
...@@ -265,7 +265,7 @@ int bridge_io_destroy(struct io_mgr *hio_mgr) ...@@ -265,7 +265,7 @@ int bridge_io_destroy(struct io_mgr *hio_mgr)
/* Free IO DPC object */ /* Free IO DPC object */
tasklet_kill(&hio_mgr->dpc_tasklet); tasklet_kill(&hio_mgr->dpc_tasklet);
#ifdef CONFIG_TIDSPBRIDGE_DEBUG #if defined(CONFIG_TIDSPBRIDGE_BACKTRACE) || defined(CONFIG_TIDSPBRIDGE_DEBUG)
kfree(hio_mgr->pmsg); kfree(hio_mgr->pmsg);
#endif #endif
dsp_wdt_exit(); dsp_wdt_exit();
...@@ -407,7 +407,7 @@ int bridge_io_on_loaded(struct io_mgr *hio_mgr) ...@@ -407,7 +407,7 @@ int bridge_io_on_loaded(struct io_mgr *hio_mgr)
status = -EFAULT; status = -EFAULT;
} }
if (DSP_SUCCEEDED(status)) { if (DSP_SUCCEEDED(status)) {
#ifdef CONFIG_TIDSPBRIDGE_DEBUG #if defined(CONFIG_TIDSPBRIDGE_BACKTRACE) || defined(CONFIG_TIDSPBRIDGE_DEBUG)
status = status =
cod_get_sym_value(cod_man, DSP_TRACESEC_END, &shm0_end); cod_get_sym_value(cod_man, DSP_TRACESEC_END, &shm0_end);
#else #else
...@@ -752,7 +752,7 @@ int bridge_io_on_loaded(struct io_mgr *hio_mgr) ...@@ -752,7 +752,7 @@ int bridge_io_on_loaded(struct io_mgr *hio_mgr)
hmsg_mgr->max_msgs); hmsg_mgr->max_msgs);
memset((void *)hio_mgr->shared_mem, 0, sizeof(struct shm)); memset((void *)hio_mgr->shared_mem, 0, sizeof(struct shm));
#ifdef CONFIG_TIDSPBRIDGE_DEBUG #if defined(CONFIG_TIDSPBRIDGE_BACKTRACE) || defined(CONFIG_TIDSPBRIDGE_DEBUG)
/* Get the start address of trace buffer */ /* Get the start address of trace buffer */
status = cod_get_sym_value(cod_man, SYS_PUTCBEG, status = cod_get_sym_value(cod_man, SYS_PUTCBEG,
&hio_mgr->ul_trace_buffer_begin); &hio_mgr->ul_trace_buffer_begin);
...@@ -949,7 +949,7 @@ void io_dpc(IN OUT unsigned long pRefData) ...@@ -949,7 +949,7 @@ void io_dpc(IN OUT unsigned long pRefData)
(pio_mgr->intr_val < DEH_LIMIT)) { (pio_mgr->intr_val < DEH_LIMIT)) {
/* Notify DSP/BIOS exception */ /* Notify DSP/BIOS exception */
if (hdeh_mgr) { if (hdeh_mgr) {
#ifdef CONFIG_TIDSPBRIDGE_DEBUG #ifdef CONFIG_TIDSPBRIDGE_BACKTRACE
print_dsp_debug_trace(pio_mgr); print_dsp_debug_trace(pio_mgr);
#endif #endif
bridge_deh_notify(hdeh_mgr, DSP_SYSERROR, bridge_deh_notify(hdeh_mgr, DSP_SYSERROR,
...@@ -1810,7 +1810,12 @@ int bridge_io_get_proc_load(IN struct io_mgr *hio_mgr, ...@@ -1810,7 +1810,12 @@ int bridge_io_get_proc_load(IN struct io_mgr *hio_mgr,
return 0; return 0;
} }
#ifdef CONFIG_TIDSPBRIDGE_DEBUG void io_sm_init(void)
{
/* Do nothing */
}
#if defined(CONFIG_TIDSPBRIDGE_BACKTRACE) || defined(CONFIG_TIDSPBRIDGE_DEBUG)
void print_dsp_debug_trace(struct io_mgr *hio_mgr) void print_dsp_debug_trace(struct io_mgr *hio_mgr)
{ {
u32 ul_new_message_length = 0, ul_gpp_cur_pointer; u32 ul_new_message_length = 0, ul_gpp_cur_pointer;
...@@ -1871,6 +1876,7 @@ void print_dsp_debug_trace(struct io_mgr *hio_mgr) ...@@ -1871,6 +1876,7 @@ void print_dsp_debug_trace(struct io_mgr *hio_mgr)
} }
#endif #endif
#ifdef CONFIG_TIDSPBRIDGE_BACKTRACE
/* /*
* ======== print_dsp_trace_buffer ======== * ======== print_dsp_trace_buffer ========
* Prints the trace buffer returned from the DSP (if DBG_Trace is enabled). * Prints the trace buffer returned from the DSP (if DBG_Trace is enabled).
...@@ -2045,10 +2051,6 @@ int print_dsp_trace_buffer(struct bridge_dev_context *hbridge_context) ...@@ -2045,10 +2051,6 @@ int print_dsp_trace_buffer(struct bridge_dev_context *hbridge_context)
return status; return status;
} }
void io_sm_init(void)
{
/* Do nothing */
}
/** /**
* dump_dsp_stack() - This function dumps the data on the DSP stack. * dump_dsp_stack() - This function dumps the data on the DSP stack.
* @bridge_context: Bridge driver's device context pointer. * @bridge_context: Bridge driver's device context pointer.
...@@ -2407,4 +2409,4 @@ void dump_dl_modules(struct bridge_dev_context *bridge_context) ...@@ -2407,4 +2409,4 @@ void dump_dl_modules(struct bridge_dev_context *bridge_context)
func_end: func_end:
kfree(module_struct); kfree(module_struct);
} }
#endif
...@@ -166,6 +166,7 @@ int bridge_deh_register_notify(struct deh_mgr *deh, u32 event_mask, ...@@ -166,6 +166,7 @@ int bridge_deh_register_notify(struct deh_mgr *deh, u32 event_mask,
return ntfy_unregister(deh->ntfy_obj, hnotification); return ntfy_unregister(deh->ntfy_obj, hnotification);
} }
#ifdef CONFIG_TIDSPBRIDGE_BACKTRACE
static void mmu_fault_print_stack(struct bridge_dev_context *dev_context) static void mmu_fault_print_stack(struct bridge_dev_context *dev_context)
{ {
struct cfg_hostres *resources; struct cfg_hostres *resources;
...@@ -205,6 +206,7 @@ static void mmu_fault_print_stack(struct bridge_dev_context *dev_context) ...@@ -205,6 +206,7 @@ static void mmu_fault_print_stack(struct bridge_dev_context *dev_context)
hw_mmu_disable(resources->dw_dmmu_base); hw_mmu_disable(resources->dw_dmmu_base);
free_page((unsigned long)dummy_va_addr); free_page((unsigned long)dummy_va_addr);
} }
#endif
static inline const char *event_to_string(int event) static inline const char *event_to_string(int event)
{ {
...@@ -232,15 +234,19 @@ void bridge_deh_notify(struct deh_mgr *deh, int event, int info) ...@@ -232,15 +234,19 @@ void bridge_deh_notify(struct deh_mgr *deh, int event, int info)
case DSP_SYSERROR: case DSP_SYSERROR:
dev_err(bridge, "%s: %s, info=0x%x", __func__, dev_err(bridge, "%s: %s, info=0x%x", __func__,
str, info); str, info);
#ifdef CONFIG_TIDSPBRIDGE_BACKTRACE
dump_dl_modules(dev_context); dump_dl_modules(dev_context);
dump_dsp_stack(dev_context); dump_dsp_stack(dev_context);
#endif
break; break;
case DSP_MMUFAULT: case DSP_MMUFAULT:
dev_err(bridge, "%s: %s, addr=0x%x", __func__, dev_err(bridge, "%s: %s, addr=0x%x", __func__,
str, fault_addr); str, fault_addr);
#ifdef CONFIG_TIDSPBRIDGE_BACKTRACE
print_dsp_trace_buffer(dev_context); print_dsp_trace_buffer(dev_context);
dump_dl_modules(dev_context); dump_dl_modules(dev_context);
mmu_fault_print_stack(dev_context); mmu_fault_print_stack(dev_context);
#endif
break; break;
default: default:
dev_err(bridge, "%s: %s", __func__, str); dev_err(bridge, "%s: %s", __func__, str);
......
...@@ -188,6 +188,7 @@ static void myfree(void *ptr, s32 size) ...@@ -188,6 +188,7 @@ static void myfree(void *ptr, s32 size)
gs_free(ptr); gs_free(ptr);
} }
#ifdef CONFIG_TIDSPBRIDGE_BACKTRACE
/** /**
* gh_iterate() - This function goes through all the elements in the hash table * gh_iterate() - This function goes through all the elements in the hash table
* looking for the dsp symbols. * looking for the dsp symbols.
...@@ -211,3 +212,4 @@ void gh_iterate(struct gh_t_hash_tab *hash_tab, ...@@ -211,3 +212,4 @@ void gh_iterate(struct gh_t_hash_tab *hash_tab,
} }
} }
} }
#endif
...@@ -53,7 +53,9 @@ extern void dbll_set_attrs(struct dbll_tar_obj *target, ...@@ -53,7 +53,9 @@ extern void dbll_set_attrs(struct dbll_tar_obj *target,
extern void dbll_unload(struct dbll_library_obj *lib, struct dbll_attrs *attrs); extern void dbll_unload(struct dbll_library_obj *lib, struct dbll_attrs *attrs);
extern int dbll_unload_sect(struct dbll_library_obj *lib, extern int dbll_unload_sect(struct dbll_library_obj *lib,
char *sectName, struct dbll_attrs *attrs); char *sectName, struct dbll_attrs *attrs);
#ifdef CONFIG_TIDSPBRIDGE_BACKTRACE
bool dbll_find_dsp_symbol(struct dbll_library_obj *zl_lib, u32 address, bool dbll_find_dsp_symbol(struct dbll_library_obj *zl_lib, u32 address,
u32 offset_range, u32 *sym_addr_output, char *name_output); u32 offset_range, u32 *sym_addr_output, char *name_output);
#endif
#endif /* DBLL_ */ #endif /* DBLL_ */
...@@ -27,6 +27,8 @@ extern void gh_exit(void); ...@@ -27,6 +27,8 @@ extern void gh_exit(void);
extern void *gh_find(struct gh_t_hash_tab *hash_tab, void *key); extern void *gh_find(struct gh_t_hash_tab *hash_tab, void *key);
extern void gh_init(void); extern void gh_init(void);
extern void *gh_insert(struct gh_t_hash_tab *hash_tab, void *key, void *value); extern void *gh_insert(struct gh_t_hash_tab *hash_tab, void *key, void *value);
#ifdef CONFIG_TIDSPBRIDGE_BACKTRACE
void gh_iterate(struct gh_t_hash_tab *hash_tab, void gh_iterate(struct gh_t_hash_tab *hash_tab,
void (*callback)(void *, void *), void *user_data); void (*callback)(void *, void *), void *user_data);
#endif
#endif /* GH_ */ #endif /* GH_ */
...@@ -291,6 +291,7 @@ extern void io_intr_dsp2(IN struct io_mgr *pio_mgr, IN u16 mb_val); ...@@ -291,6 +291,7 @@ extern void io_intr_dsp2(IN struct io_mgr *pio_mgr, IN u16 mb_val);
extern void io_sm_init(void); extern void io_sm_init(void);
#ifdef CONFIG_TIDSPBRIDGE_BACKTRACE
/* /*
* ========print_dsp_trace_buffer ======== * ========print_dsp_trace_buffer ========
* Print DSP tracebuffer. * Print DSP tracebuffer.
...@@ -302,7 +303,8 @@ int dump_dsp_stack(struct bridge_dev_context *bridge_context); ...@@ -302,7 +303,8 @@ int dump_dsp_stack(struct bridge_dev_context *bridge_context);
void dump_dl_modules(struct bridge_dev_context *bridge_context); void dump_dl_modules(struct bridge_dev_context *bridge_context);
#ifdef CONFIG_TIDSPBRIDGE_DEBUG #endif
#if defined(CONFIG_TIDSPBRIDGE_BACKTRACE) || defined(CONFIG_TIDSPBRIDGE_DEBUG)
void print_dsp_debug_trace(struct io_mgr *hio_mgr); void print_dsp_debug_trace(struct io_mgr *hio_mgr);
#endif #endif
......
...@@ -49,7 +49,9 @@ extern int nldr_load(struct nldr_nodeobject *nldr_node_obj, ...@@ -49,7 +49,9 @@ extern int nldr_load(struct nldr_nodeobject *nldr_node_obj,
enum nldr_phase phase); enum nldr_phase phase);
extern int nldr_unload(struct nldr_nodeobject *nldr_node_obj, extern int nldr_unload(struct nldr_nodeobject *nldr_node_obj,
enum nldr_phase phase); enum nldr_phase phase);
#ifdef CONFIG_TIDSPBRIDGE_BACKTRACE
int nldr_find_addr(struct nldr_nodeobject *nldr_node, u32 sym_addr, int nldr_find_addr(struct nldr_nodeobject *nldr_node, u32 sym_addr,
u32 offset_range, void *offset_output, char *sym_name); u32 offset_range, void *offset_output, char *sym_name);
#endif
#endif /* NLDR_ */ #endif /* NLDR_ */
...@@ -558,6 +558,7 @@ extern int node_get_uuid_props(void *hprocessor, ...@@ -558,6 +558,7 @@ extern int node_get_uuid_props(void *hprocessor,
OUT struct dsp_ndbprops OUT struct dsp_ndbprops
*node_props); *node_props);
#ifdef CONFIG_TIDSPBRIDGE_BACKTRACE
/** /**
* node_find_addr() - Find the closest symbol to the given address. * node_find_addr() - Find the closest symbol to the given address.
* *
...@@ -575,5 +576,6 @@ int node_find_addr(struct node_mgr *node_mgr, u32 sym_addr, ...@@ -575,5 +576,6 @@ int node_find_addr(struct node_mgr *node_mgr, u32 sym_addr,
char *sym_name); char *sym_name);
enum node_state node_get_state(void *hnode); enum node_state node_get_state(void *hnode);
#endif
#endif /* NODE_ */ #endif /* NODE_ */
...@@ -1500,6 +1500,7 @@ static void release(struct dynamic_loader_initialize *this) ...@@ -1500,6 +1500,7 @@ static void release(struct dynamic_loader_initialize *this)
{ {
} }
#ifdef CONFIG_TIDSPBRIDGE_BACKTRACE
/** /**
* find_symbol_context - Basic symbol context structure * find_symbol_context - Basic symbol context structure
* @address: Symbol Adress * @address: Symbol Adress
...@@ -1583,3 +1584,4 @@ bool dbll_find_dsp_symbol(struct dbll_library_obj *zl_lib, u32 address, ...@@ -1583,3 +1584,4 @@ bool dbll_find_dsp_symbol(struct dbll_library_obj *zl_lib, u32 address,
return status; return status;
} }
#endif
...@@ -1919,6 +1919,7 @@ static u32 find_gcf(u32 a, u32 b) ...@@ -1919,6 +1919,7 @@ static u32 find_gcf(u32 a, u32 b)
return b; return b;
} }
#ifdef CONFIG_TIDSPBRIDGE_BACKTRACE
/** /**
* nldr_find_addr() - Find the closest symbol to the given address based on * nldr_find_addr() - Find the closest symbol to the given address based on
* dynamic node object. * dynamic node object.
...@@ -1997,3 +1998,4 @@ int nldr_find_addr(struct nldr_nodeobject *nldr_node, u32 sym_addr, ...@@ -1997,3 +1998,4 @@ int nldr_find_addr(struct nldr_nodeobject *nldr_node, u32 sym_addr,
return status; return status;
} }
#endif
...@@ -3200,6 +3200,7 @@ static u32 mem_write(void *priv_ref, u32 ulDspAddr, void *pbuf, ...@@ -3200,6 +3200,7 @@ static u32 mem_write(void *priv_ref, u32 ulDspAddr, void *pbuf,
return ul_num_bytes; return ul_num_bytes;
} }
#ifdef CONFIG_TIDSPBRIDGE_BACKTRACE
/* /*
* ======== node_find_addr ======== * ======== node_find_addr ========
*/ */
...@@ -3229,4 +3230,4 @@ int node_find_addr(struct node_mgr *node_mgr, u32 sym_addr, ...@@ -3229,4 +3230,4 @@ int node_find_addr(struct node_mgr *node_mgr, u32 sym_addr,
return status; return status;
} }
#endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment