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 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 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