diff options
Diffstat (limited to 'drivers/misc/sgi-xp/xp_uv.c')
| -rw-r--r-- | drivers/misc/sgi-xp/xp_uv.c | 70 |
1 files changed, 68 insertions, 2 deletions
diff --git a/drivers/misc/sgi-xp/xp_uv.c b/drivers/misc/sgi-xp/xp_uv.c index d9f7ce2510bc..d238576b26fa 100644 --- a/drivers/misc/sgi-xp/xp_uv.c +++ b/drivers/misc/sgi-xp/xp_uv.c | |||
| @@ -15,6 +15,11 @@ | |||
| 15 | 15 | ||
| 16 | #include <linux/device.h> | 16 | #include <linux/device.h> |
| 17 | #include <asm/uv/uv_hub.h> | 17 | #include <asm/uv/uv_hub.h> |
| 18 | #if defined CONFIG_X86_64 | ||
| 19 | #include <asm/uv/bios.h> | ||
| 20 | #elif defined CONFIG_IA64_GENERIC || defined CONFIG_IA64_SGI_UV | ||
| 21 | #include <asm/sn/sn_sal.h> | ||
| 22 | #endif | ||
| 18 | #include "../sgi-gru/grukservices.h" | 23 | #include "../sgi-gru/grukservices.h" |
| 19 | #include "xp.h" | 24 | #include "xp.h" |
| 20 | 25 | ||
| @@ -49,18 +54,79 @@ xp_cpu_to_nasid_uv(int cpuid) | |||
| 49 | return UV_PNODE_TO_NASID(uv_cpu_to_pnode(cpuid)); | 54 | return UV_PNODE_TO_NASID(uv_cpu_to_pnode(cpuid)); |
| 50 | } | 55 | } |
| 51 | 56 | ||
| 57 | static enum xp_retval | ||
| 58 | xp_expand_memprotect_uv(unsigned long phys_addr, unsigned long size) | ||
| 59 | { | ||
| 60 | int ret; | ||
| 61 | |||
| 62 | #if defined CONFIG_X86_64 | ||
| 63 | ret = uv_bios_change_memprotect(phys_addr, size, UV_MEMPROT_ALLOW_RW); | ||
| 64 | if (ret != BIOS_STATUS_SUCCESS) { | ||
| 65 | dev_err(xp, "uv_bios_change_memprotect(,, " | ||
| 66 | "UV_MEMPROT_ALLOW_RW) failed, ret=%d\n", ret); | ||
| 67 | return xpBiosError; | ||
| 68 | } | ||
| 69 | |||
| 70 | #elif defined CONFIG_IA64_GENERIC || defined CONFIG_IA64_SGI_UV | ||
| 71 | u64 nasid_array; | ||
| 72 | |||
| 73 | ret = sn_change_memprotect(phys_addr, size, SN_MEMPROT_ACCESS_CLASS_1, | ||
| 74 | &nasid_array); | ||
| 75 | if (ret != 0) { | ||
| 76 | dev_err(xp, "sn_change_memprotect(,, " | ||
| 77 | "SN_MEMPROT_ACCESS_CLASS_1,) failed ret=%d\n", ret); | ||
| 78 | return xpSalError; | ||
| 79 | } | ||
| 80 | #else | ||
| 81 | #error not a supported configuration | ||
| 82 | #endif | ||
| 83 | return xpSuccess; | ||
| 84 | } | ||
| 85 | |||
| 86 | static enum xp_retval | ||
| 87 | xp_restrict_memprotect_uv(unsigned long phys_addr, unsigned long size) | ||
| 88 | { | ||
| 89 | int ret; | ||
| 90 | |||
| 91 | #if defined CONFIG_X86_64 | ||
| 92 | ret = uv_bios_change_memprotect(phys_addr, size, | ||
| 93 | UV_MEMPROT_RESTRICT_ACCESS); | ||
| 94 | if (ret != BIOS_STATUS_SUCCESS) { | ||
| 95 | dev_err(xp, "uv_bios_change_memprotect(,, " | ||
| 96 | "UV_MEMPROT_RESTRICT_ACCESS) failed, ret=%d\n", ret); | ||
| 97 | return xpBiosError; | ||
| 98 | } | ||
| 99 | |||
| 100 | #elif defined CONFIG_IA64_GENERIC || defined CONFIG_IA64_SGI_UV | ||
| 101 | u64 nasid_array; | ||
| 102 | |||
| 103 | ret = sn_change_memprotect(phys_addr, size, SN_MEMPROT_ACCESS_CLASS_0, | ||
| 104 | &nasid_array); | ||
| 105 | if (ret != 0) { | ||
| 106 | dev_err(xp, "sn_change_memprotect(,, " | ||
| 107 | "SN_MEMPROT_ACCESS_CLASS_0,) failed ret=%d\n", ret); | ||
| 108 | return xpSalError; | ||
| 109 | } | ||
| 110 | #else | ||
| 111 | #error not a supported configuration | ||
| 112 | #endif | ||
| 113 | return xpSuccess; | ||
| 114 | } | ||
| 115 | |||
| 52 | enum xp_retval | 116 | enum xp_retval |
| 53 | xp_init_uv(void) | 117 | xp_init_uv(void) |
| 54 | { | 118 | { |
| 55 | BUG_ON(!is_uv()); | 119 | BUG_ON(!is_uv()); |
| 56 | 120 | ||
| 57 | xp_max_npartitions = XP_MAX_NPARTITIONS_UV; | 121 | xp_max_npartitions = XP_MAX_NPARTITIONS_UV; |
| 58 | xp_partition_id = 0; /* !!! not correct value */ | 122 | xp_partition_id = sn_partition_id; |
| 59 | xp_region_size = 0; /* !!! not correct value */ | 123 | xp_region_size = sn_region_size; |
| 60 | 124 | ||
| 61 | xp_pa = xp_pa_uv; | 125 | xp_pa = xp_pa_uv; |
| 62 | xp_remote_memcpy = xp_remote_memcpy_uv; | 126 | xp_remote_memcpy = xp_remote_memcpy_uv; |
| 63 | xp_cpu_to_nasid = xp_cpu_to_nasid_uv; | 127 | xp_cpu_to_nasid = xp_cpu_to_nasid_uv; |
| 128 | xp_expand_memprotect = xp_expand_memprotect_uv; | ||
| 129 | xp_restrict_memprotect = xp_restrict_memprotect_uv; | ||
| 64 | 130 | ||
| 65 | return xpSuccess; | 131 | return xpSuccess; |
| 66 | } | 132 | } |
