summaryrefslogtreecommitdiff
path: root/drivers/mxc/vpu-malone/Malone_Firmware/DecKLib/Control/DecKernelLibHWControl.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/mxc/vpu-malone/Malone_Firmware/DecKLib/Control/DecKernelLibHWControl.c')
-rwxr-xr-xdrivers/mxc/vpu-malone/Malone_Firmware/DecKLib/Control/DecKernelLibHWControl.c326
1 files changed, 326 insertions, 0 deletions
diff --git a/drivers/mxc/vpu-malone/Malone_Firmware/DecKLib/Control/DecKernelLibHWControl.c b/drivers/mxc/vpu-malone/Malone_Firmware/DecKLib/Control/DecKernelLibHWControl.c
new file mode 100755
index 000000000000..7861d545e577
--- /dev/null
+++ b/drivers/mxc/vpu-malone/Malone_Firmware/DecKLib/Control/DecKernelLibHWControl.c
@@ -0,0 +1,326 @@
+/***************************************************
+ Copyright (c) 2015 Amphion Semiconductor Ltd
+ All rights reserved.
+ ***************************************************
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ ****************************************************
+
+ Author : Media IP FW team ( Belfast and Shanghai )
+ File name : DecLibHWControl.c
+ Notes : Processes commands from decoder lib scheduler
+ Establishes context for and makes calls to
+ the base decoders
+ This file provides the hardware facing aspect to
+ the interface. It is part of a group with
+ DecLibStreamControl.c which provides the
+ HW funtionality
+
+ ******************************************************/
+
+/////////////////////////////////////////////////////////////////////////////////
+// Header Files
+/////////////////////////////////////////////////////////////////////////////////
+
+#include "basetype.h"
+#include "mediaip_fw_types.h"
+#include "pal.h"
+
+#include "mvd_types.h"
+#include "mvd_reg_map.h"
+#include "mvd_sif_control.h"
+
+#include "DecKernelLibPrivate.h"
+#include "DecKernelLibHWControl.h"
+
+/////////////////////////////////////////////////////////////////////////////////
+// Extern Function Prototypes
+/////////////////////////////////////////////////////////////////////////////////
+
+extern MEDIAIP_IRQ_RETCODE mvd_kernel_hw_primary_isr ( u_int32 irq_val );
+extern MEDIAIP_IRQ_RETCODE mvd_kernel_hw_secondary_isr ( u_int32 irq_val );
+
+/////////////////////////////////////////////////////////////////////////////////
+// Private Function Prototypes
+/////////////////////////////////////////////////////////////////////////////////
+
+
+/////////////////////////////////////////////////////////////////////////////////
+// Global Variables
+/////////////////////////////////////////////////////////////////////////////////;
+
+extern DEC_KERNEL_LIB gDecKernelLib;
+ MALONE_KERNEL_HW_SESSION gMvdKernelHw[(DECODERLIB_MAX_MALONES + 1)];
+ pMALONE_KERNEL_HW_SESSION pgMVDKernelHw;
+
+u_int32 gMaloneList[(DECODERLIB_MAX_MALONES + 1)] = { MALONE_HW_1,
+#if DECODERLIB_MAX_MALONES > 1
+ MALONE_HW_2,
+#endif
+ MALONE_SW };
+
+static u_int32 uSWMaloneRegSpace[2048]; /* Until we are sure we have eliminated register access */
+ /* for functions using the 'SW Malone', point them here */
+
+extern u_int32 uDecLibIrqPin[DECODERLIB_MAX_MALONES][0x2];
+
+/////////////////////////////////////////////////////////////////////////////////
+// Code
+/////////////////////////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////////////////////////////
+// FUNCTION: mvd_kernel_hw_control_init //
+// //
+// DESCRIPTION: Perform all HW initialisation and shared structure setup //
+// //
+// INPUTS: uMaloneID - The ID of the Malone for which the info is to //
+// be restored //
+// pCtxArea - Pointer to area of memory from which data is to be //
+// read //
+// //
+// OUTPUTS: None. //
+// //
+// RETURNS: None. //
+// //
+// NOTES: None. //
+// //
+// CONTEXT: This function must be called from non-interrupt context //
+// //
+////////////////////////////////////////////////////////////////////////////////////
+
+void mvd_kernel_hw_control_init ( DECODERLIB_KERNEL_CFG * pCfg )
+{
+ /* Init the handles */
+ /* This sets up the reg pointers so do it first */
+ mvd_kernel_hw_init_handles ( pCfg,
+ TRUE );
+
+ /* Default global pointers to a 1st Malone focus */
+ mvd_kernel_hw_set_focus ( MALONE_HW_1, &pgMVDKernelHw );
+
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////
+// FUNCTION: mvd_kernel_hw_set_malone_instance //
+// //
+// DESCRIPTION: Look for the most appropriate Malone instance to service //
+// the command for a specified stream //
+// //
+// INPUTS: uStrId - The Stream ID //
+// bSWCmd - is the command to be carried out for this stream //
+// capable of being handled without using the HW engine? //
+// uHWIndex - HW Index suggested by scheduler //
+// bUseSch - Set to guarantee scheduler suggested unit is used //
+// //
+// OUTPUTS: None. //
+// //
+// RETURNS: The most suitable Malone ID to be used //
+// //
+// NOTES: This function must return a value. //
+// //
+// CONTEXT: This function must be called from non-interrupt context //
+// //
+////////////////////////////////////////////////////////////////////////////////////
+
+u_int32 mvd_kernel_hw_set_malone_instance ( u_int32 uStrId,
+ bool bSWCmd,
+ u_int32 uHWIndex,
+ bool bUseSch
+ )
+{
+ u_int32 uIdx = 0;
+
+ if ( bUseSch )
+ {
+ return uHWIndex;
+ }
+
+ for ( uIdx = 0; uIdx < gDecKernelLib.uNumMalones; uIdx++ )
+ {
+ /* Even if there is no command active, this is a valid check as */
+ /* it avoids need for a context change if it matches */
+ if ( gMvdKernelHw[uIdx].uStrID == uStrId )
+ {
+ return uIdx;
+ }
+ }
+
+ if ( bSWCmd ) return MALONE_SW;
+
+ /* Look for free Malone - this function should not be called */
+ /* unless this is a SW command or there is a free Malone */
+
+ for ( uIdx = 0; uIdx < gDecKernelLib.uNumMalones; uIdx++ )
+ {
+ /* Even if there is no command active, this is a valid check as */
+ /* it avoids need for a context change if it matches */
+ if ( gMvdKernelHw[uIdx].eState == MALONE_INACTIVE )
+ {
+ break;
+ }
+ }
+
+ /* Do not assign this stream and do NOT make it active yet */
+ /* Only make this malone active when the command is issued */
+ /* This is necessary so we we can trigger context switches */
+
+ /* We should set the global pointer though so calls to sif */
+ /* etc can get correct functions!! */
+
+ mvd_kernel_hw_set_focus ( uIdx, &pgMVDKernelHw );
+
+ return uIdx;
+
+}
+
+////////////////////////////////////////////////////////////////////////////////////
+// FUNCTION: mvd_kernel_hw_set_focus //
+// //
+// DESCRIPTION: Changes focus to the selected Malone HW unit //
+// //
+// INPUTS: uMaloneID - The ID of the Malone //
+// //
+// OUTPUTS: ppMVDHw - Pointer to a HW session structure for the specified //
+// Malone //
+// //
+// RETURNS: None. //
+// //
+// NOTES: Only makes sense in multi-malone configs //
+// //
+// CONTEXT: This function may be called from any context //
+// //
+////////////////////////////////////////////////////////////////////////////////////
+
+void mvd_kernel_hw_set_focus ( u_int32 uMaloneID, pMALONE_KERNEL_HW_SESSION * ppMVDHw )
+{
+ *ppMVDHw = ( MALONE_KERNEL_HW_SESSION * )&gMvdKernelHw[uMaloneID];
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////////
+// FUNCTION: mvd_kernel_hw_init_handles //
+// //
+// DESCRIPTION: Initialise the HW session handles //
+// //
+// INPUTS: pCfg - A pointer to the DecLib Config structure //
+// bSoftInit - If set, the FW pointers get established - leave //
+// FALSE when restarting from a snapshot //
+// //
+// OUTPUTS: None. //
+// //
+// RETURNS: None. //
+// //
+// NOTES: None. //
+// //
+// CONTEXT: This function must be called from non-interrupt context //
+// //
+////////////////////////////////////////////////////////////////////////////////////
+
+void mvd_kernel_hw_init_handles ( DECODERLIB_KERNEL_CFG * pCfg,
+ bool bSoftInit
+ )
+{
+ u_int32 uIdx;
+ pMALONE_KERNEL_HW_SESSION pMVDHw;
+ MvdHwRegMap *pMvdReg;
+
+ for ( uIdx = 0; uIdx < (gDecKernelLib.uNumMalones + 1); uIdx++ )
+ {
+ /* If we have set up all the HW handles then move to the SW */
+ /* handle and set it up */
+ if ( uIdx == gDecKernelLib.uNumMalones ) uIdx = DECODERLIB_MAX_MALONES;
+
+ pMVDHw = &gMvdKernelHw[uIdx];
+
+ if ( bSoftInit )
+ {
+ pMVDHw->eState = MALONE_INACTIVE;
+ pMVDHw->uStrID = 0;
+ pMVDHw->uForceFIQ = 0;
+ pMVDHw->uForceDFEFIQ = 0;
+
+ /* Malone ID that the instance uses, normally fixed... */
+ pMVDHw->uMaloneID = gMaloneList[uIdx];
+ }
+
+ if ( pMVDHw->uMaloneID == DECODERLIB_MAX_MALONES )
+ {
+ pMvdReg = ( MvdHwRegMap * )uSWMaloneRegSpace;
+ }
+ else if ( pMVDHw->uMaloneID == MALONE_HW_2 )
+ {
+ pMvdReg = ( MvdHwRegMap * ) ( pCfg->uMaloneBaseAddr[0x1] + pCfg->uMaloneHifOffset[0x1] );
+ }
+ else
+ {
+ pMvdReg = ( MvdHwRegMap * ) ( pCfg->uMaloneBaseAddr[0x0] + pCfg->uMaloneHifOffset[0x0] );
+ }
+
+ if ( pMVDHw->uMaloneID == MALONE_SW )
+ {
+ pMVDHw->msd_regp = ( MvdHwRegMap * )pMvdReg;
+ pMVDHw->hif_regp = ( MvdHwRegHifMap * )pMvdReg;
+ pMVDHw->sif_regp = ( MvdHwRegSifMap * )pMvdReg;
+ pMVDHw->ctx_regp = ( MvdHwRegCtxMap * )pMvdReg;
+ pMVDHw->rsb_regp = ( MvdHwReg * )pMvdReg;
+ pMVDHw->rpr_regp = ( MvdHwRegRprMap * )pMvdReg;
+ pMVDHw->spp_regp = ( MvdHwRegSppMap * )pMvdReg;
+ pMVDHw->avc_regp = ( MvdHwRegH264Map * )pMvdReg;
+ pMVDHw->mp2d_regp = ( MvdHwRegMp2dMap * )pMvdReg;
+ pMVDHw->avsd_regp = ( MvdHwRegAvsdMap * )pMvdReg;
+ pMVDHw->aspd_regp = ( MvdHwRegAspdMap * )pMvdReg;
+ pMVDHw->vc1d_regp = ( MvdHwRegVc1dMap * )pMvdReg;
+ pMVDHw->jpgd_regp = ( MvdHwRegAspdMap * )pMvdReg;
+ pMVDHw->rvid_regp = ( MvdHwRegRvidMap * )pMvdReg;
+ pMVDHw->hevc_regp = ( MvdHwRegHevcMap * )pMvdReg;
+ pMVDHw->on2d_regp = ( MvdHwRegOn2dMap * )pMvdReg;
+ pMVDHw->cq_regp = ( MvdHwRegCqMap * )pMvdReg;
+ pMVDHw->rc4_regp = ( MvdHwRegRC4Map * )pMvdReg;
+ pMVDHw->dfe_regp = ( MvdHwRegDfeMap * )pMvdReg;
+ pMVDHw->dbe_regp[0x0] = ( MvdHwRegDbeMap * )pMvdReg;
+ pMVDHw->dbe_regp[0x1] = ( MvdHwRegDbeMap * )pMvdReg;
+
+ }
+ else
+ {
+ pMVDHw->msd_regp = pMvdReg;
+ pMVDHw->hif_regp = &( pMvdReg->HifMap.hif_map );
+ pMVDHw->sif_regp = &( pMvdReg->SifMap.sif_map );
+ pMVDHw->ctx_regp = &( pMvdReg->CtxMap.ctx_map );
+ pMVDHw->rpr_regp = &( pMvdReg->RprMap.rpr_map );
+ pMVDHw->spp_regp = &( pMvdReg->SppMap.spp_map );
+ pMVDHw->avc_regp = &( pMvdReg->DecMap.h264_map );
+ pMVDHw->mp2d_regp = &( pMvdReg->DecMap.mp2d_map );
+ pMVDHw->aspd_regp = &( pMvdReg->DecMap.aspd_map );
+ pMVDHw->avsd_regp = &( pMvdReg->DecMap.avsd_map );
+ pMVDHw->vc1d_regp = &( pMvdReg->DecMap.vc1d_map );
+ pMVDHw->jpgd_regp = &( pMvdReg->DecMap.aspd_map );
+ pMVDHw->on2d_regp = &( pMvdReg->DecMap.on2d_map );
+ pMVDHw->rvid_regp = &( pMvdReg->DecMap.rvid_map );
+ pMVDHw->hevc_regp = &( pMvdReg->DecMap.hevc_map );
+ pMVDHw->bbd_regp = &( pMvdReg->BbdMap.bbd_map );
+ pMVDHw->cq_regp = &( pMvdReg->CqMap.cq_map );
+ pMVDHw->rc4_regp = &( pMvdReg->RC4Map.RC4_map );
+ pMVDHw->dfe_regp = &( pMvdReg->DcpMap.dfe_map );
+ pMVDHw->dbe_regp[0x0] = &( pMvdReg->DcpMap.dbe_map[0x0] );
+ pMVDHw->dbe_regp[0x1] = &( pMvdReg->DcpMap.dbe_map[0x1] );
+
+ if ( pMVDHw->uMaloneID == MALONE_HW_2 )
+ {
+ pMVDHw->rsb_regp = ( MvdHwReg * ) pCfg->uMaloneBaseAddr[0x1] ;
+ }
+ else
+ {
+ pMVDHw->rsb_regp = ( MvdHwReg * ) pCfg->uMaloneBaseAddr[0x0] ;
+ }
+ }
+ }
+}
+
+/* End of File */