Merge 11c7fa11fa ("net: stmmac: dwmac-loongson: Set correct {tx,rx}_fifo_size") into android16-6.12-lts
Steps on the way to 6.12.31 Resolves merge conflicts in: kernel/sched/fair.c Change-Id: I545f90ce44822f1a0f940be224258533b6581077 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -103,4 +103,4 @@ Some helpers are provided in order to set/get modem control lines via GPIO.
|
||||
.. kernel-doc:: drivers/tty/serial/serial_mctrl_gpio.c
|
||||
:identifiers: mctrl_gpio_init mctrl_gpio_free mctrl_gpio_to_gpiod
|
||||
mctrl_gpio_set mctrl_gpio_get mctrl_gpio_enable_ms
|
||||
mctrl_gpio_disable_ms
|
||||
mctrl_gpio_disable_ms_sync mctrl_gpio_disable_ms_no_sync
|
||||
|
||||
@@ -91,4 +91,20 @@ void prepare_ftrace_return(unsigned long *parent_ra_addr, unsigned long self_ra,
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* CONFIG_FUNCTION_TRACER */
|
||||
|
||||
#ifdef CONFIG_FTRACE_SYSCALLS
|
||||
#ifndef __ASSEMBLY__
|
||||
/*
|
||||
* Some syscall entry functions on mips start with "__sys_" (fork and clone,
|
||||
* for instance). We should also match the sys_ variant with those.
|
||||
*/
|
||||
#define ARCH_HAS_SYSCALL_MATCH_SYM_NAME
|
||||
static inline bool arch_syscall_match_sym_name(const char *sym,
|
||||
const char *name)
|
||||
{
|
||||
return !strcmp(sym, name) ||
|
||||
(!strncmp(sym, "__sys_", 6) && !strcmp(sym + 6, name + 4));
|
||||
}
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* CONFIG_FTRACE_SYSCALLS */
|
||||
#endif /* _ASM_MIPS_FTRACE_H */
|
||||
|
||||
@@ -57,10 +57,7 @@ static DEFINE_PER_CPU_ALIGNED(u32*, ready_count);
|
||||
/* Indicates online CPUs coupled with the current CPU */
|
||||
static DEFINE_PER_CPU_ALIGNED(cpumask_t, online_coupled);
|
||||
|
||||
/*
|
||||
* Used to synchronize entry to deep idle states. Actually per-core rather
|
||||
* than per-CPU.
|
||||
*/
|
||||
/* Used to synchronize entry to deep idle states */
|
||||
static DEFINE_PER_CPU_ALIGNED(atomic_t, pm_barrier);
|
||||
|
||||
/* Saved CPU state across the CPS_PM_POWER_GATED state */
|
||||
@@ -112,9 +109,10 @@ int cps_pm_enter_state(enum cps_pm_state state)
|
||||
cps_nc_entry_fn entry;
|
||||
struct core_boot_config *core_cfg;
|
||||
struct vpe_boot_config *vpe_cfg;
|
||||
atomic_t *barrier;
|
||||
|
||||
/* Check that there is an entry function for this state */
|
||||
entry = per_cpu(nc_asm_enter, core)[state];
|
||||
entry = per_cpu(nc_asm_enter, cpu)[state];
|
||||
if (!entry)
|
||||
return -EINVAL;
|
||||
|
||||
@@ -150,7 +148,7 @@ int cps_pm_enter_state(enum cps_pm_state state)
|
||||
smp_mb__after_atomic();
|
||||
|
||||
/* Create a non-coherent mapping of the core ready_count */
|
||||
core_ready_count = per_cpu(ready_count, core);
|
||||
core_ready_count = per_cpu(ready_count, cpu);
|
||||
nc_addr = kmap_noncoherent(virt_to_page(core_ready_count),
|
||||
(unsigned long)core_ready_count);
|
||||
nc_addr += ((unsigned long)core_ready_count & ~PAGE_MASK);
|
||||
@@ -158,7 +156,8 @@ int cps_pm_enter_state(enum cps_pm_state state)
|
||||
|
||||
/* Ensure ready_count is zero-initialised before the assembly runs */
|
||||
WRITE_ONCE(*nc_core_ready_count, 0);
|
||||
coupled_barrier(&per_cpu(pm_barrier, core), online);
|
||||
barrier = &per_cpu(pm_barrier, cpumask_first(&cpu_sibling_map[cpu]));
|
||||
coupled_barrier(barrier, online);
|
||||
|
||||
/* Run the generated entry code */
|
||||
left = entry(online, nc_core_ready_count);
|
||||
@@ -629,12 +628,14 @@ out_err:
|
||||
|
||||
static int cps_pm_online_cpu(unsigned int cpu)
|
||||
{
|
||||
enum cps_pm_state state;
|
||||
unsigned core = cpu_core(&cpu_data[cpu]);
|
||||
unsigned int sibling, core;
|
||||
void *entry_fn, *core_rc;
|
||||
enum cps_pm_state state;
|
||||
|
||||
core = cpu_core(&cpu_data[cpu]);
|
||||
|
||||
for (state = CPS_PM_NC_WAIT; state < CPS_PM_STATE_COUNT; state++) {
|
||||
if (per_cpu(nc_asm_enter, core)[state])
|
||||
if (per_cpu(nc_asm_enter, cpu)[state])
|
||||
continue;
|
||||
if (!test_bit(state, state_support))
|
||||
continue;
|
||||
@@ -646,16 +647,19 @@ static int cps_pm_online_cpu(unsigned int cpu)
|
||||
clear_bit(state, state_support);
|
||||
}
|
||||
|
||||
per_cpu(nc_asm_enter, core)[state] = entry_fn;
|
||||
for_each_cpu(sibling, &cpu_sibling_map[cpu])
|
||||
per_cpu(nc_asm_enter, sibling)[state] = entry_fn;
|
||||
}
|
||||
|
||||
if (!per_cpu(ready_count, core)) {
|
||||
if (!per_cpu(ready_count, cpu)) {
|
||||
core_rc = kmalloc(sizeof(u32), GFP_KERNEL);
|
||||
if (!core_rc) {
|
||||
pr_err("Failed allocate core %u ready_count\n", core);
|
||||
return -ENOMEM;
|
||||
}
|
||||
per_cpu(ready_count, core) = core_rc;
|
||||
|
||||
for_each_cpu(sibling, &cpu_sibling_map[cpu])
|
||||
per_cpu(ready_count, sibling) = core_rc;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -22,8 +22,9 @@
|
||||
#define SECOND_BYTE_OPCODE_UD2 0x0b
|
||||
|
||||
#define BUG_NONE 0xffff
|
||||
#define BUG_UD1 0xfffe
|
||||
#define BUG_UD2 0xfffd
|
||||
#define BUG_UD2 0xfffe
|
||||
#define BUG_UD1 0xfffd
|
||||
#define BUG_UD1_UBSAN 0xfffc
|
||||
|
||||
#ifdef CONFIG_GENERIC_BUG
|
||||
|
||||
|
||||
@@ -126,6 +126,17 @@ static inline int cfi_get_offset(void)
|
||||
|
||||
extern u32 cfi_get_func_hash(void *func);
|
||||
|
||||
#ifdef CONFIG_FINEIBT
|
||||
extern bool decode_fineibt_insn(struct pt_regs *regs, unsigned long *target, u32 *type);
|
||||
#else
|
||||
static inline bool
|
||||
decode_fineibt_insn(struct pt_regs *regs, unsigned long *target, u32 *type)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#else
|
||||
static inline enum bug_trap_type handle_cfi_failure(struct pt_regs *regs)
|
||||
{
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
_ASM_PTR fname "\n\t" \
|
||||
".popsection\n\t"
|
||||
|
||||
static inline __attribute_const__ u32 gen_endbr(void)
|
||||
static __always_inline __attribute_const__ u32 gen_endbr(void)
|
||||
{
|
||||
u32 endbr;
|
||||
|
||||
@@ -56,7 +56,7 @@ static inline __attribute_const__ u32 gen_endbr(void)
|
||||
return endbr;
|
||||
}
|
||||
|
||||
static inline __attribute_const__ u32 gen_endbr_poison(void)
|
||||
static __always_inline __attribute_const__ u32 gen_endbr_poison(void)
|
||||
{
|
||||
/*
|
||||
* 4 byte NOP that isn't NOP4 (in fact it is OSP NOP3), such that it
|
||||
|
||||
@@ -349,9 +349,9 @@ do { \
|
||||
\
|
||||
asm qual (ALTERNATIVE("call this_cpu_cmpxchg8b_emu", \
|
||||
"cmpxchg8b " __percpu_arg([var]), X86_FEATURE_CX8) \
|
||||
: [var] "+m" (__my_cpu_var(_var)), \
|
||||
"+a" (old__.low), \
|
||||
"+d" (old__.high) \
|
||||
: ALT_OUTPUT_SP([var] "+m" (__my_cpu_var(_var)), \
|
||||
"+a" (old__.low), \
|
||||
"+d" (old__.high)) \
|
||||
: "b" (new__.low), \
|
||||
"c" (new__.high), \
|
||||
"S" (&(_var)) \
|
||||
@@ -380,10 +380,10 @@ do { \
|
||||
asm qual (ALTERNATIVE("call this_cpu_cmpxchg8b_emu", \
|
||||
"cmpxchg8b " __percpu_arg([var]), X86_FEATURE_CX8) \
|
||||
CC_SET(z) \
|
||||
: CC_OUT(z) (success), \
|
||||
[var] "+m" (__my_cpu_var(_var)), \
|
||||
"+a" (old__.low), \
|
||||
"+d" (old__.high) \
|
||||
: ALT_OUTPUT_SP(CC_OUT(z) (success), \
|
||||
[var] "+m" (__my_cpu_var(_var)), \
|
||||
"+a" (old__.low), \
|
||||
"+d" (old__.high)) \
|
||||
: "b" (new__.low), \
|
||||
"c" (new__.high), \
|
||||
"S" (&(_var)) \
|
||||
@@ -420,9 +420,9 @@ do { \
|
||||
\
|
||||
asm qual (ALTERNATIVE("call this_cpu_cmpxchg16b_emu", \
|
||||
"cmpxchg16b " __percpu_arg([var]), X86_FEATURE_CX16) \
|
||||
: [var] "+m" (__my_cpu_var(_var)), \
|
||||
"+a" (old__.low), \
|
||||
"+d" (old__.high) \
|
||||
: ALT_OUTPUT_SP([var] "+m" (__my_cpu_var(_var)), \
|
||||
"+a" (old__.low), \
|
||||
"+d" (old__.high)) \
|
||||
: "b" (new__.low), \
|
||||
"c" (new__.high), \
|
||||
"S" (&(_var)) \
|
||||
@@ -451,10 +451,10 @@ do { \
|
||||
asm qual (ALTERNATIVE("call this_cpu_cmpxchg16b_emu", \
|
||||
"cmpxchg16b " __percpu_arg([var]), X86_FEATURE_CX16) \
|
||||
CC_SET(z) \
|
||||
: CC_OUT(z) (success), \
|
||||
[var] "+m" (__my_cpu_var(_var)), \
|
||||
"+a" (old__.low), \
|
||||
"+d" (old__.high) \
|
||||
: ALT_OUTPUT_SP(CC_OUT(z) (success), \
|
||||
[var] "+m" (__my_cpu_var(_var)), \
|
||||
"+a" (old__.low), \
|
||||
"+d" (old__.high)) \
|
||||
: "b" (new__.low), \
|
||||
"c" (new__.high), \
|
||||
"S" (&(_var)) \
|
||||
|
||||
@@ -1225,6 +1225,7 @@ asm( ".pushsection .rodata \n"
|
||||
" endbr64 \n"
|
||||
" subl $0x12345678, %r10d \n"
|
||||
" je fineibt_preamble_end \n"
|
||||
"fineibt_preamble_ud2: \n"
|
||||
" ud2 \n"
|
||||
" nop \n"
|
||||
"fineibt_preamble_end: \n"
|
||||
@@ -1232,9 +1233,11 @@ asm( ".pushsection .rodata \n"
|
||||
);
|
||||
|
||||
extern u8 fineibt_preamble_start[];
|
||||
extern u8 fineibt_preamble_ud2[];
|
||||
extern u8 fineibt_preamble_end[];
|
||||
|
||||
#define fineibt_preamble_size (fineibt_preamble_end - fineibt_preamble_start)
|
||||
#define fineibt_preamble_ud2 (fineibt_preamble_ud2 - fineibt_preamble_start)
|
||||
#define fineibt_preamble_hash 7
|
||||
|
||||
asm( ".pushsection .rodata \n"
|
||||
@@ -1539,6 +1542,33 @@ static void poison_cfi(void *addr)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* regs->ip points to a UD2 instruction, return true and fill out target and
|
||||
* type when this UD2 is from a FineIBT preamble.
|
||||
*
|
||||
* We check the preamble by checking for the ENDBR instruction relative to the
|
||||
* UD2 instruction.
|
||||
*/
|
||||
bool decode_fineibt_insn(struct pt_regs *regs, unsigned long *target, u32 *type)
|
||||
{
|
||||
unsigned long addr = regs->ip - fineibt_preamble_ud2;
|
||||
u32 endbr, hash;
|
||||
|
||||
__get_kernel_nofault(&endbr, addr, u32, Efault);
|
||||
if (endbr != gen_endbr())
|
||||
return false;
|
||||
|
||||
*target = addr + fineibt_preamble_size;
|
||||
|
||||
__get_kernel_nofault(&hash, addr + fineibt_preamble_hash, u32, Efault);
|
||||
*type = (u32)regs->r10 + hash;
|
||||
|
||||
return true;
|
||||
|
||||
Efault:
|
||||
return false;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static void __apply_fineibt(s32 *start_retpoline, s32 *end_retpoline,
|
||||
|
||||
@@ -70,11 +70,25 @@ enum bug_trap_type handle_cfi_failure(struct pt_regs *regs)
|
||||
unsigned long target;
|
||||
u32 type;
|
||||
|
||||
if (!is_cfi_trap(regs->ip))
|
||||
return BUG_TRAP_TYPE_NONE;
|
||||
switch (cfi_mode) {
|
||||
case CFI_KCFI:
|
||||
if (!is_cfi_trap(regs->ip))
|
||||
return BUG_TRAP_TYPE_NONE;
|
||||
|
||||
if (!decode_cfi_insn(regs, &target, &type))
|
||||
return report_cfi_failure_noaddr(regs, regs->ip);
|
||||
if (!decode_cfi_insn(regs, &target, &type))
|
||||
return report_cfi_failure_noaddr(regs, regs->ip);
|
||||
|
||||
break;
|
||||
|
||||
case CFI_FINEIBT:
|
||||
if (!decode_fineibt_insn(regs, &target, &type))
|
||||
return BUG_TRAP_TYPE_NONE;
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
return BUG_TRAP_TYPE_NONE;
|
||||
}
|
||||
|
||||
return report_cfi_failure(regs, regs->ip, &target, type);
|
||||
}
|
||||
|
||||
@@ -94,10 +94,17 @@ __always_inline int is_valid_bugaddr(unsigned long addr)
|
||||
|
||||
/*
|
||||
* Check for UD1 or UD2, accounting for Address Size Override Prefixes.
|
||||
* If it's a UD1, get the ModRM byte to pass along to UBSan.
|
||||
* If it's a UD1, further decode to determine its use:
|
||||
*
|
||||
* UBSan{0}: 67 0f b9 00 ud1 (%eax),%eax
|
||||
* UBSan{10}: 67 0f b9 40 10 ud1 0x10(%eax),%eax
|
||||
* static_call: 0f b9 cc ud1 %esp,%ecx
|
||||
*
|
||||
* Notably UBSAN uses EAX, static_call uses ECX.
|
||||
*/
|
||||
__always_inline int decode_bug(unsigned long addr, u32 *imm)
|
||||
__always_inline int decode_bug(unsigned long addr, s32 *imm, int *len)
|
||||
{
|
||||
unsigned long start = addr;
|
||||
u8 v;
|
||||
|
||||
if (addr < TASK_SIZE_MAX)
|
||||
@@ -110,24 +117,42 @@ __always_inline int decode_bug(unsigned long addr, u32 *imm)
|
||||
return BUG_NONE;
|
||||
|
||||
v = *(u8 *)(addr++);
|
||||
if (v == SECOND_BYTE_OPCODE_UD2)
|
||||
if (v == SECOND_BYTE_OPCODE_UD2) {
|
||||
*len = addr - start;
|
||||
return BUG_UD2;
|
||||
}
|
||||
|
||||
if (!IS_ENABLED(CONFIG_UBSAN_TRAP) || v != SECOND_BYTE_OPCODE_UD1)
|
||||
if (v != SECOND_BYTE_OPCODE_UD1)
|
||||
return BUG_NONE;
|
||||
|
||||
/* Retrieve the immediate (type value) for the UBSAN UD1 */
|
||||
v = *(u8 *)(addr++);
|
||||
if (X86_MODRM_RM(v) == 4)
|
||||
addr++;
|
||||
|
||||
*imm = 0;
|
||||
if (X86_MODRM_MOD(v) == 1)
|
||||
*imm = *(u8 *)addr;
|
||||
else if (X86_MODRM_MOD(v) == 2)
|
||||
*imm = *(u32 *)addr;
|
||||
else
|
||||
WARN_ONCE(1, "Unexpected MODRM_MOD: %u\n", X86_MODRM_MOD(v));
|
||||
v = *(u8 *)(addr++); /* ModRM */
|
||||
|
||||
if (X86_MODRM_MOD(v) != 3 && X86_MODRM_RM(v) == 4)
|
||||
addr++; /* SIB */
|
||||
|
||||
/* Decode immediate, if present */
|
||||
switch (X86_MODRM_MOD(v)) {
|
||||
case 0: if (X86_MODRM_RM(v) == 5)
|
||||
addr += 4; /* RIP + disp32 */
|
||||
break;
|
||||
|
||||
case 1: *imm = *(s8 *)addr;
|
||||
addr += 1;
|
||||
break;
|
||||
|
||||
case 2: *imm = *(s32 *)addr;
|
||||
addr += 4;
|
||||
break;
|
||||
|
||||
case 3: break;
|
||||
}
|
||||
|
||||
/* record instruction length */
|
||||
*len = addr - start;
|
||||
|
||||
if (X86_MODRM_REG(v) == 0) /* EAX */
|
||||
return BUG_UD1_UBSAN;
|
||||
|
||||
return BUG_UD1;
|
||||
}
|
||||
@@ -258,10 +283,10 @@ static inline void handle_invalid_op(struct pt_regs *regs)
|
||||
static noinstr bool handle_bug(struct pt_regs *regs)
|
||||
{
|
||||
bool handled = false;
|
||||
int ud_type;
|
||||
u32 imm;
|
||||
int ud_type, ud_len;
|
||||
s32 ud_imm;
|
||||
|
||||
ud_type = decode_bug(regs->ip, &imm);
|
||||
ud_type = decode_bug(regs->ip, &ud_imm, &ud_len);
|
||||
if (ud_type == BUG_NONE)
|
||||
return handled;
|
||||
|
||||
@@ -281,15 +306,28 @@ static noinstr bool handle_bug(struct pt_regs *regs)
|
||||
*/
|
||||
if (regs->flags & X86_EFLAGS_IF)
|
||||
raw_local_irq_enable();
|
||||
if (ud_type == BUG_UD2) {
|
||||
|
||||
switch (ud_type) {
|
||||
case BUG_UD2:
|
||||
if (report_bug(regs->ip, regs) == BUG_TRAP_TYPE_WARN ||
|
||||
handle_cfi_failure(regs) == BUG_TRAP_TYPE_WARN) {
|
||||
regs->ip += LEN_UD2;
|
||||
regs->ip += ud_len;
|
||||
handled = true;
|
||||
}
|
||||
} else if (IS_ENABLED(CONFIG_UBSAN_TRAP)) {
|
||||
pr_crit("%s at %pS\n", report_ubsan_failure(regs, imm), (void *)regs->ip);
|
||||
break;
|
||||
|
||||
case BUG_UD1_UBSAN:
|
||||
if (IS_ENABLED(CONFIG_UBSAN_TRAP)) {
|
||||
pr_crit("%s at %pS\n",
|
||||
report_ubsan_failure(regs, ud_imm),
|
||||
(void *)regs->ip);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (regs->flags & X86_EFLAGS_IF)
|
||||
raw_local_irq_disable();
|
||||
instrumentation_end();
|
||||
|
||||
@@ -109,8 +109,14 @@ void __init kernel_randomize_memory(void)
|
||||
memory_tb = DIV_ROUND_UP(max_pfn << PAGE_SHIFT, 1UL << TB_SHIFT) +
|
||||
CONFIG_RANDOMIZE_MEMORY_PHYSICAL_PADDING;
|
||||
|
||||
/* Adapt physical memory region size based on available memory */
|
||||
if (memory_tb < kaslr_regions[0].size_tb)
|
||||
/*
|
||||
* Adapt physical memory region size based on available memory,
|
||||
* except when CONFIG_PCI_P2PDMA is enabled. P2PDMA exposes the
|
||||
* device BAR space assuming the direct map space is large enough
|
||||
* for creating a ZONE_DEVICE mapping in the direct map corresponding
|
||||
* to the physical BAR address.
|
||||
*/
|
||||
if (!IS_ENABLED(CONFIG_PCI_P2PDMA) && (memory_tb < kaslr_regions[0].size_tb))
|
||||
kaslr_regions[0].size_tb = memory_tb;
|
||||
|
||||
/*
|
||||
|
||||
@@ -473,6 +473,7 @@ static int crypto_ahash_init_tfm(struct crypto_tfm *tfm)
|
||||
struct ahash_alg *alg = crypto_ahash_alg(hash);
|
||||
|
||||
crypto_ahash_set_statesize(hash, alg->halg.statesize);
|
||||
crypto_ahash_set_reqsize(hash, alg->reqsize);
|
||||
|
||||
if (tfm->__crt_alg->cra_type == &crypto_shash_type)
|
||||
return crypto_init_ahash_using_shash(tfm);
|
||||
@@ -638,6 +639,9 @@ static int ahash_prepare_alg(struct ahash_alg *alg)
|
||||
if (alg->halg.statesize == 0)
|
||||
return -EINVAL;
|
||||
|
||||
if (alg->reqsize && alg->reqsize < alg->halg.statesize)
|
||||
return -EINVAL;
|
||||
|
||||
err = hash_prepare_alg(&alg->halg);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@@ -844,6 +844,7 @@ struct crypto_sync_skcipher *crypto_alloc_sync_skcipher(
|
||||
|
||||
/* Only sync algorithms allowed. */
|
||||
mask |= CRYPTO_ALG_ASYNC | CRYPTO_ALG_SKCIPHER_REQSIZE_LARGE;
|
||||
type &= ~(CRYPTO_ALG_ASYNC | CRYPTO_ALG_SKCIPHER_REQSIZE_LARGE);
|
||||
|
||||
tfm = crypto_alloc_tfm(alg_name, &crypto_skcipher_type, type, mask);
|
||||
|
||||
|
||||
@@ -443,7 +443,7 @@ config ACPI_SBS
|
||||
the modules will be called sbs and sbshc.
|
||||
|
||||
config ACPI_HED
|
||||
tristate "Hardware Error Device"
|
||||
bool "Hardware Error Device"
|
||||
help
|
||||
This driver supports the Hardware Error Device (PNP0C33),
|
||||
which is used to report some hardware errors notified via
|
||||
|
||||
@@ -80,7 +80,12 @@ static struct acpi_driver acpi_hed_driver = {
|
||||
.remove = acpi_hed_remove,
|
||||
},
|
||||
};
|
||||
module_acpi_driver(acpi_hed_driver);
|
||||
|
||||
static int __init acpi_hed_driver_init(void)
|
||||
{
|
||||
return acpi_bus_register_driver(&acpi_hed_driver);
|
||||
}
|
||||
subsys_initcall(acpi_hed_driver_init);
|
||||
|
||||
MODULE_AUTHOR("Huang Ying");
|
||||
MODULE_DESCRIPTION("ACPI Hardware Error Device Driver");
|
||||
|
||||
@@ -923,7 +923,7 @@ static unsigned int loop_default_blocksize(struct loop_device *lo,
|
||||
struct block_device *backing_bdev)
|
||||
{
|
||||
/* In case of direct I/O, match underlying block size */
|
||||
if ((lo->lo_backing_file->f_flags & O_DIRECT) && backing_bdev)
|
||||
if ((lo->lo_flags & LO_FLAGS_DIRECT_IO) && backing_bdev)
|
||||
return bdev_logical_block_size(backing_bdev);
|
||||
return SECTOR_SIZE;
|
||||
}
|
||||
|
||||
@@ -199,7 +199,7 @@ config IPQ_GCC_4019
|
||||
|
||||
config IPQ_GCC_5018
|
||||
tristate "IPQ5018 Global Clock Controller"
|
||||
depends on ARM64 || COMPILE_TEST
|
||||
depends on ARM || ARM64 || COMPILE_TEST
|
||||
help
|
||||
Support for global clock controller on ipq5018 devices.
|
||||
Say Y if you want to use peripheral devices such as UART, SPI,
|
||||
|
||||
@@ -670,14 +670,19 @@ clk_alpha_pll_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
|
||||
struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
|
||||
u32 alpha_width = pll_alpha_width(pll);
|
||||
|
||||
regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l);
|
||||
if (regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l))
|
||||
return 0;
|
||||
|
||||
if (regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &ctl))
|
||||
return 0;
|
||||
|
||||
regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &ctl);
|
||||
if (ctl & PLL_ALPHA_EN) {
|
||||
regmap_read(pll->clkr.regmap, PLL_ALPHA_VAL(pll), &low);
|
||||
if (regmap_read(pll->clkr.regmap, PLL_ALPHA_VAL(pll), &low))
|
||||
return 0;
|
||||
if (alpha_width > 32) {
|
||||
regmap_read(pll->clkr.regmap, PLL_ALPHA_VAL_U(pll),
|
||||
&high);
|
||||
if (regmap_read(pll->clkr.regmap, PLL_ALPHA_VAL_U(pll),
|
||||
&high))
|
||||
return 0;
|
||||
a = (u64)high << 32 | low;
|
||||
} else {
|
||||
a = low & GENMASK(alpha_width - 1, 0);
|
||||
@@ -903,8 +908,11 @@ alpha_pll_huayra_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
|
||||
struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
|
||||
u32 l, alpha = 0, ctl, alpha_m, alpha_n;
|
||||
|
||||
regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l);
|
||||
regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &ctl);
|
||||
if (regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l))
|
||||
return 0;
|
||||
|
||||
if (regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &ctl))
|
||||
return 0;
|
||||
|
||||
if (ctl & PLL_ALPHA_EN) {
|
||||
regmap_read(pll->clkr.regmap, PLL_ALPHA_VAL(pll), &alpha);
|
||||
@@ -1098,8 +1106,11 @@ clk_trion_pll_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
|
||||
struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
|
||||
u32 l, frac, alpha_width = pll_alpha_width(pll);
|
||||
|
||||
regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l);
|
||||
regmap_read(pll->clkr.regmap, PLL_ALPHA_VAL(pll), &frac);
|
||||
if (regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l))
|
||||
return 0;
|
||||
|
||||
if (regmap_read(pll->clkr.regmap, PLL_ALPHA_VAL(pll), &frac))
|
||||
return 0;
|
||||
|
||||
return alpha_pll_calc_rate(parent_rate, l, frac, alpha_width);
|
||||
}
|
||||
@@ -1157,7 +1168,8 @@ clk_alpha_pll_postdiv_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
|
||||
struct clk_alpha_pll_postdiv *pll = to_clk_alpha_pll_postdiv(hw);
|
||||
u32 ctl;
|
||||
|
||||
regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &ctl);
|
||||
if (regmap_read(pll->clkr.regmap, PLL_USER_CTL(pll), &ctl))
|
||||
return 0;
|
||||
|
||||
ctl >>= PLL_POST_DIV_SHIFT;
|
||||
ctl &= PLL_POST_DIV_MASK(pll);
|
||||
@@ -1373,8 +1385,11 @@ static unsigned long alpha_pll_fabia_recalc_rate(struct clk_hw *hw,
|
||||
struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
|
||||
u32 l, frac, alpha_width = pll_alpha_width(pll);
|
||||
|
||||
regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l);
|
||||
regmap_read(pll->clkr.regmap, PLL_FRAC(pll), &frac);
|
||||
if (regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l))
|
||||
return 0;
|
||||
|
||||
if (regmap_read(pll->clkr.regmap, PLL_FRAC(pll), &frac))
|
||||
return 0;
|
||||
|
||||
return alpha_pll_calc_rate(parent_rate, l, frac, alpha_width);
|
||||
}
|
||||
@@ -1524,7 +1539,8 @@ clk_trion_pll_postdiv_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
|
||||
struct regmap *regmap = pll->clkr.regmap;
|
||||
u32 i, div = 1, val;
|
||||
|
||||
regmap_read(regmap, PLL_USER_CTL(pll), &val);
|
||||
if (regmap_read(regmap, PLL_USER_CTL(pll), &val))
|
||||
return 0;
|
||||
|
||||
val >>= pll->post_div_shift;
|
||||
val &= PLL_POST_DIV_MASK(pll);
|
||||
@@ -2451,9 +2467,12 @@ static unsigned long alpha_pll_lucid_evo_recalc_rate(struct clk_hw *hw,
|
||||
struct regmap *regmap = pll->clkr.regmap;
|
||||
u32 l, frac;
|
||||
|
||||
regmap_read(regmap, PLL_L_VAL(pll), &l);
|
||||
if (regmap_read(regmap, PLL_L_VAL(pll), &l))
|
||||
return 0;
|
||||
l &= LUCID_EVO_PLL_L_VAL_MASK;
|
||||
regmap_read(regmap, PLL_ALPHA_VAL(pll), &frac);
|
||||
|
||||
if (regmap_read(regmap, PLL_ALPHA_VAL(pll), &frac))
|
||||
return 0;
|
||||
|
||||
return alpha_pll_calc_rate(parent_rate, l, frac, pll_alpha_width(pll));
|
||||
}
|
||||
@@ -2528,7 +2547,8 @@ static unsigned long clk_rivian_evo_pll_recalc_rate(struct clk_hw *hw,
|
||||
struct clk_alpha_pll *pll = to_clk_alpha_pll(hw);
|
||||
u32 l;
|
||||
|
||||
regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l);
|
||||
if (regmap_read(pll->clkr.regmap, PLL_L_VAL(pll), &l))
|
||||
return 0;
|
||||
|
||||
return parent_rate * l;
|
||||
}
|
||||
|
||||
@@ -115,6 +115,9 @@ static void gic_update_frequency(void *data)
|
||||
|
||||
static int gic_starting_cpu(unsigned int cpu)
|
||||
{
|
||||
/* Ensure the GIC counter is running */
|
||||
clear_gic_config(GIC_CONFIG_COUNTSTOP);
|
||||
|
||||
gic_clockevent_cpu_init(cpu, this_cpu_ptr(&gic_clockevent_device));
|
||||
return 0;
|
||||
}
|
||||
@@ -252,9 +255,6 @@ static int __init gic_clocksource_of_init(struct device_node *node)
|
||||
pr_warn("Unable to register clock notifier\n");
|
||||
}
|
||||
|
||||
/* And finally start the counter */
|
||||
clear_gic_config(GIC_CONFIG_COUNTSTOP);
|
||||
|
||||
/*
|
||||
* It's safe to use the MIPS GIC timer as a sched clock source only if
|
||||
* its ticks are stable, which is true on either the platforms with
|
||||
|
||||
@@ -239,8 +239,19 @@ again:
|
||||
* This can deal with workloads that have long pauses interspersed
|
||||
* with sporadic activity with a bunch of short pauses.
|
||||
*/
|
||||
if ((divisor * 4) <= INTERVALS * 3)
|
||||
if (divisor * 4 <= INTERVALS * 3) {
|
||||
/*
|
||||
* If there are sufficiently many data points still under
|
||||
* consideration after the outliers have been eliminated,
|
||||
* returning without a prediction would be a mistake because it
|
||||
* is likely that the next interval will not exceed the current
|
||||
* maximum, so return the latter in that case.
|
||||
*/
|
||||
if (divisor >= INTERVALS / 2)
|
||||
return max;
|
||||
|
||||
return UINT_MAX;
|
||||
}
|
||||
|
||||
thresh = max - 1;
|
||||
goto again;
|
||||
|
||||
@@ -405,10 +405,9 @@ static int ie31200_probe1(struct pci_dev *pdev, int dev_idx)
|
||||
int i, j, ret;
|
||||
struct mem_ctl_info *mci = NULL;
|
||||
struct edac_mc_layer layers[2];
|
||||
struct dimm_data dimm_info[IE31200_CHANNELS][IE31200_DIMMS_PER_CHANNEL];
|
||||
void __iomem *window;
|
||||
struct ie31200_priv *priv;
|
||||
u32 addr_decode, mad_offset;
|
||||
u32 addr_decode[IE31200_CHANNELS], mad_offset;
|
||||
|
||||
/*
|
||||
* Kaby Lake, Coffee Lake seem to work like Skylake. Please re-visit
|
||||
@@ -466,19 +465,10 @@ static int ie31200_probe1(struct pci_dev *pdev, int dev_idx)
|
||||
mad_offset = IE31200_MAD_DIMM_0_OFFSET;
|
||||
}
|
||||
|
||||
/* populate DIMM info */
|
||||
for (i = 0; i < IE31200_CHANNELS; i++) {
|
||||
addr_decode = readl(window + mad_offset +
|
||||
addr_decode[i] = readl(window + mad_offset +
|
||||
(i * 4));
|
||||
edac_dbg(0, "addr_decode: 0x%x\n", addr_decode);
|
||||
for (j = 0; j < IE31200_DIMMS_PER_CHANNEL; j++) {
|
||||
populate_dimm_info(&dimm_info[i][j], addr_decode, j,
|
||||
skl);
|
||||
edac_dbg(0, "size: 0x%x, rank: %d, width: %d\n",
|
||||
dimm_info[i][j].size,
|
||||
dimm_info[i][j].dual_rank,
|
||||
dimm_info[i][j].x16_width);
|
||||
}
|
||||
edac_dbg(0, "addr_decode: 0x%x\n", addr_decode[i]);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -489,14 +479,22 @@ static int ie31200_probe1(struct pci_dev *pdev, int dev_idx)
|
||||
*/
|
||||
for (i = 0; i < IE31200_DIMMS_PER_CHANNEL; i++) {
|
||||
for (j = 0; j < IE31200_CHANNELS; j++) {
|
||||
struct dimm_data dimm_info;
|
||||
struct dimm_info *dimm;
|
||||
unsigned long nr_pages;
|
||||
|
||||
nr_pages = IE31200_PAGES(dimm_info[j][i].size, skl);
|
||||
populate_dimm_info(&dimm_info, addr_decode[j], i,
|
||||
skl);
|
||||
edac_dbg(0, "size: 0x%x, rank: %d, width: %d\n",
|
||||
dimm_info.size,
|
||||
dimm_info.dual_rank,
|
||||
dimm_info.x16_width);
|
||||
|
||||
nr_pages = IE31200_PAGES(dimm_info.size, skl);
|
||||
if (nr_pages == 0)
|
||||
continue;
|
||||
|
||||
if (dimm_info[j][i].dual_rank) {
|
||||
if (dimm_info.dual_rank) {
|
||||
nr_pages = nr_pages / 2;
|
||||
dimm = edac_get_dimm(mci, (i * 2) + 1, j, 0);
|
||||
dimm->nr_pages = nr_pages;
|
||||
|
||||
@@ -126,6 +126,14 @@ static int ffa_version_check(u32 *version)
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
if (FFA_MAJOR_VERSION(ver.a0) > FFA_MAJOR_VERSION(FFA_DRIVER_VERSION)) {
|
||||
pr_err("Incompatible v%d.%d! Latest supported v%d.%d\n",
|
||||
FFA_MAJOR_VERSION(ver.a0), FFA_MINOR_VERSION(ver.a0),
|
||||
FFA_MAJOR_VERSION(FFA_DRIVER_VERSION),
|
||||
FFA_MINOR_VERSION(FFA_DRIVER_VERSION));
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (ver.a0 < FFA_MIN_VERSION) {
|
||||
pr_err("Incompatible v%d.%d! Earliest supported v%d.%d\n",
|
||||
FFA_MAJOR_VERSION(ver.a0), FFA_MINOR_VERSION(ver.a0),
|
||||
@@ -1415,6 +1423,10 @@ static int ffa_setup_partitions(void)
|
||||
|
||||
kfree(pbuf);
|
||||
|
||||
/* Check if the host is already added as part of partition info */
|
||||
if (xa_load(&drv_info->partition_info, drv_info->vm_id))
|
||||
return 0;
|
||||
|
||||
/* Allocate for the host */
|
||||
info = kzalloc(sizeof(*info), GFP_KERNEL);
|
||||
if (!info) {
|
||||
|
||||
@@ -1012,17 +1012,13 @@ EXPORT_SYMBOL_GPL(zynqmp_pm_fpga_get_status);
|
||||
int zynqmp_pm_fpga_get_config_status(u32 *value)
|
||||
{
|
||||
u32 ret_payload[PAYLOAD_ARG_CNT];
|
||||
u32 buf, lower_addr, upper_addr;
|
||||
int ret;
|
||||
|
||||
if (!value)
|
||||
return -EINVAL;
|
||||
|
||||
lower_addr = lower_32_bits((u64)&buf);
|
||||
upper_addr = upper_32_bits((u64)&buf);
|
||||
|
||||
ret = zynqmp_pm_invoke_fn(PM_FPGA_READ, ret_payload, 4,
|
||||
XILINX_ZYNQMP_PM_FPGA_CONFIG_STAT_OFFSET, lower_addr, upper_addr,
|
||||
XILINX_ZYNQMP_PM_FPGA_CONFIG_STAT_OFFSET, 0, 0,
|
||||
XILINX_ZYNQMP_PM_FPGA_READ_CONFIG_REG);
|
||||
|
||||
*value = ret_payload[1];
|
||||
|
||||
@@ -192,7 +192,7 @@ int kfd_debugfs_kfd_mem_limits(struct seq_file *m, void *data);
|
||||
#if IS_ENABLED(CONFIG_HSA_AMD)
|
||||
bool amdkfd_fence_check_mm(struct dma_fence *f, struct mm_struct *mm);
|
||||
struct amdgpu_amdkfd_fence *to_amdgpu_amdkfd_fence(struct dma_fence *f);
|
||||
int amdgpu_amdkfd_remove_fence_on_pt_pd_bos(struct amdgpu_bo *bo);
|
||||
void amdgpu_amdkfd_remove_all_eviction_fences(struct amdgpu_bo *bo);
|
||||
int amdgpu_amdkfd_evict_userptr(struct mmu_interval_notifier *mni,
|
||||
unsigned long cur_seq, struct kgd_mem *mem);
|
||||
int amdgpu_amdkfd_bo_validate_and_fence(struct amdgpu_bo *bo,
|
||||
@@ -212,9 +212,8 @@ struct amdgpu_amdkfd_fence *to_amdgpu_amdkfd_fence(struct dma_fence *f)
|
||||
}
|
||||
|
||||
static inline
|
||||
int amdgpu_amdkfd_remove_fence_on_pt_pd_bos(struct amdgpu_bo *bo)
|
||||
void amdgpu_amdkfd_remove_all_eviction_fences(struct amdgpu_bo *bo)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline
|
||||
|
||||
@@ -370,40 +370,32 @@ static int amdgpu_amdkfd_remove_eviction_fence(struct amdgpu_bo *bo,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int amdgpu_amdkfd_remove_fence_on_pt_pd_bos(struct amdgpu_bo *bo)
|
||||
/**
|
||||
* amdgpu_amdkfd_remove_all_eviction_fences - Remove all eviction fences
|
||||
* @bo: the BO where to remove the evictions fences from.
|
||||
*
|
||||
* This functions should only be used on release when all references to the BO
|
||||
* are already dropped. We remove the eviction fence from the private copy of
|
||||
* the dma_resv object here since that is what is used during release to
|
||||
* determine of the BO is idle or not.
|
||||
*/
|
||||
void amdgpu_amdkfd_remove_all_eviction_fences(struct amdgpu_bo *bo)
|
||||
{
|
||||
struct amdgpu_bo *root = bo;
|
||||
struct amdgpu_vm_bo_base *vm_bo;
|
||||
struct amdgpu_vm *vm;
|
||||
struct amdkfd_process_info *info;
|
||||
struct amdgpu_amdkfd_fence *ef;
|
||||
int ret;
|
||||
struct dma_resv *resv = &bo->tbo.base._resv;
|
||||
struct dma_fence *fence, *stub;
|
||||
struct dma_resv_iter cursor;
|
||||
|
||||
/* we can always get vm_bo from root PD bo.*/
|
||||
while (root->parent)
|
||||
root = root->parent;
|
||||
dma_resv_assert_held(resv);
|
||||
|
||||
vm_bo = root->vm_bo;
|
||||
if (!vm_bo)
|
||||
return 0;
|
||||
stub = dma_fence_get_stub();
|
||||
dma_resv_for_each_fence(&cursor, resv, DMA_RESV_USAGE_BOOKKEEP, fence) {
|
||||
if (!to_amdgpu_amdkfd_fence(fence))
|
||||
continue;
|
||||
|
||||
vm = vm_bo->vm;
|
||||
if (!vm)
|
||||
return 0;
|
||||
|
||||
info = vm->process_info;
|
||||
if (!info || !info->eviction_fence)
|
||||
return 0;
|
||||
|
||||
ef = container_of(dma_fence_get(&info->eviction_fence->base),
|
||||
struct amdgpu_amdkfd_fence, base);
|
||||
|
||||
BUG_ON(!dma_resv_trylock(bo->tbo.base.resv));
|
||||
ret = amdgpu_amdkfd_remove_eviction_fence(bo, ef);
|
||||
dma_resv_unlock(bo->tbo.base.resv);
|
||||
|
||||
dma_fence_put(&ef->base);
|
||||
return ret;
|
||||
dma_resv_replace_fences(resv, fence->context, stub,
|
||||
DMA_RESV_USAGE_BOOKKEEP);
|
||||
}
|
||||
dma_fence_put(stub);
|
||||
}
|
||||
|
||||
static int amdgpu_amdkfd_bo_validate(struct amdgpu_bo *bo, uint32_t domain,
|
||||
|
||||
@@ -1246,28 +1246,36 @@ void amdgpu_bo_release_notify(struct ttm_buffer_object *bo)
|
||||
if (abo->kfd_bo)
|
||||
amdgpu_amdkfd_release_notify(abo);
|
||||
|
||||
/* We only remove the fence if the resv has individualized. */
|
||||
WARN_ON_ONCE(bo->type == ttm_bo_type_kernel
|
||||
&& bo->base.resv != &bo->base._resv);
|
||||
if (bo->base.resv == &bo->base._resv)
|
||||
amdgpu_amdkfd_remove_fence_on_pt_pd_bos(abo);
|
||||
/*
|
||||
* We lock the private dma_resv object here and since the BO is about to
|
||||
* be released nobody else should have a pointer to it.
|
||||
* So when this locking here fails something is wrong with the reference
|
||||
* counting.
|
||||
*/
|
||||
if (WARN_ON_ONCE(!dma_resv_trylock(&bo->base._resv)))
|
||||
return;
|
||||
|
||||
amdgpu_amdkfd_remove_all_eviction_fences(abo);
|
||||
|
||||
if (!bo->resource || bo->resource->mem_type != TTM_PL_VRAM ||
|
||||
!(abo->flags & AMDGPU_GEM_CREATE_VRAM_WIPE_ON_RELEASE) ||
|
||||
adev->in_suspend || drm_dev_is_unplugged(adev_to_drm(adev)))
|
||||
return;
|
||||
goto out;
|
||||
|
||||
if (WARN_ON_ONCE(!dma_resv_trylock(bo->base.resv)))
|
||||
return;
|
||||
r = dma_resv_reserve_fences(&bo->base._resv, 1);
|
||||
if (r)
|
||||
goto out;
|
||||
|
||||
r = amdgpu_fill_buffer(abo, 0, bo->base.resv, &fence, true);
|
||||
if (!WARN_ON(r)) {
|
||||
amdgpu_vram_mgr_set_cleared(bo->resource);
|
||||
amdgpu_bo_fence(abo, fence, false);
|
||||
dma_fence_put(fence);
|
||||
}
|
||||
r = amdgpu_fill_buffer(abo, 0, &bo->base._resv, &fence, true);
|
||||
if (WARN_ON(r))
|
||||
goto out;
|
||||
|
||||
dma_resv_unlock(bo->base.resv);
|
||||
amdgpu_vram_mgr_set_cleared(bo->resource);
|
||||
dma_resv_add_fence(&bo->base._resv, fence, DMA_RESV_USAGE_KERNEL);
|
||||
dma_fence_put(fence);
|
||||
|
||||
out:
|
||||
dma_resv_unlock(&bo->base._resv);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -5552,9 +5552,9 @@ fill_plane_color_attributes(const struct drm_plane_state *plane_state,
|
||||
|
||||
case DRM_COLOR_YCBCR_BT2020:
|
||||
if (full_range)
|
||||
*color_space = COLOR_SPACE_2020_YCBCR;
|
||||
*color_space = COLOR_SPACE_2020_YCBCR_FULL;
|
||||
else
|
||||
return -EINVAL;
|
||||
*color_space = COLOR_SPACE_2020_YCBCR_LIMITED;
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -6050,7 +6050,7 @@ get_output_color_space(const struct dc_crtc_timing *dc_crtc_timing,
|
||||
if (dc_crtc_timing->pixel_encoding == PIXEL_ENCODING_RGB)
|
||||
color_space = COLOR_SPACE_2020_RGB_FULLRANGE;
|
||||
else
|
||||
color_space = COLOR_SPACE_2020_YCBCR;
|
||||
color_space = COLOR_SPACE_2020_YCBCR_LIMITED;
|
||||
break;
|
||||
case DRM_MODE_COLORIMETRY_DEFAULT: // ITU601
|
||||
default:
|
||||
@@ -7399,12 +7399,12 @@ cleanup:
|
||||
}
|
||||
|
||||
struct dc_stream_state *
|
||||
create_validate_stream_for_sink(struct amdgpu_dm_connector *aconnector,
|
||||
create_validate_stream_for_sink(struct drm_connector *connector,
|
||||
const struct drm_display_mode *drm_mode,
|
||||
const struct dm_connector_state *dm_state,
|
||||
const struct dc_stream_state *old_stream)
|
||||
{
|
||||
struct drm_connector *connector = &aconnector->base;
|
||||
struct amdgpu_dm_connector *aconnector = NULL;
|
||||
struct amdgpu_device *adev = drm_to_adev(connector->dev);
|
||||
struct dc_stream_state *stream;
|
||||
const struct drm_connector_state *drm_state = dm_state ? &dm_state->base : NULL;
|
||||
@@ -7415,8 +7415,12 @@ create_validate_stream_for_sink(struct amdgpu_dm_connector *aconnector,
|
||||
if (!dm_state)
|
||||
return NULL;
|
||||
|
||||
if (aconnector->dc_link->connector_signal == SIGNAL_TYPE_HDMI_TYPE_A ||
|
||||
aconnector->dc_link->dpcd_caps.dongle_type == DISPLAY_DONGLE_DP_HDMI_CONVERTER)
|
||||
if (connector->connector_type != DRM_MODE_CONNECTOR_WRITEBACK)
|
||||
aconnector = to_amdgpu_dm_connector(connector);
|
||||
|
||||
if (aconnector &&
|
||||
(aconnector->dc_link->connector_signal == SIGNAL_TYPE_HDMI_TYPE_A ||
|
||||
aconnector->dc_link->dpcd_caps.dongle_type == DISPLAY_DONGLE_DP_HDMI_CONVERTER))
|
||||
bpc_limit = 8;
|
||||
|
||||
do {
|
||||
@@ -7428,10 +7432,11 @@ create_validate_stream_for_sink(struct amdgpu_dm_connector *aconnector,
|
||||
break;
|
||||
}
|
||||
|
||||
if (aconnector->base.connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
|
||||
dc_result = dc_validate_stream(adev->dm.dc, stream);
|
||||
|
||||
if (!aconnector) /* writeback connector */
|
||||
return stream;
|
||||
|
||||
dc_result = dc_validate_stream(adev->dm.dc, stream);
|
||||
if (dc_result == DC_OK && stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST)
|
||||
dc_result = dm_dp_mst_is_port_support_mode(aconnector, stream);
|
||||
|
||||
@@ -7461,7 +7466,7 @@ create_validate_stream_for_sink(struct amdgpu_dm_connector *aconnector,
|
||||
__func__, __LINE__);
|
||||
|
||||
aconnector->force_yuv420_output = true;
|
||||
stream = create_validate_stream_for_sink(aconnector, drm_mode,
|
||||
stream = create_validate_stream_for_sink(connector, drm_mode,
|
||||
dm_state, old_stream);
|
||||
aconnector->force_yuv420_output = false;
|
||||
}
|
||||
@@ -7476,6 +7481,9 @@ enum drm_mode_status amdgpu_dm_connector_mode_valid(struct drm_connector *connec
|
||||
struct dc_sink *dc_sink;
|
||||
/* TODO: Unhardcode stream count */
|
||||
struct dc_stream_state *stream;
|
||||
/* we always have an amdgpu_dm_connector here since we got
|
||||
* here via the amdgpu_dm_connector_helper_funcs
|
||||
*/
|
||||
struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
|
||||
|
||||
if ((mode->flags & DRM_MODE_FLAG_INTERLACE) ||
|
||||
@@ -7500,7 +7508,7 @@ enum drm_mode_status amdgpu_dm_connector_mode_valid(struct drm_connector *connec
|
||||
|
||||
drm_mode_set_crtcinfo(mode, 0);
|
||||
|
||||
stream = create_validate_stream_for_sink(aconnector, mode,
|
||||
stream = create_validate_stream_for_sink(connector, mode,
|
||||
to_dm_connector_state(connector->state),
|
||||
NULL);
|
||||
if (stream) {
|
||||
@@ -10520,7 +10528,7 @@ static int dm_update_crtc_state(struct amdgpu_display_manager *dm,
|
||||
if (!drm_atomic_crtc_needs_modeset(new_crtc_state))
|
||||
goto skip_modeset;
|
||||
|
||||
new_stream = create_validate_stream_for_sink(aconnector,
|
||||
new_stream = create_validate_stream_for_sink(connector,
|
||||
&new_crtc_state->mode,
|
||||
dm_new_conn_state,
|
||||
dm_old_crtc_state->stream);
|
||||
|
||||
@@ -987,7 +987,7 @@ int amdgpu_dm_process_dmub_set_config_sync(struct dc_context *ctx, unsigned int
|
||||
struct set_config_cmd_payload *payload, enum set_config_status *operation_result);
|
||||
|
||||
struct dc_stream_state *
|
||||
create_validate_stream_for_sink(struct amdgpu_dm_connector *aconnector,
|
||||
create_validate_stream_for_sink(struct drm_connector *connector,
|
||||
const struct drm_display_mode *drm_mode,
|
||||
const struct dm_connector_state *dm_state,
|
||||
const struct dc_stream_state *old_stream);
|
||||
|
||||
@@ -1145,7 +1145,7 @@ static int amdgpu_current_colorspace_show(struct seq_file *m, void *data)
|
||||
case COLOR_SPACE_2020_RGB_FULLRANGE:
|
||||
seq_puts(m, "BT2020_RGB");
|
||||
break;
|
||||
case COLOR_SPACE_2020_YCBCR:
|
||||
case COLOR_SPACE_2020_YCBCR_LIMITED:
|
||||
seq_puts(m, "BT2020_YCC");
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -1646,7 +1646,6 @@ int pre_validate_dsc(struct drm_atomic_state *state,
|
||||
|
||||
if (ind >= 0) {
|
||||
struct drm_connector *connector;
|
||||
struct amdgpu_dm_connector *aconnector;
|
||||
struct drm_connector_state *drm_new_conn_state;
|
||||
struct dm_connector_state *dm_new_conn_state;
|
||||
struct dm_crtc_state *dm_old_crtc_state;
|
||||
@@ -1654,15 +1653,14 @@ int pre_validate_dsc(struct drm_atomic_state *state,
|
||||
connector =
|
||||
amdgpu_dm_find_first_crtc_matching_connector(state,
|
||||
state->crtcs[ind].ptr);
|
||||
aconnector = to_amdgpu_dm_connector(connector);
|
||||
drm_new_conn_state =
|
||||
drm_atomic_get_new_connector_state(state,
|
||||
&aconnector->base);
|
||||
connector);
|
||||
dm_new_conn_state = to_dm_connector_state(drm_new_conn_state);
|
||||
dm_old_crtc_state = to_dm_crtc_state(state->crtcs[ind].old_state);
|
||||
|
||||
local_dc_state->streams[i] =
|
||||
create_validate_stream_for_sink(aconnector,
|
||||
create_validate_stream_for_sink(connector,
|
||||
&state->crtcs[ind].new_state->mode,
|
||||
dm_new_conn_state,
|
||||
dm_old_crtc_state->stream);
|
||||
|
||||
@@ -40,7 +40,8 @@ bool is_rgb_cspace(enum dc_color_space output_color_space)
|
||||
case COLOR_SPACE_YCBCR709:
|
||||
case COLOR_SPACE_YCBCR601_LIMITED:
|
||||
case COLOR_SPACE_YCBCR709_LIMITED:
|
||||
case COLOR_SPACE_2020_YCBCR:
|
||||
case COLOR_SPACE_2020_YCBCR_LIMITED:
|
||||
case COLOR_SPACE_2020_YCBCR_FULL:
|
||||
return false;
|
||||
default:
|
||||
/* Add a case to switch */
|
||||
|
||||
@@ -452,14 +452,19 @@ void dcn35_update_clocks(struct clk_mgr *clk_mgr_base,
|
||||
update_dppclk = true;
|
||||
}
|
||||
|
||||
if (should_set_clock(safe_to_lower, new_clocks->dispclk_khz, clk_mgr_base->clks.dispclk_khz)) {
|
||||
if (should_set_clock(safe_to_lower, new_clocks->dispclk_khz, clk_mgr_base->clks.dispclk_khz) &&
|
||||
(new_clocks->dispclk_khz > 0 || (safe_to_lower && display_count == 0))) {
|
||||
int requested_dispclk_khz = new_clocks->dispclk_khz;
|
||||
|
||||
dcn35_disable_otg_wa(clk_mgr_base, context, safe_to_lower, true);
|
||||
|
||||
if (dc->debug.min_disp_clk_khz > 0 && new_clocks->dispclk_khz < dc->debug.min_disp_clk_khz)
|
||||
new_clocks->dispclk_khz = dc->debug.min_disp_clk_khz;
|
||||
/* Clamp the requested clock to PMFW based on their limit. */
|
||||
if (dc->debug.min_disp_clk_khz > 0 && requested_dispclk_khz < dc->debug.min_disp_clk_khz)
|
||||
requested_dispclk_khz = dc->debug.min_disp_clk_khz;
|
||||
|
||||
dcn35_smu_set_dispclk(clk_mgr, requested_dispclk_khz);
|
||||
clk_mgr_base->clks.dispclk_khz = new_clocks->dispclk_khz;
|
||||
dcn35_smu_set_dispclk(clk_mgr, clk_mgr_base->clks.dispclk_khz);
|
||||
|
||||
dcn35_disable_otg_wa(clk_mgr_base, context, safe_to_lower, false);
|
||||
|
||||
update_dispclk = true;
|
||||
|
||||
@@ -176,7 +176,7 @@ static bool is_ycbcr2020_type(
|
||||
{
|
||||
bool ret = false;
|
||||
|
||||
if (color_space == COLOR_SPACE_2020_YCBCR)
|
||||
if (color_space == COLOR_SPACE_2020_YCBCR_LIMITED || color_space == COLOR_SPACE_2020_YCBCR_FULL)
|
||||
ret = true;
|
||||
return ret;
|
||||
}
|
||||
@@ -247,7 +247,8 @@ void color_space_to_black_color(
|
||||
case COLOR_SPACE_YCBCR709_BLACK:
|
||||
case COLOR_SPACE_YCBCR601_LIMITED:
|
||||
case COLOR_SPACE_YCBCR709_LIMITED:
|
||||
case COLOR_SPACE_2020_YCBCR:
|
||||
case COLOR_SPACE_2020_YCBCR_LIMITED:
|
||||
case COLOR_SPACE_2020_YCBCR_FULL:
|
||||
*black_color = black_color_format[BLACK_COLOR_FORMAT_YUV_CV];
|
||||
break;
|
||||
|
||||
|
||||
@@ -4215,7 +4215,7 @@ static void set_avi_info_frame(
|
||||
break;
|
||||
case COLOR_SPACE_2020_RGB_FULLRANGE:
|
||||
case COLOR_SPACE_2020_RGB_LIMITEDRANGE:
|
||||
case COLOR_SPACE_2020_YCBCR:
|
||||
case COLOR_SPACE_2020_YCBCR_LIMITED:
|
||||
hdmi_info.bits.EC0_EC2 = COLORIMETRYEX_BT2020RGBYCBCR;
|
||||
hdmi_info.bits.C0_C1 = COLORIMETRY_EXTENDED;
|
||||
break;
|
||||
@@ -4229,7 +4229,7 @@ static void set_avi_info_frame(
|
||||
break;
|
||||
}
|
||||
|
||||
if (pixel_encoding && color_space == COLOR_SPACE_2020_YCBCR &&
|
||||
if (pixel_encoding && color_space == COLOR_SPACE_2020_YCBCR_LIMITED &&
|
||||
stream->out_transfer_func.tf == TRANSFER_FUNCTION_GAMMA22) {
|
||||
hdmi_info.bits.EC0_EC2 = 0;
|
||||
hdmi_info.bits.C0_C1 = COLORIMETRY_ITU709;
|
||||
|
||||
@@ -959,6 +959,14 @@ union dp_128b_132b_supported_lttpr_link_rates {
|
||||
uint8_t raw;
|
||||
};
|
||||
|
||||
union dp_alpm_lttpr_cap {
|
||||
struct {
|
||||
uint8_t AUX_LESS_ALPM_SUPPORTED :1;
|
||||
uint8_t RESERVED :7;
|
||||
} bits;
|
||||
uint8_t raw;
|
||||
};
|
||||
|
||||
union dp_sink_video_fallback_formats {
|
||||
struct {
|
||||
uint8_t dp_1024x768_60Hz_24bpp_support :1;
|
||||
@@ -1103,6 +1111,7 @@ struct dc_lttpr_caps {
|
||||
uint8_t max_ext_timeout;
|
||||
union dp_main_link_channel_coding_lttpr_cap main_link_channel_coding;
|
||||
union dp_128b_132b_supported_lttpr_link_rates supported_128b_132b_rates;
|
||||
union dp_alpm_lttpr_cap alpm;
|
||||
uint8_t aux_rd_interval[MAX_REPEATER_CNT - 1];
|
||||
};
|
||||
|
||||
@@ -1352,6 +1361,9 @@ struct dp_trace {
|
||||
#ifndef DPCD_MAX_UNCOMPRESSED_PIXEL_RATE_CAP
|
||||
#define DPCD_MAX_UNCOMPRESSED_PIXEL_RATE_CAP 0x221c
|
||||
#endif
|
||||
#ifndef DP_LTTPR_ALPM_CAPABILITIES
|
||||
#define DP_LTTPR_ALPM_CAPABILITIES 0xF0009
|
||||
#endif
|
||||
#ifndef DP_REPEATER_CONFIGURATION_AND_STATUS_SIZE
|
||||
#define DP_REPEATER_CONFIGURATION_AND_STATUS_SIZE 0x50
|
||||
#endif
|
||||
|
||||
@@ -641,7 +641,8 @@ enum dc_color_space {
|
||||
COLOR_SPACE_YCBCR709_LIMITED,
|
||||
COLOR_SPACE_2020_RGB_FULLRANGE,
|
||||
COLOR_SPACE_2020_RGB_LIMITEDRANGE,
|
||||
COLOR_SPACE_2020_YCBCR,
|
||||
COLOR_SPACE_2020_YCBCR_LIMITED,
|
||||
COLOR_SPACE_2020_YCBCR_FULL,
|
||||
COLOR_SPACE_ADOBERGB,
|
||||
COLOR_SPACE_DCIP3,
|
||||
COLOR_SPACE_DISPLAYNATIVE,
|
||||
@@ -649,6 +650,7 @@ enum dc_color_space {
|
||||
COLOR_SPACE_APPCTRL,
|
||||
COLOR_SPACE_CUSTOMPOINTS,
|
||||
COLOR_SPACE_YCBCR709_BLACK,
|
||||
COLOR_SPACE_2020_YCBCR = COLOR_SPACE_2020_YCBCR_LIMITED,
|
||||
};
|
||||
|
||||
enum dc_dither_option {
|
||||
|
||||
@@ -420,7 +420,7 @@ static void dce110_stream_encoder_dp_set_stream_attribute(
|
||||
dynamic_range_rgb = 1; /*limited range*/
|
||||
break;
|
||||
case COLOR_SPACE_2020_RGB_FULLRANGE:
|
||||
case COLOR_SPACE_2020_YCBCR:
|
||||
case COLOR_SPACE_2020_YCBCR_LIMITED:
|
||||
case COLOR_SPACE_XR_RGB:
|
||||
case COLOR_SPACE_MSREF_SCRGB:
|
||||
case COLOR_SPACE_ADOBERGB:
|
||||
@@ -432,6 +432,7 @@ static void dce110_stream_encoder_dp_set_stream_attribute(
|
||||
case COLOR_SPACE_APPCTRL:
|
||||
case COLOR_SPACE_CUSTOMPOINTS:
|
||||
case COLOR_SPACE_UNKNOWN:
|
||||
default:
|
||||
/* do nothing */
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -393,7 +393,7 @@ void enc1_stream_encoder_dp_set_stream_attribute(
|
||||
break;
|
||||
case COLOR_SPACE_2020_RGB_LIMITEDRANGE:
|
||||
case COLOR_SPACE_2020_RGB_FULLRANGE:
|
||||
case COLOR_SPACE_2020_YCBCR:
|
||||
case COLOR_SPACE_2020_YCBCR_LIMITED:
|
||||
case COLOR_SPACE_XR_RGB:
|
||||
case COLOR_SPACE_MSREF_SCRGB:
|
||||
case COLOR_SPACE_ADOBERGB:
|
||||
@@ -406,6 +406,7 @@ void enc1_stream_encoder_dp_set_stream_attribute(
|
||||
case COLOR_SPACE_CUSTOMPOINTS:
|
||||
case COLOR_SPACE_UNKNOWN:
|
||||
case COLOR_SPACE_YCBCR709_BLACK:
|
||||
default:
|
||||
/* do nothing */
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -634,7 +634,7 @@ void enc401_stream_encoder_dp_set_stream_attribute(
|
||||
break;
|
||||
case COLOR_SPACE_2020_RGB_LIMITEDRANGE:
|
||||
case COLOR_SPACE_2020_RGB_FULLRANGE:
|
||||
case COLOR_SPACE_2020_YCBCR:
|
||||
case COLOR_SPACE_2020_YCBCR_LIMITED:
|
||||
case COLOR_SPACE_XR_RGB:
|
||||
case COLOR_SPACE_MSREF_SCRGB:
|
||||
case COLOR_SPACE_ADOBERGB:
|
||||
@@ -647,6 +647,7 @@ void enc401_stream_encoder_dp_set_stream_attribute(
|
||||
case COLOR_SPACE_CUSTOMPOINTS:
|
||||
case COLOR_SPACE_UNKNOWN:
|
||||
case COLOR_SPACE_YCBCR709_BLACK:
|
||||
default:
|
||||
/* do nothing */
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -626,7 +626,6 @@ static bool dcn32_assign_subvp_pipe(struct dc *dc,
|
||||
* - Not TMZ surface
|
||||
*/
|
||||
if (pipe->plane_state && !pipe->top_pipe && !pipe->prev_odm_pipe && !dcn32_is_center_timing(pipe) &&
|
||||
!pipe->stream->hw_cursor_req &&
|
||||
!(pipe->stream->timing.pix_clk_100hz / 10000 > DCN3_2_MAX_SUBVP_PIXEL_RATE_MHZ) &&
|
||||
(!dcn32_is_psr_capable(pipe) || (context->stream_count == 1 && dc->caps.dmub_caps.subvp_psr)) &&
|
||||
dc_state_get_pipe_subvp_type(context, pipe) == SUBVP_NONE &&
|
||||
|
||||
@@ -323,7 +323,7 @@ static void dcn31_hpo_dp_stream_enc_set_stream_attribute(
|
||||
break;
|
||||
case COLOR_SPACE_2020_RGB_LIMITEDRANGE:
|
||||
case COLOR_SPACE_2020_RGB_FULLRANGE:
|
||||
case COLOR_SPACE_2020_YCBCR:
|
||||
case COLOR_SPACE_2020_YCBCR_LIMITED:
|
||||
case COLOR_SPACE_XR_RGB:
|
||||
case COLOR_SPACE_MSREF_SCRGB:
|
||||
case COLOR_SPACE_ADOBERGB:
|
||||
@@ -336,6 +336,7 @@ static void dcn31_hpo_dp_stream_enc_set_stream_attribute(
|
||||
case COLOR_SPACE_CUSTOMPOINTS:
|
||||
case COLOR_SPACE_UNKNOWN:
|
||||
case COLOR_SPACE_YCBCR709_BLACK:
|
||||
default:
|
||||
/* do nothing */
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -119,10 +119,14 @@ static const struct dpp_input_csc_matrix __maybe_unused dpp_input_csc_matrix[] =
|
||||
{ 0x39a6, 0x2568, 0, 0xe0d6,
|
||||
0xeedd, 0x2568, 0xf925, 0x9a8,
|
||||
0, 0x2568, 0x43ee, 0xdbb2 } },
|
||||
{ COLOR_SPACE_2020_YCBCR,
|
||||
{ COLOR_SPACE_2020_YCBCR_FULL,
|
||||
{ 0x2F30, 0x2000, 0, 0xE869,
|
||||
0xEDB7, 0x2000, 0xFABC, 0xBC6,
|
||||
0, 0x2000, 0x3C34, 0xE1E6 } },
|
||||
{ COLOR_SPACE_2020_YCBCR_LIMITED,
|
||||
{ 0x35B9, 0x2543, 0, 0xE2B2,
|
||||
0xEB2F, 0x2543, 0xFA01, 0x0B1F,
|
||||
0, 0x2543, 0x4489, 0xDB42 } },
|
||||
{ COLOR_SPACE_2020_RGB_LIMITEDRANGE,
|
||||
{ 0x35E0, 0x255F, 0, 0xE2B3,
|
||||
0xEB20, 0x255F, 0xF9FD, 0xB1E,
|
||||
|
||||
@@ -945,6 +945,9 @@ bool link_decide_link_settings(struct dc_stream_state *stream,
|
||||
* TODO: add MST specific link training routine
|
||||
*/
|
||||
decide_mst_link_settings(link, link_setting);
|
||||
} else if (stream->signal == SIGNAL_TYPE_VIRTUAL) {
|
||||
link_setting->lane_count = LANE_COUNT_FOUR;
|
||||
link_setting->link_rate = LINK_RATE_HIGH3;
|
||||
} else if (link->connector_signal == SIGNAL_TYPE_EDP) {
|
||||
/* enable edp link optimization for DSC eDP case */
|
||||
if (stream->timing.flags.DSC) {
|
||||
@@ -967,9 +970,6 @@ bool link_decide_link_settings(struct dc_stream_state *stream,
|
||||
} else {
|
||||
edp_decide_link_settings(link, link_setting, req_bw);
|
||||
}
|
||||
} else if (stream->signal == SIGNAL_TYPE_VIRTUAL) {
|
||||
link_setting->lane_count = LANE_COUNT_FOUR;
|
||||
link_setting->link_rate = LINK_RATE_HIGH3;
|
||||
} else {
|
||||
decide_dp_link_settings(link, link_setting, req_bw);
|
||||
}
|
||||
@@ -1495,7 +1495,7 @@ static bool dpcd_read_sink_ext_caps(struct dc_link *link)
|
||||
|
||||
enum dc_status dp_retrieve_lttpr_cap(struct dc_link *link)
|
||||
{
|
||||
uint8_t lttpr_dpcd_data[8] = {0};
|
||||
uint8_t lttpr_dpcd_data[10] = {0};
|
||||
enum dc_status status;
|
||||
bool is_lttpr_present;
|
||||
|
||||
@@ -1545,6 +1545,10 @@ enum dc_status dp_retrieve_lttpr_cap(struct dc_link *link)
|
||||
lttpr_dpcd_data[DP_PHY_REPEATER_128B132B_RATES -
|
||||
DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV];
|
||||
|
||||
link->dpcd_caps.lttpr_caps.alpm.raw =
|
||||
lttpr_dpcd_data[DP_LTTPR_ALPM_CAPABILITIES -
|
||||
DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV];
|
||||
|
||||
/* If this chip cap is set, at least one retimer must exist in the chain
|
||||
* Override count to 1 if we receive a known bad count (0 or an invalid value) */
|
||||
if ((link->chip_caps & EXT_DISPLAY_PATH_CAPS__DP_FIXED_VS_EN) &&
|
||||
|
||||
@@ -383,10 +383,10 @@ void mod_build_vsc_infopacket(const struct dc_stream_state *stream,
|
||||
colorimetryFormat = ColorimetryYCC_DP_ITU709;
|
||||
else if (cs == COLOR_SPACE_ADOBERGB)
|
||||
colorimetryFormat = ColorimetryYCC_DP_AdobeYCC;
|
||||
else if (cs == COLOR_SPACE_2020_YCBCR)
|
||||
else if (cs == COLOR_SPACE_2020_YCBCR_LIMITED)
|
||||
colorimetryFormat = ColorimetryYCC_DP_ITU2020YCbCr;
|
||||
|
||||
if (cs == COLOR_SPACE_2020_YCBCR && tf == TRANSFER_FUNC_GAMMA_22)
|
||||
if (cs == COLOR_SPACE_2020_YCBCR_LIMITED && tf == TRANSFER_FUNC_GAMMA_22)
|
||||
colorimetryFormat = ColorimetryYCC_DP_ITU709;
|
||||
break;
|
||||
|
||||
|
||||
@@ -2772,6 +2772,7 @@ int smu_get_power_limit(void *handle,
|
||||
switch (amdgpu_ip_version(adev, MP1_HWIP, 0)) {
|
||||
case IP_VERSION(13, 0, 2):
|
||||
case IP_VERSION(13, 0, 6):
|
||||
case IP_VERSION(13, 0, 12):
|
||||
case IP_VERSION(13, 0, 14):
|
||||
case IP_VERSION(11, 0, 7):
|
||||
case IP_VERSION(11, 0, 11):
|
||||
|
||||
@@ -147,7 +147,7 @@ static ssize_t wedged_mode_set(struct file *f, const char __user *ubuf,
|
||||
return -EINVAL;
|
||||
|
||||
if (xe->wedged.mode == wedged_mode)
|
||||
return 0;
|
||||
return size;
|
||||
|
||||
xe->wedged.mode = wedged_mode;
|
||||
|
||||
@@ -156,6 +156,7 @@ static ssize_t wedged_mode_set(struct file *f, const char __user *ubuf,
|
||||
ret = xe_guc_ads_scheduler_policy_toggle_reset(>->uc.guc.ads);
|
||||
if (ret) {
|
||||
xe_gt_err(gt, "Failed to update GuC ADS scheduler policy. GuC may still cause engine reset even with wedged_mode=2\n");
|
||||
xe_pm_runtime_put(xe);
|
||||
return -EIO;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -694,7 +694,9 @@ int xe_device_probe(struct xe_device *xe)
|
||||
}
|
||||
|
||||
/* Allocate and map stolen after potential VRAM resize */
|
||||
xe_ttm_stolen_mgr_init(xe);
|
||||
err = xe_ttm_stolen_mgr_init(xe);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
/*
|
||||
* Now that GT is initialized (TTM in particular),
|
||||
|
||||
@@ -535,6 +535,7 @@ static ssize_t xe_oa_read(struct file *file, char __user *buf,
|
||||
mutex_unlock(&stream->stream_lock);
|
||||
} while (!offset && !ret);
|
||||
} else {
|
||||
xe_oa_buffer_check_unlocked(stream);
|
||||
mutex_lock(&stream->stream_lock);
|
||||
ret = __xe_oa_read(stream, buf, count, &offset);
|
||||
mutex_unlock(&stream->stream_lock);
|
||||
|
||||
@@ -173,9 +173,7 @@ int xe_tile_init_noalloc(struct xe_tile *tile)
|
||||
|
||||
xe_wa_apply_tile_workarounds(tile);
|
||||
|
||||
err = xe_tile_sysfs_init(tile);
|
||||
|
||||
return 0;
|
||||
return xe_tile_sysfs_init(tile);
|
||||
}
|
||||
|
||||
void xe_tile_migrate_wait(struct xe_tile *tile)
|
||||
|
||||
@@ -201,17 +201,16 @@ static u64 detect_stolen(struct xe_device *xe, struct xe_ttm_stolen_mgr *mgr)
|
||||
#endif
|
||||
}
|
||||
|
||||
void xe_ttm_stolen_mgr_init(struct xe_device *xe)
|
||||
int xe_ttm_stolen_mgr_init(struct xe_device *xe)
|
||||
{
|
||||
struct xe_ttm_stolen_mgr *mgr = drmm_kzalloc(&xe->drm, sizeof(*mgr), GFP_KERNEL);
|
||||
struct pci_dev *pdev = to_pci_dev(xe->drm.dev);
|
||||
struct xe_ttm_stolen_mgr *mgr;
|
||||
u64 stolen_size, io_size;
|
||||
int err;
|
||||
|
||||
if (!mgr) {
|
||||
drm_dbg_kms(&xe->drm, "Stolen mgr init failed\n");
|
||||
return;
|
||||
}
|
||||
mgr = drmm_kzalloc(&xe->drm, sizeof(*mgr), GFP_KERNEL);
|
||||
if (!mgr)
|
||||
return -ENOMEM;
|
||||
|
||||
if (IS_SRIOV_VF(xe))
|
||||
stolen_size = 0;
|
||||
@@ -224,7 +223,7 @@ void xe_ttm_stolen_mgr_init(struct xe_device *xe)
|
||||
|
||||
if (!stolen_size) {
|
||||
drm_dbg_kms(&xe->drm, "No stolen memory support\n");
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -240,7 +239,7 @@ void xe_ttm_stolen_mgr_init(struct xe_device *xe)
|
||||
io_size, PAGE_SIZE);
|
||||
if (err) {
|
||||
drm_dbg_kms(&xe->drm, "Stolen mgr init failed: %i\n", err);
|
||||
return;
|
||||
return err;
|
||||
}
|
||||
|
||||
drm_dbg_kms(&xe->drm, "Initialized stolen memory support with %llu bytes\n",
|
||||
@@ -248,6 +247,8 @@ void xe_ttm_stolen_mgr_init(struct xe_device *xe)
|
||||
|
||||
if (io_size)
|
||||
mgr->mapping = devm_ioremap_wc(&pdev->dev, mgr->io_base, io_size);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
u64 xe_ttm_stolen_io_offset(struct xe_bo *bo, u32 offset)
|
||||
|
||||
@@ -12,7 +12,7 @@ struct ttm_resource;
|
||||
struct xe_bo;
|
||||
struct xe_device;
|
||||
|
||||
void xe_ttm_stolen_mgr_init(struct xe_device *xe);
|
||||
int xe_ttm_stolen_mgr_init(struct xe_device *xe);
|
||||
int xe_ttm_stolen_io_mem_reserve(struct xe_device *xe, struct ttm_resource *mem);
|
||||
bool xe_ttm_stolen_cpu_access_needs_ggtt(struct xe_device *xe);
|
||||
u64 xe_ttm_stolen_io_offset(struct xe_bo *bo, u32 offset);
|
||||
|
||||
@@ -860,6 +860,8 @@ static int svc_i3c_master_do_daa_locked(struct svc_i3c_master *master,
|
||||
u32 reg;
|
||||
int ret, i;
|
||||
|
||||
svc_i3c_master_flush_fifo(master);
|
||||
|
||||
while (true) {
|
||||
/* SVC_I3C_MCTRL_REQUEST_PROC_DAA have two mode, ENTER DAA or PROCESS DAA.
|
||||
*
|
||||
|
||||
@@ -80,9 +80,12 @@ unsigned long ib_umem_find_best_pgsz(struct ib_umem *umem,
|
||||
unsigned long pgsz_bitmap,
|
||||
unsigned long virt)
|
||||
{
|
||||
struct scatterlist *sg;
|
||||
unsigned long curr_len = 0;
|
||||
dma_addr_t curr_base = ~0;
|
||||
unsigned long va, pgoff;
|
||||
struct scatterlist *sg;
|
||||
dma_addr_t mask;
|
||||
dma_addr_t end;
|
||||
int i;
|
||||
|
||||
umem->iova = va = virt;
|
||||
@@ -107,17 +110,30 @@ unsigned long ib_umem_find_best_pgsz(struct ib_umem *umem,
|
||||
pgoff = umem->address & ~PAGE_MASK;
|
||||
|
||||
for_each_sgtable_dma_sg(&umem->sgt_append.sgt, sg, i) {
|
||||
/* Walk SGL and reduce max page size if VA/PA bits differ
|
||||
* for any address.
|
||||
/* If the current entry is physically contiguous with the previous
|
||||
* one, no need to take its start addresses into consideration.
|
||||
*/
|
||||
mask |= (sg_dma_address(sg) + pgoff) ^ va;
|
||||
if (check_add_overflow(curr_base, curr_len, &end) ||
|
||||
end != sg_dma_address(sg)) {
|
||||
|
||||
curr_base = sg_dma_address(sg);
|
||||
curr_len = 0;
|
||||
|
||||
/* Reduce max page size if VA/PA bits differ */
|
||||
mask |= (curr_base + pgoff) ^ va;
|
||||
|
||||
/* The alignment of any VA matching a discontinuity point
|
||||
* in the physical memory sets the maximum possible page
|
||||
* size as this must be a starting point of a new page that
|
||||
* needs to be aligned.
|
||||
*/
|
||||
if (i != 0)
|
||||
mask |= va;
|
||||
}
|
||||
|
||||
curr_len += sg_dma_len(sg);
|
||||
va += sg_dma_len(sg) - pgoff;
|
||||
/* Except for the last entry, the ending iova alignment sets
|
||||
* the maximum possible page size as the low bits of the iova
|
||||
* must be zero when starting the next chunk.
|
||||
*/
|
||||
if (i != (umem->sgt_append.sgt.nents - 1))
|
||||
mask |= va;
|
||||
|
||||
pgoff = 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -3109,22 +3109,23 @@ EXPORT_SYMBOL(__rdma_block_iter_start);
|
||||
bool __rdma_block_iter_next(struct ib_block_iter *biter)
|
||||
{
|
||||
unsigned int block_offset;
|
||||
unsigned int sg_delta;
|
||||
unsigned int delta;
|
||||
|
||||
if (!biter->__sg_nents || !biter->__sg)
|
||||
return false;
|
||||
|
||||
biter->__dma_addr = sg_dma_address(biter->__sg) + biter->__sg_advance;
|
||||
block_offset = biter->__dma_addr & (BIT_ULL(biter->__pg_bit) - 1);
|
||||
sg_delta = BIT_ULL(biter->__pg_bit) - block_offset;
|
||||
delta = BIT_ULL(biter->__pg_bit) - block_offset;
|
||||
|
||||
if (sg_dma_len(biter->__sg) - biter->__sg_advance > sg_delta) {
|
||||
biter->__sg_advance += sg_delta;
|
||||
} else {
|
||||
while (biter->__sg_nents && biter->__sg &&
|
||||
sg_dma_len(biter->__sg) - biter->__sg_advance <= delta) {
|
||||
delta -= sg_dma_len(biter->__sg) - biter->__sg_advance;
|
||||
biter->__sg_advance = 0;
|
||||
biter->__sg = sg_next(biter->__sg);
|
||||
biter->__sg_nents--;
|
||||
}
|
||||
biter->__sg_advance += delta;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -2197,7 +2197,7 @@ int iommu_dma_prepare_msi(struct msi_desc *desc, phys_addr_t msi_addr)
|
||||
static DEFINE_MUTEX(msi_prepare_lock); /* see below */
|
||||
|
||||
if (!domain || !domain->iova_cookie) {
|
||||
desc->iommu_cookie = NULL;
|
||||
msi_desc_set_iommu_msi_iova(desc, 0, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2209,11 +2209,12 @@ int iommu_dma_prepare_msi(struct msi_desc *desc, phys_addr_t msi_addr)
|
||||
mutex_lock(&msi_prepare_lock);
|
||||
msi_page = iommu_dma_get_msi_page(dev, msi_addr, domain);
|
||||
mutex_unlock(&msi_prepare_lock);
|
||||
|
||||
msi_desc_set_iommu_cookie(desc, msi_page);
|
||||
|
||||
if (!msi_page)
|
||||
return -ENOMEM;
|
||||
|
||||
msi_desc_set_iommu_msi_iova(
|
||||
desc, msi_page->iova,
|
||||
ilog2(cookie_msi_granule(domain->iova_cookie)));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2224,18 +2225,15 @@ int iommu_dma_prepare_msi(struct msi_desc *desc, phys_addr_t msi_addr)
|
||||
*/
|
||||
void iommu_dma_compose_msi_msg(struct msi_desc *desc, struct msi_msg *msg)
|
||||
{
|
||||
struct device *dev = msi_desc_to_dev(desc);
|
||||
const struct iommu_domain *domain = iommu_get_domain_for_dev(dev);
|
||||
const struct iommu_dma_msi_page *msi_page;
|
||||
#ifdef CONFIG_IRQ_MSI_IOMMU
|
||||
if (desc->iommu_msi_shift) {
|
||||
u64 msi_iova = desc->iommu_msi_iova << desc->iommu_msi_shift;
|
||||
|
||||
msi_page = msi_desc_get_iommu_cookie(desc);
|
||||
|
||||
if (!domain || !domain->iova_cookie || WARN_ON(!msi_page))
|
||||
return;
|
||||
|
||||
msg->address_hi = upper_32_bits(msi_page->iova);
|
||||
msg->address_lo &= cookie_msi_granule(domain->iova_cookie) - 1;
|
||||
msg->address_lo += lower_32_bits(msi_page->iova);
|
||||
msg->address_hi = upper_32_bits(msi_iova);
|
||||
msg->address_lo = lower_32_bits(msi_iova) |
|
||||
(msg->address_lo & ((1 << desc->iommu_msi_shift) - 1));
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static int iommu_dma_init(void)
|
||||
|
||||
@@ -77,6 +77,12 @@ static void imsic_handle_irq(struct irq_desc *desc)
|
||||
struct imsic_vector *vec;
|
||||
unsigned long local_id;
|
||||
|
||||
/*
|
||||
* Process pending local synchronization instead of waiting
|
||||
* for per-CPU local timer to expire.
|
||||
*/
|
||||
imsic_local_sync_all(false);
|
||||
|
||||
chained_irq_enter(chip, desc);
|
||||
|
||||
while ((local_id = csr_swap(CSR_TOPEI, 0))) {
|
||||
@@ -120,7 +126,7 @@ static int imsic_starting_cpu(unsigned int cpu)
|
||||
* Interrupts identities might have been enabled/disabled while
|
||||
* this CPU was not running so sync-up local enable/disable state.
|
||||
*/
|
||||
imsic_local_sync_all();
|
||||
imsic_local_sync_all(true);
|
||||
|
||||
/* Enable local interrupt delivery */
|
||||
imsic_local_delivery(true);
|
||||
|
||||
@@ -96,9 +96,8 @@ static int imsic_irq_set_affinity(struct irq_data *d, const struct cpumask *mask
|
||||
bool force)
|
||||
{
|
||||
struct imsic_vector *old_vec, *new_vec;
|
||||
struct irq_data *pd = d->parent_data;
|
||||
|
||||
old_vec = irq_data_get_irq_chip_data(pd);
|
||||
old_vec = irq_data_get_irq_chip_data(d);
|
||||
if (WARN_ON(!old_vec))
|
||||
return -ENOENT;
|
||||
|
||||
@@ -116,13 +115,13 @@ static int imsic_irq_set_affinity(struct irq_data *d, const struct cpumask *mask
|
||||
return -ENOSPC;
|
||||
|
||||
/* Point device to the new vector */
|
||||
imsic_msi_update_msg(d, new_vec);
|
||||
imsic_msi_update_msg(irq_get_irq_data(d->irq), new_vec);
|
||||
|
||||
/* Update irq descriptors with the new vector */
|
||||
pd->chip_data = new_vec;
|
||||
d->chip_data = new_vec;
|
||||
|
||||
/* Update effective affinity of parent irq data */
|
||||
irq_data_update_effective_affinity(pd, cpumask_of(new_vec->cpu));
|
||||
/* Update effective affinity */
|
||||
irq_data_update_effective_affinity(d, cpumask_of(new_vec->cpu));
|
||||
|
||||
/* Move state of the old vector to the new vector */
|
||||
imsic_vector_move(old_vec, new_vec);
|
||||
@@ -135,6 +134,9 @@ static struct irq_chip imsic_irq_base_chip = {
|
||||
.name = "IMSIC",
|
||||
.irq_mask = imsic_irq_mask,
|
||||
.irq_unmask = imsic_irq_unmask,
|
||||
#ifdef CONFIG_SMP
|
||||
.irq_set_affinity = imsic_irq_set_affinity,
|
||||
#endif
|
||||
.irq_retrigger = imsic_irq_retrigger,
|
||||
.irq_compose_msi_msg = imsic_irq_compose_msg,
|
||||
.flags = IRQCHIP_SKIP_SET_WAKE |
|
||||
@@ -245,7 +247,7 @@ static bool imsic_init_dev_msi_info(struct device *dev,
|
||||
if (WARN_ON_ONCE(domain != real_parent))
|
||||
return false;
|
||||
#ifdef CONFIG_SMP
|
||||
info->chip->irq_set_affinity = imsic_irq_set_affinity;
|
||||
info->chip->irq_set_affinity = irq_chip_set_affinity_parent;
|
||||
#endif
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -124,10 +124,11 @@ void __imsic_eix_update(unsigned long base_id, unsigned long num_id, bool pend,
|
||||
}
|
||||
}
|
||||
|
||||
static void __imsic_local_sync(struct imsic_local_priv *lpriv)
|
||||
static bool __imsic_local_sync(struct imsic_local_priv *lpriv)
|
||||
{
|
||||
struct imsic_local_config *mlocal;
|
||||
struct imsic_vector *vec, *mvec;
|
||||
bool ret = true;
|
||||
int i;
|
||||
|
||||
lockdep_assert_held(&lpriv->lock);
|
||||
@@ -143,35 +144,75 @@ static void __imsic_local_sync(struct imsic_local_priv *lpriv)
|
||||
__imsic_id_clear_enable(i);
|
||||
|
||||
/*
|
||||
* If the ID was being moved to a new ID on some other CPU
|
||||
* then we can get a MSI during the movement so check the
|
||||
* ID pending bit and re-trigger the new ID on other CPU
|
||||
* using MMIO write.
|
||||
* Clear the previous vector pointer of the new vector only
|
||||
* after the movement is complete on the old CPU.
|
||||
*/
|
||||
mvec = READ_ONCE(vec->move);
|
||||
WRITE_ONCE(vec->move, NULL);
|
||||
if (mvec && mvec != vec) {
|
||||
mvec = READ_ONCE(vec->move_prev);
|
||||
if (mvec) {
|
||||
/*
|
||||
* If the old vector has not been updated then
|
||||
* try again in the next sync-up call.
|
||||
*/
|
||||
if (READ_ONCE(mvec->move_next)) {
|
||||
ret = false;
|
||||
continue;
|
||||
}
|
||||
|
||||
WRITE_ONCE(vec->move_prev, NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* If a vector was being moved to a new vector on some other
|
||||
* CPU then we can get a MSI during the movement so check the
|
||||
* ID pending bit and re-trigger the new ID on other CPU using
|
||||
* MMIO write.
|
||||
*/
|
||||
mvec = READ_ONCE(vec->move_next);
|
||||
if (mvec) {
|
||||
if (__imsic_id_read_clear_pending(i)) {
|
||||
mlocal = per_cpu_ptr(imsic->global.local, mvec->cpu);
|
||||
writel_relaxed(mvec->local_id, mlocal->msi_va);
|
||||
}
|
||||
|
||||
WRITE_ONCE(vec->move_next, NULL);
|
||||
imsic_vector_free(&lpriv->vectors[i]);
|
||||
}
|
||||
|
||||
skip:
|
||||
bitmap_clear(lpriv->dirty_bitmap, i, 1);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void imsic_local_sync_all(void)
|
||||
#ifdef CONFIG_SMP
|
||||
static void __imsic_local_timer_start(struct imsic_local_priv *lpriv)
|
||||
{
|
||||
lockdep_assert_held(&lpriv->lock);
|
||||
|
||||
if (!timer_pending(&lpriv->timer)) {
|
||||
lpriv->timer.expires = jiffies + 1;
|
||||
add_timer_on(&lpriv->timer, smp_processor_id());
|
||||
}
|
||||
}
|
||||
#else
|
||||
static inline void __imsic_local_timer_start(struct imsic_local_priv *lpriv)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
void imsic_local_sync_all(bool force_all)
|
||||
{
|
||||
struct imsic_local_priv *lpriv = this_cpu_ptr(imsic->lpriv);
|
||||
unsigned long flags;
|
||||
|
||||
raw_spin_lock_irqsave(&lpriv->lock, flags);
|
||||
bitmap_fill(lpriv->dirty_bitmap, imsic->global.nr_ids + 1);
|
||||
__imsic_local_sync(lpriv);
|
||||
|
||||
if (force_all)
|
||||
bitmap_fill(lpriv->dirty_bitmap, imsic->global.nr_ids + 1);
|
||||
if (!__imsic_local_sync(lpriv))
|
||||
__imsic_local_timer_start(lpriv);
|
||||
|
||||
raw_spin_unlock_irqrestore(&lpriv->lock, flags);
|
||||
}
|
||||
|
||||
@@ -190,12 +231,7 @@ void imsic_local_delivery(bool enable)
|
||||
#ifdef CONFIG_SMP
|
||||
static void imsic_local_timer_callback(struct timer_list *timer)
|
||||
{
|
||||
struct imsic_local_priv *lpriv = this_cpu_ptr(imsic->lpriv);
|
||||
unsigned long flags;
|
||||
|
||||
raw_spin_lock_irqsave(&lpriv->lock, flags);
|
||||
__imsic_local_sync(lpriv);
|
||||
raw_spin_unlock_irqrestore(&lpriv->lock, flags);
|
||||
imsic_local_sync_all(false);
|
||||
}
|
||||
|
||||
static void __imsic_remote_sync(struct imsic_local_priv *lpriv, unsigned int cpu)
|
||||
@@ -216,14 +252,11 @@ static void __imsic_remote_sync(struct imsic_local_priv *lpriv, unsigned int cpu
|
||||
*/
|
||||
if (cpu_online(cpu)) {
|
||||
if (cpu == smp_processor_id()) {
|
||||
__imsic_local_sync(lpriv);
|
||||
return;
|
||||
if (__imsic_local_sync(lpriv))
|
||||
return;
|
||||
}
|
||||
|
||||
if (!timer_pending(&lpriv->timer)) {
|
||||
lpriv->timer.expires = jiffies + 1;
|
||||
add_timer_on(&lpriv->timer, cpu);
|
||||
}
|
||||
__imsic_local_timer_start(lpriv);
|
||||
}
|
||||
}
|
||||
#else
|
||||
@@ -278,8 +311,9 @@ void imsic_vector_unmask(struct imsic_vector *vec)
|
||||
raw_spin_unlock(&lpriv->lock);
|
||||
}
|
||||
|
||||
static bool imsic_vector_move_update(struct imsic_local_priv *lpriv, struct imsic_vector *vec,
|
||||
bool new_enable, struct imsic_vector *new_move)
|
||||
static bool imsic_vector_move_update(struct imsic_local_priv *lpriv,
|
||||
struct imsic_vector *vec, bool is_old_vec,
|
||||
bool new_enable, struct imsic_vector *move_vec)
|
||||
{
|
||||
unsigned long flags;
|
||||
bool enabled;
|
||||
@@ -289,7 +323,10 @@ static bool imsic_vector_move_update(struct imsic_local_priv *lpriv, struct imsi
|
||||
/* Update enable and move details */
|
||||
enabled = READ_ONCE(vec->enable);
|
||||
WRITE_ONCE(vec->enable, new_enable);
|
||||
WRITE_ONCE(vec->move, new_move);
|
||||
if (is_old_vec)
|
||||
WRITE_ONCE(vec->move_next, move_vec);
|
||||
else
|
||||
WRITE_ONCE(vec->move_prev, move_vec);
|
||||
|
||||
/* Mark the vector as dirty and synchronize */
|
||||
bitmap_set(lpriv->dirty_bitmap, vec->local_id, 1);
|
||||
@@ -322,8 +359,8 @@ void imsic_vector_move(struct imsic_vector *old_vec, struct imsic_vector *new_ve
|
||||
* interrupt on the old vector while device was being moved
|
||||
* to the new vector.
|
||||
*/
|
||||
enabled = imsic_vector_move_update(old_lpriv, old_vec, false, new_vec);
|
||||
imsic_vector_move_update(new_lpriv, new_vec, enabled, new_vec);
|
||||
enabled = imsic_vector_move_update(old_lpriv, old_vec, true, false, new_vec);
|
||||
imsic_vector_move_update(new_lpriv, new_vec, false, enabled, old_vec);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_GENERIC_IRQ_DEBUGFS
|
||||
@@ -386,7 +423,8 @@ struct imsic_vector *imsic_vector_alloc(unsigned int hwirq, const struct cpumask
|
||||
vec = &lpriv->vectors[local_id];
|
||||
vec->hwirq = hwirq;
|
||||
vec->enable = false;
|
||||
vec->move = NULL;
|
||||
vec->move_next = NULL;
|
||||
vec->move_prev = NULL;
|
||||
|
||||
return vec;
|
||||
}
|
||||
|
||||
@@ -23,7 +23,8 @@ struct imsic_vector {
|
||||
unsigned int hwirq;
|
||||
/* Details accessed using local lock held */
|
||||
bool enable;
|
||||
struct imsic_vector *move;
|
||||
struct imsic_vector *move_next;
|
||||
struct imsic_vector *move_prev;
|
||||
};
|
||||
|
||||
struct imsic_local_priv {
|
||||
@@ -74,7 +75,7 @@ static inline void __imsic_id_clear_enable(unsigned long id)
|
||||
__imsic_eix_update(id, 1, false, false);
|
||||
}
|
||||
|
||||
void imsic_local_sync_all(void);
|
||||
void imsic_local_sync_all(bool force_all);
|
||||
void imsic_local_delivery(bool enable);
|
||||
|
||||
void imsic_vector_mask(struct imsic_vector *vec);
|
||||
@@ -87,7 +88,7 @@ static inline bool imsic_vector_isenabled(struct imsic_vector *vec)
|
||||
|
||||
static inline struct imsic_vector *imsic_vector_get_move(struct imsic_vector *vec)
|
||||
{
|
||||
return READ_ONCE(vec->move);
|
||||
return READ_ONCE(vec->move_prev);
|
||||
}
|
||||
|
||||
void imsic_vector_move(struct imsic_vector *old_vec, struct imsic_vector *new_vec);
|
||||
|
||||
@@ -1550,14 +1550,18 @@ static void __send_empty_flush(struct clone_info *ci)
|
||||
{
|
||||
struct dm_table *t = ci->map;
|
||||
struct bio flush_bio;
|
||||
blk_opf_t opf = REQ_OP_WRITE | REQ_PREFLUSH | REQ_SYNC;
|
||||
|
||||
if ((ci->io->orig_bio->bi_opf & (REQ_IDLE | REQ_SYNC)) ==
|
||||
(REQ_IDLE | REQ_SYNC))
|
||||
opf |= REQ_IDLE;
|
||||
|
||||
/*
|
||||
* Use an on-stack bio for this, it's safe since we don't
|
||||
* need to reference it after submit. It's just used as
|
||||
* the basis for the clone(s).
|
||||
*/
|
||||
bio_init(&flush_bio, ci->io->md->disk->part0, NULL, 0,
|
||||
REQ_OP_WRITE | REQ_PREFLUSH | REQ_SYNC);
|
||||
bio_init(&flush_bio, ci->io->md->disk->part0, NULL, 0, opf);
|
||||
|
||||
ci->bio = &flush_bio;
|
||||
ci->sector_count = 0;
|
||||
|
||||
@@ -195,6 +195,7 @@ struct adv7180_state;
|
||||
#define ADV7180_FLAG_V2 BIT(1)
|
||||
#define ADV7180_FLAG_MIPI_CSI2 BIT(2)
|
||||
#define ADV7180_FLAG_I2P BIT(3)
|
||||
#define ADV7180_FLAG_TEST_PATTERN BIT(4)
|
||||
|
||||
struct adv7180_chip_info {
|
||||
unsigned int flags;
|
||||
@@ -682,11 +683,15 @@ static int adv7180_init_controls(struct adv7180_state *state)
|
||||
ADV7180_HUE_MAX, 1, ADV7180_HUE_DEF);
|
||||
v4l2_ctrl_new_custom(&state->ctrl_hdl, &adv7180_ctrl_fast_switch, NULL);
|
||||
|
||||
v4l2_ctrl_new_std_menu_items(&state->ctrl_hdl, &adv7180_ctrl_ops,
|
||||
V4L2_CID_TEST_PATTERN,
|
||||
ARRAY_SIZE(test_pattern_menu) - 1,
|
||||
0, ARRAY_SIZE(test_pattern_menu) - 1,
|
||||
test_pattern_menu);
|
||||
if (state->chip_info->flags & ADV7180_FLAG_TEST_PATTERN) {
|
||||
v4l2_ctrl_new_std_menu_items(&state->ctrl_hdl,
|
||||
&adv7180_ctrl_ops,
|
||||
V4L2_CID_TEST_PATTERN,
|
||||
ARRAY_SIZE(test_pattern_menu) - 1,
|
||||
0,
|
||||
ARRAY_SIZE(test_pattern_menu) - 1,
|
||||
test_pattern_menu);
|
||||
}
|
||||
|
||||
state->sd.ctrl_handler = &state->ctrl_hdl;
|
||||
if (state->ctrl_hdl.error) {
|
||||
@@ -1221,7 +1226,7 @@ static const struct adv7180_chip_info adv7182_info = {
|
||||
};
|
||||
|
||||
static const struct adv7180_chip_info adv7280_info = {
|
||||
.flags = ADV7180_FLAG_V2 | ADV7180_FLAG_I2P,
|
||||
.flags = ADV7180_FLAG_V2 | ADV7180_FLAG_I2P | ADV7180_FLAG_TEST_PATTERN,
|
||||
.valid_input_mask = BIT(ADV7182_INPUT_CVBS_AIN1) |
|
||||
BIT(ADV7182_INPUT_CVBS_AIN2) |
|
||||
BIT(ADV7182_INPUT_CVBS_AIN3) |
|
||||
@@ -1235,7 +1240,8 @@ static const struct adv7180_chip_info adv7280_info = {
|
||||
};
|
||||
|
||||
static const struct adv7180_chip_info adv7280_m_info = {
|
||||
.flags = ADV7180_FLAG_V2 | ADV7180_FLAG_MIPI_CSI2 | ADV7180_FLAG_I2P,
|
||||
.flags = ADV7180_FLAG_V2 | ADV7180_FLAG_MIPI_CSI2 | ADV7180_FLAG_I2P |
|
||||
ADV7180_FLAG_TEST_PATTERN,
|
||||
.valid_input_mask = BIT(ADV7182_INPUT_CVBS_AIN1) |
|
||||
BIT(ADV7182_INPUT_CVBS_AIN2) |
|
||||
BIT(ADV7182_INPUT_CVBS_AIN3) |
|
||||
@@ -1256,7 +1262,8 @@ static const struct adv7180_chip_info adv7280_m_info = {
|
||||
};
|
||||
|
||||
static const struct adv7180_chip_info adv7281_info = {
|
||||
.flags = ADV7180_FLAG_V2 | ADV7180_FLAG_MIPI_CSI2,
|
||||
.flags = ADV7180_FLAG_V2 | ADV7180_FLAG_MIPI_CSI2 |
|
||||
ADV7180_FLAG_TEST_PATTERN,
|
||||
.valid_input_mask = BIT(ADV7182_INPUT_CVBS_AIN1) |
|
||||
BIT(ADV7182_INPUT_CVBS_AIN2) |
|
||||
BIT(ADV7182_INPUT_CVBS_AIN7) |
|
||||
@@ -1271,7 +1278,8 @@ static const struct adv7180_chip_info adv7281_info = {
|
||||
};
|
||||
|
||||
static const struct adv7180_chip_info adv7281_m_info = {
|
||||
.flags = ADV7180_FLAG_V2 | ADV7180_FLAG_MIPI_CSI2,
|
||||
.flags = ADV7180_FLAG_V2 | ADV7180_FLAG_MIPI_CSI2 |
|
||||
ADV7180_FLAG_TEST_PATTERN,
|
||||
.valid_input_mask = BIT(ADV7182_INPUT_CVBS_AIN1) |
|
||||
BIT(ADV7182_INPUT_CVBS_AIN2) |
|
||||
BIT(ADV7182_INPUT_CVBS_AIN3) |
|
||||
@@ -1291,7 +1299,8 @@ static const struct adv7180_chip_info adv7281_m_info = {
|
||||
};
|
||||
|
||||
static const struct adv7180_chip_info adv7281_ma_info = {
|
||||
.flags = ADV7180_FLAG_V2 | ADV7180_FLAG_MIPI_CSI2,
|
||||
.flags = ADV7180_FLAG_V2 | ADV7180_FLAG_MIPI_CSI2 |
|
||||
ADV7180_FLAG_TEST_PATTERN,
|
||||
.valid_input_mask = BIT(ADV7182_INPUT_CVBS_AIN1) |
|
||||
BIT(ADV7182_INPUT_CVBS_AIN2) |
|
||||
BIT(ADV7182_INPUT_CVBS_AIN3) |
|
||||
@@ -1316,7 +1325,7 @@ static const struct adv7180_chip_info adv7281_ma_info = {
|
||||
};
|
||||
|
||||
static const struct adv7180_chip_info adv7282_info = {
|
||||
.flags = ADV7180_FLAG_V2 | ADV7180_FLAG_I2P,
|
||||
.flags = ADV7180_FLAG_V2 | ADV7180_FLAG_I2P | ADV7180_FLAG_TEST_PATTERN,
|
||||
.valid_input_mask = BIT(ADV7182_INPUT_CVBS_AIN1) |
|
||||
BIT(ADV7182_INPUT_CVBS_AIN2) |
|
||||
BIT(ADV7182_INPUT_CVBS_AIN7) |
|
||||
@@ -1331,7 +1340,8 @@ static const struct adv7180_chip_info adv7282_info = {
|
||||
};
|
||||
|
||||
static const struct adv7180_chip_info adv7282_m_info = {
|
||||
.flags = ADV7180_FLAG_V2 | ADV7180_FLAG_MIPI_CSI2 | ADV7180_FLAG_I2P,
|
||||
.flags = ADV7180_FLAG_V2 | ADV7180_FLAG_MIPI_CSI2 | ADV7180_FLAG_I2P |
|
||||
ADV7180_FLAG_TEST_PATTERN,
|
||||
.valid_input_mask = BIT(ADV7182_INPUT_CVBS_AIN1) |
|
||||
BIT(ADV7182_INPUT_CVBS_AIN2) |
|
||||
BIT(ADV7182_INPUT_CVBS_AIN3) |
|
||||
|
||||
@@ -74,7 +74,7 @@
|
||||
#define IMX219_REG_VTS CCI_REG16(0x0160)
|
||||
#define IMX219_VTS_MAX 0xffff
|
||||
|
||||
#define IMX219_VBLANK_MIN 4
|
||||
#define IMX219_VBLANK_MIN 32
|
||||
|
||||
/* HBLANK control - read only */
|
||||
#define IMX219_PPL_DEFAULT 3448
|
||||
|
||||
@@ -460,24 +460,20 @@ out:
|
||||
return err;
|
||||
}
|
||||
|
||||
/* Use MHz as base so the div needs no u64 */
|
||||
static u32 tc358746_cfg_to_cnt(unsigned int cfg_val,
|
||||
unsigned int clk_mhz,
|
||||
unsigned int time_base)
|
||||
static u32 tc358746_cfg_to_cnt(unsigned long cfg_val, unsigned long clk_hz,
|
||||
unsigned long long time_base)
|
||||
{
|
||||
return DIV_ROUND_UP(cfg_val * clk_mhz, time_base);
|
||||
return div64_u64((u64)cfg_val * clk_hz + time_base - 1, time_base);
|
||||
}
|
||||
|
||||
static u32 tc358746_ps_to_cnt(unsigned int cfg_val,
|
||||
unsigned int clk_mhz)
|
||||
static u32 tc358746_ps_to_cnt(unsigned long cfg_val, unsigned long clk_hz)
|
||||
{
|
||||
return tc358746_cfg_to_cnt(cfg_val, clk_mhz, USEC_PER_SEC);
|
||||
return tc358746_cfg_to_cnt(cfg_val, clk_hz, PSEC_PER_SEC);
|
||||
}
|
||||
|
||||
static u32 tc358746_us_to_cnt(unsigned int cfg_val,
|
||||
unsigned int clk_mhz)
|
||||
static u32 tc358746_us_to_cnt(unsigned long cfg_val, unsigned long clk_hz)
|
||||
{
|
||||
return tc358746_cfg_to_cnt(cfg_val, clk_mhz, 1);
|
||||
return tc358746_cfg_to_cnt(cfg_val, clk_hz, USEC_PER_SEC);
|
||||
}
|
||||
|
||||
static int tc358746_apply_dphy_config(struct tc358746 *tc358746)
|
||||
@@ -492,7 +488,6 @@ static int tc358746_apply_dphy_config(struct tc358746 *tc358746)
|
||||
|
||||
/* The hs_byte_clk is also called SYSCLK in the excel sheet */
|
||||
hs_byte_clk = cfg->hs_clk_rate / 8;
|
||||
hs_byte_clk /= HZ_PER_MHZ;
|
||||
hf_clk = hs_byte_clk / 2;
|
||||
|
||||
val = tc358746_us_to_cnt(cfg->init, hf_clk) - 1;
|
||||
|
||||
@@ -789,9 +789,14 @@ static int vivid_thread_vid_cap(void *data)
|
||||
next_jiffies_since_start = jiffies_since_start;
|
||||
|
||||
wait_jiffies = next_jiffies_since_start - jiffies_since_start;
|
||||
while (time_is_after_jiffies(cur_jiffies + wait_jiffies) &&
|
||||
!kthread_should_stop())
|
||||
schedule();
|
||||
if (!time_is_after_jiffies(cur_jiffies + wait_jiffies))
|
||||
continue;
|
||||
|
||||
wait_queue_head_t wait;
|
||||
|
||||
init_waitqueue_head(&wait);
|
||||
wait_event_interruptible_timeout(wait, kthread_should_stop(),
|
||||
cur_jiffies + wait_jiffies - jiffies);
|
||||
}
|
||||
dprintk(dev, 1, "Video Capture Thread End\n");
|
||||
return 0;
|
||||
|
||||
@@ -235,9 +235,14 @@ static int vivid_thread_vid_out(void *data)
|
||||
next_jiffies_since_start = jiffies_since_start;
|
||||
|
||||
wait_jiffies = next_jiffies_since_start - jiffies_since_start;
|
||||
while (time_is_after_jiffies(cur_jiffies + wait_jiffies) &&
|
||||
!kthread_should_stop())
|
||||
schedule();
|
||||
if (!time_is_after_jiffies(cur_jiffies + wait_jiffies))
|
||||
continue;
|
||||
|
||||
wait_queue_head_t wait;
|
||||
|
||||
init_waitqueue_head(&wait);
|
||||
wait_event_interruptible_timeout(wait, kthread_should_stop(),
|
||||
cur_jiffies + wait_jiffies - jiffies);
|
||||
}
|
||||
dprintk(dev, 1, "Video Output Thread End\n");
|
||||
return 0;
|
||||
|
||||
@@ -135,9 +135,14 @@ static int vivid_thread_touch_cap(void *data)
|
||||
next_jiffies_since_start = jiffies_since_start;
|
||||
|
||||
wait_jiffies = next_jiffies_since_start - jiffies_since_start;
|
||||
while (time_is_after_jiffies(cur_jiffies + wait_jiffies) &&
|
||||
!kthread_should_stop())
|
||||
schedule();
|
||||
if (!time_is_after_jiffies(cur_jiffies + wait_jiffies))
|
||||
continue;
|
||||
|
||||
wait_queue_head_t wait;
|
||||
|
||||
init_waitqueue_head(&wait);
|
||||
wait_event_interruptible_timeout(wait, kthread_should_stop(),
|
||||
cur_jiffies + wait_jiffies - jiffies);
|
||||
}
|
||||
dprintk(dev, 1, "Touch Capture Thread End\n");
|
||||
return 0;
|
||||
|
||||
@@ -206,9 +206,14 @@ static int vivid_thread_sdr_cap(void *data)
|
||||
next_jiffies_since_start = jiffies_since_start;
|
||||
|
||||
wait_jiffies = next_jiffies_since_start - jiffies_since_start;
|
||||
while (time_is_after_jiffies(cur_jiffies + wait_jiffies) &&
|
||||
!kthread_should_stop())
|
||||
schedule();
|
||||
if (!time_is_after_jiffies(cur_jiffies + wait_jiffies))
|
||||
continue;
|
||||
|
||||
wait_queue_head_t wait;
|
||||
|
||||
init_waitqueue_head(&wait);
|
||||
wait_event_interruptible_timeout(wait, kthread_should_stop(),
|
||||
cur_jiffies + wait_jiffies - jiffies);
|
||||
}
|
||||
dprintk(dev, 1, "SDR Capture Thread End\n");
|
||||
return 0;
|
||||
|
||||
@@ -430,6 +430,8 @@ static int call_enum_dv_timings(struct v4l2_subdev *sd,
|
||||
static int call_get_mbus_config(struct v4l2_subdev *sd, unsigned int pad,
|
||||
struct v4l2_mbus_config *config)
|
||||
{
|
||||
memset(config, 0, sizeof(*config));
|
||||
|
||||
return check_pad(sd, pad) ? :
|
||||
sd->ops->pad->get_mbus_config(sd, pad, config);
|
||||
}
|
||||
|
||||
@@ -214,6 +214,7 @@ static const struct regmap_range axp717_writeable_ranges[] = {
|
||||
regmap_reg_range(AXP717_VSYS_V_POWEROFF, AXP717_VSYS_V_POWEROFF),
|
||||
regmap_reg_range(AXP717_IRQ0_EN, AXP717_IRQ4_EN),
|
||||
regmap_reg_range(AXP717_IRQ0_STATE, AXP717_IRQ4_STATE),
|
||||
regmap_reg_range(AXP717_TS_PIN_CFG, AXP717_TS_PIN_CFG),
|
||||
regmap_reg_range(AXP717_ICC_CHG_SET, AXP717_CV_CHG_SET),
|
||||
regmap_reg_range(AXP717_DCDC_OUTPUT_CONTROL, AXP717_CPUSLDO_CONTROL),
|
||||
regmap_reg_range(AXP717_ADC_CH_EN_CONTROL, AXP717_ADC_CH_EN_CONTROL),
|
||||
|
||||
@@ -304,6 +304,10 @@ static int ee1004_probe(struct i2c_client *client)
|
||||
I2C_FUNC_SMBUS_BYTE | I2C_FUNC_SMBUS_READ_BYTE_DATA))
|
||||
return -EPFNOSUPPORT;
|
||||
|
||||
err = i2c_smbus_read_byte(client);
|
||||
if (err < 0)
|
||||
return -ENODEV;
|
||||
|
||||
mutex_lock(&ee1004_bus_lock);
|
||||
|
||||
err = ee1004_init_bus_data(client);
|
||||
|
||||
@@ -324,7 +324,7 @@ static int c_can_plat_probe(struct platform_device *pdev)
|
||||
/* Check if we need custom RAMINIT via syscon. Mostly for TI
|
||||
* platforms. Only supported with DT boot.
|
||||
*/
|
||||
if (np && of_property_read_bool(np, "syscon-raminit")) {
|
||||
if (np && of_property_present(np, "syscon-raminit")) {
|
||||
u32 id;
|
||||
struct c_can_raminit *raminit = &priv->raminit_sys;
|
||||
|
||||
|
||||
@@ -682,9 +682,9 @@ static struct mlx4_db_pgdir *mlx4_alloc_db_pgdir(struct device *dma_device)
|
||||
}
|
||||
|
||||
static int mlx4_alloc_db_from_pgdir(struct mlx4_db_pgdir *pgdir,
|
||||
struct mlx4_db *db, int order)
|
||||
struct mlx4_db *db, unsigned int order)
|
||||
{
|
||||
int o;
|
||||
unsigned int o;
|
||||
int i;
|
||||
|
||||
for (o = order; o <= 1; ++o) {
|
||||
@@ -712,7 +712,7 @@ found:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int mlx4_db_alloc(struct mlx4_dev *dev, struct mlx4_db *db, int order)
|
||||
int mlx4_db_alloc(struct mlx4_dev *dev, struct mlx4_db *db, unsigned int order)
|
||||
{
|
||||
struct mlx4_priv *priv = mlx4_priv(dev);
|
||||
struct mlx4_db_pgdir *pgdir;
|
||||
|
||||
@@ -450,6 +450,8 @@ int mlx4_en_process_tx_cq(struct net_device *dev,
|
||||
|
||||
if (unlikely(!priv->port_up))
|
||||
return 0;
|
||||
if (unlikely(!napi_budget) && cq->type == TX_XDP)
|
||||
return 0;
|
||||
|
||||
netdev_txq_bql_complete_prefetchw(ring->tx_queue);
|
||||
|
||||
|
||||
@@ -165,6 +165,25 @@ static void ipsec_rx_status_pass_destroy(struct mlx5e_ipsec *ipsec,
|
||||
#endif
|
||||
}
|
||||
|
||||
static void ipsec_rx_rule_add_match_obj(struct mlx5e_ipsec_sa_entry *sa_entry,
|
||||
struct mlx5e_ipsec_rx *rx,
|
||||
struct mlx5_flow_spec *spec)
|
||||
{
|
||||
struct mlx5e_ipsec *ipsec = sa_entry->ipsec;
|
||||
|
||||
if (rx == ipsec->rx_esw) {
|
||||
mlx5_esw_ipsec_rx_rule_add_match_obj(sa_entry, spec);
|
||||
} else {
|
||||
MLX5_SET_TO_ONES(fte_match_param, spec->match_criteria,
|
||||
misc_parameters_2.metadata_reg_c_2);
|
||||
MLX5_SET(fte_match_param, spec->match_value,
|
||||
misc_parameters_2.metadata_reg_c_2,
|
||||
sa_entry->ipsec_obj_id | BIT(31));
|
||||
|
||||
spec->match_criteria_enable |= MLX5_MATCH_MISC_PARAMETERS_2;
|
||||
}
|
||||
}
|
||||
|
||||
static int rx_add_rule_drop_auth_trailer(struct mlx5e_ipsec_sa_entry *sa_entry,
|
||||
struct mlx5e_ipsec_rx *rx)
|
||||
{
|
||||
@@ -200,11 +219,8 @@ static int rx_add_rule_drop_auth_trailer(struct mlx5e_ipsec_sa_entry *sa_entry,
|
||||
|
||||
MLX5_SET_TO_ONES(fte_match_param, spec->match_criteria, misc_parameters_2.ipsec_syndrome);
|
||||
MLX5_SET(fte_match_param, spec->match_value, misc_parameters_2.ipsec_syndrome, 1);
|
||||
MLX5_SET_TO_ONES(fte_match_param, spec->match_criteria, misc_parameters_2.metadata_reg_c_2);
|
||||
MLX5_SET(fte_match_param, spec->match_value,
|
||||
misc_parameters_2.metadata_reg_c_2,
|
||||
sa_entry->ipsec_obj_id | BIT(31));
|
||||
spec->match_criteria_enable = MLX5_MATCH_MISC_PARAMETERS_2;
|
||||
ipsec_rx_rule_add_match_obj(sa_entry, rx, spec);
|
||||
rule = mlx5_add_flow_rules(ft, spec, &flow_act, &dest, 1);
|
||||
if (IS_ERR(rule)) {
|
||||
err = PTR_ERR(rule);
|
||||
@@ -281,10 +297,8 @@ static int rx_add_rule_drop_replay(struct mlx5e_ipsec_sa_entry *sa_entry, struct
|
||||
|
||||
MLX5_SET_TO_ONES(fte_match_param, spec->match_criteria, misc_parameters_2.metadata_reg_c_4);
|
||||
MLX5_SET(fte_match_param, spec->match_value, misc_parameters_2.metadata_reg_c_4, 1);
|
||||
MLX5_SET_TO_ONES(fte_match_param, spec->match_criteria, misc_parameters_2.metadata_reg_c_2);
|
||||
MLX5_SET(fte_match_param, spec->match_value, misc_parameters_2.metadata_reg_c_2,
|
||||
sa_entry->ipsec_obj_id | BIT(31));
|
||||
spec->match_criteria_enable = MLX5_MATCH_MISC_PARAMETERS_2;
|
||||
ipsec_rx_rule_add_match_obj(sa_entry, rx, spec);
|
||||
rule = mlx5_add_flow_rules(ft, spec, &flow_act, &dest, 1);
|
||||
if (IS_ERR(rule)) {
|
||||
err = PTR_ERR(rule);
|
||||
|
||||
@@ -85,6 +85,19 @@ err_header_alloc:
|
||||
return err;
|
||||
}
|
||||
|
||||
void mlx5_esw_ipsec_rx_rule_add_match_obj(struct mlx5e_ipsec_sa_entry *sa_entry,
|
||||
struct mlx5_flow_spec *spec)
|
||||
{
|
||||
MLX5_SET(fte_match_param, spec->match_criteria,
|
||||
misc_parameters_2.metadata_reg_c_1,
|
||||
ESW_IPSEC_RX_MAPPED_ID_MATCH_MASK);
|
||||
MLX5_SET(fte_match_param, spec->match_value,
|
||||
misc_parameters_2.metadata_reg_c_1,
|
||||
sa_entry->rx_mapped_id << ESW_ZONE_ID_BITS);
|
||||
|
||||
spec->match_criteria_enable |= MLX5_MATCH_MISC_PARAMETERS_2;
|
||||
}
|
||||
|
||||
void mlx5_esw_ipsec_rx_id_mapping_remove(struct mlx5e_ipsec_sa_entry *sa_entry)
|
||||
{
|
||||
struct mlx5e_ipsec *ipsec = sa_entry->ipsec;
|
||||
|
||||
@@ -20,6 +20,8 @@ int mlx5_esw_ipsec_rx_ipsec_obj_id_search(struct mlx5e_priv *priv, u32 id,
|
||||
void mlx5_esw_ipsec_tx_create_attr_set(struct mlx5e_ipsec *ipsec,
|
||||
struct mlx5e_ipsec_tx_create_attr *attr);
|
||||
void mlx5_esw_ipsec_restore_dest_uplink(struct mlx5_core_dev *mdev);
|
||||
void mlx5_esw_ipsec_rx_rule_add_match_obj(struct mlx5e_ipsec_sa_entry *sa_entry,
|
||||
struct mlx5_flow_spec *spec);
|
||||
#else
|
||||
static inline void mlx5_esw_ipsec_rx_create_attr_set(struct mlx5e_ipsec *ipsec,
|
||||
struct mlx5e_ipsec_rx_create_attr *attr) {}
|
||||
@@ -48,5 +50,8 @@ static inline void mlx5_esw_ipsec_tx_create_attr_set(struct mlx5e_ipsec *ipsec,
|
||||
struct mlx5e_ipsec_tx_create_attr *attr) {}
|
||||
|
||||
static inline void mlx5_esw_ipsec_restore_dest_uplink(struct mlx5_core_dev *mdev) {}
|
||||
static inline void
|
||||
mlx5_esw_ipsec_rx_rule_add_match_obj(struct mlx5e_ipsec_sa_entry *sa_entry,
|
||||
struct mlx5_flow_spec *spec) {}
|
||||
#endif /* CONFIG_MLX5_ESWITCH */
|
||||
#endif /* __MLX5_ESW_IPSEC_FS_H__ */
|
||||
|
||||
@@ -96,7 +96,7 @@ static int esw_create_legacy_fdb_table(struct mlx5_eswitch *esw)
|
||||
if (!flow_group_in)
|
||||
return -ENOMEM;
|
||||
|
||||
ft_attr.max_fte = POOL_NEXT_SIZE;
|
||||
ft_attr.max_fte = MLX5_FS_MAX_POOL_SIZE;
|
||||
ft_attr.prio = LEGACY_FDB_PRIO;
|
||||
fdb = mlx5_create_flow_table(root_ns, &ft_attr);
|
||||
if (IS_ERR(fdb)) {
|
||||
|
||||
@@ -163,11 +163,16 @@ static int temp_warn(struct notifier_block *nb, unsigned long type, void *data)
|
||||
u64 value_msb;
|
||||
|
||||
value_lsb = be64_to_cpu(eqe->data.temp_warning.sensor_warning_lsb);
|
||||
/* bit 1-63 are not supported for NICs,
|
||||
* hence read only bit 0 (asic) from lsb.
|
||||
*/
|
||||
value_lsb &= 0x1;
|
||||
value_msb = be64_to_cpu(eqe->data.temp_warning.sensor_warning_msb);
|
||||
|
||||
mlx5_core_warn(events->dev,
|
||||
"High temperature on sensors with bit set %llx %llx",
|
||||
value_msb, value_lsb);
|
||||
if (net_ratelimit())
|
||||
mlx5_core_warn(events->dev,
|
||||
"High temperature on sensors with bit set %llx %llx",
|
||||
value_msb, value_lsb);
|
||||
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
@@ -50,10 +50,12 @@ mlx5_ft_pool_get_avail_sz(struct mlx5_core_dev *dev, enum fs_flow_table_type tab
|
||||
int i, found_i = -1;
|
||||
|
||||
for (i = ARRAY_SIZE(FT_POOLS) - 1; i >= 0; i--) {
|
||||
if (dev->priv.ft_pool->ft_left[i] && FT_POOLS[i] >= desired_size &&
|
||||
if (dev->priv.ft_pool->ft_left[i] &&
|
||||
(FT_POOLS[i] >= desired_size ||
|
||||
desired_size == MLX5_FS_MAX_POOL_SIZE) &&
|
||||
FT_POOLS[i] <= max_ft_size) {
|
||||
found_i = i;
|
||||
if (desired_size != POOL_NEXT_SIZE)
|
||||
if (desired_size != MLX5_FS_MAX_POOL_SIZE)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,8 +7,6 @@
|
||||
#include <linux/mlx5/driver.h>
|
||||
#include "fs_core.h"
|
||||
|
||||
#define POOL_NEXT_SIZE 0
|
||||
|
||||
int mlx5_ft_pool_init(struct mlx5_core_dev *dev);
|
||||
void mlx5_ft_pool_destroy(struct mlx5_core_dev *dev);
|
||||
|
||||
|
||||
@@ -161,7 +161,8 @@ mlx5_chains_create_table(struct mlx5_fs_chains *chains,
|
||||
ft_attr.flags |= (MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT |
|
||||
MLX5_FLOW_TABLE_TUNNEL_EN_DECAP);
|
||||
|
||||
sz = (chain == mlx5_chains_get_nf_ft_chain(chains)) ? FT_TBL_SZ : POOL_NEXT_SIZE;
|
||||
sz = (chain == mlx5_chains_get_nf_ft_chain(chains)) ?
|
||||
FT_TBL_SZ : MLX5_FS_MAX_POOL_SIZE;
|
||||
ft_attr.max_fte = sz;
|
||||
|
||||
/* We use chains_default_ft(chains) as the table's next_ft till
|
||||
|
||||
@@ -590,6 +590,9 @@ static int loongson_dwmac_probe(struct pci_dev *pdev, const struct pci_device_id
|
||||
if (ret)
|
||||
goto err_disable_device;
|
||||
|
||||
plat->tx_fifo_size = SZ_16K * plat->tx_queues_to_use;
|
||||
plat->rx_fifo_size = SZ_16K * plat->rx_queues_to_use;
|
||||
|
||||
if (dev_of_node(&pdev->dev))
|
||||
ret = loongson_dwmac_dt_config(pdev, plat, &res);
|
||||
else
|
||||
|
||||
@@ -4340,6 +4340,7 @@ static int vxlan_changelink(struct net_device *dev, struct nlattr *tb[],
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct vxlan_dev *vxlan = netdev_priv(dev);
|
||||
bool rem_ip_changed, change_igmp;
|
||||
struct net_device *lowerdev;
|
||||
struct vxlan_config conf;
|
||||
struct vxlan_rdst *dst;
|
||||
@@ -4363,8 +4364,13 @@ static int vxlan_changelink(struct net_device *dev, struct nlattr *tb[],
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
rem_ip_changed = !vxlan_addr_equal(&conf.remote_ip, &dst->remote_ip);
|
||||
change_igmp = vxlan->dev->flags & IFF_UP &&
|
||||
(rem_ip_changed ||
|
||||
dst->remote_ifindex != conf.remote_ifindex);
|
||||
|
||||
/* handle default dst entry */
|
||||
if (!vxlan_addr_equal(&conf.remote_ip, &dst->remote_ip)) {
|
||||
if (rem_ip_changed) {
|
||||
u32 hash_index = fdb_head_index(vxlan, all_zeros_mac, conf.vni);
|
||||
|
||||
spin_lock_bh(&vxlan->hash_lock[hash_index]);
|
||||
@@ -4408,6 +4414,9 @@ static int vxlan_changelink(struct net_device *dev, struct nlattr *tb[],
|
||||
}
|
||||
}
|
||||
|
||||
if (change_igmp && vxlan_addr_multicast(&dst->remote_ip))
|
||||
err = vxlan_multicast_leave(vxlan);
|
||||
|
||||
if (conf.age_interval != vxlan->cfg.age_interval)
|
||||
mod_timer(&vxlan->age_timer, jiffies);
|
||||
|
||||
@@ -4415,7 +4424,12 @@ static int vxlan_changelink(struct net_device *dev, struct nlattr *tb[],
|
||||
if (lowerdev && lowerdev != dst->remote_dev)
|
||||
dst->remote_dev = lowerdev;
|
||||
vxlan_config_apply(dev, &conf, lowerdev, vxlan->net, true);
|
||||
return 0;
|
||||
|
||||
if (!err && change_igmp &&
|
||||
vxlan_addr_multicast(&dst->remote_ip))
|
||||
err = vxlan_multicast_join(vxlan);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static void vxlan_dellink(struct net_device *dev, struct list_head *head)
|
||||
|
||||
@@ -1543,6 +1543,7 @@ static void rtw_init_ht_cap(struct rtw_dev *rtwdev,
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
int i;
|
||||
|
||||
ht_cap->ht_supported = true;
|
||||
ht_cap->cap = 0;
|
||||
@@ -1562,25 +1563,20 @@ static void rtw_init_ht_cap(struct rtw_dev *rtwdev,
|
||||
ht_cap->ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
|
||||
ht_cap->ampdu_density = chip->ampdu_density;
|
||||
ht_cap->mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
|
||||
if (efuse->hw_cap.nss > 1) {
|
||||
ht_cap->mcs.rx_mask[0] = 0xFF;
|
||||
ht_cap->mcs.rx_mask[1] = 0xFF;
|
||||
ht_cap->mcs.rx_mask[4] = 0x01;
|
||||
ht_cap->mcs.rx_highest = cpu_to_le16(300);
|
||||
} else {
|
||||
ht_cap->mcs.rx_mask[0] = 0xFF;
|
||||
ht_cap->mcs.rx_mask[1] = 0x00;
|
||||
ht_cap->mcs.rx_mask[4] = 0x01;
|
||||
ht_cap->mcs.rx_highest = cpu_to_le16(150);
|
||||
}
|
||||
|
||||
for (i = 0; i < efuse->hw_cap.nss; i++)
|
||||
ht_cap->mcs.rx_mask[i] = 0xFF;
|
||||
ht_cap->mcs.rx_mask[4] = 0x01;
|
||||
ht_cap->mcs.rx_highest = cpu_to_le16(150 * efuse->hw_cap.nss);
|
||||
}
|
||||
|
||||
static void rtw_init_vht_cap(struct rtw_dev *rtwdev,
|
||||
struct ieee80211_sta_vht_cap *vht_cap)
|
||||
{
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
u16 mcs_map;
|
||||
u16 mcs_map = 0;
|
||||
__le16 highest;
|
||||
int i;
|
||||
|
||||
if (efuse->hw_cap.ptcl != EFUSE_HW_CAP_IGNORE &&
|
||||
efuse->hw_cap.ptcl != EFUSE_HW_CAP_PTCL_VHT)
|
||||
@@ -1603,21 +1599,15 @@ static void rtw_init_vht_cap(struct rtw_dev *rtwdev,
|
||||
if (rtw_chip_has_rx_ldpc(rtwdev))
|
||||
vht_cap->cap |= IEEE80211_VHT_CAP_RXLDPC;
|
||||
|
||||
mcs_map = IEEE80211_VHT_MCS_SUPPORT_0_9 << 0 |
|
||||
IEEE80211_VHT_MCS_NOT_SUPPORTED << 4 |
|
||||
IEEE80211_VHT_MCS_NOT_SUPPORTED << 6 |
|
||||
IEEE80211_VHT_MCS_NOT_SUPPORTED << 8 |
|
||||
IEEE80211_VHT_MCS_NOT_SUPPORTED << 10 |
|
||||
IEEE80211_VHT_MCS_NOT_SUPPORTED << 12 |
|
||||
IEEE80211_VHT_MCS_NOT_SUPPORTED << 14;
|
||||
if (efuse->hw_cap.nss > 1) {
|
||||
highest = cpu_to_le16(780);
|
||||
mcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << 2;
|
||||
} else {
|
||||
highest = cpu_to_le16(390);
|
||||
mcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << 2;
|
||||
for (i = 0; i < 8; i++) {
|
||||
if (i < efuse->hw_cap.nss)
|
||||
mcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
|
||||
else
|
||||
mcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
|
||||
}
|
||||
|
||||
highest = cpu_to_le16(390 * efuse->hw_cap.nss);
|
||||
|
||||
vht_cap->vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
|
||||
vht_cap->vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
|
||||
vht_cap->vht_mcs.rx_highest = highest;
|
||||
|
||||
@@ -101,7 +101,8 @@ void rtw_desc_to_mcsrate(u16 rate, u8 *mcs, u8 *nss)
|
||||
*nss = 4;
|
||||
*mcs = rate - DESC_RATEVHT4SS_MCS0;
|
||||
} else if (rate >= DESC_RATEMCS0 &&
|
||||
rate <= DESC_RATEMCS15) {
|
||||
rate <= DESC_RATEMCS31) {
|
||||
*nss = 0;
|
||||
*mcs = rate - DESC_RATEMCS0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ struct rtw89_dev;
|
||||
struct rtw89_pci_info;
|
||||
struct rtw89_mac_gen_def;
|
||||
struct rtw89_phy_gen_def;
|
||||
struct rtw89_fw_blacklist;
|
||||
struct rtw89_efuse_block_cfg;
|
||||
struct rtw89_h2c_rf_tssi;
|
||||
struct rtw89_fw_txpwr_track_cfg;
|
||||
@@ -4232,6 +4233,7 @@ struct rtw89_chip_info {
|
||||
bool try_ce_fw;
|
||||
u8 bbmcu_nr;
|
||||
u32 needed_fw_elms;
|
||||
const struct rtw89_fw_blacklist *fw_blacklist;
|
||||
u32 fifo_size;
|
||||
bool small_fifo_size;
|
||||
u32 dle_scc_rsvd_size;
|
||||
|
||||
@@ -38,6 +38,16 @@ struct rtw89_arp_rsp {
|
||||
|
||||
static const u8 mss_signature[] = {0x4D, 0x53, 0x53, 0x4B, 0x50, 0x4F, 0x4F, 0x4C};
|
||||
|
||||
const struct rtw89_fw_blacklist rtw89_fw_blacklist_default = {
|
||||
.ver = 0x00,
|
||||
.list = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
|
||||
},
|
||||
};
|
||||
EXPORT_SYMBOL(rtw89_fw_blacklist_default);
|
||||
|
||||
union rtw89_fw_element_arg {
|
||||
size_t offset;
|
||||
enum rtw89_rf_path rf_path;
|
||||
@@ -285,7 +295,7 @@ static int __parse_formatted_mssc(struct rtw89_dev *rtwdev,
|
||||
if (!sec->secure_boot)
|
||||
goto out;
|
||||
|
||||
sb_sel_ver = le32_to_cpu(section_content->sb_sel_ver.v);
|
||||
sb_sel_ver = get_unaligned_le32(§ion_content->sb_sel_ver.v);
|
||||
if (sb_sel_ver && sb_sel_ver != sec->sb_sel_mgn)
|
||||
goto ignore;
|
||||
|
||||
@@ -315,6 +325,46 @@ ignore:
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __check_secure_blacklist(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_fw_bin_info *info,
|
||||
struct rtw89_fw_hdr_section_info *section_info,
|
||||
const void *content)
|
||||
{
|
||||
const struct rtw89_fw_blacklist *chip_blacklist = rtwdev->chip->fw_blacklist;
|
||||
const union rtw89_fw_section_mssc_content *section_content = content;
|
||||
struct rtw89_fw_secure *sec = &rtwdev->fw.sec;
|
||||
u8 byte_idx;
|
||||
u8 bit_mask;
|
||||
|
||||
if (!sec->secure_boot)
|
||||
return 0;
|
||||
|
||||
if (!info->secure_section_exist || section_info->ignore)
|
||||
return 0;
|
||||
|
||||
if (!chip_blacklist) {
|
||||
rtw89_err(rtwdev, "chip no blacklist for secure firmware\n");
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
byte_idx = section_content->blacklist.bit_in_chip_list >> 3;
|
||||
bit_mask = BIT(section_content->blacklist.bit_in_chip_list & 0x7);
|
||||
|
||||
if (section_content->blacklist.ver > chip_blacklist->ver) {
|
||||
rtw89_err(rtwdev, "chip blacklist out of date (%u, %u)\n",
|
||||
section_content->blacklist.ver, chip_blacklist->ver);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (chip_blacklist->list[byte_idx] & bit_mask) {
|
||||
rtw89_err(rtwdev, "firmware %u in chip blacklist\n",
|
||||
section_content->blacklist.ver);
|
||||
return -EPERM;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __parse_security_section(struct rtw89_dev *rtwdev,
|
||||
struct rtw89_fw_bin_info *info,
|
||||
struct rtw89_fw_hdr_section_info *section_info,
|
||||
@@ -340,7 +390,7 @@ static int __parse_security_section(struct rtw89_dev *rtwdev,
|
||||
info->secure_section_exist = true;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return __check_secure_blacklist(rtwdev, info, section_info, content);
|
||||
}
|
||||
|
||||
static int rtw89_fw_hdr_parser_v1(struct rtw89_dev *rtwdev, const u8 *fw, u32 len,
|
||||
@@ -1234,7 +1284,6 @@ static int __rtw89_fw_download_hdr(struct rtw89_dev *rtwdev,
|
||||
ret = rtw89_h2c_tx(rtwdev, skb, false);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "failed to send h2c\n");
|
||||
ret = -1;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
@@ -1311,7 +1360,6 @@ static int __rtw89_fw_download_main(struct rtw89_dev *rtwdev,
|
||||
ret = rtw89_h2c_tx(rtwdev, skb, true);
|
||||
if (ret) {
|
||||
rtw89_err(rtwdev, "failed to send h2c\n");
|
||||
ret = -1;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
@@ -3080,9 +3128,10 @@ int rtw89_fw_h2c_assoc_cmac_tbl_g7(struct rtw89_dev *rtwdev,
|
||||
CCTLINFO_G7_W5_NOMINAL_PKT_PADDING3 |
|
||||
CCTLINFO_G7_W5_NOMINAL_PKT_PADDING4);
|
||||
|
||||
h2c->w6 = le32_encode_bits(vif->type == NL80211_IFTYPE_STATION ? 1 : 0,
|
||||
h2c->w6 = le32_encode_bits(vif->cfg.aid, CCTLINFO_G7_W6_AID12_PAID) |
|
||||
le32_encode_bits(vif->type == NL80211_IFTYPE_STATION ? 1 : 0,
|
||||
CCTLINFO_G7_W6_ULDL);
|
||||
h2c->m6 = cpu_to_le32(CCTLINFO_G7_W6_ULDL);
|
||||
h2c->m6 = cpu_to_le32(CCTLINFO_G7_W6_AID12_PAID | CCTLINFO_G7_W6_ULDL);
|
||||
|
||||
if (rtwsta_link) {
|
||||
h2c->w8 = le32_encode_bits(link_sta->he_cap.has_he,
|
||||
|
||||
@@ -639,6 +639,11 @@ struct rtw89_fw_mss_pool_hdr {
|
||||
} __packed;
|
||||
|
||||
union rtw89_fw_section_mssc_content {
|
||||
struct {
|
||||
u8 pad[0x20];
|
||||
u8 bit_in_chip_list;
|
||||
u8 ver;
|
||||
} __packed blacklist;
|
||||
struct {
|
||||
u8 pad[58];
|
||||
__le32 v;
|
||||
@@ -649,6 +654,13 @@ union rtw89_fw_section_mssc_content {
|
||||
} __packed key_sign_len;
|
||||
} __packed;
|
||||
|
||||
struct rtw89_fw_blacklist {
|
||||
u8 ver;
|
||||
u8 list[32];
|
||||
};
|
||||
|
||||
extern const struct rtw89_fw_blacklist rtw89_fw_blacklist_default;
|
||||
|
||||
static inline void SET_CTRL_INFO_MACID(void *table, u32 val)
|
||||
{
|
||||
le32p_replace_bits((__le32 *)(table) + 0, val, GENMASK(6, 0));
|
||||
|
||||
@@ -2443,6 +2443,7 @@ const struct rtw89_chip_info rtw8851b_chip_info = {
|
||||
.try_ce_fw = true,
|
||||
.bbmcu_nr = 0,
|
||||
.needed_fw_elms = 0,
|
||||
.fw_blacklist = NULL,
|
||||
.fifo_size = 196608,
|
||||
.small_fifo_size = true,
|
||||
.dle_scc_rsvd_size = 98304,
|
||||
|
||||
@@ -2159,6 +2159,7 @@ const struct rtw89_chip_info rtw8852a_chip_info = {
|
||||
.try_ce_fw = false,
|
||||
.bbmcu_nr = 0,
|
||||
.needed_fw_elms = 0,
|
||||
.fw_blacklist = NULL,
|
||||
.fifo_size = 458752,
|
||||
.small_fifo_size = false,
|
||||
.dle_scc_rsvd_size = 0,
|
||||
|
||||
@@ -797,6 +797,7 @@ const struct rtw89_chip_info rtw8852b_chip_info = {
|
||||
.try_ce_fw = true,
|
||||
.bbmcu_nr = 0,
|
||||
.needed_fw_elms = 0,
|
||||
.fw_blacklist = &rtw89_fw_blacklist_default,
|
||||
.fifo_size = 196608,
|
||||
.small_fifo_size = true,
|
||||
.dle_scc_rsvd_size = 98304,
|
||||
|
||||
@@ -731,6 +731,7 @@ const struct rtw89_chip_info rtw8852bt_chip_info = {
|
||||
.try_ce_fw = true,
|
||||
.bbmcu_nr = 0,
|
||||
.needed_fw_elms = RTW89_AX_GEN_DEF_NEEDED_FW_ELEMENTS_NO_6GHZ,
|
||||
.fw_blacklist = &rtw89_fw_blacklist_default,
|
||||
.fifo_size = 458752,
|
||||
.small_fifo_size = true,
|
||||
.dle_scc_rsvd_size = 98304,
|
||||
|
||||
@@ -2936,6 +2936,7 @@ const struct rtw89_chip_info rtw8852c_chip_info = {
|
||||
.try_ce_fw = false,
|
||||
.bbmcu_nr = 0,
|
||||
.needed_fw_elms = 0,
|
||||
.fw_blacklist = &rtw89_fw_blacklist_default,
|
||||
.fifo_size = 458752,
|
||||
.small_fifo_size = false,
|
||||
.dle_scc_rsvd_size = 0,
|
||||
|
||||
@@ -2632,6 +2632,7 @@ const struct rtw89_chip_info rtw8922a_chip_info = {
|
||||
.try_ce_fw = false,
|
||||
.bbmcu_nr = 1,
|
||||
.needed_fw_elms = RTW89_BE_GEN_DEF_NEEDED_FW_ELEMENTS,
|
||||
.fw_blacklist = &rtw89_fw_blacklist_default,
|
||||
.fifo_size = 589824,
|
||||
.small_fifo_size = false,
|
||||
.dle_scc_rsvd_size = 0,
|
||||
|
||||
@@ -194,6 +194,12 @@ config PCI_P2PDMA
|
||||
P2P DMA transactions must be between devices behind the same root
|
||||
port.
|
||||
|
||||
Enabling this option will reduce the entropy of x86 KASLR memory
|
||||
regions. For example - on a 46 bit system, the entropy goes down
|
||||
from 16 bits to 15 bits. The actual reduction in entropy depends
|
||||
on the physical address bits, on processor features, kernel config
|
||||
(5 level page table) and physical memory present on the system.
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
config PCI_LABEL
|
||||
|
||||
@@ -125,7 +125,7 @@ static const struct pci_epf_mhi_ep_info sm8450_info = {
|
||||
|
||||
static struct pci_epf_header sa8775p_header = {
|
||||
.vendorid = PCI_VENDOR_ID_QCOM,
|
||||
.deviceid = 0x0306, /* FIXME: Update deviceid for sa8775p EP */
|
||||
.deviceid = 0x0116,
|
||||
.baseclass_code = PCI_CLASS_OTHERS,
|
||||
.interrupt_pin = PCI_INTERRUPT_INTA,
|
||||
};
|
||||
|
||||
@@ -814,11 +814,9 @@ static resource_size_t calculate_iosize(resource_size_t size,
|
||||
size = (size & 0xff) + ((size & ~0xffUL) << 2);
|
||||
#endif
|
||||
size = size + size1;
|
||||
if (size < old_size)
|
||||
size = old_size;
|
||||
|
||||
size = ALIGN(max(size, add_size) + children_add_size, align);
|
||||
return size;
|
||||
size = max(size, add_size) + children_add_size;
|
||||
return ALIGN(max(size, old_size), align);
|
||||
}
|
||||
|
||||
static resource_size_t calculate_memsize(resource_size_t size,
|
||||
|
||||
@@ -405,13 +405,14 @@ EXPORT_SYMBOL_GPL(phy_power_off);
|
||||
|
||||
int phy_set_mode_ext(struct phy *phy, enum phy_mode mode, int submode)
|
||||
{
|
||||
int ret;
|
||||
int ret = 0;
|
||||
|
||||
if (!phy || !phy->ops->set_mode)
|
||||
if (!phy)
|
||||
return 0;
|
||||
|
||||
mutex_lock(&phy->mutex);
|
||||
ret = phy->ops->set_mode(phy, mode, submode);
|
||||
if (phy->ops->set_mode)
|
||||
ret = phy->ops->set_mode(phy, mode, submode);
|
||||
if (!ret)
|
||||
phy->attrs.mode = mode;
|
||||
mutex_unlock(&phy->mutex);
|
||||
|
||||
@@ -94,8 +94,8 @@
|
||||
#define LCPLL_ALONE_MODE BIT(1)
|
||||
/* CMN_REG(0097) */
|
||||
#define DIG_CLK_SEL BIT(1)
|
||||
#define ROPLL_REF BIT(1)
|
||||
#define LCPLL_REF 0
|
||||
#define LCPLL_REF BIT(1)
|
||||
#define ROPLL_REF 0
|
||||
/* CMN_REG(0099) */
|
||||
#define CMN_ROPLL_ALONE_MODE BIT(2)
|
||||
#define ROPLL_ALONE_MODE BIT(2)
|
||||
|
||||
@@ -1513,8 +1513,11 @@ static const struct exynos5_usbdrd_phy_tuning gs101_tunes_pipe3_preinit[] = {
|
||||
PHY_TUNING_ENTRY_PMA(0x09e0, -1, 0x00),
|
||||
PHY_TUNING_ENTRY_PMA(0x09e4, -1, 0x36),
|
||||
PHY_TUNING_ENTRY_PMA(0x1e7c, -1, 0x06),
|
||||
PHY_TUNING_ENTRY_PMA(0x1e90, -1, 0x00),
|
||||
PHY_TUNING_ENTRY_PMA(0x1e94, -1, 0x36),
|
||||
PHY_TUNING_ENTRY_PMA(0x19e0, -1, 0x00),
|
||||
PHY_TUNING_ENTRY_PMA(0x19e4, -1, 0x36),
|
||||
/* fix bootloader bug */
|
||||
PHY_TUNING_ENTRY_PMA(0x1e90, -1, 0x02),
|
||||
PHY_TUNING_ENTRY_PMA(0x1e94, -1, 0x0b),
|
||||
/* improve LVCC */
|
||||
PHY_TUNING_ENTRY_PMA(0x08f0, -1, 0x30),
|
||||
PHY_TUNING_ENTRY_PMA(0x18f0, -1, 0x30),
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user