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 2010 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 #ifndef _SYS_PROM_PLAT_H 27 #define _SYS_PROM_PLAT_H 28 29 #include <sys/feature_tests.h> 30 31 #ifdef __cplusplus 32 extern "C" { 33 #endif 34 35 #if !defined(_LONGLONG_TYPE) 36 #error "This header won't work without long long support" 37 #endif 38 39 /* 40 * This file contains external platform-specific promif interface definitions. 41 * There may be none. This file is included by reference in <sys/promif.h> 42 * 43 * Common sun4 subset for the IEEE 1275-1994 compliant prom. 44 */ 45 46 /* 47 * Memory allocation plus memory/mmu interfaces: 48 * 49 * Routines with fine-grained memory and MMU control are platform-dependent. 50 * 51 * MMU node virtualized "mode" arguments and results for Spitfire MMU: 52 * 53 * The default virtualized "mode" for client program mappings created 54 * by the firmware is as follows: 55 * 56 * G (global) Clear 57 * L (locked) Clear 58 * W (write) Set 59 * R (read - soft) Set (Prom is not required to implement soft bits) 60 * X (exec - soft) Set (Prom is not required to implement soft bits) 61 * CV,CP (Cacheable) Set if memory page, Clear if IO page 62 * E (side effects) Clear if memory page; Set if IO page 63 * IE (Invert endian.) Clear 64 * 65 * The following fields are initialized as follows in the TTE-data for any 66 * mappings created by the firmware on behalf of the client program: 67 * 68 * P (Priviledged) Set 69 * V (Valid) Set 70 * NFO (No Fault Only) Clear 71 * Context 0 72 * Soft bits < private to the firmware implementation > 73 * 74 * Page size of Prom mappings are typically 8k, "modify" cannot change 75 * page sizes. Mappings created by "map" are 8k pages. 76 * 77 * If the virtualized "mode" is -1, the defaults as shown above are used, 78 * otherwise the virtualized "mode" is set (and returned) based on the 79 * following virtualized "mode" abstractions. The mmu node "translations" 80 * property contains the actual tte-data, not the virtualized "mode". 81 * 82 * Note that client programs may not create locked mappings by setting 83 * the LOCKED bit. There are Spitfire specific client interfaces to create 84 * and remove locked mappings. (SUNW,{i,d}tlb-load). 85 * The LOCKED bit is defined here since it may be returned by the 86 * "translate" method. 87 * 88 * The PROM is not required to implement the Read and eXecute soft bits, 89 * and is not required to track them for the client program. They may be 90 * set on calls to "map" and "modfify" and may be ignored by the firmware, 91 * and are not necessarily returned from "translate". 92 * 93 * The TTE soft bits are private to the firmware. No assumptions may 94 * be made regarding the contents of the TTE soft bits. 95 * 96 * Changing a mapping from cacheable to non-cacheable implies a flush 97 * or invalidate operation, if necessary. 98 * 99 * NB: The "map" MMU node method should NOT be used to create IO device 100 * mappings. The correct way to do this is to call the device's parent 101 * "map-in" method using the CALL-METHOD client interface service. 102 */ 103 104 #define PROM_MMU_MODE_DEFAULT ((int)-1) /* Default "mode", see above */ 105 106 /* 107 * NB: These are not implemented in PROM version P1.0 ... 108 */ 109 #define PROM_MMU_MODE_WRITE 0x0001 /* Translation is Writable */ 110 #define PROM_MMU_MODE_READ 0x0002 /* Soft: Readable, See above */ 111 #define PROM_MMU_MODE_EXEC 0x0004 /* Soft: eXecutable, See above */ 112 #define PROM_MMU_MODE_RWX_MASK 0x0007 /* Mask for R-W-X bits */ 113 114 #define PROM_MMU_MODE_LOCKED 0x0010 /* Read-only: Locked; see above */ 115 #define PROM_MMU_MODE_CACHED 0x0020 /* Set means both CV,CP bits */ 116 #define PROM_MMU_MODE_EFFECTS 0x0040 /* side Effects bit in MMU */ 117 #define PROM_MMU_MODE_GLOBAL 0x0080 /* Global bit */ 118 #define PROM_MMU_MODE_INVERT 0x0100 /* Invert Endianness */ 119 120 /* 121 * resource allocation group: OBP only. (mapping functions are platform 122 * dependent because they use physical address arguments.) 123 */ 124 extern caddr_t prom_map(caddr_t virthint, 125 unsigned long long physaddr, uint_t size); 126 127 /* 128 * prom_alloc is platform dependent and has historical semantics 129 * associated with the align argument and the return value. 130 * prom_malloc is the generic memory allocator. 131 */ 132 extern caddr_t prom_malloc(caddr_t virt, size_t size, uint_t align); 133 134 extern caddr_t prom_allocate_virt(uint_t align, size_t size); 135 extern caddr_t prom_claim_virt(size_t size, caddr_t virt); 136 extern void prom_free_virt(size_t size, caddr_t virt); 137 138 extern int prom_allocate_phys(size_t size, uint_t align, 139 unsigned long long *physaddr); 140 extern int prom_claim_phys(size_t size, 141 unsigned long long physaddr); 142 extern void prom_free_phys(size_t size, 143 unsigned long long physaddr); 144 145 extern int prom_map_phys(int mode, size_t size, caddr_t virt, 146 unsigned long long physaddr); 147 extern void prom_unmap_phys(size_t size, caddr_t virt); 148 extern void prom_unmap_virt(size_t size, caddr_t virt); 149 150 extern int prom_phys_installed_len(void); 151 extern int prom_phys_avail_len(void); 152 extern int prom_virt_avail_len(void); 153 154 extern int prom_phys_installed(caddr_t); 155 extern int prom_phys_avail(caddr_t); 156 extern int prom_virt_avail(caddr_t); 157 158 /* 159 * prom_retain allocates or returns retained physical memory 160 * identified by the arguments of name string "id", "size" and "align". 161 */ 162 extern int prom_retain(char *id, size_t size, uint_t align, 163 unsigned long long *physaddr); 164 165 /* 166 * prom_translate_virt returns the physical address and virtualized "mode" 167 * for the given virtual address. After the call, if *valid is non-zero, 168 * a mapping to 'virt' exists and the physical address and virtualized 169 * "mode" were returned to the caller. 170 */ 171 extern int prom_translate_virt(caddr_t virt, int *valid, 172 unsigned long long *physaddr, int *mode); 173 174 /* 175 * prom_modify_mapping changes the "mode" of an existing mapping or 176 * repeated mappings. virt is the virtual address whose "mode" is to 177 * be changed; size is some multiple of the fundamental pagesize. 178 * This method cannot be used to change the pagesize of an MMU mapping, 179 * nor can it be used to Lock a translation into the i or d tlb. 180 */ 181 extern int prom_modify_mapping(caddr_t virt, size_t size, int mode); 182 183 /* 184 * Client interfaces for managing the {i,d}tlb handoff to client programs. 185 */ 186 extern int prom_itlb_load(int index, 187 unsigned long long tte_data, caddr_t virt); 188 189 extern int prom_dtlb_load(int index, 190 unsigned long long tte_data, caddr_t virt); 191 192 193 /* 194 * The client program implementation is required to provide a wrapper 195 * to the client handler, for the 32 bit client program to 64 bit cell-sized 196 * client interface handler (switch stack, etc.). This function is not 197 * to be used externally! 198 */ 199 200 extern int client_handler(void *cif_handler, void *arg_array); 201 202 /* 203 * The 'format' of the "translations" property in the 'mmu' node ... 204 */ 205 206 struct translation { 207 uint32_t virt_hi; /* upper 32 bits of vaddr */ 208 uint32_t virt_lo; /* lower 32 bits of vaddr */ 209 uint32_t size_hi; /* upper 32 bits of size in bytes */ 210 uint32_t size_lo; /* lower 32 bits of size in bytes */ 211 uint32_t tte_hi; /* higher 32 bites of tte */ 212 uint32_t tte_lo; /* lower 32 bits of tte */ 213 }; 214 215 #ifdef __cplusplus 216 } 217 #endif 218 219 #endif /* _SYS_PROM_PLAT_H */ 220