Commit d2be38b9 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'mips_6.11' of git://git.kernel.org/pub/scm/linux/kernel/git/mips/linux

Pull MIPS updates from Thomas Bogendoerfer:

 - add support for Realtek RTL9302C

 - add support for Mobileye EyeQ6H

 - add support for Mobileye EyeQ OLB system controller

 - improve r4k clocksource

 - add mode for emulating ieee754 NAN2008

 - rework for BMIPS CBR address handling

 - fixes for Loongson 2K1000

 - defconfig updates

 - cleanups and fixes

* tag 'mips_6.11' of git://git.kernel.org/pub/scm/linux/kernel/git/mips/linux: (58 commits)
  MIPS: config: Add ip30_defconfig
  MIPS: config: lemote2f: Regenerate defconfig
  MIPS: config: generic: Add board-litex
  MIPS: config: Enable MSA and virtualization for MIPS64R6
  MIPS: Fix fallback march for SB1
  mips: dts: realtek: Add RTL9302C board
  mips: generic: add fdt fixup for Realtek reference board
  mips: select REALTEK_OTTO_TIMER for Realtek platforms
  dt-bindings: interrupt-controller: realtek,rtl-intc: Add rtl9300-intc
  dt-bindings: mips: realtek: Add rtl930x-soc compatible
  dt-bindings: vendor-prefixes: Add Cameo Communications
  mips: dts: realtek: add device_type property to cpu node
  mips: dts: realtek: use "serial" instead of "uart" in node name
  MIPS: Implement ieee754 NAN2008 emulation mode
  MIPS: lantiq: improve USB initialization
  MIPS: GIC: Generate redirect block accessors
  MIPS: CPS: Add a couple of multi-cluster utility functions
  MIPS: Octeron: remove source file executable bit
  MAINTAINERS: Mobileye: add OLB drivers and dt-bindings
  MIPS: mobileye: eyeq5: add OLB system-controller node
  ...
parents 3c3ff7be bb2d6350
...@@ -2003,7 +2003,7 @@ ...@@ -2003,7 +2003,7 @@
for the device. By default it is set to false (0). for the device. By default it is set to false (0).
ieee754= [MIPS] Select IEEE Std 754 conformance mode ieee754= [MIPS] Select IEEE Std 754 conformance mode
Format: { strict | legacy | 2008 | relaxed } Format: { strict | legacy | 2008 | relaxed | emulated }
Default: strict Default: strict
Choose which programs will be accepted for execution Choose which programs will be accepted for execution
...@@ -2023,6 +2023,8 @@ ...@@ -2023,6 +2023,8 @@
by the FPU by the FPU
relaxed accept any binaries regardless of whether relaxed accept any binaries regardless of whether
supported by the FPU supported by the FPU
emulated accept any binaries but enable FPU emulator
if binary mode is unsupported by the FPU.
The FPU emulator is always able to support both NaN The FPU emulator is always able to support both NaN
encodings, so if no FPU hardware is present or it has encodings, so if no FPU hardware is present or it has
......
...@@ -25,6 +25,7 @@ properties: ...@@ -25,6 +25,7 @@ properties:
- items: - items:
- enum: - enum:
- realtek,rtl8380-intc - realtek,rtl8380-intc
- realtek,rtl9300-intc
- const: realtek,rtl-intc - const: realtek,rtl-intc
- const: realtek,rtl-intc - const: realtek,rtl-intc
deprecated: true deprecated: true
...@@ -35,7 +36,10 @@ properties: ...@@ -35,7 +36,10 @@ properties:
const: 1 const: 1
reg: reg:
maxItems: 1 minItems: 1
items:
- description: vpe0 registers
- description: vpe1 registers
interrupts: interrupts:
minItems: 1 minItems: 1
...@@ -71,6 +75,20 @@ allOf: ...@@ -71,6 +75,20 @@ allOf:
else: else:
required: required:
- interrupts - interrupts
- if:
properties:
compatible:
contains:
const: realtek,rtl9300-intc
then:
properties:
reg:
minItems: 2
maxItems: 2
else:
properties:
reg:
maxItems: 1
additionalProperties: false additionalProperties: false
......
...@@ -55,6 +55,16 @@ properties: ...@@ -55,6 +55,16 @@ properties:
under the "cpus" node. under the "cpus" node.
$ref: /schemas/types.yaml#/definitions/uint32 $ref: /schemas/types.yaml#/definitions/uint32
brcm,bmips-cbr-reg:
description: Reference address of the CBR.
Some SoC suffer from a BUG where CBR(Core Base Register)
address might be badly or never initialized by the Bootloader
or reading it from co-processor registers, if the system boots
from secondary CPU, results in invalid address.
The CBR address is always the same on the SoC hence it
can be provided in DT to handle these broken case.
$ref: /schemas/types.yaml#/definitions/uint32
patternProperties: patternProperties:
"^cpu@[0-9]$": "^cpu@[0-9]$":
type: object type: object
...@@ -64,6 +74,20 @@ properties: ...@@ -64,6 +74,20 @@ properties:
required: required:
- mips-hpt-frequency - mips-hpt-frequency
if:
properties:
compatible:
contains:
enum:
- brcm,bcm6358
- brcm,bcm6368
then:
properties:
cpus:
required:
- brcm,bmips-cbr-reg
additionalProperties: true additionalProperties: true
examples: examples:
......
...@@ -26,6 +26,11 @@ properties: ...@@ -26,6 +26,11 @@ properties:
- enum: - enum:
- mobileye,eyeq5-epm5 - mobileye,eyeq5-epm5
- const: mobileye,eyeq5 - const: mobileye,eyeq5
- description: Boards with Mobileye EyeQ6H SoC
items:
- enum:
- mobileye,eyeq6h-epm6
- const: mobileye,eyeq6h
additionalProperties: true additionalProperties: true
......
...@@ -20,5 +20,9 @@ properties: ...@@ -20,5 +20,9 @@ properties:
- enum: - enum:
- cisco,sg220-26 - cisco,sg220-26
- const: realtek,rtl8382-soc - const: realtek,rtl8382-soc
- items:
- enum:
- cameo,rtl9302c-2x-rtl8224-2xge
- const: realtek,rtl9302-soc
additionalProperties: true additionalProperties: true
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/soc/mobileye/mobileye,eyeq5-olb.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: Mobileye EyeQ SoC system controller
maintainers:
- Grégory Clement <gregory.clement@bootlin.com>
- Théo Lebrun <theo.lebrun@bootlin.com>
- Vladimir Kondratiev <vladimir.kondratiev@mobileye.com>
description:
OLB ("Other Logic Block") is a hardware block grouping smaller blocks. Clocks,
resets, pinctrl are being handled from here. EyeQ5 and EyeQ6L host a single
instance. EyeQ6H hosts seven instances.
properties:
compatible:
items:
- enum:
- mobileye,eyeq5-olb
- mobileye,eyeq6l-olb
- mobileye,eyeq6h-acc-olb
- mobileye,eyeq6h-central-olb
- mobileye,eyeq6h-east-olb
- mobileye,eyeq6h-west-olb
- mobileye,eyeq6h-south-olb
- mobileye,eyeq6h-ddr0-olb
- mobileye,eyeq6h-ddr1-olb
- const: syscon
reg:
maxItems: 1
'#reset-cells':
description:
First cell is domain and optional if compatible has a single reset domain.
Second cell is reset index inside that domain.
enum: [ 1, 2 ]
'#clock-cells':
description:
Cell is clock index. Optional if compatible has a single clock.
enum: [ 0, 1 ]
clocks:
maxItems: 1
description:
Input parent clock to all PLLs. Expected to be the main crystal.
clock-names:
const: ref
patternProperties:
'-pins?$':
type: object
description: Pin muxing configuration.
$ref: /schemas/pinctrl/pinmux-node.yaml#
additionalProperties: false
properties:
pins: true
function:
enum: [gpio,
# Bank A
timer0, timer1, timer2, timer5, uart0, uart1, can0, can1, spi0,
spi1, refclk0,
# Bank B
timer3, timer4, timer6, uart2, can2, spi2, spi3, mclk0]
bias-disable: true
bias-pull-down: true
bias-pull-up: true
drive-strength: true
required:
- pins
- function
allOf:
- if:
properties:
function:
const: gpio
then:
properties:
pins:
items: # PA0 - PA28, PB0 - PB22
pattern: '^(P(A|B)1?[0-9]|PA2[0-8]|PB2[0-2])$'
- if:
properties:
function:
const: timer0
then:
properties:
pins:
items:
enum: [PA0, PA1]
- if:
properties:
function:
const: timer1
then:
properties:
pins:
items:
enum: [PA2, PA3]
- if:
properties:
function:
const: timer2
then:
properties:
pins:
items:
enum: [PA4, PA5]
- if:
properties:
function:
const: timer5
then:
properties:
pins:
items:
enum: [PA6, PA7, PA8, PA9]
- if:
properties:
function:
const: uart0
then:
properties:
pins:
items:
enum: [PA10, PA11]
- if:
properties:
function:
const: uart1
then:
properties:
pins:
items:
enum: [PA12, PA13]
- if:
properties:
function:
const: can0
then:
properties:
pins:
items:
enum: [PA14, PA15]
- if:
properties:
function:
const: can1
then:
properties:
pins:
items:
enum: [PA16, PA17]
- if:
properties:
function:
const: spi0
then:
properties:
pins:
items:
enum: [PA18, PA19, PA20, PA21, PA22]
- if:
properties:
function:
const: spi1
then:
properties:
pins:
items:
enum: [PA23, PA24, PA25, PA26, PA27]
- if:
properties:
function:
const: refclk0
then:
properties:
pins:
items:
enum: [PA28]
- if:
properties:
function:
const: timer3
then:
properties:
pins:
items:
enum: [PB0, PB1]
- if:
properties:
function:
const: timer4
then:
properties:
pins:
items:
enum: [PB2, PB3]
- if:
properties:
function:
const: timer6
then:
properties:
pins:
items:
enum: [PB4, PB5, PB6, PB7]
- if:
properties:
function:
const: uart2
then:
properties:
pins:
items:
enum: [PB8, PB9]
- if:
properties:
function:
const: can2
then:
properties:
pins:
items:
enum: [PB10, PB11]
- if:
properties:
function:
const: spi2
then:
properties:
pins:
items:
enum: [PB12, PB13, PB14, PB15, PB16]
- if:
properties:
function:
const: spi3
then:
properties:
pins:
items:
enum: [PB17, PB18, PB19, PB20, PB21]
- if:
properties:
function:
const: mclk0
then:
properties:
pins:
items:
enum: [PB22]
required:
- compatible
- reg
- '#clock-cells'
- clocks
- clock-names
additionalProperties: false
allOf:
# Compatibles exposing a single reset domain.
- if:
properties:
compatible:
contains:
enum:
- mobileye,eyeq6h-acc-olb
- mobileye,eyeq6h-east-olb
- mobileye,eyeq6h-west-olb
then:
properties:
'#reset-cells':
const: 1
required:
- '#reset-cells'
# Compatibles exposing two reset domains.
- if:
properties:
compatible:
contains:
enum:
- mobileye,eyeq5-olb
- mobileye,eyeq6l-olb
then:
properties:
'#reset-cells':
const: 2
required:
- '#reset-cells'
# Compatibles not exposing resets.
- if:
properties:
compatible:
contains:
enum:
- mobileye,eyeq6h-central-olb
- mobileye,eyeq6h-south-olb
- mobileye,eyeq6h-ddr0-olb
- mobileye,eyeq6h-ddr1-olb
then:
properties:
'#reset-cells': false
# Compatibles exposing a single clock.
- if:
properties:
compatible:
contains:
enum:
- mobileye,eyeq6h-central-olb
- mobileye,eyeq6h-east-olb
- mobileye,eyeq6h-west-olb
- mobileye,eyeq6h-ddr0-olb
- mobileye,eyeq6h-ddr1-olb
then:
properties:
'#clock-cells':
const: 0
else:
properties:
'#clock-cells':
const: 1
# Only EyeQ5 has pinctrl in OLB.
- if:
not:
properties:
compatible:
contains:
const: mobileye,eyeq5-olb
then:
patternProperties:
'-pins?$': false
examples:
- |
soc {
#address-cells = <2>;
#size-cells = <2>;
system-controller@e00000 {
compatible = "mobileye,eyeq5-olb", "syscon";
reg = <0 0xe00000 0x0 0x400>;
#reset-cells = <2>;
#clock-cells = <1>;
clocks = <&xtal>;
clock-names = "ref";
};
};
- |
soc {
#address-cells = <2>;
#size-cells = <2>;
system-controller@d2003000 {
compatible = "mobileye,eyeq6h-acc-olb", "syscon";
reg = <0x0 0xd2003000 0x0 0x1000>;
#reset-cells = <1>;
#clock-cells = <1>;
clocks = <&xtal>;
clock-names = "ref";
};
};
...@@ -246,6 +246,8 @@ patternProperties: ...@@ -246,6 +246,8 @@ patternProperties:
description: CALAO Systems SAS description: CALAO Systems SAS
"^calxeda,.*": "^calxeda,.*":
description: Calxeda description: Calxeda
"^cameo,.*":
description: Cameo Communications, Inc
"^canaan,.*": "^canaan,.*":
description: Canaan, Inc. description: Canaan, Inc.
"^caninos,.*": "^caninos,.*":
......
...@@ -15406,9 +15406,14 @@ M: Théo Lebrun <theo.lebrun@bootlin.com> ...@@ -15406,9 +15406,14 @@ M: Théo Lebrun <theo.lebrun@bootlin.com>
L: linux-mips@vger.kernel.org L: linux-mips@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/devicetree/bindings/mips/mobileye.yaml F: Documentation/devicetree/bindings/mips/mobileye.yaml
F: Documentation/devicetree/bindings/soc/mobileye/
F: arch/mips/boot/dts/mobileye/ F: arch/mips/boot/dts/mobileye/
F: arch/mips/configs/eyeq5_defconfig F: arch/mips/configs/eyeq5_defconfig
F: arch/mips/mobileye/board-epm5.its.S F: arch/mips/mobileye/board-epm5.its.S
F: drivers/clk/clk-eyeq.c
F: drivers/pinctrl/pinctrl-eyeq5.c
F: drivers/reset/reset-eyeq.c
F: include/dt-bindings/clock/mobileye,eyeq5-clk.h
MODULE SUPPORT MODULE SUPPORT
M: Luis Chamberlain <mcgrof@kernel.org> M: Luis Chamberlain <mcgrof@kernel.org>
......
...@@ -8,6 +8,7 @@ platform-$(CONFIG_BCM47XX) += bcm47xx/ ...@@ -8,6 +8,7 @@ platform-$(CONFIG_BCM47XX) += bcm47xx/
platform-$(CONFIG_BCM63XX) += bcm63xx/ platform-$(CONFIG_BCM63XX) += bcm63xx/
platform-$(CONFIG_BMIPS_GENERIC) += bmips/ platform-$(CONFIG_BMIPS_GENERIC) += bmips/
platform-$(CONFIG_CAVIUM_OCTEON_SOC) += cavium-octeon/ platform-$(CONFIG_CAVIUM_OCTEON_SOC) += cavium-octeon/
platform-$(CONFIG_EYEQ) += mobileye/
platform-$(CONFIG_MIPS_COBALT) += cobalt/ platform-$(CONFIG_MIPS_COBALT) += cobalt/
platform-$(CONFIG_MACH_DECSTATION) += dec/ platform-$(CONFIG_MACH_DECSTATION) += dec/
platform-$(CONFIG_MIPS_GENERIC) += generic/ platform-$(CONFIG_MIPS_GENERIC) += generic/
...@@ -17,7 +18,6 @@ platform-$(CONFIG_MACH_LOONGSON2EF) += loongson2ef/ ...@@ -17,7 +18,6 @@ platform-$(CONFIG_MACH_LOONGSON2EF) += loongson2ef/
platform-$(CONFIG_MACH_LOONGSON32) += loongson32/ platform-$(CONFIG_MACH_LOONGSON32) += loongson32/
platform-$(CONFIG_MACH_LOONGSON64) += loongson64/ platform-$(CONFIG_MACH_LOONGSON64) += loongson64/
platform-$(CONFIG_MIPS_MALTA) += mti-malta/ platform-$(CONFIG_MIPS_MALTA) += mti-malta/
platform-$(CONFIG_MACH_EYEQ5) += mobileye/
platform-$(CONFIG_MACH_NINTENDO64) += n64/ platform-$(CONFIG_MACH_NINTENDO64) += n64/
platform-$(CONFIG_PIC32MZDA) += pic32/ platform-$(CONFIG_PIC32MZDA) += pic32/
platform-$(CONFIG_RALINK) += ralink/ platform-$(CONFIG_RALINK) += ralink/
......
...@@ -30,7 +30,7 @@ config MIPS ...@@ -30,7 +30,7 @@ config MIPS
select BUILDTIME_TABLE_SORT select BUILDTIME_TABLE_SORT
select CLONE_BACKWARDS select CLONE_BACKWARDS
select CPU_NO_EFFICIENT_FFS if (TARGET_ISA_REV < 1) select CPU_NO_EFFICIENT_FFS if (TARGET_ISA_REV < 1)
select CPU_PM if CPU_IDLE select CPU_PM if CPU_IDLE || SUSPEND
select GENERIC_ATOMIC64 if !64BIT select GENERIC_ATOMIC64 if !64BIT
select GENERIC_CMOS_UPDATE select GENERIC_CMOS_UPDATE
select GENERIC_CPU_AUTOPROBE select GENERIC_CPU_AUTOPROBE
...@@ -575,8 +575,8 @@ config MACH_PIC32 ...@@ -575,8 +575,8 @@ config MACH_PIC32
Microchip PIC32 is a family of general-purpose 32 bit MIPS core Microchip PIC32 is a family of general-purpose 32 bit MIPS core
microcontrollers. microcontrollers.
config MACH_EYEQ5 config EYEQ
bool "Mobileye EyeQ5 SoC" bool "Mobileye EyeQ SoC"
select MACH_GENERIC_CORE select MACH_GENERIC_CORE
select ARM_AMBA select ARM_AMBA
select PHYSICAL_START_BOOL select PHYSICAL_START_BOOL
...@@ -615,7 +615,7 @@ config MACH_EYEQ5 ...@@ -615,7 +615,7 @@ config MACH_EYEQ5
select USB_UHCI_BIG_ENDIAN_MMIO if CPU_BIG_ENDIAN select USB_UHCI_BIG_ENDIAN_MMIO if CPU_BIG_ENDIAN
select USE_OF select USE_OF
help help
Select this to build a kernel supporting EyeQ5 SoC from Mobileye. Select this to build a kernel supporting EyeQ SoC from Mobileye.
bool bool
...@@ -667,6 +667,7 @@ config MACH_REALTEK_RTL ...@@ -667,6 +667,7 @@ config MACH_REALTEK_RTL
select BOOT_RAW select BOOT_RAW
select PINCTRL select PINCTRL
select USE_OF select USE_OF
select REALTEK_OTTO_TIMER
config SGI_IP22 config SGI_IP22
bool "SGI IP22 (Indy/Indigo2)" bool "SGI IP22 (Indy/Indigo2)"
...@@ -1021,6 +1022,7 @@ source "arch/mips/generic/Kconfig" ...@@ -1021,6 +1022,7 @@ source "arch/mips/generic/Kconfig"
source "arch/mips/ingenic/Kconfig" source "arch/mips/ingenic/Kconfig"
source "arch/mips/jazz/Kconfig" source "arch/mips/jazz/Kconfig"
source "arch/mips/lantiq/Kconfig" source "arch/mips/lantiq/Kconfig"
source "arch/mips/mobileye/Kconfig"
source "arch/mips/pic32/Kconfig" source "arch/mips/pic32/Kconfig"
source "arch/mips/ralink/Kconfig" source "arch/mips/ralink/Kconfig"
source "arch/mips/sgi-ip27/Kconfig" source "arch/mips/sgi-ip27/Kconfig"
...@@ -1083,6 +1085,7 @@ config CSRC_IOASIC ...@@ -1083,6 +1085,7 @@ config CSRC_IOASIC
config CSRC_R4K config CSRC_R4K
select CLOCKSOURCE_WATCHDOG if CPU_FREQ select CLOCKSOURCE_WATCHDOG if CPU_FREQ
select HAVE_UNSTABLE_SCHED_CLOCK if SMP && 64BIT
bool bool
config CSRC_SB1250 config CSRC_SB1250
......
...@@ -170,7 +170,7 @@ cflags-$(CONFIG_CPU_NEVADA) += $(call cc-option,-march=rm5200,-march=mips4) \ ...@@ -170,7 +170,7 @@ cflags-$(CONFIG_CPU_NEVADA) += $(call cc-option,-march=rm5200,-march=mips4) \
-Wa,--trap -Wa,--trap
cflags-$(CONFIG_CPU_RM7000) += $(call cc-option,-march=rm7000,-march=mips4) \ cflags-$(CONFIG_CPU_RM7000) += $(call cc-option,-march=rm7000,-march=mips4) \
-Wa,--trap -Wa,--trap
cflags-$(CONFIG_CPU_SB1) += $(call cc-option,-march=sb1,-march=mips64r1) \ cflags-$(CONFIG_CPU_SB1) += $(call cc-option,-march=sb1,-march=mips64) \
-Wa,--trap -Wa,--trap
cflags-$(CONFIG_CPU_SB1) += $(call cc-option,-mno-mdmx) cflags-$(CONFIG_CPU_SB1) += $(call cc-option,-mno-mdmx)
cflags-$(CONFIG_CPU_SB1) += $(call cc-option,-mno-mips3d) cflags-$(CONFIG_CPU_SB1) += $(call cc-option,-mno-mips3d)
......
...@@ -409,8 +409,8 @@ static void __init alchemy_setup_macs(int ctype) ...@@ -409,8 +409,8 @@ static void __init alchemy_setup_macs(int ctype)
if (alchemy_get_macs(ctype) < 1) if (alchemy_get_macs(ctype) < 1)
return; return;
macres = kmemdup(au1xxx_eth0_resources[ctype], macres = kmemdup_array(au1xxx_eth0_resources[ctype], MAC_RES_COUNT,
sizeof(struct resource) * MAC_RES_COUNT, GFP_KERNEL); sizeof(*macres), GFP_KERNEL);
if (!macres) { if (!macres) {
printk(KERN_INFO "Alchemy: no memory for MAC0 resources\n"); printk(KERN_INFO "Alchemy: no memory for MAC0 resources\n");
return; return;
...@@ -430,8 +430,8 @@ static void __init alchemy_setup_macs(int ctype) ...@@ -430,8 +430,8 @@ static void __init alchemy_setup_macs(int ctype)
if (alchemy_get_macs(ctype) < 2) if (alchemy_get_macs(ctype) < 2)
return; return;
macres = kmemdup(au1xxx_eth1_resources[ctype], macres = kmemdup_array(au1xxx_eth1_resources[ctype], MAC_RES_COUNT,
sizeof(struct resource) * MAC_RES_COUNT, GFP_KERNEL); sizeof(*macres), GFP_KERNEL);
if (!macres) { if (!macres) {
printk(KERN_INFO "Alchemy: no memory for MAC1 resources\n"); printk(KERN_INFO "Alchemy: no memory for MAC1 resources\n");
return; return;
......
...@@ -10,15 +10,16 @@ ...@@ -10,15 +10,16 @@
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/gpio/machine.h> #include <linux/gpio/machine.h>
#include <linux/gpio/property.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/leds.h> #include <linux/leds.h>
#include <linux/mmc/host.h> #include <linux/mmc/host.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/property.h>
#include <linux/pm.h> #include <linux/pm.h>
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
#include <linux/spi/spi_gpio.h> #include <linux/spi/spi_gpio.h>
#include <linux/spi/ads7846.h>
#include <asm/mach-au1x00/au1000.h> #include <asm/mach-au1x00/au1000.h>
#include <asm/mach-au1x00/gpio-au1000.h> #include <asm/mach-au1x00/gpio-au1000.h>
#include <asm/mach-au1x00/au1000_dma.h> #include <asm/mach-au1x00/au1000_dma.h>
...@@ -374,22 +375,20 @@ static struct platform_device db1100_mmc1_dev = { ...@@ -374,22 +375,20 @@ static struct platform_device db1100_mmc1_dev = {
/******************************************************************************/ /******************************************************************************/
static struct ads7846_platform_data db1100_touch_pd = { static const struct software_node db1100_alchemy2_gpiochip = {
.model = 7846, .name = "alchemy-gpio2",
.vref_mv = 3300,
}; };
static struct spi_gpio_platform_data db1100_spictl_pd = { static const struct property_entry db1100_ads7846_properties[] = {
.num_chipselect = 1, PROPERTY_ENTRY_U16("ti,vref_min", 3300),
PROPERTY_ENTRY_GPIO("pendown-gpios",
&db1100_alchemy2_gpiochip, 21, GPIO_ACTIVE_LOW),
{ }
}; };
static struct gpiod_lookup_table db1100_touch_gpio_table = { static const struct software_node db1100_ads7846_swnode = {
.dev_id = "spi0.0", .name = "ads7846",
.table = { .properties = db1100_ads7846_properties,
GPIO_LOOKUP("alchemy-gpio2", 21,
"pendown", GPIO_ACTIVE_LOW),
{ }
},
}; };
static struct spi_board_info db1100_spi_info[] __initdata = { static struct spi_board_info db1100_spi_info[] __initdata = {
...@@ -400,37 +399,37 @@ static struct spi_board_info db1100_spi_info[] __initdata = { ...@@ -400,37 +399,37 @@ static struct spi_board_info db1100_spi_info[] __initdata = {
.chip_select = 0, .chip_select = 0,
.mode = 0, .mode = 0,
.irq = AU1100_GPIO21_INT, .irq = AU1100_GPIO21_INT,
.platform_data = &db1100_touch_pd, .swnode = &db1100_ads7846_swnode,
}, },
}; };
static struct platform_device db1100_spi_dev = { static const struct spi_gpio_platform_data db1100_spictl_pd __initconst = {
.name = "spi_gpio", .num_chipselect = 1,
.id = 0,
.dev = {
.platform_data = &db1100_spictl_pd,
.dma_mask = &au1xxx_all_dmamask,
.coherent_dma_mask = DMA_BIT_MASK(32),
},
}; };
/* /*
* Alchemy GPIO 2 has its base at 200 so the GPIO lines * Alchemy GPIO 2 has its base at 200 so the GPIO lines
* 207 thru 210 are GPIOs at offset 7 thru 10 at this chip. * 207 thru 210 are GPIOs at offset 7 thru 10 at this chip.
*/ */
static struct gpiod_lookup_table db1100_spi_gpiod_table = { static const struct property_entry db1100_spi_dev_properties[] __initconst = {
.dev_id = "spi_gpio", PROPERTY_ENTRY_GPIO("miso-gpios",
.table = { &db1100_alchemy2_gpiochip, 7, GPIO_ACTIVE_HIGH),
GPIO_LOOKUP("alchemy-gpio2", 9, PROPERTY_ENTRY_GPIO("mosi-gpios",
"sck", GPIO_ACTIVE_HIGH), &db1100_alchemy2_gpiochip, 8, GPIO_ACTIVE_HIGH),
GPIO_LOOKUP("alchemy-gpio2", 8, PROPERTY_ENTRY_GPIO("sck-gpios",
"mosi", GPIO_ACTIVE_HIGH), &db1100_alchemy2_gpiochip, 9, GPIO_ACTIVE_HIGH),
GPIO_LOOKUP("alchemy-gpio2", 7, PROPERTY_ENTRY_GPIO("cs-gpios",
"miso", GPIO_ACTIVE_HIGH), &db1100_alchemy2_gpiochip, 10, GPIO_ACTIVE_HIGH),
GPIO_LOOKUP("alchemy-gpio2", 10, { }
"cs", GPIO_ACTIVE_HIGH), };
{ },
}, static const struct platform_device_info db1100_spi_dev_info __initconst = {
.name = "spi_gpio",
.id = 0,
.data = &db1100_spictl_pd,
.size_data = sizeof(db1100_spictl_pd),
.dma_mask = DMA_BIT_MASK(32),
.properties = db1100_spi_dev_properties,
}; };
static struct platform_device *db1x00_devs[] = { static struct platform_device *db1x00_devs[] = {
...@@ -452,8 +451,10 @@ int __init db1000_dev_setup(void) ...@@ -452,8 +451,10 @@ int __init db1000_dev_setup(void)
{ {
int board = BCSR_WHOAMI_BOARD(bcsr_read(BCSR_WHOAMI)); int board = BCSR_WHOAMI_BOARD(bcsr_read(BCSR_WHOAMI));
int c0, c1, d0, d1, s0, s1, flashsize = 32, twosocks = 1; int c0, c1, d0, d1, s0, s1, flashsize = 32, twosocks = 1;
int err;
unsigned long pfc; unsigned long pfc;
struct clk *c, *p; struct clk *c, *p;
struct platform_device *spi_dev;
if (board == BCSR_WHOAMI_DB1500) { if (board == BCSR_WHOAMI_DB1500) {
c0 = AU1500_GPIO2_INT; c0 = AU1500_GPIO2_INT;
...@@ -480,7 +481,7 @@ int __init db1000_dev_setup(void) ...@@ -480,7 +481,7 @@ int __init db1000_dev_setup(void)
pfc |= (1 << 0); /* SSI0 pins as GPIOs */ pfc |= (1 << 0); /* SSI0 pins as GPIOs */
alchemy_wrsys(pfc, AU1000_SYS_PINFUNC); alchemy_wrsys(pfc, AU1000_SYS_PINFUNC);
gpiod_add_lookup_table(&db1100_touch_gpio_table); software_node_register(&db1100_alchemy2_gpiochip);
spi_register_board_info(db1100_spi_info, spi_register_board_info(db1100_spi_info,
ARRAY_SIZE(db1100_spi_info)); ARRAY_SIZE(db1100_spi_info));
...@@ -497,8 +498,11 @@ int __init db1000_dev_setup(void) ...@@ -497,8 +498,11 @@ int __init db1000_dev_setup(void)
clk_put(p); clk_put(p);
platform_add_devices(db1100_devs, ARRAY_SIZE(db1100_devs)); platform_add_devices(db1100_devs, ARRAY_SIZE(db1100_devs));
gpiod_add_lookup_table(&db1100_spi_gpiod_table);
platform_device_register(&db1100_spi_dev); spi_dev = platform_device_register_full(&db1100_spi_dev_info);
err = PTR_ERR_OR_ZERO(spi_dev);
if (err)
pr_err("failed to register SPI controller: %d\n", err);
} else if (board == BCSR_WHOAMI_DB1000) { } else if (board == BCSR_WHOAMI_DB1000) {
c0 = AU1000_GPIO2_INT; c0 = AU1000_GPIO2_INT;
c1 = AU1000_GPIO5_INT; c1 = AU1000_GPIO5_INT;
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include <linux/ssb/ssb_driver_chipcommon.h> #include <linux/ssb/ssb_driver_chipcommon.h>
#include <linux/ssb/ssb_regs.h> #include <linux/ssb/ssb_regs.h>
#include <linux/smp.h> #include <linux/smp.h>
#include <asm/bmips.h>
#include <asm/bootinfo.h> #include <asm/bootinfo.h>
#include <bcm47xx.h> #include <bcm47xx.h>
#include <bcm47xx_board.h> #include <bcm47xx_board.h>
...@@ -110,6 +111,8 @@ static __init void prom_init_mem(void) ...@@ -110,6 +111,8 @@ static __init void prom_init_mem(void)
void __init prom_init(void) void __init prom_init(void)
{ {
/* Cache CBR addr before CPU/DMA setup */
bmips_cbr_addr = BMIPS_GET_CBR();
prom_init_mem(); prom_init_mem();
setup_8250_early_printk_port(CKSEG1ADDR(BCM47XX_SERIAL_ADDR), 0, 0); setup_8250_early_printk_port(CKSEG1ADDR(BCM47XX_SERIAL_ADDR), 0, 0);
} }
......
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
#include <linux/ssb/ssb.h> #include <linux/ssb/ssb.h>
#include <linux/ssb/ssb_embedded.h> #include <linux/ssb/ssb_embedded.h>
#include <linux/bcma/bcma_soc.h> #include <linux/bcma/bcma_soc.h>
#include <asm/bmips.h>
#include <asm/bootinfo.h> #include <asm/bootinfo.h>
#include <asm/idle.h> #include <asm/idle.h>
#include <asm/prom.h> #include <asm/prom.h>
...@@ -45,6 +46,13 @@ ...@@ -45,6 +46,13 @@
#include <bcm47xx.h> #include <bcm47xx.h>
#include <bcm47xx_board.h> #include <bcm47xx_board.h>
/*
* CBR addr doesn't change and we can cache it.
* For broken SoC/Bootloader CBR addr might also be provided via DT
* with "brcm,bmips-cbr-reg" in the "cpus" node.
*/
void __iomem *bmips_cbr_addr __read_mostly;
union bcm47xx_bus bcm47xx_bus; union bcm47xx_bus bcm47xx_bus;
EXPORT_SYMBOL(bcm47xx_bus); EXPORT_SYMBOL(bcm47xx_bus);
......
...@@ -22,6 +22,9 @@ void __init prom_init(void) ...@@ -22,6 +22,9 @@ void __init prom_init(void)
{ {
u32 reg, mask; u32 reg, mask;
/* Cache CBR addr before CPU/DMA setup */
bmips_cbr_addr = BMIPS_GET_CBR();
bcm63xx_cpu_init(); bcm63xx_cpu_init();
/* stop any running watchdog */ /* stop any running watchdog */
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include <linux/memblock.h> #include <linux/memblock.h>
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/pm.h> #include <linux/pm.h>
#include <asm/bmips.h>
#include <asm/bootinfo.h> #include <asm/bootinfo.h>
#include <asm/time.h> #include <asm/time.h>
#include <asm/reboot.h> #include <asm/reboot.h>
...@@ -22,6 +23,13 @@ ...@@ -22,6 +23,13 @@
#include <bcm63xx_io.h> #include <bcm63xx_io.h>
#include <bcm63xx_gpio.h> #include <bcm63xx_gpio.h>
/*
* CBR addr doesn't change and we can cache it.
* For broken SoC/Bootloader CBR addr might also be provided via DT
* with "brcm,bmips-cbr-reg" in the "cpus" node.
*/
void __iomem *bmips_cbr_addr __read_mostly;
void bcm63xx_machine_halt(void) void bcm63xx_machine_halt(void)
{ {
pr_info("System halted\n"); pr_info("System halted\n");
......
...@@ -9,7 +9,7 @@ bool bmips_rac_flush_disable; ...@@ -9,7 +9,7 @@ bool bmips_rac_flush_disable;
void arch_sync_dma_for_cpu_all(void) void arch_sync_dma_for_cpu_all(void)
{ {
void __iomem *cbr = BMIPS_GET_CBR(); void __iomem *cbr = bmips_cbr_addr;
u32 cfg; u32 cfg;
if (boot_cpu_type() != CPU_BMIPS3300 && if (boot_cpu_type() != CPU_BMIPS3300 &&
......
...@@ -34,6 +34,13 @@ ...@@ -34,6 +34,13 @@
#define REG_BCM6328_OTP ((void __iomem *)CKSEG1ADDR(0x1000062c)) #define REG_BCM6328_OTP ((void __iomem *)CKSEG1ADDR(0x1000062c))
#define BCM6328_TP1_DISABLED BIT(9) #define BCM6328_TP1_DISABLED BIT(9)
/*
* CBR addr doesn't change and we can cache it.
* For broken SoC/Bootloader CBR addr might also be provided via DT
* with "brcm,bmips-cbr-reg" in the "cpus" node.
*/
void __iomem *bmips_cbr_addr __read_mostly;
extern bool bmips_rac_flush_disable; extern bool bmips_rac_flush_disable;
static const unsigned long kbase = VMLINUX_LOAD_ADDRESS & 0xfff00000; static const unsigned long kbase = VMLINUX_LOAD_ADDRESS & 0xfff00000;
...@@ -111,7 +118,7 @@ static void bcm6358_quirks(void) ...@@ -111,7 +118,7 @@ static void bcm6358_quirks(void)
* because the bootloader is not initializing it properly. * because the bootloader is not initializing it properly.
*/ */
bmips_rac_flush_disable = !!(read_c0_brcm_cmt_local() & (1 << 31)) || bmips_rac_flush_disable = !!(read_c0_brcm_cmt_local() & (1 << 31)) ||
!!BMIPS_GET_CBR(); !!bmips_cbr_addr;
} }
static void bcm6368_quirks(void) static void bcm6368_quirks(void)
...@@ -144,6 +151,8 @@ static void __init bmips_init_cfe(void) ...@@ -144,6 +151,8 @@ static void __init bmips_init_cfe(void)
void __init prom_init(void) void __init prom_init(void)
{ {
/* Cache CBR addr before CPU/DMA setup */
bmips_cbr_addr = BMIPS_GET_CBR();
bmips_init_cfe(); bmips_init_cfe();
bmips_cpu_setup(); bmips_cpu_setup();
register_bmips_smp_ops(); register_bmips_smp_ops();
...@@ -203,13 +212,35 @@ void __init plat_mem_setup(void) ...@@ -203,13 +212,35 @@ void __init plat_mem_setup(void)
void __init device_tree_init(void) void __init device_tree_init(void)
{ {
struct device_node *np; struct device_node *np;
u32 addr;
unflatten_and_copy_device_tree(); unflatten_and_copy_device_tree();
/* Disable SMP boot unless both CPUs are listed in DT and !disabled */ /* Disable SMP boot unless both CPUs are listed in DT and !disabled */
np = of_find_node_by_name(NULL, "cpus"); np = of_find_node_by_name(NULL, "cpus");
if (np && of_get_available_child_count(np) <= 1) if (!np)
return;
if (of_get_available_child_count(np) <= 1)
bmips_smp_enabled = 0; bmips_smp_enabled = 0;
/* Check if DT provide a CBR address */
if (of_property_read_u32(np, "brcm,bmips-cbr-reg", &addr))
goto exit;
/* Make sure CBR address is outside DRAM window */
if (addr >= (u32)memblock_start_of_DRAM() &&
addr < (u32)memblock_end_of_DRAM()) {
WARN(1, "DT CBR %x inside DRAM window. Ignoring DT CBR.\n",
addr);
goto exit;
}
bmips_cbr_addr = (void __iomem *)addr;
/* Since CBR is provided by DT, enable RAC flush */
bmips_rac_flush_disable = false;
exit:
of_node_put(np); of_node_put(np);
} }
......
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
subdir-$(CONFIG_BMIPS_GENERIC) += brcm subdir-$(CONFIG_BMIPS_GENERIC) += brcm
subdir-$(CONFIG_CAVIUM_OCTEON_SOC) += cavium-octeon subdir-$(CONFIG_CAVIUM_OCTEON_SOC) += cavium-octeon
subdir-$(CONFIG_EYEQ) += mobileye
subdir-$(CONFIG_FIT_IMAGE_FDT_MARDUK) += img subdir-$(CONFIG_FIT_IMAGE_FDT_MARDUK) += img
subdir-$(CONFIG_FIT_IMAGE_FDT_BOSTON) += img subdir-$(CONFIG_FIT_IMAGE_FDT_BOSTON) += img
subdir-$(CONFIG_MACH_INGENIC) += ingenic subdir-$(CONFIG_MACH_INGENIC) += ingenic
...@@ -8,7 +9,6 @@ subdir-$(CONFIG_LANTIQ) += lantiq ...@@ -8,7 +9,6 @@ subdir-$(CONFIG_LANTIQ) += lantiq
subdir-$(CONFIG_MACH_LOONGSON64) += loongson subdir-$(CONFIG_MACH_LOONGSON64) += loongson
subdir-$(CONFIG_SOC_VCOREIII) += mscc subdir-$(CONFIG_SOC_VCOREIII) += mscc
subdir-$(CONFIG_MIPS_MALTA) += mti subdir-$(CONFIG_MIPS_MALTA) += mti
subdir-$(CONFIG_MACH_EYEQ5) += mobileye
subdir-$(CONFIG_LEGACY_BOARD_SEAD3) += mti subdir-$(CONFIG_LEGACY_BOARD_SEAD3) += mti
subdir-$(CONFIG_FIT_IMAGE_FDT_NI169445) += ni subdir-$(CONFIG_FIT_IMAGE_FDT_NI169445) += ni
subdir-$(CONFIG_MACH_PIC32) += pic32 subdir-$(CONFIG_MACH_PIC32) += pic32
......
...@@ -23,14 +23,6 @@ cpu0: cpu@0 { ...@@ -23,14 +23,6 @@ cpu0: cpu@0 {
}; };
}; };
memory@200000 {
compatible = "memory";
device_type = "memory";
reg = <0x00000000 0x00200000 0x00000000 0x0ee00000>, /* 238 MB at 2 MB */
<0x00000000 0x20000000 0x00000000 0x1f000000>, /* 496 MB at 512 MB */
<0x00000001 0x10000000 0x00000001 0xb0000000>; /* 6912 MB at 4352MB */
};
cpu_clk: cpu_clk { cpu_clk: cpu_clk {
#clock-cells = <0>; #clock-cells = <0>;
compatible = "fixed-clock"; compatible = "fixed-clock";
...@@ -52,6 +44,13 @@ package0: bus@10000000 { ...@@ -52,6 +44,13 @@ package0: bus@10000000 {
0 0x40000000 0 0x40000000 0 0x40000000 0 0x40000000 0 0x40000000 0 0x40000000
0xfe 0x00000000 0xfe 0x00000000 0 0x40000000>; 0xfe 0x00000000 0xfe 0x00000000 0 0x40000000>;
isa@18000000 {
compatible = "isa";
#size-cells = <1>;
#address-cells = <2>;
ranges = <1 0x0 0x0 0x18000000 0x4000>;
};
pm: reset-controller@1fe07000 { pm: reset-controller@1fe07000 {
compatible = "loongson,ls2k-pm"; compatible = "loongson,ls2k-pm";
reg = <0 0x1fe07000 0 0x422>; reg = <0 0x1fe07000 0 0x422>;
...@@ -100,8 +99,8 @@ liointc1: interrupt-controller@1fe11440 { ...@@ -100,8 +99,8 @@ liointc1: interrupt-controller@1fe11440 {
rtc0: rtc@1fe07800 { rtc0: rtc@1fe07800 {
compatible = "loongson,ls2k1000-rtc"; compatible = "loongson,ls2k1000-rtc";
reg = <0 0x1fe07800 0 0x78>; reg = <0 0x1fe07800 0 0x78>;
interrupt-parent = <&liointc0>; interrupt-parent = <&liointc1>;
interrupts = <60 IRQ_TYPE_LEVEL_LOW>; interrupts = <8 IRQ_TYPE_LEVEL_HIGH>;
}; };
uart0: serial@1fe00000 { uart0: serial@1fe00000 {
...@@ -109,7 +108,7 @@ uart0: serial@1fe00000 { ...@@ -109,7 +108,7 @@ uart0: serial@1fe00000 {
reg = <0 0x1fe00000 0 0x8>; reg = <0 0x1fe00000 0 0x8>;
clock-frequency = <125000000>; clock-frequency = <125000000>;
interrupt-parent = <&liointc0>; interrupt-parent = <&liointc0>;
interrupts = <0 IRQ_TYPE_LEVEL_LOW>; interrupts = <0 IRQ_TYPE_LEVEL_HIGH>;
no-loopback-test; no-loopback-test;
}; };
...@@ -118,7 +117,6 @@ pci@1a000000 { ...@@ -118,7 +117,6 @@ pci@1a000000 {
device_type = "pci"; device_type = "pci";
#address-cells = <3>; #address-cells = <3>;
#size-cells = <2>; #size-cells = <2>;
#interrupt-cells = <2>;
reg = <0 0x1a000000 0 0x02000000>, reg = <0 0x1a000000 0 0x02000000>,
<0xfe 0x00000000 0 0x20000000>; <0xfe 0x00000000 0 0x20000000>;
...@@ -133,11 +131,12 @@ gmac@3,0 { ...@@ -133,11 +131,12 @@ gmac@3,0 {
"pciclass0c03"; "pciclass0c03";
reg = <0x1800 0x0 0x0 0x0 0x0>; reg = <0x1800 0x0 0x0 0x0 0x0>;
interrupts = <12 IRQ_TYPE_LEVEL_LOW>, interrupts = <12 IRQ_TYPE_LEVEL_HIGH>,
<13 IRQ_TYPE_LEVEL_LOW>; <13 IRQ_TYPE_LEVEL_HIGH>;
interrupt-names = "macirq", "eth_lpi"; interrupt-names = "macirq", "eth_lpi";
interrupt-parent = <&liointc0>; interrupt-parent = <&liointc0>;
phy-mode = "rgmii"; phy-mode = "rgmii-id";
phy-handle = <&phy1>;
mdio { mdio {
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
...@@ -156,11 +155,12 @@ gmac@3,1 { ...@@ -156,11 +155,12 @@ gmac@3,1 {
"loongson, pci-gmac"; "loongson, pci-gmac";
reg = <0x1900 0x0 0x0 0x0 0x0>; reg = <0x1900 0x0 0x0 0x0 0x0>;
interrupts = <14 IRQ_TYPE_LEVEL_LOW>, interrupts = <14 IRQ_TYPE_LEVEL_HIGH>,
<15 IRQ_TYPE_LEVEL_LOW>; <15 IRQ_TYPE_LEVEL_HIGH>;
interrupt-names = "macirq", "eth_lpi"; interrupt-names = "macirq", "eth_lpi";
interrupt-parent = <&liointc0>; interrupt-parent = <&liointc0>;
phy-mode = "rgmii"; phy-mode = "rgmii-id";
phy-handle = <&phy1>;
mdio { mdio {
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
...@@ -178,7 +178,7 @@ ehci@4,1 { ...@@ -178,7 +178,7 @@ ehci@4,1 {
"pciclass0c03"; "pciclass0c03";
reg = <0x2100 0x0 0x0 0x0 0x0>; reg = <0x2100 0x0 0x0 0x0 0x0>;
interrupts = <18 IRQ_TYPE_LEVEL_LOW>; interrupts = <18 IRQ_TYPE_LEVEL_HIGH>;
interrupt-parent = <&liointc1>; interrupt-parent = <&liointc1>;
}; };
...@@ -189,7 +189,7 @@ ohci@4,2 { ...@@ -189,7 +189,7 @@ ohci@4,2 {
"pciclass0c03"; "pciclass0c03";
reg = <0x2200 0x0 0x0 0x0 0x0>; reg = <0x2200 0x0 0x0 0x0 0x0>;
interrupts = <19 IRQ_TYPE_LEVEL_LOW>; interrupts = <19 IRQ_TYPE_LEVEL_HIGH>;
interrupt-parent = <&liointc1>; interrupt-parent = <&liointc1>;
}; };
...@@ -200,97 +200,121 @@ sata@8,0 { ...@@ -200,97 +200,121 @@ sata@8,0 {
"pciclass0106"; "pciclass0106";
reg = <0x4000 0x0 0x0 0x0 0x0>; reg = <0x4000 0x0 0x0 0x0 0x0>;
interrupts = <19 IRQ_TYPE_LEVEL_LOW>; interrupts = <19 IRQ_TYPE_LEVEL_HIGH>;
interrupt-parent = <&liointc0>; interrupt-parent = <&liointc0>;
}; };
pci_bridge@9,0 { pcie@9,0 {
compatible = "pci0014,7a19.0", compatible = "pci0014,7a19.0",
"pci0014,7a19", "pci0014,7a19",
"pciclass060400", "pciclass060400",
"pciclass0604"; "pciclass0604";
reg = <0x4800 0x0 0x0 0x0 0x0>; reg = <0x4800 0x0 0x0 0x0 0x0>;
#address-cells = <3>;
#size-cells = <2>;
device_type = "pci";
#interrupt-cells = <1>; #interrupt-cells = <1>;
interrupts = <0 IRQ_TYPE_LEVEL_LOW>; interrupts = <0 IRQ_TYPE_LEVEL_HIGH>;
interrupt-parent = <&liointc1>; interrupt-parent = <&liointc1>;
interrupt-map-mask = <0 0 0 0>; interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &liointc1 0 IRQ_TYPE_LEVEL_LOW>; interrupt-map = <0 0 0 0 &liointc1 0 IRQ_TYPE_LEVEL_HIGH>;
ranges;
external-facing; external-facing;
}; };
pci_bridge@a,0 { pcie@a,0 {
compatible = "pci0014,7a09.0", compatible = "pci0014,7a09.0",
"pci0014,7a09", "pci0014,7a09",
"pciclass060400", "pciclass060400",
"pciclass0604"; "pciclass0604";
reg = <0x5000 0x0 0x0 0x0 0x0>; reg = <0x5000 0x0 0x0 0x0 0x0>;
#address-cells = <3>;
#size-cells = <2>;
device_type = "pci";
#interrupt-cells = <1>; #interrupt-cells = <1>;
interrupts = <1 IRQ_TYPE_LEVEL_LOW>; interrupts = <1 IRQ_TYPE_LEVEL_HIGH>;
interrupt-parent = <&liointc1>; interrupt-parent = <&liointc1>;
interrupt-map-mask = <0 0 0 0>; interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &liointc1 1 IRQ_TYPE_LEVEL_LOW>; interrupt-map = <0 0 0 0 &liointc1 1 IRQ_TYPE_LEVEL_HIGH>;
ranges;
external-facing; external-facing;
}; };
pci_bridge@b,0 { pcie@b,0 {
compatible = "pci0014,7a09.0", compatible = "pci0014,7a09.0",
"pci0014,7a09", "pci0014,7a09",
"pciclass060400", "pciclass060400",
"pciclass0604"; "pciclass0604";
reg = <0x5800 0x0 0x0 0x0 0x0>; reg = <0x5800 0x0 0x0 0x0 0x0>;
#address-cells = <3>;
#size-cells = <2>;
device_type = "pci";
#interrupt-cells = <1>; #interrupt-cells = <1>;
interrupts = <2 IRQ_TYPE_LEVEL_LOW>; interrupts = <2 IRQ_TYPE_LEVEL_HIGH>;
interrupt-parent = <&liointc1>; interrupt-parent = <&liointc1>;
interrupt-map-mask = <0 0 0 0>; interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &liointc1 2 IRQ_TYPE_LEVEL_LOW>; interrupt-map = <0 0 0 0 &liointc1 2 IRQ_TYPE_LEVEL_HIGH>;
ranges;
external-facing; external-facing;
}; };
pci_bridge@c,0 { pcie@c,0 {
compatible = "pci0014,7a09.0", compatible = "pci0014,7a09.0",
"pci0014,7a09", "pci0014,7a09",
"pciclass060400", "pciclass060400",
"pciclass0604"; "pciclass0604";
reg = <0x6000 0x0 0x0 0x0 0x0>; reg = <0x6000 0x0 0x0 0x0 0x0>;
#address-cells = <3>;
#size-cells = <2>;
device_type = "pci";
#interrupt-cells = <1>; #interrupt-cells = <1>;
interrupts = <3 IRQ_TYPE_LEVEL_LOW>; interrupts = <3 IRQ_TYPE_LEVEL_HIGH>;
interrupt-parent = <&liointc1>; interrupt-parent = <&liointc1>;
interrupt-map-mask = <0 0 0 0>; interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &liointc1 3 IRQ_TYPE_LEVEL_LOW>; interrupt-map = <0 0 0 0 &liointc1 3 IRQ_TYPE_LEVEL_HIGH>;
ranges;
external-facing; external-facing;
}; };
pci_bridge@d,0 { pcie@d,0 {
compatible = "pci0014,7a19.0", compatible = "pci0014,7a19.0",
"pci0014,7a19", "pci0014,7a19",
"pciclass060400", "pciclass060400",
"pciclass0604"; "pciclass0604";
reg = <0x6800 0x0 0x0 0x0 0x0>; reg = <0x6800 0x0 0x0 0x0 0x0>;
#address-cells = <3>;
#size-cells = <2>;
device_type = "pci";
#interrupt-cells = <1>; #interrupt-cells = <1>;
interrupts = <4 IRQ_TYPE_LEVEL_LOW>; interrupts = <4 IRQ_TYPE_LEVEL_HIGH>;
interrupt-parent = <&liointc1>; interrupt-parent = <&liointc1>;
interrupt-map-mask = <0 0 0 0>; interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &liointc1 4 IRQ_TYPE_LEVEL_LOW>; interrupt-map = <0 0 0 0 &liointc1 4 IRQ_TYPE_LEVEL_HIGH>;
ranges;
external-facing; external-facing;
}; };
pci_bridge@e,0 { pcie@e,0 {
compatible = "pci0014,7a09.0", compatible = "pci0014,7a09.0",
"pci0014,7a09", "pci0014,7a09",
"pciclass060400", "pciclass060400",
"pciclass0604"; "pciclass0604";
reg = <0x7000 0x0 0x0 0x0 0x0>; reg = <0x7000 0x0 0x0 0x0 0x0>;
#address-cells = <3>;
#size-cells = <2>;
device_type = "pci";
#interrupt-cells = <1>; #interrupt-cells = <1>;
interrupts = <5 IRQ_TYPE_LEVEL_LOW>; interrupts = <5 IRQ_TYPE_LEVEL_HIGH>;
interrupt-parent = <&liointc1>; interrupt-parent = <&liointc1>;
interrupt-map-mask = <0 0 0 0>; interrupt-map-mask = <0 0 0 0>;
interrupt-map = <0 0 0 0 &liointc1 5 IRQ_TYPE_LEVEL_LOW>; interrupt-map = <0 0 0 0 &liointc1 5 IRQ_TYPE_LEVEL_HIGH>;
ranges;
external-facing; external-facing;
}; };
......
...@@ -33,6 +33,7 @@ msi: msi-controller@2ff00000 { ...@@ -33,6 +33,7 @@ msi: msi-controller@2ff00000 {
compatible = "loongson,pch-msi-1.0"; compatible = "loongson,pch-msi-1.0";
reg = <0 0x2ff00000 0 0x8>; reg = <0 0x2ff00000 0 0x8>;
interrupt-controller; interrupt-controller;
#interrupt-cells = <1>;
msi-controller; msi-controller;
loongson,msi-base-vec = <64>; loongson,msi-base-vec = <64>;
loongson,msi-num-vecs = <192>; loongson,msi-num-vecs = <192>;
......
...@@ -2,3 +2,4 @@ ...@@ -2,3 +2,4 @@
# Copyright 2023 Mobileye Vision Technologies Ltd. # Copyright 2023 Mobileye Vision Technologies Ltd.
dtb-$(CONFIG_MACH_EYEQ5) += eyeq5-epm5.dtb dtb-$(CONFIG_MACH_EYEQ5) += eyeq5-epm5.dtb
dtb-$(CONFIG_MACH_EYEQ6H) += eyeq6h-epm6.dtb
...@@ -3,42 +3,20 @@ ...@@ -3,42 +3,20 @@
* Copyright 2023 Mobileye Vision Technologies Ltd. * Copyright 2023 Mobileye Vision Technologies Ltd.
*/ */
#include <dt-bindings/clock/mobileye,eyeq5-clk.h>
/ { / {
/* Fixed clock */ /* Fixed clock */
pll_cpu: pll-cpu { xtal: xtal {
compatible = "fixed-clock";
#clock-cells = <0>;
clock-frequency = <1500000000>;
};
pll_vdi: pll-vdi {
compatible = "fixed-clock";
#clock-cells = <0>;
clock-frequency = <1280000000>;
};
pll_per: pll-per {
compatible = "fixed-clock";
#clock-cells = <0>;
clock-frequency = <2000000000>;
};
pll_ddr0: pll-ddr0 {
compatible = "fixed-clock";
#clock-cells = <0>;
clock-frequency = <1857210000>;
};
pll_ddr1: pll-ddr1 {
compatible = "fixed-clock"; compatible = "fixed-clock";
#clock-cells = <0>; #clock-cells = <0>;
clock-frequency = <1857210000>; clock-frequency = <30000000>;
}; };
/* PLL_CPU derivatives */ /* PLL_CPU derivatives */
occ_cpu: occ-cpu { occ_cpu: occ-cpu {
compatible = "fixed-factor-clock"; compatible = "fixed-factor-clock";
clocks = <&pll_cpu>; clocks = <&olb EQ5C_PLL_CPU>;
#clock-cells = <0>; #clock-cells = <0>;
clock-div = <1>; clock-div = <1>;
clock-mult = <1>; clock-mult = <1>;
...@@ -101,7 +79,7 @@ mem_clk: mem-clk { ...@@ -101,7 +79,7 @@ mem_clk: mem-clk {
}; };
occ_isram: occ-isram { occ_isram: occ-isram {
compatible = "fixed-factor-clock"; compatible = "fixed-factor-clock";
clocks = <&pll_cpu>; clocks = <&olb EQ5C_PLL_CPU>;
#clock-cells = <0>; #clock-cells = <0>;
clock-div = <2>; clock-div = <2>;
clock-mult = <1>; clock-mult = <1>;
...@@ -115,7 +93,7 @@ isram_clk: isram-clk { /* gate ClkRstGen_isram */ ...@@ -115,7 +93,7 @@ isram_clk: isram-clk { /* gate ClkRstGen_isram */
}; };
occ_dbu: occ-dbu { occ_dbu: occ-dbu {
compatible = "fixed-factor-clock"; compatible = "fixed-factor-clock";
clocks = <&pll_cpu>; clocks = <&olb EQ5C_PLL_CPU>;
#clock-cells = <0>; #clock-cells = <0>;
clock-div = <10>; clock-div = <10>;
clock-mult = <1>; clock-mult = <1>;
...@@ -130,7 +108,7 @@ si_dbu_tp_pclk: si-dbu-tp-pclk { /* gate ClkRstGen_dbu */ ...@@ -130,7 +108,7 @@ si_dbu_tp_pclk: si-dbu-tp-pclk { /* gate ClkRstGen_dbu */
/* PLL_VDI derivatives */ /* PLL_VDI derivatives */
occ_vdi: occ-vdi { occ_vdi: occ-vdi {
compatible = "fixed-factor-clock"; compatible = "fixed-factor-clock";
clocks = <&pll_vdi>; clocks = <&olb EQ5C_PLL_VDI>;
#clock-cells = <0>; #clock-cells = <0>;
clock-div = <2>; clock-div = <2>;
clock-mult = <1>; clock-mult = <1>;
...@@ -144,7 +122,7 @@ vdi_clk: vdi-clk { /* gate ClkRstGen_vdi */ ...@@ -144,7 +122,7 @@ vdi_clk: vdi-clk { /* gate ClkRstGen_vdi */
}; };
occ_can_ser: occ-can-ser { occ_can_ser: occ-can-ser {
compatible = "fixed-factor-clock"; compatible = "fixed-factor-clock";
clocks = <&pll_vdi>; clocks = <&olb EQ5C_PLL_VDI>;
#clock-cells = <0>; #clock-cells = <0>;
clock-div = <16>; clock-div = <16>;
clock-mult = <1>; clock-mult = <1>;
...@@ -158,7 +136,7 @@ can_ser_clk: can-ser-clk { /* gate ClkRstGen_can_ser */ ...@@ -158,7 +136,7 @@ can_ser_clk: can-ser-clk { /* gate ClkRstGen_can_ser */
}; };
i2c_ser_clk: i2c-ser-clk { i2c_ser_clk: i2c-ser-clk {
compatible = "fixed-factor-clock"; compatible = "fixed-factor-clock";
clocks = <&pll_vdi>; clocks = <&olb EQ5C_PLL_VDI>;
#clock-cells = <0>; #clock-cells = <0>;
clock-div = <20>; clock-div = <20>;
clock-mult = <1>; clock-mult = <1>;
...@@ -166,7 +144,7 @@ i2c_ser_clk: i2c-ser-clk { ...@@ -166,7 +144,7 @@ i2c_ser_clk: i2c-ser-clk {
/* PLL_PER derivatives */ /* PLL_PER derivatives */
occ_periph: occ-periph { occ_periph: occ-periph {
compatible = "fixed-factor-clock"; compatible = "fixed-factor-clock";
clocks = <&pll_per>; clocks = <&olb EQ5C_PLL_PER>;
#clock-cells = <0>; #clock-cells = <0>;
clock-div = <16>; clock-div = <16>;
clock-mult = <1>; clock-mult = <1>;
...@@ -225,7 +203,7 @@ gpio_clk: gpio-clk { ...@@ -225,7 +203,7 @@ gpio_clk: gpio-clk {
}; };
emmc_sys_clk: emmc-sys-clk { emmc_sys_clk: emmc-sys-clk {
compatible = "fixed-factor-clock"; compatible = "fixed-factor-clock";
clocks = <&pll_per>; clocks = <&olb EQ5C_PLL_PER>;
#clock-cells = <0>; #clock-cells = <0>;
clock-div = <10>; clock-div = <10>;
clock-mult = <1>; clock-mult = <1>;
...@@ -233,7 +211,7 @@ emmc_sys_clk: emmc-sys-clk { ...@@ -233,7 +211,7 @@ emmc_sys_clk: emmc-sys-clk {
}; };
ccf_ctrl_clk: ccf-ctrl-clk { ccf_ctrl_clk: ccf-ctrl-clk {
compatible = "fixed-factor-clock"; compatible = "fixed-factor-clock";
clocks = <&pll_per>; clocks = <&olb EQ5C_PLL_PER>;
#clock-cells = <0>; #clock-cells = <0>;
clock-div = <4>; clock-div = <4>;
clock-mult = <1>; clock-mult = <1>;
...@@ -241,7 +219,7 @@ ccf_ctrl_clk: ccf-ctrl-clk { ...@@ -241,7 +219,7 @@ ccf_ctrl_clk: ccf-ctrl-clk {
}; };
occ_mjpeg_core: occ-mjpeg-core { occ_mjpeg_core: occ-mjpeg-core {
compatible = "fixed-factor-clock"; compatible = "fixed-factor-clock";
clocks = <&pll_per>; clocks = <&olb EQ5C_PLL_PER>;
#clock-cells = <0>; #clock-cells = <0>;
clock-div = <2>; clock-div = <2>;
clock-mult = <1>; clock-mult = <1>;
...@@ -265,7 +243,7 @@ mjpeg_core_clk: mjpeg-core-clk { /* gate ClkRstGen_mjpeg_gen */ ...@@ -265,7 +243,7 @@ mjpeg_core_clk: mjpeg-core-clk { /* gate ClkRstGen_mjpeg_gen */
}; };
fcmu_a_clk: fcmu-a-clk { fcmu_a_clk: fcmu-a-clk {
compatible = "fixed-factor-clock"; compatible = "fixed-factor-clock";
clocks = <&pll_per>; clocks = <&olb EQ5C_PLL_PER>;
#clock-cells = <0>; #clock-cells = <0>;
clock-div = <20>; clock-div = <20>;
clock-mult = <1>; clock-mult = <1>;
...@@ -273,7 +251,7 @@ fcmu_a_clk: fcmu-a-clk { ...@@ -273,7 +251,7 @@ fcmu_a_clk: fcmu-a-clk {
}; };
occ_pci_sys: occ-pci-sys { occ_pci_sys: occ-pci-sys {
compatible = "fixed-factor-clock"; compatible = "fixed-factor-clock";
clocks = <&pll_per>; clocks = <&olb EQ5C_PLL_PER>;
#clock-cells = <0>; #clock-cells = <0>;
clock-div = <8>; clock-div = <8>;
clock-mult = <1>; clock-mult = <1>;
......
// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
/*
* Default pin configuration for Mobileye EyeQ5 boards. We mostly create one
* pin configuration node per function.
*/
&olb {
timer0_pins: timer0-pins {
function = "timer0";
pins = "PA0", "PA1";
};
timer1_pins: timer1-pins {
function = "timer1";
pins = "PA2", "PA3";
};
timer2_pins: timer2-pins {
function = "timer2";
pins = "PA4", "PA5";
};
pps0_pins: pps0-pin {
function = "timer2";
pins = "PA4";
};
pps1_pins: pps1-pin {
function = "timer2";
pins = "PA5";
};
timer5_ext_pins: timer5-ext-pins {
function = "timer5";
pins = "PA6", "PA7", "PA8", "PA9";
};
timer5_ext_input_pins: timer5-ext-input-pins {
function = "timer5";
pins = "PA6", "PA7";
};
timer5_ext_incap_a_pins: timer5-ext-incap-a-pin {
function = "timer5";
pins = "PA6";
};
timer5_ext_incap_b_pins: timer5-ext-incap-b-pin {
function = "timer5";
pins = "PA7";
};
can0_pins: can0-pins {
function = "can0";
pins = "PA14", "PA15";
};
can1_pins: can1-pins {
function = "can1";
pins = "PA16", "PA17";
};
uart0_pins: uart0-pins {
function = "uart0";
pins = "PA10", "PA11";
};
uart1_pins: uart1-pins {
function = "uart1";
pins = "PA12", "PA13";
};
spi0_pins: spi0-pins {
function = "spi0";
pins = "PA18", "PA19", "PA20", "PA21", "PA22";
};
spi1_pins: spi1-pins {
function = "spi1";
pins = "PA23", "PA24", "PA25", "PA26", "PA27";
};
spi1_slave_pins: spi1-slave-pins {
function = "spi1";
pins = "PA24", "PA25", "PA26";
};
refclk0_pins: refclk0-pin {
function = "refclk0";
pins = "PA28";
};
timer3_pins: timer3-pins {
function = "timer3";
pins = "PB0", "PB1";
};
timer4_pins: timer4-pins {
function = "timer4";
pins = "PB2", "PB3";
};
timer6_ext_pins: timer6-ext-pins {
function = "timer6";
pins = "PB4", "PB5", "PB6", "PB7";
};
timer6_ext_input_pins: timer6-ext-input-pins {
function = "timer6";
pins = "PB4", "PB5";
};
timer6_ext_incap_a_pins: timer6-ext-incap-a-pin {
function = "timer6";
pins = "PB4";
};
timer6_ext_incap_b_pins: timer6-ext-incap-b-pin {
function = "timer6";
pins = "PB5";
};
can2_pins: can2-pins {
function = "can2";
pins = "PB10", "PB11";
};
uart2_pins: uart2-pins {
function = "uart2";
pins = "PB8", "PB9";
};
spi2_pins: spi2-pins {
function = "spi2";
pins = "PB12", "PB13", "PB14", "PB15", "PB16";
};
spi3_pins: spi3-pins {
function = "spi3";
pins = "PB17", "PB18", "PB19", "PB20", "PB21";
};
spi3_slave_pins: spi3-slave-pins {
function = "spi3";
pins = "PB18", "PB19", "PB20";
};
mclk0_pins: mclk0-pin {
function = "mclk0";
pins = "PB22";
};
};
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
#include <dt-bindings/interrupt-controller/mips-gic.h> #include <dt-bindings/interrupt-controller/mips-gic.h>
#include "eyeq5-fixed-clocks.dtsi" #include "eyeq5-clocks.dtsi"
/ { / {
#address-cells = <2>; #address-cells = <2>;
...@@ -78,6 +78,9 @@ uart0: serial@800000 { ...@@ -78,6 +78,9 @@ uart0: serial@800000 {
interrupts = <GIC_SHARED 6 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SHARED 6 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&uart_clk>, <&occ_periph>; clocks = <&uart_clk>, <&occ_periph>;
clock-names = "uartclk", "apb_pclk"; clock-names = "uartclk", "apb_pclk";
resets = <&olb 0 10>;
pinctrl-names = "default";
pinctrl-0 = <&uart0_pins>;
}; };
uart1: serial@900000 { uart1: serial@900000 {
...@@ -88,6 +91,9 @@ uart1: serial@900000 { ...@@ -88,6 +91,9 @@ uart1: serial@900000 {
interrupts = <GIC_SHARED 6 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SHARED 6 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&uart_clk>, <&occ_periph>; clocks = <&uart_clk>, <&occ_periph>;
clock-names = "uartclk", "apb_pclk"; clock-names = "uartclk", "apb_pclk";
resets = <&olb 0 11>;
pinctrl-names = "default";
pinctrl-0 = <&uart1_pins>;
}; };
uart2: serial@a00000 { uart2: serial@a00000 {
...@@ -98,6 +104,18 @@ uart2: serial@a00000 { ...@@ -98,6 +104,18 @@ uart2: serial@a00000 {
interrupts = <GIC_SHARED 6 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SHARED 6 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&uart_clk>, <&occ_periph>; clocks = <&uart_clk>, <&occ_periph>;
clock-names = "uartclk", "apb_pclk"; clock-names = "uartclk", "apb_pclk";
resets = <&olb 0 12>;
pinctrl-names = "default";
pinctrl-0 = <&uart2_pins>;
};
olb: system-controller@e00000 {
compatible = "mobileye,eyeq5-olb", "syscon";
reg = <0 0xe00000 0x0 0x400>;
#reset-cells = <2>;
#clock-cells = <1>;
clocks = <&xtal>;
clock-names = "ref";
}; };
gic: interrupt-controller@140000 { gic: interrupt-controller@140000 {
...@@ -122,3 +140,5 @@ timer { ...@@ -122,3 +140,5 @@ timer {
}; };
}; };
}; };
#include "eyeq5-pins.dtsi"
// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
/*
* Copyright 2024 Mobileye Vision Technologies Ltd.
*/
/dts-v1/;
#include "eyeq6h.dtsi"
/ {
compatible = "mobileye,eyeq6-epm6", "mobileye,eyeq6";
model = "Mobile EyeQ6H MP6 Evaluation board";
chosen {
stdout-path = "serial0:921600n8";
};
memory@0 {
device_type = "memory";
reg = <0x1 0x00000000 0x1 0x00000000>;
};
};
// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
/*
* Copyright 2023 Mobileye Vision Technologies Ltd.
*/
#include <dt-bindings/clock/mobileye,eyeq5-clk.h>
/ {
xtal: clock-30000000 {
compatible = "fixed-clock";
#clock-cells = <0>;
clock-frequency = <30000000>;
};
pll_west: clock-2000000000-west {
compatible = "fixed-clock";
#clock-cells = <0>;
clock-frequency = <2000000000>;
};
pll_cpu: clock-2000000000-cpu {
compatible = "fixed-clock";
#clock-cells = <0>;
clock-frequency = <2000000000>;
};
/* pll-cpu derivatives */
occ_cpu: clock-2000000000-occ-cpu {
compatible = "fixed-factor-clock";
clocks = <&pll_cpu>;
#clock-cells = <0>;
clock-div = <1>;
clock-mult = <1>;
};
/* pll-west derivatives */
occ_periph_w: clock-200000000 {
compatible = "fixed-factor-clock";
clocks = <&pll_west>;
#clock-cells = <0>;
clock-div = <10>;
clock-mult = <1>;
};
uart_clk: clock-200000000-uart {
compatible = "fixed-factor-clock";
clocks = <&occ_periph_w>;
#clock-cells = <0>;
clock-div = <1>;
clock-mult = <1>;
};
};
// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
/*
* Copyright 2024 Mobileye Vision Technologies Ltd.
*/
/*
* MUX register structure
* bits | field | comment
* [0] | MUX_SEL | 0 - GPIO, 1 - alternative func
* [4] | SW_LOOPBACK|
* [5] | SW_OUT_HZ |
* [7] | DBG_IN |
* [11:8] | DS | drive strength
* [13:12] | PUD | pull-up/pull-down. 0, 3 - no, 1 - PD, 2 - PU
* [14] | OD | Open drain
* [15] | ST_CFG | Hysteretic input enable (Schmitt trigger)
*/
&pinctrl_west {
// TODO: use pinctrl-single,bias-pullup
// TODO: use pinctrl-single,bias-pulldown
// TODO: use pinctrl-single,drive-strength
// TODO: use pinctrl-single,input-schmitt
i2c0_pins: i2c0-pins {
pinctrl-single,pins = <
0x000 0x200 // I2C0_SCL pin
0x004 0x200 // I2C0_SDA pin
>;
};
i2c1_pins: i2c1-pins {
pinctrl-single,pins = <
0x008 0x200 // I2C1_SCL pin
0x00c 0x200 // I2C1_SDA pin
>;
};
eth0_pins: eth0-pins {
pinctrl-single,pins = <
0x080 1 // GPIO_C4__SMA0_MDC pin
0x084 1 // GPIO_C5__SMA0_MDIO pin
>;
};
uart0_pins: uart0-pins {
pinctrl-single,pins = <0x0a8 1>; // UART0 pin group
};
uart1_pins: uart1-pins {
pinctrl-single,pins = <0x0a0 1>; // UART1 pin group
};
spi0_pins: spi0-pins {
pinctrl-single,pins = <0x0ac 1>; // SPI0 pin group
};
spi1_pins: spi1-pins {
pinctrl-single,pins = <0x0a4 1>; // SPI1 pin group
};
};
&pinctrl_east {
i2c2_pins: i2c2-pins {
pinctrl-single,pins = <
0x000 0x200 // i2c2_SCL pin
0x004 0x200 // i2c2_SDA pin
>;
};
i2c3_pins: i2c3-pins {
pinctrl-single,pins = <
0x008 0x200 // i2c3_SCL pin
0x00c 0x200 // i2c3_SDA pin
>;
};
eth1_pins: eth1-pins {
pinctrl-single,pins = <
0x080 1 // GPIO_D4__SMA1_MDC pin
0x084 1 // GPIO_D5__SMA1_MDIO pin
>;
};
uart2_sel_pins: uart2-pins {
pinctrl-single,pins = <0x0a4 1>; // UART2 pin group
};
uart3_pins: uart3-pins {
pinctrl-single,pins = <0x09c 1>; // UART3 pin group
};
spi2_pins: spi2-pins {
pinctrl-single,pins = <0x0a8 1>; // SPI2 pin group
};
spi3_pins: spi3-pins {
pinctrl-single,pins = <0x0a0 1>; // SPI3 pin group
};
};
// SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
/*
* Copyright 2024 Mobileye Vision Technologies Ltd.
*/
#include <dt-bindings/interrupt-controller/mips-gic.h>
#include "eyeq6h-fixed-clocks.dtsi"
/ {
#address-cells = <2>;
#size-cells = <2>;
cpus {
#address-cells = <1>;
#size-cells = <0>;
cpu@0 {
device_type = "cpu";
compatible = "img,i6500";
reg = <0>;
clocks = <&occ_cpu>;
};
};
aliases {
serial0 = &uart0;
};
cpu_intc: interrupt-controller {
compatible = "mti,cpu-interrupt-controller";
interrupt-controller;
#address-cells = <0>;
#interrupt-cells = <1>;
};
soc: soc {
compatible = "simple-bus";
#address-cells = <2>;
#size-cells = <2>;
ranges;
uart0: serial@d3331000 {
compatible = "arm,pl011", "arm,primecell";
reg = <0 0xd3331000 0x0 0x1000>;
reg-io-width = <4>;
interrupt-parent = <&gic>;
interrupts = <GIC_SHARED 43 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&occ_periph_w>, <&occ_periph_w>;
clock-names = "uartclk", "apb_pclk";
};
pinctrl_west: pinctrl@d3337000 {
compatible = "pinctrl-single";
reg = <0x0 0xd3337000 0x0 0xb0>;
#pinctrl-cells = <1>;
pinctrl-single,register-width = <32>;
pinctrl-single,function-mask = <0xffff>;
};
pinctrl_east: pinctrl@d3357000 {
compatible = "pinctrl-single";
reg = <0x0 0xd3357000 0x0 0xb0>;
#pinctrl-cells = <1>;
pinctrl-single,register-width = <32>;
pinctrl-single,function-mask = <0xffff>;
};
pinctrl_south: pinctrl@d8014000 {
compatible = "pinctrl-single";
reg = <0x0 0xd8014000 0x0 0xf8>;
#pinctrl-cells = <1>;
pinctrl-single,register-width = <32>;
pinctrl-single,function-mask = <0xffff>;
};
gic: interrupt-controller@f0920000 {
compatible = "mti,gic";
reg = <0x0 0xf0920000 0x0 0x20000>;
interrupt-controller;
#interrupt-cells = <3>;
/*
* Declare the interrupt-parent even though the mti,gic
* binding doesn't require it, such that the kernel can
* figure out that cpu_intc is the root interrupt
* controller & should be probed first.
*/
interrupt-parent = <&cpu_intc>;
timer {
compatible = "mti,gic-timer";
interrupts = <GIC_LOCAL 1 IRQ_TYPE_NONE>;
clocks = <&occ_cpu>;
};
};
};
};
#include "eyeq6h-pins.dtsi"
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
dtb-y += cisco_sg220-26.dtb dtb-y += cisco_sg220-26.dtb
dtb-y += cameo-rtl9302c-2x-rtl8224-2xge.dtb
// SPDX-License-Identifier: GPL-2.0-or-later
/dts-v1/;
#include "rtl930x.dtsi"
#include <dt-bindings/input/input.h>
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/leds/common.h>
#include <dt-bindings/thermal/thermal.h>
/ {
compatible = "cameo,rtl9302c-2x-rtl8224-2xge", "realtek,rtl9302-soc";
model = "RTL9302C Development Board";
memory@0 {
device_type = "memory";
reg = <0x0 0x8000000>;
};
chosen {
stdout-path = "serial0:115200n8";
};
};
&uart0 {
status = "okay";
};
&spi0 {
status = "okay";
flash@0 {
compatible = "jedec,spi-nor";
reg = <0>;
spi-max-frequency = <10000000>;
partitions {
compatible = "fixed-partitions";
#address-cells = <1>;
#size-cells = <1>;
partition@0 {
label = "LOADER";
reg = <0x0 0xe0000>;
read-only;
};
partition@e0000 {
label = "BDINFO";
reg = <0xe0000 0x10000>;
};
partition@f0000 {
label = "SYSINFO";
reg = <0xf0000 0x10000>;
read-only;
};
partition@100000 {
label = "JFFS2 CFG";
reg = <0x100000 0x100000>;
};
partition@200000 {
label = "JFFS2 LOG";
reg = <0x200000 0x100000>;
};
partition@300000 {
label = "RUNTIME";
reg = <0x300000 0xe80000>;
};
partition@1180000 {
label = "RUNTIME2";
reg = <0x1180000 0xe80000>;
};
};
};
};
...@@ -6,6 +6,7 @@ cpus { ...@@ -6,6 +6,7 @@ cpus {
#size-cells = <0>; #size-cells = <0>;
cpu@0 { cpu@0 {
device_type = "cpu";
compatible = "mips,mips4KEc"; compatible = "mips,mips4KEc";
reg = <0>; reg = <0>;
clocks = <&baseclk 0>; clocks = <&baseclk 0>;
......
...@@ -22,7 +22,7 @@ soc: soc { ...@@ -22,7 +22,7 @@ soc: soc {
#size-cells = <1>; #size-cells = <1>;
ranges = <0x0 0x18000000 0x10000>; ranges = <0x0 0x18000000 0x10000>;
uart0: uart@2000 { uart0: serial@2000 {
compatible = "ns16550a"; compatible = "ns16550a";
reg = <0x2000 0x100>; reg = <0x2000 0x100>;
...@@ -39,7 +39,7 @@ uart0: uart@2000 { ...@@ -39,7 +39,7 @@ uart0: uart@2000 {
status = "disabled"; status = "disabled";
}; };
uart1: uart@2100 { uart1: serial@2100 {
compatible = "ns16550a"; compatible = "ns16550a";
reg = <0x2100 0x100>; reg = <0x2100 0x100>;
......
// SPDX-License-Identifier: GPL-2.0-or-later OR BSD-2-Clause
#include "rtl83xx.dtsi"
/ {
compatible = "realtek,rtl9302-soc";
cpus {
#address-cells = <1>;
#size-cells = <0>;
cpu@0 {
device_type = "cpu";
compatible = "mips,mips34Kc";
reg = <0>;
clocks = <&baseclk 0>;
clock-names = "cpu";
};
};
baseclk: clock-800mhz {
compatible = "fixed-clock";
#clock-cells = <0>;
clock-frequency = <800000000>;
};
lx_clk: clock-175mhz {
compatible = "fixed-clock";
#clock-cells = <0>;
clock-frequency = <175000000>;
};
};
&soc {
intc: interrupt-controller@3000 {
compatible = "realtek,rtl9300-intc", "realtek,rtl-intc";
reg = <0x3000 0x18>, <0x3018 0x18>;
interrupt-controller;
#interrupt-cells = <1>;
interrupt-parent = <&cpuintc>;
interrupts = <2>, <3>, <4>, <5>, <6>, <7>;
};
spi0: spi@1200 {
compatible = "realtek,rtl8380-spi";
reg = <0x1200 0x100>;
#address-cells = <1>;
#size-cells = <0>;
};
timer0: timer@3200 {
compatible = "realtek,rtl9302-timer", "realtek,otto-timer";
reg = <0x3200 0x10>, <0x3210 0x10>, <0x3220 0x10>,
<0x3230 0x10>, <0x3240 0x10>;
interrupt-parent = <&intc>;
interrupts = <7>, <8>, <9>, <10>, <11>;
clocks = <&lx_clk>;
};
};
&uart0 {
/delete-property/ clock-frequency;
clocks = <&lx_clk>;
interrupt-parent = <&intc>;
interrupts = <30>;
};
&uart1 {
/delete-property/ clock-frequency;
clocks = <&lx_clk>;
interrupt-parent = <&intc>;
interrupts = <31>;
};
...@@ -122,6 +122,7 @@ CONFIG_IR_GPIO_TX=m ...@@ -122,6 +122,7 @@ CONFIG_IR_GPIO_TX=m
CONFIG_MEDIA_SUPPORT=m CONFIG_MEDIA_SUPPORT=m
CONFIG_DRM=m CONFIG_DRM=m
CONFIG_DRM_DISPLAY_CONNECTOR=m CONFIG_DRM_DISPLAY_CONNECTOR=m
CONFIG_DRM_DW_HDMI=m
CONFIG_DRM_INGENIC=m CONFIG_DRM_INGENIC=m
CONFIG_DRM_INGENIC_DW_HDMI=m CONFIG_DRM_INGENIC_DW_HDMI=m
CONFIG_FB=y CONFIG_FB=y
......
...@@ -12,7 +12,6 @@ CONFIG_MEMCG=y ...@@ -12,7 +12,6 @@ CONFIG_MEMCG=y
CONFIG_BLK_CGROUP=y CONFIG_BLK_CGROUP=y
CONFIG_CGROUP_SCHED=y CONFIG_CGROUP_SCHED=y
CONFIG_CFS_BANDWIDTH=y CONFIG_CFS_BANDWIDTH=y
CONFIG_RT_GROUP_SCHED=y
CONFIG_CGROUP_FREEZER=y CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_CPUACCT=y CONFIG_CGROUP_CPUACCT=y
......
...@@ -8,7 +8,6 @@ CONFIG_IKCONFIG_PROC=y ...@@ -8,7 +8,6 @@ CONFIG_IKCONFIG_PROC=y
CONFIG_MEMCG=y CONFIG_MEMCG=y
CONFIG_BLK_CGROUP=y CONFIG_BLK_CGROUP=y
CONFIG_CFS_BANDWIDTH=y CONFIG_CFS_BANDWIDTH=y
CONFIG_RT_GROUP_SCHED=y
CONFIG_CGROUP_PIDS=y CONFIG_CGROUP_PIDS=y
CONFIG_CGROUP_FREEZER=y CONFIG_CGROUP_FREEZER=y
CONFIG_CPUSETS=y CONFIG_CPUSETS=y
...@@ -19,6 +18,7 @@ CONFIG_USER_NS=y ...@@ -19,6 +18,7 @@ CONFIG_USER_NS=y
CONFIG_SCHED_AUTOGROUP=y CONFIG_SCHED_AUTOGROUP=y
CONFIG_BLK_DEV_INITRD=y CONFIG_BLK_DEV_INITRD=y
CONFIG_EXPERT=y CONFIG_EXPERT=y
CONFIG_EYEQ=y
CONFIG_MACH_EYEQ5=y CONFIG_MACH_EYEQ5=y
CONFIG_FIT_IMAGE_FDT_EPM5=y CONFIG_FIT_IMAGE_FDT_EPM5=y
CONFIG_PAGE_SIZE_16KB=y CONFIG_PAGE_SIZE_16KB=y
......
CONFIG_SYSVIPC=y
CONFIG_NO_HZ_IDLE=y
CONFIG_HIGH_RES_TIMERS=y
CONFIG_BPF_SYSCALL=y
CONFIG_TASKSTATS=y
CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y
CONFIG_MEMCG=y
CONFIG_BLK_CGROUP=y
CONFIG_CFS_BANDWIDTH=y
CONFIG_RT_GROUP_SCHED=y
CONFIG_CGROUP_PIDS=y
CONFIG_CGROUP_FREEZER=y
CONFIG_CPUSETS=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_NAMESPACES=y
CONFIG_USER_NS=y
CONFIG_SCHED_AUTOGROUP=y
CONFIG_BLK_DEV_INITRD=y
CONFIG_EXPERT=y
CONFIG_EYEQ=y
CONFIG_MACH_EYEQ6H=y
CONFIG_MIPS_CPS=y
CONFIG_CPU_HAS_MSA=y
CONFIG_NR_CPUS=16
CONFIG_MIPS_RAW_APPENDED_DTB=y
CONFIG_JUMP_LABEL=y
CONFIG_PAGE_SIZE_16KB=y
CONFIG_COMPAT_32BIT_TIME=y
CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y
CONFIG_TRIM_UNUSED_KSYMS=y
# CONFIG_COMPAT_BRK is not set
CONFIG_SPARSEMEM_MANUAL=y
CONFIG_USERFAULTFD=y
CONFIG_NET=y
CONFIG_PACKET=y
CONFIG_UNIX=y
CONFIG_NET_KEY=y
CONFIG_INET=y
CONFIG_IP_PNP=y
CONFIG_IP_PNP_DHCP=y
CONFIG_NETFILTER=y
CONFIG_CAN=y
CONFIG_PCI=y
CONFIG_PCI_MSI=y
CONFIG_PCI_DEBUG=y
CONFIG_PCI_ENDPOINT=y
CONFIG_DEVTMPFS=y
CONFIG_DEVTMPFS_MOUNT=y
CONFIG_CONNECTOR=y
CONFIG_MTD=y
CONFIG_MTD_UBI=y
CONFIG_MTD_UBI_BLOCK=y
CONFIG_SCSI=y
CONFIG_NETDEVICES=y
CONFIG_MACVLAN=y
CONFIG_IPVLAN=y
CONFIG_MACB=y
CONFIG_MARVELL_PHY=y
CONFIG_MICREL_PHY=y
CONFIG_CAN_M_CAN=y
CONFIG_SERIAL_AMBA_PL011=y
CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
CONFIG_HW_RANDOM=y
CONFIG_I2C=y
CONFIG_I2C_CHARDEV=y
# CONFIG_PTP_1588_CLOCK is not set
CONFIG_PINCTRL=y
CONFIG_PINCTRL_SINGLE=y
CONFIG_MFD_SYSCON=y
CONFIG_HID_A4TECH=y
CONFIG_HID_BELKIN=y
CONFIG_HID_CHERRY=y
CONFIG_HID_CYPRESS=y
CONFIG_HID_EZKEY=y
CONFIG_HID_ITE=y
CONFIG_HID_KENSINGTON=y
CONFIG_HID_REDRAGON=y
CONFIG_HID_MICROSOFT=y
CONFIG_HID_MONTEREY=y
CONFIG_MMC=y
CONFIG_MMC_SDHCI=y
# CONFIG_IOMMU_SUPPORT is not set
CONFIG_RESET_CONTROLLER=y
# CONFIG_NVMEM is not set
CONFIG_EXT4_FS=y
CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_EXT4_FS_SECURITY=y
CONFIG_FS_ENCRYPTION=y
CONFIG_FUSE_FS=y
CONFIG_CUSE=y
CONFIG_MSDOS_FS=y
CONFIG_VFAT_FS=y
CONFIG_TMPFS=y
CONFIG_TMPFS_POSIX_ACL=y
CONFIG_UBIFS_FS=y
CONFIG_NFS_FS=y
CONFIG_NFS_V3_ACL=y
CONFIG_NFS_V4=y
CONFIG_NFS_V4_1=y
CONFIG_NFS_V4_2=y
CONFIG_ROOT_NFS=y
CONFIG_CRYPTO_CRC32_MIPS=y
CONFIG_FRAME_WARN=1024
CONFIG_DEBUG_FS=y
# CONFIG_RCU_TRACE is not set
# CONFIG_FTRACE is not set
CONFIG_CMDLINE_BOOL=y
CONFIG_CMDLINE="earlycon"
...@@ -3,4 +3,6 @@ CONFIG_64BIT=y ...@@ -3,4 +3,6 @@ CONFIG_64BIT=y
CONFIG_MIPS32_O32=y CONFIG_MIPS32_O32=y
CONFIG_MIPS32_N32=y CONFIG_MIPS32_N32=y
CONFIG_CPU_HAS_MSA=y
CONFIG_CRYPTO_CRC32_MIPS=y CONFIG_CRYPTO_CRC32_MIPS=y
CONFIG_VIRTUALIZATION=y
CONFIG_LITEX_LITEETH=y
CONFIG_SERIAL_LITEUART=y
CONFIG_SERIAL_LITEUART_CONSOLE=y
CONFIG_MMC=y
CONFIG_MMC_LITEX=y
CONFIG_LITEX_SOC_CONTROLLER=y
CONFIG_USB_OHCI_HCD=y
CONFIG_USB_OHCI_HCD_PLATFORM=y
...@@ -5,7 +5,6 @@ CONFIG_IKCONFIG_PROC=y ...@@ -5,7 +5,6 @@ CONFIG_IKCONFIG_PROC=y
CONFIG_MEMCG=y CONFIG_MEMCG=y
CONFIG_BLK_CGROUP=y CONFIG_BLK_CGROUP=y
CONFIG_CFS_BANDWIDTH=y CONFIG_CFS_BANDWIDTH=y
CONFIG_RT_GROUP_SCHED=y
CONFIG_CGROUP_PIDS=y CONFIG_CGROUP_PIDS=y
CONFIG_CGROUP_FREEZER=y CONFIG_CGROUP_FREEZER=y
CONFIG_CPUSETS=y CONFIG_CPUSETS=y
......
CONFIG_SYSVIPC=y
CONFIG_POSIX_MQUEUE=y
CONFIG_NO_HZ=y
CONFIG_HIGH_RES_TIMERS=y
CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y
CONFIG_LOG_BUF_SHIFT=15
CONFIG_CGROUPS=y
CONFIG_CPUSETS=y
CONFIG_RELAY=y
CONFIG_EXPERT=y
CONFIG_SGI_IP30=y
CONFIG_SMP=y
CONFIG_NR_CPUS=2
CONFIG_HZ_1000=y
CONFIG_MIPS32_O32=y
CONFIG_MIPS32_N32=y
CONFIG_PM=y
CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y
CONFIG_MODULE_SRCVERSION_ALL=y
CONFIG_PARTITION_ADVANCED=y
CONFIG_SGI_PARTITION=y
CONFIG_DEFAULT_MMAP_MIN_ADDR=65536
CONFIG_NET=y
CONFIG_PACKET=y
CONFIG_UNIX=y
CONFIG_XFRM_USER=m
CONFIG_XFRM_STATISTICS=y
CONFIG_NET_KEY=y
CONFIG_NET_KEY_MIGRATE=y
CONFIG_INET=y
CONFIG_IP_MULTICAST=y
CONFIG_IP_PNP=y
CONFIG_TCP_MD5SIG=y
CONFIG_IPV6_ROUTER_PREF=y
CONFIG_IPV6_ROUTE_INFO=y
CONFIG_IPV6_OPTIMISTIC_DAD=y
CONFIG_INET6_AH=m
CONFIG_INET6_ESP=m
CONFIG_INET6_IPCOMP=m
CONFIG_IPV6_MIP6=m
CONFIG_IPV6_SIT=m
CONFIG_IPV6_SIT_6RD=y
CONFIG_IPV6_TUNNEL=m
CONFIG_IPV6_MULTIPLE_TABLES=y
CONFIG_IPV6_SUBTREES=y
CONFIG_IPV6_MROUTE=y
CONFIG_IPV6_PIMSM_V2=y
CONFIG_NETWORK_SECMARK=y
CONFIG_NET_SCHED=y
CONFIG_NET_SCH_HTB=m
CONFIG_NET_SCH_HFSC=m
CONFIG_NET_SCH_PRIO=m
CONFIG_NET_SCH_MULTIQ=y
CONFIG_NET_SCH_RED=m
CONFIG_NET_SCH_SFQ=m
CONFIG_NET_SCH_TEQL=m
CONFIG_NET_SCH_TBF=m
CONFIG_NET_SCH_GRED=m
CONFIG_NET_SCH_NETEM=m
CONFIG_NET_SCH_INGRESS=m
CONFIG_NET_CLS_BASIC=m
CONFIG_NET_CLS_ROUTE4=m
CONFIG_NET_CLS_FW=m
CONFIG_NET_CLS_U32=m
CONFIG_CLS_U32_MARK=y
CONFIG_NET_CLS_FLOW=m
CONFIG_NET_CLS_CGROUP=y
CONFIG_NET_CLS_ACT=y
CONFIG_NET_ACT_POLICE=y
CONFIG_NET_ACT_GACT=m
CONFIG_GACT_PROB=y
CONFIG_NET_ACT_MIRRED=m
CONFIG_NET_ACT_NAT=m
CONFIG_NET_ACT_PEDIT=m
CONFIG_NET_ACT_SKBEDIT=m
# CONFIG_VGA_ARB is not set
CONFIG_BLK_DEV_LOOP=y
CONFIG_CDROM_PKTCDVD=m
CONFIG_ATA_OVER_ETH=m
CONFIG_SCSI=y
CONFIG_BLK_DEV_SD=y
CONFIG_CHR_DEV_ST=y
CONFIG_BLK_DEV_SR=m
CONFIG_CHR_DEV_SG=m
CONFIG_CHR_DEV_SCH=m
CONFIG_SCSI_CONSTANTS=y
CONFIG_SCSI_LOGGING=y
CONFIG_SCSI_SCAN_ASYNC=y
CONFIG_SCSI_SPI_ATTRS=y
CONFIG_SCSI_FC_ATTRS=y
CONFIG_LIBFC=m
CONFIG_SCSI_QLOGIC_1280=y
CONFIG_SCSI_BFA_FC=m
CONFIG_SCSI_DH=y
CONFIG_SCSI_DH_RDAC=m
CONFIG_SCSI_DH_HP_SW=m
CONFIG_SCSI_DH_EMC=m
CONFIG_SCSI_DH_ALUA=m
CONFIG_MD=y
CONFIG_BLK_DEV_MD=y
CONFIG_MD_RAID0=y
CONFIG_MD_RAID1=y
CONFIG_MD_RAID10=m
CONFIG_MD_RAID456=y
CONFIG_BLK_DEV_DM=m
CONFIG_DM_CRYPT=m
CONFIG_DM_SNAPSHOT=m
CONFIG_DM_MIRROR=m
CONFIG_DM_LOG_USERSPACE=m
CONFIG_DM_ZERO=m
CONFIG_DM_MULTIPATH=m
CONFIG_DM_MULTIPATH_QL=m
CONFIG_DM_MULTIPATH_ST=m
CONFIG_DM_UEVENT=y
CONFIG_NETDEVICES=y
CONFIG_SGI_IOC3_ETH=y
CONFIG_INPUT_SPARSEKMAP=y
CONFIG_INPUT_MATRIXKMAP=y
CONFIG_INPUT_EVDEV=y
CONFIG_SERIO_SGI_IOC3=y
CONFIG_SERIO_RAW=m
CONFIG_SERIO_ALTERA_PS2=m
# CONFIG_VT is not set
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_8250_MANY_PORTS=y
CONFIG_SERIAL_8250_IOC3=y
CONFIG_NOZOMI=m
CONFIG_HW_RANDOM_TIMERIOMEM=m
# CONFIG_PTP_1588_CLOCK is not set
# CONFIG_HWMON is not set
CONFIG_THERMAL=y
CONFIG_SGI_MFD_IOC3=y
CONFIG_RTC_CLASS=y
CONFIG_RTC_DRV_M48T35=y
CONFIG_UIO=y
CONFIG_UIO_AEC=m
CONFIG_UIO_SERCOS3=m
CONFIG_UIO_PCI_GENERIC=m
CONFIG_EXT2_FS=y
CONFIG_EXT2_FS_XATTR=y
CONFIG_EXT2_FS_POSIX_ACL=y
CONFIG_EXT2_FS_SECURITY=y
CONFIG_EXT3_FS=y
CONFIG_EXT3_FS_POSIX_ACL=y
CONFIG_EXT3_FS_SECURITY=y
CONFIG_XFS_FS=m
CONFIG_XFS_QUOTA=y
CONFIG_XFS_POSIX_ACL=y
CONFIG_BTRFS_FS=m
CONFIG_BTRFS_FS_POSIX_ACL=y
CONFIG_QUOTA_NETLINK_INTERFACE=y
CONFIG_FUSE_FS=m
CONFIG_CUSE=m
CONFIG_PROC_KCORE=y
CONFIG_TMPFS=y
CONFIG_TMPFS_POSIX_ACL=y
CONFIG_SQUASHFS=m
CONFIG_OMFS_FS=m
CONFIG_NFS_FS=y
CONFIG_SECURITYFS=y
CONFIG_CRYPTO_CRYPTD=m
CONFIG_CRYPTO_BLOWFISH=m
CONFIG_CRYPTO_CAMELLIA=m
CONFIG_CRYPTO_CAST5=m
CONFIG_CRYPTO_CAST6=m
CONFIG_CRYPTO_FCRYPT=m
CONFIG_CRYPTO_SERPENT=m
CONFIG_CRYPTO_TWOFISH=m
CONFIG_CRYPTO_CTS=m
CONFIG_CRYPTO_LRW=m
CONFIG_CRYPTO_PCBC=m
CONFIG_CRYPTO_XTS=m
CONFIG_CRYPTO_HMAC=y
CONFIG_CRYPTO_MD4=m
CONFIG_CRYPTO_RMD160=m
CONFIG_CRYPTO_VMAC=m
CONFIG_CRYPTO_WP512=m
CONFIG_CRYPTO_XCBC=m
CONFIG_CRYPTO_LZO=m
CONFIG_CRC_T10DIF=m
...@@ -12,15 +12,14 @@ CONFIG_LOG_BUF_SHIFT=15 ...@@ -12,15 +12,14 @@ CONFIG_LOG_BUF_SHIFT=15
CONFIG_BLK_DEV_INITRD=y CONFIG_BLK_DEV_INITRD=y
CONFIG_EXPERT=y CONFIG_EXPERT=y
CONFIG_PROFILING=y CONFIG_PROFILING=y
CONFIG_KEXEC=y
CONFIG_MACH_LOONGSON2EF=y CONFIG_MACH_LOONGSON2EF=y
CONFIG_LEMOTE_MACH2F=y CONFIG_LEMOTE_MACH2F=y
CONFIG_KEXEC=y
# CONFIG_SECCOMP is not set
CONFIG_PCI=y
CONFIG_MIPS32_O32=y CONFIG_MIPS32_O32=y
CONFIG_MIPS32_N32=y CONFIG_MIPS32_N32=y
CONFIG_HIBERNATION=y CONFIG_HIBERNATION=y
CONFIG_PM_STD_PARTITION="/dev/hda3" CONFIG_PM_STD_PARTITION="/dev/hda3"
# CONFIG_SECCOMP is not set
CONFIG_MODULES=y CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_UNLOAD=y
CONFIG_MODVERSIONS=y CONFIG_MODVERSIONS=y
...@@ -68,10 +67,10 @@ CONFIG_BT_HIDP=m ...@@ -68,10 +67,10 @@ CONFIG_BT_HIDP=m
CONFIG_BT_HCIBTUSB=m CONFIG_BT_HCIBTUSB=m
CONFIG_BT_HCIBFUSB=m CONFIG_BT_HCIBFUSB=m
CONFIG_BT_HCIVHCI=m CONFIG_BT_HCIVHCI=m
CONFIG_CFG80211=m CONFIG_CFG80211=y
CONFIG_MAC80211=m CONFIG_MAC80211=y
CONFIG_MAC80211_LEDS=y CONFIG_MAC80211_LEDS=y
CONFIG_RFKILL=m CONFIG_RFKILL=y
CONFIG_RFKILL_INPUT=y CONFIG_RFKILL_INPUT=y
CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP=y
CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM=y
...@@ -83,13 +82,10 @@ CONFIG_ATA=y ...@@ -83,13 +82,10 @@ CONFIG_ATA=y
CONFIG_PATA_AMD=y CONFIG_PATA_AMD=y
CONFIG_MD=y CONFIG_MD=y
CONFIG_BLK_DEV_MD=m CONFIG_BLK_DEV_MD=m
CONFIG_MD_LINEAR=m
CONFIG_MD_RAID0=m CONFIG_MD_RAID0=m
CONFIG_MD_RAID1=m CONFIG_MD_RAID1=m
CONFIG_MD_RAID10=m CONFIG_MD_RAID10=m
CONFIG_MD_RAID456=m CONFIG_MD_RAID456=m
CONFIG_MD_MULTIPATH=m
CONFIG_MD_FAULTY=m
CONFIG_BLK_DEV_DM=m CONFIG_BLK_DEV_DM=m
CONFIG_DM_DEBUG=y CONFIG_DM_DEBUG=y
CONFIG_DM_CRYPT=m CONFIG_DM_CRYPT=m
...@@ -112,6 +108,10 @@ CONFIG_8139TOO=y ...@@ -112,6 +108,10 @@ CONFIG_8139TOO=y
CONFIG_R8169=y CONFIG_R8169=y
CONFIG_USB_USBNET=m CONFIG_USB_USBNET=m
CONFIG_USB_NET_CDC_EEM=m CONFIG_USB_NET_CDC_EEM=m
CONFIG_RTL8180=m
CONFIG_RTL8187=y
CONFIG_RTL_CARDS=m
CONFIG_RTL8XXXU=m
CONFIG_INPUT_EVDEV=y CONFIG_INPUT_EVDEV=y
# CONFIG_MOUSE_PS2_ALPS is not set # CONFIG_MOUSE_PS2_ALPS is not set
# CONFIG_MOUSE_PS2_LOGIPS2PP is not set # CONFIG_MOUSE_PS2_LOGIPS2PP is not set
...@@ -119,27 +119,27 @@ CONFIG_INPUT_EVDEV=y ...@@ -119,27 +119,27 @@ CONFIG_INPUT_EVDEV=y
CONFIG_MOUSE_APPLETOUCH=m CONFIG_MOUSE_APPLETOUCH=m
# CONFIG_SERIO_SERPORT is not set # CONFIG_SERIO_SERPORT is not set
CONFIG_LEGACY_PTY_COUNT=16 CONFIG_LEGACY_PTY_COUNT=16
CONFIG_SERIAL_NONSTANDARD=y
CONFIG_SERIAL_8250=m CONFIG_SERIAL_8250=m
# CONFIG_SERIAL_8250_PCI is not set # CONFIG_SERIAL_8250_PCI is not set
CONFIG_SERIAL_8250_NR_UARTS=16 CONFIG_SERIAL_8250_NR_UARTS=16
CONFIG_SERIAL_8250_EXTENDED=y CONFIG_SERIAL_8250_EXTENDED=y
CONFIG_SERIAL_8250_MANY_PORTS=y CONFIG_SERIAL_8250_MANY_PORTS=y
CONFIG_SERIAL_8250_FOURPORT=y CONFIG_SERIAL_8250_FOURPORT=y
CONFIG_SERIAL_NONSTANDARD=y
CONFIG_HW_RANDOM=y CONFIG_HW_RANDOM=y
CONFIG_GPIO_LOONGSON=y CONFIG_GPIO_LOONGSON=y
CONFIG_THERMAL=y CONFIG_THERMAL=y
CONFIG_MEDIA_SUPPORT=m CONFIG_MEDIA_SUPPORT=m
CONFIG_FB=y CONFIG_FB=y
CONFIG_FIRMWARE_EDID=y
CONFIG_FB_MODE_HELPERS=y
CONFIG_FB_TILEBLITTING=y
CONFIG_FB_SIS=y CONFIG_FB_SIS=y
CONFIG_FB_SIS_300=y CONFIG_FB_SIS_300=y
CONFIG_FB_SIS_315=y CONFIG_FB_SIS_315=y
# CONFIG_LCD_CLASS_DEVICE is not set CONFIG_FB_SIMPLE=y
CONFIG_FB_SM712=y
CONFIG_FIRMWARE_EDID=y
CONFIG_FB_MODE_HELPERS=y
CONFIG_FB_TILEBLITTING=y
CONFIG_BACKLIGHT_CLASS_DEVICE=y CONFIG_BACKLIGHT_CLASS_DEVICE=y
# CONFIG_VGA_CONSOLE is not set
CONFIG_FRAMEBUFFER_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
CONFIG_LOGO=y CONFIG_LOGO=y
...@@ -238,7 +238,6 @@ CONFIG_BTRFS_FS=m ...@@ -238,7 +238,6 @@ CONFIG_BTRFS_FS=m
CONFIG_QUOTA=y CONFIG_QUOTA=y
CONFIG_QFMT_V2=m CONFIG_QFMT_V2=m
CONFIG_AUTOFS_FS=m CONFIG_AUTOFS_FS=m
CONFIG_NETFS_SUPPORT=m
CONFIG_FSCACHE=y CONFIG_FSCACHE=y
CONFIG_CACHEFILES=m CONFIG_CACHEFILES=m
CONFIG_ISO9660_FS=m CONFIG_ISO9660_FS=m
...@@ -247,7 +246,6 @@ CONFIG_ZISOFS=y ...@@ -247,7 +246,6 @@ CONFIG_ZISOFS=y
CONFIG_MSDOS_FS=m CONFIG_MSDOS_FS=m
CONFIG_VFAT_FS=m CONFIG_VFAT_FS=m
CONFIG_NTFS_FS=m CONFIG_NTFS_FS=m
CONFIG_NTFS_RW=y
CONFIG_PROC_KCORE=y CONFIG_PROC_KCORE=y
CONFIG_TMPFS=y CONFIG_TMPFS=y
CONFIG_CRAMFS=m CONFIG_CRAMFS=m
...@@ -299,29 +297,23 @@ CONFIG_NLS_KOI8_R=m ...@@ -299,29 +297,23 @@ CONFIG_NLS_KOI8_R=m
CONFIG_NLS_KOI8_U=m CONFIG_NLS_KOI8_U=m
CONFIG_NLS_UTF8=y CONFIG_NLS_UTF8=y
CONFIG_CRYPTO_CRYPTD=m CONFIG_CRYPTO_CRYPTD=m
CONFIG_CRYPTO_AUTHENC=m
CONFIG_CRYPTO_TEST=m CONFIG_CRYPTO_TEST=m
CONFIG_CRYPTO_LRW=m
CONFIG_CRYPTO_PCBC=m
CONFIG_CRYPTO_XTS=m
CONFIG_CRYPTO_XCBC=m
CONFIG_CRYPTO_MICHAEL_MIC=m
CONFIG_CRYPTO_RMD160=m
CONFIG_CRYPTO_SHA1=m
CONFIG_CRYPTO_WP512=m
CONFIG_CRYPTO_ANUBIS=m
CONFIG_CRYPTO_BLOWFISH=m CONFIG_CRYPTO_BLOWFISH=m
CONFIG_CRYPTO_CAMELLIA=m CONFIG_CRYPTO_CAMELLIA=m
CONFIG_CRYPTO_CAST5=m CONFIG_CRYPTO_CAST5=m
CONFIG_CRYPTO_CAST6=m CONFIG_CRYPTO_CAST6=m
CONFIG_CRYPTO_FCRYPT=m CONFIG_CRYPTO_FCRYPT=m
CONFIG_CRYPTO_KHAZAD=m
CONFIG_CRYPTO_SEED=m
CONFIG_CRYPTO_SERPENT=m CONFIG_CRYPTO_SERPENT=m
CONFIG_CRYPTO_TEA=m
CONFIG_CRYPTO_TWOFISH=m CONFIG_CRYPTO_TWOFISH=m
CONFIG_CRYPTO_LRW=m
CONFIG_CRYPTO_PCBC=m
CONFIG_CRYPTO_XTS=m
CONFIG_CRYPTO_MICHAEL_MIC=m
CONFIG_CRYPTO_RMD160=m
CONFIG_CRYPTO_SHA1=m
CONFIG_CRYPTO_WP512=m
CONFIG_CRYPTO_XCBC=m
CONFIG_CRYPTO_DEFLATE=m CONFIG_CRYPTO_DEFLATE=m
CONFIG_CRYPTO_LZO=m
CONFIG_FONTS=y CONFIG_FONTS=y
CONFIG_FONT_8x8=y CONFIG_FONT_8x8=y
CONFIG_FONT_6x11=y CONFIG_FONT_6x11=y
......
...@@ -186,6 +186,7 @@ static void __exit mips_poly1305_mod_exit(void) ...@@ -186,6 +186,7 @@ static void __exit mips_poly1305_mod_exit(void)
module_init(mips_poly1305_mod_init); module_init(mips_poly1305_mod_init);
module_exit(mips_poly1305_mod_exit); module_exit(mips_poly1305_mod_exit);
MODULE_DESCRIPTION("Poly1305 transform (MIPS accelerated");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");
MODULE_ALIAS_CRYPTO("poly1305"); MODULE_ALIAS_CRYPTO("poly1305");
MODULE_ALIAS_CRYPTO("poly1305-mips"); MODULE_ALIAS_CRYPTO("poly1305-mips");
...@@ -13,3 +13,4 @@ obj-$(CONFIG_LEGACY_BOARD_SEAD3) += board-sead3.o ...@@ -13,3 +13,4 @@ obj-$(CONFIG_LEGACY_BOARD_SEAD3) += board-sead3.o
obj-$(CONFIG_LEGACY_BOARD_OCELOT) += board-ocelot.o obj-$(CONFIG_LEGACY_BOARD_OCELOT) += board-ocelot.o
obj-$(CONFIG_MACH_INGENIC) += board-ingenic.o obj-$(CONFIG_MACH_INGENIC) += board-ingenic.o
obj-$(CONFIG_VIRT_BOARD_RANCHU) += board-ranchu.o obj-$(CONFIG_VIRT_BOARD_RANCHU) += board-ranchu.o
obj-$(CONFIG_MACH_REALTEK_RTL) += board-realtek.o
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (C) 2024 Allied Telesis
*/
#include <linux/errno.h>
#include <linux/libfdt.h>
#include <linux/printk.h>
#include <linux/types.h>
#include <asm/fw/fw.h>
#include <asm/machine.h>
static __init int realtek_add_initrd(void *fdt)
{
int node, err;
u32 start, size;
node = fdt_path_offset(fdt, "/chosen");
if (node < 0) {
pr_err("/chosen node not found\n");
return -ENOENT;
}
start = fw_getenvl("initrd_start");
size = fw_getenvl("initrd_size");
if (start == 0 && size == 0)
return 0;
pr_info("Adding initrd info from environment\n");
err = fdt_setprop_u32(fdt, node, "linux,initrd-start", start);
if (err) {
pr_err("unable to set initrd-start: %d\n", err);
return err;
}
err = fdt_setprop_u32(fdt, node, "linux,initrd-end", start + size);
if (err) {
pr_err("unable to set initrd-end: %d\n", err);
return err;
}
return 0;
}
static const struct mips_fdt_fixup realtek_fdt_fixups[] __initconst = {
{ realtek_add_initrd, "add initrd" },
{},
};
static __init const void *realtek_fixup_fdt(const void *fdt, const void *match_data)
{
static unsigned char fdt_buf[16 << 10] __initdata;
int err;
if (fdt_check_header(fdt))
panic("Corrupt DT");
fw_init_cmdline();
err = apply_mips_fdt_fixups(fdt_buf, sizeof(fdt_buf), fdt, realtek_fdt_fixups);
if (err)
panic("Unable to fixup FDT: %d", err);
return fdt_buf;
}
static const struct of_device_id realtek_of_match[] __initconst = {
{ .compatible = "realtek,rtl9302-soc" },
{}
};
MIPS_MACHINE(realtek) = {
.matches = realtek_of_match,
.fixup_fdt = realtek_fixup_fdt,
};
...@@ -81,6 +81,7 @@ extern char bmips_smp_movevec[]; ...@@ -81,6 +81,7 @@ extern char bmips_smp_movevec[];
extern char bmips_smp_int_vec[]; extern char bmips_smp_int_vec[];
extern char bmips_smp_int_vec_end[]; extern char bmips_smp_int_vec_end[];
extern void __iomem *bmips_cbr_addr;
extern int bmips_smp_enabled; extern int bmips_smp_enabled;
extern int bmips_cpu_offset; extern int bmips_cpu_offset;
extern cpumask_t bmips_booted_mask; extern cpumask_t bmips_booted_mask;
......
...@@ -129,6 +129,18 @@ static inline int __own_fpu(void) ...@@ -129,6 +129,18 @@ static inline int __own_fpu(void)
if (ret) if (ret)
return ret; return ret;
if (current->thread.fpu.fcr31 & FPU_CSR_NAN2008) {
if (!cpu_has_nan_2008) {
ret = SIGFPE;
goto failed;
}
} else {
if (!cpu_has_nan_legacy) {
ret = SIGFPE;
goto failed;
}
}
KSTK_STATUS(current) |= ST0_CU1; KSTK_STATUS(current) |= ST0_CU1;
if (mode == FPU_64BIT || mode == FPU_HYBRID) if (mode == FPU_64BIT || mode == FPU_HYBRID)
KSTK_STATUS(current) |= ST0_FR; KSTK_STATUS(current) |= ST0_FR;
...@@ -137,6 +149,9 @@ static inline int __own_fpu(void) ...@@ -137,6 +149,9 @@ static inline int __own_fpu(void)
set_thread_flag(TIF_USEDFPU); set_thread_flag(TIF_USEDFPU);
return 0; return 0;
failed:
__disable_fpu();
return ret;
} }
static inline int own_fpu_inatomic(int restore) static inline int own_fpu_inatomic(int restore)
......
...@@ -42,12 +42,14 @@ enum loongson_cpu_type { ...@@ -42,12 +42,14 @@ enum loongson_cpu_type {
Legacy_1B = 0x5, Legacy_1B = 0x5,
Legacy_2G = 0x6, Legacy_2G = 0x6,
Legacy_2H = 0x7, Legacy_2H = 0x7,
Legacy_2K = 0x8,
Loongson_1A = 0x100, Loongson_1A = 0x100,
Loongson_1B = 0x101, Loongson_1B = 0x101,
Loongson_2E = 0x200, Loongson_2E = 0x200,
Loongson_2F = 0x201, Loongson_2F = 0x201,
Loongson_2G = 0x202, Loongson_2G = 0x202,
Loongson_2H = 0x203, Loongson_2H = 0x203,
Loongson_2K = 0x204,
Loongson_3A = 0x300, Loongson_3A = 0x300,
Loongson_3B = 0x301 Loongson_3B = 0x301
}; };
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#define __MIPS_ASM_MIPS_CPS_H__ #define __MIPS_ASM_MIPS_CPS_H__
#include <linux/bitfield.h> #include <linux/bitfield.h>
#include <linux/cpumask.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/types.h> #include <linux/types.h>
...@@ -228,4 +229,42 @@ static inline unsigned int mips_cps_numvps(unsigned int cluster, unsigned int co ...@@ -228,4 +229,42 @@ static inline unsigned int mips_cps_numvps(unsigned int cluster, unsigned int co
return FIELD_GET(CM_GCR_Cx_CONFIG_PVPE, cfg + 1); return FIELD_GET(CM_GCR_Cx_CONFIG_PVPE, cfg + 1);
} }
/**
* mips_cps_multicluster_cpus() - Detect whether CPUs are in multiple clusters
*
* Determine whether the system includes CPUs in multiple clusters - ie.
* whether we can treat the system as single or multi-cluster as far as CPUs
* are concerned. Note that this is slightly different to simply checking
* whether multiple clusters are present - it is possible for there to be
* clusters which contain no CPUs, which this function will effectively ignore.
*
* Returns true if CPUs are spread across multiple clusters, else false.
*/
static inline bool mips_cps_multicluster_cpus(void)
{
unsigned int first_cl, last_cl;
/*
* CPUs are numbered sequentially by cluster - ie. CPUs 0..X will be in
* cluster 0, CPUs X+1..Y in cluster 1, CPUs Y+1..Z in cluster 2 etc.
*
* Thus we can detect multiple clusters trivially by checking whether
* the first & last CPUs belong to the same cluster.
*/
first_cl = cpu_cluster(&boot_cpu_data);
last_cl = cpu_cluster(&cpu_data[nr_cpu_ids - 1]);
return first_cl != last_cl;
}
/**
* mips_cps_first_online_in_cluster() - Detect if CPU is first online in cluster
*
* Determine whether the local CPU is the first to be brought online in its
* cluster - that is, whether there are any other online CPUs in the local
* cluster.
*
* Returns true if this CPU is first online, else false.
*/
extern unsigned int mips_cps_first_online_in_cluster(void);
#endif /* __MIPS_ASM_MIPS_CPS_H__ */ #endif /* __MIPS_ASM_MIPS_CPS_H__ */
...@@ -28,11 +28,13 @@ extern void __iomem *mips_gic_base; ...@@ -28,11 +28,13 @@ extern void __iomem *mips_gic_base;
/* For read-only shared registers */ /* For read-only shared registers */
#define GIC_ACCESSOR_RO(sz, off, name) \ #define GIC_ACCESSOR_RO(sz, off, name) \
CPS_ACCESSOR_RO(gic, sz, MIPS_GIC_SHARED_OFS + off, name) CPS_ACCESSOR_RO(gic, sz, MIPS_GIC_SHARED_OFS + off, name) \
CPS_ACCESSOR_RO(gic, sz, MIPS_GIC_REDIR_OFS + off, redir_##name)
/* For read-write shared registers */ /* For read-write shared registers */
#define GIC_ACCESSOR_RW(sz, off, name) \ #define GIC_ACCESSOR_RW(sz, off, name) \
CPS_ACCESSOR_RW(gic, sz, MIPS_GIC_SHARED_OFS + off, name) CPS_ACCESSOR_RW(gic, sz, MIPS_GIC_SHARED_OFS + off, name) \
CPS_ACCESSOR_RW(gic, sz, MIPS_GIC_REDIR_OFS + off, redir_##name)
/* For read-only local registers */ /* For read-only local registers */
#define GIC_VX_ACCESSOR_RO(sz, off, name) \ #define GIC_VX_ACCESSOR_RO(sz, off, name) \
...@@ -45,7 +47,7 @@ extern void __iomem *mips_gic_base; ...@@ -45,7 +47,7 @@ extern void __iomem *mips_gic_base;
CPS_ACCESSOR_RW(gic, sz, MIPS_GIC_REDIR_OFS + off, vo_##name) CPS_ACCESSOR_RW(gic, sz, MIPS_GIC_REDIR_OFS + off, vo_##name)
/* For read-only shared per-interrupt registers */ /* For read-only shared per-interrupt registers */
#define GIC_ACCESSOR_RO_INTR_REG(sz, off, stride, name) \ #define _GIC_ACCESSOR_RO_INTR_REG(sz, off, stride, name) \
static inline void __iomem *addr_gic_##name(unsigned int intr) \ static inline void __iomem *addr_gic_##name(unsigned int intr) \
{ \ { \
return mips_gic_base + (off) + (intr * (stride)); \ return mips_gic_base + (off) + (intr * (stride)); \
...@@ -58,8 +60,8 @@ static inline unsigned int read_gic_##name(unsigned int intr) \ ...@@ -58,8 +60,8 @@ static inline unsigned int read_gic_##name(unsigned int intr) \
} }
/* For read-write shared per-interrupt registers */ /* For read-write shared per-interrupt registers */
#define GIC_ACCESSOR_RW_INTR_REG(sz, off, stride, name) \ #define _GIC_ACCESSOR_RW_INTR_REG(sz, off, stride, name) \
GIC_ACCESSOR_RO_INTR_REG(sz, off, stride, name) \ _GIC_ACCESSOR_RO_INTR_REG(sz, off, stride, name) \
\ \
static inline void write_gic_##name(unsigned int intr, \ static inline void write_gic_##name(unsigned int intr, \
unsigned int val) \ unsigned int val) \
...@@ -68,22 +70,30 @@ static inline void write_gic_##name(unsigned int intr, \ ...@@ -68,22 +70,30 @@ static inline void write_gic_##name(unsigned int intr, \
__raw_writel(val, addr_gic_##name(intr)); \ __raw_writel(val, addr_gic_##name(intr)); \
} }
#define GIC_ACCESSOR_RO_INTR_REG(sz, off, stride, name) \
_GIC_ACCESSOR_RO_INTR_REG(sz, off, stride, name) \
_GIC_ACCESSOR_RO_INTR_REG(sz, MIPS_GIC_REDIR_OFS + off, stride, redir_##name)
#define GIC_ACCESSOR_RW_INTR_REG(sz, off, stride, name) \
_GIC_ACCESSOR_RW_INTR_REG(sz, off, stride, name) \
_GIC_ACCESSOR_RW_INTR_REG(sz, MIPS_GIC_REDIR_OFS + off, stride, redir_##name)
/* For read-only local per-interrupt registers */ /* For read-only local per-interrupt registers */
#define GIC_VX_ACCESSOR_RO_INTR_REG(sz, off, stride, name) \ #define GIC_VX_ACCESSOR_RO_INTR_REG(sz, off, stride, name) \
GIC_ACCESSOR_RO_INTR_REG(sz, MIPS_GIC_LOCAL_OFS + off, \ _GIC_ACCESSOR_RO_INTR_REG(sz, MIPS_GIC_LOCAL_OFS + off, \
stride, vl_##name) \ stride, vl_##name) \
GIC_ACCESSOR_RO_INTR_REG(sz, MIPS_GIC_REDIR_OFS + off, \ _GIC_ACCESSOR_RO_INTR_REG(sz, MIPS_GIC_REDIR_OFS + off, \
stride, vo_##name) stride, vo_##name)
/* For read-write local per-interrupt registers */ /* For read-write local per-interrupt registers */
#define GIC_VX_ACCESSOR_RW_INTR_REG(sz, off, stride, name) \ #define GIC_VX_ACCESSOR_RW_INTR_REG(sz, off, stride, name) \
GIC_ACCESSOR_RW_INTR_REG(sz, MIPS_GIC_LOCAL_OFS + off, \ _GIC_ACCESSOR_RW_INTR_REG(sz, MIPS_GIC_LOCAL_OFS + off, \
stride, vl_##name) \ stride, vl_##name) \
GIC_ACCESSOR_RW_INTR_REG(sz, MIPS_GIC_REDIR_OFS + off, \ _GIC_ACCESSOR_RW_INTR_REG(sz, MIPS_GIC_REDIR_OFS + off, \
stride, vo_##name) stride, vo_##name)
/* For read-only shared bit-per-interrupt registers */ /* For read-only shared bit-per-interrupt registers */
#define GIC_ACCESSOR_RO_INTR_BIT(off, name) \ #define _GIC_ACCESSOR_RO_INTR_BIT(off, name) \
static inline void __iomem *addr_gic_##name(void) \ static inline void __iomem *addr_gic_##name(void) \
{ \ { \
return mips_gic_base + (off); \ return mips_gic_base + (off); \
...@@ -106,8 +116,8 @@ static inline unsigned int read_gic_##name(unsigned int intr) \ ...@@ -106,8 +116,8 @@ static inline unsigned int read_gic_##name(unsigned int intr) \
} }
/* For read-write shared bit-per-interrupt registers */ /* For read-write shared bit-per-interrupt registers */
#define GIC_ACCESSOR_RW_INTR_BIT(off, name) \ #define _GIC_ACCESSOR_RW_INTR_BIT(off, name) \
GIC_ACCESSOR_RO_INTR_BIT(off, name) \ _GIC_ACCESSOR_RO_INTR_BIT(off, name) \
\ \
static inline void write_gic_##name(unsigned int intr) \ static inline void write_gic_##name(unsigned int intr) \
{ \ { \
...@@ -146,6 +156,14 @@ static inline void change_gic_##name(unsigned int intr, \ ...@@ -146,6 +156,14 @@ static inline void change_gic_##name(unsigned int intr, \
} \ } \
} }
#define GIC_ACCESSOR_RO_INTR_BIT(off, name) \
_GIC_ACCESSOR_RO_INTR_BIT(off, name) \
_GIC_ACCESSOR_RO_INTR_BIT(MIPS_GIC_REDIR_OFS + off, redir_##name)
#define GIC_ACCESSOR_RW_INTR_BIT(off, name) \
_GIC_ACCESSOR_RW_INTR_BIT(off, name) \
_GIC_ACCESSOR_RW_INTR_BIT(MIPS_GIC_REDIR_OFS + off, redir_##name)
/* For read-only local bit-per-interrupt registers */ /* For read-only local bit-per-interrupt registers */
#define GIC_VX_ACCESSOR_RO_INTR_BIT(sz, off, name) \ #define GIC_VX_ACCESSOR_RO_INTR_BIT(sz, off, name) \
GIC_ACCESSOR_RO_INTR_BIT(sz, MIPS_GIC_LOCAL_OFS + off, \ GIC_ACCESSOR_RO_INTR_BIT(sz, MIPS_GIC_LOCAL_OFS + off, \
...@@ -155,10 +173,10 @@ static inline void change_gic_##name(unsigned int intr, \ ...@@ -155,10 +173,10 @@ static inline void change_gic_##name(unsigned int intr, \
/* For read-write local bit-per-interrupt registers */ /* For read-write local bit-per-interrupt registers */
#define GIC_VX_ACCESSOR_RW_INTR_BIT(sz, off, name) \ #define GIC_VX_ACCESSOR_RW_INTR_BIT(sz, off, name) \
GIC_ACCESSOR_RW_INTR_BIT(sz, MIPS_GIC_LOCAL_OFS + off, \ _GIC_ACCESSOR_RW_INTR_BIT(sz, MIPS_GIC_LOCAL_OFS + off, \
vl_##name) \ vl_##name) \
GIC_ACCESSOR_RW_INTR_BIT(sz, MIPS_GIC_REDIR_OFS + off, \ _GIC_ACCESSOR_RW_INTR_BIT(sz, MIPS_GIC_REDIR_OFS + off, \
vo_##name) vo_##name)
/* GIC_SH_CONFIG - Information about the GIC configuration */ /* GIC_SH_CONFIG - Information about the GIC configuration */
GIC_ACCESSOR_RW(32, 0x000, config) GIC_ACCESSOR_RW(32, 0x000, config)
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
/* Save CPU state to stack for suspend to RAM */ /* Save CPU state to stack for suspend to RAM */
.macro SUSPEND_SAVE_REGS .macro SUSPEND_SAVE_REGS
subu sp, PT_SIZE PTR_SUBU sp, PT_SIZE
/* Call preserved GPRs */ /* Call preserved GPRs */
LONG_S $16, PT_R16(sp) LONG_S $16, PT_R16(sp)
LONG_S $17, PT_R17(sp) LONG_S $17, PT_R17(sp)
...@@ -56,13 +56,13 @@ ...@@ -56,13 +56,13 @@
LONG_L $31, PT_R31(sp) LONG_L $31, PT_R31(sp)
/* Pop and return */ /* Pop and return */
jr ra jr ra
addiu sp, PT_SIZE PTR_ADDIU sp, PT_SIZE
.set pop .set pop
.endm .endm
/* Get address of static suspend state into t1 */ /* Get address of static suspend state into t1 */
.macro LA_STATIC_SUSPEND .macro LA_STATIC_SUSPEND
la t1, mips_static_suspend_state PTR_LA t1, mips_static_suspend_state
.endm .endm
/* Save important CPU state for early restoration to global data */ /* Save important CPU state for early restoration to global data */
...@@ -72,11 +72,11 @@ ...@@ -72,11 +72,11 @@
* Segment configuration is saved in global data where it can be easily * Segment configuration is saved in global data where it can be easily
* reloaded without depending on the segment configuration. * reloaded without depending on the segment configuration.
*/ */
mfc0 k0, CP0_PAGEMASK, 2 /* SegCtl0 */ mfc0 k0, CP0_SEGCTL0
LONG_S k0, SSS_SEGCTL0(t1) LONG_S k0, SSS_SEGCTL0(t1)
mfc0 k0, CP0_PAGEMASK, 3 /* SegCtl1 */ mfc0 k0, CP0_SEGCTL1
LONG_S k0, SSS_SEGCTL1(t1) LONG_S k0, SSS_SEGCTL1(t1)
mfc0 k0, CP0_PAGEMASK, 4 /* SegCtl2 */ mfc0 k0, CP0_SEGCTL2
LONG_S k0, SSS_SEGCTL2(t1) LONG_S k0, SSS_SEGCTL2(t1)
#endif #endif
/* save stack pointer (pointing to GPRs) */ /* save stack pointer (pointing to GPRs) */
...@@ -92,11 +92,11 @@ ...@@ -92,11 +92,11 @@
* segments. * segments.
*/ */
LONG_L k0, SSS_SEGCTL0(t1) LONG_L k0, SSS_SEGCTL0(t1)
mtc0 k0, CP0_PAGEMASK, 2 /* SegCtl0 */ mtc0 k0, CP0_SEGCTL0
LONG_L k0, SSS_SEGCTL1(t1) LONG_L k0, SSS_SEGCTL1(t1)
mtc0 k0, CP0_PAGEMASK, 3 /* SegCtl1 */ mtc0 k0, CP0_SEGCTL1
LONG_L k0, SSS_SEGCTL2(t1) LONG_L k0, SSS_SEGCTL2(t1)
mtc0 k0, CP0_PAGEMASK, 4 /* SegCtl2 */ mtc0 k0, CP0_SEGCTL2
tlbw_use_hazard tlbw_use_hazard
#endif #endif
/* restore stack pointer (pointing to GPRs) */ /* restore stack pointer (pointing to GPRs) */
...@@ -105,10 +105,10 @@ ...@@ -105,10 +105,10 @@
/* flush caches to make sure context has reached memory */ /* flush caches to make sure context has reached memory */
.macro SUSPEND_CACHE_FLUSH .macro SUSPEND_CACHE_FLUSH
.extern __wback_cache_all .extern __flush_cache_all
.set push .set push
.set noreorder .set noreorder
la t1, __wback_cache_all PTR_LA t1, __flush_cache_all
LONG_L t0, 0(t1) LONG_L t0, 0(t1)
jalr t0 jalr t0
nop nop
......
...@@ -12,15 +12,10 @@ ...@@ -12,15 +12,10 @@
#ifdef CONFIG_SYNC_R4K #ifdef CONFIG_SYNC_R4K
extern void synchronise_count_master(int cpu);
extern void synchronise_count_slave(int cpu); extern void synchronise_count_slave(int cpu);
#else #else
static inline void synchronise_count_master(int cpu)
{
}
static inline void synchronise_count_slave(int cpu) static inline void synchronise_count_slave(int cpu)
{ {
} }
......
...@@ -76,5 +76,8 @@ ...@@ -76,5 +76,8 @@
extern unsigned short ip22_eeprom_read(unsigned int *ctrl, int reg); extern unsigned short ip22_eeprom_read(unsigned int *ctrl, int reg);
extern unsigned short ip22_nvram_read(int reg); extern unsigned short ip22_nvram_read(int reg);
extern void ip22_be_interrupt(int irq);
extern void ip22_be_init(void) __init;
extern void indy_8254timer_irq(void);
#endif #endif
...@@ -21,7 +21,9 @@ static struct clocksource clocksource_mips = { ...@@ -21,7 +21,9 @@ static struct clocksource clocksource_mips = {
.name = "MIPS", .name = "MIPS",
.read = c0_hpt_read, .read = c0_hpt_read,
.mask = CLOCKSOURCE_MASK(32), .mask = CLOCKSOURCE_MASK(32),
.flags = CLOCK_SOURCE_IS_CONTINUOUS, .flags = CLOCK_SOURCE_IS_CONTINUOUS |
CLOCK_SOURCE_MUST_VERIFY |
CLOCK_SOURCE_VERIFY_PERCPU,
}; };
static u64 __maybe_unused notrace r4k_read_sched_clock(void) static u64 __maybe_unused notrace r4k_read_sched_clock(void)
...@@ -66,6 +68,18 @@ static bool rdhwr_count_usable(void) ...@@ -66,6 +68,18 @@ static bool rdhwr_count_usable(void)
return false; return false;
} }
static inline __init bool count_can_be_sched_clock(void)
{
if (IS_ENABLED(CONFIG_CPU_FREQ))
return false;
if (num_possible_cpus() > 1 &&
!IS_ENABLED(CONFIG_HAVE_UNSTABLE_SCHED_CLOCK))
return false;
return true;
}
#ifdef CONFIG_CPU_FREQ #ifdef CONFIG_CPU_FREQ
static bool __read_mostly r4k_clock_unstable; static bool __read_mostly r4k_clock_unstable;
...@@ -111,7 +125,8 @@ int __init init_r4k_clocksource(void) ...@@ -111,7 +125,8 @@ int __init init_r4k_clocksource(void)
return -ENXIO; return -ENXIO;
/* Calculate a somewhat reasonable rating value */ /* Calculate a somewhat reasonable rating value */
clocksource_mips.rating = 200 + mips_hpt_frequency / 10000000; clocksource_mips.rating = 200;
clocksource_mips.rating += clamp(mips_hpt_frequency / 10000000, 0, 99);
/* /*
* R2 onwards makes the count accessible to user mode so it can be used * R2 onwards makes the count accessible to user mode so it can be used
...@@ -122,9 +137,8 @@ int __init init_r4k_clocksource(void) ...@@ -122,9 +137,8 @@ int __init init_r4k_clocksource(void)
clocksource_register_hz(&clocksource_mips, mips_hpt_frequency); clocksource_register_hz(&clocksource_mips, mips_hpt_frequency);
#ifndef CONFIG_CPU_FREQ if (count_can_be_sched_clock())
sched_clock_register(r4k_read_sched_clock, 32, mips_hpt_frequency); sched_clock_register(r4k_read_sched_clock, 32, mips_hpt_frequency);
#endif
return 0; return 0;
} }
...@@ -318,6 +318,10 @@ void mips_set_personality_nan(struct arch_elf_state *state) ...@@ -318,6 +318,10 @@ void mips_set_personality_nan(struct arch_elf_state *state)
t->thread.fpu.fcr31 = c->fpu_csr31; t->thread.fpu.fcr31 = c->fpu_csr31;
switch (state->nan_2008) { switch (state->nan_2008) {
case 0: case 0:
if (!(c->fpu_msk31 & FPU_CSR_NAN2008))
t->thread.fpu.fcr31 &= ~FPU_CSR_NAN2008;
if (!(c->fpu_msk31 & FPU_CSR_ABS2008))
t->thread.fpu.fcr31 &= ~FPU_CSR_ABS2008;
break; break;
case 1: case 1:
if (!(c->fpu_msk31 & FPU_CSR_NAN2008)) if (!(c->fpu_msk31 & FPU_CSR_NAN2008))
......
...@@ -144,7 +144,7 @@ static void cpu_set_fpu_2008(struct cpuinfo_mips *c) ...@@ -144,7 +144,7 @@ static void cpu_set_fpu_2008(struct cpuinfo_mips *c)
* IEEE 754 conformance mode to use. Affects the NaN encoding and the * IEEE 754 conformance mode to use. Affects the NaN encoding and the
* ABS.fmt/NEG.fmt execution mode. * ABS.fmt/NEG.fmt execution mode.
*/ */
static enum { STRICT, LEGACY, STD2008, RELAXED } ieee754 = STRICT; static enum { STRICT, EMULATED, LEGACY, STD2008, RELAXED } ieee754 = STRICT;
/* /*
* Set the IEEE 754 NaN encodings and the ABS.fmt/NEG.fmt execution modes * Set the IEEE 754 NaN encodings and the ABS.fmt/NEG.fmt execution modes
...@@ -160,6 +160,7 @@ static void cpu_set_nofpu_2008(struct cpuinfo_mips *c) ...@@ -160,6 +160,7 @@ static void cpu_set_nofpu_2008(struct cpuinfo_mips *c)
switch (ieee754) { switch (ieee754) {
case STRICT: case STRICT:
case EMULATED:
if (c->isa_level & (MIPS_CPU_ISA_M32R1 | MIPS_CPU_ISA_M64R1 | if (c->isa_level & (MIPS_CPU_ISA_M32R1 | MIPS_CPU_ISA_M64R1 |
MIPS_CPU_ISA_M32R2 | MIPS_CPU_ISA_M64R2 | MIPS_CPU_ISA_M32R2 | MIPS_CPU_ISA_M64R2 |
MIPS_CPU_ISA_M32R5 | MIPS_CPU_ISA_M64R5 | MIPS_CPU_ISA_M32R5 | MIPS_CPU_ISA_M64R5 |
...@@ -204,6 +205,10 @@ static void cpu_set_nan_2008(struct cpuinfo_mips *c) ...@@ -204,6 +205,10 @@ static void cpu_set_nan_2008(struct cpuinfo_mips *c)
mips_use_nan_legacy = !cpu_has_nan_2008; mips_use_nan_legacy = !cpu_has_nan_2008;
mips_use_nan_2008 = !!cpu_has_nan_2008; mips_use_nan_2008 = !!cpu_has_nan_2008;
break; break;
case EMULATED:
/* Pretend ABS2008/NAN2008 options are dynamic */
c->fpu_msk31 &= ~(FPU_CSR_NAN2008 | FPU_CSR_ABS2008);
fallthrough;
case RELAXED: case RELAXED:
mips_use_nan_legacy = true; mips_use_nan_legacy = true;
mips_use_nan_2008 = true; mips_use_nan_2008 = true;
...@@ -226,6 +231,8 @@ static int __init ieee754_setup(char *s) ...@@ -226,6 +231,8 @@ static int __init ieee754_setup(char *s)
return -1; return -1;
else if (!strcmp(s, "strict")) else if (!strcmp(s, "strict"))
ieee754 = STRICT; ieee754 = STRICT;
else if (!strcmp(s, "emulated"))
ieee754 = EMULATED;
else if (!strcmp(s, "legacy")) else if (!strcmp(s, "legacy"))
ieee754 = LEGACY; ieee754 = LEGACY;
else if (!strcmp(s, "2008")) else if (!strcmp(s, "2008"))
......
...@@ -512,3 +512,40 @@ void mips_cm_error_report(void) ...@@ -512,3 +512,40 @@ void mips_cm_error_report(void)
/* reprime cause register */ /* reprime cause register */
write_gcr_error_cause(cm_error); write_gcr_error_cause(cm_error);
} }
unsigned int mips_cps_first_online_in_cluster(void)
{
unsigned int local_cl;
int i;
local_cl = cpu_cluster(&current_cpu_data);
/*
* We rely upon knowledge that CPUs are numbered sequentially by
* cluster - ie. CPUs 0..X will be in cluster 0, CPUs X+1..Y in cluster
* 1, CPUs Y+1..Z in cluster 2 etc. This means that CPUs in the same
* cluster will immediately precede or follow one another.
*
* First we scan backwards, until we find an online CPU in the cluster
* or we move on to another cluster.
*/
for (i = smp_processor_id() - 1; i >= 0; i--) {
if (cpu_cluster(&cpu_data[i]) != local_cl)
break;
if (!cpu_online(i))
continue;
return false;
}
/* Then do the same for higher numbered CPUs */
for (i = smp_processor_id() + 1; i < nr_cpu_ids; i++) {
if (cpu_cluster(&cpu_data[i]) != local_cl)
break;
if (!cpu_online(i))
continue;
return false;
}
/* We found no online CPUs in the local cluster */
return true;
}
...@@ -518,7 +518,7 @@ static void bmips_set_reset_vec(int cpu, u32 val) ...@@ -518,7 +518,7 @@ static void bmips_set_reset_vec(int cpu, u32 val)
info.val = val; info.val = val;
bmips_set_reset_vec_remote(&info); bmips_set_reset_vec_remote(&info);
} else { } else {
void __iomem *cbr = BMIPS_GET_CBR(); void __iomem *cbr = bmips_cbr_addr;
if (cpu == 0) if (cpu == 0)
__raw_writel(val, cbr + BMIPS_RELO_VECTOR_CONTROL_0); __raw_writel(val, cbr + BMIPS_RELO_VECTOR_CONTROL_0);
...@@ -591,7 +591,8 @@ asmlinkage void __weak plat_wired_tlb_setup(void) ...@@ -591,7 +591,8 @@ asmlinkage void __weak plat_wired_tlb_setup(void)
void bmips_cpu_setup(void) void bmips_cpu_setup(void)
{ {
void __iomem __maybe_unused *cbr = BMIPS_GET_CBR(); void __iomem __maybe_unused *cbr = bmips_cbr_addr;
u32 __maybe_unused rac_addr;
u32 __maybe_unused cfg; u32 __maybe_unused cfg;
switch (current_cpu_type()) { switch (current_cpu_type()) {
...@@ -620,6 +621,23 @@ void bmips_cpu_setup(void) ...@@ -620,6 +621,23 @@ void bmips_cpu_setup(void)
__raw_readl(cbr + BMIPS_RAC_ADDRESS_RANGE); __raw_readl(cbr + BMIPS_RAC_ADDRESS_RANGE);
break; break;
case CPU_BMIPS4350:
rac_addr = BMIPS_RAC_CONFIG_1;
if (!(read_c0_brcm_cmt_local() & (1 << 31)))
rac_addr = BMIPS_RAC_CONFIG;
/* Enable data RAC */
cfg = __raw_readl(cbr + rac_addr);
__raw_writel(cfg | 0xf, cbr + rac_addr);
__raw_readl(cbr + rac_addr);
/* Flush stale data out of the readahead cache */
cfg = __raw_readl(cbr + BMIPS_RAC_CONFIG);
__raw_writel(cfg | 0x100, cbr + BMIPS_RAC_CONFIG);
__raw_readl(cbr + BMIPS_RAC_CONFIG);
break;
case CPU_BMIPS4380: case CPU_BMIPS4380:
/* CBG workaround for early BMIPS4380 CPUs */ /* CBG workaround for early BMIPS4380 CPUs */
switch (read_c0_prid()) { switch (read_c0_prid()) {
......
...@@ -462,8 +462,6 @@ int __cpu_up(unsigned int cpu, struct task_struct *tidle) ...@@ -462,8 +462,6 @@ int __cpu_up(unsigned int cpu, struct task_struct *tidle)
return -EIO; return -EIO;
} }
synchronise_count_master(cpu);
/* Wait for CPU to finish startup & mark itself online before return */ /* Wait for CPU to finish startup & mark itself online before return */
wait_for_completion(&cpu_running); wait_for_completion(&cpu_running);
return 0; return 0;
......
...@@ -2,121 +2,244 @@ ...@@ -2,121 +2,244 @@
/* /*
* Count register synchronisation. * Count register synchronisation.
* *
* All CPUs will have their count registers synchronised to the CPU0 next time * Derived from arch/x86/kernel/tsc_sync.c
* value. This can cause a small timewarp for CPU0. All other CPU's should * Copyright (C) 2006, Red Hat, Inc., Ingo Molnar
* not have done anything significant (but they may have had interrupts
* enabled briefly - prom_smp_finish() should not be responsible for enabling
* interrupts...)
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/irqflags.h> #include <linux/irqflags.h>
#include <linux/cpumask.h> #include <linux/cpumask.h>
#include <linux/atomic.h>
#include <linux/nmi.h>
#include <linux/smp.h>
#include <linux/spinlock.h>
#include <asm/r4k-timer.h> #include <asm/r4k-timer.h>
#include <linux/atomic.h>
#include <asm/barrier.h>
#include <asm/mipsregs.h> #include <asm/mipsregs.h>
#include <asm/time.h>
static unsigned int initcount = 0; #define COUNTON 100
static atomic_t count_count_start = ATOMIC_INIT(0); #define NR_LOOPS 3
static atomic_t count_count_stop = ATOMIC_INIT(0); #define LOOP_TIMEOUT 20
#define COUNTON 100
#define NR_LOOPS 3
void synchronise_count_master(int cpu)
{
int i;
unsigned long flags;
pr_info("Synchronize counters for CPU %u: ", cpu);
local_irq_save(flags); /*
* Entry/exit counters that make sure that both CPUs
* run the measurement code at once:
*/
static atomic_t start_count;
static atomic_t stop_count;
static atomic_t test_runs;
/* /*
* We loop a few times to get a primed instruction cache, * We use a raw spinlock in this exceptional case, because
* then the last pass is more or less synchronised and * we want to have the fastest, inlined, non-debug version
* the master and slaves each set their cycle counters to a known * of a critical section, to be able to prove counter time-warps:
* value all at once. This reduces the chance of having random offsets */
* between the processors, and guarantees that the maximum static arch_spinlock_t sync_lock = __ARCH_SPIN_LOCK_UNLOCKED;
* delay between the cycle counters is never bigger than
* the latency of information-passing (cachelines) between
* two CPUs.
*/
for (i = 0; i < NR_LOOPS; i++) { static uint32_t last_counter;
/* slaves loop on '!= 2' */ static uint32_t max_warp;
while (atomic_read(&count_count_start) != 1) static int nr_warps;
mb(); static int random_warps;
atomic_set(&count_count_stop, 0);
smp_wmb();
/* Let the slave writes its count register */ /*
atomic_inc(&count_count_start); * Counter warp measurement loop running on both CPUs.
*/
static uint32_t check_counter_warp(void)
{
uint32_t start, now, prev, end, cur_max_warp = 0;
int i, cur_warps = 0;
/* Count will be initialised to current timer */ start = read_c0_count();
if (i == 1) end = start + (uint32_t) mips_hpt_frequency / 1000 * LOOP_TIMEOUT;
initcount = read_c0_count();
for (i = 0; ; i++) {
/* /*
* Everyone initialises count in the last loop: * We take the global lock, measure counter, save the
* previous counter that was measured (possibly on
* another CPU) and update the previous counter timestamp.
*/ */
if (i == NR_LOOPS-1) arch_spin_lock(&sync_lock);
write_c0_count(initcount); prev = last_counter;
now = read_c0_count();
last_counter = now;
arch_spin_unlock(&sync_lock);
/* /*
* Wait for slave to leave the synchronization point: * Be nice every now and then (and also check whether
* measurement is done [we also insert a 10 million
* loops safety exit, so we dont lock up in case the
* counter is totally broken]):
*/ */
while (atomic_read(&count_count_stop) != 1) if (unlikely(!(i & 7))) {
mb(); if (now > end || i > 10000000)
atomic_set(&count_count_start, 0); break;
smp_wmb(); cpu_relax();
atomic_inc(&count_count_stop); touch_nmi_watchdog();
}
/*
* Outside the critical section we can now see whether
* we saw a time-warp of the counter going backwards:
*/
if (unlikely(prev > now)) {
arch_spin_lock(&sync_lock);
max_warp = max(max_warp, prev - now);
cur_max_warp = max_warp;
/*
* Check whether this bounces back and forth. Only
* one CPU should observe time going backwards.
*/
if (cur_warps != nr_warps)
random_warps++;
nr_warps++;
cur_warps = nr_warps;
arch_spin_unlock(&sync_lock);
}
}
WARN(!(now-start),
"Warning: zero counter calibration delta: %d [max: %d]\n",
now-start, end-start);
return cur_max_warp;
}
/*
* The freshly booted CPU initiates this via an async SMP function call.
*/
static void check_counter_sync_source(void *__cpu)
{
unsigned int cpu = (unsigned long)__cpu;
int cpus = 2;
atomic_set(&test_runs, NR_LOOPS);
retry:
/* Wait for the target to start. */
while (atomic_read(&start_count) != cpus - 1)
cpu_relax();
/*
* Trigger the target to continue into the measurement too:
*/
atomic_inc(&start_count);
check_counter_warp();
while (atomic_read(&stop_count) != cpus-1)
cpu_relax();
/*
* If the test was successful set the number of runs to zero and
* stop. If not, decrement the number of runs an check if we can
* retry. In case of random warps no retry is attempted.
*/
if (!nr_warps) {
atomic_set(&test_runs, 0);
pr_info("Counter synchronization [CPU#%d -> CPU#%u]: passed\n",
smp_processor_id(), cpu);
} else if (atomic_dec_and_test(&test_runs) || random_warps) {
/* Force it to 0 if random warps brought us here */
atomic_set(&test_runs, 0);
pr_info("Counter synchronization [CPU#%d -> CPU#%u]:\n",
smp_processor_id(), cpu);
pr_info("Measured %d cycles counter warp between CPUs", max_warp);
if (random_warps)
pr_warn("Counter warped randomly between CPUs\n");
} }
/* Arrange for an interrupt in a short while */
write_c0_compare(read_c0_count() + COUNTON);
local_irq_restore(flags); /*
* Reset it - just in case we boot another CPU later:
*/
atomic_set(&start_count, 0);
random_warps = 0;
nr_warps = 0;
max_warp = 0;
last_counter = 0;
/*
* Let the target continue with the bootup:
*/
atomic_inc(&stop_count);
/* /*
* i386 code reported the skew here, but the * Retry, if there is a chance to do so.
* count registers were almost certainly out of sync
* so no point in alarming people
*/ */
pr_cont("done.\n"); if (atomic_read(&test_runs) > 0)
goto retry;
} }
/*
* Freshly booted CPUs call into this:
*/
void synchronise_count_slave(int cpu) void synchronise_count_slave(int cpu)
{ {
int i; uint32_t cur_max_warp, gbl_max_warp, count;
unsigned long flags; int cpus = 2;
local_irq_save(flags); if (!cpu_has_counter || !mips_hpt_frequency)
return;
/* Kick the control CPU into the counter synchronization function */
smp_call_function_single(cpumask_first(cpu_online_mask),
check_counter_sync_source,
(unsigned long *)(unsigned long)cpu, 0);
retry:
/* /*
* Not every cpu is online at the time this gets called, * Register this CPU's participation and wait for the
* so we first wait for the master to say everyone is ready * source CPU to start the measurement:
*/ */
atomic_inc(&start_count);
while (atomic_read(&start_count) != cpus)
cpu_relax();
for (i = 0; i < NR_LOOPS; i++) { cur_max_warp = check_counter_warp();
atomic_inc(&count_count_start);
while (atomic_read(&count_count_start) != 2)
mb();
/* /*
* Everyone initialises count in the last loop: * Store the maximum observed warp value for a potential retry:
*/ */
if (i == NR_LOOPS-1) gbl_max_warp = max_warp;
write_c0_count(initcount);
/*
* Ok, we are done:
*/
atomic_inc(&stop_count);
/*
* Wait for the source CPU to print stuff:
*/
while (atomic_read(&stop_count) != cpus)
cpu_relax();
atomic_inc(&count_count_stop); /*
while (atomic_read(&count_count_stop) != 2) * Reset it for the next sync test:
mb(); */
atomic_set(&stop_count, 0);
/*
* Check the number of remaining test runs. If not zero, the test
* failed and a retry with adjusted counter is possible. If zero the
* test was either successful or failed terminally.
*/
if (!atomic_read(&test_runs)) {
/* Arrange for an interrupt in a short while */
write_c0_compare(read_c0_count() + COUNTON);
return;
} }
/* Arrange for an interrupt in a short while */
write_c0_compare(read_c0_count() + COUNTON);
local_irq_restore(flags); /*
* If the warp value of this CPU is 0, then the other CPU
* observed time going backwards so this counter was ahead and
* needs to move backwards.
*/
if (!cur_max_warp)
cur_max_warp = -gbl_max_warp;
count = read_c0_count();
count += cur_max_warp;
write_c0_count(count);
pr_debug("Counter compensate: CPU%u observed %d warp\n", cpu, cur_max_warp);
goto retry;
} }
#undef NR_LOOPS
...@@ -37,3 +37,7 @@ u32 kvm_irq_to_priority(u32 irq); ...@@ -37,3 +37,7 @@ u32 kvm_irq_to_priority(u32 irq);
int kvm_mips_pending_timer(struct kvm_vcpu *vcpu); int kvm_mips_pending_timer(struct kvm_vcpu *vcpu);
void kvm_mips_deliver_interrupts(struct kvm_vcpu *vcpu, u32 cause); void kvm_mips_deliver_interrupts(struct kvm_vcpu *vcpu, u32 cause);
#ifdef CONFIG_CPU_LOONGSON64
extern void kvm_init_loongson_ipi(struct kvm *kvm);
#endif
...@@ -10,6 +10,8 @@ ...@@ -10,6 +10,8 @@
#include <linux/kvm_host.h> #include <linux/kvm_host.h>
#include "interrupt.h"
#define IPI_BASE 0x3ff01000ULL #define IPI_BASE 0x3ff01000ULL
#define CORE0_STATUS_OFF 0x000 #define CORE0_STATUS_OFF 0x000
......
...@@ -135,8 +135,6 @@ void kvm_arch_hardware_disable(void) ...@@ -135,8 +135,6 @@ void kvm_arch_hardware_disable(void)
kvm_mips_callbacks->hardware_disable(); kvm_mips_callbacks->hardware_disable();
} }
extern void kvm_init_loongson_ipi(struct kvm *kvm);
int kvm_arch_init_vm(struct kvm *kvm, unsigned long type) int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
{ {
switch (type) { switch (type) {
......
...@@ -247,6 +247,25 @@ static void pmu_disable(struct clk *clk) ...@@ -247,6 +247,25 @@ static void pmu_disable(struct clk *clk)
pr_warn("deactivating PMU module failed!"); pr_warn("deactivating PMU module failed!");
} }
static void usb_set_clock(void)
{
unsigned int val = ltq_cgu_r32(ifccr);
if (of_machine_is_compatible("lantiq,ar10") ||
of_machine_is_compatible("lantiq,grx390")) {
val &= ~0x03; /* XTAL divided by 3 */
} else if (of_machine_is_compatible("lantiq,ar9") ||
of_machine_is_compatible("lantiq,vr9")) {
/* TODO: this depends on the XTAL frequency */
val |= 0x03; /* XTAL divided by 3 */
} else if (of_machine_is_compatible("lantiq,ase")) {
val |= 0x20; /* from XTAL */
} else if (of_machine_is_compatible("lantiq,danube")) {
val |= 0x30; /* 12 MHz, generated from 36 MHz */
}
ltq_cgu_w32(val, ifccr);
}
/* the pci enable helper */ /* the pci enable helper */
static int pci_enable(struct clk *clk) static int pci_enable(struct clk *clk)
{ {
...@@ -588,4 +607,5 @@ void __init ltq_soc_init(void) ...@@ -588,4 +607,5 @@ void __init ltq_soc_init(void)
clkdev_add_pmu("1e116000.mei", "dfe", 1, 0, PMU_DFE); clkdev_add_pmu("1e116000.mei", "dfe", 1, 0, PMU_DFE);
clkdev_add_pmu("1e100400.serial", NULL, 1, 0, PMU_ASC0); clkdev_add_pmu("1e100400.serial", NULL, 1, 0, PMU_ASC0);
} }
usb_set_clock();
} }
...@@ -8,7 +8,7 @@ obj-$(CONFIG_MACH_LOONGSON64) += cop2-ex.o dma.o \ ...@@ -8,7 +8,7 @@ obj-$(CONFIG_MACH_LOONGSON64) += cop2-ex.o dma.o \
obj-$(CONFIG_SMP) += smp.o obj-$(CONFIG_SMP) += smp.o
obj-$(CONFIG_NUMA) += numa.o obj-$(CONFIG_NUMA) += numa.o
obj-$(CONFIG_RS780_HPET) += hpet.o obj-$(CONFIG_RS780_HPET) += hpet.o
obj-$(CONFIG_SUSPEND) += pm.o obj-$(CONFIG_SUSPEND) += pm.o sleeper.o
obj-$(CONFIG_PCI_QUIRKS) += vbios_quirk.o obj-$(CONFIG_PCI_QUIRKS) += vbios_quirk.o
obj-$(CONFIG_CPU_LOONGSON3_CPUCFG_EMULATION) += cpucfg-emul.o obj-$(CONFIG_CPU_LOONGSON3_CPUCFG_EMULATION) += cpucfg-emul.o
obj-$(CONFIG_SYSFS) += boardinfo.o obj-$(CONFIG_SYSFS) += boardinfo.o
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
#include <linux/dma-direct.h> #include <linux/dma-direct.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/swiotlb.h> #include <linux/swiotlb.h>
#include <asm/bootinfo.h>
#include <boot_param.h> #include <boot_param.h>
dma_addr_t phys_to_dma(struct device *dev, phys_addr_t paddr) dma_addr_t phys_to_dma(struct device *dev, phys_addr_t paddr)
......
...@@ -88,6 +88,12 @@ void __init prom_lefi_init_env(void) ...@@ -88,6 +88,12 @@ void __init prom_lefi_init_env(void)
cpu_clock_freq = ecpu->cpu_clock_freq; cpu_clock_freq = ecpu->cpu_clock_freq;
loongson_sysconf.cputype = ecpu->cputype; loongson_sysconf.cputype = ecpu->cputype;
switch (ecpu->cputype) { switch (ecpu->cputype) {
case Legacy_2K:
case Loongson_2K:
smp_group[0] = 0x900000001fe11000;
loongson_sysconf.cores_per_node = 2;
loongson_sysconf.cores_per_package = 2;
break;
case Legacy_3A: case Legacy_3A:
case Loongson_3A: case Loongson_3A:
loongson_sysconf.cores_per_node = 4; loongson_sysconf.cores_per_node = 4;
...@@ -221,6 +227,8 @@ void __init prom_lefi_init_env(void) ...@@ -221,6 +227,8 @@ void __init prom_lefi_init_env(void)
default: default:
break; break;
} }
} else if ((read_c0_prid() & PRID_IMP_MASK) == PRID_IMP_LOONGSON_64R) {
loongson_fdt_blob = __dtb_loongson64_2core_2k1000_begin;
} else if ((read_c0_prid() & PRID_IMP_MASK) == PRID_IMP_LOONGSON_64G) { } else if ((read_c0_prid() & PRID_IMP_MASK) == PRID_IMP_LOONGSON_64G) {
if (loongson_sysconf.bridgetype == LS7A) if (loongson_sysconf.bridgetype == LS7A)
loongson_fdt_blob = __dtb_loongson64g_4core_ls7a_begin; loongson_fdt_blob = __dtb_loongson64g_4core_ls7a_begin;
......
...@@ -6,98 +6,46 @@ ...@@ -6,98 +6,46 @@
* Author: Wu Zhangjin <wuzhangjin@gmail.com> * Author: Wu Zhangjin <wuzhangjin@gmail.com>
*/ */
#include <linux/suspend.h> #include <linux/suspend.h>
#include <linux/interrupt.h>
#include <linux/pm.h> #include <linux/pm.h>
#include <asm/i8259.h>
#include <asm/mipsregs.h> #include <asm/mipsregs.h>
#include <loongson.h> #include <loongson.h>
static unsigned int __maybe_unused cached_master_mask; /* i8259A */ asmlinkage void loongson_lefi_sleep(unsigned long sleep_addr);
static unsigned int __maybe_unused cached_slave_mask;
static unsigned int __maybe_unused cached_bonito_irq_mask; /* bonito */
void arch_suspend_disable_irqs(void) static int lefi_pm_enter(suspend_state_t state)
{ {
/* disable all mips events */ switch (state) {
local_irq_disable(); case PM_SUSPEND_MEM:
pm_set_suspend_via_firmware();
#ifdef CONFIG_I8259 loongson_lefi_sleep(loongson_sysconf.suspend_addr);
/* disable all events of i8259A */ pm_set_resume_via_firmware();
cached_slave_mask = inb(PIC_SLAVE_IMR); return 0;
cached_master_mask = inb(PIC_MASTER_IMR); default:
return -EINVAL;
outb(0xff, PIC_SLAVE_IMR); }
inb(PIC_SLAVE_IMR);
outb(0xff, PIC_MASTER_IMR);
inb(PIC_MASTER_IMR);
#endif
/* disable all events of bonito */
cached_bonito_irq_mask = LOONGSON_INTEN;
LOONGSON_INTENCLR = 0xffff;
(void)LOONGSON_INTENCLR;
}
void arch_suspend_enable_irqs(void)
{
/* enable all mips events */
local_irq_enable();
#ifdef CONFIG_I8259
/* only enable the cached events of i8259A */
outb(cached_slave_mask, PIC_SLAVE_IMR);
outb(cached_master_mask, PIC_MASTER_IMR);
#endif
/* enable all cached events of bonito */
LOONGSON_INTENSET = cached_bonito_irq_mask;
(void)LOONGSON_INTENSET;
}
/*
* Setup the board-specific events for waking up loongson from wait mode
*/
void __weak setup_wakeup_events(void)
{
}
void __weak mach_suspend(void)
{
}
void __weak mach_resume(void)
{
}
static int loongson_pm_enter(suspend_state_t state)
{
mach_suspend();
mach_resume();
return 0;
} }
static int loongson_pm_valid_state(suspend_state_t state) static int lefi_pm_valid_state(suspend_state_t state)
{ {
switch (state) { switch (state) {
case PM_SUSPEND_ON:
case PM_SUSPEND_STANDBY:
case PM_SUSPEND_MEM: case PM_SUSPEND_MEM:
return 1; return !!loongson_sysconf.suspend_addr;
default: default:
return 0; return 0;
} }
} }
static const struct platform_suspend_ops loongson_pm_ops = { static const struct platform_suspend_ops lefi_pm_ops = {
.valid = loongson_pm_valid_state, .valid = lefi_pm_valid_state,
.enter = loongson_pm_enter, .enter = lefi_pm_enter,
}; };
static int __init loongson_pm_init(void) static int __init loongson_pm_init(void)
{ {
suspend_set_ops(&loongson_pm_ops); if (loongson_sysconf.fw_interface == LOONGSON_LEFI)
suspend_set_ops(&lefi_pm_ops);
return 0; return 0;
} }
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/kexec.h> #include <linux/kexec.h>
#include <linux/pm.h> #include <linux/pm.h>
#include <linux/reboot.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <asm/bootinfo.h> #include <asm/bootinfo.h>
...@@ -21,36 +22,21 @@ ...@@ -21,36 +22,21 @@
#include <loongson.h> #include <loongson.h>
#include <boot_param.h> #include <boot_param.h>
static void loongson_restart(char *command) static int firmware_restart(struct sys_off_data *unusedd)
{ {
void (*fw_restart)(void) = (void *)loongson_sysconf.restart_addr; void (*fw_restart)(void) = (void *)loongson_sysconf.restart_addr;
fw_restart(); fw_restart();
while (1) { return NOTIFY_DONE;
if (cpu_wait)
cpu_wait();
}
} }
static void loongson_poweroff(void) static int firmware_poweroff(struct sys_off_data *unused)
{ {
void (*fw_poweroff)(void) = (void *)loongson_sysconf.poweroff_addr; void (*fw_poweroff)(void) = (void *)loongson_sysconf.poweroff_addr;
fw_poweroff(); fw_poweroff();
while (1) { return NOTIFY_DONE;
if (cpu_wait)
cpu_wait();
}
}
static void loongson_halt(void)
{
pr_notice("\n\n** You can safely turn off the power now **\n\n");
while (1) {
if (cpu_wait)
cpu_wait();
}
} }
#ifdef CONFIG_KEXEC_CORE #ifdef CONFIG_KEXEC_CORE
...@@ -154,9 +140,17 @@ static void loongson_crash_shutdown(struct pt_regs *regs) ...@@ -154,9 +140,17 @@ static void loongson_crash_shutdown(struct pt_regs *regs)
static int __init mips_reboot_setup(void) static int __init mips_reboot_setup(void)
{ {
_machine_restart = loongson_restart; if (loongson_sysconf.restart_addr) {
_machine_halt = loongson_halt; register_sys_off_handler(SYS_OFF_MODE_RESTART,
pm_power_off = loongson_poweroff; SYS_OFF_PRIO_FIRMWARE,
firmware_restart, NULL);
}
if (loongson_sysconf.poweroff_addr) {
register_sys_off_handler(SYS_OFF_MODE_POWER_OFF,
SYS_OFF_PRIO_FIRMWARE,
firmware_poweroff, NULL);
}
#ifdef CONFIG_KEXEC_CORE #ifdef CONFIG_KEXEC_CORE
kexec_argv = kmalloc(KEXEC_ARGV_SIZE, GFP_KERNEL); kexec_argv = kmalloc(KEXEC_ARGV_SIZE, GFP_KERNEL);
......
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* Copyright (C) 2024, Jiaxun Yang <jiaxun.yang@flygoat.com>
* Loongson EFI firmware sleeper routine
*/
#include <asm/asm.h>
#include <asm/pm.h>
#include <kernel-entry-init.h>
LEAF(loongson_lefi_sleep)
SUSPEND_SAVE
move t9, a0
PTR_LA a0, wake
move a1, sp
jalr t9
wake:
smp_slave_setup
RESUME_RESTORE_REGS_RETURN
END(loongson_lefi_sleep)
...@@ -466,12 +466,25 @@ static void loongson3_smp_finish(void) ...@@ -466,12 +466,25 @@ static void loongson3_smp_finish(void)
static void __init loongson3_smp_setup(void) static void __init loongson3_smp_setup(void)
{ {
int i = 0, num = 0; /* i: physical id, num: logical id */ int i = 0, num = 0; /* i: physical id, num: logical id */
int max_cpus = 0;
init_cpu_possible(cpu_none_mask); init_cpu_possible(cpu_none_mask);
for (i = 0; i < ARRAY_SIZE(smp_group); i++) {
if (!smp_group[i])
break;
max_cpus += loongson_sysconf.cores_per_node;
}
if (max_cpus < loongson_sysconf.nr_cpus) {
pr_err("SMP Groups are less than the number of CPUs\n");
loongson_sysconf.nr_cpus = max_cpus ? max_cpus : 1;
}
/* For unified kernel, NR_CPUS is the maximum possible value, /* For unified kernel, NR_CPUS is the maximum possible value,
* loongson_sysconf.nr_cpus is the really present value * loongson_sysconf.nr_cpus is the really present value
*/ */
i = 0;
while (i < loongson_sysconf.nr_cpus) { while (i < loongson_sysconf.nr_cpus) {
if (loongson_sysconf.reserved_cpus_mask & (1<<i)) { if (loongson_sysconf.reserved_cpus_mask & (1<<i)) {
/* Reserved physical CPU cores */ /* Reserved physical CPU cores */
...@@ -492,14 +505,14 @@ static void __init loongson3_smp_setup(void) ...@@ -492,14 +505,14 @@ static void __init loongson3_smp_setup(void)
__cpu_logical_map[num] = -1; __cpu_logical_map[num] = -1;
num++; num++;
} }
csr_ipi_probe(); csr_ipi_probe();
ipi_set0_regs_init(); ipi_set0_regs_init();
ipi_clear0_regs_init(); ipi_clear0_regs_init();
ipi_status0_regs_init(); ipi_status0_regs_init();
ipi_en0_regs_init(); ipi_en0_regs_init();
ipi_mailbox_buf_init(); ipi_mailbox_buf_init();
ipi_write_enable(0); if (smp_group[0])
ipi_write_enable(0);
cpu_set_core(&cpu_data[0], cpu_set_core(&cpu_data[0],
cpu_logical_map(0) % loongson_sysconf.cores_per_package); cpu_logical_map(0) % loongson_sysconf.cores_per_package);
...@@ -818,6 +831,9 @@ static int loongson3_disable_clock(unsigned int cpu) ...@@ -818,6 +831,9 @@ static int loongson3_disable_clock(unsigned int cpu)
uint64_t core_id = cpu_core(&cpu_data[cpu]); uint64_t core_id = cpu_core(&cpu_data[cpu]);
uint64_t package_id = cpu_data[cpu].package; uint64_t package_id = cpu_data[cpu].package;
if (!loongson_chipcfg[package_id] || !loongson_freqctrl[package_id])
return 0;
if ((read_c0_prid() & PRID_REV_MASK) == PRID_REV_LOONGSON3A_R1) { if ((read_c0_prid() & PRID_REV_MASK) == PRID_REV_LOONGSON3A_R1) {
LOONGSON_CHIPCFG(package_id) &= ~(1 << (12 + core_id)); LOONGSON_CHIPCFG(package_id) &= ~(1 << (12 + core_id));
} else { } else {
...@@ -832,6 +848,9 @@ static int loongson3_enable_clock(unsigned int cpu) ...@@ -832,6 +848,9 @@ static int loongson3_enable_clock(unsigned int cpu)
uint64_t core_id = cpu_core(&cpu_data[cpu]); uint64_t core_id = cpu_core(&cpu_data[cpu]);
uint64_t package_id = cpu_data[cpu].package; uint64_t package_id = cpu_data[cpu].package;
if (!loongson_chipcfg[package_id] || !loongson_freqctrl[package_id])
return 0;
if ((read_c0_prid() & PRID_REV_MASK) == PRID_REV_LOONGSON3A_R1) { if ((read_c0_prid() & PRID_REV_MASK) == PRID_REV_LOONGSON3A_R1) {
LOONGSON_CHIPCFG(package_id) |= 1 << (12 + core_id); LOONGSON_CHIPCFG(package_id) |= 1 << (12 + core_id);
} else { } else {
......
# SPDX-License-Identifier: GPL-2.0
if EYEQ
choice
prompt "Mobileye EyeQ SoC selection"
default MACH_EYEQ5
help
Select Mobileye EyeQ MIPS SoC type.
config MACH_EYEQ5
bool "Mobileye EyeQ5 SoC"
config MACH_EYEQ6H
bool "Mobileye EyeQ6H SoC"
endchoice
config FIT_IMAGE_FDT_EPM5
bool "Include FDT for Mobileye EyeQ5 development platforms"
depends on MACH_EYEQ5
default n
help
Enable this to include the FDT for the EyeQ5 development platforms
from Mobileye in the FIT kernel image.
This requires u-boot on the platform.
endif
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
# #
load-$(CONFIG_MACH_EYEQ5) = 0xa800000808000000 load-$(CONFIG_MACH_EYEQ5) = 0xa800000808000000
load-$(CONFIG_MACH_EYEQ6H) = 0xa800000100800000
all-$(CONFIG_MACH_EYEQ5) += vmlinux.gz.itb all-$(CONFIG_MACH_EYEQ5) += vmlinux.gz.itb
its-y := vmlinux.its.S its-y := vmlinux.its.S
......
File mode changed from 100755 to 100644
...@@ -246,7 +246,7 @@ void gio_set_master(struct gio_device *dev) ...@@ -246,7 +246,7 @@ void gio_set_master(struct gio_device *dev)
} }
EXPORT_SYMBOL_GPL(gio_set_master); EXPORT_SYMBOL_GPL(gio_set_master);
void ip22_gio_set_64bit(int slotno) static void ip22_gio_set_64bit(int slotno)
{ {
u32 tmp = sgimc->giopar; u32 tmp = sgimc->giopar;
...@@ -395,7 +395,7 @@ static struct resource gio_bus_resource = { ...@@ -395,7 +395,7 @@ static struct resource gio_bus_resource = {
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}; };
int __init ip22_gio_init(void) static int __init ip22_gio_init(void)
{ {
unsigned int pbdma __maybe_unused; unsigned int pbdma __maybe_unused;
int ret; int ret;
......
...@@ -165,8 +165,6 @@ static void __irq_entry indy_buserror_irq(void) ...@@ -165,8 +165,6 @@ static void __irq_entry indy_buserror_irq(void)
#define SGI_INTERRUPTS SGINT_LOCAL3 #define SGI_INTERRUPTS SGINT_LOCAL3
#endif #endif
extern void indy_8254timer_irq(void);
/* /*
* IRQs on the INDY look basically (barring software IRQs which we don't use * IRQs on the INDY look basically (barring software IRQs which we don't use
* at all) like: * at all) like:
......
...@@ -26,8 +26,6 @@ ...@@ -26,8 +26,6 @@
#include <asm/sgi/hpc3.h> #include <asm/sgi/hpc3.h>
#include <asm/sgi/ip22.h> #include <asm/sgi/ip22.h>
extern void ip22_be_init(void) __init;
void __init plat_mem_setup(void) void __init plat_mem_setup(void)
{ {
char *ctype; char *ctype;
......
// SPDX-License-Identifier: GPL-2.0 // SPDX-License-Identifier: GPL-2.0
#include <linux/io.h> #include <linux/io.h>
#include <linux/processor.h>
#include <asm/sn/ioc3.h> #include <asm/sn/ioc3.h>
#include <asm/setup.h> #include <asm/setup.h>
......
...@@ -139,6 +139,9 @@ static int __init loongson_hwmon_init(void) ...@@ -139,6 +139,9 @@ static int __init loongson_hwmon_init(void)
csr_temp_enable = csr_readl(LOONGSON_CSR_FEATURES) & csr_temp_enable = csr_readl(LOONGSON_CSR_FEATURES) &
LOONGSON_CSRF_TEMP; LOONGSON_CSRF_TEMP;
if (!csr_temp_enable && !loongson_chiptemp[0])
return -ENODEV;
nr_packages = loongson_sysconf.nr_cpus / nr_packages = loongson_sysconf.nr_cpus /
loongson_sysconf.cores_per_package; loongson_sysconf.cores_per_package;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment