| /*************************************************************************/ /*! |
| @File |
| @Title RGX HW Performance counter table |
| @Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved |
| @Description RGX HW Performance counters table |
| @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 "rgx_fwif_hwperf.h" |
| #include "rgxdefs_km.h" |
| #include "rgx_hwperf_table.h" |
| |
| /* Includes needed for PVRSRVKM (Server) context */ |
| # include "rgx_bvnc_defs_km.h" |
| # if defined(__KERNEL__) |
| # include "rgxdevice.h" |
| # endif |
| |
| /* Shared compile-time context ASSERT macro */ |
| #if defined(RGX_FIRMWARE) |
| # include "rgxfw_utils.h" |
| /* firmware context */ |
| # define DBG_ASSERT(_c) RGXFW_ASSERT((_c)) |
| #else |
| # include "pvr_debug.h" |
| /* host client/server context */ |
| # define DBG_ASSERT(_c) PVR_ASSERT((_c)) |
| #endif |
| |
| /***************************************************************************** |
| RGXFW_HWPERF_CNTBLK_TYPE_MODEL struct PFNs pfnIsBlkPowered() |
| |
| Referenced in gasCntBlkTypeModel[] table below and only called from |
| RGX_FIRMWARE run-time context. Therefore compile time configuration is used. |
| *****************************************************************************/ |
| |
| #if defined(RGX_FIRMWARE) && defined(RGX_FEATURE_PERFBUS) |
| # include "rgxfw_pow.h" |
| # include "rgxfw_utils.h" |
| |
| static IMG_BOOL rgxfw_hwperf_pow_st_direct(RGX_HWPERF_CNTBLK_ID eBlkType, IMG_UINT8 ui8UnitId) |
| { |
| PVR_UNREFERENCED_PARAMETER(eBlkType); |
| PVR_UNREFERENCED_PARAMETER(ui8UnitId); |
| |
| #if defined(RGX_FEATURE_S7_TOP_INFRASTRUCTURE) |
| /* S7XT: JONES */ |
| return (eBlkType == RGX_CNTBLK_ID_JONES) ? IMG_TRUE : IMG_FALSE; |
| #elif defined(RGX_FEATURE_XT_TOP_INFRASTRUCTURE) |
| /* S6XT: TA, TORNADO */ |
| return IMG_TRUE; |
| #else |
| /* S6 : TA, HUB, RASTER (RASCAL) */ |
| return (gsPowCtl.ePowState & RGXFW_POW_ST_RD_ON) ? IMG_TRUE : IMG_FALSE; |
| #endif |
| } |
| |
| /* Only use conditional compilation when counter blocks appear in different |
| * islands for different Rogue families. |
| */ |
| static IMG_BOOL rgxfw_hwperf_pow_st_indirect(RGX_HWPERF_CNTBLK_ID eBlkType, IMG_UINT8 ui8UnitId) |
| { |
| IMG_UINT32 ui32NumDustsEnabled = rgxfw_pow_get_enabled_dusts_num(); |
| |
| if ((gsPowCtl.ePowState & RGXFW_POW_ST_RD_ON) && |
| (ui32NumDustsEnabled > 0)) |
| { |
| #if defined(RGX_FEATURE_DYNAMIC_DUST_POWER) |
| IMG_UINT32 ui32NumUscEnabled = ui32NumDustsEnabled*2; |
| |
| switch (eBlkType) |
| { |
| case RGX_CNTBLK_ID_TPU_MCU0: /* S6 and S6XT */ |
| #if defined (RGX_FEATURE_S7_TOP_INFRASTRUCTURE) |
| case RGX_CNTBLK_ID_TEXAS0: /* S7 */ |
| #endif |
| if (ui8UnitId >= ui32NumDustsEnabled) |
| { |
| return IMG_FALSE; |
| } |
| break; |
| case RGX_CNTBLK_ID_USC0: /* S6, S6XT, S7 */ |
| case RGX_CNTBLK_ID_PBE0: /* S7 */ |
| /* Handle single cluster cores */ |
| if (ui8UnitId >= ((ui32NumUscEnabled > RGX_FEATURE_NUM_CLUSTERS) ? RGX_FEATURE_NUM_CLUSTERS : ui32NumUscEnabled)) |
| { |
| return IMG_FALSE; |
| } |
| break; |
| case RGX_CNTBLK_ID_BLACKPEARL0: /* S7 */ |
| case RGX_CNTBLK_ID_RASTER0: /* S6XT */ |
| #if defined(RGX_FEATURE_XT_TOP_INFRASTRUCTURE) |
| case RGX_CNTBLK_ID_TEXAS0: /* S6XT */ |
| #endif |
| if (ui8UnitId >= (RGX_REQ_NUM_PHANTOMS(ui32NumUscEnabled))) |
| { |
| return IMG_FALSE; |
| } |
| break; |
| default: |
| RGXFW_ASSERT(IMG_FALSE); /* should never get here, table error */ |
| break; |
| } |
| #else |
| /* Always true, no fused DUSTs, all powered so do not check unit */ |
| PVR_UNREFERENCED_PARAMETER(eBlkType); |
| PVR_UNREFERENCED_PARAMETER(ui8UnitId); |
| #endif |
| } |
| else |
| { |
| return IMG_FALSE; |
| } |
| return IMG_TRUE; |
| } |
| |
| #else /* !defined(RGX_FIRMWARE) || !defined(RGX_FEATURE_PERFBUS) */ |
| |
| # define rgxfw_hwperf_pow_st_direct ((void*)NULL) |
| # define rgxfw_hwperf_pow_st_indirect ((void*)NULL) |
| # define rgxfw_hwperf_pow_st_gandalf ((void*)NULL) |
| |
| #endif /* !defined(RGX_FIRMWARE) || !defined(RGX_FEATURE_PERFBUS) */ |
| |
| #if defined(RGX_FIRMWARE) && defined(RGX_FEATURE_RAY_TRACING) |
| |
| /* Currently there is no power island control in the firmware for ray tracing |
| * so we currently assume these blocks are always powered. */ |
| static IMG_BOOL rgxfw_hwperf_pow_st_gandalf(RGX_HWPERF_CNTBLK_ID eBlkType, IMG_UINT8 ui8UnitId) |
| { |
| PVR_UNREFERENCED_PARAMETER(eBlkType); |
| PVR_UNREFERENCED_PARAMETER(ui8UnitId); |
| |
| return IMG_TRUE; |
| } |
| |
| #else /* !defined(RGX_FIRMWARE) || !defined(RGX_FEATURE_RAY_TRACING) */ |
| |
| # define rgxfw_hwperf_pow_st_gandalf ((void*)NULL) |
| |
| #endif /* !defined(RGX_FIRMWARE) || !defined(RGX_FEATURE_RAY_TRACING) */ |
| |
| /***************************************************************************** |
| RGXFW_HWPERF_CNTBLK_TYPE_MODEL struct PFNs pfnIsBlkPowered() end |
| *****************************************************************************/ |
| |
| /***************************************************************************** |
| RGXFW_HWPERF_CNTBLK_TYPE_MODEL struct PFNs pfnIsBlkPresent() start |
| |
| Referenced in gasCntBlkTypeModel[] table below and called from all build |
| contexts: |
| RGX_FIRMWARE, PVRSRVCTL (UM) and PVRSRVKM (Server). |
| |
| Therefore each function has two implementations, one for compile time and one |
| run time configuration depending on the context. The functions will inform the |
| caller whether this block is valid for this particular RGX device. Other |
| run-time dependent data is returned in psRtInfo for the caller to use. |
| *****************************************************************************/ |
| |
| /* Used for block types: USC */ |
| static IMG_BOOL rgx_hwperf_blk_present_perfbus(const RGXFW_HWPERF_CNTBLK_TYPE_MODEL* psBlkTypeDesc, void *pvDev_km, RGX_HWPERF_CNTBLK_RT_INFO *psRtInfo) |
| { |
| DBG_ASSERT(psBlkTypeDesc != NULL); |
| DBG_ASSERT(psRtInfo != NULL); |
| DBG_ASSERT(psBlkTypeDesc->uiCntBlkIdBase == RGX_CNTBLK_ID_USC0); |
| |
| #if defined(__KERNEL__) /* Server context */ |
| PVR_ASSERT(pvDev_km != NULL); |
| { |
| PVRSRV_RGXDEV_INFO *psDevInfo = (PVRSRV_RGXDEV_INFO *)pvDev_km; |
| if ((psDevInfo->sDevFeatureCfg.ui64Features & RGX_FEATURE_PERFBUS_BIT_MASK) != 0) |
| { |
| psRtInfo->uiBitSelectPreserveMask = 0x0000; |
| psRtInfo->uiNumUnits = psDevInfo->sDevFeatureCfg.ui32NumClusters; |
| return IMG_TRUE; |
| } |
| } |
| PVR_UNREFERENCED_PARAMETER(psBlkTypeDesc); |
| #else /* FW context */ |
| PVR_UNREFERENCED_PARAMETER(pvDev_km); |
| # if defined(RGX_FEATURE_PERFBUS) |
| psRtInfo->uiBitSelectPreserveMask = 0x0000; |
| psRtInfo->uiNumUnits = psBlkTypeDesc->uiNumUnits; |
| return IMG_TRUE; |
| # else |
| PVR_UNREFERENCED_PARAMETER(psBlkTypeDesc); |
| PVR_UNREFERENCED_PARAMETER(psRtInfo); |
| # endif |
| #endif |
| return IMG_FALSE; |
| } |
| |
| /* Used for block types: Direct RASTERISATION, HUB */ |
| static IMG_BOOL rgx_hwperf_blk_present_not_clustergrouping(const RGXFW_HWPERF_CNTBLK_TYPE_MODEL* psBlkTypeDesc, void *pvDev_km, RGX_HWPERF_CNTBLK_RT_INFO *psRtInfo) |
| { |
| DBG_ASSERT(psBlkTypeDesc != NULL); |
| DBG_ASSERT(psRtInfo != NULL); |
| DBG_ASSERT((psBlkTypeDesc->uiCntBlkIdBase == RGX_CNTBLK_ID_RASTER) || |
| (psBlkTypeDesc->uiCntBlkIdBase == RGX_CNTBLK_ID_HUB)); |
| |
| #if defined(__KERNEL__) /* Server context */ |
| PVR_ASSERT(pvDev_km != NULL); |
| { |
| PVRSRV_RGXDEV_INFO *psDevInfo = (PVRSRV_RGXDEV_INFO *)pvDev_km; |
| if (((psDevInfo->sDevFeatureCfg.ui64Features & RGX_FEATURE_CLUSTER_GROUPING_BIT_MASK) == 0) && |
| ((psDevInfo->sDevFeatureCfg.ui64Features & RGX_FEATURE_PERFBUS_BIT_MASK) != 0)) |
| { |
| psRtInfo->uiNumUnits = 1; |
| if (((psDevInfo->sDevFeatureCfg.ui64ErnsBrns & HW_ERN_44885_BIT_MASK) != 0) && |
| (psBlkTypeDesc->uiCntBlkIdBase == RGX_CNTBLK_ID_RASTER)) |
| { |
| psRtInfo->uiBitSelectPreserveMask = 0X7c00; |
| } |
| else |
| { |
| psRtInfo->uiBitSelectPreserveMask = 0x0000; |
| } |
| return IMG_TRUE; |
| } |
| } |
| #else /* FW context */ |
| PVR_UNREFERENCED_PARAMETER(pvDev_km); |
| # if !defined(RGX_FEATURE_CLUSTER_GROUPING) && defined(RGX_FEATURE_PERFBUS) |
| psRtInfo->uiNumUnits = 1; |
| # if defined(HW_ERN_44885) |
| if (psBlkTypeDesc->uiCntBlkIdBase == RGX_CNTBLK_ID_RASTER) |
| { |
| psRtInfo->uiBitSelectPreserveMask = 0x7C00; |
| } |
| else |
| # endif |
| { |
| psRtInfo->uiBitSelectPreserveMask = 0x0000; |
| } |
| PVR_UNREFERENCED_PARAMETER(psBlkTypeDesc); |
| return IMG_TRUE; |
| # else |
| PVR_UNREFERENCED_PARAMETER(psBlkTypeDesc); |
| PVR_UNREFERENCED_PARAMETER(psRtInfo); |
| # endif |
| #endif |
| return IMG_FALSE; |
| } |
| |
| /* Used for block types: BF, BT, RT, SH, BX_TU */ |
| static IMG_BOOL rgx_hwperf_blk_present_raytracing(const RGXFW_HWPERF_CNTBLK_TYPE_MODEL* psBlkTypeDesc, void *pvDev_km, RGX_HWPERF_CNTBLK_RT_INFO *psRtInfo) |
| { |
| DBG_ASSERT(psBlkTypeDesc != NULL); |
| DBG_ASSERT(psRtInfo != NULL); |
| DBG_ASSERT((psBlkTypeDesc->uiCntBlkIdBase == RGX_CNTBLK_ID_BF) || |
| (psBlkTypeDesc->uiCntBlkIdBase == RGX_CNTBLK_ID_BT) || |
| (psBlkTypeDesc->uiCntBlkIdBase == RGX_CNTBLK_ID_RT) || |
| (psBlkTypeDesc->uiCntBlkIdBase == RGX_CNTBLK_ID_SH) || |
| (psBlkTypeDesc->uiCntBlkIdBase == RGX_CNTBLK_ID_BX_TU0)); |
| |
| #if defined(__KERNEL__) /* Server context */ |
| PVR_ASSERT(pvDev_km != NULL); |
| { |
| PVRSRV_RGXDEV_INFO *psDevInfo = (PVRSRV_RGXDEV_INFO *)pvDev_km; |
| if ((psDevInfo->sDevFeatureCfg.ui64Features & RGX_FEATURE_RAY_TRACING_BIT_MASK) != 0) |
| { |
| psRtInfo->uiBitSelectPreserveMask = 0x0000; |
| /* Exception case, read from table as ray-tracing units do not vary by feature. */ |
| psRtInfo->uiNumUnits = psBlkTypeDesc->uiNumUnits; |
| return IMG_TRUE; |
| } |
| } |
| #else /* FW context */ |
| PVR_UNREFERENCED_PARAMETER(pvDev_km); |
| # if defined(RGX_FEATURE_RAY_TRACING) |
| psRtInfo->uiBitSelectPreserveMask = 0x0000; |
| psRtInfo->uiNumUnits = psBlkTypeDesc->uiNumUnits; |
| DBG_ASSERT(psBlkTypeDesc->uiPerfReg != 0); /* Check for broken config */ |
| return IMG_TRUE; |
| # else |
| PVR_UNREFERENCED_PARAMETER(psBlkTypeDesc); |
| PVR_UNREFERENCED_PARAMETER(psRtInfo); |
| # endif |
| #endif |
| return IMG_FALSE; |
| } |
| |
| #if defined(__KERNEL__) /* Server context */ |
| static INLINE IMG_UINT32 rgx_units_indirect_by_phantom(PVRSRV_DEVICE_FEATURE_CONFIG *psFeatCfg) |
| { |
| /* Run-time math for RGX_HWPERF_INDIRECT_BY_PHANTOM */ |
| return ((psFeatCfg->ui64Features & RGX_FEATURE_CLUSTER_GROUPING_BIT_MASK) == 0) ? 1 |
| : (psFeatCfg->ui32NumClusters+3)/4; |
| } |
| |
| static INLINE IMG_UINT32 rgx_units_phantom_indirect_by_dust(PVRSRV_DEVICE_FEATURE_CONFIG *psFeatCfg) |
| { |
| /* Run-time math for RGX_HWPERF_PHANTOM_INDIRECT_BY_DUST */ |
| return MAX((psFeatCfg->ui32NumClusters>>1),1); |
| } |
| |
| static INLINE IMG_UINT32 rgx_units_phantom_indirect_by_cluster(PVRSRV_DEVICE_FEATURE_CONFIG *psFeatCfg) |
| { |
| /* Run-time math for RGX_HWPERF_PHANTOM_INDIRECT_BY_CLUSTER */ |
| return psFeatCfg->ui32NumClusters; |
| } |
| #endif /* defined(__KERNEL__) */ |
| |
| /* Used for block types: TORNADO, TEXAS, Indirect RASTERISATION */ |
| static IMG_BOOL rgx_hwperf_blk_present_xttop(const RGXFW_HWPERF_CNTBLK_TYPE_MODEL* psBlkTypeDesc, void *pvDev_km, RGX_HWPERF_CNTBLK_RT_INFO *psRtInfo) |
| { |
| DBG_ASSERT(psBlkTypeDesc != NULL); |
| DBG_ASSERT(psRtInfo != NULL); |
| DBG_ASSERT((psBlkTypeDesc->uiCntBlkIdBase == RGX_CNTBLK_ID_TORNADO) || |
| (psBlkTypeDesc->uiCntBlkIdBase == RGX_CNTBLK_ID_TEXAS0) || |
| (psBlkTypeDesc->uiCntBlkIdBase == RGX_CNTBLK_ID_RASTER0)); |
| |
| #if defined(__KERNEL__) /* Server context */ |
| PVR_ASSERT(pvDev_km != NULL); |
| { |
| PVRSRV_RGXDEV_INFO *psDevInfo = (PVRSRV_RGXDEV_INFO *)pvDev_km; |
| if ((psDevInfo->sDevFeatureCfg.ui64Features & RGX_FEATURE_XT_TOP_INFRASTRUCTURE_BIT_MASK) != 0) |
| { |
| psRtInfo->uiBitSelectPreserveMask = 0x0000; |
| psRtInfo->uiNumUnits = |
| (psBlkTypeDesc->uiCntBlkIdBase == RGX_CNTBLK_ID_TORNADO) ? 1 |
| : rgx_units_indirect_by_phantom(&psDevInfo->sDevFeatureCfg); // Texas, Ind. Raster |
| return IMG_TRUE; |
| } |
| } |
| #else /* FW context */ |
| PVR_UNREFERENCED_PARAMETER(pvDev_km); |
| # if defined(RGX_FEATURE_XT_TOP_INFRASTRUCTURE) && defined(RGX_FEATURE_PERFBUS) |
| psRtInfo->uiBitSelectPreserveMask = 0x0000; |
| psRtInfo->uiNumUnits = psBlkTypeDesc->uiNumUnits; |
| return IMG_TRUE; |
| # else |
| PVR_UNREFERENCED_PARAMETER(psBlkTypeDesc); |
| PVR_UNREFERENCED_PARAMETER(psRtInfo); |
| # endif |
| #endif |
| return IMG_FALSE; |
| } |
| |
| /* Used for block types: JONES, TPU_MCU, TEXAS, BLACKPERL, PBE */ |
| static IMG_BOOL rgx_hwperf_blk_present_s7top(const RGXFW_HWPERF_CNTBLK_TYPE_MODEL* psBlkTypeDesc, void *pvDev_km, RGX_HWPERF_CNTBLK_RT_INFO *psRtInfo) |
| { |
| DBG_ASSERT(psBlkTypeDesc != NULL); |
| DBG_ASSERT(psRtInfo != NULL); |
| DBG_ASSERT((psBlkTypeDesc->uiCntBlkIdBase == RGX_CNTBLK_ID_JONES) || |
| (psBlkTypeDesc->uiCntBlkIdBase == RGX_CNTBLK_ID_TPU_MCU0) || |
| (psBlkTypeDesc->uiCntBlkIdBase == RGX_CNTBLK_ID_TEXAS0) || |
| (psBlkTypeDesc->uiCntBlkIdBase == RGX_CNTBLK_ID_BLACKPEARL0) || |
| (psBlkTypeDesc->uiCntBlkIdBase == RGX_CNTBLK_ID_PBE0)); |
| |
| #if defined(__KERNEL__) /* Server context */ |
| PVR_ASSERT(pvDev_km != NULL); |
| { |
| PVRSRV_RGXDEV_INFO *psDevInfo = (PVRSRV_RGXDEV_INFO *)pvDev_km; |
| if ((psDevInfo->sDevFeatureCfg.ui64Features & RGX_FEATURE_S7_TOP_INFRASTRUCTURE_BIT_MASK) != 0) |
| { |
| if (psBlkTypeDesc->uiCntBlkIdBase == RGX_CNTBLK_ID_TPU_MCU0) |
| { |
| psRtInfo->uiBitSelectPreserveMask = |
| ((psDevInfo->sDevFeatureCfg.ui64ErnsBrns & HW_ERN_41805_BIT_MASK) != 0) |
| ? 0x8000 : 0x0000; |
| psRtInfo->uiNumUnits = rgx_units_phantom_indirect_by_dust(&psDevInfo->sDevFeatureCfg); |
| return IMG_TRUE; |
| } |
| else if (psBlkTypeDesc->uiCntBlkIdBase == RGX_CNTBLK_ID_TEXAS0) |
| { |
| psRtInfo->uiBitSelectPreserveMask = 0x0000; |
| psRtInfo->uiNumUnits = rgx_units_phantom_indirect_by_dust(&psDevInfo->sDevFeatureCfg); |
| return IMG_TRUE; |
| } |
| else if (psBlkTypeDesc->uiCntBlkIdBase == RGX_CNTBLK_ID_BLACKPEARL0) |
| { |
| psRtInfo->uiBitSelectPreserveMask = 0x0000; |
| psRtInfo->uiNumUnits = rgx_units_indirect_by_phantom(&psDevInfo->sDevFeatureCfg); |
| return IMG_TRUE; |
| } |
| else if (psBlkTypeDesc->uiCntBlkIdBase == RGX_CNTBLK_ID_PBE0) |
| { |
| psRtInfo->uiBitSelectPreserveMask = 0x0000; |
| psRtInfo->uiNumUnits = rgx_units_phantom_indirect_by_cluster(&psDevInfo->sDevFeatureCfg); |
| return IMG_TRUE; |
| } |
| else if (psBlkTypeDesc->uiCntBlkIdBase == RGX_CNTBLK_ID_JONES) |
| { |
| psRtInfo->uiBitSelectPreserveMask = 0x0000; |
| psRtInfo->uiNumUnits = 1; |
| return IMG_TRUE; |
| } |
| } |
| } |
| #else /* FW context */ |
| PVR_UNREFERENCED_PARAMETER(pvDev_km); |
| # if defined(RGX_FEATURE_S7_TOP_INFRASTRUCTURE) |
| psRtInfo->uiNumUnits = psBlkTypeDesc->uiNumUnits; |
| # if defined(HW_ERN_41805) |
| if (psBlkTypeDesc->uiCntBlkIdBase == RGX_CNTBLK_ID_TPU_MCU0) |
| { |
| psRtInfo->uiBitSelectPreserveMask = 0x8000; |
| } |
| else |
| # endif |
| { |
| psRtInfo->uiBitSelectPreserveMask = 0x0000; |
| } |
| return IMG_TRUE; |
| # else |
| PVR_UNREFERENCED_PARAMETER(psBlkTypeDesc); |
| PVR_UNREFERENCED_PARAMETER(psRtInfo); |
| # endif |
| #endif |
| return IMG_FALSE; |
| } |
| |
| /* Used for block types: TA, TPU_MCU */ |
| static IMG_BOOL rgx_hwperf_blk_present_not_s7top(const RGXFW_HWPERF_CNTBLK_TYPE_MODEL* psBlkTypeDesc, void *pvDev_km, RGX_HWPERF_CNTBLK_RT_INFO *psRtInfo) |
| { |
| DBG_ASSERT(psBlkTypeDesc != NULL); |
| DBG_ASSERT(psRtInfo != NULL); |
| DBG_ASSERT((psBlkTypeDesc->uiCntBlkIdBase == RGX_CNTBLK_ID_TA) || |
| (psBlkTypeDesc->uiCntBlkIdBase == RGX_CNTBLK_ID_TPU_MCU0)); |
| |
| #if defined(__KERNEL__) /* Server context */ |
| PVR_ASSERT(pvDev_km != NULL); |
| { |
| PVRSRV_RGXDEV_INFO *psDevInfo = (PVRSRV_RGXDEV_INFO *)pvDev_km; |
| if (((psDevInfo->sDevFeatureCfg.ui64Features & RGX_FEATURE_S7_TOP_INFRASTRUCTURE_BIT_MASK) == 0) && |
| ((psDevInfo->sDevFeatureCfg.ui64Features & RGX_FEATURE_PERFBUS_BIT_MASK) != 0)) |
| { |
| if (((psDevInfo->sDevFeatureCfg.ui64ErnsBrns & HW_ERN_41805_BIT_MASK) != 0) && |
| (psBlkTypeDesc->uiCntBlkIdBase == RGX_CNTBLK_ID_TPU_MCU0)) |
| { |
| psRtInfo->uiBitSelectPreserveMask = 0X8000; |
| } |
| else |
| { |
| psRtInfo->uiBitSelectPreserveMask = 0x0000; |
| } |
| psRtInfo->uiNumUnits = (psBlkTypeDesc->uiCntBlkIdBase == RGX_CNTBLK_ID_TA) ? 1 |
| : rgx_units_phantom_indirect_by_dust(&psDevInfo->sDevFeatureCfg); // TPU_MCU0 |
| return IMG_TRUE; |
| } |
| } |
| #else /* FW context */ |
| PVR_UNREFERENCED_PARAMETER(pvDev_km); |
| # if !defined(RGX_FEATURE_S7_TOP_INFRASTRUCTURE) && defined(RGX_FEATURE_PERFBUS) |
| psRtInfo->uiNumUnits = psBlkTypeDesc->uiNumUnits; |
| # if defined(HW_ERN_41805) |
| if (psBlkTypeDesc->uiCntBlkIdBase == RGX_CNTBLK_ID_TPU_MCU0) |
| { |
| psRtInfo->uiBitSelectPreserveMask = 0x8000; |
| } |
| else |
| # endif |
| { |
| psRtInfo->uiBitSelectPreserveMask = 0x0000; |
| } |
| return IMG_TRUE; |
| # else |
| PVR_UNREFERENCED_PARAMETER(psBlkTypeDesc); |
| PVR_UNREFERENCED_PARAMETER(psRtInfo); |
| # endif |
| #endif |
| return IMG_FALSE; |
| } |
| |
| #if !defined(__KERNEL__) /* Firmware or User-mode context */ |
| static IMG_BOOL rgx_hwperf_blk_present_false(const RGXFW_HWPERF_CNTBLK_TYPE_MODEL* psBlkTypeDesc, void *pvDev_km, RGX_HWPERF_CNTBLK_RT_INFO *psRtInfo) |
| { |
| PVR_UNREFERENCED_PARAMETER(psBlkTypeDesc); |
| PVR_UNREFERENCED_PARAMETER(pvDev_km); |
| PVR_UNREFERENCED_PARAMETER(psRtInfo); |
| |
| /* Some functions not used on some BVNCs, silence compiler warnings */ |
| PVR_UNREFERENCED_PARAMETER(rgx_hwperf_blk_present_perfbus); |
| PVR_UNREFERENCED_PARAMETER(rgx_hwperf_blk_present_not_clustergrouping); |
| PVR_UNREFERENCED_PARAMETER(rgx_hwperf_blk_present_raytracing); |
| PVR_UNREFERENCED_PARAMETER(rgx_hwperf_blk_present_xttop); |
| PVR_UNREFERENCED_PARAMETER(rgx_hwperf_blk_present_s7top); |
| PVR_UNREFERENCED_PARAMETER(rgx_hwperf_blk_present_not_s7top); |
| |
| return IMG_FALSE; |
| } |
| |
| /* Used to instantiate a null row in the block type model table below where the |
| * block is not supported for a given build BVNC in firmware/user mode context. |
| * This is needed as the blockid to block type lookup uses the table as well |
| * and clients may try to access blocks not in the hardware. */ |
| #define RGXFW_HWPERF_CNTBLK_TYPE_UNSUPPORTED(_blkid) {_blkid, 0, 0, 0, 0, 0, 0, 0, 0, #_blkid, NULL, rgx_hwperf_blk_present_false} |
| |
| #endif |
| |
| |
| /***************************************************************************** |
| RGXFW_HWPERF_CNTBLK_TYPE_MODEL struct PFNs pfnIsBlkPresent() end |
| *****************************************************************************/ |
| |
| /***************************************************************************** |
| RGXFW_HWPERF_CNTBLK_TYPE_MODEL gasCntBlkTypeModel[] table |
| |
| This table holds the entries for the performance counter block type model. |
| Where the block is not present on an RGX device in question the |
| pfnIsBlkPresent() returns false, if valid and present it returns true. |
| Columns in the table with a ** indicate the value is a default and the |
| value returned in RGX_HWPERF_CNTBLK_RT_INFO when calling pfnIsBlkPresent() |
| should be used at runtime by the caller. These columns are only valid for |
| compile time BVNC configured contexts. |
| |
| Order of table rows must match order of counter block IDs in the enumeration |
| RGX_HWPERF_CNTBLK_ID. |
| *****************************************************************************/ |
| |
| static const RGXFW_HWPERF_CNTBLK_TYPE_MODEL gasCntBlkTypeModel[] = |
| { |
| /* uiCntBlkIdBase, iIndirectReg, uiPerfReg, uiSelect0BaseReg, uiCounter0BaseReg uiNumCounters, uiNumUnits**, uiSelectRegModeShift, uiSelectRegOffsetShift, pfnIsBlkPowered pfnIsBlkPresent |
| * pszBlockNameComment, */ |
| /*RGX_CNTBLK_ID_TA*/ |
| #if !defined(RGX_FEATURE_S7_TOP_INFRASTRUCTURE) && defined(RGX_FEATURE_PERFBUS) || defined(__KERNEL__) |
| {RGX_CNTBLK_ID_TA, 0, /* direct */ RGX_CR_TA_PERF, RGX_CR_TA_PERF_SELECT0, RGX_CR_TA_PERF_COUNTER_0, 4, 1, 21, 3, "RGX_CR_TA_PERF", rgxfw_hwperf_pow_st_direct, rgx_hwperf_blk_present_not_s7top }, |
| #else |
| RGXFW_HWPERF_CNTBLK_TYPE_UNSUPPORTED(RGX_CNTBLK_ID_TA), |
| #endif |
| |
| /*RGX_CNTBLK_ID_RASTER*/ |
| #if !defined(RGX_FEATURE_CLUSTER_GROUPING) && defined(RGX_FEATURE_PERFBUS) || defined(__KERNEL__) |
| {RGX_CNTBLK_ID_RASTER, 0, /* direct */ RGX_CR_RASTERISATION_PERF, RGX_CR_RASTERISATION_PERF_SELECT0, RGX_CR_RASTERISATION_PERF_COUNTER_0, 4, 1, 21, 3, "RGX_CR_RASTERISATION_PERF", rgxfw_hwperf_pow_st_direct, rgx_hwperf_blk_present_not_clustergrouping }, |
| #else |
| RGXFW_HWPERF_CNTBLK_TYPE_UNSUPPORTED(RGX_CNTBLK_ID_RASTER), |
| #endif |
| |
| /*RGX_CNTBLK_ID_HUB*/ |
| #if !defined(RGX_FEATURE_CLUSTER_GROUPING) && defined(RGX_FEATURE_PERFBUS) || defined(__KERNEL__) |
| {RGX_CNTBLK_ID_HUB, 0, /* direct */ RGX_CR_HUB_BIFPMCACHE_PERF, RGX_CR_HUB_BIFPMCACHE_PERF_SELECT0, RGX_CR_HUB_BIFPMCACHE_PERF_COUNTER_0, 4, 1, 21, 3, "RGX_CR_HUB_BIFPMCACHE_PERF", rgxfw_hwperf_pow_st_direct, rgx_hwperf_blk_present_not_clustergrouping }, |
| #else |
| RGXFW_HWPERF_CNTBLK_TYPE_UNSUPPORTED(RGX_CNTBLK_ID_HUB), |
| #endif |
| |
| /*RGX_CNTBLK_ID_TORNADO*/ |
| #if defined(RGX_FEATURE_XT_TOP_INFRASTRUCTURE) || defined(__KERNEL__) |
| {RGX_CNTBLK_ID_TORNADO, 0, /* direct */ RGX_CR_TORNADO_PERF, RGX_CR_TORNADO_PERF_SELECT0, RGX_CR_TORNADO_PERF_COUNTER_0, 4, 1, 21, 4, "RGX_CR_TORNADO_PERF", rgxfw_hwperf_pow_st_direct, rgx_hwperf_blk_present_xttop }, |
| #else |
| RGXFW_HWPERF_CNTBLK_TYPE_UNSUPPORTED(RGX_CNTBLK_ID_TORNADO), |
| #endif |
| |
| /*RGX_CNTBLK_ID_JONES*/ |
| #if defined(RGX_FEATURE_S7_TOP_INFRASTRUCTURE) || defined(__KERNEL__) |
| {RGX_CNTBLK_ID_JONES, 0, /* direct */ RGX_CR_JONES_PERF, RGX_CR_JONES_PERF_SELECT0, RGX_CR_JONES_PERF_COUNTER_0, 4, 1, 21, 3, "RGX_CR_JONES_PERF", rgxfw_hwperf_pow_st_direct, rgx_hwperf_blk_present_s7top }, |
| #else |
| RGXFW_HWPERF_CNTBLK_TYPE_UNSUPPORTED(RGX_CNTBLK_ID_JONES), |
| #endif |
| |
| /*RGX_CNTBLK_ID_BF RGX_CNTBLK_ID_BT RGX_CNTBLK_ID_RT RGX_CNTBLK_ID_SH*/ |
| #if defined(RGX_FEATURE_RAY_TRACING ) || defined(__KERNEL__) |
| {RGX_CNTBLK_ID_BF, 0, /* direct */ DPX_CR_BF_PERF, DPX_CR_BF_PERF_SELECT0, DPX_CR_BF_PERF_COUNTER_0, 4, 1, 21, 3, "RGX_CR_BF_PERF", rgxfw_hwperf_pow_st_gandalf, rgx_hwperf_blk_present_raytracing }, |
| {RGX_CNTBLK_ID_BT, 0, /* direct */ DPX_CR_BT_PERF, DPX_CR_BT_PERF_SELECT0, DPX_CR_BT_PERF_COUNTER_0, 4, 1, 21, 3, "RGX_CR_BT_PERF", rgxfw_hwperf_pow_st_gandalf, rgx_hwperf_blk_present_raytracing }, |
| {RGX_CNTBLK_ID_RT, 0, /* direct */ DPX_CR_RT_PERF, DPX_CR_RT_PERF_SELECT0, DPX_CR_RT_PERF_COUNTER_0, 4, 1, 21, 3, "RGX_CR_RT_PERF", rgxfw_hwperf_pow_st_gandalf, rgx_hwperf_blk_present_raytracing }, |
| {RGX_CNTBLK_ID_SH, 0, /* direct */ RGX_CR_SH_PERF, RGX_CR_SH_PERF_SELECT0, RGX_CR_SH_PERF_COUNTER_0, 4, 1, 21, 3, "RGX_CR_SH_PERF", rgxfw_hwperf_pow_st_gandalf, rgx_hwperf_blk_present_raytracing }, |
| #else |
| RGXFW_HWPERF_CNTBLK_TYPE_UNSUPPORTED(RGX_CNTBLK_ID_BF), |
| RGXFW_HWPERF_CNTBLK_TYPE_UNSUPPORTED(RGX_CNTBLK_ID_BT), |
| RGXFW_HWPERF_CNTBLK_TYPE_UNSUPPORTED(RGX_CNTBLK_ID_RT), |
| RGXFW_HWPERF_CNTBLK_TYPE_UNSUPPORTED(RGX_CNTBLK_ID_SH), |
| #endif |
| |
| /*RGX_CNTBLK_ID_TPU_MCU0*/ |
| #if defined(RGX_FEATURE_PERFBUS) && !defined(RGX_FEATURE_S7_TOP_INFRASTRUCTURE) && defined(RGX_FEATURE_PERFBUS) || defined(__KERNEL__) |
| {RGX_CNTBLK_ID_TPU_MCU0, RGX_CR_TPU_MCU_L0_PERF_INDIRECT, RGX_CR_TPU_MCU_L0_PERF, RGX_CR_TPU_MCU_L0_PERF_SELECT0, RGX_CR_TPU_MCU_L0_PERF_COUNTER_0, 4, RGX_HWPERF_PHANTOM_INDIRECT_BY_DUST, 21, 3, "RGX_CR_TPU_MCU_L0_PERF", rgxfw_hwperf_pow_st_indirect, rgx_hwperf_blk_present_not_s7top }, |
| #else |
| RGXFW_HWPERF_CNTBLK_TYPE_UNSUPPORTED(RGX_CNTBLK_ID_TPU_MCU0), |
| #endif |
| #if defined(RGX_FEATURE_S7_TOP_INFRASTRUCTURE) || defined(__KERNEL__) |
| {RGX_CNTBLK_ID_TPU_MCU0, RGX_CR_TPU_PERF_INDIRECT, RGX_CR_TPU_MCU_L0_PERF, RGX_CR_TPU_MCU_L0_PERF_SELECT0, RGX_CR_TPU_MCU_L0_PERF_COUNTER_0, 4, RGX_HWPERF_PHANTOM_INDIRECT_BY_DUST, 21, 3, "RGX_CR_TPU_MCU_L0_PERF", rgxfw_hwperf_pow_st_indirect, rgx_hwperf_blk_present_s7top }, |
| #else |
| RGXFW_HWPERF_CNTBLK_TYPE_UNSUPPORTED(RGX_CNTBLK_ID_TPU_MCU0), |
| #endif |
| |
| /*RGX_CNTBLK_ID_USC0*/ |
| #if defined(RGX_FEATURE_PERFBUS) || defined(__KERNEL__) |
| {RGX_CNTBLK_ID_USC0, RGX_CR_USC_PERF_INDIRECT, RGX_CR_USC_PERF, RGX_CR_USC_PERF_SELECT0, RGX_CR_USC_PERF_COUNTER_0, 4, RGX_HWPERF_PHANTOM_INDIRECT_BY_CLUSTER, 21, 3, "RGX_CR_USC_PERF", rgxfw_hwperf_pow_st_indirect, rgx_hwperf_blk_present_perfbus }, |
| #else |
| RGXFW_HWPERF_CNTBLK_TYPE_UNSUPPORTED(RGX_CNTBLK_ID_USC0), |
| #endif |
| |
| /*RGX_CNTBLK_ID_TEXAS0*/ |
| #if defined(RGX_FEATURE_S7_TOP_INFRASTRUCTURE) || defined(__KERNEL__) |
| {RGX_CNTBLK_ID_TEXAS0, RGX_CR_TEXAS3_PERF_INDIRECT, RGX_CR_TEXAS_PERF, RGX_CR_TEXAS_PERF_SELECT0, RGX_CR_TEXAS_PERF_COUNTER_0, 6, RGX_HWPERF_PHANTOM_INDIRECT_BY_DUST, 31, 3, "RGX_CR_TEXAS_PERF", rgxfw_hwperf_pow_st_indirect, rgx_hwperf_blk_present_s7top }, |
| #else |
| RGXFW_HWPERF_CNTBLK_TYPE_UNSUPPORTED(RGX_CNTBLK_ID_TEXAS0), |
| #endif |
| #if defined(RGX_FEATURE_XT_TOP_INFRASTRUCTURE) || defined(__KERNEL__) |
| {RGX_CNTBLK_ID_TEXAS0, RGX_CR_TEXAS_PERF_INDIRECT, RGX_CR_TEXAS_PERF, RGX_CR_TEXAS_PERF_SELECT0, RGX_CR_TEXAS_PERF_COUNTER_0, 6, RGX_HWPERF_INDIRECT_BY_PHANTOM, 31, 3, "RGX_CR_TEXAS_PERF", rgxfw_hwperf_pow_st_indirect, rgx_hwperf_blk_present_xttop }, |
| #else |
| RGXFW_HWPERF_CNTBLK_TYPE_UNSUPPORTED(RGX_CNTBLK_ID_TEXAS0), |
| #endif |
| |
| /*RGX_CNTBLK_ID_RASTER0*/ |
| #if defined(RGX_FEATURE_XT_TOP_INFRASTRUCTURE) || defined(__KERNEL__) |
| {RGX_CNTBLK_ID_RASTER0, RGX_CR_RASTERISATION_PERF_INDIRECT, RGX_CR_RASTERISATION_PERF, RGX_CR_RASTERISATION_PERF_SELECT0, RGX_CR_RASTERISATION_PERF_COUNTER_0, 4, RGX_HWPERF_INDIRECT_BY_PHANTOM, 21, 3, "RGX_CR_RASTERISATION_PERF", rgxfw_hwperf_pow_st_indirect, rgx_hwperf_blk_present_xttop }, |
| #else |
| RGXFW_HWPERF_CNTBLK_TYPE_UNSUPPORTED(RGX_CNTBLK_ID_RASTER0), |
| #endif |
| |
| /*RGX_CNTBLK_ID_BLACKPEARL0*/ |
| #if defined(RGX_FEATURE_S7_TOP_INFRASTRUCTURE) || defined(__KERNEL__) |
| {RGX_CNTBLK_ID_BLACKPEARL0, RGX_CR_BLACKPEARL_PERF_INDIRECT, RGX_CR_BLACKPEARL_PERF, RGX_CR_BLACKPEARL_PERF_SELECT0, RGX_CR_BLACKPEARL_PERF_COUNTER_0, 6, RGX_HWPERF_INDIRECT_BY_PHANTOM, 21, 3, "RGX_CR_BLACKPEARL_PERF", rgxfw_hwperf_pow_st_indirect, rgx_hwperf_blk_present_s7top }, |
| #else |
| RGXFW_HWPERF_CNTBLK_TYPE_UNSUPPORTED(RGX_CNTBLK_ID_BLACKPEARL0), |
| #endif |
| |
| /*RGX_CNTBLK_ID_PBE0*/ |
| #if defined(RGX_FEATURE_S7_TOP_INFRASTRUCTURE) || defined(__KERNEL__) |
| {RGX_CNTBLK_ID_PBE0, RGX_CR_PBE_PERF_INDIRECT, RGX_CR_PBE_PERF, RGX_CR_PBE_PERF_SELECT0, RGX_CR_PBE_PERF_COUNTER_0, 4, RGX_HWPERF_PHANTOM_INDIRECT_BY_CLUSTER, 21, 3, "RGX_CR_PBE_PERF", rgxfw_hwperf_pow_st_indirect, rgx_hwperf_blk_present_s7top }, |
| #else |
| RGXFW_HWPERF_CNTBLK_TYPE_UNSUPPORTED(RGX_CNTBLK_ID_PBE0), |
| #endif |
| |
| /*RGX_CNTBLK_ID_BX_TU0*/ |
| #if defined (RGX_FEATURE_RAY_TRACING) || defined(__KERNEL__) |
| {RGX_CNTBLK_ID_BX_TU0, RGX_CR_BX_TU_PERF_INDIRECT, DPX_CR_BX_TU_PERF, DPX_CR_BX_TU_PERF_SELECT0, DPX_CR_BX_TU_PERF_COUNTER_0, 4, RGX_HWPERF_DOPPLER_BX_TU_BLKS, 21, 3, "RGX_CR_BX_TU_PERF", rgxfw_hwperf_pow_st_gandalf, rgx_hwperf_blk_present_raytracing }, |
| #else |
| RGXFW_HWPERF_CNTBLK_TYPE_UNSUPPORTED(RGX_CNTBLK_ID_BX_TU0), |
| #endif |
| }; |
| |
| |
| IMG_INTERNAL IMG_UINT32 |
| RGXGetHWPerfBlockConfig(const RGXFW_HWPERF_CNTBLK_TYPE_MODEL **ppsModel) |
| { |
| *ppsModel = gasCntBlkTypeModel; |
| return IMG_ARR_NUM_ELEMS(gasCntBlkTypeModel); |
| } |
| |
| /****************************************************************************** |
| End of file (rgx_hwperf_table.c) |
| ******************************************************************************/ |