forked from luck/tmp_suning_uos_patched
bdee0e793c
The Cache Control Register (CACR) of the ColdFire V3 has bits that control high level caching functions, and also enable/disable the use of the alternate stack pointer register (the EUSP bit) to provide separate supervisor and user stack pointer registers. The code as it is today will blindly clear the EUSP bit on cache actions like invalidation. So it is broken for this case - and that will result in failed booting (interrupt entry and exit processing will be completely hosed). This only affects ColdFire V3 parts that support the alternate stack register (like the 5329 for example) - generally speaking new parts do, older parts don't. It has no impact on ColdFire V3 parts with the single stack pointer, like the 5307 for example. Fix the cache bit defines used, so they maintain the EUSP bit when carrying out cache actions through the CACR register. Signed-off-by: Greg Ungerer <gerg@linux-m68k.org>
103 lines
3.6 KiB
C
103 lines
3.6 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/****************************************************************************/
|
|
|
|
/*
|
|
* m53xxacr.h -- ColdFire version 3 core cache support
|
|
*
|
|
* (C) Copyright 2010, Greg Ungerer <gerg@snapgear.com>
|
|
*/
|
|
|
|
/****************************************************************************/
|
|
#ifndef m53xxacr_h
|
|
#define m53xxacr_h
|
|
/****************************************************************************/
|
|
|
|
/*
|
|
* All varients of the ColdFire using version 3 cores have a similar
|
|
* cache setup. They have a unified instruction and data cache, with
|
|
* configurable write-through or copy-back operation.
|
|
*/
|
|
|
|
/*
|
|
* Define the Cache Control register flags.
|
|
*/
|
|
#define CACR_EC 0x80000000 /* Enable cache */
|
|
#define CACR_ESB 0x20000000 /* Enable store buffer */
|
|
#define CACR_DPI 0x10000000 /* Disable invalidation by CPUSHL */
|
|
#define CACR_HLCK 0x08000000 /* Half cache lock mode */
|
|
#define CACR_CINVA 0x01000000 /* Invalidate cache */
|
|
#define CACR_DNFB 0x00000400 /* Inhibited fill buffer */
|
|
#define CACR_DCM_WT 0x00000000 /* Cacheable write-through */
|
|
#define CACR_DCM_CB 0x00000100 /* Cacheable copy-back */
|
|
#define CACR_DCM_PRE 0x00000200 /* Cache inhibited, precise */
|
|
#define CACR_DCM_IMPRE 0x00000300 /* Cache inhibited, imprecise */
|
|
#define CACR_WPROTECT 0x00000020 /* Write protect*/
|
|
#define CACR_EUSP 0x00000010 /* Eanble separate user a7 */
|
|
|
|
/*
|
|
* Define the Access Control register flags.
|
|
*/
|
|
#define ACR_BASE_POS 24 /* Address Base (upper 8 bits) */
|
|
#define ACR_MASK_POS 16 /* Address Mask (next 8 bits) */
|
|
#define ACR_ENABLE 0x00008000 /* Enable this ACR */
|
|
#define ACR_USER 0x00000000 /* Allow only user accesses */
|
|
#define ACR_SUPER 0x00002000 /* Allow supervisor access only */
|
|
#define ACR_ANY 0x00004000 /* Allow any access type */
|
|
#define ACR_CM_WT 0x00000000 /* Cacheable, write-through */
|
|
#define ACR_CM_CB 0x00000020 /* Cacheable, copy-back */
|
|
#define ACR_CM_PRE 0x00000040 /* Cache inhibited, precise */
|
|
#define ACR_CM_IMPRE 0x00000060 /* Cache inhibited, imprecise */
|
|
#define ACR_WPROTECT 0x00000004 /* Write protect region */
|
|
|
|
/*
|
|
* Define the cache type and arrangement (needed for pushes).
|
|
*/
|
|
#if defined(CONFIG_M5307)
|
|
#define CACHE_SIZE 0x2000 /* 8k of unified cache */
|
|
#define ICACHE_SIZE CACHE_SIZE
|
|
#define DCACHE_SIZE CACHE_SIZE
|
|
#elif defined(CONFIG_M53xx)
|
|
#define CACHE_SIZE 0x4000 /* 16k of unified cache */
|
|
#define ICACHE_SIZE CACHE_SIZE
|
|
#define DCACHE_SIZE CACHE_SIZE
|
|
#endif
|
|
|
|
#define CACHE_LINE_SIZE 16 /* 16 byte line size */
|
|
#define CACHE_WAYS 4 /* 4 ways - set associative */
|
|
|
|
/*
|
|
* Set the cache controller settings we will use. This default in the
|
|
* CACR is cache inhibited, we use the ACR register to set cacheing
|
|
* enabled on the regions we want (eg RAM).
|
|
*/
|
|
#if defined(CONFIG_CACHE_COPYBACK)
|
|
#define CACHE_TYPE ACR_CM_CB
|
|
#define CACHE_PUSH
|
|
#else
|
|
#define CACHE_TYPE ACR_CM_WT
|
|
#endif
|
|
|
|
#ifdef CONFIG_COLDFIRE_SW_A7
|
|
#define CACHE_MODE (CACR_EC + CACR_ESB + CACR_DCM_PRE)
|
|
#else
|
|
#define CACHE_MODE (CACR_EC + CACR_ESB + CACR_DCM_PRE + CACR_EUSP)
|
|
#endif
|
|
|
|
/*
|
|
* Unified cache means we will never need to flush for coherency of
|
|
* instruction fetch. We will need to flush to maintain memory/DMA
|
|
* coherency though in all cases. And for copyback caches we will need
|
|
* to push cached data as well.
|
|
*/
|
|
#define CACHE_INIT (CACHE_MODE + CACR_CINVA - CACR_EC)
|
|
#define CACHE_INVALIDATE (CACHE_MODE + CACR_CINVA)
|
|
#define CACHE_INVALIDATED (CACHE_MODE + CACR_CINVA)
|
|
|
|
#define ACR0_MODE ((CONFIG_RAMBASE & 0xff000000) + \
|
|
(0x000f0000) + \
|
|
(ACR_ENABLE + ACR_ANY + CACHE_TYPE))
|
|
#define ACR1_MODE 0
|
|
|
|
/****************************************************************************/
|
|
#endif /* m53xxsim_h */
|