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