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 :
21 : namespace AicpuSchedule {
22 : // MSQ0_STATUS_EL0
23 : struct MsqStatus {
24 : uint32_t valid : 1; // [0:0]
25 : uint32_t size : 3; // [3:1]
26 : uint32_t comp : 1; // [4:4]
27 : uint64_t res : 59; // [63:5]
28 : };
29 :
30 : // MSQ_DATA_EL0
31 : struct MsqDatas {
32 : uint64_t data0;
33 : uint64_t data1;
34 : uint64_t data2;
35 : uint64_t data3;
36 : uint64_t data4;
37 : uint64_t data5;
38 : uint64_t data6;
39 : uint64_t data7;
40 : };
41 :
42 : class MsqImpl;
43 :
44 : class MessageQueue {
45 : public:
46 60 : MessageQueue() : deviceId_(0U), aicpuPhyIds_({}), isEnableHardThread_(false), cqeBaseAddr_(nullptr) {}
47 20 : ~MessageQueue() = default;
48 :
49 : static MessageQueue &GetInstance();
50 : int32_t InitMessageQueue(const uint32_t deviceId, const std::vector<uint32_t> &aicpuPhyIds);
51 : int32_t InitMessageQueueForThread(const size_t threadIndex) const;
52 : static bool WaitMsqInfoOnce(MsqDatas &datas);
53 : static bool IsMsqRspComplete();
54 : static void SendResponse(const uint32_t errCode, const uint32_t status);
55 :
56 : using MsqStatusFunc = MsqStatus (*)();
57 : using MsqDataFunc = void (*)(const uint32_t, MsqDatas&);
58 : using MsqRspFunc = void (*)();
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
|