1fa624cc2SJanosch Frank /* SPDX-License-Identifier: GPL-2.0-only */ 242df4291SJanosch Frank /* 342df4291SJanosch Frank * CMM tests (ESSA) 442df4291SJanosch Frank * 542df4291SJanosch Frank * Copyright (c) 2018 IBM Corp 642df4291SJanosch Frank * 742df4291SJanosch Frank * Authors: 842df4291SJanosch Frank * Janosch Frank <frankja@linux.vnet.ibm.com> 942df4291SJanosch Frank */ 1042df4291SJanosch Frank 1142df4291SJanosch Frank #include <libcflat.h> 12*7315fc8aSNico Boehr #include <bitops.h> 1342df4291SJanosch Frank #include <asm/asm-offsets.h> 1442df4291SJanosch Frank #include <asm/interrupt.h> 1542df4291SJanosch Frank #include <asm/page.h> 16e13ab1eaSNico Boehr #include <asm/cmm.h> 17*7315fc8aSNico Boehr #include <asm/facility.h> 1842df4291SJanosch Frank 1942df4291SJanosch Frank static uint8_t pagebuf[PAGE_SIZE] __attribute__((aligned(PAGE_SIZE))); 2042df4291SJanosch Frank 21*7315fc8aSNico Boehr extern int diag308_load_reset(u64); 22*7315fc8aSNico Boehr test_params(void)2342df4291SJanosch Frankstatic void test_params(void) 2442df4291SJanosch Frank { 25e4654a1bSJanosch Frank report_prefix_push("invalid ORC 8"); 2642df4291SJanosch Frank expect_pgm_int(); 2742df4291SJanosch Frank essa(8, (unsigned long)pagebuf); 2842df4291SJanosch Frank check_pgm_int_code(PGM_INT_CODE_SPECIFICATION); 29e4654a1bSJanosch Frank report_prefix_pop(); 3042df4291SJanosch Frank } 3142df4291SJanosch Frank test_priv(void)3242df4291SJanosch Frankstatic void test_priv(void) 3342df4291SJanosch Frank { 34e4654a1bSJanosch Frank report_prefix_push("privileged"); 3542df4291SJanosch Frank expect_pgm_int(); 3642df4291SJanosch Frank enter_pstate(); 37e13ab1eaSNico Boehr essa(ESSA_GET_STATE, (unsigned long)pagebuf); 3842df4291SJanosch Frank check_pgm_int_code(PGM_INT_CODE_PRIVILEGED_OPERATION); 39e4654a1bSJanosch Frank report_prefix_pop(); 4042df4291SJanosch Frank } 4142df4291SJanosch Frank test_reset_no_translate(void)42*7315fc8aSNico Boehrstatic void test_reset_no_translate(void) 43*7315fc8aSNico Boehr { 44*7315fc8aSNico Boehr const uint64_t mask_no_translate = BIT(63 - 58); 45*7315fc8aSNico Boehr unsigned long state; 46*7315fc8aSNico Boehr 47*7315fc8aSNico Boehr if (!test_facility(147)) { 48*7315fc8aSNico Boehr report_prefix_push("no-translate unavailable"); 49*7315fc8aSNico Boehr expect_pgm_int(); 50*7315fc8aSNico Boehr essa(ESSA_SET_STABLE_NODAT, (unsigned long)pagebuf); 51*7315fc8aSNico Boehr check_pgm_int_code(PGM_INT_CODE_SPECIFICATION); 52*7315fc8aSNico Boehr report_prefix_pop(); 53*7315fc8aSNico Boehr return; 54*7315fc8aSNico Boehr } 55*7315fc8aSNico Boehr 56*7315fc8aSNico Boehr report_prefix_push("reset no-translate"); 57*7315fc8aSNico Boehr essa(ESSA_SET_STABLE_NODAT, (unsigned long)pagebuf); 58*7315fc8aSNico Boehr 59*7315fc8aSNico Boehr state = essa(ESSA_GET_STATE, (unsigned long)pagebuf); 60*7315fc8aSNico Boehr report(state & mask_no_translate, "no-translate bit set before reset"); 61*7315fc8aSNico Boehr 62*7315fc8aSNico Boehr /* Load normal reset - includes subsystem reset */ 63*7315fc8aSNico Boehr diag308_load_reset(1); 64*7315fc8aSNico Boehr 65*7315fc8aSNico Boehr state = essa(ESSA_GET_STATE, (unsigned long)pagebuf); 66*7315fc8aSNico Boehr report(!(state & mask_no_translate), "no-translate bit unset after reset"); 67*7315fc8aSNico Boehr 68*7315fc8aSNico Boehr report_prefix_pop(); 69*7315fc8aSNico Boehr } 70*7315fc8aSNico Boehr main(void)7142df4291SJanosch Frankint main(void) 7242df4291SJanosch Frank { 73e13ab1eaSNico Boehr bool has_essa = check_essa_available(); 7442df4291SJanosch Frank 7542df4291SJanosch Frank report_prefix_push("cmm"); 7690016cc5SThomas Huth if (!has_essa) { 7790016cc5SThomas Huth report_skip("ESSA is not available"); 7842df4291SJanosch Frank goto done; 7990016cc5SThomas Huth } 8042df4291SJanosch Frank 8142df4291SJanosch Frank test_priv(); 8242df4291SJanosch Frank test_params(); 83*7315fc8aSNico Boehr test_reset_no_translate(); 8442df4291SJanosch Frank done: 8542df4291SJanosch Frank report_prefix_pop(); 8642df4291SJanosch Frank return report_summary(); 8742df4291SJanosch Frank } 88