source: trunk/target/linux/lantiq/patches-2.6.39/260-ar9-cache-split.patch @ 27104

Last change on this file since 27104 was 27104, checked in by florian, 5 years ago

[kernel] update to 2.6.39.1

patch from Peter Wagner

File size: 8.9 KB
  • arch/mips/Kconfig

    a b config IFX_VPE_EXT 
    18781878        help 
    18791879          IFX included extensions in APRP 
    18801880 
     1881config IFX_VPE_CACHE_SPLIT 
     1882        bool "IFX Cache Split Ways" 
     1883        depends on IFX_VPE_EXT 
     1884        help 
     1885          IFX extension for reserving (splitting) cache ways among VPEs. You must 
     1886          give kernel command line arguments vpe_icache_shared=0 or 
     1887          vpe_dcache_shared=0 to enable splitting of icache or dcache 
     1888          respectively. Then you can specify which cache ways should be 
     1889          assigned to which VPE. There are total 8 cache ways, 4 each 
     1890          for dcache and icache: dcache_way0, dcache_way1,dcache_way2, 
     1891          dcache_way3 and icache_way0,icache_way1, icache_way2,icache_way3. 
     1892 
     1893          For example, if you specify vpe_icache_shared=0 and icache_way2=1, 
     1894          then the 3rd icache way will be assigned to VPE0 and denied in VPE1. 
     1895 
     1896          For icache, software is required to make at least one cache way available 
     1897          for a VPE at all times i.e., one can't assign all the icache ways to one 
     1898          VPE. 
     1899 
     1900          By default, vpe_dcache_shared and vpe_icache_shared are set to 1 
     1901          (i.e., both icache and dcache are shared among VPEs) 
     1902 
    18811903config PERFCTRS 
    18821904        bool "34K Performance counters" 
    18831905        depends on MIPS_MT && PROC_FS 
  • arch/mips/kernel/vpe.c

    a b __setup("vpe1_wdog_timeout=", wdog_timeo 
    128128EXPORT_SYMBOL(vpe1_wdog_timeout); 
    129129 
    130130#endif 
     131 
     132#ifdef CONFIG_IFX_VPE_CACHE_SPLIT /* Code for splitting the cache ways among VPEs. */ 
     133extern int vpe_icache_shared,vpe_dcache_shared; 
     134extern int icache_way0,icache_way1,icache_way2,icache_way3; 
     135extern int dcache_way0,dcache_way1,dcache_way2,dcache_way3; 
     136#endif 
     137 
    131138/* grab the likely amount of memory we will need. */ 
    132139#ifdef CONFIG_MIPS_VPE_LOADER_TOM 
    133140#define P_SIZE (2 * 1024 * 1024) 
    static int vpe_run(struct vpe * v) 
    866873        /* enable this VPE */ 
    867874        write_vpe_c0_vpeconf0(read_vpe_c0_vpeconf0() | VPECONF0_VPA); 
    868875 
     876#ifdef CONFIG_IFX_VPE_CACHE_SPLIT 
     877        if ( (!vpe_icache_shared) || (!vpe_dcache_shared) ) { 
     878 
     879                /* PCP bit must be 1 to split the cache */ 
     880                if(read_c0_mvpconf0() & MVPCONF0_PCP) { 
     881 
     882                        if ( !vpe_icache_shared ){ 
     883                                write_vpe_c0_vpeconf0((read_vpe_c0_vpeconf0()) & ~VPECONF0_ICS); 
     884 
     885                                /* 
     886                                 * If any cache way is 1, then that way is denied 
     887                                 * in VPE1. Otherwise assign that way to VPE1. 
     888                                 */ 
     889                                if (!icache_way0) 
     890                                        write_vpe_c0_vpeopt(read_vpe_c0_vpeopt() | VPEOPT_IWX0 ); 
     891                                else 
     892                                        write_vpe_c0_vpeopt(read_vpe_c0_vpeopt() & ~VPEOPT_IWX0 ); 
     893                                if (!icache_way1) 
     894                                        write_vpe_c0_vpeopt(read_vpe_c0_vpeopt() | VPEOPT_IWX1 ); 
     895                                else 
     896                                        write_vpe_c0_vpeopt(read_vpe_c0_vpeopt() & ~VPEOPT_IWX1 ); 
     897                                if (!icache_way2) 
     898                                        write_vpe_c0_vpeopt(read_vpe_c0_vpeopt() | VPEOPT_IWX2 ); 
     899                                else 
     900                                        write_vpe_c0_vpeopt(read_vpe_c0_vpeopt() & ~VPEOPT_IWX2 ); 
     901                                if (!icache_way3) 
     902                                        write_vpe_c0_vpeopt(read_vpe_c0_vpeopt() | VPEOPT_IWX3 ); 
     903                                else 
     904                                        write_vpe_c0_vpeopt(read_vpe_c0_vpeopt() & ~VPEOPT_IWX3 ); 
     905                        } 
     906 
     907                        if ( !vpe_dcache_shared ) { 
     908                                write_vpe_c0_vpeconf0((read_vpe_c0_vpeconf0()) & ~VPECONF0_DCS); 
     909 
     910                                /* 
     911                                 * If any cache way is 1, then that way is denied 
     912                                 * in VPE1. Otherwise assign that way to VPE1. 
     913                                 */ 
     914                                if (!dcache_way0) 
     915                                        write_vpe_c0_vpeopt(read_vpe_c0_vpeopt() | VPEOPT_DWX0 ); 
     916                                else 
     917                                        write_vpe_c0_vpeopt(read_vpe_c0_vpeopt() & ~VPEOPT_DWX0 ); 
     918                                if (!dcache_way1) 
     919                                        write_vpe_c0_vpeopt(read_vpe_c0_vpeopt() | VPEOPT_DWX1 ); 
     920                                else 
     921                                        write_vpe_c0_vpeopt(read_vpe_c0_vpeopt() & ~VPEOPT_DWX1 ); 
     922                                if (!dcache_way2) 
     923                                        write_vpe_c0_vpeopt(read_vpe_c0_vpeopt() | VPEOPT_DWX2 ); 
     924                                else 
     925                                        write_vpe_c0_vpeopt(read_vpe_c0_vpeopt() & ~VPEOPT_DWX2 ); 
     926                                if (!dcache_way3) 
     927                                        write_vpe_c0_vpeopt(read_vpe_c0_vpeopt() | VPEOPT_DWX3 ); 
     928                                else 
     929                                        write_vpe_c0_vpeopt(read_vpe_c0_vpeopt() & ~VPEOPT_DWX3 ); 
     930                        } 
     931                } 
     932        } 
     933#endif /* endif CONFIG_IFX_VPE_CACHE_SPLIT */ 
     934 
    869935        /* clear out any left overs from a previous program */ 
    870936        write_vpe_c0_status(0); 
    871937        write_vpe_c0_cause(0); 
  • arch/mips/mm/c-r4k.c

    a b static int __init setcoherentio(char *st 
    13451345__setup("coherentio", setcoherentio); 
    13461346#endif 
    13471347 
     1348#ifdef CONFIG_IFX_VPE_CACHE_SPLIT /* Code for splitting the cache ways among VPEs. */ 
     1349 
     1350#include <asm/mipsmtregs.h> 
     1351 
     1352/* 
     1353 * By default, vpe_icache_shared and vpe_dcache_shared 
     1354 * values are 1 i.e., both icache and dcache are shared 
     1355 * among the VPEs. 
     1356 */ 
     1357 
     1358int vpe_icache_shared = 1; 
     1359static int __init vpe_icache_shared_val(char *str) 
     1360{ 
     1361        get_option(&str, &vpe_icache_shared); 
     1362        return 1; 
     1363} 
     1364__setup("vpe_icache_shared=", vpe_icache_shared_val); 
     1365EXPORT_SYMBOL(vpe_icache_shared); 
     1366 
     1367int vpe_dcache_shared = 1; 
     1368static int __init vpe_dcache_shared_val(char *str) 
     1369{ 
     1370        get_option(&str, &vpe_dcache_shared); 
     1371        return 1; 
     1372} 
     1373__setup("vpe_dcache_shared=", vpe_dcache_shared_val); 
     1374EXPORT_SYMBOL(vpe_dcache_shared); 
     1375 
     1376/* 
     1377 * Software is required to make atleast one icache 
     1378 * way available for a VPE at all times i.e., one 
     1379 * can't assign all the icache ways to one VPE. 
     1380 */ 
     1381 
     1382int icache_way0 = 0; 
     1383static int __init icache_way0_val(char *str) 
     1384{ 
     1385        get_option(&str, &icache_way0); 
     1386        return 1; 
     1387} 
     1388__setup("icache_way0=", icache_way0_val); 
     1389 
     1390int icache_way1 = 0; 
     1391static int __init icache_way1_val(char *str) 
     1392{ 
     1393        get_option(&str, &icache_way1); 
     1394        return 1; 
     1395} 
     1396__setup("icache_way1=", icache_way1_val); 
     1397 
     1398int icache_way2 = 0; 
     1399static int __init icache_way2_val(char *str) 
     1400{ 
     1401        get_option(&str, &icache_way2); 
     1402        return 1; 
     1403} 
     1404__setup("icache_way2=", icache_way2_val); 
     1405 
     1406int icache_way3 = 0; 
     1407static int __init icache_way3_val(char *str) 
     1408{ 
     1409        get_option(&str, &icache_way3); 
     1410        return 1; 
     1411} 
     1412__setup("icache_way3=", icache_way3_val); 
     1413 
     1414int dcache_way0 = 0; 
     1415static int __init dcache_way0_val(char *str) 
     1416{ 
     1417        get_option(&str, &dcache_way0); 
     1418        return 1; 
     1419} 
     1420__setup("dcache_way0=", dcache_way0_val); 
     1421 
     1422int dcache_way1 = 0; 
     1423static int __init dcache_way1_val(char *str) 
     1424{ 
     1425        get_option(&str, &dcache_way1); 
     1426        return 1; 
     1427} 
     1428__setup("dcache_way1=", dcache_way1_val); 
     1429 
     1430int dcache_way2 = 0; 
     1431static int __init dcache_way2_val(char *str) 
     1432{ 
     1433        get_option(&str, &dcache_way2); 
     1434        return 1; 
     1435} 
     1436__setup("dcache_way2=", dcache_way2_val); 
     1437 
     1438int dcache_way3 = 0; 
     1439static int __init dcache_way3_val(char *str) 
     1440{ 
     1441        get_option(&str, &dcache_way3); 
     1442        return 1; 
     1443} 
     1444__setup("dcache_way3=", dcache_way3_val); 
     1445 
     1446#endif /* endif CONFIG_IFX_VPE_CACHE_SPLIT */ 
     1447 
    13481448void __cpuinit r4k_cache_init(void) 
    13491449{ 
    13501450        extern void build_clear_page(void); 
    void __cpuinit r4k_cache_init(void) 
    13641464                break; 
    13651465        } 
    13661466 
     1467#ifdef CONFIG_IFX_VPE_CACHE_SPLIT 
     1468        /* 
     1469         * We split the cache ways appropriately among the VPEs 
     1470         * based on cache ways values we received as command line 
     1471         * arguments 
     1472         */ 
     1473        if ( (!vpe_icache_shared) || (!vpe_dcache_shared) ){ 
     1474 
     1475                /* PCP bit must be 1 to split the cache */ 
     1476                if(read_c0_mvpconf0() & MVPCONF0_PCP) { 
     1477 
     1478                        /* Set CPA bit which enables us to modify VPEOpt register */ 
     1479                        write_c0_mvpcontrol((read_c0_mvpcontrol()) | MVPCONTROL_CPA); 
     1480 
     1481                        if ( !vpe_icache_shared ){ 
     1482                                write_c0_vpeconf0((read_c0_vpeconf0()) & ~VPECONF0_ICS); 
     1483                                /* 
     1484                                 * If any cache way is 1, then that way is denied 
     1485                                 * in VPE0. Otherwise assign that way to VPE0. 
     1486                                 */ 
     1487                                printk(KERN_DEBUG "icache is split\n"); 
     1488                                printk(KERN_DEBUG "icache_way0=%d icache_way1=%d icache_way2=%d icache_way3=%d\n", 
     1489                                        icache_way0, icache_way1,icache_way2, icache_way3); 
     1490                                if (icache_way0) 
     1491                                        write_c0_vpeopt(read_c0_vpeopt() | VPEOPT_IWX0 ); 
     1492                                else 
     1493                                        write_c0_vpeopt(read_c0_vpeopt() & ~VPEOPT_IWX0 ); 
     1494                                if (icache_way1) 
     1495                                        write_c0_vpeopt(read_c0_vpeopt() | VPEOPT_IWX1 ); 
     1496                                else 
     1497                                        write_c0_vpeopt(read_c0_vpeopt() & ~VPEOPT_IWX1 ); 
     1498                                if (icache_way2) 
     1499                                        write_c0_vpeopt(read_c0_vpeopt() | VPEOPT_IWX2 ); 
     1500                                else 
     1501                                        write_c0_vpeopt(read_c0_vpeopt() & ~VPEOPT_IWX2 ); 
     1502                                if (icache_way3) 
     1503                                        write_c0_vpeopt(read_c0_vpeopt() | VPEOPT_IWX3 ); 
     1504                                else 
     1505                                        write_c0_vpeopt(read_c0_vpeopt() & ~VPEOPT_IWX3 ); 
     1506                        } 
     1507 
     1508                        if ( !vpe_dcache_shared ) { 
     1509                                /* 
     1510                                 * If any cache way is 1, then that way is denied 
     1511                                 * in VPE0. Otherwise assign that way to VPE0. 
     1512                                 */ 
     1513                                printk(KERN_DEBUG "dcache is split\n"); 
     1514                                printk(KERN_DEBUG "dcache_way0=%d dcache_way1=%d dcache_way2=%d dcache_way3=%d\n", 
     1515                                        dcache_way0, dcache_way1, dcache_way2, dcache_way3); 
     1516                                write_c0_vpeconf0((read_c0_vpeconf0()) & ~VPECONF0_DCS); 
     1517                                if (dcache_way0) 
     1518                                        write_c0_vpeopt(read_c0_vpeopt() | VPEOPT_DWX0 ); 
     1519                                else 
     1520                                        write_c0_vpeopt(read_c0_vpeopt() & ~VPEOPT_DWX0 ); 
     1521                                if (dcache_way1) 
     1522                                        write_c0_vpeopt(read_c0_vpeopt() | VPEOPT_DWX1 ); 
     1523                                else 
     1524                                        write_c0_vpeopt(read_c0_vpeopt() & ~VPEOPT_DWX1 ); 
     1525                                if (dcache_way2) 
     1526                                        write_c0_vpeopt(read_c0_vpeopt() | VPEOPT_DWX2 ); 
     1527                                else 
     1528                                        write_c0_vpeopt(read_c0_vpeopt() & ~VPEOPT_DWX2 ); 
     1529                                if (dcache_way3) 
     1530                                        write_c0_vpeopt(read_c0_vpeopt() | VPEOPT_DWX3 ); 
     1531                                else 
     1532                                        write_c0_vpeopt(read_c0_vpeopt() & ~VPEOPT_DWX3 ); 
     1533                        } 
     1534                } 
     1535        } 
     1536 
     1537#endif /* endif CONFIG_IFX_VPE_CACHE_SPLIT */ 
     1538 
    13671539        probe_pcache(); 
    13681540        setup_scache(); 
    13691541 
Note: See TracBrowser for help on using the repository browser.