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

Last change on this file since 28308 was 28308, checked in by blogic, 5 years ago

[lantiq]

  • rebase 3.0 patches
  • fold some fixes into existing patches
File size: 8.9 KB
  • arch/mips/Kconfig

    a b config IFX_VPE_EXT 
    19121912        help 
    19131913          IFX included extensions in APRP 
    19141914 
     1915config IFX_VPE_CACHE_SPLIT 
     1916        bool "IFX Cache Split Ways" 
     1917        depends on IFX_VPE_EXT 
     1918        help 
     1919          IFX extension for reserving (splitting) cache ways among VPEs. You must 
     1920          give kernel command line arguments vpe_icache_shared=0 or 
     1921          vpe_dcache_shared=0 to enable splitting of icache or dcache 
     1922          respectively. Then you can specify which cache ways should be 
     1923          assigned to which VPE. There are total 8 cache ways, 4 each 
     1924          for dcache and icache: dcache_way0, dcache_way1,dcache_way2, 
     1925          dcache_way3 and icache_way0,icache_way1, icache_way2,icache_way3. 
     1926 
     1927          For example, if you specify vpe_icache_shared=0 and icache_way2=1, 
     1928          then the 3rd icache way will be assigned to VPE0 and denied in VPE1. 
     1929 
     1930          For icache, software is required to make at least one cache way available 
     1931          for a VPE at all times i.e., one can't assign all the icache ways to one 
     1932          VPE. 
     1933 
     1934          By default, vpe_dcache_shared and vpe_icache_shared are set to 1 
     1935          (i.e., both icache and dcache are shared among VPEs) 
     1936 
    19151937config PERFCTRS 
    19161938        bool "34K Performance counters" 
    19171939        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 
    13461346__setup("coherentio", setcoherentio); 
    13471347#endif 
    13481348 
     1349#ifdef CONFIG_IFX_VPE_CACHE_SPLIT /* Code for splitting the cache ways among VPEs. */ 
     1350 
     1351#include <asm/mipsmtregs.h> 
     1352 
     1353/* 
     1354 * By default, vpe_icache_shared and vpe_dcache_shared 
     1355 * values are 1 i.e., both icache and dcache are shared 
     1356 * among the VPEs. 
     1357 */ 
     1358 
     1359int vpe_icache_shared = 1; 
     1360static int __init vpe_icache_shared_val(char *str) 
     1361{ 
     1362        get_option(&str, &vpe_icache_shared); 
     1363        return 1; 
     1364} 
     1365__setup("vpe_icache_shared=", vpe_icache_shared_val); 
     1366EXPORT_SYMBOL(vpe_icache_shared); 
     1367 
     1368int vpe_dcache_shared = 1; 
     1369static int __init vpe_dcache_shared_val(char *str) 
     1370{ 
     1371        get_option(&str, &vpe_dcache_shared); 
     1372        return 1; 
     1373} 
     1374__setup("vpe_dcache_shared=", vpe_dcache_shared_val); 
     1375EXPORT_SYMBOL(vpe_dcache_shared); 
     1376 
     1377/* 
     1378 * Software is required to make atleast one icache 
     1379 * way available for a VPE at all times i.e., one 
     1380 * can't assign all the icache ways to one VPE. 
     1381 */ 
     1382 
     1383int icache_way0 = 0; 
     1384static int __init icache_way0_val(char *str) 
     1385{ 
     1386        get_option(&str, &icache_way0); 
     1387        return 1; 
     1388} 
     1389__setup("icache_way0=", icache_way0_val); 
     1390 
     1391int icache_way1 = 0; 
     1392static int __init icache_way1_val(char *str) 
     1393{ 
     1394        get_option(&str, &icache_way1); 
     1395        return 1; 
     1396} 
     1397__setup("icache_way1=", icache_way1_val); 
     1398 
     1399int icache_way2 = 0; 
     1400static int __init icache_way2_val(char *str) 
     1401{ 
     1402        get_option(&str, &icache_way2); 
     1403        return 1; 
     1404} 
     1405__setup("icache_way2=", icache_way2_val); 
     1406 
     1407int icache_way3 = 0; 
     1408static int __init icache_way3_val(char *str) 
     1409{ 
     1410        get_option(&str, &icache_way3); 
     1411        return 1; 
     1412} 
     1413__setup("icache_way3=", icache_way3_val); 
     1414 
     1415int dcache_way0 = 0; 
     1416static int __init dcache_way0_val(char *str) 
     1417{ 
     1418        get_option(&str, &dcache_way0); 
     1419        return 1; 
     1420} 
     1421__setup("dcache_way0=", dcache_way0_val); 
     1422 
     1423int dcache_way1 = 0; 
     1424static int __init dcache_way1_val(char *str) 
     1425{ 
     1426        get_option(&str, &dcache_way1); 
     1427        return 1; 
     1428} 
     1429__setup("dcache_way1=", dcache_way1_val); 
     1430 
     1431int dcache_way2 = 0; 
     1432static int __init dcache_way2_val(char *str) 
     1433{ 
     1434        get_option(&str, &dcache_way2); 
     1435        return 1; 
     1436} 
     1437__setup("dcache_way2=", dcache_way2_val); 
     1438 
     1439int dcache_way3 = 0; 
     1440static int __init dcache_way3_val(char *str) 
     1441{ 
     1442        get_option(&str, &dcache_way3); 
     1443        return 1; 
     1444} 
     1445__setup("dcache_way3=", dcache_way3_val); 
     1446 
     1447#endif /* endif CONFIG_IFX_VPE_CACHE_SPLIT */ 
     1448 
    13491449void __cpuinit r4k_cache_init(void) 
    13501450{ 
    13511451        extern void build_clear_page(void); 
    void __cpuinit r4k_cache_init(void) 
    13651465                break; 
    13661466        } 
    13671467 
     1468#ifdef CONFIG_IFX_VPE_CACHE_SPLIT 
     1469        /* 
     1470         * We split the cache ways appropriately among the VPEs 
     1471         * based on cache ways values we received as command line 
     1472         * arguments 
     1473         */ 
     1474        if ( (!vpe_icache_shared) || (!vpe_dcache_shared) ){ 
     1475 
     1476                /* PCP bit must be 1 to split the cache */ 
     1477                if(read_c0_mvpconf0() & MVPCONF0_PCP) { 
     1478 
     1479                        /* Set CPA bit which enables us to modify VPEOpt register */ 
     1480                        write_c0_mvpcontrol((read_c0_mvpcontrol()) | MVPCONTROL_CPA); 
     1481 
     1482                        if ( !vpe_icache_shared ){ 
     1483                                write_c0_vpeconf0((read_c0_vpeconf0()) & ~VPECONF0_ICS); 
     1484                                /* 
     1485                                 * If any cache way is 1, then that way is denied 
     1486                                 * in VPE0. Otherwise assign that way to VPE0. 
     1487                                 */ 
     1488                                printk(KERN_DEBUG "icache is split\n"); 
     1489                                printk(KERN_DEBUG "icache_way0=%d icache_way1=%d icache_way2=%d icache_way3=%d\n", 
     1490                                        icache_way0, icache_way1,icache_way2, icache_way3); 
     1491                                if (icache_way0) 
     1492                                        write_c0_vpeopt(read_c0_vpeopt() | VPEOPT_IWX0 ); 
     1493                                else 
     1494                                        write_c0_vpeopt(read_c0_vpeopt() & ~VPEOPT_IWX0 ); 
     1495                                if (icache_way1) 
     1496                                        write_c0_vpeopt(read_c0_vpeopt() | VPEOPT_IWX1 ); 
     1497                                else 
     1498                                        write_c0_vpeopt(read_c0_vpeopt() & ~VPEOPT_IWX1 ); 
     1499                                if (icache_way2) 
     1500                                        write_c0_vpeopt(read_c0_vpeopt() | VPEOPT_IWX2 ); 
     1501                                else 
     1502                                        write_c0_vpeopt(read_c0_vpeopt() & ~VPEOPT_IWX2 ); 
     1503                                if (icache_way3) 
     1504                                        write_c0_vpeopt(read_c0_vpeopt() | VPEOPT_IWX3 ); 
     1505                                else 
     1506                                        write_c0_vpeopt(read_c0_vpeopt() & ~VPEOPT_IWX3 ); 
     1507                        } 
     1508 
     1509                        if ( !vpe_dcache_shared ) { 
     1510                                /* 
     1511                                 * If any cache way is 1, then that way is denied 
     1512                                 * in VPE0. Otherwise assign that way to VPE0. 
     1513                                 */ 
     1514                                printk(KERN_DEBUG "dcache is split\n"); 
     1515                                printk(KERN_DEBUG "dcache_way0=%d dcache_way1=%d dcache_way2=%d dcache_way3=%d\n", 
     1516                                        dcache_way0, dcache_way1, dcache_way2, dcache_way3); 
     1517                                write_c0_vpeconf0((read_c0_vpeconf0()) & ~VPECONF0_DCS); 
     1518                                if (dcache_way0) 
     1519                                        write_c0_vpeopt(read_c0_vpeopt() | VPEOPT_DWX0 ); 
     1520                                else 
     1521                                        write_c0_vpeopt(read_c0_vpeopt() & ~VPEOPT_DWX0 ); 
     1522                                if (dcache_way1) 
     1523                                        write_c0_vpeopt(read_c0_vpeopt() | VPEOPT_DWX1 ); 
     1524                                else 
     1525                                        write_c0_vpeopt(read_c0_vpeopt() & ~VPEOPT_DWX1 ); 
     1526                                if (dcache_way2) 
     1527                                        write_c0_vpeopt(read_c0_vpeopt() | VPEOPT_DWX2 ); 
     1528                                else 
     1529                                        write_c0_vpeopt(read_c0_vpeopt() & ~VPEOPT_DWX2 ); 
     1530                                if (dcache_way3) 
     1531                                        write_c0_vpeopt(read_c0_vpeopt() | VPEOPT_DWX3 ); 
     1532                                else 
     1533                                        write_c0_vpeopt(read_c0_vpeopt() & ~VPEOPT_DWX3 ); 
     1534                        } 
     1535                } 
     1536        } 
     1537 
     1538#endif /* endif CONFIG_IFX_VPE_CACHE_SPLIT */ 
     1539 
    13681540        probe_pcache(); 
    13691541        setup_scache(); 
    13701542 
Note: See TracBrowser for help on using the repository browser.