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