• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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