xref: /aosp_15_r20/external/intel-media-driver/media_softlet/agnostic/common/cp/encodecp.cpp (revision ba62d9d3abf0e404f2022b4cd7a85e107f48596f)
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 //! \file     encodecp.cpp
24 //! \brief    Defines the common interface for secure encode
25 //!
26 #include "encodecp.h"
27 #include "encode_utils.h"
28 #include "encode_status_report.h"
29 #include "codechal_setting.h"
30 #include "mos_os_cp_interface_specific.h"
31 
32 namespace encode {
33 
isCpEnabled()34     bool EncodeCp::isCpEnabled()
35     {
36         return m_cpEnabled;
37     }
38 
setStatusReport(MediaStatusReport * statusReport)39     MOS_STATUS EncodeCp::setStatusReport(MediaStatusReport *statusReport)
40     {
41         m_statusReport = statusReport;
42         return MOS_STATUS_SUCCESS;
43     }
RegisterParams(void * settings)44     MOS_STATUS EncodeCp::RegisterParams(void *settings)
45     {
46         ENCODE_FUNC_CALL();
47         ENCODE_CHK_NULL_RETURN(settings);
48         ENCODE_CHK_NULL_RETURN(m_cpInterface);
49         m_cpInterface->RegisterParams(((CodechalSetting *)settings)->GetCpParams());
50         m_cpEnabled = m_osInterface->osCpInterface->IsCpEnabled();
51         return MOS_STATUS_SUCCESS;
52     }
53 
UpdateParams(bool input)54     MOS_STATUS EncodeCp::UpdateParams(bool input)
55     {
56         if (!m_cpEnabled)
57         {
58             return MOS_STATUS_SUCCESS;
59         }
60         ENCODE_FUNC_CALL();
61         ENCODE_CHK_NULL_RETURN(m_cpInterface);
62         ENCODE_CHK_STATUS_RETURN(m_cpInterface->UpdateParams(input));
63         return MOS_STATUS_SUCCESS;
64     }
65 
StartCpStatusReport(MOS_COMMAND_BUFFER * cmdBuffer)66     MOS_STATUS EncodeCp::StartCpStatusReport(MOS_COMMAND_BUFFER *cmdBuffer)
67     {
68         if (!m_cpEnabled)
69         {
70             return MOS_STATUS_SUCCESS;
71         }
72 
73         PMOS_RESOURCE m_hwcounterBuf = (static_cast<EncoderStatusReport *>(m_statusReport))->GetHwCtrBuf();
74         ENCODE_CHK_NULL_RETURN(m_hwcounterBuf);
75         ENCODE_CHK_NULL_RETURN(m_cpInterface);
76 
77         uint32_t offset      = m_statusReport->GetIndex(m_statusReport->GetSubmittedCount());
78 
79         ENCODE_CHK_STATUS_RETURN(m_cpInterface->ReadEncodeCounterFromHW(
80             m_osInterface,
81             cmdBuffer,
82             m_hwcounterBuf,
83             (uint16_t)offset));
84         return MOS_STATUS_SUCCESS;
85     }
86 
UpdateCpStatusReport(void * pStatusReportData)87     MOS_STATUS EncodeCp::UpdateCpStatusReport(void *pStatusReportData)
88     {
89         if (!m_cpEnabled)
90         {
91             return MOS_STATUS_SUCCESS;
92         }
93 
94         ENCODE_CHK_NULL_RETURN(pStatusReportData);
95         EncodeStatusReportData *statusReportData = static_cast<EncodeStatusReportData*>(pStatusReportData);
96         uint64_t *              hwcounter        = statusReportData->hwCtr;
97         ENCODE_CHK_NULL_RETURN(hwcounter);
98 
99         statusReportData->hwCounterValue.Count = *hwcounter;
100         //Report back in Big endian
101         statusReportData->hwCounterValue.Count = SwapEndianness(statusReportData->hwCounterValue.Count);
102         //IV value computation
103         statusReportData->hwCounterValue.IV = *(++hwcounter);
104         statusReportData->hwCounterValue.IV = SwapEndianness(statusReportData->hwCounterValue.IV);
105         ENCODE_NORMALMESSAGE(
106             "encodeStatusReport->HWCounterValue.Count = 0x%llx, encodeStatusReport->HWCounterValue.IV = 0x%llx",
107             statusReportData->hwCounterValue.Count,
108             statusReportData->hwCounterValue.IV);
109         return MOS_STATUS_SUCCESS;
110     }
111 
patchForHM()112     MOS_STATUS EncodeCp::patchForHM()
113     {
114         if (m_cpEnabled && m_osInterface && m_osInterface->osCpInterface)
115         {
116             return m_osInterface->osCpInterface->PermeatePatchForHM(nullptr, nullptr, nullptr);
117         }
118         return MOS_STATUS_SUCCESS;
119     }
120 }