⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mmu_cache.s

📁 PowerPC 8240 的ucosII 移植代码 开发平台为 DiabData
💻 S
字号:
#
# file: mmu_cache.s
#
# PowerPC Setup the BATS and cache 
# for UCOS-II
#
# Author: Ernie Price
# eprice@bitwise.net
#
#########################################################################
        .text
        .align  2

        .global BAT_Enable
        .global InitSRs
        .global ClearBATs
        .global IcachEnable
        .global DcachEnable


HID0    =       1008
        HID0_ICE     = 0x00008000
        HID0_DCE     = 0x00004000
        HID0_ILOCK   = 0x00002000
        HID0_DLOCK   = 0x00001000
        HID0_ICFI    = 0x00000800
        HID0_DCFI    = 0x00000400

#
#       We enable Block Address Translation so that we can have data and/or instruction
#       caching active but not in regions where there are physical devices.  The mapping
#       is one to one in that we directly map logical to physical addresses for
#       both instruction and data.
#
BAT_0_VAL       .equ    0x00000000      # DRAM for a max of 256 Mb
BAT_1_VAL       .equ    0xe0000000      # PCI mapping (can extend into 0xfxxxxxx)
BAT_2_VAL       .equ    0x70000000      # Extended ROM regions on 8241/8245
BAT_3_VAL       .equ    0xf0000000      # ROM and some 8-bit devices for 256 MB

DBATS = 1                               # 1 == use data address translation
IBATS = 0                               # 1 == use inst address translation

PS128K  .equ 000000000000b
PS256K  .equ 000000000001b
PS512K  .equ 000000000011b
PS1M    .equ 000000000111b
PS2M    .equ 000000001111b
PS4M    .equ 000000011111b
PS8M    .equ 000000111111b
PS16M   .equ 000001111111b
PS32M   .equ 000011111111b
PS64M   .equ 000111111111b
PS128M  .equ 001111111111b
PS256M  .equ 011111111111b
PA_W    .equ 01000000b                  # Write through
PA_I    .equ 00100000b                  # Inhibit caching
PA_M    .equ 00010000b                  # Memory Coherency
PA_G    .equ 00001000b                  # Guarded
NO_ACCESS       .equ 00b
READ_ONLY       .equ 01b
READ_WRITE      .equ 10b

        macro BATVALUE  eabase, size, realbase, attrib
        .uword          eabase   | (size << 2) | 3
        .uword          realbase | attrib | READ_WRITE
        endm

        macro           loadbat whichbat
        lwzu            r4, 4(r3)
        mtspr           whichbat&&U, r4
        lwzu            r4, 4(r3)
        mtspr           whichbat&&L, r4
        endm

###############################################################################
#
#       Load the Block Address Translation registers
#
BAT_Enable:
        mflr    r30

        bl      batload         # branch around the values getting the
                                # address of the values in LR

        .uword  0               # dummy because lwzu increments first
.if DBATS == 1
        BATVALUE        BAT_0_VAL, PS256M, BAT_0_VAL, PA_M
        BATVALUE        BAT_1_VAL, PS256M, BAT_1_VAL, <PA_I | PA_G>
        BATVALUE        BAT_2_VAL, PS256M, BAT_2_VAL, <PA_I | PA_G>
        BATVALUE        BAT_3_VAL, PS256M, BAT_3_VAL, <PA_I | PA_G>
.endif
.if IBATS == 1
        BATVALUE        BAT_0_VAL, PS256M, BAT_0_VAL, 0
        BATVALUE        BAT_1_VAL, PS256M, BAT_1_VAL, PA_I
        BATVALUE        BAT_2_VAL, PS256M, BAT_2_VAL, PA_I
        BATVALUE        BAT_3_VAL, PS256M, BAT_3_VAL, PA_I
.endif

batload:
        mflr    r3

        tvalue  .set 0
.if DBATS == 1
        tvalue .set  tvalue | 0x10      # enable Data Translation
        loadbat         DBAT0
        loadbat         DBAT1
        loadbat         DBAT2
        loadbat         DBAT3
.endif
.if IBATS == 1
        tvalue .set tvalue | 0x20       # enable Instruction Translation
        loadbat         IBAT0
        loadbat         IBAT1
        loadbat         IBAT2
        loadbat         IBAT3
.endif

.if tvalue 
        mfmsr   r3
        ori     r3,r3, tvalue           # Enable translation
        mtmsr   r3
.endif

        mtlr            r30
        blr

###############################################################################
#
#       Clear the Block Address Translation registers
#
        .align  2
ClearBATs:

batld   macro   wbat
        mtspr   wbat&&U, r3     
#       sync
        mtspr   wbat&&L, r3     
#       sync
        endm

        li      r3, 0
        
        batld   IBAT0
        batld   IBAT1
        batld   IBAT2
        batld   IBAT3
        batld   DBAT0
        batld   DBAT1
        batld   DBAT2
        batld   DBAT3
#
        blr

###############################################################################
#
#       Initialize the Segment Registers
#
InitSRs:
#
sreg    macro   reg
        mtsr    reg, r3
#       sync
        addi    r3, r3, 1
        endm

        lis     r3, 0x2000              # SR0 value

        sreg    sr0                     # Load SR0
        sreg    sr1                     # Load SR1
        sreg    sr2                     # Load SR2
        sreg    sr3                     # Load SR3
        sreg    sr4                     # Load SR4
        sreg    sr5                     # Load SR5
        sreg    sr6                     # Load SR6
        sreg    sr7                     # Load SR7
        sreg    sr8                     # Load SR8
        sreg    sr9                     # Load SR9
        sreg    sr10                    # Load SR10
        sreg    sr11                    # Load SR11
        sreg    sr12                    # Load SR12
        sreg    sr13                    # Load SR13
        sreg    sr14                    # Load SR14
        sreg    sr15                    # Load SR15

        blr

###############################################################################
#
#       Common initialize macro for enabling cache
#
cacheEnab       macro   enab, inval, lock

        mfspr   r3, HID0                # get HID0
        andi.   r4, r3, enab            # if it is already ON
        bne     done\@                  #    branch to done

        li      r4, inval               # invalidate bit
        or      r5, r3, r4              # merge invalidate bit to r5
        andc    r4, r3, r4              # reset invalidate bit in r4

        isync
        mtspr   HID0, r5                # write HID0 with inval on

        isync
        mtspr   HID0, r4                # write HID0 with inval off

        li      r3, lock                # lock bit
        andc    r3, r4, r3              # reset lock bit
        isync
        mtspr   HID0, r3                # write HID0 with lock off

        ori     r3, r3, enab
        isync
        mtspr   HID0, r3                # with enab on
done\@:
        blr
        endm

###############################################################################
#
#       Enable instruction caching
#
IcachEnable:

        cacheEnab       HID0_ICE, HID0_ICFI, HID0_ILOCK

###############################################################################
#
#       Enable data caching
#
DcachEnable:

        cacheEnab       HID0_DCE, HID0_DCFI, HID0_DLOCK

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -