123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- /*
- * Copyright (c) 2008-2012, Freescale Semiconductor, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * o Redistributions of source code must retain the above copyright notice, this list
- * of conditions and the following disclaimer.
- *
- * o Redistributions in binary form must reproduce the above copyright notice, this
- * list of conditions and the following disclaimer in the documentation and/or
- * other materials provided with the distribution.
- *
- * o Neither the name of Freescale Semiconductor, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from this
- * software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
- * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- //! @addtogroup diag_mmu
- //! @{
- /*!
- * @file mmu.h
- * @brief System memory arrangement.
- */
- #ifndef _MMU_H_
- #define _MMU_H_
- #include "sdk.h"
- ////////////////////////////////////////////////////////////////////////////////
- // Definitions
- ////////////////////////////////////////////////////////////////////////////////
- //! @brief Memory region attributes.
- typedef enum _mmu_memory_type
- {
- kStronglyOrdered,
- kDevice,
- kOuterInner_WB_WA,
- kOuterInner_WT,
- kNoncacheable,
- } mmu_memory_type_t;
- //! @brief Memory region shareability options.
- typedef enum _mmu_shareability
- {
- kShareable = 1,
- kNonshareable = 0
- } mmu_shareability_t;
- //! @brief Access permissions for a memory region.
- typedef enum _mmu_access
- {
- kNoAccess,
- kROAccess,
- kRWAccess
- } mmu_access_t;
- ////////////////////////////////////////////////////////////////////////////////
- // Prototypes
- ////////////////////////////////////////////////////////////////////////////////
- #if defined(__cplusplus)
- extern "C" {
- #endif
- /*!
- * @brief Enable the MMU.
- *
- * The L1 page tables and MMU settings must have already been configured by
- * calling mmu_init() before the MMU is enabled.
- */
- void mmu_enable();
- /*!
- * @brief Disable the MMU.
- */
- void mmu_disable();
- /*!
- * @brief Set up the default first-level page table.
- *
- * Initializes the L1 page table with the following regions:
- * - 0x00000000...0x00900000 : ROM and peripherals, strongly-ordered
- * - 0x00900000...0x00a00000 : OCRAM, strongly-ordered
- * - For MX6DQ or MX6SDL: 0x10000000...0x90000000 : DDR, normal, outer inner, write-back, write-allocate
- * - For MX6SL: 0x80000000...0xc0000000 : DDR, normal, outer inner, write-back, write-allocate
- *
- * If the CPU is participating in SMP, then the DDR regions are made shareable. Otherwise they
- * are marked as non-shareable.
- *
- * The TTBR0 register is set to the base of the L1 table.
- *
- * All memory domains are configured to allow client access. However, note that only domain 0 is
- * used by mmu_map_l1_range().
- */
- void mmu_init();
- /*!
- * @brief Maps a range of memory in the first-level page table.
- *
- * Entries in the first-level page table are filled in for the range of virtual addresses
- * starting at @a va and continuing for @a length bytes. These virtual addreses are mapped
- * to the physical addresses starting at @a pa and continuing for @a length bytes. All table
- * entries for the range of mapped memory have the same attributes, which are selected with
- * the @a memoryType, @a isShareable, and @a access parameters.
- *
- * @param pa The base physical address of the range to which the virtual address will be mapped.
- * @param va The base virtual address of the range.
- * @param length The size of the range to be mapped, in bytes. This value must be divisible by 1MB.
- * @param memoryType The type of the memory region. This controls caching, buffering, ordering of
- * memory accesses, and other attributes of the region.
- * @param isShareable The shareability of the physical memory. Ignored for strongly-ordered memory.
- * @param access Access permissions.
- */
- void mmu_map_l1_range(uint32_t pa, uint32_t va, uint32_t length, mmu_memory_type_t memoryType, mmu_shareability_t isShareable, mmu_access_t access);
- /*!
- * @brief Convert virtual address to physical.
- *
- * First attempts a priviledged read translation for the current security mode. If that fails,
- * a priviledged write translation, also for the current security mode, is attempted. If this
- * second attempt at translation fails, then false will be returned.
- *
- * @param virtualAddress Virtual address to convert to a physical address.
- * @param[out] physicalAddress This parameter is filled in with the physical address corresponding
- * to the virtual address passed in @a virtualAddress.
- * @retval true The address returned through @a physicalAddress is valid.
- * @retval false The conversion failed for some reason.
- */
- bool mmu_virtual_to_physical(uint32_t virtualAddress, uint32_t * physicalAddress);
- #if defined(__cplusplus)
- }
- #endif
- //! @}
- #endif // _MMU_H_
- ////////////////////////////////////////////////////////////////////////////////
- // EOF
- ////////////////////////////////////////////////////////////////////////////////
|