/*      $NetBSD: octeon_uboot.h,v 1.3 2020/06/20 02:01:56 simonb Exp $  */

#ifndef _EVBMIPS_OCTEON_UBOOT_H_
#define _EVBMIPS_OCTEON_UBOOT_H_

#define OCTEON_BTDESC_ARGV_MAX          64
#define OCTEON_BTDESC_SERIAL_LEN        20
#define OCTEON_BTDESC_DEP2_LEN          6

#define OCTEON_BTINFO_PADDR_OFFSET      392
#define OCTEON_BTINFO_SERIAL_LEN        20
#define OCTEON_BTINFO_MAJOR_VERSION     1
#define OCTEON_BTINFO_MINOR_VERSION     2

struct octeon_btdesc {
       uint32_t        obt_desc_ver;
       uint32_t        obt_desc_size;
       uint64_t        obt_stack_top;                  /* deprecated */
       uint64_t        obt_heap_start;
       uint64_t        obt_heap_end;
       uint64_t        obt_deprecated17;
       uint64_t        obt_deprecated16;
       uint32_t        obt_deprecated18;
       uint32_t        obt_deprecated15;
       uint32_t        obt_deprecated14;
       uint32_t        obt_argc;
       uint32_t        obt_argv[OCTEON_BTDESC_ARGV_MAX];
       uint32_t        obt_flags;                      /* deprecated */
       uint32_t        obt_core_mask;                  /* deprecated */
       uint32_t        obt_dram_size;                  /* deprecated */
       uint32_t        obt_phy_mem_desc_addr;          /* deprecated */
       uint32_t        obt_debugger_flag_addr;
       uint32_t        obt_eclock;
       uint32_t        obt_deprecated10;
       uint32_t        obt_deprecated9;
       uint16_t        obt_deprecated8;
       uint8_t         obt_deprecated7;
       uint8_t         obt_deprecated6;
       uint16_t        obt_deprecated5;
       uint8_t         obt_deprecated4;
       uint8_t         obt_deprecated3;
       uint8_t         obt_deprecated2[OCTEON_BTDESC_SERIAL_LEN];
       uint8_t         obt_deprecated1[OCTEON_BTDESC_DEP2_LEN];
       uint8_t         obt_deprecated0;
       uint64_t        obt_boot_info_addr;
};

struct octeon_btinfo {
       uint32_t        obt_major_version;
       uint32_t        obt_minor_version;

       uint64_t        obt_stack_top;
       uint64_t        obt_heap_base;
       uint64_t        obt_heap_end;
       uint64_t        obt_desc_vaddr;

       uint32_t        obt_ebase_addr;
       uint32_t        obt_stack_size;
       uint32_t        obt_flags;
       uint32_t        obt_core_mask;                  /* deprecated in v4 */
       uint32_t        obt_dram_size;                  /* in MB */
       uint32_t        obt_phy_mem_desc_addr;
       uint32_t        obt_dbg_flags_base_addr;
       uint32_t        obt_eclock_hz;                  /* CPU clock speed */
       uint32_t        obt_dclock_hz;                  /* DRAM clock speed */
       uint32_t        obt_reserved0;

       uint16_t        obt_board_type;
       uint8_t         obt_board_rev_major;
       uint8_t         obt_board_rev_minor;
       uint16_t        obt_reserved1;
       uint8_t         obt_reserved2;
       uint8_t         obt_reserved3;
       char            obt_board_serial_number[OCTEON_BTINFO_SERIAL_LEN];

       uint8_t         obt_mac_addr_base[6];
       uint8_t         obt_mac_addr_count;

       /* version minor 1 or newer */
       uint64_t        obt_cf_common_base_addr;        /* paddr */
       uint64_t        obt_cf_attr_base_addr;          /* paddr */
       uint64_t        obt_led_display_base_addr;      /* deprecated */

       /* version minor 2 or newer */
       uint32_t        obt_dfa_ref_clock_hz;           /* DFA ref clock */
       uint32_t        obt_config_flags;

       /* version minor 3 or newer */
       uint64_t        obt_fdt_addr;                   /* FDT structure */

       /* version minor 4 or newer */
       uint64_t        obt_ext_core_mask;              /* 64-bit core mask */
};

extern struct octeon_btdesc octeon_btdesc;
extern struct octeon_btinfo octeon_btinfo;

#define OCTEON_SUPPORTED_DESCRIPTOR_VERSION     7

/* obt_board_type */
#define BOARD_TYPE_UBIQUITI_E100        20002
#define BOARD_TYPE_UBIQUITI_E120                20004
#define BOARD_TYPE_UBIQUITI_E200                20003
#define BOARD_TYPE_UBIQUITI_E220                20005
#define BOARD_TYPE_UBIQUITI_E220                20005
#define BOARD_TYPE_UBIQUITI_E1000               20010
#define BOARD_TYPE_UBIQUITI_E300                20300

/* obt_config_flags */
#define CONFIG_FLAGS_PCI_HOST                   __BIT(0)
#define CONFIG_FLAGS_PCI_TARGET                 __BIT(1)
#define CONFIG_FLAGS_DEBUG                      __BIT(2)
#define CONFIG_FLAGS_NO_MAGIC                   __BIT(3)
#define CONFIG_FLAGS_OVERSIZE_TLB_MAPPING       __BIT(4)
#define CONFIG_FLAGS_BREAK                      __BIT(5)


struct octeon_bootmem_desc {
#if BYTE_ORDER == BIG_ENDIAN
       uint32_t        bmd_lock;
       uint32_t        bmd_flags;
       uint64_t        bmd_head_addr;

       uint32_t        bmd_major_version;
       uint32_t        bmd_minor_version;
       uint64_t        bmd_app_data_addr;
       uint64_t        bmd_app_data_size;

       uint32_t        bmd_named_block_num_blocks;
       uint32_t        bmd_named_block_name_len;
       uint64_t        bmd_named_block_array_addr;
#endif
#if BYTE_ORDER == LITTLE_ENDIAN
       uint32_t        bmd_flags;
       uint32_t        bmd_lock;
       uint64_t        bmd_head_addr;

       uint32_t        bmd_minor_version;
       uint32_t        bmd_major_version;
       uint64_t        bmd_app_data_addr;
       uint64_t        bmd_app_data_size;

       uint32_t        bmd_named_block_name_len;
       uint32_t        bmd_named_block_num_blocks;
       uint64_t        bmd_named_block_array_addr;
#endif
};

struct octeon_bootmem_block_header {
       uint64_t        bbh_next_block_addr;
       uint64_t        bbh_size;
};

#endif /* _EVBMIPS_OCTEON_UBOOT_H_ */