summaryrefslogtreecommitdiffstats
path: root/drivers/bus/omap_l3_noc.c
diff options
context:
space:
mode:
authorNishanth Menon <nm@ti.com>2014-04-11 12:24:56 -0500
committerNishanth Menon <nm@ti.com>2014-05-05 14:33:52 -0500
commitc98aa7aaa24b7687a170b93c4bf3111a6d166069 (patch)
tree34d930842a5909ea1e728799555ac2b0e1b06844 /drivers/bus/omap_l3_noc.c
parentd4d8819e205854cc102e366f30b8eadd60a58e97 (diff)
downloadlinux-0-day-c98aa7aaa24b7687a170b93c4bf3111a6d166069.tar.gz
linux-0-day-c98aa7aaa24b7687a170b93c4bf3111a6d166069.tar.xz
bus: omap_l3_noc: make error reporting and handling common
The logic between handling CUSTOM_ERROR and STANDARD_ERROR is just the reporting style. So make it generic, simplify and standardize the reporting with both master and target information printed to log. Handle the register address difference for master code for standard error and custom error as well. While at it, fix a minor indentation error. Signed-off-by: Nishanth Menon <nm@ti.com> Acked-by: Santosh Shilimkar <santosh.shilimkar@ti.com> Acked-by: Peter Ujfalusi <peter.ujfalusi@ti.com> Tested-by: Darren Etheridge <detheridge@ti.com> Tested-by: Sekhar Nori <nsekhar@ti.com>
Diffstat (limited to 'drivers/bus/omap_l3_noc.c')
-rw-r--r--drivers/bus/omap_l3_noc.c72
1 files changed, 45 insertions, 27 deletions
diff --git a/drivers/bus/omap_l3_noc.c b/drivers/bus/omap_l3_noc.c
index 8a1926daacd7f..42e411457494b 100644
--- a/drivers/bus/omap_l3_noc.c
+++ b/drivers/bus/omap_l3_noc.c
@@ -62,6 +62,8 @@ static irqreturn_t l3_interrupt_handler(int irq, void *_l3)
struct l3_target_data *l3_targ_inst;
struct l3_flagmux_data *flag_mux;
struct l3_masters_data *master;
+ char *err_description;
+ char err_string[30] = { 0 };
/* Get the Type of interrupt */
inttype = irq == l3->app_irq ? L3_APPLICATION_ERROR : L3_DEBUG_ERROR;
@@ -78,6 +80,8 @@ static irqreturn_t l3_interrupt_handler(int irq, void *_l3)
/* Get the corresponding error and analyse */
if (err_reg) {
+ bool std_err = true;
+
/* Identify the source from control status register */
err_src = __ffs(err_reg);
@@ -123,47 +127,61 @@ static irqreturn_t l3_interrupt_handler(int irq, void *_l3)
l3_targ_stderr = l3_targ_base + L3_TARG_STDERRLOG_MAIN;
l3_targ_slvofslsb = l3_targ_base +
L3_TARG_STDERRLOG_SLVOFSLSB;
- l3_targ_mstaddr = l3_targ_base +
- L3_TARG_STDERRLOG_MSTADDR;
std_err_main = readl_relaxed(l3_targ_stderr);
- /* STDERRLOG_MSTADDR Stores the NTTP master address. */
- masterid = (readl_relaxed(l3_targ_mstaddr) &
- l3->mst_addr_mask) >>
- __ffs(l3->mst_addr_mask);
-
switch (std_err_main & CUSTOM_ERROR) {
case STANDARD_ERROR:
- WARN(true, "L3 standard error: TARGET:%s at address 0x%x\n",
- target_name,
- readl_relaxed(l3_targ_slvofslsb));
- /* clear the std error log*/
- clear = std_err_main | CLEAR_STDERR_LOG;
- writel_relaxed(clear, l3_targ_stderr);
+ err_description = "Standard";
+ snprintf(err_string, sizeof(err_string),
+ ": At Address: 0x%08X ",
+ readl_relaxed(l3_targ_slvofslsb));
+
+ l3_targ_mstaddr = l3_targ_base +
+ L3_TARG_STDERRLOG_MSTADDR;
break;
case CUSTOM_ERROR:
- for (k = 0, master = l3->l3_masters;
- k < l3->num_masters; k++, master++) {
- if (masterid == master->id) {
- master_name = master->name;
- break;
- }
- }
- WARN(true, "L3 custom error: MASTER:%s TARGET:%s\n",
- master_name, target_name);
- /* clear the std error log*/
- clear = std_err_main | CLEAR_STDERR_LOG;
- writel_relaxed(clear, l3_targ_stderr);
+ err_description = "Custom";
+
+ l3_targ_mstaddr = l3_targ_base +
+ L3_TARG_STDERRLOG_CINFO_MSTADDR;
break;
default:
+ std_err = false;
/* Nothing to be handled here as of now */
break;
}
- /* Error found so break the for loop */
- break;
+
+ if (!std_err)
+ break;
+
+ /* STDERRLOG_MSTADDR Stores the NTTP master address. */
+ masterid = (readl_relaxed(l3_targ_mstaddr) &
+ l3->mst_addr_mask) >>
+ __ffs(l3->mst_addr_mask);
+
+ for (k = 0, master = l3->l3_masters;
+ k < l3->num_masters; k++, master++) {
+ if (masterid == master->id) {
+ master_name = master->name;
+ break;
+ }
+ }
+
+ WARN(true,
+ "%s:L3 %s Error: MASTER %s TARGET %s%s\n",
+ dev_name(l3->dev),
+ err_description,
+ master_name, target_name,
+ err_string);
+ /* clear the std error log*/
+ clear = std_err_main | CLEAR_STDERR_LOG;
+ writel_relaxed(clear, l3_targ_stderr);
+
+ /* Error found so break the for loop */
+ break;
}
}
return IRQ_HANDLED;