diff options
48 files changed, 391 insertions, 212 deletions
| @@ -842,10 +842,9 @@ D: ax25-utils maintainer.  N: Helge Deller -D: PA-RISC Linux hacker, LASI-, ASP-, WAX-, LCD/LED-driver -S: Schimmelsrain 1 -S: D-69231 Rauenberg +W: http://www.parisc-linux.org/ +D: PA-RISC Linux architecture maintainer +D: LASI-, ASP-, WAX-, LCD/LED-driver  S: Germany  N: Jean Delvare @@ -1361,7 +1360,7 @@ S: Stellenbosch, Western Cape  S: South Africa  N: Grant Grundler  W: http://obmouse.sourceforge.net/  W: http://www.parisc-linux.org/  D: obmouse - rewrote Olivier Florent's Omnibook 600 "pop-up" mouse driver @@ -2492,7 +2491,7 @@ S: Syracuse, New York 13206  S: USA  N: Kyle McMartin  D: Linux/PARISC hacker  D: AD1889 sound driver  S: Ottawa, Canada @@ -3780,14 +3779,13 @@ S: 21513 Conradia Ct  S: Cupertino, CA 95014  S: USA -N: Thibaut Varene -W: http://www.parisc-linux.org/~varenet/ -P: 1024D/B7D2F063 E67C 0D43 A75E 12A5 BB1C  FA2F 1E32 C3DA B7D2 F063 +N: Thibaut Varène +W: http://hacks.slashdirt.org/  D: PA-RISC port minion, PDC and GSCPS2 drivers, debuglocks and other bits  D: Some ARM at91rm9200 bits, S1D13XXX FB driver, random patches here and there  D: AD1889 sound driver -S: Paris, France +S: France  N: Heikki Vatiainen diff --git a/MAINTAINERS b/MAINTAINERS index 41ce5f4ad838..e6e17d8c5aae 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -409,8 +409,7 @@ F:	drivers/platform/x86/wmi.c  F:	include/uapi/linux/wmi.h  AD1889 ALSA SOUND DRIVER -M:	Thibaut Varene <[email protected]> -W:	http://wiki.parisc-linux.org/AD1889 +W:	https://parisc.wiki.kernel.org/index.php/AD1889  S:	Maintained  F:	sound/pci/ad1889.* @@ -11488,7 +11487,7 @@ F:	Documentation/blockdev/paride.txt  F:	drivers/block/paride/  PARISC ARCHITECTURE -M:	"James E.J. Bottomley" <[email protected]> +M:	"James E.J. Bottomley" <[email protected]>  M:	Helge Deller <[email protected]>  W:	http://www.parisc-linux.org/ diff --git a/arch/arc/Kconfig b/arch/arc/Kconfig index 376366a7db81..d750b302d5ab 100644 --- a/arch/arc/Kconfig +++ b/arch/arc/Kconfig @@ -191,7 +191,6 @@ config NR_CPUS  config ARC_SMP_HALT_ON_RESET  	bool "Enable Halt-on-reset boot mode" -	default y if ARC_UBOOT_SUPPORT  	help  	  In SMP configuration cores can be configured as Halt-on-reset  	  or they could all start at same time. For Halt-on-reset, non @@ -407,6 +406,14 @@ config ARC_HAS_ACCL_REGS  	  (also referred to as r58:r59). These can also be used by gcc as GPR so  	  kernel needs to save/restore per process +config ARC_IRQ_NO_AUTOSAVE +	bool "Disable hardware autosave regfile on interrupts" +	default n +	help +	  On HS cores, taken interrupt auto saves the regfile on stack. +	  This is programmable and can be optionally disabled in which case +	  software INTERRUPT_PROLOGUE/EPILGUE do the needed work +  endif	# ISA_ARCV2  endmenu   # "ARC CPU Configuration" @@ -515,17 +522,6 @@ config ARC_DBG_TLB_PARANOIA  endif -config ARC_UBOOT_SUPPORT -	bool "Support uboot arg Handling" -	help -	  ARC Linux by default checks for uboot provided args as pointers to -	  external cmdline or DTB. This however breaks in absence of uboot, -	  when booting from Metaware debugger directly, as the registers are -	  not zeroed out on reset by mdb and/or ARCv2 based cores. The bogus -	  registers look like uboot args to kernel which then chokes. -	  So only enable the uboot arg checking/processing if users are sure -	  of uboot being in play. -  config ARC_BUILTIN_DTB_NAME  	string "Built in DTB"  	help diff --git a/arch/arc/configs/nps_defconfig b/arch/arc/configs/nps_defconfig index 6e84060e7c90..621f59407d76 100644 --- a/arch/arc/configs/nps_defconfig +++ b/arch/arc/configs/nps_defconfig @@ -31,7 +31,6 @@ CONFIG_ARC_CACHE_LINE_SHIFT=5  # CONFIG_ARC_HAS_LLSC is not set  CONFIG_ARC_KVADDR_SIZE=402  CONFIG_ARC_EMUL_UNALIGNED=y -CONFIG_ARC_UBOOT_SUPPORT=y  CONFIG_PREEMPT=y  CONFIG_NET=y  CONFIG_UNIX=y diff --git a/arch/arc/configs/vdk_hs38_defconfig b/arch/arc/configs/vdk_hs38_defconfig index 1e59a2e9c602..e447ace6fa1c 100644 --- a/arch/arc/configs/vdk_hs38_defconfig +++ b/arch/arc/configs/vdk_hs38_defconfig @@ -13,7 +13,6 @@ CONFIG_PARTITION_ADVANCED=y  CONFIG_ARC_PLAT_AXS10X=y  CONFIG_AXS103=y  CONFIG_ISA_ARCV2=y -CONFIG_ARC_UBOOT_SUPPORT=y  CONFIG_ARC_BUILTIN_DTB_NAME="vdk_hs38"  CONFIG_PREEMPT=y  CONFIG_NET=y diff --git a/arch/arc/configs/vdk_hs38_smp_defconfig b/arch/arc/configs/vdk_hs38_smp_defconfig index b5c3f6c54b03..c82cdb10aaf4 100644 --- a/arch/arc/configs/vdk_hs38_smp_defconfig +++ b/arch/arc/configs/vdk_hs38_smp_defconfig @@ -15,8 +15,6 @@ CONFIG_AXS103=y  CONFIG_ISA_ARCV2=y  CONFIG_SMP=y  # CONFIG_ARC_TIMERS_64BIT is not set -# CONFIG_ARC_SMP_HALT_ON_RESET is not set -CONFIG_ARC_UBOOT_SUPPORT=y  CONFIG_ARC_BUILTIN_DTB_NAME="vdk_hs38_smp"  CONFIG_PREEMPT=y  CONFIG_NET=y diff --git a/arch/arc/include/asm/arcregs.h b/arch/arc/include/asm/arcregs.h index f1b86cef0905..a27eafdc8260 100644 --- a/arch/arc/include/asm/arcregs.h +++ b/arch/arc/include/asm/arcregs.h @@ -151,6 +151,14 @@ struct bcr_isa_arcv2 {  #endif  }; +struct bcr_uarch_build_arcv2 { +#ifdef CONFIG_CPU_BIG_ENDIAN +	unsigned int pad:8, prod:8, maj:8, min:8; +#else +	unsigned int min:8, maj:8, prod:8, pad:8; +#endif +}; +  struct bcr_mpy {  #ifdef CONFIG_CPU_BIG_ENDIAN  	unsigned int pad:8, x1616:8, dsp:4, cycles:2, type:2, ver:8; diff --git a/arch/arc/include/asm/cache.h b/arch/arc/include/asm/cache.h index f393b663413e..2ad77fb43639 100644 --- a/arch/arc/include/asm/cache.h +++ b/arch/arc/include/asm/cache.h @@ -52,6 +52,17 @@  #define cache_line_size()	SMP_CACHE_BYTES  #define ARCH_DMA_MINALIGN	SMP_CACHE_BYTES +/* + * Make sure slab-allocated buffers are 64-bit aligned when atomic64_t uses + * ARCv2 64-bit atomics (LLOCKD/SCONDD). This guarantess runtime 64-bit + * alignment for any atomic64_t embedded in buffer. + * Default ARCH_SLAB_MINALIGN is __alignof__(long long) which has a relaxed + * value of 4 (and not 8) in ARC ABI. + */ +#if defined(CONFIG_ARC_HAS_LL64) && defined(CONFIG_ARC_HAS_LLSC) +#define ARCH_SLAB_MINALIGN	8 +#endif +  extern void arc_cache_init(void);  extern char *arc_cache_mumbojumbo(int cpu_id, char *buf, int len);  extern void read_decode_cache_bcr(void); diff --git a/arch/arc/include/asm/entry-arcv2.h b/arch/arc/include/asm/entry-arcv2.h index 309f4e6721b3..225e7df2d8ed 100644 --- a/arch/arc/include/asm/entry-arcv2.h +++ b/arch/arc/include/asm/entry-arcv2.h @@ -17,6 +17,33 @@  	;  	; Now manually save: r12, sp, fp, gp, r25 +#ifdef CONFIG_ARC_IRQ_NO_AUTOSAVE +.ifnc \called_from, exception +	st.as	r9, [sp, -10]	; save r9 in it's final stack slot +	sub	sp, sp, 12	; skip JLI, LDI, EI + +	PUSH	lp_count +	PUSHAX	lp_start +	PUSHAX	lp_end +	PUSH	blink + +	PUSH	r11 +	PUSH	r10 + +	sub	sp, sp, 4	; skip r9 + +	PUSH	r8 +	PUSH	r7 +	PUSH	r6 +	PUSH	r5 +	PUSH	r4 +	PUSH	r3 +	PUSH	r2 +	PUSH	r1 +	PUSH	r0 +.endif +#endif +  #ifdef CONFIG_ARC_HAS_ACCL_REGS  	PUSH	r59  	PUSH	r58 @@ -86,6 +113,33 @@  	POP	r59  #endif +#ifdef CONFIG_ARC_IRQ_NO_AUTOSAVE +.ifnc \called_from, exception +	POP	r0 +	POP	r1 +	POP	r2 +	POP	r3 +	POP	r4 +	POP	r5 +	POP	r6 +	POP	r7 +	POP	r8 +	POP	r9 +	POP	r10 +	POP	r11 + +	POP	blink +	POPAX	lp_end +	POPAX	lp_start + +	POP	r9 +	mov	lp_count, r9 + +	add	sp, sp, 12	; skip JLI, LDI, EI +	ld.as	r9, [sp, -10]	; reload r9 which got clobbered +.endif +#endif +  .endm  /*------------------------------------------------------------------------*/ diff --git a/arch/arc/include/asm/uaccess.h b/arch/arc/include/asm/uaccess.h index c9173c02081c..eabc3efa6c6d 100644 --- a/arch/arc/include/asm/uaccess.h +++ b/arch/arc/include/asm/uaccess.h @@ -207,7 +207,7 @@ raw_copy_from_user(void *to, const void __user *from, unsigned long n)  		*/  		  "=&r" (tmp), "+r" (to), "+r" (from)  		: -		: "lp_count", "lp_start", "lp_end", "memory"); +		: "lp_count", "memory");  		return n;  	} @@ -433,7 +433,7 @@ raw_copy_to_user(void __user *to, const void *from, unsigned long n)  		 */  		  "=&r" (tmp), "+r" (to), "+r" (from)  		: -		: "lp_count", "lp_start", "lp_end", "memory"); +		: "lp_count", "memory");  		return n;  	} @@ -653,7 +653,7 @@ static inline unsigned long __arc_clear_user(void __user *to, unsigned long n)  	"	.previous			\n"  	: "+r"(d_char), "+r"(res)  	: "i"(0) -	: "lp_count", "lp_start", "lp_end", "memory"); +	: "lp_count", "memory");  	return res;  } @@ -686,7 +686,7 @@ __arc_strncpy_from_user(char *dst, const char __user *src, long count)  	"	.previous			\n"  	: "+r"(res), "+r"(dst), "+r"(src), "=r"(val)  	: "g"(-EFAULT), "r"(count) -	: "lp_count", "lp_start", "lp_end", "memory"); +	: "lp_count", "memory");  	return res;  } diff --git a/arch/arc/kernel/entry-arcv2.S b/arch/arc/kernel/entry-arcv2.S index cc558a25b8fa..562089d62d9d 100644 --- a/arch/arc/kernel/entry-arcv2.S +++ b/arch/arc/kernel/entry-arcv2.S @@ -209,7 +209,9 @@ restore_regs:  ;####### Return from Intr #######  debug_marker_l1: -	bbit1.nt r0, STATUS_DE_BIT, .Lintr_ret_to_delay_slot +	; bbit1.nt r0, STATUS_DE_BIT, .Lintr_ret_to_delay_slot +	btst	r0, STATUS_DE_BIT		; Z flag set if bit clear +	bnz	.Lintr_ret_to_delay_slot	; branch if STATUS_DE_BIT set  .Lisr_ret_fast_path:  	; Handle special case #1: (Entry via Exception, Return via IRQ) diff --git a/arch/arc/kernel/head.S b/arch/arc/kernel/head.S index 8b90d25a15cc..30e090625916 100644 --- a/arch/arc/kernel/head.S +++ b/arch/arc/kernel/head.S @@ -17,6 +17,7 @@  #include <asm/entry.h>  #include <asm/arcregs.h>  #include <asm/cache.h> +#include <asm/irqflags.h>  .macro CPU_EARLY_SETUP @@ -47,6 +48,15 @@  	sr	r5, [ARC_REG_DC_CTRL]  1: + +#ifdef CONFIG_ISA_ARCV2 +	; Unaligned access is disabled at reset, so re-enable early as +	; gcc 7.3.1 (ARC GNU 2018.03) onwards generates unaligned access +	; by default +	lr	r5, [status32] +	bset	r5, r5, STATUS_AD_BIT +	kflag	r5 +#endif  .endm  	.section .init.text, "ax",@progbits @@ -90,15 +100,13 @@ ENTRY(stext)  	st.ab   0, [r5, 4]  1: -#ifdef CONFIG_ARC_UBOOT_SUPPORT  	; Uboot - kernel ABI  	;    r0 = [0] No uboot interaction, [1] cmdline in r2, [2] DTB in r2 -	;    r1 = magic number (board identity, unused as of now +	;    r1 = magic number (always zero as of now)  	;    r2 = pointer to uboot provided cmdline or external DTB in mem -	; These are handled later in setup_arch() +	; These are handled later in handle_uboot_args()  	st	r0, [@uboot_tag]  	st	r2, [@uboot_arg] -#endif  	; setup "current" tsk and optionally cache it in dedicated r25  	mov	r9, @init_task diff --git a/arch/arc/kernel/intc-arcv2.c b/arch/arc/kernel/intc-arcv2.c index 067ea362fb3e..cf18b3e5a934 100644 --- a/arch/arc/kernel/intc-arcv2.c +++ b/arch/arc/kernel/intc-arcv2.c @@ -49,11 +49,13 @@ void arc_init_IRQ(void)  	*(unsigned int *)&ictrl = 0; +#ifndef CONFIG_ARC_IRQ_NO_AUTOSAVE  	ictrl.save_nr_gpr_pairs = 6;	/* r0 to r11 (r12 saved manually) */  	ictrl.save_blink = 1;  	ictrl.save_lp_regs = 1;		/* LP_COUNT, LP_START, LP_END */  	ictrl.save_u_to_u = 0;		/* user ctxt saved on kernel stack */  	ictrl.save_idx_regs = 1;	/* JLI, LDI, EI */ +#endif  	WRITE_AUX(AUX_IRQ_CTRL, ictrl); diff --git a/arch/arc/kernel/setup.c b/arch/arc/kernel/setup.c index feb90093e6b1..7b2340996cf8 100644 --- a/arch/arc/kernel/setup.c +++ b/arch/arc/kernel/setup.c @@ -199,20 +199,36 @@ static void read_arc_build_cfg_regs(void)  		cpu->bpu.ret_stk = 4 << bpu.rse;  		if (cpu->core.family >= 0x54) { -			unsigned int exec_ctrl; -			READ_BCR(AUX_EXEC_CTRL, exec_ctrl); -			cpu->extn.dual_enb = !(exec_ctrl & 1); +			struct bcr_uarch_build_arcv2 uarch; -			/* dual issue always present for this core */ -			cpu->extn.dual = 1; +			/* +			 * The first 0x54 core (uarch maj:min 0:1 or 0:2) was +			 * dual issue only (HS4x). But next uarch rev (1:0) +			 * allows it be configured for single issue (HS3x) +			 * Ensure we fiddle with dual issue only on HS4x +			 */ +			READ_BCR(ARC_REG_MICRO_ARCH_BCR, uarch); + +			if (uarch.prod == 4) { +				unsigned int exec_ctrl; + +				/* dual issue hardware always present */ +				cpu->extn.dual = 1; + +				READ_BCR(AUX_EXEC_CTRL, exec_ctrl); + +				/* dual issue hardware enabled ? */ +				cpu->extn.dual_enb = !(exec_ctrl & 1); + +			}  		}  	}  	READ_BCR(ARC_REG_AP_BCR, ap);  	if (ap.ver) {  		cpu->extn.ap_num = 2 << ap.num; -		cpu->extn.ap_full = !!ap.min; +		cpu->extn.ap_full = !ap.min;  	}  	READ_BCR(ARC_REG_SMART_BCR, bcr); @@ -462,43 +478,78 @@ void setup_processor(void)  	arc_chk_core_config();  } -static inline int is_kernel(unsigned long addr) +static inline bool uboot_arg_invalid(unsigned long addr)  { -	if (addr >= (unsigned long)_stext && addr <= (unsigned long)_end) -		return 1; -	return 0; +	/* +	 * Check that it is a untranslated address (although MMU is not enabled +	 * yet, it being a high address ensures this is not by fluke) +	 */ +	if (addr < PAGE_OFFSET) +		return true; + +	/* Check that address doesn't clobber resident kernel image */ +	return addr >= (unsigned long)_stext && addr <= (unsigned long)_end;  } -void __init setup_arch(char **cmdline_p) +#define IGNORE_ARGS		"Ignore U-boot args: " + +/* uboot_tag values for U-boot - kernel ABI revision 0; see head.S */ +#define UBOOT_TAG_NONE		0 +#define UBOOT_TAG_CMDLINE	1 +#define UBOOT_TAG_DTB		2 + +void __init handle_uboot_args(void)  { -#ifdef CONFIG_ARC_UBOOT_SUPPORT -	/* make sure that uboot passed pointer to cmdline/dtb is valid */ -	if (uboot_tag && is_kernel((unsigned long)uboot_arg)) -		panic("Invalid uboot arg\n"); - -	/* See if u-boot passed an external Device Tree blob */ -	machine_desc = setup_machine_fdt(uboot_arg);	/* uboot_tag == 2 */ -	if (!machine_desc) -#endif -	{ -		/* No, so try the embedded one */ +	bool use_embedded_dtb = true; +	bool append_cmdline = false; + +	/* check that we know this tag */ +	if (uboot_tag != UBOOT_TAG_NONE && +	    uboot_tag != UBOOT_TAG_CMDLINE && +	    uboot_tag != UBOOT_TAG_DTB) { +		pr_warn(IGNORE_ARGS "invalid uboot tag: '%08x'\n", uboot_tag); +		goto ignore_uboot_args; +	} + +	if (uboot_tag != UBOOT_TAG_NONE && +            uboot_arg_invalid((unsigned long)uboot_arg)) { +		pr_warn(IGNORE_ARGS "invalid uboot arg: '%px'\n", uboot_arg); +		goto ignore_uboot_args; +	} + +	/* see if U-boot passed an external Device Tree blob */ +	if (uboot_tag == UBOOT_TAG_DTB) { +		machine_desc = setup_machine_fdt((void *)uboot_arg); + +		/* external Device Tree blob is invalid - use embedded one */ +		use_embedded_dtb = !machine_desc; +	} + +	if (uboot_tag == UBOOT_TAG_CMDLINE) +		append_cmdline = true; + +ignore_uboot_args: + +	if (use_embedded_dtb) {  		machine_desc = setup_machine_fdt(__dtb_start);  		if (!machine_desc)  			panic("Embedded DT invalid\n"); +	} -		/* -		 * If we are here, it is established that @uboot_arg didn't -		 * point to DT blob. Instead if u-boot says it is cmdline, -		 * append to embedded DT cmdline. -		 * setup_machine_fdt() would have populated @boot_command_line -		 */ -		if (uboot_tag == 1) { -			/* Ensure a whitespace between the 2 cmdlines */ -			strlcat(boot_command_line, " ", COMMAND_LINE_SIZE); -			strlcat(boot_command_line, uboot_arg, -				COMMAND_LINE_SIZE); -		} +	/* +	 * NOTE: @boot_command_line is populated by setup_machine_fdt() so this +	 * append processing can only happen after. +	 */ +	if (append_cmdline) { +		/* Ensure a whitespace between the 2 cmdlines */ +		strlcat(boot_command_line, " ", COMMAND_LINE_SIZE); +		strlcat(boot_command_line, uboot_arg, COMMAND_LINE_SIZE);  	} +} + +void __init setup_arch(char **cmdline_p) +{ +	handle_uboot_args();  	/* Save unparsed command line copy for /proc/cmdline */  	*cmdline_p = boot_command_line; diff --git a/arch/arc/lib/memcpy-archs.S b/arch/arc/lib/memcpy-archs.S index d61044dd8b58..ea14b0bf3116 100644 --- a/arch/arc/lib/memcpy-archs.S +++ b/arch/arc/lib/memcpy-archs.S @@ -25,15 +25,11 @@  #endif  #ifdef CONFIG_ARC_HAS_LL64 -# define PREFETCH_READ(RX)	prefetch    [RX, 56] -# define PREFETCH_WRITE(RX)	prefetchw   [RX, 64]  # define LOADX(DST,RX)		ldd.ab	DST, [RX, 8]  # define STOREX(SRC,RX)		std.ab	SRC, [RX, 8]  # define ZOLSHFT		5  # define ZOLAND			0x1F  #else -# define PREFETCH_READ(RX)	prefetch    [RX, 28] -# define PREFETCH_WRITE(RX)	prefetchw   [RX, 32]  # define LOADX(DST,RX)		ld.ab	DST, [RX, 4]  # define STOREX(SRC,RX)		st.ab	SRC, [RX, 4]  # define ZOLSHFT		4 @@ -41,8 +37,6 @@  #endif  ENTRY_CFI(memcpy) -	prefetch [r1]		; Prefetch the read location -	prefetchw [r0]		; Prefetch the write location  	mov.f	0, r2  ;;; if size is zero  	jz.d	[blink] @@ -72,8 +66,6 @@ ENTRY_CFI(memcpy)  	lpnz	@.Lcopy32_64bytes  	;; LOOP START  	LOADX (r6, r1) -	PREFETCH_READ (r1) -	PREFETCH_WRITE (r3)  	LOADX (r8, r1)  	LOADX (r10, r1)  	LOADX (r4, r1) @@ -117,9 +109,7 @@ ENTRY_CFI(memcpy)  	lpnz	@.Lcopy8bytes_1  	;; LOOP START  	ld.ab	r6, [r1, 4] -	prefetch [r1, 28]	;Prefetch the next read location  	ld.ab	r8, [r1,4] -	prefetchw [r3, 32]	;Prefetch the next write location  	SHIFT_1	(r7, r6, 24)  	or	r7, r7, r5 @@ -162,9 +152,7 @@ ENTRY_CFI(memcpy)  	lpnz	@.Lcopy8bytes_2  	;; LOOP START  	ld.ab	r6, [r1, 4] -	prefetch [r1, 28]	;Prefetch the next read location  	ld.ab	r8, [r1,4] -	prefetchw [r3, 32]	;Prefetch the next write location  	SHIFT_1	(r7, r6, 16)  	or	r7, r7, r5 @@ -204,9 +192,7 @@ ENTRY_CFI(memcpy)  	lpnz	@.Lcopy8bytes_3  	;; LOOP START  	ld.ab	r6, [r1, 4] -	prefetch [r1, 28]	;Prefetch the next read location  	ld.ab	r8, [r1,4] -	prefetchw [r3, 32]	;Prefetch the next write location  	SHIFT_1	(r7, r6, 8)  	or	r7, r7, r5 diff --git a/arch/arc/plat-hsdk/Kconfig b/arch/arc/plat-hsdk/Kconfig index f25c085b9874..23e00216e5a5 100644 --- a/arch/arc/plat-hsdk/Kconfig +++ b/arch/arc/plat-hsdk/Kconfig @@ -9,6 +9,7 @@ menuconfig ARC_SOC_HSDK  	bool "ARC HS Development Kit SOC"  	depends on ISA_ARCV2  	select ARC_HAS_ACCL_REGS +	select ARC_IRQ_NO_AUTOSAVE  	select CLK_HSDK  	select RESET_HSDK  	select HAVE_PCI diff --git a/arch/arm/boot/dts/am335x-evm.dts b/arch/arm/boot/dts/am335x-evm.dts index b67f5fee1469..dce5be5df97b 100644 --- a/arch/arm/boot/dts/am335x-evm.dts +++ b/arch/arm/boot/dts/am335x-evm.dts @@ -729,7 +729,7 @@  &cpsw_emac0 {  	phy-handle = <ðphy0>; -	phy-mode = "rgmii-txid"; +	phy-mode = "rgmii-id";  };  &tscadc { diff --git a/arch/arm/boot/dts/am335x-evmsk.dts b/arch/arm/boot/dts/am335x-evmsk.dts index 172c0224e7f6..b128998097ce 100644 --- a/arch/arm/boot/dts/am335x-evmsk.dts +++ b/arch/arm/boot/dts/am335x-evmsk.dts @@ -651,13 +651,13 @@  &cpsw_emac0 {  	phy-handle = <ðphy0>; -	phy-mode = "rgmii-txid"; +	phy-mode = "rgmii-id";  	dual_emac_res_vlan = <1>;  };  &cpsw_emac1 {  	phy-handle = <ðphy1>; -	phy-mode = "rgmii-txid"; +	phy-mode = "rgmii-id";  	dual_emac_res_vlan = <2>;  }; diff --git a/arch/arm/boot/dts/armada-xp-db.dts b/arch/arm/boot/dts/armada-xp-db.dts index f3ac7483afed..5d04dc68cf57 100644 --- a/arch/arm/boot/dts/armada-xp-db.dts +++ b/arch/arm/boot/dts/armada-xp-db.dts @@ -144,30 +144,32 @@  				status = "okay";  			}; -			nand@d0000 { +			nand-controller@d0000 {  				status = "okay"; -				label = "pxa3xx_nand-0"; -				num-cs = <1>; -				marvell,nand-keep-config; -				nand-on-flash-bbt; - -				partitions { -					compatible = "fixed-partitions"; -					#address-cells = <1>; -					#size-cells = <1>; - -					partition@0 { -						label = "U-Boot"; -						reg = <0 0x800000>; -					}; -					partition@800000 { -						label = "Linux"; -						reg = <0x800000 0x800000>; -					}; -					partition@1000000 { -						label = "Filesystem"; -						reg = <0x1000000 0x3f000000>; +				nand@0 { +					reg = <0>; +					label = "pxa3xx_nand-0"; +					nand-rb = <0>; +					nand-on-flash-bbt; + +					partitions { +						compatible = "fixed-partitions"; +						#address-cells = <1>; +						#size-cells = <1>; + +						partition@0 { +							label = "U-Boot"; +							reg = <0 0x800000>; +						}; +						partition@800000 { +							label = "Linux"; +							reg = <0x800000 0x800000>; +						}; +						partition@1000000 { +							label = "Filesystem"; +							reg = <0x1000000 0x3f000000>; +						};  					};  				};  			}; diff --git a/arch/arm/boot/dts/armada-xp-gp.dts b/arch/arm/boot/dts/armada-xp-gp.dts index 1139e9469a83..b4cca507cf13 100644 --- a/arch/arm/boot/dts/armada-xp-gp.dts +++ b/arch/arm/boot/dts/armada-xp-gp.dts @@ -160,12 +160,15 @@  				status = "okay";  			}; -			nand@d0000 { +			nand-controller@d0000 {  				status = "okay"; -				label = "pxa3xx_nand-0"; -				num-cs = <1>; -				marvell,nand-keep-config; -				nand-on-flash-bbt; + +				nand@0 { +					reg = <0>; +					label = "pxa3xx_nand-0"; +					nand-rb = <0>; +					nand-on-flash-bbt; +				};  			};  		}; diff --git a/arch/arm/boot/dts/armada-xp-lenovo-ix4-300d.dts b/arch/arm/boot/dts/armada-xp-lenovo-ix4-300d.dts index bbbb38888bb8..87dcb502f72d 100644 --- a/arch/arm/boot/dts/armada-xp-lenovo-ix4-300d.dts +++ b/arch/arm/boot/dts/armada-xp-lenovo-ix4-300d.dts @@ -81,49 +81,52 @@  			}; -			nand@d0000 { +			nand-controller@d0000 {  				status = "okay"; -				label = "pxa3xx_nand-0"; -				num-cs = <1>; -				marvell,nand-keep-config; -				nand-on-flash-bbt; - -				partitions { -					compatible = "fixed-partitions"; -					#address-cells = <1>; -					#size-cells = <1>; - -					partition@0 { -						label = "u-boot"; -						reg = <0x00000000 0x000e0000>; -						read-only; -					}; - -					partition@e0000 { -						label = "u-boot-env"; -						reg = <0x000e0000 0x00020000>; -						read-only; -					}; - -					partition@100000 { -						label = "u-boot-env2"; -						reg = <0x00100000 0x00020000>; -						read-only; -					}; - -					partition@120000 { -						label = "zImage"; -						reg = <0x00120000 0x00400000>; -					}; - -					partition@520000 { -						label = "initrd"; -						reg = <0x00520000 0x00400000>; -					}; -					partition@e00000 { -						label = "boot"; -						reg = <0x00e00000 0x3f200000>; +				nand@0 { +					reg = <0>; +					label = "pxa3xx_nand-0"; +					nand-rb = <0>; +					nand-on-flash-bbt; + +					partitions { +						compatible = "fixed-partitions"; +						#address-cells = <1>; +						#size-cells = <1>; + +						partition@0 { +							label = "u-boot"; +							reg = <0x00000000 0x000e0000>; +							read-only; +						}; + +						partition@e0000 { +							label = "u-boot-env"; +							reg = <0x000e0000 0x00020000>; +							read-only; +						}; + +						partition@100000 { +							label = "u-boot-env2"; +							reg = <0x00100000 0x00020000>; +							read-only; +						}; + +						partition@120000 { +							label = "zImage"; +							reg = <0x00120000 0x00400000>; +						}; + +						partition@520000 { +							label = "initrd"; +							reg = <0x00520000 0x00400000>; +						}; + +						partition@e00000 { +							label = "boot"; +							reg = <0x00e00000 0x3f200000>; +						};  					};  				};  			}; diff --git a/arch/arm/boot/dts/tegra124-nyan.dtsi b/arch/arm/boot/dts/tegra124-nyan.dtsi index d5f11d6d987e..bc85b6a166c7 100644 --- a/arch/arm/boot/dts/tegra124-nyan.dtsi +++ b/arch/arm/boot/dts/tegra124-nyan.dtsi @@ -13,10 +13,25 @@  		stdout-path = "serial0:115200n8";  	}; -	memory@80000000 { +	/* +	 * Note that recent version of the device tree compiler (starting with +	 * version 1.4.2) warn about this node containing a reg property, but +	 * missing a unit-address. However, the bootloader on these Chromebook +	 * devices relies on the full name of this node to be exactly /memory. +	 * Adding the unit-address causes the bootloader to create a /memory +	 * node and write the memory bank configuration to that node, which in +	 * turn leads the kernel to believe that the device has 2 GiB of +	 * memory instead of the amount detected by the bootloader. +	 * +	 * The name of this node is effectively ABI and must not be changed. +	 */ +	memory { +		device_type = "memory";  		reg = <0x0 0x80000000 0x0 0x80000000>;  	}; +	/delete-node/ memory@80000000; +  	host1x@50000000 {  		hdmi@54280000 {  			status = "okay"; diff --git a/arch/arm64/boot/dts/marvell/armada-8040-clearfog-gt-8k.dts b/arch/arm64/boot/dts/marvell/armada-8040-clearfog-gt-8k.dts index 5b4a9609e31f..2468762283a5 100644 --- a/arch/arm64/boot/dts/marvell/armada-8040-clearfog-gt-8k.dts +++ b/arch/arm64/boot/dts/marvell/armada-8040-clearfog-gt-8k.dts @@ -351,7 +351,7 @@  		reg = <0>;  		pinctrl-names = "default";  		pinctrl-0 = <&cp0_copper_eth_phy_reset>; -		reset-gpios = <&cp1_gpio1 11 GPIO_ACTIVE_LOW>; +		reset-gpios = <&cp0_gpio2 11 GPIO_ACTIVE_LOW>;  		reset-assert-us = <10000>;  	}; diff --git a/arch/parisc/kernel/ptrace.c b/arch/parisc/kernel/ptrace.c index 2582df1c529b..0964c236e3e5 100644 --- a/arch/parisc/kernel/ptrace.c +++ b/arch/parisc/kernel/ptrace.c @@ -308,15 +308,29 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request,  long do_syscall_trace_enter(struct pt_regs *regs)  { -	if (test_thread_flag(TIF_SYSCALL_TRACE) && -	    tracehook_report_syscall_entry(regs)) { +	if (test_thread_flag(TIF_SYSCALL_TRACE)) { +		int rc = tracehook_report_syscall_entry(regs); +  		/* -		 * Tracing decided this syscall should not happen or the -		 * debugger stored an invalid system call number. Skip -		 * the system call and the system call restart handling. +		 * As tracesys_next does not set %r28 to -ENOSYS +		 * when %r20 is set to -1, initialize it here.  		 */ -		regs->gr[20] = -1UL; -		goto out; +		regs->gr[28] = -ENOSYS; + +		if (rc) { +			/* +			 * A nonzero return code from +			 * tracehook_report_syscall_entry() tells us +			 * to prevent the syscall execution.  Skip +			 * the syscall call and the syscall restart handling. +			 * +			 * Note that the tracer may also just change +			 * regs->gr[20] to an invalid syscall number, +			 * that is handled by tracesys_next. +			 */ +			regs->gr[20] = -1UL; +			return -1; +		}  	}  	/* Do the secure computing check after ptrace. */ @@ -340,7 +354,6 @@ long do_syscall_trace_enter(struct pt_regs *regs)  			regs->gr[24] & 0xffffffff,  			regs->gr[23] & 0xffffffff); -out:  	/*  	 * Sign extend the syscall number to 64bit since it may have been  	 * modified by a compat ptrace call diff --git a/arch/sh/boot/dts/Makefile b/arch/sh/boot/dts/Makefile index 01d0f7fb14cc..2563d1e532e2 100644 --- a/arch/sh/boot/dts/Makefile +++ b/arch/sh/boot/dts/Makefile @@ -1,3 +1,3 @@  ifneq ($(CONFIG_BUILTIN_DTB_SOURCE),"") -obj-y += $(patsubst "%",%,$(CONFIG_BUILTIN_DTB_SOURCE)).dtb.o +obj-$(CONFIG_USE_BUILTIN_DTB) += $(patsubst "%",%,$(CONFIG_BUILTIN_DTB_SOURCE)).dtb.o  endif diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c index 0ea2139c50d8..ccd296dbb95c 100644 --- a/drivers/base/power/runtime.c +++ b/drivers/base/power/runtime.c @@ -95,7 +95,7 @@ static void __update_runtime_status(struct device *dev, enum rpm_status status)  static void pm_runtime_deactivate_timer(struct device *dev)  {  	if (dev->power.timer_expires > 0) { -		hrtimer_cancel(&dev->power.suspend_timer); +		hrtimer_try_to_cancel(&dev->power.suspend_timer);  		dev->power.timer_expires = 0;  	}  } diff --git a/drivers/clk/at91/at91sam9x5.c b/drivers/clk/at91/at91sam9x5.c index 2fe225a697df..3487e03d4bc6 100644 --- a/drivers/clk/at91/at91sam9x5.c +++ b/drivers/clk/at91/at91sam9x5.c @@ -144,8 +144,7 @@ static void __init at91sam9x5_pmc_setup(struct device_node *np,  		return;  	at91sam9x5_pmc = pmc_data_allocate(PMC_MAIN + 1, -					   nck(at91sam9x5_systemck), -					   nck(at91sam9x35_periphck), 0); +					   nck(at91sam9x5_systemck), 31, 0);  	if (!at91sam9x5_pmc)  		return; @@ -210,7 +209,7 @@ static void __init at91sam9x5_pmc_setup(struct device_node *np,  	parent_names[1] = "mainck";  	parent_names[2] = "plladivck";  	parent_names[3] = "utmick"; -	parent_names[4] = "mck"; +	parent_names[4] = "masterck";  	for (i = 0; i < 2; i++) {  		char name[6]; diff --git a/drivers/clk/at91/sama5d2.c b/drivers/clk/at91/sama5d2.c index d69ad96fe988..cd0ef7274fdb 100644 --- a/drivers/clk/at91/sama5d2.c +++ b/drivers/clk/at91/sama5d2.c @@ -240,7 +240,7 @@ static void __init sama5d2_pmc_setup(struct device_node *np)  	parent_names[1] = "mainck";  	parent_names[2] = "plladivck";  	parent_names[3] = "utmick"; -	parent_names[4] = "mck"; +	parent_names[4] = "masterck";  	for (i = 0; i < 3; i++) {  		char name[6]; @@ -291,7 +291,7 @@ static void __init sama5d2_pmc_setup(struct device_node *np)  	parent_names[1] = "mainck";  	parent_names[2] = "plladivck";  	parent_names[3] = "utmick"; -	parent_names[4] = "mck"; +	parent_names[4] = "masterck";  	parent_names[5] = "audiopll_pmcck";  	for (i = 0; i < ARRAY_SIZE(sama5d2_gck); i++) {  		hw = at91_clk_register_generated(regmap, &pmc_pcr_lock, diff --git a/drivers/clk/at91/sama5d4.c b/drivers/clk/at91/sama5d4.c index e358be7f6c8d..b645a9d59cdb 100644 --- a/drivers/clk/at91/sama5d4.c +++ b/drivers/clk/at91/sama5d4.c @@ -207,7 +207,7 @@ static void __init sama5d4_pmc_setup(struct device_node *np)  	parent_names[1] = "mainck";  	parent_names[2] = "plladivck";  	parent_names[3] = "utmick"; -	parent_names[4] = "mck"; +	parent_names[4] = "masterck";  	for (i = 0; i < 3; i++) {  		char name[6]; diff --git a/drivers/clk/sunxi-ng/ccu-sun6i-a31.c b/drivers/clk/sunxi-ng/ccu-sun6i-a31.c index 3b97f60540ad..609970c0b666 100644 --- a/drivers/clk/sunxi-ng/ccu-sun6i-a31.c +++ b/drivers/clk/sunxi-ng/ccu-sun6i-a31.c @@ -264,9 +264,9 @@ static SUNXI_CCU_GATE(ahb1_mmc1_clk,	"ahb1-mmc1",	"ahb1",  static SUNXI_CCU_GATE(ahb1_mmc2_clk,	"ahb1-mmc2",	"ahb1",  		      0x060, BIT(10), 0);  static SUNXI_CCU_GATE(ahb1_mmc3_clk,	"ahb1-mmc3",	"ahb1", -		      0x060, BIT(12), 0); +		      0x060, BIT(11), 0);  static SUNXI_CCU_GATE(ahb1_nand1_clk,	"ahb1-nand1",	"ahb1", -		      0x060, BIT(13), 0); +		      0x060, BIT(12), 0);  static SUNXI_CCU_GATE(ahb1_nand0_clk,	"ahb1-nand0",	"ahb1",  		      0x060, BIT(13), 0);  static SUNXI_CCU_GATE(ahb1_sdram_clk,	"ahb1-sdram",	"ahb1", diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c b/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c index 621b1cd996db..ac12f261f8ca 100644 --- a/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c +++ b/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c @@ -542,7 +542,7 @@ static struct ccu_reset_map sun8i_v3s_ccu_resets[] = {  	[RST_BUS_OHCI0]		=  { 0x2c0, BIT(29) },  	[RST_BUS_VE]		=  { 0x2c4, BIT(0) }, -	[RST_BUS_TCON0]		=  { 0x2c4, BIT(3) }, +	[RST_BUS_TCON0]		=  { 0x2c4, BIT(4) },  	[RST_BUS_CSI]		=  { 0x2c4, BIT(8) },  	[RST_BUS_DE]		=  { 0x2c4, BIT(12) },  	[RST_BUS_DBG]		=  { 0x2c4, BIT(31) }, diff --git a/drivers/cpufreq/scmi-cpufreq.c b/drivers/cpufreq/scmi-cpufreq.c index 242c3370544e..9ed46d188cb5 100644 --- a/drivers/cpufreq/scmi-cpufreq.c +++ b/drivers/cpufreq/scmi-cpufreq.c @@ -187,8 +187,8 @@ static int scmi_cpufreq_exit(struct cpufreq_policy *policy)  	cpufreq_cooling_unregister(priv->cdev);  	dev_pm_opp_free_cpufreq_table(priv->cpu_dev, &policy->freq_table); -	kfree(priv);  	dev_pm_opp_remove_all_dynamic(priv->cpu_dev); +	kfree(priv);  	return 0;  } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c index bc62bf41b7e9..5dc349173e4f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c @@ -212,6 +212,7 @@ int amdgpu_driver_load_kms(struct drm_device *dev, unsigned long flags)  	}  	if (amdgpu_device_is_px(dev)) { +		dev_pm_set_driver_flags(dev->dev, DPM_FLAG_NEVER_SKIP);  		pm_runtime_use_autosuspend(dev->dev);  		pm_runtime_set_autosuspend_delay(dev->dev, 5000);  		pm_runtime_set_active(dev->dev); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index 7c108e687683..698bcb8ce61d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c @@ -638,12 +638,14 @@ void amdgpu_vm_move_to_lru_tail(struct amdgpu_device *adev,  	struct ttm_bo_global *glob = adev->mman.bdev.glob;  	struct amdgpu_vm_bo_base *bo_base; +#if 0  	if (vm->bulk_moveable) {  		spin_lock(&glob->lru_lock);  		ttm_bo_bulk_move_lru_tail(&vm->lru_bulk_move);  		spin_unlock(&glob->lru_lock);  		return;  	} +#endif  	memset(&vm->lru_bulk_move, 0, sizeof(vm->lru_bulk_move)); diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c index 6811a5d05b27..aa2f71cc1eba 100644 --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c @@ -128,7 +128,7 @@ static const struct soc15_reg_golden golden_settings_sdma0_4_2_init[] = {  static const struct soc15_reg_golden golden_settings_sdma0_4_2[] =  { -	SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_CHICKEN_BITS, 0xfe931f07, 0x02831d07), +	SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_CHICKEN_BITS, 0xfe931f07, 0x02831f07),  	SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_CLK_CTRL, 0xffffffff, 0x3f000100),  	SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_GB_ADDR_CONFIG, 0x0000773f, 0x00004002),  	SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_GB_ADDR_CONFIG_READ, 0x0000773f, 0x00004002), @@ -158,7 +158,7 @@ static const struct soc15_reg_golden golden_settings_sdma0_4_2[] =  };  static const struct soc15_reg_golden golden_settings_sdma1_4_2[] = { -	SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_CHICKEN_BITS, 0xfe931f07, 0x02831d07), +	SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_CHICKEN_BITS, 0xfe931f07, 0x02831f07),  	SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_CLK_CTRL, 0xffffffff, 0x3f000100),  	SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_GB_ADDR_CONFIG, 0x0000773f, 0x00004002),  	SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_GB_ADDR_CONFIG_READ, 0x0000773f, 0x00004002), diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c index 0b392bfca284..5296b8f3e0ab 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -786,12 +786,13 @@ static int dm_suspend(void *handle)  	struct amdgpu_display_manager *dm = &adev->dm;  	int ret = 0; +	WARN_ON(adev->dm.cached_state); +	adev->dm.cached_state = drm_atomic_helper_suspend(adev->ddev); +  	s3_handle_mst(adev->ddev, true);  	amdgpu_dm_irq_suspend(adev); -	WARN_ON(adev->dm.cached_state); -	adev->dm.cached_state = drm_atomic_helper_suspend(adev->ddev);  	dc_set_power_state(dm->dc, DC_ACPI_CM_POWER_STATE_D3); diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_clk_mgr.c b/drivers/gpu/drm/amd/display/dc/dce/dce_clk_mgr.c index 19801bdba0d2..7a72ee46f14b 100644 --- a/drivers/gpu/drm/amd/display/dc/dce/dce_clk_mgr.c +++ b/drivers/gpu/drm/amd/display/dc/dce/dce_clk_mgr.c @@ -662,6 +662,11 @@ static void dce11_update_clocks(struct clk_mgr *clk_mgr,  {  	struct dce_clk_mgr *clk_mgr_dce = TO_DCE_CLK_MGR(clk_mgr);  	struct dm_pp_power_level_change_request level_change_req; +	int patched_disp_clk = context->bw.dce.dispclk_khz; + +	/*TODO: W/A for dal3 linux, investigate why this works */ +	if (!clk_mgr_dce->dfs_bypass_active) +		patched_disp_clk = patched_disp_clk * 115 / 100;  	level_change_req.power_level = dce_get_required_clocks_state(clk_mgr, context);  	/* get max clock state from PPLIB */ @@ -671,9 +676,9 @@ static void dce11_update_clocks(struct clk_mgr *clk_mgr,  			clk_mgr_dce->cur_min_clks_state = level_change_req.power_level;  	} -	if (should_set_clock(safe_to_lower, context->bw.dce.dispclk_khz, clk_mgr->clks.dispclk_khz)) { -		context->bw.dce.dispclk_khz = dce_set_clock(clk_mgr, context->bw.dce.dispclk_khz); -		clk_mgr->clks.dispclk_khz = context->bw.dce.dispclk_khz; +	if (should_set_clock(safe_to_lower, patched_disp_clk, clk_mgr->clks.dispclk_khz)) { +		context->bw.dce.dispclk_khz = dce_set_clock(clk_mgr, patched_disp_clk); +		clk_mgr->clks.dispclk_khz = patched_disp_clk;  	}  	dce11_pplib_apply_display_requirements(clk_mgr->ctx->dc, context);  } diff --git a/drivers/gpu/drm/amd/display/dc/dce100/dce100_hw_sequencer.h b/drivers/gpu/drm/amd/display/dc/dce100/dce100_hw_sequencer.h index acd418515346..a6b80fdaa666 100644 --- a/drivers/gpu/drm/amd/display/dc/dce100/dce100_hw_sequencer.h +++ b/drivers/gpu/drm/amd/display/dc/dce100/dce100_hw_sequencer.h @@ -37,6 +37,10 @@ void dce100_prepare_bandwidth(  		struct dc *dc,  		struct dc_state *context); +void dce100_optimize_bandwidth( +		struct dc *dc, +		struct dc_state *context); +  bool dce100_enable_display_power_gating(struct dc *dc, uint8_t controller_id,  					struct dc_bios *dcb,  					enum pipe_gating_control power_gating); diff --git a/drivers/gpu/drm/amd/display/dc/dce80/dce80_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dce80/dce80_hw_sequencer.c index a60a90e68d91..c4543178ba20 100644 --- a/drivers/gpu/drm/amd/display/dc/dce80/dce80_hw_sequencer.c +++ b/drivers/gpu/drm/amd/display/dc/dce80/dce80_hw_sequencer.c @@ -77,6 +77,6 @@ void dce80_hw_sequencer_construct(struct dc *dc)  	dc->hwss.enable_display_power_gating = dce100_enable_display_power_gating;  	dc->hwss.pipe_control_lock = dce_pipe_control_lock;  	dc->hwss.prepare_bandwidth = dce100_prepare_bandwidth; -	dc->hwss.optimize_bandwidth = dce100_prepare_bandwidth; +	dc->hwss.optimize_bandwidth = dce100_optimize_bandwidth;  } diff --git a/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c b/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c index cdd1d6b7b9f2..4e9ea50141bd 100644 --- a/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c +++ b/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c @@ -790,9 +790,22 @@ bool dce80_validate_bandwidth(  	struct dc *dc,  	struct dc_state *context)  { -	/* TODO implement when needed but for now hardcode max value*/ -	context->bw.dce.dispclk_khz = 681000; -	context->bw.dce.yclk_khz = 250000 * MEMORY_TYPE_MULTIPLIER_CZ; +	int i; +	bool at_least_one_pipe = false; + +	for (i = 0; i < dc->res_pool->pipe_count; i++) { +		if (context->res_ctx.pipe_ctx[i].stream) +			at_least_one_pipe = true; +	} + +	if (at_least_one_pipe) { +		/* TODO implement when needed but for now hardcode max value*/ +		context->bw.dce.dispclk_khz = 681000; +		context->bw.dce.yclk_khz = 250000 * MEMORY_TYPE_MULTIPLIER_CZ; +	} else { +		context->bw.dce.dispclk_khz = 0; +		context->bw.dce.yclk_khz = 0; +	}  	return true;  } diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c index 58a12ddf12f3..41883c981789 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c +++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c @@ -2658,8 +2658,8 @@ static void dcn10_set_cursor_position(struct pipe_ctx *pipe_ctx)  		.mirror = pipe_ctx->plane_state->horizontal_mirror  	}; -	pos_cpy.x -= pipe_ctx->plane_state->dst_rect.x; -	pos_cpy.y -= pipe_ctx->plane_state->dst_rect.y; +	pos_cpy.x_hotspot += pipe_ctx->plane_state->dst_rect.x; +	pos_cpy.y_hotspot += pipe_ctx->plane_state->dst_rect.y;  	if (pipe_ctx->plane_state->address.type  			== PLN_ADDR_TYPE_VIDEO_PROGRESSIVE) diff --git a/drivers/gpu/drm/i915/intel_fbdev.c b/drivers/gpu/drm/i915/intel_fbdev.c index 7f365ac0b549..4ee16b264dbe 100644 --- a/drivers/gpu/drm/i915/intel_fbdev.c +++ b/drivers/gpu/drm/i915/intel_fbdev.c @@ -336,8 +336,8 @@ static bool intel_fb_initial_config(struct drm_fb_helper *fb_helper,  				    bool *enabled, int width, int height)  {  	struct drm_i915_private *dev_priv = to_i915(fb_helper->dev); -	unsigned long conn_configured, conn_seq, mask;  	unsigned int count = min(fb_helper->connector_count, BITS_PER_LONG); +	unsigned long conn_configured, conn_seq;  	int i, j;  	bool *save_enabled;  	bool fallback = true, ret = true; @@ -355,10 +355,9 @@ static bool intel_fb_initial_config(struct drm_fb_helper *fb_helper,  		drm_modeset_backoff(&ctx);  	memcpy(save_enabled, enabled, count); -	mask = GENMASK(count - 1, 0); +	conn_seq = GENMASK(count - 1, 0);  	conn_configured = 0;  retry: -	conn_seq = conn_configured;  	for (i = 0; i < count; i++) {  		struct drm_fb_helper_connector *fb_conn;  		struct drm_connector *connector; @@ -371,7 +370,8 @@ retry:  		if (conn_configured & BIT(i))  			continue; -		if (conn_seq == 0 && !connector->has_tile) +		/* First pass, only consider tiled connectors */ +		if (conn_seq == GENMASK(count - 1, 0) && !connector->has_tile)  			continue;  		if (connector->status == connector_status_connected) @@ -475,8 +475,10 @@ retry:  		conn_configured |= BIT(i);  	} -	if ((conn_configured & mask) != mask && conn_configured != conn_seq) +	if (conn_configured != conn_seq) { /* repeat until no more are found */ +		conn_seq = conn_configured;  		goto retry; +	}  	/*  	 * If the BIOS didn't enable everything it could, fall back to have the diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c index dec1e081f529..6a8fb6fd183c 100644 --- a/drivers/gpu/drm/radeon/radeon_kms.c +++ b/drivers/gpu/drm/radeon/radeon_kms.c @@ -172,6 +172,7 @@ int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags)  	}  	if (radeon_is_px(dev)) { +		dev_pm_set_driver_flags(dev->dev, DPM_FLAG_NEVER_SKIP);  		pm_runtime_use_autosuspend(dev->dev);  		pm_runtime_set_autosuspend_delay(dev->dev, 5000);  		pm_runtime_set_active(dev->dev); diff --git a/drivers/infiniband/hw/cxgb4/device.c b/drivers/infiniband/hw/cxgb4/device.c index c13c0ba30f63..d499cd61c0e8 100644 --- a/drivers/infiniband/hw/cxgb4/device.c +++ b/drivers/infiniband/hw/cxgb4/device.c @@ -783,6 +783,7 @@ void c4iw_init_dev_ucontext(struct c4iw_rdev *rdev,  static int c4iw_rdev_open(struct c4iw_rdev *rdev)  {  	int err; +	unsigned int factor;  	c4iw_init_dev_ucontext(rdev, &rdev->uctx); @@ -806,8 +807,18 @@ static int c4iw_rdev_open(struct c4iw_rdev *rdev)  		return -EINVAL;  	} -	rdev->qpmask = rdev->lldi.udb_density - 1; -	rdev->cqmask = rdev->lldi.ucq_density - 1; +	/* This implementation requires a sge_host_page_size <= PAGE_SIZE. */ +	if (rdev->lldi.sge_host_page_size > PAGE_SIZE) { +		pr_err("%s: unsupported sge host page size %u\n", +		       pci_name(rdev->lldi.pdev), +		       rdev->lldi.sge_host_page_size); +		return -EINVAL; +	} + +	factor = PAGE_SIZE / rdev->lldi.sge_host_page_size; +	rdev->qpmask = (rdev->lldi.udb_density * factor) - 1; +	rdev->cqmask = (rdev->lldi.ucq_density * factor) - 1; +  	pr_debug("dev %s stag start 0x%0x size 0x%0x num stags %d pbl start 0x%0x size 0x%0x rq start 0x%0x size 0x%0x qp qid start %u size %u cq qid start %u size %u srq size %u\n",  		 pci_name(rdev->lldi.pdev), rdev->lldi.vr->stag.start,  		 rdev->lldi.vr->stag.size, c4iw_num_stags(rdev), diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c index 31d91538bbf4..694324b37480 100644 --- a/drivers/infiniband/ulp/srp/ib_srp.c +++ b/drivers/infiniband/ulp/srp/ib_srp.c @@ -3032,7 +3032,6 @@ static int srp_reset_device(struct scsi_cmnd *scmnd)  {  	struct srp_target_port *target = host_to_target(scmnd->device->host);  	struct srp_rdma_ch *ch; -	int i, j;  	u8 status;  	shost_printk(KERN_ERR, target->scsi_host, "SRP reset_device called\n"); @@ -3044,15 +3043,6 @@ static int srp_reset_device(struct scsi_cmnd *scmnd)  	if (status)  		return FAILED; -	for (i = 0; i < target->ch_count; i++) { -		ch = &target->ch[i]; -		for (j = 0; j < target->req_ring_size; ++j) { -			struct srp_request *req = &ch->req_ring[j]; - -			srp_finish_req(ch, req, scmnd->device, DID_RESET << 16); -		} -	} -  	return SUCCESS;  } diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.c index c041f44324db..b3654598a2d5 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.c +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.c @@ -660,6 +660,7 @@ static void uld_init(struct adapter *adap, struct cxgb4_lld_info *lld)  	lld->cclk_ps = 1000000000 / adap->params.vpd.cclk;  	lld->udb_density = 1 << adap->params.sge.eq_qpp;  	lld->ucq_density = 1 << adap->params.sge.iq_qpp; +	lld->sge_host_page_size = 1 << (adap->params.sge.hps + 10);  	lld->filt_mode = adap->params.tp.vlan_pri_map;  	/* MODQ_REQ_MAP sets queues 0-3 to chan 0-3 */  	for (i = 0; i < NCHAN; i++) diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h index 5fa9a2d5fc4b..21da34a4ca24 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h @@ -336,6 +336,7 @@ struct cxgb4_lld_info {  	unsigned int cclk_ps;                /* Core clock period in psec */  	unsigned short udb_density;          /* # of user DB/page */  	unsigned short ucq_density;          /* # of user CQs/page */ +	unsigned int sge_host_page_size;     /* SGE host page size */  	unsigned short filt_mode;            /* filter optional components */  	unsigned short tx_modq[NCHAN];       /* maps each tx channel to a */  					     /* scheduler queue */ diff --git a/scripts/kallsyms.c b/scripts/kallsyms.c index 77cebad0474e..f75e7bda4889 100644 --- a/scripts/kallsyms.c +++ b/scripts/kallsyms.c @@ -118,8 +118,8 @@ static int read_symbol(FILE *in, struct sym_entry *s)  			fprintf(stderr, "Read error or end of file.\n");  		return -1;  	} -	if (strlen(sym) > KSYM_NAME_LEN) { -		fprintf(stderr, "Symbol %s too long for kallsyms (%zu vs %d).\n" +	if (strlen(sym) >= KSYM_NAME_LEN) { +		fprintf(stderr, "Symbol %s too long for kallsyms (%zu >= %d).\n"  				"Please increase KSYM_NAME_LEN both in kernel and kallsyms.c\n",  			sym, strlen(sym), KSYM_NAME_LEN);  		return -1; |