regutils.hh revision 10915
110915Sandreas.sandberg@arm.com/* 210915Sandreas.sandberg@arm.com * Copyright (c) 2014-2015 ARM Limited 310915Sandreas.sandberg@arm.com * All rights reserved 410915Sandreas.sandberg@arm.com * 510915Sandreas.sandberg@arm.com * Licensed under the Apache License, Version 2.0 (the "License"); 610915Sandreas.sandberg@arm.com * you may not use this file except in compliance with the License. 710915Sandreas.sandberg@arm.com * You may obtain a copy of the License at 810915Sandreas.sandberg@arm.com * 910915Sandreas.sandberg@arm.com * http://www.apache.org/licenses/LICENSE-2.0 1010915Sandreas.sandberg@arm.com * 1110915Sandreas.sandberg@arm.com * Unless required by applicable law or agreed to in writing, software 1210915Sandreas.sandberg@arm.com * distributed under the License is distributed on an "AS IS" BASIS, 1310915Sandreas.sandberg@arm.com * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1410915Sandreas.sandberg@arm.com * See the License for the specific language governing permissions and 1510915Sandreas.sandberg@arm.com * limitations under the License. 1610915Sandreas.sandberg@arm.com * 1710915Sandreas.sandberg@arm.com * Authors: Andreas Sandberg 1810915Sandreas.sandberg@arm.com */ 1910915Sandreas.sandberg@arm.com 2010915Sandreas.sandberg@arm.com#ifndef _LIBNOMALIMODEL_REGUTILS_HH 2110915Sandreas.sandberg@arm.com#define _LIBNOMALIMODEL_REGUTILS_HH 2210915Sandreas.sandberg@arm.com 2310915Sandreas.sandberg@arm.com#include <cassert> 2410915Sandreas.sandberg@arm.com 2510915Sandreas.sandberg@arm.com#include "types.hh" 2610915Sandreas.sandberg@arm.com#include "mali_midg_regmap.h" 2710915Sandreas.sandberg@arm.com 2810915Sandreas.sandberg@arm.comnamespace NoMali { 2910915Sandreas.sandberg@arm.com 3010915Sandreas.sandberg@arm.com/** Size of a function block in bytes */ 3110915Sandreas.sandberg@arm.comstatic const uint32_t BLOCK_REGS_SIZE(0x1000); 3210915Sandreas.sandberg@arm.com/** Number of registers in a function block */ 3310915Sandreas.sandberg@arm.comstatic const uint32_t BLOCK_NUM_REGS = BLOCK_REGS_SIZE >> 2; 3410915Sandreas.sandberg@arm.com 3510915Sandreas.sandberg@arm.com/** 3610915Sandreas.sandberg@arm.com * Register blocks within the GPU. 3710915Sandreas.sandberg@arm.com * 3810915Sandreas.sandberg@arm.com * The GPU splits its register space into chunks belonging to specific 3910915Sandreas.sandberg@arm.com * blocks. This enum lists those blocks. 4010915Sandreas.sandberg@arm.com */ 4110915Sandreas.sandberg@arm.comenum class RegBlock : uint16_t { 4210915Sandreas.sandberg@arm.com GPU = 0x0, 4310915Sandreas.sandberg@arm.com JOB = 0x1, 4410915Sandreas.sandberg@arm.com MMU = 0x2, 4510915Sandreas.sandberg@arm.com 4610915Sandreas.sandberg@arm.com UNKNOWN = 0xFFFF, 4710915Sandreas.sandberg@arm.com}; 4810915Sandreas.sandberg@arm.com 4910915Sandreas.sandberg@arm.com/** Get the register block from a GPU register address */ 5010915Sandreas.sandberg@arm.comstatic inline RegBlock 5110915Sandreas.sandberg@arm.comgetRegBlock(RegAddr addr) 5210915Sandreas.sandberg@arm.com{ 5310915Sandreas.sandberg@arm.com return RegBlock(addr.value >> 12); 5410915Sandreas.sandberg@arm.com} 5510915Sandreas.sandberg@arm.com 5610915Sandreas.sandberg@arm.com/** 5710915Sandreas.sandberg@arm.com * Get the register address within a GPU block. 5810915Sandreas.sandberg@arm.com * 5910915Sandreas.sandberg@arm.com * This method masks away the block offset from a GPU register 6010915Sandreas.sandberg@arm.com * address. The resulting address is the address <i>within</i> a 6110915Sandreas.sandberg@arm.com * function block. 6210915Sandreas.sandberg@arm.com */ 6310915Sandreas.sandberg@arm.comstatic inline RegAddr 6410915Sandreas.sandberg@arm.comgetBlockReg(RegAddr addr) 6510915Sandreas.sandberg@arm.com{ 6610915Sandreas.sandberg@arm.com static_assert((BLOCK_REGS_SIZE & (BLOCK_REGS_SIZE - 1)) == 0, 6710915Sandreas.sandberg@arm.com "BLOCK_REGS_SIZE is not a power of 2"); 6810915Sandreas.sandberg@arm.com return RegAddr(addr.value & (BLOCK_REGS_SIZE - 1)); 6910915Sandreas.sandberg@arm.com} 7010915Sandreas.sandberg@arm.com 7110915Sandreas.sandberg@arm.com/** 7210915Sandreas.sandberg@arm.com * Get the slot number owning an address within the JobControl block. 7310915Sandreas.sandberg@arm.com * 7410915Sandreas.sandberg@arm.com * @param Address relative to the JobControl block. 7510915Sandreas.sandberg@arm.com */ 7610915Sandreas.sandberg@arm.comstatic inline unsigned 7710915Sandreas.sandberg@arm.comgetJobSlotNo(const RegAddr &addr) 7810915Sandreas.sandberg@arm.com{ 7910915Sandreas.sandberg@arm.com assert(addr.value >= JOB_SLOT0); 8010915Sandreas.sandberg@arm.com assert(addr.value <= 0xFFF); 8110915Sandreas.sandberg@arm.com return (addr.value - JOB_SLOT0) >> 7; 8210915Sandreas.sandberg@arm.com} 8310915Sandreas.sandberg@arm.com 8410915Sandreas.sandberg@arm.com/** 8510915Sandreas.sandberg@arm.com * Get a JobSlot-relative address from a JobControl-relative address. 8610915Sandreas.sandberg@arm.com * 8710915Sandreas.sandberg@arm.com * @param Address relative to the JobControl block. 8810915Sandreas.sandberg@arm.com * @return Address relative the start of the JobSlot. 8910915Sandreas.sandberg@arm.com */ 9010915Sandreas.sandberg@arm.comstatic inline RegAddr 9110915Sandreas.sandberg@arm.comgetJobSlotAddr(const RegAddr &addr) 9210915Sandreas.sandberg@arm.com{ 9310915Sandreas.sandberg@arm.com const unsigned slot_no(getJobSlotNo(addr)); 9410915Sandreas.sandberg@arm.com const RegAddr slot_base(RegAddr(JOB_SLOT0 + slot_no * 0x80)); 9510915Sandreas.sandberg@arm.com return addr - slot_base; 9610915Sandreas.sandberg@arm.com} 9710915Sandreas.sandberg@arm.com 9810915Sandreas.sandberg@arm.com/** Number of registers per job slot */ 9910915Sandreas.sandberg@arm.comstatic const unsigned JSn_NO_REGS = 0x20; 10010915Sandreas.sandberg@arm.com 10110915Sandreas.sandberg@arm.com} 10210915Sandreas.sandberg@arm.com 10310915Sandreas.sandberg@arm.com#endif //_LIBNOMALIMODEL_REGUTILS_HH 104