Files
linux-nv-oot/drivers/misc/mods/mods_ipi.c
Chris Dragan 0ae09fcdd1 misc: mods: clean-up copyrights
It is unnecessary to spell out license text when we are using
SPDX license identifiers.

Change-Id: I902e18a413126f4dddb0cbb1fb5c0e0de385d2a1
Signed-off-by: Chris Dragan <kdragan@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/2892356
Reviewed-by: Laxman Dewangan <ldewangan@nvidia.com>
GVS: Gerrit_Virtual_Submit <buildbot_gerritrpt@nvidia.com>
2023-04-27 02:51:21 -07:00

78 lines
1.6 KiB
C

// SPDX-License-Identifier: GPL-2.0-only
/* Copyright (c) 2023, NVIDIA CORPORATION. All rights reserved. */
#include "mods_internal.h"
#include <asm/barrier.h>
#include <linux/cpu.h>
#include <linux/cpumask.h>
#include <linux/slab.h>
#include <linux/smp.h>
#define MAX_IPI_WFI_LOOPS 5
#define MAX_IPI_WFE_LOOPS 10
static void ipi_wfi_cpu(void *p)
{
struct MODS_SEND_IPI *p_ipi = (struct MODS_SEND_IPI *)p;
u32 i;
for (i = 0; i < p_ipi->num_loops; i++)
wfi();
}
static void ipi_wfe_cpu(void *p)
{
struct MODS_SEND_IPI *p_ipi = (struct MODS_SEND_IPI *)p;
u32 i;
for (i = 0; i < p_ipi->num_loops; i++)
wfe();
}
int esc_mods_send_ipi(struct mods_client *client, struct MODS_SEND_IPI *p)
{
LOG_ENT();
switch (p->ipi_type) {
case MODS_IPI_KICK: {
kick_all_cpus_sync();
break;
}
case MODS_IPI_WFI: {
if (p->num_loops > MAX_IPI_WFI_LOOPS) {
cl_error("num_loops %u exceed maximum limit %d for MODS_IPI_WFI\n",
p->num_loops,
MAX_IPI_WFI_LOOPS);
LOG_EXT();
return -EINVAL;
}
preempt_disable();
smp_call_function_many(cpu_online_mask, ipi_wfi_cpu, (void *)p, 1);
preempt_enable();
break;
}
case MODS_IPI_WFE: {
if (p->num_loops > MAX_IPI_WFE_LOOPS) {
cl_error("num_loops %u exceed maximum limit %d for MODS_IPI_WFE\n",
p->num_loops,
MAX_IPI_WFE_LOOPS);
LOG_EXT();
return -EINVAL;
}
preempt_disable();
smp_call_function_many(cpu_online_mask, ipi_wfe_cpu, (void *)p, 1);
preempt_enable();
break;
}
default: {
cl_error("unsupported MODS_IPI_TYPE\n");
LOG_EXT();
return -EINVAL;
}
}
LOG_EXT();
return 0;
}