• Home
  • Raw
  • Download

Lines Matching +full:dsr +full:- +full:override

20  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
69 /*--------- ASID Management -------------------------------------------
84 * the search for in-use asids only checks contexts with GRUs currently
89 * 0---------------x------------x---------------------x----|
90 * ^-next ^-limit ^-MAX_ASID
99 gru_dbg(grudev, "gid %d\n", gru->gs_gid); in gru_wrap_asid()
101 gru->gs_asid_gen++; in gru_wrap_asid()
110 gru_dbg(grudev, "gid %d, asid 0x%x\n", gru->gs_gid, asid); in gru_reset_asid_limit()
116 gid = gru->gs_gid; in gru_reset_asid_limit()
119 if (!gru->gs_gts[i] || is_kernel_context(gru->gs_gts[i])) in gru_reset_asid_limit()
121 inuse_asid = gru->gs_gts[i]->ts_gms->ms_asids[gid].mt_asid; in gru_reset_asid_limit()
123 gru->gs_gid, gru->gs_gts[i], gru->gs_gts[i]->ts_gms, in gru_reset_asid_limit()
142 gru->gs_asid_limit = limit; in gru_reset_asid_limit()
143 gru->gs_asid = asid; in gru_reset_asid_limit()
144 gru_dbg(grudev, "gid %d, new asid 0x%x, new_limit 0x%x\n", gru->gs_gid, in gru_reset_asid_limit()
154 gru->gs_asid += ASID_INC; in gru_assign_asid()
155 asid = gru->gs_asid; in gru_assign_asid()
156 if (asid >= gru->gs_asid_limit) in gru_assign_asid()
159 gru_dbg(grudev, "gid %d, asid 0x%x\n", gru->gs_gid, asid); in gru_assign_asid()
173 while (n--) { in reserve_resources()
188 return reserve_resources(&gru->gs_cbr_map, cbr_au_count, GRU_CBR_AU, in gru_reserve_cb_resources()
195 return reserve_resources(&gru->gs_dsr_map, dsr_au_count, GRU_DSR_AU, in gru_reserve_ds_resources()
202 gru->gs_active_contexts++; in reserve_gru_resources()
203 gts->ts_cbr_map = in reserve_gru_resources()
204 gru_reserve_cb_resources(gru, gts->ts_cbr_au_count, in reserve_gru_resources()
205 gts->ts_cbr_idx); in reserve_gru_resources()
206 gts->ts_dsr_map = in reserve_gru_resources()
207 gru_reserve_ds_resources(gru, gts->ts_dsr_au_count, NULL); in reserve_gru_resources()
213 gru->gs_active_contexts--; in free_gru_resources()
214 gru->gs_cbr_map |= gts->ts_cbr_map; in free_gru_resources()
215 gru->gs_dsr_map |= gts->ts_dsr_map; in free_gru_resources()
228 return hweight64(gru->gs_cbr_map) >= cbr_au_count in check_gru_resources()
229 && hweight64(gru->gs_dsr_map) >= dsr_au_count in check_gru_resources()
230 && gru->gs_active_contexts < max_active_contexts; in check_gru_resources()
240 struct gru_mm_struct *gms = gts->ts_gms; in gru_load_mm_tracker()
241 struct gru_mm_tracker *asids = &gms->ms_asids[gru->gs_gid]; in gru_load_mm_tracker()
242 unsigned short ctxbitmap = (1 << gts->ts_ctxnum); in gru_load_mm_tracker()
245 spin_lock(&gms->ms_asid_lock); in gru_load_mm_tracker()
246 asid = asids->mt_asid; in gru_load_mm_tracker()
248 spin_lock(&gru->gs_asid_lock); in gru_load_mm_tracker()
249 if (asid == 0 || (asids->mt_ctxbitmap == 0 && asids->mt_asid_gen != in gru_load_mm_tracker()
250 gru->gs_asid_gen)) { in gru_load_mm_tracker()
252 asids->mt_asid = asid; in gru_load_mm_tracker()
253 asids->mt_asid_gen = gru->gs_asid_gen; in gru_load_mm_tracker()
258 spin_unlock(&gru->gs_asid_lock); in gru_load_mm_tracker()
260 BUG_ON(asids->mt_ctxbitmap & ctxbitmap); in gru_load_mm_tracker()
261 asids->mt_ctxbitmap |= ctxbitmap; in gru_load_mm_tracker()
262 if (!test_bit(gru->gs_gid, gms->ms_asidmap)) in gru_load_mm_tracker()
263 __set_bit(gru->gs_gid, gms->ms_asidmap); in gru_load_mm_tracker()
264 spin_unlock(&gms->ms_asid_lock); in gru_load_mm_tracker()
268 gru->gs_gid, gts, gms, gts->ts_ctxnum, asid, in gru_load_mm_tracker()
269 gms->ms_asidmap[0]); in gru_load_mm_tracker()
276 struct gru_mm_struct *gms = gts->ts_gms; in gru_unload_mm_tracker()
280 asids = &gms->ms_asids[gru->gs_gid]; in gru_unload_mm_tracker()
281 ctxbitmap = (1 << gts->ts_ctxnum); in gru_unload_mm_tracker()
282 spin_lock(&gms->ms_asid_lock); in gru_unload_mm_tracker()
283 spin_lock(&gru->gs_asid_lock); in gru_unload_mm_tracker()
284 BUG_ON((asids->mt_ctxbitmap & ctxbitmap) != ctxbitmap); in gru_unload_mm_tracker()
285 asids->mt_ctxbitmap ^= ctxbitmap; in gru_unload_mm_tracker()
287 gru->gs_gid, gts, gms, gts->ts_ctxnum, gms->ms_asidmap[0]); in gru_unload_mm_tracker()
288 spin_unlock(&gru->gs_asid_lock); in gru_unload_mm_tracker()
289 spin_unlock(&gms->ms_asid_lock); in gru_unload_mm_tracker()
298 if (gts && atomic_dec_return(&gts->ts_refcnt) == 0) { in gts_drop()
299 if (gts->ts_gms) in gts_drop()
300 gru_drop_mmu_notifier(gts->ts_gms); in gts_drop()
314 list_for_each_entry(gts, &vdata->vd_head, ts_next) in gru_find_current_gts_nolock()
315 if (gts->ts_tsid == tsid) in gru_find_current_gts_nolock()
335 return ERR_PTR(-ENOMEM); in gru_alloc_gts()
339 atomic_set(&gts->ts_refcnt, 1); in gru_alloc_gts()
340 mutex_init(&gts->ts_ctxlock); in gru_alloc_gts()
341 gts->ts_cbr_au_count = cbr_au_count; in gru_alloc_gts()
342 gts->ts_dsr_au_count = dsr_au_count; in gru_alloc_gts()
343 gts->ts_tlb_preload_count = tlb_preload_count; in gru_alloc_gts()
344 gts->ts_user_options = options; in gru_alloc_gts()
345 gts->ts_user_blade_id = -1; in gru_alloc_gts()
346 gts->ts_user_chiplet_id = -1; in gru_alloc_gts()
347 gts->ts_tsid = tsid; in gru_alloc_gts()
348 gts->ts_ctxnum = NULLCTX; in gru_alloc_gts()
349 gts->ts_tlb_int_select = -1; in gru_alloc_gts()
350 gts->ts_cch_req_slice = -1; in gru_alloc_gts()
351 gts->ts_sizeavail = GRU_SIZEAVAIL(PAGE_SHIFT); in gru_alloc_gts()
353 gts->ts_mm = current->mm; in gru_alloc_gts()
354 gts->ts_vma = vma; in gru_alloc_gts()
358 gts->ts_gms = gms; in gru_alloc_gts()
381 INIT_LIST_HEAD(&vdata->vd_head); in gru_alloc_vma_data()
382 spin_lock_init(&vdata->vd_lock); in gru_alloc_vma_data()
393 struct gru_vma_data *vdata = vma->vm_private_data; in gru_find_thread_state()
396 spin_lock(&vdata->vd_lock); in gru_find_thread_state()
398 spin_unlock(&vdata->vd_lock); in gru_find_thread_state()
410 struct gru_vma_data *vdata = vma->vm_private_data; in gru_alloc_thread_state()
413 gts = gru_alloc_gts(vma, vdata->vd_cbr_au_count, in gru_alloc_thread_state()
414 vdata->vd_dsr_au_count, in gru_alloc_thread_state()
415 vdata->vd_tlb_preload_count, in gru_alloc_thread_state()
416 vdata->vd_user_options, tsid); in gru_alloc_thread_state()
420 spin_lock(&vdata->vd_lock); in gru_alloc_thread_state()
427 list_add(&gts->ts_next, &vdata->vd_head); in gru_alloc_thread_state()
429 spin_unlock(&vdata->vd_lock); in gru_alloc_thread_state()
441 gru = gts->ts_gru; in gru_free_gru_context()
442 gru_dbg(grudev, "gts %p, gid %d\n", gts, gru->gs_gid); in gru_free_gru_context()
444 spin_lock(&gru->gs_lock); in gru_free_gru_context()
445 gru->gs_gts[gts->ts_ctxnum] = NULL; in gru_free_gru_context()
447 BUG_ON(test_bit(gts->ts_ctxnum, &gru->gs_context_map) == 0); in gru_free_gru_context()
448 __clear_bit(gts->ts_ctxnum, &gru->gs_context_map); in gru_free_gru_context()
449 gts->ts_ctxnum = NULLCTX; in gru_free_gru_context()
450 gts->ts_gru = NULL; in gru_free_gru_context()
451 gts->ts_blade = -1; in gru_free_gru_context()
452 spin_unlock(&gru->gs_lock); in gru_free_gru_context()
464 while (num-- > 0) { in prefetch_data()
557 struct gru_state *gru = gts->ts_gru; in gru_unload_context()
559 int ctxnum = gts->ts_ctxnum; in gru_unload_context()
562 zap_vma_ptes(gts->ts_vma, UGRUADDR(gts), GRU_GSEG_PAGESIZE); in gru_unload_context()
563 cch = get_cch(gru->gs_gru_base_vaddr, ctxnum); in gru_unload_context()
566 gts, gts->ts_cbr_map, gts->ts_dsr_map); in gru_unload_context()
574 gru_unload_context_data(gts->ts_gdata, gru->gs_gru_base_vaddr, in gru_unload_context()
575 ctxnum, gts->ts_cbr_map, in gru_unload_context()
576 gts->ts_dsr_map); in gru_unload_context()
577 gts->ts_data_valid = 1; in gru_unload_context()
593 struct gru_state *gru = gts->ts_gru; in gru_load_context()
595 int i, err, asid, ctxnum = gts->ts_ctxnum; in gru_load_context()
597 cch = get_cch(gru->gs_gru_base_vaddr, ctxnum); in gru_load_context()
599 cch->tfm_fault_bit_enable = in gru_load_context()
600 (gts->ts_user_options == GRU_OPT_MISS_FMM_POLL in gru_load_context()
601 || gts->ts_user_options == GRU_OPT_MISS_FMM_INTR); in gru_load_context()
602 cch->tlb_int_enable = (gts->ts_user_options == GRU_OPT_MISS_FMM_INTR); in gru_load_context()
603 if (cch->tlb_int_enable) { in gru_load_context()
604 gts->ts_tlb_int_select = gru_cpu_fault_map_id(); in gru_load_context()
605 cch->tlb_int_select = gts->ts_tlb_int_select; in gru_load_context()
607 if (gts->ts_cch_req_slice >= 0) { in gru_load_context()
608 cch->req_slice_set_enable = 1; in gru_load_context()
609 cch->req_slice = gts->ts_cch_req_slice; in gru_load_context()
611 cch->req_slice_set_enable =0; in gru_load_context()
613 cch->tfm_done_bit_enable = 0; in gru_load_context()
614 cch->dsr_allocation_map = gts->ts_dsr_map; in gru_load_context()
615 cch->cbr_allocation_map = gts->ts_cbr_map; in gru_load_context()
618 cch->unmap_enable = 1; in gru_load_context()
619 cch->tfm_done_bit_enable = 1; in gru_load_context()
620 cch->cb_int_enable = 1; in gru_load_context()
621 cch->tlb_int_select = 0; /* For now, ints go to cpu 0 */ in gru_load_context()
623 cch->unmap_enable = 0; in gru_load_context()
624 cch->tfm_done_bit_enable = 0; in gru_load_context()
625 cch->cb_int_enable = 0; in gru_load_context()
628 cch->asid[i] = asid + i; in gru_load_context()
629 cch->sizeavail[i] = gts->ts_sizeavail; in gru_load_context()
636 "err %d: cch %p, gts %p, cbr 0x%lx, dsr 0x%lx\n", in gru_load_context()
637 err, cch, gts, gts->ts_cbr_map, gts->ts_dsr_map); in gru_load_context()
641 gru_load_context_data(gts->ts_gdata, gru->gs_gru_base_vaddr, ctxnum, in gru_load_context()
642 gts->ts_cbr_map, gts->ts_dsr_map, gts->ts_data_valid); in gru_load_context()
649 gts->ts_gru->gs_gid, gts, gts->ts_cbr_map, gts->ts_dsr_map, in gru_load_context()
650 (gts->ts_user_options == GRU_OPT_MISS_FMM_INTR), gts->ts_tlb_int_select); in gru_load_context()
655 * - retarget interrupts on local blade
656 * - update sizeavail mask
661 struct gru_state *gru = gts->ts_gru; in gru_update_cch()
662 int i, ctxnum = gts->ts_ctxnum, ret = 0; in gru_update_cch()
664 cch = get_cch(gru->gs_gru_base_vaddr, ctxnum); in gru_update_cch()
667 if (cch->state == CCHSTATE_ACTIVE) { in gru_update_cch()
668 if (gru->gs_gts[gts->ts_ctxnum] != gts) in gru_update_cch()
673 cch->sizeavail[i] = gts->ts_sizeavail; in gru_update_cch()
674 gts->ts_tlb_int_select = gru_cpu_fault_map_id(); in gru_update_cch()
675 cch->tlb_int_select = gru_cpu_fault_map_id(); in gru_update_cch()
676 cch->tfm_fault_bit_enable = in gru_update_cch()
677 (gts->ts_user_options == GRU_OPT_MISS_FMM_POLL in gru_update_cch()
678 || gts->ts_user_options == GRU_OPT_MISS_FMM_INTR); in gru_update_cch()
690 * - task's GRU context is loaded into a GRU
691 * - task is using interrupt notification for TLB faults
692 * - task has migrated to a different cpu on the same blade where
697 if (gts->ts_tlb_int_select < 0 in gru_retarget_intr()
698 || gts->ts_tlb_int_select == gru_cpu_fault_map_id()) in gru_retarget_intr()
701 gru_dbg(grudev, "retarget from %d to %d\n", gts->ts_tlb_int_select, in gru_retarget_intr()
708 * a context is assigned to any blade-local chiplet. However, users can
709 * override this.
718 blade_id = gts->ts_user_blade_id; in gru_check_chiplet_assignment()
722 chiplet_id = gts->ts_user_chiplet_id; in gru_check_chiplet_assignment()
723 return gru->gs_blade_id == blade_id && in gru_check_chiplet_assignment()
724 (chiplet_id < 0 || chiplet_id == gru->gs_chiplet_id); in gru_check_chiplet_assignment()
738 * context is correctly placed. This test is skipped for non-owner in gru_check_context_placement()
739 * references. Pthread apps use non-owner references to the CBRs. in gru_check_context_placement()
741 gru = gts->ts_gru; in gru_check_context_placement()
742 if (!gru || gts->ts_tgid_owner != current->tgid) in gru_check_context_placement()
758 #define next_ctxnum(n) ((n) < GRU_NUM_CCH - 2 ? (n) + 1 : 0)
759 #define next_gru(b, g) (((g) < &(b)->bs_grus[GRU_CHIPLETS_PER_BLADE - 1]) ? \
760 ((g)+1) : &(b)->bs_grus[0])
766 return down_write_trylock(&bs->bs_kgts_sema); in is_gts_stealable()
768 return mutex_trylock(&gts->ts_ctxlock); in is_gts_stealable()
775 up_write(&bs->bs_kgts_sema); in gts_stolen()
778 mutex_unlock(&gts->ts_ctxlock); in gts_stolen()
788 int ctxnum, ctxnum0, flag = 0, cbr, dsr; in gru_steal_context() local
791 blade_id = gts->ts_user_blade_id; in gru_steal_context()
794 cbr = gts->ts_cbr_au_count; in gru_steal_context()
795 dsr = gts->ts_dsr_au_count; in gru_steal_context()
798 spin_lock(&blade->bs_lock); in gru_steal_context()
800 ctxnum = next_ctxnum(blade->bs_lru_ctxnum); in gru_steal_context()
801 gru = blade->bs_lru_gru; in gru_steal_context()
804 blade->bs_lru_gru = gru; in gru_steal_context()
805 blade->bs_lru_ctxnum = ctxnum; in gru_steal_context()
810 if (check_gru_resources(gru, cbr, dsr, GRU_NUM_CCH)) in gru_steal_context()
812 spin_lock(&gru->gs_lock); in gru_steal_context()
816 ngts = gru->gs_gts[ctxnum]; in gru_steal_context()
827 spin_unlock(&gru->gs_lock); in gru_steal_context()
837 spin_unlock(&blade->bs_lock); in gru_steal_context()
840 gts->ustats.context_stolen++; in gru_steal_context()
841 ngts->ts_steal_jiffies = jiffies; in gru_steal_context()
850 gru->gs_gid, ctxnum, ngts, cbr, dsr, hweight64(gru->gs_cbr_map), in gru_steal_context()
851 hweight64(gru->gs_dsr_map)); in gru_steal_context()
861 ctxnum = find_first_zero_bit(&gru->gs_context_map, GRU_NUM_CCH); in gru_assign_context_number()
862 __set_bit(ctxnum, &gru->gs_context_map); in gru_assign_context_number()
873 int blade_id = gts->ts_user_blade_id; in gru_assign_gru_context()
883 if (check_gru_resources(grux, gts->ts_cbr_au_count, in gru_assign_gru_context()
884 gts->ts_dsr_au_count, in gru_assign_gru_context()
887 max_active_contexts = grux->gs_active_contexts; in gru_assign_gru_context()
894 spin_lock(&gru->gs_lock); in gru_assign_gru_context()
895 if (!check_gru_resources(gru, gts->ts_cbr_au_count, in gru_assign_gru_context()
896 gts->ts_dsr_au_count, GRU_NUM_CCH)) { in gru_assign_gru_context()
897 spin_unlock(&gru->gs_lock); in gru_assign_gru_context()
901 gts->ts_gru = gru; in gru_assign_gru_context()
902 gts->ts_blade = gru->gs_blade_id; in gru_assign_gru_context()
903 gts->ts_ctxnum = gru_assign_context_number(gru); in gru_assign_gru_context()
904 atomic_inc(&gts->ts_refcnt); in gru_assign_gru_context()
905 gru->gs_gts[gts->ts_ctxnum] = gts; in gru_assign_gru_context()
906 spin_unlock(&gru->gs_lock); in gru_assign_gru_context()
910 "gseg %p, gts %p, gid %d, ctx %d, cbr %d, dsr %d\n", in gru_assign_gru_context()
911 gseg_virtual_address(gts->ts_gru, gts->ts_ctxnum), gts, in gru_assign_gru_context()
912 gts->ts_gru->gs_gid, gts->ts_ctxnum, in gru_assign_gru_context()
913 gts->ts_cbr_au_count, gts->ts_dsr_au_count); in gru_assign_gru_context()
931 struct vm_area_struct *vma = vmf->vma; in gru_fault()
936 vaddr = vmf->address; in gru_fault()
947 mutex_lock(&gts->ts_ctxlock); in gru_fault()
952 if (!gts->ts_gru) { in gru_fault()
956 mutex_unlock(&gts->ts_ctxlock); in gru_fault()
959 expires = gts->ts_steal_jiffies + GRU_STEAL_DELAY; in gru_fault()
965 paddr = gseg_physical_address(gts->ts_gru, gts->ts_ctxnum); in gru_fault()
966 remap_pfn_range(vma, vaddr & ~(GRU_GSEG_PAGESIZE - 1), in gru_fault()
968 vma->vm_page_prot); in gru_fault()
972 mutex_unlock(&gts->ts_ctxlock); in gru_fault()