# The offsets of the partitions that change when Hoth is enabled
# From the device tree, in kB
# Nuvoton NPCM7XX family
FLASH_IMAGE_DESC_OFFSET:npcm7xx:hoth = "${@960 if FLASH_SIZE == '65536' else 7232}"
FLASH_HOTH_UPDATE_OFFSET:npcm7xx:hoth = "${@1024 if FLASH_SIZE == '65536' else 31744}"
FLASH_HOTH_MAILBOX_OFFSET:npcm7xx:hoth = "${@65472 if FLASH_SIZE == '65536' else 7168}"
# Aspeed 26XX family
FLASH_IMAGE_DESC_OFFSET:aspeed-g6:hoth = "${@960 if FLASH_SIZE == '65536' else 7232}"
FLASH_HOTH_UPDATE_OFFSET:aspeed-g6:hoth = "${@1024 if FLASH_SIZE == '65536' else 31744}"
FLASH_HOTH_MAILBOX_OFFSET:aspeed-g6:hoth = "${@65472 if FLASH_SIZE == '65536' else 7168}"
unset FLASH_UBOOT_ENV_OFFSET

python do_generate_static:append() {
    _append_image(os.path.join(d.getVar('DEPLOY_DIR_IMAGE', True),
                               'image-hoth-update'),
                  int(d.getVar('FLASH_HOTH_UPDATE_OFFSET', True)),
                  int(d.getVar('FLASH_SIZE', True)))
}
do_generate_static[depends] += "virtual/hoth-firmware:do_deploy"

python do_generate_layout () {
    import time
    import json

    def convertPart(name, startKb, endKb, static=False, wp=False, persist=False):
        regionTypes = []
        extraAttrs = {}
        if static:
            regionTypes.append('STATIC')
        if wp:
            regionTypes.append('WRITE_PROTECTED')
        if persist:
            regionTypes.append('PERSISTENT')
        if name == 'hoth_mailbox':
            regionTypes.append('MAILBOX')
            extraAttrs['mailbox_length'] = 1024

        start = int(startKb) * 1024
        end = int(endKb) * 1024

        return {
                'name': name,
                'offset': start,
                'length': end - start,
                'region_type': regionTypes,
                **extraAttrs,
        }

    # TODO: make this work for Aspeed too
    region = [
            convertPart(
                    'u_boot',
                    d.getVar('FLASH_UBOOT_OFFSET'),
                    d.getVar('FLASH_IMAGE_DESC_OFFSET'),
                    static=True,
                    wp=True),
            convertPart(
                    'image_descriptor',
                    d.getVar('FLASH_IMAGE_DESC_OFFSET'),
                    d.getVar('FLASH_HOTH_UPDATE_OFFSET'),
                    static=True,
                    wp=True),
            convertPart(
                    'hoth_update',
                    d.getVar('FLASH_HOTH_UPDATE_OFFSET'),
                    d.getVar('FLASH_KERNEL_OFFSET')),
            convertPart(
                    'kernel',
                    d.getVar('FLASH_KERNEL_OFFSET'),
                    d.getVar('FLASH_ROFS_OFFSET'),
                    static=True,
                    wp=True),
            convertPart(
                    'rofs',
                    d.getVar('FLASH_ROFS_OFFSET'),
                    d.getVar('FLASH_RWFS_OFFSET'),
                    static=True,
                    wp=True),
            convertPart(
                    'rwfs',
                    d.getVar('FLASH_RWFS_OFFSET'),
                    d.getVar('FLASH_HOTH_MAILBOX_OFFSET'),
                    persist=True),
            convertPart(
                    'hoth_mailbox',
                    d.getVar('FLASH_HOTH_MAILBOX_OFFSET'),
                    d.getVar('FLASH_SIZE')),
    ] if d.getVar('FLASH_SIZE') == '65536' else [
            convertPart(
                    'u_boot',
                    d.getVar('FLASH_UBOOT_OFFSET'),
                    d.getVar('FLASH_KERNEL_OFFSET'),
                    static=True,
                    wp=True),
            convertPart(
                    'kernel',
                    d.getVar('FLASH_KERNEL_OFFSET'),
                    d.getVar('FLASH_HOTH_MAILBOX_OFFSET'),
                    static=True,
                    wp=True),
            convertPart(
                    'hoth_mailbox',
                    d.getVar('FLASH_HOTH_MAILBOX_OFFSET'),
                    d.getVar('FLASH_IMAGE_DESC_OFFSET')),
            convertPart(
                    'image_descriptor',
                    d.getVar('FLASH_IMAGE_DESC_OFFSET'),
                    d.getVar('FLASH_ROFS_OFFSET'),
                    static=True,
                    wp=True),
            convertPart(
                    'rofs',
                    d.getVar('FLASH_ROFS_OFFSET'),
                    d.getVar('FLASH_RWFS_OFFSET'),
                    static=True,
                    wp=True),
            convertPart(
                    'rwfs',
                    d.getVar('FLASH_RWFS_OFFSET'),
                    d.getVar('FLASH_HOTH_UPDATE_OFFSET'),
                    persist=True),
            convertPart(
                    'hoth_update',
                    d.getVar('FLASH_HOTH_UPDATE_OFFSET'),
                    d.getVar('FLASH_SIZE')),
    ]

    machine = d.getVar('MACHINE')
    platform = d.getVar('PLATFORM')
    name = '{} {} image'.format(machine, d.getVar('DISTRO'))
    version = d.getVar('GBMC_VERSION').split('.')

    if not platform:
        raise NameError('PLATFORM not found, unable to generate layout, stopping build')

    layout = {
            'name': name,
            'major': int(version[0]),
            'minor': int(version[1]),
            'point': int(version[2]),
            'subpoint': int(version[3]),
            'platform': platform,
            'flash_capacity': int(d.getVar('FLASH_SIZE')) * 1024,
            'build_timestamp': int(time.time()),
            'region': region,
    }

    dir = d.getVar('DEPLOY_DIR_IMAGE')
    os.makedirs(dir, exist_ok=True)
    path = os.path.join(dir, 'cr51-image-layout.json')
    with open(path, 'w') as f:
        json.dump(layout, f, sort_keys=True, indent=4)
}

addtask generate_layout before do_image_complete
