194 lines
5.0 KiB
C
194 lines
5.0 KiB
C
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
|
/*
|
|
* Copyright (c) 2019 Amlogic, Inc. All rights reserved.
|
|
*/
|
|
|
|
#include <common.h>
|
|
#include <command.h>
|
|
#include <env.h>
|
|
#include <malloc.h>
|
|
#include <asm/byteorder.h>
|
|
#include <config.h>
|
|
#include <asm/amlogic/arch/io.h>
|
|
#include <amlogic/partition_table.h>
|
|
#include <amlogic/libavb/libavb.h>
|
|
#include <version.h>
|
|
#include <amlogic/storage.h>
|
|
#include <fastboot.h>
|
|
#include <u-boot/sha1.h>
|
|
#include <asm/amlogic/arch/efuse.h>
|
|
#include <stdlib.h>
|
|
#include "cmd_bootctl_wrapper.h"
|
|
#include "cmd_bootctl_utils.h"
|
|
|
|
#ifndef getenv
|
|
#define getenv env_get
|
|
#endif
|
|
|
|
static bootctl_func_handles *curr_bootctl_handles;
|
|
|
|
static bootctl_func_handles *select_bootctl_cmd_func(void)
|
|
{
|
|
if (curr_bootctl_handles) {
|
|
return curr_bootctl_handles;
|
|
};
|
|
|
|
if (aml_get_boot_mode() == BOOT_MODE_AVB)
|
|
curr_bootctl_handles = get_bootctl_cmd_func_avb();
|
|
else if (aml_get_boot_mode() == BOOT_MODE_VAB)
|
|
curr_bootctl_handles = get_bootctl_cmd_func_vab();
|
|
else
|
|
curr_bootctl_handles = get_bootctl_cmd_func();
|
|
|
|
return curr_bootctl_handles;
|
|
}
|
|
|
|
static int do_GetValidSlot(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
{
|
|
int ret = 0;
|
|
bootctl_func_handles *func_handles = NULL;
|
|
|
|
func_handles = select_bootctl_cmd_func();
|
|
|
|
if (func_handles && func_handles->do_GetValidSlot_func)
|
|
ret = func_handles->do_GetValidSlot_func(cmdtp, flag, argc, argv);
|
|
|
|
return ret;
|
|
}
|
|
|
|
static int do_SetActiveSlot(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
{
|
|
int ret = 0;
|
|
bootctl_func_handles *func_handles = NULL;
|
|
|
|
func_handles = select_bootctl_cmd_func();
|
|
|
|
if (func_handles && func_handles->do_SetActiveSlot_func)
|
|
ret = func_handles->do_SetActiveSlot_func(cmdtp, flag, argc, argv);
|
|
|
|
return ret;
|
|
}
|
|
|
|
static int do_SetRollFlag(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
{
|
|
int ret = 0;
|
|
bootctl_func_handles *func_handles = NULL;
|
|
|
|
func_handles = select_bootctl_cmd_func();
|
|
|
|
if (func_handles && func_handles->do_SetRollFlag_func)
|
|
ret = func_handles->do_SetRollFlag_func(cmdtp, flag, argc, argv);
|
|
|
|
return ret;
|
|
}
|
|
|
|
static int do_CopySlot(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
{
|
|
int ret = 0;
|
|
bootctl_func_handles *func_handles = NULL;
|
|
|
|
func_handles = select_bootctl_cmd_func();
|
|
|
|
if (func_handles && func_handles->do_CopySlot_func)
|
|
ret = func_handles->do_CopySlot_func(cmdtp, flag, argc, argv);
|
|
|
|
return ret;
|
|
}
|
|
|
|
static int do_SetUpdateTries(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
{
|
|
int ret = 0;
|
|
bootctl_func_handles *func_handles = NULL;
|
|
|
|
func_handles = select_bootctl_cmd_func();
|
|
|
|
if (func_handles && func_handles->do_SetUpdateTries_func)
|
|
ret = func_handles->do_SetUpdateTries_func(cmdtp, flag, argc, argv);
|
|
|
|
return ret;
|
|
}
|
|
|
|
static int do_UpdateDt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
{
|
|
int ret = 0;
|
|
bootctl_func_handles *func_handles = NULL;
|
|
|
|
func_handles = select_bootctl_cmd_func();
|
|
|
|
if (func_handles && func_handles->do_UpdateDt_func)
|
|
ret = func_handles->do_UpdateDt_func(cmdtp, flag, argc, argv);
|
|
|
|
return ret;
|
|
}
|
|
|
|
int do_GetSystemMode(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
{
|
|
int ret = 0;
|
|
bootctl_func_handles *func_handles = NULL;
|
|
|
|
func_handles = select_bootctl_cmd_func();
|
|
|
|
if (func_handles && func_handles->do_GetSystemMode_func)
|
|
ret = func_handles->do_GetSystemMode_func(cmdtp, flag, argc, argv);
|
|
|
|
return ret;
|
|
}
|
|
|
|
int do_CheckABState(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
{
|
|
int ret = 0;
|
|
bootctl_func_handles *func_handles = NULL;
|
|
|
|
func_handles = select_bootctl_cmd_func();
|
|
|
|
if (func_handles && func_handles->do_CheckABState_func)
|
|
ret = func_handles->do_CheckABState_func(cmdtp, flag, argc, argv);
|
|
|
|
return ret;
|
|
}
|
|
|
|
U_BOOT_CMD(get_valid_slot, 2, 0, do_GetValidSlot,
|
|
"get_valid_slot",
|
|
"\nThis command will choose valid slot to boot up which saved in misc\n"
|
|
"partition by mark to decide whether execute command!\n"
|
|
"So you can execute command: get_valid_slot");
|
|
|
|
U_BOOT_CMD(set_active_slot, 2, 1, do_SetActiveSlot,
|
|
"set_active_slot",
|
|
"\nThis command will set active slot\n"
|
|
"So you can execute command: set_active_slot a");
|
|
|
|
U_BOOT_CMD(set_roll_flag, 2, 1, do_SetRollFlag,
|
|
"set_roll_flag",
|
|
"\nThis command will set active slot\n"
|
|
"So you can execute command: set_active_slot a");
|
|
|
|
U_BOOT_CMD(copy_slot_bootable, 3, 1, do_CopySlot,
|
|
"copy_slot_bootable",
|
|
"\nThis command will set active slot\n"
|
|
"So you can execute command: copy_slot_bootable 2 1");
|
|
|
|
U_BOOT_CMD(update_tries, 2, 0, do_SetUpdateTries,
|
|
"update_tries",
|
|
"\nThis command will change tries_remaining in misc\n"
|
|
"So you can execute command: update_tries");
|
|
|
|
U_BOOT_CMD
|
|
(check_ab, 2, 0, do_CheckABState,
|
|
"check_ab",
|
|
"\nThis command will check ab sate\n"
|
|
"So you can execute command: check_ab"
|
|
);
|
|
|
|
U_BOOT_CMD(get_system_as_root_mode, 1, 0, do_GetSystemMode,
|
|
"get_system_as_root_mode",
|
|
"\nThis command will get system_as_root_mode\n"
|
|
"So you can execute command: get_system_as_root_mode");
|
|
|
|
U_BOOT_CMD
|
|
(update_dt, 1, 0, do_UpdateDt,
|
|
"update_dt",
|
|
"\nThis command will update dt\n"
|
|
"So you can execute command: update_dt");
|
|
|