summaryrefslogtreecommitdiff
path: root/drivers/usb/gadget/bootctrl.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/gadget/bootctrl.c')
-rw-r--r--drivers/usb/gadget/bootctrl.c406
1 files changed, 0 insertions, 406 deletions
diff --git a/drivers/usb/gadget/bootctrl.c b/drivers/usb/gadget/bootctrl.c
deleted file mode 100644
index 2562e0b9a1..0000000000
--- a/drivers/usb/gadget/bootctrl.c
+++ /dev/null
@@ -1,406 +0,0 @@
-/*
- * Copyright (C) 2015-2016 Freescale Semiconductor, Inc.
- *
- * SPDX-License-Identifier: GPL-2.0+
- */
-
-#include <common.h>
-#include <g_dnl.h>
-#include <fsl_fastboot.h>
-#include "bootctrl.h"
-#include <linux/types.h>
-#include <linux/stat.h>
-static unsigned int g_slot_selected;
-static const char *g_slot_suffix[SLOT_NUM] = {"_a", "_b"};
-static int init_slotmeta(struct boot_ctl *ptbootctl);
-
-static int strcmp_l1(const char *s1, const char *s2)
-{
- if (!s1 || !s2)
- return -1;
- return strncmp(s1, s2, strlen(s1));
-}
-
-
-static void dump_slotmeta(struct boot_ctl *ptbootctl)
-{
- int i;
-
- if (ptbootctl == NULL)
- return;
-
- printf("RecoveryTryRemain %d, crc %u\n",
- ptbootctl->recovery_tryremain, ptbootctl->crc);
-
- for (i = 0; i < SLOT_NUM; i++) {
- printf("slot %d: pri %d, try %d, suc %d\n", i,
- ptbootctl->a_slot_meta[i].priority,
- ptbootctl->a_slot_meta[i].tryremain,
- ptbootctl->a_slot_meta[i].bootsuc);
- }
-
- return;
-}
-
-const char *get_slot_suffix(void)
-{
- return g_slot_suffix[g_slot_selected];
-}
-
-static unsigned int slot_find(struct boot_ctl *ptbootctl)
-{
- unsigned int max_pri = 0;
- unsigned int slot = -1;
- int i;
-
- for (i = 0; i < SLOT_NUM; i++) {
- struct slot_meta *pslot_meta = &(ptbootctl->a_slot_meta[i]);
- if ((pslot_meta->priority > max_pri) &&
- ((pslot_meta->bootsuc > 0) ||
- (pslot_meta->tryremain > 0))) {
- max_pri = pslot_meta->priority;
- slot = i;
- printf("select_slot slot %d\n", slot);
- }
- }
-
- return slot;
-}
-
-
-
-static int read_bootctl(struct boot_ctl *ptbootctl)
-{
- int ret = 0;
- unsigned int crc = 0;
- char *p_block = NULL;
- uint offset_in_block = 0;
- uint blk_size = 0;
- char *pmagic = NULL;
-
- if (ptbootctl == NULL)
- return -1;
- ret = bcb_rw_block(true, &p_block, &blk_size, NULL,
- BOOTCTRL_OFFSET, sizeof(struct boot_ctl));
- if (ret) {
- printf("read_bootctl, bcb_rw_block read failed\n");
- return -1;
- }
-
- offset_in_block = BOOTCTRL_OFFSET%blk_size;
- memcpy(ptbootctl, p_block + offset_in_block, sizeof(struct boot_ctl));
-
- pmagic = ptbootctl->magic;
- if (!((pmagic[0] == '\0') && (pmagic[1] == 'F') &&
- (pmagic[2] == 'S') && (pmagic[3] == 'L'))) {
- printf("magic error, 0x%x 0x%x 0x%x 0x%x\n",
- pmagic[0], pmagic[1], pmagic[2], pmagic[3]);
-
- ret = init_slotmeta(ptbootctl);
- if (ret) {
- printf("init_slotmeta failed, ret %d\n", ret);
- free(p_block);
- return -1;
- }
- }
-
- /* check crc */
- crc = crc32(0, (unsigned char *)ptbootctl + CRC_DATA_OFFSET,
- sizeof(struct boot_ctl) - CRC_DATA_OFFSET);
- if (crc != ptbootctl->crc) {
- printf("crc check failed, caculated %d, read %d\n",
- crc, ptbootctl->crc);
-
- free(p_block);
- return -1;
- }
-
- free(p_block);
- return 0;
-}
-
-static int write_bootctl(struct boot_ctl *ptbootctl)
-{
- int ret = 0;
- char *p_block = NULL;
- uint offset_in_block = 0;
- uint blk_size = 0;
-
- if (ptbootctl == NULL)
- return -1;
-
- ptbootctl->crc = crc32(0, (unsigned char *)ptbootctl + CRC_DATA_OFFSET,
- sizeof(struct boot_ctl) - CRC_DATA_OFFSET);
-
- ret = bcb_rw_block(true, &p_block, &blk_size, NULL,
- BOOTCTRL_OFFSET, sizeof(struct boot_ctl));
- if (ret) {
- printf("write_bootctl, bcb_rw_block read failed\n");
- return -1;
- }
- offset_in_block = BOOTCTRL_OFFSET%blk_size;
- memcpy(p_block + offset_in_block, ptbootctl, sizeof(struct boot_ctl));
-
- ret = bcb_rw_block(false, NULL, NULL, p_block,
- BOOTCTRL_OFFSET, sizeof(struct boot_ctl));
- if (ret) {
- free(p_block);
- printf("write_bootctl, bcb_rw_block write failed\n");
- return -1;
- }
- free(p_block);
- return 0;
-}
-
-static int init_slotmeta(struct boot_ctl *ptbootctl)
-{
- int ret = 0;
- if (ptbootctl == NULL)
- return -1;
- memset(ptbootctl, 0, sizeof(struct boot_ctl));
- ptbootctl->recovery_tryremain = 7;
- ptbootctl->a_slot_meta[0].priority = 8;
- ptbootctl->a_slot_meta[0].tryremain = 7;
- ptbootctl->a_slot_meta[0].bootsuc = 0;
- ptbootctl->a_slot_meta[1].priority = 6;
- ptbootctl->a_slot_meta[1].tryremain = 7;
- ptbootctl->a_slot_meta[1].bootsuc = 0;
-
- ptbootctl->magic[0] = '\0';
- ptbootctl->magic[1] = 'F';
- ptbootctl->magic[2] = 'S';
- ptbootctl->magic[3] = 'L';
-
- ptbootctl->crc = crc32(0, (uint8_t *)ptbootctl + CRC_DATA_OFFSET,
- sizeof(struct boot_ctl) - CRC_DATA_OFFSET);
- ret = write_bootctl(ptbootctl);
- return ret;
-}
-
-char *select_slot(void)
-{
- int i = 0;
- int ret = 0;
- unsigned int slot;
- struct boot_ctl t_bootctl;
- bool b_need_write = false;
-
- ret = read_bootctl(&t_bootctl);
- if (ret) {
- printf("read_bootctl failed, ret %d\n", ret);
- return NULL;
- }
-
- dump_slotmeta(&t_bootctl);
-
- slot = slot_find(&t_bootctl);
- if (slot >= SLOT_NUM) {
- printf("!!! select_slot, no valid slot\n");
- return NULL;
- }
-
- /* invalid slot, set priority to 0 */
- for (i = 0; i < SLOT_NUM; i++) {
- struct slot_meta *pslot_meta = &(t_bootctl.a_slot_meta[i]);
- if ((pslot_meta->bootsuc == 0) &&
- (pslot_meta->tryremain == 0) &&
- (pslot_meta->priority > 0)) {
- pslot_meta->priority = 0;
- b_need_write = true;
- }
- }
-
- if (t_bootctl.recovery_tryremain != 7) {
- b_need_write = true;
- t_bootctl.recovery_tryremain = 7;
- }
-
- if ((t_bootctl.a_slot_meta[slot].bootsuc == 0) &&
- (t_bootctl.a_slot_meta[slot].tryremain > 0)) {
- b_need_write = true;
- t_bootctl.a_slot_meta[slot].tryremain--;
- }
-
- if (b_need_write) {
- ret = write_bootctl(&t_bootctl);
- if (ret)
- printf("!!! write_bootctl failed, ret %d\n", ret);
- }
-
- g_slot_selected = slot;
-
- if (slot == 0)
- return FASTBOOT_PARTITION_BOOT_A;
- else
- return FASTBOOT_PARTITION_BOOT_B;
-}
-
-
-int invalid_curslot(void)
-{
- int ret = 0;
- struct boot_ctl t_bootctl;
- unsigned int slot = g_slot_selected;
-
- printf("invalid_curslot %d\n", slot);
-
- if (slot >= SLOT_NUM)
- return -1;
-
- ret = read_bootctl(&t_bootctl);
- if (ret) {
- printf("invalid_slot failed, ret %d\n", ret);
- return -1;
- }
-
- t_bootctl.a_slot_meta[slot].priority = 0;
- ret = write_bootctl(&t_bootctl);
- if (ret) {
- printf("!!! write_bootctl failed, ret %d\n", ret);
- return -1;
- }
-
- return 0;
-}
-
-
-static unsigned int slotidx_from_suffix(char *suffix)
-{
- unsigned int slot = -1;
-
- if (!strcmp(suffix, "_a") ||
- !strcmp(suffix, "a"))
- slot = 0;
- else if (!strcmp(suffix, "_b") ||
- !strcmp(suffix, "b"))
- slot = 1;
-
- return slot;
-}
-
-
-int get_slotvar(char *cmd, char *response, size_t chars_left)
-{
- int ret;
- struct boot_ctl t_bootctl;
- memset(&t_bootctl, 0, sizeof(t_bootctl));
-
- if (!strcmp_l1("has-slot:", cmd)) {
- char *ptnname = NULL;
- ptnname = strchr(cmd, ':') + 1;
- if (!strcmp(ptnname, "system") || !strcmp(ptnname, "boot")
- !strcmp(str, "oem") || !strcmp(str, "gapps") ||
- !strcmp(str, "vbmeta"))
- strlcpy(response, "yes", chars_left);
- else
- strlcpy(response, "no", chars_left);
- return 0;
- } else if (!strcmp_l1("slot-suffixes", cmd)) {
- strlcpy(response, "_a,_b", chars_left);
- return 0;
- }
-
- ret = read_bootctl(&t_bootctl);
- if (ret) {
- error("get_slotvar, read_bootctl failed\n");
- strcpy(response, "get_slotvar read_bootctl failed");
- return -1;
- }
- if (!strcmp_l1("current-slot", cmd)) {
- unsigned int slot = slot_find(&t_bootctl);
- if (slot < SLOT_NUM)
- strlcpy(response, g_slot_suffix[slot], chars_left);
- else {
- strlcpy(response, "no valid slot", chars_left);
- return -1;
- }
- } else if (!strcmp_l1("slot-successful:", cmd)) {
- char *suffix = strchr(cmd, ':') + 1;
- unsigned int slot = slotidx_from_suffix(suffix);
- if (slot >= SLOT_NUM) {
- strlcpy(response, "no such slot", chars_left);
- return -1;
- } else {
- bool suc = t_bootctl.a_slot_meta[slot].bootsuc;
- strlcpy(response, suc ? "yes" : "no", chars_left);
- }
- } else if (!strcmp_l1("slot-unbootable:", cmd)) {
- char *suffix = strchr(cmd, ':') + 1;
- unsigned int slot = slotidx_from_suffix(suffix);
- if (slot >= SLOT_NUM) {
- strlcpy(response, "no such slot", chars_left);
- return -1;
- } else {
- unsigned int pri = t_bootctl.a_slot_meta[slot].priority;
- strlcpy(response, pri ? "no" : "yes", chars_left);
- }
- } else if (!strcmp_l1("slot-retry-count:", cmd)) {
- char *suffix = strchr(cmd, ':') + 1;
- unsigned int slot = slotidx_from_suffix(suffix);
- if (slot >= SLOT_NUM) {
- strlcpy(response, "no such slot", chars_left);
- return -1;
- } else {
- char str_num[7];
- sprintf(str_num, "%d",
- t_bootctl.a_slot_meta[slot].tryremain);
- strlcpy(response, str_num, chars_left);
- }
- } else {
- strlcpy(response, "no such slot command", chars_left);
- return -1;
- }
-
- return 0;
-}
-
-
-void cb_set_active(struct usb_ep *ep, struct usb_request *req)
-{
- int ret;
- int i;
- unsigned int slot = 0;
- char *cmd = req->buf;
- struct boot_ctl t_bootctl;
-
- memset(&t_bootctl, 0, sizeof(t_bootctl));
-
- strsep(&cmd, ":");
- if (!cmd) {
- error("missing slot suffix\n");
- fastboot_tx_write_str("FAILmissing slot suffix");
- return;
- }
-
- slot = slotidx_from_suffix(cmd);
- if (slot >= SLOT_NUM) {
- fastboot_tx_write_str("FAILerr slot suffix");
- return;
- }
-
- ret = read_bootctl(&t_bootctl);
- if (ret)
- fastboot_tx_write_str("FAILReadBootCtl failed");
-
- t_bootctl.a_slot_meta[slot].bootsuc = 0;
- t_bootctl.a_slot_meta[slot].priority = 15;
- t_bootctl.a_slot_meta[slot].tryremain = 7;
-
- /* low other slot priority */
- for (i = 0; i < SLOT_NUM; i++) {
- if (i == slot)
- continue;
-
- if (t_bootctl.a_slot_meta[i].priority >= 15)
- t_bootctl.a_slot_meta[i].priority = 14;
- }
-
- ret = write_bootctl(&t_bootctl);
- if (ret)
- fastboot_tx_write_str("write_bootctl failed");
- else
- fastboot_tx_write_str("OKAY");
-
- return;
-}
-