highmem test

1. 下面是使能highmem 和添加 highmem memory region的一个补丁:

diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index 428e767..25c8499 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -69,6 +69,7 @@ config BCM5621X
        select CSRC_R4K
        select DMA_NONCOHERENT
        select IRQ_CPU
+       select SYS_SUPPORTS_HIGHMEM
        select SYS_HAS_CPU_MIPS32_R1
        select SYS_SUPPORTS_32BIT_KERNEL
        select SYS_SUPPORTS_BIG_ENDIAN
diff --git a/arch/mips/bcm5621x/prom.c b/arch/mips/bcm5621x/prom.c
index 6a716ff..bf17fc0 100644
--- a/arch/mips/bcm5621x/prom.c
+++ b/arch/mips/bcm5621x/prom.c
@@ -175,6 +175,12 @@ static __init void prom_meminit(void)
                                  BOOT_MEM_RESERVED);
        }
 #endif
+
+       /*
+       * Due to the physical liner address space 128M~256M used for I/O space in BCM956218 core sheet.
+       * So we need to map the 128M~256M DDR space to HIGHMEM space to use. Xiaoqiang.Jia@WindRiver.com
+       */
+       add_memory_region(0x88000000UL,0x8000000,BOOT_MEM_RAM);
 }
 
 #ifdef CONFIG_BLK_DEV_INITRD

2. 这是一个test highmem的简单程序: 

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
//#include "string.h"

#define SIZE_128M_RAM 128*1024*1024

int main(int argc ,char**argv[])
{
        char *p256m = NULL;


        //分配128M内存,并初始化
        p256m= malloc(SIZE_128M_RAM);
  
        memset(p256m, 0 , SIZE_128M_RAM);

        // 让他一直在运行
        while(1);

        return 0;

}


3. 运行测试程序:

# cat /proc/meminfo 

MemTotal:       223756 kB

MemFree:        190136 kB

Buffers:           112 kB

Cached:           2364 kB

SwapCached:          0 kB

Active:            984 kB

Inactive:         1656 kB

HighTotal:      131072 kB

HighFree:       100072 kB

LowTotal:        92684 kB

LowFree:         90064 kB

SwapTotal:           0 kB

SwapFree:            0 kB

Dirty:               4 kB

Writeback:           0 kB

AnonPages:         180 kB

Mapped:            784 kB

Slab:             1860 kB

SReclaimable:      152 kB

SUnreclaim:       1708 kB

PageTables:         60 kB

NFS_Unstable:        0 kB

Bounce:              0 kB

WritebackTmp:        0 kB

CommitLimit:    111876 kB

Committed_AS:      876 kB

VmallocTotal:  1015800 kB

VmallocUsed:       444 kB

VmallocChunk:  1015356 kB

# chmod 777 /bin/test_128m_ram 

# ./bin/test_128m_ram &

++++++++++test for highmem........start alloc 128M ram space +++++++++++++++++++++++++++++++++

++++++++++test for highmem.......memset 128M ram space to really used higmem++++++++++++++++++

# ++++++++++test for highmem......alloc successfully++++++++++++++++++++++++++++++++++++++++++++

 

# jobs

[1] + Running                    ./bin/test_128m_ram

# cat /proc/meminfo 

MemTotal:       223756 kB

MemFree:         57816 kB

Buffers:           112 kB

Cached:           2380 kB

SwapCached:          0 kB

Active:         132124 kB

Inactive:         1656 kB

HighTotal:      131072 kB

HighFree:          448 kB

LowTotal:        92684 kB

LowFree:         57368 kB

SwapTotal:           0 kB

SwapFree:            0 kB

Dirty:              20 kB

Writeback:           0 kB

AnonPages:      131308 kB

Mapped:            796 kB

Slab:             2888 kB

SReclaimable:      156 kB

SUnreclaim:       2732 kB

PageTables:        208 kB

NFS_Unstable:        0 kB

Bounce:              0 kB

WritebackTmp:        0 kB

CommitLimit:    111876 kB

Committed_AS:   132172 kB

VmallocTotal:  1015800 kB

VmallocUsed:       444 kB

VmallocChunk:  1015356 kB

# ps

  PID USER       VSZ STAT COMMAND

    1 root      3196 S    init       

    2 root         0 SW<  [kthreadd]

    3 root         0 SW<  [ksoftirqd/0]

    4 root         0 SW<  [watchdog/0]

    5 root         0 SW<  [events/0]

    6 root         0 SW<  [khelper]

   27 root         0 SW<  [kblockd/0]

   48 root         0 SW   [pdflush]

   50 root         0 SW<  [kswapd0]

   92 root         0 SW<  [aio/0]

  100 root         0 SW<  [unionfs_siod/0]

  101 root         0 SW<  [nfsiod]

  699 root         0 SW<  [bond0]

  710 root         0 SW<  [mtdblockd]

  744 root         0 SW<  [rpciod/0]

  748 root         0 SW   [pdflush]

  755 root      3372 R    -/bin/sh 

  759 root      129m R    ./bin/test_128m_ram 

  761 root      3372 R    ps 

# jobs

[1] + Running                    ./bin/test_128m_ram

# fg

./bin/test_128m_ram

^C

# jobs

# cat /proc/meminfo 

MemTotal:       223756 kB

MemFree:        189956 kB

Buffers:           112 kB

Cached:           2380 kB

SwapCached:          0 kB

Active:           1112 kB

Inactive:         1540 kB

HighTotal:      131072 kB

HighFree:        99988 kB

LowTotal:        92684 kB

LowFree:         89968 kB

SwapTotal:           0 kB

SwapFree:            0 kB

Dirty:              36 kB

Writeback:           0 kB

AnonPages:         180 kB

Mapped:            788 kB

Slab:             1892 kB

SReclaimable:      172 kB

SUnreclaim:       1720 kB

PageTables:         60 kB

NFS_Unstable:        0 kB

Bounce:              0 kB

WritebackTmp:        0 kB

CommitLimit:    111876 kB

Committed_AS:      876 kB

VmallocTotal:  1015800 kB

VmallocUsed:       444 kB

VmallocChunk:  1015356 kB

#


void mt_mem_init(void) 68 { 69 #ifdef LAST_DRAMC 70 dram_fatal_exception_detection_start(); 71 72 if (check_last_dram_fatal_exception() != 0 || check_gating_err_in_dramc_latch() != 0) { 73 #if SUPPORT_SAVE_TIME_FOR_CALIBRATION 74 int ret; 75 print("[save time for cal] dram fatal exception found -> clear calibration data\n"); 76 ret = clean_dram_calibration_data(); 77 SET_DATA_FORMATTED_STORAGE_API_ERR(); 78 print("[save time for cal] clean_dram_calibration_data done (ret=%d)\n", ret); 79 #endif 80 } 81 #endif 82 83 /* clear EMI MPU protection */ 84 clr_emi_mpu_prot(); 85 86 /* disable EMI APB protection */ 87 dis_emi_apb_prot(); 88 89 //*(volatile unsigned int *) 0x10012010 = 0x0; /* clr force Vcore OPP_0 */ 90 #ifdef DDR_RESERVE_MODE 91 if((g_ddr_reserve_enable==1) && (g_ddr_reserve_success==1)) { 92 //*(volatile unsigned int *) 0x10012010 = 0x6000; /* force Vcore OPP_0 == disable Vcore DVFS */ 93 disable_dvfsrc(); 94 if (g_ddr_reserve_ta_err != 0) { 95 print("[DDR Reserve mode] TA2 ERR = %d -> overwrite tag.ddr_reserve_success to 0\n", g_ddr_reserve_ta_err); 96 } 97 98 emi_init2(); 99 } else /* normal boot */ 100 #endif 101 { 102 /* force clear RGU control for DRAMC before calibration */ 103 drm_release_rg_dramc_conf_iso();//Release DRAMC/PHY conf ISO 104 drm_release_rg_dramc_iso();//Release PHY IO ISO 105 drm_release_rg_dramc_sref();//Let DRAM Leave SR 106 107 mt_set_emi (); 108 109 #if defined(LAST_DRAMC) & SUPPORT_SAVE_TIME_FOR_CALIBRATION 110 set_err_code_for_storage_api(); 111 #endif 112 } 113 114 #if MEM_TEST 115 unsigned rk0_err = 0, rk1_err = 0; 116 int i = 0; 117 118 #ifdef DDR_RESERVE_MODE 119 g_ddr_reserve_ready = 0x9502; 120 /* Disable DDR-reserve mode in pre-loader stage then enable it again in kernel stage */ 121 drm_dram_reserved(0); 122 #endif 123 124 /* CFG_UBOOT_MEMADDR is LK base addr */ 125 if ((i = complex_mem_test(CFG_UBOOT_MEMADDR, MEM_TEST_SIZE)) == 0) { 126 print ("[%s] 1st complex R/W mem test pass (start addr:0x%x)\n", MOD, CFG_UBOOT_MEMADDR); 127 } else { 128 print ("[%s] 1st complex R/W mem test fail :%x (start addr:0x%x)\n", MOD, i, CFG_UBOOT_MEMADDR); 129 #ifdef LAST_DRAMC 130 rk0_err = 1; 131 #else 132 ASSERT(0); 133 #endif 134 } 135 136 if (get_dram_rank_nr() >= 2) { 137 /* need to test rank1 */ 138 unsigned int rank1_start_address = DDR_BASE + set_emi_before_rank1_mem_test(); 139 140 #ifdef DDR_RESERVE_MODE 141 /* simple mem test to avoid memory corruption in DDR reserve mode */ 142 if((g_ddr_reserve_enable==1) && (g_ddr_reserve_success==1)) { 143 i = simple_mem_test(rank1_start_address, MEM_TEST_SIZE); 144 } else 145 #endif 146 i = complex_mem_test(rank1_start_address, MEM_TEST_SIZE); 147 restore_emi_after_rank1_mem_test(); 148 if (i == 0) { 149 print("[%s] 2nd complex R/W mem test pass (start addr:0x%x, 0x0 @Rank1)\n", MOD, rank1_start_address); 150 } else { 151 print("[%s] 2nd complex R/W mem test fail :%x (start addr:0x%x, 0x0 @Rank1)\n", MOD, i, rank1_start_address); 152 #ifdef LAST_DRAMC 153 rk1_err = 1; 154 #else 155 ASSERT(0); 156 #endif 157 } 158 } 159 160 record_emi_snst(); 161 162 #ifdef LAST_DRAMC 163 init_ta2_all_channel(); 164 dram_fatal_set_cpu_rw_err((rk1_err << 1)|rk0_err); 165 166 /* TODO: TA2 test */ 167 168 /* check gating error */ 169 check_gating_error(); 170 171 if (check_dram_fatal_exception() == 1) { 172 print("[dramc] fatal dram exception found! reset system..\n"); 173 while(1); 174 } 175 dram_fatal_exception_detection_end(); 176 #endif 177 178 #endif 179 }
最新发布
08-19
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值