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  */
  29 
  30 #ifndef _SYS_MEM_H
  31 #define _SYS_MEM_H
  32 
  33 #ifdef  __cplusplus
  34 extern "C" {
  35 #endif
  36 
  37 #include <sys/types.h>
  38 #include <sys/uio.h>
  39 
  40 /*
  41  * Memory Device Minor Numbers
  42  */
  43 #define M_MEM           0       /* /dev/mem - physical main memory */
  44 #define M_KMEM          1       /* /dev/kmem - virtual kernel memory */
  45 #define M_NULL          2       /* /dev/null - EOF & Rathole */
  46 #define M_ALLKMEM       3       /* /dev/allkmem - virtual kernel memory & I/O */
  47 #define M_ZERO          12      /* /dev/zero - source of private memory */
  48 
  49 /*
  50  * Private ioctl for libkvm: translate virtual address to physical address.
  51  */
  52 #define MEM_VTOP                (('M' << 8) | 0x01)
  53 
  54 typedef struct mem_vtop {
  55         struct as       *m_as;
  56         void            *m_va;
  57         pfn_t           m_pfn;
  58 } mem_vtop_t;
  59 
  60 #if defined(_SYSCALL32)
  61 typedef struct mem_vtop32 {
  62         uint32_t        m_as;
  63         uint32_t        m_va;
  64         uint32_t        m_pfn;
  65 } mem_vtop32_t;
  66 #endif
  67 
  68 /*
  69  * Private ioctls for fmd(1M).  These interfaces are Sun Private.  Applications
  70  * and drivers should not make use of these interfaces: they can change without
  71  * notice and programs that consume them will fail to run on future releases.
  72  */
  73 #define MEM_NAME                (('M' << 8) | 0x04)
  74 #define MEM_INFO                (('M' << 8) | 0x05)
  75 
  76 #define MEM_PAGE_RETIRE         (('M' << 8) | 0x02)
  77 #define MEM_PAGE_ISRETIRED      (('M' << 8) | 0x03)
  78 #define MEM_PAGE_UNRETIRE       (('M' << 8) | 0x06)
  79 #define MEM_PAGE_GETERRORS      (('M' << 8) | 0x07)
  80 #define MEM_PAGE_RETIRE_MCE     (('M' << 8) | 0x08)
  81 #define MEM_PAGE_RETIRE_UE      (('M' << 8) | 0x09)
  82 #define MEM_PAGE_RETIRE_TEST    (('M' << 8) | 0x0A)
  83 
  84 #define MEM_SID                 (('M' << 8) | 0x0B)
  85 
  86 /*
  87  * Bits returned from MEM_PAGE_GETERRORS ioctl for use by fmd(1M).
  88  */
  89 #define MEM_PAGE_ERR_NONE       0x0
  90 #define MEM_PAGE_ERR_MULTI_CE   0x1
  91 #define MEM_PAGE_ERR_UE         0x2
  92 #define MEM_PAGE_ERR_FMA_REQ    0x8
  93 
  94 #define MEM_FMRI_MAX_BUFSIZE    8192    /* maximum allowed packed FMRI size */
  95 
  96 typedef struct mem_name {
  97         uint64_t        m_addr;         /* memory address */
  98         uint64_t        m_synd;         /* architecture-specific syndrome */
  99         uint64_t        m_type[2];      /* architecture-specific type */
 100         caddr_t         m_name;         /* memory name buffer */
 101         size_t          m_namelen;      /* memory name buffer length */
 102         caddr_t         m_sid;          /* memory serial id buffer */
 103         size_t          m_sidlen;       /* memory serial id buffer length */
 104 } mem_name_t;
 105 
 106 #if     defined(_SYSCALL32)
 107 typedef struct mem_name32 {
 108         uint64_t        m_addr;
 109         uint64_t        m_synd;
 110         uint64_t        m_type[2];
 111         caddr32_t       m_name;
 112         size32_t        m_namelen;
 113         caddr32_t       m_sid;
 114         size32_t        m_sidlen;
 115 } mem_name32_t;
 116 #endif  /* _SYSCALL32 */
 117 
 118 typedef struct mem_info {
 119         uint64_t        m_addr;         /* memory address */
 120         uint64_t        m_synd;         /* architecture-specific syndrome */
 121         uint64_t        m_mem_size;     /* total memory size */
 122         uint64_t        m_seg_size;     /* segment size */
 123         uint64_t        m_bank_size;    /* bank size */
 124         int             m_segments;     /* # of segments */
 125         int             m_banks;        /* # of banks in segment */
 126         int             m_mcid;         /* associated memory controller id */
 127 } mem_info_t;
 128 
 129 #ifdef  _KERNEL
 130 
 131 extern pfn_t impl_obmem_pfnum(pfn_t);
 132 
 133 extern int plat_mem_do_mmio(struct uio *, enum uio_rw);
 134 
 135 typedef struct mm_logentry {
 136         uintptr_t       mle_vaddr;      /* vaddr being written to */
 137         size_t          mle_len;        /* length of write */
 138         timespec_t      mle_hrestime;   /* hrestime at time of write */
 139         hrtime_t        mle_hrtime;     /* hrtime at time of write */
 140         pid_t           mle_pid;        /* pid of writing process */
 141         char            mle_psargs[80]; /* psargs of writing process */
 142 } mm_logentry_t;
 143 
 144 #endif  /* _KERNEL */
 145 
 146 #ifdef  __cplusplus
 147 }
 148 #endif
 149 
 150 #endif  /* _SYS_MEM_H */