blob: f7722b08b5eb82a41fd2f4d0a93361a42d847ccd [file] [log] [blame]
// SPDX-License-Identifier: GPL-2.0
/*
* Copyright 2020 Google Inc.
*/
#include <common.h>
#include <malloc.h>
#include <cros/pattern.h>
#include <cros/vboot.h>
typedef void (*PatternDataGenerator)(uint32_t **ptr, size_t *len);
uint32_t walking_ones_data[] = {
0x00000001, 0x00000002, 0x00000004, 0x00000008,
0x00000010, 0x00000020, 0x00000040, 0x00000080,
0x00000100, 0x00000200, 0x00000400, 0x00000800,
0x00001000, 0x00002000, 0x00004000, 0x00008000,
0x00010000, 0x00020000, 0x00040000, 0x00080000,
0x00100000, 0x00200000, 0x00400000, 0x00800000,
0x01000000, 0x02000000, 0x04000000, 0x08000000,
0x10000000, 0x20000000, 0x40000000, 0x80000000,
0x40000000, 0x20000000, 0x10000000, 0x08000000,
0x04000000, 0x02000000, 0x01000000, 0x00800000,
0x00400000, 0x00200000, 0x00100000, 0x00080000,
0x00040000, 0x00020000, 0x00010000, 0x00008000,
0x00004000, 0x00002000, 0x00001000, 0x00000800,
0x00000400, 0x00000200, 0x00000100, 0x00000080,
0x00000040, 0x00000020, 0x00000010, 0x00000008,
0x00000004, 0x00000002, 0x00000001, 0x00000000
};
static void walking_ones_generator(uint32_t **buf_ret, size_t *len_ret)
{
int len = 64;
uint32_t *buf = malloc(len * sizeof(uint32_t));
for (int i = 0; i < 32; i++) {
buf[i] = 1u << i;
buf[64 - i - 2] = 1u << i;
}
buf[64 - 1] = 0x00000000;
*len_ret = len;
*buf_ret = buf;
}
static uint32_t one_zero_data[] = {0x00000000, 0xffffffff};
static uint32_t zero_data[] = {0x00000000};
static uint32_t one_data[] = {0xffffffff};
static uint32_t five_data[] = {0x55555555};
static uint32_t a_data[] = {0xaaaaaaaa};
static uint32_t five_a_data[] = {0x55555555, 0xaaaaaaaa};
static uint32_t five_a_8_data[] = {
0x5aa5a55a, 0xa55a5aa5, 0xa55a5aa5, 0x5aa5a55a
};
static uint32_t long8b10b_data[] = {0x16161616};
static uint32_t short8b10b_data[] = {0xb5b5b5b5};
static uint32_t checker8b10b_data[] = {0xb5b5b5b5, 0x4a4a4a4a};
static uint32_t five7_data[] = {0x55555557, 0x55575555};
static uint32_t zero2_fd_data[] = {0x00020002, 0xfffdfffd};
static inline void add_pattern(struct list_head *head, const char *name,
const uint32_t *buf, const size_t len)
{
Pattern *pattern = xzalloc(sizeof(*pattern));
pattern->name = name;
pattern->data = buf;
pattern->len = len;
list_add_tail(&pattern->list_node, head);
}
#define ADD_PATTERN_BY_FUNC(head, name) \
do { \
uint32_t *ptr; \
size_t len; \
name##_generator(&ptr, &len); \
add_pattern(&(head), #name, ptr, len); \
free(ptr); \
} while (0)
#define ADD_PATTERN_BY_ARRAY(head, name) \
add_pattern(&(head), #name, name##_data, ARRAY_SIZE(name##_data))
const struct list_head *DiagGetSimpleTestPatterns(void)
{
static struct list_head pattern_list;
if (!pattern_list.next) {
INIT_LIST_HEAD(&pattern_list);
ADD_PATTERN_BY_ARRAY(pattern_list, five_a_8);
}
return &pattern_list;
}
const struct list_head *DiagGetTestPatterns(void)
{
static struct list_head pattern_list;
if (!pattern_list.next) {
INIT_LIST_HEAD(&pattern_list);
ADD_PATTERN_BY_FUNC(pattern_list, walking_ones);
ADD_PATTERN_BY_ARRAY(pattern_list, one_zero);
ADD_PATTERN_BY_ARRAY(pattern_list, zero);
ADD_PATTERN_BY_ARRAY(pattern_list, one);
ADD_PATTERN_BY_ARRAY(pattern_list, five);
ADD_PATTERN_BY_ARRAY(pattern_list, a);
ADD_PATTERN_BY_ARRAY(pattern_list, five_a);
ADD_PATTERN_BY_ARRAY(pattern_list, five_a_8);
ADD_PATTERN_BY_ARRAY(pattern_list, long8b10b);
ADD_PATTERN_BY_ARRAY(pattern_list, short8b10b);
ADD_PATTERN_BY_ARRAY(pattern_list, checker8b10b);
ADD_PATTERN_BY_ARRAY(pattern_list, five7);
ADD_PATTERN_BY_ARRAY(pattern_list, zero2_fd);
ADD_PATTERN_BY_ARRAY(pattern_list, one_zero);
}
return &pattern_list;
}