blob: 8ca1dc139db51b30d16fe4870cff0cf3da6e4773 [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef MAGMA_ARM_MALI_TYPES_H_
#define MAGMA_ARM_MALI_TYPES_H_
#include <cstdint>
#include "magma_common_defs.h"
// These flags can be specified to magma_map_buffer_gpu.
enum MagmaArmMaliGpuMapFlags {
// Accesses to this data should be GPU-L2 coherent.
kMagmaArmMaliGpuMapFlagInnerShareable = (1 << MAGMA_GPU_MAP_FLAG_VENDOR_SHIFT),
// Accesses to this data should be coherent with the CPU
kMagmaArmMaliGpuMapFlagBothShareable = (1 << (MAGMA_GPU_MAP_FLAG_VENDOR_SHIFT + 1)),
};
enum AtomFlags {
kAtomFlagRequireFragmentShader = (1 << 0),
// Compute shaders also include vertex and geometry shaders.
kAtomFlagRequireComputeShader = (1 << 1),
kAtomFlagRequireTiler = (1 << 2),
kAtomFlagRequireCycleCounter = (1 << 3),
kAtomFlagProtected = (1 << 4), // Executes in protected mode.
// Atoms with this flag set are processed completely in the MSD and aren't
// sent to hardware.
kAtomFlagSoftware = (1 << 30),
kAtomFlagSemaphoreSet = kAtomFlagSoftware | 1,
kAtomFlagSemaphoreReset = kAtomFlagSoftware | 2,
kAtomFlagSemaphoreWait = kAtomFlagSoftware | 3,
kAtomFlagSemaphoreWaitAndReset = kAtomFlagSoftware | 4,
};
enum ArmMaliResultCodeFlags {
// The result code is for a software event, not one created by hardware.
kArmMaliSoftwareEvent = (1u << 14),
// A software event succeeded.
kArmMaliSoftwareEventSuccess = (1u << 13),
// This event is not related to a specific GPU job.
kArmMaliSoftwareEventMisc = (1u << 12),
};
enum ArmMaliResultCode {
kArmMaliResultRunning = 0,
// These codes match the result codes from hardware.
kArmMaliResultSuccess = 1,
kArmMaliResultSoftStopped = 3,
// The atom was terminated with a hard stop.
kArmMaliResultAtomTerminated = 4,
// These faults happen while attempting to read jobs in a job chain.
kArmMaliResultFault = 0x40,
kArmMaliResultConfigFault = kArmMaliResultFault + 0,
kArmMaliResultPowerFault = kArmMaliResultFault + 1,
kArmMaliResultReadFault = kArmMaliResultFault + 2,
kArmMaliResultWriteFault = kArmMaliResultFault + 3,
kArmMaliResultAffinityFault = kArmMaliResultFault + 4,
kArmMaliResultBusFault = kArmMaliResultFault + 8,
// These faults happpen when executing jobs.
kArmMaliResultInstructionFault = 0x50,
kArmMaliResultProgramCounterInvalidFault = kArmMaliResultInstructionFault,
kArmMaliResultEncodingInvalidFault = kArmMaliResultInstructionFault + 0x1,
kArmMaliResultTypeMismatchFault = kArmMaliResultInstructionFault + 0x2,
kArmMaliResultOperandFault = kArmMaliResultInstructionFault + 0x3,
kArmMaliResultTlsFault = kArmMaliResultInstructionFault + 0x4,
kArmMaliResultBarrierFault = kArmMaliResultInstructionFault + 0x5,
kArmMaliResultAlignmentFault = kArmMaliResultInstructionFault + 0x6,
kArmMaliResultDataInvalidFault = kArmMaliResultInstructionFault + 0x8,
kArmMaliResultTileRangeFault = kArmMaliResultInstructionFault + 0xa,
kArmMaliResultOutOfMemoryFault = 0x60,
kArmMaliResultUnknownFault = 0x7f,
// Faults for software atoms.
kArmMaliResultTimedOut = kArmMaliSoftwareEvent | 1,
// This result code is only generated by the driver itself.
kArmMaliResultTerminated =
kArmMaliSoftwareEvent | kArmMaliSoftwareEventSuccess | kArmMaliSoftwareEventMisc,
};
// These values match the hardware.
enum ArmMaliCacheCoherencyStatus {
kArmMaliCacheCoherencyAceLite = 0,
kArmMaliCacheCoherencyAce = 1,
kArmMaliCacheCoherencyNone = 31,
};
enum ArmMaliDependencyType {
// Data dependencies cause dependent atoms to fail.
kArmMaliDependencyData = 0,
// Order dependencies allow dependent atoms to execute, even on failure.
kArmMaliDependencyOrder = 1,
};
struct magma_arm_mali_dependency {
uint8_t type; // ArmMaliDependencyType
uint8_t atom_number; // 0 means no dependency.
} __attribute__((packed));
// This is arbitrary user data that's used to identify an atom.
struct magma_arm_mali_user_data {
uint64_t data[2];
} __attribute__((packed));
struct magma_arm_mali_atom {
uint64_t size; // Size of this structure. Used for backwards compatibility.
uint64_t job_chain_addr;
struct magma_arm_mali_user_data data;
uint32_t flags; // a set of AtomFlags.
uint8_t atom_number;
int8_t priority; // 0 is default. < 0 is less important, > 0 is more important.
magma_arm_mali_dependency dependencies[2];
} __attribute__((packed));
struct magma_arm_mali_status {
uint32_t result_code;
uint8_t atom_number;
magma_arm_mali_user_data data;
} __attribute__((packed));
#endif