diff options
Diffstat (limited to 'ext/nomali/lib/gpu.hh')
-rw-r--r-- | ext/nomali/lib/gpu.hh | 205 |
1 files changed, 205 insertions, 0 deletions
diff --git a/ext/nomali/lib/gpu.hh b/ext/nomali/lib/gpu.hh new file mode 100644 index 000000000..f167f1012 --- /dev/null +++ b/ext/nomali/lib/gpu.hh @@ -0,0 +1,205 @@ +/* + * 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. + * + * Authors: Andreas Sandberg + */ + +#ifndef _LIBNOMALIMODEL_GPU_HH +#define _LIBNOMALIMODEL_GPU_HH + +#include <vector> + +#include "types.hh" + +namespace NoMali { + +class GPUBlock; +class GPUControl; +class JobControl; +class MMU; + +/** + * Top-level GPU component (abstract). + */ +class GPU +{ + public: + /** + * Instantiate a GPU from a set of functional blocks. + * + * @param gpuControl GPU control implementation. + * @param jobControl Job control implementation. + * @param mmu MMU implementation. + */ + GPU(GPUControl &gpuControl, JobControl &jobControl, MMU &mmu); + virtual ~GPU() = 0; + + /** + * Reset the whole GPU + * + * The default implementation of this method calls the reset() on + * all the function blocks. Function blocks in turn typically sets + * all registers to zero. + */ + virtual void reset(); + + + /** + * @{ + * @name Register Interface + */ + + /** + * Read a register value from the GPU. + * + * This method decodes the address to find the function block an + * access is intended for and forward the register access to that + * block. The access that reaches the block does not include the + * block base address. + * + * @param addr Register address to read. + * @return Value of the register. + */ + virtual uint32_t readReg(RegAddr addr); + + /** + * Write a register value to the GPU. + * + * This method decodes the address to find the function block an + * access is intended for and forward the register access to that + * block. The access that reaches the block does not include the + * block base address. + * + * @param addr Target address for the write operation. + * @param value Value to write. + */ + virtual void writeReg(RegAddr addr, uint32_t value); + + /** + * Read a register value from the GPU without side effects. + * + * This method decodes the address to find the function block an + * access is intended for and forward the register access to that + * block. The access that reaches the block does not include the + * block base address. + * + * Unlike a normal read (readReg()), this method does not include + * any side effects and reads straight from the register file. It + * is primarily intended for things checkpointing. + * + * @param addr Register address to read. + * @return Value of the register. + */ + virtual uint32_t readRegRaw(RegAddr addr); + + /** + * Write a register value to the GPU without side effects. + * + * This method decodes the address to find the function block an + * access is intended for and forward the register access to that + * block. The access that reaches the block does not include the + * block base address. + * + * Unlike a normal write (writeReg()), this method does not + * include any side effects and writes straight into the register + * file. It is primarily intended for things checkpointing. + * + * @param addr Target address for the write operation. + * @param value Value to write. + */ + virtual void writeRegRaw(RegAddr addr, uint32_t value); + + /** @} */ + + /** + * @{ + * @name Callbacks + */ + + /** + * Job interrupt state change + * + * @param set Non-zero if raising interrupt, zero if clearing. + */ + virtual void intJob(int set) {}; + /** + * MMU interrupt state change + * + * @param set Non-zero if raising interrupt, zero if clearing. + */ + virtual void intMMU(int set) {}; + /** + * GPU interrupt state change + * + * @param set Non-zero if raising interrupt, zero if clearing. + */ + virtual void intGPU(int set) {}; + + /** @} */ + + + /** + * Check if the GPU interrupt has been asserted. + * + * @see GPUControl::intAsserted() + * + * @return true if the GPU control block reports that an interrupt + * has been asserted. + */ + bool intGPUAsserted() const; + /** + * Check if the job interrupt has been asserted. + * + * @see JobControl::intAsserted() + * + * @return true if the job control block reports that an interrupt + * has been asserted. + */ + bool intJobAsserted() const; + /** + * Check if the MMU interrupt has been asserted. + * + * @see JobControl::intAsserted() + * + * @return true if the GPU control block reports that an interrupt + * has been asserted. + */ + bool intMMUAsserted() const; + + private: + /** + * Resolve an address into a functional block within the GPU. + * + * @return Valid pointer or NULL if address is out of range. + */ + GPUBlock *getGPUBlock(RegAddr addr); + + GPUControl &gpuControl; + JobControl &jobControl; + MMU &mmu; + + /** + * Vector of control blocks. + * + * @note The order <i>MUST</i> have the same correspond to the + * values in the RegBlock enum. + */ + const std::vector<GPUBlock *> blocks; +}; + +} + +#endif // _LIBNOMALIMODEL_GPU_HH |