diff options
-rw-r--r-- | drivers/misc/sgi-gru/grufault.c | 27 | ||||
-rw-r--r-- | drivers/misc/sgi-gru/grumain.c | 4 | ||||
-rw-r--r-- | drivers/misc/sgi-gru/grutables.h | 5 |
3 files changed, 29 insertions, 7 deletions
diff --git a/drivers/misc/sgi-gru/grufault.c b/drivers/misc/sgi-gru/grufault.c index f15152165a99..3220e95be6b5 100644 --- a/drivers/misc/sgi-gru/grufault.c +++ b/drivers/misc/sgi-gru/grufault.c | |||
@@ -166,7 +166,8 @@ static inline struct gru_state *irq_to_gru(int irq) | |||
166 | * the GRU, atomic operations must be used to clear bits. | 166 | * the GRU, atomic operations must be used to clear bits. |
167 | */ | 167 | */ |
168 | static void get_clear_fault_map(struct gru_state *gru, | 168 | static void get_clear_fault_map(struct gru_state *gru, |
169 | struct gru_tlb_fault_map *map) | 169 | struct gru_tlb_fault_map *imap, |
170 | struct gru_tlb_fault_map *dmap) | ||
170 | { | 171 | { |
171 | unsigned long i, k; | 172 | unsigned long i, k; |
172 | struct gru_tlb_fault_map *tfm; | 173 | struct gru_tlb_fault_map *tfm; |
@@ -177,7 +178,11 @@ static void get_clear_fault_map(struct gru_state *gru, | |||
177 | k = tfm->fault_bits[i]; | 178 | k = tfm->fault_bits[i]; |
178 | if (k) | 179 | if (k) |
179 | k = xchg(&tfm->fault_bits[i], 0UL); | 180 | k = xchg(&tfm->fault_bits[i], 0UL); |
180 | map->fault_bits[i] = k; | 181 | imap->fault_bits[i] = k; |
182 | k = tfm->done_bits[i]; | ||
183 | if (k) | ||
184 | k = xchg(&tfm->done_bits[i], 0UL); | ||
185 | dmap->fault_bits[i] = k; | ||
181 | } | 186 | } |
182 | 187 | ||
183 | /* | 188 | /* |
@@ -449,7 +454,7 @@ failactive: | |||
449 | irqreturn_t gru_intr(int irq, void *dev_id) | 454 | irqreturn_t gru_intr(int irq, void *dev_id) |
450 | { | 455 | { |
451 | struct gru_state *gru; | 456 | struct gru_state *gru; |
452 | struct gru_tlb_fault_map map; | 457 | struct gru_tlb_fault_map imap, dmap; |
453 | struct gru_thread_state *gts; | 458 | struct gru_thread_state *gts; |
454 | struct gru_tlb_fault_handle *tfh = NULL; | 459 | struct gru_tlb_fault_handle *tfh = NULL; |
455 | int cbrnum, ctxnum; | 460 | int cbrnum, ctxnum; |
@@ -462,11 +467,19 @@ irqreturn_t gru_intr(int irq, void *dev_id) | |||
462 | raw_smp_processor_id(), irq); | 467 | raw_smp_processor_id(), irq); |
463 | return IRQ_NONE; | 468 | return IRQ_NONE; |
464 | } | 469 | } |
465 | get_clear_fault_map(gru, &map); | 470 | get_clear_fault_map(gru, &imap, &dmap); |
466 | gru_dbg(grudev, "irq %d, gru %x, map 0x%lx\n", irq, gru->gs_gid, | 471 | gru_dbg(grudev, |
467 | map.fault_bits[0]); | 472 | "irq %d, gid %d, imap %016lx %016lx, dmap %016lx %016lx\n", |
473 | irq, gru->gs_gid, dmap.fault_bits[0], dmap.fault_bits[1], | ||
474 | dmap.fault_bits[0], dmap.fault_bits[1]); | ||
475 | |||
476 | for_each_cbr_in_tfm(cbrnum, dmap.fault_bits) { | ||
477 | complete(gru->gs_blade->bs_async_wq); | ||
478 | gru_dbg(grudev, "gid %d, cbr_done %d, done %d\n", | ||
479 | gru->gs_gid, cbrnum, gru->gs_blade->bs_async_wq->done); | ||
480 | } | ||
468 | 481 | ||
469 | for_each_cbr_in_tfm(cbrnum, map.fault_bits) { | 482 | for_each_cbr_in_tfm(cbrnum, imap.fault_bits) { |
470 | tfh = get_tfh_by_index(gru, cbrnum); | 483 | tfh = get_tfh_by_index(gru, cbrnum); |
471 | prefetchw(tfh); /* Helps on hdw, required for emulator */ | 484 | prefetchw(tfh); /* Helps on hdw, required for emulator */ |
472 | 485 | ||
diff --git a/drivers/misc/sgi-gru/grumain.c b/drivers/misc/sgi-gru/grumain.c index afc4c473c794..e38a0f1775ff 100644 --- a/drivers/misc/sgi-gru/grumain.c +++ b/drivers/misc/sgi-gru/grumain.c | |||
@@ -572,8 +572,12 @@ void gru_load_context(struct gru_thread_state *gts) | |||
572 | 572 | ||
573 | if (is_kernel_context(gts)) { | 573 | if (is_kernel_context(gts)) { |
574 | cch->unmap_enable = 1; | 574 | cch->unmap_enable = 1; |
575 | cch->tfm_done_bit_enable = 1; | ||
576 | cch->cb_int_enable = 1; | ||
575 | } else { | 577 | } else { |
576 | cch->unmap_enable = 0; | 578 | cch->unmap_enable = 0; |
579 | cch->tfm_done_bit_enable = 0; | ||
580 | cch->cb_int_enable = 0; | ||
577 | asid = gru_load_mm_tracker(gru, gts); | 581 | asid = gru_load_mm_tracker(gru, gts); |
578 | for (i = 0; i < 8; i++) { | 582 | for (i = 0; i < 8; i++) { |
579 | cch->asid[i] = asid + i; | 583 | cch->asid[i] = asid + i; |
diff --git a/drivers/misc/sgi-gru/grutables.h b/drivers/misc/sgi-gru/grutables.h index 5f8f3bda2fa9..ca81800146ff 100644 --- a/drivers/misc/sgi-gru/grutables.h +++ b/drivers/misc/sgi-gru/grutables.h | |||
@@ -462,6 +462,11 @@ struct gru_blade_state { | |||
462 | struct rw_semaphore bs_kgts_sema; /* lock for kgts */ | 462 | struct rw_semaphore bs_kgts_sema; /* lock for kgts */ |
463 | struct gru_thread_state *bs_kgts; /* GTS for kernel use */ | 463 | struct gru_thread_state *bs_kgts; /* GTS for kernel use */ |
464 | 464 | ||
465 | /* ---- the following are used for managing kernel async GRU CBRs --- */ | ||
466 | int bs_async_dsr_bytes; /* DSRs for async */ | ||
467 | int bs_async_cbrs; /* CBRs AU for async */ | ||
468 | struct completion *bs_async_wq; | ||
469 | |||
465 | /* ---- the following are protected by the bs_lock spinlock ---- */ | 470 | /* ---- the following are protected by the bs_lock spinlock ---- */ |
466 | spinlock_t bs_lock; /* lock used for | 471 | spinlock_t bs_lock; /* lock used for |
467 | stealing contexts */ | 472 | stealing contexts */ |