mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-09-29 08:00:26 +09:00
Merged POST framework with the current TOT.
Signed-off-by: Sergei Poselenov <sposelenov@emcraft.com>
This commit is contained in:
parent
f780b83316
commit
b44896215a
2
Makefile
2
Makefile
@ -214,6 +214,8 @@ LIBS += drivers/sk98lin/libsk98lin.a
|
|||||||
LIBS += post/libpost.a post/drivers/libpostdrivers.a
|
LIBS += post/libpost.a post/drivers/libpostdrivers.a
|
||||||
LIBS += $(shell if [ -d post/lib_$(ARCH) ]; then echo \
|
LIBS += $(shell if [ -d post/lib_$(ARCH) ]; then echo \
|
||||||
"post/lib_$(ARCH)/libpost$(ARCH).a"; fi)
|
"post/lib_$(ARCH)/libpost$(ARCH).a"; fi)
|
||||||
|
LIBS += $(shell if [ -d post/lib_$(ARCH)/fpu ]; then echo \
|
||||||
|
"post/lib_$(ARCH)/fpu/libpost$(ARCH)fpu.a"; fi)
|
||||||
LIBS += $(shell if [ -d post/cpu/$(CPU) ]; then echo \
|
LIBS += $(shell if [ -d post/cpu/$(CPU) ]; then echo \
|
||||||
"post/cpu/$(CPU)/libpost$(CPU).a"; fi)
|
"post/cpu/$(CPU)/libpost$(CPU).a"; fi)
|
||||||
LIBS += $(shell if [ -d post/board/$(BOARDDIR) ]; then echo \
|
LIBS += $(shell if [ -d post/board/$(BOARDDIR) ]; then echo \
|
||||||
|
@ -1217,15 +1217,23 @@ mck_return:
|
|||||||
* NOTE: currently the 440s run with dcache _disabled_ once relocated to DRAM,
|
* NOTE: currently the 440s run with dcache _disabled_ once relocated to DRAM,
|
||||||
* although for some cache-ralated calls stubs have to be provided to satisfy
|
* although for some cache-ralated calls stubs have to be provided to satisfy
|
||||||
* symbols resolution.
|
* symbols resolution.
|
||||||
|
* Icache-related functions are used in POST framework.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_440
|
#ifdef CONFIG_440
|
||||||
.globl dcache_disable
|
.globl dcache_disable
|
||||||
|
.globl icache_disable
|
||||||
|
.globl icache_enable
|
||||||
dcache_disable:
|
dcache_disable:
|
||||||
|
icache_disable:
|
||||||
|
icache_enable:
|
||||||
blr
|
blr
|
||||||
|
|
||||||
.globl dcache_status
|
.globl dcache_status
|
||||||
|
.globl icache_status
|
||||||
dcache_status:
|
dcache_status:
|
||||||
|
icache_status:
|
||||||
|
mr r3, 0
|
||||||
blr
|
blr
|
||||||
#else
|
#else
|
||||||
flush_dcache:
|
flush_dcache:
|
||||||
|
@ -334,10 +334,14 @@
|
|||||||
CFG_POST_CPU | \
|
CFG_POST_CPU | \
|
||||||
CFG_POST_UART | \
|
CFG_POST_UART | \
|
||||||
CFG_POST_I2C | \
|
CFG_POST_I2C | \
|
||||||
|
CFG_POST_CACHE | \
|
||||||
|
CFG_POST_FPU | \
|
||||||
|
CFG_POST_ETHER | \
|
||||||
CFG_POST_SPR)
|
CFG_POST_SPR)
|
||||||
|
|
||||||
#define CFG_POST_WORD_ADDR (CFG_GBL_DATA_OFFSET - 0x4)
|
#define CFG_POST_WORD_ADDR (CFG_GBL_DATA_OFFSET - 0x4)
|
||||||
#define CONFIG_LOGBUFFER
|
#define CONFIG_LOGBUFFER
|
||||||
|
#define CFG_POST_CACHE_ADDR 0x10000000 /* free virtual address */
|
||||||
|
|
||||||
#define CFG_CONSOLE_IS_IN_ENV /* Otherwise it catches logbuffer as output */
|
#define CFG_CONSOLE_IS_IN_ENV /* Otherwise it catches logbuffer as output */
|
||||||
|
|
||||||
|
@ -282,7 +282,6 @@
|
|||||||
#define sdr_sdstp3 0x4003
|
#define sdr_sdstp3 0x4003
|
||||||
#endif /* CONFIG_440GX */
|
#endif /* CONFIG_440GX */
|
||||||
|
|
||||||
#ifdef CONFIG_440
|
|
||||||
/*----------------------------------------------------------------------------+
|
/*----------------------------------------------------------------------------+
|
||||||
| Core Configuration/MMU configuration for 440 (CCR1 for 440x5 only).
|
| Core Configuration/MMU configuration for 440 (CCR1 for 440x5 only).
|
||||||
+----------------------------------------------------------------------------*/
|
+----------------------------------------------------------------------------*/
|
||||||
@ -306,7 +305,6 @@
|
|||||||
#define MMUCR_IULXE 0x00400000
|
#define MMUCR_IULXE 0x00400000
|
||||||
#define MMUCR_STS 0x00100000
|
#define MMUCR_STS 0x00100000
|
||||||
#define MMUCR_STID_MASK 0x000000FF
|
#define MMUCR_STID_MASK 0x000000FF
|
||||||
#endif /* CONFIG_440 */
|
|
||||||
|
|
||||||
#ifdef CONFIG_440SPE
|
#ifdef CONFIG_440SPE
|
||||||
#undef sdr_sdstp2
|
#undef sdr_sdstp2
|
||||||
|
@ -24,6 +24,6 @@
|
|||||||
LIB = libpostmpc8xx.a
|
LIB = libpostmpc8xx.a
|
||||||
|
|
||||||
AOBJS = cache_8xx.o
|
AOBJS = cache_8xx.o
|
||||||
COBJS = ether.o spr.o uart.o usb.o watchdog.o
|
COBJS = cache.o ether.o spr.o uart.o usb.o watchdog.o
|
||||||
|
|
||||||
include $(TOPDIR)/post/rules.mk
|
include $(TOPDIR)/post/rules.mk
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
|
|
||||||
LIB = libpostppc4xx.a
|
LIB = libpostppc4xx.a
|
||||||
|
|
||||||
COBJS = fpu.o spr.o uart.o watchdog.o
|
AOBJS = cache_4xx.o
|
||||||
|
COBJS = cache.o ether.o fpu.o spr.o uart.o watchdog.o
|
||||||
|
|
||||||
include $(TOPDIR)/post/rules.mk
|
include $(TOPDIR)/post/rules.mk
|
||||||
|
114
post/cpu/ppc4xx/cache.c
Normal file
114
post/cpu/ppc4xx/cache.c
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
/*
|
||||||
|
* (C) Copyright 2007
|
||||||
|
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||||
|
*
|
||||||
|
* Author: Igor Lisitsin <igor@emcraft.com>
|
||||||
|
*
|
||||||
|
* 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 <common.h>
|
||||||
|
|
||||||
|
/* Cache test
|
||||||
|
*
|
||||||
|
* This test verifies the CPU data and instruction cache using
|
||||||
|
* several test scenarios.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef CONFIG_POST
|
||||||
|
|
||||||
|
#include <post.h>
|
||||||
|
|
||||||
|
#if CONFIG_POST & CFG_POST_CACHE
|
||||||
|
|
||||||
|
#include <asm/mmu.h>
|
||||||
|
#include <watchdog.h>
|
||||||
|
|
||||||
|
#define CACHE_POST_SIZE 1024
|
||||||
|
|
||||||
|
void program_tlb(u32 phys_addr, u32 virt_addr, u32 size, u32 tlb_word2_i_value);
|
||||||
|
|
||||||
|
int cache_post_test1 (int tlb, void *p, int size);
|
||||||
|
int cache_post_test2 (int tlb, void *p, int size);
|
||||||
|
int cache_post_test3 (int tlb, void *p, int size);
|
||||||
|
int cache_post_test4 (int tlb, void *p, int size);
|
||||||
|
int cache_post_test5 (int tlb, void *p, int size);
|
||||||
|
int cache_post_test6 (int tlb, void *p, int size);
|
||||||
|
|
||||||
|
static int tlb = -1; /* index to the victim TLB entry */
|
||||||
|
|
||||||
|
static unsigned char testarea[CACHE_POST_SIZE]
|
||||||
|
__attribute__((__aligned__(CACHE_POST_SIZE)));
|
||||||
|
|
||||||
|
int cache_post_test (int flags)
|
||||||
|
{
|
||||||
|
void* virt = (void*)CFG_POST_CACHE_ADDR;
|
||||||
|
int ints, i, res = 0;
|
||||||
|
u32 word0;
|
||||||
|
|
||||||
|
if (tlb < 0) {
|
||||||
|
/*
|
||||||
|
* Allocate a new TLB entry, since we are going to modify
|
||||||
|
* the write-through and caching inhibited storage attributes.
|
||||||
|
*/
|
||||||
|
program_tlb((u32)testarea, (u32)virt,
|
||||||
|
CACHE_POST_SIZE, TLB_WORD2_I_ENABLE);
|
||||||
|
|
||||||
|
/* Find the TLB entry */
|
||||||
|
for (i = 0;; i++) {
|
||||||
|
if (i >= PPC4XX_TLB_SIZE) {
|
||||||
|
printf ("Failed to program tlb entry\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
word0 = mftlb1(i);
|
||||||
|
if (TLB_WORD0_EPN_DECODE(word0) == (u32)virt) {
|
||||||
|
tlb = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ints = disable_interrupts ();
|
||||||
|
|
||||||
|
WATCHDOG_RESET ();
|
||||||
|
if (res == 0)
|
||||||
|
res = cache_post_test1 (tlb, virt, CACHE_POST_SIZE);
|
||||||
|
WATCHDOG_RESET ();
|
||||||
|
if (res == 0)
|
||||||
|
res = cache_post_test2 (tlb, virt, CACHE_POST_SIZE);
|
||||||
|
WATCHDOG_RESET ();
|
||||||
|
if (res == 0)
|
||||||
|
res = cache_post_test3 (tlb, virt, CACHE_POST_SIZE);
|
||||||
|
WATCHDOG_RESET ();
|
||||||
|
if (res == 0)
|
||||||
|
res = cache_post_test4 (tlb, virt, CACHE_POST_SIZE);
|
||||||
|
WATCHDOG_RESET ();
|
||||||
|
if (res == 0)
|
||||||
|
res = cache_post_test5 (tlb, virt, CACHE_POST_SIZE);
|
||||||
|
WATCHDOG_RESET ();
|
||||||
|
if (res == 0)
|
||||||
|
res = cache_post_test6 (tlb, virt, CACHE_POST_SIZE);
|
||||||
|
|
||||||
|
if (ints)
|
||||||
|
enable_interrupts ();
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CONFIG_POST & CFG_POST_CACHE */
|
||||||
|
#endif /* CONFIG_POST */
|
448
post/cpu/ppc4xx/cache_4xx.S
Normal file
448
post/cpu/ppc4xx/cache_4xx.S
Normal file
@ -0,0 +1,448 @@
|
|||||||
|
/*
|
||||||
|
* (C) Copyright 2007
|
||||||
|
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||||
|
*
|
||||||
|
* Author: Igor Lisitsin <igor@emcraft.com>
|
||||||
|
*
|
||||||
|
* 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>
|
||||||
|
|
||||||
|
#ifdef CONFIG_POST
|
||||||
|
|
||||||
|
#include <post.h>
|
||||||
|
#include <ppc_asm.tmpl>
|
||||||
|
#include <ppc_defs.h>
|
||||||
|
#include <asm/cache.h>
|
||||||
|
#include <asm/mmu.h>
|
||||||
|
|
||||||
|
#if CONFIG_POST & CFG_POST_CACHE
|
||||||
|
|
||||||
|
.text
|
||||||
|
|
||||||
|
/* void cache_post_disable (int tlb)
|
||||||
|
*/
|
||||||
|
cache_post_disable:
|
||||||
|
tlbre r0, r3, 0x0002
|
||||||
|
ori r0, r0, TLB_WORD2_I_ENABLE@l
|
||||||
|
tlbwe r0, r3, 0x0002
|
||||||
|
sync
|
||||||
|
isync
|
||||||
|
blr
|
||||||
|
|
||||||
|
/* void cache_post_wt (int tlb)
|
||||||
|
*/
|
||||||
|
cache_post_wt:
|
||||||
|
tlbre r0, r3, 0x0002
|
||||||
|
ori r0, r0, TLB_WORD2_W_ENABLE@l
|
||||||
|
andi. r0, r0, ~TLB_WORD2_I_ENABLE@l
|
||||||
|
tlbwe r0, r3, 0x0002
|
||||||
|
sync
|
||||||
|
isync
|
||||||
|
blr
|
||||||
|
|
||||||
|
/* void cache_post_wb (int tlb)
|
||||||
|
*/
|
||||||
|
cache_post_wb:
|
||||||
|
tlbre r0, r3, 0x0002
|
||||||
|
andi. r0, r0, ~TLB_WORD2_W_ENABLE@l
|
||||||
|
andi. r0, r0, ~TLB_WORD2_I_ENABLE@l
|
||||||
|
tlbwe r0, r3, 0x0002
|
||||||
|
sync
|
||||||
|
isync
|
||||||
|
blr
|
||||||
|
|
||||||
|
/* void cache_post_dinvalidate (void *p, int size)
|
||||||
|
*/
|
||||||
|
cache_post_dinvalidate:
|
||||||
|
dcbi r0, r3
|
||||||
|
addi r3, r3, CFG_CACHELINE_SIZE
|
||||||
|
subic. r4, r4, CFG_CACHELINE_SIZE
|
||||||
|
bgt cache_post_dinvalidate
|
||||||
|
sync
|
||||||
|
blr
|
||||||
|
|
||||||
|
/* void cache_post_dstore (void *p, int size)
|
||||||
|
*/
|
||||||
|
cache_post_dstore:
|
||||||
|
dcbst r0, r3
|
||||||
|
addi r3, r3, CFG_CACHELINE_SIZE
|
||||||
|
subic. r4, r4, CFG_CACHELINE_SIZE
|
||||||
|
bgt cache_post_dstore
|
||||||
|
sync
|
||||||
|
blr
|
||||||
|
|
||||||
|
/* void cache_post_dtouch (void *p, int size)
|
||||||
|
*/
|
||||||
|
cache_post_dtouch:
|
||||||
|
dcbt r0, r3
|
||||||
|
addi r3, r3, CFG_CACHELINE_SIZE
|
||||||
|
subic. r4, r4, CFG_CACHELINE_SIZE
|
||||||
|
bgt cache_post_dtouch
|
||||||
|
sync
|
||||||
|
blr
|
||||||
|
|
||||||
|
/* void cache_post_iinvalidate (void)
|
||||||
|
*/
|
||||||
|
cache_post_iinvalidate:
|
||||||
|
iccci r0, r0
|
||||||
|
sync
|
||||||
|
blr
|
||||||
|
|
||||||
|
/* void cache_post_memset (void *p, int val, int size)
|
||||||
|
*/
|
||||||
|
cache_post_memset:
|
||||||
|
mtctr r5
|
||||||
|
1:
|
||||||
|
stb r4, 0(r3)
|
||||||
|
addi r3, r3, 1
|
||||||
|
bdnz 1b
|
||||||
|
blr
|
||||||
|
|
||||||
|
/* int cache_post_check (void *p, int size)
|
||||||
|
*/
|
||||||
|
cache_post_check:
|
||||||
|
mtctr r4
|
||||||
|
1:
|
||||||
|
lbz r0, 0(r3)
|
||||||
|
addi r3, r3, 1
|
||||||
|
cmpwi r0, 0xff
|
||||||
|
bne 2f
|
||||||
|
bdnz 1b
|
||||||
|
li r3, 0
|
||||||
|
blr
|
||||||
|
2:
|
||||||
|
li r3, -1
|
||||||
|
blr
|
||||||
|
|
||||||
|
#define CACHE_POST_DISABLE() \
|
||||||
|
mr r3, r10; \
|
||||||
|
bl cache_post_disable
|
||||||
|
|
||||||
|
#define CACHE_POST_WT() \
|
||||||
|
mr r3, r10; \
|
||||||
|
bl cache_post_wt
|
||||||
|
|
||||||
|
#define CACHE_POST_WB() \
|
||||||
|
mr r3, r10; \
|
||||||
|
bl cache_post_wb
|
||||||
|
|
||||||
|
#define CACHE_POST_DINVALIDATE() \
|
||||||
|
mr r3, r11; \
|
||||||
|
mr r4, r12; \
|
||||||
|
bl cache_post_dinvalidate
|
||||||
|
|
||||||
|
#define CACHE_POST_DFLUSH() \
|
||||||
|
mr r3, r11; \
|
||||||
|
mr r4, r12; \
|
||||||
|
bl cache_post_dflush
|
||||||
|
|
||||||
|
#define CACHE_POST_DSTORE() \
|
||||||
|
mr r3, r11; \
|
||||||
|
mr r4, r12; \
|
||||||
|
bl cache_post_dstore
|
||||||
|
|
||||||
|
#define CACHE_POST_DTOUCH() \
|
||||||
|
mr r3, r11; \
|
||||||
|
mr r4, r12; \
|
||||||
|
bl cache_post_dtouch
|
||||||
|
|
||||||
|
#define CACHE_POST_IINVALIDATE() \
|
||||||
|
bl cache_post_iinvalidate
|
||||||
|
|
||||||
|
#define CACHE_POST_MEMSET(val) \
|
||||||
|
mr r3, r11; \
|
||||||
|
li r4, val; \
|
||||||
|
mr r5, r12; \
|
||||||
|
bl cache_post_memset
|
||||||
|
|
||||||
|
#define CACHE_POST_CHECK() \
|
||||||
|
mr r3, r11; \
|
||||||
|
mr r4, r12; \
|
||||||
|
bl cache_post_check; \
|
||||||
|
mr r13, r3
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Write and read 0xff pattern with caching enabled.
|
||||||
|
*/
|
||||||
|
.global cache_post_test1
|
||||||
|
cache_post_test1:
|
||||||
|
mflr r9
|
||||||
|
mr r10, r3 /* tlb */
|
||||||
|
mr r11, r4 /* p */
|
||||||
|
mr r12, r5 /* size */
|
||||||
|
|
||||||
|
CACHE_POST_WB()
|
||||||
|
CACHE_POST_DINVALIDATE()
|
||||||
|
|
||||||
|
/* Write the negative pattern to the test area */
|
||||||
|
CACHE_POST_MEMSET(0xff)
|
||||||
|
|
||||||
|
/* Read the test area */
|
||||||
|
CACHE_POST_CHECK()
|
||||||
|
|
||||||
|
CACHE_POST_DINVALIDATE()
|
||||||
|
CACHE_POST_DISABLE()
|
||||||
|
|
||||||
|
mr r3, r13
|
||||||
|
mtlr r9
|
||||||
|
blr
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Write zeroes with caching enabled.
|
||||||
|
* Write 0xff pattern with caching disabled.
|
||||||
|
* Read 0xff pattern with caching enabled.
|
||||||
|
*/
|
||||||
|
.global cache_post_test2
|
||||||
|
cache_post_test2:
|
||||||
|
mflr r9
|
||||||
|
mr r10, r3 /* tlb */
|
||||||
|
mr r11, r4 /* p */
|
||||||
|
mr r12, r5 /* size */
|
||||||
|
|
||||||
|
CACHE_POST_WB()
|
||||||
|
CACHE_POST_DINVALIDATE()
|
||||||
|
|
||||||
|
/* Write the zero pattern to the test area */
|
||||||
|
CACHE_POST_MEMSET(0)
|
||||||
|
|
||||||
|
CACHE_POST_DINVALIDATE()
|
||||||
|
CACHE_POST_DISABLE()
|
||||||
|
|
||||||
|
/* Write the negative pattern to the test area */
|
||||||
|
CACHE_POST_MEMSET(0xff)
|
||||||
|
|
||||||
|
CACHE_POST_WB()
|
||||||
|
|
||||||
|
/* Read the test area */
|
||||||
|
CACHE_POST_CHECK()
|
||||||
|
|
||||||
|
CACHE_POST_DINVALIDATE()
|
||||||
|
CACHE_POST_DISABLE()
|
||||||
|
|
||||||
|
mr r3, r13
|
||||||
|
mtlr r9
|
||||||
|
blr
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Write-through mode test.
|
||||||
|
* Write zeroes, store the cache, write 0xff pattern.
|
||||||
|
* Invalidate the cache.
|
||||||
|
* Check that 0xff pattern is read.
|
||||||
|
*/
|
||||||
|
.global cache_post_test3
|
||||||
|
cache_post_test3:
|
||||||
|
mflr r9
|
||||||
|
mr r10, r3 /* tlb */
|
||||||
|
mr r11, r4 /* p */
|
||||||
|
mr r12, r5 /* size */
|
||||||
|
|
||||||
|
CACHE_POST_WT()
|
||||||
|
CACHE_POST_DINVALIDATE()
|
||||||
|
|
||||||
|
/* Cache the test area */
|
||||||
|
CACHE_POST_DTOUCH()
|
||||||
|
|
||||||
|
/* Write the zero pattern to the test area */
|
||||||
|
CACHE_POST_MEMSET(0)
|
||||||
|
|
||||||
|
CACHE_POST_DSTORE()
|
||||||
|
|
||||||
|
/* Write the negative pattern to the test area */
|
||||||
|
CACHE_POST_MEMSET(0xff)
|
||||||
|
|
||||||
|
CACHE_POST_DINVALIDATE()
|
||||||
|
CACHE_POST_DISABLE()
|
||||||
|
|
||||||
|
/* Read the test area */
|
||||||
|
CACHE_POST_CHECK()
|
||||||
|
|
||||||
|
mr r3, r13
|
||||||
|
mtlr r9
|
||||||
|
blr
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Write-back mode test.
|
||||||
|
* Write 0xff pattern, store the cache, write zeroes.
|
||||||
|
* Invalidate the cache.
|
||||||
|
* Check that 0xff pattern is read.
|
||||||
|
*/
|
||||||
|
.global cache_post_test4
|
||||||
|
cache_post_test4:
|
||||||
|
mflr r9
|
||||||
|
mr r10, r3 /* tlb */
|
||||||
|
mr r11, r4 /* p */
|
||||||
|
mr r12, r5 /* size */
|
||||||
|
|
||||||
|
CACHE_POST_WB()
|
||||||
|
CACHE_POST_DINVALIDATE()
|
||||||
|
|
||||||
|
/* Cache the test area */
|
||||||
|
CACHE_POST_DTOUCH()
|
||||||
|
|
||||||
|
/* Write the negative pattern to the test area */
|
||||||
|
CACHE_POST_MEMSET(0xff)
|
||||||
|
|
||||||
|
CACHE_POST_DSTORE()
|
||||||
|
|
||||||
|
/* Write the zero pattern to the test area */
|
||||||
|
CACHE_POST_MEMSET(0)
|
||||||
|
|
||||||
|
CACHE_POST_DINVALIDATE()
|
||||||
|
CACHE_POST_DISABLE()
|
||||||
|
|
||||||
|
/* Read the test area */
|
||||||
|
CACHE_POST_CHECK()
|
||||||
|
|
||||||
|
mr r3, r13
|
||||||
|
mtlr r9
|
||||||
|
blr
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Load the test instructions into the instruction cache.
|
||||||
|
* Replace the test instructions.
|
||||||
|
* Check that the original instructions are executed.
|
||||||
|
*/
|
||||||
|
.global cache_post_test5
|
||||||
|
cache_post_test5:
|
||||||
|
mflr r9
|
||||||
|
mr r10, r3 /* tlb */
|
||||||
|
mr r11, r4 /* p */
|
||||||
|
mr r12, r5 /* size */
|
||||||
|
|
||||||
|
CACHE_POST_WT()
|
||||||
|
CACHE_POST_IINVALIDATE()
|
||||||
|
|
||||||
|
/* Compute r13 = cache_post_test_inst */
|
||||||
|
bl cache_post_test5_reloc
|
||||||
|
cache_post_test5_reloc:
|
||||||
|
mflr r13
|
||||||
|
lis r0, (cache_post_test_inst - cache_post_test5_reloc)@h
|
||||||
|
ori r0, r0, (cache_post_test_inst - cache_post_test5_reloc)@l
|
||||||
|
add r13, r13, r0
|
||||||
|
|
||||||
|
/* Copy the test instructions to the test area */
|
||||||
|
lwz r0, 0(r13)
|
||||||
|
stw r0, 0(r11)
|
||||||
|
lwz r0, 8(r13)
|
||||||
|
stw r0, 4(r11)
|
||||||
|
sync
|
||||||
|
|
||||||
|
/* Invalidate the cache line */
|
||||||
|
icbi r0, r11
|
||||||
|
sync
|
||||||
|
isync
|
||||||
|
|
||||||
|
/* Execute the test instructions */
|
||||||
|
mtlr r11
|
||||||
|
blrl
|
||||||
|
|
||||||
|
/* Replace the test instruction */
|
||||||
|
lwz r0, 4(r13)
|
||||||
|
stw r0, 0(r11)
|
||||||
|
sync
|
||||||
|
|
||||||
|
/* Do not invalidate the cache line */
|
||||||
|
isync
|
||||||
|
|
||||||
|
/* Execute the test instructions */
|
||||||
|
mtlr r11
|
||||||
|
blrl
|
||||||
|
mr r13, r3
|
||||||
|
|
||||||
|
CACHE_POST_IINVALIDATE()
|
||||||
|
CACHE_POST_DINVALIDATE()
|
||||||
|
CACHE_POST_DISABLE()
|
||||||
|
|
||||||
|
mr r3, r13
|
||||||
|
mtlr r9
|
||||||
|
blr
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Load the test instructions into the instruction cache.
|
||||||
|
* Replace the test instructions and invalidate the cache.
|
||||||
|
* Check that the replaced instructions are executed.
|
||||||
|
*/
|
||||||
|
.global cache_post_test6
|
||||||
|
cache_post_test6:
|
||||||
|
mflr r9
|
||||||
|
mr r10, r3 /* tlb */
|
||||||
|
mr r11, r4 /* p */
|
||||||
|
mr r12, r5 /* size */
|
||||||
|
|
||||||
|
CACHE_POST_WT()
|
||||||
|
CACHE_POST_IINVALIDATE()
|
||||||
|
|
||||||
|
/* Compute r13 = cache_post_test_inst */
|
||||||
|
bl cache_post_test6_reloc
|
||||||
|
cache_post_test6_reloc:
|
||||||
|
mflr r13
|
||||||
|
lis r0, (cache_post_test_inst - cache_post_test6_reloc)@h
|
||||||
|
ori r0, r0, (cache_post_test_inst - cache_post_test6_reloc)@l
|
||||||
|
add r13, r13, r0
|
||||||
|
|
||||||
|
/* Copy the test instructions to the test area */
|
||||||
|
lwz r0, 4(r13)
|
||||||
|
stw r0, 0(r11)
|
||||||
|
lwz r0, 8(r13)
|
||||||
|
stw r0, 4(r11)
|
||||||
|
sync
|
||||||
|
|
||||||
|
/* Invalidate the cache line */
|
||||||
|
icbi r0, r11
|
||||||
|
sync
|
||||||
|
isync
|
||||||
|
|
||||||
|
/* Execute the test instructions */
|
||||||
|
mtlr r11
|
||||||
|
blrl
|
||||||
|
|
||||||
|
/* Replace the test instruction */
|
||||||
|
lwz r0, 0(r13)
|
||||||
|
stw r0, 0(r11)
|
||||||
|
sync
|
||||||
|
|
||||||
|
/* Invalidate the cache line */
|
||||||
|
icbi r0, r11
|
||||||
|
sync
|
||||||
|
isync
|
||||||
|
|
||||||
|
/* Execute the test instructions */
|
||||||
|
mtlr r11
|
||||||
|
blrl
|
||||||
|
mr r13, r3
|
||||||
|
|
||||||
|
CACHE_POST_IINVALIDATE()
|
||||||
|
CACHE_POST_DINVALIDATE()
|
||||||
|
CACHE_POST_DISABLE()
|
||||||
|
|
||||||
|
mr r3, r13
|
||||||
|
mtlr r9
|
||||||
|
blr
|
||||||
|
|
||||||
|
/* Test instructions.
|
||||||
|
*/
|
||||||
|
cache_post_test_inst:
|
||||||
|
li r3, 0
|
||||||
|
li r3, -1
|
||||||
|
blr
|
||||||
|
|
||||||
|
#endif /* CONFIG_POST & CFG_POST_CACHE */
|
||||||
|
#endif /* CONFIG_POST */
|
395
post/cpu/ppc4xx/ether.c
Normal file
395
post/cpu/ppc4xx/ether.c
Normal file
@ -0,0 +1,395 @@
|
|||||||
|
/*
|
||||||
|
* (C) Copyright 2007
|
||||||
|
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||||
|
*
|
||||||
|
* Author: Igor Lisitsin <igor@emcraft.com>
|
||||||
|
*
|
||||||
|
* 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 <common.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Ethernet test
|
||||||
|
*
|
||||||
|
* The Ethernet Media Access Controllers (EMAC) are tested in the
|
||||||
|
* internal loopback mode.
|
||||||
|
* The controllers are configured accordingly and several packets
|
||||||
|
* are transmitted. The configurable test parameters are:
|
||||||
|
* MIN_PACKET_LENGTH - minimum size of packet to transmit
|
||||||
|
* MAX_PACKET_LENGTH - maximum size of packet to transmit
|
||||||
|
* TEST_NUM - number of tests
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef CONFIG_POST
|
||||||
|
|
||||||
|
#include <post.h>
|
||||||
|
|
||||||
|
#if CONFIG_POST & CFG_POST_ETHER
|
||||||
|
|
||||||
|
#include <asm/cache.h>
|
||||||
|
#include <asm/io.h>
|
||||||
|
#include <asm/processor.h>
|
||||||
|
#include <405_mal.h>
|
||||||
|
#include <ppc4xx_enet.h>
|
||||||
|
#include <malloc.h>
|
||||||
|
|
||||||
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
|
#if defined(CONFIG_440SPE) || defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
|
||||||
|
#define SDR0_MFR_ETH_CLK_SEL_V(n) ((0x01<<27) / (n+1))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define MIN_PACKET_LENGTH 64
|
||||||
|
#define MAX_PACKET_LENGTH 256
|
||||||
|
#define TEST_NUM 1
|
||||||
|
|
||||||
|
static volatile mal_desc_t tx __cacheline_aligned;
|
||||||
|
static volatile mal_desc_t rx __cacheline_aligned;
|
||||||
|
static char *tx_buf;
|
||||||
|
static char *rx_buf;
|
||||||
|
|
||||||
|
static void ether_post_init (int devnum, int hw_addr)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
unsigned mode_reg;
|
||||||
|
#if defined(CONFIG_440GX) || \
|
||||||
|
defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
|
||||||
|
defined(CONFIG_440SP) || defined(CONFIG_440SPE)
|
||||||
|
sys_info_t sysinfo;
|
||||||
|
#endif
|
||||||
|
#if defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || defined(CONFIG_440SPE)
|
||||||
|
unsigned long mfr;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_440GX) || \
|
||||||
|
defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
|
||||||
|
defined(CONFIG_440SP) || defined(CONFIG_440SPE)
|
||||||
|
/* Need to get the OPB frequency so we can access the PHY */
|
||||||
|
get_sys_info (&sysinfo);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_440SPE) || defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
|
||||||
|
/* provide clocks for EMAC internal loopback */
|
||||||
|
mfsdr (sdr_mfr, mfr);
|
||||||
|
mfr |= SDR0_MFR_ETH_CLK_SEL_V(devnum);
|
||||||
|
mtsdr (sdr_mfr, mfr);
|
||||||
|
sync ();
|
||||||
|
#endif
|
||||||
|
/* reset emac */
|
||||||
|
out32 (EMAC_M0 + hw_addr, EMAC_M0_SRST);
|
||||||
|
sync ();
|
||||||
|
|
||||||
|
for (i = 0;; i++) {
|
||||||
|
if (!(in32 (EMAC_M0 + hw_addr) & EMAC_M0_SRST))
|
||||||
|
break;
|
||||||
|
if (i >= 1000) {
|
||||||
|
printf ("Timeout resetting EMAC\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
udelay (1000);
|
||||||
|
}
|
||||||
|
#if defined(CONFIG_440GX) || \
|
||||||
|
defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
|
||||||
|
defined(CONFIG_440SP) || defined(CONFIG_440SPE)
|
||||||
|
/* Whack the M1 register */
|
||||||
|
mode_reg = 0x0;
|
||||||
|
if (sysinfo.freqOPB <= 50000000);
|
||||||
|
else if (sysinfo.freqOPB <= 66666667)
|
||||||
|
mode_reg |= EMAC_M1_OBCI_66;
|
||||||
|
else if (sysinfo.freqOPB <= 83333333)
|
||||||
|
mode_reg |= EMAC_M1_OBCI_83;
|
||||||
|
else if (sysinfo.freqOPB <= 100000000)
|
||||||
|
mode_reg |= EMAC_M1_OBCI_100;
|
||||||
|
else
|
||||||
|
mode_reg |= EMAC_M1_OBCI_GT100;
|
||||||
|
|
||||||
|
out32 (EMAC_M1 + hw_addr, mode_reg);
|
||||||
|
|
||||||
|
#endif /* defined(CONFIG_440GX) || defined(CONFIG_440SP) */
|
||||||
|
|
||||||
|
/* set the Mal configuration reg */
|
||||||
|
#if defined(CONFIG_440GX) || \
|
||||||
|
defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
|
||||||
|
defined(CONFIG_440SP) || defined(CONFIG_440SPE)
|
||||||
|
mtdcr (malmcr, MAL_CR_PLBB | MAL_CR_OPBBL | MAL_CR_LEA |
|
||||||
|
MAL_CR_PLBLT_DEFAULT | 0x00330000);
|
||||||
|
#else
|
||||||
|
mtdcr (malmcr, MAL_CR_PLBB | MAL_CR_OPBBL | MAL_CR_LEA | MAL_CR_PLBLT_DEFAULT);
|
||||||
|
/* Errata 1.12: MAL_1 -- Disable MAL bursting */
|
||||||
|
if (get_pvr() == PVR_440GP_RB) {
|
||||||
|
mtdcr (malmcr, mfdcr(malmcr) & ~MAL_CR_PLBB);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/* setup buffer descriptors */
|
||||||
|
tx.ctrl = MAL_TX_CTRL_WRAP;
|
||||||
|
tx.data_len = 0;
|
||||||
|
tx.data_ptr = (char*)L1_CACHE_ALIGN((u32)tx_buf);
|
||||||
|
|
||||||
|
rx.ctrl = MAL_TX_CTRL_WRAP | MAL_RX_CTRL_EMPTY;
|
||||||
|
rx.data_len = 0;
|
||||||
|
rx.data_ptr = (char*)L1_CACHE_ALIGN((u32)rx_buf);
|
||||||
|
|
||||||
|
switch (devnum) {
|
||||||
|
case 1:
|
||||||
|
/* setup MAL tx & rx channel pointers */
|
||||||
|
#if defined (CONFIG_405EP) || defined (CONFIG_440EP) || defined (CONFIG_440GR)
|
||||||
|
mtdcr (maltxctp2r, &tx);
|
||||||
|
#else
|
||||||
|
mtdcr (maltxctp1r, &tx);
|
||||||
|
#endif
|
||||||
|
#if defined(CONFIG_440)
|
||||||
|
mtdcr (maltxbattr, 0x0);
|
||||||
|
mtdcr (malrxbattr, 0x0);
|
||||||
|
#endif
|
||||||
|
mtdcr (malrxctp1r, &rx);
|
||||||
|
/* set RX buffer size */
|
||||||
|
mtdcr (malrcbs1, PKTSIZE_ALIGN / 16);
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
default:
|
||||||
|
/* setup MAL tx & rx channel pointers */
|
||||||
|
#if defined(CONFIG_440)
|
||||||
|
mtdcr (maltxbattr, 0x0);
|
||||||
|
mtdcr (malrxbattr, 0x0);
|
||||||
|
#endif
|
||||||
|
mtdcr (maltxctp0r, &tx);
|
||||||
|
mtdcr (malrxctp0r, &rx);
|
||||||
|
/* set RX buffer size */
|
||||||
|
mtdcr (malrcbs0, PKTSIZE_ALIGN / 16);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Enable MAL transmit and receive channels */
|
||||||
|
#if defined(CONFIG_405EP) || defined(CONFIG_440EP) || defined(CONFIG_440GR)
|
||||||
|
mtdcr (maltxcasr, (MAL_TXRX_CASR >> (devnum*2)));
|
||||||
|
#else
|
||||||
|
mtdcr (maltxcasr, (MAL_TXRX_CASR >> devnum));
|
||||||
|
#endif
|
||||||
|
mtdcr (malrxcasr, (MAL_TXRX_CASR >> devnum));
|
||||||
|
|
||||||
|
/* set internal loopback mode */
|
||||||
|
out32 (EMAC_M1 + hw_addr, EMAC_M1_FDE | EMAC_M1_ILE |
|
||||||
|
EMAC_M1_RFS_4K | EMAC_M1_TX_FIFO_2K |
|
||||||
|
EMAC_M1_MF_100MBPS | EMAC_M1_IST |
|
||||||
|
in32 (EMAC_M1));
|
||||||
|
|
||||||
|
/* set transmit enable & receive enable */
|
||||||
|
out32 (EMAC_M0 + hw_addr, EMAC_M0_TXE | EMAC_M0_RXE);
|
||||||
|
|
||||||
|
/* enable broadcast address */
|
||||||
|
out32 (EMAC_RXM + hw_addr, EMAC_RMR_BAE);
|
||||||
|
|
||||||
|
/* set transmit request threshold register */
|
||||||
|
out32 (EMAC_TRTR + hw_addr, 0x18000000); /* 256 byte threshold */
|
||||||
|
|
||||||
|
/* set receive low/high water mark register */
|
||||||
|
#if defined(CONFIG_440)
|
||||||
|
/* 440s has a 64 byte burst length */
|
||||||
|
out32 (EMAC_RX_HI_LO_WMARK + hw_addr, 0x80009000);
|
||||||
|
#else
|
||||||
|
/* 405s have a 16 byte burst length */
|
||||||
|
out32 (EMAC_RX_HI_LO_WMARK + hw_addr, 0x0f002000);
|
||||||
|
#endif /* defined(CONFIG_440) */
|
||||||
|
out32 (EMAC_TXM1 + hw_addr, 0xf8640000);
|
||||||
|
|
||||||
|
/* Set fifo limit entry in tx mode 0 */
|
||||||
|
out32 (EMAC_TXM0 + hw_addr, 0x00000003);
|
||||||
|
/* Frame gap set */
|
||||||
|
out32 (EMAC_I_FRAME_GAP_REG + hw_addr, 0x00000008);
|
||||||
|
sync ();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ether_post_halt (int devnum, int hw_addr)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
#if defined(CONFIG_440SPE) || defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
|
||||||
|
unsigned long mfr;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* 1st reset MAL channel */
|
||||||
|
/* Note: writing a 0 to a channel has no effect */
|
||||||
|
#if defined(CONFIG_405EP) || defined(CONFIG_440EP) || defined(CONFIG_440GR)
|
||||||
|
mtdcr (maltxcarr, MAL_TXRX_CASR >> (devnum * 2));
|
||||||
|
#else
|
||||||
|
mtdcr (maltxcarr, MAL_TXRX_CASR >> devnum);
|
||||||
|
#endif
|
||||||
|
mtdcr (malrxcarr, MAL_TXRX_CASR >> devnum);
|
||||||
|
|
||||||
|
/* wait for reset */
|
||||||
|
while (mfdcr (malrxcasr) & (MAL_TXRX_CASR >> devnum)) {
|
||||||
|
if (i++ >= 1000)
|
||||||
|
break;
|
||||||
|
udelay (1000);
|
||||||
|
}
|
||||||
|
/* emac reset */
|
||||||
|
out32 (EMAC_M0 + hw_addr, EMAC_M0_SRST);
|
||||||
|
|
||||||
|
#if defined(CONFIG_440SPE) || defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
|
||||||
|
/* remove clocks for EMAC internal loopback */
|
||||||
|
mfsdr (sdr_mfr, mfr);
|
||||||
|
mfr &= ~SDR0_MFR_ETH_CLK_SEL_V(devnum);
|
||||||
|
mtsdr (sdr_mfr, mfr);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ether_post_send (int devnum, int hw_addr, void *packet, int length)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
while (tx.ctrl & MAL_TX_CTRL_READY) {
|
||||||
|
if (i++ > 100) {
|
||||||
|
printf ("TX timeout\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
udelay (1000);
|
||||||
|
}
|
||||||
|
tx.ctrl = MAL_TX_CTRL_READY | MAL_TX_CTRL_WRAP | MAL_TX_CTRL_LAST |
|
||||||
|
EMAC_TX_CTRL_GFCS | EMAC_TX_CTRL_GP;
|
||||||
|
tx.data_len = length;
|
||||||
|
memcpy (tx.data_ptr, packet, length);
|
||||||
|
sync ();
|
||||||
|
|
||||||
|
out32 (EMAC_TXM0 + hw_addr, in32 (EMAC_TXM0 + hw_addr) | EMAC_TXM0_GNP0);
|
||||||
|
sync ();
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ether_post_recv (int devnum, int hw_addr, void *packet, int max_length)
|
||||||
|
{
|
||||||
|
int length;
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
while (rx.ctrl & MAL_RX_CTRL_EMPTY) {
|
||||||
|
if (i++ > 100) {
|
||||||
|
printf ("RX timeout\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
udelay (1000);
|
||||||
|
}
|
||||||
|
length = rx.data_len - 4;
|
||||||
|
if (length <= max_length)
|
||||||
|
memcpy(packet, rx.data_ptr, length);
|
||||||
|
sync ();
|
||||||
|
|
||||||
|
rx.ctrl |= MAL_RX_CTRL_EMPTY;
|
||||||
|
sync ();
|
||||||
|
|
||||||
|
return length;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Test routines
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void packet_fill (char *packet, int length)
|
||||||
|
{
|
||||||
|
char c = (char) length;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* set up ethernet header */
|
||||||
|
memset (packet, 0xff, 14);
|
||||||
|
|
||||||
|
for (i = 14; i < length; i++) {
|
||||||
|
packet[i] = c++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int packet_check (char *packet, int length)
|
||||||
|
{
|
||||||
|
char c = (char) length;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 14; i < length; i++) {
|
||||||
|
if (packet[i] != c++)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int test_ctlr (int devnum, int hw_addr)
|
||||||
|
{
|
||||||
|
int res = -1;
|
||||||
|
char packet_send[MAX_PACKET_LENGTH];
|
||||||
|
char packet_recv[MAX_PACKET_LENGTH];
|
||||||
|
int length;
|
||||||
|
int i;
|
||||||
|
int l;
|
||||||
|
|
||||||
|
ether_post_init (devnum, hw_addr);
|
||||||
|
|
||||||
|
for (i = 0; i < TEST_NUM; i++) {
|
||||||
|
for (l = MIN_PACKET_LENGTH; l <= MAX_PACKET_LENGTH; l++) {
|
||||||
|
packet_fill (packet_send, l);
|
||||||
|
|
||||||
|
ether_post_send (devnum, hw_addr, packet_send, l);
|
||||||
|
|
||||||
|
length = ether_post_recv (devnum, hw_addr, packet_recv,
|
||||||
|
sizeof (packet_recv));
|
||||||
|
|
||||||
|
if (length != l || packet_check (packet_recv, length) < 0) {
|
||||||
|
goto Done;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
res = 0;
|
||||||
|
|
||||||
|
Done:
|
||||||
|
|
||||||
|
ether_post_halt (devnum, hw_addr);
|
||||||
|
|
||||||
|
if (res != 0) {
|
||||||
|
post_log ("EMAC%d test failed\n", devnum);
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ether_post_test (int flags)
|
||||||
|
{
|
||||||
|
int res = 0;
|
||||||
|
|
||||||
|
/* Allocate tx & rx packet buffers */
|
||||||
|
tx_buf = malloc (PKTSIZE_ALIGN + CFG_CACHELINE_SIZE);
|
||||||
|
rx_buf = malloc (PKTSIZE_ALIGN + CFG_CACHELINE_SIZE);
|
||||||
|
|
||||||
|
if (!tx_buf || !rx_buf) {
|
||||||
|
printf ("Failed to allocate packet buffers\n");
|
||||||
|
res = -1;
|
||||||
|
goto out_free;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* EMAC0 */
|
||||||
|
if (test_ctlr (0, 0))
|
||||||
|
res = -1;
|
||||||
|
|
||||||
|
/* EMAC1 */
|
||||||
|
if (test_ctlr (1, 0x100))
|
||||||
|
res = -1;
|
||||||
|
|
||||||
|
out_free:
|
||||||
|
free (tx_buf);
|
||||||
|
free (rx_buf);
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CONFIG_POST & CFG_POST_ETHER */
|
||||||
|
#endif /* CONFIG_POST */
|
@ -1,5 +1,8 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2007 Wolfgang Denk <wd@denx.de>
|
* (C) Copyright 2007
|
||||||
|
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||||
|
*
|
||||||
|
* Author: Sergei Poselenov <sposelenov@emcraft.com>
|
||||||
*
|
*
|
||||||
* See file CREDITS for list of people who contributed to this
|
* See file CREDITS for list of people who contributed to this
|
||||||
* project.
|
* project.
|
||||||
@ -34,7 +37,7 @@ int fpu_status(void)
|
|||||||
{
|
{
|
||||||
if (mfspr(ccr0) & CCR0_DAPUIB)
|
if (mfspr(ccr0) & CCR0_DAPUIB)
|
||||||
return 0; /* Disabled */
|
return 0; /* Disabled */
|
||||||
else
|
else
|
||||||
return 1; /* Enabled */
|
return 1; /* Enabled */
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -51,5 +54,6 @@ void fpu_enable(void)
|
|||||||
mtspr(ccr0, mfspr(ccr0) & ~CCR0_DAPUIB);
|
mtspr(ccr0, mfspr(ccr0) & ~CCR0_DAPUIB);
|
||||||
mtmsr(mfmsr() | MSR_FP);
|
mtmsr(mfmsr() | MSR_FP);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif /* CONFIG_POST */
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
* (C) Copyright 2007
|
* (C) Copyright 2007
|
||||||
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||||
*
|
*
|
||||||
|
* Author: Igor Lisitsin <igor@emcraft.com>
|
||||||
|
*
|
||||||
* See file CREDITS for list of people who contributed to this
|
* See file CREDITS for list of people who contributed to this
|
||||||
* project.
|
* project.
|
||||||
*
|
*
|
||||||
@ -39,6 +41,8 @@
|
|||||||
|
|
||||||
#if CONFIG_POST & CFG_POST_SPR
|
#if CONFIG_POST & CFG_POST_SPR
|
||||||
|
|
||||||
|
#include <asm/processor.h>
|
||||||
|
|
||||||
static struct
|
static struct
|
||||||
{
|
{
|
||||||
int number;
|
int number;
|
||||||
@ -60,8 +64,10 @@ static struct
|
|||||||
{0x113, "SPRG3", 0x00000000, 0x00000000},
|
{0x113, "SPRG3", 0x00000000, 0x00000000},
|
||||||
{0x11f, "PVR", 0x00000000, 0x00000000},
|
{0x11f, "PVR", 0x00000000, 0x00000000},
|
||||||
|
|
||||||
/* Additional Special-Purpose Registers */
|
/* Additional Special-Purpose Registers.
|
||||||
|
* The values must match the initialization
|
||||||
|
* values from cpu/ppc4xx/start.S
|
||||||
|
*/
|
||||||
{0x30, "PID", 0x00000000, 0x00000000},
|
{0x30, "PID", 0x00000000, 0x00000000},
|
||||||
{0x3a, "CSRR0", 0x00000000, 0x00000000},
|
{0x3a, "CSRR0", 0x00000000, 0x00000000},
|
||||||
{0x3b, "CSRR1", 0x00000000, 0x00000000},
|
{0x3b, "CSRR1", 0x00000000, 0x00000000},
|
||||||
@ -90,22 +96,22 @@ static struct
|
|||||||
{0x13f, "DVC2", 0x00000000, 0x00000000},
|
{0x13f, "DVC2", 0x00000000, 0x00000000},
|
||||||
{0x150, "TSR", 0x00000000, 0x00000000},
|
{0x150, "TSR", 0x00000000, 0x00000000},
|
||||||
{0x154, "TCR", 0x00000000, 0x00000000},
|
{0x154, "TCR", 0x00000000, 0x00000000},
|
||||||
{0x190, "IVOR0", 0x00000000, 0x00000000},
|
{0x190, "IVOR0", 0x0000fff0, 0x00000100},
|
||||||
{0x191, "IVOR1", 0x00000000, 0x00000000},
|
{0x191, "IVOR1", 0x0000fff0, 0x00000200},
|
||||||
{0x192, "IVOR2", 0x00000000, 0x00000000},
|
{0x192, "IVOR2", 0x0000fff0, 0x00000300},
|
||||||
{0x193, "IVOR3", 0x00000000, 0x00000000},
|
{0x193, "IVOR3", 0x0000fff0, 0x00000400},
|
||||||
{0x194, "IVOR4", 0x00000000, 0x00000000},
|
{0x194, "IVOR4", 0x0000fff0, 0x00000500},
|
||||||
{0x195, "IVOR5", 0x00000000, 0x00000000},
|
{0x195, "IVOR5", 0x0000fff0, 0x00000600},
|
||||||
{0x196, "IVOR6", 0x00000000, 0x00000000},
|
{0x196, "IVOR6", 0x0000fff0, 0x00000700},
|
||||||
{0x197, "IVOR7", 0x00000000, 0x00000000},
|
{0x197, "IVOR7", 0x0000fff0, 0x00000800},
|
||||||
{0x198, "IVOR8", 0x00000000, 0x00000000},
|
{0x198, "IVOR8", 0x0000fff0, 0x00000c00},
|
||||||
{0x199, "IVOR9", 0x00000000, 0x00000000},
|
{0x199, "IVOR9", 0x00000000, 0x00000000},
|
||||||
{0x19a, "IVOR10", 0x00000000, 0x00000000},
|
{0x19a, "IVOR10", 0x0000fff0, 0x00000900},
|
||||||
{0x19b, "IVOR11", 0x00000000, 0x00000000},
|
{0x19b, "IVOR11", 0x00000000, 0x00000000},
|
||||||
{0x19c, "IVOR12", 0x00000000, 0x00000000},
|
{0x19c, "IVOR12", 0x00000000, 0x00000000},
|
||||||
{0x19d, "IVOR13", 0x00000000, 0x00000000},
|
{0x19d, "IVOR13", 0x0000fff0, 0x00001300},
|
||||||
{0x19e, "IVOR14", 0x00000000, 0x00000000},
|
{0x19e, "IVOR14", 0x0000fff0, 0x00001400},
|
||||||
{0x19f, "IVOR15", 0x00000000, 0x00000000},
|
{0x19f, "IVOR15", 0x0000fff0, 0x00002000},
|
||||||
{0x23a, "MCSRR0", 0x00000000, 0x00000000},
|
{0x23a, "MCSRR0", 0x00000000, 0x00000000},
|
||||||
{0x23b, "MCSRR1", 0x00000000, 0x00000000},
|
{0x23b, "MCSRR1", 0x00000000, 0x00000000},
|
||||||
{0x23c, "MCSR", 0x00000000, 0x00000000},
|
{0x23c, "MCSR", 0x00000000, 0x00000000},
|
||||||
@ -126,8 +132,8 @@ static struct
|
|||||||
{0x395, "DTV1", 0x00000000, 0x00000000},
|
{0x395, "DTV1", 0x00000000, 0x00000000},
|
||||||
{0x396, "DTV2", 0x00000000, 0x00000000},
|
{0x396, "DTV2", 0x00000000, 0x00000000},
|
||||||
{0x397, "DTV3", 0x00000000, 0x00000000},
|
{0x397, "DTV3", 0x00000000, 0x00000000},
|
||||||
{0x398, "DVLIM", 0x00000000, 0x00000000},
|
{0x398, "DVLIM", 0x0fc1f83f, 0x0001f800},
|
||||||
{0x399, "IVLIM", 0x00000000, 0x00000000},
|
{0x399, "IVLIM", 0x0fc1f83f, 0x0001f800},
|
||||||
{0x39b, "RSTCFG", 0x00000000, 0x00000000},
|
{0x39b, "RSTCFG", 0x00000000, 0x00000000},
|
||||||
{0x39c, "DCDBTRL", 0x00000000, 0x00000000},
|
{0x39c, "DCDBTRL", 0x00000000, 0x00000000},
|
||||||
{0x39d, "DCDBTRH", 0x00000000, 0x00000000},
|
{0x39d, "DCDBTRH", 0x00000000, 0x00000000},
|
||||||
@ -172,5 +178,6 @@ int spr_post_test (int flags)
|
|||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* CONFIG_POST & CFG_POST_SPR */
|
#endif /* CONFIG_POST & CFG_POST_SPR */
|
||||||
#endif /* CONFIG_POST */
|
#endif /* CONFIG_POST */
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
* (C) Copyright 2007
|
* (C) Copyright 2007
|
||||||
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||||
*
|
*
|
||||||
|
* Author: Igor Lisitsin <igor@emcraft.com>
|
||||||
|
*
|
||||||
* See file CREDITS for list of people who contributed to this
|
* See file CREDITS for list of people who contributed to this
|
||||||
* project.
|
* project.
|
||||||
*
|
*
|
||||||
@ -210,5 +212,4 @@ int uart_post_test (int flags)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif /* CONFIG_POST & CFG_POST_UART */
|
#endif /* CONFIG_POST & CFG_POST_UART */
|
||||||
|
|
||||||
#endif /* CONFIG_POST */
|
#endif /* CONFIG_POST */
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
* (C) Copyright 2007
|
* (C) Copyright 2007
|
||||||
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||||
*
|
*
|
||||||
|
* Author: Igor Lisitsin <igor@emcraft.com>
|
||||||
|
*
|
||||||
* See file CREDITS for list of people who contributed to this
|
* See file CREDITS for list of people who contributed to this
|
||||||
* project.
|
* project.
|
||||||
*
|
*
|
||||||
@ -36,17 +38,18 @@
|
|||||||
#ifdef CONFIG_POST
|
#ifdef CONFIG_POST
|
||||||
|
|
||||||
#include <post.h>
|
#include <post.h>
|
||||||
#include <watchdog.h>
|
|
||||||
|
|
||||||
#if CONFIG_POST & CFG_POST_WATCHDOG
|
#if CONFIG_POST & CFG_POST_WATCHDOG
|
||||||
|
|
||||||
|
#include <watchdog.h>
|
||||||
|
|
||||||
int watchdog_post_test (int flags)
|
int watchdog_post_test (int flags)
|
||||||
{
|
{
|
||||||
if (flags & POST_REBOOT) {
|
if (flags & POST_REBOOT) {
|
||||||
/* Test passed */
|
/* Test passed */
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
/* 10-second delay */
|
/* 10-second delay */
|
||||||
int ints = disable_interrupts ();
|
int ints = disable_interrupts ();
|
||||||
ulong base = post_time_ms (0);
|
ulong base = post_time_ms (0);
|
||||||
|
@ -26,6 +26,6 @@ SUBDIRS =
|
|||||||
|
|
||||||
LIB = libpostdrivers.a
|
LIB = libpostdrivers.a
|
||||||
|
|
||||||
COBJS = cache.o i2c.o memory.o rtc.o
|
COBJS = i2c.o memory.o rtc.o
|
||||||
|
|
||||||
include $(TOPDIR)/post/rules.mk
|
include $(TOPDIR)/post/rules.mk
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
# MA 02111-1307 USA
|
# MA 02111-1307 USA
|
||||||
#
|
#
|
||||||
|
|
||||||
|
SUBDIRS = fpu
|
||||||
|
|
||||||
LIB = libpostppc.a
|
LIB = libpostppc.a
|
||||||
|
|
||||||
|
62
post/lib_ppc/fpu/20001122-1.c
Normal file
62
post/lib_ppc/fpu/20001122-1.c
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2007
|
||||||
|
* Wolfgang Denk, DENX Software Engineering, 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
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* This file is originally a part of the GCC testsuite.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <common.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_POST
|
||||||
|
|
||||||
|
#include <post.h>
|
||||||
|
|
||||||
|
#if CONFIG_POST & CFG_POST_FPU
|
||||||
|
|
||||||
|
int fpu_post_test_math1 (void)
|
||||||
|
{
|
||||||
|
volatile double a, *p;
|
||||||
|
double c, d;
|
||||||
|
volatile double b;
|
||||||
|
|
||||||
|
d = 1.0;
|
||||||
|
p = &b;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
c = d;
|
||||||
|
d = c * 0.5;
|
||||||
|
b = 1 + d;
|
||||||
|
} while (b != 1.0);
|
||||||
|
|
||||||
|
a = 1.0 + c;
|
||||||
|
|
||||||
|
if (a == 1.0) {
|
||||||
|
post_log ("Error in FPU math1 test\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CONFIG_POST & CFG_POST_FPU */
|
||||||
|
#endif /* CONFIG_POST */
|
66
post/lib_ppc/fpu/20010114-2.c
Normal file
66
post/lib_ppc/fpu/20010114-2.c
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2007
|
||||||
|
* Wolfgang Denk, DENX Software Engineering, 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
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* This file is originally a part of the GCC testsuite.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <common.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_POST
|
||||||
|
|
||||||
|
#include <post.h>
|
||||||
|
|
||||||
|
#if CONFIG_POST & CFG_POST_FPU
|
||||||
|
|
||||||
|
static float rintf (float x)
|
||||||
|
{
|
||||||
|
volatile float TWO23 = 8388608.0;
|
||||||
|
|
||||||
|
if (__builtin_fabs (x) < TWO23)
|
||||||
|
{
|
||||||
|
if (x > 0.0)
|
||||||
|
{
|
||||||
|
x += TWO23;
|
||||||
|
x -= TWO23;
|
||||||
|
}
|
||||||
|
else if (x < 0.0)
|
||||||
|
{
|
||||||
|
x = TWO23 - x;
|
||||||
|
x = -(x - TWO23);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fpu_post_test_math2 (void)
|
||||||
|
{
|
||||||
|
if (rintf (-1.5) != -2.0) {
|
||||||
|
post_log ("Error in FPU math2 test\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CONFIG_POST & CFG_POST_FPU */
|
||||||
|
#endif /* CONFIG_POST */
|
54
post/lib_ppc/fpu/20010226-1.c
Normal file
54
post/lib_ppc/fpu/20010226-1.c
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2007
|
||||||
|
* Wolfgang Denk, DENX Software Engineering, 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
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* This file is originally a part of the GCC testsuite.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <common.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_POST
|
||||||
|
|
||||||
|
#include <post.h>
|
||||||
|
|
||||||
|
#if CONFIG_POST & CFG_POST_FPU
|
||||||
|
|
||||||
|
int fpu_post_test_math3 (void)
|
||||||
|
{
|
||||||
|
volatile long double dfrom = 1.1;
|
||||||
|
volatile long double m1;
|
||||||
|
volatile long double m2;
|
||||||
|
volatile unsigned long mant_long;
|
||||||
|
|
||||||
|
m1 = dfrom / 2.0;
|
||||||
|
m2 = m1 * 4294967296.0;
|
||||||
|
mant_long = ((unsigned long) m2) & 0xffffffff;
|
||||||
|
|
||||||
|
if (mant_long != 0x8ccccccc) {
|
||||||
|
post_log ("Error in FPU math3 test\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CONFIG_POST & CFG_POST_FPU */
|
||||||
|
#endif /* CONFIG_POST */
|
60
post/lib_ppc/fpu/980619-1.c
Normal file
60
post/lib_ppc/fpu/980619-1.c
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2007
|
||||||
|
* Wolfgang Denk, DENX Software Engineering, 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
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* This file is originally a part of the GCC testsuite.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <common.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_POST
|
||||||
|
|
||||||
|
#include <post.h>
|
||||||
|
|
||||||
|
#if CONFIG_POST & CFG_POST_FPU
|
||||||
|
|
||||||
|
int fpu_post_test_math4 (void)
|
||||||
|
{
|
||||||
|
volatile float reale = 1.0f;
|
||||||
|
volatile float oneplus;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (sizeof (float) != 4)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
for (i = 0; ; i++)
|
||||||
|
{
|
||||||
|
oneplus = 1.0f + reale;
|
||||||
|
if (oneplus == 1.0f)
|
||||||
|
break;
|
||||||
|
reale = reale / 2.0f;
|
||||||
|
}
|
||||||
|
/* Assumes ieee754 accurate arithmetic above. */
|
||||||
|
if (i != 24) {
|
||||||
|
post_log ("Error in FPU math4 test\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CONFIG_POST & CFG_POST_FPU */
|
||||||
|
#endif /* CONFIG_POST */
|
32
post/lib_ppc/fpu/Makefile
Normal file
32
post/lib_ppc/fpu/Makefile
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
#
|
||||||
|
# (C) Copyright 2007
|
||||||
|
# Wolfgang Denk, DENX Software Engineering, 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
|
||||||
|
#
|
||||||
|
|
||||||
|
|
||||||
|
LIB = libpostppcfpu.a
|
||||||
|
|
||||||
|
COBJS += fpu.o 20001122-1.o 20010114-2.o 20010226-1.o 980619-1.o
|
||||||
|
COBJS += acc1.o compare-fp-1.o mul-subnormal-single-1.o
|
||||||
|
|
||||||
|
include $(TOPDIR)/post/rules.mk
|
||||||
|
|
||||||
|
CFLAGS += -mhard-float -fkeep-inline-functions
|
57
post/lib_ppc/fpu/acc1.c
Normal file
57
post/lib_ppc/fpu/acc1.c
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2007
|
||||||
|
* Wolfgang Denk, DENX Software Engineering, 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
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* This file is originally a part of the GCC testsuite.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <common.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_POST
|
||||||
|
|
||||||
|
#include <post.h>
|
||||||
|
|
||||||
|
#if CONFIG_POST & CFG_POST_FPU
|
||||||
|
|
||||||
|
static double func (const double *array)
|
||||||
|
{
|
||||||
|
double d = *array;
|
||||||
|
|
||||||
|
if (d == 0.0)
|
||||||
|
return d;
|
||||||
|
else
|
||||||
|
return d + func (array + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int fpu_post_test_math5 (void)
|
||||||
|
{
|
||||||
|
double values[] = { 0.1e-100, 1.0, -1.0, 0.0 };
|
||||||
|
|
||||||
|
if (func (values) != 0.1e-100) {
|
||||||
|
post_log ("Error in FPU math5 test\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CONFIG_POST & CFG_POST_FPU */
|
||||||
|
#endif /* CONFIG_POST */
|
225
post/lib_ppc/fpu/compare-fp-1.c
Normal file
225
post/lib_ppc/fpu/compare-fp-1.c
Normal file
@ -0,0 +1,225 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2007
|
||||||
|
* Wolfgang Denk, DENX Software Engineering, 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
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* Test for correctness of composite floating-point comparisons.
|
||||||
|
* Written by Paolo Bonzini, 26th May 2004.
|
||||||
|
* This file is originally a part of the GCC testsuite.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <common.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_POST
|
||||||
|
|
||||||
|
#include <post.h>
|
||||||
|
|
||||||
|
#if CONFIG_POST & CFG_POST_FPU
|
||||||
|
|
||||||
|
static int failed;
|
||||||
|
|
||||||
|
#define TEST(c) if ((c) != ok) failed++
|
||||||
|
#define ORD(a, b) (!__builtin_isunordered ((a), (b)))
|
||||||
|
#define UNORD(a, b) (__builtin_isunordered ((a), (b)))
|
||||||
|
#define UNEQ(a, b) (__builtin_isunordered ((a), (b)) || ((a) == (b)))
|
||||||
|
#define UNLT(a, b) (__builtin_isunordered ((a), (b)) || ((a) < (b)))
|
||||||
|
#define UNLE(a, b) (__builtin_isunordered ((a), (b)) || ((a) <= (b)))
|
||||||
|
#define UNGT(a, b) (__builtin_isunordered ((a), (b)) || ((a) > (b)))
|
||||||
|
#define UNGE(a, b) (__builtin_isunordered ((a), (b)) || ((a) >= (b)))
|
||||||
|
#define LTGT(a, b) (__builtin_islessgreater ((a), (b)))
|
||||||
|
|
||||||
|
static float pinf;
|
||||||
|
static float ninf;
|
||||||
|
static float NaN;
|
||||||
|
|
||||||
|
static void iuneq (float x, float y, int ok)
|
||||||
|
{
|
||||||
|
TEST (UNEQ (x, y));
|
||||||
|
TEST (!LTGT (x, y));
|
||||||
|
TEST (UNLE (x, y) && UNGE (x,y));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ieq (float x, float y, int ok)
|
||||||
|
{
|
||||||
|
TEST (ORD (x, y) && UNEQ (x, y));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void iltgt (float x, float y, int ok)
|
||||||
|
{
|
||||||
|
TEST (!UNEQ (x, y)); /* Not optimizable. */
|
||||||
|
TEST (LTGT (x, y)); /* Same, __builtin_islessgreater does not trap. */
|
||||||
|
TEST (ORD (x, y) && (UNLT (x, y) || UNGT (x,y)));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ine (float x, float y, int ok)
|
||||||
|
{
|
||||||
|
TEST (UNLT (x, y) || UNGT (x, y));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void iunlt (float x, float y, int ok)
|
||||||
|
{
|
||||||
|
TEST (UNLT (x, y));
|
||||||
|
TEST (UNORD (x, y) || (x < y));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ilt (float x, float y, int ok)
|
||||||
|
{
|
||||||
|
TEST (ORD (x, y) && UNLT (x, y)); /* Not optimized */
|
||||||
|
TEST ((x <= y) && (x != y));
|
||||||
|
TEST ((x <= y) && (y != x));
|
||||||
|
TEST ((x != y) && (x <= y)); /* Not optimized */
|
||||||
|
TEST ((y != x) && (x <= y)); /* Not optimized */
|
||||||
|
}
|
||||||
|
|
||||||
|
static void iunle (float x, float y, int ok)
|
||||||
|
{
|
||||||
|
TEST (UNLE (x, y));
|
||||||
|
TEST (UNORD (x, y) || (x <= y));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ile (float x, float y, int ok)
|
||||||
|
{
|
||||||
|
TEST (ORD (x, y) && UNLE (x, y)); /* Not optimized */
|
||||||
|
TEST ((x < y) || (x == y));
|
||||||
|
TEST ((y > x) || (x == y));
|
||||||
|
TEST ((x == y) || (x < y)); /* Not optimized */
|
||||||
|
TEST ((y == x) || (x < y)); /* Not optimized */
|
||||||
|
}
|
||||||
|
|
||||||
|
static void iungt (float x, float y, int ok)
|
||||||
|
{
|
||||||
|
TEST (UNGT (x, y));
|
||||||
|
TEST (UNORD (x, y) || (x > y));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void igt (float x, float y, int ok)
|
||||||
|
{
|
||||||
|
TEST (ORD (x, y) && UNGT (x, y)); /* Not optimized */
|
||||||
|
TEST ((x >= y) && (x != y));
|
||||||
|
TEST ((x >= y) && (y != x));
|
||||||
|
TEST ((x != y) && (x >= y)); /* Not optimized */
|
||||||
|
TEST ((y != x) && (x >= y)); /* Not optimized */
|
||||||
|
}
|
||||||
|
|
||||||
|
static void iunge (float x, float y, int ok)
|
||||||
|
{
|
||||||
|
TEST (UNGE (x, y));
|
||||||
|
TEST (UNORD (x, y) || (x >= y));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ige (float x, float y, int ok)
|
||||||
|
{
|
||||||
|
TEST (ORD (x, y) && UNGE (x, y)); /* Not optimized */
|
||||||
|
TEST ((x > y) || (x == y));
|
||||||
|
TEST ((y < x) || (x == y));
|
||||||
|
TEST ((x == y) || (x > y)); /* Not optimized */
|
||||||
|
TEST ((y == x) || (x > y)); /* Not optimized */
|
||||||
|
}
|
||||||
|
|
||||||
|
int fpu_post_test_math6 (void)
|
||||||
|
{
|
||||||
|
pinf = __builtin_inf ();
|
||||||
|
ninf = -__builtin_inf ();
|
||||||
|
NaN = __builtin_nan ("");
|
||||||
|
|
||||||
|
iuneq (ninf, pinf, 0);
|
||||||
|
iuneq (NaN, NaN, 1);
|
||||||
|
iuneq (pinf, ninf, 0);
|
||||||
|
iuneq (1, 4, 0);
|
||||||
|
iuneq (3, 3, 1);
|
||||||
|
iuneq (5, 2, 0);
|
||||||
|
|
||||||
|
ieq (1, 4, 0);
|
||||||
|
ieq (3, 3, 1);
|
||||||
|
ieq (5, 2, 0);
|
||||||
|
|
||||||
|
iltgt (ninf, pinf, 1);
|
||||||
|
iltgt (NaN, NaN, 0);
|
||||||
|
iltgt (pinf, ninf, 1);
|
||||||
|
iltgt (1, 4, 1);
|
||||||
|
iltgt (3, 3, 0);
|
||||||
|
iltgt (5, 2, 1);
|
||||||
|
|
||||||
|
ine (1, 4, 1);
|
||||||
|
ine (3, 3, 0);
|
||||||
|
ine (5, 2, 1);
|
||||||
|
|
||||||
|
iunlt (NaN, ninf, 1);
|
||||||
|
iunlt (pinf, NaN, 1);
|
||||||
|
iunlt (pinf, ninf, 0);
|
||||||
|
iunlt (pinf, pinf, 0);
|
||||||
|
iunlt (ninf, ninf, 0);
|
||||||
|
iunlt (1, 4, 1);
|
||||||
|
iunlt (3, 3, 0);
|
||||||
|
iunlt (5, 2, 0);
|
||||||
|
|
||||||
|
ilt (1, 4, 1);
|
||||||
|
ilt (3, 3, 0);
|
||||||
|
ilt (5, 2, 0);
|
||||||
|
|
||||||
|
iunle (NaN, ninf, 1);
|
||||||
|
iunle (pinf, NaN, 1);
|
||||||
|
iunle (pinf, ninf, 0);
|
||||||
|
iunle (pinf, pinf, 1);
|
||||||
|
iunle (ninf, ninf, 1);
|
||||||
|
iunle (1, 4, 1);
|
||||||
|
iunle (3, 3, 1);
|
||||||
|
iunle (5, 2, 0);
|
||||||
|
|
||||||
|
ile (1, 4, 1);
|
||||||
|
ile (3, 3, 1);
|
||||||
|
ile (5, 2, 0);
|
||||||
|
|
||||||
|
iungt (NaN, ninf, 1);
|
||||||
|
iungt (pinf, NaN, 1);
|
||||||
|
iungt (pinf, ninf, 1);
|
||||||
|
iungt (pinf, pinf, 0);
|
||||||
|
iungt (ninf, ninf, 0);
|
||||||
|
iungt (1, 4, 0);
|
||||||
|
iungt (3, 3, 0);
|
||||||
|
iungt (5, 2, 1);
|
||||||
|
|
||||||
|
igt (1, 4, 0);
|
||||||
|
igt (3, 3, 0);
|
||||||
|
igt (5, 2, 1);
|
||||||
|
|
||||||
|
iunge (NaN, ninf, 1);
|
||||||
|
iunge (pinf, NaN, 1);
|
||||||
|
iunge (ninf, pinf, 0);
|
||||||
|
iunge (pinf, pinf, 1);
|
||||||
|
iunge (ninf, ninf, 1);
|
||||||
|
iunge (1, 4, 0);
|
||||||
|
iunge (3, 3, 1);
|
||||||
|
iunge (5, 2, 1);
|
||||||
|
|
||||||
|
ige (1, 4, 0);
|
||||||
|
ige (3, 3, 1);
|
||||||
|
ige (5, 2, 1);
|
||||||
|
|
||||||
|
if (failed) {
|
||||||
|
post_log ("Error in FPU math6 test\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CONFIG_POST & CFG_POST_FPU */
|
||||||
|
#endif /* CONFIG_POST */
|
92
post/lib_ppc/fpu/fpu.c
Normal file
92
post/lib_ppc/fpu/fpu.c
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2007
|
||||||
|
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||||
|
*
|
||||||
|
* Author: Sergei Poselenov <sposelenov@emcraft.com>
|
||||||
|
*
|
||||||
|
* 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 <common.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FPU test
|
||||||
|
*
|
||||||
|
* This test checks the arithmetic logic unit (ALU) of CPU.
|
||||||
|
* It tests independently various groups of instructions using
|
||||||
|
* run-time modification of the code to reduce the memory footprint.
|
||||||
|
* For more details refer to post/cpu/ *.c files.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef CONFIG_POST
|
||||||
|
|
||||||
|
#include <post.h>
|
||||||
|
|
||||||
|
#if CONFIG_POST & CFG_POST_FPU
|
||||||
|
|
||||||
|
#include <watchdog.h>
|
||||||
|
|
||||||
|
extern int fpu_status (void);
|
||||||
|
extern void fpu_enable (void);
|
||||||
|
extern void fpu_disable (void);
|
||||||
|
|
||||||
|
extern int fpu_post_test_math1 (void);
|
||||||
|
extern int fpu_post_test_math2 (void);
|
||||||
|
extern int fpu_post_test_math3 (void);
|
||||||
|
extern int fpu_post_test_math4 (void);
|
||||||
|
extern int fpu_post_test_math5 (void);
|
||||||
|
extern int fpu_post_test_math6 (void);
|
||||||
|
extern int fpu_post_test_math7 (void);
|
||||||
|
|
||||||
|
int fpu_post_test (int flags)
|
||||||
|
{
|
||||||
|
int fpu = fpu_status ();
|
||||||
|
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
WATCHDOG_RESET ();
|
||||||
|
|
||||||
|
if (!fpu)
|
||||||
|
fpu_enable ();
|
||||||
|
|
||||||
|
if (ret == 0)
|
||||||
|
ret = fpu_post_test_math1 ();
|
||||||
|
if (ret == 0)
|
||||||
|
ret = fpu_post_test_math2 ();
|
||||||
|
if (ret == 0)
|
||||||
|
ret = fpu_post_test_math3 ();
|
||||||
|
if (ret == 0)
|
||||||
|
ret = fpu_post_test_math4 ();
|
||||||
|
if (ret == 0)
|
||||||
|
ret = fpu_post_test_math5 ();
|
||||||
|
if (ret == 0)
|
||||||
|
ret = fpu_post_test_math6 ();
|
||||||
|
if (ret == 0)
|
||||||
|
ret = fpu_post_test_math7 ();
|
||||||
|
|
||||||
|
if (!fpu)
|
||||||
|
fpu_disable ();
|
||||||
|
|
||||||
|
WATCHDOG_RESET ();
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CONFIG_POST & CFG_POST_FPU */
|
||||||
|
#endif /* CONFIG_POST */
|
103
post/lib_ppc/fpu/mul-subnormal-single-1.c
Normal file
103
post/lib_ppc/fpu/mul-subnormal-single-1.c
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2007
|
||||||
|
* Wolfgang Denk, DENX Software Engineering, 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
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* This file is originally a part of the GCC testsuite.
|
||||||
|
* Check that certain subnormal numbers (formerly known as denormalized
|
||||||
|
* numbers) are rounded to within 0.5 ulp. PR other/14354.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <common.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_POST
|
||||||
|
|
||||||
|
#include <post.h>
|
||||||
|
|
||||||
|
#if CONFIG_POST & CFG_POST_FPU
|
||||||
|
|
||||||
|
union uf
|
||||||
|
{
|
||||||
|
unsigned int u;
|
||||||
|
float f;
|
||||||
|
};
|
||||||
|
|
||||||
|
static float
|
||||||
|
u2f (unsigned int v)
|
||||||
|
{
|
||||||
|
union uf u;
|
||||||
|
u.u = v;
|
||||||
|
return u.f;
|
||||||
|
}
|
||||||
|
|
||||||
|
static unsigned int
|
||||||
|
f2u (float v)
|
||||||
|
{
|
||||||
|
union uf u;
|
||||||
|
u.f = v;
|
||||||
|
return u.u;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ok = 1;
|
||||||
|
|
||||||
|
static void
|
||||||
|
tstmul (unsigned int ux, unsigned int uy, unsigned int ur)
|
||||||
|
{
|
||||||
|
float x = u2f (ux);
|
||||||
|
float y = u2f (uy);
|
||||||
|
|
||||||
|
if (f2u (x * y) != ur)
|
||||||
|
/* Set a variable rather than aborting here, to simplify tracing when
|
||||||
|
several computations are wrong. */
|
||||||
|
ok = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* We don't want to make this const and static, or else we risk inlining
|
||||||
|
causing the test to fold as constants at compile-time. */
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
unsigned int p1, p2, res;
|
||||||
|
} static volatile expected[] =
|
||||||
|
{
|
||||||
|
{0xfff, 0x3f800400, 0xfff},
|
||||||
|
{0xf, 0x3fc88888, 0x17},
|
||||||
|
{0xf, 0x3f844444, 0xf}
|
||||||
|
};
|
||||||
|
|
||||||
|
int fpu_post_test_math7 (void)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
for (i = 0; i < sizeof (expected) / sizeof (expected[0]); i++)
|
||||||
|
{
|
||||||
|
tstmul (expected[i].p1, expected[i].p2, expected[i].res);
|
||||||
|
tstmul (expected[i].p2, expected[i].p1, expected[i].res);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ok) {
|
||||||
|
post_log ("Error in FPU math7 test\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* CONFIG_POST & CFG_POST_FPU */
|
||||||
|
#endif /* CONFIG_POST */
|
Loading…
Reference in New Issue
Block a user