mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2026-06-13 15:03:58 +03:00
Compare commits
126 Commits
v2017.07-r
...
v2017.07-r
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2f4c1d83f4 | ||
|
|
98f705c9ce | ||
|
|
d4db3b86a5 | ||
|
|
8d6040c725 | ||
|
|
7826669df8 | ||
|
|
626662e4ce | ||
|
|
3278e29130 | ||
|
|
f42f25dad8 | ||
|
|
e3f40720ba | ||
|
|
7c22476b19 | ||
|
|
cc6f9deeb0 | ||
|
|
8997de292a | ||
|
|
4e843834ab | ||
|
|
4425be39eb | ||
|
|
24257db071 | ||
|
|
cdc12eed1f | ||
|
|
52a557d64c | ||
|
|
ae625ae5a1 | ||
|
|
f1d56dffd7 | ||
|
|
67482f57e6 | ||
|
|
97a63144a9 | ||
|
|
ef41e9d33e | ||
|
|
c2a7ee226d | ||
|
|
06bd1d7f95 | ||
|
|
f04796b4a9 | ||
|
|
02d488b6c5 | ||
|
|
cf628f772e | ||
|
|
be2787bf29 | ||
|
|
e91ead868b | ||
|
|
be884598da | ||
|
|
2fa5130d46 | ||
|
|
95ebcbffd4 | ||
|
|
1f54a47ca1 | ||
|
|
f8136e68cc | ||
|
|
2a0583e3e8 | ||
|
|
de8203653f | ||
|
|
08546df976 | ||
|
|
821560fd8e | ||
|
|
da2364cc14 | ||
|
|
65496a3483 | ||
|
|
b8a238f137 | ||
|
|
5e75ea1506 | ||
|
|
524b42bc2c | ||
|
|
7bf378043f | ||
|
|
247137f245 | ||
|
|
d940300178 | ||
|
|
1d21e1b97c | ||
|
|
7df4ff2c26 | ||
|
|
6a464d9cab | ||
|
|
915e09814a | ||
|
|
5302feb695 | ||
|
|
beca2901fd | ||
|
|
72fa58931e | ||
|
|
f8714372ed | ||
|
|
0424990c1f | ||
|
|
5353953372 | ||
|
|
0f546eaf00 | ||
|
|
4e118ce6d8 | ||
|
|
b51ced8e2a | ||
|
|
0da008ef8d | ||
|
|
6d7a570764 | ||
|
|
872faf5d13 | ||
|
|
d62b247d29 | ||
|
|
3a97763aab | ||
|
|
964a34e602 | ||
|
|
f2c1cbe738 | ||
|
|
207f981b56 | ||
|
|
4fd79ac9af | ||
|
|
431c66a3ba | ||
|
|
ae118b6855 | ||
|
|
b5a6c94a03 | ||
|
|
c8f258d8a8 | ||
|
|
70b95ded03 | ||
|
|
235c5b8315 | ||
|
|
9c067c873f | ||
|
|
784667d7f9 | ||
|
|
2aaf7c4900 | ||
|
|
ab43de8036 | ||
|
|
b2330426c3 | ||
|
|
dc759a9967 | ||
|
|
4ecc988301 | ||
|
|
542b5f8567 | ||
|
|
e625881ad7 | ||
|
|
988390b8e1 | ||
|
|
fb4000e871 | ||
|
|
7033ae272e | ||
|
|
e0752bc184 | ||
|
|
d84bd9284e | ||
|
|
6a1d91be31 | ||
|
|
b0259c840e | ||
|
|
1ac237b66b | ||
|
|
9e6e2bc229 | ||
|
|
6b104fead3 | ||
|
|
85a275ba02 | ||
|
|
8bf62ae7da | ||
|
|
e3fdf5d056 | ||
|
|
bd89fba202 | ||
|
|
41f59f6853 | ||
|
|
22ea278a97 | ||
|
|
2c62e313b1 | ||
|
|
df494d8001 | ||
|
|
c9972a8652 | ||
|
|
7f3a40cf98 | ||
|
|
9c2e2cab9a | ||
|
|
54d63bb1ad | ||
|
|
3791c31746 | ||
|
|
4e2ece0e15 | ||
|
|
0e689a6192 | ||
|
|
5ed7d31a14 | ||
|
|
46f9c839c9 | ||
|
|
8bd06ba91a | ||
|
|
a48f32f71b | ||
|
|
a43241a406 | ||
|
|
4f816fbd7b | ||
|
|
6d931fd569 | ||
|
|
2e87c440f6 | ||
|
|
fcdb5319ce | ||
|
|
237868c9c0 | ||
|
|
747778cf69 | ||
|
|
3e3aab3379 | ||
|
|
f7c13e6a79 | ||
|
|
4f425280fa | ||
|
|
267c5b7989 | ||
|
|
6ecbe13756 | ||
|
|
da384fc67a | ||
|
|
1541d7a63d |
@@ -143,7 +143,7 @@ matrix:
|
||||
- BUILDMAN="avr32"
|
||||
TOOLCHAIN="avr32"
|
||||
- env:
|
||||
- BUILDMAN="denx"
|
||||
- BUILDMAN="aries"
|
||||
- env:
|
||||
- JOB="Freescale ARM32"
|
||||
BUILDMAN="freescale -x powerpc,m68k,aarch64"
|
||||
@@ -174,7 +174,7 @@ matrix:
|
||||
- BUILDMAN="sun50i"
|
||||
- env:
|
||||
- JOB="Catch-all ARM"
|
||||
BUILDMAN="arm -x arm11,arm7,arm9,aarch64,atmel,denx,freescale,kirkwood,mvebu,siemens,tegra,uniphier,mx,samsung,sunxi,am33xx,omap3,omap4,omap5,pxa,rockchip"
|
||||
BUILDMAN="arm -x arm11,arm7,arm9,aarch64,atmel,aries,freescale,kirkwood,mvebu,siemens,tegra,uniphier,mx,samsung,sunxi,am33xx,omap3,omap4,omap5,pxa,rockchip"
|
||||
- env:
|
||||
- BUILDMAN="sandbox x86"
|
||||
TOOLCHAIN="x86_64"
|
||||
|
||||
@@ -89,6 +89,7 @@ F: include/dm/platform_data/serial_bcm283x_mu.h
|
||||
|
||||
ARM FREESCALE IMX
|
||||
M: Stefano Babic <sbabic@denx.de>
|
||||
M: Fabio Estevam <fabio.estevam@nxp.com>
|
||||
S: Maintained
|
||||
T: git git://git.denx.de/u-boot-imx.git
|
||||
F: arch/arm/cpu/arm1136/mx*/
|
||||
@@ -132,6 +133,7 @@ F: arch/arm/mach-rmobile/
|
||||
|
||||
ARM ROCKCHIP
|
||||
M: Simon Glass <sjg@chromium.org>
|
||||
M: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
|
||||
S: Maintained
|
||||
T: git git://git.denx.de/u-boot-rockchip.git
|
||||
F: arch/arm/mach-rockchip/
|
||||
|
||||
2
Makefile
2
Makefile
@@ -5,7 +5,7 @@
|
||||
VERSION = 2017
|
||||
PATCHLEVEL = 07
|
||||
SUBLEVEL =
|
||||
EXTRAVERSION = -rc2
|
||||
EXTRAVERSION = -rc3
|
||||
NAME =
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
||||
13
README
13
README
@@ -833,8 +833,6 @@ The following options need to be configured:
|
||||
CONFIG_SCSI * SCSI Support
|
||||
CONFIG_CMD_SDRAM * print SDRAM configuration information
|
||||
(requires CONFIG_CMD_I2C)
|
||||
CONFIG_CMD_SETGETDCR Support for DCR Register access
|
||||
(4xx only)
|
||||
CONFIG_CMD_SF * Read/write/erase SPI NOR flash
|
||||
CONFIG_CMD_SOFTSWITCH * Soft switch setting command for BF60x
|
||||
CONFIG_CMD_SOURCE "source" command Support
|
||||
@@ -2534,12 +2532,6 @@ The following options need to be configured:
|
||||
Define this option to include a destructive SPI flash
|
||||
test ('sf test').
|
||||
|
||||
CONFIG_SF_DUAL_FLASH Dual flash memories
|
||||
|
||||
Define this option to use dual flash support where two flash
|
||||
memories can be connected with a given cs line.
|
||||
Currently Xilinx Zynq qspi supports these type of connections.
|
||||
|
||||
- SystemACE Support:
|
||||
CONFIG_SYSTEMACE
|
||||
|
||||
@@ -3957,7 +3949,6 @@ Low Level (hardware related) configuration options:
|
||||
sequences.
|
||||
|
||||
U-Boot uses the following memory types:
|
||||
- PPC4xx: data cache
|
||||
|
||||
- CONFIG_SYS_GBL_DATA_OFFSET:
|
||||
|
||||
@@ -3996,10 +3987,6 @@ Low Level (hardware related) configuration options:
|
||||
CONFIG_SYS_OR3_PRELIM, CONFIG_SYS_BR3_PRELIM:
|
||||
Memory Controller Definitions: BR2/3 and OR2/3 (SDRAM)
|
||||
|
||||
- CONFIG_PCI_DISABLE_PCIE:
|
||||
Disable PCI-Express on systems where it is supported but not
|
||||
required.
|
||||
|
||||
- CONFIG_PCI_ENUM_ONLY
|
||||
Only scan through and get the devices on the buses.
|
||||
Don't do any setup work, presumably because someone or
|
||||
|
||||
@@ -43,6 +43,9 @@ struct stor_spec {
|
||||
|
||||
static struct stor_spec specs[ENUM_MAX] = { { 0, 0, 0, 0, NULL }, };
|
||||
|
||||
#ifndef CONFIG_SYS_MMC_MAX_DEVICE
|
||||
#define CONFIG_SYS_MMC_MAX_DEVICE 1
|
||||
#endif
|
||||
|
||||
void dev_stor_init(void)
|
||||
{
|
||||
|
||||
@@ -96,7 +96,6 @@ config X86
|
||||
select DM_SPI
|
||||
select DM_SPI_FLASH
|
||||
select USB_EHCI_HCD
|
||||
select DM_MMC if MMC
|
||||
imply CMD_FPGA_LOADMK
|
||||
imply CMD_GETTIME
|
||||
imply CMD_IO
|
||||
|
||||
@@ -132,10 +132,14 @@ config TARGET_AXS101
|
||||
config TARGET_AXS103
|
||||
bool "Support Synopsys Designware SDP board AXS103"
|
||||
|
||||
config TARGET_HSDK
|
||||
bool "Support Synpsys HS DevelopmentKit board"
|
||||
|
||||
endchoice
|
||||
|
||||
source "board/abilis/tb100/Kconfig"
|
||||
source "board/synopsys/Kconfig"
|
||||
source "board/synopsys/axs10x/Kconfig"
|
||||
source "board/synopsys/hsdk/Kconfig"
|
||||
|
||||
endmenu
|
||||
|
||||
@@ -6,6 +6,7 @@ dtb-$(CONFIG_TARGET_AXS101) += axs101.dtb
|
||||
dtb-$(CONFIG_TARGET_AXS103) += axs103.dtb
|
||||
dtb-$(CONFIG_TARGET_NSIM) += nsim.dtb
|
||||
dtb-$(CONFIG_TARGET_TB100) += abilis_tb100.dtb
|
||||
dtb-$(CONFIG_TARGET_HSDK) += hsdk.dtb
|
||||
|
||||
targets += $(dtb-y)
|
||||
|
||||
|
||||
50
arch/arc/dts/hsdk.dts
Normal file
50
arch/arc/dts/hsdk.dts
Normal file
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
* Copyright (C) 2017 Synopsys, Inc. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
/dts-v1/;
|
||||
|
||||
#include "skeleton.dtsi"
|
||||
|
||||
/ {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
aliases {
|
||||
console = &uart0;
|
||||
};
|
||||
|
||||
cpu_card {
|
||||
core_clk: core_clk {
|
||||
#clock-cells = <0>;
|
||||
compatible = "fixed-clock";
|
||||
clock-frequency = <1000000000>;
|
||||
u-boot,dm-pre-reloc;
|
||||
};
|
||||
};
|
||||
|
||||
uart0: serial0@f0005000 {
|
||||
compatible = "snps,dw-apb-uart";
|
||||
reg = <0xf0005000 0x1000>;
|
||||
reg-shift = <2>;
|
||||
reg-io-width = <4>;
|
||||
};
|
||||
|
||||
ethernet@f0008000 {
|
||||
#interrupt-cells = <1>;
|
||||
compatible = "altr,socfpga-stmmac";
|
||||
reg = <0xf0008000 0x2000>;
|
||||
phy-mode = "gmii";
|
||||
};
|
||||
|
||||
ehci@0xf0040000 {
|
||||
compatible = "generic-ehci";
|
||||
reg = <0xf0040000 0x100>;
|
||||
};
|
||||
|
||||
ohci@0xf0060000 {
|
||||
compatible = "generic-ohci";
|
||||
reg = <0xf0060000 0x100>;
|
||||
};
|
||||
};
|
||||
@@ -8,6 +8,7 @@
|
||||
#include <common.h>
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/log2.h>
|
||||
#include <asm/arcregs.h>
|
||||
#include <asm/cache.h>
|
||||
|
||||
@@ -215,17 +216,33 @@ void cache_init(void)
|
||||
read_decode_cache_bcr_arcv2();
|
||||
|
||||
if (ioc_exists) {
|
||||
/* IOC Aperture start is equal to DDR start */
|
||||
unsigned int ap_base = CONFIG_SYS_SDRAM_BASE;
|
||||
/* IOC Aperture size is equal to DDR size */
|
||||
long ap_size = CONFIG_SYS_SDRAM_SIZE;
|
||||
|
||||
flush_dcache_all();
|
||||
invalidate_dcache_all();
|
||||
|
||||
/* IO coherency base - 0x8z */
|
||||
write_aux_reg(ARC_AUX_IO_COH_AP0_BASE, 0x80000);
|
||||
/* IO coherency aperture size - 512Mb: 0x8z-0xAz */
|
||||
write_aux_reg(ARC_AUX_IO_COH_AP0_SIZE, 0x11);
|
||||
/* Enable partial writes */
|
||||
if (!is_power_of_2(ap_size) || ap_size < 4096)
|
||||
panic("IOC Aperture size must be power of 2 and bigger 4Kib");
|
||||
|
||||
/*
|
||||
* IOC Aperture size decoded as 2 ^ (SIZE + 2) KB,
|
||||
* so setting 0x11 implies 512M, 0x12 implies 1G...
|
||||
*/
|
||||
write_aux_reg(ARC_AUX_IO_COH_AP0_SIZE,
|
||||
order_base_2(ap_size/1024) - 2);
|
||||
|
||||
|
||||
/* IOC Aperture start must be aligned to the size of the aperture */
|
||||
if (ap_base % ap_size != 0)
|
||||
panic("IOC Aperture start must be aligned to the size of the aperture");
|
||||
|
||||
write_aux_reg(ARC_AUX_IO_COH_AP0_BASE, ap_base >> 12);
|
||||
write_aux_reg(ARC_AUX_IO_COH_PARTIAL, 1);
|
||||
/* Enable IO coherency */
|
||||
write_aux_reg(ARC_AUX_IO_COH_ENABLE, 1);
|
||||
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
#include <asm/arcregs.h>
|
||||
|
||||
ENTRY(_start)
|
||||
; ARCompact devices are not supposed to be SMP so master/slave check
|
||||
; makes no sense.
|
||||
#ifdef CONFIG_ISA_ARCV2
|
||||
; Non-masters will be halted immediately, they might be kicked later
|
||||
; by platform code right before passing control to the Linux kernel
|
||||
; in bootm.c:boot_jump_linux().
|
||||
@@ -25,6 +28,7 @@ ENTRY(_start)
|
||||
nop
|
||||
|
||||
.Lmaster_proceed:
|
||||
#endif
|
||||
|
||||
/* Setup interrupt vector base that matches "__text_start" */
|
||||
sr __ivt_start, [ARC_AUX_INTR_VEC_BASE]
|
||||
|
||||
@@ -253,7 +253,7 @@ config USE_ARCH_MEMCPY
|
||||
but may increase the binary size.
|
||||
|
||||
config SPL_USE_ARCH_MEMCPY
|
||||
bool "Use an assembly optimized implementation of memcpy"
|
||||
bool "Use an assembly optimized implementation of memcpy for SPL"
|
||||
default y if USE_ARCH_MEMCPY
|
||||
depends on !ARM64
|
||||
help
|
||||
@@ -271,7 +271,7 @@ config USE_ARCH_MEMSET
|
||||
but may increase the binary size.
|
||||
|
||||
config SPL_USE_ARCH_MEMSET
|
||||
bool "Use an assembly optimized implementation of memset"
|
||||
bool "Use an assembly optimized implementation of memset for SPL"
|
||||
default y if USE_ARCH_MEMSET
|
||||
depends on !ARM64
|
||||
help
|
||||
@@ -666,8 +666,8 @@ config ARCH_SUNXI
|
||||
select OF_BOARD_SETUP
|
||||
select OF_CONTROL
|
||||
select OF_SEPARATE
|
||||
select SPL_STACK_R if SUPPORT_SPL
|
||||
select SPL_SYS_MALLOC_SIMPLE if SUPPORT_SPL
|
||||
select SPL_STACK_R if SPL
|
||||
select SPL_SYS_MALLOC_SIMPLE if SPL
|
||||
select SYS_NS16550
|
||||
select SPL_SYS_THUMB_BUILD if !ARM64
|
||||
select USB if DISTRO_DEFAULTS
|
||||
|
||||
@@ -58,6 +58,14 @@ static ulong imx_get_mpllclk(void)
|
||||
return imx_decode_pll(readl(&ccm->mpctl), fref);
|
||||
}
|
||||
|
||||
static ulong imx_get_upllclk(void)
|
||||
{
|
||||
struct ccm_regs *ccm = (struct ccm_regs *)IMX_CCM_BASE;
|
||||
ulong fref = MXC_HCLK;
|
||||
|
||||
return imx_decode_pll(readl(&ccm->upctl), fref);
|
||||
}
|
||||
|
||||
static ulong imx_get_armclk(void)
|
||||
{
|
||||
struct ccm_regs *ccm = (struct ccm_regs *)IMX_CCM_BASE;
|
||||
@@ -95,7 +103,8 @@ static ulong imx_get_ipgclk(void)
|
||||
static ulong imx_get_perclk(int clk)
|
||||
{
|
||||
struct ccm_regs *ccm = (struct ccm_regs *)IMX_CCM_BASE;
|
||||
ulong fref = imx_get_ahbclk();
|
||||
ulong fref = readl(&ccm->mcr) & (1 << clk) ? imx_get_upllclk() :
|
||||
imx_get_ahbclk();
|
||||
ulong div;
|
||||
|
||||
div = readl(&ccm->pcdr[CCM_PERCLK_REG(clk)]);
|
||||
@@ -104,6 +113,25 @@ static ulong imx_get_perclk(int clk)
|
||||
return fref / div;
|
||||
}
|
||||
|
||||
int imx_set_perclk(enum mxc_clock clk, bool from_upll, unsigned int freq)
|
||||
{
|
||||
struct ccm_regs *ccm = (struct ccm_regs *)IMX_CCM_BASE;
|
||||
ulong fref = from_upll ? imx_get_upllclk() : imx_get_ahbclk();
|
||||
ulong div = (fref + freq - 1) / freq;
|
||||
|
||||
if (clk > MXC_UART_CLK || !div || --div > CCM_PERCLK_MASK)
|
||||
return -EINVAL;
|
||||
|
||||
clrsetbits_le32(&ccm->pcdr[CCM_PERCLK_REG(clk)],
|
||||
CCM_PERCLK_MASK << CCM_PERCLK_SHIFT(clk),
|
||||
div << CCM_PERCLK_SHIFT(clk));
|
||||
if (from_upll)
|
||||
setbits_le32(&ccm->mcr, 1 << clk);
|
||||
else
|
||||
clrbits_le32(&ccm->mcr, 1 << clk);
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned int mxc_get_clock(enum mxc_clock clk)
|
||||
{
|
||||
if (clk >= MXC_CLK_NUM)
|
||||
|
||||
@@ -158,7 +158,7 @@ u32 get_cpu_speed_grade_hz(void)
|
||||
* OCOTP_MEM0[7:6] (see Fusemap Description Table offset 0x480)
|
||||
* defines a 2-bit Temperature Grade
|
||||
*
|
||||
* return temperature grade and min/max temperature in celcius
|
||||
* return temperature grade and min/max temperature in Celsius
|
||||
*/
|
||||
#define OCOTP_MEM0_TEMP_SHIFT 6
|
||||
|
||||
|
||||
@@ -25,6 +25,13 @@ config TARGET_MX7DSABRESD
|
||||
select DM
|
||||
select DM_THERMAL
|
||||
|
||||
config TARGET_PICO_IMX7D
|
||||
bool "pico-imx7d"
|
||||
select BOARD_LATE_INIT
|
||||
select MX7D
|
||||
select DM
|
||||
select DM_THERMAL
|
||||
|
||||
config TARGET_WARP7
|
||||
bool "warp7"
|
||||
select BOARD_LATE_INIT
|
||||
@@ -45,6 +52,7 @@ config SYS_SOC
|
||||
default "mx7"
|
||||
|
||||
source "board/freescale/mx7dsabresd/Kconfig"
|
||||
source "board/technexion/pico-imx7d/Kconfig"
|
||||
source "board/toradex/colibri_imx7/Kconfig"
|
||||
source "board/warp7/Kconfig"
|
||||
|
||||
|
||||
@@ -37,12 +37,6 @@ static struct mm_region zynqmp_mem_map[] = {
|
||||
.attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
|
||||
PTE_BLOCK_NON_SHARE |
|
||||
PTE_BLOCK_PXN | PTE_BLOCK_UXN
|
||||
}, {
|
||||
.virt = 0xffe00000UL,
|
||||
.phys = 0xffe00000UL,
|
||||
.size = 0x00200000UL,
|
||||
.attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
|
||||
PTE_BLOCK_INNER_SHARE
|
||||
}, {
|
||||
.virt = 0x400000000UL,
|
||||
.phys = 0x400000000UL,
|
||||
@@ -104,3 +98,111 @@ unsigned int zynqmp_get_silicon_version(void)
|
||||
|
||||
return ZYNQMP_CSU_VERSION_SILICON;
|
||||
}
|
||||
|
||||
#define ZYNQMP_MMIO_READ 0xC2000014
|
||||
#define ZYNQMP_MMIO_WRITE 0xC2000013
|
||||
|
||||
#ifndef CONFIG_SPL_BUILD
|
||||
int invoke_smc(u32 pm_api_id, u32 arg0, u32 arg1, u32 arg2, u32 arg3,
|
||||
u32 *ret_payload)
|
||||
{
|
||||
/*
|
||||
* Added SIP service call Function Identifier
|
||||
* Make sure to stay in x0 register
|
||||
*/
|
||||
struct pt_regs regs;
|
||||
|
||||
regs.regs[0] = pm_api_id;
|
||||
regs.regs[1] = ((u64)arg1 << 32) | arg0;
|
||||
regs.regs[2] = ((u64)arg3 << 32) | arg2;
|
||||
|
||||
smc_call(®s);
|
||||
|
||||
if (ret_payload != NULL) {
|
||||
ret_payload[0] = (u32)regs.regs[0];
|
||||
ret_payload[1] = upper_32_bits(regs.regs[0]);
|
||||
ret_payload[2] = (u32)regs.regs[1];
|
||||
ret_payload[3] = upper_32_bits(regs.regs[1]);
|
||||
ret_payload[4] = (u32)regs.regs[2];
|
||||
}
|
||||
|
||||
return regs.regs[0];
|
||||
}
|
||||
|
||||
#define ZYNQMP_SIP_SVC_GET_API_VERSION 0xC2000001
|
||||
|
||||
#define ZYNQMP_PM_VERSION_MAJOR 0
|
||||
#define ZYNQMP_PM_VERSION_MINOR 3
|
||||
#define ZYNQMP_PM_VERSION_MAJOR_SHIFT 16
|
||||
#define ZYNQMP_PM_VERSION_MINOR_MASK 0xFFFF
|
||||
|
||||
#define ZYNQMP_PM_VERSION \
|
||||
((ZYNQMP_PM_VERSION_MAJOR << ZYNQMP_PM_VERSION_MAJOR_SHIFT) | \
|
||||
ZYNQMP_PM_VERSION_MINOR)
|
||||
|
||||
#if defined(CONFIG_CLK_ZYNQMP)
|
||||
void zynqmp_pmufw_version(void)
|
||||
{
|
||||
int ret;
|
||||
u32 ret_payload[PAYLOAD_ARG_CNT];
|
||||
u32 pm_api_version;
|
||||
|
||||
ret = invoke_smc(ZYNQMP_SIP_SVC_GET_API_VERSION, 0, 0, 0, 0,
|
||||
ret_payload);
|
||||
pm_api_version = ret_payload[1];
|
||||
|
||||
if (ret)
|
||||
panic("PMUFW is not found - Please load it!\n");
|
||||
|
||||
printf("PMUFW:\tv%d.%d\n",
|
||||
pm_api_version >> ZYNQMP_PM_VERSION_MAJOR_SHIFT,
|
||||
pm_api_version & ZYNQMP_PM_VERSION_MINOR_MASK);
|
||||
|
||||
if (pm_api_version != ZYNQMP_PM_VERSION)
|
||||
panic("PMUFW version error. Expected: v%d.%d\n",
|
||||
ZYNQMP_PM_VERSION_MAJOR, ZYNQMP_PM_VERSION_MINOR);
|
||||
}
|
||||
#endif
|
||||
|
||||
int zynqmp_mmio_write(const u32 address,
|
||||
const u32 mask,
|
||||
const u32 value)
|
||||
{
|
||||
return invoke_smc(ZYNQMP_MMIO_WRITE, address, mask, value, 0, NULL);
|
||||
}
|
||||
|
||||
int zynqmp_mmio_read(const u32 address, u32 *value)
|
||||
{
|
||||
u32 ret_payload[PAYLOAD_ARG_CNT];
|
||||
u32 ret;
|
||||
|
||||
if (!value)
|
||||
return -EINVAL;
|
||||
|
||||
ret = invoke_smc(ZYNQMP_MMIO_READ, address, 0, 0, 0, ret_payload);
|
||||
*value = ret_payload[1];
|
||||
|
||||
return ret;
|
||||
}
|
||||
#else
|
||||
int zynqmp_mmio_write(const u32 address,
|
||||
const u32 mask,
|
||||
const u32 value)
|
||||
{
|
||||
u32 data;
|
||||
u32 value_local = value;
|
||||
|
||||
zynqmp_mmio_read(address, &data);
|
||||
data &= ~mask;
|
||||
value_local &= mask;
|
||||
value_local |= data;
|
||||
writel(value_local, (ulong)address);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int zynqmp_mmio_read(const u32 address, u32 *value)
|
||||
{
|
||||
*value = readl((ulong)address);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -83,9 +83,15 @@ u32 spl_boot_device(void)
|
||||
case JTAG_MODE:
|
||||
return BOOT_DEVICE_RAM;
|
||||
#ifdef CONFIG_SPL_MMC_SUPPORT
|
||||
case EMMC_MODE:
|
||||
case SD_MODE:
|
||||
case SD_MODE1:
|
||||
case SD1_LSHFT_MODE: /* not working on silicon v1 */
|
||||
/* if both controllers enabled, then these two are the second controller */
|
||||
#if defined(CONFIG_ZYNQ_SDHCI0) && defined(CONFIG_ZYNQ_SDHCI1)
|
||||
return BOOT_DEVICE_MMC2;
|
||||
/* else, fall through, the one SDHCI controller that is enabled is number 1 */
|
||||
#endif
|
||||
case SD_MODE:
|
||||
case EMMC_MODE:
|
||||
return BOOT_DEVICE_MMC1;
|
||||
#endif
|
||||
#ifdef CONFIG_SPL_DFU_SUPPORT
|
||||
@@ -106,10 +112,11 @@ u32 spl_boot_device(void)
|
||||
|
||||
u32 spl_boot_mode(const u32 boot_device)
|
||||
{
|
||||
switch (spl_boot_device()) {
|
||||
switch (boot_device) {
|
||||
case BOOT_DEVICE_RAM:
|
||||
return 0;
|
||||
case BOOT_DEVICE_MMC1:
|
||||
case BOOT_DEVICE_MMC2:
|
||||
return MMCSD_MODE_FS;
|
||||
default:
|
||||
puts("spl: error: unsupported device\n");
|
||||
|
||||
@@ -97,8 +97,10 @@ dtb-$(CONFIG_ARCH_MVEBU) += \
|
||||
armada-38x-controlcenterdc.dtb
|
||||
|
||||
dtb-$(CONFIG_ARCH_UNIPHIER_LD11) += \
|
||||
uniphier-ld11-global.dtb \
|
||||
uniphier-ld11-ref.dtb
|
||||
dtb-$(CONFIG_ARCH_UNIPHIER_LD20) += \
|
||||
uniphier-ld20-global.dtb \
|
||||
uniphier-ld20-ref.dtb
|
||||
dtb-$(CONFIG_ARCH_UNIPHIER_LD4) += \
|
||||
uniphier-ld4-ref.dtb
|
||||
@@ -127,6 +129,7 @@ dtb-$(CONFIG_ARCH_ZYNQ) += zynq-zc702.dtb \
|
||||
zynq-microzed.dtb \
|
||||
zynq-picozed.dtb \
|
||||
zynq-topic-miami.dtb \
|
||||
zynq-topic-miamilite.dtb \
|
||||
zynq-topic-miamiplus.dtb \
|
||||
zynq-zc770-xm010.dtb \
|
||||
zynq-zc770-xm011.dtb \
|
||||
@@ -393,7 +396,7 @@ dtb-$(CONFIG_TARGET_AT91SAM9N12EK) += at91sam9n12ek.dtb
|
||||
|
||||
dtb-$(CONFIG_TARGET_OMAP3_LOGIC) += \
|
||||
logicpd-torpedo-37xx-devkit.dtb \
|
||||
logicpd-som-lv-37xx-devkit.dts
|
||||
logicpd-som-lv-37xx-devkit.dtb
|
||||
|
||||
dtb-$(CONFIG_TARGET_SAMA5D2_XPLAINED) += \
|
||||
at91-sama5d2_xplained.dtb
|
||||
|
||||
@@ -9,30 +9,30 @@
|
||||
|
||||
/{
|
||||
ocp {
|
||||
u-boot,dm-pre-reloc;
|
||||
u-boot,dm-spl;
|
||||
};
|
||||
};
|
||||
|
||||
&uart0 {
|
||||
u-boot,dm-pre-reloc;
|
||||
u-boot,dm-spl;
|
||||
};
|
||||
|
||||
&mmc1 {
|
||||
u-boot,dm-pre-reloc;
|
||||
u-boot,dm-spl;
|
||||
};
|
||||
|
||||
&mac {
|
||||
u-boot,dm-pre-reloc;
|
||||
u-boot,dm-spl;
|
||||
};
|
||||
|
||||
&davinci_mdio {
|
||||
u-boot,dm-pre-reloc;
|
||||
u-boot,dm-spl;
|
||||
};
|
||||
|
||||
&cpsw_emac0 {
|
||||
u-boot,dm-pre-reloc;
|
||||
u-boot,dm-spl;
|
||||
};
|
||||
|
||||
&phy_sel {
|
||||
u-boot,dm-pre-reloc;
|
||||
u-boot,dm-spl;
|
||||
};
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
compatible = "atmel,at91sam9260", "atmel,at91sam9";
|
||||
|
||||
chosen {
|
||||
u-boot,dm-pre-reloc;
|
||||
stdout-path = &dbgu;
|
||||
};
|
||||
|
||||
@@ -48,6 +49,7 @@
|
||||
};
|
||||
|
||||
dbgu: serial@fffff200 {
|
||||
u-boot,dm-pre-reloc;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
compatible = "atmel,at91sam9g20ek", "atmel,at91sam9g20", "atmel,at91sam9";
|
||||
|
||||
chosen {
|
||||
u-boot,dm-pre-reloc;
|
||||
stdout-path = &dbgu;
|
||||
};
|
||||
|
||||
@@ -48,6 +49,7 @@
|
||||
};
|
||||
|
||||
dbgu: serial@fffff200 {
|
||||
u-boot,dm-pre-reloc;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
compatible = "atmel,at91sam9m10g45ek", "atmel,at91sam9g45", "atmel,at91sam9";
|
||||
|
||||
chosen {
|
||||
u-boot,dm-pre-reloc;
|
||||
stdout-path = &dbgu;
|
||||
};
|
||||
|
||||
@@ -38,6 +39,7 @@
|
||||
ahb {
|
||||
apb {
|
||||
dbgu: serial@ffffee00 {
|
||||
u-boot,dm-pre-reloc;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
|
||||
@@ -122,44 +122,49 @@
|
||||
interrupts = <7 63 0>;
|
||||
};
|
||||
|
||||
sdhci@12510000 {
|
||||
sdhci0: sdhci@12510000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "samsung,exynos-mmc";
|
||||
compatible = "samsung,exynos4412-sdhci";
|
||||
reg = <0x12510000 0x1000>;
|
||||
interrupts = <0 75 0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
sdhci@12520000 {
|
||||
sdhci1: sdhci@12520000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "samsung,exynos-mmc";
|
||||
compatible = "samsung,exynos4412-sdhci";
|
||||
reg = <0x12520000 0x1000>;
|
||||
interrupts = <0 76 0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
sdhci@12530000 {
|
||||
sdhci2: sdhci@12530000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "samsung,exynos-mmc";
|
||||
compatible = "samsung,exynos4412-sdhci";
|
||||
reg = <0x12530000 0x1000>;
|
||||
interrupts = <0 77 0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
sdhci@12540000 {
|
||||
sdhci3: sdhci@12540000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "samsung,exynos-mmc";
|
||||
compatible = "samsung,exynos4412-sdhci";
|
||||
reg = <0x12540000 0x1000>;
|
||||
interrupts = <0 78 0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
dwmmc@12550000 {
|
||||
mshc_0: dwmmc@12550000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "samsung,exynos-dwmmc";
|
||||
compatible = "samsung,exynos4412-dw-mshc";
|
||||
reg = <0x12550000 0x1000>;
|
||||
interrupts = <0 131 0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
@@ -22,24 +22,12 @@
|
||||
aliases {
|
||||
serial0 = "/serial@13800000";
|
||||
console = "/serial@13820000";
|
||||
mmc2 = "/sdhci@12530000";
|
||||
};
|
||||
|
||||
sdhci@12510000 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
sdhci@12520000 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
sdhci@12530000 {
|
||||
samsung,bus-width = <4>;
|
||||
samsung,timing = <1 2 3>;
|
||||
cd-gpios = <&gpk2 2 0>;
|
||||
};
|
||||
|
||||
sdhci@12540000 {
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
|
||||
&sdhci2 {
|
||||
samsung,bus-width = <4>;
|
||||
samsung,timing = <1 2 3>;
|
||||
cd-gpios = <&gpk2 2 0>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@@ -21,8 +21,6 @@
|
||||
aliases {
|
||||
serial0 = "/serial@13800000";
|
||||
console = "/serial@13820000";
|
||||
mmc0 = "/sdhci@12510000";
|
||||
mmc2 = "/sdhci@12530000";
|
||||
i2c8 = &i2c_fg;
|
||||
};
|
||||
|
||||
@@ -91,30 +89,6 @@
|
||||
samsung,dsim-device-reverse-panel = <1>;
|
||||
};
|
||||
|
||||
sdhci@12510000 {
|
||||
samsung,bus-width = <8>;
|
||||
samsung,timing = <1 3 3>;
|
||||
pwr-gpios = <&gpk0 2 0>;
|
||||
};
|
||||
|
||||
sdhci@12520000 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
sdhci@12530000 {
|
||||
samsung,bus-width = <4>;
|
||||
samsung,timing = <1 2 3>;
|
||||
cd-gpios = <&gpx3 4 0>;
|
||||
};
|
||||
|
||||
sdhci@12540000 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
dwmmc@12550000 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
i2c_fg: fuel-gauge {
|
||||
compatible = "i2c-gpio";
|
||||
gpios = <&gpy4 1 0>, /* sda */
|
||||
@@ -265,3 +239,17 @@
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&sdhci0 {
|
||||
samsung,bus-width = <8>;
|
||||
samsung,timing = <1 3 3>;
|
||||
pwr-gpios = <&gpk0 2 0>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&sdhci2 {
|
||||
samsung,bus-width = <4>;
|
||||
samsung,timing = <1 2 3>;
|
||||
cd-gpios = <&gpx3 4 0>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@@ -17,28 +17,6 @@
|
||||
aliases {
|
||||
serial0 = "/serial@13800000";
|
||||
console = "/serial@13820000";
|
||||
mmc0 = "/sdhci@12510000";
|
||||
mmc2 = "/sdhci@12530000";
|
||||
};
|
||||
|
||||
sdhci@12510000 {
|
||||
samsung,bus-width = <8>;
|
||||
samsung,timing = <1 3 3>;
|
||||
pwr-gpios = <&gpk0 2 0>;
|
||||
};
|
||||
|
||||
sdhci@12520000 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
sdhci@12530000 {
|
||||
samsung,bus-width = <4>;
|
||||
samsung,timing = <1 2 3>;
|
||||
cd-gpios = <&gpx3 4 0>;
|
||||
};
|
||||
|
||||
sdhci@12540000 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
soft-spi {
|
||||
@@ -258,3 +236,17 @@
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&sdhci0 {
|
||||
samsung,bus-width = <8>;
|
||||
samsung,timing = <1 3 3>;
|
||||
pwr-gpios = <&gpk0 2 0>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&sdhci2 {
|
||||
samsung,bus-width = <4>;
|
||||
samsung,timing = <1 2 3>;
|
||||
cd-gpios = <&gpx3 4 0>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@@ -25,8 +25,8 @@
|
||||
i2c7 = "/i2c@138d0000";
|
||||
serial0 = "/serial@13800000";
|
||||
console = "/serial@13810000";
|
||||
mmc2 = "/sdhci@12530000";
|
||||
mmc4 = "/dwmmc@12550000";
|
||||
mmc0 = &mshc_0;
|
||||
mmc1 = &sdhci2;
|
||||
};
|
||||
|
||||
i2c@13860000 {
|
||||
@@ -224,34 +224,6 @@
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
sdhci@12510000 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
sdhci@12520000 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
sdhci@12530000 {
|
||||
samsung,bus-width = <4>;
|
||||
samsung,timing = <1 2 3>;
|
||||
cd-gpios = <&gpk2 2 0>;
|
||||
};
|
||||
|
||||
sdhci@12540000 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
dwmmc@12550000 {
|
||||
samsung,bus-width = <8>;
|
||||
samsung,timing = <2 1 0>;
|
||||
samsung,removable = <0>;
|
||||
fifoth_val = <0x203f0040>;
|
||||
bus_hz = <400000000>;
|
||||
div = <0x3>;
|
||||
index = <4>;
|
||||
};
|
||||
|
||||
ehci@12580000 {
|
||||
compatible = "samsung,exynos-ehci";
|
||||
reg = <0x12580000 0x100>;
|
||||
@@ -268,3 +240,21 @@
|
||||
reset-gpio = <&gpk1 2 0>;
|
||||
};
|
||||
};
|
||||
|
||||
&sdhci2 {
|
||||
samsung,bus-width = <4>;
|
||||
samsung,timing = <1 2 3>;
|
||||
cd-gpios = <&gpk2 2 0>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&mshc_0 {
|
||||
samsung,bus-width = <8>;
|
||||
samsung,timing = <2 1 0>;
|
||||
samsung,removable = <0>;
|
||||
fifoth_val = <0x203f0040>;
|
||||
bus_hz = <400000000>;
|
||||
div = <0x3>;
|
||||
index = <4>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@@ -31,9 +31,8 @@
|
||||
i2c9 = &i2c_max77693;
|
||||
serial0 = "/serial@13800000";
|
||||
console = "/serial@13820000";
|
||||
mmc0 = "/sdhci@12510000";
|
||||
mmc2 = "/sdhci@12530000";
|
||||
mshc0 = "/dwmmc@12550000";
|
||||
mmc0 = &mshc_0;
|
||||
mmc1 = &sdhci2;
|
||||
};
|
||||
|
||||
i2c_fg: fuel-gauge {
|
||||
@@ -437,28 +436,30 @@
|
||||
pwr-gpios = <&gpk0 4 0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
sdhci@12520000 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
sdhci@12530000 {
|
||||
samsung,bus-width = <4>;
|
||||
samsung,timing = <1 2 3>;
|
||||
cd-gpios = <&gpk2 2 0>;
|
||||
};
|
||||
|
||||
sdhci@12540000 {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
dwmmc@12550000 {
|
||||
samsung,bus-width = <8>;
|
||||
samsung,timing = <2 1 0>;
|
||||
pwr-gpios = <&gpk0 4 0>;
|
||||
fifoth_val = <0x203f0040>;
|
||||
bus_hz = <400000000>;
|
||||
div = <0x3>;
|
||||
index = <4>;
|
||||
};
|
||||
};
|
||||
|
||||
&sdhci0 {
|
||||
samsung,bus-width = <8>;
|
||||
samsung,timing = <1 3 3>;
|
||||
pwr-gpios = <&gpk0 4 0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&sdhci2 {
|
||||
samsung,bus-width = <4>;
|
||||
samsung,timing = <1 2 3>;
|
||||
cd-gpios = <&gpk2 2 0>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&mshc_0 {
|
||||
samsung,bus-width = <8>;
|
||||
samsung,timing = <2 1 0>;
|
||||
samsung,removable = <0>;
|
||||
fifoth_val = <0x203f0040>;
|
||||
bus_hz = <400000000>;
|
||||
div = <0x3>;
|
||||
index = <4>;
|
||||
fifo-depth = <0x80>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
pinctrl1 = &pinctrl_1;
|
||||
pinctrl2 = &pinctrl_2;
|
||||
pinctrl3 = &pinctrl_3;
|
||||
mshc0 = &mshc_0;
|
||||
};
|
||||
|
||||
pd_isp: isp-power-domain@10023CA0 {
|
||||
@@ -100,16 +99,4 @@
|
||||
clock-names = "sclk_fimg2d", "fimg2d";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
mshc_0: mmc@12550000 {
|
||||
compatible = "samsung,exynos4412-dw-mshc";
|
||||
reg = <0x12550000 0x1000>;
|
||||
interrupts = <0 77 0>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
fifo-depth = <0x80>;
|
||||
clocks = <&clock 301>, <&clock 149>;
|
||||
clock-names = "biu", "ciu";
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
|
||||
@@ -40,6 +40,215 @@
|
||||
s2mps11_pmic@66 {
|
||||
compatible = "samsung,s2mps11-pmic";
|
||||
reg = <0x66>;
|
||||
voltage-regulators {
|
||||
ldo1_reg: LDO1 {
|
||||
regulator-name = "vdd_ldo1";
|
||||
regulator-min-microvolt = <1000000>;
|
||||
regulator-max-microvolt = <1000000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
ldo3_reg: LDO3 {
|
||||
regulator-name = "vddq_mmc0";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
};
|
||||
|
||||
ldo4_reg: LDO4 {
|
||||
regulator-name = "vdd_adc";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
};
|
||||
|
||||
ldo5_reg: LDO5 {
|
||||
regulator-name = "vdd_ldo5";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
ldo6_reg: LDO6 {
|
||||
regulator-name = "vdd_ldo6";
|
||||
regulator-min-microvolt = <1000000>;
|
||||
regulator-max-microvolt = <1000000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
ldo7_reg: LDO7 {
|
||||
regulator-name = "vdd_ldo7";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
ldo8_reg: LDO8 {
|
||||
regulator-name = "vdd_ldo8";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
ldo9_reg: LDO9 {
|
||||
regulator-name = "vdd_ldo9";
|
||||
regulator-min-microvolt = <3000000>;
|
||||
regulator-max-microvolt = <3000000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
ldo10_reg: LDO10 {
|
||||
regulator-name = "vdd_ldo10";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
ldo11_reg: LDO11 {
|
||||
regulator-name = "vdd_ldo11";
|
||||
regulator-min-microvolt = <1000000>;
|
||||
regulator-max-microvolt = <1000000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
ldo12_reg: LDO12 {
|
||||
regulator-name = "vdd_ldo12";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
ldo13_reg: LDO13 {
|
||||
regulator-name = "vddq_mmc2";
|
||||
regulator-min-microvolt = <2800000>;
|
||||
regulator-max-microvolt = <2800000>;
|
||||
};
|
||||
|
||||
ldo15_reg: LDO15 {
|
||||
regulator-name = "vdd_ldo15";
|
||||
regulator-min-microvolt = <3100000>;
|
||||
regulator-max-microvolt = <3100000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
ldo16_reg: LDO16 {
|
||||
regulator-name = "vdd_ldo16";
|
||||
regulator-min-microvolt = <2200000>;
|
||||
regulator-max-microvolt = <2200000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
ldo17_reg: LDO17 {
|
||||
regulator-name = "tsp_avdd";
|
||||
regulator-min-microvolt = <3300000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
ldo18_reg: LDO18 {
|
||||
regulator-name = "vdd_emmc_1V8";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
};
|
||||
|
||||
ldo19_reg: LDO19 {
|
||||
regulator-name = "vdd_sd";
|
||||
regulator-min-microvolt = <2800000>;
|
||||
regulator-max-microvolt = <2800000>;
|
||||
};
|
||||
|
||||
ldo24_reg: LDO24 {
|
||||
regulator-name = "tsp_io";
|
||||
regulator-min-microvolt = <2800000>;
|
||||
regulator-max-microvolt = <2800000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
ldo26_reg: LDO26 {
|
||||
regulator-name = "vdd_ldo26";
|
||||
regulator-min-microvolt = <3000000>;
|
||||
regulator-max-microvolt = <3000000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
buck1_reg: BUCK1 {
|
||||
regulator-name = "vdd_mif";
|
||||
regulator-min-microvolt = <800000>;
|
||||
regulator-max-microvolt = <1300000>;
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
};
|
||||
|
||||
buck2_reg: BUCK2 {
|
||||
regulator-name = "vdd_arm";
|
||||
regulator-min-microvolt = <800000>;
|
||||
regulator-max-microvolt = <1500000>;
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
};
|
||||
|
||||
buck3_reg: BUCK3 {
|
||||
regulator-name = "vdd_int";
|
||||
regulator-min-microvolt = <800000>;
|
||||
regulator-max-microvolt = <1400000>;
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
};
|
||||
|
||||
buck4_reg: BUCK4 {
|
||||
regulator-name = "vdd_g3d";
|
||||
regulator-min-microvolt = <800000>;
|
||||
regulator-max-microvolt = <1400000>;
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
};
|
||||
|
||||
buck5_reg: BUCK5 {
|
||||
regulator-name = "vdd_mem";
|
||||
regulator-min-microvolt = <800000>;
|
||||
regulator-max-microvolt = <1400000>;
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
};
|
||||
|
||||
buck6_reg: BUCK6 {
|
||||
regulator-name = "vdd_kfc";
|
||||
regulator-min-microvolt = <800000>;
|
||||
regulator-max-microvolt = <1500000>;
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
};
|
||||
|
||||
buck7_reg: BUCK7 {
|
||||
regulator-name = "vdd_1.0v_ldo";
|
||||
regulator-min-microvolt = <800000>;
|
||||
regulator-max-microvolt = <1500000>;
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
};
|
||||
|
||||
buck8_reg: BUCK8 {
|
||||
regulator-name = "vdd_1.8v_ldo";
|
||||
regulator-min-microvolt = <800000>;
|
||||
regulator-max-microvolt = <1500000>;
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
};
|
||||
|
||||
buck9_reg: BUCK9 {
|
||||
regulator-name = "vdd_2.8v_ldo";
|
||||
regulator-min-microvolt = <3000000>;
|
||||
regulator-max-microvolt = <3750000>;
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
};
|
||||
|
||||
buck10_reg: BUCK10 {
|
||||
regulator-name = "vdd_vmem";
|
||||
regulator-min-microvolt = <2850000>;
|
||||
regulator-max-microvolt = <2850000>;
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
/{
|
||||
ocp {
|
||||
u-boot,dm-pre-reloc;
|
||||
u-boot,dm-spl;
|
||||
|
||||
ocp2scp@4a090000 {
|
||||
compatible = "ti,omap-ocp2scp", "simple-bus";
|
||||
@@ -18,37 +18,37 @@
|
||||
};
|
||||
|
||||
&uart1 {
|
||||
u-boot,dm-pre-reloc;
|
||||
u-boot,dm-spl;
|
||||
};
|
||||
|
||||
&uart3 {
|
||||
u-boot,dm-pre-reloc;
|
||||
u-boot,dm-spl;
|
||||
};
|
||||
|
||||
&mmc1 {
|
||||
u-boot,dm-pre-reloc;
|
||||
u-boot,dm-spl;
|
||||
};
|
||||
|
||||
&mmc2 {
|
||||
u-boot,dm-pre-reloc;
|
||||
u-boot,dm-spl;
|
||||
};
|
||||
|
||||
&l4_cfg {
|
||||
u-boot,dm-pre-reloc;
|
||||
u-boot,dm-spl;
|
||||
};
|
||||
|
||||
&scm {
|
||||
u-boot,dm-pre-reloc;
|
||||
u-boot,dm-spl;
|
||||
};
|
||||
|
||||
&scm_conf {
|
||||
u-boot,dm-pre-reloc;
|
||||
u-boot,dm-spl;
|
||||
};
|
||||
|
||||
&qspi {
|
||||
u-boot,dm-pre-reloc;
|
||||
u-boot,dm-spl;
|
||||
|
||||
m25p80@0 {
|
||||
u-boot,dm-pre-reloc;
|
||||
u-boot,dm-spl;
|
||||
};
|
||||
};
|
||||
|
||||
79
arch/arm/dts/uniphier-ld11-global.dts
Normal file
79
arch/arm/dts/uniphier-ld11-global.dts
Normal file
@@ -0,0 +1,79 @@
|
||||
/*
|
||||
* Device Tree Source for UniPhier LD11 Global Board
|
||||
*
|
||||
* Copyright (C) 2016-2017 Socionext Inc.
|
||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
* Kunihiko Hayashi <hayashi.kunihiko@socionext.com>
|
||||
*
|
||||
* SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
/include/ "uniphier-ld11.dtsi"
|
||||
|
||||
/ {
|
||||
model = "UniPhier LD11 Global Board (REF_LD11_GP)";
|
||||
compatible = "socionext,uniphier-ld11-global",
|
||||
"socionext,uniphier-ld11";
|
||||
|
||||
chosen {
|
||||
stdout-path = "serial0:115200n8";
|
||||
};
|
||||
|
||||
aliases {
|
||||
serial0 = &serial0;
|
||||
serial1 = &serial1;
|
||||
serial2 = &serial2;
|
||||
serial3 = &serial3;
|
||||
i2c0 = &i2c0;
|
||||
i2c1 = &i2c1;
|
||||
i2c2 = &i2c2;
|
||||
i2c3 = &i2c3;
|
||||
i2c4 = &i2c4;
|
||||
i2c5 = &i2c5;
|
||||
};
|
||||
|
||||
memory@80000000 {
|
||||
device_type = "memory";
|
||||
reg = <0 0x80000000 0 0x40000000>;
|
||||
};
|
||||
};
|
||||
|
||||
&serial0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&serial1 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&i2c0 {
|
||||
status = "okay";
|
||||
|
||||
eeprom@50 {
|
||||
compatible = "st,24c64", "atmel,24c64", "i2c-eeprom";
|
||||
reg = <0x50>;
|
||||
pagesize = <32>;
|
||||
};
|
||||
};
|
||||
|
||||
&usb0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&usb1 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&usb2 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
/* for U-Boot only */
|
||||
&serial0 {
|
||||
u-boot,dm-pre-reloc;
|
||||
};
|
||||
|
||||
&pinctrl_uart0 {
|
||||
u-boot,dm-pre-reloc;
|
||||
};
|
||||
@@ -4,7 +4,7 @@
|
||||
* Copyright (C) 2016 Socionext Inc.
|
||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+ X11
|
||||
* SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
@@ -4,46 +4,10 @@
|
||||
* Copyright (C) 2016 Socionext Inc.
|
||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
*
|
||||
* This file is dual-licensed: you can use it either under the terms
|
||||
* of the GPL or the X11 license, at your option. Note that this dual
|
||||
* licensing only applies to this file, and not this project as a
|
||||
* whole.
|
||||
*
|
||||
* a) This 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 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This 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.
|
||||
*
|
||||
* Or, alternatively,
|
||||
*
|
||||
* b) Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following
|
||||
* conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
* SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
*/
|
||||
|
||||
/memreserve/ 0x80000000 0x00080000;
|
||||
/memreserve/ 0x80000000 0x02000000;
|
||||
|
||||
/ {
|
||||
compatible = "socionext,uniphier-ld11";
|
||||
|
||||
61
arch/arm/dts/uniphier-ld20-global.dts
Normal file
61
arch/arm/dts/uniphier-ld20-global.dts
Normal file
@@ -0,0 +1,61 @@
|
||||
/*
|
||||
* Device Tree Source for UniPhier LD20 Global Board
|
||||
*
|
||||
* Copyright (C) 2015-2017 Socionext Inc.
|
||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
* Kunihiko Hayashi <hayashi.kunihiko@socionext.com>
|
||||
*
|
||||
* SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
/include/ "uniphier-ld20.dtsi"
|
||||
|
||||
/ {
|
||||
model = "UniPhier LD20 Global Board (REF_LD20_GP)";
|
||||
compatible = "socionext,uniphier-ld20-global",
|
||||
"socionext,uniphier-ld20";
|
||||
|
||||
chosen {
|
||||
stdout-path = "serial0:115200n8";
|
||||
};
|
||||
|
||||
aliases {
|
||||
serial0 = &serial0;
|
||||
serial1 = &serial1;
|
||||
serial2 = &serial2;
|
||||
serial3 = &serial3;
|
||||
i2c0 = &i2c0;
|
||||
i2c1 = &i2c1;
|
||||
i2c2 = &i2c2;
|
||||
i2c3 = &i2c3;
|
||||
i2c4 = &i2c4;
|
||||
i2c5 = &i2c5;
|
||||
};
|
||||
|
||||
memory@80000000 {
|
||||
device_type = "memory";
|
||||
reg = <0 0x80000000 0 0xc0000000>;
|
||||
};
|
||||
};
|
||||
|
||||
&serial0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&serial1 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
&i2c0 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
/* for U-Boot only */
|
||||
&serial0 {
|
||||
u-boot,dm-pre-reloc;
|
||||
};
|
||||
|
||||
&pinctrl_uart0 {
|
||||
u-boot,dm-pre-reloc;
|
||||
};
|
||||
@@ -4,7 +4,7 @@
|
||||
* Copyright (C) 2015-2016 Socionext Inc.
|
||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+ X11
|
||||
* SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
@@ -4,46 +4,10 @@
|
||||
* Copyright (C) 2015-2016 Socionext Inc.
|
||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
*
|
||||
* This file is dual-licensed: you can use it either under the terms
|
||||
* of the GPL or the X11 license, at your option. Note that this dual
|
||||
* licensing only applies to this file, and not this project as a
|
||||
* whole.
|
||||
*
|
||||
* a) This 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 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This 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.
|
||||
*
|
||||
* Or, alternatively,
|
||||
*
|
||||
* b) Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following
|
||||
* conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
* SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
*/
|
||||
|
||||
/memreserve/ 0x80000000 0x00080000;
|
||||
/memreserve/ 0x80000000 0x02000000;
|
||||
|
||||
/ {
|
||||
compatible = "socionext,uniphier-ld20";
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Copyright (C) 2015-2016 Socionext Inc.
|
||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+ X11
|
||||
* SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
@@ -4,43 +4,7 @@
|
||||
* Copyright (C) 2015-2016 Socionext Inc.
|
||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
*
|
||||
* This file is dual-licensed: you can use it either under the terms
|
||||
* of the GPL or the X11 license, at your option. Note that this dual
|
||||
* licensing only applies to this file, and not this project as a
|
||||
* whole.
|
||||
*
|
||||
* a) This 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 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This 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.
|
||||
*
|
||||
* Or, alternatively,
|
||||
*
|
||||
* b) Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following
|
||||
* conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
* SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
*/
|
||||
|
||||
/ {
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Copyright (C) 2015-2016 Socionext Inc.
|
||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
* SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Copyright (C) 2015-2016 Socionext Inc.
|
||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+ X11
|
||||
* SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
*/
|
||||
|
||||
/*
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Copyright (C) 2015-2017 Socionext Inc.
|
||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+ X11
|
||||
* SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
*/
|
||||
|
||||
&pinctrl {
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Copyright (C) 2016 Socionext Inc.
|
||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+ X11
|
||||
* SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
@@ -52,7 +52,7 @@
|
||||
status = "okay";
|
||||
|
||||
eeprom@54 {
|
||||
compatible = "st,24c64", "i2c-eeprom";
|
||||
compatible = "st,24c64", "atmel,24c64", "i2c-eeprom";
|
||||
reg = <0x54>;
|
||||
pagesize = <32>;
|
||||
u-boot,i2c-offset-len = <2>;
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Copyright (C) 2015-2016 Socionext Inc.
|
||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+ X11
|
||||
* SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Copyright (C) 2016 Socionext Inc.
|
||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+ X11
|
||||
* SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
@@ -47,7 +47,7 @@
|
||||
status = "okay";
|
||||
|
||||
eeprom@54 {
|
||||
compatible = "st,24c64", "i2c-eeprom";
|
||||
compatible = "st,24c64", "atmel,24c64", "i2c-eeprom";
|
||||
reg = <0x54>;
|
||||
pagesize = <32>;
|
||||
u-boot,i2c-offset-len = <2>;
|
||||
|
||||
@@ -4,43 +4,7 @@
|
||||
* Copyright (C) 2015-2016 Socionext Inc.
|
||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
*
|
||||
* This file is dual-licensed: you can use it either under the terms
|
||||
* of the GPL or the X11 license, at your option. Note that this dual
|
||||
* licensing only applies to this file, and not this project as a
|
||||
* whole.
|
||||
*
|
||||
* a) This 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 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This 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.
|
||||
*
|
||||
* Or, alternatively,
|
||||
*
|
||||
* b) Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following
|
||||
* conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
* SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
*/
|
||||
|
||||
/ {
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Copyright (C) 2015-2016 Socionext Inc.
|
||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
* SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
@@ -4,43 +4,7 @@
|
||||
* Copyright (C) 2015-2016 Socionext Inc.
|
||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
*
|
||||
* This file is dual-licensed: you can use it either under the terms
|
||||
* of the GPL or the X11 license, at your option. Note that this dual
|
||||
* licensing only applies to this file, and not this project as a
|
||||
* whole.
|
||||
*
|
||||
* a) This 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 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This 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.
|
||||
*
|
||||
* Or, alternatively,
|
||||
*
|
||||
* b) Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following
|
||||
* conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
* SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
*/
|
||||
|
||||
/ {
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Copyright (C) 2015-2016 Socionext Inc.
|
||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
* SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
@@ -44,7 +44,7 @@
|
||||
status = "okay";
|
||||
|
||||
eeprom@54 {
|
||||
compatible = "st,24c64", "i2c-eeprom";
|
||||
compatible = "st,24c64", "atmel,24c64", "i2c-eeprom";
|
||||
reg = <0x54>;
|
||||
pagesize = <32>;
|
||||
u-boot,i2c-offset-len = <2>;
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Copyright (C) 2015-2016 Socionext Inc.
|
||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
* SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
@@ -4,43 +4,7 @@
|
||||
* Copyright (C) 2015-2016 Socionext Inc.
|
||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
*
|
||||
* This file is dual-licensed: you can use it either under the terms
|
||||
* of the GPL or the X11 license, at your option. Note that this dual
|
||||
* licensing only applies to this file, and not this project as a
|
||||
* whole.
|
||||
*
|
||||
* a) This 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 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This 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.
|
||||
*
|
||||
* Or, alternatively,
|
||||
*
|
||||
* b) Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following
|
||||
* conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
* SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
*/
|
||||
|
||||
/ {
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Copyright (C) 2015-2017 Socionext Inc.
|
||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+ X11
|
||||
* SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
*/
|
||||
|
||||
&i2c0 {
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Copyright (C) 2015-2016 Socionext Inc.
|
||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+ X11
|
||||
* SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
@@ -4,43 +4,7 @@
|
||||
* Copyright (C) 2015-2016 Socionext Inc.
|
||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
*
|
||||
* This file is dual-licensed: you can use it either under the terms
|
||||
* of the GPL or the X11 license, at your option. Note that this dual
|
||||
* licensing only applies to this file, and not this project as a
|
||||
* whole.
|
||||
*
|
||||
* a) This 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 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This 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.
|
||||
*
|
||||
* Or, alternatively,
|
||||
*
|
||||
* b) Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following
|
||||
* conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
* SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
*/
|
||||
|
||||
/ {
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Copyright (C) 2015-2016 Socionext Inc.
|
||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+ X11
|
||||
* SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
@@ -4,43 +4,7 @@
|
||||
* Copyright (C) 2015-2016 Socionext Inc.
|
||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
*
|
||||
* This file is dual-licensed: you can use it either under the terms
|
||||
* of the GPL or the X11 license, at your option. Note that this dual
|
||||
* licensing only applies to this file, and not this project as a
|
||||
* whole.
|
||||
*
|
||||
* a) This 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 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This 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.
|
||||
*
|
||||
* Or, alternatively,
|
||||
*
|
||||
* b) Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following
|
||||
* conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
* SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
*/
|
||||
|
||||
/ {
|
||||
|
||||
@@ -4,43 +4,7 @@
|
||||
* Copyright (C) 2015-2017 Socionext Inc.
|
||||
* Author: Masahiro Yamada <yamada.masahiro@socionext.com>
|
||||
*
|
||||
* This file is dual-licensed: you can use it either under the terms
|
||||
* of the GPL or the X11 license, at your option. Note that this dual
|
||||
* licensing only applies to this file, and not this project as a
|
||||
* whole.
|
||||
*
|
||||
* a) This 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 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This 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.
|
||||
*
|
||||
* Or, alternatively,
|
||||
*
|
||||
* b) Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
* sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following
|
||||
* conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
* SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||
*/
|
||||
|
||||
&system_bus {
|
||||
|
||||
17
arch/arm/dts/zynq-topic-miamilite.dts
Normal file
17
arch/arm/dts/zynq-topic-miamilite.dts
Normal file
@@ -0,0 +1,17 @@
|
||||
/*
|
||||
* Topic Miami Lite board DTS
|
||||
*
|
||||
* Copyright (C) 2017 Topic Embedded Products
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
#include "zynq-topic-miami.dts"
|
||||
|
||||
/ {
|
||||
model = "Topic Miami Lite Zynq Board";
|
||||
compatible = "topic,miamilite", "xlnx,zynq-7000";
|
||||
};
|
||||
|
||||
&qspi {
|
||||
is-dual = <1>;
|
||||
};
|
||||
@@ -275,6 +275,9 @@ u32 get_ahb_clk(void)
|
||||
|
||||
void arch_preboot_os(void)
|
||||
{
|
||||
#if defined(CONFIG_PCIE_IMX)
|
||||
imx_pcie_remove();
|
||||
#endif
|
||||
#if defined(CONFIG_CMD_SATA)
|
||||
sata_stop();
|
||||
#if defined(CONFIG_MX6)
|
||||
|
||||
38
arch/arm/include/asm/arch-am33xx/emac_defs.h
Normal file
38
arch/arm/include/asm/arch-am33xx/emac_defs.h
Normal file
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* Copyright (C) 2010 Texas Instruments
|
||||
*
|
||||
* Based on:
|
||||
*
|
||||
* ----------------------------------------------------------------------------
|
||||
*
|
||||
* dm644x_emac.h
|
||||
*
|
||||
* TI DaVinci (DM644X) EMAC peripheral driver header for DV-EVM
|
||||
*
|
||||
* Copyright (C) 2005 Texas Instruments.
|
||||
*
|
||||
* ----------------------------------------------------------------------------
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _EMAC_DEFS_H_
|
||||
#define _EMAC_DEFS_H_
|
||||
|
||||
#ifdef CONFIG_TI816X
|
||||
#define EMAC_BASE_ADDR (0x4A100000)
|
||||
#define EMAC_WRAPPER_BASE_ADDR (0x4A100900)
|
||||
#define EMAC_WRAPPER_RAM_ADDR (0x4A102000)
|
||||
#define EMAC_MDIO_BASE_ADDR (0x4A100800)
|
||||
#define EMAC_MDIO_BUS_FREQ (250000000UL)
|
||||
#define EMAC_MDIO_CLOCK_FREQ (2000000UL)
|
||||
|
||||
typedef volatile unsigned int dv_reg;
|
||||
typedef volatile unsigned int *dv_reg_p;
|
||||
|
||||
#define DAVINCI_EMAC_VERSION2
|
||||
#define DAVINCI_EMAC_GIG_ENABLE
|
||||
#endif
|
||||
|
||||
#endif /* _EMAC_DEFS_H_ */
|
||||
@@ -31,6 +31,7 @@
|
||||
|
||||
/* Control Module Base Address */
|
||||
#define CTRL_BASE 0x48140000
|
||||
#define CTRL_DEVICE_BASE 0x48140600
|
||||
|
||||
/* PRCM Base Address */
|
||||
#define PRCM_BASE 0x48180000
|
||||
|
||||
@@ -51,6 +51,7 @@ enum mxc_clock {
|
||||
MXC_CLK_NUM
|
||||
};
|
||||
|
||||
int imx_set_perclk(enum mxc_clock clk, bool from_upll, unsigned int freq);
|
||||
unsigned int mxc_get_clock(enum mxc_clock clk);
|
||||
|
||||
#define imx_get_uartclk() mxc_get_clock(MXC_UART_CLK)
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
#ifndef _ASM_ARCH_SYS_PROTO_H
|
||||
#define _ASM_ARCH_SYS_PROTO_H
|
||||
|
||||
#define PAYLOAD_ARG_CNT 5
|
||||
|
||||
int zynq_slcr_get_mio_pin_status(const char *periph);
|
||||
|
||||
unsigned int zynqmp_get_silicon_version(void);
|
||||
@@ -16,4 +18,10 @@ void psu_init(void);
|
||||
|
||||
void handoff_setup(void);
|
||||
|
||||
void zynqmp_pmufw_version(void);
|
||||
int zynqmp_mmio_write(const u32 address, const u32 mask, const u32 value);
|
||||
int zynqmp_mmio_read(const u32 address, u32 *value);
|
||||
int invoke_smc(u32 pm_api_id, u32 arg0, u32 arg1, u32 arg2, u32 arg3,
|
||||
u32 *ret_payload);
|
||||
|
||||
#endif /* _ASM_ARCH_SYS_PROTO_H */
|
||||
|
||||
@@ -360,7 +360,6 @@ static void boot_jump_linux(bootm_headers_t *images, int flag)
|
||||
#ifdef CONFIG_CPU_V7M
|
||||
ulong addr = (ulong)kernel_entry | 1;
|
||||
kernel_entry = (void *)addr;
|
||||
dcache_disable();
|
||||
#endif
|
||||
s = getenv("machid");
|
||||
if (s) {
|
||||
|
||||
@@ -124,7 +124,7 @@ config TARGET_SAMA5D4EK
|
||||
select BOARD_EARLY_INIT_F
|
||||
|
||||
config TARGET_MA5D4EVK
|
||||
bool "DENX MA5D4EVK Evaluation Kit"
|
||||
bool "Aries MA5D4EVK Evaluation Kit"
|
||||
select CPU_V7
|
||||
select SUPPORT_SPL
|
||||
|
||||
@@ -169,6 +169,7 @@ endchoice
|
||||
config SYS_SOC
|
||||
default "at91"
|
||||
|
||||
source "board/aries/ma5d4evk/Kconfig"
|
||||
source "board/atmel/at91rm9200ek/Kconfig"
|
||||
source "board/atmel/at91sam9260ek/Kconfig"
|
||||
source "board/atmel/at91sam9261ek/Kconfig"
|
||||
@@ -186,7 +187,6 @@ source "board/atmel/sama5d4ek/Kconfig"
|
||||
source "board/bluewater/gurnard/Kconfig"
|
||||
source "board/bluewater/snapper9260/Kconfig"
|
||||
source "board/calao/usb_a9263/Kconfig"
|
||||
source "board/denx/ma5d4evk/Kconfig"
|
||||
source "board/egnite/ethernut5/Kconfig"
|
||||
source "board/esd/meesc/Kconfig"
|
||||
source "board/l+g/vinco/Kconfig"
|
||||
|
||||
@@ -64,6 +64,23 @@ void save_omap_boot_params(void)
|
||||
*/
|
||||
if (boot_device == BOOT_DEVICE_QSPI_4)
|
||||
boot_device = BOOT_DEVICE_SPI;
|
||||
#endif
|
||||
#ifdef CONFIG_TI816X
|
||||
/*
|
||||
* On PG2.0 and later TI816x the values we get when booting are not the
|
||||
* same as on PG1.0, which is what the defines are based on. Update
|
||||
* them as needed.
|
||||
*/
|
||||
if (get_cpu_rev() != 1) {
|
||||
if (boot_device == 0x05) {
|
||||
omap_boot_params->boot_device = BOOT_DEVICE_NAND;
|
||||
boot_device = BOOT_DEVICE_NAND;
|
||||
}
|
||||
if (boot_device == 0x08) {
|
||||
omap_boot_params->boot_device = BOOT_DEVICE_MMC1;
|
||||
boot_device = BOOT_DEVICE_MMC1;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
/*
|
||||
* When booting from peripheral booting, the boot device is not usable
|
||||
|
||||
@@ -11,6 +11,8 @@
|
||||
#include <linux/io.h>
|
||||
#include <linux/sizes.h>
|
||||
|
||||
#include "../init.h"
|
||||
|
||||
#define CCI500_BASE 0x5FD00000
|
||||
#define CCI500_SLAVE_OFFSET 0x1000
|
||||
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
#include <linux/io.h>
|
||||
#include <linux/sizes.h>
|
||||
|
||||
#include "../init.h"
|
||||
|
||||
#define UNIPHIER_SMPCTRL_ROM_RSV0 0x59801200
|
||||
|
||||
void uniphier_smp_setup(void);
|
||||
|
||||
@@ -21,7 +21,7 @@ static void uniphier_setup_xirq(void)
|
||||
{
|
||||
const void *fdt = gd->fdt_blob;
|
||||
int soc_node, aidet_node;
|
||||
const u32 *val;
|
||||
const fdt32_t *val;
|
||||
unsigned long aidet_base;
|
||||
u32 tmp;
|
||||
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#include "../init.h"
|
||||
|
||||
void uniphier_pxs3_pll_init(void)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -28,11 +28,11 @@ enum dram_size {
|
||||
};
|
||||
|
||||
/* PHY */
|
||||
const int rof_pos_shift_pre[RANK_BLOCKS_TR][2] = { {0, 0}, {0, 0} };
|
||||
const int rof_neg_shift_pre[RANK_BLOCKS_TR][2] = { {0, 0}, {0, 0} };
|
||||
const int rof_pos_shift[RANK_BLOCKS_TR][2] = { {-35, -35}, {-35, -35} };
|
||||
const int rof_neg_shift[RANK_BLOCKS_TR][2] = { {-17, -17}, {-17, -17} };
|
||||
const int tof_shift[RANK_BLOCKS_TR][2] = { {-50, -50}, {-50, -50} };
|
||||
static const int rof_pos_shift_pre[RANK_BLOCKS_TR][2] = { {0, 0}, {0, 0} };
|
||||
static const int rof_neg_shift_pre[RANK_BLOCKS_TR][2] = { {0, 0}, {0, 0} };
|
||||
static const int rof_pos_shift[RANK_BLOCKS_TR][2] = { {-35, -35}, {-35, -35} };
|
||||
static const int rof_neg_shift[RANK_BLOCKS_TR][2] = { {-17, -17}, {-17, -17} };
|
||||
static const int tof_shift[RANK_BLOCKS_TR][2] = { {-50, -50}, {-50, -50} };
|
||||
|
||||
/* Register address */
|
||||
#define PHY_ZQ0CR1 0x00000184
|
||||
@@ -65,7 +65,7 @@ const int tof_shift[RANK_BLOCKS_TR][2] = { {-50, -50}, {-50, -50} };
|
||||
#define PHY_DSWBD_MASK 0x3F000000 /* bit[29:24] */
|
||||
#define PHY_DSDQOE_MASK 0x00000FFF
|
||||
|
||||
static void ddrphy_maskwritel(u32 data, u32 mask, void *addr)
|
||||
static void ddrphy_maskwritel(u32 data, u32 mask, void __iomem *addr)
|
||||
{
|
||||
u32 value;
|
||||
|
||||
@@ -73,7 +73,7 @@ static void ddrphy_maskwritel(u32 data, u32 mask, void *addr)
|
||||
writel(value, addr);
|
||||
}
|
||||
|
||||
static u32 ddrphy_maskreadl(u32 mask, void *addr)
|
||||
static u32 ddrphy_maskreadl(u32 mask, void __iomem *addr)
|
||||
{
|
||||
return readl(addr) & mask;
|
||||
}
|
||||
|
||||
@@ -436,7 +436,7 @@ static void umc_set_system_latency(void __iomem *dc_base, int phy_latency)
|
||||
}
|
||||
|
||||
/* enable/disable auto refresh */
|
||||
void umc_refresh_ctrl(void __iomem *dc_base, int enable)
|
||||
static void umc_refresh_ctrl(void __iomem *dc_base, int enable)
|
||||
{
|
||||
u32 tmp;
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <fdt_support.h>
|
||||
#include <fdtdec.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/sizes.h>
|
||||
|
||||
@@ -126,7 +126,7 @@ int uniphier_have_internal_stm(void);
|
||||
int uniphier_boot_from_backend(void);
|
||||
int uniphier_pin_init(const char *pinconfig_name);
|
||||
void uniphier_smp_kick_all_cpus(void);
|
||||
void cci500_init(int nr_slaves);
|
||||
void cci500_init(unsigned int nr_slaves);
|
||||
|
||||
#undef pr_warn
|
||||
#define pr_warn(fmt, args...) printf(fmt, ##args)
|
||||
|
||||
@@ -24,6 +24,14 @@ config SPL_SPI_FLASH_SUPPORT
|
||||
config SPL_SPI_SUPPORT
|
||||
default y if ZYNQ_QSPI
|
||||
|
||||
config ZYNQ_DDRC_INIT
|
||||
bool "Zynq DDRC initialization"
|
||||
default y
|
||||
help
|
||||
This option used to perform DDR specific initialization
|
||||
if required. There might be cases like ddr less where we
|
||||
want to skip ddr init and this option is useful for it.
|
||||
|
||||
config SYS_BOARD
|
||||
default "zynq"
|
||||
|
||||
|
||||
@@ -12,6 +12,9 @@
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
#ifndef CONFIG_ZYNQ_DDRC_INIT
|
||||
void zynq_ddrc_init(void) {}
|
||||
#else
|
||||
/* Control regsiter bitfield definitions */
|
||||
#define ZYNQ_DDRC_CTRLREG_BUSWIDTH_MASK 0xC
|
||||
#define ZYNQ_DDRC_CTRLREG_BUSWIDTH_SHIFT 2
|
||||
@@ -46,3 +49,4 @@ void zynq_ddrc_init(void)
|
||||
puts("ECC disabled ");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0+
|
||||
#
|
||||
|
||||
dtb-y += microblaze-generic.dtb
|
||||
dtb-y += $(shell echo $(CONFIG_DEFAULT_DEVICE_TREE)).dtb
|
||||
|
||||
targets += $(dtb-y)
|
||||
|
||||
|
||||
@@ -29,16 +29,10 @@ config MPC86xx
|
||||
select SYS_FSL_DDR
|
||||
select SYS_FSL_DDR_BE
|
||||
|
||||
config 4xx
|
||||
bool "PPC4xx"
|
||||
select CREATE_ARCH_SYMLINK
|
||||
imply CMD_IRQ
|
||||
|
||||
endchoice
|
||||
|
||||
source "arch/powerpc/cpu/mpc83xx/Kconfig"
|
||||
source "arch/powerpc/cpu/mpc85xx/Kconfig"
|
||||
source "arch/powerpc/cpu/mpc86xx/Kconfig"
|
||||
source "arch/powerpc/cpu/ppc4xx/Kconfig"
|
||||
|
||||
endmenu
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
#
|
||||
|
||||
head-y := arch/powerpc/cpu/$(CPU)/start.o
|
||||
head-$(CONFIG_4xx) += arch/powerpc/cpu/ppc4xx/resetvec.o
|
||||
head-$(CONFIG_MPC85xx) += arch/powerpc/cpu/mpc85xx/resetvec.o
|
||||
|
||||
libs-y += arch/powerpc/cpu/$(CPU)/
|
||||
|
||||
@@ -1,444 +0,0 @@
|
||||
/*
|
||||
* arch/powerpc/cpu/ppc4xx/40x_spd_sdram.c
|
||||
* This SPD SDRAM detection code supports IBM/AMCC PPC44x cpu with a
|
||||
* SDRAM controller. Those are all current 405 PPC's.
|
||||
*
|
||||
* (C) Copyright 2001
|
||||
* Bill Hunter, Wave 7 Optics, williamhunter@attbi.com
|
||||
*
|
||||
* Based on code by:
|
||||
*
|
||||
* Kenneth Johansson ,Ericsson AB.
|
||||
* kenneth.johansson@etx.ericsson.se
|
||||
*
|
||||
* hacked up by bill hunter. fixed so we could run before
|
||||
* serial_init and console_init. previous version avoided this by
|
||||
* running out of cache memory during serial/console init, then running
|
||||
* this code later.
|
||||
*
|
||||
* (C) Copyright 2002
|
||||
* Jun Gu, Artesyn Technology, jung@artesyncp.com
|
||||
* Support for AMCC 440 based on OpenBIOS draminit.c from IBM.
|
||||
*
|
||||
* (C) Copyright 2005
|
||||
* Stefan Roese, DENX Software Engineering, sr@denx.de.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/processor.h>
|
||||
#include <i2c.h>
|
||||
#include <asm/ppc4xx.h>
|
||||
|
||||
#if defined(CONFIG_SPD_EEPROM) && !defined(CONFIG_440)
|
||||
|
||||
/*
|
||||
* Set default values
|
||||
*/
|
||||
#define ONE_BILLION 1000000000
|
||||
|
||||
#define SDRAM0_CFG_DCE 0x80000000
|
||||
#define SDRAM0_CFG_SRE 0x40000000
|
||||
#define SDRAM0_CFG_PME 0x20000000
|
||||
#define SDRAM0_CFG_MEMCHK 0x10000000
|
||||
#define SDRAM0_CFG_REGEN 0x08000000
|
||||
#define SDRAM0_CFG_ECCDD 0x00400000
|
||||
#define SDRAM0_CFG_EMDULR 0x00200000
|
||||
#define SDRAM0_CFG_DRW_SHIFT (31-6)
|
||||
#define SDRAM0_CFG_BRPF_SHIFT (31-8)
|
||||
|
||||
#define SDRAM0_TR_CASL_SHIFT (31-8)
|
||||
#define SDRAM0_TR_PTA_SHIFT (31-13)
|
||||
#define SDRAM0_TR_CTP_SHIFT (31-15)
|
||||
#define SDRAM0_TR_LDF_SHIFT (31-17)
|
||||
#define SDRAM0_TR_RFTA_SHIFT (31-29)
|
||||
#define SDRAM0_TR_RCD_SHIFT (31-31)
|
||||
|
||||
#define SDRAM0_RTR_SHIFT (31-15)
|
||||
#define SDRAM0_ECCCFG_SHIFT (31-11)
|
||||
|
||||
/* SDRAM0_CFG enable macro */
|
||||
#define SDRAM0_CFG_BRPF(x) ( ( x & 0x3)<< SDRAM0_CFG_BRPF_SHIFT )
|
||||
|
||||
#define SDRAM0_BXCR_SZ_MASK 0x000e0000
|
||||
#define SDRAM0_BXCR_AM_MASK 0x0000e000
|
||||
|
||||
#define SDRAM0_BXCR_SZ_SHIFT (31-14)
|
||||
#define SDRAM0_BXCR_AM_SHIFT (31-18)
|
||||
|
||||
#define SDRAM0_BXCR_SZ(x) ( (( x << SDRAM0_BXCR_SZ_SHIFT) & SDRAM0_BXCR_SZ_MASK) )
|
||||
#define SDRAM0_BXCR_AM(x) ( (( x << SDRAM0_BXCR_AM_SHIFT) & SDRAM0_BXCR_AM_MASK) )
|
||||
|
||||
#ifdef CONFIG_SPDDRAM_SILENT
|
||||
# define SPD_ERR(x) do { return 0; } while (0)
|
||||
#else
|
||||
# define SPD_ERR(x) do { printf(x); return(0); } while (0)
|
||||
#endif
|
||||
|
||||
#define sdram_HZ_to_ns(hertz) (1000000000/(hertz))
|
||||
|
||||
/* function prototypes */
|
||||
int spd_read(uint addr);
|
||||
|
||||
|
||||
/*
|
||||
* This function is reading data from the DIMM module EEPROM over the SPD bus
|
||||
* and uses that to program the sdram controller.
|
||||
*
|
||||
* This works on boards that has the same schematics that the AMCC walnut has.
|
||||
*
|
||||
* Input: null for default I2C spd functions or a pointer to a custom function
|
||||
* returning spd_data.
|
||||
*/
|
||||
|
||||
long int spd_sdram(int(read_spd)(uint addr))
|
||||
{
|
||||
int tmp,row,col;
|
||||
int total_size,bank_size,bank_code;
|
||||
int mode;
|
||||
int bank_cnt;
|
||||
|
||||
int sdram0_pmit=0x07c00000;
|
||||
int sdram0_b0cr;
|
||||
int sdram0_b1cr = 0;
|
||||
#ifndef CONFIG_405EP /* not on PPC405EP */
|
||||
int sdram0_b2cr = 0;
|
||||
int sdram0_b3cr = 0;
|
||||
int sdram0_besr0 = -1;
|
||||
int sdram0_besr1 = -1;
|
||||
int sdram0_eccesr = -1;
|
||||
int sdram0_ecccfg;
|
||||
int ecc_on;
|
||||
#endif
|
||||
|
||||
int sdram0_rtr=0;
|
||||
int sdram0_tr=0;
|
||||
|
||||
int sdram0_cfg=0;
|
||||
|
||||
int t_rp;
|
||||
int t_rcd;
|
||||
int t_ras;
|
||||
int t_rc;
|
||||
int min_cas;
|
||||
|
||||
PPC4xx_SYS_INFO sys_info;
|
||||
unsigned long bus_period_x_10;
|
||||
|
||||
/*
|
||||
* get the board info
|
||||
*/
|
||||
get_sys_info(&sys_info);
|
||||
bus_period_x_10 = ONE_BILLION / (sys_info.freqPLB / 10);
|
||||
|
||||
if (read_spd == 0){
|
||||
read_spd=spd_read;
|
||||
/*
|
||||
* Make sure I2C controller is initialized
|
||||
* before continuing.
|
||||
*/
|
||||
i2c_set_bus_num(CONFIG_SYS_SPD_BUS_NUM);
|
||||
}
|
||||
|
||||
/* Make shure we are using SDRAM */
|
||||
if (read_spd(2) != 0x04) {
|
||||
SPD_ERR("SDRAM - non SDRAM memory module found\n");
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------
|
||||
* configure memory timing register
|
||||
*
|
||||
* data from DIMM:
|
||||
* 27 IN Row Precharge Time ( t RP)
|
||||
* 29 MIN RAS to CAS Delay ( t RCD)
|
||||
* 127 Component and Clock Detail ,clk0-clk3, junction temp, CAS
|
||||
* -------------------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
* first figure out which cas latency mode to use
|
||||
* use the min supported mode
|
||||
*/
|
||||
|
||||
tmp = read_spd(127) & 0x6;
|
||||
if (tmp == 0x02) { /* only cas = 2 supported */
|
||||
min_cas = 2;
|
||||
/* t_ck = read_spd(9); */
|
||||
/* t_ac = read_spd(10); */
|
||||
} else if (tmp == 0x04) { /* only cas = 3 supported */
|
||||
min_cas = 3;
|
||||
/* t_ck = read_spd(9); */
|
||||
/* t_ac = read_spd(10); */
|
||||
} else if (tmp == 0x06) { /* 2,3 supported, so use 2 */
|
||||
min_cas = 2;
|
||||
/* t_ck = read_spd(23); */
|
||||
/* t_ac = read_spd(24); */
|
||||
} else {
|
||||
SPD_ERR("SDRAM - unsupported CAS latency \n");
|
||||
}
|
||||
|
||||
/* get some timing values, t_rp,t_rcd,t_ras,t_rc
|
||||
*/
|
||||
t_rp = read_spd(27);
|
||||
t_rcd = read_spd(29);
|
||||
t_ras = read_spd(30);
|
||||
t_rc = t_ras + t_rp;
|
||||
|
||||
/* The following timing calcs subtract 1 before deviding.
|
||||
* this has effect of using ceiling instead of floor rounding,
|
||||
* and also subtracting 1 to convert number to reg value
|
||||
*/
|
||||
/* set up CASL */
|
||||
sdram0_tr = (min_cas - 1) << SDRAM0_TR_CASL_SHIFT;
|
||||
/* set up PTA */
|
||||
sdram0_tr |= ((((t_rp - 1) * 10)/bus_period_x_10) & 0x3) << SDRAM0_TR_PTA_SHIFT;
|
||||
/* set up CTP */
|
||||
tmp = (((t_rc - t_rcd - t_rp -1) * 10) / bus_period_x_10) & 0x3;
|
||||
if (tmp < 1)
|
||||
tmp = 1;
|
||||
sdram0_tr |= tmp << SDRAM0_TR_CTP_SHIFT;
|
||||
/* set LDF = 2 cycles, reg value = 1 */
|
||||
sdram0_tr |= 1 << SDRAM0_TR_LDF_SHIFT;
|
||||
/* set RFTA = t_rfc/bus_period, use t_rfc = t_rc */
|
||||
tmp = (((t_rc - 1) * 10) / bus_period_x_10) - 3;
|
||||
if (tmp < 0)
|
||||
tmp = 0;
|
||||
if (tmp > 6)
|
||||
tmp = 6;
|
||||
sdram0_tr |= tmp << SDRAM0_TR_RFTA_SHIFT;
|
||||
/* set RCD = t_rcd/bus_period*/
|
||||
sdram0_tr |= ((((t_rcd - 1) * 10) / bus_period_x_10) &0x3) << SDRAM0_TR_RCD_SHIFT ;
|
||||
|
||||
|
||||
/*------------------------------------------------------------------
|
||||
* configure RTR register
|
||||
* -------------------------------------------------------------------*/
|
||||
row = read_spd(3);
|
||||
col = read_spd(4);
|
||||
tmp = read_spd(12) & 0x7f ; /* refresh type less self refresh bit */
|
||||
switch (tmp) {
|
||||
case 0x00:
|
||||
tmp = 15625;
|
||||
break;
|
||||
case 0x01:
|
||||
tmp = 15625 / 4;
|
||||
break;
|
||||
case 0x02:
|
||||
tmp = 15625 / 2;
|
||||
break;
|
||||
case 0x03:
|
||||
tmp = 15625 * 2;
|
||||
break;
|
||||
case 0x04:
|
||||
tmp = 15625 * 4;
|
||||
break;
|
||||
case 0x05:
|
||||
tmp = 15625 * 8;
|
||||
break;
|
||||
default:
|
||||
SPD_ERR("SDRAM - Bad refresh period \n");
|
||||
}
|
||||
/* convert from nsec to bus cycles */
|
||||
tmp = (tmp * 10) / bus_period_x_10;
|
||||
sdram0_rtr = (tmp & 0x3ff8) << SDRAM0_RTR_SHIFT;
|
||||
|
||||
/*------------------------------------------------------------------
|
||||
* determine the number of banks used
|
||||
* -------------------------------------------------------------------*/
|
||||
/* byte 7:6 is module data width */
|
||||
if (read_spd(7) != 0)
|
||||
SPD_ERR("SDRAM - unsupported module width\n");
|
||||
tmp = read_spd(6);
|
||||
if (tmp < 32)
|
||||
SPD_ERR("SDRAM - unsupported module width\n");
|
||||
else if (tmp < 64)
|
||||
bank_cnt = 1; /* one bank per sdram side */
|
||||
else if (tmp < 73)
|
||||
bank_cnt = 2; /* need two banks per side */
|
||||
else if (tmp < 161)
|
||||
bank_cnt = 4; /* need four banks per side */
|
||||
else
|
||||
SPD_ERR("SDRAM - unsupported module width\n");
|
||||
|
||||
/* byte 5 is the module row count (refered to as dimm "sides") */
|
||||
tmp = read_spd(5);
|
||||
if (tmp == 1)
|
||||
;
|
||||
else if (tmp==2)
|
||||
bank_cnt *= 2;
|
||||
else if (tmp==4)
|
||||
bank_cnt *= 4;
|
||||
else
|
||||
bank_cnt = 8; /* 8 is an error code */
|
||||
|
||||
if (bank_cnt > 4) /* we only have 4 banks to work with */
|
||||
SPD_ERR("SDRAM - unsupported module rows for this width\n");
|
||||
|
||||
#ifndef CONFIG_405EP /* not on PPC405EP */
|
||||
/* now check for ECC ability of module. We only support ECC
|
||||
* on 32 bit wide devices with 8 bit ECC.
|
||||
*/
|
||||
if ((read_spd(11)==2) && (read_spd(6)==40) && (read_spd(14)==8)) {
|
||||
sdram0_ecccfg = 0xf << SDRAM0_ECCCFG_SHIFT;
|
||||
ecc_on = 1;
|
||||
} else {
|
||||
sdram0_ecccfg = 0;
|
||||
ecc_on = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*------------------------------------------------------------------
|
||||
* calculate total size
|
||||
* -------------------------------------------------------------------*/
|
||||
/* calculate total size and do sanity check */
|
||||
tmp = read_spd(31);
|
||||
total_size = 1 << 22; /* total_size = 4MB */
|
||||
/* now multiply 4M by the smallest device row density */
|
||||
/* note that we don't support asymetric rows */
|
||||
while (((tmp & 0x0001) == 0) && (tmp != 0)) {
|
||||
total_size = total_size << 1;
|
||||
tmp = tmp >> 1;
|
||||
}
|
||||
total_size *= read_spd(5); /* mult by module rows (dimm sides) */
|
||||
|
||||
/*------------------------------------------------------------------
|
||||
* map rows * cols * banks to a mode
|
||||
* -------------------------------------------------------------------*/
|
||||
|
||||
switch (row) {
|
||||
case 11:
|
||||
switch (col) {
|
||||
case 8:
|
||||
mode=4; /* mode 5 */
|
||||
break;
|
||||
case 9:
|
||||
case 10:
|
||||
mode=0; /* mode 1 */
|
||||
break;
|
||||
default:
|
||||
SPD_ERR("SDRAM - unsupported mode\n");
|
||||
}
|
||||
break;
|
||||
case 12:
|
||||
switch (col) {
|
||||
case 8:
|
||||
mode=3; /* mode 4 */
|
||||
break;
|
||||
case 9:
|
||||
case 10:
|
||||
mode=1; /* mode 2 */
|
||||
break;
|
||||
default:
|
||||
SPD_ERR("SDRAM - unsupported mode\n");
|
||||
}
|
||||
break;
|
||||
case 13:
|
||||
switch (col) {
|
||||
case 8:
|
||||
mode=5; /* mode 6 */
|
||||
break;
|
||||
case 9:
|
||||
case 10:
|
||||
if (read_spd(17) == 2)
|
||||
mode = 6; /* mode 7 */
|
||||
else
|
||||
mode = 2; /* mode 3 */
|
||||
break;
|
||||
case 11:
|
||||
mode = 2; /* mode 3 */
|
||||
break;
|
||||
default:
|
||||
SPD_ERR("SDRAM - unsupported mode\n");
|
||||
}
|
||||
break;
|
||||
default:
|
||||
SPD_ERR("SDRAM - unsupported mode\n");
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------
|
||||
* using the calculated values, compute the bank
|
||||
* config register values.
|
||||
* -------------------------------------------------------------------*/
|
||||
|
||||
/* compute the size of each bank */
|
||||
bank_size = total_size / bank_cnt;
|
||||
/* convert bank size to bank size code for ppc4xx
|
||||
by takeing log2(bank_size) - 22 */
|
||||
tmp = bank_size; /* start with tmp = bank_size */
|
||||
bank_code = 0; /* and bank_code = 0 */
|
||||
while (tmp > 1) { /* this takes log2 of tmp */
|
||||
bank_code++; /* and stores result in bank_code */
|
||||
tmp = tmp >> 1;
|
||||
} /* bank_code is now log2(bank_size) */
|
||||
bank_code -= 22; /* subtract 22 to get the code */
|
||||
|
||||
tmp = SDRAM0_BXCR_SZ(bank_code) | SDRAM0_BXCR_AM(mode) | 1;
|
||||
sdram0_b0cr = (bank_size * 0) | tmp;
|
||||
#ifndef CONFIG_405EP /* not on PPC405EP */
|
||||
if (bank_cnt > 1)
|
||||
sdram0_b2cr = (bank_size * 1) | tmp;
|
||||
if (bank_cnt > 2)
|
||||
sdram0_b1cr = (bank_size * 2) | tmp;
|
||||
if (bank_cnt > 3)
|
||||
sdram0_b3cr = (bank_size * 3) | tmp;
|
||||
#else
|
||||
/* PPC405EP chip only supports two SDRAM banks */
|
||||
if (bank_cnt > 1)
|
||||
sdram0_b1cr = (bank_size * 1) | tmp;
|
||||
if (bank_cnt > 2)
|
||||
total_size = 2 * bank_size;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* enable sdram controller DCE=1
|
||||
* enable burst read prefetch to 32 bytes BRPF=2
|
||||
* leave other functions off
|
||||
*/
|
||||
|
||||
/*------------------------------------------------------------------
|
||||
* now that we've done our calculations, we are ready to
|
||||
* program all the registers.
|
||||
* -------------------------------------------------------------------*/
|
||||
|
||||
/* disable memcontroller so updates work */
|
||||
mtsdram(SDRAM0_CFG, 0);
|
||||
|
||||
#ifndef CONFIG_405EP /* not on PPC405EP */
|
||||
mtsdram(SDRAM0_BESR0, sdram0_besr0);
|
||||
mtsdram(SDRAM0_BESR1, sdram0_besr1);
|
||||
mtsdram(SDRAM0_ECCCFG, sdram0_ecccfg);
|
||||
mtsdram(SDRAM0_ECCESR, sdram0_eccesr);
|
||||
#endif
|
||||
mtsdram(SDRAM0_RTR, sdram0_rtr);
|
||||
mtsdram(SDRAM0_PMIT, sdram0_pmit);
|
||||
mtsdram(SDRAM0_B0CR, sdram0_b0cr);
|
||||
mtsdram(SDRAM0_B1CR, sdram0_b1cr);
|
||||
#ifndef CONFIG_405EP /* not on PPC405EP */
|
||||
mtsdram(SDRAM0_B2CR, sdram0_b2cr);
|
||||
mtsdram(SDRAM0_B3CR, sdram0_b3cr);
|
||||
#endif
|
||||
mtsdram(SDRAM0_TR, sdram0_tr);
|
||||
|
||||
/* SDRAM have a power on delay, 500 micro should do */
|
||||
udelay(500);
|
||||
sdram0_cfg = SDRAM0_CFG_DCE | SDRAM0_CFG_BRPF(1) | SDRAM0_CFG_ECCDD | SDRAM0_CFG_EMDULR;
|
||||
#ifndef CONFIG_405EP /* not on PPC405EP */
|
||||
if (ecc_on)
|
||||
sdram0_cfg |= SDRAM0_CFG_MEMCHK;
|
||||
#endif
|
||||
mtsdram(SDRAM0_CFG, sdram0_cfg);
|
||||
|
||||
return (total_size);
|
||||
}
|
||||
|
||||
int spd_read(uint addr)
|
||||
{
|
||||
uchar data[2];
|
||||
|
||||
if (i2c_read(SPD_EEPROM_ADDRESS, addr, 1, data, 1) == 0)
|
||||
return (int)data[0];
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_SPD_EEPROM */
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,863 +0,0 @@
|
||||
/*
|
||||
* SPDX-License-Identifier: GPL-2.0 IBM-pibs
|
||||
*
|
||||
* File Name: 405gp_pci.c
|
||||
*
|
||||
* Function: Initialization code for the 405GP PCI Configuration regs.
|
||||
*
|
||||
* Author: Mark Game
|
||||
*
|
||||
* Change Activity-
|
||||
*
|
||||
* Date Description of Change BY
|
||||
* --------- --------------------- ---
|
||||
* 09-Sep-98 Created MCG
|
||||
* 02-Nov-98 Removed External arbiter selected message JWB
|
||||
* 27-Nov-98 Zero out PTMBAR2 and disable in PTM2MS JWB
|
||||
* 04-Jan-99 Zero out other unused PMM and PTM regs. Change bus scan MCG
|
||||
* from (0 to n) to (1 to n).
|
||||
* 17-May-99 Port to Walnut JWB
|
||||
* 17-Jun-99 Updated for VGA support JWB
|
||||
* 21-Jun-99 Updated to allow SRAM region to be a target from PCI bus JWB
|
||||
* 19-Jul-99 Updated for 405GP pass 1 errata #26 (Low PCI subsequent MCG
|
||||
* target latency timer values are not supported).
|
||||
* Should be fixed in pass 2.
|
||||
* 09-Sep-99 Removed use of PTM2 since the SRAM region no longer needs JWB
|
||||
* to be a PCI target. Zero out PTMBAR2 and disable in PTM2MS.
|
||||
* 10-Dec-99 Updated PCI_Write_CFG_Reg for pass2 errata #6 JWB
|
||||
* 11-Jan-00 Ensure PMMxMAs disabled before setting PMMxLAs. This is not
|
||||
* really required after a reset since PMMxMAs are already
|
||||
* disabled but is a good practice nonetheless. JWB
|
||||
* 12-Jun-01 stefan.roese@esd-electronics.com
|
||||
* - PCI host/adapter handling reworked
|
||||
* 09-Jul-01 stefan.roese@esd-electronics.com
|
||||
* - PCI host now configures from device 0 (not 1) to max_dev,
|
||||
* (host configures itself)
|
||||
* - On CPCI-405 pci base address and size is generated from
|
||||
* SDRAM and FLASH size (CFG regs not used anymore)
|
||||
* - Some minor changes for CPCI-405-A (adapter version)
|
||||
* 14-Sep-01 stefan.roese@esd-electronics.com
|
||||
* - CONFIG_PCI_SCAN_SHOW added to print pci devices upon startup
|
||||
* 28-Sep-01 stefan.roese@esd-electronics.com
|
||||
* - Changed pci master configuration for linux compatibility
|
||||
* (no need for bios_fixup() anymore)
|
||||
* 26-Feb-02 stefan.roese@esd-electronics.com
|
||||
* - Bug fixed in pci configuration (Andrew May)
|
||||
* - Removed pci class code init for CPCI405 board
|
||||
* 15-May-02 stefan.roese@esd-electronics.com
|
||||
* - New vga device handling
|
||||
* 29-May-02 stefan.roese@esd-electronics.com
|
||||
* - PCI class code init added (if defined)
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
#include <common.h>
|
||||
#include <command.h>
|
||||
#include <asm/4xx_pci.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/io.h>
|
||||
#include <pci.h>
|
||||
#include <asm/ppc4xx.h>
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
#if defined(CONFIG_405GP) || defined(CONFIG_405EP)
|
||||
|
||||
/*#define DEBUG*/
|
||||
|
||||
/*
|
||||
* Board-specific pci initialization
|
||||
* Platform code can reimplement pci_pre_init() if needed
|
||||
*/
|
||||
int __pci_pre_init(struct pci_controller *hose)
|
||||
{
|
||||
#if defined(CONFIG_405EP)
|
||||
/*
|
||||
* Enable the internal PCI arbiter by default.
|
||||
*
|
||||
* On 405EP CPUs the internal arbiter can be controlled
|
||||
* by the I2C strapping EEPROM. If you want to do so
|
||||
* or if you want to disable the arbiter pci_pre_init()
|
||||
* must be reimplemented without enabling the arbiter.
|
||||
* The arbiter is enabled in this place because of
|
||||
* compatibility reasons.
|
||||
*/
|
||||
mtdcr(CPC0_PCI, mfdcr(CPC0_PCI) | CPC0_PCI_ARBIT_EN);
|
||||
#endif /* CONFIG_405EP */
|
||||
|
||||
return 1;
|
||||
}
|
||||
int pci_pre_init(struct pci_controller *hose)
|
||||
__attribute__((weak, alias("__pci_pre_init")));
|
||||
|
||||
int __is_pci_host(struct pci_controller *hose)
|
||||
{
|
||||
#if defined(CONFIG_405GP)
|
||||
if (mfdcr(CPC0_PSR) & PSR_PCI_ARBIT_EN)
|
||||
return 1;
|
||||
#elif defined (CONFIG_405EP)
|
||||
if (mfdcr(CPC0_PCI) & CPC0_PCI_ARBIT_EN)
|
||||
return 1;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
int is_pci_host(struct pci_controller *hose) __attribute__((weak, alias("__is_pci_host")));
|
||||
|
||||
/*-----------------------------------------------------------------------------+
|
||||
* pci_init. Initializes the 405GP PCI Configuration regs.
|
||||
*-----------------------------------------------------------------------------*/
|
||||
void pci_405gp_init(struct pci_controller *hose)
|
||||
{
|
||||
int i, reg_num = 0;
|
||||
bd_t *bd = gd->bd;
|
||||
|
||||
unsigned short temp_short;
|
||||
unsigned long ptmpcila[2] = {CONFIG_SYS_PCI_PTM1PCI, CONFIG_SYS_PCI_PTM2PCI};
|
||||
#if defined(CONFIG_PCI_4xx_PTM_OVERWRITE)
|
||||
char *ptmla_str, *ptmms_str;
|
||||
#endif
|
||||
unsigned long ptmla[2] = {CONFIG_SYS_PCI_PTM1LA, CONFIG_SYS_PCI_PTM2LA};
|
||||
unsigned long ptmms[2] = {CONFIG_SYS_PCI_PTM1MS, CONFIG_SYS_PCI_PTM2MS};
|
||||
#if defined(CONFIG_PIP405) || defined(CONFIG_TARGET_MIP405) \
|
||||
|| defined(CONFIG_TARGET_MIP405T)
|
||||
unsigned long pmmla[3] = {0x80000000, 0xA0000000, 0};
|
||||
unsigned long pmmma[3] = {0xE0000001, 0xE0000001, 0};
|
||||
unsigned long pmmpcila[3] = {0x80000000, 0x00000000, 0};
|
||||
unsigned long pmmpciha[3] = {0x00000000, 0x00000000, 0};
|
||||
#else
|
||||
unsigned long pmmla[3] = {0x80000000, 0,0};
|
||||
unsigned long pmmma[3] = {0xC0000001, 0,0};
|
||||
unsigned long pmmpcila[3] = {0x80000000, 0,0};
|
||||
unsigned long pmmpciha[3] = {0x00000000, 0,0};
|
||||
#endif
|
||||
#ifdef CONFIG_PCI_PNP
|
||||
#if (CONFIG_PCI_HOST == PCI_HOST_AUTO)
|
||||
char *s;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_PCI_4xx_PTM_OVERWRITE)
|
||||
ptmla_str = getenv("ptm1la");
|
||||
ptmms_str = getenv("ptm1ms");
|
||||
if(NULL != ptmla_str && NULL != ptmms_str ) {
|
||||
ptmla[0] = simple_strtoul (ptmla_str, NULL, 16);
|
||||
ptmms[0] = simple_strtoul (ptmms_str, NULL, 16);
|
||||
}
|
||||
|
||||
ptmla_str = getenv("ptm2la");
|
||||
ptmms_str = getenv("ptm2ms");
|
||||
if(NULL != ptmla_str && NULL != ptmms_str ) {
|
||||
ptmla[1] = simple_strtoul (ptmla_str, NULL, 16);
|
||||
ptmms[1] = simple_strtoul (ptmms_str, NULL, 16);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Register the hose
|
||||
*/
|
||||
hose->first_busno = 0;
|
||||
hose->last_busno = 0xff;
|
||||
|
||||
/* ISA/PCI I/O space */
|
||||
pci_set_region(hose->regions + reg_num++,
|
||||
MIN_PCI_PCI_IOADDR,
|
||||
MIN_PLB_PCI_IOADDR,
|
||||
0x10000,
|
||||
PCI_REGION_IO);
|
||||
|
||||
/* PCI I/O space */
|
||||
pci_set_region(hose->regions + reg_num++,
|
||||
0x00800000,
|
||||
0xe8800000,
|
||||
0x03800000,
|
||||
PCI_REGION_IO);
|
||||
|
||||
reg_num = 2;
|
||||
|
||||
/* Memory spaces */
|
||||
for (i=0; i<2; i++)
|
||||
if (ptmms[i] & 1)
|
||||
{
|
||||
if (!i) hose->pci_fb = hose->regions + reg_num;
|
||||
|
||||
pci_set_region(hose->regions + reg_num++,
|
||||
ptmpcila[i], ptmla[i],
|
||||
~(ptmms[i] & 0xfffff000) + 1,
|
||||
PCI_REGION_MEM |
|
||||
PCI_REGION_SYS_MEMORY);
|
||||
}
|
||||
|
||||
/* PCI memory spaces */
|
||||
for (i=0; i<3; i++)
|
||||
if (pmmma[i] & 1)
|
||||
{
|
||||
pci_set_region(hose->regions + reg_num++,
|
||||
pmmpcila[i], pmmla[i],
|
||||
~(pmmma[i] & 0xfffff000) + 1,
|
||||
PCI_REGION_MEM);
|
||||
}
|
||||
|
||||
hose->region_count = reg_num;
|
||||
|
||||
pci_setup_indirect(hose,
|
||||
PCICFGADR,
|
||||
PCICFGDATA);
|
||||
|
||||
if (hose->pci_fb)
|
||||
pciauto_region_init(hose->pci_fb);
|
||||
|
||||
/* Let board change/modify hose & do initial checks */
|
||||
if (pci_pre_init(hose) == 0) {
|
||||
printf("PCI: Board-specific initialization failed.\n");
|
||||
printf("PCI: Configuration aborted.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
pci_register_hose(hose);
|
||||
|
||||
/*--------------------------------------------------------------------------+
|
||||
* 405GP PCI Master configuration.
|
||||
* Map one 512 MB range of PLB/processor addresses to PCI memory space.
|
||||
* PLB address 0x80000000-0xBFFFFFFF ==> PCI address 0x80000000-0xBFFFFFFF
|
||||
* Use byte reversed out routines to handle endianess.
|
||||
*--------------------------------------------------------------------------*/
|
||||
out32r(PMM0MA, (pmmma[0]&~0x1)); /* disable, configure PMMxLA, PMMxPCILA first */
|
||||
out32r(PMM0LA, pmmla[0]);
|
||||
out32r(PMM0PCILA, pmmpcila[0]);
|
||||
out32r(PMM0PCIHA, pmmpciha[0]);
|
||||
out32r(PMM0MA, pmmma[0]);
|
||||
|
||||
/*--------------------------------------------------------------------------+
|
||||
* PMM1 is not used. Initialize them to zero.
|
||||
*--------------------------------------------------------------------------*/
|
||||
out32r(PMM1MA, (pmmma[1]&~0x1));
|
||||
out32r(PMM1LA, pmmla[1]);
|
||||
out32r(PMM1PCILA, pmmpcila[1]);
|
||||
out32r(PMM1PCIHA, pmmpciha[1]);
|
||||
out32r(PMM1MA, pmmma[1]);
|
||||
|
||||
/*--------------------------------------------------------------------------+
|
||||
* PMM2 is not used. Initialize them to zero.
|
||||
*--------------------------------------------------------------------------*/
|
||||
out32r(PMM2MA, (pmmma[2]&~0x1));
|
||||
out32r(PMM2LA, pmmla[2]);
|
||||
out32r(PMM2PCILA, pmmpcila[2]);
|
||||
out32r(PMM2PCIHA, pmmpciha[2]);
|
||||
out32r(PMM2MA, pmmma[2]);
|
||||
|
||||
/*--------------------------------------------------------------------------+
|
||||
* 405GP PCI Target configuration. (PTM1)
|
||||
* Note: PTM1MS is hardwire enabled but we set the enable bit anyway.
|
||||
*--------------------------------------------------------------------------*/
|
||||
out32r(PTM1LA, ptmla[0]); /* insert address */
|
||||
out32r(PTM1MS, ptmms[0]); /* insert size, enable bit is 1 */
|
||||
pci_write_config_dword(PCIDEVID_405GP, PCI_BASE_ADDRESS_1, ptmpcila[0]);
|
||||
|
||||
/*--------------------------------------------------------------------------+
|
||||
* 405GP PCI Target configuration. (PTM2)
|
||||
*--------------------------------------------------------------------------*/
|
||||
out32r(PTM2LA, ptmla[1]); /* insert address */
|
||||
pci_write_config_dword(PCIDEVID_405GP, PCI_BASE_ADDRESS_2, ptmpcila[1]);
|
||||
|
||||
if (ptmms[1] == 0)
|
||||
{
|
||||
out32r(PTM2MS, 0x00000001); /* set enable bit */
|
||||
pci_write_config_dword(PCIDEVID_405GP, PCI_BASE_ADDRESS_2, 0x00000000);
|
||||
out32r(PTM2MS, 0x00000000); /* disable */
|
||||
}
|
||||
else
|
||||
{
|
||||
out32r(PTM2MS, ptmms[1]); /* insert size, enable bit is 1 */
|
||||
}
|
||||
|
||||
/*
|
||||
* Insert Subsystem Vendor and Device ID
|
||||
*/
|
||||
pci_write_config_word(PCIDEVID_405GP, PCI_SUBSYSTEM_VENDOR_ID, CONFIG_SYS_PCI_SUBSYS_VENDORID);
|
||||
#ifdef CONFIG_CPCI405
|
||||
if (is_pci_host(hose))
|
||||
pci_write_config_word(PCIDEVID_405GP, PCI_SUBSYSTEM_ID, CONFIG_SYS_PCI_SUBSYS_DEVICEID);
|
||||
else
|
||||
pci_write_config_word(PCIDEVID_405GP, PCI_SUBSYSTEM_ID, CONFIG_SYS_PCI_SUBSYS_DEVICEID2);
|
||||
#else
|
||||
pci_write_config_word(PCIDEVID_405GP, PCI_SUBSYSTEM_ID, CONFIG_SYS_PCI_SUBSYS_DEVICEID);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Insert Class-code
|
||||
*/
|
||||
#ifdef CONFIG_SYS_PCI_CLASSCODE
|
||||
pci_write_config_word(PCIDEVID_405GP, PCI_CLASS_SUB_CODE, CONFIG_SYS_PCI_CLASSCODE);
|
||||
#endif /* CONFIG_SYS_PCI_CLASSCODE */
|
||||
|
||||
/*--------------------------------------------------------------------------+
|
||||
* If PCI speed = 66MHz, set 66MHz capable bit.
|
||||
*--------------------------------------------------------------------------*/
|
||||
if (bd->bi_pci_busfreq >= 66000000) {
|
||||
pci_read_config_word(PCIDEVID_405GP, PCI_STATUS, &temp_short);
|
||||
pci_write_config_word(PCIDEVID_405GP,PCI_STATUS,(temp_short|PCI_STATUS_66MHZ));
|
||||
}
|
||||
|
||||
#if (CONFIG_PCI_HOST != PCI_HOST_ADAPTER)
|
||||
#if (CONFIG_PCI_HOST == PCI_HOST_AUTO)
|
||||
if (is_pci_host(hose) ||
|
||||
(((s = getenv("pciscan")) != NULL) && (strcmp(s, "yes") == 0)))
|
||||
#endif
|
||||
{
|
||||
/*--------------------------------------------------------------------------+
|
||||
* Write the 405GP PCI Configuration regs.
|
||||
* Enable 405GP to be a master on the PCI bus (PMM).
|
||||
* Enable 405GP to act as a PCI memory target (PTM).
|
||||
*--------------------------------------------------------------------------*/
|
||||
pci_read_config_word(PCIDEVID_405GP, PCI_COMMAND, &temp_short);
|
||||
pci_write_config_word(PCIDEVID_405GP, PCI_COMMAND, temp_short |
|
||||
PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_405EP)
|
||||
/*
|
||||
* on ppc405ep vendor/device id is not set
|
||||
* The user manual says 0x1014 (IBM) / 0x0156 (405GP!)
|
||||
* are the correct values.
|
||||
*/
|
||||
pci_write_config_word(PCIDEVID_405GP, PCI_VENDOR_ID, PCI_VENDOR_ID_IBM);
|
||||
pci_write_config_word(PCIDEVID_405GP,
|
||||
PCI_DEVICE_ID, PCI_DEVICE_ID_IBM_405GP);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Set HCE bit (Host Configuration Enabled)
|
||||
*/
|
||||
pci_read_config_word(PCIDEVID_405GP, PCIBRDGOPT2, &temp_short);
|
||||
pci_write_config_word(PCIDEVID_405GP, PCIBRDGOPT2, (temp_short | 0x0001));
|
||||
|
||||
#ifdef CONFIG_PCI_PNP
|
||||
/*--------------------------------------------------------------------------+
|
||||
* Scan the PCI bus and configure devices found.
|
||||
*--------------------------------------------------------------------------*/
|
||||
#if (CONFIG_PCI_HOST == PCI_HOST_AUTO)
|
||||
if (is_pci_host(hose) ||
|
||||
(((s = getenv("pciscan")) != NULL) && (strcmp(s, "yes") == 0)))
|
||||
#endif
|
||||
{
|
||||
#ifdef CONFIG_PCI_SCAN_SHOW
|
||||
printf("PCI: Bus Dev VenId DevId Class Int\n");
|
||||
#endif
|
||||
hose->last_busno = pci_hose_scan(hose);
|
||||
}
|
||||
#endif /* CONFIG_PCI_PNP */
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* drivers/pci/pci.c skips every host bridge but the 405GP since it could
|
||||
* be set as an Adapter.
|
||||
*
|
||||
* I (Andrew May) don't know what we should do here, but I don't want
|
||||
* the auto setup of a PCI device disabling what is done pci_405gp_init
|
||||
* as has happened before.
|
||||
*/
|
||||
void pci_405gp_setup_bridge(struct pci_controller *hose, pci_dev_t dev,
|
||||
struct pci_config_table *entry)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
printf("405gp_setup_bridge\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
*/
|
||||
|
||||
void pci_405gp_fixup_irq(struct pci_controller *hose, pci_dev_t dev)
|
||||
{
|
||||
unsigned char int_line = 0xff;
|
||||
|
||||
/*
|
||||
* Write pci interrupt line register (cpci405 specific)
|
||||
*/
|
||||
switch (PCI_DEV(dev) & 0x03)
|
||||
{
|
||||
case 0:
|
||||
int_line = 27 + 2;
|
||||
break;
|
||||
case 1:
|
||||
int_line = 27 + 3;
|
||||
break;
|
||||
case 2:
|
||||
int_line = 27 + 0;
|
||||
break;
|
||||
case 3:
|
||||
int_line = 27 + 1;
|
||||
break;
|
||||
}
|
||||
|
||||
pci_hose_write_config_byte(hose, dev, PCI_INTERRUPT_LINE, int_line);
|
||||
}
|
||||
|
||||
void pci_405gp_setup_vga(struct pci_controller *hose, pci_dev_t dev,
|
||||
struct pci_config_table *entry)
|
||||
{
|
||||
unsigned int cmdstat = 0;
|
||||
|
||||
pciauto_setup_device(hose, dev, 6, hose->pci_mem, hose->pci_prefetch, hose->pci_io);
|
||||
|
||||
/* always enable io space on vga boards */
|
||||
pci_hose_read_config_dword(hose, dev, PCI_COMMAND, &cmdstat);
|
||||
cmdstat |= PCI_COMMAND_IO;
|
||||
pci_hose_write_config_dword(hose, dev, PCI_COMMAND, cmdstat);
|
||||
}
|
||||
|
||||
#if !(defined(CONFIG_PIP405) || defined(CONFIG_TARGET_MIP405) \
|
||||
|| defined(CONFIG_TARGET_MIP405T))
|
||||
|
||||
/*
|
||||
*As is these functs get called out of flash Not a horrible
|
||||
*thing, but something to keep in mind. (no statics?)
|
||||
*/
|
||||
static struct pci_config_table pci_405gp_config_table[] = {
|
||||
/*if VendID is 0 it terminates the table search (ie Walnut)*/
|
||||
#ifdef CONFIG_SYS_PCI_SUBSYS_VENDORID
|
||||
{CONFIG_SYS_PCI_SUBSYS_VENDORID, PCI_ANY_ID, PCI_CLASS_BRIDGE_HOST,
|
||||
PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, pci_405gp_setup_bridge},
|
||||
#endif
|
||||
{PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA,
|
||||
PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, pci_405gp_setup_vga},
|
||||
|
||||
{PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_NOT_DEFINED_VGA,
|
||||
PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, pci_405gp_setup_vga},
|
||||
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct pci_controller hose = {
|
||||
fixup_irq: pci_405gp_fixup_irq,
|
||||
config_table: pci_405gp_config_table,
|
||||
};
|
||||
|
||||
void pci_init_board(void)
|
||||
{
|
||||
/*we want the ptrs to RAM not flash (ie don't use init list)*/
|
||||
hose.fixup_irq = pci_405gp_fixup_irq;
|
||||
hose.config_table = pci_405gp_config_table;
|
||||
pci_405gp_init(&hose);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* CONFIG_405GP */
|
||||
|
||||
/*-----------------------------------------------------------------------------+
|
||||
* CONFIG_440
|
||||
*-----------------------------------------------------------------------------*/
|
||||
#if defined(CONFIG_440)
|
||||
|
||||
#if defined(CONFIG_SYS_PCI_MASTER_INIT) || defined(CONFIG_SYS_PCI_TARGET_INIT)
|
||||
static struct pci_controller ppc440_hose = {0};
|
||||
#endif
|
||||
|
||||
/*
|
||||
* This routine is called to determine if a pci scan should be
|
||||
* performed. With various hardware environments (especially cPCI and
|
||||
* PPMC) it's insufficient to depend on the state of the arbiter enable
|
||||
* bit in the strap register, or generic host/adapter assumptions.
|
||||
*
|
||||
* Rather than hard-code a bad assumption in the general 440 code, the
|
||||
* 440 pci code requires the board to decide at runtime.
|
||||
*
|
||||
* Return 0 for adapter mode, non-zero for host (monarch) mode.
|
||||
*
|
||||
* Weak default implementation: "Normal" boards implement the PCI
|
||||
* host functionality. This can be overridden for PCI adapter boards.
|
||||
*/
|
||||
int __is_pci_host(struct pci_controller *hose)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
int is_pci_host(struct pci_controller *hose)
|
||||
__attribute__((weak, alias("__is_pci_host")));
|
||||
|
||||
#if defined(CONFIG_440EP) || defined(CONFIG_440EPX) || \
|
||||
defined(CONFIG_440GR) || defined(CONFIG_440GRX)
|
||||
|
||||
#if defined(CONFIG_SYS_PCI_TARGET_INIT)
|
||||
/*
|
||||
* pci_target_init
|
||||
*
|
||||
* The bootstrap configuration provides default settings for the pci
|
||||
* inbound map (PIM). But the bootstrap config choices are limited and
|
||||
* may not be sufficient for a given board.
|
||||
*/
|
||||
void __pci_target_init(struct pci_controller *hose)
|
||||
{
|
||||
/*
|
||||
* Set up Direct MMIO registers
|
||||
*/
|
||||
|
||||
/*
|
||||
* PowerPC440 EP PCI Master configuration.
|
||||
* Map one 1Gig range of PLB/processor addresses to PCI memory space.
|
||||
* PLB address 0xA0000000-0xDFFFFFFF ==> PCI address 0xA0000000-0xDFFFFFFF
|
||||
* Use byte reversed out routines to handle endianess.
|
||||
* Make this region non-prefetchable.
|
||||
*/
|
||||
/* PMM0 Mask/Attribute - disabled b4 setting */
|
||||
out_le32((void *)PCIL0_PMM0MA, 0x00000000);
|
||||
/* PMM0 Local Address */
|
||||
out_le32((void *)PCIL0_PMM0LA, CONFIG_SYS_PCI_MEMBASE);
|
||||
/* PMM0 PCI Low Address */
|
||||
out_le32((void *)PCIL0_PMM0PCILA, CONFIG_SYS_PCI_MEMBASE);
|
||||
/* PMM0 PCI High Address */
|
||||
out_le32((void *)PCIL0_PMM0PCIHA, 0x00000000);
|
||||
/* 512M + No prefetching, and enable region */
|
||||
out_le32((void *)PCIL0_PMM0MA, 0xE0000001);
|
||||
|
||||
/* PMM1 Mask/Attribute - disabled b4 setting */
|
||||
out_le32((void *)PCIL0_PMM1MA, 0x00000000);
|
||||
/* PMM1 Local Address */
|
||||
out_le32((void *)PCIL0_PMM1LA, CONFIG_SYS_PCI_MEMBASE2);
|
||||
/* PMM1 PCI Low Address */
|
||||
out_le32((void *)PCIL0_PMM1PCILA, CONFIG_SYS_PCI_MEMBASE2);
|
||||
/* PMM1 PCI High Address */
|
||||
out_le32((void *)PCIL0_PMM1PCIHA, 0x00000000);
|
||||
/* 512M + No prefetching, and enable region */
|
||||
out_le32((void *)PCIL0_PMM1MA, 0xE0000001);
|
||||
|
||||
out_le32((void *)PCIL0_PTM1MS, 0x00000001); /* Memory Size/Attribute */
|
||||
out_le32((void *)PCIL0_PTM1LA, 0); /* Local Addr. Reg */
|
||||
out_le32((void *)PCIL0_PTM2MS, 0); /* Memory Size/Attribute */
|
||||
out_le32((void *)PCIL0_PTM2LA, 0); /* Local Addr. Reg */
|
||||
|
||||
/*
|
||||
* Set up Configuration registers
|
||||
*/
|
||||
|
||||
/* Program the board's subsystem id/vendor id */
|
||||
pci_write_config_word(0, PCI_SUBSYSTEM_VENDOR_ID,
|
||||
CONFIG_SYS_PCI_SUBSYS_VENDORID);
|
||||
pci_write_config_word(0, PCI_SUBSYSTEM_ID, CONFIG_SYS_PCI_SUBSYS_ID);
|
||||
|
||||
/* Configure command register as bus master */
|
||||
pci_write_config_word(0, PCI_COMMAND, PCI_COMMAND_MASTER);
|
||||
|
||||
/* 240nS PCI clock */
|
||||
pci_write_config_word(0, PCI_LATENCY_TIMER, 1);
|
||||
|
||||
/* No error reporting */
|
||||
pci_write_config_word(0, PCI_ERREN, 0);
|
||||
|
||||
pci_write_config_dword(0, PCI_BRDGOPT2, 0x00000101);
|
||||
}
|
||||
#endif /* CONFIG_SYS_PCI_TARGET_INIT */
|
||||
|
||||
/*
|
||||
* pci_pre_init
|
||||
*
|
||||
* This routine is called just prior to registering the hose and gives
|
||||
* the board the opportunity to check things. Returning a value of zero
|
||||
* indicates that things are bad & PCI initialization should be aborted.
|
||||
*
|
||||
* Different boards may wish to customize the pci controller structure
|
||||
* (add regions, override default access routines, etc) or perform
|
||||
* certain pre-initialization actions.
|
||||
*
|
||||
*/
|
||||
int __pci_pre_init(struct pci_controller *hose)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
/*
|
||||
* Set priority for all PLB3 devices to 0.
|
||||
* Set PLB3 arbiter to fair mode.
|
||||
*/
|
||||
mfsdr(SDR0_AMP1, reg);
|
||||
mtsdr(SDR0_AMP1, (reg & 0x000000FF) | 0x0000FF00);
|
||||
reg = mfdcr(PLB3A0_ACR);
|
||||
mtdcr(PLB3A0_ACR, reg | 0x80000000);
|
||||
|
||||
/*
|
||||
* Set priority for all PLB4 devices to 0.
|
||||
*/
|
||||
mfsdr(SDR0_AMP0, reg);
|
||||
mtsdr(SDR0_AMP0, (reg & 0x000000FF) | 0x0000FF00);
|
||||
reg = mfdcr(PLB4A0_ACR) | 0xa0000000;
|
||||
mtdcr(PLB4A0_ACR, reg);
|
||||
|
||||
/*
|
||||
* Set Nebula PLB4 arbiter to fair mode.
|
||||
*/
|
||||
/* Segment0 */
|
||||
reg = (mfdcr(PLB4A0_ACR) & ~PLB4Ax_ACR_PPM_MASK) | PLB4Ax_ACR_PPM_FAIR;
|
||||
reg = (reg & ~PLB4Ax_ACR_HBU_MASK) | PLB4Ax_ACR_HBU_ENABLED;
|
||||
reg = (reg & ~PLB4Ax_ACR_RDP_MASK) | PLB4Ax_ACR_RDP_4DEEP;
|
||||
reg = (reg & ~PLB4Ax_ACR_WRP_MASK) | PLB4Ax_ACR_WRP_2DEEP;
|
||||
mtdcr(PLB4A0_ACR, reg);
|
||||
|
||||
/* Segment1 */
|
||||
reg = (mfdcr(PLB4A1_ACR) & ~PLB4Ax_ACR_PPM_MASK) | PLB4Ax_ACR_PPM_FAIR;
|
||||
reg = (reg & ~PLB4Ax_ACR_HBU_MASK) | PLB4Ax_ACR_HBU_ENABLED;
|
||||
reg = (reg & ~PLB4Ax_ACR_RDP_MASK) | PLB4Ax_ACR_RDP_4DEEP;
|
||||
reg = (reg & ~PLB4Ax_ACR_WRP_MASK) | PLB4Ax_ACR_WRP_2DEEP;
|
||||
mtdcr(PLB4A1_ACR, reg);
|
||||
|
||||
#if defined(CONFIG_SYS_PCI_BOARD_FIXUP_IRQ)
|
||||
hose->fixup_irq = board_pci_fixup_irq;
|
||||
#endif
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
#else /* defined(CONFIG_440EP) ... */
|
||||
|
||||
#if defined(CONFIG_SYS_PCI_TARGET_INIT)
|
||||
void __pci_target_init(struct pci_controller * hose)
|
||||
{
|
||||
/*
|
||||
* Disable everything
|
||||
*/
|
||||
out_le32((void *)PCIL0_PIM0SA, 0); /* disable */
|
||||
out_le32((void *)PCIL0_PIM1SA, 0); /* disable */
|
||||
out_le32((void *)PCIL0_PIM2SA, 0); /* disable */
|
||||
out_le32((void *)PCIL0_EROMBA, 0); /* disable expansion rom */
|
||||
|
||||
/*
|
||||
* Map all of SDRAM to PCI address 0x0000_0000. Note that the 440
|
||||
* strapping options do not support sizes such as 128/256 MB.
|
||||
*/
|
||||
out_le32((void *)PCIL0_PIM0LAL, CONFIG_SYS_SDRAM_BASE);
|
||||
out_le32((void *)PCIL0_PIM0LAH, 0);
|
||||
out_le32((void *)PCIL0_PIM0SA, ~(gd->ram_size - 1) | 1);
|
||||
out_le32((void *)PCIL0_BAR0, 0);
|
||||
|
||||
/*
|
||||
* Program the board's subsystem id/vendor id
|
||||
*/
|
||||
out_le16((void *)PCIL0_SBSYSVID, CONFIG_SYS_PCI_SUBSYS_VENDORID);
|
||||
out_le16((void *)PCIL0_SBSYSID, CONFIG_SYS_PCI_SUBSYS_DEVICEID);
|
||||
|
||||
out_le16((void *)PCIL0_CMD, in_le16((void *)PCIL0_CMD) |
|
||||
PCI_COMMAND_MEMORY);
|
||||
}
|
||||
#endif /* CONFIG_SYS_PCI_TARGET_INIT */
|
||||
|
||||
int __pci_pre_init(struct pci_controller *hose)
|
||||
{
|
||||
/*
|
||||
* This board is always configured as the host & requires the
|
||||
* PCI arbiter to be enabled.
|
||||
*/
|
||||
if (!pci_arbiter_enabled()) {
|
||||
printf("PCI: PCI Arbiter disabled!\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
#endif /* defined(CONFIG_440EP) ... */
|
||||
|
||||
#if defined(CONFIG_SYS_PCI_TARGET_INIT)
|
||||
void pci_target_init(struct pci_controller * hose)
|
||||
__attribute__((weak, alias("__pci_target_init")));
|
||||
#endif /* CONFIG_SYS_PCI_TARGET_INIT */
|
||||
|
||||
int pci_pre_init(struct pci_controller *hose)
|
||||
__attribute__((weak, alias("__pci_pre_init")));
|
||||
|
||||
#if defined(CONFIG_SYS_PCI_MASTER_INIT)
|
||||
void __pci_master_init(struct pci_controller *hose)
|
||||
{
|
||||
u16 reg;
|
||||
|
||||
/*
|
||||
* Write the PowerPC440 EP PCI Configuration regs.
|
||||
* Enable PowerPC440 EP to be a master on the PCI bus (PMM).
|
||||
* Enable PowerPC440 EP to act as a PCI memory target (PTM).
|
||||
*/
|
||||
pci_read_config_word(0, PCI_COMMAND, ®);
|
||||
pci_write_config_word(0, PCI_COMMAND, reg |
|
||||
PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY);
|
||||
}
|
||||
void pci_master_init(struct pci_controller *hose)
|
||||
__attribute__((weak, alias("__pci_master_init")));
|
||||
#endif /* CONFIG_SYS_PCI_MASTER_INIT */
|
||||
|
||||
#if defined(CONFIG_SYS_PCI_MASTER_INIT) || defined(CONFIG_SYS_PCI_TARGET_INIT)
|
||||
static int pci_440_init (struct pci_controller *hose)
|
||||
{
|
||||
int reg_num = 0;
|
||||
|
||||
#ifndef CONFIG_DISABLE_PISE_TEST
|
||||
/*--------------------------------------------------------------------------+
|
||||
* The PCI initialization sequence enable bit must be set ... if not abort
|
||||
* pci setup since updating the bit requires chip reset.
|
||||
*--------------------------------------------------------------------------*/
|
||||
#if defined(CONFIG_440GX) || defined(CONFIG_440SP) || defined(CONFIG_440SPE)
|
||||
unsigned long strap;
|
||||
|
||||
mfsdr(SDR0_SDSTP1,strap);
|
||||
if ((strap & SDR0_SDSTP1_PISE_MASK) == 0) {
|
||||
printf("PCI: SDR0_STRP1[PISE] not set.\n");
|
||||
printf("PCI: Configuration aborted.\n");
|
||||
return -1;
|
||||
}
|
||||
#elif defined(CONFIG_440GP)
|
||||
unsigned long strap;
|
||||
|
||||
strap = mfdcr(CPC0_STRP1);
|
||||
if ((strap & CPC0_STRP1_PISE_MASK) == 0) {
|
||||
printf("PCI: CPC0_STRP1[PISE] not set.\n");
|
||||
printf("PCI: Configuration aborted.\n");
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
#endif /* CONFIG_DISABLE_PISE_TEST */
|
||||
|
||||
/*--------------------------------------------------------------------------+
|
||||
* PCI controller init
|
||||
*--------------------------------------------------------------------------*/
|
||||
hose->first_busno = 0;
|
||||
hose->last_busno = 0;
|
||||
|
||||
/* PCI I/O space */
|
||||
pci_set_region(hose->regions + reg_num++,
|
||||
0x00000000,
|
||||
PCIL0_IOBASE,
|
||||
0x10000,
|
||||
PCI_REGION_IO);
|
||||
|
||||
/* PCI memory space */
|
||||
pci_set_region(hose->regions + reg_num++,
|
||||
CONFIG_SYS_PCI_TARGBASE,
|
||||
CONFIG_SYS_PCI_MEMBASE,
|
||||
#ifdef CONFIG_SYS_PCI_MEMSIZE
|
||||
CONFIG_SYS_PCI_MEMSIZE,
|
||||
#else
|
||||
0x10000000,
|
||||
#endif
|
||||
PCI_REGION_MEM );
|
||||
|
||||
#if defined(CONFIG_PCI_SYS_MEM_BUS) && defined(CONFIG_PCI_SYS_MEM_PHYS) && \
|
||||
defined(CONFIG_PCI_SYS_MEM_SIZE)
|
||||
/* System memory space */
|
||||
pci_set_region(hose->regions + reg_num++,
|
||||
CONFIG_PCI_SYS_MEM_BUS,
|
||||
CONFIG_PCI_SYS_MEM_PHYS,
|
||||
CONFIG_PCI_SYS_MEM_SIZE,
|
||||
PCI_REGION_MEM | PCI_REGION_SYS_MEMORY );
|
||||
#endif
|
||||
|
||||
hose->region_count = reg_num;
|
||||
|
||||
pci_setup_indirect(hose, PCIL0_CFGADR, PCIL0_CFGDATA);
|
||||
|
||||
/* Let board change/modify hose & do initial checks */
|
||||
if (pci_pre_init(hose) == 0) {
|
||||
printf("PCI: Board-specific initialization failed.\n");
|
||||
printf("PCI: Configuration aborted.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
pci_register_hose( hose );
|
||||
|
||||
/*--------------------------------------------------------------------------+
|
||||
* PCI target init
|
||||
*--------------------------------------------------------------------------*/
|
||||
#if defined(CONFIG_SYS_PCI_TARGET_INIT)
|
||||
pci_target_init(hose); /* Let board setup pci target */
|
||||
#else
|
||||
out16r( PCIL0_SBSYSVID, CONFIG_SYS_PCI_SUBSYS_VENDORID );
|
||||
out16r( PCIL0_SBSYSID, CONFIG_SYS_PCI_SUBSYS_ID );
|
||||
out16r( PCIL0_CLS, 0x00060000 ); /* Bridge, host bridge */
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_440GX) || defined(CONFIG_440SPE) || \
|
||||
defined(CONFIG_460EX) || defined(CONFIG_460GT)
|
||||
out32r( PCIL0_BRDGOPT1, 0x04000060 ); /* PLB Rq pri highest */
|
||||
out32r( PCIL0_BRDGOPT2, in32(PCIL0_BRDGOPT2) | 0x83 ); /* Enable host config, clear Timeout, ensure int src1 */
|
||||
#elif defined(PCIL0_BRDGOPT1)
|
||||
out32r( PCIL0_BRDGOPT1, 0x10000060 ); /* PLB Rq pri highest */
|
||||
out32r( PCIL0_BRDGOPT2, in32(PCIL0_BRDGOPT2) | 1 ); /* Enable host config */
|
||||
#endif
|
||||
|
||||
/*--------------------------------------------------------------------------+
|
||||
* PCI master init: default is one 256MB region for PCI memory:
|
||||
* 0x3_00000000 - 0x3_0FFFFFFF ==> CONFIG_SYS_PCI_MEMBASE
|
||||
*--------------------------------------------------------------------------*/
|
||||
#if defined(CONFIG_SYS_PCI_MASTER_INIT)
|
||||
pci_master_init(hose); /* Let board setup pci master */
|
||||
#else
|
||||
out32r( PCIL0_POM0SA, 0 ); /* disable */
|
||||
out32r( PCIL0_POM1SA, 0 ); /* disable */
|
||||
out32r( PCIL0_POM2SA, 0 ); /* disable */
|
||||
#if defined(CONFIG_440SPE)
|
||||
out32r( PCIL0_POM0LAL, 0x10000000 );
|
||||
out32r( PCIL0_POM0LAH, 0x0000000c );
|
||||
#elif defined(CONFIG_460EX) || defined(CONFIG_460GT)
|
||||
out32r( PCIL0_POM0LAL, 0x20000000 );
|
||||
out32r( PCIL0_POM0LAH, 0x0000000c );
|
||||
#else
|
||||
out32r( PCIL0_POM0LAL, 0x00000000 );
|
||||
out32r( PCIL0_POM0LAH, 0x00000003 );
|
||||
#endif
|
||||
out32r( PCIL0_POM0PCIAL, CONFIG_SYS_PCI_MEMBASE );
|
||||
out32r( PCIL0_POM0PCIAH, 0x00000000 );
|
||||
out32r( PCIL0_POM0SA, 0xf0000001 ); /* 256MB, enabled */
|
||||
out32r( PCIL0_STS, in32r( PCIL0_STS ) & ~0x0000fff8 );
|
||||
#endif
|
||||
|
||||
/*--------------------------------------------------------------------------+
|
||||
* PCI host configuration -- we don't make any assumptions here ... the
|
||||
* _board_must_indicate_ what to do -- there's just too many runtime
|
||||
* scenarios in environments like cPCI, PPMC, etc. to make a determination
|
||||
* based on hard-coded values or state of arbiter enable.
|
||||
*--------------------------------------------------------------------------*/
|
||||
if (is_pci_host(hose)) {
|
||||
#ifdef CONFIG_PCI_SCAN_SHOW
|
||||
printf("PCI: Bus Dev VenId DevId Class Int\n");
|
||||
#endif
|
||||
#if !defined(CONFIG_440EP) && !defined(CONFIG_440GR) && \
|
||||
!defined(CONFIG_440EPX) && !defined(CONFIG_440GRX)
|
||||
out16r( PCIL0_CMD, in16r( PCIL0_CMD ) | PCI_COMMAND_MASTER);
|
||||
#endif
|
||||
hose->last_busno = pci_hose_scan(hose);
|
||||
}
|
||||
return hose->last_busno;
|
||||
}
|
||||
#endif
|
||||
|
||||
void pci_init_board(void)
|
||||
{
|
||||
int busno = 0;
|
||||
|
||||
/*
|
||||
* Only init PCI when either master or target functionality
|
||||
* is selected.
|
||||
*/
|
||||
#if defined(CONFIG_SYS_PCI_MASTER_INIT) || defined(CONFIG_SYS_PCI_TARGET_INIT)
|
||||
busno = pci_440_init(&ppc440_hose);
|
||||
if (busno < 0)
|
||||
return;
|
||||
#endif
|
||||
#if (defined(CONFIG_440SPE) || \
|
||||
defined(CONFIG_460EX) || defined(CONFIG_460GT)) && \
|
||||
!defined(CONFIG_PCI_DISABLE_PCIE)
|
||||
pcie_setup_hoses(busno + 1);
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* CONFIG_440 */
|
||||
|
||||
#if defined(CONFIG_405EX)
|
||||
void pci_init_board(void)
|
||||
{
|
||||
#ifdef CONFIG_PCI_SCAN_SHOW
|
||||
printf("PCI: Bus Dev VenId DevId Class Int\n");
|
||||
#endif
|
||||
pcie_setup_hoses(0);
|
||||
}
|
||||
#endif /* CONFIG_405EX */
|
||||
|
||||
#endif /* CONFIG_PCI */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,267 +0,0 @@
|
||||
/*
|
||||
* (C) Copyright 2000-2006
|
||||
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||
*
|
||||
* (C) Copyright 2010
|
||||
* Stefan Roese, DENX Software Engineering, sr@denx.de.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0 IBM-pibs
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/io.h>
|
||||
#include <watchdog.h>
|
||||
#include <asm/ppc4xx.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
#if defined(CONFIG_405GP) || \
|
||||
defined(CONFIG_405EP) || defined(CONFIG_405EZ) || \
|
||||
defined(CONFIG_405EX) || defined(CONFIG_440)
|
||||
|
||||
#if defined(CONFIG_440)
|
||||
|
||||
#if defined(CONFIG_440GP)
|
||||
#define CR0_MASK 0x3fff0000
|
||||
#define CR0_EXTCLK_ENA 0x00600000
|
||||
#define CR0_UDIV_POS 16
|
||||
#define UDIV_SUBTRACT 1
|
||||
#define UART0_SDR CPC0_CR0
|
||||
#define MFREG(a, d) d = mfdcr(a)
|
||||
#define MTREG(a, d) mtdcr(a, d)
|
||||
#else /* #if defined(CONFIG_440GP) */
|
||||
/* all other 440 PPC's access clock divider via sdr register */
|
||||
#define CR0_MASK 0xdfffffff
|
||||
#define CR0_EXTCLK_ENA 0x00800000
|
||||
#define CR0_UDIV_POS 0
|
||||
#define UDIV_SUBTRACT 0
|
||||
#define UART0_SDR SDR0_UART0
|
||||
#define UART1_SDR SDR0_UART1
|
||||
#if defined(CONFIG_440EP) || defined(CONFIG_440EPX) || \
|
||||
defined(CONFIG_440GR) || defined(CONFIG_440GRX) || \
|
||||
defined(CONFIG_440SP) || defined(CONFIG_440SPE) || \
|
||||
defined(CONFIG_460EX) || defined(CONFIG_460GT)
|
||||
#define UART2_SDR SDR0_UART2
|
||||
#endif
|
||||
#if defined(CONFIG_440EP) || defined(CONFIG_440EPX) || \
|
||||
defined(CONFIG_440GR) || defined(CONFIG_440GRX) || \
|
||||
defined(CONFIG_460EX) || defined(CONFIG_460GT)
|
||||
#define UART3_SDR SDR0_UART3
|
||||
#endif
|
||||
#define MFREG(a, d) mfsdr(a, d)
|
||||
#define MTREG(a, d) mtsdr(a, d)
|
||||
#endif /* #if defined(CONFIG_440GP) */
|
||||
#elif defined(CONFIG_405EP) || defined(CONFIG_405EZ)
|
||||
#define UCR0_MASK 0x0000007f
|
||||
#define UCR1_MASK 0x00007f00
|
||||
#define UCR0_UDIV_POS 0
|
||||
#define UCR1_UDIV_POS 8
|
||||
#define UDIV_MAX 127
|
||||
#elif defined(CONFIG_405EX)
|
||||
#define MFREG(a, d) mfsdr(a, d)
|
||||
#define MTREG(a, d) mtsdr(a, d)
|
||||
#define CR0_MASK 0x000000ff
|
||||
#define CR0_EXTCLK_ENA 0x00800000
|
||||
#define CR0_UDIV_POS 0
|
||||
#define UDIV_SUBTRACT 0
|
||||
#define UART0_SDR SDR0_UART0
|
||||
#define UART1_SDR SDR0_UART1
|
||||
#else /* CONFIG_405GP */
|
||||
#define CR0_MASK 0x00001fff
|
||||
#define CR0_EXTCLK_ENA 0x000000c0
|
||||
#define CR0_UDIV_POS 1
|
||||
#define UDIV_MAX 32
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_405EP) && defined(CONFIG_SYS_EXT_SERIAL_CLOCK)
|
||||
#error "External serial clock not supported on AMCC PPC405EP!"
|
||||
#endif
|
||||
|
||||
#if (defined(CONFIG_405EX) || defined(CONFIG_405EZ) || \
|
||||
defined(CONFIG_440)) && !defined(CONFIG_SYS_EXT_SERIAL_CLOCK)
|
||||
/*
|
||||
* For some SoC's, the cpu clock is on divider chain A, UART on
|
||||
* divider chain B ... so cpu clock is irrelevant. Get the
|
||||
* "optimized" values that are subject to the 1/2 opb clock
|
||||
* constraint.
|
||||
*/
|
||||
static u16 serial_bdiv(int baudrate, u32 *udiv)
|
||||
{
|
||||
sys_info_t sysinfo;
|
||||
u32 div; /* total divisor udiv * bdiv */
|
||||
u32 umin; /* minimum udiv */
|
||||
u16 diff; /* smallest diff */
|
||||
u16 idiff; /* current diff */
|
||||
u16 ibdiv; /* current bdiv */
|
||||
u32 i;
|
||||
u32 est; /* current estimate */
|
||||
u32 max;
|
||||
#if defined(CONFIG_405EZ)
|
||||
u32 cpr_pllc;
|
||||
u32 plloutb;
|
||||
u32 reg;
|
||||
#endif
|
||||
|
||||
get_sys_info(&sysinfo);
|
||||
|
||||
#if defined(CONFIG_405EZ)
|
||||
/* check the pll feedback source */
|
||||
mfcpr(CPR0_PLLC, cpr_pllc);
|
||||
plloutb = ((CONFIG_SYS_CLK_FREQ * ((cpr_pllc & PLLC_SRC_MASK) ?
|
||||
sysinfo.pllFwdDivB : sysinfo.pllFwdDiv) *
|
||||
sysinfo.pllFbkDiv) / sysinfo.pllFwdDivB);
|
||||
div = plloutb / (16 * baudrate); /* total divisor */
|
||||
umin = (plloutb / get_OPB_freq()) << 1; /* 2 x OPB divisor */
|
||||
max = 256; /* highest possible */
|
||||
#else /* 405EZ */
|
||||
div = sysinfo.freqPLB / (16 * baudrate); /* total divisor */
|
||||
umin = sysinfo.pllOpbDiv << 1; /* 2 x OPB divisor */
|
||||
max = 32; /* highest possible */
|
||||
#endif /* 405EZ */
|
||||
|
||||
*udiv = diff = max;
|
||||
|
||||
/*
|
||||
* i is the test udiv value -- start with the largest
|
||||
* possible (max) to minimize serial clock and constrain
|
||||
* search to umin.
|
||||
*/
|
||||
for (i = max; i > umin; i--) {
|
||||
ibdiv = div / i;
|
||||
est = i * ibdiv;
|
||||
idiff = (est > div) ? (est - div) : (div - est);
|
||||
if (idiff == 0) {
|
||||
*udiv = i;
|
||||
break; /* can't do better */
|
||||
} else if (idiff < diff) {
|
||||
*udiv = i; /* best so far */
|
||||
diff = idiff; /* update lowest diff*/
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(CONFIG_405EZ)
|
||||
mfcpr(CPR0_PERD0, reg);
|
||||
reg &= ~0x0000ffff;
|
||||
reg |= ((*udiv - 0) << 8) | (*udiv - 0);
|
||||
mtcpr(CPR0_PERD0, reg);
|
||||
#endif
|
||||
|
||||
return div / *udiv;
|
||||
}
|
||||
#endif /* #if (defined(CONFIG_405EP) ... */
|
||||
|
||||
/*
|
||||
* This function returns the UART clock used by the common
|
||||
* NS16550 driver. Additionally the SoC internal divisors for
|
||||
* optimal UART baudrate are configured.
|
||||
*/
|
||||
int get_serial_clock(void)
|
||||
{
|
||||
u32 clk;
|
||||
u32 udiv;
|
||||
#if !defined(CONFIG_405EZ)
|
||||
u32 reg;
|
||||
#endif
|
||||
#if !defined(CONFIG_SYS_EXT_SERIAL_CLOCK)
|
||||
PPC4xx_SYS_INFO sys_info;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Programming of the internal divisors is SoC specific.
|
||||
* Let's handle this in some #ifdef's for the SoC's.
|
||||
*/
|
||||
|
||||
#if defined(CONFIG_405GP)
|
||||
reg = mfdcr(CPC0_CR0) & ~CR0_MASK;
|
||||
#ifdef CONFIG_SYS_EXT_SERIAL_CLOCK
|
||||
clk = CONFIG_SYS_EXT_SERIAL_CLOCK;
|
||||
udiv = 1;
|
||||
reg |= CR0_EXTCLK_ENA;
|
||||
#else /* CONFIG_SYS_EXT_SERIAL_CLOCK */
|
||||
clk = gd->cpu_clk;
|
||||
#ifdef CONFIG_SYS_405_UART_ERRATA_59
|
||||
udiv = 31; /* Errata 59: stuck at 31 */
|
||||
#else /* CONFIG_SYS_405_UART_ERRATA_59 */
|
||||
{
|
||||
u32 tmp = CONFIG_SYS_BASE_BAUD * 16;
|
||||
|
||||
udiv = (clk + tmp / 2) / tmp;
|
||||
}
|
||||
if (udiv > UDIV_MAX) /* max. n bits for udiv */
|
||||
udiv = UDIV_MAX;
|
||||
#endif /* CONFIG_SYS_405_UART_ERRATA_59 */
|
||||
#endif /* CONFIG_SYS_EXT_SERIAL_CLOCK */
|
||||
reg |= (udiv - 1) << CR0_UDIV_POS; /* set the UART divisor */
|
||||
mtdcr (CPC0_CR0, reg);
|
||||
#ifdef CONFIG_SYS_EXT_SERIAL_CLOCK
|
||||
clk = CONFIG_SYS_EXT_SERIAL_CLOCK;
|
||||
#else
|
||||
clk = CONFIG_SYS_BASE_BAUD * 16;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_405EP)
|
||||
{
|
||||
u32 tmp = CONFIG_SYS_BASE_BAUD * 16;
|
||||
|
||||
reg = mfdcr(CPC0_UCR) & ~(UCR0_MASK | UCR1_MASK);
|
||||
clk = gd->cpu_clk;
|
||||
udiv = (clk + tmp / 2) / tmp;
|
||||
if (udiv > UDIV_MAX) /* max. n bits for udiv */
|
||||
udiv = UDIV_MAX;
|
||||
}
|
||||
reg |= udiv << UCR0_UDIV_POS; /* set the UART divisor */
|
||||
reg |= udiv << UCR1_UDIV_POS; /* set the UART divisor */
|
||||
mtdcr(CPC0_UCR, reg);
|
||||
clk = CONFIG_SYS_BASE_BAUD * 16;
|
||||
#endif /* CONFIG_405EP */
|
||||
|
||||
#if defined(CONFIG_405EX) || defined(CONFIG_440)
|
||||
MFREG(UART0_SDR, reg);
|
||||
reg &= ~CR0_MASK;
|
||||
|
||||
#ifdef CONFIG_SYS_EXT_SERIAL_CLOCK
|
||||
reg |= CR0_EXTCLK_ENA;
|
||||
udiv = 1;
|
||||
clk = CONFIG_SYS_EXT_SERIAL_CLOCK;
|
||||
#else /* CONFIG_SYS_EXT_SERIAL_CLOCK */
|
||||
clk = gd->baudrate * serial_bdiv(gd->baudrate, &udiv) * 16;
|
||||
#endif /* CONFIG_SYS_EXT_SERIAL_CLOCK */
|
||||
|
||||
reg |= (udiv - UDIV_SUBTRACT) << CR0_UDIV_POS; /* set the UART divisor */
|
||||
|
||||
/*
|
||||
* Configure input clock to baudrate generator for all
|
||||
* available serial ports here
|
||||
*/
|
||||
MTREG(UART0_SDR, reg);
|
||||
#if defined(UART1_SDR)
|
||||
MTREG(UART1_SDR, reg);
|
||||
#endif
|
||||
#if defined(UART2_SDR)
|
||||
MTREG(UART2_SDR, reg);
|
||||
#endif
|
||||
#if defined(UART3_SDR)
|
||||
MTREG(UART3_SDR, reg);
|
||||
#endif
|
||||
#endif /* CONFIG_405EX ... */
|
||||
|
||||
#if defined(CONFIG_405EZ)
|
||||
clk = gd->baudrate * serial_bdiv(gd->baudrate, &udiv) * 16;
|
||||
#endif /* CONFIG_405EZ */
|
||||
|
||||
/*
|
||||
* Correct UART frequency in bd-info struct now that
|
||||
* the UART divisor is available
|
||||
*/
|
||||
#ifdef CONFIG_SYS_EXT_SERIAL_CLOCK
|
||||
gd->arch.uart_clk = CONFIG_SYS_EXT_SERIAL_CLOCK;
|
||||
#else
|
||||
get_sys_info(&sys_info);
|
||||
gd->arch.uart_clk = sys_info.freqUART / udiv;
|
||||
#endif
|
||||
|
||||
return clk;
|
||||
}
|
||||
#endif /* CONFIG_405GP */
|
||||
@@ -1,179 +0,0 @@
|
||||
menu "ppc4xx CPU"
|
||||
depends on 4xx
|
||||
|
||||
config SYS_CPU
|
||||
default "ppc4xx"
|
||||
|
||||
choice
|
||||
prompt "Target select"
|
||||
optional
|
||||
|
||||
config TARGET_LWMON5
|
||||
bool "Support lwmon5"
|
||||
|
||||
config TARGET_T3CORP
|
||||
bool "Support t3corp"
|
||||
|
||||
config TARGET_ACADIA
|
||||
bool "Support acadia"
|
||||
|
||||
config TARGET_BAMBOO
|
||||
bool "Support bamboo"
|
||||
|
||||
config TARGET_BUBINGA
|
||||
bool "Support bubinga"
|
||||
|
||||
config TARGET_CANYONLANDS
|
||||
bool "Support canyonlands"
|
||||
select DM
|
||||
select DM_SERIAL
|
||||
|
||||
config TARGET_KATMAI
|
||||
bool "Support katmai"
|
||||
select PHYS_64BIT
|
||||
|
||||
config TARGET_KILAUEA
|
||||
bool "Support kilauea"
|
||||
|
||||
config TARGET_LUAN
|
||||
bool "Support luan"
|
||||
|
||||
config TARGET_MAKALU
|
||||
bool "Support makalu"
|
||||
|
||||
config TARGET_REDWOOD
|
||||
bool "Support redwood"
|
||||
|
||||
config TARGET_SEQUOIA
|
||||
bool "Support sequoia"
|
||||
|
||||
config TARGET_WALNUT
|
||||
bool "Support walnut"
|
||||
|
||||
config TARGET_YOSEMITE
|
||||
bool "Support yosemite"
|
||||
|
||||
config TARGET_YUCCA
|
||||
bool "Support yucca"
|
||||
|
||||
config TARGET_CPCI2DP
|
||||
bool "Support CPCI2DP"
|
||||
|
||||
config TARGET_CPCI4052
|
||||
bool "Support CPCI4052"
|
||||
|
||||
config TARGET_PLU405
|
||||
bool "Support PLU405"
|
||||
|
||||
config TARGET_PMC405DE
|
||||
bool "Support PMC405DE"
|
||||
|
||||
config TARGET_PMC440
|
||||
bool "Support PMC440"
|
||||
|
||||
config TARGET_VOM405
|
||||
bool "Support VOM405"
|
||||
|
||||
config TARGET_DLVISION_10G
|
||||
bool "Support dlvision-10g"
|
||||
|
||||
config TARGET_IO
|
||||
bool "Support io"
|
||||
|
||||
config TARGET_IOCON
|
||||
bool "Support iocon"
|
||||
|
||||
config TARGET_NEO
|
||||
bool "Support neo"
|
||||
|
||||
config TARGET_IO64
|
||||
bool "Support io64"
|
||||
|
||||
config TARGET_DLVISION
|
||||
bool "Support dlvision"
|
||||
|
||||
config TARGET_GDPPC440ETX
|
||||
bool "Support gdppc440etx"
|
||||
|
||||
config TARGET_INTIP
|
||||
bool "Support intip"
|
||||
|
||||
config TARGET_ICON
|
||||
bool "Support icon"
|
||||
|
||||
config TARGET_MIP405
|
||||
bool "Support MIP405"
|
||||
|
||||
config TARGET_MIP405T
|
||||
bool "Support MIP405T"
|
||||
|
||||
config TARGET_PIP405
|
||||
bool "Support PIP405"
|
||||
|
||||
config TARGET_XPEDITE1000
|
||||
bool "Support xpedite1000"
|
||||
|
||||
config TARGET_XILINX_PPC405_GENERIC
|
||||
bool "Support xilinx-ppc405-generic"
|
||||
select SUPPORT_SPL
|
||||
select OF_CONTROL
|
||||
select DM
|
||||
select DM_SERIAL
|
||||
|
||||
config TARGET_XILINX_PPC440_GENERIC
|
||||
bool "Support xilinx-ppc440-generic"
|
||||
select SUPPORT_SPL
|
||||
select OF_CONTROL
|
||||
select DM
|
||||
select DM_SERIAL
|
||||
|
||||
endchoice
|
||||
|
||||
config CMD_CHIP_CONFIG
|
||||
bool "Enable the 'chip_config' command"
|
||||
help
|
||||
This command programs the I2C bootstrap EEPROM or shows a list of
|
||||
possible configurations. The configurations are board-specific
|
||||
and control the CPU and peripehrals clocks. The programmed
|
||||
configuration is then used when the board boots.
|
||||
|
||||
config CMD_ECCTEST
|
||||
bool "Enable the 'ecctest' command"
|
||||
help
|
||||
This command tests memory ECC by single and double error bit
|
||||
injection.
|
||||
|
||||
source "board/amcc/acadia/Kconfig"
|
||||
source "board/amcc/bamboo/Kconfig"
|
||||
source "board/amcc/bubinga/Kconfig"
|
||||
source "board/amcc/canyonlands/Kconfig"
|
||||
source "board/amcc/katmai/Kconfig"
|
||||
source "board/amcc/kilauea/Kconfig"
|
||||
source "board/amcc/luan/Kconfig"
|
||||
source "board/amcc/makalu/Kconfig"
|
||||
source "board/amcc/redwood/Kconfig"
|
||||
source "board/amcc/sequoia/Kconfig"
|
||||
source "board/amcc/walnut/Kconfig"
|
||||
source "board/amcc/yosemite/Kconfig"
|
||||
source "board/amcc/yucca/Kconfig"
|
||||
source "board/esd/cpci2dp/Kconfig"
|
||||
source "board/esd/cpci405/Kconfig"
|
||||
source "board/esd/plu405/Kconfig"
|
||||
source "board/esd/pmc405de/Kconfig"
|
||||
source "board/esd/pmc440/Kconfig"
|
||||
source "board/esd/vom405/Kconfig"
|
||||
source "board/gdsys/405ep/Kconfig"
|
||||
source "board/gdsys/405ex/Kconfig"
|
||||
source "board/gdsys/dlvision/Kconfig"
|
||||
source "board/gdsys/gdppc440etx/Kconfig"
|
||||
source "board/gdsys/intip/Kconfig"
|
||||
source "board/liebherr/lwmon5/Kconfig"
|
||||
source "board/mosaixtech/icon/Kconfig"
|
||||
source "board/mpl/mip405/Kconfig"
|
||||
source "board/mpl/pip405/Kconfig"
|
||||
source "board/t3corp/Kconfig"
|
||||
source "board/xes/xpedite1000/Kconfig"
|
||||
source "board/xilinx/ppc405-generic/Kconfig"
|
||||
source "board/xilinx/ppc440-generic/Kconfig"
|
||||
|
||||
endmenu
|
||||
@@ -1,49 +0,0 @@
|
||||
#
|
||||
# (C) Copyright 2000-2006
|
||||
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0+
|
||||
#
|
||||
|
||||
extra-y := resetvec.o
|
||||
extra-y += start.o
|
||||
|
||||
obj-y := cache.o
|
||||
obj-y += dcr.o
|
||||
obj-y += kgdb.o
|
||||
|
||||
obj-y += 40x_spd_sdram.o
|
||||
|
||||
obj-y += 44x_spd_ddr.o
|
||||
obj-$(CONFIG_SDRAM_PPC4xx_IBM_DDR2) += 44x_spd_ddr2.o
|
||||
obj-$(CONFIG_PPC4xx_DDR_AUTOCALIBRATION) += 4xx_ibm_ddr2_autocalib.o
|
||||
obj-y += 4xx_pci.o
|
||||
obj-y += 4xx_pcie.o
|
||||
obj-y += bedbug_405.o
|
||||
obj-$(CONFIG_CMD_CHIP_CONFIG) += cmd_chip_config.o
|
||||
obj-y += cpu.o
|
||||
obj-y += cpu_init.o
|
||||
obj-y += denali_data_eye.o
|
||||
obj-y += denali_spd_ddr2.o
|
||||
obj-y += ecc.o
|
||||
obj-$(CONFIG_CMD_ECCTEST) += cmd_ecctest.o
|
||||
obj-y += fdt.o
|
||||
obj-y += interrupts.o
|
||||
obj-$(CONFIG_CMD_REGINFO) += reginfo.o
|
||||
obj-y += sdram.o
|
||||
obj-y += speed.o
|
||||
obj-y += tlb.o
|
||||
obj-y += traps.o
|
||||
obj-y += usb.o
|
||||
obj-y += usb_ohci.o
|
||||
obj-$(CONFIG_XILINX_440) += xilinx_irq.o
|
||||
ifndef CONFIG_XILINX_440
|
||||
obj-y += 4xx_uart.o
|
||||
obj-y += gpio.o
|
||||
obj-y += miiphy.o
|
||||
obj-y += uic.o
|
||||
endif
|
||||
|
||||
ifdef CONFIG_SPL_BUILD
|
||||
obj-y += spl_boot.o
|
||||
endif
|
||||
@@ -1,308 +0,0 @@
|
||||
/*
|
||||
* Bedbug Functions specific to the PPC405 chip
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <command.h>
|
||||
#include <linux/ctype.h>
|
||||
#include <bedbug/type.h>
|
||||
#include <bedbug/bedbug.h>
|
||||
#include <bedbug/regs.h>
|
||||
#include <bedbug/ppc.h>
|
||||
|
||||
#if defined(CONFIG_CMD_BEDBUG) && defined(CONFIG_4xx)
|
||||
|
||||
#define MAX_BREAK_POINTS 4
|
||||
|
||||
extern CPU_DEBUG_CTX bug_ctx;
|
||||
|
||||
void bedbug405_init __P ((void));
|
||||
void bedbug405_do_break __P ((cmd_tbl_t *, int, int, char * const []));
|
||||
void bedbug405_break_isr __P ((struct pt_regs *));
|
||||
int bedbug405_find_empty __P ((void));
|
||||
int bedbug405_set __P ((int, unsigned long));
|
||||
int bedbug405_clear __P ((int));
|
||||
|
||||
|
||||
/* ======================================================================
|
||||
* Initialize the global bug_ctx structure for the AMCC PPC405. Clear all
|
||||
* of the breakpoints.
|
||||
* ====================================================================== */
|
||||
|
||||
void bedbug405_init (void)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* -------------------------------------------------- */
|
||||
|
||||
bug_ctx.hw_debug_enabled = 0;
|
||||
bug_ctx.stopped = 0;
|
||||
bug_ctx.current_bp = 0;
|
||||
bug_ctx.regs = NULL;
|
||||
|
||||
bug_ctx.do_break = bedbug405_do_break;
|
||||
bug_ctx.break_isr = bedbug405_break_isr;
|
||||
bug_ctx.find_empty = bedbug405_find_empty;
|
||||
bug_ctx.set = bedbug405_set;
|
||||
bug_ctx.clear = bedbug405_clear;
|
||||
|
||||
for (i = 1; i <= MAX_BREAK_POINTS; ++i)
|
||||
(*bug_ctx.clear) (i);
|
||||
|
||||
puts ("BEDBUG:ready\n");
|
||||
return;
|
||||
} /* bedbug_init_breakpoints */
|
||||
|
||||
|
||||
|
||||
/* ======================================================================
|
||||
* Set/clear/show one of the hardware breakpoints for the 405. The "off"
|
||||
* string will disable a specific breakpoint. The "show" string will
|
||||
* display the current breakpoints. Otherwise an address will set a
|
||||
* breakpoint at that address. Setting a breakpoint uses the CPU-specific
|
||||
* set routine which will assign a breakpoint number.
|
||||
* ====================================================================== */
|
||||
|
||||
void bedbug405_do_break (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
|
||||
{
|
||||
long addr = 0; /* Address to break at */
|
||||
int which_bp; /* Breakpoint number */
|
||||
|
||||
/* -------------------------------------------------- */
|
||||
|
||||
if (argc < 2) {
|
||||
cmd_usage(cmdtp);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Turn off a breakpoint */
|
||||
|
||||
if (strcmp (argv[1], "off") == 0) {
|
||||
if (bug_ctx.hw_debug_enabled == 0) {
|
||||
printf ("No breakpoints enabled\n");
|
||||
return;
|
||||
}
|
||||
|
||||
which_bp = simple_strtoul (argv[2], NULL, 10);
|
||||
|
||||
if (bug_ctx.clear)
|
||||
(*bug_ctx.clear) (which_bp);
|
||||
|
||||
printf ("Breakpoint %d removed\n", which_bp);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Show a list of breakpoints */
|
||||
|
||||
if (strcmp (argv[1], "show") == 0) {
|
||||
for (which_bp = 1; which_bp <= MAX_BREAK_POINTS; ++which_bp) {
|
||||
|
||||
switch (which_bp) {
|
||||
case 1:
|
||||
addr = GET_IAC1 ();
|
||||
break;
|
||||
case 2:
|
||||
addr = GET_IAC2 ();
|
||||
break;
|
||||
case 3:
|
||||
addr = GET_IAC3 ();
|
||||
break;
|
||||
case 4:
|
||||
addr = GET_IAC4 ();
|
||||
break;
|
||||
}
|
||||
|
||||
printf ("Breakpoint [%d]: ", which_bp);
|
||||
if (addr == 0)
|
||||
printf ("NOT SET\n");
|
||||
else
|
||||
disppc ((unsigned char *) addr, 0, 1, bedbug_puts,
|
||||
F_RADHEX);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
/* Set a breakpoint at the address */
|
||||
|
||||
if (!isdigit (argv[1][0])) {
|
||||
cmd_usage(cmdtp);
|
||||
return;
|
||||
}
|
||||
|
||||
addr = simple_strtoul (argv[1], NULL, 16) & 0xfffffffc;
|
||||
|
||||
if ((bug_ctx.set) && (which_bp = (*bug_ctx.set) (0, addr)) > 0) {
|
||||
printf ("Breakpoint [%d]: ", which_bp);
|
||||
disppc ((unsigned char *) addr, 0, 1, bedbug_puts, F_RADHEX);
|
||||
}
|
||||
|
||||
return;
|
||||
} /* bedbug405_do_break */
|
||||
|
||||
|
||||
|
||||
/* ======================================================================
|
||||
* Handle a breakpoint. First determine which breakpoint was hit by
|
||||
* looking at the DeBug Status Register (DBSR), clear the breakpoint
|
||||
* and enter a mini main loop. Stay in the loop until the stopped flag
|
||||
* in the debug context is cleared.
|
||||
* ====================================================================== */
|
||||
|
||||
void bedbug405_break_isr (struct pt_regs *regs)
|
||||
{
|
||||
unsigned long dbsr_val; /* Value of the DBSR */
|
||||
unsigned long addr = 0; /* Address stopped at */
|
||||
|
||||
/* -------------------------------------------------- */
|
||||
|
||||
dbsr_val = GET_DBSR ();
|
||||
|
||||
if (dbsr_val & DBSR_IA1) {
|
||||
bug_ctx.current_bp = 1;
|
||||
addr = GET_IAC1 ();
|
||||
SET_DBSR (DBSR_IA1); /* Write a 1 to clear */
|
||||
} else if (dbsr_val & DBSR_IA2) {
|
||||
bug_ctx.current_bp = 2;
|
||||
addr = GET_IAC2 ();
|
||||
SET_DBSR (DBSR_IA2); /* Write a 1 to clear */
|
||||
} else if (dbsr_val & DBSR_IA3) {
|
||||
bug_ctx.current_bp = 3;
|
||||
addr = GET_IAC3 ();
|
||||
SET_DBSR (DBSR_IA3); /* Write a 1 to clear */
|
||||
} else if (dbsr_val & DBSR_IA4) {
|
||||
bug_ctx.current_bp = 4;
|
||||
addr = GET_IAC4 ();
|
||||
SET_DBSR (DBSR_IA4); /* Write a 1 to clear */
|
||||
}
|
||||
|
||||
bedbug_main_loop (addr, regs);
|
||||
return;
|
||||
} /* bedbug405_break_isr */
|
||||
|
||||
|
||||
|
||||
/* ======================================================================
|
||||
* Look through all of the hardware breakpoints available to see if one
|
||||
* is unused.
|
||||
* ====================================================================== */
|
||||
|
||||
int bedbug405_find_empty (void)
|
||||
{
|
||||
/* -------------------------------------------------- */
|
||||
|
||||
if (GET_IAC1 () == 0)
|
||||
return 1;
|
||||
|
||||
if (GET_IAC2 () == 0)
|
||||
return 2;
|
||||
|
||||
if (GET_IAC3 () == 0)
|
||||
return 3;
|
||||
|
||||
if (GET_IAC4 () == 0)
|
||||
return 4;
|
||||
|
||||
return 0;
|
||||
} /* bedbug405_find_empty */
|
||||
|
||||
|
||||
|
||||
/* ======================================================================
|
||||
* Set a breakpoint. If 'which_bp' is zero then find an unused breakpoint
|
||||
* number, otherwise reassign the given breakpoint. If hardware debugging
|
||||
* is not enabled, then turn it on via the MSR and DBCR0. Set the break
|
||||
* address in the appropriate IACx register and enable proper address
|
||||
* beakpoint in DBCR0.
|
||||
* ====================================================================== */
|
||||
|
||||
int bedbug405_set (int which_bp, unsigned long addr)
|
||||
{
|
||||
/* -------------------------------------------------- */
|
||||
|
||||
/* Only look if which_bp == 0, else use which_bp */
|
||||
if ((bug_ctx.find_empty) && (!which_bp) &&
|
||||
(which_bp = (*bug_ctx.find_empty) ()) == 0) {
|
||||
printf ("All breakpoints in use\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (which_bp < 1 || which_bp > MAX_BREAK_POINTS) {
|
||||
printf ("Invalid break point # %d\n", which_bp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!bug_ctx.hw_debug_enabled) {
|
||||
SET_MSR (GET_MSR () | 0x200); /* set MSR[ DE ] */
|
||||
SET_DBCR0 (GET_DBCR0 () | DBCR0_IDM);
|
||||
bug_ctx.hw_debug_enabled = 1;
|
||||
}
|
||||
|
||||
switch (which_bp) {
|
||||
case 1:
|
||||
SET_IAC1 (addr);
|
||||
SET_DBCR0 (GET_DBCR0 () | DBCR0_IA1);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
SET_IAC2 (addr);
|
||||
SET_DBCR0 (GET_DBCR0 () | DBCR0_IA2);
|
||||
break;
|
||||
|
||||
case 3:
|
||||
SET_IAC3 (addr);
|
||||
SET_DBCR0 (GET_DBCR0 () | DBCR0_IA3);
|
||||
break;
|
||||
|
||||
case 4:
|
||||
SET_IAC4 (addr);
|
||||
SET_DBCR0 (GET_DBCR0 () | DBCR0_IA4);
|
||||
break;
|
||||
}
|
||||
|
||||
return which_bp;
|
||||
} /* bedbug405_set */
|
||||
|
||||
|
||||
|
||||
/* ======================================================================
|
||||
* Disable a specific breakoint by setting the appropriate IACx register
|
||||
* to zero and claring the instruction address breakpoint in DBCR0.
|
||||
* ====================================================================== */
|
||||
|
||||
int bedbug405_clear (int which_bp)
|
||||
{
|
||||
/* -------------------------------------------------- */
|
||||
|
||||
if (which_bp < 1 || which_bp > MAX_BREAK_POINTS) {
|
||||
printf ("Invalid break point # (%d)\n", which_bp);
|
||||
return -1;
|
||||
}
|
||||
|
||||
switch (which_bp) {
|
||||
case 1:
|
||||
SET_IAC1 (0);
|
||||
SET_DBCR0 (GET_DBCR0 () & ~DBCR0_IA1);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
SET_IAC2 (0);
|
||||
SET_DBCR0 (GET_DBCR0 () & ~DBCR0_IA2);
|
||||
break;
|
||||
|
||||
case 3:
|
||||
SET_IAC3 (0);
|
||||
SET_DBCR0 (GET_DBCR0 () & ~DBCR0_IA3);
|
||||
break;
|
||||
|
||||
case 4:
|
||||
SET_IAC4 (0);
|
||||
SET_DBCR0 (GET_DBCR0 () & ~DBCR0_IA4);
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
} /* bedbug405_clear */
|
||||
|
||||
|
||||
/* ====================================================================== */
|
||||
#endif
|
||||
@@ -1,188 +0,0 @@
|
||||
/*
|
||||
* This file contains miscellaneous low-level functions.
|
||||
* Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
|
||||
*
|
||||
* Largely rewritten by Cort Dougan (cort@cs.nmt.edu)
|
||||
* and Paul Mackerras.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <config.h>
|
||||
#include <asm/ppc4xx.h>
|
||||
#include <ppc_asm.tmpl>
|
||||
#include <ppc_defs.h>
|
||||
#include <asm/cache.h>
|
||||
#include <asm/mmu.h>
|
||||
|
||||
/*
|
||||
* Flush instruction cache.
|
||||
*/
|
||||
_GLOBAL(invalidate_icache)
|
||||
iccci r0,r0
|
||||
isync
|
||||
blr
|
||||
|
||||
/*
|
||||
* Write any modified data cache blocks out to memory
|
||||
* and invalidate the corresponding instruction cache blocks.
|
||||
*
|
||||
* flush_icache_range(unsigned long start, unsigned long stop)
|
||||
*/
|
||||
_GLOBAL(flush_icache_range)
|
||||
li r5,L1_CACHE_BYTES-1
|
||||
andc r3,r3,r5
|
||||
subf r4,r3,r4
|
||||
add r4,r4,r5
|
||||
srwi. r4,r4,L1_CACHE_SHIFT
|
||||
beqlr
|
||||
mtctr r4
|
||||
mr r6,r3
|
||||
1: dcbst 0,r3
|
||||
addi r3,r3,L1_CACHE_BYTES
|
||||
bdnz 1b
|
||||
sync /* wait for dcbst's to get to ram */
|
||||
mtctr r4
|
||||
2: icbi 0,r6
|
||||
addi r6,r6,L1_CACHE_BYTES
|
||||
bdnz 2b
|
||||
sync /* additional sync needed on g4 */
|
||||
isync
|
||||
blr
|
||||
|
||||
/*
|
||||
* Write any modified data cache blocks out to memory.
|
||||
* Does not invalidate the corresponding cache lines (especially for
|
||||
* any corresponding instruction cache).
|
||||
*
|
||||
* clean_dcache_range(unsigned long start, unsigned long stop)
|
||||
*/
|
||||
_GLOBAL(clean_dcache_range)
|
||||
li r5,L1_CACHE_BYTES-1
|
||||
andc r3,r3,r5
|
||||
subf r4,r3,r4
|
||||
add r4,r4,r5
|
||||
srwi. r4,r4,L1_CACHE_SHIFT
|
||||
beqlr
|
||||
mtctr r4
|
||||
|
||||
1: dcbst 0,r3
|
||||
addi r3,r3,L1_CACHE_BYTES
|
||||
bdnz 1b
|
||||
sync /* wait for dcbst's to get to ram */
|
||||
blr
|
||||
|
||||
/*
|
||||
* 40x cores have 8K or 16K dcache and 32 byte line size.
|
||||
* 44x has a 32K dcache and 32 byte line size.
|
||||
* 8xx has 1, 2, 4, 8K variants.
|
||||
* For now, cover the worst case of the 44x.
|
||||
* Must be called with external interrupts disabled.
|
||||
*/
|
||||
#define CACHE_NWAYS 64
|
||||
#define CACHE_NLINES 32
|
||||
|
||||
_GLOBAL(flush_dcache)
|
||||
li r4,(2 * CACHE_NWAYS * CACHE_NLINES)
|
||||
mtctr r4
|
||||
lis r5,0
|
||||
1: lwz r3,0(r5) /* Load one word from every line */
|
||||
addi r5,r5,L1_CACHE_BYTES
|
||||
bdnz 1b
|
||||
sync
|
||||
blr
|
||||
|
||||
_GLOBAL(invalidate_dcache)
|
||||
addi r6,0,0x0000 /* clear GPR 6 */
|
||||
/* Do loop for # of dcache congruence classes. */
|
||||
lis r7,(CONFIG_SYS_DCACHE_SIZE / L1_CACHE_BYTES / 2)@ha /* TBS for large sized cache */
|
||||
ori r7,r7,(CONFIG_SYS_DCACHE_SIZE / L1_CACHE_BYTES / 2)@l
|
||||
/* NOTE: dccci invalidates both */
|
||||
mtctr r7 /* ways in the D cache */
|
||||
..dcloop:
|
||||
dccci 0,r6 /* invalidate line */
|
||||
addi r6,r6,L1_CACHE_BYTES /* bump to next line */
|
||||
bdnz ..dcloop
|
||||
sync
|
||||
blr
|
||||
|
||||
/*
|
||||
* Cache functions.
|
||||
*
|
||||
* NOTE: currently the 440s run with dcache _disabled_ once relocated to DRAM,
|
||||
* although for some cache-ralated calls stubs have to be provided to satisfy
|
||||
* symbols resolution.
|
||||
* Icache-related functions are used in POST framework.
|
||||
*
|
||||
*/
|
||||
#ifdef CONFIG_440
|
||||
|
||||
.globl dcache_disable
|
||||
.globl dcache_enable
|
||||
.globl icache_disable
|
||||
.globl icache_enable
|
||||
dcache_disable:
|
||||
dcache_enable:
|
||||
icache_disable:
|
||||
icache_enable:
|
||||
blr
|
||||
|
||||
.globl dcache_status
|
||||
.globl icache_status
|
||||
dcache_status:
|
||||
icache_status:
|
||||
mr r3, 0
|
||||
blr
|
||||
|
||||
#else /* CONFIG_440 */
|
||||
|
||||
.globl icache_enable
|
||||
icache_enable:
|
||||
mflr r8
|
||||
bl invalidate_icache
|
||||
mtlr r8
|
||||
isync
|
||||
addis r3,r0, 0xc000 /* set bit 0 */
|
||||
mticcr r3
|
||||
blr
|
||||
|
||||
.globl icache_disable
|
||||
icache_disable:
|
||||
addis r3,r0, 0x0000 /* clear bit 0 */
|
||||
mticcr r3
|
||||
isync
|
||||
blr
|
||||
|
||||
.globl icache_status
|
||||
icache_status:
|
||||
mficcr r3
|
||||
srwi r3, r3, 31 /* >>31 => select bit 0 */
|
||||
blr
|
||||
|
||||
.globl dcache_enable
|
||||
dcache_enable:
|
||||
mflr r8
|
||||
bl invalidate_dcache
|
||||
mtlr r8
|
||||
isync
|
||||
addis r3,r0, 0x8000 /* set bit 0 */
|
||||
mtdccr r3
|
||||
blr
|
||||
|
||||
.globl dcache_disable
|
||||
dcache_disable:
|
||||
mflr r8
|
||||
bl flush_dcache
|
||||
mtlr r8
|
||||
addis r3,r0, 0x0000 /* clear bit 0 */
|
||||
mtdccr r3
|
||||
blr
|
||||
|
||||
.globl dcache_status
|
||||
dcache_status:
|
||||
mfdccr r3
|
||||
srwi r3, r3, 31 /* >>31 => select bit 0 */
|
||||
blr
|
||||
|
||||
#endif /* CONFIG_440 */
|
||||
@@ -1,131 +0,0 @@
|
||||
/*
|
||||
* (C) Copyright 2008-2009
|
||||
* Stefan Roese, DENX Software Engineering, sr@denx.de.
|
||||
*
|
||||
* (C) Copyright 2009
|
||||
* Dirk Eibach, Guntermann & Drunck GmbH, eibach@gdsys.de
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <command.h>
|
||||
#include <i2c.h>
|
||||
#include <asm/ppc4xx_config.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
static void print_configs(int cur_config_nr)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ppc4xx_config_count; i++) {
|
||||
printf("%-16s - %s", ppc4xx_config_val[i].label,
|
||||
ppc4xx_config_val[i].description);
|
||||
if (i == cur_config_nr)
|
||||
printf(" ***");
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static int do_chip_config(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||
{
|
||||
int i;
|
||||
int ret;
|
||||
int cur_config_nr = -1;
|
||||
u8 cur_config[CONFIG_4xx_CONFIG_BLOCKSIZE];
|
||||
|
||||
/*
|
||||
* First switch to correct I2C bus. This is I2C bus 0
|
||||
* for all currently available 4xx derivats.
|
||||
*/
|
||||
i2c_set_bus_num(0);
|
||||
|
||||
#ifdef CONFIG_CMD_EEPROM
|
||||
ret = eeprom_read(CONFIG_4xx_CONFIG_I2C_EEPROM_ADDR,
|
||||
CONFIG_4xx_CONFIG_I2C_EEPROM_OFFSET,
|
||||
cur_config, CONFIG_4xx_CONFIG_BLOCKSIZE);
|
||||
#else
|
||||
ret = i2c_read(CONFIG_4xx_CONFIG_I2C_EEPROM_ADDR,
|
||||
CONFIG_4xx_CONFIG_I2C_EEPROM_OFFSET,
|
||||
1, cur_config, CONFIG_4xx_CONFIG_BLOCKSIZE);
|
||||
#endif
|
||||
if (ret) {
|
||||
printf("Error reading EEPROM at addr 0x%x\n",
|
||||
CONFIG_4xx_CONFIG_I2C_EEPROM_ADDR);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Search the current configuration
|
||||
*/
|
||||
for (i = 0; i < ppc4xx_config_count; i++) {
|
||||
if (memcmp(cur_config, ppc4xx_config_val[i].val,
|
||||
CONFIG_4xx_CONFIG_BLOCKSIZE) == 0)
|
||||
cur_config_nr = i;
|
||||
}
|
||||
|
||||
if (cur_config_nr == -1) {
|
||||
printf("Warning: The I2C bootstrap values don't match any"
|
||||
" of the available options!\n");
|
||||
printf("I2C bootstrap EEPROM values are (I2C address 0x%02x):\n",
|
||||
CONFIG_4xx_CONFIG_I2C_EEPROM_ADDR);
|
||||
for (i = 0; i < CONFIG_4xx_CONFIG_BLOCKSIZE; i++) {
|
||||
printf("%02x ", cur_config[i]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
if (argc < 2) {
|
||||
printf("Available configurations (I2C address 0x%02x):\n",
|
||||
CONFIG_4xx_CONFIG_I2C_EEPROM_ADDR);
|
||||
print_configs(cur_config_nr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < ppc4xx_config_count; i++) {
|
||||
/*
|
||||
* Search for configuration name/label
|
||||
*/
|
||||
if (strcmp(argv[1], ppc4xx_config_val[i].label) == 0) {
|
||||
printf("Using configuration:\n%-16s - %s\n",
|
||||
ppc4xx_config_val[i].label,
|
||||
ppc4xx_config_val[i].description);
|
||||
|
||||
#ifdef CONFIG_CMD_EEPROM
|
||||
ret = eeprom_write(CONFIG_4xx_CONFIG_I2C_EEPROM_ADDR,
|
||||
CONFIG_4xx_CONFIG_I2C_EEPROM_OFFSET,
|
||||
ppc4xx_config_val[i].val,
|
||||
CONFIG_4xx_CONFIG_BLOCKSIZE);
|
||||
#else
|
||||
ret = i2c_write(CONFIG_4xx_CONFIG_I2C_EEPROM_ADDR,
|
||||
CONFIG_4xx_CONFIG_I2C_EEPROM_OFFSET,
|
||||
1, ppc4xx_config_val[i].val,
|
||||
CONFIG_4xx_CONFIG_BLOCKSIZE);
|
||||
#endif
|
||||
udelay(CONFIG_SYS_EEPROM_PAGE_WRITE_DELAY_MS * 1000);
|
||||
if (ret) {
|
||||
printf("Error updating EEPROM at addr 0x%x\n",
|
||||
CONFIG_4xx_CONFIG_I2C_EEPROM_ADDR);
|
||||
return -1;
|
||||
}
|
||||
|
||||
printf("done (dump via 'i2c md %x 0.1 %x')\n",
|
||||
CONFIG_4xx_CONFIG_I2C_EEPROM_ADDR,
|
||||
CONFIG_4xx_CONFIG_BLOCKSIZE);
|
||||
printf("Reset the board for the changes to"
|
||||
" take effect\n");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
printf("Configuration %s not found!\n", argv[1]);
|
||||
print_configs(cur_config_nr);
|
||||
return -1;
|
||||
}
|
||||
|
||||
U_BOOT_CMD(
|
||||
chip_config, 2, 0, do_chip_config,
|
||||
"program the I2C bootstrap EEPROM",
|
||||
"[config-label]"
|
||||
);
|
||||
@@ -1,262 +0,0 @@
|
||||
/*
|
||||
* (C) Copyright 2010
|
||||
* Stefan Roese, DENX Software Engineering, sr@denx.de.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/ppc4xx.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/cache.h>
|
||||
|
||||
#if defined(CONFIG_SDRAM_PPC4xx_IBM_DDR) || \
|
||||
defined(CONFIG_SDRAM_PPC4xx_IBM_DDR2)
|
||||
#if defined(CONFIG_DDR_ECC) || defined(CONFIG_SDRAM_ECC)
|
||||
|
||||
#if defined(CONFIG_405EX)
|
||||
/*
|
||||
* Currently only 405EX uses 16bit data bus width as an alternative
|
||||
* option to 32bit data width (SDRAM0_MCOPT1_WDTH)
|
||||
*/
|
||||
#define SDRAM_DATA_ALT_WIDTH 2
|
||||
#else
|
||||
#define SDRAM_DATA_ALT_WIDTH 8
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SYS_OCM_BASE)
|
||||
#define CONFIG_FUNC_ISRAM_ADDR CONFIG_SYS_OCM_BASE
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SYS_ISRAM_BASE)
|
||||
#define CONFIG_FUNC_ISRAM_ADDR CONFIG_SYS_ISRAM_BASE
|
||||
#endif
|
||||
|
||||
#if !defined(CONFIG_FUNC_ISRAM_ADDR)
|
||||
#error "No internal SRAM/OCM provided!"
|
||||
#endif
|
||||
|
||||
#define force_inline inline __attribute__ ((always_inline))
|
||||
|
||||
static inline void machine_check_disable(void)
|
||||
{
|
||||
mtmsr(mfmsr() & ~MSR_ME);
|
||||
}
|
||||
|
||||
static inline void machine_check_enable(void)
|
||||
{
|
||||
mtmsr(mfmsr() | MSR_ME);
|
||||
}
|
||||
|
||||
/*
|
||||
* These helper functions need to be inlined, since they
|
||||
* are called from the functions running from internal SRAM.
|
||||
* SDRAM operation is forbidden at that time, so calling
|
||||
* functions in SDRAM has to be avoided.
|
||||
*/
|
||||
static force_inline void wait_ddr_idle(void)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
do {
|
||||
mfsdram(SDRAM_MCSTAT, val);
|
||||
} while ((val & SDRAM_MCSTAT_IDLE_MASK) == SDRAM_MCSTAT_IDLE_NOT);
|
||||
}
|
||||
|
||||
static force_inline void recalibrate_ddr(void)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
/*
|
||||
* Rewrite RQDC & RFDC to calibrate again. If this is not
|
||||
* done, the SDRAM controller is working correctly after
|
||||
* changing the MCOPT1_MCHK bits.
|
||||
*/
|
||||
mfsdram(SDRAM_RQDC, val);
|
||||
mtsdram(SDRAM_RQDC, val);
|
||||
mfsdram(SDRAM_RFDC, val);
|
||||
mtsdram(SDRAM_RFDC, val);
|
||||
}
|
||||
|
||||
static force_inline void set_mcopt1_mchk(u32 bits)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
wait_ddr_idle();
|
||||
mfsdram(SDRAM_MCOPT1, val);
|
||||
mtsdram(SDRAM_MCOPT1, (val & ~SDRAM_MCOPT1_MCHK_MASK) | bits);
|
||||
recalibrate_ddr();
|
||||
}
|
||||
|
||||
/*
|
||||
* The next 2 functions are copied to internal SRAM/OCM and run
|
||||
* there. No function calls allowed here. No SDRAM acitivity should
|
||||
* be done here.
|
||||
*/
|
||||
static void inject_ecc_error(void *ptr, int par)
|
||||
{
|
||||
/*
|
||||
* Taken from PPC460EX/EXr/GT users manual (Rev 1.21)
|
||||
* 22.2.17.13 ECC Diagnostics
|
||||
*
|
||||
* Items 1 ... 5 are already done by now, running from RAM
|
||||
* with ECC enabled
|
||||
*/
|
||||
|
||||
out_be32(ptr, 0x00000000);
|
||||
in_be32(ptr);
|
||||
|
||||
/* 6. Set memory controller to no error checking */
|
||||
set_mcopt1_mchk(SDRAM_MCOPT1_MCHK_NON);
|
||||
|
||||
/* 7. Modify one or two bits for error simulation */
|
||||
if (par == 1)
|
||||
out_be32(ptr, in_be32(ptr) ^ 0x00000001);
|
||||
else
|
||||
out_be32(ptr, in_be32(ptr) ^ 0x00000003);
|
||||
|
||||
/* 8. Wait for SDRAM idle */
|
||||
in_be32(ptr);
|
||||
set_mcopt1_mchk(SDRAM_MCOPT1_MCHK_CHK_REP);
|
||||
|
||||
/* Wait for SDRAM idle */
|
||||
wait_ddr_idle();
|
||||
|
||||
/* Continue with 9. in calling function... */
|
||||
}
|
||||
|
||||
static void rewrite_ecc_parity(void *ptr, int par)
|
||||
{
|
||||
u32 current_address = (u32)ptr;
|
||||
u32 end_address;
|
||||
u32 address_increment;
|
||||
u32 mcopt1;
|
||||
|
||||
/*
|
||||
* Fill ECC parity byte again. Otherwise further accesses to
|
||||
* the failure address will result in exceptions.
|
||||
*/
|
||||
|
||||
/* Wait for SDRAM idle */
|
||||
in_be32(0x00000000);
|
||||
set_mcopt1_mchk(SDRAM_MCOPT1_MCHK_GEN);
|
||||
|
||||
/* ECC bit set method for non-cached memory */
|
||||
mfsdram(SDRAM_MCOPT1, mcopt1);
|
||||
if ((mcopt1 & SDRAM_MCOPT1_DMWD_MASK) == SDRAM_MCOPT1_DMWD_32)
|
||||
address_increment = 4;
|
||||
else
|
||||
address_increment = SDRAM_DATA_ALT_WIDTH;
|
||||
end_address = current_address + CONFIG_SYS_CACHELINE_SIZE;
|
||||
|
||||
while (current_address < end_address) {
|
||||
*((unsigned long *)current_address) = 0;
|
||||
current_address += address_increment;
|
||||
}
|
||||
|
||||
set_mcopt1_mchk(SDRAM_MCOPT1_MCHK_CHK_REP);
|
||||
|
||||
/* Wait for SDRAM idle */
|
||||
wait_ddr_idle();
|
||||
}
|
||||
|
||||
static int do_ecctest(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||
{
|
||||
u32 old_val;
|
||||
u32 val;
|
||||
u32 *ptr;
|
||||
void (*sram_func)(u32 *, int);
|
||||
int error;
|
||||
|
||||
if (argc < 3) {
|
||||
return cmd_usage(cmdtp);
|
||||
}
|
||||
|
||||
ptr = (u32 *)simple_strtoul(argv[1], NULL, 16);
|
||||
error = simple_strtoul(argv[2], NULL, 16);
|
||||
if ((error < 1) || (error > 2)) {
|
||||
return cmd_usage(cmdtp);
|
||||
}
|
||||
|
||||
printf("Using address %p for %d bit ECC error injection\n",
|
||||
ptr, error);
|
||||
|
||||
/*
|
||||
* Save value to restore it later on
|
||||
*/
|
||||
old_val = in_be32(ptr);
|
||||
|
||||
/*
|
||||
* Copy ECC injection function into internal SRAM/OCM
|
||||
*/
|
||||
sram_func = (void *)CONFIG_FUNC_ISRAM_ADDR;
|
||||
memcpy((void *)CONFIG_FUNC_ISRAM_ADDR, inject_ecc_error, 0x10000);
|
||||
|
||||
/*
|
||||
* Disable interrupts and exceptions before calling this
|
||||
* function in internal SRAM/OCM
|
||||
*/
|
||||
disable_interrupts();
|
||||
machine_check_disable();
|
||||
eieio();
|
||||
|
||||
/*
|
||||
* Jump to ECC simulation function in internal SRAM/OCM
|
||||
*/
|
||||
(*sram_func)(ptr, error);
|
||||
|
||||
/* 10. Read the corresponding address */
|
||||
val = in_be32(ptr);
|
||||
|
||||
/*
|
||||
* Read and print ECC status register/info:
|
||||
* The faulting address is only known upon uncorrectable ECC
|
||||
* errors.
|
||||
*/
|
||||
mfsdram(SDRAM_ECCES, val);
|
||||
if (val & SDRAM_ECCES_CE)
|
||||
printf("ECC: Correctable error\n");
|
||||
if (val & SDRAM_ECCES_UE) {
|
||||
printf("ECC: Uncorrectable error at 0x%02x%08x\n",
|
||||
mfdcr(SDRAM_ERRADDULL), mfdcr(SDRAM_ERRADDLLL));
|
||||
}
|
||||
|
||||
/*
|
||||
* Clear pending interrupts/exceptions
|
||||
*/
|
||||
mtsdram(SDRAM_ECCES, 0xffffffff);
|
||||
mtdcr(SDRAM_ERRSTATLL, 0xff000000);
|
||||
set_mcsr(get_mcsr());
|
||||
|
||||
/* Now enable interrupts and exceptions again */
|
||||
eieio();
|
||||
machine_check_enable();
|
||||
enable_interrupts();
|
||||
|
||||
/*
|
||||
* The ECC parity byte need to be re-written for the
|
||||
* corresponding address. Otherwise future accesses to it
|
||||
* will result in exceptions.
|
||||
*
|
||||
* Jump to ECC parity generation function
|
||||
*/
|
||||
memcpy((void *)CONFIG_FUNC_ISRAM_ADDR, rewrite_ecc_parity, 0x10000);
|
||||
(*sram_func)(ptr, 0);
|
||||
|
||||
/*
|
||||
* Restore value in corresponding address
|
||||
*/
|
||||
out_be32(ptr, old_val);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
U_BOOT_CMD(
|
||||
ecctest, 3, 0, do_ecctest,
|
||||
"Test ECC by single and double error bit injection",
|
||||
"address 1/2"
|
||||
);
|
||||
|
||||
#endif /* defined(CONFIG_DDR_ECC) || defined(CONFIG_SDRAM_ECC) */
|
||||
#endif /* defined(CONFIG_SDRAM_PPC4xx_IBM_DDR)... */
|
||||
@@ -1,14 +0,0 @@
|
||||
#
|
||||
# (C) Copyright 2000-2010
|
||||
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0+
|
||||
#
|
||||
|
||||
PLATFORM_CPPFLAGS += -mstring -msoft-float
|
||||
|
||||
ifneq (,$(CONFIG_440))
|
||||
PLATFORM_CPPFLAGS += -Wa,-m440 -mcpu=440
|
||||
else
|
||||
PLATFORM_CPPFLAGS += -Wa,-m405 -mcpu=405
|
||||
endif
|
||||
@@ -1,702 +0,0 @@
|
||||
/*
|
||||
* (C) Copyright 2000-2007
|
||||
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
/*
|
||||
* CPU specific code
|
||||
*
|
||||
* written or collected and sometimes rewritten by
|
||||
* Magnus Damm <damm@bitsmart.com>
|
||||
*
|
||||
* minor modifications by
|
||||
* Wolfgang Denk <wd@denx.de>
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <watchdog.h>
|
||||
#include <command.h>
|
||||
#include <asm/cache.h>
|
||||
#include <asm/ppc4xx.h>
|
||||
#include <netdev.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
void board_reset(void);
|
||||
|
||||
/*
|
||||
* To provide an interface to detect CPU number for boards that support
|
||||
* more then one CPU, we implement the "weak" default functions here.
|
||||
*
|
||||
* Returns CPU number
|
||||
*/
|
||||
int __get_cpu_num(void)
|
||||
{
|
||||
return NA_OR_UNKNOWN_CPU;
|
||||
}
|
||||
int get_cpu_num(void) __attribute__((weak, alias("__get_cpu_num")));
|
||||
|
||||
#if defined(CONFIG_PCI)
|
||||
#if defined(CONFIG_405GP) || \
|
||||
defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
|
||||
defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
|
||||
|
||||
#define PCI_ASYNC
|
||||
|
||||
static int pci_async_enabled(void)
|
||||
{
|
||||
#if defined(CONFIG_405GP)
|
||||
return (mfdcr(CPC0_PSR) & PSR_PCI_ASYNC_EN);
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
|
||||
defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
|
||||
defined(CONFIG_460EX) || defined(CONFIG_460GT)
|
||||
unsigned long val;
|
||||
|
||||
mfsdr(SDR0_SDSTP1, val);
|
||||
return (val & SDR0_SDSTP1_PAME_MASK);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
#endif /* CONFIG_PCI */
|
||||
|
||||
#if defined(CONFIG_PCI) && \
|
||||
!defined(CONFIG_405) && !defined(CONFIG_405EX)
|
||||
int pci_arbiter_enabled(void)
|
||||
{
|
||||
#if defined(CONFIG_405GP)
|
||||
return (mfdcr(CPC0_PSR) & PSR_PCI_ARBIT_EN);
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_405EP)
|
||||
return (mfdcr(CPC0_PCI) & CPC0_PCI_ARBIT_EN);
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_440GP)
|
||||
return (mfdcr(CPC0_STRP1) & CPC0_STRP1_PAE_MASK);
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_440GX) || defined(CONFIG_440SP) || defined(CONFIG_440SPE)
|
||||
unsigned long val;
|
||||
|
||||
mfsdr(SDR0_XCR0, val);
|
||||
return (val & SDR0_XCR0_PAE_MASK);
|
||||
#endif
|
||||
#if defined(CONFIG_440EP) || defined(CONFIG_440GR) || \
|
||||
defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
|
||||
defined(CONFIG_460EX) || defined(CONFIG_460GT)
|
||||
unsigned long val;
|
||||
|
||||
mfsdr(SDR0_PCI0, val);
|
||||
return (val & SDR0_PCI0_PAE_MASK);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_405EP)
|
||||
#define I2C_BOOTROM
|
||||
|
||||
static int i2c_bootrom_enabled(void)
|
||||
{
|
||||
#if defined(CONFIG_405EP)
|
||||
return (mfdcr(CPC0_BOOT) & CPC0_BOOT_SEP);
|
||||
#else
|
||||
unsigned long val;
|
||||
|
||||
mfsdr(SDR0_SDCS0, val);
|
||||
return (val & SDR0_SDCS_SDD);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_440GX)
|
||||
#define SDR0_PINSTP_SHIFT 29
|
||||
static char *bootstrap_str[] = {
|
||||
"EBC (16 bits)",
|
||||
"EBC (8 bits)",
|
||||
"EBC (32 bits)",
|
||||
"EBC (8 bits)",
|
||||
"PCI",
|
||||
"I2C (Addr 0x54)",
|
||||
"Reserved",
|
||||
"I2C (Addr 0x50)",
|
||||
};
|
||||
static char bootstrap_char[] = { 'A', 'B', 'C', 'B', 'D', 'E', 'x', 'F' };
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_440SP) || defined(CONFIG_440SPE)
|
||||
#define SDR0_PINSTP_SHIFT 30
|
||||
static char *bootstrap_str[] = {
|
||||
"EBC (8 bits)",
|
||||
"PCI",
|
||||
"I2C (Addr 0x54)",
|
||||
"I2C (Addr 0x50)",
|
||||
};
|
||||
static char bootstrap_char[] = { 'A', 'B', 'C', 'D'};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_440EP) || defined(CONFIG_440GR)
|
||||
#define SDR0_PINSTP_SHIFT 29
|
||||
static char *bootstrap_str[] = {
|
||||
"EBC (8 bits)",
|
||||
"PCI",
|
||||
"NAND (8 bits)",
|
||||
"EBC (16 bits)",
|
||||
"EBC (16 bits)",
|
||||
"I2C (Addr 0x54)",
|
||||
"PCI",
|
||||
"I2C (Addr 0x52)",
|
||||
};
|
||||
static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G', 'F', 'H' };
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
|
||||
#define SDR0_PINSTP_SHIFT 29
|
||||
static char *bootstrap_str[] = {
|
||||
"EBC (8 bits)",
|
||||
"EBC (16 bits)",
|
||||
"EBC (16 bits)",
|
||||
"NAND (8 bits)",
|
||||
"PCI",
|
||||
"I2C (Addr 0x54)",
|
||||
"PCI",
|
||||
"I2C (Addr 0x52)",
|
||||
};
|
||||
static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G', 'F', 'H' };
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_460EX) || defined(CONFIG_460GT)
|
||||
#define SDR0_PINSTP_SHIFT 29
|
||||
static char *bootstrap_str[] = {
|
||||
"EBC (8 bits)",
|
||||
"EBC (16 bits)",
|
||||
"PCI",
|
||||
"PCI",
|
||||
"EBC (16 bits)",
|
||||
"NAND (8 bits)",
|
||||
"I2C (Addr 0x54)", /* A8 */
|
||||
"I2C (Addr 0x52)", /* A4 */
|
||||
};
|
||||
static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H' };
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_460SX)
|
||||
#define SDR0_PINSTP_SHIFT 29
|
||||
static char *bootstrap_str[] = {
|
||||
"EBC (8 bits)",
|
||||
"EBC (16 bits)",
|
||||
"EBC (32 bits)",
|
||||
"NAND (8 bits)",
|
||||
"I2C (Addr 0x54)", /* A8 */
|
||||
"I2C (Addr 0x52)", /* A4 */
|
||||
};
|
||||
static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G' };
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_405EZ)
|
||||
#define SDR0_PINSTP_SHIFT 28
|
||||
static char *bootstrap_str[] = {
|
||||
"EBC (8 bits)",
|
||||
"SPI (fast)",
|
||||
"NAND (512 page, 4 addr cycle)",
|
||||
"I2C (Addr 0x50)",
|
||||
"EBC (32 bits)",
|
||||
"I2C (Addr 0x50)",
|
||||
"NAND (2K page, 5 addr cycle)",
|
||||
"I2C (Addr 0x50)",
|
||||
"EBC (16 bits)",
|
||||
"Reserved",
|
||||
"NAND (2K page, 4 addr cycle)",
|
||||
"I2C (Addr 0x50)",
|
||||
"NAND (512 page, 3 addr cycle)",
|
||||
"I2C (Addr 0x50)",
|
||||
"SPI (slow)",
|
||||
"I2C (Addr 0x50)",
|
||||
};
|
||||
static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', \
|
||||
'I', 'x', 'K', 'L', 'M', 'N', 'O', 'P' };
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_405EX)
|
||||
#define SDR0_PINSTP_SHIFT 29
|
||||
static char *bootstrap_str[] = {
|
||||
"EBC (8 bits)",
|
||||
"EBC (16 bits)",
|
||||
"EBC (16 bits)",
|
||||
"NAND (8 bits)",
|
||||
"NAND (8 bits)",
|
||||
"I2C (Addr 0x54)",
|
||||
"EBC (8 bits)",
|
||||
"I2C (Addr 0x52)",
|
||||
};
|
||||
static char bootstrap_char[] = { 'A', 'B', 'C', 'D', 'E', 'G', 'F', 'H' };
|
||||
#endif
|
||||
|
||||
#if defined(SDR0_PINSTP_SHIFT)
|
||||
static int bootstrap_option(void)
|
||||
{
|
||||
unsigned long val;
|
||||
|
||||
mfsdr(SDR0_PINSTP, val);
|
||||
return ((val & 0xf0000000) >> SDR0_PINSTP_SHIFT);
|
||||
}
|
||||
#endif /* SDR0_PINSTP_SHIFT */
|
||||
|
||||
|
||||
#if defined(CONFIG_440GP)
|
||||
static int do_chip_reset (unsigned long sys0, unsigned long sys1)
|
||||
{
|
||||
/* Changes to CPC0_SYS0 and CPC0_SYS1 require chip
|
||||
* reset.
|
||||
*/
|
||||
mtdcr (CPC0_CR0, mfdcr (CPC0_CR0) | 0x80000000); /* Set SWE */
|
||||
mtdcr (CPC0_SYS0, sys0);
|
||||
mtdcr (CPC0_SYS1, sys1);
|
||||
mtdcr (CPC0_CR0, mfdcr (CPC0_CR0) & ~0x80000000); /* Clr SWE */
|
||||
mtspr (SPRN_DBCR0, 0x20000000); /* Reset the chip */
|
||||
|
||||
return 1;
|
||||
}
|
||||
#endif /* CONFIG_440GP */
|
||||
|
||||
|
||||
int checkcpu (void)
|
||||
{
|
||||
#if !defined(CONFIG_405) /* not used on Xilinx 405 FPGA implementations */
|
||||
uint pvr = get_pvr();
|
||||
ulong clock = gd->cpu_clk;
|
||||
char buf[32];
|
||||
#if defined(CONFIG_460EX) || defined(CONFIG_460GT)
|
||||
u32 reg;
|
||||
#endif
|
||||
|
||||
char addstr[64] = "";
|
||||
sys_info_t sys_info;
|
||||
int cpu_num;
|
||||
|
||||
cpu_num = get_cpu_num();
|
||||
if (cpu_num >= 0)
|
||||
printf("CPU%d: ", cpu_num);
|
||||
else
|
||||
puts("CPU: ");
|
||||
|
||||
get_sys_info(&sys_info);
|
||||
|
||||
#if defined(CONFIG_XILINX_440)
|
||||
puts("IBM PowerPC ");
|
||||
#else
|
||||
puts("AMCC PowerPC ");
|
||||
#endif
|
||||
|
||||
switch (pvr) {
|
||||
|
||||
#if !defined(CONFIG_440)
|
||||
case PVR_405GP_RB:
|
||||
puts("405GP Rev. B");
|
||||
break;
|
||||
|
||||
case PVR_405GP_RC:
|
||||
puts("405GP Rev. C");
|
||||
break;
|
||||
|
||||
case PVR_405GP_RD:
|
||||
puts("405GP Rev. D");
|
||||
break;
|
||||
|
||||
case PVR_405GP_RE:
|
||||
puts("405GP Rev. E");
|
||||
break;
|
||||
|
||||
case PVR_405GPR_RB:
|
||||
puts("405GPr Rev. B");
|
||||
break;
|
||||
|
||||
case PVR_405EP_RB:
|
||||
puts("405EP Rev. B");
|
||||
break;
|
||||
|
||||
case PVR_405EZ_RA:
|
||||
puts("405EZ Rev. A");
|
||||
break;
|
||||
|
||||
case PVR_405EX1_RA:
|
||||
puts("405EX Rev. A");
|
||||
strcpy(addstr, "Security support");
|
||||
break;
|
||||
|
||||
case PVR_405EXR2_RA:
|
||||
puts("405EXr Rev. A");
|
||||
strcpy(addstr, "No Security support");
|
||||
break;
|
||||
|
||||
case PVR_405EX1_RC:
|
||||
puts("405EX Rev. C");
|
||||
strcpy(addstr, "Security support");
|
||||
break;
|
||||
|
||||
case PVR_405EX2_RC:
|
||||
puts("405EX Rev. C");
|
||||
strcpy(addstr, "No Security support");
|
||||
break;
|
||||
|
||||
case PVR_405EXR1_RC:
|
||||
puts("405EXr Rev. C");
|
||||
strcpy(addstr, "Security support");
|
||||
break;
|
||||
|
||||
case PVR_405EXR2_RC:
|
||||
puts("405EXr Rev. C");
|
||||
strcpy(addstr, "No Security support");
|
||||
break;
|
||||
|
||||
case PVR_405EX1_RD:
|
||||
puts("405EX Rev. D");
|
||||
strcpy(addstr, "Security support");
|
||||
break;
|
||||
|
||||
case PVR_405EX2_RD:
|
||||
puts("405EX Rev. D");
|
||||
strcpy(addstr, "No Security support");
|
||||
break;
|
||||
|
||||
case PVR_405EXR1_RD:
|
||||
puts("405EXr Rev. D");
|
||||
strcpy(addstr, "Security support");
|
||||
break;
|
||||
|
||||
case PVR_405EXR2_RD:
|
||||
puts("405EXr Rev. D");
|
||||
strcpy(addstr, "No Security support");
|
||||
break;
|
||||
|
||||
#else /* CONFIG_440 */
|
||||
|
||||
#if defined(CONFIG_440GP)
|
||||
case PVR_440GP_RB:
|
||||
puts("440GP Rev. B");
|
||||
/* See errata 1.12: CHIP_4 */
|
||||
if ((mfdcr(CPC0_SYS0) != mfdcr(CPC0_STRP0)) ||
|
||||
(mfdcr(CPC0_SYS1) != mfdcr(CPC0_STRP1)) ){
|
||||
puts ( "\n\t CPC0_SYSx DCRs corrupted. "
|
||||
"Resetting chip ...\n");
|
||||
udelay( 1000 * 1000 ); /* Give time for serial buf to clear */
|
||||
do_chip_reset ( mfdcr(CPC0_STRP0),
|
||||
mfdcr(CPC0_STRP1) );
|
||||
}
|
||||
break;
|
||||
|
||||
case PVR_440GP_RC:
|
||||
puts("440GP Rev. C");
|
||||
break;
|
||||
#endif /* CONFIG_440GP */
|
||||
|
||||
case PVR_440GX_RA:
|
||||
puts("440GX Rev. A");
|
||||
break;
|
||||
|
||||
case PVR_440GX_RB:
|
||||
puts("440GX Rev. B");
|
||||
break;
|
||||
|
||||
case PVR_440GX_RC:
|
||||
puts("440GX Rev. C");
|
||||
break;
|
||||
|
||||
case PVR_440GX_RF:
|
||||
puts("440GX Rev. F");
|
||||
break;
|
||||
|
||||
case PVR_440EP_RA:
|
||||
puts("440EP Rev. A");
|
||||
break;
|
||||
|
||||
#ifdef CONFIG_440EP
|
||||
case PVR_440EP_RB: /* 440EP rev B and 440GR rev A have same PVR */
|
||||
puts("440EP Rev. B");
|
||||
break;
|
||||
|
||||
case PVR_440EP_RC: /* 440EP rev C and 440GR rev B have same PVR */
|
||||
puts("440EP Rev. C");
|
||||
break;
|
||||
#endif /* CONFIG_440EP */
|
||||
|
||||
#ifdef CONFIG_440GR
|
||||
case PVR_440GR_RA: /* 440EP rev B and 440GR rev A have same PVR */
|
||||
puts("440GR Rev. A");
|
||||
break;
|
||||
|
||||
case PVR_440GR_RB: /* 440EP rev C and 440GR rev B have same PVR */
|
||||
puts("440GR Rev. B");
|
||||
break;
|
||||
#endif /* CONFIG_440GR */
|
||||
|
||||
#ifdef CONFIG_440EPX
|
||||
case PVR_440EPX1_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
|
||||
puts("440EPx Rev. A");
|
||||
strcpy(addstr, "Security/Kasumi support");
|
||||
break;
|
||||
|
||||
case PVR_440EPX2_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
|
||||
puts("440EPx Rev. A");
|
||||
strcpy(addstr, "No Security/Kasumi support");
|
||||
break;
|
||||
#endif /* CONFIG_440EPX */
|
||||
|
||||
#ifdef CONFIG_440GRX
|
||||
case PVR_440GRX1_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
|
||||
puts("440GRx Rev. A");
|
||||
strcpy(addstr, "Security/Kasumi support");
|
||||
break;
|
||||
|
||||
case PVR_440GRX2_RA: /* 440EPx rev A and 440GRx rev A have same PVR */
|
||||
puts("440GRx Rev. A");
|
||||
strcpy(addstr, "No Security/Kasumi support");
|
||||
break;
|
||||
#endif /* CONFIG_440GRX */
|
||||
|
||||
case PVR_440SP_6_RAB:
|
||||
puts("440SP Rev. A/B");
|
||||
strcpy(addstr, "RAID 6 support");
|
||||
break;
|
||||
|
||||
case PVR_440SP_RAB:
|
||||
puts("440SP Rev. A/B");
|
||||
strcpy(addstr, "No RAID 6 support");
|
||||
break;
|
||||
|
||||
case PVR_440SP_6_RC:
|
||||
puts("440SP Rev. C");
|
||||
strcpy(addstr, "RAID 6 support");
|
||||
break;
|
||||
|
||||
case PVR_440SP_RC:
|
||||
puts("440SP Rev. C");
|
||||
strcpy(addstr, "No RAID 6 support");
|
||||
break;
|
||||
|
||||
case PVR_440SPe_6_RA:
|
||||
puts("440SPe Rev. A");
|
||||
strcpy(addstr, "RAID 6 support");
|
||||
break;
|
||||
|
||||
case PVR_440SPe_RA:
|
||||
puts("440SPe Rev. A");
|
||||
strcpy(addstr, "No RAID 6 support");
|
||||
break;
|
||||
|
||||
case PVR_440SPe_6_RB:
|
||||
puts("440SPe Rev. B");
|
||||
strcpy(addstr, "RAID 6 support");
|
||||
break;
|
||||
|
||||
case PVR_440SPe_RB:
|
||||
puts("440SPe Rev. B");
|
||||
strcpy(addstr, "No RAID 6 support");
|
||||
break;
|
||||
|
||||
#if defined(CONFIG_460EX) || defined(CONFIG_460GT)
|
||||
case PVR_460EX_RA:
|
||||
puts("460EX Rev. A");
|
||||
strcpy(addstr, "No Security/Kasumi support");
|
||||
break;
|
||||
|
||||
case PVR_460EX_SE_RA:
|
||||
puts("460EX Rev. A");
|
||||
strcpy(addstr, "Security/Kasumi support");
|
||||
break;
|
||||
|
||||
case PVR_460EX_RB:
|
||||
puts("460EX Rev. B");
|
||||
mfsdr(SDR0_ECID3, reg);
|
||||
if (reg & 0x00100000)
|
||||
strcpy(addstr, "No Security/Kasumi support");
|
||||
else
|
||||
strcpy(addstr, "Security/Kasumi support");
|
||||
break;
|
||||
|
||||
case PVR_460GT_RA:
|
||||
puts("460GT Rev. A");
|
||||
strcpy(addstr, "No Security/Kasumi support");
|
||||
break;
|
||||
|
||||
case PVR_460GT_SE_RA:
|
||||
puts("460GT Rev. A");
|
||||
strcpy(addstr, "Security/Kasumi support");
|
||||
break;
|
||||
|
||||
case PVR_460GT_RB:
|
||||
puts("460GT Rev. B");
|
||||
mfsdr(SDR0_ECID3, reg);
|
||||
if (reg & 0x00100000)
|
||||
strcpy(addstr, "No Security/Kasumi support");
|
||||
else
|
||||
strcpy(addstr, "Security/Kasumi support");
|
||||
break;
|
||||
#endif
|
||||
|
||||
case PVR_460SX_RA:
|
||||
puts("460SX Rev. A");
|
||||
strcpy(addstr, "Security support");
|
||||
break;
|
||||
|
||||
case PVR_460SX_RA_V1:
|
||||
puts("460SX Rev. A");
|
||||
strcpy(addstr, "No Security support");
|
||||
break;
|
||||
|
||||
case PVR_460GX_RA:
|
||||
puts("460GX Rev. A");
|
||||
strcpy(addstr, "Security support");
|
||||
break;
|
||||
|
||||
case PVR_460GX_RA_V1:
|
||||
puts("460GX Rev. A");
|
||||
strcpy(addstr, "No Security support");
|
||||
break;
|
||||
|
||||
case PVR_APM821XX_RA:
|
||||
puts("APM821XX Rev. A");
|
||||
strcpy(addstr, "Security support");
|
||||
break;
|
||||
|
||||
case PVR_VIRTEX5:
|
||||
puts("440x5 VIRTEX5");
|
||||
break;
|
||||
#endif /* CONFIG_440 */
|
||||
|
||||
default:
|
||||
printf (" UNKNOWN (PVR=%08x)", pvr);
|
||||
break;
|
||||
}
|
||||
|
||||
printf (" at %s MHz (PLB=%lu OPB=%lu EBC=%lu",
|
||||
strmhz(buf, clock),
|
||||
sys_info.freqPLB / 1000000,
|
||||
get_OPB_freq() / 1000000,
|
||||
sys_info.freqEBC / 1000000);
|
||||
#if defined(CONFIG_PCI) && \
|
||||
(defined(CONFIG_440EP) || defined(CONFIG_440EPX) || \
|
||||
defined(CONFIG_440GR) || defined(CONFIG_440GRX))
|
||||
printf(" PCI=%lu MHz", sys_info.freqPCI / 1000000);
|
||||
#endif
|
||||
printf(")\n");
|
||||
|
||||
if (addstr[0] != 0)
|
||||
printf(" %s\n", addstr);
|
||||
|
||||
#if defined(I2C_BOOTROM)
|
||||
printf (" I2C boot EEPROM %sabled\n", i2c_bootrom_enabled() ? "en" : "dis");
|
||||
#endif /* I2C_BOOTROM */
|
||||
#if defined(SDR0_PINSTP_SHIFT)
|
||||
printf (" Bootstrap Option %c - ", bootstrap_char[bootstrap_option()]);
|
||||
printf ("Boot ROM Location %s", bootstrap_str[bootstrap_option()]);
|
||||
putc('\n');
|
||||
#endif /* SDR0_PINSTP_SHIFT */
|
||||
|
||||
#if defined(CONFIG_PCI) && !defined(CONFIG_405EX)
|
||||
printf (" Internal PCI arbiter %sabled", pci_arbiter_enabled() ? "en" : "dis");
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_PCI) && defined(PCI_ASYNC)
|
||||
if (pci_async_enabled()) {
|
||||
printf (", PCI async ext clock used");
|
||||
} else {
|
||||
printf (", PCI sync clock at %lu MHz",
|
||||
sys_info.freqPLB / sys_info.pllPciDiv / 1000000);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_PCI) && !defined(CONFIG_405EX)
|
||||
putc('\n');
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_405EP) || defined(CONFIG_405EZ) || defined(CONFIG_405EX)
|
||||
printf(" 16 KiB I-Cache 16 KiB D-Cache");
|
||||
#elif defined(CONFIG_440)
|
||||
printf(" 32 KiB I-Cache 32 KiB D-Cache");
|
||||
#else
|
||||
printf(" 16 KiB I-Cache %d KiB D-Cache",
|
||||
((pvr | 0x00000001) == PVR_405GPR_RB) ? 16 : 8);
|
||||
#endif
|
||||
|
||||
#endif /* !defined(CONFIG_405) */
|
||||
|
||||
putc ('\n');
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ppc440spe_revB() {
|
||||
unsigned int pvr;
|
||||
|
||||
pvr = get_pvr();
|
||||
if ((pvr == PVR_440SPe_6_RB) || (pvr == PVR_440SPe_RB))
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||
{
|
||||
#if defined(CONFIG_BOARD_RESET)
|
||||
board_reset();
|
||||
#else
|
||||
#if defined(CONFIG_SYS_4xx_RESET_TYPE)
|
||||
mtspr(SPRN_DBCR0, CONFIG_SYS_4xx_RESET_TYPE << 28);
|
||||
#else
|
||||
/*
|
||||
* Initiate system reset in debug control register DBCR
|
||||
*/
|
||||
mtspr(SPRN_DBCR0, 0x30000000);
|
||||
#endif /* defined(CONFIG_SYS_4xx_RESET_TYPE) */
|
||||
#endif /* defined(CONFIG_BOARD_RESET) */
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Get timebase clock frequency
|
||||
*/
|
||||
unsigned long get_tbclk (void)
|
||||
{
|
||||
sys_info_t sys_info;
|
||||
|
||||
get_sys_info(&sys_info);
|
||||
return (sys_info.freqProcessor);
|
||||
}
|
||||
|
||||
|
||||
#if defined(CONFIG_WATCHDOG)
|
||||
void watchdog_reset(void)
|
||||
{
|
||||
int re_enable = disable_interrupts();
|
||||
reset_4xx_watchdog();
|
||||
if (re_enable) enable_interrupts();
|
||||
}
|
||||
|
||||
void reset_4xx_watchdog(void)
|
||||
{
|
||||
/*
|
||||
* Clear TSR(WIS) bit
|
||||
*/
|
||||
mtspr(SPRN_TSR, 0x40000000);
|
||||
}
|
||||
#endif /* CONFIG_WATCHDOG */
|
||||
|
||||
/*
|
||||
* Initializes on-chip ethernet controllers.
|
||||
* to override, implement board_eth_init()
|
||||
*/
|
||||
int cpu_eth_init(bd_t *bis)
|
||||
{
|
||||
#if defined(CONFIG_PPC4xx_EMAC)
|
||||
ppc_4xx_eth_initialize(bis);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
@@ -1,541 +0,0 @@
|
||||
/*
|
||||
* (C) Copyright 2000-2007
|
||||
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <watchdog.h>
|
||||
#include <asm/ppc4xx-emac.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/ppc4xx-gpio.h>
|
||||
#include <asm/ppc4xx.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
#ifndef CONFIG_SYS_PLL_RECONFIG
|
||||
#define CONFIG_SYS_PLL_RECONFIG 0
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_440EPX) || \
|
||||
defined(CONFIG_460EX) || defined(CONFIG_460GT)
|
||||
static void reset_with_rli(void)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
/*
|
||||
* Set reload inhibit so configuration will persist across
|
||||
* processor resets
|
||||
*/
|
||||
mfcpr(CPR0_ICFG, reg);
|
||||
reg |= CPR0_ICFG_RLI_MASK;
|
||||
mtcpr(CPR0_ICFG, reg);
|
||||
|
||||
/* Reset processor if configuration changed */
|
||||
__asm__ __volatile__ ("sync; isync");
|
||||
mtspr(SPRN_DBCR0, 0x20000000);
|
||||
}
|
||||
#endif
|
||||
|
||||
void reconfigure_pll(u32 new_cpu_freq)
|
||||
{
|
||||
#if defined(CONFIG_440EPX)
|
||||
int reset_needed = 0;
|
||||
u32 reg, temp;
|
||||
u32 prbdv0, target_prbdv0, /* CLK_PRIMBD */
|
||||
fwdva, target_fwdva, fwdvb, target_fwdvb, /* CLK_PLLD */
|
||||
fbdv, target_fbdv, lfbdv, target_lfbdv,
|
||||
perdv0, target_perdv0, /* CLK_PERD */
|
||||
spcid0, target_spcid0; /* CLK_SPCID */
|
||||
|
||||
/* Reconfigure clocks if necessary.
|
||||
* See PPC440EPx User's Manual, sections 8.2 and 14 */
|
||||
if (new_cpu_freq == 667) {
|
||||
target_prbdv0 = 2;
|
||||
target_fwdva = 2;
|
||||
target_fwdvb = 4;
|
||||
target_fbdv = 20;
|
||||
target_lfbdv = 1;
|
||||
target_perdv0 = 4;
|
||||
target_spcid0 = 4;
|
||||
|
||||
mfcpr(CPR0_PRIMBD0, reg);
|
||||
temp = (reg & PRBDV_MASK) >> 24;
|
||||
prbdv0 = temp ? temp : 8;
|
||||
if (prbdv0 != target_prbdv0) {
|
||||
reg &= ~PRBDV_MASK;
|
||||
reg |= ((target_prbdv0 == 8 ? 0 : target_prbdv0) << 24);
|
||||
mtcpr(CPR0_PRIMBD0, reg);
|
||||
reset_needed = 1;
|
||||
}
|
||||
|
||||
mfcpr(CPR0_PLLD, reg);
|
||||
|
||||
temp = (reg & PLLD_FWDVA_MASK) >> 16;
|
||||
fwdva = temp ? temp : 16;
|
||||
|
||||
temp = (reg & PLLD_FWDVB_MASK) >> 8;
|
||||
fwdvb = temp ? temp : 8;
|
||||
|
||||
temp = (reg & PLLD_FBDV_MASK) >> 24;
|
||||
fbdv = temp ? temp : 32;
|
||||
|
||||
temp = (reg & PLLD_LFBDV_MASK);
|
||||
lfbdv = temp ? temp : 64;
|
||||
|
||||
if (fwdva != target_fwdva || fbdv != target_fbdv || lfbdv != target_lfbdv) {
|
||||
reg &= ~(PLLD_FWDVA_MASK | PLLD_FWDVB_MASK |
|
||||
PLLD_FBDV_MASK | PLLD_LFBDV_MASK);
|
||||
reg |= ((target_fwdva == 16 ? 0 : target_fwdva) << 16) |
|
||||
((target_fwdvb == 8 ? 0 : target_fwdvb) << 8) |
|
||||
((target_fbdv == 32 ? 0 : target_fbdv) << 24) |
|
||||
(target_lfbdv == 64 ? 0 : target_lfbdv);
|
||||
mtcpr(CPR0_PLLD, reg);
|
||||
reset_needed = 1;
|
||||
}
|
||||
|
||||
mfcpr(CPR0_PERD, reg);
|
||||
perdv0 = (reg & CPR0_PERD_PERDV0_MASK) >> 24;
|
||||
if (perdv0 != target_perdv0) {
|
||||
reg &= ~CPR0_PERD_PERDV0_MASK;
|
||||
reg |= (target_perdv0 << 24);
|
||||
mtcpr(CPR0_PERD, reg);
|
||||
reset_needed = 1;
|
||||
}
|
||||
|
||||
mfcpr(CPR0_SPCID, reg);
|
||||
temp = (reg & CPR0_SPCID_SPCIDV0_MASK) >> 24;
|
||||
spcid0 = temp ? temp : 4;
|
||||
if (spcid0 != target_spcid0) {
|
||||
reg &= ~CPR0_SPCID_SPCIDV0_MASK;
|
||||
reg |= ((target_spcid0 == 4 ? 0 : target_spcid0) << 24);
|
||||
mtcpr(CPR0_SPCID, reg);
|
||||
reset_needed = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* Get current value of FWDVA.*/
|
||||
mfcpr(CPR0_PLLD, reg);
|
||||
temp = (reg & PLLD_FWDVA_MASK) >> 16;
|
||||
|
||||
/*
|
||||
* Check to see if FWDVA has been set to value of 1. if it has we must
|
||||
* modify it.
|
||||
*/
|
||||
if (temp == 1) {
|
||||
/*
|
||||
* Load register that contains current boot strapping option.
|
||||
*/
|
||||
mfcpr(CPR0_ICFG, reg);
|
||||
/*
|
||||
* Strapping option bits (ICS) are already in correct position,
|
||||
* only masking needed.
|
||||
*/
|
||||
reg &= CPR0_ICFG_ICS_MASK;
|
||||
|
||||
if ((reg == BOOT_STRAP_OPTION_A) || (reg == BOOT_STRAP_OPTION_B) ||
|
||||
(reg == BOOT_STRAP_OPTION_D) || (reg == BOOT_STRAP_OPTION_E)) {
|
||||
mfcpr(CPR0_PLLD, reg);
|
||||
|
||||
/* Get current value of fbdv. */
|
||||
temp = (reg & PLLD_FBDV_MASK) >> 24;
|
||||
fbdv = temp ? temp : 32;
|
||||
|
||||
/* Get current value of lfbdv. */
|
||||
temp = (reg & PLLD_LFBDV_MASK);
|
||||
lfbdv = temp ? temp : 64;
|
||||
|
||||
/*
|
||||
* Get current value of FWDVA. Assign current FWDVA to
|
||||
* new FWDVB.
|
||||
*/
|
||||
mfcpr(CPR0_PLLD, reg);
|
||||
target_fwdvb = (reg & PLLD_FWDVA_MASK) >> 16;
|
||||
fwdvb = target_fwdvb ? target_fwdvb : 8;
|
||||
|
||||
/*
|
||||
* Get current value of FWDVB. Assign current FWDVB to
|
||||
* new FWDVA.
|
||||
*/
|
||||
target_fwdva = (reg & PLLD_FWDVB_MASK) >> 8;
|
||||
fwdva = target_fwdva ? target_fwdva : 16;
|
||||
|
||||
/*
|
||||
* Update CPR0_PLLD with switched FWDVA and FWDVB.
|
||||
*/
|
||||
reg &= ~(PLLD_FWDVA_MASK | PLLD_FWDVB_MASK |
|
||||
PLLD_FBDV_MASK | PLLD_LFBDV_MASK);
|
||||
reg |= ((fwdva == 16 ? 0 : fwdva) << 16) |
|
||||
((fwdvb == 8 ? 0 : fwdvb) << 8) |
|
||||
((fbdv == 32 ? 0 : fbdv) << 24) |
|
||||
(lfbdv == 64 ? 0 : lfbdv);
|
||||
mtcpr(CPR0_PLLD, reg);
|
||||
|
||||
/* Acknowledge that a reset is required. */
|
||||
reset_needed = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* Now reset the CPU if needed */
|
||||
if (reset_needed)
|
||||
reset_with_rli();
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_460EX) || defined(CONFIG_460GT)
|
||||
u32 reg;
|
||||
|
||||
/*
|
||||
* See "9.2.1.1 Booting with Option E" in the 460EX/GT
|
||||
* users manual
|
||||
*/
|
||||
mfcpr(CPR0_PLLC, reg);
|
||||
if ((reg & (CPR0_PLLC_RST | CPR0_PLLC_ENG)) == CPR0_PLLC_RST) {
|
||||
/*
|
||||
* Set engage bit
|
||||
*/
|
||||
reg = (reg & ~CPR0_PLLC_RST) | CPR0_PLLC_ENG;
|
||||
mtcpr(CPR0_PLLC, reg);
|
||||
|
||||
/* Now reset the CPU */
|
||||
reset_with_rli();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SYS_4xx_CHIP_21_ERRATA
|
||||
void
|
||||
chip_21_errata(void)
|
||||
{
|
||||
/*
|
||||
* See rev 1.09 of the 405EX/405EXr errata. CHIP_21 says that
|
||||
* sometimes reading the PVR and/or SDR0_ECID results in incorrect
|
||||
* values. Since the rev-D chip uses the SDR0_ECID bits to control
|
||||
* internal features, that means the second PCIe or ethernet of an EX
|
||||
* variant could fail to work. Also, security features of both EX and
|
||||
* EXr might be incorrectly disabled.
|
||||
*
|
||||
* The suggested workaround is as follows (covering rev-C and rev-D):
|
||||
*
|
||||
* 1.Read the PVR and SDR0_ECID3.
|
||||
*
|
||||
* 2.If the PVR matches an expected Revision C PVR value AND if
|
||||
* SDR0_ECID3[12:15] is different from PVR[28:31], then processor is
|
||||
* Revision C: continue executing the initialization code (no reset
|
||||
* required). else go to step 3.
|
||||
*
|
||||
* 3.If the PVR matches an expected Revision D PVR value AND if
|
||||
* SDR0_ECID3[10:11] matches its expected value, then continue
|
||||
* executing initialization code, no reset required. else write
|
||||
* DBCR0[RST] = 0b11 to generate a SysReset.
|
||||
*/
|
||||
|
||||
u32 pvr;
|
||||
u32 pvr_28_31;
|
||||
u32 ecid3;
|
||||
u32 ecid3_10_11;
|
||||
u32 ecid3_12_15;
|
||||
|
||||
/* Step 1: */
|
||||
pvr = get_pvr();
|
||||
mfsdr(SDR0_ECID3, ecid3);
|
||||
|
||||
/* Step 2: */
|
||||
pvr_28_31 = pvr & 0xf;
|
||||
ecid3_10_11 = (ecid3 >> 20) & 0x3;
|
||||
ecid3_12_15 = (ecid3 >> 16) & 0xf;
|
||||
if ((pvr == CONFIG_405EX_CHIP21_PVR_REV_C) &&
|
||||
(pvr_28_31 != ecid3_12_15)) {
|
||||
/* No reset required. */
|
||||
return;
|
||||
}
|
||||
|
||||
/* Step 3: */
|
||||
if ((pvr == CONFIG_405EX_CHIP21_PVR_REV_D) &&
|
||||
(ecid3_10_11 == CONFIG_405EX_CHIP21_ECID3_REV_D)) {
|
||||
/* No reset required. */
|
||||
return;
|
||||
}
|
||||
|
||||
/* Reset required. */
|
||||
__asm__ __volatile__ ("sync; isync");
|
||||
mtspr(SPRN_DBCR0, 0x30000000);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Breath some life into the CPU...
|
||||
*
|
||||
* Reconfigure PLL if necessary,
|
||||
* set up the memory map,
|
||||
* initialize a bunch of registers
|
||||
*/
|
||||
void
|
||||
cpu_init_f (void)
|
||||
{
|
||||
#if defined(CONFIG_WATCHDOG) || defined(CONFIG_440GX) || defined(CONFIG_460EX)
|
||||
u32 val;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SYS_4xx_CHIP_21_ERRATA
|
||||
chip_21_errata();
|
||||
#endif
|
||||
|
||||
reconfigure_pll(CONFIG_SYS_PLL_RECONFIG);
|
||||
|
||||
#if (defined(CONFIG_405EP) || defined (CONFIG_405EX)) && \
|
||||
!defined(CONFIG_SYS_4xx_GPIO_TABLE)
|
||||
/*
|
||||
* GPIO0 setup (select GPIO or alternate function)
|
||||
*/
|
||||
#if defined(CONFIG_SYS_GPIO0_OR)
|
||||
out32(GPIO0_OR, CONFIG_SYS_GPIO0_OR); /* set initial state of output pins */
|
||||
#endif
|
||||
#if defined(CONFIG_SYS_GPIO0_ODR)
|
||||
out32(GPIO0_ODR, CONFIG_SYS_GPIO0_ODR); /* open-drain select */
|
||||
#endif
|
||||
out32(GPIO0_OSRH, CONFIG_SYS_GPIO0_OSRH); /* output select */
|
||||
out32(GPIO0_OSRL, CONFIG_SYS_GPIO0_OSRL);
|
||||
out32(GPIO0_ISR1H, CONFIG_SYS_GPIO0_ISR1H); /* input select */
|
||||
out32(GPIO0_ISR1L, CONFIG_SYS_GPIO0_ISR1L);
|
||||
out32(GPIO0_TSRH, CONFIG_SYS_GPIO0_TSRH); /* three-state select */
|
||||
out32(GPIO0_TSRL, CONFIG_SYS_GPIO0_TSRL);
|
||||
#if defined(CONFIG_SYS_GPIO0_ISR2H)
|
||||
out32(GPIO0_ISR2H, CONFIG_SYS_GPIO0_ISR2H);
|
||||
out32(GPIO0_ISR2L, CONFIG_SYS_GPIO0_ISR2L);
|
||||
#endif
|
||||
#if defined (CONFIG_SYS_GPIO0_TCR)
|
||||
out32(GPIO0_TCR, CONFIG_SYS_GPIO0_TCR); /* enable output driver for outputs */
|
||||
#endif
|
||||
#endif /* CONFIG_405EP ... && !CONFIG_SYS_4xx_GPIO_TABLE */
|
||||
|
||||
#if defined (CONFIG_405EP)
|
||||
/*
|
||||
* Set EMAC noise filter bits
|
||||
*/
|
||||
mtdcr(CPC0_EPCTL, CPC0_EPCTL_E0NFE | CPC0_EPCTL_E1NFE);
|
||||
#endif /* CONFIG_405EP */
|
||||
|
||||
#if defined(CONFIG_SYS_4xx_GPIO_TABLE)
|
||||
gpio_set_chip_configuration();
|
||||
#endif /* CONFIG_SYS_4xx_GPIO_TABLE */
|
||||
|
||||
/*
|
||||
* External Bus Controller (EBC) Setup
|
||||
*/
|
||||
#if (defined(CONFIG_SYS_EBC_PB0AP) && defined(CONFIG_SYS_EBC_PB0CR))
|
||||
#if (defined(CONFIG_405GP) || \
|
||||
defined(CONFIG_405EP) || defined(CONFIG_405EZ) || \
|
||||
defined(CONFIG_405EX) || defined(CONFIG_405))
|
||||
/*
|
||||
* Move the next instructions into icache, since these modify the flash
|
||||
* we are running from!
|
||||
*/
|
||||
asm volatile(" bl 0f" ::: "lr");
|
||||
asm volatile("0: mflr 3" ::: "r3");
|
||||
asm volatile(" addi 4, 0, 14" ::: "r4");
|
||||
asm volatile(" mtctr 4" ::: "ctr");
|
||||
asm volatile("1: icbt 0, 3");
|
||||
asm volatile(" addi 3, 3, 32" ::: "r3");
|
||||
asm volatile(" bdnz 1b" ::: "ctr", "cr0");
|
||||
asm volatile(" addis 3, 0, 0x0" ::: "r3");
|
||||
asm volatile(" ori 3, 3, 0xA000" ::: "r3");
|
||||
asm volatile(" mtctr 3" ::: "ctr");
|
||||
asm volatile("2: bdnz 2b" ::: "ctr", "cr0");
|
||||
#endif
|
||||
|
||||
mtebc(PB0AP, CONFIG_SYS_EBC_PB0AP);
|
||||
mtebc(PB0CR, CONFIG_SYS_EBC_PB0CR);
|
||||
#endif
|
||||
|
||||
#if (defined(CONFIG_SYS_EBC_PB1AP) && defined(CONFIG_SYS_EBC_PB1CR) && !(CONFIG_SYS_INIT_DCACHE_CS == 1))
|
||||
mtebc(PB1AP, CONFIG_SYS_EBC_PB1AP);
|
||||
mtebc(PB1CR, CONFIG_SYS_EBC_PB1CR);
|
||||
#endif
|
||||
|
||||
#if (defined(CONFIG_SYS_EBC_PB2AP) && defined(CONFIG_SYS_EBC_PB2CR) && !(CONFIG_SYS_INIT_DCACHE_CS == 2))
|
||||
mtebc(PB2AP, CONFIG_SYS_EBC_PB2AP);
|
||||
mtebc(PB2CR, CONFIG_SYS_EBC_PB2CR);
|
||||
#endif
|
||||
|
||||
#if (defined(CONFIG_SYS_EBC_PB3AP) && defined(CONFIG_SYS_EBC_PB3CR) && !(CONFIG_SYS_INIT_DCACHE_CS == 3))
|
||||
mtebc(PB3AP, CONFIG_SYS_EBC_PB3AP);
|
||||
mtebc(PB3CR, CONFIG_SYS_EBC_PB3CR);
|
||||
#endif
|
||||
|
||||
#if (defined(CONFIG_SYS_EBC_PB4AP) && defined(CONFIG_SYS_EBC_PB4CR) && !(CONFIG_SYS_INIT_DCACHE_CS == 4))
|
||||
mtebc(PB4AP, CONFIG_SYS_EBC_PB4AP);
|
||||
mtebc(PB4CR, CONFIG_SYS_EBC_PB4CR);
|
||||
#endif
|
||||
|
||||
#if (defined(CONFIG_SYS_EBC_PB5AP) && defined(CONFIG_SYS_EBC_PB5CR) && !(CONFIG_SYS_INIT_DCACHE_CS == 5))
|
||||
mtebc(PB5AP, CONFIG_SYS_EBC_PB5AP);
|
||||
mtebc(PB5CR, CONFIG_SYS_EBC_PB5CR);
|
||||
#endif
|
||||
|
||||
#if (defined(CONFIG_SYS_EBC_PB6AP) && defined(CONFIG_SYS_EBC_PB6CR) && !(CONFIG_SYS_INIT_DCACHE_CS == 6))
|
||||
mtebc(PB6AP, CONFIG_SYS_EBC_PB6AP);
|
||||
mtebc(PB6CR, CONFIG_SYS_EBC_PB6CR);
|
||||
#endif
|
||||
|
||||
#if (defined(CONFIG_SYS_EBC_PB7AP) && defined(CONFIG_SYS_EBC_PB7CR) && !(CONFIG_SYS_INIT_DCACHE_CS == 7))
|
||||
mtebc(PB7AP, CONFIG_SYS_EBC_PB7AP);
|
||||
mtebc(PB7CR, CONFIG_SYS_EBC_PB7CR);
|
||||
#endif
|
||||
|
||||
#if defined (CONFIG_SYS_EBC_CFG)
|
||||
mtebc(EBC0_CFG, CONFIG_SYS_EBC_CFG);
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_WATCHDOG)
|
||||
val = mfspr(SPRN_TCR);
|
||||
#if defined(CONFIG_440EP) || defined(CONFIG_440GR)
|
||||
val |= 0xb8000000; /* generate system reset after 1.34 seconds */
|
||||
#elif defined(CONFIG_440EPX)
|
||||
val |= 0xb0000000; /* generate system reset after 1.34 seconds */
|
||||
#else
|
||||
val |= 0xf0000000; /* generate system reset after 2.684 seconds */
|
||||
#endif
|
||||
#if defined(CONFIG_SYS_4xx_RESET_TYPE)
|
||||
val &= ~0x30000000; /* clear WRC bits */
|
||||
val |= CONFIG_SYS_4xx_RESET_TYPE << 28; /* set board specific WRC type */
|
||||
#endif
|
||||
mtspr(SPRN_TCR, val);
|
||||
|
||||
val = mfspr(SPRN_TSR);
|
||||
val |= 0x80000000; /* enable watchdog timer */
|
||||
mtspr(SPRN_TSR, val);
|
||||
|
||||
reset_4xx_watchdog();
|
||||
#endif /* CONFIG_WATCHDOG */
|
||||
|
||||
#if defined(CONFIG_440GX)
|
||||
/* Take the GX out of compatibility mode
|
||||
* Travis Sawyer, 9 Mar 2004
|
||||
* NOTE: 440gx user manual inconsistency here
|
||||
* Compatibility mode and Ethernet Clock select are not
|
||||
* correct in the manual
|
||||
*/
|
||||
mfsdr(SDR0_MFR, val);
|
||||
val &= ~0x10000000;
|
||||
mtsdr(SDR0_MFR,val);
|
||||
#endif /* CONFIG_440GX */
|
||||
|
||||
#if defined(CONFIG_460EX)
|
||||
/*
|
||||
* Set SDR0_AHB_CFG[A2P_INCR4] (bit 24) and
|
||||
* clear SDR0_AHB_CFG[A2P_PROT2] (bit 25) for a new 460EX errata
|
||||
* regarding concurrent use of AHB USB OTG, USB 2.0 host and SATA
|
||||
*/
|
||||
mfsdr(SDR0_AHB_CFG, val);
|
||||
val |= 0x80;
|
||||
val &= ~0x40;
|
||||
mtsdr(SDR0_AHB_CFG, val);
|
||||
mfsdr(SDR0_USB2HOST_CFG, val);
|
||||
val &= ~0xf00;
|
||||
val |= 0x400;
|
||||
mtsdr(SDR0_USB2HOST_CFG, val);
|
||||
#endif /* CONFIG_460EX */
|
||||
|
||||
#if defined(CONFIG_405EX) || \
|
||||
defined(CONFIG_440SP) || defined(CONFIG_440SPE) || \
|
||||
defined(CONFIG_460EX) || defined(CONFIG_460GT) || \
|
||||
defined(CONFIG_460SX)
|
||||
/*
|
||||
* Set PLB4 arbiter (Segment 0 and 1) to 4 deep pipeline read
|
||||
*/
|
||||
mtdcr(PLB4A0_ACR, (mfdcr(PLB4A0_ACR) & ~PLB4Ax_ACR_RDP_MASK) |
|
||||
PLB4Ax_ACR_RDP_4DEEP);
|
||||
mtdcr(PLB4A1_ACR, (mfdcr(PLB4A1_ACR) & ~PLB4Ax_ACR_RDP_MASK) |
|
||||
PLB4Ax_ACR_RDP_4DEEP);
|
||||
#endif /* CONFIG_440SP/SPE || CONFIG_460EX/GT || CONFIG_405EX */
|
||||
}
|
||||
|
||||
/*
|
||||
* initialize higher level parts of CPU like time base and timers
|
||||
*/
|
||||
int cpu_init_r (void)
|
||||
{
|
||||
#if defined(CONFIG_405GP)
|
||||
uint pvr = get_pvr();
|
||||
|
||||
/*
|
||||
* Set edge conditioning circuitry on PPC405GPr
|
||||
* for compatibility to existing PPC405GP designs.
|
||||
*/
|
||||
if ((pvr & 0xfffffff0) == (PVR_405GPR_RB & 0xfffffff0)) {
|
||||
mtdcr(CPC0_ECR, 0x60606000);
|
||||
}
|
||||
#endif /* defined(CONFIG_405GP) */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_PCI) && \
|
||||
(defined(CONFIG_440EP) || defined(CONFIG_440EPX) || \
|
||||
defined(CONFIG_440GR) || defined(CONFIG_440GRX))
|
||||
/*
|
||||
* 440EP(x)/GR(x) PCI async/sync clocking restriction:
|
||||
*
|
||||
* In asynchronous PCI mode, the synchronous PCI clock must meet
|
||||
* certain requirements. The following equation describes the
|
||||
* relationship that must be maintained between the asynchronous PCI
|
||||
* clock and synchronous PCI clock. Select an appropriate PCI:PLB
|
||||
* ratio to maintain the relationship:
|
||||
*
|
||||
* AsyncPCIClk - 1MHz <= SyncPCIclock <= (2 * AsyncPCIClk) - 1MHz
|
||||
*/
|
||||
static int ppc4xx_pci_sync_clock_ok(u32 sync, u32 async)
|
||||
{
|
||||
if (((async - 1000000) > sync) || (sync > ((2 * async) - 1000000)))
|
||||
return 0;
|
||||
else
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ppc4xx_pci_sync_clock_config(u32 async)
|
||||
{
|
||||
sys_info_t sys_info;
|
||||
u32 sync;
|
||||
int div;
|
||||
u32 reg;
|
||||
u32 spcid_val[] = {
|
||||
CPR0_SPCID_SPCIDV0_DIV1, CPR0_SPCID_SPCIDV0_DIV2,
|
||||
CPR0_SPCID_SPCIDV0_DIV3, CPR0_SPCID_SPCIDV0_DIV4 };
|
||||
|
||||
get_sys_info(&sys_info);
|
||||
sync = sys_info.freqPCI;
|
||||
|
||||
/*
|
||||
* First check if the equation above is met
|
||||
*/
|
||||
if (!ppc4xx_pci_sync_clock_ok(sync, async)) {
|
||||
/*
|
||||
* Reconfigure PCI sync clock to meet the equation.
|
||||
* Start with highest possible PCI sync frequency
|
||||
* (divider 1).
|
||||
*/
|
||||
for (div = 1; div <= 4; div++) {
|
||||
sync = sys_info.freqPLB / div;
|
||||
if (ppc4xx_pci_sync_clock_ok(sync, async))
|
||||
break;
|
||||
}
|
||||
|
||||
if (div <= 4) {
|
||||
mtcpr(CPR0_SPCID, spcid_val[div]);
|
||||
|
||||
mfcpr(CPR0_ICFG, reg);
|
||||
reg |= CPR0_ICFG_RLI_MASK;
|
||||
mtcpr(CPR0_ICFG, reg);
|
||||
|
||||
/* do chip reset */
|
||||
mtspr(SPRN_DBCR0, 0x20000000);
|
||||
} else {
|
||||
/* Impossible to configure the PCI sync clock */
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
@@ -1,180 +0,0 @@
|
||||
/*
|
||||
* (C) Copyright 2001
|
||||
* Erik Theisen, Wave 7 Optics, etheisen@mindspring.com
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
#include <config.h>
|
||||
|
||||
#if defined(CONFIG_4xx) && defined(CONFIG_CMD_SETGETDCR)
|
||||
|
||||
#include <asm/ppc4xx.h>
|
||||
|
||||
#include <ppc_asm.tmpl>
|
||||
#include <ppc_defs.h>
|
||||
|
||||
#include <asm/cache.h>
|
||||
#include <asm/mmu.h>
|
||||
|
||||
#define _ASMLANGUAGE
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* XXX - DANGER
|
||||
* These routines make use of self modifying code. DO NOT CALL THEM
|
||||
* UNTIL THEY ARE RELOCATED TO RAM. Additionally, I do not
|
||||
* recommend them for use in anything other than an interactive
|
||||
* debugging environment. This is mainly due to performance reasons.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/*
|
||||
* static void _create_MFDCR(unsigned short dcrn)
|
||||
*
|
||||
* Builds a 'mfdcr' instruction for get_dcr
|
||||
* function.
|
||||
*/
|
||||
.section ".text"
|
||||
.align 2
|
||||
.type _create_MFDCR,@function
|
||||
_create_MFDCR:
|
||||
/*
|
||||
* Build up a 'mfdcr' instruction formatted as follows:
|
||||
*
|
||||
* OPCD | RT | DCRF | XO | CR |
|
||||
* ---------------|--------------|--------------|----|
|
||||
* 0 5 | 6 10 | 11 20 | 21 30 | 31 |
|
||||
* | | DCRN | | |
|
||||
* 31 | %r3 | (5..9|0..4) | 323 | 0 |
|
||||
*
|
||||
* Where:
|
||||
* OPCD = opcode - 31
|
||||
* RT = destination register - %r3 return register
|
||||
* DCRF = DCRN # with upper and lower halves swapped
|
||||
* XO = extended opcode - 323
|
||||
* CR = CR[CR0] NOT undefined - 0
|
||||
*/
|
||||
rlwinm r0, r3, 27, 27, 31 /* OPCD = 31 */
|
||||
rlwinm r3, r3, 5, 22, 26
|
||||
or r3, r3, r0
|
||||
slwi r3, r3, 10
|
||||
oris r3, r3, 0x3e30 /* RT = %r3 */
|
||||
ori r3, r3, 323 /* XO = 323 */
|
||||
slwi r3, r3, 1 /* CR = 0 */
|
||||
|
||||
mflr r4
|
||||
stw r3, 0(r4) /* Store instr in get_dcr() */
|
||||
dcbst r0, r4 /* Make sure val is written out */
|
||||
sync /* Wait for write to complete */
|
||||
icbi r0, r4 /* Make sure old instr is dumped */
|
||||
isync /* Wait for icbi to complete */
|
||||
|
||||
blr
|
||||
.Lfe1: .size _create_MFDCR,.Lfe1-_create_MFDCR
|
||||
/* end _create_MFDCR() */
|
||||
|
||||
/*
|
||||
* static void _create_MTDCR(unsigned short dcrn, unsigned long value)
|
||||
*
|
||||
* Builds a 'mtdcr' instruction for set_dcr
|
||||
* function.
|
||||
*/
|
||||
.section ".text"
|
||||
.align 2
|
||||
.type _create_MTDCR,@function
|
||||
_create_MTDCR:
|
||||
/*
|
||||
* Build up a 'mtdcr' instruction formatted as follows:
|
||||
*
|
||||
* OPCD | RS | DCRF | XO | CR |
|
||||
* ---------------|--------------|--------------|----|
|
||||
* 0 5 | 6 10 | 11 20 | 21 30 | 31 |
|
||||
* | | DCRN | | |
|
||||
* 31 | %r3 | (5..9|0..4) | 451 | 0 |
|
||||
*
|
||||
* Where:
|
||||
* OPCD = opcode - 31
|
||||
* RS = source register - %r4
|
||||
* DCRF = dest. DCRN # with upper and lower halves swapped
|
||||
* XO = extended opcode - 451
|
||||
* CR = CR[CR0] NOT undefined - 0
|
||||
*/
|
||||
rlwinm r0, r3, 27, 27, 31 /* OPCD = 31 */
|
||||
rlwinm r3, r3, 5, 22, 26
|
||||
or r3, r3, r0
|
||||
slwi r3, r3, 10
|
||||
oris r3, r3, 0x3e40 /* RS = %r4 */
|
||||
ori r3, r3, 451 /* XO = 451 */
|
||||
slwi r3, r3, 1 /* CR = 0 */
|
||||
|
||||
mflr r5
|
||||
stw r3, 0(r5) /* Store instr in set_dcr() */
|
||||
dcbst r0, r5 /* Make sure val is written out */
|
||||
sync /* Wait for write to complete */
|
||||
icbi r0, r5 /* Make sure old instr is dumped */
|
||||
isync /* Wait for icbi to complete */
|
||||
|
||||
blr
|
||||
.Lfe2: .size _create_MTDCR,.Lfe2-_create_MTDCR
|
||||
/* end _create_MTDCR() */
|
||||
|
||||
|
||||
/*
|
||||
* unsigned long get_dcr(unsigned short dcrn)
|
||||
*
|
||||
* Return a given DCR's value.
|
||||
*/
|
||||
/* */
|
||||
/* XXX - This is self modifying code, hence */
|
||||
/* it is in the data section. */
|
||||
/* */
|
||||
.section ".data"
|
||||
.align 2
|
||||
.globl get_dcr
|
||||
.type get_dcr,@function
|
||||
get_dcr:
|
||||
mflr r0 /* Get link register */
|
||||
stwu r1, -32(r1) /* Save back chain and move SP */
|
||||
stw r0, +36(r1) /* Save link register */
|
||||
|
||||
bl _create_MFDCR /* Build following instruction */
|
||||
/* XXX - we build this instuction up on the fly. */
|
||||
.long 0 /* Get DCR's value */
|
||||
|
||||
lwz r0, +36(r1) /* Get saved link register */
|
||||
mtlr r0 /* Restore link register */
|
||||
addi r1, r1, +32 /* Remove frame from stack */
|
||||
blr /* Return to calling function */
|
||||
.Lfe3: .size get_dcr,.Lfe3-get_dcr
|
||||
/* end get_dcr() */
|
||||
|
||||
|
||||
/*
|
||||
* unsigned void set_dcr(unsigned short dcrn, unsigned long value)
|
||||
*
|
||||
* Return a given DCR's value.
|
||||
*/
|
||||
/*
|
||||
* XXX - This is self modifying code, hence
|
||||
* it is in the data section.
|
||||
*/
|
||||
.section ".data"
|
||||
.align 2
|
||||
.globl set_dcr
|
||||
.type set_dcr,@function
|
||||
set_dcr:
|
||||
mflr r0 /* Get link register */
|
||||
stwu r1, -32(r1) /* Save back chain and move SP */
|
||||
stw r0, +36(r1) /* Save link register */
|
||||
|
||||
bl _create_MTDCR /* Build following instruction */
|
||||
/* XXX - we build this instuction up on the fly. */
|
||||
.long 0 /* Set DCR's value */
|
||||
|
||||
lwz r0, +36(r1) /* Get saved link register */
|
||||
mtlr r0 /* Restore link register */
|
||||
addi r1, r1, +32 /* Remove frame from stack */
|
||||
blr /* Return to calling function */
|
||||
.Lfe4: .size set_dcr,.Lfe4-set_dcr
|
||||
/* end set_dcr() */
|
||||
#endif
|
||||
@@ -1,376 +0,0 @@
|
||||
/*
|
||||
* arch/powerpc/cpu/ppc4xx/denali_data_eye.c
|
||||
* Extracted from board/amcc/sequoia/sdram.c by Larry Johnson <lrj@acm.org>.
|
||||
*
|
||||
* (C) Copyright 2006
|
||||
* Sylvie Gohl, AMCC/IBM, gohl.sylvie@fr.ibm.com
|
||||
* Jacqueline Pira-Ferriol, AMCC/IBM, jpira-ferriol@fr.ibm.com
|
||||
* Thierry Roman, AMCC/IBM, thierry_roman@fr.ibm.com
|
||||
* Alain Saurel, AMCC/IBM, alain.saurel@fr.ibm.com
|
||||
* Robert Snyder, AMCC/IBM, rob.snyder@fr.ibm.com
|
||||
*
|
||||
* (C) Copyright 2006-2007
|
||||
* Stefan Roese, DENX Software Engineering, sr@denx.de.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
/* define DEBUG for debugging output (obviously ;-)) */
|
||||
#if 0
|
||||
#define DEBUG
|
||||
#endif
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/ppc4xx.h>
|
||||
|
||||
#if defined(CONFIG_440EPX) || defined(CONFIG_440GRX)
|
||||
/*-----------------------------------------------------------------------------+
|
||||
* denali_wait_for_dlllock.
|
||||
+----------------------------------------------------------------------------*/
|
||||
int denali_wait_for_dlllock(void)
|
||||
{
|
||||
u32 val;
|
||||
int wait;
|
||||
|
||||
/* -----------------------------------------------------------+
|
||||
* Wait for the DCC master delay line to finish calibration
|
||||
* ----------------------------------------------------------*/
|
||||
for (wait = 0; wait != 0xffff; ++wait) {
|
||||
mfsdram(DDR0_17, val);
|
||||
if (DDR0_17_DLLLOCKREG_DECODE(val)) {
|
||||
/* dlllockreg bit on */
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
debug("0x%04x: DDR0_17 Value (dlllockreg bit): 0x%08x\n", wait, val);
|
||||
debug("Waiting for dlllockreg bit to raise\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_DDR_DATA_EYE)
|
||||
#define DDR_DCR_BASE 0x10
|
||||
#define ddrcfga (DDR_DCR_BASE+0x0) /* DDR configuration address reg */
|
||||
#define ddrcfgd (DDR_DCR_BASE+0x1) /* DDR configuration data reg */
|
||||
|
||||
/*-----------------------------------------------------------------------------+
|
||||
* wait_for_dram_init_complete.
|
||||
+----------------------------------------------------------------------------*/
|
||||
static int wait_for_dram_init_complete(void)
|
||||
{
|
||||
unsigned long val;
|
||||
int wait = 0;
|
||||
|
||||
/* --------------------------------------------------------------+
|
||||
* Wait for 'DRAM initialization complete' bit in status register
|
||||
* -------------------------------------------------------------*/
|
||||
mtdcr(ddrcfga, DDR0_00);
|
||||
|
||||
while (wait != 0xffff) {
|
||||
val = mfdcr(ddrcfgd);
|
||||
if ((val & DDR0_00_INT_STATUS_BIT6) == DDR0_00_INT_STATUS_BIT6)
|
||||
/* 'DRAM initialization complete' bit */
|
||||
return 0;
|
||||
else
|
||||
wait++;
|
||||
}
|
||||
debug("DRAM initialization complete bit in status register did not "
|
||||
"rise\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
#define NUM_TRIES 64
|
||||
#define NUM_READS 10
|
||||
|
||||
/*-----------------------------------------------------------------------------+
|
||||
* denali_core_search_data_eye.
|
||||
+----------------------------------------------------------------------------*/
|
||||
void denali_core_search_data_eye(void)
|
||||
{
|
||||
int k, j;
|
||||
u32 val;
|
||||
u32 wr_dqs_shift, dqs_out_shift, dll_dqs_delay_X;
|
||||
u32 max_passing_cases = 0, wr_dqs_shift_with_max_passing_cases = 0;
|
||||
u32 passing_cases = 0, dll_dqs_delay_X_sw_val = 0;
|
||||
u32 dll_dqs_delay_X_start_window = 0, dll_dqs_delay_X_end_window = 0;
|
||||
volatile u32 *ram_pointer;
|
||||
u32 test[NUM_TRIES] = {
|
||||
0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF,
|
||||
0x00000000, 0x00000000, 0xFFFFFFFF, 0xFFFFFFFF,
|
||||
0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000,
|
||||
0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000,
|
||||
0xAAAAAAAA, 0xAAAAAAAA, 0x55555555, 0x55555555,
|
||||
0xAAAAAAAA, 0xAAAAAAAA, 0x55555555, 0x55555555,
|
||||
0x55555555, 0x55555555, 0xAAAAAAAA, 0xAAAAAAAA,
|
||||
0x55555555, 0x55555555, 0xAAAAAAAA, 0xAAAAAAAA,
|
||||
0xA5A5A5A5, 0xA5A5A5A5, 0x5A5A5A5A, 0x5A5A5A5A,
|
||||
0xA5A5A5A5, 0xA5A5A5A5, 0x5A5A5A5A, 0x5A5A5A5A,
|
||||
0x5A5A5A5A, 0x5A5A5A5A, 0xA5A5A5A5, 0xA5A5A5A5,
|
||||
0x5A5A5A5A, 0x5A5A5A5A, 0xA5A5A5A5, 0xA5A5A5A5,
|
||||
0xAA55AA55, 0xAA55AA55, 0x55AA55AA, 0x55AA55AA,
|
||||
0xAA55AA55, 0xAA55AA55, 0x55AA55AA, 0x55AA55AA,
|
||||
0x55AA55AA, 0x55AA55AA, 0xAA55AA55, 0xAA55AA55,
|
||||
0x55AA55AA, 0x55AA55AA, 0xAA55AA55, 0xAA55AA55
|
||||
};
|
||||
|
||||
ram_pointer = (volatile u32 *)(CONFIG_SYS_SDRAM_BASE);
|
||||
|
||||
for (wr_dqs_shift = 64; wr_dqs_shift < 96; wr_dqs_shift++) {
|
||||
/* for (wr_dqs_shift=1; wr_dqs_shift<96; wr_dqs_shift++) { */
|
||||
|
||||
/* -----------------------------------------------------------+
|
||||
* De-assert 'start' parameter.
|
||||
* ----------------------------------------------------------*/
|
||||
mtdcr(ddrcfga, DDR0_02);
|
||||
val = (mfdcr(ddrcfgd) & ~DDR0_02_START_MASK) |
|
||||
DDR0_02_START_OFF;
|
||||
mtdcr(ddrcfgd, val);
|
||||
|
||||
/* -----------------------------------------------------------+
|
||||
* Set 'wr_dqs_shift'
|
||||
* ----------------------------------------------------------*/
|
||||
mtdcr(ddrcfga, DDR0_09);
|
||||
val = (mfdcr(ddrcfgd) & ~DDR0_09_WR_DQS_SHIFT_MASK) |
|
||||
DDR0_09_WR_DQS_SHIFT_ENCODE(wr_dqs_shift);
|
||||
mtdcr(ddrcfgd, val);
|
||||
|
||||
/* -----------------------------------------------------------+
|
||||
* Set 'dqs_out_shift' = wr_dqs_shift + 32
|
||||
* ----------------------------------------------------------*/
|
||||
dqs_out_shift = wr_dqs_shift + 32;
|
||||
mtdcr(ddrcfga, DDR0_22);
|
||||
val = (mfdcr(ddrcfgd) & ~DDR0_22_DQS_OUT_SHIFT_MASK) |
|
||||
DDR0_22_DQS_OUT_SHIFT_ENCODE(dqs_out_shift);
|
||||
mtdcr(ddrcfgd, val);
|
||||
|
||||
passing_cases = 0;
|
||||
|
||||
for (dll_dqs_delay_X = 1; dll_dqs_delay_X < 64;
|
||||
dll_dqs_delay_X++) {
|
||||
/* for (dll_dqs_delay_X=1; dll_dqs_delay_X<128;
|
||||
dll_dqs_delay_X++) { */
|
||||
/* -----------------------------------------------------------+
|
||||
* Set 'dll_dqs_delay_X'.
|
||||
* ----------------------------------------------------------*/
|
||||
/* dll_dqs_delay_0 */
|
||||
mtdcr(ddrcfga, DDR0_17);
|
||||
val = (mfdcr(ddrcfgd) & ~DDR0_17_DLL_DQS_DELAY_0_MASK)
|
||||
| DDR0_17_DLL_DQS_DELAY_0_ENCODE(dll_dqs_delay_X);
|
||||
mtdcr(ddrcfgd, val);
|
||||
/* dll_dqs_delay_1 to dll_dqs_delay_4 */
|
||||
mtdcr(ddrcfga, DDR0_18);
|
||||
val = (mfdcr(ddrcfgd) & ~DDR0_18_DLL_DQS_DELAY_X_MASK)
|
||||
| DDR0_18_DLL_DQS_DELAY_4_ENCODE(dll_dqs_delay_X)
|
||||
| DDR0_18_DLL_DQS_DELAY_3_ENCODE(dll_dqs_delay_X)
|
||||
| DDR0_18_DLL_DQS_DELAY_2_ENCODE(dll_dqs_delay_X)
|
||||
| DDR0_18_DLL_DQS_DELAY_1_ENCODE(dll_dqs_delay_X);
|
||||
mtdcr(ddrcfgd, val);
|
||||
/* dll_dqs_delay_5 to dll_dqs_delay_8 */
|
||||
mtdcr(ddrcfga, DDR0_19);
|
||||
val = (mfdcr(ddrcfgd) & ~DDR0_19_DLL_DQS_DELAY_X_MASK)
|
||||
| DDR0_19_DLL_DQS_DELAY_8_ENCODE(dll_dqs_delay_X)
|
||||
| DDR0_19_DLL_DQS_DELAY_7_ENCODE(dll_dqs_delay_X)
|
||||
| DDR0_19_DLL_DQS_DELAY_6_ENCODE(dll_dqs_delay_X)
|
||||
| DDR0_19_DLL_DQS_DELAY_5_ENCODE(dll_dqs_delay_X);
|
||||
mtdcr(ddrcfgd, val);
|
||||
/* clear any ECC errors */
|
||||
mtdcr(ddrcfga, DDR0_00);
|
||||
mtdcr(ddrcfgd,
|
||||
mfdcr(ddrcfgd) | DDR0_00_INT_ACK_ENCODE(0x3C));
|
||||
|
||||
sync();
|
||||
eieio();
|
||||
|
||||
/* -----------------------------------------------------------+
|
||||
* Assert 'start' parameter.
|
||||
* ----------------------------------------------------------*/
|
||||
mtdcr(ddrcfga, DDR0_02);
|
||||
val = (mfdcr(ddrcfgd) & ~DDR0_02_START_MASK) |
|
||||
DDR0_02_START_ON;
|
||||
mtdcr(ddrcfgd, val);
|
||||
|
||||
sync();
|
||||
eieio();
|
||||
|
||||
/* -----------------------------------------------------------+
|
||||
* Wait for the DCC master delay line to finish calibration
|
||||
* ----------------------------------------------------------*/
|
||||
if (denali_wait_for_dlllock() != 0) {
|
||||
printf("dll lock did not occur !!!\n");
|
||||
printf("denali_core_search_data_eye!!!\n");
|
||||
printf("wr_dqs_shift = %d - dll_dqs_delay_X = "
|
||||
"%d\n", wr_dqs_shift, dll_dqs_delay_X);
|
||||
hang();
|
||||
}
|
||||
sync();
|
||||
eieio();
|
||||
|
||||
if (wait_for_dram_init_complete() != 0) {
|
||||
printf("dram init complete did not occur!!!\n");
|
||||
printf("denali_core_search_data_eye!!!\n");
|
||||
printf("wr_dqs_shift = %d - dll_dqs_delay_X = "
|
||||
"%d\n", wr_dqs_shift, dll_dqs_delay_X);
|
||||
hang();
|
||||
}
|
||||
udelay(100); /* wait 100us to ensure init is really completed !!! */
|
||||
|
||||
/* write values */
|
||||
for (j = 0; j < NUM_TRIES; j++) {
|
||||
ram_pointer[j] = test[j];
|
||||
|
||||
/* clear any cache at ram location */
|
||||
__asm__("dcbf 0,%0": :"r"(&ram_pointer[j]));
|
||||
}
|
||||
|
||||
/* read values back */
|
||||
for (j = 0; j < NUM_TRIES; j++) {
|
||||
for (k = 0; k < NUM_READS; k++) {
|
||||
/* clear any cache at ram location */
|
||||
__asm__("dcbf 0,%0": :"r"(&ram_pointer
|
||||
[j]));
|
||||
|
||||
if (ram_pointer[j] != test[j])
|
||||
break;
|
||||
}
|
||||
|
||||
/* read error */
|
||||
if (k != NUM_READS)
|
||||
break;
|
||||
}
|
||||
|
||||
/* See if the dll_dqs_delay_X value passed. */
|
||||
mtdcr(ddrcfga, DDR0_00);
|
||||
if (j < NUM_TRIES
|
||||
|| (DDR0_00_INT_STATUS_DECODE(mfdcr(ddrcfgd)) &
|
||||
0x3F)) {
|
||||
/* Failed */
|
||||
passing_cases = 0;
|
||||
/* break; */
|
||||
} else {
|
||||
/* Passed */
|
||||
if (passing_cases == 0)
|
||||
dll_dqs_delay_X_sw_val =
|
||||
dll_dqs_delay_X;
|
||||
passing_cases++;
|
||||
if (passing_cases >= max_passing_cases) {
|
||||
max_passing_cases = passing_cases;
|
||||
wr_dqs_shift_with_max_passing_cases =
|
||||
wr_dqs_shift;
|
||||
dll_dqs_delay_X_start_window =
|
||||
dll_dqs_delay_X_sw_val;
|
||||
dll_dqs_delay_X_end_window =
|
||||
dll_dqs_delay_X;
|
||||
}
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------+
|
||||
* De-assert 'start' parameter.
|
||||
* ----------------------------------------------------------*/
|
||||
mtdcr(ddrcfga, DDR0_02);
|
||||
val = (mfdcr(ddrcfgd) & ~DDR0_02_START_MASK) |
|
||||
DDR0_02_START_OFF;
|
||||
mtdcr(ddrcfgd, val);
|
||||
} /* for (dll_dqs_delay_X=0; dll_dqs_delay_X<128; dll_dqs_delay_X++) */
|
||||
} /* for (wr_dqs_shift=0; wr_dqs_shift<96; wr_dqs_shift++) */
|
||||
|
||||
/* -----------------------------------------------------------+
|
||||
* Largest passing window is now detected.
|
||||
* ----------------------------------------------------------*/
|
||||
|
||||
/* Compute dll_dqs_delay_X value */
|
||||
dll_dqs_delay_X = (dll_dqs_delay_X_end_window +
|
||||
dll_dqs_delay_X_start_window) / 2;
|
||||
wr_dqs_shift = wr_dqs_shift_with_max_passing_cases;
|
||||
|
||||
debug("DQS calibration - Window detected:\n");
|
||||
debug("max_passing_cases = %d\n", max_passing_cases);
|
||||
debug("wr_dqs_shift = %d\n", wr_dqs_shift);
|
||||
debug("dll_dqs_delay_X = %d\n", dll_dqs_delay_X);
|
||||
debug("dll_dqs_delay_X window = %d - %d\n",
|
||||
dll_dqs_delay_X_start_window, dll_dqs_delay_X_end_window);
|
||||
|
||||
/* -----------------------------------------------------------+
|
||||
* De-assert 'start' parameter.
|
||||
* ----------------------------------------------------------*/
|
||||
mtdcr(ddrcfga, DDR0_02);
|
||||
val = (mfdcr(ddrcfgd) & ~DDR0_02_START_MASK) | DDR0_02_START_OFF;
|
||||
mtdcr(ddrcfgd, val);
|
||||
|
||||
/* -----------------------------------------------------------+
|
||||
* Set 'wr_dqs_shift'
|
||||
* ----------------------------------------------------------*/
|
||||
mtdcr(ddrcfga, DDR0_09);
|
||||
val = (mfdcr(ddrcfgd) & ~DDR0_09_WR_DQS_SHIFT_MASK)
|
||||
| DDR0_09_WR_DQS_SHIFT_ENCODE(wr_dqs_shift);
|
||||
mtdcr(ddrcfgd, val);
|
||||
debug("DDR0_09=0x%08x\n", val);
|
||||
|
||||
/* -----------------------------------------------------------+
|
||||
* Set 'dqs_out_shift' = wr_dqs_shift + 32
|
||||
* ----------------------------------------------------------*/
|
||||
dqs_out_shift = wr_dqs_shift + 32;
|
||||
mtdcr(ddrcfga, DDR0_22);
|
||||
val = (mfdcr(ddrcfgd) & ~DDR0_22_DQS_OUT_SHIFT_MASK)
|
||||
| DDR0_22_DQS_OUT_SHIFT_ENCODE(dqs_out_shift);
|
||||
mtdcr(ddrcfgd, val);
|
||||
debug("DDR0_22=0x%08x\n", val);
|
||||
|
||||
/* -----------------------------------------------------------+
|
||||
* Set 'dll_dqs_delay_X'.
|
||||
* ----------------------------------------------------------*/
|
||||
/* dll_dqs_delay_0 */
|
||||
mtdcr(ddrcfga, DDR0_17);
|
||||
val = (mfdcr(ddrcfgd) & ~DDR0_17_DLL_DQS_DELAY_0_MASK)
|
||||
| DDR0_17_DLL_DQS_DELAY_0_ENCODE(dll_dqs_delay_X);
|
||||
mtdcr(ddrcfgd, val);
|
||||
debug("DDR0_17=0x%08x\n", val);
|
||||
|
||||
/* dll_dqs_delay_1 to dll_dqs_delay_4 */
|
||||
mtdcr(ddrcfga, DDR0_18);
|
||||
val = (mfdcr(ddrcfgd) & ~DDR0_18_DLL_DQS_DELAY_X_MASK)
|
||||
| DDR0_18_DLL_DQS_DELAY_4_ENCODE(dll_dqs_delay_X)
|
||||
| DDR0_18_DLL_DQS_DELAY_3_ENCODE(dll_dqs_delay_X)
|
||||
| DDR0_18_DLL_DQS_DELAY_2_ENCODE(dll_dqs_delay_X)
|
||||
| DDR0_18_DLL_DQS_DELAY_1_ENCODE(dll_dqs_delay_X);
|
||||
mtdcr(ddrcfgd, val);
|
||||
debug("DDR0_18=0x%08x\n", val);
|
||||
|
||||
/* dll_dqs_delay_5 to dll_dqs_delay_8 */
|
||||
mtdcr(ddrcfga, DDR0_19);
|
||||
val = (mfdcr(ddrcfgd) & ~DDR0_19_DLL_DQS_DELAY_X_MASK)
|
||||
| DDR0_19_DLL_DQS_DELAY_8_ENCODE(dll_dqs_delay_X)
|
||||
| DDR0_19_DLL_DQS_DELAY_7_ENCODE(dll_dqs_delay_X)
|
||||
| DDR0_19_DLL_DQS_DELAY_6_ENCODE(dll_dqs_delay_X)
|
||||
| DDR0_19_DLL_DQS_DELAY_5_ENCODE(dll_dqs_delay_X);
|
||||
mtdcr(ddrcfgd, val);
|
||||
debug("DDR0_19=0x%08x\n", val);
|
||||
|
||||
/* -----------------------------------------------------------+
|
||||
* Assert 'start' parameter.
|
||||
* ----------------------------------------------------------*/
|
||||
mtdcr(ddrcfga, DDR0_02);
|
||||
val = (mfdcr(ddrcfgd) & ~DDR0_02_START_MASK) | DDR0_02_START_ON;
|
||||
mtdcr(ddrcfgd, val);
|
||||
|
||||
sync();
|
||||
eieio();
|
||||
|
||||
/* -----------------------------------------------------------+
|
||||
* Wait for the DCC master delay line to finish calibration
|
||||
* ----------------------------------------------------------*/
|
||||
if (denali_wait_for_dlllock() != 0) {
|
||||
printf("dll lock did not occur !!!\n");
|
||||
hang();
|
||||
}
|
||||
sync();
|
||||
eieio();
|
||||
|
||||
if (wait_for_dram_init_complete() != 0) {
|
||||
printf("dram init complete did not occur !!!\n");
|
||||
hang();
|
||||
}
|
||||
udelay(100); /* wait 100us to ensure init is really completed !!! */
|
||||
}
|
||||
#endif /* defined(CONFIG_DDR_DATA_EYE) */
|
||||
#endif /* defined(CONFIG_440EPX) || defined(CONFIG_440GRX) */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,188 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2008 Nuovation System Designs, LLC
|
||||
* Grant Erickson <gerickson@nuovations.com>
|
||||
*
|
||||
* (C) Copyright 2005-2009
|
||||
* Stefan Roese, DENX Software Engineering, sr@denx.de.
|
||||
*
|
||||
* (C) Copyright 2002
|
||||
* Jun Gu, Artesyn Technology, jung@artesyncp.com
|
||||
*
|
||||
* (C) Copyright 2001
|
||||
* Bill Hunter, Wave 7 Optics, williamhunter@attbi.com
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*
|
||||
* Description:
|
||||
* This file implements generic DRAM ECC initialization for
|
||||
* PowerPC processors using a SDRAM DDR/DDR2 controller,
|
||||
* including the 405EX(r), 440GP/GX/EP/GR, 440SP(E), and
|
||||
* 460EX/GT.
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/ppc4xx.h>
|
||||
#include <ppc_asm.tmpl>
|
||||
#include <ppc_defs.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/mmu.h>
|
||||
#include <asm/cache.h>
|
||||
|
||||
#include "ecc.h"
|
||||
|
||||
#if defined(CONFIG_SDRAM_PPC4xx_IBM_DDR) || \
|
||||
defined(CONFIG_SDRAM_PPC4xx_IBM_DDR2)
|
||||
#if defined(CONFIG_DDR_ECC) || defined(CONFIG_SDRAM_ECC)
|
||||
|
||||
#if defined(CONFIG_405EX)
|
||||
/*
|
||||
* Currently only 405EX uses 16bit data bus width as an alternative
|
||||
* option to 32bit data width (SDRAM0_MCOPT1_WDTH)
|
||||
*/
|
||||
#define SDRAM_DATA_ALT_WIDTH 2
|
||||
#else
|
||||
#define SDRAM_DATA_ALT_WIDTH 8
|
||||
#endif
|
||||
|
||||
static void wait_ddr_idle(void)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
do {
|
||||
mfsdram(SDRAM_MCSTAT, val);
|
||||
} while ((val & SDRAM_MCSTAT_IDLE_MASK) == SDRAM_MCSTAT_IDLE_NOT);
|
||||
}
|
||||
|
||||
static void program_ecc_addr(unsigned long start_address,
|
||||
unsigned long num_bytes,
|
||||
unsigned long tlb_word2_i_value)
|
||||
{
|
||||
unsigned long current_address;
|
||||
unsigned long end_address;
|
||||
unsigned long address_increment;
|
||||
unsigned long mcopt1;
|
||||
char str[] = "ECC generation -";
|
||||
char slash[] = "\\|/-\\|/-";
|
||||
int loop = 0;
|
||||
int loopi = 0;
|
||||
|
||||
current_address = start_address;
|
||||
mfsdram(SDRAM_MCOPT1, mcopt1);
|
||||
if ((mcopt1 & SDRAM_MCOPT1_MCHK_MASK) != SDRAM_MCOPT1_MCHK_NON) {
|
||||
mtsdram(SDRAM_MCOPT1,
|
||||
(mcopt1 & ~SDRAM_MCOPT1_MCHK_MASK) | SDRAM_MCOPT1_MCHK_GEN);
|
||||
sync();
|
||||
eieio();
|
||||
wait_ddr_idle();
|
||||
|
||||
puts(str);
|
||||
|
||||
#ifdef CONFIG_440
|
||||
if (tlb_word2_i_value == TLB_WORD2_I_ENABLE) {
|
||||
#endif
|
||||
/* ECC bit set method for non-cached memory */
|
||||
if ((mcopt1 & SDRAM_MCOPT1_DMWD_MASK) == SDRAM_MCOPT1_DMWD_32)
|
||||
address_increment = 4;
|
||||
else
|
||||
address_increment = SDRAM_DATA_ALT_WIDTH;
|
||||
end_address = current_address + num_bytes;
|
||||
|
||||
while (current_address < end_address) {
|
||||
*((unsigned long *)current_address) = 0;
|
||||
current_address += address_increment;
|
||||
|
||||
if ((loop++ % (2 << 20)) == 0) {
|
||||
putc('\b');
|
||||
putc(slash[loopi++ % 8]);
|
||||
}
|
||||
}
|
||||
#ifdef CONFIG_440
|
||||
} else {
|
||||
/* ECC bit set method for cached memory */
|
||||
dcbz_area(start_address, num_bytes);
|
||||
/* Write modified dcache lines back to memory */
|
||||
clean_dcache_range(start_address, start_address + num_bytes);
|
||||
}
|
||||
#endif /* CONFIG_440 */
|
||||
|
||||
blank_string(strlen(str));
|
||||
|
||||
sync();
|
||||
eieio();
|
||||
wait_ddr_idle();
|
||||
|
||||
/* clear ECC error repoting registers */
|
||||
mtsdram(SDRAM_ECCES, 0xffffffff);
|
||||
#if defined(CONFIG_SDRAM_PPC4xx_IBM_DDR)
|
||||
/*
|
||||
* IBM DDR(1) core (440GX):
|
||||
* Clear Mx bits in SDRAM0_BESR0/1
|
||||
*/
|
||||
mtsdram(SDRAM0_BESR0, 0xffffffff);
|
||||
mtsdram(SDRAM0_BESR1, 0xffffffff);
|
||||
#elif defined(CONFIG_440)
|
||||
/*
|
||||
* 440/460 DDR2 core:
|
||||
* Clear EMID (Error PLB Master ID) in MQ0_ESL
|
||||
*/
|
||||
mtdcr(SDRAM_ERRSTATLL, 0xfff00000);
|
||||
#else
|
||||
/*
|
||||
* 405EX(r) DDR2 core:
|
||||
* Clear M0ID (Error PLB Master ID) in SDRAM_BESR
|
||||
*/
|
||||
mtsdram(SDRAM_BESR, 0xf0000000);
|
||||
#endif
|
||||
|
||||
mtsdram(SDRAM_MCOPT1,
|
||||
(mcopt1 & ~SDRAM_MCOPT1_MCHK_MASK) | SDRAM_MCOPT1_MCHK_CHK_REP);
|
||||
sync();
|
||||
eieio();
|
||||
wait_ddr_idle();
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(CONFIG_SDRAM_PPC4xx_IBM_DDR)
|
||||
void ecc_init(unsigned long * const start, unsigned long size)
|
||||
{
|
||||
/*
|
||||
* Init ECC with cache disabled (on PPC's with IBM DDR
|
||||
* controller (non DDR2), not tested with cache enabled yet
|
||||
*/
|
||||
program_ecc_addr((u32)start, size, TLB_WORD2_I_ENABLE);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SDRAM_PPC4xx_IBM_DDR2)
|
||||
void do_program_ecc(unsigned long tlb_word2_i_value)
|
||||
{
|
||||
unsigned long mcopt1;
|
||||
unsigned long mcopt2;
|
||||
unsigned long mcstat;
|
||||
phys_size_t memsize = sdram_memsize();
|
||||
|
||||
if (memsize > CONFIG_MAX_MEM_MAPPED) {
|
||||
printf("\nWarning: Can't enable ECC on systems with more than 2GB of SDRAM!\n");
|
||||
return;
|
||||
}
|
||||
|
||||
mfsdram(SDRAM_MCOPT1, mcopt1);
|
||||
mfsdram(SDRAM_MCOPT2, mcopt2);
|
||||
|
||||
if ((mcopt1 & SDRAM_MCOPT1_MCHK_MASK) != SDRAM_MCOPT1_MCHK_NON) {
|
||||
/* DDR controller must be enabled and not in self-refresh. */
|
||||
mfsdram(SDRAM_MCSTAT, mcstat);
|
||||
if (((mcopt2 & SDRAM_MCOPT2_DCEN_MASK) == SDRAM_MCOPT2_DCEN_ENABLE)
|
||||
&& ((mcopt2 & SDRAM_MCOPT2_SREN_MASK) == SDRAM_MCOPT2_SREN_EXIT)
|
||||
&& ((mcstat & (SDRAM_MCSTAT_MIC_MASK | SDRAM_MCSTAT_SRMS_MASK))
|
||||
== (SDRAM_MCSTAT_MIC_COMP | SDRAM_MCSTAT_SRMS_NOT_SF))) {
|
||||
|
||||
program_ecc_addr(0, memsize, tlb_word2_i_value);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* defined(CONFIG_DDR_ECC) || defined(CONFIG_SDRAM_ECC) */
|
||||
#endif /* defined(CONFIG_SDRAM_PPC4xx_IBM_DDR)... */
|
||||
@@ -1,58 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2008 Nuovation System Designs, LLC
|
||||
* Grant Erickson <gerickson@nuovations.com>
|
||||
*
|
||||
* Copyright (c) 2007-2009 DENX Software Engineering, GmbH
|
||||
* Stefan Roese <sr@denx.de>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*
|
||||
* Description:
|
||||
* This file implements ECC initialization for PowerPC processors
|
||||
* using the IBM SDRAM DDR1 & DDR2 controller.
|
||||
*/
|
||||
|
||||
#ifndef _ECC_H_
|
||||
#define _ECC_H_
|
||||
|
||||
/*
|
||||
* Since the IBM DDR controller used on 440GP/GX/EP/GR is not register
|
||||
* compatible to the IBM DDR/2 controller used on 405EX/440SP/SPe/460EX/GT
|
||||
* we need to make some processor dependant defines used later on by the
|
||||
* driver.
|
||||
*/
|
||||
|
||||
/* For 440GP/GX/EP/GR */
|
||||
#if defined(CONFIG_SDRAM_PPC4xx_IBM_DDR)
|
||||
#define SDRAM_MCOPT1 SDRAM_CFG0
|
||||
#define SDRAM_MCOPT1_MCHK_MASK SDRAM_CFG0_MCHK_MASK
|
||||
#define SDRAM_MCOPT1_MCHK_NON SDRAM_CFG0_MCHK_NON
|
||||
#define SDRAM_MCOPT1_MCHK_GEN SDRAM_CFG0_MCHK_GEN
|
||||
#define SDRAM_MCOPT1_MCHK_CHK SDRAM_CFG0_MCHK_CHK
|
||||
#define SDRAM_MCOPT1_MCHK_CHK_REP SDRAM_CFG0_MCHK_CHK
|
||||
#define SDRAM_MCOPT1_DMWD_MASK SDRAM_CFG0_DMWD_MASK
|
||||
#define SDRAM_MCOPT1_DMWD_32 SDRAM_CFG0_DMWD_32
|
||||
|
||||
#define SDRAM_MCSTAT SDRAM0_MCSTS
|
||||
#define SDRAM_MCSTAT_IDLE_MASK SDRAM_MCSTS_CIS
|
||||
#define SDRAM_MCSTAT_IDLE_NOT SDRAM_MCSTS_IDLE_NOT
|
||||
|
||||
#define SDRAM_ECCES SDRAM0_ECCESR
|
||||
#endif
|
||||
|
||||
void ecc_init(unsigned long * const start, unsigned long size);
|
||||
void do_program_ecc(unsigned long tlb_word2_i_value);
|
||||
|
||||
static void inline blank_string(int size)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < size; i++)
|
||||
putc('\b');
|
||||
for (i = 0; i < size; i++)
|
||||
putc(' ');
|
||||
for (i = 0; i < size; i++)
|
||||
putc('\b');
|
||||
}
|
||||
|
||||
#endif /* _ECC_H_ */
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user