1*ce099b40Smartin /* $NetBSD: cache_sh4.h,v 1.12 2008/04/28 20:23:35 martin Exp $ */ 2e63a9777Such 3e63a9777Such /*- 4e63a9777Such * Copyright (c) 2002 The NetBSD Foundation, Inc. 5e63a9777Such * All rights reserved. 6e63a9777Such * 7e63a9777Such * This code is derived from software contributed to The NetBSD Foundation 8e63a9777Such * by UCHIYAMA Yasushi. 9e63a9777Such * 10e63a9777Such * Redistribution and use in source and binary forms, with or without 11e63a9777Such * modification, are permitted provided that the following conditions 12e63a9777Such * are met: 13e63a9777Such * 1. Redistributions of source code must retain the above copyright 14e63a9777Such * notice, this list of conditions and the following disclaimer. 15e63a9777Such * 2. Redistributions in binary form must reproduce the above copyright 16e63a9777Such * notice, this list of conditions and the following disclaimer in the 17e63a9777Such * documentation and/or other materials provided with the distribution. 18e63a9777Such * 19e63a9777Such * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20e63a9777Such * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21e63a9777Such * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22e63a9777Such * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23e63a9777Such * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24e63a9777Such * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25e63a9777Such * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26e63a9777Such * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27e63a9777Such * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28e63a9777Such * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29e63a9777Such * POSSIBILITY OF SUCH DAMAGE. 30e63a9777Such */ 31e63a9777Such 32e63a9777Such /* 3363fcf30bSchristos * SH4: SH7750 SH7750S SH7750R SH7751 SH7751R 34e63a9777Such */ 35e63a9777Such 3693da9db9Such #ifndef _SH3_CACHE_SH4_H_ 3793da9db9Such #define _SH3_CACHE_SH4_H_ 38bbc655c4Such #include <sh3/devreg.h> 39e63a9777Such #ifdef _KERNEL 40e63a9777Such 41e63a9777Such #define SH4_ICACHE_SIZE 8192 42e63a9777Such #define SH4_DCACHE_SIZE 16384 43ba180bf7Snonaka #define SH4_EMODE_ICACHE_SIZE 16384 44ba180bf7Snonaka #define SH4_EMODE_DCACHE_SIZE 32768 45e63a9777Such #define SH4_CACHE_LINESZ 32 46e63a9777Such 47a96c1d0eSuch #define SH4_CCR 0xff00001c 4863fcf30bSchristos #define SH4_CCR_EMODE 0x80000000 49e63a9777Such #define SH4_CCR_IIX 0x00008000 50e63a9777Such #define SH4_CCR_ICI 0x00000800 51e63a9777Such #define SH4_CCR_ICE 0x00000100 52e63a9777Such #define SH4_CCR_OIX 0x00000080 53e63a9777Such #define SH4_CCR_ORA 0x00000020 54e63a9777Such #define SH4_CCR_OCI 0x00000008 55e63a9777Such #define SH4_CCR_CB 0x00000004 56e63a9777Such #define SH4_CCR_WT 0x00000002 57e63a9777Such #define SH4_CCR_OCE 0x00000001 58e63a9777Such 59a96c1d0eSuch #define SH4_QACR0 0xff000038 60a96c1d0eSuch #define SH4_QACR1 0xff00003c 61e63a9777Such #define SH4_QACR_AREA_SHIFT 2 62e63a9777Such #define SH4_QACR_AREA_MASK 0x0000001c 63e63a9777Such 64e63a9777Such /* I-cache address/data array */ 65a96c1d0eSuch #define SH4_CCIA 0xf0000000 66e63a9777Such /* address specification */ 67e63a9777Such #define CCIA_A 0x00000008 /* associate bit */ 68e63a9777Such #define CCIA_ENTRY_SHIFT 5 /* line size 32B */ 69e63a9777Such #define CCIA_ENTRY_MASK 0x00001fe0 /* [12:5] 256-entries */ 70ba180bf7Snonaka #define CCIA_EMODE_ENTRY_MASK 0x00003fe0 /* [13:5] 512-entries */ 71e63a9777Such /* data specification */ 72e63a9777Such #define CCIA_V 0x00000001 73e63a9777Such #define CCIA_TAGADDR_MASK 0xfffffc00 /* [31:10] */ 74e63a9777Such 75a96c1d0eSuch #define SH4_CCID 0xf1000000 76e63a9777Such /* address specification */ 77e63a9777Such #define CCID_L_SHIFT 2 78e63a9777Such #define CCID_L_MASK 0x1c /* line-size is 32B */ 79ba180bf7Snonaka #define CCID_ENTRY_MASK 0x00001fe0 /* [12:5] 256-entries */ 80e63a9777Such 81e63a9777Such /* D-cache address/data array */ 82a96c1d0eSuch #define SH4_CCDA 0xf4000000 83e63a9777Such /* address specification */ 84e63a9777Such #define CCDA_A 0x00000008 /* associate bit */ 85e63a9777Such #define CCDA_ENTRY_SHIFT 5 /* line size 32B */ 86ba180bf7Snonaka #define CCDA_ENTRY_MASK 0x00003fe0 /* [13:5] 512-entries */ 87e63a9777Such /* data specification */ 88e63a9777Such #define CCDA_V 0x00000001 89e63a9777Such #define CCDA_U 0x00000002 90e63a9777Such #define CCDA_TAGADDR_MASK 0xfffffc00 /* [31:10] */ 91e63a9777Such 92a96c1d0eSuch #define SH4_CCDD 0xf5000000 93e63a9777Such 94e63a9777Such /* Store Queue */ 95a96c1d0eSuch #define SH4_SQ 0xe0000000 96e63a9777Such 97e63a9777Such /* 98e63a9777Such * cache flush macro for locore level code. 99e63a9777Such */ 100e63a9777Such #define SH4_CACHE_FLUSH() \ 101e63a9777Such do { \ 102970e24eeSuwe uint32_t __e, __a; \ 103e63a9777Such \ 104e63a9777Such /* D-cache */ \ 105f3987f5dSnonaka for (__e = 0; __e < (SH4_DCACHE_SIZE / SH4_CACHE_LINESZ); __e++) {\ 106a96c1d0eSuch __a = SH4_CCDA | (__e << CCDA_ENTRY_SHIFT); \ 10750a256a3Sperry (*(volatile uint32_t *)__a) &= ~(CCDA_U | CCDA_V); \ 108e63a9777Such } \ 109e63a9777Such /* I-cache */ \ 110f3987f5dSnonaka for (__e = 0; __e < (SH4_ICACHE_SIZE / SH4_CACHE_LINESZ); __e++) {\ 111a96c1d0eSuch __a = SH4_CCIA | (__e << CCIA_ENTRY_SHIFT); \ 11250a256a3Sperry (*(volatile uint32_t *)__a) &= ~(CCIA_V); \ 113ba180bf7Snonaka } \ 114ba180bf7Snonaka } while(/*CONSTCOND*/0) 115ba180bf7Snonaka 116ba180bf7Snonaka #define SH4_EMODE_CACHE_FLUSH() \ 117ba180bf7Snonaka do { \ 118ba180bf7Snonaka uint32_t __e, __a; \ 119ba180bf7Snonaka \ 120ba180bf7Snonaka /* D-cache */ \ 121ba180bf7Snonaka for (__e = 0;__e < (SH4_EMODE_DCACHE_SIZE / SH4_CACHE_LINESZ);__e++) {\ 122ba180bf7Snonaka __a = SH4_CCDA | (__e << CCDA_ENTRY_SHIFT); \ 12350a256a3Sperry (*(volatile uint32_t *)__a) &= ~(CCDA_U | CCDA_V); \ 124ba180bf7Snonaka } \ 125ba180bf7Snonaka /* I-cache */ \ 126ba180bf7Snonaka for (__e = 0;__e < (SH4_EMODE_ICACHE_SIZE / SH4_CACHE_LINESZ);__e++) {\ 127ba180bf7Snonaka __a = SH4_CCIA | (__e << CCIA_ENTRY_SHIFT); \ 12850a256a3Sperry (*(volatile uint32_t *)__a) &= ~(CCIA_V); \ 129e63a9777Such } \ 130e63a9777Such } while(/*CONSTCOND*/0) 131e63a9777Such 132e63a9777Such #define SH7750_CACHE_FLUSH() SH4_CACHE_FLUSH() 133e63a9777Such #define SH7750S_CACHE_FLUSH() SH4_CACHE_FLUSH() 13463fcf30bSchristos #define SH7751_CACHE_FLUSH() SH4_CACHE_FLUSH() 135ba180bf7Snonaka #if defined(SH4_CACHE_DISABLE_EMODE) 136ba180bf7Snonaka #define SH7750R_CACHE_FLUSH() SH4_CACHE_FLUSH() 13763fcf30bSchristos #define SH7751R_CACHE_FLUSH() SH4_CACHE_FLUSH() 138ba180bf7Snonaka #else 139ba180bf7Snonaka #define SH7750R_CACHE_FLUSH() SH4_EMODE_CACHE_FLUSH() 140ba180bf7Snonaka #define SH7751R_CACHE_FLUSH() SH4_EMODE_CACHE_FLUSH() 141ba180bf7Snonaka #endif 14263fcf30bSchristos 143e63a9777Such #ifndef _LOCORE 144a96c1d0eSuch extern void sh4_cache_config(void); 145e63a9777Such #endif 146e63a9777Such #endif /* _KERNEL */ 14793da9db9Such #endif /* !_SH3_CACHE_SH4_H_ */ 148