2019-06-04 16:11:33 +08:00
|
|
|
// SPDX-License-Identifier: GPL-2.0-only
|
2011-03-30 15:27:47 +08:00
|
|
|
/*
|
|
|
|
*
|
2016-05-05 15:57:56 +08:00
|
|
|
* Copyright (C) 2010 John Crispin <john@phrozen.org>
|
2011-03-30 15:27:47 +08:00
|
|
|
*/
|
|
|
|
|
2011-11-11 04:33:07 +08:00
|
|
|
#include <linux/export.h>
|
2011-03-30 15:27:47 +08:00
|
|
|
#include <linux/clk.h>
|
2018-10-31 06:09:49 +08:00
|
|
|
#include <linux/memblock.h>
|
2012-07-22 14:56:00 +08:00
|
|
|
#include <linux/of_fdt.h>
|
|
|
|
|
2011-03-30 15:27:47 +08:00
|
|
|
#include <asm/bootinfo.h>
|
|
|
|
#include <asm/time.h>
|
2013-09-08 03:58:54 +08:00
|
|
|
#include <asm/prom.h>
|
2011-03-30 15:27:47 +08:00
|
|
|
|
|
|
|
#include <lantiq.h>
|
|
|
|
|
|
|
|
#include "prom.h"
|
|
|
|
#include "clk.h"
|
|
|
|
|
2012-04-14 02:56:13 +08:00
|
|
|
/* access to the ebu needs to be locked between different drivers */
|
|
|
|
DEFINE_SPINLOCK(ebu_lock);
|
|
|
|
EXPORT_SYMBOL_GPL(ebu_lock);
|
2011-03-30 15:27:47 +08:00
|
|
|
|
2016-12-27 23:31:43 +08:00
|
|
|
/*
|
|
|
|
* This is needed by the VPE loader code, just set it to 0 and assume
|
|
|
|
* that the firmware hardcodes this value to something useful.
|
|
|
|
*/
|
|
|
|
unsigned long physical_memsize = 0L;
|
|
|
|
|
2012-04-14 02:56:13 +08:00
|
|
|
/*
|
|
|
|
* this struct is filled by the soc specific detection code and holds
|
|
|
|
* information about the specific soc type, revision and name
|
|
|
|
*/
|
|
|
|
static struct ltq_soc_info soc_info;
|
2011-03-30 15:27:47 +08:00
|
|
|
|
MIPS: lantiq: enable all hardware interrupts on second VPE
This patch is needed to handle interrupts by the second VPE on the Lantiq
ARX100, xRX200, xRX300 and xRX330 SoCs. Switching some ICU interrupts to
the second VPE results in a hang. Currently, the vsmp_init_secondary()
function is responsible for enabling these interrupts. It only enables
Malta-specific interrupts (SW0, SW1, HW4 and HW5).
The MIPS core has 8 interrupts defined. On Lantiq SoCs, hardware
interrupts are wired to an ICU instance. Each VPE has an independent
instance of the ICU. The mapping of the ICU interrupts is shown below:
SW0(IP0) - IPI call,
SW1(IP1) - IPI resched,
HW0(IP2) - ICU 0-31,
HW1(IP3) - ICU 32-63,
HW2(IP4) - ICU 64-95,
HW3(IP5) - ICU 96-127,
HW4(IP6) - ICU 128-159,
HW5(IP7) - timer.
This patch enables all interrupt lines on the second VPE.
This problem affects multithreaded SoCs with a custom interrupt controller.
SOCs with 1004Kc core and newer use the MIPS GIC. At this point, I am aware
that the Realtek RTL839x and RTL930x SoCs may need a similar fix. In the
future, this may be replaced with some generic solution.
Tested on Lantiq xRX200.
Suggested-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
Signed-off-by: Aleksander Jan Bajkowski <olek2@wp.pl>
Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
2022-09-22 04:59:44 +08:00
|
|
|
/*
|
|
|
|
* These structs are used to override vsmp_init_secondary()
|
|
|
|
*/
|
|
|
|
#if defined(CONFIG_MIPS_MT_SMP)
|
|
|
|
extern const struct plat_smp_ops vsmp_smp_ops;
|
|
|
|
static struct plat_smp_ops lantiq_smp_ops;
|
|
|
|
#endif
|
|
|
|
|
2011-03-30 15:27:47 +08:00
|
|
|
const char *get_system_type(void)
|
|
|
|
{
|
|
|
|
return soc_info.sys_type;
|
|
|
|
}
|
|
|
|
|
2014-09-11 04:29:21 +08:00
|
|
|
int ltq_soc_type(void)
|
|
|
|
{
|
|
|
|
return soc_info.type;
|
|
|
|
}
|
|
|
|
|
2011-03-30 15:27:47 +08:00
|
|
|
static void __init prom_init_cmdline(void)
|
|
|
|
{
|
|
|
|
int argc = fw_arg0;
|
|
|
|
char **argv = (char **) KSEG1ADDR(fw_arg1);
|
|
|
|
int i;
|
|
|
|
|
2012-05-02 18:27:39 +08:00
|
|
|
arcs_cmdline[0] = '\0';
|
|
|
|
|
2011-03-30 15:27:47 +08:00
|
|
|
for (i = 0; i < argc; i++) {
|
2012-05-02 18:27:39 +08:00
|
|
|
char *p = (char *) KSEG1ADDR(argv[i]);
|
2011-03-30 15:27:47 +08:00
|
|
|
|
2012-05-02 18:27:39 +08:00
|
|
|
if (CPHYSADDR(p) && *p) {
|
2011-03-30 15:27:47 +08:00
|
|
|
strlcat(arcs_cmdline, p, sizeof(arcs_cmdline));
|
|
|
|
strlcat(arcs_cmdline, " ", sizeof(arcs_cmdline));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-04-14 02:56:13 +08:00
|
|
|
void __init plat_mem_setup(void)
|
2011-03-30 15:27:47 +08:00
|
|
|
{
|
2016-03-20 01:28:51 +08:00
|
|
|
void *dtb;
|
|
|
|
|
2012-04-14 02:56:13 +08:00
|
|
|
ioport_resource.start = IOPORT_RESOURCE_START;
|
|
|
|
ioport_resource.end = IOPORT_RESOURCE_END;
|
|
|
|
iomem_resource.start = IOMEM_RESOURCE_START;
|
|
|
|
iomem_resource.end = IOMEM_RESOURCE_END;
|
|
|
|
|
|
|
|
set_io_port_base((unsigned long) KSEG1);
|
|
|
|
|
2021-01-27 21:24:30 +08:00
|
|
|
dtb = get_fdt();
|
|
|
|
if (dtb == NULL)
|
2016-03-20 01:28:51 +08:00
|
|
|
panic("no dtb found");
|
|
|
|
|
2012-04-14 02:56:13 +08:00
|
|
|
/*
|
2016-03-20 01:28:51 +08:00
|
|
|
* Load the devicetree. This causes the chosen node to be
|
2012-04-14 02:56:13 +08:00
|
|
|
* parsed resulting in our memory appearing
|
|
|
|
*/
|
2016-03-20 01:28:51 +08:00
|
|
|
__dt_setup_arch(dtb);
|
2012-04-14 02:56:13 +08:00
|
|
|
}
|
2011-03-30 15:27:47 +08:00
|
|
|
|
MIPS: lantiq: enable all hardware interrupts on second VPE
This patch is needed to handle interrupts by the second VPE on the Lantiq
ARX100, xRX200, xRX300 and xRX330 SoCs. Switching some ICU interrupts to
the second VPE results in a hang. Currently, the vsmp_init_secondary()
function is responsible for enabling these interrupts. It only enables
Malta-specific interrupts (SW0, SW1, HW4 and HW5).
The MIPS core has 8 interrupts defined. On Lantiq SoCs, hardware
interrupts are wired to an ICU instance. Each VPE has an independent
instance of the ICU. The mapping of the ICU interrupts is shown below:
SW0(IP0) - IPI call,
SW1(IP1) - IPI resched,
HW0(IP2) - ICU 0-31,
HW1(IP3) - ICU 32-63,
HW2(IP4) - ICU 64-95,
HW3(IP5) - ICU 96-127,
HW4(IP6) - ICU 128-159,
HW5(IP7) - timer.
This patch enables all interrupt lines on the second VPE.
This problem affects multithreaded SoCs with a custom interrupt controller.
SOCs with 1004Kc core and newer use the MIPS GIC. At this point, I am aware
that the Realtek RTL839x and RTL930x SoCs may need a similar fix. In the
future, this may be replaced with some generic solution.
Tested on Lantiq xRX200.
Suggested-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
Signed-off-by: Aleksander Jan Bajkowski <olek2@wp.pl>
Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
2022-09-22 04:59:44 +08:00
|
|
|
#if defined(CONFIG_MIPS_MT_SMP)
|
|
|
|
static void lantiq_init_secondary(void)
|
|
|
|
{
|
|
|
|
/*
|
|
|
|
* MIPS CPU startup function vsmp_init_secondary() will only
|
|
|
|
* enable some of the interrupts for the second CPU/VPE.
|
|
|
|
*/
|
|
|
|
set_c0_status(ST0_IM);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2012-04-14 02:56:13 +08:00
|
|
|
void __init prom_init(void)
|
|
|
|
{
|
|
|
|
/* call the soc specific detetcion code and get it to fill soc_info */
|
2011-03-30 15:27:47 +08:00
|
|
|
ltq_soc_detect(&soc_info);
|
2012-04-14 02:56:13 +08:00
|
|
|
snprintf(soc_info.sys_type, LTQ_SYS_TYPE_LEN - 1, "%s rev %s",
|
|
|
|
soc_info.name, soc_info.rev_type);
|
2011-03-30 15:27:47 +08:00
|
|
|
soc_info.sys_type[LTQ_SYS_TYPE_LEN - 1] = '\0';
|
|
|
|
pr_info("SoC: %s\n", soc_info.sys_type);
|
|
|
|
prom_init_cmdline();
|
2012-04-30 17:33:05 +08:00
|
|
|
|
|
|
|
#if defined(CONFIG_MIPS_MT_SMP)
|
MIPS: lantiq: enable all hardware interrupts on second VPE
This patch is needed to handle interrupts by the second VPE on the Lantiq
ARX100, xRX200, xRX300 and xRX330 SoCs. Switching some ICU interrupts to
the second VPE results in a hang. Currently, the vsmp_init_secondary()
function is responsible for enabling these interrupts. It only enables
Malta-specific interrupts (SW0, SW1, HW4 and HW5).
The MIPS core has 8 interrupts defined. On Lantiq SoCs, hardware
interrupts are wired to an ICU instance. Each VPE has an independent
instance of the ICU. The mapping of the ICU interrupts is shown below:
SW0(IP0) - IPI call,
SW1(IP1) - IPI resched,
HW0(IP2) - ICU 0-31,
HW1(IP3) - ICU 32-63,
HW2(IP4) - ICU 64-95,
HW3(IP5) - ICU 96-127,
HW4(IP6) - ICU 128-159,
HW5(IP7) - timer.
This patch enables all interrupt lines on the second VPE.
This problem affects multithreaded SoCs with a custom interrupt controller.
SOCs with 1004Kc core and newer use the MIPS GIC. At this point, I am aware
that the Realtek RTL839x and RTL930x SoCs may need a similar fix. In the
future, this may be replaced with some generic solution.
Tested on Lantiq xRX200.
Suggested-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
Signed-off-by: Aleksander Jan Bajkowski <olek2@wp.pl>
Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
2022-09-22 04:59:44 +08:00
|
|
|
if (cpu_has_mipsmt) {
|
|
|
|
lantiq_smp_ops = vsmp_smp_ops;
|
|
|
|
lantiq_smp_ops.init_secondary = lantiq_init_secondary;
|
|
|
|
register_smp_ops(&lantiq_smp_ops);
|
|
|
|
}
|
2012-04-30 17:33:05 +08:00
|
|
|
#endif
|
2011-03-30 15:27:47 +08:00
|
|
|
}
|