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