Lines Matching +full:uuid +full:- +full:dev

1 /*-
52 #include <sys/uuid.h>
60 #include <contrib/dev/acpica/include/acpi.h>
61 #include <contrib/dev/acpica/include/accommon.h>
62 #include <contrib/dev/acpica/include/acuuid.h>
63 #include <dev/acpica/acpivar.h>
64 #include <dev/nvdimm/nvdimm_var.h>
85 struct uuid u_id;
144 nvdimm_spa_type_from_uuid(struct uuid *uuid) in nvdimm_spa_type_from_uuid() argument
149 if (uuidcmp(uuid, &nvdimm_SPA_uuid_list[j].u_id) != 0) in nvdimm_spa_type_from_uuid()
190 nvdimm_spa_uio(struct nvdimm_spa_dev *dev, struct uio *uio) in nvdimm_spa_uio() argument
198 if (dev->spa_kva == NULL) { in nvdimm_spa_uio()
199 mattr = dev->spa_memattr; in nvdimm_spa_uio()
203 while (uio->uio_resid > 0) { in nvdimm_spa_uio()
204 if (uio->uio_offset >= dev->spa_len) in nvdimm_spa_uio()
206 off = dev->spa_phys_base + uio->uio_offset; in nvdimm_spa_uio()
209 if (n > uio->uio_resid) in nvdimm_spa_uio()
210 n = uio->uio_resid; in nvdimm_spa_uio()
216 while (uio->uio_resid > 0) { in nvdimm_spa_uio()
217 if (uio->uio_offset >= dev->spa_len) in nvdimm_spa_uio()
220 if (n > uio->uio_resid) in nvdimm_spa_uio()
221 n = uio->uio_resid; in nvdimm_spa_uio()
222 if (uio->uio_offset + n > dev->spa_len) in nvdimm_spa_uio()
223 n = dev->spa_len - uio->uio_offset; in nvdimm_spa_uio()
224 error = uiomove((char *)dev->spa_kva + uio->uio_offset, in nvdimm_spa_uio()
234 nvdimm_spa_rw(struct cdev *dev, struct uio *uio, int ioflag) in nvdimm_spa_rw() argument
237 return (nvdimm_spa_uio(dev->si_drv1, uio)); in nvdimm_spa_rw()
244 struct nvdimm_spa_dev *dev; in nvdimm_spa_ioctl() local
247 dev = cdev->si_drv1; in nvdimm_spa_ioctl()
254 *(off_t *)data = dev->spa_len; in nvdimm_spa_ioctl()
267 struct nvdimm_spa_dev *dev; in nvdimm_spa_mmap_single() local
269 dev = cdev->si_drv1; in nvdimm_spa_mmap_single()
270 if (dev->spa_obj == NULL) in nvdimm_spa_mmap_single()
272 if (*offset >= dev->spa_len || *offset + size < *offset || in nvdimm_spa_mmap_single()
273 *offset + size > dev->spa_len) in nvdimm_spa_mmap_single()
275 vm_object_reference(dev->spa_obj); in nvdimm_spa_mmap_single()
276 *objp = dev->spa_obj; in nvdimm_spa_mmap_single()
291 nvdimm_spa_g_all_unmapped(struct nvdimm_spa_dev *dev, struct bio *bp, int rw) in nvdimm_spa_g_all_unmapped() argument
293 struct vm_page maa[bp->bio_ma_n]; in nvdimm_spa_g_all_unmapped()
294 vm_page_t ma[bp->bio_ma_n]; in nvdimm_spa_g_all_unmapped()
298 mattr = dev->spa_memattr; in nvdimm_spa_g_all_unmapped()
301 vm_page_initfake(&maa[i], dev->spa_phys_base + in nvdimm_spa_g_all_unmapped()
302 trunc_page(bp->bio_offset) + PAGE_SIZE * i, mattr); in nvdimm_spa_g_all_unmapped()
306 pmap_copy_pages(ma, bp->bio_offset & PAGE_MASK, bp->bio_ma, in nvdimm_spa_g_all_unmapped()
307 bp->bio_ma_offset, bp->bio_length); in nvdimm_spa_g_all_unmapped()
309 pmap_copy_pages(bp->bio_ma, bp->bio_ma_offset, ma, in nvdimm_spa_g_all_unmapped()
310 bp->bio_offset & PAGE_MASK, bp->bio_length); in nvdimm_spa_g_all_unmapped()
324 mtx_lock(&sc->spa_g_mtx); in nvdimm_spa_g_thread()
326 bp = bioq_takefirst(&sc->spa_g_queue); in nvdimm_spa_g_thread()
329 msleep(&sc->spa_g_queue, &sc->spa_g_mtx, PRIBIO, in nvdimm_spa_g_thread()
331 if (!sc->spa_g_proc_run) { in nvdimm_spa_g_thread()
332 sc->spa_g_proc_exiting = true; in nvdimm_spa_g_thread()
333 wakeup(&sc->spa_g_queue); in nvdimm_spa_g_thread()
334 mtx_unlock(&sc->spa_g_mtx); in nvdimm_spa_g_thread()
339 mtx_unlock(&sc->spa_g_mtx); in nvdimm_spa_g_thread()
340 if (bp->bio_cmd != BIO_READ && bp->bio_cmd != BIO_WRITE && in nvdimm_spa_g_thread()
341 bp->bio_cmd != BIO_FLUSH) { in nvdimm_spa_g_thread()
347 if (bp->bio_cmd == BIO_FLUSH) { in nvdimm_spa_g_thread()
348 if (sc->dev->spa_kva != NULL) { in nvdimm_spa_g_thread()
349 pmap_large_map_wb(sc->dev->spa_kva, in nvdimm_spa_g_thread()
350 sc->dev->spa_len); in nvdimm_spa_g_thread()
353 (vm_paddr_t)sc->dev->spa_phys_base, in nvdimm_spa_g_thread()
354 (vm_paddr_t)sc->dev->spa_phys_base + in nvdimm_spa_g_thread()
355 sc->dev->spa_len, sc->dev->spa_memattr); in nvdimm_spa_g_thread()
363 if ((bp->bio_flags & BIO_UNMAPPED) != 0) { in nvdimm_spa_g_thread()
364 if (sc->dev->spa_kva != NULL) { in nvdimm_spa_g_thread()
365 aiovec.iov_base = (char *)sc->dev->spa_kva + in nvdimm_spa_g_thread()
366 bp->bio_offset; in nvdimm_spa_g_thread()
367 aiovec.iov_len = bp->bio_length; in nvdimm_spa_g_thread()
370 auio.uio_resid = bp->bio_length; in nvdimm_spa_g_thread()
371 auio.uio_offset = bp->bio_offset; in nvdimm_spa_g_thread()
373 auio.uio_rw = bp->bio_cmd == BIO_READ ? in nvdimm_spa_g_thread()
376 error = uiomove_fromphys(bp->bio_ma, in nvdimm_spa_g_thread()
377 bp->bio_ma_offset, bp->bio_length, &auio); in nvdimm_spa_g_thread()
378 bp->bio_resid = auio.uio_resid; in nvdimm_spa_g_thread()
380 nvdimm_spa_g_all_unmapped(sc->dev, bp, in nvdimm_spa_g_thread()
381 bp->bio_cmd); in nvdimm_spa_g_thread()
382 bp->bio_resid = bp->bio_length; in nvdimm_spa_g_thread()
386 aiovec.iov_base = bp->bio_data; in nvdimm_spa_g_thread()
387 aiovec.iov_len = bp->bio_length; in nvdimm_spa_g_thread()
390 auio.uio_resid = bp->bio_length; in nvdimm_spa_g_thread()
391 auio.uio_offset = bp->bio_offset; in nvdimm_spa_g_thread()
393 auio.uio_rw = bp->bio_cmd == BIO_READ ? UIO_READ : in nvdimm_spa_g_thread()
396 error = nvdimm_spa_uio(sc->dev, &auio); in nvdimm_spa_g_thread()
397 bp->bio_resid = auio.uio_resid; in nvdimm_spa_g_thread()
399 bp->bio_bcount = bp->bio_length; in nvdimm_spa_g_thread()
400 devstat_end_transaction_bio(sc->spa_g_devstat, bp); in nvdimm_spa_g_thread()
402 bp->bio_completed = bp->bio_length; in nvdimm_spa_g_thread()
412 sc = bp->bio_to->geom->softc; in nvdimm_spa_g_start()
413 if (bp->bio_cmd == BIO_READ || bp->bio_cmd == BIO_WRITE) { in nvdimm_spa_g_start()
414 devstat_start_transaction_bio(sc->spa_g_devstat, bp); in nvdimm_spa_g_start()
416 mtx_lock(&sc->spa_g_mtx); in nvdimm_spa_g_start()
417 bioq_disksort(&sc->spa_g_queue, bp); in nvdimm_spa_g_start()
418 wakeup(&sc->spa_g_queue); in nvdimm_spa_g_start()
419 mtx_unlock(&sc->spa_g_mtx); in nvdimm_spa_g_start()
429 static struct g_geom * nvdimm_spa_g_create(struct nvdimm_spa_dev *dev,
449 spa->spa_type = spa_type; in nvdimm_spa_init()
450 spa->spa_nfit_idx = nfitaddr->RangeIndex; in nvdimm_spa_init()
451 spa->dev.spa_domain = in nvdimm_spa_init()
452 ((nfitaddr->Flags & ACPI_NFIT_PROXIMITY_VALID) != 0) ? in nvdimm_spa_init()
453 nfitaddr->ProximityDomain : -1; in nvdimm_spa_init()
454 spa->dev.spa_phys_base = nfitaddr->Address; in nvdimm_spa_init()
455 spa->dev.spa_len = nfitaddr->Length; in nvdimm_spa_init()
456 spa->dev.spa_efi_mem_flags = nfitaddr->MemoryMapping; in nvdimm_spa_init()
459 spa->spa_nfit_idx, in nvdimm_spa_init()
460 (uintmax_t)spa->dev.spa_phys_base, in nvdimm_spa_init()
461 (uintmax_t)spa->dev.spa_len, in nvdimm_spa_init()
463 spa->dev.spa_efi_mem_flags); in nvdimm_spa_init()
465 spa->dev.spa_memattr = nvdimm_spa_memattr(nfitaddr->MemoryMapping); in nvdimm_spa_init()
469 asprintf(&name, M_NVDIMM, "spa%d", spa->spa_nfit_idx); in nvdimm_spa_init()
470 error = nvdimm_spa_dev_init(&spa->dev, name, spa->spa_nfit_idx); in nvdimm_spa_init()
476 nvdimm_spa_dev_init(struct nvdimm_spa_dev *dev, const char *name, int unit) in nvdimm_spa_dev_init() argument
483 error1 = pmap_large_map(dev->spa_phys_base, dev->spa_len, in nvdimm_spa_dev_init()
484 &dev->spa_kva, dev->spa_memattr); in nvdimm_spa_dev_init()
488 dev->spa_kva = NULL; in nvdimm_spa_dev_init()
492 error = sglist_append_phys(spa_sg, dev->spa_phys_base, in nvdimm_spa_dev_init()
493 dev->spa_len); in nvdimm_spa_dev_init()
495 dev->spa_obj = vm_pager_allocate(OBJT_SG, spa_sg, dev->spa_len, in nvdimm_spa_dev_init()
497 if (dev->spa_obj == NULL) { in nvdimm_spa_dev_init()
514 mda.mda_si_drv1 = dev; in nvdimm_spa_dev_init()
517 error = make_dev_s(&mda, &dev->spa_dev, "%s", devname); in nvdimm_spa_dev_init()
525 dev->spa_g = nvdimm_spa_g_create(dev, name); in nvdimm_spa_dev_init()
526 if (dev->spa_g == NULL && error1 == 0) in nvdimm_spa_dev_init()
532 nvdimm_spa_g_create(struct nvdimm_spa_dev *dev, const char *name) in nvdimm_spa_g_create() argument
540 sc->dev = dev; in nvdimm_spa_g_create()
541 bioq_init(&sc->spa_g_queue); in nvdimm_spa_g_create()
542 mtx_init(&sc->spa_g_mtx, "spag", NULL, MTX_DEF); in nvdimm_spa_g_create()
543 sc->spa_g_proc_run = true; in nvdimm_spa_g_create()
544 sc->spa_g_proc_exiting = false; in nvdimm_spa_g_create()
545 error = kproc_create(nvdimm_spa_g_thread, sc, &sc->spa_g_proc, 0, 0, in nvdimm_spa_g_create()
548 mtx_destroy(&sc->spa_g_mtx); in nvdimm_spa_g_create()
555 gp->softc = sc; in nvdimm_spa_g_create()
556 sc->spa_p = g_new_providerf(gp, "%s", name); in nvdimm_spa_g_create()
557 sc->spa_p->mediasize = dev->spa_len; in nvdimm_spa_g_create()
558 sc->spa_p->sectorsize = DEV_BSIZE; in nvdimm_spa_g_create()
559 sc->spa_p->flags |= G_PF_DIRECT_SEND | G_PF_DIRECT_RECEIVE | in nvdimm_spa_g_create()
561 g_error_provider(sc->spa_p, 0); in nvdimm_spa_g_create()
562 sc->spa_g_devstat = devstat_new_entry("spa", -1, DEV_BSIZE, in nvdimm_spa_g_create()
574 nvdimm_spa_dev_fini(&spa->dev); in nvdimm_spa_fini()
578 nvdimm_spa_dev_fini(struct nvdimm_spa_dev *dev) in nvdimm_spa_dev_fini() argument
581 if (dev->spa_g != NULL) { in nvdimm_spa_dev_fini()
583 nvdimm_spa_g_destroy_geom(NULL, dev->spa_g->class, dev->spa_g); in nvdimm_spa_dev_fini()
586 if (dev->spa_dev != NULL) { in nvdimm_spa_dev_fini()
587 destroy_dev(dev->spa_dev); in nvdimm_spa_dev_fini()
588 dev->spa_dev = NULL; in nvdimm_spa_dev_fini()
590 vm_object_deallocate(dev->spa_obj); in nvdimm_spa_dev_fini()
591 if (dev->spa_kva != NULL) { in nvdimm_spa_dev_fini()
592 pmap_large_unmap(dev->spa_kva, dev->spa_len); in nvdimm_spa_dev_fini()
593 dev->spa_kva = NULL; in nvdimm_spa_dev_fini()
603 sc = gp->softc; in nvdimm_spa_g_destroy_geom()
604 mtx_lock(&sc->spa_g_mtx); in nvdimm_spa_g_destroy_geom()
605 sc->spa_g_proc_run = false; in nvdimm_spa_g_destroy_geom()
606 wakeup(&sc->spa_g_queue); in nvdimm_spa_g_destroy_geom()
607 while (!sc->spa_g_proc_exiting) in nvdimm_spa_g_destroy_geom()
608 msleep(&sc->spa_g_queue, &sc->spa_g_mtx, PRIBIO, "spa_e", 0); in nvdimm_spa_g_destroy_geom()
609 mtx_unlock(&sc->spa_g_mtx); in nvdimm_spa_g_destroy_geom()
612 sc->spa_p = NULL; in nvdimm_spa_g_destroy_geom()
613 if (sc->spa_g_devstat != NULL) { in nvdimm_spa_g_destroy_geom()
614 devstat_remove_entry(sc->spa_g_devstat); in nvdimm_spa_g_destroy_geom()
615 sc->spa_g_devstat = NULL; in nvdimm_spa_g_destroy_geom()
617 mtx_destroy(&sc->spa_g_mtx); in nvdimm_spa_g_destroy_geom()