aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/bus
diff options
context:
space:
mode:
authorNishanth Menon <nm@ti.com>2014-04-11 13:24:56 -0400
committerNishanth Menon <nm@ti.com>2014-05-05 15:33:52 -0400
commitc98aa7aaa24b7687a170b93c4bf3111a6d166069 (patch)
tree34d930842a5909ea1e728799555ac2b0e1b06844 /drivers/bus
parentd4d8819e205854cc102e366f30b8eadd60a58e97 (diff)
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')
-rw-r--r--drivers/bus/omap_l3_noc.c72
-rw-r--r--drivers/bus/omap_l3_noc.h3
2 files changed, 47 insertions, 28 deletions
diff --git a/drivers/bus/omap_l3_noc.c b/drivers/bus/omap_l3_noc.c
index 8a1926daacd7..42e411457494 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)
62 struct l3_target_data *l3_targ_inst; 62 struct l3_target_data *l3_targ_inst;
63 struct l3_flagmux_data *flag_mux; 63 struct l3_flagmux_data *flag_mux;
64 struct l3_masters_data *master; 64 struct l3_masters_data *master;
65 char *err_description;
66 char err_string[30] = { 0 };
65 67
66 /* Get the Type of interrupt */ 68 /* Get the Type of interrupt */
67 inttype = irq == l3->app_irq ? L3_APPLICATION_ERROR : L3_DEBUG_ERROR; 69 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)
78 80
79 /* Get the corresponding error and analyse */ 81 /* Get the corresponding error and analyse */
80 if (err_reg) { 82 if (err_reg) {
83 bool std_err = true;
84
81 /* Identify the source from control status register */ 85 /* Identify the source from control status register */
82 err_src = __ffs(err_reg); 86 err_src = __ffs(err_reg);
83 87
@@ -123,47 +127,61 @@ static irqreturn_t l3_interrupt_handler(int irq, void *_l3)
123 l3_targ_stderr = l3_targ_base + L3_TARG_STDERRLOG_MAIN; 127 l3_targ_stderr = l3_targ_base + L3_TARG_STDERRLOG_MAIN;
124 l3_targ_slvofslsb = l3_targ_base + 128 l3_targ_slvofslsb = l3_targ_base +
125 L3_TARG_STDERRLOG_SLVOFSLSB; 129 L3_TARG_STDERRLOG_SLVOFSLSB;
126 l3_targ_mstaddr = l3_targ_base +
127 L3_TARG_STDERRLOG_MSTADDR;
128 130
129 std_err_main = readl_relaxed(l3_targ_stderr); 131 std_err_main = readl_relaxed(l3_targ_stderr);
130 132
131 /* STDERRLOG_MSTADDR Stores the NTTP master address. */
132 masterid = (readl_relaxed(l3_targ_mstaddr) &
133 l3->mst_addr_mask) >>
134 __ffs(l3->mst_addr_mask);
135
136 switch (std_err_main & CUSTOM_ERROR) { 133 switch (std_err_main & CUSTOM_ERROR) {
137 case STANDARD_ERROR: 134 case STANDARD_ERROR:
138 WARN(true, "L3 standard error: TARGET:%s at address 0x%x\n", 135 err_description = "Standard";
139 target_name, 136 snprintf(err_string, sizeof(err_string),
140 readl_relaxed(l3_targ_slvofslsb)); 137 ": At Address: 0x%08X ",
141 /* clear the std error log*/ 138 readl_relaxed(l3_targ_slvofslsb));
142 clear = std_err_main | CLEAR_STDERR_LOG; 139
143 writel_relaxed(clear, l3_targ_stderr); 140 l3_targ_mstaddr = l3_targ_base +
141 L3_TARG_STDERRLOG_MSTADDR;
144 break; 142 break;
145 143
146 case CUSTOM_ERROR: 144 case CUSTOM_ERROR:
147 for (k = 0, master = l3->l3_masters; 145 err_description = "Custom";
148 k < l3->num_masters; k++, master++) { 146
149 if (masterid == master->id) { 147 l3_targ_mstaddr = l3_targ_base +
150 master_name = master->name; 148 L3_TARG_STDERRLOG_CINFO_MSTADDR;
151 break;
152 }
153 }
154 WARN(true, "L3 custom error: MASTER:%s TARGET:%s\n",
155 master_name, target_name);
156 /* clear the std error log*/
157 clear = std_err_main | CLEAR_STDERR_LOG;
158 writel_relaxed(clear, l3_targ_stderr);
159 break; 149 break;
160 150
161 default: 151 default:
152 std_err = false;
162 /* Nothing to be handled here as of now */ 153 /* Nothing to be handled here as of now */
163 break; 154 break;
164 } 155 }
165 /* Error found so break the for loop */ 156
166 break; 157 if (!std_err)
158 break;
159
160 /* STDERRLOG_MSTADDR Stores the NTTP master address. */
161 masterid = (readl_relaxed(l3_targ_mstaddr) &
162 l3->mst_addr_mask) >>
163 __ffs(l3->mst_addr_mask);
164
165 for (k = 0, master = l3->l3_masters;
166 k < l3->num_masters; k++, master++) {
167 if (masterid == master->id) {
168 master_name = master->name;
169 break;
170 }
171 }
172
173 WARN(true,
174 "%s:L3 %s Error: MASTER %s TARGET %s%s\n",
175 dev_name(l3->dev),
176 err_description,
177 master_name, target_name,
178 err_string);
179 /* clear the std error log*/
180 clear = std_err_main | CLEAR_STDERR_LOG;
181 writel_relaxed(clear, l3_targ_stderr);
182
183 /* Error found so break the for loop */
184 break;
167 } 185 }
168 } 186 }
169 return IRQ_HANDLED; 187 return IRQ_HANDLED;
diff --git a/drivers/bus/omap_l3_noc.h b/drivers/bus/omap_l3_noc.h
index ba8692444665..ea2f51c984f1 100644
--- a/drivers/bus/omap_l3_noc.h
+++ b/drivers/bus/omap_l3_noc.h
@@ -29,8 +29,9 @@
29 29
30/* L3 TARG register offsets */ 30/* L3 TARG register offsets */
31#define L3_TARG_STDERRLOG_MAIN 0x48 31#define L3_TARG_STDERRLOG_MAIN 0x48
32#define L3_TARG_STDERRLOG_MSTADDR 0x50
32#define L3_TARG_STDERRLOG_SLVOFSLSB 0x5c 33#define L3_TARG_STDERRLOG_SLVOFSLSB 0x5c
33#define L3_TARG_STDERRLOG_MSTADDR 0x68 34#define L3_TARG_STDERRLOG_CINFO_MSTADDR 0x68
34#define L3_FLAGMUX_REGERR0 0xc 35#define L3_FLAGMUX_REGERR0 0xc
35#define L3_FLAGMUX_MASK0 0x8 36#define L3_FLAGMUX_MASK0 0x8
36 37