xref: /onnv-gate/usr/src/psm/stand/boot/sparc/sun4/sys/prom_plat.h (revision 11498:2fc576d74742)
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