summaryrefslogtreecommitdiffstats
path: root/src/include
diff options
context:
space:
mode:
authorPatrick Williams <iawillia@us.ibm.com>2010-07-08 17:42:40 -0500
committerPatrick Williams <iawillia@us.ibm.com>2010-07-08 17:42:40 -0500
commit204c3d248426c2ba0b332c05994d67a80f49f958 (patch)
treed0bbf0ca1b17349458cc938fd08846fa1c74e2ff /src/include
parent2c2101232adf2b134cf408f05f00a21dc5b8b0f3 (diff)
downloadtalos-hostboot-204c3d248426c2ba0b332c05994d67a80f49f958.tar.gz
talos-hostboot-204c3d248426c2ba0b332c05994d67a80f49f958.zip
MMIO mapping support and syscalls.
Diffstat (limited to 'src/include')
-rw-r--r--src/include/kernel/ppcarch.H18
-rw-r--r--src/include/kernel/syscalls.H3
-rw-r--r--src/include/kernel/vmmmgr.H40
-rw-r--r--src/include/sys/mmio.h18
4 files changed, 69 insertions, 10 deletions
diff --git a/src/include/kernel/ppcarch.H b/src/include/kernel/ppcarch.H
index 71d4516d4..91ee138a2 100644
--- a/src/include/kernel/ppcarch.H
+++ b/src/include/kernel/ppcarch.H
@@ -58,4 +58,22 @@ inline void ppc_setMSR(uint64_t _msr)
asm volatile("mtmsr %0; isync" :: "r" (msr));
}
+__attribute__((always_inline))
+inline uint64_t ppc_getDSISR()
+{
+ register uint64_t dsisr = 0;
+ asm volatile("mfspr %0, 18" : "=r" (dsisr));
+ return dsisr;
+}
+
+__attribute__((always_inline))
+inline uint64_t ppc_getDAR()
+{
+ register uint64_t dar = 0;
+ asm volatile("mfspr %0, 19" : "=r" (dar));
+ return dar;
+}
+
+
+
#endif
diff --git a/src/include/kernel/syscalls.H b/src/include/kernel/syscalls.H
index 9a0672d63..a33a0cef7 100644
--- a/src/include/kernel/syscalls.H
+++ b/src/include/kernel/syscalls.H
@@ -25,6 +25,9 @@ namespace Systemcalls
MSG_RESPOND,
MSG_WAIT,
+ MMIO_MAP,
+ MMIO_UNMAP,
+
SYSCALL_MAX
};
};
diff --git a/src/include/kernel/vmmmgr.H b/src/include/kernel/vmmmgr.H
index e55595ed5..a8bb5ae3f 100644
--- a/src/include/kernel/vmmmgr.H
+++ b/src/include/kernel/vmmmgr.H
@@ -2,6 +2,7 @@
#define __KERNEL_VMMMGR_H
#include <kernel/types.h>
+#include <kernel/spinlock.H>
class VmmManager
{
@@ -26,6 +27,7 @@ class VmmManager
enum ACCESS_TYPES
{
NO_USER_ACCESS,
+ READ_O_ACCESS,
NORMAL_ACCESS,
CI_ACCESS,
};
@@ -37,32 +39,49 @@ class VmmManager
FirstPid,
};
+ enum MMIO_SPACE_INFO
+ {
+ MMIO_T_ENTRIES =
+ FULL_MEM_SIZE * (MMIOSpace - LinearSpace) / PAGESIZE,
+ };
+
static void init();
static void init_slb();
+ static bool pteMiss(task_t*);
+
+ static void* mmioMap(void*, size_t);
+ static int mmioUnmap(void*, size_t);
protected:
VmmManager();
~VmmManager() {};
private:
+ Spinlock lock;
+ uint64_t mmioMapT[MMIO_T_ENTRIES];
+
void initSLB();
void initPTEs();
void initSDR1();
+ bool _pteMiss(task_t*);
+ void* _mmioMap(void*, size_t);
+ int _mmioUnmap(void*, size_t);
+
static pte_t* page_table;
- inline pte_t& getPte(uint64_t pteg, uint64_t idx)
+ inline volatile pte_t& getPte(uint64_t pteg, uint64_t idx)
{
return page_table[pteg * PTEG_SIZE + idx];
}
- inline void defaultPte(pte_t& pte)
+ inline void defaultPte(volatile pte_t& pte)
{
pte.a = 0x4000000000000000; // B = 01 (1TB).
pte.b = 0x0;
}
- inline void setValid(bool valid, pte_t& pte)
+ inline void setValid(bool valid, volatile pte_t& pte)
{
// Adding a page requires EIEIO to ensure update of PTE prior
// to making valid and PTESYNC afterwards.
@@ -78,39 +97,40 @@ class VmmManager
asm volatile("ptesync" ::: "memory");
}
- inline bool isValid(pte_t& pte)
+ inline bool isValid(volatile pte_t& pte)
{
return ((pte.a & 0x01) == 0x01);
}
- inline void setTid(tid_t tid, pte_t& pte)
+ inline void setTid(tid_t tid, volatile pte_t& pte)
{
pte.a &= 0xC00000000000007F;
pte.a |= ((uint64_t) tid) << 7;
}
- inline tid_t getTid(pte_t& pte)
+ inline tid_t getTid(volatile pte_t& pte)
{
return (tid_t) ((pte.a & 0xC00000000000007F) >> 7);
}
- inline void setAccess(ACCESS_TYPES t, pte_t& pte)
+ inline void setAccess(ACCESS_TYPES t, volatile pte_t& pte)
{
uint64_t pteMask = ~0x800000000000007B;
pte.b &= pteMask;
pte.b |= (NO_USER_ACCESS == t ? 0x0000000000000010 :
+ (READ_O_ACCESS == t ? 0x0000000000000011 :
(NORMAL_ACCESS == t ? 0x0000000000000012 :
(CI_ACCESS == t ? 0x000000000000002A :
- 0x0)));
+ 0x0))));
}
- inline void setPage(uint64_t page, pte_t& pte)
+ inline void setPage(uint64_t page, volatile pte_t& pte)
{
pte.b &= ~0x0FFFFFFFFFFFF000;
pte.b |= page << 12;
}
- inline uint64_t getPage(pte_t& pte)
+ inline uint64_t getPage(volatile pte_t& pte)
{
return (pte.b & 0x0FFFFFFFFFFFF000) >> 12;
}
diff --git a/src/include/sys/mmio.h b/src/include/sys/mmio.h
new file mode 100644
index 000000000..6a0e7a02b
--- /dev/null
+++ b/src/include/sys/mmio.h
@@ -0,0 +1,18 @@
+#ifndef __SYS_MMIO_H
+#define __SYS_MMIO_H
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+void* mmio_map(void* ra, size_t pages);
+int mmio_unmap(void* ea, size_t pages);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
OpenPOWER on IntegriCloud