/* * 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 #include #include "addrspace.hh" #include "gpu.hh" #include "regutils.hh" namespace NoMali { const std::vector 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); } }