/*
 * cmd_hnvram.c -- makes hnvram contents available in u-boot.
 *      Loads contents of hnvram from spi flash and saves it
 *      to environment variables named HNV_<name>.
 *
 * Copyright (C) 2015 Google Inc.
 * Author: Chris Gibson <cgibson@google.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */

#include <command.h>
#include <common.h>
#include <malloc.h>
#include <spi_flash.h>
#include <asm/byteorder.h>

/* local debug macro */
#undef HNVRAM_DEBUG

#ifdef HNVRAM_DEBUG
#define DEBUG(fmt, args...)  printf(fmt, ##args)
#else
#define DEBUG(fmt, args...)
#endif  /* HNVRAM_DEBUG */

#define CONFIG_SF_DEFAULT_MODE SPI_MODE_3


// Location in DRAM where hnvram variables are stored during boot
// DRAM is 128 MB [0x80000000 - 0x88000000]
// Store hnvram at 120 - 122 MB
#define HNVRAM_DRAM_OFFSET  0x87800000

// Where in flash does hnvram partition start
#define HNVRAM_MTD_OFFSET   UBOOT_PARTITION_OFFSET_HNVRAM

// Total hnvram is 2MB with 4 partitions
#define MAX_HNVRAM_SIZE     UBOOT_HNVRAM_PARTITION_SIZE

// Sub-partitions are stored packed, in this order.
// HNVRAM_RW_SIZE is halved to match HNVRAM_RWB_SIZE, though the offset
// to RWB remains the same.
#define HNVRAM_RO_SIZE      0x00100000
#define HNVRAM_RW_SIZE      0x00020000
#define HNVRAM_RESERVED_SIZE 0x00020000
#define HNVRAM_RWB_SIZE     0x00020000
#define HNVRAM_RAW_FS_SIZE  0x00020000

// B1 and B2 corresponding to RW_OFFSET and RWB_OFFSET
#define HNVRAM_B1_OFFSET  (HNVRAM_RO_SIZE)
#define HNVRAM_B2_OFFSET  (HNVRAM_RO_SIZE + HNVRAM_RW_SIZE + HNVRAM_RESERVED_SIZE)

#define CMD_RET_SUCCESS 0
#define CMD_RET_FAILURE 1
#define CMD_RET_USAGE -1

// These keys are stored in binary format for historical reasons
const char *hnvram_binary_keys[] = {
        "LOADER_VERSION",
        "HDCP_KEY",
        "DTCP_KEY",
};

static void *xmalloc(size_t size)
{
        void *p = NULL;
        if (!(p = malloc(size))) {
                printf("error: memory not allocated\n");
                return 0;
        }
        memset(p, 0, size);
        return p;
}

int read_u8(const char **p)
{
        int v = *(const unsigned char *)(*p);
        *p += 1;
        return v;
}

int read_s32_be(const char **p)
{
        const unsigned char *vp = (const unsigned char *)*p;
        *p += 4;
        return (vp[0]<<24) + (vp[1]<<16) + (vp[2]<<8) + vp[3];
}

int read_u16_le(const char **p)
{
        const unsigned char *up = (const unsigned char *)(*p);
        *p += 2;
        return up[0] + (up[1] << 8);
}

int is_hnvram_binary(const char *name, int namelen)
{
        int i;
        for (i = 0; i < ARRAY_SIZE(hnvram_binary_keys); i++) {
                const char *k = hnvram_binary_keys[i];
                if ((int)strlen(k) == namelen && strncmp(k, name, namelen) == 0) {
                        return 1;
                }
        }
        return 0;
}

char *encode_hex(const char *s, int len)
{
        char *optr, *out = xmalloc(len * 2 + 1);
        for (optr = out; len > 0; len--) {
                sprintf(optr, "%02x", read_u8(&s));
                optr += 2;
        }
        return out;
}

char *encode_macaddr(const char *mac)
{
        int i;
        char *out = xmalloc(6 * 2 + 5 + 2);
        for (i = 0; i < 6; i++) {
                sprintf(out + i * 3, "%02X:", read_u8(&mac));
        }
        out[6*2 + 5] = '\0';
        return out;
}

static void _copy_setenv(const char *name, int namelen,
                const char *val, int vallen)
{
        char *n, *v;
        if (namelen + vallen < 128) {
                n = xmalloc(4 + namelen + 1);
                v = xmalloc(vallen + 1);
                memcpy(n, "HNV_", 4);
                memcpy(n + 4, name, namelen);
                memcpy(v, val, vallen);
                n[namelen+4] = 0;
                v[vallen] = 0;
                setenv(n, v);
                free(n);
                free(v);
        } else {
                DEBUG("ignoring oversized val: %.15s, vallen: %d\n", val, vallen);
        }
}

static int _parse_hnvram(const char *buf, int len)
{
        // An hnvram structure. Format is a tag-length-value sequence of:
        //    [1 byte]   type (1 for notdone, 0 for done)
        //    [4 bytes]  record length
        //    [1 byte]   key length
        //    [x bytes]  key
        //    [4 bytes]  value length
        //    [y bytes]  value
        int rectype, reclen, namelen, vallen;
        int done = 0;
        const char *name, *val, *p = buf;
        while (p - buf <= len + 11) {
                rectype = read_u8(&p);
                if (rectype == 0x00) {
                        printf("done processing hnvram block!\n");
                        done = 1;
                        break;
                }
                if (rectype != 0x01) {
                        printf("error: hnvram invalid rectype %x\n", rectype);
                        return -1;
                }

                reclen = read_s32_be(&p);
                if (reclen <= 6 || (p - buf) + reclen >= len) {
                        printf("error: hnvram invalid reclen %d\n", reclen);
                        return -1;
                }
                namelen = read_u8(&p);
                if (namelen < 1 || (p - buf) + namelen >= len) {
                        printf("error: hnvram invalid namelen %d\n", namelen);
                        return -1;
                }
                name = p;
                p += namelen;
                vallen = read_s32_be(&p);
                if (vallen < 0 || (p - buf) + vallen >= len) {
                        printf("error: hnvram invalid vallen %d\n", vallen);
                        return -1;
                }
                val = p;
                p += vallen;
                if (vallen == 6 && namelen >= 8 &&
                                strncmp("MAC_ADDR", name, 8) == 0) {
                        char *macstr = encode_macaddr(val);
                        _copy_setenv(name, namelen, macstr, strlen(macstr));
                        free(macstr);
                } else if (is_hnvram_binary(name, namelen)) {
                        char *hexstr = encode_hex(val, vallen);
                        _copy_setenv(name, namelen, hexstr, strlen(hexstr));
                        free(hexstr);
                } else {
                        _copy_setenv(name, namelen, val, vallen);
                }
        }
        if (!done) {
                printf("error: failed to find final hnvram record?\n");
                return -1;
        }
        return 0;
}

#if defined(CONFIG_CMD_HNVRAM)
int do_hnvram_load(void) {
        char command[60];
        sprintf(command, "spi_flash read 0x%x 0x%x 0x%x", HNVRAM_MTD_OFFSET, HNVRAM_DRAM_OFFSET, MAX_HNVRAM_SIZE);
        int ret = run_command(command, 0);

        if (ret) {
          printf("failed reading from spi-flash at addr: %d\n", HNVRAM_MTD_OFFSET);
          return ret;
        }

        char *buf = HNVRAM_DRAM_OFFSET;

        // Next step: Seek to different parts of the buffer that contain the
        // first, second, and third sections of hnvram.
        if (_parse_hnvram(buf, HNVRAM_RO_SIZE) != 0) {
                printf("failed parsing HNVRAM_RO at offset: 0x%p\n", buf);
                return -1;
        }
        // Read from the RWB partition on failure to read RW.
        if (_parse_hnvram(buf+HNVRAM_B1_OFFSET, HNVRAM_RW_SIZE) != 0) {
                printf("failed parsing HNVRAM_RW at offset: 0x%p\n", buf+HNVRAM_B1_OFFSET);
                if (_parse_hnvram(buf+HNVRAM_B2_OFFSET, HNVRAM_RWB_SIZE) != 0) {
                        printf("failed parsing HNVRAM_RWB at offset: 0x%p\n",
                               buf+HNVRAM_B2_OFFSET);
                        return -1;
                }
        }

        return CMD_RET_SUCCESS;
}

int do_hnvram_init(char *val) {
        // Erase entire partition
        char command[60];
        sprintf(command, "spi_flash erase 0x%x 0x%x", HNVRAM_MTD_OFFSET, MAX_HNVRAM_SIZE);
        int ret = run_command(command, 0);

        if (ret) {
          printf("failed to erase hnvram partition\n");
          return ret;
        }

        char key[] = "PLATFORM_NAME";
        int val_len = strlen(val);
        // size variable should fit in one byte
        if (val_len < 1 || 255 < val_len) {
          printf("Intial value for %s has bad size: %d", key, val_len);
          return CMD_RET_FAILURE;
        }
        // +5 to count key length (1) and record length (4) bytes
        int rec_len = sizeof(key) + val_len + 5;

        // Use 2MB of (hopefully) free DRAM
        char *buf = HNVRAM_DRAM_OFFSET;
        memset(buf, 0x00, MAX_HNVRAM_SIZE);

        // Write platform_name to RW section
        int i = HNVRAM_B1_OFFSET;

        // Record start
        buf[i++] = 0x01;

        // Record length
        int nbyte_order = htonl(rec_len); // hnvram expects big endian
        memcpy(buf + i, &nbyte_order, sizeof(nbyte_order));
        i += sizeof(nbyte_order);

        // Key length
        buf[i++] = sizeof(key);

        // Key
        memcpy(buf + i, &key, sizeof(key));
        i += sizeof(key);

        // Val length
        nbyte_order = htonl(val_len);
        memcpy(buf + i, &nbyte_order, sizeof(nbyte_order));
        i += sizeof(nbyte_order);

        // Val
        memcpy(buf + i, val, val_len);

        sprintf(command, "spi_flash write 0x%x 0x%p 0x%x", HNVRAM_MTD_OFFSET, buf, MAX_HNVRAM_SIZE);
        ret = run_command(command, 0);

        if (ret) {
          printf("failed to write init to hnvram partition\n");
          return ret;
        }

        // Load platform_name into environment variables
        do_hnvram_load();

        return CMD_RET_SUCCESS;
}

static int do_hnvram_cmd(cmd_tbl_t *cmdtp, int flag, int argc,
                char * const argv[]) {
        if (argc == 2 && strcmp(argv[1], "load") == 0) {
          return do_hnvram_load();
        } else if (argc == 2 && strcmp(argv[1], "init") == 0) {
          return do_hnvram_init("GFRG240");
        } else if (argc == 3 && strcmp(argv[1], "init") == 0) {
          return do_hnvram_init(argv[2]);
        } else {
          printf("hnvram - incorrect usage. Please use one of:\n");
          printf("hnvram load\n");
          printf("hnvram init <model>\n");
          return CMD_RET_USAGE;
        }
}

U_BOOT_CMD(
        hnvram, 3, 0, do_hnvram_cmd,
        "HNVRAM key-val storage on flash",
        "\n"
        "hnvram load            - reads all variables from flash partition and"
        "                         places into environment vars as HNV_<name>"
        "hnvram init [model]    - zeros hnvram and writes PLATFORM_NAME=<model>"
        "                         Uses GFRG240 by default if no arg given"
        );
#endif  /* CONFIG_CMD_HNVRAM */
