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
|