xref: /aosp_15_r20/external/intel-media-driver/media_common/agnostic/common/hw/mhw_state_heap_generic.h (revision ba62d9d3abf0e404f2022b4cd7a85e107f48596f)
1 /*
2 * Copyright (c) 2015-2017, 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 //! \file     mhw_state_heap_generic.h
24 //! \brief    MHW interface templates for state heap
25 //! \details  Impelements shared HW command construction functions across all platforms as templates
26 //!
27 
28 #ifndef __MHW_STATE_HEAP_GENERIC_H__
29 #define __MHW_STATE_HEAP_GENERIC_H__
30 
31 #include "mhw_state_heap.h"
32 #include "mhw_mi.h"
33 
34 template <class TCmds>
35 class MHW_STATE_HEAP_INTERFACE_GENERIC : public XMHW_STATE_HEAP_INTERFACE
36 {
37 
38 public:
MHW_STATE_HEAP_INTERFACE_GENERIC(PMOS_INTERFACE pInputOsInterface,int8_t bDynamicMode)39     MHW_STATE_HEAP_INTERFACE_GENERIC(
40         PMOS_INTERFACE      pInputOsInterface,
41         int8_t              bDynamicMode) : XMHW_STATE_HEAP_INTERFACE(pInputOsInterface, bDynamicMode) {}
42 
~MHW_STATE_HEAP_INTERFACE_GENERIC()43     virtual ~MHW_STATE_HEAP_INTERFACE_GENERIC() { MHW_FUNCTION_ENTER; }
44 
SetBindingTable(PMHW_KERNEL_STATE pKernelState)45     MOS_STATUS SetBindingTable(PMHW_KERNEL_STATE  pKernelState)
46     {
47         MOS_STATUS          eStatus = MOS_STATUS_SUCCESS;
48 
49         MHW_FUNCTION_ENTER;
50 
51         MHW_MI_CHK_NULL(pKernelState);
52         MHW_MI_CHK_NULL(m_pOsInterface);
53 
54         uint8_t             *pIndirectState = nullptr;
55         uint32_t            uiIndirectStateSize = 0, uiIndirectStateOffset = 0;
56         MHW_MI_CHK_STATUS(m_pOsInterface->pfnGetIndirectStatePointer(m_pOsInterface, &pIndirectState));
57         MHW_MI_CHK_STATUS(m_pOsInterface->pfnGetIndirectState(m_pOsInterface, &uiIndirectStateOffset, &uiIndirectStateSize));
58 
59         if ((pKernelState->dwSshOffset + pKernelState->dwSshSize) > uiIndirectStateSize)
60         {
61             MHW_ASSERTMESSAGE("SSH not large enough to hold data for this kernel.");
62             return MOS_STATUS_INVALID_PARAMETER;
63         }
64 
65         uint32_t ui32BindingTableSize = pKernelState->dwSshSize;
66         uint8_t *pBindingTablePtr     = (uint8_t*)(pIndirectState + pKernelState->dwSshOffset);
67         if (pBindingTablePtr != nullptr)
68         {
69             MOS_ZeroMemory(pBindingTablePtr, ui32BindingTableSize);
70         }
71 
72         typename            TCmds::BINDING_TABLE_STATE_CMD Cmd;
73         for (uint32_t i = 0; i < (uint32_t)pKernelState->KernelParams.iBTCount; i++)
74         {
75             MHW_MI_CHK_NULL(pBindingTablePtr);
76 
77             Cmd.DW0.SurfaceStatePointer =
78                 ((pKernelState->dwSshOffset + pKernelState->dwBindingTableSize) +
79                 (i * m_dwMaxSurfaceStateSize)) >>
80                 m_mhwBindingTableSurfaceShift;
81             MHW_MI_CHK_STATUS(MOS_SecureMemcpy(pBindingTablePtr, ui32BindingTableSize, &Cmd, Cmd.byteSize));
82             pBindingTablePtr += Cmd.byteSize;
83             ui32BindingTableSize -= Cmd.byteSize;
84         }
85 
86         return eStatus;
87     }
88 
SetBindingTableEntry(PMHW_BINDING_TABLE_PARAMS pParams)89     MOS_STATUS SetBindingTableEntry(PMHW_BINDING_TABLE_PARAMS pParams)
90     {
91         MOS_STATUS   eStatus = MOS_STATUS_SUCCESS;
92         MHW_MI_CHK_NULL(pParams);
93 
94         uint8_t*     pBindingTablePtr = pParams->pBindingTableEntry;
95         MHW_MI_CHK_NULL(pBindingTablePtr);
96 
97         //Init Cmds
98         typename     TCmds::BINDING_TABLE_STATE_CMD Cmd;
99         Cmd.DW0.SurfaceStatePointer = pParams->dwSurfaceStateOffset >> m_mhwBindingTableSurfaceShift;
100 
101         //Copy to binding table Entry
102         MHW_MI_CHK_STATUS(MOS_SecureMemcpy(pBindingTablePtr, Cmd.byteSize, &Cmd, Cmd.byteSize));
103 
104         // Move to next BT entry
105         pParams->pBindingTableEntry += Cmd.byteSize;
106 
107         return eStatus;
108     }
109 
SendBindingTableEntry(PMHW_BINDING_TABLE_SEND_PARAMS pParams)110     MOS_STATUS SendBindingTableEntry(PMHW_BINDING_TABLE_SEND_PARAMS   pParams)
111     {
112         MOS_STATUS   eStatus = MOS_STATUS_SUCCESS;
113 
114         if (pParams == nullptr ||
115             pParams->pBindingTableSource == nullptr ||
116             pParams->pBindingTableTarget == nullptr)
117         {
118             return MOS_STATUS_SUCCESS;
119         }
120 
121         typename TCmds::BINDING_TABLE_STATE_CMD *pBtSrc =
122             (typename TCmds::BINDING_TABLE_STATE_CMD *)pParams->pBindingTableSource ;
123         MHW_MI_CHK_NULL(pBtSrc);
124 
125         typename TCmds::BINDING_TABLE_STATE_CMD *pBtDst =
126             (typename TCmds::BINDING_TABLE_STATE_CMD *)pParams->pBindingTableTarget;
127         MHW_MI_CHK_NULL(pBtDst);
128 
129         uint32_t CmdByteSize = TCmds::BINDING_TABLE_STATE_CMD::byteSize;
130 
131         // Setup and increment BT pointers
132         pParams->pBindingTableSource += CmdByteSize;
133         pParams->pBindingTableTarget += CmdByteSize;
134 
135         if (pBtSrc->DW0.SurfaceStatePointer != 0)
136         {
137             // Set binding table entry in indirect state
138             *pBtDst = *pBtSrc;
139 
140             // Return surface state parameters associated with BT entry
141             pParams->iSurfaceStateOffset = pBtSrc->DW0.Value;
142             pParams->iSurfaceState       = \
143                 (pParams->iSurfaceStateOffset - pParams->iSurfaceStateBase)>> m_mhwBindingTableSurfaceShift;
144         }
145         else
146         {
147             *pBtDst = typename TCmds::BINDING_TABLE_STATE_CMD();
148             pParams->iSurfaceState       = -1;
149         }
150 
151         return eStatus;
152     }
153 
SetInterfaceDescriptor(uint32_t dwNumIdsToSet,PMHW_INTERFACE_DESCRIPTOR_PARAMS pParams)154     MOS_STATUS SetInterfaceDescriptor(
155         uint32_t                            dwNumIdsToSet,
156         PMHW_INTERFACE_DESCRIPTOR_PARAMS    pParams)
157     {
158         MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
159 
160         MHW_FUNCTION_ENTER;
161 
162         return eStatus;
163     }
164 };
165 
166 #endif
167