diff options
Diffstat (limited to 'ext/nomali/lib/addrspace.cc')
-rw-r--r-- | ext/nomali/lib/addrspace.cc | 125 |
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); +} + +} |