/* ***********************************************************************
 *  ASTRIS - Remote JTAG probe
 *
 *  Astris Booster System Public API   File: astris_booster_api.h
 *
 ************************************************************************
 *
 *  Copyright (C) 2016 Apple Inc. All rights reserved.
 *
 *  This document is the property of Apple Inc.
 *  It is considered confidential and proprietary.
 *
 *  This document may not be reproduced or transmitted in any form,
 *  in whole or in part, without the express written permission of
 *  Apple Inc.
 ************************************************************************ */

#ifndef _ASTRIS_BOOSTER_API_CPU_H
#define _ASTRIS_BOOSTER_API_CPU_H

#include "astris_api.h"
#include "astris_cpu.h"
#include "astris_swdflash.h"
#include <CoreFoundation/CoreFoundation.h>

__BEGIN_DECLS

/*!
 * @struct AXbooster_handoff_info_t
 * @abstract This struct is used to transport contexts from
 * the main Astris API instance into the ones running in each Booster.
 * @discussion Because Astris is a static library, each Booster has its own version
 * of Astris APi running. These Astris API instances running in the Booster sometimes
 * need to refer and use the context that was initialized and running in main Astris API
 * such as the logging context (if the booster wants to log to the same file that main Astris
 * API is logging too). 99% of the time, main Astris API is the API that the Astris console uses.
 * This struct is passed using AXbooster_interface_init_astris_api. If Booster writer implented
 * AXbooster_interface_init_astris_api then the Booster system will throw over a handoff struct,
 * so the writer can overwrite the contexts in the booster.
 * @see AXbooster_interface_init_astris_api
 */
typedef struct {
    void       *logging_ctx;          /* Logging context from main Astris API */
    void       *booster_ctx;          /* Booster context from main Astris API instance */
    void       *exception_ctx;        /* Exception context from main Astris API intance */
    const char *booster_api_src_vers; /* Version of the source of the Astris API that the booster uses */
    const char *main_api_src_vers;    /* Version of the source of the API that is loading the booster */
} AXbooster_handoff_info_t;

/*!
 * @function AXbooster_interface_init_astris_api
 * @abstract Hands the current Astris context to the booster so it can use the contexts.
 * @discussion This function is meant to run before calling into the specific booster interface
 * in order to set up the Astris API instance that is running in the booster so they are synced.
 *
 * The logging context is passed so that the booster's AXlog goes into the same file
 * and history as the main Astris API.
 *
 * The booster context can be passed as well so that if your booster wants to do
 * something like explore where new CPUs will be created, then the CPU boosters that
 * the main Astris API found on start up, will be used inside of the boosters explore without
 * the booster having to initialize its own booster context (which is NOT allowed).
 * Currently the booster_ctx is not passed via this handoff (it used to be) current
 * boosters work off AXconn_t object and use that booster context. If there is ever
 * a booster where we dont have an AXconn_t but needs to query the booster ctx, this
 * function can be used. However, now the global has been taken out each AXconn_t has
 * its own booster so handing it off here does not do anything.
 *
 * Following functions can be used to override contexts: AXlog_init_with_ctx,
 * AXbooster_init_with_ctx.
 * @return ASTRIS_ERR_OK if everything went well, other something failed.
 */
int AXbooster_interface_init_astris_api(AXbooster_handoff_info_t *info);

/* CPU Booster Documentation
 *
 * Info.plist Available keys
   ***************************
   dbgarch [REQUIRED]: Value should be an INTEGER that maps to an enum in armdbg.h
   If this dbgarch is not present in the CPU booster, a match will not even be tried and
   the booster is considered malformed.

   implementer: Value should be a STRING, either Arm or Apple. This is part of the MIDR,
   however the matching logic matches Arm or Apple string to the correct implementer ID.

   partnum: Value should be an ARRAY of INTEGERS, that correspond to part numbers that this CPU
   corresponds to. Part Number is part of the MIDR register.

   typehint: Value should be a STRING, which corresponds to a typehint Astris uses when
   dealing with ARMv7M cores. You SHOULD fill this value out when creating a new ARMV7m CPU
   that Astris will use.

   socnames: Value should be an ARRAY of STRINGS corresponding to SoCs names that
   this CPU is used in.

   Info.plist Tips:
   ****************

   When creating a new ARMV7m CPU and Astris already knows where it should go (Astris already
   knows that a CPU of this typehint needs to go at X address),
   then its easier to just put the dbgarch and typehint and add a required key with typehint in the array.
   This way if dbgarch is the same, and typehint is the same then the CPU matchs.

   If you are creating a new Apple ARM64 CPU, then using implementer and partnum as required keys is suggested.
   This is because then, this particular CPU can go into SoC.

   Required Keys are very useful when matching CPUs because one CPU can go into many SoCs. When creating a new
   CPU Booster think about what keys 100% need to match and which are optional.

   What Does Your CPU Booster Need To Do:
   **************************************

   You CPU needs to subclass one of the following classes: ARM32, ARM64, ARM7m, or ARM64AppleCPU.
   It is not recommended to subclass from ARMCPU, or CPU if you are not part of Astris Core; these
   classes are too generic and it is more wise to subclass from the more derived classes.

   Each of the classes headers should provide you information about what are possible functions to
   override to do what you want them to.

   Once you have your class, you will need to implement the interface functions described in this header.
   For CPU booster you will need to implement: AXbooster_interface_create_cpu and AXbooster_interface_init_astris_api
   Both of these should be straight forward functions.
*/

/*!
 * @function AXbooster_interface_create_cpu
 * @abstract Creates a concrete CPU that the booster defines. This function must be defined for CPU boosters.
 * @discussion This function should be a one liner function. It should create an instance of
 * of the CPU you just defined via new and return a pointer to the CPU.
 * @return A concrete CPU object of the new CPU class you just defined in the booster.
 */
CPU_t *AXbooster_interface_create_cpu(AXtgt_t *tgt, const char *name, uint32_t id);

/* SWDFlasher Booster Documentation

   Info.plist Available Keys
   *************************

   aod_type: Value should be of type INTEGER. This is filled in inside
   the device tree for the SoC and is also documented in the astris_swdflash_common.h
   This key is REQUIRED if this flasher will be used during restore.

   preflash_type: Value should be of type INTEGER. The preflash_type is filled in
   inside the embedded device tree for the SoC and is also documented in the astris_swdflash_common.h.
   This key is REQUIRED if this flasher will be used during restore.

   socs_supported [REQUIRED]: This key required, always. This will be used for swdflash CLI, and
   can eventually be used in the tcl layer as well.

   What Does Your SWDFlasher Need To Do:
   *************************************

   The SWDFlasher booster will need to subclass SWDFlasher_t that is described in astris_swdflash.h

   The Info.plist will need to be modified and new keys will need to be added so that your
   new booster can be matched properly. The key names and what they represent
   is described above.

   AXbooster_interface_init_astris_api will need to be overridden, because in your booster you are
   most likely going to explore will will require fetching a CPU booster, and so the AstrisAPI
   booster context within your SWDFlasher booster will need to be overridden same with the logging
   context. Following functions can be used to override contexts: AXlog_init_with_ctx,
   AXbooster_init_with_ctx. The contexts will be passed through the AXastris_api_t described above.
*/

/*!
 * @function AXbooster_interface_create_swdflasher
 * @abstract C Interface for loading the SWDFlasher_t
 * @discussion This function MUST be implemented in your booster, as it will be used to
 * load the booster. This interface function must create an instance of your
 * SWDFlasher_t subclass via new and it must return a pointer to this instance.
 */
SWDFlasher_t *AXbooster_interface_create_swdflasher();

/*!
 * @function AXbooster_interface_cleanup_astris_api
 * @abstract This function is called before unloading the plugin, to clean plugins internal structures.
 * @discussion Usually CPU_t, SWDFlasher_t, SOC_t objects gotten from plugins are cleaned up
 * before we unload the plugin; this should still be the case. However, since each plugin has
 * its own AstrisAPI which in turn has its own global state, or other states this function
 * serves as a way to clean this up. Currently on our SoCs, we call a function to clean up
 * global exception context called astris_cleanup_exception
 *
 * @return ASTRIS_ERR_OK if everything went well, other something failed.
 */
int AXbooster_interface_cleanup_astris_api();

#define AXSOC_BOOSTER_PID_KEY     "soc-pid"
#define AXSOC_BOOSTER_NAME_KEY    "soc-name"
#define AXSOC_BOOSTER_CPU_KEY     "cpus"
#define AXSOC_BOOSTER_COMPLEX_KEY "complexes"
#define AXSOC_BOOSTER_DART_KEY    "darts"
#define AXSOC_BOOSTER_TC1500_KEY  "tc1500"

#define AXSOC_BOOSTER_CPU_DESC_NAME_KEY         "cpu-name"
#define AXSOC_BOOSTER_CPU_DESC_ADDRESS_KEY      "cpu-address"
#define AXSOC_BOOSTER_CPU_DESC_APTYPE_KEY       "cpu-aptype"
#define AXSOC_BOOSTER_CPU_DESC_APSELECT_KEY     "cpu-apselect"
#define AXSOC_BOOSTER_CPU_DESC_GROUP_KEY        "cpu-group"
#define AXSOC_BOOSTER_CPU_DESC_TYPEHINT_KEY     "cpu-typehint"
#define AXSOC_BOOSTER_CPU_DESC_PS_KEY           "cpu-ps-register"
#define AXSOC_BOOSTER_CPU_DESC_SUBSYSTEM_KEY    "cpu-subsystem"
#define AXSOC_BOOSTER_CPU_DESC_RUNTIME_KEY      "cpu-runtimes"
#define AXSOC_BOOSTER_CPU_DESC_INTEGRATIONS_KEY "cpu-integrations"
#define AXSOC_BOOSTER_CPU_DESC_EXPLORE_FLAG_KEY "cpu-explore-flag"
#define AXSOC_BOOSTER_CPU_DESC_DIE_KEY          "cpu-die"
#define AXSOC_BOOSTER_CPU_DESC_SOC_REVISION_KEY "soc-revisions"
#define AXSOC_BOOSTER_CPU_DESC_SOC_REV_NUM_KEY  "soc-rev-num"

#define AXSOC_BOOSTER_CPU_DESC_ASCDEBUG_OFFSET "cpu-ascdebug-offset"
#define AXSOC_BOOSTER_CPU_DESC_ASCDEBUG_DBGACK "cpu-ascdebug-dbgack"

#define AXSOC_BOOSTER_CPU_DESC_ARMV7M_BASE_OFFSET_KEY "cpu-armv7m-base-offset"
#define AXSOC_BOOSTER_CPU_DESC_ARMV7M_IMEM_SIZE_KEY   "cpu-armv7m-imem-size"
#define AXSOC_BOOSTER_CPU_DESC_ARMV7M_DMEM_SIZE_KEY   "cpu-armv7m-dmem-size"
#define AXSOC_BOOSTER_CPU_DESC_ARMV7M_REGIONS_KEY     "cpu-armv7m-regions"

#define AXSOC_BOOSTER_CPU_DESC_XTENSA_OPTIONS_KEY  "cpu-xtensa-options"
#define AXSOC_BOOSTER_CPU_DESC_XTENSA_OCD_BASE_KEY "cpu-xtensa-ocd-base"
#define AXSOC_BOOSTER_CPU_DESC_XTENSA_REG_SIZE_KEY "cpu-xtensa-reg-size"
#define AXSOC_BOOSTER_CPU_DESC_XTENSA_NUM_BP_KEY   "cpu-xtensa-num-bp"
#define AXSOC_BOOSTER_CPU_DESC_XTENSA_NUM_WP_KEY   "cpu-xtensa-num-wp"
#define AXSOC_BOOSTER_CPU_DESC_XTENSA_NUM_INTR_KEY "cpu-xtensa-num-intr"
#define AXSOC_BOOSTER_CPU_DESC_XTENSA_DBG_INTR_KEY "cpu-xtensa-dbg-intr"

/* The region type is MemMapType_t enum */
#define AXSOC_BOOSTER_CPU_DESC_ARMV7M_REGION_TYPE_KEY         "armv7m-region-type"
#define AXSOC_BOOSTER_CPU_DESC_ARMV7M_REGION_BASE_ADDRESS_KEY "armv7m-region-base-address"
#define AXSOC_BOOSTER_CPU_DESC_ARMV7M_REGION_RANGE_KEY        "armv7m-region-range"
#define AXSOC_BOOSTER_CPU_DESC_ARMV7M_REGION_OFFSET_KEY       "armv7m-region-offset"
#define AXSOC_BOOSTER_CPU_DESC_ARMV7M_REGION_NAME_KEY         "armv7m-region-name"

/* The string to be used for the AXSOC_BOOSTER_CPU_DESC_ARMV7M_REGION_NAME_KEY */
#define ARMV7M_REGION_NAME_IMEM    "IMEM"
#define ARMV7M_REGION_NAME_DMEM    "DMEM"
#define ARMV7M_REGION_NAME_SCS     "SCS"
#define ARMV7M_REGION_NAME_DWT_FPB "DWT & FPB"
#define ARMV7M_REGION_NAME_MXWRAP  "MXWRAP"

#define AXSOC_BOOSTER_COMPLEX_DESC_NAME_KEY         "complex-name"
#define AXSOC_BOOSTER_COMPLEX_DESC_ID_KEY           "complex-id"
#define AXSOC_BOOSTER_COMPLEX_DESC_TYPE_KEY         "complex-type"
#define AXSOC_BOOSTER_COMPLEX_DESC_BASE_ADDRESS_KEY "complex-base-address"
#define AXSOC_BOOSTER_COMPLEX_DESC_CPM_OFFSET_KEY   "cpm-offset"
#define AXSOC_BOOSTER_COMPLEX_DESC_CPUS_KEY         "complex-cpus"

#define AXSOC_BOOSTER_COMPLEX_CPU_DESC_NAME_KEY "complex-cpu-name"
#define AXSOC_BOOSTER_COMPLEX_CPU_DESC_ID_KEY   "complex-cpu-id"

#define AXSOC_BOOSTER_DART_DESC_NAME_KEY         "dart-name"
#define AXSOC_BOOSTER_DART_DESC_BASE_ADDRESS_KEY "dart-base-address"
#define AXSOC_BOOSTER_DART_DESC_CPU_KEY          "dart-coastguarded-cpu"
#define AXSOC_BOOSTER_DART_DESC_TYPE_KEY         "dart-type"
#define AXSOC_BOOSTER_DART_CPU_SID_KEY           "dart-cpu-sid"
#define AXSOC_BOOSTER_DART_SUBSYSTEM_KEY         "dart-subsystem"
#define AXSOC_BOOSTER_DART_APF_KEY               "dart-apf-address"

// struct tc1500_desc_t
#define AXSOC_BOOSTER_TC1500_DESC_CHIP_INDEX_KEY "chip-index"
#define AXSOC_BOOSTER_TC1500_DESC_PSR_SIZE_KEY   "psr-size"
#define AXSOC_BOOSTER_TC1500_DESC_IR_CMDS_KEY    "ir-cmds"
#define AXSOC_BOOSTER_TC1500_DESC_BRIDGES_KEY    "bridges"

// struct tc1500_ir_desc_t
#define AXSOC_BOOSTER_TC1500_IR_DESC_WRSTN_PIPES_KEY   "wrstn-pipes"
#define AXSOC_BOOSTER_TC1500_IR_DESC_WRSTN_REG_KEY     "wrstn-reg"
#define AXSOC_BOOSTER_TC1500_IR_DESC_SEL_PARTITION_KEY "sel-partition"
#define AXSOC_BOOSTER_TC1500_IR_DESC_SEL_ACC_DR_KEY    "sel-acc-dr"
#define AXSOC_BOOSTER_TC1500_IR_DESC_J1500I_KEY        "j1500i"
#define AXSOC_BOOSTER_TC1500_IR_DESC_J1500I2_KEY       "j1500i2"
#define AXSOC_BOOSTER_TC1500_IR_DESC_J1500D_KEY        "j1500d"

// struct tc1500_bridge_desc_t
#define AXSOC_BOOSTER_TC1500_BRIDGE_DESC_BASE_KEY         "base"
#define AXSOC_BOOSTER_TC1500_BRIDGE_DESC_SPAN_KEY         "span"
#define AXSOC_BOOSTER_TC1500_BRIDGE_DESC_PSR_BIT_KEY      "psr-bit"
#define AXSOC_BOOSTER_TC1500_BRIDGE_DESC_TDI_WSI_KEY      "tdi-wsi"
#define AXSOC_BOOSTER_TC1500_BRIDGE_DESC_WIR_TDO_KEY      "wir-tdo"
#define AXSOC_BOOSTER_TC1500_BRIDGE_DESC_WIR2_TDO_KEY     "wir2-tdo"
#define AXSOC_BOOSTER_TC1500_BRIDGE_DESC_WDR_TDO_KEY      "wdr-tdo"
#define AXSOC_BOOSTER_TC1500_BRIDGE_DESC_ADDRESS_SIZE_KEY "address-size"
#define AXSOC_BOOSTER_TC1500_BRIDGE_DESC_DATA_SIZE_KEY    "data-size"
#define AXSOC_BOOSTER_TC1500_BRIDGE_DESC_APB_KEY          "apb-regs"
#define AXSOC_BOOSTER_TC1500_BRIDGE_DESC_AXI_KEY          "axi-regs"
#define AXSOC_BOOSTER_TC1500_BRIDGE_DESC_SPR_KEY          "spr-regs"

// struct tc1500_bridge_spr_desc_t
#define AXSOC_BOOSTER_TC1500_BRIDGE_SPR_DESC_WIR_SIZE_KEY           "wir-size"
#define AXSOC_BOOSTER_TC1500_BRIDGE_SPR_DESC_WIR_WIRSHIFTEN_KEY     "wir-wirshiften"
#define AXSOC_BOOSTER_TC1500_BRIDGE_SPR_DESC_WIR_WRSTN_KEY          "wir-wrstn"
#define AXSOC_BOOSTER_TC1500_BRIDGE_SPR_DESC_WIR_DPCSOC_KEY         "wir-dpcsoc"
#define AXSOC_BOOSTER_TC1500_BRIDGE_SPR_DESC_WRSTN_SIZE_KEY         "wrstn-size"
#define AXSOC_BOOSTER_TC1500_BRIDGE_SPR_DESC_WRSTN_DPCSOC_KEY       "wrstn-dpcsoc"
#define AXSOC_BOOSTER_TC1500_BRIDGE_SPR_DESC_DPB_SIZE_KEY           "dpb-size"
#define AXSOC_BOOSTER_TC1500_BRIDGE_SPR_DESC_DPB_MISC_ID_KEY        "dpb-misc-id"
#define AXSOC_BOOSTER_TC1500_BRIDGE_SPR_DESC_DPB_TPSER_ID_KEY       "dpb-tpser-id"
#define AXSOC_BOOSTER_TC1500_BRIDGE_SPR_DESC_MISC_SIZE_KEY          "misc-size"
#define AXSOC_BOOSTER_TC1500_BRIDGE_SPR_DESC_MISC_WIRTESTPORTEN_KEY "misc-wirtestporten"

// struct tc1500_bridge_dftpw_desc_t
#define AXSOC_BOOSTER_TC1500_BRIDGE_DFTPW_DESC_MASTER_SIZE_KEY       "master-size"
#define AXSOC_BOOSTER_TC1500_BRIDGE_DFTPW_DESC_MASTER_LOCALWRSTN_KEY "master-localwrstn"
#define AXSOC_BOOSTER_TC1500_BRIDGE_DFTPW_DESC_MASTER_DEBUG_KEY      "master-debug"
#define AXSOC_BOOSTER_TC1500_BRIDGE_DFTPW_DESC_LOCALWRSTN_SIZE_KEY   "localwrstn-size"
#define AXSOC_BOOSTER_TC1500_BRIDGE_DFTPW_DESC_LOCALWRSTN_DEBUG_KEY  "localwrstn-debug"
#define AXSOC_BOOSTER_TC1500_BRIDGE_DFTPW_DESC_DEBUG_SIZE_KEY        "debug-size"
#define AXSOC_BOOSTER_TC1500_BRIDGE_DFTPW_DESC_DEBUG_ACSR_KEY        "debug-acsr"

// struct tc1500_desc_t
#define AXSOC_BOOSTER_TC1500_DESC_CHIP_INDEX_KEY "chip-index"
#define AXSOC_BOOSTER_TC1500_DESC_PSR_SIZE_KEY   "psr-size"
#define AXSOC_BOOSTER_TC1500_DESC_IR_CMDS_KEY    "ir-cmds"
#define AXSOC_BOOSTER_TC1500_DESC_BRIDGES_KEY    "bridges"

// struct tc1500_ir_desc_t
#define AXSOC_BOOSTER_TC1500_IR_DESC_WRSTN_PIPES_KEY   "wrstn-pipes"
#define AXSOC_BOOSTER_TC1500_IR_DESC_WRSTN_REG_KEY     "wrstn-reg"
#define AXSOC_BOOSTER_TC1500_IR_DESC_SEL_PARTITION_KEY "sel-partition"
#define AXSOC_BOOSTER_TC1500_IR_DESC_SEL_ACC_DR_KEY    "sel-acc-dr"
#define AXSOC_BOOSTER_TC1500_IR_DESC_J1500I_KEY        "j1500i"
#define AXSOC_BOOSTER_TC1500_IR_DESC_J1500I2_KEY       "j1500i2"
#define AXSOC_BOOSTER_TC1500_IR_DESC_J1500D_KEY        "j1500d"

// struct tc1500_bridge_desc_t
#define AXSOC_BOOSTER_TC1500_BRIDGE_DESC_BASE_KEY         "base"
#define AXSOC_BOOSTER_TC1500_BRIDGE_DESC_SPAN_KEY         "span"
#define AXSOC_BOOSTER_TC1500_BRIDGE_DESC_PSR_BIT_KEY      "psr-bit"
#define AXSOC_BOOSTER_TC1500_BRIDGE_DESC_TDI_WSI_KEY      "tdi-wsi"
#define AXSOC_BOOSTER_TC1500_BRIDGE_DESC_WIR_TDO_KEY      "wir-tdo"
#define AXSOC_BOOSTER_TC1500_BRIDGE_DESC_WIR2_TDO_KEY     "wir2-tdo"
#define AXSOC_BOOSTER_TC1500_BRIDGE_DESC_WDR_TDO_KEY      "wdr-tdo"
#define AXSOC_BOOSTER_TC1500_BRIDGE_DESC_ADDRESS_SIZE_KEY "address-size"
#define AXSOC_BOOSTER_TC1500_BRIDGE_DESC_DATA_SIZE_KEY    "data-size"
#define AXSOC_BOOSTER_TC1500_BRIDGE_DESC_APB_KEY          "apb-regs"
#define AXSOC_BOOSTER_TC1500_BRIDGE_DESC_AXI_KEY          "axi-regs"
#define AXSOC_BOOSTER_TC1500_BRIDGE_DESC_SPR_KEY          "spr-regs"

// struct tc1500_bridge_spr_desc_t
#define AXSOC_BOOSTER_TC1500_BRIDGE_SPR_DESC_WIR_SIZE_KEY           "wir-size"
#define AXSOC_BOOSTER_TC1500_BRIDGE_SPR_DESC_WIR_WIRSHIFTEN_KEY     "wir-wirshiften"
#define AXSOC_BOOSTER_TC1500_BRIDGE_SPR_DESC_WIR_WRSTN_KEY          "wir-wrstn"
#define AXSOC_BOOSTER_TC1500_BRIDGE_SPR_DESC_WIR_DPCSOC_KEY         "wir-dpcsoc"
#define AXSOC_BOOSTER_TC1500_BRIDGE_SPR_DESC_WRSTN_SIZE_KEY         "wrstn-size"
#define AXSOC_BOOSTER_TC1500_BRIDGE_SPR_DESC_WRSTN_DPCSOC_KEY       "wrstn-dpcsoc"
#define AXSOC_BOOSTER_TC1500_BRIDGE_SPR_DESC_DPB_SIZE_KEY           "dpb-size"
#define AXSOC_BOOSTER_TC1500_BRIDGE_SPR_DESC_DPB_MISC_ID_KEY        "dpb-misc-id"
#define AXSOC_BOOSTER_TC1500_BRIDGE_SPR_DESC_DPB_TPSER_ID_KEY       "dpb-tpser-id"
#define AXSOC_BOOSTER_TC1500_BRIDGE_SPR_DESC_MISC_SIZE_KEY          "misc-size"
#define AXSOC_BOOSTER_TC1500_BRIDGE_SPR_DESC_MISC_WIRTESTPORTEN_KEY "misc-wirtestporten"

// struct tc1500_bridge_dftpw_desc_t
#define AXSOC_BOOSTER_TC1500_BRIDGE_DFTPW_DESC_MASTER_SIZE_KEY       "master-size"
#define AXSOC_BOOSTER_TC1500_BRIDGE_DFTPW_DESC_MASTER_LOCALWRSTN_KEY "master-localwrstn"
#define AXSOC_BOOSTER_TC1500_BRIDGE_DFTPW_DESC_MASTER_DEBUG_KEY      "master-debug"
#define AXSOC_BOOSTER_TC1500_BRIDGE_DFTPW_DESC_LOCALWRSTN_SIZE_KEY   "localwrstn-size"
#define AXSOC_BOOSTER_TC1500_BRIDGE_DFTPW_DESC_LOCALWRSTN_DEBUG_KEY  "localwrstn-debug"
#define AXSOC_BOOSTER_TC1500_BRIDGE_DFTPW_DESC_DEBUG_SIZE_KEY        "debug-size"
#define AXSOC_BOOSTER_TC1500_BRIDGE_DFTPW_DESC_DEBUG_ACSR_KEY        "debug-acsr"

/*!
 * @function AXbooster_interface_create_soc
 * @abstract C Interface for loading the SOC_t
 * @discussion This function MUST be implemented in your booster, as it will be used to
 * load the booster. This interface function must create an instance of your
 * SOC_t subclass via new and it must return a pointer to this instance.
 */
SOC_t *AXbooster_interface_create_soc(AXchip_t *chip);

__END_DECLS

#endif /* _ASTRIS_BOOSTER_API_CPU_H */
