Changeset View
Changeset View
Standalone View
Standalone View
head/sys/dev/agp/agp.c
Show First 20 Lines • Show All 610 Lines • ▼ Show 20 Lines | agp_generic_bind_memory(device_t dev, struct agp_memory *mem, | ||||
return 0; | return 0; | ||||
bad: | bad: | ||||
mtx_unlock(&sc->as_lock); | mtx_unlock(&sc->as_lock); | ||||
VM_OBJECT_ASSERT_WLOCKED(mem->am_obj); | VM_OBJECT_ASSERT_WLOCKED(mem->am_obj); | ||||
for (k = 0; k < mem->am_size; k += PAGE_SIZE) { | for (k = 0; k < mem->am_size; k += PAGE_SIZE) { | ||||
m = vm_page_lookup(mem->am_obj, OFF_TO_IDX(k)); | m = vm_page_lookup(mem->am_obj, OFF_TO_IDX(k)); | ||||
if (k >= i) | if (k >= i) | ||||
vm_page_xunbusy(m); | vm_page_xunbusy(m); | ||||
vm_page_lock(m); | |||||
vm_page_unwire(m, PQ_INACTIVE); | vm_page_unwire(m, PQ_INACTIVE); | ||||
vm_page_unlock(m); | |||||
} | } | ||||
VM_OBJECT_WUNLOCK(mem->am_obj); | VM_OBJECT_WUNLOCK(mem->am_obj); | ||||
return error; | return error; | ||||
} | } | ||||
int | int | ||||
agp_generic_unbind_memory(device_t dev, struct agp_memory *mem) | agp_generic_unbind_memory(device_t dev, struct agp_memory *mem) | ||||
Show All 18 Lines | agp_generic_unbind_memory(device_t dev, struct agp_memory *mem) | ||||
for (i = 0; i < mem->am_size; i += AGP_PAGE_SIZE) | for (i = 0; i < mem->am_size; i += AGP_PAGE_SIZE) | ||||
AGP_UNBIND_PAGE(dev, mem->am_offset + i); | AGP_UNBIND_PAGE(dev, mem->am_offset + i); | ||||
AGP_FLUSH_TLB(dev); | AGP_FLUSH_TLB(dev); | ||||
VM_OBJECT_WLOCK(mem->am_obj); | VM_OBJECT_WLOCK(mem->am_obj); | ||||
for (i = 0; i < mem->am_size; i += PAGE_SIZE) { | for (i = 0; i < mem->am_size; i += PAGE_SIZE) { | ||||
m = vm_page_lookup(mem->am_obj, atop(i)); | m = vm_page_lookup(mem->am_obj, atop(i)); | ||||
vm_page_lock(m); | |||||
vm_page_unwire(m, PQ_INACTIVE); | vm_page_unwire(m, PQ_INACTIVE); | ||||
vm_page_unlock(m); | |||||
} | } | ||||
VM_OBJECT_WUNLOCK(mem->am_obj); | VM_OBJECT_WUNLOCK(mem->am_obj); | ||||
mem->am_offset = 0; | mem->am_offset = 0; | ||||
mem->am_is_bound = 0; | mem->am_is_bound = 0; | ||||
mtx_unlock(&sc->as_lock); | mtx_unlock(&sc->as_lock); | ||||
▲ Show 20 Lines • Show All 331 Lines • ▼ Show 20 Lines | if ((size & (AGP_PAGE_SIZE - 1)) != 0 || | ||||
(offset & (AGP_PAGE_SIZE - 1)) != 0) | (offset & (AGP_PAGE_SIZE - 1)) != 0) | ||||
return (EINVAL); | return (EINVAL); | ||||
sc = device_get_softc(dev); | sc = device_get_softc(dev); | ||||
mtx_lock(&sc->as_lock); | mtx_lock(&sc->as_lock); | ||||
for (i = 0; i < size; i += PAGE_SIZE) { | for (i = 0; i < size; i += PAGE_SIZE) { | ||||
m = pages[OFF_TO_IDX(i)]; | m = pages[OFF_TO_IDX(i)]; | ||||
KASSERT(m->wire_count > 0, | KASSERT(vm_page_wired(m), | ||||
("agp_bind_pages: page %p hasn't been wired", m)); | ("agp_bind_pages: page %p hasn't been wired", m)); | ||||
/* | /* | ||||
* Install entries in the GATT, making sure that if | * Install entries in the GATT, making sure that if | ||||
* AGP_PAGE_SIZE < PAGE_SIZE and size is not | * AGP_PAGE_SIZE < PAGE_SIZE and size is not | ||||
* aligned to PAGE_SIZE, we don't modify too many GATT | * aligned to PAGE_SIZE, we don't modify too many GATT | ||||
* entries. | * entries. | ||||
*/ | */ | ||||
▲ Show 20 Lines • Show All 45 Lines • Show Last 20 Lines |