|  | /* MN10300 CPU core caching macros -*- asm -*- | 
|  | * | 
|  | * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. | 
|  | * Written by David Howells (dhowells@redhat.com) | 
|  | * | 
|  | * This program is free software; you can redistribute it and/or | 
|  | * modify it under the terms of the GNU General Public Licence | 
|  | * as published by the Free Software Foundation; either version | 
|  | * 2 of the Licence, or (at your option) any later version. | 
|  | */ | 
|  |  | 
|  |  | 
|  | ############################################################################### | 
|  | # | 
|  | # Invalidate the instruction cache. | 
|  | #	A0: Should hold CHCTR | 
|  | #	D0: Should have been read from CHCTR | 
|  | #	D1: Will be clobbered | 
|  | # | 
|  | # On some cores it is necessary to disable the icache whilst we do this. | 
|  | # | 
|  | ############################################################################### | 
|  | .macro invalidate_icache,disable_irq | 
|  |  | 
|  | #if defined(CONFIG_AM33_2) || defined(CONFIG_AM33_3) | 
|  | .if \disable_irq | 
|  | # don't want an interrupt routine seeing a disabled cache | 
|  | mov	epsw,d1 | 
|  | and	~EPSW_IE,epsw | 
|  | or	EPSW_NMID,epsw | 
|  | nop | 
|  | nop | 
|  | .endif | 
|  |  | 
|  | # disable the icache | 
|  | and	~CHCTR_ICEN,d0 | 
|  | movhu	d0,(a0) | 
|  |  | 
|  | # and wait for it to calm down | 
|  | setlb | 
|  | movhu	(a0),d0 | 
|  | btst	CHCTR_ICBUSY,d0 | 
|  | lne | 
|  |  | 
|  | # invalidate | 
|  | or	CHCTR_ICINV,d0 | 
|  | movhu	d0,(a0) | 
|  |  | 
|  | # wait for the cache to finish | 
|  | setlb | 
|  | movhu	(a0),d0 | 
|  | btst	CHCTR_ICBUSY,d0 | 
|  | lne | 
|  |  | 
|  | # and reenable it | 
|  | or	CHCTR_ICEN,d0 | 
|  | movhu	d0,(a0) | 
|  | movhu	(a0),d0 | 
|  |  | 
|  | .if \disable_irq | 
|  | LOCAL_IRQ_RESTORE(d1) | 
|  | .endif | 
|  |  | 
|  | #else /* CONFIG_AM33_2 || CONFIG_AM33_3 */ | 
|  |  | 
|  | # invalidate | 
|  | or	CHCTR_ICINV,d0 | 
|  | movhu	d0,(a0) | 
|  | movhu	(a0),d0 | 
|  |  | 
|  | #endif /* CONFIG_AM33_2 || CONFIG_AM33_3 */ | 
|  | .endm | 
|  |  | 
|  | ############################################################################### | 
|  | # | 
|  | # Invalidate the data cache. | 
|  | #	A0: Should hold CHCTR | 
|  | #	D0: Should have been read from CHCTR | 
|  | #	D1: Will be clobbered | 
|  | # | 
|  | # On some cores it is necessary to disable the dcache whilst we do this. | 
|  | # | 
|  | ############################################################################### | 
|  | .macro invalidate_dcache,disable_irq | 
|  |  | 
|  | #if defined(CONFIG_AM33_2) || defined(CONFIG_AM33_3) | 
|  | .if \disable_irq | 
|  | # don't want an interrupt routine seeing a disabled cache | 
|  | mov	epsw,d1 | 
|  | and	~EPSW_IE,epsw | 
|  | or	EPSW_NMID,epsw | 
|  | nop | 
|  | nop | 
|  | .endif | 
|  |  | 
|  | # disable the dcache | 
|  | and	~CHCTR_DCEN,d0 | 
|  | movhu	d0,(a0) | 
|  |  | 
|  | # and wait for it to calm down | 
|  | setlb | 
|  | movhu	(a0),d0 | 
|  | btst	CHCTR_DCBUSY,d0 | 
|  | lne | 
|  |  | 
|  | # invalidate | 
|  | or	CHCTR_DCINV,d0 | 
|  | movhu	d0,(a0) | 
|  |  | 
|  | # wait for the cache to finish | 
|  | setlb | 
|  | movhu	(a0),d0 | 
|  | btst	CHCTR_DCBUSY,d0 | 
|  | lne | 
|  |  | 
|  | # and reenable it | 
|  | or	CHCTR_DCEN,d0 | 
|  | movhu	d0,(a0) | 
|  | movhu	(a0),d0 | 
|  |  | 
|  | .if \disable_irq | 
|  | LOCAL_IRQ_RESTORE(d1) | 
|  | .endif | 
|  |  | 
|  | #else /* CONFIG_AM33_2 || CONFIG_AM33_3 */ | 
|  |  | 
|  | # invalidate | 
|  | or	CHCTR_DCINV,d0 | 
|  | movhu	d0,(a0) | 
|  | movhu	(a0),d0 | 
|  |  | 
|  | #endif /* CONFIG_AM33_2 || CONFIG_AM33_3 */ | 
|  | .endm |