summaryrefslogtreecommitdiffstats
path: root/src/kernel/misc.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/misc.C')
-rw-r--r--src/kernel/misc.C47
1 files changed, 47 insertions, 0 deletions
diff --git a/src/kernel/misc.C b/src/kernel/misc.C
index e280a1527..6d7e866f6 100644
--- a/src/kernel/misc.C
+++ b/src/kernel/misc.C
@@ -314,6 +314,51 @@ namespace KernelMisc
kassert(false);
}
+ int expand_half_cache()
+ {
+ static bool executed = false;
+
+ if (executed) // Why are we being called a second time?
+ {
+ return -EFAULT;
+ }
+
+ uint64_t startAddr = 512*KILOBYTE;
+ uint64_t endAddr = 1*MEGABYTE;
+
+ size_t cache_columns = 0;
+
+ switch(CpuID::getCpuType())
+ {
+ case CORE_POWER8_MURANO:
+ case CORE_POWER8_VENICE:
+ cache_columns = 4;
+ break;
+
+ default:
+ kassert(false);
+ break;
+ }
+
+ for (size_t i = 0; i < cache_columns; i++)
+ {
+ size_t offset = i * MEGABYTE;
+ populate_cache_lines(
+ reinterpret_cast<uint64_t*>(startAddr + offset),
+ reinterpret_cast<uint64_t*>(endAddr + offset));
+
+ PageManager::addMemory(startAddr + offset,
+ (512*KILOBYTE)/PAGESIZE);
+ }
+
+ executed = true;
+
+ KernelMemState::setMemScratchReg(KernelMemState::MEM_CONTAINED_L3,
+ KernelMemState::HALF_CACHE);
+
+ return 0;
+ }
+
int expand_full_cache()
{
static bool executed = false;
@@ -334,8 +379,10 @@ namespace KernelMisc
( VmmManager::INITIAL_MEM_SIZE ) ;
endAddr =
reinterpret_cast<uint64_t*>(8 * MEGABYTE);
+ break;
default:
+ kassert(false);
break;
}
OpenPOWER on IntegriCloud