/**
 * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD
 *
 *  SPDX-License-Identifier: Apache-2.0
 */
#pragma once

#include <stdint.h>
#include "soc/soc.h"
#ifdef __cplusplus
extern "C" {
#endif

/** XTS_AES_PLAIN_MEM register
 *  The memory that stores plaintext
 */
#define XTS_AES_PLAIN_MEM (DR_REG_XTS_AES_BASE + 0x0)
#define XTS_AES_PLAIN_MEM_SIZE_BYTES 16

/** XTS_AES_LINESIZE_REG register
 *  XTS-AES line-size register
 */
#define XTS_AES_LINESIZE_REG (DR_REG_XTS_AES_BASE + 0x40)
/** XTS_AES_LINESIZE : R/W; bitpos: [0]; default: 0;
 *  This bit stores the line size parameter. 0: 16Byte, 1: 32Byte.
 */
#define XTS_AES_LINESIZE    (BIT(0))
#define XTS_AES_LINESIZE_M  (XTS_AES_LINESIZE_V << XTS_AES_LINESIZE_S)
#define XTS_AES_LINESIZE_V  0x00000001U
#define XTS_AES_LINESIZE_S  0

/** XTS_AES_DESTINATION_REG register
 *  XTS-AES destination register
 */
#define XTS_AES_DESTINATION_REG (DR_REG_XTS_AES_BASE + 0x44)
/** XTS_AES_DESTINATION : R/W; bitpos: [0]; default: 0;
 *  This bit stores the destination. 0: flash(default). 1: reserved.
 */
#define XTS_AES_DESTINATION    (BIT(0))
#define XTS_AES_DESTINATION_M  (XTS_AES_DESTINATION_V << XTS_AES_DESTINATION_S)
#define XTS_AES_DESTINATION_V  0x00000001U
#define XTS_AES_DESTINATION_S  0

/** XTS_AES_PHYSICAL_ADDRESS_REG register
 *  XTS-AES physical address register
 */
#define XTS_AES_PHYSICAL_ADDRESS_REG (DR_REG_XTS_AES_BASE + 0x48)
/** XTS_AES_PHYSICAL_ADDRESS : R/W; bitpos: [29:0]; default: 0;
 *  Those bits stores the physical address. If linesize is 16-byte, the physical
 *  address should be aligned of 16 bytes. If linesize is 32-byte, the physical address
 *  should be aligned of 32 bytes.
 */
#define XTS_AES_PHYSICAL_ADDRESS    0x3FFFFFFFU
#define XTS_AES_PHYSICAL_ADDRESS_M  (XTS_AES_PHYSICAL_ADDRESS_V << XTS_AES_PHYSICAL_ADDRESS_S)
#define XTS_AES_PHYSICAL_ADDRESS_V  0x3FFFFFFFU
#define XTS_AES_PHYSICAL_ADDRESS_S  0

/** XTS_AES_TRIGGER_REG register
 *  XTS-AES trigger register
 */
#define XTS_AES_TRIGGER_REG (DR_REG_XTS_AES_BASE + 0x4c)
/** XTS_AES_TRIGGER : WT; bitpos: [0]; default: 0;
 *  Set this bit to start manual encryption calculation
 */
#define XTS_AES_TRIGGER    (BIT(0))
#define XTS_AES_TRIGGER_M  (XTS_AES_TRIGGER_V << XTS_AES_TRIGGER_S)
#define XTS_AES_TRIGGER_V  0x00000001U
#define XTS_AES_TRIGGER_S  0

/** XTS_AES_RELEASE_REG register
 *  XTS-AES release register
 */
#define XTS_AES_RELEASE_REG (DR_REG_XTS_AES_BASE + 0x50)
/** XTS_AES_RELEASE : WT; bitpos: [0]; default: 0;
 *  Set this bit to release the manual encrypted result, after that the result will be
 *  visible to spi
 */
#define XTS_AES_RELEASE    (BIT(0))
#define XTS_AES_RELEASE_M  (XTS_AES_RELEASE_V << XTS_AES_RELEASE_S)
#define XTS_AES_RELEASE_V  0x00000001U
#define XTS_AES_RELEASE_S  0

/** XTS_AES_DESTROY_REG register
 *  XTS-AES destroy register
 */
#define XTS_AES_DESTROY_REG (DR_REG_XTS_AES_BASE + 0x54)
/** XTS_AES_DESTROY : WT; bitpos: [0]; default: 0;
 *  Set this bit to destroy XTS-AES result.
 */
#define XTS_AES_DESTROY    (BIT(0))
#define XTS_AES_DESTROY_M  (XTS_AES_DESTROY_V << XTS_AES_DESTROY_S)
#define XTS_AES_DESTROY_V  0x00000001U
#define XTS_AES_DESTROY_S  0

/** XTS_AES_STATE_REG register
 *  XTS-AES status register
 */
#define XTS_AES_STATE_REG (DR_REG_XTS_AES_BASE + 0x58)
/** XTS_AES_STATE : RO; bitpos: [1:0]; default: 0;
 *  Those bits shows XTS-AES status. 0=IDLE, 1=WORK, 2=RELEASE, 3=USE. IDLE means that
 *  XTS-AES is idle. WORK means that XTS-AES is busy with calculation. RELEASE means
 *  the encrypted result is generated but not visible to mspi. USE means that the
 *  encrypted result is visible to mspi.
 */
#define XTS_AES_STATE    0x00000003U
#define XTS_AES_STATE_M  (XTS_AES_STATE_V << XTS_AES_STATE_S)
#define XTS_AES_STATE_V  0x00000003U
#define XTS_AES_STATE_S  0

/** XTS_AES_DATE_REG register
 *  XTS-AES version control register
 */
#define XTS_AES_DATE_REG (DR_REG_XTS_AES_BASE + 0x5c)
/** XTS_AES_DATE : R/W; bitpos: [29:0]; default: 538969635;
 *  Those bits stores the version information of XTS-AES.
 */
#define XTS_AES_DATE    0x3FFFFFFFU
#define XTS_AES_DATE_M  (XTS_AES_DATE_V << XTS_AES_DATE_S)
#define XTS_AES_DATE_V  0x3FFFFFFFU
#define XTS_AES_DATE_S  0

/* For backward compatability with the older register names */
#define AES_XTS_PLAIN_BASE          XTS_AES_PLAIN_MEM
#define AES_XTS_SIZE_REG            XTS_AES_LINESIZE_REG
#define AES_XTS_DESTINATION_REG     XTS_AES_DESTINATION_REG
#define AES_XTS_PHYSICAL_ADDR_REG   XTS_AES_PHYSICAL_ADDRESS_REG
#define AES_XTS_TRIGGER_REG         XTS_AES_TRIGGER_REG
#define AES_XTS_RELEASE_REG         XTS_AES_RELEASE_REG
#define AES_XTS_DESTROY_REG         XTS_AES_DESTROY_REG
#define AES_XTS_STATE_REG           XTS_AES_STATE_REG
#define AES_XTS_DATE_REG            XTS_AES_DATE_REG

#ifdef __cplusplus
}
#endif
