| /* |
| * Copyright (C) 2002 Wolfgang Denk <wd@denx.de> |
| * |
| * See file CREDITS for list of people who contributed to this |
| * project. |
| * |
| * This program is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU General Public License as |
| * published by the Free Software Foundation; either version 2 of |
| * the License, or (at your option) any later version. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program; if not, write to the Free Software |
| * Foundation, Inc., 59 Temple Place, Suite 330, Boston, |
| * MA 02111-1307 USA |
| */ |
| |
| #include <config.h> |
| |
| #if defined(CONFIG_MPC823) || \ |
| defined(CONFIG_MPC850) || \ |
| defined(CONFIG_MPC855) || \ |
| defined(CONFIG_MPC860) || \ |
| defined(CONFIG_MPC862) |
| |
| #include <post.h> |
| #include <ppc_asm.tmpl> |
| #include <ppc_defs.h> |
| #include <asm/cache.h> |
| |
| #if CONFIG_POST & CFG_POST_CACHE |
| |
| .text |
| |
| cache_post_dinvalidate: |
| lis r10, IDC_INVALL@h |
| mtspr DC_CST, r10 |
| blr |
| |
| cache_post_iinvalidate: |
| lis r10, IDC_INVALL@h |
| mtspr IC_CST, r10 |
| isync |
| blr |
| |
| cache_post_ddisable: |
| lis r10, IDC_DISABLE@h |
| mtspr DC_CST, r10 |
| blr |
| |
| cache_post_dwb: |
| lis r10, IDC_ENABLE@h |
| mtspr DC_CST, r10 |
| lis r10, DC_CFWT@h |
| mtspr DC_CST, r10 |
| blr |
| |
| cache_post_dwt: |
| lis r10, IDC_ENABLE@h |
| mtspr DC_CST, r10 |
| lis r10, DC_SFWT@h |
| mtspr DC_CST, r10 |
| blr |
| |
| cache_post_idisable: |
| lis r10, IDC_DISABLE@h |
| mtspr IC_CST, r10 |
| isync |
| blr |
| |
| cache_post_ienable: |
| lis r10, IDC_ENABLE@h |
| mtspr IC_CST, r10 |
| isync |
| blr |
| |
| cache_post_iunlock: |
| lis r10, IDC_UNALL@h |
| mtspr IC_CST, r10 |
| isync |
| blr |
| |
| cache_post_ilock: |
| mtspr IC_ADR, r3 |
| lis r10, IDC_LDLCK@h |
| mtspr IC_CST, r10 |
| isync |
| blr |
| |
| /* |
| * turn on the data cache |
| * switch the data cache to write-back or write-through mode |
| * invalidate the data cache |
| * write the negative pattern to a cached area |
| * read the area |
| * |
| * The negative pattern must be read at the last step |
| */ |
| .global cache_post_test1 |
| cache_post_test1: |
| mflr r0 |
| stw r0, 4(r1) |
| |
| stwu r3, -4(r1) |
| stwu r4, -4(r1) |
| |
| bl cache_post_dwb |
| bl cache_post_dinvalidate |
| |
| /* Write the negative pattern to the test area */ |
| lwz r0, 0(r1) |
| mtctr r0 |
| li r0, 0xff |
| lwz r3, 4(r1) |
| subi r3, r3, 1 |
| 1: |
| stbu r0, 1(r3) |
| bdnz 1b |
| |
| /* Read the test area */ |
| lwz r0, 0(r1) |
| mtctr r0 |
| lwz r4, 4(r1) |
| subi r4, r4, 1 |
| li r3, 0 |
| 1: |
| lbzu r0, 1(r4) |
| cmpli cr0, r0, 0xff |
| beq 2f |
| li r3, -1 |
| b 3f |
| 2: |
| bdnz 1b |
| 3: |
| |
| bl cache_post_ddisable |
| bl cache_post_dinvalidate |
| |
| addi r1, r1, 8 |
| |
| lwz r0, 4(r1) |
| mtlr r0 |
| blr |
| |
| /* |
| * turn on the data cache |
| * switch the data cache to write-back or write-through mode |
| * invalidate the data cache |
| * write the zero pattern to a cached area |
| * turn off the data cache |
| * write the negative pattern to the area |
| * turn on the data cache |
| * read the area |
| * |
| * The negative pattern must be read at the last step |
| */ |
| .global cache_post_test2 |
| cache_post_test2: |
| mflr r0 |
| stw r0, 4(r1) |
| |
| stwu r3, -4(r1) |
| stwu r4, -4(r1) |
| |
| bl cache_post_dwb |
| bl cache_post_dinvalidate |
| |
| /* Write the zero pattern to the test area */ |
| lwz r0, 0(r1) |
| mtctr r0 |
| li r0, 0 |
| lwz r3, 4(r1) |
| subi r3, r3, 1 |
| 1: |
| stbu r0, 1(r3) |
| bdnz 1b |
| |
| bl cache_post_ddisable |
| |
| /* Write the negative pattern to the test area */ |
| lwz r0, 0(r1) |
| mtctr r0 |
| li r0, 0xff |
| lwz r3, 4(r1) |
| subi r3, r3, 1 |
| 1: |
| stbu r0, 1(r3) |
| bdnz 1b |
| |
| bl cache_post_dwb |
| |
| /* Read the test area */ |
| lwz r0, 0(r1) |
| mtctr r0 |
| lwz r4, 4(r1) |
| subi r4, r4, 1 |
| li r3, 0 |
| 1: |
| lbzu r0, 1(r4) |
| cmpli cr0, r0, 0xff |
| beq 2f |
| li r3, -1 |
| b 3f |
| 2: |
| bdnz 1b |
| 3: |
| |
| bl cache_post_ddisable |
| bl cache_post_dinvalidate |
| |
| addi r1, r1, 8 |
| |
| lwz r0, 4(r1) |
| mtlr r0 |
| blr |
| |
| /* |
| * turn on the data cache |
| * switch the data cache to write-through mode |
| * invalidate the data cache |
| * write the zero pattern to a cached area |
| * flush the data cache |
| * write the negative pattern to the area |
| * turn off the data cache |
| * read the area |
| * |
| * The negative pattern must be read at the last step |
| */ |
| .global cache_post_test3 |
| cache_post_test3: |
| mflr r0 |
| stw r0, 4(r1) |
| |
| stwu r3, -4(r1) |
| stwu r4, -4(r1) |
| |
| bl cache_post_ddisable |
| bl cache_post_dinvalidate |
| |
| /* Write the zero pattern to the test area */ |
| lwz r0, 0(r1) |
| mtctr r0 |
| li r0, 0 |
| lwz r3, 4(r1) |
| subi r3, r3, 1 |
| 1: |
| stbu r0, 1(r3) |
| bdnz 1b |
| |
| bl cache_post_dwt |
| bl cache_post_dinvalidate |
| |
| /* Write the negative pattern to the test area */ |
| lwz r0, 0(r1) |
| mtctr r0 |
| li r0, 0xff |
| lwz r3, 4(r1) |
| subi r3, r3, 1 |
| 1: |
| stbu r0, 1(r3) |
| bdnz 1b |
| |
| bl cache_post_ddisable |
| bl cache_post_dinvalidate |
| |
| /* Read the test area */ |
| lwz r0, 0(r1) |
| mtctr r0 |
| lwz r4, 4(r1) |
| subi r4, r4, 1 |
| li r3, 0 |
| 1: |
| lbzu r0, 1(r4) |
| cmpli cr0, r0, 0xff |
| beq 2f |
| li r3, -1 |
| b 3f |
| 2: |
| bdnz 1b |
| 3: |
| |
| addi r1, r1, 8 |
| |
| lwz r0, 4(r1) |
| mtlr r0 |
| blr |
| |
| /* |
| * turn on the data cache |
| * switch the data cache to write-back mode |
| * invalidate the data cache |
| * write the negative pattern to a cached area |
| * flush the data cache |
| * write the zero pattern to the area |
| * invalidate the data cache |
| * read the area |
| * |
| * The negative pattern must be read at the last step |
| */ |
| .global cache_post_test4 |
| cache_post_test4: |
| mflr r0 |
| stw r0, 4(r1) |
| |
| stwu r3, -4(r1) |
| stwu r4, -4(r1) |
| |
| bl cache_post_ddisable |
| bl cache_post_dinvalidate |
| |
| /* Write the negative pattern to the test area */ |
| lwz r0, 0(r1) |
| mtctr r0 |
| li r0, 0xff |
| lwz r3, 4(r1) |
| subi r3, r3, 1 |
| 1: |
| stbu r0, 1(r3) |
| bdnz 1b |
| |
| bl cache_post_dwb |
| bl cache_post_dinvalidate |
| |
| /* Write the zero pattern to the test area */ |
| lwz r0, 0(r1) |
| mtctr r0 |
| li r0, 0 |
| lwz r3, 4(r1) |
| subi r3, r3, 1 |
| 1: |
| stbu r0, 1(r3) |
| bdnz 1b |
| |
| bl cache_post_ddisable |
| bl cache_post_dinvalidate |
| |
| /* Read the test area */ |
| lwz r0, 0(r1) |
| mtctr r0 |
| lwz r4, 4(r1) |
| subi r4, r4, 1 |
| li r3, 0 |
| 1: |
| lbzu r0, 1(r4) |
| cmpli cr0, r0, 0xff |
| beq 2f |
| li r3, -1 |
| b 3f |
| 2: |
| bdnz 1b |
| 3: |
| |
| addi r1, r1, 8 |
| |
| lwz r0, 4(r1) |
| mtlr r0 |
| blr |
| |
| cache_post_test5_1: |
| li r3, 0 |
| cache_post_test5_2: |
| li r3, -1 |
| |
| /* |
| * turn on the instruction cache |
| * unlock the entire instruction cache |
| * invalidate the instruction cache |
| * lock a branch instruction in the instruction cache |
| * replace the branch instruction with "nop" |
| * jump to the branch instruction |
| * check that the branch instruction was executed |
| */ |
| .global cache_post_test5 |
| cache_post_test5: |
| mflr r0 |
| stw r0, 4(r1) |
| |
| bl cache_post_ienable |
| bl cache_post_iunlock |
| bl cache_post_iinvalidate |
| |
| /* Compute r9 = cache_post_test5_reloc */ |
| bl cache_post_test5_reloc |
| cache_post_test5_reloc: |
| mflr r9 |
| |
| /* Copy the test instruction to cache_post_test5_data */ |
| lis r3, (cache_post_test5_1 - cache_post_test5_reloc)@h |
| ori r3, r3, (cache_post_test5_1 - cache_post_test5_reloc)@l |
| add r3, r3, r9 |
| lis r4, (cache_post_test5_data - cache_post_test5_reloc)@h |
| ori r4, r4, (cache_post_test5_data - cache_post_test5_reloc)@l |
| add r4, r4, r9 |
| lwz r0, 0(r3) |
| stw r0, 0(r4) |
| |
| bl cache_post_iinvalidate |
| |
| /* Lock the branch instruction */ |
| lis r3, (cache_post_test5_data - cache_post_test5_reloc)@h |
| ori r3, r3, (cache_post_test5_data - cache_post_test5_reloc)@l |
| add r3, r3, r9 |
| bl cache_post_ilock |
| |
| /* Replace the test instruction */ |
| lis r3, (cache_post_test5_2 - cache_post_test5_reloc)@h |
| ori r3, r3, (cache_post_test5_2 - cache_post_test5_reloc)@l |
| add r3, r3, r9 |
| lis r4, (cache_post_test5_data - cache_post_test5_reloc)@h |
| ori r4, r4, (cache_post_test5_data - cache_post_test5_reloc)@l |
| add r4, r4, r9 |
| lwz r0, 0(r3) |
| stw r0, 0(r4) |
| |
| bl cache_post_iinvalidate |
| |
| /* Execute to the test instruction */ |
| cache_post_test5_data: |
| nop |
| |
| bl cache_post_iunlock |
| |
| lwz r0, 4(r1) |
| mtlr r0 |
| blr |
| |
| cache_post_test6_1: |
| li r3, -1 |
| cache_post_test6_2: |
| li r3, 0 |
| |
| /* |
| * turn on the instruction cache |
| * unlock the entire instruction cache |
| * invalidate the instruction cache |
| * lock a branch instruction in the instruction cache |
| * replace the branch instruction with "nop" |
| * jump to the branch instruction |
| * check that the branch instruction was executed |
| */ |
| .global cache_post_test6 |
| cache_post_test6: |
| mflr r0 |
| stw r0, 4(r1) |
| |
| bl cache_post_ienable |
| bl cache_post_iunlock |
| bl cache_post_iinvalidate |
| |
| /* Compute r9 = cache_post_test6_reloc */ |
| bl cache_post_test6_reloc |
| cache_post_test6_reloc: |
| mflr r9 |
| |
| /* Copy the test instruction to cache_post_test6_data */ |
| lis r3, (cache_post_test6_1 - cache_post_test6_reloc)@h |
| ori r3, r3, (cache_post_test6_1 - cache_post_test6_reloc)@l |
| add r3, r3, r9 |
| lis r4, (cache_post_test6_data - cache_post_test6_reloc)@h |
| ori r4, r4, (cache_post_test6_data - cache_post_test6_reloc)@l |
| add r4, r4, r9 |
| lwz r0, 0(r3) |
| stw r0, 0(r4) |
| |
| bl cache_post_iinvalidate |
| |
| /* Replace the test instruction */ |
| lis r3, (cache_post_test6_2 - cache_post_test6_reloc)@h |
| ori r3, r3, (cache_post_test6_2 - cache_post_test6_reloc)@l |
| add r3, r3, r9 |
| lis r4, (cache_post_test6_data - cache_post_test6_reloc)@h |
| ori r4, r4, (cache_post_test6_data - cache_post_test6_reloc)@l |
| add r4, r4, r9 |
| lwz r0, 0(r3) |
| stw r0, 0(r4) |
| |
| bl cache_post_iinvalidate |
| |
| /* Execute to the test instruction */ |
| cache_post_test6_data: |
| nop |
| |
| lwz r0, 4(r1) |
| mtlr r0 |
| blr |
| |
| #endif /* CONFIG_MPC823 || MPC850 || MPC855 || MPC860 */ |
| #endif /* CONFIG_POST & CFG_POST_CACHE */ |