uboot/cmd/mp.c
<<
>>
Prefs
   1/*
   2 * Copyright 2008-2009 Freescale Semiconductor, Inc.
   3 *
   4 * SPDX-License-Identifier:     GPL-2.0+
   5 */
   6
   7#include <common.h>
   8#include <command.h>
   9
  10static int cpu_status_all(void)
  11{
  12        unsigned long cpuid;
  13
  14        for (cpuid = 0; ; cpuid++) {
  15                if (!is_core_valid(cpuid)) {
  16                        if (cpuid == 0) {
  17                                printf("Core num: %lu is not valid\n", cpuid);
  18                                return 1;
  19                        }
  20                        break;
  21                }
  22                cpu_status(cpuid);
  23        }
  24
  25        return 0;
  26}
  27
  28static int
  29cpu_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  30{
  31        unsigned long cpuid;
  32
  33        if (argc == 2 && strncmp(argv[1], "status", 6) == 0)
  34                  return cpu_status_all();
  35
  36        if (argc < 3)
  37                return CMD_RET_USAGE;
  38
  39        cpuid = simple_strtoul(argv[1], NULL, 10);
  40        if (!is_core_valid(cpuid)) {
  41                printf ("Core num: %lu is not valid\n", cpuid);
  42                return 1;
  43        }
  44
  45
  46        if (argc == 3) {
  47                if (strncmp(argv[2], "reset", 5) == 0)
  48                        cpu_reset(cpuid);
  49                else if (strncmp(argv[2], "status", 6) == 0)
  50                        cpu_status(cpuid);
  51                else if (strncmp(argv[2], "disable", 7) == 0)
  52                        return cpu_disable(cpuid);
  53                else
  54                        return CMD_RET_USAGE;
  55
  56                return 0;
  57        }
  58
  59        /* 4 or greater, make sure its release */
  60        if (strncmp(argv[2], "release", 7) != 0)
  61                return CMD_RET_USAGE;
  62
  63        if (cpu_release(cpuid, argc - 3, argv + 3))
  64                return CMD_RET_USAGE;
  65
  66        return 0;
  67}
  68
  69#ifdef CONFIG_SYS_LONGHELP
  70static char cpu_help_text[] =
  71            "<num> reset                 - Reset cpu <num>\n"
  72        "cpu status                      - Status of all cpus\n"
  73        "cpu <num> status                - Status of cpu <num>\n"
  74        "cpu <num> disable               - Disable cpu <num>\n"
  75        "cpu <num> release <addr> [args] - Release cpu <num> at <addr> with [args]"
  76#ifdef CONFIG_PPC
  77        "\n"
  78        "                         [args] : <pir> <r3> <r6>\n" \
  79        "                                   pir - processor id (if writeable)\n" \
  80        "                                    r3 - value for gpr 3\n" \
  81        "                                    r6 - value for gpr 6\n" \
  82        "\n" \
  83        "     Use '-' for any arg if you want the default value.\n" \
  84        "     Default for r3 is <num> and r6 is 0\n" \
  85        "\n" \
  86        "     When cpu <num> is released r4 and r5 = 0.\n" \
  87        "     r7 will contain the size of the initial mapped area"
  88#endif
  89        "";
  90#endif
  91
  92U_BOOT_CMD(
  93        cpu, CONFIG_SYS_MAXARGS, 1, cpu_cmd,
  94        "Multiprocessor CPU boot manipulation and release", cpu_help_text
  95);
  96