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 #include <sys/promif.h>
27*11498SJerry.Gilliam@Sun.COM #include <sys/promimpl.h>
28*11498SJerry.Gilliam@Sun.COM
29*11498SJerry.Gilliam@Sun.COM /*
30*11498SJerry.Gilliam@Sun.COM * prom_itlb_load, prom_dtlb_load:
31*11498SJerry.Gilliam@Sun.COM *
32*11498SJerry.Gilliam@Sun.COM * Manage the Spitfire TLB. Returns 0 if successful, -1 otherwise.
33*11498SJerry.Gilliam@Sun.COM * Flush the address in context zero mapped by tte_data and virt,
34*11498SJerry.Gilliam@Sun.COM * and load the {i,d} tlb entry index with tte_data and virt.
35*11498SJerry.Gilliam@Sun.COM */
36*11498SJerry.Gilliam@Sun.COM
37*11498SJerry.Gilliam@Sun.COM int
prom_itlb_load(int index,unsigned long long tte_data,caddr_t virt)38*11498SJerry.Gilliam@Sun.COM prom_itlb_load(int index, unsigned long long tte_data, caddr_t virt)
39*11498SJerry.Gilliam@Sun.COM {
40*11498SJerry.Gilliam@Sun.COM cell_t ci[9];
41*11498SJerry.Gilliam@Sun.COM int rv;
42*11498SJerry.Gilliam@Sun.COM ihandle_t immu = prom_mmu_ihandle();
43*11498SJerry.Gilliam@Sun.COM
44*11498SJerry.Gilliam@Sun.COM if ((immu == (ihandle_t)-1))
45*11498SJerry.Gilliam@Sun.COM return (-1);
46*11498SJerry.Gilliam@Sun.COM
47*11498SJerry.Gilliam@Sun.COM ci[0] = p1275_ptr2cell("call-method"); /* Service name */
48*11498SJerry.Gilliam@Sun.COM ci[1] = (cell_t)5; /* #argument cells */
49*11498SJerry.Gilliam@Sun.COM ci[2] = (cell_t)1; /* #result cells */
50*11498SJerry.Gilliam@Sun.COM ci[3] = p1275_ptr2cell("SUNW,itlb-load"); /* Arg1: method name */
51*11498SJerry.Gilliam@Sun.COM ci[4] = p1275_ihandle2cell(immu); /* Arg2: mmu ihandle */
52*11498SJerry.Gilliam@Sun.COM ci[5] = p1275_ptr2cell(virt); /* Arg3: SA1: virt */
53*11498SJerry.Gilliam@Sun.COM ci[6] = (cell_t)tte_data; /* Arg4: SA2: tte_data */
54*11498SJerry.Gilliam@Sun.COM ci[7] = p1275_int2cell(index); /* Arg5: SA3: index */
55*11498SJerry.Gilliam@Sun.COM
56*11498SJerry.Gilliam@Sun.COM promif_preprom();
57*11498SJerry.Gilliam@Sun.COM rv = p1275_cif_handler(&ci);
58*11498SJerry.Gilliam@Sun.COM promif_postprom();
59*11498SJerry.Gilliam@Sun.COM
60*11498SJerry.Gilliam@Sun.COM if (rv != 0)
61*11498SJerry.Gilliam@Sun.COM return (-1);
62*11498SJerry.Gilliam@Sun.COM if (ci[8] != 0) /* Res1: Catch result */
63*11498SJerry.Gilliam@Sun.COM return (-1);
64*11498SJerry.Gilliam@Sun.COM return (0);
65*11498SJerry.Gilliam@Sun.COM }
66*11498SJerry.Gilliam@Sun.COM
67*11498SJerry.Gilliam@Sun.COM int
prom_dtlb_load(int index,unsigned long long tte_data,caddr_t virt)68*11498SJerry.Gilliam@Sun.COM prom_dtlb_load(int index, unsigned long long tte_data, caddr_t virt)
69*11498SJerry.Gilliam@Sun.COM {
70*11498SJerry.Gilliam@Sun.COM cell_t ci[9];
71*11498SJerry.Gilliam@Sun.COM int rv;
72*11498SJerry.Gilliam@Sun.COM ihandle_t immu = prom_mmu_ihandle();
73*11498SJerry.Gilliam@Sun.COM
74*11498SJerry.Gilliam@Sun.COM if ((immu == (ihandle_t)-1))
75*11498SJerry.Gilliam@Sun.COM return (-1);
76*11498SJerry.Gilliam@Sun.COM
77*11498SJerry.Gilliam@Sun.COM ci[0] = p1275_ptr2cell("call-method"); /* Service name */
78*11498SJerry.Gilliam@Sun.COM ci[1] = (cell_t)5; /* #argument cells */
79*11498SJerry.Gilliam@Sun.COM ci[2] = (cell_t)1; /* #result cells */
80*11498SJerry.Gilliam@Sun.COM ci[3] = p1275_ptr2cell("SUNW,dtlb-load"); /* Arg1: method name */
81*11498SJerry.Gilliam@Sun.COM ci[4] = p1275_ihandle2cell(immu); /* Arg2: mmu ihandle */
82*11498SJerry.Gilliam@Sun.COM ci[5] = p1275_ptr2cell(virt); /* Arg3: SA1: virt */
83*11498SJerry.Gilliam@Sun.COM ci[6] = (cell_t)tte_data; /* Arg4: SA2: tte_data */
84*11498SJerry.Gilliam@Sun.COM ci[7] = p1275_int2cell(index); /* Arg5: SA3: index */
85*11498SJerry.Gilliam@Sun.COM
86*11498SJerry.Gilliam@Sun.COM promif_preprom();
87*11498SJerry.Gilliam@Sun.COM rv = p1275_cif_handler(&ci);
88*11498SJerry.Gilliam@Sun.COM promif_postprom();
89*11498SJerry.Gilliam@Sun.COM
90*11498SJerry.Gilliam@Sun.COM if (rv != 0)
91*11498SJerry.Gilliam@Sun.COM return (-1);
92*11498SJerry.Gilliam@Sun.COM if (ci[8] != 0) /* Res1: Catch result */
93*11498SJerry.Gilliam@Sun.COM return (-1);
94*11498SJerry.Gilliam@Sun.COM return (0);
95*11498SJerry.Gilliam@Sun.COM }
96