Commit b48fc7bb authored by Dean Nelson's avatar Dean Nelson Committed by Tony Luck

[IA64-SGI] convert some sn SAL_CALLs to ia64_sal_oemcall calls

Convert some sn SAL_CALLs to ia64_sal_oemcall calls so that they can be
called by kernel modules.
Signed-off-by: default avatarDean Nelson <dcn@sgi.com>
Signed-off-by: default avatarTony Luck <tony.luck@intel.com>
parent 9b48b466
...@@ -557,7 +557,8 @@ static inline u64 ...@@ -557,7 +557,8 @@ static inline u64
ia64_sn_partition_serial_get(void) ia64_sn_partition_serial_get(void)
{ {
struct ia64_sal_retval ret_stuff; struct ia64_sal_retval ret_stuff;
SAL_CALL(ret_stuff, SN_SAL_PARTITION_SERIAL_GET, 0, 0, 0, 0, 0, 0, 0); ia64_sal_oemcall_reentrant(&ret_stuff, SN_SAL_PARTITION_SERIAL_GET, 0,
0, 0, 0, 0, 0, 0);
if (ret_stuff.status != 0) if (ret_stuff.status != 0)
return 0; return 0;
return ret_stuff.v0; return ret_stuff.v0;
...@@ -565,11 +566,10 @@ ia64_sn_partition_serial_get(void) ...@@ -565,11 +566,10 @@ ia64_sn_partition_serial_get(void)
static inline u64 static inline u64
sn_partition_serial_number_val(void) { sn_partition_serial_number_val(void) {
if (sn_partition_serial_number) { if (unlikely(sn_partition_serial_number == 0)) {
return(sn_partition_serial_number); sn_partition_serial_number = ia64_sn_partition_serial_get();
} else {
return(sn_partition_serial_number = ia64_sn_partition_serial_get());
} }
return sn_partition_serial_number;
} }
/* /*
...@@ -580,7 +580,7 @@ static inline partid_t ...@@ -580,7 +580,7 @@ static inline partid_t
ia64_sn_sysctl_partition_get(nasid_t nasid) ia64_sn_sysctl_partition_get(nasid_t nasid)
{ {
struct ia64_sal_retval ret_stuff; struct ia64_sal_retval ret_stuff;
SAL_CALL(ret_stuff, SN_SAL_SYSCTL_PARTITION_GET, nasid, ia64_sal_oemcall_nolock(&ret_stuff, SN_SAL_SYSCTL_PARTITION_GET, nasid,
0, 0, 0, 0, 0, 0); 0, 0, 0, 0, 0, 0);
if (ret_stuff.status != 0) if (ret_stuff.status != 0)
return INVALID_PARTID; return INVALID_PARTID;
...@@ -595,11 +595,38 @@ extern partid_t sn_partid; ...@@ -595,11 +595,38 @@ extern partid_t sn_partid;
static inline partid_t static inline partid_t
sn_local_partid(void) { sn_local_partid(void) {
if (sn_partid < 0) { if (unlikely(sn_partid < 0)) {
return (sn_partid = ia64_sn_sysctl_partition_get(cpuid_to_nasid(smp_processor_id()))); sn_partid = ia64_sn_sysctl_partition_get(cpuid_to_nasid(smp_processor_id()));
} else {
return sn_partid;
} }
return sn_partid;
}
/*
* Returns the physical address of the partition's reserved page through
* an iterative number of calls.
*
* On first call, 'cookie' and 'len' should be set to 0, and 'addr'
* set to the nasid of the partition whose reserved page's address is
* being sought.
* On subsequent calls, pass the values, that were passed back on the
* previous call.
*
* While the return status equals SALRET_MORE_PASSES, keep calling
* this function after first copying 'len' bytes starting at 'addr'
* into 'buf'. Once the return status equals SALRET_OK, 'addr' will
* be the physical address of the partition's reserved page. If the
* return status equals neither of these, an error as occurred.
*/
static inline s64
sn_partition_reserved_page_pa(u64 buf, u64 *cookie, u64 *addr, u64 *len)
{
struct ia64_sal_retval rv;
ia64_sal_oemcall_reentrant(&rv, SN_SAL_GET_PARTITION_ADDR, *cookie,
*addr, buf, *len, 0, 0, 0);
*cookie = rv.v0;
*addr = rv.v1;
*len = rv.v2;
return rv.status;
} }
/* /*
...@@ -621,8 +648,8 @@ static inline int ...@@ -621,8 +648,8 @@ static inline int
sn_register_xp_addr_region(u64 paddr, u64 len, int operation) sn_register_xp_addr_region(u64 paddr, u64 len, int operation)
{ {
struct ia64_sal_retval ret_stuff; struct ia64_sal_retval ret_stuff;
SAL_CALL(ret_stuff, SN_SAL_XP_ADDR_REGION, paddr, len, (u64)operation, ia64_sal_oemcall(&ret_stuff, SN_SAL_XP_ADDR_REGION, paddr, len,
0, 0, 0, 0); (u64)operation, 0, 0, 0, 0);
return ret_stuff.status; return ret_stuff.status;
} }
...@@ -646,8 +673,8 @@ sn_register_nofault_code(u64 start_addr, u64 end_addr, u64 return_addr, ...@@ -646,8 +673,8 @@ sn_register_nofault_code(u64 start_addr, u64 end_addr, u64 return_addr,
} else { } else {
call = SN_SAL_NO_FAULT_ZONE_PHYSICAL; call = SN_SAL_NO_FAULT_ZONE_PHYSICAL;
} }
SAL_CALL(ret_stuff, call, start_addr, end_addr, return_addr, (u64)1, ia64_sal_oemcall(&ret_stuff, call, start_addr, end_addr, return_addr,
0, 0, 0); (u64)1, 0, 0, 0);
return ret_stuff.status; return ret_stuff.status;
} }
...@@ -668,8 +695,8 @@ static inline int ...@@ -668,8 +695,8 @@ static inline int
sn_change_coherence(u64 *new_domain, u64 *old_domain) sn_change_coherence(u64 *new_domain, u64 *old_domain)
{ {
struct ia64_sal_retval ret_stuff; struct ia64_sal_retval ret_stuff;
SAL_CALL(ret_stuff, SN_SAL_COHERENCE, new_domain, old_domain, 0, 0, ia64_sal_oemcall(&ret_stuff, SN_SAL_COHERENCE, (u64)new_domain,
0, 0, 0); (u64)old_domain, 0, 0, 0, 0, 0);
return ret_stuff.status; return ret_stuff.status;
} }
...@@ -688,8 +715,8 @@ sn_change_memprotect(u64 paddr, u64 len, u64 perms, u64 *nasid_array) ...@@ -688,8 +715,8 @@ sn_change_memprotect(u64 paddr, u64 len, u64 perms, u64 *nasid_array)
cnodeid = nasid_to_cnodeid(get_node_number(paddr)); cnodeid = nasid_to_cnodeid(get_node_number(paddr));
// spin_lock(&NODEPDA(cnodeid)->bist_lock); // spin_lock(&NODEPDA(cnodeid)->bist_lock);
local_irq_save(irq_flags); local_irq_save(irq_flags);
SAL_CALL_NOLOCK(ret_stuff, SN_SAL_MEMPROTECT, paddr, len, nasid_array, ia64_sal_oemcall_nolock(&ret_stuff, SN_SAL_MEMPROTECT, paddr, len,
perms, 0, 0, 0); (u64)nasid_array, perms, 0, 0, 0);
local_irq_restore(irq_flags); local_irq_restore(irq_flags);
// spin_unlock(&NODEPDA(cnodeid)->bist_lock); // spin_unlock(&NODEPDA(cnodeid)->bist_lock);
return ret_stuff.status; return ret_stuff.status;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment