1 /*
2 * Copyright (c) 2019, Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included
12 * in all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 */
22 
23 //!
24 //! \file     decode_huc_g12_base.h.h
25 //! \brief    Defines the common interface for decode huc usage
26 //! \details  The media huc interface is further sub-divided by different huc usages,
27 //!           this file is for the base interface which is shared by all components.
28 //!
29 
30 #ifndef __DECODE_HUC_G12_Base_H__
31 #define __DECODE_HUC_G12_Base_H__
32 
33 #include "codechal_hw.h"
34 #include "mhw_vdbox_huc_interface.h"
35 #include "mhw_vdbox_hcp_interface.h"
36 #include "mos_defs.h"
37 #include "media_cmd_packet.h"
38 #include "media_pipeline.h"
39 #include "decode_basic_feature.h"
40 #include "decodecp_interface.h"
41 #include "decode_status_report.h"
42 
43 namespace decode
44 {
45     class DecodePipeline;
46 
47     class DecodeHucBasic_G12_Base : public CmdPacket, public MediaStatusReportObserver
48     {
49     public:
50         //!
51         //! \brief  Decode huc basic constructor
52         //!
53         DecodeHucBasic_G12_Base(MediaPipeline *pipeline, MediaTask *task, CodechalHwInterface *hwInterface);
54 
55         //!
56         //! \brief  Decode huc basic destructor
57         //!
58         virtual ~DecodeHucBasic_G12_Base();
59 
60         virtual MOS_STATUS Init() override;
61 
62         virtual MOS_STATUS AllocateResources();
63 
64         virtual MOS_STATUS Destroy() override;
65 
66         //!
67         //! \brief  One frame is completed
68         //! \param  [in] mfxStatus
69         //!         pointer to status buffer which for MFX
70         //! \param  [in] rcsStatus
71         //!         pointer to status buffer which for RCS
72         //! \param  [in, out] statusReport
73         //!         pointer of DecodeStatusReport
74         //! \return MOS_STATUS
75         //!         MOS_STATUS_SUCCESS if success, else fail reason
76         //!
77         virtual MOS_STATUS Completed(void* mfxStatus, void* rcsStatus, void* statusReport) override;
78 
79     protected:
80         //!
81         //! \brief  Assemble huc commands
82         //! \return MOS_STATUS
83         //!         MOS_STATUS_SUCCESS if success, else fail reason
84         //!
85         virtual MOS_STATUS Execute(MOS_COMMAND_BUFFER& cmdBuffer, bool prologNeeded) = 0;
86 
87         virtual void       SetImemParameters(MHW_VDBOX_HUC_IMEM_STATE_PARAMS &imemParams) = 0;
88         virtual MOS_STATUS AddHucImem(MOS_COMMAND_BUFFER &cmdBuffer) = 0;
89 
90         virtual void       SetHucPipeModeSelectParameters(MHW_VDBOX_PIPE_MODE_SELECT_PARAMS &pipeModeSelectParams) = 0;
91         virtual MOS_STATUS AddHucPipeModeSelect(MOS_COMMAND_BUFFER &cmdBuffer) = 0;
92 
93         virtual void       SetDmemParameters(MHW_VDBOX_HUC_DMEM_STATE_PARAMS &dmemParams) = 0;
94         virtual MOS_STATUS AddHucDmem(MOS_COMMAND_BUFFER &cmdBuffer) = 0;
95 
96         virtual void       SetRegionParameters(MHW_VDBOX_HUC_VIRTUAL_ADDR_PARAMS &virtualAddrParams) = 0;
97         virtual MOS_STATUS AddHucRegion(MOS_COMMAND_BUFFER &cmdBuffer) = 0;
98 
99         virtual void       SetIndObjParameters(MHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS &indObjParams) = 0;
100         virtual MOS_STATUS AddHucIndObj(MOS_COMMAND_BUFFER &cmdBuffer) = 0;
101 
102         virtual void       SetStreamObjectParameters(MHW_VDBOX_HUC_STREAM_OBJ_PARAMS &streamObjParams,
103                                                      CODEC_HEVC_SLICE_PARAMS &sliceParams) = 0;
104         virtual MOS_STATUS AddHucStreamObject(MOS_COMMAND_BUFFER &cmdBuffer,
105                                               CODEC_HEVC_SLICE_PARAMS &sliceParams) = 0;
106 
107         //!
108         //! \brief  Store HucStatus MMIO to m_resHucStatusBuffer
109         //! \param  [in] cmdBuffer
110         //!         Pointer to command buffer
111         //! \return MOS_STATUS
112         //!         MOS_STATUS_SUCCESS if success, else fail reason
113         //!
114         virtual MOS_STATUS StoreHucStatusRegister(MOS_COMMAND_BUFFER& cmdBuffer);
115 
116         //!
117         //! \brief  Store HucStatus2 MMIO to m_resHucStatus2Buffer
118         //! \param  [in] cmdBuffer
119         //!         Pointer to command buffer
120         //! \return MOS_STATUS
121         //!         MOS_STATUS_SUCCESS if success, else fail reason
122         //!
123         virtual MOS_STATUS StoreHucStatus2Register(MOS_COMMAND_BUFFER& cmdBuffer);
124 
125         //!
126         //! \brief  Force wakeup VDBOX
127         //! \param  [in] cmdBuffer
128         //!         Pointer to command buffer
129         //! \param  [in] mfxWakeup
130         //!         MFX pipeline wakeup flag
131         //! \param  [in] hcpWakeup
132         //!         HCP wakeup flag
133         //! \return MOS_STATUS
134         //!         MOS_STATUS_SUCCESS if success, else fail reason
135         //!
136         virtual MOS_STATUS AddForceWakeup(MOS_COMMAND_BUFFER& cmdBuffer, bool mfxWakeup, bool hcpWakeup);
137 
138         //!
139         //! \brief  Send prolog cmds
140         //! \param  [in] cmdBuffer
141         //!         Reference to command buffer
142         //! \return MOS_STATUS
143         //!         MOS_STATUS_SUCCESS if success, else fail reason
144         //!
145         virtual MOS_STATUS SendPrologCmds(MOS_COMMAND_BUFFER& cmdBuffer);
146 
147         //!
148         //! \brief  Set HucStatus MMIO mask
149         //! \param  [in] hucStatusMask
150         //!         MMIO mask for HucStatus
151         //! \param  [in] hucStatus2Mask
152         //!         MMIO mask for HucStatus2
153         //!
154         void SetHucStatusMask(uint32_t hucStatusMask, uint32_t hucStatus2Mask);
155 
156         virtual MOS_STATUS StartStatusReport(uint32_t srType, MOS_COMMAND_BUFFER* cmdBuffer) override;
157         virtual MOS_STATUS EndStatusReport(uint32_t srType, MOS_COMMAND_BUFFER* cmdBuffer) override;
158 
159         virtual MOS_STATUS MemoryFlush(MOS_COMMAND_BUFFER &cmdBuffer);
160 
161         DecodePipeline *         m_pipeline       = nullptr;
162         MediaFeatureManager *    m_featureManager = nullptr;
163         DecodeAllocator *        m_allocator      = nullptr;
164         PMOS_INTERFACE           m_osInterface    = nullptr;
165         CodechalHwInterface *    m_hwInterface    = nullptr;
166         MhwVdboxHucInterface *   m_hucInterface   = nullptr;
167         MhwVdboxVdencInterface * m_vdencInterface = nullptr;
168         DecodeBasicFeature *     m_basicFeature   = nullptr;
169         DecodeCpInterface*       m_decodecp       = nullptr;
170 
171         static const uint32_t m_hucStatusInvalidMask = 0;         //!< Invalid mask of Huc status MMIO
172         uint32_t       m_hucStatusMask = m_hucStatusInvalidMask;  //!< MMIO mask for HuC status
173         uint32_t       m_hucStatus2Mask = m_hucStatusInvalidMask; //!< MMIO mask for HuC status2
174     };
175 }
176 #endif  // !__DECODE_HUC_G12_Base_H__
177