2 * Copyright © 2007-2019 Advanced Micro Devices, Inc.
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:
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.
22 * The above copyright notice and this permission notice (including the
23 * next paragraph) shall be included in all copies or substantial portions
28 ****************************************************************************************************
30 * @brief Contains the R800Lib class definition.
31 ****************************************************************************************************
34 #ifndef __SI_ADDR_LIB_H__
35 #define __SI_ADDR_LIB_H__
38 #include "egbaddrlib.h"
46 ****************************************************************************************************
47 * @brief Describes the information in tile mode table
48 ****************************************************************************************************
58 ****************************************************************************************************
59 * @brief SI specific settings structure.
60 ****************************************************************************************************
64 UINT_32 isSouthernIsland
: 1;
66 UINT_32 isPitCairn
: 1;
67 UINT_32 isCapeVerde
: 1;
68 // Oland/Hainan are of GFXIP 6.0, similar with SI
73 UINT_32 isSeaIsland
: 1;
74 UINT_32 isBonaire
: 1;
76 UINT_32 isSpectre
: 1;
78 UINT_32 isKalindi
: 1;
79 // Hawaii is GFXIP 7.2
83 UINT_32 isVolcanicIslands
: 1;
84 UINT_32 isIceland
: 1;
87 UINT_32 isPolaris10
: 1;
88 UINT_32 isPolaris11
: 1;
89 UINT_32 isPolaris12
: 1;
91 UINT_32 isCarrizo
: 1;
95 ****************************************************************************************************
96 * @brief This class is the SI specific address library
98 ****************************************************************************************************
100 class SiLib
: public EgBasedLib
103 /// Creates SiLib object
104 static Addr::Lib
* CreateObj(const Client
* pClient
)
106 VOID
* pMem
= Object::ClientAlloc(sizeof(SiLib
), pClient
);
107 return (pMem
!= NULL
) ? new (pMem
) SiLib(pClient
) : NULL
;
111 SiLib(const Client
* pClient
);
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;
119 virtual ADDR_E_RETURNCODE
HwlConvertTileInfoToHW(
120 const ADDR_CONVERT_TILEINFOTOHW_INPUT
* pIn
,
121 ADDR_CONVERT_TILEINFOTOHW_OUTPUT
* pOut
) const;
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;
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;
133 virtual ADDR_E_RETURNCODE
HwlGetTileIndex(
134 const ADDR_GET_TILEINDEX_INPUT
* pIn
,
135 ADDR_GET_TILEINDEX_OUTPUT
* pOut
) const;
137 virtual BOOL_32
HwlComputeMipLevel(
138 ADDR_COMPUTE_SURFACE_INFO_INPUT
* pIn
) const;
140 virtual ChipFamily
HwlConvertChipFamily(
141 UINT_32 uChipFamily
, UINT_32 uChipRevision
);
143 virtual BOOL_32
HwlInitGlobalParams(
144 const ADDR_CREATE_INPUT
* pCreateIn
);
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;
150 virtual VOID
HwlComputeTileDataWidthAndHeightLinear(
151 UINT_32
* pMacroWidth
, UINT_32
* pMacroHeight
,
152 UINT_32 bpp
, ADDR_TILEINFO
* pTileInfo
) const;
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;
158 virtual ADDR_E_RETURNCODE
ComputeBankEquation(
159 UINT_32 log2BytesPP
, UINT_32 threshX
, UINT_32 threshY
,
160 ADDR_TILEINFO
* pTileInfo
, ADDR_EQUATION
* pEquation
) const;
162 virtual ADDR_E_RETURNCODE
ComputePipeEquation(
163 UINT_32 log2BytesPP
, UINT_32 threshX
, UINT_32 threshY
,
164 ADDR_TILEINFO
* pTileInfo
, ADDR_EQUATION
* pEquation
) const;
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;
171 virtual UINT_32
HwlGetPipes(const ADDR_TILEINFO
* pTileInfo
) const;
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;
180 /// Dummy function to finalize the inheritance
181 virtual UINT_32
HwlComputeXmaskCoordYFrom8Pipe(
182 UINT_32 pipe
, UINT_32 x
) const;
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;
191 virtual UINT_32
HwlGetPitchAlignmentMicroTiled(
192 AddrTileMode tileMode
, UINT_32 bpp
, ADDR_SURFACE_FLAGS flags
, UINT_32 numSamples
) const;
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;
199 virtual VOID
HwlCheckLastMacroTiledLvl(
200 const ADDR_COMPUTE_SURFACE_INFO_INPUT
* pIn
, ADDR_COMPUTE_SURFACE_INFO_OUTPUT
* pOut
) const;
202 virtual BOOL_32
HwlTileInfoEqual(
203 const ADDR_TILEINFO
* pLeft
, const ADDR_TILEINFO
* pRight
) const;
205 virtual AddrTileMode
HwlDegradeThickTileMode(
206 AddrTileMode baseTileMode
, UINT_32 numSlices
, UINT_32
* pBytesPerTile
) const;
208 virtual VOID
HwlOverrideTileMode(ADDR_COMPUTE_SURFACE_INFO_INPUT
* pInOut
) const;
210 virtual VOID
HwlOptimizeTileMode(ADDR_COMPUTE_SURFACE_INFO_INPUT
* pInOut
) const;
212 virtual VOID
HwlSelectTileMode(ADDR_COMPUTE_SURFACE_INFO_INPUT
* pInOut
) const;
214 /// Overwrite tile setting to PRT
215 virtual VOID
HwlSetPrtTileMode(ADDR_COMPUTE_SURFACE_INFO_INPUT
* pInOut
) const;
217 virtual BOOL_32
HwlSanityCheckMacroTiled(
218 ADDR_TILEINFO
* pTileInfo
) const
223 virtual UINT_32
HwlGetPitchAlignmentLinear(UINT_32 bpp
, ADDR_SURFACE_FLAGS flags
) const;
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;
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
,
235 ADDR_TILEINFO
* pTileInfo
) const;
237 virtual UINT_32
HwlPreAdjustBank(
238 UINT_32 tileX
, UINT_32 bank
, ADDR_TILEINFO
* pTileInfo
) const;
240 virtual INT_32
HwlPostCheckTileIndex(
241 const ADDR_TILEINFO
* pInfo
, AddrTileMode mode
, AddrTileType type
,
242 INT curIndex
= TileIndexInvalid
) const;
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;
250 virtual VOID
HwlFmaskPostThunkSurfInfo(
251 const ADDR_COMPUTE_SURFACE_INFO_OUTPUT
* pSurfOut
,
252 ADDR_COMPUTE_FMASK_INFO_OUTPUT
* pFmaskOut
) const;
254 virtual UINT_32
HwlComputeFmaskBits(
255 const ADDR_COMPUTE_FMASK_INFO_INPUT
* pIn
,
256 UINT_32
* pNumSamples
) const;
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
266 virtual UINT_32
HwlComputeMaxBaseAlignments() const;
268 virtual UINT_32
HwlComputeMaxMetaBaseAlignments() const;
270 virtual VOID
HwlComputeSurfaceAlignmentsMacroTiled(
271 AddrTileMode tileMode
, UINT_32 bpp
, ADDR_SURFACE_FLAGS flags
,
272 UINT_32 mipLevel
, UINT_32 numSamples
, ADDR_COMPUTE_SURFACE_INFO_OUTPUT
* pOut
) const;
274 // Get equation table pointer and number of equations
275 virtual UINT_32
HwlGetEquationTableInfo(const ADDR_EQUATION
** ppEquationTable
) const
277 *ppEquationTable
= m_equationTable
;
279 return m_numEquations
;
282 // Check if it is supported for given bpp and tile config to generate an equation
283 BOOL_32
IsEquationSupported(
284 UINT_32 bpp
, TileConfig tileConfig
, INT_32 tileIndex
, UINT_32 elementBytesLog2
) const;
286 // Protected non-virtual functions
287 VOID
ComputeTileCoordFromPipeAndElemIdx(
288 UINT_32 elemIdx
, UINT_32 pipe
, AddrPipeCfg pipeCfg
, UINT_32 pitchInMacroTile
,
289 UINT_32 x
, UINT_32 y
, UINT_32
* pX
, UINT_32
* pY
) const;
291 UINT_32
TileCoordToMaskElementIndex(
292 UINT_32 tx
, UINT_32 ty
, AddrPipeCfg pipeConfig
,
293 UINT_32
*macroShift
, UINT_32
*elemIdxBits
) const;
295 BOOL_32
DecodeGbRegs(
296 const ADDR_REGISTER_VALUE
* pRegValue
);
298 const TileConfig
* GetTileSetting(
299 UINT_32 index
) const;
301 // Initialize equation table
302 VOID
InitEquationTable();
304 UINT_32
GetPipePerSurf(AddrPipeCfg pipeConfig
) const;
306 static const UINT_32 TileTableSize
= 32;
307 TileConfig m_tileTable
[TileTableSize
];
308 UINT_32 m_noOfEntries
;
310 // Max number of bpp (8bpp/16bpp/32bpp/64bpp/128bpp)
311 static const UINT_32 MaxNumElementBytes
= 5;
313 static const BOOL_32 m_EquationSupport
[TileTableSize
][MaxNumElementBytes
];
315 // Prt tile mode index mask
316 static const UINT_32 SiPrtTileIndexMask
= ((1 << 3) | (1 << 5) | (1 << 6) | (1 << 7) |
317 (1 << 21) | (1 << 22) | (1 << 23) | (1 << 24) |
318 (1 << 25) | (1 << 30));
320 // More than half slots in tile mode table can't support equation
321 static const UINT_32 EquationTableSize
= (MaxNumElementBytes
* TileTableSize
) / 2;
323 ADDR_EQUATION m_equationTable
[EquationTableSize
];
324 UINT_32 m_numMacroBits
[EquationTableSize
];
325 UINT_32 m_blockWidth
[EquationTableSize
];
326 UINT_32 m_blockHeight
[EquationTableSize
];
327 UINT_32 m_blockSlices
[EquationTableSize
];
328 // Number of equation entries in the table
329 UINT_32 m_numEquations
;
330 // Equation lookup table according to bpp and tile index
331 UINT_32 m_equationLookupTable
[MaxNumElementBytes
][TileTableSize
];
333 UINT_32 m_uncompressDepthEqIndex
;
335 SiChipSettings m_settings
;
339 VOID
ReadGbTileMode(UINT_32 regValue
, TileConfig
* pCfg
) const;
340 BOOL_32
InitTileSettingTable(const UINT_32
*pSetting
, UINT_32 noOfEntries
);