1746f985aSSergey Temerkhanov /** 2746f985aSSergey Temerkhanov * (C) Copyright 2014, Cavium Inc. 3746f985aSSergey Temerkhanov * 4746f985aSSergey Temerkhanov * SPDX-License-Identifier: GPL-2.0+ 5746f985aSSergey Temerkhanov **/ 6746f985aSSergey Temerkhanov 7746f985aSSergey Temerkhanov #include <common.h> 8746f985aSSergey Temerkhanov #include <malloc.h> 9746f985aSSergey Temerkhanov #include <errno.h> 10746f985aSSergey Temerkhanov #include <linux/compiler.h> 11746f985aSSergey Temerkhanov 123ed2ece5SSergey Temerkhanov #include <cavium/atf.h> 13d473f0c6SAlexander Graf #include <asm/armv8/mmu.h> 143ed2ece5SSergey Temerkhanov 15746f985aSSergey Temerkhanov #if !CONFIG_IS_ENABLED(OF_CONTROL) 16746f985aSSergey Temerkhanov #include <dm/platdata.h> 17746f985aSSergey Temerkhanov #include <dm/platform_data/serial_pl01x.h> 18746f985aSSergey Temerkhanov 19746f985aSSergey Temerkhanov static const struct pl01x_serial_platdata serial0 = { 20746f985aSSergey Temerkhanov .base = CONFIG_SYS_SERIAL0, 21746f985aSSergey Temerkhanov .type = TYPE_PL011, 22746f985aSSergey Temerkhanov .clock = 0, 23746f985aSSergey Temerkhanov .skip_init = true, 24746f985aSSergey Temerkhanov }; 25746f985aSSergey Temerkhanov 26746f985aSSergey Temerkhanov U_BOOT_DEVICE(thunderx_serial0) = { 27746f985aSSergey Temerkhanov .name = "serial_pl01x", 28746f985aSSergey Temerkhanov .platdata = &serial0, 29746f985aSSergey Temerkhanov }; 30746f985aSSergey Temerkhanov 31746f985aSSergey Temerkhanov static const struct pl01x_serial_platdata serial1 = { 32746f985aSSergey Temerkhanov .base = CONFIG_SYS_SERIAL1, 33746f985aSSergey Temerkhanov .type = TYPE_PL011, 34746f985aSSergey Temerkhanov .clock = 0, 35746f985aSSergey Temerkhanov .skip_init = true, 36746f985aSSergey Temerkhanov }; 37746f985aSSergey Temerkhanov 38746f985aSSergey Temerkhanov U_BOOT_DEVICE(thunderx_serial1) = { 39746f985aSSergey Temerkhanov .name = "serial_pl01x", 40746f985aSSergey Temerkhanov .platdata = &serial1, 41746f985aSSergey Temerkhanov }; 42746f985aSSergey Temerkhanov #endif 43746f985aSSergey Temerkhanov 44746f985aSSergey Temerkhanov DECLARE_GLOBAL_DATA_PTR; 45746f985aSSergey Temerkhanov 46d473f0c6SAlexander Graf static struct mm_region thunderx_mem_map[] = { 47d473f0c6SAlexander Graf { 48*cd4b0c5fSYork Sun .virt = 0x000000000000UL, 49*cd4b0c5fSYork Sun .phys = 0x000000000000UL, 50d473f0c6SAlexander Graf .size = 0x40000000000UL, 51d473f0c6SAlexander Graf .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) | PTE_BLOCK_NON_SHARE, 52d473f0c6SAlexander Graf }, { 53*cd4b0c5fSYork Sun .virt = 0x800000000000UL, 54*cd4b0c5fSYork Sun .phys = 0x800000000000UL, 55d473f0c6SAlexander Graf .size = 0x40000000000UL, 56d473f0c6SAlexander Graf .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) | 57d473f0c6SAlexander Graf PTE_BLOCK_NON_SHARE, 58d473f0c6SAlexander Graf }, { 59*cd4b0c5fSYork Sun .virt = 0x840000000000UL, 60*cd4b0c5fSYork Sun .phys = 0x840000000000UL, 61d473f0c6SAlexander Graf .size = 0x40000000000UL, 62d473f0c6SAlexander Graf .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) | 63d473f0c6SAlexander Graf PTE_BLOCK_NON_SHARE, 64d473f0c6SAlexander Graf }, { 65d473f0c6SAlexander Graf /* List terminator */ 66d473f0c6SAlexander Graf 0, 67d473f0c6SAlexander Graf } 68d473f0c6SAlexander Graf }; 69d473f0c6SAlexander Graf 70d473f0c6SAlexander Graf struct mm_region *mem_map = thunderx_mem_map; 71d473f0c6SAlexander Graf 72746f985aSSergey Temerkhanov int board_init(void) 73746f985aSSergey Temerkhanov { 74746f985aSSergey Temerkhanov return 0; 75746f985aSSergey Temerkhanov } 76746f985aSSergey Temerkhanov 77746f985aSSergey Temerkhanov int timer_init(void) 78746f985aSSergey Temerkhanov { 79746f985aSSergey Temerkhanov return 0; 80746f985aSSergey Temerkhanov } 81746f985aSSergey Temerkhanov 823ed2ece5SSergey Temerkhanov int dram_init(void) 833ed2ece5SSergey Temerkhanov { 843ed2ece5SSergey Temerkhanov ssize_t node_count = atf_node_count(); 853ed2ece5SSergey Temerkhanov ssize_t dram_size; 863ed2ece5SSergey Temerkhanov int node; 873ed2ece5SSergey Temerkhanov 883ed2ece5SSergey Temerkhanov printf("Initializing\nNodes in system: %zd\n", node_count); 893ed2ece5SSergey Temerkhanov 903ed2ece5SSergey Temerkhanov gd->ram_size = 0; 913ed2ece5SSergey Temerkhanov 923ed2ece5SSergey Temerkhanov for (node = 0; node < node_count; node++) { 933ed2ece5SSergey Temerkhanov dram_size = atf_dram_size(node); 943ed2ece5SSergey Temerkhanov printf("Node %d: %zd MBytes of DRAM\n", node, dram_size >> 20); 953ed2ece5SSergey Temerkhanov gd->ram_size += dram_size; 963ed2ece5SSergey Temerkhanov } 973ed2ece5SSergey Temerkhanov 983ed2ece5SSergey Temerkhanov gd->ram_size -= MEM_BASE; 993ed2ece5SSergey Temerkhanov 1003ed2ece5SSergey Temerkhanov *(unsigned long *)CPU_RELEASE_ADDR = 0; 1013ed2ece5SSergey Temerkhanov 1023ed2ece5SSergey Temerkhanov puts("DRAM size:"); 1033ed2ece5SSergey Temerkhanov 1043ed2ece5SSergey Temerkhanov return 0; 1053ed2ece5SSergey Temerkhanov } 1063ed2ece5SSergey Temerkhanov 107746f985aSSergey Temerkhanov /* 108746f985aSSergey Temerkhanov * Board specific reset that is system reset. 109746f985aSSergey Temerkhanov */ 110746f985aSSergey Temerkhanov void reset_cpu(ulong addr) 111746f985aSSergey Temerkhanov { 112746f985aSSergey Temerkhanov } 113746f985aSSergey Temerkhanov 114746f985aSSergey Temerkhanov /* 115746f985aSSergey Temerkhanov * Board specific ethernet initialization routine. 116746f985aSSergey Temerkhanov */ 117746f985aSSergey Temerkhanov int board_eth_init(bd_t *bis) 118746f985aSSergey Temerkhanov { 119746f985aSSergey Temerkhanov int rc = 0; 120746f985aSSergey Temerkhanov 121746f985aSSergey Temerkhanov return rc; 122746f985aSSergey Temerkhanov } 123746f985aSSergey Temerkhanov 124746f985aSSergey Temerkhanov #ifdef CONFIG_PCI 125746f985aSSergey Temerkhanov void pci_init_board(void) 126746f985aSSergey Temerkhanov { 127746f985aSSergey Temerkhanov printf("DEBUG: PCI Init TODO *****\n"); 128746f985aSSergey Temerkhanov } 129746f985aSSergey Temerkhanov #endif 130