diff options
-rw-r--r-- | drivers/bus/omap_l3_noc.c | 72 | ||||
-rw-r--r-- | drivers/bus/omap_l3_noc.h | 3 |
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 | ||