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

1 // SPDX-License-Identifier: GPL-2.0-or-later
56 /*--------- ASID Management -------------------------------------------
71 * the search for in-use asids only checks contexts with GRUs currently
76 * 0---------------x------------x---------------------x----|
77 * ^-next ^-limit ^-MAX_ASID
86 gru_dbg(grudev, "gid %d\n", gru->gs_gid); in gru_wrap_asid()
88 gru->gs_asid_gen++; in gru_wrap_asid()
97 gru_dbg(grudev, "gid %d, asid 0x%x\n", gru->gs_gid, asid); in gru_reset_asid_limit()
103 gid = gru->gs_gid; in gru_reset_asid_limit()
106 if (!gru->gs_gts[i] || is_kernel_context(gru->gs_gts[i])) in gru_reset_asid_limit()
108 inuse_asid = gru->gs_gts[i]->ts_gms->ms_asids[gid].mt_asid; in gru_reset_asid_limit()
110 gru->gs_gid, gru->gs_gts[i], gru->gs_gts[i]->ts_gms, in gru_reset_asid_limit()
129 gru->gs_asid_limit = limit; in gru_reset_asid_limit()
130 gru->gs_asid = asid; in gru_reset_asid_limit()
131 gru_dbg(grudev, "gid %d, new asid 0x%x, new_limit 0x%x\n", gru->gs_gid, in gru_reset_asid_limit()
141 gru->gs_asid += ASID_INC; in gru_assign_asid()
142 asid = gru->gs_asid; in gru_assign_asid()
143 if (asid >= gru->gs_asid_limit) in gru_assign_asid()
146 gru_dbg(grudev, "gid %d, asid 0x%x\n", gru->gs_gid, asid); in gru_assign_asid()
160 while (n--) { in reserve_resources()
175 return reserve_resources(&gru->gs_cbr_map, cbr_au_count, GRU_CBR_AU, in gru_reserve_cb_resources()
182 return reserve_resources(&gru->gs_dsr_map, dsr_au_count, GRU_DSR_AU, in gru_reserve_ds_resources()
189 gru->gs_active_contexts++; in reserve_gru_resources()
190 gts->ts_cbr_map = in reserve_gru_resources()
191 gru_reserve_cb_resources(gru, gts->ts_cbr_au_count, in reserve_gru_resources()
192 gts->ts_cbr_idx); in reserve_gru_resources()
193 gts->ts_dsr_map = in reserve_gru_resources()
194 gru_reserve_ds_resources(gru, gts->ts_dsr_au_count, NULL); in reserve_gru_resources()
200 gru->gs_active_contexts--; in free_gru_resources()
201 gru->gs_cbr_map |= gts->ts_cbr_map; in free_gru_resources()
202 gru->gs_dsr_map |= gts->ts_dsr_map; in free_gru_resources()
215 return hweight64(gru->gs_cbr_map) >= cbr_au_count in check_gru_resources()
216 && hweight64(gru->gs_dsr_map) >= dsr_au_count in check_gru_resources()
217 && gru->gs_active_contexts < max_active_contexts; in check_gru_resources()
227 struct gru_mm_struct *gms = gts->ts_gms; in gru_load_mm_tracker()
228 struct gru_mm_tracker *asids = &gms->ms_asids[gru->gs_gid]; in gru_load_mm_tracker()
229 unsigned short ctxbitmap = (1 << gts->ts_ctxnum); in gru_load_mm_tracker()
232 spin_lock(&gms->ms_asid_lock); in gru_load_mm_tracker()
233 asid = asids->mt_asid; in gru_load_mm_tracker()
235 spin_lock(&gru->gs_asid_lock); in gru_load_mm_tracker()
236 if (asid == 0 || (asids->mt_ctxbitmap == 0 && asids->mt_asid_gen != in gru_load_mm_tracker()
237 gru->gs_asid_gen)) { in gru_load_mm_tracker()
239 asids->mt_asid = asid; in gru_load_mm_tracker()
240 asids->mt_asid_gen = gru->gs_asid_gen; in gru_load_mm_tracker()
245 spin_unlock(&gru->gs_asid_lock); in gru_load_mm_tracker()
247 BUG_ON(asids->mt_ctxbitmap & ctxbitmap); in gru_load_mm_tracker()
248 asids->mt_ctxbitmap |= ctxbitmap; in gru_load_mm_tracker()
249 if (!test_bit(gru->gs_gid, gms->ms_asidmap)) in gru_load_mm_tracker()
250 __set_bit(gru->gs_gid, gms->ms_asidmap); in gru_load_mm_tracker()
251 spin_unlock(&gms->ms_asid_lock); in gru_load_mm_tracker()
255 gru->gs_gid, gts, gms, gts->ts_ctxnum, asid, in gru_load_mm_tracker()
256 gms->ms_asidmap[0]); in gru_load_mm_tracker()
263 struct gru_mm_struct *gms = gts->ts_gms; in gru_unload_mm_tracker()
267 asids = &gms->ms_asids[gru->gs_gid]; in gru_unload_mm_tracker()
268 ctxbitmap = (1 << gts->ts_ctxnum); in gru_unload_mm_tracker()
269 spin_lock(&gms->ms_asid_lock); in gru_unload_mm_tracker()
270 spin_lock(&gru->gs_asid_lock); in gru_unload_mm_tracker()
271 BUG_ON((asids->mt_ctxbitmap & ctxbitmap) != ctxbitmap); in gru_unload_mm_tracker()
272 asids->mt_ctxbitmap ^= ctxbitmap; in gru_unload_mm_tracker()
274 gru->gs_gid, gts, gms, gts->ts_ctxnum, gms->ms_asidmap[0]); in gru_unload_mm_tracker()
275 spin_unlock(&gru->gs_asid_lock); in gru_unload_mm_tracker()
276 spin_unlock(&gms->ms_asid_lock); in gru_unload_mm_tracker()
285 if (gts && refcount_dec_and_test(&gts->ts_refcnt)) { in gts_drop()
286 if (gts->ts_gms) in gts_drop()
287 gru_drop_mmu_notifier(gts->ts_gms); in gts_drop()
301 list_for_each_entry(gts, &vdata->vd_head, ts_next) in gru_find_current_gts_nolock()
302 if (gts->ts_tsid == tsid) in gru_find_current_gts_nolock()
322 return ERR_PTR(-ENOMEM); in gru_alloc_gts()
326 refcount_set(&gts->ts_refcnt, 1); in gru_alloc_gts()
327 mutex_init(&gts->ts_ctxlock); in gru_alloc_gts()
328 gts->ts_cbr_au_count = cbr_au_count; in gru_alloc_gts()
329 gts->ts_dsr_au_count = dsr_au_count; in gru_alloc_gts()
330 gts->ts_tlb_preload_count = tlb_preload_count; in gru_alloc_gts()
331 gts->ts_user_options = options; in gru_alloc_gts()
332 gts->ts_user_blade_id = -1; in gru_alloc_gts()
333 gts->ts_user_chiplet_id = -1; in gru_alloc_gts()
334 gts->ts_tsid = tsid; in gru_alloc_gts()
335 gts->ts_ctxnum = NULLCTX; in gru_alloc_gts()
336 gts->ts_tlb_int_select = -1; in gru_alloc_gts()
337 gts->ts_cch_req_slice = -1; in gru_alloc_gts()
338 gts->ts_sizeavail = GRU_SIZEAVAIL(PAGE_SHIFT); in gru_alloc_gts()
340 gts->ts_mm = current->mm; in gru_alloc_gts()
341 gts->ts_vma = vma; in gru_alloc_gts()
345 gts->ts_gms = gms; in gru_alloc_gts()
368 INIT_LIST_HEAD(&vdata->vd_head); in gru_alloc_vma_data()
369 spin_lock_init(&vdata->vd_lock); in gru_alloc_vma_data()
380 struct gru_vma_data *vdata = vma->vm_private_data; in gru_find_thread_state()
383 spin_lock(&vdata->vd_lock); in gru_find_thread_state()
385 spin_unlock(&vdata->vd_lock); in gru_find_thread_state()
397 struct gru_vma_data *vdata = vma->vm_private_data; in gru_alloc_thread_state()
400 gts = gru_alloc_gts(vma, vdata->vd_cbr_au_count, in gru_alloc_thread_state()
401 vdata->vd_dsr_au_count, in gru_alloc_thread_state()
402 vdata->vd_tlb_preload_count, in gru_alloc_thread_state()
403 vdata->vd_user_options, tsid); in gru_alloc_thread_state()
407 spin_lock(&vdata->vd_lock); in gru_alloc_thread_state()
414 list_add(&gts->ts_next, &vdata->vd_head); in gru_alloc_thread_state()
416 spin_unlock(&vdata->vd_lock); in gru_alloc_thread_state()
428 gru = gts->ts_gru; in gru_free_gru_context()
429 gru_dbg(grudev, "gts %p, gid %d\n", gts, gru->gs_gid); in gru_free_gru_context()
431 spin_lock(&gru->gs_lock); in gru_free_gru_context()
432 gru->gs_gts[gts->ts_ctxnum] = NULL; in gru_free_gru_context()
434 BUG_ON(test_bit(gts->ts_ctxnum, &gru->gs_context_map) == 0); in gru_free_gru_context()
435 __clear_bit(gts->ts_ctxnum, &gru->gs_context_map); in gru_free_gru_context()
436 gts->ts_ctxnum = NULLCTX; in gru_free_gru_context()
437 gts->ts_gru = NULL; in gru_free_gru_context()
438 gts->ts_blade = -1; in gru_free_gru_context()
439 spin_unlock(&gru->gs_lock); in gru_free_gru_context()
451 while (num-- > 0) { in prefetch_data()
544 struct gru_state *gru = gts->ts_gru; in gru_unload_context()
546 int ctxnum = gts->ts_ctxnum; in gru_unload_context()
549 zap_vma_ptes(gts->ts_vma, UGRUADDR(gts), GRU_GSEG_PAGESIZE); in gru_unload_context()
550 cch = get_cch(gru->gs_gru_base_vaddr, ctxnum); in gru_unload_context()
553 gts, gts->ts_cbr_map, gts->ts_dsr_map); in gru_unload_context()
561 gru_unload_context_data(gts->ts_gdata, gru->gs_gru_base_vaddr, in gru_unload_context()
562 ctxnum, gts->ts_cbr_map, in gru_unload_context()
563 gts->ts_dsr_map); in gru_unload_context()
564 gts->ts_data_valid = 1; in gru_unload_context()
580 struct gru_state *gru = gts->ts_gru; in gru_load_context()
582 int i, err, asid, ctxnum = gts->ts_ctxnum; in gru_load_context()
584 cch = get_cch(gru->gs_gru_base_vaddr, ctxnum); in gru_load_context()
586 cch->tfm_fault_bit_enable = in gru_load_context()
587 (gts->ts_user_options == GRU_OPT_MISS_FMM_POLL in gru_load_context()
588 || gts->ts_user_options == GRU_OPT_MISS_FMM_INTR); in gru_load_context()
589 cch->tlb_int_enable = (gts->ts_user_options == GRU_OPT_MISS_FMM_INTR); in gru_load_context()
590 if (cch->tlb_int_enable) { in gru_load_context()
591 gts->ts_tlb_int_select = gru_cpu_fault_map_id(); in gru_load_context()
592 cch->tlb_int_select = gts->ts_tlb_int_select; in gru_load_context()
594 if (gts->ts_cch_req_slice >= 0) { in gru_load_context()
595 cch->req_slice_set_enable = 1; in gru_load_context()
596 cch->req_slice = gts->ts_cch_req_slice; in gru_load_context()
598 cch->req_slice_set_enable =0; in gru_load_context()
600 cch->tfm_done_bit_enable = 0; in gru_load_context()
601 cch->dsr_allocation_map = gts->ts_dsr_map; in gru_load_context()
602 cch->cbr_allocation_map = gts->ts_cbr_map; in gru_load_context()
605 cch->unmap_enable = 1; in gru_load_context()
606 cch->tfm_done_bit_enable = 1; in gru_load_context()
607 cch->cb_int_enable = 1; in gru_load_context()
608 cch->tlb_int_select = 0; /* For now, ints go to cpu 0 */ in gru_load_context()
610 cch->unmap_enable = 0; in gru_load_context()
611 cch->tfm_done_bit_enable = 0; in gru_load_context()
612 cch->cb_int_enable = 0; in gru_load_context()
615 cch->asid[i] = asid + i; in gru_load_context()
616 cch->sizeavail[i] = gts->ts_sizeavail; in gru_load_context()
623 "err %d: cch %p, gts %p, cbr 0x%lx, dsr 0x%lx\n", in gru_load_context()
624 err, cch, gts, gts->ts_cbr_map, gts->ts_dsr_map); in gru_load_context()
628 gru_load_context_data(gts->ts_gdata, gru->gs_gru_base_vaddr, ctxnum, in gru_load_context()
629 gts->ts_cbr_map, gts->ts_dsr_map, gts->ts_data_valid); in gru_load_context()
636 gts->ts_gru->gs_gid, gts, gts->ts_cbr_map, gts->ts_dsr_map, in gru_load_context()
637 (gts->ts_user_options == GRU_OPT_MISS_FMM_INTR), gts->ts_tlb_int_select); in gru_load_context()
642 * - retarget interrupts on local blade
643 * - update sizeavail mask
648 struct gru_state *gru = gts->ts_gru; in gru_update_cch()
649 int i, ctxnum = gts->ts_ctxnum, ret = 0; in gru_update_cch()
651 cch = get_cch(gru->gs_gru_base_vaddr, ctxnum); in gru_update_cch()
654 if (cch->state == CCHSTATE_ACTIVE) { in gru_update_cch()
655 if (gru->gs_gts[gts->ts_ctxnum] != gts) in gru_update_cch()
660 cch->sizeavail[i] = gts->ts_sizeavail; in gru_update_cch()
661 gts->ts_tlb_int_select = gru_cpu_fault_map_id(); in gru_update_cch()
662 cch->tlb_int_select = gru_cpu_fault_map_id(); in gru_update_cch()
663 cch->tfm_fault_bit_enable = in gru_update_cch()
664 (gts->ts_user_options == GRU_OPT_MISS_FMM_POLL in gru_update_cch()
665 || gts->ts_user_options == GRU_OPT_MISS_FMM_INTR); in gru_update_cch()
677 * - task's GRU context is loaded into a GRU
678 * - task is using interrupt notification for TLB faults
679 * - task has migrated to a different cpu on the same blade where
684 if (gts->ts_tlb_int_select < 0 in gru_retarget_intr()
685 || gts->ts_tlb_int_select == gru_cpu_fault_map_id()) in gru_retarget_intr()
688 gru_dbg(grudev, "retarget from %d to %d\n", gts->ts_tlb_int_select, in gru_retarget_intr()
695 * a context is assigned to any blade-local chiplet. However, users can
696 * override this.
705 blade_id = gts->ts_user_blade_id; in gru_check_chiplet_assignment()
709 chiplet_id = gts->ts_user_chiplet_id; in gru_check_chiplet_assignment()
710 return gru->gs_blade_id == blade_id && in gru_check_chiplet_assignment()
711 (chiplet_id < 0 || chiplet_id == gru->gs_chiplet_id); in gru_check_chiplet_assignment()
725 * context is correctly placed. This test is skipped for non-owner in gru_check_context_placement()
726 * references. Pthread apps use non-owner references to the CBRs. in gru_check_context_placement()
728 gru = gts->ts_gru; in gru_check_context_placement()
729 if (!gru || gts->ts_tgid_owner != current->tgid) in gru_check_context_placement()
745 #define next_ctxnum(n) ((n) < GRU_NUM_CCH - 2 ? (n) + 1 : 0)
746 #define next_gru(b, g) (((g) < &(b)->bs_grus[GRU_CHIPLETS_PER_BLADE - 1]) ? \
747 ((g)+1) : &(b)->bs_grus[0])
753 return down_write_trylock(&bs->bs_kgts_sema); in is_gts_stealable()
755 return mutex_trylock(&gts->ts_ctxlock); in is_gts_stealable()
762 up_write(&bs->bs_kgts_sema); in gts_stolen()
765 mutex_unlock(&gts->ts_ctxlock); in gts_stolen()
775 int ctxnum, ctxnum0, flag = 0, cbr, dsr; in gru_steal_context() local
778 blade_id = gts->ts_user_blade_id; in gru_steal_context()
781 cbr = gts->ts_cbr_au_count; in gru_steal_context()
782 dsr = gts->ts_dsr_au_count; in gru_steal_context()
785 spin_lock(&blade->bs_lock); in gru_steal_context()
787 ctxnum = next_ctxnum(blade->bs_lru_ctxnum); in gru_steal_context()
788 gru = blade->bs_lru_gru; in gru_steal_context()
791 blade->bs_lru_gru = gru; in gru_steal_context()
792 blade->bs_lru_ctxnum = ctxnum; in gru_steal_context()
797 if (check_gru_resources(gru, cbr, dsr, GRU_NUM_CCH)) in gru_steal_context()
799 spin_lock(&gru->gs_lock); in gru_steal_context()
803 ngts = gru->gs_gts[ctxnum]; in gru_steal_context()
814 spin_unlock(&gru->gs_lock); in gru_steal_context()
824 spin_unlock(&blade->bs_lock); in gru_steal_context()
827 gts->ustats.context_stolen++; in gru_steal_context()
828 ngts->ts_steal_jiffies = jiffies; in gru_steal_context()
837 gru->gs_gid, ctxnum, ngts, cbr, dsr, hweight64(gru->gs_cbr_map), in gru_steal_context()
838 hweight64(gru->gs_dsr_map)); in gru_steal_context()
848 ctxnum = find_first_zero_bit(&gru->gs_context_map, GRU_NUM_CCH); in gru_assign_context_number()
849 __set_bit(ctxnum, &gru->gs_context_map); in gru_assign_context_number()
860 int blade_id = gts->ts_user_blade_id; in gru_assign_gru_context()
870 if (check_gru_resources(grux, gts->ts_cbr_au_count, in gru_assign_gru_context()
871 gts->ts_dsr_au_count, in gru_assign_gru_context()
874 max_active_contexts = grux->gs_active_contexts; in gru_assign_gru_context()
881 spin_lock(&gru->gs_lock); in gru_assign_gru_context()
882 if (!check_gru_resources(gru, gts->ts_cbr_au_count, in gru_assign_gru_context()
883 gts->ts_dsr_au_count, GRU_NUM_CCH)) { in gru_assign_gru_context()
884 spin_unlock(&gru->gs_lock); in gru_assign_gru_context()
888 gts->ts_gru = gru; in gru_assign_gru_context()
889 gts->ts_blade = gru->gs_blade_id; in gru_assign_gru_context()
890 gts->ts_ctxnum = gru_assign_context_number(gru); in gru_assign_gru_context()
891 refcount_inc(&gts->ts_refcnt); in gru_assign_gru_context()
892 gru->gs_gts[gts->ts_ctxnum] = gts; in gru_assign_gru_context()
893 spin_unlock(&gru->gs_lock); in gru_assign_gru_context()
897 "gseg %p, gts %p, gid %d, ctx %d, cbr %d, dsr %d\n", in gru_assign_gru_context()
898 gseg_virtual_address(gts->ts_gru, gts->ts_ctxnum), gts, in gru_assign_gru_context()
899 gts->ts_gru->gs_gid, gts->ts_ctxnum, in gru_assign_gru_context()
900 gts->ts_cbr_au_count, gts->ts_dsr_au_count); in gru_assign_gru_context()
918 struct vm_area_struct *vma = vmf->vma; in gru_fault()
923 vaddr = vmf->address; in gru_fault()
934 mutex_lock(&gts->ts_ctxlock); in gru_fault()
939 if (!gts->ts_gru) { in gru_fault()
943 mutex_unlock(&gts->ts_ctxlock); in gru_fault()
946 expires = gts->ts_steal_jiffies + GRU_STEAL_DELAY; in gru_fault()
952 paddr = gseg_physical_address(gts->ts_gru, gts->ts_ctxnum); in gru_fault()
953 remap_pfn_range(vma, vaddr & ~(GRU_GSEG_PAGESIZE - 1), in gru_fault()
955 vma->vm_page_prot); in gru_fault()
959 mutex_unlock(&gts->ts_ctxlock); in gru_fault()