blob: 53405e8a52abf45cc5c7b9a880e860951732513e [file] [log] [blame]
Michael Ellerman2fae0d72013-08-06 17:42:36 +10001/*
2 * Copyright 2013, Michael Ellerman, IBM Corp.
3 * Licensed under GPLv2.
4 */
5
6#ifndef _SELFTESTS_POWERPC_UTILS_H
7#define _SELFTESTS_POWERPC_UTILS_H
8
Chris Smart438517e2016-05-02 13:51:38 +10009#define __cacheline_aligned __attribute__((aligned(128)))
10
Michael Ellerman2fae0d72013-08-06 17:42:36 +100011#include <stdint.h>
12#include <stdbool.h>
Michael Ellermanede8ef32015-11-24 13:05:39 +110013#include <linux/auxvec.h>
Rashmica Gupta2d59b3b2015-12-23 16:49:50 +110014#include "reg.h"
Michael Ellerman2fae0d72013-08-06 17:42:36 +100015
16/* Avoid headaches with PRI?64 - just use %ll? always */
17typedef unsigned long long u64;
18typedef signed long long s64;
19
20/* Just for familiarity */
21typedef uint32_t u32;
Greg Kurz58dae822015-02-23 16:14:44 +010022typedef uint16_t u16;
Michael Ellerman2fae0d72013-08-06 17:42:36 +100023typedef uint8_t u8;
24
Cyril Bur0886c6d2016-09-23 16:18:17 +100025void test_harness_set_timeout(uint64_t time);
Michael Ellerman2fae0d72013-08-06 17:42:36 +100026int test_harness(int (test_function)(void), char *name);
Sam bobroff2b03fc12015-04-10 14:16:48 +100027extern void *get_auxv_entry(int type);
Michael Ellermand1301af2015-12-16 18:59:31 +110028int pick_online_cpu(void);
Michael Ellerman2fae0d72013-08-06 17:42:36 +100029
Michael Ellerman24af8c52016-07-11 15:25:18 +100030static inline bool have_hwcap(unsigned long ftr)
31{
32 return ((unsigned long)get_auxv_entry(AT_HWCAP) & ftr) == ftr;
33}
34
Cyril Bur96c44702016-09-23 16:18:07 +100035#ifdef AT_HWCAP2
Michael Ellermanede8ef32015-11-24 13:05:39 +110036static inline bool have_hwcap2(unsigned long ftr2)
37{
38 return ((unsigned long)get_auxv_entry(AT_HWCAP2) & ftr2) == ftr2;
39}
Cyril Bur96c44702016-09-23 16:18:07 +100040#else
41static inline bool have_hwcap2(unsigned long ftr2)
42{
43 return false;
44}
45#endif
Michael Ellermanede8ef32015-11-24 13:05:39 +110046
Michael Ellerman2fae0d72013-08-06 17:42:36 +100047/* Yes, this is evil */
48#define FAIL_IF(x) \
49do { \
50 if ((x)) { \
51 fprintf(stderr, \
52 "[FAIL] Test FAILED on line %d\n", __LINE__); \
53 return 1; \
54 } \
55} while (0)
56
Michael Ellerman33b48192014-06-10 22:23:09 +100057/* The test harness uses this, yes it's gross */
58#define MAGIC_SKIP_RETURN_VALUE 99
59
60#define SKIP_IF(x) \
61do { \
62 if ((x)) { \
63 fprintf(stderr, \
64 "[SKIP] Test skipped on line %d\n", __LINE__); \
65 return MAGIC_SKIP_RETURN_VALUE; \
66 } \
67} while (0)
68
Michael Ellerman22d651d2014-01-21 15:22:17 +110069#define _str(s) #s
70#define str(s) _str(s)
71
Chris Smart438517e2016-05-02 13:51:38 +100072/* POWER9 feature */
73#ifndef PPC_FEATURE2_ARCH_3_00
74#define PPC_FEATURE2_ARCH_3_00 0x00800000
75#endif
76
Michael Ellerman2fae0d72013-08-06 17:42:36 +100077#endif /* _SELFTESTS_POWERPC_UTILS_H */