The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/nvdimm/nvdimm_var.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * Copyright (c) 2017 The FreeBSD Foundation
    3  * All rights reserved.
    4  * Copyright (c) 2018, 2019 Intel Corporation
    5  *
    6  * This software was developed by Konstantin Belousov <kib@FreeBSD.org>
    7  * under sponsorship from the FreeBSD Foundation.
    8  *
    9  * Redistribution and use in source and binary forms, with or without
   10  * modification, are permitted provided that the following conditions
   11  * are met:
   12  * 1. Redistributions of source code must retain the above copyright
   13  *    notice, this list of conditions and the following disclaimer.
   14  * 2. Redistributions in binary form must reproduce the above copyright
   15  *    notice, this list of conditions and the following disclaimer in the
   16  *    documentation and/or other materials provided with the distribution.
   17  *
   18  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   19  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   21  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   22  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   23  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   24  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   25  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   26  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   27  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   28  * SUCH DAMAGE.
   29  *
   30  * $FreeBSD$
   31  */
   32 
   33 #ifndef __DEV_NVDIMM_VAR_H__
   34 #define __DEV_NVDIMM_VAR_H__
   35 
   36 #define NVDIMM_INDEX_BLOCK_SIGNATURE "NAMESPACE_INDEX"
   37 
   38 struct nvdimm_label_index {
   39         char            signature[16];
   40         uint8_t         flags[3];
   41         uint8_t         label_size;
   42         uint32_t        seq;
   43         uint64_t        this_offset;
   44         uint64_t        this_size;
   45         uint64_t        other_offset;
   46         uint64_t        label_offset;
   47         uint32_t        slot_cnt;
   48         uint16_t        rev_major;
   49         uint16_t        rev_minor;
   50         uint64_t        checksum;
   51         uint8_t         free[0];
   52 };
   53 
   54 struct nvdimm_label {
   55         struct uuid     uuid;
   56         char            name[64];
   57         uint32_t        flags;
   58         uint16_t        nlabel;
   59         uint16_t        position;
   60         uint64_t        set_cookie;
   61         uint64_t        lba_size;
   62         uint64_t        dimm_phys_addr;
   63         uint64_t        raw_size;
   64         uint32_t        slot;
   65         uint8_t         alignment;
   66         uint8_t         reserved[3];
   67         struct uuid     type_guid;
   68         struct uuid     address_abstraction_guid;
   69         uint8_t         reserved1[88];
   70         uint64_t        checksum;
   71 };
   72 
   73 struct nvdimm_label_entry {
   74         SLIST_ENTRY(nvdimm_label_entry) link;
   75         struct nvdimm_label     label;
   76 };
   77 
   78 _Static_assert(sizeof(struct nvdimm_label_index) == 72, "Incorrect layout");
   79 _Static_assert(sizeof(struct nvdimm_label) == 256, "Incorrect layout");
   80 
   81 typedef uint32_t nfit_handle_t;
   82 
   83 enum nvdimm_acpi_ivar {
   84         NVDIMM_ROOT_IVAR_ACPI_HANDLE,
   85         NVDIMM_ROOT_IVAR_DEVICE_HANDLE,
   86         NVDIMM_ROOT_IVAR_MAX,
   87 };
   88 __BUS_ACCESSOR(nvdimm_root, acpi_handle, NVDIMM_ROOT, ACPI_HANDLE, ACPI_HANDLE)
   89 __BUS_ACCESSOR(nvdimm_root, device_handle, NVDIMM_ROOT, DEVICE_HANDLE,
   90     nfit_handle_t)
   91 
   92 struct nvdimm_dev {
   93         device_t        nv_dev;
   94         nfit_handle_t   nv_handle;
   95         uint64_t        **nv_flush_addr;
   96         char            *nv_flags_str;
   97         int             nv_flush_addr_cnt;
   98         uint32_t        label_area_size;
   99         uint32_t        max_label_xfer;
  100         struct nvdimm_label_index *label_index;
  101         SLIST_HEAD(, nvdimm_label_entry) labels;
  102 };
  103 
  104 enum SPA_mapping_type {
  105         SPA_TYPE_VOLATILE_MEMORY        = 0,
  106         SPA_TYPE_PERSISTENT_MEMORY      = 1,
  107         SPA_TYPE_CONTROL_REGION         = 2,
  108         SPA_TYPE_DATA_REGION            = 3,
  109         SPA_TYPE_VOLATILE_VIRTUAL_DISK  = 4,
  110         SPA_TYPE_VOLATILE_VIRTUAL_CD    = 5,
  111         SPA_TYPE_PERSISTENT_VIRTUAL_DISK= 6,
  112         SPA_TYPE_PERSISTENT_VIRTUAL_CD  = 7,
  113         SPA_TYPE_UNKNOWN                = 127,
  114 };
  115 
  116 struct nvdimm_spa_dev {
  117         int                     spa_domain;
  118         vm_memattr_t            spa_memattr;
  119         uint64_t                spa_phys_base;
  120         uint64_t                spa_len;
  121         uint64_t                spa_efi_mem_flags;
  122         void                    *spa_kva;
  123         struct vm_object        *spa_obj;
  124         struct cdev             *spa_dev;
  125         struct g_geom           *spa_g;
  126 };
  127 
  128 struct g_spa {
  129         struct nvdimm_spa_dev   *dev;
  130         struct g_provider       *spa_p;
  131         struct bio_queue_head   spa_g_queue;
  132         struct mtx              spa_g_mtx;
  133         struct devstat          *spa_g_devstat;
  134         struct proc             *spa_g_proc;
  135         bool                    spa_g_proc_run;
  136         bool                    spa_g_proc_exiting;
  137 };
  138 
  139 struct nvdimm_namespace {
  140         SLIST_ENTRY(nvdimm_namespace) link;
  141         struct SPA_mapping      *spa;
  142         struct nvdimm_spa_dev   dev;
  143 };
  144 
  145 struct SPA_mapping {
  146         SLIST_ENTRY(SPA_mapping) link;
  147         enum SPA_mapping_type   spa_type;
  148         int                     spa_nfit_idx;
  149         struct nvdimm_spa_dev   dev;
  150         SLIST_HEAD(, nvdimm_namespace) namespaces;
  151 };
  152 
  153 MALLOC_DECLARE(M_NVDIMM);
  154 
  155 void acpi_nfit_get_dimm_ids(ACPI_TABLE_NFIT *nfitbl, nfit_handle_t **listp,
  156     int *countp);
  157 void acpi_nfit_get_spa_range(ACPI_TABLE_NFIT *nfitbl, uint16_t range_index,
  158     ACPI_NFIT_SYSTEM_ADDRESS **spa);
  159 void acpi_nfit_get_spa_ranges(ACPI_TABLE_NFIT *nfitbl,
  160     ACPI_NFIT_SYSTEM_ADDRESS ***listp, int *countp);
  161 void acpi_nfit_get_region_mappings_by_spa_range(ACPI_TABLE_NFIT *nfitbl,
  162     uint16_t spa_range_index, ACPI_NFIT_MEMORY_MAP ***listp, int *countp);
  163 void acpi_nfit_get_control_region(ACPI_TABLE_NFIT *nfitbl,
  164     uint16_t control_region_index, ACPI_NFIT_CONTROL_REGION **out);
  165 void acpi_nfit_get_flush_addrs(ACPI_TABLE_NFIT *nfitbl, nfit_handle_t dimm,
  166     uint64_t ***listp, int *countp);
  167 void acpi_nfit_get_memory_maps_by_dimm(ACPI_TABLE_NFIT *nfitbl,
  168     nfit_handle_t dimm, ACPI_NFIT_MEMORY_MAP ***listp, int *countp);
  169 enum SPA_mapping_type nvdimm_spa_type_from_name(const char *);
  170 enum SPA_mapping_type nvdimm_spa_type_from_uuid(struct uuid *);
  171 bool nvdimm_spa_type_user_accessible(enum SPA_mapping_type);
  172 struct nvdimm_dev *nvdimm_find_by_handle(nfit_handle_t nv_handle);
  173 int nvdimm_spa_init(struct SPA_mapping *spa, ACPI_NFIT_SYSTEM_ADDRESS *nfitaddr,
  174     enum SPA_mapping_type spa_type);
  175 void nvdimm_spa_fini(struct SPA_mapping *spa);
  176 int nvdimm_spa_dev_init(struct nvdimm_spa_dev *dev, const char *name, int unit);
  177 void nvdimm_spa_dev_fini(struct nvdimm_spa_dev *dev);
  178 int nvdimm_create_namespaces(struct SPA_mapping *spa, ACPI_TABLE_NFIT *nfitbl);
  179 void nvdimm_destroy_namespaces(struct SPA_mapping *spa);
  180 
  181 #endif          /* __DEV_NVDIMM_VAR_H__ */

Cache object: 200009092bf8c9055b399face9fad372


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.