/* 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 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"
);

void set_sysvar_uboot(const char *var, const char *name) {
  char *uboot_name = get_uboot_name(var);
  if (uboot_name) {
    setenv(uboot_name, name);
  }
}

/*
 * 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");
    ret = sf_setvar(&rw_buf, SYSVAR_RW_BUF, NULL, NULL);
    delete_uboot_vars();
  }
  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");
      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"
);

////////////////////////////////////////////////////////////////////////////////
//  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;
}

static void sysvar_env_init(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;
  }
}

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_env_init(&rw_buf);
  sysvar_env_init(&ro_buf);
  printf("success!\n");
  return SYSVAR_SUCCESS;
}

int is_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 ||
        strcmp(var, su_mappings[i].sysvar_name) == 0) {
      return true;
    }
  }
  return false;
}

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;
}

void delete_uboot_vars(void) {
  int i;
  for (i = 0; i < ARRAY_SIZE(su_mappings); ++i) {
    setenv(su_mappings[i].sysvar_name, NULL);
    setenv(su_mappings[i].uboot_name, NULL);
  }
}

