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_JOBCONTROL_HH
2110915Sandreas.sandberg@arm.com#define _LIBNOMALIMODEL_JOBCONTROL_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 "jobslot.hh"
2710915Sandreas.sandberg@arm.com#include "types.hh"
2810915Sandreas.sandberg@arm.com
2910915Sandreas.sandberg@arm.comnamespace NoMali {
3010915Sandreas.sandberg@arm.com
3110915Sandreas.sandberg@arm.comclass GPU;
3210915Sandreas.sandberg@arm.com
3310915Sandreas.sandberg@arm.com/**
3410915Sandreas.sandberg@arm.com * Minimal GPU job control implementation.
3510915Sandreas.sandberg@arm.com *
3610915Sandreas.sandberg@arm.com * This class implements the job control block of a Midgard style
3710915Sandreas.sandberg@arm.com * GPU. The job control block mainly coordinates interrupt delivery
3810915Sandreas.sandberg@arm.com * and register mappings for the different job slots within the
3910915Sandreas.sandberg@arm.com * block. The actual job slots are implemented by the JobSlot class.
4010915Sandreas.sandberg@arm.com *
4110915Sandreas.sandberg@arm.com * @see JobSlot
4210915Sandreas.sandberg@arm.com */
4310915Sandreas.sandberg@arm.comclass JobControl
4410915Sandreas.sandberg@arm.com    : public GPUBlockInt
4510915Sandreas.sandberg@arm.com{
4610915Sandreas.sandberg@arm.com  public:
4710915Sandreas.sandberg@arm.com    JobControl(GPU &_gpu);
4810915Sandreas.sandberg@arm.com    virtual ~JobControl();
4910915Sandreas.sandberg@arm.com
5011313Sandreas.sandberg@arm.com    void reset() override;
5111313Sandreas.sandberg@arm.com
5210915Sandreas.sandberg@arm.com    uint32_t readReg(RegAddr idx)  override;
5310915Sandreas.sandberg@arm.com    void writeReg(RegAddr idx, uint32_t value) override;
5410915Sandreas.sandberg@arm.com
5510915Sandreas.sandberg@arm.com    uint32_t readRegRaw(RegAddr idx)  override;
5610915Sandreas.sandberg@arm.com    void writeRegRaw(RegAddr idx, uint32_t value) override;
5710915Sandreas.sandberg@arm.com
5810915Sandreas.sandberg@arm.com    /**
5910915Sandreas.sandberg@arm.com     * Signal job done.
6010915Sandreas.sandberg@arm.com     *
6110915Sandreas.sandberg@arm.com     * Calling this method raises the job done interrupt for a
6210915Sandreas.sandberg@arm.com     * specific job slot. This is typically called from the job slot
6310915Sandreas.sandberg@arm.com     * running the job chain.
6410915Sandreas.sandberg@arm.com     *
6510915Sandreas.sandberg@arm.com     * @param slot Job slot number.
6610915Sandreas.sandberg@arm.com     */
6710915Sandreas.sandberg@arm.com    void jobDone(uint8_t slot);
6810915Sandreas.sandberg@arm.com    /**
6910915Sandreas.sandberg@arm.com     * Signal job failed.
7010915Sandreas.sandberg@arm.com     *
7110915Sandreas.sandberg@arm.com     * Calling this method raises the job failed interrupt for a
7210915Sandreas.sandberg@arm.com     * specific job slot. This is typically called from the job slot
7310915Sandreas.sandberg@arm.com     * running the job chain.
7410915Sandreas.sandberg@arm.com     *
7510915Sandreas.sandberg@arm.com     * @param slot Job slot number.
7610915Sandreas.sandberg@arm.com     */
7710915Sandreas.sandberg@arm.com    void jobFailed(uint8_t slot);
7810915Sandreas.sandberg@arm.com
7910915Sandreas.sandberg@arm.com  protected:
8010915Sandreas.sandberg@arm.com    /**
8110915Sandreas.sandberg@arm.com     * Update the state of the job slot state snapshot register.
8210915Sandreas.sandberg@arm.com     *
8310915Sandreas.sandberg@arm.com     * @param jobs Bit mask representing which job slots to update.
8410915Sandreas.sandberg@arm.com     */
8510915Sandreas.sandberg@arm.com    void updateJsState(uint16_t jobs);
8610915Sandreas.sandberg@arm.com
8710915Sandreas.sandberg@arm.com    void onInterrupt(int set) override;
8810915Sandreas.sandberg@arm.com
8910915Sandreas.sandberg@arm.com    /** Job slots belonging to this job control block */
9010915Sandreas.sandberg@arm.com    std::vector<JobSlot> slots;
9110915Sandreas.sandberg@arm.com};
9210915Sandreas.sandberg@arm.com
9310915Sandreas.sandberg@arm.com}
9410915Sandreas.sandberg@arm.com
9510915Sandreas.sandberg@arm.com#endif // _LIBNOMALIMODEL_JOBCONTROL_HH
96