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 476 : constexpr CcuChannelJettyMap(uint32_t channelNum, uint32_t jettyNum)
78 476 : : channelNum(channelNum), jettyNum(jettyNum) {}
79 : };
80 :
81 : // 预留后续用于模式选择
82 : constexpr CcuChannelJettyMap CCU_CHANNEL_JETTY_MAP[] {
83 : { 8, 1},
84 : {32, 4},
85 : };
86 :
87 : struct CcuResSpecInfo {
88 : // 基础信息
89 : uint32_t msId{0};
90 : uint32_t missionKey{0};
91 : uint64_t resourceAddr{0};
92 : // 通过能力寄存器获取
93 : uint32_t loopEngineNum{0};
94 : uint32_t missionNum{0};
95 : uint32_t instructionNum{0};
96 : uint32_t xnNum{0};
97 : uint32_t gsaNum{0};
98 : uint32_t msNum{0};
99 : uint32_t ckeNum{0};
100 : uint32_t jettyNum{0};
101 : uint32_t channelNum{0};
102 : uint32_t pfeNum{0};
103 : // 额外资源信息
104 : uint32_t countXnNum{0};
105 : uint32_t loopCkeNum{0};
106 : uint32_t wqeBBNum{CCU_WQEBB_RESOURCE_NUM};
107 : uint32_t dieNum{CCU_MAX_IODIE_NUM};
108 : CcuChannelJettyMap channelJettyMap{8, 1};
109 : };
110 :
111 : HcclResult CcuGetMainboardId(uint32_t deviceLogicId, Hccl::HcclMainboardId &hcclMainboardId);
112 :
113 1247 : MAKE_ENUM(ServeMode, ARMX86, NORMAL);
114 :
115 : class CcuResSpecifications {
116 : public:
117 : static CcuResSpecifications& GetInstance(const int32_t deviceLogicId);
118 : HcclResult Init();
119 : HcclResult Deinit();
120 : ServeMode GetServeMode() const;
121 : CcuVersion GetCcuVersion() const;
122 : HcclResult GetDieEnableFlag(const uint8_t dieId, bool &dieEnableFlag) const;
123 :
124 : HcclResult GetResourceAddr(const uint8_t dieId, uint64_t &resourceAddr) const;
125 : HcclResult GetXnBaseAddr(const uint8_t dieId, uint64_t &xnBaseAddr) const;
126 : HcclResult GetCkeBaseAddr(const uint8_t dieId, uint64_t &ckeBaseAddr) const;
127 : uint64_t GetXnOffsetCcumBaseAddr(const uint8_t dieId) const;
128 : uint64_t GetCkeOffsetCcumBaseAddr(const uint8_t dieId) const;
129 : HcclResult GetXnOffsetCcumAddrById(const uint8_t dieId, uint32_t id, uint64_t &xnAddr) const;
130 : HcclResult GetCkeOffsetCcumAddrById(const uint8_t dieId, uint32_t id, uint64_t &ckeAddr) const;
131 :
132 : HcclResult GetMsId(const uint8_t dieId, uint32_t &msId) const;
133 : HcclResult GetMissionKey(const uint8_t dieId, uint32_t &missionKey) const;
134 :
135 : // 寄存器资源
136 : HcclResult GetMissionNum(const uint8_t dieId, uint32_t &missionNum) const;
137 :
138 : HcclResult GetMsNum(const uint8_t dieId, uint32_t &msNum) const;
139 : HcclResult GetLoopEngineNum(const uint8_t dieId, uint32_t &loopNum) const;
140 : HcclResult GetCkeNum(const uint8_t dieId, uint32_t &ckeNum) const;
141 : HcclResult GetXnNum(const uint8_t dieId, uint32_t &xnNum) const;
142 : HcclResult GetInstructionNum(const uint8_t dieId, uint32_t &instrNum) const;
143 : // v1 独有资源
144 : HcclResult GetGsaNum(const uint8_t dieId, uint32_t &gsaNum) const;
145 : // v2 新增资源
146 : HcclResult GetLoopCkeNum(const uint8_t dieId, uint32_t &loopCkeNum) const;
147 : HcclResult GetCountXnNum(const uint8_t dieId, uint32_t &countXnNum) const;
148 :
149 : // channel资源
150 : HcclResult GetChannelNum(const uint8_t dieId, uint32_t &channelNum) const;
151 : HcclResult GetJettyNum(const uint8_t dieId, uint32_t &jettyNum) const;
152 : HcclResult GetPfeReservedNum(const uint8_t dieId, uint32_t &pfeNum) const;
153 : HcclResult GetPfeNum(const uint8_t dieId, uint32_t &pfeNum) const;
154 : HcclResult GetWqeBBNum(const uint8_t dieId, uint32_t &wqeBBNum) const;
155 : // v2新增channel信息
156 : HcclResult GetChannelJettyMap(const uint8_t dieId, CcuChannelJettyMap &channelJettyMap) const;
157 :
158 : using GetResSpecFunc = HcclResult (CcuResSpecifications::*)(const uint8_t, uint32_t&) const;
159 : using ResSpecFuncPair = std::pair<ResType, GetResSpecFunc>;
160 : static constexpr std::array<ResSpecFuncPair, 8> GET_RES_SPEC_FUNC_ARRAY = {{
161 : {ResType::LOOP, &CcuResSpecifications::GetLoopEngineNum},
162 : {ResType::MS, &CcuResSpecifications::GetMsNum},
163 : {ResType::CKE, &CcuResSpecifications::GetCkeNum},
164 : {ResType::XN, &CcuResSpecifications::GetXnNum},
165 : {ResType::COUNT_XN, &CcuResSpecifications::GetCountXnNum},
166 : {ResType::GSA, &CcuResSpecifications::GetGsaNum},
167 : {ResType::INS, &CcuResSpecifications::GetInstructionNum},
168 : {ResType::MISSION, &CcuResSpecifications::GetMissionNum}
169 : }};
170 :
171 : private:
172 : explicit CcuResSpecifications() = default;
173 : ~CcuResSpecifications() = default;
174 : CcuResSpecifications(const CcuResSpecifications &that) = delete;
175 : CcuResSpecifications &operator=(const CcuResSpecifications &that) = delete;
176 :
177 : HcclResult CheckDieValid(const std::string &funcName, const int32_t devLogicId, const uint8_t dieId,
178 : const std::array<bool, CCU_MAX_IODIE_NUM> &dieEnableFlags) const;
179 :
180 : private:
181 : bool initFlag_{false};
182 : int32_t devLogicId_{0};
183 : uint32_t devPhyId_{0};
184 : ServeMode serveMode_{ServeMode::ARMX86}; // 默认按a+x模式,规避使用部分ccua
185 : CcuVersion ccuVersion_{CcuVersion::CCU_INVALID};
186 : std::array<bool, CCU_MAX_IODIE_NUM> dieEnableFlags_{};
187 : std::array<CcuResSpecInfo, CCU_MAX_IODIE_NUM> resSpecs_{};
188 :
189 : }; // class CcuResSpecifications
190 : } // namespace hcomm
191 : #endif // CCU_RES_SPECS_H
|