mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2026-06-13 06:59:41 +03:00
Compare commits
87 Commits
v2010.06-r
...
v2010.06
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a59e279976 | ||
|
|
161e4ae460 | ||
|
|
7030d56b79 | ||
|
|
e03b4d296b | ||
|
|
9fb3b50857 | ||
|
|
0d7f4abcf6 | ||
|
|
38c38c344c | ||
|
|
c987f4753b | ||
|
|
d3bee08332 | ||
|
|
cdc6363f42 | ||
|
|
4ccd5510e5 | ||
|
|
482126e27b | ||
|
|
460c2ce362 | ||
|
|
47ea6edfb3 | ||
|
|
ceeba00308 | ||
|
|
b8c4eea56b | ||
|
|
d6b9371420 | ||
|
|
39e9b7c3c3 | ||
|
|
23fdf05806 | ||
|
|
95bc39e848 | ||
|
|
a71da1b6c9 | ||
|
|
96b35730a4 | ||
|
|
6de27bdc78 | ||
|
|
e397e59e86 | ||
|
|
9c00b2f0a3 | ||
|
|
9312bba01a | ||
|
|
cd040a4953 | ||
|
|
1f241263e0 | ||
|
|
cecda170e7 | ||
|
|
530135dcac | ||
|
|
399b09331f | ||
|
|
ce9c227cc7 | ||
|
|
83142c112d | ||
|
|
0c61e6f925 | ||
|
|
376e7fadba | ||
|
|
c474a8ebb8 | ||
|
|
ffb4b02554 | ||
|
|
a9046b9e1a | ||
|
|
3a96ad851f | ||
|
|
89b765c7f6 | ||
|
|
158557001a | ||
|
|
9d79956029 | ||
|
|
5246d01edd | ||
|
|
9268236529 | ||
|
|
1a5038ca68 | ||
|
|
ed01e45cfa | ||
|
|
cae377b59a | ||
|
|
d11212e377 | ||
|
|
675e0eaf0f | ||
|
|
5cc48f7e55 | ||
|
|
3712367c48 | ||
|
|
678e008c3a | ||
|
|
2391174048 | ||
|
|
05ee415e31 | ||
|
|
3d9f0ffdda | ||
|
|
8aa5c7cdc4 | ||
|
|
16807ee411 | ||
|
|
7ca4766bd7 | ||
|
|
04cbc19fed | ||
|
|
da1ec42aaf | ||
|
|
b87996d24a | ||
|
|
b5d289fc29 | ||
|
|
f986325dd5 | ||
|
|
409a07c9d7 | ||
|
|
9bb3b3d440 | ||
|
|
a81cd434b9 | ||
|
|
3057c6be5e | ||
|
|
5f4d36825a | ||
|
|
6e37a04407 | ||
|
|
bd7bb6f8a3 | ||
|
|
39c209546a | ||
|
|
35269d3fca | ||
|
|
6e85d07a85 | ||
|
|
551bd947bd | ||
|
|
1117cbf2ad | ||
|
|
6803336c9f | ||
|
|
8d52ea6db4 | ||
|
|
0df01fd3d7 | ||
|
|
661ba14051 | ||
|
|
1e8e9bad2d | ||
|
|
3e6b86b555 | ||
|
|
cedd341d55 | ||
|
|
adf55679af | ||
|
|
ae49099755 | ||
|
|
e9b43cae1a | ||
|
|
d0fe1128c4 | ||
|
|
c941b77adc |
52
MAINTAINERS
52
MAINTAINERS
@@ -62,6 +62,10 @@ Oliver Brown <obrown@adventnetworks.com>
|
||||
|
||||
gw8260 MPC8260
|
||||
|
||||
Cyril Chemparathy <cyril@ti.com>
|
||||
|
||||
tnetv107x_evm tnetv107x
|
||||
|
||||
Conn Clark <clark@esteem.com>
|
||||
|
||||
ESTEEM192E MPC8xx
|
||||
@@ -228,6 +232,7 @@ Ilko Iliev <iliev@ronetix.at>
|
||||
|
||||
PM9261 AT91SAM9261
|
||||
PM9263 AT91SAM9263
|
||||
PM9G45 ARM926EJS (AT91SAM9G45 SoC)
|
||||
|
||||
Gary Jennejohn <garyj@denx.de>
|
||||
|
||||
@@ -349,6 +354,10 @@ Daniel Poirot <dan.poirot@windriver.com>
|
||||
sbc8240 MPC8240
|
||||
sbc405 PPC405GP
|
||||
|
||||
Sudhakar Rajashekhara <sudhakar.raj@ti.com>
|
||||
|
||||
da850evm ARM926EJS (DA850/OMAP-L138)
|
||||
|
||||
Ricardo Ribalda <ricardo.ribalda@uam.es>
|
||||
|
||||
ml507 PPC440x5
|
||||
@@ -525,6 +534,10 @@ Unknown / orphaned boards:
|
||||
# Board CPU #
|
||||
#########################################################################
|
||||
|
||||
Albert ARIBAUD <albert.aribaud@free.fr>
|
||||
|
||||
edminiv2 ARM926EJS (Orion5x SoC)
|
||||
|
||||
Rowel Atienza <rowel@diwalabs.com>
|
||||
|
||||
armadillo ARM720T
|
||||
@@ -600,6 +613,10 @@ Kshitij Gupta <kshitij@ti.com>
|
||||
omap1510inn ARM925T
|
||||
omap1610inn ARM926EJS
|
||||
|
||||
Vaibhav Hiremath <hvaibhav@ti.com>
|
||||
|
||||
am3517_evm ARM CORTEX-A8 (AM35x SoC)
|
||||
|
||||
Grazvydas Ignotas <notasas@gmail.com>
|
||||
|
||||
omap3_pandora ARM CORTEX-A8 (OMAP3xx SoC)
|
||||
@@ -626,14 +643,15 @@ Simon Kagstrom <simon.kagstrom@netinsight.net>
|
||||
|
||||
openrd_base ARM926EJS (Kirkwood SoC)
|
||||
|
||||
Minkyu Kang <mk7.kang@samsung.com>
|
||||
|
||||
SMDKC100 ARM CORTEX-A8 (S5PC100 SoC)
|
||||
|
||||
Nishant Kamat <nskamat@ti.com>
|
||||
|
||||
omap1610h2 ARM926EJS
|
||||
|
||||
Minkyu Kang <mk7.kang@samsung.com>
|
||||
|
||||
s5p_goni ARM CORTEX-A8 (S5PC110 SoC)
|
||||
SMDKC100 ARM CORTEX-A8 (S5PC100 SoC)
|
||||
|
||||
Frederik Kriewitz <frederik@kriewitz.eu>
|
||||
|
||||
devkit8000 ARM CORTEX-A8 (OMAP3530 SoC)
|
||||
@@ -659,12 +677,6 @@ Sergey Lapin <slapin@ossfans.org>
|
||||
|
||||
afeb9260 ARM926EJS (AT91SAM9260 SoC)
|
||||
|
||||
Guennadi Liakhovetski <g.liakhovetski@gmx.de>
|
||||
|
||||
imx31_phycore_eet i.MX31
|
||||
mx31ads i.MX31
|
||||
SMDK6400 S3C6400
|
||||
|
||||
Nishanth Menon <nm@ti.com>
|
||||
|
||||
omap3_sdp3430 ARM CORTEX-A8 (OMAP3xx SoC)
|
||||
@@ -807,6 +819,10 @@ Unknown / orphaned boards:
|
||||
ixdp425 xscale Kyle Harris <kharris@nexus-tech.net> / dead address
|
||||
lubbock xscale Kyle Harris <kharris@nexus-tech.net> / dead address
|
||||
|
||||
imx31_phycore_eet i.MX31 Guennadi Liakhovetski <g.liakhovetski@gmx.de> / resigned
|
||||
mx31ads i.MX31 Guennadi Liakhovetski <g.liakhovetski@gmx.de> / resigned
|
||||
SMDK6400 S3C6400 Guennadi Liakhovetski <g.liakhovetski@gmx.de> / resigned
|
||||
|
||||
#########################################################################
|
||||
# x86 Systems: #
|
||||
# #
|
||||
@@ -841,22 +857,6 @@ Stefan Roese <sr@denx.de>
|
||||
|
||||
vct_xxx MIPS32 4Kc
|
||||
|
||||
#########################################################################
|
||||
# Nios-32 Systems: #
|
||||
# #
|
||||
# Maintainer Name, Email Address #
|
||||
# Board CPU #
|
||||
#########################################################################
|
||||
|
||||
Stephan Linz <linz@li-pro.net>
|
||||
|
||||
DK1S10 Nios-32
|
||||
ADNPESC1 Nios-32
|
||||
|
||||
Scott McNutt <smcnutt@psyent.com>
|
||||
|
||||
DK1C20 Nios-32
|
||||
|
||||
#########################################################################
|
||||
# Nios-II Systems: #
|
||||
# #
|
||||
|
||||
25
MAKEALL
25
MAKEALL
@@ -393,6 +393,7 @@ LIST_85xx=" \
|
||||
MPC8536DS_NAND \
|
||||
MPC8536DS_SDCARD \
|
||||
MPC8536DS_SPIFLASH \
|
||||
MPC8536DS_36BIT \
|
||||
MPC8540ADS \
|
||||
MPC8540EVAL \
|
||||
MPC8541CDS \
|
||||
@@ -453,6 +454,7 @@ LIST_85xx=" \
|
||||
|
||||
LIST_86xx=" \
|
||||
MPC8610HPCD \
|
||||
MPC8641HPCN_36BIT \
|
||||
MPC8641HPCN \
|
||||
sbc8641d \
|
||||
XPEDITE5170 \
|
||||
@@ -561,6 +563,7 @@ LIST_ARM9=" \
|
||||
cp946es \
|
||||
cp966 \
|
||||
da830evm \
|
||||
da850evm \
|
||||
edb9301 \
|
||||
edb9302 \
|
||||
edb9302a \
|
||||
@@ -569,6 +572,7 @@ LIST_ARM9=" \
|
||||
edb9312 \
|
||||
edb9315 \
|
||||
edb9315a \
|
||||
edminiv2 \
|
||||
guruplug \
|
||||
imx27lite \
|
||||
lpd7a400 \
|
||||
@@ -635,12 +639,14 @@ LIST_ARM11=" \
|
||||
mx31pdk_nand \
|
||||
qong \
|
||||
smdk6400 \
|
||||
tnetv107x_evm \
|
||||
"
|
||||
|
||||
#########################################################################
|
||||
## ARM Cortex-A8 Systems
|
||||
#########################################################################
|
||||
LIST_ARM_CORTEX_A8=" \
|
||||
am3517_evm \
|
||||
devkit8000 \
|
||||
mx51evk \
|
||||
omap3_beagle \
|
||||
@@ -650,6 +656,7 @@ LIST_ARM_CORTEX_A8=" \
|
||||
omap3_sdp3430 \
|
||||
omap3_zoom1 \
|
||||
omap3_zoom2 \
|
||||
s5p_goni \
|
||||
smdkc100 \
|
||||
"
|
||||
|
||||
@@ -682,6 +689,7 @@ LIST_at91=" \
|
||||
otc570 \
|
||||
pm9261 \
|
||||
pm9263 \
|
||||
pm9g45 \
|
||||
SBC35_A9G20 \
|
||||
TNY_A9260 \
|
||||
TNY_A9G20 \
|
||||
@@ -810,21 +818,6 @@ LIST_x86=" \
|
||||
${LIST_I486} \
|
||||
"
|
||||
|
||||
#########################################################################
|
||||
## NIOS Systems
|
||||
#########################################################################
|
||||
|
||||
LIST_nios=" \
|
||||
ADNPESC1 \
|
||||
ADNPESC1_base_32 \
|
||||
ADNPESC1_DNPEVA2_base_32\
|
||||
DK1C20 \
|
||||
DK1C20_standard_32 \
|
||||
DK1S10 \
|
||||
DK1S10_standard_32 \
|
||||
DK1S10_mtx_ldk_20 \
|
||||
"
|
||||
|
||||
#########################################################################
|
||||
## Nios-II Systems
|
||||
#########################################################################
|
||||
@@ -1017,7 +1010,7 @@ do
|
||||
|coldfire \
|
||||
|microblaze \
|
||||
|mips|mips_el \
|
||||
|nios|nios2 \
|
||||
|nios2 \
|
||||
|ppc|powerpc|5xx|5xxx|512x|8xx|8220|824x|8260|83xx|85xx|86xx|4xx|7xx|74xx|TSEC \
|
||||
|sh|sh2|sh3|sh4 \
|
||||
|sparc \
|
||||
|
||||
91
Makefile
91
Makefile
@@ -24,7 +24,7 @@
|
||||
VERSION = 2010
|
||||
PATCHLEVEL = 06
|
||||
SUBLEVEL =
|
||||
EXTRAVERSION = -rc1
|
||||
EXTRAVERSION =
|
||||
ifneq "$(SUBLEVEL)" ""
|
||||
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
|
||||
else
|
||||
@@ -385,8 +385,8 @@ $(VERSION_FILE):
|
||||
@cmp -s $@ $@.tmp && rm -f $@.tmp || mv -f $@.tmp $@
|
||||
|
||||
$(TIMESTAMP_FILE):
|
||||
@date +'#define U_BOOT_DATE "%b %d %C%y"' > $@
|
||||
@date +'#define U_BOOT_TIME "%T"' >> $@
|
||||
@LC_ALL=C date +'#define U_BOOT_DATE "%b %d %C%y"' > $@
|
||||
@LC_ALL=C date +'#define U_BOOT_TIME "%T"' >> $@
|
||||
|
||||
gdbtools:
|
||||
$(MAKE) -C tools/gdb all || exit 1
|
||||
@@ -2873,6 +2873,10 @@ otc570_config : unconfig
|
||||
pm9263_config : unconfig
|
||||
@$(MKCONFIG) $(@:_config=) arm arm926ejs pm9263 ronetix at91
|
||||
|
||||
pm9g45_config : unconfig
|
||||
@mkdir -p $(obj)include
|
||||
@$(MKCONFIG) -a pm9g45 arm arm926ejs pm9g45 ronetix at91
|
||||
|
||||
SBC35_A9G20_NANDFLASH_config \
|
||||
SBC35_A9G20_EEPROM_config \
|
||||
SBC35_A9G20_config : unconfig
|
||||
@@ -2916,8 +2920,9 @@ cp922_XA10_config \
|
||||
cp1026_config: unconfig
|
||||
@board/armltd/integrator/split_by_variant.sh cp $@
|
||||
|
||||
da830evm_config: unconfig
|
||||
@$(MKCONFIG) $(@:_config=) arm arm926ejs da830evm davinci davinci
|
||||
da830evm_config \
|
||||
da850evm_config: unconfig
|
||||
@$(MKCONFIG) $(@:_config=) arm arm926ejs da8xxevm davinci davinci
|
||||
|
||||
davinci_dvevm_config : unconfig
|
||||
@$(MKCONFIG) $(@:_config=) arm arm926ejs dvevm davinci davinci
|
||||
@@ -2943,6 +2948,9 @@ davinci_dm365evm_config : unconfig
|
||||
davinci_dm6467evm_config : unconfig
|
||||
@$(MKCONFIG) $(@:_config=) arm arm926ejs dm6467evm davinci davinci
|
||||
|
||||
edminiv2_config: unconfig
|
||||
@$(MKCONFIG) $(@:_config=) arm arm926ejs $(@:_config=) LaCie orion5x
|
||||
|
||||
guruplug_config: unconfig
|
||||
@$(MKCONFIG) $(@:_config=) arm arm926ejs $(@:_config=) Marvell kirkwood
|
||||
|
||||
@@ -3155,6 +3163,9 @@ SMN42_config : unconfig
|
||||
## ARM CORTEX Systems
|
||||
#########################################################################
|
||||
|
||||
am3517_evm_config : unconfig
|
||||
@$(MKCONFIG) $(@:_config=) arm arm_cortexa8 am3517evm logicpd omap3
|
||||
|
||||
devkit8000_config : unconfig
|
||||
@$(MKCONFIG) $(@:_config=) arm arm_cortexa8 devkit8000 timll omap3
|
||||
|
||||
@@ -3179,6 +3190,9 @@ omap3_zoom1_config : unconfig
|
||||
omap3_zoom2_config : unconfig
|
||||
@$(MKCONFIG) $(@:_config=) arm arm_cortexa8 zoom2 logicpd omap3
|
||||
|
||||
s5p_goni_config: unconfig
|
||||
@$(MKCONFIG) $(@:_config=) arm arm_cortexa8 goni samsung s5pc1xx
|
||||
|
||||
smdkc100_config: unconfig
|
||||
@$(MKCONFIG) $(@:_config=) arm arm_cortexa8 smdkc100 samsung s5pc1xx
|
||||
|
||||
@@ -3324,6 +3338,9 @@ smdk6400_config : unconfig
|
||||
fi
|
||||
@echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk
|
||||
|
||||
tnetv107x_evm_config: unconfig
|
||||
@$(MKCONFIG) $(@:_config=) arm arm1176 tnetv107xevm ti tnetv107x
|
||||
|
||||
#========================================================================
|
||||
# i386
|
||||
#========================================================================
|
||||
@@ -3462,68 +3479,6 @@ purple_config : unconfig
|
||||
#========================================================================
|
||||
# Nios
|
||||
#========================================================================
|
||||
#########################################################################
|
||||
## Nios32
|
||||
#########################################################################
|
||||
|
||||
ADNPESC1_DNPEVA2_base_32_config \
|
||||
ADNPESC1_base_32_config \
|
||||
ADNPESC1_config: unconfig
|
||||
@mkdir -p $(obj)include
|
||||
@[ -z "$(findstring _DNPEVA2,$@)" ] || \
|
||||
{ echo "#define CONFIG_DNPEVA2 1" >>$(obj)include/config.h ; \
|
||||
$(XECHO) "... DNP/EVA2 configuration" ; \
|
||||
}
|
||||
@[ -z "$(findstring _base_32,$@)" ] || \
|
||||
{ echo "#define CONFIG_NIOS_BASE_32 1" >>$(obj)include/config.h ; \
|
||||
$(XECHO) "... NIOS 'base_32' configuration" ; \
|
||||
}
|
||||
@[ -z "$(findstring ADNPESC1_config,$@)" ] || \
|
||||
{ echo "#define CONFIG_NIOS_BASE_32 1" >>$(obj)include/config.h ; \
|
||||
$(XECHO) "... NIOS 'base_32' configuration (DEFAULT)" ; \
|
||||
}
|
||||
@$(MKCONFIG) -a ADNPESC1 nios nios adnpesc1 ssv
|
||||
|
||||
DK1C20_safe_32_config \
|
||||
DK1C20_standard_32_config \
|
||||
DK1C20_config: unconfig
|
||||
@mkdir -p $(obj)include
|
||||
@[ -z "$(findstring _safe_32,$@)" ] || \
|
||||
{ echo "#define CONFIG_NIOS_SAFE_32 1" >>$(obj)include/config.h ; \
|
||||
$(XECHO) "... NIOS 'safe_32' configuration" ; \
|
||||
}
|
||||
@[ -z "$(findstring _standard_32,$@)" ] || \
|
||||
{ echo "#define CONFIG_NIOS_STANDARD_32 1" >>$(obj)include/config.h ; \
|
||||
$(XECHO) "... NIOS 'standard_32' configuration" ; \
|
||||
}
|
||||
@[ -z "$(findstring DK1C20_config,$@)" ] || \
|
||||
{ echo "#define CONFIG_NIOS_STANDARD_32 1" >>$(obj)include/config.h ; \
|
||||
$(XECHO) "... NIOS 'standard_32' configuration (DEFAULT)" ; \
|
||||
}
|
||||
@$(MKCONFIG) -a DK1C20 nios nios dk1c20 altera
|
||||
|
||||
DK1S10_safe_32_config \
|
||||
DK1S10_standard_32_config \
|
||||
DK1S10_mtx_ldk_20_config \
|
||||
DK1S10_config: unconfig
|
||||
@mkdir -p $(obj)include
|
||||
@[ -z "$(findstring _safe_32,$@)" ] || \
|
||||
{ echo "#define CONFIG_NIOS_SAFE_32 1" >>$(obj)include/config.h ; \
|
||||
$(XECHO) "... NIOS 'safe_32' configuration" ; \
|
||||
}
|
||||
@[ -z "$(findstring _standard_32,$@)" ] || \
|
||||
{ echo "#define CONFIG_NIOS_STANDARD_32 1" >>$(obj)include/config.h ; \
|
||||
$(XECHO) "... NIOS 'standard_32' configuration" ; \
|
||||
}
|
||||
@[ -z "$(findstring _mtx_ldk_20,$@)" ] || \
|
||||
{ echo "#define CONFIG_NIOS_MTX_LDK_20 1" >>$(obj)include/config.h ; \
|
||||
$(XECHO) "... NIOS 'mtx_ldk_20' configuration" ; \
|
||||
}
|
||||
@[ -z "$(findstring DK1S10_config,$@)" ] || \
|
||||
{ echo "#define CONFIG_NIOS_STANDARD_32 1" >>$(obj)include/config.h ; \
|
||||
$(XECHO) "... NIOS 'standard_32' configuration (DEFAULT)" ; \
|
||||
}
|
||||
@$(MKCONFIG) -a DK1S10 nios nios dk1s10 altera
|
||||
|
||||
#########################################################################
|
||||
## Nios-II
|
||||
@@ -3796,6 +3751,6 @@ endif
|
||||
|
||||
backup:
|
||||
F=`basename $(TOPDIR)` ; cd .. ; \
|
||||
gtar --force-local -zcvf `date "+$$F-%Y-%m-%d-%T.tar.gz"` $$F
|
||||
gtar --force-local -zcvf `LC_ALL=C date "+$$F-%Y-%m-%d-%T.tar.gz"` $$F
|
||||
|
||||
#########################################################################
|
||||
|
||||
23
README
23
README
@@ -143,9 +143,9 @@ Directory Hierarchy:
|
||||
/cpu CPU specific files
|
||||
/arm720t Files specific to ARM 720 CPUs
|
||||
/arm920t Files specific to ARM 920 CPUs
|
||||
/at91rm9200 Files specific to Atmel AT91RM9200 CPU
|
||||
/imx Files specific to Freescale MC9328 i.MX CPUs
|
||||
/s3c24x0 Files specific to Samsung S3C24X0 CPUs
|
||||
/at91rm9200 Files specific to Atmel AT91RM9200 CPU
|
||||
/imx Files specific to Freescale MC9328 i.MX CPUs
|
||||
/s3c24x0 Files specific to Samsung S3C24X0 CPUs
|
||||
/arm925t Files specific to ARM 925 CPUs
|
||||
/arm926ejs Files specific to ARM 926 CPUs
|
||||
/arm1136 Files specific to ARM 1136 CPUs
|
||||
@@ -177,9 +177,6 @@ Directory Hierarchy:
|
||||
/mips Files generic to MIPS architecture
|
||||
/cpu CPU specific files
|
||||
/lib Architecture specific library files
|
||||
/nios Files generic to Altera NIOS architecture
|
||||
/cpu CPU specific files
|
||||
/lib Architecture specific library files
|
||||
/nios2 Files generic to Altera NIOS2 architecture
|
||||
/cpu CPU specific files
|
||||
/lib Architecture specific library files
|
||||
@@ -2507,7 +2504,7 @@ to save the current settings.
|
||||
I2C muxes, you can define here, how to reach this
|
||||
EEPROM. For example:
|
||||
|
||||
#define CONFIG_I2C_ENV_EEPROM_BUS "pca9547:70:d\0"
|
||||
#define CONFIG_I2C_ENV_EEPROM_BUS "pca9547:70:d\0"
|
||||
|
||||
EEPROM which holds the environment, is reached over
|
||||
a pca9547 i2c mux with address 0x70, channel 3.
|
||||
@@ -3337,8 +3334,8 @@ details; basically, the header defines the following image properties:
|
||||
Currently supported: Linux, NetBSD, VxWorks, QNX, RTEMS, LynxOS,
|
||||
INTEGRITY).
|
||||
* Target CPU Architecture (Provisions for Alpha, ARM, AVR32, Intel x86,
|
||||
IA64, MIPS, NIOS, PowerPC, IBM S390, SuperH, Sparc, Sparc 64 Bit;
|
||||
Currently supported: ARM, AVR32, Intel x86, MIPS, NIOS, PowerPC).
|
||||
IA64, MIPS, Nios II, PowerPC, IBM S390, SuperH, Sparc, Sparc 64 Bit;
|
||||
Currently supported: ARM, AVR32, Intel x86, MIPS, Nios II, PowerPC).
|
||||
* Compression Type (uncompressed, gzip, bzip2)
|
||||
* Load Address
|
||||
* Entry Point
|
||||
@@ -4023,6 +4020,14 @@ On ARM, the following registers are used:
|
||||
|
||||
==> U-Boot will use R8 to hold a pointer to the global data
|
||||
|
||||
On Nios II, the ABI is documented here:
|
||||
http://www.altera.com/literature/hb/nios2/n2cpu_nii51016.pdf
|
||||
|
||||
==> U-Boot will use gp to hold a pointer to the global data
|
||||
|
||||
Note: on Nios II, we give "-G0" option to gcc and don't use gp
|
||||
to access small data sections, so gp is free.
|
||||
|
||||
NOTE: DECLARE_GLOBAL_DATA_PTR must be used with file-global scope,
|
||||
or current versions of GCC may "optimize" the code too much.
|
||||
|
||||
|
||||
@@ -71,6 +71,7 @@ static void cache_flush(void)
|
||||
{
|
||||
unsigned long i = 0;
|
||||
|
||||
asm ("mcr p15, 0, %0, c7, c10, 0": :"r" (i)); /* clean entire data cache */
|
||||
asm ("mcr p15, 0, %0, c7, c7, 0": :"r" (i)); /* invalidate both caches and flush btb */
|
||||
asm ("mcr p15, 0, %0, c7, c10, 4": :"r" (i)); /* mem barrier to sync things */
|
||||
}
|
||||
|
||||
@@ -185,6 +185,7 @@ stack_setup:
|
||||
#endif
|
||||
sub sp, r0, #12 /* leave 3 words for abort-stack */
|
||||
#endif /* CONFIG_PRELOADER */
|
||||
bic sp, sp, #7 /* 8-byte alignment for ABI compliance */
|
||||
|
||||
clear_bss:
|
||||
ldr r0, _bss_start /* find start of bss segment */
|
||||
@@ -226,8 +227,8 @@ cpu_init_crit:
|
||||
* flush v4 I/D caches
|
||||
*/
|
||||
mov r0, #0
|
||||
mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */
|
||||
mcr p15, 0, r0, c8, c7, 0 /* flush v4 TLB */
|
||||
mcr p15, 0, r0, c7, c7, 0 /* Invalidate I+D+BTB caches */
|
||||
mcr p15, 0, r0, c8, c7, 0 /* Invalidate Unified TLB */
|
||||
|
||||
/*
|
||||
* disable MMU stuff and caches
|
||||
|
||||
@@ -33,9 +33,6 @@
|
||||
|
||||
#include <common.h>
|
||||
#include <command.h>
|
||||
#ifdef CONFIG_S3C64XX
|
||||
#include <asm/arch/s3c6400.h>
|
||||
#endif
|
||||
#include <asm/system.h>
|
||||
|
||||
static void cache_flush (void);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* armboot - Startup Code for S3C6400/ARM1176 CPU-core
|
||||
* armboot - Startup Code for ARM1176 CPU-core
|
||||
*
|
||||
* Copyright (c) 2007 Samsung Electronics
|
||||
*
|
||||
@@ -35,9 +35,6 @@
|
||||
#ifdef CONFIG_ENABLE_MMU
|
||||
#include <asm/proc/domain.h>
|
||||
#endif
|
||||
#ifdef CONFIG_S3C64XX
|
||||
#include <asm/arch/s3c6400.h>
|
||||
#endif
|
||||
|
||||
#if !defined(CONFIG_ENABLE_MMU) && !defined(CONFIG_SYS_PHY_UBOOT_BASE)
|
||||
#define CONFIG_SYS_PHY_UBOOT_BASE CONFIG_SYS_UBOOT_BASE
|
||||
@@ -172,14 +169,10 @@ cpu_init_crit:
|
||||
bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B--- -CAM)
|
||||
orr r0, r0, #0x00000002 @ set bit 2 (A) Align
|
||||
orr r0, r0, #0x00001000 @ set bit 12 (I) I-Cache
|
||||
|
||||
/* Prepare to disable the MMU */
|
||||
adr r1, mmu_disable_phys
|
||||
/* We presume we're within the first 1024 bytes */
|
||||
and r1, r1, #0x3fc
|
||||
ldr r2, _TEXT_PHY_BASE
|
||||
ldr r3, =0xfff00000
|
||||
and r2, r2, r3
|
||||
orr r2, r2, r1
|
||||
adr r2, mmu_disable_phys
|
||||
sub r2, r2, #(CONFIG_SYS_PHY_UBOOT_BASE - TEXT_BASE)
|
||||
b mmu_disable
|
||||
|
||||
.align 5
|
||||
@@ -189,14 +182,30 @@ mmu_disable:
|
||||
nop
|
||||
nop
|
||||
mov pc, r2
|
||||
mmu_disable_phys:
|
||||
|
||||
#ifdef CONFIG_DISABLE_TCM
|
||||
/*
|
||||
* Disable the TCMs
|
||||
*/
|
||||
mrc p15, 0, r0, c0, c0, 2 /* Return TCM details */
|
||||
cmp r0, #0
|
||||
beq skip_tcmdisable
|
||||
mov r1, #0
|
||||
mov r2, #1
|
||||
tst r0, r2
|
||||
mcrne p15, 0, r1, c9, c1, 1 /* Disable Instruction TCM if present*/
|
||||
tst r0, r2, LSL #16
|
||||
mcrne p15, 0, r1, c9, c1, 0 /* Disable Data TCM if present*/
|
||||
skip_tcmdisable:
|
||||
#endif
|
||||
#endif
|
||||
|
||||
mmu_disable_phys:
|
||||
#ifdef CONFIG_S3C64XX
|
||||
#ifdef CONFIG_PERIPORT_REMAP
|
||||
/* Peri port setup */
|
||||
ldr r0, =0x70000000
|
||||
orr r0, r0, #0x13
|
||||
mcr p15,0,r0,c15,c2,4 @ 256M (0x70000000 - 0x7fffffff)
|
||||
ldr r0, =CONFIG_PERIPORT_BASE
|
||||
orr r0, r0, #CONFIG_PERIPORT_SIZE
|
||||
mcr p15,0,r0,c15,c2,4
|
||||
#endif
|
||||
|
||||
/*
|
||||
@@ -204,7 +213,25 @@ mmu_disable_phys:
|
||||
*/
|
||||
bl lowlevel_init /* go setup pll,mux,memory */
|
||||
|
||||
after_copy:
|
||||
#ifndef CONFIG_SKIP_RELOCATE_UBOOT
|
||||
relocate: /* relocate U-Boot to RAM */
|
||||
adr r0, _start /* r0 <- current position of code */
|
||||
ldr r1, _TEXT_BASE /* test if we run from flash or RAM */
|
||||
cmp r0, r1 /* don't reloc during debug */
|
||||
beq stack_setup
|
||||
|
||||
ldr r2, _armboot_start
|
||||
ldr r3, _bss_start
|
||||
sub r2, r3, r2 /* r2 <- size of armboot */
|
||||
add r2, r0, r2 /* r2 <- source end address */
|
||||
|
||||
copy_loop:
|
||||
ldmia r0!, {r3-r10} /* copy from source address [r0] */
|
||||
stmia r1!, {r3-r10} /* copy to target address [r1] */
|
||||
cmp r0, r2 /* until source end addreee [r2] */
|
||||
ble copy_loop
|
||||
#endif /* CONFIG_SKIP_RELOCATE_UBOOT */
|
||||
|
||||
#ifdef CONFIG_ENABLE_MMU
|
||||
enable_mmu:
|
||||
/* enable domain access */
|
||||
@@ -240,15 +267,16 @@ mmu_enable:
|
||||
nop
|
||||
nop
|
||||
mov pc, r2
|
||||
skip_hw_init:
|
||||
#endif
|
||||
|
||||
skip_hw_init:
|
||||
/* Set up the stack */
|
||||
stack_setup:
|
||||
ldr r0, =CONFIG_SYS_UBOOT_BASE /* base of copy in DRAM */
|
||||
sub r0, r0, #CONFIG_SYS_MALLOC_LEN /* malloc area */
|
||||
sub r0, r0, #CONFIG_SYS_GBL_DATA_SIZE /* bdinfo */
|
||||
sub sp, r0, #12 /* leave 3 words for abort-stack */
|
||||
bic sp, sp, #7 /* 8-byte alignment for ABI compliance */
|
||||
|
||||
clear_bss:
|
||||
ldr r0, _bss_start /* find start of bss segment */
|
||||
@@ -310,6 +338,8 @@ phy_last_jump:
|
||||
mov r0, #0
|
||||
mov pc, r9
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
*************************************************************************
|
||||
*
|
||||
|
||||
@@ -1,14 +1,11 @@
|
||||
#
|
||||
# (C) Copyright 2000-2006
|
||||
# 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 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
|
||||
@@ -17,27 +14,24 @@
|
||||
#
|
||||
# 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
|
||||
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/config.mk
|
||||
|
||||
LIB = $(obj)lib$(ARCH).a
|
||||
LIB = $(obj)lib$(SOC).a
|
||||
|
||||
SOBJS-y +=
|
||||
COBJS += aemif.o clock.o init.o mux.o timer.o wdt.o
|
||||
SOBJS += lowlevel_init.o
|
||||
|
||||
COBJS-y += board.o
|
||||
COBJS-y += bootm.o
|
||||
COBJS-y += cache.o
|
||||
COBJS-y += divmod.o
|
||||
COBJS-y += mult.o
|
||||
COBJS-y += time.o
|
||||
SRCS := $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS:.o=.c)
|
||||
|
||||
SRCS := $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c)
|
||||
OBJS := $(addprefix $(obj),$(SOBJS-y) $(COBJS-y))
|
||||
OBJS := $(addprefix $(obj),$(COBJS) $(SOBJS))
|
||||
START := $(addprefix $(obj),$(START))
|
||||
|
||||
$(LIB): $(obj).depend $(OBJS)
|
||||
all: $(obj).depend $(LIB)
|
||||
|
||||
$(LIB): $(OBJS)
|
||||
$(AR) $(ARFLAGS) $@ $(OBJS)
|
||||
|
||||
#########################################################################
|
||||
93
arch/arm/cpu/arm1176/tnetv107x/aemif.c
Normal file
93
arch/arm/cpu/arm1176/tnetv107x/aemif.c
Normal file
@@ -0,0 +1,93 @@
|
||||
/*
|
||||
* TNETV107X: Asynchronous EMIF Configuration
|
||||
*
|
||||
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch/clock.h>
|
||||
#include <asm/arch/mux.h>
|
||||
|
||||
#define ASYNC_EMIF_BASE TNETV107X_ASYNC_EMIF_CNTRL_BASE
|
||||
#define ASYNC_EMIF_CONFIG(cs) (ASYNC_EMIF_BASE+0x10+(cs)*4)
|
||||
#define ASYNC_EMIF_ONENAND_CONTROL (ASYNC_EMIF_BASE+0x5c)
|
||||
#define ASYNC_EMIF_NAND_CONTROL (ASYNC_EMIF_BASE+0x60)
|
||||
#define ASYNC_EMIF_WAITCYCLE_CONFIG (ASYNC_EMIF_BASE+0x4)
|
||||
|
||||
#define CONFIG_SELECT_STROBE(v) ((v) ? 1 << 31 : 0)
|
||||
#define CONFIG_EXTEND_WAIT(v) ((v) ? 1 << 30 : 0)
|
||||
#define CONFIG_WR_SETUP(v) (((v) & 0x0f) << 26)
|
||||
#define CONFIG_WR_STROBE(v) (((v) & 0x3f) << 20)
|
||||
#define CONFIG_WR_HOLD(v) (((v) & 0x07) << 17)
|
||||
#define CONFIG_RD_SETUP(v) (((v) & 0x0f) << 13)
|
||||
#define CONFIG_RD_STROBE(v) (((v) & 0x3f) << 7)
|
||||
#define CONFIG_RD_HOLD(v) (((v) & 0x07) << 4)
|
||||
#define CONFIG_TURN_AROUND(v) (((v) & 0x03) << 2)
|
||||
#define CONFIG_WIDTH(v) (((v) & 0x03) << 0)
|
||||
|
||||
#define NUM_CS 4
|
||||
|
||||
#define set_config_field(reg, field, val) \
|
||||
do { \
|
||||
if (val != -1) { \
|
||||
reg &= ~CONFIG_##field(0xffffffff); \
|
||||
reg |= CONFIG_##field(val); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
void configure_async_emif(int cs, struct async_emif_config *cfg)
|
||||
{
|
||||
unsigned long tmp;
|
||||
|
||||
if (cfg->mode == ASYNC_EMIF_MODE_NAND) {
|
||||
tmp = __raw_readl(ASYNC_EMIF_NAND_CONTROL);
|
||||
tmp |= (1 << cs);
|
||||
__raw_writel(tmp, ASYNC_EMIF_NAND_CONTROL);
|
||||
|
||||
} else if (cfg->mode == ASYNC_EMIF_MODE_ONENAND) {
|
||||
tmp = __raw_readl(ASYNC_EMIF_ONENAND_CONTROL);
|
||||
tmp |= (1 << cs);
|
||||
__raw_writel(tmp, ASYNC_EMIF_ONENAND_CONTROL);
|
||||
}
|
||||
|
||||
tmp = __raw_readl(ASYNC_EMIF_CONFIG(cs));
|
||||
|
||||
set_config_field(tmp, SELECT_STROBE, cfg->select_strobe);
|
||||
set_config_field(tmp, EXTEND_WAIT, cfg->extend_wait);
|
||||
set_config_field(tmp, WR_SETUP, cfg->wr_setup);
|
||||
set_config_field(tmp, WR_STROBE, cfg->wr_strobe);
|
||||
set_config_field(tmp, WR_HOLD, cfg->wr_hold);
|
||||
set_config_field(tmp, RD_SETUP, cfg->rd_setup);
|
||||
set_config_field(tmp, RD_STROBE, cfg->rd_strobe);
|
||||
set_config_field(tmp, RD_HOLD, cfg->rd_hold);
|
||||
set_config_field(tmp, TURN_AROUND, cfg->turn_around);
|
||||
set_config_field(tmp, WIDTH, cfg->width);
|
||||
|
||||
__raw_writel(tmp, ASYNC_EMIF_CONFIG(cs));
|
||||
}
|
||||
|
||||
void init_async_emif(int num_cs, struct async_emif_config *config)
|
||||
{
|
||||
int cs;
|
||||
|
||||
clk_enable(TNETV107X_LPSC_AEMIF);
|
||||
|
||||
for (cs = 0; cs < num_cs; cs++)
|
||||
configure_async_emif(cs, config + cs);
|
||||
}
|
||||
451
arch/arm/cpu/arm1176/tnetv107x/clock.c
Normal file
451
arch/arm/cpu/arm1176/tnetv107x/clock.c
Normal file
@@ -0,0 +1,451 @@
|
||||
/*
|
||||
* TNETV107X: Clock management APIs
|
||||
*
|
||||
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm-generic/errno.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/arch/clock.h>
|
||||
|
||||
#define CLOCK_BASE TNETV107X_CLOCK_CONTROL_BASE
|
||||
#define PSC_BASE TNETV107X_PSC_BASE
|
||||
|
||||
#define BIT(x) (1 << (x))
|
||||
|
||||
#define MAX_PREDIV 64
|
||||
#define MAX_POSTDIV 8
|
||||
#define MAX_MULT 512
|
||||
#define MAX_DIV (MAX_PREDIV * MAX_POSTDIV)
|
||||
|
||||
/* LPSC registers */
|
||||
#define PSC_PTCMD 0x120
|
||||
#define PSC_PTSTAT 0x128
|
||||
#define PSC_MDSTAT(n) (0x800 + (n) * 4)
|
||||
#define PSC_MDCTL(n) (0xA00 + (n) * 4)
|
||||
|
||||
#define PSC_MDCTL_LRSTZ BIT(8)
|
||||
|
||||
#define psc_reg_read(reg) __raw_readl((u32 *)(PSC_BASE + (reg)))
|
||||
#define psc_reg_write(reg, val) __raw_writel(val, (u32 *)(PSC_BASE + (reg)))
|
||||
|
||||
/* SSPLL registers */
|
||||
struct sspll_regs {
|
||||
u32 modes;
|
||||
u32 postdiv;
|
||||
u32 prediv;
|
||||
u32 mult_factor;
|
||||
u32 divider_range;
|
||||
u32 bw_divider;
|
||||
u32 spr_amount;
|
||||
u32 spr_rate_div;
|
||||
u32 diag;
|
||||
};
|
||||
|
||||
/* SSPLL base addresses */
|
||||
static struct sspll_regs *sspll_regs[] = {
|
||||
(struct sspll_regs *)(CLOCK_BASE + 0x040),
|
||||
(struct sspll_regs *)(CLOCK_BASE + 0x080),
|
||||
(struct sspll_regs *)(CLOCK_BASE + 0x0c0),
|
||||
};
|
||||
|
||||
#define sspll_reg(pll, reg) (&(sspll_regs[pll]->reg))
|
||||
#define sspll_reg_read(pll, reg) __raw_readl(sspll_reg(pll, reg))
|
||||
#define sspll_reg_write(pll, reg, val) __raw_writel(val, sspll_reg(pll, reg))
|
||||
|
||||
|
||||
/* PLL Control Registers */
|
||||
struct pllctl_regs {
|
||||
u32 ctl; /* 00 */
|
||||
u32 ocsel; /* 04 */
|
||||
u32 secctl; /* 08 */
|
||||
u32 __pad0;
|
||||
u32 mult; /* 10 */
|
||||
u32 prediv; /* 14 */
|
||||
u32 div1; /* 18 */
|
||||
u32 div2; /* 1c */
|
||||
u32 div3; /* 20 */
|
||||
u32 oscdiv1; /* 24 */
|
||||
u32 postdiv; /* 28 */
|
||||
u32 bpdiv; /* 2c */
|
||||
u32 wakeup; /* 30 */
|
||||
u32 __pad1;
|
||||
u32 cmd; /* 38 */
|
||||
u32 stat; /* 3c */
|
||||
u32 alnctl; /* 40 */
|
||||
u32 dchange; /* 44 */
|
||||
u32 cken; /* 48 */
|
||||
u32 ckstat; /* 4c */
|
||||
u32 systat; /* 50 */
|
||||
u32 ckctl; /* 54 */
|
||||
u32 __pad2[2];
|
||||
u32 div4; /* 60 */
|
||||
u32 div5; /* 64 */
|
||||
u32 div6; /* 68 */
|
||||
u32 div7; /* 6c */
|
||||
u32 div8; /* 70 */
|
||||
};
|
||||
|
||||
struct lpsc_map {
|
||||
int pll, div;
|
||||
};
|
||||
|
||||
static struct pllctl_regs *pllctl_regs[] = {
|
||||
(struct pllctl_regs *)(CLOCK_BASE + 0x700),
|
||||
(struct pllctl_regs *)(CLOCK_BASE + 0x300),
|
||||
(struct pllctl_regs *)(CLOCK_BASE + 0x500),
|
||||
};
|
||||
|
||||
#define pllctl_reg(pll, reg) (&(pllctl_regs[pll]->reg))
|
||||
#define pllctl_reg_read(pll, reg) __raw_readl(pllctl_reg(pll, reg))
|
||||
#define pllctl_reg_write(pll, reg, val) __raw_writel(val, pllctl_reg(pll, reg))
|
||||
|
||||
#define pllctl_reg_rmw(pll, reg, mask, val) \
|
||||
pllctl_reg_write(pll, reg, \
|
||||
(pllctl_reg_read(pll, reg) & ~(mask)) | val)
|
||||
|
||||
#define pllctl_reg_setbits(pll, reg, mask) \
|
||||
pllctl_reg_rmw(pll, reg, 0, mask)
|
||||
|
||||
#define pllctl_reg_clrbits(pll, reg, mask) \
|
||||
pllctl_reg_rmw(pll, reg, mask, 0)
|
||||
|
||||
/* PLLCTL Bits */
|
||||
#define PLLCTL_CLKMODE BIT(8)
|
||||
#define PLLCTL_PLLSELB BIT(7)
|
||||
#define PLLCTL_PLLENSRC BIT(5)
|
||||
#define PLLCTL_PLLDIS BIT(4)
|
||||
#define PLLCTL_PLLRST BIT(3)
|
||||
#define PLLCTL_PLLPWRDN BIT(1)
|
||||
#define PLLCTL_PLLEN BIT(0)
|
||||
|
||||
#define PLLDIV_ENABLE BIT(15)
|
||||
|
||||
static int pll_div_offset[] = {
|
||||
#define div_offset(reg) offsetof(struct pllctl_regs, reg)
|
||||
div_offset(div1), div_offset(div2), div_offset(div3),
|
||||
div_offset(div4), div_offset(div5), div_offset(div6),
|
||||
div_offset(div7), div_offset(div8),
|
||||
};
|
||||
|
||||
static unsigned long pll_bypass_mask[] = { 1, 4, 2 };
|
||||
static unsigned long pll_div_mask[] = { 0x01ff, 0x00ff, 0x00ff };
|
||||
|
||||
/* Mappings from PLL+DIV to subsystem clocks */
|
||||
#define sys_arm1176_clk {SYS_PLL, 0}
|
||||
#define sys_dsp_clk {SYS_PLL, 1}
|
||||
#define sys_ddr_clk {SYS_PLL, 2}
|
||||
#define sys_full_clk {SYS_PLL, 3}
|
||||
#define sys_lcd_clk {SYS_PLL, 4}
|
||||
#define sys_vlynq_ref_clk {SYS_PLL, 5}
|
||||
#define sys_tsc_clk {SYS_PLL, 6}
|
||||
#define sys_half_clk {SYS_PLL, 7}
|
||||
|
||||
#define eth_clk_5 {ETH_PLL, 0}
|
||||
#define eth_clk_50 {ETH_PLL, 1}
|
||||
#define eth_clk_125 {ETH_PLL, 2}
|
||||
#define eth_clk_250 {ETH_PLL, 3}
|
||||
#define eth_clk_25 {ETH_PLL, 4}
|
||||
|
||||
#define tdm_clk {TDM_PLL, 0}
|
||||
#define tdm_extra_clk {TDM_PLL, 1}
|
||||
#define tdm1_clk {TDM_PLL, 2}
|
||||
|
||||
/* Optimization barrier */
|
||||
#define barrier() \
|
||||
__asm__ __volatile__("mov r0, r0\n" : : : "memory");
|
||||
|
||||
static const struct lpsc_map lpsc_clk_map[] = {
|
||||
[TNETV107X_LPSC_ARM] = sys_arm1176_clk,
|
||||
[TNETV107X_LPSC_GEM] = sys_dsp_clk,
|
||||
[TNETV107X_LPSC_DDR2_PHY] = sys_ddr_clk,
|
||||
[TNETV107X_LPSC_TPCC] = sys_full_clk,
|
||||
[TNETV107X_LPSC_TPTC0] = sys_full_clk,
|
||||
[TNETV107X_LPSC_TPTC1] = sys_full_clk,
|
||||
[TNETV107X_LPSC_RAM] = sys_full_clk,
|
||||
[TNETV107X_LPSC_MBX_LITE] = sys_arm1176_clk,
|
||||
[TNETV107X_LPSC_LCD] = sys_lcd_clk,
|
||||
[TNETV107X_LPSC_ETHSS] = eth_clk_125,
|
||||
[TNETV107X_LPSC_AEMIF] = sys_full_clk,
|
||||
[TNETV107X_LPSC_CHIP_CFG] = sys_half_clk,
|
||||
[TNETV107X_LPSC_TSC] = sys_tsc_clk,
|
||||
[TNETV107X_LPSC_ROM] = sys_half_clk,
|
||||
[TNETV107X_LPSC_UART2] = sys_half_clk,
|
||||
[TNETV107X_LPSC_PKTSEC] = sys_half_clk,
|
||||
[TNETV107X_LPSC_SECCTL] = sys_half_clk,
|
||||
[TNETV107X_LPSC_KEYMGR] = sys_half_clk,
|
||||
[TNETV107X_LPSC_KEYPAD] = sys_half_clk,
|
||||
[TNETV107X_LPSC_GPIO] = sys_half_clk,
|
||||
[TNETV107X_LPSC_MDIO] = sys_half_clk,
|
||||
[TNETV107X_LPSC_SDIO0] = sys_half_clk,
|
||||
[TNETV107X_LPSC_UART0] = sys_half_clk,
|
||||
[TNETV107X_LPSC_UART1] = sys_half_clk,
|
||||
[TNETV107X_LPSC_TIMER0] = sys_half_clk,
|
||||
[TNETV107X_LPSC_TIMER1] = sys_half_clk,
|
||||
[TNETV107X_LPSC_WDT_ARM] = sys_half_clk,
|
||||
[TNETV107X_LPSC_WDT_DSP] = sys_half_clk,
|
||||
[TNETV107X_LPSC_SSP] = sys_half_clk,
|
||||
[TNETV107X_LPSC_TDM0] = tdm_clk,
|
||||
[TNETV107X_LPSC_VLYNQ] = sys_vlynq_ref_clk,
|
||||
[TNETV107X_LPSC_MCDMA] = sys_half_clk,
|
||||
[TNETV107X_LPSC_USB0] = sys_half_clk,
|
||||
[TNETV107X_LPSC_TDM1] = tdm1_clk,
|
||||
[TNETV107X_LPSC_DEBUGSS] = sys_half_clk,
|
||||
[TNETV107X_LPSC_ETHSS_RGMII] = eth_clk_250,
|
||||
[TNETV107X_LPSC_SYSTEM] = sys_half_clk,
|
||||
[TNETV107X_LPSC_IMCOP] = sys_dsp_clk,
|
||||
[TNETV107X_LPSC_SPARE] = sys_half_clk,
|
||||
[TNETV107X_LPSC_SDIO1] = sys_half_clk,
|
||||
[TNETV107X_LPSC_USB1] = sys_half_clk,
|
||||
[TNETV107X_LPSC_USBSS] = sys_half_clk,
|
||||
[TNETV107X_LPSC_DDR2_EMIF1_VRST] = sys_ddr_clk,
|
||||
[TNETV107X_LPSC_DDR2_EMIF2_VCTL_RST] = sys_ddr_clk,
|
||||
};
|
||||
|
||||
static const unsigned long pll_ext_freq[] = {
|
||||
[SYS_PLL] = CONFIG_PLL_SYS_EXT_FREQ,
|
||||
[ETH_PLL] = CONFIG_PLL_ETH_EXT_FREQ,
|
||||
[TDM_PLL] = CONFIG_PLL_TDM_EXT_FREQ,
|
||||
};
|
||||
|
||||
static unsigned long pll_freq_get(int pll)
|
||||
{
|
||||
unsigned long mult = 1, prediv = 1, postdiv = 1;
|
||||
unsigned long ref = CONFIG_SYS_INT_OSC_FREQ;
|
||||
unsigned long ret;
|
||||
u32 bypass;
|
||||
|
||||
bypass = __raw_readl((u32 *)(CLOCK_BASE));
|
||||
if (!(bypass & pll_bypass_mask[pll])) {
|
||||
mult = sspll_reg_read(pll, mult_factor);
|
||||
prediv = sspll_reg_read(pll, prediv) + 1;
|
||||
postdiv = sspll_reg_read(pll, postdiv) + 1;
|
||||
}
|
||||
|
||||
if (pllctl_reg_read(pll, ctl) & PLLCTL_CLKMODE)
|
||||
ref = pll_ext_freq[pll];
|
||||
|
||||
if (!(pllctl_reg_read(pll, ctl) & PLLCTL_PLLEN))
|
||||
return ref;
|
||||
|
||||
ret = (unsigned long)(ref + ((unsigned long long)ref * mult) / 256);
|
||||
ret /= (prediv * postdiv);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static unsigned long __pll_div_freq_get(int pll, unsigned int fpll,
|
||||
int div)
|
||||
{
|
||||
int divider = 1;
|
||||
unsigned long divreg;
|
||||
|
||||
divreg = __raw_readl((void *)pllctl_regs[pll] + pll_div_offset[div]);
|
||||
|
||||
if (divreg & PLLDIV_ENABLE)
|
||||
divider = (divreg & pll_div_mask[pll]) + 1;
|
||||
|
||||
return fpll / divider;
|
||||
}
|
||||
|
||||
static unsigned long pll_div_freq_get(int pll, int div)
|
||||
{
|
||||
unsigned int fpll = pll_freq_get(pll);
|
||||
|
||||
return __pll_div_freq_get(pll, fpll, div);
|
||||
}
|
||||
|
||||
static void __pll_div_freq_set(int pll, unsigned int fpll, int div,
|
||||
unsigned long hz)
|
||||
{
|
||||
int divider = (fpll / hz - 1);
|
||||
|
||||
divider &= pll_div_mask[pll];
|
||||
divider |= PLLDIV_ENABLE;
|
||||
|
||||
__raw_writel(divider, (void *)pllctl_regs[pll] + pll_div_offset[div]);
|
||||
pllctl_reg_setbits(pll, alnctl, (1 << div));
|
||||
pllctl_reg_setbits(pll, dchange, (1 << div));
|
||||
}
|
||||
|
||||
static unsigned long pll_div_freq_set(int pll, int div, unsigned long hz)
|
||||
{
|
||||
unsigned int fpll = pll_freq_get(pll);
|
||||
|
||||
__pll_div_freq_set(pll, fpll, div, hz);
|
||||
|
||||
pllctl_reg_write(pll, cmd, 1);
|
||||
|
||||
/* Wait until new divider takes effect */
|
||||
while (pllctl_reg_read(pll, stat) & 0x01);
|
||||
|
||||
return __pll_div_freq_get(pll, fpll, div);
|
||||
}
|
||||
|
||||
unsigned long clk_get_rate(unsigned int clk)
|
||||
{
|
||||
return pll_div_freq_get(lpsc_clk_map[clk].pll, lpsc_clk_map[clk].div);
|
||||
}
|
||||
|
||||
unsigned long clk_round_rate(unsigned int clk, unsigned long hz)
|
||||
{
|
||||
unsigned long fpll, divider, pll;
|
||||
|
||||
pll = lpsc_clk_map[clk].pll;
|
||||
fpll = pll_freq_get(pll);
|
||||
divider = (fpll / hz - 1);
|
||||
divider &= pll_div_mask[pll];
|
||||
|
||||
return fpll / (divider + 1);
|
||||
}
|
||||
|
||||
int clk_set_rate(unsigned int clk, unsigned long _hz)
|
||||
{
|
||||
unsigned long hz;
|
||||
|
||||
hz = clk_round_rate(clk, _hz);
|
||||
if (hz != _hz)
|
||||
return -EINVAL; /* Cannot set to target freq */
|
||||
|
||||
pll_div_freq_set(lpsc_clk_map[clk].pll, lpsc_clk_map[clk].div, hz);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void lpsc_control(int mod, unsigned long state, int lrstz)
|
||||
{
|
||||
u32 mdctl;
|
||||
|
||||
mdctl = psc_reg_read(PSC_MDCTL(mod));
|
||||
mdctl &= ~0x1f;
|
||||
mdctl |= state;
|
||||
|
||||
if (lrstz == 0)
|
||||
mdctl &= ~PSC_MDCTL_LRSTZ;
|
||||
else if (lrstz == 1)
|
||||
mdctl |= PSC_MDCTL_LRSTZ;
|
||||
|
||||
psc_reg_write(PSC_MDCTL(mod), mdctl);
|
||||
|
||||
psc_reg_write(PSC_PTCMD, 1);
|
||||
|
||||
/* wait for power domain transition to end */
|
||||
while (psc_reg_read(PSC_PTSTAT) & 1);
|
||||
|
||||
/* Wait for module state change */
|
||||
while ((psc_reg_read(PSC_MDSTAT(mod)) & 0x1f) != state);
|
||||
}
|
||||
|
||||
int lpsc_status(unsigned int id)
|
||||
{
|
||||
return psc_reg_read(PSC_MDSTAT(id)) & 0x1f;
|
||||
}
|
||||
|
||||
static void init_pll(const struct pll_init_data *data)
|
||||
{
|
||||
unsigned long fpll;
|
||||
unsigned long best_pre = 0, best_post = 0, best_mult = 0;
|
||||
unsigned long div, prediv, postdiv, mult;
|
||||
unsigned long delta, actual;
|
||||
long best_delta = -1;
|
||||
int i;
|
||||
u32 tmp;
|
||||
|
||||
if (data->pll == SYS_PLL)
|
||||
return; /* cannot reconfigure system pll on the fly */
|
||||
|
||||
tmp = pllctl_reg_read(data->pll, ctl);
|
||||
if (data->internal_osc) {
|
||||
tmp &= ~PLLCTL_CLKMODE;
|
||||
fpll = CONFIG_SYS_INT_OSC_FREQ;
|
||||
} else {
|
||||
tmp |= PLLCTL_CLKMODE;
|
||||
fpll = pll_ext_freq[data->pll];
|
||||
}
|
||||
pllctl_reg_write(data->pll, ctl, tmp);
|
||||
|
||||
mult = data->pll_freq / fpll;
|
||||
for (mult = MAX(mult, 1); mult <= MAX_MULT; mult++) {
|
||||
div = (fpll * mult) / data->pll_freq;
|
||||
if (div < 1 || div > MAX_DIV)
|
||||
continue;
|
||||
|
||||
for (postdiv = 1; postdiv <= min(div, MAX_POSTDIV); postdiv++) {
|
||||
prediv = div / postdiv;
|
||||
if (prediv < 1 || prediv > MAX_PREDIV)
|
||||
continue;
|
||||
|
||||
actual = (fpll / prediv) * (mult / postdiv);
|
||||
delta = (actual - data->pll_freq);
|
||||
if (delta < 0)
|
||||
delta = -delta;
|
||||
if ((delta < best_delta) || (best_delta == -1)) {
|
||||
best_delta = delta;
|
||||
best_mult = mult;
|
||||
best_pre = prediv;
|
||||
best_post = postdiv;
|
||||
if (delta == 0)
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
}
|
||||
done:
|
||||
|
||||
if (best_delta == -1) {
|
||||
printf("pll cannot derive %lu from %lu\n",
|
||||
data->pll_freq, fpll);
|
||||
return;
|
||||
}
|
||||
|
||||
fpll = fpll * best_mult;
|
||||
fpll /= best_pre * best_post;
|
||||
|
||||
pllctl_reg_clrbits(data->pll, ctl, PLLCTL_PLLENSRC);
|
||||
pllctl_reg_clrbits(data->pll, ctl, PLLCTL_PLLEN);
|
||||
|
||||
pllctl_reg_setbits(data->pll, ctl, PLLCTL_PLLRST);
|
||||
|
||||
pllctl_reg_clrbits(data->pll, ctl, PLLCTL_PLLPWRDN);
|
||||
pllctl_reg_clrbits(data->pll, ctl, PLLCTL_PLLDIS);
|
||||
|
||||
sspll_reg_write(data->pll, mult_factor, (best_mult - 1) << 8);
|
||||
sspll_reg_write(data->pll, prediv, best_pre - 1);
|
||||
sspll_reg_write(data->pll, postdiv, best_post - 1);
|
||||
|
||||
for (i = 0; i < 10; i++)
|
||||
if (data->div_freq[i])
|
||||
__pll_div_freq_set(data->pll, fpll, i,
|
||||
data->div_freq[i]);
|
||||
|
||||
pllctl_reg_write(data->pll, cmd, 1);
|
||||
|
||||
/* Wait until pll "go" operation completes */
|
||||
while (pllctl_reg_read(data->pll, stat) & 0x01);
|
||||
|
||||
pllctl_reg_clrbits(data->pll, ctl, PLLCTL_PLLRST);
|
||||
pllctl_reg_setbits(data->pll, ctl, PLLCTL_PLLEN);
|
||||
}
|
||||
|
||||
void init_plls(int num_pll, struct pll_init_data *config)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < num_pll; i++)
|
||||
init_pll(&config[i]);
|
||||
}
|
||||
37
arch/arm/cpu/arm1176/tnetv107x/init.c
Normal file
37
arch/arm/cpu/arm1176/tnetv107x/init.c
Normal file
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
* TNETV107X: Architecture initialization
|
||||
*
|
||||
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
void chip_configuration_unlock(void)
|
||||
{
|
||||
__raw_writel(TNETV107X_KICK0_MAGIC, TNETV107X_KICK0);
|
||||
__raw_writel(TNETV107X_KICK1_MAGIC, TNETV107X_KICK1);
|
||||
}
|
||||
|
||||
int arch_cpu_init(void)
|
||||
{
|
||||
icache_enable();
|
||||
chip_configuration_unlock();
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,14 +1,13 @@
|
||||
/*
|
||||
* (C) Copyright 2003, Psyent Corporation <www.psyent.com>
|
||||
* Scott McNutt <smcnutt@psyent.com>
|
||||
* TNETV107X: Low-level pre-relocation initialization
|
||||
*
|
||||
* 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 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
|
||||
@@ -17,12 +16,10 @@
|
||||
*
|
||||
* 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
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#ifndef _NIOS_PSR_H
|
||||
#define _NIOS_PSR_H
|
||||
|
||||
|
||||
#endif /* _NIOS_PSR_H */
|
||||
.globl lowlevel_init
|
||||
lowlevel_init:
|
||||
/* nothing for now, maybe needed for more exotic boot modes */
|
||||
mov pc, lr
|
||||
334
arch/arm/cpu/arm1176/tnetv107x/mux.c
Normal file
334
arch/arm/cpu/arm1176/tnetv107x/mux.c
Normal file
@@ -0,0 +1,334 @@
|
||||
/*
|
||||
* TNETV107X: Pinmux configuration
|
||||
*
|
||||
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch/clock.h>
|
||||
#include <asm/arch/mux.h>
|
||||
|
||||
#define MUX_MODE_1 0x00
|
||||
#define MUX_MODE_2 0x04
|
||||
#define MUX_MODE_3 0x0c
|
||||
#define MUX_MODE_4 0x1c
|
||||
|
||||
#define MUX_DEBUG 0
|
||||
|
||||
static const struct pin_config pin_table[] = {
|
||||
/* reg shift mode */
|
||||
TNETV107X_MUX_CFG(0, 0, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(0, 0, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(0, 5, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(0, 5, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(0, 10, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(0, 10, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(0, 15, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(0, 15, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(0, 20, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(0, 20, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(0, 25, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(0, 25, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(1, 0, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(1, 0, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(1, 5, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(1, 5, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(1, 10, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(1, 10, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(1, 15, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(1, 15, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(1, 20, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(1, 20, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(1, 25, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(1, 25, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(2, 0, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(2, 0, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(2, 5, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(2, 5, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(2, 10, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(2, 10, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(2, 15, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(2, 15, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(2, 20, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(2, 20, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(2, 25, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(2, 25, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(3, 0, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(3, 0, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(3, 0, MUX_MODE_4),
|
||||
TNETV107X_MUX_CFG(3, 5, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(3, 5, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(3, 5, MUX_MODE_4),
|
||||
TNETV107X_MUX_CFG(3, 10, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(3, 10, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(3, 10, MUX_MODE_4),
|
||||
TNETV107X_MUX_CFG(3, 15, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(3, 15, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(3, 15, MUX_MODE_4),
|
||||
TNETV107X_MUX_CFG(3, 20, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(3, 20, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(3, 20, MUX_MODE_4),
|
||||
TNETV107X_MUX_CFG(3, 25, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(3, 25, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(3, 25, MUX_MODE_4),
|
||||
TNETV107X_MUX_CFG(4, 0, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(4, 0, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(4, 0, MUX_MODE_4),
|
||||
TNETV107X_MUX_CFG(4, 5, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(4, 10, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(4, 15, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(4, 15, MUX_MODE_4),
|
||||
TNETV107X_MUX_CFG(4, 20, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(4, 20, MUX_MODE_3),
|
||||
TNETV107X_MUX_CFG(4, 25, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(4, 25, MUX_MODE_4),
|
||||
TNETV107X_MUX_CFG(5, 0, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(5, 0, MUX_MODE_4),
|
||||
TNETV107X_MUX_CFG(5, 5, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(5, 5, MUX_MODE_4),
|
||||
TNETV107X_MUX_CFG(5, 10, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(5, 10, MUX_MODE_4),
|
||||
TNETV107X_MUX_CFG(5, 15, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(5, 15, MUX_MODE_4),
|
||||
TNETV107X_MUX_CFG(5, 20, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(5, 20, MUX_MODE_4),
|
||||
TNETV107X_MUX_CFG(5, 25, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(5, 25, MUX_MODE_4),
|
||||
TNETV107X_MUX_CFG(6, 0, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(6, 0, MUX_MODE_4),
|
||||
TNETV107X_MUX_CFG(6, 5, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(6, 5, MUX_MODE_4),
|
||||
TNETV107X_MUX_CFG(6, 10, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(6, 10, MUX_MODE_4),
|
||||
TNETV107X_MUX_CFG(6, 15, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(6, 15, MUX_MODE_4),
|
||||
TNETV107X_MUX_CFG(6, 20, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(6, 20, MUX_MODE_4),
|
||||
TNETV107X_MUX_CFG(6, 25, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(6, 25, MUX_MODE_4),
|
||||
TNETV107X_MUX_CFG(7, 0, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(7, 0, MUX_MODE_4),
|
||||
TNETV107X_MUX_CFG(7, 5, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(7, 5, MUX_MODE_4),
|
||||
TNETV107X_MUX_CFG(7, 10, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(7, 10, MUX_MODE_4),
|
||||
TNETV107X_MUX_CFG(7, 15, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(7, 15, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(7, 20, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(7, 20, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(7, 25, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(7, 25, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(8, 0, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(8, 0, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(8, 5, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(8, 5, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(8, 5, MUX_MODE_4),
|
||||
TNETV107X_MUX_CFG(8, 10, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(8, 10, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(9, 0, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(9, 0, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(9, 0, MUX_MODE_4),
|
||||
TNETV107X_MUX_CFG(9, 5, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(9, 5, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(9, 5, MUX_MODE_4),
|
||||
TNETV107X_MUX_CFG(9, 10, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(9, 10, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(9, 10, MUX_MODE_4),
|
||||
TNETV107X_MUX_CFG(9, 15, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(9, 15, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(9, 15, MUX_MODE_4),
|
||||
TNETV107X_MUX_CFG(9, 20, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(9, 20, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(9, 20, MUX_MODE_4),
|
||||
TNETV107X_MUX_CFG(10, 0, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(10, 0, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(10, 5, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(10, 5, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(10, 10, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(10, 10, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(10, 15, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(10, 15, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(10, 20, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(10, 20, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(10, 25, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(10, 25, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(11, 0, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(11, 5, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(12, 0, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(12, 5, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(12, 10, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(12, 15, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(12, 20, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(12, 25, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(13, 0, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(13, 5, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(13, 10, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(13, 15, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(14, 0, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(14, 5, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(14, 10, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(14, 15, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(14, 20, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(14, 25, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(15, 0, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(15, 0, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(15, 5, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(15, 5, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(15, 10, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(15, 15, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(15, 20, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(15, 25, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(16, 0, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(16, 5, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(16, 10, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(16, 10, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(16, 10, MUX_MODE_3),
|
||||
TNETV107X_MUX_CFG(16, 15, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(16, 15, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(17, 0, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(17, 0, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(17, 0, MUX_MODE_3),
|
||||
TNETV107X_MUX_CFG(17, 5, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(17, 5, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(17, 5, MUX_MODE_3),
|
||||
TNETV107X_MUX_CFG(17, 10, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(17, 10, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(17, 10, MUX_MODE_3),
|
||||
TNETV107X_MUX_CFG(17, 15, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(17, 15, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(17, 15, MUX_MODE_3),
|
||||
TNETV107X_MUX_CFG(18, 0, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(18, 0, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(18, 0, MUX_MODE_3),
|
||||
TNETV107X_MUX_CFG(18, 5, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(18, 5, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(18, 5, MUX_MODE_3),
|
||||
TNETV107X_MUX_CFG(18, 10, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(18, 10, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(18, 10, MUX_MODE_3),
|
||||
TNETV107X_MUX_CFG(18, 15, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(18, 15, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(18, 15, MUX_MODE_3),
|
||||
TNETV107X_MUX_CFG(19, 0, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(19, 5, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(19, 10, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(19, 15, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(19, 20, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(19, 25, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(20, 0, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(20, 5, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(20, 10, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(20, 15, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(20, 15, MUX_MODE_3),
|
||||
TNETV107X_MUX_CFG(20, 20, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(20, 25, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(21, 0, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(21, 5, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(21, 10, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(21, 15, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(21, 20, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(21, 25, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(22, 0, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(22, 5, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(22, 5, MUX_MODE_3),
|
||||
TNETV107X_MUX_CFG(22, 10, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(22, 10, MUX_MODE_3),
|
||||
TNETV107X_MUX_CFG(22, 15, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(22, 15, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(22, 15, MUX_MODE_3),
|
||||
TNETV107X_MUX_CFG(22, 20, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(22, 20, MUX_MODE_3),
|
||||
TNETV107X_MUX_CFG(22, 25, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(22, 25, MUX_MODE_3),
|
||||
TNETV107X_MUX_CFG(23, 0, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(23, 0, MUX_MODE_3),
|
||||
TNETV107X_MUX_CFG(23, 5, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(23, 5, MUX_MODE_3),
|
||||
TNETV107X_MUX_CFG(23, 10, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(23, 10, MUX_MODE_3),
|
||||
TNETV107X_MUX_CFG(24, 0, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(24, 0, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(24, 5, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(24, 5, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(24, 10, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(24, 10, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(24, 10, MUX_MODE_3),
|
||||
TNETV107X_MUX_CFG(24, 15, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(24, 15, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(24, 15, MUX_MODE_3),
|
||||
TNETV107X_MUX_CFG(24, 20, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(24, 20, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(24, 25, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(24, 25, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(25, 0, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(25, 0, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(25, 0, MUX_MODE_3),
|
||||
TNETV107X_MUX_CFG(25, 5, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(25, 5, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(25, 5, MUX_MODE_3),
|
||||
TNETV107X_MUX_CFG(25, 10, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(25, 10, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(25, 10, MUX_MODE_3),
|
||||
TNETV107X_MUX_CFG(25, 15, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(25, 15, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(25, 15, MUX_MODE_3),
|
||||
TNETV107X_MUX_CFG(25, 15, MUX_MODE_4),
|
||||
TNETV107X_MUX_CFG(26, 0, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(26, 5, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(26, 10, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(26, 10, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(26, 15, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(26, 15, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(26, 20, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(26, 20, MUX_MODE_2),
|
||||
TNETV107X_MUX_CFG(26, 25, MUX_MODE_1),
|
||||
TNETV107X_MUX_CFG(26, 25, MUX_MODE_2),
|
||||
};
|
||||
|
||||
const int pin_table_size = sizeof(pin_table) / sizeof(pin_table[0]);
|
||||
|
||||
int mux_select_pin(short index)
|
||||
{
|
||||
const struct pin_config *cfg;
|
||||
unsigned long mask, mode, reg;
|
||||
|
||||
if (index >= pin_table_size)
|
||||
return 0;
|
||||
|
||||
cfg = &pin_table[index];
|
||||
|
||||
mask = 0x1f << cfg->mask_offset;
|
||||
mode = cfg->mode << cfg->mask_offset;
|
||||
|
||||
reg = __raw_readl(TNETV107X_PINMUX(cfg->reg_index));
|
||||
reg = (reg & ~mask) | mode;
|
||||
__raw_writel(reg, TNETV107X_PINMUX(cfg->reg_index));
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int mux_select_pins(const short *pins)
|
||||
{
|
||||
int i, ret = 1;
|
||||
|
||||
for (i = 0; pins[i] >= 0; i++)
|
||||
ret &= mux_select_pin(pins[i]);
|
||||
|
||||
return ret;
|
||||
}
|
||||
122
arch/arm/cpu/arm1176/tnetv107x/timer.c
Normal file
122
arch/arm/cpu/arm1176/tnetv107x/timer.c
Normal file
@@ -0,0 +1,122 @@
|
||||
/*
|
||||
* TNETV107X: Timer implementation
|
||||
*
|
||||
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch/clock.h>
|
||||
|
||||
struct timer_regs {
|
||||
u_int32_t pid12;
|
||||
u_int32_t pad[3];
|
||||
u_int32_t tim12;
|
||||
u_int32_t tim34;
|
||||
u_int32_t prd12;
|
||||
u_int32_t prd34;
|
||||
u_int32_t tcr;
|
||||
u_int32_t tgcr;
|
||||
u_int32_t wdtcr;
|
||||
};
|
||||
|
||||
#define regs ((struct timer_regs *)CONFIG_SYS_TIMERBASE)
|
||||
|
||||
#define TIMER_LOAD_VAL (CONFIG_SYS_HZ_CLOCK / CONFIG_SYS_HZ)
|
||||
#define TIM_CLK_DIV 16
|
||||
|
||||
static ulong timestamp;
|
||||
static ulong lastinc;
|
||||
|
||||
int timer_init(void)
|
||||
{
|
||||
clk_enable(TNETV107X_LPSC_TIMER0);
|
||||
|
||||
lastinc = timestamp = 0;
|
||||
|
||||
/* We are using timer34 in unchained 32-bit mode, full speed */
|
||||
__raw_writel(0x0, ®s->tcr);
|
||||
__raw_writel(0x0, ®s->tgcr);
|
||||
__raw_writel(0x06 | ((TIM_CLK_DIV - 1) << 8), ®s->tgcr);
|
||||
__raw_writel(0x0, ®s->tim34);
|
||||
__raw_writel(TIMER_LOAD_VAL, ®s->prd34);
|
||||
__raw_writel(2 << 22, ®s->tcr);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void reset_timer(void)
|
||||
{
|
||||
lastinc = timestamp = 0;
|
||||
|
||||
__raw_writel(0, ®s->tcr);
|
||||
__raw_writel(0, ®s->tim34);
|
||||
__raw_writel(2 << 22, ®s->tcr);
|
||||
}
|
||||
|
||||
static ulong get_timer_raw(void)
|
||||
{
|
||||
ulong now = __raw_readl(®s->tim34);
|
||||
|
||||
if (now >= lastinc)
|
||||
timestamp += now - lastinc;
|
||||
else
|
||||
timestamp += now + TIMER_LOAD_VAL - lastinc;
|
||||
|
||||
lastinc = now;
|
||||
|
||||
return timestamp;
|
||||
}
|
||||
|
||||
ulong get_timer(ulong base)
|
||||
{
|
||||
return (get_timer_raw() / (TIMER_LOAD_VAL / TIM_CLK_DIV)) - base;
|
||||
}
|
||||
|
||||
void set_timer(ulong t)
|
||||
{
|
||||
timestamp = t;
|
||||
}
|
||||
|
||||
unsigned long long get_ticks(void)
|
||||
{
|
||||
return get_timer(0);
|
||||
}
|
||||
|
||||
void __udelay(unsigned long usec)
|
||||
{
|
||||
ulong tmo;
|
||||
ulong endtime;
|
||||
signed long diff;
|
||||
|
||||
tmo = CONFIG_SYS_HZ_CLOCK / 1000;
|
||||
tmo *= usec;
|
||||
tmo /= (1000 * TIM_CLK_DIV);
|
||||
|
||||
endtime = get_timer_raw() + tmo;
|
||||
|
||||
do {
|
||||
ulong now = get_timer_raw();
|
||||
diff = endtime - now;
|
||||
} while (diff >= 0);
|
||||
}
|
||||
|
||||
ulong get_tbclk(void)
|
||||
{
|
||||
return CONFIG_SYS_HZ;
|
||||
}
|
||||
180
arch/arm/cpu/arm1176/tnetv107x/wdt.c
Normal file
180
arch/arm/cpu/arm1176/tnetv107x/wdt.c
Normal file
@@ -0,0 +1,180 @@
|
||||
/*
|
||||
* TNETV107X: Watchdog timer implementation (for reset)
|
||||
*
|
||||
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch/clock.h>
|
||||
|
||||
#define MAX_DIV 0xFFFE0001
|
||||
|
||||
struct wdt_regs {
|
||||
u32 kick_lock;
|
||||
#define KICK_LOCK_1 0x5555
|
||||
#define KICK_LOCK_2 0xaaaa
|
||||
u32 kick;
|
||||
|
||||
u32 change_lock;
|
||||
#define CHANGE_LOCK_1 0x6666
|
||||
#define CHANGE_LOCK_2 0xbbbb
|
||||
u32 change;
|
||||
|
||||
u32 disable_lock;
|
||||
#define DISABLE_LOCK_1 0x7777
|
||||
#define DISABLE_LOCK_2 0xcccc
|
||||
#define DISABLE_LOCK_3 0xdddd
|
||||
u32 disable;
|
||||
|
||||
u32 prescale_lock;
|
||||
#define PRESCALE_LOCK_1 0x5a5a
|
||||
#define PRESCALE_LOCK_2 0xa5a5
|
||||
u32 prescale;
|
||||
};
|
||||
|
||||
static struct wdt_regs* regs = (struct wdt_regs *)TNETV107X_WDT0_ARM_BASE;
|
||||
|
||||
#define wdt_reg_read(reg) __raw_readl(®s->reg)
|
||||
#define wdt_reg_write(reg, val) __raw_writel((val), ®s->reg)
|
||||
|
||||
static int write_prescale_reg(unsigned long prescale_value)
|
||||
{
|
||||
wdt_reg_write(prescale_lock, PRESCALE_LOCK_1);
|
||||
if ((wdt_reg_read(prescale_lock) & 0x3) != 0x1)
|
||||
return -1;
|
||||
|
||||
wdt_reg_write(prescale_lock, PRESCALE_LOCK_2);
|
||||
if ((wdt_reg_read(prescale_lock) & 0x3) != 0x3)
|
||||
return -1;
|
||||
|
||||
wdt_reg_write(prescale, prescale_value);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int write_change_reg(unsigned long initial_timer_value)
|
||||
{
|
||||
wdt_reg_write(change_lock, CHANGE_LOCK_1);
|
||||
if ((wdt_reg_read(change_lock) & 0x3) != 0x1)
|
||||
return -1;
|
||||
|
||||
wdt_reg_write(change_lock, CHANGE_LOCK_2);
|
||||
if ((wdt_reg_read(change_lock) & 0x3) != 0x3)
|
||||
return -1;
|
||||
|
||||
wdt_reg_write(change, initial_timer_value);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int wdt_control(unsigned long disable_value)
|
||||
{
|
||||
wdt_reg_write(disable_lock, DISABLE_LOCK_1);
|
||||
if ((wdt_reg_read(disable_lock) & 0x3) != 0x1)
|
||||
return -1;
|
||||
|
||||
wdt_reg_write(disable_lock, DISABLE_LOCK_2);
|
||||
if ((wdt_reg_read(disable_lock) & 0x3) != 0x2)
|
||||
return -1;
|
||||
|
||||
wdt_reg_write(disable_lock, DISABLE_LOCK_3);
|
||||
if ((wdt_reg_read(disable_lock) & 0x3) != 0x3)
|
||||
return -1;
|
||||
|
||||
wdt_reg_write(disable, disable_value);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int wdt_set_period(unsigned long msec)
|
||||
{
|
||||
unsigned long change_value, count_value;
|
||||
unsigned long prescale_value = 1;
|
||||
unsigned long refclk_khz, maxdiv;
|
||||
int ret;
|
||||
|
||||
refclk_khz = clk_get_rate(TNETV107X_LPSC_WDT_ARM);
|
||||
maxdiv = (MAX_DIV / refclk_khz);
|
||||
|
||||
if ((!msec) || (msec > maxdiv))
|
||||
return -1;
|
||||
|
||||
count_value = refclk_khz * msec;
|
||||
if (count_value > 0xffff) {
|
||||
change_value = count_value / 0xffff + 1;
|
||||
prescale_value = count_value / change_value;
|
||||
} else {
|
||||
change_value = count_value;
|
||||
}
|
||||
|
||||
ret = write_prescale_reg(prescale_value - 1);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = write_change_reg(change_value);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned long last_wdt = -1;
|
||||
|
||||
int wdt_start(unsigned long msecs)
|
||||
{
|
||||
int ret;
|
||||
ret = wdt_control(0);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = wdt_set_period(msecs);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = wdt_control(1);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = wdt_kick();
|
||||
last_wdt = msecs;
|
||||
return ret;
|
||||
}
|
||||
|
||||
int wdt_stop(void)
|
||||
{
|
||||
last_wdt = -1;
|
||||
return wdt_control(0);
|
||||
}
|
||||
|
||||
int wdt_kick(void)
|
||||
{
|
||||
wdt_reg_write(kick_lock, KICK_LOCK_1);
|
||||
if ((wdt_reg_read(kick_lock) & 0x3) != 0x1)
|
||||
return -1;
|
||||
|
||||
wdt_reg_write(kick_lock, KICK_LOCK_2);
|
||||
if ((wdt_reg_read(kick_lock) & 0x3) != 0x3)
|
||||
return -1;
|
||||
|
||||
wdt_reg_write(kick, 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void reset_cpu(ulong addr)
|
||||
{
|
||||
clk_enable(TNETV107X_LPSC_WDT_ARM);
|
||||
wdt_start(1);
|
||||
wdt_kick();
|
||||
}
|
||||
@@ -172,6 +172,7 @@ stack_setup:
|
||||
sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
|
||||
#endif
|
||||
sub sp, r0, #12 /* leave 3 words for abort-stack */
|
||||
bic sp, sp, #7 /* 8-byte alignment for ABI compliance */
|
||||
|
||||
clear_bss:
|
||||
ldr r0, _bss_start /* find start of bss segment */
|
||||
|
||||
@@ -204,6 +204,7 @@ stack_setup:
|
||||
sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
|
||||
#endif
|
||||
sub sp, r0, #12 /* leave 3 words for abort-stack */
|
||||
bic sp, sp, #7 /* 8-byte alignment for ABI compliance */
|
||||
|
||||
clear_bss:
|
||||
ldr r0, _bss_start /* find start of bss segment */
|
||||
|
||||
@@ -196,6 +196,7 @@ stack_setup:
|
||||
sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
|
||||
#endif
|
||||
sub sp, r0, #12 /* leave 3 words for abort-stack */
|
||||
bic sp, sp, #7 /* 8-byte alignment for ABI compliance */
|
||||
|
||||
clear_bss:
|
||||
ldr r0, _bss_start /* find start of bss segment */
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
#
|
||||
# (C) Copyright 2000-2006
|
||||
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||
# Copyright (C) 2010 Albert ARIBAUD <albert.aribaud@free.fr>
|
||||
#
|
||||
# Based on original Kirkwood support which is
|
||||
# (C) Copyright 2009
|
||||
# Marvell Semiconductor <www.marvell.com>
|
||||
# Written-by: Prafulla Wadaskar <prafulla@marvell.com>
|
||||
#
|
||||
# See file CREDITS for list of people who contributed to this
|
||||
# project.
|
||||
@@ -12,28 +16,31 @@
|
||||
#
|
||||
# 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
|
||||
# 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
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
# MA 02110-1301 USA
|
||||
#
|
||||
|
||||
include $(TOPDIR)/config.mk
|
||||
|
||||
LIB = $(obj)lib$(CPU).a
|
||||
LIB = $(obj)lib$(SOC).a
|
||||
|
||||
START = start.o
|
||||
SOBJS = traps.o
|
||||
COBJS = cpu.o interrupts.o serial.o asmi.o spi.o
|
||||
COBJS-y = cpu.o
|
||||
COBJS-y += dram.o
|
||||
COBJS-y += timer.o
|
||||
|
||||
SRCS := $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS:.o=.c)
|
||||
OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS))
|
||||
START := $(addprefix $(obj),$(START))
|
||||
ifndef CONFIG_SKIP_LOWLEVEL_INIT
|
||||
SOBJS := lowlevel_init.o
|
||||
endif
|
||||
|
||||
all: $(obj).depend $(START) $(LIB)
|
||||
SRCS := $(SOBJS:.o=.S) $(COBJS-y:.o=.c)
|
||||
OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS-y))
|
||||
|
||||
all: $(obj).depend $(LIB)
|
||||
|
||||
$(LIB): $(OBJS)
|
||||
$(AR) $(ARFLAGS) $@ $(OBJS)
|
||||
270
arch/arm/cpu/arm926ejs/orion5x/cpu.c
Normal file
270
arch/arm/cpu/arm926ejs/orion5x/cpu.c
Normal file
@@ -0,0 +1,270 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Albert ARIBAUD <albert.aribaud@free.fr>
|
||||
*
|
||||
* Based on original Kirkwood support which is
|
||||
* (C) Copyright 2009
|
||||
* Marvell Semiconductor <www.marvell.com>
|
||||
* Written-by: Prafulla Wadaskar <prafulla@marvell.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., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <netdev.h>
|
||||
#include <asm/cache.h>
|
||||
#include <u-boot/md5.h>
|
||||
#include <asm/arch/orion5x.h>
|
||||
#include <hush.h>
|
||||
|
||||
#define BUFLEN 16
|
||||
|
||||
void reset_cpu(unsigned long ignored)
|
||||
{
|
||||
struct orion5x_cpu_registers *cpureg =
|
||||
(struct orion5x_cpu_registers *)ORION5X_CPU_REG_BASE;
|
||||
|
||||
writel(readl(&cpureg->rstoutn_mask) | (1 << 2),
|
||||
&cpureg->rstoutn_mask);
|
||||
writel(readl(&cpureg->sys_soft_rst) | 1,
|
||||
&cpureg->sys_soft_rst);
|
||||
while (1)
|
||||
;
|
||||
}
|
||||
|
||||
/*
|
||||
* Window Size
|
||||
* Used with the Base register to set the address window size and location.
|
||||
* Must be programmed from LSB to MSB as sequence of ones followed by
|
||||
* sequence of zeros. The number of ones specifies the size of the window in
|
||||
* 64 KByte granularity (e.g., a value of 0x00FF specifies 256 = 16 MByte).
|
||||
* NOTE: A value of 0x0 specifies 64-KByte size.
|
||||
*/
|
||||
unsigned int orion5x_winctrl_calcsize(unsigned int sizeval)
|
||||
{
|
||||
int i;
|
||||
unsigned int j = 0;
|
||||
u32 val = sizeval >> 1;
|
||||
|
||||
for (i = 0; val > 0x10000; i++) {
|
||||
j |= (1 << i);
|
||||
val = val >> 1;
|
||||
}
|
||||
return 0x0000ffff & j;
|
||||
}
|
||||
|
||||
/*
|
||||
* orion5x_config_adr_windows - Configure address Windows
|
||||
*
|
||||
* There are 8 address windows supported by Orion5x Soc to addess different
|
||||
* devices. Each window can be configured for size, BAR and remap addr
|
||||
* Below configuration is standard for most of the cases
|
||||
*
|
||||
* If remap function not used, remap_lo must be set as base
|
||||
*
|
||||
* Reference Documentation:
|
||||
* Mbus-L to Mbus Bridge Registers Configuration.
|
||||
* (Sec 25.1 and 25.3 of Datasheet)
|
||||
*/
|
||||
int orion5x_config_adr_windows(void)
|
||||
{
|
||||
struct orion5x_win_registers *winregs =
|
||||
(struct orion5x_win_registers *)ORION5X_CPU_WIN_BASE;
|
||||
|
||||
/* Window 0: PCIE MEM address space */
|
||||
writel(ORION5X_CPU_WIN_CTRL_DATA(ORION5X_DEFSZ_PCIE_MEM,
|
||||
ORION5X_TARGET_PCIE, ORION5X_ATTR_PCIE_MEM,
|
||||
ORION5X_WIN_ENABLE), &winregs[0].ctrl);
|
||||
writel(ORION5X_DEFADR_PCIE_MEM, &winregs[0].base);
|
||||
writel(ORION5X_DEFADR_PCIE_MEM_REMAP_LO, &winregs[0].remap_lo);
|
||||
writel(ORION5X_DEFADR_PCIE_MEM_REMAP_HI, &winregs[0].remap_hi);
|
||||
|
||||
/* Window 1: PCIE IO address space */
|
||||
writel(ORION5X_CPU_WIN_CTRL_DATA(ORION5X_DEFSZ_PCIE_IO,
|
||||
ORION5X_TARGET_PCIE, ORION5X_ATTR_PCIE_IO,
|
||||
ORION5X_WIN_ENABLE), &winregs[1].ctrl);
|
||||
writel(ORION5X_DEFADR_PCIE_IO, &winregs[1].base);
|
||||
writel(ORION5X_DEFADR_PCIE_IO_REMAP_LO, &winregs[1].remap_lo);
|
||||
writel(ORION5X_DEFADR_PCIE_IO_REMAP_HI, &winregs[1].remap_hi);
|
||||
|
||||
/* Window 2: PCI MEM address space */
|
||||
writel(ORION5X_CPU_WIN_CTRL_DATA(ORION5X_DEFSZ_PCI_MEM,
|
||||
ORION5X_TARGET_PCI, ORION5X_ATTR_PCI_MEM,
|
||||
ORION5X_WIN_ENABLE), &winregs[2].ctrl);
|
||||
writel(ORION5X_DEFADR_PCI_MEM, &winregs[2].base);
|
||||
|
||||
/* Window 3: PCI IO address space */
|
||||
writel(ORION5X_CPU_WIN_CTRL_DATA(ORION5X_DEFSZ_PCI_IO,
|
||||
ORION5X_TARGET_PCI, ORION5X_ATTR_PCI_IO,
|
||||
ORION5X_WIN_ENABLE), &winregs[3].ctrl);
|
||||
writel(ORION5X_DEFADR_PCI_IO, &winregs[3].base);
|
||||
|
||||
/* Window 4: DEV_CS0 address space */
|
||||
writel(ORION5X_CPU_WIN_CTRL_DATA(ORION5X_DEFSZ_DEV_CS0,
|
||||
ORION5X_TARGET_DEVICE, ORION5X_ATTR_DEV_CS0,
|
||||
ORION5X_WIN_ENABLE), &winregs[4].ctrl);
|
||||
writel(ORION5X_DEFADR_DEV_CS0, &winregs[4].base);
|
||||
|
||||
/* Window 5: DEV_CS1 address space */
|
||||
writel(ORION5X_CPU_WIN_CTRL_DATA(ORION5X_DEFSZ_DEV_CS1,
|
||||
ORION5X_TARGET_DEVICE, ORION5X_ATTR_DEV_CS1,
|
||||
ORION5X_WIN_ENABLE), &winregs[5].ctrl);
|
||||
writel(ORION5X_DEFADR_DEV_CS1, &winregs[5].base);
|
||||
|
||||
/* Window 6: DEV_CS2 address space */
|
||||
writel(ORION5X_CPU_WIN_CTRL_DATA(ORION5X_DEFSZ_DEV_CS2,
|
||||
ORION5X_TARGET_DEVICE, ORION5X_ATTR_DEV_CS2,
|
||||
ORION5X_WIN_ENABLE), &winregs[6].ctrl);
|
||||
writel(ORION5X_DEFADR_DEV_CS2, &winregs[6].base);
|
||||
|
||||
/* Window 7: BOOT Memory address space */
|
||||
writel(ORION5X_CPU_WIN_CTRL_DATA(ORION5X_DEFSZ_BOOTROM,
|
||||
ORION5X_TARGET_DEVICE, ORION5X_ATTR_BOOTROM,
|
||||
ORION5X_WIN_ENABLE), &winregs[7].ctrl);
|
||||
writel(ORION5X_DEFADR_BOOTROM, &winregs[7].base);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Orion5x identification is done through PCIE space.
|
||||
*/
|
||||
|
||||
u32 orion5x_device_id(void)
|
||||
{
|
||||
return readl(PCIE_DEV_ID_OFF) >> 16;
|
||||
}
|
||||
|
||||
u32 orion5x_device_rev(void)
|
||||
{
|
||||
return readl(PCIE_DEV_REV_OFF) & 0xff;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_DISPLAY_CPUINFO)
|
||||
|
||||
/* Display device and revision IDs.
|
||||
* This function must cover all known device/revision
|
||||
* combinations, not only the one for which u-boot is
|
||||
* compiled; this way, one can identify actual HW in
|
||||
* case of a mismatch.
|
||||
*/
|
||||
int print_cpuinfo(void)
|
||||
{
|
||||
char dev_str[] = "0x0000";
|
||||
char rev_str[] = "0x00";
|
||||
char *dev_name = NULL;
|
||||
char *rev_name = NULL;
|
||||
|
||||
u32 dev = orion5x_device_id();
|
||||
u32 rev = orion5x_device_rev();
|
||||
|
||||
if (dev == MV88F5181_DEV_ID) {
|
||||
dev_name = "MV88F5181";
|
||||
if (rev == MV88F5181_REV_B1)
|
||||
rev_name = "B1";
|
||||
else if (rev == MV88F5181L_REV_A1) {
|
||||
dev_name = "MV88F5181L";
|
||||
rev_name = "A1";
|
||||
} else if (rev == MV88F5181L_REV_A0) {
|
||||
dev_name = "MV88F5181L";
|
||||
rev_name = "A0";
|
||||
}
|
||||
} else if (dev == MV88F5182_DEV_ID) {
|
||||
dev_name = "MV88F5182";
|
||||
if (rev == MV88F5182_REV_A2)
|
||||
rev_name = "A2";
|
||||
} else if (dev == MV88F5281_DEV_ID) {
|
||||
dev_name = "MV88F5281";
|
||||
if (rev == MV88F5281_REV_D2)
|
||||
rev_name = "D2";
|
||||
else if (rev == MV88F5281_REV_D1)
|
||||
rev_name = "D1";
|
||||
else if (rev == MV88F5281_REV_D0)
|
||||
rev_name = "D0";
|
||||
} else if (dev == MV88F6183_DEV_ID) {
|
||||
dev_name = "MV88F6183";
|
||||
if (rev == MV88F6183_REV_B0)
|
||||
rev_name = "B0";
|
||||
}
|
||||
if (dev_name == NULL) {
|
||||
sprintf(dev_str, "0x%04x", dev);
|
||||
dev_name = dev_str;
|
||||
}
|
||||
if (rev_name == NULL) {
|
||||
sprintf(rev_str, "0x%02x", rev);
|
||||
rev_name = rev_str;
|
||||
}
|
||||
|
||||
printf("SoC: Orion5x %s-%s\n", dev_name, rev_name);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_DISPLAY_CPUINFO */
|
||||
|
||||
#ifdef CONFIG_ARCH_CPU_INIT
|
||||
int arch_cpu_init(void)
|
||||
{
|
||||
/* Enable and invalidate L2 cache in write through mode */
|
||||
invalidate_l2_cache();
|
||||
|
||||
orion5x_config_adr_windows();
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_ARCH_CPU_INIT */
|
||||
|
||||
/*
|
||||
* SOC specific misc init
|
||||
*/
|
||||
#if defined(CONFIG_ARCH_MISC_INIT)
|
||||
int arch_misc_init(void)
|
||||
{
|
||||
u32 temp;
|
||||
|
||||
/*CPU streaming & write allocate */
|
||||
temp = readfr_extra_feature_reg();
|
||||
temp &= ~(1 << 28); /* disable wr alloc */
|
||||
writefr_extra_feature_reg(temp);
|
||||
|
||||
temp = readfr_extra_feature_reg();
|
||||
temp &= ~(1 << 29); /* streaming disabled */
|
||||
writefr_extra_feature_reg(temp);
|
||||
|
||||
/* L2Cache settings */
|
||||
temp = readfr_extra_feature_reg();
|
||||
/* Disable L2C pre fetch - Set bit 24 */
|
||||
temp |= (1 << 24);
|
||||
/* enable L2C - Set bit 22 */
|
||||
temp |= (1 << 22);
|
||||
writefr_extra_feature_reg(temp);
|
||||
|
||||
icache_enable();
|
||||
/* Change reset vector to address 0x0 */
|
||||
temp = get_cr();
|
||||
set_cr(temp & ~CR_V);
|
||||
|
||||
/* Set CPIOs and MPPs - values provided by board
|
||||
include file */
|
||||
writel(ORION5X_MPP0_7, ORION5X_MPP_BASE+0x00);
|
||||
writel(ORION5X_MPP8_15, ORION5X_MPP_BASE+0x04);
|
||||
writel(ORION5X_MPP16_23, ORION5X_MPP_BASE+0x50);
|
||||
writel(ORION5X_GPIO_OUT_ENABLE, ORION5X_GPIO_BASE+0x04);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_ARCH_MISC_INIT */
|
||||
64
arch/arm/cpu/arm926ejs/orion5x/dram.c
Normal file
64
arch/arm/cpu/arm926ejs/orion5x/dram.c
Normal file
@@ -0,0 +1,64 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Albert ARIBAUD <albert.aribaud@free.fr>
|
||||
*
|
||||
* Based on original Kirkwood support which is
|
||||
* (C) Copyright 2009
|
||||
* Marvell Semiconductor <www.marvell.com>
|
||||
* Written-by: Prafulla Wadaskar <prafulla@marvell.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., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <config.h>
|
||||
#include <asm/arch/orion5x.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
/*
|
||||
* orion5x_sdram_bar - reads SDRAM Base Address Register
|
||||
*/
|
||||
u32 orion5x_sdram_bar(enum memory_bank bank)
|
||||
{
|
||||
struct orion5x_ddr_addr_decode_registers *winregs =
|
||||
(struct orion5x_ddr_addr_decode_registers *)
|
||||
ORION5X_CPU_WIN_BASE;
|
||||
|
||||
u32 result = 0;
|
||||
u32 enable = 0x01 & winregs[bank].size;
|
||||
|
||||
if ((!enable) || (bank > BANK3))
|
||||
return 0;
|
||||
|
||||
result = winregs[bank].base;
|
||||
return result;
|
||||
}
|
||||
|
||||
int dram_init(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
|
||||
gd->bd->bi_dram[i].start = orion5x_sdram_bar(i);
|
||||
gd->bd->bi_dram[i].size = get_ram_size(
|
||||
(volatile long *) (gd->bd->bi_dram[i].start),
|
||||
CONFIG_MAX_RAM_BANK_SIZE);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
293
arch/arm/cpu/arm926ejs/orion5x/lowlevel_init.S
Normal file
293
arch/arm/cpu/arm926ejs/orion5x/lowlevel_init.S
Normal file
@@ -0,0 +1,293 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Albert ARIBAUD <albert.aribaud@free.fr>
|
||||
*
|
||||
* (C) Copyright 2009
|
||||
* Marvell Semiconductor <www.marvell.com>
|
||||
* Written-by: Prafulla Wadaskar <prafulla@marvell.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., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include "asm/arch/orion5x.h"
|
||||
|
||||
/*
|
||||
* Configuration values for SDRAM access setup
|
||||
*/
|
||||
|
||||
#define SDRAM_CONFIG 0x3148400
|
||||
#define SDRAM_MODE 0x62
|
||||
#define SDRAM_CONTROL 0x4041000
|
||||
#define SDRAM_TIME_CTRL_LOW 0x11602220
|
||||
#define SDRAM_TIME_CTRL_HI 0x40c
|
||||
#define SDRAM_OPEN_PAGE_EN 0x0
|
||||
/* DDR 1 2x 32M NANYA NT5DS16M16CS-6K ==> 64MB */
|
||||
#define SDRAM_BANK0_SIZE 0x3ff0001
|
||||
#define SDRAM_ADDR_CTRL 0x10
|
||||
|
||||
#define SDRAM_OP_NOP 0x05
|
||||
#define SDRAM_OP_SETMODE 0x03
|
||||
|
||||
#define SDRAM_PAD_CTRL_WR_EN 0x80000000
|
||||
#define SDRAM_PAD_CTRL_TUNE_EN 0x00010000
|
||||
#define SDRAM_PAD_CTRL_DRVN_MASK 0x0000003f
|
||||
#define SDRAM_PAD_CTRL_DRVP_MASK 0x00000fc0
|
||||
|
||||
/*
|
||||
* For Guideline MEM-3 - Drive Strength value
|
||||
*/
|
||||
|
||||
#define DDR1_PAD_STRENGTH_DEFAULT 0x00001000
|
||||
#define SDRAM_PAD_CTRL_DRV_STR_MASK 0x00003000
|
||||
|
||||
/*
|
||||
* For Guideline MEM-4 - DQS Reference Delay Tuning
|
||||
*/
|
||||
|
||||
#define MSAR_ARMDDRCLCK_MASK 0x000000f0
|
||||
#define MSAR_ARMDDRCLCK_H_MASK 0x00000100
|
||||
|
||||
#define MSAR_ARMDDRCLCK_333_167 0x00000000
|
||||
#define MSAR_ARMDDRCLCK_500_167 0x00000030
|
||||
#define MSAR_ARMDDRCLCK_667_167 0x00000060
|
||||
#define MSAR_ARMDDRCLCK_400_200_1 0x000001E0
|
||||
#define MSAR_ARMDDRCLCK_400_200 0x00000010
|
||||
#define MSAR_ARMDDRCLCK_600_200 0x00000050
|
||||
#define MSAR_ARMDDRCLCK_800_200 0x00000070
|
||||
|
||||
#define FTDLL_DDR1_166MHZ 0x0047F001
|
||||
|
||||
#define FTDLL_DDR1_200MHZ 0x0044D001
|
||||
|
||||
/*
|
||||
* Low-level init happens right after start.S has switched to SVC32,
|
||||
* flushed and disabled caches and disabled MMU. We're still running
|
||||
* from the boot chip select, so the first thing we should do is set
|
||||
* up RAM for us to relocate into.
|
||||
*/
|
||||
|
||||
.globl lowlevel_init
|
||||
|
||||
lowlevel_init:
|
||||
|
||||
/* Use 'r4 as the base for internal register accesses */
|
||||
ldr r4, =ORION5X_REGS_PHY_BASE
|
||||
|
||||
/* move internal registers from the default 0xD0000000
|
||||
* to their intended location, defined by SoC */
|
||||
ldr r3, =0xD0000000
|
||||
add r3, r3, #0x20000
|
||||
str r4, [r3, #0x80]
|
||||
|
||||
/* Use R3 as the base for DRAM registers */
|
||||
add r3, r4, #0x01000
|
||||
|
||||
/*DDR SDRAM Initialization Control */
|
||||
ldr r6, =0x00000001
|
||||
str r6, [r3, #0x480]
|
||||
|
||||
/* Use R3 as the base for PCI registers */
|
||||
add r3, r4, #0x31000
|
||||
|
||||
/* Disable arbiter */
|
||||
ldr r6, =0x00000030
|
||||
str r6, [r3, #0xd00]
|
||||
|
||||
/* Use R3 as the base for DRAM registers */
|
||||
add r3, r4, #0x01000
|
||||
|
||||
/* set all dram windows to 0 */
|
||||
mov r6, #0
|
||||
str r6, [r3, #0x504]
|
||||
str r6, [r3, #0x50C]
|
||||
str r6, [r3, #0x514]
|
||||
str r6, [r3, #0x51C]
|
||||
|
||||
/* 1) Configure SDRAM */
|
||||
ldr r6, =SDRAM_CONFIG
|
||||
str r6, [r3, #0x400]
|
||||
|
||||
/* 2) Set SDRAM Control reg */
|
||||
ldr r6, =SDRAM_CONTROL
|
||||
str r6, [r3, #0x404]
|
||||
|
||||
/* 3) Write SDRAM address control register */
|
||||
ldr r6, =SDRAM_ADDR_CTRL
|
||||
str r6, [r3, #0x410]
|
||||
|
||||
/* 4) Write SDRAM bank 0 size register */
|
||||
ldr r6, =SDRAM_BANK0_SIZE
|
||||
str r6, [r3, #0x504]
|
||||
/* keep other banks disabled */
|
||||
|
||||
/* 5) Write SDRAM open pages control register */
|
||||
ldr r6, =SDRAM_OPEN_PAGE_EN
|
||||
str r6, [r3, #0x414]
|
||||
|
||||
/* 6) Write SDRAM timing Low register */
|
||||
ldr r6, =SDRAM_TIME_CTRL_LOW
|
||||
str r6, [r3, #0x408]
|
||||
|
||||
/* 7) Write SDRAM timing High register */
|
||||
ldr r6, =SDRAM_TIME_CTRL_HI
|
||||
str r6, [r3, #0x40C]
|
||||
|
||||
/* 8) Write SDRAM mode register */
|
||||
/* The CPU must not attempt to change the SDRAM Mode register setting */
|
||||
/* prior to DRAM controller completion of the DRAM initialization */
|
||||
/* sequence. To guarantee this restriction, it is recommended that */
|
||||
/* the CPU sets the SDRAM Operation register to NOP command, performs */
|
||||
/* read polling until the register is back in Normal operation value, */
|
||||
/* and then sets SDRAM Mode register to its new value. */
|
||||
|
||||
/* 8.1 write 'nop' to SDRAM operation */
|
||||
ldr r6, =SDRAM_OP_NOP
|
||||
str r6, [r3, #0x418]
|
||||
|
||||
/* 8.2 poll SDRAM operation until back in 'normal' mode. */
|
||||
1:
|
||||
ldr r6, [r3, #0x418]
|
||||
cmp r6, #0
|
||||
bne 1b
|
||||
|
||||
/* 8.3 Now its safe to write new value to SDRAM Mode register */
|
||||
ldr r6, =SDRAM_MODE
|
||||
str r6, [r3, #0x41C]
|
||||
|
||||
/* 8.4 Set new mode */
|
||||
ldr r6, =SDRAM_OP_SETMODE
|
||||
str r6, [r3, #0x418]
|
||||
|
||||
/* 8.5 poll SDRAM operation until back in 'normal' mode. */
|
||||
2:
|
||||
ldr r6, [r3, #0x418]
|
||||
cmp r6, #0
|
||||
bne 2b
|
||||
|
||||
/* DDR SDRAM Address/Control Pads Calibration */
|
||||
ldr r6, [r3, #0x4C0]
|
||||
|
||||
/* Set Bit [31] to make the register writable */
|
||||
orr r6, r6, #SDRAM_PAD_CTRL_WR_EN
|
||||
str r6, [r3, #0x4C0]
|
||||
|
||||
bic r6, r6, #SDRAM_PAD_CTRL_WR_EN
|
||||
bic r6, r6, #SDRAM_PAD_CTRL_TUNE_EN
|
||||
bic r6, r6, #SDRAM_PAD_CTRL_DRVN_MASK
|
||||
bic r6, r6, #SDRAM_PAD_CTRL_DRVP_MASK
|
||||
|
||||
/* Get the final N locked value of driving strength [22:17] */
|
||||
mov r1, r6
|
||||
mov r1, r1, LSL #9
|
||||
mov r1, r1, LSR #26 /* r1[5:0]<DrvN> = r3[22:17]<LockN> */
|
||||
orr r1, r1, r1, LSL #6 /* r1[11:6]<DrvP> = r1[5:0]<DrvN> */
|
||||
|
||||
/* Write to both <DrvN> bits [5:0] and <DrvP> bits [11:6] */
|
||||
orr r6, r6, r1
|
||||
str r6, [r3, #0x4C0]
|
||||
|
||||
/* DDR SDRAM Data Pads Calibration */
|
||||
ldr r6, [r3, #0x4C4]
|
||||
|
||||
/* Set Bit [31] to make the register writable */
|
||||
orr r6, r6, #SDRAM_PAD_CTRL_WR_EN
|
||||
str r6, [r3, #0x4C4]
|
||||
|
||||
bic r6, r6, #SDRAM_PAD_CTRL_WR_EN
|
||||
bic r6, r6, #SDRAM_PAD_CTRL_TUNE_EN
|
||||
bic r6, r6, #SDRAM_PAD_CTRL_DRVN_MASK
|
||||
bic r6, r6, #SDRAM_PAD_CTRL_DRVP_MASK
|
||||
|
||||
/* Get the final N locked value of driving strength [22:17] */
|
||||
mov r1, r6
|
||||
mov r1, r1, LSL #9
|
||||
mov r1, r1, LSR #26
|
||||
orr r1, r1, r1, LSL #6 /* r1[5:0] = r3[22:17]<LockN> */
|
||||
|
||||
/* Write to both <DrvN> bits [5:0] and <DrvP> bits [11:6] */
|
||||
orr r6, r6, r1
|
||||
|
||||
str r6, [r3, #0x4C4]
|
||||
|
||||
/* Implement Guideline (GL# MEM-3) Drive Strength Value */
|
||||
/* Relevant for: 88F5181-A1/B0/B1 and 88F5281-A0/B0 */
|
||||
|
||||
ldr r1, =DDR1_PAD_STRENGTH_DEFAULT
|
||||
|
||||
/* Enable writes to DDR SDRAM Addr/Ctrl Pads Calibration register */
|
||||
ldr r6, [r3, #0x4C0]
|
||||
orr r6, r6, #SDRAM_PAD_CTRL_WR_EN
|
||||
str r6, [r3, #0x4C0]
|
||||
|
||||
/* Correct strength and disable writes again */
|
||||
bic r6, r6, #SDRAM_PAD_CTRL_WR_EN
|
||||
bic r6, r6, #SDRAM_PAD_CTRL_DRV_STR_MASK
|
||||
orr r6, r6, r1
|
||||
str r6, [r3, #0x4C0]
|
||||
|
||||
/* Enable writes to DDR SDRAM Data Pads Calibration register */
|
||||
ldr r6, [r3, #0x4C4]
|
||||
orr r6, r6, #SDRAM_PAD_CTRL_WR_EN
|
||||
str r6, [r3, #0x4C4]
|
||||
|
||||
/* Correct strength and disable writes again */
|
||||
bic r6, r6, #SDRAM_PAD_CTRL_DRV_STR_MASK
|
||||
bic r6, r6, #SDRAM_PAD_CTRL_WR_EN
|
||||
orr r6, r6, r1
|
||||
str r6, [r3, #0x4C4]
|
||||
|
||||
/* Implement Guideline (GL# MEM-4) DQS Reference Delay Tuning */
|
||||
/* Relevant for: 88F5181-A1/B0/B1 and 88F5281-A0/B0 */
|
||||
|
||||
/* Get the "sample on reset" register for the DDR frequancy */
|
||||
ldr r3, =0x10000
|
||||
ldr r6, [r3, #0x010]
|
||||
ldr r1, =MSAR_ARMDDRCLCK_MASK
|
||||
and r1, r6, r1
|
||||
|
||||
ldr r6, =FTDLL_DDR1_166MHZ
|
||||
cmp r1, #MSAR_ARMDDRCLCK_333_167
|
||||
beq 3f
|
||||
cmp r1, #MSAR_ARMDDRCLCK_500_167
|
||||
beq 3f
|
||||
cmp r1, #MSAR_ARMDDRCLCK_667_167
|
||||
beq 3f
|
||||
|
||||
ldr r6, =FTDLL_DDR1_200MHZ
|
||||
cmp r1, #MSAR_ARMDDRCLCK_400_200_1
|
||||
beq 3f
|
||||
cmp r1, #MSAR_ARMDDRCLCK_400_200
|
||||
beq 3f
|
||||
cmp r1, #MSAR_ARMDDRCLCK_600_200
|
||||
beq 3f
|
||||
cmp r1, #MSAR_ARMDDRCLCK_800_200
|
||||
beq 3f
|
||||
|
||||
ldr r6, =0
|
||||
|
||||
3:
|
||||
/* Use R3 as the base for DRAM registers */
|
||||
add r3, r4, #0x01000
|
||||
|
||||
ldr r2, [r3, #0x484]
|
||||
orr r2, r2, r6
|
||||
str r2, [r3, #0x484]
|
||||
|
||||
/* Return to U-boot via saved link register */
|
||||
mov pc, lr
|
||||
181
arch/arm/cpu/arm926ejs/orion5x/timer.c
Normal file
181
arch/arm/cpu/arm926ejs/orion5x/timer.c
Normal file
@@ -0,0 +1,181 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Albert ARIBAUD <albert.aribaud@free.fr>
|
||||
*
|
||||
* Based on original Kirkwood support which is
|
||||
* Copyright (C) Marvell International Ltd. and its affiliates
|
||||
* Written-by: Prafulla Wadaskar <prafulla@marvell.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., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/arch/orion5x.h>
|
||||
|
||||
#define UBOOT_CNTR 0 /* counter to use for uboot timer */
|
||||
|
||||
/* Timer reload and current value registers */
|
||||
struct orion5x_tmr_val {
|
||||
u32 reload; /* Timer reload reg */
|
||||
u32 val; /* Timer value reg */
|
||||
};
|
||||
|
||||
/* Timer registers */
|
||||
struct orion5x_tmr_registers {
|
||||
u32 ctrl; /* Timer control reg */
|
||||
u32 pad[3];
|
||||
struct orion5x_tmr_val tmr[2];
|
||||
u32 wdt_reload;
|
||||
u32 wdt_val;
|
||||
};
|
||||
|
||||
struct orion5x_tmr_registers *orion5x_tmr_regs =
|
||||
(struct orion5x_tmr_registers *)ORION5X_TIMER_BASE;
|
||||
|
||||
/*
|
||||
* ARM Timers Registers Map
|
||||
*/
|
||||
#define CNTMR_CTRL_REG (&orion5x_tmr_regs->ctrl)
|
||||
#define CNTMR_RELOAD_REG(tmrnum) (&orion5x_tmr_regs->tmr[tmrnum].reload)
|
||||
#define CNTMR_VAL_REG(tmrnum) (&orion5x_tmr_regs->tmr[tmrnum].val)
|
||||
|
||||
/*
|
||||
* ARM Timers Control Register
|
||||
* CPU_TIMERS_CTRL_REG (CTCR)
|
||||
*/
|
||||
#define CTCR_ARM_TIMER_EN_OFFS(cntr) (cntr * 2)
|
||||
#define CTCR_ARM_TIMER_EN_MASK(cntr) (1 << CTCR_ARM_TIMER_EN_OFFS)
|
||||
#define CTCR_ARM_TIMER_EN(cntr) (1 << CTCR_ARM_TIMER_EN_OFFS(cntr))
|
||||
#define CTCR_ARM_TIMER_DIS(cntr) (0 << CTCR_ARM_TIMER_EN_OFFS(cntr))
|
||||
|
||||
#define CTCR_ARM_TIMER_AUTO_OFFS(cntr) ((cntr * 2) + 1)
|
||||
#define CTCR_ARM_TIMER_AUTO_MASK(cntr) (1 << 1)
|
||||
#define CTCR_ARM_TIMER_AUTO_EN(cntr) (1 << CTCR_ARM_TIMER_AUTO_OFFS(cntr))
|
||||
#define CTCR_ARM_TIMER_AUTO_DIS(cntr) (0 << CTCR_ARM_TIMER_AUTO_OFFS(cntr))
|
||||
|
||||
/*
|
||||
* ARM Timer\Watchdog Reload Register
|
||||
* CNTMR_RELOAD_REG (TRR)
|
||||
*/
|
||||
#define TRG_ARM_TIMER_REL_OFFS 0
|
||||
#define TRG_ARM_TIMER_REL_MASK 0xffffffff
|
||||
|
||||
/*
|
||||
* ARM Timer\Watchdog Register
|
||||
* CNTMR_VAL_REG (TVRG)
|
||||
*/
|
||||
#define TVR_ARM_TIMER_OFFS 0
|
||||
#define TVR_ARM_TIMER_MASK 0xffffffff
|
||||
#define TVR_ARM_TIMER_MAX 0xffffffff
|
||||
#define TIMER_LOAD_VAL 0xffffffff
|
||||
|
||||
static inline ulong read_timer(void)
|
||||
{
|
||||
return readl(CNTMR_VAL_REG(UBOOT_CNTR))
|
||||
/ (CONFIG_SYS_TCLK / 1000);
|
||||
}
|
||||
|
||||
static ulong timestamp;
|
||||
static ulong lastdec;
|
||||
|
||||
void reset_timer_masked(void)
|
||||
{
|
||||
/* reset time */
|
||||
lastdec = read_timer();
|
||||
timestamp = 0;
|
||||
}
|
||||
|
||||
ulong get_timer_masked(void)
|
||||
{
|
||||
ulong now = read_timer();
|
||||
|
||||
if (lastdec >= now) {
|
||||
/* normal mode */
|
||||
timestamp += lastdec - now;
|
||||
} else {
|
||||
/* we have an overflow ... */
|
||||
timestamp += lastdec +
|
||||
(TIMER_LOAD_VAL / (CONFIG_SYS_TCLK / 1000)) - now;
|
||||
}
|
||||
lastdec = now;
|
||||
|
||||
return timestamp;
|
||||
}
|
||||
|
||||
void reset_timer(void)
|
||||
{
|
||||
reset_timer_masked();
|
||||
}
|
||||
|
||||
ulong get_timer(ulong base)
|
||||
{
|
||||
return get_timer_masked() - base;
|
||||
}
|
||||
|
||||
void set_timer(ulong t)
|
||||
{
|
||||
timestamp = t;
|
||||
}
|
||||
|
||||
static inline ulong uboot_cntr_val(void)
|
||||
{
|
||||
return readl(CNTMR_VAL_REG(UBOOT_CNTR));
|
||||
}
|
||||
|
||||
void __udelay(unsigned long usec)
|
||||
{
|
||||
uint current;
|
||||
ulong delayticks;
|
||||
|
||||
current = uboot_cntr_val();
|
||||
delayticks = (usec * (CONFIG_SYS_TCLK / 1000000));
|
||||
|
||||
if (current < delayticks) {
|
||||
delayticks -= current;
|
||||
while (uboot_cntr_val() < current)
|
||||
;
|
||||
while ((TIMER_LOAD_VAL - delayticks) < uboot_cntr_val())
|
||||
;
|
||||
} else {
|
||||
while (uboot_cntr_val() > (current - delayticks))
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* init the counter
|
||||
*/
|
||||
int timer_init(void)
|
||||
{
|
||||
unsigned int cntmrctrl;
|
||||
|
||||
/* load value into timer */
|
||||
writel(TIMER_LOAD_VAL, CNTMR_RELOAD_REG(UBOOT_CNTR));
|
||||
writel(TIMER_LOAD_VAL, CNTMR_VAL_REG(UBOOT_CNTR));
|
||||
|
||||
/* enable timer in auto reload mode */
|
||||
cntmrctrl = readl(CNTMR_CTRL_REG);
|
||||
cntmrctrl |= CTCR_ARM_TIMER_EN(UBOOT_CNTR);
|
||||
cntmrctrl |= CTCR_ARM_TIMER_AUTO_EN(UBOOT_CNTR);
|
||||
writel(cntmrctrl, CNTMR_CTRL_REG);
|
||||
|
||||
/* init the timestamp and lastdec value */
|
||||
reset_timer_masked();
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -196,7 +196,7 @@ stack_setup:
|
||||
#endif
|
||||
#endif /* CONFIG_PRELOADER */
|
||||
sub sp, r0, #12 /* leave 3 words for abort-stack */
|
||||
bic sp, r0, #7 /* 8-byte align stack for ABI compliance */
|
||||
bic sp, sp, #7 /* 8-byte alignment for ABI compliance */
|
||||
|
||||
clear_bss:
|
||||
ldr r0, _bss_start /* find start of bss segment */
|
||||
|
||||
@@ -163,6 +163,7 @@ stack_setup:
|
||||
sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
|
||||
#endif
|
||||
sub sp, r0, #12 /* leave 3 words for abort-stack */
|
||||
bic sp, sp, #7 /* 8-byte alignment for ABI compliance */
|
||||
|
||||
clear_bss:
|
||||
ldr r0, _bss_start /* find start of bss segment */
|
||||
|
||||
@@ -37,8 +37,11 @@ COBJS += syslib.o
|
||||
COBJS += sys_info.o
|
||||
COBJS += timer.o
|
||||
|
||||
COBJS-$(CONFIG_EMIF4) += emif4.o
|
||||
COBJS-$(CONFIG_SDRC) += sdrc.o
|
||||
|
||||
SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c)
|
||||
OBJS := $(addprefix $(obj),$(COBJS) $(SOBJS))
|
||||
OBJS := $(addprefix $(obj),$(COBJS) $(COBJS-y) $(SOBJS))
|
||||
|
||||
all: $(obj).depend $(LIB)
|
||||
|
||||
|
||||
@@ -40,8 +40,6 @@
|
||||
|
||||
extern omap3_sysinfo sysinfo;
|
||||
|
||||
extern u32 is_mem_sdr(void);
|
||||
|
||||
/******************************************************************************
|
||||
* Routine: delay
|
||||
* Description: spinning delay to use before udelay works
|
||||
@@ -233,7 +231,7 @@ void s_init(void)
|
||||
per_clocks_enable();
|
||||
|
||||
if (!in_sdram)
|
||||
sdrc_init();
|
||||
mem_init();
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@@ -273,36 +271,6 @@ void watchdog_init(void)
|
||||
writel(WD_UNLOCK2, &wd2_base->wspr);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* Routine: dram_init
|
||||
* Description: sets uboots idea of sdram size
|
||||
*****************************************************************************/
|
||||
int dram_init(void)
|
||||
{
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
unsigned int size0 = 0, size1 = 0;
|
||||
|
||||
/*
|
||||
* If a second bank of DDR is attached to CS1 this is
|
||||
* where it can be started. Early init code will init
|
||||
* memory on CS0.
|
||||
*/
|
||||
if ((sysinfo.mtype == DDR_COMBO) || (sysinfo.mtype == DDR_STACKED)) {
|
||||
do_sdrc_init(CS1, NOT_EARLY);
|
||||
make_cs1_contiguous();
|
||||
}
|
||||
|
||||
size0 = get_sdr_cs_size(CS0);
|
||||
size1 = get_sdr_cs_size(CS1);
|
||||
|
||||
gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
|
||||
gd->bd->bi_dram[0].size = size0;
|
||||
gd->bd->bi_dram[1].start = PHYS_SDRAM_1 + get_sdr_cs_offset(CS1);
|
||||
gd->bd->bi_dram[1].size = size1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* Dummy function to handle errors for EABI incompatibility
|
||||
*****************************************************************************/
|
||||
|
||||
@@ -130,7 +130,7 @@ finished_inval:
|
||||
|
||||
|
||||
l2_cache_enable:
|
||||
push {r0, r1, r2, lr}
|
||||
stmfd r13!, {r0, r1, r2, lr}
|
||||
@ ES2 onwards we can disable/enable L2 ourselves
|
||||
bl get_cpu_rev
|
||||
cmp r0, #CPU_3XX_ES20
|
||||
@@ -157,11 +157,11 @@ l2_cache_enable_EARLIER_THAN_ES2:
|
||||
mov ip, r3
|
||||
str r3, [sp, #4]
|
||||
l2_cache_enable_END:
|
||||
pop {r1, r2, r3, pc}
|
||||
ldmfd r13!, {r1, r2, r3, pc}
|
||||
|
||||
|
||||
l2_cache_disable:
|
||||
push {r0, r1, r2, lr}
|
||||
stmfd r13!, {r0, r1, r2, lr}
|
||||
@ ES2 onwards we can disable/enable L2 ourselves
|
||||
bl get_cpu_rev
|
||||
cmp r0, #CPU_3XX_ES20
|
||||
@@ -188,4 +188,4 @@ l2_cache_disable_EARLIER_THAN_ES2:
|
||||
mov ip, r3
|
||||
str r3, [sp, #4]
|
||||
l2_cache_disable_END:
|
||||
pop {r1, r2, r3, pc}
|
||||
ldmfd r13!, {r1, r2, r3, pc}
|
||||
|
||||
168
arch/arm/cpu/arm_cortexa8/omap3/emif4.c
Normal file
168
arch/arm/cpu/arm_cortexa8/omap3/emif4.c
Normal file
@@ -0,0 +1,168 @@
|
||||
/*
|
||||
* Author :
|
||||
* Vaibhav Hiremath <hvaibhav@ti.com>
|
||||
*
|
||||
* Based on mem.c and sdrc.c
|
||||
*
|
||||
* Copyright (C) 2010
|
||||
* Texas Instruments Incorporated - http://www.ti.com/
|
||||
*
|
||||
* 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>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch/mem.h>
|
||||
#include <asm/arch/sys_proto.h>
|
||||
#include <asm/arch/emif4.h>
|
||||
|
||||
extern omap3_sysinfo sysinfo;
|
||||
|
||||
static emif4_t *emif4_base = (emif4_t *)OMAP34XX_SDRC_BASE;
|
||||
|
||||
/*
|
||||
* is_mem_sdr -
|
||||
* - Return 1 if mem type in use is SDR
|
||||
*/
|
||||
u32 is_mem_sdr(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* get_sdr_cs_size -
|
||||
* - Get size of chip select 0/1
|
||||
*/
|
||||
u32 get_sdr_cs_size(u32 cs)
|
||||
{
|
||||
u32 size;
|
||||
|
||||
/* TODO: Calculate the size based on EMIF4 configuration */
|
||||
size = CONFIG_SYS_CS0_SIZE;
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
/*
|
||||
* get_sdr_cs_offset -
|
||||
* - Get offset of cs from cs0 start
|
||||
*/
|
||||
u32 get_sdr_cs_offset(u32 cs)
|
||||
{
|
||||
u32 offset = 0;
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
||||
/*
|
||||
* do_emif4_init -
|
||||
* - Init the emif4 module for DDR access
|
||||
* - Early init routines, called from flash or SRAM.
|
||||
*/
|
||||
void do_emif4_init(void)
|
||||
{
|
||||
unsigned int regval;
|
||||
/* Set the DDR PHY parameters in PHY ctrl registers */
|
||||
regval = (EMIF4_DDR1_READ_LAT | EMIF4_DDR1_PWRDN_DIS |
|
||||
EMIF4_DDR1_EXT_STRB_DIS);
|
||||
writel(regval, &emif4_base->ddr_phyctrl1);
|
||||
writel(regval, &emif4_base->ddr_phyctrl1_shdw);
|
||||
writel(0, &emif4_base->ddr_phyctrl2);
|
||||
|
||||
/* Reset the DDR PHY and wait till completed */
|
||||
regval = readl(&emif4_base->sdram_iodft_tlgc);
|
||||
regval |= (1<<10);
|
||||
writel(regval, &emif4_base->sdram_iodft_tlgc);
|
||||
/*Wait till that bit clears*/
|
||||
while ((readl(&emif4_base->sdram_iodft_tlgc) & (1<<10)) == 0x1);
|
||||
/*Re-verify the DDR PHY status*/
|
||||
while ((readl(&emif4_base->sdram_sts) & (1<<2)) == 0x0);
|
||||
|
||||
regval |= (1<<0);
|
||||
writel(regval, &emif4_base->sdram_iodft_tlgc);
|
||||
/* Set SDR timing registers */
|
||||
regval = (EMIF4_TIM1_T_WTR | EMIF4_TIM1_T_RRD |
|
||||
EMIF4_TIM1_T_RC | EMIF4_TIM1_T_RAS |
|
||||
EMIF4_TIM1_T_WR | EMIF4_TIM1_T_RCD |
|
||||
EMIF4_TIM1_T_RP);
|
||||
writel(regval, &emif4_base->sdram_time1);
|
||||
writel(regval, &emif4_base->sdram_time1_shdw);
|
||||
|
||||
regval = (EMIF4_TIM2_T_CKE | EMIF4_TIM2_T_RTP |
|
||||
EMIF4_TIM2_T_XSRD | EMIF4_TIM2_T_XSNR |
|
||||
EMIF4_TIM2_T_ODT | EMIF4_TIM2_T_XP);
|
||||
writel(regval, &emif4_base->sdram_time2);
|
||||
writel(regval, &emif4_base->sdram_time2_shdw);
|
||||
|
||||
regval = (EMIF4_TIM3_T_RAS_MAX | EMIF4_TIM3_T_RFC);
|
||||
writel(regval, &emif4_base->sdram_time3);
|
||||
writel(regval, &emif4_base->sdram_time3_shdw);
|
||||
|
||||
/* Set the PWR control register */
|
||||
regval = (EMIF4_PWR_PM_TIM | EMIF4_PWR_LP_MODE |
|
||||
EMIF4_PWR_DPD_DIS | EMIF4_PWR_IDLE_MODE);
|
||||
writel(regval, &emif4_base->sdram_pwr_mgmt);
|
||||
writel(regval, &emif4_base->sdram_pwr_mgmt_shdw);
|
||||
|
||||
/* Set the DDR refresh rate control register */
|
||||
regval = (EMIF4_REFRESH_RATE | EMIF4_INITREF_DIS);
|
||||
writel(regval, &emif4_base->sdram_refresh_ctrl);
|
||||
writel(regval, &emif4_base->sdram_refresh_ctrl_shdw);
|
||||
|
||||
/* set the SDRAM configuration register */
|
||||
regval = (EMIF4_CFG_PGSIZE | EMIF4_CFG_EBANK |
|
||||
EMIF4_CFG_IBANK | EMIF4_CFG_ROWSIZE |
|
||||
EMIF4_CFG_CL | EMIF4_CFG_NARROW_MD |
|
||||
EMIF4_CFG_SDR_DRV | EMIF4_CFG_DDR_DIS_DLL |
|
||||
EMIF4_CFG_DDR2_DDQS | EMIF4_CFG_DDR_TERM |
|
||||
EMIF4_CFG_IBANK_POS | EMIF4_CFG_SDRAM_TYP);
|
||||
writel(regval, &emif4_base->sdram_config);
|
||||
}
|
||||
|
||||
/*
|
||||
* dram_init -
|
||||
* - Sets uboots idea of sdram size
|
||||
*/
|
||||
int dram_init(void)
|
||||
{
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
unsigned int size0 = 0, size1 = 0;
|
||||
|
||||
size0 = get_sdr_cs_size(CS0);
|
||||
/*
|
||||
* If a second bank of DDR is attached to CS1 this is
|
||||
* where it can be started. Early init code will init
|
||||
* memory on CS0.
|
||||
*/
|
||||
if ((sysinfo.mtype == DDR_COMBO) || (sysinfo.mtype == DDR_STACKED))
|
||||
size1 = get_sdr_cs_size(CS1);
|
||||
|
||||
gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
|
||||
gd->bd->bi_dram[0].size = size0;
|
||||
gd->bd->bi_dram[1].start = PHYS_SDRAM_1 + get_sdr_cs_offset(CS1);
|
||||
gd->bd->bi_dram[1].size = size1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* mem_init() -
|
||||
* - Initialize memory subsystem
|
||||
*/
|
||||
void mem_init(void)
|
||||
{
|
||||
do_emif4_init();
|
||||
}
|
||||
@@ -79,26 +79,6 @@ static const u32 gpmc_onenand[GPMC_MAX_REG] = {
|
||||
|
||||
#endif
|
||||
|
||||
static struct sdrc *sdrc_base = (struct sdrc *)OMAP34XX_SDRC_BASE;
|
||||
|
||||
/**************************************************************************
|
||||
* make_cs1_contiguous() - for es2 and above remap cs1 behind cs0 to allow
|
||||
* command line mem=xyz use all memory with out discontinuous support
|
||||
* compiled in. Could do it at the ATAG, but there really is two banks...
|
||||
* Called as part of 2nd phase DDR init.
|
||||
**************************************************************************/
|
||||
void make_cs1_contiguous(void)
|
||||
{
|
||||
u32 size, a_add_low, a_add_high;
|
||||
|
||||
size = get_sdr_cs_size(CS0);
|
||||
size >>= 25; /* divide by 32 MiB to find size to offset CS1 */
|
||||
a_add_high = (size & 3) << 8; /* set up low field */
|
||||
a_add_low = (size & 0x3C) >> 2; /* set up high field */
|
||||
writel((a_add_high | a_add_low), &sdrc_base->cs_cfg);
|
||||
|
||||
}
|
||||
|
||||
/********************************************************
|
||||
* mem_ok() - test used to see if timings are correct
|
||||
* for a part. Helps in guessing which part
|
||||
@@ -123,76 +103,6 @@ u32 mem_ok(u32 cs)
|
||||
return 1;
|
||||
}
|
||||
|
||||
/********************************************************
|
||||
* sdrc_init() - init the sdrc chip selects CS0 and CS1
|
||||
* - early init routines, called from flash or
|
||||
* SRAM.
|
||||
*******************************************************/
|
||||
void sdrc_init(void)
|
||||
{
|
||||
/* only init up first bank here */
|
||||
do_sdrc_init(CS0, EARLY_INIT);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* do_sdrc_init(): initialize the SDRAM for use.
|
||||
* -code sets up SDRAM basic SDRC timings for CS0
|
||||
* -optimal settings can be placed here, or redone after i2c
|
||||
* inspection of board info
|
||||
*
|
||||
* - code called once in C-Stack only context for CS0 and a possible 2nd
|
||||
* time depending on memory configuration from stack+global context
|
||||
**************************************************************************/
|
||||
|
||||
void do_sdrc_init(u32 cs, u32 early)
|
||||
{
|
||||
struct sdrc_actim *sdrc_actim_base;
|
||||
|
||||
if(cs)
|
||||
sdrc_actim_base = (struct sdrc_actim *)SDRC_ACTIM_CTRL1_BASE;
|
||||
else
|
||||
sdrc_actim_base = (struct sdrc_actim *)SDRC_ACTIM_CTRL0_BASE;
|
||||
|
||||
if (early) {
|
||||
/* reset sdrc controller */
|
||||
writel(SOFTRESET, &sdrc_base->sysconfig);
|
||||
wait_on_value(RESETDONE, RESETDONE, &sdrc_base->status,
|
||||
12000000);
|
||||
writel(0, &sdrc_base->sysconfig);
|
||||
|
||||
/* setup sdrc to ball mux */
|
||||
writel(SDRC_SHARING, &sdrc_base->sharing);
|
||||
|
||||
/* Disable Power Down of CKE cuz of 1 CKE on combo part */
|
||||
writel(WAKEUPPROC | PWDNEN | SRFRONRESET | PAGEPOLICY_HIGH,
|
||||
&sdrc_base->power);
|
||||
|
||||
writel(ENADLL | DLLPHASE_90, &sdrc_base->dlla_ctrl);
|
||||
sdelay(0x20000);
|
||||
}
|
||||
|
||||
writel(RASWIDTH_13BITS | CASWIDTH_10BITS | ADDRMUXLEGACY |
|
||||
RAMSIZE_128 | BANKALLOCATION | B32NOT16 | B32NOT16 |
|
||||
DEEPPD | DDR_SDRAM, &sdrc_base->cs[cs].mcfg);
|
||||
writel(ARCV | ARE_ARCV_1, &sdrc_base->cs[cs].rfr_ctrl);
|
||||
writel(V_ACTIMA_165, &sdrc_actim_base->ctrla);
|
||||
writel(V_ACTIMB_165, &sdrc_actim_base->ctrlb);
|
||||
|
||||
writel(CMD_NOP, &sdrc_base ->cs[cs].manual);
|
||||
writel(CMD_PRECHARGE, &sdrc_base->cs[cs].manual);
|
||||
writel(CMD_AUTOREFRESH, &sdrc_base->cs[cs].manual);
|
||||
writel(CMD_AUTOREFRESH, &sdrc_base->cs[cs].manual);
|
||||
|
||||
/*
|
||||
* CAS latency 3, Write Burst = Read Burst, Serial Mode,
|
||||
* Burst length = 4
|
||||
*/
|
||||
writel(CASL3 | BURSTLENGTH4, &sdrc_base->cs[cs].mr);
|
||||
|
||||
if (!mem_ok(cs))
|
||||
writel(0, &sdrc_base->cs[cs].mcfg);
|
||||
}
|
||||
|
||||
void enable_gpmc_cs_config(const u32 *gpmc_config, struct gpmc_cs *cs, u32 base,
|
||||
u32 size)
|
||||
{
|
||||
|
||||
202
arch/arm/cpu/arm_cortexa8/omap3/sdrc.c
Normal file
202
arch/arm/cpu/arm_cortexa8/omap3/sdrc.c
Normal file
@@ -0,0 +1,202 @@
|
||||
/*
|
||||
* Functions related to OMAP3 SDRC.
|
||||
*
|
||||
* This file has been created after exctracting and consolidating
|
||||
* the SDRC related content from mem.c and board.c, also created
|
||||
* generic init function (mem_init).
|
||||
*
|
||||
* Copyright (C) 2004-2010
|
||||
* Texas Instruments Incorporated - http://www.ti.com/
|
||||
*
|
||||
* Author :
|
||||
* Vaibhav Hiremath <hvaibhav@ti.com>
|
||||
*
|
||||
* Original implementation by (mem.c, board.c) :
|
||||
* Sunil Kumar <sunilsaini05@gmail.com>
|
||||
* Shashi Ranjan <shashiranjanmca05@gmail.com>
|
||||
* Manikandan Pillai <mani.pillai@ti.com>
|
||||
*
|
||||
* 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>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch/mem.h>
|
||||
#include <asm/arch/sys_proto.h>
|
||||
|
||||
extern omap3_sysinfo sysinfo;
|
||||
|
||||
static struct sdrc *sdrc_base = (struct sdrc *)OMAP34XX_SDRC_BASE;
|
||||
|
||||
/*
|
||||
* is_mem_sdr -
|
||||
* - Return 1 if mem type in use is SDR
|
||||
*/
|
||||
u32 is_mem_sdr(void)
|
||||
{
|
||||
if (readl(&sdrc_base->cs[CS0].mr) == SDRC_MR_0_SDR)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* make_cs1_contiguous -
|
||||
* - For es2 and above remap cs1 behind cs0 to allow command line
|
||||
* mem=xyz use all memory with out discontinuous support compiled in.
|
||||
* Could do it at the ATAG, but there really is two banks...
|
||||
* - Called as part of 2nd phase DDR init.
|
||||
*/
|
||||
void make_cs1_contiguous(void)
|
||||
{
|
||||
u32 size, a_add_low, a_add_high;
|
||||
|
||||
size = get_sdr_cs_size(CS0);
|
||||
size >>= 25; /* divide by 32 MiB to find size to offset CS1 */
|
||||
a_add_high = (size & 3) << 8; /* set up low field */
|
||||
a_add_low = (size & 0x3C) >> 2; /* set up high field */
|
||||
writel((a_add_high | a_add_low), &sdrc_base->cs_cfg);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* get_sdr_cs_size -
|
||||
* - Get size of chip select 0/1
|
||||
*/
|
||||
u32 get_sdr_cs_size(u32 cs)
|
||||
{
|
||||
u32 size;
|
||||
|
||||
/* get ram size field */
|
||||
size = readl(&sdrc_base->cs[cs].mcfg) >> 8;
|
||||
size &= 0x3FF; /* remove unwanted bits */
|
||||
size <<= 21; /* multiply by 2 MiB to find size in MB */
|
||||
return size;
|
||||
}
|
||||
|
||||
/*
|
||||
* get_sdr_cs_offset -
|
||||
* - Get offset of cs from cs0 start
|
||||
*/
|
||||
u32 get_sdr_cs_offset(u32 cs)
|
||||
{
|
||||
u32 offset;
|
||||
|
||||
if (!cs)
|
||||
return 0;
|
||||
|
||||
offset = readl(&sdrc_base->cs_cfg);
|
||||
offset = (offset & 15) << 27 | (offset & 0x30) >> 17;
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
||||
/*
|
||||
* do_sdrc_init -
|
||||
* - Initialize the SDRAM for use.
|
||||
* - Sets up SDRC timings for CS0
|
||||
* - code called once in C-Stack only context for CS0 and a possible 2nd
|
||||
* time depending on memory configuration from stack+global context
|
||||
*/
|
||||
void do_sdrc_init(u32 cs, u32 early)
|
||||
{
|
||||
struct sdrc_actim *sdrc_actim_base;
|
||||
|
||||
if (cs)
|
||||
sdrc_actim_base = (struct sdrc_actim *)SDRC_ACTIM_CTRL1_BASE;
|
||||
else
|
||||
sdrc_actim_base = (struct sdrc_actim *)SDRC_ACTIM_CTRL0_BASE;
|
||||
|
||||
if (early) {
|
||||
/* reset sdrc controller */
|
||||
writel(SOFTRESET, &sdrc_base->sysconfig);
|
||||
wait_on_value(RESETDONE, RESETDONE, &sdrc_base->status,
|
||||
12000000);
|
||||
writel(0, &sdrc_base->sysconfig);
|
||||
|
||||
/* setup sdrc to ball mux */
|
||||
writel(SDRC_SHARING, &sdrc_base->sharing);
|
||||
|
||||
/* Disable Power Down of CKE cuz of 1 CKE on combo part */
|
||||
writel(WAKEUPPROC | SRFRONRESET | PAGEPOLICY_HIGH,
|
||||
&sdrc_base->power);
|
||||
|
||||
writel(ENADLL | DLLPHASE_90, &sdrc_base->dlla_ctrl);
|
||||
sdelay(0x20000);
|
||||
}
|
||||
|
||||
writel(RASWIDTH_13BITS | CASWIDTH_10BITS | ADDRMUXLEGACY |
|
||||
RAMSIZE_128 | BANKALLOCATION | B32NOT16 | B32NOT16 |
|
||||
DEEPPD | DDR_SDRAM, &sdrc_base->cs[cs].mcfg);
|
||||
writel(ARCV | ARE_ARCV_1, &sdrc_base->cs[cs].rfr_ctrl);
|
||||
writel(V_ACTIMA_165, &sdrc_actim_base->ctrla);
|
||||
writel(V_ACTIMB_165, &sdrc_actim_base->ctrlb);
|
||||
|
||||
writel(CMD_NOP, &sdrc_base->cs[cs].manual);
|
||||
writel(CMD_PRECHARGE, &sdrc_base->cs[cs].manual);
|
||||
writel(CMD_AUTOREFRESH, &sdrc_base->cs[cs].manual);
|
||||
writel(CMD_AUTOREFRESH, &sdrc_base->cs[cs].manual);
|
||||
|
||||
/*
|
||||
* CAS latency 3, Write Burst = Read Burst, Serial Mode,
|
||||
* Burst length = 4
|
||||
*/
|
||||
writel(CASL3 | BURSTLENGTH4, &sdrc_base->cs[cs].mr);
|
||||
|
||||
if (!mem_ok(cs))
|
||||
writel(0, &sdrc_base->cs[cs].mcfg);
|
||||
}
|
||||
|
||||
/*
|
||||
* dram_init -
|
||||
* - Sets uboots idea of sdram size
|
||||
*/
|
||||
int dram_init(void)
|
||||
{
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
unsigned int size0 = 0, size1 = 0;
|
||||
|
||||
size0 = get_sdr_cs_size(CS0);
|
||||
/*
|
||||
* If a second bank of DDR is attached to CS1 this is
|
||||
* where it can be started. Early init code will init
|
||||
* memory on CS0.
|
||||
*/
|
||||
if ((sysinfo.mtype == DDR_COMBO) || (sysinfo.mtype == DDR_STACKED)) {
|
||||
do_sdrc_init(CS1, NOT_EARLY);
|
||||
make_cs1_contiguous();
|
||||
|
||||
size1 = get_sdr_cs_size(CS1);
|
||||
}
|
||||
|
||||
gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
|
||||
gd->bd->bi_dram[0].size = size0;
|
||||
gd->bd->bi_dram[1].start = PHYS_SDRAM_1 + get_sdr_cs_offset(CS1);
|
||||
gd->bd->bi_dram[1].size = size1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* mem_init -
|
||||
* - Init the sdrc chip,
|
||||
* - Selects CS0 and CS1,
|
||||
*/
|
||||
void mem_init(void)
|
||||
{
|
||||
/* only init up first bank here */
|
||||
do_sdrc_init(CS0, EARLY_INIT);
|
||||
}
|
||||
@@ -32,7 +32,6 @@
|
||||
#include <i2c.h>
|
||||
|
||||
extern omap3_sysinfo sysinfo;
|
||||
static struct sdrc *sdrc_base = (struct sdrc *)OMAP34XX_SDRC_BASE;
|
||||
static struct ctrl *ctrl_base = (struct ctrl *)OMAP34XX_CTRL_BASE;
|
||||
static char *rev_s[CPU_3XX_MAX_REV] = {
|
||||
"1.0",
|
||||
@@ -104,46 +103,6 @@ u32 get_cpu_rev(void)
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************
|
||||
* is_mem_sdr() - return 1 if mem type in use is SDR
|
||||
****************************************************/
|
||||
u32 is_mem_sdr(void)
|
||||
{
|
||||
if (readl(&sdrc_base->cs[CS0].mr) == SDRC_MR_0_SDR)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* get_cs0_size() - get size of chip select 0/1
|
||||
************************************************************************/
|
||||
u32 get_sdr_cs_size(u32 cs)
|
||||
{
|
||||
u32 size;
|
||||
|
||||
/* get ram size field */
|
||||
size = readl(&sdrc_base->cs[cs].mcfg) >> 8;
|
||||
size &= 0x3FF; /* remove unwanted bits */
|
||||
size <<= 21; /* multiply by 2 MiB to find size in MB */
|
||||
return size;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* get_sdr_cs_offset() - get offset of cs from cs0 start
|
||||
************************************************************************/
|
||||
u32 get_sdr_cs_offset(u32 cs)
|
||||
{
|
||||
u32 offset;
|
||||
|
||||
if (!cs)
|
||||
return 0;
|
||||
|
||||
offset = readl(&sdrc_base->cs_cfg);
|
||||
offset = (offset & 15) << 27 | (offset & 0x30) >> 17;
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
* get_gpmc0_base() - Return current address hardware will be
|
||||
* fetching from. The below effectively gives what is correct, its a bit
|
||||
|
||||
@@ -164,7 +164,7 @@ stack_setup:
|
||||
sub r0, r0, #(CONFIG_STACKSIZE_IRQ + CONFIG_STACKSIZE_FIQ)
|
||||
#endif
|
||||
sub sp, r0, #12 @ leave 3 words for abort-stack
|
||||
and sp, sp, #~7 @ 8 byte alinged for (ldr/str)d
|
||||
bic sp, sp, #7 @ 8-byte alignment for ABI compliance
|
||||
|
||||
/* Clear BSS (if any). Is below tx (watch load addr - need space) */
|
||||
clear_bss:
|
||||
|
||||
@@ -161,6 +161,7 @@ stack_setup:
|
||||
sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
|
||||
#endif
|
||||
sub sp, r0, #12 /* leave 3 words for abort-stack */
|
||||
bic sp, sp, #7 /* 8-byte alignment for ABI compliance */
|
||||
|
||||
clear_bss:
|
||||
ldr r0, _bss_start /* find start of bss segment */
|
||||
|
||||
@@ -289,6 +289,7 @@ stack_setup:
|
||||
sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
|
||||
#endif
|
||||
sub sp, r0, #12 /* leave 3 words for abort-stack */
|
||||
bic sp, sp, #7 /* 8-byte alignment for ABI compliance */
|
||||
|
||||
clear_bss:
|
||||
ldr r0, _bss_start /* find start of bss segment */
|
||||
|
||||
@@ -178,6 +178,7 @@ stack_setup:
|
||||
sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
|
||||
#endif
|
||||
sub sp, r0, #12 /* leave 3 words for abort-stack */
|
||||
bic sp, sp, #7 /* 8-byte alignment for ABI compliance */
|
||||
|
||||
clear_bss:
|
||||
ldr r0, _bss_start /* find start of bss segment */
|
||||
|
||||
@@ -141,6 +141,7 @@ stack_setup:
|
||||
sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
|
||||
#endif /* CONFIG_USE_IRQ */
|
||||
sub sp, r0, #12 /* leave 3 words for abort-stack */
|
||||
bic sp, sp, #7 /* 8-byte alignment for ABI compliance */
|
||||
|
||||
clear_bss:
|
||||
ldr r0, _bss_start /* find start of bss segment */
|
||||
|
||||
@@ -163,6 +163,7 @@ stack_setup:
|
||||
sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
|
||||
#endif
|
||||
sub sp, r0, #12 /* leave 3 words for abort-stack */
|
||||
bic sp, sp, #7 /* 8-byte alignment for ABI compliance */
|
||||
|
||||
ldr pc, _start_armboot
|
||||
|
||||
|
||||
@@ -153,6 +153,7 @@ stack_setup:
|
||||
sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
|
||||
#endif
|
||||
sub sp, r0, #12 /* leave 3 words for abort-stack */
|
||||
bic sp, sp, #7 /* 8-byte alignment for ABI compliance */
|
||||
|
||||
clear_bss:
|
||||
ldr r0, _bss_start /* find start of bss segment */
|
||||
|
||||
@@ -398,6 +398,7 @@ struct davinci_syscfg_regs {
|
||||
#define DAVINCI_SYSCFG_SUSPSRC_EMAC (1 << 5)
|
||||
#define DAVINCI_SYSCFG_SUSPSRC_I2C (1 << 16)
|
||||
#define DAVINCI_SYSCFG_SUSPSRC_SPI0 (1 << 21)
|
||||
#define DAVINCI_SYSCFG_SUSPSRC_SPI1 (1 << 22)
|
||||
#define DAVINCI_SYSCFG_SUSPSRC_UART2 (1 << 20)
|
||||
#define DAVINCI_SYSCFG_SUSPSRC_TIMER0 (1 << 27)
|
||||
|
||||
|
||||
@@ -215,6 +215,31 @@ struct sdrc {
|
||||
u8 res4[0xC];
|
||||
struct sdrc_cs cs[2]; /* 0x80 || 0xB0 */
|
||||
};
|
||||
|
||||
/* EMIF4 */
|
||||
typedef struct emif4 {
|
||||
unsigned int sdram_sts;
|
||||
unsigned int sdram_config;
|
||||
unsigned int res1;
|
||||
unsigned int sdram_refresh_ctrl;
|
||||
unsigned int sdram_refresh_ctrl_shdw;
|
||||
unsigned int sdram_time1;
|
||||
unsigned int sdram_time1_shdw;
|
||||
unsigned int sdram_time2;
|
||||
unsigned int sdram_time2_shdw;
|
||||
unsigned int sdram_time3;
|
||||
unsigned int sdram_time3_shdw;
|
||||
unsigned char res2[8];
|
||||
unsigned int sdram_pwr_mgmt;
|
||||
unsigned int sdram_pwr_mgmt_shdw;
|
||||
unsigned char res3[32];
|
||||
unsigned int sdram_iodft_tlgc;
|
||||
unsigned char res4[128];
|
||||
unsigned int ddr_phyctrl1;
|
||||
unsigned int ddr_phyctrl1_shdw;
|
||||
unsigned int ddr_phyctrl2;
|
||||
} emif4_t;
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __KERNEL_STRICT_NAMES */
|
||||
|
||||
|
||||
79
arch/arm/include/asm/arch-omap3/emif4.h
Normal file
79
arch/arm/include/asm/arch-omap3/emif4.h
Normal file
@@ -0,0 +1,79 @@
|
||||
/*
|
||||
* Auther:
|
||||
* Vaibhav Hiremath <hvaibhav@ti.com>
|
||||
*
|
||||
* Copyright (C) 2010
|
||||
* Texas Instruments Incorporated - http://www.ti.com/
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef _EMIF_H_
|
||||
#define _EMIF_H_
|
||||
|
||||
/*
|
||||
* Configuration values
|
||||
*/
|
||||
#define EMIF4_TIM1_T_RP (0x3 << 25)
|
||||
#define EMIF4_TIM1_T_RCD (0x3 << 21)
|
||||
#define EMIF4_TIM1_T_WR (0x3 << 17)
|
||||
#define EMIF4_TIM1_T_RAS (0x8 << 12)
|
||||
#define EMIF4_TIM1_T_RC (0xA << 6)
|
||||
#define EMIF4_TIM1_T_RRD (0x2 << 3)
|
||||
#define EMIF4_TIM1_T_WTR (0x2)
|
||||
|
||||
#define EMIF4_TIM2_T_XP (0x2 << 28)
|
||||
#define EMIF4_TIM2_T_ODT (0x0 << 25)
|
||||
#define EMIF4_TIM2_T_XSNR (0x1C << 16)
|
||||
#define EMIF4_TIM2_T_XSRD (0xC8 << 6)
|
||||
#define EMIF4_TIM2_T_RTP (0x1 << 3)
|
||||
#define EMIF4_TIM2_T_CKE (0x2)
|
||||
|
||||
#define EMIF4_TIM3_T_RFC (0x25 << 4)
|
||||
#define EMIF4_TIM3_T_RAS_MAX (0x7)
|
||||
|
||||
#define EMIF4_PWR_IDLE_MODE (0x2 << 30)
|
||||
#define EMIF4_PWR_DPD_DIS (0x0 << 10)
|
||||
#define EMIF4_PWR_DPD_EN (0x1 << 10)
|
||||
#define EMIF4_PWR_LP_MODE (0x0 << 8)
|
||||
#define EMIF4_PWR_PM_TIM (0x0)
|
||||
|
||||
#define EMIF4_INITREF_DIS (0x0 << 31)
|
||||
#define EMIF4_REFRESH_RATE (0x50F)
|
||||
|
||||
#define EMIF4_CFG_SDRAM_TYP (0x2 << 29)
|
||||
#define EMIF4_CFG_IBANK_POS (0x0 << 27)
|
||||
#define EMIF4_CFG_DDR_TERM (0x0 << 24)
|
||||
#define EMIF4_CFG_DDR2_DDQS (0x1 << 23)
|
||||
#define EMIF4_CFG_DDR_DIS_DLL (0x0 << 20)
|
||||
#define EMIF4_CFG_SDR_DRV (0x0 << 18)
|
||||
#define EMIF4_CFG_NARROW_MD (0x0 << 14)
|
||||
#define EMIF4_CFG_CL (0x5 << 10)
|
||||
#define EMIF4_CFG_ROWSIZE (0x0 << 7)
|
||||
#define EMIF4_CFG_IBANK (0x3 << 4)
|
||||
#define EMIF4_CFG_EBANK (0x0 << 3)
|
||||
#define EMIF4_CFG_PGSIZE (0x2)
|
||||
|
||||
/*
|
||||
* EMIF4 PHY Control 1 register configuration
|
||||
*/
|
||||
#define EMIF4_DDR1_EXT_STRB_EN (0x1 << 7)
|
||||
#define EMIF4_DDR1_EXT_STRB_DIS (0x0 << 7)
|
||||
#define EMIF4_DDR1_PWRDN_DIS (0x0 << 6)
|
||||
#define EMIF4_DDR1_PWRDN_EN (0x1 << 6)
|
||||
#define EMIF4_DDR1_READ_LAT (0x6 << 0)
|
||||
|
||||
#endif /* endif _EMIF_H_ */
|
||||
@@ -270,4 +270,17 @@ enum {
|
||||
#define PISMO1_ONEN_BASE ONENAND_MAP
|
||||
#define DBG_MPDB_BASE DEBUG_BASE
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
/* Function prototypes */
|
||||
void mem_init(void);
|
||||
|
||||
u32 is_mem_sdr(void);
|
||||
u32 mem_ok(u32 cs);
|
||||
|
||||
u32 get_sdr_cs_size(u32);
|
||||
u32 get_sdr_cs_offset(u32);
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#endif /* endif _MEM_H_ */
|
||||
|
||||
@@ -33,6 +33,7 @@ void per_clocks_enable(void);
|
||||
void memif_init(void);
|
||||
void sdrc_init(void);
|
||||
void do_sdrc_init(u32, u32);
|
||||
void emif4_init(void);
|
||||
void gpmc_init(void);
|
||||
void enable_gpmc_cs_config(const u32 *gpmc_config, struct gpmc_cs *cs, u32 base,
|
||||
u32 size);
|
||||
@@ -46,8 +47,6 @@ u32 get_sysboot_value(void);
|
||||
u32 is_gpmc_muxed(void);
|
||||
u32 get_gpmc0_type(void);
|
||||
u32 get_gpmc0_width(void);
|
||||
u32 get_sdr_cs_size(u32);
|
||||
u32 get_sdr_cs_offset(u32);
|
||||
u32 is_running_in_sdram(void);
|
||||
u32 is_running_in_sram(void);
|
||||
u32 is_running_in_flash(void);
|
||||
|
||||
203
arch/arm/include/asm/arch-orion5x/cpu.h
Normal file
203
arch/arm/include/asm/arch-orion5x/cpu.h
Normal file
@@ -0,0 +1,203 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Albert ARIBAUD <albert.aribaud@free.fr>
|
||||
*
|
||||
* Based on original Kirorion5x_ood support which is
|
||||
* (C) Copyright 2009
|
||||
* Marvell Semiconductor <www.marvell.com>
|
||||
* Written-by: Prafulla Wadaskar <prafulla@marvell.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., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef _ORION5X_CPU_H
|
||||
#define _ORION5X_CPU_H
|
||||
|
||||
#include <asm/system.h>
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#define ORION5X_CPU_WIN_CTRL_DATA(size, target, attr, en) (en | (target << 4) \
|
||||
| (attr << 8) | (orion5x_winctrl_calcsize(size) << 16))
|
||||
|
||||
#define ORION5XGBE_PORT_SERIAL_CONTROL1_REG(_x) \
|
||||
((_x ? ORION5X_EGIGA0_BASE : ORION5X_EGIGA1_BASE) + 0x44c)
|
||||
|
||||
enum memory_bank {
|
||||
BANK0,
|
||||
BANK1,
|
||||
BANK2,
|
||||
BANK3
|
||||
};
|
||||
|
||||
enum orion5x_cpu_winen {
|
||||
ORION5X_WIN_DISABLE,
|
||||
ORION5X_WIN_ENABLE
|
||||
};
|
||||
|
||||
enum orion5x_cpu_target {
|
||||
ORION5X_TARGET_DRAM = 0,
|
||||
ORION5X_TARGET_DEVICE = 1,
|
||||
ORION5X_TARGET_PCI = 3,
|
||||
ORION5X_TARGET_PCIE = 4,
|
||||
ORION5X_TARGET_SASRAM = 9
|
||||
};
|
||||
|
||||
enum orion5x_cpu_attrib {
|
||||
ORION5X_ATTR_DRAM_CS0 = 0x0e,
|
||||
ORION5X_ATTR_DRAM_CS1 = 0x0d,
|
||||
ORION5X_ATTR_DRAM_CS2 = 0x0b,
|
||||
ORION5X_ATTR_DRAM_CS3 = 0x07,
|
||||
ORION5X_ATTR_PCI_MEM = 0x59,
|
||||
ORION5X_ATTR_PCI_IO = 0x51,
|
||||
ORION5X_ATTR_PCIE_MEM = 0x59,
|
||||
ORION5X_ATTR_PCIE_IO = 0x51,
|
||||
ORION5X_ATTR_SASRAM = 0x00,
|
||||
ORION5X_ATTR_DEV_CS0 = 0x1e,
|
||||
ORION5X_ATTR_DEV_CS1 = 0x1d,
|
||||
ORION5X_ATTR_DEV_CS2 = 0x1b,
|
||||
ORION5X_ATTR_BOOTROM = 0x0f
|
||||
};
|
||||
|
||||
/*
|
||||
* Default Device Address MAP BAR values
|
||||
*/
|
||||
#define ORION5X_DEFADR_PCIE_MEM 0x90000000
|
||||
#define ORION5X_DEFADR_PCIE_MEM_REMAP_LO 0x90000000
|
||||
#define ORION5X_DEFADR_PCIE_MEM_REMAP_HI 0
|
||||
#define ORION5X_DEFSZ_PCIE_MEM (128*1024*1024)
|
||||
|
||||
#define ORION5X_DEFADR_PCIE_IO 0xf0000000
|
||||
#define ORION5X_DEFADR_PCIE_IO_REMAP_LO 0x90000000
|
||||
#define ORION5X_DEFADR_PCIE_IO_REMAP_HI 0
|
||||
#define ORION5X_DEFSZ_PCIE_IO (64*1024)
|
||||
|
||||
#define ORION5X_DEFADR_PCI_MEM 0x98000000
|
||||
#define ORION5X_DEFSZ_PCI_MEM (128*1024*1024)
|
||||
|
||||
#define ORION5X_DEFADR_PCI_IO 0xf0100000
|
||||
#define ORION5X_DEFSZ_PCI_IO (64*1024)
|
||||
|
||||
#define ORION5X_DEFADR_DEV_CS0 0xfa000000
|
||||
#define ORION5X_DEFSZ_DEV_CS0 (2*1024*1024)
|
||||
|
||||
#define ORION5X_DEFADR_DEV_CS1 0xf8000000
|
||||
#define ORION5X_DEFSZ_DEV_CS1 (32*1024*1024)
|
||||
|
||||
#define ORION5X_DEFADR_DEV_CS2 0xfa800000
|
||||
#define ORION5X_DEFSZ_DEV_CS2 (1*1024*1024)
|
||||
|
||||
#define ORION5X_DEFADR_BOOTROM 0xFFF80000
|
||||
#define ORION5X_DEFSZ_BOOTROM (512*1024)
|
||||
|
||||
/*
|
||||
* PCIE registers are used for SoC device ID and revision
|
||||
*/
|
||||
#define PCIE_DEV_ID_OFF (ORION5X_REG_PCIE_BASE + 0x0000)
|
||||
#define PCIE_DEV_REV_OFF (ORION5X_REG_PCIE_BASE + 0x0008)
|
||||
|
||||
/*
|
||||
* The following definitions are intended for identifying
|
||||
* the real device and revision on which u-boot is running
|
||||
* even if it was compiled only for a specific one. Thus,
|
||||
* these constants must not be considered chip-specific.
|
||||
*/
|
||||
|
||||
/* Orion-1 (88F5181) and Orion-VoIP (88F5181L) */
|
||||
#define MV88F5181_DEV_ID 0x5181
|
||||
#define MV88F5181_REV_B1 3
|
||||
#define MV88F5181L_REV_A0 8
|
||||
#define MV88F5181L_REV_A1 9
|
||||
/* Orion-NAS (88F5182) */
|
||||
#define MV88F5182_DEV_ID 0x5182
|
||||
#define MV88F5182_REV_A2 2
|
||||
/* Orion-2 (88F5281) */
|
||||
#define MV88F5281_DEV_ID 0x5281
|
||||
#define MV88F5281_REV_D0 4
|
||||
#define MV88F5281_REV_D1 5
|
||||
#define MV88F5281_REV_D2 6
|
||||
/* Orion-1-90 (88F6183) */
|
||||
#define MV88F6183_DEV_ID 0x6183
|
||||
#define MV88F6183_REV_B0 3
|
||||
|
||||
/*
|
||||
* read feroceon core extra feature register
|
||||
* using co-proc instruction
|
||||
*/
|
||||
static inline unsigned int readfr_extra_feature_reg(void)
|
||||
{
|
||||
unsigned int val;
|
||||
asm volatile ("mrc p15, 1, %0, c15, c1, 0 @ readfr exfr" : "=r"
|
||||
(val) : : "cc");
|
||||
return val;
|
||||
}
|
||||
|
||||
/*
|
||||
* write feroceon core extra feature register
|
||||
* using co-proc instruction
|
||||
*/
|
||||
static inline void writefr_extra_feature_reg(unsigned int val)
|
||||
{
|
||||
asm volatile ("mcr p15, 1, %0, c15, c1, 0 @ writefr exfr" : : "r"
|
||||
(val) : "cc");
|
||||
isb();
|
||||
}
|
||||
|
||||
/*
|
||||
* AHB to Mbus Bridge Registers
|
||||
* Source: 88F5182 User Manual, Appendix A, section A.4
|
||||
* Note: only windows 0 and 1 have remap capability.
|
||||
*/
|
||||
struct orion5x_win_registers {
|
||||
u32 ctrl;
|
||||
u32 base;
|
||||
u32 remap_lo;
|
||||
u32 remap_hi;
|
||||
};
|
||||
|
||||
/*
|
||||
* CPU control and status Registers
|
||||
* Source: 88F5182 User Manual, Appendix A, section A.4
|
||||
*/
|
||||
struct orion5x_cpu_registers {
|
||||
u32 config; /*0x20100 */
|
||||
u32 ctrl_stat; /*0x20104 */
|
||||
u32 rstoutn_mask; /* 0x20108 */
|
||||
u32 sys_soft_rst; /* 0x2010C */
|
||||
u32 ahb_mbus_cause_irq; /* 0x20110 */
|
||||
u32 ahb_mbus_mask_irq; /* 0x20114 */
|
||||
};
|
||||
|
||||
/*
|
||||
* DDR SDRAM Controller Address Decode Registers
|
||||
* Source: 88F5182 User Manual, Appendix A, section A.5.1
|
||||
*/
|
||||
struct orion5x_ddr_addr_decode_registers {
|
||||
u32 base;
|
||||
u32 size;
|
||||
};
|
||||
|
||||
/*
|
||||
* functions
|
||||
*/
|
||||
void reset_cpu(unsigned long ignored);
|
||||
u32 orion5x_device_id(void);
|
||||
u32 orion5x_device_rev(void);
|
||||
unsigned int orion5x_winctrl_calcsize(unsigned int sizeval);
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* _ORION5X_CPU_H */
|
||||
40
arch/arm/include/asm/arch-orion5x/mv88f5182.h
Normal file
40
arch/arm/include/asm/arch-orion5x/mv88f5182.h
Normal file
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Albert ARIBAUD <albert.aribaud@free.fr>
|
||||
*
|
||||
* Based on original Kirkwood 88F6182 support which is
|
||||
* (C) Copyright 2009
|
||||
* Marvell Semiconductor <www.marvell.com>
|
||||
* Written-by: Prafulla Wadaskar <prafulla@marvell.com>
|
||||
*
|
||||
* Header file for Feroceon CPU core 88F5182 SOC.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef _CONFIG_88F5182_H
|
||||
#define _CONFIG_88F5182_H
|
||||
|
||||
/* SOC specific definitions */
|
||||
#define F88F5182_REGS_PHYS_BASE 0xf1000000
|
||||
#define ORION5X_REGS_PHY_BASE F88F5182_REGS_PHYS_BASE
|
||||
|
||||
/* TCLK Core Clock defination */
|
||||
#define CONFIG_SYS_TCLK 166000000 /* 166MHz */
|
||||
|
||||
#endif /* _CONFIG_88F5182_H */
|
||||
69
arch/arm/include/asm/arch-orion5x/orion5x.h
Normal file
69
arch/arm/include/asm/arch-orion5x/orion5x.h
Normal file
@@ -0,0 +1,69 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Albert ARIBAUD <albert.aribaud@free.fr>
|
||||
*
|
||||
* Based on original Kirkwood support which is
|
||||
* (C) Copyright 2009
|
||||
* Marvell Semiconductor <www.marvell.com>
|
||||
* Written-by: Prafulla Wadaskar <prafulla@marvell.com>
|
||||
*
|
||||
* Header file for Marvell's Orion SoC with Feroceon CPU core.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef _ASM_ARCH_ORION5X_H
|
||||
#define _ASM_ARCH_ORION5X_H
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#include <asm/types.h>
|
||||
#include <asm/io.h>
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#if defined(CONFIG_FEROCEON)
|
||||
#include <asm/arch/cpu.h>
|
||||
|
||||
/* SOC specific definations */
|
||||
#define ORION5X_REGISTER(x) (ORION5X_REGS_PHY_BASE + x)
|
||||
|
||||
/* Documented registers */
|
||||
#define ORION5X_TWSI_BASE (ORION5X_REGISTER(0x11000))
|
||||
#define ORION5X_UART0_BASE (ORION5X_REGISTER(0x12000))
|
||||
#define ORION5X_UART1_BASE (ORION5X_REGISTER(0x12100))
|
||||
#define ORION5X_MPP_BASE (ORION5X_REGISTER(0x10000))
|
||||
#define ORION5X_GPIO_BASE (ORION5X_REGISTER(0x10100))
|
||||
#define ORION5X_CPU_WIN_BASE (ORION5X_REGISTER(0x20000))
|
||||
#define ORION5X_CPU_REG_BASE (ORION5X_REGISTER(0x20100))
|
||||
#define ORION5X_TIMER_BASE (ORION5X_REGISTER(0x20300))
|
||||
#define ORION5X_REG_PCI_BASE (ORION5X_REGISTER(0x30000))
|
||||
#define ORION5X_REG_PCIE_BASE (ORION5X_REGISTER(0x40000))
|
||||
#define ORION5X_USB20_PORT0_BASE (ORION5X_REGISTER(0x50000))
|
||||
#define ORION5X_USB20_PORT1_BASE (ORION5X_REGISTER(0xA0000))
|
||||
#define ORION5X_EGIGA_BASE (ORION5X_REGISTER(0x72000))
|
||||
|
||||
#define CONFIG_MAX_RAM_BANK_SIZE (64*1024*1024)
|
||||
|
||||
/* include here SoC variants. 5181, 5281, 6183 should go here when
|
||||
adding support for them, and this comment should then be updated. */
|
||||
#if defined(CONFIG_88F5182)
|
||||
#include <asm/arch/mv88f5182.h>
|
||||
#else
|
||||
#error "SOC Name not defined"
|
||||
#endif
|
||||
#endif /* CONFIG_FEROCEON */
|
||||
#endif /* _ASM_ARCH_ORION5X_H */
|
||||
68
arch/arm/include/asm/arch-tnetv107x/clock.h
Normal file
68
arch/arm/include/asm/arch-tnetv107x/clock.h
Normal file
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
* TNETV107X: Clock APIs
|
||||
*
|
||||
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_CLOCK_H
|
||||
#define __ASM_ARCH_CLOCK_H
|
||||
|
||||
#define PSC_MDCTL_NEXT_SWRSTDISABLE 0x0
|
||||
#define PSC_MDCTL_NEXT_SYNCRST 0x1
|
||||
#define PSC_MDCTL_NEXT_DISABLE 0x2
|
||||
#define PSC_MDCTL_NEXT_ENABLE 0x3
|
||||
|
||||
#define CONFIG_SYS_INT_OSC_FREQ 24000000
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
/* PLL identifiers */
|
||||
enum pll_type_e {
|
||||
SYS_PLL,
|
||||
TDM_PLL,
|
||||
ETH_PLL
|
||||
};
|
||||
|
||||
/* PLL configuration data */
|
||||
struct pll_init_data {
|
||||
int pll;
|
||||
int internal_osc;
|
||||
unsigned long pll_freq;
|
||||
unsigned long div_freq[10];
|
||||
};
|
||||
|
||||
void init_plls(int num_pll, struct pll_init_data *config);
|
||||
int lpsc_status(unsigned int mod);
|
||||
void lpsc_control(int mod, unsigned long state, int lrstz);
|
||||
unsigned long clk_get_rate(unsigned int clk);
|
||||
unsigned long clk_round_rate(unsigned int clk, unsigned long hz);
|
||||
int clk_set_rate(unsigned int clk, unsigned long hz);
|
||||
|
||||
static inline void clk_enable(unsigned int mod)
|
||||
{
|
||||
lpsc_control(mod, PSC_MDCTL_NEXT_ENABLE, -1);
|
||||
}
|
||||
|
||||
static inline void clk_disable(unsigned int mod)
|
||||
{
|
||||
lpsc_control(mod, PSC_MDCTL_NEXT_DISABLE, -1);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
1
arch/arm/include/asm/arch-tnetv107x/emif_defs.h
Normal file
1
arch/arm/include/asm/arch-tnetv107x/emif_defs.h
Normal file
@@ -0,0 +1 @@
|
||||
#include <asm/arch-davinci/emif_defs.h>
|
||||
173
arch/arm/include/asm/arch-tnetv107x/hardware.h
Normal file
173
arch/arm/include/asm/arch-tnetv107x/hardware.h
Normal file
@@ -0,0 +1,173 @@
|
||||
/*
|
||||
* TNETV107X: Hardware information
|
||||
*
|
||||
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_HARDWARE_H
|
||||
#define __ASM_ARCH_HARDWARE_H
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#include <asm/sizes.h>
|
||||
|
||||
#define ASYNC_EMIF_NUM_CS 4
|
||||
#define ASYNC_EMIF_MODE_NOR 0
|
||||
#define ASYNC_EMIF_MODE_NAND 1
|
||||
#define ASYNC_EMIF_MODE_ONENAND 2
|
||||
#define ASYNC_EMIF_PRESERVE -1
|
||||
|
||||
struct async_emif_config {
|
||||
unsigned mode;
|
||||
unsigned select_strobe;
|
||||
unsigned extend_wait;
|
||||
unsigned wr_setup;
|
||||
unsigned wr_strobe;
|
||||
unsigned wr_hold;
|
||||
unsigned rd_setup;
|
||||
unsigned rd_strobe;
|
||||
unsigned rd_hold;
|
||||
unsigned turn_around;
|
||||
enum {
|
||||
ASYNC_EMIF_8 = 0,
|
||||
ASYNC_EMIF_16 = 1,
|
||||
ASYNC_EMIF_32 = 2,
|
||||
} width;
|
||||
};
|
||||
|
||||
void init_async_emif(int num_cs, struct async_emif_config *config);
|
||||
|
||||
int wdt_start(unsigned long msecs);
|
||||
int wdt_stop(void);
|
||||
int wdt_kick(void);
|
||||
|
||||
#endif
|
||||
|
||||
/* Chip configuration unlock codes and registers */
|
||||
#define TNETV107X_KICK0 (TNETV107X_CHIP_CONFIG_SYS_BASE+0x38)
|
||||
#define TNETV107X_KICK1 (TNETV107X_CHIP_CONFIG_SYS_BASE+0x3c)
|
||||
#define TNETV107X_PINMUX(n) (TNETV107X_CHIP_CONFIG_SYS_BASE+0x150+(n)*4)
|
||||
#define TNETV107X_KICK0_MAGIC 0x83e70b13
|
||||
#define TNETV107X_KICK1_MAGIC 0x95a4f1e0
|
||||
|
||||
/* Module base addresses */
|
||||
#define TNETV107X_TPCC_BASE 0x01C00000
|
||||
#define TNETV107X_TPTC0_BASE 0x01C10000
|
||||
#define TNETV107X_TPTC1_BASE 0x01C10400
|
||||
#define TNETV107X_INTC_BASE 0x03000000
|
||||
#define TNETV107X_LCD_CONTROLLER_BASE 0x08030000
|
||||
#define TNETV107X_INTD_BASE 0x08038000
|
||||
#define TNETV107X_INTD_IPC_BASE 0x08038000
|
||||
#define TNETV107X_INTD_FAST_BASE 0x08039000
|
||||
#define TNETV107X_INTD_ASYNC_BASE 0x0803A000
|
||||
#define TNETV107X_INTD_SLOW_BASE 0x0803B000
|
||||
#define TNETV107X_PKA_BASE 0x08040000
|
||||
#define TNETV107X_RNG_BASE 0x08044000
|
||||
#define TNETV107X_TIMER0_BASE 0x08086500
|
||||
#define TNETV107X_TIMER1_BASE 0x08086600
|
||||
#define TNETV107X_WDT0_ARM_BASE 0x08086700
|
||||
#define TNETV107X_WDT1_DSP_BASE 0x08086800
|
||||
#define TNETV107X_CHIP_CONFIG_SYS_BASE 0x08087000
|
||||
#define TNETV107X_GPIO_BASE 0x08088000
|
||||
#define TNETV107X_UART1_BASE 0x08088400
|
||||
#define TNETV107X_TOUCHSCREEN_BASE 0x08088500
|
||||
#define TNETV107X_SDIO0_BASE 0x08088700
|
||||
#define TNETV107X_SDIO1_BASE 0x08088800
|
||||
#define TNETV107X_MDIO_BASE 0x08088900
|
||||
#define TNETV107X_KEYPAD_BASE 0x08088A00
|
||||
#define TNETV107X_SSP_BASE 0x08088C00
|
||||
#define TNETV107X_CLOCK_CONTROL_BASE 0x0808A000
|
||||
#define TNETV107X_PSC_BASE 0x0808B000
|
||||
#define TNETV107X_TDM0_BASE 0x08100000
|
||||
#define TNETV107X_TDM1_BASE 0x08100100
|
||||
#define TNETV107X_MCDMA_BASE 0x08108000
|
||||
#define TNETV107X_UART0_DMA_BASE 0x08108200
|
||||
#define TNETV107X_USBSS_BASE 0x08120000
|
||||
#define TNETV107X_VLYNQ_CONTROL_BASE 0x0810D000
|
||||
#define TNETV107X_ASYNC_EMIF_CNTRL_BASE 0x08200000
|
||||
#define TNETV107X_VLYNQ_MEM_MAP_BASE 0x0C000000
|
||||
#define TNETV107X_IMCOP_BASE 0x01CC0000
|
||||
#define TNETV107X_MBX_LITE_BASE 0x07000000
|
||||
#define TNETV107X_ETHSS_BASE 0x0803C000
|
||||
#define TNETV107X_CPSW_BASE 0x0803C000
|
||||
#define TNETV107X_SPF_BASE 0x0803C800
|
||||
#define TNETV107X_IOPU_ETHSS_BASE 0x0803D000
|
||||
#define TNETV107X_VTP_CNTRL_0 0x0803D800
|
||||
#define TNETV107X_VTP_CNTRL_1 0x0803D900
|
||||
#define TNETV107X_UART2_DMA_BASE 0x08108400
|
||||
#define TNETV107X_INTERNAL_MEMORY 0x20000000
|
||||
#define TNETV107X_ASYNC_EMIF_DATA_CE0_BASE 0x30000000
|
||||
#define TNETV107X_ASYNC_EMIF_DATA_CE1_BASE 0x40000000
|
||||
#define TNETV107X_ASYNC_EMIF_DATA_CE2_BASE 0x44000000
|
||||
#define TNETV107X_ASYNC_EMIF_DATA_CE3_BASE 0x48000000
|
||||
#define TNETV107X_DDR_EMIF_DATA_BASE 0x80000000
|
||||
#define TNETV107X_DDR_EMIF_CONTROL_BASE 0x90000000
|
||||
|
||||
/* LPSC module definitions */
|
||||
#define TNETV107X_LPSC_ARM 0
|
||||
#define TNETV107X_LPSC_GEM 1
|
||||
#define TNETV107X_LPSC_DDR2_PHY 2
|
||||
#define TNETV107X_LPSC_TPCC 3
|
||||
#define TNETV107X_LPSC_TPTC0 4
|
||||
#define TNETV107X_LPSC_TPTC1 5
|
||||
#define TNETV107X_LPSC_RAM 6
|
||||
#define TNETV107X_LPSC_MBX_LITE 7
|
||||
#define TNETV107X_LPSC_LCD 8
|
||||
#define TNETV107X_LPSC_ETHSS 9
|
||||
#define TNETV107X_LPSC_AEMIF 10
|
||||
#define TNETV107X_LPSC_CHIP_CFG 11
|
||||
#define TNETV107X_LPSC_TSC 12
|
||||
#define TNETV107X_LPSC_ROM 13
|
||||
#define TNETV107X_LPSC_UART2 14
|
||||
#define TNETV107X_LPSC_PKTSEC 15
|
||||
#define TNETV107X_LPSC_SECCTL 16
|
||||
#define TNETV107X_LPSC_KEYMGR 17
|
||||
#define TNETV107X_LPSC_KEYPAD 18
|
||||
#define TNETV107X_LPSC_GPIO 19
|
||||
#define TNETV107X_LPSC_MDIO 20
|
||||
#define TNETV107X_LPSC_SDIO0 21
|
||||
#define TNETV107X_LPSC_UART0 22
|
||||
#define TNETV107X_LPSC_UART1 23
|
||||
#define TNETV107X_LPSC_TIMER0 24
|
||||
#define TNETV107X_LPSC_TIMER1 25
|
||||
#define TNETV107X_LPSC_WDT_ARM 26
|
||||
#define TNETV107X_LPSC_WDT_DSP 27
|
||||
#define TNETV107X_LPSC_SSP 28
|
||||
#define TNETV107X_LPSC_TDM0 29
|
||||
#define TNETV107X_LPSC_VLYNQ 30
|
||||
#define TNETV107X_LPSC_MCDMA 31
|
||||
#define TNETV107X_LPSC_USB0 32
|
||||
#define TNETV107X_LPSC_TDM1 33
|
||||
#define TNETV107X_LPSC_DEBUGSS 34
|
||||
#define TNETV107X_LPSC_ETHSS_RGMII 35
|
||||
#define TNETV107X_LPSC_SYSTEM 36
|
||||
#define TNETV107X_LPSC_IMCOP 37
|
||||
#define TNETV107X_LPSC_SPARE 38
|
||||
#define TNETV107X_LPSC_SDIO1 39
|
||||
#define TNETV107X_LPSC_USB1 40
|
||||
#define TNETV107X_LPSC_USBSS 41
|
||||
#define TNETV107X_LPSC_DDR2_EMIF1_VRST 42
|
||||
#define TNETV107X_LPSC_DDR2_EMIF2_VCTL_RST 43
|
||||
#define TNETV107X_LPSC_MAX 44
|
||||
|
||||
/* Interrupt controller */
|
||||
#define INTC_GLB_EN (TNETV107X_INTC_BASE + 0x10)
|
||||
#define INTC_HINT_EN (TNETV107X_INTC_BASE + 0x1500)
|
||||
#define INTC_EN_CLR0 (TNETV107X_INTC_BASE + 0x380)
|
||||
|
||||
#endif /* __ASM_ARCH_HARDWARE_H */
|
||||
306
arch/arm/include/asm/arch-tnetv107x/mux.h
Normal file
306
arch/arm/include/asm/arch-tnetv107x/mux.h
Normal file
@@ -0,0 +1,306 @@
|
||||
/*
|
||||
* TNETV107X: Pinmux APIs
|
||||
*
|
||||
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_MUX_H
|
||||
#define __ASM_ARCH_MUX_H
|
||||
|
||||
struct pin_config {
|
||||
unsigned char reg_index;
|
||||
unsigned char mask_offset;
|
||||
unsigned char mode;
|
||||
};
|
||||
|
||||
#define TNETV107X_MUX_CFG(reg, offset, mux_mode) \
|
||||
{ reg, offset, mux_mode }
|
||||
|
||||
int mux_select_pin(short index);
|
||||
int mux_select_pins(const short *pins);
|
||||
|
||||
enum tnetv107x_pin_mux_index {
|
||||
TNETV107X_PIN_ASR_A00,
|
||||
TNETV107X_PIN_GPIO32,
|
||||
TNETV107X_PIN_ASR_A01,
|
||||
TNETV107X_PIN_GPIO33,
|
||||
TNETV107X_PIN_ASR_A02,
|
||||
TNETV107X_PIN_GPIO34,
|
||||
TNETV107X_PIN_ASR_A03,
|
||||
TNETV107X_PIN_GPIO35,
|
||||
TNETV107X_PIN_ASR_A04,
|
||||
TNETV107X_PIN_GPIO36,
|
||||
TNETV107X_PIN_ASR_A05,
|
||||
TNETV107X_PIN_GPIO37,
|
||||
TNETV107X_PIN_ASR_A06,
|
||||
TNETV107X_PIN_GPIO38,
|
||||
TNETV107X_PIN_ASR_A07,
|
||||
TNETV107X_PIN_GPIO39,
|
||||
TNETV107X_PIN_ASR_A08,
|
||||
TNETV107X_PIN_GPIO40,
|
||||
TNETV107X_PIN_ASR_A09,
|
||||
TNETV107X_PIN_GPIO41,
|
||||
TNETV107X_PIN_ASR_A10,
|
||||
TNETV107X_PIN_GPIO42,
|
||||
TNETV107X_PIN_ASR_A11,
|
||||
TNETV107X_PIN_BOOT_STRP_0,
|
||||
TNETV107X_PIN_ASR_A12,
|
||||
TNETV107X_PIN_BOOT_STRP_1,
|
||||
TNETV107X_PIN_ASR_A13,
|
||||
TNETV107X_PIN_GPIO43,
|
||||
TNETV107X_PIN_ASR_A14,
|
||||
TNETV107X_PIN_GPIO44,
|
||||
TNETV107X_PIN_ASR_A15,
|
||||
TNETV107X_PIN_GPIO45,
|
||||
TNETV107X_PIN_ASR_A16,
|
||||
TNETV107X_PIN_GPIO46,
|
||||
TNETV107X_PIN_ASR_A17,
|
||||
TNETV107X_PIN_GPIO47,
|
||||
TNETV107X_PIN_ASR_A18,
|
||||
TNETV107X_PIN_GPIO48,
|
||||
TNETV107X_PIN_SDIO1_DATA3_0,
|
||||
TNETV107X_PIN_ASR_A19,
|
||||
TNETV107X_PIN_GPIO49,
|
||||
TNETV107X_PIN_SDIO1_DATA2_0,
|
||||
TNETV107X_PIN_ASR_A20,
|
||||
TNETV107X_PIN_GPIO50,
|
||||
TNETV107X_PIN_SDIO1_DATA1_0,
|
||||
TNETV107X_PIN_ASR_A21,
|
||||
TNETV107X_PIN_GPIO51,
|
||||
TNETV107X_PIN_SDIO1_DATA0_0,
|
||||
TNETV107X_PIN_ASR_A22,
|
||||
TNETV107X_PIN_GPIO52,
|
||||
TNETV107X_PIN_SDIO1_CMD_0,
|
||||
TNETV107X_PIN_ASR_A23,
|
||||
TNETV107X_PIN_GPIO53,
|
||||
TNETV107X_PIN_SDIO1_CLK_0,
|
||||
TNETV107X_PIN_ASR_BA_1,
|
||||
TNETV107X_PIN_GPIO54,
|
||||
TNETV107X_PIN_SYS_PLL_CLK,
|
||||
TNETV107X_PIN_ASR_CS0,
|
||||
TNETV107X_PIN_ASR_CS1,
|
||||
TNETV107X_PIN_ASR_CS2,
|
||||
TNETV107X_PIN_TDM_PLL_CLK,
|
||||
TNETV107X_PIN_ASR_CS3,
|
||||
TNETV107X_PIN_ETH_PHY_CLK,
|
||||
TNETV107X_PIN_ASR_D00,
|
||||
TNETV107X_PIN_GPIO55,
|
||||
TNETV107X_PIN_ASR_D01,
|
||||
TNETV107X_PIN_GPIO56,
|
||||
TNETV107X_PIN_ASR_D02,
|
||||
TNETV107X_PIN_GPIO57,
|
||||
TNETV107X_PIN_ASR_D03,
|
||||
TNETV107X_PIN_GPIO58,
|
||||
TNETV107X_PIN_ASR_D04,
|
||||
TNETV107X_PIN_GPIO59_0,
|
||||
TNETV107X_PIN_ASR_D05,
|
||||
TNETV107X_PIN_GPIO60_0,
|
||||
TNETV107X_PIN_ASR_D06,
|
||||
TNETV107X_PIN_GPIO61_0,
|
||||
TNETV107X_PIN_ASR_D07,
|
||||
TNETV107X_PIN_GPIO62_0,
|
||||
TNETV107X_PIN_ASR_D08,
|
||||
TNETV107X_PIN_GPIO63_0,
|
||||
TNETV107X_PIN_ASR_D09,
|
||||
TNETV107X_PIN_GPIO64_0,
|
||||
TNETV107X_PIN_ASR_D10,
|
||||
TNETV107X_PIN_SDIO1_DATA3_1,
|
||||
TNETV107X_PIN_ASR_D11,
|
||||
TNETV107X_PIN_SDIO1_DATA2_1,
|
||||
TNETV107X_PIN_ASR_D12,
|
||||
TNETV107X_PIN_SDIO1_DATA1_1,
|
||||
TNETV107X_PIN_ASR_D13,
|
||||
TNETV107X_PIN_SDIO1_DATA0_1,
|
||||
TNETV107X_PIN_ASR_D14,
|
||||
TNETV107X_PIN_SDIO1_CMD_1,
|
||||
TNETV107X_PIN_ASR_D15,
|
||||
TNETV107X_PIN_SDIO1_CLK_1,
|
||||
TNETV107X_PIN_ASR_OE,
|
||||
TNETV107X_PIN_BOOT_STRP_2,
|
||||
TNETV107X_PIN_ASR_RNW,
|
||||
TNETV107X_PIN_GPIO29_0,
|
||||
TNETV107X_PIN_ASR_WAIT,
|
||||
TNETV107X_PIN_GPIO30_0,
|
||||
TNETV107X_PIN_ASR_WE,
|
||||
TNETV107X_PIN_BOOT_STRP_3,
|
||||
TNETV107X_PIN_ASR_WE_DQM0,
|
||||
TNETV107X_PIN_GPIO31,
|
||||
TNETV107X_PIN_LCD_PD17_0,
|
||||
TNETV107X_PIN_ASR_WE_DQM1,
|
||||
TNETV107X_PIN_ASR_BA0_0,
|
||||
TNETV107X_PIN_VLYNQ_CLK,
|
||||
TNETV107X_PIN_GPIO14,
|
||||
TNETV107X_PIN_LCD_PD19_0,
|
||||
TNETV107X_PIN_VLYNQ_RXD0,
|
||||
TNETV107X_PIN_GPIO15,
|
||||
TNETV107X_PIN_LCD_PD20_0,
|
||||
TNETV107X_PIN_VLYNQ_RXD1,
|
||||
TNETV107X_PIN_GPIO16,
|
||||
TNETV107X_PIN_LCD_PD21_0,
|
||||
TNETV107X_PIN_VLYNQ_TXD0,
|
||||
TNETV107X_PIN_GPIO17,
|
||||
TNETV107X_PIN_LCD_PD22_0,
|
||||
TNETV107X_PIN_VLYNQ_TXD1,
|
||||
TNETV107X_PIN_GPIO18,
|
||||
TNETV107X_PIN_LCD_PD23_0,
|
||||
TNETV107X_PIN_SDIO0_CLK,
|
||||
TNETV107X_PIN_GPIO19,
|
||||
TNETV107X_PIN_SDIO0_CMD,
|
||||
TNETV107X_PIN_GPIO20,
|
||||
TNETV107X_PIN_SDIO0_DATA0,
|
||||
TNETV107X_PIN_GPIO21,
|
||||
TNETV107X_PIN_SDIO0_DATA1,
|
||||
TNETV107X_PIN_GPIO22,
|
||||
TNETV107X_PIN_SDIO0_DATA2,
|
||||
TNETV107X_PIN_GPIO23,
|
||||
TNETV107X_PIN_SDIO0_DATA3,
|
||||
TNETV107X_PIN_GPIO24,
|
||||
TNETV107X_PIN_EMU0,
|
||||
TNETV107X_PIN_EMU1,
|
||||
TNETV107X_PIN_RTCK,
|
||||
TNETV107X_PIN_TRST_N,
|
||||
TNETV107X_PIN_TCK,
|
||||
TNETV107X_PIN_TDI,
|
||||
TNETV107X_PIN_TDO,
|
||||
TNETV107X_PIN_TMS,
|
||||
TNETV107X_PIN_TDM1_CLK,
|
||||
TNETV107X_PIN_TDM1_RX,
|
||||
TNETV107X_PIN_TDM1_TX,
|
||||
TNETV107X_PIN_TDM1_FS,
|
||||
TNETV107X_PIN_KEYPAD_R0,
|
||||
TNETV107X_PIN_KEYPAD_R1,
|
||||
TNETV107X_PIN_KEYPAD_R2,
|
||||
TNETV107X_PIN_KEYPAD_R3,
|
||||
TNETV107X_PIN_KEYPAD_R4,
|
||||
TNETV107X_PIN_KEYPAD_R5,
|
||||
TNETV107X_PIN_KEYPAD_R6,
|
||||
TNETV107X_PIN_GPIO12,
|
||||
TNETV107X_PIN_KEYPAD_R7,
|
||||
TNETV107X_PIN_GPIO10,
|
||||
TNETV107X_PIN_KEYPAD_C0,
|
||||
TNETV107X_PIN_KEYPAD_C1,
|
||||
TNETV107X_PIN_KEYPAD_C2,
|
||||
TNETV107X_PIN_KEYPAD_C3,
|
||||
TNETV107X_PIN_KEYPAD_C4,
|
||||
TNETV107X_PIN_KEYPAD_C5,
|
||||
TNETV107X_PIN_KEYPAD_C6,
|
||||
TNETV107X_PIN_GPIO13,
|
||||
TNETV107X_PIN_TEST_CLK_IN,
|
||||
TNETV107X_PIN_KEYPAD_C7,
|
||||
TNETV107X_PIN_GPIO11,
|
||||
TNETV107X_PIN_SSP0_0,
|
||||
TNETV107X_PIN_SCC_DCLK,
|
||||
TNETV107X_PIN_LCD_PD20_1,
|
||||
TNETV107X_PIN_SSP0_1,
|
||||
TNETV107X_PIN_SCC_CS_N,
|
||||
TNETV107X_PIN_LCD_PD21_1,
|
||||
TNETV107X_PIN_SSP0_2,
|
||||
TNETV107X_PIN_SCC_D,
|
||||
TNETV107X_PIN_LCD_PD22_1,
|
||||
TNETV107X_PIN_SSP0_3,
|
||||
TNETV107X_PIN_SCC_RESETN,
|
||||
TNETV107X_PIN_LCD_PD23_1,
|
||||
TNETV107X_PIN_SSP1_0,
|
||||
TNETV107X_PIN_GPIO25,
|
||||
TNETV107X_PIN_UART2_CTS,
|
||||
TNETV107X_PIN_SSP1_1,
|
||||
TNETV107X_PIN_GPIO26,
|
||||
TNETV107X_PIN_UART2_RD,
|
||||
TNETV107X_PIN_SSP1_2,
|
||||
TNETV107X_PIN_GPIO27,
|
||||
TNETV107X_PIN_UART2_RTS,
|
||||
TNETV107X_PIN_SSP1_3,
|
||||
TNETV107X_PIN_GPIO28,
|
||||
TNETV107X_PIN_UART2_TD,
|
||||
TNETV107X_PIN_UART0_CTS,
|
||||
TNETV107X_PIN_UART0_RD,
|
||||
TNETV107X_PIN_UART0_RTS,
|
||||
TNETV107X_PIN_UART0_TD,
|
||||
TNETV107X_PIN_UART1_RD,
|
||||
TNETV107X_PIN_UART1_TD,
|
||||
TNETV107X_PIN_LCD_AC_NCS,
|
||||
TNETV107X_PIN_LCD_HSYNC_RNW,
|
||||
TNETV107X_PIN_LCD_VSYNC_A0,
|
||||
TNETV107X_PIN_LCD_MCLK,
|
||||
TNETV107X_PIN_LCD_PD16_0,
|
||||
TNETV107X_PIN_LCD_PCLK_E,
|
||||
TNETV107X_PIN_LCD_PD00,
|
||||
TNETV107X_PIN_LCD_PD01,
|
||||
TNETV107X_PIN_LCD_PD02,
|
||||
TNETV107X_PIN_LCD_PD03,
|
||||
TNETV107X_PIN_LCD_PD04,
|
||||
TNETV107X_PIN_LCD_PD05,
|
||||
TNETV107X_PIN_LCD_PD06,
|
||||
TNETV107X_PIN_LCD_PD07,
|
||||
TNETV107X_PIN_LCD_PD08,
|
||||
TNETV107X_PIN_GPIO59_1,
|
||||
TNETV107X_PIN_LCD_PD09,
|
||||
TNETV107X_PIN_GPIO60_1,
|
||||
TNETV107X_PIN_LCD_PD10,
|
||||
TNETV107X_PIN_ASR_BA0_1,
|
||||
TNETV107X_PIN_GPIO61_1,
|
||||
TNETV107X_PIN_LCD_PD11,
|
||||
TNETV107X_PIN_GPIO62_1,
|
||||
TNETV107X_PIN_LCD_PD12,
|
||||
TNETV107X_PIN_GPIO63_1,
|
||||
TNETV107X_PIN_LCD_PD13,
|
||||
TNETV107X_PIN_GPIO64_1,
|
||||
TNETV107X_PIN_LCD_PD14,
|
||||
TNETV107X_PIN_GPIO29_1,
|
||||
TNETV107X_PIN_LCD_PD15,
|
||||
TNETV107X_PIN_GPIO30_1,
|
||||
TNETV107X_PIN_EINT0,
|
||||
TNETV107X_PIN_GPIO08,
|
||||
TNETV107X_PIN_EINT1,
|
||||
TNETV107X_PIN_GPIO09,
|
||||
TNETV107X_PIN_GPIO00,
|
||||
TNETV107X_PIN_LCD_PD20_2,
|
||||
TNETV107X_PIN_TDM_CLK_IN_2,
|
||||
TNETV107X_PIN_GPIO01,
|
||||
TNETV107X_PIN_LCD_PD21_2,
|
||||
TNETV107X_PIN_24M_CLK_OUT_1,
|
||||
TNETV107X_PIN_GPIO02,
|
||||
TNETV107X_PIN_LCD_PD22_2,
|
||||
TNETV107X_PIN_GPIO03,
|
||||
TNETV107X_PIN_LCD_PD23_2,
|
||||
TNETV107X_PIN_GPIO04,
|
||||
TNETV107X_PIN_LCD_PD16_1,
|
||||
TNETV107X_PIN_USB0_RXERR,
|
||||
TNETV107X_PIN_GPIO05,
|
||||
TNETV107X_PIN_LCD_PD17_1,
|
||||
TNETV107X_PIN_TDM_CLK_IN_1,
|
||||
TNETV107X_PIN_GPIO06,
|
||||
TNETV107X_PIN_LCD_PD18,
|
||||
TNETV107X_PIN_24M_CLK_OUT_2,
|
||||
TNETV107X_PIN_GPIO07,
|
||||
TNETV107X_PIN_LCD_PD19_1,
|
||||
TNETV107X_PIN_USB1_RXERR,
|
||||
TNETV107X_PIN_ETH_PLL_CLK,
|
||||
TNETV107X_PIN_MDIO,
|
||||
TNETV107X_PIN_MDC,
|
||||
TNETV107X_PIN_AIC_MUTE_STAT_N,
|
||||
TNETV107X_PIN_TDM0_CLK,
|
||||
TNETV107X_PIN_AIC_HNS_EN_N,
|
||||
TNETV107X_PIN_TDM0_FS,
|
||||
TNETV107X_PIN_AIC_HDS_EN_STAT_N,
|
||||
TNETV107X_PIN_TDM0_TX,
|
||||
TNETV107X_PIN_AIC_HNF_EN_STAT_N,
|
||||
TNETV107X_PIN_TDM0_RX,
|
||||
};
|
||||
|
||||
#endif
|
||||
38
arch/arm/include/asm/arch-tnetv107x/nand_defs.h
Normal file
38
arch/arm/include/asm/arch-tnetv107x/nand_defs.h
Normal file
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* TNETV107X: NAND definitions
|
||||
*
|
||||
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
#ifndef _NAND_DEFS_H_
|
||||
#define _NAND_DEFS_H_
|
||||
|
||||
#include <asm/arch/hardware.h>
|
||||
#include <asm/arch/emif_defs.h>
|
||||
|
||||
#define DAVINCI_ASYNC_EMIF_CNTRL_BASE TNETV107X_ASYNC_EMIF_CNTRL_BASE
|
||||
|
||||
#define MASK_CLE 0x4000
|
||||
#define MASK_ALE 0x2000
|
||||
|
||||
#define NAND_READ_START 0x00
|
||||
#define NAND_READ_END 0x30
|
||||
#define NAND_STATUS 0x70
|
||||
|
||||
extern void davinci_nand_init(struct nand_chip *nand);
|
||||
|
||||
#endif
|
||||
@@ -248,13 +248,13 @@ extern void __iounmap(void *addr);
|
||||
* iomem_to_phys(off)
|
||||
*/
|
||||
#ifdef iomem_valid_addr
|
||||
#define __arch_ioremap(off,sz,nocache) \
|
||||
({ \
|
||||
unsigned long _off = (off), _size = (sz); \
|
||||
void *_ret = (void *)0; \
|
||||
if (iomem_valid_addr(_off, _size)) \
|
||||
_ret = __ioremap(iomem_to_phys(_off),_size,0); \
|
||||
_ret; \
|
||||
#define __arch_ioremap(off,sz,nocache) \
|
||||
({ \
|
||||
unsigned long _off = (off), _size = (sz); \
|
||||
void *_ret = (void *)0; \
|
||||
if (iomem_valid_addr(_off, _size)) \
|
||||
_ret = __ioremap(iomem_to_phys(_off),_size,nocache); \
|
||||
_ret; \
|
||||
})
|
||||
|
||||
#define __arch_iounmap __iounmap
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -33,9 +33,7 @@ DECLARE_GLOBAL_DATA_PTR;
|
||||
defined (CONFIG_CMDLINE_TAG) || \
|
||||
defined (CONFIG_INITRD_TAG) || \
|
||||
defined (CONFIG_SERIAL_TAG) || \
|
||||
defined (CONFIG_REVISION_TAG) || \
|
||||
defined (CONFIG_VFD) || \
|
||||
defined (CONFIG_LCD)
|
||||
defined (CONFIG_REVISION_TAG)
|
||||
static void setup_start_tag (bd_t *bd);
|
||||
|
||||
# ifdef CONFIG_SETUP_MEMORY_TAGS
|
||||
@@ -49,10 +47,6 @@ static void setup_initrd_tag (bd_t *bd, ulong initrd_start,
|
||||
# endif
|
||||
static void setup_end_tag (bd_t *bd);
|
||||
|
||||
# if defined (CONFIG_VFD) || defined (CONFIG_LCD)
|
||||
static void setup_videolfb_tag (gd_t *gd);
|
||||
# endif
|
||||
|
||||
static struct tag *params;
|
||||
#endif /* CONFIG_SETUP_MEMORY_TAGS || CONFIG_CMDLINE_TAG || CONFIG_INITRD_TAG */
|
||||
|
||||
@@ -87,9 +81,7 @@ int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
|
||||
defined (CONFIG_CMDLINE_TAG) || \
|
||||
defined (CONFIG_INITRD_TAG) || \
|
||||
defined (CONFIG_SERIAL_TAG) || \
|
||||
defined (CONFIG_REVISION_TAG) || \
|
||||
defined (CONFIG_LCD) || \
|
||||
defined (CONFIG_VFD)
|
||||
defined (CONFIG_REVISION_TAG)
|
||||
setup_start_tag (bd);
|
||||
#ifdef CONFIG_SERIAL_TAG
|
||||
setup_serial_tag (¶ms);
|
||||
@@ -106,9 +98,6 @@ int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
|
||||
#ifdef CONFIG_INITRD_TAG
|
||||
if (images->rd_start && images->rd_end)
|
||||
setup_initrd_tag (bd, images->rd_start, images->rd_end);
|
||||
#endif
|
||||
#if defined (CONFIG_VFD) || defined (CONFIG_LCD)
|
||||
setup_videolfb_tag ((gd_t *) gd);
|
||||
#endif
|
||||
setup_end_tag (bd);
|
||||
#endif
|
||||
@@ -136,9 +125,7 @@ int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
|
||||
defined (CONFIG_CMDLINE_TAG) || \
|
||||
defined (CONFIG_INITRD_TAG) || \
|
||||
defined (CONFIG_SERIAL_TAG) || \
|
||||
defined (CONFIG_REVISION_TAG) || \
|
||||
defined (CONFIG_LCD) || \
|
||||
defined (CONFIG_VFD)
|
||||
defined (CONFIG_REVISION_TAG)
|
||||
static void setup_start_tag (bd_t *bd)
|
||||
{
|
||||
params = (struct tag *) bd->bi_boot_params;
|
||||
@@ -214,30 +201,6 @@ static void setup_initrd_tag (bd_t *bd, ulong initrd_start, ulong initrd_end)
|
||||
}
|
||||
#endif /* CONFIG_INITRD_TAG */
|
||||
|
||||
|
||||
#if defined (CONFIG_VFD) || defined (CONFIG_LCD)
|
||||
extern ulong calc_fbsize (void);
|
||||
static void setup_videolfb_tag (gd_t *gd)
|
||||
{
|
||||
/* An ATAG_VIDEOLFB node tells the kernel where and how large
|
||||
* the framebuffer for video was allocated (among other things).
|
||||
* Note that a _physical_ address is passed !
|
||||
*
|
||||
* We only use it to pass the address and size, the other entries
|
||||
* in the tag_videolfb are not of interest.
|
||||
*/
|
||||
params->hdr.tag = ATAG_VIDEOLFB;
|
||||
params->hdr.size = tag_size (tag_videolfb);
|
||||
|
||||
params->u.videolfb.lfb_base = (u32) gd->fb_base;
|
||||
/* Fb size is calculated according to parameters for our panel
|
||||
*/
|
||||
params->u.videolfb.lfb_size = calc_fbsize();
|
||||
|
||||
params = tag_next (params);
|
||||
}
|
||||
#endif /* CONFIG_VFD || CONFIG_LCD */
|
||||
|
||||
#ifdef CONFIG_SERIAL_TAG
|
||||
void setup_serial_tag (struct tag **tmp)
|
||||
{
|
||||
|
||||
@@ -185,8 +185,19 @@ int fecpin_setclear(struct eth_device *dev, int setclear)
|
||||
struct fec_info_s *info = (struct fec_info_s *)dev->priv;
|
||||
|
||||
if (setclear) {
|
||||
#ifdef CONFIG_SYS_FEC_NO_SHARED_PHY
|
||||
if (info->iobase == CONFIG_SYS_FEC0_IOBASE)
|
||||
gpio->par_feci2c |=
|
||||
(GPIO_PAR_FECI2C_MDC0_MDC0 |
|
||||
GPIO_PAR_FECI2C_MDIO0_MDIO0);
|
||||
else
|
||||
gpio->par_feci2c |=
|
||||
(GPIO_PAR_FECI2C_MDC1_MDC1 |
|
||||
GPIO_PAR_FECI2C_MDIO1_MDIO1);
|
||||
#else
|
||||
gpio->par_feci2c |=
|
||||
(GPIO_PAR_FECI2C_MDC0_MDC0 | GPIO_PAR_FECI2C_MDIO0_MDIO0);
|
||||
#endif
|
||||
|
||||
if (info->iobase == CONFIG_SYS_FEC0_IOBASE)
|
||||
gpio->par_fec |= GPIO_PAR_FEC_FEC0_RMII_GPIO;
|
||||
@@ -196,10 +207,19 @@ int fecpin_setclear(struct eth_device *dev, int setclear)
|
||||
gpio->par_feci2c &=
|
||||
~(GPIO_PAR_FECI2C_MDC0_MDC0 | GPIO_PAR_FECI2C_MDIO0_MDIO0);
|
||||
|
||||
if (info->iobase == CONFIG_SYS_FEC0_IOBASE)
|
||||
if (info->iobase == CONFIG_SYS_FEC0_IOBASE) {
|
||||
#ifdef CONFIG_SYS_FEC_FULL_MII
|
||||
gpio->par_fec |= GPIO_PAR_FEC_FEC0_MII;
|
||||
#else
|
||||
gpio->par_fec &= GPIO_PAR_FEC_FEC0_UNMASK;
|
||||
else
|
||||
#endif
|
||||
} else {
|
||||
#ifdef CONFIG_SYS_FEC_FULL_MII
|
||||
gpio->par_fec |= GPIO_PAR_FEC_FEC1_MII;
|
||||
#else
|
||||
gpio->par_fec &= GPIO_PAR_FEC_FEC1_UNMASK;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -238,6 +258,10 @@ int cfspi_claim_bus(uint bus, uint cs)
|
||||
gpio->par_dspi &= ~GPIO_PAR_DSPI_PCS2_PCS2;
|
||||
gpio->par_dspi |= GPIO_PAR_DSPI_PCS2_PCS2;
|
||||
break;
|
||||
case 3:
|
||||
gpio->par_dma &= GPIO_PAR_DMA_DACK0_UNMASK;
|
||||
gpio->par_dma |= GPIO_PAR_DMA_DACK0_PCS3;
|
||||
break;
|
||||
case 5:
|
||||
gpio->par_dspi &= ~GPIO_PAR_DSPI_PCS5_PCS5;
|
||||
gpio->par_dspi |= GPIO_PAR_DSPI_PCS5_PCS5;
|
||||
@@ -264,6 +288,9 @@ void cfspi_release_bus(uint bus, uint cs)
|
||||
case 2:
|
||||
gpio->par_dspi &= ~GPIO_PAR_DSPI_PCS2_PCS2;
|
||||
break;
|
||||
case 3:
|
||||
gpio->par_dma &= GPIO_PAR_DMA_DACK0_UNMASK;
|
||||
break;
|
||||
case 5:
|
||||
gpio->par_dspi &= ~GPIO_PAR_DSPI_PCS5_PCS5;
|
||||
break;
|
||||
|
||||
@@ -314,6 +314,7 @@
|
||||
#define GPIO_PAR_DMA_DREQ1_GPIO (0x00)
|
||||
#define GPIO_PAR_DMA_DACK0_UNMASK (0xF3)
|
||||
#define GPIO_PAR_DMA_DACK0_DACK1 (0x0C)
|
||||
#define GPIO_PAR_DMA_DACK0_PCS3 (0x08)
|
||||
#define GPIO_PAR_DMA_DACK0_ULPI_DIR (0x04)
|
||||
#define GPIO_PAR_DMA_DACK0_GPIO (0x00)
|
||||
#define GPIO_PAR_DMA_DREQ0_DREQ0 (0x01)
|
||||
|
||||
@@ -1,695 +0,0 @@
|
||||
/*
|
||||
* (C) Copyright 2003, Psyent Corporation <www.psyent.com>
|
||||
* Scott McNutt <smcnutt@psyent.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>
|
||||
|
||||
#if defined(CONFIG_NIOS_ASMI)
|
||||
#include <command.h>
|
||||
#include <nios-io.h>
|
||||
|
||||
#if !defined(CONFIG_SYS_NIOS_ASMIBASE)
|
||||
#error "*** CONFIG_SYS_NIOS_ASMIBASE not defined ***"
|
||||
#endif
|
||||
|
||||
/*-----------------------------------------------------------------------*/
|
||||
#define SHORT_HELP\
|
||||
"asmi - read/write Cyclone ASMI configuration device.\n"
|
||||
|
||||
#define LONG_HELP\
|
||||
"\n"\
|
||||
"asmi erase start [end]\n"\
|
||||
" - erase sector start or sectors start through end.\n"\
|
||||
"asmi info\n"\
|
||||
" - display ASMI device information.\n"\
|
||||
"asmi protect on | off\n"\
|
||||
" - turn device protection on or off.\n"\
|
||||
"asmi read addr offset count\n"\
|
||||
" - read count bytes from offset to addr.\n"\
|
||||
"asmi write addr offset count\n"\
|
||||
" - write count bytes to offset from addr.\n"\
|
||||
"asmi verify addr offset count\n"\
|
||||
" - verify count bytes at offset from addr."
|
||||
|
||||
|
||||
/*-----------------------------------------------------------------------*/
|
||||
/* Operation codes for serial configuration devices
|
||||
*/
|
||||
#define ASMI_WRITE_ENA 0x06 /* Write enable */
|
||||
#define ASMI_WRITE_DIS 0x04 /* Write disable */
|
||||
#define ASMI_READ_STAT 0x05 /* Read status */
|
||||
#define ASMI_READ_BYTES 0x03 /* Read bytes */
|
||||
#define ASMI_READ_ID 0xab /* Read silicon id */
|
||||
#define ASMI_WRITE_STAT 0x01 /* Write status */
|
||||
#define ASMI_WRITE_BYTES 0x02 /* Write bytes */
|
||||
#define ASMI_ERASE_BULK 0xc7 /* Erase entire device */
|
||||
#define ASMI_ERASE_SECT 0xd8 /* Erase sector */
|
||||
|
||||
/* Device status register bits
|
||||
*/
|
||||
#define ASMI_STATUS_WIP (1<<0) /* Write in progress */
|
||||
#define ASMI_STATUS_WEL (1<<1) /* Write enable latch */
|
||||
|
||||
static nios_asmi_t *asmi = (nios_asmi_t *)CONFIG_SYS_NIOS_ASMIBASE;
|
||||
|
||||
/***********************************************************************
|
||||
* Device access
|
||||
***********************************************************************/
|
||||
static void asmi_cs (int assert)
|
||||
{
|
||||
if (assert) {
|
||||
asmi->control |= NIOS_ASMI_SSO;
|
||||
} else {
|
||||
/* Let all bits shift out */
|
||||
while ((asmi->status & NIOS_ASMI_TMT) == 0)
|
||||
;
|
||||
asmi->control &= ~NIOS_ASMI_SSO;
|
||||
}
|
||||
}
|
||||
|
||||
static void asmi_tx (unsigned char c)
|
||||
{
|
||||
while ((asmi->status & NIOS_ASMI_TRDY) == 0)
|
||||
;
|
||||
asmi->txdata = c;
|
||||
}
|
||||
|
||||
static int asmi_rx (void)
|
||||
{
|
||||
while ((asmi->status & NIOS_ASMI_RRDY) == 0)
|
||||
;
|
||||
return (asmi->rxdata);
|
||||
}
|
||||
|
||||
static unsigned char bitrev[] = {
|
||||
0x00, 0x08, 0x04, 0x0c, 0x02, 0x0a, 0x06, 0x0e,
|
||||
0x01, 0x09, 0x05, 0x0d, 0x03, 0x0b, 0x07, 0x0f
|
||||
};
|
||||
|
||||
static unsigned char asmi_bitrev( unsigned char c )
|
||||
{
|
||||
unsigned char val;
|
||||
|
||||
val = bitrev[c>>4];
|
||||
val |= bitrev[c & 0x0f]<<4;
|
||||
return (val);
|
||||
}
|
||||
|
||||
static void asmi_rcv (unsigned char *dst, int len)
|
||||
{
|
||||
while (len--) {
|
||||
asmi_tx (0);
|
||||
*dst++ = asmi_rx ();
|
||||
}
|
||||
}
|
||||
|
||||
static void asmi_rrcv (unsigned char *dst, int len)
|
||||
{
|
||||
while (len--) {
|
||||
asmi_tx (0);
|
||||
*dst++ = asmi_bitrev (asmi_rx ());
|
||||
}
|
||||
}
|
||||
|
||||
static void asmi_snd (unsigned char *src, int len)
|
||||
{
|
||||
while (len--) {
|
||||
asmi_tx (*src++);
|
||||
asmi_rx ();
|
||||
}
|
||||
}
|
||||
|
||||
static void asmi_rsnd (unsigned char *src, int len)
|
||||
{
|
||||
while (len--) {
|
||||
asmi_tx (asmi_bitrev (*src++));
|
||||
asmi_rx ();
|
||||
}
|
||||
}
|
||||
|
||||
static void asmi_wr_enable (void)
|
||||
{
|
||||
asmi_cs (1);
|
||||
asmi_tx (ASMI_WRITE_ENA);
|
||||
asmi_rx ();
|
||||
asmi_cs (0);
|
||||
}
|
||||
|
||||
static unsigned char asmi_status_rd (void)
|
||||
{
|
||||
unsigned char status;
|
||||
|
||||
asmi_cs (1);
|
||||
asmi_tx (ASMI_READ_STAT);
|
||||
asmi_rx ();
|
||||
asmi_tx (0);
|
||||
status = asmi_rx ();
|
||||
asmi_cs (0);
|
||||
return (status);
|
||||
}
|
||||
|
||||
static void asmi_status_wr (unsigned char status)
|
||||
{
|
||||
asmi_wr_enable ();
|
||||
asmi_cs (1);
|
||||
asmi_tx (ASMI_WRITE_STAT);
|
||||
asmi_rx ();
|
||||
asmi_tx (status);
|
||||
asmi_rx ();
|
||||
asmi_cs (0);
|
||||
return;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* Device information
|
||||
***********************************************************************/
|
||||
typedef struct asmi_devinfo_t {
|
||||
const char *name; /* Device name */
|
||||
unsigned char id; /* Device silicon id */
|
||||
unsigned char size; /* Total size log2(bytes)*/
|
||||
unsigned char num_sects; /* Number of sectors */
|
||||
unsigned char sz_sect; /* Sector size log2(bytes) */
|
||||
unsigned char sz_page; /* Page size log2(bytes) */
|
||||
unsigned char prot_mask; /* Protection mask */
|
||||
}asmi_devinfo_t;
|
||||
|
||||
static struct asmi_devinfo_t devinfo[] = {
|
||||
{ "EPCS1 ", 0x10, 17, 4, 15, 8, 0x0c },
|
||||
{ "EPCS4 ", 0x12, 19, 8, 16, 8, 0x1c },
|
||||
{ 0, 0, 0, 0, 0, 0 }
|
||||
};
|
||||
|
||||
static asmi_devinfo_t *asmi_dev_find (void)
|
||||
{
|
||||
unsigned char buf[4];
|
||||
unsigned char id;
|
||||
int i;
|
||||
struct asmi_devinfo_t *dev = NULL;
|
||||
|
||||
/* Read silicon id requires 3 "dummy bytes" before it's put
|
||||
* on the wire.
|
||||
*/
|
||||
buf[0] = ASMI_READ_ID;
|
||||
buf[1] = 0;
|
||||
buf[2] = 0;
|
||||
buf[3] = 0;
|
||||
|
||||
asmi_cs (1);
|
||||
asmi_snd (buf,4);
|
||||
asmi_rcv (buf,1);
|
||||
asmi_cs (0);
|
||||
id = buf[0];
|
||||
|
||||
/* Find the info struct */
|
||||
i = 0;
|
||||
while (devinfo[i].name) {
|
||||
if (id == devinfo[i].id) {
|
||||
dev = &devinfo[i];
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
return (dev);
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* Misc Utilities
|
||||
***********************************************************************/
|
||||
static unsigned asmi_cfgsz (void)
|
||||
{
|
||||
unsigned sz = 0;
|
||||
unsigned char buf[128];
|
||||
unsigned char *p;
|
||||
|
||||
/* Read in the first 128 bytes of the device */
|
||||
buf[0] = ASMI_READ_BYTES;
|
||||
buf[1] = 0;
|
||||
buf[2] = 0;
|
||||
buf[3] = 0;
|
||||
|
||||
asmi_cs (1);
|
||||
asmi_snd (buf,4);
|
||||
asmi_rrcv (buf, sizeof(buf));
|
||||
asmi_cs (0);
|
||||
|
||||
/* Search for the starting 0x6a which is followed by the
|
||||
* 4-byte 'register' and 4-byte bit-count.
|
||||
*/
|
||||
p = buf;
|
||||
while (p < buf + sizeof(buf)-8) {
|
||||
if ( *p == 0x6a ) {
|
||||
/* Point to bit count and extract */
|
||||
p += 5;
|
||||
sz = *p++;
|
||||
sz |= *p++ << 8;
|
||||
sz |= *p++ << 16;
|
||||
sz |= *p++ << 24;
|
||||
/* Convert to byte count */
|
||||
sz += 7;
|
||||
sz >>= 3;
|
||||
} else if (*p == 0xff) {
|
||||
/* 0xff is ok ... just skip */
|
||||
p++;
|
||||
continue;
|
||||
} else {
|
||||
/* Not 0xff or 0x6a ... something's not
|
||||
* right ... report 'unknown' (sz=0).
|
||||
*/
|
||||
break;
|
||||
}
|
||||
}
|
||||
return (sz);
|
||||
}
|
||||
|
||||
static int asmi_erase (unsigned start, unsigned end)
|
||||
{
|
||||
unsigned off, sectsz;
|
||||
unsigned char buf[4];
|
||||
struct asmi_devinfo_t *dev = asmi_dev_find ();
|
||||
|
||||
if (!dev || (start>end))
|
||||
return (-1);
|
||||
|
||||
/* Erase the requested sectors. An address is required
|
||||
* that lies within the requested sector -- we'll just
|
||||
* use the first address in the sector.
|
||||
*/
|
||||
printf ("asmi erasing sector %d ", start);
|
||||
if (start != end)
|
||||
printf ("to %d ", end);
|
||||
sectsz = (1 << dev->sz_sect);
|
||||
while (start <= end) {
|
||||
off = start * sectsz;
|
||||
start++;
|
||||
|
||||
buf[0] = ASMI_ERASE_SECT;
|
||||
buf[1] = off >> 16;
|
||||
buf[2] = off >> 8;
|
||||
buf[3] = off;
|
||||
|
||||
asmi_wr_enable ();
|
||||
asmi_cs (1);
|
||||
asmi_snd (buf,4);
|
||||
asmi_cs (0);
|
||||
|
||||
printf ("."); /* Some user feedback */
|
||||
|
||||
/* Wait for erase to complete */
|
||||
while (asmi_status_rd() & ASMI_STATUS_WIP)
|
||||
;
|
||||
}
|
||||
printf (" done.\n");
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int asmi_read (ulong addr, ulong off, ulong cnt)
|
||||
{
|
||||
unsigned char buf[4];
|
||||
|
||||
buf[0] = ASMI_READ_BYTES;
|
||||
buf[1] = off >> 16;
|
||||
buf[2] = off >> 8;
|
||||
buf[3] = off;
|
||||
|
||||
asmi_cs (1);
|
||||
asmi_snd (buf,4);
|
||||
asmi_rrcv ((unsigned char *)addr, cnt);
|
||||
asmi_cs (0);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
static
|
||||
int asmi_write (ulong addr, ulong off, ulong cnt)
|
||||
{
|
||||
ulong wrcnt;
|
||||
unsigned pgsz;
|
||||
unsigned char buf[4];
|
||||
struct asmi_devinfo_t *dev = asmi_dev_find ();
|
||||
|
||||
if (!dev)
|
||||
return (-1);
|
||||
|
||||
pgsz = (1<<dev->sz_page);
|
||||
while (cnt) {
|
||||
if (off % pgsz)
|
||||
wrcnt = pgsz - (off % pgsz);
|
||||
else
|
||||
wrcnt = pgsz;
|
||||
wrcnt = (wrcnt > cnt) ? cnt : wrcnt;
|
||||
|
||||
buf[0] = ASMI_WRITE_BYTES;
|
||||
buf[1] = off >> 16;
|
||||
buf[2] = off >> 8;
|
||||
buf[3] = off;
|
||||
|
||||
asmi_wr_enable ();
|
||||
asmi_cs (1);
|
||||
asmi_snd (buf,4);
|
||||
asmi_rsnd ((unsigned char *)addr, wrcnt);
|
||||
asmi_cs (0);
|
||||
|
||||
/* Wait for write to complete */
|
||||
while (asmi_status_rd() & ASMI_STATUS_WIP)
|
||||
;
|
||||
|
||||
cnt -= wrcnt;
|
||||
off += wrcnt;
|
||||
addr += wrcnt;
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
static
|
||||
int asmi_verify (ulong addr, ulong off, ulong cnt, ulong *err)
|
||||
{
|
||||
ulong rdcnt;
|
||||
unsigned char buf[256];
|
||||
unsigned char *start,*end;
|
||||
int i;
|
||||
|
||||
start = end = (unsigned char *)addr;
|
||||
while (cnt) {
|
||||
rdcnt = (cnt>sizeof(buf)) ? sizeof(buf) : cnt;
|
||||
asmi_read ((ulong)buf, off, rdcnt);
|
||||
for (i=0; i<rdcnt; i++) {
|
||||
if (*end != buf[i]) {
|
||||
*err = end - start;
|
||||
return(-1);
|
||||
}
|
||||
end++;
|
||||
}
|
||||
cnt -= rdcnt;
|
||||
off += rdcnt;
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int asmi_sect_erased (int sect, unsigned *offset,
|
||||
struct asmi_devinfo_t *dev)
|
||||
{
|
||||
unsigned char buf[128];
|
||||
unsigned off, end;
|
||||
unsigned sectsz;
|
||||
int i;
|
||||
|
||||
sectsz = (1 << dev->sz_sect);
|
||||
off = sectsz * sect;
|
||||
end = off + sectsz;
|
||||
|
||||
while (off < end) {
|
||||
asmi_read ((ulong)buf, off, sizeof(buf));
|
||||
for (i=0; i < sizeof(buf); i++) {
|
||||
if (buf[i] != 0xff) {
|
||||
*offset = off + i;
|
||||
return (0);
|
||||
}
|
||||
}
|
||||
off += sizeof(buf);
|
||||
}
|
||||
return (1);
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* Commands
|
||||
***********************************************************************/
|
||||
static
|
||||
void do_asmi_info (struct asmi_devinfo_t *dev, int argc, char *argv[])
|
||||
{
|
||||
int i;
|
||||
unsigned char stat;
|
||||
unsigned tmp;
|
||||
int erased;
|
||||
|
||||
/* Basic device info */
|
||||
printf ("%s: %d kbytes (%d sectors x %d kbytes,"
|
||||
" %d bytes/page)\n",
|
||||
dev->name, 1 << (dev->size-10),
|
||||
dev->num_sects, 1 << (dev->sz_sect-10),
|
||||
1 << dev->sz_page );
|
||||
|
||||
/* Status -- for now protection is all-or-nothing */
|
||||
stat = asmi_status_rd();
|
||||
printf ("status: 0x%02x (WIP:%d, WEL:%d, PROT:%s)\n",
|
||||
stat,
|
||||
(stat & ASMI_STATUS_WIP) ? 1 : 0,
|
||||
(stat & ASMI_STATUS_WEL) ? 1 : 0,
|
||||
(stat & dev->prot_mask) ? "on" : "off" );
|
||||
|
||||
/* Configuration */
|
||||
tmp = asmi_cfgsz ();
|
||||
if (tmp) {
|
||||
printf ("config: 0x%06x (%d) bytes\n", tmp, tmp );
|
||||
} else {
|
||||
printf ("config: unknown\n" );
|
||||
}
|
||||
|
||||
/* Sector info */
|
||||
for (i=0; i<dev->num_sects; i++) {
|
||||
erased = asmi_sect_erased (i, &tmp, dev);
|
||||
printf (" %d: %06x ",
|
||||
i, i*(1<<dev->sz_sect) );
|
||||
if (erased)
|
||||
printf ("erased\n");
|
||||
else
|
||||
printf ("data @ 0x%06x\n", tmp);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
static
|
||||
void do_asmi_erase (struct asmi_devinfo_t *dev, int argc, char *argv[])
|
||||
{
|
||||
unsigned start,end;
|
||||
|
||||
if ((argc < 3) || (argc > 4)) {
|
||||
printf ("USAGE: asmi erase sect [end]\n");
|
||||
return;
|
||||
}
|
||||
if ((asmi_status_rd() & dev->prot_mask) != 0) {
|
||||
printf ( "asmi: device protected.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
start = simple_strtoul (argv[2], NULL, 10);
|
||||
if (argc > 3)
|
||||
end = simple_strtoul (argv[3], NULL, 10);
|
||||
else
|
||||
end = start;
|
||||
if ((start >= dev->num_sects) || (start > end)) {
|
||||
printf ("asmi: invalid sector range: [%d:%d]\n",
|
||||
start, end );
|
||||
return;
|
||||
}
|
||||
|
||||
asmi_erase (start, end);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
static
|
||||
void do_asmi_protect (struct asmi_devinfo_t *dev, int argc, char *argv[])
|
||||
{
|
||||
unsigned char stat;
|
||||
|
||||
/* For now protection is all-or-nothing to keep things
|
||||
* simple. The protection bits don't map in a linear
|
||||
* fashion ... and we would rather protect the bottom
|
||||
* of the device since it contains the config data and
|
||||
* leave the top unprotected for app use. But unfortunately
|
||||
* protection works from top-to-bottom so it does
|
||||
* really help very much from a software app point-of-view.
|
||||
*/
|
||||
if (argc < 3) {
|
||||
printf ("USAGE: asmi protect on | off\n");
|
||||
return;
|
||||
}
|
||||
if (!dev)
|
||||
return;
|
||||
|
||||
/* Protection on/off is just a matter of setting/clearing
|
||||
* all protection bits in the status register.
|
||||
*/
|
||||
stat = asmi_status_rd ();
|
||||
if (strcmp ("on", argv[2]) == 0) {
|
||||
stat |= dev->prot_mask;
|
||||
} else if (strcmp ("off", argv[2]) == 0 ) {
|
||||
stat &= ~dev->prot_mask;
|
||||
} else {
|
||||
printf ("asmi: unknown protection: %s\n", argv[2]);
|
||||
return;
|
||||
}
|
||||
asmi_status_wr (stat);
|
||||
return;
|
||||
}
|
||||
|
||||
static
|
||||
void do_asmi_read (struct asmi_devinfo_t *dev, int argc, char *argv[])
|
||||
{
|
||||
ulong addr,off,cnt;
|
||||
ulong sz;
|
||||
|
||||
if (argc < 5) {
|
||||
printf ("USAGE: asmi read addr offset count\n");
|
||||
return;
|
||||
}
|
||||
|
||||
sz = 1 << dev->size;
|
||||
addr = simple_strtoul (argv[2], NULL, 16);
|
||||
off = simple_strtoul (argv[3], NULL, 16);
|
||||
cnt = simple_strtoul (argv[4], NULL, 16);
|
||||
if (off > sz) {
|
||||
printf ("offset is greater than device size"
|
||||
"... aborting.\n");
|
||||
return;
|
||||
}
|
||||
if ((off + cnt) > sz) {
|
||||
printf ("request exceeds device size"
|
||||
"... truncating.\n");
|
||||
cnt = sz - off;
|
||||
}
|
||||
printf ("asmi: read %08lx <- %06lx (0x%lx bytes)\n",
|
||||
addr, off, cnt);
|
||||
asmi_read (addr, off, cnt);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
static
|
||||
void do_asmi_write (struct asmi_devinfo_t *dev, int argc, char *argv[])
|
||||
{
|
||||
ulong addr,off,cnt;
|
||||
ulong sz;
|
||||
ulong err;
|
||||
|
||||
if (argc < 5) {
|
||||
printf ("USAGE: asmi write addr offset count\n");
|
||||
return;
|
||||
}
|
||||
if ((asmi_status_rd() & dev->prot_mask) != 0) {
|
||||
printf ( "asmi: device protected.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
sz = 1 << dev->size;
|
||||
addr = simple_strtoul (argv[2], NULL, 16);
|
||||
off = simple_strtoul (argv[3], NULL, 16);
|
||||
cnt = simple_strtoul (argv[4], NULL, 16);
|
||||
if (off > sz) {
|
||||
printf ("offset is greater than device size"
|
||||
"... aborting.\n");
|
||||
return;
|
||||
}
|
||||
if ((off + cnt) > sz) {
|
||||
printf ("request exceeds device size"
|
||||
"... truncating.\n");
|
||||
cnt = sz - off;
|
||||
}
|
||||
printf ("asmi: write %08lx -> %06lx (0x%lx bytes)\n",
|
||||
addr, off, cnt);
|
||||
asmi_write (addr, off, cnt);
|
||||
if (asmi_verify (addr, off, cnt, &err) != 0)
|
||||
printf ("asmi: write error at offset %06lx\n", err);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
static
|
||||
void do_asmi_verify (struct asmi_devinfo_t *dev, int argc, char *argv[])
|
||||
{
|
||||
ulong addr,off,cnt;
|
||||
ulong sz;
|
||||
ulong err;
|
||||
|
||||
if (argc < 5) {
|
||||
printf ("USAGE: asmi verify addr offset count\n");
|
||||
return;
|
||||
}
|
||||
|
||||
sz = 1 << dev->size;
|
||||
addr = simple_strtoul (argv[2], NULL, 16);
|
||||
off = simple_strtoul (argv[3], NULL, 16);
|
||||
cnt = simple_strtoul (argv[4], NULL, 16);
|
||||
if (off > sz) {
|
||||
printf ("offset is greater than device size"
|
||||
"... aborting.\n");
|
||||
return;
|
||||
}
|
||||
if ((off + cnt) > sz) {
|
||||
printf ("request exceeds device size"
|
||||
"... truncating.\n");
|
||||
cnt = sz - off;
|
||||
}
|
||||
printf ("asmi: verify %08lx -> %06lx (0x%lx bytes)\n",
|
||||
addr, off, cnt);
|
||||
if (asmi_verify (addr, off, cnt, &err) != 0)
|
||||
printf ("asmi: verify error at offset %06lx\n", err);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------------*/
|
||||
int do_asmi (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
||||
{
|
||||
int len;
|
||||
struct asmi_devinfo_t *dev = asmi_dev_find ();
|
||||
|
||||
if (argc < 2) {
|
||||
printf ("Usage:%s", LONG_HELP);
|
||||
return (0);
|
||||
}
|
||||
|
||||
if (!dev) {
|
||||
printf ("asmi: device not found.\n");
|
||||
return (0);
|
||||
}
|
||||
|
||||
len = strlen (argv[1]);
|
||||
if (strncmp ("info", argv[1], len) == 0) {
|
||||
do_asmi_info ( dev, argc, argv);
|
||||
} else if (strncmp ("erase", argv[1], len) == 0) {
|
||||
do_asmi_erase (dev, argc, argv);
|
||||
} else if (strncmp ("protect", argv[1], len) == 0) {
|
||||
do_asmi_protect (dev, argc, argv);
|
||||
} else if (strncmp ("read", argv[1], len) == 0) {
|
||||
do_asmi_read (dev, argc, argv);
|
||||
} else if (strncmp ("write", argv[1], len) == 0) {
|
||||
do_asmi_write (dev, argc, argv);
|
||||
} else if (strncmp ("verify", argv[1], len) == 0) {
|
||||
do_asmi_verify (dev, argc, argv);
|
||||
} else {
|
||||
printf ("asmi: unknown operation: %s\n", argv[1]);
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------------*/
|
||||
|
||||
|
||||
U_BOOT_CMD( asmi, 5, 0, do_asmi, SHORT_HELP, LONG_HELP );
|
||||
|
||||
#endif /* CONFIG_NIOS_ASMI */
|
||||
@@ -1,78 +0,0 @@
|
||||
/*
|
||||
* (C) Copyright 2003, Psyent Corporation <www.psyent.com>
|
||||
* Scott McNutt <smcnutt@psyent.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>
|
||||
#include <nios.h>
|
||||
|
||||
|
||||
int checkcpu (void)
|
||||
{
|
||||
unsigned val;
|
||||
unsigned rev_major;
|
||||
unsigned rev_minor;
|
||||
short nregs, hi_limit, lo_limit;
|
||||
|
||||
/* Get cpu version info */
|
||||
val = rdctl (CTL_CPU_ID);
|
||||
puts ("CPU: ");
|
||||
printf ("%s", (val & 0x00008000) ? "Nios-16 " : "Nios-32 ");
|
||||
rev_major = (val>>12) & 0x07;
|
||||
rev_minor = (val>>4) & 0x0ff;
|
||||
printf ("Rev. %d.%d (0x%04x)", rev_major, rev_minor,
|
||||
val & 0xffff);
|
||||
if (rev_major == 0x08)
|
||||
printf (" [OpenCore (R) Plus]");
|
||||
printf ("\n");
|
||||
|
||||
/* Check register file */
|
||||
val = rdctl (CTL_WVALID);
|
||||
lo_limit = val & 0x01f;
|
||||
hi_limit = (val>>5) & 0x1f;
|
||||
nregs = (hi_limit + 2) * 16;
|
||||
printf ("Reg file size: %d LO_LIMIT/HI_LIMIT: %d/%d\n",
|
||||
nregs, lo_limit, hi_limit);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
int do_reset (void)
|
||||
{
|
||||
/* trap 0 does the trick ... at least with the OCI debug
|
||||
* present -- haven't tested without it yet (stm).
|
||||
*/
|
||||
disable_interrupts ();
|
||||
ipri (1);
|
||||
asm volatile ("trap 0\n");
|
||||
|
||||
/* No return ;-) */
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
#if defined(CONFIG_WATCHDOG)
|
||||
void watchdog_reset (void)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_WATCHDOG */
|
||||
@@ -1,196 +0,0 @@
|
||||
/*
|
||||
* (C) Copyright 2000-2002
|
||||
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||
*
|
||||
* (C) Copyright 2003, Psyent Corporation <www.psyent.com>
|
||||
* Scott McNutt <smcnutt@psyent.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 <nios.h>
|
||||
#include <nios-io.h>
|
||||
#include <asm/ptrace.h>
|
||||
#include <common.h>
|
||||
#include <command.h>
|
||||
#include <watchdog.h>
|
||||
#ifdef CONFIG_STATUS_LED
|
||||
#include <status_led.h>
|
||||
#endif
|
||||
|
||||
/****************************************************************************/
|
||||
|
||||
struct irq_action {
|
||||
interrupt_handler_t *handler;
|
||||
void *arg;
|
||||
int count;
|
||||
};
|
||||
|
||||
static struct irq_action irq_vecs[64];
|
||||
|
||||
/*************************************************************************/
|
||||
volatile ulong timestamp = 0;
|
||||
|
||||
void reset_timer (void)
|
||||
{
|
||||
timestamp = 0;
|
||||
}
|
||||
|
||||
ulong get_timer (ulong base)
|
||||
{
|
||||
WATCHDOG_RESET ();
|
||||
return (timestamp - base);
|
||||
}
|
||||
|
||||
void set_timer (ulong t)
|
||||
{
|
||||
timestamp = t;
|
||||
}
|
||||
|
||||
|
||||
/* The board must handle this interrupt if a timer is not
|
||||
* provided.
|
||||
*/
|
||||
#if defined(CONFIG_SYS_NIOS_TMRBASE)
|
||||
void timer_interrupt (struct pt_regs *regs)
|
||||
{
|
||||
/* Interrupt is cleared by writing anything to the
|
||||
* status register.
|
||||
*/
|
||||
nios_timer_t *tmr = (nios_timer_t *)CONFIG_SYS_NIOS_TMRBASE;
|
||||
tmr->status = 0;
|
||||
timestamp += CONFIG_SYS_NIOS_TMRMS;
|
||||
#ifdef CONFIG_STATUS_LED
|
||||
status_led_tick(timestamp);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
/*************************************************************************/
|
||||
int disable_interrupts (void)
|
||||
{
|
||||
int val = 0;
|
||||
|
||||
/* Writing anything to CLR_IE disables interrupts */
|
||||
val = rdctl (CTL_STATUS);
|
||||
wrctl (CTL_CLR_IE, 0);
|
||||
return (val & STATUS_IE);
|
||||
}
|
||||
|
||||
void enable_interrupts( void )
|
||||
{
|
||||
/* Writing anything SET_IE enables interrupts */
|
||||
wrctl (CTL_SET_IE, 0);
|
||||
}
|
||||
|
||||
void external_interrupt (struct pt_regs *regs)
|
||||
{
|
||||
unsigned vec;
|
||||
|
||||
vec = (regs->status & STATUS_IPRI) >> 9; /* ipri */
|
||||
|
||||
irq_vecs[vec].count++;
|
||||
if (irq_vecs[vec].handler != NULL) {
|
||||
(*irq_vecs[vec].handler)(irq_vecs[vec].arg);
|
||||
} else {
|
||||
/* A sad side-effect of masking a bogus interrupt is
|
||||
* that lower priority interrupts will also be disabled.
|
||||
* This is probably not what we want ... so hang insted.
|
||||
*/
|
||||
printf ("Unhandled interrupt: 0x%x\n", vec);
|
||||
disable_interrupts ();
|
||||
hang ();
|
||||
}
|
||||
}
|
||||
|
||||
/*************************************************************************/
|
||||
int interrupt_init (void)
|
||||
{
|
||||
int vec;
|
||||
|
||||
#if defined(CONFIG_SYS_NIOS_TMRBASE)
|
||||
nios_timer_t *tmr = (nios_timer_t *)CONFIG_SYS_NIOS_TMRBASE;
|
||||
|
||||
tmr->control &= ~NIOS_TIMER_ITO;
|
||||
tmr->control |= NIOS_TIMER_STOP;
|
||||
#if defined(CONFIG_SYS_NIOS_TMRCNT)
|
||||
tmr->periodl = CONFIG_SYS_NIOS_TMRCNT & 0xffff;
|
||||
tmr->periodh = (CONFIG_SYS_NIOS_TMRCNT >> 16) & 0xffff;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
for (vec=0; vec<64; vec++ ) {
|
||||
irq_vecs[vec].handler = NULL;
|
||||
irq_vecs[vec].arg = NULL;
|
||||
irq_vecs[vec].count = 0;
|
||||
}
|
||||
|
||||
/* Need timus interruptus -- start the lopri timer */
|
||||
#if defined(CONFIG_SYS_NIOS_TMRBASE)
|
||||
tmr->control |= ( NIOS_TIMER_ITO |
|
||||
NIOS_TIMER_CONT |
|
||||
NIOS_TIMER_START );
|
||||
ipri (CONFIG_SYS_NIOS_TMRIRQ + 1);
|
||||
#endif
|
||||
enable_interrupts ();
|
||||
return (0);
|
||||
}
|
||||
|
||||
void irq_install_handler (int vec, interrupt_handler_t *handler, void *arg)
|
||||
{
|
||||
struct irq_action *irqa = irq_vecs;
|
||||
int i = vec;
|
||||
int flag;
|
||||
|
||||
if (irqa[i].handler != NULL) {
|
||||
printf ("Interrupt vector %d: handler 0x%x "
|
||||
"replacing 0x%x\n",
|
||||
vec, (uint)handler, (uint)irqa[i].handler);
|
||||
}
|
||||
|
||||
flag = disable_interrupts ();
|
||||
irqa[i].handler = handler;
|
||||
irqa[i].arg = arg;
|
||||
if (flag )
|
||||
enable_interrupts ();
|
||||
}
|
||||
|
||||
/*************************************************************************/
|
||||
#if defined(CONFIG_CMD_IRQ)
|
||||
int do_irqinfo (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
|
||||
{
|
||||
int vec;
|
||||
|
||||
printf ("\nInterrupt-Information:\n");
|
||||
printf ("Nr Routine Arg Count\n");
|
||||
|
||||
for (vec=0; vec<64; vec++) {
|
||||
if (irq_vecs[vec].handler != NULL) {
|
||||
printf ("%02d %08lx %08lx %d\n",
|
||||
vec,
|
||||
(ulong)irq_vecs[vec].handler<<1,
|
||||
(ulong)irq_vecs[vec].arg,
|
||||
irq_vecs[vec].count);
|
||||
}
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
#endif
|
||||
@@ -1,135 +0,0 @@
|
||||
/*
|
||||
* (C) Copyright 2003, Psyent Corporation <www.psyent.com>
|
||||
* Scott McNutt <smcnutt@psyent.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>
|
||||
#include <watchdog.h>
|
||||
#include <nios-io.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
/*------------------------------------------------------------------
|
||||
* JTAG acts as the serial port
|
||||
*-----------------------------------------------------------------*/
|
||||
#if defined(CONFIG_CONSOLE_JTAG)
|
||||
|
||||
static nios_jtag_t *jtag = (nios_jtag_t *)CONFIG_SYS_NIOS_CONSOLE;
|
||||
|
||||
void serial_setbrg( void ){ return; }
|
||||
int serial_init( void ) { return(0);}
|
||||
|
||||
void serial_putc (char c)
|
||||
{
|
||||
while ((jtag->txcntl & NIOS_JTAG_TRDY) != 0)
|
||||
WATCHDOG_RESET ();
|
||||
jtag->txcntl = NIOS_JTAG_TRDY | (unsigned char)c;
|
||||
}
|
||||
|
||||
void serial_puts (const char *s)
|
||||
{
|
||||
while (*s != 0)
|
||||
serial_putc (*s++);
|
||||
}
|
||||
|
||||
int serial_tstc (void)
|
||||
{
|
||||
return (jtag->rxcntl & NIOS_JTAG_RRDY);
|
||||
}
|
||||
|
||||
int serial_getc (void)
|
||||
{
|
||||
int c;
|
||||
while (serial_tstc() == 0)
|
||||
WATCHDOG_RESET ();
|
||||
c = jtag->rxcntl & 0x0ff;
|
||||
jtag->rxcntl = 0;
|
||||
return (c);
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------
|
||||
* UART the serial port
|
||||
*-----------------------------------------------------------------*/
|
||||
#else
|
||||
|
||||
static nios_uart_t *uart = (nios_uart_t *)CONFIG_SYS_NIOS_CONSOLE;
|
||||
|
||||
#if defined(CONFIG_SYS_NIOS_FIXEDBAUD)
|
||||
|
||||
/* Everything's already setup for fixed-baud PTF
|
||||
* assignment
|
||||
*/
|
||||
void serial_setbrg (void){ return; }
|
||||
int serial_init (void) { return (0);}
|
||||
|
||||
#else
|
||||
|
||||
void serial_setbrg (void)
|
||||
{
|
||||
unsigned div;
|
||||
|
||||
div = (CONFIG_SYS_CLK_FREQ/gd->baudrate)-1;
|
||||
uart->divisor = div;
|
||||
return;
|
||||
}
|
||||
|
||||
int serial_init (void)
|
||||
{
|
||||
serial_setbrg ();
|
||||
return (0);
|
||||
}
|
||||
|
||||
#endif /* CONFIG_SYS_NIOS_FIXEDBAUD */
|
||||
|
||||
|
||||
/*-----------------------------------------------------------------------
|
||||
* UART CONSOLE
|
||||
*---------------------------------------------------------------------*/
|
||||
void serial_putc (char c)
|
||||
{
|
||||
if (c == '\n')
|
||||
serial_putc ('\r');
|
||||
while ((uart->status & NIOS_UART_TRDY) == 0)
|
||||
WATCHDOG_RESET ();
|
||||
uart->txdata = (unsigned char)c;
|
||||
}
|
||||
|
||||
void serial_puts (const char *s)
|
||||
{
|
||||
while (*s != 0) {
|
||||
serial_putc (*s++);
|
||||
}
|
||||
}
|
||||
|
||||
int serial_tstc (void)
|
||||
{
|
||||
return (uart->status & NIOS_UART_RRDY);
|
||||
}
|
||||
|
||||
int serial_getc (void)
|
||||
{
|
||||
while (serial_tstc () == 0)
|
||||
WATCHDOG_RESET ();
|
||||
return( uart->rxdata & 0x00ff );
|
||||
}
|
||||
|
||||
#endif /* CONFIG_JTAG_CONSOLE */
|
||||
@@ -1,195 +0,0 @@
|
||||
/*
|
||||
* (C) Copyright 2004, Li-Pro.Net <www.li-pro.net>
|
||||
* Stephan Linz <linz@li-pro.net>
|
||||
*
|
||||
* 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>
|
||||
#include <linux/ctype.h>
|
||||
|
||||
#if defined(CONFIG_NIOS_SPI)
|
||||
#include <nios-io.h>
|
||||
#include <spi.h>
|
||||
|
||||
#if !defined(CONFIG_SYS_NIOS_SPIBASE)
|
||||
#error "*** CONFIG_SYS_NIOS_SPIBASE not defined ***"
|
||||
#endif
|
||||
|
||||
#if !defined(CONFIG_SYS_NIOS_SPIBITS)
|
||||
#error "*** CONFIG_SYS_NIOS_SPIBITS not defined ***"
|
||||
#endif
|
||||
|
||||
#if (CONFIG_SYS_NIOS_SPIBITS != 8) && (CONFIG_SYS_NIOS_SPIBITS != 16)
|
||||
#error "*** CONFIG_SYS_NIOS_SPIBITS should be either 8 or 16 ***"
|
||||
#endif
|
||||
|
||||
static nios_spi_t *spi = (nios_spi_t *)CONFIG_SYS_NIOS_SPIBASE;
|
||||
|
||||
/* Warning:
|
||||
* You cannot enable DEBUG for early system initalization, i. e. when
|
||||
* this driver is used to read environment parameters like "baudrate"
|
||||
* from EEPROM which are used to initialize the serial port which is
|
||||
* needed to print the debug messages...
|
||||
*/
|
||||
#undef DEBUG
|
||||
|
||||
#ifdef DEBUG
|
||||
|
||||
#define DPRINT(a) printf a;
|
||||
/* -----------------------------------------------
|
||||
* Helper functions to peek into tx and rx buffers
|
||||
* ----------------------------------------------- */
|
||||
static const char * const hex_digit = "0123456789ABCDEF";
|
||||
|
||||
static char quickhex (int i)
|
||||
{
|
||||
return hex_digit[i];
|
||||
}
|
||||
|
||||
static void memdump (const void *pv, int num)
|
||||
{
|
||||
int i;
|
||||
const unsigned char *pc = (const unsigned char *) pv;
|
||||
|
||||
for (i = 0; i < num; i++)
|
||||
printf ("%c%c ", quickhex (pc[i] >> 4), quickhex (pc[i] & 0x0f));
|
||||
printf ("\t");
|
||||
for (i = 0; i < num; i++)
|
||||
printf ("%c", isprint (pc[i]) ? pc[i] : '.');
|
||||
printf ("\n");
|
||||
}
|
||||
#else /* !DEBUG */
|
||||
|
||||
#define DPRINT(a)
|
||||
#define memdump(p,n)
|
||||
|
||||
#endif /* DEBUG */
|
||||
|
||||
|
||||
struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
|
||||
unsigned int max_hz, unsigned int mode)
|
||||
{
|
||||
struct spi_slave *slave;
|
||||
|
||||
if (!spi_cs_is_valid(bus, cs))
|
||||
return NULL;
|
||||
|
||||
slave = malloc(sizeof(struct spi_slave));
|
||||
if (!slave)
|
||||
return NULL;
|
||||
|
||||
slave->bus = bus;
|
||||
slave->cs = cs;
|
||||
|
||||
/* TODO: Add support for different modes and speeds */
|
||||
|
||||
return slave;
|
||||
}
|
||||
|
||||
void spi_free_slave(struct spi_slave *slave)
|
||||
{
|
||||
free(slave);
|
||||
}
|
||||
|
||||
int spi_claim_bus(struct spi_slave *slave)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void spi_release_bus(struct spi_slave *slave)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* SPI transfer:
|
||||
*
|
||||
* See include/spi.h and http://www.altera.com/literature/ds/ds_nios_spi.pdf
|
||||
* for more informations.
|
||||
*/
|
||||
int spi_xfer(struct spi_slave *slave, int bitlen, const void *dout,
|
||||
void *din, unsigned long flags)
|
||||
{
|
||||
const u8 *txd = dout;
|
||||
u8 *rxd = din;
|
||||
int j;
|
||||
|
||||
DPRINT(("spi_xfer: slave %u:%u dout %08X din %08X bitlen %d\n",
|
||||
slave->bus, slave->cs, *(uint *)dout, *(uint *)din, bitlen));
|
||||
|
||||
memdump(dout, (bitlen + 7) / 8);
|
||||
|
||||
if (flags & SPI_XFER_BEGIN)
|
||||
spi_cs_activate(slave);
|
||||
|
||||
if (!(flags & SPI_XFER_END) || bitlen > CONFIG_SYS_NIOS_SPIBITS) {
|
||||
/* leave chip select active */
|
||||
spi->control |= NIOS_SPI_SSO;
|
||||
}
|
||||
|
||||
for ( j = 0; /* count each byte in */
|
||||
j < ((bitlen + 7) / 8); /* dout[] and din[] */
|
||||
|
||||
#if (CONFIG_SYS_NIOS_SPIBITS == 8)
|
||||
j++) {
|
||||
|
||||
while ((spi->status & NIOS_SPI_TRDY) == 0)
|
||||
;
|
||||
spi->txdata = (unsigned)(txd[j]);
|
||||
|
||||
while ((spi->status & NIOS_SPI_RRDY) == 0)
|
||||
;
|
||||
rxd[j] = (unsigned char)(spi->rxdata & 0xff);
|
||||
|
||||
#elif (CONFIG_SYS_NIOS_SPIBITS == 16)
|
||||
j++, j++) {
|
||||
|
||||
while ((spi->status & NIOS_SPI_TRDY) == 0)
|
||||
;
|
||||
if ((j+1) < ((bitlen + 7) / 8))
|
||||
spi->txdata = (unsigned)((txd[j] << 8) | txd[j+1]);
|
||||
else
|
||||
spi->txdata = (unsigned)(txd[j] << 8);
|
||||
|
||||
while ((spi->status & NIOS_SPI_RRDY) == 0)
|
||||
;
|
||||
rxd[j] = (unsigned char)((spi->rxdata >> 8) & 0xff);
|
||||
if ((j+1) < ((bitlen + 7) / 8))
|
||||
rxd[j+1] = (unsigned char)(spi->rxdata & 0xff);
|
||||
|
||||
#else
|
||||
#error "*** unsupported value of CONFIG_SYS_NIOS_SPIBITS ***"
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
if (bitlen > CONFIG_SYS_NIOS_SPIBITS && (flags & SPI_XFER_END)) {
|
||||
spi->control &= ~NIOS_SPI_SSO;
|
||||
}
|
||||
|
||||
if (flags & SPI_XFER_END)
|
||||
spi_cs_deactivate(slave);
|
||||
|
||||
memdump(din, (bitlen + 7) / 8);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_NIOS_SPI */
|
||||
@@ -1,238 +0,0 @@
|
||||
/*
|
||||
* (C) Copyright 2003, Psyent Corporation <www.psyent.com>
|
||||
* Scott McNutt <smcnutt@psyent.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>
|
||||
#include <timestamp.h>
|
||||
#include <version.h>
|
||||
|
||||
#if !defined(CONFIG_IDENT_STRING)
|
||||
#define CONFIG_IDENT_STRING ""
|
||||
#endif
|
||||
|
||||
#define STATUS_INIT 0x8600 /* IE=1, IPRI=2 */
|
||||
|
||||
/*************************************************************************
|
||||
* RESTART
|
||||
************************************************************************/
|
||||
|
||||
.text
|
||||
.global _start
|
||||
|
||||
_start:
|
||||
bsr 0f
|
||||
nop
|
||||
.long _start
|
||||
|
||||
/* GERMS -- The "standard-32" configuration GERMS monitor looks
|
||||
* for the string "Nios" at flash_base + 0xc (actually it only
|
||||
* tests for 'N', 'i'). You can leave support for this in place
|
||||
* as it's only a few words.
|
||||
*/
|
||||
. = _start + 0x000c
|
||||
.string "Nios"
|
||||
|
||||
.align 4
|
||||
0:
|
||||
/*
|
||||
* Early setup -- set cwp = HI_LIMIT, IPRI = 2, IE = 1 to
|
||||
* enable underflow exceptions. Disable cache.
|
||||
* NOTE: %o7 has return addr -- save in %g7 use later.
|
||||
*/
|
||||
mov %g7, %o7
|
||||
|
||||
pfx 2 /* WVALID */
|
||||
rdctl %g0
|
||||
lsri %g0, 1
|
||||
pfx %hi(STATUS_INIT)
|
||||
or %g0, %lo(STATUS_INIT)
|
||||
wrctl %g0 /* update status */
|
||||
nop
|
||||
|
||||
/*
|
||||
* STACK
|
||||
*/
|
||||
pfx %hi(CONFIG_SYS_INIT_SP)
|
||||
movi %sp, %lo(CONFIG_SYS_INIT_SP)
|
||||
pfx %xhi(CONFIG_SYS_INIT_SP)
|
||||
movhi %sp, %xlo(CONFIG_SYS_INIT_SP)
|
||||
mov %fp, %sp
|
||||
|
||||
pfx %hi(4*16)
|
||||
subi %sp, %lo(4*16) /* Space for reg window mgmt */
|
||||
|
||||
/*
|
||||
* RELOCATE -- %g7 has return addr from bsr at _start.
|
||||
*/
|
||||
pfx %hi(__u_boot_cmd_end)
|
||||
movi %g5, %lo(__u_boot_cmd_end)
|
||||
pfx %xhi(__u_boot_cmd_end)
|
||||
movhi %g5, %xlo(__u_boot_cmd_end) /* %g5 <- end address */
|
||||
|
||||
lsli %g7, 1 /* mem = retaddr << 1 */
|
||||
mov %g6, %g7
|
||||
subi %g6, 4 /* %g6 <- src addr */
|
||||
ld %g7, [%g7] /* %g7 <- dst addr */
|
||||
|
||||
/* No need to move text sections if we're already located
|
||||
* at the proper address.
|
||||
*/
|
||||
cmp %g7, %g6
|
||||
ifs cc_z
|
||||
br reloc
|
||||
nop /* delay slot */
|
||||
|
||||
1: cmp %g7, %g5
|
||||
skps cc_nz
|
||||
br 2f
|
||||
nop /* delay slot */
|
||||
|
||||
ld %g0, [%g6]
|
||||
addi %g6, 4 /* src++ */
|
||||
st [%g7], %g0
|
||||
addi %g7, 4 /* dst++ */
|
||||
br 1b
|
||||
nop /* delay slot */
|
||||
2:
|
||||
|
||||
/*
|
||||
* Jump to relocation address
|
||||
*/
|
||||
pfx %hi(reloc@h)
|
||||
movi %g0, %lo(reloc@h)
|
||||
pfx %xhi(reloc@h)
|
||||
movhi %g0, %xlo(reloc@h)
|
||||
jmp %g0
|
||||
nop /* delay slot */
|
||||
reloc:
|
||||
|
||||
/*
|
||||
* CLEAR BSS
|
||||
*/
|
||||
pfx %hi(__bss_end)
|
||||
movi %g5, %lo(__bss_end)
|
||||
pfx %xhi(__bss_end)
|
||||
movhi %g5, %xlo(__bss_end) /* %g5 <- end address */
|
||||
pfx %hi(__bss_start)
|
||||
movi %g7, %lo(__bss_start)
|
||||
pfx %xhi(__bss_start)
|
||||
movhi %g7, %xlo(__bss_start) /* %g7 <- end address */
|
||||
|
||||
movi %g0, 0
|
||||
3: cmp %g7, %g5
|
||||
skps cc_nz
|
||||
br 4f
|
||||
nop /* delay slot */
|
||||
|
||||
st [%g7], %g0
|
||||
addi %g7, 4 /* (delay slot) dst++ */
|
||||
br 3b
|
||||
nop /* delay slot */
|
||||
4:
|
||||
|
||||
/*
|
||||
* INIT VECTOR TABLE
|
||||
*/
|
||||
pfx %hi(CONFIG_SYS_VECT_BASE)
|
||||
movi %g0, %lo(CONFIG_SYS_VECT_BASE)
|
||||
pfx %xhi(CONFIG_SYS_VECT_BASE)
|
||||
movhi %g0, %xlo(CONFIG_SYS_VECT_BASE) /* dst */
|
||||
mov %l0, %g0
|
||||
|
||||
pfx %hi(_vectors)
|
||||
movi %g1, %lo(_vectors)
|
||||
pfx %xhi(_vectors)
|
||||
movhi %g1, %xlo(_vectors) /* src */
|
||||
bgen %g2, 6 /* cnt = 64 */
|
||||
|
||||
ldp %g3, [%l0, 3] /* bkpt vector */
|
||||
ldp %g4, [%l0, 4] /* single step vector */
|
||||
|
||||
5: ld %g7, [%g1]
|
||||
addi %g1, 4 /* src++ */
|
||||
st [%g0], %g7
|
||||
addi %g0, 4 /* dst++ */
|
||||
|
||||
subi %g2, 1 /* cnt-- */
|
||||
ifrnz %g2
|
||||
br 5b
|
||||
nop /* delay slot */
|
||||
|
||||
#if defined(CONFIG_ROM_STUBS)
|
||||
/* Restore the breakpoint and single step exception
|
||||
* vectors to their original values.
|
||||
*/
|
||||
stp [%l0,3], %g3 /* breakpoint */
|
||||
stp [%l0,4], %g4 /* single step */
|
||||
#endif
|
||||
|
||||
/* For debug startup convenience ... software breakpoints
|
||||
* set prior to this point may not succeed ;-)
|
||||
*/
|
||||
.global __start
|
||||
__start:
|
||||
|
||||
/*
|
||||
* Call board_init -- never returns
|
||||
*/
|
||||
pfx %hi(board_init@h)
|
||||
movi %g1, %lo(board_init@h)
|
||||
pfx %xhi(board_init@h)
|
||||
movhi %g1, %xlo(board_init@h)
|
||||
call %g1
|
||||
nop /* Delaly slot */
|
||||
/* NEVER RETURNS */
|
||||
|
||||
/*
|
||||
* dly_clks -- Nios doesn't have a time/clk reference for simple
|
||||
* delay loops, so we do our best by counting instruction cycles.
|
||||
* A control register that counts system clock cycles would be
|
||||
* a handy feature -- hint for Altera ;-)
|
||||
*/
|
||||
.globl dly_clks
|
||||
/* Each loop is 4 instructions as delay slot is always
|
||||
* executed. Each instruction is approximately 4 clocks
|
||||
* (according to some lame info from Altera). So ...
|
||||
* ... each loop is about 16 clocks.
|
||||
*/
|
||||
|
||||
dly_clks:
|
||||
lsri %o0, 4 /* cnt/16 */
|
||||
|
||||
8: skprnz %o0
|
||||
br 9f
|
||||
subi %o0, 1 /* cnt--, Delay slot */
|
||||
br 8b
|
||||
nop
|
||||
|
||||
9: lret
|
||||
nop /* Delay slot */
|
||||
|
||||
|
||||
.data
|
||||
.globl version_string
|
||||
|
||||
version_string:
|
||||
.ascii U_BOOT_VERSION
|
||||
.ascii " (", U_BOOT_DATE, " - ", U_BOOT_TIME, ")"
|
||||
.ascii CONFIG_IDENT_STRING, "\0"
|
||||
@@ -1,582 +0,0 @@
|
||||
/*
|
||||
* (C) Copyright 2003, Psyent Corporation <www.psyent.com>
|
||||
* Scott McNutt <smcnutt@psyent.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>
|
||||
|
||||
/*************************************************************************
|
||||
* Register window underflow
|
||||
*
|
||||
* The register window underflow exception occurs whenever the lowest
|
||||
* valid register window is in use (CWP=LO_LIMIT) and a save instruction
|
||||
* is issued. The save moves CWP below LO_LIMIT, %sp is set as normal,
|
||||
* then the exception is generated prior to executing the instruction
|
||||
* after the save.
|
||||
************************************************************************/
|
||||
.text
|
||||
.global _cwp_lolimit
|
||||
.align 4
|
||||
|
||||
_cwp_lolimit:
|
||||
|
||||
/* Sixteen words are always allocated by the compiler in every
|
||||
* procedure's stack frame, always starting at %sp, for saving
|
||||
* 'in' and 'local' registers on a window overflow.
|
||||
*
|
||||
* Save the 'global' and 'in' regs on stack. They are restored
|
||||
* at cwp = HI_LIMIT. The 'local' regs aren't in-use at this point.
|
||||
*/
|
||||
sts [%sp,0], %g0 /* Save 'global' regs*/
|
||||
sts [%sp,1], %g1
|
||||
sts [%sp,2], %g2
|
||||
sts [%sp,3], %g3
|
||||
sts [%sp,4], %g4
|
||||
sts [%sp,5], %g5
|
||||
sts [%sp,6], %g6
|
||||
sts [%sp,7], %g7
|
||||
|
||||
sts [%sp,8], %i0 /* Save 'in' regs */
|
||||
sts [%sp,9], %i1
|
||||
sts [%sp,10], %i2
|
||||
sts [%sp,11], %i3
|
||||
sts [%sp,12], %i4
|
||||
sts [%sp,13], %i5
|
||||
sts [%sp,14], %i6
|
||||
sts [%sp,15], %i7
|
||||
|
||||
/* Save current %sp and return address in a global so they are
|
||||
* available at cwp = HI_LIMIT ... where the 'global'/'in' regs
|
||||
* are restored. NOTE: %sp changes with cwp.
|
||||
*/
|
||||
mov %g7, %o7
|
||||
mov %g6, %sp
|
||||
|
||||
/* Get LO_LIMIT/HI_LIMIT to know where to start & stop. Note: in
|
||||
* the underflow exception, cwp is __NOT__ guaranteed to be zero.
|
||||
* If the OCI debug module is enabled the reset value for LO_LIMIT
|
||||
* is 2, not 1 -- so cwp can be 1 or 0.
|
||||
*/
|
||||
pfx 2 /* WVALID */
|
||||
rdctl %g1
|
||||
mov %g2, %g1
|
||||
pfx 0
|
||||
and %g1, 0x1f /* g1 <- LO_LIMIT */
|
||||
lsri %g2, 5
|
||||
pfx 0
|
||||
and %g2,0x1f /* g2 <- HI_LIMIT */
|
||||
|
||||
/* Set istatus so cwp = HI_LIMIT after tret
|
||||
*/
|
||||
movi %g5, 0x1f
|
||||
lsli %g5, 4
|
||||
not %g5 /* mask to clr cwp */
|
||||
pfx 1 /* istatus */
|
||||
rdctl %g0
|
||||
and %g0, %g5 /* clear cwp field */
|
||||
|
||||
mov %g4, %g2
|
||||
lsli %g4, 4
|
||||
or %g0, %g4 /* cwp = HI_LIMIT */
|
||||
pfx 1
|
||||
wrctl %g0 /* update istatus */
|
||||
|
||||
/* Now move up the register file, saving as we go. When loop
|
||||
* is first entered, %g1 is at LO_LIMIT.
|
||||
*/
|
||||
0:
|
||||
restore /* cwp++ */
|
||||
sts [%sp,0], %l0 /* Save "local" regs*/
|
||||
sts [%sp,1], %l1
|
||||
sts [%sp,2], %l2
|
||||
sts [%sp,3], %l3
|
||||
sts [%sp,4], %l4
|
||||
sts [%sp,5], %l5
|
||||
sts [%sp,6], %l6
|
||||
sts [%sp,7], %l7
|
||||
|
||||
sts [%sp,8], %i0 /* Save 'in' regs */
|
||||
sts [%sp,9], %i1
|
||||
sts [%sp,10], %i2
|
||||
sts [%sp,11], %i3
|
||||
sts [%sp,12], %i4
|
||||
sts [%sp,13], %i5
|
||||
sts [%sp,14], %i6
|
||||
sts [%sp,15], %i7
|
||||
|
||||
cmp %g1, %g2 /* cwp == HI_LIMIT ? */
|
||||
skps cc_ne /* if so, we're done */
|
||||
br 1f
|
||||
nop /* delay slot */
|
||||
|
||||
inc %g1 /* g1 <- cwp++ */
|
||||
br 0b
|
||||
nop /* delay slot */
|
||||
|
||||
/* At this point cwp = HI_LIMIT, so the global/in regs that were
|
||||
* in place when the underflow occurred must be restored using
|
||||
* the original stack pointer (saved in g6).
|
||||
*/
|
||||
1:
|
||||
mov %o7, %g7 /* restore return addr */
|
||||
mov %sp, %g6 /* Restore original sp */
|
||||
|
||||
lds %g0, [%sp,0] /* Restore 'global' regs*/
|
||||
lds %g1, [%sp,1]
|
||||
lds %g2, [%sp,2]
|
||||
lds %g3, [%sp,3]
|
||||
lds %g4, [%sp,4]
|
||||
lds %g5, [%sp,5]
|
||||
lds %g6, [%sp,6]
|
||||
lds %g7, [%sp,7]
|
||||
|
||||
lds %i0, [%sp,8] /* Restore 'in' regs*/
|
||||
lds %i1, [%sp,9]
|
||||
lds %i2, [%sp,10]
|
||||
lds %i3, [%sp,11]
|
||||
lds %i4, [%sp,12]
|
||||
lds %i5, [%sp,13]
|
||||
lds %i6, [%sp,14]
|
||||
lds %i7, [%sp,15]
|
||||
|
||||
tret %o7 /* All done */
|
||||
|
||||
/*************************************************************************
|
||||
* Register window overflow
|
||||
*
|
||||
* The register window overflow exception occurs whenever the highest
|
||||
* valid register window is in use (cwp = HI_LIMIT) and a restore
|
||||
* instruction is issued. Control is transferred to the overflow handler
|
||||
* before the instruction following restore is executed.
|
||||
*
|
||||
* When a register window overflow exception is taken, the exception
|
||||
* handler sees cwp at HI_LIMIT.
|
||||
************************************************************************/
|
||||
.text
|
||||
.global _cwp_hilimit
|
||||
.align 4
|
||||
|
||||
_cwp_hilimit:
|
||||
|
||||
/* Save 'global'/'in' regs on the stack -- will restore when cwp
|
||||
* is at LO_LIMIT. Locals don't need saving as they are going away.
|
||||
*/
|
||||
sts [%sp,0], %g0 /* Save "global" regs*/
|
||||
sts [%sp,1], %g1
|
||||
sts [%sp,2], %g2
|
||||
sts [%sp,3], %g3
|
||||
sts [%sp,4], %g4
|
||||
sts [%sp,5], %g5
|
||||
sts [%sp,6], %g6
|
||||
sts [%sp,7], %g7
|
||||
|
||||
sts [%sp,8], %i0 /* Save 'in' regs */
|
||||
sts [%sp,9], %i1
|
||||
sts [%sp,10], %i2
|
||||
sts [%sp,11], %i3
|
||||
sts [%sp,12], %i4
|
||||
sts [%sp,13], %i5
|
||||
sts [%sp,14], %i6
|
||||
sts [%sp,15], %i7
|
||||
|
||||
/* The current %sp must be available in global to restore regs
|
||||
* saved on stack. Need return addr as well ;-)
|
||||
*/
|
||||
mov %g7, %o7
|
||||
mov %g6, %sp
|
||||
|
||||
/* Get HI_LIMIT & LO_LIMIT
|
||||
*/
|
||||
pfx 2 /* WVALID */
|
||||
rdctl %g1
|
||||
mov %g2, %g1
|
||||
pfx 0
|
||||
and %g1, 0x1f /* g1 <- LO_LIMIT */
|
||||
lsri %g2, 5
|
||||
pfx 0
|
||||
and %g2,0x1f /* g2 <- HI_LIMIT */
|
||||
|
||||
/* Set istatus so cwp = LO_LIMIT after tret
|
||||
*/
|
||||
movi %g5, 0x1f
|
||||
lsli %g5, 4
|
||||
not %g5 /* mask to clr cwp */
|
||||
pfx 1 /* istatus */
|
||||
rdctl %g0
|
||||
and %g0, %g5 /* clear cwp field */
|
||||
|
||||
mov %g4, %g1 /* g4 <- LO_LIMIT */
|
||||
lsli %g4, 4
|
||||
or %g0, %g4 /* cwp = LO_LIMIT */
|
||||
pfx 1
|
||||
wrctl %g0 /* update istatus */
|
||||
|
||||
/* Move to cwp = LO_LIMIT-1 and restore 'in' regs.
|
||||
*/
|
||||
subi %g4,(1 << 4) /* g4 <- LO_LIMIT - 1 */
|
||||
rdctl %g0
|
||||
and %g0, %g5 /* clear cwp field */
|
||||
or %g0, %g4 /* cwp = LO_LIMIT - 1 */
|
||||
wrctl %g0 /* update status */
|
||||
nop
|
||||
|
||||
mov %sp, %g6 /* Restore sp */
|
||||
lds %i0, [%sp,8] /* Restore 'in' regs */
|
||||
lds %i1, [%sp,9]
|
||||
lds %i2, [%sp,10]
|
||||
lds %i3, [%sp,11]
|
||||
lds %i4, [%sp,12]
|
||||
lds %i5, [%sp,13]
|
||||
lds %i6, [%sp,14] /* sp in next window */
|
||||
lds %i7, [%sp,15]
|
||||
|
||||
/* Starting at LO_LIMIT-1, move up the register file, restoring
|
||||
* along the way.
|
||||
*/
|
||||
0:
|
||||
restore /* cwp++ */
|
||||
lds %l0, [%sp,0] /* Restore 'local' regs*/
|
||||
lds %l1, [%sp,1]
|
||||
lds %l2, [%sp,2]
|
||||
lds %l3, [%sp,3]
|
||||
lds %l4, [%sp,4]
|
||||
lds %l5, [%sp,5]
|
||||
lds %l6, [%sp,6]
|
||||
lds %l7, [%sp,7]
|
||||
|
||||
lds %i0, [%sp,8] /* Restore 'in' regs */
|
||||
lds %i1, [%sp,9]
|
||||
lds %i2, [%sp,10]
|
||||
lds %i3, [%sp,11]
|
||||
lds %i4, [%sp,12]
|
||||
lds %i5, [%sp,13]
|
||||
lds %i6, [%sp,14] /* sp in next window */
|
||||
lds %i7, [%sp,15]
|
||||
|
||||
cmp %g1, %g2 /* cwp == HI_LIMIT ? */
|
||||
skps cc_ne /* if so, we're done */
|
||||
br 1f
|
||||
nop /* delay slot */
|
||||
|
||||
inc %g1 /* cwp++ */
|
||||
br 0b
|
||||
nop /* delay slot */
|
||||
|
||||
/* All windows have been updated at this point, but the globals
|
||||
* still need to be restored. Go to cwp = LO_LIMIT-1 to get
|
||||
* some registers to use.
|
||||
*/
|
||||
1:
|
||||
rdctl %g0
|
||||
and %g0, %g5 /* clear cwp field */
|
||||
or %g0, %g4 /* cwp = LO_LIMIT - 1 */
|
||||
wrctl %g0 /* update status */
|
||||
nop
|
||||
|
||||
/* Now there are some registers available to use in restoring
|
||||
* the globals.
|
||||
*/
|
||||
mov %sp, %g6
|
||||
mov %o7, %g7
|
||||
|
||||
lds %g0, [%sp,0] /* Restore "global" regs*/
|
||||
lds %g1, [%sp,1]
|
||||
lds %g2, [%sp,2]
|
||||
lds %g3, [%sp,3]
|
||||
lds %g4, [%sp,4]
|
||||
lds %g5, [%sp,5]
|
||||
lds %g6, [%sp,6]
|
||||
lds %g7, [%sp,7]
|
||||
|
||||
/* The tret moves istatus -> status. istatus was already set for
|
||||
* cwp = LO_LIMIT.
|
||||
*/
|
||||
|
||||
tret %o7 /* done */
|
||||
|
||||
/*************************************************************************
|
||||
* Default exception handler
|
||||
*
|
||||
* The default handler passes control to external_interrupt(). So trap
|
||||
* or hardware interrupt hanlders can be installed using the familiar
|
||||
* irq_install_handler().
|
||||
*
|
||||
* Here, the stack is fixed-up and cwp is incremented prior to calling
|
||||
* external_interrupt(). This lets the underflow and overflow handlers
|
||||
* operate normally during the exception.
|
||||
************************************************************************/
|
||||
.text
|
||||
.global _def_xhandler
|
||||
.align 4
|
||||
|
||||
_def_xhandler:
|
||||
|
||||
/* Allocate some stack space: 16 words at %sp to accomodate
|
||||
* a reg window underflow, 8 words to save interrupted task's
|
||||
* 'out' regs (which are now the 'in' regs), 8 words to preserve
|
||||
* the 'global' regs and 3 words to save the return address,
|
||||
* status and istatus. istatus must be saved in the event an
|
||||
* underflow occurs in a dispatched handler. status is saved so
|
||||
* a handler can access it on stack.
|
||||
*/
|
||||
pfx %hi((16+16+3) * 4)
|
||||
subi %fp, %lo((16+16+3) * 4)
|
||||
mov %sp, %fp
|
||||
|
||||
/* Save the 'global' regs and the interrupted task's 'out' regs
|
||||
* (our 'in' regs) along with the return addr, status & istatus.
|
||||
* First 16 words are for underflow exception.
|
||||
*/
|
||||
rdctl %l0 /* status */
|
||||
pfx 1 /* istatus */
|
||||
rdctl %l1
|
||||
|
||||
sts [%sp,16+0], %g0 /* Save 'global' regs*/
|
||||
sts [%sp,16+1], %g1
|
||||
sts [%sp,16+2], %g2
|
||||
sts [%sp,16+3], %g3
|
||||
sts [%sp,16+4], %g4
|
||||
sts [%sp,16+5], %g5
|
||||
sts [%sp,16+6], %g6
|
||||
sts [%sp,16+7], %g7
|
||||
|
||||
sts [%sp,16+8], %i0 /* Save 'in' regs */
|
||||
sts [%sp,16+9], %i1
|
||||
sts [%sp,16+10], %i2
|
||||
sts [%sp,16+11], %i3
|
||||
sts [%sp,16+12], %i4
|
||||
sts [%sp,16+13], %i5
|
||||
sts [%sp,16+14], %i6
|
||||
sts [%sp,16+15], %i7
|
||||
|
||||
sts [%sp,16+16], %l0 /* status */
|
||||
sts [%sp,16+17], %l1 /* istatus */
|
||||
sts [%sp,16+18], %o7 /* return addr */
|
||||
|
||||
/* Move to cwp+1 ... this guarantees cwp is at or above LO_LIMIT.
|
||||
* Need to set IPRI=3 and IE=1 to enable underflow exceptions.
|
||||
* NOTE: only the 'out' regs have been saved ... can't touch
|
||||
* the 'in' or 'local' here.
|
||||
*/
|
||||
restore /* cwp++ */
|
||||
rdctl %o0 /* o0 <- status */
|
||||
|
||||
pfx %hi(0x7e00)
|
||||
movi %o1, %lo(0x7e00)
|
||||
not %o1
|
||||
and %o0, %o1 /* clear IPRI */
|
||||
|
||||
pfx %hi(0x8600)
|
||||
movi %o1, %lo(0x8600)
|
||||
or %o0, %o1 /* IPRI=3, IE=1 */
|
||||
|
||||
wrctl %o0 /* o0 -> status */
|
||||
nop
|
||||
|
||||
/* It's ok to call a C routine now since cwp >= LO_LIMIT,
|
||||
* interrupt task's registers are/will be preserved, and
|
||||
* underflow exceptions can be handled.
|
||||
*/
|
||||
pfx %hi(external_interrupt@h)
|
||||
movi %o1, %lo(external_interrupt@h)
|
||||
pfx %xhi(external_interrupt@h)
|
||||
movhi %o1, %xlo(external_interrupt@h)
|
||||
bgen %o0, 4+2 /* 16 * 4 */
|
||||
add %o0, %sp /* Ptr to regs */
|
||||
call %o1
|
||||
nop
|
||||
|
||||
/* Move back to the exception register window, restore the 'out'
|
||||
* registers, then return from exception.
|
||||
*/
|
||||
rdctl %o0 /* o0 <- status */
|
||||
subi %o0, 16
|
||||
wrctl %o0 /* cwp-- */
|
||||
nop
|
||||
|
||||
mov %sp, %fp
|
||||
lds %g0, [%sp,16+0] /* Restore 'global' regs*/
|
||||
lds %g1, [%sp,16+1]
|
||||
lds %g2, [%sp,16+2]
|
||||
lds %g3, [%sp,16+3]
|
||||
lds %g4, [%sp,16+4]
|
||||
lds %g5, [%sp,16+5]
|
||||
lds %g6, [%sp,16+6]
|
||||
lds %g7, [%sp,16+7]
|
||||
|
||||
lds %i0, [%sp,16+8] /* Restore 'in' regs*/
|
||||
lds %i1, [%sp,16+9]
|
||||
lds %i2, [%sp,16+10]
|
||||
lds %i3, [%sp,16+11]
|
||||
lds %i4, [%sp,16+12]
|
||||
lds %i5, [%sp,16+13]
|
||||
lds %i6, [%sp,16+14]
|
||||
lds %i7, [%sp,16+15]
|
||||
|
||||
lds %l0, [%sp,16+16] /* status */
|
||||
lds %l1, [%sp,16+17] /* istatus */
|
||||
lds %o7, [%sp,16+18] /* return addr */
|
||||
|
||||
pfx 1
|
||||
wrctl %l1 /* restore istatus */
|
||||
|
||||
pfx %hi((16+16+3) * 4)
|
||||
addi %sp, %lo((16+16+3) * 4)
|
||||
mov %fp, %sp
|
||||
|
||||
tret %o7 /* Done */
|
||||
|
||||
|
||||
/*************************************************************************
|
||||
* Timebase Timer Interrupt -- This has identical structure to above,
|
||||
* but calls timer_interrupt(). Doing it this way keeps things similar
|
||||
* to other architectures (e.g. ppc).
|
||||
************************************************************************/
|
||||
.text
|
||||
.global _timebase_int
|
||||
.align 4
|
||||
|
||||
_timebase_int:
|
||||
|
||||
/* Allocate stack space.
|
||||
*/
|
||||
pfx %hi((16+16+3) * 4)
|
||||
subi %fp, %lo((16+16+3) * 4)
|
||||
mov %sp, %fp
|
||||
|
||||
/* Save the 'global' regs & 'out' regs (our 'in' regs)
|
||||
*/
|
||||
rdctl %l0 /* status */
|
||||
pfx 1 /* istatus */
|
||||
rdctl %l1
|
||||
|
||||
sts [%sp,16+0], %g0 /* Save 'global' regs*/
|
||||
sts [%sp,16+1], %g1
|
||||
sts [%sp,16+2], %g2
|
||||
sts [%sp,16+3], %g3
|
||||
sts [%sp,16+4], %g4
|
||||
sts [%sp,16+5], %g5
|
||||
sts [%sp,16+6], %g6
|
||||
sts [%sp,16+7], %g7
|
||||
|
||||
sts [%sp,16+8], %i0 /* Save 'in' regs */
|
||||
sts [%sp,16+9], %i1
|
||||
sts [%sp,16+10], %i2
|
||||
sts [%sp,16+11], %i3
|
||||
sts [%sp,16+12], %i4
|
||||
sts [%sp,16+13], %i5
|
||||
sts [%sp,16+14], %i6
|
||||
sts [%sp,16+15], %i7
|
||||
|
||||
sts [%sp,16+16], %l0 /* status */
|
||||
sts [%sp,16+17], %l1 /* istatus */
|
||||
sts [%sp,16+18], %o7 /* return addr */
|
||||
|
||||
/* Move to cwp+1.
|
||||
*/
|
||||
restore /* cwp++ */
|
||||
rdctl %o0 /* o0 <- status */
|
||||
|
||||
pfx %hi(0x7e00)
|
||||
movi %o1, %lo(0x7e00)
|
||||
not %o1
|
||||
and %o0, %o1 /* clear IPRI */
|
||||
|
||||
pfx %hi(0x8600)
|
||||
movi %o1, %lo(0x8600)
|
||||
or %o0, %o1 /* IPRI=3, IE=1 */
|
||||
|
||||
wrctl %o0 /* o0 -> status */
|
||||
nop
|
||||
|
||||
/* Call timer_interrupt()
|
||||
*/
|
||||
pfx %hi(timer_interrupt@h)
|
||||
movi %o1, %lo(timer_interrupt@h)
|
||||
pfx %xhi(timer_interrupt@h)
|
||||
movhi %o1, %xlo(timer_interrupt@h)
|
||||
bgen %o0, 4+2 /* 16 * 4 */
|
||||
add %o0, %sp /* Ptr to regs */
|
||||
call %o1
|
||||
nop
|
||||
|
||||
/* Move back to the exception register window, restore the 'out'
|
||||
* registers, then return from exception.
|
||||
*/
|
||||
rdctl %o0 /* o0 <- status */
|
||||
subi %o0, 16
|
||||
wrctl %o0 /* cwp-- */
|
||||
nop
|
||||
|
||||
mov %sp, %fp
|
||||
lds %g0, [%sp,16+0] /* Restore 'global' regs*/
|
||||
lds %g1, [%sp,16+1]
|
||||
lds %g2, [%sp,16+2]
|
||||
lds %g3, [%sp,16+3]
|
||||
lds %g4, [%sp,16+4]
|
||||
lds %g5, [%sp,16+5]
|
||||
lds %g6, [%sp,16+6]
|
||||
lds %g7, [%sp,16+7]
|
||||
|
||||
lds %i0, [%sp,16+8] /* Restore 'in' regs*/
|
||||
lds %i1, [%sp,16+9]
|
||||
lds %i2, [%sp,16+10]
|
||||
lds %i3, [%sp,16+11]
|
||||
lds %i4, [%sp,16+12]
|
||||
lds %i5, [%sp,16+13]
|
||||
lds %i6, [%sp,16+14]
|
||||
lds %i7, [%sp,16+15]
|
||||
|
||||
lds %l0, [%sp,16+16] /* status */
|
||||
lds %l1, [%sp,16+17] /* istatus */
|
||||
lds %o7, [%sp,16+18] /* return addr */
|
||||
|
||||
pfx 1
|
||||
wrctl %l1 /* restore istatus */
|
||||
|
||||
pfx %hi((16+16+3) * 4)
|
||||
addi %sp, %lo((16+16+3) * 4)
|
||||
mov %fp, %sp
|
||||
|
||||
tret %o7 /* Done */
|
||||
|
||||
/*************************************************************************
|
||||
* GDB stubs
|
||||
************************************************************************/
|
||||
.text
|
||||
.global _brkpt_hw_int, _brkpt_sw_int
|
||||
.align 4
|
||||
|
||||
_brkpt_hw_int:
|
||||
movi %l1, 9
|
||||
pfx 3
|
||||
wrctl %l1
|
||||
pfx 4
|
||||
wrctl %l1
|
||||
|
||||
_brkpt_sw_int:
|
||||
movi %l1, 9
|
||||
pfx 3
|
||||
wrctl %l1
|
||||
pfx 4
|
||||
wrctl %l1
|
||||
|
||||
tret %o7
|
||||
@@ -1,38 +0,0 @@
|
||||
/*
|
||||
* (C) Copyright 2003, Psyent Corporation <www.psyent.com>
|
||||
* Scott McNutt <smcnutt@psyent.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
|
||||
*/
|
||||
|
||||
#ifndef _ASM_NIOS_BITOPS_H_
|
||||
#define _ASM_NIOS_BITOPS_H_
|
||||
|
||||
|
||||
extern void set_bit(int nr, volatile void * a);
|
||||
extern void clear_bit(int nr, volatile void * a);
|
||||
extern int test_and_clear_bit(int nr, volatile void * a);
|
||||
extern void change_bit(unsigned long nr, volatile void *addr);
|
||||
extern int test_and_set_bit(int nr, volatile void * a);
|
||||
extern int test_and_change_bit(int nr, volatile void * addr);
|
||||
extern int test_bit(int nr, volatile void * a);
|
||||
extern int ffs(int i);
|
||||
#define PLATFORM_FFS
|
||||
|
||||
#endif /* _ASM_NIOS_BITOPS_H */
|
||||
@@ -1,30 +0,0 @@
|
||||
/*
|
||||
* (C) Copyright 2003, Psyent Corporation <www.psyent.com>
|
||||
* Scott McNutt <smcnutt@psyent.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
|
||||
*/
|
||||
|
||||
#ifndef __ASM_NIOS_BYTEORDER_H
|
||||
#define __ASM_NIOS_BYTEORDER_H
|
||||
|
||||
#include <asm/types.h>
|
||||
#include <linux/byteorder/little_endian.h>
|
||||
|
||||
#endif
|
||||
@@ -1 +0,0 @@
|
||||
/*FIXME: Implement this! */
|
||||
@@ -1,27 +0,0 @@
|
||||
/*
|
||||
* Copyright 2009 Freescale Semiconductor, Inc.
|
||||
*
|
||||
* 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
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _ASM_CONFIG_H_
|
||||
#define _ASM_CONFIG_H_
|
||||
|
||||
/* Relocation to SDRAM works on all NIOS boards */
|
||||
#define CONFIG_RELOC_FIXUP_WORKS
|
||||
|
||||
#endif
|
||||
@@ -1,54 +0,0 @@
|
||||
/*
|
||||
* (C) Copyright 2003, Psyent Corporation <www.psyent.com>
|
||||
* Scott McNutt <smcnutt@psyent.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
|
||||
*/
|
||||
|
||||
#ifndef __ASM_NIOS_GLOBALDATA_H
|
||||
#define __ASM_NIOS_GLOBALDATA_H
|
||||
|
||||
typedef struct global_data {
|
||||
bd_t *bd;
|
||||
unsigned long flags;
|
||||
unsigned long baudrate;
|
||||
unsigned long cpu_clk; /* CPU clock in Hz! */
|
||||
unsigned long have_console; /* serial_init() was called */
|
||||
phys_size_t ram_size; /* RAM size */
|
||||
unsigned long env_addr; /* Address of Environment struct */
|
||||
unsigned long env_valid; /* Checksum of Environment valid */
|
||||
#if defined(CONFIG_POST) || defined(CONFIG_LOGBUFFER)
|
||||
unsigned long post_log_word; /* Record POST activities */
|
||||
unsigned long post_init_f_time; /* When post_init_f started */
|
||||
#endif
|
||||
void **jt; /* Standalone app jump table */
|
||||
} gd_t;
|
||||
|
||||
/* flags */
|
||||
#define GD_FLG_RELOC 0x00001 /* Code was relocated to RAM */
|
||||
#define GD_FLG_DEVINIT 0x00002 /* Devices have been initialized */
|
||||
#define GD_FLG_SILENT 0x00004 /* Silent mode */
|
||||
#define GD_FLG_POSTFAIL 0x00008 /* Critical POST test failed */
|
||||
#define GD_FLG_POSTSTOP 0x00010 /* POST seqeunce aborted */
|
||||
#define GD_FLG_LOGINIT 0x00020 /* Log Buffer has been initialized */
|
||||
#define GD_FLG_DISABLE_CONSOLE 0x00040 /* Disable console (in & out) */
|
||||
|
||||
#define DECLARE_GLOBAL_DATA_PTR register gd_t *gd asm ("%g7")
|
||||
|
||||
#endif /* __ASM_NIOS_GLOBALDATA_H */
|
||||
@@ -1,141 +0,0 @@
|
||||
/*
|
||||
* (C) Copyright 2003, Psyent Corporation <www.psyent.com>
|
||||
* Scott McNutt <smcnutt@psyent.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
|
||||
*/
|
||||
#ifndef __ASM_NIOS_IO_H_
|
||||
#define __ASM_NIOS_IO_H_
|
||||
|
||||
#define __raw_writeb(v,a) (*(volatile unsigned char *)(a) = (v))
|
||||
#define __raw_writew(v,a) (*(volatile unsigned short *)(a) = (v))
|
||||
#define __raw_writel(v,a) (*(volatile unsigned int *)(a) = (v))
|
||||
|
||||
#define __raw_readb(a) (*(volatile unsigned char *)(a))
|
||||
#define __raw_readw(a) (*(volatile unsigned short *)(a))
|
||||
#define __raw_readl(a) (*(volatile unsigned int *)(a))
|
||||
|
||||
#define readb(addr)\
|
||||
({unsigned char val;\
|
||||
asm volatile( " pfxio 0 \n"\
|
||||
" ld %0, [%1] \n"\
|
||||
" ext8d %0, %1 \n"\
|
||||
:"=r"(val) : "r" (addr)); val;})
|
||||
|
||||
#define readw(addr)\
|
||||
({unsigned short val;\
|
||||
asm volatile( " pfxio 0 \n"\
|
||||
" ld %0, [%1] \n"\
|
||||
" ext16d %0, %1 \n"\
|
||||
:"=r"(val) : "r" (addr)); val;})
|
||||
|
||||
#define readl(addr)\
|
||||
({unsigned long val;\
|
||||
asm volatile( " pfxio 0 \n"\
|
||||
" ld %0, [%1] \n"\
|
||||
:"=r"(val) : "r" (addr)); val;})
|
||||
|
||||
#define writeb(addr,val)\
|
||||
asm volatile ( " fill8 %%r0, %1 \n"\
|
||||
" st8d [%0], %%r0 \n"\
|
||||
: : "r" (addr), "r" (val) : "r0")
|
||||
|
||||
#define writew(addr,val)\
|
||||
asm volatile ( " fill16 %%r0, %1 \n"\
|
||||
" st16d [%0], %%r0 \n"\
|
||||
: : "r" (addr), "r" (val) : "r0")
|
||||
|
||||
#define writel(addr,val)\
|
||||
asm volatile ( " st [%0], %1 \n"\
|
||||
: : "r" (addr), "r" (val))
|
||||
|
||||
#define inb(addr) readb(addr)
|
||||
#define inw(addr) readw(addr)
|
||||
#define inl(addr) readl(addr)
|
||||
#define outb(val,addr) writeb(addr,val)
|
||||
#define outw(val,addr) writew(addr,val)
|
||||
#define outl(val,addr) writel(addr,val)
|
||||
|
||||
static inline void insb (unsigned long port, void *dst, unsigned long count)
|
||||
{
|
||||
unsigned char *p = dst;
|
||||
while (count--) *p++ = inb (port);
|
||||
}
|
||||
static inline void insw (unsigned long port, void *dst, unsigned long count)
|
||||
{
|
||||
unsigned short *p = dst;
|
||||
while (count--) *p++ = inw (port);
|
||||
}
|
||||
static inline void insl (unsigned long port, void *dst, unsigned long count)
|
||||
{
|
||||
unsigned long *p = dst;
|
||||
while (count--) *p++ = inl (port);
|
||||
}
|
||||
|
||||
static inline void outsb (unsigned long port, const void *src, unsigned long count)
|
||||
{
|
||||
const unsigned char *p = src;
|
||||
while (count--) outb (*p++, port);
|
||||
}
|
||||
|
||||
static inline void outsw (unsigned long port, const void *src, unsigned long count)
|
||||
{
|
||||
const unsigned short *p = src;
|
||||
while (count--) outw (*p++, port);
|
||||
}
|
||||
static inline void outsl (unsigned long port, const void *src, unsigned long count)
|
||||
{
|
||||
const unsigned long *p = src;
|
||||
while (count--) outl (*p++, port);
|
||||
}
|
||||
|
||||
static inline void sync(void)
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* Given a physical address and a length, return a virtual address
|
||||
* that can be used to access the memory range with the caching
|
||||
* properties specified by "flags".
|
||||
*/
|
||||
#define MAP_NOCACHE (0)
|
||||
#define MAP_WRCOMBINE (0)
|
||||
#define MAP_WRBACK (0)
|
||||
#define MAP_WRTHROUGH (0)
|
||||
|
||||
static inline void *
|
||||
map_physmem(phys_addr_t paddr, unsigned long len, unsigned long flags)
|
||||
{
|
||||
return (void *)paddr;
|
||||
}
|
||||
|
||||
/*
|
||||
* Take down a mapping set up by map_physmem().
|
||||
*/
|
||||
static inline void unmap_physmem(void *vaddr, unsigned long flags)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
static inline phys_addr_t virt_to_phys(void * vaddr)
|
||||
{
|
||||
return (phys_addr_t)(vaddr);
|
||||
}
|
||||
|
||||
#endif /* __ASM_NIOS_IO_H_ */
|
||||
@@ -1,63 +0,0 @@
|
||||
#ifndef __ASM_NIOS_POSIX_TYPES_H
|
||||
#define __ASM_NIOS_POSIX_TYPES_H
|
||||
|
||||
/*
|
||||
* This file is generally used by user-level software, so you need to
|
||||
* be a little careful about namespace pollution etc. Also, we cannot
|
||||
* assume GCC is being used.
|
||||
*/
|
||||
|
||||
typedef unsigned short __kernel_dev_t;
|
||||
typedef unsigned long __kernel_ino_t;
|
||||
typedef unsigned short __kernel_mode_t;
|
||||
typedef unsigned short __kernel_nlink_t;
|
||||
typedef long __kernel_off_t;
|
||||
typedef int __kernel_pid_t;
|
||||
typedef unsigned short __kernel_ipc_pid_t;
|
||||
typedef unsigned short __kernel_uid_t;
|
||||
typedef unsigned short __kernel_gid_t;
|
||||
typedef unsigned long __kernel_size_t;
|
||||
typedef int __kernel_ssize_t;
|
||||
typedef int __kernel_ptrdiff_t;
|
||||
typedef long __kernel_time_t;
|
||||
typedef long __kernel_suseconds_t;
|
||||
typedef long __kernel_clock_t;
|
||||
typedef int __kernel_daddr_t;
|
||||
typedef char * __kernel_caddr_t;
|
||||
typedef unsigned short __kernel_uid16_t;
|
||||
typedef unsigned short __kernel_gid16_t;
|
||||
typedef unsigned int __kernel_uid32_t;
|
||||
typedef unsigned int __kernel_gid32_t;
|
||||
|
||||
typedef unsigned short __kernel_old_uid_t;
|
||||
typedef unsigned short __kernel_old_gid_t;
|
||||
|
||||
#ifdef __GNUC__
|
||||
typedef long long __kernel_loff_t;
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
#if defined(__KERNEL__) || defined(__USE_ALL)
|
||||
int val[2];
|
||||
#else /* !defined(__KERNEL__) && !defined(__USE_ALL) */
|
||||
int __val[2];
|
||||
#endif /* !defined(__KERNEL__) && !defined(__USE_ALL) */
|
||||
} __kernel_fsid_t;
|
||||
|
||||
#if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2)
|
||||
|
||||
#undef __FD_SET
|
||||
#define __FD_SET(d, set) ((set)->fds_bits[__FDELT(d)] |= __FDMASK(d))
|
||||
|
||||
#undef __FD_CLR
|
||||
#define __FD_CLR(d, set) ((set)->fds_bits[__FDELT(d)] &= ~__FDMASK(d))
|
||||
|
||||
#undef __FD_ISSET
|
||||
#define __FD_ISSET(d, set) ((set)->fds_bits[__FDELT(d)] & __FDMASK(d))
|
||||
|
||||
#undef __FD_ZERO
|
||||
#define __FD_ZERO(fdsetp) (memset (fdsetp, 0, sizeof(*(fd_set *)fdsetp)))
|
||||
|
||||
#endif /* defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) */
|
||||
|
||||
#endif
|
||||
@@ -1 +0,0 @@
|
||||
/* FIXME: Implement this! */
|
||||
@@ -1,36 +0,0 @@
|
||||
/*
|
||||
* (C) Copyright 2003, Psyent Corporation <www.psyent.com>
|
||||
* Scott McNutt <smcnutt@psyent.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
|
||||
*/
|
||||
|
||||
#ifndef _NIOS_PTRACE_H
|
||||
#define _NIOS_PTRACE_H
|
||||
|
||||
struct pt_regs {
|
||||
unsigned global[8];
|
||||
unsigned in[8];
|
||||
unsigned status;
|
||||
unsigned istatus;
|
||||
unsigned retaddr;
|
||||
};
|
||||
|
||||
|
||||
#endif /* _NIOS_PTRACE_H */
|
||||
@@ -1,132 +0,0 @@
|
||||
/*
|
||||
* (C) Copyright 2003, Li-Pro.Net <www.li-pro.net>
|
||||
* Stephan Linz <linz@li-pro.net>
|
||||
*
|
||||
* 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
|
||||
*
|
||||
* asm-nios/status_led.h
|
||||
*
|
||||
* NIOS PIO based status led support functions
|
||||
*/
|
||||
|
||||
#ifndef __ASM_STATUS_LED_H__
|
||||
#define __ASM_STATUS_LED_H__
|
||||
|
||||
#include <nios-io.h>
|
||||
|
||||
/* led_id_t is unsigned int mask */
|
||||
typedef unsigned int led_id_t;
|
||||
|
||||
#ifdef STATUS_LED_WRONLY /* emulate read access */
|
||||
static led_id_t __led_portval = 0;
|
||||
#endif
|
||||
|
||||
static inline void __led_init (led_id_t mask, int state)
|
||||
{
|
||||
nios_pio_t *piop = (nios_pio_t*)STATUS_LED_BASE;
|
||||
|
||||
#ifdef STATUS_LED_WRONLY /* emulate read access */
|
||||
|
||||
#if (STATUS_LED_ACTIVE == 0)
|
||||
if (state == STATUS_LED_ON)
|
||||
__led_portval &= ~mask;
|
||||
else
|
||||
__led_portval |= mask;
|
||||
#else
|
||||
if (state == STATUS_LED_ON)
|
||||
__led_portval |= mask;
|
||||
else
|
||||
__led_portval &= ~mask;
|
||||
#endif
|
||||
|
||||
piop->data = __led_portval;
|
||||
|
||||
#else /* !STATUS_LED_WRONLY */
|
||||
|
||||
#if (STATUS_LED_ACTIVE == 0)
|
||||
if (state == STATUS_LED_ON)
|
||||
piop->data &= ~mask;
|
||||
else
|
||||
piop->data |= mask;
|
||||
#else
|
||||
if (state == STATUS_LED_ON)
|
||||
piop->data |= mask;
|
||||
else
|
||||
piop->data &= ~mask;
|
||||
#endif
|
||||
|
||||
piop->direction |= mask;
|
||||
|
||||
#endif /* STATUS_LED_WRONLY */
|
||||
}
|
||||
|
||||
static inline void __led_toggle (led_id_t mask)
|
||||
{
|
||||
nios_pio_t *piop = (nios_pio_t*)STATUS_LED_BASE;
|
||||
|
||||
#ifdef STATUS_LED_WRONLY /* emulate read access */
|
||||
|
||||
__led_portval ^= mask;
|
||||
piop->data = __led_portval;
|
||||
|
||||
#else /* !STATUS_LED_WRONLY */
|
||||
|
||||
piop->data ^= mask;
|
||||
|
||||
#endif /* STATUS_LED_WRONLY */
|
||||
}
|
||||
|
||||
static inline void __led_set (led_id_t mask, int state)
|
||||
{
|
||||
nios_pio_t *piop = (nios_pio_t*)STATUS_LED_BASE;
|
||||
|
||||
#ifdef STATUS_LED_WRONLY /* emulate read access */
|
||||
|
||||
#if (STATUS_LED_ACTIVE == 0)
|
||||
if (state == STATUS_LED_ON)
|
||||
__led_portval &= ~mask;
|
||||
else
|
||||
__led_portval |= mask;
|
||||
#else
|
||||
if (state == STATUS_LED_ON)
|
||||
__led_portval |= mask;
|
||||
else
|
||||
__led_portval &= ~mask;
|
||||
#endif
|
||||
|
||||
piop->data = __led_portval;
|
||||
|
||||
#else /* !STATUS_LED_WRONLY */
|
||||
|
||||
#if (STATUS_LED_ACTIVE == 0)
|
||||
if (state == STATUS_LED_ON)
|
||||
piop->data &= ~mask;
|
||||
else
|
||||
piop->data |= mask;
|
||||
#else
|
||||
if (state == STATUS_LED_ON)
|
||||
piop->data |= mask;
|
||||
else
|
||||
piop->data &= ~mask;
|
||||
#endif
|
||||
|
||||
#endif /* STATUS_LED_WRONLY */
|
||||
}
|
||||
|
||||
#endif /* __ASM_STATUS_LED_H__ */
|
||||
@@ -1,25 +0,0 @@
|
||||
#ifndef __ASM_NIOS_STRING_H
|
||||
#define __ASM_NIOS_STRING_H
|
||||
|
||||
#undef __HAVE_ARCH_STRRCHR
|
||||
extern char * strrchr(const char * s, int c);
|
||||
|
||||
#undef __HAVE_ARCH_STRCHR
|
||||
extern char * strchr(const char * s, int c);
|
||||
|
||||
#undef __HAVE_ARCH_MEMCPY
|
||||
extern void * memcpy(void *, const void *, __kernel_size_t);
|
||||
|
||||
#undef __HAVE_ARCH_MEMMOVE
|
||||
extern void * memmove(void *, const void *, __kernel_size_t);
|
||||
|
||||
#undef __HAVE_ARCH_MEMCHR
|
||||
extern void * memchr(const void *, int, __kernel_size_t);
|
||||
|
||||
#undef __HAVE_ARCH_MEMSET
|
||||
extern void * memset(void *, int, __kernel_size_t);
|
||||
|
||||
#undef __HAVE_ARCH_MEMZERO
|
||||
extern void memzero(void *ptr, __kernel_size_t n);
|
||||
|
||||
#endif
|
||||
@@ -1,4 +0,0 @@
|
||||
#ifndef _ASM_NIOS_SYSTEM_H_
|
||||
#define _ASM_NIOS_SYSTEM_H_
|
||||
|
||||
#endif /* _ASM_NIOS_SYSTEM_H */
|
||||
@@ -1,60 +0,0 @@
|
||||
#ifndef _NIOS_TYPES_H
|
||||
#define _NIOS_TYPES_H
|
||||
|
||||
/*
|
||||
* This file is never included by application software unless
|
||||
* explicitly requested (e.g., via linux/types.h) in which case the
|
||||
* application is Linux specific so (user-) name space pollution is
|
||||
* not a major issue. However, for interoperability, libraries still
|
||||
* need to be careful to avoid a name clashes.
|
||||
*/
|
||||
|
||||
typedef unsigned short umode_t;
|
||||
|
||||
/*
|
||||
* __xx is ok: it doesn't pollute the POSIX namespace. Use these in the
|
||||
* header files exported to user space
|
||||
*/
|
||||
|
||||
typedef __signed__ char __s8;
|
||||
typedef unsigned char __u8;
|
||||
|
||||
typedef __signed__ short __s16;
|
||||
typedef unsigned short __u16;
|
||||
|
||||
typedef __signed__ int __s32;
|
||||
typedef unsigned int __u32;
|
||||
|
||||
#if defined(__GNUC__)
|
||||
__extension__ typedef __signed__ long long __s64;
|
||||
__extension__ typedef unsigned long long __u64;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* These aren't exported outside the kernel to avoid name space clashes
|
||||
*/
|
||||
#ifdef __KERNEL__
|
||||
|
||||
typedef signed char s8;
|
||||
typedef unsigned char u8;
|
||||
|
||||
typedef signed short s16;
|
||||
typedef unsigned short u16;
|
||||
|
||||
typedef signed int s32;
|
||||
typedef unsigned int u32;
|
||||
|
||||
typedef signed long long s64;
|
||||
typedef unsigned long long u64;
|
||||
|
||||
#define BITS_PER_LONG 32
|
||||
|
||||
/* Dma addresses are 32-bits wide. */
|
||||
|
||||
typedef u32 dma_addr_t;
|
||||
|
||||
typedef unsigned long phys_addr_t;
|
||||
typedef unsigned long phys_size_t;
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#endif /* _NIOS_TYPES_H */
|
||||
@@ -1,48 +0,0 @@
|
||||
/*
|
||||
* (C) Copyright 2003
|
||||
* Psyent Corporation
|
||||
* Scott McNutt <smcnutt@psyent.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
|
||||
*
|
||||
********************************************************************
|
||||
* NOTE: This header file defines an interface to U-Boot. Including
|
||||
* this (unmodified) header file in another file is considered normal
|
||||
* use of U-Boot, and does *not* fall under the heading of "derived
|
||||
* work".
|
||||
********************************************************************
|
||||
*/
|
||||
|
||||
#ifndef _U_BOOT_H_
|
||||
#define _U_BOOT_H_
|
||||
|
||||
typedef struct bd_info {
|
||||
unsigned long bi_memstart; /* start of DRAM memory */
|
||||
phys_size_t bi_memsize; /* size of DRAM memory in bytes */
|
||||
unsigned long bi_flashstart; /* start of FLASH memory */
|
||||
unsigned long bi_flashsize; /* size of FLASH memory */
|
||||
unsigned long bi_flashoffset; /* reserved area for startup monitor */
|
||||
unsigned long bi_sramstart; /* start of SRAM memory */
|
||||
unsigned long bi_sramsize; /* size of SRAM memory */
|
||||
unsigned long bi_ip_addr; /* IP Address */
|
||||
unsigned long bi_baudrate; /* Console Baudrate */
|
||||
} bd_t;
|
||||
|
||||
|
||||
#endif /* _U_BOOT_H_ */
|
||||
@@ -1,168 +0,0 @@
|
||||
/*
|
||||
* (C) Copyright 2003, Psyent Corporation <www.psyent.com>
|
||||
* Scott McNutt <smcnutt@psyent.com>
|
||||
*
|
||||
* (C) Copyright 2000-2002
|
||||
* 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
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <stdio_dev.h>
|
||||
#include <watchdog.h>
|
||||
#include <malloc.h>
|
||||
#include <net.h>
|
||||
#ifdef CONFIG_STATUS_LED
|
||||
#include <status_led.h>
|
||||
#endif
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
/*
|
||||
* All attempts to come up with a "common" initialization sequence
|
||||
* that works for all boards and architectures failed: some of the
|
||||
* requirements are just _too_ different. To get rid of the resulting
|
||||
* mess of board dependend #ifdef'ed code we now make the whole
|
||||
* initialization sequence configurable to the user.
|
||||
*
|
||||
* The requirements for any new initalization function is simple: it
|
||||
* receives a pointer to the "global data" structure as it's only
|
||||
* argument, and returns an integer return code, where 0 means
|
||||
* "continue" and != 0 means "fatal error, hang the system".
|
||||
*/
|
||||
|
||||
|
||||
typedef int (init_fnc_t) (void);
|
||||
|
||||
|
||||
/************************************************************************
|
||||
* Initialization sequence *
|
||||
***********************************************************************/
|
||||
|
||||
init_fnc_t *init_sequence[] = {
|
||||
|
||||
#if defined(CONFIG_BOARD_EARLY_INIT_F)
|
||||
board_early_init_f, /* Call board-specific init code early.*/
|
||||
#endif
|
||||
|
||||
env_init,
|
||||
serial_init,
|
||||
console_init_f,
|
||||
display_options,
|
||||
checkcpu,
|
||||
checkboard,
|
||||
NULL, /* Terminate this list */
|
||||
};
|
||||
|
||||
|
||||
/***********************************************************************/
|
||||
void board_init (void)
|
||||
{
|
||||
bd_t *bd;
|
||||
init_fnc_t **init_fnc_ptr;
|
||||
char *s, *e;
|
||||
int i;
|
||||
|
||||
/* Pointer is writable since we allocated a register for it.
|
||||
* Nios treats CONFIG_SYS_GBL_DATA_OFFSET as an address.
|
||||
*/
|
||||
gd = (gd_t *)CONFIG_SYS_GBL_DATA_OFFSET;
|
||||
/* compiler optimization barrier needed for GCC >= 3.4 */
|
||||
__asm__ __volatile__("": : :"memory");
|
||||
|
||||
memset( gd, 0, CONFIG_SYS_GBL_DATA_SIZE );
|
||||
|
||||
gd->bd = (bd_t *)(gd+1); /* At end of global data */
|
||||
gd->baudrate = CONFIG_BAUDRATE;
|
||||
gd->cpu_clk = CONFIG_SYS_CLK_FREQ;
|
||||
|
||||
bd = gd->bd;
|
||||
bd->bi_memstart = CONFIG_SYS_SDRAM_BASE;
|
||||
bd->bi_memsize = CONFIG_SYS_SDRAM_SIZE;
|
||||
bd->bi_flashstart = CONFIG_SYS_FLASH_BASE;
|
||||
#if defined(CONFIG_SYS_SRAM_BASE) && defined(CONFIG_SYS_SRAM_SIZE)
|
||||
bd->bi_sramstart= CONFIG_SYS_SRAM_BASE;
|
||||
bd->bi_sramsize = CONFIG_SYS_SRAM_SIZE;
|
||||
#endif
|
||||
bd->bi_baudrate = CONFIG_BAUDRATE;
|
||||
|
||||
for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
|
||||
WATCHDOG_RESET ();
|
||||
if ((*init_fnc_ptr) () != 0) {
|
||||
hang ();
|
||||
}
|
||||
}
|
||||
|
||||
WATCHDOG_RESET ();
|
||||
|
||||
/* The Malloc area is immediately below the monitor copy in RAM */
|
||||
mem_malloc_init(CONFIG_SYS_MALLOC_BASE, CONFIG_SYS_MALLOC_LEN);
|
||||
|
||||
WATCHDOG_RESET ();
|
||||
bd->bi_flashsize = flash_init();
|
||||
|
||||
WATCHDOG_RESET ();
|
||||
env_relocate();
|
||||
|
||||
bd->bi_ip_addr = getenv_IPaddr ("ipaddr");
|
||||
|
||||
WATCHDOG_RESET ();
|
||||
stdio_init();
|
||||
jumptable_init();
|
||||
console_init_r();
|
||||
/*
|
||||
*/
|
||||
|
||||
WATCHDOG_RESET ();
|
||||
interrupt_init ();
|
||||
|
||||
#ifdef CONFIG_STATUS_LED
|
||||
status_led_set(STATUS_LED_BOOT, STATUS_LED_BLINKING);
|
||||
#endif
|
||||
|
||||
/* main_loop */
|
||||
for (;;) {
|
||||
WATCHDOG_RESET ();
|
||||
main_loop ();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************/
|
||||
|
||||
void hang (void)
|
||||
{
|
||||
#ifdef CONFIG_STATUS_LED
|
||||
status_led_set(STATUS_LED_BOOT, STATUS_LED_OFF);
|
||||
status_led_set(STATUS_LED_RED, STATUS_LED_BLINKING);
|
||||
#endif
|
||||
puts("### ERROR ### Please reset board ###\n");
|
||||
for (;;);
|
||||
}
|
||||
|
||||
unsigned long do_go_exec (ulong (*entry)(int, char *[]), int argc, char *argv[])
|
||||
{
|
||||
/*
|
||||
* x86 does not use a dedicated register to pass the pointer
|
||||
* to the global_data
|
||||
*/
|
||||
argv[-1] = (char *)gd;
|
||||
return entry (argc, argv);
|
||||
}
|
||||
@@ -1,34 +0,0 @@
|
||||
/*
|
||||
* (C) Copyright 2003, Psyent Corporation <www.psyent.com>
|
||||
* Scott McNutt <smcnutt@psyent.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>
|
||||
#include <command.h>
|
||||
|
||||
/* FIXME: Once we find a stable version of uC-linux for nios
|
||||
* we can get this working. ;-)
|
||||
*
|
||||
*/
|
||||
int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
@@ -1,101 +0,0 @@
|
||||
/*
|
||||
* This file is part of GNU CC.
|
||||
*
|
||||
* GNU CC 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, or (at your
|
||||
* option) any later version.
|
||||
*
|
||||
* GNU CC 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 GNU CC; see the file COPYING. If not, write
|
||||
* to the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
|
||||
#include "math.h"
|
||||
|
||||
USItype udivmodsi4 (USItype num, USItype den, word_type modwanted)
|
||||
{
|
||||
USItype bit = 1;
|
||||
USItype res = 0;
|
||||
|
||||
while (den < num && bit && !(den & (1L << 31))) {
|
||||
den <<= 1;
|
||||
bit <<= 1;
|
||||
}
|
||||
while (bit) {
|
||||
if (num >= den) {
|
||||
num -= den;
|
||||
res |= bit;
|
||||
}
|
||||
bit >>= 1;
|
||||
den >>= 1;
|
||||
}
|
||||
if (modwanted)
|
||||
return num;
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
SItype __divsi3 (SItype a, SItype b)
|
||||
{
|
||||
word_type neg = 0;
|
||||
SItype res;
|
||||
|
||||
if (a < 0) {
|
||||
a = -a;
|
||||
neg = !neg;
|
||||
}
|
||||
|
||||
if (b < 0) {
|
||||
b = -b;
|
||||
neg = !neg;
|
||||
}
|
||||
|
||||
res = udivmodsi4 (a, b, 0);
|
||||
|
||||
if (neg)
|
||||
res = -res;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
SItype __modsi3 (SItype a, SItype b)
|
||||
{
|
||||
word_type neg = 0;
|
||||
SItype res;
|
||||
|
||||
if (a < 0) {
|
||||
a = -a;
|
||||
neg = 1;
|
||||
}
|
||||
|
||||
if (b < 0)
|
||||
b = -b;
|
||||
|
||||
res = udivmodsi4 (a, b, 1);
|
||||
|
||||
if (neg)
|
||||
res = -res;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
SItype __udivsi3 (SItype a, SItype b)
|
||||
{
|
||||
return udivmodsi4 (a, b, 0);
|
||||
}
|
||||
|
||||
|
||||
SItype __umodsi3 (SItype a, SItype b)
|
||||
{
|
||||
return udivmodsi4 (a, b, 1);
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
#define BITS_PER_UNIT 8
|
||||
|
||||
typedef int HItype __attribute__ ((mode (HI)));
|
||||
typedef unsigned int UHItype __attribute__ ((mode (HI)));
|
||||
|
||||
typedef int SItype __attribute__ ((mode (SI)));
|
||||
typedef unsigned int USItype __attribute__ ((mode (SI)));
|
||||
|
||||
typedef int word_type __attribute__ ((mode (__word__)));
|
||||
|
||||
struct SIstruct {HItype low, high;};
|
||||
|
||||
typedef union {
|
||||
struct SIstruct s;
|
||||
SItype ll;
|
||||
} SIunion;
|
||||
@@ -1,56 +0,0 @@
|
||||
/*
|
||||
* This file is part of GNU CC.
|
||||
*
|
||||
* GNU CC 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, or (at your
|
||||
* option) any later version.
|
||||
*
|
||||
* GNU CC 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 GNU CC; see the file COPYING. If not, write
|
||||
* to the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
|
||||
#include <common.h>
|
||||
|
||||
#if !defined(CONFIG_SYS_NIOS_MULT_HW) && !defined(CONFIG_SYS_NIOS_MULT_MSTEP)
|
||||
|
||||
#include "math.h"
|
||||
|
||||
USItype __mulsi3 (USItype a, USItype b)
|
||||
{
|
||||
USItype c = 0;
|
||||
|
||||
while (a != 0) {
|
||||
if (a & 1)
|
||||
c += b;
|
||||
a >>= 1;
|
||||
b <<= 1;
|
||||
}
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
|
||||
UHItype __mulhi3 (UHItype a, UHItype b)
|
||||
{
|
||||
UHItype c = 0;
|
||||
|
||||
while (a != 0) {
|
||||
if (a & 1)
|
||||
c += b;
|
||||
a >>= 1;
|
||||
b <<= 1;
|
||||
}
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
#endif /*!defined(CONFIG_SYS_NIOS_MULT_HW) && !defined(CONFIG_SYS_NIOS_MULT_MSTEP) */
|
||||
@@ -1,38 +0,0 @@
|
||||
/*
|
||||
* (C) Copyright 2003, Psyent Corporation <www.psyent.com>
|
||||
* Scott McNutt <smcnutt@psyent.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>
|
||||
#include <watchdog.h>
|
||||
|
||||
|
||||
extern void dly_clks( unsigned long ticks );
|
||||
|
||||
void __udelay(unsigned long usec)
|
||||
{
|
||||
/* The Nios core doesn't have a timebase, so we do our
|
||||
* best for now and call a low-level loop that counts
|
||||
* cpu clocks.
|
||||
*/
|
||||
unsigned long cnt = (CONFIG_SYS_CLK_FREQ/1000000) * usec;
|
||||
dly_clks (cnt);
|
||||
}
|
||||
@@ -24,9 +24,9 @@
|
||||
|
||||
CROSS_COMPILE ?= nios2-elf-
|
||||
|
||||
STANDALONE_LOAD_ADDR = 0x02000000 -L $(gcclibdir)
|
||||
STANDALONE_LOAD_ADDR ?= 0x02000000
|
||||
|
||||
PLATFORM_CPPFLAGS += -DCONFIG_NIOS2 -D__NIOS2__
|
||||
PLATFORM_CPPFLAGS += -ffixed-r15 -G0
|
||||
PLATFORM_CPPFLAGS += -G0
|
||||
|
||||
LDSCRIPT ?= $(SRCTREE)/$(CPUDIR)/u-boot.lds
|
||||
|
||||
@@ -113,13 +113,6 @@ _cur: movhi r5, %hi(_cur - _start)
|
||||
bne r5, r6, 4b
|
||||
5:
|
||||
|
||||
/* GLOBAL POINTER -- the global pointer is used to reference
|
||||
* "small data" (see -G switch). The linker script must
|
||||
* provide the gp address.
|
||||
*/
|
||||
movhi gp, %hi(_gp)
|
||||
ori gp, gp, %lo(_gp)
|
||||
|
||||
/* JUMP TO RELOC ADDR */
|
||||
movhi r4, %hi(_reloc)
|
||||
ori r4, r4, %lo(_reloc)
|
||||
|
||||
@@ -48,6 +48,6 @@ typedef struct global_data {
|
||||
#define GD_FLG_LOGINIT 0x00020 /* Log Buffer has been initialized */
|
||||
#define GD_FLG_DISABLE_CONSOLE 0x00040 /* Disable console (in & out) */
|
||||
|
||||
#define DECLARE_GLOBAL_DATA_PTR register gd_t *gd asm ("r15")
|
||||
#define DECLARE_GLOBAL_DATA_PTR register gd_t *gd asm ("gp")
|
||||
|
||||
#endif /* __ASM_NIOS2_GLOBALDATA_H_ */
|
||||
|
||||
52
arch/nios2/include/asm/gpio.h
Normal file
52
arch/nios2/include/asm/gpio.h
Normal file
@@ -0,0 +1,52 @@
|
||||
/*
|
||||
* nios2 gpio driver
|
||||
*
|
||||
* This gpio core is described in http://nioswiki.com/GPIO
|
||||
* bit[0] data
|
||||
* bit[1] output enable
|
||||
*
|
||||
* when CONFIG_SYS_GPIO_BASE is not defined, board may provide
|
||||
* its own driver.
|
||||
*
|
||||
* Copyright (C) 2010 Thomas Chou <thomas@wytron.com.tw>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef _ASM_NIOS2_GPIO_H_
|
||||
#define _ASM_NIOS2_GPIO_H_
|
||||
|
||||
#ifdef CONFIG_SYS_GPIO_BASE
|
||||
#include <asm/io.h>
|
||||
|
||||
static inline int gpio_direction_input(unsigned gpio)
|
||||
{
|
||||
writel(1, CONFIG_SYS_GPIO_BASE + (gpio << 2));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int gpio_direction_output(unsigned gpio, int value)
|
||||
{
|
||||
writel(value ? 3 : 2, CONFIG_SYS_GPIO_BASE + (gpio << 2));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int gpio_get_value(unsigned gpio)
|
||||
{
|
||||
return readl(CONFIG_SYS_GPIO_BASE + (gpio << 2));
|
||||
}
|
||||
|
||||
static inline void gpio_set_value(unsigned gpio, int value)
|
||||
{
|
||||
writel(value ? 3 : 2, CONFIG_SYS_GPIO_BASE + (gpio << 2));
|
||||
}
|
||||
#else
|
||||
extern int gpio_direction_input(unsigned gpio);
|
||||
extern int gpio_direction_output(unsigned gpio, int value);
|
||||
extern int gpio_get_value(unsigned gpio);
|
||||
extern void gpio_set_value(unsigned gpio, int value);
|
||||
#endif /* CONFIG_SYS_GPIO_BASE */
|
||||
|
||||
#endif /* _ASM_NIOS2_GPIO_H_ */
|
||||
@@ -29,8 +29,7 @@ SOBJS-y += cache.o
|
||||
|
||||
COBJS-y += board.o
|
||||
COBJS-y += bootm.o
|
||||
COBJS-y += divmod.o
|
||||
COBJS-y += mult.o
|
||||
COBJS-y += libgcc.o
|
||||
COBJS-y += time.o
|
||||
|
||||
SRCS := $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c)
|
||||
|
||||
@@ -1,101 +0,0 @@
|
||||
/*
|
||||
* This file is part of GNU CC.
|
||||
*
|
||||
* GNU CC 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, or (at your
|
||||
* option) any later version.
|
||||
*
|
||||
* GNU CC 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 GNU CC; see the file COPYING. If not, write
|
||||
* to the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
|
||||
#include "math.h"
|
||||
|
||||
USItype udivmodsi4 (USItype num, USItype den, word_type modwanted)
|
||||
{
|
||||
USItype bit = 1;
|
||||
USItype res = 0;
|
||||
|
||||
while (den < num && bit && !(den & (1L << 31))) {
|
||||
den <<= 1;
|
||||
bit <<= 1;
|
||||
}
|
||||
while (bit) {
|
||||
if (num >= den) {
|
||||
num -= den;
|
||||
res |= bit;
|
||||
}
|
||||
bit >>= 1;
|
||||
den >>= 1;
|
||||
}
|
||||
if (modwanted)
|
||||
return num;
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
SItype __divsi3 (SItype a, SItype b)
|
||||
{
|
||||
word_type neg = 0;
|
||||
SItype res;
|
||||
|
||||
if (a < 0) {
|
||||
a = -a;
|
||||
neg = !neg;
|
||||
}
|
||||
|
||||
if (b < 0) {
|
||||
b = -b;
|
||||
neg = !neg;
|
||||
}
|
||||
|
||||
res = udivmodsi4 (a, b, 0);
|
||||
|
||||
if (neg)
|
||||
res = -res;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
SItype __modsi3 (SItype a, SItype b)
|
||||
{
|
||||
word_type neg = 0;
|
||||
SItype res;
|
||||
|
||||
if (a < 0) {
|
||||
a = -a;
|
||||
neg = 1;
|
||||
}
|
||||
|
||||
if (b < 0)
|
||||
b = -b;
|
||||
|
||||
res = udivmodsi4 (a, b, 1);
|
||||
|
||||
if (neg)
|
||||
res = -res;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
SItype __udivsi3 (SItype a, SItype b)
|
||||
{
|
||||
return udivmodsi4 (a, b, 0);
|
||||
}
|
||||
|
||||
|
||||
SItype __umodsi3 (SItype a, SItype b)
|
||||
{
|
||||
return udivmodsi4 (a, b, 1);
|
||||
}
|
||||
592
arch/nios2/lib/libgcc.c
Normal file
592
arch/nios2/lib/libgcc.c
Normal file
@@ -0,0 +1,592 @@
|
||||
/*
|
||||
* This file is part of GNU CC.
|
||||
*
|
||||
* GNU CC 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, or (at your
|
||||
* option) any later version.
|
||||
*
|
||||
* GNU CC 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 GNU CC; see the file COPYING. If not, write
|
||||
* to the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
typedef unsigned int UWtype;
|
||||
typedef unsigned int UHWtype;
|
||||
typedef unsigned long long UDWtype;
|
||||
#define W_TYPE_SIZE 32
|
||||
|
||||
typedef unsigned char UQItype;
|
||||
typedef long SItype;
|
||||
typedef unsigned long USItype;
|
||||
typedef long long DItype;
|
||||
typedef unsigned long long DSItype;
|
||||
|
||||
#include "longlong.h"
|
||||
|
||||
|
||||
typedef int word_type;
|
||||
typedef long Wtype;
|
||||
typedef long long DWtype;
|
||||
|
||||
struct DWstruct { Wtype low, high;};
|
||||
|
||||
typedef union
|
||||
{
|
||||
struct DWstruct s;
|
||||
DWtype ll;
|
||||
} DWunion;
|
||||
|
||||
#define BITS_PER_UNIT 8
|
||||
|
||||
UDWtype
|
||||
__udivmoddi4 (UDWtype n, UDWtype d, UDWtype *rp);
|
||||
|
||||
const UQItype __clz_tab[256] =
|
||||
{
|
||||
0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
|
||||
6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
|
||||
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
|
||||
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
|
||||
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
|
||||
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
|
||||
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
|
||||
8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
|
||||
};
|
||||
|
||||
|
||||
DWtype
|
||||
__ashldi3 (DWtype u, word_type b)
|
||||
{
|
||||
if (b == 0)
|
||||
return u;
|
||||
|
||||
const DWunion uu = {.ll = u};
|
||||
const word_type bm = (sizeof (Wtype) * BITS_PER_UNIT) - b;
|
||||
DWunion w;
|
||||
|
||||
if (bm <= 0)
|
||||
{
|
||||
w.s.low = 0;
|
||||
w.s.high = (UWtype) uu.s.low << -bm;
|
||||
}
|
||||
else
|
||||
{
|
||||
const UWtype carries = (UWtype) uu.s.low >> bm;
|
||||
|
||||
w.s.low = (UWtype) uu.s.low << b;
|
||||
w.s.high = ((UWtype) uu.s.high << b) | carries;
|
||||
}
|
||||
|
||||
return w.ll;
|
||||
}
|
||||
|
||||
DWtype
|
||||
__ashrdi3 (DWtype u, word_type b)
|
||||
{
|
||||
if (b == 0)
|
||||
return u;
|
||||
|
||||
const DWunion uu = {.ll = u};
|
||||
const word_type bm = (sizeof (Wtype) * BITS_PER_UNIT) - b;
|
||||
DWunion w;
|
||||
|
||||
if (bm <= 0)
|
||||
{
|
||||
/* w.s.high = 1..1 or 0..0 */
|
||||
w.s.high = uu.s.high >> (sizeof (Wtype) * BITS_PER_UNIT - 1);
|
||||
w.s.low = uu.s.high >> -bm;
|
||||
}
|
||||
else
|
||||
{
|
||||
const UWtype carries = (UWtype) uu.s.high << bm;
|
||||
|
||||
w.s.high = uu.s.high >> b;
|
||||
w.s.low = ((UWtype) uu.s.low >> b) | carries;
|
||||
}
|
||||
|
||||
return w.ll;
|
||||
}
|
||||
|
||||
DWtype
|
||||
__lshrdi3 (DWtype u, word_type b)
|
||||
{
|
||||
if (b == 0)
|
||||
return u;
|
||||
|
||||
const DWunion uu = {.ll = u};
|
||||
const word_type bm = (sizeof (Wtype) * BITS_PER_UNIT) - b;
|
||||
DWunion w;
|
||||
|
||||
if (bm <= 0)
|
||||
{
|
||||
w.s.high = 0;
|
||||
w.s.low = (UWtype) uu.s.high >> -bm;
|
||||
}
|
||||
else
|
||||
{
|
||||
const UWtype carries = (UWtype) uu.s.high << bm;
|
||||
|
||||
w.s.high = (UWtype) uu.s.high >> b;
|
||||
w.s.low = ((UWtype) uu.s.low >> b) | carries;
|
||||
}
|
||||
|
||||
return w.ll;
|
||||
}
|
||||
|
||||
word_type
|
||||
__cmpdi2 (DWtype a, DWtype b)
|
||||
{
|
||||
const DWunion au = {.ll = a};
|
||||
const DWunion bu = {.ll = b};
|
||||
|
||||
if (au.s.high < bu.s.high)
|
||||
return 0;
|
||||
else if (au.s.high > bu.s.high)
|
||||
return 2;
|
||||
if ((UWtype) au.s.low < (UWtype) bu.s.low)
|
||||
return 0;
|
||||
else if ((UWtype) au.s.low > (UWtype) bu.s.low)
|
||||
return 2;
|
||||
return 1;
|
||||
}
|
||||
|
||||
UDWtype
|
||||
__udivmoddi4 (UDWtype n, UDWtype d, UDWtype *rp)
|
||||
{
|
||||
const DWunion nn = {.ll = n};
|
||||
const DWunion dd = {.ll = d};
|
||||
DWunion rr;
|
||||
UWtype d0, d1, n0, n1, n2;
|
||||
UWtype q0, q1;
|
||||
UWtype b, bm;
|
||||
|
||||
d0 = dd.s.low;
|
||||
d1 = dd.s.high;
|
||||
n0 = nn.s.low;
|
||||
n1 = nn.s.high;
|
||||
|
||||
#if !UDIV_NEEDS_NORMALIZATION
|
||||
if (d1 == 0)
|
||||
{
|
||||
if (d0 > n1)
|
||||
{
|
||||
/* 0q = nn / 0D */
|
||||
|
||||
udiv_qrnnd (q0, n0, n1, n0, d0);
|
||||
q1 = 0;
|
||||
|
||||
/* Remainder in n0. */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* qq = NN / 0d */
|
||||
|
||||
if (d0 == 0)
|
||||
d0 = 1 / d0; /* Divide intentionally by zero. */
|
||||
|
||||
udiv_qrnnd (q1, n1, 0, n1, d0);
|
||||
udiv_qrnnd (q0, n0, n1, n0, d0);
|
||||
|
||||
/* Remainder in n0. */
|
||||
}
|
||||
|
||||
if (rp != 0)
|
||||
{
|
||||
rr.s.low = n0;
|
||||
rr.s.high = 0;
|
||||
*rp = rr.ll;
|
||||
}
|
||||
}
|
||||
|
||||
#else /* UDIV_NEEDS_NORMALIZATION */
|
||||
|
||||
if (d1 == 0)
|
||||
{
|
||||
if (d0 > n1)
|
||||
{
|
||||
/* 0q = nn / 0D */
|
||||
|
||||
count_leading_zeros (bm, d0);
|
||||
|
||||
if (bm != 0)
|
||||
{
|
||||
/* Normalize, i.e. make the most significant bit of the
|
||||
denominator set. */
|
||||
|
||||
d0 = d0 << bm;
|
||||
n1 = (n1 << bm) | (n0 >> (W_TYPE_SIZE - bm));
|
||||
n0 = n0 << bm;
|
||||
}
|
||||
|
||||
udiv_qrnnd (q0, n0, n1, n0, d0);
|
||||
q1 = 0;
|
||||
|
||||
/* Remainder in n0 >> bm. */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* qq = NN / 0d */
|
||||
|
||||
if (d0 == 0)
|
||||
d0 = 1 / d0; /* Divide intentionally by zero. */
|
||||
|
||||
count_leading_zeros (bm, d0);
|
||||
|
||||
if (bm == 0)
|
||||
{
|
||||
/* From (n1 >= d0) /\ (the most significant bit of d0 is set),
|
||||
conclude (the most significant bit of n1 is set) /\ (the
|
||||
leading quotient digit q1 = 1).
|
||||
|
||||
This special case is necessary, not an optimization.
|
||||
(Shifts counts of W_TYPE_SIZE are undefined.) */
|
||||
|
||||
n1 -= d0;
|
||||
q1 = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Normalize. */
|
||||
|
||||
b = W_TYPE_SIZE - bm;
|
||||
|
||||
d0 = d0 << bm;
|
||||
n2 = n1 >> b;
|
||||
n1 = (n1 << bm) | (n0 >> b);
|
||||
n0 = n0 << bm;
|
||||
|
||||
udiv_qrnnd (q1, n1, n2, n1, d0);
|
||||
}
|
||||
|
||||
/* n1 != d0... */
|
||||
|
||||
udiv_qrnnd (q0, n0, n1, n0, d0);
|
||||
|
||||
/* Remainder in n0 >> bm. */
|
||||
}
|
||||
|
||||
if (rp != 0)
|
||||
{
|
||||
rr.s.low = n0 >> bm;
|
||||
rr.s.high = 0;
|
||||
*rp = rr.ll;
|
||||
}
|
||||
}
|
||||
#endif /* UDIV_NEEDS_NORMALIZATION */
|
||||
|
||||
else
|
||||
{
|
||||
if (d1 > n1)
|
||||
{
|
||||
/* 00 = nn / DD */
|
||||
|
||||
q0 = 0;
|
||||
q1 = 0;
|
||||
|
||||
/* Remainder in n1n0. */
|
||||
if (rp != 0)
|
||||
{
|
||||
rr.s.low = n0;
|
||||
rr.s.high = n1;
|
||||
*rp = rr.ll;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* 0q = NN / dd */
|
||||
|
||||
count_leading_zeros (bm, d1);
|
||||
if (bm == 0)
|
||||
{
|
||||
/* From (n1 >= d1) /\ (the most significant bit of d1 is set),
|
||||
conclude (the most significant bit of n1 is set) /\ (the
|
||||
quotient digit q0 = 0 or 1).
|
||||
|
||||
This special case is necessary, not an optimization. */
|
||||
|
||||
/* The condition on the next line takes advantage of that
|
||||
n1 >= d1 (true due to program flow). */
|
||||
if (n1 > d1 || n0 >= d0)
|
||||
{
|
||||
q0 = 1;
|
||||
sub_ddmmss (n1, n0, n1, n0, d1, d0);
|
||||
}
|
||||
else
|
||||
q0 = 0;
|
||||
|
||||
q1 = 0;
|
||||
|
||||
if (rp != 0)
|
||||
{
|
||||
rr.s.low = n0;
|
||||
rr.s.high = n1;
|
||||
*rp = rr.ll;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
UWtype m1, m0;
|
||||
/* Normalize. */
|
||||
|
||||
b = W_TYPE_SIZE - bm;
|
||||
|
||||
d1 = (d1 << bm) | (d0 >> b);
|
||||
d0 = d0 << bm;
|
||||
n2 = n1 >> b;
|
||||
n1 = (n1 << bm) | (n0 >> b);
|
||||
n0 = n0 << bm;
|
||||
|
||||
udiv_qrnnd (q0, n1, n2, n1, d1);
|
||||
umul_ppmm (m1, m0, q0, d0);
|
||||
|
||||
if (m1 > n1 || (m1 == n1 && m0 > n0))
|
||||
{
|
||||
q0--;
|
||||
sub_ddmmss (m1, m0, m1, m0, d1, d0);
|
||||
}
|
||||
|
||||
q1 = 0;
|
||||
|
||||
/* Remainder in (n1n0 - m1m0) >> bm. */
|
||||
if (rp != 0)
|
||||
{
|
||||
sub_ddmmss (n1, n0, n1, n0, m1, m0);
|
||||
rr.s.low = (n1 << b) | (n0 >> bm);
|
||||
rr.s.high = n1 >> bm;
|
||||
*rp = rr.ll;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const DWunion ww = {{.low = q0, .high = q1}};
|
||||
return ww.ll;
|
||||
}
|
||||
|
||||
DWtype
|
||||
__divdi3 (DWtype u, DWtype v)
|
||||
{
|
||||
word_type c = 0;
|
||||
DWunion uu = {.ll = u};
|
||||
DWunion vv = {.ll = v};
|
||||
DWtype w;
|
||||
|
||||
if (uu.s.high < 0)
|
||||
c = ~c,
|
||||
uu.ll = -uu.ll;
|
||||
if (vv.s.high < 0)
|
||||
c = ~c,
|
||||
vv.ll = -vv.ll;
|
||||
|
||||
w = __udivmoddi4 (uu.ll, vv.ll, (UDWtype *) 0);
|
||||
if (c)
|
||||
w = -w;
|
||||
|
||||
return w;
|
||||
}
|
||||
|
||||
DWtype
|
||||
__negdi2 (DWtype u)
|
||||
{
|
||||
const DWunion uu = {.ll = u};
|
||||
const DWunion w = { {.low = -uu.s.low,
|
||||
.high = -uu.s.high - ((UWtype) -uu.s.low > 0) } };
|
||||
|
||||
return w.ll;
|
||||
}
|
||||
|
||||
|
||||
DWtype
|
||||
__muldi3 (DWtype u, DWtype v)
|
||||
{
|
||||
const DWunion uu = {.ll = u};
|
||||
const DWunion vv = {.ll = v};
|
||||
DWunion w = {.ll = __umulsidi3 (uu.s.low, vv.s.low)};
|
||||
|
||||
w.s.high += ((UWtype) uu.s.low * (UWtype) vv.s.high
|
||||
+ (UWtype) uu.s.high * (UWtype) vv.s.low);
|
||||
|
||||
return w.ll;
|
||||
}
|
||||
|
||||
DWtype
|
||||
__moddi3 (DWtype u, DWtype v)
|
||||
{
|
||||
word_type c = 0;
|
||||
DWunion uu = {.ll = u};
|
||||
DWunion vv = {.ll = v};
|
||||
DWtype w;
|
||||
|
||||
if (uu.s.high < 0)
|
||||
c = ~c,
|
||||
uu.ll = -uu.ll;
|
||||
if (vv.s.high < 0)
|
||||
vv.ll = -vv.ll;
|
||||
|
||||
(void) __udivmoddi4 (uu.ll, vv.ll, (UDWtype*)&w);
|
||||
if (c)
|
||||
w = -w;
|
||||
|
||||
return w;
|
||||
}
|
||||
|
||||
word_type
|
||||
__ucmpdi2 (DWtype a, DWtype b)
|
||||
{
|
||||
const DWunion au = {.ll = a};
|
||||
const DWunion bu = {.ll = b};
|
||||
|
||||
if ((UWtype) au.s.high < (UWtype) bu.s.high)
|
||||
return 0;
|
||||
else if ((UWtype) au.s.high > (UWtype) bu.s.high)
|
||||
return 2;
|
||||
if ((UWtype) au.s.low < (UWtype) bu.s.low)
|
||||
return 0;
|
||||
else if ((UWtype) au.s.low > (UWtype) bu.s.low)
|
||||
return 2;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
UDWtype
|
||||
__udivdi3 (UDWtype n, UDWtype d)
|
||||
{
|
||||
return __udivmoddi4 (n, d, (UDWtype *) 0);
|
||||
}
|
||||
|
||||
UDWtype
|
||||
__umoddi3 (UDWtype u, UDWtype v)
|
||||
{
|
||||
UDWtype w;
|
||||
(void) __udivmoddi4 (u, v, &w);
|
||||
|
||||
return w;
|
||||
}
|
||||
|
||||
static USItype
|
||||
udivmodsi4(USItype num, USItype den, word_type modwanted)
|
||||
{
|
||||
USItype bit = 1;
|
||||
USItype res = 0;
|
||||
|
||||
while (den < num && bit && !(den & (1L<<31)))
|
||||
{
|
||||
den <<=1;
|
||||
bit <<=1;
|
||||
}
|
||||
while (bit)
|
||||
{
|
||||
if (num >= den)
|
||||
{
|
||||
num -= den;
|
||||
res |= bit;
|
||||
}
|
||||
bit >>=1;
|
||||
den >>=1;
|
||||
}
|
||||
if (modwanted) return num;
|
||||
return res;
|
||||
}
|
||||
|
||||
SItype
|
||||
__divsi3 (SItype a, SItype b)
|
||||
{
|
||||
word_type neg = 0;
|
||||
SItype res;
|
||||
|
||||
if (a < 0)
|
||||
{
|
||||
a = -a;
|
||||
neg = !neg;
|
||||
}
|
||||
|
||||
if (b < 0)
|
||||
{
|
||||
b = -b;
|
||||
neg = !neg;
|
||||
}
|
||||
|
||||
res = udivmodsi4 (a, b, 0);
|
||||
|
||||
if (neg)
|
||||
res = -res;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
SItype
|
||||
__udivsi3 (SItype a, SItype b)
|
||||
{
|
||||
return udivmodsi4 (a, b, 0);
|
||||
}
|
||||
|
||||
|
||||
SItype
|
||||
__modsi3 (SItype a, SItype b)
|
||||
{
|
||||
word_type neg = 0;
|
||||
SItype res;
|
||||
|
||||
if (a < 0)
|
||||
{
|
||||
a = -a;
|
||||
neg = 1;
|
||||
}
|
||||
|
||||
if (b < 0)
|
||||
b = -b;
|
||||
|
||||
res = udivmodsi4 (a, b, 1);
|
||||
|
||||
if (neg)
|
||||
res = -res;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
SItype
|
||||
__mulsi3 (SItype a, SItype b)
|
||||
{
|
||||
SItype res = 0;
|
||||
USItype cnt = a;
|
||||
|
||||
while (cnt)
|
||||
{
|
||||
if (cnt & 1)
|
||||
{
|
||||
res += b;
|
||||
}
|
||||
b <<= 1;
|
||||
cnt >>= 1;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
SItype
|
||||
__umodsi3 (SItype a, SItype b)
|
||||
|
||||
{
|
||||
return udivmodsi4 (a, b, 1);
|
||||
}
|
||||
|
||||
int
|
||||
__gcc_bcmp (const unsigned char *s1, const unsigned char *s2, unsigned long size)
|
||||
{
|
||||
while (size > 0)
|
||||
{
|
||||
const unsigned char c1 = *s1++, c2 = *s2++;
|
||||
if (c1 != c2)
|
||||
return c1 - c2;
|
||||
size--;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
263
arch/nios2/lib/longlong.h
Normal file
263
arch/nios2/lib/longlong.h
Normal file
@@ -0,0 +1,263 @@
|
||||
/* longlong.h -- definitions for mixed size 32/64 bit arithmetic.
|
||||
Copyright (C) 1991, 1992, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2004,
|
||||
2005 Free Software Foundation, Inc.
|
||||
|
||||
This definition file 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, or (at your option) any later version.
|
||||
|
||||
This definition file 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., 51 Franklin Street, Fifth Floor,
|
||||
Boston, MA 02110-1301, USA. */
|
||||
|
||||
/* You have to define the following before including this file:
|
||||
|
||||
UWtype -- An unsigned type, default type for operations (typically a "word")
|
||||
UHWtype -- An unsigned type, at least half the size of UWtype.
|
||||
UDWtype -- An unsigned type, at least twice as large a UWtype
|
||||
W_TYPE_SIZE -- size in bits of UWtype
|
||||
|
||||
UQItype -- Unsigned 8 bit type.
|
||||
SItype, USItype -- Signed and unsigned 32 bit types.
|
||||
DItype, UDItype -- Signed and unsigned 64 bit types.
|
||||
|
||||
On a 32 bit machine UWtype should typically be USItype;
|
||||
on a 64 bit machine, UWtype should typically be UDItype. */
|
||||
|
||||
#define __BITS4 (W_TYPE_SIZE / 4)
|
||||
#define __ll_B ((UWtype) 1 << (W_TYPE_SIZE / 2))
|
||||
#define __ll_lowpart(t) ((UWtype) (t) & (__ll_B - 1))
|
||||
#define __ll_highpart(t) ((UWtype) (t) >> (W_TYPE_SIZE / 2))
|
||||
|
||||
#ifndef W_TYPE_SIZE
|
||||
#define W_TYPE_SIZE 32
|
||||
#define UWtype USItype
|
||||
#define UHWtype USItype
|
||||
#define UDWtype UDItype
|
||||
#endif
|
||||
|
||||
extern const UQItype __clz_tab[256];
|
||||
|
||||
/* Define auxiliary asm macros.
|
||||
|
||||
1) umul_ppmm(high_prod, low_prod, multiplier, multiplicand) multiplies two
|
||||
UWtype integers MULTIPLIER and MULTIPLICAND, and generates a two UWtype
|
||||
word product in HIGH_PROD and LOW_PROD.
|
||||
|
||||
2) __umulsidi3(a,b) multiplies two UWtype integers A and B, and returns a
|
||||
UDWtype product. This is just a variant of umul_ppmm.
|
||||
|
||||
3) udiv_qrnnd(quotient, remainder, high_numerator, low_numerator,
|
||||
denominator) divides a UDWtype, composed by the UWtype integers
|
||||
HIGH_NUMERATOR and LOW_NUMERATOR, by DENOMINATOR and places the quotient
|
||||
in QUOTIENT and the remainder in REMAINDER. HIGH_NUMERATOR must be less
|
||||
than DENOMINATOR for correct operation. If, in addition, the most
|
||||
significant bit of DENOMINATOR must be 1, then the pre-processor symbol
|
||||
UDIV_NEEDS_NORMALIZATION is defined to 1.
|
||||
|
||||
4) sdiv_qrnnd(quotient, remainder, high_numerator, low_numerator,
|
||||
denominator). Like udiv_qrnnd but the numbers are signed. The quotient
|
||||
is rounded towards 0.
|
||||
|
||||
5) count_leading_zeros(count, x) counts the number of zero-bits from the
|
||||
msb to the first nonzero bit in the UWtype X. This is the number of
|
||||
steps X needs to be shifted left to set the msb. Undefined for X == 0,
|
||||
unless the symbol COUNT_LEADING_ZEROS_0 is defined to some value.
|
||||
|
||||
6) count_trailing_zeros(count, x) like count_leading_zeros, but counts
|
||||
from the least significant end.
|
||||
|
||||
7) add_ssaaaa(high_sum, low_sum, high_addend_1, low_addend_1,
|
||||
high_addend_2, low_addend_2) adds two UWtype integers, composed by
|
||||
HIGH_ADDEND_1 and LOW_ADDEND_1, and HIGH_ADDEND_2 and LOW_ADDEND_2
|
||||
respectively. The result is placed in HIGH_SUM and LOW_SUM. Overflow
|
||||
(i.e. carry out) is not stored anywhere, and is lost.
|
||||
|
||||
8) sub_ddmmss(high_difference, low_difference, high_minuend, low_minuend,
|
||||
high_subtrahend, low_subtrahend) subtracts two two-word UWtype integers,
|
||||
composed by HIGH_MINUEND_1 and LOW_MINUEND_1, and HIGH_SUBTRAHEND_2 and
|
||||
LOW_SUBTRAHEND_2 respectively. The result is placed in HIGH_DIFFERENCE
|
||||
and LOW_DIFFERENCE. Overflow (i.e. carry out) is not stored anywhere,
|
||||
and is lost.
|
||||
|
||||
If any of these macros are left undefined for a particular CPU,
|
||||
C macros are used. */
|
||||
|
||||
/* The CPUs come in alphabetical order below.
|
||||
|
||||
Please add support for more CPUs here, or improve the current support
|
||||
for the CPUs below!
|
||||
(E.g. WE32100, IBM360.) */
|
||||
|
||||
/* Snipped per CPU support */
|
||||
|
||||
/* If this machine has no inline assembler, use C macros. */
|
||||
|
||||
#if !defined (add_ssaaaa)
|
||||
#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
|
||||
do { \
|
||||
UWtype __x; \
|
||||
__x = (al) + (bl); \
|
||||
(sh) = (ah) + (bh) + (__x < (al)); \
|
||||
(sl) = __x; \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
#if !defined (sub_ddmmss)
|
||||
#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
|
||||
do { \
|
||||
UWtype __x; \
|
||||
__x = (al) - (bl); \
|
||||
(sh) = (ah) - (bh) - (__x > (al)); \
|
||||
(sl) = __x; \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
/* If we lack umul_ppmm but have smul_ppmm, define umul_ppmm in terms of
|
||||
smul_ppmm. */
|
||||
#if !defined (umul_ppmm) && defined (smul_ppmm)
|
||||
#define umul_ppmm(w1, w0, u, v) \
|
||||
do { \
|
||||
UWtype __w1; \
|
||||
UWtype __xm0 = (u), __xm1 = (v); \
|
||||
smul_ppmm (__w1, w0, __xm0, __xm1); \
|
||||
(w1) = __w1 + (-(__xm0 >> (W_TYPE_SIZE - 1)) & __xm1) \
|
||||
+ (-(__xm1 >> (W_TYPE_SIZE - 1)) & __xm0); \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
/* If we still don't have umul_ppmm, define it using plain C. */
|
||||
#if !defined (umul_ppmm)
|
||||
#define umul_ppmm(w1, w0, u, v) \
|
||||
do { \
|
||||
UWtype __x0, __x1, __x2, __x3; \
|
||||
UHWtype __ul, __vl, __uh, __vh; \
|
||||
\
|
||||
__ul = __ll_lowpart (u); \
|
||||
__uh = __ll_highpart (u); \
|
||||
__vl = __ll_lowpart (v); \
|
||||
__vh = __ll_highpart (v); \
|
||||
\
|
||||
__x0 = (UWtype) __ul * __vl; \
|
||||
__x1 = (UWtype) __ul * __vh; \
|
||||
__x2 = (UWtype) __uh * __vl; \
|
||||
__x3 = (UWtype) __uh * __vh; \
|
||||
\
|
||||
__x1 += __ll_highpart (__x0);/* this can't give carry */ \
|
||||
__x1 += __x2; /* but this indeed can */ \
|
||||
if (__x1 < __x2) /* did we get it? */ \
|
||||
__x3 += __ll_B; /* yes, add it in the proper pos. */ \
|
||||
\
|
||||
(w1) = __x3 + __ll_highpart (__x1); \
|
||||
(w0) = __ll_lowpart (__x1) * __ll_B + __ll_lowpart (__x0); \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
#if !defined (__umulsidi3)
|
||||
#define __umulsidi3(u, v) \
|
||||
({DWunion __w; \
|
||||
umul_ppmm (__w.s.high, __w.s.low, u, v); \
|
||||
__w.ll; })
|
||||
#endif
|
||||
|
||||
/* Define this unconditionally, so it can be used for debugging. */
|
||||
#define __udiv_qrnnd_c(q, r, n1, n0, d) \
|
||||
do { \
|
||||
UWtype __d1, __d0, __q1, __q0; \
|
||||
UWtype __r1, __r0, __m; \
|
||||
__d1 = __ll_highpart (d); \
|
||||
__d0 = __ll_lowpart (d); \
|
||||
\
|
||||
__r1 = (n1) % __d1; \
|
||||
__q1 = (n1) / __d1; \
|
||||
__m = (UWtype) __q1 * __d0; \
|
||||
__r1 = __r1 * __ll_B | __ll_highpart (n0); \
|
||||
if (__r1 < __m) \
|
||||
{ \
|
||||
__q1--, __r1 += (d); \
|
||||
if (__r1 >= (d)) /* i.e. we didn't get carry when adding to __r1 */\
|
||||
if (__r1 < __m) \
|
||||
__q1--, __r1 += (d); \
|
||||
} \
|
||||
__r1 -= __m; \
|
||||
\
|
||||
__r0 = __r1 % __d1; \
|
||||
__q0 = __r1 / __d1; \
|
||||
__m = (UWtype) __q0 * __d0; \
|
||||
__r0 = __r0 * __ll_B | __ll_lowpart (n0); \
|
||||
if (__r0 < __m) \
|
||||
{ \
|
||||
__q0--, __r0 += (d); \
|
||||
if (__r0 >= (d)) \
|
||||
if (__r0 < __m) \
|
||||
__q0--, __r0 += (d); \
|
||||
} \
|
||||
__r0 -= __m; \
|
||||
\
|
||||
(q) = (UWtype) __q1 * __ll_B | __q0; \
|
||||
(r) = __r0; \
|
||||
} while (0)
|
||||
|
||||
/* If the processor has no udiv_qrnnd but sdiv_qrnnd, go through
|
||||
__udiv_w_sdiv (defined in libgcc or elsewhere). */
|
||||
#if !defined (udiv_qrnnd) && defined (sdiv_qrnnd)
|
||||
#define udiv_qrnnd(q, r, nh, nl, d) \
|
||||
do { \
|
||||
USItype __r; \
|
||||
(q) = __udiv_w_sdiv (&__r, nh, nl, d); \
|
||||
(r) = __r; \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
/* If udiv_qrnnd was not defined for this processor, use __udiv_qrnnd_c. */
|
||||
#if !defined (udiv_qrnnd)
|
||||
#define UDIV_NEEDS_NORMALIZATION 1
|
||||
#define udiv_qrnnd __udiv_qrnnd_c
|
||||
#endif
|
||||
|
||||
#if !defined (count_leading_zeros)
|
||||
#define count_leading_zeros(count, x) \
|
||||
do { \
|
||||
UWtype __xr = (x); \
|
||||
UWtype __a; \
|
||||
\
|
||||
if (W_TYPE_SIZE <= 32) \
|
||||
{ \
|
||||
__a = __xr < ((UWtype)1<<2*__BITS4) \
|
||||
? (__xr < ((UWtype)1<<__BITS4) ? 0 : __BITS4) \
|
||||
: (__xr < ((UWtype)1<<3*__BITS4) ? 2*__BITS4 : 3*__BITS4); \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
for (__a = W_TYPE_SIZE - 8; __a > 0; __a -= 8) \
|
||||
if (((__xr >> __a) & 0xff) != 0) \
|
||||
break; \
|
||||
} \
|
||||
\
|
||||
(count) = W_TYPE_SIZE - (__clz_tab[__xr >> __a] + __a); \
|
||||
} while (0)
|
||||
#define COUNT_LEADING_ZEROS_0 W_TYPE_SIZE
|
||||
#endif
|
||||
|
||||
#if !defined (count_trailing_zeros)
|
||||
/* Define count_trailing_zeros using count_leading_zeros. The latter might be
|
||||
defined in asm, but if it is not, the C version above is good enough. */
|
||||
#define count_trailing_zeros(count, x) \
|
||||
do { \
|
||||
UWtype __ctz_x = (x); \
|
||||
UWtype __ctz_c; \
|
||||
count_leading_zeros (__ctz_c, __ctz_x & -__ctz_x); \
|
||||
(count) = W_TYPE_SIZE - 1 - __ctz_c; \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
#ifndef UDIV_NEEDS_NORMALIZATION
|
||||
#define UDIV_NEEDS_NORMALIZATION 0
|
||||
#endif
|
||||
@@ -1,16 +0,0 @@
|
||||
#define BITS_PER_UNIT 8
|
||||
|
||||
typedef int HItype __attribute__ ((mode (HI)));
|
||||
typedef unsigned int UHItype __attribute__ ((mode (HI)));
|
||||
|
||||
typedef int SItype __attribute__ ((mode (SI)));
|
||||
typedef unsigned int USItype __attribute__ ((mode (SI)));
|
||||
|
||||
typedef int word_type __attribute__ ((mode (__word__)));
|
||||
|
||||
struct SIstruct {HItype low, high;};
|
||||
|
||||
typedef union {
|
||||
struct SIstruct s;
|
||||
SItype ll;
|
||||
} SIunion;
|
||||
@@ -1,56 +0,0 @@
|
||||
/*
|
||||
* This file is part of GNU CC.
|
||||
*
|
||||
* GNU CC 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, or (at your
|
||||
* option) any later version.
|
||||
*
|
||||
* GNU CC 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 GNU CC; see the file COPYING. If not, write
|
||||
* to the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
|
||||
#include <common.h>
|
||||
|
||||
#if !defined(CONFIG_SYS_NIOS_MULT_HW) && !defined(CONFIG_SYS_NIOS_MULT_MSTEP)
|
||||
|
||||
#include "math.h"
|
||||
|
||||
USItype __mulsi3 (USItype a, USItype b)
|
||||
{
|
||||
USItype c = 0;
|
||||
|
||||
while (a != 0) {
|
||||
if (a & 1)
|
||||
c += b;
|
||||
a >>= 1;
|
||||
b <<= 1;
|
||||
}
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
|
||||
UHItype __mulhi3 (UHItype a, UHItype b)
|
||||
{
|
||||
UHItype c = 0;
|
||||
|
||||
while (a != 0) {
|
||||
if (a & 1)
|
||||
c += b;
|
||||
a >>= 1;
|
||||
b <<= 1;
|
||||
}
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
#endif /*!defined(CONFIG_SYS_NIOS_MULT_HW) && !defined(CONFIG_SYS_NIOS_MULT_MSTEP) */
|
||||
@@ -1912,7 +1912,8 @@ typedef struct ccsr_gur {
|
||||
#define MPC85xx_PMUXCR_SD_DATA 0x80000000
|
||||
#define MPC85xx_PMUXCR_SDHC_CD 0x40000000
|
||||
#define MPC85xx_PMUXCR_SDHC_WP 0x20000000
|
||||
u8 res6[12];
|
||||
u32 pmuxcr2; /* Alt. function signal multiplex control 2 */
|
||||
u8 res6[8];
|
||||
u32 devdisr; /* Device disable control */
|
||||
#define MPC85xx_DEVDISR_PCI1 0x80000000
|
||||
#define MPC85xx_DEVDISR_PCI2 0x40000000
|
||||
@@ -1949,10 +1950,12 @@ typedef struct ccsr_gur {
|
||||
#if defined(CONFIG_MPC8568)||defined(CONFIG_MPC8569)
|
||||
u8 res10b[76];
|
||||
par_io_t qe_par_io[7];
|
||||
u8 res10c[3136];
|
||||
u8 res10c[1600];
|
||||
#else
|
||||
u8 res10b[3404];
|
||||
u8 res10b[1868];
|
||||
#endif
|
||||
u32 clkdvdr; /* Clock Divide register */
|
||||
u8 res10d[1532];
|
||||
u32 clkocr; /* Clock out select */
|
||||
u8 res11[12];
|
||||
u32 ddrdllcr; /* DDR DLL control */
|
||||
|
||||
@@ -40,6 +40,19 @@ COBJS-y += interrupts.o
|
||||
COBJS-$(CONFIG_CMD_KGDB) += kgdb.o
|
||||
COBJS-y += time.o
|
||||
|
||||
# Workaround for local bus unaligned access problems
|
||||
# on MPC512x and MPC5200
|
||||
ifdef CONFIG_MPC512X
|
||||
$(obj)ppcstring.o: AFLAGS += -Dmemcpy=__memcpy
|
||||
COBJS-y += memcpy_mpc5200.o
|
||||
endif
|
||||
ifdef CONFIG_MPC5200
|
||||
$(obj)ppcstring.o: AFLAGS += -Dmemcpy=__memcpy
|
||||
COBJS-y += memcpy_mpc5200.o
|
||||
endif
|
||||
|
||||
COBJS += $(sort $(COBJS-y))
|
||||
|
||||
SRCS := $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c)
|
||||
OBJS := $(addprefix $(obj),$(SOBJS-y) $(COBJS-y))
|
||||
|
||||
|
||||
71
arch/powerpc/lib/memcpy_mpc5200.c
Normal file
71
arch/powerpc/lib/memcpy_mpc5200.c
Normal file
@@ -0,0 +1,71 @@
|
||||
/*
|
||||
* (C) Copyright 2010
|
||||
* 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 is a workaround for issues on the MPC5200, where unaligned
|
||||
* 32-bit-accesses to the local bus will deliver corrupted data. This
|
||||
* happens for example when trying to use memcpy() from an odd NOR
|
||||
* flash address; the behaviour can be also seen when using "md" on an
|
||||
* odd NOR flash address (but there it is not a bug in U-Boot, which
|
||||
* only shows the behaviour of this processor).
|
||||
*
|
||||
* For memcpy(), we test if either the source or the target address
|
||||
* are not 32 bit aligned, and - if so - if the source address is in
|
||||
* NOR flash: in this case we perform a byte-wise (slow) then; for
|
||||
* aligned operations of non-flash areas we use the optimized (fast)
|
||||
* real __memcpy(). This way we minimize the performance impact of
|
||||
* this workaround.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <flash.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
void *memcpy(void *trg, const void *src, size_t len)
|
||||
{
|
||||
extern void* __memcpy(void *, const void *, size_t);
|
||||
char *s = (char *)src;
|
||||
char *t = (char *)trg;
|
||||
void *dest = (void *)src;
|
||||
|
||||
/*
|
||||
* Check is source address is in flash:
|
||||
* If not, we use the fast assembler code
|
||||
*/
|
||||
if (((((unsigned long)s & 3) == 0) /* source aligned */
|
||||
&& /* AND */
|
||||
(((unsigned long)t & 3) == 0)) /* target aligned, */
|
||||
|| /* or */
|
||||
(addr2info((ulong)s) == NULL)) { /* source not in flash */
|
||||
return __memcpy(trg, src, len);
|
||||
}
|
||||
|
||||
/*
|
||||
* Copying from flash, perform byte by byte copy.
|
||||
*/
|
||||
while (len-- > 0)
|
||||
*t++ = *s++;
|
||||
|
||||
return dest;
|
||||
}
|
||||
@@ -1,6 +1,10 @@
|
||||
#
|
||||
# (C) Copyright 2001-2006
|
||||
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||
# Copyright (C) 2010 Albert ARIBAUD <albert.aribaud@free.fr>
|
||||
#
|
||||
# Based on original Kirkwood support which is
|
||||
# (C) Copyright 2009
|
||||
# Marvell Semiconductor <www.marvell.com>
|
||||
# Written-by: Prafulla Wadaskar <prafulla@marvell.com>
|
||||
#
|
||||
# See file CREDITS for list of people who contributed to this
|
||||
# project.
|
||||
@@ -12,34 +16,32 @@
|
||||
#
|
||||
# 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
|
||||
# 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
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
# MA 02110-1301 USA
|
||||
#
|
||||
|
||||
include $(TOPDIR)/config.mk
|
||||
|
||||
LIB = $(obj)lib$(BOARD).a
|
||||
|
||||
COBJS := $(BOARD).o flash.o misc.o
|
||||
SOBJS = vectors.o
|
||||
COBJS := edminiv2.o
|
||||
|
||||
SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c)
|
||||
SRCS := $(COBJS:.o=.c)
|
||||
OBJS := $(addprefix $(obj),$(COBJS))
|
||||
SOBJS := $(addprefix $(obj),$(SOBJS))
|
||||
|
||||
$(LIB): $(obj).depend $(OBJS) $(SOBJS)
|
||||
$(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS)
|
||||
$(LIB): $(obj).depend $(OBJS)
|
||||
$(AR) $(ARFLAGS) $@ $(OBJS)
|
||||
|
||||
clean:
|
||||
rm -f $(SOBJS) $(OBJS)
|
||||
rm -f $(OBJS)
|
||||
|
||||
distclean: clean
|
||||
rm -f $(LIB) core *.bak $(obj).depend
|
||||
rm -f $(LIB) core *.bak .depend
|
||||
|
||||
#########################################################################
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user