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}