/*
 * Copyright (c) 2015 Google, Inc
 * Written by Simon Glass <sjg@chromium.org>
 *
 * SPDX-License-Identifier:	GPL-2.0+
 */

#include <common.h>
#include <command.h>
#include <cpu.h>
#include <dm.h>
#include <errno.h>

static const char *cpu_feature_name[CPU_FEAT_COUNT] = {
	"L1 cache",
	"MMU",
};

static int print_cpu_list(bool detail)
{
	struct udevice *dev;
	struct uclass *uc;
	char buf[100];
	int ret;

	ret = uclass_get(UCLASS_CPU, &uc);
	if (ret) {
		printf("Cannot find CPU uclass\n");
		return ret;
	}
	uclass_foreach_dev(dev, uc) {
		struct cpu_platdata *plat = dev_get_parent_platdata(dev);
		struct cpu_info info;
		bool first;
		int i;

		ret = cpu_get_desc(dev, buf, sizeof(buf));
		printf("%3d: %-10s %s\n", dev->seq, dev->name,
		       ret ? "<no description>" : buf);
		if (!detail)
			continue;
		ret = cpu_get_info(dev, &info);
		if (ret) {
			printf("\t(no detail available");
			if (ret != -ENOSYS)
				printf(": err=%d\n", ret);
			printf(")\n");
			continue;
		}
		printf("\tID = %d, freq = ", plat->cpu_id);
		print_freq(info.cpu_freq, "");
		first = true;
		for (i = 0; i < CPU_FEAT_COUNT; i++) {
			if (info.features & (1 << i)) {
				printf("%s%s", first ? ": " : ", ",
				       cpu_feature_name[i]);
				first = false;
			}
		}
		printf("\n");
	}

	return 0;
}

static int do_cpu_list(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
{
	if (print_cpu_list(false))
		return CMD_RET_FAILURE;

	return 0;
}

static int do_cpu_detail(cmd_tbl_t *cmdtp, int flag, int argc,
			 char *const argv[])
{
	if (print_cpu_list(true))
		return CMD_RET_FAILURE;

	return 0;
}

static cmd_tbl_t cmd_cpu_sub[] = {
	U_BOOT_CMD_MKENT(list, 2, 1, do_cpu_list, "", ""),
	U_BOOT_CMD_MKENT(detail, 4, 0, do_cpu_detail, "", ""),
};

/*
 * Process a cpu sub-command
 */
static int do_cpu(cmd_tbl_t *cmdtp, int flag, int argc,
		       char * const argv[])
{
	cmd_tbl_t *c = NULL;

	/* Strip off leading 'cpu' command argument */
	argc--;
	argv++;

	if (argc)
		c = find_cmd_tbl(argv[0], cmd_cpu_sub, ARRAY_SIZE(cmd_cpu_sub));

	if (c)
		return c->cmd(cmdtp, flag, argc, argv);
	else
		return CMD_RET_USAGE;
}

U_BOOT_CMD(
	cpu, 2, 1, do_cpu,
	"display information about CPUs",
	"list	- list available CPUs\n"
	"cpu detail	- show CPU detail"
);
