| /* |
| * 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); |
| } |
| |
| } |