blob: c2bf24f40177ddce6ce472d75735a04b26e426fd [file] [log] [blame]
Catalin Marinas33f663f2010-03-24 16:46:52 +01001/*
2 * arch/arm/include/asm/outercache.h
3 *
4 * Copyright (C) 2010 ARM Ltd.
5 * Written by Catalin Marinas <catalin.marinas@arm.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */
20
21#ifndef __ASM_OUTERCACHE_H
22#define __ASM_OUTERCACHE_H
23
Will Deaconad6b9c92011-02-15 12:41:49 +010024#include <linux/types.h>
25
Tomasz Figac6d1a2d2015-01-08 07:51:07 +010026struct l2x0_regs;
27
Catalin Marinas33f663f2010-03-24 16:46:52 +010028struct outer_cache_fns {
29 void (*inv_range)(unsigned long, unsigned long);
30 void (*clean_range)(unsigned long, unsigned long);
31 void (*flush_range)(unsigned long, unsigned long);
Thomas Gleixnerae360a72010-07-31 21:06:06 +053032 void (*flush_all)(void);
Thomas Gleixnerae360a72010-07-31 21:06:06 +053033 void (*disable)(void);
Catalin Marinas319f5512010-03-24 16:47:53 +010034#ifdef CONFIG_OUTER_CACHE_SYNC
35 void (*sync)(void);
36#endif
Barry Song91c2ebb2011-09-30 14:43:12 +010037 void (*resume)(void);
Russell King8abd2592014-03-16 17:38:08 +000038
39 /* This is an ARM L2C thing */
Russell King8abd2592014-03-16 17:38:08 +000040 void (*write_sec)(unsigned long, unsigned);
Tomasz Figac6d1a2d2015-01-08 07:51:07 +010041 void (*configure)(const struct l2x0_regs *);
Catalin Marinas33f663f2010-03-24 16:46:52 +010042};
43
Catalin Marinas33f663f2010-03-24 16:46:52 +010044extern struct outer_cache_fns outer_cache;
45
Rob Herring0b53c112013-08-17 20:12:57 -050046#ifdef CONFIG_OUTER_CACHE
Russell Kingbc4f94d2014-03-16 10:52:55 +000047/**
48 * outer_inv_range - invalidate range of outer cache lines
49 * @start: starting physical address, inclusive
50 * @end: end physical address, exclusive
51 */
Will Deaconad6b9c92011-02-15 12:41:49 +010052static inline void outer_inv_range(phys_addr_t start, phys_addr_t end)
Catalin Marinas33f663f2010-03-24 16:46:52 +010053{
54 if (outer_cache.inv_range)
55 outer_cache.inv_range(start, end);
56}
Russell Kingbc4f94d2014-03-16 10:52:55 +000057
58/**
59 * outer_clean_range - clean dirty outer cache lines
60 * @start: starting physical address, inclusive
61 * @end: end physical address, exclusive
62 */
Will Deaconad6b9c92011-02-15 12:41:49 +010063static inline void outer_clean_range(phys_addr_t start, phys_addr_t end)
Catalin Marinas33f663f2010-03-24 16:46:52 +010064{
65 if (outer_cache.clean_range)
66 outer_cache.clean_range(start, end);
67}
Russell Kingbc4f94d2014-03-16 10:52:55 +000068
69/**
70 * outer_flush_range - clean and invalidate outer cache lines
71 * @start: starting physical address, inclusive
72 * @end: end physical address, exclusive
73 */
Will Deaconad6b9c92011-02-15 12:41:49 +010074static inline void outer_flush_range(phys_addr_t start, phys_addr_t end)
Catalin Marinas33f663f2010-03-24 16:46:52 +010075{
76 if (outer_cache.flush_range)
77 outer_cache.flush_range(start, end);
78}
79
Russell Kingbc4f94d2014-03-16 10:52:55 +000080/**
81 * outer_flush_all - clean and invalidate all cache lines in the outer cache
82 *
83 * Note: depending on implementation, this may not be atomic - it must
84 * only be called with interrupts disabled and no other active outer
85 * cache masters.
86 *
87 * It is intended that this function is only used by implementations
88 * needing to override the outer_cache.disable() method due to security.
89 * (Some implementations perform this as a clean followed by an invalidate.)
90 */
Thomas Gleixnerae360a72010-07-31 21:06:06 +053091static inline void outer_flush_all(void)
92{
93 if (outer_cache.flush_all)
94 outer_cache.flush_all();
95}
96
Russell Kingbc4f94d2014-03-16 10:52:55 +000097/**
98 * outer_disable - clean, invalidate and disable the outer cache
99 *
100 * Disable the outer cache, ensuring that any data contained in the outer
101 * cache is pushed out to lower levels of system memory. The note and
102 * conditions above concerning outer_flush_all() applies here.
103 */
Russell King1f1d5b72014-03-16 13:14:38 +0000104extern void outer_disable(void);
Thomas Gleixnerae360a72010-07-31 21:06:06 +0530105
Russell Kingbc4f94d2014-03-16 10:52:55 +0000106/**
107 * outer_resume - restore the cache configuration and re-enable outer cache
108 *
109 * Restore any configuration that the cache had when previously enabled,
110 * and re-enable the outer cache.
111 */
Barry Song91c2ebb2011-09-30 14:43:12 +0100112static inline void outer_resume(void)
113{
114 if (outer_cache.resume)
115 outer_cache.resume();
116}
117
Catalin Marinas33f663f2010-03-24 16:46:52 +0100118#else
119
Will Deaconad6b9c92011-02-15 12:41:49 +0100120static inline void outer_inv_range(phys_addr_t start, phys_addr_t end)
Catalin Marinas33f663f2010-03-24 16:46:52 +0100121{ }
Will Deaconad6b9c92011-02-15 12:41:49 +0100122static inline void outer_clean_range(phys_addr_t start, phys_addr_t end)
Catalin Marinas33f663f2010-03-24 16:46:52 +0100123{ }
Will Deaconad6b9c92011-02-15 12:41:49 +0100124static inline void outer_flush_range(phys_addr_t start, phys_addr_t end)
Catalin Marinas33f663f2010-03-24 16:46:52 +0100125{ }
Thomas Gleixnerae360a72010-07-31 21:06:06 +0530126static inline void outer_flush_all(void) { }
Thomas Gleixnerae360a72010-07-31 21:06:06 +0530127static inline void outer_disable(void) { }
Barry Song4e79a622013-02-04 07:46:57 +0100128static inline void outer_resume(void) { }
Catalin Marinas33f663f2010-03-24 16:46:52 +0100129
130#endif
131
Catalin Marinas33f663f2010-03-24 16:46:52 +0100132#endif /* __ASM_OUTERCACHE_H */