Home | History | Annotate | Download | only in r800
      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
    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 
    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 
    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
    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