LCOV - code coverage report
Current view: top level - legacy/ascend950/unified_platform/ccu/ccu_device - ccu_res_specs.h (source / functions) Coverage Total Hit
Test: coverage.info Lines: 100.0 % 8 8
Test Date: 2026-08-04 10:52:23 Functions: 100.0 % 2 2

            Line data    Source code
       1              : /**
       2              :  * Copyright (c) 2025 Huawei Technologies Co., Ltd.
       3              :  * This program is free software, you can redistribute it and/or modify it under the terms and conditions of
       4              :  * CANN Open Software License Agreement Version 2.0 (the "License").
       5              :  * Please refer to the License for details. You may not use this file except in compliance with the License.
       6              :  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
       7              :  * INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
       8              :  * See LICENSE in the root of the software repository for the full text of the License.
       9              :  */
      10              : 
      11              : #ifndef CCU_RES_SPECIFICATIONS_H
      12              : #define CCU_RES_SPECIFICATIONS_H
      13              : 
      14              : #include "ccu_device_manager.h"
      15              : 
      16              : namespace Hccl {
      17              : 
      18              : constexpr uint32_t CCU_RESOURCE_SIZE = 72 * 1024 * 1024; // CCU资源空间大小
      19              : constexpr uint64_t CCU_V1_CCUM_OFFSET   = 0x800000;    // V1 CCUM 偏移,位于CCUA之后
      20              : 
      21              : constexpr uint64_t CCU_V1_WQE_BASIC_BLOCK_OFFSET = (CCU_V1_CCUM_OFFSET + 0x800000);
      22              : 
      23              : constexpr uint32_t CCU_ONE_WQE_SIZE    = 64; // Bytes
      24              : constexpr uint32_t CCU_WQE_NUM_PER_SQE = 4;  // URMA 约束每个SQE包含4个WQEBB
      25              : constexpr uint32_t CCU_MIN_SQ_DEPTH = 16;
      26              : constexpr uint32_t CCU_MAX_SQ_DEPTH = 256;
      27              : constexpr uint16_t CCU_START_TA_JETTY_ID = 1024; // IMP给系统预留给CCU的jetty Id起始编号
      28              : constexpr uint32_t CCU_SQ_BUFFER_SIZE = 256 * 1024; // ccu 每个jetty sq buffer size 固定为256k
      29              : constexpr uint32_t CCU_WQEBB_RESOURCE_NUM = 4096;
      30              : constexpr uint32_t CCU_V1_PER_DIE_PFE_RESERVED_NUM = 16; // ccu 每个IO die预留16个PFE表
      31              : constexpr uint32_t CCU_PER_DIE_JETTY_RESERVED_NUM = 128; // ccu 每个IO die默认jetty数量
      32              : constexpr uint32_t CCU_MEM_INFO_SIZE = 64;
      33              : 
      34              : constexpr uint64_t CCU_RESOURCE_INS_RESERVE_SIZE = 0x100000;  // INS预留空间1M
      35              : constexpr uint64_t CCU_V1_RESOURCE_GSA_RESERVE_SIZE = 0x8000; // v1 GSA预留空间32K
      36              : constexpr uint16_t CCU_RESOURCE_XN_PER_SIZE = 8;
      37              : 
      38              : constexpr uint32_t MOVE_16_BITS = 16;
      39              : constexpr uint32_t MOVE_24_BITS = 24;
      40              : 
      41              : // CcuBlockResStrategy 定义了资源管理块资源类型的块大小
      42              : struct CcuBlockResStrategy {
      43              :     uint32_t loopNum{16};
      44              :     uint32_t ckeNum{16};
      45              :     uint32_t msNum{128};
      46              :     uint32_t xnNum{16};
      47              :     uint32_t gsaNum{16};
      48              :     uint32_t missionNum{2};
      49              : };
      50              : 
      51              : enum CcuMemTypeBitmap : uint64_t;
      52              : 
      53              : // 当前需要申请权限的内存为18块
      54           46 : inline const std::array<CcuMemTypeBitmap, 18>& GetMemTypeVector() {
      55              :     static const std::array<CcuMemTypeBitmap, 18> kMemTypeArray = {{
      56              :         CCU_MEMTYPE_INS,
      57              :         CCU_MEMTYPE_GSA,
      58              :         CCU_MEMTYPE_XN,
      59              :         CCU_MEMTYPE_CKE,
      60              :         CCU_MEMTYPE_PFE,
      61              :         CCU_MEMTYPE_CHN,
      62              :         CCU_MEMTYPE_JETTY_CTX,
      63              :         CCU_MEMTYPE_MISSION_CTX,
      64              :         CCU_MEMTYPE_LOOP_CTX,
      65              :         CCU_MEMTYPE_MISSION_SQE,
      66              :         CCU_MEMTYPE_CQE_BLOCK0,
      67              :         CCU_MEMTYPE_CQE_BLOCK1,
      68              :         CCU_MEMTYPE_CQE_BLOCK2,
      69              :         CCU_MEMTYPE_WQEBB,
      70              :         CCU_MEMTYPE_MS_BLOCK0,
      71              :         CCU_MEMTYPE_MS_BLOCK1,
      72              :         CCU_MEMTYPE_MS_BLOCK2,
      73              :         CCU_MEMTYPE_MS_BLOCK3
      74              :     }};
      75           46 :     return kMemTypeArray;
      76              : }
      77              : 
      78           11 : inline uint64_t GetCombinedMemTypeBitmap() {
      79           11 :     const auto& memTypes = GetMemTypeVector();
      80           11 :     uint64_t combined = 0;
      81              :     
      82          209 :     for (const auto& memType : memTypes) {
      83          198 :         combined |= static_cast<uint64_t>(memType);
      84              :     }
      85              :     
      86           11 :     return combined;
      87              : }
      88              : 
      89              : struct CcuMemInfo;
      90              : 
      91              : struct CcuResSpecInfo {
      92              :     // 基础信息
      93              :     uint32_t msId{0};
      94              :     uint32_t missionKey{0};
      95              :     uint64_t resourceAddr{0};
      96              :     // 通过能力寄存器获取
      97              :     uint32_t loopEngineNum{0};
      98              :     uint32_t missionNum{0};
      99              :     uint32_t instructionNum{0};
     100              :     uint32_t xnNum{0};
     101              :     uint32_t gsaNum{0};
     102              :     uint32_t msNum{0};
     103              :     uint32_t ckeNum{0};
     104              :     uint32_t jettyNum{0};
     105              :     uint32_t channelNum{0};
     106              :     uint32_t pfeNum{0};
     107              :     // 额外资源信息
     108              :     uint32_t wqeBBNum{CCU_WQEBB_RESOURCE_NUM};
     109              :     uint32_t dieNum{MAX_CCU_IODIE_NUM};
     110              : 
     111              :     // 内存信息
     112              :     uint32_t memNum{0};
     113              :     std::array<CcuMemInfo, CCU_MEM_INFO_SIZE> memInfoList{};
     114              : };
     115              : 
     116              : class CcuResSpecifications {
     117              : public:
     118              :     CcuResSpecifications(const CcuResSpecifications &that) = delete;
     119              :     CcuResSpecifications &operator=(const CcuResSpecifications &that) = delete;
     120              :     ~CcuResSpecifications() = default;
     121              : 
     122              :     void Deinit();
     123              :     void Init();
     124              : 
     125              :     static CcuResSpecifications& GetInstance(const int32_t deviceLogicId);
     126              : 
     127              :     CcuVersion GetCcuVersion() const;
     128              :     bool GetAXFlag() const;
     129              :     HcclResult GetDieEnableFlag(const uint8_t dieId, bool &dieEnableFlag) const;
     130              : 
     131              :     HcclResult GetResourceAddr(const uint8_t dieId, uint64_t &resourceAddr) const;
     132              :     HcclResult GetXnBaseAddr(const uint8_t dieId, uint64_t &xnBaseAddr) const;
     133              : 
     134              :     HcclResult GetMsId(const uint8_t dieId, uint32_t &msId) const;
     135              :     HcclResult GetMissionKey(const uint8_t dieId, uint32_t &missionKey) const;
     136              : 
     137              :     // 寄存器资源
     138              :     HcclResult GetMissionNum(const uint8_t dieId, uint32_t &missionNum) const;
     139              :     HcclResult GetMsNum(const uint8_t dieId, uint32_t &msNum) const;
     140              :     HcclResult GetLoopEngineNum(const uint8_t dieId, uint32_t &loopNum) const;
     141              :     HcclResult GetCkeNum(const uint8_t dieId, uint32_t &ckeNum) const;
     142              :     HcclResult GetXnNum(const uint8_t dieId, uint32_t &xnNum) const;
     143              :     HcclResult GetInstructionNum(const uint8_t dieId, uint32_t &instrNum) const;
     144              :     HcclResult GetGsaNum(const uint8_t dieId, uint32_t &gsaNum) const;
     145              : 
     146              :     // channel资源
     147              :     HcclResult GetChannelNum(const uint8_t dieId, uint32_t &channelNum) const;
     148              :     HcclResult GetJettyNum(const uint8_t dieId, uint32_t &jettyNum) const;
     149              :     HcclResult GetPfeReservedNum(const uint8_t dieId, uint32_t &pfeNum) const;
     150              :     HcclResult GetPfeNum(const uint8_t dieId, uint32_t &pfeNum) const;
     151              :     HcclResult GetWqeBBNum(const uint8_t dieId, uint32_t &wqeBBNum) const;
     152              : 
     153              :     // ccu mem info 
     154              :     HcclResult GetCcuMemInfoList(const uint8_t dieId, struct CcuMemInfo *memInfoList, uint32_t &count);
     155              : 
     156              : private:
     157              :     int32_t devLogicId{0};
     158              :     uint32_t devPhyId{0};
     159              :     std::array<bool, MAX_CCU_IODIE_NUM> dieEnableFlags{}; // 根据资源规格的记录可用的die
     160              :     std::array<CcuResSpecInfo, MAX_CCU_IODIE_NUM> resSpecs{};
     161              :     bool ifInit{false};
     162              :     bool isAX{false};
     163              :     CcuVersion ccuVersion{CcuVersion::CCU_INVALID};
     164              : 
     165              :     explicit CcuResSpecifications() = default;
     166              : 
     167              :     HcclResult Init_();
     168              : };
     169              : 
     170              : HcclResult CheckDieValid(const std::string &funcName, const int32_t devLogicId, const uint8_t dieId,
     171              :     bool dieEnableFlag);
     172              : 
     173              : using GetResSpecFunc = HcclResult (CcuResSpecifications::*)(const uint8_t, uint32_t&) const;
     174              : using ResSpecFuncPair = std::pair<ResType, GetResSpecFunc>;
     175              : constexpr ResSpecFuncPair GET_RES_SPEC_FUNC_ARRAY[] = {
     176              :     {ResType::LOOP, &CcuResSpecifications::GetLoopEngineNum},
     177              :     {ResType::MS, &CcuResSpecifications::GetMsNum},
     178              :     {ResType::CKE, &CcuResSpecifications::GetCkeNum},
     179              :     {ResType::XN, &CcuResSpecifications::GetXnNum},
     180              :     {ResType::GSA, &CcuResSpecifications::GetGsaNum},
     181              :     {ResType::INS, &CcuResSpecifications::GetInstructionNum},
     182              :     {ResType::MISSION, &CcuResSpecifications::GetMissionNum}
     183              : };
     184              : 
     185              : }; // namespace Hccl
     186              : #endif // CCU_RES_SPECIFICATIONS_H
        

Generated by: LCOV version 2.0-1