1 /* 2 * Copyright © 2014 Advanced Micro Devices, Inc. 3 * All Rights Reserved. 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining 6 * a copy of this software and associated documentation files (the 7 * "Software"), to deal in the Software without restriction, including 8 * without limitation the rights to use, copy, modify, merge, publish, 9 * distribute, sub license, and/or sell copies of the Software, and to 10 * permit persons to whom the Software is furnished to do so, subject to 11 * the following conditions: 12 * 13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 14 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 15 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 16 * NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS, AUTHORS 17 * AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 20 * USE OR OTHER DEALINGS IN THE SOFTWARE. 21 * 22 * The above copyright notice and this permission notice (including the 23 * next paragraph) shall be included in all copies or substantial portions 24 * of the Software. 25 */ 26 27 /** 28 **************************************************************************************************** 29 * @file siaddrlib.h 30 * @brief Contains the R800Lib class definition. 31 **************************************************************************************************** 32 */ 33 34 #ifndef __SI_ADDR_LIB_H__ 35 #define __SI_ADDR_LIB_H__ 36 37 #include "addrlib1.h" 38 #include "egbaddrlib.h" 39 40 namespace Addr 41 { 42 namespace V1 43 { 44 45 /** 46 **************************************************************************************************** 47 * @brief Describes the information in tile mode table 48 **************************************************************************************************** 49 */ 50 struct TileConfig 51 { 52 AddrTileMode mode; 53 AddrTileType type; 54 ADDR_TILEINFO info; 55 }; 56 57 /** 58 **************************************************************************************************** 59 * @brief SI specific settings structure. 60 **************************************************************************************************** 61 */ 62 struct SiChipSettings 63 { 64 UINT_32 isSouthernIsland : 1; 65 UINT_32 isTahiti : 1; 66 UINT_32 isPitCairn : 1; 67 UINT_32 isCapeVerde : 1; 68 // Oland/Hainan are of GFXIP 6.0, similar with SI 69 UINT_32 isOland : 1; 70 UINT_32 isHainan : 1; 71 72 // CI 73 UINT_32 isSeaIsland : 1; 74 UINT_32 isBonaire : 1; 75 UINT_32 isKaveri : 1; 76 UINT_32 isSpectre : 1; 77 UINT_32 isSpooky : 1; 78 UINT_32 isKalindi : 1; 79 // Hawaii is GFXIP 7.2 80 UINT_32 isHawaii : 1; 81 82 // VI 83 UINT_32 isVolcanicIslands : 1; 84 UINT_32 isIceland : 1; 85 UINT_32 isTonga : 1; 86 UINT_32 isFiji : 1; 87 UINT_32 isPolaris10 : 1; 88 UINT_32 isPolaris11 : 1; 89 UINT_32 isPolaris12 : 1; 90 // VI fusion 91 UINT_32 isCarrizo : 1; 92 }; 93 94 /** 95 **************************************************************************************************** 96 * @brief This class is the SI specific address library 97 * function set. 98 **************************************************************************************************** 99 */ 100 class SiLib : public EgBasedLib 101 { 102 public: 103 /// Creates SiLib object CreateObj(const Client * pClient)104 static Addr::Lib* CreateObj(const Client* pClient) 105 { 106 VOID* pMem = Object::ClientAlloc(sizeof(SiLib), pClient); 107 return (pMem != NULL) ? new (pMem) SiLib(pClient) : NULL; 108 } 109 110 protected: 111 SiLib(const Client* pClient); 112 virtual ~SiLib(); 113 114 // Hwl interface - defined in AddrLib1 115 virtual ADDR_E_RETURNCODE HwlComputeSurfaceInfo( 116 const ADDR_COMPUTE_SURFACE_INFO_INPUT* pIn, 117 ADDR_COMPUTE_SURFACE_INFO_OUTPUT* pOut) const; 118 119 virtual ADDR_E_RETURNCODE HwlConvertTileInfoToHW( 120 const ADDR_CONVERT_TILEINFOTOHW_INPUT* pIn, 121 ADDR_CONVERT_TILEINFOTOHW_OUTPUT* pOut) const; 122 123 virtual UINT_64 HwlComputeXmaskAddrFromCoord( 124 UINT_32 pitch, UINT_32 height, UINT_32 x, UINT_32 y, UINT_32 slice, UINT_32 numSlices, 125 UINT_32 factor, BOOL_32 isLinear, BOOL_32 isWidth8, BOOL_32 isHeight8, 126 ADDR_TILEINFO* pTileInfo, UINT_32* pBitPosition) const; 127 128 virtual VOID HwlComputeXmaskCoordFromAddr( 129 UINT_64 addr, UINT_32 bitPosition, UINT_32 pitch, UINT_32 height, UINT_32 numSlices, 130 UINT_32 factor, BOOL_32 isLinear, BOOL_32 isWidth8, BOOL_32 isHeight8, 131 ADDR_TILEINFO* pTileInfo, UINT_32* pX, UINT_32* pY, UINT_32* pSlice) const; 132 133 virtual ADDR_E_RETURNCODE HwlGetTileIndex( 134 const ADDR_GET_TILEINDEX_INPUT* pIn, 135 ADDR_GET_TILEINDEX_OUTPUT* pOut) const; 136 137 virtual BOOL_32 HwlComputeMipLevel( 138 ADDR_COMPUTE_SURFACE_INFO_INPUT* pIn) const; 139 140 virtual ChipFamily HwlConvertChipFamily( 141 UINT_32 uChipFamily, UINT_32 uChipRevision); 142 143 virtual BOOL_32 HwlInitGlobalParams( 144 const ADDR_CREATE_INPUT* pCreateIn); 145 146 virtual ADDR_E_RETURNCODE HwlSetupTileCfg( 147 UINT_32 bpp, INT_32 index, INT_32 macroModeIndex, 148 ADDR_TILEINFO* pInfo, AddrTileMode* pMode = 0, AddrTileType* pType = 0) const; 149 150 virtual VOID HwlComputeTileDataWidthAndHeightLinear( 151 UINT_32* pMacroWidth, UINT_32* pMacroHeight, 152 UINT_32 bpp, ADDR_TILEINFO* pTileInfo) const; 153 154 virtual UINT_64 HwlComputeHtileBytes( 155 UINT_32 pitch, UINT_32 height, UINT_32 bpp, 156 BOOL_32 isLinear, UINT_32 numSlices, UINT_64* pSliceBytes, UINT_32 baseAlign) const; 157 158 virtual ADDR_E_RETURNCODE ComputeBankEquation( 159 UINT_32 log2BytesPP, UINT_32 threshX, UINT_32 threshY, 160 ADDR_TILEINFO* pTileInfo, ADDR_EQUATION* pEquation) const; 161 162 virtual ADDR_E_RETURNCODE ComputePipeEquation( 163 UINT_32 log2BytesPP, UINT_32 threshX, UINT_32 threshY, 164 ADDR_TILEINFO* pTileInfo, ADDR_EQUATION* pEquation) const; 165 166 virtual UINT_32 ComputePipeFromCoord( 167 UINT_32 x, UINT_32 y, UINT_32 slice, 168 AddrTileMode tileMode, UINT_32 pipeSwizzle, BOOL_32 ignoreSE, 169 ADDR_TILEINFO* pTileInfo) const; 170 171 virtual UINT_32 HwlGetPipes(const ADDR_TILEINFO* pTileInfo) const; 172 173 /// Pre-handler of 3x pitch (96 bit) adjustment 174 virtual UINT_32 HwlPreHandleBaseLvl3xPitch( 175 const ADDR_COMPUTE_SURFACE_INFO_INPUT* pIn, UINT_32 expPitch) const; 176 /// Post-handler of 3x pitch adjustment 177 virtual UINT_32 HwlPostHandleBaseLvl3xPitch( 178 const ADDR_COMPUTE_SURFACE_INFO_INPUT* pIn, UINT_32 expPitch) const; 179 180 /// Dummy function to finalize the inheritance 181 virtual UINT_32 HwlComputeXmaskCoordYFrom8Pipe( 182 UINT_32 pipe, UINT_32 x) const; 183 184 // Sub-hwl interface - defined in EgBasedLib 185 virtual VOID HwlSetupTileInfo( 186 AddrTileMode tileMode, ADDR_SURFACE_FLAGS flags, 187 UINT_32 bpp, UINT_32 pitch, UINT_32 height, UINT_32 numSamples, 188 ADDR_TILEINFO* inputTileInfo, ADDR_TILEINFO* outputTileInfo, 189 AddrTileType inTileType, ADDR_COMPUTE_SURFACE_INFO_OUTPUT* pOut) const; 190 191 virtual UINT_32 HwlGetPitchAlignmentMicroTiled( 192 AddrTileMode tileMode, UINT_32 bpp, ADDR_SURFACE_FLAGS flags, UINT_32 numSamples) const; 193 194 virtual UINT_64 HwlGetSizeAdjustmentMicroTiled( 195 UINT_32 thickness, UINT_32 bpp, ADDR_SURFACE_FLAGS flags, UINT_32 numSamples, 196 UINT_32 baseAlign, UINT_32 pitchAlign, 197 UINT_32 *pPitch, UINT_32 *pHeight) const; 198 199 virtual VOID HwlCheckLastMacroTiledLvl( 200 const ADDR_COMPUTE_SURFACE_INFO_INPUT* pIn, ADDR_COMPUTE_SURFACE_INFO_OUTPUT* pOut) const; 201 202 virtual BOOL_32 HwlTileInfoEqual( 203 const ADDR_TILEINFO* pLeft, const ADDR_TILEINFO* pRight) const; 204 205 virtual AddrTileMode HwlDegradeThickTileMode( 206 AddrTileMode baseTileMode, UINT_32 numSlices, UINT_32* pBytesPerTile) const; 207 208 virtual VOID HwlOverrideTileMode(ADDR_COMPUTE_SURFACE_INFO_INPUT* pInOut) const; 209 210 virtual VOID HwlOptimizeTileMode(ADDR_COMPUTE_SURFACE_INFO_INPUT* pInOut) const; 211 212 virtual VOID HwlSelectTileMode(ADDR_COMPUTE_SURFACE_INFO_INPUT* pInOut) const; 213 214 /// Overwrite tile setting to PRT 215 virtual VOID HwlSetPrtTileMode(ADDR_COMPUTE_SURFACE_INFO_INPUT* pInOut) const; 216 HwlSanityCheckMacroTiled(ADDR_TILEINFO * pTileInfo)217 virtual BOOL_32 HwlSanityCheckMacroTiled( 218 ADDR_TILEINFO* pTileInfo) const 219 { 220 return TRUE; 221 } 222 223 virtual UINT_32 HwlGetPitchAlignmentLinear(UINT_32 bpp, ADDR_SURFACE_FLAGS flags) const; 224 225 virtual UINT_64 HwlGetSizeAdjustmentLinear( 226 AddrTileMode tileMode, 227 UINT_32 bpp, UINT_32 numSamples, UINT_32 baseAlign, UINT_32 pitchAlign, 228 UINT_32 *pPitch, UINT_32 *pHeight, UINT_32 *pHeightAlign) const; 229 230 virtual VOID HwlComputeSurfaceCoord2DFromBankPipe( 231 AddrTileMode tileMode, UINT_32* pX, UINT_32* pY, UINT_32 slice, 232 UINT_32 bank, UINT_32 pipe, 233 UINT_32 bankSwizzle, UINT_32 pipeSwizzle, UINT_32 tileSlices, 234 BOOL_32 ignoreSE, 235 ADDR_TILEINFO* pTileInfo) const; 236 237 virtual UINT_32 HwlPreAdjustBank( 238 UINT_32 tileX, UINT_32 bank, ADDR_TILEINFO* pTileInfo) const; 239 240 virtual INT_32 HwlPostCheckTileIndex( 241 const ADDR_TILEINFO* pInfo, AddrTileMode mode, AddrTileType type, 242 INT curIndex = TileIndexInvalid) const; 243 244 virtual VOID HwlFmaskPreThunkSurfInfo( 245 const ADDR_COMPUTE_FMASK_INFO_INPUT* pFmaskIn, 246 const ADDR_COMPUTE_FMASK_INFO_OUTPUT* pFmaskOut, 247 ADDR_COMPUTE_SURFACE_INFO_INPUT* pSurfIn, 248 ADDR_COMPUTE_SURFACE_INFO_OUTPUT* pSurfOut) const; 249 250 virtual VOID HwlFmaskPostThunkSurfInfo( 251 const ADDR_COMPUTE_SURFACE_INFO_OUTPUT* pSurfOut, 252 ADDR_COMPUTE_FMASK_INFO_OUTPUT* pFmaskOut) const; 253 254 virtual UINT_32 HwlComputeFmaskBits( 255 const ADDR_COMPUTE_FMASK_INFO_INPUT* pIn, 256 UINT_32* pNumSamples) const; 257 HwlReduceBankWidthHeight(UINT_32 tileSize,UINT_32 bpp,ADDR_SURFACE_FLAGS flags,UINT_32 numSamples,UINT_32 bankHeightAlign,UINT_32 pipes,ADDR_TILEINFO * pTileInfo)258 virtual BOOL_32 HwlReduceBankWidthHeight( 259 UINT_32 tileSize, UINT_32 bpp, ADDR_SURFACE_FLAGS flags, UINT_32 numSamples, 260 UINT_32 bankHeightAlign, UINT_32 pipes, 261 ADDR_TILEINFO* pTileInfo) const 262 { 263 return TRUE; 264 } 265 266 virtual ADDR_E_RETURNCODE HwlGetMaxAlignments(ADDR_GET_MAX_ALIGNMENTS_OUTPUT* pOut) const; 267 268 virtual VOID HwlComputeSurfaceAlignmentsMacroTiled( 269 AddrTileMode tileMode, UINT_32 bpp, ADDR_SURFACE_FLAGS flags, 270 UINT_32 mipLevel, UINT_32 numSamples, ADDR_COMPUTE_SURFACE_INFO_OUTPUT* pOut) const; 271 272 // Get equation table pointer and number of equations HwlGetEquationTableInfo(const ADDR_EQUATION ** ppEquationTable)273 virtual UINT_32 HwlGetEquationTableInfo(const ADDR_EQUATION** ppEquationTable) const 274 { 275 *ppEquationTable = m_equationTable; 276 277 return m_numEquations; 278 } 279 280 // Check if it is supported for given bpp and tile config to generate an equation 281 BOOL_32 IsEquationSupported( 282 UINT_32 bpp, TileConfig tileConfig, INT_32 tileIndex, UINT_32 elementBytesLog2) const; 283 284 // Protected non-virtual functions 285 VOID ComputeTileCoordFromPipeAndElemIdx( 286 UINT_32 elemIdx, UINT_32 pipe, AddrPipeCfg pipeCfg, UINT_32 pitchInMacroTile, 287 UINT_32 x, UINT_32 y, UINT_32* pX, UINT_32* pY) const; 288 289 UINT_32 TileCoordToMaskElementIndex( 290 UINT_32 tx, UINT_32 ty, AddrPipeCfg pipeConfig, 291 UINT_32 *macroShift, UINT_32 *elemIdxBits) const; 292 293 BOOL_32 DecodeGbRegs( 294 const ADDR_REGISTER_VALUE* pRegValue); 295 296 const TileConfig* GetTileSetting( 297 UINT_32 index) const; 298 299 // Initialize equation table 300 VOID InitEquationTable(); 301 302 UINT_32 GetPipePerSurf(AddrPipeCfg pipeConfig) const; 303 304 static const UINT_32 TileTableSize = 32; 305 TileConfig m_tileTable[TileTableSize]; 306 UINT_32 m_noOfEntries; 307 308 // Max number of bpp (8bpp/16bpp/32bpp/64bpp/128bpp) 309 static const UINT_32 MaxNumElementBytes = 5; 310 311 static const BOOL_32 m_EquationSupport[TileTableSize][MaxNumElementBytes]; 312 313 // Prt tile mode index mask 314 static const UINT_32 SiPrtTileIndexMask = ((1 << 3) | (1 << 5) | (1 << 6) | (1 << 7) | 315 (1 << 21) | (1 << 22) | (1 << 23) | (1 << 24) | 316 (1 << 25) | (1 << 30)); 317 318 // More than half slots in tile mode table can't support equation 319 static const UINT_32 EquationTableSize = (MaxNumElementBytes * TileTableSize) / 2; 320 // Equation table 321 ADDR_EQUATION m_equationTable[EquationTableSize]; 322 UINT_32 m_numMacroBits[EquationTableSize]; 323 UINT_32 m_blockWidth[EquationTableSize]; 324 UINT_32 m_blockHeight[EquationTableSize]; 325 UINT_32 m_blockSlices[EquationTableSize]; 326 // Number of equation entries in the table 327 UINT_32 m_numEquations; 328 // Equation lookup table according to bpp and tile index 329 UINT_32 m_equationLookupTable[MaxNumElementBytes][TileTableSize]; 330 331 UINT_32 m_uncompressDepthEqIndex; 332 333 SiChipSettings m_settings; 334 335 private: 336 337 VOID ReadGbTileMode(UINT_32 regValue, TileConfig* pCfg) const; 338 BOOL_32 InitTileSettingTable(const UINT_32 *pSetting, UINT_32 noOfEntries); 339 }; 340 341 } // V1 342 } // Addr 343 344 #endif 345 346