/* Copyright 2015 Google Inc. All Rights Reserved.
 *
 * Note: flash_erase usage in here sends start and end as the same address.
 * This is because the size of each sysvar env is a single erase-block (64k).
 * The flash_erase function includes the addresses under the "last" param as
 * part of the erase section, meaning inclusion of 0x8 as an address will erase
 * 0x8 up to 0x9 (64k).  0x9 cannot be included as the end address because it is
 * not in a sector boundary.
 */
#include <sysvar.h>

#include <asm/io.h>
#include <common.h>
#include <config.h>
#include <command.h>
#include <flash.h>

struct sysvar_uboot {
  const char *sysvar_name;
  const char *uboot_name;
};

static const struct sysvar_uboot su_mappings[] = {
  {
    .sysvar_name = ACTIVATED_KERNEL_NAME_SV,
    .uboot_name = ACTIVATED_KERNEL_NAME_UB,
  },
  {
    .sysvar_name = MAC_ADDR1_SV,
    .uboot_name = MAC_ADDR1_UB,
  },
};

// Some bit twiddling for erasing the correct sector on Atheros flash.  This
// only erases multiples of 64kb.
#define __SYSVAR_ERASE_SECTOR(x) (((x) >> 16) & 0xff)

// Board-based implementation supplies pointer to flash info.
extern flash_info_t flash_info[];
struct sysvar_buf ro_buf;
struct sysvar_buf rw_buf;

const long sysvar_offset[SYSVAR_SPI_BLOCK] = {
  SYSVAR_RW_OFFSET0, SYSVAR_RW_OFFSET1, SYSVAR_RO_OFFSET0, SYSVAR_RO_OFFSET1
};

/*
 * str_to_int - Converts a string into an int.
 *
 * Returns an error by setting "err" to something non-zero.
 */
static int str_to_int(const char *str, int *err) {
  int res = 0;
  char *p;
  for (p = str; *p != '\0'; ++p) {
    switch (*p) {
      case '0':
      case '1':
      case '2':
      case '3':
      case '4':
      case '5':
      case '6':
      case '7':
      case '8':
      case '9':
        res = res * 10 + (*p - '0');
        break;
      default:
        if (err) {
          *err = 1;
        }
        return res;
    }
  }
  return res;
}

static void print_err(int code, void *arg) {
  switch (code) {
      case SYSVAR_CRC_ERR:
        printf("## Error: CRC check failure on index %d\n", *(int*)arg);
        break;
      case SYSVAR_DELETE_ERR:
        printf("## Error: failed to delete '%s'\n", (char*)arg);
        break;
      case SYSVAR_ERASE_ERR:
        printf("## Error: erase failure on index %d\n", *(int*)arg);
        break;
      case SYSVAR_EXISTED_ERR:
        printf("## Error: '%s' is already a read/write variable\n", (char*)arg);
        break;
      case SYSVAR_INDEX_ERR:
        printf("## Error: invalid SPI flash device %d\n", *(int*)arg);
        break;
      case SYSVAR_READONLY_ERR:
        printf("## Error: '%s' is a read only variable\n", (char*)arg);
        break;
      case SYSVAR_SET_ERR:
        printf("## Error: '%s' not found\n", (char*)arg);
        break;
      case SYSVAR_SUCCESS:
        break;
      case SYSVAR_WRITE_ERR:
        printf("## Error: unable to write to index %d\n", *(int*)arg);
        break;
      default:
        /* Unknown error code. */
        printf("## Error: code %d\n", code);
        break;
  }
}

/*
 * data_recovery - system variables recovering routine
 */
int data_recovery(struct sysvar_buf *buf, int idx) {
  int i, j, ret = SYSVAR_SUCCESS, sector;

  /* load the system variables */
  for (i = idx, j = idx + 1; i < idx + 2; i++, j--) {
    /* read the data from SPI flash */
    if (read_buff(flash_info, buf->data, sysvar_offset[i], buf->data_len))
      continue;

    /* check crc32 and wc32 (write count) */
    if (check_var(buf, SYSVAR_LOAD_MODE) == SYSVAR_SUCCESS) {
      /* erase SPI flash */
      sector = __SYSVAR_ERASE_SECTOR(sysvar_offset[j]);
      ret = flash_erase(flash_info, sector, sector);
      if (ret) {
        ret = SYSVAR_ERASE_ERR;
        goto recovery_err;
      }

      /* check crc32 and wc32 (write count) */
      if (check_var(buf, SYSVAR_SAVE_MODE)) {
        ret = SYSVAR_CRC_ERR;
        goto recovery_err;
      }

      /* write system variables(RW) to SPI flash */
      ret = write_buff(flash_info, buf->data, sysvar_offset[j] + CFG_FLASH_BASE,
                       buf->data_len);
      if (ret) {
        ret = SYSVAR_WRITE_ERR;
        goto recovery_err;
      }

      buf->loaded = true;
      return SYSVAR_SUCCESS;
    }
  }

recovery_err:
  clear_buf(buf);
  return ret;
}

/*
 * data_load - load the data from SPI flash to data buffer
 */
int data_load(struct sysvar_buf *buf, int idx) {
  int i, j;

  /* load the system variables */
  for (i = idx, j = 0; i < idx + 2; i++, j++) {
    buf->failed[j] = false;

    /* read the data from SPI flash */
    if (read_buff(flash_info, buf->data, sysvar_offset[i], buf->data_len)) {
      buf->failed[j] = true;
    }

    /* check crc32 and wc32 (write count) */
    if (check_var(buf, SYSVAR_LOAD_MODE))
      buf->failed[j] = true;
  }

load_err:
  if (buf->failed[0] || buf->failed[1]) {
    return SYSVAR_LOAD_ERR;
  }
  return SYSVAR_SUCCESS;
}

/*
 * data_save - save the data from data buffer to SPI flash
 */
int data_save(struct sysvar_buf *buf, int *idx) {
  int i, j, ret, sector;

  /* save the system variables */
  for (j = 0; j < 2; j++) {
    i = idx[j];
    sector = __SYSVAR_ERASE_SECTOR(sysvar_offset[i]);
    ret = flash_erase(flash_info, sector, sector);
    if (ret) {
      return SYSVAR_SAVE_ERR;
    }

    /* check crc32 and wc32 (write count) */
    if (check_var(buf, SYSVAR_SAVE_MODE)) {
      return SYSVAR_CRC_ERR;
    }

    /* write system variables to SPI flash */
    ret = write_buff(flash_info, buf->data, sysvar_offset[i] + CFG_FLASH_BASE,
                     buf->data_len);
    if (ret) {
      return SYSVAR_WRITE_ERR;
    }
  }
  return SYSVAR_SUCCESS;
}

/*
 * sysvar_dump - dump the data buffer in binary/ascii format
 */
void sysvar_dump(struct sysvar_buf *buf, int idx, bool load) {
  extern char console_buffer[];
  int start = 0;

  printf("System Variables(%s):\n", (idx < SYSVAR_RO_BUF) ? "RW" : "RO");
  printf("offset : 0x%08lx\n", sysvar_offset[idx]);
  printf("size   : %d bytes\n", buf->data_len);
  printf("total  : %d bytes\n", buf->total_len);
  printf("used   : %d bytes\n", buf->used_len);
  printf("wc32   : 0x%08lx\n", get_wc32(buf));
  printf("crc32  : 0x%08lx\n", get_crc32(buf));

  while (1) {
    /* dump one page data in data buffer */
    dump_buf(buf, start, PAGE_SIZE);
    /* continue to dump...? */
    readline("(n)ext, (p)rev, (f)irst, (l)ast ? >> ");
    if (strcmp(console_buffer, "n") == 0) {
      start += PAGE_SIZE;    /* go to next page */
      if (start >= buf->data_len)
        return;
    } else if (strcmp(console_buffer, "p") == 0) {
      start -= PAGE_SIZE;    /* go to previous page */
      if (start < 0)
        return;
    } else if (strcmp(console_buffer, "f") == 0) {
      if (start == 0)
        return;
      start = 0;  /* go to first page */
    } else if (strcmp(console_buffer, "l") == 0) {
      if (start == buf->data_len - PAGE_SIZE)
        return;
      start = buf->data_len - PAGE_SIZE;  /* go to last page */
    } else {
      return;
    }
  }
}

/*
 * sysvar_io - SPI flash IO operations
 */
int sysvar_io(int argc, char *argv[]) {
  struct sysvar_buf *buf;
  int i, idx, sector, ret = 0, str_to_int_err = 0;

  idx = str_to_int(argv[1], &str_to_int_err);
  if (str_to_int_err || idx < 0 || idx > 3) {
    return SYSVAR_INDEX_ERR;
  }
  if (idx < 2) {
    buf = &rw_buf;
  } else {
    buf = &ro_buf;
  }

  if (strcmp(argv[0], "write") == 0) {
    /* fill data to data buffer */
    for (i = 0; i < buf->data_len; i++)
      buf->data[i] = i;

    /* write the data buffer to spi_flash */
    ret = write_buff(flash_info, buf->data, sysvar_offset[idx] + CFG_FLASH_BASE,
                     buf->data_len);
    if (ret) {
      ret = SYSVAR_WRITE_ERR;
    }
  } else if (strcmp(argv[0], "erase") == 0) {
    /* erase spi_flash */
    sector = __SYSVAR_ERASE_SECTOR(sysvar_offset[idx]);
    ret = flash_erase(flash_info, sector, sector);
    if (ret) {
      ret = SYSVAR_ERASE_ERR;
    }
  }

  if (ret == 0) {
    ret = read_buff(flash_info, buf->data, sysvar_offset[idx], buf->data_len);
    if (ret == 0)
      sysvar_dump(buf, idx, false);
  }

  if (ret != 0)
    printf("## Error: SPI flash %s failed at 0x%08lx\n",
           argv[0], sysvar_offset[idx]);

  rw_buf.loaded = false;
  ro_buf.loaded = false;
  return ret;
}

////////////////////////////////////////////////////////////////////////////////
//  Sysvar/Uboot Integration
////////////////////////////////////////////////////////////////////////////////

/*
 * sysvar_buf_init - Initializes a sysvar_buf struct.
 */
static int sysvar_buf_init(struct sysvar_buf *buf, bool is_ro) {
  if (buf == NULL) {
    return SYSVAR_PARAM_ERR;
  }
  memset(buf, 0, sizeof(*buf));
  buf->list = (struct sysvar_list *)malloc(sizeof(struct sysvar_list));
  if (buf->list == NULL) {
    printf("list allocation ");
    return SYSVAR_MEMORY_ERR;
  }
  buf->data = (uchar *) map_physmem(is_ro ? SYSVAR_RO_MEM : SYSVAR_RW_MEM);
  if (buf->data == NULL) {
    printf("data allocation ");
    free(buf->list);
    return SYSVAR_MEMORY_ERR;
  }

  buf->data_len = SYSVAR_BLOCK_SIZE;
  buf->total_len = SYSVAR_BLOCK_SIZE - SYSVAR_HEAD;
  buf->free_len = buf->total_len;
  buf->readonly = is_ro;

  strncpy(buf->list->name, is_ro ? "ro" : "rw", SYSVAR_NAME);
  buf->list->value = NULL;
  buf->list->len = SYSVAR_NAME + 2;
  buf->list->next = NULL;
  buf->loaded = false;
  return SYSVAR_SUCCESS;
}

/*
 * sysvar_env_clear_shared - Takes sysvar buf and clears anything that may be
 * mapped to the uboot env.  Does not delete any sysvar variables.
 */
static void sysvar_env_clear_shared(struct sysvar_buf *buf) {
  struct sysvar_list *curr = buf->list->next;
  while (curr != NULL) {
    /* Only clear env variables for shared vars. */
    set_sysvar_uboot(curr->name, NULL);
    curr = curr->next;
  }
}

/*
 * sysvar_uboot_env_clear - Clears all potential uboot shared variables
 * from the environment.
 */
void sysvar_uboot_env_clear(void) {
  int i;
  for (i = 0; i < ARRAY_SIZE(su_mappings); ++i) {
    setenv(su_mappings[i].uboot_name, NULL);
  }
}

/* Helper function for sysvar_uboot_env_load. */
static void _sysvar_uboot_env_load(struct sysvar_buf *buf) {
  struct sysvar_list *curr = buf->list->next;
  while (curr != NULL) {
    /* Should only set env variables for special vars. */
    set_sysvar_uboot(curr->name, curr->value);
    curr = curr->next;
  }
}

/*
 * sysvar_uboot_env_load - Loads sysvar/uboot shared variables to the
 * uboot environment.
 */
void sysvar_uboot_env_load(void) {
  _sysvar_uboot_env_load(&ro_buf);
  _sysvar_uboot_env_load(&rw_buf);
}

int sysvar_init(void) {
  printf("sysvar_init. . . ");
  if (sysvar_buf_init(&rw_buf, false) || sysvar_buf_init(&ro_buf, true) ||
      sf_loadvar(&rw_buf, SYSVAR_RW_BUF) ||
      sf_loadvar(&ro_buf, SYSVAR_RO_BUF)) {
    printf("init failure!\n");
    return SYSVAR_MEMORY_ERR;
  }
  sysvar_uboot_env_load();
  printf("success!\n");
  return SYSVAR_SUCCESS;
}

/*
 * get_sysvar_shared - Determines if there's a mapping from sysvar -> uboot or
 * vice versa.
 *
 * If there is a mapping:
 *   If given a sysvar name, returns the uboot env name that the sysvar name
 *   maps to.  If given a uboot env name, returns the sysvar name that it maps
 *   to.
 *
 * If there is no mapping, returns NULL.
 */
const char *get_sysvar_shared(const char *var) {
  int i;
  for (i = 0; i < ARRAY_SIZE(su_mappings); ++i) {
    if (strcmp(var, su_mappings[i].uboot_name) == 0) {
      return su_mappings[i].sysvar_name;
    }
    if (strcmp(var, su_mappings[i].sysvar_name) == 0) {
      return su_mappings[i].uboot_name;
    }
  }
  return NULL;
}

const char *get_uboot_name(const char *sysvar_name) {
  int i;
  for (i = 0; i < ARRAY_SIZE(su_mappings); ++i) {
    if (strcmp(sysvar_name, su_mappings[i].sysvar_name) == 0) {
      return su_mappings[i].uboot_name;
    }
  }
  return NULL;
}

/*
 * set_sysvar_uboot - Sets the given variable to the value specified in the
 * uboot env if sysvar name is shared with uboot.
 */
void set_sysvar_uboot(const char *var, const char *value) {
  char *uboot_name = get_uboot_name(var);
  if (uboot_name) {
    printf(">>> mapping SV:'%s' to UB:'%s' . . .\n", var, uboot_name);
    setenv(uboot_name, value);
  }
}

////////////////////////////////////////////////////////////////////////////////
//  Sysvar Flash Impl Functions
////////////////////////////////////////////////////////////////////////////////

/*
 * sf_loadvar - load the data from SPI flash to data buffer
 */
int sf_loadvar(struct sysvar_buf *buf, int idx) {
  if (data_load(buf, idx)) {
    /* TODO(awdavies): Inform the user of potential data recovery failure. */
    data_recovery(buf, idx);
  }

  /* move the data from data buffer to data list */
  if (load_var(buf)) {
    return SYSVAR_LOAD_ERR;
  }
  buf->loaded = true;
  return SYSVAR_SUCCESS;
}

/*
 * sf_savevar - save the data from data buffer to SPI flash
 */
int sf_savevar(struct sysvar_buf *buf, int idx) {
  int ret;
  int save_idx[2];

  /* move the data from data list to data buffer */
  if (save_var(buf))
    return SYSVAR_SAVE_ERR;

  /* erase failed partition first
   *  part0   part1       erase
   *  -----   -----       -----
   *    ok      ok        0, 1
   *  failed    ok        0, 1
   *    ok    failed      1, 0
   *  failed  failed      0, 1
   */
  if (buf->failed[1]) {
    save_idx[0] = idx + 1;
    save_idx[1] = idx;
  } else {
    save_idx[0] = idx;
    save_idx[1] = idx + 1;
  }

  /* save the data from data buffer to SPI flash */
  if ((ret = data_save(buf, save_idx)))
    return ret;
  return SYSVAR_SUCCESS;
}

/*
 * sf_getvar - get or print the system variable from data list
 */
int sf_getvar(char *name, char *value, int len) {
  struct sysvar_list *var = NULL;

  if (name == NULL) {
    /* print all system variables(RO) */
    print_var(&ro_buf);
    /* print all system variables(RW) */
    print_var(&rw_buf);
    return SYSVAR_SUCCESS;
  }

  /* find the system variable(RO) */
  var = find_var(&ro_buf, name);
  if (var != NULL)
    goto get_data;

  /* find the system variable(RW) */
  var = find_var(&rw_buf, name);
  if (var != NULL)
    goto get_data;

  /* system variable not found */
  return SYSVAR_GET_ERR;

get_data:
  return get_var(var, name, value, len);
}

/*
 * sf_setvar - add or delete the system variable in data list
 */
int sf_setvar(struct sysvar_buf *buf, int idx, char *name, char *value) {
  struct sysvar_list *var = NULL;
  int ret = 0;

  if (name != NULL) {
    if (idx < SYSVAR_RO_BUF) {
      /* read only variable? */
      var = find_var(&ro_buf, name);
    } else {
      /* variable existed? */
      var = find_var(&rw_buf, name);
    }

    if (var != NULL) {
      if (idx < SYSVAR_RO_BUF) {
        return SYSVAR_READONLY_ERR;
      } else {
        return SYSVAR_EXISTED_ERR;
      }
    }

    var = find_var(buf, name);
    if (var != NULL) {
      /* delete system variable */
      ret = delete_var(buf, var);
      if (ret != SYSVAR_SUCCESS) {
        return SYSVAR_DELETE_ERR;
      }

      /* add system variable */
      if (value != NULL) {
        ret = set_var(buf, name, value);
      }
    } else {
      /* add system variable */
      if (value != NULL) {
        ret = set_var(buf, name, value);
      } else {
        ret = SYSVAR_SET_ERR;
      }
    }
  } else {
    /* delete all of system variables */
    ret = clear_var(buf);
  }
  return ret;
}

////////////////////////////////////////////////////////////////////////////////
//  Uboot Commands
////////////////////////////////////////////////////////////////////////////////

/*
 * do_flloadvar - load system variables from SPI flash
 *
 * sf_loadvar command:
 *    sf_loadvar - load system variables from persistent storage
 */
int do_flloadvar(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) {
  /* load system variables from SPI flash */
  int res, idx;
  idx = SYSVAR_RW_BUF;
  res = sf_loadvar(&rw_buf, idx);
  print_err(res, &idx);
  if (res != SYSVAR_SUCCESS) {
    return res;
  }
  idx = SYSVAR_RO_BUF;
  res = sf_loadvar(&ro_buf, idx);
  print_err(res, &idx);
  return res;
}

U_BOOT_CMD(
  loadvar, 1, 0, do_flloadvar,
  "loadvar   - load system variables\n",
  "    - load system variables from SPI flash\n"
);

/*
 * do_flsavevar - save system variables(RW) to SPI flash
 */
int do_flsavevar(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
  /* save system variables(RW) */
  printf("SV: Saving. . .\n");
  int idx = SYSVAR_RW_BUF;
  int res = sf_savevar(&rw_buf, idx);
  print_err(res, &idx);
  return res;
}

U_BOOT_CMD(
  savevar, 1, 0, do_flsavevar,
  "savevar   - save system variables(RW)\n",
  "    - save system variables(RW) to SPI flash\n"
);

/*
 * do_flprintvar - print system variables
 *
 * printvar command:
 *    printvar name - print system variable with name
 *    printvar      - print all system variables
 */
int do_flprintvar(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) {
  char value[SYSVAR_VALUE];

  if (argv[1] == NULL) {
    /* print all system variables */
    sf_getvar(NULL, NULL, 0);

    printf("\nSV: System Variables(RO): %d/%d bytes\n",
      ro_buf.used_len, ro_buf.total_len);
    printf("SV: System Variables(RW): %d/%d bytes\n",
      rw_buf.used_len, rw_buf.total_len);
  } else {
    /* get a system variable */
    if (sf_getvar(argv[1], value, SYSVAR_VALUE) == 0) {
      puts(argv[1]);
      putc('=');
      /* puts value in case CONFIG_SYS_PBSIZE < SYSVAR_VALUE */
      puts(value);
      putc('\n');
      printf("\nSV: System Variable: %d bytes\n",
        (int)(SYSVAR_NAME + 2 + strlen(value)));
    } else {
      printf("## SYSVAR: '%s' not found\n", argv[1]);
    }
  }
  return SYSVAR_SUCCESS;
}

U_BOOT_CMD(
  printvar, 2, 0, do_flprintvar,
  "printvar   - print system variables\n",
  "    - print values of all system variables\n"
  "printvar name ...\n"
  "    - print value of system variable 'name'\n"
);

/*
 * do_flsetvar - add or delete system variables(RW)
 *
 * setvar command:
 *    setvar name value - add system variable with name:value
 *    setvar name       - delete system variable with name
 *    setvar            - delete all system variables
 */
int do_flsetvar(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) {
  int ret = 0;

  if (argc == 3) {
    /* add a system variable(RW) */
    printf("SV: adding %s\n", argv[1]);
    ret = sf_setvar(&rw_buf, SYSVAR_RW_BUF, argv[1], argv[2]);
    if (ret == SYSVAR_SUCCESS) {
      set_sysvar_uboot(argv[1], argv[2]);
    }
  } else if (argc == 2) {
    /* delete a system variable(RW) */
    printf("SV: deleting %s\n", argv[1]);
    ret = sf_setvar(&rw_buf, SYSVAR_RW_BUF, argv[1], NULL);
    if (ret == SYSVAR_SUCCESS) {
      set_sysvar_uboot(argv[1], NULL);
    }
  } else {
    /* delete all system variables(RW) */
    printf("SV: deleting all RW vars. . .\n");
    sysvar_env_clear_shared(&rw_buf);
    ret = sf_setvar(&rw_buf, SYSVAR_RW_BUF, NULL, NULL);
  }
  print_err(ret, argc > 1 ? argv[1] : NULL);
  return ret;
}

U_BOOT_CMD(
  setvar, 3, 0, do_flsetvar,
  "setvar   - set system variables(RW)\n",
  "setvar name value ...\n"
  "    - set system variable(RW) 'name' to 'value ...'\n"
  "setvar name\n"
  "    - delete system variable(RW) 'name'\n"
  "setvar\n"
  "    - delete all system variables(RW)\n"
);

/*
 * do_flsysvar - system variable debug functions
 */
int do_flsysvar(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) {
  int ret = 0;
  int idx;
  void *err_arg = NULL;
  if (argc < 2)
    goto usage;

  if (strcmp(argv[1], "set") == 0) {
    if (argc == 4) {
      /* add a system variable(RO) */
      printf("SV: adding %s\n", argv[2]);
      ret = sf_setvar(&ro_buf, SYSVAR_RO_BUF, argv[2], argv[3]);
    } else if (argc == 3) {
      /* delete a system variable(RO) */
      printf("SV: deleting %s\n", argv[2]);
      ret = sf_setvar(&ro_buf, SYSVAR_RO_BUF, argv[2], NULL);
    } else if (argc == 2) {
      /* delete all system variables(RO) */
      printf("SV: deleting all RO vars. . .\n");
      sysvar_env_clear_shared(&ro_buf);
      ret = sf_setvar(&ro_buf, SYSVAR_RO_BUF, NULL, NULL);
    } else {
      goto usage;
    }
    if (argc > 2) {
      err_arg = argv[2];
    }
    goto err_handle;
  }

  if (strcmp(argv[1], "save") == 0 && argc == 2) {
    /* save system variables(RO) */
    printf("SV: saving RO vars. . .\n");
    idx = SYSVAR_RO_BUF;
    ret = sf_savevar(&ro_buf, idx);
    err_arg = &idx;
    goto err_handle;
  }

  if (strcmp(argv[1], "dump") == 0 && argc == 3) {
    if (strcmp(argv[2], "rw") == 0) {
      /* dump data in data buffer(RW) */
      sysvar_dump(&rw_buf, SYSVAR_RW_BUF, true);
    } else if (strcmp(argv[2], "ro") == 0) {
      /* dump data in data buffer(RO) */
      sysvar_dump(&ro_buf, SYSVAR_RO_BUF, true);
    } else {
      goto usage;
    }
    return SYSVAR_SUCCESS;
  }

  if ((strcmp(argv[1], "read") == 0 && argc == 3) ||
      (strcmp(argv[1], "write") == 0 && argc == 3) ||
      (strcmp(argv[1], "erase") == 0 && argc == 3)) {
    ret = sysvar_io(argc - 1, argv + 1);
    idx = str_to_int(argv[2], NULL);
    err_arg = &idx;
  }

err_handle:
  print_err(ret, err_arg);
  return ret;
usage:
  printf("Usage:\n%s\n", cmdtp->usage);
  return 1;
}

U_BOOT_CMD(
  sysvar, 4, 0, do_flsysvar,
  "sysvar   - system variable debug functions\n",
  "set name value\n"
  "    - set system variable(RO) 'name' to 'value ...'\n"
  "sysvar set name\n"
  "    - delete system variable(RO) 'name'\n"
  "sysvar set\n"
  "    - delete all system variables(RO)\n"
  "sysvar save\n"
  "    - save system variables(RO) to SPI flash\n"
  "sysvar dump rw|ro\n"
  "    - dump data in data buffer\n"
  "sysvar read 0|1|2|3\n"
  "    - read data from SPI flash 0|1|2|3 to data buffer\n"
  "sysvar write 0|1|2|3\n"
  "    - write data from data buffer to SPI flash 0|1|2|3\n"
  "sysvar erase 0|1|2|3\n"
  "    - erase data on SPI flash 0|1|2|3\n"
);
