xref: /onnv-gate/usr/src/uts/sun4v/sys/prom_plat.h (revision 5648:161f8007cab9)
10Sstevel@tonic-gate /*
20Sstevel@tonic-gate  * CDDL HEADER START
30Sstevel@tonic-gate  *
40Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
51592Sgirish  * Common Development and Distribution License (the "License").
61592Sgirish  * You may not use this file except in compliance with the License.
70Sstevel@tonic-gate  *
80Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
90Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
100Sstevel@tonic-gate  * See the License for the specific language governing permissions
110Sstevel@tonic-gate  * and limitations under the License.
120Sstevel@tonic-gate  *
130Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
140Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
150Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
160Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
170Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
180Sstevel@tonic-gate  *
190Sstevel@tonic-gate  * CDDL HEADER END
200Sstevel@tonic-gate  */
210Sstevel@tonic-gate /*
22*5648Ssetje  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
230Sstevel@tonic-gate  * Use is subject to license terms.
240Sstevel@tonic-gate  */
250Sstevel@tonic-gate 
260Sstevel@tonic-gate #ifndef	_SYS_PROM_PLAT_H
270Sstevel@tonic-gate #define	_SYS_PROM_PLAT_H
280Sstevel@tonic-gate 
290Sstevel@tonic-gate #pragma ident	"%Z%%M%	%I%	%E% SMI"
300Sstevel@tonic-gate 
310Sstevel@tonic-gate #include <sys/feature_tests.h>
320Sstevel@tonic-gate #include <sys/cpuvar.h>
330Sstevel@tonic-gate 
340Sstevel@tonic-gate #ifdef	__cplusplus
350Sstevel@tonic-gate extern "C" {
360Sstevel@tonic-gate #endif
370Sstevel@tonic-gate 
380Sstevel@tonic-gate #if !defined(_LONGLONG_TYPE)
390Sstevel@tonic-gate #error "This header won't work without long long support"
400Sstevel@tonic-gate #endif
410Sstevel@tonic-gate 
420Sstevel@tonic-gate /*
430Sstevel@tonic-gate  * This file contains external platform-specific promif interface definitions.
440Sstevel@tonic-gate  * There may be none.  This file is included by reference in <sys/promif.h>
450Sstevel@tonic-gate  *
460Sstevel@tonic-gate  * This version of the file is for the IEEE 1275-1994 compliant sun4u prom.
470Sstevel@tonic-gate  */
480Sstevel@tonic-gate 
490Sstevel@tonic-gate /*
500Sstevel@tonic-gate  * Memory allocation plus memory/mmu interfaces:
510Sstevel@tonic-gate  *
520Sstevel@tonic-gate  * Routines with fine-grained memory and MMU control are platform-dependent.
530Sstevel@tonic-gate  *
540Sstevel@tonic-gate  * MMU node virtualized "mode" arguments and results for Spitfire MMU:
550Sstevel@tonic-gate  *
560Sstevel@tonic-gate  * The default virtualized "mode" for client program mappings created
570Sstevel@tonic-gate  * by the firmware is as follows:
580Sstevel@tonic-gate  *
590Sstevel@tonic-gate  * G (global)		Clear
600Sstevel@tonic-gate  * L (locked)		Clear
610Sstevel@tonic-gate  * W (write)		Set
620Sstevel@tonic-gate  * R (read - soft)	Set (Prom is not required to implement soft bits)
630Sstevel@tonic-gate  * X (exec - soft)	Set (Prom is not required to implement soft bits)
640Sstevel@tonic-gate  * CV,CP (Cacheable)	Set if memory page, Clear if IO page
650Sstevel@tonic-gate  * E (side effects)	Clear if memory page; Set if IO page
660Sstevel@tonic-gate  * IE (Invert endian.)	Clear
670Sstevel@tonic-gate  *
680Sstevel@tonic-gate  * The following fields are initialized as follows in the TTE-data for any
690Sstevel@tonic-gate  * mappings created by the firmware on behalf of the client program:
700Sstevel@tonic-gate  *
710Sstevel@tonic-gate  * P (Priviledged)	Set
720Sstevel@tonic-gate  * V (Valid)		Set
730Sstevel@tonic-gate  * NFO (No Fault Only)	Clear
740Sstevel@tonic-gate  * Context		0
750Sstevel@tonic-gate  * Soft bits		< private to the firmware implementation >
760Sstevel@tonic-gate  *
770Sstevel@tonic-gate  * Page size of Prom mappings are typically 8k, "modify" cannot change
780Sstevel@tonic-gate  * page sizes. Mappings created by "map" are 8k pages.
790Sstevel@tonic-gate  *
800Sstevel@tonic-gate  * If the virtualized "mode" is -1, the defaults as shown above are used,
810Sstevel@tonic-gate  * otherwise the virtualized "mode" is set (and returned) based on the
820Sstevel@tonic-gate  * following virtualized "mode" abstractions. The mmu node "translations"
830Sstevel@tonic-gate  * property contains the actual tte-data, not the virtualized "mode".
840Sstevel@tonic-gate  *
850Sstevel@tonic-gate  * Note that client programs may not create locked mappings by setting
860Sstevel@tonic-gate  * the LOCKED bit. There are Spitfire specific client interfaces to create
870Sstevel@tonic-gate  * and remove locked mappings. (SUNW,{i,d}tlb-load).
880Sstevel@tonic-gate  * The LOCKED bit is defined here since it may be returned by the
890Sstevel@tonic-gate  * "translate" method.
900Sstevel@tonic-gate  *
910Sstevel@tonic-gate  * The PROM is not required to implement the Read and eXecute soft bits,
920Sstevel@tonic-gate  * and is not required to track them for the client program. They may be
930Sstevel@tonic-gate  * set on calls to "map" and "modfify" and may be ignored by the firmware,
940Sstevel@tonic-gate  * and are not necessarily returned from "translate".
950Sstevel@tonic-gate  *
960Sstevel@tonic-gate  * The TTE soft bits are private to the firmware.  No assumptions may
970Sstevel@tonic-gate  * be made regarding the contents of the TTE soft bits.
980Sstevel@tonic-gate  *
990Sstevel@tonic-gate  * Changing a mapping from cacheable to non-cacheable implies a flush
1000Sstevel@tonic-gate  * or invalidate operation, if necessary.
1010Sstevel@tonic-gate  *
1020Sstevel@tonic-gate  * NB: The "map" MMU node method should NOT be used to create IO device
1030Sstevel@tonic-gate  * mappings. The correct way to do this is to call the device's parent
1040Sstevel@tonic-gate  * "map-in" method using the CALL-METHOD client interface service.
1050Sstevel@tonic-gate  */
1060Sstevel@tonic-gate 
1070Sstevel@tonic-gate #define	PROM_MMU_MODE_DEFAULT	((int)-1)	/* Default "mode", see above */
1080Sstevel@tonic-gate 
1090Sstevel@tonic-gate /*
1100Sstevel@tonic-gate  * NB: These are not implemented in PROM version P1.0 ...
1110Sstevel@tonic-gate  */
1120Sstevel@tonic-gate #define	PROM_MMU_MODE_WRITE	0x0001	/* Translation is Writable */
1130Sstevel@tonic-gate #define	PROM_MMU_MODE_READ	0x0002	/* Soft: Readable, See above */
1140Sstevel@tonic-gate #define	PROM_MMU_MODE_EXEC	0x0004	/* Soft: eXecutable, See above */
1150Sstevel@tonic-gate #define	PROM_MMU_MODE_RWX_MASK	0x0007	/* Mask for R-W-X bits */
1160Sstevel@tonic-gate 
1170Sstevel@tonic-gate #define	PROM_MMU_MODE_LOCKED	0x0010	/* Read-only: Locked; see above */
1180Sstevel@tonic-gate #define	PROM_MMU_MODE_CACHED	0x0020	/* Set means both CV,CP bits */
1190Sstevel@tonic-gate #define	PROM_MMU_MODE_EFFECTS	0x0040	/* side Effects bit in MMU */
1200Sstevel@tonic-gate #define	PROM_MMU_MODE_GLOBAL	0x0080	/* Global bit */
1210Sstevel@tonic-gate #define	PROM_MMU_MODE_INVERT	0x0100	/* Invert Endianness */
1220Sstevel@tonic-gate 
1230Sstevel@tonic-gate /*
1240Sstevel@tonic-gate  * resource allocation group: OBP only. (mapping functions are platform
1250Sstevel@tonic-gate  * dependent because they use physical address arguments.)
1260Sstevel@tonic-gate  */
1270Sstevel@tonic-gate extern	caddr_t		prom_map(caddr_t virthint,
1280Sstevel@tonic-gate 			    unsigned long long physaddr, uint_t size);
1290Sstevel@tonic-gate 
1300Sstevel@tonic-gate /*
1310Sstevel@tonic-gate  * prom_alloc is platform dependent and has historical semantics
1320Sstevel@tonic-gate  * associated with the align argument and the return value.
1330Sstevel@tonic-gate  * prom_malloc is the generic memory allocator.
1340Sstevel@tonic-gate  */
1350Sstevel@tonic-gate extern	caddr_t		prom_malloc(caddr_t virt, size_t size, uint_t align);
1360Sstevel@tonic-gate 
1370Sstevel@tonic-gate extern	caddr_t		prom_allocate_virt(uint_t align, size_t size);
1380Sstevel@tonic-gate extern	caddr_t		prom_claim_virt(size_t size, caddr_t virt);
1390Sstevel@tonic-gate extern	void		prom_free_virt(size_t size, caddr_t virt);
1400Sstevel@tonic-gate 
1410Sstevel@tonic-gate extern	int		prom_allocate_phys(size_t size, uint_t align,
1420Sstevel@tonic-gate 			    unsigned long long *physaddr);
1430Sstevel@tonic-gate extern	int		prom_claim_phys(size_t size,
1440Sstevel@tonic-gate 			    unsigned long long physaddr);
1450Sstevel@tonic-gate extern	void		prom_free_phys(size_t size,
1460Sstevel@tonic-gate 			    unsigned long long physaddr);
1470Sstevel@tonic-gate 
1480Sstevel@tonic-gate extern	int		prom_map_phys(int mode, size_t size, caddr_t virt,
1490Sstevel@tonic-gate 			    unsigned long long physaddr);
1500Sstevel@tonic-gate extern	void		prom_unmap_phys(size_t size, caddr_t virt);
1510Sstevel@tonic-gate extern	void		prom_unmap_virt(size_t size, caddr_t virt);
1520Sstevel@tonic-gate 
153*5648Ssetje extern	int		prom_phys_installed_len(void);
154*5648Ssetje extern	int		prom_phys_avail_len(void);
155*5648Ssetje extern	int		prom_virt_avail_len(void);
156*5648Ssetje 
157*5648Ssetje extern	int		prom_phys_installed(caddr_t);
158*5648Ssetje extern	int		prom_phys_avail(caddr_t);
159*5648Ssetje extern	int		prom_virt_avail(caddr_t);
160*5648Ssetje 
1610Sstevel@tonic-gate /*
1620Sstevel@tonic-gate  * prom_retain allocates or returns retained physical memory
1630Sstevel@tonic-gate  * identified by the arguments of name string "id", "size" and "align".
1640Sstevel@tonic-gate  */
1650Sstevel@tonic-gate extern	int		prom_retain(char *id, size_t size, uint_t align,
1660Sstevel@tonic-gate 			    unsigned long long *physaddr);
1670Sstevel@tonic-gate 
1680Sstevel@tonic-gate /*
1690Sstevel@tonic-gate  * prom_translate_virt returns the physical address and virtualized "mode"
1700Sstevel@tonic-gate  * for the given virtual address. After the call, if *valid is non-zero,
1710Sstevel@tonic-gate  * a mapping to 'virt' exists and the physical address and virtualized
1720Sstevel@tonic-gate  * "mode" were returned to the caller.
1730Sstevel@tonic-gate  */
1740Sstevel@tonic-gate extern	int		prom_translate_virt(caddr_t virt, int *valid,
1750Sstevel@tonic-gate 			    unsigned long long *physaddr, int *mode);
1760Sstevel@tonic-gate 
1770Sstevel@tonic-gate /*
1780Sstevel@tonic-gate  * prom_modify_mapping changes the "mode" of an existing mapping or
1790Sstevel@tonic-gate  * repeated mappings. virt is the virtual address whose "mode" is to
1800Sstevel@tonic-gate  * be changed; size is some multiple of the fundamental pagesize.
1810Sstevel@tonic-gate  * This method cannot be used to change the pagesize of an MMU mapping,
1820Sstevel@tonic-gate  * nor can it be used to Lock a translation into the i or d tlb.
1830Sstevel@tonic-gate  */
1840Sstevel@tonic-gate extern	int	prom_modify_mapping(caddr_t virt, size_t size, int mode);
1850Sstevel@tonic-gate 
1860Sstevel@tonic-gate /*
1870Sstevel@tonic-gate  * Client interfaces for managing the {i,d}tlb handoff to client programs.
1880Sstevel@tonic-gate  */
1890Sstevel@tonic-gate extern	int		prom_itlb_load(int index,
1900Sstevel@tonic-gate 			    unsigned long long tte_data, caddr_t virt);
1910Sstevel@tonic-gate 
1920Sstevel@tonic-gate extern	int		prom_dtlb_load(int index,
1930Sstevel@tonic-gate 			    unsigned long long tte_data, caddr_t virt);
1940Sstevel@tonic-gate 
1950Sstevel@tonic-gate /*
1960Sstevel@tonic-gate  * Administrative group: OBP only and SMCC platform specific.
1970Sstevel@tonic-gate  * XXX: IDPROM related stuff should be replaced with specific data-oriented
1980Sstevel@tonic-gate  * XXX: functions.
1990Sstevel@tonic-gate  */
2000Sstevel@tonic-gate 
2010Sstevel@tonic-gate extern	int		prom_get_unum(int syn_code, unsigned long long physaddr,
2020Sstevel@tonic-gate 				char *buf, uint_t buflen, int *ustrlen);
2030Sstevel@tonic-gate extern	int		prom_getidprom(caddr_t addr, int size);
2040Sstevel@tonic-gate extern	int		prom_getmacaddr(ihandle_t hd, caddr_t ea);
2050Sstevel@tonic-gate 
2060Sstevel@tonic-gate /*
2070Sstevel@tonic-gate  * CPU Control Group: MP's only.
2080Sstevel@tonic-gate  */
209789Sahrens extern	int		prom_startcpu(pnode_t node, caddr_t pc, int arg);
2100Sstevel@tonic-gate extern	int		prom_startcpu_bycpuid(int cpuid, caddr_t pc, int arg);
2110Sstevel@tonic-gate extern	int		prom_stopcpu_bycpuid(int);
2120Sstevel@tonic-gate extern	void		promsafe_pause_cpus(void);
2130Sstevel@tonic-gate extern	void		promsafe_xc_attention(cpuset_t cpuset);
2140Sstevel@tonic-gate 
2150Sstevel@tonic-gate /*
2160Sstevel@tonic-gate  * Set trap table
2170Sstevel@tonic-gate  */
2180Sstevel@tonic-gate extern	void		prom_set_mmfsa_traptable(void *tba_addr,
2190Sstevel@tonic-gate 			    uint64_t mmfsa_ra);
2200Sstevel@tonic-gate /*
2210Sstevel@tonic-gate  * Power-off
2220Sstevel@tonic-gate  */
2230Sstevel@tonic-gate extern	void		prom_power_off(void);
2240Sstevel@tonic-gate 
2250Sstevel@tonic-gate /*
2261592Sgirish  * sun4v API versioning group
2271592Sgirish  */
2281592Sgirish extern uint64_t		prom_set_sun4v_api_version(uint64_t api_group,
2291592Sgirish 			    uint64_t major, uint64_t minor,
2301592Sgirish 			    uint64_t *supported_minor);
2311592Sgirish extern uint64_t		prom_get_sun4v_api_version(uint64_t api_group,
2321592Sgirish 			    uint64_t *major, uint64_t *minor);
2331592Sgirish 
2341592Sgirish 
2351592Sgirish /*
2360Sstevel@tonic-gate  * The client program implementation is required to provide a wrapper
2370Sstevel@tonic-gate  * to the client handler, for the 32 bit client program to 64 bit cell-sized
2380Sstevel@tonic-gate  * client interface handler (switch stack, etc.).  This function is not
2390Sstevel@tonic-gate  * to be used externally!
2400Sstevel@tonic-gate  */
2410Sstevel@tonic-gate 
2420Sstevel@tonic-gate extern	int		client_handler(void *cif_handler, void *arg_array);
2430Sstevel@tonic-gate 
2440Sstevel@tonic-gate /*
2450Sstevel@tonic-gate  * The 'format' of the "translations" property in the 'mmu' node ...
2460Sstevel@tonic-gate  */
2470Sstevel@tonic-gate 
2480Sstevel@tonic-gate struct translation {
2490Sstevel@tonic-gate 	uint32_t virt_hi;	/* upper 32 bits of vaddr */
2500Sstevel@tonic-gate 	uint32_t virt_lo;	/* lower 32 bits of vaddr */
2510Sstevel@tonic-gate 	uint32_t size_hi;	/* upper 32 bits of size in bytes */
2520Sstevel@tonic-gate 	uint32_t size_lo;	/* lower 32 bits of size in bytes */
2530Sstevel@tonic-gate 	uint32_t tte_hi;	/* higher 32 bites of tte */
2540Sstevel@tonic-gate 	uint32_t tte_lo;	/* lower 32 bits of tte */
2550Sstevel@tonic-gate };
2560Sstevel@tonic-gate 
2570Sstevel@tonic-gate #ifdef	__cplusplus
2580Sstevel@tonic-gate }
2590Sstevel@tonic-gate #endif
2600Sstevel@tonic-gate 
2610Sstevel@tonic-gate #endif /* _SYS_PROM_PLAT_H */
262