mirror of
https://github.com/torvalds/linux.git
synced 2026-06-07 05:55:44 +02:00
Merge a0b9631487 ("Merge tag 'xfs-5.11-merge-4' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux") into android-mainline
Steps on the way to 5.11-rc1 Resolves conflicts in: drivers/dma-buf/heaps/cma_heap.c drivers/dma-buf/heaps/system_heap.c Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: Iac498252911dd67ee21bba42b3fa5a2324dd43e0
This commit is contained in:
commit
20aa838e04
|
|
@ -159,6 +159,8 @@ properties:
|
|||
- innolux,g121x1-l03
|
||||
# Innolux Corporation 11.6" WXGA (1366x768) TFT LCD panel
|
||||
- innolux,n116bge
|
||||
# InnoLux 13.3" FHD (1920x1080) eDP TFT LCD panel
|
||||
- innolux,n125hce-gn1
|
||||
# InnoLux 15.6" WXGA TFT LCD panel
|
||||
- innolux,n156bge-l21
|
||||
# Innolux Corporation 7.0" WSVGA (1024x600) TFT LCD panel
|
||||
|
|
|
|||
|
|
@ -190,7 +190,7 @@ DMA Fence uABI/Sync File
|
|||
Indefinite DMA Fences
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
At various times &dma_fence with an indefinite time until dma_fence_wait()
|
||||
At various times struct dma_fence with an indefinite time until dma_fence_wait()
|
||||
finishes have been proposed. Examples include:
|
||||
|
||||
* Future fences, used in HWC1 to signal when a buffer isn't used by the display
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@
|
|||
| openrisc: | TODO |
|
||||
| parisc: | .. |
|
||||
| powerpc: | ok |
|
||||
| riscv: | TODO |
|
||||
| riscv: | ok |
|
||||
| s390: | .. |
|
||||
| sh: | TODO |
|
||||
| sparc: | .. |
|
||||
|
|
|
|||
|
|
@ -5,7 +5,6 @@ config ARM
|
|||
select ARCH_32BIT_OFF_T
|
||||
select ARCH_HAS_BINFMT_FLAT
|
||||
select ARCH_HAS_DEBUG_VIRTUAL if MMU
|
||||
select ARCH_HAS_DEVMEM_IS_ALLOWED
|
||||
select ARCH_HAS_DMA_WRITE_COMBINE if !ARM_DMA_MEM_BUFFERABLE
|
||||
select ARCH_HAS_ELF_RANDOMIZE
|
||||
select ARCH_HAS_FORTIFY_SOURCE
|
||||
|
|
@ -57,6 +56,7 @@ config ARM
|
|||
select GENERIC_IRQ_PROBE
|
||||
select GENERIC_IRQ_SHOW
|
||||
select GENERIC_IRQ_SHOW_LEVEL
|
||||
select GENERIC_LIB_DEVMEM_IS_ALLOWED
|
||||
select GENERIC_PCI_IOMAP
|
||||
select GENERIC_SCHED_CLOCK
|
||||
select GENERIC_SMP_IDLE_THREAD
|
||||
|
|
|
|||
|
|
@ -441,7 +441,6 @@ extern void pci_iounmap(struct pci_dev *dev, void __iomem *addr);
|
|||
#define ARCH_HAS_VALID_PHYS_ADDR_RANGE
|
||||
extern int valid_phys_addr_range(phys_addr_t addr, size_t size);
|
||||
extern int valid_mmap_phys_addr_range(unsigned long pfn, size_t size);
|
||||
extern int devmem_is_allowed(unsigned long pfn);
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -165,25 +165,3 @@ int valid_mmap_phys_addr_range(unsigned long pfn, size_t size)
|
|||
{
|
||||
return (pfn + (size >> PAGE_SHIFT)) <= (1 + (PHYS_MASK >> PAGE_SHIFT));
|
||||
}
|
||||
|
||||
#ifdef CONFIG_STRICT_DEVMEM
|
||||
|
||||
#include <linux/ioport.h>
|
||||
|
||||
/*
|
||||
* devmem_is_allowed() checks to see if /dev/mem access to a certain
|
||||
* address is valid. The argument is a physical page number.
|
||||
* We mimic x86 here by disallowing access to system RAM as well as
|
||||
* device-exclusive MMIO regions. This effectively disable read()/write()
|
||||
* on /dev/mem.
|
||||
*/
|
||||
int devmem_is_allowed(unsigned long pfn)
|
||||
{
|
||||
if (iomem_is_exclusive(pfn << PAGE_SHIFT))
|
||||
return 0;
|
||||
if (!page_is_ram(pfn))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -13,7 +13,6 @@ config ARM64
|
|||
select ARCH_BINFMT_ELF_STATE
|
||||
select ARCH_HAS_DEBUG_VIRTUAL
|
||||
select ARCH_HAS_DEBUG_VM_PGTABLE
|
||||
select ARCH_HAS_DEVMEM_IS_ALLOWED
|
||||
select ARCH_HAS_DMA_PREP_COHERENT
|
||||
select ARCH_HAS_ACPI_TABLE_UPGRADE if ACPI
|
||||
select ARCH_HAS_FAST_MULTIPLIER
|
||||
|
|
@ -113,6 +112,7 @@ config ARM64
|
|||
select GENERIC_IRQ_PROBE
|
||||
select GENERIC_IRQ_SHOW
|
||||
select GENERIC_IRQ_SHOW_LEVEL
|
||||
select GENERIC_LIB_DEVMEM_IS_ALLOWED
|
||||
select GENERIC_PCI_IOMAP
|
||||
select GENERIC_PTDUMP
|
||||
select GENERIC_SCHED_CLOCK
|
||||
|
|
|
|||
|
|
@ -31,6 +31,10 @@ static inline u32 disr_to_esr(u64 disr)
|
|||
return esr;
|
||||
}
|
||||
|
||||
asmlinkage void el1_sync_handler(struct pt_regs *regs);
|
||||
asmlinkage void el0_sync_handler(struct pt_regs *regs);
|
||||
asmlinkage void el0_sync_compat_handler(struct pt_regs *regs);
|
||||
|
||||
asmlinkage void noinstr enter_el1_irq_or_nmi(struct pt_regs *regs);
|
||||
asmlinkage void noinstr exit_el1_irq_or_nmi(struct pt_regs *regs);
|
||||
asmlinkage void enter_from_user_mode(void);
|
||||
|
|
|
|||
|
|
@ -201,6 +201,4 @@ extern void __iomem *ioremap_cache(phys_addr_t phys_addr, size_t size);
|
|||
extern int valid_phys_addr_range(phys_addr_t addr, size_t size);
|
||||
extern int valid_mmap_phys_addr_range(unsigned long pfn, size_t size);
|
||||
|
||||
extern int devmem_is_allowed(unsigned long pfn);
|
||||
|
||||
#endif /* __ASM_IO_H */
|
||||
|
|
|
|||
|
|
@ -200,6 +200,12 @@ extern u32 __kvm_get_mdcr_el2(void);
|
|||
|
||||
extern char __smccc_workaround_1_smc[__SMCCC_WORKAROUND_1_SMC_SZ];
|
||||
|
||||
#if defined(GCC_VERSION) && GCC_VERSION < 50000
|
||||
#define SYM_CONSTRAINT "i"
|
||||
#else
|
||||
#define SYM_CONSTRAINT "S"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Obtain the PC-relative address of a kernel symbol
|
||||
* s: symbol
|
||||
|
|
@ -216,7 +222,7 @@ extern char __smccc_workaround_1_smc[__SMCCC_WORKAROUND_1_SMC_SZ];
|
|||
typeof(s) *addr; \
|
||||
asm("adrp %0, %1\n" \
|
||||
"add %0, %0, :lo12:%1\n" \
|
||||
: "=r" (addr) : "S" (&s)); \
|
||||
: "=r" (addr) : SYM_CONSTRAINT (&s)); \
|
||||
addr; \
|
||||
})
|
||||
|
||||
|
|
|
|||
|
|
@ -314,7 +314,7 @@ void topology_scale_freq_tick(void)
|
|||
|
||||
if (unlikely(core_cnt <= prev_core_cnt ||
|
||||
const_cnt <= prev_const_cnt))
|
||||
goto store_and_exit;
|
||||
return;
|
||||
|
||||
/*
|
||||
* /\core arch_max_freq_scale
|
||||
|
|
@ -331,10 +331,6 @@ void topology_scale_freq_tick(void)
|
|||
|
||||
scale = min_t(unsigned long, scale, SCHED_CAPACITY_SCALE);
|
||||
this_cpu_write(freq_scale, (unsigned long)scale);
|
||||
|
||||
store_and_exit:
|
||||
this_cpu_write(arch_core_cycles_prev, core_cnt);
|
||||
this_cpu_write(arch_const_cycles_prev, const_cnt);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ACPI_CPPC_LIB
|
||||
|
|
|
|||
|
|
@ -295,6 +295,9 @@ void __init arm64_memblock_init(void)
|
|||
memstart_addr = round_down(memblock_start_of_DRAM(),
|
||||
ARM64_MEMSTART_ALIGN);
|
||||
|
||||
if ((memblock_end_of_DRAM() - memstart_addr) > linear_region_size)
|
||||
pr_warn("Memory doesn't fit in the linear mapping, VA_BITS too small\n");
|
||||
|
||||
/*
|
||||
* Remove the memory that we will not be able to cover with the
|
||||
* linear mapping. Take care not to clip the kernel which may be
|
||||
|
|
|
|||
|
|
@ -47,24 +47,3 @@ int valid_mmap_phys_addr_range(unsigned long pfn, size_t size)
|
|||
{
|
||||
return !(((pfn << PAGE_SHIFT) + size) & ~PHYS_MASK);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_STRICT_DEVMEM
|
||||
|
||||
#include <linux/ioport.h>
|
||||
|
||||
/*
|
||||
* devmem_is_allowed() checks to see if /dev/mem access to a certain address
|
||||
* is valid. The argument is a physical page number. We mimic x86 here by
|
||||
* disallowing access to system RAM as well as device-exclusive MMIO regions.
|
||||
* This effectively disable read()/write() on /dev/mem.
|
||||
*/
|
||||
int devmem_is_allowed(unsigned long pfn)
|
||||
{
|
||||
if (iomem_is_exclusive(pfn << PAGE_SHIFT))
|
||||
return 0;
|
||||
if (!page_is_ram(pfn))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@ config RISCV
|
|||
select ARCH_CLOCKSOURCE_INIT
|
||||
select ARCH_SUPPORTS_ATOMIC_RMW
|
||||
select ARCH_SUPPORTS_DEBUG_PAGEALLOC if MMU
|
||||
select ARCH_STACKWALK
|
||||
select ARCH_HAS_BINFMT_FLAT
|
||||
select ARCH_HAS_DEBUG_VM_PGTABLE
|
||||
select ARCH_HAS_DEBUG_VIRTUAL if MMU
|
||||
|
|
@ -43,6 +44,7 @@ config RISCV
|
|||
select GENERIC_IOREMAP
|
||||
select GENERIC_IRQ_MULTI_HANDLER
|
||||
select GENERIC_IRQ_SHOW
|
||||
select GENERIC_LIB_DEVMEM_IS_ALLOWED
|
||||
select GENERIC_PCI_IOMAP
|
||||
select GENERIC_PTDUMP if MMU
|
||||
select GENERIC_SCHED_CLOCK
|
||||
|
|
@ -68,6 +70,7 @@ config RISCV
|
|||
select HAVE_FUTEX_CMPXCHG if FUTEX
|
||||
select HAVE_GCC_PLUGINS
|
||||
select HAVE_GENERIC_VDSO if MMU && 64BIT
|
||||
select HAVE_IRQ_TIME_ACCOUNTING
|
||||
select HAVE_PCI
|
||||
select HAVE_PERF_EVENTS
|
||||
select HAVE_PERF_REGS
|
||||
|
|
|
|||
|
|
@ -96,5 +96,11 @@ $(BOOT_TARGETS): vmlinux
|
|||
$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
|
||||
@$(kecho) ' Kernel: $(boot)/$@ is ready'
|
||||
|
||||
Image.%: Image
|
||||
$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
|
||||
|
||||
zinstall install:
|
||||
$(Q)$(MAKE) $(build)=$(boot) $@
|
||||
|
||||
archclean:
|
||||
$(Q)$(MAKE) $(clean)=$(boot)
|
||||
|
|
|
|||
3
arch/riscv/boot/.gitignore
vendored
3
arch/riscv/boot/.gitignore
vendored
|
|
@ -1,5 +1,6 @@
|
|||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
Image
|
||||
Image.gz
|
||||
Image.*
|
||||
loader
|
||||
loader.lds
|
||||
loader.bin
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ KCOV_INSTRUMENT := n
|
|||
|
||||
OBJCOPYFLAGS_Image :=-O binary -R .note -R .note.gnu.build-id -R .comment -S
|
||||
|
||||
targets := Image loader
|
||||
targets := Image Image.* loader loader.o loader.lds loader.bin
|
||||
|
||||
$(obj)/Image: vmlinux FORCE
|
||||
$(call if_changed,objcopy)
|
||||
|
|
|
|||
|
|
@ -9,5 +9,7 @@
|
|||
|
||||
extern char _start[];
|
||||
extern char _start_kernel[];
|
||||
extern char __init_data_begin[], __init_data_end[];
|
||||
extern char __init_text_begin[], __init_text_end[];
|
||||
|
||||
#endif /* __ASM_SECTIONS_H */
|
||||
|
|
|
|||
|
|
@ -15,11 +15,15 @@ int set_memory_ro(unsigned long addr, int numpages);
|
|||
int set_memory_rw(unsigned long addr, int numpages);
|
||||
int set_memory_x(unsigned long addr, int numpages);
|
||||
int set_memory_nx(unsigned long addr, int numpages);
|
||||
int set_memory_rw_nx(unsigned long addr, int numpages);
|
||||
void protect_kernel_text_data(void);
|
||||
#else
|
||||
static inline int set_memory_ro(unsigned long addr, int numpages) { return 0; }
|
||||
static inline int set_memory_rw(unsigned long addr, int numpages) { return 0; }
|
||||
static inline int set_memory_x(unsigned long addr, int numpages) { return 0; }
|
||||
static inline int set_memory_nx(unsigned long addr, int numpages) { return 0; }
|
||||
static inline void protect_kernel_text_data(void) {};
|
||||
static inline int set_memory_rw_nx(unsigned long addr, int numpages) { return 0; }
|
||||
#endif
|
||||
|
||||
int set_direct_map_invalid_noflush(struct page *page);
|
||||
|
|
|
|||
17
arch/riscv/include/asm/stacktrace.h
Normal file
17
arch/riscv/include/asm/stacktrace.h
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
|
||||
#ifndef _ASM_RISCV_STACKTRACE_H
|
||||
#define _ASM_RISCV_STACKTRACE_H
|
||||
|
||||
#include <linux/sched.h>
|
||||
#include <asm/ptrace.h>
|
||||
|
||||
struct stackframe {
|
||||
unsigned long fp;
|
||||
unsigned long ra;
|
||||
};
|
||||
|
||||
extern void notrace walk_stackframe(struct task_struct *task, struct pt_regs *regs,
|
||||
bool (*fn)(void *, unsigned long), void *arg);
|
||||
|
||||
#endif /* _ASM_RISCV_STACKTRACE_H */
|
||||
|
|
@ -12,16 +12,16 @@
|
|||
#define __HAVE_ARCH_MEMSET
|
||||
extern asmlinkage void *memset(void *, int, size_t);
|
||||
extern asmlinkage void *__memset(void *, int, size_t);
|
||||
|
||||
#define __HAVE_ARCH_MEMCPY
|
||||
extern asmlinkage void *memcpy(void *, const void *, size_t);
|
||||
extern asmlinkage void *__memcpy(void *, const void *, size_t);
|
||||
|
||||
#define __HAVE_ARCH_MEMMOVE
|
||||
extern asmlinkage void *memmove(void *, const void *, size_t);
|
||||
extern asmlinkage void *__memmove(void *, const void *, size_t);
|
||||
/* For those files which don't want to check by kasan. */
|
||||
#if defined(CONFIG_KASAN) && !defined(__SANITIZE_ADDRESS__)
|
||||
|
||||
#define memcpy(dst, src, len) __memcpy(dst, src, len)
|
||||
#define memset(s, c, n) __memset(s, c, n)
|
||||
|
||||
#define memmove(dst, src, len) __memmove(dst, src, len)
|
||||
#endif
|
||||
#endif /* _ASM_RISCV_STRING_H */
|
||||
|
|
|
|||
|
|
@ -56,5 +56,3 @@ obj-$(CONFIG_KGDB) += kgdb.o
|
|||
obj-$(CONFIG_JUMP_LABEL) += jump_label.o
|
||||
|
||||
obj-$(CONFIG_EFI) += efi.o
|
||||
|
||||
clean:
|
||||
|
|
|
|||
|
|
@ -11,6 +11,8 @@
|
|||
#include <asm/thread_info.h>
|
||||
#include <asm/ptrace.h>
|
||||
|
||||
void asm_offsets(void);
|
||||
|
||||
void asm_offsets(void)
|
||||
{
|
||||
OFFSET(TASK_THREAD_RA, task_struct, thread.ra);
|
||||
|
|
|
|||
|
|
@ -182,7 +182,6 @@ setup_trap_vector:
|
|||
|
||||
END(_start)
|
||||
|
||||
__INIT
|
||||
ENTRY(_start_kernel)
|
||||
/* Mask all interrupts */
|
||||
csrw CSR_IE, zero
|
||||
|
|
|
|||
|
|
@ -4,11 +4,7 @@
|
|||
#include <linux/perf_event.h>
|
||||
#include <linux/uaccess.h>
|
||||
|
||||
/* Kernel callchain */
|
||||
struct stackframe {
|
||||
unsigned long fp;
|
||||
unsigned long ra;
|
||||
};
|
||||
#include <asm/stacktrace.h>
|
||||
|
||||
/*
|
||||
* Get the return address for a single stackframe and return a pointer to the
|
||||
|
|
@ -74,13 +70,11 @@ void perf_callchain_user(struct perf_callchain_entry_ctx *entry,
|
|||
fp = user_backtrace(entry, fp, 0);
|
||||
}
|
||||
|
||||
bool fill_callchain(unsigned long pc, void *entry)
|
||||
static bool fill_callchain(void *entry, unsigned long pc)
|
||||
{
|
||||
return perf_callchain_store(entry, pc);
|
||||
}
|
||||
|
||||
void notrace walk_stackframe(struct task_struct *task,
|
||||
struct pt_regs *regs, bool (*fn)(unsigned long, void *), void *arg);
|
||||
void perf_callchain_kernel(struct perf_callchain_entry_ctx *entry,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -11,5 +11,7 @@
|
|||
*/
|
||||
EXPORT_SYMBOL(memset);
|
||||
EXPORT_SYMBOL(memcpy);
|
||||
EXPORT_SYMBOL(memmove);
|
||||
EXPORT_SYMBOL(__memset);
|
||||
EXPORT_SYMBOL(__memcpy);
|
||||
EXPORT_SYMBOL(__memmove);
|
||||
|
|
|
|||
|
|
@ -4,6 +4,8 @@
|
|||
* Chen Liqin <liqin.chen@sunplusct.com>
|
||||
* Lennox Wu <lennox.wu@sunplusct.com>
|
||||
* Copyright (C) 2012 Regents of the University of California
|
||||
* Copyright (C) 2020 FORTH-ICS/CARV
|
||||
* Nick Kossifidis <mick@ics.forth.gr>
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
|
|
@ -22,6 +24,7 @@
|
|||
#include <asm/cpu_ops.h>
|
||||
#include <asm/early_ioremap.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/set_memory.h>
|
||||
#include <asm/sections.h>
|
||||
#include <asm/sbi.h>
|
||||
#include <asm/tlbflush.h>
|
||||
|
|
@ -51,6 +54,163 @@ atomic_t hart_lottery __section(".sdata");
|
|||
unsigned long boot_cpu_hartid;
|
||||
static DEFINE_PER_CPU(struct cpu, cpu_devices);
|
||||
|
||||
/*
|
||||
* Place kernel memory regions on the resource tree so that
|
||||
* kexec-tools can retrieve them from /proc/iomem. While there
|
||||
* also add "System RAM" regions for compatibility with other
|
||||
* archs, and the rest of the known regions for completeness.
|
||||
*/
|
||||
static struct resource code_res = { .name = "Kernel code", };
|
||||
static struct resource data_res = { .name = "Kernel data", };
|
||||
static struct resource rodata_res = { .name = "Kernel rodata", };
|
||||
static struct resource bss_res = { .name = "Kernel bss", };
|
||||
|
||||
static int __init add_resource(struct resource *parent,
|
||||
struct resource *res)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
ret = insert_resource(parent, res);
|
||||
if (ret < 0) {
|
||||
pr_err("Failed to add a %s resource at %llx\n",
|
||||
res->name, (unsigned long long) res->start);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int __init add_kernel_resources(struct resource *res)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
/*
|
||||
* The memory region of the kernel image is continuous and
|
||||
* was reserved on setup_bootmem, find it here and register
|
||||
* it as a resource, then register the various segments of
|
||||
* the image as child nodes
|
||||
*/
|
||||
if (!(res->start <= code_res.start && res->end >= data_res.end))
|
||||
return 0;
|
||||
|
||||
res->name = "Kernel image";
|
||||
res->flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY;
|
||||
|
||||
/*
|
||||
* We removed a part of this region on setup_bootmem so
|
||||
* we need to expand the resource for the bss to fit in.
|
||||
*/
|
||||
res->end = bss_res.end;
|
||||
|
||||
ret = add_resource(&iomem_resource, res);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = add_resource(res, &code_res);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = add_resource(res, &rodata_res);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = add_resource(res, &data_res);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = add_resource(res, &bss_res);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void __init init_resources(void)
|
||||
{
|
||||
struct memblock_region *region = NULL;
|
||||
struct resource *res = NULL;
|
||||
int ret = 0;
|
||||
|
||||
code_res.start = __pa_symbol(_text);
|
||||
code_res.end = __pa_symbol(_etext) - 1;
|
||||
code_res.flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY;
|
||||
|
||||
rodata_res.start = __pa_symbol(__start_rodata);
|
||||
rodata_res.end = __pa_symbol(__end_rodata) - 1;
|
||||
rodata_res.flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY;
|
||||
|
||||
data_res.start = __pa_symbol(_data);
|
||||
data_res.end = __pa_symbol(_edata) - 1;
|
||||
data_res.flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY;
|
||||
|
||||
bss_res.start = __pa_symbol(__bss_start);
|
||||
bss_res.end = __pa_symbol(__bss_stop) - 1;
|
||||
bss_res.flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY;
|
||||
|
||||
/*
|
||||
* Start by adding the reserved regions, if they overlap
|
||||
* with /memory regions, insert_resource later on will take
|
||||
* care of it.
|
||||
*/
|
||||
for_each_reserved_mem_region(region) {
|
||||
res = memblock_alloc(sizeof(struct resource), SMP_CACHE_BYTES);
|
||||
if (!res)
|
||||
panic("%s: Failed to allocate %zu bytes\n", __func__,
|
||||
sizeof(struct resource));
|
||||
|
||||
res->name = "Reserved";
|
||||
res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
|
||||
res->start = __pfn_to_phys(memblock_region_reserved_base_pfn(region));
|
||||
res->end = __pfn_to_phys(memblock_region_reserved_end_pfn(region)) - 1;
|
||||
|
||||
ret = add_kernel_resources(res);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
else if (ret)
|
||||
continue;
|
||||
|
||||
/*
|
||||
* Ignore any other reserved regions within
|
||||
* system memory.
|
||||
*/
|
||||
if (memblock_is_memory(res->start))
|
||||
continue;
|
||||
|
||||
ret = add_resource(&iomem_resource, res);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
}
|
||||
|
||||
/* Add /memory regions to the resource tree */
|
||||
for_each_mem_region(region) {
|
||||
res = memblock_alloc(sizeof(struct resource), SMP_CACHE_BYTES);
|
||||
if (!res)
|
||||
panic("%s: Failed to allocate %zu bytes\n", __func__,
|
||||
sizeof(struct resource));
|
||||
|
||||
if (unlikely(memblock_is_nomap(region))) {
|
||||
res->name = "Reserved";
|
||||
res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
|
||||
} else {
|
||||
res->name = "System RAM";
|
||||
res->flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY;
|
||||
}
|
||||
|
||||
res->start = __pfn_to_phys(memblock_region_memory_base_pfn(region));
|
||||
res->end = __pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1;
|
||||
|
||||
ret = add_resource(&iomem_resource, res);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
error:
|
||||
memblock_free((phys_addr_t) res, sizeof(struct resource));
|
||||
/* Better an empty resource tree than an inconsistent one */
|
||||
release_child_resources(&iomem_resource);
|
||||
}
|
||||
|
||||
|
||||
static void __init parse_dtb(void)
|
||||
{
|
||||
/* Early scan of device tree from init memory */
|
||||
|
|
@ -81,6 +241,7 @@ void __init setup_arch(char **cmdline_p)
|
|||
efi_init();
|
||||
setup_bootmem();
|
||||
paging_init();
|
||||
init_resources();
|
||||
#if IS_ENABLED(CONFIG_BUILTIN_DTB)
|
||||
unflatten_and_copy_device_tree();
|
||||
#else
|
||||
|
|
@ -90,6 +251,11 @@ void __init setup_arch(char **cmdline_p)
|
|||
pr_err("No DTB found in kernel mappings\n");
|
||||
#endif
|
||||
|
||||
if (IS_ENABLED(CONFIG_RISCV_SBI))
|
||||
sbi_init();
|
||||
|
||||
if (IS_ENABLED(CONFIG_STRICT_KERNEL_RWX))
|
||||
protect_kernel_text_data();
|
||||
#ifdef CONFIG_SWIOTLB
|
||||
swiotlb_init(1);
|
||||
#endif
|
||||
|
|
@ -98,10 +264,6 @@ void __init setup_arch(char **cmdline_p)
|
|||
kasan_init();
|
||||
#endif
|
||||
|
||||
#if IS_ENABLED(CONFIG_RISCV_SBI)
|
||||
sbi_init();
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
setup_smp();
|
||||
#endif
|
||||
|
|
@ -123,3 +285,12 @@ static int __init topology_init(void)
|
|||
return 0;
|
||||
}
|
||||
subsys_initcall(topology_init);
|
||||
|
||||
void free_initmem(void)
|
||||
{
|
||||
unsigned long init_begin = (unsigned long)__init_begin;
|
||||
unsigned long init_end = (unsigned long)__init_end;
|
||||
|
||||
set_memory_rw_nx(init_begin, (init_end - init_begin) >> PAGE_SHIFT);
|
||||
free_initmem_default(POISON_FREE_INITMEM);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,17 +12,14 @@
|
|||
#include <linux/stacktrace.h>
|
||||
#include <linux/ftrace.h>
|
||||
|
||||
#include <asm/stacktrace.h>
|
||||
|
||||
register unsigned long sp_in_global __asm__("sp");
|
||||
|
||||
#ifdef CONFIG_FRAME_POINTER
|
||||
|
||||
struct stackframe {
|
||||
unsigned long fp;
|
||||
unsigned long ra;
|
||||
};
|
||||
|
||||
void notrace walk_stackframe(struct task_struct *task, struct pt_regs *regs,
|
||||
bool (*fn)(unsigned long, void *), void *arg)
|
||||
bool (*fn)(void *, unsigned long), void *arg)
|
||||
{
|
||||
unsigned long fp, sp, pc;
|
||||
|
||||
|
|
@ -46,7 +43,7 @@ void notrace walk_stackframe(struct task_struct *task, struct pt_regs *regs,
|
|||
unsigned long low, high;
|
||||
struct stackframe *frame;
|
||||
|
||||
if (unlikely(!__kernel_text_address(pc) || fn(pc, arg)))
|
||||
if (unlikely(!__kernel_text_address(pc) || !fn(arg, pc)))
|
||||
break;
|
||||
|
||||
/* Validate frame pointer */
|
||||
|
|
@ -66,7 +63,7 @@ void notrace walk_stackframe(struct task_struct *task, struct pt_regs *regs,
|
|||
#else /* !CONFIG_FRAME_POINTER */
|
||||
|
||||
void notrace walk_stackframe(struct task_struct *task,
|
||||
struct pt_regs *regs, bool (*fn)(unsigned long, void *), void *arg)
|
||||
struct pt_regs *regs, bool (*fn)(void *, unsigned long), void *arg)
|
||||
{
|
||||
unsigned long sp, pc;
|
||||
unsigned long *ksp;
|
||||
|
|
@ -88,7 +85,7 @@ void notrace walk_stackframe(struct task_struct *task,
|
|||
|
||||
ksp = (unsigned long *)sp;
|
||||
while (!kstack_end(ksp)) {
|
||||
if (__kernel_text_address(pc) && unlikely(fn(pc, arg)))
|
||||
if (__kernel_text_address(pc) && unlikely(!fn(arg, pc)))
|
||||
break;
|
||||
pc = (*ksp++) - 0x4;
|
||||
}
|
||||
|
|
@ -96,13 +93,12 @@ void notrace walk_stackframe(struct task_struct *task,
|
|||
|
||||
#endif /* CONFIG_FRAME_POINTER */
|
||||
|
||||
|
||||
static bool print_trace_address(unsigned long pc, void *arg)
|
||||
static bool print_trace_address(void *arg, unsigned long pc)
|
||||
{
|
||||
const char *loglvl = arg;
|
||||
|
||||
print_ip_sym(loglvl, pc);
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
void show_stack(struct task_struct *task, unsigned long *sp, const char *loglvl)
|
||||
|
|
@ -111,14 +107,14 @@ void show_stack(struct task_struct *task, unsigned long *sp, const char *loglvl)
|
|||
walk_stackframe(task, NULL, print_trace_address, (void *)loglvl);
|
||||
}
|
||||
|
||||
static bool save_wchan(unsigned long pc, void *arg)
|
||||
static bool save_wchan(void *arg, unsigned long pc)
|
||||
{
|
||||
if (!in_sched_functions(pc)) {
|
||||
unsigned long *p = arg;
|
||||
*p = pc;
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
unsigned long get_wchan(struct task_struct *task)
|
||||
|
|
@ -130,42 +126,12 @@ unsigned long get_wchan(struct task_struct *task)
|
|||
return pc;
|
||||
}
|
||||
|
||||
|
||||
#ifdef CONFIG_STACKTRACE
|
||||
|
||||
static bool __save_trace(unsigned long pc, void *arg, bool nosched)
|
||||
void arch_stack_walk(stack_trace_consume_fn consume_entry, void *cookie,
|
||||
struct task_struct *task, struct pt_regs *regs)
|
||||
{
|
||||
struct stack_trace *trace = arg;
|
||||
|
||||
if (unlikely(nosched && in_sched_functions(pc)))
|
||||
return false;
|
||||
if (unlikely(trace->skip > 0)) {
|
||||
trace->skip--;
|
||||
return false;
|
||||
}
|
||||
|
||||
trace->entries[trace->nr_entries++] = pc;
|
||||
return (trace->nr_entries >= trace->max_entries);
|
||||
walk_stackframe(task, regs, consume_entry, cookie);
|
||||
}
|
||||
|
||||
static bool save_trace(unsigned long pc, void *arg)
|
||||
{
|
||||
return __save_trace(pc, arg, false);
|
||||
}
|
||||
|
||||
/*
|
||||
* Save stack-backtrace addresses into a stack_trace buffer.
|
||||
*/
|
||||
void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
|
||||
{
|
||||
walk_stackframe(tsk, NULL, save_trace, trace);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(save_stack_trace_tsk);
|
||||
|
||||
void save_stack_trace(struct stack_trace *trace)
|
||||
{
|
||||
save_stack_trace_tsk(NULL, trace);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(save_stack_trace);
|
||||
|
||||
#endif /* CONFIG_STACKTRACE */
|
||||
|
|
|
|||
|
|
@ -29,8 +29,30 @@ SECTIONS
|
|||
HEAD_TEXT_SECTION
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
|
||||
.text : {
|
||||
_text = .;
|
||||
_stext = .;
|
||||
TEXT_TEXT
|
||||
SCHED_TEXT
|
||||
CPUIDLE_TEXT
|
||||
LOCK_TEXT
|
||||
KPROBES_TEXT
|
||||
ENTRY_TEXT
|
||||
IRQENTRY_TEXT
|
||||
SOFTIRQENTRY_TEXT
|
||||
*(.fixup)
|
||||
_etext = .;
|
||||
}
|
||||
|
||||
. = ALIGN(SECTION_ALIGN);
|
||||
__init_begin = .;
|
||||
INIT_TEXT_SECTION(PAGE_SIZE)
|
||||
__init_text_begin = .;
|
||||
.init.text : AT(ADDR(.init.text) - LOAD_OFFSET) ALIGN(SECTION_ALIGN) { \
|
||||
_sinittext = .; \
|
||||
INIT_TEXT \
|
||||
_einittext = .; \
|
||||
}
|
||||
|
||||
. = ALIGN(8);
|
||||
__soc_early_init_table : {
|
||||
__soc_early_init_table_start = .;
|
||||
|
|
@ -47,35 +69,28 @@ SECTIONS
|
|||
{
|
||||
EXIT_TEXT
|
||||
}
|
||||
|
||||
__init_text_end = .;
|
||||
. = ALIGN(SECTION_ALIGN);
|
||||
#ifdef CONFIG_EFI
|
||||
. = ALIGN(PECOFF_SECTION_ALIGNMENT);
|
||||
__pecoff_text_end = .;
|
||||
#endif
|
||||
/* Start of init data section */
|
||||
__init_data_begin = .;
|
||||
INIT_DATA_SECTION(16)
|
||||
.exit.data :
|
||||
{
|
||||
EXIT_DATA
|
||||
}
|
||||
PERCPU_SECTION(L1_CACHE_BYTES)
|
||||
__init_end = .;
|
||||
|
||||
. = ALIGN(SECTION_ALIGN);
|
||||
.text : {
|
||||
_text = .;
|
||||
_stext = .;
|
||||
TEXT_TEXT
|
||||
SCHED_TEXT
|
||||
CPUIDLE_TEXT
|
||||
LOCK_TEXT
|
||||
KPROBES_TEXT
|
||||
ENTRY_TEXT
|
||||
IRQENTRY_TEXT
|
||||
SOFTIRQENTRY_TEXT
|
||||
*(.fixup)
|
||||
_etext = .;
|
||||
.rel.dyn : {
|
||||
*(.rel.dyn*)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_EFI
|
||||
. = ALIGN(PECOFF_SECTION_ALIGNMENT);
|
||||
__pecoff_text_end = .;
|
||||
#endif
|
||||
|
||||
INIT_DATA_SECTION(16)
|
||||
__init_data_end = .;
|
||||
__init_end = .;
|
||||
|
||||
/* Start of data section */
|
||||
_sdata = .;
|
||||
|
|
@ -105,10 +120,6 @@ SECTIONS
|
|||
|
||||
BSS_SECTION(PAGE_SIZE, PAGE_SIZE, 0)
|
||||
|
||||
.rel.dyn : {
|
||||
*(.rel.dyn*)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_EFI
|
||||
. = ALIGN(PECOFF_SECTION_ALIGNMENT);
|
||||
__pecoff_data_virt_size = ABSOLUTE(. - __pecoff_text_end);
|
||||
|
|
|
|||
|
|
@ -2,5 +2,6 @@
|
|||
lib-y += delay.o
|
||||
lib-y += memcpy.o
|
||||
lib-y += memset.o
|
||||
lib-y += memmove.o
|
||||
lib-$(CONFIG_MMU) += uaccess.o
|
||||
lib-$(CONFIG_64BIT) += tishift.o
|
||||
|
|
|
|||
64
arch/riscv/lib/memmove.S
Normal file
64
arch/riscv/lib/memmove.S
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/asm.h>
|
||||
|
||||
ENTRY(__memmove)
|
||||
WEAK(memmove)
|
||||
move t0, a0
|
||||
move t1, a1
|
||||
|
||||
beq a0, a1, exit_memcpy
|
||||
beqz a2, exit_memcpy
|
||||
srli t2, a2, 0x2
|
||||
|
||||
slt t3, a0, a1
|
||||
beqz t3, do_reverse
|
||||
|
||||
andi a2, a2, 0x3
|
||||
li t4, 1
|
||||
beqz t2, byte_copy
|
||||
|
||||
word_copy:
|
||||
lw t3, 0(a1)
|
||||
addi t2, t2, -1
|
||||
addi a1, a1, 4
|
||||
sw t3, 0(a0)
|
||||
addi a0, a0, 4
|
||||
bnez t2, word_copy
|
||||
beqz a2, exit_memcpy
|
||||
j byte_copy
|
||||
|
||||
do_reverse:
|
||||
add a0, a0, a2
|
||||
add a1, a1, a2
|
||||
andi a2, a2, 0x3
|
||||
li t4, -1
|
||||
beqz t2, reverse_byte_copy
|
||||
|
||||
reverse_word_copy:
|
||||
addi a1, a1, -4
|
||||
addi t2, t2, -1
|
||||
lw t3, 0(a1)
|
||||
addi a0, a0, -4
|
||||
sw t3, 0(a0)
|
||||
bnez t2, reverse_word_copy
|
||||
beqz a2, exit_memcpy
|
||||
|
||||
reverse_byte_copy:
|
||||
addi a0, a0, -1
|
||||
addi a1, a1, -1
|
||||
|
||||
byte_copy:
|
||||
lb t3, 0(a1)
|
||||
addi a2, a2, -1
|
||||
sb t3, 0(a0)
|
||||
add a1, a1, t4
|
||||
add a0, a0, t4
|
||||
bnez a2, byte_copy
|
||||
|
||||
exit_memcpy:
|
||||
move a0, t0
|
||||
move a1, t1
|
||||
ret
|
||||
END(__memmove)
|
||||
|
|
@ -13,6 +13,7 @@
|
|||
#include <linux/of_fdt.h>
|
||||
#include <linux/libfdt.h>
|
||||
#include <linux/set_memory.h>
|
||||
#include <linux/dma-map-ops.h>
|
||||
|
||||
#include <asm/fixmap.h>
|
||||
#include <asm/tlbflush.h>
|
||||
|
|
@ -41,13 +42,14 @@ struct pt_alloc_ops {
|
|||
#endif
|
||||
};
|
||||
|
||||
static phys_addr_t dma32_phys_limit __ro_after_init;
|
||||
|
||||
static void __init zone_sizes_init(void)
|
||||
{
|
||||
unsigned long max_zone_pfns[MAX_NR_ZONES] = { 0, };
|
||||
|
||||
#ifdef CONFIG_ZONE_DMA32
|
||||
max_zone_pfns[ZONE_DMA32] = PFN_DOWN(min(4UL * SZ_1G,
|
||||
(unsigned long) PFN_PHYS(max_low_pfn)));
|
||||
max_zone_pfns[ZONE_DMA32] = PFN_DOWN(dma32_phys_limit);
|
||||
#endif
|
||||
max_zone_pfns[ZONE_NORMAL] = max_low_pfn;
|
||||
|
||||
|
|
@ -181,6 +183,7 @@ void __init setup_bootmem(void)
|
|||
|
||||
max_pfn = PFN_DOWN(memblock_end_of_DRAM());
|
||||
max_low_pfn = max_pfn;
|
||||
dma32_phys_limit = min(4UL * SZ_1G, (unsigned long)PFN_PHYS(max_low_pfn));
|
||||
set_max_mapnr(max_low_pfn);
|
||||
|
||||
#ifdef CONFIG_BLK_DEV_INITRD
|
||||
|
|
@ -194,6 +197,7 @@ void __init setup_bootmem(void)
|
|||
memblock_reserve(dtb_early_pa, fdt_totalsize(dtb_early_va));
|
||||
|
||||
early_init_fdt_scan_reserved_mem();
|
||||
dma_contiguous_reserve(dma32_phys_limit);
|
||||
memblock_allow_resize();
|
||||
memblock_dump_all();
|
||||
}
|
||||
|
|
@ -618,56 +622,40 @@ static inline void setup_vm_final(void)
|
|||
#endif /* CONFIG_MMU */
|
||||
|
||||
#ifdef CONFIG_STRICT_KERNEL_RWX
|
||||
void mark_rodata_ro(void)
|
||||
void protect_kernel_text_data(void)
|
||||
{
|
||||
unsigned long text_start = (unsigned long)_text;
|
||||
unsigned long text_end = (unsigned long)_etext;
|
||||
unsigned long text_start = (unsigned long)_start;
|
||||
unsigned long init_text_start = (unsigned long)__init_text_begin;
|
||||
unsigned long init_data_start = (unsigned long)__init_data_begin;
|
||||
unsigned long rodata_start = (unsigned long)__start_rodata;
|
||||
unsigned long data_start = (unsigned long)_data;
|
||||
unsigned long max_low = (unsigned long)(__va(PFN_PHYS(max_low_pfn)));
|
||||
|
||||
set_memory_ro(text_start, (text_end - text_start) >> PAGE_SHIFT);
|
||||
set_memory_ro(rodata_start, (data_start - rodata_start) >> PAGE_SHIFT);
|
||||
set_memory_ro(text_start, (init_text_start - text_start) >> PAGE_SHIFT);
|
||||
set_memory_ro(init_text_start, (init_data_start - init_text_start) >> PAGE_SHIFT);
|
||||
set_memory_nx(init_data_start, (rodata_start - init_data_start) >> PAGE_SHIFT);
|
||||
/* rodata section is marked readonly in mark_rodata_ro */
|
||||
set_memory_nx(rodata_start, (data_start - rodata_start) >> PAGE_SHIFT);
|
||||
set_memory_nx(data_start, (max_low - data_start) >> PAGE_SHIFT);
|
||||
}
|
||||
|
||||
void mark_rodata_ro(void)
|
||||
{
|
||||
unsigned long rodata_start = (unsigned long)__start_rodata;
|
||||
unsigned long data_start = (unsigned long)_data;
|
||||
|
||||
set_memory_ro(rodata_start, (data_start - rodata_start) >> PAGE_SHIFT);
|
||||
|
||||
debug_checkwx();
|
||||
}
|
||||
#endif
|
||||
|
||||
static void __init resource_init(void)
|
||||
{
|
||||
struct memblock_region *region;
|
||||
|
||||
for_each_mem_region(region) {
|
||||
struct resource *res;
|
||||
|
||||
res = memblock_alloc(sizeof(struct resource), SMP_CACHE_BYTES);
|
||||
if (!res)
|
||||
panic("%s: Failed to allocate %zu bytes\n", __func__,
|
||||
sizeof(struct resource));
|
||||
|
||||
if (memblock_is_nomap(region)) {
|
||||
res->name = "reserved";
|
||||
res->flags = IORESOURCE_MEM;
|
||||
} else {
|
||||
res->name = "System RAM";
|
||||
res->flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY;
|
||||
}
|
||||
res->start = __pfn_to_phys(memblock_region_memory_base_pfn(region));
|
||||
res->end = __pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1;
|
||||
|
||||
request_resource(&iomem_resource, res);
|
||||
}
|
||||
}
|
||||
|
||||
void __init paging_init(void)
|
||||
{
|
||||
setup_vm_final();
|
||||
sparse_init();
|
||||
setup_zero_page();
|
||||
zone_sizes_init();
|
||||
resource_init();
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SPARSEMEM_VMEMMAP
|
||||
|
|
|
|||
|
|
@ -128,6 +128,12 @@ static int __set_memory(unsigned long addr, int numpages, pgprot_t set_mask,
|
|||
return ret;
|
||||
}
|
||||
|
||||
int set_memory_rw_nx(unsigned long addr, int numpages)
|
||||
{
|
||||
return __set_memory(addr, numpages, __pgprot(_PAGE_READ | _PAGE_WRITE),
|
||||
__pgprot(_PAGE_EXEC));
|
||||
}
|
||||
|
||||
int set_memory_ro(unsigned long addr, int numpages)
|
||||
{
|
||||
return __set_memory(addr, numpages, __pgprot(_PAGE_READ),
|
||||
|
|
|
|||
|
|
@ -150,6 +150,7 @@ config S390
|
|||
select HAVE_FUTEX_CMPXCHG if FUTEX
|
||||
select HAVE_GCC_PLUGINS
|
||||
select HAVE_GENERIC_VDSO
|
||||
select HAVE_IRQ_EXIT_ON_IRQ_STACK
|
||||
select HAVE_KERNEL_BZIP2
|
||||
select HAVE_KERNEL_GZIP
|
||||
select HAVE_KERNEL_LZ4
|
||||
|
|
|
|||
|
|
@ -13,14 +13,12 @@
|
|||
#ifndef _S390_DELAY_H
|
||||
#define _S390_DELAY_H
|
||||
|
||||
void udelay_enable(void);
|
||||
void __ndelay(unsigned long long nsecs);
|
||||
void __udelay(unsigned long long usecs);
|
||||
void udelay_simple(unsigned long long usecs);
|
||||
void __ndelay(unsigned long nsecs);
|
||||
void __udelay(unsigned long usecs);
|
||||
void __delay(unsigned long loops);
|
||||
|
||||
#define ndelay(n) __ndelay((unsigned long long) (n))
|
||||
#define udelay(n) __udelay((unsigned long long) (n))
|
||||
#define mdelay(n) __udelay((unsigned long long) (n) * 1000)
|
||||
#define ndelay(n) __ndelay((unsigned long)(n))
|
||||
#define udelay(n) __udelay((unsigned long)(n))
|
||||
#define mdelay(n) __udelay((unsigned long)(n) * 1000)
|
||||
|
||||
#endif /* defined(_S390_DELAY_H) */
|
||||
|
|
|
|||
|
|
@ -16,14 +16,12 @@
|
|||
|
||||
#define CIF_NOHZ_DELAY 2 /* delay HZ disable for a tick */
|
||||
#define CIF_FPU 3 /* restore FPU registers */
|
||||
#define CIF_IGNORE_IRQ 4 /* ignore interrupt (for udelay) */
|
||||
#define CIF_ENABLED_WAIT 5 /* in enabled wait state */
|
||||
#define CIF_MCCK_GUEST 6 /* machine check happening in guest */
|
||||
#define CIF_DEDICATED_CPU 7 /* this CPU is dedicated */
|
||||
|
||||
#define _CIF_NOHZ_DELAY BIT(CIF_NOHZ_DELAY)
|
||||
#define _CIF_FPU BIT(CIF_FPU)
|
||||
#define _CIF_IGNORE_IRQ BIT(CIF_IGNORE_IRQ)
|
||||
#define _CIF_ENABLED_WAIT BIT(CIF_ENABLED_WAIT)
|
||||
#define _CIF_MCCK_GUEST BIT(CIF_MCCK_GUEST)
|
||||
#define _CIF_DEDICATED_CPU BIT(CIF_DEDICATED_CPU)
|
||||
|
|
@ -292,11 +290,6 @@ static inline unsigned long __rewind_psw(psw_t psw, unsigned long ilc)
|
|||
return (psw.addr - ilc) & mask;
|
||||
}
|
||||
|
||||
/*
|
||||
* Function to stop a processor until the next interrupt occurs
|
||||
*/
|
||||
void enabled_wait(void);
|
||||
|
||||
/*
|
||||
* Function to drop a processor into disabled wait state
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -414,6 +414,7 @@ ENTRY(system_call)
|
|||
mvc __PT_PSW(16,%r11),__LC_SVC_OLD_PSW
|
||||
mvc __PT_INT_CODE(4,%r11),__LC_SVC_ILC
|
||||
stg %r14,__PT_FLAGS(%r11)
|
||||
xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15)
|
||||
ENABLE_INTS
|
||||
.Lsysc_do_svc:
|
||||
# clear user controlled register to prevent speculative use
|
||||
|
|
@ -430,7 +431,6 @@ ENTRY(system_call)
|
|||
jnl .Lsysc_nr_ok
|
||||
slag %r8,%r1,3
|
||||
.Lsysc_nr_ok:
|
||||
xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15)
|
||||
stg %r2,__PT_ORIG_GPR2(%r11)
|
||||
stg %r7,STACK_FRAME_OVERHEAD(%r15)
|
||||
lg %r9,0(%r8,%r10) # get system call add.
|
||||
|
|
@ -699,8 +699,8 @@ ENTRY(pgm_check_handler)
|
|||
mvc __THREAD_per_address(8,%r14),__LC_PER_ADDRESS
|
||||
mvc __THREAD_per_cause(2,%r14),__LC_PER_CODE
|
||||
mvc __THREAD_per_paid(1,%r14),__LC_PER_ACCESS_ID
|
||||
6: RESTORE_SM_CLEAR_PER
|
||||
xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15)
|
||||
6: xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15)
|
||||
RESTORE_SM_CLEAR_PER
|
||||
larl %r1,pgm_check_table
|
||||
llgh %r10,__PT_INT_CODE+2(%r11)
|
||||
nill %r10,0x007f
|
||||
|
|
@ -731,8 +731,8 @@ ENTRY(pgm_check_handler)
|
|||
# PER event in supervisor state, must be kprobes
|
||||
#
|
||||
.Lpgm_kprobe:
|
||||
RESTORE_SM_CLEAR_PER
|
||||
xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15)
|
||||
RESTORE_SM_CLEAR_PER
|
||||
lgr %r2,%r11 # pass pointer to pt_regs
|
||||
brasl %r14,do_per_trap
|
||||
j .Lpgm_return
|
||||
|
|
@ -778,10 +778,8 @@ ENTRY(io_int_handler)
|
|||
.Lio_skip_asce:
|
||||
mvc __PT_INT_CODE(12,%r11),__LC_SUBCHANNEL_ID
|
||||
xc __PT_FLAGS(8,%r11),__PT_FLAGS(%r11)
|
||||
TSTMSK __LC_CPU_FLAGS,_CIF_IGNORE_IRQ
|
||||
jo .Lio_restore
|
||||
TRACE_IRQS_OFF
|
||||
xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15)
|
||||
TRACE_IRQS_OFF
|
||||
.Lio_loop:
|
||||
lgr %r2,%r11 # pass pointer to pt_regs
|
||||
lghi %r3,IO_INTERRUPT
|
||||
|
|
@ -966,10 +964,8 @@ ENTRY(ext_int_handler)
|
|||
mvc __PT_INT_PARM(4,%r11),__LC_EXT_PARAMS
|
||||
mvc __PT_INT_PARM_LONG(8,%r11),0(%r1)
|
||||
xc __PT_FLAGS(8,%r11),__PT_FLAGS(%r11)
|
||||
TSTMSK __LC_CPU_FLAGS,_CIF_IGNORE_IRQ
|
||||
jo .Lio_restore
|
||||
TRACE_IRQS_OFF
|
||||
xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15)
|
||||
TRACE_IRQS_OFF
|
||||
lgr %r2,%r11 # pass pointer to pt_regs
|
||||
lghi %r3,EXT_INTERRUPT
|
||||
brasl %r14,do_IRQ
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@
|
|||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/kernel_stat.h>
|
||||
#include <linux/kprobes.h>
|
||||
#include <linux/notifier.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/cpu.h>
|
||||
|
|
@ -21,22 +20,19 @@
|
|||
|
||||
static DEFINE_PER_CPU(struct s390_idle_data, s390_idle);
|
||||
|
||||
void enabled_wait(void)
|
||||
void arch_cpu_idle(void)
|
||||
{
|
||||
struct s390_idle_data *idle = this_cpu_ptr(&s390_idle);
|
||||
unsigned long long idle_time;
|
||||
unsigned long psw_mask, flags;
|
||||
|
||||
unsigned long psw_mask;
|
||||
|
||||
/* Wait for external, I/O or machine check interrupt. */
|
||||
psw_mask = PSW_KERNEL_BITS | PSW_MASK_WAIT | PSW_MASK_DAT |
|
||||
PSW_MASK_IO | PSW_MASK_EXT | PSW_MASK_MCHECK;
|
||||
clear_cpu_flag(CIF_NOHZ_DELAY);
|
||||
|
||||
raw_local_irq_save(flags);
|
||||
/* Call the assembler magic in entry.S */
|
||||
/* psw_idle() returns with interrupts disabled. */
|
||||
psw_idle(idle, psw_mask);
|
||||
raw_local_irq_restore(flags);
|
||||
|
||||
/* Account time spent with enabled wait psw loaded as idle time. */
|
||||
raw_write_seqcount_begin(&idle->seqcount);
|
||||
|
|
@ -46,8 +42,8 @@ void enabled_wait(void)
|
|||
idle->idle_count++;
|
||||
account_idle_time(cputime_to_nsecs(idle_time));
|
||||
raw_write_seqcount_end(&idle->seqcount);
|
||||
raw_local_irq_enable();
|
||||
}
|
||||
NOKPROBE_SYMBOL(enabled_wait);
|
||||
|
||||
static ssize_t show_idle_count(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
|
|
@ -120,12 +116,6 @@ void arch_cpu_idle_enter(void)
|
|||
{
|
||||
}
|
||||
|
||||
void arch_cpu_idle(void)
|
||||
{
|
||||
enabled_wait();
|
||||
raw_local_irq_enable();
|
||||
}
|
||||
|
||||
void arch_cpu_idle_exit(void)
|
||||
{
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1512,7 +1512,7 @@ static void diag308_dump(void *dump_block)
|
|||
while (1) {
|
||||
if (diag308(DIAG308_LOAD_NORMAL_DUMP, NULL) != 0x302)
|
||||
break;
|
||||
udelay_simple(USEC_PER_SEC);
|
||||
udelay(USEC_PER_SEC);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -335,7 +335,6 @@ int __init arch_early_irq_init(void)
|
|||
if (!stack)
|
||||
panic("Couldn't allocate async stack");
|
||||
S390_lowcore.async_stack = stack + STACK_INIT_OFFSET;
|
||||
udelay_enable();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -19,13 +19,6 @@
|
|||
#include <asm/div64.h>
|
||||
#include <asm/idle.h>
|
||||
|
||||
static DEFINE_STATIC_KEY_FALSE(udelay_ready);
|
||||
|
||||
void __init udelay_enable(void)
|
||||
{
|
||||
static_branch_enable(&udelay_ready);
|
||||
}
|
||||
|
||||
void __delay(unsigned long loops)
|
||||
{
|
||||
/*
|
||||
|
|
@ -39,105 +32,25 @@ void __delay(unsigned long loops)
|
|||
}
|
||||
EXPORT_SYMBOL(__delay);
|
||||
|
||||
static void __udelay_disabled(unsigned long long usecs)
|
||||
static void delay_loop(unsigned long delta)
|
||||
{
|
||||
unsigned long cr0, cr0_new, psw_mask;
|
||||
struct s390_idle_data idle;
|
||||
u64 end;
|
||||
unsigned long end;
|
||||
|
||||
end = get_tod_clock() + (usecs << 12);
|
||||
__ctl_store(cr0, 0, 0);
|
||||
cr0_new = cr0 & ~CR0_IRQ_SUBCLASS_MASK;
|
||||
cr0_new |= (1UL << (63 - 52)); /* enable clock comparator irq */
|
||||
__ctl_load(cr0_new, 0, 0);
|
||||
psw_mask = __extract_psw() | PSW_MASK_EXT | PSW_MASK_WAIT;
|
||||
set_clock_comparator(end);
|
||||
set_cpu_flag(CIF_IGNORE_IRQ);
|
||||
psw_idle(&idle, psw_mask);
|
||||
trace_hardirqs_off();
|
||||
clear_cpu_flag(CIF_IGNORE_IRQ);
|
||||
set_clock_comparator(S390_lowcore.clock_comparator);
|
||||
__ctl_load(cr0, 0, 0);
|
||||
}
|
||||
|
||||
static void __udelay_enabled(unsigned long long usecs)
|
||||
{
|
||||
u64 clock_saved, end;
|
||||
|
||||
end = get_tod_clock_fast() + (usecs << 12);
|
||||
do {
|
||||
clock_saved = 0;
|
||||
if (tod_after(S390_lowcore.clock_comparator, end)) {
|
||||
clock_saved = local_tick_disable();
|
||||
set_clock_comparator(end);
|
||||
}
|
||||
enabled_wait();
|
||||
if (clock_saved)
|
||||
local_tick_enable(clock_saved);
|
||||
} while (get_tod_clock_fast() < end);
|
||||
}
|
||||
|
||||
/*
|
||||
* Waits for 'usecs' microseconds using the TOD clock comparator.
|
||||
*/
|
||||
void __udelay(unsigned long long usecs)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
if (!static_branch_likely(&udelay_ready)) {
|
||||
udelay_simple(usecs);
|
||||
return;
|
||||
}
|
||||
|
||||
preempt_disable();
|
||||
local_irq_save(flags);
|
||||
if (in_irq()) {
|
||||
__udelay_disabled(usecs);
|
||||
goto out;
|
||||
}
|
||||
if (in_softirq()) {
|
||||
if (raw_irqs_disabled_flags(flags))
|
||||
__udelay_disabled(usecs);
|
||||
else
|
||||
__udelay_enabled(usecs);
|
||||
goto out;
|
||||
}
|
||||
if (raw_irqs_disabled_flags(flags)) {
|
||||
local_bh_disable();
|
||||
__udelay_disabled(usecs);
|
||||
_local_bh_enable();
|
||||
goto out;
|
||||
}
|
||||
__udelay_enabled(usecs);
|
||||
out:
|
||||
local_irq_restore(flags);
|
||||
preempt_enable();
|
||||
}
|
||||
EXPORT_SYMBOL(__udelay);
|
||||
|
||||
/*
|
||||
* Simple udelay variant. To be used on startup and reboot
|
||||
* when the interrupt handler isn't working.
|
||||
*/
|
||||
void udelay_simple(unsigned long long usecs)
|
||||
{
|
||||
u64 end;
|
||||
|
||||
end = get_tod_clock_fast() + (usecs << 12);
|
||||
while (get_tod_clock_fast() < end)
|
||||
end = get_tod_clock_monotonic() + delta;
|
||||
while (!tod_after(get_tod_clock_monotonic(), end))
|
||||
cpu_relax();
|
||||
}
|
||||
|
||||
void __ndelay(unsigned long long nsecs)
|
||||
void __udelay(unsigned long usecs)
|
||||
{
|
||||
u64 end;
|
||||
delay_loop(usecs << 12);
|
||||
}
|
||||
EXPORT_SYMBOL(__udelay);
|
||||
|
||||
void __ndelay(unsigned long nsecs)
|
||||
{
|
||||
nsecs <<= 9;
|
||||
do_div(nsecs, 125);
|
||||
end = get_tod_clock_fast() + nsecs;
|
||||
if (nsecs & ~0xfffUL)
|
||||
__udelay(nsecs >> 12);
|
||||
while (get_tod_clock_fast() < end)
|
||||
barrier();
|
||||
delay_loop(nsecs);
|
||||
}
|
||||
EXPORT_SYMBOL(__ndelay);
|
||||
|
|
|
|||
|
|
@ -9,12 +9,12 @@
|
|||
#include <linux/kallsyms.h>
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/kprobes.h>
|
||||
#include <linux/wait.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/delay.h>
|
||||
|
||||
#define BT_BUF_SIZE (PAGE_SIZE * 4)
|
||||
|
||||
|
|
@ -205,12 +205,15 @@ static noinline int unwindme_func3(struct unwindme *u)
|
|||
/* This function must appear in the backtrace. */
|
||||
static noinline int unwindme_func2(struct unwindme *u)
|
||||
{
|
||||
unsigned long flags;
|
||||
int rc;
|
||||
|
||||
if (u->flags & UWM_SWITCH_STACK) {
|
||||
preempt_disable();
|
||||
local_irq_save(flags);
|
||||
local_mcck_disable();
|
||||
rc = CALL_ON_STACK(unwindme_func3, S390_lowcore.nodat_stack, 1, u);
|
||||
preempt_enable();
|
||||
local_mcck_enable();
|
||||
local_irq_restore(flags);
|
||||
return rc;
|
||||
} else {
|
||||
return unwindme_func3(u);
|
||||
|
|
@ -223,31 +226,27 @@ static noinline int unwindme_func1(void *u)
|
|||
return unwindme_func2((struct unwindme *)u);
|
||||
}
|
||||
|
||||
static void unwindme_irq_handler(struct ext_code ext_code,
|
||||
unsigned int param32,
|
||||
unsigned long param64)
|
||||
static void unwindme_timer_fn(struct timer_list *unused)
|
||||
{
|
||||
struct unwindme *u = READ_ONCE(unwindme);
|
||||
|
||||
if (u && u->task == current) {
|
||||
if (u) {
|
||||
unwindme = NULL;
|
||||
u->task = NULL;
|
||||
u->ret = unwindme_func1(u);
|
||||
complete(&u->task_ready);
|
||||
}
|
||||
}
|
||||
|
||||
static struct timer_list unwind_timer;
|
||||
|
||||
static int test_unwind_irq(struct unwindme *u)
|
||||
{
|
||||
preempt_disable();
|
||||
if (register_external_irq(EXT_IRQ_CLK_COMP, unwindme_irq_handler)) {
|
||||
pr_info("Couldn't register external interrupt handler");
|
||||
return -1;
|
||||
}
|
||||
u->task = current;
|
||||
unwindme = u;
|
||||
udelay(1);
|
||||
unregister_external_irq(EXT_IRQ_CLK_COMP, unwindme_irq_handler);
|
||||
preempt_enable();
|
||||
init_completion(&u->task_ready);
|
||||
timer_setup(&unwind_timer, unwindme_timer_fn, 0);
|
||||
mod_timer(&unwind_timer, jiffies + 1);
|
||||
wait_for_completion(&u->task_ready);
|
||||
return u->ret;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,11 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
agpgart-y := backend.o frontend.o generic.o isoch.o
|
||||
agpgart-y := backend.o generic.o isoch.o
|
||||
|
||||
ifeq ($(CONFIG_DRM_LEGACY),y)
|
||||
agpgart-$(CONFIG_COMPAT) += compat_ioctl.o
|
||||
agpgart-y += frontend.o
|
||||
endif
|
||||
|
||||
|
||||
obj-$(CONFIG_AGP) += agpgart.o
|
||||
obj-$(CONFIG_AGP_ALI) += ali-agp.o
|
||||
|
|
|
|||
|
|
@ -186,8 +186,13 @@ int agp_add_bridge(struct agp_bridge_data *bridge);
|
|||
void agp_remove_bridge(struct agp_bridge_data *bridge);
|
||||
|
||||
/* Frontend routines. */
|
||||
#if IS_ENABLED(CONFIG_DRM_LEGACY)
|
||||
int agp_frontend_initialize(void);
|
||||
void agp_frontend_cleanup(void);
|
||||
#else
|
||||
static inline int agp_frontend_initialize(void) { return 0; }
|
||||
static inline void agp_frontend_cleanup(void) {}
|
||||
#endif
|
||||
|
||||
/* Generic routines. */
|
||||
void agp_generic_enable(struct agp_bridge_data *bridge, u32 mode);
|
||||
|
|
|
|||
|
|
@ -1205,9 +1205,6 @@ EXPORT_SYMBOL_GPL(dma_buf_end_cpu_access_partial);
|
|||
int dma_buf_mmap(struct dma_buf *dmabuf, struct vm_area_struct *vma,
|
||||
unsigned long pgoff)
|
||||
{
|
||||
struct file *oldfile;
|
||||
int ret;
|
||||
|
||||
if (WARN_ON(!dmabuf || !vma))
|
||||
return -EINVAL;
|
||||
|
||||
|
|
@ -1225,22 +1222,10 @@ int dma_buf_mmap(struct dma_buf *dmabuf, struct vm_area_struct *vma,
|
|||
return -EINVAL;
|
||||
|
||||
/* readjust the vma */
|
||||
get_file(dmabuf->file);
|
||||
oldfile = vma->vm_file;
|
||||
vma->vm_file = dmabuf->file;
|
||||
vma_set_file(vma, dmabuf->file);
|
||||
vma->vm_pgoff = pgoff;
|
||||
|
||||
ret = dmabuf->ops->mmap(dmabuf, vma);
|
||||
if (ret) {
|
||||
/* restore old parameters on failure */
|
||||
vma->vm_file = oldfile;
|
||||
fput(dmabuf->file);
|
||||
} else {
|
||||
if (oldfile)
|
||||
fput(oldfile);
|
||||
}
|
||||
return ret;
|
||||
|
||||
return dmabuf->ops->mmap(dmabuf, vma);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(dma_buf_mmap);
|
||||
|
||||
|
|
|
|||
|
|
@ -200,7 +200,7 @@ int dma_resv_reserve_shared(struct dma_resv *obj, unsigned int num_fences)
|
|||
max = max(old->shared_count + num_fences,
|
||||
old->shared_max * 2);
|
||||
} else {
|
||||
max = 4;
|
||||
max = max(4ul, roundup_pow_of_two(num_fences));
|
||||
}
|
||||
|
||||
new = dma_resv_list_alloc(max);
|
||||
|
|
|
|||
|
|
@ -203,27 +203,27 @@ static int cma_heap_vmap(struct dma_buf *dmabuf, struct dma_buf_map *map)
|
|||
{
|
||||
struct cma_heap_buffer *buffer = dmabuf->priv;
|
||||
void *vaddr;
|
||||
int ret = 0;
|
||||
|
||||
mutex_lock(&buffer->lock);
|
||||
if (buffer->vmap_cnt) {
|
||||
buffer->vmap_cnt++;
|
||||
vaddr = buffer->vaddr;
|
||||
dma_buf_map_set_vaddr(map, buffer->vaddr);
|
||||
goto out;
|
||||
}
|
||||
|
||||
vaddr = cma_heap_do_vmap(buffer);
|
||||
if (IS_ERR(vaddr)) {
|
||||
mutex_unlock(&buffer->lock);
|
||||
return PTR_ERR(vaddr);
|
||||
ret = PTR_ERR(vaddr);
|
||||
goto out;
|
||||
}
|
||||
|
||||
buffer->vaddr = vaddr;
|
||||
buffer->vmap_cnt++;
|
||||
dma_buf_map_set_vaddr(map, buffer->vaddr);
|
||||
out:
|
||||
mutex_unlock(&buffer->lock);
|
||||
|
||||
dma_buf_map_set_vaddr(map, vaddr);
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void cma_heap_vunmap(struct dma_buf *dmabuf, struct dma_buf_map *map)
|
||||
|
|
@ -236,6 +236,7 @@ static void cma_heap_vunmap(struct dma_buf *dmabuf, struct dma_buf_map *map)
|
|||
buffer->vaddr = NULL;
|
||||
}
|
||||
mutex_unlock(&buffer->lock);
|
||||
dma_buf_map_clear(map);
|
||||
}
|
||||
|
||||
static void cma_heap_dma_buf_release(struct dma_buf *dmabuf)
|
||||
|
|
@ -246,6 +247,7 @@ static void cma_heap_dma_buf_release(struct dma_buf *dmabuf)
|
|||
if (buffer->vmap_cnt > 0) {
|
||||
WARN(1, "%s: buffer still mapped in the kernel\n", __func__);
|
||||
vunmap(buffer->vaddr);
|
||||
buffer->vaddr = NULL;
|
||||
}
|
||||
|
||||
cma_release(cma_heap->cma, buffer->cma_pages, buffer->pagecount);
|
||||
|
|
|
|||
|
|
@ -244,27 +244,28 @@ static int system_heap_vmap(struct dma_buf *dmabuf, struct dma_buf_map *map)
|
|||
{
|
||||
struct system_heap_buffer *buffer = dmabuf->priv;
|
||||
void *vaddr;
|
||||
int ret = 0;
|
||||
|
||||
mutex_lock(&buffer->lock);
|
||||
if (buffer->vmap_cnt) {
|
||||
buffer->vmap_cnt++;
|
||||
vaddr = buffer->vaddr;
|
||||
dma_buf_map_set_vaddr(map, buffer->vaddr);
|
||||
goto out;
|
||||
}
|
||||
|
||||
vaddr = system_heap_do_vmap(buffer);
|
||||
if (IS_ERR(vaddr)) {
|
||||
mutex_unlock(&buffer->lock);
|
||||
return PTR_ERR(vaddr);
|
||||
ret = PTR_ERR(vaddr);
|
||||
goto out;
|
||||
}
|
||||
|
||||
buffer->vaddr = vaddr;
|
||||
buffer->vmap_cnt++;
|
||||
dma_buf_map_set_vaddr(map, buffer->vaddr);
|
||||
out:
|
||||
mutex_unlock(&buffer->lock);
|
||||
|
||||
dma_buf_map_set_vaddr(map, vaddr);
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void system_heap_vunmap(struct dma_buf *dmabuf, struct dma_buf_map *map)
|
||||
|
|
@ -277,6 +278,7 @@ static void system_heap_vunmap(struct dma_buf *dmabuf, struct dma_buf_map *map)
|
|||
buffer->vaddr = NULL;
|
||||
}
|
||||
mutex_unlock(&buffer->lock);
|
||||
dma_buf_map_clear(map);
|
||||
}
|
||||
|
||||
static void system_heap_dma_buf_release(struct dma_buf *dmabuf)
|
||||
|
|
|
|||
|
|
@ -1024,6 +1024,7 @@ struct amdgpu_device {
|
|||
/* enable runtime pm on the device */
|
||||
bool runpm;
|
||||
bool in_runpm;
|
||||
bool has_pr3;
|
||||
|
||||
bool pm_sysfs_en;
|
||||
bool ucode_sysfs_en;
|
||||
|
|
@ -1230,6 +1231,7 @@ void amdgpu_device_program_register_sequence(struct amdgpu_device *adev,
|
|||
const u32 *registers,
|
||||
const u32 array_size);
|
||||
|
||||
bool amdgpu_device_supports_atpx(struct drm_device *dev);
|
||||
bool amdgpu_device_supports_boco(struct drm_device *dev);
|
||||
bool amdgpu_device_supports_baco(struct drm_device *dev);
|
||||
bool amdgpu_device_is_peer_accessible(struct amdgpu_device *adev,
|
||||
|
|
@ -1280,6 +1282,8 @@ int amdgpu_enable_vblank_kms(struct drm_crtc *crtc);
|
|||
void amdgpu_disable_vblank_kms(struct drm_crtc *crtc);
|
||||
long amdgpu_kms_compat_ioctl(struct file *filp, unsigned int cmd,
|
||||
unsigned long arg);
|
||||
int amdgpu_info_ioctl(struct drm_device *dev, void *data,
|
||||
struct drm_file *filp);
|
||||
|
||||
/*
|
||||
* functions used by amdgpu_encoder.c
|
||||
|
|
@ -1311,11 +1315,11 @@ int amdgpu_acpi_pcie_notify_device_ready(struct amdgpu_device *adev);
|
|||
|
||||
void amdgpu_acpi_get_backlight_caps(struct amdgpu_device *adev,
|
||||
struct amdgpu_dm_backlight_caps *caps);
|
||||
bool amdgpu_acpi_is_s0ix_supported(void);
|
||||
bool amdgpu_acpi_is_s0ix_supported(struct amdgpu_device *adev);
|
||||
#else
|
||||
static inline int amdgpu_acpi_init(struct amdgpu_device *adev) { return 0; }
|
||||
static inline void amdgpu_acpi_fini(struct amdgpu_device *adev) { }
|
||||
static inline bool amdgpu_acpi_is_s0ix_supported(void) { return false; }
|
||||
static inline bool amdgpu_acpi_is_s0ix_supported(struct amdgpu_device *adev) { return false; }
|
||||
#endif
|
||||
|
||||
int amdgpu_cs_find_mapping(struct amdgpu_cs_parser *parser,
|
||||
|
|
|
|||
|
|
@ -901,10 +901,12 @@ void amdgpu_acpi_fini(struct amdgpu_device *adev)
|
|||
*
|
||||
* returns true if supported, false if not.
|
||||
*/
|
||||
bool amdgpu_acpi_is_s0ix_supported(void)
|
||||
bool amdgpu_acpi_is_s0ix_supported(struct amdgpu_device *adev)
|
||||
{
|
||||
if (acpi_gbl_FADT.flags & ACPI_FADT_LOW_POWER_S0)
|
||||
return true;
|
||||
if (acpi_gbl_FADT.flags & ACPI_FADT_LOW_POWER_S0) {
|
||||
if (adev->flags & AMD_IS_APU)
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1213,7 +1213,7 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
|
|||
|
||||
ret = amdgpu_amdkfd_reserve_mem_limit(adev, size, alloc_domain, !!sg);
|
||||
if (ret) {
|
||||
pr_debug("Insufficient system memory\n");
|
||||
pr_debug("Insufficient memory\n");
|
||||
goto err_reserve_limit;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -212,7 +212,24 @@ static DEVICE_ATTR(serial_number, S_IRUGO,
|
|||
amdgpu_device_get_serial_number, NULL);
|
||||
|
||||
/**
|
||||
* amdgpu_device_supports_boco - Is the device a dGPU with HG/PX power control
|
||||
* amdgpu_device_supports_atpx - Is the device a dGPU with HG/PX power control
|
||||
*
|
||||
* @dev: drm_device pointer
|
||||
*
|
||||
* Returns true if the device is a dGPU with HG/PX power control,
|
||||
* otherwise return false.
|
||||
*/
|
||||
bool amdgpu_device_supports_atpx(struct drm_device *dev)
|
||||
{
|
||||
struct amdgpu_device *adev = drm_to_adev(dev);
|
||||
|
||||
if (adev->flags & AMD_IS_PX)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* amdgpu_device_supports_boco - Is the device a dGPU with ACPI power resources
|
||||
*
|
||||
* @dev: drm_device pointer
|
||||
*
|
||||
|
|
@ -223,7 +240,7 @@ bool amdgpu_device_supports_boco(struct drm_device *dev)
|
|||
{
|
||||
struct amdgpu_device *adev = drm_to_adev(dev);
|
||||
|
||||
if (adev->flags & AMD_IS_PX)
|
||||
if (adev->has_pr3)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
|
@ -1398,7 +1415,7 @@ static void amdgpu_switcheroo_set_state(struct pci_dev *pdev,
|
|||
struct drm_device *dev = pci_get_drvdata(pdev);
|
||||
int r;
|
||||
|
||||
if (amdgpu_device_supports_boco(dev) && state == VGA_SWITCHEROO_OFF)
|
||||
if (amdgpu_device_supports_atpx(dev) && state == VGA_SWITCHEROO_OFF)
|
||||
return;
|
||||
|
||||
if (state == VGA_SWITCHEROO_ON) {
|
||||
|
|
@ -2650,7 +2667,7 @@ static int amdgpu_device_ip_suspend_phase1(struct amdgpu_device *adev)
|
|||
{
|
||||
int i, r;
|
||||
|
||||
if (!amdgpu_acpi_is_s0ix_supported() || amdgpu_in_reset(adev)) {
|
||||
if (!amdgpu_acpi_is_s0ix_supported(adev) || amdgpu_in_reset(adev)) {
|
||||
amdgpu_device_set_pg_state(adev, AMD_PG_STATE_UNGATE);
|
||||
amdgpu_device_set_cg_state(adev, AMD_CG_STATE_UNGATE);
|
||||
}
|
||||
|
|
@ -3177,7 +3194,7 @@ int amdgpu_device_init(struct amdgpu_device *adev,
|
|||
struct drm_device *ddev = adev_to_drm(adev);
|
||||
struct pci_dev *pdev = adev->pdev;
|
||||
int r, i;
|
||||
bool boco = false;
|
||||
bool atpx = false;
|
||||
u32 max_MBps;
|
||||
|
||||
adev->shutdown = false;
|
||||
|
|
@ -3349,15 +3366,15 @@ int amdgpu_device_init(struct amdgpu_device *adev,
|
|||
if ((adev->pdev->class >> 8) == PCI_CLASS_DISPLAY_VGA)
|
||||
vga_client_register(adev->pdev, adev, NULL, amdgpu_device_vga_set_decode);
|
||||
|
||||
if (amdgpu_device_supports_boco(ddev))
|
||||
boco = true;
|
||||
if (amdgpu_device_supports_atpx(ddev))
|
||||
atpx = true;
|
||||
if (amdgpu_has_atpx() &&
|
||||
(amdgpu_is_atpx_hybrid() ||
|
||||
amdgpu_has_atpx_dgpu_power_cntl()) &&
|
||||
!pci_is_thunderbolt_attached(adev->pdev))
|
||||
vga_switcheroo_register_client(adev->pdev,
|
||||
&amdgpu_switcheroo_ops, boco);
|
||||
if (boco)
|
||||
&amdgpu_switcheroo_ops, atpx);
|
||||
if (atpx)
|
||||
vga_switcheroo_init_domain_pm_ops(adev->dev, &adev->vga_pm_domain);
|
||||
|
||||
if (amdgpu_emu_mode == 1) {
|
||||
|
|
@ -3540,7 +3557,7 @@ int amdgpu_device_init(struct amdgpu_device *adev,
|
|||
|
||||
failed:
|
||||
amdgpu_vf_error_trans_all(adev);
|
||||
if (boco)
|
||||
if (atpx)
|
||||
vga_switcheroo_fini_domain_pm_ops(adev->dev);
|
||||
|
||||
failed_unmap:
|
||||
|
|
@ -3604,7 +3621,7 @@ void amdgpu_device_fini(struct amdgpu_device *adev)
|
|||
amdgpu_has_atpx_dgpu_power_cntl()) &&
|
||||
!pci_is_thunderbolt_attached(adev->pdev))
|
||||
vga_switcheroo_unregister_client(adev->pdev);
|
||||
if (amdgpu_device_supports_boco(adev_to_drm(adev)))
|
||||
if (amdgpu_device_supports_atpx(adev_to_drm(adev)))
|
||||
vga_switcheroo_fini_domain_pm_ops(adev->dev);
|
||||
if ((adev->pdev->class >> 8) == PCI_CLASS_DISPLAY_VGA)
|
||||
vga_client_register(adev->pdev, NULL, NULL, NULL);
|
||||
|
|
@ -3710,7 +3727,7 @@ int amdgpu_device_suspend(struct drm_device *dev, bool fbcon)
|
|||
|
||||
amdgpu_fence_driver_suspend(adev);
|
||||
|
||||
if (!amdgpu_acpi_is_s0ix_supported() || amdgpu_in_reset(adev))
|
||||
if (!amdgpu_acpi_is_s0ix_supported(adev) || amdgpu_in_reset(adev))
|
||||
r = amdgpu_device_ip_suspend_phase2(adev);
|
||||
else
|
||||
amdgpu_gfx_state_change_set(adev, sGpuChangeState_D3Entry);
|
||||
|
|
@ -3744,7 +3761,7 @@ int amdgpu_device_resume(struct drm_device *dev, bool fbcon)
|
|||
if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
|
||||
return 0;
|
||||
|
||||
if (amdgpu_acpi_is_s0ix_supported())
|
||||
if (amdgpu_acpi_is_s0ix_supported(adev))
|
||||
amdgpu_gfx_state_change_set(adev, sGpuChangeState_D0Entry);
|
||||
|
||||
/* post card */
|
||||
|
|
|
|||
|
|
@ -1340,7 +1340,7 @@ static int amdgpu_pmops_runtime_suspend(struct device *dev)
|
|||
}
|
||||
|
||||
adev->in_runpm = true;
|
||||
if (amdgpu_device_supports_boco(drm_dev))
|
||||
if (amdgpu_device_supports_atpx(drm_dev))
|
||||
drm_dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
|
||||
drm_kms_helper_poll_disable(drm_dev);
|
||||
|
||||
|
|
@ -1348,13 +1348,11 @@ static int amdgpu_pmops_runtime_suspend(struct device *dev)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (amdgpu_device_supports_boco(drm_dev)) {
|
||||
if (amdgpu_device_supports_atpx(drm_dev)) {
|
||||
/* Only need to handle PCI state in the driver for ATPX
|
||||
* PCI core handles it for _PR3.
|
||||
*/
|
||||
if (amdgpu_is_atpx_hybrid()) {
|
||||
pci_ignore_hotplug(pdev);
|
||||
} else {
|
||||
if (!amdgpu_is_atpx_hybrid()) {
|
||||
amdgpu_device_cache_pci_state(pdev);
|
||||
pci_disable_device(pdev);
|
||||
pci_ignore_hotplug(pdev);
|
||||
|
|
@ -1378,28 +1376,31 @@ static int amdgpu_pmops_runtime_resume(struct device *dev)
|
|||
if (!adev->runpm)
|
||||
return -EINVAL;
|
||||
|
||||
if (amdgpu_device_supports_boco(drm_dev)) {
|
||||
if (amdgpu_device_supports_atpx(drm_dev)) {
|
||||
drm_dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
|
||||
|
||||
/* Only need to handle PCI state in the driver for ATPX
|
||||
* PCI core handles it for _PR3.
|
||||
*/
|
||||
if (amdgpu_is_atpx_hybrid()) {
|
||||
pci_set_master(pdev);
|
||||
} else {
|
||||
if (!amdgpu_is_atpx_hybrid()) {
|
||||
pci_set_power_state(pdev, PCI_D0);
|
||||
amdgpu_device_load_pci_state(pdev);
|
||||
ret = pci_enable_device(pdev);
|
||||
if (ret)
|
||||
return ret;
|
||||
pci_set_master(pdev);
|
||||
}
|
||||
pci_set_master(pdev);
|
||||
} else if (amdgpu_device_supports_boco(drm_dev)) {
|
||||
/* Only need to handle PCI state in the driver for ATPX
|
||||
* PCI core handles it for _PR3.
|
||||
*/
|
||||
pci_set_master(pdev);
|
||||
} else if (amdgpu_device_supports_baco(drm_dev)) {
|
||||
amdgpu_device_baco_exit(drm_dev);
|
||||
}
|
||||
ret = amdgpu_device_resume(drm_dev, false);
|
||||
drm_kms_helper_poll_enable(drm_dev);
|
||||
if (amdgpu_device_supports_boco(drm_dev))
|
||||
if (amdgpu_device_supports_atpx(drm_dev))
|
||||
drm_dev->switch_power_state = DRM_SWITCH_POWER_ON;
|
||||
adev->in_runpm = false;
|
||||
return 0;
|
||||
|
|
@ -1533,8 +1534,6 @@ int amdgpu_file_to_fpriv(struct file *filp, struct amdgpu_fpriv **fpriv)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp);
|
||||
|
||||
const struct drm_ioctl_desc amdgpu_ioctls_kms[] = {
|
||||
DRM_IOCTL_DEF_DRV(AMDGPU_GEM_CREATE, amdgpu_gem_create_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
|
||||
DRM_IOCTL_DEF_DRV(AMDGPU_CTX, amdgpu_ctx_ioctl, DRM_AUTH|DRM_RENDER_ALLOW),
|
||||
|
|
|
|||
|
|
@ -496,13 +496,14 @@ void amdgpu_gmc_get_vbios_allocations(struct amdgpu_device *adev)
|
|||
break;
|
||||
}
|
||||
|
||||
if (!amdgpu_device_ip_get_ip_block(adev, AMD_IP_BLOCK_TYPE_DCE))
|
||||
if (!amdgpu_device_ip_get_ip_block(adev, AMD_IP_BLOCK_TYPE_DCE)) {
|
||||
size = 0;
|
||||
else
|
||||
} else {
|
||||
size = amdgpu_gmc_get_vbios_fb_size(adev);
|
||||
|
||||
if (adev->mman.keep_stolen_vga_memory)
|
||||
size = max(size, (unsigned)AMDGPU_VBIOS_VGA_ALLOCATION);
|
||||
if (adev->mman.keep_stolen_vga_memory)
|
||||
size = max(size, (unsigned)AMDGPU_VBIOS_VGA_ALLOCATION);
|
||||
}
|
||||
|
||||
/* set to 0 if the pre-OS buffer uses up most of vram */
|
||||
if ((adev->gmc.real_vram_size - size) < (8 * 1024 * 1024))
|
||||
|
|
|
|||
|
|
@ -133,6 +133,7 @@ void amdgpu_register_gpu_instance(struct amdgpu_device *adev)
|
|||
int amdgpu_driver_load_kms(struct amdgpu_device *adev, unsigned long flags)
|
||||
{
|
||||
struct drm_device *dev;
|
||||
struct pci_dev *parent;
|
||||
int r, acpi_status;
|
||||
|
||||
dev = adev_to_drm(adev);
|
||||
|
|
@ -144,6 +145,9 @@ int amdgpu_driver_load_kms(struct amdgpu_device *adev, unsigned long flags)
|
|||
!pci_is_thunderbolt_attached(dev->pdev))
|
||||
flags |= AMD_IS_PX;
|
||||
|
||||
parent = pci_upstream_bridge(adev->pdev);
|
||||
adev->has_pr3 = parent ? pci_pr3_present(parent) : false;
|
||||
|
||||
/* amdgpu_device_init should report only fatal error
|
||||
* like memory allocation failure or iomapping failure,
|
||||
* or memory manager initialization failure, it must
|
||||
|
|
@ -156,9 +160,14 @@ int amdgpu_driver_load_kms(struct amdgpu_device *adev, unsigned long flags)
|
|||
goto out;
|
||||
}
|
||||
|
||||
if (amdgpu_device_supports_boco(dev) &&
|
||||
(amdgpu_runtime_pm != 0)) { /* enable runpm by default for boco */
|
||||
if (amdgpu_device_supports_atpx(dev) &&
|
||||
(amdgpu_runtime_pm != 0)) { /* enable runpm by default for atpx */
|
||||
adev->runpm = true;
|
||||
dev_info(adev->dev, "Using ATPX for runtime pm\n");
|
||||
} else if (amdgpu_device_supports_boco(dev) &&
|
||||
(amdgpu_runtime_pm != 0)) { /* enable runpm by default for boco */
|
||||
adev->runpm = true;
|
||||
dev_info(adev->dev, "Using BOCO for runtime pm\n");
|
||||
} else if (amdgpu_device_supports_baco(dev) &&
|
||||
(amdgpu_runtime_pm != 0)) {
|
||||
switch (adev->asic_type) {
|
||||
|
|
@ -180,6 +189,8 @@ int amdgpu_driver_load_kms(struct amdgpu_device *adev, unsigned long flags)
|
|||
adev->runpm = true;
|
||||
break;
|
||||
}
|
||||
if (adev->runpm)
|
||||
dev_info(adev->dev, "Using BACO for runtime pm\n");
|
||||
}
|
||||
|
||||
/* Call ACPI methods: require modeset init
|
||||
|
|
@ -192,7 +203,7 @@ int amdgpu_driver_load_kms(struct amdgpu_device *adev, unsigned long flags)
|
|||
|
||||
if (adev->runpm) {
|
||||
/* only need to skip on ATPX */
|
||||
if (amdgpu_device_supports_boco(dev) &&
|
||||
if (amdgpu_device_supports_atpx(dev) &&
|
||||
!amdgpu_is_atpx_hybrid())
|
||||
dev_pm_set_driver_flags(dev->dev, DPM_FLAG_NO_DIRECT_COMPLETE);
|
||||
pm_runtime_use_autosuspend(dev->dev);
|
||||
|
|
|
|||
|
|
@ -358,10 +358,11 @@ TRACE_EVENT(amdgpu_vm_update_ptes,
|
|||
}
|
||||
),
|
||||
TP_printk("pid:%u vm_ctx:0x%llx start:0x%010llx end:0x%010llx,"
|
||||
" flags:0x%llx, incr:%llu, dst:\n%s", __entry->pid,
|
||||
" flags:0x%llx, incr:%llu, dst:\n%s%s", __entry->pid,
|
||||
__entry->vm_ctx, __entry->start, __entry->end,
|
||||
__entry->flags, __entry->incr, __print_array(
|
||||
__get_dynamic_array(dst), __entry->nptes, 8))
|
||||
__get_dynamic_array(dst), min(__entry->nptes, 32u), 8),
|
||||
__entry->nptes > 32 ? "..." : "")
|
||||
);
|
||||
|
||||
TRACE_EVENT(amdgpu_vm_set_ptes,
|
||||
|
|
|
|||
|
|
@ -240,7 +240,7 @@ int amdgpu_uvd_sw_init(struct amdgpu_device *adev)
|
|||
|
||||
version_major = (le32_to_cpu(hdr->ucode_version) >> 24) & 0xff;
|
||||
version_minor = (le32_to_cpu(hdr->ucode_version) >> 8) & 0xff;
|
||||
DRM_INFO("Found UVD firmware Version: %hu.%hu Family ID: %hu\n",
|
||||
DRM_INFO("Found UVD firmware Version: %u.%u Family ID: %u\n",
|
||||
version_major, version_minor, family_id);
|
||||
|
||||
/*
|
||||
|
|
@ -267,7 +267,7 @@ int amdgpu_uvd_sw_init(struct amdgpu_device *adev)
|
|||
dec_minor = (le32_to_cpu(hdr->ucode_version) >> 8) & 0xff;
|
||||
enc_minor = (le32_to_cpu(hdr->ucode_version) >> 24) & 0x3f;
|
||||
enc_major = (le32_to_cpu(hdr->ucode_version) >> 30) & 0x3;
|
||||
DRM_INFO("Found UVD firmware ENC: %hu.%hu DEC: .%hu Family ID: %hu\n",
|
||||
DRM_INFO("Found UVD firmware ENC: %u.%u DEC: .%u Family ID: %u\n",
|
||||
enc_major, enc_minor, dec_minor, family_id);
|
||||
|
||||
adev->uvd.max_handles = AMDGPU_MAX_UVD_HANDLES;
|
||||
|
|
|
|||
|
|
@ -179,7 +179,7 @@ int amdgpu_vce_sw_init(struct amdgpu_device *adev, unsigned long size)
|
|||
version_major = (ucode_version >> 20) & 0xfff;
|
||||
version_minor = (ucode_version >> 8) & 0xfff;
|
||||
binary_id = ucode_version & 0xff;
|
||||
DRM_INFO("Found VCE firmware Version: %hhd.%hhd Binary ID: %hhd\n",
|
||||
DRM_INFO("Found VCE firmware Version: %d.%d Binary ID: %d\n",
|
||||
version_major, version_minor, binary_id);
|
||||
adev->vce.fw_version = ((version_major << 24) | (version_minor << 16) |
|
||||
(binary_id << 8));
|
||||
|
|
|
|||
|
|
@ -181,7 +181,7 @@ int amdgpu_vcn_sw_init(struct amdgpu_device *adev)
|
|||
enc_major = fw_check;
|
||||
dec_ver = (le32_to_cpu(hdr->ucode_version) >> 24) & 0xf;
|
||||
vep = (le32_to_cpu(hdr->ucode_version) >> 28) & 0xf;
|
||||
DRM_INFO("Found VCN firmware Version ENC: %hu.%hu DEC: %hu VEP: %hu Revision: %hu\n",
|
||||
DRM_INFO("Found VCN firmware Version ENC: %u.%u DEC: %u VEP: %u Revision: %u\n",
|
||||
enc_major, enc_minor, dec_ver, vep, fw_rev);
|
||||
} else {
|
||||
unsigned int version_major, version_minor, family_id;
|
||||
|
|
@ -189,7 +189,7 @@ int amdgpu_vcn_sw_init(struct amdgpu_device *adev)
|
|||
family_id = le32_to_cpu(hdr->ucode_version) & 0xff;
|
||||
version_major = (le32_to_cpu(hdr->ucode_version) >> 24) & 0xff;
|
||||
version_minor = (le32_to_cpu(hdr->ucode_version) >> 8) & 0xff;
|
||||
DRM_INFO("Found VCN firmware Version: %hu.%hu Family ID: %hu\n",
|
||||
DRM_INFO("Found VCN firmware Version: %u.%u Family ID: %u\n",
|
||||
version_major, version_minor, family_id);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -136,6 +136,7 @@ mmhub_v2_0_print_l2_protection_fault_status(struct amdgpu_device *adev,
|
|||
break;
|
||||
case CHIP_SIENNA_CICHLID:
|
||||
case CHIP_NAVY_FLOUNDER:
|
||||
case CHIP_DIMGREY_CAVEFISH:
|
||||
mmhub_cid = mmhub_client_ids_sienna_cichlid[cid][rw];
|
||||
break;
|
||||
default:
|
||||
|
|
|
|||
|
|
@ -187,7 +187,16 @@ static int xgpu_ai_send_access_requests(struct amdgpu_device *adev,
|
|||
|
||||
static int xgpu_ai_request_reset(struct amdgpu_device *adev)
|
||||
{
|
||||
return xgpu_ai_send_access_requests(adev, IDH_REQ_GPU_RESET_ACCESS);
|
||||
int ret, i = 0;
|
||||
|
||||
while (i < AI_MAILBOX_POLL_MSG_REP_MAX) {
|
||||
ret = xgpu_ai_send_access_requests(adev, IDH_REQ_GPU_RESET_ACCESS);
|
||||
if (!ret)
|
||||
break;
|
||||
i++;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int xgpu_ai_request_full_gpu_access(struct amdgpu_device *adev,
|
||||
|
|
|
|||
|
|
@ -25,8 +25,9 @@
|
|||
#define __MXGPU_AI_H__
|
||||
|
||||
#define AI_MAILBOX_POLL_ACK_TIMEDOUT 500
|
||||
#define AI_MAILBOX_POLL_MSG_TIMEDOUT 12000
|
||||
#define AI_MAILBOX_POLL_MSG_TIMEDOUT 6000
|
||||
#define AI_MAILBOX_POLL_FLR_TIMEDOUT 5000
|
||||
#define AI_MAILBOX_POLL_MSG_REP_MAX 11
|
||||
|
||||
enum idh_request {
|
||||
IDH_REQ_GPU_INIT_ACCESS = 1,
|
||||
|
|
|
|||
|
|
@ -200,7 +200,16 @@ static int xgpu_nv_send_access_requests(struct amdgpu_device *adev,
|
|||
|
||||
static int xgpu_nv_request_reset(struct amdgpu_device *adev)
|
||||
{
|
||||
return xgpu_nv_send_access_requests(adev, IDH_REQ_GPU_RESET_ACCESS);
|
||||
int ret, i = 0;
|
||||
|
||||
while (i < NV_MAILBOX_POLL_MSG_REP_MAX) {
|
||||
ret = xgpu_nv_send_access_requests(adev, IDH_REQ_GPU_RESET_ACCESS);
|
||||
if (!ret)
|
||||
break;
|
||||
i++;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int xgpu_nv_request_full_gpu_access(struct amdgpu_device *adev,
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@
|
|||
#define NV_MAILBOX_POLL_ACK_TIMEDOUT 500
|
||||
#define NV_MAILBOX_POLL_MSG_TIMEDOUT 6000
|
||||
#define NV_MAILBOX_POLL_FLR_TIMEDOUT 5000
|
||||
#define NV_MAILBOX_POLL_MSG_REP_MAX 11
|
||||
|
||||
enum idh_request {
|
||||
IDH_REQ_GPU_INIT_ACCESS = 1,
|
||||
|
|
|
|||
|
|
@ -362,6 +362,7 @@ nv_asic_reset_method(struct amdgpu_device *adev)
|
|||
switch (adev->asic_type) {
|
||||
case CHIP_SIENNA_CICHLID:
|
||||
case CHIP_NAVY_FLOUNDER:
|
||||
case CHIP_DIMGREY_CAVEFISH:
|
||||
return AMD_RESET_METHOD_MODE1;
|
||||
default:
|
||||
if (smu_baco_is_support(smu))
|
||||
|
|
|
|||
|
|
@ -153,6 +153,9 @@ static int sdma_v5_2_init_microcode(struct amdgpu_device *adev)
|
|||
struct amdgpu_firmware_info *info = NULL;
|
||||
const struct common_firmware_header *header = NULL;
|
||||
|
||||
if (amdgpu_sriov_vf(adev) && (adev->asic_type == CHIP_SIENNA_CICHLID))
|
||||
return 0;
|
||||
|
||||
DRM_DEBUG("\n");
|
||||
|
||||
switch (adev->asic_type) {
|
||||
|
|
@ -807,6 +810,37 @@ static int sdma_v5_2_load_microcode(struct amdgpu_device *adev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int sdma_v5_2_soft_reset(void *handle)
|
||||
{
|
||||
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
|
||||
u32 grbm_soft_reset;
|
||||
u32 tmp;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < adev->sdma.num_instances; i++) {
|
||||
grbm_soft_reset = REG_SET_FIELD(0,
|
||||
GRBM_SOFT_RESET, SOFT_RESET_SDMA0,
|
||||
1);
|
||||
grbm_soft_reset <<= i;
|
||||
|
||||
tmp = RREG32_SOC15(GC, 0, mmGRBM_SOFT_RESET);
|
||||
tmp |= grbm_soft_reset;
|
||||
DRM_DEBUG("GRBM_SOFT_RESET=0x%08X\n", tmp);
|
||||
WREG32_SOC15(GC, 0, mmGRBM_SOFT_RESET, tmp);
|
||||
tmp = RREG32_SOC15(GC, 0, mmGRBM_SOFT_RESET);
|
||||
|
||||
udelay(50);
|
||||
|
||||
tmp &= ~grbm_soft_reset;
|
||||
WREG32_SOC15(GC, 0, mmGRBM_SOFT_RESET, tmp);
|
||||
tmp = RREG32_SOC15(GC, 0, mmGRBM_SOFT_RESET);
|
||||
|
||||
udelay(50);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* sdma_v5_2_start - setup and start the async dma engines
|
||||
*
|
||||
|
|
@ -838,6 +872,7 @@ static int sdma_v5_2_start(struct amdgpu_device *adev)
|
|||
msleep(1000);
|
||||
}
|
||||
|
||||
sdma_v5_2_soft_reset(adev);
|
||||
/* unhalt the MEs */
|
||||
sdma_v5_2_enable(adev, true);
|
||||
/* enable sdma ring preemption */
|
||||
|
|
@ -1366,13 +1401,6 @@ static int sdma_v5_2_wait_for_idle(void *handle)
|
|||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
static int sdma_v5_2_soft_reset(void *handle)
|
||||
{
|
||||
/* todo */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int sdma_v5_2_ring_preempt_ib(struct amdgpu_ring *ring)
|
||||
{
|
||||
int i, r = 0;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# SPDX-License-Identifier: MIT
|
||||
#
|
||||
# Heterogenous system architecture configuration
|
||||
# Heterogeneous system architecture configuration
|
||||
#
|
||||
|
||||
config HSA_AMD
|
||||
|
|
|
|||
|
|
@ -72,8 +72,8 @@ enum KFD_MQD_TYPE get_mqd_type_from_queue_type(enum kfd_queue_type type)
|
|||
static bool is_pipe_enabled(struct device_queue_manager *dqm, int mec, int pipe)
|
||||
{
|
||||
int i;
|
||||
int pipe_offset = mec * dqm->dev->shared_resources.num_pipe_per_mec
|
||||
+ pipe * dqm->dev->shared_resources.num_queue_per_pipe;
|
||||
int pipe_offset = (mec * dqm->dev->shared_resources.num_pipe_per_mec
|
||||
+ pipe) * dqm->dev->shared_resources.num_queue_per_pipe;
|
||||
|
||||
/* queue is available for KFD usage if bit is 1 */
|
||||
for (i = 0; i < dqm->dev->shared_resources.num_queue_per_pipe; ++i)
|
||||
|
|
|
|||
|
|
@ -196,10 +196,6 @@ static int amdgpu_dm_encoder_init(struct drm_device *dev,
|
|||
|
||||
static int amdgpu_dm_connector_get_modes(struct drm_connector *connector);
|
||||
|
||||
static int amdgpu_dm_atomic_commit(struct drm_device *dev,
|
||||
struct drm_atomic_state *state,
|
||||
bool nonblock);
|
||||
|
||||
static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state);
|
||||
|
||||
static int amdgpu_dm_atomic_check(struct drm_device *dev,
|
||||
|
|
@ -2212,7 +2208,7 @@ static const struct drm_mode_config_funcs amdgpu_dm_mode_funcs = {
|
|||
.get_format_info = amd_get_format_info,
|
||||
.output_poll_changed = drm_fb_helper_output_poll_changed,
|
||||
.atomic_check = amdgpu_dm_atomic_check,
|
||||
.atomic_commit = amdgpu_dm_atomic_commit,
|
||||
.atomic_commit = drm_atomic_helper_commit,
|
||||
};
|
||||
|
||||
static struct drm_mode_config_helper_funcs amdgpu_dm_mode_config_helperfuncs = {
|
||||
|
|
@ -5124,9 +5120,8 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
|
|||
int preferred_refresh = 0;
|
||||
#if defined(CONFIG_DRM_AMD_DC_DCN)
|
||||
struct dsc_dec_dpcd_caps dsc_caps;
|
||||
#endif
|
||||
uint32_t link_bandwidth_kbps;
|
||||
|
||||
#endif
|
||||
struct dc_sink *sink = NULL;
|
||||
if (aconnector == NULL) {
|
||||
DRM_ERROR("aconnector is NULL!\n");
|
||||
|
|
@ -5208,11 +5203,9 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
|
|||
aconnector->dc_link->dpcd_caps.dsc_caps.dsc_basic_caps.raw,
|
||||
aconnector->dc_link->dpcd_caps.dsc_caps.dsc_branch_decoder_caps.raw,
|
||||
&dsc_caps);
|
||||
#endif
|
||||
link_bandwidth_kbps = dc_link_bandwidth_kbps(aconnector->dc_link,
|
||||
dc_link_get_link_cap(aconnector->dc_link));
|
||||
|
||||
#if defined(CONFIG_DRM_AMD_DC_DCN)
|
||||
if (aconnector->dsc_settings.dsc_force_enable != DSC_CLK_FORCE_DISABLE && dsc_caps.is_dsc_supported) {
|
||||
/* Set DSC policy according to dsc_clock_en */
|
||||
dc_dsc_policy_set_enable_dsc_when_not_needed(
|
||||
|
|
@ -5349,7 +5342,7 @@ dm_crtc_duplicate_state(struct drm_crtc *crtc)
|
|||
}
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
int amdgpu_dm_crtc_atomic_set_property(struct drm_crtc *crtc,
|
||||
static int amdgpu_dm_crtc_atomic_set_property(struct drm_crtc *crtc,
|
||||
struct drm_crtc_state *crtc_state,
|
||||
struct drm_property *property,
|
||||
uint64_t val)
|
||||
|
|
@ -5373,7 +5366,7 @@ int amdgpu_dm_crtc_atomic_set_property(struct drm_crtc *crtc,
|
|||
return 0;
|
||||
}
|
||||
|
||||
int amdgpu_dm_crtc_atomic_get_property(struct drm_crtc *crtc,
|
||||
static int amdgpu_dm_crtc_atomic_get_property(struct drm_crtc *crtc,
|
||||
const struct drm_crtc_state *state,
|
||||
struct drm_property *property,
|
||||
uint64_t *val)
|
||||
|
|
@ -8070,20 +8063,6 @@ static void amdgpu_dm_crtc_copy_transient_flags(struct drm_crtc_state *crtc_stat
|
|||
stream_state->mode_changed = drm_atomic_crtc_needs_modeset(crtc_state);
|
||||
}
|
||||
|
||||
static int amdgpu_dm_atomic_commit(struct drm_device *dev,
|
||||
struct drm_atomic_state *state,
|
||||
bool nonblock)
|
||||
{
|
||||
/*
|
||||
* Add check here for SoC's that support hardware cursor plane, to
|
||||
* unset legacy_cursor_update
|
||||
*/
|
||||
|
||||
return drm_atomic_helper_commit(dev, state, nonblock);
|
||||
|
||||
/*TODO Handle EINTR, reenable IRQ*/
|
||||
}
|
||||
|
||||
/**
|
||||
* amdgpu_dm_atomic_commit_tail() - AMDgpu DM's commit tail implementation.
|
||||
* @state: The atomic state to commit
|
||||
|
|
|
|||
|
|
@ -337,10 +337,29 @@ struct amdgpu_display_manager {
|
|||
const struct gpu_info_soc_bounding_box_v1_0 *soc_bounding_box;
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
/* set the crc calculation window*/
|
||||
/**
|
||||
* @crc_win_x_start_property:
|
||||
*
|
||||
* X start of the crc calculation window
|
||||
*/
|
||||
struct drm_property *crc_win_x_start_property;
|
||||
/**
|
||||
* @crc_win_y_start_property:
|
||||
*
|
||||
* Y start of the crc calculation window
|
||||
*/
|
||||
struct drm_property *crc_win_y_start_property;
|
||||
/**
|
||||
* @crc_win_x_end_property:
|
||||
*
|
||||
* X end of the crc calculation window
|
||||
*/
|
||||
struct drm_property *crc_win_x_end_property;
|
||||
/**
|
||||
* @crc_win_y_end_property:
|
||||
*
|
||||
* Y end of the crc calculation window
|
||||
*/
|
||||
struct drm_property *crc_win_y_end_property;
|
||||
#endif
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -81,6 +81,14 @@ const char *const *amdgpu_dm_crtc_get_crc_sources(struct drm_crtc *crtc,
|
|||
return pipe_crc_sources;
|
||||
}
|
||||
|
||||
static void amdgpu_dm_set_crc_window_default(struct dm_crtc_state *dm_crtc_state)
|
||||
{
|
||||
dm_crtc_state->crc_window.x_start = 0;
|
||||
dm_crtc_state->crc_window.y_start = 0;
|
||||
dm_crtc_state->crc_window.x_end = 0;
|
||||
dm_crtc_state->crc_window.y_end = 0;
|
||||
}
|
||||
|
||||
bool amdgpu_dm_crc_window_is_default(struct dm_crtc_state *dm_crtc_state)
|
||||
{
|
||||
bool ret = true;
|
||||
|
|
@ -141,7 +149,10 @@ int amdgpu_dm_crtc_configure_crc_source(struct drm_crtc *crtc,
|
|||
mutex_lock(&adev->dm.dc_lock);
|
||||
|
||||
/* Enable CRTC CRC generation if necessary. */
|
||||
if (dm_is_crc_source_crtc(source)) {
|
||||
if (dm_is_crc_source_crtc(source) || source == AMDGPU_DM_PIPE_CRC_SOURCE_NONE) {
|
||||
if (!enable)
|
||||
amdgpu_dm_set_crc_window_default(dm_crtc_state);
|
||||
|
||||
if (!amdgpu_dm_crc_window_is_default(dm_crtc_state)) {
|
||||
crc_window = &tmp_window;
|
||||
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@
|
|||
*/
|
||||
|
||||
#include <linux/version.h>
|
||||
#include <drm/drm_atomic.h>
|
||||
#include <drm/drm_atomic_helper.h>
|
||||
#include <drm/drm_dp_mst_helper.h>
|
||||
#include <drm/drm_dp_helper.h>
|
||||
|
|
@ -252,8 +253,10 @@ static int dm_dp_mst_get_modes(struct drm_connector *connector)
|
|||
|
||||
static struct drm_encoder *
|
||||
dm_mst_atomic_best_encoder(struct drm_connector *connector,
|
||||
struct drm_connector_state *connector_state)
|
||||
struct drm_atomic_state *state)
|
||||
{
|
||||
struct drm_connector_state *connector_state = drm_atomic_get_new_connector_state(state,
|
||||
connector);
|
||||
struct drm_device *dev = connector->dev;
|
||||
struct amdgpu_device *adev = drm_to_adev(dev);
|
||||
struct amdgpu_crtc *acrtc = to_amdgpu_crtc(connector_state->crtc);
|
||||
|
|
|
|||
|
|
@ -746,24 +746,24 @@ static struct wm_table ddr4_wm_table_rn = {
|
|||
.wm_inst = WM_B,
|
||||
.wm_type = WM_TYPE_PSTATE_CHG,
|
||||
.pstate_latency_us = 11.72,
|
||||
.sr_exit_time_us = 10.12,
|
||||
.sr_enter_plus_exit_time_us = 11.48,
|
||||
.sr_exit_time_us = 11.12,
|
||||
.sr_enter_plus_exit_time_us = 12.48,
|
||||
.valid = true,
|
||||
},
|
||||
{
|
||||
.wm_inst = WM_C,
|
||||
.wm_type = WM_TYPE_PSTATE_CHG,
|
||||
.pstate_latency_us = 11.72,
|
||||
.sr_exit_time_us = 10.12,
|
||||
.sr_enter_plus_exit_time_us = 11.48,
|
||||
.sr_exit_time_us = 11.12,
|
||||
.sr_enter_plus_exit_time_us = 12.48,
|
||||
.valid = true,
|
||||
},
|
||||
{
|
||||
.wm_inst = WM_D,
|
||||
.wm_type = WM_TYPE_PSTATE_CHG,
|
||||
.pstate_latency_us = 11.72,
|
||||
.sr_exit_time_us = 10.12,
|
||||
.sr_enter_plus_exit_time_us = 11.48,
|
||||
.sr_exit_time_us = 11.12,
|
||||
.sr_enter_plus_exit_time_us = 12.48,
|
||||
.valid = true,
|
||||
},
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2625,6 +2625,26 @@ static void commit_planes_for_stream(struct dc *dc,
|
|||
}
|
||||
}
|
||||
|
||||
if (update_type != UPDATE_TYPE_FAST) {
|
||||
// If changing VTG FP2: wait until back in vactive to program FP2
|
||||
// Need to ensure that pipe unlock happens soon after to minimize race condition
|
||||
for (i = 0; i < dc->res_pool->pipe_count; i++) {
|
||||
struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i];
|
||||
|
||||
if (pipe_ctx->top_pipe || pipe_ctx->stream != stream)
|
||||
continue;
|
||||
|
||||
if (!pipe_ctx->update_flags.bits.global_sync)
|
||||
continue;
|
||||
|
||||
pipe_ctx->stream_res.tg->funcs->wait_for_state(pipe_ctx->stream_res.tg, CRTC_STATE_VBLANK);
|
||||
pipe_ctx->stream_res.tg->funcs->wait_for_state(pipe_ctx->stream_res.tg, CRTC_STATE_VACTIVE);
|
||||
|
||||
pipe_ctx->stream_res.tg->funcs->set_vtg_params(
|
||||
pipe_ctx->stream_res.tg, &pipe_ctx->stream->timing, true);
|
||||
}
|
||||
}
|
||||
|
||||
if ((update_type != UPDATE_TYPE_FAST) && dc->hwss.interdependent_update_lock)
|
||||
dc->hwss.interdependent_update_lock(dc, context, false);
|
||||
else
|
||||
|
|
|
|||
|
|
@ -3267,9 +3267,6 @@ void core_link_enable_stream(
|
|||
}
|
||||
}
|
||||
|
||||
#if defined(CONFIG_DRM_AMD_DC_DCN3_0)
|
||||
#endif
|
||||
|
||||
/* turn off otg test pattern if enable */
|
||||
if (pipe_ctx->stream_res.tg->funcs->set_test_pattern)
|
||||
pipe_ctx->stream_res.tg->funcs->set_test_pattern(pipe_ctx->stream_res.tg,
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@
|
|||
#include "inc/hw/dmcu.h"
|
||||
#include "dml/display_mode_lib.h"
|
||||
|
||||
#define DC_VER "3.2.115"
|
||||
#define DC_VER "3.2.116"
|
||||
|
||||
#define MAX_SURFACES 3
|
||||
#define MAX_PLANES 6
|
||||
|
|
|
|||
|
|
@ -119,7 +119,8 @@ static const struct link_encoder_funcs dce110_lnk_enc_funcs = {
|
|||
.disable_hpd = dce110_link_encoder_disable_hpd,
|
||||
.is_dig_enabled = dce110_is_dig_enabled,
|
||||
.destroy = dce110_link_encoder_destroy,
|
||||
.get_max_link_cap = dce110_link_encoder_get_max_link_cap
|
||||
.get_max_link_cap = dce110_link_encoder_get_max_link_cap,
|
||||
.get_dig_frontend = dce110_get_dig_frontend,
|
||||
};
|
||||
|
||||
static enum bp_result link_transmitter_control(
|
||||
|
|
@ -235,6 +236,44 @@ static void set_link_training_complete(
|
|||
|
||||
}
|
||||
|
||||
unsigned int dce110_get_dig_frontend(struct link_encoder *enc)
|
||||
{
|
||||
struct dce110_link_encoder *enc110 = TO_DCE110_LINK_ENC(enc);
|
||||
u32 value;
|
||||
enum engine_id result;
|
||||
|
||||
REG_GET(DIG_BE_CNTL, DIG_FE_SOURCE_SELECT, &value);
|
||||
|
||||
switch (value) {
|
||||
case DCE110_DIG_FE_SOURCE_SELECT_DIGA:
|
||||
result = ENGINE_ID_DIGA;
|
||||
break;
|
||||
case DCE110_DIG_FE_SOURCE_SELECT_DIGB:
|
||||
result = ENGINE_ID_DIGB;
|
||||
break;
|
||||
case DCE110_DIG_FE_SOURCE_SELECT_DIGC:
|
||||
result = ENGINE_ID_DIGC;
|
||||
break;
|
||||
case DCE110_DIG_FE_SOURCE_SELECT_DIGD:
|
||||
result = ENGINE_ID_DIGD;
|
||||
break;
|
||||
case DCE110_DIG_FE_SOURCE_SELECT_DIGE:
|
||||
result = ENGINE_ID_DIGE;
|
||||
break;
|
||||
case DCE110_DIG_FE_SOURCE_SELECT_DIGF:
|
||||
result = ENGINE_ID_DIGF;
|
||||
break;
|
||||
case DCE110_DIG_FE_SOURCE_SELECT_DIGG:
|
||||
result = ENGINE_ID_DIGG;
|
||||
break;
|
||||
default:
|
||||
// invalid source select DIG
|
||||
result = ENGINE_ID_UNKNOWN;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void dce110_link_encoder_set_dp_phy_pattern_training_pattern(
|
||||
struct link_encoder *enc,
|
||||
uint32_t index)
|
||||
|
|
@ -1665,7 +1704,8 @@ static const struct link_encoder_funcs dce60_lnk_enc_funcs = {
|
|||
.disable_hpd = dce110_link_encoder_disable_hpd,
|
||||
.is_dig_enabled = dce110_is_dig_enabled,
|
||||
.destroy = dce110_link_encoder_destroy,
|
||||
.get_max_link_cap = dce110_link_encoder_get_max_link_cap
|
||||
.get_max_link_cap = dce110_link_encoder_get_max_link_cap,
|
||||
.get_dig_frontend = dce110_get_dig_frontend
|
||||
};
|
||||
|
||||
void dce60_link_encoder_construct(
|
||||
|
|
|
|||
|
|
@ -295,6 +295,8 @@ void dce110_link_encoder_connect_dig_be_to_fe(
|
|||
enum engine_id engine,
|
||||
bool connect);
|
||||
|
||||
unsigned int dce110_get_dig_frontend(struct link_encoder *enc);
|
||||
|
||||
void dce110_link_encoder_set_dp_phy_pattern_training_pattern(
|
||||
struct link_encoder *enc,
|
||||
uint32_t index);
|
||||
|
|
|
|||
|
|
@ -1268,7 +1268,7 @@ void dce120_timing_generator_construct(
|
|||
tg110->min_h_front_porch = 0;
|
||||
tg110->min_h_back_porch = 0;
|
||||
|
||||
tg110->min_h_sync_width = 8;
|
||||
tg110->min_h_sync_width = 4;
|
||||
tg110->min_v_sync_width = 1;
|
||||
tg110->min_v_blank = 3;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -124,11 +124,11 @@ bool hubbub1_verify_allow_pstate_change_high(
|
|||
* still not asserted, we are probably stuck and going to hang
|
||||
*
|
||||
* TODO: Figure out why it takes ~100us on linux
|
||||
* pstate takes around ~100us on linux. Unknown currently as to
|
||||
* why it takes that long on linux
|
||||
* pstate takes around ~100us (up to 200us) on linux. Unknown currently
|
||||
* as to why it takes that long on linux
|
||||
*/
|
||||
const unsigned int pstate_wait_timeout_us = 200;
|
||||
const unsigned int pstate_wait_expected_timeout_us = 40;
|
||||
const unsigned int pstate_wait_expected_timeout_us = 180;
|
||||
static unsigned int max_sampled_pstate_wait_us; /* data collection */
|
||||
static bool forced_pstate_allow; /* help with revert wa */
|
||||
|
||||
|
|
|
|||
|
|
@ -2736,7 +2736,7 @@ static void dcn10_program_all_pipe_in_tree(
|
|||
pipe_ctx->pipe_dlg_param.vupdate_width);
|
||||
|
||||
pipe_ctx->stream_res.tg->funcs->set_vtg_params(
|
||||
pipe_ctx->stream_res.tg, &pipe_ctx->stream->timing);
|
||||
pipe_ctx->stream_res.tg, &pipe_ctx->stream->timing, true);
|
||||
|
||||
if (hws->funcs.setup_vupdate_interrupt)
|
||||
hws->funcs.setup_vupdate_interrupt(dc, pipe_ctx);
|
||||
|
|
|
|||
|
|
@ -272,7 +272,7 @@ void optc1_program_timing(
|
|||
vupdate_offset,
|
||||
vupdate_width);
|
||||
|
||||
optc->funcs->set_vtg_params(optc, dc_crtc_timing);
|
||||
optc->funcs->set_vtg_params(optc, dc_crtc_timing, true);
|
||||
|
||||
/* TODO
|
||||
* patched_crtc_timing.flags.HORZ_COUNT_BY_TWO == 1
|
||||
|
|
@ -312,7 +312,7 @@ void optc1_program_timing(
|
|||
}
|
||||
|
||||
void optc1_set_vtg_params(struct timing_generator *optc,
|
||||
const struct dc_crtc_timing *dc_crtc_timing)
|
||||
const struct dc_crtc_timing *dc_crtc_timing, bool program_fp2)
|
||||
{
|
||||
struct dc_crtc_timing patched_crtc_timing;
|
||||
uint32_t asic_blank_end;
|
||||
|
|
@ -348,9 +348,12 @@ void optc1_set_vtg_params(struct timing_generator *optc,
|
|||
}
|
||||
}
|
||||
|
||||
REG_UPDATE_2(CONTROL,
|
||||
VTG0_FP2, v_fp2,
|
||||
VTG0_VCOUNT_INIT, v_init);
|
||||
if (program_fp2)
|
||||
REG_UPDATE_2(CONTROL,
|
||||
VTG0_FP2, v_fp2,
|
||||
VTG0_VCOUNT_INIT, v_init);
|
||||
else
|
||||
REG_UPDATE(CONTROL, VTG0_VCOUNT_INIT, v_init);
|
||||
}
|
||||
|
||||
void optc1_set_blank_data_double_buffer(struct timing_generator *optc, bool enable)
|
||||
|
|
@ -1540,7 +1543,7 @@ void dcn10_timing_generator_init(struct optc *optc1)
|
|||
optc1->min_h_blank = 32;
|
||||
optc1->min_v_blank = 3;
|
||||
optc1->min_v_blank_interlace = 5;
|
||||
optc1->min_h_sync_width = 8;
|
||||
optc1->min_h_sync_width = 4;
|
||||
optc1->min_v_sync_width = 1;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -700,6 +700,6 @@ bool optc1_get_crc(struct timing_generator *optc,
|
|||
bool optc1_is_two_pixels_per_containter(const struct dc_crtc_timing *timing);
|
||||
|
||||
void optc1_set_vtg_params(struct timing_generator *optc,
|
||||
const struct dc_crtc_timing *dc_crtc_timing);
|
||||
const struct dc_crtc_timing *dc_crtc_timing, bool program_fp2);
|
||||
|
||||
#endif /* __DC_TIMING_GENERATOR_DCN10_H__ */
|
||||
|
|
|
|||
|
|
@ -81,7 +81,9 @@
|
|||
SRI(DP_MSE_RATE_UPDATE, DP, id), \
|
||||
SRI(DP_PIXEL_FORMAT, DP, id), \
|
||||
SRI(DP_SEC_CNTL, DP, id), \
|
||||
SRI(DP_SEC_CNTL1, DP, id), \
|
||||
SRI(DP_SEC_CNTL2, DP, id), \
|
||||
SRI(DP_SEC_CNTL5, DP, id), \
|
||||
SRI(DP_SEC_CNTL6, DP, id), \
|
||||
SRI(DP_STEER_FIFO, DP, id), \
|
||||
SRI(DP_VID_M, DP, id), \
|
||||
|
|
@ -126,7 +128,9 @@ struct dcn10_stream_enc_registers {
|
|||
uint32_t DP_MSE_RATE_UPDATE;
|
||||
uint32_t DP_PIXEL_FORMAT;
|
||||
uint32_t DP_SEC_CNTL;
|
||||
uint32_t DP_SEC_CNTL1;
|
||||
uint32_t DP_SEC_CNTL2;
|
||||
uint32_t DP_SEC_CNTL5;
|
||||
uint32_t DP_SEC_CNTL6;
|
||||
uint32_t DP_STEER_FIFO;
|
||||
uint32_t DP_VID_M;
|
||||
|
|
@ -411,6 +415,8 @@ struct dcn10_stream_enc_registers {
|
|||
type DP_SEC_GSP3_ENABLE;\
|
||||
type DP_SEC_GSP4_ENABLE;\
|
||||
type DP_SEC_GSP5_ENABLE;\
|
||||
type DP_SEC_GSP5_LINE_NUM;\
|
||||
type DP_SEC_GSP5_LINE_REFERENCE;\
|
||||
type DP_SEC_GSP6_ENABLE;\
|
||||
type DP_SEC_GSP7_ENABLE;\
|
||||
type DP_SEC_GSP7_PPS;\
|
||||
|
|
|
|||
|
|
@ -1595,7 +1595,7 @@ static void dcn20_program_pipe(
|
|||
pipe_ctx->pipe_dlg_param.vupdate_width);
|
||||
|
||||
pipe_ctx->stream_res.tg->funcs->set_vtg_params(
|
||||
pipe_ctx->stream_res.tg, &pipe_ctx->stream->timing);
|
||||
pipe_ctx->stream_res.tg, &pipe_ctx->stream->timing, false);
|
||||
|
||||
if (hws->funcs.setup_vupdate_interrupt)
|
||||
hws->funcs.setup_vupdate_interrupt(dc, pipe_ctx);
|
||||
|
|
@ -1695,14 +1695,6 @@ void dcn20_program_front_end_for_ctx(
|
|||
&& context->res_ctx.pipe_ctx[i].stream)
|
||||
hws->funcs.blank_pixel_data(dc, &context->res_ctx.pipe_ctx[i], true);
|
||||
|
||||
/* wait for outstanding pending changes before adding or removing planes */
|
||||
for (i = 0; i < dc->res_pool->pipe_count; i++) {
|
||||
if (context->res_ctx.pipe_ctx[i].update_flags.bits.disable ||
|
||||
context->res_ctx.pipe_ctx[i].update_flags.bits.enable) {
|
||||
dc->hwss.wait_for_pending_cleared(dc, context);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Disconnect mpcc */
|
||||
for (i = 0; i < dc->res_pool->pipe_count; i++)
|
||||
|
|
@ -1856,7 +1848,7 @@ bool dcn20_update_bandwidth(
|
|||
pipe_ctx->pipe_dlg_param.vupdate_width);
|
||||
|
||||
pipe_ctx->stream_res.tg->funcs->set_vtg_params(
|
||||
pipe_ctx->stream_res.tg, &pipe_ctx->stream->timing);
|
||||
pipe_ctx->stream_res.tg, &pipe_ctx->stream->timing, false);
|
||||
|
||||
if (pipe_ctx->prev_odm_pipe == NULL)
|
||||
hws->funcs.blank_pixel_data(dc, pipe_ctx, blank);
|
||||
|
|
@ -2251,11 +2243,11 @@ void dcn20_get_mpctree_visual_confirm_color(
|
|||
{
|
||||
const struct tg_color pipe_colors[6] = {
|
||||
{MAX_TG_COLOR_VALUE, 0, 0}, // red
|
||||
{MAX_TG_COLOR_VALUE, 0, MAX_TG_COLOR_VALUE}, // yellow
|
||||
{0, MAX_TG_COLOR_VALUE, 0}, // blue
|
||||
{MAX_TG_COLOR_VALUE, MAX_TG_COLOR_VALUE / 4, 0}, // orange
|
||||
{MAX_TG_COLOR_VALUE, MAX_TG_COLOR_VALUE, 0}, // yellow
|
||||
{0, MAX_TG_COLOR_VALUE, 0}, // green
|
||||
{0, 0, MAX_TG_COLOR_VALUE}, // blue
|
||||
{MAX_TG_COLOR_VALUE / 2, 0, MAX_TG_COLOR_VALUE / 2}, // purple
|
||||
{0, 0, MAX_TG_COLOR_VALUE}, // green
|
||||
{MAX_TG_COLOR_VALUE, MAX_TG_COLOR_VALUE * 2 / 3, 0}, // orange
|
||||
};
|
||||
|
||||
struct pipe_ctx *top_pipe = pipe_ctx;
|
||||
|
|
@ -2280,14 +2272,11 @@ void dcn20_update_mpcc(struct dc *dc, struct pipe_ctx *pipe_ctx)
|
|||
|
||||
// input to MPCC is always RGB, by default leave black_color at 0
|
||||
if (dc->debug.visual_confirm == VISUAL_CONFIRM_HDR) {
|
||||
hws->funcs.get_hdr_visual_confirm_color(
|
||||
pipe_ctx, &blnd_cfg.black_color);
|
||||
hws->funcs.get_hdr_visual_confirm_color(pipe_ctx, &blnd_cfg.black_color);
|
||||
} else if (dc->debug.visual_confirm == VISUAL_CONFIRM_SURFACE) {
|
||||
hws->funcs.get_surface_visual_confirm_color(
|
||||
pipe_ctx, &blnd_cfg.black_color);
|
||||
hws->funcs.get_surface_visual_confirm_color(pipe_ctx, &blnd_cfg.black_color);
|
||||
} else if (dc->debug.visual_confirm == VISUAL_CONFIRM_MPCTREE) {
|
||||
dcn20_get_mpctree_visual_confirm_color(
|
||||
pipe_ctx, &blnd_cfg.black_color);
|
||||
dcn20_get_mpctree_visual_confirm_color(pipe_ctx, &blnd_cfg.black_color);
|
||||
}
|
||||
|
||||
if (per_pixel_alpha)
|
||||
|
|
|
|||
|
|
@ -83,6 +83,8 @@
|
|||
SE_SF(DIG0_HDMI_METADATA_PACKET_CONTROL, HDMI_METADATA_PACKET_LINE, mask_sh),\
|
||||
SE_SF(DIG0_DIG_FE_CNTL, DOLBY_VISION_EN, mask_sh),\
|
||||
SE_SF(DP0_DP_PIXEL_FORMAT, DP_PIXEL_COMBINE, mask_sh),\
|
||||
SE_SF(DP0_DP_SEC_CNTL1, DP_SEC_GSP5_LINE_REFERENCE, mask_sh),\
|
||||
SE_SF(DP0_DP_SEC_CNTL5, DP_SEC_GSP5_LINE_NUM, mask_sh),\
|
||||
SE_SF(DP0_DP_SEC_FRAMING4, DP_SST_SDP_SPLITTING, mask_sh)
|
||||
|
||||
void dcn20_stream_encoder_construct(
|
||||
|
|
|
|||
|
|
@ -32,5 +32,6 @@ struct dccg *dccg21_create(
|
|||
const struct dccg_shift *dccg_shift,
|
||||
const struct dccg_mask *dccg_mask);
|
||||
|
||||
void dccg21_update_dpp_dto(struct dccg *dccg, int dpp_inst, int req_dppclk);
|
||||
|
||||
#endif /* __DCN21_DCCG_H__ */
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@
|
|||
(enc10->link_regs->index)
|
||||
|
||||
|
||||
static bool dcn30_link_encoder_validate_output_with_stream(
|
||||
bool dcn30_link_encoder_validate_output_with_stream(
|
||||
struct link_encoder *enc,
|
||||
const struct dc_stream_state *stream)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -78,4 +78,8 @@ void dcn30_link_encoder_construct(
|
|||
|
||||
void enc3_hw_init(struct link_encoder *enc);
|
||||
|
||||
bool dcn30_link_encoder_validate_output_with_stream(
|
||||
struct link_encoder *enc,
|
||||
const struct dc_stream_state *stream);
|
||||
|
||||
#endif /* __DC_LINK_ENCODER__DCN30_H__ */
|
||||
|
|
|
|||
|
|
@ -668,7 +668,7 @@ void dcn30_update_info_frame(struct pipe_ctx *pipe_ctx)
|
|||
is_hdmi_tmds = dc_is_hdmi_tmds_signal(pipe_ctx->stream->signal);
|
||||
is_dp = dc_is_dp_signal(pipe_ctx->stream->signal);
|
||||
|
||||
if (!is_hdmi_tmds)
|
||||
if (!is_hdmi_tmds && !is_dp)
|
||||
return;
|
||||
|
||||
if (is_hdmi_tmds)
|
||||
|
|
|
|||
|
|
@ -350,7 +350,7 @@ void dcn30_timing_generator_init(struct optc *optc1)
|
|||
optc1->min_h_blank = 32;
|
||||
optc1->min_v_blank = 3;
|
||||
optc1->min_v_blank_interlace = 5;
|
||||
optc1->min_h_sync_width = 8;
|
||||
optc1->min_h_sync_width = 4;
|
||||
optc1->min_v_sync_width = 1;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -271,7 +271,7 @@ struct timing_generator_funcs {
|
|||
struct dc_crtc_timing *hw_crtc_timing);
|
||||
|
||||
void (*set_vtg_params)(struct timing_generator *optc,
|
||||
const struct dc_crtc_timing *dc_crtc_timing);
|
||||
const struct dc_crtc_timing *dc_crtc_timing, bool program_fp2);
|
||||
|
||||
void (*set_dsc_config)(struct timing_generator *optc,
|
||||
enum optc_dsc_mode dsc_mode,
|
||||
|
|
|
|||
|
|
@ -47,10 +47,10 @@
|
|||
|
||||
/* Firmware versioning. */
|
||||
#ifdef DMUB_EXPOSE_VERSION
|
||||
#define DMUB_FW_VERSION_GIT_HASH 0x931573111
|
||||
#define DMUB_FW_VERSION_GIT_HASH 0xa18e25995
|
||||
#define DMUB_FW_VERSION_MAJOR 0
|
||||
#define DMUB_FW_VERSION_MINOR 0
|
||||
#define DMUB_FW_VERSION_REVISION 45
|
||||
#define DMUB_FW_VERSION_REVISION 46
|
||||
#define DMUB_FW_VERSION_TEST 0
|
||||
#define DMUB_FW_VERSION_VBIOS 0
|
||||
#define DMUB_FW_VERSION_HOTFIX 0
|
||||
|
|
@ -514,12 +514,20 @@ enum dp_aux_request_action {
|
|||
|
||||
enum aux_return_code_type {
|
||||
AUX_RET_SUCCESS = 0,
|
||||
AUX_RET_ERROR_UNKNOWN,
|
||||
AUX_RET_ERROR_INVALID_REPLY,
|
||||
AUX_RET_ERROR_TIMEOUT,
|
||||
AUX_RET_ERROR_NO_DATA,
|
||||
AUX_RET_ERROR_HPD_DISCON,
|
||||
AUX_RET_ERROR_ENGINE_ACQUIRE,
|
||||
AUX_RET_ERROR_INVALID_OPERATION,
|
||||
AUX_RET_ERROR_PROTOCOL_ERROR,
|
||||
};
|
||||
|
||||
enum aux_channel_type {
|
||||
AUX_CHANNEL_LEGACY_DDC,
|
||||
AUX_CHANNEL_DPIA
|
||||
};
|
||||
|
||||
/* DP AUX command */
|
||||
struct aux_transaction_parameters {
|
||||
uint8_t is_i2c_over_aux;
|
||||
|
|
@ -532,9 +540,10 @@ struct aux_transaction_parameters {
|
|||
|
||||
struct dmub_cmd_dp_aux_control_data {
|
||||
uint32_t handle;
|
||||
uint8_t port_index;
|
||||
uint8_t instance;
|
||||
uint8_t sw_crc_enabled;
|
||||
uint16_t timeout;
|
||||
enum aux_channel_type type;
|
||||
struct aux_transaction_parameters dpaux;
|
||||
};
|
||||
|
||||
|
|
@ -558,7 +567,7 @@ struct aux_reply_data {
|
|||
|
||||
struct aux_reply_control_data {
|
||||
uint32_t handle;
|
||||
uint8_t phy_port_index;
|
||||
uint8_t instance;
|
||||
uint8_t result;
|
||||
uint16_t pad;
|
||||
};
|
||||
|
|
@ -581,7 +590,7 @@ enum dp_hpd_status {
|
|||
};
|
||||
|
||||
struct dp_hpd_data {
|
||||
uint8_t phy_port_index;
|
||||
uint8_t instance;
|
||||
uint8_t hpd_type;
|
||||
uint8_t hpd_status;
|
||||
uint8_t pad;
|
||||
|
|
@ -732,27 +741,30 @@ enum dmub_cmd_abm_type {
|
|||
struct abm_config_table {
|
||||
/* Parameters for crgb conversion */
|
||||
uint16_t crgb_thresh[NUM_POWER_FN_SEGS]; // 0B
|
||||
uint16_t crgb_offset[NUM_POWER_FN_SEGS]; // 15B
|
||||
uint16_t crgb_slope[NUM_POWER_FN_SEGS]; // 31B
|
||||
uint16_t crgb_offset[NUM_POWER_FN_SEGS]; // 16B
|
||||
uint16_t crgb_slope[NUM_POWER_FN_SEGS]; // 32B
|
||||
|
||||
/* Parameters for custom curve */
|
||||
uint16_t backlight_thresholds[NUM_BL_CURVE_SEGS]; // 47B
|
||||
uint16_t backlight_offsets[NUM_BL_CURVE_SEGS]; // 79B
|
||||
uint16_t backlight_thresholds[NUM_BL_CURVE_SEGS]; // 48B
|
||||
uint16_t backlight_offsets[NUM_BL_CURVE_SEGS]; // 78B
|
||||
|
||||
uint16_t ambient_thresholds_lux[NUM_AMBI_LEVEL]; // 111B
|
||||
uint16_t min_abm_backlight; // 121B
|
||||
uint16_t ambient_thresholds_lux[NUM_AMBI_LEVEL]; // 112B
|
||||
uint16_t min_abm_backlight; // 122B
|
||||
|
||||
uint8_t min_reduction[NUM_AMBI_LEVEL][NUM_AGGR_LEVEL]; // 123B
|
||||
uint8_t max_reduction[NUM_AMBI_LEVEL][NUM_AGGR_LEVEL]; // 143B
|
||||
uint8_t bright_pos_gain[NUM_AMBI_LEVEL][NUM_AGGR_LEVEL]; // 163B
|
||||
uint8_t dark_pos_gain[NUM_AMBI_LEVEL][NUM_AGGR_LEVEL]; // 183B
|
||||
uint8_t hybrid_factor[NUM_AGGR_LEVEL]; // 203B
|
||||
uint8_t contrast_factor[NUM_AGGR_LEVEL]; // 207B
|
||||
uint8_t deviation_gain[NUM_AGGR_LEVEL]; // 211B
|
||||
uint8_t min_knee[NUM_AGGR_LEVEL]; // 215B
|
||||
uint8_t max_knee[NUM_AGGR_LEVEL]; // 219B
|
||||
uint8_t iir_curve[NUM_AMBI_LEVEL]; // 223B
|
||||
uint8_t pad3[3]; // 228B
|
||||
uint8_t min_reduction[NUM_AMBI_LEVEL][NUM_AGGR_LEVEL]; // 124B
|
||||
uint8_t max_reduction[NUM_AMBI_LEVEL][NUM_AGGR_LEVEL]; // 144B
|
||||
uint8_t bright_pos_gain[NUM_AMBI_LEVEL][NUM_AGGR_LEVEL]; // 164B
|
||||
uint8_t dark_pos_gain[NUM_AMBI_LEVEL][NUM_AGGR_LEVEL]; // 184B
|
||||
uint8_t hybrid_factor[NUM_AGGR_LEVEL]; // 204B
|
||||
uint8_t contrast_factor[NUM_AGGR_LEVEL]; // 208B
|
||||
uint8_t deviation_gain[NUM_AGGR_LEVEL]; // 212B
|
||||
uint8_t min_knee[NUM_AGGR_LEVEL]; // 216B
|
||||
uint8_t max_knee[NUM_AGGR_LEVEL]; // 220B
|
||||
uint8_t iir_curve[NUM_AMBI_LEVEL]; // 224B
|
||||
uint8_t pad3[3]; // 229B
|
||||
|
||||
uint16_t blRampReduction[NUM_AGGR_LEVEL]; // 232B
|
||||
uint16_t blRampStart[NUM_AGGR_LEVEL]; // 240B
|
||||
};
|
||||
|
||||
struct dmub_cmd_abm_set_pipe_data {
|
||||
|
|
|
|||
|
|
@ -30,6 +30,14 @@
|
|||
#include "opp.h"
|
||||
#include "color_gamma.h"
|
||||
|
||||
/* When calculating LUT values the first region and at least one subsequent
|
||||
* region are calculated with full precision. These defines are a demarcation
|
||||
* of where the second region starts and ends.
|
||||
* These are hardcoded values to avoid recalculating them in loops.
|
||||
*/
|
||||
#define PRECISE_LUT_REGION_START 224
|
||||
#define PRECISE_LUT_REGION_END 239
|
||||
|
||||
static struct hw_x_point coordinates_x[MAX_HW_POINTS + 2];
|
||||
|
||||
// these are helpers for calculations to reduce stack usage
|
||||
|
|
@ -346,7 +354,13 @@ static struct fixed31_32 translate_from_linear_space(
|
|||
dc_fixpt_recip(args->gamma));
|
||||
}
|
||||
scratch_1 = dc_fixpt_add(one, args->a3);
|
||||
if (cal_buffer->buffer_index < 16)
|
||||
/* In the first region (first 16 points) and in the
|
||||
* region delimited by START/END we calculate with
|
||||
* full precision to avoid error accumulation.
|
||||
*/
|
||||
if ((cal_buffer->buffer_index >= PRECISE_LUT_REGION_START &&
|
||||
cal_buffer->buffer_index <= PRECISE_LUT_REGION_END) ||
|
||||
(cal_buffer->buffer_index < 16))
|
||||
scratch_2 = dc_fixpt_pow(args->arg,
|
||||
dc_fixpt_recip(args->gamma));
|
||||
else
|
||||
|
|
@ -397,9 +411,7 @@ static struct fixed31_32 translate_from_linear_space_long(
|
|||
dc_fixpt_recip(args->gamma))),
|
||||
args->a2);
|
||||
else
|
||||
return dc_fixpt_mul(
|
||||
args->arg,
|
||||
args->a1);
|
||||
return dc_fixpt_mul(args->arg, args->a1);
|
||||
}
|
||||
|
||||
static struct fixed31_32 calculate_gamma22(struct fixed31_32 arg, bool use_eetf, struct calculate_buffer *cal_buffer)
|
||||
|
|
@ -717,7 +729,6 @@ static struct fixed31_32 calculate_mapped_value(
|
|||
BREAK_TO_DEBUGGER();
|
||||
result = dc_fixpt_zero;
|
||||
} else {
|
||||
BREAK_TO_DEBUGGER();
|
||||
result = dc_fixpt_one;
|
||||
}
|
||||
|
||||
|
|
@ -976,6 +987,7 @@ static bool build_freesync_hdr(struct pwl_float_data_ex *rgb_regamma,
|
|||
cal_buffer->buffer_index = 0; // see var definition for more info
|
||||
rgb += 32; // first 32 points have problems with fixed point, too small
|
||||
coord_x += 32;
|
||||
|
||||
for (i = 32; i <= hw_points_num; i++) {
|
||||
if (!is_clipped) {
|
||||
if (use_eetf) {
|
||||
|
|
|
|||
|
|
@ -499,6 +499,7 @@ enum atombios_firmware_capability
|
|||
ATOM_FIRMWARE_CAP_HWEMU_UMC_CFG = 0x00000100,
|
||||
ATOM_FIRMWARE_CAP_SRAM_ECC = 0x00000200,
|
||||
ATOM_FIRMWARE_CAP_ENABLE_2STAGE_BIST_TRAINING = 0x00000400,
|
||||
ATOM_FIRMWARE_CAP_ENABLE_2ND_USB20PORT = 0x0008000,
|
||||
};
|
||||
|
||||
enum atom_cooling_solution_id{
|
||||
|
|
|
|||
|
|
@ -227,6 +227,7 @@ struct smu_bios_boot_up_values
|
|||
uint32_t content_revision;
|
||||
uint32_t fclk;
|
||||
uint32_t lclk;
|
||||
uint32_t firmware_caps;
|
||||
};
|
||||
|
||||
enum smu_table_id
|
||||
|
|
|
|||
|
|
@ -178,7 +178,7 @@
|
|||
__SMU_DUMMY_MAP(SET_DRIVER_DUMMY_TABLE_DRAM_ADDR_LOW), \
|
||||
__SMU_DUMMY_MAP(GET_UMC_FW_WA), \
|
||||
__SMU_DUMMY_MAP(Mode1Reset), \
|
||||
__SMU_DUMMY_MAP(Spare), \
|
||||
__SMU_DUMMY_MAP(RlcPowerNotify), \
|
||||
__SMU_DUMMY_MAP(SetHardMinIspiclkByFreq), \
|
||||
__SMU_DUMMY_MAP(SetHardMinIspxclkByFreq), \
|
||||
__SMU_DUMMY_MAP(SetSoftMinSocclkByFreq), \
|
||||
|
|
@ -209,6 +209,8 @@
|
|||
__SMU_DUMMY_MAP(SetSoftMinCclk), \
|
||||
__SMU_DUMMY_MAP(SetSoftMaxCclk), \
|
||||
__SMU_DUMMY_MAP(SetGpoFeaturePMask), \
|
||||
__SMU_DUMMY_MAP(DisallowGpo), \
|
||||
__SMU_DUMMY_MAP(Enable2ndUSB20Port), \
|
||||
|
||||
#undef __SMU_DUMMY_MAP
|
||||
#define __SMU_DUMMY_MAP(type) SMU_MSG_##type
|
||||
|
|
|
|||
|
|
@ -134,6 +134,10 @@
|
|||
#define PPSMC_MSG_SetGpoFeaturePMask 0x45
|
||||
#define PPSMC_MSG_SetSMBUSInterrupt 0x46
|
||||
|
||||
#define PPSMC_Message_Count 0x47
|
||||
#define PPSMC_MSG_DisallowGpo 0x56
|
||||
|
||||
#define PPSMC_MSG_Enable2ndUSB20Port 0x57
|
||||
|
||||
#define PPSMC_Message_Count 0x58
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@
|
|||
#define PPSMC_MSG_PowerUpIspByTile 0x7
|
||||
#define PPSMC_MSG_PowerDownVcn 0x8 // VCN is power gated by default
|
||||
#define PPSMC_MSG_PowerUpVcn 0x9
|
||||
#define PPSMC_MSG_spare 0xA
|
||||
#define PPSMC_MSG_RlcPowerNotify 0xA
|
||||
#define PPSMC_MSG_SetHardMinVcn 0xB // For wireless display
|
||||
#define PPSMC_MSG_SetSoftMinGfxclk 0xC //Sets SoftMin for GFXCLK. Arg is in MHz
|
||||
#define PPSMC_MSG_ActiveProcessNotify 0xD
|
||||
|
|
|
|||
|
|
@ -847,12 +847,10 @@ static int smu_sw_init(void *handle)
|
|||
smu->smu_dpm.dpm_level = AMD_DPM_FORCED_LEVEL_AUTO;
|
||||
smu->smu_dpm.requested_dpm_level = AMD_DPM_FORCED_LEVEL_AUTO;
|
||||
|
||||
if (!amdgpu_sriov_vf(adev) || (adev->asic_type != CHIP_NAVI12)) {
|
||||
ret = smu_init_microcode(smu);
|
||||
if (ret) {
|
||||
dev_err(adev->dev, "Failed to load smu firmware!\n");
|
||||
return ret;
|
||||
}
|
||||
ret = smu_init_microcode(smu);
|
||||
if (ret) {
|
||||
dev_err(adev->dev, "Failed to load smu firmware!\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = smu_smc_table_sw_init(smu);
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user