summaryrefslogtreecommitdiffstats
path: root/src/kernel/segmentmgr.C
diff options
context:
space:
mode:
authorPatrick Williams <iawillia@us.ibm.com>2012-01-11 10:25:12 -0600
committerA. Patrick Williams III <iawillia@us.ibm.com>2012-01-18 09:52:45 -0600
commitb699fc329722088174afe6031351d3bddb559f6c (patch)
tree62e2ad43fb7becba393346fbb2aeca1ba140efdf /src/kernel/segmentmgr.C
parent811a7e18fb3630f4af77c545f057aa147b18334c (diff)
downloadtalos-hostboot-b699fc329722088174afe6031351d3bddb559f6c.tar.gz
talos-hostboot-b699fc329722088174afe6031351d3bddb559f6c.zip
Support additional device segments and MMIO blocks
Change-Id: Icd2e9ed7de2c0227b25979622d0f37a77595570a Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/609 Tested-by: Jenkins Server Reviewed-by: MATTHEW S. BARTH <msbarth@us.ibm.com> Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com> Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/kernel/segmentmgr.C')
-rw-r--r--src/kernel/segmentmgr.C48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/kernel/segmentmgr.C b/src/kernel/segmentmgr.C
index 0b4370cfa..6659c634c 100644
--- a/src/kernel/segmentmgr.C
+++ b/src/kernel/segmentmgr.C
@@ -24,9 +24,11 @@
#include <errno.h>
#include <arch/ppc.H>
#include <util/singleton.H>
+#include <kernel/console.H>
#include <kernel/segmentmgr.H>
#include <kernel/segment.H>
+#include <kernel/devicesegment.H>
bool SegmentManager::handlePageFault(task_t* i_task, uint64_t i_addr)
{
@@ -60,6 +62,16 @@ void SegmentManager::castOutPages(uint64_t i_type)
Singleton<SegmentManager>::instance()._castOutPages(i_type);
}
+void* SegmentManager::devMap(void* ra, uint64_t i_devDataSize)
+{
+ return Singleton<SegmentManager>::instance()._devMap(ra, i_devDataSize);
+}
+
+int SegmentManager::devUnmap(void* ea)
+{
+ return Singleton<SegmentManager>::instance()._devUnmap(ea);
+}
+
bool SegmentManager::_handlePageFault(task_t* i_task, uint64_t i_addr)
{
size_t segId = getSegmentIdFromAddress(i_addr);
@@ -146,3 +158,39 @@ void SegmentManager::_castOutPages(uint64_t i_type)
}
}
}
+
+void* SegmentManager::_devMap(void* ra, uint64_t i_devDataSize)
+{
+ void* ea = NULL;
+ for (size_t i = MMIO_FIRST_SEGMENT_ID; i <= MMIO_LAST_SEGMENT_ID; i++)
+ {
+ if (NULL == iv_segments[i]) continue;
+
+ ea = reinterpret_cast<DeviceSegment*>(iv_segments[i])->
+ devMap(ra, i_devDataSize);
+
+ if (ea != NULL) break;
+ }
+
+ if (ea == NULL)
+ {
+ printk("SegmentManager: Ran out of device segment blocks.\n");
+ }
+
+ return ea;
+}
+
+int SegmentManager::_devUnmap(void* ea)
+{
+ size_t segId = getSegmentIdFromAddress(reinterpret_cast<uint64_t>(ea));
+ if ((segId < MMIO_FIRST_SEGMENT_ID) ||
+ (segId > MMIO_LAST_SEGMENT_ID) ||
+ (NULL == iv_segments[segId]))
+ {
+ return -EINVAL;
+ }
+
+ return reinterpret_cast<DeviceSegment*>(iv_segments[segId])->devUnmap(ea);
+}
+
+
OpenPOWER on IntegriCloud