LCOV - code coverage report
Current view: top level - aicpu_schedule/core - aicpusd_message_queue.h (source / functions) Coverage Total Hit
Test: coverage.info Lines: 75.0 % 8 6
Test Date: 2026-07-28 10:54:05 Functions: 54.5 % 11 6

            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
        

Generated by: LCOV version 2.0-1