1145519Sdarrenr// SPDX-License-Identifier: GPL-2.0 2145510Sdarrenr/* 322514Sdarrenr * Intel PMC command 453024Sguido * 522514Sdarrenr * Copyright 2019 Google LLC 680486Sdarrenr */ 7145510Sdarrenr 822514Sdarrenr#include <common.h> 931183Speter#include <command.h> 1031183Speter#include <dm.h> 11255332Scy#include <power/acpi_pmc.h> 1222514Sdarrenr 1322514Sdarrenrstatic int get_pmc_dev(struct udevice **devp) 1422514Sdarrenr{ 1522514Sdarrenr struct udevice *dev; 1622514Sdarrenr int ret; 1722514Sdarrenr 1822514Sdarrenr ret = uclass_first_device_err(UCLASS_ACPI_PMC, &dev); 1922514Sdarrenr if (ret) { 2022514Sdarrenr printf("Could not find device (err=%d)\n", ret); 2122514Sdarrenr return ret; 2222514Sdarrenr } 2322514Sdarrenr ret = pmc_init(dev); 2422514Sdarrenr if (ret) { 2522514Sdarrenr printf("Could not init device (err=%d)\n", ret); 2622514Sdarrenr return ret; 2722514Sdarrenr } 2822514Sdarrenr *devp = dev; 2922514Sdarrenr 3022514Sdarrenr return 0; 3122514Sdarrenr} 3222514Sdarrenr 3322514Sdarrenrstatic int do_pmc_init(struct cmd_tbl *cmdtp, int flag, int argc, 3422514Sdarrenr char *const argv[]) 3522514Sdarrenr{ 3622514Sdarrenr struct udevice *dev; 3722514Sdarrenr int ret; 3822514Sdarrenr 3922514Sdarrenr ret = get_pmc_dev(&dev); 4022514Sdarrenr if (ret) 4122514Sdarrenr return CMD_RET_FAILURE; 4222514Sdarrenr 4322514Sdarrenr return 0; 4422514Sdarrenr} 4522514Sdarrenr 4622514Sdarrenrstatic int do_pmc_info(struct cmd_tbl *cmdtp, int flag, int argc, 4722514Sdarrenr char *const argv[]) 4831183Speter{ 4922514Sdarrenr struct udevice *dev; 5022514Sdarrenr int ret; 5124583Sdarrenr 5222514Sdarrenr ret = get_pmc_dev(&dev); 5322514Sdarrenr if (ret) 5422514Sdarrenr return CMD_RET_FAILURE; 5522514Sdarrenr pmc_dump_info(dev); 5622514Sdarrenr 5722514Sdarrenr return 0; 5822514Sdarrenr} 5922514Sdarrenr 6022514Sdarrenrstatic struct cmd_tbl cmd_pmc_sub[] = { 6122514Sdarrenr U_BOOT_CMD_MKENT(init, 0, 1, do_pmc_init, "", ""), 6222514Sdarrenr U_BOOT_CMD_MKENT(info, 0, 1, do_pmc_info, "", ""), 6322514Sdarrenr}; 6422514Sdarrenr 6522514Sdarrenrstatic int do_pmc(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) 6622514Sdarrenr{ 6722514Sdarrenr const struct cmd_tbl *cp; 6822514Sdarrenr 69255332Scy if (argc < 2) /* no subcommand */ 70255332Scy return cmd_usage(cmdtp); 71255332Scy 7222514Sdarrenr cp = find_cmd_tbl(argv[1], &cmd_pmc_sub[0], ARRAY_SIZE(cmd_pmc_sub)); 7322514Sdarrenr if (!cp) 7422514Sdarrenr return CMD_RET_USAGE; 7522514Sdarrenr 7622514Sdarrenr return cp->cmd(cmdtp, flag, argc, argv); 7722514Sdarrenr} 7822514Sdarrenr 7922514SdarrenrU_BOOT_CMD( 8022514Sdarrenr pmc, 2, 1, do_pmc, "Power-management controller info", 8122514Sdarrenr "info - read state and show info about the PMC\n" 8222514Sdarrenr "pmc init - read state from the PMC\n" 8322514Sdarrenr ); 8422514Sdarrenr