blob: 3ae3e27aa8852490957503cc066cba5e53601e83 [file] [log] [blame]
/****************************************************************************
* 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 */