1484543d1Sopenharmony_ci/*
2484543d1Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
3484543d1Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4484543d1Sopenharmony_ci * you may not use this file except in compliance with the License.
5484543d1Sopenharmony_ci * You may obtain a copy of the License at
6484543d1Sopenharmony_ci *
7484543d1Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8484543d1Sopenharmony_ci *
9484543d1Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10484543d1Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11484543d1Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12484543d1Sopenharmony_ci * See the License for the specific language governing permissions and
13484543d1Sopenharmony_ci * limitations under the License.
14484543d1Sopenharmony_ci */
15484543d1Sopenharmony_ci
16484543d1Sopenharmony_ci#include <random>
17484543d1Sopenharmony_ci#include <csignal>
18484543d1Sopenharmony_ci#include <cstdio>
19484543d1Sopenharmony_ci#include <cstdlib>
20484543d1Sopenharmony_ci#include <unistd.h>
21484543d1Sopenharmony_ci#include <cstdint>
22484543d1Sopenharmony_ci#include <cstring>
23484543d1Sopenharmony_ci#include <cerrno>
24484543d1Sopenharmony_ci#include <fcntl.h>
25484543d1Sopenharmony_ci#include <cstdbool>
26484543d1Sopenharmony_ci#include <sys/ioctl.h>
27484543d1Sopenharmony_ci#include <gtest/gtest.h>
28484543d1Sopenharmony_ci#include "ffrt_inner.h"
29484543d1Sopenharmony_ci#include "dfx/log/ffrt_log_api.h"
30484543d1Sopenharmony_ci#include "c/ffrt_flo.h"
31484543d1Sopenharmony_ci#include "../common.h"
32484543d1Sopenharmony_ci
33484543d1Sopenharmony_ciusing namespace std;
34484543d1Sopenharmony_ciusing namespace testing;
35484543d1Sopenharmony_ci#ifdef HWTEST_TESTING_EXT_ENABLE
36484543d1Sopenharmony_ciusing namespace testing::ext;
37484543d1Sopenharmony_ci#endif
38484543d1Sopenharmony_ciusing namespace ffrt;
39484543d1Sopenharmony_ci
40484543d1Sopenharmony_ci#define IOCTL_SET_FLO_CONFIG	_IOWR('x', 51, struct FloCfg)
41484543d1Sopenharmony_cistruct FloCfg {
42484543d1Sopenharmony_ci    int pid;             // process id
43484543d1Sopenharmony_ci    int id;              // code part context id (0-32), shouldn't be duplicate
44484543d1Sopenharmony_ci    unsigned int size;   // this context using how much ddr size set 0x100000(1MB) as default
45484543d1Sopenharmony_ci    unsigned int port;   // 0 as default I/D cache FLO work on the same time
46484543d1Sopenharmony_ci    unsigned int offset; // how many ahead used by FLO prefecher
47484543d1Sopenharmony_ci#ifndef __OHOS__
48484543d1Sopenharmony_ci    bool ffrt;
49484543d1Sopenharmony_ci#endif
50484543d1Sopenharmony_ci};
51484543d1Sopenharmony_ci
52484543d1Sopenharmony_ciint InitCfg(int ctxId)
53484543d1Sopenharmony_ci{
54484543d1Sopenharmony_ci    int fd;
55484543d1Sopenharmony_ci    struct FloCfg data;
56484543d1Sopenharmony_ci
57484543d1Sopenharmony_ci    struct FloCfg cfg = {
58484543d1Sopenharmony_ci        .pid = getpid(),
59484543d1Sopenharmony_ci        .id = ctxId,
60484543d1Sopenharmony_ci        .size = 1048576,
61484543d1Sopenharmony_ci        .port = 0,
62484543d1Sopenharmony_ci        .offset = 256,
63484543d1Sopenharmony_ci#ifndef __OHOS__
64484543d1Sopenharmony_ci        .ffrt = true,
65484543d1Sopenharmony_ci#endif
66484543d1Sopenharmony_ci    };
67484543d1Sopenharmony_ci
68484543d1Sopenharmony_ci    printf("get para: pid-%d id-%d size-0x%x port-%d offset-%d.\n",
69484543d1Sopenharmony_ci        cfg.pid, cfg.id, cfg.size, cfg.port, cfg.offset);
70484543d1Sopenharmony_ci
71484543d1Sopenharmony_ci    fd = open("/dev/hisi_perf_ctrl", O_RDWR);
72484543d1Sopenharmony_ci    if (fd < 0) {
73484543d1Sopenharmony_ci        printf("open /dev/hisi_perf_ctrl failed.\n");
74484543d1Sopenharmony_ci        return -1;
75484543d1Sopenharmony_ci    }
76484543d1Sopenharmony_ci
77484543d1Sopenharmony_ci    if (ioctl(fd, IOCTL_SET_FLO_CONFIG, &cfg) == -1) {
78484543d1Sopenharmony_ci        printf("Error %d (%s) in IOCTL_SET_FLO_CONFIG\n", errno, strerror(errno));
79484543d1Sopenharmony_ci        close(fd);
80484543d1Sopenharmony_ci        return -1;
81484543d1Sopenharmony_ci    }
82484543d1Sopenharmony_ci
83484543d1Sopenharmony_ci    close(fd);
84484543d1Sopenharmony_ci    printf("flo cfg finished.\n");
85484543d1Sopenharmony_ci    return 0;
86484543d1Sopenharmony_ci}
87484543d1Sopenharmony_ci
88484543d1Sopenharmony_ciclass FloTest : public testing::Test {
89484543d1Sopenharmony_ciprotected:
90484543d1Sopenharmony_ci    static void SetUpTestCase()
91484543d1Sopenharmony_ci    {
92484543d1Sopenharmony_ci    }
93484543d1Sopenharmony_ci
94484543d1Sopenharmony_ci    static void TearDownTestCase()
95484543d1Sopenharmony_ci    {
96484543d1Sopenharmony_ci    }
97484543d1Sopenharmony_ci
98484543d1Sopenharmony_ci    virtual void SetUp()
99484543d1Sopenharmony_ci    {
100484543d1Sopenharmony_ci    }
101484543d1Sopenharmony_ci
102484543d1Sopenharmony_ci    virtual void TearDown()
103484543d1Sopenharmony_ci    {
104484543d1Sopenharmony_ci    }
105484543d1Sopenharmony_ci};
106484543d1Sopenharmony_ci
107484543d1Sopenharmony_ciHWTEST_F(FloTest, FFRTFloApiSuccess, TestSize.Level1)
108484543d1Sopenharmony_ci{
109484543d1Sopenharmony_ci    InitCfg(1);
110484543d1Sopenharmony_ci    ffrt_flo_start(1);
111484543d1Sopenharmony_ci    ffrt_flo_end(1);
112484543d1Sopenharmony_ci}
113484543d1Sopenharmony_ci
114484543d1Sopenharmony_ciHWTEST_F(FloTest, FFRTFloTaskWithoutYield, TestSize.Level1)
115484543d1Sopenharmony_ci{
116484543d1Sopenharmony_ci    InitCfg(2);
117484543d1Sopenharmony_ci    auto handle = ffrt::submit_h([] {
118484543d1Sopenharmony_ci        ffrt_flo_start(2);
119484543d1Sopenharmony_ci        ffrt_flo_end(2);
120484543d1Sopenharmony_ci    }, {}, {});
121484543d1Sopenharmony_ci    ffrt::wait({handle});
122484543d1Sopenharmony_ci}
123484543d1Sopenharmony_ci
124484543d1Sopenharmony_ciHWTEST_F(FloTest, FFRTFloTaskWithYield, TestSize.Level1)
125484543d1Sopenharmony_ci{
126484543d1Sopenharmony_ci    InitCfg(3);
127484543d1Sopenharmony_ci    auto handle = ffrt::submit_h([] {
128484543d1Sopenharmony_ci        ffrt_flo_start(3);
129484543d1Sopenharmony_ci        ffrt::this_task::yield();
130484543d1Sopenharmony_ci        ffrt_flo_end(3);
131484543d1Sopenharmony_ci    }, {}, {});
132484543d1Sopenharmony_ci    ffrt::wait({handle});
133484543d1Sopenharmony_ci}