mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
RISC-V: make use of variadic sbi_ecall
The new sbi_ecall doesn't have to list all 8 arguments anymore, so only pass the actual numbers of arguments for each SBI function. The remaining trailing 0 are intentional as they represent an argument. SBI 0.1 shouldn't be using the sbi_ecall, because it's only for 0.2+, but allow it by passing 0 is the reserved register. Signed-off-by: Radim Krčmář <rkrcmar@ventanamicro.com> Link: https://patch.msgid.link/20250619190315.2603194-3-rkrcmar@ventanamicro.com [pjw@kernel.org: updated to apply; fixed rv64 DBCN WRITE/READ per Radim] Cc: Radim Krčmář <rkrcmar@qti.qualcomm.com> Signed-off-by: Paul Walmsley <pjw@kernel.org>
This commit is contained in:
parent
eb44ccd829
commit
aa89052e09
|
|
@ -98,7 +98,7 @@ do { \
|
|||
|
||||
#define nacl_sync_hfence(__e) \
|
||||
sbi_ecall(SBI_EXT_NACL, SBI_EXT_NACL_SYNC_HFENCE, \
|
||||
(__e), 0, 0, 0, 0, 0)
|
||||
(__e))
|
||||
|
||||
#define nacl_hfence_mkconfig(__type, __order, __vmid, __asid) \
|
||||
({ \
|
||||
|
|
@ -198,7 +198,7 @@ do { \
|
|||
|
||||
#define nacl_sync_csr(__csr) \
|
||||
sbi_ecall(SBI_EXT_NACL, SBI_EXT_NACL_SYNC_CSR, \
|
||||
(__csr), 0, 0, 0, 0, 0)
|
||||
(__csr))
|
||||
|
||||
/*
|
||||
* Each ncsr_xyz() macro defined below has it's own static-branch so every
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ static int sbi_hsm_hart_start(unsigned long hartid, unsigned long saddr,
|
|||
struct sbiret ret;
|
||||
|
||||
ret = sbi_ecall(SBI_EXT_HSM, SBI_EXT_HSM_HART_START,
|
||||
hartid, saddr, priv, 0, 0, 0);
|
||||
hartid, saddr, priv);
|
||||
|
||||
return sbi_err_map_linux_errno(ret.error);
|
||||
}
|
||||
|
|
@ -39,7 +39,7 @@ static int sbi_hsm_hart_stop(void)
|
|||
{
|
||||
struct sbiret ret;
|
||||
|
||||
ret = sbi_ecall(SBI_EXT_HSM, SBI_EXT_HSM_HART_STOP, 0, 0, 0, 0, 0, 0);
|
||||
ret = sbi_ecall(SBI_EXT_HSM, SBI_EXT_HSM_HART_STOP);
|
||||
|
||||
return sbi_err_map_linux_errno(ret.error);
|
||||
}
|
||||
|
|
@ -49,7 +49,7 @@ static int sbi_hsm_hart_get_status(unsigned long hartid)
|
|||
struct sbiret ret;
|
||||
|
||||
ret = sbi_ecall(SBI_EXT_HSM, SBI_EXT_HSM_HART_STATUS,
|
||||
hartid, 0, 0, 0, 0, 0);
|
||||
hartid);
|
||||
if (ret.error)
|
||||
return sbi_err_map_linux_errno(ret.error);
|
||||
else
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@ static int sbi_sta_steal_time_set_shmem(unsigned long lo, unsigned long hi,
|
|||
struct sbiret ret;
|
||||
|
||||
ret = sbi_ecall(SBI_EXT_STA, SBI_EXT_STA_STEAL_TIME_SET_SHMEM,
|
||||
lo, hi, flags, 0, 0, 0);
|
||||
lo, hi, flags);
|
||||
if (ret.error) {
|
||||
if (lo == SBI_SHMEM_DISABLE && hi == SBI_SHMEM_DISABLE)
|
||||
pr_warn("Failed to disable steal-time shmem");
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ static unsigned long __sbi_v01_cpumask_to_hartmask(const struct cpumask *cpu_mas
|
|||
*/
|
||||
void sbi_console_putchar(int ch)
|
||||
{
|
||||
sbi_ecall(SBI_EXT_0_1_CONSOLE_PUTCHAR, 0, ch, 0, 0, 0, 0, 0);
|
||||
sbi_ecall(SBI_EXT_0_1_CONSOLE_PUTCHAR, 0, ch);
|
||||
}
|
||||
EXPORT_SYMBOL(sbi_console_putchar);
|
||||
|
||||
|
|
@ -70,7 +70,7 @@ int sbi_console_getchar(void)
|
|||
{
|
||||
struct sbiret ret;
|
||||
|
||||
ret = sbi_ecall(SBI_EXT_0_1_CONSOLE_GETCHAR, 0, 0, 0, 0, 0, 0, 0);
|
||||
ret = sbi_ecall(SBI_EXT_0_1_CONSOLE_GETCHAR, 0);
|
||||
|
||||
return ret.error;
|
||||
}
|
||||
|
|
@ -83,7 +83,7 @@ EXPORT_SYMBOL(sbi_console_getchar);
|
|||
*/
|
||||
void sbi_shutdown(void)
|
||||
{
|
||||
sbi_ecall(SBI_EXT_0_1_SHUTDOWN, 0, 0, 0, 0, 0, 0, 0);
|
||||
sbi_ecall(SBI_EXT_0_1_SHUTDOWN, 0);
|
||||
}
|
||||
EXPORT_SYMBOL(sbi_shutdown);
|
||||
|
||||
|
|
@ -97,9 +97,9 @@ static void __sbi_set_timer_v01(uint64_t stime_value)
|
|||
{
|
||||
#if __riscv_xlen == 32
|
||||
sbi_ecall(SBI_EXT_0_1_SET_TIMER, 0, stime_value,
|
||||
stime_value >> 32, 0, 0, 0, 0);
|
||||
stime_value >> 32);
|
||||
#else
|
||||
sbi_ecall(SBI_EXT_0_1_SET_TIMER, 0, stime_value, 0, 0, 0, 0, 0);
|
||||
sbi_ecall(SBI_EXT_0_1_SET_TIMER, 0, stime_value);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
@ -107,8 +107,7 @@ static void __sbi_send_ipi_v01(unsigned int cpu)
|
|||
{
|
||||
unsigned long hart_mask =
|
||||
__sbi_v01_cpumask_to_hartmask(cpumask_of(cpu));
|
||||
sbi_ecall(SBI_EXT_0_1_SEND_IPI, 0, (unsigned long)(&hart_mask),
|
||||
0, 0, 0, 0, 0);
|
||||
sbi_ecall(SBI_EXT_0_1_SEND_IPI, 0, (unsigned long)(&hart_mask));
|
||||
}
|
||||
|
||||
static int __sbi_rfence_v01(int fid, const struct cpumask *cpu_mask,
|
||||
|
|
@ -126,17 +125,16 @@ static int __sbi_rfence_v01(int fid, const struct cpumask *cpu_mask,
|
|||
switch (fid) {
|
||||
case SBI_EXT_RFENCE_REMOTE_FENCE_I:
|
||||
sbi_ecall(SBI_EXT_0_1_REMOTE_FENCE_I, 0,
|
||||
(unsigned long)&hart_mask, 0, 0, 0, 0, 0);
|
||||
(unsigned long)&hart_mask);
|
||||
break;
|
||||
case SBI_EXT_RFENCE_REMOTE_SFENCE_VMA:
|
||||
sbi_ecall(SBI_EXT_0_1_REMOTE_SFENCE_VMA, 0,
|
||||
(unsigned long)&hart_mask, start, size,
|
||||
0, 0, 0);
|
||||
(unsigned long)&hart_mask, start, size);
|
||||
break;
|
||||
case SBI_EXT_RFENCE_REMOTE_SFENCE_VMA_ASID:
|
||||
sbi_ecall(SBI_EXT_0_1_REMOTE_SFENCE_VMA_ASID, 0,
|
||||
(unsigned long)&hart_mask, start, size,
|
||||
arg4, 0, 0);
|
||||
arg4);
|
||||
break;
|
||||
default:
|
||||
pr_err("SBI call [%d]not supported in SBI v0.1\n", fid);
|
||||
|
|
@ -180,10 +178,9 @@ static void __sbi_set_timer_v02(uint64_t stime_value)
|
|||
{
|
||||
#if __riscv_xlen == 32
|
||||
sbi_ecall(SBI_EXT_TIME, SBI_EXT_TIME_SET_TIMER, stime_value,
|
||||
stime_value >> 32, 0, 0, 0, 0);
|
||||
stime_value >> 32);
|
||||
#else
|
||||
sbi_ecall(SBI_EXT_TIME, SBI_EXT_TIME_SET_TIMER, stime_value, 0,
|
||||
0, 0, 0, 0);
|
||||
sbi_ecall(SBI_EXT_TIME, SBI_EXT_TIME_SET_TIMER, stime_value);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
@ -193,7 +190,7 @@ static void __sbi_send_ipi_v02(unsigned int cpu)
|
|||
struct sbiret ret = {0};
|
||||
|
||||
ret = sbi_ecall(SBI_EXT_IPI, SBI_EXT_IPI_SEND_IPI,
|
||||
1UL, cpuid_to_hartid_map(cpu), 0, 0, 0, 0);
|
||||
1UL, cpuid_to_hartid_map(cpu));
|
||||
if (ret.error) {
|
||||
result = sbi_err_map_linux_errno(ret.error);
|
||||
pr_err("%s: hbase = [%lu] failed (error [%d])\n",
|
||||
|
|
@ -212,32 +209,32 @@ static int __sbi_rfence_v02_call(unsigned long fid, unsigned long hmask,
|
|||
|
||||
switch (fid) {
|
||||
case SBI_EXT_RFENCE_REMOTE_FENCE_I:
|
||||
ret = sbi_ecall(ext, fid, hmask, hbase, 0, 0, 0, 0);
|
||||
ret = sbi_ecall(ext, fid, hmask, hbase);
|
||||
break;
|
||||
case SBI_EXT_RFENCE_REMOTE_SFENCE_VMA:
|
||||
ret = sbi_ecall(ext, fid, hmask, hbase, start,
|
||||
size, 0, 0);
|
||||
size);
|
||||
break;
|
||||
case SBI_EXT_RFENCE_REMOTE_SFENCE_VMA_ASID:
|
||||
ret = sbi_ecall(ext, fid, hmask, hbase, start,
|
||||
size, arg4, 0);
|
||||
size, arg4);
|
||||
break;
|
||||
|
||||
case SBI_EXT_RFENCE_REMOTE_HFENCE_GVMA:
|
||||
ret = sbi_ecall(ext, fid, hmask, hbase, start,
|
||||
size, 0, 0);
|
||||
size);
|
||||
break;
|
||||
case SBI_EXT_RFENCE_REMOTE_HFENCE_GVMA_VMID:
|
||||
ret = sbi_ecall(ext, fid, hmask, hbase, start,
|
||||
size, arg4, 0);
|
||||
size, arg4);
|
||||
break;
|
||||
case SBI_EXT_RFENCE_REMOTE_HFENCE_VVMA:
|
||||
ret = sbi_ecall(ext, fid, hmask, hbase, start,
|
||||
size, 0, 0);
|
||||
size);
|
||||
break;
|
||||
case SBI_EXT_RFENCE_REMOTE_HFENCE_VVMA_ASID:
|
||||
ret = sbi_ecall(ext, fid, hmask, hbase, start,
|
||||
size, arg4, 0);
|
||||
size, arg4);
|
||||
break;
|
||||
default:
|
||||
pr_err("unknown function ID [%lu] for SBI extension [%d]\n",
|
||||
|
|
@ -334,7 +331,7 @@ int sbi_fwft_set(u32 feature, unsigned long value, unsigned long flags)
|
|||
return -EOPNOTSUPP;
|
||||
|
||||
ret = sbi_ecall(SBI_EXT_FWFT, SBI_EXT_FWFT_SET,
|
||||
feature, value, flags, 0, 0, 0);
|
||||
feature, value, flags);
|
||||
|
||||
return sbi_err_map_linux_errno(ret.error);
|
||||
}
|
||||
|
|
@ -510,8 +507,7 @@ EXPORT_SYMBOL(sbi_remote_hfence_vvma_asid);
|
|||
|
||||
static void sbi_srst_reset(unsigned long type, unsigned long reason)
|
||||
{
|
||||
sbi_ecall(SBI_EXT_SRST, SBI_EXT_SRST_RESET, type, reason,
|
||||
0, 0, 0, 0);
|
||||
sbi_ecall(SBI_EXT_SRST, SBI_EXT_SRST_RESET, type, reason);
|
||||
pr_warn("%s: type=0x%lx reason=0x%lx failed\n",
|
||||
__func__, type, reason);
|
||||
}
|
||||
|
|
@ -544,8 +540,7 @@ long sbi_probe_extension(int extid)
|
|||
{
|
||||
struct sbiret ret;
|
||||
|
||||
ret = sbi_ecall(SBI_EXT_BASE, SBI_EXT_BASE_PROBE_EXT, extid,
|
||||
0, 0, 0, 0, 0);
|
||||
ret = sbi_ecall(SBI_EXT_BASE, SBI_EXT_BASE_PROBE_EXT, extid);
|
||||
if (!ret.error)
|
||||
return ret.value;
|
||||
|
||||
|
|
@ -607,10 +602,10 @@ int sbi_debug_console_write(const char *bytes, unsigned int num_bytes)
|
|||
if (IS_ENABLED(CONFIG_32BIT))
|
||||
ret = sbi_ecall(SBI_EXT_DBCN, SBI_EXT_DBCN_CONSOLE_WRITE,
|
||||
num_bytes, lower_32_bits(base_addr),
|
||||
upper_32_bits(base_addr), 0, 0, 0);
|
||||
upper_32_bits(base_addr));
|
||||
else
|
||||
ret = sbi_ecall(SBI_EXT_DBCN, SBI_EXT_DBCN_CONSOLE_WRITE,
|
||||
num_bytes, base_addr, 0, 0, 0, 0);
|
||||
num_bytes, base_addr, 0);
|
||||
|
||||
if (ret.error == SBI_ERR_FAILURE)
|
||||
return -EIO;
|
||||
|
|
@ -636,10 +631,10 @@ int sbi_debug_console_read(char *bytes, unsigned int num_bytes)
|
|||
if (IS_ENABLED(CONFIG_32BIT))
|
||||
ret = sbi_ecall(SBI_EXT_DBCN, SBI_EXT_DBCN_CONSOLE_READ,
|
||||
num_bytes, lower_32_bits(base_addr),
|
||||
upper_32_bits(base_addr), 0, 0, 0);
|
||||
upper_32_bits(base_addr));
|
||||
else
|
||||
ret = sbi_ecall(SBI_EXT_DBCN, SBI_EXT_DBCN_CONSOLE_READ,
|
||||
num_bytes, base_addr, 0, 0, 0, 0);
|
||||
num_bytes, base_addr, 0);
|
||||
|
||||
if (ret.error == SBI_ERR_FAILURE)
|
||||
return -EIO;
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ long __sbi_base_ecall(int fid)
|
|||
{
|
||||
struct sbiret ret;
|
||||
|
||||
ret = sbi_ecall(SBI_EXT_BASE, fid, 0, 0, 0, 0, 0, 0);
|
||||
ret = sbi_ecall(SBI_EXT_BASE, fid);
|
||||
if (!ret.error)
|
||||
return ret.value;
|
||||
else
|
||||
|
|
|
|||
|
|
@ -118,7 +118,7 @@ static int sbi_system_suspend(unsigned long sleep_type,
|
|||
struct sbiret ret;
|
||||
|
||||
ret = sbi_ecall(SBI_EXT_SUSP, SBI_EXT_SUSP_SYSTEM_SUSPEND,
|
||||
sleep_type, resume_addr, opaque, 0, 0, 0);
|
||||
sleep_type, resume_addr, opaque);
|
||||
if (ret.error)
|
||||
return sbi_err_map_linux_errno(ret.error);
|
||||
|
||||
|
|
@ -156,7 +156,7 @@ static int sbi_suspend_finisher(unsigned long suspend_type,
|
|||
struct sbiret ret;
|
||||
|
||||
ret = sbi_ecall(SBI_EXT_HSM, SBI_EXT_HSM_HART_SUSPEND,
|
||||
suspend_type, resume_addr, opaque, 0, 0, 0);
|
||||
suspend_type, resume_addr, opaque);
|
||||
|
||||
return (ret.error) ? sbi_err_map_linux_errno(ret.error) : 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -73,7 +73,7 @@ int kvm_riscv_nacl_enable(void)
|
|||
nacl = this_cpu_ptr(&kvm_riscv_nacl);
|
||||
|
||||
ret = sbi_ecall(SBI_EXT_NACL, SBI_EXT_NACL_SET_SHMEM,
|
||||
nacl->shmem_phys, 0, 0, 0, 0, 0);
|
||||
nacl->shmem_phys, 0, 0);
|
||||
rc = sbi_err_map_linux_errno(ret.error);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
|
@ -87,7 +87,7 @@ void kvm_riscv_nacl_disable(void)
|
|||
return;
|
||||
|
||||
sbi_ecall(SBI_EXT_NACL, SBI_EXT_NACL_SET_SHMEM,
|
||||
SBI_SHMEM_DISABLE, SBI_SHMEM_DISABLE, 0, 0, 0, 0);
|
||||
SBI_SHMEM_DISABLE, SBI_SHMEM_DISABLE, 0);
|
||||
}
|
||||
|
||||
void kvm_riscv_nacl_exit(void)
|
||||
|
|
@ -118,8 +118,7 @@ static long nacl_probe_feature(long feature_id)
|
|||
if (!kvm_riscv_nacl_available())
|
||||
return 0;
|
||||
|
||||
ret = sbi_ecall(SBI_EXT_NACL, SBI_EXT_NACL_PROBE_FEATURE,
|
||||
feature_id, 0, 0, 0, 0, 0);
|
||||
ret = sbi_ecall(SBI_EXT_NACL, SBI_EXT_NACL_PROBE_FEATURE, feature_id);
|
||||
return ret.value;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@ static void sbi_cppc_read(void *read_data)
|
|||
struct sbi_cppc_data *data = (struct sbi_cppc_data *)read_data;
|
||||
|
||||
data->ret = sbi_ecall(SBI_EXT_CPPC, SBI_CPPC_READ,
|
||||
data->reg, 0, 0, 0, 0, 0);
|
||||
data->reg);
|
||||
}
|
||||
|
||||
static void sbi_cppc_write(void *write_data)
|
||||
|
|
@ -59,7 +59,7 @@ static void sbi_cppc_write(void *write_data)
|
|||
struct sbi_cppc_data *data = (struct sbi_cppc_data *)write_data;
|
||||
|
||||
data->ret = sbi_ecall(SBI_EXT_CPPC, SBI_CPPC_WRITE,
|
||||
data->reg, data->val, 0, 0, 0, 0);
|
||||
data->reg, data->val);
|
||||
}
|
||||
|
||||
static void cppc_ffh_csr_read(void *read_data)
|
||||
|
|
|
|||
|
|
@ -386,7 +386,7 @@ static void pmu_sbi_check_event(struct sbi_pmu_event_data *edata)
|
|||
edata->event_idx, 0);
|
||||
if (!ret.error) {
|
||||
sbi_ecall(SBI_EXT_PMU, SBI_EXT_PMU_COUNTER_STOP,
|
||||
ret.value, 0x1, SBI_PMU_STOP_FLAG_RESET, 0, 0, 0);
|
||||
ret.value, 0x1, SBI_PMU_STOP_FLAG_RESET);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
@ -722,7 +722,7 @@ static int pmu_sbi_snapshot_disable(void)
|
|||
struct sbiret ret;
|
||||
|
||||
ret = sbi_ecall(SBI_EXT_PMU, SBI_EXT_PMU_SNAPSHOT_SET_SHMEM, SBI_SHMEM_DISABLE,
|
||||
SBI_SHMEM_DISABLE, 0, 0, 0, 0);
|
||||
SBI_SHMEM_DISABLE, 0);
|
||||
if (ret.error) {
|
||||
pr_warn("failed to disable snapshot shared memory\n");
|
||||
return sbi_err_map_linux_errno(ret.error);
|
||||
|
|
@ -746,10 +746,11 @@ static int pmu_sbi_snapshot_setup(struct riscv_pmu *pmu, int cpu)
|
|||
if (IS_ENABLED(CONFIG_32BIT))
|
||||
ret = sbi_ecall(SBI_EXT_PMU, SBI_EXT_PMU_SNAPSHOT_SET_SHMEM,
|
||||
cpu_hw_evt->snapshot_addr_phys,
|
||||
(u64)(cpu_hw_evt->snapshot_addr_phys) >> 32, 0, 0, 0, 0);
|
||||
(u64)(cpu_hw_evt->snapshot_addr_phys) >> 32,
|
||||
0);
|
||||
else
|
||||
ret = sbi_ecall(SBI_EXT_PMU, SBI_EXT_PMU_SNAPSHOT_SET_SHMEM,
|
||||
cpu_hw_evt->snapshot_addr_phys, 0, 0, 0, 0, 0);
|
||||
cpu_hw_evt->snapshot_addr_phys, 0, 0);
|
||||
|
||||
/* Free up the snapshot area memory and fall back to SBI PMU calls without snapshot */
|
||||
if (ret.error) {
|
||||
|
|
@ -783,14 +784,14 @@ static u64 pmu_sbi_ctr_read(struct perf_event *event)
|
|||
|
||||
if (pmu_sbi_is_fw_event(event)) {
|
||||
ret = sbi_ecall(SBI_EXT_PMU, SBI_EXT_PMU_COUNTER_FW_READ,
|
||||
hwc->idx, 0, 0, 0, 0, 0);
|
||||
hwc->idx);
|
||||
if (ret.error)
|
||||
return 0;
|
||||
|
||||
val = ret.value;
|
||||
if (IS_ENABLED(CONFIG_32BIT) && sbi_v2_available && info.width >= 32) {
|
||||
ret = sbi_ecall(SBI_EXT_PMU, SBI_EXT_PMU_COUNTER_FW_READ_HI,
|
||||
hwc->idx, 0, 0, 0, 0, 0);
|
||||
hwc->idx);
|
||||
if (!ret.error)
|
||||
val |= ((u64)ret.value << 32);
|
||||
else
|
||||
|
|
@ -833,10 +834,10 @@ static void pmu_sbi_ctr_start(struct perf_event *event, u64 ival)
|
|||
/* There is no benefit setting SNAPSHOT FLAG for a single counter */
|
||||
#if defined(CONFIG_32BIT)
|
||||
ret = sbi_ecall(SBI_EXT_PMU, SBI_EXT_PMU_COUNTER_START, hwc->idx,
|
||||
1, flag, ival, ival >> 32, 0);
|
||||
1, flag, ival, ival >> 32);
|
||||
#else
|
||||
ret = sbi_ecall(SBI_EXT_PMU, SBI_EXT_PMU_COUNTER_START, hwc->idx,
|
||||
1, flag, ival, 0, 0);
|
||||
1, flag, ival);
|
||||
#endif
|
||||
if (ret.error && (ret.error != SBI_ERR_ALREADY_STARTED))
|
||||
pr_err("Starting counter idx %d failed with error %d\n",
|
||||
|
|
@ -862,7 +863,8 @@ static void pmu_sbi_ctr_stop(struct perf_event *event, unsigned long flag)
|
|||
if (sbi_pmu_snapshot_available())
|
||||
flag |= SBI_PMU_STOP_FLAG_TAKE_SNAPSHOT;
|
||||
|
||||
ret = sbi_ecall(SBI_EXT_PMU, SBI_EXT_PMU_COUNTER_STOP, hwc->idx, 1, flag, 0, 0, 0);
|
||||
ret = sbi_ecall(SBI_EXT_PMU, SBI_EXT_PMU_COUNTER_STOP,
|
||||
hwc->idx, 1, flag);
|
||||
if (!ret.error && sbi_pmu_snapshot_available()) {
|
||||
/*
|
||||
* The counter snapshot is based on the index base specified by hwc->idx.
|
||||
|
|
@ -887,7 +889,7 @@ static int pmu_sbi_find_num_ctrs(void)
|
|||
{
|
||||
struct sbiret ret;
|
||||
|
||||
ret = sbi_ecall(SBI_EXT_PMU, SBI_EXT_PMU_NUM_COUNTERS, 0, 0, 0, 0, 0, 0);
|
||||
ret = sbi_ecall(SBI_EXT_PMU, SBI_EXT_PMU_NUM_COUNTERS);
|
||||
if (!ret.error)
|
||||
return ret.value;
|
||||
else
|
||||
|
|
@ -905,7 +907,7 @@ static int pmu_sbi_get_ctrinfo(int nctr, unsigned long *mask)
|
|||
return -ENOMEM;
|
||||
|
||||
for (i = 0; i < nctr; i++) {
|
||||
ret = sbi_ecall(SBI_EXT_PMU, SBI_EXT_PMU_COUNTER_GET_INFO, i, 0, 0, 0, 0, 0);
|
||||
ret = sbi_ecall(SBI_EXT_PMU, SBI_EXT_PMU_COUNTER_GET_INFO, i);
|
||||
if (ret.error)
|
||||
/* The logical counter ids are not expected to be contiguous */
|
||||
continue;
|
||||
|
|
@ -938,7 +940,7 @@ static inline void pmu_sbi_stop_all(struct riscv_pmu *pmu)
|
|||
continue;
|
||||
sbi_ecall(SBI_EXT_PMU, SBI_EXT_PMU_COUNTER_STOP,
|
||||
i * BITS_PER_LONG, pmu->cmask[i],
|
||||
SBI_PMU_STOP_FLAG_RESET, 0, 0, 0);
|
||||
SBI_PMU_STOP_FLAG_RESET);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -960,7 +962,7 @@ static inline void pmu_sbi_stop_hw_ctrs(struct riscv_pmu *pmu)
|
|||
for (i = 0; i < BITS_TO_LONGS(RISCV_MAX_COUNTERS); i++) {
|
||||
/* No need to check the error here as we can't do anything about the error */
|
||||
ret = sbi_ecall(SBI_EXT_PMU, SBI_EXT_PMU_COUNTER_STOP, i * BITS_PER_LONG,
|
||||
cpu_hw_evt->used_hw_ctrs[i], flag, 0, 0, 0);
|
||||
cpu_hw_evt->used_hw_ctrs[i], flag);
|
||||
if (!ret.error && sbi_pmu_snapshot_available()) {
|
||||
/* Save the counter values to avoid clobbering */
|
||||
for_each_set_bit(idx, &cpu_hw_evt->used_hw_ctrs[i], BITS_PER_LONG)
|
||||
|
|
@ -1002,7 +1004,7 @@ static inline void pmu_sbi_start_ovf_ctrs_sbi(struct cpu_hw_events *cpu_hw_evt,
|
|||
/* Start all the counters that did not overflow in a single shot */
|
||||
if (ctr_start_mask) {
|
||||
sbi_ecall(SBI_EXT_PMU, SBI_EXT_PMU_COUNTER_START, i * BITS_PER_LONG,
|
||||
ctr_start_mask, 0, 0, 0, 0);
|
||||
ctr_start_mask, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1014,11 +1016,11 @@ static inline void pmu_sbi_start_ovf_ctrs_sbi(struct cpu_hw_events *cpu_hw_evt,
|
|||
max_period = riscv_pmu_ctr_get_width_mask(event);
|
||||
init_val = local64_read(&hwc->prev_count) & max_period;
|
||||
#if defined(CONFIG_32BIT)
|
||||
sbi_ecall(SBI_EXT_PMU, SBI_EXT_PMU_COUNTER_START, idx, 1,
|
||||
flag, init_val, init_val >> 32, 0);
|
||||
sbi_ecall(SBI_EXT_PMU, SBI_EXT_PMU_COUNTER_START, idx,
|
||||
1, flag, init_val, init_val >> 32);
|
||||
#else
|
||||
sbi_ecall(SBI_EXT_PMU, SBI_EXT_PMU_COUNTER_START, idx, 1,
|
||||
flag, init_val, 0, 0);
|
||||
sbi_ecall(SBI_EXT_PMU, SBI_EXT_PMU_COUNTER_START, idx,
|
||||
1, flag, init_val);
|
||||
#endif
|
||||
perf_event_update_userpage(event);
|
||||
}
|
||||
|
|
@ -1057,8 +1059,9 @@ static inline void pmu_sbi_start_ovf_ctrs_snapshot(struct cpu_hw_events *cpu_hw_
|
|||
sdata->ctr_values[idx] =
|
||||
cpu_hw_evt->snapshot_cval_shcopy[idx + i * BITS_PER_LONG];
|
||||
/* Start all the counters in a single shot */
|
||||
sbi_ecall(SBI_EXT_PMU, SBI_EXT_PMU_COUNTER_START, idx * BITS_PER_LONG,
|
||||
cpu_hw_evt->used_hw_ctrs[i], flag, 0, 0, 0);
|
||||
sbi_ecall(SBI_EXT_PMU, SBI_EXT_PMU_COUNTER_START,
|
||||
idx * BITS_PER_LONG,
|
||||
cpu_hw_evt->used_hw_ctrs[i], flag);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user