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_COMP_H
12 : #define CCU_COMP_H
13 :
14 : #include <array>
15 : #include <stack>
16 : #include <mutex>
17 : #include <memory>
18 : #include <vector>
19 : #include <cstdint>
20 : #include <utility>
21 : #include <unordered_map>
22 :
23 : #include "hccl_types.h"
24 :
25 : #include "tp_mgr.h"
26 : #include "ccu_dev_mgr_imp.h"
27 : #include "ccu_res_allocator.h"
28 : #include "ccu_res_specs.h"
29 : #include "ccu_channel_ctx_mgr.h"
30 :
31 : // 暂时引入orion仓
32 : #include "local_ub_rma_buffer.h"
33 :
34 : namespace hcomm {
35 :
36 : class CcuComponent {
37 : public:
38 : static CcuComponent &GetInstance(const int32_t deviceLogicId);
39 : HcclResult Init();
40 : HcclResult Deinit();
41 :
42 : HcclResult GetCcuResourceSpaceBufInfo(const uint8_t dieId, uint64_t &addr, uint64_t &size) const;
43 : HcclResult GetCcuResourceSpaceTokenInfo(const uint8_t dieId, uint64_t &tokenId,
44 : uint64_t &tokenValue) const;
45 :
46 : HcclResult AllocChannels(const uint8_t dieId, const ChannelPara &channelPara,
47 : std::vector<ChannelInfo> &channelInfos);
48 : HcclResult ConfigChannel(const uint8_t dieId, const ChannelCfg &cfg);
49 : HcclResult ReleaseChannel(const uint8_t dieId, const uint32_t channelId);
50 :
51 : HcclResult GetLoopChannelId(const uint8_t srcDieId, const uint8_t dstDieId,
52 : uint32_t &channelId) const;
53 :
54 : HcclResult AllocRes(const uint8_t dieId, const ResType resType, const uint32_t num,
55 : const bool consecutive, std::vector<ResInfo> &resInfos);
56 : HcclResult ReleaseRes(const uint8_t dieId, const ResType resType, const uint32_t startId,
57 : const uint32_t num);
58 :
59 : HcclResult AllocIns(const uint8_t dieId, const uint32_t num, ResInfo &insInfo);
60 : HcclResult ReleaseIns(const uint8_t dieId, const ResInfo &insInfo);
61 : uint32_t GetInsConsecutiveRemainSize(const uint8_t dieId) const;
62 : HcclResult AllocCke(const uint8_t dieId, const uint32_t num, std::vector<ResInfo> &ckeInfos);
63 : HcclResult ReleaseCke(const uint8_t dieId, const std::vector<ResInfo> &ckeInfos);
64 : HcclResult AllocXn(const uint8_t dieId, const uint32_t num, std::vector<ResInfo> &xnInfos);
65 : HcclResult ReleaseXn(const uint8_t dieId, const std::vector<ResInfo> &xnInfos);
66 :
67 : // 0.5rtt专用接口
68 : HcclResult AllocWishCntXn(const uint8_t dieId,
69 : const std::string &resGroupTag, uint32_t &wishCntXn);
70 : HcclResult ReleaseWishCntXn(const uint8_t dieId,
71 : const std::string &resGroupTag, uint32_t wishCntXn);
72 : HcclResult GetCntXnBlock(const uint8_t dieId,
73 : const std::string &resGroupTag,
74 : std::pair<uint32_t, uint32_t> &cntXnPair);
75 : HcclResult GetTotalCntXn(const uint8_t dieId,
76 : const std::string &resGroupTag, uint32_t &totalCntXn);
77 :
78 : const std::array<bool, CCU_MAX_IODIE_NUM> &GetDieEnableFlags() const;
79 :
80 : HcclResult CleanTaskKillState() const;
81 : HcclResult CleanDieCkes(const uint8_t dieId) const;
82 : HcclResult CcuCleanTaskKillState(const int32_t deviceLogicId);
83 : HcclResult SetTaskKillDone();
84 : HcclResult SetTaskKill();
85 :
86 : private:
87 207 : explicit CcuComponent() = default;
88 : ~CcuComponent();
89 : CcuComponent(const CcuComponent &that) = delete;
90 : CcuComponent &operator=(const CcuComponent &that) = delete;
91 :
92 : HcclResult CheckDiesEnable();
93 : HcclResult ChooseLoopEids(const std::array<bool, CCU_MAX_IODIE_NUM> &dieDrvEnableFlags);
94 : HcclResult GetLoopFeIpByDieId(const uint8_t dieId, uint32_t &feId, CommAddr &commAddr);
95 : HcclResult CreateCcuRmaBuffer();
96 : HcclResult CreateResourceManagers();
97 : HcclResult CreateLoopChannels();
98 : HcclResult CreateLoopChannel(const uint8_t dieId, uint32_t &channelId);
99 : HcclResult CreateAndImportLoopJettys(const uint8_t dieId, const CommAddr &commAddr,
100 : const std::vector<JettyInfo> &jettyInfos);
101 : HcclResult GetLoopTpInfo(const uint8_t dieId, const CommAddr &commAddr, TpInfo &tpInfo);
102 : HcclResult GetLoopTpAttr(const uint8_t dieId, const CommAddr &commAddr, TpAttrInfo &tpAttrInfo);
103 : uint32_t GetNewPsn();
104 : HcclResult ConfigLoopChannel(const uint8_t dieId, const CommAddr &commAddr,
105 : const ChannelInfo &channelInfo);
106 : HcclResult ConfigMsIdToken();
107 :
108 : HcclResult ReleaseJettyRes();
109 : HcclResult UnimportAllJettys();
110 : HcclResult ReleaseAllTpInfos();
111 : HcclResult DestroyAllJettys();
112 :
113 : HcclResult SetProcess(CcuOpcodeType opCode) const;
114 : HcclResult CcuSetTaskKillDone(const int32_t deviceLogicId);
115 :
116 : // 0.5rtt专用接口
117 : HcclResult ConfirmCntXns(const uint8_t dieId, const std::string &resGroupTag, const ResInfo &cntXnInfos);
118 : HcclResult GetAvailableTotalCntXnIndex(uint32_t& index) const;
119 : HcclResult SetTotalCntXnProcess(uint8_t dieId, uint32_t index, uint32_t fromId, uint32_t toId, uint32_t totalId) const;
120 :
121 : HcclResult SetSplitUnit(uint8_t dieId, uint32_t splitPktUnit) const;
122 : HcclResult SetTotalCntXn(uint8_t dieId, uint32_t fromId, uint32_t toId, uint32_t totalId, uint32_t index);
123 : HcclResult ResetTotalCntXn(uint8_t dieId, uint32_t index);
124 :
125 : private:
126 : std::mutex innerMutex_;
127 : std::mutex taskKillMutex_;
128 : static constexpr uint32_t INVALID_DEV_ID = 0xFFFFFFFF;
129 : bool initFlag_{false};
130 : int32_t devLogicId_{static_cast<int32_t>(INVALID_DEV_ID)};
131 : uint32_t devPhyId_{INVALID_DEV_ID};
132 : CcuVersion ccuVersion_{CcuVersion::CCU_INVALID};
133 :
134 : // 根据资源规格的记录可用的die,要求drv可用,且环回eid存在
135 : std::array<bool, CCU_MAX_IODIE_NUM> dieEnableFlags_{};
136 :
137 : // 记录环回设备信息,dieId, (feId, commAddr)
138 : std::unordered_map<uint8_t, std::pair<uint32_t, CommAddr>> loopFeCommAddrMap_{};
139 : // 记录CCU资源空间Buffer,避免重复内存注册
140 : std::unordered_map<uint8_t, std::unique_ptr<Hccl::LocalUbRmaBuffer>> ccuRmaBufferMap_{};
141 : // 资源管理器
142 : std::array<std::unique_ptr<CcuChannelCtxMgr>, CCU_MAX_IODIE_NUM> channelCtxMgrs_{};
143 : std::array<std::unique_ptr<CcuResAllocator>, CCU_MAX_IODIE_NUM> resAllocators_{};
144 : // 环回channel编号
145 : static constexpr uint16_t INVAILD_LOOP_CHANNEL_ID = 0xFFFF;
146 : std::array<uint32_t, CCU_MAX_IODIE_NUM> loopChannelIds_{INVAILD_LOOP_CHANNEL_ID, INVAILD_LOOP_CHANNEL_ID};
147 : // 环回jetty资源信息
148 : // std::array<HcclNetDev, CCU_MAX_IODIE_NUM> netDevs_{}; 当前netdevs不支持jfc
149 : std::unordered_map<uint8_t, std::vector<HrtRaUbJettyCreatedOutParam>> createdOutParamMap_{};
150 : using ImportOutParamPair = std::pair<CtxHandle, HrtRaUbJettyImportedOutParam>;
151 : std::unordered_map<uint8_t, std::vector<ImportOutParamPair>> importedOutParamMap_{};
152 : std::unordered_map<uint8_t, TpInfo> tpInfoMap_{};
153 : std::unordered_map<uint8_t, TpAttrInfo> tpAttrInfoMap_{};
154 : enum class CcuTaskKillStatus : uint8_t { INIT = 0, TASK_KILL = 1, KILL_DONE = 2, CLEAN_TIF = 3, INVALID = 4};
155 : CcuTaskKillStatus status{CcuTaskKillStatus::INVALID};
156 :
157 : struct CntXnBlock {
158 : ResInfo resInfo{}; // cntXn resInfo
159 : std::stack<uint32_t> wishCntXns; // wishCntXn Id
160 : uint32_t totalCntXn{0}; // totalCntXn Id
161 : uint32_t blockIdx{0}; // wishCntXn和totalCntXn绑定时的idx
162 : };
163 : std::mutex cntXnBlockMutex_;
164 : std::unordered_map<uint8_t, std::unordered_map<std::string, struct CntXnBlock>> cntXnBlocks_; // {dieId, {resGroupTag, CntXnBlock}}
165 : // 已使用的0.5RTT配置寄存器的index
166 : std::array<bool, CCU_V2_RESOURCE_TOTAL_CNT_XNS_NUM> usedTotalCntXnFlags_{};
167 : };
168 :
169 : } // namespace hcomm
170 : #endif // CCU_COMP_H
|