diff options
| -rw-r--r-- | arch/powerpc/include/asm/prom.h | 5 | ||||
| -rw-r--r-- | arch/powerpc/kernel/prom_init.c | 34 |
2 files changed, 37 insertions, 2 deletions
diff --git a/arch/powerpc/include/asm/prom.h b/arch/powerpc/include/asm/prom.h index 35c00d7a0cf8..825bd5998701 100644 --- a/arch/powerpc/include/asm/prom.h +++ b/arch/powerpc/include/asm/prom.h | |||
| @@ -159,7 +159,10 @@ struct of_drconf_cell { | |||
| 159 | #define OV5_PFO_HW_842 0x1140 /* PFO Compression Accelerator */ | 159 | #define OV5_PFO_HW_842 0x1140 /* PFO Compression Accelerator */ |
| 160 | #define OV5_PFO_HW_ENCR 0x1120 /* PFO Encryption Accelerator */ | 160 | #define OV5_PFO_HW_ENCR 0x1120 /* PFO Encryption Accelerator */ |
| 161 | #define OV5_SUB_PROCESSORS 0x1501 /* 1,2,or 4 Sub-Processors supported */ | 161 | #define OV5_SUB_PROCESSORS 0x1501 /* 1,2,or 4 Sub-Processors supported */ |
| 162 | #define OV5_XIVE_EXPLOIT 0x1701 /* XIVE exploitation supported */ | 162 | #define OV5_XIVE_SUPPORT 0x17C0 /* XIVE Exploitation Support Mask */ |
| 163 | #define OV5_XIVE_LEGACY 0x1700 /* XIVE legacy mode Only */ | ||
| 164 | #define OV5_XIVE_EXPLOIT 0x1740 /* XIVE exploitation mode Only */ | ||
| 165 | #define OV5_XIVE_EITHER 0x1780 /* XIVE legacy or exploitation mode */ | ||
| 163 | /* MMU Base Architecture */ | 166 | /* MMU Base Architecture */ |
| 164 | #define OV5_MMU_SUPPORT 0x18C0 /* MMU Mode Support Mask */ | 167 | #define OV5_MMU_SUPPORT 0x18C0 /* MMU Mode Support Mask */ |
| 165 | #define OV5_MMU_HASH 0x1800 /* Hash MMU Only */ | 168 | #define OV5_MMU_HASH 0x1800 /* Hash MMU Only */ |
diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c index 613f79f03877..02190e90c7ae 100644 --- a/arch/powerpc/kernel/prom_init.c +++ b/arch/powerpc/kernel/prom_init.c | |||
| @@ -177,6 +177,7 @@ struct platform_support { | |||
| 177 | bool hash_mmu; | 177 | bool hash_mmu; |
| 178 | bool radix_mmu; | 178 | bool radix_mmu; |
| 179 | bool radix_gtse; | 179 | bool radix_gtse; |
| 180 | bool xive; | ||
| 180 | }; | 181 | }; |
| 181 | 182 | ||
| 182 | /* Platforms codes are now obsolete in the kernel. Now only used within this | 183 | /* Platforms codes are now obsolete in the kernel. Now only used within this |
| @@ -1041,6 +1042,27 @@ static void __init prom_parse_mmu_model(u8 val, | |||
| 1041 | } | 1042 | } |
| 1042 | } | 1043 | } |
| 1043 | 1044 | ||
| 1045 | static void __init prom_parse_xive_model(u8 val, | ||
| 1046 | struct platform_support *support) | ||
| 1047 | { | ||
| 1048 | switch (val) { | ||
| 1049 | case OV5_FEAT(OV5_XIVE_EITHER): /* Either Available */ | ||
| 1050 | prom_debug("XIVE - either mode supported\n"); | ||
| 1051 | support->xive = true; | ||
| 1052 | break; | ||
| 1053 | case OV5_FEAT(OV5_XIVE_EXPLOIT): /* Only Exploitation mode */ | ||
| 1054 | prom_debug("XIVE - exploitation mode supported\n"); | ||
| 1055 | support->xive = true; | ||
| 1056 | break; | ||
| 1057 | case OV5_FEAT(OV5_XIVE_LEGACY): /* Only Legacy mode */ | ||
| 1058 | prom_debug("XIVE - legacy mode supported\n"); | ||
| 1059 | break; | ||
| 1060 | default: | ||
| 1061 | prom_debug("Unknown xive support option: 0x%x\n", val); | ||
| 1062 | break; | ||
| 1063 | } | ||
| 1064 | } | ||
| 1065 | |||
| 1044 | static void __init prom_parse_platform_support(u8 index, u8 val, | 1066 | static void __init prom_parse_platform_support(u8 index, u8 val, |
| 1045 | struct platform_support *support) | 1067 | struct platform_support *support) |
| 1046 | { | 1068 | { |
| @@ -1054,6 +1076,10 @@ static void __init prom_parse_platform_support(u8 index, u8 val, | |||
| 1054 | support->radix_gtse = true; | 1076 | support->radix_gtse = true; |
| 1055 | } | 1077 | } |
| 1056 | break; | 1078 | break; |
| 1079 | case OV5_INDX(OV5_XIVE_SUPPORT): /* Interrupt mode */ | ||
| 1080 | prom_parse_xive_model(val & OV5_FEAT(OV5_XIVE_SUPPORT), | ||
| 1081 | support); | ||
| 1082 | break; | ||
| 1057 | } | 1083 | } |
| 1058 | } | 1084 | } |
| 1059 | 1085 | ||
| @@ -1062,7 +1088,8 @@ static void __init prom_check_platform_support(void) | |||
| 1062 | struct platform_support supported = { | 1088 | struct platform_support supported = { |
| 1063 | .hash_mmu = false, | 1089 | .hash_mmu = false, |
| 1064 | .radix_mmu = false, | 1090 | .radix_mmu = false, |
| 1065 | .radix_gtse = false | 1091 | .radix_gtse = false, |
| 1092 | .xive = false | ||
| 1066 | }; | 1093 | }; |
| 1067 | int prop_len = prom_getproplen(prom.chosen, | 1094 | int prop_len = prom_getproplen(prom.chosen, |
| 1068 | "ibm,arch-vec-5-platform-support"); | 1095 | "ibm,arch-vec-5-platform-support"); |
| @@ -1095,6 +1122,11 @@ static void __init prom_check_platform_support(void) | |||
| 1095 | /* We're probably on a legacy hypervisor */ | 1122 | /* We're probably on a legacy hypervisor */ |
| 1096 | prom_debug("Assuming legacy hash support\n"); | 1123 | prom_debug("Assuming legacy hash support\n"); |
| 1097 | } | 1124 | } |
| 1125 | |||
| 1126 | if (supported.xive) { | ||
| 1127 | prom_debug("Asking for XIVE\n"); | ||
| 1128 | ibm_architecture_vec.vec5.intarch = OV5_FEAT(OV5_XIVE_EXPLOIT); | ||
| 1129 | } | ||
| 1098 | } | 1130 | } |
| 1099 | 1131 | ||
| 1100 | static void __init prom_send_capabilities(void) | 1132 | static void __init prom_send_capabilities(void) |
