You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
383 lines
8.1 KiB
383 lines
8.1 KiB
/*
|
|
* Copyright (c) Hisilicon Technologies Co., Ltd. 2012-2021. All rights reserved.
|
|
* Description: spread iapi api
|
|
*/
|
|
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
/* file operation interface */
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/ioctl.h>
|
|
#include <fcntl.h>
|
|
#include <termios.h> /* terminate interface */
|
|
#include <sys/mman.h>
|
|
#include <string.h>
|
|
#include <pthread.h>
|
|
#include "securec.h"
|
|
#include "soc_log.h"
|
|
#include "drv_ioctl_spread.h"
|
|
|
|
#undef LOG_MODULE_ID
|
|
#define LOG_MODULE_ID SOC_ID_SPREAD
|
|
#define MAX_BOOTARGS_LEN 1024
|
|
|
|
|
|
static td_s32 get_bootargs(td_u8 *bootargs, td_u16 length)
|
|
{
|
|
FILE *pf = NULL;
|
|
|
|
if (bootargs == NULL) {
|
|
soc_log_err("Pointer is null.\n");
|
|
return -1;
|
|
}
|
|
|
|
pf = fopen("/proc/cmdline", "r");
|
|
if (pf == NULL) {
|
|
soc_log_err("Failed to open '/proc/cmdline'.\n");
|
|
return -1;
|
|
}
|
|
|
|
if (!fgets((td_char*)bootargs, length, pf)) {
|
|
soc_log_err("Failed to fgets string.\n");
|
|
(td_void)fclose(pf);
|
|
return -1;
|
|
}
|
|
|
|
(td_void)fclose(pf);
|
|
return 0;
|
|
}
|
|
|
|
static td_s32 ext_spread_open(td_void)
|
|
{
|
|
td_s32 spread_fd;
|
|
|
|
spread_fd = open("/dev/soc_spread", O_RDWR);
|
|
|
|
return spread_fd;
|
|
}
|
|
|
|
static td_s32 ext_ss_get_emmc_type(td_void)
|
|
{
|
|
td_char *ret = NULL;
|
|
td_char *bootargs = NULL;
|
|
errno_t err_ret;
|
|
|
|
bootargs = malloc(MAX_BOOTARGS_LEN);
|
|
if (bootargs == NULL) {
|
|
soc_log_err("alloc memory failed\n");
|
|
return TD_FAILURE;
|
|
}
|
|
|
|
err_ret = memset_s(bootargs, MAX_BOOTARGS_LEN, 0, MAX_BOOTARGS_LEN);
|
|
if (err_ret != EOK) {
|
|
soc_log_err("secure func call error\n");
|
|
goto err_free;
|
|
}
|
|
|
|
if (get_bootargs((td_u8 *)bootargs, MAX_BOOTARGS_LEN) < 0) {
|
|
soc_log_err("get_bootargs failed.\n");
|
|
goto err_free;
|
|
}
|
|
|
|
ret = strstr((td_char *)bootargs, "mmcblk0:");
|
|
if (ret == NULL) {
|
|
goto err_free;
|
|
}
|
|
|
|
free(bootargs);
|
|
bootargs = NULL;
|
|
|
|
return TD_SUCCESS;
|
|
|
|
err_free:
|
|
free(bootargs);
|
|
bootargs = NULL;
|
|
|
|
return TD_FAILURE;
|
|
}
|
|
|
|
td_s32 uapi_ss_ddr_set_spread(td_bool enable)
|
|
{
|
|
td_s32 ret;
|
|
td_s32 spread_fd;
|
|
|
|
spread_fd = ext_spread_open();
|
|
if (spread_fd < 0) {
|
|
soc_log_err("open spread dev failed.\n");
|
|
return TD_FAILURE;
|
|
}
|
|
ret = ioctl(spread_fd, CMD_SPREAD_SET_DDR_ENABLE, &enable);
|
|
if (ret < 0) {
|
|
soc_log_err("uapi_ss_ddr_set_spread failed.\n");
|
|
close(spread_fd);
|
|
return TD_FAILURE;
|
|
}
|
|
|
|
close(spread_fd);
|
|
|
|
return TD_SUCCESS;
|
|
}
|
|
|
|
td_s32 uapi_ss_ddr_set_spread_ratio(td_u32 ratio)
|
|
{
|
|
td_s32 ret;
|
|
td_s32 spread_fd;
|
|
|
|
spread_fd = ext_spread_open();
|
|
if (spread_fd < 0) {
|
|
soc_log_err("open spread dev failed.\n");
|
|
return TD_FAILURE;
|
|
}
|
|
ret = ioctl(spread_fd, CMD_SPREAD_SET_DDR_RATIO, &ratio);
|
|
if (ret < 0) {
|
|
soc_log_err("uapi_ss_ddr_set_spread_ratio failed.\n");
|
|
close(spread_fd);
|
|
return TD_FAILURE;
|
|
}
|
|
|
|
close(spread_fd);
|
|
|
|
return TD_SUCCESS;
|
|
}
|
|
|
|
td_s32 uapi_ss_ddr_set_spread_freq(td_u32 freq)
|
|
{
|
|
td_s32 ret;
|
|
td_s32 spread_fd;
|
|
|
|
spread_fd = ext_spread_open();
|
|
if (spread_fd < 0) {
|
|
soc_log_err("open spread dev failed.\n");
|
|
return TD_FAILURE;
|
|
}
|
|
ret = ioctl(spread_fd, CMD_SPREAD_SET_DDR_FREQ, &freq);
|
|
if (ret < 0) {
|
|
soc_log_err("uapi_ss_ddr_set_spread_freq failed.\n");
|
|
close(spread_fd);
|
|
return TD_FAILURE;
|
|
}
|
|
|
|
close(spread_fd);
|
|
|
|
return TD_SUCCESS;
|
|
}
|
|
|
|
td_s32 uapi_ss_emmc_set_clock(td_bool enable)
|
|
{
|
|
td_s32 ret;
|
|
td_s32 spread_fd;
|
|
|
|
if (ext_ss_get_emmc_type() == TD_FAILURE) {
|
|
soc_log_err("Only support emmc device.\n");
|
|
return 0;
|
|
}
|
|
|
|
spread_fd = ext_spread_open();
|
|
if (spread_fd < 0) {
|
|
soc_log_err("open spread dev failed.\n");
|
|
return TD_FAILURE;
|
|
}
|
|
ret = ioctl(spread_fd, CMD_SPREAD_SET_EMMC_CLKEN, &enable);
|
|
if (ret < 0) {
|
|
soc_log_err("uapi_ss_emmc_set_clock failed.\n");
|
|
close(spread_fd);
|
|
return TD_FAILURE;
|
|
}
|
|
|
|
close(spread_fd);
|
|
|
|
return TD_SUCCESS;
|
|
}
|
|
|
|
td_s32 uapi_ss_emmc_set_spread(td_bool enable)
|
|
{
|
|
td_s32 ret;
|
|
td_s32 spread_fd;
|
|
|
|
if (ext_ss_get_emmc_type() == TD_FAILURE) {
|
|
soc_log_err("Only support emmc device.\n");
|
|
return 0;
|
|
}
|
|
|
|
spread_fd = ext_spread_open();
|
|
if (spread_fd < 0) {
|
|
soc_log_err("open spread dev failed.\n");
|
|
return TD_FAILURE;
|
|
}
|
|
ret = ioctl(spread_fd, CMD_SPREAD_SET_EMMC_ENABLE, &enable);
|
|
if (ret < 0) {
|
|
soc_log_err("uapi_ss_emmc_set_spread failed.\n");
|
|
close(spread_fd);
|
|
return TD_FAILURE;
|
|
}
|
|
|
|
close(spread_fd);
|
|
|
|
return TD_SUCCESS;
|
|
}
|
|
|
|
td_s32 uapi_ss_emmc_set_spread_ratio(td_u32 ratio)
|
|
{
|
|
td_s32 ret;
|
|
td_s32 spread_fd;
|
|
|
|
if (ext_ss_get_emmc_type() == TD_FAILURE) {
|
|
soc_log_err("Only support emmc device.\n");
|
|
return 0;
|
|
}
|
|
|
|
spread_fd = ext_spread_open();
|
|
if (spread_fd < 0) {
|
|
soc_log_err("open spread dev failed.\n");
|
|
return TD_FAILURE;
|
|
}
|
|
ret = ioctl(spread_fd, CMD_SPREAD_SET_EMMC_RATIO, &ratio);
|
|
if (ret < 0) {
|
|
soc_log_err("uapi_ss_emmc_set_spread_ratio failed.\n");
|
|
close(spread_fd);
|
|
return TD_FAILURE;
|
|
}
|
|
|
|
close(spread_fd);
|
|
|
|
return TD_SUCCESS;
|
|
}
|
|
|
|
td_s32 uapi_ss_emmc_set_spread_freq(td_u32 freq)
|
|
{
|
|
td_s32 ret;
|
|
td_s32 spread_fd;
|
|
|
|
if (ext_ss_get_emmc_type() == TD_FAILURE) {
|
|
soc_log_err("Only support emmc device.\n");
|
|
return 0;
|
|
}
|
|
|
|
spread_fd = ext_spread_open();
|
|
if (spread_fd < 0) {
|
|
soc_log_err("open spread dev failed.\n");
|
|
return TD_FAILURE;
|
|
}
|
|
ret = ioctl(spread_fd, CMD_SPREAD_SET_EMMC_FREQ, &freq);
|
|
if (ret < 0) {
|
|
soc_log_err("uapi_ss_emmc_set_spread_freq failed.\n");
|
|
close(spread_fd);
|
|
return TD_FAILURE;
|
|
}
|
|
|
|
close(spread_fd);
|
|
|
|
return TD_SUCCESS;
|
|
}
|
|
|
|
td_s32 uapi_ss_gmac_set_clock(td_bool enable)
|
|
{
|
|
td_s32 ret;
|
|
td_s32 spread_fd;
|
|
|
|
spread_fd = ext_spread_open();
|
|
if (spread_fd < 0) {
|
|
soc_log_err("open spread dev failed.\n");
|
|
return TD_FAILURE;
|
|
}
|
|
ret = ioctl(spread_fd, CMD_SPREAD_SET_GMAC_CLKEN, &enable);
|
|
if (ret < 0) {
|
|
soc_log_err("uapi_ss_gmac_set_clock failed.\n");
|
|
close(spread_fd);
|
|
return TD_FAILURE;
|
|
}
|
|
|
|
close(spread_fd);
|
|
|
|
return TD_SUCCESS;
|
|
}
|
|
|
|
td_s32 uapi_ss_gmac_set_spread(td_bool enable)
|
|
{
|
|
td_s32 ret;
|
|
td_s32 spread_fd;
|
|
|
|
spread_fd = ext_spread_open();
|
|
if (spread_fd < 0) {
|
|
soc_log_err("open spread dev failed.\n");
|
|
return TD_FAILURE;
|
|
}
|
|
ret = ioctl(spread_fd, CMD_SPREAD_SET_GMAC_ENABLE, &enable);
|
|
if (ret < 0) {
|
|
soc_log_err("uapi_ss_gmac_set_spread failed.\n");
|
|
close(spread_fd);
|
|
return TD_FAILURE;
|
|
}
|
|
|
|
close(spread_fd);
|
|
|
|
return TD_SUCCESS;
|
|
}
|
|
|
|
td_s32 uapi_ss_gmac_set_spread_ratio(td_u32 ratio)
|
|
{
|
|
td_s32 ret;
|
|
td_s32 spread_fd;
|
|
|
|
spread_fd = ext_spread_open();
|
|
if (spread_fd < 0) {
|
|
soc_log_err("open spread dev failed.\n");
|
|
return TD_FAILURE;
|
|
}
|
|
ret = ioctl(spread_fd, CMD_SPREAD_SET_GMAC_RATIO, &ratio);
|
|
if (ret < 0) {
|
|
soc_log_err("uapi_ss_gmac_set_spread_ratio failed.\n");
|
|
close(spread_fd);
|
|
return TD_FAILURE;
|
|
}
|
|
|
|
close(spread_fd);
|
|
|
|
return TD_SUCCESS;
|
|
}
|
|
|
|
td_s32 uapi_ss_gmac_set_spread_freq(td_u32 freq)
|
|
{
|
|
td_s32 ret;
|
|
td_s32 spread_fd;
|
|
|
|
spread_fd = ext_spread_open();
|
|
if (spread_fd < 0) {
|
|
soc_log_err("open spread dev failed.\n");
|
|
return TD_FAILURE;
|
|
}
|
|
ret = ioctl(spread_fd, CMD_SPREAD_SET_GMAC_FREQ, &freq);
|
|
if (ret < 0) {
|
|
soc_log_err("uapi_ss_gmac_set_spread_freq failed.\n");
|
|
close(spread_fd);
|
|
return TD_FAILURE;
|
|
}
|
|
|
|
close(spread_fd);
|
|
|
|
return TD_SUCCESS;
|
|
}
|
|
|
|
td_s32 uapi_ci_set_clock(td_bool enable)
|
|
{
|
|
td_s32 ret;
|
|
td_s32 spread_fd;
|
|
|
|
spread_fd = ext_spread_open();
|
|
if (spread_fd < 0) {
|
|
soc_log_err("open spread dev failed.\n");
|
|
return TD_FAILURE;
|
|
}
|
|
ret = ioctl(spread_fd, CMD_SPREAD_SET_CI_CLKEN, &enable);
|
|
if (ret < 0) {
|
|
soc_log_err("uapi_ci_set_clock failed.\n");
|
|
close(spread_fd);
|
|
return TD_FAILURE;
|
|
}
|
|
|
|
close(spread_fd);
|
|
|
|
return TD_SUCCESS;
|
|
}
|