jobslot.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_JOBSLOT_HH 2110915Sandreas.sandberg@arm.com#define _LIBNOMALIMODEL_JOBSLOT_HH 2210915Sandreas.sandberg@arm.com 2310915Sandreas.sandberg@arm.com#include <vector> 2410915Sandreas.sandberg@arm.com 2510915Sandreas.sandberg@arm.com#include "gpublock.hh" 2610915Sandreas.sandberg@arm.com#include "types.hh" 2710915Sandreas.sandberg@arm.com 2810915Sandreas.sandberg@arm.comnamespace NoMali { 2910915Sandreas.sandberg@arm.com 3010915Sandreas.sandberg@arm.comclass GPU; 3110915Sandreas.sandberg@arm.com 3210915Sandreas.sandberg@arm.comclass JobControl; 3310915Sandreas.sandberg@arm.com 3410915Sandreas.sandberg@arm.com/** 3510915Sandreas.sandberg@arm.com * Midgard job slot implementation. 3610915Sandreas.sandberg@arm.com * 3710915Sandreas.sandberg@arm.com * A job slot is a part of a JobControl block that controls the state 3810915Sandreas.sandberg@arm.com * of one out of 16 active jobs. Each slot can contain one running job 3910915Sandreas.sandberg@arm.com * and a pending job. 4010915Sandreas.sandberg@arm.com */ 4110915Sandreas.sandberg@arm.comclass JobSlot 4210915Sandreas.sandberg@arm.com : public GPUBlock 4310915Sandreas.sandberg@arm.com{ 4410915Sandreas.sandberg@arm.com public: 4510915Sandreas.sandberg@arm.com JobSlot(GPU &_gpu, JobControl &_jc, uint8_t slot_id); 4610915Sandreas.sandberg@arm.com JobSlot(JobSlot &&rhs); 4710915Sandreas.sandberg@arm.com virtual ~JobSlot(); 4810915Sandreas.sandberg@arm.com 4910915Sandreas.sandberg@arm.com void writeReg(RegAddr idx, uint32_t value) override; 5010915Sandreas.sandberg@arm.com 5110915Sandreas.sandberg@arm.com /** Is there an active job in this job slot? */ 5210915Sandreas.sandberg@arm.com bool active() const; 5310915Sandreas.sandberg@arm.com /** Is there a pending next job in this job slot? */ 5410915Sandreas.sandberg@arm.com bool activeNext() const; 5510915Sandreas.sandberg@arm.com 5610915Sandreas.sandberg@arm.com protected: 5710915Sandreas.sandberg@arm.com /** 5810915Sandreas.sandberg@arm.com * @{ 5910915Sandreas.sandberg@arm.com * @name Job Control 6010915Sandreas.sandberg@arm.com */ 6110915Sandreas.sandberg@arm.com 6210915Sandreas.sandberg@arm.com /** 6310915Sandreas.sandberg@arm.com * Try to start the next job in the slot. 6410915Sandreas.sandberg@arm.com * 6510915Sandreas.sandberg@arm.com * Start the next job if the following conditions are true: 6610915Sandreas.sandberg@arm.com * <ul> 6710915Sandreas.sandberg@arm.com * <li>There is no currently running job. 6810915Sandreas.sandberg@arm.com * <li>The pending command in the JSn_COMMAND_NEXT register is 6910915Sandreas.sandberg@arm.com * JSn_COMMAND_START. 7010915Sandreas.sandberg@arm.com * </ul> 7110915Sandreas.sandberg@arm.com * 7210915Sandreas.sandberg@arm.com * When the job is started, the registers describing the next job 7310915Sandreas.sandberg@arm.com * chain are moved (resetting them to zero) into the register 7410915Sandreas.sandberg@arm.com * block describing the currently running job. The job is then run 7510915Sandreas.sandberg@arm.com * by a call to runJob(). 7610915Sandreas.sandberg@arm.com */ 7710915Sandreas.sandberg@arm.com void tryStart(); 7810915Sandreas.sandberg@arm.com 7910915Sandreas.sandberg@arm.com /** 8010915Sandreas.sandberg@arm.com * Execute the job in described by the current job registers. 8110915Sandreas.sandberg@arm.com */ 8210915Sandreas.sandberg@arm.com void runJob(); 8310915Sandreas.sandberg@arm.com 8410915Sandreas.sandberg@arm.com /** 8510915Sandreas.sandberg@arm.com * Report the exit status of an exiting job. 8610915Sandreas.sandberg@arm.com * 8710915Sandreas.sandberg@arm.com * @note The exit status must be of the class 8810915Sandreas.sandberg@arm.com * Status::CLASS_NOFAULT or Status::CLASS_JOB. 8910915Sandreas.sandberg@arm.com * 9010915Sandreas.sandberg@arm.com * @note The fault address isn't always a fault address, it is 9110915Sandreas.sandberg@arm.com * sometimes used to represent a TSC value. See the Midgard 9210915Sandreas.sandberg@arm.com * architecture specification for details. 9310915Sandreas.sandberg@arm.com * 9410915Sandreas.sandberg@arm.com * @param status Job exit status. 9510915Sandreas.sandberg@arm.com * @param fault_address Fault address to write into descriptor. 9610915Sandreas.sandberg@arm.com */ 9710915Sandreas.sandberg@arm.com void exitJob(Status status, uint64_t fault_address); 9810915Sandreas.sandberg@arm.com 9910915Sandreas.sandberg@arm.com /** @} */ 10010915Sandreas.sandberg@arm.com 10110915Sandreas.sandberg@arm.com /** 10210915Sandreas.sandberg@arm.com * @{ 10310915Sandreas.sandberg@arm.com * @name Job slot commands 10410915Sandreas.sandberg@arm.com */ 10510915Sandreas.sandberg@arm.com 10610915Sandreas.sandberg@arm.com /** 10710915Sandreas.sandberg@arm.com * Control command dispatcher. 10810915Sandreas.sandberg@arm.com * 10910915Sandreas.sandberg@arm.com * This method is called whenever there is a write to the 11010915Sandreas.sandberg@arm.com * JSn_COMMAND register. The method uses a lookup table to call 11110915Sandreas.sandberg@arm.com * the right command handling method. 11210915Sandreas.sandberg@arm.com * 11310915Sandreas.sandberg@arm.com * @param cmd Command number (see the Midgard architecture 11410915Sandreas.sandberg@arm.com * specification) 11510915Sandreas.sandberg@arm.com */ 11610915Sandreas.sandberg@arm.com void jobCommand(uint32_t cmd); 11710915Sandreas.sandberg@arm.com 11810915Sandreas.sandberg@arm.com /** 11910915Sandreas.sandberg@arm.com * Command handler for No-ops. 12010915Sandreas.sandberg@arm.com * 12110915Sandreas.sandberg@arm.com * @param cmd Command number (see the Midgard architecture 12210915Sandreas.sandberg@arm.com * specification) 12310915Sandreas.sandberg@arm.com */ 12410915Sandreas.sandberg@arm.com void cmdNop(uint32_t cmd); 12510915Sandreas.sandberg@arm.com /** 12610915Sandreas.sandberg@arm.com * Command handler for job start commands. 12710915Sandreas.sandberg@arm.com * 12810915Sandreas.sandberg@arm.com * @note This should <i>NEVER</i> be called as the start command 12910915Sandreas.sandberg@arm.com * should never be written to the JSn_COMMAND register. Jobs are 13010915Sandreas.sandberg@arm.com * normally started by tryStart() whenever the state of the 13110915Sandreas.sandberg@arm.com * currently running job changes or JSn_COMMAND_START is written 13210915Sandreas.sandberg@arm.com * to the JSn_COMMAND_NEXT register. 13310915Sandreas.sandberg@arm.com * 13410915Sandreas.sandberg@arm.com * @param cmd Command number (see the Midgard architecture 13510915Sandreas.sandberg@arm.com * specification) 13610915Sandreas.sandberg@arm.com */ 13710915Sandreas.sandberg@arm.com void cmdStart(uint32_t cmd); 13810915Sandreas.sandberg@arm.com /** 13910915Sandreas.sandberg@arm.com * Gently stop the currently running job chain. 14010915Sandreas.sandberg@arm.com * 14110915Sandreas.sandberg@arm.com * @param cmd Command number (see the Midgard architecture 14210915Sandreas.sandberg@arm.com * specification) 14310915Sandreas.sandberg@arm.com */ 14410915Sandreas.sandberg@arm.com void cmdSoftStop(uint32_t cmd); 14510915Sandreas.sandberg@arm.com /** 14610915Sandreas.sandberg@arm.com * Force a stop of the currently running job chain. 14710915Sandreas.sandberg@arm.com * 14810915Sandreas.sandberg@arm.com * @param cmd Command number (see the Midgard architecture 14910915Sandreas.sandberg@arm.com * specification) 15010915Sandreas.sandberg@arm.com */ 15110915Sandreas.sandberg@arm.com void cmdHardStop(uint32_t cmd); 15210915Sandreas.sandberg@arm.com /** 15310915Sandreas.sandberg@arm.com * Soft stop the current job chain if the JOB_CHAIN_FLAG <i>IS 15410915Sandreas.sandberg@arm.com * NOT</i> set. 15510915Sandreas.sandberg@arm.com * 15610915Sandreas.sandberg@arm.com * @param cmd Command number (see the Midgard architecture 15710915Sandreas.sandberg@arm.com * specification) 15810915Sandreas.sandberg@arm.com */ 15910915Sandreas.sandberg@arm.com void cmdSoftStop0(uint32_t cmd); 16010915Sandreas.sandberg@arm.com /** 16110915Sandreas.sandberg@arm.com * Hard stop the current job chain if the JOB_CHAIN_FLAG <i>IS 16210915Sandreas.sandberg@arm.com * NOT</i> set. 16310915Sandreas.sandberg@arm.com * 16410915Sandreas.sandberg@arm.com * @param cmd Command number (see the Midgard architecture 16510915Sandreas.sandberg@arm.com * specification) 16610915Sandreas.sandberg@arm.com */ 16710915Sandreas.sandberg@arm.com void cmdHardStop0(uint32_t cmd); 16810915Sandreas.sandberg@arm.com /** 16910915Sandreas.sandberg@arm.com * Soft stop the current job chain if the JOB_CHAIN_FLAG <i>IS</i> 17010915Sandreas.sandberg@arm.com * set. 17110915Sandreas.sandberg@arm.com * 17210915Sandreas.sandberg@arm.com * @param cmd Command number (see the Midgard architecture 17310915Sandreas.sandberg@arm.com * specification) 17410915Sandreas.sandberg@arm.com */ 17510915Sandreas.sandberg@arm.com void cmdSoftStop1(uint32_t cmd); 17610915Sandreas.sandberg@arm.com /** 17710915Sandreas.sandberg@arm.com * Hard stop the current job chain if the JOB_CHAIN_FLAG <i>IS</i> 17810915Sandreas.sandberg@arm.com * set. 17910915Sandreas.sandberg@arm.com * 18010915Sandreas.sandberg@arm.com * @param cmd Command number (see the Midgard architecture 18110915Sandreas.sandberg@arm.com * specification) 18210915Sandreas.sandberg@arm.com */ 18310915Sandreas.sandberg@arm.com void cmdHardStop1(uint32_t cmd); 18410915Sandreas.sandberg@arm.com 18510915Sandreas.sandberg@arm.com /** @} */ 18610915Sandreas.sandberg@arm.com 18710915Sandreas.sandberg@arm.com /** Job slot ID */ 18810915Sandreas.sandberg@arm.com const uint8_t id; 18910915Sandreas.sandberg@arm.com 19010915Sandreas.sandberg@arm.com /** Parent JobControl block */ 19110915Sandreas.sandberg@arm.com JobControl &jc; 19210915Sandreas.sandberg@arm.com 19310915Sandreas.sandberg@arm.com private: 19410915Sandreas.sandberg@arm.com typedef void (JobSlot::*cmd_t)(uint32_t); 19510915Sandreas.sandberg@arm.com 19610915Sandreas.sandberg@arm.com /** 19710915Sandreas.sandberg@arm.com * Mapping between command IDs and command handling methods. 19810915Sandreas.sandberg@arm.com * 19910915Sandreas.sandberg@arm.com * @note The order of this vector <i>MUST</i> correspond to the 20010915Sandreas.sandberg@arm.com * job control command IDs in the Midgard architecture 20110915Sandreas.sandberg@arm.com * specification. 20210915Sandreas.sandberg@arm.com */ 20310915Sandreas.sandberg@arm.com static const std::vector<cmd_t> cmds; 20410915Sandreas.sandberg@arm.com}; 20510915Sandreas.sandberg@arm.com 20610915Sandreas.sandberg@arm.com} 20710915Sandreas.sandberg@arm.com 20810915Sandreas.sandberg@arm.com#endif // _LIBNOMALIMODEL_JOBSLOT_HH 209