From: Pat Gefre <pfg@sgi.com>

SAL interface clean up



---

 25-akpm/arch/ia64/sn/io/sn2/klconflib.c |    1 
 25-akpm/include/asm-ia64/sn/nodepda.h   |    2 +
 25-akpm/include/asm-ia64/sn/sn_sal.h    |   43 +++++++++++++++++---------------
 3 files changed, 26 insertions(+), 20 deletions(-)

diff -puN arch/ia64/sn/io/sn2/klconflib.c~sn42 arch/ia64/sn/io/sn2/klconflib.c
--- 25/arch/ia64/sn/io/sn2/klconflib.c~sn42	Thu Jan  8 15:25:14 2004
+++ 25-akpm/arch/ia64/sn/io/sn2/klconflib.c	Thu Jan  8 15:25:14 2004
@@ -32,7 +32,6 @@
 #endif /* DEBUG_KLGRAPH */
 
 lboard_t *root_lboard[MAX_COMPACT_NODES];
-u64 klgraph_addr[MAX_COMPACT_NODES];
 static int hasmetarouter;
 
 
diff -puN include/asm-ia64/sn/nodepda.h~sn42 include/asm-ia64/sn/nodepda.h
--- 25/include/asm-ia64/sn/nodepda.h~sn42	Thu Jan  8 15:25:14 2004
+++ 25-akpm/include/asm-ia64/sn/nodepda.h	Thu Jan  8 15:25:14 2004
@@ -65,6 +65,8 @@ struct nodepda_s {
 	nodepda_router_info_t	**npda_rip_last;
 
 
+	spinlock_t		bist_lock;
+
 	/*
 	 * The BTEs on this node are shared by the local cpus
 	 */
diff -puN include/asm-ia64/sn/sn_sal.h~sn42 include/asm-ia64/sn/sn_sal.h
--- 25/include/asm-ia64/sn/sn_sal.h~sn42	Thu Jan  8 15:25:14 2004
+++ 25-akpm/include/asm-ia64/sn/sn_sal.h	Thu Jan  8 15:25:14 2004
@@ -16,7 +16,9 @@
 #include <asm/sal.h>
 #include <asm/sn/sn_cpuid.h>
 #include <asm/sn/arch.h>
-
+#include <asm/sn/nodepda.h>
+#include <asm/sn/klconfig.h>
+        
 
 // SGI Specific Calls
 #define  SN_SAL_POD_MODE                           0x02000001
@@ -167,28 +169,23 @@ static inline u64
 ia64_sn_get_klconfig_addr(nasid_t nasid)
 {
 	struct ia64_sal_retval ret_stuff;
-	extern u64 klgraph_addr[];
 	int cnodeid;
 
 	cnodeid = nasid_to_cnodeid(nasid);
-	if (klgraph_addr[cnodeid] == 0) {
-		ret_stuff.status = 0;
-		ret_stuff.v0 = 0;
-		ret_stuff.v1 = 0;
-		ret_stuff.v2 = 0;
-		SAL_CALL(ret_stuff, SN_SAL_GET_KLCONFIG_ADDR, (u64)nasid, 0, 0, 0, 0, 0, 0);
-
-		/*
-	 	* We should panic if a valid cnode nasid does not produce
-	 	* a klconfig address.
-	 	*/
-		if (ret_stuff.status != 0) {
-			panic("ia64_sn_get_klconfig_addr: Returned error %lx\n", ret_stuff.status);
-		}
+	ret_stuff.status = 0;
+	ret_stuff.v0 = 0;
+	ret_stuff.v1 = 0;
+	ret_stuff.v2 = 0;
+	SAL_CALL(ret_stuff, SN_SAL_GET_KLCONFIG_ADDR, (u64)nasid, 0, 0, 0, 0, 0, 0);
 
-		klgraph_addr[cnodeid] = ret_stuff.v0;
+	/*
+	 * We should panic if a valid cnode nasid does not produce
+	 * a klconfig address.
+	 */
+	if (ret_stuff.status != 0) {
+		panic("ia64_sn_get_klconfig_addr: Returned error %lx\n", ret_stuff.status);
 	}
-	return(klgraph_addr[cnodeid]);
+	return(ret_stuff.v0);
 }
 
 /*
@@ -597,8 +594,16 @@ static inline int
 sn_change_memprotect(u64 paddr, u64 len, u64 perms, u64 *nasid_array)
 {
 	struct ia64_sal_retval ret_stuff;
-	SAL_CALL(ret_stuff, SN_SAL_MEMPROTECT, paddr, len, nasid_array,
+	int cnodeid;
+	unsigned long irq_flags;
+
+	cnodeid = nasid_to_cnodeid(get_node_number(paddr));
+	spin_lock(&NODEPDA(cnodeid)->bist_lock);
+	local_irq_save(irq_flags);
+	SAL_CALL_NOLOCK(ret_stuff, SN_SAL_MEMPROTECT, paddr, len, nasid_array,
 		 perms, 0, 0, 0);
+	local_irq_restore(irq_flags);
+	spin_unlock(&NODEPDA(cnodeid)->bist_lock);
 	return ret_stuff.status;
 }
 #define SN_MEMPROT_ACCESS_CLASS_0		0x14a080

_