162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2012-2015 Altera Corporation 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci#include <linux/irqchip.h> 662306a36Sopenharmony_ci#include <linux/of.h> 762306a36Sopenharmony_ci#include <linux/of_address.h> 862306a36Sopenharmony_ci#include <linux/reboot.h> 962306a36Sopenharmony_ci#include <linux/reset/socfpga.h> 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <asm/mach/arch.h> 1262306a36Sopenharmony_ci#include <asm/mach/map.h> 1362306a36Sopenharmony_ci#include <asm/cacheflush.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#include "core.h" 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_civoid __iomem *sys_manager_base_addr; 1862306a36Sopenharmony_civoid __iomem *rst_manager_base_addr; 1962306a36Sopenharmony_civoid __iomem *sdr_ctl_base_addr; 2062306a36Sopenharmony_ciunsigned long socfpga_cpu1start_addr; 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_cistatic void __init socfpga_sysmgr_init(void) 2362306a36Sopenharmony_ci{ 2462306a36Sopenharmony_ci struct device_node *np; 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci np = of_find_compatible_node(NULL, NULL, "altr,sys-mgr"); 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci if (of_property_read_u32(np, "cpu1-start-addr", 2962306a36Sopenharmony_ci (u32 *) &socfpga_cpu1start_addr)) 3062306a36Sopenharmony_ci pr_err("SMP: Need cpu1-start-addr in device tree.\n"); 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci /* Ensure that socfpga_cpu1start_addr is visible to other CPUs */ 3362306a36Sopenharmony_ci smp_wmb(); 3462306a36Sopenharmony_ci sync_cache_w(&socfpga_cpu1start_addr); 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci sys_manager_base_addr = of_iomap(np, 0); 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci np = of_find_compatible_node(NULL, NULL, "altr,rst-mgr"); 3962306a36Sopenharmony_ci rst_manager_base_addr = of_iomap(np, 0); 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci np = of_find_compatible_node(NULL, NULL, "altr,sdr-ctl"); 4262306a36Sopenharmony_ci sdr_ctl_base_addr = of_iomap(np, 0); 4362306a36Sopenharmony_ci} 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_cistatic void __init socfpga_init_irq(void) 4662306a36Sopenharmony_ci{ 4762306a36Sopenharmony_ci irqchip_init(); 4862306a36Sopenharmony_ci socfpga_sysmgr_init(); 4962306a36Sopenharmony_ci if (IS_ENABLED(CONFIG_EDAC_ALTERA_L2C)) 5062306a36Sopenharmony_ci socfpga_init_l2_ecc(); 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci if (IS_ENABLED(CONFIG_EDAC_ALTERA_OCRAM)) 5362306a36Sopenharmony_ci socfpga_init_ocram_ecc(); 5462306a36Sopenharmony_ci socfpga_reset_init(); 5562306a36Sopenharmony_ci} 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_cistatic void __init socfpga_arria10_init_irq(void) 5862306a36Sopenharmony_ci{ 5962306a36Sopenharmony_ci irqchip_init(); 6062306a36Sopenharmony_ci socfpga_sysmgr_init(); 6162306a36Sopenharmony_ci if (IS_ENABLED(CONFIG_EDAC_ALTERA_L2C)) 6262306a36Sopenharmony_ci socfpga_init_arria10_l2_ecc(); 6362306a36Sopenharmony_ci if (IS_ENABLED(CONFIG_EDAC_ALTERA_OCRAM)) 6462306a36Sopenharmony_ci socfpga_init_arria10_ocram_ecc(); 6562306a36Sopenharmony_ci socfpga_reset_init(); 6662306a36Sopenharmony_ci} 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_cistatic void socfpga_cyclone5_restart(enum reboot_mode mode, const char *cmd) 6962306a36Sopenharmony_ci{ 7062306a36Sopenharmony_ci u32 temp; 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci temp = readl(rst_manager_base_addr + SOCFPGA_RSTMGR_CTRL); 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci if (mode == REBOOT_WARM) 7562306a36Sopenharmony_ci temp |= RSTMGR_CTRL_SWWARMRSTREQ; 7662306a36Sopenharmony_ci else 7762306a36Sopenharmony_ci temp |= RSTMGR_CTRL_SWCOLDRSTREQ; 7862306a36Sopenharmony_ci writel(temp, rst_manager_base_addr + SOCFPGA_RSTMGR_CTRL); 7962306a36Sopenharmony_ci} 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_cistatic void socfpga_arria10_restart(enum reboot_mode mode, const char *cmd) 8262306a36Sopenharmony_ci{ 8362306a36Sopenharmony_ci u32 temp; 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci temp = readl(rst_manager_base_addr + SOCFPGA_A10_RSTMGR_CTRL); 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci if (mode == REBOOT_WARM) 8862306a36Sopenharmony_ci temp |= RSTMGR_CTRL_SWWARMRSTREQ; 8962306a36Sopenharmony_ci else 9062306a36Sopenharmony_ci temp |= RSTMGR_CTRL_SWCOLDRSTREQ; 9162306a36Sopenharmony_ci writel(temp, rst_manager_base_addr + SOCFPGA_A10_RSTMGR_CTRL); 9262306a36Sopenharmony_ci} 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_cistatic const char *altera_dt_match[] = { 9562306a36Sopenharmony_ci "altr,socfpga", 9662306a36Sopenharmony_ci NULL 9762306a36Sopenharmony_ci}; 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ciDT_MACHINE_START(SOCFPGA, "Altera SOCFPGA") 10062306a36Sopenharmony_ci .l2c_aux_val = 0, 10162306a36Sopenharmony_ci .l2c_aux_mask = ~0, 10262306a36Sopenharmony_ci .init_irq = socfpga_init_irq, 10362306a36Sopenharmony_ci .restart = socfpga_cyclone5_restart, 10462306a36Sopenharmony_ci .dt_compat = altera_dt_match, 10562306a36Sopenharmony_ciMACHINE_END 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_cistatic const char *altera_a10_dt_match[] = { 10862306a36Sopenharmony_ci "altr,socfpga-arria10", 10962306a36Sopenharmony_ci NULL 11062306a36Sopenharmony_ci}; 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ciDT_MACHINE_START(SOCFPGA_A10, "Altera SOCFPGA Arria10") 11362306a36Sopenharmony_ci .l2c_aux_val = 0, 11462306a36Sopenharmony_ci .l2c_aux_mask = ~0, 11562306a36Sopenharmony_ci .init_irq = socfpga_arria10_init_irq, 11662306a36Sopenharmony_ci .restart = socfpga_arria10_restart, 11762306a36Sopenharmony_ci .dt_compat = altera_a10_dt_match, 11862306a36Sopenharmony_ciMACHINE_END 119