kernel: Backport pending appended DTB handling patches
Backport patches from upstream Linux kernel which are making the kernel stores the appended dtb not in the same resisters as defined in the UHI specification, use a separate variable on MIPS. Signed-off-by: Daniel Gimpelevich <daniel@gimpelevich.san-francisco.ca.us> [some modifications] Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
This commit is contained in:
parent
d27bce8d28
commit
993ad29359
7 changed files with 341 additions and 37 deletions
|
@ -1,6 +1,6 @@
|
||||||
--- a/arch/mips/ath79/setup.c
|
--- a/arch/mips/ath79/setup.c
|
||||||
+++ b/arch/mips/ath79/setup.c
|
+++ b/arch/mips/ath79/setup.c
|
||||||
@@ -251,6 +251,8 @@ void __init plat_time_init(void)
|
@@ -253,6 +253,8 @@ void __init plat_time_init(void)
|
||||||
mips_hpt_frequency = cpu_clk_rate / 2;
|
mips_hpt_frequency = cpu_clk_rate / 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -110,8 +110,8 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
|
||||||
u32 reg, mask;
|
u32 reg, mask;
|
||||||
|
|
||||||
+#if CONFIG_OF
|
+#if CONFIG_OF
|
||||||
+ if (fw_arg0 == -2)
|
+ if (fw_passed_dtb)
|
||||||
+ early_init_dt_verify((void *)fw_arg1);
|
+ early_init_dt_verify((void *)fw_passed_dtb);
|
||||||
+#endif
|
+#endif
|
||||||
+
|
+
|
||||||
bcm63xx_cpu_init();
|
bcm63xx_cpu_init();
|
||||||
|
|
|
@ -0,0 +1,132 @@
|
||||||
|
From b8f54f2cde788623f41d11327688c75aed34092f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jonas Gorski <jogo@openwrt.org>
|
||||||
|
Date: Mon, 20 Jun 2016 11:27:36 +0200
|
||||||
|
Subject: [PATCH 1/2] MIPS: ZBOOT: copy appended dtb to the end of the kernel
|
||||||
|
|
||||||
|
Instead of rewriting the arguments, just move the appended dtb to where
|
||||||
|
the decompressed kernel expects it. This eliminates the need for special
|
||||||
|
casing vmlinuz.bin appended dtb files.
|
||||||
|
|
||||||
|
Signed-off-by: Jonas Gorski <jogo@openwrt.org>
|
||||||
|
Cc: Kevin Cernekee <cernekee@gmail.com>
|
||||||
|
Cc: Florian Fainelli <f.fainelli@gmail.com>
|
||||||
|
Cc: John Crispin <john@phrozen.org>
|
||||||
|
Cc: Paul Burton <paul.burton@imgtec.com>
|
||||||
|
Cc: James Hogan <james.hogan@imgtec.com>
|
||||||
|
Cc: Alban Bedel <albeu@free.fr>
|
||||||
|
Cc: Daniel Gimpelevich <daniel@gimpelevich.san-francisco.ca.us>
|
||||||
|
Cc: Antony Pavlov <antonynpavlov@gmail.com>
|
||||||
|
Cc: linux-mips@linux-mips.org
|
||||||
|
Patchwork: https://patchwork.linux-mips.org/patch/13698/
|
||||||
|
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
|
||||||
|
---
|
||||||
|
arch/mips/Kconfig | 22 ++--------------------
|
||||||
|
arch/mips/boot/compressed/decompress.c | 17 +++++++++++++++++
|
||||||
|
arch/mips/boot/compressed/head.S | 16 ----------------
|
||||||
|
3 files changed, 19 insertions(+), 36 deletions(-)
|
||||||
|
|
||||||
|
--- a/arch/mips/Kconfig
|
||||||
|
+++ b/arch/mips/Kconfig
|
||||||
|
@@ -2752,10 +2752,10 @@ choice
|
||||||
|
the documented boot protocol using a device tree.
|
||||||
|
|
||||||
|
config MIPS_RAW_APPENDED_DTB
|
||||||
|
- bool "vmlinux.bin"
|
||||||
|
+ bool "vmlinux.bin or vmlinuz.bin"
|
||||||
|
help
|
||||||
|
With this option, the boot code will look for a device tree binary
|
||||||
|
- DTB) appended to raw vmlinux.bin (without decompressor).
|
||||||
|
+ DTB) appended to raw vmlinux.bin or vmlinuz.bin.
|
||||||
|
(e.g. cat vmlinux.bin <filename>.dtb > vmlinux_w_dtb).
|
||||||
|
|
||||||
|
This is meant as a backward compatibility convenience for those
|
||||||
|
@@ -2767,24 +2767,6 @@ choice
|
||||||
|
look like a DTB header after a reboot if no actual DTB is appended
|
||||||
|
to vmlinux.bin. Do not leave this option active in a production kernel
|
||||||
|
if you don't intend to always append a DTB.
|
||||||
|
-
|
||||||
|
- config MIPS_ZBOOT_APPENDED_DTB
|
||||||
|
- bool "vmlinuz.bin"
|
||||||
|
- depends on SYS_SUPPORTS_ZBOOT
|
||||||
|
- help
|
||||||
|
- With this option, the boot code will look for a device tree binary
|
||||||
|
- DTB) appended to raw vmlinuz.bin (with decompressor).
|
||||||
|
- (e.g. cat vmlinuz.bin <filename>.dtb > vmlinuz_w_dtb).
|
||||||
|
-
|
||||||
|
- This is meant as a backward compatibility convenience for those
|
||||||
|
- systems with a bootloader that can't be upgraded to accommodate
|
||||||
|
- the documented boot protocol using a device tree.
|
||||||
|
-
|
||||||
|
- Beware that there is very little in terms of protection against
|
||||||
|
- this option being confused by leftover garbage in memory that might
|
||||||
|
- look like a DTB header after a reboot if no actual DTB is appended
|
||||||
|
- to vmlinuz.bin. Do not leave this option active in a production kernel
|
||||||
|
- if you don't intend to always append a DTB.
|
||||||
|
endchoice
|
||||||
|
|
||||||
|
choice
|
||||||
|
--- a/arch/mips/boot/compressed/decompress.c
|
||||||
|
+++ b/arch/mips/boot/compressed/decompress.c
|
||||||
|
@@ -14,6 +14,7 @@
|
||||||
|
#include <linux/types.h>
|
||||||
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/string.h>
|
||||||
|
+#include <linux/libfdt.h>
|
||||||
|
|
||||||
|
#include <asm/addrspace.h>
|
||||||
|
|
||||||
|
@@ -36,6 +37,8 @@ extern void puthex(unsigned long long va
|
||||||
|
#define puthex(val) do {} while (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+extern char __appended_dtb[];
|
||||||
|
+
|
||||||
|
void error(char *x)
|
||||||
|
{
|
||||||
|
puts("\n\n");
|
||||||
|
@@ -114,6 +117,20 @@ void decompress_kernel(unsigned long boo
|
||||||
|
__decompress((char *)zimage_start, zimage_size, 0, 0,
|
||||||
|
(void *)VMLINUX_LOAD_ADDRESS_ULL, 0, 0, error);
|
||||||
|
|
||||||
|
+ if (IS_ENABLED(CONFIG_MIPS_RAW_APPENDED_DTB) &&
|
||||||
|
+ fdt_magic((void *)&__appended_dtb) == FDT_MAGIC) {
|
||||||
|
+ unsigned int image_size, dtb_size;
|
||||||
|
+
|
||||||
|
+ dtb_size = fdt_totalsize((void *)&__appended_dtb);
|
||||||
|
+
|
||||||
|
+ /* last four bytes is always image size in little endian */
|
||||||
|
+ image_size = le32_to_cpup((void *)&__image_end - 4);
|
||||||
|
+
|
||||||
|
+ /* copy dtb to where the booted kernel will expect it */
|
||||||
|
+ memcpy((void *)VMLINUX_LOAD_ADDRESS_ULL + image_size,
|
||||||
|
+ __appended_dtb, dtb_size);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/* FIXME: should we flush cache here? */
|
||||||
|
puts("Now, booting the kernel...\n");
|
||||||
|
}
|
||||||
|
--- a/arch/mips/boot/compressed/head.S
|
||||||
|
+++ b/arch/mips/boot/compressed/head.S
|
||||||
|
@@ -25,22 +25,6 @@ start:
|
||||||
|
move s2, a2
|
||||||
|
move s3, a3
|
||||||
|
|
||||||
|
-#ifdef CONFIG_MIPS_ZBOOT_APPENDED_DTB
|
||||||
|
- PTR_LA t0, __appended_dtb
|
||||||
|
-#ifdef CONFIG_CPU_BIG_ENDIAN
|
||||||
|
- li t1, 0xd00dfeed
|
||||||
|
-#else
|
||||||
|
- li t1, 0xedfe0dd0
|
||||||
|
-#endif
|
||||||
|
- lw t2, (t0)
|
||||||
|
- bne t1, t2, not_found
|
||||||
|
- nop
|
||||||
|
-
|
||||||
|
- move s1, t0
|
||||||
|
- PTR_LI s0, -2
|
||||||
|
-not_found:
|
||||||
|
-#endif
|
||||||
|
-
|
||||||
|
/* Clear BSS */
|
||||||
|
PTR_LA a0, _edata
|
||||||
|
PTR_LA a2, _end
|
|
@ -0,0 +1,132 @@
|
||||||
|
From 15f37e1588920e010f20b53f04af94e91b8ee714 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jonas Gorski <jogo@openwrt.org>
|
||||||
|
Date: Mon, 20 Jun 2016 11:27:37 +0200
|
||||||
|
Subject: [PATCH] MIPS: store the appended dtb address in a variable
|
||||||
|
|
||||||
|
Instead of rewriting the arguments to match the UHI spec, store the
|
||||||
|
address of a appended or UHI supplied dtb in fw_supplied_dtb.
|
||||||
|
|
||||||
|
That way the original bootloader arugments are kept intact while still
|
||||||
|
making the use of an appended dtb invisible for mach code.
|
||||||
|
|
||||||
|
Mach code can still find out if it is an appended dtb by comparing
|
||||||
|
fw_arg1 with fw_supplied_dtb.
|
||||||
|
|
||||||
|
Signed-off-by: Jonas Gorski <jogo@openwrt.org>
|
||||||
|
Cc: Kevin Cernekee <cernekee@gmail.com>
|
||||||
|
Cc: Florian Fainelli <f.fainelli@gmail.com>
|
||||||
|
Cc: John Crispin <john@phrozen.org>
|
||||||
|
Cc: Paul Burton <paul.burton@imgtec.com>
|
||||||
|
Cc: James Hogan <james.hogan@imgtec.com>
|
||||||
|
Cc: Alban Bedel <albeu@free.fr>
|
||||||
|
Cc: Daniel Gimpelevich <daniel@gimpelevich.san-francisco.ca.us>
|
||||||
|
Cc: Antony Pavlov <antonynpavlov@gmail.com>
|
||||||
|
Cc: linux-mips@linux-mips.org
|
||||||
|
Patchwork: https://patchwork.linux-mips.org/patch/13699/
|
||||||
|
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
|
||||||
|
---
|
||||||
|
arch/mips/ath79/setup.c | 4 ++--
|
||||||
|
arch/mips/bmips/setup.c | 4 ++--
|
||||||
|
arch/mips/include/asm/bootinfo.h | 4 ++++
|
||||||
|
arch/mips/kernel/head.S | 21 ++++++++++++++-------
|
||||||
|
arch/mips/kernel/setup.c | 4 ++++
|
||||||
|
arch/mips/lantiq/prom.c | 4 ++--
|
||||||
|
arch/mips/pic32/pic32mzda/init.c | 4 ++--
|
||||||
|
7 files changed, 30 insertions(+), 15 deletions(-)
|
||||||
|
|
||||||
|
--- a/arch/mips/ath79/setup.c
|
||||||
|
+++ b/arch/mips/ath79/setup.c
|
||||||
|
@@ -207,6 +207,8 @@ void __init plat_mem_setup(void)
|
||||||
|
fdt_start = fw_getenvl("fdt_start");
|
||||||
|
if (fdt_start)
|
||||||
|
__dt_setup_arch((void *)KSEG0ADDR(fdt_start));
|
||||||
|
+ else if (fw_passed_dtb)
|
||||||
|
+ __dt_setup_arch((void *)KSEG0ADDR(fw_passed_dtb));
|
||||||
|
#ifdef CONFIG_BUILTIN_DTB
|
||||||
|
else
|
||||||
|
__dt_setup_arch(__dtb_start);
|
||||||
|
--- a/arch/mips/bmips/setup.c
|
||||||
|
+++ b/arch/mips/bmips/setup.c
|
||||||
|
@@ -149,8 +149,8 @@ void __init plat_mem_setup(void)
|
||||||
|
/* intended to somewhat resemble ARM; see Documentation/arm/Booting */
|
||||||
|
if (fw_arg0 == 0 && fw_arg1 == 0xffffffff)
|
||||||
|
dtb = phys_to_virt(fw_arg2);
|
||||||
|
- else if (fw_arg0 == -2) /* UHI interface */
|
||||||
|
- dtb = (void *)fw_arg1;
|
||||||
|
+ else if (fw_passed_dtb) /* UHI interface */
|
||||||
|
+ dtb = (void *)fw_passed_dtb;
|
||||||
|
else if (__dtb_start != __dtb_end)
|
||||||
|
dtb = (void *)__dtb_start;
|
||||||
|
else
|
||||||
|
--- a/arch/mips/include/asm/bootinfo.h
|
||||||
|
+++ b/arch/mips/include/asm/bootinfo.h
|
||||||
|
@@ -127,6 +127,10 @@ extern char arcs_cmdline[COMMAND_LINE_SI
|
||||||
|
*/
|
||||||
|
extern unsigned long fw_arg0, fw_arg1, fw_arg2, fw_arg3;
|
||||||
|
|
||||||
|
+#ifdef CONFIG_USE_OF
|
||||||
|
+extern unsigned long fw_passed_dtb;
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* Platform memory detection hook called by setup_arch
|
||||||
|
*/
|
||||||
|
--- a/arch/mips/kernel/head.S
|
||||||
|
+++ b/arch/mips/kernel/head.S
|
||||||
|
@@ -94,21 +94,24 @@ NESTED(kernel_entry, 16, sp) # kernel
|
||||||
|
jr t0
|
||||||
|
0:
|
||||||
|
|
||||||
|
+#ifdef CONFIG_USE_OF
|
||||||
|
#ifdef CONFIG_MIPS_RAW_APPENDED_DTB
|
||||||
|
- PTR_LA t0, __appended_dtb
|
||||||
|
+ PTR_LA t2, __appended_dtb
|
||||||
|
|
||||||
|
#ifdef CONFIG_CPU_BIG_ENDIAN
|
||||||
|
li t1, 0xd00dfeed
|
||||||
|
#else
|
||||||
|
li t1, 0xedfe0dd0
|
||||||
|
#endif
|
||||||
|
- lw t2, (t0)
|
||||||
|
- bne t1, t2, not_found
|
||||||
|
- nop
|
||||||
|
-
|
||||||
|
- move a1, t0
|
||||||
|
- PTR_LI a0, -2
|
||||||
|
-not_found:
|
||||||
|
+ lw t0, (t2)
|
||||||
|
+ beq t0, t1, dtb_found
|
||||||
|
+#endif
|
||||||
|
+ li t1, -2
|
||||||
|
+ beq a0, t1, dtb_found
|
||||||
|
+ move t2, a1
|
||||||
|
+
|
||||||
|
+ li t2, 0
|
||||||
|
+dtb_found:
|
||||||
|
#endif
|
||||||
|
PTR_LA t0, __bss_start # clear .bss
|
||||||
|
LONG_S zero, (t0)
|
||||||
|
@@ -123,6 +126,10 @@ not_found:
|
||||||
|
LONG_S a2, fw_arg2
|
||||||
|
LONG_S a3, fw_arg3
|
||||||
|
|
||||||
|
+#ifdef CONFIG_USE_OF
|
||||||
|
+ LONG_S t2, fw_passed_dtb
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
MTC0 zero, CP0_CONTEXT # clear context register
|
||||||
|
PTR_LA $28, init_thread_union
|
||||||
|
/* Set the SP after an empty pt_regs. */
|
||||||
|
--- a/arch/mips/kernel/setup.c
|
||||||
|
+++ b/arch/mips/kernel/setup.c
|
||||||
|
@@ -814,6 +814,10 @@ void __init setup_arch(char **cmdline_p)
|
||||||
|
unsigned long kernelsp[NR_CPUS];
|
||||||
|
unsigned long fw_arg0, fw_arg1, fw_arg2, fw_arg3;
|
||||||
|
|
||||||
|
+#ifdef CONFIG_USE_OF
|
||||||
|
+unsigned long fw_passed_dtb;
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
#ifdef CONFIG_DEBUG_FS
|
||||||
|
struct dentry *mips_debugfs_dir;
|
||||||
|
static int __init debugfs_mips(void)
|
|
@ -18,11 +18,9 @@ Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
|
||||||
drivers/usb/gadget/udc/net2280.h | 1 +
|
drivers/usb/gadget/udc/net2280.h | 1 +
|
||||||
3 files changed, 34 insertions(+), 22 deletions(-)
|
3 files changed, 34 insertions(+), 22 deletions(-)
|
||||||
|
|
||||||
diff --git a/drivers/usb/gadget/udc/Kconfig b/drivers/usb/gadget/udc/Kconfig
|
|
||||||
index 7c28941..658b8da 100644
|
|
||||||
--- a/drivers/usb/gadget/udc/Kconfig
|
--- a/drivers/usb/gadget/udc/Kconfig
|
||||||
+++ b/drivers/usb/gadget/udc/Kconfig
|
+++ b/drivers/usb/gadget/udc/Kconfig
|
||||||
@@ -312,7 +312,7 @@ config USB_NET2272_DMA
|
@@ -298,7 +298,7 @@ config USB_NET2272_DMA
|
||||||
If unsure, say "N" here. The driver works fine in PIO mode.
|
If unsure, say "N" here. The driver works fine in PIO mode.
|
||||||
|
|
||||||
config USB_NET2280
|
config USB_NET2280
|
||||||
|
@ -31,7 +29,7 @@ index 7c28941..658b8da 100644
|
||||||
depends on PCI
|
depends on PCI
|
||||||
help
|
help
|
||||||
NetChip 2280 / 2282 is a PCI based USB peripheral controller which
|
NetChip 2280 / 2282 is a PCI based USB peripheral controller which
|
||||||
@@ -322,6 +322,8 @@ config USB_NET2280
|
@@ -308,6 +308,8 @@ config USB_NET2280
|
||||||
(for control transfers) and several endpoints with dedicated
|
(for control transfers) and several endpoints with dedicated
|
||||||
functions.
|
functions.
|
||||||
|
|
||||||
|
@ -40,11 +38,9 @@ index 7c28941..658b8da 100644
|
||||||
PLX 3380 / 3382 is a PCIe based USB peripheral controller which
|
PLX 3380 / 3382 is a PCIe based USB peripheral controller which
|
||||||
supports full, high speed USB 2.0 and super speed USB 3.0
|
supports full, high speed USB 2.0 and super speed USB 3.0
|
||||||
data transfers.
|
data transfers.
|
||||||
diff --git a/drivers/usb/gadget/udc/net2280.c b/drivers/usb/gadget/udc/net2280.c
|
|
||||||
index c894b94..614ab951 100644
|
|
||||||
--- a/drivers/usb/gadget/udc/net2280.c
|
--- a/drivers/usb/gadget/udc/net2280.c
|
||||||
+++ b/drivers/usb/gadget/udc/net2280.c
|
+++ b/drivers/usb/gadget/udc/net2280.c
|
||||||
@@ -211,7 +211,7 @@ net2280_enable(struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc)
|
@@ -211,7 +211,7 @@ net2280_enable(struct usb_ep *_ep, const
|
||||||
goto print_err;
|
goto print_err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,7 +49,7 @@ index c894b94..614ab951 100644
|
||||||
if ((desc->bEndpointAddress & 0x0f) >= 0x0c) {
|
if ((desc->bEndpointAddress & 0x0f) >= 0x0c) {
|
||||||
ret = -EDOM;
|
ret = -EDOM;
|
||||||
goto print_err;
|
goto print_err;
|
||||||
@@ -245,7 +245,7 @@ net2280_enable(struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc)
|
@@ -245,7 +245,7 @@ net2280_enable(struct usb_ep *_ep, const
|
||||||
/* set type, direction, address; reset fifo counters */
|
/* set type, direction, address; reset fifo counters */
|
||||||
writel(BIT(FIFO_FLUSH), &ep->regs->ep_stat);
|
writel(BIT(FIFO_FLUSH), &ep->regs->ep_stat);
|
||||||
|
|
||||||
|
@ -62,7 +58,7 @@ index c894b94..614ab951 100644
|
||||||
tmp = readl(&ep->cfg->ep_cfg);
|
tmp = readl(&ep->cfg->ep_cfg);
|
||||||
/* If USB ep number doesn't match hardware ep number */
|
/* If USB ep number doesn't match hardware ep number */
|
||||||
if ((tmp & 0xf) != usb_endpoint_num(desc)) {
|
if ((tmp & 0xf) != usb_endpoint_num(desc)) {
|
||||||
@@ -316,7 +316,7 @@ net2280_enable(struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc)
|
@@ -316,7 +316,7 @@ net2280_enable(struct usb_ep *_ep, const
|
||||||
BIT(CLEAR_NAK_OUT_PACKETS_MODE), &ep->regs->ep_rsp);
|
BIT(CLEAR_NAK_OUT_PACKETS_MODE), &ep->regs->ep_rsp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,7 +67,7 @@ index c894b94..614ab951 100644
|
||||||
ep_clear_seqnum(ep);
|
ep_clear_seqnum(ep);
|
||||||
writel(tmp, &ep->cfg->ep_cfg);
|
writel(tmp, &ep->cfg->ep_cfg);
|
||||||
|
|
||||||
@@ -527,7 +527,7 @@ static int net2280_disable(struct usb_ep *_ep)
|
@@ -527,7 +527,7 @@ static int net2280_disable(struct usb_ep
|
||||||
spin_lock_irqsave(&ep->dev->lock, flags);
|
spin_lock_irqsave(&ep->dev->lock, flags);
|
||||||
nuke(ep);
|
nuke(ep);
|
||||||
|
|
||||||
|
@ -80,7 +76,7 @@ index c894b94..614ab951 100644
|
||||||
ep_reset_338x(ep->dev->regs, ep);
|
ep_reset_338x(ep->dev->regs, ep);
|
||||||
else
|
else
|
||||||
ep_reset_228x(ep->dev->regs, ep);
|
ep_reset_228x(ep->dev->regs, ep);
|
||||||
@@ -862,7 +862,7 @@ static void start_queue(struct net2280_ep *ep, u32 dmactl, u32 td_dma)
|
@@ -862,7 +862,7 @@ static void start_queue(struct net2280_e
|
||||||
writel(readl(&dma->dmastat), &dma->dmastat);
|
writel(readl(&dma->dmastat), &dma->dmastat);
|
||||||
|
|
||||||
writel(td_dma, &dma->dmadesc);
|
writel(td_dma, &dma->dmadesc);
|
||||||
|
@ -89,7 +85,7 @@ index c894b94..614ab951 100644
|
||||||
dmactl |= BIT(DMA_REQUEST_OUTSTANDING);
|
dmactl |= BIT(DMA_REQUEST_OUTSTANDING);
|
||||||
writel(dmactl, &dma->dmactl);
|
writel(dmactl, &dma->dmactl);
|
||||||
|
|
||||||
@@ -1046,7 +1046,7 @@ net2280_queue(struct usb_ep *_ep, struct usb_request *_req, gfp_t gfp_flags)
|
@@ -1046,7 +1046,7 @@ net2280_queue(struct usb_ep *_ep, struct
|
||||||
|
|
||||||
/* kickstart this i/o queue? */
|
/* kickstart this i/o queue? */
|
||||||
if (list_empty(&ep->queue) && !ep->stopped &&
|
if (list_empty(&ep->queue) && !ep->stopped &&
|
||||||
|
@ -98,7 +94,7 @@ index c894b94..614ab951 100644
|
||||||
(readl(&ep->regs->ep_rsp) & BIT(CLEAR_ENDPOINT_HALT)))) {
|
(readl(&ep->regs->ep_rsp) & BIT(CLEAR_ENDPOINT_HALT)))) {
|
||||||
|
|
||||||
/* use DMA if the endpoint supports it, else pio */
|
/* use DMA if the endpoint supports it, else pio */
|
||||||
@@ -1169,7 +1169,7 @@ static void scan_dma_completions(struct net2280_ep *ep)
|
@@ -1169,7 +1169,7 @@ static void scan_dma_completions(struct
|
||||||
break;
|
break;
|
||||||
} else if (!ep->is_in &&
|
} else if (!ep->is_in &&
|
||||||
(req->req.length % ep->ep.maxpacket) &&
|
(req->req.length % ep->ep.maxpacket) &&
|
||||||
|
@ -107,7 +103,7 @@ index c894b94..614ab951 100644
|
||||||
|
|
||||||
tmp = readl(&ep->regs->ep_stat);
|
tmp = readl(&ep->regs->ep_stat);
|
||||||
/* AVOID TROUBLE HERE by not issuing short reads from
|
/* AVOID TROUBLE HERE by not issuing short reads from
|
||||||
@@ -1367,7 +1367,7 @@ net2280_set_halt_and_wedge(struct usb_ep *_ep, int value, int wedged)
|
@@ -1367,7 +1367,7 @@ net2280_set_halt_and_wedge(struct usb_ep
|
||||||
ep->wedged = 1;
|
ep->wedged = 1;
|
||||||
} else {
|
} else {
|
||||||
clear_halt(ep);
|
clear_halt(ep);
|
||||||
|
@ -116,7 +112,7 @@ index c894b94..614ab951 100644
|
||||||
!list_empty(&ep->queue) && ep->td_dma)
|
!list_empty(&ep->queue) && ep->td_dma)
|
||||||
restart_dma(ep);
|
restart_dma(ep);
|
||||||
ep->wedged = 0;
|
ep->wedged = 0;
|
||||||
@@ -2394,7 +2394,7 @@ static int net2280_start(struct usb_gadget *_gadget,
|
@@ -2394,7 +2394,7 @@ static int net2280_start(struct usb_gadg
|
||||||
*/
|
*/
|
||||||
net2280_led_active(dev, 1);
|
net2280_led_active(dev, 1);
|
||||||
|
|
||||||
|
@ -125,7 +121,7 @@ index c894b94..614ab951 100644
|
||||||
defect7374_enable_data_eps_zero(dev);
|
defect7374_enable_data_eps_zero(dev);
|
||||||
|
|
||||||
ep0_start(dev);
|
ep0_start(dev);
|
||||||
@@ -3063,7 +3063,7 @@ static void handle_stat0_irqs(struct net2280 *dev, u32 stat)
|
@@ -3063,7 +3063,7 @@ static void handle_stat0_irqs(struct net
|
||||||
}
|
}
|
||||||
ep->stopped = 0;
|
ep->stopped = 0;
|
||||||
dev->protocol_stall = 0;
|
dev->protocol_stall = 0;
|
||||||
|
@ -134,7 +130,7 @@ index c894b94..614ab951 100644
|
||||||
if (ep->dev->quirks & PLX_2280)
|
if (ep->dev->quirks & PLX_2280)
|
||||||
tmp = BIT(FIFO_OVERFLOW) |
|
tmp = BIT(FIFO_OVERFLOW) |
|
||||||
BIT(FIFO_UNDERFLOW);
|
BIT(FIFO_UNDERFLOW);
|
||||||
@@ -3090,7 +3090,7 @@ static void handle_stat0_irqs(struct net2280 *dev, u32 stat)
|
@@ -3090,7 +3090,7 @@ static void handle_stat0_irqs(struct net
|
||||||
cpu_to_le32s(&u.raw[0]);
|
cpu_to_le32s(&u.raw[0]);
|
||||||
cpu_to_le32s(&u.raw[1]);
|
cpu_to_le32s(&u.raw[1]);
|
||||||
|
|
||||||
|
@ -143,7 +139,7 @@ index c894b94..614ab951 100644
|
||||||
defect7374_workaround(dev, u.r);
|
defect7374_workaround(dev, u.r);
|
||||||
|
|
||||||
tmp = 0;
|
tmp = 0;
|
||||||
@@ -3173,7 +3173,7 @@ static void handle_stat0_irqs(struct net2280 *dev, u32 stat)
|
@@ -3173,7 +3173,7 @@ static void handle_stat0_irqs(struct net
|
||||||
} else {
|
} else {
|
||||||
ep_vdbg(dev, "%s clear halt\n", e->ep.name);
|
ep_vdbg(dev, "%s clear halt\n", e->ep.name);
|
||||||
clear_halt(e);
|
clear_halt(e);
|
||||||
|
@ -152,7 +148,7 @@ index c894b94..614ab951 100644
|
||||||
!list_empty(&e->queue) && e->td_dma)
|
!list_empty(&e->queue) && e->td_dma)
|
||||||
restart_dma(e);
|
restart_dma(e);
|
||||||
}
|
}
|
||||||
@@ -3195,7 +3195,7 @@ static void handle_stat0_irqs(struct net2280 *dev, u32 stat)
|
@@ -3195,7 +3195,7 @@ static void handle_stat0_irqs(struct net
|
||||||
if (e->ep.name == ep0name)
|
if (e->ep.name == ep0name)
|
||||||
goto do_stall;
|
goto do_stall;
|
||||||
set_halt(e);
|
set_halt(e);
|
||||||
|
@ -179,7 +175,7 @@ index c894b94..614ab951 100644
|
||||||
u32 r_dmacount = readl(&dma->dmacount);
|
u32 r_dmacount = readl(&dma->dmacount);
|
||||||
if (!ep->is_in && (r_dmacount & 0x00FFFFFF) &&
|
if (!ep->is_in && (r_dmacount & 0x00FFFFFF) &&
|
||||||
(tmp & BIT(DMA_TRANSACTION_DONE_INTERRUPT)))
|
(tmp & BIT(DMA_TRANSACTION_DONE_INTERRUPT)))
|
||||||
@@ -3468,7 +3468,7 @@ static irqreturn_t net2280_irq(int irq, void *_dev)
|
@@ -3468,7 +3468,7 @@ static irqreturn_t net2280_irq(int irq,
|
||||||
/* control requests and PIO */
|
/* control requests and PIO */
|
||||||
handle_stat0_irqs(dev, readl(&dev->regs->irqstat0));
|
handle_stat0_irqs(dev, readl(&dev->regs->irqstat0));
|
||||||
|
|
||||||
|
@ -188,7 +184,7 @@ index c894b94..614ab951 100644
|
||||||
/* re-enable interrupt to trigger any possible new interrupt */
|
/* re-enable interrupt to trigger any possible new interrupt */
|
||||||
u32 pciirqenb1 = readl(&dev->regs->pciirqenb1);
|
u32 pciirqenb1 = readl(&dev->regs->pciirqenb1);
|
||||||
writel(pciirqenb1 & 0x7FFFFFFF, &dev->regs->pciirqenb1);
|
writel(pciirqenb1 & 0x7FFFFFFF, &dev->regs->pciirqenb1);
|
||||||
@@ -3513,7 +3513,7 @@ static void net2280_remove(struct pci_dev *pdev)
|
@@ -3513,7 +3513,7 @@ static void net2280_remove(struct pci_de
|
||||||
}
|
}
|
||||||
if (dev->got_irq)
|
if (dev->got_irq)
|
||||||
free_irq(pdev->irq, dev);
|
free_irq(pdev->irq, dev);
|
||||||
|
@ -197,7 +193,7 @@ index c894b94..614ab951 100644
|
||||||
pci_disable_msi(pdev);
|
pci_disable_msi(pdev);
|
||||||
if (dev->regs)
|
if (dev->regs)
|
||||||
iounmap(dev->regs);
|
iounmap(dev->regs);
|
||||||
@@ -3593,7 +3593,7 @@ static int net2280_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
@@ -3593,7 +3593,7 @@ static int net2280_probe(struct pci_dev
|
||||||
dev->dep = (struct net2280_dep_regs __iomem *) (base + 0x0200);
|
dev->dep = (struct net2280_dep_regs __iomem *) (base + 0x0200);
|
||||||
dev->epregs = (struct net2280_ep_regs __iomem *) (base + 0x0300);
|
dev->epregs = (struct net2280_ep_regs __iomem *) (base + 0x0300);
|
||||||
|
|
||||||
|
@ -206,7 +202,7 @@ index c894b94..614ab951 100644
|
||||||
u32 fsmvalue;
|
u32 fsmvalue;
|
||||||
u32 usbstat;
|
u32 usbstat;
|
||||||
dev->usb_ext = (struct usb338x_usb_ext_regs __iomem *)
|
dev->usb_ext = (struct usb338x_usb_ext_regs __iomem *)
|
||||||
@@ -3637,7 +3637,7 @@ static int net2280_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
@@ -3637,7 +3637,7 @@ static int net2280_probe(struct pci_dev
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -215,8 +211,8 @@ index c894b94..614ab951 100644
|
||||||
if (pci_enable_msi(pdev))
|
if (pci_enable_msi(pdev))
|
||||||
ep_err(dev, "Failed to enable MSI mode\n");
|
ep_err(dev, "Failed to enable MSI mode\n");
|
||||||
|
|
||||||
@@ -3755,10 +3755,19 @@ static const struct pci_device_id pci_ids[] = { {
|
@@ -3755,10 +3755,19 @@ static const struct pci_device_id pci_id
|
||||||
.class = PCI_CLASS_SERIAL_USB_DEVICE,
|
.class = ((PCI_CLASS_SERIAL_USB << 8) | 0xfe),
|
||||||
.class_mask = ~0,
|
.class_mask = ~0,
|
||||||
.vendor = PCI_VENDOR_ID_PLX,
|
.vendor = PCI_VENDOR_ID_PLX,
|
||||||
+ .device = 0x2380,
|
+ .device = 0x2380,
|
||||||
|
@ -235,8 +231,8 @@ index c894b94..614ab951 100644
|
||||||
+ .driver_data = PLX_PCIE | PLX_SUPERSPEED,
|
+ .driver_data = PLX_PCIE | PLX_SUPERSPEED,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.class = PCI_CLASS_SERIAL_USB_DEVICE,
|
.class = ((PCI_CLASS_SERIAL_USB << 8) | 0xfe),
|
||||||
@@ -3767,7 +3776,7 @@ static const struct pci_device_id pci_ids[] = { {
|
@@ -3767,7 +3776,7 @@ static const struct pci_device_id pci_id
|
||||||
.device = 0x3382,
|
.device = 0x3382,
|
||||||
.subvendor = PCI_ANY_ID,
|
.subvendor = PCI_ANY_ID,
|
||||||
.subdevice = PCI_ANY_ID,
|
.subdevice = PCI_ANY_ID,
|
||||||
|
@ -245,11 +241,9 @@ index c894b94..614ab951 100644
|
||||||
},
|
},
|
||||||
{ /* end: all zeroes */ }
|
{ /* end: all zeroes */ }
|
||||||
};
|
};
|
||||||
diff --git a/drivers/usb/gadget/udc/net2280.h b/drivers/usb/gadget/udc/net2280.h
|
|
||||||
index 0d32052..2736a95 100644
|
|
||||||
--- a/drivers/usb/gadget/udc/net2280.h
|
--- a/drivers/usb/gadget/udc/net2280.h
|
||||||
+++ b/drivers/usb/gadget/udc/net2280.h
|
+++ b/drivers/usb/gadget/udc/net2280.h
|
||||||
@@ -47,6 +47,7 @@ set_idx_reg(struct net2280_regs __iomem *regs, u32 index, u32 value)
|
@@ -47,6 +47,7 @@ set_idx_reg(struct net2280_regs __iomem
|
||||||
#define PLX_LEGACY BIT(0)
|
#define PLX_LEGACY BIT(0)
|
||||||
#define PLX_2280 BIT(1)
|
#define PLX_2280 BIT(1)
|
||||||
#define PLX_SUPERSPEED BIT(2)
|
#define PLX_SUPERSPEED BIT(2)
|
||||||
|
@ -257,6 +251,3 @@ index 0d32052..2736a95 100644
|
||||||
|
|
||||||
#define REG_DIAG 0x0
|
#define REG_DIAG 0x0
|
||||||
#define RETRY_COUNTER 16
|
#define RETRY_COUNTER 16
|
||||||
--
|
|
||||||
1.9.1
|
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@ Acked-by: Rob Landley <rob@landley.net>
|
||||||
config CEVT_BCM1480
|
config CEVT_BCM1480
|
||||||
bool
|
bool
|
||||||
|
|
||||||
@@ -2810,6 +2807,18 @@ choice
|
@@ -2792,6 +2789,18 @@ choice
|
||||||
bool "Bootloader kernel arguments if available"
|
bool "Bootloader kernel arguments if available"
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,49 @@
|
||||||
|
From 15f37e1588920e010f20b53f04af94e91b8ee714 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jonas Gorski <jogo@openwrt.org>
|
||||||
|
Date: Mon, 20 Jun 2016 11:27:37 +0200
|
||||||
|
Subject: [PATCH] MIPS: store the appended dtb address in a variable
|
||||||
|
|
||||||
|
Instead of rewriting the arguments to match the UHI spec, store the
|
||||||
|
address of a appended or UHI supplied dtb in fw_supplied_dtb.
|
||||||
|
|
||||||
|
That way the original bootloader arugments are kept intact while still
|
||||||
|
making the use of an appended dtb invisible for mach code.
|
||||||
|
|
||||||
|
Mach code can still find out if it is an appended dtb by comparing
|
||||||
|
fw_arg1 with fw_supplied_dtb.
|
||||||
|
|
||||||
|
Signed-off-by: Jonas Gorski <jogo@openwrt.org>
|
||||||
|
Cc: Kevin Cernekee <cernekee@gmail.com>
|
||||||
|
Cc: Florian Fainelli <f.fainelli@gmail.com>
|
||||||
|
Cc: John Crispin <john@phrozen.org>
|
||||||
|
Cc: Paul Burton <paul.burton@imgtec.com>
|
||||||
|
Cc: James Hogan <james.hogan@imgtec.com>
|
||||||
|
Cc: Alban Bedel <albeu@free.fr>
|
||||||
|
Cc: Daniel Gimpelevich <daniel@gimpelevich.san-francisco.ca.us>
|
||||||
|
Cc: Antony Pavlov <antonynpavlov@gmail.com>
|
||||||
|
Cc: linux-mips@linux-mips.org
|
||||||
|
Patchwork: https://patchwork.linux-mips.org/patch/13699/
|
||||||
|
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
|
||||||
|
---
|
||||||
|
arch/mips/ath79/setup.c | 4 ++--
|
||||||
|
arch/mips/bmips/setup.c | 4 ++--
|
||||||
|
arch/mips/include/asm/bootinfo.h | 4 ++++
|
||||||
|
arch/mips/kernel/head.S | 21 ++++++++++++++-------
|
||||||
|
arch/mips/kernel/setup.c | 4 ++++
|
||||||
|
arch/mips/lantiq/prom.c | 4 ++--
|
||||||
|
arch/mips/pic32/pic32mzda/init.c | 4 ++--
|
||||||
|
7 files changed, 30 insertions(+), 15 deletions(-)
|
||||||
|
|
||||||
|
--- a/arch/mips/lantiq/prom.c
|
||||||
|
+++ b/arch/mips/lantiq/prom.c
|
||||||
|
@@ -74,8 +74,8 @@ void __init plat_mem_setup(void)
|
||||||
|
|
||||||
|
set_io_port_base((unsigned long) KSEG1);
|
||||||
|
|
||||||
|
- if (fw_arg0 == -2) /* UHI interface */
|
||||||
|
- dtb = (void *)fw_arg1;
|
||||||
|
+ if (fw_passed_dtb) /* UHI interface */
|
||||||
|
+ dtb = (void *)fw_passed_dtb;
|
||||||
|
else if (__dtb_start != __dtb_end)
|
||||||
|
dtb = (void *)__dtb_start;
|
||||||
|
else
|
Loading…
Reference in a new issue