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

TOMOYO Linux Cross Reference
Linux/arch/mips/kernel/mips-cpc.c

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ 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.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /arch/mips/kernel/mips-cpc.c (Version linux-6.12-rc7) and /arch/ppc/kernel/mips-cpc.c (Version linux-4.4.302)


  1 // SPDX-License-Identifier: GPL-2.0-or-later        1 
  2 /*                                                
  3  * Copyright (C) 2013 Imagination Technologies    
  4  * Author: Paul Burton <paul.burton@mips.com>     
  5  */                                               
  6                                                   
  7 #include <linux/bitfield.h>                       
  8 #include <linux/errno.h>                          
  9 #include <linux/percpu.h>                         
 10 #include <linux/of.h>                             
 11 #include <linux/of_address.h>                     
 12 #include <linux/spinlock.h>                       
 13                                                   
 14 #include <asm/mips-cps.h>                         
 15                                                   
 16 void __iomem *mips_cpc_base;                      
 17                                                   
 18 static DEFINE_PER_CPU_ALIGNED(spinlock_t, cpc_    
 19                                                   
 20 static DEFINE_PER_CPU_ALIGNED(unsigned long, c    
 21                                                   
 22 phys_addr_t __weak mips_cpc_default_phys_base(    
 23 {                                                 
 24         struct device_node *cpc_node;             
 25         struct resource res;                      
 26         int err;                                  
 27                                                   
 28         cpc_node = of_find_compatible_node(of_    
 29         if (cpc_node) {                           
 30                 err = of_address_to_resource(c    
 31                 of_node_put(cpc_node);            
 32                 if (!err)                         
 33                         return res.start;         
 34         }                                         
 35                                                   
 36         return 0;                                 
 37 }                                                 
 38                                                   
 39 /**                                               
 40  * mips_cpc_phys_base - retrieve the physical     
 41  *                                                
 42  * This function returns the physical base add    
 43  * Controller memory mapped registers, or 0 if    
 44  * is present.                                    
 45  */                                               
 46 static phys_addr_t mips_cpc_phys_base(void)       
 47 {                                                 
 48         unsigned long cpc_base;                   
 49                                                   
 50         if (!mips_cm_present())                   
 51                 return 0;                         
 52                                                   
 53         if (!(read_gcr_cpc_status() & CM_GCR_C    
 54                 return 0;                         
 55                                                   
 56         /* If the CPC is already enabled, leav    
 57         cpc_base = read_gcr_cpc_base();           
 58         if (cpc_base & CM_GCR_CPC_BASE_CPCEN)     
 59                 return cpc_base & CM_GCR_CPC_B    
 60                                                   
 61         /* Otherwise, use the default address     
 62         cpc_base = mips_cpc_default_phys_base(    
 63         if (!cpc_base)                            
 64                 return cpc_base;                  
 65                                                   
 66         /* Enable the CPC, mapped at the defau    
 67         write_gcr_cpc_base(cpc_base | CM_GCR_C    
 68         return cpc_base;                          
 69 }                                                 
 70                                                   
 71 int mips_cpc_probe(void)                          
 72 {                                                 
 73         phys_addr_t addr;                         
 74         unsigned int cpu;                         
 75                                                   
 76         for_each_possible_cpu(cpu)                
 77                 spin_lock_init(&per_cpu(cpc_co    
 78                                                   
 79         addr = mips_cpc_phys_base();              
 80         if (!addr)                                
 81                 return -ENODEV;                   
 82                                                   
 83         mips_cpc_base = ioremap(addr, 0x8000);    
 84         if (!mips_cpc_base)                       
 85                 return -ENXIO;                    
 86                                                   
 87         return 0;                                 
 88 }                                                 
 89                                                   
 90 void mips_cpc_lock_other(unsigned int core)       
 91 {                                                 
 92         unsigned int curr_core;                   
 93                                                   
 94         if (mips_cm_revision() >= CM_REV_CM3)     
 95                 /* Systems with CM >= 3 lock t    
 96                 return;                           
 97                                                   
 98         preempt_disable();                        
 99         curr_core = cpu_core(&current_cpu_data    
100         spin_lock_irqsave(&per_cpu(cpc_core_lo    
101                           per_cpu(cpc_core_loc    
102         write_cpc_cl_other(FIELD_PREP(CPC_Cx_O    
103                                                   
104         /*                                        
105          * Ensure the core-other region reflec    
106          * VP before any accesses to it occur.    
107          */                                       
108         mb();                                     
109 }                                                 
110                                                   
111 void mips_cpc_unlock_other(void)                  
112 {                                                 
113         unsigned int curr_core;                   
114                                                   
115         if (mips_cm_revision() >= CM_REV_CM3)     
116                 /* Systems with CM >= 3 lock t    
117                 return;                           
118                                                   
119         curr_core = cpu_core(&current_cpu_data    
120         spin_unlock_irqrestore(&per_cpu(cpc_co    
121                                per_cpu(cpc_cor    
122         preempt_enable();                         
123 }                                                 
124                                                   

~ [ 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