~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/arm/mach-hisi/platsmp.c

Version: ~ [ linux-6.11-rc3 ] ~ [ linux-6.10.4 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.45 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.104 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.164 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.223 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.281 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.319 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /arch/arm/mach-hisi/platsmp.c (Version linux-6.11-rc3) and /arch/sparc/mach-hisi/platsmp.c (Version linux-6.8.12)


  1 // SPDX-License-Identifier: GPL-2.0-only            1 
  2 /*                                                
  3  * Copyright (c) 2013 Linaro Ltd.                 
  4  * Copyright (c) 2013 HiSilicon Limited.          
  5  * Based on arch/arm/mach-vexpress/platsmp.c,     
  6  */                                               
  7 #include <linux/smp.h>                            
  8 #include <linux/io.h>                             
  9 #include <linux/of_address.h>                     
 10 #include <linux/delay.h>                          
 11                                                   
 12 #include <asm/cacheflush.h>                       
 13 #include <asm/smp_plat.h>                         
 14 #include <asm/smp_scu.h>                          
 15 #include <asm/mach/map.h>                         
 16                                                   
 17 #include "core.h"                                 
 18                                                   
 19 #define HIX5HD2_BOOT_ADDRESS            0xffff    
 20                                                   
 21 static void __iomem *ctrl_base;                   
 22                                                   
 23 void hi3xxx_set_cpu_jump(int cpu, void *jump_a    
 24 {                                                 
 25         cpu = cpu_logical_map(cpu);               
 26         if (!cpu || !ctrl_base)                   
 27                 return;                           
 28         writel_relaxed(__pa_symbol(jump_addr),    
 29 }                                                 
 30                                                   
 31 int hi3xxx_get_cpu_jump(int cpu)                  
 32 {                                                 
 33         cpu = cpu_logical_map(cpu);               
 34         if (!cpu || !ctrl_base)                   
 35                 return 0;                         
 36         return readl_relaxed(ctrl_base + ((cpu    
 37 }                                                 
 38                                                   
 39 static void __init hisi_enable_scu_a9(void)       
 40 {                                                 
 41         unsigned long base = 0;                   
 42         void __iomem *scu_base = NULL;            
 43                                                   
 44         if (scu_a9_has_base()) {                  
 45                 base = scu_a9_get_base();         
 46                 scu_base = ioremap(base, SZ_4K    
 47                 if (!scu_base) {                  
 48                         pr_err("ioremap(scu_ba    
 49                         return;                   
 50                 }                                 
 51                 scu_enable(scu_base);             
 52                 iounmap(scu_base);                
 53         }                                         
 54 }                                                 
 55                                                   
 56 static void __init hi3xxx_smp_prepare_cpus(uns    
 57 {                                                 
 58         struct device_node *np = NULL;            
 59         u32 offset = 0;                           
 60                                                   
 61         hisi_enable_scu_a9();                     
 62         if (!ctrl_base) {                         
 63                 np = of_find_compatible_node(N    
 64                 if (!np) {                        
 65                         pr_err("failed to find    
 66                         return;                   
 67                 }                                 
 68                 ctrl_base = of_iomap(np, 0);      
 69                 if (!ctrl_base) {                 
 70                         of_node_put(np);          
 71                         pr_err("failed to map     
 72                         return;                   
 73                 }                                 
 74                 if (of_property_read_u32(np, "    
 75                         of_node_put(np);          
 76                         pr_err("failed to find    
 77                         return;                   
 78                 }                                 
 79                 ctrl_base += offset;              
 80                 of_node_put(np);                  
 81         }                                         
 82 }                                                 
 83                                                   
 84 static int hi3xxx_boot_secondary(unsigned int     
 85 {                                                 
 86         hi3xxx_set_cpu(cpu, true);                
 87         hi3xxx_set_cpu_jump(cpu, secondary_sta    
 88         arch_send_wakeup_ipi_mask(cpumask_of(c    
 89         return 0;                                 
 90 }                                                 
 91                                                   
 92 static const struct smp_operations hi3xxx_smp_    
 93         .smp_prepare_cpus       = hi3xxx_smp_p    
 94         .smp_boot_secondary     = hi3xxx_boot_    
 95 #ifdef CONFIG_HOTPLUG_CPU                         
 96         .cpu_die                = hi3xxx_cpu_d    
 97         .cpu_kill               = hi3xxx_cpu_k    
 98 #endif                                            
 99 };                                                
100                                                   
101 static void __init hisi_common_smp_prepare_cpu    
102 {                                                 
103         hisi_enable_scu_a9();                     
104 }                                                 
105                                                   
106 static void hix5hd2_set_scu_boot_addr(phys_add    
107 {                                                 
108         void __iomem *virt;                       
109                                                   
110         virt = ioremap(start_addr, PAGE_SIZE);    
111                                                   
112         writel_relaxed(0xe51ff004, virt);         
113         writel_relaxed(jump_addr, virt + 4);      
114         iounmap(virt);                            
115 }                                                 
116                                                   
117 static int hix5hd2_boot_secondary(unsigned int    
118 {                                                 
119         phys_addr_t jumpaddr;                     
120                                                   
121         jumpaddr = __pa_symbol(secondary_start    
122         hix5hd2_set_scu_boot_addr(HIX5HD2_BOOT    
123         hix5hd2_set_cpu(cpu, true);               
124         arch_send_wakeup_ipi_mask(cpumask_of(c    
125         return 0;                                 
126 }                                                 
127                                                   
128                                                   
129 static const struct smp_operations hix5hd2_smp    
130         .smp_prepare_cpus       = hisi_common_    
131         .smp_boot_secondary     = hix5hd2_boot    
132 #ifdef CONFIG_HOTPLUG_CPU                         
133         .cpu_die                = hix5hd2_cpu_    
134 #endif                                            
135 };                                                
136                                                   
137                                                   
138 #define SC_SCTL_REMAP_CLR      0x00000100         
139 #define HIP01_BOOT_ADDRESS     0x80000000         
140 #define REG_SC_CTRL            0x000              
141                                                   
142 static void hip01_set_boot_addr(phys_addr_t st    
143 {                                                 
144         void __iomem *virt;                       
145                                                   
146         virt = phys_to_virt(start_addr);          
147                                                   
148         writel_relaxed(0xe51ff004, virt);         
149         writel_relaxed(jump_addr, virt + 4);      
150 }                                                 
151                                                   
152 static int hip01_boot_secondary(unsigned int c    
153 {                                                 
154         phys_addr_t jumpaddr;                     
155         unsigned int remap_reg_value = 0;         
156         struct device_node *node;                 
157                                                   
158                                                   
159         jumpaddr = __pa_symbol(secondary_start    
160         hip01_set_boot_addr(HIP01_BOOT_ADDRESS    
161                                                   
162         node = of_find_compatible_node(NULL, N    
163         if (WARN_ON(!node))                       
164                 return -1;                        
165         ctrl_base = of_iomap(node, 0);            
166         of_node_put(node);                        
167                                                   
168         /* set the secondary core boot from DD    
169         remap_reg_value = readl_relaxed(ctrl_b    
170         barrier();                                
171         remap_reg_value |= SC_SCTL_REMAP_CLR;     
172         barrier();                                
173         writel_relaxed(remap_reg_value, ctrl_b    
174                                                   
175         hip01_set_cpu(cpu, true);                 
176                                                   
177         return 0;                                 
178 }                                                 
179                                                   
180 static const struct smp_operations hip01_smp_o    
181         .smp_prepare_cpus       = hisi_common_    
182         .smp_boot_secondary     = hip01_boot_s    
183 };                                                
184                                                   
185 CPU_METHOD_OF_DECLARE(hi3xxx_smp, "hisilicon,h    
186 CPU_METHOD_OF_DECLARE(hix5hd2_smp, "hisilicon,    
187 CPU_METHOD_OF_DECLARE(hip01_smp, "hisilicon,hi    
188                                                   

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php