/* 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