1/* MN10300 CPU cache invalidation routines, using automatic purge registers
2 *
3 * Copyright (C) 2011 Red Hat, Inc. All Rights Reserved.
4 * Written by David Howells (dhowells@redhat.com)
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public Licence
8 * as published by the Free Software Foundation; either version
9 * 2 of the Licence, or (at your option) any later version.
10 */
11#include <linux/sys.h>
12#include <linux/linkage.h>
13#include <asm/cache.h>
14#include <asm/irqflags.h>
15#include <asm/cacheflush.h>
16#include "cache.inc"
17
18	.am33_2
19
20	.globl	debugger_local_cache_flushinv_one
21
22###############################################################################
23#
24# void debugger_local_cache_flushinv_one(u8 *addr)
25#
26# Invalidate one particular cacheline if it's in the icache
27#
28###############################################################################
29	ALIGN
30	.globl	debugger_local_cache_flushinv_one
31	.type	debugger_local_cache_flushinv_one,@function
32debugger_local_cache_flushinv_one:
33	mov	d0,a1
34
35	mov	CHCTR,a0
36	movhu	(a0),d0
37	btst	CHCTR_ICEN,d0
38	beq	mn10300_local_icache_inv_range_reg_end
39
40	LOCAL_CLI_SAVE(d1)
41
42	mov	ICIVCR,a0
43
44	# wait for the invalidator to quiesce
45	setlb
46	mov	(a0),d0
47	btst	ICIVCR_ICIVBSY,d0
48	lne
49
50	# set the mask
51	mov	~L1_CACHE_TAG_MASK,d0
52	mov	d0,(ICIVMR)
53
54	# invalidate the cache line at the given address
55	and	~L1_CACHE_TAG_MASK,a1
56	or	ICIVCR_ICI,a1
57	mov	a1,(a0)
58
59	# wait for the invalidator to quiesce again
60	setlb
61	mov	(a0),d0
62	btst	ICIVCR_ICIVBSY,d0
63	lne
64
65	LOCAL_IRQ_RESTORE(d1)
66
67mn10300_local_icache_inv_range_reg_end:
68	ret	[],0
69	.size	debugger_local_cache_flushinv_one,.-debugger_local_cache_flushinv_one
70