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