From a7810cdbaccd26600241d6104197567d23a9aba3 Mon Sep 17 00:00:00 2001 From: Chris Dragan Date: Wed, 6 Sep 2023 22:04:09 -0700 Subject: [PATCH] misc: mods: update from Perforce to 4.21 Bug 4165184 Change-Id: I6b548008b21024d8e322c5a1ca1f98fbc5b389a2 Signed-off-by: Chris Dragan Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/2975467 Reviewed-by: Bharat Nihalani GVS: Gerrit_Virtual_Submit --- drivers/misc/mods/mods_krnl.c | 37 +++++++++++++++++++++++++++++++++++ include/uapi/misc/mods.h | 15 +++++++++++++- 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/drivers/misc/mods/mods_krnl.c b/drivers/misc/mods/mods_krnl.c index 7de9bf20..d7a623db 100644 --- a/drivers/misc/mods/mods_krnl.c +++ b/drivers/misc/mods/mods_krnl.c @@ -1953,6 +1953,38 @@ static int esc_mods_write_msr(struct mods_client *client, struct MODS_MSR *p) } #endif +#if defined(CONFIG_ARM) || defined(CONFIG_ARM64) +static int esc_mods_idle(struct mods_client *client, struct MODS_IDLE *p) +{ + u32 i; + + LOG_ENT(); + + switch (p->idle_method) { + + case MODS_IDLE_METHOD_ARM_WFI: + dsb(st); + for (i = 0; i < p->num_loops; i++) + wfi(); + break; + + case MODS_IDLE_METHOD_ARM_WFE: + dsb(st); + for (i = 0; i < p->num_loops; i++) + wfe(); + break; + + default: + cl_error("unsupported idle method %u\n", p->idle_method); + LOG_EXT(); + return -EINVAL; + } + + LOG_EXT(); + return OK; +} +#endif + static int esc_mods_get_driver_stats(struct mods_client *client, struct MODS_GET_DRIVER_STATS *p) { @@ -2661,6 +2693,11 @@ static long mods_krnl_ioctl(struct file *fp, MODS_FLUSH_CPU_CACHE_RANGE); break; #endif +#if defined(CONFIG_ARM) || defined(CONFIG_ARM64) + case MODS_ESC_IDLE: + MODS_IOCTL_NORETVAL(MODS_ESC_IDLE, esc_mods_idle, MODS_IDLE); + break; +#endif #if defined(MODS_HAS_TEGRA) && defined(CONFIG_DMA_SHARED_BUFFER) case MODS_ESC_DMABUF_GET_PHYSICAL_ADDRESS: MODS_IOCTL(MODS_ESC_DMABUF_GET_PHYSICAL_ADDRESS, diff --git a/include/uapi/misc/mods.h b/include/uapi/misc/mods.h index b1c99615..18618a60 100644 --- a/include/uapi/misc/mods.h +++ b/include/uapi/misc/mods.h @@ -8,7 +8,7 @@ /* Driver version */ #define MODS_DRIVER_VERSION_MAJOR 4 -#define MODS_DRIVER_VERSION_MINOR 20 +#define MODS_DRIVER_VERSION_MINOR 21 #define MODS_DRIVER_VERSION ((MODS_DRIVER_VERSION_MAJOR << 8) | \ ((MODS_DRIVER_VERSION_MINOR / 10) << 4) | \ (MODS_DRIVER_VERSION_MINOR % 10)) @@ -1935,6 +1935,18 @@ struct MODS_BPMP_UPHY_LANE_EOM_SCAN_PARAMS { __u32 data; }; +#define MODS_IDLE_METHOD_ARM_WFI 0 +#define MODS_IDLE_METHOD_ARM_WFE 1 + +/* Used by MODS_ESC_IDLE + * + * Idles the calling CPU. + */ +struct MODS_IDLE { + __u32 idle_method; + __u32 num_loops; +}; + #pragma pack(pop) #define MODS_IOC_MAGIC 'x' @@ -2151,5 +2163,6 @@ struct MODS_BPMP_UPHY_LANE_EOM_SCAN_PARAMS { #define MODS_ESC_FFA_CMD MODSIO(WR, 145, MODS_FFA_PARAMS) #define MODS_ESC_BPMP_UPHY_LANE_EOM_SCAN MODSIO(WR, 146, \ MODS_BPMP_UPHY_LANE_EOM_SCAN_PARAMS) +#define MODS_ESC_IDLE MODSIO(W, 147, MODS_IDLE) #endif /* _UAPI_MODS_H_ */