1fa624cc2SJanosch Frank /* SPDX-License-Identifier: GPL-2.0-only */ 29c54b326SChristian Borntraeger /* 39c54b326SChristian Borntraeger * Test the known dependencies for facilities 49c54b326SChristian Borntraeger * 521f5f676SJanosch Frank * Copyright 2019, 2021 IBM Corp. 69c54b326SChristian Borntraeger * 79c54b326SChristian Borntraeger * Authors: 89c54b326SChristian Borntraeger * Christian Borntraeger <borntraeger@de.ibm.com> 921f5f676SJanosch Frank * Janosch Frank <frankja@linux.ibm.com> 109c54b326SChristian Borntraeger */ 119c54b326SChristian Borntraeger 129c54b326SChristian Borntraeger #include <asm/facility.h> 13*f489dfa5SClaudio Imbrenda #include <hardware.h> 1421f5f676SJanosch Frank #include <sclp.h> 1521f5f676SJanosch Frank #include <uv.h> 1621f5f676SJanosch Frank #include <asm/uv.h> 1721f5f676SJanosch Frank 1821f5f676SJanosch Frank static void test_sclp_missing_sief2_implications(void) 1921f5f676SJanosch Frank { 2021f5f676SJanosch Frank /* Virtualization related facilities */ 2121f5f676SJanosch Frank report(!sclp_facilities.has_64bscao, "!64bscao"); 2221f5f676SJanosch Frank report(!sclp_facilities.has_pfmfi, "!pfmfi"); 2321f5f676SJanosch Frank report(!sclp_facilities.has_gsls, "!gsls"); 2421f5f676SJanosch Frank report(!sclp_facilities.has_cmma, "!cmma"); 2521f5f676SJanosch Frank report(!sclp_facilities.has_esca, "!esca"); 2621f5f676SJanosch Frank report(!sclp_facilities.has_kss, "!kss"); 2721f5f676SJanosch Frank report(!sclp_facilities.has_ibs, "!ibs"); 2821f5f676SJanosch Frank 2921f5f676SJanosch Frank /* Virtualization related facilities reported via CPU entries */ 3021f5f676SJanosch Frank report(!sclp_facilities.has_sigpif, "!sigpif"); 3121f5f676SJanosch Frank report(!sclp_facilities.has_sief2, "!sief2"); 3221f5f676SJanosch Frank report(!sclp_facilities.has_skeyi, "!skeyi"); 3321f5f676SJanosch Frank report(!sclp_facilities.has_siif, "!siif"); 3421f5f676SJanosch Frank report(!sclp_facilities.has_cei, "!cei"); 3521f5f676SJanosch Frank report(!sclp_facilities.has_ib, "!ib"); 3621f5f676SJanosch Frank } 3721f5f676SJanosch Frank 3821f5f676SJanosch Frank static void test_sclp_features_fmt4(void) 3921f5f676SJanosch Frank { 4021f5f676SJanosch Frank /* 4121f5f676SJanosch Frank * STFLE facilities are handled by the Ultravisor but SCLP 4221f5f676SJanosch Frank * facilities are advertised by the hypervisor. 4321f5f676SJanosch Frank */ 4421f5f676SJanosch Frank report_prefix_push("PV guest implies"); 4521f5f676SJanosch Frank 4621f5f676SJanosch Frank /* General facilities */ 4721f5f676SJanosch Frank report(!sclp_facilities.has_diag318, "!diag318"); 4821f5f676SJanosch Frank 4921f5f676SJanosch Frank /* 5021f5f676SJanosch Frank * Virtualization related facilities, all of which are 5121f5f676SJanosch Frank * unavailable because there's no virtualization support in a 5221f5f676SJanosch Frank * protected guest. 5321f5f676SJanosch Frank */ 5421f5f676SJanosch Frank test_sclp_missing_sief2_implications(); 5521f5f676SJanosch Frank 5621f5f676SJanosch Frank report_prefix_pop(); 5721f5f676SJanosch Frank } 5821f5f676SJanosch Frank 5921f5f676SJanosch Frank static void test_sclp_features_fmt2(void) 6021f5f676SJanosch Frank { 6121f5f676SJanosch Frank if (sclp_facilities.has_sief2) 6221f5f676SJanosch Frank return; 6321f5f676SJanosch Frank 6421f5f676SJanosch Frank report_prefix_push("!sief2 implies"); 6521f5f676SJanosch Frank test_sclp_missing_sief2_implications(); 6621f5f676SJanosch Frank report_prefix_pop(); 6721f5f676SJanosch Frank } 6821f5f676SJanosch Frank 6921f5f676SJanosch Frank static void test_sclp_features(void) 7021f5f676SJanosch Frank { 7121f5f676SJanosch Frank report_prefix_push("sclp"); 7221f5f676SJanosch Frank 7321f5f676SJanosch Frank if (uv_os_is_guest()) 7421f5f676SJanosch Frank test_sclp_features_fmt4(); 7521f5f676SJanosch Frank else 7621f5f676SJanosch Frank test_sclp_features_fmt2(); 7721f5f676SJanosch Frank 7821f5f676SJanosch Frank report_prefix_pop(); 7921f5f676SJanosch Frank } 809c54b326SChristian Borntraeger 8159b243dcSThomas Huth static struct { 8259b243dcSThomas Huth int facility; 8359b243dcSThomas Huth int implied; 8459b243dcSThomas Huth bool expected_tcg_fail; 8559b243dcSThomas Huth } dep[] = { 869c54b326SChristian Borntraeger /* from SA22-7832-11 4-98 facility indications */ 879c54b326SChristian Borntraeger { 4, 3 }, 889c54b326SChristian Borntraeger { 5, 3 }, 899c54b326SChristian Borntraeger { 5, 4 }, 909c54b326SChristian Borntraeger { 19, 18 }, 9159b243dcSThomas Huth { 37, 42, true }, /* TCG does not have DFP and won't get it soon */ 929c54b326SChristian Borntraeger { 43, 42 }, 939c54b326SChristian Borntraeger { 73, 49 }, 949c54b326SChristian Borntraeger { 134, 129 }, 959c54b326SChristian Borntraeger { 135, 129 }, 969c54b326SChristian Borntraeger { 139, 25 }, 979c54b326SChristian Borntraeger { 139, 28 }, 989c54b326SChristian Borntraeger { 146, 76 }, 999c54b326SChristian Borntraeger /* indirectly documented in description */ 1009c54b326SChristian Borntraeger { 78, 8 }, /* EDAT */ 1019c54b326SChristian Borntraeger /* new dependencies from gen15 */ 1029c54b326SChristian Borntraeger { 61, 45 }, 1039c54b326SChristian Borntraeger { 148, 129 }, 1049c54b326SChristian Borntraeger { 148, 135 }, 1059c54b326SChristian Borntraeger { 152, 129 }, 1069c54b326SChristian Borntraeger { 152, 134 }, 1079c54b326SChristian Borntraeger { 155, 76 }, 1089c54b326SChristian Borntraeger { 155, 77 }, 1099c54b326SChristian Borntraeger }; 1109c54b326SChristian Borntraeger 1119c54b326SChristian Borntraeger int main(void) 1129c54b326SChristian Borntraeger { 1139c54b326SChristian Borntraeger int i; 1149c54b326SChristian Borntraeger 1159c54b326SChristian Borntraeger report_prefix_push("cpumodel"); 1169c54b326SChristian Borntraeger 1179c54b326SChristian Borntraeger report_prefix_push("dependency"); 1189c54b326SChristian Borntraeger for (i = 0; i < ARRAY_SIZE(dep); i++) { 1194bbf547dSChristian Borntraeger report_prefix_pushf("%d implies %d", dep[i].facility, dep[i].implied); 12059b243dcSThomas Huth if (test_facility(dep[i].facility)) { 121*f489dfa5SClaudio Imbrenda report_xfail(dep[i].expected_tcg_fail && host_is_tcg(), 12259b243dcSThomas Huth test_facility(dep[i].implied), 1234bbf547dSChristian Borntraeger "implication not correct"); 1249c54b326SChristian Borntraeger } else { 12559b243dcSThomas Huth report_skip("facility %d not present", dep[i].facility); 1269c54b326SChristian Borntraeger } 1274bbf547dSChristian Borntraeger report_prefix_pop(); 1289c54b326SChristian Borntraeger } 1299c54b326SChristian Borntraeger report_prefix_pop(); 1309c54b326SChristian Borntraeger 13121f5f676SJanosch Frank test_sclp_features(); 13221f5f676SJanosch Frank 1339c54b326SChristian Borntraeger report_prefix_pop(); 1349c54b326SChristian Borntraeger return report_summary(); 1359c54b326SChristian Borntraeger } 136