amdgpu/addrlib: Add GetMaxAlignments
authorXavi Zhang <xavi.zhang@amd.com>
Wed, 20 Aug 2014 08:46:51 +0000 (04:46 -0400)
committerMarek Olšák <marek.olsak@amd.com>
Thu, 30 Mar 2017 12:44:33 +0000 (14:44 +0200)
src/amd/addrlib/addrinterface.cpp
src/amd/addrlib/addrinterface.h
src/amd/addrlib/core/addrlib.cpp
src/amd/addrlib/core/addrlib.h
src/amd/addrlib/r800/ciaddrlib.cpp
src/amd/addrlib/r800/ciaddrlib.h
src/amd/addrlib/r800/siaddrlib.cpp
src/amd/addrlib/r800/siaddrlib.h

index 65569278b1e015b8f4119243355553dce14775a5..b2120c644bf49c59f1064813ad5d7020dad2d7f7 100644 (file)
@@ -1006,3 +1006,33 @@ ADDR_E_RETURNCODE ADDR_API AddrComputePrtInfo(
     return returnCode;
 }
 
+/**
+***************************************************************************************************
+*   AddrGetMaxAlignments
+*
+*   @brief
+*       Convert maximum alignments
+*
+*   @return
+*       ADDR_OK if successful, otherwise an error code of ADDR_E_RETURNCODE
+***************************************************************************************************
+*/
+ADDR_E_RETURNCODE ADDR_API AddrGetMaxAlignments(
+    ADDR_HANDLE                     hLib, ///< [in] address lib handle
+    ADDR_GET_MAX_ALINGMENTS_OUTPUT* pOut) ///< [out] output structure
+{
+    AddrLib* pLib = AddrLib::GetAddrLib(hLib);
+
+    ADDR_E_RETURNCODE returnCode = ADDR_OK;
+
+    if (pLib != NULL)
+    {
+        returnCode = pLib->GetMaxAlignments(pOut);
+    }
+    else
+    {
+        returnCode = ADDR_ERROR;
+    }
+
+    return returnCode;
+}
index a50717c1cebdffb31acdfc4fd3a0d60871afb9c0..764377a4b479b476ddac649886c622e46f3904b6 100644 (file)
@@ -2145,6 +2145,32 @@ ADDR_E_RETURNCODE ADDR_API AddrComputeDccInfo(
     const ADDR_COMPUTE_DCCINFO_INPUT*       pIn,
     ADDR_COMPUTE_DCCINFO_OUTPUT*            pOut);
 
+/**
+***************************************************************************************************
+*   ADDR_GET_MAX_ALINGMENTS_OUTPUT
+*
+*   @brief
+*       Output structure of AddrGetMaxAlignments
+***************************************************************************************************
+*/
+typedef struct _ADDR_GET_MAX_ALINGMENTS_OUTPUT
+{
+    UINT_32 size;                   ///< Size of this structure in bytes
+    UINT_64 baseAlign;              ///< Maximum base alignment in bytes
+} ADDR_GET_MAX_ALINGMENTS_OUTPUT;
+
+/**
+***************************************************************************************************
+*   AddrGetMaxAlignments
+*
+*   @brief
+*       Gets maximnum alignments
+***************************************************************************************************
+*/
+ADDR_E_RETURNCODE ADDR_API AddrGetMaxAlignments(
+    ADDR_HANDLE                     hLib,
+    ADDR_GET_MAX_ALINGMENTS_OUTPUT* pOut);
+
 #if defined(__cplusplus)
 }
 #endif
index b92568ec183763b84cbca43c3cba5e2ac66af936..4804b0d79d94a46b8804b3c50e8392b6e2ade3c1 100644 (file)
@@ -1870,6 +1870,39 @@ ADDR_E_RETURNCODE AddrLib::ComputeCmaskCoordFromAddr(
     return returnCode;
 }
 
+/**
+***************************************************************************************************
+*   AddrLib::GetMaxAlignments
+*
+*   @brief
+*       Gets maximum alignments
+*
+*   @return
+*       ADDR_E_RETURNCODE
+***************************************************************************************************
+*/
+ADDR_E_RETURNCODE AddrLib::GetMaxAlignments(
+    ADDR_GET_MAX_ALINGMENTS_OUTPUT* pOut    ///< [out] output structure
+    ) const
+{
+    ADDR_E_RETURNCODE returnCode = ADDR_OK;
+
+    if (GetFillSizeFieldsFlags() == TRUE)
+    {
+        if (pOut->size != sizeof(ADDR_GET_MAX_ALINGMENTS_OUTPUT))
+        {
+            returnCode = ADDR_PARAMSIZEMISMATCH;
+        }
+    }
+
+    if (returnCode == ADDR_OK)
+    {
+        returnCode = HwlGetMaxAlignments(pOut);
+    }
+
+    return returnCode;
+}
+
 /**
 ***************************************************************************************************
 *   AddrLib::ComputeTileDataWidthAndHeight
index d693fd2bcbf4bc1514c484f23fc4ebb2c891cd47..3221120f8f7ab9d244dbdf1897ed3739aa406641 100644 (file)
@@ -312,6 +312,8 @@ public:
     BOOL_32 GetExportNorm(
         const ELEM_GETEXPORTNORM_INPUT* pIn) const;
 
+    ADDR_E_RETURNCODE GetMaxAlignments(ADDR_GET_MAX_ALINGMENTS_OUTPUT* pOut) const;
+
 protected:
     AddrLib();  // Constructor is protected
     AddrLib(const AddrClient* pClient);
@@ -419,6 +421,10 @@ protected:
     {
         return ADDR_NOTSUPPORTED;
     }
+
+    /// Pure virtual function to get max alignments
+    virtual ADDR_E_RETURNCODE HwlGetMaxAlignments(ADDR_GET_MAX_ALINGMENTS_OUTPUT* pOut) const = 0;
+
     // Compute attributes
 
     // HTILE
index 5e5110a7016f2df283806378a18505751d6ea292..1176ead49ba13a84b0a5147bdfb23179076189ca 100644 (file)
@@ -1819,3 +1819,43 @@ VOID CiAddrLib::HwlPadDimensions(
     }
 }
 
+/**
+***************************************************************************************************
+*   CiAddrLib::HwlGetMaxAlignments
+*
+*   @brief
+*       Gets maximum alignments
+*   @return
+*       ADDR_E_RETURNCODE
+***************************************************************************************************
+*/
+ADDR_E_RETURNCODE CiAddrLib::HwlGetMaxAlignments(
+    ADDR_GET_MAX_ALINGMENTS_OUTPUT* pOut    ///< [out] output structure
+    ) const
+{
+    const UINT_32 pipes = HwlGetPipes(&m_tileTable[0].info);
+
+    // Initial size is 64 KiB for PRT.
+    UINT_64 maxBaseAlign = 64 * 1024;
+
+    for (UINT_32 i = 0; i < m_noOfMacroEntries; i++)
+    {
+        // The maximum tile size is 16 byte-per-pixel and either 8-sample or 8-slice.
+        UINT_32 tileSize = m_macroTileTable[i].tileSplitBytes;
+
+        UINT_64 baseAlign = tileSize * pipes * m_macroTileTable[i].banks *
+                            m_macroTileTable[i].bankWidth * m_macroTileTable[i].bankHeight;
+
+        if (baseAlign > maxBaseAlign)
+        {
+            maxBaseAlign = baseAlign;
+        }
+    }
+
+    if (pOut != NULL)
+    {
+        pOut->baseAlign = maxBaseAlign;
+    }
+
+    return ADDR_OK;
+}
index 4862babb483b7a3c2a2fc2fad70b0a90375e8438..5630959f0acbd930721fe75dade5bddaec02cbdf 100644 (file)
@@ -154,7 +154,8 @@ protected:
         const ADDR_COMPUTE_CMASK_ADDRFROMCOORD_INPUT* pIn,
         ADDR_COMPUTE_CMASK_ADDRFROMCOORD_OUTPUT* pOut) const;
 
-protected:
+    virtual ADDR_E_RETURNCODE HwlGetMaxAlignments(ADDR_GET_MAX_ALINGMENTS_OUTPUT* pOut) const;
+
     virtual VOID HwlPadDimensions(
         AddrTileMode tileMode, UINT_32 bpp, ADDR_SURFACE_FLAGS flags,
         UINT_32 numSamples, ADDR_TILEINFO* pTileInfo, UINT_32 padDims, UINT_32 mipLevel,
index 902e9f27acf8e9b511c005cfa4f37b5a5655d514..4d791cef2bf7acd8b7e9a2fb69dc4409dc8ec508 100644 (file)
@@ -2816,3 +2816,48 @@ BOOL_32 SiAddrLib::HwlOverrideTileMode(
     return bOverrided;
 }
 
+/**
+***************************************************************************************************
+*   SiAddrLib::HwlGetMaxAlignments
+*
+*   @brief
+*       Gets maximum alignments
+*   @return
+*       ADDR_E_RETURNCODE
+***************************************************************************************************
+*/
+ADDR_E_RETURNCODE SiAddrLib::HwlGetMaxAlignments(
+    ADDR_GET_MAX_ALINGMENTS_OUTPUT* pOut    ///< [out] output structure
+    ) const
+{
+    const UINT_32 pipes = HwlGetPipes(&m_tileTable[0].info);
+
+    // Initial size is 64 KiB for PRT.
+    UINT_64 maxBaseAlign = 64 * 1024;
+
+    for (UINT_32 i = 0; i < m_noOfEntries; i++)
+    {
+        if ((IsMacroTiled(m_tileTable[i].mode) == TRUE) &&
+            (IsPrtTileMode(m_tileTable[i].mode) == FALSE))
+        {
+            // The maximum tile size is 16 byte-per-pixel and either 8-sample or 8-slice.
+            UINT_32 tileSize = Min(m_tileTable[i].info.tileSplitBytes,
+                                   MicroTilePixels * 8 * 16);
+
+            UINT_64 baseAlign = tileSize * pipes * m_tileTable[i].info.banks *
+                                m_tileTable[i].info.bankWidth * m_tileTable[i].info.bankHeight;
+
+            if (baseAlign > maxBaseAlign)
+            {
+                maxBaseAlign = baseAlign;
+            }
+        }
+    }
+
+    if (pOut != NULL)
+    {
+        pOut->baseAlign = maxBaseAlign;
+    }
+
+    return ADDR_OK;
+}
index 034001a914b30fae4128edfc94338711572af6b2..04f7adcac8f1244bf5b28c5b001f2274d32a4f0f 100644 (file)
@@ -227,6 +227,8 @@ protected:
         return TRUE;
     }
 
+    virtual ADDR_E_RETURNCODE HwlGetMaxAlignments(ADDR_GET_MAX_ALINGMENTS_OUTPUT* pOut) const;
+
     // Protected non-virtual functions
     VOID ComputeTileCoordFromPipeAndElemIdx(
         UINT_32 elemIdx, UINT_32 pipe, AddrPipeCfg pipeCfg, UINT_32 pitchInMacroTile,