aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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