Commit 6e910074 authored by Jack Steiner's avatar Jack Steiner Committed by Linus Torvalds

gru: support cch_allocate for kernel threads

Change the interface to cch_allocate so that it can be used to allocate
GRU contexts for kernel threads.  Kernel threads use the GRU in unmapped
mode and do not require ASIDs for the GRU TLB.
Signed-off-by: default avatarJack Steiner <steiner@sgi.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent d57c82b1
...@@ -72,18 +72,8 @@ static int wait_instruction_complete(void *h, enum mcs_op opc) ...@@ -72,18 +72,8 @@ static int wait_instruction_complete(void *h, enum mcs_op opc)
return status; return status;
} }
int cch_allocate(struct gru_context_configuration_handle *cch, int cch_allocate(struct gru_context_configuration_handle *cch)
int asidval, int sizeavail, unsigned long cbrmap,
unsigned long dsrmap)
{ {
int i;
for (i = 0; i < 8; i++) {
cch->asid[i] = (asidval++);
cch->sizeavail[i] = sizeavail;
}
cch->dsr_allocation_map = dsrmap;
cch->cbr_allocation_map = cbrmap;
cch->opc = CCHOP_ALLOCATE; cch->opc = CCHOP_ALLOCATE;
start_instruction(cch); start_instruction(cch);
return wait_instruction_complete(cch, cchop_allocate); return wait_instruction_complete(cch, cchop_allocate);
......
...@@ -480,9 +480,7 @@ enum gru_cbr_state { ...@@ -480,9 +480,7 @@ enum gru_cbr_state {
/* minimum TLB purge count to ensure a full purge */ /* minimum TLB purge count to ensure a full purge */
#define GRUMAXINVAL 1024UL #define GRUMAXINVAL 1024UL
int cch_allocate(struct gru_context_configuration_handle *cch, int cch_allocate(struct gru_context_configuration_handle *cch);
int asidval, int sizeavail, unsigned long cbrmap, unsigned long dsrmap);
int cch_start(struct gru_context_configuration_handle *cch); int cch_start(struct gru_context_configuration_handle *cch);
int cch_interrupt(struct gru_context_configuration_handle *cch); int cch_interrupt(struct gru_context_configuration_handle *cch);
int cch_deallocate(struct gru_context_configuration_handle *cch); int cch_deallocate(struct gru_context_configuration_handle *cch);
......
...@@ -672,7 +672,10 @@ int gru_kservices_init(struct gru_state *gru) ...@@ -672,7 +672,10 @@ int gru_kservices_init(struct gru_state *gru)
cch->tlb_int_enable = 0; cch->tlb_int_enable = 0;
cch->tfm_done_bit_enable = 0; cch->tfm_done_bit_enable = 0;
cch->unmap_enable = 1; cch->unmap_enable = 1;
err = cch_allocate(cch, 0, 0, cbr_map, dsr_map); cch->dsr_allocation_map = dsr_map;
cch->cbr_allocation_map = cbr_map;
err = cch_allocate(cch);
if (err) { if (err) {
gru_dbg(grudev, gru_dbg(grudev,
"Unable to allocate kernel CCH: gid %d, err %d\n", "Unable to allocate kernel CCH: gid %d, err %d\n",
......
...@@ -537,13 +537,12 @@ void gru_load_context(struct gru_thread_state *gts) ...@@ -537,13 +537,12 @@ void gru_load_context(struct gru_thread_state *gts)
{ {
struct gru_state *gru = gts->ts_gru; struct gru_state *gru = gts->ts_gru;
struct gru_context_configuration_handle *cch; struct gru_context_configuration_handle *cch;
int err, asid, ctxnum = gts->ts_ctxnum; int i, err, asid, ctxnum = gts->ts_ctxnum;
gru_dbg(grudev, "gts %p\n", gts); gru_dbg(grudev, "gts %p\n", gts);
cch = get_cch(gru->gs_gru_base_vaddr, ctxnum); cch = get_cch(gru->gs_gru_base_vaddr, ctxnum);
lock_cch_handle(cch); lock_cch_handle(cch);
asid = gru_load_mm_tracker(gru, gts);
cch->tfm_fault_bit_enable = cch->tfm_fault_bit_enable =
(gts->ts_user_options == GRU_OPT_MISS_FMM_POLL (gts->ts_user_options == GRU_OPT_MISS_FMM_POLL
|| gts->ts_user_options == GRU_OPT_MISS_FMM_INTR); || gts->ts_user_options == GRU_OPT_MISS_FMM_INTR);
...@@ -553,8 +552,16 @@ void gru_load_context(struct gru_thread_state *gts) ...@@ -553,8 +552,16 @@ void gru_load_context(struct gru_thread_state *gts)
cch->tlb_int_select = gts->ts_tlb_int_select; cch->tlb_int_select = gts->ts_tlb_int_select;
} }
cch->tfm_done_bit_enable = 0; cch->tfm_done_bit_enable = 0;
err = cch_allocate(cch, asid, gts->ts_sizeavail, gts->ts_cbr_map, cch->dsr_allocation_map = gts->ts_dsr_map;
gts->ts_dsr_map); cch->cbr_allocation_map = gts->ts_cbr_map;
asid = gru_load_mm_tracker(gru, gts);
cch->unmap_enable = 0;
for (i = 0; i < 8; i++) {
cch->asid[i] = asid + i;
cch->sizeavail[i] = gts->ts_sizeavail;
}
err = cch_allocate(cch);
if (err) { if (err) {
gru_dbg(grudev, gru_dbg(grudev,
"err %d: cch %p, gts %p, cbr 0x%lx, dsr 0x%lx\n", "err %d: cch %p, gts %p, cbr 0x%lx, dsr 0x%lx\n",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment