/****************************************************************************
 * arch/xtensa/src/esp32/esp32_spiram.h
 *
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.  The
 * ASF licenses this file to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance with the
 * License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 * License for the specific language governing permissions and limitations
 * under the License.
 *
 ****************************************************************************/

/****************************************************************************
 * Included Files
 ****************************************************************************/

#ifndef __ARCH_XTENSA_SRC_ESP32_ESP32_SPIRAM_H
#define __ARCH_XTENSA_SRC_ESP32_ESP32_SPIRAM_H

#include <stddef.h>
#include <stdint.h>
#include <stdbool.h>
#include "xtensa_attr.h"

/****************************************************************************
 * Pre-processor Definitions
 ****************************************************************************/

#define ESP_SPIRAM_SIZE_16MBITS   0   /* SPI RAM size is 16 MBits */
#define ESP_SPIRAM_SIZE_32MBITS   1   /* SPI RAM size is 32 MBits */
#define ESP_SPIRAM_SIZE_64MBITS   2   /* SPI RAM size is 64 MBits */
#define ESP_SPIRAM_SIZE_INVALID   3   /* SPI RAM size is invalid  */

/* Errors that can be returned by cache_sram_* */

#define MMU_SET_ADDR_ALIGNED_ERROR 1
#define MMU_SET_PAGE_SIZE_ERROR    3
#define MMU_SET_VADDR_OUT_RANGE    5

#define PROCACHE_MMU_ADDR_BASE     0x3FF10000
#define APPCACHE_MMU_ADDR_BASE     0x3FF12000

/* sram address */

#define PRO_DRAM1_START_ADDR       0x3F800000
#define PRO_DRAM1_END_ADDR(psize)  (PRO_DRAM1_START_ADDR + ((psize) << 17))

/* cache mmu register file address */

#define CACHE_MMU_ADDRESS_BASE(cpu_no) ((cpu_no) ? (APPCACHE_MMU_ADDR_BASE) :\
                                        (PROCACHE_MMU_ADDR_BASE))

/* virtual address, physical address check */

#define ADDRESS_CHECK(addr,psize) (((addr) & (0xFFFF >>((64/(psize))-1))) != 0)

/* CPU number check */

#define CPU_NUMBER_CHECK(cpu_no)  (((cpu_no)<0) || ((cpu_no)>1))

/* PID check */

#define PID_CHECK(pid)  (((pid)<0) || ((pid)>7))

/* flash MMU edge check (flash size default : 16*1024 K) */

#define FLASH_MMU_EDGE_CHECK(mmu_val,num) (((mmu_val) + (num)) > 256)

/* sram MMU edge check (sram size default : 8*1024 K) */

#define SRAM_MMU_EDGE_CHECK(mmu_val,num,psize) (((mmu_val) + (num)) > ((8*1024)/(psize)))

/****************************************************************************
 * Public Functions Prototypes
 ****************************************************************************/

/* Description: get SPI RAM size
 * return
 *   - ESP_SPIRAM_SIZE_INVALID if SPI RAM not enabled or not valid
 *   - SPI RAM size
 */

int esp_spiram_get_chip_size(void);

/* Description: Initialize spiram interface/hardware. Normally called from
 *              cpu_start.c.
 *
 * return:
 *   OK on success
 */

int esp_spiram_init(void);

/* Description: Configure Cache/MMU for access to external SPI RAM.
 *
 * Normally this function is called from cpu_start, if
 * CONFIG_ESP32_SPIRAM_BOOT_INIT option is enabled. Applications which need
 * to enable SPI RAM at run time can disable CONFIG_ESP32_SPIRAM_BOOT_INIT,
 * and call this function later.
 *
 * Attention this function must be called with flash cache disabled.
 */

void esp_spiram_init_cache(void);

/* Description: Memory test for SPI RAM. Should be called after SPI RAM is
 *              initialized and (in case of a dual-core system) the app CPU
 *              is online. This test overwrites the memory with crap, so do
 *              not call after e.g. the heap allocator has stored important
 *              stuff in SPI RAM.
 *
 * return:
 *   true on success, false on failed memory test
 */

bool esp_spiram_test(void);

/* Description Add the initialized SPI RAM to the heap allocator. */

int esp_spiram_add_to_heapalloc(void);

/* Description: Get the size of the attached SPI RAM chip selected in
 *              menuconfig
 *
 * return:
 *   Size in bytes, or 0 if no external RAM chip support compiled in.
 */

size_t esp_spiram_get_size(void);

/* Description: Force a writeback of the data in the SPI RAM cache. This is
 * to be called whenever cache is disabled, because disabling cache on the
 * ESP32 discards the data in the SPI RAM cache.
 *
 * This is meant for use from within the SPI flash code.
 */

void esp_spiram_writeback_cache(void);

/* Description: Reserve a pool of internal memory for specific DMA/internal
 *              allocations.
 *
 * param:
 *   size   Size of reserved pool in bytes
 *
 * return:
 *          - ESP_OK on success
 *          - ESP_ERR_NO_MEM when no memory available for pool
 */

int esp_spiram_reserve_dma_pool(size_t size);

/* Description: If SPI RAM(PSRAM) has been initialized
 *
 * return:
 *   - true SPI RAM has been initialized successfully
 *   - false SPI RAM hasn't been initialized or initialized failed
 */

bool esp_spiram_is_initialized(void);

/* Description: Set Ext-SRAM-Cache mmu mapping.
 *
 * Note that this code lives in IRAM and has a bugfix in respect to the
 * ROM version of this function (which erroneously refused a vaddr > 2MiB
 *
 * param:
 *   int cpu_no : CPU number, 0 for PRO cpu, 1 for APP cpu.
 *   int pod : process identifier. Range 0~7.
 *   unsigned int vaddr : virtual address in CPU address space.
 *                        Can be IRam0, IRam1, IRom0 and DRom0 memory
 *                        address.
 *                        Should be aligned by psize.
 *
 *   unsigned int paddr : physical address in Ext-SRAM.
 *                        Should be aligned by psize.
 *   int psize : page size of flash, in kilobytes. Should be 32 here.
 *   int num : pages to be set.
 *
 *   unsigned int: error status
 *             0 : mmu set success
 *             1 : vaddr or paddr is not aligned
 *             2 : pid error
 *             3 : psize error
 *             4 : mmu table to be written is out of range
 *             5 : vaddr is out of range
 */

unsigned int IRAM_ATTR
  cache_sram_mmu_set(int cpu_no, int pid, unsigned int vaddr,
                     unsigned int paddr, int psize, int num);

#endif /* __ARCH_XTENSA_SRC_ESP32_ESP32_SPIRAM_H */
