mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-11-19 08:05:27 +08:00
Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc
* 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc: (79 commits) powerpc/8xx: Add support for the MPC8xx based boards from TQC powerpc/85xx: Introduce support for the Freescale P1022DS reference board powerpc/85xx: Adding DTS for the STx GP3-SSA MPC8555 board powerpc/85xx: Change deprecated binding for 85xx-based boards powerpc/tqm85xx: add a quirk for ti1520 PCMCIA bridge powerpc/tqm85xx: update PCI interrupt-map attribute powerpc/mpc8308rdb: support for MPC8308RDB board from Freescale powerpc/fsl_pci: add quirk for mpc8308 pcie bridge powerpc/85xx: Cleanup QE initialization for MPC85xxMDS boards powerpc/85xx: Fix booting for P1021MDS boards powerpc/85xx: Fix SWIOTLB initalization for MPC85xxMDS boards powerpc/85xx: kexec for SMP 85xx BookE systems powerpc/5200/i2c: improve i2c bus error recovery of/xilinxfb: update tft compatible versions powerpc/fsl-diu-fb: Support setting display mode using EDID powerpc/5121: doc/dts-bindings: update doc of FSL DIU bindings powerpc/5121: shared DIU framebuffer support powerpc/5121: move fsl-diu-fb.h to include/linux powerpc/5121: fsl-diu-fb: fix issue with re-enabling DIU area descriptor powerpc/512x: add clock structure for Video-IN (VIU) unit ...
This commit is contained in:
commit
cdd854bc42
@ -4,10 +4,17 @@ The Freescale DIU is a LCD controller, with proper hardware, it can also
|
||||
drive DVI monitors.
|
||||
|
||||
Required properties:
|
||||
- compatible : should be "fsl-diu".
|
||||
- compatible : should be "fsl,diu" or "fsl,mpc5121-diu".
|
||||
- reg : should contain at least address and length of the DIU register
|
||||
set.
|
||||
- Interrupts : one DIU interrupt should be describe here.
|
||||
- interrupts : one DIU interrupt should be described here.
|
||||
- interrupt-parent : the phandle for the interrupt controller that
|
||||
services interrupts for this device.
|
||||
|
||||
Optional properties:
|
||||
- edid : verbatim EDID data block describing attached display.
|
||||
Data from the detailed timing descriptor will be used to
|
||||
program the display controller.
|
||||
|
||||
Example (MPC8610HPCD):
|
||||
display@2c000 {
|
||||
@ -16,3 +23,12 @@ Example (MPC8610HPCD):
|
||||
interrupts = <72 2>;
|
||||
interrupt-parent = <&mpic>;
|
||||
};
|
||||
|
||||
Example for MPC5121:
|
||||
display@2100 {
|
||||
compatible = "fsl,mpc5121-diu";
|
||||
reg = <0x2100 0x100>;
|
||||
interrupts = <64 0x8>;
|
||||
interrupt-parent = <&ipic>;
|
||||
edid = [edid-data];
|
||||
};
|
||||
|
@ -20,6 +20,7 @@ Recommended properties :
|
||||
- fsl,preserve-clocking : boolean; if defined, the clock settings
|
||||
from the bootloader are preserved (not touched).
|
||||
- clock-frequency : desired I2C bus clock frequency in Hz.
|
||||
- fsl,timeout : I2C bus timeout in microseconds.
|
||||
|
||||
Examples :
|
||||
|
||||
@ -59,4 +60,5 @@ Examples :
|
||||
interrupts = <43 2>;
|
||||
interrupt-parent = <&mpic>;
|
||||
clock-frequency = <400000>;
|
||||
fsl,timeout = <10000>;
|
||||
};
|
||||
|
@ -141,6 +141,7 @@ config PPC
|
||||
select GENERIC_ATOMIC64 if PPC32
|
||||
select HAVE_PERF_EVENTS
|
||||
select HAVE_REGS_AND_STACK_ACCESS_API
|
||||
select HAVE_HW_BREAKPOINT if PERF_EVENTS && PPC_BOOK3S_64
|
||||
|
||||
config EARLY_PRINTK
|
||||
bool
|
||||
@ -218,7 +219,7 @@ config ARCH_HIBERNATION_POSSIBLE
|
||||
config ARCH_SUSPEND_POSSIBLE
|
||||
def_bool y
|
||||
depends on ADB_PMU || PPC_EFIKA || PPC_LITE5200 || PPC_83xx || \
|
||||
PPC_85xx || PPC_86xx
|
||||
PPC_85xx || PPC_86xx || PPC_PSERIES
|
||||
|
||||
config PPC_DCR_NATIVE
|
||||
bool
|
||||
@ -351,7 +352,7 @@ config ARCH_ENABLE_MEMORY_HOTREMOVE
|
||||
|
||||
config KEXEC
|
||||
bool "kexec system call (EXPERIMENTAL)"
|
||||
depends on (PPC_BOOK3S || (FSL_BOOKE && !SMP)) && EXPERIMENTAL
|
||||
depends on (PPC_BOOK3S || FSL_BOOKE) && EXPERIMENTAL
|
||||
help
|
||||
kexec is a system call that implements the ability to shutdown your
|
||||
current kernel, and to start another kernel. It is like a reboot
|
||||
@ -368,8 +369,8 @@ config KEXEC
|
||||
|
||||
config CRASH_DUMP
|
||||
bool "Build a kdump crash kernel"
|
||||
depends on PPC64 || 6xx
|
||||
select RELOCATABLE if PPC64
|
||||
depends on PPC64 || 6xx || FSL_BOOKE
|
||||
select RELOCATABLE if PPC64 || FSL_BOOKE
|
||||
help
|
||||
Build a kernel suitable for use as a kdump capture kernel.
|
||||
The same kernel binary can be used as production kernel and dump
|
||||
@ -668,7 +669,7 @@ config NEED_SG_DMA_LENGTH
|
||||
|
||||
config GENERIC_ISA_DMA
|
||||
bool
|
||||
depends on PPC64 || POWER4 || 6xx && !CPM2
|
||||
depends on ISA_DMA_API
|
||||
default y
|
||||
|
||||
config PPC_INDIRECT_PCI
|
||||
@ -897,7 +898,7 @@ config KERNEL_START_BOOL
|
||||
config KERNEL_START
|
||||
hex "Virtual address of kernel base" if KERNEL_START_BOOL
|
||||
default PAGE_OFFSET if PAGE_OFFSET_BOOL
|
||||
default "0xc2000000" if CRASH_DUMP
|
||||
default "0xc2000000" if CRASH_DUMP && !RELOCATABLE
|
||||
default "0xc0000000"
|
||||
|
||||
config PHYSICAL_START_BOOL
|
||||
@ -910,7 +911,7 @@ config PHYSICAL_START_BOOL
|
||||
|
||||
config PHYSICAL_START
|
||||
hex "Physical address where the kernel is loaded" if PHYSICAL_START_BOOL
|
||||
default "0x02000000" if PPC_STD_MMU && CRASH_DUMP
|
||||
default "0x02000000" if PPC_STD_MMU && CRASH_DUMP && !RELOCATABLE
|
||||
default "0x00000000"
|
||||
|
||||
config PHYSICAL_ALIGN
|
||||
|
@ -270,7 +270,7 @@
|
||||
clock-frequency = <0>; /* Filled in by U-Boot */
|
||||
current-speed = <0>; /* Filled in by U-Boot */
|
||||
interrupt-parent = <&UIC1>;
|
||||
interrupts = <0x1d 0x4>;
|
||||
interrupts = <28 0x4>;
|
||||
};
|
||||
|
||||
UART3: serial@ef600600 {
|
||||
@ -281,7 +281,7 @@
|
||||
clock-frequency = <0>; /* Filled in by U-Boot */
|
||||
current-speed = <0>; /* Filled in by U-Boot */
|
||||
interrupt-parent = <&UIC1>;
|
||||
interrupts = <0x1e 0x4>;
|
||||
interrupts = <29 0x4>;
|
||||
};
|
||||
|
||||
IIC0: i2c@ef600700 {
|
||||
|
@ -259,7 +259,7 @@
|
||||
clock-frequency = <0>; /* Filled in by U-Boot */
|
||||
current-speed = <0>; /* Filled in by U-Boot */
|
||||
interrupt-parent = <&UIC1>;
|
||||
interrupts = <0x1d 0x4>;
|
||||
interrupts = <28 0x4>;
|
||||
};
|
||||
|
||||
UART3: serial@ef600600 {
|
||||
@ -270,7 +270,7 @@
|
||||
clock-frequency = <0>; /* Filled in by U-Boot */
|
||||
current-speed = <0>; /* Filled in by U-Boot */
|
||||
interrupt-parent = <&UIC1>;
|
||||
interrupts = <0x1e 0x4>;
|
||||
interrupts = <29 0x4>;
|
||||
};
|
||||
|
||||
IIC0: i2c@ef600700 {
|
||||
|
303
arch/powerpc/boot/dts/mpc8308rdb.dts
Normal file
303
arch/powerpc/boot/dts/mpc8308rdb.dts
Normal file
@ -0,0 +1,303 @@
|
||||
/*
|
||||
* MPC8308RDB Device Tree Source
|
||||
*
|
||||
* Copyright 2009 Freescale Semiconductor Inc.
|
||||
* Copyright 2010 Ilya Yanok, Emcraft Systems, yanok@emcraft.com
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
/ {
|
||||
compatible = "fsl,mpc8308rdb";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
aliases {
|
||||
ethernet0 = &enet0;
|
||||
ethernet1 = &enet1;
|
||||
serial0 = &serial0;
|
||||
serial1 = &serial1;
|
||||
pci0 = &pci0;
|
||||
};
|
||||
|
||||
cpus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
PowerPC,8308@0 {
|
||||
device_type = "cpu";
|
||||
reg = <0x0>;
|
||||
d-cache-line-size = <32>;
|
||||
i-cache-line-size = <32>;
|
||||
d-cache-size = <16384>;
|
||||
i-cache-size = <16384>;
|
||||
timebase-frequency = <0>; // from bootloader
|
||||
bus-frequency = <0>; // from bootloader
|
||||
clock-frequency = <0>; // from bootloader
|
||||
};
|
||||
};
|
||||
|
||||
memory {
|
||||
device_type = "memory";
|
||||
reg = <0x00000000 0x08000000>; // 128MB at 0
|
||||
};
|
||||
|
||||
localbus@e0005000 {
|
||||
#address-cells = <2>;
|
||||
#size-cells = <1>;
|
||||
compatible = "fsl,mpc8315-elbc", "fsl,elbc", "simple-bus";
|
||||
reg = <0xe0005000 0x1000>;
|
||||
interrupts = <77 0x8>;
|
||||
interrupt-parent = <&ipic>;
|
||||
|
||||
// CS0 and CS1 are swapped when
|
||||
// booting from nand, but the
|
||||
// addresses are the same.
|
||||
ranges = <0x0 0x0 0xfe000000 0x00800000
|
||||
0x1 0x0 0xe0600000 0x00002000
|
||||
0x2 0x0 0xf0000000 0x00020000
|
||||
0x3 0x0 0xfa000000 0x00008000>;
|
||||
|
||||
flash@0,0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "cfi-flash";
|
||||
reg = <0x0 0x0 0x800000>;
|
||||
bank-width = <2>;
|
||||
device-width = <1>;
|
||||
|
||||
u-boot@0 {
|
||||
reg = <0x0 0x60000>;
|
||||
read-only;
|
||||
};
|
||||
env@60000 {
|
||||
reg = <0x60000 0x10000>;
|
||||
};
|
||||
env1@70000 {
|
||||
reg = <0x70000 0x10000>;
|
||||
};
|
||||
kernel@80000 {
|
||||
reg = <0x80000 0x200000>;
|
||||
};
|
||||
dtb@280000 {
|
||||
reg = <0x280000 0x10000>;
|
||||
};
|
||||
ramdisk@290000 {
|
||||
reg = <0x290000 0x570000>;
|
||||
};
|
||||
};
|
||||
|
||||
nand@1,0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "fsl,mpc8315-fcm-nand",
|
||||
"fsl,elbc-fcm-nand";
|
||||
reg = <0x1 0x0 0x2000>;
|
||||
|
||||
jffs2@0 {
|
||||
reg = <0x0 0x2000000>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
immr@e0000000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
device_type = "soc";
|
||||
compatible = "fsl,mpc8315-immr", "simple-bus";
|
||||
ranges = <0 0xe0000000 0x00100000>;
|
||||
reg = <0xe0000000 0x00000200>;
|
||||
bus-frequency = <0>;
|
||||
|
||||
i2c@3000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
cell-index = <0>;
|
||||
compatible = "fsl-i2c";
|
||||
reg = <0x3000 0x100>;
|
||||
interrupts = <14 0x8>;
|
||||
interrupt-parent = <&ipic>;
|
||||
dfsrr;
|
||||
rtc@68 {
|
||||
compatible = "dallas,ds1339";
|
||||
reg = <0x68>;
|
||||
};
|
||||
};
|
||||
|
||||
usb@23000 {
|
||||
compatible = "fsl-usb2-dr";
|
||||
reg = <0x23000 0x1000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
interrupt-parent = <&ipic>;
|
||||
interrupts = <38 0x8>;
|
||||
dr_mode = "peripheral";
|
||||
phy_type = "ulpi";
|
||||
};
|
||||
|
||||
enet0: ethernet@24000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges = <0x0 0x24000 0x1000>;
|
||||
|
||||
cell-index = <0>;
|
||||
device_type = "network";
|
||||
model = "eTSEC";
|
||||
compatible = "gianfar";
|
||||
reg = <0x24000 0x1000>;
|
||||
local-mac-address = [ 00 00 00 00 00 00 ];
|
||||
interrupts = <32 0x8 33 0x8 34 0x8>;
|
||||
interrupt-parent = <&ipic>;
|
||||
tbi-handle = < &tbi0 >;
|
||||
phy-handle = < &phy2 >;
|
||||
fsl,magic-packet;
|
||||
|
||||
mdio@520 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "fsl,gianfar-mdio";
|
||||
reg = <0x520 0x20>;
|
||||
phy2: ethernet-phy@2 {
|
||||
interrupt-parent = <&ipic>;
|
||||
interrupts = <17 0x8>;
|
||||
reg = <0x2>;
|
||||
device_type = "ethernet-phy";
|
||||
};
|
||||
tbi0: tbi-phy@11 {
|
||||
reg = <0x11>;
|
||||
device_type = "tbi-phy";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
enet1: ethernet@25000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
cell-index = <1>;
|
||||
device_type = "network";
|
||||
model = "eTSEC";
|
||||
compatible = "gianfar";
|
||||
reg = <0x25000 0x1000>;
|
||||
ranges = <0x0 0x25000 0x1000>;
|
||||
local-mac-address = [ 00 00 00 00 00 00 ];
|
||||
interrupts = <35 0x8 36 0x8 37 0x8>;
|
||||
interrupt-parent = <&ipic>;
|
||||
tbi-handle = < &tbi1 >;
|
||||
/* Vitesse 7385 isn't on the MDIO bus */
|
||||
fixed-link = <1 1 1000 0 0>;
|
||||
fsl,magic-packet;
|
||||
|
||||
mdio@520 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "fsl,gianfar-tbi";
|
||||
reg = <0x520 0x20>;
|
||||
|
||||
tbi1: tbi-phy@11 {
|
||||
reg = <0x11>;
|
||||
device_type = "tbi-phy";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
serial0: serial@4500 {
|
||||
cell-index = <0>;
|
||||
device_type = "serial";
|
||||
compatible = "ns16550";
|
||||
reg = <0x4500 0x100>;
|
||||
clock-frequency = <133333333>;
|
||||
interrupts = <9 0x8>;
|
||||
interrupt-parent = <&ipic>;
|
||||
};
|
||||
|
||||
serial1: serial@4600 {
|
||||
cell-index = <1>;
|
||||
device_type = "serial";
|
||||
compatible = "ns16550";
|
||||
reg = <0x4600 0x100>;
|
||||
clock-frequency = <133333333>;
|
||||
interrupts = <10 0x8>;
|
||||
interrupt-parent = <&ipic>;
|
||||
};
|
||||
|
||||
gpio@c00 {
|
||||
#gpio-cells = <2>;
|
||||
device_type = "gpio";
|
||||
compatible = "fsl,mpc8308-gpio", "fsl,mpc8349-gpio";
|
||||
reg = <0xc00 0x18>;
|
||||
interrupts = <74 0x8>;
|
||||
interrupt-parent = <&ipic>;
|
||||
gpio-controller;
|
||||
};
|
||||
|
||||
/* IPIC
|
||||
* interrupts cell = <intr #, sense>
|
||||
* sense values match linux IORESOURCE_IRQ_* defines:
|
||||
* sense == 8: Level, low assertion
|
||||
* sense == 2: Edge, high-to-low change
|
||||
*/
|
||||
ipic: interrupt-controller@700 {
|
||||
compatible = "fsl,ipic";
|
||||
interrupt-controller;
|
||||
#address-cells = <0>;
|
||||
#interrupt-cells = <2>;
|
||||
reg = <0x700 0x100>;
|
||||
device_type = "ipic";
|
||||
};
|
||||
|
||||
ipic-msi@7c0 {
|
||||
compatible = "fsl,ipic-msi";
|
||||
reg = <0x7c0 0x40>;
|
||||
msi-available-ranges = <0x0 0x100>;
|
||||
interrupts = < 0x43 0x8
|
||||
0x4 0x8
|
||||
0x51 0x8
|
||||
0x52 0x8
|
||||
0x56 0x8
|
||||
0x57 0x8
|
||||
0x58 0x8
|
||||
0x59 0x8 >;
|
||||
interrupt-parent = < &ipic >;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
pci0: pcie@e0009000 {
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
#interrupt-cells = <1>;
|
||||
device_type = "pci";
|
||||
compatible = "fsl,mpc8308-pcie", "fsl,mpc8314-pcie";
|
||||
reg = <0xe0009000 0x00001000
|
||||
0xb0000000 0x01000000>;
|
||||
ranges = <0x02000000 0 0xa0000000 0xa0000000 0 0x10000000
|
||||
0x01000000 0 0x00000000 0xb1000000 0 0x00800000>;
|
||||
bus-range = <0 0>;
|
||||
interrupt-map-mask = <0xf800 0 0 7>;
|
||||
interrupt-map = <0 0 0 1 &ipic 1 8
|
||||
0 0 0 2 &ipic 1 8
|
||||
0 0 0 3 &ipic 1 8
|
||||
0 0 0 4 &ipic 1 8>;
|
||||
interrupts = <0x1 0x8>;
|
||||
interrupt-parent = <&ipic>;
|
||||
clock-frequency = <0>;
|
||||
|
||||
pcie@0 {
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
device_type = "pci";
|
||||
reg = <0 0 0 0 0>;
|
||||
ranges = <0x02000000 0 0xa0000000
|
||||
0x02000000 0 0xa0000000
|
||||
0 0x10000000
|
||||
0x01000000 0 0x00000000
|
||||
0x01000000 0 0x00000000
|
||||
0 0x00800000>;
|
||||
};
|
||||
};
|
||||
};
|
@ -71,14 +71,14 @@
|
||||
};
|
||||
|
||||
memory-controller@2000 {
|
||||
compatible = "fsl,8540-memory-controller";
|
||||
compatible = "fsl,mpc8540-memory-controller";
|
||||
reg = <0x2000 0x1000>;
|
||||
interrupt-parent = <&mpic>;
|
||||
interrupts = <18 2>;
|
||||
};
|
||||
|
||||
L2: l2-cache-controller@20000 {
|
||||
compatible = "fsl,8540-l2-cache-controller";
|
||||
compatible = "fsl,mpc8540-l2-cache-controller";
|
||||
reg = <0x20000 0x1000>;
|
||||
cache-line-size = <32>; // 32 bytes
|
||||
cache-size = <0x40000>; // L2, 256K
|
||||
|
@ -71,14 +71,14 @@
|
||||
};
|
||||
|
||||
memory-controller@2000 {
|
||||
compatible = "fsl,8541-memory-controller";
|
||||
compatible = "fsl,mpc8541-memory-controller";
|
||||
reg = <0x2000 0x1000>;
|
||||
interrupt-parent = <&mpic>;
|
||||
interrupts = <18 2>;
|
||||
};
|
||||
|
||||
L2: l2-cache-controller@20000 {
|
||||
compatible = "fsl,8541-l2-cache-controller";
|
||||
compatible = "fsl,mpc8541-l2-cache-controller";
|
||||
reg = <0x20000 0x1000>;
|
||||
cache-line-size = <32>; // 32 bytes
|
||||
cache-size = <0x40000>; // L2, 256K
|
||||
|
@ -73,14 +73,14 @@
|
||||
};
|
||||
|
||||
memory-controller@2000 {
|
||||
compatible = "fsl,8544-memory-controller";
|
||||
compatible = "fsl,mpc8544-memory-controller";
|
||||
reg = <0x2000 0x1000>;
|
||||
interrupt-parent = <&mpic>;
|
||||
interrupts = <18 2>;
|
||||
};
|
||||
|
||||
L2: l2-cache-controller@20000 {
|
||||
compatible = "fsl,8544-l2-cache-controller";
|
||||
compatible = "fsl,mpc8544-l2-cache-controller";
|
||||
reg = <0x20000 0x1000>;
|
||||
cache-line-size = <32>; // 32 bytes
|
||||
cache-size = <0x40000>; // L2, 256K
|
||||
|
@ -74,14 +74,14 @@
|
||||
};
|
||||
|
||||
memory-controller@2000 {
|
||||
compatible = "fsl,8548-memory-controller";
|
||||
compatible = "fsl,mpc8548-memory-controller";
|
||||
reg = <0x2000 0x1000>;
|
||||
interrupt-parent = <&mpic>;
|
||||
interrupts = <18 2>;
|
||||
};
|
||||
|
||||
L2: l2-cache-controller@20000 {
|
||||
compatible = "fsl,8548-l2-cache-controller";
|
||||
compatible = "fsl,mpc8548-l2-cache-controller";
|
||||
reg = <0x20000 0x1000>;
|
||||
cache-line-size = <32>; // 32 bytes
|
||||
cache-size = <0x80000>; // L2, 512K
|
||||
|
@ -71,14 +71,14 @@
|
||||
};
|
||||
|
||||
memory-controller@2000 {
|
||||
compatible = "fsl,8555-memory-controller";
|
||||
compatible = "fsl,mpc8555-memory-controller";
|
||||
reg = <0x2000 0x1000>;
|
||||
interrupt-parent = <&mpic>;
|
||||
interrupts = <18 2>;
|
||||
};
|
||||
|
||||
L2: l2-cache-controller@20000 {
|
||||
compatible = "fsl,8555-l2-cache-controller";
|
||||
compatible = "fsl,mpc8555-l2-cache-controller";
|
||||
reg = <0x20000 0x1000>;
|
||||
cache-line-size = <32>; // 32 bytes
|
||||
cache-size = <0x40000>; // L2, 256K
|
||||
|
@ -71,14 +71,14 @@
|
||||
};
|
||||
|
||||
memory-controller@2000 {
|
||||
compatible = "fsl,8540-memory-controller";
|
||||
compatible = "fsl,mpc8540-memory-controller";
|
||||
reg = <0x2000 0x1000>;
|
||||
interrupt-parent = <&mpic>;
|
||||
interrupts = <18 2>;
|
||||
};
|
||||
|
||||
L2: l2-cache-controller@20000 {
|
||||
compatible = "fsl,8540-l2-cache-controller";
|
||||
compatible = "fsl,mpc8540-l2-cache-controller";
|
||||
reg = <0x20000 0x1000>;
|
||||
cache-line-size = <32>; // 32 bytes
|
||||
cache-size = <0x40000>; // L2, 256K
|
||||
|
@ -124,14 +124,14 @@
|
||||
};
|
||||
|
||||
memory-controller@2000 {
|
||||
compatible = "fsl,8568-memory-controller";
|
||||
compatible = "fsl,mpc8568-memory-controller";
|
||||
reg = <0x2000 0x1000>;
|
||||
interrupt-parent = <&mpic>;
|
||||
interrupts = <18 2>;
|
||||
};
|
||||
|
||||
L2: l2-cache-controller@20000 {
|
||||
compatible = "fsl,8568-l2-cache-controller";
|
||||
compatible = "fsl,mpc8568-l2-cache-controller";
|
||||
reg = <0x20000 0x1000>;
|
||||
cache-line-size = <32>; // 32 bytes
|
||||
cache-size = <0x80000>; // L2, 512K
|
||||
|
@ -617,6 +617,7 @@
|
||||
bus-frequency = <0>;
|
||||
fsl,qe-num-riscs = <1>;
|
||||
fsl,qe-num-snums = <28>;
|
||||
status = "disabled"; /* no firmware loaded */
|
||||
|
||||
qeic: interrupt-controller@80 {
|
||||
interrupt-controller;
|
||||
|
633
arch/powerpc/boot/dts/p1022ds.dts
Normal file
633
arch/powerpc/boot/dts/p1022ds.dts
Normal file
@ -0,0 +1,633 @@
|
||||
/*
|
||||
* P1022 DS 36Bit Physical Address Map Device Tree Source
|
||||
*
|
||||
* Copyright 2010 Freescale Semiconductor, Inc.
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public License
|
||||
* version 2. This program is licensed "as is" without any warranty of any
|
||||
* kind, whether express or implied.
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
/ {
|
||||
model = "fsl,P1022";
|
||||
compatible = "fsl,P1022DS";
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
interrupt-parent = <&mpic>;
|
||||
|
||||
aliases {
|
||||
ethernet0 = &enet0;
|
||||
ethernet1 = &enet1;
|
||||
serial0 = &serial0;
|
||||
serial1 = &serial1;
|
||||
pci0 = &pci0;
|
||||
pci1 = &pci1;
|
||||
pci2 = &pci2;
|
||||
};
|
||||
|
||||
cpus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
PowerPC,P1022@0 {
|
||||
device_type = "cpu";
|
||||
reg = <0x0>;
|
||||
next-level-cache = <&L2>;
|
||||
};
|
||||
|
||||
PowerPC,P1022@1 {
|
||||
device_type = "cpu";
|
||||
reg = <0x1>;
|
||||
next-level-cache = <&L2>;
|
||||
};
|
||||
};
|
||||
|
||||
memory {
|
||||
device_type = "memory";
|
||||
};
|
||||
|
||||
localbus@fffe05000 {
|
||||
#address-cells = <2>;
|
||||
#size-cells = <1>;
|
||||
compatible = "fsl,p1022-elbc", "fsl,elbc", "simple-bus";
|
||||
reg = <0 0xffe05000 0 0x1000>;
|
||||
interrupts = <19 2>;
|
||||
|
||||
ranges = <0x0 0x0 0xf 0xe8000000 0x08000000
|
||||
0x1 0x0 0xf 0xe0000000 0x08000000
|
||||
0x2 0x0 0x0 0xffa00000 0x00040000
|
||||
0x3 0x0 0xf 0xffdf0000 0x00008000>;
|
||||
|
||||
nor@0,0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "cfi-flash";
|
||||
reg = <0x0 0x0 0x8000000>;
|
||||
bank-width = <2>;
|
||||
device-width = <1>;
|
||||
|
||||
partition@0 {
|
||||
reg = <0x0 0x03000000>;
|
||||
label = "ramdisk-nor";
|
||||
read-only;
|
||||
};
|
||||
|
||||
partition@3000000 {
|
||||
reg = <0x03000000 0x00e00000>;
|
||||
label = "diagnostic-nor";
|
||||
read-only;
|
||||
};
|
||||
|
||||
partition@3e00000 {
|
||||
reg = <0x03e00000 0x00200000>;
|
||||
label = "dink-nor";
|
||||
read-only;
|
||||
};
|
||||
|
||||
partition@4000000 {
|
||||
reg = <0x04000000 0x00400000>;
|
||||
label = "kernel-nor";
|
||||
read-only;
|
||||
};
|
||||
|
||||
partition@4400000 {
|
||||
reg = <0x04400000 0x03b00000>;
|
||||
label = "jffs2-nor";
|
||||
};
|
||||
|
||||
partition@7f00000 {
|
||||
reg = <0x07f00000 0x00080000>;
|
||||
label = "dtb-nor";
|
||||
read-only;
|
||||
};
|
||||
|
||||
partition@7f80000 {
|
||||
reg = <0x07f80000 0x00080000>;
|
||||
label = "u-boot-nor";
|
||||
read-only;
|
||||
};
|
||||
};
|
||||
|
||||
nand@2,0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "fsl,elbc-fcm-nand";
|
||||
reg = <0x2 0x0 0x40000>;
|
||||
|
||||
partition@0 {
|
||||
reg = <0x0 0x02000000>;
|
||||
label = "u-boot-nand";
|
||||
read-only;
|
||||
};
|
||||
|
||||
partition@2000000 {
|
||||
reg = <0x02000000 0x10000000>;
|
||||
label = "jffs2-nand";
|
||||
};
|
||||
|
||||
partition@12000000 {
|
||||
reg = <0x12000000 0x10000000>;
|
||||
label = "ramdisk-nand";
|
||||
read-only;
|
||||
};
|
||||
|
||||
partition@22000000 {
|
||||
reg = <0x22000000 0x04000000>;
|
||||
label = "kernel-nand";
|
||||
};
|
||||
|
||||
partition@26000000 {
|
||||
reg = <0x26000000 0x01000000>;
|
||||
label = "dtb-nand";
|
||||
read-only;
|
||||
};
|
||||
|
||||
partition@27000000 {
|
||||
reg = <0x27000000 0x19000000>;
|
||||
label = "reserved-nand";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
soc@fffe00000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
device_type = "soc";
|
||||
compatible = "fsl,p1022-immr", "simple-bus";
|
||||
ranges = <0x0 0xf 0xffe00000 0x100000>;
|
||||
bus-frequency = <0>; // Filled out by uboot.
|
||||
|
||||
ecm-law@0 {
|
||||
compatible = "fsl,ecm-law";
|
||||
reg = <0x0 0x1000>;
|
||||
fsl,num-laws = <12>;
|
||||
};
|
||||
|
||||
ecm@1000 {
|
||||
compatible = "fsl,p1022-ecm", "fsl,ecm";
|
||||
reg = <0x1000 0x1000>;
|
||||
interrupts = <16 2>;
|
||||
};
|
||||
|
||||
memory-controller@2000 {
|
||||
compatible = "fsl,p1022-memory-controller";
|
||||
reg = <0x2000 0x1000>;
|
||||
interrupts = <16 2>;
|
||||
};
|
||||
|
||||
i2c@3000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
cell-index = <0>;
|
||||
compatible = "fsl-i2c";
|
||||
reg = <0x3000 0x100>;
|
||||
interrupts = <43 2>;
|
||||
dfsrr;
|
||||
};
|
||||
|
||||
i2c@3100 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
cell-index = <1>;
|
||||
compatible = "fsl-i2c";
|
||||
reg = <0x3100 0x100>;
|
||||
interrupts = <43 2>;
|
||||
dfsrr;
|
||||
|
||||
wm8776:codec@1a {
|
||||
compatible = "wlf,wm8776";
|
||||
reg = <0x1a>;
|
||||
/* MCLK source is a stand-alone oscillator */
|
||||
clock-frequency = <12288000>;
|
||||
};
|
||||
};
|
||||
|
||||
serial0: serial@4500 {
|
||||
cell-index = <0>;
|
||||
device_type = "serial";
|
||||
compatible = "ns16550";
|
||||
reg = <0x4500 0x100>;
|
||||
clock-frequency = <0>;
|
||||
interrupts = <42 2>;
|
||||
};
|
||||
|
||||
serial1: serial@4600 {
|
||||
cell-index = <1>;
|
||||
device_type = "serial";
|
||||
compatible = "ns16550";
|
||||
reg = <0x4600 0x100>;
|
||||
clock-frequency = <0>;
|
||||
interrupts = <42 2>;
|
||||
};
|
||||
|
||||
spi@7000 {
|
||||
cell-index = <0>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "fsl,espi";
|
||||
reg = <0x7000 0x1000>;
|
||||
interrupts = <59 0x2>;
|
||||
espi,num-ss-bits = <4>;
|
||||
mode = "cpu";
|
||||
|
||||
fsl_m25p80@0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "fsl,espi-flash";
|
||||
reg = <0>;
|
||||
linux,modalias = "fsl_m25p80";
|
||||
spi-max-frequency = <40000000>; /* input clock */
|
||||
partition@0 {
|
||||
label = "u-boot-spi";
|
||||
reg = <0x00000000 0x00100000>;
|
||||
read-only;
|
||||
};
|
||||
partition@100000 {
|
||||
label = "kernel-spi";
|
||||
reg = <0x00100000 0x00500000>;
|
||||
read-only;
|
||||
};
|
||||
partition@600000 {
|
||||
label = "dtb-spi";
|
||||
reg = <0x00600000 0x00100000>;
|
||||
read-only;
|
||||
};
|
||||
partition@700000 {
|
||||
label = "file system-spi";
|
||||
reg = <0x00700000 0x00900000>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
ssi@15000 {
|
||||
compatible = "fsl,mpc8610-ssi";
|
||||
cell-index = <0>;
|
||||
reg = <0x15000 0x100>;
|
||||
interrupts = <75 2>;
|
||||
fsl,mode = "i2s-slave";
|
||||
codec-handle = <&wm8776>;
|
||||
fsl,playback-dma = <&dma00>;
|
||||
fsl,capture-dma = <&dma01>;
|
||||
fsl,fifo-depth = <16>;
|
||||
};
|
||||
|
||||
dma@c300 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "fsl,eloplus-dma";
|
||||
reg = <0xc300 0x4>;
|
||||
ranges = <0x0 0xc100 0x200>;
|
||||
cell-index = <1>;
|
||||
dma00: dma-channel@0 {
|
||||
compatible = "fsl,eloplus-dma-channel";
|
||||
reg = <0x0 0x80>;
|
||||
cell-index = <0>;
|
||||
interrupts = <76 2>;
|
||||
};
|
||||
dma01: dma-channel@80 {
|
||||
compatible = "fsl,eloplus-dma-channel";
|
||||
reg = <0x80 0x80>;
|
||||
cell-index = <1>;
|
||||
interrupts = <77 2>;
|
||||
};
|
||||
dma-channel@100 {
|
||||
compatible = "fsl,eloplus-dma-channel";
|
||||
reg = <0x100 0x80>;
|
||||
cell-index = <2>;
|
||||
interrupts = <78 2>;
|
||||
};
|
||||
dma-channel@180 {
|
||||
compatible = "fsl,eloplus-dma-channel";
|
||||
reg = <0x180 0x80>;
|
||||
cell-index = <3>;
|
||||
interrupts = <79 2>;
|
||||
};
|
||||
};
|
||||
|
||||
gpio: gpio-controller@f000 {
|
||||
#gpio-cells = <2>;
|
||||
compatible = "fsl,mpc8572-gpio";
|
||||
reg = <0xf000 0x100>;
|
||||
interrupts = <47 0x2>;
|
||||
gpio-controller;
|
||||
};
|
||||
|
||||
L2: l2-cache-controller@20000 {
|
||||
compatible = "fsl,p1022-l2-cache-controller";
|
||||
reg = <0x20000 0x1000>;
|
||||
cache-line-size = <32>; // 32 bytes
|
||||
cache-size = <0x40000>; // L2, 256K
|
||||
interrupts = <16 2>;
|
||||
};
|
||||
|
||||
dma@21300 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "fsl,eloplus-dma";
|
||||
reg = <0x21300 0x4>;
|
||||
ranges = <0x0 0x21100 0x200>;
|
||||
cell-index = <0>;
|
||||
dma-channel@0 {
|
||||
compatible = "fsl,eloplus-dma-channel";
|
||||
reg = <0x0 0x80>;
|
||||
cell-index = <0>;
|
||||
interrupts = <20 2>;
|
||||
};
|
||||
dma-channel@80 {
|
||||
compatible = "fsl,eloplus-dma-channel";
|
||||
reg = <0x80 0x80>;
|
||||
cell-index = <1>;
|
||||
interrupts = <21 2>;
|
||||
};
|
||||
dma-channel@100 {
|
||||
compatible = "fsl,eloplus-dma-channel";
|
||||
reg = <0x100 0x80>;
|
||||
cell-index = <2>;
|
||||
interrupts = <22 2>;
|
||||
};
|
||||
dma-channel@180 {
|
||||
compatible = "fsl,eloplus-dma-channel";
|
||||
reg = <0x180 0x80>;
|
||||
cell-index = <3>;
|
||||
interrupts = <23 2>;
|
||||
};
|
||||
};
|
||||
|
||||
usb@22000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "fsl-usb2-dr";
|
||||
reg = <0x22000 0x1000>;
|
||||
interrupts = <28 0x2>;
|
||||
phy_type = "ulpi";
|
||||
};
|
||||
|
||||
mdio@24000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "fsl,etsec2-mdio";
|
||||
reg = <0x24000 0x1000 0xb0030 0x4>;
|
||||
|
||||
phy0: ethernet-phy@0 {
|
||||
interrupts = <3 1>;
|
||||
reg = <0x1>;
|
||||
};
|
||||
phy1: ethernet-phy@1 {
|
||||
interrupts = <9 1>;
|
||||
reg = <0x2>;
|
||||
};
|
||||
};
|
||||
|
||||
mdio@25000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "fsl,etsec2-mdio";
|
||||
reg = <0x25000 0x1000 0xb1030 0x4>;
|
||||
};
|
||||
|
||||
enet0: ethernet@B0000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
cell-index = <0>;
|
||||
device_type = "network";
|
||||
model = "eTSEC";
|
||||
compatible = "fsl,etsec2";
|
||||
fsl,num_rx_queues = <0x8>;
|
||||
fsl,num_tx_queues = <0x8>;
|
||||
fsl,magic-packet;
|
||||
fsl,wake-on-filer;
|
||||
local-mac-address = [ 00 00 00 00 00 00 ];
|
||||
fixed-link = <1 1 1000 0 0>;
|
||||
phy-handle = <&phy0>;
|
||||
phy-connection-type = "rgmii-id";
|
||||
queue-group@0{
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
reg = <0xB0000 0x1000>;
|
||||
interrupts = <29 2 30 2 34 2>;
|
||||
};
|
||||
queue-group@1{
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
reg = <0xB4000 0x1000>;
|
||||
interrupts = <17 2 18 2 24 2>;
|
||||
};
|
||||
};
|
||||
|
||||
enet1: ethernet@B1000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
cell-index = <0>;
|
||||
device_type = "network";
|
||||
model = "eTSEC";
|
||||
compatible = "fsl,etsec2";
|
||||
fsl,num_rx_queues = <0x8>;
|
||||
fsl,num_tx_queues = <0x8>;
|
||||
local-mac-address = [ 00 00 00 00 00 00 ];
|
||||
fixed-link = <1 1 1000 0 0>;
|
||||
phy-handle = <&phy1>;
|
||||
phy-connection-type = "rgmii-id";
|
||||
queue-group@0{
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
reg = <0xB1000 0x1000>;
|
||||
interrupts = <35 2 36 2 40 2>;
|
||||
};
|
||||
queue-group@1{
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
reg = <0xB5000 0x1000>;
|
||||
interrupts = <51 2 52 2 67 2>;
|
||||
};
|
||||
};
|
||||
|
||||
sdhci@2e000 {
|
||||
compatible = "fsl,p1022-esdhc", "fsl,esdhc";
|
||||
reg = <0x2e000 0x1000>;
|
||||
interrupts = <72 0x2>;
|
||||
fsl,sdhci-auto-cmd12;
|
||||
/* Filled in by U-Boot */
|
||||
clock-frequency = <0>;
|
||||
};
|
||||
|
||||
crypto@30000 {
|
||||
compatible = "fsl,sec3.3", "fsl,sec3.1", "fsl,sec3.0",
|
||||
"fsl,sec2.4", "fsl,sec2.2", "fsl,sec2.1",
|
||||
"fsl,sec2.0";
|
||||
reg = <0x30000 0x10000>;
|
||||
interrupts = <45 2 58 2>;
|
||||
fsl,num-channels = <4>;
|
||||
fsl,channel-fifo-len = <24>;
|
||||
fsl,exec-units-mask = <0x97c>;
|
||||
fsl,descriptor-types-mask = <0x3a30abf>;
|
||||
};
|
||||
|
||||
sata@18000 {
|
||||
compatible = "fsl,mpc8536-sata", "fsl,pq-sata";
|
||||
reg = <0x18000 0x1000>;
|
||||
cell-index = <1>;
|
||||
interrupts = <74 0x2>;
|
||||
};
|
||||
|
||||
sata@19000 {
|
||||
compatible = "fsl,mpc8536-sata", "fsl,pq-sata";
|
||||
reg = <0x19000 0x1000>;
|
||||
cell-index = <2>;
|
||||
interrupts = <41 0x2>;
|
||||
};
|
||||
|
||||
power@e0070{
|
||||
compatible = "fsl,mpc8536-pmc", "fsl,mpc8548-pmc";
|
||||
reg = <0xe0070 0x20>;
|
||||
};
|
||||
|
||||
display@10000 {
|
||||
compatible = "fsl,diu", "fsl,p1022-diu";
|
||||
reg = <0x10000 1000>;
|
||||
interrupts = <64 2>;
|
||||
};
|
||||
|
||||
timer@41100 {
|
||||
compatible = "fsl,mpic-global-timer";
|
||||
reg = <0x41100 0x204>;
|
||||
interrupts = <0xf7 0x2>;
|
||||
};
|
||||
|
||||
mpic: pic@40000 {
|
||||
interrupt-controller;
|
||||
#address-cells = <0>;
|
||||
#interrupt-cells = <2>;
|
||||
reg = <0x40000 0x40000>;
|
||||
compatible = "chrp,open-pic";
|
||||
device_type = "open-pic";
|
||||
};
|
||||
|
||||
msi@41600 {
|
||||
compatible = "fsl,p1022-msi", "fsl,mpic-msi";
|
||||
reg = <0x41600 0x80>;
|
||||
msi-available-ranges = <0 0x100>;
|
||||
interrupts = <
|
||||
0xe0 0
|
||||
0xe1 0
|
||||
0xe2 0
|
||||
0xe3 0
|
||||
0xe4 0
|
||||
0xe5 0
|
||||
0xe6 0
|
||||
0xe7 0>;
|
||||
};
|
||||
|
||||
global-utilities@e0000 { //global utilities block
|
||||
compatible = "fsl,p1022-guts";
|
||||
reg = <0xe0000 0x1000>;
|
||||
fsl,has-rstcr;
|
||||
};
|
||||
};
|
||||
|
||||
pci0: pcie@fffe09000 {
|
||||
compatible = "fsl,p1022-pcie";
|
||||
device_type = "pci";
|
||||
#interrupt-cells = <1>;
|
||||
#size-cells = <2>;
|
||||
#address-cells = <3>;
|
||||
reg = <0xf 0xffe09000 0 0x1000>;
|
||||
bus-range = <0 255>;
|
||||
ranges = <0x2000000 0x0 0xa0000000 0xc 0x20000000 0x0 0x20000000
|
||||
0x1000000 0x0 0x00000000 0xf 0xffc10000 0x0 0x10000>;
|
||||
clock-frequency = <33333333>;
|
||||
interrupts = <16 2>;
|
||||
interrupt-map-mask = <0xf800 0 0 7>;
|
||||
interrupt-map = <
|
||||
/* IDSEL 0x0 */
|
||||
0000 0 0 1 &mpic 4 1
|
||||
0000 0 0 2 &mpic 5 1
|
||||
0000 0 0 3 &mpic 6 1
|
||||
0000 0 0 4 &mpic 7 1
|
||||
>;
|
||||
pcie@0 {
|
||||
reg = <0x0 0x0 0x0 0x0 0x0>;
|
||||
#size-cells = <2>;
|
||||
#address-cells = <3>;
|
||||
device_type = "pci";
|
||||
ranges = <0x2000000 0x0 0xe0000000
|
||||
0x2000000 0x0 0xe0000000
|
||||
0x0 0x20000000
|
||||
|
||||
0x1000000 0x0 0x0
|
||||
0x1000000 0x0 0x0
|
||||
0x0 0x100000>;
|
||||
};
|
||||
};
|
||||
|
||||
pci1: pcie@fffe0a000 {
|
||||
compatible = "fsl,p1022-pcie";
|
||||
device_type = "pci";
|
||||
#interrupt-cells = <1>;
|
||||
#size-cells = <2>;
|
||||
#address-cells = <3>;
|
||||
reg = <0xf 0xffe0a000 0 0x1000>;
|
||||
bus-range = <0 255>;
|
||||
ranges = <0x2000000 0x0 0xc0000000 0xc 0x40000000 0x0 0x20000000
|
||||
0x1000000 0x0 0x00000000 0xf 0xffc20000 0x0 0x10000>;
|
||||
clock-frequency = <33333333>;
|
||||
interrupts = <16 2>;
|
||||
interrupt-map-mask = <0xf800 0 0 7>;
|
||||
interrupt-map = <
|
||||
/* IDSEL 0x0 */
|
||||
0000 0 0 1 &mpic 0 1
|
||||
0000 0 0 2 &mpic 1 1
|
||||
0000 0 0 3 &mpic 2 1
|
||||
0000 0 0 4 &mpic 3 1
|
||||
>;
|
||||
pcie@0 {
|
||||
reg = <0x0 0x0 0x0 0x0 0x0>;
|
||||
#size-cells = <2>;
|
||||
#address-cells = <3>;
|
||||
device_type = "pci";
|
||||
ranges = <0x2000000 0x0 0xe0000000
|
||||
0x2000000 0x0 0xe0000000
|
||||
0x0 0x20000000
|
||||
|
||||
0x1000000 0x0 0x0
|
||||
0x1000000 0x0 0x0
|
||||
0x0 0x100000>;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
pci2: pcie@fffe0b000 {
|
||||
compatible = "fsl,p1022-pcie";
|
||||
device_type = "pci";
|
||||
#interrupt-cells = <1>;
|
||||
#size-cells = <2>;
|
||||
#address-cells = <3>;
|
||||
reg = <0xf 0xffe0b000 0 0x1000>;
|
||||
bus-range = <0 255>;
|
||||
ranges = <0x2000000 0x0 0x80000000 0xc 0x00000000 0x0 0x20000000
|
||||
0x1000000 0x0 0x00000000 0xf 0xffc00000 0x0 0x10000>;
|
||||
clock-frequency = <33333333>;
|
||||
interrupts = <16 2>;
|
||||
interrupt-map-mask = <0xf800 0 0 7>;
|
||||
interrupt-map = <
|
||||
/* IDSEL 0x0 */
|
||||
0000 0 0 1 &mpic 8 1
|
||||
0000 0 0 2 &mpic 9 1
|
||||
0000 0 0 3 &mpic 10 1
|
||||
0000 0 0 4 &mpic 11 1
|
||||
>;
|
||||
pcie@0 {
|
||||
reg = <0x0 0x0 0x0 0x0 0x0>;
|
||||
#size-cells = <2>;
|
||||
#address-cells = <3>;
|
||||
device_type = "pci";
|
||||
ranges = <0x2000000 0x0 0xe0000000
|
||||
0x2000000 0x0 0xe0000000
|
||||
0x0 0x20000000
|
||||
|
||||
0x1000000 0x0 0x0
|
||||
0x1000000 0x0 0x0
|
||||
0x0 0x100000>;
|
||||
};
|
||||
};
|
||||
};
|
410
arch/powerpc/boot/dts/pdm360ng.dts
Normal file
410
arch/powerpc/boot/dts/pdm360ng.dts
Normal file
@ -0,0 +1,410 @@
|
||||
/*
|
||||
* Device Tree Source for IFM PDM360NG.
|
||||
*
|
||||
* Copyright 2009 - 2010 DENX Software Engineering.
|
||||
* Anatolij Gustschin <agust@denx.de>
|
||||
*
|
||||
* Based on MPC5121E ADS dts.
|
||||
* Copyright 2008 Freescale Semiconductor Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
/ {
|
||||
model = "pdm360ng";
|
||||
compatible = "ifm,pdm360ng";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
interrupt-parent = <&ipic>;
|
||||
|
||||
aliases {
|
||||
ethernet0 = ð0;
|
||||
};
|
||||
|
||||
cpus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
PowerPC,5121@0 {
|
||||
device_type = "cpu";
|
||||
reg = <0>;
|
||||
d-cache-line-size = <0x20>; // 32 bytes
|
||||
i-cache-line-size = <0x20>; // 32 bytes
|
||||
d-cache-size = <0x8000>; // L1, 32K
|
||||
i-cache-size = <0x8000>; // L1, 32K
|
||||
timebase-frequency = <49500000>;// 49.5 MHz (csb/4)
|
||||
bus-frequency = <198000000>; // 198 MHz csb bus
|
||||
clock-frequency = <396000000>; // 396 MHz ppc core
|
||||
};
|
||||
};
|
||||
|
||||
memory {
|
||||
device_type = "memory";
|
||||
reg = <0x00000000 0x20000000>; // 512MB at 0
|
||||
};
|
||||
|
||||
nfc@40000000 {
|
||||
compatible = "fsl,mpc5121-nfc";
|
||||
reg = <0x40000000 0x100000>;
|
||||
interrupts = <0x6 0x8>;
|
||||
#address-cells = <0x1>;
|
||||
#size-cells = <0x1>;
|
||||
bank-width = <0x1>;
|
||||
chips = <0x1>;
|
||||
|
||||
partition@0 {
|
||||
label = "nand0";
|
||||
reg = <0x0 0x40000000>;
|
||||
};
|
||||
};
|
||||
|
||||
sram@50000000 {
|
||||
compatible = "fsl,mpc5121-sram";
|
||||
reg = <0x50000000 0x20000>; // 128K at 0x50000000
|
||||
};
|
||||
|
||||
localbus@80000020 {
|
||||
compatible = "fsl,mpc5121-localbus";
|
||||
#address-cells = <2>;
|
||||
#size-cells = <1>;
|
||||
reg = <0x80000020 0x40>;
|
||||
|
||||
ranges = <0x0 0x0 0xf0000000 0x10000000 /* Flash */
|
||||
0x2 0x0 0x50040000 0x00020000>; /* CS2: MRAM */
|
||||
|
||||
flash@0,0 {
|
||||
compatible = "amd,s29gl01gp", "cfi-flash";
|
||||
reg = <0 0x00000000 0x08000000
|
||||
0 0x08000000 0x08000000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
bank-width = <4>;
|
||||
device-width = <2>;
|
||||
|
||||
partition@0 {
|
||||
label = "u-boot";
|
||||
reg = <0x00000000 0x00080000>;
|
||||
read-only;
|
||||
};
|
||||
partition@80000 {
|
||||
label = "environment";
|
||||
reg = <0x00080000 0x00080000>;
|
||||
read-only;
|
||||
};
|
||||
partition@100000 {
|
||||
label = "splash-image";
|
||||
reg = <0x00100000 0x00080000>;
|
||||
read-only;
|
||||
};
|
||||
partition@180000 {
|
||||
label = "device-tree";
|
||||
reg = <0x00180000 0x00040000>;
|
||||
};
|
||||
partition@1c0000 {
|
||||
label = "kernel";
|
||||
reg = <0x001c0000 0x00500000>;
|
||||
};
|
||||
partition@6c0000 {
|
||||
label = "filesystem";
|
||||
reg = <0x006c0000 0x07940000>;
|
||||
};
|
||||
};
|
||||
|
||||
mram0@2,0 {
|
||||
compatible = "mtd-ram";
|
||||
reg = <2 0x00000 0x10000>;
|
||||
bank-width = <2>;
|
||||
};
|
||||
|
||||
mram1@2,10000 {
|
||||
compatible = "mtd-ram";
|
||||
reg = <2 0x010000 0x10000>;
|
||||
bank-width = <2>;
|
||||
};
|
||||
};
|
||||
|
||||
soc@80000000 {
|
||||
compatible = "fsl,mpc5121-immr";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
#interrupt-cells = <2>;
|
||||
ranges = <0x0 0x80000000 0x400000>;
|
||||
reg = <0x80000000 0x400000>;
|
||||
bus-frequency = <66000000>; // 66 MHz ips bus
|
||||
|
||||
// IPIC
|
||||
// interrupts cell = <intr #, sense>
|
||||
// sense values match linux IORESOURCE_IRQ_* defines:
|
||||
// sense == 8: Level, low assertion
|
||||
// sense == 2: Edge, high-to-low change
|
||||
//
|
||||
ipic: interrupt-controller@c00 {
|
||||
compatible = "fsl,mpc5121-ipic", "fsl,ipic";
|
||||
interrupt-controller;
|
||||
#address-cells = <0>;
|
||||
#interrupt-cells = <2>;
|
||||
reg = <0xc00 0x100>;
|
||||
};
|
||||
|
||||
rtc@a00 { // Real time clock
|
||||
compatible = "fsl,mpc5121-rtc";
|
||||
reg = <0xa00 0x100>;
|
||||
interrupts = <79 0x8 80 0x8>;
|
||||
};
|
||||
|
||||
reset@e00 { // Reset module
|
||||
compatible = "fsl,mpc5121-reset";
|
||||
reg = <0xe00 0x100>;
|
||||
};
|
||||
|
||||
clock@f00 { // Clock control
|
||||
compatible = "fsl,mpc5121-clock";
|
||||
reg = <0xf00 0x100>;
|
||||
};
|
||||
|
||||
pmc@1000{ //Power Management Controller
|
||||
compatible = "fsl,mpc5121-pmc";
|
||||
reg = <0x1000 0x100>;
|
||||
interrupts = <83 0x2>;
|
||||
};
|
||||
|
||||
gpio@1100 {
|
||||
compatible = "fsl,mpc5121-gpio";
|
||||
reg = <0x1100 0x100>;
|
||||
interrupts = <78 0x8>;
|
||||
};
|
||||
|
||||
can@1300 {
|
||||
compatible = "fsl,mpc5121-mscan";
|
||||
interrupts = <12 0x8>;
|
||||
reg = <0x1300 0x80>;
|
||||
};
|
||||
|
||||
can@1380 {
|
||||
compatible = "fsl,mpc5121-mscan";
|
||||
interrupts = <13 0x8>;
|
||||
reg = <0x1380 0x80>;
|
||||
};
|
||||
|
||||
i2c@1700 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "fsl,mpc5121-i2c";
|
||||
reg = <0x1700 0x20>;
|
||||
interrupts = <0x9 0x8>;
|
||||
fsl,preserve-clocking;
|
||||
|
||||
eeprom@50 {
|
||||
compatible = "at,24c01";
|
||||
reg = <0x50>;
|
||||
};
|
||||
|
||||
rtc@68 {
|
||||
compatible = "stm,m41t00";
|
||||
reg = <0x68>;
|
||||
};
|
||||
};
|
||||
|
||||
i2c@1740 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "fsl,mpc5121-i2c";
|
||||
reg = <0x1740 0x20>;
|
||||
interrupts = <0xb 0x8>;
|
||||
fsl,preserve-clocking;
|
||||
};
|
||||
|
||||
i2ccontrol@1760 {
|
||||
compatible = "fsl,mpc5121-i2c-ctrl";
|
||||
reg = <0x1760 0x8>;
|
||||
};
|
||||
|
||||
axe@2000 {
|
||||
compatible = "fsl,mpc5121-axe";
|
||||
reg = <0x2000 0x100>;
|
||||
interrupts = <42 0x8>;
|
||||
};
|
||||
|
||||
display@2100 {
|
||||
compatible = "fsl,mpc5121-diu";
|
||||
reg = <0x2100 0x100>;
|
||||
interrupts = <64 0x8>;
|
||||
};
|
||||
|
||||
can@2300 {
|
||||
compatible = "fsl,mpc5121-mscan";
|
||||
interrupts = <90 0x8>;
|
||||
reg = <0x2300 0x80>;
|
||||
};
|
||||
|
||||
can@2380 {
|
||||
compatible = "fsl,mpc5121-mscan";
|
||||
interrupts = <91 0x8>;
|
||||
reg = <0x2380 0x80>;
|
||||
};
|
||||
|
||||
viu@2400 {
|
||||
compatible = "fsl,mpc5121-viu";
|
||||
reg = <0x2400 0x400>;
|
||||
interrupts = <67 0x8>;
|
||||
};
|
||||
|
||||
mdio@2800 {
|
||||
compatible = "fsl,mpc5121-fec-mdio";
|
||||
reg = <0x2800 0x200>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
phy: ethernet-phy@0 {
|
||||
compatible = "smsc,lan8700";
|
||||
reg = <0x1f>;
|
||||
};
|
||||
};
|
||||
|
||||
eth0: ethernet@2800 {
|
||||
compatible = "fsl,mpc5121-fec";
|
||||
reg = <0x2800 0x200>;
|
||||
local-mac-address = [ 00 00 00 00 00 00 ];
|
||||
interrupts = <4 0x8>;
|
||||
phy-handle = < &phy >;
|
||||
};
|
||||
|
||||
// USB1 using external ULPI PHY
|
||||
usb@3000 {
|
||||
compatible = "fsl,mpc5121-usb2-dr";
|
||||
reg = <0x3000 0x600>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
interrupts = <43 0x8>;
|
||||
dr_mode = "host";
|
||||
phy_type = "ulpi";
|
||||
};
|
||||
|
||||
// USB0 using internal UTMI PHY
|
||||
usb@4000 {
|
||||
compatible = "fsl,mpc5121-usb2-dr";
|
||||
reg = <0x4000 0x600>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
interrupts = <44 0x8>;
|
||||
dr_mode = "otg";
|
||||
phy_type = "utmi_wide";
|
||||
fsl,invert-pwr-fault;
|
||||
};
|
||||
|
||||
// IO control
|
||||
ioctl@a000 {
|
||||
compatible = "fsl,mpc5121-ioctl";
|
||||
reg = <0xA000 0x1000>;
|
||||
};
|
||||
|
||||
// 512x PSCs are not 52xx PSCs compatible
|
||||
serial@11000 {
|
||||
compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc";
|
||||
cell-index = <0>;
|
||||
reg = <0x11000 0x100>;
|
||||
interrupts = <40 0x8>;
|
||||
fsl,rx-fifo-size = <16>;
|
||||
fsl,tx-fifo-size = <16>;
|
||||
};
|
||||
|
||||
serial@11100 {
|
||||
compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc";
|
||||
cell-index = <1>;
|
||||
reg = <0x11100 0x100>;
|
||||
interrupts = <40 0x8>;
|
||||
fsl,rx-fifo-size = <16>;
|
||||
fsl,tx-fifo-size = <16>;
|
||||
};
|
||||
|
||||
serial@11200 {
|
||||
compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc";
|
||||
cell-index = <2>;
|
||||
reg = <0x11200 0x100>;
|
||||
interrupts = <40 0x8>;
|
||||
fsl,rx-fifo-size = <16>;
|
||||
fsl,tx-fifo-size = <16>;
|
||||
};
|
||||
|
||||
serial@11300 {
|
||||
compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc";
|
||||
cell-index = <3>;
|
||||
reg = <0x11300 0x100>;
|
||||
interrupts = <40 0x8>;
|
||||
fsl,rx-fifo-size = <16>;
|
||||
fsl,tx-fifo-size = <16>;
|
||||
};
|
||||
|
||||
serial@11400 {
|
||||
compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc";
|
||||
cell-index = <4>;
|
||||
reg = <0x11400 0x100>;
|
||||
interrupts = <40 0x8>;
|
||||
fsl,rx-fifo-size = <16>;
|
||||
fsl,tx-fifo-size = <16>;
|
||||
};
|
||||
|
||||
serial@11600 {
|
||||
compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc";
|
||||
cell-index = <6>;
|
||||
reg = <0x11600 0x100>;
|
||||
interrupts = <40 0x8>;
|
||||
fsl,rx-fifo-size = <16>;
|
||||
fsl,tx-fifo-size = <16>;
|
||||
};
|
||||
|
||||
serial@11800 {
|
||||
compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc";
|
||||
cell-index = <8>;
|
||||
reg = <0x11800 0x100>;
|
||||
interrupts = <40 0x8>;
|
||||
fsl,rx-fifo-size = <16>;
|
||||
fsl,tx-fifo-size = <16>;
|
||||
};
|
||||
|
||||
serial@11B00 {
|
||||
compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc";
|
||||
cell-index = <11>;
|
||||
reg = <0x11B00 0x100>;
|
||||
interrupts = <40 0x8>;
|
||||
fsl,rx-fifo-size = <16>;
|
||||
fsl,tx-fifo-size = <16>;
|
||||
};
|
||||
|
||||
pscfifo@11f00 {
|
||||
compatible = "fsl,mpc5121-psc-fifo";
|
||||
reg = <0x11f00 0x100>;
|
||||
interrupts = <40 0x8>;
|
||||
};
|
||||
|
||||
spi@11900 {
|
||||
compatible = "fsl,mpc5121-psc-spi", "fsl,mpc5121-psc";
|
||||
cell-index = <9>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
reg = <0x11900 0x100>;
|
||||
interrupts = <40 0x8>;
|
||||
fsl,rx-fifo-size = <16>;
|
||||
fsl,tx-fifo-size = <16>;
|
||||
|
||||
// 7845 touch screen controller
|
||||
ts@0 {
|
||||
compatible = "ti,ads7846";
|
||||
reg = <0x0>;
|
||||
spi-max-frequency = <3000000>;
|
||||
// pen irq is GPIO25
|
||||
interrupts = <78 0x8>;
|
||||
};
|
||||
};
|
||||
|
||||
dma@14000 {
|
||||
compatible = "fsl,mpc5121-dma";
|
||||
reg = <0x14000 0x1800>;
|
||||
interrupts = <65 0x8>;
|
||||
};
|
||||
};
|
||||
};
|
380
arch/powerpc/boot/dts/stxssa8555.dts
Normal file
380
arch/powerpc/boot/dts/stxssa8555.dts
Normal file
@ -0,0 +1,380 @@
|
||||
/*
|
||||
* MPC8555-based STx GP3 Device Tree Source
|
||||
*
|
||||
* Copyright 2006, 2008 Freescale Semiconductor Inc.
|
||||
*
|
||||
* Copyright 2010 Silicon Turnkey Express LLC.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
/ {
|
||||
model = "stx,gp3";
|
||||
compatible = "stx,gp3-8560", "stx,gp3";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
aliases {
|
||||
ethernet0 = &enet0;
|
||||
ethernet1 = &enet1;
|
||||
serial0 = &serial0;
|
||||
serial1 = &serial1;
|
||||
pci0 = &pci0;
|
||||
};
|
||||
|
||||
cpus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
PowerPC,8555@0 {
|
||||
device_type = "cpu";
|
||||
reg = <0x0>;
|
||||
d-cache-line-size = <32>; // 32 bytes
|
||||
i-cache-line-size = <32>; // 32 bytes
|
||||
d-cache-size = <0x8000>; // L1, 32K
|
||||
i-cache-size = <0x8000>; // L1, 32K
|
||||
timebase-frequency = <0>; // 33 MHz, from uboot
|
||||
bus-frequency = <0>; // 166 MHz
|
||||
clock-frequency = <0>; // 825 MHz, from uboot
|
||||
next-level-cache = <&L2>;
|
||||
};
|
||||
};
|
||||
|
||||
memory {
|
||||
device_type = "memory";
|
||||
reg = <0x00000000 0x10000000>;
|
||||
};
|
||||
|
||||
soc8555@e0000000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
device_type = "soc";
|
||||
compatible = "simple-bus";
|
||||
ranges = <0x0 0xe0000000 0x100000>;
|
||||
bus-frequency = <0>;
|
||||
|
||||
ecm-law@0 {
|
||||
compatible = "fsl,ecm-law";
|
||||
reg = <0x0 0x1000>;
|
||||
fsl,num-laws = <8>;
|
||||
};
|
||||
|
||||
ecm@1000 {
|
||||
compatible = "fsl,mpc8555-ecm", "fsl,ecm";
|
||||
reg = <0x1000 0x1000>;
|
||||
interrupts = <17 2>;
|
||||
interrupt-parent = <&mpic>;
|
||||
};
|
||||
|
||||
memory-controller@2000 {
|
||||
compatible = "fsl,mpc8555-memory-controller";
|
||||
reg = <0x2000 0x1000>;
|
||||
interrupt-parent = <&mpic>;
|
||||
interrupts = <18 2>;
|
||||
};
|
||||
|
||||
L2: l2-cache-controller@20000 {
|
||||
compatible = "fsl,mpc8555-l2-cache-controller";
|
||||
reg = <0x20000 0x1000>;
|
||||
cache-line-size = <32>; // 32 bytes
|
||||
cache-size = <0x40000>; // L2, 256K
|
||||
interrupt-parent = <&mpic>;
|
||||
interrupts = <16 2>;
|
||||
};
|
||||
|
||||
i2c@3000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
cell-index = <0>;
|
||||
compatible = "fsl-i2c";
|
||||
reg = <0x3000 0x100>;
|
||||
interrupts = <43 2>;
|
||||
interrupt-parent = <&mpic>;
|
||||
dfsrr;
|
||||
};
|
||||
|
||||
dma@21300 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "fsl,mpc8555-dma", "fsl,eloplus-dma";
|
||||
reg = <0x21300 0x4>;
|
||||
ranges = <0x0 0x21100 0x200>;
|
||||
cell-index = <0>;
|
||||
dma-channel@0 {
|
||||
compatible = "fsl,mpc8555-dma-channel",
|
||||
"fsl,eloplus-dma-channel";
|
||||
reg = <0x0 0x80>;
|
||||
cell-index = <0>;
|
||||
interrupt-parent = <&mpic>;
|
||||
interrupts = <20 2>;
|
||||
};
|
||||
dma-channel@80 {
|
||||
compatible = "fsl,mpc8555-dma-channel",
|
||||
"fsl,eloplus-dma-channel";
|
||||
reg = <0x80 0x80>;
|
||||
cell-index = <1>;
|
||||
interrupt-parent = <&mpic>;
|
||||
interrupts = <21 2>;
|
||||
};
|
||||
dma-channel@100 {
|
||||
compatible = "fsl,mpc8555-dma-channel",
|
||||
"fsl,eloplus-dma-channel";
|
||||
reg = <0x100 0x80>;
|
||||
cell-index = <2>;
|
||||
interrupt-parent = <&mpic>;
|
||||
interrupts = <22 2>;
|
||||
};
|
||||
dma-channel@180 {
|
||||
compatible = "fsl,mpc8555-dma-channel",
|
||||
"fsl,eloplus-dma-channel";
|
||||
reg = <0x180 0x80>;
|
||||
cell-index = <3>;
|
||||
interrupt-parent = <&mpic>;
|
||||
interrupts = <23 2>;
|
||||
};
|
||||
};
|
||||
|
||||
enet0: ethernet@24000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
cell-index = <0>;
|
||||
device_type = "network";
|
||||
model = "TSEC";
|
||||
compatible = "gianfar";
|
||||
reg = <0x24000 0x1000>;
|
||||
ranges = <0x0 0x24000 0x1000>;
|
||||
local-mac-address = [ 00 00 00 00 00 00 ];
|
||||
interrupts = <29 2 30 2 34 2>;
|
||||
interrupt-parent = <&mpic>;
|
||||
tbi-handle = <&tbi0>;
|
||||
phy-handle = <&phy0>;
|
||||
|
||||
mdio@520 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "fsl,gianfar-mdio";
|
||||
reg = <0x520 0x20>;
|
||||
|
||||
phy0: ethernet-phy@2 {
|
||||
interrupt-parent = <&mpic>;
|
||||
interrupts = <5 1>;
|
||||
reg = <0x2>;
|
||||
device_type = "ethernet-phy";
|
||||
};
|
||||
phy1: ethernet-phy@4 {
|
||||
interrupt-parent = <&mpic>;
|
||||
interrupts = <5 1>;
|
||||
reg = <0x4>;
|
||||
device_type = "ethernet-phy";
|
||||
};
|
||||
tbi0: tbi-phy@11 {
|
||||
reg = <0x11>;
|
||||
device_type = "tbi-phy";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
enet1: ethernet@25000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
cell-index = <1>;
|
||||
device_type = "network";
|
||||
model = "TSEC";
|
||||
compatible = "gianfar";
|
||||
reg = <0x25000 0x1000>;
|
||||
ranges = <0x0 0x25000 0x1000>;
|
||||
local-mac-address = [ 00 00 00 00 00 00 ];
|
||||
interrupts = <35 2 36 2 40 2>;
|
||||
interrupt-parent = <&mpic>;
|
||||
tbi-handle = <&tbi1>;
|
||||
phy-handle = <&phy1>;
|
||||
|
||||
mdio@520 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "fsl,gianfar-tbi";
|
||||
reg = <0x520 0x20>;
|
||||
|
||||
tbi1: tbi-phy@11 {
|
||||
reg = <0x11>;
|
||||
device_type = "tbi-phy";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
serial0: serial@4500 {
|
||||
cell-index = <0>;
|
||||
device_type = "serial";
|
||||
compatible = "ns16550";
|
||||
reg = <0x4500 0x100>; // reg base, size
|
||||
clock-frequency = <0>; // should we fill in in uboot?
|
||||
interrupts = <42 2>;
|
||||
interrupt-parent = <&mpic>;
|
||||
};
|
||||
|
||||
serial1: serial@4600 {
|
||||
cell-index = <1>;
|
||||
device_type = "serial";
|
||||
compatible = "ns16550";
|
||||
reg = <0x4600 0x100>; // reg base, size
|
||||
clock-frequency = <0>; // should we fill in in uboot?
|
||||
interrupts = <42 2>;
|
||||
interrupt-parent = <&mpic>;
|
||||
};
|
||||
|
||||
crypto@30000 {
|
||||
compatible = "fsl,sec2.0";
|
||||
reg = <0x30000 0x10000>;
|
||||
interrupts = <45 2>;
|
||||
interrupt-parent = <&mpic>;
|
||||
fsl,num-channels = <4>;
|
||||
fsl,channel-fifo-len = <24>;
|
||||
fsl,exec-units-mask = <0x7e>;
|
||||
fsl,descriptor-types-mask = <0x01010ebf>;
|
||||
};
|
||||
|
||||
mpic: pic@40000 {
|
||||
interrupt-controller;
|
||||
#address-cells = <0>;
|
||||
#interrupt-cells = <2>;
|
||||
reg = <0x40000 0x40000>;
|
||||
compatible = "chrp,open-pic";
|
||||
device_type = "open-pic";
|
||||
};
|
||||
|
||||
cpm@919c0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "fsl,mpc8555-cpm", "fsl,cpm2";
|
||||
reg = <0x919c0 0x30>;
|
||||
ranges;
|
||||
|
||||
muram@80000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges = <0x0 0x80000 0x10000>;
|
||||
|
||||
data@0 {
|
||||
compatible = "fsl,cpm-muram-data";
|
||||
reg = <0x0 0x2000 0x9000 0x1000>;
|
||||
};
|
||||
};
|
||||
|
||||
brg@919f0 {
|
||||
compatible = "fsl,mpc8555-brg",
|
||||
"fsl,cpm2-brg",
|
||||
"fsl,cpm-brg";
|
||||
reg = <0x919f0 0x10 0x915f0 0x10>;
|
||||
};
|
||||
|
||||
cpmpic: pic@90c00 {
|
||||
interrupt-controller;
|
||||
#address-cells = <0>;
|
||||
#interrupt-cells = <2>;
|
||||
interrupts = <46 2>;
|
||||
interrupt-parent = <&mpic>;
|
||||
reg = <0x90c00 0x80>;
|
||||
compatible = "fsl,mpc8555-cpm-pic", "fsl,cpm2-pic";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
pci0: pci@e0008000 {
|
||||
interrupt-map-mask = <0x1f800 0x0 0x0 0x7>;
|
||||
interrupt-map = <
|
||||
|
||||
/* IDSEL 0x10 */
|
||||
0x8000 0x0 0x0 0x1 &mpic 0x0 0x1
|
||||
0x8000 0x0 0x0 0x2 &mpic 0x1 0x1
|
||||
0x8000 0x0 0x0 0x3 &mpic 0x2 0x1
|
||||
0x8000 0x0 0x0 0x4 &mpic 0x3 0x1
|
||||
|
||||
/* IDSEL 0x11 */
|
||||
0x8800 0x0 0x0 0x1 &mpic 0x0 0x1
|
||||
0x8800 0x0 0x0 0x2 &mpic 0x1 0x1
|
||||
0x8800 0x0 0x0 0x3 &mpic 0x2 0x1
|
||||
0x8800 0x0 0x0 0x4 &mpic 0x3 0x1
|
||||
|
||||
/* IDSEL 0x12 (Slot 1) */
|
||||
0x9000 0x0 0x0 0x1 &mpic 0x0 0x1
|
||||
0x9000 0x0 0x0 0x2 &mpic 0x1 0x1
|
||||
0x9000 0x0 0x0 0x3 &mpic 0x2 0x1
|
||||
0x9000 0x0 0x0 0x4 &mpic 0x3 0x1
|
||||
|
||||
/* IDSEL 0x13 (Slot 2) */
|
||||
0x9800 0x0 0x0 0x1 &mpic 0x1 0x1
|
||||
0x9800 0x0 0x0 0x2 &mpic 0x2 0x1
|
||||
0x9800 0x0 0x0 0x3 &mpic 0x3 0x1
|
||||
0x9800 0x0 0x0 0x4 &mpic 0x0 0x1
|
||||
|
||||
/* IDSEL 0x14 (Slot 3) */
|
||||
0xa000 0x0 0x0 0x1 &mpic 0x2 0x1
|
||||
0xa000 0x0 0x0 0x2 &mpic 0x3 0x1
|
||||
0xa000 0x0 0x0 0x3 &mpic 0x0 0x1
|
||||
0xa000 0x0 0x0 0x4 &mpic 0x1 0x1
|
||||
|
||||
/* IDSEL 0x15 (Slot 4) */
|
||||
0xa800 0x0 0x0 0x1 &mpic 0x3 0x1
|
||||
0xa800 0x0 0x0 0x2 &mpic 0x0 0x1
|
||||
0xa800 0x0 0x0 0x3 &mpic 0x1 0x1
|
||||
0xa800 0x0 0x0 0x4 &mpic 0x2 0x1
|
||||
|
||||
/* Bus 1 (Tundra Bridge) */
|
||||
/* IDSEL 0x12 (ISA bridge) */
|
||||
0x19000 0x0 0x0 0x1 &mpic 0x0 0x1
|
||||
0x19000 0x0 0x0 0x2 &mpic 0x1 0x1
|
||||
0x19000 0x0 0x0 0x3 &mpic 0x2 0x1
|
||||
0x19000 0x0 0x0 0x4 &mpic 0x3 0x1>;
|
||||
interrupt-parent = <&mpic>;
|
||||
interrupts = <24 2>;
|
||||
bus-range = <0 0>;
|
||||
ranges = <0x2000000 0x0 0x80000000 0x80000000 0x0 0x20000000
|
||||
0x1000000 0x0 0x0 0xe2000000 0x0 0x100000>;
|
||||
clock-frequency = <66666666>;
|
||||
#interrupt-cells = <1>;
|
||||
#size-cells = <2>;
|
||||
#address-cells = <3>;
|
||||
reg = <0xe0008000 0x1000>;
|
||||
compatible = "fsl,mpc8540-pci";
|
||||
device_type = "pci";
|
||||
|
||||
i8259@19000 {
|
||||
interrupt-controller;
|
||||
device_type = "interrupt-controller";
|
||||
reg = <0x19000 0x0 0x0 0x0 0x1>;
|
||||
#address-cells = <0>;
|
||||
#interrupt-cells = <2>;
|
||||
compatible = "chrp,iic";
|
||||
interrupts = <1>;
|
||||
interrupt-parent = <&pci0>;
|
||||
};
|
||||
};
|
||||
|
||||
pci1: pci@e0009000 {
|
||||
interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
|
||||
interrupt-map = <
|
||||
|
||||
/* IDSEL 0x15 */
|
||||
0xa800 0x0 0x0 0x1 &mpic 0xb 0x1
|
||||
0xa800 0x0 0x0 0x2 &mpic 0xb 0x1
|
||||
0xa800 0x0 0x0 0x3 &mpic 0xb 0x1
|
||||
0xa800 0x0 0x0 0x4 &mpic 0xb 0x1>;
|
||||
interrupt-parent = <&mpic>;
|
||||
interrupts = <25 2>;
|
||||
bus-range = <0 0>;
|
||||
ranges = <0x2000000 0x0 0xa0000000 0xa0000000 0x0 0x20000000
|
||||
0x1000000 0x0 0x0 0xe3000000 0x0 0x100000>;
|
||||
clock-frequency = <66666666>;
|
||||
#interrupt-cells = <1>;
|
||||
#size-cells = <2>;
|
||||
#address-cells = <3>;
|
||||
reg = <0xe0009000 0x1000>;
|
||||
compatible = "fsl,mpc8540-pci";
|
||||
device_type = "pci";
|
||||
};
|
||||
};
|
@ -289,7 +289,14 @@
|
||||
interrupt-map = <
|
||||
/* IDSEL 28 */
|
||||
0xe000 0 0 1 &mpic 2 1
|
||||
0xe000 0 0 2 &mpic 3 1>;
|
||||
0xe000 0 0 2 &mpic 3 1
|
||||
0xe000 0 0 3 &mpic 6 1
|
||||
0xe000 0 0 4 &mpic 5 1
|
||||
|
||||
/* IDSEL 11 */
|
||||
0x5800 0 0 1 &mpic 6 1
|
||||
0x5800 0 0 2 &mpic 5 1
|
||||
>;
|
||||
|
||||
interrupt-parent = <&mpic>;
|
||||
interrupts = <24 2>;
|
||||
|
@ -311,7 +311,14 @@
|
||||
interrupt-map = <
|
||||
/* IDSEL 28 */
|
||||
0xe000 0 0 1 &mpic 2 1
|
||||
0xe000 0 0 2 &mpic 3 1>;
|
||||
0xe000 0 0 2 &mpic 3 1
|
||||
0xe000 0 0 3 &mpic 6 1
|
||||
0xe000 0 0 4 &mpic 5 1
|
||||
|
||||
/* IDSEL 11 */
|
||||
0x5800 0 0 1 &mpic 6 1
|
||||
0x5800 0 0 2 &mpic 5 1
|
||||
>;
|
||||
|
||||
interrupt-parent = <&mpic>;
|
||||
interrupts = <24 2>;
|
||||
|
@ -442,7 +442,14 @@
|
||||
interrupt-map = <
|
||||
/* IDSEL 28 */
|
||||
0xe000 0 0 1 &mpic 2 1
|
||||
0xe000 0 0 2 &mpic 3 1>;
|
||||
0xe000 0 0 2 &mpic 3 1
|
||||
0xe000 0 0 3 &mpic 6 1
|
||||
0xe000 0 0 4 &mpic 5 1
|
||||
|
||||
/* IDSEL 11 */
|
||||
0x5800 0 0 1 &mpic 6 1
|
||||
0x5800 0 0 2 &mpic 5 1
|
||||
>;
|
||||
|
||||
interrupt-parent = <&mpic>;
|
||||
interrupts = <24 2>;
|
||||
|
@ -442,7 +442,14 @@
|
||||
interrupt-map = <
|
||||
/* IDSEL 28 */
|
||||
0xe000 0 0 1 &mpic 2 1
|
||||
0xe000 0 0 2 &mpic 3 1>;
|
||||
0xe000 0 0 2 &mpic 3 1
|
||||
0xe000 0 0 3 &mpic 6 1
|
||||
0xe000 0 0 4 &mpic 5 1
|
||||
|
||||
/* IDSEL 11 */
|
||||
0x5800 0 0 1 &mpic 6 1
|
||||
0x5800 0 0 2 &mpic 5 1
|
||||
>;
|
||||
|
||||
interrupt-parent = <&mpic>;
|
||||
interrupts = <24 2>;
|
||||
|
@ -311,7 +311,14 @@
|
||||
interrupt-map = <
|
||||
/* IDSEL 28 */
|
||||
0xe000 0 0 1 &mpic 2 1
|
||||
0xe000 0 0 2 &mpic 3 1>;
|
||||
0xe000 0 0 2 &mpic 3 1
|
||||
0xe000 0 0 3 &mpic 6 1
|
||||
0xe000 0 0 4 &mpic 5 1
|
||||
|
||||
/* IDSEL 11 */
|
||||
0x5800 0 0 1 &mpic 6 1
|
||||
0x5800 0 0 2 &mpic 5 1
|
||||
>;
|
||||
|
||||
interrupt-parent = <&mpic>;
|
||||
interrupts = <24 2>;
|
||||
|
@ -382,7 +382,14 @@
|
||||
interrupt-map = <
|
||||
/* IDSEL 28 */
|
||||
0xe000 0 0 1 &mpic 2 1
|
||||
0xe000 0 0 2 &mpic 3 1>;
|
||||
0xe000 0 0 2 &mpic 3 1
|
||||
0xe000 0 0 3 &mpic 6 1
|
||||
0xe000 0 0 4 &mpic 5 1
|
||||
|
||||
/* IDSEL 11 */
|
||||
0x5800 0 0 1 &mpic 6 1
|
||||
0x5800 0 0 2 &mpic 5 1
|
||||
>;
|
||||
|
||||
interrupt-parent = <&mpic>;
|
||||
interrupts = <24 2>;
|
||||
|
172
arch/powerpc/boot/dts/tqm8xx.dts
Normal file
172
arch/powerpc/boot/dts/tqm8xx.dts
Normal file
@ -0,0 +1,172 @@
|
||||
/*
|
||||
* TQM8XX Device Tree Source
|
||||
*
|
||||
* Heiko Schocher <hs@denx.de>
|
||||
* 2010 DENX Software Engineering GmbH
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
/ {
|
||||
model = "TQM8xx";
|
||||
compatible = "tqc,tqm8xx";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
aliases {
|
||||
ethernet0 = ð0;
|
||||
ethernet1 = ð1;
|
||||
mdio1 = &phy1;
|
||||
serial0 = &smc1;
|
||||
};
|
||||
|
||||
cpus {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
PowerPC,860@0 {
|
||||
device_type = "cpu";
|
||||
reg = <0x0>;
|
||||
d-cache-line-size = <16>; // 16 bytes
|
||||
i-cache-line-size = <16>; // 16 bytes
|
||||
d-cache-size = <0x1000>; // L1, 4K
|
||||
i-cache-size = <0x1000>; // L1, 4K
|
||||
timebase-frequency = <0>;
|
||||
bus-frequency = <0>;
|
||||
clock-frequency = <0>;
|
||||
interrupts = <15 2>; // decrementer interrupt
|
||||
interrupt-parent = <&PIC>;
|
||||
};
|
||||
};
|
||||
|
||||
memory {
|
||||
device_type = "memory";
|
||||
reg = <0x0 0x2000000>;
|
||||
};
|
||||
|
||||
localbus@fff00100 {
|
||||
compatible = "fsl,mpc860-localbus", "fsl,pq1-localbus";
|
||||
#address-cells = <2>;
|
||||
#size-cells = <1>;
|
||||
reg = <0xfff00100 0x40>;
|
||||
|
||||
ranges = <
|
||||
0x0 0x0 0x40000000 0x800000
|
||||
>;
|
||||
|
||||
flash@0,0 {
|
||||
compatible = "cfi-flash";
|
||||
reg = <0 0 0x800000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
bank-width = <4>;
|
||||
device-width = <2>;
|
||||
};
|
||||
};
|
||||
|
||||
soc@fff00000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
device_type = "soc";
|
||||
ranges = <0x0 0xfff00000 0x00004000>;
|
||||
|
||||
phy1: mdio@e00 {
|
||||
compatible = "fsl,mpc866-fec-mdio", "fsl,pq1-fec-mdio";
|
||||
reg = <0xe00 0x188>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
PHY: ethernet-phy@f {
|
||||
reg = <0xf>;
|
||||
device_type = "ethernet-phy";
|
||||
};
|
||||
};
|
||||
|
||||
eth1: ethernet@e00 {
|
||||
device_type = "network";
|
||||
compatible = "fsl,mpc866-fec-enet",
|
||||
"fsl,pq1-fec-enet";
|
||||
reg = <0xe00 0x188>;
|
||||
interrupts = <3 1>;
|
||||
interrupt-parent = <&PIC>;
|
||||
phy-handle = <&PHY>;
|
||||
linux,network-index = <1>;
|
||||
};
|
||||
|
||||
PIC: pic@0 {
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <2>;
|
||||
reg = <0x0 0x24>;
|
||||
compatible = "fsl,mpc860-pic", "fsl,pq1-pic";
|
||||
};
|
||||
|
||||
cpm@9c0 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
compatible = "fsl,mpc860-cpm", "fsl,cpm1";
|
||||
ranges;
|
||||
reg = <0x9c0 0x40>;
|
||||
brg-frequency = <0>;
|
||||
interrupts = <0 2>; // cpm error interrupt
|
||||
interrupt-parent = <&CPM_PIC>;
|
||||
|
||||
muram@2000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges = <0x0 0x2000 0x2000>;
|
||||
|
||||
data@0 {
|
||||
compatible = "fsl,cpm-muram-data";
|
||||
reg = <0x0 0x2000>;
|
||||
};
|
||||
};
|
||||
|
||||
brg@9f0 {
|
||||
compatible = "fsl,mpc860-brg",
|
||||
"fsl,cpm1-brg",
|
||||
"fsl,cpm-brg";
|
||||
reg = <0x9f0 0x10>;
|
||||
clock-frequency = <0>;
|
||||
};
|
||||
|
||||
CPM_PIC: pic@930 {
|
||||
interrupt-controller;
|
||||
#address-cells = <0>;
|
||||
#interrupt-cells = <1>;
|
||||
interrupts = <5 2 0 2>;
|
||||
interrupt-parent = <&PIC>;
|
||||
reg = <0x930 0x20>;
|
||||
compatible = "fsl,mpc860-cpm-pic",
|
||||
"fsl,cpm1-pic";
|
||||
};
|
||||
|
||||
|
||||
smc1: serial@a80 {
|
||||
device_type = "serial";
|
||||
compatible = "fsl,mpc860-smc-uart",
|
||||
"fsl,cpm1-smc-uart";
|
||||
reg = <0xa80 0x10 0x3e80 0x40>;
|
||||
interrupts = <4>;
|
||||
interrupt-parent = <&CPM_PIC>;
|
||||
fsl,cpm-brg = <1>;
|
||||
fsl,cpm-command = <0x90>;
|
||||
};
|
||||
|
||||
eth0: ethernet@a00 {
|
||||
device_type = "network";
|
||||
compatible = "fsl,mpc860-scc-enet",
|
||||
"fsl,cpm1-scc-enet";
|
||||
reg = <0xa00 0x18 0x3c00 0x100>;
|
||||
interrupts = <30>;
|
||||
interrupt-parent = <&CPM_PIC>;
|
||||
fsl,cpm-command = <0000>;
|
||||
linux,network-index = <0>;
|
||||
fixed-link = <0 0 10 0 0>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
@ -19,7 +19,8 @@ CONFIG_E500=y
|
||||
CONFIG_FSL_EMB_PERFMON=y
|
||||
CONFIG_BOOKE=y
|
||||
CONFIG_FSL_BOOKE=y
|
||||
# CONFIG_PHYS_64BIT is not set
|
||||
CONFIG_PTE_64BIT=y
|
||||
CONFIG_PHYS_64BIT=y
|
||||
CONFIG_SPE=y
|
||||
CONFIG_PPC_MMU_NOHASH=y
|
||||
CONFIG_PPC_MMU_NOHASH_32=y
|
||||
@ -28,7 +29,7 @@ CONFIG_PPC_BOOK3E_MMU=y
|
||||
# CONFIG_SMP is not set
|
||||
CONFIG_PPC32=y
|
||||
CONFIG_WORD_SIZE=32
|
||||
# CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set
|
||||
CONFIG_ARCH_PHYS_ADDR_T_64BIT=y
|
||||
CONFIG_MMU=y
|
||||
CONFIG_GENERIC_CMOS_UPDATE=y
|
||||
CONFIG_GENERIC_TIME=y
|
||||
@ -239,6 +240,7 @@ CONFIG_MPC85xx_MDS=y
|
||||
CONFIG_MPC8536_DS=y
|
||||
CONFIG_MPC85xx_DS=y
|
||||
CONFIG_MPC85xx_RDB=y
|
||||
CONFIG_P1022_DS=y
|
||||
CONFIG_SOCRATES=y
|
||||
CONFIG_KSI8560=y
|
||||
CONFIG_XES_MPC85xx=y
|
||||
@ -311,7 +313,7 @@ CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
CONFIG_PAGEFLAGS_EXTENDED=y
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=4
|
||||
CONFIG_MIGRATION=y
|
||||
# CONFIG_PHYS_ADDR_T_64BIT is not set
|
||||
CONFIG_PHYS_ADDR_T_64BIT=y
|
||||
CONFIG_ZONE_DMA_FLAG=1
|
||||
CONFIG_BOUNCE=y
|
||||
CONFIG_VIRT_TO_BUS=y
|
||||
@ -321,7 +323,7 @@ CONFIG_PPC_4K_PAGES=y
|
||||
# CONFIG_PPC_16K_PAGES is not set
|
||||
# CONFIG_PPC_64K_PAGES is not set
|
||||
# CONFIG_PPC_256K_PAGES is not set
|
||||
CONFIG_FORCE_MAX_ZONEORDER=11
|
||||
CONFIG_FORCE_MAX_ZONEORDER=12
|
||||
CONFIG_PROC_DEVICETREE=y
|
||||
# CONFIG_CMDLINE_BOOL is not set
|
||||
CONFIG_EXTRA_TARGETS=""
|
||||
@ -1122,16 +1124,13 @@ CONFIG_VGA_CONSOLE=y
|
||||
# CONFIG_VGACON_SOFT_SCROLLBACK is not set
|
||||
CONFIG_DUMMY_CONSOLE=y
|
||||
CONFIG_SOUND=y
|
||||
CONFIG_SOUND_OSS_CORE=y
|
||||
CONFIG_SOUND_OSS_CORE_PRECLAIM=y
|
||||
# CONFIG_SOUND_OSS_CORE is not set
|
||||
CONFIG_SND=y
|
||||
CONFIG_SND_TIMER=y
|
||||
CONFIG_SND_PCM=y
|
||||
# CONFIG_SND_SEQUENCER is not set
|
||||
CONFIG_SND_OSSEMUL=y
|
||||
CONFIG_SND_MIXER_OSS=y
|
||||
CONFIG_SND_PCM_OSS=y
|
||||
CONFIG_SND_PCM_OSS_PLUGINS=y
|
||||
# CONFIG_SND_MIXER_OSS is not set
|
||||
# CONFIG_SND_PCM_OSS is not set
|
||||
# CONFIG_SND_HRTIMER is not set
|
||||
# CONFIG_SND_DYNAMIC_MINORS is not set
|
||||
# CONFIG_SND_SUPPORT_OLD_API is not set
|
||||
@ -1145,12 +1144,7 @@ CONFIG_SND_VMASTER=y
|
||||
# CONFIG_SND_SBAWE_SEQ is not set
|
||||
# CONFIG_SND_EMU10K1_SEQ is not set
|
||||
CONFIG_SND_AC97_CODEC=y
|
||||
CONFIG_SND_DRIVERS=y
|
||||
# CONFIG_SND_DUMMY is not set
|
||||
# CONFIG_SND_MTPAV is not set
|
||||
# CONFIG_SND_SERIAL_U16550 is not set
|
||||
# CONFIG_SND_MPU401 is not set
|
||||
# CONFIG_SND_AC97_POWER_SAVE is not set
|
||||
# CONFIG_SND_DRIVERS is not set
|
||||
CONFIG_SND_PCI=y
|
||||
# CONFIG_SND_AD1889 is not set
|
||||
# CONFIG_SND_ALS300 is not set
|
||||
@ -1218,12 +1212,8 @@ CONFIG_SND_INTEL8X0=y
|
||||
# CONFIG_SND_VIRTUOSO is not set
|
||||
# CONFIG_SND_VX222 is not set
|
||||
# CONFIG_SND_YMFPCI is not set
|
||||
CONFIG_SND_PPC=y
|
||||
CONFIG_SND_USB=y
|
||||
# CONFIG_SND_USB_AUDIO is not set
|
||||
# CONFIG_SND_USB_UA101 is not set
|
||||
# CONFIG_SND_USB_USX2Y is not set
|
||||
# CONFIG_SND_USB_CAIAQ is not set
|
||||
# CONFIG_SND_PPC is not set
|
||||
# CONFIG_SND_USB is not set
|
||||
# CONFIG_SND_SOC is not set
|
||||
# CONFIG_SOUND_PRIME is not set
|
||||
CONFIG_AC97_BUS=y
|
||||
|
@ -19,7 +19,8 @@ CONFIG_E500=y
|
||||
CONFIG_FSL_EMB_PERFMON=y
|
||||
CONFIG_BOOKE=y
|
||||
CONFIG_FSL_BOOKE=y
|
||||
# CONFIG_PHYS_64BIT is not set
|
||||
CONFIG_PTE_64BIT=y
|
||||
CONFIG_PHYS_64BIT=y
|
||||
CONFIG_SPE=y
|
||||
CONFIG_PPC_MMU_NOHASH=y
|
||||
CONFIG_PPC_MMU_NOHASH_32=y
|
||||
@ -29,7 +30,7 @@ CONFIG_SMP=y
|
||||
CONFIG_NR_CPUS=8
|
||||
CONFIG_PPC32=y
|
||||
CONFIG_WORD_SIZE=32
|
||||
# CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set
|
||||
CONFIG_ARCH_PHYS_ADDR_T_64BIT=y
|
||||
CONFIG_MMU=y
|
||||
CONFIG_GENERIC_CMOS_UPDATE=y
|
||||
CONFIG_GENERIC_TIME=y
|
||||
@ -243,6 +244,7 @@ CONFIG_MPC85xx_MDS=y
|
||||
CONFIG_MPC8536_DS=y
|
||||
CONFIG_MPC85xx_DS=y
|
||||
CONFIG_MPC85xx_RDB=y
|
||||
CONFIG_P1022_DS=y
|
||||
CONFIG_SOCRATES=y
|
||||
CONFIG_KSI8560=y
|
||||
CONFIG_XES_MPC85xx=y
|
||||
@ -316,7 +318,7 @@ CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
CONFIG_PAGEFLAGS_EXTENDED=y
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=4
|
||||
CONFIG_MIGRATION=y
|
||||
# CONFIG_PHYS_ADDR_T_64BIT is not set
|
||||
CONFIG_PHYS_ADDR_T_64BIT=y
|
||||
CONFIG_ZONE_DMA_FLAG=1
|
||||
CONFIG_BOUNCE=y
|
||||
CONFIG_VIRT_TO_BUS=y
|
||||
@ -326,7 +328,7 @@ CONFIG_PPC_4K_PAGES=y
|
||||
# CONFIG_PPC_16K_PAGES is not set
|
||||
# CONFIG_PPC_64K_PAGES is not set
|
||||
# CONFIG_PPC_256K_PAGES is not set
|
||||
CONFIG_FORCE_MAX_ZONEORDER=11
|
||||
CONFIG_FORCE_MAX_ZONEORDER=12
|
||||
CONFIG_PROC_DEVICETREE=y
|
||||
# CONFIG_CMDLINE_BOOL is not set
|
||||
CONFIG_EXTRA_TARGETS=""
|
||||
@ -1127,16 +1129,13 @@ CONFIG_VGA_CONSOLE=y
|
||||
# CONFIG_VGACON_SOFT_SCROLLBACK is not set
|
||||
CONFIG_DUMMY_CONSOLE=y
|
||||
CONFIG_SOUND=y
|
||||
CONFIG_SOUND_OSS_CORE=y
|
||||
CONFIG_SOUND_OSS_CORE_PRECLAIM=y
|
||||
# CONFIG_SOUND_OSS_CORE is not set
|
||||
CONFIG_SND=y
|
||||
CONFIG_SND_TIMER=y
|
||||
CONFIG_SND_PCM=y
|
||||
# CONFIG_SND_SEQUENCER is not set
|
||||
CONFIG_SND_OSSEMUL=y
|
||||
CONFIG_SND_MIXER_OSS=y
|
||||
CONFIG_SND_PCM_OSS=y
|
||||
CONFIG_SND_PCM_OSS_PLUGINS=y
|
||||
# CONFIG_SND_MIXER_OSS is not set
|
||||
# CONFIG_SND_PCM_OSS is not set
|
||||
# CONFIG_SND_HRTIMER is not set
|
||||
# CONFIG_SND_DYNAMIC_MINORS is not set
|
||||
# CONFIG_SND_SUPPORT_OLD_API is not set
|
||||
@ -1150,12 +1149,7 @@ CONFIG_SND_VMASTER=y
|
||||
# CONFIG_SND_SBAWE_SEQ is not set
|
||||
# CONFIG_SND_EMU10K1_SEQ is not set
|
||||
CONFIG_SND_AC97_CODEC=y
|
||||
CONFIG_SND_DRIVERS=y
|
||||
# CONFIG_SND_DUMMY is not set
|
||||
# CONFIG_SND_MTPAV is not set
|
||||
# CONFIG_SND_SERIAL_U16550 is not set
|
||||
# CONFIG_SND_MPU401 is not set
|
||||
# CONFIG_SND_AC97_POWER_SAVE is not set
|
||||
# CONFIG_SND_DRIVERS is not set
|
||||
CONFIG_SND_PCI=y
|
||||
# CONFIG_SND_AD1889 is not set
|
||||
# CONFIG_SND_ALS300 is not set
|
||||
@ -1223,12 +1217,8 @@ CONFIG_SND_INTEL8X0=y
|
||||
# CONFIG_SND_VIRTUOSO is not set
|
||||
# CONFIG_SND_VX222 is not set
|
||||
# CONFIG_SND_YMFPCI is not set
|
||||
CONFIG_SND_PPC=y
|
||||
CONFIG_SND_USB=y
|
||||
# CONFIG_SND_USB_AUDIO is not set
|
||||
# CONFIG_SND_USB_UA101 is not set
|
||||
# CONFIG_SND_USB_USX2Y is not set
|
||||
# CONFIG_SND_USB_CAIAQ is not set
|
||||
# CONFIG_SND_PPC is not set
|
||||
# CONFIG_SND_USB is not set
|
||||
# CONFIG_SND_SOC is not set
|
||||
# CONFIG_SOUND_PRIME is not set
|
||||
CONFIG_AC97_BUS=y
|
||||
|
934
arch/powerpc/configs/tqm8xx_defconfig
Normal file
934
arch/powerpc/configs/tqm8xx_defconfig
Normal file
@ -0,0 +1,934 @@
|
||||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.34-rc1
|
||||
# Tue Mar 23 08:22:15 2010
|
||||
#
|
||||
# CONFIG_PPC64 is not set
|
||||
|
||||
#
|
||||
# Processor support
|
||||
#
|
||||
# CONFIG_PPC_BOOK3S_32 is not set
|
||||
# CONFIG_PPC_85xx is not set
|
||||
CONFIG_PPC_8xx=y
|
||||
# CONFIG_40x is not set
|
||||
# CONFIG_44x is not set
|
||||
# CONFIG_E200 is not set
|
||||
CONFIG_8xx=y
|
||||
CONFIG_PPC_MMU_NOHASH=y
|
||||
CONFIG_PPC_MMU_NOHASH_32=y
|
||||
# CONFIG_PPC_MM_SLICES is not set
|
||||
CONFIG_NOT_COHERENT_CACHE=y
|
||||
CONFIG_PPC32=y
|
||||
CONFIG_WORD_SIZE=32
|
||||
# CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set
|
||||
CONFIG_MMU=y
|
||||
CONFIG_GENERIC_CMOS_UPDATE=y
|
||||
CONFIG_GENERIC_TIME=y
|
||||
CONFIG_GENERIC_TIME_VSYSCALL=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS=y
|
||||
CONFIG_GENERIC_HARDIRQS=y
|
||||
CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
|
||||
# CONFIG_HAVE_SETUP_PER_CPU_AREA is not set
|
||||
# CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK is not set
|
||||
CONFIG_IRQ_PER_CPU=y
|
||||
CONFIG_NR_IRQS=512
|
||||
CONFIG_STACKTRACE_SUPPORT=y
|
||||
CONFIG_HAVE_LATENCYTOP_SUPPORT=y
|
||||
CONFIG_TRACE_IRQFLAGS_SUPPORT=y
|
||||
CONFIG_LOCKDEP_SUPPORT=y
|
||||
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
|
||||
CONFIG_ARCH_HAS_ILOG2_U32=y
|
||||
CONFIG_GENERIC_HWEIGHT=y
|
||||
CONFIG_GENERIC_FIND_NEXT_BIT=y
|
||||
# CONFIG_ARCH_NO_VIRT_TO_BUS is not set
|
||||
CONFIG_PPC=y
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_GENERIC_NVRAM=y
|
||||
CONFIG_SCHED_OMIT_FRAME_POINTER=y
|
||||
CONFIG_ARCH_MAY_HAVE_PC_FDC=y
|
||||
CONFIG_PPC_OF=y
|
||||
CONFIG_OF=y
|
||||
# CONFIG_PPC_UDBG_16550 is not set
|
||||
# CONFIG_GENERIC_TBSYNC is not set
|
||||
CONFIG_AUDIT_ARCH=y
|
||||
CONFIG_GENERIC_BUG=y
|
||||
CONFIG_DTC=y
|
||||
# CONFIG_DEFAULT_UIMAGE is not set
|
||||
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
|
||||
# CONFIG_PPC_DCR_NATIVE is not set
|
||||
# CONFIG_PPC_DCR_MMIO is not set
|
||||
CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y
|
||||
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
||||
CONFIG_CONSTRUCTORS=y
|
||||
|
||||
#
|
||||
# General setup
|
||||
#
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_BROKEN_ON_SMP=y
|
||||
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||
CONFIG_LOCALVERSION=""
|
||||
CONFIG_LOCALVERSION_AUTO=y
|
||||
# CONFIG_SWAP is not set
|
||||
CONFIG_SYSVIPC=y
|
||||
CONFIG_SYSVIPC_SYSCTL=y
|
||||
# CONFIG_POSIX_MQUEUE is not set
|
||||
# CONFIG_BSD_PROCESS_ACCT is not set
|
||||
# CONFIG_TASKSTATS is not set
|
||||
# CONFIG_AUDIT is not set
|
||||
|
||||
#
|
||||
# RCU Subsystem
|
||||
#
|
||||
CONFIG_TREE_RCU=y
|
||||
# CONFIG_TREE_PREEMPT_RCU is not set
|
||||
# CONFIG_TINY_RCU is not set
|
||||
# CONFIG_RCU_TRACE is not set
|
||||
CONFIG_RCU_FANOUT=32
|
||||
# CONFIG_RCU_FANOUT_EXACT is not set
|
||||
# CONFIG_TREE_RCU_TRACE is not set
|
||||
# CONFIG_IKCONFIG is not set
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
# CONFIG_CGROUPS is not set
|
||||
CONFIG_SYSFS_DEPRECATED=y
|
||||
CONFIG_SYSFS_DEPRECATED_V2=y
|
||||
# CONFIG_RELAY is not set
|
||||
# CONFIG_NAMESPACES is not set
|
||||
# CONFIG_BLK_DEV_INITRD is not set
|
||||
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
|
||||
CONFIG_SYSCTL=y
|
||||
CONFIG_ANON_INODES=y
|
||||
CONFIG_EMBEDDED=y
|
||||
# CONFIG_SYSCTL_SYSCALL is not set
|
||||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||
CONFIG_HOTPLUG=y
|
||||
CONFIG_PRINTK=y
|
||||
CONFIG_BUG=y
|
||||
# CONFIG_ELF_CORE is not set
|
||||
# CONFIG_BASE_FULL is not set
|
||||
# CONFIG_FUTEX is not set
|
||||
CONFIG_EPOLL=y
|
||||
CONFIG_SIGNALFD=y
|
||||
CONFIG_TIMERFD=y
|
||||
CONFIG_EVENTFD=y
|
||||
CONFIG_SHMEM=y
|
||||
CONFIG_AIO=y
|
||||
CONFIG_HAVE_PERF_EVENTS=y
|
||||
|
||||
#
|
||||
# Kernel Performance Events And Counters
|
||||
#
|
||||
# CONFIG_PERF_EVENTS is not set
|
||||
# CONFIG_PERF_COUNTERS is not set
|
||||
# CONFIG_VM_EVENT_COUNTERS is not set
|
||||
CONFIG_SLUB_DEBUG=y
|
||||
CONFIG_COMPAT_BRK=y
|
||||
# CONFIG_SLAB is not set
|
||||
CONFIG_SLUB=y
|
||||
# CONFIG_SLOB is not set
|
||||
# CONFIG_PROFILING is not set
|
||||
CONFIG_HAVE_OPROFILE=y
|
||||
# CONFIG_KPROBES is not set
|
||||
CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
|
||||
CONFIG_HAVE_IOREMAP_PROT=y
|
||||
CONFIG_HAVE_KPROBES=y
|
||||
CONFIG_HAVE_KRETPROBES=y
|
||||
CONFIG_HAVE_ARCH_TRACEHOOK=y
|
||||
CONFIG_HAVE_DMA_ATTRS=y
|
||||
CONFIG_HAVE_CLK=y
|
||||
CONFIG_HAVE_DMA_API_DEBUG=y
|
||||
|
||||
#
|
||||
# GCOV-based kernel profiling
|
||||
#
|
||||
# CONFIG_SLOW_WORK is not set
|
||||
# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
|
||||
CONFIG_SLABINFO=y
|
||||
CONFIG_BASE_SMALL=1
|
||||
CONFIG_MODULES=y
|
||||
# CONFIG_MODULE_FORCE_LOAD is not set
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
# CONFIG_MODULE_FORCE_UNLOAD is not set
|
||||
# CONFIG_MODVERSIONS is not set
|
||||
CONFIG_MODULE_SRCVERSION_ALL=y
|
||||
CONFIG_BLOCK=y
|
||||
CONFIG_LBDAF=y
|
||||
# CONFIG_BLK_DEV_BSG is not set
|
||||
# CONFIG_BLK_DEV_INTEGRITY is not set
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
#
|
||||
CONFIG_IOSCHED_NOOP=y
|
||||
CONFIG_IOSCHED_DEADLINE=y
|
||||
# CONFIG_IOSCHED_CFQ is not set
|
||||
CONFIG_DEFAULT_DEADLINE=y
|
||||
# CONFIG_DEFAULT_CFQ is not set
|
||||
# CONFIG_DEFAULT_NOOP is not set
|
||||
CONFIG_DEFAULT_IOSCHED="deadline"
|
||||
# CONFIG_INLINE_SPIN_TRYLOCK is not set
|
||||
# CONFIG_INLINE_SPIN_TRYLOCK_BH is not set
|
||||
# CONFIG_INLINE_SPIN_LOCK is not set
|
||||
# CONFIG_INLINE_SPIN_LOCK_BH is not set
|
||||
# CONFIG_INLINE_SPIN_LOCK_IRQ is not set
|
||||
# CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set
|
||||
CONFIG_INLINE_SPIN_UNLOCK=y
|
||||
# CONFIG_INLINE_SPIN_UNLOCK_BH is not set
|
||||
CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
|
||||
# CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set
|
||||
# CONFIG_INLINE_READ_TRYLOCK is not set
|
||||
# CONFIG_INLINE_READ_LOCK is not set
|
||||
# CONFIG_INLINE_READ_LOCK_BH is not set
|
||||
# CONFIG_INLINE_READ_LOCK_IRQ is not set
|
||||
# CONFIG_INLINE_READ_LOCK_IRQSAVE is not set
|
||||
CONFIG_INLINE_READ_UNLOCK=y
|
||||
# CONFIG_INLINE_READ_UNLOCK_BH is not set
|
||||
CONFIG_INLINE_READ_UNLOCK_IRQ=y
|
||||
# CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set
|
||||
# CONFIG_INLINE_WRITE_TRYLOCK is not set
|
||||
# CONFIG_INLINE_WRITE_LOCK is not set
|
||||
# CONFIG_INLINE_WRITE_LOCK_BH is not set
|
||||
# CONFIG_INLINE_WRITE_LOCK_IRQ is not set
|
||||
# CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set
|
||||
CONFIG_INLINE_WRITE_UNLOCK=y
|
||||
# CONFIG_INLINE_WRITE_UNLOCK_BH is not set
|
||||
CONFIG_INLINE_WRITE_UNLOCK_IRQ=y
|
||||
# CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set
|
||||
# CONFIG_MUTEX_SPIN_ON_OWNER is not set
|
||||
# CONFIG_FREEZER is not set
|
||||
|
||||
#
|
||||
# Platform support
|
||||
#
|
||||
# CONFIG_PPC_CELL is not set
|
||||
# CONFIG_PPC_CELL_NATIVE is not set
|
||||
CONFIG_CPM1=y
|
||||
# CONFIG_MPC8XXFADS is not set
|
||||
# CONFIG_MPC86XADS is not set
|
||||
# CONFIG_MPC885ADS is not set
|
||||
# CONFIG_PPC_EP88XC is not set
|
||||
# CONFIG_PPC_ADDER875 is not set
|
||||
# CONFIG_PPC_MGSUVD is not set
|
||||
CONFIG_TQM8XX=y
|
||||
|
||||
#
|
||||
# MPC8xx CPM Options
|
||||
#
|
||||
|
||||
#
|
||||
# Generic MPC8xx Options
|
||||
#
|
||||
CONFIG_8xx_COPYBACK=y
|
||||
# CONFIG_8xx_GPIO is not set
|
||||
# CONFIG_8xx_CPU6 is not set
|
||||
# CONFIG_8xx_CPU15 is not set
|
||||
CONFIG_NO_UCODE_PATCH=y
|
||||
# CONFIG_USB_SOF_UCODE_PATCH is not set
|
||||
# CONFIG_I2C_SPI_UCODE_PATCH is not set
|
||||
# CONFIG_I2C_SPI_SMC1_UCODE_PATCH is not set
|
||||
# CONFIG_PQ2ADS is not set
|
||||
# CONFIG_IPIC is not set
|
||||
# CONFIG_MPIC is not set
|
||||
# CONFIG_MPIC_WEIRD is not set
|
||||
# CONFIG_PPC_I8259 is not set
|
||||
# CONFIG_PPC_RTAS is not set
|
||||
# CONFIG_MMIO_NVRAM is not set
|
||||
# CONFIG_PPC_MPC106 is not set
|
||||
# CONFIG_PPC_970_NAP is not set
|
||||
# CONFIG_PPC_INDIRECT_IO is not set
|
||||
# CONFIG_GENERIC_IOMAP is not set
|
||||
# CONFIG_CPU_FREQ is not set
|
||||
# CONFIG_QUICC_ENGINE is not set
|
||||
# CONFIG_FSL_ULI1575 is not set
|
||||
CONFIG_CPM=y
|
||||
# CONFIG_SIMPLE_GPIO is not set
|
||||
|
||||
#
|
||||
# Kernel options
|
||||
#
|
||||
# CONFIG_HIGHMEM is not set
|
||||
CONFIG_TICK_ONESHOT=y
|
||||
CONFIG_NO_HZ=y
|
||||
CONFIG_HIGH_RES_TIMERS=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
|
||||
CONFIG_HZ_100=y
|
||||
# CONFIG_HZ_250 is not set
|
||||
# CONFIG_HZ_300 is not set
|
||||
# CONFIG_HZ_1000 is not set
|
||||
CONFIG_HZ=100
|
||||
CONFIG_SCHED_HRTICK=y
|
||||
CONFIG_PREEMPT_NONE=y
|
||||
# CONFIG_PREEMPT_VOLUNTARY is not set
|
||||
# CONFIG_PREEMPT is not set
|
||||
CONFIG_BINFMT_ELF=y
|
||||
# CONFIG_HAVE_AOUT is not set
|
||||
# CONFIG_BINFMT_MISC is not set
|
||||
# CONFIG_MATH_EMULATION is not set
|
||||
CONFIG_8XX_MINIMAL_FPEMU=y
|
||||
# CONFIG_IOMMU_HELPER is not set
|
||||
# CONFIG_SWIOTLB is not set
|
||||
CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
|
||||
CONFIG_ARCH_HAS_WALK_MEMORY=y
|
||||
CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
|
||||
CONFIG_SPARSE_IRQ=y
|
||||
CONFIG_MAX_ACTIVE_REGIONS=32
|
||||
CONFIG_ARCH_FLATMEM_ENABLE=y
|
||||
CONFIG_ARCH_POPULATES_NODE_MAP=y
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_FLATMEM_MANUAL=y
|
||||
# CONFIG_DISCONTIGMEM_MANUAL is not set
|
||||
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||
CONFIG_FLATMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
CONFIG_PAGEFLAGS_EXTENDED=y
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=4
|
||||
CONFIG_MIGRATION=y
|
||||
# CONFIG_PHYS_ADDR_T_64BIT is not set
|
||||
CONFIG_ZONE_DMA_FLAG=1
|
||||
CONFIG_BOUNCE=y
|
||||
CONFIG_VIRT_TO_BUS=y
|
||||
# CONFIG_KSM is not set
|
||||
CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
|
||||
CONFIG_PPC_4K_PAGES=y
|
||||
# CONFIG_PPC_16K_PAGES is not set
|
||||
# CONFIG_PPC_64K_PAGES is not set
|
||||
# CONFIG_PPC_256K_PAGES is not set
|
||||
CONFIG_FORCE_MAX_ZONEORDER=11
|
||||
CONFIG_PROC_DEVICETREE=y
|
||||
# CONFIG_CMDLINE_BOOL is not set
|
||||
CONFIG_EXTRA_TARGETS=""
|
||||
# CONFIG_PM is not set
|
||||
# CONFIG_SECCOMP is not set
|
||||
CONFIG_ISA_DMA_API=y
|
||||
|
||||
#
|
||||
# Bus options
|
||||
#
|
||||
CONFIG_ZONE_DMA=y
|
||||
CONFIG_NEED_DMA_MAP_STATE=y
|
||||
CONFIG_FSL_SOC=y
|
||||
# CONFIG_PCI is not set
|
||||
# CONFIG_PCI_DOMAINS is not set
|
||||
# CONFIG_PCI_SYSCALL is not set
|
||||
# CONFIG_PCI_QSPAN is not set
|
||||
# CONFIG_ARCH_SUPPORTS_MSI is not set
|
||||
# CONFIG_PCCARD is not set
|
||||
# CONFIG_HAS_RAPIDIO is not set
|
||||
|
||||
#
|
||||
# Advanced setup
|
||||
#
|
||||
# CONFIG_ADVANCED_OPTIONS is not set
|
||||
|
||||
#
|
||||
# Default settings for advanced configuration options are used
|
||||
#
|
||||
CONFIG_LOWMEM_SIZE=0x30000000
|
||||
CONFIG_PAGE_OFFSET=0xc0000000
|
||||
CONFIG_KERNEL_START=0xc0000000
|
||||
CONFIG_PHYSICAL_START=0x00000000
|
||||
CONFIG_TASK_SIZE=0x80000000
|
||||
CONFIG_CONSISTENT_SIZE=0x00200000
|
||||
CONFIG_NET=y
|
||||
|
||||
#
|
||||
# Networking options
|
||||
#
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_UNIX=y
|
||||
# CONFIG_NET_KEY is not set
|
||||
CONFIG_INET=y
|
||||
# CONFIG_IP_MULTICAST is not set
|
||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||
CONFIG_IP_FIB_HASH=y
|
||||
CONFIG_IP_PNP=y
|
||||
# CONFIG_IP_PNP_DHCP is not set
|
||||
# CONFIG_IP_PNP_BOOTP is not set
|
||||
# CONFIG_IP_PNP_RARP is not set
|
||||
# CONFIG_NET_IPIP is not set
|
||||
# CONFIG_NET_IPGRE is not set
|
||||
# CONFIG_ARPD is not set
|
||||
CONFIG_SYN_COOKIES=y
|
||||
# CONFIG_INET_AH is not set
|
||||
# CONFIG_INET_ESP is not set
|
||||
# CONFIG_INET_IPCOMP is not set
|
||||
# CONFIG_INET_XFRM_TUNNEL is not set
|
||||
# CONFIG_INET_TUNNEL is not set
|
||||
# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
|
||||
# CONFIG_INET_XFRM_MODE_TUNNEL is not set
|
||||
# CONFIG_INET_XFRM_MODE_BEET is not set
|
||||
# CONFIG_INET_LRO is not set
|
||||
CONFIG_INET_DIAG=y
|
||||
CONFIG_INET_TCP_DIAG=y
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_CUBIC=y
|
||||
CONFIG_DEFAULT_TCP_CONG="cubic"
|
||||
# CONFIG_TCP_MD5SIG is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_NETWORK_SECMARK is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
# CONFIG_IP_DCCP is not set
|
||||
# CONFIG_IP_SCTP is not set
|
||||
# CONFIG_RDS is not set
|
||||
# CONFIG_TIPC is not set
|
||||
# CONFIG_ATM is not set
|
||||
# CONFIG_BRIDGE is not set
|
||||
# CONFIG_NET_DSA is not set
|
||||
# CONFIG_VLAN_8021Q is not set
|
||||
# CONFIG_DECNET is not set
|
||||
# CONFIG_LLC2 is not set
|
||||
# CONFIG_IPX is not set
|
||||
# CONFIG_ATALK is not set
|
||||
# CONFIG_X25 is not set
|
||||
# CONFIG_LAPB is not set
|
||||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
# CONFIG_PHONET is not set
|
||||
# CONFIG_IEEE802154 is not set
|
||||
# CONFIG_NET_SCHED is not set
|
||||
# CONFIG_DCB is not set
|
||||
|
||||
#
|
||||
# Network testing
|
||||
#
|
||||
# CONFIG_NET_PKTGEN is not set
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_CAN is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
# CONFIG_AF_RXRPC is not set
|
||||
# CONFIG_WIRELESS is not set
|
||||
# CONFIG_WIMAX is not set
|
||||
# CONFIG_RFKILL is not set
|
||||
# CONFIG_NET_9P is not set
|
||||
|
||||
#
|
||||
# Device Drivers
|
||||
#
|
||||
|
||||
#
|
||||
# Generic Driver Options
|
||||
#
|
||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
# CONFIG_DEVTMPFS is not set
|
||||
CONFIG_STANDALONE=y
|
||||
CONFIG_PREVENT_FIRMWARE_BUILD=y
|
||||
# CONFIG_FW_LOADER is not set
|
||||
# CONFIG_DEBUG_DRIVER is not set
|
||||
# CONFIG_DEBUG_DEVRES is not set
|
||||
# CONFIG_SYS_HYPERVISOR is not set
|
||||
# CONFIG_CONNECTOR is not set
|
||||
CONFIG_MTD=y
|
||||
# CONFIG_MTD_DEBUG is not set
|
||||
# CONFIG_MTD_TESTS is not set
|
||||
CONFIG_MTD_CONCAT=y
|
||||
CONFIG_MTD_PARTITIONS=y
|
||||
# CONFIG_MTD_REDBOOT_PARTS is not set
|
||||
CONFIG_MTD_CMDLINE_PARTS=y
|
||||
CONFIG_MTD_OF_PARTS=y
|
||||
# CONFIG_MTD_AR7_PARTS is not set
|
||||
|
||||
#
|
||||
# User Modules And Translation Layers
|
||||
#
|
||||
CONFIG_MTD_CHAR=y
|
||||
CONFIG_MTD_BLKDEVS=y
|
||||
CONFIG_MTD_BLOCK=y
|
||||
# CONFIG_FTL is not set
|
||||
# CONFIG_NFTL is not set
|
||||
# CONFIG_INFTL is not set
|
||||
# CONFIG_RFD_FTL is not set
|
||||
# CONFIG_SSFDC is not set
|
||||
# CONFIG_MTD_OOPS is not set
|
||||
|
||||
#
|
||||
# RAM/ROM/Flash chip drivers
|
||||
#
|
||||
CONFIG_MTD_CFI=y
|
||||
# CONFIG_MTD_JEDECPROBE is not set
|
||||
CONFIG_MTD_GEN_PROBE=y
|
||||
# CONFIG_MTD_CFI_ADV_OPTIONS is not set
|
||||
CONFIG_MTD_MAP_BANK_WIDTH_1=y
|
||||
CONFIG_MTD_MAP_BANK_WIDTH_2=y
|
||||
CONFIG_MTD_MAP_BANK_WIDTH_4=y
|
||||
# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
|
||||
# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
|
||||
# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
|
||||
CONFIG_MTD_CFI_I1=y
|
||||
CONFIG_MTD_CFI_I2=y
|
||||
# CONFIG_MTD_CFI_I4 is not set
|
||||
# CONFIG_MTD_CFI_I8 is not set
|
||||
CONFIG_MTD_CFI_INTELEXT=y
|
||||
CONFIG_MTD_CFI_AMDSTD=y
|
||||
# CONFIG_MTD_CFI_STAA is not set
|
||||
CONFIG_MTD_CFI_UTIL=y
|
||||
# CONFIG_MTD_RAM is not set
|
||||
# CONFIG_MTD_ROM is not set
|
||||
# CONFIG_MTD_ABSENT is not set
|
||||
|
||||
#
|
||||
# Mapping drivers for chip access
|
||||
#
|
||||
# CONFIG_MTD_COMPLEX_MAPPINGS is not set
|
||||
# CONFIG_MTD_PHYSMAP is not set
|
||||
CONFIG_MTD_PHYSMAP_OF=y
|
||||
# CONFIG_MTD_CFI_FLAGADM is not set
|
||||
# CONFIG_MTD_PLATRAM is not set
|
||||
|
||||
#
|
||||
# Self-contained MTD device drivers
|
||||
#
|
||||
# CONFIG_MTD_SLRAM is not set
|
||||
# CONFIG_MTD_PHRAM is not set
|
||||
# CONFIG_MTD_MTDRAM is not set
|
||||
# CONFIG_MTD_BLOCK2MTD is not set
|
||||
|
||||
#
|
||||
# Disk-On-Chip Device Drivers
|
||||
#
|
||||
# CONFIG_MTD_DOC2000 is not set
|
||||
# CONFIG_MTD_DOC2001 is not set
|
||||
# CONFIG_MTD_DOC2001PLUS is not set
|
||||
# CONFIG_MTD_NAND is not set
|
||||
# CONFIG_MTD_ONENAND is not set
|
||||
|
||||
#
|
||||
# LPDDR flash memory drivers
|
||||
#
|
||||
# CONFIG_MTD_LPDDR is not set
|
||||
|
||||
#
|
||||
# UBI - Unsorted block images
|
||||
#
|
||||
# CONFIG_MTD_UBI is not set
|
||||
CONFIG_OF_FLATTREE=y
|
||||
CONFIG_OF_DYNAMIC=y
|
||||
CONFIG_OF_DEVICE=y
|
||||
CONFIG_OF_MDIO=y
|
||||
# CONFIG_PARPORT is not set
|
||||
# CONFIG_BLK_DEV is not set
|
||||
# CONFIG_MISC_DEVICES is not set
|
||||
CONFIG_HAVE_IDE=y
|
||||
# CONFIG_IDE is not set
|
||||
|
||||
#
|
||||
# SCSI device support
|
||||
#
|
||||
# CONFIG_RAID_ATTRS is not set
|
||||
# CONFIG_SCSI is not set
|
||||
# CONFIG_SCSI_DMA is not set
|
||||
# CONFIG_SCSI_NETLINK is not set
|
||||
# CONFIG_ATA is not set
|
||||
# CONFIG_MD is not set
|
||||
# CONFIG_MACINTOSH_DRIVERS is not set
|
||||
CONFIG_NETDEVICES=y
|
||||
# CONFIG_DUMMY is not set
|
||||
# CONFIG_BONDING is not set
|
||||
# CONFIG_MACVLAN is not set
|
||||
# CONFIG_EQUALIZER is not set
|
||||
# CONFIG_TUN is not set
|
||||
# CONFIG_VETH is not set
|
||||
CONFIG_PHYLIB=y
|
||||
|
||||
#
|
||||
# MII PHY device drivers
|
||||
#
|
||||
# CONFIG_MARVELL_PHY is not set
|
||||
CONFIG_DAVICOM_PHY=y
|
||||
# CONFIG_QSEMI_PHY is not set
|
||||
# CONFIG_LXT_PHY is not set
|
||||
# CONFIG_CICADA_PHY is not set
|
||||
# CONFIG_VITESSE_PHY is not set
|
||||
# CONFIG_SMSC_PHY is not set
|
||||
# CONFIG_BROADCOM_PHY is not set
|
||||
# CONFIG_ICPLUS_PHY is not set
|
||||
# CONFIG_REALTEK_PHY is not set
|
||||
# CONFIG_NATIONAL_PHY is not set
|
||||
# CONFIG_STE10XP is not set
|
||||
# CONFIG_LSI_ET1011C_PHY is not set
|
||||
CONFIG_FIXED_PHY=y
|
||||
# CONFIG_MDIO_BITBANG is not set
|
||||
CONFIG_NET_ETHERNET=y
|
||||
CONFIG_MII=y
|
||||
# CONFIG_ETHOC is not set
|
||||
# CONFIG_DNET is not set
|
||||
# CONFIG_IBM_NEW_EMAC_ZMII is not set
|
||||
# CONFIG_IBM_NEW_EMAC_RGMII is not set
|
||||
# CONFIG_IBM_NEW_EMAC_TAH is not set
|
||||
# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
|
||||
# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
|
||||
# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
|
||||
# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
|
||||
# CONFIG_B44 is not set
|
||||
# CONFIG_KS8842 is not set
|
||||
# CONFIG_KS8851_MLL is not set
|
||||
# CONFIG_XILINX_EMACLITE is not set
|
||||
CONFIG_FS_ENET=y
|
||||
CONFIG_FS_ENET_HAS_SCC=y
|
||||
CONFIG_FS_ENET_HAS_FEC=y
|
||||
CONFIG_FS_ENET_MDIO_FEC=y
|
||||
# CONFIG_NETDEV_1000 is not set
|
||||
# CONFIG_NETDEV_10000 is not set
|
||||
# CONFIG_WLAN is not set
|
||||
|
||||
#
|
||||
# Enable WiMAX (Networking options) to see the WiMAX drivers
|
||||
#
|
||||
# CONFIG_WAN is not set
|
||||
# CONFIG_PPP is not set
|
||||
# CONFIG_SLIP is not set
|
||||
# CONFIG_NETCONSOLE is not set
|
||||
# CONFIG_NETPOLL is not set
|
||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
||||
# CONFIG_ISDN is not set
|
||||
# CONFIG_PHONE is not set
|
||||
|
||||
#
|
||||
# Input device support
|
||||
#
|
||||
# CONFIG_INPUT is not set
|
||||
|
||||
#
|
||||
# Hardware I/O ports
|
||||
#
|
||||
# CONFIG_SERIO is not set
|
||||
# CONFIG_GAMEPORT is not set
|
||||
|
||||
#
|
||||
# Character devices
|
||||
#
|
||||
# CONFIG_VT is not set
|
||||
CONFIG_DEVKMEM=y
|
||||
# CONFIG_SERIAL_NONSTANDARD is not set
|
||||
|
||||
#
|
||||
# Serial drivers
|
||||
#
|
||||
# CONFIG_SERIAL_8250 is not set
|
||||
|
||||
#
|
||||
# Non-8250 serial port support
|
||||
#
|
||||
# CONFIG_SERIAL_UARTLITE is not set
|
||||
CONFIG_SERIAL_CORE=y
|
||||
CONFIG_SERIAL_CORE_CONSOLE=y
|
||||
CONFIG_SERIAL_CPM=y
|
||||
CONFIG_SERIAL_CPM_CONSOLE=y
|
||||
# CONFIG_SERIAL_TIMBERDALE is not set
|
||||
# CONFIG_SERIAL_GRLIB_GAISLER_APBUART is not set
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
|
||||
# CONFIG_LEGACY_PTYS is not set
|
||||
# CONFIG_HVC_UDBG is not set
|
||||
# CONFIG_IPMI_HANDLER is not set
|
||||
CONFIG_HW_RANDOM=y
|
||||
# CONFIG_HW_RANDOM_TIMERIOMEM is not set
|
||||
# CONFIG_NVRAM is not set
|
||||
CONFIG_GEN_RTC=y
|
||||
# CONFIG_GEN_RTC_X is not set
|
||||
# CONFIG_R3964 is not set
|
||||
# CONFIG_RAW_DRIVER is not set
|
||||
# CONFIG_TCG_TPM is not set
|
||||
# CONFIG_I2C is not set
|
||||
# CONFIG_SPI is not set
|
||||
|
||||
#
|
||||
# PPS support
|
||||
#
|
||||
# CONFIG_PPS is not set
|
||||
CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
|
||||
# CONFIG_GPIOLIB is not set
|
||||
# CONFIG_W1 is not set
|
||||
# CONFIG_POWER_SUPPLY is not set
|
||||
# CONFIG_HWMON is not set
|
||||
# CONFIG_THERMAL is not set
|
||||
# CONFIG_WATCHDOG is not set
|
||||
CONFIG_SSB_POSSIBLE=y
|
||||
|
||||
#
|
||||
# Sonics Silicon Backplane
|
||||
#
|
||||
# CONFIG_SSB is not set
|
||||
|
||||
#
|
||||
# Multifunction device drivers
|
||||
#
|
||||
# CONFIG_MFD_CORE is not set
|
||||
# CONFIG_MFD_SM501 is not set
|
||||
# CONFIG_HTC_PASIC3 is not set
|
||||
# CONFIG_MFD_TMIO is not set
|
||||
# CONFIG_REGULATOR is not set
|
||||
# CONFIG_MEDIA_SUPPORT is not set
|
||||
|
||||
#
|
||||
# Graphics support
|
||||
#
|
||||
# CONFIG_VGASTATE is not set
|
||||
# CONFIG_VIDEO_OUTPUT_CONTROL is not set
|
||||
# CONFIG_FB is not set
|
||||
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
|
||||
|
||||
#
|
||||
# Display device support
|
||||
#
|
||||
# CONFIG_DISPLAY_SUPPORT is not set
|
||||
# CONFIG_SOUND is not set
|
||||
# CONFIG_USB_SUPPORT is not set
|
||||
# CONFIG_MMC is not set
|
||||
# CONFIG_MEMSTICK is not set
|
||||
# CONFIG_NEW_LEDS is not set
|
||||
# CONFIG_ACCESSIBILITY is not set
|
||||
# CONFIG_EDAC is not set
|
||||
# CONFIG_RTC_CLASS is not set
|
||||
# CONFIG_DMADEVICES is not set
|
||||
# CONFIG_AUXDISPLAY is not set
|
||||
# CONFIG_UIO is not set
|
||||
|
||||
#
|
||||
# TI VLYNQ
|
||||
#
|
||||
# CONFIG_STAGING is not set
|
||||
|
||||
#
|
||||
# File systems
|
||||
#
|
||||
# CONFIG_EXT2_FS is not set
|
||||
# CONFIG_EXT3_FS is not set
|
||||
# CONFIG_EXT4_FS is not set
|
||||
# CONFIG_REISERFS_FS is not set
|
||||
# CONFIG_JFS_FS is not set
|
||||
# CONFIG_FS_POSIX_ACL is not set
|
||||
# CONFIG_XFS_FS is not set
|
||||
# CONFIG_GFS2_FS is not set
|
||||
# CONFIG_OCFS2_FS is not set
|
||||
# CONFIG_BTRFS_FS is not set
|
||||
# CONFIG_NILFS2_FS is not set
|
||||
CONFIG_FILE_LOCKING=y
|
||||
CONFIG_FSNOTIFY=y
|
||||
# CONFIG_DNOTIFY is not set
|
||||
# CONFIG_INOTIFY is not set
|
||||
CONFIG_INOTIFY_USER=y
|
||||
# CONFIG_QUOTA is not set
|
||||
# CONFIG_AUTOFS_FS is not set
|
||||
# CONFIG_AUTOFS4_FS is not set
|
||||
# CONFIG_FUSE_FS is not set
|
||||
|
||||
#
|
||||
# Caches
|
||||
#
|
||||
# CONFIG_FSCACHE is not set
|
||||
|
||||
#
|
||||
# CD-ROM/DVD Filesystems
|
||||
#
|
||||
# CONFIG_ISO9660_FS is not set
|
||||
# CONFIG_UDF_FS is not set
|
||||
|
||||
#
|
||||
# DOS/FAT/NT Filesystems
|
||||
#
|
||||
# CONFIG_MSDOS_FS is not set
|
||||
# CONFIG_VFAT_FS is not set
|
||||
# CONFIG_NTFS_FS is not set
|
||||
|
||||
#
|
||||
# Pseudo filesystems
|
||||
#
|
||||
CONFIG_PROC_FS=y
|
||||
# CONFIG_PROC_KCORE is not set
|
||||
CONFIG_PROC_SYSCTL=y
|
||||
CONFIG_PROC_PAGE_MONITOR=y
|
||||
CONFIG_SYSFS=y
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_TMPFS_POSIX_ACL is not set
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
# CONFIG_CONFIGFS_FS is not set
|
||||
CONFIG_MISC_FILESYSTEMS=y
|
||||
# CONFIG_ADFS_FS is not set
|
||||
# CONFIG_AFFS_FS is not set
|
||||
# CONFIG_HFS_FS is not set
|
||||
# CONFIG_HFSPLUS_FS is not set
|
||||
# CONFIG_BEFS_FS is not set
|
||||
# CONFIG_BFS_FS is not set
|
||||
# CONFIG_EFS_FS is not set
|
||||
# CONFIG_JFFS2_FS is not set
|
||||
# CONFIG_LOGFS is not set
|
||||
CONFIG_CRAMFS=y
|
||||
# CONFIG_SQUASHFS is not set
|
||||
# CONFIG_VXFS_FS is not set
|
||||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_OMFS_FS is not set
|
||||
# CONFIG_HPFS_FS is not set
|
||||
# CONFIG_QNX4FS_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
# CONFIG_SYSV_FS is not set
|
||||
# CONFIG_UFS_FS is not set
|
||||
CONFIG_NETWORK_FILESYSTEMS=y
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3=y
|
||||
# CONFIG_NFS_V3_ACL is not set
|
||||
# CONFIG_NFS_V4 is not set
|
||||
CONFIG_ROOT_NFS=y
|
||||
# CONFIG_NFSD is not set
|
||||
CONFIG_LOCKD=y
|
||||
CONFIG_LOCKD_V4=y
|
||||
CONFIG_NFS_COMMON=y
|
||||
CONFIG_SUNRPC=y
|
||||
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
||||
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
||||
# CONFIG_SMB_FS is not set
|
||||
# CONFIG_CIFS is not set
|
||||
# CONFIG_NCP_FS is not set
|
||||
# CONFIG_CODA_FS is not set
|
||||
# CONFIG_AFS_FS is not set
|
||||
|
||||
#
|
||||
# Partition Types
|
||||
#
|
||||
CONFIG_PARTITION_ADVANCED=y
|
||||
# CONFIG_ACORN_PARTITION is not set
|
||||
# CONFIG_OSF_PARTITION is not set
|
||||
# CONFIG_AMIGA_PARTITION is not set
|
||||
# CONFIG_ATARI_PARTITION is not set
|
||||
# CONFIG_MAC_PARTITION is not set
|
||||
CONFIG_MSDOS_PARTITION=y
|
||||
# CONFIG_BSD_DISKLABEL is not set
|
||||
# CONFIG_MINIX_SUBPARTITION is not set
|
||||
# CONFIG_SOLARIS_X86_PARTITION is not set
|
||||
# CONFIG_UNIXWARE_DISKLABEL is not set
|
||||
# CONFIG_LDM_PARTITION is not set
|
||||
# CONFIG_SGI_PARTITION is not set
|
||||
# CONFIG_ULTRIX_PARTITION is not set
|
||||
# CONFIG_SUN_PARTITION is not set
|
||||
# CONFIG_KARMA_PARTITION is not set
|
||||
# CONFIG_EFI_PARTITION is not set
|
||||
# CONFIG_SYSV68_PARTITION is not set
|
||||
# CONFIG_NLS is not set
|
||||
# CONFIG_DLM is not set
|
||||
# CONFIG_BINARY_PRINTF is not set
|
||||
|
||||
#
|
||||
# Library routines
|
||||
#
|
||||
CONFIG_GENERIC_FIND_LAST_BIT=y
|
||||
# CONFIG_CRC_CCITT is not set
|
||||
# CONFIG_CRC16 is not set
|
||||
# CONFIG_CRC_T10DIF is not set
|
||||
# CONFIG_CRC_ITU_T is not set
|
||||
# CONFIG_CRC32 is not set
|
||||
# CONFIG_CRC7 is not set
|
||||
# CONFIG_LIBCRC32C is not set
|
||||
CONFIG_ZLIB_INFLATE=y
|
||||
CONFIG_HAS_IOMEM=y
|
||||
CONFIG_HAS_IOPORT=y
|
||||
CONFIG_HAS_DMA=y
|
||||
CONFIG_HAVE_LMB=y
|
||||
CONFIG_NLATTR=y
|
||||
CONFIG_GENERIC_ATOMIC64=y
|
||||
|
||||
#
|
||||
# Kernel hacking
|
||||
#
|
||||
# CONFIG_PRINTK_TIME is not set
|
||||
CONFIG_ENABLE_WARN_DEPRECATED=y
|
||||
CONFIG_ENABLE_MUST_CHECK=y
|
||||
CONFIG_FRAME_WARN=1024
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
# CONFIG_STRIP_ASM_SYMS is not set
|
||||
# CONFIG_UNUSED_SYMBOLS is not set
|
||||
# CONFIG_DEBUG_FS is not set
|
||||
# CONFIG_HEADERS_CHECK is not set
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
# CONFIG_DEBUG_SHIRQ is not set
|
||||
CONFIG_DETECT_SOFTLOCKUP=y
|
||||
# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
|
||||
CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
|
||||
CONFIG_DETECT_HUNG_TASK=y
|
||||
# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set
|
||||
CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0
|
||||
CONFIG_SCHED_DEBUG=y
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_TIMER_STATS is not set
|
||||
# CONFIG_DEBUG_OBJECTS is not set
|
||||
# CONFIG_SLUB_DEBUG_ON is not set
|
||||
# CONFIG_SLUB_STATS is not set
|
||||
# CONFIG_DEBUG_KMEMLEAK is not set
|
||||
# CONFIG_DEBUG_SPINLOCK is not set
|
||||
# CONFIG_DEBUG_MUTEXES is not set
|
||||
# CONFIG_DEBUG_LOCK_ALLOC is not set
|
||||
# CONFIG_PROVE_LOCKING is not set
|
||||
# CONFIG_LOCK_STAT is not set
|
||||
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
|
||||
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
|
||||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
CONFIG_DEBUG_BUGVERBOSE=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
# CONFIG_DEBUG_VM is not set
|
||||
# CONFIG_DEBUG_WRITECOUNT is not set
|
||||
# CONFIG_DEBUG_MEMORY_INIT is not set
|
||||
# CONFIG_DEBUG_LIST is not set
|
||||
# CONFIG_DEBUG_SG is not set
|
||||
# CONFIG_DEBUG_NOTIFIERS is not set
|
||||
# CONFIG_DEBUG_CREDENTIALS is not set
|
||||
# CONFIG_RCU_TORTURE_TEST is not set
|
||||
# CONFIG_RCU_CPU_STALL_DETECTOR is not set
|
||||
# CONFIG_BACKTRACE_SELF_TEST is not set
|
||||
# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
|
||||
# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
|
||||
# CONFIG_FAULT_INJECTION is not set
|
||||
# CONFIG_LATENCYTOP is not set
|
||||
# CONFIG_SYSCTL_SYSCALL_CHECK is not set
|
||||
# CONFIG_DEBUG_PAGEALLOC is not set
|
||||
CONFIG_HAVE_FUNCTION_TRACER=y
|
||||
CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
|
||||
CONFIG_HAVE_DYNAMIC_FTRACE=y
|
||||
CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
|
||||
CONFIG_TRACING_SUPPORT=y
|
||||
CONFIG_FTRACE=y
|
||||
# CONFIG_FUNCTION_TRACER is not set
|
||||
# CONFIG_IRQSOFF_TRACER is not set
|
||||
# CONFIG_SCHED_TRACER is not set
|
||||
# CONFIG_ENABLE_DEFAULT_TRACERS is not set
|
||||
# CONFIG_BOOT_TRACER is not set
|
||||
CONFIG_BRANCH_PROFILE_NONE=y
|
||||
# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set
|
||||
# CONFIG_PROFILE_ALL_BRANCHES is not set
|
||||
# CONFIG_STACK_TRACER is not set
|
||||
# CONFIG_KMEMTRACE is not set
|
||||
# CONFIG_WORKQUEUE_TRACER is not set
|
||||
# CONFIG_BLK_DEV_IO_TRACE is not set
|
||||
# CONFIG_DMA_API_DEBUG is not set
|
||||
# CONFIG_SAMPLES is not set
|
||||
CONFIG_HAVE_ARCH_KGDB=y
|
||||
# CONFIG_KGDB is not set
|
||||
# CONFIG_PPC_DISABLE_WERROR is not set
|
||||
CONFIG_PPC_WERROR=y
|
||||
CONFIG_PRINT_STACK_DEPTH=64
|
||||
# CONFIG_DEBUG_STACKOVERFLOW is not set
|
||||
# CONFIG_DEBUG_STACK_USAGE is not set
|
||||
# CONFIG_CODE_PATCHING_SELFTEST is not set
|
||||
# CONFIG_FTR_FIXUP_SELFTEST is not set
|
||||
# CONFIG_MSI_BITMAP_SELFTEST is not set
|
||||
# CONFIG_XMON is not set
|
||||
# CONFIG_IRQSTACKS is not set
|
||||
# CONFIG_BDI_SWITCH is not set
|
||||
# CONFIG_PPC_EARLY_DEBUG is not set
|
||||
|
||||
#
|
||||
# Security options
|
||||
#
|
||||
# CONFIG_KEYS is not set
|
||||
# CONFIG_SECURITY is not set
|
||||
# CONFIG_SECURITYFS is not set
|
||||
# CONFIG_DEFAULT_SECURITY_SELINUX is not set
|
||||
# CONFIG_DEFAULT_SECURITY_SMACK is not set
|
||||
# CONFIG_DEFAULT_SECURITY_TOMOYO is not set
|
||||
CONFIG_DEFAULT_SECURITY_DAC=y
|
||||
CONFIG_DEFAULT_SECURITY=""
|
||||
# CONFIG_CRYPTO is not set
|
||||
CONFIG_PPC_CLOCK=y
|
||||
CONFIG_PPC_LIB_RHEAP=y
|
||||
# CONFIG_VIRTUALIZATION is not set
|
@ -69,7 +69,7 @@ static inline unsigned long phys_to_abs(unsigned long pa)
|
||||
* Legacy iSeries Hypervisor calls
|
||||
*/
|
||||
#define iseries_hv_addr(virtaddr) \
|
||||
(0x8000000000000000 | virt_to_abs(virtaddr))
|
||||
(0x8000000000000000UL | virt_to_abs(virtaddr))
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* _ASM_POWERPC_ABS_ADDR_H */
|
||||
|
@ -30,6 +30,7 @@
|
||||
#define PPC_STLCX stringify_in_c(stdcx.)
|
||||
#define PPC_CNTLZL stringify_in_c(cntlzd)
|
||||
#define PPC_LR_STKOFF 16
|
||||
#define PPC_MIN_STKFRM 112
|
||||
|
||||
/* Move to CR, single-entry optimized version. Only available
|
||||
* on POWER4 and later.
|
||||
@ -55,6 +56,7 @@
|
||||
#define PPC_CNTLZL stringify_in_c(cntlzw)
|
||||
#define PPC_MTOCRF stringify_in_c(mtcrf)
|
||||
#define PPC_LR_STKOFF 4
|
||||
#define PPC_MIN_STKFRM 16
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -517,6 +517,10 @@ static inline int cpu_has_feature(unsigned long feature)
|
||||
& feature);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HAVE_HW_BREAKPOINT
|
||||
#define HBP_NUM 1
|
||||
#endif /* CONFIG_HAVE_HW_BREAKPOINT */
|
||||
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
@ -27,10 +27,10 @@ enum ppc_dbell {
|
||||
PPC_G_DBELL_MC = 4, /* guest mcheck doorbell */
|
||||
};
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
extern unsigned long dbell_smp_message[NR_CPUS];
|
||||
extern void smp_dbell_message_pass(int target, int msg);
|
||||
#endif
|
||||
extern void doorbell_message_pass(int target, int msg);
|
||||
extern void doorbell_exception(struct pt_regs *regs);
|
||||
extern void doorbell_check_self(void);
|
||||
extern void doorbell_setup_this_cpu(void);
|
||||
|
||||
static inline void ppc_msgsnd(enum ppc_dbell type, u32 flags, u32 tag)
|
||||
{
|
||||
|
@ -74,6 +74,7 @@
|
||||
#define H_NOT_ENOUGH_RESOURCES -44
|
||||
#define H_R_STATE -45
|
||||
#define H_RESCINDEND -46
|
||||
#define H_MULTI_THREADS_ACTIVE -9005
|
||||
|
||||
|
||||
/* Long Busy is a condition that can be returned by the firmware
|
||||
|
74
arch/powerpc/include/asm/hw_breakpoint.h
Normal file
74
arch/powerpc/include/asm/hw_breakpoint.h
Normal file
@ -0,0 +1,74 @@
|
||||
/*
|
||||
* PowerPC BookIII S hardware breakpoint definitions
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* Copyright 2010, IBM Corporation.
|
||||
* Author: K.Prasad <prasad@linux.vnet.ibm.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _PPC_BOOK3S_64_HW_BREAKPOINT_H
|
||||
#define _PPC_BOOK3S_64_HW_BREAKPOINT_H
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#ifdef CONFIG_HAVE_HW_BREAKPOINT
|
||||
|
||||
struct arch_hw_breakpoint {
|
||||
bool extraneous_interrupt;
|
||||
u8 len; /* length of the target data symbol */
|
||||
int type;
|
||||
unsigned long address;
|
||||
};
|
||||
|
||||
#include <linux/kdebug.h>
|
||||
#include <asm/reg.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
struct perf_event;
|
||||
struct pmu;
|
||||
struct perf_sample_data;
|
||||
|
||||
#define HW_BREAKPOINT_ALIGN 0x7
|
||||
/* Maximum permissible length of any HW Breakpoint */
|
||||
#define HW_BREAKPOINT_LEN 0x8
|
||||
|
||||
extern int hw_breakpoint_slots(int type);
|
||||
extern int arch_bp_generic_fields(int type, int *gen_bp_type);
|
||||
extern int arch_check_bp_in_kernelspace(struct perf_event *bp);
|
||||
extern int arch_validate_hwbkpt_settings(struct perf_event *bp);
|
||||
extern int hw_breakpoint_exceptions_notify(struct notifier_block *unused,
|
||||
unsigned long val, void *data);
|
||||
int arch_install_hw_breakpoint(struct perf_event *bp);
|
||||
void arch_uninstall_hw_breakpoint(struct perf_event *bp);
|
||||
void hw_breakpoint_pmu_read(struct perf_event *bp);
|
||||
extern void flush_ptrace_hw_breakpoint(struct task_struct *tsk);
|
||||
|
||||
extern struct pmu perf_ops_bp;
|
||||
extern void ptrace_triggered(struct perf_event *bp, int nmi,
|
||||
struct perf_sample_data *data, struct pt_regs *regs);
|
||||
static inline void hw_breakpoint_disable(void)
|
||||
{
|
||||
set_dabr(0);
|
||||
}
|
||||
extern void thread_change_pc(struct task_struct *tsk, struct pt_regs *regs);
|
||||
|
||||
#else /* CONFIG_HAVE_HW_BREAKPOINT */
|
||||
static inline void hw_breakpoint_disable(void) { }
|
||||
static inline void thread_change_pc(struct task_struct *tsk,
|
||||
struct pt_regs *regs) { }
|
||||
#endif /* CONFIG_HAVE_HW_BREAKPOINT */
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* _PPC_BOOK3S_64_HW_BREAKPOINT_H */
|
@ -266,6 +266,7 @@ struct machdep_calls {
|
||||
void (*suspend_disable_irqs)(void);
|
||||
void (*suspend_enable_irqs)(void);
|
||||
#endif
|
||||
int (*suspend_disable_cpu)(void);
|
||||
|
||||
#ifdef CONFIG_ARCH_CPU_PROBE_RELEASE
|
||||
ssize_t (*cpu_probe)(const char *, size_t);
|
||||
@ -277,6 +278,7 @@ extern void e500_idle(void);
|
||||
extern void power4_idle(void);
|
||||
extern void power4_cpu_offline_powersave(void);
|
||||
extern void ppc6xx_idle(void);
|
||||
extern void book3e_idle(void);
|
||||
|
||||
/*
|
||||
* ppc_md contains a copy of the machine description structure for the
|
||||
@ -366,8 +368,5 @@ static inline void log_error(char *buf, unsigned int err_type, int fatal)
|
||||
#define machine_late_initcall(mach,fn) __define_machine_initcall(mach,"7",fn,7)
|
||||
#define machine_late_initcall_sync(mach,fn) __define_machine_initcall(mach,"7s",fn,7s)
|
||||
|
||||
void generic_suspend_disable_irqs(void);
|
||||
void generic_suspend_enable_irqs(void);
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* _ASM_POWERPC_MACHDEP_H */
|
||||
|
@ -193,6 +193,10 @@ struct mmu_psize_def
|
||||
{
|
||||
unsigned int shift; /* number of bits */
|
||||
unsigned int enc; /* PTE encoding */
|
||||
unsigned int ind; /* Corresponding indirect page size shift */
|
||||
unsigned int flags;
|
||||
#define MMU_PAGE_SIZE_DIRECT 0x1 /* Supported as a direct size */
|
||||
#define MMU_PAGE_SIZE_INDIRECT 0x2 /* Supported as an indirect size */
|
||||
};
|
||||
extern struct mmu_psize_def mmu_psize_defs[MMU_PAGE_COUNT];
|
||||
|
||||
|
@ -21,4 +21,36 @@ struct mpc512x_reset_module {
|
||||
u32 rcer; /* Reset Control Enable Register */
|
||||
};
|
||||
|
||||
/*
|
||||
* Clock Control Module
|
||||
*/
|
||||
struct mpc512x_ccm {
|
||||
u32 spmr; /* System PLL Mode Register */
|
||||
u32 sccr1; /* System Clock Control Register 1 */
|
||||
u32 sccr2; /* System Clock Control Register 2 */
|
||||
u32 scfr1; /* System Clock Frequency Register 1 */
|
||||
u32 scfr2; /* System Clock Frequency Register 2 */
|
||||
u32 scfr2s; /* System Clock Frequency Shadow Register 2 */
|
||||
u32 bcr; /* Bread Crumb Register */
|
||||
u32 p0ccr; /* PSC0 Clock Control Register */
|
||||
u32 p1ccr; /* PSC1 CCR */
|
||||
u32 p2ccr; /* PSC2 CCR */
|
||||
u32 p3ccr; /* PSC3 CCR */
|
||||
u32 p4ccr; /* PSC4 CCR */
|
||||
u32 p5ccr; /* PSC5 CCR */
|
||||
u32 p6ccr; /* PSC6 CCR */
|
||||
u32 p7ccr; /* PSC7 CCR */
|
||||
u32 p8ccr; /* PSC8 CCR */
|
||||
u32 p9ccr; /* PSC9 CCR */
|
||||
u32 p10ccr; /* PSC10 CCR */
|
||||
u32 p11ccr; /* PSC11 CCR */
|
||||
u32 spccr; /* SPDIF Clock Control Register */
|
||||
u32 cccr; /* CFM Clock Control Register */
|
||||
u32 dccr; /* DIU Clock Control Register */
|
||||
u32 m1ccr; /* MSCAN1 CCR */
|
||||
u32 m2ccr; /* MSCAN2 CCR */
|
||||
u32 m3ccr; /* MSCAN3 CCR */
|
||||
u32 m4ccr; /* MSCAN4 CCR */
|
||||
u8 res[0x98]; /* Reserved */
|
||||
};
|
||||
#endif /* __ASM_POWERPC_MPC5121_H__ */
|
||||
|
@ -146,7 +146,7 @@ struct paca_struct {
|
||||
extern struct paca_struct *paca;
|
||||
extern __initdata struct paca_struct boot_paca;
|
||||
extern void initialise_paca(struct paca_struct *new_paca, int cpu);
|
||||
|
||||
extern void setup_paca(struct paca_struct *new_paca);
|
||||
extern void allocate_pacas(void);
|
||||
extern void free_unused_pacas(void);
|
||||
|
||||
|
@ -1,7 +1,6 @@
|
||||
#ifndef _ASM_POWERPC_PERCPU_H_
|
||||
#define _ASM_POWERPC_PERCPU_H_
|
||||
#ifdef __powerpc64__
|
||||
#include <linux/compiler.h>
|
||||
|
||||
/*
|
||||
* Same as asm-generic/percpu.h, except that we store the per cpu offset
|
||||
@ -12,9 +11,7 @@
|
||||
|
||||
#include <asm/paca.h>
|
||||
|
||||
#define __per_cpu_offset(cpu) (paca[cpu].data_offset)
|
||||
#define __my_cpu_offset local_paca->data_offset
|
||||
#define per_cpu_offset(x) (__per_cpu_offset(x))
|
||||
|
||||
#endif /* CONFIG_SMP */
|
||||
#endif /* __powerpc64__ */
|
||||
|
@ -52,13 +52,17 @@
|
||||
#define PPC_INST_WAIT 0x7c00007c
|
||||
#define PPC_INST_TLBIVAX 0x7c000624
|
||||
#define PPC_INST_TLBSRX_DOT 0x7c0006a5
|
||||
#define PPC_INST_XXLOR 0xf0000510
|
||||
|
||||
/* macros to insert fields into opcodes */
|
||||
#define __PPC_RA(a) (((a) & 0x1f) << 16)
|
||||
#define __PPC_RB(b) (((b) & 0x1f) << 11)
|
||||
#define __PPC_RS(s) (((s) & 0x1f) << 21)
|
||||
#define __PPC_RT(s) __PPC_RS(s)
|
||||
#define __PPC_XA(a) ((((a) & 0x1f) << 16) | (((a) & 0x20) >> 3))
|
||||
#define __PPC_XB(b) ((((b) & 0x1f) << 11) | (((b) & 0x20) >> 4))
|
||||
#define __PPC_XS(s) ((((s) & 0x1f) << 21) | (((s) & 0x20) >> 5))
|
||||
#define __PPC_XT(s) __PPC_XS(s)
|
||||
#define __PPC_T_TLB(t) (((t) & 0x3) << 21)
|
||||
#define __PPC_WC(w) (((w) & 0x3) << 21)
|
||||
/*
|
||||
@ -106,9 +110,12 @@
|
||||
* the 128 bit load store instructions based on that.
|
||||
*/
|
||||
#define VSX_XX1(s, a, b) (__PPC_XS(s) | __PPC_RA(a) | __PPC_RB(b))
|
||||
#define VSX_XX3(t, a, b) (__PPC_XT(t) | __PPC_XA(a) | __PPC_XB(b))
|
||||
#define STXVD2X(s, a, b) stringify_in_c(.long PPC_INST_STXVD2X | \
|
||||
VSX_XX1((s), (a), (b)))
|
||||
#define LXVD2X(s, a, b) stringify_in_c(.long PPC_INST_LXVD2X | \
|
||||
VSX_XX1((s), (a), (b)))
|
||||
#define XXLOR(t, a, b) stringify_in_c(.long PPC_INST_XXLOR | \
|
||||
VSX_XX3((t), (a), (b)))
|
||||
|
||||
#endif /* _ASM_POWERPC_PPC_OPCODE_H */
|
||||
|
@ -209,6 +209,14 @@ struct thread_struct {
|
||||
#ifdef CONFIG_PPC64
|
||||
unsigned long start_tb; /* Start purr when proc switched in */
|
||||
unsigned long accum_tb; /* Total accumilated purr for process */
|
||||
#ifdef CONFIG_HAVE_HW_BREAKPOINT
|
||||
struct perf_event *ptrace_bps[HBP_NUM];
|
||||
/*
|
||||
* Helps identify source of single-step exception and subsequent
|
||||
* hw-breakpoint enablement
|
||||
*/
|
||||
struct perf_event *last_hit_ubp;
|
||||
#endif /* CONFIG_HAVE_HW_BREAKPOINT */
|
||||
#endif
|
||||
unsigned long dabr; /* Data address breakpoint register */
|
||||
#ifdef CONFIG_ALTIVEC
|
||||
|
@ -890,7 +890,7 @@
|
||||
#ifndef __ASSEMBLY__
|
||||
#define mfmsr() ({unsigned long rval; \
|
||||
asm volatile("mfmsr %0" : "=r" (rval)); rval;})
|
||||
#ifdef CONFIG_PPC64
|
||||
#ifdef CONFIG_PPC_BOOK3S_64
|
||||
#define __mtmsrd(v, l) asm volatile("mtmsrd %0," __stringify(l) \
|
||||
: : "r" (v) : "memory")
|
||||
#define mtmsrd(v) __mtmsrd((v), 0)
|
||||
|
@ -29,8 +29,8 @@
|
||||
#if defined(CONFIG_PPC_BOOK3E_64)
|
||||
#define MSR_ MSR_ME | MSR_CE
|
||||
#define MSR_KERNEL MSR_ | MSR_CM
|
||||
#define MSR_USER32 MSR_ | MSR_PR | MSR_EE
|
||||
#define MSR_USER64 MSR_USER32 | MSR_CM
|
||||
#define MSR_USER32 MSR_ | MSR_PR | MSR_EE | MSR_DE
|
||||
#define MSR_USER64 MSR_USER32 | MSR_CM | MSR_DE
|
||||
#elif defined (CONFIG_40x)
|
||||
#define MSR_KERNEL (MSR_ME|MSR_RI|MSR_IR|MSR_DR|MSR_CE)
|
||||
#define MSR_USER (MSR_KERNEL|MSR_PR|MSR_EE)
|
||||
@ -62,6 +62,7 @@
|
||||
#define SPRN_TLB0PS 0x158 /* TLB 0 Page Size Register */
|
||||
#define SPRN_MAS5_MAS6 0x15c /* MMU Assist Register 5 || 6 */
|
||||
#define SPRN_MAS8_MAS1 0x15d /* MMU Assist Register 8 || 1 */
|
||||
#define SPRN_EPTCFG 0x15e /* Embedded Page Table Config */
|
||||
#define SPRN_MAS7_MAS3 0x174 /* MMU Assist Register 7 || 3 */
|
||||
#define SPRN_MAS0_MAS1 0x175 /* MMU Assist Register 0 || 1 */
|
||||
#define SPRN_IVOR0 0x190 /* Interrupt Vector Offset Register 0 */
|
||||
|
@ -63,6 +63,14 @@ struct rtas_t {
|
||||
struct device_node *dev; /* virtual address pointer */
|
||||
};
|
||||
|
||||
struct rtas_suspend_me_data {
|
||||
atomic_t working; /* number of cpus accessing this struct */
|
||||
atomic_t done;
|
||||
int token; /* ibm,suspend-me */
|
||||
atomic_t error;
|
||||
struct completion *complete; /* wait on this until working == 0 */
|
||||
};
|
||||
|
||||
/* RTAS event classes */
|
||||
#define RTAS_INTERNAL_ERROR 0x80000000 /* set bit 0 */
|
||||
#define RTAS_EPOW_WARNING 0x40000000 /* set bit 1 */
|
||||
@ -137,6 +145,9 @@ struct rtas_t {
|
||||
#define RTAS_TYPE_PMGM_CONFIG_CHANGE 0x70
|
||||
#define RTAS_TYPE_PMGM_SERVICE_PROC 0x71
|
||||
|
||||
/* RTAS check-exception vector offset */
|
||||
#define RTAS_VECTOR_EXTERNAL_INTERRUPT 0x500
|
||||
|
||||
struct rtas_error_log {
|
||||
unsigned long version:8; /* Architectural version */
|
||||
unsigned long severity:3; /* Severity level of error */
|
||||
@ -174,6 +185,8 @@ extern int rtas_set_indicator(int indicator, int index, int new_value);
|
||||
extern int rtas_set_indicator_fast(int indicator, int index, int new_value);
|
||||
extern void rtas_progress(char *s, unsigned short hex);
|
||||
extern void rtas_initialize(void);
|
||||
extern int rtas_suspend_cpu(struct rtas_suspend_me_data *data);
|
||||
extern int rtas_suspend_last_cpu(struct rtas_suspend_me_data *data);
|
||||
|
||||
struct rtc_time;
|
||||
extern unsigned long rtas_get_boot_time(void);
|
||||
|
@ -28,16 +28,12 @@
|
||||
extern unsigned long tb_ticks_per_jiffy;
|
||||
extern unsigned long tb_ticks_per_usec;
|
||||
extern unsigned long tb_ticks_per_sec;
|
||||
extern u64 tb_to_xs;
|
||||
extern unsigned tb_to_us;
|
||||
|
||||
struct rtc_time;
|
||||
extern void to_tm(int tim, struct rtc_time * tm);
|
||||
extern void GregorianDay(struct rtc_time *tm);
|
||||
extern time_t last_rtc_update;
|
||||
|
||||
extern void generic_calibrate_decr(void);
|
||||
extern void wakeup_decrementer(void);
|
||||
extern void snapshot_timebase(void);
|
||||
|
||||
extern void set_dec_cpu6(unsigned int val);
|
||||
@ -204,9 +200,6 @@ static inline unsigned long tb_ticks_since(unsigned long tstamp)
|
||||
extern u64 mulhdu(u64, u64);
|
||||
#endif
|
||||
|
||||
extern void smp_space_timers(unsigned int);
|
||||
|
||||
extern unsigned mulhwu_scale_factor(unsigned, unsigned);
|
||||
extern void div128_by_32(u64 dividend_high, u64 dividend_low,
|
||||
unsigned divisor, struct div_result *dr);
|
||||
|
||||
|
@ -87,6 +87,9 @@ static inline int pcibus_to_node(struct pci_bus *bus)
|
||||
.balance_interval = 1, \
|
||||
}
|
||||
|
||||
extern int __node_distance(int, int);
|
||||
#define node_distance(a, b) __node_distance(a, b)
|
||||
|
||||
extern void __init dump_numa_cpu_topology(void);
|
||||
|
||||
extern int sysfs_add_device_to_node(struct sys_device *dev, int nid);
|
||||
|
@ -85,6 +85,7 @@ struct vdso_data {
|
||||
__s32 wtom_clock_sec; /* Wall to monotonic clock */
|
||||
__s32 wtom_clock_nsec;
|
||||
struct timespec stamp_xtime; /* xtime as at tb_orig_stamp */
|
||||
__u32 stamp_sec_fraction; /* fractional seconds of stamp_xtime */
|
||||
__u32 syscall_map_64[SYSCALL_MAP_SIZE]; /* map of syscalls */
|
||||
__u32 syscall_map_32[SYSCALL_MAP_SIZE]; /* map of syscalls */
|
||||
};
|
||||
@ -105,6 +106,7 @@ struct vdso_data {
|
||||
__s32 wtom_clock_sec; /* Wall to monotonic clock */
|
||||
__s32 wtom_clock_nsec;
|
||||
struct timespec stamp_xtime; /* xtime as at tb_orig_stamp */
|
||||
__u32 stamp_sec_fraction; /* fractional seconds of stamp_xtime */
|
||||
__u32 syscall_map_32[SYSCALL_MAP_SIZE]; /* map of syscalls */
|
||||
__u32 dcache_block_size; /* L1 d-cache block size */
|
||||
__u32 icache_block_size; /* L1 i-cache block size */
|
||||
|
@ -34,9 +34,10 @@ obj-y += vdso32/
|
||||
obj-$(CONFIG_PPC64) += setup_64.o sys_ppc32.o \
|
||||
signal_64.o ptrace32.o \
|
||||
paca.o nvram_64.o firmware.o
|
||||
obj-$(CONFIG_HAVE_HW_BREAKPOINT) += hw_breakpoint.o
|
||||
obj-$(CONFIG_PPC_BOOK3S_64) += cpu_setup_ppc970.o cpu_setup_pa6t.o
|
||||
obj64-$(CONFIG_RELOCATABLE) += reloc_64.o
|
||||
obj-$(CONFIG_PPC_BOOK3E_64) += exceptions-64e.o
|
||||
obj-$(CONFIG_PPC_BOOK3E_64) += exceptions-64e.o idle_book3e.o
|
||||
obj-$(CONFIG_PPC64) += vdso64/
|
||||
obj-$(CONFIG_ALTIVEC) += vecemu.o
|
||||
obj-$(CONFIG_PPC_970_NAP) += idle_power4.o
|
||||
@ -67,6 +68,7 @@ obj64-$(CONFIG_HIBERNATION) += swsusp_asm64.o
|
||||
obj-$(CONFIG_MODULES) += module.o module_$(CONFIG_WORD_SIZE).o
|
||||
obj-$(CONFIG_44x) += cpu_setup_44x.o
|
||||
obj-$(CONFIG_FSL_BOOKE) += cpu_setup_fsl_booke.o dbell.o
|
||||
obj-$(CONFIG_PPC_BOOK3E_64) += dbell.o
|
||||
|
||||
extra-y := head_$(CONFIG_WORD_SIZE).o
|
||||
extra-$(CONFIG_PPC_BOOK3E_32) := head_new_booke.o
|
||||
|
@ -194,7 +194,6 @@ int main(void)
|
||||
DEFINE(PACA_STARTSPURR, offsetof(struct paca_struct, startspurr));
|
||||
DEFINE(PACA_USER_TIME, offsetof(struct paca_struct, user_time));
|
||||
DEFINE(PACA_SYSTEM_TIME, offsetof(struct paca_struct, system_time));
|
||||
DEFINE(PACA_DATA_OFFSET, offsetof(struct paca_struct, data_offset));
|
||||
DEFINE(PACA_TRAP_SAVE, offsetof(struct paca_struct, trap_save));
|
||||
#ifdef CONFIG_KVM_BOOK3S_64_HANDLER
|
||||
DEFINE(PACA_KVM_SVCPU, offsetof(struct paca_struct, shadow_vcpu));
|
||||
@ -342,6 +341,7 @@ int main(void)
|
||||
DEFINE(WTOM_CLOCK_SEC, offsetof(struct vdso_data, wtom_clock_sec));
|
||||
DEFINE(WTOM_CLOCK_NSEC, offsetof(struct vdso_data, wtom_clock_nsec));
|
||||
DEFINE(STAMP_XTIME, offsetof(struct vdso_data, stamp_xtime));
|
||||
DEFINE(STAMP_SEC_FRAC, offsetof(struct vdso_data, stamp_sec_fraction));
|
||||
DEFINE(CFG_ICACHE_BLOCKSZ, offsetof(struct vdso_data, icache_block_size));
|
||||
DEFINE(CFG_DCACHE_BLOCKSZ, offsetof(struct vdso_data, dcache_block_size));
|
||||
DEFINE(CFG_ICACHE_LOGBLOCKSZ, offsetof(struct vdso_data, icache_log_block_size));
|
||||
|
@ -1364,10 +1364,10 @@ static struct cpu_spec __initdata cpu_specs[] = {
|
||||
.machine_check = machine_check_4xx,
|
||||
.platform = "ppc405",
|
||||
},
|
||||
{ /* 405EX */
|
||||
.pvr_mask = 0xffff0004,
|
||||
.pvr_value = 0x12910004,
|
||||
.cpu_name = "405EX",
|
||||
{ /* 405EX Rev. A/B with Security */
|
||||
.pvr_mask = 0xffff000f,
|
||||
.pvr_value = 0x12910007,
|
||||
.cpu_name = "405EX Rev. A/B",
|
||||
.cpu_features = CPU_FTRS_40X,
|
||||
.cpu_user_features = PPC_FEATURE_32 |
|
||||
PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
|
||||
@ -1377,10 +1377,114 @@ static struct cpu_spec __initdata cpu_specs[] = {
|
||||
.machine_check = machine_check_4xx,
|
||||
.platform = "ppc405",
|
||||
},
|
||||
{ /* 405EXr */
|
||||
.pvr_mask = 0xffff0004,
|
||||
{ /* 405EX Rev. C without Security */
|
||||
.pvr_mask = 0xffff000f,
|
||||
.pvr_value = 0x1291000d,
|
||||
.cpu_name = "405EX Rev. C",
|
||||
.cpu_features = CPU_FTRS_40X,
|
||||
.cpu_user_features = PPC_FEATURE_32 |
|
||||
PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
|
||||
.mmu_features = MMU_FTR_TYPE_40x,
|
||||
.icache_bsize = 32,
|
||||
.dcache_bsize = 32,
|
||||
.machine_check = machine_check_4xx,
|
||||
.platform = "ppc405",
|
||||
},
|
||||
{ /* 405EX Rev. C with Security */
|
||||
.pvr_mask = 0xffff000f,
|
||||
.pvr_value = 0x1291000f,
|
||||
.cpu_name = "405EX Rev. C",
|
||||
.cpu_features = CPU_FTRS_40X,
|
||||
.cpu_user_features = PPC_FEATURE_32 |
|
||||
PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
|
||||
.mmu_features = MMU_FTR_TYPE_40x,
|
||||
.icache_bsize = 32,
|
||||
.dcache_bsize = 32,
|
||||
.machine_check = machine_check_4xx,
|
||||
.platform = "ppc405",
|
||||
},
|
||||
{ /* 405EX Rev. D without Security */
|
||||
.pvr_mask = 0xffff000f,
|
||||
.pvr_value = 0x12910003,
|
||||
.cpu_name = "405EX Rev. D",
|
||||
.cpu_features = CPU_FTRS_40X,
|
||||
.cpu_user_features = PPC_FEATURE_32 |
|
||||
PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
|
||||
.mmu_features = MMU_FTR_TYPE_40x,
|
||||
.icache_bsize = 32,
|
||||
.dcache_bsize = 32,
|
||||
.machine_check = machine_check_4xx,
|
||||
.platform = "ppc405",
|
||||
},
|
||||
{ /* 405EX Rev. D with Security */
|
||||
.pvr_mask = 0xffff000f,
|
||||
.pvr_value = 0x12910005,
|
||||
.cpu_name = "405EX Rev. D",
|
||||
.cpu_features = CPU_FTRS_40X,
|
||||
.cpu_user_features = PPC_FEATURE_32 |
|
||||
PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
|
||||
.mmu_features = MMU_FTR_TYPE_40x,
|
||||
.icache_bsize = 32,
|
||||
.dcache_bsize = 32,
|
||||
.machine_check = machine_check_4xx,
|
||||
.platform = "ppc405",
|
||||
},
|
||||
{ /* 405EXr Rev. A/B without Security */
|
||||
.pvr_mask = 0xffff000f,
|
||||
.pvr_value = 0x12910001,
|
||||
.cpu_name = "405EXr Rev. A/B",
|
||||
.cpu_features = CPU_FTRS_40X,
|
||||
.cpu_user_features = PPC_FEATURE_32 |
|
||||
PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
|
||||
.mmu_features = MMU_FTR_TYPE_40x,
|
||||
.icache_bsize = 32,
|
||||
.dcache_bsize = 32,
|
||||
.machine_check = machine_check_4xx,
|
||||
.platform = "ppc405",
|
||||
},
|
||||
{ /* 405EXr Rev. C without Security */
|
||||
.pvr_mask = 0xffff000f,
|
||||
.pvr_value = 0x12910009,
|
||||
.cpu_name = "405EXr Rev. C",
|
||||
.cpu_features = CPU_FTRS_40X,
|
||||
.cpu_user_features = PPC_FEATURE_32 |
|
||||
PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
|
||||
.mmu_features = MMU_FTR_TYPE_40x,
|
||||
.icache_bsize = 32,
|
||||
.dcache_bsize = 32,
|
||||
.machine_check = machine_check_4xx,
|
||||
.platform = "ppc405",
|
||||
},
|
||||
{ /* 405EXr Rev. C with Security */
|
||||
.pvr_mask = 0xffff000f,
|
||||
.pvr_value = 0x1291000b,
|
||||
.cpu_name = "405EXr Rev. C",
|
||||
.cpu_features = CPU_FTRS_40X,
|
||||
.cpu_user_features = PPC_FEATURE_32 |
|
||||
PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
|
||||
.mmu_features = MMU_FTR_TYPE_40x,
|
||||
.icache_bsize = 32,
|
||||
.dcache_bsize = 32,
|
||||
.machine_check = machine_check_4xx,
|
||||
.platform = "ppc405",
|
||||
},
|
||||
{ /* 405EXr Rev. D without Security */
|
||||
.pvr_mask = 0xffff000f,
|
||||
.pvr_value = 0x12910000,
|
||||
.cpu_name = "405EXr",
|
||||
.cpu_name = "405EXr Rev. D",
|
||||
.cpu_features = CPU_FTRS_40X,
|
||||
.cpu_user_features = PPC_FEATURE_32 |
|
||||
PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
|
||||
.mmu_features = MMU_FTR_TYPE_40x,
|
||||
.icache_bsize = 32,
|
||||
.dcache_bsize = 32,
|
||||
.machine_check = machine_check_4xx,
|
||||
.platform = "ppc405",
|
||||
},
|
||||
{ /* 405EXr Rev. D with Security */
|
||||
.pvr_mask = 0xffff000f,
|
||||
.pvr_value = 0x12910002,
|
||||
.cpu_name = "405EXr Rev. D",
|
||||
.cpu_features = CPU_FTRS_40X,
|
||||
.cpu_user_features = PPC_FEATURE_32 |
|
||||
PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
|
||||
|
@ -128,9 +128,9 @@ ssize_t copy_oldmem_page(unsigned long pfn, char *buf,
|
||||
if (!csize)
|
||||
return 0;
|
||||
|
||||
csize = min(csize, PAGE_SIZE);
|
||||
csize = min_t(size_t, csize, PAGE_SIZE);
|
||||
|
||||
if (pfn < max_pfn) {
|
||||
if ((min_low_pfn < pfn) && (pfn < max_pfn)) {
|
||||
vaddr = __va(pfn << PAGE_SHIFT);
|
||||
csize = copy_oldmem_vaddr(vaddr, buf, csize, offset, userbuf);
|
||||
} else {
|
||||
|
@ -13,32 +13,88 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/threads.h>
|
||||
#include <linux/percpu.h>
|
||||
|
||||
#include <asm/dbell.h>
|
||||
#include <asm/irq_regs.h>
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
unsigned long dbell_smp_message[NR_CPUS];
|
||||
struct doorbell_cpu_info {
|
||||
unsigned long messages; /* current messages bits */
|
||||
unsigned int tag; /* tag value */
|
||||
};
|
||||
|
||||
void smp_dbell_message_pass(int target, int msg)
|
||||
static DEFINE_PER_CPU(struct doorbell_cpu_info, doorbell_cpu_info);
|
||||
|
||||
void doorbell_setup_this_cpu(void)
|
||||
{
|
||||
struct doorbell_cpu_info *info = &__get_cpu_var(doorbell_cpu_info);
|
||||
|
||||
info->messages = 0;
|
||||
info->tag = mfspr(SPRN_PIR) & 0x3fff;
|
||||
}
|
||||
|
||||
void doorbell_message_pass(int target, int msg)
|
||||
{
|
||||
struct doorbell_cpu_info *info;
|
||||
int i;
|
||||
|
||||
if(target < NR_CPUS) {
|
||||
set_bit(msg, &dbell_smp_message[target]);
|
||||
ppc_msgsnd(PPC_DBELL, 0, target);
|
||||
if (target < NR_CPUS) {
|
||||
info = &per_cpu(doorbell_cpu_info, target);
|
||||
set_bit(msg, &info->messages);
|
||||
ppc_msgsnd(PPC_DBELL, 0, info->tag);
|
||||
}
|
||||
else if(target == MSG_ALL_BUT_SELF) {
|
||||
else if (target == MSG_ALL_BUT_SELF) {
|
||||
for_each_online_cpu(i) {
|
||||
if (i == smp_processor_id())
|
||||
continue;
|
||||
set_bit(msg, &dbell_smp_message[i]);
|
||||
ppc_msgsnd(PPC_DBELL, 0, i);
|
||||
info = &per_cpu(doorbell_cpu_info, i);
|
||||
set_bit(msg, &info->messages);
|
||||
ppc_msgsnd(PPC_DBELL, 0, info->tag);
|
||||
}
|
||||
}
|
||||
else { /* target == MSG_ALL */
|
||||
for_each_online_cpu(i)
|
||||
set_bit(msg, &dbell_smp_message[i]);
|
||||
for_each_online_cpu(i) {
|
||||
info = &per_cpu(doorbell_cpu_info, i);
|
||||
set_bit(msg, &info->messages);
|
||||
}
|
||||
ppc_msgsnd(PPC_DBELL, PPC_DBELL_MSG_BRDCAST, 0);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void doorbell_exception(struct pt_regs *regs)
|
||||
{
|
||||
struct pt_regs *old_regs = set_irq_regs(regs);
|
||||
struct doorbell_cpu_info *info = &__get_cpu_var(doorbell_cpu_info);
|
||||
int msg;
|
||||
|
||||
/* Warning: regs can be NULL when called from irq enable */
|
||||
|
||||
if (!info->messages || (num_online_cpus() < 2))
|
||||
goto out;
|
||||
|
||||
for (msg = 0; msg < 4; msg++)
|
||||
if (test_and_clear_bit(msg, &info->messages))
|
||||
smp_message_recv(msg);
|
||||
|
||||
out:
|
||||
set_irq_regs(old_regs);
|
||||
}
|
||||
|
||||
void doorbell_check_self(void)
|
||||
{
|
||||
struct doorbell_cpu_info *info = &__get_cpu_var(doorbell_cpu_info);
|
||||
|
||||
if (!info->messages)
|
||||
return;
|
||||
|
||||
ppc_msgsnd(PPC_DBELL, 0, info->tag);
|
||||
}
|
||||
|
||||
#else /* CONFIG_SMP */
|
||||
void doorbell_exception(struct pt_regs *regs)
|
||||
{
|
||||
printk(KERN_WARNING "Received doorbell on non-smp system\n");
|
||||
}
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
|
@ -191,6 +191,12 @@ exc_##n##_bad_stack: \
|
||||
sth r1,PACA_TRAP_SAVE(r13); /* store trap */ \
|
||||
b bad_stack_book3e; /* bad stack error */
|
||||
|
||||
/* WARNING: If you change the layout of this stub, make sure you chcek
|
||||
* the debug exception handler which handles single stepping
|
||||
* into exceptions from userspace, and the MM code in
|
||||
* arch/powerpc/mm/tlb_nohash.c which patches the branch here
|
||||
* and would need to be updated if that branch is moved
|
||||
*/
|
||||
#define EXCEPTION_STUB(loc, label) \
|
||||
. = interrupt_base_book3e + loc; \
|
||||
nop; /* To make debug interrupts happy */ \
|
||||
@ -204,11 +210,30 @@ exc_##n##_bad_stack: \
|
||||
lis r,TSR_FIS@h; \
|
||||
mtspr SPRN_TSR,r
|
||||
|
||||
/* Used by asynchronous interrupt that may happen in the idle loop.
|
||||
*
|
||||
* This check if the thread was in the idle loop, and if yes, returns
|
||||
* to the caller rather than the PC. This is to avoid a race if
|
||||
* interrupts happen before the wait instruction.
|
||||
*/
|
||||
#define CHECK_NAPPING() \
|
||||
clrrdi r11,r1,THREAD_SHIFT; \
|
||||
ld r10,TI_LOCAL_FLAGS(r11); \
|
||||
andi. r9,r10,_TLF_NAPPING; \
|
||||
beq+ 1f; \
|
||||
ld r8,_LINK(r1); \
|
||||
rlwinm r7,r10,0,~_TLF_NAPPING; \
|
||||
std r8,_NIP(r1); \
|
||||
std r7,TI_LOCAL_FLAGS(r11); \
|
||||
1:
|
||||
|
||||
|
||||
#define MASKABLE_EXCEPTION(trapnum, label, hdlr, ack) \
|
||||
START_EXCEPTION(label); \
|
||||
NORMAL_EXCEPTION_PROLOG(trapnum, PROLOG_ADDITION_MASKABLE) \
|
||||
EXCEPTION_COMMON(trapnum, PACA_EXGEN, INTS_DISABLE_ALL) \
|
||||
ack(r8); \
|
||||
CHECK_NAPPING(); \
|
||||
addi r3,r1,STACK_FRAME_OVERHEAD; \
|
||||
bl hdlr; \
|
||||
b .ret_from_except_lite;
|
||||
@ -246,11 +271,9 @@ interrupt_base_book3e: /* fake trap */
|
||||
EXCEPTION_STUB(0x1a0, watchdog) /* 0x09f0 */
|
||||
EXCEPTION_STUB(0x1c0, data_tlb_miss)
|
||||
EXCEPTION_STUB(0x1e0, instruction_tlb_miss)
|
||||
EXCEPTION_STUB(0x280, doorbell)
|
||||
EXCEPTION_STUB(0x2a0, doorbell_crit)
|
||||
|
||||
#if 0
|
||||
EXCEPTION_STUB(0x280, processor_doorbell)
|
||||
EXCEPTION_STUB(0x220, processor_doorbell_crit)
|
||||
#endif
|
||||
.globl interrupt_end_book3e
|
||||
interrupt_end_book3e:
|
||||
|
||||
@ -259,6 +282,7 @@ interrupt_end_book3e:
|
||||
CRIT_EXCEPTION_PROLOG(0x100, PROLOG_ADDITION_NONE)
|
||||
// EXCEPTION_COMMON(0x100, PACA_EXCRIT, INTS_DISABLE_ALL)
|
||||
// bl special_reg_save_crit
|
||||
// CHECK_NAPPING();
|
||||
// addi r3,r1,STACK_FRAME_OVERHEAD
|
||||
// bl .critical_exception
|
||||
// b ret_from_crit_except
|
||||
@ -270,6 +294,7 @@ interrupt_end_book3e:
|
||||
// EXCEPTION_COMMON(0x200, PACA_EXMC, INTS_DISABLE_ALL)
|
||||
// bl special_reg_save_mc
|
||||
// addi r3,r1,STACK_FRAME_OVERHEAD
|
||||
// CHECK_NAPPING();
|
||||
// bl .machine_check_exception
|
||||
// b ret_from_mc_except
|
||||
b .
|
||||
@ -340,6 +365,7 @@ interrupt_end_book3e:
|
||||
CRIT_EXCEPTION_PROLOG(0x9f0, PROLOG_ADDITION_NONE)
|
||||
// EXCEPTION_COMMON(0x9f0, PACA_EXCRIT, INTS_DISABLE_ALL)
|
||||
// bl special_reg_save_crit
|
||||
// CHECK_NAPPING();
|
||||
// addi r3,r1,STACK_FRAME_OVERHEAD
|
||||
// bl .unknown_exception
|
||||
// b ret_from_crit_except
|
||||
@ -428,6 +454,20 @@ interrupt_end_book3e:
|
||||
kernel_dbg_exc:
|
||||
b . /* NYI */
|
||||
|
||||
/* Doorbell interrupt */
|
||||
MASKABLE_EXCEPTION(0x2070, doorbell, .doorbell_exception, ACK_NONE)
|
||||
|
||||
/* Doorbell critical Interrupt */
|
||||
START_EXCEPTION(doorbell_crit);
|
||||
CRIT_EXCEPTION_PROLOG(0x2080, PROLOG_ADDITION_NONE)
|
||||
// EXCEPTION_COMMON(0x2080, PACA_EXCRIT, INTS_DISABLE_ALL)
|
||||
// bl special_reg_save_crit
|
||||
// CHECK_NAPPING();
|
||||
// addi r3,r1,STACK_FRAME_OVERHEAD
|
||||
// bl .doorbell_critical_exception
|
||||
// b ret_from_crit_except
|
||||
b .
|
||||
|
||||
|
||||
/*
|
||||
* An interrupt came in while soft-disabled; clear EE in SRR1,
|
||||
@ -563,6 +603,8 @@ BAD_STACK_TRAMPOLINE(0xd00)
|
||||
BAD_STACK_TRAMPOLINE(0xe00)
|
||||
BAD_STACK_TRAMPOLINE(0xf00)
|
||||
BAD_STACK_TRAMPOLINE(0xf20)
|
||||
BAD_STACK_TRAMPOLINE(0x2070)
|
||||
BAD_STACK_TRAMPOLINE(0x2080)
|
||||
|
||||
.globl bad_stack_book3e
|
||||
bad_stack_book3e:
|
||||
|
@ -828,6 +828,7 @@ END_FW_FTR_SECTION_IFCLR(FW_FEATURE_ISERIES)
|
||||
|
||||
/* We have a data breakpoint exception - handle it */
|
||||
handle_dabr_fault:
|
||||
bl .save_nvgprs
|
||||
ld r4,_DAR(r1)
|
||||
ld r5,_DSISR(r1)
|
||||
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||
|
364
arch/powerpc/kernel/hw_breakpoint.c
Normal file
364
arch/powerpc/kernel/hw_breakpoint.c
Normal file
@ -0,0 +1,364 @@
|
||||
/*
|
||||
* HW_breakpoint: a unified kernel/user-space hardware breakpoint facility,
|
||||
* using the CPU's debug registers. Derived from
|
||||
* "arch/x86/kernel/hw_breakpoint.c"
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* Copyright 2010 IBM Corporation
|
||||
* Author: K.Prasad <prasad@linux.vnet.ibm.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/hw_breakpoint.h>
|
||||
#include <linux/notifier.h>
|
||||
#include <linux/kprobes.h>
|
||||
#include <linux/percpu.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/smp.h>
|
||||
|
||||
#include <asm/hw_breakpoint.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/sstep.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
/*
|
||||
* Stores the breakpoints currently in use on each breakpoint address
|
||||
* register for every cpu
|
||||
*/
|
||||
static DEFINE_PER_CPU(struct perf_event *, bp_per_reg);
|
||||
|
||||
/*
|
||||
* Returns total number of data or instruction breakpoints available.
|
||||
*/
|
||||
int hw_breakpoint_slots(int type)
|
||||
{
|
||||
if (type == TYPE_DATA)
|
||||
return HBP_NUM;
|
||||
return 0; /* no instruction breakpoints available */
|
||||
}
|
||||
|
||||
/*
|
||||
* Install a perf counter breakpoint.
|
||||
*
|
||||
* We seek a free debug address register and use it for this
|
||||
* breakpoint.
|
||||
*
|
||||
* Atomic: we hold the counter->ctx->lock and we only handle variables
|
||||
* and registers local to this cpu.
|
||||
*/
|
||||
int arch_install_hw_breakpoint(struct perf_event *bp)
|
||||
{
|
||||
struct arch_hw_breakpoint *info = counter_arch_bp(bp);
|
||||
struct perf_event **slot = &__get_cpu_var(bp_per_reg);
|
||||
|
||||
*slot = bp;
|
||||
|
||||
/*
|
||||
* Do not install DABR values if the instruction must be single-stepped.
|
||||
* If so, DABR will be populated in single_step_dabr_instruction().
|
||||
*/
|
||||
if (current->thread.last_hit_ubp != bp)
|
||||
set_dabr(info->address | info->type | DABR_TRANSLATION);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Uninstall the breakpoint contained in the given counter.
|
||||
*
|
||||
* First we search the debug address register it uses and then we disable
|
||||
* it.
|
||||
*
|
||||
* Atomic: we hold the counter->ctx->lock and we only handle variables
|
||||
* and registers local to this cpu.
|
||||
*/
|
||||
void arch_uninstall_hw_breakpoint(struct perf_event *bp)
|
||||
{
|
||||
struct perf_event **slot = &__get_cpu_var(bp_per_reg);
|
||||
|
||||
if (*slot != bp) {
|
||||
WARN_ONCE(1, "Can't find the breakpoint");
|
||||
return;
|
||||
}
|
||||
|
||||
*slot = NULL;
|
||||
set_dabr(0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Perform cleanup of arch-specific counters during unregistration
|
||||
* of the perf-event
|
||||
*/
|
||||
void arch_unregister_hw_breakpoint(struct perf_event *bp)
|
||||
{
|
||||
/*
|
||||
* If the breakpoint is unregistered between a hw_breakpoint_handler()
|
||||
* and the single_step_dabr_instruction(), then cleanup the breakpoint
|
||||
* restoration variables to prevent dangling pointers.
|
||||
*/
|
||||
if (bp->ctx->task)
|
||||
bp->ctx->task->thread.last_hit_ubp = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check for virtual address in kernel space.
|
||||
*/
|
||||
int arch_check_bp_in_kernelspace(struct perf_event *bp)
|
||||
{
|
||||
struct arch_hw_breakpoint *info = counter_arch_bp(bp);
|
||||
|
||||
return is_kernel_addr(info->address);
|
||||
}
|
||||
|
||||
int arch_bp_generic_fields(int type, int *gen_bp_type)
|
||||
{
|
||||
switch (type) {
|
||||
case DABR_DATA_READ:
|
||||
*gen_bp_type = HW_BREAKPOINT_R;
|
||||
break;
|
||||
case DABR_DATA_WRITE:
|
||||
*gen_bp_type = HW_BREAKPOINT_W;
|
||||
break;
|
||||
case (DABR_DATA_WRITE | DABR_DATA_READ):
|
||||
*gen_bp_type = (HW_BREAKPOINT_W | HW_BREAKPOINT_R);
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Validate the arch-specific HW Breakpoint register settings
|
||||
*/
|
||||
int arch_validate_hwbkpt_settings(struct perf_event *bp)
|
||||
{
|
||||
int ret = -EINVAL;
|
||||
struct arch_hw_breakpoint *info = counter_arch_bp(bp);
|
||||
|
||||
if (!bp)
|
||||
return ret;
|
||||
|
||||
switch (bp->attr.bp_type) {
|
||||
case HW_BREAKPOINT_R:
|
||||
info->type = DABR_DATA_READ;
|
||||
break;
|
||||
case HW_BREAKPOINT_W:
|
||||
info->type = DABR_DATA_WRITE;
|
||||
break;
|
||||
case HW_BREAKPOINT_R | HW_BREAKPOINT_W:
|
||||
info->type = (DABR_DATA_READ | DABR_DATA_WRITE);
|
||||
break;
|
||||
default:
|
||||
return ret;
|
||||
}
|
||||
|
||||
info->address = bp->attr.bp_addr;
|
||||
info->len = bp->attr.bp_len;
|
||||
|
||||
/*
|
||||
* Since breakpoint length can be a maximum of HW_BREAKPOINT_LEN(8)
|
||||
* and breakpoint addresses are aligned to nearest double-word
|
||||
* HW_BREAKPOINT_ALIGN by rounding off to the lower address, the
|
||||
* 'symbolsize' should satisfy the check below.
|
||||
*/
|
||||
if (info->len >
|
||||
(HW_BREAKPOINT_LEN - (info->address & HW_BREAKPOINT_ALIGN)))
|
||||
return -EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Restores the breakpoint on the debug registers.
|
||||
* Invoke this function if it is known that the execution context is
|
||||
* about to change to cause loss of MSR_SE settings.
|
||||
*/
|
||||
void thread_change_pc(struct task_struct *tsk, struct pt_regs *regs)
|
||||
{
|
||||
struct arch_hw_breakpoint *info;
|
||||
|
||||
if (likely(!tsk->thread.last_hit_ubp))
|
||||
return;
|
||||
|
||||
info = counter_arch_bp(tsk->thread.last_hit_ubp);
|
||||
regs->msr &= ~MSR_SE;
|
||||
set_dabr(info->address | info->type | DABR_TRANSLATION);
|
||||
tsk->thread.last_hit_ubp = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Handle debug exception notifications.
|
||||
*/
|
||||
int __kprobes hw_breakpoint_handler(struct die_args *args)
|
||||
{
|
||||
int rc = NOTIFY_STOP;
|
||||
struct perf_event *bp;
|
||||
struct pt_regs *regs = args->regs;
|
||||
int stepped = 1;
|
||||
struct arch_hw_breakpoint *info;
|
||||
unsigned int instr;
|
||||
unsigned long dar = regs->dar;
|
||||
|
||||
/* Disable breakpoints during exception handling */
|
||||
set_dabr(0);
|
||||
|
||||
/*
|
||||
* The counter may be concurrently released but that can only
|
||||
* occur from a call_rcu() path. We can then safely fetch
|
||||
* the breakpoint, use its callback, touch its counter
|
||||
* while we are in an rcu_read_lock() path.
|
||||
*/
|
||||
rcu_read_lock();
|
||||
|
||||
bp = __get_cpu_var(bp_per_reg);
|
||||
if (!bp)
|
||||
goto out;
|
||||
info = counter_arch_bp(bp);
|
||||
|
||||
/*
|
||||
* Return early after invoking user-callback function without restoring
|
||||
* DABR if the breakpoint is from ptrace which always operates in
|
||||
* one-shot mode. The ptrace-ed process will receive the SIGTRAP signal
|
||||
* generated in do_dabr().
|
||||
*/
|
||||
if (bp->overflow_handler == ptrace_triggered) {
|
||||
perf_bp_event(bp, regs);
|
||||
rc = NOTIFY_DONE;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* Verify if dar lies within the address range occupied by the symbol
|
||||
* being watched to filter extraneous exceptions. If it doesn't,
|
||||
* we still need to single-step the instruction, but we don't
|
||||
* generate an event.
|
||||
*/
|
||||
info->extraneous_interrupt = !((bp->attr.bp_addr <= dar) &&
|
||||
(dar - bp->attr.bp_addr < bp->attr.bp_len));
|
||||
|
||||
/* Do not emulate user-space instructions, instead single-step them */
|
||||
if (user_mode(regs)) {
|
||||
bp->ctx->task->thread.last_hit_ubp = bp;
|
||||
regs->msr |= MSR_SE;
|
||||
goto out;
|
||||
}
|
||||
|
||||
stepped = 0;
|
||||
instr = 0;
|
||||
if (!__get_user_inatomic(instr, (unsigned int *) regs->nip))
|
||||
stepped = emulate_step(regs, instr);
|
||||
|
||||
/*
|
||||
* emulate_step() could not execute it. We've failed in reliably
|
||||
* handling the hw-breakpoint. Unregister it and throw a warning
|
||||
* message to let the user know about it.
|
||||
*/
|
||||
if (!stepped) {
|
||||
WARN(1, "Unable to handle hardware breakpoint. Breakpoint at "
|
||||
"0x%lx will be disabled.", info->address);
|
||||
perf_event_disable(bp);
|
||||
goto out;
|
||||
}
|
||||
/*
|
||||
* As a policy, the callback is invoked in a 'trigger-after-execute'
|
||||
* fashion
|
||||
*/
|
||||
if (!info->extraneous_interrupt)
|
||||
perf_bp_event(bp, regs);
|
||||
|
||||
set_dabr(info->address | info->type | DABR_TRANSLATION);
|
||||
out:
|
||||
rcu_read_unlock();
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
* Handle single-step exceptions following a DABR hit.
|
||||
*/
|
||||
int __kprobes single_step_dabr_instruction(struct die_args *args)
|
||||
{
|
||||
struct pt_regs *regs = args->regs;
|
||||
struct perf_event *bp = NULL;
|
||||
struct arch_hw_breakpoint *bp_info;
|
||||
|
||||
bp = current->thread.last_hit_ubp;
|
||||
/*
|
||||
* Check if we are single-stepping as a result of a
|
||||
* previous HW Breakpoint exception
|
||||
*/
|
||||
if (!bp)
|
||||
return NOTIFY_DONE;
|
||||
|
||||
bp_info = counter_arch_bp(bp);
|
||||
|
||||
/*
|
||||
* We shall invoke the user-defined callback function in the single
|
||||
* stepping handler to confirm to 'trigger-after-execute' semantics
|
||||
*/
|
||||
if (!bp_info->extraneous_interrupt)
|
||||
perf_bp_event(bp, regs);
|
||||
|
||||
set_dabr(bp_info->address | bp_info->type | DABR_TRANSLATION);
|
||||
current->thread.last_hit_ubp = NULL;
|
||||
|
||||
/*
|
||||
* If the process was being single-stepped by ptrace, let the
|
||||
* other single-step actions occur (e.g. generate SIGTRAP).
|
||||
*/
|
||||
if (test_thread_flag(TIF_SINGLESTEP))
|
||||
return NOTIFY_DONE;
|
||||
|
||||
return NOTIFY_STOP;
|
||||
}
|
||||
|
||||
/*
|
||||
* Handle debug exception notifications.
|
||||
*/
|
||||
int __kprobes hw_breakpoint_exceptions_notify(
|
||||
struct notifier_block *unused, unsigned long val, void *data)
|
||||
{
|
||||
int ret = NOTIFY_DONE;
|
||||
|
||||
switch (val) {
|
||||
case DIE_DABR_MATCH:
|
||||
ret = hw_breakpoint_handler(data);
|
||||
break;
|
||||
case DIE_SSTEP:
|
||||
ret = single_step_dabr_instruction(data);
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Release the user breakpoints used by ptrace
|
||||
*/
|
||||
void flush_ptrace_hw_breakpoint(struct task_struct *tsk)
|
||||
{
|
||||
struct thread_struct *t = &tsk->thread;
|
||||
|
||||
unregister_hw_breakpoint(t->ptrace_bps[0]);
|
||||
t->ptrace_bps[0] = NULL;
|
||||
}
|
||||
|
||||
void hw_breakpoint_pmu_read(struct perf_event *bp)
|
||||
{
|
||||
/* TODO */
|
||||
}
|
86
arch/powerpc/kernel/idle_book3e.S
Normal file
86
arch/powerpc/kernel/idle_book3e.S
Normal file
@ -0,0 +1,86 @@
|
||||
/*
|
||||
* Copyright 2010 IBM Corp, Benjamin Herrenschmidt <benh@kernel.crashing.org>
|
||||
*
|
||||
* Generic idle routine for Book3E processors
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#include <linux/threads.h>
|
||||
#include <asm/reg.h>
|
||||
#include <asm/ppc_asm.h>
|
||||
#include <asm/asm-offsets.h>
|
||||
#include <asm/ppc-opcode.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/thread_info.h>
|
||||
|
||||
/* 64-bit version only for now */
|
||||
#ifdef CONFIG_PPC64
|
||||
|
||||
_GLOBAL(book3e_idle)
|
||||
/* Save LR for later */
|
||||
mflr r0
|
||||
std r0,16(r1)
|
||||
|
||||
/* Hard disable interrupts */
|
||||
wrteei 0
|
||||
|
||||
/* Now check if an interrupt came in while we were soft disabled
|
||||
* since we may otherwise lose it (doorbells etc...). We know
|
||||
* that since PACAHARDIRQEN will have been cleared in that case.
|
||||
*/
|
||||
lbz r3,PACAHARDIRQEN(r13)
|
||||
cmpwi cr0,r3,0
|
||||
beqlr
|
||||
|
||||
/* Now we are going to mark ourselves as soft and hard enables in
|
||||
* order to be able to take interrupts while asleep. We inform lockdep
|
||||
* of that. We don't actually turn interrupts on just yet tho.
|
||||
*/
|
||||
#ifdef CONFIG_TRACE_IRQFLAGS
|
||||
stdu r1,-128(r1)
|
||||
bl .trace_hardirqs_on
|
||||
#endif
|
||||
li r0,1
|
||||
stb r0,PACASOFTIRQEN(r13)
|
||||
stb r0,PACAHARDIRQEN(r13)
|
||||
|
||||
/* Interrupts will make use return to LR, so get something we want
|
||||
* in there
|
||||
*/
|
||||
bl 1f
|
||||
|
||||
/* Hard disable interrupts again */
|
||||
wrteei 0
|
||||
|
||||
/* Mark them off again in the PACA as well */
|
||||
li r0,0
|
||||
stb r0,PACASOFTIRQEN(r13)
|
||||
stb r0,PACAHARDIRQEN(r13)
|
||||
|
||||
/* Tell lockdep about it */
|
||||
#ifdef CONFIG_TRACE_IRQFLAGS
|
||||
bl .trace_hardirqs_off
|
||||
addi r1,r1,128
|
||||
#endif
|
||||
ld r0,16(r1)
|
||||
mtlr r0
|
||||
blr
|
||||
|
||||
1: /* Let's set the _TLF_NAPPING flag so interrupts make us return
|
||||
* to the right spot
|
||||
*/
|
||||
clrrdi r11,r1,THREAD_SHIFT
|
||||
ld r10,TI_LOCAL_FLAGS(r11)
|
||||
ori r10,r10,_TLF_NAPPING
|
||||
std r10,TI_LOCAL_FLAGS(r11)
|
||||
|
||||
/* We can now re-enable hard interrupts and go to sleep */
|
||||
wrteei 1
|
||||
1: PPC_WAIT(0)
|
||||
b 1b
|
||||
|
||||
#endif /* CONFIG_PPC64 */
|
@ -64,6 +64,8 @@
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/udbg.h>
|
||||
#include <asm/dbell.h>
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
#include <asm/paca.h>
|
||||
#include <asm/firmware.h>
|
||||
@ -153,14 +155,28 @@ notrace void raw_local_irq_restore(unsigned long en)
|
||||
if (get_hard_enabled())
|
||||
return;
|
||||
|
||||
#if defined(CONFIG_BOOKE) && defined(CONFIG_SMP)
|
||||
/* Check for pending doorbell interrupts and resend to ourself */
|
||||
doorbell_check_self();
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Need to hard-enable interrupts here. Since currently disabled,
|
||||
* no need to take further asm precautions against preemption; but
|
||||
* use local_paca instead of get_paca() to avoid preemption checking.
|
||||
*/
|
||||
local_paca->hard_enabled = en;
|
||||
|
||||
#ifndef CONFIG_BOOKE
|
||||
/* On server, re-trigger the decrementer if it went negative since
|
||||
* some processors only trigger on edge transitions of the sign bit.
|
||||
*
|
||||
* BookE has a level sensitive decrementer (latches in TSR) so we
|
||||
* don't need that
|
||||
*/
|
||||
if ((int)mfspr(SPRN_DEC) < 0)
|
||||
mtspr(SPRN_DEC, 1);
|
||||
#endif /* CONFIG_BOOKE */
|
||||
|
||||
/*
|
||||
* Force the delivery of pending soft-disabled interrupts on PS3.
|
||||
|
@ -45,6 +45,18 @@ void machine_kexec_cleanup(struct kimage *image)
|
||||
ppc_md.machine_kexec_cleanup(image);
|
||||
}
|
||||
|
||||
void arch_crash_save_vmcoreinfo(void)
|
||||
{
|
||||
|
||||
#ifdef CONFIG_NEED_MULTIPLE_NODES
|
||||
VMCOREINFO_SYMBOL(node_data);
|
||||
VMCOREINFO_LENGTH(node_data, MAX_NUMNODES);
|
||||
#endif
|
||||
#ifndef CONFIG_NEED_MULTIPLE_NODES
|
||||
VMCOREINFO_SYMBOL(contig_page_data);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* Do not allocate memory (or fail in any way) in machine_kexec().
|
||||
* We are past the point of no return, committed to rebooting now.
|
||||
@ -144,24 +156,24 @@ int overlaps_crashkernel(unsigned long start, unsigned long size)
|
||||
}
|
||||
|
||||
/* Values we need to export to the second kernel via the device tree. */
|
||||
static unsigned long kernel_end;
|
||||
static unsigned long crashk_size;
|
||||
static phys_addr_t kernel_end;
|
||||
static phys_addr_t crashk_size;
|
||||
|
||||
static struct property kernel_end_prop = {
|
||||
.name = "linux,kernel-end",
|
||||
.length = sizeof(unsigned long),
|
||||
.length = sizeof(phys_addr_t),
|
||||
.value = &kernel_end,
|
||||
};
|
||||
|
||||
static struct property crashk_base_prop = {
|
||||
.name = "linux,crashkernel-base",
|
||||
.length = sizeof(unsigned long),
|
||||
.length = sizeof(phys_addr_t),
|
||||
.value = &crashk_res.start,
|
||||
};
|
||||
|
||||
static struct property crashk_size_prop = {
|
||||
.name = "linux,crashkernel-size",
|
||||
.length = sizeof(unsigned long),
|
||||
.length = sizeof(phys_addr_t),
|
||||
.value = &crashk_size,
|
||||
};
|
||||
|
||||
|
@ -15,6 +15,8 @@
|
||||
#include <linux/thread_info.h>
|
||||
#include <linux/init_task.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/cpu.h>
|
||||
|
||||
#include <asm/page.h>
|
||||
#include <asm/current.h>
|
||||
@ -25,6 +27,7 @@
|
||||
#include <asm/sections.h> /* _end */
|
||||
#include <asm/prom.h>
|
||||
#include <asm/smp.h>
|
||||
#include <asm/hw_breakpoint.h>
|
||||
|
||||
int default_machine_kexec_prepare(struct kimage *image)
|
||||
{
|
||||
@ -165,6 +168,7 @@ static void kexec_smp_down(void *arg)
|
||||
while(kexec_all_irq_disabled == 0)
|
||||
cpu_relax();
|
||||
mb(); /* make sure all irqs are disabled before this */
|
||||
hw_breakpoint_disable();
|
||||
/*
|
||||
* Now every CPU has IRQs off, we can clear out any pending
|
||||
* IPIs and be sure that no more will come in after this.
|
||||
@ -180,8 +184,22 @@ static void kexec_prepare_cpus_wait(int wait_state)
|
||||
{
|
||||
int my_cpu, i, notified=-1;
|
||||
|
||||
hw_breakpoint_disable();
|
||||
my_cpu = get_cpu();
|
||||
/* Make sure each CPU has atleast made it to the state we need */
|
||||
/* Make sure each CPU has at least made it to the state we need.
|
||||
*
|
||||
* FIXME: There is a (slim) chance of a problem if not all of the CPUs
|
||||
* are correctly onlined. If somehow we start a CPU on boot with RTAS
|
||||
* start-cpu, but somehow that CPU doesn't write callin_cpu_map[] in
|
||||
* time, the boot CPU will timeout. If it does eventually execute
|
||||
* stuff, the secondary will start up (paca[].cpu_start was written) and
|
||||
* get into a peculiar state. If the platform supports
|
||||
* smp_ops->take_timebase(), the secondary CPU will probably be spinning
|
||||
* in there. If not (i.e. pseries), the secondary will continue on and
|
||||
* try to online itself/idle/etc. If it survives that, we need to find
|
||||
* these possible-but-not-online-but-should-be CPUs and chaperone them
|
||||
* into kexec_smp_wait().
|
||||
*/
|
||||
for_each_online_cpu(i) {
|
||||
if (i == my_cpu)
|
||||
continue;
|
||||
@ -189,9 +207,9 @@ static void kexec_prepare_cpus_wait(int wait_state)
|
||||
while (paca[i].kexec_state < wait_state) {
|
||||
barrier();
|
||||
if (i != notified) {
|
||||
printk( "kexec: waiting for cpu %d (physical"
|
||||
" %d) to enter %i state\n",
|
||||
i, paca[i].hw_cpu_id, wait_state);
|
||||
printk(KERN_INFO "kexec: waiting for cpu %d "
|
||||
"(physical %d) to enter %i state\n",
|
||||
i, paca[i].hw_cpu_id, wait_state);
|
||||
notified = i;
|
||||
}
|
||||
}
|
||||
@ -199,9 +217,32 @@ static void kexec_prepare_cpus_wait(int wait_state)
|
||||
mb();
|
||||
}
|
||||
|
||||
/*
|
||||
* We need to make sure each present CPU is online. The next kernel will scan
|
||||
* the device tree and assume primary threads are online and query secondary
|
||||
* threads via RTAS to online them if required. If we don't online primary
|
||||
* threads, they will be stuck. However, we also online secondary threads as we
|
||||
* may be using 'cede offline'. In this case RTAS doesn't see the secondary
|
||||
* threads as offline -- and again, these CPUs will be stuck.
|
||||
*
|
||||
* So, we online all CPUs that should be running, including secondary threads.
|
||||
*/
|
||||
static void wake_offline_cpus(void)
|
||||
{
|
||||
int cpu = 0;
|
||||
|
||||
for_each_present_cpu(cpu) {
|
||||
if (!cpu_online(cpu)) {
|
||||
printk(KERN_INFO "kexec: Waking offline cpu %d.\n",
|
||||
cpu);
|
||||
cpu_up(cpu);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void kexec_prepare_cpus(void)
|
||||
{
|
||||
|
||||
wake_offline_cpus();
|
||||
smp_call_function(kexec_smp_down, NULL, /* wait */0);
|
||||
local_irq_disable();
|
||||
mb(); /* make sure IRQs are disabled before we say they are */
|
||||
@ -215,7 +256,10 @@ static void kexec_prepare_cpus(void)
|
||||
if (ppc_md.kexec_cpu_down)
|
||||
ppc_md.kexec_cpu_down(0, 0);
|
||||
|
||||
/* Before removing MMU mapings make sure all CPUs have entered real mode */
|
||||
/*
|
||||
* Before removing MMU mappings make sure all CPUs have entered real
|
||||
* mode:
|
||||
*/
|
||||
kexec_prepare_cpus_wait(KEXEC_STATE_REAL_MODE);
|
||||
|
||||
put_cpu();
|
||||
@ -257,6 +301,12 @@ static void kexec_prepare_cpus(void)
|
||||
static union thread_union kexec_stack __init_task_data =
|
||||
{ };
|
||||
|
||||
/*
|
||||
* For similar reasons to the stack above, the kexecing CPU needs to be on a
|
||||
* static PACA; we switch to kexec_paca.
|
||||
*/
|
||||
struct paca_struct kexec_paca;
|
||||
|
||||
/* Our assembly helper, in kexec_stub.S */
|
||||
extern NORET_TYPE void kexec_sequence(void *newstack, unsigned long start,
|
||||
void *image, void *control,
|
||||
@ -278,12 +328,28 @@ void default_machine_kexec(struct kimage *image)
|
||||
if (crashing_cpu == -1)
|
||||
kexec_prepare_cpus();
|
||||
|
||||
pr_debug("kexec: Starting switchover sequence.\n");
|
||||
|
||||
/* switch to a staticly allocated stack. Based on irq stack code.
|
||||
* XXX: the task struct will likely be invalid once we do the copy!
|
||||
*/
|
||||
kexec_stack.thread_info.task = current_thread_info()->task;
|
||||
kexec_stack.thread_info.flags = 0;
|
||||
|
||||
/* We need a static PACA, too; copy this CPU's PACA over and switch to
|
||||
* it. Also poison per_cpu_offset to catch anyone using non-static
|
||||
* data.
|
||||
*/
|
||||
memcpy(&kexec_paca, get_paca(), sizeof(struct paca_struct));
|
||||
kexec_paca.data_offset = 0xedeaddeadeeeeeeeUL;
|
||||
paca = (struct paca_struct *)RELOC_HIDE(&kexec_paca, 0) -
|
||||
kexec_paca.paca_index;
|
||||
setup_paca(&kexec_paca);
|
||||
|
||||
/* XXX: If anyone does 'dynamic lppacas' this will also need to be
|
||||
* switched to a static version!
|
||||
*/
|
||||
|
||||
/* Some things are best done in assembly. Finding globals with
|
||||
* a toc is easier in C, so pass in what we can.
|
||||
*/
|
||||
|
@ -105,6 +105,16 @@ void __init initialise_paca(struct paca_struct *new_paca, int cpu)
|
||||
#endif /* CONFIG_PPC_STD_MMU_64 */
|
||||
}
|
||||
|
||||
/* Put the paca pointer into r13 and SPRG_PACA */
|
||||
void setup_paca(struct paca_struct *new_paca)
|
||||
{
|
||||
local_paca = new_paca;
|
||||
mtspr(SPRN_SPRG_PACA, local_paca);
|
||||
#ifdef CONFIG_PPC_BOOK3E
|
||||
mtspr(SPRN_SPRG_TLB_EXFRAME, local_paca->extlb);
|
||||
#endif
|
||||
}
|
||||
|
||||
static int __initdata paca_size;
|
||||
|
||||
void __init allocate_pacas(void)
|
||||
|
@ -37,6 +37,7 @@
|
||||
#include <linux/kernel_stat.h>
|
||||
#include <linux/personality.h>
|
||||
#include <linux/random.h>
|
||||
#include <linux/hw_breakpoint.h>
|
||||
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/uaccess.h>
|
||||
@ -462,14 +463,42 @@ struct task_struct *__switch_to(struct task_struct *prev,
|
||||
#ifdef CONFIG_PPC_ADV_DEBUG_REGS
|
||||
switch_booke_debug_regs(&new->thread);
|
||||
#else
|
||||
/*
|
||||
* For PPC_BOOK3S_64, we use the hw-breakpoint interfaces that would
|
||||
* schedule DABR
|
||||
*/
|
||||
#ifndef CONFIG_HAVE_HW_BREAKPOINT
|
||||
if (unlikely(__get_cpu_var(current_dabr) != new->thread.dabr))
|
||||
set_dabr(new->thread.dabr);
|
||||
#endif /* CONFIG_HAVE_HW_BREAKPOINT */
|
||||
#endif
|
||||
|
||||
|
||||
new_thread = &new->thread;
|
||||
old_thread = ¤t->thread;
|
||||
|
||||
#if defined(CONFIG_PPC_BOOK3E_64)
|
||||
/* XXX Current Book3E code doesn't deal with kernel side DBCR0,
|
||||
* we always hold the user values, so we set it now.
|
||||
*
|
||||
* However, we ensure the kernel MSR:DE is appropriately cleared too
|
||||
* to avoid spurrious single step exceptions in the kernel.
|
||||
*
|
||||
* This will have to change to merge with the ppc32 code at some point,
|
||||
* but I don't like much what ppc32 is doing today so there's some
|
||||
* thinking needed there
|
||||
*/
|
||||
if ((new_thread->dbcr0 | old_thread->dbcr0) & DBCR0_IDM) {
|
||||
u32 dbcr0;
|
||||
|
||||
mtmsr(mfmsr() & ~MSR_DE);
|
||||
isync();
|
||||
dbcr0 = mfspr(SPRN_DBCR0);
|
||||
dbcr0 = (dbcr0 & DBCR0_EDM) | new_thread->dbcr0;
|
||||
mtspr(SPRN_DBCR0, dbcr0);
|
||||
}
|
||||
#endif /* CONFIG_PPC64_BOOK3E */
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
/*
|
||||
* Collect processor utilization data per process
|
||||
@ -642,7 +671,11 @@ void flush_thread(void)
|
||||
{
|
||||
discard_lazy_cpu_state();
|
||||
|
||||
#ifdef CONFIG_HAVE_HW_BREAKPOINTS
|
||||
flush_ptrace_hw_breakpoint(current);
|
||||
#else /* CONFIG_HAVE_HW_BREAKPOINTS */
|
||||
set_debug_reg_defaults(¤t->thread);
|
||||
#endif /* CONFIG_HAVE_HW_BREAKPOINTS */
|
||||
}
|
||||
|
||||
void
|
||||
@ -660,6 +693,9 @@ void prepare_to_copy(struct task_struct *tsk)
|
||||
flush_altivec_to_thread(current);
|
||||
flush_vsx_to_thread(current);
|
||||
flush_spe_to_thread(current);
|
||||
#ifdef CONFIG_HAVE_HW_BREAKPOINT
|
||||
flush_ptrace_hw_breakpoint(tsk);
|
||||
#endif /* CONFIG_HAVE_HW_BREAKPOINT */
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -311,6 +311,24 @@ static void __init prom_print_hex(unsigned long val)
|
||||
call_prom("write", 3, 1, _prom->stdout, buf, nibbles);
|
||||
}
|
||||
|
||||
/* max number of decimal digits in an unsigned long */
|
||||
#define UL_DIGITS 21
|
||||
static void __init prom_print_dec(unsigned long val)
|
||||
{
|
||||
int i, size;
|
||||
char buf[UL_DIGITS+1];
|
||||
struct prom_t *_prom = &RELOC(prom);
|
||||
|
||||
for (i = UL_DIGITS-1; i >= 0; i--) {
|
||||
buf[i] = (val % 10) + '0';
|
||||
val = val/10;
|
||||
if (val == 0)
|
||||
break;
|
||||
}
|
||||
/* shift stuff down */
|
||||
size = UL_DIGITS - i;
|
||||
call_prom("write", 3, 1, _prom->stdout, buf+i, size);
|
||||
}
|
||||
|
||||
static void __init prom_printf(const char *format, ...)
|
||||
{
|
||||
@ -350,6 +368,14 @@ static void __init prom_printf(const char *format, ...)
|
||||
v = va_arg(args, unsigned long);
|
||||
prom_print_hex(v);
|
||||
break;
|
||||
case 'l':
|
||||
++q;
|
||||
if (*q == 'u') { /* '%lu' */
|
||||
++q;
|
||||
v = va_arg(args, unsigned long);
|
||||
prom_print_dec(v);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -835,11 +861,11 @@ static int __init prom_count_smt_threads(void)
|
||||
if (plen == PROM_ERROR)
|
||||
break;
|
||||
plen >>= 2;
|
||||
prom_debug("Found 0x%x smt threads per core\n", (unsigned long)plen);
|
||||
prom_debug("Found %lu smt threads per core\n", (unsigned long)plen);
|
||||
|
||||
/* Sanity check */
|
||||
if (plen < 1 || plen > 64) {
|
||||
prom_printf("Threads per core 0x%x out of bounds, assuming 1\n",
|
||||
prom_printf("Threads per core %lu out of bounds, assuming 1\n",
|
||||
(unsigned long)plen);
|
||||
return 1;
|
||||
}
|
||||
@ -869,12 +895,12 @@ static void __init prom_send_capabilities(void)
|
||||
cores = (u32 *)PTRRELOC(&ibm_architecture_vec[IBM_ARCH_VEC_NRCORES_OFFSET]);
|
||||
if (*cores != NR_CPUS) {
|
||||
prom_printf("WARNING ! "
|
||||
"ibm_architecture_vec structure inconsistent: 0x%x !\n",
|
||||
"ibm_architecture_vec structure inconsistent: %lu!\n",
|
||||
*cores);
|
||||
} else {
|
||||
*cores = DIV_ROUND_UP(NR_CPUS, prom_count_smt_threads());
|
||||
prom_printf("Max number of cores passed to firmware: 0x%x\n",
|
||||
(unsigned long)*cores);
|
||||
prom_printf("Max number of cores passed to firmware: %lu (NR_CPUS = %lu)\n",
|
||||
*cores, NR_CPUS);
|
||||
}
|
||||
|
||||
/* try calling the ibm,client-architecture-support method */
|
||||
@ -1482,7 +1508,7 @@ static void __init prom_hold_cpus(void)
|
||||
reg = -1;
|
||||
prom_getprop(node, "reg", ®, sizeof(reg));
|
||||
|
||||
prom_debug("cpu hw idx = 0x%x\n", reg);
|
||||
prom_debug("cpu hw idx = %lu\n", reg);
|
||||
|
||||
/* Init the acknowledge var which will be reset by
|
||||
* the secondary cpu when it awakens from its OF
|
||||
@ -1492,7 +1518,7 @@ static void __init prom_hold_cpus(void)
|
||||
|
||||
if (reg != _prom->cpu) {
|
||||
/* Primary Thread of non-boot cpu */
|
||||
prom_printf("starting cpu hw idx %x... ", reg);
|
||||
prom_printf("starting cpu hw idx %lu... ", reg);
|
||||
call_prom("start-cpu", 3, 0, node,
|
||||
secondary_hold, reg);
|
||||
|
||||
@ -1507,7 +1533,7 @@ static void __init prom_hold_cpus(void)
|
||||
}
|
||||
#ifdef CONFIG_SMP
|
||||
else
|
||||
prom_printf("boot cpu hw idx %x\n", reg);
|
||||
prom_printf("boot cpu hw idx %lu\n", reg);
|
||||
#endif /* CONFIG_SMP */
|
||||
}
|
||||
|
||||
@ -2420,7 +2446,7 @@ static void __init prom_find_boot_cpu(void)
|
||||
prom_getprop(cpu_pkg, "reg", &getprop_rval, sizeof(getprop_rval));
|
||||
_prom->cpu = getprop_rval;
|
||||
|
||||
prom_debug("Booting CPU hw index = 0x%x\n", _prom->cpu);
|
||||
prom_debug("Booting CPU hw index = %lu\n", _prom->cpu);
|
||||
}
|
||||
|
||||
static void __init prom_check_initrd(unsigned long r3, unsigned long r4)
|
||||
|
@ -32,6 +32,8 @@
|
||||
#ifdef CONFIG_PPC32
|
||||
#include <linux/module.h>
|
||||
#endif
|
||||
#include <linux/hw_breakpoint.h>
|
||||
#include <linux/perf_event.h>
|
||||
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/page.h>
|
||||
@ -866,9 +868,34 @@ void user_disable_single_step(struct task_struct *task)
|
||||
clear_tsk_thread_flag(task, TIF_SINGLESTEP);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HAVE_HW_BREAKPOINT
|
||||
void ptrace_triggered(struct perf_event *bp, int nmi,
|
||||
struct perf_sample_data *data, struct pt_regs *regs)
|
||||
{
|
||||
struct perf_event_attr attr;
|
||||
|
||||
/*
|
||||
* Disable the breakpoint request here since ptrace has defined a
|
||||
* one-shot behaviour for breakpoint exceptions in PPC64.
|
||||
* The SIGTRAP signal is generated automatically for us in do_dabr().
|
||||
* We don't have to do anything about that here
|
||||
*/
|
||||
attr = bp->attr;
|
||||
attr.disabled = true;
|
||||
modify_user_hw_breakpoint(bp, &attr);
|
||||
}
|
||||
#endif /* CONFIG_HAVE_HW_BREAKPOINT */
|
||||
|
||||
int ptrace_set_debugreg(struct task_struct *task, unsigned long addr,
|
||||
unsigned long data)
|
||||
{
|
||||
#ifdef CONFIG_HAVE_HW_BREAKPOINT
|
||||
int ret;
|
||||
struct thread_struct *thread = &(task->thread);
|
||||
struct perf_event *bp;
|
||||
struct perf_event_attr attr;
|
||||
#endif /* CONFIG_HAVE_HW_BREAKPOINT */
|
||||
|
||||
/* For ppc64 we support one DABR and no IABR's at the moment (ppc64).
|
||||
* For embedded processors we support one DAC and no IAC's at the
|
||||
* moment.
|
||||
@ -896,6 +923,43 @@ int ptrace_set_debugreg(struct task_struct *task, unsigned long addr,
|
||||
/* Ensure breakpoint translation bit is set */
|
||||
if (data && !(data & DABR_TRANSLATION))
|
||||
return -EIO;
|
||||
#ifdef CONFIG_HAVE_HW_BREAKPOINT
|
||||
bp = thread->ptrace_bps[0];
|
||||
if ((!data) || !(data & (DABR_DATA_WRITE | DABR_DATA_READ))) {
|
||||
if (bp) {
|
||||
unregister_hw_breakpoint(bp);
|
||||
thread->ptrace_bps[0] = NULL;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
if (bp) {
|
||||
attr = bp->attr;
|
||||
attr.bp_addr = data & ~HW_BREAKPOINT_ALIGN;
|
||||
arch_bp_generic_fields(data &
|
||||
(DABR_DATA_WRITE | DABR_DATA_READ),
|
||||
&attr.bp_type);
|
||||
ret = modify_user_hw_breakpoint(bp, &attr);
|
||||
if (ret)
|
||||
return ret;
|
||||
thread->ptrace_bps[0] = bp;
|
||||
thread->dabr = data;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Create a new breakpoint request if one doesn't exist already */
|
||||
hw_breakpoint_init(&attr);
|
||||
attr.bp_addr = data & ~HW_BREAKPOINT_ALIGN;
|
||||
arch_bp_generic_fields(data & (DABR_DATA_WRITE | DABR_DATA_READ),
|
||||
&attr.bp_type);
|
||||
|
||||
thread->ptrace_bps[0] = bp = register_user_hw_breakpoint(&attr,
|
||||
ptrace_triggered, task);
|
||||
if (IS_ERR(bp)) {
|
||||
thread->ptrace_bps[0] = NULL;
|
||||
return PTR_ERR(bp);
|
||||
}
|
||||
|
||||
#endif /* CONFIG_HAVE_HW_BREAKPOINT */
|
||||
|
||||
/* Move contents to the DABR register */
|
||||
task->thread.dabr = data;
|
||||
|
@ -47,14 +47,6 @@ struct rtas_t rtas = {
|
||||
};
|
||||
EXPORT_SYMBOL(rtas);
|
||||
|
||||
struct rtas_suspend_me_data {
|
||||
atomic_t working; /* number of cpus accessing this struct */
|
||||
atomic_t done;
|
||||
int token; /* ibm,suspend-me */
|
||||
int error;
|
||||
struct completion *complete; /* wait on this until working == 0 */
|
||||
};
|
||||
|
||||
DEFINE_SPINLOCK(rtas_data_buf_lock);
|
||||
EXPORT_SYMBOL(rtas_data_buf_lock);
|
||||
|
||||
@ -714,14 +706,53 @@ void rtas_os_term(char *str)
|
||||
|
||||
static int ibm_suspend_me_token = RTAS_UNKNOWN_SERVICE;
|
||||
#ifdef CONFIG_PPC_PSERIES
|
||||
static void rtas_percpu_suspend_me(void *info)
|
||||
static int __rtas_suspend_last_cpu(struct rtas_suspend_me_data *data, int wake_when_done)
|
||||
{
|
||||
u16 slb_size = mmu_slb_size;
|
||||
int rc = H_MULTI_THREADS_ACTIVE;
|
||||
int cpu;
|
||||
|
||||
slb_set_size(SLB_MIN_SIZE);
|
||||
printk(KERN_DEBUG "calling ibm,suspend-me on cpu %i\n", smp_processor_id());
|
||||
|
||||
while (rc == H_MULTI_THREADS_ACTIVE && !atomic_read(&data->done) &&
|
||||
!atomic_read(&data->error))
|
||||
rc = rtas_call(data->token, 0, 1, NULL);
|
||||
|
||||
if (rc || atomic_read(&data->error)) {
|
||||
printk(KERN_DEBUG "ibm,suspend-me returned %d\n", rc);
|
||||
slb_set_size(slb_size);
|
||||
}
|
||||
|
||||
if (atomic_read(&data->error))
|
||||
rc = atomic_read(&data->error);
|
||||
|
||||
atomic_set(&data->error, rc);
|
||||
|
||||
if (wake_when_done) {
|
||||
atomic_set(&data->done, 1);
|
||||
|
||||
for_each_online_cpu(cpu)
|
||||
plpar_hcall_norets(H_PROD, get_hard_smp_processor_id(cpu));
|
||||
}
|
||||
|
||||
if (atomic_dec_return(&data->working) == 0)
|
||||
complete(data->complete);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
int rtas_suspend_last_cpu(struct rtas_suspend_me_data *data)
|
||||
{
|
||||
atomic_inc(&data->working);
|
||||
return __rtas_suspend_last_cpu(data, 0);
|
||||
}
|
||||
|
||||
static int __rtas_suspend_cpu(struct rtas_suspend_me_data *data, int wake_when_done)
|
||||
{
|
||||
long rc = H_SUCCESS;
|
||||
unsigned long msr_save;
|
||||
u16 slb_size = mmu_slb_size;
|
||||
int cpu;
|
||||
struct rtas_suspend_me_data *data =
|
||||
(struct rtas_suspend_me_data *)info;
|
||||
|
||||
atomic_inc(&data->working);
|
||||
|
||||
@ -729,7 +760,7 @@ static void rtas_percpu_suspend_me(void *info)
|
||||
msr_save = mfmsr();
|
||||
mtmsr(msr_save & ~(MSR_EE));
|
||||
|
||||
while (rc == H_SUCCESS && !atomic_read(&data->done))
|
||||
while (rc == H_SUCCESS && !atomic_read(&data->done) && !atomic_read(&data->error))
|
||||
rc = plpar_hcall_norets(H_JOIN);
|
||||
|
||||
mtmsr(msr_save);
|
||||
@ -741,33 +772,37 @@ static void rtas_percpu_suspend_me(void *info)
|
||||
/* All other cpus are in H_JOIN, this cpu does
|
||||
* the suspend.
|
||||
*/
|
||||
slb_set_size(SLB_MIN_SIZE);
|
||||
printk(KERN_DEBUG "calling ibm,suspend-me on cpu %i\n",
|
||||
smp_processor_id());
|
||||
data->error = rtas_call(data->token, 0, 1, NULL);
|
||||
|
||||
if (data->error) {
|
||||
printk(KERN_DEBUG "ibm,suspend-me returned %d\n",
|
||||
data->error);
|
||||
slb_set_size(slb_size);
|
||||
}
|
||||
return __rtas_suspend_last_cpu(data, wake_when_done);
|
||||
} else {
|
||||
printk(KERN_ERR "H_JOIN on cpu %i failed with rc = %ld\n",
|
||||
smp_processor_id(), rc);
|
||||
data->error = rc;
|
||||
atomic_set(&data->error, rc);
|
||||
}
|
||||
|
||||
atomic_set(&data->done, 1);
|
||||
if (wake_when_done) {
|
||||
atomic_set(&data->done, 1);
|
||||
|
||||
/* This cpu did the suspend or got an error; in either case,
|
||||
* we need to prod all other other cpus out of join state.
|
||||
* Extra prods are harmless.
|
||||
*/
|
||||
for_each_online_cpu(cpu)
|
||||
plpar_hcall_norets(H_PROD, get_hard_smp_processor_id(cpu));
|
||||
/* This cpu did the suspend or got an error; in either case,
|
||||
* we need to prod all other other cpus out of join state.
|
||||
* Extra prods are harmless.
|
||||
*/
|
||||
for_each_online_cpu(cpu)
|
||||
plpar_hcall_norets(H_PROD, get_hard_smp_processor_id(cpu));
|
||||
}
|
||||
out:
|
||||
if (atomic_dec_return(&data->working) == 0)
|
||||
complete(data->complete);
|
||||
return rc;
|
||||
}
|
||||
|
||||
int rtas_suspend_cpu(struct rtas_suspend_me_data *data)
|
||||
{
|
||||
return __rtas_suspend_cpu(data, 0);
|
||||
}
|
||||
|
||||
static void rtas_percpu_suspend_me(void *info)
|
||||
{
|
||||
__rtas_suspend_cpu((struct rtas_suspend_me_data *)info, 1);
|
||||
}
|
||||
|
||||
static int rtas_ibm_suspend_me(struct rtas_args *args)
|
||||
@ -802,22 +837,22 @@ static int rtas_ibm_suspend_me(struct rtas_args *args)
|
||||
|
||||
atomic_set(&data.working, 0);
|
||||
atomic_set(&data.done, 0);
|
||||
atomic_set(&data.error, 0);
|
||||
data.token = rtas_token("ibm,suspend-me");
|
||||
data.error = 0;
|
||||
data.complete = &done;
|
||||
|
||||
/* Call function on all CPUs. One of us will make the
|
||||
* rtas call
|
||||
*/
|
||||
if (on_each_cpu(rtas_percpu_suspend_me, &data, 0))
|
||||
data.error = -EINVAL;
|
||||
atomic_set(&data.error, -EINVAL);
|
||||
|
||||
wait_for_completion(&done);
|
||||
|
||||
if (data.error != 0)
|
||||
if (atomic_read(&data.error) != 0)
|
||||
printk(KERN_ERR "Error doing global join\n");
|
||||
|
||||
return data.error;
|
||||
return atomic_read(&data.error);
|
||||
}
|
||||
#else /* CONFIG_PPC_PSERIES */
|
||||
static int rtas_ibm_suspend_me(struct rtas_args *args)
|
||||
|
@ -94,6 +94,10 @@ struct screen_info screen_info = {
|
||||
.orig_video_points = 16
|
||||
};
|
||||
|
||||
/* Variables required to store legacy IO irq routing */
|
||||
int of_i8042_kbd_irq;
|
||||
int of_i8042_aux_irq;
|
||||
|
||||
#ifdef __DO_IRQ_CANON
|
||||
/* XXX should go elsewhere eventually */
|
||||
int ppc_do_canonicalize_irqs;
|
||||
@ -575,6 +579,15 @@ int check_legacy_ioport(unsigned long base_port)
|
||||
np = of_find_compatible_node(NULL, NULL, "pnpPNP,f03");
|
||||
if (np) {
|
||||
parent = of_get_parent(np);
|
||||
|
||||
of_i8042_kbd_irq = irq_of_parse_and_map(parent, 0);
|
||||
if (!of_i8042_kbd_irq)
|
||||
of_i8042_kbd_irq = 1;
|
||||
|
||||
of_i8042_aux_irq = irq_of_parse_and_map(parent, 1);
|
||||
if (!of_i8042_aux_irq)
|
||||
of_i8042_aux_irq = 12;
|
||||
|
||||
of_node_put(np);
|
||||
np = parent;
|
||||
break;
|
||||
|
@ -142,16 +142,6 @@ early_param("smt-enabled", early_smt_enabled);
|
||||
#define check_smt_enabled()
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
/* Put the paca pointer into r13 and SPRG_PACA */
|
||||
static void __init setup_paca(struct paca_struct *new_paca)
|
||||
{
|
||||
local_paca = new_paca;
|
||||
mtspr(SPRN_SPRG_PACA, local_paca);
|
||||
#ifdef CONFIG_PPC_BOOK3E
|
||||
mtspr(SPRN_SPRG_TLB_EXFRAME, local_paca->extlb);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* Early initialization entry point. This is called by head.S
|
||||
* with MMU translation disabled. We rely on the "feature" of
|
||||
@ -600,6 +590,9 @@ static int pcpu_cpu_distance(unsigned int from, unsigned int to)
|
||||
return REMOTE_DISTANCE;
|
||||
}
|
||||
|
||||
unsigned long __per_cpu_offset[NR_CPUS] __read_mostly;
|
||||
EXPORT_SYMBOL(__per_cpu_offset);
|
||||
|
||||
void __init setup_per_cpu_areas(void)
|
||||
{
|
||||
const size_t dyn_size = PERCPU_MODULE_RESERVE + PERCPU_DYNAMIC_RESERVE;
|
||||
@ -624,8 +617,10 @@ void __init setup_per_cpu_areas(void)
|
||||
panic("cannot initialize percpu area (err=%d)", rc);
|
||||
|
||||
delta = (unsigned long)pcpu_base_addr - (unsigned long)__per_cpu_start;
|
||||
for_each_possible_cpu(cpu)
|
||||
paca[cpu].data_offset = delta + pcpu_unit_offsets[cpu];
|
||||
for_each_possible_cpu(cpu) {
|
||||
__per_cpu_offset[cpu] = delta + pcpu_unit_offsets[cpu];
|
||||
paca[cpu].data_offset = __per_cpu_offset[cpu];
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -11,6 +11,7 @@
|
||||
|
||||
#include <linux/tracehook.h>
|
||||
#include <linux/signal.h>
|
||||
#include <asm/hw_breakpoint.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/unistd.h>
|
||||
|
||||
@ -149,6 +150,8 @@ static int do_signal_pending(sigset_t *oldset, struct pt_regs *regs)
|
||||
if (current->thread.dabr)
|
||||
set_dabr(current->thread.dabr);
|
||||
#endif
|
||||
/* Re-enable the breakpoints for the signal stack */
|
||||
thread_change_pc(current, regs);
|
||||
|
||||
if (is32) {
|
||||
if (ka.sa.sa_flags & SA_SIGINFO)
|
||||
|
@ -288,8 +288,6 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
|
||||
max_cpus = NR_CPUS;
|
||||
else
|
||||
max_cpus = 1;
|
||||
|
||||
smp_space_timers(max_cpus);
|
||||
|
||||
for_each_possible_cpu(cpu)
|
||||
if (cpu != boot_cpuid)
|
||||
@ -501,14 +499,6 @@ int __devinit start_secondary(void *unused)
|
||||
current->active_mm = &init_mm;
|
||||
|
||||
smp_store_cpu_info(cpu);
|
||||
|
||||
#if defined(CONFIG_BOOKE) || defined(CONFIG_40x)
|
||||
/* Clear any pending timer interrupts */
|
||||
mtspr(SPRN_TSR, TSR_ENW | TSR_WIS | TSR_DIS | TSR_FIS);
|
||||
|
||||
/* Enable decrementer interrupt */
|
||||
mtspr(SPRN_TCR, TCR_DIE);
|
||||
#endif
|
||||
set_dec(tb_ticks_per_jiffy);
|
||||
preempt_disable();
|
||||
cpu_callin_map[cpu] = 1;
|
||||
|
@ -149,16 +149,6 @@ unsigned long tb_ticks_per_usec = 100; /* sane default */
|
||||
EXPORT_SYMBOL(tb_ticks_per_usec);
|
||||
unsigned long tb_ticks_per_sec;
|
||||
EXPORT_SYMBOL(tb_ticks_per_sec); /* for cputime_t conversions */
|
||||
u64 tb_to_xs;
|
||||
unsigned tb_to_us;
|
||||
|
||||
#define TICKLEN_SCALE NTP_SCALE_SHIFT
|
||||
static u64 last_tick_len; /* units are ns / 2^TICKLEN_SCALE */
|
||||
static u64 ticklen_to_xs; /* 0.64 fraction */
|
||||
|
||||
/* If last_tick_len corresponds to about 1/HZ seconds, then
|
||||
last_tick_len << TICKLEN_SHIFT will be about 2^63. */
|
||||
#define TICKLEN_SHIFT (63 - 30 - TICKLEN_SCALE + SHIFT_HZ)
|
||||
|
||||
DEFINE_SPINLOCK(rtc_lock);
|
||||
EXPORT_SYMBOL_GPL(rtc_lock);
|
||||
@ -174,7 +164,6 @@ unsigned long ppc_proc_freq;
|
||||
EXPORT_SYMBOL(ppc_proc_freq);
|
||||
unsigned long ppc_tb_freq;
|
||||
|
||||
static u64 tb_last_jiffy __cacheline_aligned_in_smp;
|
||||
static DEFINE_PER_CPU(u64, last_jiffy);
|
||||
|
||||
#ifdef CONFIG_VIRT_CPU_ACCOUNTING
|
||||
@ -423,30 +412,6 @@ void udelay(unsigned long usecs)
|
||||
}
|
||||
EXPORT_SYMBOL(udelay);
|
||||
|
||||
static inline void update_gtod(u64 new_tb_stamp, u64 new_stamp_xsec,
|
||||
u64 new_tb_to_xs)
|
||||
{
|
||||
/*
|
||||
* tb_update_count is used to allow the userspace gettimeofday code
|
||||
* to assure itself that it sees a consistent view of the tb_to_xs and
|
||||
* stamp_xsec variables. It reads the tb_update_count, then reads
|
||||
* tb_to_xs and stamp_xsec and then reads tb_update_count again. If
|
||||
* the two values of tb_update_count match and are even then the
|
||||
* tb_to_xs and stamp_xsec values are consistent. If not, then it
|
||||
* loops back and reads them again until this criteria is met.
|
||||
* We expect the caller to have done the first increment of
|
||||
* vdso_data->tb_update_count already.
|
||||
*/
|
||||
vdso_data->tb_orig_stamp = new_tb_stamp;
|
||||
vdso_data->stamp_xsec = new_stamp_xsec;
|
||||
vdso_data->tb_to_xs = new_tb_to_xs;
|
||||
vdso_data->wtom_clock_sec = wall_to_monotonic.tv_sec;
|
||||
vdso_data->wtom_clock_nsec = wall_to_monotonic.tv_nsec;
|
||||
vdso_data->stamp_xtime = xtime;
|
||||
smp_wmb();
|
||||
++(vdso_data->tb_update_count);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
unsigned long profile_pc(struct pt_regs *regs)
|
||||
{
|
||||
@ -470,7 +435,6 @@ EXPORT_SYMBOL(profile_pc);
|
||||
|
||||
static int __init iSeries_tb_recal(void)
|
||||
{
|
||||
struct div_result divres;
|
||||
unsigned long titan, tb;
|
||||
|
||||
/* Make sure we only run on iSeries */
|
||||
@ -501,10 +465,7 @@ static int __init iSeries_tb_recal(void)
|
||||
tb_ticks_per_jiffy = new_tb_ticks_per_jiffy;
|
||||
tb_ticks_per_sec = new_tb_ticks_per_sec;
|
||||
calc_cputime_factors();
|
||||
div128_by_32( XSEC_PER_SEC, 0, tb_ticks_per_sec, &divres );
|
||||
tb_to_xs = divres.result_low;
|
||||
vdso_data->tb_ticks_per_sec = tb_ticks_per_sec;
|
||||
vdso_data->tb_to_xs = tb_to_xs;
|
||||
setup_cputime_one_jiffy();
|
||||
}
|
||||
else {
|
||||
@ -667,27 +628,9 @@ void timer_interrupt(struct pt_regs * regs)
|
||||
trace_timer_interrupt_exit(regs);
|
||||
}
|
||||
|
||||
void wakeup_decrementer(void)
|
||||
{
|
||||
unsigned long ticks;
|
||||
|
||||
/*
|
||||
* The timebase gets saved on sleep and restored on wakeup,
|
||||
* so all we need to do is to reset the decrementer.
|
||||
*/
|
||||
ticks = tb_ticks_since(__get_cpu_var(last_jiffy));
|
||||
if (ticks < tb_ticks_per_jiffy)
|
||||
ticks = tb_ticks_per_jiffy - ticks;
|
||||
else
|
||||
ticks = 1;
|
||||
set_dec(ticks);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SUSPEND
|
||||
void generic_suspend_disable_irqs(void)
|
||||
static void generic_suspend_disable_irqs(void)
|
||||
{
|
||||
preempt_disable();
|
||||
|
||||
/* Disable the decrementer, so that it doesn't interfere
|
||||
* with suspending.
|
||||
*/
|
||||
@ -697,12 +640,9 @@ void generic_suspend_disable_irqs(void)
|
||||
set_dec(0x7fffffff);
|
||||
}
|
||||
|
||||
void generic_suspend_enable_irqs(void)
|
||||
static void generic_suspend_enable_irqs(void)
|
||||
{
|
||||
wakeup_decrementer();
|
||||
|
||||
local_irq_enable();
|
||||
preempt_enable();
|
||||
}
|
||||
|
||||
/* Overrides the weak version in kernel/power/main.c */
|
||||
@ -722,23 +662,6 @@ void arch_suspend_enable_irqs(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
void __init smp_space_timers(unsigned int max_cpus)
|
||||
{
|
||||
int i;
|
||||
u64 previous_tb = per_cpu(last_jiffy, boot_cpuid);
|
||||
|
||||
/* make sure tb > per_cpu(last_jiffy, cpu) for all cpus always */
|
||||
previous_tb -= tb_ticks_per_jiffy;
|
||||
|
||||
for_each_possible_cpu(i) {
|
||||
if (i == boot_cpuid)
|
||||
continue;
|
||||
per_cpu(last_jiffy, i) = previous_tb;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Scheduler clock - returns current time in nanosec units.
|
||||
*
|
||||
@ -873,10 +796,37 @@ static cycle_t timebase_read(struct clocksource *cs)
|
||||
return (cycle_t)get_tb();
|
||||
}
|
||||
|
||||
static inline void update_gtod(u64 new_tb_stamp, u64 new_stamp_xsec,
|
||||
u64 new_tb_to_xs, struct timespec *now,
|
||||
u32 frac_sec)
|
||||
{
|
||||
/*
|
||||
* tb_update_count is used to allow the userspace gettimeofday code
|
||||
* to assure itself that it sees a consistent view of the tb_to_xs and
|
||||
* stamp_xsec variables. It reads the tb_update_count, then reads
|
||||
* tb_to_xs and stamp_xsec and then reads tb_update_count again. If
|
||||
* the two values of tb_update_count match and are even then the
|
||||
* tb_to_xs and stamp_xsec values are consistent. If not, then it
|
||||
* loops back and reads them again until this criteria is met.
|
||||
* We expect the caller to have done the first increment of
|
||||
* vdso_data->tb_update_count already.
|
||||
*/
|
||||
vdso_data->tb_orig_stamp = new_tb_stamp;
|
||||
vdso_data->stamp_xsec = new_stamp_xsec;
|
||||
vdso_data->tb_to_xs = new_tb_to_xs;
|
||||
vdso_data->wtom_clock_sec = wall_to_monotonic.tv_sec;
|
||||
vdso_data->wtom_clock_nsec = wall_to_monotonic.tv_nsec;
|
||||
vdso_data->stamp_xtime = *now;
|
||||
vdso_data->stamp_sec_fraction = frac_sec;
|
||||
smp_wmb();
|
||||
++(vdso_data->tb_update_count);
|
||||
}
|
||||
|
||||
void update_vsyscall(struct timespec *wall_time, struct clocksource *clock,
|
||||
u32 mult)
|
||||
{
|
||||
u64 t2x, stamp_xsec;
|
||||
u32 frac_sec;
|
||||
|
||||
if (clock != &clocksource_timebase)
|
||||
return;
|
||||
@ -888,10 +838,14 @@ void update_vsyscall(struct timespec *wall_time, struct clocksource *clock,
|
||||
/* XXX this assumes clock->shift == 22 */
|
||||
/* 4611686018 ~= 2^(20+64-22) / 1e9 */
|
||||
t2x = (u64) mult * 4611686018ULL;
|
||||
stamp_xsec = (u64) xtime.tv_nsec * XSEC_PER_SEC;
|
||||
stamp_xsec = (u64) wall_time->tv_nsec * XSEC_PER_SEC;
|
||||
do_div(stamp_xsec, 1000000000);
|
||||
stamp_xsec += (u64) xtime.tv_sec * XSEC_PER_SEC;
|
||||
update_gtod(clock->cycle_last, stamp_xsec, t2x);
|
||||
stamp_xsec += (u64) wall_time->tv_sec * XSEC_PER_SEC;
|
||||
|
||||
BUG_ON(wall_time->tv_nsec >= NSEC_PER_SEC);
|
||||
/* this is tv_nsec / 1e9 as a 0.32 fraction */
|
||||
frac_sec = ((u64) wall_time->tv_nsec * 18446744073ULL) >> 32;
|
||||
update_gtod(clock->cycle_last, stamp_xsec, t2x, wall_time, frac_sec);
|
||||
}
|
||||
|
||||
void update_vsyscall_tz(void)
|
||||
@ -1007,15 +961,13 @@ void secondary_cpu_time_init(void)
|
||||
/* This function is only called on the boot processor */
|
||||
void __init time_init(void)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct div_result res;
|
||||
u64 scale, x;
|
||||
u64 scale;
|
||||
unsigned shift;
|
||||
|
||||
if (__USE_RTC()) {
|
||||
/* 601 processor: dec counts down by 128 every 128ns */
|
||||
ppc_tb_freq = 1000000000;
|
||||
tb_last_jiffy = get_rtcl();
|
||||
} else {
|
||||
/* Normal PowerPC with timebase register */
|
||||
ppc_md.calibrate_decr();
|
||||
@ -1023,49 +975,14 @@ void __init time_init(void)
|
||||
ppc_tb_freq / 1000000, ppc_tb_freq % 1000000);
|
||||
printk(KERN_DEBUG "time_init: processor frequency = %lu.%.6lu MHz\n",
|
||||
ppc_proc_freq / 1000000, ppc_proc_freq % 1000000);
|
||||
tb_last_jiffy = get_tb();
|
||||
}
|
||||
|
||||
tb_ticks_per_jiffy = ppc_tb_freq / HZ;
|
||||
tb_ticks_per_sec = ppc_tb_freq;
|
||||
tb_ticks_per_usec = ppc_tb_freq / 1000000;
|
||||
tb_to_us = mulhwu_scale_factor(ppc_tb_freq, 1000000);
|
||||
calc_cputime_factors();
|
||||
setup_cputime_one_jiffy();
|
||||
|
||||
/*
|
||||
* Calculate the length of each tick in ns. It will not be
|
||||
* exactly 1e9/HZ unless ppc_tb_freq is divisible by HZ.
|
||||
* We compute 1e9 * tb_ticks_per_jiffy / ppc_tb_freq,
|
||||
* rounded up.
|
||||
*/
|
||||
x = (u64) NSEC_PER_SEC * tb_ticks_per_jiffy + ppc_tb_freq - 1;
|
||||
do_div(x, ppc_tb_freq);
|
||||
tick_nsec = x;
|
||||
last_tick_len = x << TICKLEN_SCALE;
|
||||
|
||||
/*
|
||||
* Compute ticklen_to_xs, which is a factor which gets multiplied
|
||||
* by (last_tick_len << TICKLEN_SHIFT) to get a tb_to_xs value.
|
||||
* It is computed as:
|
||||
* ticklen_to_xs = 2^N / (tb_ticks_per_jiffy * 1e9)
|
||||
* where N = 64 + 20 - TICKLEN_SCALE - TICKLEN_SHIFT
|
||||
* which turns out to be N = 51 - SHIFT_HZ.
|
||||
* This gives the result as a 0.64 fixed-point fraction.
|
||||
* That value is reduced by an offset amounting to 1 xsec per
|
||||
* 2^31 timebase ticks to avoid problems with time going backwards
|
||||
* by 1 xsec when we do timer_recalc_offset due to losing the
|
||||
* fractional xsec. That offset is equal to ppc_tb_freq/2^51
|
||||
* since there are 2^20 xsec in a second.
|
||||
*/
|
||||
div128_by_32((1ULL << 51) - ppc_tb_freq, 0,
|
||||
tb_ticks_per_jiffy << SHIFT_HZ, &res);
|
||||
div128_by_32(res.result_high, res.result_low, NSEC_PER_SEC, &res);
|
||||
ticklen_to_xs = res.result_low;
|
||||
|
||||
/* Compute tb_to_xs from tick_nsec */
|
||||
tb_to_xs = mulhdu(last_tick_len << TICKLEN_SHIFT, ticklen_to_xs);
|
||||
|
||||
/*
|
||||
* Compute scale factor for sched_clock.
|
||||
* The calibrate_decr() function has set tb_ticks_per_sec,
|
||||
@ -1087,21 +1004,14 @@ void __init time_init(void)
|
||||
/* Save the current timebase to pretty up CONFIG_PRINTK_TIME */
|
||||
boot_tb = get_tb_or_rtc();
|
||||
|
||||
write_seqlock_irqsave(&xtime_lock, flags);
|
||||
|
||||
/* If platform provided a timezone (pmac), we correct the time */
|
||||
if (timezone_offset) {
|
||||
sys_tz.tz_minuteswest = -timezone_offset / 60;
|
||||
sys_tz.tz_dsttime = 0;
|
||||
}
|
||||
|
||||
vdso_data->tb_orig_stamp = tb_last_jiffy;
|
||||
vdso_data->tb_update_count = 0;
|
||||
vdso_data->tb_ticks_per_sec = tb_ticks_per_sec;
|
||||
vdso_data->stamp_xsec = (u64) xtime.tv_sec * XSEC_PER_SEC;
|
||||
vdso_data->tb_to_xs = tb_to_xs;
|
||||
|
||||
write_sequnlock_irqrestore(&xtime_lock, flags);
|
||||
|
||||
/* Start the decrementer on CPUs that have manual control
|
||||
* such as BookE
|
||||
@ -1195,39 +1105,6 @@ void to_tm(int tim, struct rtc_time * tm)
|
||||
GregorianDay(tm);
|
||||
}
|
||||
|
||||
/* Auxiliary function to compute scaling factors */
|
||||
/* Actually the choice of a timebase running at 1/4 the of the bus
|
||||
* frequency giving resolution of a few tens of nanoseconds is quite nice.
|
||||
* It makes this computation very precise (27-28 bits typically) which
|
||||
* is optimistic considering the stability of most processor clock
|
||||
* oscillators and the precision with which the timebase frequency
|
||||
* is measured but does not harm.
|
||||
*/
|
||||
unsigned mulhwu_scale_factor(unsigned inscale, unsigned outscale)
|
||||
{
|
||||
unsigned mlt=0, tmp, err;
|
||||
/* No concern for performance, it's done once: use a stupid
|
||||
* but safe and compact method to find the multiplier.
|
||||
*/
|
||||
|
||||
for (tmp = 1U<<31; tmp != 0; tmp >>= 1) {
|
||||
if (mulhwu(inscale, mlt|tmp) < outscale)
|
||||
mlt |= tmp;
|
||||
}
|
||||
|
||||
/* We might still be off by 1 for the best approximation.
|
||||
* A side effect of this is that if outscale is too large
|
||||
* the returned value will be zero.
|
||||
* Many corner cases have been checked and seem to work,
|
||||
* some might have been forgotten in the test however.
|
||||
*/
|
||||
|
||||
err = inscale * (mlt+1);
|
||||
if (err <= inscale/2)
|
||||
mlt++;
|
||||
return mlt;
|
||||
}
|
||||
|
||||
/*
|
||||
* Divide a 128-bit dividend by a 32-bit divisor, leaving a 128 bit
|
||||
* result.
|
||||
|
@ -55,9 +55,6 @@
|
||||
#endif
|
||||
#include <asm/kexec.h>
|
||||
#include <asm/ppc-opcode.h>
|
||||
#ifdef CONFIG_FSL_BOOKE
|
||||
#include <asm/dbell.h>
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_DEBUGGER) || defined(CONFIG_KEXEC)
|
||||
int (*__debugger)(struct pt_regs *regs) __read_mostly;
|
||||
@ -688,7 +685,7 @@ void RunModeException(struct pt_regs *regs)
|
||||
|
||||
void __kprobes single_step_exception(struct pt_regs *regs)
|
||||
{
|
||||
regs->msr &= ~(MSR_SE | MSR_BE); /* Turn off 'trace' bits */
|
||||
clear_single_step(regs);
|
||||
|
||||
if (notify_die(DIE_SSTEP, "single_step", regs, 5,
|
||||
5, SIGTRAP) == NOTIFY_STOP)
|
||||
@ -707,10 +704,8 @@ void __kprobes single_step_exception(struct pt_regs *regs)
|
||||
*/
|
||||
static void emulate_single_step(struct pt_regs *regs)
|
||||
{
|
||||
if (single_stepping(regs)) {
|
||||
clear_single_step(regs);
|
||||
_exception(SIGTRAP, regs, TRAP_TRACE, 0);
|
||||
}
|
||||
if (single_stepping(regs))
|
||||
single_step_exception(regs);
|
||||
}
|
||||
|
||||
static inline int __parse_fpscr(unsigned long fpscr)
|
||||
@ -1344,24 +1339,6 @@ void vsx_assist_exception(struct pt_regs *regs)
|
||||
#endif /* CONFIG_VSX */
|
||||
|
||||
#ifdef CONFIG_FSL_BOOKE
|
||||
|
||||
void doorbell_exception(struct pt_regs *regs)
|
||||
{
|
||||
#ifdef CONFIG_SMP
|
||||
int cpu = smp_processor_id();
|
||||
int msg;
|
||||
|
||||
if (num_online_cpus() < 2)
|
||||
return;
|
||||
|
||||
for (msg = 0; msg < 4; msg++)
|
||||
if (test_and_clear_bit(msg, &dbell_smp_message[cpu]))
|
||||
smp_message_recv(msg);
|
||||
#else
|
||||
printk(KERN_WARNING "Received doorbell on non-smp system\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
void CacheLockingException(struct pt_regs *regs, unsigned long address,
|
||||
unsigned long error_code)
|
||||
{
|
||||
|
@ -19,8 +19,10 @@
|
||||
/* Offset for the low 32-bit part of a field of long type */
|
||||
#ifdef CONFIG_PPC64
|
||||
#define LOPART 4
|
||||
#define TSPEC_TV_SEC TSPC64_TV_SEC+LOPART
|
||||
#else
|
||||
#define LOPART 0
|
||||
#define TSPEC_TV_SEC TSPC32_TV_SEC
|
||||
#endif
|
||||
|
||||
.text
|
||||
@ -41,23 +43,11 @@ V_FUNCTION_BEGIN(__kernel_gettimeofday)
|
||||
mr r9, r3 /* datapage ptr in r9 */
|
||||
cmplwi r10,0 /* check if tv is NULL */
|
||||
beq 3f
|
||||
bl __do_get_xsec@local /* get xsec from tb & kernel */
|
||||
bne- 2f /* out of line -> do syscall */
|
||||
|
||||
/* seconds are xsec >> 20 */
|
||||
rlwinm r5,r4,12,20,31
|
||||
rlwimi r5,r3,12,0,19
|
||||
stw r5,TVAL32_TV_SEC(r10)
|
||||
|
||||
/* get remaining xsec and convert to usec. we scale
|
||||
* up remaining xsec by 12 bits and get the top 32 bits
|
||||
* of the multiplication
|
||||
*/
|
||||
rlwinm r5,r4,12,0,19
|
||||
lis r6,1000000@h
|
||||
ori r6,r6,1000000@l
|
||||
mulhwu r5,r5,r6
|
||||
stw r5,TVAL32_TV_USEC(r10)
|
||||
lis r7,1000000@ha /* load up USEC_PER_SEC */
|
||||
addi r7,r7,1000000@l /* so we get microseconds in r4 */
|
||||
bl __do_get_tspec@local /* get sec/usec from tb & kernel */
|
||||
stw r3,TVAL32_TV_SEC(r10)
|
||||
stw r4,TVAL32_TV_USEC(r10)
|
||||
|
||||
3: cmplwi r11,0 /* check if tz is NULL */
|
||||
beq 1f
|
||||
@ -70,14 +60,6 @@ V_FUNCTION_BEGIN(__kernel_gettimeofday)
|
||||
crclr cr0*4+so
|
||||
li r3,0
|
||||
blr
|
||||
|
||||
2:
|
||||
mtlr r12
|
||||
mr r3,r10
|
||||
mr r4,r11
|
||||
li r0,__NR_gettimeofday
|
||||
sc
|
||||
blr
|
||||
.cfi_endproc
|
||||
V_FUNCTION_END(__kernel_gettimeofday)
|
||||
|
||||
@ -100,7 +82,8 @@ V_FUNCTION_BEGIN(__kernel_clock_gettime)
|
||||
mr r11,r4 /* r11 saves tp */
|
||||
bl __get_datapage@local /* get data page */
|
||||
mr r9,r3 /* datapage ptr in r9 */
|
||||
|
||||
lis r7,NSEC_PER_SEC@h /* want nanoseconds */
|
||||
ori r7,r7,NSEC_PER_SEC@l
|
||||
50: bl __do_get_tspec@local /* get sec/nsec from tb & kernel */
|
||||
bne cr1,80f /* not monotonic -> all done */
|
||||
|
||||
@ -198,83 +181,12 @@ V_FUNCTION_END(__kernel_clock_getres)
|
||||
|
||||
|
||||
/*
|
||||
* This is the core of gettimeofday() & friends, it returns the xsec
|
||||
* value in r3 & r4 and expects the datapage ptr (non clobbered)
|
||||
* in r9. clobbers r0,r4,r5,r6,r7,r8.
|
||||
* When returning, r8 contains the counter value that can be reused
|
||||
* by the monotonic clock implementation
|
||||
*/
|
||||
__do_get_xsec:
|
||||
.cfi_startproc
|
||||
/* Check for update count & load values. We use the low
|
||||
* order 32 bits of the update count
|
||||
*/
|
||||
1: lwz r8,(CFG_TB_UPDATE_COUNT+LOPART)(r9)
|
||||
andi. r0,r8,1 /* pending update ? loop */
|
||||
bne- 1b
|
||||
xor r0,r8,r8 /* create dependency */
|
||||
add r9,r9,r0
|
||||
|
||||
/* Load orig stamp (offset to TB) */
|
||||
lwz r5,CFG_TB_ORIG_STAMP(r9)
|
||||
lwz r6,(CFG_TB_ORIG_STAMP+4)(r9)
|
||||
|
||||
/* Get a stable TB value */
|
||||
2: mftbu r3
|
||||
mftbl r4
|
||||
mftbu r0
|
||||
cmpl cr0,r3,r0
|
||||
bne- 2b
|
||||
|
||||
/* Substract tb orig stamp. If the high part is non-zero, we jump to
|
||||
* the slow path which call the syscall.
|
||||
* If it's ok, then we have our 32 bits tb_ticks value in r7
|
||||
*/
|
||||
subfc r7,r6,r4
|
||||
subfe. r0,r5,r3
|
||||
bne- 3f
|
||||
|
||||
/* Load scale factor & do multiplication */
|
||||
lwz r5,CFG_TB_TO_XS(r9) /* load values */
|
||||
lwz r6,(CFG_TB_TO_XS+4)(r9)
|
||||
mulhwu r4,r7,r5
|
||||
mulhwu r6,r7,r6
|
||||
mullw r0,r7,r5
|
||||
addc r6,r6,r0
|
||||
|
||||
/* At this point, we have the scaled xsec value in r4 + XER:CA
|
||||
* we load & add the stamp since epoch
|
||||
*/
|
||||
lwz r5,CFG_STAMP_XSEC(r9)
|
||||
lwz r6,(CFG_STAMP_XSEC+4)(r9)
|
||||
adde r4,r4,r6
|
||||
addze r3,r5
|
||||
|
||||
/* We now have our result in r3,r4. We create a fake dependency
|
||||
* on that result and re-check the counter
|
||||
*/
|
||||
or r6,r4,r3
|
||||
xor r0,r6,r6
|
||||
add r9,r9,r0
|
||||
lwz r0,(CFG_TB_UPDATE_COUNT+LOPART)(r9)
|
||||
cmpl cr0,r8,r0 /* check if updated */
|
||||
bne- 1b
|
||||
|
||||
/* Warning ! The caller expects CR:EQ to be set to indicate a
|
||||
* successful calculation (so it won't fallback to the syscall
|
||||
* method). We have overriden that CR bit in the counter check,
|
||||
* but fortunately, the loop exit condition _is_ CR:EQ set, so
|
||||
* we can exit safely here. If you change this code, be careful
|
||||
* of that side effect.
|
||||
*/
|
||||
3: blr
|
||||
.cfi_endproc
|
||||
|
||||
/*
|
||||
* This is the core of clock_gettime(), it returns the current
|
||||
* time in seconds and nanoseconds in r3 and r4.
|
||||
* This is the core of clock_gettime() and gettimeofday(),
|
||||
* it returns the current time in r3 (seconds) and r4.
|
||||
* On entry, r7 gives the resolution of r4, either USEC_PER_SEC
|
||||
* or NSEC_PER_SEC, giving r4 in microseconds or nanoseconds.
|
||||
* It expects the datapage ptr in r9 and doesn't clobber it.
|
||||
* It clobbers r0, r5, r6, r10 and returns NSEC_PER_SEC in r7.
|
||||
* It clobbers r0, r5 and r6.
|
||||
* On return, r8 contains the counter value that can be reused.
|
||||
* This clobbers cr0 but not any other cr field.
|
||||
*/
|
||||
@ -297,70 +209,58 @@ __do_get_tspec:
|
||||
2: mftbu r3
|
||||
mftbl r4
|
||||
mftbu r0
|
||||
cmpl cr0,r3,r0
|
||||
cmplw cr0,r3,r0
|
||||
bne- 2b
|
||||
|
||||
/* Subtract tb orig stamp and shift left 12 bits.
|
||||
*/
|
||||
subfc r7,r6,r4
|
||||
subfc r4,r6,r4
|
||||
subfe r0,r5,r3
|
||||
slwi r0,r0,12
|
||||
rlwimi. r0,r7,12,20,31
|
||||
slwi r7,r7,12
|
||||
rlwimi. r0,r4,12,20,31
|
||||
slwi r4,r4,12
|
||||
|
||||
/* Load scale factor & do multiplication */
|
||||
/*
|
||||
* Load scale factor & do multiplication.
|
||||
* We only use the high 32 bits of the tb_to_xs value.
|
||||
* Even with a 1GHz timebase clock, the high 32 bits of
|
||||
* tb_to_xs will be at least 4 million, so the error from
|
||||
* ignoring the low 32 bits will be no more than 0.25ppm.
|
||||
* The error will just make the clock run very very slightly
|
||||
* slow until the next time the kernel updates the VDSO data,
|
||||
* at which point the clock will catch up to the kernel's value,
|
||||
* so there is no long-term error accumulation.
|
||||
*/
|
||||
lwz r5,CFG_TB_TO_XS(r9) /* load values */
|
||||
lwz r6,(CFG_TB_TO_XS+4)(r9)
|
||||
mulhwu r3,r7,r6
|
||||
mullw r10,r7,r5
|
||||
mulhwu r4,r7,r5
|
||||
addc r10,r3,r10
|
||||
mulhwu r4,r4,r5
|
||||
li r3,0
|
||||
|
||||
beq+ 4f /* skip high part computation if 0 */
|
||||
mulhwu r3,r0,r5
|
||||
mullw r7,r0,r5
|
||||
mulhwu r5,r0,r6
|
||||
mullw r6,r0,r6
|
||||
adde r4,r4,r7
|
||||
addze r3,r3
|
||||
mullw r5,r0,r5
|
||||
addc r4,r4,r5
|
||||
addze r3,r3
|
||||
addc r10,r10,r6
|
||||
|
||||
4: addze r4,r4 /* add in carry */
|
||||
lis r7,NSEC_PER_SEC@h
|
||||
ori r7,r7,NSEC_PER_SEC@l
|
||||
mulhwu r4,r4,r7 /* convert to nanoseconds */
|
||||
|
||||
/* At this point, we have seconds & nanoseconds since the xtime
|
||||
* stamp in r3+CA and r4. Load & add the xtime stamp.
|
||||
4:
|
||||
/* At this point, we have seconds since the xtime stamp
|
||||
* as a 32.32 fixed-point number in r3 and r4.
|
||||
* Load & add the xtime stamp.
|
||||
*/
|
||||
#ifdef CONFIG_PPC64
|
||||
lwz r5,STAMP_XTIME+TSPC64_TV_SEC+LOPART(r9)
|
||||
lwz r6,STAMP_XTIME+TSPC64_TV_NSEC+LOPART(r9)
|
||||
#else
|
||||
lwz r5,STAMP_XTIME+TSPC32_TV_SEC(r9)
|
||||
lwz r6,STAMP_XTIME+TSPC32_TV_NSEC(r9)
|
||||
#endif
|
||||
add r4,r4,r6
|
||||
lwz r5,STAMP_XTIME+TSPEC_TV_SEC(r9)
|
||||
lwz r6,STAMP_SEC_FRAC(r9)
|
||||
addc r4,r4,r6
|
||||
adde r3,r3,r5
|
||||
|
||||
/* We now have our result in r3,r4. We create a fake dependency
|
||||
* on that result and re-check the counter
|
||||
/* We create a fake dependency on the result in r3/r4
|
||||
* and re-check the counter
|
||||
*/
|
||||
or r6,r4,r3
|
||||
xor r0,r6,r6
|
||||
add r9,r9,r0
|
||||
lwz r0,(CFG_TB_UPDATE_COUNT+LOPART)(r9)
|
||||
cmpl cr0,r8,r0 /* check if updated */
|
||||
cmplw cr0,r8,r0 /* check if updated */
|
||||
bne- 1b
|
||||
|
||||
/* check for nanosecond overflow and adjust if necessary */
|
||||
cmpw r4,r7
|
||||
bltlr /* all done if no overflow */
|
||||
subf r4,r7,r4 /* adjust if overflow */
|
||||
addi r3,r3,1
|
||||
mulhwu r4,r4,r7 /* convert to micro or nanoseconds */
|
||||
|
||||
blr
|
||||
.cfi_endproc
|
||||
|
@ -33,18 +33,11 @@ V_FUNCTION_BEGIN(__kernel_gettimeofday)
|
||||
bl V_LOCAL_FUNC(__get_datapage) /* get data page */
|
||||
cmpldi r11,0 /* check if tv is NULL */
|
||||
beq 2f
|
||||
bl V_LOCAL_FUNC(__do_get_xsec) /* get xsec from tb & kernel */
|
||||
lis r7,15 /* r7 = 1000000 = USEC_PER_SEC */
|
||||
ori r7,r7,16960
|
||||
rldicl r5,r4,44,20 /* r5 = sec = xsec / XSEC_PER_SEC */
|
||||
rldicr r6,r5,20,43 /* r6 = sec * XSEC_PER_SEC */
|
||||
std r5,TVAL64_TV_SEC(r11) /* store sec in tv */
|
||||
subf r0,r6,r4 /* r0 = xsec = (xsec - r6) */
|
||||
mulld r0,r0,r7 /* usec = (xsec * USEC_PER_SEC) /
|
||||
* XSEC_PER_SEC
|
||||
*/
|
||||
rldicl r0,r0,44,20
|
||||
std r0,TVAL64_TV_USEC(r11) /* store usec in tv */
|
||||
lis r7,1000000@ha /* load up USEC_PER_SEC */
|
||||
addi r7,r7,1000000@l
|
||||
bl V_LOCAL_FUNC(__do_get_tspec) /* get sec/us from tb & kernel */
|
||||
std r4,TVAL64_TV_SEC(r11) /* store sec in tv */
|
||||
std r5,TVAL64_TV_USEC(r11) /* store usec in tv */
|
||||
2: cmpldi r10,0 /* check if tz is NULL */
|
||||
beq 1f
|
||||
lwz r4,CFG_TZ_MINUTEWEST(r3)/* fill tz */
|
||||
@ -77,6 +70,8 @@ V_FUNCTION_BEGIN(__kernel_clock_gettime)
|
||||
.cfi_register lr,r12
|
||||
mr r11,r4 /* r11 saves tp */
|
||||
bl V_LOCAL_FUNC(__get_datapage) /* get data page */
|
||||
lis r7,NSEC_PER_SEC@h /* want nanoseconds */
|
||||
ori r7,r7,NSEC_PER_SEC@l
|
||||
50: bl V_LOCAL_FUNC(__do_get_tspec) /* get time from tb & kernel */
|
||||
bne cr1,80f /* if not monotonic, all done */
|
||||
|
||||
@ -171,49 +166,12 @@ V_FUNCTION_END(__kernel_clock_getres)
|
||||
|
||||
|
||||
/*
|
||||
* This is the core of gettimeofday(), it returns the xsec
|
||||
* value in r4 and expects the datapage ptr (non clobbered)
|
||||
* in r3. clobbers r0,r4,r5,r6,r7,r8
|
||||
* When returning, r8 contains the counter value that can be reused
|
||||
*/
|
||||
V_FUNCTION_BEGIN(__do_get_xsec)
|
||||
.cfi_startproc
|
||||
/* check for update count & load values */
|
||||
1: ld r8,CFG_TB_UPDATE_COUNT(r3)
|
||||
andi. r0,r8,1 /* pending update ? loop */
|
||||
bne- 1b
|
||||
xor r0,r8,r8 /* create dependency */
|
||||
add r3,r3,r0
|
||||
|
||||
/* Get TB & offset it. We use the MFTB macro which will generate
|
||||
* workaround code for Cell.
|
||||
*/
|
||||
MFTB(r7)
|
||||
ld r9,CFG_TB_ORIG_STAMP(r3)
|
||||
subf r7,r9,r7
|
||||
|
||||
/* Scale result */
|
||||
ld r5,CFG_TB_TO_XS(r3)
|
||||
mulhdu r7,r7,r5
|
||||
|
||||
/* Add stamp since epoch */
|
||||
ld r6,CFG_STAMP_XSEC(r3)
|
||||
add r4,r6,r7
|
||||
|
||||
xor r0,r4,r4
|
||||
add r3,r3,r0
|
||||
ld r0,CFG_TB_UPDATE_COUNT(r3)
|
||||
cmpld cr0,r0,r8 /* check if updated */
|
||||
bne- 1b
|
||||
blr
|
||||
.cfi_endproc
|
||||
V_FUNCTION_END(__do_get_xsec)
|
||||
|
||||
/*
|
||||
* This is the core of clock_gettime(), it returns the current
|
||||
* time in seconds and nanoseconds in r4 and r5.
|
||||
* This is the core of clock_gettime() and gettimeofday(),
|
||||
* it returns the current time in r4 (seconds) and r5.
|
||||
* On entry, r7 gives the resolution of r5, either USEC_PER_SEC
|
||||
* or NSEC_PER_SEC, giving r5 in microseconds or nanoseconds.
|
||||
* It expects the datapage ptr in r3 and doesn't clobber it.
|
||||
* It clobbers r0 and r6 and returns NSEC_PER_SEC in r7.
|
||||
* It clobbers r0, r6 and r9.
|
||||
* On return, r8 contains the counter value that can be reused.
|
||||
* This clobbers cr0 but not any other cr field.
|
||||
*/
|
||||
@ -229,18 +187,18 @@ V_FUNCTION_BEGIN(__do_get_tspec)
|
||||
/* Get TB & offset it. We use the MFTB macro which will generate
|
||||
* workaround code for Cell.
|
||||
*/
|
||||
MFTB(r7)
|
||||
MFTB(r6)
|
||||
ld r9,CFG_TB_ORIG_STAMP(r3)
|
||||
subf r7,r9,r7
|
||||
subf r6,r9,r6
|
||||
|
||||
/* Scale result */
|
||||
ld r5,CFG_TB_TO_XS(r3)
|
||||
sldi r7,r7,12 /* compute time since stamp_xtime */
|
||||
mulhdu r6,r7,r5 /* in units of 2^-32 seconds */
|
||||
sldi r6,r6,12 /* compute time since stamp_xtime */
|
||||
mulhdu r6,r6,r5 /* in units of 2^-32 seconds */
|
||||
|
||||
/* Add stamp since epoch */
|
||||
ld r4,STAMP_XTIME+TSPC64_TV_SEC(r3)
|
||||
ld r5,STAMP_XTIME+TSPC64_TV_NSEC(r3)
|
||||
lwz r5,STAMP_SEC_FRAC(r3)
|
||||
or r0,r4,r5
|
||||
or r0,r0,r6
|
||||
xor r0,r0,r0
|
||||
@ -250,17 +208,11 @@ V_FUNCTION_BEGIN(__do_get_tspec)
|
||||
bne- 1b /* reload if so */
|
||||
|
||||
/* convert to seconds & nanoseconds and add to stamp */
|
||||
lis r7,NSEC_PER_SEC@h
|
||||
ori r7,r7,NSEC_PER_SEC@l
|
||||
mulhwu r0,r6,r7 /* compute nanoseconds and */
|
||||
add r6,r6,r5 /* add on fractional seconds of xtime */
|
||||
mulhwu r5,r6,r7 /* compute micro or nanoseconds and */
|
||||
srdi r6,r6,32 /* seconds since stamp_xtime */
|
||||
clrldi r0,r0,32
|
||||
add r5,r5,r0 /* add nanoseconds together */
|
||||
cmpd r5,r7 /* overflow? */
|
||||
clrldi r5,r5,32
|
||||
add r4,r4,r6
|
||||
bltlr /* all done if no overflow */
|
||||
subf r5,r7,r5 /* if overflow, adjust */
|
||||
addi r4,r4,1
|
||||
blr
|
||||
.cfi_endproc
|
||||
V_FUNCTION_END(__do_get_tspec)
|
||||
|
@ -182,7 +182,7 @@ static ssize_t kvmppc_exit_timing_write(struct file *file,
|
||||
}
|
||||
|
||||
if (c == 'c') {
|
||||
struct seq_file *seqf = (struct seq_file *)file->private_data;
|
||||
struct seq_file *seqf = file->private_data;
|
||||
struct kvm_vcpu *vcpu = seqf->private;
|
||||
/* Write does not affect our buffers previously generated with
|
||||
* show. seq_file is locked here to prevent races of init with
|
||||
|
@ -18,8 +18,9 @@ obj-$(CONFIG_HAS_IOMEM) += devres.o
|
||||
|
||||
obj-$(CONFIG_PPC64) += copypage_64.o copyuser_64.o \
|
||||
memcpy_64.o usercopy_64.o mem_64.o string.o
|
||||
obj-$(CONFIG_XMON) += sstep.o
|
||||
obj-$(CONFIG_KPROBES) += sstep.o
|
||||
obj-$(CONFIG_XMON) += sstep.o ldstfp.o
|
||||
obj-$(CONFIG_KPROBES) += sstep.o ldstfp.o
|
||||
obj-$(CONFIG_HAVE_HW_BREAKPOINT) += sstep.o ldstfp.o
|
||||
|
||||
ifeq ($(CONFIG_PPC64),y)
|
||||
obj-$(CONFIG_SMP) += locks.o
|
||||
|
375
arch/powerpc/lib/ldstfp.S
Normal file
375
arch/powerpc/lib/ldstfp.S
Normal file
@ -0,0 +1,375 @@
|
||||
/*
|
||||
* Floating-point, VMX/Altivec and VSX loads and stores
|
||||
* for use in instruction emulation.
|
||||
*
|
||||
* Copyright 2010 Paul Mackerras, IBM Corp. <paulus@au1.ibm.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#include <asm/processor.h>
|
||||
#include <asm/ppc_asm.h>
|
||||
#include <asm/ppc-opcode.h>
|
||||
#include <asm/reg.h>
|
||||
#include <asm/asm-offsets.h>
|
||||
#include <linux/errno.h>
|
||||
|
||||
#define STKFRM (PPC_MIN_STKFRM + 16)
|
||||
|
||||
.macro extab instr,handler
|
||||
.section __ex_table,"a"
|
||||
PPC_LONG \instr,\handler
|
||||
.previous
|
||||
.endm
|
||||
|
||||
.macro inst32 op
|
||||
reg = 0
|
||||
.rept 32
|
||||
20: \op reg,0,r4
|
||||
b 3f
|
||||
extab 20b,99f
|
||||
reg = reg + 1
|
||||
.endr
|
||||
.endm
|
||||
|
||||
/* Get the contents of frN into fr0; N is in r3. */
|
||||
_GLOBAL(get_fpr)
|
||||
mflr r0
|
||||
rlwinm r3,r3,3,0xf8
|
||||
bcl 20,31,1f
|
||||
blr /* fr0 is already in fr0 */
|
||||
nop
|
||||
reg = 1
|
||||
.rept 31
|
||||
fmr fr0,reg
|
||||
blr
|
||||
reg = reg + 1
|
||||
.endr
|
||||
1: mflr r5
|
||||
add r5,r3,r5
|
||||
mtctr r5
|
||||
mtlr r0
|
||||
bctr
|
||||
|
||||
/* Put the contents of fr0 into frN; N is in r3. */
|
||||
_GLOBAL(put_fpr)
|
||||
mflr r0
|
||||
rlwinm r3,r3,3,0xf8
|
||||
bcl 20,31,1f
|
||||
blr /* fr0 is already in fr0 */
|
||||
nop
|
||||
reg = 1
|
||||
.rept 31
|
||||
fmr reg,fr0
|
||||
blr
|
||||
reg = reg + 1
|
||||
.endr
|
||||
1: mflr r5
|
||||
add r5,r3,r5
|
||||
mtctr r5
|
||||
mtlr r0
|
||||
bctr
|
||||
|
||||
/* Load FP reg N from float at *p. N is in r3, p in r4. */
|
||||
_GLOBAL(do_lfs)
|
||||
PPC_STLU r1,-STKFRM(r1)
|
||||
mflr r0
|
||||
PPC_STL r0,STKFRM+PPC_LR_STKOFF(r1)
|
||||
mfmsr r6
|
||||
ori r7,r6,MSR_FP
|
||||
cmpwi cr7,r3,0
|
||||
mtmsrd r7
|
||||
isync
|
||||
beq cr7,1f
|
||||
stfd fr0,STKFRM-16(r1)
|
||||
1: li r9,-EFAULT
|
||||
2: lfs fr0,0(r4)
|
||||
li r9,0
|
||||
3: bl put_fpr
|
||||
beq cr7,4f
|
||||
lfd fr0,STKFRM-16(r1)
|
||||
4: PPC_LL r0,STKFRM+PPC_LR_STKOFF(r1)
|
||||
mtlr r0
|
||||
mtmsrd r6
|
||||
isync
|
||||
mr r3,r9
|
||||
addi r1,r1,STKFRM
|
||||
blr
|
||||
extab 2b,3b
|
||||
|
||||
/* Load FP reg N from double at *p. N is in r3, p in r4. */
|
||||
_GLOBAL(do_lfd)
|
||||
PPC_STLU r1,-STKFRM(r1)
|
||||
mflr r0
|
||||
PPC_STL r0,STKFRM+PPC_LR_STKOFF(r1)
|
||||
mfmsr r6
|
||||
ori r7,r6,MSR_FP
|
||||
cmpwi cr7,r3,0
|
||||
mtmsrd r7
|
||||
isync
|
||||
beq cr7,1f
|
||||
stfd fr0,STKFRM-16(r1)
|
||||
1: li r9,-EFAULT
|
||||
2: lfd fr0,0(r4)
|
||||
li r9,0
|
||||
3: beq cr7,4f
|
||||
bl put_fpr
|
||||
lfd fr0,STKFRM-16(r1)
|
||||
4: PPC_LL r0,STKFRM+PPC_LR_STKOFF(r1)
|
||||
mtlr r0
|
||||
mtmsrd r6
|
||||
isync
|
||||
mr r3,r9
|
||||
addi r1,r1,STKFRM
|
||||
blr
|
||||
extab 2b,3b
|
||||
|
||||
/* Store FP reg N to float at *p. N is in r3, p in r4. */
|
||||
_GLOBAL(do_stfs)
|
||||
PPC_STLU r1,-STKFRM(r1)
|
||||
mflr r0
|
||||
PPC_STL r0,STKFRM+PPC_LR_STKOFF(r1)
|
||||
mfmsr r6
|
||||
ori r7,r6,MSR_FP
|
||||
cmpwi cr7,r3,0
|
||||
mtmsrd r7
|
||||
isync
|
||||
beq cr7,1f
|
||||
stfd fr0,STKFRM-16(r1)
|
||||
bl get_fpr
|
||||
1: li r9,-EFAULT
|
||||
2: stfs fr0,0(r4)
|
||||
li r9,0
|
||||
3: beq cr7,4f
|
||||
lfd fr0,STKFRM-16(r1)
|
||||
4: PPC_LL r0,STKFRM+PPC_LR_STKOFF(r1)
|
||||
mtlr r0
|
||||
mtmsrd r6
|
||||
isync
|
||||
mr r3,r9
|
||||
addi r1,r1,STKFRM
|
||||
blr
|
||||
extab 2b,3b
|
||||
|
||||
/* Store FP reg N to double at *p. N is in r3, p in r4. */
|
||||
_GLOBAL(do_stfd)
|
||||
PPC_STLU r1,-STKFRM(r1)
|
||||
mflr r0
|
||||
PPC_STL r0,STKFRM+PPC_LR_STKOFF(r1)
|
||||
mfmsr r6
|
||||
ori r7,r6,MSR_FP
|
||||
cmpwi cr7,r3,0
|
||||
mtmsrd r7
|
||||
isync
|
||||
beq cr7,1f
|
||||
stfd fr0,STKFRM-16(r1)
|
||||
bl get_fpr
|
||||
1: li r9,-EFAULT
|
||||
2: stfd fr0,0(r4)
|
||||
li r9,0
|
||||
3: beq cr7,4f
|
||||
lfd fr0,STKFRM-16(r1)
|
||||
4: PPC_LL r0,STKFRM+PPC_LR_STKOFF(r1)
|
||||
mtlr r0
|
||||
mtmsrd r6
|
||||
isync
|
||||
mr r3,r9
|
||||
addi r1,r1,STKFRM
|
||||
blr
|
||||
extab 2b,3b
|
||||
|
||||
#ifdef CONFIG_ALTIVEC
|
||||
/* Get the contents of vrN into vr0; N is in r3. */
|
||||
_GLOBAL(get_vr)
|
||||
mflr r0
|
||||
rlwinm r3,r3,3,0xf8
|
||||
bcl 20,31,1f
|
||||
blr /* vr0 is already in vr0 */
|
||||
nop
|
||||
reg = 1
|
||||
.rept 31
|
||||
vor vr0,reg,reg /* assembler doesn't know vmr? */
|
||||
blr
|
||||
reg = reg + 1
|
||||
.endr
|
||||
1: mflr r5
|
||||
add r5,r3,r5
|
||||
mtctr r5
|
||||
mtlr r0
|
||||
bctr
|
||||
|
||||
/* Put the contents of vr0 into vrN; N is in r3. */
|
||||
_GLOBAL(put_vr)
|
||||
mflr r0
|
||||
rlwinm r3,r3,3,0xf8
|
||||
bcl 20,31,1f
|
||||
blr /* vr0 is already in vr0 */
|
||||
nop
|
||||
reg = 1
|
||||
.rept 31
|
||||
vor reg,vr0,vr0
|
||||
blr
|
||||
reg = reg + 1
|
||||
.endr
|
||||
1: mflr r5
|
||||
add r5,r3,r5
|
||||
mtctr r5
|
||||
mtlr r0
|
||||
bctr
|
||||
|
||||
/* Load vector reg N from *p. N is in r3, p in r4. */
|
||||
_GLOBAL(do_lvx)
|
||||
PPC_STLU r1,-STKFRM(r1)
|
||||
mflr r0
|
||||
PPC_STL r0,STKFRM+PPC_LR_STKOFF(r1)
|
||||
mfmsr r6
|
||||
oris r7,r6,MSR_VEC@h
|
||||
cmpwi cr7,r3,0
|
||||
li r8,STKFRM-16
|
||||
mtmsrd r7
|
||||
isync
|
||||
beq cr7,1f
|
||||
stvx vr0,r1,r8
|
||||
1: li r9,-EFAULT
|
||||
2: lvx vr0,0,r4
|
||||
li r9,0
|
||||
3: beq cr7,4f
|
||||
bl put_vr
|
||||
lvx vr0,r1,r8
|
||||
4: PPC_LL r0,STKFRM+PPC_LR_STKOFF(r1)
|
||||
mtlr r0
|
||||
mtmsrd r6
|
||||
isync
|
||||
mr r3,r9
|
||||
addi r1,r1,STKFRM
|
||||
blr
|
||||
extab 2b,3b
|
||||
|
||||
/* Store vector reg N to *p. N is in r3, p in r4. */
|
||||
_GLOBAL(do_stvx)
|
||||
PPC_STLU r1,-STKFRM(r1)
|
||||
mflr r0
|
||||
PPC_STL r0,STKFRM+PPC_LR_STKOFF(r1)
|
||||
mfmsr r6
|
||||
oris r7,r6,MSR_VEC@h
|
||||
cmpwi cr7,r3,0
|
||||
li r8,STKFRM-16
|
||||
mtmsrd r7
|
||||
isync
|
||||
beq cr7,1f
|
||||
stvx vr0,r1,r8
|
||||
bl get_vr
|
||||
1: li r9,-EFAULT
|
||||
2: stvx vr0,0,r4
|
||||
li r9,0
|
||||
3: beq cr7,4f
|
||||
lvx vr0,r1,r8
|
||||
4: PPC_LL r0,STKFRM+PPC_LR_STKOFF(r1)
|
||||
mtlr r0
|
||||
mtmsrd r6
|
||||
isync
|
||||
mr r3,r9
|
||||
addi r1,r1,STKFRM
|
||||
blr
|
||||
extab 2b,3b
|
||||
#endif /* CONFIG_ALTIVEC */
|
||||
|
||||
#ifdef CONFIG_VSX
|
||||
/* Get the contents of vsrN into vsr0; N is in r3. */
|
||||
_GLOBAL(get_vsr)
|
||||
mflr r0
|
||||
rlwinm r3,r3,3,0x1f8
|
||||
bcl 20,31,1f
|
||||
blr /* vsr0 is already in vsr0 */
|
||||
nop
|
||||
reg = 1
|
||||
.rept 63
|
||||
XXLOR(0,reg,reg)
|
||||
blr
|
||||
reg = reg + 1
|
||||
.endr
|
||||
1: mflr r5
|
||||
add r5,r3,r5
|
||||
mtctr r5
|
||||
mtlr r0
|
||||
bctr
|
||||
|
||||
/* Put the contents of vsr0 into vsrN; N is in r3. */
|
||||
_GLOBAL(put_vsr)
|
||||
mflr r0
|
||||
rlwinm r3,r3,3,0x1f8
|
||||
bcl 20,31,1f
|
||||
blr /* vr0 is already in vr0 */
|
||||
nop
|
||||
reg = 1
|
||||
.rept 63
|
||||
XXLOR(reg,0,0)
|
||||
blr
|
||||
reg = reg + 1
|
||||
.endr
|
||||
1: mflr r5
|
||||
add r5,r3,r5
|
||||
mtctr r5
|
||||
mtlr r0
|
||||
bctr
|
||||
|
||||
/* Load VSX reg N from vector doubleword *p. N is in r3, p in r4. */
|
||||
_GLOBAL(do_lxvd2x)
|
||||
PPC_STLU r1,-STKFRM(r1)
|
||||
mflr r0
|
||||
PPC_STL r0,STKFRM+PPC_LR_STKOFF(r1)
|
||||
mfmsr r6
|
||||
oris r7,r6,MSR_VSX@h
|
||||
cmpwi cr7,r3,0
|
||||
li r8,STKFRM-16
|
||||
mtmsrd r7
|
||||
isync
|
||||
beq cr7,1f
|
||||
STXVD2X(0,r1,r8)
|
||||
1: li r9,-EFAULT
|
||||
2: LXVD2X(0,0,r4)
|
||||
li r9,0
|
||||
3: beq cr7,4f
|
||||
bl put_vsr
|
||||
LXVD2X(0,r1,r8)
|
||||
4: PPC_LL r0,STKFRM+PPC_LR_STKOFF(r1)
|
||||
mtlr r0
|
||||
mtmsrd r6
|
||||
isync
|
||||
mr r3,r9
|
||||
addi r1,r1,STKFRM
|
||||
blr
|
||||
extab 2b,3b
|
||||
|
||||
/* Store VSX reg N to vector doubleword *p. N is in r3, p in r4. */
|
||||
_GLOBAL(do_stxvd2x)
|
||||
PPC_STLU r1,-STKFRM(r1)
|
||||
mflr r0
|
||||
PPC_STL r0,STKFRM+PPC_LR_STKOFF(r1)
|
||||
mfmsr r6
|
||||
oris r7,r6,MSR_VSX@h
|
||||
cmpwi cr7,r3,0
|
||||
li r8,STKFRM-16
|
||||
mtmsrd r7
|
||||
isync
|
||||
beq cr7,1f
|
||||
STXVD2X(0,r1,r8)
|
||||
bl get_vsr
|
||||
1: li r9,-EFAULT
|
||||
2: STXVD2X(0,0,r4)
|
||||
li r9,0
|
||||
3: beq cr7,4f
|
||||
LXVD2X(0,r1,r8)
|
||||
4: PPC_LL r0,STKFRM+PPC_LR_STKOFF(r1)
|
||||
mtlr r0
|
||||
mtmsrd r6
|
||||
isync
|
||||
mr r3,r9
|
||||
addi r1,r1,STKFRM
|
||||
blr
|
||||
extab 2b,3b
|
||||
|
||||
#endif /* CONFIG_VSX */
|
File diff suppressed because it is too large
Load Diff
@ -104,9 +104,10 @@ unsigned long p_mapped_by_tlbcam(phys_addr_t pa)
|
||||
}
|
||||
|
||||
/*
|
||||
* Set up one of the I/D BAT (block address translation) register pairs.
|
||||
* The parameters are not checked; in particular size must be a power
|
||||
* of 4 between 4k and 256M.
|
||||
* Set up a variable-size TLB entry (tlbcam). The parameters are not checked;
|
||||
* in particular size must be a power of 4 between 4k and 256M (or 1G, for cpus
|
||||
* that support extended page sizes). Note that while some cpus support a
|
||||
* page size of 4G, we don't allow its use here.
|
||||
*/
|
||||
static void settlbcam(int index, unsigned long virt, phys_addr_t phys,
|
||||
unsigned long size, unsigned long flags, unsigned int pid)
|
||||
|
@ -42,6 +42,12 @@ EXPORT_SYMBOL(node_data);
|
||||
|
||||
static int min_common_depth;
|
||||
static int n_mem_addr_cells, n_mem_size_cells;
|
||||
static int form1_affinity;
|
||||
|
||||
#define MAX_DISTANCE_REF_POINTS 4
|
||||
static int distance_ref_points_depth;
|
||||
static const unsigned int *distance_ref_points;
|
||||
static int distance_lookup_table[MAX_NUMNODES][MAX_DISTANCE_REF_POINTS];
|
||||
|
||||
/*
|
||||
* Allocate node_to_cpumask_map based on number of available nodes
|
||||
@ -204,6 +210,39 @@ static const u32 *of_get_usable_memory(struct device_node *memory)
|
||||
return prop;
|
||||
}
|
||||
|
||||
int __node_distance(int a, int b)
|
||||
{
|
||||
int i;
|
||||
int distance = LOCAL_DISTANCE;
|
||||
|
||||
if (!form1_affinity)
|
||||
return distance;
|
||||
|
||||
for (i = 0; i < distance_ref_points_depth; i++) {
|
||||
if (distance_lookup_table[a][i] == distance_lookup_table[b][i])
|
||||
break;
|
||||
|
||||
/* Double the distance for each NUMA level */
|
||||
distance *= 2;
|
||||
}
|
||||
|
||||
return distance;
|
||||
}
|
||||
|
||||
static void initialize_distance_lookup_table(int nid,
|
||||
const unsigned int *associativity)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!form1_affinity)
|
||||
return;
|
||||
|
||||
for (i = 0; i < distance_ref_points_depth; i++) {
|
||||
distance_lookup_table[nid][i] =
|
||||
associativity[distance_ref_points[i]];
|
||||
}
|
||||
}
|
||||
|
||||
/* Returns nid in the range [0..MAX_NUMNODES-1], or -1 if no useful numa
|
||||
* info is found.
|
||||
*/
|
||||
@ -225,6 +264,10 @@ static int of_node_to_nid_single(struct device_node *device)
|
||||
/* POWER4 LPAR uses 0xffff as invalid node */
|
||||
if (nid == 0xffff || nid >= MAX_NUMNODES)
|
||||
nid = -1;
|
||||
|
||||
if (nid > 0 && tmp[0] >= distance_ref_points_depth)
|
||||
initialize_distance_lookup_table(nid, tmp);
|
||||
|
||||
out:
|
||||
return nid;
|
||||
}
|
||||
@ -251,26 +294,10 @@ int of_node_to_nid(struct device_node *device)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(of_node_to_nid);
|
||||
|
||||
/*
|
||||
* In theory, the "ibm,associativity" property may contain multiple
|
||||
* associativity lists because a resource may be multiply connected
|
||||
* into the machine. This resource then has different associativity
|
||||
* characteristics relative to its multiple connections. We ignore
|
||||
* this for now. We also assume that all cpu and memory sets have
|
||||
* their distances represented at a common level. This won't be
|
||||
* true for hierarchical NUMA.
|
||||
*
|
||||
* In any case the ibm,associativity-reference-points should give
|
||||
* the correct depth for a normal NUMA system.
|
||||
*
|
||||
* - Dave Hansen <haveblue@us.ibm.com>
|
||||
*/
|
||||
static int __init find_min_common_depth(void)
|
||||
{
|
||||
int depth, index;
|
||||
const unsigned int *ref_points;
|
||||
int depth;
|
||||
struct device_node *rtas_root;
|
||||
unsigned int len;
|
||||
struct device_node *chosen;
|
||||
const char *vec5;
|
||||
|
||||
@ -280,18 +307,28 @@ static int __init find_min_common_depth(void)
|
||||
return -1;
|
||||
|
||||
/*
|
||||
* this property is 2 32-bit integers, each representing a level of
|
||||
* depth in the associativity nodes. The first is for an SMP
|
||||
* configuration (should be all 0's) and the second is for a normal
|
||||
* NUMA configuration.
|
||||
* This property is a set of 32-bit integers, each representing
|
||||
* an index into the ibm,associativity nodes.
|
||||
*
|
||||
* With form 0 affinity the first integer is for an SMP configuration
|
||||
* (should be all 0's) and the second is for a normal NUMA
|
||||
* configuration. We have only one level of NUMA.
|
||||
*
|
||||
* With form 1 affinity the first integer is the most significant
|
||||
* NUMA boundary and the following are progressively less significant
|
||||
* boundaries. There can be more than one level of NUMA.
|
||||
*/
|
||||
index = 1;
|
||||
ref_points = of_get_property(rtas_root,
|
||||
"ibm,associativity-reference-points", &len);
|
||||
distance_ref_points = of_get_property(rtas_root,
|
||||
"ibm,associativity-reference-points",
|
||||
&distance_ref_points_depth);
|
||||
|
||||
if (!distance_ref_points) {
|
||||
dbg("NUMA: ibm,associativity-reference-points not found.\n");
|
||||
goto err;
|
||||
}
|
||||
|
||||
distance_ref_points_depth /= sizeof(int);
|
||||
|
||||
/*
|
||||
* For form 1 affinity information we want the first field
|
||||
*/
|
||||
#define VEC5_AFFINITY_BYTE 5
|
||||
#define VEC5_AFFINITY 0x80
|
||||
chosen = of_find_node_by_path("/chosen");
|
||||
@ -299,19 +336,38 @@ static int __init find_min_common_depth(void)
|
||||
vec5 = of_get_property(chosen, "ibm,architecture-vec-5", NULL);
|
||||
if (vec5 && (vec5[VEC5_AFFINITY_BYTE] & VEC5_AFFINITY)) {
|
||||
dbg("Using form 1 affinity\n");
|
||||
index = 0;
|
||||
form1_affinity = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if ((len >= 2 * sizeof(unsigned int)) && ref_points) {
|
||||
depth = ref_points[index];
|
||||
if (form1_affinity) {
|
||||
depth = distance_ref_points[0];
|
||||
} else {
|
||||
dbg("NUMA: ibm,associativity-reference-points not found.\n");
|
||||
depth = -1;
|
||||
}
|
||||
of_node_put(rtas_root);
|
||||
if (distance_ref_points_depth < 2) {
|
||||
printk(KERN_WARNING "NUMA: "
|
||||
"short ibm,associativity-reference-points\n");
|
||||
goto err;
|
||||
}
|
||||
|
||||
depth = distance_ref_points[1];
|
||||
}
|
||||
|
||||
/*
|
||||
* Warn and cap if the hardware supports more than
|
||||
* MAX_DISTANCE_REF_POINTS domains.
|
||||
*/
|
||||
if (distance_ref_points_depth > MAX_DISTANCE_REF_POINTS) {
|
||||
printk(KERN_WARNING "NUMA: distance array capped at "
|
||||
"%d entries\n", MAX_DISTANCE_REF_POINTS);
|
||||
distance_ref_points_depth = MAX_DISTANCE_REF_POINTS;
|
||||
}
|
||||
|
||||
of_node_put(rtas_root);
|
||||
return depth;
|
||||
|
||||
err:
|
||||
of_node_put(rtas_root);
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void __init get_n_mem_cells(int *n_addr_cells, int *n_size_cells)
|
||||
|
@ -92,7 +92,6 @@ static void pte_free_rcu_callback(struct rcu_head *head)
|
||||
|
||||
static void pte_free_submit(struct pte_freelist_batch *batch)
|
||||
{
|
||||
INIT_RCU_HEAD(&batch->rcu);
|
||||
call_rcu(&batch->rcu, pte_free_rcu_callback);
|
||||
}
|
||||
|
||||
|
@ -89,17 +89,6 @@ void tlb_flush(struct mmu_gather *tlb)
|
||||
* -- Cort
|
||||
*/
|
||||
|
||||
/*
|
||||
* 750 SMP is a Bad Idea because the 750 doesn't broadcast all
|
||||
* the cache operations on the bus. Hence we need to use an IPI
|
||||
* to get the other CPU(s) to invalidate their TLBs.
|
||||
*/
|
||||
#ifdef CONFIG_SMP_750
|
||||
#define FINISH_FLUSH smp_send_tlb_invalidate(0)
|
||||
#else
|
||||
#define FINISH_FLUSH do { } while (0)
|
||||
#endif
|
||||
|
||||
static void flush_range(struct mm_struct *mm, unsigned long start,
|
||||
unsigned long end)
|
||||
{
|
||||
@ -138,7 +127,6 @@ static void flush_range(struct mm_struct *mm, unsigned long start,
|
||||
void flush_tlb_kernel_range(unsigned long start, unsigned long end)
|
||||
{
|
||||
flush_range(&init_mm, start, end);
|
||||
FINISH_FLUSH;
|
||||
}
|
||||
EXPORT_SYMBOL(flush_tlb_kernel_range);
|
||||
|
||||
@ -162,7 +150,6 @@ void flush_tlb_mm(struct mm_struct *mm)
|
||||
*/
|
||||
for (mp = mm->mmap; mp != NULL; mp = mp->vm_next)
|
||||
flush_range(mp->vm_mm, mp->vm_start, mp->vm_end);
|
||||
FINISH_FLUSH;
|
||||
}
|
||||
EXPORT_SYMBOL(flush_tlb_mm);
|
||||
|
||||
@ -179,7 +166,6 @@ void flush_tlb_page(struct vm_area_struct *vma, unsigned long vmaddr)
|
||||
pmd = pmd_offset(pud_offset(pgd_offset(mm, vmaddr), vmaddr), vmaddr);
|
||||
if (!pmd_none(*pmd))
|
||||
flush_hash_pages(mm->context.id, vmaddr, pmd_val(*pmd), 1);
|
||||
FINISH_FLUSH;
|
||||
}
|
||||
EXPORT_SYMBOL(flush_tlb_page);
|
||||
|
||||
@ -192,6 +178,5 @@ void flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
|
||||
unsigned long end)
|
||||
{
|
||||
flush_range(vma->vm_mm, start, end);
|
||||
FINISH_FLUSH;
|
||||
}
|
||||
EXPORT_SYMBOL(flush_tlb_range);
|
||||
|
@ -46,6 +46,7 @@
|
||||
struct mmu_psize_def mmu_psize_defs[MMU_PAGE_COUNT] = {
|
||||
[MMU_PAGE_4K] = {
|
||||
.shift = 12,
|
||||
.ind = 20,
|
||||
.enc = BOOK3E_PAGESZ_4K,
|
||||
},
|
||||
[MMU_PAGE_16K] = {
|
||||
@ -54,6 +55,7 @@ struct mmu_psize_def mmu_psize_defs[MMU_PAGE_COUNT] = {
|
||||
},
|
||||
[MMU_PAGE_64K] = {
|
||||
.shift = 16,
|
||||
.ind = 28,
|
||||
.enc = BOOK3E_PAGESZ_64K,
|
||||
},
|
||||
[MMU_PAGE_1M] = {
|
||||
@ -62,6 +64,7 @@ struct mmu_psize_def mmu_psize_defs[MMU_PAGE_COUNT] = {
|
||||
},
|
||||
[MMU_PAGE_16M] = {
|
||||
.shift = 24,
|
||||
.ind = 36,
|
||||
.enc = BOOK3E_PAGESZ_16M,
|
||||
},
|
||||
[MMU_PAGE_256M] = {
|
||||
@ -344,16 +347,108 @@ void tlb_flush_pgtable(struct mmu_gather *tlb, unsigned long address)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Early initialization of the MMU TLB code
|
||||
*/
|
||||
static void __early_init_mmu(int boot_cpu)
|
||||
static void setup_page_sizes(void)
|
||||
{
|
||||
unsigned int tlb0cfg = mfspr(SPRN_TLB0CFG);
|
||||
unsigned int tlb0ps = mfspr(SPRN_TLB0PS);
|
||||
unsigned int eptcfg = mfspr(SPRN_EPTCFG);
|
||||
int i, psize;
|
||||
|
||||
/* Look for supported direct sizes */
|
||||
for (psize = 0; psize < MMU_PAGE_COUNT; ++psize) {
|
||||
struct mmu_psize_def *def = &mmu_psize_defs[psize];
|
||||
|
||||
if (tlb0ps & (1U << (def->shift - 10)))
|
||||
def->flags |= MMU_PAGE_SIZE_DIRECT;
|
||||
}
|
||||
|
||||
/* Indirect page sizes supported ? */
|
||||
if ((tlb0cfg & TLBnCFG_IND) == 0)
|
||||
goto no_indirect;
|
||||
|
||||
/* Now, we only deal with one IND page size for each
|
||||
* direct size. Hopefully all implementations today are
|
||||
* unambiguous, but we might want to be careful in the
|
||||
* future.
|
||||
*/
|
||||
for (i = 0; i < 3; i++) {
|
||||
unsigned int ps, sps;
|
||||
|
||||
sps = eptcfg & 0x1f;
|
||||
eptcfg >>= 5;
|
||||
ps = eptcfg & 0x1f;
|
||||
eptcfg >>= 5;
|
||||
if (!ps || !sps)
|
||||
continue;
|
||||
for (psize = 0; psize < MMU_PAGE_COUNT; psize++) {
|
||||
struct mmu_psize_def *def = &mmu_psize_defs[psize];
|
||||
|
||||
if (ps == (def->shift - 10))
|
||||
def->flags |= MMU_PAGE_SIZE_INDIRECT;
|
||||
if (sps == (def->shift - 10))
|
||||
def->ind = ps + 10;
|
||||
}
|
||||
}
|
||||
no_indirect:
|
||||
|
||||
/* Cleanup array and print summary */
|
||||
pr_info("MMU: Supported page sizes\n");
|
||||
for (psize = 0; psize < MMU_PAGE_COUNT; ++psize) {
|
||||
struct mmu_psize_def *def = &mmu_psize_defs[psize];
|
||||
const char *__page_type_names[] = {
|
||||
"unsupported",
|
||||
"direct",
|
||||
"indirect",
|
||||
"direct & indirect"
|
||||
};
|
||||
if (def->flags == 0) {
|
||||
def->shift = 0;
|
||||
continue;
|
||||
}
|
||||
pr_info(" %8ld KB as %s\n", 1ul << (def->shift - 10),
|
||||
__page_type_names[def->flags & 0x3]);
|
||||
}
|
||||
}
|
||||
|
||||
static void setup_mmu_htw(void)
|
||||
{
|
||||
extern unsigned int interrupt_base_book3e;
|
||||
extern unsigned int exc_data_tlb_miss_htw_book3e;
|
||||
extern unsigned int exc_instruction_tlb_miss_htw_book3e;
|
||||
|
||||
unsigned int *ibase = &interrupt_base_book3e;
|
||||
|
||||
/* Check if HW tablewalk is present, and if yes, enable it by:
|
||||
*
|
||||
* - patching the TLB miss handlers to branch to the
|
||||
* one dedicates to it
|
||||
*
|
||||
* - setting the global book3e_htw_enabled
|
||||
*/
|
||||
unsigned int tlb0cfg = mfspr(SPRN_TLB0CFG);
|
||||
|
||||
if ((tlb0cfg & TLBnCFG_IND) &&
|
||||
(tlb0cfg & TLBnCFG_PT)) {
|
||||
/* Our exceptions vectors start with a NOP and -then- a branch
|
||||
* to deal with single stepping from userspace which stops on
|
||||
* the second instruction. Thus we need to patch the second
|
||||
* instruction of the exception, not the first one
|
||||
*/
|
||||
patch_branch(ibase + (0x1c0 / 4) + 1,
|
||||
(unsigned long)&exc_data_tlb_miss_htw_book3e, 0);
|
||||
patch_branch(ibase + (0x1e0 / 4) + 1,
|
||||
(unsigned long)&exc_instruction_tlb_miss_htw_book3e, 0);
|
||||
book3e_htw_enabled = 1;
|
||||
}
|
||||
pr_info("MMU: Book3E Page Tables %s\n",
|
||||
book3e_htw_enabled ? "Enabled" : "Disabled");
|
||||
}
|
||||
|
||||
/*
|
||||
* Early initialization of the MMU TLB code
|
||||
*/
|
||||
static void __early_init_mmu(int boot_cpu)
|
||||
{
|
||||
unsigned int mas4;
|
||||
|
||||
/* XXX This will have to be decided at runtime, but right
|
||||
@ -370,35 +465,17 @@ static void __early_init_mmu(int boot_cpu)
|
||||
*/
|
||||
mmu_vmemmap_psize = MMU_PAGE_16M;
|
||||
|
||||
/* Check if HW tablewalk is present, and if yes, enable it by:
|
||||
*
|
||||
* - patching the TLB miss handlers to branch to the
|
||||
* one dedicates to it
|
||||
*
|
||||
* - setting the global book3e_htw_enabled
|
||||
*
|
||||
* - Set MAS4:INDD and default page size
|
||||
*/
|
||||
|
||||
/* XXX This code only checks for TLB 0 capabilities and doesn't
|
||||
* check what page size combos are supported by the HW. It
|
||||
* also doesn't handle the case where a separate array holds
|
||||
* the IND entries from the array loaded by the PT.
|
||||
*/
|
||||
if (boot_cpu) {
|
||||
unsigned int tlb0cfg = mfspr(SPRN_TLB0CFG);
|
||||
/* Look for supported page sizes */
|
||||
setup_page_sizes();
|
||||
|
||||
/* Check if HW loader is supported */
|
||||
if ((tlb0cfg & TLBnCFG_IND) &&
|
||||
(tlb0cfg & TLBnCFG_PT)) {
|
||||
patch_branch(ibase + (0x1c0 / 4),
|
||||
(unsigned long)&exc_data_tlb_miss_htw_book3e, 0);
|
||||
patch_branch(ibase + (0x1e0 / 4),
|
||||
(unsigned long)&exc_instruction_tlb_miss_htw_book3e, 0);
|
||||
book3e_htw_enabled = 1;
|
||||
}
|
||||
pr_info("MMU: Book3E Page Tables %s\n",
|
||||
book3e_htw_enabled ? "Enabled" : "Disabled");
|
||||
/* Look for HW tablewalk support */
|
||||
setup_mmu_htw();
|
||||
}
|
||||
|
||||
/* Set MAS4 based on page table setting */
|
||||
|
@ -16,6 +16,6 @@ oprofile-y := $(DRIVER_OBJS) common.o backtrace.o
|
||||
oprofile-$(CONFIG_OPROFILE_CELL) += op_model_cell.o \
|
||||
cell/spu_profiler.o cell/vma_map.o \
|
||||
cell/spu_task_sync.o
|
||||
oprofile-$(CONFIG_PPC64) += op_model_rs64.o op_model_power4.o op_model_pa6t.o
|
||||
oprofile-$(CONFIG_PPC_BOOK3S_64) += op_model_rs64.o op_model_power4.o op_model_pa6t.o
|
||||
oprofile-$(CONFIG_FSL_EMB_PERFMON) += op_model_fsl_emb.o
|
||||
oprofile-$(CONFIG_6xx) += op_model_7450.o
|
||||
|
@ -199,7 +199,7 @@ int __init oprofile_arch_init(struct oprofile_operations *ops)
|
||||
return -ENODEV;
|
||||
|
||||
switch (cur_cpu_spec->oprofile_type) {
|
||||
#ifdef CONFIG_PPC64
|
||||
#ifdef CONFIG_PPC_BOOK3S_64
|
||||
#ifdef CONFIG_OPROFILE_CELL
|
||||
case PPC_OPROFILE_CELL:
|
||||
if (firmware_has_feature(FW_FEATURE_LPAR))
|
||||
|
@ -71,22 +71,6 @@ config MAKALU
|
||||
help
|
||||
This option enables support for the AMCC PPC405EX board.
|
||||
|
||||
#config REDWOOD_5
|
||||
# bool "Redwood-5"
|
||||
# depends on 40x
|
||||
# default n
|
||||
# select STB03xxx
|
||||
# help
|
||||
# This option enables support for the IBM STB04 evaluation board.
|
||||
|
||||
#config REDWOOD_6
|
||||
# bool "Redwood-6"
|
||||
# depends on 40x
|
||||
# default n
|
||||
# select STB03xxx
|
||||
# help
|
||||
# This option enables support for the IBM STBx25xx evaluation board.
|
||||
|
||||
#config SYCAMORE
|
||||
# bool "Sycamore"
|
||||
# depends on 40x
|
||||
|
@ -1,32 +1,34 @@
|
||||
config PPC_MPC512x
|
||||
bool
|
||||
bool "512x-based boards"
|
||||
depends on 6xx
|
||||
select FSL_SOC
|
||||
select IPIC
|
||||
select PPC_CLOCK
|
||||
select PPC_PCI_CHOICE
|
||||
select FSL_PCI if PCI
|
||||
|
||||
config PPC_MPC5121
|
||||
bool
|
||||
select PPC_MPC512x
|
||||
|
||||
config MPC5121_ADS
|
||||
bool "Freescale MPC5121E ADS"
|
||||
depends on 6xx
|
||||
depends on PPC_MPC512x
|
||||
select DEFAULT_UIMAGE
|
||||
select PPC_MPC5121
|
||||
select MPC5121_ADS_CPLD
|
||||
help
|
||||
This option enables support for the MPC5121E ADS board.
|
||||
|
||||
config MPC5121_GENERIC
|
||||
bool "Generic support for simple MPC5121 based boards"
|
||||
depends on 6xx
|
||||
depends on PPC_MPC512x
|
||||
select DEFAULT_UIMAGE
|
||||
select PPC_MPC5121
|
||||
help
|
||||
This option enables support for simple MPC5121 based boards
|
||||
which do not need custom platform specific setup.
|
||||
|
||||
Compatible boards include: Protonic LVT base boards (ZANMCU
|
||||
and VICVT2).
|
||||
|
||||
config PDM360NG
|
||||
bool "ifm PDM360NG board"
|
||||
depends on PPC_MPC512x
|
||||
select DEFAULT_UIMAGE
|
||||
help
|
||||
This option enables support for the PDM360NG board.
|
||||
|
@ -4,3 +4,4 @@
|
||||
obj-y += clock.o mpc512x_shared.o
|
||||
obj-$(CONFIG_MPC5121_ADS) += mpc5121_ads.o mpc5121_ads_cpld.o
|
||||
obj-$(CONFIG_MPC5121_GENERIC) += mpc5121_generic.o
|
||||
obj-$(CONFIG_PDM360NG) += pdm360ng.o
|
||||
|
@ -292,6 +292,15 @@ static void diu_clk_calc(struct clk *clk)
|
||||
clk->rate = rate;
|
||||
}
|
||||
|
||||
static void viu_clk_calc(struct clk *clk)
|
||||
{
|
||||
unsigned long rate;
|
||||
|
||||
rate = sys_clk.rate;
|
||||
rate /= 2;
|
||||
clk->rate = rate;
|
||||
}
|
||||
|
||||
static void half_clk_calc(struct clk *clk)
|
||||
{
|
||||
clk->rate = clk->parent->rate / 2;
|
||||
@ -412,6 +421,14 @@ static struct clk diu_clk = {
|
||||
.calc = diu_clk_calc,
|
||||
};
|
||||
|
||||
static struct clk viu_clk = {
|
||||
.name = "viu_clk",
|
||||
.flags = CLK_HAS_CTRL,
|
||||
.reg = 1,
|
||||
.bit = 18,
|
||||
.calc = viu_clk_calc,
|
||||
};
|
||||
|
||||
static struct clk axe_clk = {
|
||||
.name = "axe_clk",
|
||||
.flags = CLK_HAS_CTRL,
|
||||
@ -535,6 +552,7 @@ struct clk *rate_clks[] = {
|
||||
&ref_clk,
|
||||
&sys_clk,
|
||||
&diu_clk,
|
||||
&viu_clk,
|
||||
&csb_clk,
|
||||
&e300_clk,
|
||||
&ips_clk,
|
||||
|
@ -42,6 +42,7 @@ static void __init mpc5121_ads_setup_arch(void)
|
||||
for_each_compatible_node(np, "pci", "fsl,mpc5121-pci")
|
||||
mpc83xx_add_bridge(np);
|
||||
#endif
|
||||
mpc512x_setup_diu();
|
||||
}
|
||||
|
||||
static void __init mpc5121_ads_init_IRQ(void)
|
||||
@ -65,6 +66,7 @@ define_machine(mpc5121_ads) {
|
||||
.probe = mpc5121_ads_probe,
|
||||
.setup_arch = mpc5121_ads_setup_arch,
|
||||
.init = mpc512x_init,
|
||||
.init_early = mpc512x_init_diu,
|
||||
.init_IRQ = mpc5121_ads_init_IRQ,
|
||||
.get_irq = ipic_get_irq,
|
||||
.calibrate_decr = generic_calibrate_decr,
|
||||
|
@ -52,6 +52,8 @@ define_machine(mpc5121_generic) {
|
||||
.name = "MPC5121 generic",
|
||||
.probe = mpc5121_generic_probe,
|
||||
.init = mpc512x_init,
|
||||
.init_early = mpc512x_init_diu,
|
||||
.setup_arch = mpc512x_setup_diu,
|
||||
.init_IRQ = mpc512x_init_IRQ,
|
||||
.get_irq = ipic_get_irq,
|
||||
.calibrate_decr = generic_calibrate_decr,
|
||||
|
@ -16,4 +16,6 @@ extern void __init mpc512x_init(void);
|
||||
extern int __init mpc5121_clk_init(void);
|
||||
void __init mpc512x_declare_of_platform_devices(void);
|
||||
extern void mpc512x_restart(char *cmd);
|
||||
extern void mpc512x_init_diu(void);
|
||||
extern void mpc512x_setup_diu(void);
|
||||
#endif /* __MPC512X_H__ */
|
||||
|
@ -16,7 +16,11 @@
|
||||
#include <linux/io.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/fsl-diu-fb.h>
|
||||
#include <linux/bootmem.h>
|
||||
#include <sysdev/fsl_soc.h>
|
||||
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/ipic.h>
|
||||
#include <asm/prom.h>
|
||||
@ -54,6 +58,286 @@ void mpc512x_restart(char *cmd)
|
||||
;
|
||||
}
|
||||
|
||||
struct fsl_diu_shared_fb {
|
||||
u8 gamma[0x300]; /* 32-bit aligned! */
|
||||
struct diu_ad ad0; /* 32-bit aligned! */
|
||||
phys_addr_t fb_phys;
|
||||
size_t fb_len;
|
||||
bool in_use;
|
||||
};
|
||||
|
||||
unsigned int mpc512x_get_pixel_format(unsigned int bits_per_pixel,
|
||||
int monitor_port)
|
||||
{
|
||||
switch (bits_per_pixel) {
|
||||
case 32:
|
||||
return 0x88883316;
|
||||
case 24:
|
||||
return 0x88082219;
|
||||
case 16:
|
||||
return 0x65053118;
|
||||
}
|
||||
return 0x00000400;
|
||||
}
|
||||
|
||||
void mpc512x_set_gamma_table(int monitor_port, char *gamma_table_base)
|
||||
{
|
||||
}
|
||||
|
||||
void mpc512x_set_monitor_port(int monitor_port)
|
||||
{
|
||||
}
|
||||
|
||||
#define DIU_DIV_MASK 0x000000ff
|
||||
void mpc512x_set_pixel_clock(unsigned int pixclock)
|
||||
{
|
||||
unsigned long bestval, bestfreq, speed, busfreq;
|
||||
unsigned long minpixclock, maxpixclock, pixval;
|
||||
struct mpc512x_ccm __iomem *ccm;
|
||||
struct device_node *np;
|
||||
u32 temp;
|
||||
long err;
|
||||
int i;
|
||||
|
||||
np = of_find_compatible_node(NULL, NULL, "fsl,mpc5121-clock");
|
||||
if (!np) {
|
||||
pr_err("Can't find clock control module.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
ccm = of_iomap(np, 0);
|
||||
of_node_put(np);
|
||||
if (!ccm) {
|
||||
pr_err("Can't map clock control module reg.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
np = of_find_node_by_type(NULL, "cpu");
|
||||
if (np) {
|
||||
const unsigned int *prop =
|
||||
of_get_property(np, "bus-frequency", NULL);
|
||||
|
||||
of_node_put(np);
|
||||
if (prop) {
|
||||
busfreq = *prop;
|
||||
} else {
|
||||
pr_err("Can't get bus-frequency property\n");
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
pr_err("Can't find 'cpu' node.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* Pixel Clock configuration */
|
||||
pr_debug("DIU: Bus Frequency = %lu\n", busfreq);
|
||||
speed = busfreq * 4; /* DIU_DIV ratio is 4 * CSB_CLK / DIU_CLK */
|
||||
|
||||
/* Calculate the pixel clock with the smallest error */
|
||||
/* calculate the following in steps to avoid overflow */
|
||||
pr_debug("DIU pixclock in ps - %d\n", pixclock);
|
||||
temp = (1000000000 / pixclock) * 1000;
|
||||
pixclock = temp;
|
||||
pr_debug("DIU pixclock freq - %u\n", pixclock);
|
||||
|
||||
temp = temp / 20; /* pixclock * 0.05 */
|
||||
pr_debug("deviation = %d\n", temp);
|
||||
minpixclock = pixclock - temp;
|
||||
maxpixclock = pixclock + temp;
|
||||
pr_debug("DIU minpixclock - %lu\n", minpixclock);
|
||||
pr_debug("DIU maxpixclock - %lu\n", maxpixclock);
|
||||
pixval = speed/pixclock;
|
||||
pr_debug("DIU pixval = %lu\n", pixval);
|
||||
|
||||
err = LONG_MAX;
|
||||
bestval = pixval;
|
||||
pr_debug("DIU bestval = %lu\n", bestval);
|
||||
|
||||
bestfreq = 0;
|
||||
for (i = -1; i <= 1; i++) {
|
||||
temp = speed / (pixval+i);
|
||||
pr_debug("DIU test pixval i=%d, pixval=%lu, temp freq. = %u\n",
|
||||
i, pixval, temp);
|
||||
if ((temp < minpixclock) || (temp > maxpixclock))
|
||||
pr_debug("DIU exceeds monitor range (%lu to %lu)\n",
|
||||
minpixclock, maxpixclock);
|
||||
else if (abs(temp - pixclock) < err) {
|
||||
pr_debug("Entered the else if block %d\n", i);
|
||||
err = abs(temp - pixclock);
|
||||
bestval = pixval + i;
|
||||
bestfreq = temp;
|
||||
}
|
||||
}
|
||||
|
||||
pr_debug("DIU chose = %lx\n", bestval);
|
||||
pr_debug("DIU error = %ld\n NomPixClk ", err);
|
||||
pr_debug("DIU: Best Freq = %lx\n", bestfreq);
|
||||
/* Modify DIU_DIV in CCM SCFR1 */
|
||||
temp = in_be32(&ccm->scfr1);
|
||||
pr_debug("DIU: Current value of SCFR1: 0x%08x\n", temp);
|
||||
temp &= ~DIU_DIV_MASK;
|
||||
temp |= (bestval & DIU_DIV_MASK);
|
||||
out_be32(&ccm->scfr1, temp);
|
||||
pr_debug("DIU: Modified value of SCFR1: 0x%08x\n", temp);
|
||||
iounmap(ccm);
|
||||
}
|
||||
|
||||
ssize_t mpc512x_show_monitor_port(int monitor_port, char *buf)
|
||||
{
|
||||
return sprintf(buf, "0 - 5121 LCD\n");
|
||||
}
|
||||
|
||||
int mpc512x_set_sysfs_monitor_port(int val)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct fsl_diu_shared_fb __attribute__ ((__aligned__(8))) diu_shared_fb;
|
||||
|
||||
#if defined(CONFIG_FB_FSL_DIU) || \
|
||||
defined(CONFIG_FB_FSL_DIU_MODULE)
|
||||
static inline void mpc512x_free_bootmem(struct page *page)
|
||||
{
|
||||
__ClearPageReserved(page);
|
||||
BUG_ON(PageTail(page));
|
||||
BUG_ON(atomic_read(&page->_count) > 1);
|
||||
atomic_set(&page->_count, 1);
|
||||
__free_page(page);
|
||||
totalram_pages++;
|
||||
}
|
||||
|
||||
void mpc512x_release_bootmem(void)
|
||||
{
|
||||
unsigned long addr = diu_shared_fb.fb_phys & PAGE_MASK;
|
||||
unsigned long size = diu_shared_fb.fb_len;
|
||||
unsigned long start, end;
|
||||
|
||||
if (diu_shared_fb.in_use) {
|
||||
start = PFN_UP(addr);
|
||||
end = PFN_DOWN(addr + size);
|
||||
|
||||
for (; start < end; start++)
|
||||
mpc512x_free_bootmem(pfn_to_page(start));
|
||||
|
||||
diu_shared_fb.in_use = false;
|
||||
}
|
||||
diu_ops.release_bootmem = NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Check if DIU was pre-initialized. If so, perform steps
|
||||
* needed to continue displaying through the whole boot process.
|
||||
* Move area descriptor and gamma table elsewhere, they are
|
||||
* destroyed by bootmem allocator otherwise. The frame buffer
|
||||
* address range will be reserved in setup_arch() after bootmem
|
||||
* allocator is up.
|
||||
*/
|
||||
void __init mpc512x_init_diu(void)
|
||||
{
|
||||
struct device_node *np;
|
||||
struct diu __iomem *diu_reg;
|
||||
phys_addr_t desc;
|
||||
void __iomem *vaddr;
|
||||
unsigned long mode, pix_fmt, res, bpp;
|
||||
unsigned long dst;
|
||||
|
||||
np = of_find_compatible_node(NULL, NULL, "fsl,mpc5121-diu");
|
||||
if (!np) {
|
||||
pr_err("No DIU node\n");
|
||||
return;
|
||||
}
|
||||
|
||||
diu_reg = of_iomap(np, 0);
|
||||
of_node_put(np);
|
||||
if (!diu_reg) {
|
||||
pr_err("Can't map DIU\n");
|
||||
return;
|
||||
}
|
||||
|
||||
mode = in_be32(&diu_reg->diu_mode);
|
||||
if (mode != MFB_MODE1) {
|
||||
pr_info("%s: DIU OFF\n", __func__);
|
||||
goto out;
|
||||
}
|
||||
|
||||
desc = in_be32(&diu_reg->desc[0]);
|
||||
vaddr = ioremap(desc, sizeof(struct diu_ad));
|
||||
if (!vaddr) {
|
||||
pr_err("Can't map DIU area desc.\n");
|
||||
goto out;
|
||||
}
|
||||
memcpy(&diu_shared_fb.ad0, vaddr, sizeof(struct diu_ad));
|
||||
/* flush fb area descriptor */
|
||||
dst = (unsigned long)&diu_shared_fb.ad0;
|
||||
flush_dcache_range(dst, dst + sizeof(struct diu_ad) - 1);
|
||||
|
||||
res = in_be32(&diu_reg->disp_size);
|
||||
pix_fmt = in_le32(vaddr);
|
||||
bpp = ((pix_fmt >> 16) & 0x3) + 1;
|
||||
diu_shared_fb.fb_phys = in_le32(vaddr + 4);
|
||||
diu_shared_fb.fb_len = ((res & 0xfff0000) >> 16) * (res & 0xfff) * bpp;
|
||||
diu_shared_fb.in_use = true;
|
||||
iounmap(vaddr);
|
||||
|
||||
desc = in_be32(&diu_reg->gamma);
|
||||
vaddr = ioremap(desc, sizeof(diu_shared_fb.gamma));
|
||||
if (!vaddr) {
|
||||
pr_err("Can't map DIU area desc.\n");
|
||||
diu_shared_fb.in_use = false;
|
||||
goto out;
|
||||
}
|
||||
memcpy(&diu_shared_fb.gamma, vaddr, sizeof(diu_shared_fb.gamma));
|
||||
/* flush gamma table */
|
||||
dst = (unsigned long)&diu_shared_fb.gamma;
|
||||
flush_dcache_range(dst, dst + sizeof(diu_shared_fb.gamma) - 1);
|
||||
|
||||
iounmap(vaddr);
|
||||
out_be32(&diu_reg->gamma, virt_to_phys(&diu_shared_fb.gamma));
|
||||
out_be32(&diu_reg->desc[1], 0);
|
||||
out_be32(&diu_reg->desc[2], 0);
|
||||
out_be32(&diu_reg->desc[0], virt_to_phys(&diu_shared_fb.ad0));
|
||||
|
||||
out:
|
||||
iounmap(diu_reg);
|
||||
}
|
||||
|
||||
void __init mpc512x_setup_diu(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* We do not allocate and configure new area for bitmap buffer
|
||||
* because it would requere copying bitmap data (splash image)
|
||||
* and so negatively affect boot time. Instead we reserve the
|
||||
* already configured frame buffer area so that it won't be
|
||||
* destroyed. The starting address of the area to reserve and
|
||||
* also it's length is passed to reserve_bootmem(). It will be
|
||||
* freed later on first open of fbdev, when splash image is not
|
||||
* needed any more.
|
||||
*/
|
||||
if (diu_shared_fb.in_use) {
|
||||
ret = reserve_bootmem(diu_shared_fb.fb_phys,
|
||||
diu_shared_fb.fb_len,
|
||||
BOOTMEM_EXCLUSIVE);
|
||||
if (ret) {
|
||||
pr_err("%s: reserve bootmem failed\n", __func__);
|
||||
diu_shared_fb.in_use = false;
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(CONFIG_FB_FSL_DIU) || \
|
||||
defined(CONFIG_FB_FSL_DIU_MODULE)
|
||||
diu_ops.get_pixel_format = mpc512x_get_pixel_format;
|
||||
diu_ops.set_gamma_table = mpc512x_set_gamma_table;
|
||||
diu_ops.set_monitor_port = mpc512x_set_monitor_port;
|
||||
diu_ops.set_pixel_clock = mpc512x_set_pixel_clock;
|
||||
diu_ops.show_monitor_port = mpc512x_show_monitor_port;
|
||||
diu_ops.set_sysfs_monitor_port = mpc512x_set_sysfs_monitor_port;
|
||||
diu_ops.release_bootmem = mpc512x_release_bootmem;
|
||||
#endif
|
||||
}
|
||||
|
||||
void __init mpc512x_init_IRQ(void)
|
||||
{
|
||||
struct device_node *np;
|
||||
|
129
arch/powerpc/platforms/512x/pdm360ng.c
Normal file
129
arch/powerpc/platforms/512x/pdm360ng.c
Normal file
@ -0,0 +1,129 @@
|
||||
/*
|
||||
* Copyright (C) 2010 DENX Software Engineering
|
||||
*
|
||||
* Anatolij Gustschin, <agust@denx.de>
|
||||
*
|
||||
* PDM360NG board setup
|
||||
*
|
||||
* This is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/of_platform.h>
|
||||
|
||||
#include <asm/machdep.h>
|
||||
#include <asm/ipic.h>
|
||||
|
||||
#include "mpc512x.h"
|
||||
|
||||
#if defined(CONFIG_TOUCHSCREEN_ADS7846) || \
|
||||
defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/spi/ads7846.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/notifier.h>
|
||||
|
||||
static void *pdm360ng_gpio_base;
|
||||
|
||||
static int pdm360ng_get_pendown_state(void)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
reg = in_be32(pdm360ng_gpio_base + 0xc);
|
||||
if (reg & 0x40)
|
||||
setbits32(pdm360ng_gpio_base + 0xc, 0x40);
|
||||
|
||||
reg = in_be32(pdm360ng_gpio_base + 0x8);
|
||||
|
||||
/* return 1 if pen is down */
|
||||
return (reg & 0x40) == 0;
|
||||
}
|
||||
|
||||
static struct ads7846_platform_data pdm360ng_ads7846_pdata = {
|
||||
.model = 7845,
|
||||
.get_pendown_state = pdm360ng_get_pendown_state,
|
||||
.irq_flags = IRQF_TRIGGER_LOW,
|
||||
};
|
||||
|
||||
static int __init pdm360ng_penirq_init(void)
|
||||
{
|
||||
struct device_node *np;
|
||||
|
||||
np = of_find_compatible_node(NULL, NULL, "fsl,mpc5121-gpio");
|
||||
if (!np) {
|
||||
pr_err("%s: Can't find 'mpc5121-gpio' node\n", __func__);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
pdm360ng_gpio_base = of_iomap(np, 0);
|
||||
of_node_put(np);
|
||||
if (!pdm360ng_gpio_base) {
|
||||
pr_err("%s: Can't map gpio regs.\n", __func__);
|
||||
return -ENODEV;
|
||||
}
|
||||
out_be32(pdm360ng_gpio_base + 0xc, 0xffffffff);
|
||||
setbits32(pdm360ng_gpio_base + 0x18, 0x2000);
|
||||
setbits32(pdm360ng_gpio_base + 0x10, 0x40);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pdm360ng_touchscreen_notifier_call(struct notifier_block *nb,
|
||||
unsigned long event, void *__dev)
|
||||
{
|
||||
struct device *dev = __dev;
|
||||
|
||||
if ((event == BUS_NOTIFY_ADD_DEVICE) &&
|
||||
of_device_is_compatible(dev->of_node, "ti,ads7846")) {
|
||||
dev->platform_data = &pdm360ng_ads7846_pdata;
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
|
||||
static struct notifier_block pdm360ng_touchscreen_nb = {
|
||||
.notifier_call = pdm360ng_touchscreen_notifier_call,
|
||||
};
|
||||
|
||||
static void __init pdm360ng_touchscreen_init(void)
|
||||
{
|
||||
if (pdm360ng_penirq_init())
|
||||
return;
|
||||
|
||||
bus_register_notifier(&spi_bus_type, &pdm360ng_touchscreen_nb);
|
||||
}
|
||||
#else
|
||||
static inline void __init pdm360ng_touchscreen_init(void)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_TOUCHSCREEN_ADS7846 */
|
||||
|
||||
void __init pdm360ng_init(void)
|
||||
{
|
||||
mpc512x_init();
|
||||
pdm360ng_touchscreen_init();
|
||||
}
|
||||
|
||||
static int __init pdm360ng_probe(void)
|
||||
{
|
||||
unsigned long root = of_get_flat_dt_root();
|
||||
|
||||
return of_flat_dt_is_compatible(root, "ifm,pdm360ng");
|
||||
}
|
||||
|
||||
define_machine(pdm360ng) {
|
||||
.name = "PDM360NG",
|
||||
.probe = pdm360ng_probe,
|
||||
.setup_arch = mpc512x_setup_diu,
|
||||
.init = pdm360ng_init,
|
||||
.init_early = mpc512x_init_diu,
|
||||
.init_IRQ = mpc512x_init_IRQ,
|
||||
.get_irq = ipic_get_irq,
|
||||
.calibrate_decr = generic_calibrate_decr,
|
||||
.restart = mpc512x_restart,
|
||||
};
|
@ -216,9 +216,6 @@ static int lite5200_pm_enter(suspend_state_t state)
|
||||
|
||||
lite5200_restore_regs();
|
||||
|
||||
/* restart jiffies */
|
||||
wakeup_decrementer();
|
||||
|
||||
iounmap(mbar);
|
||||
return 0;
|
||||
}
|
||||
|
@ -171,9 +171,6 @@ int mpc52xx_pm_enter(suspend_state_t state)
|
||||
/* restore SRAM */
|
||||
memcpy(sram, saved_sram, sram_size);
|
||||
|
||||
/* restart jiffies */
|
||||
wakeup_decrementer();
|
||||
|
||||
/* reenable interrupts in PIC */
|
||||
out_be32(&intr->main_mask, intr_main_mask);
|
||||
|
||||
|
@ -9,6 +9,14 @@ menuconfig PPC_83xx
|
||||
|
||||
if PPC_83xx
|
||||
|
||||
config MPC830x_RDB
|
||||
bool "Freescale MPC830x RDB"
|
||||
select DEFAULT_UIMAGE
|
||||
select PPC_MPC831x
|
||||
select FSL_GTM
|
||||
help
|
||||
This option enables support for the MPC8308 RDB board.
|
||||
|
||||
config MPC831x_RDB
|
||||
bool "Freescale MPC831x RDB"
|
||||
select DEFAULT_UIMAGE
|
||||
|
@ -4,6 +4,7 @@
|
||||
obj-y := misc.o usb.o
|
||||
obj-$(CONFIG_SUSPEND) += suspend.o suspend-asm.o
|
||||
obj-$(CONFIG_MCU_MPC8349EMITX) += mcu_mpc8349emitx.o
|
||||
obj-$(CONFIG_MPC830x_RDB) += mpc830x_rdb.o
|
||||
obj-$(CONFIG_MPC831x_RDB) += mpc831x_rdb.o
|
||||
obj-$(CONFIG_MPC832x_RDB) += mpc832x_rdb.o
|
||||
obj-$(CONFIG_MPC834x_MDS) += mpc834x_mds.o
|
||||
|
94
arch/powerpc/platforms/83xx/mpc830x_rdb.c
Normal file
94
arch/powerpc/platforms/83xx/mpc830x_rdb.c
Normal file
@ -0,0 +1,94 @@
|
||||
/*
|
||||
* arch/powerpc/platforms/83xx/mpc830x_rdb.c
|
||||
*
|
||||
* Description: MPC830x RDB board specific routines.
|
||||
* This file is based on mpc831x_rdb.c
|
||||
*
|
||||
* Copyright (C) Freescale Semiconductor, Inc. 2009. All rights reserved.
|
||||
* Copyright (C) 2010. Ilya Yanok, Emcraft Systems, yanok@emcraft.com
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*/
|
||||
|
||||
#include <linux/pci.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <asm/time.h>
|
||||
#include <asm/ipic.h>
|
||||
#include <asm/udbg.h>
|
||||
#include <sysdev/fsl_pci.h>
|
||||
#include <sysdev/fsl_soc.h>
|
||||
#include "mpc83xx.h"
|
||||
|
||||
/*
|
||||
* Setup the architecture
|
||||
*/
|
||||
static void __init mpc830x_rdb_setup_arch(void)
|
||||
{
|
||||
#ifdef CONFIG_PCI
|
||||
struct device_node *np;
|
||||
#endif
|
||||
|
||||
if (ppc_md.progress)
|
||||
ppc_md.progress("mpc830x_rdb_setup_arch()", 0);
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
for_each_compatible_node(np, "pci", "fsl,mpc8308-pcie")
|
||||
mpc83xx_add_bridge(np);
|
||||
#endif
|
||||
mpc831x_usb_cfg();
|
||||
}
|
||||
|
||||
static void __init mpc830x_rdb_init_IRQ(void)
|
||||
{
|
||||
struct device_node *np;
|
||||
|
||||
np = of_find_node_by_type(NULL, "ipic");
|
||||
if (!np)
|
||||
return;
|
||||
|
||||
ipic_init(np, 0);
|
||||
|
||||
/* Initialize the default interrupt mapping priorities,
|
||||
* in case the boot rom changed something on us.
|
||||
*/
|
||||
ipic_set_default_priority();
|
||||
}
|
||||
|
||||
/*
|
||||
* Called very early, MMU is off, device-tree isn't unflattened
|
||||
*/
|
||||
static int __init mpc830x_rdb_probe(void)
|
||||
{
|
||||
unsigned long root = of_get_flat_dt_root();
|
||||
|
||||
return of_flat_dt_is_compatible(root, "MPC8308RDB") ||
|
||||
of_flat_dt_is_compatible(root, "fsl,mpc8308rdb");
|
||||
}
|
||||
|
||||
static struct of_device_id __initdata of_bus_ids[] = {
|
||||
{ .compatible = "simple-bus" },
|
||||
{ .compatible = "gianfar" },
|
||||
{},
|
||||
};
|
||||
|
||||
static int __init declare_of_platform_devices(void)
|
||||
{
|
||||
of_platform_bus_probe(NULL, of_bus_ids, NULL);
|
||||
return 0;
|
||||
}
|
||||
machine_device_initcall(mpc830x_rdb, declare_of_platform_devices);
|
||||
|
||||
define_machine(mpc830x_rdb) {
|
||||
.name = "MPC830x RDB",
|
||||
.probe = mpc830x_rdb_probe,
|
||||
.setup_arch = mpc830x_rdb_setup_arch,
|
||||
.init_IRQ = mpc830x_rdb_init_IRQ,
|
||||
.get_irq = ipic_get_irq,
|
||||
.restart = mpc83xx_restart,
|
||||
.time_init = mpc83xx_time_init,
|
||||
.calibrate_decr = generic_calibrate_decr,
|
||||
.progress = udbg_progress,
|
||||
};
|
@ -65,6 +65,14 @@ config MPC85xx_RDB
|
||||
help
|
||||
This option enables support for the MPC85xx RDB (P2020 RDB) board
|
||||
|
||||
config P1022_DS
|
||||
bool "Freescale P1022 DS"
|
||||
select DEFAULT_UIMAGE
|
||||
select CONFIG_PHYS_64BIT # The DTS has 36-bit addresses
|
||||
select SWIOTLB
|
||||
help
|
||||
This option enables support for the Freescale P1022DS reference board.
|
||||
|
||||
config SOCRATES
|
||||
bool "Socrates"
|
||||
select DEFAULT_UIMAGE
|
||||
|
@ -10,6 +10,7 @@ obj-$(CONFIG_MPC8536_DS) += mpc8536_ds.o
|
||||
obj-$(CONFIG_MPC85xx_DS) += mpc85xx_ds.o
|
||||
obj-$(CONFIG_MPC85xx_MDS) += mpc85xx_mds.o
|
||||
obj-$(CONFIG_MPC85xx_RDB) += mpc85xx_rdb.o
|
||||
obj-$(CONFIG_P1022_DS) += p1022_ds.o
|
||||
obj-$(CONFIG_P4080_DS) += p4080_ds.o corenet_ds.o
|
||||
obj-$(CONFIG_STX_GP3) += stx_gp3.o
|
||||
obj-$(CONFIG_TQM85xx) += tqm85xx.o
|
||||
|
@ -158,51 +158,108 @@ static int mpc8568_mds_phy_fixups(struct phy_device *phydev)
|
||||
extern void __init mpc85xx_smp_init(void);
|
||||
#endif
|
||||
|
||||
static void __init mpc85xx_mds_setup_arch(void)
|
||||
#ifdef CONFIG_QUICC_ENGINE
|
||||
static struct of_device_id mpc85xx_qe_ids[] __initdata = {
|
||||
{ .type = "qe", },
|
||||
{ .compatible = "fsl,qe", },
|
||||
{ },
|
||||
};
|
||||
|
||||
static void __init mpc85xx_publish_qe_devices(void)
|
||||
{
|
||||
struct device_node *np;
|
||||
static u8 __iomem *bcsr_regs = NULL;
|
||||
#ifdef CONFIG_PCI
|
||||
struct pci_controller *hose;
|
||||
#endif
|
||||
dma_addr_t max = 0xffffffff;
|
||||
|
||||
if (ppc_md.progress)
|
||||
ppc_md.progress("mpc85xx_mds_setup_arch()", 0);
|
||||
np = of_find_compatible_node(NULL, NULL, "fsl,qe");
|
||||
if (!of_device_is_available(np)) {
|
||||
of_node_put(np);
|
||||
return;
|
||||
}
|
||||
|
||||
of_platform_bus_probe(NULL, mpc85xx_qe_ids, NULL);
|
||||
}
|
||||
|
||||
static void __init mpc85xx_mds_reset_ucc_phys(void)
|
||||
{
|
||||
struct device_node *np;
|
||||
static u8 __iomem *bcsr_regs;
|
||||
|
||||
/* Map BCSR area */
|
||||
np = of_find_node_by_name(NULL, "bcsr");
|
||||
if (np != NULL) {
|
||||
struct resource res;
|
||||
if (!np)
|
||||
return;
|
||||
|
||||
of_address_to_resource(np, 0, &res);
|
||||
bcsr_regs = ioremap(res.start, res.end - res.start +1);
|
||||
of_node_put(np);
|
||||
}
|
||||
bcsr_regs = of_iomap(np, 0);
|
||||
of_node_put(np);
|
||||
if (!bcsr_regs)
|
||||
return;
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
for_each_node_by_type(np, "pci") {
|
||||
if (of_device_is_compatible(np, "fsl,mpc8540-pci") ||
|
||||
of_device_is_compatible(np, "fsl,mpc8548-pcie")) {
|
||||
struct resource rsrc;
|
||||
of_address_to_resource(np, 0, &rsrc);
|
||||
if ((rsrc.start & 0xfffff) == 0x8000)
|
||||
fsl_add_bridge(np, 1);
|
||||
else
|
||||
fsl_add_bridge(np, 0);
|
||||
if (machine_is(mpc8568_mds)) {
|
||||
#define BCSR_UCC1_GETH_EN (0x1 << 7)
|
||||
#define BCSR_UCC2_GETH_EN (0x1 << 7)
|
||||
#define BCSR_UCC1_MODE_MSK (0x3 << 4)
|
||||
#define BCSR_UCC2_MODE_MSK (0x3 << 0)
|
||||
|
||||
hose = pci_find_hose_for_OF_device(np);
|
||||
max = min(max, hose->dma_window_base_cur +
|
||||
hose->dma_window_size);
|
||||
/* Turn off UCC1 & UCC2 */
|
||||
clrbits8(&bcsr_regs[8], BCSR_UCC1_GETH_EN);
|
||||
clrbits8(&bcsr_regs[9], BCSR_UCC2_GETH_EN);
|
||||
|
||||
/* Mode is RGMII, all bits clear */
|
||||
clrbits8(&bcsr_regs[11], BCSR_UCC1_MODE_MSK |
|
||||
BCSR_UCC2_MODE_MSK);
|
||||
|
||||
/* Turn UCC1 & UCC2 on */
|
||||
setbits8(&bcsr_regs[8], BCSR_UCC1_GETH_EN);
|
||||
setbits8(&bcsr_regs[9], BCSR_UCC2_GETH_EN);
|
||||
} else if (machine_is(mpc8569_mds)) {
|
||||
#define BCSR7_UCC12_GETHnRST (0x1 << 2)
|
||||
#define BCSR8_UEM_MARVELL_RST (0x1 << 1)
|
||||
#define BCSR_UCC_RGMII (0x1 << 6)
|
||||
#define BCSR_UCC_RTBI (0x1 << 5)
|
||||
/*
|
||||
* U-Boot mangles interrupt polarity for Marvell PHYs,
|
||||
* so reset built-in and UEM Marvell PHYs, this puts
|
||||
* the PHYs into their normal state.
|
||||
*/
|
||||
clrbits8(&bcsr_regs[7], BCSR7_UCC12_GETHnRST);
|
||||
setbits8(&bcsr_regs[8], BCSR8_UEM_MARVELL_RST);
|
||||
|
||||
setbits8(&bcsr_regs[7], BCSR7_UCC12_GETHnRST);
|
||||
clrbits8(&bcsr_regs[8], BCSR8_UEM_MARVELL_RST);
|
||||
|
||||
for (np = NULL; (np = of_find_compatible_node(np,
|
||||
"network",
|
||||
"ucc_geth")) != NULL;) {
|
||||
const unsigned int *prop;
|
||||
int ucc_num;
|
||||
|
||||
prop = of_get_property(np, "cell-index", NULL);
|
||||
if (prop == NULL)
|
||||
continue;
|
||||
|
||||
ucc_num = *prop - 1;
|
||||
|
||||
prop = of_get_property(np, "phy-connection-type", NULL);
|
||||
if (prop == NULL)
|
||||
continue;
|
||||
|
||||
if (strcmp("rtbi", (const char *)prop) == 0)
|
||||
clrsetbits_8(&bcsr_regs[7 + ucc_num],
|
||||
BCSR_UCC_RGMII, BCSR_UCC_RTBI);
|
||||
}
|
||||
} else if (machine_is(p1021_mds)) {
|
||||
#define BCSR11_ENET_MICRST (0x1 << 5)
|
||||
/* Reset Micrel PHY */
|
||||
clrbits8(&bcsr_regs[11], BCSR11_ENET_MICRST);
|
||||
setbits8(&bcsr_regs[11], BCSR11_ENET_MICRST);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
mpc85xx_smp_init();
|
||||
#endif
|
||||
iounmap(bcsr_regs);
|
||||
}
|
||||
|
||||
static void __init mpc85xx_mds_qe_init(void)
|
||||
{
|
||||
struct device_node *np;
|
||||
|
||||
#ifdef CONFIG_QUICC_ENGINE
|
||||
np = of_find_compatible_node(NULL, NULL, "fsl,qe");
|
||||
if (!np) {
|
||||
np = of_find_node_by_name(NULL, "qe");
|
||||
@ -210,6 +267,11 @@ static void __init mpc85xx_mds_setup_arch(void)
|
||||
return;
|
||||
}
|
||||
|
||||
if (!of_device_is_available(np)) {
|
||||
of_node_put(np);
|
||||
return;
|
||||
}
|
||||
|
||||
qe_reset();
|
||||
of_node_put(np);
|
||||
|
||||
@ -224,70 +286,7 @@ static void __init mpc85xx_mds_setup_arch(void)
|
||||
par_io_of_config(ucc);
|
||||
}
|
||||
|
||||
if (bcsr_regs) {
|
||||
if (machine_is(mpc8568_mds)) {
|
||||
#define BCSR_UCC1_GETH_EN (0x1 << 7)
|
||||
#define BCSR_UCC2_GETH_EN (0x1 << 7)
|
||||
#define BCSR_UCC1_MODE_MSK (0x3 << 4)
|
||||
#define BCSR_UCC2_MODE_MSK (0x3 << 0)
|
||||
|
||||
/* Turn off UCC1 & UCC2 */
|
||||
clrbits8(&bcsr_regs[8], BCSR_UCC1_GETH_EN);
|
||||
clrbits8(&bcsr_regs[9], BCSR_UCC2_GETH_EN);
|
||||
|
||||
/* Mode is RGMII, all bits clear */
|
||||
clrbits8(&bcsr_regs[11], BCSR_UCC1_MODE_MSK |
|
||||
BCSR_UCC2_MODE_MSK);
|
||||
|
||||
/* Turn UCC1 & UCC2 on */
|
||||
setbits8(&bcsr_regs[8], BCSR_UCC1_GETH_EN);
|
||||
setbits8(&bcsr_regs[9], BCSR_UCC2_GETH_EN);
|
||||
} else if (machine_is(mpc8569_mds)) {
|
||||
#define BCSR7_UCC12_GETHnRST (0x1 << 2)
|
||||
#define BCSR8_UEM_MARVELL_RST (0x1 << 1)
|
||||
#define BCSR_UCC_RGMII (0x1 << 6)
|
||||
#define BCSR_UCC_RTBI (0x1 << 5)
|
||||
/*
|
||||
* U-Boot mangles interrupt polarity for Marvell PHYs,
|
||||
* so reset built-in and UEM Marvell PHYs, this puts
|
||||
* the PHYs into their normal state.
|
||||
*/
|
||||
clrbits8(&bcsr_regs[7], BCSR7_UCC12_GETHnRST);
|
||||
setbits8(&bcsr_regs[8], BCSR8_UEM_MARVELL_RST);
|
||||
|
||||
setbits8(&bcsr_regs[7], BCSR7_UCC12_GETHnRST);
|
||||
clrbits8(&bcsr_regs[8], BCSR8_UEM_MARVELL_RST);
|
||||
|
||||
for (np = NULL; (np = of_find_compatible_node(np,
|
||||
"network",
|
||||
"ucc_geth")) != NULL;) {
|
||||
const unsigned int *prop;
|
||||
int ucc_num;
|
||||
|
||||
prop = of_get_property(np, "cell-index", NULL);
|
||||
if (prop == NULL)
|
||||
continue;
|
||||
|
||||
ucc_num = *prop - 1;
|
||||
|
||||
prop = of_get_property(np, "phy-connection-type", NULL);
|
||||
if (prop == NULL)
|
||||
continue;
|
||||
|
||||
if (strcmp("rtbi", (const char *)prop) == 0)
|
||||
clrsetbits_8(&bcsr_regs[7 + ucc_num],
|
||||
BCSR_UCC_RGMII, BCSR_UCC_RTBI);
|
||||
}
|
||||
|
||||
} else if (machine_is(p1021_mds)) {
|
||||
#define BCSR11_ENET_MICRST (0x1 << 5)
|
||||
/* Reset Micrel PHY */
|
||||
clrbits8(&bcsr_regs[11], BCSR11_ENET_MICRST);
|
||||
setbits8(&bcsr_regs[11], BCSR11_ENET_MICRST);
|
||||
}
|
||||
|
||||
iounmap(bcsr_regs);
|
||||
}
|
||||
mpc85xx_mds_reset_ucc_phys();
|
||||
|
||||
if (machine_is(p1021_mds)) {
|
||||
#define MPC85xx_PMUXCR_OFFSET 0x60
|
||||
@ -322,8 +321,72 @@ static void __init mpc85xx_mds_setup_arch(void)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
static void __init mpc85xx_mds_qeic_init(void)
|
||||
{
|
||||
struct device_node *np;
|
||||
|
||||
np = of_find_compatible_node(NULL, NULL, "fsl,qe");
|
||||
if (!of_device_is_available(np)) {
|
||||
of_node_put(np);
|
||||
return;
|
||||
}
|
||||
|
||||
np = of_find_compatible_node(NULL, NULL, "fsl,qe-ic");
|
||||
if (!np) {
|
||||
np = of_find_node_by_type(NULL, "qeic");
|
||||
if (!np)
|
||||
return;
|
||||
}
|
||||
|
||||
if (machine_is(p1021_mds))
|
||||
qe_ic_init(np, 0, qe_ic_cascade_low_mpic,
|
||||
qe_ic_cascade_high_mpic);
|
||||
else
|
||||
qe_ic_init(np, 0, qe_ic_cascade_muxed_mpic, NULL);
|
||||
of_node_put(np);
|
||||
}
|
||||
#else
|
||||
static void __init mpc85xx_publish_qe_devices(void) { }
|
||||
static void __init mpc85xx_mds_qe_init(void) { }
|
||||
static void __init mpc85xx_mds_qeic_init(void) { }
|
||||
#endif /* CONFIG_QUICC_ENGINE */
|
||||
|
||||
static void __init mpc85xx_mds_setup_arch(void)
|
||||
{
|
||||
#ifdef CONFIG_PCI
|
||||
struct pci_controller *hose;
|
||||
#endif
|
||||
dma_addr_t max = 0xffffffff;
|
||||
|
||||
if (ppc_md.progress)
|
||||
ppc_md.progress("mpc85xx_mds_setup_arch()", 0);
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
for_each_node_by_type(np, "pci") {
|
||||
if (of_device_is_compatible(np, "fsl,mpc8540-pci") ||
|
||||
of_device_is_compatible(np, "fsl,mpc8548-pcie")) {
|
||||
struct resource rsrc;
|
||||
of_address_to_resource(np, 0, &rsrc);
|
||||
if ((rsrc.start & 0xfffff) == 0x8000)
|
||||
fsl_add_bridge(np, 1);
|
||||
else
|
||||
fsl_add_bridge(np, 0);
|
||||
|
||||
hose = pci_find_hose_for_OF_device(np);
|
||||
max = min(max, hose->dma_window_base_cur +
|
||||
hose->dma_window_size);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
mpc85xx_smp_init();
|
||||
#endif
|
||||
|
||||
mpc85xx_mds_qe_init();
|
||||
|
||||
#ifdef CONFIG_SWIOTLB
|
||||
if (memblock_end_of_DRAM() > max) {
|
||||
ppc_swiotlb_enable = 1;
|
||||
@ -369,8 +432,6 @@ static struct of_device_id mpc85xx_ids[] = {
|
||||
{ .type = "soc", },
|
||||
{ .compatible = "soc", },
|
||||
{ .compatible = "simple-bus", },
|
||||
{ .type = "qe", },
|
||||
{ .compatible = "fsl,qe", },
|
||||
{ .compatible = "gianfar", },
|
||||
{ .compatible = "fsl,rapidio-delta", },
|
||||
{ .compatible = "fsl,mpc8548-guts", },
|
||||
@ -382,8 +443,6 @@ static struct of_device_id p1021_ids[] = {
|
||||
{ .type = "soc", },
|
||||
{ .compatible = "soc", },
|
||||
{ .compatible = "simple-bus", },
|
||||
{ .type = "qe", },
|
||||
{ .compatible = "fsl,qe", },
|
||||
{ .compatible = "gianfar", },
|
||||
{},
|
||||
};
|
||||
@ -395,16 +454,16 @@ static int __init mpc85xx_publish_devices(void)
|
||||
if (machine_is(mpc8569_mds))
|
||||
simple_gpiochip_init("fsl,mpc8569mds-bcsr-gpio");
|
||||
|
||||
/* Publish the QE devices */
|
||||
of_platform_bus_probe(NULL, mpc85xx_ids, NULL);
|
||||
mpc85xx_publish_qe_devices();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init p1021_publish_devices(void)
|
||||
{
|
||||
/* Publish the QE devices */
|
||||
of_platform_bus_probe(NULL, p1021_ids, NULL);
|
||||
mpc85xx_publish_qe_devices();
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -441,21 +500,7 @@ static void __init mpc85xx_mds_pic_init(void)
|
||||
of_node_put(np);
|
||||
|
||||
mpic_init(mpic);
|
||||
|
||||
#ifdef CONFIG_QUICC_ENGINE
|
||||
np = of_find_compatible_node(NULL, NULL, "fsl,qe-ic");
|
||||
if (!np) {
|
||||
np = of_find_node_by_type(NULL, "qeic");
|
||||
if (!np)
|
||||
return;
|
||||
}
|
||||
if (machine_is(p1021_mds))
|
||||
qe_ic_init(np, 0, qe_ic_cascade_low_mpic,
|
||||
qe_ic_cascade_high_mpic);
|
||||
else
|
||||
qe_ic_init(np, 0, qe_ic_cascade_muxed_mpic, NULL);
|
||||
of_node_put(np);
|
||||
#endif /* CONFIG_QUICC_ENGINE */
|
||||
mpc85xx_mds_qeic_init();
|
||||
}
|
||||
|
||||
static int __init mpc85xx_mds_probe(void)
|
||||
|
148
arch/powerpc/platforms/85xx/p1022_ds.c
Normal file
148
arch/powerpc/platforms/85xx/p1022_ds.c
Normal file
@ -0,0 +1,148 @@
|
||||
/*
|
||||
* P1022DS board specific routines
|
||||
*
|
||||
* Authors: Travis Wheatley <travis.wheatley@freescale.com>
|
||||
* Dave Liu <daveliu@freescale.com>
|
||||
* Timur Tabi <timur@freescale.com>
|
||||
*
|
||||
* Copyright 2010 Freescale Semiconductor, Inc.
|
||||
*
|
||||
* This file is taken from the Freescale P1022DS BSP, with modifications:
|
||||
* 1) No DIU support (pending rewrite of DIU code)
|
||||
* 2) No AMP support
|
||||
* 3) No PCI endpoint support
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public License
|
||||
* version 2. This program is licensed "as is" without any warranty of any
|
||||
* kind, whether express or implied.
|
||||
*/
|
||||
|
||||
#include <linux/pci.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/lmb.h>
|
||||
|
||||
#include <asm/mpic.h>
|
||||
#include <asm/swiotlb.h>
|
||||
|
||||
#include <sysdev/fsl_soc.h>
|
||||
#include <sysdev/fsl_pci.h>
|
||||
|
||||
void __init p1022_ds_pic_init(void)
|
||||
{
|
||||
struct mpic *mpic;
|
||||
struct resource r;
|
||||
struct device_node *np;
|
||||
|
||||
np = of_find_node_by_type(NULL, "open-pic");
|
||||
if (!np) {
|
||||
pr_err("Could not find open-pic node\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (of_address_to_resource(np, 0, &r)) {
|
||||
pr_err("Failed to map mpic register space\n");
|
||||
of_node_put(np);
|
||||
return;
|
||||
}
|
||||
|
||||
mpic = mpic_alloc(np, r.start,
|
||||
MPIC_PRIMARY | MPIC_WANTS_RESET |
|
||||
MPIC_BIG_ENDIAN | MPIC_BROKEN_FRR_NIRQS |
|
||||
MPIC_SINGLE_DEST_CPU,
|
||||
0, 256, " OpenPIC ");
|
||||
|
||||
BUG_ON(mpic == NULL);
|
||||
of_node_put(np);
|
||||
|
||||
mpic_init(mpic);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
void __init mpc85xx_smp_init(void);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Setup the architecture
|
||||
*/
|
||||
static void __init p1022_ds_setup_arch(void)
|
||||
{
|
||||
#ifdef CONFIG_PCI
|
||||
struct device_node *np;
|
||||
#endif
|
||||
dma_addr_t max = 0xffffffff;
|
||||
|
||||
if (ppc_md.progress)
|
||||
ppc_md.progress("p1022_ds_setup_arch()", 0);
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
for_each_compatible_node(np, "pci", "fsl,p1022-pcie") {
|
||||
struct resource rsrc;
|
||||
struct pci_controller *hose;
|
||||
|
||||
of_address_to_resource(np, 0, &rsrc);
|
||||
|
||||
if ((rsrc.start & 0xfffff) == 0x8000)
|
||||
fsl_add_bridge(np, 1);
|
||||
else
|
||||
fsl_add_bridge(np, 0);
|
||||
|
||||
hose = pci_find_hose_for_OF_device(np);
|
||||
max = min(max, hose->dma_window_base_cur +
|
||||
hose->dma_window_size);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
mpc85xx_smp_init();
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SWIOTLB
|
||||
if (lmb_end_of_DRAM() > max) {
|
||||
ppc_swiotlb_enable = 1;
|
||||
set_pci_dma_ops(&swiotlb_dma_ops);
|
||||
ppc_md.pci_dma_dev_setup = pci_dma_dev_setup_swiotlb;
|
||||
}
|
||||
#endif
|
||||
|
||||
pr_info("Freescale P1022 DS reference board\n");
|
||||
}
|
||||
|
||||
static struct of_device_id __initdata p1022_ds_ids[] = {
|
||||
{ .type = "soc", },
|
||||
{ .compatible = "soc", },
|
||||
{ .compatible = "simple-bus", },
|
||||
{ .compatible = "gianfar", },
|
||||
{},
|
||||
};
|
||||
|
||||
static int __init p1022_ds_publish_devices(void)
|
||||
{
|
||||
return of_platform_bus_probe(NULL, p1022_ds_ids, NULL);
|
||||
}
|
||||
machine_device_initcall(p1022_ds, p1022_ds_publish_devices);
|
||||
|
||||
machine_arch_initcall(p1022_ds, swiotlb_setup_bus_notifier);
|
||||
|
||||
/*
|
||||
* Called very early, device-tree isn't unflattened
|
||||
*/
|
||||
static int __init p1022_ds_probe(void)
|
||||
{
|
||||
unsigned long root = of_get_flat_dt_root();
|
||||
|
||||
return of_flat_dt_is_compatible(root, "fsl,p1022ds");
|
||||
}
|
||||
|
||||
define_machine(p1022_ds) {
|
||||
.name = "P1022 DS",
|
||||
.probe = p1022_ds_probe,
|
||||
.setup_arch = p1022_ds_setup_arch,
|
||||
.init_IRQ = p1022_ds_pic_init,
|
||||
#ifdef CONFIG_PCI
|
||||
.pcibios_fixup_bus = fsl_pcibios_fixup_bus,
|
||||
#endif
|
||||
.get_irq = mpic_get_irq,
|
||||
.restart = fsl_rstcr_restart,
|
||||
.calibrate_decr = generic_calibrate_decr,
|
||||
.progress = udbg_progress,
|
||||
};
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user