xref: /aosp_15_r20/external/intel-media-driver/media_driver/agnostic/common/hw/mhw_state_heap_legacy.c (revision ba62d9d3abf0e404f2022b4cd7a85e107f48596f)
1 /*
2 * Copyright (c) 2014-2022, 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_legacy.c
24 //! \brief         This modules implements HW interface layer to be used on all platforms on     all operating systems/DDIs, across MHW components.
25 //!
26 #include "mhw_state_heap_legacy.h"
27 #include "media_interfaces_mhw.h"
28 #include "mhw_cp_interface.h"
29 
30 //!
31 //! \brief    Initializes the state heap interface
32 //! \details  Internal MHW function to initialize all function pointers and some parameters
33 //! \param    PMHW_STATE_HEAP_INTERFACE* ppStateHeapInterface
34 //!           [in/out] Poitner to state heap interface pointer to be allocated
35 //! \param    PMOS_INTERFACE pOsInterface
36 //!           [in] OS interface
37 //! \return   MOS_STATUS
38 //!           MOS_STATUS_SUCCESS if success, else fail reason
39 //!
Mhw_StateHeapInterface_InitInterface_Legacy(PMHW_STATE_HEAP_INTERFACE * ppCommonStateHeapInterface,PMOS_INTERFACE pOsInterface,uint8_t bDynamicMode)40 MOS_STATUS Mhw_StateHeapInterface_InitInterface_Legacy(
41     PMHW_STATE_HEAP_INTERFACE   *ppCommonStateHeapInterface,
42     PMOS_INTERFACE              pOsInterface,
43     uint8_t                     bDynamicMode)
44 {
45     PMHW_STATE_HEAP_INTERFACE   pCommonStateHeapInterface = nullptr;
46     MOS_STATUS                  eStatus = MOS_STATUS_SUCCESS;
47     MhwInterfaces::CreateParams params;
48     MhwInterfaces               *mhwInterfaces = nullptr;
49 
50     MHW_FUNCTION_ENTER;
51 
52     MHW_CHK_NULL(ppCommonStateHeapInterface);
53     MHW_CHK_NULL(pOsInterface);
54 
55     pCommonStateHeapInterface =
56         (PMHW_STATE_HEAP_INTERFACE)MOS_AllocAndZeroMemory(sizeof(MHW_STATE_HEAP_INTERFACE));
57     MHW_CHK_NULL(pCommonStateHeapInterface);
58     MHW_CHK_STATUS(Mhw_StateHeapInterface_AssignInterfaces(pCommonStateHeapInterface));
59 
60     MOS_ZeroMemory(&params, sizeof(params));
61     params.Flags.m_stateHeap = true;
62     params.m_heapMode = bDynamicMode;
63     mhwInterfaces = MhwInterfaces::CreateFactory(params, pOsInterface);
64     if (mhwInterfaces)
65     {
66         MHW_CHK_NULL(mhwInterfaces->m_stateHeapInterface);
67         pCommonStateHeapInterface->pStateHeapInterface = mhwInterfaces->m_stateHeapInterface;
68         // MhwInterfaces always create CP and MI interfaces, so we have to delete those we don't need.
69         MOS_Delete(mhwInterfaces->m_miInterface);
70         pOsInterface->pfnDeleteMhwCpInterface(mhwInterfaces->m_cpInterface);
71         mhwInterfaces->m_cpInterface = NULL;
72         MOS_Delete(mhwInterfaces);
73         mhwInterfaces = nullptr;
74     }
75     else
76     {
77         MHW_ASSERTMESSAGE("Allocate MhwInterfaces failed");
78         eStatus = MOS_STATUS_NO_SPACE;
79         goto finish;
80     }
81 
82     *ppCommonStateHeapInterface = pCommonStateHeapInterface;
83 
84 finish:
85 
86     if (eStatus != MOS_STATUS_SUCCESS && pCommonStateHeapInterface)
87     {
88         pCommonStateHeapInterface->pfnDestroy(pCommonStateHeapInterface);
89         *ppCommonStateHeapInterface = nullptr;
90         if (mhwInterfaces)
91         {
92             MOS_Delete(mhwInterfaces->m_miInterface);
93             pOsInterface->pfnDeleteMhwCpInterface(mhwInterfaces->m_cpInterface);
94             mhwInterfaces->m_cpInterface = NULL;
95             MOS_Delete(mhwInterfaces);
96         }
97     }
98 
99     return eStatus;
100 }
101