1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
  23  * Use is subject to license terms.
  24  */
  25 
  26 /*
  27  * Copyright (c) 2015, Joyent, Inc.  All rights reserved.
  28  * Copyright (c) 2017 James S Blachly, MD <james.blachly@gmail.com>
  29  */
  30 
  31 #ifndef _SYS_MEM_H
  32 #define _SYS_MEM_H
  33 
  34 #ifdef  __cplusplus
  35 extern "C" {
  36 #endif
  37 
  38 #include <sys/types.h>
  39 #include <sys/uio.h>
  40 
  41 /*
  42  * Memory Device Minor Numbers
  43  */
  44 #define M_MEM           0       /* /dev/mem - physical main memory */
  45 #define M_KMEM          1       /* /dev/kmem - virtual kernel memory */
  46 #define M_NULL          2       /* /dev/null - EOF & Rathole */
  47 #define M_ALLKMEM       3       /* /dev/allkmem - virtual kernel memory & I/O */
  48 #define M_ZERO          12      /* /dev/zero - source of private memory */
  49 #define M_FULL          13      /* /dev/full - write always ret ENOSPC */
  50 
  51 /*
  52  * Private ioctl for libkvm: translate virtual address to physical address.
  53  */
  54 #define MEM_VTOP                (('M' << 8) | 0x01)
  55 
  56 typedef struct mem_vtop {
  57         struct as       *m_as;
  58         void            *m_va;
  59         pfn_t           m_pfn;
  60 } mem_vtop_t;
  61 
  62 #if defined(_SYSCALL32)
  63 typedef struct mem_vtop32 {
  64         uint32_t        m_as;
  65         uint32_t        m_va;
  66         uint32_t        m_pfn;
  67 } mem_vtop32_t;
  68 #endif
  69 
  70 /*
  71  * Private ioctls for fmd(1M).  These interfaces are Sun Private.  Applications
  72  * and drivers should not make use of these interfaces: they can change without
  73  * notice and programs that consume them will fail to run on future releases.
  74  */
  75 #define MEM_NAME                (('M' << 8) | 0x04)
  76 #define MEM_INFO                (('M' << 8) | 0x05)
  77 
  78 #define MEM_PAGE_RETIRE         (('M' << 8) | 0x02)
  79 #define MEM_PAGE_ISRETIRED      (('M' << 8) | 0x03)
  80 #define MEM_PAGE_UNRETIRE       (('M' << 8) | 0x06)
  81 #define MEM_PAGE_GETERRORS      (('M' << 8) | 0x07)
  82 #define MEM_PAGE_RETIRE_MCE     (('M' << 8) | 0x08)
  83 #define MEM_PAGE_RETIRE_UE      (('M' << 8) | 0x09)
  84 #define MEM_PAGE_RETIRE_TEST    (('M' << 8) | 0x0A)
  85 
  86 #define MEM_SID                 (('M' << 8) | 0x0B)
  87 
  88 /*
  89  * Bits returned from MEM_PAGE_GETERRORS ioctl for use by fmd(1M).
  90  */
  91 #define MEM_PAGE_ERR_NONE       0x0
  92 #define MEM_PAGE_ERR_MULTI_CE   0x1
  93 #define MEM_PAGE_ERR_UE         0x2
  94 #define MEM_PAGE_ERR_FMA_REQ    0x8
  95 
  96 #define MEM_FMRI_MAX_BUFSIZE    8192    /* maximum allowed packed FMRI size */
  97 
  98 typedef struct mem_name {
  99         uint64_t        m_addr;         /* memory address */
 100         uint64_t        m_synd;         /* architecture-specific syndrome */
 101         uint64_t        m_type[2];      /* architecture-specific type */
 102         caddr_t         m_name;         /* memory name buffer */
 103         size_t          m_namelen;      /* memory name buffer length */
 104         caddr_t         m_sid;          /* memory serial id buffer */
 105         size_t          m_sidlen;       /* memory serial id buffer length */
 106 } mem_name_t;
 107 
 108 #if     defined(_SYSCALL32)
 109 typedef struct mem_name32 {
 110         uint64_t        m_addr;
 111         uint64_t        m_synd;
 112         uint64_t        m_type[2];
 113         caddr32_t       m_name;
 114         size32_t        m_namelen;
 115         caddr32_t       m_sid;
 116         size32_t        m_sidlen;
 117 } mem_name32_t;
 118 #endif  /* _SYSCALL32 */
 119 
 120 typedef struct mem_info {
 121         uint64_t        m_addr;         /* memory address */
 122         uint64_t        m_synd;         /* architecture-specific syndrome */
 123         uint64_t        m_mem_size;     /* total memory size */
 124         uint64_t        m_seg_size;     /* segment size */
 125         uint64_t        m_bank_size;    /* bank size */
 126         int             m_segments;     /* # of segments */
 127         int             m_banks;        /* # of banks in segment */
 128         int             m_mcid;         /* associated memory controller id */
 129 } mem_info_t;
 130 
 131 #ifdef  _KERNEL
 132 
 133 extern pfn_t impl_obmem_pfnum(pfn_t);
 134 
 135 extern int plat_mem_do_mmio(struct uio *, enum uio_rw);
 136 
 137 typedef struct mm_logentry {
 138         uintptr_t       mle_vaddr;      /* vaddr being written to */
 139         size_t          mle_len;        /* length of write */
 140         timespec_t      mle_hrestime;   /* hrestime at time of write */
 141         hrtime_t        mle_hrtime;     /* hrtime at time of write */
 142         pid_t           mle_pid;        /* pid of writing process */
 143         char            mle_psargs[80]; /* psargs of writing process */
 144 } mm_logentry_t;
 145 
 146 #endif  /* _KERNEL */
 147 
 148 #ifdef  __cplusplus
 149 }
 150 #endif
 151 
 152 #endif  /* _SYS_MEM_H */