blob: 536f2bfc3c9375bf7e397434730f1df2f3a7a830 [file] [log] [blame]
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* CMM tests (ESSA)
*
* Copyright (c) 2018 IBM Corp
*
* Authors:
* Janosch Frank <frankja@linux.vnet.ibm.com>
*/
#include <libcflat.h>
#include <bitops.h>
#include <asm/asm-offsets.h>
#include <asm/interrupt.h>
#include <asm/page.h>
#include <asm/cmm.h>
#include <asm/facility.h>
static uint8_t pagebuf[PAGE_SIZE] __attribute__((aligned(PAGE_SIZE)));
extern int diag308_load_reset(u64);
static void test_params(void)
{
report_prefix_push("invalid ORC 8");
expect_pgm_int();
essa(8, (unsigned long)pagebuf);
check_pgm_int_code(PGM_INT_CODE_SPECIFICATION);
report_prefix_pop();
}
static void test_priv(void)
{
report_prefix_push("privileged");
expect_pgm_int();
enter_pstate();
essa(ESSA_GET_STATE, (unsigned long)pagebuf);
check_pgm_int_code(PGM_INT_CODE_PRIVILEGED_OPERATION);
report_prefix_pop();
}
static void test_reset_no_translate(void)
{
const uint64_t mask_no_translate = BIT(63 - 58);
unsigned long state;
if (!test_facility(147)) {
report_prefix_push("no-translate unavailable");
expect_pgm_int();
essa(ESSA_SET_STABLE_NODAT, (unsigned long)pagebuf);
check_pgm_int_code(PGM_INT_CODE_SPECIFICATION);
report_prefix_pop();
return;
}
report_prefix_push("reset no-translate");
essa(ESSA_SET_STABLE_NODAT, (unsigned long)pagebuf);
state = essa(ESSA_GET_STATE, (unsigned long)pagebuf);
report(state & mask_no_translate, "no-translate bit set before reset");
/* Load normal reset - includes subsystem reset */
diag308_load_reset(1);
state = essa(ESSA_GET_STATE, (unsigned long)pagebuf);
report(!(state & mask_no_translate), "no-translate bit unset after reset");
report_prefix_pop();
}
int main(void)
{
bool has_essa = check_essa_available();
report_prefix_push("cmm");
if (!has_essa) {
report_skip("ESSA is not available");
goto done;
}
test_priv();
test_params();
test_reset_no_translate();
done:
report_prefix_pop();
return report_summary();
}