Merge 7d8dfc27d9 ("smb: client: Fix netns refcount imbalance causing leaks and use-after-free") into android16-6.12
Steps on the way to 6.12.23 Change-Id: I071040c57ea134f0a618ecc9e25db4a302dff4a8 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -581,6 +581,8 @@ patternProperties:
|
||||
description: GlobalTop Technology, Inc.
|
||||
"^gmt,.*":
|
||||
description: Global Mixed-mode Technology, Inc.
|
||||
"^gocontroll,.*":
|
||||
description: GOcontroll Modular Embedded Electronics B.V.
|
||||
"^goldelico,.*":
|
||||
description: Golden Delicious Computers GmbH & Co. KG
|
||||
"^goodix,.*":
|
||||
|
||||
@@ -78,4 +78,4 @@ CONFIG_DEBUG_VM_PGTABLE=y
|
||||
CONFIG_DETECT_HUNG_TASK=y
|
||||
CONFIG_BDI_SWITCH=y
|
||||
CONFIG_PPC_EARLY_DEBUG=y
|
||||
CONFIG_GENERIC_PTDUMP=y
|
||||
CONFIG_PTDUMP_DEBUGFS=y
|
||||
|
||||
@@ -56,3 +56,4 @@ $(obj)/aesp8-ppc.S $(obj)/ghashp8-ppc.S: $(obj)/%.S: $(src)/%.pl FORCE
|
||||
OBJECT_FILES_NON_STANDARD_aesp10-ppc.o := y
|
||||
OBJECT_FILES_NON_STANDARD_ghashp10-ppc.o := y
|
||||
OBJECT_FILES_NON_STANDARD_aesp8-ppc.o := y
|
||||
OBJECT_FILES_NON_STANDARD_ghashp8-ppc.o := y
|
||||
|
||||
@@ -348,16 +348,13 @@ write_utlb:
|
||||
rlwinm r10, r24, 0, 22, 27
|
||||
|
||||
cmpwi r10, PPC47x_TLB0_4K
|
||||
bne 0f
|
||||
li r10, 0x1000 /* r10 = 4k */
|
||||
ANNOTATE_INTRA_FUNCTION_CALL
|
||||
bl 1f
|
||||
beq 0f
|
||||
|
||||
0:
|
||||
/* Defaults to 256M */
|
||||
lis r10, 0x1000
|
||||
|
||||
bcl 20,31,$+4
|
||||
0: bcl 20,31,$+4
|
||||
1: mflr r4
|
||||
addi r4, r4, (2f-1b) /* virtual address of 2f */
|
||||
|
||||
|
||||
@@ -666,6 +666,7 @@ int kvm_riscv_vcpu_pmu_ctr_cfg_match(struct kvm_vcpu *vcpu, unsigned long ctr_ba
|
||||
.type = etype,
|
||||
.size = sizeof(struct perf_event_attr),
|
||||
.pinned = true,
|
||||
.disabled = true,
|
||||
/*
|
||||
* It should never reach here if the platform doesn't support the sscofpmf
|
||||
* extension as mode filtering won't work without it.
|
||||
|
||||
@@ -34,8 +34,6 @@ void unxlate_dev_mem_ptr(phys_addr_t phys, void *addr);
|
||||
|
||||
#define ioremap_wc(addr, size) \
|
||||
ioremap_prot((addr), (size), pgprot_val(pgprot_writecombine(PAGE_KERNEL)))
|
||||
#define ioremap_wt(addr, size) \
|
||||
ioremap_prot((addr), (size), pgprot_val(pgprot_writethrough(PAGE_KERNEL)))
|
||||
|
||||
static inline void __iomem *ioport_map(unsigned long port, unsigned int nr)
|
||||
{
|
||||
|
||||
@@ -1365,9 +1365,6 @@ void gmap_pmdp_idte_global(struct mm_struct *mm, unsigned long vmaddr);
|
||||
#define pgprot_writecombine pgprot_writecombine
|
||||
pgprot_t pgprot_writecombine(pgprot_t prot);
|
||||
|
||||
#define pgprot_writethrough pgprot_writethrough
|
||||
pgprot_t pgprot_writethrough(pgprot_t prot);
|
||||
|
||||
#define PFN_PTE_SHIFT PAGE_SHIFT
|
||||
|
||||
/*
|
||||
|
||||
@@ -34,16 +34,6 @@ pgprot_t pgprot_writecombine(pgprot_t prot)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(pgprot_writecombine);
|
||||
|
||||
pgprot_t pgprot_writethrough(pgprot_t prot)
|
||||
{
|
||||
/*
|
||||
* mio_wb_bit_mask may be set on a different CPU, but it is only set
|
||||
* once at init and only read afterwards.
|
||||
*/
|
||||
return __pgprot(pgprot_val(prot) & ~mio_wb_bit_mask);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(pgprot_writethrough);
|
||||
|
||||
static inline void ptep_ipte_local(struct mm_struct *mm, unsigned long addr,
|
||||
pte_t *ptep, int nodat)
|
||||
{
|
||||
|
||||
@@ -218,7 +218,6 @@ extern int os_protect_memory(void *addr, unsigned long len,
|
||||
extern int os_unmap_memory(void *addr, int len);
|
||||
extern int os_drop_memory(void *addr, int length);
|
||||
extern int can_drop_memory(void);
|
||||
extern int os_mincore(void *addr, unsigned long len);
|
||||
|
||||
/* execvp.c */
|
||||
extern int execvp_noalloc(char *buf, const char *file, char *const argv[]);
|
||||
|
||||
@@ -17,7 +17,7 @@ extra-y := vmlinux.lds
|
||||
obj-y = config.o exec.o exitcode.o irq.o ksyms.o mem.o \
|
||||
physmem.o process.o ptrace.o reboot.o sigio.o \
|
||||
signal.o sysrq.o time.o tlb.o trap.o \
|
||||
um_arch.o umid.o maccess.o kmsg_dump.o capflags.o skas/
|
||||
um_arch.o umid.o kmsg_dump.o capflags.o skas/
|
||||
obj-y += load_file.o
|
||||
|
||||
obj-$(CONFIG_BLK_DEV_INITRD) += initrd.o
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (C) 2013 Richard Weinberger <richrd@nod.at>
|
||||
*/
|
||||
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <os.h>
|
||||
|
||||
bool copy_from_kernel_nofault_allowed(const void *src, size_t size)
|
||||
{
|
||||
void *psrc = (void *)rounddown((unsigned long)src, PAGE_SIZE);
|
||||
|
||||
if ((unsigned long)src < PAGE_SIZE || size <= 0)
|
||||
return false;
|
||||
if (os_mincore(psrc, size + src - psrc) <= 0)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
@@ -223,57 +223,6 @@ out:
|
||||
return ok;
|
||||
}
|
||||
|
||||
static int os_page_mincore(void *addr)
|
||||
{
|
||||
char vec[2];
|
||||
int ret;
|
||||
|
||||
ret = mincore(addr, UM_KERN_PAGE_SIZE, vec);
|
||||
if (ret < 0) {
|
||||
if (errno == ENOMEM || errno == EINVAL)
|
||||
return 0;
|
||||
else
|
||||
return -errno;
|
||||
}
|
||||
|
||||
return vec[0] & 1;
|
||||
}
|
||||
|
||||
int os_mincore(void *addr, unsigned long len)
|
||||
{
|
||||
char *vec;
|
||||
int ret, i;
|
||||
|
||||
if (len <= UM_KERN_PAGE_SIZE)
|
||||
return os_page_mincore(addr);
|
||||
|
||||
vec = calloc(1, (len + UM_KERN_PAGE_SIZE - 1) / UM_KERN_PAGE_SIZE);
|
||||
if (!vec)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = mincore(addr, UM_KERN_PAGE_SIZE, vec);
|
||||
if (ret < 0) {
|
||||
if (errno == ENOMEM || errno == EINVAL)
|
||||
ret = 0;
|
||||
else
|
||||
ret = -errno;
|
||||
|
||||
goto out;
|
||||
}
|
||||
|
||||
for (i = 0; i < ((len + UM_KERN_PAGE_SIZE - 1) / UM_KERN_PAGE_SIZE); i++) {
|
||||
if (!(vec[i] & 1)) {
|
||||
ret = 0;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
ret = 1;
|
||||
out:
|
||||
free(vec);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void init_new_thread_signals(void)
|
||||
{
|
||||
set_handler(SIGSEGV);
|
||||
|
||||
+1
-1
@@ -227,7 +227,7 @@ config X86
|
||||
select HAVE_SAMPLE_FTRACE_DIRECT_MULTI if X86_64
|
||||
select HAVE_EBPF_JIT
|
||||
select HAVE_EFFICIENT_UNALIGNED_ACCESS
|
||||
select HAVE_EISA
|
||||
select HAVE_EISA if X86_32
|
||||
select HAVE_EXIT_THREAD
|
||||
select HAVE_GUP_FAST
|
||||
select HAVE_FENTRY if X86_64 || DYNAMIC_FTRACE
|
||||
|
||||
@@ -7,12 +7,13 @@ core-y += arch/x86/crypto/
|
||||
# GCC versions < 11. See:
|
||||
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99652
|
||||
#
|
||||
ifeq ($(CONFIG_CC_IS_CLANG),y)
|
||||
KBUILD_CFLAGS += -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -mno-avx
|
||||
KBUILD_RUSTFLAGS += --target=$(objtree)/scripts/target.json
|
||||
ifeq ($(call gcc-min-version, 110000)$(CONFIG_CC_IS_CLANG),y)
|
||||
KBUILD_CFLAGS += -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -mno-avx
|
||||
KBUILD_RUSTFLAGS += -Ctarget-feature=-sse,-sse2,-sse3,-ssse3,-sse4.1,-sse4.2,-avx,-avx2
|
||||
endif
|
||||
|
||||
KBUILD_RUSTFLAGS += --target=$(objtree)/scripts/target.json
|
||||
|
||||
ifeq ($(CONFIG_X86_32),y)
|
||||
START := 0x8048000
|
||||
|
||||
|
||||
@@ -70,6 +70,8 @@ For 32-bit we have the following conventions - kernel is built with
|
||||
pushq %rsi /* pt_regs->si */
|
||||
movq 8(%rsp), %rsi /* temporarily store the return address in %rsi */
|
||||
movq %rdi, 8(%rsp) /* pt_regs->di (overwriting original return address) */
|
||||
/* We just clobbered the return address - use the IRET frame for unwinding: */
|
||||
UNWIND_HINT_IRET_REGS offset=3*8
|
||||
.else
|
||||
pushq %rdi /* pt_regs->di */
|
||||
pushq %rsi /* pt_regs->si */
|
||||
|
||||
@@ -142,7 +142,7 @@ static __always_inline int syscall_32_enter(struct pt_regs *regs)
|
||||
#ifdef CONFIG_IA32_EMULATION
|
||||
bool __ia32_enabled __ro_after_init = !IS_ENABLED(CONFIG_IA32_EMULATION_DEFAULT_DISABLED);
|
||||
|
||||
static int ia32_emulation_override_cmdline(char *arg)
|
||||
static int __init ia32_emulation_override_cmdline(char *arg)
|
||||
{
|
||||
return kstrtobool(arg, &__ia32_enabled);
|
||||
}
|
||||
|
||||
@@ -148,7 +148,8 @@ static int closid_alloc(void)
|
||||
|
||||
lockdep_assert_held(&rdtgroup_mutex);
|
||||
|
||||
if (IS_ENABLED(CONFIG_RESCTRL_RMID_DEPENDS_ON_CLOSID)) {
|
||||
if (IS_ENABLED(CONFIG_RESCTRL_RMID_DEPENDS_ON_CLOSID) &&
|
||||
is_llc_occupancy_enabled()) {
|
||||
cleanest_closid = resctrl_find_cleanest_closid();
|
||||
if (cleanest_closid < 0)
|
||||
return cleanest_closid;
|
||||
|
||||
@@ -195,6 +195,7 @@ static void show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs,
|
||||
printk("%sCall Trace:\n", log_lvl);
|
||||
|
||||
unwind_start(&state, task, regs, stack);
|
||||
stack = stack ?: get_stack_pointer(task, regs);
|
||||
regs = unwind_get_entry_regs(&state, &partial);
|
||||
|
||||
/*
|
||||
@@ -213,9 +214,7 @@ static void show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs,
|
||||
* - hardirq stack
|
||||
* - entry stack
|
||||
*/
|
||||
for (stack = stack ?: get_stack_pointer(task, regs);
|
||||
stack;
|
||||
stack = stack_info.next_sp) {
|
||||
for (; stack; stack = stack_info.next_sp) {
|
||||
const char *stack_name;
|
||||
|
||||
stack = PTR_ALIGN(stack, sizeof(long));
|
||||
|
||||
@@ -220,7 +220,7 @@ bool fpu_alloc_guest_fpstate(struct fpu_guest *gfpu)
|
||||
struct fpstate *fpstate;
|
||||
unsigned int size;
|
||||
|
||||
size = fpu_user_cfg.default_size + ALIGN(offsetof(struct fpstate, regs), 64);
|
||||
size = fpu_kernel_cfg.default_size + ALIGN(offsetof(struct fpstate, regs), 64);
|
||||
fpstate = vzalloc(size);
|
||||
if (!fpstate)
|
||||
return false;
|
||||
@@ -232,8 +232,8 @@ bool fpu_alloc_guest_fpstate(struct fpu_guest *gfpu)
|
||||
fpstate->is_guest = true;
|
||||
|
||||
gfpu->fpstate = fpstate;
|
||||
gfpu->xfeatures = fpu_user_cfg.default_features;
|
||||
gfpu->perm = fpu_user_cfg.default_features;
|
||||
gfpu->xfeatures = fpu_kernel_cfg.default_features;
|
||||
gfpu->perm = fpu_kernel_cfg.default_features;
|
||||
|
||||
/*
|
||||
* KVM sets the FP+SSE bits in the XSAVE header when copying FPU state
|
||||
|
||||
@@ -92,7 +92,12 @@ EXPORT_PER_CPU_SYMBOL_GPL(__tss_limit_invalid);
|
||||
*/
|
||||
int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)
|
||||
{
|
||||
memcpy(dst, src, arch_task_struct_size);
|
||||
/* init_task is not dynamically sized (incomplete FPU state) */
|
||||
if (unlikely(src == &init_task))
|
||||
memcpy_and_pad(dst, arch_task_struct_size, src, sizeof(init_task), 0);
|
||||
else
|
||||
memcpy(dst, src, arch_task_struct_size);
|
||||
|
||||
#ifdef CONFIG_VM86
|
||||
dst->thread.vm86 = NULL;
|
||||
#endif
|
||||
|
||||
+17
-1
@@ -379,6 +379,21 @@ __visible void __noreturn handle_stack_overflow(struct pt_regs *regs,
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Prevent the compiler and/or objtool from marking the !CONFIG_X86_ESPFIX64
|
||||
* version of exc_double_fault() as noreturn. Otherwise the noreturn mismatch
|
||||
* between configs triggers objtool warnings.
|
||||
*
|
||||
* This is a temporary hack until we have compiler or plugin support for
|
||||
* annotating noreturns.
|
||||
*/
|
||||
#ifdef CONFIG_X86_ESPFIX64
|
||||
#define always_true() true
|
||||
#else
|
||||
bool always_true(void);
|
||||
bool __weak always_true(void) { return true; }
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Runs on an IST stack for x86_64 and on a special task stack for x86_32.
|
||||
*
|
||||
@@ -514,7 +529,8 @@ DEFINE_IDTENTRY_DF(exc_double_fault)
|
||||
|
||||
pr_emerg("PANIC: double fault, error_code: 0x%lx\n", error_code);
|
||||
die("double fault", regs, error_code);
|
||||
panic("Machine halted.");
|
||||
if (always_true())
|
||||
panic("Machine halted.");
|
||||
instrumentation_end();
|
||||
}
|
||||
|
||||
|
||||
@@ -562,7 +562,7 @@ void __head sme_enable(struct boot_params *bp)
|
||||
}
|
||||
|
||||
RIP_REL_REF(sme_me_mask) = me_mask;
|
||||
physical_mask &= ~me_mask;
|
||||
cc_vendor = CC_VENDOR_AMD;
|
||||
RIP_REL_REF(physical_mask) &= ~me_mask;
|
||||
RIP_REL_REF(cc_vendor) = CC_VENDOR_AMD;
|
||||
cc_set_mask(me_mask);
|
||||
}
|
||||
|
||||
@@ -183,7 +183,7 @@ static int pageattr_test(void)
|
||||
break;
|
||||
|
||||
case 1:
|
||||
err = change_page_attr_set(addrs, len[1], PAGE_CPA_TEST, 1);
|
||||
err = change_page_attr_set(addrs, len[i], PAGE_CPA_TEST, 1);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
|
||||
+28
-24
@@ -984,29 +984,42 @@ static int get_pat_info(struct vm_area_struct *vma, resource_size_t *paddr,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/*
|
||||
* track_pfn_copy is called when vma that is covering the pfnmap gets
|
||||
* copied through copy_page_range().
|
||||
*
|
||||
* If the vma has a linear pfn mapping for the entire range, we get the prot
|
||||
* from pte and reserve the entire vma range with single reserve_pfn_range call.
|
||||
*/
|
||||
int track_pfn_copy(struct vm_area_struct *vma)
|
||||
int track_pfn_copy(struct vm_area_struct *dst_vma,
|
||||
struct vm_area_struct *src_vma, unsigned long *pfn)
|
||||
{
|
||||
const unsigned long vma_size = src_vma->vm_end - src_vma->vm_start;
|
||||
resource_size_t paddr;
|
||||
unsigned long vma_size = vma->vm_end - vma->vm_start;
|
||||
pgprot_t pgprot;
|
||||
int rc;
|
||||
|
||||
if (vma->vm_flags & VM_PAT) {
|
||||
if (get_pat_info(vma, &paddr, &pgprot))
|
||||
return -EINVAL;
|
||||
/* reserve the whole chunk covered by vma. */
|
||||
return reserve_pfn_range(paddr, vma_size, &pgprot, 1);
|
||||
}
|
||||
if (!(src_vma->vm_flags & VM_PAT))
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* Duplicate the PAT information for the dst VMA based on the src
|
||||
* VMA.
|
||||
*/
|
||||
if (get_pat_info(src_vma, &paddr, &pgprot))
|
||||
return -EINVAL;
|
||||
rc = reserve_pfn_range(paddr, vma_size, &pgprot, 1);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
/* Reservation for the destination VMA succeeded. */
|
||||
vm_flags_set(dst_vma, VM_PAT);
|
||||
*pfn = PHYS_PFN(paddr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void untrack_pfn_copy(struct vm_area_struct *dst_vma, unsigned long pfn)
|
||||
{
|
||||
untrack_pfn(dst_vma, pfn, dst_vma->vm_end - dst_vma->vm_start, true);
|
||||
/*
|
||||
* Reservation was freed, any copied page tables will get cleaned
|
||||
* up later, but without getting PAT involved again.
|
||||
*/
|
||||
}
|
||||
|
||||
/*
|
||||
* prot is passed in as a parameter for the new mapping. If the vma has
|
||||
* a linear pfn mapping for the entire range, or no vma is provided,
|
||||
@@ -1095,15 +1108,6 @@ void untrack_pfn(struct vm_area_struct *vma, unsigned long pfn,
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* untrack_pfn_clear is called if the following situation fits:
|
||||
*
|
||||
* 1) while mremapping a pfnmap for a new region, with the old vma after
|
||||
* its pfnmap page table has been removed. The new vma has a new pfnmap
|
||||
* to the same pfn & cache type with VM_PAT set.
|
||||
* 2) while duplicating vm area, the new vma fails to copy the pgtable from
|
||||
* old vma.
|
||||
*/
|
||||
void untrack_pfn_clear(struct vm_area_struct *vma)
|
||||
{
|
||||
vm_flags_clear(vma, VM_PAT);
|
||||
|
||||
+7
-10
@@ -36,7 +36,8 @@ EXPORT_SYMBOL_GPL(crypto_chain);
|
||||
DEFINE_STATIC_KEY_FALSE(__crypto_boot_test_finished);
|
||||
#endif
|
||||
|
||||
static struct crypto_alg *crypto_larval_wait(struct crypto_alg *alg);
|
||||
static struct crypto_alg *crypto_larval_wait(struct crypto_alg *alg,
|
||||
u32 type, u32 mask);
|
||||
static struct crypto_alg *crypto_alg_lookup(const char *name, u32 type,
|
||||
u32 mask);
|
||||
|
||||
@@ -145,7 +146,7 @@ static struct crypto_alg *crypto_larval_add(const char *name, u32 type,
|
||||
if (alg != &larval->alg) {
|
||||
kfree(larval);
|
||||
if (crypto_is_larval(alg))
|
||||
alg = crypto_larval_wait(alg);
|
||||
alg = crypto_larval_wait(alg, type, mask);
|
||||
}
|
||||
|
||||
return alg;
|
||||
@@ -197,7 +198,8 @@ static void crypto_start_test(struct crypto_larval *larval)
|
||||
crypto_schedule_test(larval);
|
||||
}
|
||||
|
||||
static struct crypto_alg *crypto_larval_wait(struct crypto_alg *alg)
|
||||
static struct crypto_alg *crypto_larval_wait(struct crypto_alg *alg,
|
||||
u32 type, u32 mask)
|
||||
{
|
||||
struct crypto_larval *larval;
|
||||
long time_left;
|
||||
@@ -219,12 +221,7 @@ again:
|
||||
crypto_larval_kill(larval);
|
||||
alg = ERR_PTR(-ETIMEDOUT);
|
||||
} else if (!alg) {
|
||||
u32 type;
|
||||
u32 mask;
|
||||
|
||||
alg = &larval->alg;
|
||||
type = alg->cra_flags & ~(CRYPTO_ALG_LARVAL | CRYPTO_ALG_DEAD);
|
||||
mask = larval->mask;
|
||||
alg = crypto_alg_lookup(alg->cra_name, type, mask) ?:
|
||||
ERR_PTR(-EAGAIN);
|
||||
} else if (IS_ERR(alg))
|
||||
@@ -304,7 +301,7 @@ static struct crypto_alg *crypto_larval_lookup(const char *name, u32 type,
|
||||
}
|
||||
|
||||
if (!IS_ERR_OR_NULL(alg) && crypto_is_larval(alg))
|
||||
alg = crypto_larval_wait(alg);
|
||||
alg = crypto_larval_wait(alg, type, mask);
|
||||
else if (alg)
|
||||
;
|
||||
else if (!(mask & CRYPTO_ALG_TESTED))
|
||||
@@ -352,7 +349,7 @@ struct crypto_alg *crypto_alg_mod_lookup(const char *name, u32 type, u32 mask)
|
||||
ok = crypto_probing_notify(CRYPTO_MSG_ALG_REQUEST, larval);
|
||||
|
||||
if (ok == NOTIFY_STOP)
|
||||
alg = crypto_larval_wait(larval);
|
||||
alg = crypto_larval_wait(larval, type, mask);
|
||||
else {
|
||||
crypto_mod_put(larval);
|
||||
alg = ERR_PTR(-ENOENT);
|
||||
|
||||
@@ -80,3 +80,4 @@ static void __exit bpf_crypto_skcipher_exit(void)
|
||||
module_init(bpf_crypto_skcipher_init);
|
||||
module_exit(bpf_crypto_skcipher_exit);
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_DESCRIPTION("Symmetric key cipher support for BPF");
|
||||
|
||||
@@ -503,6 +503,7 @@ config HT16K33
|
||||
config MAX6959
|
||||
tristate "Maxim MAX6958/6959 7-segment LED controller"
|
||||
depends on I2C
|
||||
select BITREVERSE
|
||||
select REGMAP_I2C
|
||||
select LINEDISP
|
||||
help
|
||||
|
||||
@@ -1664,7 +1664,7 @@ err_lcd_unreg:
|
||||
if (lcd.enabled)
|
||||
charlcd_unregister(lcd.charlcd);
|
||||
err_unreg_device:
|
||||
kfree(lcd.charlcd);
|
||||
charlcd_free(lcd.charlcd);
|
||||
lcd.charlcd = NULL;
|
||||
parport_unregister_device(pprt);
|
||||
pprt = NULL;
|
||||
@@ -1692,7 +1692,7 @@ static void panel_detach(struct parport *port)
|
||||
charlcd_unregister(lcd.charlcd);
|
||||
lcd.initialized = false;
|
||||
kfree(lcd.charlcd->drvdata);
|
||||
kfree(lcd.charlcd);
|
||||
charlcd_free(lcd.charlcd);
|
||||
lcd.charlcd = NULL;
|
||||
}
|
||||
|
||||
|
||||
+10
-11
@@ -920,6 +920,9 @@ static void device_resume(struct device *dev, pm_message_t state, bool async)
|
||||
if (dev->power.syscore)
|
||||
goto Complete;
|
||||
|
||||
if (!dev->power.is_suspended)
|
||||
goto Complete;
|
||||
|
||||
if (dev->power.direct_complete) {
|
||||
/* Match the pm_runtime_disable() in __device_suspend(). */
|
||||
pm_runtime_enable(dev);
|
||||
@@ -938,9 +941,6 @@ static void device_resume(struct device *dev, pm_message_t state, bool async)
|
||||
*/
|
||||
dev->power.is_prepared = false;
|
||||
|
||||
if (!dev->power.is_suspended)
|
||||
goto Unlock;
|
||||
|
||||
if (dev->pm_domain) {
|
||||
info = "power domain ";
|
||||
callback = pm_op(&dev->pm_domain->ops, state);
|
||||
@@ -980,7 +980,6 @@ static void device_resume(struct device *dev, pm_message_t state, bool async)
|
||||
error = dpm_run_callback(callback, dev, state, info);
|
||||
dev->power.is_suspended = false;
|
||||
|
||||
Unlock:
|
||||
device_unlock(dev);
|
||||
dpm_watchdog_clear(&wd);
|
||||
|
||||
@@ -1263,14 +1262,13 @@ Skip:
|
||||
dev->power.is_noirq_suspended = true;
|
||||
|
||||
/*
|
||||
* Skipping the resume of devices that were in use right before the
|
||||
* system suspend (as indicated by their PM-runtime usage counters)
|
||||
* would be suboptimal. Also resume them if doing that is not allowed
|
||||
* to be skipped.
|
||||
* Devices must be resumed unless they are explicitly allowed to be left
|
||||
* in suspend, but even in that case skipping the resume of devices that
|
||||
* were in use right before the system suspend (as indicated by their
|
||||
* runtime PM usage counters and child counters) would be suboptimal.
|
||||
*/
|
||||
if (atomic_read(&dev->power.usage_count) > 1 ||
|
||||
!(dev_pm_test_driver_flags(dev, DPM_FLAG_MAY_SKIP_RESUME) &&
|
||||
dev->power.may_skip_resume))
|
||||
if (!(dev_pm_test_driver_flags(dev, DPM_FLAG_MAY_SKIP_RESUME) &&
|
||||
dev->power.may_skip_resume) || !pm_runtime_need_not_resume(dev))
|
||||
dev->power.must_resume = true;
|
||||
|
||||
if (dev->power.must_resume)
|
||||
@@ -1639,6 +1637,7 @@ static int device_suspend(struct device *dev, pm_message_t state, bool async)
|
||||
pm_runtime_disable(dev);
|
||||
if (pm_runtime_status_suspended(dev)) {
|
||||
pm_dev_dbg(dev, state, "direct-complete ");
|
||||
dev->power.is_suspended = true;
|
||||
goto Complete;
|
||||
}
|
||||
|
||||
|
||||
@@ -1874,7 +1874,7 @@ void pm_runtime_drop_link(struct device_link *link)
|
||||
pm_request_idle(link->supplier);
|
||||
}
|
||||
|
||||
static bool pm_runtime_need_not_resume(struct device *dev)
|
||||
bool pm_runtime_need_not_resume(struct device *dev)
|
||||
{
|
||||
return atomic_read(&dev->power.usage_count) <= 1 &&
|
||||
(atomic_read(&dev->power.child_count) == 0 ||
|
||||
|
||||
@@ -180,14 +180,14 @@ static struct clk_imx8mp_audiomix_sel sels[] = {
|
||||
CLK_GATE("asrc", ASRC_IPG),
|
||||
CLK_GATE("pdm", PDM_IPG),
|
||||
CLK_GATE("earc", EARC_IPG),
|
||||
CLK_GATE("ocrama", OCRAMA_IPG),
|
||||
CLK_GATE_PARENT("ocrama", OCRAMA_IPG, "axi"),
|
||||
CLK_GATE("aud2htx", AUD2HTX_IPG),
|
||||
CLK_GATE_PARENT("earc_phy", EARC_PHY, "sai_pll_out_div2"),
|
||||
CLK_GATE("sdma2", SDMA2_ROOT),
|
||||
CLK_GATE("sdma3", SDMA3_ROOT),
|
||||
CLK_GATE("spba2", SPBA2_ROOT),
|
||||
CLK_GATE("dsp", DSP_ROOT),
|
||||
CLK_GATE("dspdbg", DSPDBG_ROOT),
|
||||
CLK_GATE_PARENT("dsp", DSP_ROOT, "axi"),
|
||||
CLK_GATE_PARENT("dspdbg", DSPDBG_ROOT, "axi"),
|
||||
CLK_GATE("edma", EDMA_ROOT),
|
||||
CLK_GATE_PARENT("audpll", AUDPLL_ROOT, "osc_24m"),
|
||||
CLK_GATE("mu2", MU2_ROOT),
|
||||
|
||||
+25
-13
@@ -1139,8 +1139,18 @@ static struct clk_regmap g12a_cpu_clk_div16_en = {
|
||||
.hw.init = &(struct clk_init_data) {
|
||||
.name = "cpu_clk_div16_en",
|
||||
.ops = &clk_regmap_gate_ro_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) {
|
||||
&g12a_cpu_clk.hw
|
||||
.parent_data = &(const struct clk_parent_data) {
|
||||
/*
|
||||
* Note:
|
||||
* G12A and G12B have different cpu clocks (with
|
||||
* different struct clk_hw). We fallback to the global
|
||||
* naming string mechanism so this clock picks
|
||||
* up the appropriate one. Same goes for the other
|
||||
* clock using cpu cluster A clock output and present
|
||||
* on both G12 variant.
|
||||
*/
|
||||
.name = "cpu_clk",
|
||||
.index = -1,
|
||||
},
|
||||
.num_parents = 1,
|
||||
/*
|
||||
@@ -1205,7 +1215,10 @@ static struct clk_regmap g12a_cpu_clk_apb_div = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "cpu_clk_apb_div",
|
||||
.ops = &clk_regmap_divider_ro_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) { &g12a_cpu_clk.hw },
|
||||
.parent_data = &(const struct clk_parent_data) {
|
||||
.name = "cpu_clk",
|
||||
.index = -1,
|
||||
},
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
@@ -1239,7 +1252,10 @@ static struct clk_regmap g12a_cpu_clk_atb_div = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "cpu_clk_atb_div",
|
||||
.ops = &clk_regmap_divider_ro_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) { &g12a_cpu_clk.hw },
|
||||
.parent_data = &(const struct clk_parent_data) {
|
||||
.name = "cpu_clk",
|
||||
.index = -1,
|
||||
},
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
@@ -1273,7 +1289,10 @@ static struct clk_regmap g12a_cpu_clk_axi_div = {
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "cpu_clk_axi_div",
|
||||
.ops = &clk_regmap_divider_ro_ops,
|
||||
.parent_hws = (const struct clk_hw *[]) { &g12a_cpu_clk.hw },
|
||||
.parent_data = &(const struct clk_parent_data) {
|
||||
.name = "cpu_clk",
|
||||
.index = -1,
|
||||
},
|
||||
.num_parents = 1,
|
||||
},
|
||||
};
|
||||
@@ -1308,13 +1327,6 @@ static struct clk_regmap g12a_cpu_clk_trace_div = {
|
||||
.name = "cpu_clk_trace_div",
|
||||
.ops = &clk_regmap_divider_ro_ops,
|
||||
.parent_data = &(const struct clk_parent_data) {
|
||||
/*
|
||||
* Note:
|
||||
* G12A and G12B have different cpu_clks (with
|
||||
* different struct clk_hw). We fallback to the global
|
||||
* naming string mechanism so cpu_clk_trace_div picks
|
||||
* up the appropriate one.
|
||||
*/
|
||||
.name = "cpu_clk",
|
||||
.index = -1,
|
||||
},
|
||||
@@ -4317,7 +4329,7 @@ static MESON_GATE(g12a_spicc_1, HHI_GCLK_MPEG0, 14);
|
||||
static MESON_GATE(g12a_hiu_reg, HHI_GCLK_MPEG0, 19);
|
||||
static MESON_GATE(g12a_mipi_dsi_phy, HHI_GCLK_MPEG0, 20);
|
||||
static MESON_GATE(g12a_assist_misc, HHI_GCLK_MPEG0, 23);
|
||||
static MESON_GATE(g12a_emmc_a, HHI_GCLK_MPEG0, 4);
|
||||
static MESON_GATE(g12a_emmc_a, HHI_GCLK_MPEG0, 24);
|
||||
static MESON_GATE(g12a_emmc_b, HHI_GCLK_MPEG0, 25);
|
||||
static MESON_GATE(g12a_emmc_c, HHI_GCLK_MPEG0, 26);
|
||||
static MESON_GATE(g12a_audio_codec, HHI_GCLK_MPEG0, 28);
|
||||
|
||||
@@ -1272,14 +1272,13 @@ static struct clk_regmap gxbb_cts_i958 = {
|
||||
},
|
||||
};
|
||||
|
||||
/*
|
||||
* This table skips a clock named 'cts_slow_oscin' in the documentation
|
||||
* This clock does not exist yet in this controller or the AO one
|
||||
*/
|
||||
static u32 gxbb_32k_clk_parents_val_table[] = { 0, 2, 3 };
|
||||
static const struct clk_parent_data gxbb_32k_clk_parent_data[] = {
|
||||
{ .fw_name = "xtal", },
|
||||
/*
|
||||
* FIXME: This clock is provided by the ao clock controller but the
|
||||
* clock is not yet part of the binding of this controller, so string
|
||||
* name must be use to set this parent.
|
||||
*/
|
||||
{ .name = "cts_slow_oscin", .index = -1 },
|
||||
{ .hw = &gxbb_fclk_div3.hw },
|
||||
{ .hw = &gxbb_fclk_div5.hw },
|
||||
};
|
||||
@@ -1289,6 +1288,7 @@ static struct clk_regmap gxbb_32k_clk_sel = {
|
||||
.offset = HHI_32K_CLK_CNTL,
|
||||
.mask = 0x3,
|
||||
.shift = 16,
|
||||
.table = gxbb_32k_clk_parents_val_table,
|
||||
},
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "32k_clk_sel",
|
||||
@@ -1312,7 +1312,7 @@ static struct clk_regmap gxbb_32k_clk_div = {
|
||||
&gxbb_32k_clk_sel.hw
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT | CLK_DIVIDER_ROUND_CLOSEST,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@@ -3770,7 +3770,7 @@ static struct clk_branch gcc_venus0_axi_clk = {
|
||||
|
||||
static struct clk_branch gcc_venus0_core0_vcodec0_clk = {
|
||||
.halt_reg = 0x4c02c,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.halt_check = BRANCH_HALT_SKIP,
|
||||
.clkr = {
|
||||
.enable_reg = 0x4c02c,
|
||||
.enable_mask = BIT(0),
|
||||
|
||||
@@ -3497,7 +3497,7 @@ static struct gdsc usb30_prim_gdsc = {
|
||||
.pd = {
|
||||
.name = "usb30_prim_gdsc",
|
||||
},
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
.pwrsts = PWRSTS_RET_ON,
|
||||
.flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
|
||||
};
|
||||
|
||||
@@ -3506,7 +3506,7 @@ static struct gdsc usb3_phy_gdsc = {
|
||||
.pd = {
|
||||
.name = "usb3_phy_gdsc",
|
||||
},
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
.pwrsts = PWRSTS_RET_ON,
|
||||
.flags = POLL_CFG_GDSCR | RETAIN_FF_ENABLE,
|
||||
};
|
||||
|
||||
|
||||
@@ -2564,19 +2564,6 @@ static struct clk_branch gcc_disp_hf_axi_clk = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gcc_disp_xo_clk = {
|
||||
.halt_reg = 0x27018,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.clkr = {
|
||||
.enable_reg = 0x27018,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gcc_disp_xo_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gcc_gp1_clk = {
|
||||
.halt_reg = 0x64000,
|
||||
.halt_check = BRANCH_HALT,
|
||||
@@ -2631,21 +2618,6 @@ static struct clk_branch gcc_gp3_clk = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gcc_gpu_cfg_ahb_clk = {
|
||||
.halt_reg = 0x71004,
|
||||
.halt_check = BRANCH_HALT_VOTED,
|
||||
.hwcg_reg = 0x71004,
|
||||
.hwcg_bit = 1,
|
||||
.clkr = {
|
||||
.enable_reg = 0x71004,
|
||||
.enable_mask = BIT(0),
|
||||
.hw.init = &(const struct clk_init_data) {
|
||||
.name = "gcc_gpu_cfg_ahb_clk",
|
||||
.ops = &clk_branch2_ops,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct clk_branch gcc_gpu_gpll0_cph_clk_src = {
|
||||
.halt_check = BRANCH_HALT_DELAY,
|
||||
.clkr = {
|
||||
@@ -6268,7 +6240,6 @@ static struct clk_regmap *gcc_x1e80100_clocks[] = {
|
||||
[GCC_CNOC_PCIE_TUNNEL_CLK] = &gcc_cnoc_pcie_tunnel_clk.clkr,
|
||||
[GCC_DDRSS_GPU_AXI_CLK] = &gcc_ddrss_gpu_axi_clk.clkr,
|
||||
[GCC_DISP_HF_AXI_CLK] = &gcc_disp_hf_axi_clk.clkr,
|
||||
[GCC_DISP_XO_CLK] = &gcc_disp_xo_clk.clkr,
|
||||
[GCC_GP1_CLK] = &gcc_gp1_clk.clkr,
|
||||
[GCC_GP1_CLK_SRC] = &gcc_gp1_clk_src.clkr,
|
||||
[GCC_GP2_CLK] = &gcc_gp2_clk.clkr,
|
||||
@@ -6281,7 +6252,6 @@ static struct clk_regmap *gcc_x1e80100_clocks[] = {
|
||||
[GCC_GPLL7] = &gcc_gpll7.clkr,
|
||||
[GCC_GPLL8] = &gcc_gpll8.clkr,
|
||||
[GCC_GPLL9] = &gcc_gpll9.clkr,
|
||||
[GCC_GPU_CFG_AHB_CLK] = &gcc_gpu_cfg_ahb_clk.clkr,
|
||||
[GCC_GPU_GPLL0_CPH_CLK_SRC] = &gcc_gpu_gpll0_cph_clk_src.clkr,
|
||||
[GCC_GPU_GPLL0_DIV_CPH_CLK_SRC] = &gcc_gpu_gpll0_div_cph_clk_src.clkr,
|
||||
[GCC_GPU_MEMNOC_GFX_CLK] = &gcc_gpu_memnoc_gfx_clk.clkr,
|
||||
|
||||
@@ -2544,7 +2544,7 @@ static struct clk_branch video_core_clk = {
|
||||
|
||||
static struct clk_branch video_subcore0_clk = {
|
||||
.halt_reg = 0x1048,
|
||||
.halt_check = BRANCH_HALT,
|
||||
.halt_check = BRANCH_HALT_SKIP,
|
||||
.clkr = {
|
||||
.enable_reg = 0x1048,
|
||||
.enable_mask = BIT(0),
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
#define G3S_SEL_SDHI2 SEL_PLL_PACK(G3S_CPG_SDHI_DSEL, 8, 2)
|
||||
|
||||
/* PLL 1/4/6 configuration registers macro. */
|
||||
#define G3S_PLL146_CONF(clk1, clk2) ((clk1) << 22 | (clk2) << 12)
|
||||
#define G3S_PLL146_CONF(clk1, clk2, setting) ((clk1) << 22 | (clk2) << 12 | (setting))
|
||||
|
||||
#define DEF_G3S_MUX(_name, _id, _conf, _parent_names, _mux_flags, _clk_flags) \
|
||||
DEF_TYPE(_name, _id, CLK_TYPE_MUX, .conf = (_conf), \
|
||||
@@ -133,7 +133,8 @@ static const struct cpg_core_clk r9a08g045_core_clks[] __initconst = {
|
||||
|
||||
/* Internal Core Clocks */
|
||||
DEF_FIXED(".osc_div1000", CLK_OSC_DIV1000, CLK_EXTAL, 1, 1000),
|
||||
DEF_G3S_PLL(".pll1", CLK_PLL1, CLK_EXTAL, G3S_PLL146_CONF(0x4, 0x8)),
|
||||
DEF_G3S_PLL(".pll1", CLK_PLL1, CLK_EXTAL, G3S_PLL146_CONF(0x4, 0x8, 0x100),
|
||||
1100000000UL),
|
||||
DEF_FIXED(".pll2", CLK_PLL2, CLK_EXTAL, 200, 3),
|
||||
DEF_FIXED(".pll3", CLK_PLL3, CLK_EXTAL, 200, 3),
|
||||
DEF_FIXED(".pll4", CLK_PLL4, CLK_EXTAL, 100, 3),
|
||||
|
||||
@@ -51,6 +51,7 @@
|
||||
#define RZG3S_DIV_M GENMASK(25, 22)
|
||||
#define RZG3S_DIV_NI GENMASK(21, 13)
|
||||
#define RZG3S_DIV_NF GENMASK(12, 1)
|
||||
#define RZG3S_SEL_PLL BIT(0)
|
||||
|
||||
#define CLK_ON_R(reg) (reg)
|
||||
#define CLK_MON_R(reg) (0x180 + (reg))
|
||||
@@ -60,6 +61,7 @@
|
||||
#define GET_REG_OFFSET(val) ((val >> 20) & 0xfff)
|
||||
#define GET_REG_SAMPLL_CLK1(val) ((val >> 22) & 0xfff)
|
||||
#define GET_REG_SAMPLL_CLK2(val) ((val >> 12) & 0xfff)
|
||||
#define GET_REG_SAMPLL_SETTING(val) ((val) & 0xfff)
|
||||
|
||||
#define CPG_WEN_BIT BIT(16)
|
||||
|
||||
@@ -943,6 +945,7 @@ rzg2l_cpg_sipll5_register(const struct cpg_core_clk *core,
|
||||
|
||||
struct pll_clk {
|
||||
struct clk_hw hw;
|
||||
unsigned long default_rate;
|
||||
unsigned int conf;
|
||||
unsigned int type;
|
||||
void __iomem *base;
|
||||
@@ -980,12 +983,19 @@ static unsigned long rzg3s_cpg_pll_clk_recalc_rate(struct clk_hw *hw,
|
||||
{
|
||||
struct pll_clk *pll_clk = to_pll(hw);
|
||||
struct rzg2l_cpg_priv *priv = pll_clk->priv;
|
||||
u32 nir, nfr, mr, pr, val;
|
||||
u32 nir, nfr, mr, pr, val, setting;
|
||||
u64 rate;
|
||||
|
||||
if (pll_clk->type != CLK_TYPE_G3S_PLL)
|
||||
return parent_rate;
|
||||
|
||||
setting = GET_REG_SAMPLL_SETTING(pll_clk->conf);
|
||||
if (setting) {
|
||||
val = readl(priv->base + setting);
|
||||
if (val & RZG3S_SEL_PLL)
|
||||
return pll_clk->default_rate;
|
||||
}
|
||||
|
||||
val = readl(priv->base + GET_REG_SAMPLL_CLK1(pll_clk->conf));
|
||||
|
||||
pr = 1 << FIELD_GET(RZG3S_DIV_P, val);
|
||||
@@ -1038,6 +1048,7 @@ rzg2l_cpg_pll_clk_register(const struct cpg_core_clk *core,
|
||||
pll_clk->base = priv->base;
|
||||
pll_clk->priv = priv;
|
||||
pll_clk->type = core->type;
|
||||
pll_clk->default_rate = core->default_rate;
|
||||
|
||||
ret = devm_clk_hw_register(dev, &pll_clk->hw);
|
||||
if (ret)
|
||||
|
||||
@@ -102,7 +102,10 @@ struct cpg_core_clk {
|
||||
const struct clk_div_table *dtable;
|
||||
const u32 *mtable;
|
||||
const unsigned long invalid_rate;
|
||||
const unsigned long max_rate;
|
||||
union {
|
||||
const unsigned long max_rate;
|
||||
const unsigned long default_rate;
|
||||
};
|
||||
const char * const *parent_names;
|
||||
notifier_fn_t notifier;
|
||||
u32 flag;
|
||||
@@ -144,8 +147,9 @@ enum clk_types {
|
||||
DEF_TYPE(_name, _id, _type, .parent = _parent)
|
||||
#define DEF_SAMPLL(_name, _id, _parent, _conf) \
|
||||
DEF_TYPE(_name, _id, CLK_TYPE_SAM_PLL, .parent = _parent, .conf = _conf)
|
||||
#define DEF_G3S_PLL(_name, _id, _parent, _conf) \
|
||||
DEF_TYPE(_name, _id, CLK_TYPE_G3S_PLL, .parent = _parent, .conf = _conf)
|
||||
#define DEF_G3S_PLL(_name, _id, _parent, _conf, _default_rate) \
|
||||
DEF_TYPE(_name, _id, CLK_TYPE_G3S_PLL, .parent = _parent, .conf = _conf, \
|
||||
.default_rate = _default_rate)
|
||||
#define DEF_INPUT(_name, _id) \
|
||||
DEF_TYPE(_name, _id, CLK_TYPE_IN)
|
||||
#define DEF_FIXED(_name, _id, _parent, _mult, _div) \
|
||||
|
||||
@@ -201,7 +201,7 @@ PNAME(mux_aclk_peri_pre_p) = { "cpll_peri",
|
||||
"gpll_peri",
|
||||
"hdmiphy_peri" };
|
||||
PNAME(mux_ref_usb3otg_src_p) = { "xin24m",
|
||||
"clk_usb3otg_ref" };
|
||||
"clk_ref_usb3otg_src" };
|
||||
PNAME(mux_xin24m_32k_p) = { "xin24m",
|
||||
"clk_rtc32k" };
|
||||
PNAME(mux_mac2io_src_p) = { "clk_mac2io_src",
|
||||
|
||||
@@ -74,12 +74,12 @@ struct samsung_clk_provider * __init samsung_clk_init(struct device *dev,
|
||||
if (!ctx)
|
||||
panic("could not allocate clock provider context.\n");
|
||||
|
||||
ctx->clk_data.num = nr_clks;
|
||||
for (i = 0; i < nr_clks; ++i)
|
||||
ctx->clk_data.hws[i] = ERR_PTR(-ENOENT);
|
||||
|
||||
ctx->dev = dev;
|
||||
ctx->reg_base = base;
|
||||
ctx->clk_data.num = nr_clks;
|
||||
spin_lock_init(&ctx->lock);
|
||||
|
||||
return ctx;
|
||||
|
||||
@@ -245,7 +245,7 @@ config ARM_TEGRA186_CPUFREQ
|
||||
|
||||
config ARM_TEGRA194_CPUFREQ
|
||||
tristate "Tegra194 CPUFreq support"
|
||||
depends on ARCH_TEGRA_194_SOC || (64BIT && COMPILE_TEST)
|
||||
depends on ARCH_TEGRA_194_SOC || ARCH_TEGRA_234_SOC || (64BIT && COMPILE_TEST)
|
||||
depends on TEGRA_BPMP
|
||||
default y
|
||||
help
|
||||
|
||||
@@ -145,7 +145,23 @@ unsigned int dbs_update(struct cpufreq_policy *policy)
|
||||
time_elapsed = update_time - j_cdbs->prev_update_time;
|
||||
j_cdbs->prev_update_time = update_time;
|
||||
|
||||
idle_time = cur_idle_time - j_cdbs->prev_cpu_idle;
|
||||
/*
|
||||
* cur_idle_time could be smaller than j_cdbs->prev_cpu_idle if
|
||||
* it's obtained from get_cpu_idle_time_jiffy() when NOHZ is
|
||||
* off, where idle_time is calculated by the difference between
|
||||
* time elapsed in jiffies and "busy time" obtained from CPU
|
||||
* statistics. If a CPU is 100% busy, the time elapsed and busy
|
||||
* time should grow with the same amount in two consecutive
|
||||
* samples, but in practice there could be a tiny difference,
|
||||
* making the accumulated idle time decrease sometimes. Hence,
|
||||
* in this case, idle_time should be regarded as 0 in order to
|
||||
* make the further process correct.
|
||||
*/
|
||||
if (cur_idle_time > j_cdbs->prev_cpu_idle)
|
||||
idle_time = cur_idle_time - j_cdbs->prev_cpu_idle;
|
||||
else
|
||||
idle_time = 0;
|
||||
|
||||
j_cdbs->prev_cpu_idle = cur_idle_time;
|
||||
|
||||
if (ignore_nice) {
|
||||
@@ -162,7 +178,7 @@ unsigned int dbs_update(struct cpufreq_policy *policy)
|
||||
* calls, so the previous load value can be used then.
|
||||
*/
|
||||
load = j_cdbs->prev_load;
|
||||
} else if (unlikely((int)idle_time > 2 * sampling_rate &&
|
||||
} else if (unlikely(idle_time > 2 * sampling_rate &&
|
||||
j_cdbs->prev_load)) {
|
||||
/*
|
||||
* If the CPU had gone completely idle and a task has
|
||||
@@ -189,30 +205,15 @@ unsigned int dbs_update(struct cpufreq_policy *policy)
|
||||
load = j_cdbs->prev_load;
|
||||
j_cdbs->prev_load = 0;
|
||||
} else {
|
||||
if (time_elapsed >= idle_time) {
|
||||
if (time_elapsed > idle_time)
|
||||
load = 100 * (time_elapsed - idle_time) / time_elapsed;
|
||||
} else {
|
||||
/*
|
||||
* That can happen if idle_time is returned by
|
||||
* get_cpu_idle_time_jiffy(). In that case
|
||||
* idle_time is roughly equal to the difference
|
||||
* between time_elapsed and "busy time" obtained
|
||||
* from CPU statistics. Then, the "busy time"
|
||||
* can end up being greater than time_elapsed
|
||||
* (for example, if jiffies_64 and the CPU
|
||||
* statistics are updated by different CPUs),
|
||||
* so idle_time may in fact be negative. That
|
||||
* means, though, that the CPU was busy all
|
||||
* the time (on the rough average) during the
|
||||
* last sampling interval and 100 can be
|
||||
* returned as the load.
|
||||
*/
|
||||
load = (int)idle_time < 0 ? 100 : 0;
|
||||
}
|
||||
else
|
||||
load = 0;
|
||||
|
||||
j_cdbs->prev_load = load;
|
||||
}
|
||||
|
||||
if (unlikely((int)idle_time > 2 * sampling_rate)) {
|
||||
if (unlikely(idle_time > 2 * sampling_rate)) {
|
||||
unsigned int periods = idle_time / sampling_rate;
|
||||
|
||||
if (periods < idle_periods)
|
||||
|
||||
@@ -39,8 +39,9 @@ static unsigned int scpi_cpufreq_get_rate(unsigned int cpu)
|
||||
static int
|
||||
scpi_cpufreq_set_target(struct cpufreq_policy *policy, unsigned int index)
|
||||
{
|
||||
u64 rate = policy->freq_table[index].frequency * 1000;
|
||||
unsigned long freq_khz = policy->freq_table[index].frequency;
|
||||
struct scpi_data *priv = policy->driver_data;
|
||||
unsigned long rate = freq_khz * 1000;
|
||||
int ret;
|
||||
|
||||
ret = clk_set_rate(priv->clk, rate);
|
||||
@@ -48,7 +49,7 @@ scpi_cpufreq_set_target(struct cpufreq_policy *policy, unsigned int index)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (clk_get_rate(priv->clk) != rate)
|
||||
if (clk_get_rate(priv->clk) / 1000 != freq_khz)
|
||||
return -EIO;
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -37,7 +37,6 @@ struct sec_aead_req {
|
||||
u8 *a_ivin;
|
||||
dma_addr_t a_ivin_dma;
|
||||
struct aead_request *aead_req;
|
||||
bool fallback;
|
||||
};
|
||||
|
||||
/* SEC request of Crypto */
|
||||
|
||||
@@ -57,7 +57,6 @@
|
||||
#define SEC_TYPE_MASK 0x0F
|
||||
#define SEC_DONE_MASK 0x0001
|
||||
#define SEC_ICV_MASK 0x000E
|
||||
#define SEC_SQE_LEN_RATE_MASK 0x3
|
||||
|
||||
#define SEC_TOTAL_IV_SZ(depth) (SEC_IV_SIZE * (depth))
|
||||
#define SEC_SGL_SGE_NR 128
|
||||
@@ -80,16 +79,16 @@
|
||||
#define SEC_TOTAL_PBUF_SZ(depth) (PAGE_SIZE * SEC_PBUF_PAGE_NUM(depth) + \
|
||||
SEC_PBUF_LEFT_SZ(depth))
|
||||
|
||||
#define SEC_SQE_LEN_RATE 4
|
||||
#define SEC_SQE_CFLAG 2
|
||||
#define SEC_SQE_AEAD_FLAG 3
|
||||
#define SEC_SQE_DONE 0x1
|
||||
#define SEC_ICV_ERR 0x2
|
||||
#define MIN_MAC_LEN 4
|
||||
#define MAC_LEN_MASK 0x1U
|
||||
#define MAX_INPUT_DATA_LEN 0xFFFE00
|
||||
#define BITS_MASK 0xFF
|
||||
#define WORD_MASK 0x3
|
||||
#define BYTE_BITS 0x8
|
||||
#define BYTES_TO_WORDS(bcount) ((bcount) >> 2)
|
||||
#define SEC_XTS_NAME_SZ 0x3
|
||||
#define IV_CM_CAL_NUM 2
|
||||
#define IV_CL_MASK 0x7
|
||||
@@ -691,14 +690,10 @@ static int sec_skcipher_fbtfm_init(struct crypto_skcipher *tfm)
|
||||
|
||||
c_ctx->fallback = false;
|
||||
|
||||
/* Currently, only XTS mode need fallback tfm when using 192bit key */
|
||||
if (likely(strncmp(alg, "xts", SEC_XTS_NAME_SZ)))
|
||||
return 0;
|
||||
|
||||
c_ctx->fbtfm = crypto_alloc_sync_skcipher(alg, 0,
|
||||
CRYPTO_ALG_NEED_FALLBACK);
|
||||
if (IS_ERR(c_ctx->fbtfm)) {
|
||||
pr_err("failed to alloc xts mode fallback tfm!\n");
|
||||
pr_err("failed to alloc fallback tfm for %s!\n", alg);
|
||||
return PTR_ERR(c_ctx->fbtfm);
|
||||
}
|
||||
|
||||
@@ -858,7 +853,7 @@ static int sec_skcipher_setkey(struct crypto_skcipher *tfm, const u8 *key,
|
||||
}
|
||||
|
||||
memcpy(c_ctx->c_key, key, keylen);
|
||||
if (c_ctx->fallback && c_ctx->fbtfm) {
|
||||
if (c_ctx->fbtfm) {
|
||||
ret = crypto_sync_skcipher_setkey(c_ctx->fbtfm, key, keylen);
|
||||
if (ret) {
|
||||
dev_err(dev, "failed to set fallback skcipher key!\n");
|
||||
@@ -1090,11 +1085,6 @@ static int sec_aead_auth_set_key(struct sec_auth_ctx *ctx,
|
||||
struct crypto_shash *hash_tfm = ctx->hash_tfm;
|
||||
int blocksize, digestsize, ret;
|
||||
|
||||
if (!keys->authkeylen) {
|
||||
pr_err("hisi_sec2: aead auth key error!\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
blocksize = crypto_shash_blocksize(hash_tfm);
|
||||
digestsize = crypto_shash_digestsize(hash_tfm);
|
||||
if (keys->authkeylen > blocksize) {
|
||||
@@ -1106,7 +1096,8 @@ static int sec_aead_auth_set_key(struct sec_auth_ctx *ctx,
|
||||
}
|
||||
ctx->a_key_len = digestsize;
|
||||
} else {
|
||||
memcpy(ctx->a_key, keys->authkey, keys->authkeylen);
|
||||
if (keys->authkeylen)
|
||||
memcpy(ctx->a_key, keys->authkey, keys->authkeylen);
|
||||
ctx->a_key_len = keys->authkeylen;
|
||||
}
|
||||
|
||||
@@ -1160,8 +1151,10 @@ static int sec_aead_setkey(struct crypto_aead *tfm, const u8 *key,
|
||||
}
|
||||
|
||||
ret = crypto_authenc_extractkeys(&keys, key, keylen);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
dev_err(dev, "sec extract aead keys err!\n");
|
||||
goto bad_key;
|
||||
}
|
||||
|
||||
ret = sec_aead_aes_set_key(c_ctx, &keys);
|
||||
if (ret) {
|
||||
@@ -1175,12 +1168,6 @@ static int sec_aead_setkey(struct crypto_aead *tfm, const u8 *key,
|
||||
goto bad_key;
|
||||
}
|
||||
|
||||
if (ctx->a_ctx.a_key_len & SEC_SQE_LEN_RATE_MASK) {
|
||||
ret = -EINVAL;
|
||||
dev_err(dev, "AUTH key length error!\n");
|
||||
goto bad_key;
|
||||
}
|
||||
|
||||
ret = sec_aead_fallback_setkey(a_ctx, tfm, key, keylen);
|
||||
if (ret) {
|
||||
dev_err(dev, "set sec fallback key err!\n");
|
||||
@@ -1583,11 +1570,10 @@ static void sec_auth_bd_fill_ex(struct sec_auth_ctx *ctx, int dir,
|
||||
|
||||
sec_sqe->type2.a_key_addr = cpu_to_le64(ctx->a_key_dma);
|
||||
|
||||
sec_sqe->type2.mac_key_alg = cpu_to_le32(authsize / SEC_SQE_LEN_RATE);
|
||||
sec_sqe->type2.mac_key_alg = cpu_to_le32(BYTES_TO_WORDS(authsize));
|
||||
|
||||
sec_sqe->type2.mac_key_alg |=
|
||||
cpu_to_le32((u32)((ctx->a_key_len) /
|
||||
SEC_SQE_LEN_RATE) << SEC_AKEY_OFFSET);
|
||||
cpu_to_le32((u32)BYTES_TO_WORDS(ctx->a_key_len) << SEC_AKEY_OFFSET);
|
||||
|
||||
sec_sqe->type2.mac_key_alg |=
|
||||
cpu_to_le32((u32)(ctx->a_alg) << SEC_AEAD_ALG_OFFSET);
|
||||
@@ -1639,12 +1625,10 @@ static void sec_auth_bd_fill_ex_v3(struct sec_auth_ctx *ctx, int dir,
|
||||
sqe3->a_key_addr = cpu_to_le64(ctx->a_key_dma);
|
||||
|
||||
sqe3->auth_mac_key |=
|
||||
cpu_to_le32((u32)(authsize /
|
||||
SEC_SQE_LEN_RATE) << SEC_MAC_OFFSET_V3);
|
||||
cpu_to_le32(BYTES_TO_WORDS(authsize) << SEC_MAC_OFFSET_V3);
|
||||
|
||||
sqe3->auth_mac_key |=
|
||||
cpu_to_le32((u32)(ctx->a_key_len /
|
||||
SEC_SQE_LEN_RATE) << SEC_AKEY_OFFSET_V3);
|
||||
cpu_to_le32((u32)BYTES_TO_WORDS(ctx->a_key_len) << SEC_AKEY_OFFSET_V3);
|
||||
|
||||
sqe3->auth_mac_key |=
|
||||
cpu_to_le32((u32)(ctx->a_alg) << SEC_AUTH_ALG_OFFSET_V3);
|
||||
@@ -2003,8 +1987,7 @@ static int sec_aead_sha512_ctx_init(struct crypto_aead *tfm)
|
||||
return sec_aead_ctx_init(tfm, "sha512");
|
||||
}
|
||||
|
||||
static int sec_skcipher_cryptlen_check(struct sec_ctx *ctx,
|
||||
struct sec_req *sreq)
|
||||
static int sec_skcipher_cryptlen_check(struct sec_ctx *ctx, struct sec_req *sreq)
|
||||
{
|
||||
u32 cryptlen = sreq->c_req.sk_req->cryptlen;
|
||||
struct device *dev = ctx->dev;
|
||||
@@ -2026,10 +2009,6 @@ static int sec_skcipher_cryptlen_check(struct sec_ctx *ctx,
|
||||
}
|
||||
break;
|
||||
case SEC_CMODE_CTR:
|
||||
if (unlikely(ctx->sec->qm.ver < QM_HW_V3)) {
|
||||
dev_err(dev, "skcipher HW version error!\n");
|
||||
ret = -EINVAL;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
@@ -2038,17 +2017,21 @@ static int sec_skcipher_cryptlen_check(struct sec_ctx *ctx,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int sec_skcipher_param_check(struct sec_ctx *ctx, struct sec_req *sreq)
|
||||
static int sec_skcipher_param_check(struct sec_ctx *ctx,
|
||||
struct sec_req *sreq, bool *need_fallback)
|
||||
{
|
||||
struct skcipher_request *sk_req = sreq->c_req.sk_req;
|
||||
struct device *dev = ctx->dev;
|
||||
u8 c_alg = ctx->c_ctx.c_alg;
|
||||
|
||||
if (unlikely(!sk_req->src || !sk_req->dst ||
|
||||
sk_req->cryptlen > MAX_INPUT_DATA_LEN)) {
|
||||
if (unlikely(!sk_req->src || !sk_req->dst)) {
|
||||
dev_err(dev, "skcipher input param error!\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (sk_req->cryptlen > MAX_INPUT_DATA_LEN)
|
||||
*need_fallback = true;
|
||||
|
||||
sreq->c_req.c_len = sk_req->cryptlen;
|
||||
|
||||
if (ctx->pbuf_supported && sk_req->cryptlen <= SEC_PBUF_SZ)
|
||||
@@ -2106,6 +2089,7 @@ static int sec_skcipher_crypto(struct skcipher_request *sk_req, bool encrypt)
|
||||
struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(sk_req);
|
||||
struct sec_req *req = skcipher_request_ctx(sk_req);
|
||||
struct sec_ctx *ctx = crypto_skcipher_ctx(tfm);
|
||||
bool need_fallback = false;
|
||||
int ret;
|
||||
|
||||
if (!sk_req->cryptlen) {
|
||||
@@ -2119,11 +2103,11 @@ static int sec_skcipher_crypto(struct skcipher_request *sk_req, bool encrypt)
|
||||
req->c_req.encrypt = encrypt;
|
||||
req->ctx = ctx;
|
||||
|
||||
ret = sec_skcipher_param_check(ctx, req);
|
||||
ret = sec_skcipher_param_check(ctx, req, &need_fallback);
|
||||
if (unlikely(ret))
|
||||
return -EINVAL;
|
||||
|
||||
if (unlikely(ctx->c_ctx.fallback))
|
||||
if (unlikely(ctx->c_ctx.fallback || need_fallback))
|
||||
return sec_skcipher_soft_crypto(ctx, sk_req, encrypt);
|
||||
|
||||
return ctx->req_op->process(ctx, req);
|
||||
@@ -2231,52 +2215,35 @@ static int sec_aead_spec_check(struct sec_ctx *ctx, struct sec_req *sreq)
|
||||
struct crypto_aead *tfm = crypto_aead_reqtfm(req);
|
||||
size_t sz = crypto_aead_authsize(tfm);
|
||||
u8 c_mode = ctx->c_ctx.c_mode;
|
||||
struct device *dev = ctx->dev;
|
||||
int ret;
|
||||
|
||||
/* Hardware does not handle cases where authsize is less than 4 bytes */
|
||||
if (unlikely(sz < MIN_MAC_LEN)) {
|
||||
sreq->aead_req.fallback = true;
|
||||
if (unlikely(ctx->sec->qm.ver == QM_HW_V2 && !sreq->c_req.c_len))
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (unlikely(req->cryptlen + req->assoclen > MAX_INPUT_DATA_LEN ||
|
||||
req->assoclen > SEC_MAX_AAD_LEN)) {
|
||||
dev_err(dev, "aead input spec error!\n");
|
||||
req->assoclen > SEC_MAX_AAD_LEN))
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (c_mode == SEC_CMODE_CCM) {
|
||||
if (unlikely(req->assoclen > SEC_MAX_CCM_AAD_LEN)) {
|
||||
dev_err_ratelimited(dev, "CCM input aad parameter is too long!\n");
|
||||
if (unlikely(req->assoclen > SEC_MAX_CCM_AAD_LEN))
|
||||
return -EINVAL;
|
||||
}
|
||||
ret = aead_iv_demension_check(req);
|
||||
if (ret) {
|
||||
dev_err(dev, "aead input iv param error!\n");
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
if (sreq->c_req.encrypt)
|
||||
sreq->c_req.c_len = req->cryptlen;
|
||||
else
|
||||
sreq->c_req.c_len = req->cryptlen - sz;
|
||||
if (c_mode == SEC_CMODE_CBC) {
|
||||
if (unlikely(sreq->c_req.c_len & (AES_BLOCK_SIZE - 1))) {
|
||||
dev_err(dev, "aead crypto length error!\n");
|
||||
ret = aead_iv_demension_check(req);
|
||||
if (unlikely(ret))
|
||||
return -EINVAL;
|
||||
} else if (c_mode == SEC_CMODE_CBC) {
|
||||
if (unlikely(sz & WORD_MASK))
|
||||
return -EINVAL;
|
||||
if (unlikely(ctx->a_ctx.a_key_len & WORD_MASK))
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int sec_aead_param_check(struct sec_ctx *ctx, struct sec_req *sreq)
|
||||
static int sec_aead_param_check(struct sec_ctx *ctx, struct sec_req *sreq, bool *need_fallback)
|
||||
{
|
||||
struct aead_request *req = sreq->aead_req.aead_req;
|
||||
struct crypto_aead *tfm = crypto_aead_reqtfm(req);
|
||||
size_t authsize = crypto_aead_authsize(tfm);
|
||||
struct device *dev = ctx->dev;
|
||||
u8 c_alg = ctx->c_ctx.c_alg;
|
||||
|
||||
@@ -2285,12 +2252,10 @@ static int sec_aead_param_check(struct sec_ctx *ctx, struct sec_req *sreq)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (ctx->sec->qm.ver == QM_HW_V2) {
|
||||
if (unlikely(!req->cryptlen || (!sreq->c_req.encrypt &&
|
||||
req->cryptlen <= authsize))) {
|
||||
sreq->aead_req.fallback = true;
|
||||
return -EINVAL;
|
||||
}
|
||||
if (unlikely(ctx->c_ctx.c_mode == SEC_CMODE_CBC &&
|
||||
sreq->c_req.c_len & (AES_BLOCK_SIZE - 1))) {
|
||||
dev_err(dev, "aead cbc mode input data length error!\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Support AES or SM4 */
|
||||
@@ -2299,8 +2264,10 @@ static int sec_aead_param_check(struct sec_ctx *ctx, struct sec_req *sreq)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (unlikely(sec_aead_spec_check(ctx, sreq)))
|
||||
if (unlikely(sec_aead_spec_check(ctx, sreq))) {
|
||||
*need_fallback = true;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (ctx->pbuf_supported && (req->cryptlen + req->assoclen) <=
|
||||
SEC_PBUF_SZ)
|
||||
@@ -2344,17 +2311,19 @@ static int sec_aead_crypto(struct aead_request *a_req, bool encrypt)
|
||||
struct crypto_aead *tfm = crypto_aead_reqtfm(a_req);
|
||||
struct sec_req *req = aead_request_ctx(a_req);
|
||||
struct sec_ctx *ctx = crypto_aead_ctx(tfm);
|
||||
size_t sz = crypto_aead_authsize(tfm);
|
||||
bool need_fallback = false;
|
||||
int ret;
|
||||
|
||||
req->flag = a_req->base.flags;
|
||||
req->aead_req.aead_req = a_req;
|
||||
req->c_req.encrypt = encrypt;
|
||||
req->ctx = ctx;
|
||||
req->aead_req.fallback = false;
|
||||
req->c_req.c_len = a_req->cryptlen - (req->c_req.encrypt ? 0 : sz);
|
||||
|
||||
ret = sec_aead_param_check(ctx, req);
|
||||
ret = sec_aead_param_check(ctx, req, &need_fallback);
|
||||
if (unlikely(ret)) {
|
||||
if (req->aead_req.fallback)
|
||||
if (need_fallback)
|
||||
return sec_aead_soft_crypto(ctx, a_req, encrypt);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -1527,7 +1527,7 @@ static int iaa_comp_acompress(struct acomp_req *req)
|
||||
iaa_wq = idxd_wq_get_private(wq);
|
||||
|
||||
if (!req->dst) {
|
||||
gfp_t flags = req->flags & CRYPTO_TFM_REQ_MAY_SLEEP ? GFP_KERNEL : GFP_ATOMIC;
|
||||
gfp_t flags = req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP ? GFP_KERNEL : GFP_ATOMIC;
|
||||
|
||||
/* incompressible data will always be < 2 * slen */
|
||||
req->dlen = 2 * req->slen;
|
||||
@@ -1609,7 +1609,7 @@ out:
|
||||
|
||||
static int iaa_comp_adecompress_alloc_dest(struct acomp_req *req)
|
||||
{
|
||||
gfp_t flags = req->flags & CRYPTO_TFM_REQ_MAY_SLEEP ?
|
||||
gfp_t flags = req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP ?
|
||||
GFP_KERNEL : GFP_ATOMIC;
|
||||
struct crypto_tfm *tfm = req->base.tfm;
|
||||
dma_addr_t src_addr, dst_addr;
|
||||
|
||||
@@ -420,6 +420,7 @@ static void adf_gen4_set_err_mask(struct adf_dev_err_mask *dev_err_mask)
|
||||
dev_err_mask->parerr_cpr_xlt_mask = ADF_420XX_PARITYERRORMASK_CPR_XLT_MASK;
|
||||
dev_err_mask->parerr_dcpr_ucs_mask = ADF_420XX_PARITYERRORMASK_DCPR_UCS_MASK;
|
||||
dev_err_mask->parerr_pke_mask = ADF_420XX_PARITYERRORMASK_PKE_MASK;
|
||||
dev_err_mask->parerr_wat_wcp_mask = ADF_420XX_PARITYERRORMASK_WAT_WCP_MASK;
|
||||
dev_err_mask->ssmfeatren_mask = ADF_420XX_SSMFEATREN_MASK;
|
||||
}
|
||||
|
||||
|
||||
@@ -695,7 +695,7 @@ static bool adf_handle_slice_hang_error(struct adf_accel_dev *accel_dev,
|
||||
if (err_mask->parerr_wat_wcp_mask)
|
||||
adf_poll_slicehang_csr(accel_dev, csr,
|
||||
ADF_GEN4_SLICEHANGSTATUS_WAT_WCP,
|
||||
"ath_cph");
|
||||
"wat_wcp");
|
||||
|
||||
return false;
|
||||
}
|
||||
@@ -1043,63 +1043,16 @@ static bool adf_handle_ssmcpppar_err(struct adf_accel_dev *accel_dev,
|
||||
return reset_required;
|
||||
}
|
||||
|
||||
static bool adf_handle_rf_parr_err(struct adf_accel_dev *accel_dev,
|
||||
static void adf_handle_rf_parr_err(struct adf_accel_dev *accel_dev,
|
||||
void __iomem *csr, u32 iastatssm)
|
||||
{
|
||||
struct adf_dev_err_mask *err_mask = GET_ERR_MASK(accel_dev);
|
||||
u32 reg;
|
||||
|
||||
if (!(iastatssm & ADF_GEN4_IAINTSTATSSM_SSMSOFTERRORPARITY_BIT))
|
||||
return false;
|
||||
|
||||
reg = ADF_CSR_RD(csr, ADF_GEN4_SSMSOFTERRORPARITY_SRC);
|
||||
reg &= ADF_GEN4_SSMSOFTERRORPARITY_SRC_BIT;
|
||||
if (reg) {
|
||||
ADF_RAS_ERR_CTR_INC(accel_dev->ras_errors, ADF_RAS_UNCORR);
|
||||
ADF_CSR_WR(csr, ADF_GEN4_SSMSOFTERRORPARITY_SRC, reg);
|
||||
}
|
||||
|
||||
reg = ADF_CSR_RD(csr, ADF_GEN4_SSMSOFTERRORPARITY_ATH_CPH);
|
||||
reg &= err_mask->parerr_ath_cph_mask;
|
||||
if (reg) {
|
||||
ADF_RAS_ERR_CTR_INC(accel_dev->ras_errors, ADF_RAS_UNCORR);
|
||||
ADF_CSR_WR(csr, ADF_GEN4_SSMSOFTERRORPARITY_ATH_CPH, reg);
|
||||
}
|
||||
|
||||
reg = ADF_CSR_RD(csr, ADF_GEN4_SSMSOFTERRORPARITY_CPR_XLT);
|
||||
reg &= err_mask->parerr_cpr_xlt_mask;
|
||||
if (reg) {
|
||||
ADF_RAS_ERR_CTR_INC(accel_dev->ras_errors, ADF_RAS_UNCORR);
|
||||
ADF_CSR_WR(csr, ADF_GEN4_SSMSOFTERRORPARITY_CPR_XLT, reg);
|
||||
}
|
||||
|
||||
reg = ADF_CSR_RD(csr, ADF_GEN4_SSMSOFTERRORPARITY_DCPR_UCS);
|
||||
reg &= err_mask->parerr_dcpr_ucs_mask;
|
||||
if (reg) {
|
||||
ADF_RAS_ERR_CTR_INC(accel_dev->ras_errors, ADF_RAS_UNCORR);
|
||||
ADF_CSR_WR(csr, ADF_GEN4_SSMSOFTERRORPARITY_DCPR_UCS, reg);
|
||||
}
|
||||
|
||||
reg = ADF_CSR_RD(csr, ADF_GEN4_SSMSOFTERRORPARITY_PKE);
|
||||
reg &= err_mask->parerr_pke_mask;
|
||||
if (reg) {
|
||||
ADF_RAS_ERR_CTR_INC(accel_dev->ras_errors, ADF_RAS_UNCORR);
|
||||
ADF_CSR_WR(csr, ADF_GEN4_SSMSOFTERRORPARITY_PKE, reg);
|
||||
}
|
||||
|
||||
if (err_mask->parerr_wat_wcp_mask) {
|
||||
reg = ADF_CSR_RD(csr, ADF_GEN4_SSMSOFTERRORPARITY_WAT_WCP);
|
||||
reg &= err_mask->parerr_wat_wcp_mask;
|
||||
if (reg) {
|
||||
ADF_RAS_ERR_CTR_INC(accel_dev->ras_errors, ADF_RAS_UNCORR);
|
||||
ADF_CSR_WR(csr, ADF_GEN4_SSMSOFTERRORPARITY_WAT_WCP,
|
||||
reg);
|
||||
}
|
||||
}
|
||||
return;
|
||||
|
||||
ADF_RAS_ERR_CTR_INC(accel_dev->ras_errors, ADF_RAS_UNCORR);
|
||||
dev_err(&GET_DEV(accel_dev), "Slice ssm soft parity error reported");
|
||||
|
||||
return false;
|
||||
return;
|
||||
}
|
||||
|
||||
static bool adf_handle_ser_err_ssmsh(struct adf_accel_dev *accel_dev,
|
||||
@@ -1171,8 +1124,8 @@ static bool adf_handle_iaintstatssm(struct adf_accel_dev *accel_dev,
|
||||
reset_required |= adf_handle_slice_hang_error(accel_dev, csr, iastatssm);
|
||||
reset_required |= adf_handle_spppar_err(accel_dev, csr, iastatssm);
|
||||
reset_required |= adf_handle_ssmcpppar_err(accel_dev, csr, iastatssm);
|
||||
reset_required |= adf_handle_rf_parr_err(accel_dev, csr, iastatssm);
|
||||
reset_required |= adf_handle_ser_err_ssmsh(accel_dev, csr, iastatssm);
|
||||
adf_handle_rf_parr_err(accel_dev, csr, iastatssm);
|
||||
|
||||
ADF_CSR_WR(csr, ADF_GEN4_IAINTSTATSSM, iastatssm);
|
||||
|
||||
|
||||
@@ -1144,6 +1144,7 @@ static void __init nxcop_get_capabilities(void)
|
||||
{
|
||||
struct hv_vas_all_caps *hv_caps;
|
||||
struct hv_nx_cop_caps *hv_nxc;
|
||||
u64 feat;
|
||||
int rc;
|
||||
|
||||
hv_caps = kmalloc(sizeof(*hv_caps), GFP_KERNEL);
|
||||
@@ -1154,27 +1155,26 @@ static void __init nxcop_get_capabilities(void)
|
||||
*/
|
||||
rc = h_query_vas_capabilities(H_QUERY_NX_CAPABILITIES, 0,
|
||||
(u64)virt_to_phys(hv_caps));
|
||||
if (!rc)
|
||||
feat = be64_to_cpu(hv_caps->feat_type);
|
||||
kfree(hv_caps);
|
||||
if (rc)
|
||||
goto out;
|
||||
return;
|
||||
if (!(feat & VAS_NX_GZIP_FEAT_BIT))
|
||||
return;
|
||||
|
||||
caps_feat = be64_to_cpu(hv_caps->feat_type);
|
||||
/*
|
||||
* NX-GZIP feature available
|
||||
*/
|
||||
if (caps_feat & VAS_NX_GZIP_FEAT_BIT) {
|
||||
hv_nxc = kmalloc(sizeof(*hv_nxc), GFP_KERNEL);
|
||||
if (!hv_nxc)
|
||||
goto out;
|
||||
/*
|
||||
* Get capabilities for NX-GZIP feature
|
||||
*/
|
||||
rc = h_query_vas_capabilities(H_QUERY_NX_CAPABILITIES,
|
||||
VAS_NX_GZIP_FEAT,
|
||||
(u64)virt_to_phys(hv_nxc));
|
||||
} else {
|
||||
pr_err("NX-GZIP feature is not available\n");
|
||||
rc = -EINVAL;
|
||||
}
|
||||
hv_nxc = kmalloc(sizeof(*hv_nxc), GFP_KERNEL);
|
||||
if (!hv_nxc)
|
||||
return;
|
||||
/*
|
||||
* Get capabilities for NX-GZIP feature
|
||||
*/
|
||||
rc = h_query_vas_capabilities(H_QUERY_NX_CAPABILITIES,
|
||||
VAS_NX_GZIP_FEAT,
|
||||
(u64)virt_to_phys(hv_nxc));
|
||||
|
||||
if (!rc) {
|
||||
nx_cop_caps.descriptor = be64_to_cpu(hv_nxc->descriptor);
|
||||
@@ -1184,13 +1184,10 @@ static void __init nxcop_get_capabilities(void)
|
||||
be64_to_cpu(hv_nxc->min_compress_len);
|
||||
nx_cop_caps.min_decompress_len =
|
||||
be64_to_cpu(hv_nxc->min_decompress_len);
|
||||
} else {
|
||||
caps_feat = 0;
|
||||
caps_feat = feat;
|
||||
}
|
||||
|
||||
kfree(hv_nxc);
|
||||
out:
|
||||
kfree(hv_caps);
|
||||
}
|
||||
|
||||
static const struct vio_device_id nx842_vio_driver_ids[] = {
|
||||
|
||||
@@ -282,7 +282,7 @@ static int tegra_aes_do_one_req(struct crypto_engine *engine, void *areq)
|
||||
|
||||
/* Prepare the command and submit for execution */
|
||||
cmdlen = tegra_aes_prep_cmd(ctx, rctx);
|
||||
ret = tegra_se_host1x_submit(se, cmdlen);
|
||||
ret = tegra_se_host1x_submit(se, se->cmdbuf, cmdlen);
|
||||
|
||||
/* Copy the result */
|
||||
tegra_aes_update_iv(req, ctx);
|
||||
@@ -443,6 +443,9 @@ static int tegra_aes_crypt(struct skcipher_request *req, bool encrypt)
|
||||
if (!req->cryptlen)
|
||||
return 0;
|
||||
|
||||
if (ctx->alg == SE_ALG_ECB)
|
||||
req->iv = NULL;
|
||||
|
||||
rctx->encrypt = encrypt;
|
||||
rctx->config = tegra234_aes_cfg(ctx->alg, encrypt);
|
||||
rctx->crypto_config = tegra234_aes_crypto_cfg(ctx->alg, encrypt);
|
||||
@@ -719,7 +722,7 @@ static int tegra_gcm_do_gmac(struct tegra_aead_ctx *ctx, struct tegra_aead_reqct
|
||||
|
||||
cmdlen = tegra_gmac_prep_cmd(ctx, rctx);
|
||||
|
||||
return tegra_se_host1x_submit(se, cmdlen);
|
||||
return tegra_se_host1x_submit(se, se->cmdbuf, cmdlen);
|
||||
}
|
||||
|
||||
static int tegra_gcm_do_crypt(struct tegra_aead_ctx *ctx, struct tegra_aead_reqctx *rctx)
|
||||
@@ -736,7 +739,7 @@ static int tegra_gcm_do_crypt(struct tegra_aead_ctx *ctx, struct tegra_aead_reqc
|
||||
|
||||
/* Prepare command and submit */
|
||||
cmdlen = tegra_gcm_crypt_prep_cmd(ctx, rctx);
|
||||
ret = tegra_se_host1x_submit(se, cmdlen);
|
||||
ret = tegra_se_host1x_submit(se, se->cmdbuf, cmdlen);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -759,7 +762,7 @@ static int tegra_gcm_do_final(struct tegra_aead_ctx *ctx, struct tegra_aead_reqc
|
||||
|
||||
/* Prepare command and submit */
|
||||
cmdlen = tegra_gcm_prep_final_cmd(se, cpuvaddr, rctx);
|
||||
ret = tegra_se_host1x_submit(se, cmdlen);
|
||||
ret = tegra_se_host1x_submit(se, se->cmdbuf, cmdlen);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -891,7 +894,7 @@ static int tegra_ccm_do_cbcmac(struct tegra_aead_ctx *ctx, struct tegra_aead_req
|
||||
/* Prepare command and submit */
|
||||
cmdlen = tegra_cbcmac_prep_cmd(ctx, rctx);
|
||||
|
||||
return tegra_se_host1x_submit(se, cmdlen);
|
||||
return tegra_se_host1x_submit(se, se->cmdbuf, cmdlen);
|
||||
}
|
||||
|
||||
static int tegra_ccm_set_msg_len(u8 *block, unsigned int msglen, int csize)
|
||||
@@ -1098,7 +1101,7 @@ static int tegra_ccm_do_ctr(struct tegra_aead_ctx *ctx, struct tegra_aead_reqctx
|
||||
|
||||
/* Prepare command and submit */
|
||||
cmdlen = tegra_ctr_prep_cmd(ctx, rctx);
|
||||
ret = tegra_se_host1x_submit(se, cmdlen);
|
||||
ret = tegra_se_host1x_submit(se, se->cmdbuf, cmdlen);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -1513,23 +1516,16 @@ static int tegra_cmac_do_update(struct ahash_request *req)
|
||||
rctx->residue.size = nresidue;
|
||||
|
||||
/*
|
||||
* If this is not the first 'update' call, paste the previous copied
|
||||
* If this is not the first task, paste the previous copied
|
||||
* intermediate results to the registers so that it gets picked up.
|
||||
* This is to support the import/export functionality.
|
||||
*/
|
||||
if (!(rctx->task & SHA_FIRST))
|
||||
tegra_cmac_paste_result(ctx->se, rctx);
|
||||
|
||||
cmdlen = tegra_cmac_prep_cmd(ctx, rctx);
|
||||
ret = tegra_se_host1x_submit(se, se->cmdbuf, cmdlen);
|
||||
|
||||
ret = tegra_se_host1x_submit(se, cmdlen);
|
||||
/*
|
||||
* If this is not the final update, copy the intermediate results
|
||||
* from the registers so that it can be used in the next 'update'
|
||||
* call. This is to support the import/export functionality.
|
||||
*/
|
||||
if (!(rctx->task & SHA_FINAL))
|
||||
tegra_cmac_copy_result(ctx->se, rctx);
|
||||
tegra_cmac_copy_result(ctx->se, rctx);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -1553,9 +1549,16 @@ static int tegra_cmac_do_final(struct ahash_request *req)
|
||||
rctx->total_len += rctx->residue.size;
|
||||
rctx->config = tegra234_aes_cfg(SE_ALG_CMAC, 0);
|
||||
|
||||
/*
|
||||
* If this is not the first task, paste the previous copied
|
||||
* intermediate results to the registers so that it gets picked up.
|
||||
*/
|
||||
if (!(rctx->task & SHA_FIRST))
|
||||
tegra_cmac_paste_result(ctx->se, rctx);
|
||||
|
||||
/* Prepare command and submit */
|
||||
cmdlen = tegra_cmac_prep_cmd(ctx, rctx);
|
||||
ret = tegra_se_host1x_submit(se, cmdlen);
|
||||
ret = tegra_se_host1x_submit(se, se->cmdbuf, cmdlen);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
@@ -1581,18 +1584,24 @@ static int tegra_cmac_do_one_req(struct crypto_engine *engine, void *areq)
|
||||
struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
|
||||
struct tegra_cmac_ctx *ctx = crypto_ahash_ctx(tfm);
|
||||
struct tegra_se *se = ctx->se;
|
||||
int ret;
|
||||
int ret = 0;
|
||||
|
||||
if (rctx->task & SHA_UPDATE) {
|
||||
ret = tegra_cmac_do_update(req);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
rctx->task &= ~SHA_UPDATE;
|
||||
}
|
||||
|
||||
if (rctx->task & SHA_FINAL) {
|
||||
ret = tegra_cmac_do_final(req);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
rctx->task &= ~SHA_FINAL;
|
||||
}
|
||||
|
||||
out:
|
||||
crypto_finalize_hash_request(se->engine, req, ret);
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -300,8 +300,9 @@ static int tegra_sha_do_update(struct ahash_request *req)
|
||||
{
|
||||
struct tegra_sha_ctx *ctx = crypto_ahash_ctx(crypto_ahash_reqtfm(req));
|
||||
struct tegra_sha_reqctx *rctx = ahash_request_ctx(req);
|
||||
struct tegra_se *se = ctx->se;
|
||||
unsigned int nblks, nresidue, size, ret;
|
||||
u32 *cpuvaddr = ctx->se->cmdbuf->addr;
|
||||
u32 *cpuvaddr = se->cmdbuf->addr;
|
||||
|
||||
nresidue = (req->nbytes + rctx->residue.size) % rctx->blk_size;
|
||||
nblks = (req->nbytes + rctx->residue.size) / rctx->blk_size;
|
||||
@@ -353,11 +354,11 @@ static int tegra_sha_do_update(struct ahash_request *req)
|
||||
* This is to support the import/export functionality.
|
||||
*/
|
||||
if (!(rctx->task & SHA_FIRST))
|
||||
tegra_sha_paste_hash_result(ctx->se, rctx);
|
||||
tegra_sha_paste_hash_result(se, rctx);
|
||||
|
||||
size = tegra_sha_prep_cmd(ctx->se, cpuvaddr, rctx);
|
||||
size = tegra_sha_prep_cmd(se, cpuvaddr, rctx);
|
||||
|
||||
ret = tegra_se_host1x_submit(ctx->se, size);
|
||||
ret = tegra_se_host1x_submit(se, se->cmdbuf, size);
|
||||
|
||||
/*
|
||||
* If this is not the final update, copy the intermediate results
|
||||
@@ -365,7 +366,7 @@ static int tegra_sha_do_update(struct ahash_request *req)
|
||||
* call. This is to support the import/export functionality.
|
||||
*/
|
||||
if (!(rctx->task & SHA_FINAL))
|
||||
tegra_sha_copy_hash_result(ctx->se, rctx);
|
||||
tegra_sha_copy_hash_result(se, rctx);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -388,7 +389,7 @@ static int tegra_sha_do_final(struct ahash_request *req)
|
||||
|
||||
size = tegra_sha_prep_cmd(se, cpuvaddr, rctx);
|
||||
|
||||
ret = tegra_se_host1x_submit(se, size);
|
||||
ret = tegra_se_host1x_submit(se, se->cmdbuf, size);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
@@ -416,14 +417,21 @@ static int tegra_sha_do_one_req(struct crypto_engine *engine, void *areq)
|
||||
|
||||
if (rctx->task & SHA_UPDATE) {
|
||||
ret = tegra_sha_do_update(req);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
rctx->task &= ~SHA_UPDATE;
|
||||
}
|
||||
|
||||
if (rctx->task & SHA_FINAL) {
|
||||
ret = tegra_sha_do_final(req);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
rctx->task &= ~SHA_FINAL;
|
||||
}
|
||||
|
||||
out:
|
||||
crypto_finalize_hash_request(se->engine, req, ret);
|
||||
|
||||
return 0;
|
||||
@@ -559,13 +567,18 @@ static int tegra_hmac_setkey(struct crypto_ahash *tfm, const u8 *key,
|
||||
unsigned int keylen)
|
||||
{
|
||||
struct tegra_sha_ctx *ctx = crypto_ahash_ctx(tfm);
|
||||
int ret;
|
||||
|
||||
if (aes_check_keylen(keylen))
|
||||
return tegra_hmac_fallback_setkey(ctx, key, keylen);
|
||||
|
||||
ret = tegra_key_submit(ctx->se, key, keylen, ctx->alg, &ctx->key_id);
|
||||
if (ret)
|
||||
return tegra_hmac_fallback_setkey(ctx, key, keylen);
|
||||
|
||||
ctx->fallback = false;
|
||||
|
||||
return tegra_key_submit(ctx->se, key, keylen, ctx->alg, &ctx->key_id);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int tegra_sha_update(struct ahash_request *req)
|
||||
|
||||
@@ -115,11 +115,17 @@ static int tegra_key_insert(struct tegra_se *se, const u8 *key,
|
||||
u32 keylen, u16 slot, u32 alg)
|
||||
{
|
||||
const u32 *keyval = (u32 *)key;
|
||||
u32 *addr = se->cmdbuf->addr, size;
|
||||
u32 *addr = se->keybuf->addr, size;
|
||||
int ret;
|
||||
|
||||
mutex_lock(&kslt_lock);
|
||||
|
||||
size = tegra_key_prep_ins_cmd(se, addr, keyval, keylen, slot, alg);
|
||||
ret = tegra_se_host1x_submit(se, se->keybuf, size);
|
||||
|
||||
return tegra_se_host1x_submit(se, size);
|
||||
mutex_unlock(&kslt_lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void tegra_key_invalidate(struct tegra_se *se, u32 keyid, u32 alg)
|
||||
|
||||
@@ -141,7 +141,7 @@ static struct tegra_se_cmdbuf *tegra_se_host1x_bo_alloc(struct tegra_se *se, ssi
|
||||
return cmdbuf;
|
||||
}
|
||||
|
||||
int tegra_se_host1x_submit(struct tegra_se *se, u32 size)
|
||||
int tegra_se_host1x_submit(struct tegra_se *se, struct tegra_se_cmdbuf *cmdbuf, u32 size)
|
||||
{
|
||||
struct host1x_job *job;
|
||||
int ret;
|
||||
@@ -160,9 +160,9 @@ int tegra_se_host1x_submit(struct tegra_se *se, u32 size)
|
||||
job->engine_fallback_streamid = se->stream_id;
|
||||
job->engine_streamid_offset = SE_STREAM_ID;
|
||||
|
||||
se->cmdbuf->words = size;
|
||||
cmdbuf->words = size;
|
||||
|
||||
host1x_job_add_gather(job, &se->cmdbuf->bo, size, 0);
|
||||
host1x_job_add_gather(job, &cmdbuf->bo, size, 0);
|
||||
|
||||
ret = host1x_job_pin(job, se->dev);
|
||||
if (ret) {
|
||||
@@ -220,14 +220,22 @@ static int tegra_se_client_init(struct host1x_client *client)
|
||||
goto syncpt_put;
|
||||
}
|
||||
|
||||
se->keybuf = tegra_se_host1x_bo_alloc(se, SZ_4K);
|
||||
if (!se->keybuf) {
|
||||
ret = -ENOMEM;
|
||||
goto cmdbuf_put;
|
||||
}
|
||||
|
||||
ret = se->hw->init_alg(se);
|
||||
if (ret) {
|
||||
dev_err(se->dev, "failed to register algorithms\n");
|
||||
goto cmdbuf_put;
|
||||
goto keybuf_put;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
keybuf_put:
|
||||
tegra_se_cmdbuf_put(&se->keybuf->bo);
|
||||
cmdbuf_put:
|
||||
tegra_se_cmdbuf_put(&se->cmdbuf->bo);
|
||||
syncpt_put:
|
||||
|
||||
@@ -420,6 +420,7 @@ struct tegra_se {
|
||||
struct host1x_client client;
|
||||
struct host1x_channel *channel;
|
||||
struct tegra_se_cmdbuf *cmdbuf;
|
||||
struct tegra_se_cmdbuf *keybuf;
|
||||
struct crypto_engine *engine;
|
||||
struct host1x_syncpt *syncpt;
|
||||
struct device *dev;
|
||||
@@ -502,7 +503,7 @@ void tegra_deinit_hash(struct tegra_se *se);
|
||||
int tegra_key_submit(struct tegra_se *se, const u8 *key,
|
||||
u32 keylen, u32 alg, u32 *keyid);
|
||||
void tegra_key_invalidate(struct tegra_se *se, u32 keyid, u32 alg);
|
||||
int tegra_se_host1x_submit(struct tegra_se *se, u32 size);
|
||||
int tegra_se_host1x_submit(struct tegra_se *se, struct tegra_se_cmdbuf *cmdbuf, u32 size);
|
||||
|
||||
/* HOST1x OPCODES */
|
||||
static inline u32 host1x_opcode_setpayload(unsigned int payload)
|
||||
|
||||
@@ -303,6 +303,7 @@ fsl_edma2_irq_init(struct platform_device *pdev,
|
||||
|
||||
/* The last IRQ is for eDMA err */
|
||||
if (i == count - 1) {
|
||||
fsl_edma->errirq = irq;
|
||||
ret = devm_request_irq(&pdev->dev, irq,
|
||||
fsl_edma_err_handler,
|
||||
0, "eDMA2-ERR", fsl_edma);
|
||||
@@ -322,10 +323,13 @@ static void fsl_edma_irq_exit(
|
||||
struct platform_device *pdev, struct fsl_edma_engine *fsl_edma)
|
||||
{
|
||||
if (fsl_edma->txirq == fsl_edma->errirq) {
|
||||
devm_free_irq(&pdev->dev, fsl_edma->txirq, fsl_edma);
|
||||
if (fsl_edma->txirq >= 0)
|
||||
devm_free_irq(&pdev->dev, fsl_edma->txirq, fsl_edma);
|
||||
} else {
|
||||
devm_free_irq(&pdev->dev, fsl_edma->txirq, fsl_edma);
|
||||
devm_free_irq(&pdev->dev, fsl_edma->errirq, fsl_edma);
|
||||
if (fsl_edma->txirq >= 0)
|
||||
devm_free_irq(&pdev->dev, fsl_edma->txirq, fsl_edma);
|
||||
if (fsl_edma->errirq >= 0)
|
||||
devm_free_irq(&pdev->dev, fsl_edma->errirq, fsl_edma);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -513,6 +517,8 @@ static int fsl_edma_probe(struct platform_device *pdev)
|
||||
if (!fsl_edma)
|
||||
return -ENOMEM;
|
||||
|
||||
fsl_edma->errirq = -EINVAL;
|
||||
fsl_edma->txirq = -EINVAL;
|
||||
fsl_edma->drvdata = drvdata;
|
||||
fsl_edma->n_chans = chans;
|
||||
mutex_init(&fsl_edma->fsl_edma_mutex);
|
||||
@@ -699,9 +705,9 @@ static void fsl_edma_remove(struct platform_device *pdev)
|
||||
struct fsl_edma_engine *fsl_edma = platform_get_drvdata(pdev);
|
||||
|
||||
fsl_edma_irq_exit(pdev, fsl_edma);
|
||||
fsl_edma_cleanup_vchan(&fsl_edma->dma_dev);
|
||||
of_dma_controller_free(np);
|
||||
dma_async_device_unregister(&fsl_edma->dma_dev);
|
||||
fsl_edma_cleanup_vchan(&fsl_edma->dma_dev);
|
||||
fsl_disable_clocks(fsl_edma, fsl_edma->drvdata->dmamuxs);
|
||||
}
|
||||
|
||||
|
||||
@@ -751,6 +751,8 @@ static int i10nm_get_ddr_munits(void)
|
||||
continue;
|
||||
} else {
|
||||
d->imc[lmc].mdev = mdev;
|
||||
if (res_cfg->type == SPR)
|
||||
skx_set_mc_mapping(d, i, lmc);
|
||||
lmc++;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -91,8 +91,6 @@
|
||||
(((did) & PCI_DEVICE_ID_INTEL_IE31200_HB_CFL_MASK) == \
|
||||
PCI_DEVICE_ID_INTEL_IE31200_HB_CFL_MASK))
|
||||
|
||||
#define IE31200_DIMMS 4
|
||||
#define IE31200_RANKS 8
|
||||
#define IE31200_RANKS_PER_CHANNEL 4
|
||||
#define IE31200_DIMMS_PER_CHANNEL 2
|
||||
#define IE31200_CHANNELS 2
|
||||
@@ -164,6 +162,7 @@
|
||||
#define IE31200_MAD_DIMM_0_OFFSET 0x5004
|
||||
#define IE31200_MAD_DIMM_0_OFFSET_SKL 0x500C
|
||||
#define IE31200_MAD_DIMM_SIZE GENMASK_ULL(7, 0)
|
||||
#define IE31200_MAD_DIMM_SIZE_SKL GENMASK_ULL(5, 0)
|
||||
#define IE31200_MAD_DIMM_A_RANK BIT(17)
|
||||
#define IE31200_MAD_DIMM_A_RANK_SHIFT 17
|
||||
#define IE31200_MAD_DIMM_A_RANK_SKL BIT(10)
|
||||
@@ -377,7 +376,7 @@ static void __iomem *ie31200_map_mchbar(struct pci_dev *pdev)
|
||||
static void __skl_populate_dimm_info(struct dimm_data *dd, u32 addr_decode,
|
||||
int chan)
|
||||
{
|
||||
dd->size = (addr_decode >> (chan << 4)) & IE31200_MAD_DIMM_SIZE;
|
||||
dd->size = (addr_decode >> (chan << 4)) & IE31200_MAD_DIMM_SIZE_SKL;
|
||||
dd->dual_rank = (addr_decode & (IE31200_MAD_DIMM_A_RANK_SKL << (chan << 4))) ? 1 : 0;
|
||||
dd->x16_width = ((addr_decode & (IE31200_MAD_DIMM_A_WIDTH_SKL << (chan << 4))) >>
|
||||
(IE31200_MAD_DIMM_A_WIDTH_SKL_SHIFT + (chan << 4)));
|
||||
@@ -426,7 +425,7 @@ static int ie31200_probe1(struct pci_dev *pdev, int dev_idx)
|
||||
|
||||
nr_channels = how_many_channels(pdev);
|
||||
layers[0].type = EDAC_MC_LAYER_CHIP_SELECT;
|
||||
layers[0].size = IE31200_DIMMS;
|
||||
layers[0].size = IE31200_RANKS_PER_CHANNEL;
|
||||
layers[0].is_virt_csrow = true;
|
||||
layers[1].type = EDAC_MC_LAYER_CHANNEL;
|
||||
layers[1].size = nr_channels;
|
||||
@@ -618,7 +617,7 @@ static int __init ie31200_init(void)
|
||||
|
||||
pci_rc = pci_register_driver(&ie31200_driver);
|
||||
if (pci_rc < 0)
|
||||
goto fail0;
|
||||
return pci_rc;
|
||||
|
||||
if (!mci_pdev) {
|
||||
ie31200_registered = 0;
|
||||
@@ -629,11 +628,13 @@ static int __init ie31200_init(void)
|
||||
if (mci_pdev)
|
||||
break;
|
||||
}
|
||||
|
||||
if (!mci_pdev) {
|
||||
edac_dbg(0, "ie31200 pci_get_device fail\n");
|
||||
pci_rc = -ENODEV;
|
||||
goto fail1;
|
||||
goto fail0;
|
||||
}
|
||||
|
||||
pci_rc = ie31200_init_one(mci_pdev, &ie31200_pci_tbl[i]);
|
||||
if (pci_rc < 0) {
|
||||
edac_dbg(0, "ie31200 init fail\n");
|
||||
@@ -641,12 +642,12 @@ static int __init ie31200_init(void)
|
||||
goto fail1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
||||
return 0;
|
||||
fail1:
|
||||
pci_unregister_driver(&ie31200_driver);
|
||||
fail0:
|
||||
pci_dev_put(mci_pdev);
|
||||
fail0:
|
||||
pci_unregister_driver(&ie31200_driver);
|
||||
|
||||
return pci_rc;
|
||||
}
|
||||
|
||||
@@ -120,6 +120,35 @@ void skx_adxl_put(void)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(skx_adxl_put);
|
||||
|
||||
static void skx_init_mc_mapping(struct skx_dev *d)
|
||||
{
|
||||
/*
|
||||
* By default, the BIOS presents all memory controllers within each
|
||||
* socket to the EDAC driver. The physical indices are the same as
|
||||
* the logical indices of the memory controllers enumerated by the
|
||||
* EDAC driver.
|
||||
*/
|
||||
for (int i = 0; i < NUM_IMC; i++)
|
||||
d->mc_mapping[i] = i;
|
||||
}
|
||||
|
||||
void skx_set_mc_mapping(struct skx_dev *d, u8 pmc, u8 lmc)
|
||||
{
|
||||
edac_dbg(0, "Set the mapping of mc phy idx to logical idx: %02d -> %02d\n",
|
||||
pmc, lmc);
|
||||
|
||||
d->mc_mapping[pmc] = lmc;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(skx_set_mc_mapping);
|
||||
|
||||
static u8 skx_get_mc_mapping(struct skx_dev *d, u8 pmc)
|
||||
{
|
||||
edac_dbg(0, "Get the mapping of mc phy idx to logical idx: %02d -> %02d\n",
|
||||
pmc, d->mc_mapping[pmc]);
|
||||
|
||||
return d->mc_mapping[pmc];
|
||||
}
|
||||
|
||||
static bool skx_adxl_decode(struct decoded_addr *res, enum error_source err_src)
|
||||
{
|
||||
struct skx_dev *d;
|
||||
@@ -187,6 +216,8 @@ static bool skx_adxl_decode(struct decoded_addr *res, enum error_source err_src)
|
||||
return false;
|
||||
}
|
||||
|
||||
res->imc = skx_get_mc_mapping(d, res->imc);
|
||||
|
||||
for (i = 0; i < adxl_component_count; i++) {
|
||||
if (adxl_values[i] == ~0x0ull)
|
||||
continue;
|
||||
@@ -307,6 +338,8 @@ int skx_get_all_bus_mappings(struct res_config *cfg, struct list_head **list)
|
||||
d->bus[0], d->bus[1], d->bus[2], d->bus[3]);
|
||||
list_add_tail(&d->list, &dev_edac_list);
|
||||
prev = pdev;
|
||||
|
||||
skx_init_mc_mapping(d);
|
||||
}
|
||||
|
||||
if (list)
|
||||
|
||||
@@ -93,6 +93,16 @@ struct skx_dev {
|
||||
struct pci_dev *uracu; /* for i10nm CPU */
|
||||
struct pci_dev *pcu_cr3; /* for HBM memory detection */
|
||||
u32 mcroute;
|
||||
/*
|
||||
* Some server BIOS may hide certain memory controllers, and the
|
||||
* EDAC driver skips those hidden memory controllers. However, the
|
||||
* ADXL still decodes memory error address using physical memory
|
||||
* controller indices. The mapping table is used to convert the
|
||||
* physical indices (reported by ADXL) to the logical indices
|
||||
* (used the EDAC driver) of present memory controllers during the
|
||||
* error handling process.
|
||||
*/
|
||||
u8 mc_mapping[NUM_IMC];
|
||||
struct skx_imc {
|
||||
struct mem_ctl_info *mci;
|
||||
struct pci_dev *mdev; /* for i10nm CPU */
|
||||
@@ -242,6 +252,7 @@ void skx_adxl_put(void);
|
||||
void skx_set_decode(skx_decode_f decode, skx_show_retry_log_f show_retry_log);
|
||||
void skx_set_mem_cfg(bool mem_cfg_2lm);
|
||||
void skx_set_res_cfg(struct res_config *cfg);
|
||||
void skx_set_mc_mapping(struct skx_dev *d, u8 pmc, u8 lmc);
|
||||
|
||||
int skx_get_src_id(struct skx_dev *d, int off, u8 *id);
|
||||
int skx_get_node_id(struct skx_dev *d, u8 *id);
|
||||
|
||||
@@ -584,7 +584,7 @@ int amdgpu_umsch_mm_init_microcode(struct amdgpu_umsch_mm *umsch)
|
||||
fw_name = "amdgpu/umsch_mm_4_0_0.bin";
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
r = amdgpu_ucode_request(adev, &adev->umsch_mm.fw, "%s", fw_name);
|
||||
|
||||
@@ -205,21 +205,6 @@ static int add_queue_mes(struct device_queue_manager *dqm, struct queue *q,
|
||||
if (!down_read_trylock(&adev->reset_domain->sem))
|
||||
return -EIO;
|
||||
|
||||
if (!pdd->proc_ctx_cpu_ptr) {
|
||||
r = amdgpu_amdkfd_alloc_gtt_mem(adev,
|
||||
AMDGPU_MES_PROC_CTX_SIZE,
|
||||
&pdd->proc_ctx_bo,
|
||||
&pdd->proc_ctx_gpu_addr,
|
||||
&pdd->proc_ctx_cpu_ptr,
|
||||
false);
|
||||
if (r) {
|
||||
dev_err(adev->dev,
|
||||
"failed to allocate process context bo\n");
|
||||
return r;
|
||||
}
|
||||
memset(pdd->proc_ctx_cpu_ptr, 0, AMDGPU_MES_PROC_CTX_SIZE);
|
||||
}
|
||||
|
||||
memset(&queue_input, 0x0, sizeof(struct mes_add_queue_input));
|
||||
queue_input.process_id = qpd->pqm->process->pasid;
|
||||
queue_input.page_table_base_addr = qpd->page_table_base;
|
||||
|
||||
@@ -361,10 +361,26 @@ int pqm_create_queue(struct process_queue_manager *pqm,
|
||||
if (retval != 0)
|
||||
return retval;
|
||||
|
||||
/* Register process if this is the first queue */
|
||||
if (list_empty(&pdd->qpd.queues_list) &&
|
||||
list_empty(&pdd->qpd.priv_queue_list))
|
||||
dev->dqm->ops.register_process(dev->dqm, &pdd->qpd);
|
||||
|
||||
/* Allocate proc_ctx_bo only if MES is enabled and this is the first queue */
|
||||
if (!pdd->proc_ctx_cpu_ptr && dev->kfd->shared_resources.enable_mes) {
|
||||
retval = amdgpu_amdkfd_alloc_gtt_mem(dev->adev,
|
||||
AMDGPU_MES_PROC_CTX_SIZE,
|
||||
&pdd->proc_ctx_bo,
|
||||
&pdd->proc_ctx_gpu_addr,
|
||||
&pdd->proc_ctx_cpu_ptr,
|
||||
false);
|
||||
if (retval) {
|
||||
dev_err(dev->adev->dev, "failed to allocate process context bo\n");
|
||||
return retval;
|
||||
}
|
||||
memset(pdd->proc_ctx_cpu_ptr, 0, AMDGPU_MES_PROC_CTX_SIZE);
|
||||
}
|
||||
|
||||
pqn = kzalloc(sizeof(*pqn), GFP_KERNEL);
|
||||
if (!pqn) {
|
||||
retval = -ENOMEM;
|
||||
|
||||
@@ -63,6 +63,10 @@ void dmub_hw_lock_mgr_inbox0_cmd(struct dc_dmub_srv *dmub_srv,
|
||||
|
||||
bool should_use_dmub_lock(struct dc_link *link)
|
||||
{
|
||||
/* ASIC doesn't support DMUB */
|
||||
if (!link->ctx->dmub_srv)
|
||||
return false;
|
||||
|
||||
if (link->psr_settings.psr_version == DC_PSR_VERSION_SU_1)
|
||||
return true;
|
||||
|
||||
|
||||
@@ -281,10 +281,10 @@ static void CalculateDynamicMetadataParameters(
|
||||
double DISPCLK,
|
||||
double DCFClkDeepSleep,
|
||||
double PixelClock,
|
||||
long HTotal,
|
||||
long VBlank,
|
||||
long DynamicMetadataTransmittedBytes,
|
||||
long DynamicMetadataLinesBeforeActiveRequired,
|
||||
unsigned int HTotal,
|
||||
unsigned int VBlank,
|
||||
unsigned int DynamicMetadataTransmittedBytes,
|
||||
int DynamicMetadataLinesBeforeActiveRequired,
|
||||
int InterlaceEnable,
|
||||
bool ProgressiveToInterlaceUnitInOPP,
|
||||
double *Tsetup,
|
||||
@@ -3277,8 +3277,8 @@ static double CalculateWriteBackDelay(
|
||||
|
||||
|
||||
static void CalculateDynamicMetadataParameters(int MaxInterDCNTileRepeaters, double DPPCLK, double DISPCLK,
|
||||
double DCFClkDeepSleep, double PixelClock, long HTotal, long VBlank, long DynamicMetadataTransmittedBytes,
|
||||
long DynamicMetadataLinesBeforeActiveRequired, int InterlaceEnable, bool ProgressiveToInterlaceUnitInOPP,
|
||||
double DCFClkDeepSleep, double PixelClock, unsigned int HTotal, unsigned int VBlank, unsigned int DynamicMetadataTransmittedBytes,
|
||||
int DynamicMetadataLinesBeforeActiveRequired, int InterlaceEnable, bool ProgressiveToInterlaceUnitInOPP,
|
||||
double *Tsetup, double *Tdmbf, double *Tdmec, double *Tdmsks)
|
||||
{
|
||||
double TotalRepeaterDelayTime = 0;
|
||||
|
||||
@@ -139,9 +139,8 @@ bool core_dcn4_initialize(struct dml2_core_initialize_in_out *in_out)
|
||||
core->clean_me_up.mode_lib.ip.subvp_fw_processing_delay_us = core_dcn4_ip_caps_base.subvp_pstate_allow_width_us;
|
||||
core->clean_me_up.mode_lib.ip.subvp_swath_height_margin_lines = core_dcn4_ip_caps_base.subvp_swath_height_margin_lines;
|
||||
} else {
|
||||
memcpy(&core->clean_me_up.mode_lib.ip, &core_dcn4_ip_caps_base, sizeof(struct dml2_core_ip_params));
|
||||
memcpy(&core->clean_me_up.mode_lib.ip, &core_dcn4_ip_caps_base, sizeof(struct dml2_core_ip_params));
|
||||
patch_ip_params_with_ip_caps(&core->clean_me_up.mode_lib.ip, in_out->ip_caps);
|
||||
|
||||
core->clean_me_up.mode_lib.ip.imall_supported = false;
|
||||
}
|
||||
|
||||
|
||||
@@ -459,8 +459,7 @@ int smu_cmn_send_smc_msg_with_param(struct smu_context *smu,
|
||||
}
|
||||
if (read_arg) {
|
||||
smu_cmn_read_arg(smu, read_arg);
|
||||
dev_dbg(adev->dev, "smu send message: %s(%d) param: 0x%08x, resp: 0x%08x,\
|
||||
readval: 0x%08x\n",
|
||||
dev_dbg(adev->dev, "smu send message: %s(%d) param: 0x%08x, resp: 0x%08x, readval: 0x%08x\n",
|
||||
smu_get_message_name(smu, msg), index, param, reg, *read_arg);
|
||||
} else {
|
||||
dev_dbg(adev->dev, "smu send message: %s(%d) param: 0x%08x, resp: 0x%08x\n",
|
||||
|
||||
@@ -2463,9 +2463,9 @@ static int cdns_mhdp_probe(struct platform_device *pdev)
|
||||
if (!mhdp)
|
||||
return -ENOMEM;
|
||||
|
||||
clk = devm_clk_get(dev, NULL);
|
||||
clk = devm_clk_get_enabled(dev, NULL);
|
||||
if (IS_ERR(clk)) {
|
||||
dev_err(dev, "couldn't get clk: %ld\n", PTR_ERR(clk));
|
||||
dev_err(dev, "couldn't get and enable clk: %ld\n", PTR_ERR(clk));
|
||||
return PTR_ERR(clk);
|
||||
}
|
||||
|
||||
@@ -2504,14 +2504,12 @@ static int cdns_mhdp_probe(struct platform_device *pdev)
|
||||
|
||||
mhdp->info = of_device_get_match_data(dev);
|
||||
|
||||
clk_prepare_enable(clk);
|
||||
|
||||
pm_runtime_enable(dev);
|
||||
ret = pm_runtime_resume_and_get(dev);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "pm_runtime_resume_and_get failed\n");
|
||||
pm_runtime_disable(dev);
|
||||
goto clk_disable;
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (mhdp->info && mhdp->info->ops && mhdp->info->ops->init) {
|
||||
@@ -2590,8 +2588,6 @@ plat_fini:
|
||||
runtime_put:
|
||||
pm_runtime_put_sync(dev);
|
||||
pm_runtime_disable(dev);
|
||||
clk_disable:
|
||||
clk_disable_unprepare(mhdp->clk);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -2632,8 +2628,6 @@ static void cdns_mhdp_remove(struct platform_device *pdev)
|
||||
cancel_work_sync(&mhdp->modeset_retry_work);
|
||||
flush_work(&mhdp->hpd_work);
|
||||
/* Ignoring mhdp->hdcp.check_work and mhdp->hdcp.prop_work here. */
|
||||
|
||||
clk_disable_unprepare(mhdp->clk);
|
||||
}
|
||||
|
||||
static const struct of_device_id mhdp_ids[] = {
|
||||
|
||||
@@ -2042,12 +2042,13 @@ static bool it6505_hdcp_part2_ksvlist_check(struct it6505 *it6505)
|
||||
continue;
|
||||
}
|
||||
|
||||
for (i = 0; i < 5; i++) {
|
||||
for (i = 0; i < 5; i++)
|
||||
if (bv[i][3] != av[i][0] || bv[i][2] != av[i][1] ||
|
||||
av[i][1] != av[i][2] || bv[i][0] != av[i][3])
|
||||
bv[i][1] != av[i][2] || bv[i][0] != av[i][3])
|
||||
break;
|
||||
|
||||
DRM_DEV_DEBUG_DRIVER(dev, "V' all match!! %d, %d", retry, i);
|
||||
if (i == 5) {
|
||||
DRM_DEV_DEBUG_DRIVER(dev, "V' all match!! %d", retry);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -480,6 +480,7 @@ static int ti_sn65dsi86_add_aux_device(struct ti_sn65dsi86 *pdata,
|
||||
const char *name)
|
||||
{
|
||||
struct device *dev = pdata->dev;
|
||||
const struct i2c_client *client = to_i2c_client(dev);
|
||||
struct auxiliary_device *aux;
|
||||
int ret;
|
||||
|
||||
@@ -488,6 +489,7 @@ static int ti_sn65dsi86_add_aux_device(struct ti_sn65dsi86 *pdata,
|
||||
return -ENOMEM;
|
||||
|
||||
aux->name = name;
|
||||
aux->id = (client->adapter->nr << 10) | client->addr;
|
||||
aux->dev.parent = dev;
|
||||
aux->dev.release = ti_sn65dsi86_aux_device_release;
|
||||
device_set_of_node_from_dev(&aux->dev, dev);
|
||||
|
||||
@@ -179,13 +179,13 @@ static int
|
||||
drm_dp_mst_rad_to_str(const u8 rad[8], u8 lct, char *out, size_t len)
|
||||
{
|
||||
int i;
|
||||
u8 unpacked_rad[16];
|
||||
u8 unpacked_rad[16] = {};
|
||||
|
||||
for (i = 0; i < lct; i++) {
|
||||
for (i = 1; i < lct; i++) {
|
||||
if (i % 2)
|
||||
unpacked_rad[i] = rad[i / 2] >> 4;
|
||||
unpacked_rad[i] = rad[(i - 1) / 2] >> 4;
|
||||
else
|
||||
unpacked_rad[i] = rad[i / 2] & BIT_MASK(4);
|
||||
unpacked_rad[i] = rad[(i - 1) / 2] & 0xF;
|
||||
}
|
||||
|
||||
/* TODO: Eventually add something to printk so we can format the rad
|
||||
|
||||
@@ -620,13 +620,16 @@ static void mtk_crtc_update_config(struct mtk_crtc *mtk_crtc, bool needs_vblank)
|
||||
|
||||
mbox_send_message(mtk_crtc->cmdq_client.chan, cmdq_handle);
|
||||
mbox_client_txdone(mtk_crtc->cmdq_client.chan, 0);
|
||||
goto update_config_out;
|
||||
}
|
||||
#else
|
||||
#endif
|
||||
spin_lock_irqsave(&mtk_crtc->config_lock, flags);
|
||||
mtk_crtc->config_updating = false;
|
||||
spin_unlock_irqrestore(&mtk_crtc->config_lock, flags);
|
||||
#endif
|
||||
|
||||
#if IS_REACHABLE(CONFIG_MTK_CMDQ)
|
||||
update_config_out:
|
||||
#endif
|
||||
mutex_unlock(&mtk_crtc->hw_lock);
|
||||
}
|
||||
|
||||
|
||||
@@ -1746,7 +1746,7 @@ static int mtk_dp_parse_capabilities(struct mtk_dp *mtk_dp)
|
||||
|
||||
ret = drm_dp_dpcd_readb(&mtk_dp->aux, DP_MSTM_CAP, &val);
|
||||
if (ret < 1) {
|
||||
drm_err(mtk_dp->drm_dev, "Read mstm cap failed\n");
|
||||
dev_err(mtk_dp->dev, "Read mstm cap failed: %zd\n", ret);
|
||||
return ret == 0 ? -EIO : ret;
|
||||
}
|
||||
|
||||
@@ -1756,7 +1756,7 @@ static int mtk_dp_parse_capabilities(struct mtk_dp *mtk_dp)
|
||||
DP_DEVICE_SERVICE_IRQ_VECTOR_ESI0,
|
||||
&val);
|
||||
if (ret < 1) {
|
||||
drm_err(mtk_dp->drm_dev, "Read irq vector failed\n");
|
||||
dev_err(mtk_dp->dev, "Read irq vector failed: %zd\n", ret);
|
||||
return ret == 0 ? -EIO : ret;
|
||||
}
|
||||
|
||||
@@ -2039,7 +2039,7 @@ static int mtk_dp_wait_hpd_asserted(struct drm_dp_aux *mtk_aux, unsigned long wa
|
||||
|
||||
ret = mtk_dp_parse_capabilities(mtk_dp);
|
||||
if (ret) {
|
||||
drm_err(mtk_dp->drm_dev, "Can't parse capabilities\n");
|
||||
dev_err(mtk_dp->dev, "Can't parse capabilities: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -1108,12 +1108,12 @@ static ssize_t mtk_dsi_host_transfer(struct mipi_dsi_host *host,
|
||||
const struct mipi_dsi_msg *msg)
|
||||
{
|
||||
struct mtk_dsi *dsi = host_to_dsi(host);
|
||||
u32 recv_cnt, i;
|
||||
ssize_t recv_cnt;
|
||||
u8 read_data[16];
|
||||
void *src_addr;
|
||||
u8 irq_flag = CMD_DONE_INT_FLAG;
|
||||
u32 dsi_mode;
|
||||
int ret;
|
||||
int ret, i;
|
||||
|
||||
dsi_mode = readl(dsi->regs + DSI_MODE_CTRL);
|
||||
if (dsi_mode & MODE) {
|
||||
@@ -1162,7 +1162,7 @@ static ssize_t mtk_dsi_host_transfer(struct mipi_dsi_host *host,
|
||||
if (recv_cnt)
|
||||
memcpy(msg->rx_buf, src_addr, recv_cnt);
|
||||
|
||||
DRM_INFO("dsi get %d byte data from the panel address(0x%x)\n",
|
||||
DRM_INFO("dsi get %zd byte data from the panel address(0x%x)\n",
|
||||
recv_cnt, *((u8 *)(msg->tx_buf)));
|
||||
|
||||
restore_dsi_mode:
|
||||
|
||||
@@ -137,7 +137,7 @@ enum hdmi_aud_channel_swap_type {
|
||||
|
||||
struct hdmi_audio_param {
|
||||
enum hdmi_audio_coding_type aud_codec;
|
||||
enum hdmi_audio_sample_size aud_sampe_size;
|
||||
enum hdmi_audio_sample_size aud_sample_size;
|
||||
enum hdmi_aud_input_type aud_input_type;
|
||||
enum hdmi_aud_i2s_fmt aud_i2s_fmt;
|
||||
enum hdmi_aud_mclk aud_mclk;
|
||||
@@ -173,6 +173,7 @@ struct mtk_hdmi {
|
||||
unsigned int sys_offset;
|
||||
void __iomem *regs;
|
||||
enum hdmi_colorspace csp;
|
||||
struct platform_device *audio_pdev;
|
||||
struct hdmi_audio_param aud_param;
|
||||
bool audio_enable;
|
||||
bool powered;
|
||||
@@ -1074,7 +1075,7 @@ static int mtk_hdmi_output_init(struct mtk_hdmi *hdmi)
|
||||
|
||||
hdmi->csp = HDMI_COLORSPACE_RGB;
|
||||
aud_param->aud_codec = HDMI_AUDIO_CODING_TYPE_PCM;
|
||||
aud_param->aud_sampe_size = HDMI_AUDIO_SAMPLE_SIZE_16;
|
||||
aud_param->aud_sample_size = HDMI_AUDIO_SAMPLE_SIZE_16;
|
||||
aud_param->aud_input_type = HDMI_AUD_INPUT_I2S;
|
||||
aud_param->aud_i2s_fmt = HDMI_I2S_MODE_I2S_24BIT;
|
||||
aud_param->aud_mclk = HDMI_AUD_MCLK_128FS;
|
||||
@@ -1572,14 +1573,14 @@ static int mtk_hdmi_audio_hw_params(struct device *dev, void *data,
|
||||
switch (daifmt->fmt) {
|
||||
case HDMI_I2S:
|
||||
hdmi_params.aud_codec = HDMI_AUDIO_CODING_TYPE_PCM;
|
||||
hdmi_params.aud_sampe_size = HDMI_AUDIO_SAMPLE_SIZE_16;
|
||||
hdmi_params.aud_sample_size = HDMI_AUDIO_SAMPLE_SIZE_16;
|
||||
hdmi_params.aud_input_type = HDMI_AUD_INPUT_I2S;
|
||||
hdmi_params.aud_i2s_fmt = HDMI_I2S_MODE_I2S_24BIT;
|
||||
hdmi_params.aud_mclk = HDMI_AUD_MCLK_128FS;
|
||||
break;
|
||||
case HDMI_SPDIF:
|
||||
hdmi_params.aud_codec = HDMI_AUDIO_CODING_TYPE_PCM;
|
||||
hdmi_params.aud_sampe_size = HDMI_AUDIO_SAMPLE_SIZE_16;
|
||||
hdmi_params.aud_sample_size = HDMI_AUDIO_SAMPLE_SIZE_16;
|
||||
hdmi_params.aud_input_type = HDMI_AUD_INPUT_SPDIF;
|
||||
break;
|
||||
default:
|
||||
@@ -1663,6 +1664,11 @@ static const struct hdmi_codec_ops mtk_hdmi_audio_codec_ops = {
|
||||
.no_capture_mute = 1,
|
||||
};
|
||||
|
||||
static void mtk_hdmi_unregister_audio_driver(void *data)
|
||||
{
|
||||
platform_device_unregister(data);
|
||||
}
|
||||
|
||||
static int mtk_hdmi_register_audio_driver(struct device *dev)
|
||||
{
|
||||
struct mtk_hdmi *hdmi = dev_get_drvdata(dev);
|
||||
@@ -1672,13 +1678,20 @@ static int mtk_hdmi_register_audio_driver(struct device *dev)
|
||||
.i2s = 1,
|
||||
.data = hdmi,
|
||||
};
|
||||
struct platform_device *pdev;
|
||||
int ret;
|
||||
|
||||
pdev = platform_device_register_data(dev, HDMI_CODEC_DRV_NAME,
|
||||
PLATFORM_DEVID_AUTO, &codec_data,
|
||||
sizeof(codec_data));
|
||||
if (IS_ERR(pdev))
|
||||
return PTR_ERR(pdev);
|
||||
hdmi->audio_pdev = platform_device_register_data(dev,
|
||||
HDMI_CODEC_DRV_NAME,
|
||||
PLATFORM_DEVID_AUTO,
|
||||
&codec_data,
|
||||
sizeof(codec_data));
|
||||
if (IS_ERR(hdmi->audio_pdev))
|
||||
return PTR_ERR(hdmi->audio_pdev);
|
||||
|
||||
ret = devm_add_action_or_reset(dev, mtk_hdmi_unregister_audio_driver,
|
||||
hdmi->audio_pdev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
DRM_INFO("%s driver bound to HDMI\n", HDMI_CODEC_DRV_NAME);
|
||||
return 0;
|
||||
|
||||
@@ -1507,6 +1507,8 @@ static void a6xx_get_indexed_registers(struct msm_gpu *gpu,
|
||||
|
||||
/* Restore the size in the hardware */
|
||||
gpu_write(gpu, REG_A6XX_CP_MEM_POOL_SIZE, mempool_size);
|
||||
|
||||
a6xx_state->nr_indexed_regs = count;
|
||||
}
|
||||
|
||||
static void a7xx_get_indexed_registers(struct msm_gpu *gpu,
|
||||
|
||||
@@ -1191,10 +1191,6 @@ static int dpu_crtc_atomic_check(struct drm_crtc *crtc,
|
||||
|
||||
DRM_DEBUG_ATOMIC("%s: check\n", dpu_crtc->name);
|
||||
|
||||
/* force a full mode set if active state changed */
|
||||
if (crtc_state->active_changed)
|
||||
crtc_state->mode_changed = true;
|
||||
|
||||
if (cstate->num_mixers) {
|
||||
rc = _dpu_crtc_check_and_setup_lm_bounds(crtc, crtc_state);
|
||||
if (rc)
|
||||
|
||||
@@ -718,12 +718,11 @@ static int dpu_encoder_virt_atomic_check(
|
||||
crtc_state->mode_changed = true;
|
||||
/*
|
||||
* Release and Allocate resources on every modeset
|
||||
* Dont allocate when active is false.
|
||||
*/
|
||||
if (drm_atomic_crtc_needs_modeset(crtc_state)) {
|
||||
dpu_rm_release(global_state, drm_enc);
|
||||
|
||||
if (!crtc_state->active_changed || crtc_state->enable)
|
||||
if (crtc_state->enable)
|
||||
ret = dpu_rm_reserve(&dpu_kms->rm, global_state,
|
||||
drm_enc, crtc_state, topology);
|
||||
if (!ret)
|
||||
|
||||
@@ -846,7 +846,7 @@ static void dsi_ctrl_enable(struct msm_dsi_host *msm_host,
|
||||
dsi_write(msm_host, REG_DSI_CPHY_MODE_CTRL, BIT(0));
|
||||
}
|
||||
|
||||
static void dsi_update_dsc_timing(struct msm_dsi_host *msm_host, bool is_cmd_mode, u32 hdisplay)
|
||||
static void dsi_update_dsc_timing(struct msm_dsi_host *msm_host, bool is_cmd_mode)
|
||||
{
|
||||
struct drm_dsc_config *dsc = msm_host->dsc;
|
||||
u32 reg, reg_ctrl, reg_ctrl2;
|
||||
@@ -858,7 +858,7 @@ static void dsi_update_dsc_timing(struct msm_dsi_host *msm_host, bool is_cmd_mod
|
||||
/* first calculate dsc parameters and then program
|
||||
* compress mode registers
|
||||
*/
|
||||
slice_per_intf = msm_dsc_get_slices_per_intf(dsc, hdisplay);
|
||||
slice_per_intf = dsc->slice_count;
|
||||
|
||||
total_bytes_per_intf = dsc->slice_chunk_size * slice_per_intf;
|
||||
bytes_per_pkt = dsc->slice_chunk_size; /* * slice_per_pkt; */
|
||||
@@ -991,7 +991,7 @@ static void dsi_timing_setup(struct msm_dsi_host *msm_host, bool is_bonded_dsi)
|
||||
|
||||
if (msm_host->mode_flags & MIPI_DSI_MODE_VIDEO) {
|
||||
if (msm_host->dsc)
|
||||
dsi_update_dsc_timing(msm_host, false, mode->hdisplay);
|
||||
dsi_update_dsc_timing(msm_host, false);
|
||||
|
||||
dsi_write(msm_host, REG_DSI_ACTIVE_H,
|
||||
DSI_ACTIVE_H_START(ha_start) |
|
||||
@@ -1012,7 +1012,7 @@ static void dsi_timing_setup(struct msm_dsi_host *msm_host, bool is_bonded_dsi)
|
||||
DSI_ACTIVE_VSYNC_VPOS_END(vs_end));
|
||||
} else { /* command mode */
|
||||
if (msm_host->dsc)
|
||||
dsi_update_dsc_timing(msm_host, true, mode->hdisplay);
|
||||
dsi_update_dsc_timing(msm_host, true);
|
||||
|
||||
/* image data and 1 byte write_memory_start cmd */
|
||||
if (!msm_host->dsc)
|
||||
|
||||
@@ -74,17 +74,35 @@ static int dsi_mgr_setup_components(int id)
|
||||
int ret;
|
||||
|
||||
if (!IS_BONDED_DSI()) {
|
||||
/*
|
||||
* Set the usecase before calling msm_dsi_host_register(), which would
|
||||
* already program the PLL source mux based on a default usecase.
|
||||
*/
|
||||
msm_dsi_phy_set_usecase(msm_dsi->phy, MSM_DSI_PHY_STANDALONE);
|
||||
msm_dsi_host_set_phy_mode(msm_dsi->host, msm_dsi->phy);
|
||||
|
||||
ret = msm_dsi_host_register(msm_dsi->host);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
msm_dsi_phy_set_usecase(msm_dsi->phy, MSM_DSI_PHY_STANDALONE);
|
||||
msm_dsi_host_set_phy_mode(msm_dsi->host, msm_dsi->phy);
|
||||
} else if (other_dsi) {
|
||||
struct msm_dsi *master_link_dsi = IS_MASTER_DSI_LINK(id) ?
|
||||
msm_dsi : other_dsi;
|
||||
struct msm_dsi *slave_link_dsi = IS_MASTER_DSI_LINK(id) ?
|
||||
other_dsi : msm_dsi;
|
||||
|
||||
/*
|
||||
* PLL0 is to drive both DSI link clocks in bonded DSI mode.
|
||||
*
|
||||
* Set the usecase before calling msm_dsi_host_register(), which would
|
||||
* already program the PLL source mux based on a default usecase.
|
||||
*/
|
||||
msm_dsi_phy_set_usecase(clk_master_dsi->phy,
|
||||
MSM_DSI_PHY_MASTER);
|
||||
msm_dsi_phy_set_usecase(clk_slave_dsi->phy,
|
||||
MSM_DSI_PHY_SLAVE);
|
||||
msm_dsi_host_set_phy_mode(msm_dsi->host, msm_dsi->phy);
|
||||
msm_dsi_host_set_phy_mode(other_dsi->host, other_dsi->phy);
|
||||
|
||||
/* Register slave host first, so that slave DSI device
|
||||
* has a chance to probe, and do not block the master
|
||||
* DSI device's probe.
|
||||
@@ -98,14 +116,6 @@ static int dsi_mgr_setup_components(int id)
|
||||
ret = msm_dsi_host_register(master_link_dsi->host);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* PLL0 is to drive both 2 DSI link clocks in bonded DSI mode. */
|
||||
msm_dsi_phy_set_usecase(clk_master_dsi->phy,
|
||||
MSM_DSI_PHY_MASTER);
|
||||
msm_dsi_phy_set_usecase(clk_slave_dsi->phy,
|
||||
MSM_DSI_PHY_SLAVE);
|
||||
msm_dsi_host_set_phy_mode(msm_dsi->host, msm_dsi->phy);
|
||||
msm_dsi_host_set_phy_mode(other_dsi->host, other_dsi->phy);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -305,7 +305,7 @@ static void dsi_pll_commit(struct dsi_pll_7nm *pll, struct dsi_pll_config *confi
|
||||
writel(pll->phy->cphy_mode ? 0x00 : 0x10,
|
||||
base + REG_DSI_7nm_PHY_PLL_CMODE_1);
|
||||
writel(config->pll_clock_inverters,
|
||||
base + REG_DSI_7nm_PHY_PLL_CLOCK_INVERTERS);
|
||||
base + REG_DSI_7nm_PHY_PLL_CLOCK_INVERTERS_1);
|
||||
}
|
||||
|
||||
static int dsi_pll_7nm_vco_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||
|
||||
@@ -12,17 +12,6 @@
|
||||
#include <linux/math.h>
|
||||
#include <drm/display/drm_dsc_helper.h>
|
||||
|
||||
/**
|
||||
* msm_dsc_get_slices_per_intf() - calculate number of slices per interface
|
||||
* @dsc: Pointer to drm dsc config struct
|
||||
* @intf_width: interface width in pixels
|
||||
* Returns: Integer representing the number of slices for the given interface
|
||||
*/
|
||||
static inline u32 msm_dsc_get_slices_per_intf(const struct drm_dsc_config *dsc, u32 intf_width)
|
||||
{
|
||||
return DIV_ROUND_UP(intf_width, dsc->slice_width);
|
||||
}
|
||||
|
||||
/**
|
||||
* msm_dsc_get_bytes_per_line() - calculate bytes per line
|
||||
* @dsc: Pointer to drm dsc config struct
|
||||
|
||||
@@ -607,7 +607,7 @@ static int ili9882t_add(struct ili9882t *ili)
|
||||
|
||||
ili->enable_gpio = devm_gpiod_get(dev, "enable", GPIOD_OUT_LOW);
|
||||
if (IS_ERR(ili->enable_gpio)) {
|
||||
dev_err(dev, "cannot get reset-gpios %ld\n",
|
||||
dev_err(dev, "cannot get enable-gpios %ld\n",
|
||||
PTR_ERR(ili->enable_gpio));
|
||||
return PTR_ERR(ili->enable_gpio);
|
||||
}
|
||||
|
||||
@@ -102,9 +102,9 @@ struct panthor_fw_cs_output_iface {
|
||||
#define CS_STATUS_BLOCKED_REASON_SB_WAIT 1
|
||||
#define CS_STATUS_BLOCKED_REASON_PROGRESS_WAIT 2
|
||||
#define CS_STATUS_BLOCKED_REASON_SYNC_WAIT 3
|
||||
#define CS_STATUS_BLOCKED_REASON_DEFERRED 5
|
||||
#define CS_STATUS_BLOCKED_REASON_RES 6
|
||||
#define CS_STATUS_BLOCKED_REASON_FLUSH 7
|
||||
#define CS_STATUS_BLOCKED_REASON_DEFERRED 4
|
||||
#define CS_STATUS_BLOCKED_REASON_RESOURCE 5
|
||||
#define CS_STATUS_BLOCKED_REASON_FLUSH 6
|
||||
#define CS_STATUS_BLOCKED_REASON_MASK GENMASK(3, 0)
|
||||
u32 status_blocked_reason;
|
||||
u32 status_wait_sync_value_hi;
|
||||
|
||||
@@ -151,7 +151,6 @@ static const struct of_device_id ssd130x_of_match[] = {
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, ssd130x_of_match);
|
||||
|
||||
#if IS_MODULE(CONFIG_DRM_SSD130X_SPI)
|
||||
/*
|
||||
* The SPI core always reports a MODALIAS uevent of the form "spi:<dev>", even
|
||||
* if the device was registered via OF. This means that the module will not be
|
||||
@@ -160,7 +159,7 @@ MODULE_DEVICE_TABLE(of, ssd130x_of_match);
|
||||
* To workaround this issue, add a SPI device ID table. Even when this should
|
||||
* not be needed for this driver to match the registered SPI devices.
|
||||
*/
|
||||
static const struct spi_device_id ssd130x_spi_table[] = {
|
||||
static const struct spi_device_id ssd130x_spi_id[] = {
|
||||
/* ssd130x family */
|
||||
{ "sh1106", SH1106_ID },
|
||||
{ "ssd1305", SSD1305_ID },
|
||||
@@ -175,14 +174,14 @@ static const struct spi_device_id ssd130x_spi_table[] = {
|
||||
{ "ssd1331", SSD1331_ID },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(spi, ssd130x_spi_table);
|
||||
#endif
|
||||
MODULE_DEVICE_TABLE(spi, ssd130x_spi_id);
|
||||
|
||||
static struct spi_driver ssd130x_spi_driver = {
|
||||
.driver = {
|
||||
.name = DRIVER_NAME,
|
||||
.of_match_table = ssd130x_of_match,
|
||||
},
|
||||
.id_table = ssd130x_spi_id,
|
||||
.probe = ssd130x_spi_probe,
|
||||
.remove = ssd130x_spi_remove,
|
||||
.shutdown = ssd130x_spi_shutdown,
|
||||
|
||||
@@ -880,7 +880,7 @@ static int ssd132x_update_rect(struct ssd130x_device *ssd130x,
|
||||
u8 n1 = buf[i * width + j];
|
||||
u8 n2 = buf[i * width + j + 1];
|
||||
|
||||
data_array[array_idx++] = (n2 << 4) | n1;
|
||||
data_array[array_idx++] = (n2 & 0xf0) | (n1 >> 4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1037,7 +1037,7 @@ static int ssd132x_fb_blit_rect(struct drm_framebuffer *fb,
|
||||
struct drm_format_conv_state *fmtcnv_state)
|
||||
{
|
||||
struct ssd130x_device *ssd130x = drm_to_ssd130x(fb->dev);
|
||||
unsigned int dst_pitch = drm_rect_width(rect);
|
||||
unsigned int dst_pitch;
|
||||
struct iosys_map dst;
|
||||
int ret = 0;
|
||||
|
||||
@@ -1046,6 +1046,8 @@ static int ssd132x_fb_blit_rect(struct drm_framebuffer *fb,
|
||||
rect->x2 = min_t(unsigned int, round_up(rect->x2, SSD132X_SEGMENT_WIDTH),
|
||||
ssd130x->width);
|
||||
|
||||
dst_pitch = drm_rect_width(rect);
|
||||
|
||||
ret = drm_gem_fb_begin_cpu_access(fb, DMA_FROM_DEVICE);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -245,17 +245,19 @@ static int __init vkms_init(void)
|
||||
if (!config)
|
||||
return -ENOMEM;
|
||||
|
||||
default_config = config;
|
||||
|
||||
config->cursor = enable_cursor;
|
||||
config->writeback = enable_writeback;
|
||||
config->overlay = enable_overlay;
|
||||
|
||||
ret = vkms_create(config);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
kfree(config);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return ret;
|
||||
default_config = config;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void vkms_destroy(struct vkms_config *config)
|
||||
@@ -279,9 +281,10 @@ static void vkms_destroy(struct vkms_config *config)
|
||||
|
||||
static void __exit vkms_exit(void)
|
||||
{
|
||||
if (default_config->dev)
|
||||
vkms_destroy(default_config);
|
||||
if (!default_config)
|
||||
return;
|
||||
|
||||
vkms_destroy(default_config);
|
||||
kfree(default_config);
|
||||
}
|
||||
|
||||
|
||||
@@ -231,6 +231,8 @@ static int zynqmp_dpsub_probe(struct platform_device *pdev)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
dma_set_max_seg_size(&pdev->dev, DMA_BIT_MASK(32));
|
||||
|
||||
/* Try the reserved memory. Proceed if there's none. */
|
||||
of_reserved_mem_device_init(&pdev->dev);
|
||||
|
||||
|
||||
@@ -912,7 +912,9 @@ static enum fw_upload_err cc1352_prepare(struct fw_upload *fw_upload,
|
||||
cc1352_bootloader_reset(bg);
|
||||
WRITE_ONCE(bg->flashing_mode, false);
|
||||
msleep(200);
|
||||
gb_greybus_init(bg);
|
||||
if (gb_greybus_init(bg) < 0)
|
||||
return dev_err_probe(&bg->sd->dev, FW_UPLOAD_ERR_RW_ERROR,
|
||||
"Failed to initialize greybus");
|
||||
gb_beagleplay_start_svc(bg);
|
||||
return FW_UPLOAD_ERR_FW_INVALID;
|
||||
}
|
||||
|
||||
@@ -165,7 +165,6 @@ obj-$(CONFIG_USB_KBD) += usbhid/
|
||||
obj-$(CONFIG_I2C_HID_CORE) += i2c-hid/
|
||||
|
||||
obj-$(CONFIG_INTEL_ISH_HID) += intel-ish-hid/
|
||||
obj-$(INTEL_ISH_FIRMWARE_DOWNLOADER) += intel-ish-hid/
|
||||
|
||||
obj-$(CONFIG_AMD_SFH_HID) += amd-sfh-hid/
|
||||
|
||||
|
||||
@@ -269,7 +269,7 @@ catu_init_sg_table(struct device *catu_dev, int node,
|
||||
* Each table can address upto 1MB and we can have
|
||||
* CATU_PAGES_PER_SYSPAGE tables in a system page.
|
||||
*/
|
||||
nr_tpages = DIV_ROUND_UP(size, SZ_1M) / CATU_PAGES_PER_SYSPAGE;
|
||||
nr_tpages = DIV_ROUND_UP(size, CATU_PAGES_PER_SYSPAGE * SZ_1M);
|
||||
catu_table = tmc_alloc_sg_table(catu_dev, node, nr_tpages,
|
||||
size >> PAGE_SHIFT, pages);
|
||||
if (IS_ERR(catu_table))
|
||||
|
||||
@@ -1017,18 +1017,20 @@ static void coresight_remove_conns(struct coresight_device *csdev)
|
||||
}
|
||||
|
||||
/**
|
||||
* coresight_timeout - loop until a bit has changed to a specific register
|
||||
* state.
|
||||
* coresight_timeout_action - loop until a bit has changed to a specific register
|
||||
* state, with a callback after every trial.
|
||||
* @csa: coresight device access for the device
|
||||
* @offset: Offset of the register from the base of the device.
|
||||
* @position: the position of the bit of interest.
|
||||
* @value: the value the bit should have.
|
||||
* @cb: Call back after each trial.
|
||||
*
|
||||
* Return: 0 as soon as the bit has taken the desired state or -EAGAIN if
|
||||
* TIMEOUT_US has elapsed, which ever happens first.
|
||||
*/
|
||||
int coresight_timeout(struct csdev_access *csa, u32 offset,
|
||||
int position, int value)
|
||||
int coresight_timeout_action(struct csdev_access *csa, u32 offset,
|
||||
int position, int value,
|
||||
coresight_timeout_cb_t cb)
|
||||
{
|
||||
int i;
|
||||
u32 val;
|
||||
@@ -1044,7 +1046,8 @@ int coresight_timeout(struct csdev_access *csa, u32 offset,
|
||||
if (!(val & BIT(position)))
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (cb)
|
||||
cb(csa, offset, position, value);
|
||||
/*
|
||||
* Delay is arbitrary - the specification doesn't say how long
|
||||
* we are expected to wait. Extra check required to make sure
|
||||
@@ -1056,6 +1059,13 @@ int coresight_timeout(struct csdev_access *csa, u32 offset,
|
||||
|
||||
return -EAGAIN;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(coresight_timeout_action);
|
||||
|
||||
int coresight_timeout(struct csdev_access *csa, u32 offset,
|
||||
int position, int value)
|
||||
{
|
||||
return coresight_timeout_action(csa, offset, position, value, NULL);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(coresight_timeout);
|
||||
|
||||
u32 coresight_relaxed_read32(struct coresight_device *csdev, u32 offset)
|
||||
|
||||
@@ -399,6 +399,29 @@ static void etm4_check_arch_features(struct etmv4_drvdata *drvdata,
|
||||
}
|
||||
#endif /* CONFIG_ETM4X_IMPDEF_FEATURE */
|
||||
|
||||
static void etm4x_sys_ins_barrier(struct csdev_access *csa, u32 offset, int pos, int val)
|
||||
{
|
||||
if (!csa->io_mem)
|
||||
isb();
|
||||
}
|
||||
|
||||
/*
|
||||
* etm4x_wait_status: Poll for TRCSTATR.<pos> == <val>. While using system
|
||||
* instruction to access the trace unit, each access must be separated by a
|
||||
* synchronization barrier. See ARM IHI0064H.b section "4.3.7 Synchronization of
|
||||
* register updates", for system instructions section, in "Notes":
|
||||
*
|
||||
* "In particular, whenever disabling or enabling the trace unit, a poll of
|
||||
* TRCSTATR needs explicit synchronization between each read of TRCSTATR"
|
||||
*/
|
||||
static int etm4x_wait_status(struct csdev_access *csa, int pos, int val)
|
||||
{
|
||||
if (!csa->io_mem)
|
||||
return coresight_timeout_action(csa, TRCSTATR, pos, val,
|
||||
etm4x_sys_ins_barrier);
|
||||
return coresight_timeout(csa, TRCSTATR, pos, val);
|
||||
}
|
||||
|
||||
static int etm4_enable_hw(struct etmv4_drvdata *drvdata)
|
||||
{
|
||||
int i, rc;
|
||||
@@ -430,7 +453,7 @@ static int etm4_enable_hw(struct etmv4_drvdata *drvdata)
|
||||
isb();
|
||||
|
||||
/* wait for TRCSTATR.IDLE to go up */
|
||||
if (coresight_timeout(csa, TRCSTATR, TRCSTATR_IDLE_BIT, 1))
|
||||
if (etm4x_wait_status(csa, TRCSTATR_IDLE_BIT, 1))
|
||||
dev_err(etm_dev,
|
||||
"timeout while waiting for Idle Trace Status\n");
|
||||
if (drvdata->nr_pe)
|
||||
@@ -523,7 +546,7 @@ static int etm4_enable_hw(struct etmv4_drvdata *drvdata)
|
||||
isb();
|
||||
|
||||
/* wait for TRCSTATR.IDLE to go back down to '0' */
|
||||
if (coresight_timeout(csa, TRCSTATR, TRCSTATR_IDLE_BIT, 0))
|
||||
if (etm4x_wait_status(csa, TRCSTATR_IDLE_BIT, 0))
|
||||
dev_err(etm_dev,
|
||||
"timeout while waiting for Idle Trace Status\n");
|
||||
|
||||
@@ -906,10 +929,25 @@ static void etm4_disable_hw(void *info)
|
||||
tsb_csync();
|
||||
etm4x_relaxed_write32(csa, control, TRCPRGCTLR);
|
||||
|
||||
/*
|
||||
* As recommended by section 4.3.7 ("Synchronization when using system
|
||||
* instructions to progrom the trace unit") of ARM IHI 0064H.b, the
|
||||
* self-hosted trace analyzer must perform a Context synchronization
|
||||
* event between writing to the TRCPRGCTLR and reading the TRCSTATR.
|
||||
*/
|
||||
if (!csa->io_mem)
|
||||
isb();
|
||||
|
||||
/* wait for TRCSTATR.PMSTABLE to go to '1' */
|
||||
if (coresight_timeout(csa, TRCSTATR, TRCSTATR_PMSTABLE_BIT, 1))
|
||||
if (etm4x_wait_status(csa, TRCSTATR_PMSTABLE_BIT, 1))
|
||||
dev_err(etm_dev,
|
||||
"timeout while waiting for PM stable Trace Status\n");
|
||||
/*
|
||||
* As recommended by section 4.3.7 (Synchronization of register updates)
|
||||
* of ARM IHI 0064H.b.
|
||||
*/
|
||||
isb();
|
||||
|
||||
/* read the status of the single shot comparators */
|
||||
for (i = 0; i < drvdata->nr_ss_cmp; i++) {
|
||||
config->ss_status[i] =
|
||||
@@ -1711,7 +1749,7 @@ static int __etm4_cpu_save(struct etmv4_drvdata *drvdata)
|
||||
etm4_os_lock(drvdata);
|
||||
|
||||
/* wait for TRCSTATR.PMSTABLE to go up */
|
||||
if (coresight_timeout(csa, TRCSTATR, TRCSTATR_PMSTABLE_BIT, 1)) {
|
||||
if (etm4x_wait_status(csa, TRCSTATR_PMSTABLE_BIT, 1)) {
|
||||
dev_err(etm_dev,
|
||||
"timeout while waiting for PM Stable Status\n");
|
||||
etm4_os_unlock(drvdata);
|
||||
@@ -1802,7 +1840,7 @@ static int __etm4_cpu_save(struct etmv4_drvdata *drvdata)
|
||||
state->trcpdcr = etm4x_read32(csa, TRCPDCR);
|
||||
|
||||
/* wait for TRCSTATR.IDLE to go up */
|
||||
if (coresight_timeout(csa, TRCSTATR, TRCSTATR_IDLE_BIT, 1)) {
|
||||
if (etm4x_wait_status(csa, TRCSTATR_PMSTABLE_BIT, 1)) {
|
||||
dev_err(etm_dev,
|
||||
"timeout while waiting for Idle Trace Status\n");
|
||||
etm4_os_unlock(drvdata);
|
||||
|
||||
@@ -990,7 +990,7 @@ static int svc_i3c_update_ibirules(struct svc_i3c_master *master)
|
||||
|
||||
/* Create the IBIRULES register for both cases */
|
||||
i3c_bus_for_each_i3cdev(&master->base.bus, dev) {
|
||||
if (I3C_BCR_DEVICE_ROLE(dev->info.bcr) == I3C_BCR_I3C_MASTER)
|
||||
if (!(dev->info.bcr & I3C_BCR_IBI_REQ_CAP))
|
||||
continue;
|
||||
|
||||
if (dev->info.bcr & I3C_BCR_IBI_PAYLOAD) {
|
||||
|
||||
@@ -711,7 +711,7 @@ static int mma8452_write_raw(struct iio_dev *indio_dev,
|
||||
int val, int val2, long mask)
|
||||
{
|
||||
struct mma8452_data *data = iio_priv(indio_dev);
|
||||
int i, ret;
|
||||
int i, j, ret;
|
||||
|
||||
ret = iio_device_claim_direct_mode(indio_dev);
|
||||
if (ret)
|
||||
@@ -771,14 +771,18 @@ static int mma8452_write_raw(struct iio_dev *indio_dev,
|
||||
break;
|
||||
|
||||
case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
|
||||
ret = mma8452_get_odr_index(data);
|
||||
j = mma8452_get_odr_index(data);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(mma8452_os_ratio); i++) {
|
||||
if (mma8452_os_ratio[i][ret] == val) {
|
||||
if (mma8452_os_ratio[i][j] == val) {
|
||||
ret = mma8452_set_power_mode(data, i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (i == ARRAY_SIZE(mma8452_os_ratio)) {
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
|
||||
+16
-12
@@ -593,23 +593,25 @@ static int msa311_read_raw_data(struct iio_dev *indio_dev,
|
||||
__le16 axis;
|
||||
int err;
|
||||
|
||||
err = pm_runtime_resume_and_get(dev);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = iio_device_claim_direct_mode(indio_dev);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = pm_runtime_resume_and_get(dev);
|
||||
if (err) {
|
||||
iio_device_release_direct_mode(indio_dev);
|
||||
return err;
|
||||
}
|
||||
|
||||
mutex_lock(&msa311->lock);
|
||||
err = msa311_get_axis(msa311, chan, &axis);
|
||||
mutex_unlock(&msa311->lock);
|
||||
|
||||
iio_device_release_direct_mode(indio_dev);
|
||||
|
||||
pm_runtime_mark_last_busy(dev);
|
||||
pm_runtime_put_autosuspend(dev);
|
||||
|
||||
iio_device_release_direct_mode(indio_dev);
|
||||
|
||||
if (err) {
|
||||
dev_err(dev, "can't get axis %s (%pe)\n",
|
||||
chan->datasheet_name, ERR_PTR(err));
|
||||
@@ -755,10 +757,6 @@ static int msa311_write_samp_freq(struct iio_dev *indio_dev, int val, int val2)
|
||||
unsigned int odr;
|
||||
int err;
|
||||
|
||||
err = pm_runtime_resume_and_get(dev);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
/*
|
||||
* Sampling frequency changing is prohibited when buffer mode is
|
||||
* enabled, because sometimes MSA311 chip returns outliers during
|
||||
@@ -768,6 +766,12 @@ static int msa311_write_samp_freq(struct iio_dev *indio_dev, int val, int val2)
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = pm_runtime_resume_and_get(dev);
|
||||
if (err) {
|
||||
iio_device_release_direct_mode(indio_dev);
|
||||
return err;
|
||||
}
|
||||
|
||||
err = -EINVAL;
|
||||
for (odr = 0; odr < ARRAY_SIZE(msa311_odr_table); odr++)
|
||||
if (val == msa311_odr_table[odr].integral &&
|
||||
@@ -778,11 +782,11 @@ static int msa311_write_samp_freq(struct iio_dev *indio_dev, int val, int val2)
|
||||
break;
|
||||
}
|
||||
|
||||
iio_device_release_direct_mode(indio_dev);
|
||||
|
||||
pm_runtime_mark_last_busy(dev);
|
||||
pm_runtime_put_autosuspend(dev);
|
||||
|
||||
iio_device_release_direct_mode(indio_dev);
|
||||
|
||||
if (err)
|
||||
dev_err(dev, "can't update frequency (%pe)\n", ERR_PTR(err));
|
||||
|
||||
|
||||
@@ -223,6 +223,10 @@ enum ad4130_pin_function {
|
||||
AD4130_PIN_FN_VBIAS = BIT(3),
|
||||
};
|
||||
|
||||
/*
|
||||
* If you make adaptations in this struct, you most likely also have to adapt
|
||||
* ad4130_setup_info_eq(), too.
|
||||
*/
|
||||
struct ad4130_setup_info {
|
||||
unsigned int iout0_val;
|
||||
unsigned int iout1_val;
|
||||
@@ -591,6 +595,40 @@ static irqreturn_t ad4130_irq_handler(int irq, void *private)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static bool ad4130_setup_info_eq(struct ad4130_setup_info *a,
|
||||
struct ad4130_setup_info *b)
|
||||
{
|
||||
/*
|
||||
* This is just to make sure that the comparison is adapted after
|
||||
* struct ad4130_setup_info was changed.
|
||||
*/
|
||||
static_assert(sizeof(*a) ==
|
||||
sizeof(struct {
|
||||
unsigned int iout0_val;
|
||||
unsigned int iout1_val;
|
||||
unsigned int burnout;
|
||||
unsigned int pga;
|
||||
unsigned int fs;
|
||||
u32 ref_sel;
|
||||
enum ad4130_filter_mode filter_mode;
|
||||
bool ref_bufp;
|
||||
bool ref_bufm;
|
||||
}));
|
||||
|
||||
if (a->iout0_val != b->iout0_val ||
|
||||
a->iout1_val != b->iout1_val ||
|
||||
a->burnout != b->burnout ||
|
||||
a->pga != b->pga ||
|
||||
a->fs != b->fs ||
|
||||
a->ref_sel != b->ref_sel ||
|
||||
a->filter_mode != b->filter_mode ||
|
||||
a->ref_bufp != b->ref_bufp ||
|
||||
a->ref_bufm != b->ref_bufm)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static int ad4130_find_slot(struct ad4130_state *st,
|
||||
struct ad4130_setup_info *target_setup_info,
|
||||
unsigned int *slot, bool *overwrite)
|
||||
@@ -604,8 +642,7 @@ static int ad4130_find_slot(struct ad4130_state *st,
|
||||
struct ad4130_slot_info *slot_info = &st->slots_info[i];
|
||||
|
||||
/* Immediately accept a matching setup info. */
|
||||
if (!memcmp(target_setup_info, &slot_info->setup,
|
||||
sizeof(*target_setup_info))) {
|
||||
if (ad4130_setup_info_eq(target_setup_info, &slot_info->setup)) {
|
||||
*slot = i;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -147,7 +147,11 @@ struct ad7124_chip_info {
|
||||
struct ad7124_channel_config {
|
||||
bool live;
|
||||
unsigned int cfg_slot;
|
||||
/* Following fields are used to compare equality. */
|
||||
/*
|
||||
* Following fields are used to compare for equality. If you
|
||||
* make adaptations in it, you most likely also have to adapt
|
||||
* ad7124_find_similar_live_cfg(), too.
|
||||
*/
|
||||
struct_group(config_props,
|
||||
enum ad7124_ref_sel refsel;
|
||||
bool bipolar;
|
||||
@@ -334,15 +338,38 @@ static struct ad7124_channel_config *ad7124_find_similar_live_cfg(struct ad7124_
|
||||
struct ad7124_channel_config *cfg)
|
||||
{
|
||||
struct ad7124_channel_config *cfg_aux;
|
||||
ptrdiff_t cmp_size;
|
||||
int i;
|
||||
|
||||
cmp_size = sizeof_field(struct ad7124_channel_config, config_props);
|
||||
/*
|
||||
* This is just to make sure that the comparison is adapted after
|
||||
* struct ad7124_channel_config was changed.
|
||||
*/
|
||||
static_assert(sizeof_field(struct ad7124_channel_config, config_props) ==
|
||||
sizeof(struct {
|
||||
enum ad7124_ref_sel refsel;
|
||||
bool bipolar;
|
||||
bool buf_positive;
|
||||
bool buf_negative;
|
||||
unsigned int vref_mv;
|
||||
unsigned int pga_bits;
|
||||
unsigned int odr;
|
||||
unsigned int odr_sel_bits;
|
||||
unsigned int filter_type;
|
||||
}));
|
||||
|
||||
for (i = 0; i < st->num_channels; i++) {
|
||||
cfg_aux = &st->channels[i].cfg;
|
||||
|
||||
if (cfg_aux->live &&
|
||||
!memcmp(&cfg->config_props, &cfg_aux->config_props, cmp_size))
|
||||
cfg->refsel == cfg_aux->refsel &&
|
||||
cfg->bipolar == cfg_aux->bipolar &&
|
||||
cfg->buf_positive == cfg_aux->buf_positive &&
|
||||
cfg->buf_negative == cfg_aux->buf_negative &&
|
||||
cfg->vref_mv == cfg_aux->vref_mv &&
|
||||
cfg->pga_bits == cfg_aux->pga_bits &&
|
||||
cfg->odr == cfg_aux->odr &&
|
||||
cfg->odr_sel_bits == cfg_aux->odr_sel_bits &&
|
||||
cfg->filter_type == cfg_aux->filter_type)
|
||||
return cfg_aux;
|
||||
}
|
||||
|
||||
|
||||
@@ -181,7 +181,11 @@ struct ad7173_channel_config {
|
||||
u8 cfg_slot;
|
||||
bool live;
|
||||
|
||||
/* Following fields are used to compare equality. */
|
||||
/*
|
||||
* Following fields are used to compare equality. If you
|
||||
* make adaptations in it, you most likely also have to adapt
|
||||
* ad7173_find_live_config(), too.
|
||||
*/
|
||||
struct_group(config_props,
|
||||
bool bipolar;
|
||||
bool input_buf;
|
||||
@@ -582,15 +586,28 @@ static struct ad7173_channel_config *
|
||||
ad7173_find_live_config(struct ad7173_state *st, struct ad7173_channel_config *cfg)
|
||||
{
|
||||
struct ad7173_channel_config *cfg_aux;
|
||||
ptrdiff_t cmp_size;
|
||||
int i;
|
||||
|
||||
cmp_size = sizeof_field(struct ad7173_channel_config, config_props);
|
||||
/*
|
||||
* This is just to make sure that the comparison is adapted after
|
||||
* struct ad7173_channel_config was changed.
|
||||
*/
|
||||
static_assert(sizeof_field(struct ad7173_channel_config, config_props) ==
|
||||
sizeof(struct {
|
||||
bool bipolar;
|
||||
bool input_buf;
|
||||
u8 odr;
|
||||
u8 ref_sel;
|
||||
}));
|
||||
|
||||
for (i = 0; i < st->num_channels; i++) {
|
||||
cfg_aux = &st->channels[i].cfg;
|
||||
|
||||
if (cfg_aux->live &&
|
||||
!memcmp(&cfg->config_props, &cfg_aux->config_props, cmp_size))
|
||||
cfg->bipolar == cfg_aux->bipolar &&
|
||||
cfg->input_buf == cfg_aux->input_buf &&
|
||||
cfg->odr == cfg_aux->odr &&
|
||||
cfg->ref_sel == cfg_aux->ref_sel)
|
||||
return cfg_aux;
|
||||
}
|
||||
return NULL;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user