uboot/post/lib_powerpc/cmp.c
<<
>>
Prefs
   1/*
   2 * (C) Copyright 2002
   3 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
   4 *
   5 * SPDX-License-Identifier:     GPL-2.0+
   6 */
   7
   8#include <common.h>
   9
  10/*
  11 * CPU test
  12 * Integer compare instructions:        cmpw, cmplw
  13 *
  14 * To verify these instructions the test runs them with
  15 * different combinations of operands, reads the condition
  16 * register value and compares it with the expected one.
  17 * The test contains a pre-built table
  18 * containing the description of each test case: the instruction,
  19 * the values of the operands, the condition field to save
  20 * the result in and the expected result.
  21 */
  22
  23#include <post.h>
  24#include "cpu_asm.h"
  25
  26#if CONFIG_POST & CONFIG_SYS_POST_CPU
  27
  28extern void cpu_post_exec_12 (ulong *code, ulong *res, ulong op1, ulong op2);
  29
  30static struct cpu_post_cmp_s
  31{
  32    ulong cmd;
  33    ulong op1;
  34    ulong op2;
  35    ulong cr;
  36    ulong res;
  37} cpu_post_cmp_table[] =
  38{
  39    {
  40        OP_CMPW,
  41        123,
  42        123,
  43        2,
  44        0x02
  45    },
  46    {
  47        OP_CMPW,
  48        123,
  49        133,
  50        3,
  51        0x08
  52    },
  53    {
  54        OP_CMPW,
  55        123,
  56        -133,
  57        4,
  58        0x04
  59    },
  60    {
  61        OP_CMPLW,
  62        123,
  63        123,
  64        2,
  65        0x02
  66    },
  67    {
  68        OP_CMPLW,
  69        123,
  70        -133,
  71        3,
  72        0x08
  73    },
  74    {
  75        OP_CMPLW,
  76        123,
  77        113,
  78        4,
  79        0x04
  80    },
  81};
  82static unsigned int cpu_post_cmp_size = ARRAY_SIZE(cpu_post_cmp_table);
  83
  84int cpu_post_test_cmp (void)
  85{
  86    int ret = 0;
  87    unsigned int i;
  88    int flag = disable_interrupts();
  89
  90    for (i = 0; i < cpu_post_cmp_size && ret == 0; i++)
  91    {
  92        struct cpu_post_cmp_s *test = cpu_post_cmp_table + i;
  93        unsigned long code[] =
  94        {
  95            ASM_2C(test->cmd, test->cr, 3, 4),
  96            ASM_MFCR(3),
  97            ASM_BLR
  98        };
  99        ulong res;
 100
 101        cpu_post_exec_12 (code, & res, test->op1, test->op2);
 102
 103        ret = ((res >> (28 - 4 * test->cr)) & 0xe) == test->res ? 0 : -1;
 104
 105        if (ret != 0)
 106        {
 107            post_log ("Error at cmp test %d !\n", i);
 108        }
 109    }
 110
 111    if (flag)
 112        enable_interrupts();
 113
 114    return ret;
 115}
 116
 117#endif
 118