summaryrefslogtreecommitdiff
path: root/ext/nomali/lib/addrspace.cc
diff options
context:
space:
mode:
Diffstat (limited to 'ext/nomali/lib/addrspace.cc')
-rw-r--r--ext/nomali/lib/addrspace.cc125
1 files changed, 125 insertions, 0 deletions
diff --git a/ext/nomali/lib/addrspace.cc b/ext/nomali/lib/addrspace.cc
new file mode 100644
index 000000000..bbb6bce33
--- /dev/null
+++ b/ext/nomali/lib/addrspace.cc
@@ -0,0 +1,125 @@
+/*
+ * Copyright (c) 2016 ARM Limited
+ * All rights reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Authors: Andreas Sandberg
+ */
+
+#include "jobslot.hh"
+
+#include <cassert>
+#include <cstdlib>
+
+#include "addrspace.hh"
+#include "gpu.hh"
+#include "regutils.hh"
+
+namespace NoMali {
+
+const std::vector<AddrSpace::cmd_t> AddrSpace::cmds {
+ &AddrSpace::cmdNop, // ASn_COMMAND_NOP
+ &AddrSpace::cmdUpdate, // ASn_COMMAND_UPDATE
+ &AddrSpace::cmdLock, // ASn_COMMAND_LOCK
+ &AddrSpace::cmdUnlock, // ASn_COMMAND_UNLOCK
+ &AddrSpace::cmdFlushPT, // ASn_COMMAND_FLUSH_PT
+ &AddrSpace::cmdFlushMem, // ASn_COMMAND_FLUSH_MEM
+};
+
+AddrSpace::AddrSpace(GPU &_gpu, MMU &_mmu, uint8_t _id)
+ : GPUBlock(_gpu, ASn_NO_REGS),
+ id(_id),
+ mmu(_mmu)
+{
+}
+
+AddrSpace::AddrSpace(AddrSpace &&rhs)
+ : GPUBlock(std::move(rhs)),
+ id(std::move(rhs.id)),
+ mmu(rhs.mmu)
+{
+}
+
+AddrSpace::~AddrSpace()
+{
+}
+
+void
+AddrSpace::writeReg(RegAddr addr, uint32_t value)
+{
+ switch (addr.value) {
+ case ASn_COMMAND:
+ asCommand(value);
+ break;
+
+ case ASn_TRANSTAB_LO:
+ case ASn_TRANSTAB_HI:
+ case ASn_MEMATTR_LO:
+ case ASn_MEMATTR_HI:
+ case ASn_LOCKADDR_LO:
+ case ASn_LOCKADDR_HI:
+ GPUBlock::writeReg(addr, value);
+ break;
+
+ default:
+ // Ignore writes by default
+ break;
+ };
+}
+
+void
+AddrSpace::asCommand(uint32_t cmd)
+{
+ if (cmd < cmds.size())
+ (this->*cmds[cmd])(cmd);
+}
+
+void
+AddrSpace::cmdNop(uint32_t cmd)
+{
+ assert(cmd == ASn_COMMAND_NOP);
+}
+
+
+void
+AddrSpace::cmdUpdate(uint32_t cmd)
+{
+ assert(cmd == ASn_COMMAND_UPDATE);
+}
+
+void
+AddrSpace::cmdLock(uint32_t cmd)
+{
+ assert(cmd == ASn_COMMAND_LOCK);
+}
+
+void
+AddrSpace::cmdUnlock(uint32_t cmd)
+{
+ assert(cmd == ASn_COMMAND_UNLOCK);
+}
+
+void
+AddrSpace::cmdFlushPT(uint32_t cmd)
+{
+ assert(cmd == ASn_COMMAND_FLUSH_PT);
+}
+
+void
+AddrSpace::cmdFlushMem(uint32_t cmd)
+{
+ assert(cmd == ASn_COMMAND_FLUSH_MEM);
+}
+
+}