c274057840
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.
205 lines
5.5 KiB
C++
205 lines
5.5 KiB
C++
/*
|
|
* 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
|