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
test_sclp_missing_sief2_implications(void)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
test_sclp_features_fmt4(void)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
test_sclp_features_fmt2(void)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
test_sclp_features(void)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
main(void)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