/*************************************************************************/ /*!
|
@File
|
@Title Services initialisation routines
|
@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved
|
@Description Device specific functions
|
@License Dual MIT/GPLv2
|
|
The contents of this file are subject to the MIT license as set out below.
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
of this software and associated documentation files (the "Software"), to deal
|
in the Software without restriction, including without limitation the rights
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
copies of the Software, and to permit persons to whom the Software is
|
furnished to do so, subject to the following conditions:
|
|
The above copyright notice and this permission notice shall be included in
|
all copies or substantial portions of the Software.
|
|
Alternatively, the contents of this file may be used under the terms of
|
the GNU General Public License Version 2 ("GPL") in which case the provisions
|
of GPL are applicable instead of those above.
|
|
If you wish to allow use of your version of this file only under the terms of
|
GPL, and not to allow others to use your version of this file under the terms
|
of the MIT license, indicate your decision by deleting the provisions above
|
and replace them with the notice and other provisions required by GPL as set
|
out in the file called "GPL-COPYING" included in this distribution. If you do
|
not delete the provisions above, a recipient may use your version of this file
|
under the terms of either the MIT license or GPL.
|
|
This License is also included in this distribution in the file called
|
"MIT-COPYING".
|
|
EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS
|
PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
|
BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR
|
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
*/ /**************************************************************************/
|
|
#include "img_defs.h"
|
#include "srvinit.h"
|
#include "pvr_debug.h"
|
#include "osfunc.h"
|
#include "km_apphint_defs.h"
|
#include "htbuffer_types.h"
|
#include "htbuffer_init.h"
|
|
#include "devicemem.h"
|
#include "devicemem_pdump.h"
|
|
#include "client_rgxinit_bridge.h"
|
|
#include "rgx_fwif_sig.h"
|
|
#include "rgx_compat_bvnc.h"
|
|
#include "srvinit_osfunc.h"
|
|
#if !defined(SUPPORT_KERNEL_SRVINIT)
|
#include "rgxdefs.h"
|
#else
|
#include "rgxdefs_km.h"
|
#endif
|
|
#if defined(SUPPORT_GPUVIRT_VALIDATION)
|
#include "virt_validation_defs.h"
|
#endif
|
|
#include "srvinit_pdump.h"
|
|
#include "rgx_fwif_hwperf.h"
|
#include "rgx_hwperf_table.h"
|
|
#include "rgxsrvinit_script.h"
|
|
#include "rgxfwload.h"
|
#include "rgxlayer_impl.h"
|
#include "rgxfwimageutils.h"
|
|
#include "rgx_hwperf_km.h"
|
#include "rgx_bvnc_defs_km.h"
|
|
#if !defined(SUPPORT_KERNEL_SRVINIT)
|
#include "rgx_hwperf.h"
|
#include "rgx_fwif_km.h"
|
#include "rgx_fwif_client.h"
|
#include "rgx_fwif_alignchecks.h"
|
#else
|
#include "rgxdevice.h"
|
#endif
|
static RGX_INIT_COMMAND asDbgCommands[RGX_MAX_DEBUG_COMMANDS];
|
|
#if defined(SUPPORT_TRUSTED_DEVICE)
|
#if !defined(SUPPORT_KERNEL_SRVINIT)
|
#error "SUPPORT_KERNEL_SRVINIT is required by SUPPORT_TRUSTED_DEVICE!"
|
#endif
|
#include "rgxdevice.h"
|
#include "pvrsrv_device.h"
|
#endif
|
|
|
#define HW_PERF_FILTER_DEFAULT 0x00000000 /* Default to no HWPerf */
|
#define HW_PERF_FILTER_DEFAULT_ALL_ON 0xFFFFFFFF /* All events */
|
|
|
#if defined(SUPPORT_KERNEL_SRVINIT) && defined(SUPPORT_VALIDATION)
|
#include "pvrsrv_apphint.h"
|
#endif
|
|
#if defined(SUPPORT_KERNEL_SRVINIT) && defined(LINUX)
|
#include "km_apphint.h"
|
#include "os_srvinit_param.h"
|
#else
|
#include "srvinit_param.h"
|
/*!
|
*******************************************************************************
|
* AppHint mnemonic data type helper tables
|
******************************************************************************/
|
/* apphint map of name vs. enable flag */
|
static SRV_INIT_PARAM_UINT32_LOOKUP htb_loggroup_tbl[] = {
|
#define X(a, b) { #b, HTB_LOG_GROUP_FLAG(a) },
|
HTB_LOG_SFGROUPLIST
|
#undef X
|
};
|
/* apphint map of arg vs. OpMode */
|
static SRV_INIT_PARAM_UINT32_LOOKUP htb_opmode_tbl[] = {
|
{ "droplatest", HTB_OPMODE_DROPLATEST},
|
{ "dropoldest", HTB_OPMODE_DROPOLDEST},
|
/* HTB should never be started in HTB_OPMODE_BLOCK
|
* as this can lead to deadlocks
|
*/
|
};
|
|
static SRV_INIT_PARAM_UINT32_LOOKUP fwt_logtype_tbl[] = {
|
{ "trace", 2},
|
{ "tbi", 1},
|
{ "none", 0}
|
};
|
|
static SRV_INIT_PARAM_UINT32_LOOKUP timecorr_clk_tbl[] = {
|
{ "mono", 0 },
|
{ "mono_raw", 1 },
|
{ "sched", 2 }
|
};
|
|
static SRV_INIT_PARAM_UINT32_LOOKUP fwt_loggroup_tbl[] = { RGXFWIF_LOG_GROUP_NAME_VALUE_MAP };
|
|
/*
|
* Services AppHints initialisation
|
*/
|
#define X(a, b, c, d, e) SrvInitParamInit ## b( a, d, e )
|
APPHINT_LIST_ALL
|
#undef X
|
#endif /* SUPPORT_KERNEL_SRVINIT && LINUX */
|
|
/*
|
* Container for all the apphints used by this module
|
*/
|
typedef struct _RGX_SRVINIT_APPHINTS_
|
{
|
IMG_BOOL bDustRequestInject;
|
IMG_BOOL bEnableSignatureChecks;
|
IMG_UINT32 ui32SignatureChecksBufSize;
|
|
#if defined(DEBUG)
|
IMG_BOOL bAssertOnOutOfMem;
|
IMG_BOOL bAssertOnHWRTrigger;
|
#endif
|
IMG_BOOL bCheckMlist;
|
IMG_BOOL bDisableClockGating;
|
IMG_BOOL bDisableDMOverlap;
|
IMG_BOOL bDisableFEDLogging;
|
IMG_BOOL bDisablePDP;
|
IMG_BOOL bEnableCDMKillRand;
|
IMG_BOOL bEnableFTrace;
|
IMG_BOOL bEnableHWPerf;
|
IMG_BOOL bEnableHWPerfHost;
|
IMG_BOOL bEnableHWR;
|
IMG_BOOL bEnableRTUBypass;
|
IMG_BOOL bFilteringMode;
|
IMG_BOOL bHWPerfDisableCustomCounterFilter;
|
IMG_BOOL bZeroFreelist;
|
IMG_UINT32 ui32EnableFWContextSwitch;
|
IMG_UINT32 ui32FWContextSwitchProfile;
|
IMG_UINT32 ui32HWPerfFWBufSize;
|
IMG_UINT32 ui32HWPerfHostBufSize;
|
IMG_UINT32 ui32HWPerfFilter0;
|
IMG_UINT32 ui32HWPerfFilter1;
|
IMG_UINT32 ui32HWPerfHostFilter;
|
IMG_UINT32 ui32TimeCorrClock;
|
IMG_UINT32 ui32HWRDebugDumpLimit;
|
IMG_UINT32 ui32JonesDisableMask;
|
IMG_UINT32 ui32LogType;
|
IMG_UINT32 ui32TruncateMode;
|
FW_PERF_CONF eFirmwarePerf;
|
RGX_ACTIVEPM_CONF eRGXActivePMConf;
|
RGX_META_T1_CONF eUseMETAT1;
|
RGX_RD_POWER_ISLAND_CONF eRGXRDPowerIslandConf;
|
|
#if defined(SUPPORT_GPUVIRT_VALIDATION)
|
IMG_UINT32 aui32OSidMin[GPUVIRT_VALIDATION_NUM_OS][GPUVIRT_VALIDATION_NUM_REGIONS];
|
IMG_UINT32 aui32OSidMax[GPUVIRT_VALIDATION_NUM_OS][GPUVIRT_VALIDATION_NUM_REGIONS];
|
#endif
|
IMG_BOOL bEnableTrustedDeviceAceConfig;
|
} RGX_SRVINIT_APPHINTS;
|
|
|
/*!
|
*******************************************************************************
|
|
@Function GetApphints
|
|
@Description Read init time apphints and initialise internal variables
|
|
@Input psHints : Pointer to apphints container
|
|
@Return void
|
|
******************************************************************************/
|
static INLINE void GetApphints(RGX_SRVINIT_APPHINTS *psHints, IMG_UINT64 ui64ErnsBrns, IMG_UINT64 ui64Features)
|
{
|
void *pvParamState = SrvInitParamOpen();
|
IMG_UINT32 ui32ParamTemp;
|
IMG_BOOL bS7TopInfra = IMG_FALSE, bE42290 = IMG_FALSE, bTPUFiltermodeCtrl = IMG_FALSE, \
|
bE41805 = IMG_FALSE, bE42606 = IMG_FALSE, bAXIACELite = IMG_FALSE;
|
|
#if defined(PVRSRV_GPUVIRT_GUESTDRV)
|
PVR_UNREFERENCED_PARAMETER(bE41805);
|
PVR_UNREFERENCED_PARAMETER(bE42606);
|
PVR_UNREFERENCED_PARAMETER(bE42290);
|
PVR_UNREFERENCED_PARAMETER(bS7TopInfra);
|
PVR_UNREFERENCED_PARAMETER(bTPUFiltermodeCtrl);
|
#endif
|
|
#if !defined(SUPPORT_KERNEL_SRVINIT)
|
PVR_UNREFERENCED_PARAMETER(ui64ErnsBrns);
|
PVR_UNREFERENCED_PARAMETER(ui64Features);
|
PVR_UNREFERENCED_PARAMETER(bAXIACELite);
|
#if defined(RGX_FEATURE_S7_TOP_INFRASTRUCTURE)
|
bS7TopInfra = IMG_TRUE;
|
#endif
|
#if defined(HW_ERN_42290)
|
bE42290 = IMG_TRUE;
|
#endif
|
#if defined(HW_ERN_41805)
|
bE41805 = IMG_TRUE;
|
#endif
|
#if defined(HW_ERN_42606)
|
bE42606 = IMG_TRUE;
|
#endif
|
#if defined(RGX_FEATURE_AXI_ACELITE)
|
bAXIACELite = IMG_TRUE;
|
#endif
|
#else
|
if(ui64Features & RGX_FEATURE_S7_TOP_INFRASTRUCTURE_BIT_MASK)
|
{
|
bS7TopInfra = IMG_TRUE;
|
}
|
|
if(ui64Features & RGX_FEATURE_TPU_FILTERING_MODE_CONTROL_BIT_MASK)
|
{
|
bTPUFiltermodeCtrl = IMG_TRUE;
|
}
|
|
if(ui64ErnsBrns & HW_ERN_42290_BIT_MASK)
|
{
|
bE42290 = IMG_TRUE;
|
}
|
|
if(ui64ErnsBrns & HW_ERN_41805_BIT_MASK)
|
{
|
bE41805 = IMG_TRUE;
|
}
|
|
if(ui64ErnsBrns & HW_ERN_42606_BIT_MASK)
|
{
|
bE42606 = IMG_TRUE;
|
}
|
|
if(ui64Features & RGX_FEATURE_AXI_ACELITE_BIT_MASK)
|
{
|
bAXIACELite = IMG_TRUE;
|
}
|
#endif
|
/*
|
* KM AppHints not passed through the srvinit interface
|
*/
|
#if !defined(SUPPORT_KERNEL_SRVINIT)
|
SrvInitParamUnreferenced(FWPoisonOnFreeValue);
|
SrvInitParamUnreferenced(EnableFWPoisonOnFree);
|
SrvInitParamUnreferenced(GeneralNon4KHeapPageSize);
|
SrvInitParamUnreferenced(WatchdogThreadWeight);
|
SrvInitParamUnreferenced(WatchdogThreadPriority);
|
SrvInitParamUnreferenced(CleanupThreadWeight);
|
SrvInitParamUnreferenced(CleanupThreadPriority);
|
SrvInitParamUnreferenced(RGXBVNC);
|
#endif
|
|
/*
|
* NB AppHints initialised to a default value via SrvInitParamInit* macros above
|
*/
|
|
SrvInitParamGetBOOL(pvParamState, DustRequestInject, psHints->bDustRequestInject);
|
SrvInitParamGetBOOL(pvParamState, EnableSignatureChecks, psHints->bEnableSignatureChecks);
|
SrvInitParamGetUINT32(pvParamState, SignatureChecksBufSize, psHints->ui32SignatureChecksBufSize);
|
|
#if defined(DEBUG)
|
SrvInitParamGetBOOL(pvParamState, AssertOutOfMemory, psHints->bAssertOnOutOfMem);
|
SrvInitParamGetBOOL(pvParamState, AssertOnHWRTrigger, psHints->bAssertOnHWRTrigger);
|
#endif
|
SrvInitParamGetBOOL(pvParamState, CheckMList, psHints->bCheckMlist);
|
SrvInitParamGetBOOL(pvParamState, DisableClockGating, psHints->bDisableClockGating);
|
SrvInitParamGetBOOL(pvParamState, DisableDMOverlap, psHints->bDisableDMOverlap);
|
SrvInitParamGetBOOL(pvParamState, DisableFEDLogging, psHints->bDisableFEDLogging);
|
SrvInitParamGetUINT32(pvParamState, EnableAPM, ui32ParamTemp);
|
psHints->eRGXActivePMConf = ui32ParamTemp;
|
SrvInitParamGetBOOL(pvParamState, EnableCDMKillingRandMode, psHints->bEnableCDMKillRand);
|
SrvInitParamGetBOOL(pvParamState, EnableFTraceGPU, psHints->bEnableFTrace);
|
SrvInitParamGetUINT32(pvParamState, EnableFWContextSwitch, psHints->ui32EnableFWContextSwitch);
|
SrvInitParamGetBOOL(pvParamState, EnableHWPerf, psHints->bEnableHWPerf);
|
SrvInitParamGetBOOL(pvParamState, EnableHWPerfHost, psHints->bEnableHWPerfHost);
|
SrvInitParamGetBOOL(pvParamState, EnableHWR, psHints->bEnableHWR);
|
SrvInitParamGetUINT32(pvParamState, EnableRDPowerIsland, ui32ParamTemp);
|
psHints->eRGXRDPowerIslandConf = ui32ParamTemp;
|
SrvInitParamGetBOOL(pvParamState, EnableRTUBypass, psHints->bEnableRTUBypass);
|
SrvInitParamGetUINT32(pvParamState, FirmwarePerf, ui32ParamTemp);
|
psHints->eFirmwarePerf = ui32ParamTemp;
|
SrvInitParamGetUINT32(pvParamState, FWContextSwitchProfile, psHints->ui32FWContextSwitchProfile);
|
SrvInitParamGetBOOL(pvParamState, HWPerfDisableCustomCounterFilter, psHints->bHWPerfDisableCustomCounterFilter);
|
SrvInitParamGetUINT32(pvParamState, HWPerfHostBufSizeInKB, psHints->ui32HWPerfHostBufSize);
|
SrvInitParamGetUINT32(pvParamState, HWPerfFWBufSizeInKB, psHints->ui32HWPerfFWBufSize);
|
#if defined(SUPPORT_KERNEL_SRVINIT) && defined(LINUX)
|
/* name changes */
|
{
|
IMG_UINT64 ui64Tmp;
|
SrvInitParamGetBOOL(pvParamState, DisablePDumpPanic, psHints->bDisablePDP);
|
SrvInitParamGetUINT64(pvParamState, HWPerfFWFilter, ui64Tmp);
|
psHints->ui32HWPerfFilter0 = (IMG_UINT32)(ui64Tmp & 0xffffffffllu);
|
psHints->ui32HWPerfFilter1 = (IMG_UINT32)((ui64Tmp >> 32) & 0xffffffffllu);
|
}
|
#else
|
SrvInitParamGetBOOL(pvParamState, DisablePDP, psHints->bDisablePDP);
|
SrvInitParamGetUINT32(pvParamState, HWPerfFilter0, psHints->ui32HWPerfFilter0);
|
SrvInitParamGetUINT32(pvParamState, HWPerfFilter1, psHints->ui32HWPerfFilter1);
|
SrvInitParamUnreferenced(DisablePDumpPanic);
|
SrvInitParamUnreferenced(HWPerfFWFilter);
|
SrvInitParamUnreferenced(RGXBVNC);
|
#endif
|
SrvInitParamGetUINT32(pvParamState, HWPerfHostFilter, psHints->ui32HWPerfHostFilter);
|
SrvInitParamGetUINT32List(pvParamState, TimeCorrClock, psHints->ui32TimeCorrClock);
|
SrvInitParamGetUINT32(pvParamState, HWRDebugDumpLimit, ui32ParamTemp);
|
psHints->ui32HWRDebugDumpLimit = MIN(ui32ParamTemp, RGXFWIF_HWR_DEBUG_DUMP_ALL);
|
|
if(bS7TopInfra)
|
{
|
#define RGX_CR_JONES_FIX_MT_ORDER_ISP_TE_CLRMSK (0XFFFFFFCFU)
|
#define RGX_CR_JONES_FIX_MT_ORDER_ISP_EN (0X00000020U)
|
#define RGX_CR_JONES_FIX_MT_ORDER_TE_EN (0X00000010U)
|
|
SrvInitParamGetUINT32(pvParamState, JonesDisableMask, ui32ParamTemp);
|
if (((ui32ParamTemp & ~RGX_CR_JONES_FIX_MT_ORDER_ISP_TE_CLRMSK) == RGX_CR_JONES_FIX_MT_ORDER_ISP_EN) ||
|
((ui32ParamTemp & ~RGX_CR_JONES_FIX_MT_ORDER_ISP_TE_CLRMSK) == RGX_CR_JONES_FIX_MT_ORDER_TE_EN))
|
{
|
ui32ParamTemp |= (RGX_CR_JONES_FIX_MT_ORDER_TE_EN |
|
RGX_CR_JONES_FIX_MT_ORDER_ISP_EN);
|
PVR_DPF((PVR_DBG_WARNING, "Tile reordering mode requires both TE and ISP enabled. Forcing JonesDisableMask = %d",
|
ui32ParamTemp));
|
}
|
psHints->ui32JonesDisableMask = ui32ParamTemp;
|
}
|
|
if ( (bE42290) && (bTPUFiltermodeCtrl))
|
{
|
SrvInitParamGetBOOL(pvParamState, NewFilteringMode, psHints->bFilteringMode);
|
}
|
|
if(bE41805 || bE42606)
|
{
|
SrvInitParamGetUINT32(pvParamState, TruncateMode, psHints->ui32TruncateMode);
|
}
|
#if defined(EMULATOR)
|
if(bAXIACELite)
|
{
|
SrvInitParamGetBOOL(pvParamState, EnableTrustedDeviceAceConfig, psHints->bEnableTrustedDeviceAceConfig);
|
}
|
#else
|
#if !defined(SUPPORT_KERNEL_SRVINIT)
|
SrvInitParamUnreferenced(EnableTrustedDeviceAceConfig);
|
#endif
|
#endif
|
|
SrvInitParamGetUINT32(pvParamState, UseMETAT1, ui32ParamTemp);
|
psHints->eUseMETAT1 = ui32ParamTemp & RGXFWIF_INICFG_METAT1_MASK;
|
|
SrvInitParamGetBOOL(pvParamState, ZeroFreelist, psHints->bZeroFreelist);
|
|
|
/*
|
* HWPerf filter apphints setup
|
*/
|
if (psHints->bEnableHWPerf)
|
{
|
if (psHints->ui32HWPerfFilter0 == 0 && psHints->ui32HWPerfFilter1 == 0)
|
{
|
psHints->ui32HWPerfFilter0 = HW_PERF_FILTER_DEFAULT_ALL_ON;
|
psHints->ui32HWPerfFilter1 = HW_PERF_FILTER_DEFAULT_ALL_ON;
|
}
|
}
|
else
|
{
|
if (psHints->ui32HWPerfFilter0 != 0 || psHints->ui32HWPerfFilter1 != 0)
|
{
|
psHints->bEnableHWPerf = IMG_TRUE;
|
}
|
}
|
|
#if defined(SUPPORT_GPUTRACE_EVENTS)
|
if (psHints->bEnableFTrace)
|
{
|
/* In case we have not set EnableHWPerf AppHint just request creation
|
* of certain events we need for the FTrace i.e. only the Kick/Finish
|
* HW events */
|
if (!psHints->bEnableHWPerf)
|
{
|
psHints->ui32HWPerfFilter0 = (IMG_UINT32) (RGX_HWPERF_EVENT_MASK_HW_KICKFINISH & 0xFFFFFFFF);
|
psHints->ui32HWPerfFilter1 = (IMG_UINT32) ((RGX_HWPERF_EVENT_MASK_HW_KICKFINISH & 0xFFFFFFFF00000000) >> 32);
|
}
|
else
|
{
|
psHints->ui32HWPerfFilter0 = HW_PERF_FILTER_DEFAULT_ALL_ON;
|
psHints->ui32HWPerfFilter1 = HW_PERF_FILTER_DEFAULT_ALL_ON;
|
}
|
|
}
|
#endif
|
|
if (psHints->bEnableHWPerfHost)
|
{
|
if (psHints->ui32HWPerfHostFilter == 0)
|
{
|
psHints->ui32HWPerfHostFilter = HW_PERF_FILTER_DEFAULT_ALL_ON;
|
}
|
}
|
else
|
{
|
if (psHints->ui32HWPerfHostFilter != 0)
|
{
|
psHints->bEnableHWPerfHost = IMG_TRUE;
|
}
|
}
|
|
/*
|
* FW logs apphints
|
*/
|
{
|
IMG_UINT32 ui32LogType;
|
IMG_BOOL bFirmwareLogTypeConfigured, bAnyLogGroupConfigured;
|
|
SrvInitParamGetUINT32BitField(pvParamState, EnableLogGroup, ui32LogType);
|
bAnyLogGroupConfigured = ui32LogType ? IMG_TRUE : IMG_FALSE;
|
bFirmwareLogTypeConfigured = SrvInitParamGetUINT32List(pvParamState, FirmwareLogType, ui32ParamTemp);
|
|
if (bFirmwareLogTypeConfigured)
|
{
|
if (ui32ParamTemp == 2 /* TRACE */)
|
{
|
if (!bAnyLogGroupConfigured)
|
{
|
/* No groups configured - defaulting to MAIN group */
|
ui32LogType |= RGXFWIF_LOG_TYPE_GROUP_MAIN;
|
}
|
ui32LogType |= RGXFWIF_LOG_TYPE_TRACE;
|
}
|
else if (ui32ParamTemp == 1 /* TBI */)
|
{
|
if (!bAnyLogGroupConfigured)
|
{
|
/* No groups configured - defaulting to MAIN group */
|
ui32LogType |= RGXFWIF_LOG_TYPE_GROUP_MAIN;
|
}
|
ui32LogType &= ~RGXFWIF_LOG_TYPE_TRACE;
|
}
|
else if (ui32ParamTemp == 0 /* NONE */)
|
{
|
ui32LogType = RGXFWIF_LOG_TYPE_NONE;
|
}
|
}
|
else
|
{
|
/* No log type configured - defaulting to TRACE */
|
ui32LogType |= RGXFWIF_LOG_TYPE_TRACE;
|
}
|
|
psHints->ui32LogType = ui32LogType;
|
}
|
|
#if defined(SUPPORT_GPUVIRT_VALIDATION)
|
/*
|
* GPU virtualisation validation apphints
|
*/
|
{
|
IMG_UINT uiCounter, uiRegion;
|
|
PVR_DPF((PVR_DBG_MESSAGE,"\n[GPU Virtualization Validation]: Reading OSid limits\n"));
|
|
for (uiRegion = 0; uiRegion < GPUVIRT_VALIDATION_NUM_REGIONS; uiRegion++)
|
{
|
for (uiCounter = 0; uiCounter < GPUVIRT_VALIDATION_NUM_OS; uiCounter++)
|
{
|
IMG_CHAR pszHintString[GPUVIRT_VALIDATION_MAX_STRING_LENGTH];
|
IMG_UINT32 ui32Default = 0;
|
|
snprintf(pszHintString, GPUVIRT_VALIDATION_MAX_STRING_LENGTH, "OSidRegion%dMin%d", uiRegion, uiCounter);
|
PVRSRVGetAppHint(pvParamState,
|
pszHintString,
|
IMG_UINT_TYPE,
|
&ui32Default,
|
&(psHints->aui32OSidMin[uiCounter][uiRegion]));
|
|
snprintf(pszHintString, GPUVIRT_VALIDATION_MAX_STRING_LENGTH, "OSidRegion%dMax%d", uiRegion, uiCounter);
|
PVRSRVGetAppHint(pvParamState,
|
pszHintString,
|
IMG_UINT_TYPE,
|
&ui32Default,
|
&(psHints->aui32OSidMax[uiCounter][uiRegion]));
|
}
|
}
|
|
for (uiCounter = 0; uiCounter < GPUVIRT_VALIDATION_NUM_OS; uiCounter++)
|
{
|
for (uiRegion = 0; uiRegion < GPUVIRT_VALIDATION_NUM_REGIONS; uiRegion++)
|
{
|
PVR_DPF((PVR_DBG_MESSAGE,
|
"\n[GPU Virtualization Validation]: Region:%d, OSid:%d, Min:%u, Max:%u\n",
|
uiRegion, uiCounter,
|
psHints->aui32OSidMin[uiCounter][uiRegion],
|
psHints->aui32OSidMax[uiCounter][uiRegion]));
|
}
|
}
|
}
|
#endif /* defined(SUPPORT_GPUVIRT_VALIDATION) */
|
|
|
SrvInitParamClose(pvParamState);
|
}
|
|
|
/*!
|
*******************************************************************************
|
|
@Function GetFWConfigFlags
|
|
@Description Initialise and return FW config flags
|
|
@Input psHints : Apphints container
|
@Input pui32FWConfigFlags : Pointer to config flags
|
|
@Return void
|
|
******************************************************************************/
|
static INLINE void GetFWConfigFlags(RGX_SRVINIT_APPHINTS *psHints,
|
IMG_UINT32 *pui32FWConfigFlags)
|
{
|
IMG_UINT32 ui32FWConfigFlags = 0;
|
|
#if defined(DEBUG)
|
ui32FWConfigFlags |= psHints->bAssertOnOutOfMem ? RGXFWIF_INICFG_ASSERT_ON_OUTOFMEMORY : 0;
|
ui32FWConfigFlags |= psHints->bAssertOnHWRTrigger ? RGXFWIF_INICFG_ASSERT_ON_HWR_TRIGGER : 0;
|
#endif
|
ui32FWConfigFlags |= psHints->bCheckMlist ? RGXFWIF_INICFG_CHECK_MLIST_EN : 0;
|
ui32FWConfigFlags |= psHints->bDisableClockGating ? RGXFWIF_INICFG_DISABLE_CLKGATING_EN : 0;
|
ui32FWConfigFlags |= psHints->bDisableDMOverlap ? RGXFWIF_INICFG_DISABLE_DM_OVERLAP : 0;
|
ui32FWConfigFlags |= psHints->bDisablePDP ? RGXFWIF_SRVCFG_DISABLE_PDP_EN : 0;
|
ui32FWConfigFlags |= psHints->bEnableCDMKillRand ? RGXFWIF_INICFG_CDM_KILL_MODE_RAND_EN : 0;
|
#if defined(SUPPORT_GPUTRACE_EVENTS)
|
/* Since FTrace GPU events depends on HWPerf, ensure it is enabled here */
|
ui32FWConfigFlags |= psHints->bEnableFTrace ? RGXFWIF_INICFG_HWPERF_EN : 0;
|
#endif
|
ui32FWConfigFlags |= psHints->bEnableHWPerf ? RGXFWIF_INICFG_HWPERF_EN : 0;
|
#if !defined(NO_HARDWARE)
|
ui32FWConfigFlags |= psHints->bEnableHWR ? RGXFWIF_INICFG_HWR_EN : 0;
|
#endif
|
ui32FWConfigFlags |= psHints->bEnableRTUBypass ? RGXFWIF_INICFG_RTU_BYPASS_EN : 0;
|
ui32FWConfigFlags |= psHints->bHWPerfDisableCustomCounterFilter ? RGXFWIF_INICFG_HWP_DISABLE_FILTER : 0;
|
ui32FWConfigFlags |= (psHints->eFirmwarePerf == FW_PERF_CONF_CUSTOM_TIMER) ? RGXFWIF_INICFG_CUSTOM_PERF_TIMER_EN : 0;
|
ui32FWConfigFlags |= (psHints->eFirmwarePerf == FW_PERF_CONF_POLLS) ? RGXFWIF_INICFG_POLL_COUNTERS_EN : 0;
|
ui32FWConfigFlags |= psHints->eUseMETAT1 << RGXFWIF_INICFG_METAT1_SHIFT;
|
ui32FWConfigFlags |= psHints->ui32EnableFWContextSwitch & ~RGXFWIF_INICFG_CTXSWITCH_CLRMSK;
|
ui32FWConfigFlags |= (psHints->ui32FWContextSwitchProfile << RGXFWIF_INICFG_CTXSWITCH_PROFILE_SHIFT) & RGXFWIF_INICFG_CTXSWITCH_PROFILE_MASK;
|
|
*pui32FWConfigFlags = ui32FWConfigFlags;
|
}
|
|
|
/*!
|
*******************************************************************************
|
|
@Function GetFilterFlags
|
|
@Description Initialise and return filter flags
|
|
@Input psHints : Apphints container
|
|
@Return Filter flags
|
|
******************************************************************************/
|
static INLINE IMG_UINT32 GetFilterFlags(RGX_SRVINIT_APPHINTS *psHints)
|
{
|
IMG_UINT32 ui32FilterFlags = 0;
|
|
ui32FilterFlags |= psHints->bFilteringMode ? RGXFWIF_FILTCFG_NEW_FILTER_MODE : 0;
|
if (psHints->ui32TruncateMode == 2)
|
{
|
ui32FilterFlags |= RGXFWIF_FILTCFG_TRUNCATE_INT;
|
}
|
else if (psHints->ui32TruncateMode == 3)
|
{
|
ui32FilterFlags |= RGXFWIF_FILTCFG_TRUNCATE_HALF;
|
}
|
|
return ui32FilterFlags;
|
}
|
|
|
/*!
|
*******************************************************************************
|
|
@Function GetDeviceFlags
|
|
@Description Initialise and return device flags
|
|
@Input psHints : Apphints container
|
@Input pui32DeviceFlags : Pointer to device flags
|
|
@Return void
|
|
******************************************************************************/
|
static INLINE void GetDeviceFlags(RGX_SRVINIT_APPHINTS *psHints,
|
IMG_UINT32 *pui32DeviceFlags)
|
{
|
IMG_UINT32 ui32DeviceFlags = 0;
|
|
ui32DeviceFlags |= psHints->bDustRequestInject? RGXKMIF_DEVICE_STATE_DUST_REQUEST_INJECT_EN : 0;
|
|
ui32DeviceFlags |= psHints->bZeroFreelist ? RGXKMIF_DEVICE_STATE_ZERO_FREELIST : 0;
|
ui32DeviceFlags |= psHints->bDisableFEDLogging ? RGXKMIF_DEVICE_STATE_DISABLE_DW_LOGGING_EN : 0;
|
ui32DeviceFlags |= psHints->bEnableHWPerfHost ? RGXKMIF_DEVICE_STATE_HWPERF_HOST_EN : 0;
|
#if defined(SUPPORT_GPUTRACE_EVENTS)
|
ui32DeviceFlags |= psHints->bEnableFTrace ? RGXKMIF_DEVICE_STATE_FTRACE_EN : 0;
|
#endif
|
|
*pui32DeviceFlags = ui32DeviceFlags;
|
}
|
|
|
/*!
|
*******************************************************************************
|
|
@Function PrepareDebugScript
|
|
@Description Generates a script to dump debug info
|
|
@Input psScript
|
|
@Return IMG_BOOL True if it runs out of cmds when building the script
|
|
******************************************************************************/
|
static IMG_BOOL PrepareDebugScript(RGX_SCRIPT_BUILD* psDbgInitScript,
|
IMG_BOOL bFirmwarePerf,
|
void *pvDeviceInfo)
|
{
|
#define DBG_READ(T, R, S) if (!ScriptDBGReadRGXReg(psDbgInitScript, T, R, S)) return IMG_FALSE;
|
#if defined(RGX_FEATURE_META) || defined(SUPPORT_KERNEL_SRVINIT)
|
#define DBG_MSP_READ(R, S) if (!ScriptDBGReadMetaRegThroughSP(psDbgInitScript, R, S)) return IMG_FALSE;
|
#define DBG_MCR_READ(R, S) if (!ScriptDBGReadMetaCoreReg(psDbgInitScript, R, S)) return IMG_FALSE;
|
#else
|
#define DBG_MSP_READ(R, S)
|
#define DBG_MCR_READ(R, S)
|
#endif
|
#define DBG_CALC(R, S, T, U, V) if (!ScriptDBGCalc(psDbgInitScript, R, S, T, U, V)) return IMG_FALSE;
|
#define DBG_STRING(S) if (!ScriptDBGString(psDbgInitScript, S)) return IMG_FALSE;
|
#define DBG_READ32(R, S) DBG_READ(RGX_INIT_OP_DBG_READ32_HW_REG, R, S)
|
#define DBG_READ64(R, S) DBG_READ(RGX_INIT_OP_DBG_READ64_HW_REG, R, S)
|
#define DBG_CALC_TA_AND_3D(R, S, T, U) DBG_CALC(RGX_INIT_OP_DBG_CALC, R, S, T, U)
|
IMG_BOOL bS7Infra, bXTInfra, e44871, bRayTracing, e47025, bVIVTSlc, bMIPS, bPBVNC;
|
IMG_UINT32 ui32SLCBanks = 0, ui32Meta = 0;
|
#if !defined(SUPPORT_KERNEL_SRVINIT)
|
PVR_UNREFERENCED_PARAMETER(pvDeviceInfo);
|
#else
|
PVRSRV_RGXDEV_INFO *psDevInfo = (PVRSRV_RGXDEV_INFO *)pvDeviceInfo;
|
#endif
|
PVR_UNREFERENCED_PARAMETER(bFirmwarePerf);
|
bS7Infra = bXTInfra = e44871 = bRayTracing = e47025 = bVIVTSlc = bMIPS = bPBVNC = IMG_FALSE;
|
|
|
#if !defined(SUPPORT_KERNEL_SRVINIT)
|
#if defined(RGX_FEATURE_META)
|
ui32Meta = RGX_FEATURE_META;
|
#endif
|
#if defined(RGX_FEATURE_S7_TOP_INFRASTRUCTURE)
|
bS7Infra = IMG_TRUE;
|
#endif
|
|
#if defined(RGX_FEATURE_XT_TOP_INFRASTRUCTURE)
|
bXTInfra = IMG_TRUE;
|
#endif
|
|
#if defined(FIX_HW_BRN_44871)
|
e44871 = IMG_TRUE;
|
#endif
|
|
#if defined(HW_ERN_47025)
|
e47025 = IMG_TRUE;
|
#endif
|
|
#if defined(RGX_FEATURE_RAY_TRACING)
|
bRayTracing = IMG_TRUE;
|
#endif
|
|
#if defined(RGX_FEATURE_SLC_BANKS)
|
ui32SLCBanks = RGX_FEATURE_SLC_BANKS;
|
#endif
|
|
#if defined(RGX_FEATURE_SLC_VIVT)
|
bVIVTSlc = IMG_TRUE;
|
#endif
|
|
#if defined(RGX_FEATURE_MIPS)
|
bMIPS = IMG_TRUE;
|
#endif
|
#if defined(RGX_FEATURE_PBVNC_COREID_REG)
|
bPBVNC = IMG_TRUE;
|
#endif
|
#else
|
do{
|
if(NULL == psDevInfo)
|
break;
|
|
if(psDevInfo->sDevFeatureCfg.ui64Features & RGX_FEATURE_PBVNC_COREID_REG_BIT_MASK)
|
{
|
bPBVNC = IMG_TRUE;
|
}
|
|
if(psDevInfo->sDevFeatureCfg.ui32META)
|
{
|
ui32Meta = psDevInfo->sDevFeatureCfg.ui32META;
|
}
|
|
if(psDevInfo->sDevFeatureCfg.ui64Features & RGX_FEATURE_S7_TOP_INFRASTRUCTURE_BIT_MASK)
|
{
|
bS7Infra = IMG_TRUE;
|
}
|
|
if(psDevInfo->sDevFeatureCfg.ui64Features & RGX_FEATURE_XT_TOP_INFRASTRUCTURE_BIT_MASK)
|
{
|
bXTInfra = IMG_TRUE;
|
}
|
|
if(psDevInfo->sDevFeatureCfg.ui64Features & RGX_FEATURE_RAY_TRACING_BIT_MASK)
|
{
|
bRayTracing = IMG_TRUE;
|
}
|
|
if(psDevInfo->sDevFeatureCfg.ui64Features & RGX_FEATURE_SLC_VIVT_BIT_MASK)
|
{
|
bVIVTSlc = IMG_TRUE;
|
}
|
|
if(psDevInfo->sDevFeatureCfg.ui64Features & RGX_FEATURE_MIPS_BIT_MASK)
|
{
|
bMIPS = IMG_TRUE;
|
}
|
|
|
if(psDevInfo->sDevFeatureCfg.ui32SLCBanks)
|
{
|
ui32SLCBanks = psDevInfo->sDevFeatureCfg.ui32SLCBanks;
|
}
|
|
if(psDevInfo->sDevFeatureCfg.ui64ErnsBrns & FIX_HW_BRN_44871_BIT_MASK)
|
{
|
e44871 = IMG_TRUE;
|
}
|
|
if(psDevInfo->sDevFeatureCfg.ui64ErnsBrns & HW_ERN_47025_POS)
|
{
|
e47025 = IMG_TRUE;
|
}
|
|
}while(0);
|
#endif
|
|
if(bPBVNC)
|
{
|
DBG_READ64(RGX_CR_CORE_ID, "CORE_ID ");
|
}else
|
{
|
DBG_READ32(RGX_CR_CORE_ID, "CORE_ID ");
|
}
|
|
DBG_READ32(RGX_CR_CORE_REVISION, "CORE_REVISION ");
|
DBG_READ32(RGX_CR_DESIGNER_REV_FIELD1, "DESIGNER_REV_FIELD1 ");
|
DBG_READ32(RGX_CR_DESIGNER_REV_FIELD2, "DESIGNER_REV_FIELD2 ");
|
DBG_READ64(RGX_CR_CHANGESET_NUMBER, "CHANGESET_NUMBER ");
|
if(ui32Meta)
|
{
|
DBG_READ32(RGX_CR_META_SP_MSLVIRQSTATUS, "META_SP_MSLVIRQSTATUS ");
|
}
|
DBG_READ64(RGX_CR_CLK_CTRL, "CLK_CTRL ");
|
DBG_READ64(RGX_CR_CLK_STATUS, "CLK_STATUS ");
|
DBG_READ64(RGX_CR_CLK_CTRL2, "CLK_CTRL2 ");
|
DBG_READ64(RGX_CR_CLK_STATUS2, "CLK_STATUS2 ");
|
if (bS7Infra)
|
{
|
DBG_READ64(RGX_CR_CLK_XTPLUS_CTRL, "CLK_XTPLUS_CTRL ");
|
DBG_READ64(RGX_CR_CLK_XTPLUS_STATUS, "CLK_XTPLUS_STATUS ");
|
}
|
DBG_READ32(RGX_CR_EVENT_STATUS, "EVENT_STATUS ");
|
DBG_READ64(RGX_CR_TIMER, "TIMER ");
|
if (bS7Infra)
|
{
|
DBG_READ64(RGX_CR_MMU_FAULT_STATUS, "MMU_FAULT_STATUS ");
|
DBG_READ64(RGX_CR_MMU_FAULT_STATUS_META, "MMU_FAULT_STATUS_META ");
|
}
|
else
|
{
|
DBG_READ32(RGX_CR_BIF_FAULT_BANK0_MMU_STATUS, "BIF_FAULT_BANK0_MMU_STATUS ");
|
DBG_READ64(RGX_CR_BIF_FAULT_BANK0_REQ_STATUS, "BIF_FAULT_BANK0_REQ_STATUS ");
|
DBG_READ32(RGX_CR_BIF_FAULT_BANK1_MMU_STATUS, "BIF_FAULT_BANK1_MMU_STATUS ");
|
DBG_READ64(RGX_CR_BIF_FAULT_BANK1_REQ_STATUS, "BIF_FAULT_BANK1_REQ_STATUS ");
|
}
|
|
DBG_READ32(RGX_CR_BIF_MMU_STATUS, "BIF_MMU_STATUS ");
|
DBG_READ32(RGX_CR_BIF_MMU_ENTRY, "BIF_MMU_ENTRY ");
|
DBG_READ64(RGX_CR_BIF_MMU_ENTRY_STATUS, "BIF_MMU_ENTRY_STATUS ");
|
if (bS7Infra)
|
{
|
DBG_READ32(RGX_CR_BIF_JONES_OUTSTANDING_READ, "BIF_JONES_OUTSTANDING_READ ");
|
DBG_READ32(RGX_CR_BIF_BLACKPEARL_OUTSTANDING_READ, "BIF_BLACKPEARL_OUTSTANDING_READ ");
|
DBG_READ32(RGX_CR_BIF_DUST_OUTSTANDING_READ, "BIF_DUST_OUTSTANDING_READ ");
|
}else
|
{
|
|
if (!bXTInfra)
|
{
|
DBG_READ32(RGX_CR_BIF_STATUS_MMU, "BIF_STATUS_MMU ");
|
DBG_READ32(RGX_CR_BIF_READS_EXT_STATUS, "BIF_READS_EXT_STATUS ");
|
DBG_READ32(RGX_CR_BIF_READS_INT_STATUS, "BIF_READS_INT_STATUS ");
|
}
|
DBG_READ32(RGX_CR_BIFPM_STATUS_MMU, "BIFPM_STATUS_MMU ");
|
DBG_READ32(RGX_CR_BIFPM_READS_EXT_STATUS, "BIFPM_READS_EXT_STATUS ");
|
DBG_READ32(RGX_CR_BIFPM_READS_INT_STATUS, "BIFPM_READS_INT_STATUS ");
|
}
|
|
if(e44871)
|
{
|
DBG_STRING("Warning: BRN44871 is present");
|
}
|
|
if(e47025)
|
{
|
DBG_READ64(RGX_CR_CDM_CONTEXT_LOAD_PDS0, "CDM_CONTEXT_LOAD_PDS0 ");
|
DBG_READ64(RGX_CR_CDM_CONTEXT_LOAD_PDS1, "CDM_CONTEXT_LOAD_PDS1 ");
|
}
|
|
DBG_READ32(RGX_CR_SLC_STATUS0, "SLC_STATUS0 ");
|
DBG_READ64(RGX_CR_SLC_STATUS1, "SLC_STATUS1 ");
|
|
if (ui32SLCBanks)
|
{
|
DBG_READ64(RGX_CR_SLC_STATUS2, "SLC_STATUS2 ");
|
}
|
|
if (bVIVTSlc)
|
{
|
DBG_READ64(RGX_CR_CONTEXT_MAPPING0, "CONTEXT_MAPPING0 ");
|
DBG_READ64(RGX_CR_CONTEXT_MAPPING1, "CONTEXT_MAPPING1 ");
|
DBG_READ64(RGX_CR_CONTEXT_MAPPING2, "CONTEXT_MAPPING2 ");
|
DBG_READ64(RGX_CR_CONTEXT_MAPPING3, "CONTEXT_MAPPING3 ");
|
DBG_READ64(RGX_CR_CONTEXT_MAPPING4, "CONTEXT_MAPPING4 ");
|
}else{
|
DBG_READ64(RGX_CR_BIF_CAT_BASE_INDEX, "BIF_CAT_BASE_INDEX ");
|
DBG_READ64(RGX_CR_BIF_CAT_BASE0, "BIF_CAT_BASE0 ");
|
DBG_READ64(RGX_CR_BIF_CAT_BASE1, "BIF_CAT_BASE1 ");
|
DBG_READ64(RGX_CR_BIF_CAT_BASE2, "BIF_CAT_BASE2 ");
|
DBG_READ64(RGX_CR_BIF_CAT_BASE3, "BIF_CAT_BASE3 ");
|
DBG_READ64(RGX_CR_BIF_CAT_BASE4, "BIF_CAT_BASE4 ");
|
DBG_READ64(RGX_CR_BIF_CAT_BASE5, "BIF_CAT_BASE5 ");
|
DBG_READ64(RGX_CR_BIF_CAT_BASE6, "BIF_CAT_BASE6 ");
|
DBG_READ64(RGX_CR_BIF_CAT_BASE7, "BIF_CAT_BASE7 ");
|
}
|
|
DBG_READ32(RGX_CR_BIF_CTRL_INVAL, "BIF_CTRL_INVAL ");
|
DBG_READ32(RGX_CR_BIF_CTRL, "BIF_CTRL ");
|
|
DBG_READ64(RGX_CR_BIF_PM_CAT_BASE_VCE0, "BIF_PM_CAT_BASE_VCE0 ");
|
DBG_READ64(RGX_CR_BIF_PM_CAT_BASE_TE0, "BIF_PM_CAT_BASE_TE0 ");
|
DBG_READ64(RGX_CR_BIF_PM_CAT_BASE_ALIST0, "BIF_PM_CAT_BASE_ALIST0 ");
|
DBG_READ64(RGX_CR_BIF_PM_CAT_BASE_VCE1, "BIF_PM_CAT_BASE_VCE1 ");
|
DBG_READ64(RGX_CR_BIF_PM_CAT_BASE_TE1, "BIF_PM_CAT_BASE_TE1 ");
|
DBG_READ64(RGX_CR_BIF_PM_CAT_BASE_ALIST1, "BIF_PM_CAT_BASE_ALIST1 ");
|
|
DBG_READ32(RGX_CR_PERF_TA_PHASE, "PERF_TA_PHASE ");
|
DBG_READ32(RGX_CR_PERF_TA_CYCLE, "PERF_TA_CYCLE ");
|
DBG_READ32(RGX_CR_PERF_3D_PHASE, "PERF_3D_PHASE ");
|
DBG_READ32(RGX_CR_PERF_3D_CYCLE, "PERF_3D_CYCLE ");
|
|
DBG_READ32(RGX_CR_PERF_TA_OR_3D_CYCLE, "PERF_TA_OR_3D_CYCLE ");
|
DBG_CALC_TA_AND_3D(RGX_CR_PERF_TA_CYCLE, RGX_CR_PERF_3D_CYCLE, RGX_CR_PERF_TA_OR_3D_CYCLE,
|
"PERF_TA_AND_3D_CYCLE ");
|
|
DBG_READ32(RGX_CR_PERF_COMPUTE_PHASE, "PERF_COMPUTE_PHASE ");
|
DBG_READ32(RGX_CR_PERF_COMPUTE_CYCLE, "PERF_COMPUTE_CYCLE ");
|
|
DBG_READ32(RGX_CR_PM_PARTIAL_RENDER_ENABLE, "PARTIAL_RENDER_ENABLE ");
|
|
DBG_READ32(RGX_CR_ISP_RENDER, "ISP_RENDER ");
|
DBG_READ64(RGX_CR_TLA_STATUS, "TLA_STATUS ");
|
DBG_READ64(RGX_CR_MCU_FENCE, "MCU_FENCE ");
|
|
DBG_READ32(RGX_CR_VDM_CONTEXT_STORE_STATUS, "VDM_CONTEXT_STORE_STATUS ");
|
DBG_READ64(RGX_CR_VDM_CONTEXT_STORE_TASK0, "VDM_CONTEXT_STORE_TASK0 ");
|
DBG_READ64(RGX_CR_VDM_CONTEXT_STORE_TASK1, "VDM_CONTEXT_STORE_TASK1 ");
|
DBG_READ64(RGX_CR_VDM_CONTEXT_STORE_TASK2, "VDM_CONTEXT_STORE_TASK2 ");
|
DBG_READ64(RGX_CR_VDM_CONTEXT_RESUME_TASK0, "VDM_CONTEXT_RESUME_TASK0 ");
|
DBG_READ64(RGX_CR_VDM_CONTEXT_RESUME_TASK1, "VDM_CONTEXT_RESUME_TASK1 ");
|
DBG_READ64(RGX_CR_VDM_CONTEXT_RESUME_TASK2, "VDM_CONTEXT_RESUME_TASK2 ");
|
|
DBG_READ32(RGX_CR_ISP_CTL, "ISP_CTL ");
|
DBG_READ32(RGX_CR_ISP_STATUS, "ISP_STATUS ");
|
DBG_READ32(RGX_CR_MTS_INTCTX, "MTS_INTCTX ");
|
DBG_READ32(RGX_CR_MTS_BGCTX, "MTS_BGCTX ");
|
DBG_READ32(RGX_CR_MTS_BGCTX_COUNTED_SCHEDULE, "MTS_BGCTX_COUNTED_SCHEDULE ");
|
DBG_READ32(RGX_CR_MTS_SCHEDULE, "MTS_SCHEDULE ");
|
DBG_READ32(RGX_CR_MTS_GPU_INT_STATUS, "MTS_GPU_INT_STATUS ");
|
|
DBG_READ32(RGX_CR_CDM_CONTEXT_STORE_STATUS, "CDM_CONTEXT_STORE_STATUS ");
|
DBG_READ64(RGX_CR_CDM_CONTEXT_PDS0, "CDM_CONTEXT_PDS0 ");
|
DBG_READ64(RGX_CR_CDM_CONTEXT_PDS1, "CDM_CONTEXT_PDS1 ");
|
DBG_READ64(RGX_CR_CDM_TERMINATE_PDS, "CDM_TERMINATE_PDS ");
|
DBG_READ64(RGX_CR_CDM_TERMINATE_PDS1, "CDM_TERMINATE_PDS1 ");
|
|
if(e47025)
|
{
|
DBG_READ64(RGX_CR_CDM_CONTEXT_LOAD_PDS0, "CDM_CONTEXT_LOAD_PDS0 ");
|
DBG_READ64(RGX_CR_CDM_CONTEXT_LOAD_PDS1, "CDM_CONTEXT_LOAD_PDS1 ");
|
}
|
|
if(bRayTracing)
|
{
|
#if defined(RGX_FEATURE_RAY_TRACING) || defined(SUPPORT_KERNEL_SRVINIT)
|
DBG_READ32(DPX_CR_BIF_MMU_STATUS, "DPX_CR_BIF_MMU_STATUS ");
|
DBG_READ64(DPX_CR_BIF_FAULT_BANK_MMU_STATUS, "DPX_CR_BIF_FAULT_BANK_MMU_STATUS");
|
DBG_READ64(DPX_CR_BIF_FAULT_BANK_REQ_STATUS, "DPX_CR_BIF_FAULT_BANK_REQ_STATUS");
|
|
DBG_READ64(RGX_CR_RPM_SHF_FPL, "RGX_CR_RPM_SHF_FPL ");
|
DBG_READ32(RGX_CR_RPM_SHF_FPL_READ, "RGX_CR_RPM_SHF_FPL_READ ");
|
DBG_READ32(RGX_CR_RPM_SHF_FPL_WRITE, "RGX_CR_RPM_SHF_FPL_WRITE ");
|
DBG_READ64(RGX_CR_RPM_SHG_FPL, "RGX_CR_RPM_SHG_FPL ");
|
DBG_READ32(RGX_CR_RPM_SHG_FPL_READ, "RGX_CR_RPM_SHG_FPL_READ ");
|
DBG_READ32(RGX_CR_RPM_SHG_FPL_WRITE, "RGX_CR_RPM_SHG_FPL_WRITE ");
|
#endif
|
}
|
|
if (bS7Infra)
|
{
|
DBG_READ32(RGX_CR_JONES_IDLE, "JONES_IDLE ");
|
}
|
|
DBG_READ32(RGX_CR_SIDEKICK_IDLE, "SIDEKICK_IDLE ");
|
if (!bS7Infra)
|
{
|
DBG_READ32(RGX_CR_SLC_IDLE, "SLC_IDLE ");
|
}else
|
{
|
DBG_READ32(RGX_CR_SLC3_IDLE, "SLC3_IDLE ");
|
DBG_READ64(RGX_CR_SLC3_STATUS, "SLC3_STATUS ");
|
DBG_READ32(RGX_CR_SLC3_FAULT_STOP_STATUS, "SLC3_FAULT_STOP_STATUS ");
|
}
|
|
if (ui32Meta)
|
{
|
DBG_MSP_READ(META_CR_T0ENABLE_OFFSET, "T0 TXENABLE ");
|
DBG_MSP_READ(META_CR_T0STATUS_OFFSET, "T0 TXSTATUS ");
|
DBG_MSP_READ(META_CR_T0DEFR_OFFSET, "T0 TXDEFR ");
|
DBG_MCR_READ(META_CR_THR0_PC, "T0 PC ");
|
DBG_MCR_READ(META_CR_THR0_PCX, "T0 PCX ");
|
DBG_MCR_READ(META_CR_THR0_SP, "T0 SP ");
|
}
|
|
if ((ui32Meta == MTP218) || (ui32Meta == MTP219))
|
{
|
DBG_MSP_READ(META_CR_T1ENABLE_OFFSET, "T1 TXENABLE ");
|
DBG_MSP_READ(META_CR_T1STATUS_OFFSET, "T1 TXSTATUS ");
|
DBG_MSP_READ(META_CR_T1DEFR_OFFSET, "T1 TXDEFR ");
|
DBG_MCR_READ(META_CR_THR1_PC, "T1 PC ");
|
DBG_MCR_READ(META_CR_THR1_PCX, "T1 PCX ");
|
DBG_MCR_READ(META_CR_THR1_SP, "T1 SP ");
|
}
|
|
if (bFirmwarePerf)
|
{
|
DBG_MSP_READ(META_CR_PERF_COUNT0, "PERF_COUNT0 ");
|
DBG_MSP_READ(META_CR_PERF_COUNT1, "PERF_COUNT1 ");
|
}
|
|
if (bMIPS)
|
{
|
DBG_READ32(RGX_CR_MIPS_EXCEPTION_STATUS, "MIPS_EXCEPTION_STATUS ");
|
}
|
|
return IMG_TRUE;
|
}
|
|
|
#if defined(SUPPORT_TRUSTED_DEVICE) && !defined(NO_HARDWARE)
|
/*************************************************************************/ /*!
|
@Function RGXTDProcessFWImage
|
|
@Description Fetch and send data used by the trusted device to complete
|
the FW image setup
|
|
@Input psDeviceNode - Device node
|
@Input psRGXFW - Firmware blob
|
|
@Return PVRSRV_ERROR
|
*/ /**************************************************************************/
|
static PVRSRV_ERROR RGXTDProcessFWImage(PVRSRV_DEVICE_NODE *psDeviceNode,
|
struct RGXFW *psRGXFW)
|
{
|
PVRSRV_DEVICE_CONFIG *psDevConfig = psDeviceNode->psDevConfig;
|
PVRSRV_RGXDEV_INFO *psDevInfo = psDeviceNode->pvDevice;
|
PVRSRV_TD_FW_PARAMS sTDFWParams;
|
PVRSRV_ERROR eError;
|
|
if (psDevConfig->pfnTDSendFWImage == NULL)
|
{
|
PVR_DPF((PVR_DBG_ERROR, "RGXTDProcessFWImage: TDProcessFWImage not implemented!"));
|
return PVRSRV_ERROR_NOT_IMPLEMENTED;
|
}
|
|
sTDFWParams.pvFirmware = RGXFirmwareData(psRGXFW);
|
sTDFWParams.ui32FirmwareSize = RGXFirmwareSize(psRGXFW);
|
sTDFWParams.sFWCodeDevVAddrBase = psDevInfo->sFWCodeDevVAddrBase;
|
sTDFWParams.sFWDataDevVAddrBase = psDevInfo->sFWDataDevVAddrBase;
|
sTDFWParams.sFWCorememCodeFWAddr = psDevInfo->sFWCorememCodeFWAddr;
|
sTDFWParams.sFWInitFWAddr = psDevInfo->sFWInitFWAddr;
|
|
eError = psDevConfig->pfnTDSendFWImage(psDevConfig->hSysData, &sTDFWParams);
|
|
return eError;
|
}
|
#endif
|
|
/*!
|
*******************************************************************************
|
|
@Function AcquireHostData
|
|
@Description Acquire Device MemDesc and CPU pointer for a given PMR
|
|
@Input hServices : Services connection
|
@Input hPMR : PMR
|
@Output ppsHostMemDesc : Returned MemDesc
|
@Output ppvHostAddr : Returned CPU pointer
|
|
@Return PVRSRV_ERROR
|
|
******************************************************************************/
|
static INLINE
|
PVRSRV_ERROR AcquireHostData(SHARED_DEV_CONNECTION hServices,
|
IMG_HANDLE hPMR,
|
DEVMEM_MEMDESC **ppsHostMemDesc,
|
void **ppvHostAddr)
|
{
|
IMG_HANDLE hImportHandle;
|
IMG_DEVMEM_SIZE_T uiImportSize;
|
PVRSRV_ERROR eError;
|
|
eError = DevmemMakeLocalImportHandle(hServices,
|
hPMR,
|
&hImportHandle);
|
if (eError != PVRSRV_OK)
|
{
|
PVR_DPF((PVR_DBG_ERROR, "AcquireHostData: DevmemMakeLocalImportHandle failed (%d)", eError));
|
goto acquire_failmakehandle;
|
}
|
|
eError = DevmemLocalImport(hServices,
|
hImportHandle,
|
PVRSRV_MEMALLOCFLAG_CPU_READABLE |
|
PVRSRV_MEMALLOCFLAG_CPU_WRITEABLE |
|
PVRSRV_MEMALLOCFLAG_GPU_CACHE_INCOHERENT |
|
PVRSRV_MEMALLOCFLAG_CPU_WRITE_COMBINE,
|
ppsHostMemDesc,
|
&uiImportSize,
|
"AcquireHostData");
|
if (eError != PVRSRV_OK)
|
{
|
PVR_DPF((PVR_DBG_ERROR, "AcquireHostData: DevmemLocalImport failed (%d)", eError));
|
goto acquire_failimport;
|
}
|
|
eError = DevmemAcquireCpuVirtAddr(*ppsHostMemDesc,
|
ppvHostAddr);
|
if (eError != PVRSRV_OK)
|
{
|
PVR_DPF((PVR_DBG_ERROR, "AcquireHostData: DevmemAcquireCpuVirtAddr failed (%d)", eError));
|
goto acquire_failcpuaddr;
|
}
|
|
/* We don't need the import handle anymore */
|
DevmemUnmakeLocalImportHandle(hServices, hImportHandle);
|
|
return PVRSRV_OK;
|
|
|
acquire_failcpuaddr:
|
DevmemFree(*ppsHostMemDesc);
|
|
acquire_failimport:
|
DevmemUnmakeLocalImportHandle(hServices, hImportHandle);
|
|
acquire_failmakehandle:
|
return eError;
|
}
|
|
/*!
|
*******************************************************************************
|
|
@Function ReleaseHostData
|
|
@Description Releases resources associated with a Device MemDesc
|
|
@Input psHostMemDesc : MemDesc to free
|
|
@Return PVRSRV_ERROR
|
|
******************************************************************************/
|
static INLINE void ReleaseHostData(DEVMEM_MEMDESC *psHostMemDesc)
|
{
|
DevmemReleaseCpuVirtAddr(psHostMemDesc);
|
DevmemFree(psHostMemDesc);
|
}
|
|
/*!
|
*******************************************************************************
|
|
@Function GetFirmwareBVNC
|
|
@Description Retrieves FW BVNC information from binary data
|
|
@Input psRGXFW : Firmware binary handle to get BVNC from
|
|
@Output psRGXFWBVNC : structure store BVNC info
|
|
@Return IMG_TRUE upon success, IMG_FALSE otherwise
|
|
******************************************************************************/
|
static INLINE IMG_BOOL GetFirmwareBVNC(struct RGXFW *psRGXFW,
|
RGXFWIF_COMPCHECKS_BVNC *psFWBVNC)
|
{
|
#if defined(LINUX)
|
const size_t FWSize = RGXFirmwareSize(psRGXFW);
|
const RGXFWIF_COMPCHECKS_BVNC * psBinBVNC;
|
#endif
|
|
#if !defined(LINUX)
|
/* Check not available in non linux OSes. Just fill the struct and return true */
|
psFWBVNC->ui32LayoutVersion = RGXFWIF_COMPCHECKS_LAYOUT_VERSION;
|
psFWBVNC->ui32VLenMax = RGXFWIF_COMPCHECKS_BVNC_V_LEN_MAX;
|
#if !defined(SUPPORT_KERNEL_SRVINIT)
|
rgx_bvnc_packed(&psFWBVNC->ui64BNC, psFWBVNC->aszV, psFWBVNC->ui32VLenMax,
|
RGX_BNC_B, RGX_BVNC_V_ST, RGX_BNC_N, RGX_BNC_C);
|
#else
|
rgx_bvnc_packed(&psFWBVNC->ui64BNC, psFWBVNC->aszV, psFWBVNC->ui32VLenMax,
|
RGX_BNC_KM_B, RGX_BVNC_KM_V_ST, RGX_BNC_KM_N, RGX_BNC_KM_C);
|
#endif /* SUPPORT_KERNEL_SRVINIT */
|
|
#else
|
|
if (FWSize < FW_BVNC_BACKWARDS_OFFSET)
|
{
|
PVR_DPF((PVR_DBG_ERROR, "%s: Firmware is too small (%zu bytes)",
|
__func__, FWSize));
|
return IMG_FALSE;
|
}
|
|
psBinBVNC = (RGXFWIF_COMPCHECKS_BVNC *) ((IMG_UINT8 *) (RGXFirmwareData(psRGXFW)) +
|
(FWSize - FW_BVNC_BACKWARDS_OFFSET));
|
|
psFWBVNC->ui32LayoutVersion = RGX_INT32_FROM_BE(psBinBVNC->ui32LayoutVersion);
|
|
psFWBVNC->ui32VLenMax = RGX_INT32_FROM_BE(psBinBVNC->ui32VLenMax);
|
|
psFWBVNC->ui64BNC = RGX_INT64_FROM_BE(psBinBVNC->ui64BNC);
|
|
strncpy(psFWBVNC->aszV, psBinBVNC->aszV, sizeof(psFWBVNC->aszV));
|
#endif /* defined(LINUX) */
|
|
return IMG_TRUE;
|
}
|
|
|
/*!
|
*******************************************************************************
|
|
@Function RGXInitFirmwareBridgeWrapper
|
|
@Description Calls the proper RGXInitFirmware bridge version
|
|
@Return PVRSRV_ERROR
|
|
******************************************************************************/
|
static INLINE PVRSRV_ERROR RGXInitFirmwareBridgeWrapper(SHARED_DEV_CONNECTION hServices,
|
RGXFWIF_DEV_VIRTADDR *psRGXFwInit,
|
IMG_BOOL bEnableSignatureChecks,
|
IMG_UINT32 ui32SignatureChecksBufSize,
|
IMG_UINT32 ui32HWPerfFWBufSizeKB,
|
IMG_UINT64 ui64HWPerfFilter,
|
IMG_UINT32 ui32RGXFWAlignChecksArrLength,
|
IMG_UINT32 *pui32RGXFWAlignChecks,
|
IMG_UINT32 ui32FWConfigFlags,
|
IMG_UINT32 ui32LogType,
|
IMG_UINT32 ui32FilterFlags,
|
IMG_UINT32 ui32JonesDisableMask,
|
IMG_UINT32 ui32HWRDebugDumpLimit,
|
RGXFWIF_COMPCHECKS_BVNC *psClientBVNC,
|
RGXFWIF_COMPCHECKS_BVNC *psFirmwareBVNC,
|
IMG_UINT32 ui32HWPerfCountersDataSize,
|
IMG_HANDLE *phHWPerfDataPMR,
|
RGX_RD_POWER_ISLAND_CONF eRGXRDPowerIslandConf,
|
FW_PERF_CONF eFirmwarePerf)
|
{
|
PVRSRV_ERROR eError;
|
|
RGX_FW_INIT_IN_PARAMS sInParams = {
|
RGXFWINITPARAMS_VERSION,
|
bEnableSignatureChecks,
|
ui32SignatureChecksBufSize,
|
ui32HWPerfFWBufSizeKB,
|
ui64HWPerfFilter,
|
ui32FWConfigFlags,
|
ui32LogType,
|
ui32FilterFlags,
|
ui32JonesDisableMask,
|
ui32HWRDebugDumpLimit,
|
{ 0 },
|
{ 0 },
|
ui32HWPerfCountersDataSize,
|
eRGXRDPowerIslandConf,
|
eFirmwarePerf,
|
{ 0 }
|
};
|
|
memcpy(&(sInParams.sClientBVNC), psClientBVNC, sizeof (sInParams.sClientBVNC));
|
memcpy(&(sInParams.sFirmwareBVNC), psFirmwareBVNC, sizeof (sInParams.sFirmwareBVNC));
|
|
|
eError = BridgeRGXInitFirmwareExtended(hServices, ui32RGXFWAlignChecksArrLength,
|
pui32RGXFWAlignChecks, psRGXFwInit, phHWPerfDataPMR, &sInParams);
|
|
/* Error calling the bridge could be due to old KM not implementing the extended version */
|
if ((eError == PVRSRV_ERROR_BRIDGE_CALL_FAILED)
|
|| (eError == PVRSRV_ERROR_BRIDGE_EINVAL))
|
{
|
eError = BridgeRGXInitFirmware(hServices,
|
psRGXFwInit,
|
bEnableSignatureChecks,
|
ui32SignatureChecksBufSize,
|
ui32HWPerfFWBufSizeKB,
|
ui64HWPerfFilter,
|
ui32RGXFWAlignChecksArrLength,
|
pui32RGXFWAlignChecks,
|
ui32FWConfigFlags,
|
ui32LogType,
|
ui32FilterFlags,
|
ui32JonesDisableMask,
|
ui32HWRDebugDumpLimit,
|
psClientBVNC,
|
ui32HWPerfCountersDataSize,
|
phHWPerfDataPMR,
|
eRGXRDPowerIslandConf,
|
eFirmwarePerf);
|
}
|
|
return eError;
|
}
|
|
/*!
|
*******************************************************************************
|
|
@Function InitFirmware
|
|
@Description Allocate, initialise and pdump Firmware code and data memory
|
|
@Input hServices : Services connection
|
@Input psHints : Apphints
|
@Input psBVNC : Compatibility checks
|
@Output phFWCodePMR : FW code PMR handle
|
@Output phFWDataPMR : FW data PMR handle
|
@Output phFWCorememPMR : FW coremem code PMR handle
|
@Output phHWPerfDataPMR : HWPerf control PMR handle
|
|
@Return PVRSRV_ERROR
|
|
******************************************************************************/
|
static PVRSRV_ERROR InitFirmware(SHARED_DEV_CONNECTION hServices,
|
RGX_SRVINIT_APPHINTS *psHints,
|
RGXFWIF_COMPCHECKS_BVNC *psBVNC,
|
IMG_HANDLE *phFWCodePMR,
|
IMG_HANDLE *phFWDataPMR,
|
IMG_HANDLE *phFWCorememPMR,
|
IMG_HANDLE *phHWPerfDataPMR)
|
{
|
struct RGXFW *psRGXFW = NULL;
|
const IMG_BYTE *pbRGXFirmware = NULL;
|
RGXFWIF_COMPCHECKS_BVNC sFWBVNC;
|
|
/* FW code memory */
|
IMG_DEVMEM_SIZE_T uiFWCodeAllocSize;
|
IMG_DEV_VIRTADDR sFWCodeDevVAddrBase;
|
DEVMEM_MEMDESC *psFWCodeHostMemDesc;
|
void *pvFWCodeHostAddr;
|
|
/* FW data memory */
|
IMG_DEVMEM_SIZE_T uiFWDataAllocSize;
|
IMG_DEV_VIRTADDR sFWDataDevVAddrBase;
|
DEVMEM_MEMDESC *psFWDataHostMemDesc;
|
void *pvFWDataHostAddr;
|
|
/* FW coremem code memory */
|
IMG_DEVMEM_SIZE_T uiFWCorememCodeAllocSize;
|
IMG_DEV_VIRTADDR sFWCorememDevVAddrBase;
|
|
/*
|
* Only declare psFWCorememHostMemDesc where used (PVR_UNREFERENCED_PARAMETER doesn't
|
* help for local vars when using certain compilers)
|
*/
|
DEVMEM_MEMDESC *psFWCorememHostMemDesc;
|
void *pvFWCorememHostAddr = NULL;
|
|
RGXFWIF_DEV_VIRTADDR sFWCorememFWAddr; /* FW coremem data */
|
RGXFWIF_DEV_VIRTADDR sRGXFwInit; /* FW init struct */
|
RGX_INIT_LAYER_PARAMS sInitParams;
|
#if !defined(SUPPORT_KERNEL_SRVINIT)
|
IMG_UINT32 aui32RGXFWAlignChecks[] = {RGXFW_ALIGN_CHECKS_INIT};
|
#endif
|
IMG_UINT32 ui32FWConfigFlags;
|
PVRSRV_ERROR eError;
|
IMG_CHAR *pszFWFilename = NULL;
|
IMG_CHAR *pszFWpFilename = NULL;
|
#if defined(SUPPORT_KERNEL_SRVINIT)
|
IMG_CHAR aszFWFilenameStr[OSStringLength(RGX_FW_FILENAME)+MAX_BVNC_STRING_LEN+2];
|
IMG_CHAR aszFWpFilenameStr[OSStringLength(RGX_FW_FILENAME)+MAX_BVNC_STRING_LEN+3];
|
PVRSRV_DEVICE_NODE *psDeviceNode = (PVRSRV_DEVICE_NODE *)hServices;
|
PVRSRV_RGXDEV_INFO *psDevInfo = (PVRSRV_RGXDEV_INFO *)psDeviceNode->pvDevice;
|
|
pszFWFilename = &aszFWFilenameStr[0];
|
OSSNPrintf(pszFWFilename, OSStringLength(RGX_FW_FILENAME)+MAX_BVNC_STRING_LEN+2, "%s.%d.%d.%d.%d", RGX_FW_FILENAME,
|
psDevInfo->sDevFeatureCfg.ui32B, psDevInfo->sDevFeatureCfg.ui32V,
|
psDevInfo->sDevFeatureCfg.ui32N, psDevInfo->sDevFeatureCfg.ui32C);
|
pszFWpFilename = &aszFWpFilenameStr[0];
|
OSSNPrintf(pszFWpFilename, OSStringLength(RGX_FW_FILENAME)+MAX_BVNC_STRING_LEN+3, "%s.%d.%dp.%d.%d", RGX_FW_FILENAME,
|
psDevInfo->sDevFeatureCfg.ui32B, psDevInfo->sDevFeatureCfg.ui32V,
|
psDevInfo->sDevFeatureCfg.ui32N, psDevInfo->sDevFeatureCfg.ui32C);
|
#endif /* defined(SUPPORT_KERNEL_SRVINIT) */
|
#if !defined(PVRSRV_GPUVIRT_GUESTDRV)
|
/*
|
* Get pointer to Firmware image
|
*/
|
|
psRGXFW = RGXLoadFirmware(hServices, pszFWFilename, pszFWpFilename);
|
if (psRGXFW == NULL)
|
{
|
PVR_DPF((PVR_DBG_ERROR, "InitFirmware: RGXLoadFirmware failed"));
|
eError = PVRSRV_ERROR_INIT_FAILURE;
|
goto cleanup_initfw;
|
}
|
pbRGXFirmware = RGXFirmwareData(psRGXFW);
|
|
if (!GetFirmwareBVNC(psRGXFW, &sFWBVNC))
|
{
|
PVR_DPF((PVR_DBG_ERROR, "InitFirmware: RGXLoadFirmware failed to get Firmware BVNC"));
|
eError = PVRSRV_ERROR_INIT_FAILURE;
|
goto cleanup_initfw;
|
}
|
|
sInitParams.hServices = hServices;
|
|
/*
|
* Allocate Firmware memory
|
*/
|
|
eError = RGXGetFWImageAllocSize(&sInitParams,
|
&uiFWCodeAllocSize,
|
&uiFWDataAllocSize,
|
&uiFWCorememCodeAllocSize);
|
|
if (eError != PVRSRV_OK)
|
{
|
PVR_DPF((PVR_DBG_ERROR, "InitFirmware: RGXGetFWImageAllocSize failed"));
|
goto cleanup_initfw;
|
}
|
|
#if defined(SUPPORT_TRUSTED_DEVICE)
|
/* Disable META core memory allocation unless the META DMA is available */
|
#if defined(SUPPORT_KERNEL_SRVINIT)
|
if (!RGXDeviceHasFeatureInit(&sInitParams, RGX_FEATURE_META_DMA_BIT_MASK))
|
{
|
uiFWCorememCodeAllocSize = 0;
|
}
|
#elif !defined(RGX_FEATURE_META_DMA)
|
uiFWCorememCodeAllocSize = 0;
|
#endif
|
#endif
|
#else
|
PVR_UNREFERENCED_PARAMETER(pszFWFilename);
|
PVR_UNREFERENCED_PARAMETER(pszFWpFilename);
|
PVR_UNREFERENCED_PARAMETER(sInitParams);
|
PVR_UNREFERENCED_PARAMETER(pbRGXFirmware);
|
uiFWCodeAllocSize = 0;
|
uiFWDataAllocSize = 0;
|
uiFWCorememCodeAllocSize = 0;
|
#endif
|
|
eError = BridgeRGXInitAllocFWImgMem(hServices,
|
uiFWCodeAllocSize,
|
uiFWDataAllocSize,
|
uiFWCorememCodeAllocSize,
|
phFWCodePMR,
|
&sFWCodeDevVAddrBase,
|
phFWDataPMR,
|
&sFWDataDevVAddrBase,
|
phFWCorememPMR,
|
&sFWCorememDevVAddrBase,
|
&sFWCorememFWAddr);
|
if (eError != PVRSRV_OK)
|
{
|
PVR_DPF((PVR_DBG_ERROR, "InitFirmware: PVRSRVRGXInitAllocFWImgMem failed (%d)", eError));
|
goto cleanup_initfw;
|
}
|
|
|
/*
|
* Setup Firmware initialisation data
|
*/
|
|
GetFWConfigFlags(psHints, &ui32FWConfigFlags);
|
|
eError = RGXInitFirmwareBridgeWrapper(hServices,
|
&sRGXFwInit,
|
psHints->bEnableSignatureChecks,
|
psHints->ui32SignatureChecksBufSize,
|
psHints->ui32HWPerfFWBufSize,
|
(IMG_UINT64)psHints->ui32HWPerfFilter0 |
|
((IMG_UINT64)psHints->ui32HWPerfFilter1 << 32),
|
#if defined(SUPPORT_KERNEL_SRVINIT)
|
0,
|
NULL,
|
#else
|
IMG_ARR_NUM_ELEMS(aui32RGXFWAlignChecks),
|
aui32RGXFWAlignChecks,
|
#endif
|
ui32FWConfigFlags,
|
psHints->ui32LogType,
|
GetFilterFlags(psHints),
|
psHints->ui32JonesDisableMask,
|
psHints->ui32HWRDebugDumpLimit,
|
psBVNC,
|
&sFWBVNC,
|
sizeof(RGXFWIF_HWPERF_CTL),
|
phHWPerfDataPMR,
|
psHints->eRGXRDPowerIslandConf,
|
psHints->eFirmwarePerf);
|
|
if (eError != PVRSRV_OK)
|
{
|
PVR_DPF((PVR_DBG_ERROR, "InitFirmware: PVRSRVRGXInitFirmware failed (%d)", eError));
|
goto cleanup_initfw;
|
}
|
#if defined(PVRSRV_GPUVIRT_GUESTDRV)
|
PVR_UNREFERENCED_PARAMETER(pvFWCorememHostAddr);
|
PVR_UNREFERENCED_PARAMETER(psFWCorememHostMemDesc);
|
PVR_UNREFERENCED_PARAMETER(pvFWDataHostAddr);
|
PVR_UNREFERENCED_PARAMETER(psFWDataHostMemDesc);
|
PVR_UNREFERENCED_PARAMETER(pvFWCodeHostAddr);
|
PVR_UNREFERENCED_PARAMETER(psFWCodeHostMemDesc);
|
#else
|
/*
|
* Acquire pointers to Firmware allocations
|
*/
|
|
#if !defined(SUPPORT_TRUSTED_DEVICE) || defined(NO_HARDWARE)
|
eError = AcquireHostData(hServices,
|
*phFWCodePMR,
|
&psFWCodeHostMemDesc,
|
&pvFWCodeHostAddr);
|
if (eError != PVRSRV_OK)
|
{
|
PVR_DPF((PVR_DBG_ERROR, "InitFirmware: AcquireHostData for FW code failed (%d)", eError));
|
goto release_code;
|
}
|
#else
|
PVR_UNREFERENCED_PARAMETER(psFWCodeHostMemDesc);
|
|
/* We can't get a pointer to a secure FW allocation from within the DDK */
|
pvFWCodeHostAddr = NULL;
|
#endif
|
|
eError = AcquireHostData(hServices,
|
*phFWDataPMR,
|
&psFWDataHostMemDesc,
|
&pvFWDataHostAddr);
|
if (eError != PVRSRV_OK)
|
{
|
PVR_DPF((PVR_DBG_ERROR, "InitFirmware: AcquireHostData for FW data failed (%d)", eError));
|
goto release_data;
|
}
|
|
#if !defined(SUPPORT_TRUSTED_DEVICE) || defined(NO_HARDWARE)
|
if (uiFWCorememCodeAllocSize)
|
{
|
eError = AcquireHostData(hServices,
|
*phFWCorememPMR,
|
&psFWCorememHostMemDesc,
|
&pvFWCorememHostAddr);
|
if (eError != PVRSRV_OK)
|
{
|
PVR_DPF((PVR_DBG_ERROR, "InitFirmware: AcquireHostData for FW coremem code failed (%d)", eError));
|
goto release_corememcode;
|
}
|
}
|
#else
|
PVR_UNREFERENCED_PARAMETER(psFWCorememHostMemDesc);
|
|
/* We can't get a pointer to a secure FW allocation from within the DDK */
|
pvFWCorememHostAddr = NULL;
|
#endif
|
|
|
/*
|
* Process the Firmware image and setup code and data segments.
|
*
|
* When the trusted device is enabled and the FW code lives
|
* in secure memory we will only setup the data segments here,
|
* while the code segments will be loaded to secure memory
|
* by the trusted device.
|
*/
|
|
eError = RGXProcessFWImage(&sInitParams,
|
pbRGXFirmware,
|
pvFWCodeHostAddr,
|
pvFWDataHostAddr,
|
pvFWCorememHostAddr,
|
&sFWCodeDevVAddrBase,
|
&sFWDataDevVAddrBase,
|
&sFWCorememDevVAddrBase,
|
&sFWCorememFWAddr,
|
&sRGXFwInit,
|
#if defined(RGXFW_META_SUPPORT_2ND_THREAD)
|
2,
|
#else
|
psHints->eUseMETAT1 == RGX_META_T1_OFF ? 1 : 2,
|
#endif
|
psHints->eUseMETAT1 == RGX_META_T1_MAIN ? 1 : 0);
|
if (eError != PVRSRV_OK)
|
{
|
PVR_DPF((PVR_DBG_ERROR, "InitFirmware: RGXProcessFWImage failed (%d)", eError));
|
goto release_fw_allocations;
|
}
|
|
#if defined(SUPPORT_TRUSTED_DEVICE) && !defined(NO_HARDWARE)
|
RGXTDProcessFWImage(hServices, psRGXFW);
|
#endif
|
|
|
/*
|
* Perform final steps (if any) on the kernel
|
* before pdumping the Firmware allocations
|
*/
|
eError = BridgeRGXInitFinaliseFWImage(hServices);
|
|
if (eError != PVRSRV_OK)
|
{
|
PVR_DPF((PVR_DBG_ERROR, "InitFirmware: RGXInitFinaliseFWImage failed (%d)", eError));
|
goto release_fw_allocations;
|
}
|
|
/*
|
* PDump Firmware allocations
|
*/
|
|
#if !defined(SUPPORT_TRUSTED_DEVICE) || defined(NO_HARDWARE)
|
SRVINITPDumpComment(hServices, "Dump firmware code image");
|
DevmemPDumpLoadMem(psFWCodeHostMemDesc,
|
0,
|
uiFWCodeAllocSize,
|
PDUMP_FLAGS_CONTINUOUS);
|
#endif
|
|
SRVINITPDumpComment(hServices, "Dump firmware data image");
|
DevmemPDumpLoadMem(psFWDataHostMemDesc,
|
0,
|
uiFWDataAllocSize,
|
PDUMP_FLAGS_CONTINUOUS);
|
|
#if !defined(SUPPORT_TRUSTED_DEVICE) || defined(NO_HARDWARE)
|
if (uiFWCorememCodeAllocSize)
|
{
|
SRVINITPDumpComment(hServices, "Dump firmware coremem image");
|
DevmemPDumpLoadMem(psFWCorememHostMemDesc,
|
0,
|
uiFWCorememCodeAllocSize,
|
PDUMP_FLAGS_CONTINUOUS);
|
}
|
#endif
|
|
|
/*
|
* Release Firmware allocations and clean up
|
*/
|
|
release_fw_allocations:
|
#if !defined(SUPPORT_TRUSTED_DEVICE) || defined(NO_HARDWARE)
|
release_corememcode:
|
if (uiFWCorememCodeAllocSize)
|
{
|
ReleaseHostData(psFWCorememHostMemDesc);
|
}
|
#endif
|
|
release_data:
|
ReleaseHostData(psFWDataHostMemDesc);
|
|
#if !defined(SUPPORT_TRUSTED_DEVICE) || defined(NO_HARDWARE)
|
release_code:
|
ReleaseHostData(psFWCodeHostMemDesc);
|
#endif
|
#endif /* PVRSRV_GPUVIRT_GUESTDRV */
|
cleanup_initfw:
|
if (psRGXFW != NULL)
|
{
|
RGXUnloadFirmware(psRGXFW);
|
}
|
|
return eError;
|
}
|
|
|
#if defined(PDUMP)
|
/*!
|
*******************************************************************************
|
|
@Function InitialiseHWPerfCounters
|
|
@Description
|
|
Initialisation of hardware performance counters and dumping them out to pdump, so that they can be modified at a later point.
|
|
@Input hServices
|
|
@Input psHWPerfDataMemDesc
|
|
@Input psHWPerfInitDataInt
|
|
@Return void
|
|
******************************************************************************/
|
|
static void InitialiseHWPerfCounters(SHARED_DEV_CONNECTION hServices, DEVMEM_MEMDESC *psHWPerfDataMemDesc, RGXFWIF_HWPERF_CTL *psHWPerfInitDataInt)
|
{
|
RGXFWIF_HWPERF_CTL_BLK *psHWPerfInitBlkData;
|
IMG_UINT32 ui32CntBlkModelLen;
|
const RGXFW_HWPERF_CNTBLK_TYPE_MODEL *asCntBlkTypeModel;
|
const RGXFW_HWPERF_CNTBLK_TYPE_MODEL* psBlkTypeDesc;
|
IMG_UINT32 ui32BlockID, ui32BlkCfgIdx, ui32CounterIdx ;
|
void *pvDev = NULL; // Use SHARED_DEV_CONNECTION here?
|
RGX_HWPERF_CNTBLK_RT_INFO sCntBlkRtInfo;
|
|
#if defined(SUPPORT_KERNEL_SRVINIT)
|
{
|
PVRSRV_DEVICE_NODE *psDeviceNode = (PVRSRV_DEVICE_NODE *)hServices;
|
pvDev = psDeviceNode->pvDevice;
|
}
|
#endif
|
ui32CntBlkModelLen = RGXGetHWPerfBlockConfig(&asCntBlkTypeModel);
|
for(ui32BlkCfgIdx = 0; ui32BlkCfgIdx < ui32CntBlkModelLen; ui32BlkCfgIdx++)
|
{
|
/* Exit early if this core does not have any of these counter blocks
|
* due to core type/BVNC features.... */
|
psBlkTypeDesc = &asCntBlkTypeModel[ui32BlkCfgIdx];
|
if (psBlkTypeDesc->pfnIsBlkPresent(psBlkTypeDesc, pvDev, &sCntBlkRtInfo) == IMG_FALSE)
|
{
|
continue;
|
}
|
|
/* Program all counters in one block so those already on may
|
* be configured off and vice-a-versa. */
|
for (ui32BlockID = psBlkTypeDesc->uiCntBlkIdBase;
|
ui32BlockID < psBlkTypeDesc->uiCntBlkIdBase+sCntBlkRtInfo.uiNumUnits;
|
ui32BlockID++)
|
{
|
|
SRVINITPDumpComment(hServices, "Unit %d Block : %s", ui32BlockID-psBlkTypeDesc->uiCntBlkIdBase, psBlkTypeDesc->pszBlockNameComment);
|
/* Get the block configure store to update from the global store of
|
* block configuration. This is used to remember the configuration
|
* between configurations and core power on in APM */
|
psHWPerfInitBlkData = rgxfw_hwperf_get_block_ctl(ui32BlockID, psHWPerfInitDataInt);
|
/* Assert to check for HWPerf block mis-configuration */
|
PVR_ASSERT(psHWPerfInitBlkData);
|
|
psHWPerfInitBlkData->bValid = IMG_TRUE;
|
SRVINITPDumpComment(hServices, "bValid: This specifies if the layout block is valid for the given BVNC.");
|
DevmemPDumpLoadMemValue32(psHWPerfDataMemDesc,
|
(size_t)&(psHWPerfInitBlkData->bValid) - (size_t)(psHWPerfInitDataInt),
|
psHWPerfInitBlkData->bValid,
|
PDUMP_FLAGS_CONTINUOUS);
|
|
psHWPerfInitBlkData->bEnabled = IMG_FALSE;
|
SRVINITPDumpComment(hServices, "bEnabled: Set to 0x1 if the block needs to be enabled during playback. ");
|
DevmemPDumpLoadMemValue32(psHWPerfDataMemDesc,
|
(size_t)&(psHWPerfInitBlkData->bEnabled) - (size_t)(psHWPerfInitDataInt),
|
psHWPerfInitBlkData->bEnabled,
|
PDUMP_FLAGS_CONTINUOUS);
|
|
psHWPerfInitBlkData->eBlockID = ui32BlockID;
|
SRVINITPDumpComment(hServices, "eBlockID: The Block ID for the layout block. See RGX_HWPERF_CNTBLK_ID for further information.");
|
DevmemPDumpLoadMemValue32(psHWPerfDataMemDesc,
|
(size_t)&(psHWPerfInitBlkData->eBlockID) - (size_t)(psHWPerfInitDataInt),
|
psHWPerfInitBlkData->eBlockID,
|
PDUMP_FLAGS_CONTINUOUS);
|
|
psHWPerfInitBlkData->uiCounterMask = 0x00;
|
SRVINITPDumpComment(hServices, "uiCounterMask: Bitmask for selecting the counters that need to be configured.(Bit 0 - counter0, bit 1 - counter1 and so on. ");
|
DevmemPDumpLoadMemValue32(psHWPerfDataMemDesc,
|
(size_t)&(psHWPerfInitBlkData->uiCounterMask) - (size_t)(psHWPerfInitDataInt),
|
psHWPerfInitBlkData->uiCounterMask,
|
PDUMP_FLAGS_CONTINUOUS);
|
|
for(ui32CounterIdx = RGX_CNTBLK_COUNTER0_ID; ui32CounterIdx < psBlkTypeDesc->uiNumCounters; ui32CounterIdx++)
|
{
|
psHWPerfInitBlkData->aui64CounterCfg[ui32CounterIdx] = IMG_UINT64_C(0x0000000000000000);
|
|
SRVINITPDumpComment(hServices, "%s_COUNTER_%d", psBlkTypeDesc->pszBlockNameComment,ui32CounterIdx);
|
DevmemPDumpLoadMemValue64(psHWPerfDataMemDesc,
|
(size_t)&(psHWPerfInitBlkData->aui64CounterCfg[ui32CounterIdx]) - (size_t)(psHWPerfInitDataInt),
|
psHWPerfInitBlkData->aui64CounterCfg[ui32CounterIdx],
|
PDUMP_FLAGS_CONTINUOUS);
|
|
}
|
}
|
}
|
}
|
/*!
|
*******************************************************************************
|
|
@Function InitialiseCustomCounters
|
|
@Description
|
|
Initialisation of custom counters and dumping them out to pdump, so that they can be modified at a later point.
|
|
@Input hServices
|
|
@Input psHWPerfDataMemDesc
|
|
@Return void
|
|
******************************************************************************/
|
|
static void InitialiseCustomCounters(SHARED_DEV_CONNECTION hServices, DEVMEM_MEMDESC *psHWPerfDataMemDesc)
|
{
|
IMG_UINT32 ui32CustomBlock, ui32CounterID;
|
|
SRVINITPDumpComment(hServices, "ui32SelectedCountersBlockMask - The Bitmask of the custom counters that are to be selected");
|
DevmemPDumpLoadMemValue32(psHWPerfDataMemDesc,
|
offsetof(RGXFWIF_HWPERF_CTL, ui32SelectedCountersBlockMask),
|
0,
|
PDUMP_FLAGS_CONTINUOUS);
|
|
for( ui32CustomBlock = 0; ui32CustomBlock < RGX_HWPERF_MAX_CUSTOM_BLKS; ui32CustomBlock++ )
|
{
|
/*
|
* Some compilers cannot cope with the use of offsetof() below - the specific problem being the use of
|
* a non-const variable in the expression, which it needs to be const. Typical compiler error produced is
|
* "expression must have a constant value".
|
*/
|
const IMG_DEVMEM_OFFSET_T uiOffsetOfCustomBlockSelectedCounters
|
= (IMG_DEVMEM_OFFSET_T)(uintptr_t)&(((RGXFWIF_HWPERF_CTL *)0)->SelCntr[ui32CustomBlock].ui32NumSelectedCounters);
|
|
SRVINITPDumpComment(hServices, "ui32NumSelectedCounters - The Number of counters selected for this Custom Block: %d",ui32CustomBlock );
|
DevmemPDumpLoadMemValue32(psHWPerfDataMemDesc,
|
uiOffsetOfCustomBlockSelectedCounters,
|
0,
|
PDUMP_FLAGS_CONTINUOUS);
|
|
for(ui32CounterID = 0; ui32CounterID < RGX_HWPERF_MAX_CUSTOM_CNTRS; ui32CounterID++ )
|
{
|
const IMG_DEVMEM_OFFSET_T uiOffsetOfCustomBlockSelectedCounterIDs
|
= (IMG_DEVMEM_OFFSET_T)(uintptr_t)&(((RGXFWIF_HWPERF_CTL *)0)->SelCntr[ui32CustomBlock].aui32SelectedCountersIDs[ui32CounterID]);
|
|
SRVINITPDumpComment(hServices, "CUSTOMBLK_%d_COUNTERID_%d",ui32CustomBlock, ui32CounterID);
|
DevmemPDumpLoadMemValue32(psHWPerfDataMemDesc,
|
uiOffsetOfCustomBlockSelectedCounterIDs,
|
0,
|
PDUMP_FLAGS_CONTINUOUS);
|
}
|
}
|
}
|
|
/*!
|
*******************************************************************************
|
|
@Function InitialiseAllCounters
|
|
@Description Initialise HWPerf and custom counters
|
|
@Input hServices : Services connection
|
@Input hHWPerfDataPMR : HWPerf control PMR handle
|
|
@Return PVRSRV_ERROR
|
|
******************************************************************************/
|
static PVRSRV_ERROR InitialiseAllCounters(SHARED_DEV_CONNECTION hServices,
|
IMG_HANDLE hHWPerfDataPMR)
|
{
|
RGXFWIF_HWPERF_CTL *psHWPerfInitData;
|
DEVMEM_MEMDESC *psHWPerfDataMemDesc;
|
PVRSRV_ERROR eError;
|
|
eError = AcquireHostData(hServices,
|
hHWPerfDataPMR,
|
&psHWPerfDataMemDesc,
|
(void **)&psHWPerfInitData);
|
|
|
if (eError != PVRSRV_OK)
|
{
|
PVR_LOGG_IF_ERROR(eError, "DevmemAcquireCpuVirtAddr", failHWPerfCountersMemDescAqCpuVirt);
|
}
|
|
InitialiseHWPerfCounters(hServices, psHWPerfDataMemDesc, psHWPerfInitData);
|
InitialiseCustomCounters(hServices, psHWPerfDataMemDesc);
|
|
failHWPerfCountersMemDescAqCpuVirt:
|
ReleaseHostData(psHWPerfDataMemDesc);
|
|
return eError;
|
}
|
#endif /* PDUMP */
|
|
static void
|
_ParseHTBAppHints(SHARED_DEV_CONNECTION hServices)
|
{
|
PVRSRV_ERROR eError;
|
void * pvParamState = NULL;
|
IMG_UINT32 ui32LogType;
|
IMG_BOOL bAnyLogGroupConfigured;
|
|
IMG_CHAR * szBufferName = "PVRHTBuffer";
|
IMG_UINT32 ui32BufferSize;
|
HTB_OPMODE_CTRL eOpMode;
|
|
/* Services initialisation parameters */
|
pvParamState = SrvInitParamOpen();
|
|
SrvInitParamGetUINT32BitField(pvParamState, EnableHTBLogGroup, ui32LogType);
|
bAnyLogGroupConfigured = ui32LogType ? IMG_TRUE: IMG_FALSE;
|
SrvInitParamGetUINT32List(pvParamState, HTBOperationMode, eOpMode);
|
SrvInitParamGetUINT32(pvParamState, HTBufferSize, ui32BufferSize);
|
|
eError = HTBConfigure(hServices, szBufferName, ui32BufferSize);
|
PVR_LOGG_IF_ERROR(eError, "PVRSRVHTBConfigure", cleanup);
|
|
if (bAnyLogGroupConfigured)
|
{
|
eError = HTBControl(hServices, 1, &ui32LogType, 0, 0, HTB_LOGMODE_ALLPID, eOpMode);
|
PVR_LOGG_IF_ERROR(eError, "PVRSRVHTBControl", cleanup);
|
}
|
|
cleanup:
|
SrvInitParamClose(pvParamState);
|
}
|
|
#if defined(PDUMP) && defined(SUPPORT_KERNEL_SRVINIT) && defined(__KERNEL__)
|
static void RGXInitFWSigRegisters(PVRSRV_RGXDEV_INFO *psDevInfo)
|
{
|
IMG_UINT32 ui32PhantomCnt = 0;
|
|
if (psDevInfo->sDevFeatureCfg.ui64Features & RGX_FEATURE_CLUSTER_GROUPING_BIT_MASK)
|
{
|
ui32PhantomCnt = RGX_GET_NUM_PHANTOMS(psDevInfo->sDevFeatureCfg.ui32NumClusters) - 1;
|
}
|
|
/*Initialise the TA related signature registers */
|
if(0 == gui32TASigRegCount)
|
{
|
if(psDevInfo->sDevFeatureCfg.ui64Features & RGX_FEATURE_SCALABLE_VDM_GPP_BIT_MASK)
|
{
|
asTASigRegList[gui32TASigRegCount++] = (RGXFW_REGISTER_LIST){RGX_CR_USC_UVB_CHECKSUM, RGX_CR_BLACKPEARL_INDIRECT,0, ui32PhantomCnt};
|
}else
|
{
|
asTASigRegList[gui32TASigRegCount++] = (RGXFW_REGISTER_LIST){RGX_CR_USC_UVS0_CHECKSUM, 0, 0, 0};
|
asTASigRegList[gui32TASigRegCount++] = (RGXFW_REGISTER_LIST){RGX_CR_USC_UVS1_CHECKSUM, 0, 0, 0};
|
asTASigRegList[gui32TASigRegCount++] = (RGXFW_REGISTER_LIST){RGX_CR_USC_UVS2_CHECKSUM, 0, 0, 0};
|
asTASigRegList[gui32TASigRegCount++] = (RGXFW_REGISTER_LIST){RGX_CR_USC_UVS3_CHECKSUM, 0, 0, 0};
|
asTASigRegList[gui32TASigRegCount++] = (RGXFW_REGISTER_LIST){RGX_CR_USC_UVS4_CHECKSUM, 0, 0, 0};
|
asTASigRegList[gui32TASigRegCount++] = (RGXFW_REGISTER_LIST){RGX_CR_USC_UVS5_CHECKSUM, 0, 0, 0};
|
}
|
|
if(psDevInfo->sDevFeatureCfg.ui64Features & RGX_FEATURE_SCALABLE_TE_ARCH_BIT_MASK)
|
{
|
if(psDevInfo->sDevFeatureCfg.ui64Features & RGX_FEATURE_SCALABLE_VDM_GPP_BIT_MASK)
|
{
|
asTASigRegList[gui32TASigRegCount++] = (RGXFW_REGISTER_LIST){RGX_CR_PPP_CLIP_CHECKSUM, RGX_CR_BLACKPEARL_INDIRECT,0, ui32PhantomCnt};
|
}else
|
{
|
asTASigRegList[gui32TASigRegCount++] = (RGXFW_REGISTER_LIST){RGX_CR_PPP, 0, 0, 0};
|
}
|
asTASigRegList[gui32TASigRegCount++] = (RGXFW_REGISTER_LIST){RGX_CR_TE_CHECKSUM,0, 0, 0};
|
}else
|
{
|
asTASigRegList[gui32TASigRegCount++] = (RGXFW_REGISTER_LIST){RGX_CR_PPP_SIGNATURE, 0, 0, 0};
|
asTASigRegList[gui32TASigRegCount++] = (RGXFW_REGISTER_LIST){RGX_CR_TE_SIGNATURE, 0, 0, 0};
|
}
|
|
asTASigRegList[gui32TASigRegCount++] = (RGXFW_REGISTER_LIST){RGX_CR_VCE_CHECKSUM, 0, 0, 0};
|
|
if(0 == (psDevInfo->sDevFeatureCfg.ui64Features & RGX_FEATURE_PDS_PER_DUST_BIT_MASK))
|
{
|
asTASigRegList[gui32TASigRegCount++] = (RGXFW_REGISTER_LIST){RGX_CR_PDS_DOUTM_STM_SIGNATURE,0, 0, 0};
|
}
|
}
|
|
if(0 == gui323DSigRegCount)
|
{
|
/* List of 3D signature and checksum register addresses */
|
if(0 == (psDevInfo->sDevFeatureCfg.ui64Features & RGX_FEATURE_S7_TOP_INFRASTRUCTURE_BIT_MASK))
|
{
|
as3DSigRegList[gui323DSigRegCount++] = (RGXFW_REGISTER_LIST){RGX_CR_ISP_PDS_CHECKSUM, 0, 0, 0};
|
as3DSigRegList[gui323DSigRegCount++] = (RGXFW_REGISTER_LIST){RGX_CR_ISP_TPF_CHECKSUM, 0, 0, 0};
|
as3DSigRegList[gui323DSigRegCount++] = (RGXFW_REGISTER_LIST){RGX_CR_TFPU_PLANE0_CHECKSUM, 0, 0, 0};
|
as3DSigRegList[gui323DSigRegCount++] = (RGXFW_REGISTER_LIST){RGX_CR_TFPU_PLANE1_CHECKSUM, 0, 0, 0};
|
as3DSigRegList[gui323DSigRegCount++] = (RGXFW_REGISTER_LIST){RGX_CR_PBE_CHECKSUM, 0, 0, 0};
|
as3DSigRegList[gui323DSigRegCount++] = (RGXFW_REGISTER_LIST){RGX_CR_IFPU_ISP_CHECKSUM, 0, 0, 0};
|
}else
|
{
|
as3DSigRegList[gui323DSigRegCount++] = (RGXFW_REGISTER_LIST){RGX_CR_ISP_PDS_CHECKSUM, RGX_CR_BLACKPEARL_INDIRECT, 0, ui32PhantomCnt};
|
as3DSigRegList[gui323DSigRegCount++] = (RGXFW_REGISTER_LIST){RGX_CR_ISP_TPF_CHECKSUM, RGX_CR_BLACKPEARL_INDIRECT, 0, ui32PhantomCnt};
|
as3DSigRegList[gui323DSigRegCount++] = (RGXFW_REGISTER_LIST){RGX_CR_TFPU_PLANE0_CHECKSUM, RGX_CR_BLACKPEARL_INDIRECT, 0, ui32PhantomCnt};
|
as3DSigRegList[gui323DSigRegCount++] = (RGXFW_REGISTER_LIST){RGX_CR_TFPU_PLANE1_CHECKSUM, RGX_CR_BLACKPEARL_INDIRECT, 0, ui32PhantomCnt};
|
as3DSigRegList[gui323DSigRegCount++] = (RGXFW_REGISTER_LIST){RGX_CR_PBE_CHECKSUM, RGX_CR_PBE_INDIRECT, 0, psDevInfo->sDevFeatureCfg.ui32NumClusters-1};
|
as3DSigRegList[gui323DSigRegCount++] = (RGXFW_REGISTER_LIST){RGX_CR_IFPU_ISP_CHECKSUM, RGX_CR_BLACKPEARL_INDIRECT, 0, ui32PhantomCnt};
|
};
|
|
}
|
|
}
|
#endif
|
|
/*!
|
*******************************************************************************
|
|
@Function RGXInit
|
|
@Description
|
|
RGX Initialisation
|
|
@Input hServices
|
|
@Return PVRSRV_ERROR
|
|
******************************************************************************/
|
IMG_INTERNAL
|
PVRSRV_ERROR RGXInit(SHARED_DEV_CONNECTION hServices)
|
{
|
PVRSRV_ERROR eError;
|
RGXFWIF_COMPCHECKS_BVNC_DECLARE_AND_INIT(sBVNC);
|
|
/* Services initialisation parameters */
|
RGX_SRVINIT_APPHINTS sApphints = {0};
|
IMG_UINT32 ui32DeviceFlags;
|
IMG_UINT64 ui64ErnsBrns = 0, ui64Features = 0;
|
|
/* Server scripts */
|
RGX_SCRIPT_BUILD sDbgInitScript = {RGX_MAX_DEBUG_COMMANDS, 0, IMG_FALSE, asDbgCommands};
|
|
/* FW allocations handles */
|
IMG_HANDLE hFWCodePMR;
|
IMG_HANDLE hFWDataPMR;
|
IMG_HANDLE hFWCorememPMR;
|
|
/* HWPerf Ctl allocation handle */
|
IMG_HANDLE hHWPerfDataPMR;
|
|
#if defined(SUPPORT_KERNEL_SRVINIT)
|
PVRSRV_DEVICE_NODE *psDeviceNode = (PVRSRV_DEVICE_NODE *)hServices;
|
PVRSRV_RGXDEV_INFO *psDevInfo = (PVRSRV_RGXDEV_INFO *)psDeviceNode->pvDevice;
|
|
IMG_CHAR sV[RGXFWIF_COMPCHECKS_BVNC_V_LEN_MAX];
|
|
OSSNPrintf(sV, sizeof(sV), "%d", psDevInfo->sDevFeatureCfg.ui32V);
|
/*
|
* FIXME:
|
* Is this check redundant for the kernel mode version of srvinit?
|
* How do we check the user mode BVNC in this case?
|
*/
|
rgx_bvnc_packed(&sBVNC.ui64BNC, sBVNC.aszV, sBVNC.ui32VLenMax, psDevInfo->sDevFeatureCfg.ui32B, \
|
sV, \
|
psDevInfo->sDevFeatureCfg.ui32N, psDevInfo->sDevFeatureCfg.ui32C);
|
|
|
ui64ErnsBrns = psDevInfo->sDevFeatureCfg.ui64ErnsBrns;
|
ui64Features = psDevInfo->sDevFeatureCfg.ui64Features;
|
#else
|
rgx_bvnc_packed(&sBVNC.ui64BNC, sBVNC.aszV, sBVNC.ui32VLenMax, RGX_BVNC_B, RGX_BVNC_V_ST, RGX_BVNC_N, RGX_BVNC_C);
|
#endif
|
|
/* Services initialisation parameters */
|
_ParseHTBAppHints(hServices);
|
GetApphints(&sApphints, ui64ErnsBrns, ui64Features);
|
GetDeviceFlags(&sApphints, &ui32DeviceFlags);
|
|
#if defined(SUPPORT_GPUVIRT_VALIDATION)
|
{
|
IMG_UINT uiOS, uiRegion;
|
IMG_UINT32 aui32Buffer[GPUVIRT_VALIDATION_NUM_OS * GPUVIRT_VALIDATION_NUM_REGIONS * 2]; /* The final 2 is 1 for Min and 1 for Max */
|
IMG_UINT32 ui32Counter = 0;
|
|
for (uiOS = 0; uiOS < GPUVIRT_VALIDATION_NUM_OS; uiOS++)
|
{
|
for (uiRegion = 0; uiRegion < GPUVIRT_VALIDATION_NUM_REGIONS; uiRegion++)
|
{
|
aui32Buffer[ui32Counter++] = sApphints.aui32OSidMin[uiOS][uiRegion];
|
aui32Buffer[ui32Counter++] = sApphints.aui32OSidMax[uiOS][uiRegion];
|
}
|
}
|
|
BridgeGPUVIRTPopulateLMASubArenas(hServices, ui32Counter, aui32Buffer, sApphints.bEnableTrustedDeviceAceConfig);
|
}
|
#endif
|
|
|
eError = InitFirmware(hServices,
|
&sApphints,
|
&sBVNC,
|
&hFWCodePMR,
|
&hFWDataPMR,
|
&hFWCorememPMR,
|
&hHWPerfDataPMR);
|
if (eError != PVRSRV_OK)
|
{
|
PVR_DPF((PVR_DBG_ERROR, "RGXInit: InitFirmware failed (%d)", eError));
|
goto cleanup;
|
}
|
|
/*
|
* Build Debug info script
|
*/
|
sDbgInitScript.psCommands = asDbgCommands;
|
|
#if defined(SUPPORT_KERNEL_SRVINIT)
|
if(!PrepareDebugScript(&sDbgInitScript, sApphints.eFirmwarePerf != FW_PERF_CONF_NONE, psDevInfo))
|
#else
|
if(!PrepareDebugScript(&sDbgInitScript, sApphints.eFirmwarePerf != FW_PERF_CONF_NONE, NULL))
|
#endif
|
{
|
PVR_DPF((PVR_DBG_ERROR, "RGXInit: Run out of mem for the dbg commands"));
|
}
|
|
/* finish the script */
|
if(!ScriptHalt(&sDbgInitScript))
|
{
|
PVR_DPF((PVR_DBG_ERROR, "RGXInit: Run out of mem for the terminating dbg script"));
|
}
|
|
#if defined(PDUMP)
|
eError = InitialiseAllCounters(hServices, hHWPerfDataPMR);
|
if (eError != PVRSRV_OK)
|
{
|
PVR_DPF((PVR_DBG_ERROR, "RGXInit: InitialiseAllCounters failed (%d)", eError));
|
goto cleanup;
|
}
|
#endif
|
|
/*
|
* Perform second stage of RGX initialisation
|
*/
|
eError = BridgeRGXInitDevPart2(hServices,
|
sDbgInitScript.psCommands,
|
ui32DeviceFlags,
|
sApphints.ui32HWPerfHostBufSize,
|
sApphints.ui32HWPerfHostFilter,
|
sApphints.eRGXActivePMConf,
|
hFWCodePMR,
|
hFWDataPMR,
|
hFWCorememPMR,
|
hHWPerfDataPMR);
|
|
if (eError != PVRSRV_OK)
|
{
|
PVR_DPF((PVR_DBG_ERROR, "RGXInit: BridgeRGXInitDevPart2 failed (%d)", eError));
|
goto cleanup;
|
}
|
|
#if defined(SUPPORT_KERNEL_SRVINIT) && defined(SUPPORT_VALIDATION)
|
PVRSRVAppHintDumpState();
|
#endif
|
|
#if defined(PDUMP)
|
/*
|
* Dump the list of signature registers
|
*/
|
{
|
IMG_UINT32 i;
|
IMG_UINT32 ui32TASigRegCount = 0, ui323DSigRegCount= 0;
|
IMG_BOOL bRayTracing = IMG_FALSE;
|
|
#if defined(SUPPORT_KERNEL_SRVINIT) && defined(__KERNEL__)
|
RGXInitFWSigRegisters(psDevInfo);
|
ui32TASigRegCount = gui32TASigRegCount;
|
ui323DSigRegCount = gui323DSigRegCount;
|
if(psDevInfo->sDevFeatureCfg.ui64Features & RGX_FEATURE_RAY_TRACING_BIT_MASK)
|
{
|
bRayTracing = IMG_TRUE;
|
}
|
#if defined(DEBUG)
|
if (gui32TASigRegCount > SIG_REG_TA_MAX_COUNT)
|
{
|
PVR_DPF((PVR_DBG_ERROR, "%s: TA signature registers max count exceeded",__func__));
|
PVR_ASSERT(0);
|
}
|
if (gui323DSigRegCount > SIG_REG_3D_MAX_COUNT)
|
{
|
PVR_DPF((PVR_DBG_ERROR, "%s: 3D signature registers max count exceeded",__func__));
|
PVR_ASSERT(0);
|
}
|
#endif
|
#else
|
ui32TASigRegCount = sizeof(asTASigRegList)/sizeof(RGXFW_REGISTER_LIST);
|
ui323DSigRegCount = sizeof(as3DSigRegList)/sizeof(RGXFW_REGISTER_LIST);
|
#if defined(RGX_FEATURE_RAY_TRACING)
|
bRayTracing = IMG_TRUE;
|
#endif
|
#endif
|
|
|
|
SRVINITPDumpComment(hServices, "Signature TA registers: ");
|
for (i = 0; i < ui32TASigRegCount; i++)
|
{
|
if (asTASigRegList[i].ui16IndirectRegNum != 0)
|
{
|
SRVINITPDumpComment(hServices, " * 0x%8.8X (indirect via 0x%8.8X %d to %d)",
|
asTASigRegList[i].ui16RegNum, asTASigRegList[i].ui16IndirectRegNum,
|
asTASigRegList[i].ui16IndirectStartVal, asTASigRegList[i].ui16IndirectEndVal);
|
}
|
else
|
{
|
SRVINITPDumpComment(hServices, " * 0x%8.8X", asTASigRegList[i].ui16RegNum);
|
}
|
}
|
|
SRVINITPDumpComment(hServices, "Signature 3D registers: ");
|
for (i = 0; i < ui323DSigRegCount; i++)
|
{
|
if (as3DSigRegList[i].ui16IndirectRegNum != 0)
|
{
|
SRVINITPDumpComment(hServices, " * 0x%8.8X (indirect via 0x%8.8X %d to %d)",
|
as3DSigRegList[i].ui16RegNum, as3DSigRegList[i].ui16IndirectRegNum,
|
as3DSigRegList[i].ui16IndirectStartVal, as3DSigRegList[i].ui16IndirectEndVal);
|
}
|
else
|
{
|
SRVINITPDumpComment(hServices, " * 0x%8.8X", as3DSigRegList[i].ui16RegNum);
|
}
|
}
|
|
if(bRayTracing)
|
{
|
#if defined (RGX_FEATURE_RAY_TRACING) || defined(SUPPORT_KERNEL_SRVINIT)
|
SRVINITPDumpComment(hServices, "Signature RTU registers: ");
|
for (i = 0; i < sizeof(asRTUSigRegList)/sizeof(RGXFW_REGISTER_LIST); i++)
|
{
|
if (asRTUSigRegList[i].ui16IndirectRegNum != 0)
|
{
|
SRVINITPDumpComment(hServices, " * 0x%8.8X (indirect via 0x%8.8X %d to %d)",
|
asRTUSigRegList[i].ui16RegNum, asRTUSigRegList[i].ui16IndirectRegNum,
|
asRTUSigRegList[i].ui16IndirectStartVal, asRTUSigRegList[i].ui16IndirectEndVal);
|
}
|
else
|
{
|
SRVINITPDumpComment(hServices, " * 0x%8.8X", asRTUSigRegList[i].ui16RegNum);
|
}
|
}
|
|
SRVINITPDumpComment(hServices, "Signature SHG registers: ");
|
for (i = 0; i < sizeof(asSHGSigRegList)/sizeof(RGXFW_REGISTER_LIST); i++)
|
{
|
if (asSHGSigRegList[i].ui16IndirectRegNum != 0)
|
{
|
SRVINITPDumpComment(hServices, " * 0x%8.8X (indirect via 0x%8.8X %d to %d)",
|
asSHGSigRegList[i].ui16RegNum, asSHGSigRegList[i].ui16IndirectRegNum,
|
asSHGSigRegList[i].ui16IndirectStartVal, asSHGSigRegList[i].ui16IndirectEndVal);
|
}
|
else
|
{
|
SRVINITPDumpComment(hServices, " * 0x%8.8X", asSHGSigRegList[i].ui16RegNum);
|
}
|
}
|
#endif
|
}
|
|
}
|
#endif /* !defined(SUPPORT_KERNEL_SRVINIT) && defined(PDUMP) */
|
|
eError = PVRSRV_OK;
|
|
cleanup:
|
return eError;
|
}
|
|
/******************************************************************************
|
End of file (rgxsrvinit.c)
|
******************************************************************************/
|