diff --git a/drivers/misc/mods/mods_config.h b/drivers/misc/mods/mods_config.h index 1f80911b..9edf9ef6 100644 --- a/drivers/misc/mods/mods_config.h +++ b/drivers/misc/mods/mods_config.h @@ -100,10 +100,6 @@ # define MODS_PCIE_FLR_HAS_ERR #endif -#if defined(CONFIG_ARM64) && KERNEL_VERSION(5, 10, 0) <= MODS_KERNEL_VERSION -# define MODS_HAS_ARM64_READ_FTR_REG 1 -#endif - #if KERNEL_VERSION(5, 17, 0) <= MODS_KERNEL_VERSION # define MODS_HAS_ACPI_FETCH 1 #endif diff --git a/drivers/misc/mods/mods_mem.c b/drivers/misc/mods/mods_mem.c index 54799a0f..604c3ed6 100644 --- a/drivers/misc/mods/mods_mem.c +++ b/drivers/misc/mods/mods_mem.c @@ -2246,18 +2246,25 @@ static void clear_contiguous_cache(struct mods_client *client, { u64 end = virt_start + size; u64 cur; - u32 d_line_shift = 4; /* Fallback for kernel 5.9 or older */ u64 d_size; + static u32 d_line_shift; -#ifdef MODS_HAS_ARM64_READ_FTR_REG - { + if (!d_line_shift) { +#if KERNEL_VERSION(5, 10, 0) <= MODS_KERNEL_VERSION const u64 ctr_el0 = read_sanitised_ftr_reg(SYS_CTR_EL0); - - d_line_shift = cpuid_feature_extract_unsigned_field(ctr_el0, - CTR_DMINLINE_SHIFT); - } +#if KERNEL_VERSION(6, 0, 0) <= MODS_KERNEL_VERSION + const int field = CTR_EL0_DminLine_SHIFT; +#else + const int field = CTR_DMINLINE_SHIFT; #endif + d_line_shift = + cpuid_feature_extract_unsigned_field(ctr_el0, field); +#else + d_line_shift = 4; /* Fallback for kernel 5.9 or older */ +#endif + } + d_size = (u64)4 << d_line_shift; cur = virt_start & ~(d_size - 1); do {