xref: /titanic_50/usr/src/psm/promif/ieee1275/sun4u/prom_tlb.c (revision d24234c24aeaca4ca56ee3ac2794507968f274c4)
1*d24234c2SJerry Gilliam /*
2*d24234c2SJerry Gilliam  * CDDL HEADER START
3*d24234c2SJerry Gilliam  *
4*d24234c2SJerry Gilliam  * The contents of this file are subject to the terms of the
5*d24234c2SJerry Gilliam  * Common Development and Distribution License (the "License").
6*d24234c2SJerry Gilliam  * You may not use this file except in compliance with the License.
7*d24234c2SJerry Gilliam  *
8*d24234c2SJerry Gilliam  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*d24234c2SJerry Gilliam  * or http://www.opensolaris.org/os/licensing.
10*d24234c2SJerry Gilliam  * See the License for the specific language governing permissions
11*d24234c2SJerry Gilliam  * and limitations under the License.
12*d24234c2SJerry Gilliam  *
13*d24234c2SJerry Gilliam  * When distributing Covered Code, include this CDDL HEADER in each
14*d24234c2SJerry Gilliam  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*d24234c2SJerry Gilliam  * If applicable, add the following below this CDDL HEADER, with the
16*d24234c2SJerry Gilliam  * fields enclosed by brackets "[]" replaced with your own identifying
17*d24234c2SJerry Gilliam  * information: Portions Copyright [yyyy] [name of copyright owner]
18*d24234c2SJerry Gilliam  *
19*d24234c2SJerry Gilliam  * CDDL HEADER END
20*d24234c2SJerry Gilliam  */
21*d24234c2SJerry Gilliam /*
22*d24234c2SJerry Gilliam  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
23*d24234c2SJerry Gilliam  * Use is subject to license terms.
24*d24234c2SJerry Gilliam  */
25*d24234c2SJerry Gilliam 
26*d24234c2SJerry Gilliam #include <sys/promif.h>
27*d24234c2SJerry Gilliam #include <sys/promimpl.h>
28*d24234c2SJerry Gilliam 
29*d24234c2SJerry Gilliam /*
30*d24234c2SJerry Gilliam  * prom_itlb_load, prom_dtlb_load:
31*d24234c2SJerry Gilliam  *
32*d24234c2SJerry Gilliam  * Manage the Spitfire TLB. Returns 0 if successful, -1 otherwise.
33*d24234c2SJerry Gilliam  * Flush the address in context zero mapped by tte_data and virt,
34*d24234c2SJerry Gilliam  * and load the {i,d} tlb entry index with tte_data and virt.
35*d24234c2SJerry Gilliam  */
36*d24234c2SJerry Gilliam 
37*d24234c2SJerry Gilliam int
prom_itlb_load(int index,unsigned long long tte_data,caddr_t virt)38*d24234c2SJerry Gilliam prom_itlb_load(int index, unsigned long long tte_data, caddr_t virt)
39*d24234c2SJerry Gilliam {
40*d24234c2SJerry Gilliam 	cell_t ci[9];
41*d24234c2SJerry Gilliam 	int rv;
42*d24234c2SJerry Gilliam 	ihandle_t immu = prom_mmu_ihandle();
43*d24234c2SJerry Gilliam 
44*d24234c2SJerry Gilliam 	if ((immu == (ihandle_t)-1))
45*d24234c2SJerry Gilliam 		return (-1);
46*d24234c2SJerry Gilliam 
47*d24234c2SJerry Gilliam 	ci[0] = p1275_ptr2cell("call-method");	/* Service name */
48*d24234c2SJerry Gilliam 	ci[1] = (cell_t)5;			/* #argument cells */
49*d24234c2SJerry Gilliam 	ci[2] = (cell_t)1;			/* #result cells */
50*d24234c2SJerry Gilliam 	ci[3] = p1275_ptr2cell("SUNW,itlb-load"); /* Arg1: method name */
51*d24234c2SJerry Gilliam 	ci[4] = p1275_ihandle2cell(immu);	/* Arg2: mmu ihandle */
52*d24234c2SJerry Gilliam 	ci[5] = p1275_ptr2cell(virt);		/* Arg3: SA1: virt */
53*d24234c2SJerry Gilliam 	ci[6] = (cell_t)tte_data;		/* Arg4: SA2: tte_data */
54*d24234c2SJerry Gilliam 	ci[7] = p1275_int2cell(index);		/* Arg5: SA3: index */
55*d24234c2SJerry Gilliam 
56*d24234c2SJerry Gilliam 	promif_preprom();
57*d24234c2SJerry Gilliam 	rv = p1275_cif_handler(&ci);
58*d24234c2SJerry Gilliam 	promif_postprom();
59*d24234c2SJerry Gilliam 
60*d24234c2SJerry Gilliam 	if (rv != 0)
61*d24234c2SJerry Gilliam 		return (-1);
62*d24234c2SJerry Gilliam 	if (ci[8] != 0)				/* Res1: Catch result */
63*d24234c2SJerry Gilliam 		return (-1);
64*d24234c2SJerry Gilliam 	return (0);
65*d24234c2SJerry Gilliam }
66*d24234c2SJerry Gilliam 
67*d24234c2SJerry Gilliam int
prom_dtlb_load(int index,unsigned long long tte_data,caddr_t virt)68*d24234c2SJerry Gilliam prom_dtlb_load(int index, unsigned long long tte_data, caddr_t virt)
69*d24234c2SJerry Gilliam {
70*d24234c2SJerry Gilliam 	cell_t ci[9];
71*d24234c2SJerry Gilliam 	int rv;
72*d24234c2SJerry Gilliam 	ihandle_t immu = prom_mmu_ihandle();
73*d24234c2SJerry Gilliam 
74*d24234c2SJerry Gilliam 	if ((immu == (ihandle_t)-1))
75*d24234c2SJerry Gilliam 		return (-1);
76*d24234c2SJerry Gilliam 
77*d24234c2SJerry Gilliam 	ci[0] = p1275_ptr2cell("call-method");	/* Service name */
78*d24234c2SJerry Gilliam 	ci[1] = (cell_t)5;			/* #argument cells */
79*d24234c2SJerry Gilliam 	ci[2] = (cell_t)1;			/* #result cells */
80*d24234c2SJerry Gilliam 	ci[3] = p1275_ptr2cell("SUNW,dtlb-load"); /* Arg1: method name */
81*d24234c2SJerry Gilliam 	ci[4] = p1275_ihandle2cell(immu);	/* Arg2: mmu ihandle */
82*d24234c2SJerry Gilliam 	ci[5] = p1275_ptr2cell(virt);		/* Arg3: SA1: virt */
83*d24234c2SJerry Gilliam 	ci[6] = (cell_t)tte_data;		/* Arg4: SA2: tte_data */
84*d24234c2SJerry Gilliam 	ci[7] = p1275_int2cell(index);		/* Arg5: SA3: index */
85*d24234c2SJerry Gilliam 
86*d24234c2SJerry Gilliam 	promif_preprom();
87*d24234c2SJerry Gilliam 	rv = p1275_cif_handler(&ci);
88*d24234c2SJerry Gilliam 	promif_postprom();
89*d24234c2SJerry Gilliam 
90*d24234c2SJerry Gilliam 	if (rv != 0)
91*d24234c2SJerry Gilliam 		return (-1);
92*d24234c2SJerry Gilliam 	if (ci[8] != 0)				/* Res1: Catch result */
93*d24234c2SJerry Gilliam 		return (-1);
94*d24234c2SJerry Gilliam 	return (0);
95*d24234c2SJerry Gilliam }
96