18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Keystone2 based boards and SOC related code. 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright 2013 Texas Instruments, Inc. 68c2ecf20Sopenharmony_ci * Cyril Chemparathy <cyril@ti.com> 78c2ecf20Sopenharmony_ci * Santosh Shilimkar <santosh.shillimkar@ti.com> 88c2ecf20Sopenharmony_ci */ 98c2ecf20Sopenharmony_ci#include <linux/io.h> 108c2ecf20Sopenharmony_ci#include <linux/of.h> 118c2ecf20Sopenharmony_ci#include <linux/dma-mapping.h> 128c2ecf20Sopenharmony_ci#include <linux/init.h> 138c2ecf20Sopenharmony_ci#include <linux/of_platform.h> 148c2ecf20Sopenharmony_ci#include <linux/of_address.h> 158c2ecf20Sopenharmony_ci#include <linux/memblock.h> 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci#include <asm/setup.h> 188c2ecf20Sopenharmony_ci#include <asm/mach/map.h> 198c2ecf20Sopenharmony_ci#include <asm/mach/arch.h> 208c2ecf20Sopenharmony_ci#include <asm/mach/time.h> 218c2ecf20Sopenharmony_ci#include <asm/smp_plat.h> 228c2ecf20Sopenharmony_ci#include <asm/memory.h> 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci#include "memory.h" 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci#include "keystone.h" 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci#ifdef CONFIG_ARM_LPAE 298c2ecf20Sopenharmony_cistatic int keystone_platform_notifier(struct notifier_block *nb, 308c2ecf20Sopenharmony_ci unsigned long event, void *data) 318c2ecf20Sopenharmony_ci{ 328c2ecf20Sopenharmony_ci struct device *dev = data; 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ci if (event != BUS_NOTIFY_ADD_DEVICE) 358c2ecf20Sopenharmony_ci return NOTIFY_DONE; 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ci if (!dev) 388c2ecf20Sopenharmony_ci return NOTIFY_BAD; 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci if (!dev->of_node) { 418c2ecf20Sopenharmony_ci int ret = dma_direct_set_offset(dev, KEYSTONE_HIGH_PHYS_START, 428c2ecf20Sopenharmony_ci KEYSTONE_LOW_PHYS_START, 438c2ecf20Sopenharmony_ci KEYSTONE_HIGH_PHYS_SIZE); 448c2ecf20Sopenharmony_ci dev_err(dev, "set dma_offset%08llx%s\n", 458c2ecf20Sopenharmony_ci KEYSTONE_HIGH_PHYS_START - KEYSTONE_LOW_PHYS_START, 468c2ecf20Sopenharmony_ci ret ? " failed" : ""); 478c2ecf20Sopenharmony_ci } 488c2ecf20Sopenharmony_ci return NOTIFY_OK; 498c2ecf20Sopenharmony_ci} 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_cistatic struct notifier_block platform_nb = { 528c2ecf20Sopenharmony_ci .notifier_call = keystone_platform_notifier, 538c2ecf20Sopenharmony_ci}; 548c2ecf20Sopenharmony_ci#endif /* CONFIG_ARM_LPAE */ 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_cistatic void __init keystone_init(void) 578c2ecf20Sopenharmony_ci{ 588c2ecf20Sopenharmony_ci#ifdef CONFIG_ARM_LPAE 598c2ecf20Sopenharmony_ci if (PHYS_OFFSET >= KEYSTONE_HIGH_PHYS_START) 608c2ecf20Sopenharmony_ci bus_register_notifier(&platform_bus_type, &platform_nb); 618c2ecf20Sopenharmony_ci#endif 628c2ecf20Sopenharmony_ci keystone_pm_runtime_init(); 638c2ecf20Sopenharmony_ci} 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_cistatic long long __init keystone_pv_fixup(void) 668c2ecf20Sopenharmony_ci{ 678c2ecf20Sopenharmony_ci long long offset; 688c2ecf20Sopenharmony_ci u64 mem_start, mem_end; 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_ci mem_start = memblock_start_of_DRAM(); 718c2ecf20Sopenharmony_ci mem_end = memblock_end_of_DRAM(); 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_ci /* nothing to do if we are running out of the <32-bit space */ 748c2ecf20Sopenharmony_ci if (mem_start >= KEYSTONE_LOW_PHYS_START && 758c2ecf20Sopenharmony_ci mem_end <= KEYSTONE_LOW_PHYS_END) 768c2ecf20Sopenharmony_ci return 0; 778c2ecf20Sopenharmony_ci 788c2ecf20Sopenharmony_ci if (mem_start < KEYSTONE_HIGH_PHYS_START || 798c2ecf20Sopenharmony_ci mem_end > KEYSTONE_HIGH_PHYS_END) { 808c2ecf20Sopenharmony_ci pr_crit("Invalid address space for memory (%08llx-%08llx)\n", 818c2ecf20Sopenharmony_ci mem_start, mem_end); 828c2ecf20Sopenharmony_ci return 0; 838c2ecf20Sopenharmony_ci } 848c2ecf20Sopenharmony_ci 858c2ecf20Sopenharmony_ci offset = KEYSTONE_HIGH_PHYS_START - KEYSTONE_LOW_PHYS_START; 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_ci /* Populate the arch idmap hook */ 888c2ecf20Sopenharmony_ci arch_phys_to_idmap_offset = -offset; 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_ci return offset; 918c2ecf20Sopenharmony_ci} 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_cistatic const char *const keystone_match[] __initconst = { 948c2ecf20Sopenharmony_ci "ti,k2hk", 958c2ecf20Sopenharmony_ci "ti,k2e", 968c2ecf20Sopenharmony_ci "ti,k2l", 978c2ecf20Sopenharmony_ci "ti,k2g", 988c2ecf20Sopenharmony_ci "ti,keystone", 998c2ecf20Sopenharmony_ci NULL, 1008c2ecf20Sopenharmony_ci}; 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_ciDT_MACHINE_START(KEYSTONE, "Keystone") 1038c2ecf20Sopenharmony_ci#if defined(CONFIG_ZONE_DMA) && defined(CONFIG_ARM_LPAE) 1048c2ecf20Sopenharmony_ci .dma_zone_size = SZ_2G, 1058c2ecf20Sopenharmony_ci#endif 1068c2ecf20Sopenharmony_ci .smp = smp_ops(keystone_smp_ops), 1078c2ecf20Sopenharmony_ci .init_machine = keystone_init, 1088c2ecf20Sopenharmony_ci .dt_compat = keystone_match, 1098c2ecf20Sopenharmony_ci .pv_fixup = keystone_pv_fixup, 1108c2ecf20Sopenharmony_ciMACHINE_END 111