Merge remote-tracking branch 'sm8250/lineage-20' into lineage-22.1
* sm8250/lineage-20: Revert "ANDROID: modpost: add an exception for CFI stubs" ANDROID: Update CFI patchset from android11-5.4 ANDROID: adding __nocfi to cpuidle_enter_state ANDROID: arm64: Fix the address of ftrace_call compiled with CFI_CLANG ANDROID: arm64: add __va_function arm64: bpf: Don't use module memory for the BPF JIT CFI check. arm64/bpf: don't allocate BPF JIT programs in module memory bpf: add __weak hook for allocating executable memory clk/qcom/clk-alpha-pll: Fix pll post div mask when width is not set bpf: Use dedicated bpf_trace_printk event instead of trace_printk() BACKPORT: audio-kernel: Disable clock voting logs msm: kgsl: introduce CONFIG_CORESIGHT_ADRENO. Change-Id: I6ea6bdae1d2efa2be9620b5f68d9ae7e78dcdf4a
This commit is contained in:
32 files changed
+230
-260
No files matched your search
@@ -40,9 +40,9 @@
|
|||||||
/* Translate a kernel address of @sym into its equivalent linear mapping */
|
/* Translate a kernel address of @sym into its equivalent linear mapping */
|
||||||
#define kvm_ksym_ref(sym) \
|
#define kvm_ksym_ref(sym) \
|
||||||
({ \
|
({ \
|
||||||
void *val = &sym; \
|
void *val = __va_function(sym); \
|
||||||
if (!is_kernel_in_hyp_mode()) \
|
if (!is_kernel_in_hyp_mode()) \
|
||||||
val = lm_alias(&sym); \
|
val = lm_alias(val); \
|
||||||
val; \
|
val; \
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -62,8 +62,11 @@
|
|||||||
#define PAGE_OFFSET (UL(0xffffffffffffffff) - \
|
#define PAGE_OFFSET (UL(0xffffffffffffffff) - \
|
||||||
(UL(1) << (VA_BITS - 1)) + 1)
|
(UL(1) << (VA_BITS - 1)) + 1)
|
||||||
#define KIMAGE_VADDR (MODULES_END)
|
#define KIMAGE_VADDR (MODULES_END)
|
||||||
|
#define BPF_JIT_REGION_START (VA_START + KASAN_SHADOW_SIZE)
|
||||||
|
#define BPF_JIT_REGION_SIZE (SZ_128M)
|
||||||
|
#define BPF_JIT_REGION_END (BPF_JIT_REGION_START + BPF_JIT_REGION_SIZE)
|
||||||
#define MODULES_END (MODULES_VADDR + MODULES_VSIZE)
|
#define MODULES_END (MODULES_VADDR + MODULES_VSIZE)
|
||||||
#define MODULES_VADDR (VA_START + KASAN_SHADOW_SIZE)
|
#define MODULES_VADDR (BPF_JIT_REGION_END)
|
||||||
#define MODULES_VSIZE (SZ_128M)
|
#define MODULES_VSIZE (SZ_128M)
|
||||||
#define VMEMMAP_START (PAGE_OFFSET - VMEMMAP_SIZE)
|
#define VMEMMAP_START (PAGE_OFFSET - VMEMMAP_SIZE)
|
||||||
#define PCI_IO_END (VMEMMAP_START - SZ_2M)
|
#define PCI_IO_END (VMEMMAP_START - SZ_2M)
|
||||||
@@ -323,13 +326,15 @@ static inline void *phys_to_virt(phys_addr_t x)
|
|||||||
* virtual address. Therefore, use inline assembly to ensure we are
|
* virtual address. Therefore, use inline assembly to ensure we are
|
||||||
* always taking the address of the actual function.
|
* always taking the address of the actual function.
|
||||||
*/
|
*/
|
||||||
#define __pa_function(x) ({ \
|
#define __va_function(x) ({ \
|
||||||
unsigned long addr; \
|
void *addr; \
|
||||||
asm("adrp %0, " __stringify(x) "\n\t" \
|
asm("adrp %0, " __stringify(x) "\n\t" \
|
||||||
"add %0, %0, :lo12:" __stringify(x) : "=r" (addr)); \
|
"add %0, %0, :lo12:" __stringify(x) : "=r" (addr)); \
|
||||||
__pa_symbol(addr); \
|
addr; \
|
||||||
})
|
})
|
||||||
|
|
||||||
|
#define __pa_function(x) __pa_symbol(__va_function(x))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* virt_to_page(k) convert a _valid_ virtual address to struct page *
|
* virt_to_page(k) convert a _valid_ virtual address to struct page *
|
||||||
* virt_addr_valid(k) indicates whether a virtual address is valid
|
* virt_addr_valid(k) indicates whether a virtual address is valid
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
void __cpu_soft_restart(unsigned long el2_switch, unsigned long entry,
|
void __cpu_soft_restart(unsigned long el2_switch, unsigned long entry,
|
||||||
unsigned long arg0, unsigned long arg1, unsigned long arg2);
|
unsigned long arg0, unsigned long arg1, unsigned long arg2);
|
||||||
|
|
||||||
static inline void __noreturn cpu_soft_restart(unsigned long entry,
|
static inline void __noreturn __nocfi cpu_soft_restart(unsigned long entry,
|
||||||
unsigned long arg0,
|
unsigned long arg0,
|
||||||
unsigned long arg1,
|
unsigned long arg1,
|
||||||
unsigned long arg2)
|
unsigned long arg2)
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ int ftrace_update_ftrace_func(ftrace_func_t func)
|
|||||||
unsigned long pc;
|
unsigned long pc;
|
||||||
u32 new;
|
u32 new;
|
||||||
|
|
||||||
pc = (unsigned long)&ftrace_call;
|
pc = (unsigned long)__va_function(ftrace_call);
|
||||||
new = aarch64_insn_gen_branch_imm(pc, (unsigned long)func,
|
new = aarch64_insn_gen_branch_imm(pc, (unsigned long)func,
|
||||||
AARCH64_INSN_BRANCH_LINK);
|
AARCH64_INSN_BRANCH_LINK);
|
||||||
|
|
||||||
|
|||||||
@@ -964,24 +964,26 @@ out:
|
|||||||
return prog;
|
return prog;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void *bpf_jit_alloc_exec(unsigned long size)
|
||||||
|
{
|
||||||
|
return __vmalloc_node_range(size, PAGE_SIZE, BPF_JIT_REGION_START,
|
||||||
|
BPF_JIT_REGION_END, GFP_KERNEL,
|
||||||
|
PAGE_KERNEL_EXEC, 0, NUMA_NO_NODE,
|
||||||
|
__builtin_return_address(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
void bpf_jit_free_exec(void *addr)
|
||||||
|
{
|
||||||
|
return vfree(addr);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_CFI_CLANG
|
#ifdef CONFIG_CFI_CLANG
|
||||||
bool arch_bpf_jit_check_func(const struct bpf_prog *prog)
|
bool arch_bpf_jit_check_func(const struct bpf_prog *prog)
|
||||||
{
|
{
|
||||||
const uintptr_t func = (const uintptr_t)prog->bpf_func;
|
const uintptr_t func = (const uintptr_t)prog->bpf_func;
|
||||||
|
|
||||||
/*
|
/* bpf_func must be correctly aligned and within the BPF JIT region */
|
||||||
* bpf_func must be correctly aligned and within the correct region.
|
return (func >= BPF_JIT_REGION_START && func < BPF_JIT_REGION_END &&
|
||||||
* module_alloc places JIT code in the module region, unless
|
IS_ALIGNED(func, sizeof(u32)));
|
||||||
* ARM64_MODULE_PLTS is enabled, in which case we might end up using
|
|
||||||
* the vmalloc region too.
|
|
||||||
*/
|
|
||||||
if (unlikely(!IS_ALIGNED(func, sizeof(u32))))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (IS_ENABLED(CONFIG_ARM64_MODULE_PLTS) &&
|
|
||||||
is_vmalloc_addr(prog->bpf_func))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return (func >= MODULES_VADDR && func < MODULES_END);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -44,7 +44,7 @@
|
|||||||
|
|
||||||
#define PLL_USER_CTL(p) ((p)->offset + (p)->regs[PLL_OFF_USER_CTL])
|
#define PLL_USER_CTL(p) ((p)->offset + (p)->regs[PLL_OFF_USER_CTL])
|
||||||
#define PLL_POST_DIV_SHIFT 8
|
#define PLL_POST_DIV_SHIFT 8
|
||||||
#define PLL_POST_DIV_MASK(p) GENMASK((p)->width - 1, 0)
|
#define PLL_POST_DIV_MASK(p) GENMASK((p)->width ? (p)->width - 1 : 3, 0)
|
||||||
#define PLL_ALPHA_EN BIT(24)
|
#define PLL_ALPHA_EN BIT(24)
|
||||||
#define PLL_ALPHA_MODE BIT(25)
|
#define PLL_ALPHA_MODE BIT(25)
|
||||||
#define PLL_VCO_SHIFT 20
|
#define PLL_VCO_SHIFT 20
|
||||||
|
|||||||
@@ -199,7 +199,7 @@ int cpuidle_enter_s2idle(struct cpuidle_driver *drv, struct cpuidle_device *dev)
|
|||||||
* @drv: cpuidle driver for this cpu
|
* @drv: cpuidle driver for this cpu
|
||||||
* @index: index into the states table in @drv of the state to enter
|
* @index: index into the states table in @drv of the state to enter
|
||||||
*/
|
*/
|
||||||
int cpuidle_enter_state(struct cpuidle_device *dev, struct cpuidle_driver *drv,
|
int __nocfi cpuidle_enter_state(struct cpuidle_device *dev, struct cpuidle_driver *drv,
|
||||||
int index)
|
int index)
|
||||||
{
|
{
|
||||||
int entered_state;
|
int entered_state;
|
||||||
|
|||||||
@@ -26,3 +26,7 @@ config QCOM_ADRENO_DEFAULT_GOVERNOR
|
|||||||
config QCOM_KGSL_IOMMU
|
config QCOM_KGSL_IOMMU
|
||||||
bool
|
bool
|
||||||
default y if QCOM_KGSL && (MSM_IOMMU || ARM_SMMU)
|
default y if QCOM_KGSL && (MSM_IOMMU || ARM_SMMU)
|
||||||
|
|
||||||
|
config CORESIGHT_ADRENO
|
||||||
|
bool
|
||||||
|
default y if QCOM_KGSL=y && CORESIGHT=y
|
||||||
@@ -31,7 +31,6 @@ msm_adreno-y += \
|
|||||||
adreno_drawctxt.o \
|
adreno_drawctxt.o \
|
||||||
adreno_dispatch.o \
|
adreno_dispatch.o \
|
||||||
adreno_snapshot.o \
|
adreno_snapshot.o \
|
||||||
adreno_coresight.o \
|
|
||||||
adreno_trace.o \
|
adreno_trace.o \
|
||||||
adreno_a3xx.o \
|
adreno_a3xx.o \
|
||||||
adreno_a5xx.o \
|
adreno_a5xx.o \
|
||||||
@@ -51,6 +50,7 @@ msm_adreno-y += \
|
|||||||
msm_adreno-$(CONFIG_QCOM_KGSL_IOMMU) += adreno_iommu.o
|
msm_adreno-$(CONFIG_QCOM_KGSL_IOMMU) += adreno_iommu.o
|
||||||
msm_adreno-$(CONFIG_DEBUG_FS) += adreno_debugfs.o adreno_profile.o
|
msm_adreno-$(CONFIG_DEBUG_FS) += adreno_debugfs.o adreno_profile.o
|
||||||
msm_adreno-$(CONFIG_COMPAT) += adreno_compat.o
|
msm_adreno-$(CONFIG_COMPAT) += adreno_compat.o
|
||||||
|
msm_adreno-$(CONFIG_CORESIGHT_ADRENO) += adreno_coresight.o
|
||||||
|
|
||||||
msm_kgsl_core-objs = $(msm_kgsl_core-y)
|
msm_kgsl_core-objs = $(msm_kgsl_core-y)
|
||||||
msm_adreno-objs = $(msm_adreno-y)
|
msm_adreno-objs = $(msm_adreno-y)
|
||||||
|
|||||||
@@ -806,6 +806,7 @@ struct adreno_coresight_attr {
|
|||||||
struct adreno_coresight_register *reg;
|
struct adreno_coresight_register *reg;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if IS_ENABLED(CONFIG_CORESIGHT_ADRENO)
|
||||||
ssize_t adreno_coresight_show_register(struct device *device,
|
ssize_t adreno_coresight_show_register(struct device *device,
|
||||||
struct device_attribute *attr, char *buf);
|
struct device_attribute *attr, char *buf);
|
||||||
|
|
||||||
@@ -818,6 +819,12 @@ ssize_t adreno_coresight_store_register(struct device *dev,
|
|||||||
adreno_coresight_show_register, \
|
adreno_coresight_show_register, \
|
||||||
adreno_coresight_store_register), \
|
adreno_coresight_store_register), \
|
||||||
(_reg), }
|
(_reg), }
|
||||||
|
#else
|
||||||
|
#define ADRENO_CORESIGHT_ATTR(_attrname, _reg) \
|
||||||
|
struct adreno_coresight_attr coresight_attr_##_attrname = { \
|
||||||
|
__ATTR_NULL, \
|
||||||
|
(_reg), }
|
||||||
|
#endif /* CONFIG_CORESIGHT_ADRENO */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct adreno_coresight - GPU specific coresight definition
|
* struct adreno_coresight - GPU specific coresight definition
|
||||||
@@ -1089,12 +1096,22 @@ void adreno_fault_skipcmd_detached(struct adreno_device *adreno_dev,
|
|||||||
struct adreno_context *drawctxt,
|
struct adreno_context *drawctxt,
|
||||||
struct kgsl_drawobj *drawobj);
|
struct kgsl_drawobj *drawobj);
|
||||||
|
|
||||||
|
#if IS_ENABLED(CONFIG_CORESIGHT_ADRENO)
|
||||||
int adreno_coresight_init(struct adreno_device *adreno_dev);
|
int adreno_coresight_init(struct adreno_device *adreno_dev);
|
||||||
|
|
||||||
void adreno_coresight_start(struct adreno_device *adreno_dev);
|
void adreno_coresight_start(struct adreno_device *adreno_dev);
|
||||||
void adreno_coresight_stop(struct adreno_device *adreno_dev);
|
void adreno_coresight_stop(struct adreno_device *adreno_dev);
|
||||||
|
|
||||||
void adreno_coresight_remove(struct adreno_device *adreno_dev);
|
void adreno_coresight_remove(struct adreno_device *adreno_dev);
|
||||||
|
#else
|
||||||
|
static inline int adreno_coresight_init(struct adreno_device *adreno_dev)
|
||||||
|
{
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
static inline void adreno_coresight_start(struct adreno_device *adreno_dev) { }
|
||||||
|
static inline void adreno_coresight_stop(struct adreno_device *adreno_dev) { }
|
||||||
|
static inline void adreno_coresight_remove(struct adreno_device *adreno_dev) { }
|
||||||
|
#endif /* CONFIG_CORESIGHT_ADRENO */
|
||||||
|
|
||||||
bool adreno_hw_isidle(struct adreno_device *adreno_dev);
|
bool adreno_hw_isidle(struct adreno_device *adreno_dev);
|
||||||
|
|
||||||
|
|||||||
+8
-2
@@ -1,3 +1,9 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
/*
|
||||||
|
* Clang Control Flow Integrity (CFI) support.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2019 Google LLC
|
||||||
|
*/
|
||||||
#ifndef _LINUX_CFI_H
|
#ifndef _LINUX_CFI_H
|
||||||
#define _LINUX_CFI_H
|
#define _LINUX_CFI_H
|
||||||
|
|
||||||
@@ -6,13 +12,13 @@
|
|||||||
#ifdef CONFIG_CFI_CLANG
|
#ifdef CONFIG_CFI_CLANG
|
||||||
#ifdef CONFIG_MODULES
|
#ifdef CONFIG_MODULES
|
||||||
|
|
||||||
typedef void (*cfi_check_fn)(uint64_t, void *, void *);
|
typedef void (*cfi_check_fn)(uint64_t id, void *ptr, void *diag);
|
||||||
|
|
||||||
/* Compiler-generated function in each module, and the kernel */
|
/* Compiler-generated function in each module, and the kernel */
|
||||||
#define CFI_CHECK_FN __cfi_check
|
#define CFI_CHECK_FN __cfi_check
|
||||||
#define CFI_CHECK_FN_NAME __stringify(CFI_CHECK_FN)
|
#define CFI_CHECK_FN_NAME __stringify(CFI_CHECK_FN)
|
||||||
|
|
||||||
extern void CFI_CHECK_FN(uint64_t, void *, void *);
|
extern void CFI_CHECK_FN(uint64_t id, void *ptr, void *diag);
|
||||||
|
|
||||||
#ifdef CONFIG_CFI_CLANG_SHADOW
|
#ifdef CONFIG_CFI_CLANG_SHADOW
|
||||||
extern void cfi_module_add(struct module *mod, unsigned long min_addr,
|
extern void cfi_module_add(struct module *mod, unsigned long min_addr,
|
||||||
|
|||||||
@@ -49,7 +49,7 @@
|
|||||||
__attribute__((__assume_aligned__(a, ## __VA_ARGS__)))
|
__attribute__((__assume_aligned__(a, ## __VA_ARGS__)))
|
||||||
|
|
||||||
#ifdef CONFIG_CFI_CLANG
|
#ifdef CONFIG_CFI_CLANG
|
||||||
#define __nocfi __attribute__((no_sanitize("cfi")))
|
#define __nocfi __attribute__((__no_sanitize__("cfi")))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_LTO_CLANG
|
#ifdef CONFIG_LTO_CLANG
|
||||||
|
|||||||
+12
-2
@@ -627,6 +627,16 @@ static void bpf_jit_uncharge_modmem(u32 pages)
|
|||||||
atomic_long_sub(pages, &bpf_jit_current);
|
atomic_long_sub(pages, &bpf_jit_current);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void *__weak bpf_jit_alloc_exec(unsigned long size)
|
||||||
|
{
|
||||||
|
return module_alloc(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
void __weak bpf_jit_free_exec(void *addr)
|
||||||
|
{
|
||||||
|
module_memfree(addr);
|
||||||
|
}
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_BPF_JIT) && IS_ENABLED(CONFIG_CFI_CLANG)
|
#if IS_ENABLED(CONFIG_BPF_JIT) && IS_ENABLED(CONFIG_CFI_CLANG)
|
||||||
bool __weak arch_bpf_jit_check_func(const struct bpf_prog *prog)
|
bool __weak arch_bpf_jit_check_func(const struct bpf_prog *prog)
|
||||||
{
|
{
|
||||||
@@ -652,7 +662,7 @@ bpf_jit_binary_alloc(unsigned int proglen, u8 **image_ptr,
|
|||||||
|
|
||||||
if (bpf_jit_charge_modmem(pages))
|
if (bpf_jit_charge_modmem(pages))
|
||||||
return NULL;
|
return NULL;
|
||||||
hdr = module_alloc(size);
|
hdr = bpf_jit_alloc_exec(size);
|
||||||
if (!hdr) {
|
if (!hdr) {
|
||||||
bpf_jit_uncharge_modmem(pages);
|
bpf_jit_uncharge_modmem(pages);
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -677,7 +687,7 @@ void bpf_jit_binary_free(struct bpf_binary_header *hdr)
|
|||||||
{
|
{
|
||||||
u32 pages = hdr->pages;
|
u32 pages = hdr->pages;
|
||||||
|
|
||||||
module_memfree(hdr);
|
bpf_jit_free_exec(hdr);
|
||||||
bpf_jit_uncharge_modmem(pages);
|
bpf_jit_uncharge_modmem(pages);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+45
-34
@@ -1,16 +1,17 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
/*
|
/*
|
||||||
* CFI (Control Flow Integrity) error and slowpath handling
|
* Clang Control Flow Integrity (CFI) error and slowpath handling.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2017 Google, Inc.
|
* Copyright (C) 2019 Google LLC
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/gfp.h>
|
#include <linux/gfp.h>
|
||||||
|
#include <linux/hardirq.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
#include <linux/mutex.h>
|
||||||
#include <linux/printk.h>
|
#include <linux/printk.h>
|
||||||
#include <linux/ratelimit.h>
|
#include <linux/ratelimit.h>
|
||||||
#include <linux/rcupdate.h>
|
#include <linux/rcupdate.h>
|
||||||
#include <linux/spinlock.h>
|
|
||||||
#include <asm/bug.h>
|
|
||||||
#include <asm/cacheflush.h>
|
#include <asm/cacheflush.h>
|
||||||
#include <asm/set_memory.h>
|
#include <asm/set_memory.h>
|
||||||
|
|
||||||
@@ -25,12 +26,10 @@
|
|||||||
|
|
||||||
static inline void handle_cfi_failure(void *ptr)
|
static inline void handle_cfi_failure(void *ptr)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_CFI_PERMISSIVE
|
if (IS_ENABLED(CONFIG_CFI_PERMISSIVE))
|
||||||
WARN_RATELIMIT(1, "CFI failure (target: %pF):\n", ptr);
|
WARN_RATELIMIT(1, "CFI failure (target: %pS):\n", ptr);
|
||||||
#else
|
else
|
||||||
pr_err("CFI failure (target: %pF):\n", ptr);
|
panic("CFI failure (target: %pS)\n", ptr);
|
||||||
BUG();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_MODULES
|
#ifdef CONFIG_MODULES
|
||||||
@@ -44,7 +43,7 @@ struct shadow_range {
|
|||||||
unsigned long max_page;
|
unsigned long max_page;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define SHADOW_ORDER 1
|
#define SHADOW_ORDER 2
|
||||||
#define SHADOW_PAGES (1 << SHADOW_ORDER)
|
#define SHADOW_PAGES (1 << SHADOW_ORDER)
|
||||||
#define SHADOW_SIZE \
|
#define SHADOW_SIZE \
|
||||||
((SHADOW_PAGES * PAGE_SIZE - sizeof(struct shadow_range)) / sizeof(u16))
|
((SHADOW_PAGES * PAGE_SIZE - sizeof(struct shadow_range)) / sizeof(u16))
|
||||||
@@ -57,8 +56,8 @@ struct cfi_shadow {
|
|||||||
u16 shadow[SHADOW_SIZE];
|
u16 shadow[SHADOW_SIZE];
|
||||||
};
|
};
|
||||||
|
|
||||||
static DEFINE_SPINLOCK(shadow_update_lock);
|
static DEFINE_MUTEX(shadow_update_lock);
|
||||||
static struct cfi_shadow __rcu *cfi_shadow __read_mostly = NULL;
|
static struct cfi_shadow __rcu *cfi_shadow __read_mostly;
|
||||||
|
|
||||||
static inline int ptr_to_shadow(const struct cfi_shadow *s, unsigned long ptr)
|
static inline int ptr_to_shadow(const struct cfi_shadow *s, unsigned long ptr)
|
||||||
{
|
{
|
||||||
@@ -79,7 +78,8 @@ static inline int ptr_to_shadow(const struct cfi_shadow *s, unsigned long ptr)
|
|||||||
static inline unsigned long shadow_to_ptr(const struct cfi_shadow *s,
|
static inline unsigned long shadow_to_ptr(const struct cfi_shadow *s,
|
||||||
int index)
|
int index)
|
||||||
{
|
{
|
||||||
BUG_ON(index < 0 || index >= SHADOW_SIZE);
|
if (unlikely(index < 0 || index >= SHADOW_SIZE))
|
||||||
|
return 0;
|
||||||
|
|
||||||
if (unlikely(s->shadow[index] == SHADOW_INVALID))
|
if (unlikely(s->shadow[index] == SHADOW_INVALID))
|
||||||
return 0;
|
return 0;
|
||||||
@@ -90,7 +90,8 @@ static inline unsigned long shadow_to_ptr(const struct cfi_shadow *s,
|
|||||||
static inline unsigned long shadow_to_page(const struct cfi_shadow *s,
|
static inline unsigned long shadow_to_page(const struct cfi_shadow *s,
|
||||||
int index)
|
int index)
|
||||||
{
|
{
|
||||||
BUG_ON(index < 0 || index >= SHADOW_SIZE);
|
if (unlikely(index < 0 || index >= SHADOW_SIZE))
|
||||||
|
return 0;
|
||||||
|
|
||||||
return (s->r.min_page + index) << PAGE_SHIFT;
|
return (s->r.min_page + index) << PAGE_SHIFT;
|
||||||
}
|
}
|
||||||
@@ -138,7 +139,8 @@ static void add_module_to_shadow(struct cfi_shadow *s, struct module *mod)
|
|||||||
unsigned long check = (unsigned long)mod->cfi_check;
|
unsigned long check = (unsigned long)mod->cfi_check;
|
||||||
int check_index = ptr_to_shadow(s, check);
|
int check_index = ptr_to_shadow(s, check);
|
||||||
|
|
||||||
BUG_ON((check & PAGE_MASK) != check); /* Must be page aligned */
|
if (unlikely((check & PAGE_MASK) != check))
|
||||||
|
return; /* Must be page aligned */
|
||||||
|
|
||||||
if (check_index < 0)
|
if (check_index < 0)
|
||||||
return; /* Module not addressable with shadow */
|
return; /* Module not addressable with shadow */
|
||||||
@@ -151,9 +153,10 @@ static void add_module_to_shadow(struct cfi_shadow *s, struct module *mod)
|
|||||||
/* For each page, store the check function index in the shadow */
|
/* For each page, store the check function index in the shadow */
|
||||||
for (ptr = min_page_addr; ptr <= max_page_addr; ptr += PAGE_SIZE) {
|
for (ptr = min_page_addr; ptr <= max_page_addr; ptr += PAGE_SIZE) {
|
||||||
int index = ptr_to_shadow(s, ptr);
|
int index = ptr_to_shadow(s, ptr);
|
||||||
|
|
||||||
if (index >= 0) {
|
if (index >= 0) {
|
||||||
/* Assume a page only contains code for one module */
|
/* Each page must only contain one module */
|
||||||
BUG_ON(s->shadow[index] != SHADOW_INVALID);
|
WARN_ON(s->shadow[index] != SHADOW_INVALID);
|
||||||
s->shadow[index] = (u16)check_index;
|
s->shadow[index] = (u16)check_index;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -172,6 +175,7 @@ static void remove_module_from_shadow(struct cfi_shadow *s, struct module *mod)
|
|||||||
|
|
||||||
for (ptr = min_page_addr; ptr <= max_page_addr; ptr += PAGE_SIZE) {
|
for (ptr = min_page_addr; ptr <= max_page_addr; ptr += PAGE_SIZE) {
|
||||||
int index = ptr_to_shadow(s, ptr);
|
int index = ptr_to_shadow(s, ptr);
|
||||||
|
|
||||||
if (index >= 0)
|
if (index >= 0)
|
||||||
s->shadow[index] = SHADOW_INVALID;
|
s->shadow[index] = SHADOW_INVALID;
|
||||||
}
|
}
|
||||||
@@ -186,14 +190,12 @@ static void update_shadow(struct module *mod, unsigned long min_addr,
|
|||||||
struct cfi_shadow *next = (struct cfi_shadow *)
|
struct cfi_shadow *next = (struct cfi_shadow *)
|
||||||
__get_free_pages(GFP_KERNEL, SHADOW_ORDER);
|
__get_free_pages(GFP_KERNEL, SHADOW_ORDER);
|
||||||
|
|
||||||
BUG_ON(!next);
|
|
||||||
|
|
||||||
next->r.mod_min_addr = min_addr;
|
next->r.mod_min_addr = min_addr;
|
||||||
next->r.mod_max_addr = max_addr;
|
next->r.mod_max_addr = max_addr;
|
||||||
next->r.min_page = min_addr >> PAGE_SHIFT;
|
next->r.min_page = min_addr >> PAGE_SHIFT;
|
||||||
next->r.max_page = max_addr >> PAGE_SHIFT;
|
next->r.max_page = max_addr >> PAGE_SHIFT;
|
||||||
|
|
||||||
spin_lock(&shadow_update_lock);
|
mutex_lock(&shadow_update_lock);
|
||||||
prev = rcu_dereference_protected(cfi_shadow, 1);
|
prev = rcu_dereference_protected(cfi_shadow, 1);
|
||||||
prepare_next_shadow(prev, next);
|
prepare_next_shadow(prev, next);
|
||||||
|
|
||||||
@@ -201,7 +203,7 @@ static void update_shadow(struct module *mod, unsigned long min_addr,
|
|||||||
set_memory_ro((unsigned long)next, SHADOW_PAGES);
|
set_memory_ro((unsigned long)next, SHADOW_PAGES);
|
||||||
rcu_assign_pointer(cfi_shadow, next);
|
rcu_assign_pointer(cfi_shadow, next);
|
||||||
|
|
||||||
spin_unlock(&shadow_update_lock);
|
mutex_unlock(&shadow_update_lock);
|
||||||
synchronize_rcu();
|
synchronize_rcu();
|
||||||
|
|
||||||
if (prev) {
|
if (prev) {
|
||||||
@@ -245,33 +247,36 @@ static inline cfi_check_fn ptr_to_check_fn(const struct cfi_shadow __rcu *s,
|
|||||||
|
|
||||||
static inline cfi_check_fn find_module_cfi_check(void *ptr)
|
static inline cfi_check_fn find_module_cfi_check(void *ptr)
|
||||||
{
|
{
|
||||||
|
cfi_check_fn f = CFI_CHECK_FN;
|
||||||
struct module *mod;
|
struct module *mod;
|
||||||
|
|
||||||
preempt_disable();
|
preempt_disable();
|
||||||
mod = __module_address((unsigned long)ptr);
|
mod = __module_address((unsigned long)ptr);
|
||||||
|
if (mod)
|
||||||
|
f = mod->cfi_check;
|
||||||
preempt_enable();
|
preempt_enable();
|
||||||
|
|
||||||
if (mod)
|
return f;
|
||||||
return mod->cfi_check;
|
|
||||||
|
|
||||||
return CFI_CHECK_FN;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline cfi_check_fn find_cfi_check(void *ptr)
|
static inline cfi_check_fn find_cfi_check(void *ptr)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_CFI_CLANG_SHADOW
|
bool rcu;
|
||||||
cfi_check_fn f;
|
cfi_check_fn f;
|
||||||
|
|
||||||
if (!rcu_access_pointer(cfi_shadow))
|
rcu = rcu_is_watching();
|
||||||
return CFI_CHECK_FN; /* No loaded modules */
|
if (!rcu)
|
||||||
|
rcu_nmi_enter();
|
||||||
|
|
||||||
|
#ifdef CONFIG_CFI_CLANG_SHADOW
|
||||||
/* Look up the __cfi_check function to use */
|
/* Look up the __cfi_check function to use */
|
||||||
rcu_read_lock();
|
rcu_read_lock_sched();
|
||||||
f = ptr_to_check_fn(rcu_dereference(cfi_shadow), (unsigned long)ptr);
|
f = ptr_to_check_fn(rcu_dereference_sched(cfi_shadow),
|
||||||
rcu_read_unlock();
|
(unsigned long)ptr);
|
||||||
|
rcu_read_unlock_sched();
|
||||||
|
|
||||||
if (f)
|
if (f)
|
||||||
return f;
|
goto out;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Fall back to find_module_cfi_check, which works also for a larger
|
* Fall back to find_module_cfi_check, which works also for a larger
|
||||||
@@ -279,7 +284,13 @@ static inline cfi_check_fn find_cfi_check(void *ptr)
|
|||||||
*/
|
*/
|
||||||
#endif /* CONFIG_CFI_CLANG_SHADOW */
|
#endif /* CONFIG_CFI_CLANG_SHADOW */
|
||||||
|
|
||||||
return find_module_cfi_check(ptr);
|
f = find_module_cfi_check(ptr);
|
||||||
|
|
||||||
|
out:
|
||||||
|
if (!rcu)
|
||||||
|
rcu_nmi_exit();
|
||||||
|
|
||||||
|
return f;
|
||||||
}
|
}
|
||||||
|
|
||||||
void cfi_slowpath_handler(uint64_t id, void *ptr, void *diag)
|
void cfi_slowpath_handler(uint64_t id, void *ptr, void *diag)
|
||||||
|
|||||||
+23
-24
@@ -158,6 +158,26 @@ static unsigned long kallsyms_sym_address(int idx)
|
|||||||
return kallsyms_relative_base - 1 - kallsyms_offsets[idx];
|
return kallsyms_relative_base - 1 - kallsyms_offsets[idx];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(CONFIG_CFI_CLANG) && defined(CONFIG_THINLTO)
|
||||||
|
/*
|
||||||
|
* LLVM appends a hash to static function names when ThinLTO and CFI are
|
||||||
|
* both enabled, which causes confusion and potentially breaks user space
|
||||||
|
* tools, so we will strip the postfix from expanded symbol names.
|
||||||
|
*/
|
||||||
|
static inline char *cleanup_symbol_name(char *s)
|
||||||
|
{
|
||||||
|
char *res = NULL;
|
||||||
|
|
||||||
|
res = strrchr(s, '$');
|
||||||
|
if (res)
|
||||||
|
*res = '\0';
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline char *cleanup_symbol_name(char *s) { return NULL; }
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Lookup the address for this symbol. Returns 0 if not found. */
|
/* Lookup the address for this symbol. Returns 0 if not found. */
|
||||||
unsigned long kallsyms_lookup_name(const char *name)
|
unsigned long kallsyms_lookup_name(const char *name)
|
||||||
{
|
{
|
||||||
@@ -170,6 +190,9 @@ unsigned long kallsyms_lookup_name(const char *name)
|
|||||||
|
|
||||||
if (strcmp(namebuf, name) == 0)
|
if (strcmp(namebuf, name) == 0)
|
||||||
return kallsyms_sym_address(i);
|
return kallsyms_sym_address(i);
|
||||||
|
|
||||||
|
if (cleanup_symbol_name(namebuf) && strcmp(namebuf, name) == 0)
|
||||||
|
return kallsyms_sym_address(i);
|
||||||
}
|
}
|
||||||
return module_kallsyms_lookup_name(name);
|
return module_kallsyms_lookup_name(name);
|
||||||
}
|
}
|
||||||
@@ -270,30 +293,6 @@ int kallsyms_lookup_size_offset(unsigned long addr, unsigned long *symbolsize,
|
|||||||
!!__bpf_address_lookup(addr, symbolsize, offset, namebuf);
|
!!__bpf_address_lookup(addr, symbolsize, offset, namebuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_CFI_CLANG
|
|
||||||
/*
|
|
||||||
* LLVM appends .cfi to function names when CONFIG_CFI_CLANG is enabled,
|
|
||||||
* which causes confusion and potentially breaks user space tools, so we
|
|
||||||
* will strip the postfix from expanded symbol names.
|
|
||||||
*/
|
|
||||||
static inline void cleanup_symbol_name(char *s)
|
|
||||||
{
|
|
||||||
char *res;
|
|
||||||
|
|
||||||
#ifdef CONFIG_THINLTO
|
|
||||||
/* Filter out hashes from static functions */
|
|
||||||
res = strrchr(s, '$');
|
|
||||||
if (res)
|
|
||||||
*res = '\0';
|
|
||||||
#endif
|
|
||||||
res = strrchr(s, '.');
|
|
||||||
if (res && !strcmp(res, ".cfi"))
|
|
||||||
*res = '\0';
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
static inline void cleanup_symbol_name(char *s) {}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Lookup an address
|
* Lookup an address
|
||||||
* - modname is set to NULL if it's in the kernel.
|
* - modname is set to NULL if it's in the kernel.
|
||||||
|
|||||||
+2
-2
@@ -4235,10 +4235,10 @@ int module_kallsyms_on_each_symbol(int (*fn)(void *, const char *,
|
|||||||
static void cfi_init(struct module *mod)
|
static void cfi_init(struct module *mod)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_CFI_CLANG
|
#ifdef CONFIG_CFI_CLANG
|
||||||
preempt_disable();
|
rcu_read_lock_sched();
|
||||||
mod->cfi_check =
|
mod->cfi_check =
|
||||||
(cfi_check_fn)mod_find_symname(mod, CFI_CHECK_FN_NAME);
|
(cfi_check_fn)mod_find_symname(mod, CFI_CHECK_FN_NAME);
|
||||||
preempt_enable();
|
rcu_read_unlock_sched();
|
||||||
cfi_module_add(mod, module_addr_min, module_addr_max);
|
cfi_module_add(mod, module_addr_min, module_addr_max);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,6 +28,8 @@ ifdef CONFIG_GCOV_PROFILE_FTRACE
|
|||||||
GCOV_PROFILE := y
|
GCOV_PROFILE := y
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
CFLAGS_bpf_trace.o := -I$(src)
|
||||||
|
|
||||||
CFLAGS_trace_benchmark.o := -I$(src)
|
CFLAGS_trace_benchmark.o := -I$(src)
|
||||||
CFLAGS_trace_events_filter.o := -I$(src)
|
CFLAGS_trace_events_filter.o := -I$(src)
|
||||||
|
|
||||||
|
|||||||
@@ -11,12 +11,16 @@
|
|||||||
#include <linux/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
#include <linux/ctype.h>
|
#include <linux/ctype.h>
|
||||||
#include <linux/kprobes.h>
|
#include <linux/kprobes.h>
|
||||||
|
#include <linux/spinlock.h>
|
||||||
#include <linux/syscalls.h>
|
#include <linux/syscalls.h>
|
||||||
#include <linux/error-injection.h>
|
#include <linux/error-injection.h>
|
||||||
|
|
||||||
#include "trace_probe.h"
|
#include "trace_probe.h"
|
||||||
#include "trace.h"
|
#include "trace.h"
|
||||||
|
|
||||||
|
#define CREATE_TRACE_POINTS
|
||||||
|
#include "bpf_trace.h"
|
||||||
|
|
||||||
u64 bpf_get_stackid(u64 r1, u64 r2, u64 r3, u64 r4, u64 r5);
|
u64 bpf_get_stackid(u64 r1, u64 r2, u64 r3, u64 r4, u64 r5);
|
||||||
u64 bpf_get_stack(u64 r1, u64 r2, u64 r3, u64 r4, u64 r5);
|
u64 bpf_get_stack(u64 r1, u64 r2, u64 r3, u64 r4, u64 r5);
|
||||||
|
|
||||||
@@ -156,6 +160,30 @@ static const struct bpf_func_proto *bpf_get_probe_write_proto(void)
|
|||||||
return &bpf_probe_write_user_proto;
|
return &bpf_probe_write_user_proto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static DEFINE_RAW_SPINLOCK(trace_printk_lock);
|
||||||
|
|
||||||
|
#define BPF_TRACE_PRINTK_SIZE 1024
|
||||||
|
|
||||||
|
static inline __printf(1, 0) int bpf_do_trace_printk(const char *fmt, ...)
|
||||||
|
{
|
||||||
|
static char buf[BPF_TRACE_PRINTK_SIZE];
|
||||||
|
unsigned long flags;
|
||||||
|
va_list ap;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
raw_spin_lock_irqsave(&trace_printk_lock, flags);
|
||||||
|
va_start(ap, fmt);
|
||||||
|
ret = vsnprintf(buf, sizeof(buf), fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
/* vsnprintf() will not append null for zero-length strings */
|
||||||
|
if (ret == 0)
|
||||||
|
buf[0] = '\0';
|
||||||
|
trace_bpf_trace_printk(buf);
|
||||||
|
raw_spin_unlock_irqrestore(&trace_printk_lock, flags);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Only limited trace_printk() conversion specifiers allowed:
|
* Only limited trace_printk() conversion specifiers allowed:
|
||||||
* %d %i %u %x %ld %li %lu %lx %lld %lli %llu %llx %p %s
|
* %d %i %u %x %ld %li %lu %lx %lld %lli %llu %llx %p %s
|
||||||
@@ -246,8 +274,7 @@ BPF_CALL_5(bpf_trace_printk, char *, fmt, u32, fmt_size, u64, arg1,
|
|||||||
*/
|
*/
|
||||||
#define __BPF_TP_EMIT() __BPF_ARG3_TP()
|
#define __BPF_TP_EMIT() __BPF_ARG3_TP()
|
||||||
#define __BPF_TP(...) \
|
#define __BPF_TP(...) \
|
||||||
__trace_printk(0 /* Fake ip */, \
|
bpf_do_trace_printk(fmt, ##__VA_ARGS__)
|
||||||
fmt, ##__VA_ARGS__)
|
|
||||||
|
|
||||||
#define __BPF_ARG1_TP(...) \
|
#define __BPF_ARG1_TP(...) \
|
||||||
((mod[0] == 2 || (mod[0] == 1 && __BITS_PER_LONG == 64)) \
|
((mod[0] == 2 || (mod[0] == 1 && __BITS_PER_LONG == 64)) \
|
||||||
@@ -284,10 +311,15 @@ static const struct bpf_func_proto bpf_trace_printk_proto = {
|
|||||||
const struct bpf_func_proto *bpf_get_trace_printk_proto(void)
|
const struct bpf_func_proto *bpf_get_trace_printk_proto(void)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* this program might be calling bpf_trace_printk,
|
* This program might be calling bpf_trace_printk,
|
||||||
* so allocate per-cpu printk buffers
|
* so enable the associated bpf_trace/bpf_trace_printk event.
|
||||||
|
* Repeat this each time as it is possible a user has
|
||||||
|
* disabled bpf_trace_printk events. By loading a program
|
||||||
|
* calling bpf_trace_printk() however the user has expressed
|
||||||
|
* the intent to see such events.
|
||||||
*/
|
*/
|
||||||
trace_printk_init_buffers();
|
if (trace_set_clr_event("bpf_trace", "bpf_trace_printk", 1))
|
||||||
|
pr_warn_ratelimited("could not enable bpf_trace_printk events");
|
||||||
|
|
||||||
return &bpf_trace_printk_proto;
|
return &bpf_trace_printk_proto;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
#undef TRACE_SYSTEM
|
||||||
|
#define TRACE_SYSTEM bpf_trace
|
||||||
|
|
||||||
|
#if !defined(_TRACE_BPF_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
|
||||||
|
|
||||||
|
#define _TRACE_BPF_TRACE_H
|
||||||
|
|
||||||
|
#include <linux/tracepoint.h>
|
||||||
|
|
||||||
|
TRACE_EVENT(bpf_trace_printk,
|
||||||
|
|
||||||
|
TP_PROTO(const char *bpf_string),
|
||||||
|
|
||||||
|
TP_ARGS(bpf_string),
|
||||||
|
|
||||||
|
TP_STRUCT__entry(
|
||||||
|
__string(bpf_string, bpf_string)
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_fast_assign(
|
||||||
|
__assign_str(bpf_string, bpf_string);
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_printk("%s", __get_str(bpf_string))
|
||||||
|
);
|
||||||
|
|
||||||
|
#endif /* _TRACE_BPF_TRACE_H */
|
||||||
|
|
||||||
|
#undef TRACE_INCLUDE_PATH
|
||||||
|
#define TRACE_INCLUDE_PATH .
|
||||||
|
#define TRACE_INCLUDE_FILE bpf_trace
|
||||||
|
|
||||||
|
#include <trace/define_trace.h>
|
||||||
@@ -945,7 +945,6 @@ static const char *const head_sections[] = { ".head.text*", NULL };
|
|||||||
static const char *const linker_symbols[] =
|
static const char *const linker_symbols[] =
|
||||||
{ "__init_begin", "_sinittext", "_einittext", NULL };
|
{ "__init_begin", "_sinittext", "_einittext", NULL };
|
||||||
static const char *const optim_symbols[] = { "*.constprop.*", NULL };
|
static const char *const optim_symbols[] = { "*.constprop.*", NULL };
|
||||||
static const char *const cfi_symbols[] = { "*.cfi", NULL };
|
|
||||||
|
|
||||||
enum mismatch {
|
enum mismatch {
|
||||||
TEXT_TO_ANY_INIT,
|
TEXT_TO_ANY_INIT,
|
||||||
@@ -1176,16 +1175,6 @@ static const struct sectioncheck *section_mismatch(
|
|||||||
* names to work. (One situation where gcc can autogenerate ELF
|
* names to work. (One situation where gcc can autogenerate ELF
|
||||||
* local symbols is when "-fsection-anchors" is used.)
|
* local symbols is when "-fsection-anchors" is used.)
|
||||||
*
|
*
|
||||||
* Pattern 7:
|
|
||||||
* With CONFIG_CFI_CLANG, clang appends .cfi to all indirectly called
|
|
||||||
* functions and creates a function stub with the original name. This
|
|
||||||
* stub is always placed in .text, even if the actual function with the
|
|
||||||
* .cfi postfix is in .init.text or .exit.text.
|
|
||||||
* This pattern is identified by
|
|
||||||
* tosec = init or exit section
|
|
||||||
* fromsec = text section
|
|
||||||
* tosym = *.cfi
|
|
||||||
*
|
|
||||||
**/
|
**/
|
||||||
static int secref_whitelist(const struct sectioncheck *mismatch,
|
static int secref_whitelist(const struct sectioncheck *mismatch,
|
||||||
const char *fromsec, const char *fromsym,
|
const char *fromsec, const char *fromsym,
|
||||||
@@ -1228,12 +1217,6 @@ static int secref_whitelist(const struct sectioncheck *mismatch,
|
|||||||
if (strstarts(fromsym, ".L"))
|
if (strstarts(fromsym, ".L"))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* Check for pattern 7 */
|
|
||||||
if (match(fromsec, text_sections) &&
|
|
||||||
match(tosec, init_exit_sections) &&
|
|
||||||
match(tosym, cfi_symbols))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -76,8 +76,6 @@ static int audio_ext_clk_prepare(struct clk_hw *hw)
|
|||||||
if ((clk_priv->clk_src >= AUDIO_EXT_CLK_LPASS) &&
|
if ((clk_priv->clk_src >= AUDIO_EXT_CLK_LPASS) &&
|
||||||
(clk_priv->clk_src < AUDIO_EXT_CLK_LPASS_MAX)) {
|
(clk_priv->clk_src < AUDIO_EXT_CLK_LPASS_MAX)) {
|
||||||
clk_priv->clk_cfg.enable = 1;
|
clk_priv->clk_cfg.enable = 1;
|
||||||
trace_printk("%s: vote for %d clock\n",
|
|
||||||
__func__, clk_priv->clk_src);
|
|
||||||
ret = afe_set_lpass_clk_cfg(IDX_RSVD_3, &clk_priv->clk_cfg);
|
ret = afe_set_lpass_clk_cfg(IDX_RSVD_3, &clk_priv->clk_cfg);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
pr_err_ratelimited("%s afe_set_digital_codec_core_clock failed\n",
|
pr_err_ratelimited("%s afe_set_digital_codec_core_clock failed\n",
|
||||||
@@ -120,8 +118,6 @@ static void audio_ext_clk_unprepare(struct clk_hw *hw)
|
|||||||
if ((clk_priv->clk_src >= AUDIO_EXT_CLK_LPASS) &&
|
if ((clk_priv->clk_src >= AUDIO_EXT_CLK_LPASS) &&
|
||||||
(clk_priv->clk_src < AUDIO_EXT_CLK_LPASS_MAX)) {
|
(clk_priv->clk_src < AUDIO_EXT_CLK_LPASS_MAX)) {
|
||||||
clk_priv->clk_cfg.enable = 0;
|
clk_priv->clk_cfg.enable = 0;
|
||||||
trace_printk("%s: unvote for %d clock\n",
|
|
||||||
__func__, clk_priv->clk_src);
|
|
||||||
ret = afe_set_lpass_clk_cfg(IDX_RSVD_3, &clk_priv->clk_cfg);
|
ret = afe_set_lpass_clk_cfg(IDX_RSVD_3, &clk_priv->clk_cfg);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
pr_err_ratelimited("%s: afe_set_lpass_clk_cfg failed, ret = %d\n",
|
pr_err_ratelimited("%s: afe_set_lpass_clk_cfg failed, ret = %d\n",
|
||||||
@@ -156,7 +152,7 @@ static int lpass_hw_vote_prepare(struct clk_hw *hw)
|
|||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (clk_priv->clk_src == AUDIO_EXT_CLK_LPASS_CORE_HW_VOTE) {
|
if (clk_priv->clk_src == AUDIO_EXT_CLK_LPASS_CORE_HW_VOTE) {
|
||||||
trace_printk("%s: vote for %d clock\n",
|
pr_debug("%s: vote for %d clock\n",
|
||||||
__func__, clk_priv->clk_src);
|
__func__, clk_priv->clk_src);
|
||||||
ret = afe_vote_lpass_core_hw(AFE_LPASS_CORE_HW_MACRO_BLOCK,
|
ret = afe_vote_lpass_core_hw(AFE_LPASS_CORE_HW_MACRO_BLOCK,
|
||||||
"LPASS_HW_MACRO",
|
"LPASS_HW_MACRO",
|
||||||
@@ -169,7 +165,7 @@ static int lpass_hw_vote_prepare(struct clk_hw *hw)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (clk_priv->clk_src == AUDIO_EXT_CLK_LPASS_AUDIO_HW_VOTE) {
|
if (clk_priv->clk_src == AUDIO_EXT_CLK_LPASS_AUDIO_HW_VOTE) {
|
||||||
trace_printk("%s: vote for %d clock\n",
|
pr_debug("%s: vote for %d clock\n",
|
||||||
__func__, clk_priv->clk_src);
|
__func__, clk_priv->clk_src);
|
||||||
ret = afe_vote_lpass_core_hw(AFE_LPASS_CORE_HW_DCODEC_BLOCK,
|
ret = afe_vote_lpass_core_hw(AFE_LPASS_CORE_HW_DCODEC_BLOCK,
|
||||||
"LPASS_HW_DCODEC",
|
"LPASS_HW_DCODEC",
|
||||||
@@ -190,7 +186,7 @@ static void lpass_hw_vote_unprepare(struct clk_hw *hw)
|
|||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
if (clk_priv->clk_src == AUDIO_EXT_CLK_LPASS_CORE_HW_VOTE) {
|
if (clk_priv->clk_src == AUDIO_EXT_CLK_LPASS_CORE_HW_VOTE) {
|
||||||
trace_printk("%s: unvote for %d clock\n",
|
pr_debug("%s: unvote for %d clock\n",
|
||||||
__func__, clk_priv->clk_src);
|
__func__, clk_priv->clk_src);
|
||||||
ret = afe_unvote_lpass_core_hw(
|
ret = afe_unvote_lpass_core_hw(
|
||||||
AFE_LPASS_CORE_HW_MACRO_BLOCK,
|
AFE_LPASS_CORE_HW_MACRO_BLOCK,
|
||||||
@@ -202,7 +198,7 @@ static void lpass_hw_vote_unprepare(struct clk_hw *hw)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (clk_priv->clk_src == AUDIO_EXT_CLK_LPASS_AUDIO_HW_VOTE) {
|
if (clk_priv->clk_src == AUDIO_EXT_CLK_LPASS_AUDIO_HW_VOTE) {
|
||||||
trace_printk("%s: unvote for %d clock\n",
|
pr_debug("%s: unvote for %d clock\n",
|
||||||
__func__, clk_priv->clk_src);
|
__func__, clk_priv->clk_src);
|
||||||
ret = afe_unvote_lpass_core_hw(
|
ret = afe_unvote_lpass_core_hw(
|
||||||
AFE_LPASS_CORE_HW_DCODEC_BLOCK,
|
AFE_LPASS_CORE_HW_DCODEC_BLOCK,
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-only
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
/* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
|
/* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
|
||||||
|
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/of_platform.h>
|
#include <linux/of_platform.h>
|
||||||
@@ -879,7 +880,7 @@ static int bolero_ssr_enable(struct device *dev, void *data)
|
|||||||
priv->component,
|
priv->component,
|
||||||
BOLERO_MACRO_EVT_CLK_RESET, 0x0);
|
BOLERO_MACRO_EVT_CLK_RESET, 0x0);
|
||||||
}
|
}
|
||||||
trace_printk("%s: clk count reset\n", __func__);
|
pr_debug("%s: clk count reset\n", __func__);
|
||||||
|
|
||||||
if (priv->rsc_clk_cb)
|
if (priv->rsc_clk_cb)
|
||||||
priv->rsc_clk_cb(priv->clk_dev, BOLERO_MACRO_EVT_SSR_GFMUX_UP);
|
priv->rsc_clk_cb(priv->clk_dev, BOLERO_MACRO_EVT_SSR_GFMUX_UP);
|
||||||
@@ -902,7 +903,6 @@ static int bolero_ssr_enable(struct device *dev, void *data)
|
|||||||
/* Add a 100usec sleep to ensure last register write is done */
|
/* Add a 100usec sleep to ensure last register write is done */
|
||||||
usleep_range(100,110);
|
usleep_range(100,110);
|
||||||
bolero_clk_rsc_enable_all_clocks(priv->clk_dev, false);
|
bolero_clk_rsc_enable_all_clocks(priv->clk_dev, false);
|
||||||
trace_printk("%s: regcache_sync done\n", __func__);
|
|
||||||
/* call ssr event for supported macros */
|
/* call ssr event for supported macros */
|
||||||
for (macro_idx = START_MACRO; macro_idx < MAX_MACRO; macro_idx++) {
|
for (macro_idx = START_MACRO; macro_idx < MAX_MACRO; macro_idx++) {
|
||||||
if (!priv->macro_params[macro_idx].event_handler)
|
if (!priv->macro_params[macro_idx].event_handler)
|
||||||
@@ -911,7 +911,6 @@ static int bolero_ssr_enable(struct device *dev, void *data)
|
|||||||
priv->component,
|
priv->component,
|
||||||
BOLERO_MACRO_EVT_SSR_UP, 0x0);
|
BOLERO_MACRO_EVT_SSR_UP, 0x0);
|
||||||
}
|
}
|
||||||
trace_printk("%s: SSR up events processed by all macros\n", __func__);
|
|
||||||
bolero_cdc_notifier_call(priv, BOLERO_WCD_EVT_SSR_UP);
|
bolero_cdc_notifier_call(priv, BOLERO_WCD_EVT_SSR_UP);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -1441,8 +1440,6 @@ int bolero_runtime_resume(struct device *dev)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
priv->core_hw_vote_count++;
|
priv->core_hw_vote_count++;
|
||||||
trace_printk("%s: hw vote count %d\n",
|
|
||||||
__func__, priv->core_hw_vote_count);
|
|
||||||
|
|
||||||
audio_vote:
|
audio_vote:
|
||||||
if (priv->lpass_audio_hw_vote == NULL) {
|
if (priv->lpass_audio_hw_vote == NULL) {
|
||||||
@@ -1459,8 +1456,6 @@ audio_vote:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
priv->core_audio_vote_count++;
|
priv->core_audio_vote_count++;
|
||||||
trace_printk("%s: audio vote count %d\n",
|
|
||||||
__func__, priv->core_audio_vote_count);
|
|
||||||
|
|
||||||
done:
|
done:
|
||||||
mutex_unlock(&priv->vote_lock);
|
mutex_unlock(&priv->vote_lock);
|
||||||
@@ -1484,8 +1479,6 @@ int bolero_runtime_suspend(struct device *dev)
|
|||||||
dev_dbg(dev, "%s: Invalid lpass core hw node\n",
|
dev_dbg(dev, "%s: Invalid lpass core hw node\n",
|
||||||
__func__);
|
__func__);
|
||||||
}
|
}
|
||||||
trace_printk("%s: hw vote count %d\n",
|
|
||||||
__func__, priv->core_hw_vote_count);
|
|
||||||
|
|
||||||
if (priv->lpass_audio_hw_vote != NULL) {
|
if (priv->lpass_audio_hw_vote != NULL) {
|
||||||
if (--priv->core_audio_vote_count == 0)
|
if (--priv->core_audio_vote_count == 0)
|
||||||
@@ -1497,8 +1490,6 @@ int bolero_runtime_suspend(struct device *dev)
|
|||||||
dev_dbg(dev, "%s: Invalid lpass audio hw node\n",
|
dev_dbg(dev, "%s: Invalid lpass audio hw node\n",
|
||||||
__func__);
|
__func__);
|
||||||
}
|
}
|
||||||
trace_printk("%s: audio vote count %d\n",
|
|
||||||
__func__, priv->core_audio_vote_count);
|
|
||||||
|
|
||||||
mutex_unlock(&priv->vote_lock);
|
mutex_unlock(&priv->vote_lock);
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-only
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2019-2020, The Linux Foundation. All rights reserved.
|
* Copyright (c) 2019-2020, The Linux Foundation. All rights reserved.
|
||||||
|
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/of_platform.h>
|
#include <linux/of_platform.h>
|
||||||
@@ -135,7 +136,6 @@ int bolero_rsc_clk_reset(struct device *dev, int clk_id)
|
|||||||
dev_dbg(priv->dev,
|
dev_dbg(priv->dev,
|
||||||
"%s: clock reset after ssr, count %d\n", __func__, count);
|
"%s: clock reset after ssr, count %d\n", __func__, count);
|
||||||
|
|
||||||
trace_printk("%s: clock reset after ssr, count %d\n", __func__, count);
|
|
||||||
while (count--) {
|
while (count--) {
|
||||||
clk_prepare_enable(priv->clk[clk_id]);
|
clk_prepare_enable(priv->clk[clk_id]);
|
||||||
clk_prepare_enable(priv->clk[clk_id + NPL_CLK_OFFSET]);
|
clk_prepare_enable(priv->clk[clk_id + NPL_CLK_OFFSET]);
|
||||||
@@ -290,8 +290,6 @@ static int bolero_clk_rsc_mux1_clk_request(struct bolero_clk_rsc *priv,
|
|||||||
if (priv->dev_up_gfmux) {
|
if (priv->dev_up_gfmux) {
|
||||||
iowrite32(0x1, clk_muxsel);
|
iowrite32(0x1, clk_muxsel);
|
||||||
muxsel = ioread32(clk_muxsel);
|
muxsel = ioread32(clk_muxsel);
|
||||||
trace_printk("%s: muxsel value after enable: %d\n",
|
|
||||||
__func__, muxsel);
|
|
||||||
}
|
}
|
||||||
bolero_clk_rsc_mux0_clk_request(priv,
|
bolero_clk_rsc_mux0_clk_request(priv,
|
||||||
default_clk_id,
|
default_clk_id,
|
||||||
@@ -323,8 +321,6 @@ static int bolero_clk_rsc_mux1_clk_request(struct bolero_clk_rsc *priv,
|
|||||||
if (priv->dev_up_gfmux) {
|
if (priv->dev_up_gfmux) {
|
||||||
iowrite32(0x0, clk_muxsel);
|
iowrite32(0x0, clk_muxsel);
|
||||||
muxsel = ioread32(clk_muxsel);
|
muxsel = ioread32(clk_muxsel);
|
||||||
trace_printk("%s: muxsel value after disable: %d\n",
|
|
||||||
__func__, muxsel);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -547,7 +543,6 @@ int bolero_clk_rsc_request_clock(struct device *dev,
|
|||||||
if (!priv->dev_up && enable) {
|
if (!priv->dev_up && enable) {
|
||||||
dev_err_ratelimited(priv->dev, "%s: SSR is in progress..\n",
|
dev_err_ratelimited(priv->dev, "%s: SSR is in progress..\n",
|
||||||
__func__);
|
__func__);
|
||||||
trace_printk("%s: SSR is in progress..\n", __func__);
|
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
@@ -577,9 +572,6 @@ int bolero_clk_rsc_request_clock(struct device *dev,
|
|||||||
dev_dbg(priv->dev, "%s: clk_cnt: %d for requested clk: %d, enable: %d\n",
|
dev_dbg(priv->dev, "%s: clk_cnt: %d for requested clk: %d, enable: %d\n",
|
||||||
__func__, priv->clk_cnt[clk_id_req], clk_id_req,
|
__func__, priv->clk_cnt[clk_id_req], clk_id_req,
|
||||||
enable);
|
enable);
|
||||||
trace_printk("%s: clk_cnt: %d for requested clk: %d, enable: %d\n",
|
|
||||||
__func__, priv->clk_cnt[clk_id_req], clk_id_req,
|
|
||||||
enable);
|
|
||||||
|
|
||||||
mutex_unlock(&priv->rsc_clk_lock);
|
mutex_unlock(&priv->rsc_clk_lock);
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-only
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
/* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
|
/* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
|
||||||
|
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
@@ -1296,7 +1297,7 @@ static int rx_macro_mclk_enable(struct rx_macro_priv *rx_priv,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
exit:
|
exit:
|
||||||
trace_printk("%s: mclk_enable = %u, dapm = %d clk_users= %d\n",
|
dev_dbg(rx_priv->dev, "%s: mclk_enable = %u, dapm = %d clk_users= %d\n",
|
||||||
__func__, mclk_enable, dapm, rx_priv->rx_mclk_users);
|
__func__, mclk_enable, dapm, rx_priv->rx_mclk_users);
|
||||||
mutex_unlock(&rx_priv->mclk_lock);
|
mutex_unlock(&rx_priv->mclk_lock);
|
||||||
return ret;
|
return ret;
|
||||||
@@ -1383,7 +1384,6 @@ static int rx_macro_event_handler(struct snd_soc_component *component,
|
|||||||
rx_macro_wcd_clsh_imped_config(component, data, false);
|
rx_macro_wcd_clsh_imped_config(component, data, false);
|
||||||
break;
|
break;
|
||||||
case BOLERO_MACRO_EVT_SSR_DOWN:
|
case BOLERO_MACRO_EVT_SSR_DOWN:
|
||||||
trace_printk("%s, enter SSR down\n", __func__);
|
|
||||||
rx_priv->dev_up = false;
|
rx_priv->dev_up = false;
|
||||||
if (rx_priv->swr_ctrl_data) {
|
if (rx_priv->swr_ctrl_data) {
|
||||||
swrm_wcd_notify(
|
swrm_wcd_notify(
|
||||||
@@ -1418,7 +1418,6 @@ static int rx_macro_event_handler(struct snd_soc_component *component,
|
|||||||
rx_macro_core_vote(rx_priv, false);
|
rx_macro_core_vote(rx_priv, false);
|
||||||
break;
|
break;
|
||||||
case BOLERO_MACRO_EVT_SSR_UP:
|
case BOLERO_MACRO_EVT_SSR_UP:
|
||||||
trace_printk("%s, enter SSR up\n", __func__);
|
|
||||||
rx_priv->dev_up = true;
|
rx_priv->dev_up = true;
|
||||||
/* reset swr after ssr/pdr */
|
/* reset swr after ssr/pdr */
|
||||||
rx_priv->reset_swr = true;
|
rx_priv->reset_swr = true;
|
||||||
@@ -3715,8 +3714,6 @@ static int rx_swrm_clock(void *handle, bool enable)
|
|||||||
|
|
||||||
mutex_lock(&rx_priv->swr_clk_lock);
|
mutex_lock(&rx_priv->swr_clk_lock);
|
||||||
|
|
||||||
trace_printk("%s: swrm clock %s\n",
|
|
||||||
__func__, (enable ? "enable" : "disable"));
|
|
||||||
dev_dbg(rx_priv->dev, "%s: swrm clock %s\n",
|
dev_dbg(rx_priv->dev, "%s: swrm clock %s\n",
|
||||||
__func__, (enable ? "enable" : "disable"));
|
__func__, (enable ? "enable" : "disable"));
|
||||||
if (enable) {
|
if (enable) {
|
||||||
@@ -3783,8 +3780,6 @@ static int rx_swrm_clock(void *handle, bool enable)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
trace_printk("%s: swrm clock users %d\n",
|
|
||||||
__func__, rx_priv->swr_clk_users);
|
|
||||||
dev_dbg(rx_priv->dev, "%s: swrm clock users %d\n",
|
dev_dbg(rx_priv->dev, "%s: swrm clock users %d\n",
|
||||||
__func__, rx_priv->swr_clk_users);
|
__func__, rx_priv->swr_clk_users);
|
||||||
exit:
|
exit:
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-only
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
/* Copyright (c) 2018-2021, The Linux Foundation. All rights reserved.
|
/* Copyright (c) 2018-2021, The Linux Foundation. All rights reserved.
|
||||||
|
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
@@ -374,7 +375,6 @@ static int tx_macro_event_handler(struct snd_soc_component *component,
|
|||||||
|
|
||||||
switch (event) {
|
switch (event) {
|
||||||
case BOLERO_MACRO_EVT_SSR_DOWN:
|
case BOLERO_MACRO_EVT_SSR_DOWN:
|
||||||
trace_printk("%s, enter SSR down\n", __func__);
|
|
||||||
if (tx_priv->swr_ctrl_data) {
|
if (tx_priv->swr_ctrl_data) {
|
||||||
swrm_wcd_notify(
|
swrm_wcd_notify(
|
||||||
tx_priv->swr_ctrl_data[0].tx_swr_pdev,
|
tx_priv->swr_ctrl_data[0].tx_swr_pdev,
|
||||||
@@ -391,7 +391,6 @@ static int tx_macro_event_handler(struct snd_soc_component *component,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case BOLERO_MACRO_EVT_SSR_UP:
|
case BOLERO_MACRO_EVT_SSR_UP:
|
||||||
trace_printk("%s, enter SSR up\n", __func__);
|
|
||||||
/* reset swr after ssr/pdr */
|
/* reset swr after ssr/pdr */
|
||||||
tx_priv->reset_swr = true;
|
tx_priv->reset_swr = true;
|
||||||
if (tx_priv->swr_ctrl_data)
|
if (tx_priv->swr_ctrl_data)
|
||||||
@@ -2461,9 +2460,6 @@ static int tx_macro_tx_va_mclk_enable(struct tx_macro_priv *tx_priv,
|
|||||||
{
|
{
|
||||||
int ret = 0, clk_tx_ret = 0;
|
int ret = 0, clk_tx_ret = 0;
|
||||||
|
|
||||||
trace_printk("%s: clock type %s, enable: %s tx_mclk_users: %d\n",
|
|
||||||
__func__, (clk_type ? "VA_MCLK" : "TX_MCLK"),
|
|
||||||
(enable ? "enable" : "disable"), tx_priv->tx_mclk_users);
|
|
||||||
dev_dbg(tx_priv->dev,
|
dev_dbg(tx_priv->dev,
|
||||||
"%s: clock type %s, enable: %s tx_mclk_users: %d\n",
|
"%s: clock type %s, enable: %s tx_mclk_users: %d\n",
|
||||||
__func__, (clk_type ? "VA_MCLK" : "TX_MCLK"),
|
__func__, (clk_type ? "VA_MCLK" : "TX_MCLK"),
|
||||||
@@ -2471,7 +2467,6 @@ static int tx_macro_tx_va_mclk_enable(struct tx_macro_priv *tx_priv,
|
|||||||
|
|
||||||
if (enable) {
|
if (enable) {
|
||||||
if (tx_priv->swr_clk_users == 0) {
|
if (tx_priv->swr_clk_users == 0) {
|
||||||
trace_printk("%s: tx swr clk users 0\n", __func__);
|
|
||||||
ret = msm_cdc_pinctrl_select_active_state(
|
ret = msm_cdc_pinctrl_select_active_state(
|
||||||
tx_priv->tx_swr_gpio_p);
|
tx_priv->tx_swr_gpio_p);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
@@ -2489,7 +2484,6 @@ static int tx_macro_tx_va_mclk_enable(struct tx_macro_priv *tx_priv,
|
|||||||
TX_CORE_CLK,
|
TX_CORE_CLK,
|
||||||
true);
|
true);
|
||||||
if (clk_type == TX_MCLK) {
|
if (clk_type == TX_MCLK) {
|
||||||
trace_printk("%s: requesting TX_MCLK\n", __func__);
|
|
||||||
ret = tx_macro_mclk_enable(tx_priv, 1);
|
ret = tx_macro_mclk_enable(tx_priv, 1);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
if (tx_priv->swr_clk_users == 0)
|
if (tx_priv->swr_clk_users == 0)
|
||||||
@@ -2502,7 +2496,6 @@ static int tx_macro_tx_va_mclk_enable(struct tx_macro_priv *tx_priv,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (clk_type == VA_MCLK) {
|
if (clk_type == VA_MCLK) {
|
||||||
trace_printk("%s: requesting VA_MCLK\n", __func__);
|
|
||||||
ret = bolero_clk_rsc_request_clock(tx_priv->dev,
|
ret = bolero_clk_rsc_request_clock(tx_priv->dev,
|
||||||
TX_CORE_CLK,
|
TX_CORE_CLK,
|
||||||
VA_CORE_CLK,
|
VA_CORE_CLK,
|
||||||
@@ -2534,8 +2527,6 @@ static int tx_macro_tx_va_mclk_enable(struct tx_macro_priv *tx_priv,
|
|||||||
if (tx_priv->swr_clk_users == 0) {
|
if (tx_priv->swr_clk_users == 0) {
|
||||||
dev_dbg(tx_priv->dev, "%s: reset_swr: %d\n",
|
dev_dbg(tx_priv->dev, "%s: reset_swr: %d\n",
|
||||||
__func__, tx_priv->reset_swr);
|
__func__, tx_priv->reset_swr);
|
||||||
trace_printk("%s: reset_swr: %d\n",
|
|
||||||
__func__, tx_priv->reset_swr);
|
|
||||||
if (tx_priv->reset_swr)
|
if (tx_priv->reset_swr)
|
||||||
regmap_update_bits(regmap,
|
regmap_update_bits(regmap,
|
||||||
BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL,
|
BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL,
|
||||||
@@ -2631,7 +2622,6 @@ done:
|
|||||||
TX_CORE_CLK,
|
TX_CORE_CLK,
|
||||||
false);
|
false);
|
||||||
exit:
|
exit:
|
||||||
trace_printk("%s: exit\n", __func__);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2711,10 +2701,6 @@ static int tx_macro_swrm_clock(void *handle, bool enable)
|
|||||||
}
|
}
|
||||||
|
|
||||||
mutex_lock(&tx_priv->swr_clk_lock);
|
mutex_lock(&tx_priv->swr_clk_lock);
|
||||||
trace_printk("%s: swrm clock %s tx_swr_clk_cnt: %d va_swr_clk_cnt: %d\n",
|
|
||||||
__func__,
|
|
||||||
(enable ? "enable" : "disable"),
|
|
||||||
tx_priv->tx_swr_clk_cnt, tx_priv->va_swr_clk_cnt);
|
|
||||||
dev_dbg(tx_priv->dev,
|
dev_dbg(tx_priv->dev,
|
||||||
"%s: swrm clock %s tx_swr_clk_cnt: %d va_swr_clk_cnt: %d\n",
|
"%s: swrm clock %s tx_swr_clk_cnt: %d va_swr_clk_cnt: %d\n",
|
||||||
__func__, (enable ? "enable" : "disable"),
|
__func__, (enable ? "enable" : "disable"),
|
||||||
@@ -2777,9 +2763,6 @@ static int tx_macro_swrm_clock(void *handle, bool enable)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
trace_printk("%s: swrm clock users %d tx_clk_sts_cnt: %d va_clk_sts_cnt: %d\n",
|
|
||||||
__func__, tx_priv->swr_clk_users, tx_priv->tx_clk_status,
|
|
||||||
tx_priv->va_clk_status);
|
|
||||||
dev_dbg(tx_priv->dev,
|
dev_dbg(tx_priv->dev,
|
||||||
"%s: swrm clock users %d tx_clk_sts_cnt: %d va_clk_sts_cnt: %d\n",
|
"%s: swrm clock users %d tx_clk_sts_cnt: %d va_clk_sts_cnt: %d\n",
|
||||||
__func__, tx_priv->swr_clk_users, tx_priv->tx_clk_status,
|
__func__, tx_priv->swr_clk_users, tx_priv->tx_clk_status,
|
||||||
|
|||||||
@@ -314,7 +314,6 @@ static int va_macro_event_handler(struct snd_soc_component *component,
|
|||||||
VA_CORE_CLK, false);
|
VA_CORE_CLK, false);
|
||||||
break;
|
break;
|
||||||
case BOLERO_MACRO_EVT_SSR_UP:
|
case BOLERO_MACRO_EVT_SSR_UP:
|
||||||
trace_printk("%s, enter SSR up\n", __func__);
|
|
||||||
/* reset swr after ssr/pdr */
|
/* reset swr after ssr/pdr */
|
||||||
va_priv->reset_swr = true;
|
va_priv->reset_swr = true;
|
||||||
if (va_priv->swr_ctrl_data)
|
if (va_priv->swr_ctrl_data)
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-only
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
/* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
|
/* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
|
||||||
|
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
@@ -1007,7 +1008,6 @@ static int wsa_macro_event_handler(struct snd_soc_component *component,
|
|||||||
|
|
||||||
switch (event) {
|
switch (event) {
|
||||||
case BOLERO_MACRO_EVT_SSR_DOWN:
|
case BOLERO_MACRO_EVT_SSR_DOWN:
|
||||||
trace_printk("%s, enter SSR down\n", __func__);
|
|
||||||
if (wsa_priv->swr_ctrl_data) {
|
if (wsa_priv->swr_ctrl_data) {
|
||||||
swrm_wcd_notify(
|
swrm_wcd_notify(
|
||||||
wsa_priv->swr_ctrl_data[0].wsa_swr_pdev,
|
wsa_priv->swr_ctrl_data[0].wsa_swr_pdev,
|
||||||
@@ -1038,7 +1038,6 @@ static int wsa_macro_event_handler(struct snd_soc_component *component,
|
|||||||
WSA_CORE_CLK, false);
|
WSA_CORE_CLK, false);
|
||||||
break;
|
break;
|
||||||
case BOLERO_MACRO_EVT_SSR_UP:
|
case BOLERO_MACRO_EVT_SSR_UP:
|
||||||
trace_printk("%s, enter SSR up\n", __func__);
|
|
||||||
/* reset swr after ssr/pdr */
|
/* reset swr after ssr/pdr */
|
||||||
wsa_priv->reset_swr = true;
|
wsa_priv->reset_swr = true;
|
||||||
if (wsa_priv->swr_ctrl_data)
|
if (wsa_priv->swr_ctrl_data)
|
||||||
@@ -2862,9 +2861,6 @@ static int wsa_swrm_clock(void *handle, bool enable)
|
|||||||
|
|
||||||
mutex_lock(&wsa_priv->swr_clk_lock);
|
mutex_lock(&wsa_priv->swr_clk_lock);
|
||||||
|
|
||||||
trace_printk("%s: %s swrm clock %s\n",
|
|
||||||
dev_name(wsa_priv->dev), __func__,
|
|
||||||
(enable ? "enable" : "disable"));
|
|
||||||
dev_dbg(wsa_priv->dev, "%s: swrm clock %s\n",
|
dev_dbg(wsa_priv->dev, "%s: swrm clock %s\n",
|
||||||
__func__, (enable ? "enable" : "disable"));
|
__func__, (enable ? "enable" : "disable"));
|
||||||
if (enable) {
|
if (enable) {
|
||||||
@@ -2930,9 +2926,6 @@ static int wsa_swrm_clock(void *handle, bool enable)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
trace_printk("%s: %s swrm clock users: %d\n",
|
|
||||||
dev_name(wsa_priv->dev), __func__,
|
|
||||||
wsa_priv->swr_clk_users);
|
|
||||||
dev_dbg(wsa_priv->dev, "%s: swrm clock users %d\n",
|
dev_dbg(wsa_priv->dev, "%s: swrm clock users %d\n",
|
||||||
__func__, wsa_priv->swr_clk_users);
|
__func__, wsa_priv->swr_clk_users);
|
||||||
exit:
|
exit:
|
||||||
|
|||||||
@@ -1287,7 +1287,6 @@ static int msm_dai_q6_island_mode_put(struct snd_kcontrol *kcontrol,
|
|||||||
u16 port_id = (u16)kcontrol->private_value;
|
u16 port_id = (u16)kcontrol->private_value;
|
||||||
|
|
||||||
pr_debug("%s: island mode = %d\n", __func__, value);
|
pr_debug("%s: island mode = %d\n", __func__, value);
|
||||||
trace_printk("%s: island mode = %d\n", __func__, value);
|
|
||||||
|
|
||||||
afe_set_island_mode_cfg(port_id, value);
|
afe_set_island_mode_cfg(port_id, value);
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2019-2020, The Linux Foundation. All rights reserved.
|
* Copyright (c) 2019-2020, The Linux Foundation. All rights reserved.
|
||||||
|
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/clk.h>
|
#include <linux/clk.h>
|
||||||
@@ -33,7 +34,6 @@ int digital_cdc_rsc_mgr_hw_vote_enable(struct clk* vote_handle)
|
|||||||
mutex_unlock(&hw_vote_lock);
|
mutex_unlock(&hw_vote_lock);
|
||||||
|
|
||||||
pr_debug("%s: return %d\n", __func__, ret);
|
pr_debug("%s: return %d\n", __func__, ret);
|
||||||
trace_printk("%s: return %d\n", __func__, ret);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(digital_cdc_rsc_mgr_hw_vote_enable);
|
EXPORT_SYMBOL(digital_cdc_rsc_mgr_hw_vote_enable);
|
||||||
@@ -55,7 +55,7 @@ void digital_cdc_rsc_mgr_hw_vote_disable(struct clk* vote_handle)
|
|||||||
mutex_lock(&hw_vote_lock);
|
mutex_lock(&hw_vote_lock);
|
||||||
clk_disable_unprepare(vote_handle);
|
clk_disable_unprepare(vote_handle);
|
||||||
mutex_unlock(&hw_vote_lock);
|
mutex_unlock(&hw_vote_lock);
|
||||||
trace_printk("%s\n", __func__);
|
pr_debug("%s\n", __func__);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(digital_cdc_rsc_mgr_hw_vote_disable);
|
EXPORT_SYMBOL(digital_cdc_rsc_mgr_hw_vote_disable);
|
||||||
|
|
||||||
@@ -79,7 +79,6 @@ void digital_cdc_rsc_mgr_hw_vote_reset(struct clk* vote_handle)
|
|||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
pr_debug("%s: Vote count after SSR: %d\n", __func__, count);
|
pr_debug("%s: Vote count after SSR: %d\n", __func__, count);
|
||||||
trace_printk("%s: Vote count after SSR: %d\n", __func__, count);
|
|
||||||
|
|
||||||
while (count--)
|
while (count--)
|
||||||
clk_prepare_enable(vote_handle);
|
clk_prepare_enable(vote_handle);
|
||||||
|
|||||||
@@ -1576,8 +1576,6 @@ static int afe_apr_send_pkt(void *data, wait_queue_head_t *wait)
|
|||||||
pr_err_ratelimited("%s: request timedout\n",
|
pr_err_ratelimited("%s: request timedout\n",
|
||||||
__func__);
|
__func__);
|
||||||
ret = -ETIMEDOUT;
|
ret = -ETIMEDOUT;
|
||||||
trace_printk("%s: wait for ADSP response timed out\n",
|
|
||||||
__func__);
|
|
||||||
} else if (atomic_read(&this_afe.status) > 0) {
|
} else if (atomic_read(&this_afe.status) > 0) {
|
||||||
pr_err("%s: DSP returned error[%s]\n", __func__,
|
pr_err("%s: DSP returned error[%s]\n", __func__,
|
||||||
adsp_err_get_err_str(atomic_read(
|
adsp_err_get_err_str(atomic_read(
|
||||||
@@ -3378,8 +3376,6 @@ int afe_send_port_island_mode(u16 port_id)
|
|||||||
}
|
}
|
||||||
pr_debug("%s: AFE set island mode 0x%x enable for port 0x%x ret %d\n",
|
pr_debug("%s: AFE set island mode 0x%x enable for port 0x%x ret %d\n",
|
||||||
__func__, island_mode, port_id, ret);
|
__func__, island_mode, port_id, ret);
|
||||||
trace_printk("%s: AFE set island mode 0x%x enable for port 0x%x ret %d\n",
|
|
||||||
__func__, island_mode, port_id, ret);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(afe_send_port_island_mode);
|
EXPORT_SYMBOL(afe_send_port_island_mode);
|
||||||
@@ -4885,8 +4881,6 @@ void afe_set_island_mode_cfg(u16 port_id, u32 enable_flag)
|
|||||||
port_index = afe_get_port_index(port_id);
|
port_index = afe_get_port_index(port_id);
|
||||||
this_afe.island_mode[port_index] = enable_flag;
|
this_afe.island_mode[port_index] = enable_flag;
|
||||||
|
|
||||||
trace_printk("%s: set island mode cfg 0x%x for port 0x%x\n",
|
|
||||||
__func__, this_afe.island_mode[port_index], port_id);
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(afe_set_island_mode_cfg);
|
EXPORT_SYMBOL(afe_set_island_mode_cfg);
|
||||||
|
|
||||||
@@ -9078,15 +9072,6 @@ int afe_set_lpass_clock(u16 port_id, struct afe_clk_cfg *cfg)
|
|||||||
cfg->clk_root, cfg->clk_set_mode,
|
cfg->clk_root, cfg->clk_set_mode,
|
||||||
cfg->reserved, q6audio_get_port_id(port_id));
|
cfg->reserved, q6audio_get_port_id(port_id));
|
||||||
|
|
||||||
trace_printk("%s: Minor version =0x%x clk val1 = %d\n"
|
|
||||||
"clk val2 = %d, clk src = 0x%x\n"
|
|
||||||
"clk root = 0x%x clk mode = 0x%x resrv = 0x%x\n"
|
|
||||||
"port id = 0x%x\n",
|
|
||||||
__func__, cfg->i2s_cfg_minor_version,
|
|
||||||
cfg->clk_val1, cfg->clk_val2, cfg->clk_src,
|
|
||||||
cfg->clk_root, cfg->clk_set_mode,
|
|
||||||
cfg->reserved, q6audio_get_port_id(port_id));
|
|
||||||
|
|
||||||
ret = q6afe_pack_and_set_param_in_band(port_id,
|
ret = q6afe_pack_and_set_param_in_band(port_id,
|
||||||
q6audio_get_port_index(port_id),
|
q6audio_get_port_index(port_id),
|
||||||
param_hdr, (u8 *) &clk_cfg);
|
param_hdr, (u8 *) &clk_cfg);
|
||||||
@@ -9421,20 +9406,11 @@ int afe_set_lpass_clk_cfg(int index, struct afe_clk_set *cfg)
|
|||||||
cfg->clk_id, cfg->clk_freq_in_hz, cfg->clk_attri,
|
cfg->clk_id, cfg->clk_freq_in_hz, cfg->clk_attri,
|
||||||
cfg->clk_root, cfg->enable);
|
cfg->clk_root, cfg->enable);
|
||||||
|
|
||||||
trace_printk("%s: Minor version =0x%x clk id = %d\n"
|
|
||||||
"clk freq (Hz) = %d, clk attri = 0x%x\n"
|
|
||||||
"clk root = 0x%x clk enable = 0x%x\n",
|
|
||||||
__func__, cfg->clk_set_minor_version,
|
|
||||||
cfg->clk_id, cfg->clk_freq_in_hz, cfg->clk_attri,
|
|
||||||
cfg->clk_root, cfg->enable);
|
|
||||||
|
|
||||||
ret = q6afe_svc_pack_and_set_param_in_band(index, param_hdr,
|
ret = q6afe_svc_pack_and_set_param_in_band(index, param_hdr,
|
||||||
(u8 *) cfg);
|
(u8 *) cfg);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
pr_err_ratelimited("%s: AFE clk cfg failed with ret %d\n",
|
pr_err_ratelimited("%s: AFE clk cfg failed with ret %d\n",
|
||||||
__func__, ret);
|
__func__, ret);
|
||||||
trace_printk("%s: AFE clk cfg failed with ret %d\n",
|
|
||||||
__func__, ret);
|
|
||||||
}
|
}
|
||||||
mutex_unlock(&this_afe.afe_clk_lock);
|
mutex_unlock(&this_afe.afe_clk_lock);
|
||||||
return ret;
|
return ret;
|
||||||
@@ -11515,8 +11491,6 @@ int afe_vote_lpass_core_hw(uint32_t hw_block_id, char *client_name,
|
|||||||
pr_debug("%s: lpass core hw vote opcode[0x%x] hw id[0x%x]\n",
|
pr_debug("%s: lpass core hw vote opcode[0x%x] hw id[0x%x]\n",
|
||||||
__func__, cmd_ptr->hdr.opcode, cmd_ptr->hw_block_id);
|
__func__, cmd_ptr->hdr.opcode, cmd_ptr->hw_block_id);
|
||||||
|
|
||||||
trace_printk("%s: lpass core hw vote opcode[0x%x] hw id[0x%x]\n",
|
|
||||||
__func__, cmd_ptr->hdr.opcode, cmd_ptr->hw_block_id);
|
|
||||||
*client_handle = 0;
|
*client_handle = 0;
|
||||||
|
|
||||||
ret = afe_apr_send_clk_pkt((uint32_t *)cmd_ptr,
|
ret = afe_apr_send_clk_pkt((uint32_t *)cmd_ptr,
|
||||||
@@ -11556,7 +11530,6 @@ int afe_unvote_lpass_core_hw(uint32_t hw_block_id, uint32_t client_handle)
|
|||||||
|
|
||||||
if (!this_afe.lpass_hw_core_client_hdl[hw_block_id]) {
|
if (!this_afe.lpass_hw_core_client_hdl[hw_block_id]) {
|
||||||
pr_debug("%s: SSR in progress, return\n", __func__);
|
pr_debug("%s: SSR in progress, return\n", __func__);
|
||||||
trace_printk("%s: SSR in progress, return\n", __func__);
|
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -11576,9 +11549,6 @@ int afe_unvote_lpass_core_hw(uint32_t hw_block_id, uint32_t client_handle)
|
|||||||
pr_debug("%s: lpass core hw unvote opcode[0x%x] hw id[0x%x]\n",
|
pr_debug("%s: lpass core hw unvote opcode[0x%x] hw id[0x%x]\n",
|
||||||
__func__, cmd_ptr->hdr.opcode, cmd_ptr->hw_block_id);
|
__func__, cmd_ptr->hdr.opcode, cmd_ptr->hw_block_id);
|
||||||
|
|
||||||
trace_printk("%s: lpass core hw unvote opcode[0x%x] hw id[0x%x]\n",
|
|
||||||
__func__, cmd_ptr->hdr.opcode, cmd_ptr->hw_block_id);
|
|
||||||
|
|
||||||
if (cmd_ptr->client_handle <= 0) {
|
if (cmd_ptr->client_handle <= 0) {
|
||||||
pr_err("%s: invalid client handle\n", __func__);
|
pr_err("%s: invalid client handle\n", __func__);
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
|
|||||||
@@ -516,7 +516,6 @@ int lpi_pinctrl_suspend(struct device *dev)
|
|||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
trace_printk("%s: system suspend\n", __func__);
|
|
||||||
dev_dbg(dev, "%s: system suspend\n", __func__);
|
dev_dbg(dev, "%s: system suspend\n", __func__);
|
||||||
|
|
||||||
if ((!pm_runtime_enabled(dev) || !pm_runtime_suspended(dev))) {
|
if ((!pm_runtime_enabled(dev) || !pm_runtime_suspended(dev))) {
|
||||||
@@ -553,7 +552,6 @@ static struct notifier_block service_nb = {
|
|||||||
|
|
||||||
static void lpi_pinctrl_ssr_disable(struct device *dev, void *data)
|
static void lpi_pinctrl_ssr_disable(struct device *dev, void *data)
|
||||||
{
|
{
|
||||||
trace_printk("%s: enter\n", __func__);
|
|
||||||
lpi_dev_up = false;
|
lpi_dev_up = false;
|
||||||
lpi_pinctrl_suspend(dev);
|
lpi_pinctrl_suspend(dev);
|
||||||
}
|
}
|
||||||
@@ -878,7 +876,6 @@ int lpi_pinctrl_runtime_resume(struct device *dev)
|
|||||||
int ret = 0;
|
int ret = 0;
|
||||||
struct clk *hw_vote = state->lpass_core_hw_vote;
|
struct clk *hw_vote = state->lpass_core_hw_vote;
|
||||||
|
|
||||||
trace_printk("%s: enter\n", __func__);
|
|
||||||
if (state->lpass_core_hw_vote == NULL) {
|
if (state->lpass_core_hw_vote == NULL) {
|
||||||
dev_dbg(dev, "%s: Invalid core hw node\n", __func__);
|
dev_dbg(dev, "%s: Invalid core hw node\n", __func__);
|
||||||
if (state->lpass_audio_hw_vote == NULL) {
|
if (state->lpass_audio_hw_vote == NULL) {
|
||||||
@@ -904,7 +901,6 @@ int lpi_pinctrl_runtime_resume(struct device *dev)
|
|||||||
|
|
||||||
exit:
|
exit:
|
||||||
mutex_unlock(&state->core_hw_vote_lock);
|
mutex_unlock(&state->core_hw_vote_lock);
|
||||||
trace_printk("%s: exit\n", __func__);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -913,7 +909,6 @@ int lpi_pinctrl_runtime_suspend(struct device *dev)
|
|||||||
struct lpi_gpio_state *state = dev_get_drvdata(dev);
|
struct lpi_gpio_state *state = dev_get_drvdata(dev);
|
||||||
struct clk *hw_vote = state->lpass_core_hw_vote;
|
struct clk *hw_vote = state->lpass_core_hw_vote;
|
||||||
|
|
||||||
trace_printk("%s: enter\n", __func__);
|
|
||||||
if (state->lpass_core_hw_vote == NULL) {
|
if (state->lpass_core_hw_vote == NULL) {
|
||||||
dev_dbg(dev, "%s: Invalid core hw node\n", __func__);
|
dev_dbg(dev, "%s: Invalid core hw node\n", __func__);
|
||||||
if (state->lpass_audio_hw_vote == NULL) {
|
if (state->lpass_audio_hw_vote == NULL) {
|
||||||
@@ -929,7 +924,6 @@ int lpi_pinctrl_runtime_suspend(struct device *dev)
|
|||||||
state->core_hw_vote_status = false;
|
state->core_hw_vote_status = false;
|
||||||
}
|
}
|
||||||
mutex_unlock(&state->core_hw_vote_lock);
|
mutex_unlock(&state->core_hw_vote_lock);
|
||||||
trace_printk("%s: exit\n", __func__);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -381,8 +381,6 @@ static int swrm_request_hw_vote(struct swr_mstr_ctrl *swrm,
|
|||||||
if (!swrm->dev_up) {
|
if (!swrm->dev_up) {
|
||||||
dev_dbg(swrm->dev, "%s: device is down or SSR state\n",
|
dev_dbg(swrm->dev, "%s: device is down or SSR state\n",
|
||||||
__func__);
|
__func__);
|
||||||
trace_printk("%s: device is down or SSR state\n",
|
|
||||||
__func__);
|
|
||||||
mutex_unlock(&swrm->devlock);
|
mutex_unlock(&swrm->devlock);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
@@ -413,8 +411,6 @@ static int swrm_request_hw_vote(struct swr_mstr_ctrl *swrm,
|
|||||||
if (!swrm->dev_up) {
|
if (!swrm->dev_up) {
|
||||||
dev_dbg(swrm->dev, "%s: device is down or SSR state\n",
|
dev_dbg(swrm->dev, "%s: device is down or SSR state\n",
|
||||||
__func__);
|
__func__);
|
||||||
trace_printk("%s: device is down or SSR state\n",
|
|
||||||
__func__);
|
|
||||||
mutex_unlock(&swrm->devlock);
|
mutex_unlock(&swrm->devlock);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
@@ -443,8 +439,6 @@ static int swrm_request_hw_vote(struct swr_mstr_ctrl *swrm,
|
|||||||
mutex_unlock(&swrm->devlock);
|
mutex_unlock(&swrm->devlock);
|
||||||
dev_dbg(swrm->dev, "%s: hw_clk_en: %d audio_core_clk_en: %d\n",
|
dev_dbg(swrm->dev, "%s: hw_clk_en: %d audio_core_clk_en: %d\n",
|
||||||
__func__, swrm->hw_core_clk_en, swrm->aud_core_clk_en);
|
__func__, swrm->hw_core_clk_en, swrm->aud_core_clk_en);
|
||||||
trace_printk("%s: hw_clk_en: %d audio_core_clk_en: %d\n",
|
|
||||||
__func__, swrm->hw_core_clk_en, swrm->aud_core_clk_en);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -510,8 +504,6 @@ static int swrm_clk_request(struct swr_mstr_ctrl *swrm, bool enable)
|
|||||||
}
|
}
|
||||||
swrm->clk_ref_count++;
|
swrm->clk_ref_count++;
|
||||||
if (swrm->clk_ref_count == 1) {
|
if (swrm->clk_ref_count == 1) {
|
||||||
trace_printk("%s: clock enable count %d",
|
|
||||||
__func__, swrm->clk_ref_count);
|
|
||||||
ret = swrm->clk(swrm->handle, true);
|
ret = swrm->clk(swrm->handle, true);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err_ratelimited(swrm->dev,
|
dev_err_ratelimited(swrm->dev,
|
||||||
@@ -521,8 +513,6 @@ static int swrm_clk_request(struct swr_mstr_ctrl *swrm, bool enable)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (--swrm->clk_ref_count == 0) {
|
} else if (--swrm->clk_ref_count == 0) {
|
||||||
trace_printk("%s: clock disable count %d",
|
|
||||||
__func__, swrm->clk_ref_count);
|
|
||||||
swrm->clk(swrm->handle, false);
|
swrm->clk(swrm->handle, false);
|
||||||
complete(&swrm->clk_off_complete);
|
complete(&swrm->clk_off_complete);
|
||||||
}
|
}
|
||||||
@@ -1835,7 +1825,6 @@ static irqreturn_t swr_mstr_interrupt(int irq, void *dev)
|
|||||||
struct swr_device *swr_dev;
|
struct swr_device *swr_dev;
|
||||||
struct swr_master *mstr = &swrm->master;
|
struct swr_master *mstr = &swrm->master;
|
||||||
|
|
||||||
trace_printk("%s enter\n", __func__);
|
|
||||||
if (unlikely(swrm_lock_sleep(swrm) == false)) {
|
if (unlikely(swrm_lock_sleep(swrm) == false)) {
|
||||||
dev_err(swrm->dev, "%s Failed to hold suspend\n", __func__);
|
dev_err(swrm->dev, "%s Failed to hold suspend\n", __func__);
|
||||||
return IRQ_NONE;
|
return IRQ_NONE;
|
||||||
@@ -1853,7 +1842,6 @@ static irqreturn_t swr_mstr_interrupt(int irq, void *dev)
|
|||||||
intr_sts = swr_master_read(swrm, SWRM_INTERRUPT_STATUS);
|
intr_sts = swr_master_read(swrm, SWRM_INTERRUPT_STATUS);
|
||||||
intr_sts_masked = intr_sts & swrm->intr_mask;
|
intr_sts_masked = intr_sts & swrm->intr_mask;
|
||||||
|
|
||||||
trace_printk("%s: status: 0x%x \n", __func__, intr_sts_masked);
|
|
||||||
handle_irq:
|
handle_irq:
|
||||||
for (i = 0; i < SWRM_INTERRUPT_MAX; i++) {
|
for (i = 0; i < SWRM_INTERRUPT_MAX; i++) {
|
||||||
value = intr_sts_masked & (1 << i);
|
value = intr_sts_masked & (1 << i);
|
||||||
@@ -1998,7 +1986,6 @@ handle_irq:
|
|||||||
mutex_unlock(&swrm->reslock);
|
mutex_unlock(&swrm->reslock);
|
||||||
exit:
|
exit:
|
||||||
swrm_unlock_sleep(swrm);
|
swrm_unlock_sleep(swrm);
|
||||||
trace_printk("%s exit\n", __func__);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2013,7 +2000,6 @@ static irqreturn_t swr_mstr_interrupt_v2(int irq, void *dev)
|
|||||||
struct swr_device *swr_dev;
|
struct swr_device *swr_dev;
|
||||||
struct swr_master *mstr = &swrm->master;
|
struct swr_master *mstr = &swrm->master;
|
||||||
|
|
||||||
trace_printk("%s enter\n", __func__);
|
|
||||||
if (unlikely(swrm_lock_sleep(swrm) == false)) {
|
if (unlikely(swrm_lock_sleep(swrm) == false)) {
|
||||||
dev_err(swrm->dev, "%s Failed to hold suspend\n", __func__);
|
dev_err(swrm->dev, "%s Failed to hold suspend\n", __func__);
|
||||||
return IRQ_NONE;
|
return IRQ_NONE;
|
||||||
@@ -2040,7 +2026,6 @@ static irqreturn_t swr_mstr_interrupt_v2(int irq, void *dev)
|
|||||||
intr_sts_masked = intr_sts & swrm->intr_mask;
|
intr_sts_masked = intr_sts & swrm->intr_mask;
|
||||||
|
|
||||||
dev_dbg(swrm->dev, "%s: status: 0x%x \n", __func__, intr_sts_masked);
|
dev_dbg(swrm->dev, "%s: status: 0x%x \n", __func__, intr_sts_masked);
|
||||||
trace_printk("%s: status: 0x%x \n", __func__, intr_sts_masked);
|
|
||||||
handle_irq:
|
handle_irq:
|
||||||
for (i = 0; i < SWRM_INTERRUPT_MAX; i++) {
|
for (i = 0; i < SWRM_INTERRUPT_MAX; i++) {
|
||||||
value = intr_sts_masked & (1 << i);
|
value = intr_sts_masked & (1 << i);
|
||||||
@@ -2245,7 +2230,6 @@ err_audio_hw_vote:
|
|||||||
exit:
|
exit:
|
||||||
mutex_unlock(&swrm->reslock);
|
mutex_unlock(&swrm->reslock);
|
||||||
swrm_unlock_sleep(swrm);
|
swrm_unlock_sleep(swrm);
|
||||||
trace_printk("%s exit\n", __func__);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2259,7 +2243,6 @@ static irqreturn_t swrm_wakeup_interrupt(int irq, void *dev)
|
|||||||
return IRQ_NONE;
|
return IRQ_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
trace_printk("%s enter\n", __func__);
|
|
||||||
mutex_lock(&swrm->devlock);
|
mutex_lock(&swrm->devlock);
|
||||||
if (!swrm->dev_up) {
|
if (!swrm->dev_up) {
|
||||||
if (swrm->wake_irq > 0) {
|
if (swrm->wake_irq > 0) {
|
||||||
@@ -2298,7 +2281,6 @@ static irqreturn_t swrm_wakeup_interrupt(int irq, void *dev)
|
|||||||
pm_runtime_put_autosuspend(swrm->dev);
|
pm_runtime_put_autosuspend(swrm->dev);
|
||||||
swrm_unlock_sleep(swrm);
|
swrm_unlock_sleep(swrm);
|
||||||
exit:
|
exit:
|
||||||
trace_printk("%s exit\n", __func__);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2313,7 +2295,6 @@ static void swrm_wakeup_work(struct work_struct *work)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
trace_printk("%s enter\n", __func__);
|
|
||||||
mutex_lock(&swrm->devlock);
|
mutex_lock(&swrm->devlock);
|
||||||
if (!swrm->dev_up) {
|
if (!swrm->dev_up) {
|
||||||
mutex_unlock(&swrm->devlock);
|
mutex_unlock(&swrm->devlock);
|
||||||
@@ -2329,7 +2310,6 @@ static void swrm_wakeup_work(struct work_struct *work)
|
|||||||
pm_runtime_put_autosuspend(swrm->dev);
|
pm_runtime_put_autosuspend(swrm->dev);
|
||||||
swrm_unlock_sleep(swrm);
|
swrm_unlock_sleep(swrm);
|
||||||
exit:
|
exit:
|
||||||
trace_printk("%s exit\n", __func__);
|
|
||||||
pm_relax(swrm->dev);
|
pm_relax(swrm->dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3049,8 +3029,6 @@ static int swrm_runtime_resume(struct device *dev)
|
|||||||
|
|
||||||
dev_dbg(dev, "%s: pm_runtime: resume, state:%d\n",
|
dev_dbg(dev, "%s: pm_runtime: resume, state:%d\n",
|
||||||
__func__, swrm->state);
|
__func__, swrm->state);
|
||||||
trace_printk("%s: pm_runtime: resume, state:%d\n",
|
|
||||||
__func__, swrm->state);
|
|
||||||
mutex_lock(&swrm->reslock);
|
mutex_lock(&swrm->reslock);
|
||||||
|
|
||||||
if (swrm_request_hw_vote(swrm, LPASS_HW_CORE, true)) {
|
if (swrm_request_hw_vote(swrm, LPASS_HW_CORE, true)) {
|
||||||
@@ -3101,9 +3079,6 @@ static int swrm_runtime_resume(struct device *dev)
|
|||||||
dev_dbg(dev,
|
dev_dbg(dev,
|
||||||
"%s slave device up not implemented\n",
|
"%s slave device up not implemented\n",
|
||||||
__func__);
|
__func__);
|
||||||
trace_printk(
|
|
||||||
"%s slave device up not implemented\n",
|
|
||||||
__func__);
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
} else if (ret) {
|
} else if (ret) {
|
||||||
dev_err(dev,
|
dev_err(dev,
|
||||||
@@ -3161,8 +3136,6 @@ exit:
|
|||||||
swrm->req_clk_switch = false;
|
swrm->req_clk_switch = false;
|
||||||
mutex_unlock(&swrm->reslock);
|
mutex_unlock(&swrm->reslock);
|
||||||
|
|
||||||
trace_printk("%s: pm_runtime: resume done, state:%d\n",
|
|
||||||
__func__, swrm->state);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3178,8 +3151,6 @@ static int swrm_runtime_suspend(struct device *dev)
|
|||||||
int current_state = 0;
|
int current_state = 0;
|
||||||
struct irq_data *irq_data = NULL;
|
struct irq_data *irq_data = NULL;
|
||||||
|
|
||||||
trace_printk("%s: pm_runtime: suspend state: %d\n",
|
|
||||||
__func__, swrm->state);
|
|
||||||
dev_dbg(dev, "%s: pm_runtime: suspend state: %d\n",
|
dev_dbg(dev, "%s: pm_runtime: suspend state: %d\n",
|
||||||
__func__, swrm->state);
|
__func__, swrm->state);
|
||||||
if (swrm->state == SWR_MSTR_SSR_RESET) {
|
if (swrm->state == SWR_MSTR_SSR_RESET) {
|
||||||
@@ -3208,7 +3179,6 @@ static int swrm_runtime_suspend(struct device *dev)
|
|||||||
if ((current_state != SWR_MSTR_SSR) &&
|
if ((current_state != SWR_MSTR_SSR) &&
|
||||||
swrm_is_port_en(&swrm->master)) {
|
swrm_is_port_en(&swrm->master)) {
|
||||||
dev_dbg(dev, "%s ports are enabled\n", __func__);
|
dev_dbg(dev, "%s ports are enabled\n", __func__);
|
||||||
trace_printk("%s ports are enabled\n", __func__);
|
|
||||||
ret = -EBUSY;
|
ret = -EBUSY;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
@@ -3242,22 +3212,14 @@ static int swrm_runtime_suspend(struct device *dev)
|
|||||||
dev_dbg_ratelimited(dev,
|
dev_dbg_ratelimited(dev,
|
||||||
"%s slave device down not implemented\n",
|
"%s slave device down not implemented\n",
|
||||||
__func__);
|
__func__);
|
||||||
trace_printk(
|
|
||||||
"%s slave device down not implemented\n",
|
|
||||||
__func__);
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
} else if (ret) {
|
} else if (ret) {
|
||||||
dev_err(dev,
|
dev_err(dev,
|
||||||
"%s: failed to shutdown swr dev %d\n",
|
"%s: failed to shutdown swr dev %d\n",
|
||||||
__func__, swr_dev->dev_num);
|
__func__, swr_dev->dev_num);
|
||||||
trace_printk(
|
|
||||||
"%s: failed to shutdown swr dev %d\n",
|
|
||||||
__func__, swr_dev->dev_num);
|
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
trace_printk("%s: clk stop mode not supported or SSR exit\n",
|
|
||||||
__func__);
|
|
||||||
} else {
|
} else {
|
||||||
/* Mask bus clash interrupt */
|
/* Mask bus clash interrupt */
|
||||||
swrm->intr_mask &= ~((u32)0x08);
|
swrm->intr_mask &= ~((u32)0x08);
|
||||||
@@ -3305,8 +3267,6 @@ exit:
|
|||||||
if (!hw_core_err)
|
if (!hw_core_err)
|
||||||
swrm_request_hw_vote(swrm, LPASS_HW_CORE, false);
|
swrm_request_hw_vote(swrm, LPASS_HW_CORE, false);
|
||||||
mutex_unlock(&swrm->reslock);
|
mutex_unlock(&swrm->reslock);
|
||||||
trace_printk("%s: pm_runtime: suspend done state: %d\n",
|
|
||||||
__func__, swrm->state);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_PM */
|
#endif /* CONFIG_PM */
|
||||||
@@ -3318,7 +3278,6 @@ static int swrm_device_suspend(struct device *dev)
|
|||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
dev_dbg(dev, "%s: swrm state: %d\n", __func__, swrm->state);
|
dev_dbg(dev, "%s: swrm state: %d\n", __func__, swrm->state);
|
||||||
trace_printk("%s: swrm state: %d\n", __func__, swrm->state);
|
|
||||||
if (!pm_runtime_enabled(dev) || !pm_runtime_suspended(dev)) {
|
if (!pm_runtime_enabled(dev) || !pm_runtime_suspended(dev)) {
|
||||||
ret = swrm_runtime_suspend(dev);
|
ret = swrm_runtime_suspend(dev);
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
@@ -3337,7 +3296,6 @@ static int swrm_device_down(struct device *dev)
|
|||||||
struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev);
|
struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev);
|
||||||
|
|
||||||
dev_dbg(dev, "%s: swrm state: %d\n", __func__, swrm->state);
|
dev_dbg(dev, "%s: swrm state: %d\n", __func__, swrm->state);
|
||||||
trace_printk("%s: swrm state: %d\n", __func__, swrm->state);
|
|
||||||
|
|
||||||
mutex_lock(&swrm->force_down_lock);
|
mutex_lock(&swrm->force_down_lock);
|
||||||
swrm->state = SWR_MSTR_SSR;
|
swrm->state = SWR_MSTR_SSR;
|
||||||
@@ -3515,7 +3473,6 @@ int swrm_wcd_notify(struct platform_device *pdev, u32 id, void *data)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SWR_DEVICE_SSR_DOWN:
|
case SWR_DEVICE_SSR_DOWN:
|
||||||
trace_printk("%s: swr device down called\n", __func__);
|
|
||||||
mutex_lock(&swrm->mlock);
|
mutex_lock(&swrm->mlock);
|
||||||
if (swrm->state == SWR_MSTR_DOWN)
|
if (swrm->state == SWR_MSTR_DOWN)
|
||||||
dev_dbg(swrm->dev, "%s:SWR master is already Down:%d\n",
|
dev_dbg(swrm->dev, "%s:SWR master is already Down:%d\n",
|
||||||
@@ -3534,7 +3491,6 @@ int swrm_wcd_notify(struct platform_device *pdev, u32 id, void *data)
|
|||||||
break;
|
break;
|
||||||
case SWR_DEVICE_SSR_UP:
|
case SWR_DEVICE_SSR_UP:
|
||||||
/* wait for clk voting to be zero */
|
/* wait for clk voting to be zero */
|
||||||
trace_printk("%s: swr device up called\n", __func__);
|
|
||||||
reinit_completion(&swrm->clk_off_complete);
|
reinit_completion(&swrm->clk_off_complete);
|
||||||
if (swrm->clk_ref_count &&
|
if (swrm->clk_ref_count &&
|
||||||
!wait_for_completion_timeout(&swrm->clk_off_complete,
|
!wait_for_completion_timeout(&swrm->clk_off_complete,
|
||||||
@@ -3560,7 +3516,6 @@ int swrm_wcd_notify(struct platform_device *pdev, u32 id, void *data)
|
|||||||
break;
|
break;
|
||||||
case SWR_DEVICE_DOWN:
|
case SWR_DEVICE_DOWN:
|
||||||
dev_dbg(swrm->dev, "%s: swr master down called\n", __func__);
|
dev_dbg(swrm->dev, "%s: swr master down called\n", __func__);
|
||||||
trace_printk("%s: swr master down called\n", __func__);
|
|
||||||
mutex_lock(&swrm->mlock);
|
mutex_lock(&swrm->mlock);
|
||||||
if (swrm->state == SWR_MSTR_DOWN)
|
if (swrm->state == SWR_MSTR_DOWN)
|
||||||
dev_dbg(swrm->dev, "%s:SWR master is already Down:%d\n",
|
dev_dbg(swrm->dev, "%s:SWR master is already Down:%d\n",
|
||||||
@@ -3571,7 +3526,6 @@ int swrm_wcd_notify(struct platform_device *pdev, u32 id, void *data)
|
|||||||
break;
|
break;
|
||||||
case SWR_DEVICE_UP:
|
case SWR_DEVICE_UP:
|
||||||
dev_dbg(swrm->dev, "%s: swr master up called\n", __func__);
|
dev_dbg(swrm->dev, "%s: swr master up called\n", __func__);
|
||||||
trace_printk("%s: swr master up called\n", __func__);
|
|
||||||
mutex_lock(&swrm->devlock);
|
mutex_lock(&swrm->devlock);
|
||||||
if (!swrm->dev_up) {
|
if (!swrm->dev_up) {
|
||||||
dev_dbg(swrm->dev, "SSR not complete yet\n");
|
dev_dbg(swrm->dev, "SSR not complete yet\n");
|
||||||
|
|||||||
Reference in new issue
Block a user