110915Sandreas.sandberg@arm.com/*
211313Sandreas.sandberg@arm.com * Copyright (c) 2014-2016 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
9811313Sandreas.sandberg@arm.com
9910915Sandreas.sandberg@arm.com/** Number of registers per job slot */
10010915Sandreas.sandberg@arm.comstatic const unsigned JSn_NO_REGS = 0x20;
10110915Sandreas.sandberg@arm.com
10211313Sandreas.sandberg@arm.com/**
10311313Sandreas.sandberg@arm.com * Does this MMU register belong to an address space block?
10411313Sandreas.sandberg@arm.com *
10511313Sandreas.sandberg@arm.com * @return 1 if the address maps to a valid address space block, 0
10611313Sandreas.sandberg@arm.com * otherwise.
10711313Sandreas.sandberg@arm.com */
10811313Sandreas.sandberg@arm.comstatic inline bool
10911313Sandreas.sandberg@arm.comisAddrSpaceReg(const RegAddr &addr)
11011313Sandreas.sandberg@arm.com{
11111313Sandreas.sandberg@arm.com    return addr.value >= MMU_AS0 && addr.value <= 0x7FF;
11211313Sandreas.sandberg@arm.com}
11311313Sandreas.sandberg@arm.com
11411313Sandreas.sandberg@arm.com/**
11511313Sandreas.sandberg@arm.com * Get the address space number owning an address within the MMU
11611313Sandreas.sandberg@arm.com * block.
11711313Sandreas.sandberg@arm.com *
11811313Sandreas.sandberg@arm.com * @param addr Address relative to the JobControl block.
11911313Sandreas.sandberg@arm.com */
12011313Sandreas.sandberg@arm.comstatic inline unsigned
12111313Sandreas.sandberg@arm.comgetAddrSpaceNo(const RegAddr &addr)
12211313Sandreas.sandberg@arm.com{
12311313Sandreas.sandberg@arm.com    assert(isAddrSpaceReg(addr));
12411313Sandreas.sandberg@arm.com    return (addr.value - MMU_AS0) >> 6;
12511313Sandreas.sandberg@arm.com}
12611313Sandreas.sandberg@arm.com
12711313Sandreas.sandberg@arm.com/**
12811313Sandreas.sandberg@arm.com * Get a AS-relative address from a MMU-relative
12911313Sandreas.sandberg@arm.com * address.
13011313Sandreas.sandberg@arm.com *
13111313Sandreas.sandberg@arm.com * @param addr Address relative to the MMU block.
13211313Sandreas.sandberg@arm.com * @return Address relative the start of the address space block.
13311313Sandreas.sandberg@arm.com */
13411313Sandreas.sandberg@arm.comstatic inline RegAddr
13511313Sandreas.sandberg@arm.comgetAddrSpaceAddr(const RegAddr &addr)
13611313Sandreas.sandberg@arm.com{
13711313Sandreas.sandberg@arm.com    const unsigned as_no(getAddrSpaceNo(addr));
13811313Sandreas.sandberg@arm.com    const RegAddr as_base(RegAddr(MMU_AS0 + as_no * 0x40));
13911313Sandreas.sandberg@arm.com    return addr - as_base;
14011313Sandreas.sandberg@arm.com}
14111313Sandreas.sandberg@arm.com
14211313Sandreas.sandberg@arm.com/** Number of registers per address space */
14311313Sandreas.sandberg@arm.comstatic const unsigned ASn_NO_REGS = 0x10;
14411313Sandreas.sandberg@arm.com
14510915Sandreas.sandberg@arm.com}
14610915Sandreas.sandberg@arm.com
14710915Sandreas.sandberg@arm.com#endif //_LIBNOMALIMODEL_REGUTILS_HH
148