linux/arch/mn10300/mm/cache-dbg-flush-by-reg.S
<<
>>
Prefs
   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/smp.h>
  14#include <asm/page.h>
  15#include <asm/cache.h>
  16#include <asm/irqflags.h>
  17#include <asm/cacheflush.h>
  18#include "cache.inc"
  19
  20        .am33_2
  21
  22###############################################################################
  23#
  24# void debugger_local_cache_flushinv(void)
  25# Flush the entire data cache back to RAM and invalidate the icache
  26#
  27###############################################################################
  28        ALIGN
  29        .globl  debugger_local_cache_flushinv
  30        .type   debugger_local_cache_flushinv,@function
  31debugger_local_cache_flushinv:
  32        #
  33        # firstly flush the dcache
  34        #
  35        movhu   (CHCTR),d0
  36        btst    CHCTR_DCEN|CHCTR_ICEN,d0
  37        beq     debugger_local_cache_flushinv_end
  38
  39        mov     DCPGCR,a0
  40
  41        mov     epsw,d1
  42        and     ~EPSW_IE,epsw
  43        or      EPSW_NMID,epsw
  44        nop
  45
  46        btst    CHCTR_DCEN,d0
  47        beq     debugger_local_cache_flushinv_no_dcache
  48
  49        # wait for busy bit of area purge
  50        setlb
  51        mov     (a0),d0
  52        btst    DCPGCR_DCPGBSY,d0
  53        lne
  54
  55        # set mask
  56        clr     d0
  57        mov     d0,(DCPGMR)
  58
  59        # area purge
  60        #
  61        # DCPGCR = DCPGCR_DCP
  62        #
  63        mov     DCPGCR_DCP,d0
  64        mov     d0,(a0)
  65
  66        # wait for busy bit of area purge
  67        setlb
  68        mov     (a0),d0
  69        btst    DCPGCR_DCPGBSY,d0
  70        lne
  71
  72debugger_local_cache_flushinv_no_dcache:
  73        #
  74        # secondly, invalidate the icache if it is enabled
  75        #
  76        mov     CHCTR,a0
  77        movhu   (a0),d0
  78        btst    CHCTR_ICEN,d0
  79        beq     debugger_local_cache_flushinv_done
  80
  81        invalidate_icache 0
  82
  83debugger_local_cache_flushinv_done:
  84        mov     d1,epsw
  85
  86debugger_local_cache_flushinv_end:
  87        ret     [],0
  88        .size   debugger_local_cache_flushinv,.-debugger_local_cache_flushinv
  89
  90###############################################################################
  91#
  92# void debugger_local_cache_flushinv_one(u8 *addr)
  93#
  94# Invalidate one particular cacheline if it's in the icache
  95#
  96###############################################################################
  97        ALIGN
  98        .globl  debugger_local_cache_flushinv_one
  99        .type   debugger_local_cache_flushinv_one,@function
 100debugger_local_cache_flushinv_one:
 101        movhu   (CHCTR),d1
 102        btst    CHCTR_DCEN|CHCTR_ICEN,d1
 103        beq     debugger_local_cache_flushinv_one_end
 104        btst    CHCTR_DCEN,d1
 105        beq     debugger_local_cache_flushinv_one_no_dcache
 106
 107        # round cacheline addr down
 108        and     L1_CACHE_TAG_MASK,d0
 109        mov     d0,a1
 110        mov     d0,d1
 111
 112        # determine the dcache purge control reg address
 113        mov     DCACHE_PURGE(0,0),a0
 114        and     L1_CACHE_TAG_ENTRY,d0
 115        add     d0,a0
 116
 117        # retain valid entries in the cache
 118        or      L1_CACHE_TAG_VALID,d1
 119
 120        # conditionally purge this line in all ways
 121        mov     d1,(L1_CACHE_WAYDISP*0,a0)
 122
 123debugger_local_cache_flushinv_one_no_dcache:
 124        #
 125        # now try to flush the icache
 126        #
 127        mov     CHCTR,a0
 128        movhu   (a0),d0
 129        btst    CHCTR_ICEN,d0
 130        beq     debugger_local_cache_flushinv_one_end
 131
 132        LOCAL_CLI_SAVE(d1)
 133
 134        mov     ICIVCR,a0
 135
 136        # wait for the invalidator to quiesce
 137        setlb
 138        mov     (a0),d0
 139        btst    ICIVCR_ICIVBSY,d0
 140        lne
 141
 142        # set the mask
 143        mov     L1_CACHE_TAG_MASK,d0
 144        mov     d0,(ICIVMR)
 145
 146        # invalidate the cache line at the given address
 147        or      ICIVCR_ICI,a1
 148        mov     a1,(a0)
 149
 150        # wait for the invalidator to quiesce again
 151        setlb
 152        mov     (a0),d0
 153        btst    ICIVCR_ICIVBSY,d0
 154        lne
 155
 156        LOCAL_IRQ_RESTORE(d1)
 157
 158debugger_local_cache_flushinv_one_end:
 159        ret     [],0
 160        .size   debugger_local_cache_flushinv_one,.-debugger_local_cache_flushinv_one
 161