10107f240SMasahiro Yamada /* 20107f240SMasahiro Yamada * Copyright (C) 2012 - 2013 Michal Simek <monstr@monstr.eu> 30107f240SMasahiro Yamada * Copyright (C) 2012 - 2013 Xilinx, Inc. All rights reserved. 40107f240SMasahiro Yamada * 50107f240SMasahiro Yamada * SPDX-License-Identifier: GPL-2.0+ 60107f240SMasahiro Yamada */ 70107f240SMasahiro Yamada 80107f240SMasahiro Yamada #include <common.h> 90107f240SMasahiro Yamada #include <asm/io.h> 100107f240SMasahiro Yamada #include <asm/arch/sys_proto.h> 110107f240SMasahiro Yamada #include <asm/arch/hardware.h> 120107f240SMasahiro Yamada 130107f240SMasahiro Yamada DECLARE_GLOBAL_DATA_PTR; 140107f240SMasahiro Yamada 15*d84bd928SSiva Durga Prasad Paladugu #ifndef CONFIG_ZYNQ_DDRC_INIT zynq_ddrc_init(void)16*d84bd928SSiva Durga Prasad Paladuguvoid zynq_ddrc_init(void) {} 17*d84bd928SSiva Durga Prasad Paladugu #else 180107f240SMasahiro Yamada /* Control regsiter bitfield definitions */ 190107f240SMasahiro Yamada #define ZYNQ_DDRC_CTRLREG_BUSWIDTH_MASK 0xC 200107f240SMasahiro Yamada #define ZYNQ_DDRC_CTRLREG_BUSWIDTH_SHIFT 2 210107f240SMasahiro Yamada #define ZYNQ_DDRC_CTRLREG_BUSWIDTH_16BIT 1 220107f240SMasahiro Yamada 230107f240SMasahiro Yamada /* ECC scrub regsiter definitions */ 240107f240SMasahiro Yamada #define ZYNQ_DDRC_ECC_SCRUBREG_ECC_MODE_MASK 0x7 250107f240SMasahiro Yamada #define ZYNQ_DDRC_ECC_SCRUBREG_ECCMODE_SECDED 0x4 260107f240SMasahiro Yamada zynq_ddrc_init(void)270107f240SMasahiro Yamadavoid zynq_ddrc_init(void) 280107f240SMasahiro Yamada { 290107f240SMasahiro Yamada u32 width, ecctype; 300107f240SMasahiro Yamada 310107f240SMasahiro Yamada width = readl(&ddrc_base->ddrc_ctrl); 320107f240SMasahiro Yamada width = (width & ZYNQ_DDRC_CTRLREG_BUSWIDTH_MASK) >> 330107f240SMasahiro Yamada ZYNQ_DDRC_CTRLREG_BUSWIDTH_SHIFT; 340107f240SMasahiro Yamada ecctype = (readl(&ddrc_base->ecc_scrub) & 350107f240SMasahiro Yamada ZYNQ_DDRC_ECC_SCRUBREG_ECC_MODE_MASK); 360107f240SMasahiro Yamada 370107f240SMasahiro Yamada /* ECC is enabled when memory is in 16bit mode and it is enabled */ 380107f240SMasahiro Yamada if ((ecctype == ZYNQ_DDRC_ECC_SCRUBREG_ECCMODE_SECDED) && 390107f240SMasahiro Yamada (width == ZYNQ_DDRC_CTRLREG_BUSWIDTH_16BIT)) { 400107f240SMasahiro Yamada puts("ECC enabled "); 410107f240SMasahiro Yamada /* 420107f240SMasahiro Yamada * Clear the first 1MB because it is not initialized from 430107f240SMasahiro Yamada * first stage bootloader. To get ECC to work all memory has 440107f240SMasahiro Yamada * been initialized by writing any value. 450107f240SMasahiro Yamada */ 460107f240SMasahiro Yamada /* cppcheck-suppress nullPointer */ 470107f240SMasahiro Yamada memset((void *)0, 0, 1 * 1024 * 1024); 480107f240SMasahiro Yamada } else { 490107f240SMasahiro Yamada puts("ECC disabled "); 500107f240SMasahiro Yamada } 510107f240SMasahiro Yamada } 52*d84bd928SSiva Durga Prasad Paladugu #endif 53