diff options
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/fifo_gk20a.c')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/fifo_gk20a.c | 81 |
1 files changed, 48 insertions, 33 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c index fc63dcbe..75d66968 100644 --- a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c | |||
@@ -1143,7 +1143,7 @@ gk20a_refch_from_inst_ptr(struct gk20a *g, u64 inst_ptr) | |||
1143 | /* fault info/descriptions. | 1143 | /* fault info/descriptions. |
1144 | * tbd: move to setup | 1144 | * tbd: move to setup |
1145 | * */ | 1145 | * */ |
1146 | static const char * const fault_type_descs[] = { | 1146 | static const char * const gk20a_fault_type_descs[] = { |
1147 | "pde", /*fifo_intr_mmu_fault_info_type_pde_v() == 0 */ | 1147 | "pde", /*fifo_intr_mmu_fault_info_type_pde_v() == 0 */ |
1148 | "pde size", | 1148 | "pde size", |
1149 | "pte", | 1149 | "pte", |
@@ -1167,15 +1167,15 @@ static const char * const engine_subid_descs[] = { | |||
1167 | "hub", | 1167 | "hub", |
1168 | }; | 1168 | }; |
1169 | 1169 | ||
1170 | static const char * const hub_client_descs[] = { | 1170 | static const char * const gk20a_hub_client_descs[] = { |
1171 | "vip", "ce0", "ce1", "dniso", "fe", "fecs", "host", "host cpu", | 1171 | "vip", "ce0", "ce1", "dniso", "fe", "fecs", "host", "host cpu", |
1172 | "host cpu nb", "iso", "mmu", "mspdec", "msppp", "msvld", | 1172 | "host cpu nb", "iso", "mmu", "mspdec", "msppp", "msvld", |
1173 | "niso", "p2p", "pd", "perf", "pmu", "raster twod", "scc", | 1173 | "niso", "p2p", "pd", "perf", "pmu", "raster twod", "scc", |
1174 | "scc nb", "sec", "ssync", "gr copy", "ce2", "xv", "mmu nb", | 1174 | "scc nb", "sec", "ssync", "gr copy", "xv", "mmu nb", |
1175 | "msenc", "d falcon", "sked", "a falcon", "n/a", | 1175 | "msenc", "d falcon", "sked", "a falcon", "n/a", |
1176 | }; | 1176 | }; |
1177 | 1177 | ||
1178 | static const char * const gpc_client_descs[] = { | 1178 | static const char * const gk20a_gpc_client_descs[] = { |
1179 | "l1 0", "t1 0", "pe 0", | 1179 | "l1 0", "t1 0", "pe 0", |
1180 | "l1 1", "t1 1", "pe 1", | 1180 | "l1 1", "t1 1", "pe 1", |
1181 | "l1 2", "t1 2", "pe 2", | 1181 | "l1 2", "t1 2", "pe 2", |
@@ -1186,28 +1186,54 @@ static const char * const gpc_client_descs[] = { | |||
1186 | "l1 5", "t1 5", "pe 5", | 1186 | "l1 5", "t1 5", "pe 5", |
1187 | "l1 6", "t1 6", "pe 6", | 1187 | "l1 6", "t1 6", "pe 6", |
1188 | "l1 7", "t1 7", "pe 7", | 1188 | "l1 7", "t1 7", "pe 7", |
1189 | "gpm", | ||
1190 | "ltp utlb 0", "ltp utlb 1", "ltp utlb 2", "ltp utlb 3", | ||
1191 | "rgg utlb", | ||
1192 | }; | 1189 | }; |
1193 | 1190 | ||
1194 | static const char * const does_not_exist[] = { | 1191 | static const char * const does_not_exist[] = { |
1195 | "does not exist" | 1192 | "does not exist" |
1196 | }; | 1193 | }; |
1197 | 1194 | ||
1195 | /* fill in mmu fault desc */ | ||
1196 | void gk20a_fifo_get_mmu_fault_desc(struct mmu_fault_info *mmfault) | ||
1197 | { | ||
1198 | if (mmfault->fault_type >= ARRAY_SIZE(gk20a_fault_type_descs)) | ||
1199 | WARN_ON(mmfault->fault_type >= | ||
1200 | ARRAY_SIZE(gk20a_fault_type_descs)); | ||
1201 | else | ||
1202 | mmfault->fault_type_desc = | ||
1203 | gk20a_fault_type_descs[mmfault->fault_type]; | ||
1204 | } | ||
1205 | |||
1206 | /* fill in mmu fault client description */ | ||
1207 | void gk20a_fifo_get_mmu_fault_client_desc(struct mmu_fault_info *mmfault) | ||
1208 | { | ||
1209 | if (mmfault->client_id >= ARRAY_SIZE(gk20a_hub_client_descs)) | ||
1210 | WARN_ON(mmfault->client_id >= | ||
1211 | ARRAY_SIZE(gk20a_hub_client_descs)); | ||
1212 | else | ||
1213 | mmfault->client_id_desc = | ||
1214 | gk20a_hub_client_descs[mmfault->client_id]; | ||
1215 | } | ||
1216 | |||
1217 | /* fill in mmu fault gpc description */ | ||
1218 | void gk20a_fifo_get_mmu_fault_gpc_desc(struct mmu_fault_info *mmfault) | ||
1219 | { | ||
1220 | if (mmfault->client_id >= ARRAY_SIZE(gk20a_gpc_client_descs)) | ||
1221 | WARN_ON(mmfault->client_id >= | ||
1222 | ARRAY_SIZE(gk20a_gpc_client_descs)); | ||
1223 | else | ||
1224 | mmfault->client_id_desc = | ||
1225 | gk20a_gpc_client_descs[mmfault->client_id]; | ||
1226 | } | ||
1227 | |||
1198 | static void get_exception_mmu_fault_info(struct gk20a *g, u32 mmu_fault_id, | 1228 | static void get_exception_mmu_fault_info(struct gk20a *g, u32 mmu_fault_id, |
1199 | struct mmu_fault_info *mmfault) | 1229 | struct mmu_fault_info *mmfault) |
1200 | { | 1230 | { |
1201 | g->ops.fifo.get_mmu_fault_info(g, mmu_fault_id, mmfault); | 1231 | g->ops.fifo.get_mmu_fault_info(g, mmu_fault_id, mmfault); |
1202 | 1232 | ||
1203 | /* parse info */ | 1233 | /* parse info */ |
1204 | if (mmfault->fault_type >= ARRAY_SIZE(fault_type_descs)) { | 1234 | mmfault->fault_type_desc = does_not_exist[0]; |
1205 | WARN_ON(mmfault->fault_type >= ARRAY_SIZE(fault_type_descs)); | 1235 | if (g->ops.fifo.get_mmu_fault_desc) |
1206 | mmfault->fault_type_desc = does_not_exist[0]; | 1236 | g->ops.fifo.get_mmu_fault_desc(mmfault); |
1207 | } else { | ||
1208 | mmfault->fault_type_desc = | ||
1209 | fault_type_descs[mmfault->fault_type]; | ||
1210 | } | ||
1211 | 1237 | ||
1212 | if (mmfault->client_type >= ARRAY_SIZE(engine_subid_descs)) { | 1238 | if (mmfault->client_type >= ARRAY_SIZE(engine_subid_descs)) { |
1213 | WARN_ON(mmfault->client_type >= ARRAY_SIZE(engine_subid_descs)); | 1239 | WARN_ON(mmfault->client_type >= ARRAY_SIZE(engine_subid_descs)); |
@@ -1218,25 +1244,14 @@ static void get_exception_mmu_fault_info(struct gk20a *g, u32 mmu_fault_id, | |||
1218 | } | 1244 | } |
1219 | 1245 | ||
1220 | mmfault->client_id_desc = does_not_exist[0]; | 1246 | mmfault->client_id_desc = does_not_exist[0]; |
1221 | if (mmfault->client_type == | 1247 | if ((mmfault->client_type == |
1222 | fifo_intr_mmu_fault_info_engine_subid_hub_v()) { | 1248 | fifo_intr_mmu_fault_info_engine_subid_hub_v()) |
1223 | 1249 | && g->ops.fifo.get_mmu_fault_client_desc) | |
1224 | if (mmfault->client_id >= | 1250 | g->ops.fifo.get_mmu_fault_client_desc(mmfault); |
1225 | ARRAY_SIZE(hub_client_descs)) | 1251 | else if ((mmfault->client_type == |
1226 | WARN_ON(mmfault->client_id >= | 1252 | fifo_intr_mmu_fault_info_engine_subid_gpc_v()) |
1227 | ARRAY_SIZE(hub_client_descs)); | 1253 | && g->ops.fifo.get_mmu_fault_gpc_desc) |
1228 | else | 1254 | g->ops.fifo.get_mmu_fault_gpc_desc(mmfault); |
1229 | mmfault->client_id_desc = | ||
1230 | hub_client_descs[mmfault->client_id]; | ||
1231 | } else if (mmfault->client_type == | ||
1232 | fifo_intr_mmu_fault_info_engine_subid_gpc_v()) { | ||
1233 | if (mmfault->client_id >= ARRAY_SIZE(gpc_client_descs)) | ||
1234 | WARN_ON(mmfault->client_id >= | ||
1235 | ARRAY_SIZE(gpc_client_descs)); | ||
1236 | else | ||
1237 | mmfault->client_id_desc = | ||
1238 | gpc_client_descs[mmfault->client_id]; | ||
1239 | } | ||
1240 | } | 1255 | } |
1241 | 1256 | ||
1242 | /* reads info from hardware and fills in mmu fault info record */ | 1257 | /* reads info from hardware and fills in mmu fault info record */ |