Lines Matching +full:device +full:- +full:handle
1 /*-
2 * SPDX-License-Identifier: BSD-3-Clause
70 /* list of device pager objects */
95 static int old_dev_pager_ctor(void *handle, vm_ooffset_t size, vm_prot_t prot,
97 static void old_dev_pager_dtor(void *handle);
100 static void old_dev_pager_path(void *handle, char *path, size_t len);
118 cdev_pager_lookup(void *handle) in cdev_pager_lookup() argument
124 object = vm_pager_object_lookup(&dev_pager_object_list, handle); in cdev_pager_lookup()
125 if (object != NULL && object->un_pager.devp.handle == NULL) { in cdev_pager_lookup()
126 msleep(&object->un_pager.devp.handle, &dev_pager_mtx, in cdev_pager_lookup()
136 cdev_pager_allocate(void *handle, enum obj_type tp, in cdev_pager_allocate() argument
143 KASSERT(handle != NULL, ("device pager with NULL handle")); in cdev_pager_allocate()
147 KASSERT(tp == OBJT_MGTDEVICE || ops->cdev_pg_populate == NULL, in cdev_pager_allocate()
148 ("populate on unmanaged device pager")); in cdev_pager_allocate()
158 * device mapping. This, in effect, allows a user to pass all in cdev_pager_allocate()
175 object = vm_pager_object_lookup(&dev_pager_object_list, handle); in cdev_pager_allocate()
182 * device's memory. in cdev_pager_allocate()
187 object = vm_pager_object_lookup(&dev_pager_object_list, handle); in cdev_pager_allocate()
189 object1->type = OBJT_DEAD; in cdev_pager_allocate()
192 if (object->un_pager.devp.handle == NULL) { in cdev_pager_allocate()
193 msleep(&object->un_pager.devp.handle, in cdev_pager_allocate()
202 if (pindex > object->size) in cdev_pager_allocate()
203 object->size = pindex; in cdev_pager_allocate()
204 KASSERT(object->type == tp, in cdev_pager_allocate()
205 ("Inconsistent device pager type %p %d", in cdev_pager_allocate()
207 KASSERT(object->un_pager.devp.ops == ops, in cdev_pager_allocate()
214 object->handle = handle; in cdev_pager_allocate()
215 object->un_pager.devp.ops = ops; in cdev_pager_allocate()
216 TAILQ_INIT(&object->un_pager.devp.devp_pglist); in cdev_pager_allocate()
220 if (ops->cdev_pg_populate != NULL) in cdev_pager_allocate()
222 if (ops->cdev_pg_ctor(handle, size, prot, foff, in cdev_pager_allocate()
227 wakeup(&object->un_pager.devp.handle); in cdev_pager_allocate()
229 object->type = OBJT_DEAD; in cdev_pager_allocate()
235 object->flags |= OBJ_COLORED; in cdev_pager_allocate()
236 object->pg_color = color; in cdev_pager_allocate()
237 object->un_pager.devp.handle = handle; in cdev_pager_allocate()
238 wakeup(&object->un_pager.devp.handle); in cdev_pager_allocate()
243 if (object->un_pager.devp.handle == NULL) { in cdev_pager_allocate()
244 msleep(&object->un_pager.devp.handle, in cdev_pager_allocate()
249 if (pindex > object->size) in cdev_pager_allocate()
250 object->size = pindex; in cdev_pager_allocate()
251 KASSERT(object->type == tp, in cdev_pager_allocate()
252 ("Inconsistent device pager type %p %d", object, tp)); in cdev_pager_allocate()
259 dev_pager_alloc(void *handle, vm_ooffset_t size, vm_prot_t prot, in dev_pager_alloc() argument
263 return (cdev_pager_allocate(handle, OBJT_DEVICE, &old_dev_pager_ops, in dev_pager_alloc()
270 if (object->un_pager.devp.ops->cdev_pg_path != NULL) in cdev_pager_get_path()
271 object->un_pager.devp.ops->cdev_pg_path( in cdev_pager_get_path()
272 object->un_pager.devp.handle, path, sz); in cdev_pager_get_path()
279 if (object->type == OBJT_MGTDEVICE) { in cdev_pager_free_page()
283 vm_radix_iter_lookup(&pages, m->pindex); in cdev_pager_free_page()
285 } else if (object->type == OBJT_DEVICE) in cdev_pager_free_page()
289 ("Invalid device type obj %p m %p", object, m)); in cdev_pager_free_page()
326 KASSERT((object->type == OBJT_DEVICE && in dev_pager_free_page()
327 (m->oflags & VPO_UNMANAGED) != 0), in dev_pager_free_page()
328 ("Managed device or page obj %p m %p", object, m)); in dev_pager_free_page()
329 TAILQ_REMOVE(&object->un_pager.devp.devp_pglist, m, plinks.q); in dev_pager_free_page()
339 object->un_pager.devp.ops->cdev_pg_dtor(object->un_pager.devp.handle); in dev_pager_dealloc()
346 if (object->type == OBJT_DEVICE) { in dev_pager_dealloc()
350 while ((m = TAILQ_FIRST(&object->un_pager.devp.devp_pglist)) in dev_pager_dealloc()
358 object->handle = NULL; in dev_pager_dealloc()
359 object->type = OBJT_DEAD; in dev_pager_dealloc()
370 if (object->un_pager.devp.ops->cdev_pg_fault == NULL) in dev_pager_getpages()
373 error = object->un_pager.devp.ops->cdev_pg_fault(object, in dev_pager_getpages()
374 IDX_TO_OFF(ma[0]->pindex), PROT_READ, &ma[0]); in dev_pager_getpages()
379 KASSERT((object->type == OBJT_DEVICE && in dev_pager_getpages()
380 (ma[0]->oflags & VPO_UNMANAGED) != 0) || in dev_pager_getpages()
381 (object->type == OBJT_MGTDEVICE && in dev_pager_getpages()
382 (ma[0]->oflags & VPO_UNMANAGED) == 0), in dev_pager_getpages()
384 if (object->type == OBJT_DEVICE) { in dev_pager_getpages()
385 TAILQ_INSERT_TAIL(&object->un_pager.devp.devp_pglist, in dev_pager_getpages()
404 if (object->un_pager.devp.ops->cdev_pg_populate == NULL) in dev_pager_populate()
406 return (object->un_pager.devp.ops->cdev_pg_populate(object, pidx, in dev_pager_populate()
423 memattr = object->memattr; in old_dev_pager_fault()
427 dev = object->handle; in old_dev_pager_fault()
434 fpop = td->td_fpop; in old_dev_pager_fault()
435 td->td_fpop = NULL; in old_dev_pager_fault()
436 ret = csw->d_mmap(dev, offset, &paddr, prot, &memattr); in old_dev_pager_fault()
437 td->td_fpop = fpop; in old_dev_pager_fault()
454 if ((csw->d_flags & D_MEM) == 0) { in old_dev_pager_fault()
455 printf("WARNING: Device driver %s has set " in old_dev_pager_fault()
457 csw->d_name, memattr, memattr1); in old_dev_pager_fault()
461 if (((*mres)->flags & PG_FICTITIOUS) != 0) { in old_dev_pager_fault()
476 vm_page_replace(page, object, (*mres)->pindex, *mres); in old_dev_pager_fault()
504 old_dev_pager_ctor(void *handle, vm_ooffset_t size, vm_prot_t prot, in old_dev_pager_ctor() argument
516 * Make sure this device can be mapped. in old_dev_pager_ctor()
518 dev = handle; in old_dev_pager_ctor()
524 * Check that the specified range of the device allows the desired in old_dev_pager_ctor()
531 for (off = foff; npages--; off += PAGE_SIZE) { in old_dev_pager_ctor()
532 if (csw->d_mmap(dev, off, &paddr, (int)prot, &dummy) != 0) { in old_dev_pager_ctor()
540 *color = atop(paddr) - OFF_TO_IDX(off - PAGE_SIZE); in old_dev_pager_ctor()
545 old_dev_pager_dtor(void *handle) in old_dev_pager_dtor() argument
548 dev_rel(handle); in old_dev_pager_dtor()
552 old_dev_pager_path(void *handle, char *path, size_t len) in old_dev_pager_path() argument
554 struct cdev *cdev = handle; in old_dev_pager_path()