Changeset 32533


Ignore:
Timestamp:
Jul 1, 2017, 12:24:05 PM (3 weeks ago)
Author:
brainslayer
Message:

fix clock instability and fix vpe problems which causes the vpe cores to slowdown and finally hang

Location:
src/linux/universal/linux-3.10/arch/mips
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • src/linux/universal/linux-3.10/arch/mips/include/asm/smp.h

    r21644 r32533  
    1717#include <linux/threads.h>
    1818#include <linux/cpumask.h>
     19#include <linux/cache.h>
    1920
    2021#include <linux/atomic.h>
    2122#include <asm/smp-ops.h>
     23#include <asm/percpu.h>
    2224
    2325extern int smp_num_siblings;
    24 extern cpumask_t cpu_sibling_map[];
     26DECLARE_PER_CPU_SHARED_ALIGNED(cpumask_t, cpu_sibling_map);
    2527
    2628#define raw_smp_processor_id() (current_thread_info()->cpu)
  • src/linux/universal/linux-3.10/arch/mips/kernel/cpu-probe.c

    r21680 r32533  
    175175        if (((config0 & MIPS_CONF_MT) >> 7) == 1)
    176176                c->options |= MIPS_CPU_TLB;
     177        if (((config0 & MIPS_CONF_MT) >> 7) == 4)
     178                c->options |= MIPS_CPU_TLB;
     179
    177180        isa = (config0 & MIPS_CONF_AT) >> 13;
    178181        switch (isa) {
     
    10601063        struct cpuinfo_mips *c = &current_cpu_data;
    10611064
    1062         printk(KERN_INFO "CPU revision is: %08x (%s)\n",
    1063                c->processor_id, cpu_name_string());
     1065        printk(KERN_INFO "CPU%d revision is: %08x (%s)\n",
     1066               smp_processor_id(), c->processor_id, cpu_name_string());
    10641067        if (c->options & MIPS_CPU_FPU)
    10651068                printk(KERN_INFO "FPU revision is: %08x\n", c->fpu_id);
  • src/linux/universal/linux-3.10/arch/mips/kernel/proc.c

    r21994 r32533  
    114114        seq_printf(m, "core\t\t\t: %d\n", cpu_data[n].core);
    115115
     116#if defined(CONFIG_MIPS_MT_SMP) || defined(CONFIG_MIPS_MT_SMTC)
     117        if (cpu_has_mipsmt) {
     118                seq_printf(m, "VPE\t\t\t: %d\n", cpu_data[n].vpe_id);
     119#if defined(CONFIG_MIPS_MT_SMTC)
     120                seq_printf(m, "TC\t\t\t: %d\n", cpu_data[n].tc_id);
     121#endif
     122        }
     123#endif
    116124        sprintf(fmt, "VCE%%c exceptions\t\t: %s\n",
    117125                      cpu_has_vce ? "%u" : "not available");
  • src/linux/universal/linux-3.10/arch/mips/kernel/smp-cmp.c

    r21644 r32533  
    9292        struct cpuinfo_mips *c = &current_cpu_data;
    9393
     94#ifdef CONFIG_SOC_MT7621_OPENWRT
     95        if(cpu_has_veic) {
     96                change_c0_status(ST0_IM, 0);
     97        } else {
     98                change_c0_status(ST0_IM, STATUSF_IP2 | STATUSF_IP3 | STATUSF_IP4 | STATUSF_IP5 | STATUSF_IP6 | STATUSF_IP7);
     99        }
     100#else
    94101        /* Assume GIC is present */
    95102        change_c0_status(ST0_IM, STATUSF_IP3 | STATUSF_IP4 | STATUSF_IP6 |
    96103                                 STATUSF_IP7);
    97 
     104#endif
    98105        /* Enable per-cpu interrupts: platform specific */
    99106
    100         c->core = (read_c0_ebase() >> 1) & 0x1ff;
     107        c->core = (read_c0_ebase() & 0x3ff) >> (fls(smp_num_siblings)-1);
    101108#if defined(CONFIG_MIPS_MT_SMP) || defined(CONFIG_MIPS_MT_SMTC)
    102         c->vpe_id = (read_c0_tcbind() >> TCBIND_CURVPE_SHIFT) & TCBIND_CURVPE;
     109        if (cpu_has_mipsmt)
     110                c->vpe_id = (read_c0_tcbind() >> TCBIND_CURVPE_SHIFT) & TCBIND_CURVPE;
    103111#endif
    104112#ifdef CONFIG_MIPS_MT_SMTC
     
    178186
    179187        if (cpu_has_mipsmt) {
    180                 unsigned int nvpe, mvpconf0 = read_c0_mvpconf0();
     188                unsigned int nvpe = 1;
     189#ifdef CONFIG_MIPS_MT_SMP
     190                unsigned int mvpconf0 = read_c0_mvpconf0();
     191
     192                nvpe = ((mvpconf0 & MVPCONF0_PVPE) >> MVPCONF0_PVPE_SHIFT) + 1;
     193#elif defined(CONFIG_MIPS_MT_SMTC)
     194                unsigned int mvpconf0 = read_c0_mvpconf0();
    181195
    182196                nvpe = ((mvpconf0 & MVPCONF0_PTC) >> MVPCONF0_PTC_SHIFT) + 1;
     197#endif
    183198                smp_num_siblings = nvpe;
    184199        }
  • src/linux/universal/linux-3.10/arch/mips/kernel/smp.c

    r26214 r32533  
    6161
    6262/* representing the TCs (or siblings in Intel speak) of each logical CPU */
    63 cpumask_t cpu_sibling_map[NR_CPUS] __read_mostly;
    64 EXPORT_SYMBOL(cpu_sibling_map);
     63DEFINE_PER_CPU_SHARED_ALIGNED(struct cpumask, cpu_sibling_map);
     64EXPORT_PER_CPU_SYMBOL(cpu_sibling_map);
    6565
    6666/* representing cpus for which sibling maps can be computed */
     
    7676                for_each_cpu_mask(i, cpu_sibling_setup_map) {
    7777                        if (cpu_data[cpu].core == cpu_data[i].core) {
    78                                 cpu_set(i, cpu_sibling_map[cpu]);
    79                                 cpu_set(cpu, cpu_sibling_map[i]);
     78                                cpu_set(i, per_cpu(cpu_sibling_map, cpu));
     79                                cpu_set(cpu, per_cpu(cpu_sibling_map, i));
    8080                        }
    8181                }
    8282        } else
    83                 cpu_set(cpu, cpu_sibling_map[cpu]);
     83                cpu_set(cpu, per_cpu(cpu_sibling_map, cpu));
    8484}
    8585
  • src/linux/universal/linux-3.10/arch/mips/ralink-openwrt/mt7621.c

    r25821 r32533  
    2020#include <asm/mach-ralink-openwrt/ralink_regs.h>
    2121#include <asm/mach-ralink-openwrt/mt7621.h>
     22#include <asm/mips-boards/launch.h>
     23#include <asm/delay.h>
    2224
    2325#include <pinmux.h>
     
    147149}
    148150
     151bool plat_cpu_core_present(int core)
     152{
     153        struct cpulaunch *launch = (struct cpulaunch *)CKSEG0ADDR(CPULAUNCH);
     154
     155        if (!core)
     156                return true;
     157        launch += core * 2; /* 2 VPEs per core */
     158        if (!(launch->flags & LAUNCH_FREADY))
     159                return false;
     160        if (launch->flags & (LAUNCH_FGO | LAUNCH_FGONE))
     161                return false;
     162        return true;
     163}
     164
     165
    149166void prom_soc_init(struct ralink_soc_info *soc_info)
    150167{
     
    183200                panic("failed to register_vsmp_smp_ops()");
    184201}
     202
     203
     204#define LPS_PREC 8
     205/*
     206 *  Re-calibration lpj(loop-per-jiffy).
     207 *  (derived from kernel/calibrate.c)
     208 */
     209static int udelay_recal(void)
     210{
     211        unsigned int i, lpj = 0;
     212        unsigned long ticks, loopbit;
     213        int lps_precision = LPS_PREC;
     214
     215        lpj = (1<<12);
     216
     217        while ((lpj <<= 1) != 0) {
     218                /* wait for "start of" clock tick */
     219                ticks = jiffies;
     220                while (ticks == jiffies)
     221                        /* nothing */;
     222
     223                        /* Go .. */
     224                ticks = jiffies;
     225                __delay(lpj);
     226                ticks = jiffies - ticks;
     227                if (ticks)
     228                        break;
     229        }
     230
     231        /*
     232         * Do a binary approximation to get lpj set to
     233         * equal one clock (up to lps_precision bits)
     234         */
     235        lpj >>= 1;
     236        loopbit = lpj;
     237        while (lps_precision-- && (loopbit >>= 1)) {
     238                lpj |= loopbit;
     239                ticks = jiffies;
     240                while (ticks == jiffies)
     241                                /* nothing */;
     242                ticks = jiffies;
     243                __delay(lpj);
     244                if (jiffies != ticks)   /* longer than 1 tick */
     245                        lpj &= ~loopbit;
     246        }
     247        printk(KERN_INFO "%d CPUs re-calibrate udelay(lpj = %d)\n", NR_CPUS, lpj);
     248
     249        for(i=0; i< NR_CPUS; i++)
     250                cpu_data[i].udelay_val = lpj;
     251
     252#if defined (CONFIG_RALINK_CPUSLEEP) && defined (CONFIG_RALINK_MT7621)
     253        lpj = (*((volatile u32 *)(RALINK_RBUS_MATRIXCTL_BASE + 0x10)));
     254        lpj &= ~(0xF << 8);
     255        lpj |= (0xA << 8);
     256        lpj &= ~(0xF);
     257        lpj |= (0xA);
     258        (*((volatile u32 *)(RALINK_RBUS_MATRIXCTL_BASE + 0x10))) = lpj;
     259#endif
     260
     261        return 0;
     262}
     263device_initcall(udelay_recal);
Note: See TracChangeset for help on using the changeset viewer.