LCOV - code coverage report
Current view: top level - base_comm/resources/ccu/ccu_device - ccu_res_specs.h (source / functions) Coverage Total Hit
Test: coverage.info Lines: 100.0 % 2 2
Test Date: 2026-08-18 17:47:01 Functions: 57.1 % 7 4

            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_SPECS_H
      12              : #define CCU_RES_SPECS_H
      13              : 
      14              : #include <array>
      15              : #include <cstdint>
      16              : #include <string>
      17              : #include <utility>
      18              : 
      19              : #include "ccu_dev_mgr_imp.h"
      20              : 
      21              : #include "dev_type.h"
      22              : 
      23              : namespace hcomm {
      24              : 
      25              : constexpr uint32_t CCU_RESOURCE_SIZE = 72 * 1024 * 1024; // CCU资源空间大小
      26              : constexpr uint64_t CCU_V1_CCUM_OFFSET = 0x800000;        // V1 CCUM 偏移,位于CCUA之后
      27              : constexpr uint64_t CCU_V2_CCUM_OFFSET = 0x0;             // V2 CCUM 偏移,位于CCUA之前
      28              : 
      29              : constexpr uint64_t CCU_V1_WQE_BASIC_BLOCK_OFFSET = (CCU_V1_CCUM_OFFSET + 0x800000);
      30              : 
      31              : constexpr uint32_t CCU_ONE_WQE_SIZE = 64;   // Bytes
      32              : constexpr uint32_t CCU_WQE_NUM_PER_SQE = 4; // URMA 约束每个SQE包含4个WQEBB
      33              : constexpr uint32_t CCU_MIN_SQ_DEPTH = 16;
      34              : constexpr uint32_t CCU_MAX_SQ_DEPTH = 256;
      35              : constexpr uint16_t CCU_START_TA_JETTY_ID = 1024;    // IMP给系统预留给CCU的jetty Id起始编号
      36              : constexpr uint32_t CCU_SQ_BUFFER_SIZE = 256 * 1024; // ccu 每个jetty sq buffer size 固定为256k
      37              : constexpr uint32_t CCU_WQEBB_RESOURCE_NUM = 4096;
      38              : constexpr uint32_t CCU_V1_PER_DIE_PFE_RESERVED_NUM = 16; // ccu 每个IO die预留16个PFE表
      39              : constexpr uint32_t CCU_V2_PER_DIE_PFE_RESERVED_NUM = 20; // ccu v2每个IO die预留20个PFE表
      40              : constexpr uint8_t CCU_PER_DIE_JETTY_RESERVED_NUM = 128;  // ccu 每个IO die默认jetty数量
      41              : 
      42              : constexpr uint32_t CCU_V2_COUNT_XN_NUM = 4096; // 暂时采用宏定义
      43              : 
      44              : constexpr uint64_t CCU_RESOURCE_INS_RESERVE_SIZE = 0x100000;  // INS预留空间1M
      45              : constexpr uint64_t CCU_V1_RESOURCE_GSA_RESERVE_SIZE = 0x8000; // v1 GSA预留空间32K
      46              : constexpr uint64_t CCU_V2_RESOURCE_GSA_RESERVE_SIZE = 0x0;    // v2 GSA删除
      47              : constexpr uint32_t CCU_RESOURCE_XN_PER_SIZE = 8;
      48              : constexpr uint32_t CCU_RESOURCE_CKE_PER_SIZE = 8;
      49              : constexpr uint32_t CCU_RESOURCE_XN_V1_RESERVE_SIZE = 32 * 1024;  // xn预留空间32K
      50              : constexpr uint32_t CCU_RESOURCE_XN_V2_RESERVE_SIZE = 256 * 1024; // xn预留空间256K
      51              : constexpr uint16_t CCU_RESOURCE_INSTR_PER_SIZE = 32;
      52              : constexpr uint32_t CCU_V2_RESOURCE_TOTAL_CNT_XNS_NUM = 4; // 0.5RTT配置寄存器共4组
      53              : 
      54              : constexpr uint32_t MOVE_16_BITS = 16;
      55              : constexpr uint32_t MOVE_20_BITS = 20;
      56              : constexpr uint32_t MOVE_24_BITS = 24;
      57              : 
      58              : constexpr uint32_t INVALID_VALUE = 0;
      59              : constexpr uint64_t INVALID_ADDR = 0;
      60              : 
      61              : constexpr uint32_t CCU_V2_FIXED_SQ_SIZE = 32;
      62              : 
      63              : // CcuBlockResStrategy 定义了资源管理块资源类型的块大小
      64              : struct CcuBlockResStrategy {
      65              :     uint32_t loopNum{16};
      66              :     uint32_t ckeNum{16};
      67              :     uint32_t msNum{128};
      68              :     uint32_t xnNum{16};
      69              :     uint32_t gsaNum{16};
      70              :     uint32_t missionNum{2};
      71              : };
      72              : 
      73              : // ccu v2 专用,指示channel与jetty配比关系
      74              : struct CcuChannelJettyMap {
      75              :     uint32_t channelNum{1};
      76              :     uint32_t jettyNum{1};
      77          510 :     constexpr CcuChannelJettyMap(uint32_t channelNum, uint32_t jettyNum) : channelNum(channelNum), jettyNum(jettyNum) {}
      78              : };
      79              : 
      80              : // 预留后续用于模式选择
      81              : constexpr CcuChannelJettyMap CCU_CHANNEL_JETTY_MAP[]{
      82              :     {8, 1},
      83              :     {32, 4},
      84              : };
      85              : 
      86              : struct CcuResSpecInfo {
      87              :     // 基础信息
      88              :     uint32_t msId{0};
      89              :     uint32_t missionKey{0};
      90              :     uint64_t resourceAddr{0};
      91              :     // 通过能力寄存器获取
      92              :     uint32_t loopEngineNum{0};
      93              :     uint32_t missionNum{0};
      94              :     uint32_t instructionNum{0};
      95              :     uint32_t xnNum{0};
      96              :     uint32_t gsaNum{0};
      97              :     uint32_t msNum{0};
      98              :     uint32_t ckeNum{0};
      99              :     uint32_t jettyNum{0};
     100              :     uint32_t channelNum{0};
     101              :     uint32_t pfeNum{0};
     102              :     // 额外资源信息
     103              :     uint32_t countXnNum{0};
     104              :     uint32_t loopCkeNum{0};
     105              :     uint32_t wqeBBNum{CCU_WQEBB_RESOURCE_NUM};
     106              :     uint32_t dieNum{CCU_MAX_IODIE_NUM};
     107              :     CcuChannelJettyMap channelJettyMap{8, 1};
     108              : };
     109              : 
     110              : HcclResult CcuGetMainboardId(uint32_t deviceLogicId, Hccl::HcclMainboardId& hcclMainboardId);
     111              : 
     112         1455 : MAKE_ENUM(ServeMode, ARMX86, NORMAL);
     113              : 
     114              : class CcuResSpecifications {
     115              : public:
     116              :     static CcuResSpecifications& GetInstance(const int32_t deviceLogicId);
     117              :     HcclResult Init();
     118              :     HcclResult Deinit();
     119              :     ServeMode GetServeMode() const;
     120              :     CcuVersion GetCcuVersion() const;
     121              :     HcclResult GetDieEnableFlag(const uint8_t dieId, bool& dieEnableFlag) const;
     122              : 
     123              :     HcclResult GetResourceAddr(const uint8_t dieId, uint64_t& resourceAddr) const;
     124              :     HcclResult GetXnBaseAddr(const uint8_t dieId, uint64_t& xnBaseAddr) const;
     125              :     HcclResult GetCkeBaseAddr(const uint8_t dieId, uint64_t& ckeBaseAddr) const;
     126              :     uint64_t GetXnOffsetCcumBaseAddr(const uint8_t dieId) const;
     127              :     uint64_t GetCkeOffsetCcumBaseAddr(const uint8_t dieId) const;
     128              :     HcclResult GetXnOffsetCcumAddrById(const uint8_t dieId, uint32_t id, uint64_t& xnAddr) const;
     129              :     HcclResult GetCkeOffsetCcumAddrById(const uint8_t dieId, uint32_t id, uint64_t& ckeAddr) const;
     130              : 
     131              :     HcclResult GetMsId(const uint8_t dieId, uint32_t& msId) const;
     132              :     HcclResult GetMissionKey(const uint8_t dieId, uint32_t& missionKey) const;
     133              : 
     134              :     // 寄存器资源
     135              :     HcclResult GetMissionNum(const uint8_t dieId, uint32_t& missionNum) const;
     136              : 
     137              :     HcclResult GetMsNum(const uint8_t dieId, uint32_t& msNum) const;
     138              :     HcclResult GetLoopEngineNum(const uint8_t dieId, uint32_t& loopNum) const;
     139              :     HcclResult GetCkeNum(const uint8_t dieId, uint32_t& ckeNum) const;
     140              :     HcclResult GetXnNum(const uint8_t dieId, uint32_t& xnNum) const;
     141              :     HcclResult GetInstructionNum(const uint8_t dieId, uint32_t& instrNum) const;
     142              :     // v1 独有资源
     143              :     HcclResult GetGsaNum(const uint8_t dieId, uint32_t& gsaNum) const;
     144              :     // v2 新增资源
     145              :     HcclResult GetLoopCkeNum(const uint8_t dieId, uint32_t& loopCkeNum) const;
     146              :     HcclResult GetCountXnNum(const uint8_t dieId, uint32_t& countXnNum) const;
     147              : 
     148              :     // channel资源
     149              :     HcclResult GetChannelNum(const uint8_t dieId, uint32_t& channelNum) const;
     150              :     HcclResult GetJettyNum(const uint8_t dieId, uint32_t& jettyNum) const;
     151              :     HcclResult GetPfeReservedNum(const uint8_t dieId, uint32_t& pfeNum) const;
     152              :     HcclResult GetPfeNum(const uint8_t dieId, uint32_t& pfeNum) const;
     153              :     HcclResult GetWqeBBNum(const uint8_t dieId, uint32_t& wqeBBNum) const;
     154              :     // v2新增channel信息
     155              :     HcclResult GetChannelJettyMap(const uint8_t dieId, CcuChannelJettyMap& channelJettyMap) const;
     156              : 
     157              :     using GetResSpecFunc = HcclResult (CcuResSpecifications::*)(const uint8_t, uint32_t&) const;
     158              :     using ResSpecFuncPair = std::pair<ResType, GetResSpecFunc>;
     159              :     static constexpr std::array<ResSpecFuncPair, 8> GET_RES_SPEC_FUNC_ARRAY
     160              :         = {{{ResType::LOOP, &CcuResSpecifications::GetLoopEngineNum},
     161              :             {ResType::MS, &CcuResSpecifications::GetMsNum},
     162              :             {ResType::CKE, &CcuResSpecifications::GetCkeNum},
     163              :             {ResType::XN, &CcuResSpecifications::GetXnNum},
     164              :             {ResType::COUNT_XN, &CcuResSpecifications::GetCountXnNum},
     165              :             {ResType::GSA, &CcuResSpecifications::GetGsaNum},
     166              :             {ResType::INS, &CcuResSpecifications::GetInstructionNum},
     167              :             {ResType::MISSION, &CcuResSpecifications::GetMissionNum}}};
     168              : 
     169              : private:
     170              :     explicit CcuResSpecifications() = default;
     171              :     ~CcuResSpecifications() = default;
     172              :     CcuResSpecifications(const CcuResSpecifications& that) = delete;
     173              :     CcuResSpecifications& operator=(const CcuResSpecifications& that) = delete;
     174              : 
     175              :     HcclResult CheckDieValid(
     176              :         const std::string& funcName, const int32_t devLogicId, const uint8_t dieId,
     177              :         const std::array<bool, CCU_MAX_IODIE_NUM>& dieEnableFlags) const;
     178              : 
     179              : private:
     180              :     bool initFlag_{false};
     181              :     int32_t devLogicId_{0};
     182              :     uint32_t devPhyId_{0};
     183              :     ServeMode serveMode_{ServeMode::ARMX86}; // 默认按a+x模式,规避使用部分ccua
     184              :     CcuVersion ccuVersion_{CcuVersion::CCU_INVALID};
     185              :     std::array<bool, CCU_MAX_IODIE_NUM> dieEnableFlags_{};
     186              :     std::array<CcuResSpecInfo, CCU_MAX_IODIE_NUM> resSpecs_{};
     187              : 
     188              : }; // class CcuResSpecifications
     189              : } // namespace hcomm
     190              : #endif // CCU_RES_SPECS_H
        

Generated by: LCOV version 2.0-1