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 R800AddrLib class definition. 31 *************************************************************************************************** 32 */ 33 34 #ifndef __SI_ADDR_LIB_H__ 35 #define __SI_ADDR_LIB_H__ 36 37 #include "addrlib.h" 38 #include "egbaddrlib.h" 39 40 /** 41 *************************************************************************************************** 42 * @brief Describes the information in tile mode table 43 *************************************************************************************************** 44 */ 45 struct ADDR_TILECONFIG 46 { 47 AddrTileMode mode; 48 AddrTileType type; 49 ADDR_TILEINFO info; 50 }; 51 52 /** 53 *************************************************************************************************** 54 * @brief SI specific settings structure. 55 *************************************************************************************************** 56 */ 57 struct SIChipSettings 58 { 59 struct 60 { 61 UINT_32 isSouthernIsland : 1; 62 UINT_32 isTahiti : 1; 63 UINT_32 isPitCairn : 1; 64 UINT_32 isCapeVerde : 1; 65 /// Oland/Hainan are of GFXIP 6.0, similar with SI 66 UINT_32 isOland : 1; 67 UINT_32 isHainan : 1; 68 }; 69 }; 70 71 /** 72 *************************************************************************************************** 73 * @brief This class is the SI specific address library 74 * function set. 75 *************************************************************************************************** 76 */ 77 class SIAddrLib : public EgBasedAddrLib 78 { 79 public: 80 /// Creates SIAddrLib object CreateObj(const AddrClient * pClient)81 static AddrLib* CreateObj(const AddrClient* pClient) 82 { 83 return new(pClient) SIAddrLib(pClient); 84 } 85 86 protected: 87 SIAddrLib(const AddrClient* pClient); 88 virtual ~SIAddrLib(); 89 90 // Hwl interface - defined in AddrLib 91 virtual ADDR_E_RETURNCODE HwlComputeSurfaceInfo( 92 const ADDR_COMPUTE_SURFACE_INFO_INPUT* pIn, 93 ADDR_COMPUTE_SURFACE_INFO_OUTPUT* pOut) const; 94 95 virtual ADDR_E_RETURNCODE HwlConvertTileInfoToHW( 96 const ADDR_CONVERT_TILEINFOTOHW_INPUT* pIn, 97 ADDR_CONVERT_TILEINFOTOHW_OUTPUT* pOut) const; 98 99 virtual UINT_64 HwlComputeXmaskAddrFromCoord( 100 UINT_32 pitch, UINT_32 height, UINT_32 x, UINT_32 y, UINT_32 slice, UINT_32 numSlices, 101 UINT_32 factor, BOOL_32 isLinear, BOOL_32 isWidth8, BOOL_32 isHeight8, 102 ADDR_TILEINFO* pTileInfo, UINT_32* pBitPosition) const; 103 104 virtual VOID HwlComputeXmaskCoordFromAddr( 105 UINT_64 addr, UINT_32 bitPosition, UINT_32 pitch, UINT_32 height, UINT_32 numSlices, 106 UINT_32 factor, BOOL_32 isLinear, BOOL_32 isWidth8, BOOL_32 isHeight8, 107 ADDR_TILEINFO* pTileInfo, UINT_32* pX, UINT_32* pY, UINT_32* pSlice) const; 108 109 virtual ADDR_E_RETURNCODE HwlGetTileIndex( 110 const ADDR_GET_TILEINDEX_INPUT* pIn, 111 ADDR_GET_TILEINDEX_OUTPUT* pOut) const; 112 113 virtual BOOL_32 HwlComputeMipLevel( 114 ADDR_COMPUTE_SURFACE_INFO_INPUT* pIn) const; 115 116 virtual AddrChipFamily HwlConvertChipFamily( 117 UINT_32 uChipFamily, UINT_32 uChipRevision); 118 119 virtual BOOL_32 HwlInitGlobalParams( 120 const ADDR_CREATE_INPUT* pCreateIn); 121 122 virtual ADDR_E_RETURNCODE HwlSetupTileCfg( 123 INT_32 index, INT_32 macroModeIndex, 124 ADDR_TILEINFO* pInfo, AddrTileMode* pMode = 0, AddrTileType* pType = 0) const; 125 126 virtual VOID HwlComputeTileDataWidthAndHeightLinear( 127 UINT_32* pMacroWidth, UINT_32* pMacroHeight, 128 UINT_32 bpp, ADDR_TILEINFO* pTileInfo) const; 129 130 virtual UINT_64 HwlComputeHtileBytes( 131 UINT_32 pitch, UINT_32 height, UINT_32 bpp, 132 BOOL_32 isLinear, UINT_32 numSlices, UINT_64* pSliceBytes, UINT_32 baseAlign) const; 133 134 virtual UINT_32 ComputePipeFromCoord( 135 UINT_32 x, UINT_32 y, UINT_32 slice, 136 AddrTileMode tileMode, UINT_32 pipeSwizzle, BOOL_32 ignoreSE, 137 ADDR_TILEINFO* pTileInfo) const; 138 139 virtual UINT_32 HwlGetPipes(const ADDR_TILEINFO* pTileInfo) const; 140 141 /// Pre-handler of 3x pitch (96 bit) adjustment 142 virtual UINT_32 HwlPreHandleBaseLvl3xPitch( 143 const ADDR_COMPUTE_SURFACE_INFO_INPUT* pIn, UINT_32 expPitch) const; 144 /// Post-handler of 3x pitch adjustment 145 virtual UINT_32 HwlPostHandleBaseLvl3xPitch( 146 const ADDR_COMPUTE_SURFACE_INFO_INPUT* pIn, UINT_32 expPitch) const; 147 148 /// Dummy function to finalize the inheritance 149 virtual UINT_32 HwlComputeXmaskCoordYFrom8Pipe( 150 UINT_32 pipe, UINT_32 x) const; 151 152 // Sub-hwl interface - defined in EgBasedAddrLib 153 virtual VOID HwlSetupTileInfo( 154 AddrTileMode tileMode, ADDR_SURFACE_FLAGS flags, 155 UINT_32 bpp, UINT_32 pitch, UINT_32 height, UINT_32 numSamples, 156 ADDR_TILEINFO* inputTileInfo, ADDR_TILEINFO* outputTileInfo, 157 AddrTileType inTileType, ADDR_COMPUTE_SURFACE_INFO_OUTPUT* pOut) const; 158 159 virtual UINT_32 HwlGetPitchAlignmentMicroTiled( 160 AddrTileMode tileMode, UINT_32 bpp, ADDR_SURFACE_FLAGS flags, UINT_32 numSamples) const; 161 162 virtual UINT_64 HwlGetSizeAdjustmentMicroTiled( 163 UINT_32 thickness, UINT_32 bpp, ADDR_SURFACE_FLAGS flags, UINT_32 numSamples, 164 UINT_32 baseAlign, UINT_32 pitchAlign, 165 UINT_32 *pPitch, UINT_32 *pHeight) const; 166 167 virtual VOID HwlCheckLastMacroTiledLvl( 168 const ADDR_COMPUTE_SURFACE_INFO_INPUT* pIn, ADDR_COMPUTE_SURFACE_INFO_OUTPUT* pOut) const; 169 170 virtual BOOL_32 HwlTileInfoEqual( 171 const ADDR_TILEINFO* pLeft, const ADDR_TILEINFO* pRight) const; 172 173 virtual AddrTileMode HwlDegradeThickTileMode( 174 AddrTileMode baseTileMode, UINT_32 numSlices, UINT_32* pBytesPerTile) const; 175 176 virtual BOOL_32 HwlOverrideTileMode( 177 const ADDR_COMPUTE_SURFACE_INFO_INPUT* pIn, 178 AddrTileMode* pTileMode, 179 AddrTileType* pTileType) const; 180 HwlSanityCheckMacroTiled(ADDR_TILEINFO * pTileInfo)181 virtual BOOL_32 HwlSanityCheckMacroTiled( 182 ADDR_TILEINFO* pTileInfo) const 183 { 184 return TRUE; 185 } 186 187 virtual UINT_32 HwlGetPitchAlignmentLinear(UINT_32 bpp, ADDR_SURFACE_FLAGS flags) const; 188 189 virtual UINT_64 HwlGetSizeAdjustmentLinear( 190 AddrTileMode tileMode, 191 UINT_32 bpp, UINT_32 numSamples, UINT_32 baseAlign, UINT_32 pitchAlign, 192 UINT_32 *pPitch, UINT_32 *pHeight, UINT_32 *pHeightAlign) const; 193 194 virtual VOID HwlComputeSurfaceCoord2DFromBankPipe( 195 AddrTileMode tileMode, UINT_32* pX, UINT_32* pY, UINT_32 slice, 196 UINT_32 bank, UINT_32 pipe, 197 UINT_32 bankSwizzle, UINT_32 pipeSwizzle, UINT_32 tileSlices, 198 BOOL_32 ignoreSE, 199 ADDR_TILEINFO* pTileInfo) const; 200 201 virtual UINT_32 HwlPreAdjustBank( 202 UINT_32 tileX, UINT_32 bank, ADDR_TILEINFO* pTileInfo) const; 203 204 virtual INT_32 HwlPostCheckTileIndex( 205 const ADDR_TILEINFO* pInfo, AddrTileMode mode, AddrTileType type, 206 INT curIndex = TileIndexInvalid) const; 207 208 virtual VOID HwlFmaskPreThunkSurfInfo( 209 const ADDR_COMPUTE_FMASK_INFO_INPUT* pFmaskIn, 210 const ADDR_COMPUTE_FMASK_INFO_OUTPUT* pFmaskOut, 211 ADDR_COMPUTE_SURFACE_INFO_INPUT* pSurfIn, 212 ADDR_COMPUTE_SURFACE_INFO_OUTPUT* pSurfOut) const; 213 214 virtual VOID HwlFmaskPostThunkSurfInfo( 215 const ADDR_COMPUTE_SURFACE_INFO_OUTPUT* pSurfOut, 216 ADDR_COMPUTE_FMASK_INFO_OUTPUT* pFmaskOut) const; 217 218 virtual UINT_32 HwlComputeFmaskBits( 219 const ADDR_COMPUTE_FMASK_INFO_INPUT* pIn, 220 UINT_32* pNumSamples) const; 221 HwlReduceBankWidthHeight(UINT_32 tileSize,UINT_32 bpp,ADDR_SURFACE_FLAGS flags,UINT_32 numSamples,UINT_32 bankHeightAlign,UINT_32 pipes,ADDR_TILEINFO * pTileInfo)222 virtual BOOL_32 HwlReduceBankWidthHeight( 223 UINT_32 tileSize, UINT_32 bpp, ADDR_SURFACE_FLAGS flags, UINT_32 numSamples, 224 UINT_32 bankHeightAlign, UINT_32 pipes, 225 ADDR_TILEINFO* pTileInfo) const 226 { 227 return TRUE; 228 } 229 230 // Protected non-virtual functions 231 VOID ComputeTileCoordFromPipeAndElemIdx( 232 UINT_32 elemIdx, UINT_32 pipe, AddrPipeCfg pipeCfg, UINT_32 pitchInMacroTile, 233 UINT_32 x, UINT_32 y, UINT_32* pX, UINT_32* pY) const; 234 235 UINT_32 TileCoordToMaskElementIndex( 236 UINT_32 tx, UINT_32 ty, AddrPipeCfg pipeConfig, 237 UINT_32 *macroShift, UINT_32 *elemIdxBits) const; 238 239 BOOL_32 DecodeGbRegs( 240 const ADDR_REGISTER_VALUE* pRegValue); 241 242 const ADDR_TILECONFIG* GetTileSetting( 243 UINT_32 index) const; 244 245 static const UINT_32 TileTableSize = 32; 246 ADDR_TILECONFIG m_tileTable[TileTableSize]; 247 UINT_32 m_noOfEntries; 248 249 private: 250 251 UINT_32 GetPipePerSurf(AddrPipeCfg pipeConfig) const; 252 253 VOID ReadGbTileMode( 254 UINT_32 regValue, ADDR_TILECONFIG* pCfg) const; 255 BOOL_32 InitTileSettingTable( 256 const UINT_32 *pSetting, UINT_32 noOfEntries); 257 258 SIChipSettings m_settings; 259 }; 260 261 #endif 262 263