aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/misc/sgi-gru/gruhandles.c12
-rw-r--r--drivers/misc/sgi-gru/gruhandles.h4
-rw-r--r--drivers/misc/sgi-gru/grukservices.c5
-rw-r--r--drivers/misc/sgi-gru/grumain.c15
4 files changed, 17 insertions, 19 deletions
diff --git a/drivers/misc/sgi-gru/gruhandles.c b/drivers/misc/sgi-gru/gruhandles.c
index 9b7ccb328697..a3a870ad9153 100644
--- a/drivers/misc/sgi-gru/gruhandles.c
+++ b/drivers/misc/sgi-gru/gruhandles.c
@@ -72,18 +72,8 @@ static int wait_instruction_complete(void *h, enum mcs_op opc)
72 return status; 72 return status;
73} 73}
74 74
75int cch_allocate(struct gru_context_configuration_handle *cch, 75int cch_allocate(struct gru_context_configuration_handle *cch)
76 int asidval, int sizeavail, unsigned long cbrmap,
77 unsigned long dsrmap)
78{ 76{
79 int i;
80
81 for (i = 0; i < 8; i++) {
82 cch->asid[i] = (asidval++);
83 cch->sizeavail[i] = sizeavail;
84 }
85 cch->dsr_allocation_map = dsrmap;
86 cch->cbr_allocation_map = cbrmap;
87 cch->opc = CCHOP_ALLOCATE; 77 cch->opc = CCHOP_ALLOCATE;
88 start_instruction(cch); 78 start_instruction(cch);
89 return wait_instruction_complete(cch, cchop_allocate); 79 return wait_instruction_complete(cch, cchop_allocate);
diff --git a/drivers/misc/sgi-gru/gruhandles.h b/drivers/misc/sgi-gru/gruhandles.h
index 03b76a1993c3..9f41e2cc09d5 100644
--- a/drivers/misc/sgi-gru/gruhandles.h
+++ b/drivers/misc/sgi-gru/gruhandles.h
@@ -480,9 +480,7 @@ enum gru_cbr_state {
480/* minimum TLB purge count to ensure a full purge */ 480/* minimum TLB purge count to ensure a full purge */
481#define GRUMAXINVAL 1024UL 481#define GRUMAXINVAL 1024UL
482 482
483int cch_allocate(struct gru_context_configuration_handle *cch, 483int cch_allocate(struct gru_context_configuration_handle *cch);
484 int asidval, int sizeavail, unsigned long cbrmap, unsigned long dsrmap);
485
486int cch_start(struct gru_context_configuration_handle *cch); 484int cch_start(struct gru_context_configuration_handle *cch);
487int cch_interrupt(struct gru_context_configuration_handle *cch); 485int cch_interrupt(struct gru_context_configuration_handle *cch);
488int cch_deallocate(struct gru_context_configuration_handle *cch); 486int cch_deallocate(struct gru_context_configuration_handle *cch);
diff --git a/drivers/misc/sgi-gru/grukservices.c b/drivers/misc/sgi-gru/grukservices.c
index d8bd7d84a7cf..900f7aad2286 100644
--- a/drivers/misc/sgi-gru/grukservices.c
+++ b/drivers/misc/sgi-gru/grukservices.c
@@ -672,7 +672,10 @@ int gru_kservices_init(struct gru_state *gru)
672 cch->tlb_int_enable = 0; 672 cch->tlb_int_enable = 0;
673 cch->tfm_done_bit_enable = 0; 673 cch->tfm_done_bit_enable = 0;
674 cch->unmap_enable = 1; 674 cch->unmap_enable = 1;
675 err = cch_allocate(cch, 0, 0, cbr_map, dsr_map); 675 cch->dsr_allocation_map = dsr_map;
676 cch->cbr_allocation_map = cbr_map;
677
678 err = cch_allocate(cch);
676 if (err) { 679 if (err) {
677 gru_dbg(grudev, 680 gru_dbg(grudev,
678 "Unable to allocate kernel CCH: gid %d, err %d\n", 681 "Unable to allocate kernel CCH: gid %d, err %d\n",
diff --git a/drivers/misc/sgi-gru/grumain.c b/drivers/misc/sgi-gru/grumain.c
index 6358244f392d..0c7bd384f0cf 100644
--- a/drivers/misc/sgi-gru/grumain.c
+++ b/drivers/misc/sgi-gru/grumain.c
@@ -537,13 +537,12 @@ void gru_load_context(struct gru_thread_state *gts)
537{ 537{
538 struct gru_state *gru = gts->ts_gru; 538 struct gru_state *gru = gts->ts_gru;
539 struct gru_context_configuration_handle *cch; 539 struct gru_context_configuration_handle *cch;
540 int err, asid, ctxnum = gts->ts_ctxnum; 540 int i, err, asid, ctxnum = gts->ts_ctxnum;
541 541
542 gru_dbg(grudev, "gts %p\n", gts); 542 gru_dbg(grudev, "gts %p\n", gts);
543 cch = get_cch(gru->gs_gru_base_vaddr, ctxnum); 543 cch = get_cch(gru->gs_gru_base_vaddr, ctxnum);
544 544
545 lock_cch_handle(cch); 545 lock_cch_handle(cch);
546 asid = gru_load_mm_tracker(gru, gts);
547 cch->tfm_fault_bit_enable = 546 cch->tfm_fault_bit_enable =
548 (gts->ts_user_options == GRU_OPT_MISS_FMM_POLL 547 (gts->ts_user_options == GRU_OPT_MISS_FMM_POLL
549 || gts->ts_user_options == GRU_OPT_MISS_FMM_INTR); 548 || gts->ts_user_options == GRU_OPT_MISS_FMM_INTR);
@@ -553,8 +552,16 @@ void gru_load_context(struct gru_thread_state *gts)
553 cch->tlb_int_select = gts->ts_tlb_int_select; 552 cch->tlb_int_select = gts->ts_tlb_int_select;
554 } 553 }
555 cch->tfm_done_bit_enable = 0; 554 cch->tfm_done_bit_enable = 0;
556 err = cch_allocate(cch, asid, gts->ts_sizeavail, gts->ts_cbr_map, 555 cch->dsr_allocation_map = gts->ts_dsr_map;
557 gts->ts_dsr_map); 556 cch->cbr_allocation_map = gts->ts_cbr_map;
557 asid = gru_load_mm_tracker(gru, gts);
558 cch->unmap_enable = 0;
559 for (i = 0; i < 8; i++) {
560 cch->asid[i] = asid + i;
561 cch->sizeavail[i] = gts->ts_sizeavail;
562 }
563
564 err = cch_allocate(cch);
558 if (err) { 565 if (err) {
559 gru_dbg(grudev, 566 gru_dbg(grudev,
560 "err %d: cch %p, gts %p, cbr 0x%lx, dsr 0x%lx\n", 567 "err %d: cch %p, gts %p, cbr 0x%lx, dsr 0x%lx\n",