Lines Matching +full:i +full:- +full:tlb +full:- +full:sets

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
108 int busnum, numkids, i;
116 for (i = 0; i < numkids; i++) {
117 dev = kids[i];
153 gatt->ag_entries = entries;
154 gatt->ag_virtual = kmem_alloc_contig(entries * sizeof(uint32_t),
156 if (!gatt->ag_virtual) {
162 gatt->ag_physical = vtophys((vm_offset_t) gatt->ag_virtual);
170 kmem_free(gatt->ag_virtual, gatt->ag_entries * sizeof(uint32_t));
188 * Sets the PCI resource which represents the AGP aperture.
198 sc->as_aperture_rid = rid;
206 int error, i, unit;
214 if (sc->as_aperture_rid != -1) {
215 if (sc->as_aperture_rid == 0)
216 sc->as_aperture_rid = AGP_APBASE;
218 sc->as_aperture = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
219 &sc->as_aperture_rid, RF_SHAREABLE);
220 if (!sc->as_aperture)
229 for (i = 0; i < AGP_MAX_SIZE; i++) {
230 if (memsize <= agp_max[i][0])
233 if (i == AGP_MAX_SIZE)
234 i = AGP_MAX_SIZE - 1;
235 sc->as_maxmem = agp_max[i][1] << 20U;
238 * The lock is used to prevent re-entry to
241 mtx_init(&sc->as_lock, "agp lock", NULL, MTX_DEF);
247 TAILQ_INIT(&sc->as_memory);
248 sc->as_nextid = 1;
250 sc->as_devalias = NULL;
261 error = make_dev_s(&mdargs, &sc->as_devnode, "agpgart%d", unit);
268 &sc->as_devalias, sc->as_devnode, "agpgart");
282 destroy_dev(sc->as_devnode);
283 if (sc->as_devalias != NULL)
284 destroy_dev(sc->as_devalias);
292 if (sc->as_aperture != NULL)
293 bus_release_resource(dev, SYS_RES_MEMORY, sc->as_aperture_rid,
294 sc->as_aperture);
295 mtx_destroy(&sc->as_lock);
316 return rman_get_size(sc->as_aperture);
337 * restrictions as in place for v2 -- one bus, one device on the bus.
357 * ARQSZ - Set the value to the maximum one.
366 /* Calibration cycle - don't allow override by mode register */
497 if ((size & (AGP_PAGE_SIZE - 1)) != 0)
500 if (size > sc->as_maxmem - sc->as_allocated)
510 mem->am_id = sc->as_nextid++;
511 mem->am_size = size;
512 mem->am_type = 0;
513 mem->am_obj = vm_object_allocate(OBJT_SWAP, atop(round_page(size)));
514 mem->am_physical = 0;
515 mem->am_offset = 0;
516 mem->am_is_bound = 0;
517 TAILQ_INSERT_TAIL(&sc->as_memory, mem, am_link);
518 sc->as_allocated += size;
528 if (mem->am_is_bound)
531 sc->as_allocated -= mem->am_size;
532 TAILQ_REMOVE(&sc->as_memory, mem, am_link);
533 vm_object_deallocate(mem->am_obj);
543 vm_offset_t i, j, k;
548 if ((offset & (AGP_PAGE_SIZE - 1)) != 0 ||
549 offset + mem->am_size > AGP_GET_APERTURE(dev)) {
560 VM_OBJECT_WLOCK(mem->am_obj);
561 for (i = 0; i < mem->am_size; i += PAGE_SIZE) {
569 m = vm_page_grab(mem->am_obj, OFF_TO_IDX(i),
573 VM_OBJECT_WUNLOCK(mem->am_obj);
575 mtx_lock(&sc->as_lock);
577 if (mem->am_is_bound) {
580 VM_OBJECT_WLOCK(mem->am_obj);
581 i = 0;
587 * TLB.
589 VM_OBJECT_WLOCK(mem->am_obj);
590 for (i = 0; i < mem->am_size; i += PAGE_SIZE) {
591 m = vm_page_lookup(mem->am_obj, OFF_TO_IDX(i));
595 * AGP_PAGE_SIZE < PAGE_SIZE and mem->am_size is not
599 for (j = 0; j < PAGE_SIZE && i + j < mem->am_size;
603 (uintmax_t)offset + i + j, (uintmax_t)pa);
604 error = AGP_BIND_PAGE(dev, offset + i + j, pa);
610 for (k = 0; k < i + j; k += AGP_PAGE_SIZE)
617 VM_OBJECT_WUNLOCK(mem->am_obj);
624 mem->am_offset = offset;
625 mem->am_is_bound = 1;
627 mtx_unlock(&sc->as_lock);
631 mtx_unlock(&sc->as_lock);
632 VM_OBJECT_ASSERT_WLOCKED(mem->am_obj);
633 for (k = 0; k < mem->am_size; k += PAGE_SIZE) {
634 m = vm_page_lookup(mem->am_obj, OFF_TO_IDX(k));
635 if (k >= i)
639 VM_OBJECT_WUNLOCK(mem->am_obj);
649 int i;
651 mtx_lock(&sc->as_lock);
653 if (!mem->am_is_bound) {
655 mtx_unlock(&sc->as_lock);
661 * TLB. Unwire the pages so they can be swapped.
663 for (i = 0; i < mem->am_size; i += AGP_PAGE_SIZE)
664 AGP_UNBIND_PAGE(dev, mem->am_offset + i);
668 VM_OBJECT_WLOCK(mem->am_obj);
669 for (i = 0; i < mem->am_size; i += PAGE_SIZE) {
670 m = vm_page_lookup(mem->am_obj, atop(i));
673 VM_OBJECT_WUNLOCK(mem->am_obj);
675 mem->am_offset = 0;
676 mem->am_is_bound = 0;
678 mtx_unlock(&sc->as_lock);
690 if (sc->as_state != AGP_ACQUIRE_FREE)
692 sc->as_state = state;
702 if (sc->as_state == AGP_ACQUIRE_FREE)
705 if (sc->as_state != state)
708 sc->as_state = AGP_ACQUIRE_FREE;
719 TAILQ_FOREACH(mem, &sc->as_memory, am_link) {
720 AGP_DPF("considering memory block %d\n", mem->am_id);
721 if (mem->am_id == id)
735 info->bridge_id = pci_get_devid(dev);
736 info->agp_mode =
738 if (sc->as_aperture)
739 info->aper_base = rman_get_start(sc->as_aperture);
741 info->aper_base = 0;
742 info->aper_size = AGP_GET_APERTURE(dev) >> 20;
743 info->pg_total = info->pg_system = sc->as_maxmem >> AGP_PAGE_SHIFT;
744 info->pg_used = sc->as_allocated >> AGP_PAGE_SHIFT;
752 return AGP_ENABLE(dev, setup->agp_mode);
761 alloc->type,
762 alloc->pg_count << AGP_PAGE_SHIFT);
764 alloc->key = mem->am_id;
765 alloc->physical = mem->am_physical;
788 struct agp_memory *mem = agp_find_memory(dev, bind->key);
793 return AGP_BIND_MEMORY(dev, mem, bind->pg_start << AGP_PAGE_SHIFT);
799 struct agp_memory *mem = agp_find_memory(dev, unbind->key);
817 device_t dev = kdev->si_drv1;
820 if (!sc->as_isopen) {
821 sc->as_isopen = 1;
831 device_t dev = kdev->si_drv1;
838 while ((mem = TAILQ_FIRST(&sc->as_memory)) != NULL) {
839 if (mem->am_is_bound)
843 if (sc->as_state == AGP_ACQUIRE_USER)
845 sc->as_isopen = 0;
854 device_t dev = kdev->si_drv1;
892 device_t dev = kdev->si_drv1;
896 return -1;
897 if (sc->as_aperture == NULL)
898 return -1;
899 *paddr = rman_get_start(sc->as_aperture) + offset;
909 int i, count;
916 for (i = 0; i < count; i++) {
917 if (device_is_attached(children[i])) {
918 child = children[i];
930 return sc->as_state;
938 info->ai_mode =
940 if (sc->as_aperture != NULL)
941 info->ai_aperture_base = rman_get_start(sc->as_aperture);
943 info->ai_aperture_base = 0;
944 info->ai_aperture_size = AGP_GET_APERTURE(dev);
945 info->ai_memory_allowed = sc->as_maxmem;
946 info->ai_memory_used = sc->as_allocated;
995 mi->ami_size = mem->am_size;
996 mi->ami_physical = mem->am_physical;
997 mi->ami_offset = mem->am_offset;
998 mi->ami_is_bound = mem->am_is_bound;
1006 vm_offset_t i, j, k, pa;
1010 if ((size & (AGP_PAGE_SIZE - 1)) != 0 ||
1011 (offset & (AGP_PAGE_SIZE - 1)) != 0)
1016 mtx_lock(&sc->as_lock);
1017 for (i = 0; i < size; i += PAGE_SIZE) {
1018 m = pages[OFF_TO_IDX(i)];
1028 for (j = 0; j < PAGE_SIZE && i + j < size; j += AGP_PAGE_SIZE) {
1031 (uintmax_t)offset + i + j, (uintmax_t)pa);
1032 error = AGP_BIND_PAGE(dev, offset + i + j, pa);
1037 for (k = 0; k < i + j; k += AGP_PAGE_SIZE)
1040 mtx_unlock(&sc->as_lock);
1048 mtx_unlock(&sc->as_lock);
1056 vm_offset_t i;
1058 if ((size & (AGP_PAGE_SIZE - 1)) != 0 ||
1059 (offset & (AGP_PAGE_SIZE - 1)) != 0)
1064 mtx_lock(&sc->as_lock);
1065 for (i = 0; i < size; i += AGP_PAGE_SIZE)
1066 AGP_UNBIND_PAGE(dev, offset + i);
1070 mtx_unlock(&sc->as_lock);