diff options
author | Andreas Sandberg <andreas.sandberg@arm.com> | 2015-07-07 10:03:13 +0100 |
---|---|---|
committer | Andreas Sandberg <andreas.sandberg@arm.com> | 2015-07-07 10:03:13 +0100 |
commit | c2740578404b4e46d198de70af1cfd554033d99f (patch) | |
tree | bb97478f7d31251d5b1bb0013b6b06b16ca0712c /ext/nomali/lib/gpu.cc | |
parent | a0cbf5541133e58968919991635797babaad2a18 (diff) | |
download | gem5-c2740578404b4e46d198de70af1cfd554033d99f.tar.xz |
ext: Add the NoMali GPU no-simulation library
Add revision 9adf9d6e2d889a483a92136c96eb8a434d360561 of NoMali-model
from https://github.com/ARM-software/nomali-model. This library
implements the register interface of the Mali T6xx/T7xx series GPUs,
but doesn't do any rendering. It can be used to hide the effects of
software rendering.
Diffstat (limited to 'ext/nomali/lib/gpu.cc')
-rw-r--r-- | ext/nomali/lib/gpu.cc | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/ext/nomali/lib/gpu.cc b/ext/nomali/lib/gpu.cc new file mode 100644 index 000000000..88646ab36 --- /dev/null +++ b/ext/nomali/lib/gpu.cc @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2014-2015 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. + */ + +#include "gpu.hh" + +#include "gpucontrol.hh" +#include "jobcontrol.hh" +#include "mmu.hh" +#include "regutils.hh" + +namespace NoMali { + +GPU::GPU(GPUControl &gc, JobControl &jc, MMU &_mmu) + : gpuControl(gc), jobControl(jc), mmu(_mmu), + blocks({&gpuControl, // REG_BLOCK_GPU + &jobControl, // REG_BLOCK_JOB + &mmu}) // REG_BLOCK_MMU +{ +} + +GPU::~GPU() +{ +} + +void +GPU::reset() +{ + for (auto *block : blocks) + block->reset(); +} + +uint32_t +GPU::readReg(RegAddr addr) +{ + GPUBlock * const block(getGPUBlock(addr)); + + return block ? block->readReg(getBlockReg(addr)) : 0; +} + +void +GPU::writeReg(RegAddr addr, uint32_t value) +{ + GPUBlock * const block(getGPUBlock(addr)); + + if (block) + block->writeReg(getBlockReg(addr), value); +} + +uint32_t +GPU::readRegRaw(RegAddr addr) +{ + GPUBlock * const block(getGPUBlock(addr)); + + return block ? block->readRegRaw(getBlockReg(addr)) : 0; +} + +void +GPU::writeRegRaw(RegAddr addr, uint32_t value) +{ + GPUBlock * const block(getGPUBlock(addr)); + + if (block) + block->writeRegRaw(getBlockReg(addr), value); +} + + +bool +GPU::intGPUAsserted() const +{ + return gpuControl.intAsserted(); +} + +bool +GPU::intJobAsserted() const +{ + return jobControl.intAsserted(); +} + +bool +GPU::intMMUAsserted() const +{ + return mmu.intAsserted(); +} + + +GPUBlock * +GPU::getGPUBlock(RegAddr addr) +{ + const RegBlock block(getRegBlock(addr)); + const uint16_t block_no(static_cast<uint16_t>(block)); + + if (block_no < blocks.size()) + return blocks[block_no]; + else + return nullptr; +} + +} |