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 AICPUSD_MESSAGE_QUEUE_H
12 : #define AICPUSD_MESSAGE_QUEUE_H
13 :
14 : #include <vector>
15 : #include <cstdint>
16 : #include <cstddef>
17 : #include <memory>
18 : #include "ascend_hal_define.h"
19 :
20 : namespace AicpuSchedule {
21 : // MSQ0_STATUS_EL0
22 : struct MsqStatus {
23 : uint32_t valid : 1; // [0:0]
24 : uint32_t size : 3; // [3:1]
25 : uint32_t comp : 1; // [4:4]
26 : uint64_t res : 59; // [63:5]
27 : };
28 :
29 : // MSQ_DATA_EL0
30 : struct MsqDatas {
31 : uint64_t data0;
32 : uint64_t data1;
33 : uint64_t data2;
34 : uint64_t data3;
35 : uint64_t data4;
36 : uint64_t data5;
37 : uint64_t data6;
38 : uint64_t data7;
39 : };
40 :
41 : class MsqImpl;
42 :
43 : class MessageQueue {
44 : public:
45 60 : MessageQueue() : deviceId_(0U), aicpuPhyIds_({}), isEnableHardThread_(false), cqeBaseAddr_(nullptr) {}
46 20 : ~MessageQueue() = default;
47 :
48 : static MessageQueue& GetInstance();
49 : int32_t InitMessageQueue(const uint32_t deviceId, const std::vector<uint32_t>& aicpuPhyIds);
50 : int32_t InitMessageQueueForThread(const size_t threadIndex) const;
51 : static bool WaitMsqInfoOnce(MsqDatas& datas);
52 : static bool IsMsqRspComplete();
53 : static void SendResponse(const uint32_t errCode, const uint32_t status);
54 :
55 : using MsqStatusFunc = MsqStatus (*)();
56 : using MsqDataFunc = void (*)(const uint32_t, MsqDatas&);
57 : using MsqRspFunc = void (*)();
58 :
59 : private:
60 : uint32_t* MapResAddr(const res_addr_type resType) const;
61 : int32_t InitMsqImpl() const;
62 : int32_t InitCqeBaseAddr();
63 :
64 : int32_t ResetMessageQueueStatus(const size_t threadIndex) const;
65 : int32_t ResetMsqT0Status() const;
66 : int32_t ResetMsqT1Status() const;
67 : int32_t InitMessageQueueStatusReadFunc(const size_t threadIndex) const;
68 : static MsqStatus ReadMsqT0Status();
69 : static MsqStatus ReadMsqT1Status();
70 : int32_t InitMessageQueueDataReadFunc(const size_t threadIndex) const;
71 : static void ReadMsqT0Data(const uint32_t msgSize, MsqDatas& datas);
72 : static void ReadMsqT1Data(const uint32_t msgSize, MsqDatas& datas);
73 : int32_t InitMessageQueueRspFunc(const size_t threadIndex) const;
74 : int32_t InitCqeAddr(const size_t threadIndex) const;
75 :
76 : static void SendMsqT0Response();
77 : static void SendMsqT1Response();
78 : static void SetCQE(const uint32_t errCode, const uint32_t status);
79 : static void WaitForEvent();
80 : static bool IsUseMsqT0(const size_t threadIndex);
81 :
82 : uint32_t deviceId_;
83 : std::vector<uint32_t> aicpuPhyIds_;
84 : bool isEnableHardThread_;
85 : uint32_t* cqeBaseAddr_;
86 : thread_local static MsqStatusFunc readMsqStatusFunc_;
87 : thread_local static MsqDataFunc readMsqDataFunc_;
88 : thread_local static MsqRspFunc sendMsqRspFunc_;
89 : thread_local static uint32_t* cqeAddr_;
90 : static std::shared_ptr<MsqImpl> impl_;
91 : };
92 :
93 : class MsqImpl {
94 : public:
95 25 : explicit MsqImpl() = default;
96 25 : virtual ~MsqImpl() = default;
97 :
98 : virtual int32_t ResetMsqT0Status() const = 0;
99 : virtual int32_t ResetMsqT1Status() const = 0;
100 : virtual MsqStatus ReadMsqT0Status() const = 0;
101 : virtual MsqStatus ReadMsqT1Status() const = 0;
102 : virtual void ReadMsqT0Data(const uint32_t msgSize, MsqDatas& datas) const = 0;
103 : virtual void ReadMsqT1Data(const uint32_t msgSize, MsqDatas& datas) const = 0;
104 : virtual void SendMsqT0Response() const = 0;
105 : virtual void SendMsqT1Response() const = 0;
106 : };
107 :
108 : class MsqImplV1 : public MsqImpl {
109 : public:
110 25 : explicit MsqImplV1() : MsqImpl(){};
111 25 : ~MsqImplV1() override = default;
112 :
113 : int32_t ResetMsqT0Status() const override;
114 : int32_t ResetMsqT1Status() const override;
115 : MsqStatus ReadMsqT0Status() const override;
116 : MsqStatus ReadMsqT1Status() const override;
117 : void ReadMsqT0Data(const uint32_t msgSize, MsqDatas& datas) const override;
118 : void ReadMsqT1Data(const uint32_t msgSize, MsqDatas& datas) const override;
119 : void SendMsqT0Response() const override;
120 : void SendMsqT1Response() const override;
121 : };
122 :
123 : class MsqImplV2 : public MsqImplV1 {
124 : public:
125 0 : explicit MsqImplV2() : MsqImplV1(){};
126 0 : ~MsqImplV2() override = default;
127 :
128 : int32_t ResetMsqT0Status() const override;
129 : int32_t ResetMsqT1Status() const override;
130 : MsqStatus ReadMsqT1Status() const override;
131 : void ReadMsqT1Data(const uint32_t msgSize, MsqDatas& datas) const override;
132 : void SendMsqT1Response() const override;
133 : };
134 :
135 : } // namespace AicpuSchedule
136 : #endif
|