|
@@ -0,0 +1,133 @@
|
|
|
|
+/* 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
|