Merge branch 'mxs/cleanup' into next/multiplatform
This is a dependency for mxs/multiplatform Signed-off-by: Arnd Bergmann <arnd@arndb.de> Conflicts: drivers/clocksource/Makefile
This commit is contained in:
Коммит
71f6424023
8
CREDITS
8
CREDITS
|
@ -1510,6 +1510,14 @@ D: Natsemi ethernet
|
||||||
D: Cobalt Networks (x86) support
|
D: Cobalt Networks (x86) support
|
||||||
D: This-and-That
|
D: This-and-That
|
||||||
|
|
||||||
|
N: Mark M. Hoffman
|
||||||
|
E: mhoffman@lightlink.com
|
||||||
|
D: asb100, lm93 and smsc47b397 hardware monitoring drivers
|
||||||
|
D: hwmon subsystem core
|
||||||
|
D: hwmon subsystem maintainer
|
||||||
|
D: i2c-sis96x and i2c-stub SMBus drivers
|
||||||
|
S: USA
|
||||||
|
|
||||||
N: Dirk Hohndel
|
N: Dirk Hohndel
|
||||||
E: hohndel@suse.de
|
E: hohndel@suse.de
|
||||||
D: The XFree86[tm] Project
|
D: The XFree86[tm] Project
|
||||||
|
|
|
@ -23,7 +23,7 @@ Supported chips:
|
||||||
Datasheet: Publicly available at the Maxim website
|
Datasheet: Publicly available at the Maxim website
|
||||||
http://www.maxim-ic.com/
|
http://www.maxim-ic.com/
|
||||||
* Microchip (TelCom) TCN75
|
* Microchip (TelCom) TCN75
|
||||||
Prefix: 'lm75'
|
Prefix: 'tcn75'
|
||||||
Addresses scanned: none
|
Addresses scanned: none
|
||||||
Datasheet: Publicly available at the Microchip website
|
Datasheet: Publicly available at the Microchip website
|
||||||
http://www.microchip.com/
|
http://www.microchip.com/
|
||||||
|
|
|
@ -5,7 +5,7 @@ Supported adapters:
|
||||||
Documentation:
|
Documentation:
|
||||||
http://www.diolan.com/i2c/u2c12.html
|
http://www.diolan.com/i2c/u2c12.html
|
||||||
|
|
||||||
Author: Guenter Roeck <guenter.roeck@ericsson.com>
|
Author: Guenter Roeck <linux@roeck-us.net>
|
||||||
|
|
||||||
Description
|
Description
|
||||||
-----------
|
-----------
|
||||||
|
|
|
@ -15,6 +15,13 @@ amemthresh - INTEGER
|
||||||
enabled and the variable is automatically set to 2, otherwise
|
enabled and the variable is automatically set to 2, otherwise
|
||||||
the strategy is disabled and the variable is set to 1.
|
the strategy is disabled and the variable is set to 1.
|
||||||
|
|
||||||
|
backup_only - BOOLEAN
|
||||||
|
0 - disabled (default)
|
||||||
|
not 0 - enabled
|
||||||
|
|
||||||
|
If set, disable the director function while the server is
|
||||||
|
in backup mode to avoid packet loops for DR/TUN methods.
|
||||||
|
|
||||||
conntrack - BOOLEAN
|
conntrack - BOOLEAN
|
||||||
0 - disabled (default)
|
0 - disabled (default)
|
||||||
not 0 - enabled
|
not 0 - enabled
|
||||||
|
|
|
@ -912,7 +912,7 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
|
||||||
models depending on the codec chip. The list of available models
|
models depending on the codec chip. The list of available models
|
||||||
is found in HD-Audio-Models.txt
|
is found in HD-Audio-Models.txt
|
||||||
|
|
||||||
The model name "genric" is treated as a special case. When this
|
The model name "generic" is treated as a special case. When this
|
||||||
model is given, the driver uses the generic codec parser without
|
model is given, the driver uses the generic codec parser without
|
||||||
"codec-patch". It's sometimes good for testing and debugging.
|
"codec-patch". It's sometimes good for testing and debugging.
|
||||||
|
|
||||||
|
|
|
@ -285,7 +285,7 @@ sample data.
|
||||||
<H4>
|
<H4>
|
||||||
7.2.4 Close Callback</H4>
|
7.2.4 Close Callback</H4>
|
||||||
The <TT>close</TT> callback is called when this device is closed by the
|
The <TT>close</TT> callback is called when this device is closed by the
|
||||||
applicaion. If any private data was allocated in open callback, it must
|
application. If any private data was allocated in open callback, it must
|
||||||
be released in the close callback. The deletion of ALSA port should be
|
be released in the close callback. The deletion of ALSA port should be
|
||||||
done here, too. This callback must not be NULL.
|
done here, too. This callback must not be NULL.
|
||||||
<H4>
|
<H4>
|
||||||
|
|
56
MAINTAINERS
56
MAINTAINERS
|
@ -1338,12 +1338,6 @@ S: Maintained
|
||||||
F: drivers/platform/x86/asus*.c
|
F: drivers/platform/x86/asus*.c
|
||||||
F: drivers/platform/x86/eeepc*.c
|
F: drivers/platform/x86/eeepc*.c
|
||||||
|
|
||||||
ASUS ASB100 HARDWARE MONITOR DRIVER
|
|
||||||
M: "Mark M. Hoffman" <mhoffman@lightlink.com>
|
|
||||||
L: lm-sensors@lm-sensors.org
|
|
||||||
S: Maintained
|
|
||||||
F: drivers/hwmon/asb100.c
|
|
||||||
|
|
||||||
ASYNCHRONOUS TRANSFERS/TRANSFORMS (IOAT) API
|
ASYNCHRONOUS TRANSFERS/TRANSFORMS (IOAT) API
|
||||||
M: Dan Williams <djbw@fb.com>
|
M: Dan Williams <djbw@fb.com>
|
||||||
W: http://sourceforge.net/projects/xscaleiop
|
W: http://sourceforge.net/projects/xscaleiop
|
||||||
|
@ -1467,6 +1461,12 @@ F: drivers/dma/at_hdmac.c
|
||||||
F: drivers/dma/at_hdmac_regs.h
|
F: drivers/dma/at_hdmac_regs.h
|
||||||
F: include/linux/platform_data/dma-atmel.h
|
F: include/linux/platform_data/dma-atmel.h
|
||||||
|
|
||||||
|
ATMEL I2C DRIVER
|
||||||
|
M: Ludovic Desroches <ludovic.desroches@atmel.com>
|
||||||
|
L: linux-i2c@vger.kernel.org
|
||||||
|
S: Supported
|
||||||
|
F: drivers/i2c/busses/i2c-at91.c
|
||||||
|
|
||||||
ATMEL ISI DRIVER
|
ATMEL ISI DRIVER
|
||||||
M: Josh Wu <josh.wu@atmel.com>
|
M: Josh Wu <josh.wu@atmel.com>
|
||||||
L: linux-media@vger.kernel.org
|
L: linux-media@vger.kernel.org
|
||||||
|
@ -2629,7 +2629,7 @@ F: include/uapi/drm/
|
||||||
|
|
||||||
INTEL DRM DRIVERS (excluding Poulsbo, Moorestown and derivative chipsets)
|
INTEL DRM DRIVERS (excluding Poulsbo, Moorestown and derivative chipsets)
|
||||||
M: Daniel Vetter <daniel.vetter@ffwll.ch>
|
M: Daniel Vetter <daniel.vetter@ffwll.ch>
|
||||||
L: intel-gfx@lists.freedesktop.org (subscribers-only)
|
L: intel-gfx@lists.freedesktop.org
|
||||||
L: dri-devel@lists.freedesktop.org
|
L: dri-devel@lists.freedesktop.org
|
||||||
T: git git://people.freedesktop.org/~danvet/drm-intel
|
T: git git://people.freedesktop.org/~danvet/drm-intel
|
||||||
S: Supported
|
S: Supported
|
||||||
|
@ -3242,6 +3242,12 @@ F: Documentation/firmware_class/
|
||||||
F: drivers/base/firmware*.c
|
F: drivers/base/firmware*.c
|
||||||
F: include/linux/firmware.h
|
F: include/linux/firmware.h
|
||||||
|
|
||||||
|
FLASHSYSTEM DRIVER (IBM FlashSystem 70/80 PCI SSD Flash Card)
|
||||||
|
M: Joshua Morris <josh.h.morris@us.ibm.com>
|
||||||
|
M: Philip Kelleher <pjk1939@linux.vnet.ibm.com>
|
||||||
|
S: Maintained
|
||||||
|
F: drivers/block/rsxx/
|
||||||
|
|
||||||
FLOPPY DRIVER
|
FLOPPY DRIVER
|
||||||
M: Jiri Kosina <jkosina@suse.cz>
|
M: Jiri Kosina <jkosina@suse.cz>
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/floppy.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/floppy.git
|
||||||
|
@ -3851,7 +3857,7 @@ F: drivers/i2c/busses/i2c-ismt.c
|
||||||
F: Documentation/i2c/busses/i2c-ismt
|
F: Documentation/i2c/busses/i2c-ismt
|
||||||
|
|
||||||
I2C/SMBUS STUB DRIVER
|
I2C/SMBUS STUB DRIVER
|
||||||
M: "Mark M. Hoffman" <mhoffman@lightlink.com>
|
M: Jean Delvare <khali@linux-fr.org>
|
||||||
L: linux-i2c@vger.kernel.org
|
L: linux-i2c@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/i2c/i2c-stub.c
|
F: drivers/i2c/i2c-stub.c
|
||||||
|
@ -5647,6 +5653,14 @@ S: Maintained
|
||||||
F: drivers/video/riva/
|
F: drivers/video/riva/
|
||||||
F: drivers/video/nvidia/
|
F: drivers/video/nvidia/
|
||||||
|
|
||||||
|
NVM EXPRESS DRIVER
|
||||||
|
M: Matthew Wilcox <willy@linux.intel.com>
|
||||||
|
L: linux-nvme@lists.infradead.org
|
||||||
|
T: git git://git.infradead.org/users/willy/linux-nvme.git
|
||||||
|
S: Supported
|
||||||
|
F: drivers/block/nvme.c
|
||||||
|
F: include/linux/nvme.h
|
||||||
|
|
||||||
OMAP SUPPORT
|
OMAP SUPPORT
|
||||||
M: Tony Lindgren <tony@atomide.com>
|
M: Tony Lindgren <tony@atomide.com>
|
||||||
L: linux-omap@vger.kernel.org
|
L: linux-omap@vger.kernel.org
|
||||||
|
@ -5675,7 +5689,7 @@ S: Maintained
|
||||||
F: arch/arm/*omap*/*clock*
|
F: arch/arm/*omap*/*clock*
|
||||||
|
|
||||||
OMAP POWER MANAGEMENT SUPPORT
|
OMAP POWER MANAGEMENT SUPPORT
|
||||||
M: Kevin Hilman <khilman@ti.com>
|
M: Kevin Hilman <khilman@deeprootsystems.com>
|
||||||
L: linux-omap@vger.kernel.org
|
L: linux-omap@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/arm/*omap*/*pm*
|
F: arch/arm/*omap*/*pm*
|
||||||
|
@ -5769,7 +5783,7 @@ F: arch/arm/*omap*/usb*
|
||||||
|
|
||||||
OMAP GPIO DRIVER
|
OMAP GPIO DRIVER
|
||||||
M: Santosh Shilimkar <santosh.shilimkar@ti.com>
|
M: Santosh Shilimkar <santosh.shilimkar@ti.com>
|
||||||
M: Kevin Hilman <khilman@ti.com>
|
M: Kevin Hilman <khilman@deeprootsystems.com>
|
||||||
L: linux-omap@vger.kernel.org
|
L: linux-omap@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/gpio/gpio-omap.c
|
F: drivers/gpio/gpio-omap.c
|
||||||
|
@ -6201,7 +6215,7 @@ F: include/linux/power_supply.h
|
||||||
F: drivers/power/
|
F: drivers/power/
|
||||||
|
|
||||||
PNP SUPPORT
|
PNP SUPPORT
|
||||||
M: Adam Belay <abelay@mit.edu>
|
M: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
|
||||||
M: Bjorn Helgaas <bhelgaas@google.com>
|
M: Bjorn Helgaas <bhelgaas@google.com>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/pnp/
|
F: drivers/pnp/
|
||||||
|
@ -6543,12 +6557,6 @@ S: Maintained
|
||||||
F: Documentation/blockdev/ramdisk.txt
|
F: Documentation/blockdev/ramdisk.txt
|
||||||
F: drivers/block/brd.c
|
F: drivers/block/brd.c
|
||||||
|
|
||||||
RAMSAM DRIVER (IBM RamSan 70/80 PCI SSD Flash Card)
|
|
||||||
M: Joshua Morris <josh.h.morris@us.ibm.com>
|
|
||||||
M: Philip Kelleher <pjk1939@linux.vnet.ibm.com>
|
|
||||||
S: Maintained
|
|
||||||
F: drivers/block/rsxx/
|
|
||||||
|
|
||||||
RANDOM NUMBER DRIVER
|
RANDOM NUMBER DRIVER
|
||||||
M: Theodore Ts'o" <tytso@mit.edu>
|
M: Theodore Ts'o" <tytso@mit.edu>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
@ -7165,7 +7173,7 @@ F: arch/arm/mach-s3c2410/bast-irq.c
|
||||||
|
|
||||||
TI DAVINCI MACHINE SUPPORT
|
TI DAVINCI MACHINE SUPPORT
|
||||||
M: Sekhar Nori <nsekhar@ti.com>
|
M: Sekhar Nori <nsekhar@ti.com>
|
||||||
M: Kevin Hilman <khilman@ti.com>
|
M: Kevin Hilman <khilman@deeprootsystems.com>
|
||||||
L: davinci-linux-open-source@linux.davincidsp.com (moderated for non-subscribers)
|
L: davinci-linux-open-source@linux.davincidsp.com (moderated for non-subscribers)
|
||||||
T: git git://gitorious.org/linux-davinci/linux-davinci.git
|
T: git git://gitorious.org/linux-davinci/linux-davinci.git
|
||||||
Q: http://patchwork.kernel.org/project/linux-davinci/list/
|
Q: http://patchwork.kernel.org/project/linux-davinci/list/
|
||||||
|
@ -7198,13 +7206,6 @@ L: netdev@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/net/ethernet/sis/sis900.*
|
F: drivers/net/ethernet/sis/sis900.*
|
||||||
|
|
||||||
SIS 96X I2C/SMBUS DRIVER
|
|
||||||
M: "Mark M. Hoffman" <mhoffman@lightlink.com>
|
|
||||||
L: linux-i2c@vger.kernel.org
|
|
||||||
S: Maintained
|
|
||||||
F: Documentation/i2c/busses/i2c-sis96x
|
|
||||||
F: drivers/i2c/busses/i2c-sis96x.c
|
|
||||||
|
|
||||||
SIS FRAMEBUFFER DRIVER
|
SIS FRAMEBUFFER DRIVER
|
||||||
M: Thomas Winischhofer <thomas@winischhofer.net>
|
M: Thomas Winischhofer <thomas@winischhofer.net>
|
||||||
W: http://www.winischhofer.net/linuxsisvga.shtml
|
W: http://www.winischhofer.net/linuxsisvga.shtml
|
||||||
|
@ -7282,7 +7283,7 @@ F: Documentation/hwmon/sch5627
|
||||||
F: drivers/hwmon/sch5627.c
|
F: drivers/hwmon/sch5627.c
|
||||||
|
|
||||||
SMSC47B397 HARDWARE MONITOR DRIVER
|
SMSC47B397 HARDWARE MONITOR DRIVER
|
||||||
M: "Mark M. Hoffman" <mhoffman@lightlink.com>
|
M: Jean Delvare <khali@linux-fr.org>
|
||||||
L: lm-sensors@lm-sensors.org
|
L: lm-sensors@lm-sensors.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: Documentation/hwmon/smsc47b397
|
F: Documentation/hwmon/smsc47b397
|
||||||
|
@ -7705,9 +7706,10 @@ F: include/linux/swiotlb.h
|
||||||
|
|
||||||
SYNOPSYS ARC ARCHITECTURE
|
SYNOPSYS ARC ARCHITECTURE
|
||||||
M: Vineet Gupta <vgupta@synopsys.com>
|
M: Vineet Gupta <vgupta@synopsys.com>
|
||||||
L: linux-snps-arc@vger.kernel.org
|
|
||||||
S: Supported
|
S: Supported
|
||||||
F: arch/arc/
|
F: arch/arc/
|
||||||
|
F: Documentation/devicetree/bindings/arc/
|
||||||
|
F: drivers/tty/serial/arc-uart.c
|
||||||
|
|
||||||
SYSV FILESYSTEM
|
SYSV FILESYSTEM
|
||||||
M: Christoph Hellwig <hch@infradead.org>
|
M: Christoph Hellwig <hch@infradead.org>
|
||||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
||||||
VERSION = 3
|
VERSION = 3
|
||||||
PATCHLEVEL = 9
|
PATCHLEVEL = 9
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION = -rc3
|
EXTRAVERSION = -rc5
|
||||||
NAME = Unicycling Gorilla
|
NAME = Unicycling Gorilla
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
|
|
@ -126,7 +126,7 @@ dma_map_sg(struct device *dev, struct scatterlist *sg,
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for_each_sg(sg, s, nents, i)
|
for_each_sg(sg, s, nents, i)
|
||||||
sg->dma_address = dma_map_page(dev, sg_page(s), s->offset,
|
s->dma_address = dma_map_page(dev, sg_page(s), s->offset,
|
||||||
s->length, dir);
|
s->length, dir);
|
||||||
|
|
||||||
return nents;
|
return nents;
|
||||||
|
|
|
@ -72,7 +72,4 @@ extern int elf_check_arch(const struct elf32_hdr *);
|
||||||
*/
|
*/
|
||||||
#define ELF_PLATFORM (NULL)
|
#define ELF_PLATFORM (NULL)
|
||||||
|
|
||||||
#define SET_PERSONALITY(ex) \
|
|
||||||
set_personality(PER_LINUX | (current->personality & (~PER_MASK)))
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -415,7 +415,7 @@
|
||||||
*-------------------------------------------------------------*/
|
*-------------------------------------------------------------*/
|
||||||
.macro SAVE_ALL_EXCEPTION marker
|
.macro SAVE_ALL_EXCEPTION marker
|
||||||
|
|
||||||
st \marker, [sp, 8]
|
st \marker, [sp, 8] /* orig_r8 */
|
||||||
st r0, [sp, 4] /* orig_r0, needed only for sys calls */
|
st r0, [sp, 4] /* orig_r0, needed only for sys calls */
|
||||||
|
|
||||||
/* Restore r9 used to code the early prologue */
|
/* Restore r9 used to code the early prologue */
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
|
|
||||||
#ifdef CONFIG_KGDB
|
#ifdef CONFIG_KGDB
|
||||||
|
|
||||||
#include <asm/user.h>
|
#include <asm/ptrace.h>
|
||||||
|
|
||||||
/* to ensure compatibility with Linux 2.6.35, we don't implement the get/set
|
/* to ensure compatibility with Linux 2.6.35, we don't implement the get/set
|
||||||
* register API yet */
|
* register API yet */
|
||||||
|
@ -53,9 +53,7 @@ enum arc700_linux_regnums {
|
||||||
};
|
};
|
||||||
|
|
||||||
#else
|
#else
|
||||||
static inline void kgdb_trap(struct pt_regs *regs, int param)
|
#define kgdb_trap(regs, param)
|
||||||
{
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* __ARC_KGDB_H__ */
|
#endif /* __ARC_KGDB_H__ */
|
||||||
|
|
|
@ -123,7 +123,7 @@ static inline long regs_return_value(struct pt_regs *regs)
|
||||||
#define orig_r8_IS_SCALL 0x0001
|
#define orig_r8_IS_SCALL 0x0001
|
||||||
#define orig_r8_IS_SCALL_RESTARTED 0x0002
|
#define orig_r8_IS_SCALL_RESTARTED 0x0002
|
||||||
#define orig_r8_IS_BRKPT 0x0004
|
#define orig_r8_IS_BRKPT 0x0004
|
||||||
#define orig_r8_IS_EXCPN 0x0004
|
#define orig_r8_IS_EXCPN 0x0008
|
||||||
#define orig_r8_IS_IRQ1 0x0010
|
#define orig_r8_IS_IRQ1 0x0010
|
||||||
#define orig_r8_IS_IRQ2 0x0020
|
#define orig_r8_IS_IRQ2 0x0020
|
||||||
|
|
||||||
|
|
|
@ -16,8 +16,6 @@
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
|
|
||||||
int sys_clone_wrapper(int, int, int, int, int);
|
int sys_clone_wrapper(int, int, int, int, int);
|
||||||
int sys_fork_wrapper(void);
|
|
||||||
int sys_vfork_wrapper(void);
|
|
||||||
int sys_cacheflush(uint32_t, uint32_t uint32_t);
|
int sys_cacheflush(uint32_t, uint32_t uint32_t);
|
||||||
int sys_arc_settls(void *);
|
int sys_arc_settls(void *);
|
||||||
int sys_arc_gettls(void);
|
int sys_arc_gettls(void);
|
||||||
|
|
|
@ -28,14 +28,14 @@
|
||||||
*/
|
*/
|
||||||
struct user_regs_struct {
|
struct user_regs_struct {
|
||||||
|
|
||||||
struct scratch {
|
struct {
|
||||||
long pad;
|
long pad;
|
||||||
long bta, lp_start, lp_end, lp_count;
|
long bta, lp_start, lp_end, lp_count;
|
||||||
long status32, ret, blink, fp, gp;
|
long status32, ret, blink, fp, gp;
|
||||||
long r12, r11, r10, r9, r8, r7, r6, r5, r4, r3, r2, r1, r0;
|
long r12, r11, r10, r9, r8, r7, r6, r5, r4, r3, r2, r1, r0;
|
||||||
long sp;
|
long sp;
|
||||||
} scratch;
|
} scratch;
|
||||||
struct callee {
|
struct {
|
||||||
long pad;
|
long pad;
|
||||||
long r25, r24, r23, r22, r21, r20;
|
long r25, r24, r23, r22, r21, r20;
|
||||||
long r19, r18, r17, r16, r15, r14, r13;
|
long r19, r18, r17, r16, r15, r14, r13;
|
||||||
|
|
|
@ -452,7 +452,7 @@ tracesys:
|
||||||
; using ERET won't work since next-PC has already committed
|
; using ERET won't work since next-PC has already committed
|
||||||
lr r12, [efa]
|
lr r12, [efa]
|
||||||
GET_CURR_TASK_FIELD_PTR TASK_THREAD, r11
|
GET_CURR_TASK_FIELD_PTR TASK_THREAD, r11
|
||||||
st r12, [r11, THREAD_FAULT_ADDR]
|
st r12, [r11, THREAD_FAULT_ADDR] ; thread.fault_address
|
||||||
|
|
||||||
; PRE Sys Call Ptrace hook
|
; PRE Sys Call Ptrace hook
|
||||||
mov r0, sp ; pt_regs needed
|
mov r0, sp ; pt_regs needed
|
||||||
|
@ -792,31 +792,6 @@ ARC_EXIT ret_from_fork
|
||||||
|
|
||||||
;################### Special Sys Call Wrappers ##########################
|
;################### Special Sys Call Wrappers ##########################
|
||||||
|
|
||||||
; TBD: call do_fork directly from here
|
|
||||||
ARC_ENTRY sys_fork_wrapper
|
|
||||||
SAVE_CALLEE_SAVED_USER
|
|
||||||
bl @sys_fork
|
|
||||||
DISCARD_CALLEE_SAVED_USER
|
|
||||||
|
|
||||||
GET_CURR_THR_INFO_FLAGS r10
|
|
||||||
btst r10, TIF_SYSCALL_TRACE
|
|
||||||
bnz tracesys_exit
|
|
||||||
|
|
||||||
b ret_from_system_call
|
|
||||||
ARC_EXIT sys_fork_wrapper
|
|
||||||
|
|
||||||
ARC_ENTRY sys_vfork_wrapper
|
|
||||||
SAVE_CALLEE_SAVED_USER
|
|
||||||
bl @sys_vfork
|
|
||||||
DISCARD_CALLEE_SAVED_USER
|
|
||||||
|
|
||||||
GET_CURR_THR_INFO_FLAGS r10
|
|
||||||
btst r10, TIF_SYSCALL_TRACE
|
|
||||||
bnz tracesys_exit
|
|
||||||
|
|
||||||
b ret_from_system_call
|
|
||||||
ARC_EXIT sys_vfork_wrapper
|
|
||||||
|
|
||||||
ARC_ENTRY sys_clone_wrapper
|
ARC_ENTRY sys_clone_wrapper
|
||||||
SAVE_CALLEE_SAVED_USER
|
SAVE_CALLEE_SAVED_USER
|
||||||
bl @sys_clone
|
bl @sys_clone
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/kgdb.h>
|
#include <linux/kgdb.h>
|
||||||
|
#include <linux/sched.h>
|
||||||
#include <asm/disasm.h>
|
#include <asm/disasm.h>
|
||||||
#include <asm/cacheflush.h>
|
#include <asm/cacheflush.h>
|
||||||
|
|
||||||
|
|
|
@ -232,10 +232,8 @@ char *arc_extn_mumbojumbo(int cpu_id, char *buf, int len)
|
||||||
|
|
||||||
n += scnprintf(buf + n, len - n, "\n");
|
n += scnprintf(buf + n, len - n, "\n");
|
||||||
|
|
||||||
#ifdef _ASM_GENERIC_UNISTD_H
|
|
||||||
n += scnprintf(buf + n, len - n,
|
n += scnprintf(buf + n, len - n,
|
||||||
"OS ABI [v2]\t: asm-generic/{unistd,stat,fcntl}\n");
|
"OS ABI [v3]\t: no-legacy-syscalls\n");
|
||||||
#endif
|
|
||||||
|
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,8 +6,6 @@
|
||||||
#include <asm/syscalls.h>
|
#include <asm/syscalls.h>
|
||||||
|
|
||||||
#define sys_clone sys_clone_wrapper
|
#define sys_clone sys_clone_wrapper
|
||||||
#define sys_fork sys_fork_wrapper
|
|
||||||
#define sys_vfork sys_vfork_wrapper
|
|
||||||
|
|
||||||
#undef __SYSCALL
|
#undef __SYSCALL
|
||||||
#define __SYSCALL(nr, call) [nr] = (call),
|
#define __SYSCALL(nr, call) [nr] = (call),
|
||||||
|
|
|
@ -427,12 +427,14 @@ config ARCH_MXS
|
||||||
select ARCH_REQUIRE_GPIOLIB
|
select ARCH_REQUIRE_GPIOLIB
|
||||||
select CLKDEV_LOOKUP
|
select CLKDEV_LOOKUP
|
||||||
select CLKSRC_MMIO
|
select CLKSRC_MMIO
|
||||||
|
select CLKSRC_OF
|
||||||
select COMMON_CLK
|
select COMMON_CLK
|
||||||
select GENERIC_CLOCKEVENTS
|
select GENERIC_CLOCKEVENTS
|
||||||
select HAVE_CLK_PREPARE
|
select HAVE_CLK_PREPARE
|
||||||
select MULTI_IRQ_HANDLER
|
select MULTI_IRQ_HANDLER
|
||||||
select PINCTRL
|
select PINCTRL
|
||||||
select SPARSE_IRQ
|
select SPARSE_IRQ
|
||||||
|
select STMP_DEVICE
|
||||||
select USE_OF
|
select USE_OF
|
||||||
help
|
help
|
||||||
Support for Freescale MXS-based family of processors
|
Support for Freescale MXS-based family of processors
|
||||||
|
@ -696,6 +698,7 @@ config ARCH_RPC
|
||||||
select NEED_MACH_IO_H
|
select NEED_MACH_IO_H
|
||||||
select NEED_MACH_MEMORY_H
|
select NEED_MACH_MEMORY_H
|
||||||
select NO_IOPORT
|
select NO_IOPORT
|
||||||
|
select VIRT_TO_BUS
|
||||||
help
|
help
|
||||||
On the Acorn Risc-PC, Linux can support the internal IDE disk and
|
On the Acorn Risc-PC, Linux can support the internal IDE disk and
|
||||||
CD-ROM interface, serial and parallel port, and the floppy drive.
|
CD-ROM interface, serial and parallel port, and the floppy drive.
|
||||||
|
@ -831,6 +834,7 @@ config ARCH_SHARK
|
||||||
select ISA_DMA
|
select ISA_DMA
|
||||||
select NEED_MACH_MEMORY_H
|
select NEED_MACH_MEMORY_H
|
||||||
select PCI
|
select PCI
|
||||||
|
select VIRT_TO_BUS
|
||||||
select ZONE_DMA
|
select ZONE_DMA
|
||||||
help
|
help
|
||||||
Support for the StrongARM based Digital DNARD machine, also known
|
Support for the StrongARM based Digital DNARD machine, also known
|
||||||
|
@ -913,12 +917,12 @@ config ARCH_MULTI_V4_V5
|
||||||
bool
|
bool
|
||||||
|
|
||||||
config ARCH_MULTI_V6
|
config ARCH_MULTI_V6
|
||||||
bool "ARMv6 based platforms (ARM11, Scorpion, ...)"
|
bool "ARMv6 based platforms (ARM11)"
|
||||||
select ARCH_MULTI_V6_V7
|
select ARCH_MULTI_V6_V7
|
||||||
select CPU_V6
|
select CPU_V6
|
||||||
|
|
||||||
config ARCH_MULTI_V7
|
config ARCH_MULTI_V7
|
||||||
bool "ARMv7 based platforms (Cortex-A, PJ4, Krait)"
|
bool "ARMv7 based platforms (Cortex-A, PJ4, Scorpion, Krait)"
|
||||||
default y
|
default y
|
||||||
select ARCH_MULTI_V6_V7
|
select ARCH_MULTI_V6_V7
|
||||||
select ARCH_VEXPRESS
|
select ARCH_VEXPRESS
|
||||||
|
@ -1371,10 +1375,6 @@ config ISA_DMA
|
||||||
bool
|
bool
|
||||||
select ISA_DMA_API
|
select ISA_DMA_API
|
||||||
|
|
||||||
config ARCH_NO_VIRT_TO_BUS
|
|
||||||
def_bool y
|
|
||||||
depends on !ARCH_RPC && !ARCH_NETWINDER && !ARCH_SHARK
|
|
||||||
|
|
||||||
# Select ISA DMA interface
|
# Select ISA DMA interface
|
||||||
config ISA_DMA_API
|
config ISA_DMA_API
|
||||||
bool
|
bool
|
||||||
|
|
|
@ -520,6 +520,7 @@ config DEBUG_IMX_UART_PORT
|
||||||
DEBUG_IMX53_UART || \
|
DEBUG_IMX53_UART || \
|
||||||
DEBUG_IMX6Q_UART
|
DEBUG_IMX6Q_UART
|
||||||
default 1
|
default 1
|
||||||
|
depends on ARCH_MXC
|
||||||
help
|
help
|
||||||
Choose UART port on which kernel low-level debug messages
|
Choose UART port on which kernel low-level debug messages
|
||||||
should be output.
|
should be output.
|
||||||
|
|
|
@ -238,8 +238,32 @@
|
||||||
nand {
|
nand {
|
||||||
pinctrl_nand: nand-0 {
|
pinctrl_nand: nand-0 {
|
||||||
atmel,pins =
|
atmel,pins =
|
||||||
<3 4 0x0 0x1 /* PD5 gpio RDY pin pull_up */
|
<3 0 0x1 0x0 /* PD0 periph A Read Enable */
|
||||||
3 5 0x0 0x1>; /* PD4 gpio enable pin pull_up */
|
3 1 0x1 0x0 /* PD1 periph A Write Enable */
|
||||||
|
3 2 0x1 0x0 /* PD2 periph A Address Latch Enable */
|
||||||
|
3 3 0x1 0x0 /* PD3 periph A Command Latch Enable */
|
||||||
|
3 4 0x0 0x1 /* PD4 gpio Chip Enable pin pull_up */
|
||||||
|
3 5 0x0 0x1 /* PD5 gpio RDY/BUSY pin pull_up */
|
||||||
|
3 6 0x1 0x0 /* PD6 periph A Data bit 0 */
|
||||||
|
3 7 0x1 0x0 /* PD7 periph A Data bit 1 */
|
||||||
|
3 8 0x1 0x0 /* PD8 periph A Data bit 2 */
|
||||||
|
3 9 0x1 0x0 /* PD9 periph A Data bit 3 */
|
||||||
|
3 10 0x1 0x0 /* PD10 periph A Data bit 4 */
|
||||||
|
3 11 0x1 0x0 /* PD11 periph A Data bit 5 */
|
||||||
|
3 12 0x1 0x0 /* PD12 periph A Data bit 6 */
|
||||||
|
3 13 0x1 0x0>; /* PD13 periph A Data bit 7 */
|
||||||
|
};
|
||||||
|
|
||||||
|
pinctrl_nand_16bits: nand_16bits-0 {
|
||||||
|
atmel,pins =
|
||||||
|
<3 14 0x1 0x0 /* PD14 periph A Data bit 8 */
|
||||||
|
3 15 0x1 0x0 /* PD15 periph A Data bit 9 */
|
||||||
|
3 16 0x1 0x0 /* PD16 periph A Data bit 10 */
|
||||||
|
3 17 0x1 0x0 /* PD17 periph A Data bit 11 */
|
||||||
|
3 18 0x1 0x0 /* PD18 periph A Data bit 12 */
|
||||||
|
3 19 0x1 0x0 /* PD19 periph A Data bit 13 */
|
||||||
|
3 20 0x1 0x0 /* PD20 periph A Data bit 14 */
|
||||||
|
3 21 0x1 0x0>; /* PD21 periph A Data bit 15 */
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -275,18 +275,27 @@
|
||||||
compatible = "arm,pl330", "arm,primecell";
|
compatible = "arm,pl330", "arm,primecell";
|
||||||
reg = <0x12680000 0x1000>;
|
reg = <0x12680000 0x1000>;
|
||||||
interrupts = <0 35 0>;
|
interrupts = <0 35 0>;
|
||||||
|
#dma-cells = <1>;
|
||||||
|
#dma-channels = <8>;
|
||||||
|
#dma-requests = <32>;
|
||||||
};
|
};
|
||||||
|
|
||||||
pdma1: pdma@12690000 {
|
pdma1: pdma@12690000 {
|
||||||
compatible = "arm,pl330", "arm,primecell";
|
compatible = "arm,pl330", "arm,primecell";
|
||||||
reg = <0x12690000 0x1000>;
|
reg = <0x12690000 0x1000>;
|
||||||
interrupts = <0 36 0>;
|
interrupts = <0 36 0>;
|
||||||
|
#dma-cells = <1>;
|
||||||
|
#dma-channels = <8>;
|
||||||
|
#dma-requests = <32>;
|
||||||
};
|
};
|
||||||
|
|
||||||
mdma1: mdma@12850000 {
|
mdma1: mdma@12850000 {
|
||||||
compatible = "arm,pl330", "arm,primecell";
|
compatible = "arm,pl330", "arm,primecell";
|
||||||
reg = <0x12850000 0x1000>;
|
reg = <0x12850000 0x1000>;
|
||||||
interrupts = <0 34 0>;
|
interrupts = <0 34 0>;
|
||||||
|
#dma-cells = <1>;
|
||||||
|
#dma-channels = <8>;
|
||||||
|
#dma-requests = <1>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -142,12 +142,18 @@
|
||||||
compatible = "arm,pl330", "arm,primecell";
|
compatible = "arm,pl330", "arm,primecell";
|
||||||
reg = <0x120000 0x1000>;
|
reg = <0x120000 0x1000>;
|
||||||
interrupts = <0 34 0>;
|
interrupts = <0 34 0>;
|
||||||
|
#dma-cells = <1>;
|
||||||
|
#dma-channels = <8>;
|
||||||
|
#dma-requests = <32>;
|
||||||
};
|
};
|
||||||
|
|
||||||
pdma1: pdma@121B0000 {
|
pdma1: pdma@121B0000 {
|
||||||
compatible = "arm,pl330", "arm,primecell";
|
compatible = "arm,pl330", "arm,primecell";
|
||||||
reg = <0x121000 0x1000>;
|
reg = <0x121000 0x1000>;
|
||||||
interrupts = <0 35 0>;
|
interrupts = <0 35 0>;
|
||||||
|
#dma-cells = <1>;
|
||||||
|
#dma-channels = <8>;
|
||||||
|
#dma-requests = <32>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -295,6 +295,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
digctl@8001c000 {
|
digctl@8001c000 {
|
||||||
|
compatible = "fsl,imx23-digctl";
|
||||||
reg = <0x8001c000 2000>;
|
reg = <0x8001c000 2000>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
@ -321,6 +322,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
ocotp@8002c000 {
|
ocotp@8002c000 {
|
||||||
|
compatible = "fsl,ocotp";
|
||||||
reg = <0x8002c000 0x2000>;
|
reg = <0x8002c000 0x2000>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
@ -360,7 +362,7 @@
|
||||||
ranges;
|
ranges;
|
||||||
|
|
||||||
clks: clkctrl@80040000 {
|
clks: clkctrl@80040000 {
|
||||||
compatible = "fsl,imx23-clkctrl";
|
compatible = "fsl,imx23-clkctrl", "fsl,clkctrl";
|
||||||
reg = <0x80040000 0x2000>;
|
reg = <0x80040000 0x2000>;
|
||||||
#clock-cells = <1>;
|
#clock-cells = <1>;
|
||||||
};
|
};
|
||||||
|
@ -426,6 +428,7 @@
|
||||||
compatible = "fsl,imx23-timrot", "fsl,timrot";
|
compatible = "fsl,imx23-timrot", "fsl,timrot";
|
||||||
reg = <0x80068000 0x2000>;
|
reg = <0x80068000 0x2000>;
|
||||||
interrupts = <28 29 30 31>;
|
interrupts = <28 29 30 31>;
|
||||||
|
clocks = <&clks 28>;
|
||||||
};
|
};
|
||||||
|
|
||||||
auart0: serial@8006c000 {
|
auart0: serial@8006c000 {
|
||||||
|
|
|
@ -647,6 +647,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
digctl@8001c000 {
|
digctl@8001c000 {
|
||||||
|
compatible = "fsl,imx28-digctl";
|
||||||
reg = <0x8001c000 0x2000>;
|
reg = <0x8001c000 0x2000>;
|
||||||
interrupts = <89>;
|
interrupts = <89>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
@ -676,6 +677,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
ocotp@8002c000 {
|
ocotp@8002c000 {
|
||||||
|
compatible = "fsl,ocotp";
|
||||||
reg = <0x8002c000 0x2000>;
|
reg = <0x8002c000 0x2000>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
@ -755,7 +757,7 @@
|
||||||
ranges;
|
ranges;
|
||||||
|
|
||||||
clks: clkctrl@80040000 {
|
clks: clkctrl@80040000 {
|
||||||
compatible = "fsl,imx28-clkctrl";
|
compatible = "fsl,imx28-clkctrl", "fsl,clkctrl";
|
||||||
reg = <0x80040000 0x2000>;
|
reg = <0x80040000 0x2000>;
|
||||||
#clock-cells = <1>;
|
#clock-cells = <1>;
|
||||||
};
|
};
|
||||||
|
@ -838,6 +840,7 @@
|
||||||
compatible = "fsl,imx28-timrot", "fsl,timrot";
|
compatible = "fsl,imx28-timrot", "fsl,timrot";
|
||||||
reg = <0x80068000 0x2000>;
|
reg = <0x80068000 0x2000>;
|
||||||
interrupts = <48 49 50 51>;
|
interrupts = <48 49 50 51>;
|
||||||
|
clocks = <&clks 26>;
|
||||||
};
|
};
|
||||||
|
|
||||||
auart0: serial@8006a000 {
|
auart0: serial@8006a000 {
|
||||||
|
|
|
@ -385,7 +385,7 @@
|
||||||
|
|
||||||
spi@7000d800 {
|
spi@7000d800 {
|
||||||
compatible = "nvidia,tegra20-slink";
|
compatible = "nvidia,tegra20-slink";
|
||||||
reg = <0x7000d480 0x200>;
|
reg = <0x7000d800 0x200>;
|
||||||
interrupts = <0 83 0x04>;
|
interrupts = <0 83 0x04>;
|
||||||
nvidia,dma-request-selector = <&apbdma 17>;
|
nvidia,dma-request-selector = <&apbdma 17>;
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
|
|
|
@ -372,7 +372,7 @@
|
||||||
|
|
||||||
spi@7000d800 {
|
spi@7000d800 {
|
||||||
compatible = "nvidia,tegra30-slink", "nvidia,tegra20-slink";
|
compatible = "nvidia,tegra30-slink", "nvidia,tegra20-slink";
|
||||||
reg = <0x7000d480 0x200>;
|
reg = <0x7000d800 0x200>;
|
||||||
interrupts = <0 83 0x04>;
|
interrupts = <0 83 0x04>;
|
||||||
nvidia,dma-request-selector = <&apbdma 17>;
|
nvidia,dma-request-selector = <&apbdma 17>;
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
|
|
|
@ -480,7 +480,7 @@ static void __cpuinit broadcast_timer_setup(struct clock_event_device *evt)
|
||||||
evt->features = CLOCK_EVT_FEAT_ONESHOT |
|
evt->features = CLOCK_EVT_FEAT_ONESHOT |
|
||||||
CLOCK_EVT_FEAT_PERIODIC |
|
CLOCK_EVT_FEAT_PERIODIC |
|
||||||
CLOCK_EVT_FEAT_DUMMY;
|
CLOCK_EVT_FEAT_DUMMY;
|
||||||
evt->rating = 400;
|
evt->rating = 100;
|
||||||
evt->mult = 1;
|
evt->mult = 1;
|
||||||
evt->set_mode = broadcast_timer_set_mode;
|
evt->set_mode = broadcast_timer_set_mode;
|
||||||
|
|
||||||
|
|
|
@ -14,31 +14,15 @@
|
||||||
|
|
||||||
.text
|
.text
|
||||||
.align 5
|
.align 5
|
||||||
.word 0
|
|
||||||
|
|
||||||
1: subs r2, r2, #4 @ 1 do we have enough
|
|
||||||
blt 5f @ 1 bytes to align with?
|
|
||||||
cmp r3, #2 @ 1
|
|
||||||
strltb r1, [ip], #1 @ 1
|
|
||||||
strleb r1, [ip], #1 @ 1
|
|
||||||
strb r1, [ip], #1 @ 1
|
|
||||||
add r2, r2, r3 @ 1 (r2 = r2 - (4 - r3))
|
|
||||||
/*
|
|
||||||
* The pointer is now aligned and the length is adjusted. Try doing the
|
|
||||||
* memset again.
|
|
||||||
*/
|
|
||||||
|
|
||||||
ENTRY(memset)
|
ENTRY(memset)
|
||||||
/*
|
ands r3, r0, #3 @ 1 unaligned?
|
||||||
* Preserve the contents of r0 for the return value.
|
mov ip, r0 @ preserve r0 as return value
|
||||||
*/
|
bne 6f @ 1
|
||||||
mov ip, r0
|
|
||||||
ands r3, ip, #3 @ 1 unaligned?
|
|
||||||
bne 1b @ 1
|
|
||||||
/*
|
/*
|
||||||
* we know that the pointer in ip is aligned to a word boundary.
|
* we know that the pointer in ip is aligned to a word boundary.
|
||||||
*/
|
*/
|
||||||
orr r1, r1, r1, lsl #8
|
1: orr r1, r1, r1, lsl #8
|
||||||
orr r1, r1, r1, lsl #16
|
orr r1, r1, r1, lsl #16
|
||||||
mov r3, r1
|
mov r3, r1
|
||||||
cmp r2, #16
|
cmp r2, #16
|
||||||
|
@ -127,4 +111,13 @@ ENTRY(memset)
|
||||||
tst r2, #1
|
tst r2, #1
|
||||||
strneb r1, [ip], #1
|
strneb r1, [ip], #1
|
||||||
mov pc, lr
|
mov pc, lr
|
||||||
|
|
||||||
|
6: subs r2, r2, #4 @ 1 do we have enough
|
||||||
|
blt 5b @ 1 bytes to align with?
|
||||||
|
cmp r3, #2 @ 1
|
||||||
|
strltb r1, [ip], #1 @ 1
|
||||||
|
strleb r1, [ip], #1 @ 1
|
||||||
|
strb r1, [ip], #1 @ 1
|
||||||
|
add r2, r2, r3 @ 1 (r2 = r2 - (4 - r3))
|
||||||
|
b 1b
|
||||||
ENDPROC(memset)
|
ENDPROC(memset)
|
||||||
|
|
|
@ -209,6 +209,14 @@ extern int at91_get_gpio_value(unsigned pin);
|
||||||
extern void at91_gpio_suspend(void);
|
extern void at91_gpio_suspend(void);
|
||||||
extern void at91_gpio_resume(void);
|
extern void at91_gpio_resume(void);
|
||||||
|
|
||||||
|
#ifdef CONFIG_PINCTRL_AT91
|
||||||
|
extern void at91_pinctrl_gpio_suspend(void);
|
||||||
|
extern void at91_pinctrl_gpio_resume(void);
|
||||||
|
#else
|
||||||
|
static inline void at91_pinctrl_gpio_suspend(void) {}
|
||||||
|
static inline void at91_pinctrl_gpio_resume(void) {}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* __ASSEMBLY__ */
|
#endif /* __ASSEMBLY__ */
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -92,23 +92,21 @@ static int at91_aic_set_wake(struct irq_data *d, unsigned value)
|
||||||
|
|
||||||
void at91_irq_suspend(void)
|
void at91_irq_suspend(void)
|
||||||
{
|
{
|
||||||
int i = 0, bit;
|
int bit = -1;
|
||||||
|
|
||||||
if (has_aic5()) {
|
if (has_aic5()) {
|
||||||
/* disable enabled irqs */
|
/* disable enabled irqs */
|
||||||
while ((bit = find_next_bit(backups, n_irqs, i)) < n_irqs) {
|
while ((bit = find_next_bit(backups, n_irqs, bit + 1)) < n_irqs) {
|
||||||
at91_aic_write(AT91_AIC5_SSR,
|
at91_aic_write(AT91_AIC5_SSR,
|
||||||
bit & AT91_AIC5_INTSEL_MSK);
|
bit & AT91_AIC5_INTSEL_MSK);
|
||||||
at91_aic_write(AT91_AIC5_IDCR, 1);
|
at91_aic_write(AT91_AIC5_IDCR, 1);
|
||||||
i = bit;
|
|
||||||
}
|
}
|
||||||
/* enable wakeup irqs */
|
/* enable wakeup irqs */
|
||||||
i = 0;
|
bit = -1;
|
||||||
while ((bit = find_next_bit(wakeups, n_irqs, i)) < n_irqs) {
|
while ((bit = find_next_bit(wakeups, n_irqs, bit + 1)) < n_irqs) {
|
||||||
at91_aic_write(AT91_AIC5_SSR,
|
at91_aic_write(AT91_AIC5_SSR,
|
||||||
bit & AT91_AIC5_INTSEL_MSK);
|
bit & AT91_AIC5_INTSEL_MSK);
|
||||||
at91_aic_write(AT91_AIC5_IECR, 1);
|
at91_aic_write(AT91_AIC5_IECR, 1);
|
||||||
i = bit;
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
at91_aic_write(AT91_AIC_IDCR, *backups);
|
at91_aic_write(AT91_AIC_IDCR, *backups);
|
||||||
|
@ -118,23 +116,21 @@ void at91_irq_suspend(void)
|
||||||
|
|
||||||
void at91_irq_resume(void)
|
void at91_irq_resume(void)
|
||||||
{
|
{
|
||||||
int i = 0, bit;
|
int bit = -1;
|
||||||
|
|
||||||
if (has_aic5()) {
|
if (has_aic5()) {
|
||||||
/* disable wakeup irqs */
|
/* disable wakeup irqs */
|
||||||
while ((bit = find_next_bit(wakeups, n_irqs, i)) < n_irqs) {
|
while ((bit = find_next_bit(wakeups, n_irqs, bit + 1)) < n_irqs) {
|
||||||
at91_aic_write(AT91_AIC5_SSR,
|
at91_aic_write(AT91_AIC5_SSR,
|
||||||
bit & AT91_AIC5_INTSEL_MSK);
|
bit & AT91_AIC5_INTSEL_MSK);
|
||||||
at91_aic_write(AT91_AIC5_IDCR, 1);
|
at91_aic_write(AT91_AIC5_IDCR, 1);
|
||||||
i = bit;
|
|
||||||
}
|
}
|
||||||
/* enable irqs disabled for suspend */
|
/* enable irqs disabled for suspend */
|
||||||
i = 0;
|
bit = -1;
|
||||||
while ((bit = find_next_bit(backups, n_irqs, i)) < n_irqs) {
|
while ((bit = find_next_bit(backups, n_irqs, bit + 1)) < n_irqs) {
|
||||||
at91_aic_write(AT91_AIC5_SSR,
|
at91_aic_write(AT91_AIC5_SSR,
|
||||||
bit & AT91_AIC5_INTSEL_MSK);
|
bit & AT91_AIC5_INTSEL_MSK);
|
||||||
at91_aic_write(AT91_AIC5_IECR, 1);
|
at91_aic_write(AT91_AIC5_IECR, 1);
|
||||||
i = bit;
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
at91_aic_write(AT91_AIC_IDCR, *wakeups);
|
at91_aic_write(AT91_AIC_IDCR, *wakeups);
|
||||||
|
|
|
@ -201,7 +201,10 @@ extern u32 at91_slow_clock_sz;
|
||||||
|
|
||||||
static int at91_pm_enter(suspend_state_t state)
|
static int at91_pm_enter(suspend_state_t state)
|
||||||
{
|
{
|
||||||
at91_gpio_suspend();
|
if (of_have_populated_dt())
|
||||||
|
at91_pinctrl_gpio_suspend();
|
||||||
|
else
|
||||||
|
at91_gpio_suspend();
|
||||||
at91_irq_suspend();
|
at91_irq_suspend();
|
||||||
|
|
||||||
pr_debug("AT91: PM - wake mask %08x, pm state %d\n",
|
pr_debug("AT91: PM - wake mask %08x, pm state %d\n",
|
||||||
|
@ -286,7 +289,10 @@ static int at91_pm_enter(suspend_state_t state)
|
||||||
error:
|
error:
|
||||||
target_state = PM_SUSPEND_ON;
|
target_state = PM_SUSPEND_ON;
|
||||||
at91_irq_resume();
|
at91_irq_resume();
|
||||||
at91_gpio_resume();
|
if (of_have_populated_dt())
|
||||||
|
at91_pinctrl_gpio_resume();
|
||||||
|
else
|
||||||
|
at91_gpio_resume();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -743,6 +743,9 @@ EXPORT_SYMBOL(edma_free_channel);
|
||||||
*/
|
*/
|
||||||
int edma_alloc_slot(unsigned ctlr, int slot)
|
int edma_alloc_slot(unsigned ctlr, int slot)
|
||||||
{
|
{
|
||||||
|
if (!edma_cc[ctlr])
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
if (slot >= 0)
|
if (slot >= 0)
|
||||||
slot = EDMA_CHAN_SLOT(slot);
|
slot = EDMA_CHAN_SLOT(slot);
|
||||||
|
|
||||||
|
|
|
@ -67,6 +67,7 @@ config ARCH_NETWINDER
|
||||||
select ISA
|
select ISA
|
||||||
select ISA_DMA
|
select ISA_DMA
|
||||||
select PCI
|
select PCI
|
||||||
|
select VIRT_TO_BUS
|
||||||
help
|
help
|
||||||
Say Y here if you intend to run this kernel on the Rebel.COM
|
Say Y here if you intend to run this kernel on the Rebel.COM
|
||||||
NetWinder. Information about this machine can be found at:
|
NetWinder. Information about this machine can be found at:
|
||||||
|
|
|
@ -264,6 +264,7 @@ int __init mx35_clocks_init(void)
|
||||||
clk_prepare_enable(clk[gpio3_gate]);
|
clk_prepare_enable(clk[gpio3_gate]);
|
||||||
clk_prepare_enable(clk[iim_gate]);
|
clk_prepare_enable(clk[iim_gate]);
|
||||||
clk_prepare_enable(clk[emi_gate]);
|
clk_prepare_enable(clk[emi_gate]);
|
||||||
|
clk_prepare_enable(clk[max_gate]);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* SCC is needed to boot via mmc after a watchdog reset. The clock code
|
* SCC is needed to boot via mmc after a watchdog reset. The clock code
|
||||||
|
|
|
@ -27,6 +27,11 @@ static const char * const imx25_dt_board_compat[] __initconst = {
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void __init imx25_timer_init(void)
|
||||||
|
{
|
||||||
|
mx25_clocks_init_dt();
|
||||||
|
}
|
||||||
|
|
||||||
DT_MACHINE_START(IMX25_DT, "Freescale i.MX25 (Device Tree Support)")
|
DT_MACHINE_START(IMX25_DT, "Freescale i.MX25 (Device Tree Support)")
|
||||||
.map_io = mx25_map_io,
|
.map_io = mx25_map_io,
|
||||||
.init_early = imx25_init_early,
|
.init_early = imx25_init_early,
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
|
|
||||||
#include <asm/mach/arch.h>
|
#include <asm/mach/arch.h>
|
||||||
|
|
|
@ -1,6 +1,2 @@
|
||||||
# Common support
|
|
||||||
obj-y := icoll.o ocotp.o system.o timer.o mm.o
|
|
||||||
|
|
||||||
obj-$(CONFIG_PM) += pm.o
|
obj-$(CONFIG_PM) += pm.o
|
||||||
|
|
||||||
obj-$(CONFIG_MACH_MXS_DT) += mach-mxs.o
|
obj-$(CONFIG_MACH_MXS_DT) += mach-mxs.o
|
||||||
|
|
|
@ -1,29 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2004-2007 Freescale Semiconductor, Inc. All Rights Reserved.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License version 2 as
|
|
||||||
* published by the Free Software Foundation.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __MACH_MXS_COMMON_H__
|
|
||||||
#define __MACH_MXS_COMMON_H__
|
|
||||||
|
|
||||||
extern const u32 *mxs_get_ocotp(void);
|
|
||||||
extern int mxs_reset_block(void __iomem *);
|
|
||||||
extern void mxs_timer_init(void);
|
|
||||||
extern void mxs_restart(char, const char *);
|
|
||||||
extern int mxs_saif_clkmux_select(unsigned int clkmux);
|
|
||||||
|
|
||||||
extern int mx23_clocks_init(void);
|
|
||||||
extern void mx23_map_io(void);
|
|
||||||
|
|
||||||
extern int mx28_clocks_init(void);
|
|
||||||
extern void mx28_map_io(void);
|
|
||||||
|
|
||||||
extern void icoll_init_irq(void);
|
|
||||||
extern void icoll_handle_irq(struct pt_regs *);
|
|
||||||
|
|
||||||
#endif /* __MACH_MXS_COMMON_H__ */
|
|
|
@ -11,16 +11,13 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <mach/mx23.h>
|
|
||||||
#include <mach/mx28.h>
|
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_IMX23_UART
|
#ifdef CONFIG_DEBUG_IMX23_UART
|
||||||
#define UART_PADDR MX23_DUART_BASE_ADDR
|
#define UART_PADDR 0x80070000
|
||||||
#elif defined (CONFIG_DEBUG_IMX28_UART)
|
#elif defined (CONFIG_DEBUG_IMX28_UART)
|
||||||
#define UART_PADDR MX28_DUART_BASE_ADDR
|
#define UART_PADDR 0x80074000
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define UART_VADDR MXS_IO_ADDRESS(UART_PADDR)
|
#define UART_VADDR 0xfe100000
|
||||||
|
|
||||||
.macro addruart, rp, rv, tmp
|
.macro addruart, rp, rv, tmp
|
||||||
ldr \rp, =UART_PADDR @ physical
|
ldr \rp, =UART_PADDR @ physical
|
||||||
|
|
|
@ -1,22 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2011 Freescale Semiconductor, Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License version 2 as
|
|
||||||
* published by the Free Software Foundation.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __MACH_DIGCTL_H__
|
|
||||||
#define __MACH_DIGCTL_H__
|
|
||||||
|
|
||||||
/* MXS DIGCTL SAIF CLKMUX */
|
|
||||||
#define MXS_DIGCTL_SAIF_CLKMUX_DIRECT 0x0
|
|
||||||
#define MXS_DIGCTL_SAIF_CLKMUX_CROSSINPUT 0x1
|
|
||||||
#define MXS_DIGCTL_SAIF_CLKMUX_EXTMSTR0 0x2
|
|
||||||
#define MXS_DIGCTL_SAIF_CLKMUX_EXTMSTR1 0x3
|
|
||||||
|
|
||||||
#define HW_DIGCTL_CTRL 0x0
|
|
||||||
#define BP_DIGCTL_CTRL_SAIF_CLKMUX 10
|
|
||||||
#define BM_DIGCTL_CTRL_SAIF_CLKMUX (0x3 << 10)
|
|
||||||
#define HW_DIGCTL_CHIPID 0x310
|
|
||||||
#endif
|
|
|
@ -1,23 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2004-2007 Freescale Semiconductor, Inc. All Rights Reserved.
|
|
||||||
* Copyright 2008 Juergen Beisert, kernel@pengutronix.de
|
|
||||||
*
|
|
||||||
* 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., 51 Franklin Street, Fifth Floor, Boston,
|
|
||||||
* MA 02110-1301, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __MACH_MXS_HARDWARE_H__
|
|
||||||
#define __MACH_MXS_HARDWARE_H__
|
|
||||||
|
|
||||||
#endif /* __MACH_MXS_HARDWARE_H__ */
|
|
|
@ -1,169 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2009-2010 Freescale Semiconductor, Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* 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.,
|
|
||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __MACH_MX23_H__
|
|
||||||
#define __MACH_MX23_H__
|
|
||||||
|
|
||||||
#include <mach/mxs.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* OCRAM
|
|
||||||
*/
|
|
||||||
#define MX23_OCRAM_BASE_ADDR 0x00000000
|
|
||||||
#define MX23_OCRAM_SIZE SZ_32K
|
|
||||||
|
|
||||||
/*
|
|
||||||
* IO
|
|
||||||
*/
|
|
||||||
#define MX23_IO_BASE_ADDR 0x80000000
|
|
||||||
#define MX23_IO_SIZE SZ_1M
|
|
||||||
|
|
||||||
#define MX23_ICOLL_BASE_ADDR (MX23_IO_BASE_ADDR + 0x000000)
|
|
||||||
#define MX23_APBH_DMA_BASE_ADDR (MX23_IO_BASE_ADDR + 0x004000)
|
|
||||||
#define MX23_BCH_BASE_ADDR (MX23_IO_BASE_ADDR + 0x00a000)
|
|
||||||
#define MX23_GPMI_BASE_ADDR (MX23_IO_BASE_ADDR + 0x00c000)
|
|
||||||
#define MX23_SSP1_BASE_ADDR (MX23_IO_BASE_ADDR + 0x010000)
|
|
||||||
#define MX23_PINCTRL_BASE_ADDR (MX23_IO_BASE_ADDR + 0x018000)
|
|
||||||
#define MX23_DIGCTL_BASE_ADDR (MX23_IO_BASE_ADDR + 0x01c000)
|
|
||||||
#define MX23_ETM_BASE_ADDR (MX23_IO_BASE_ADDR + 0x020000)
|
|
||||||
#define MX23_APBX_DMA_BASE_ADDR (MX23_IO_BASE_ADDR + 0x024000)
|
|
||||||
#define MX23_DCP_BASE_ADDR (MX23_IO_BASE_ADDR + 0x028000)
|
|
||||||
#define MX23_PXP_BASE_ADDR (MX23_IO_BASE_ADDR + 0x02a000)
|
|
||||||
#define MX23_OCOTP_BASE_ADDR (MX23_IO_BASE_ADDR + 0x02c000)
|
|
||||||
#define MX23_AXI_AHB0_BASE_ADDR (MX23_IO_BASE_ADDR + 0x02e000)
|
|
||||||
#define MX23_LCDIF_BASE_ADDR (MX23_IO_BASE_ADDR + 0x030000)
|
|
||||||
#define MX23_SSP2_BASE_ADDR (MX23_IO_BASE_ADDR + 0x034000)
|
|
||||||
#define MX23_TVENC_BASE_ADDR (MX23_IO_BASE_ADDR + 0x038000)
|
|
||||||
#define MX23_CLKCTRL_BASE_ADDR (MX23_IO_BASE_ADDR + 0x040000)
|
|
||||||
#define MX23_SAIF0_BASE_ADDR (MX23_IO_BASE_ADDR + 0x042000)
|
|
||||||
#define MX23_POWER_BASE_ADDR (MX23_IO_BASE_ADDR + 0x044000)
|
|
||||||
#define MX23_SAIF1_BASE_ADDR (MX23_IO_BASE_ADDR + 0x046000)
|
|
||||||
#define MX23_AUDIOOUT_BASE_ADDR (MX23_IO_BASE_ADDR + 0x048000)
|
|
||||||
#define MX23_AUDIOIN_BASE_ADDR (MX23_IO_BASE_ADDR + 0x04c000)
|
|
||||||
#define MX23_LRADC_BASE_ADDR (MX23_IO_BASE_ADDR + 0x050000)
|
|
||||||
#define MX23_SPDIF_BASE_ADDR (MX23_IO_BASE_ADDR + 0x054000)
|
|
||||||
#define MX23_I2C_BASE_ADDR (MX23_IO_BASE_ADDR + 0x058000)
|
|
||||||
#define MX23_RTC_BASE_ADDR (MX23_IO_BASE_ADDR + 0x05c000)
|
|
||||||
#define MX23_PWM_BASE_ADDR (MX23_IO_BASE_ADDR + 0x064000)
|
|
||||||
#define MX23_TIMROT_BASE_ADDR (MX23_IO_BASE_ADDR + 0x068000)
|
|
||||||
#define MX23_AUART1_BASE_ADDR (MX23_IO_BASE_ADDR + 0x06c000)
|
|
||||||
#define MX23_AUART2_BASE_ADDR (MX23_IO_BASE_ADDR + 0x06e000)
|
|
||||||
#define MX23_DUART_BASE_ADDR (MX23_IO_BASE_ADDR + 0x070000)
|
|
||||||
#define MX23_USBPHY_BASE_ADDR (MX23_IO_BASE_ADDR + 0x07c000)
|
|
||||||
#define MX23_USBCTRL_BASE_ADDR (MX23_IO_BASE_ADDR + 0x080000)
|
|
||||||
#define MX23_DRAM_BASE_ADDR (MX23_IO_BASE_ADDR + 0x0e0000)
|
|
||||||
|
|
||||||
#define MX23_IO_P2V(x) MXS_IO_P2V(x)
|
|
||||||
#define MX23_IO_ADDRESS(x) IOMEM(MX23_IO_P2V(x))
|
|
||||||
|
|
||||||
/*
|
|
||||||
* IRQ
|
|
||||||
*/
|
|
||||||
#define MX23_INT_DUART 0
|
|
||||||
#define MX23_INT_COMMS_RX 1
|
|
||||||
#define MX23_INT_COMMS_TX 1
|
|
||||||
#define MX23_INT_SSP2_ERROR 2
|
|
||||||
#define MX23_INT_VDD5V 3
|
|
||||||
#define MX23_INT_HEADPHONE_SHORT 4
|
|
||||||
#define MX23_INT_DAC_DMA 5
|
|
||||||
#define MX23_INT_DAC_ERROR 6
|
|
||||||
#define MX23_INT_ADC_DMA 7
|
|
||||||
#define MX23_INT_ADC_ERROR 8
|
|
||||||
#define MX23_INT_SPDIF_DMA 9
|
|
||||||
#define MX23_INT_SAIF2_DMA 9
|
|
||||||
#define MX23_INT_SPDIF_ERROR 10
|
|
||||||
#define MX23_INT_SAIF1_IRQ 10
|
|
||||||
#define MX23_INT_SAIF2_IRQ 10
|
|
||||||
#define MX23_INT_USB_CTRL 11
|
|
||||||
#define MX23_INT_USB_WAKEUP 12
|
|
||||||
#define MX23_INT_GPMI_DMA 13
|
|
||||||
#define MX23_INT_SSP1_DMA 14
|
|
||||||
#define MX23_INT_SSP1_ERROR 15
|
|
||||||
#define MX23_INT_GPIO0 16
|
|
||||||
#define MX23_INT_GPIO1 17
|
|
||||||
#define MX23_INT_GPIO2 18
|
|
||||||
#define MX23_INT_SAIF1_DMA 19
|
|
||||||
#define MX23_INT_SSP2_DMA 20
|
|
||||||
#define MX23_INT_ECC8_IRQ 21
|
|
||||||
#define MX23_INT_RTC_ALARM 22
|
|
||||||
#define MX23_INT_AUART1_TX_DMA 23
|
|
||||||
#define MX23_INT_AUART1 24
|
|
||||||
#define MX23_INT_AUART1_RX_DMA 25
|
|
||||||
#define MX23_INT_I2C_DMA 26
|
|
||||||
#define MX23_INT_I2C_ERROR 27
|
|
||||||
#define MX23_INT_TIMER0 28
|
|
||||||
#define MX23_INT_TIMER1 29
|
|
||||||
#define MX23_INT_TIMER2 30
|
|
||||||
#define MX23_INT_TIMER3 31
|
|
||||||
#define MX23_INT_BATT_BRNOUT 32
|
|
||||||
#define MX23_INT_VDDD_BRNOUT 33
|
|
||||||
#define MX23_INT_VDDIO_BRNOUT 34
|
|
||||||
#define MX23_INT_VDD18_BRNOUT 35
|
|
||||||
#define MX23_INT_TOUCH_DETECT 36
|
|
||||||
#define MX23_INT_LRADC_CH0 37
|
|
||||||
#define MX23_INT_LRADC_CH1 38
|
|
||||||
#define MX23_INT_LRADC_CH2 39
|
|
||||||
#define MX23_INT_LRADC_CH3 40
|
|
||||||
#define MX23_INT_LRADC_CH4 41
|
|
||||||
#define MX23_INT_LRADC_CH5 42
|
|
||||||
#define MX23_INT_LRADC_CH6 43
|
|
||||||
#define MX23_INT_LRADC_CH7 44
|
|
||||||
#define MX23_INT_LCDIF_DMA 45
|
|
||||||
#define MX23_INT_LCDIF_ERROR 46
|
|
||||||
#define MX23_INT_DIGCTL_DEBUG_TRAP 47
|
|
||||||
#define MX23_INT_RTC_1MSEC 48
|
|
||||||
#define MX23_INT_DRI_DMA 49
|
|
||||||
#define MX23_INT_DRI_ATTENTION 50
|
|
||||||
#define MX23_INT_GPMI_ATTENTION 51
|
|
||||||
#define MX23_INT_IR 52
|
|
||||||
#define MX23_INT_DCP_VMI 53
|
|
||||||
#define MX23_INT_DCP 54
|
|
||||||
#define MX23_INT_BCH 56
|
|
||||||
#define MX23_INT_PXP 57
|
|
||||||
#define MX23_INT_AUART2_TX_DMA 58
|
|
||||||
#define MX23_INT_AUART2 59
|
|
||||||
#define MX23_INT_AUART2_RX_DMA 60
|
|
||||||
#define MX23_INT_VDAC_DETECT 61
|
|
||||||
#define MX23_INT_VDD5V_DROOP 64
|
|
||||||
#define MX23_INT_DCDC4P2_BO 65
|
|
||||||
|
|
||||||
/*
|
|
||||||
* APBH DMA
|
|
||||||
*/
|
|
||||||
#define MX23_DMA_SSP1 1
|
|
||||||
#define MX23_DMA_SSP2 2
|
|
||||||
#define MX23_DMA_GPMI0 4
|
|
||||||
#define MX23_DMA_GPMI1 5
|
|
||||||
#define MX23_DMA_GPMI2 6
|
|
||||||
#define MX23_DMA_GPMI3 7
|
|
||||||
|
|
||||||
/*
|
|
||||||
* APBX DMA
|
|
||||||
*/
|
|
||||||
#define MX23_DMA_ADC 0
|
|
||||||
#define MX23_DMA_DAC 1
|
|
||||||
#define MX23_DMA_SPDIF 2
|
|
||||||
#define MX23_DMA_I2C 3
|
|
||||||
#define MX23_DMA_SAIF0 4
|
|
||||||
#define MX23_DMA_UART0_RX 6
|
|
||||||
#define MX23_DMA_UART0_TX 7
|
|
||||||
#define MX23_DMA_UART1_RX 8
|
|
||||||
#define MX23_DMA_UART1_TX 9
|
|
||||||
#define MX23_DMA_SAIF1 10
|
|
||||||
|
|
||||||
#endif /* __MACH_MX23_H__ */
|
|
|
@ -1,225 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2009-2010 Freescale Semiconductor, Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* 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.,
|
|
||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __MACH_MX28_H__
|
|
||||||
#define __MACH_MX28_H__
|
|
||||||
|
|
||||||
#include <mach/mxs.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* OCRAM
|
|
||||||
*/
|
|
||||||
#define MX28_OCRAM_BASE_ADDR 0x00000000
|
|
||||||
#define MX28_OCRAM_SIZE SZ_128K
|
|
||||||
|
|
||||||
/*
|
|
||||||
* IO
|
|
||||||
*/
|
|
||||||
#define MX28_IO_BASE_ADDR 0x80000000
|
|
||||||
#define MX28_IO_SIZE SZ_1M
|
|
||||||
|
|
||||||
#define MX28_ICOLL_BASE_ADDR (MX28_IO_BASE_ADDR + 0x000000)
|
|
||||||
#define MX28_HSADC_BASE_ADDR (MX28_IO_BASE_ADDR + 0x002000)
|
|
||||||
#define MX28_APBH_DMA_BASE_ADDR (MX28_IO_BASE_ADDR + 0x004000)
|
|
||||||
#define MX28_PERFMON_BASE_ADDR (MX28_IO_BASE_ADDR + 0x006000)
|
|
||||||
#define MX28_BCH_BASE_ADDR (MX28_IO_BASE_ADDR + 0x00a000)
|
|
||||||
#define MX28_GPMI_BASE_ADDR (MX28_IO_BASE_ADDR + 0x00c000)
|
|
||||||
#define MX28_SSP0_BASE_ADDR (MX28_IO_BASE_ADDR + 0x010000)
|
|
||||||
#define MX28_SSP1_BASE_ADDR (MX28_IO_BASE_ADDR + 0x012000)
|
|
||||||
#define MX28_SSP2_BASE_ADDR (MX28_IO_BASE_ADDR + 0x014000)
|
|
||||||
#define MX28_SSP3_BASE_ADDR (MX28_IO_BASE_ADDR + 0x016000)
|
|
||||||
#define MX28_PINCTRL_BASE_ADDR (MX28_IO_BASE_ADDR + 0x018000)
|
|
||||||
#define MX28_DIGCTL_BASE_ADDR (MX28_IO_BASE_ADDR + 0x01c000)
|
|
||||||
#define MX28_ETM_BASE_ADDR (MX28_IO_BASE_ADDR + 0x022000)
|
|
||||||
#define MX28_APBX_DMA_BASE_ADDR (MX28_IO_BASE_ADDR + 0x024000)
|
|
||||||
#define MX28_DCP_BASE_ADDR (MX28_IO_BASE_ADDR + 0x028000)
|
|
||||||
#define MX28_PXP_BASE_ADDR (MX28_IO_BASE_ADDR + 0x02a000)
|
|
||||||
#define MX28_OCOTP_BASE_ADDR (MX28_IO_BASE_ADDR + 0x02c000)
|
|
||||||
#define MX28_AXI_AHB0_BASE_ADDR (MX28_IO_BASE_ADDR + 0x02e000)
|
|
||||||
#define MX28_LCDIF_BASE_ADDR (MX28_IO_BASE_ADDR + 0x030000)
|
|
||||||
#define MX28_CAN0_BASE_ADDR (MX28_IO_BASE_ADDR + 0x032000)
|
|
||||||
#define MX28_CAN1_BASE_ADDR (MX28_IO_BASE_ADDR + 0x034000)
|
|
||||||
#define MX28_SIMDBG_BASE_ADDR (MX28_IO_BASE_ADDR + 0x03c000)
|
|
||||||
#define MX28_SIMGPMISEL_BASE_ADDR (MX28_IO_BASE_ADDR + 0x03c200)
|
|
||||||
#define MX28_SIMSSPSEL_BASE_ADDR (MX28_IO_BASE_ADDR + 0x03c300)
|
|
||||||
#define MX28_SIMMEMSEL_BASE_ADDR (MX28_IO_BASE_ADDR + 0x03c400)
|
|
||||||
#define MX28_GPIOMON_BASE_ADDR (MX28_IO_BASE_ADDR + 0x03c500)
|
|
||||||
#define MX28_SIMENET_BASE_ADDR (MX28_IO_BASE_ADDR + 0x03c700)
|
|
||||||
#define MX28_ARMJTAG_BASE_ADDR (MX28_IO_BASE_ADDR + 0x03c800)
|
|
||||||
#define MX28_CLKCTRL_BASE_ADDR (MX28_IO_BASE_ADDR + 0x040000)
|
|
||||||
#define MX28_SAIF0_BASE_ADDR (MX28_IO_BASE_ADDR + 0x042000)
|
|
||||||
#define MX28_POWER_BASE_ADDR (MX28_IO_BASE_ADDR + 0x044000)
|
|
||||||
#define MX28_SAIF1_BASE_ADDR (MX28_IO_BASE_ADDR + 0x046000)
|
|
||||||
#define MX28_LRADC_BASE_ADDR (MX28_IO_BASE_ADDR + 0x050000)
|
|
||||||
#define MX28_SPDIF_BASE_ADDR (MX28_IO_BASE_ADDR + 0x054000)
|
|
||||||
#define MX28_RTC_BASE_ADDR (MX28_IO_BASE_ADDR + 0x056000)
|
|
||||||
#define MX28_I2C0_BASE_ADDR (MX28_IO_BASE_ADDR + 0x058000)
|
|
||||||
#define MX28_I2C1_BASE_ADDR (MX28_IO_BASE_ADDR + 0x05a000)
|
|
||||||
#define MX28_PWM_BASE_ADDR (MX28_IO_BASE_ADDR + 0x064000)
|
|
||||||
#define MX28_TIMROT_BASE_ADDR (MX28_IO_BASE_ADDR + 0x068000)
|
|
||||||
#define MX28_AUART0_BASE_ADDR (MX28_IO_BASE_ADDR + 0x06a000)
|
|
||||||
#define MX28_AUART1_BASE_ADDR (MX28_IO_BASE_ADDR + 0x06c000)
|
|
||||||
#define MX28_AUART2_BASE_ADDR (MX28_IO_BASE_ADDR + 0x06e000)
|
|
||||||
#define MX28_AUART3_BASE_ADDR (MX28_IO_BASE_ADDR + 0x070000)
|
|
||||||
#define MX28_AUART4_BASE_ADDR (MX28_IO_BASE_ADDR + 0x072000)
|
|
||||||
#define MX28_DUART_BASE_ADDR (MX28_IO_BASE_ADDR + 0x074000)
|
|
||||||
#define MX28_USBPHY0_BASE_ADDR (MX28_IO_BASE_ADDR + 0x07C000)
|
|
||||||
#define MX28_USBPHY1_BASE_ADDR (MX28_IO_BASE_ADDR + 0x07e000)
|
|
||||||
#define MX28_USBCTRL0_BASE_ADDR (MX28_IO_BASE_ADDR + 0x080000)
|
|
||||||
#define MX28_USBCTRL1_BASE_ADDR (MX28_IO_BASE_ADDR + 0x090000)
|
|
||||||
#define MX28_DFLPT_BASE_ADDR (MX28_IO_BASE_ADDR + 0x0c0000)
|
|
||||||
#define MX28_DRAM_BASE_ADDR (MX28_IO_BASE_ADDR + 0x0e0000)
|
|
||||||
#define MX28_ENET_MAC0_BASE_ADDR (MX28_IO_BASE_ADDR + 0x0f0000)
|
|
||||||
#define MX28_ENET_MAC1_BASE_ADDR (MX28_IO_BASE_ADDR + 0x0f4000)
|
|
||||||
|
|
||||||
#define MX28_IO_P2V(x) MXS_IO_P2V(x)
|
|
||||||
#define MX28_IO_ADDRESS(x) IOMEM(MX28_IO_P2V(x))
|
|
||||||
|
|
||||||
/*
|
|
||||||
* IRQ
|
|
||||||
*/
|
|
||||||
#define MX28_INT_BATT_BRNOUT 0
|
|
||||||
#define MX28_INT_VDDD_BRNOUT 1
|
|
||||||
#define MX28_INT_VDDIO_BRNOUT 2
|
|
||||||
#define MX28_INT_VDDA_BRNOUT 3
|
|
||||||
#define MX28_INT_VDD5V_DROOP 4
|
|
||||||
#define MX28_INT_DCDC4P2_BRNOUT 5
|
|
||||||
#define MX28_INT_VDD5V 6
|
|
||||||
#define MX28_INT_CAN0 8
|
|
||||||
#define MX28_INT_CAN1 9
|
|
||||||
#define MX28_INT_LRADC_TOUCH 10
|
|
||||||
#define MX28_INT_HSADC 13
|
|
||||||
#define MX28_INT_LRADC_THRESH0 14
|
|
||||||
#define MX28_INT_LRADC_THRESH1 15
|
|
||||||
#define MX28_INT_LRADC_CH0 16
|
|
||||||
#define MX28_INT_LRADC_CH1 17
|
|
||||||
#define MX28_INT_LRADC_CH2 18
|
|
||||||
#define MX28_INT_LRADC_CH3 19
|
|
||||||
#define MX28_INT_LRADC_CH4 20
|
|
||||||
#define MX28_INT_LRADC_CH5 21
|
|
||||||
#define MX28_INT_LRADC_CH6 22
|
|
||||||
#define MX28_INT_LRADC_CH7 23
|
|
||||||
#define MX28_INT_LRADC_BUTTON0 24
|
|
||||||
#define MX28_INT_LRADC_BUTTON1 25
|
|
||||||
#define MX28_INT_PERFMON 27
|
|
||||||
#define MX28_INT_RTC_1MSEC 28
|
|
||||||
#define MX28_INT_RTC_ALARM 29
|
|
||||||
#define MX28_INT_COMMS 31
|
|
||||||
#define MX28_INT_EMI_ERR 32
|
|
||||||
#define MX28_INT_LCDIF 38
|
|
||||||
#define MX28_INT_PXP 39
|
|
||||||
#define MX28_INT_BCH 41
|
|
||||||
#define MX28_INT_GPMI 42
|
|
||||||
#define MX28_INT_SPDIF_ERROR 45
|
|
||||||
#define MX28_INT_DUART 47
|
|
||||||
#define MX28_INT_TIMER0 48
|
|
||||||
#define MX28_INT_TIMER1 49
|
|
||||||
#define MX28_INT_TIMER2 50
|
|
||||||
#define MX28_INT_TIMER3 51
|
|
||||||
#define MX28_INT_DCP_VMI 52
|
|
||||||
#define MX28_INT_DCP 53
|
|
||||||
#define MX28_INT_DCP_SECURE 54
|
|
||||||
#define MX28_INT_SAIF1 58
|
|
||||||
#define MX28_INT_SAIF0 59
|
|
||||||
#define MX28_INT_SPDIF_DMA 66
|
|
||||||
#define MX28_INT_I2C0_DMA 68
|
|
||||||
#define MX28_INT_I2C1_DMA 69
|
|
||||||
#define MX28_INT_AUART0_RX_DMA 70
|
|
||||||
#define MX28_INT_AUART0_TX_DMA 71
|
|
||||||
#define MX28_INT_AUART1_RX_DMA 72
|
|
||||||
#define MX28_INT_AUART1_TX_DMA 73
|
|
||||||
#define MX28_INT_AUART2_RX_DMA 74
|
|
||||||
#define MX28_INT_AUART2_TX_DMA 75
|
|
||||||
#define MX28_INT_AUART3_RX_DMA 76
|
|
||||||
#define MX28_INT_AUART3_TX_DMA 77
|
|
||||||
#define MX28_INT_AUART4_RX_DMA 78
|
|
||||||
#define MX28_INT_AUART4_TX_DMA 79
|
|
||||||
#define MX28_INT_SAIF0_DMA 80
|
|
||||||
#define MX28_INT_SAIF1_DMA 81
|
|
||||||
#define MX28_INT_SSP0_DMA 82
|
|
||||||
#define MX28_INT_SSP1_DMA 83
|
|
||||||
#define MX28_INT_SSP2_DMA 84
|
|
||||||
#define MX28_INT_SSP3_DMA 85
|
|
||||||
#define MX28_INT_LCDIF_DMA 86
|
|
||||||
#define MX28_INT_HSADC_DMA 87
|
|
||||||
#define MX28_INT_GPMI_DMA 88
|
|
||||||
#define MX28_INT_DIGCTL_DEBUG_TRAP 89
|
|
||||||
#define MX28_INT_USB1 92
|
|
||||||
#define MX28_INT_USB0 93
|
|
||||||
#define MX28_INT_USB1_WAKEUP 94
|
|
||||||
#define MX28_INT_USB0_WAKEUP 95
|
|
||||||
#define MX28_INT_SSP0_ERROR 96
|
|
||||||
#define MX28_INT_SSP1_ERROR 97
|
|
||||||
#define MX28_INT_SSP2_ERROR 98
|
|
||||||
#define MX28_INT_SSP3_ERROR 99
|
|
||||||
#define MX28_INT_ENET_SWI 100
|
|
||||||
#define MX28_INT_ENET_MAC0 101
|
|
||||||
#define MX28_INT_ENET_MAC1 102
|
|
||||||
#define MX28_INT_ENET_MAC0_1588 103
|
|
||||||
#define MX28_INT_ENET_MAC1_1588 104
|
|
||||||
#define MX28_INT_I2C1_ERROR 110
|
|
||||||
#define MX28_INT_I2C0_ERROR 111
|
|
||||||
#define MX28_INT_AUART0 112
|
|
||||||
#define MX28_INT_AUART1 113
|
|
||||||
#define MX28_INT_AUART2 114
|
|
||||||
#define MX28_INT_AUART3 115
|
|
||||||
#define MX28_INT_AUART4 116
|
|
||||||
#define MX28_INT_GPIO4 123
|
|
||||||
#define MX28_INT_GPIO3 124
|
|
||||||
#define MX28_INT_GPIO2 125
|
|
||||||
#define MX28_INT_GPIO1 126
|
|
||||||
#define MX28_INT_GPIO0 127
|
|
||||||
|
|
||||||
/*
|
|
||||||
* APBH DMA
|
|
||||||
*/
|
|
||||||
#define MX28_DMA_SSP0 0
|
|
||||||
#define MX28_DMA_SSP1 1
|
|
||||||
#define MX28_DMA_SSP2 2
|
|
||||||
#define MX28_DMA_SSP3 3
|
|
||||||
#define MX28_DMA_GPMI0 4
|
|
||||||
#define MX28_DMA_GPMI1 5
|
|
||||||
#define MX28_DMA_GPMI2 6
|
|
||||||
#define MX28_DMA_GPMI3 7
|
|
||||||
#define MX28_DMA_GPMI4 8
|
|
||||||
#define MX28_DMA_GPMI5 9
|
|
||||||
#define MX28_DMA_GPMI6 10
|
|
||||||
#define MX28_DMA_GPMI7 11
|
|
||||||
#define MX28_DMA_HSADC 12
|
|
||||||
#define MX28_DMA_LCDIF 13
|
|
||||||
|
|
||||||
/*
|
|
||||||
* APBX DMA
|
|
||||||
*/
|
|
||||||
#define MX28_DMA_AUART4_RX 0
|
|
||||||
#define MX28_DMA_AUART4_TX 1
|
|
||||||
#define MX28_DMA_SPDIF_TX 2
|
|
||||||
#define MX28_DMA_SAIF0 4
|
|
||||||
#define MX28_DMA_SAIF1 5
|
|
||||||
#define MX28_DMA_I2C0 6
|
|
||||||
#define MX28_DMA_I2C1 7
|
|
||||||
#define MX28_DMA_AUART0_RX 8
|
|
||||||
#define MX28_DMA_AUART0_TX 9
|
|
||||||
#define MX28_DMA_AUART1_RX 10
|
|
||||||
#define MX28_DMA_AUART1_TX 11
|
|
||||||
#define MX28_DMA_AUART2_RX 12
|
|
||||||
#define MX28_DMA_AUART2_TX 13
|
|
||||||
#define MX28_DMA_AUART3_RX 14
|
|
||||||
#define MX28_DMA_AUART3_TX 15
|
|
||||||
|
|
||||||
#endif /* __MACH_MX28_H__ */
|
|
|
@ -1,117 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2009-2010 Freescale Semiconductor, Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* 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.,
|
|
||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __MACH_MXS_H__
|
|
||||||
#define __MACH_MXS_H__
|
|
||||||
|
|
||||||
#ifndef __ASSEMBLER__
|
|
||||||
#include <linux/io.h>
|
|
||||||
#endif
|
|
||||||
#include <asm/mach-types.h>
|
|
||||||
#include <mach/digctl.h>
|
|
||||||
#include <mach/hardware.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* IO addresses common to MXS-based
|
|
||||||
*/
|
|
||||||
#define MXS_IO_BASE_ADDR 0x80000000
|
|
||||||
#define MXS_IO_SIZE SZ_1M
|
|
||||||
|
|
||||||
#define MXS_ICOLL_BASE_ADDR (MXS_IO_BASE_ADDR + 0x000000)
|
|
||||||
#define MXS_APBH_DMA_BASE_ADDR (MXS_IO_BASE_ADDR + 0x004000)
|
|
||||||
#define MXS_BCH_BASE_ADDR (MXS_IO_BASE_ADDR + 0x00a000)
|
|
||||||
#define MXS_GPMI_BASE_ADDR (MXS_IO_BASE_ADDR + 0x00c000)
|
|
||||||
#define MXS_PINCTRL_BASE_ADDR (MXS_IO_BASE_ADDR + 0x018000)
|
|
||||||
#define MXS_DIGCTL_BASE_ADDR (MXS_IO_BASE_ADDR + 0x01c000)
|
|
||||||
#define MXS_APBX_DMA_BASE_ADDR (MXS_IO_BASE_ADDR + 0x024000)
|
|
||||||
#define MXS_DCP_BASE_ADDR (MXS_IO_BASE_ADDR + 0x028000)
|
|
||||||
#define MXS_PXP_BASE_ADDR (MXS_IO_BASE_ADDR + 0x02a000)
|
|
||||||
#define MXS_OCOTP_BASE_ADDR (MXS_IO_BASE_ADDR + 0x02c000)
|
|
||||||
#define MXS_AXI_AHB0_BASE_ADDR (MXS_IO_BASE_ADDR + 0x02e000)
|
|
||||||
#define MXS_LCDIF_BASE_ADDR (MXS_IO_BASE_ADDR + 0x030000)
|
|
||||||
#define MXS_CLKCTRL_BASE_ADDR (MXS_IO_BASE_ADDR + 0x040000)
|
|
||||||
#define MXS_SAIF0_BASE_ADDR (MXS_IO_BASE_ADDR + 0x042000)
|
|
||||||
#define MXS_POWER_BASE_ADDR (MXS_IO_BASE_ADDR + 0x044000)
|
|
||||||
#define MXS_SAIF1_BASE_ADDR (MXS_IO_BASE_ADDR + 0x046000)
|
|
||||||
#define MXS_LRADC_BASE_ADDR (MXS_IO_BASE_ADDR + 0x050000)
|
|
||||||
#define MXS_SPDIF_BASE_ADDR (MXS_IO_BASE_ADDR + 0x054000)
|
|
||||||
#define MXS_I2C0_BASE_ADDR (MXS_IO_BASE_ADDR + 0x058000)
|
|
||||||
#define MXS_PWM_BASE_ADDR (MXS_IO_BASE_ADDR + 0x064000)
|
|
||||||
#define MXS_TIMROT_BASE_ADDR (MXS_IO_BASE_ADDR + 0x068000)
|
|
||||||
#define MXS_AUART1_BASE_ADDR (MXS_IO_BASE_ADDR + 0x06c000)
|
|
||||||
#define MXS_AUART2_BASE_ADDR (MXS_IO_BASE_ADDR + 0x06e000)
|
|
||||||
#define MXS_DRAM_BASE_ADDR (MXS_IO_BASE_ADDR + 0x0e0000)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* It maps the whole address space to [0xf4000000, 0xf50fffff].
|
|
||||||
*
|
|
||||||
* OCRAM 0x00000000+0x020000 -> 0xf4000000+0x020000
|
|
||||||
* IO 0x80000000+0x100000 -> 0xf5000000+0x100000
|
|
||||||
*/
|
|
||||||
#define MXS_IO_P2V(x) (0xf4000000 + \
|
|
||||||
(((x) & 0x80000000) >> 7) + \
|
|
||||||
(((x) & 0x000fffff)))
|
|
||||||
|
|
||||||
#define MXS_IO_ADDRESS(x) IOMEM(MXS_IO_P2V(x))
|
|
||||||
|
|
||||||
#define mxs_map_entry(soc, name, _type) { \
|
|
||||||
.virtual = soc ## _IO_P2V(soc ## _ ## name ## _BASE_ADDR), \
|
|
||||||
.pfn = __phys_to_pfn(soc ## _ ## name ## _BASE_ADDR), \
|
|
||||||
.length = soc ## _ ## name ## _SIZE, \
|
|
||||||
.type = _type, \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define MXS_GPIO_NR(bank, nr) ((bank) * 32 + (nr))
|
|
||||||
|
|
||||||
#define MXS_SET_ADDR 0x4
|
|
||||||
#define MXS_CLR_ADDR 0x8
|
|
||||||
#define MXS_TOG_ADDR 0xc
|
|
||||||
|
|
||||||
#ifndef __ASSEMBLER__
|
|
||||||
static inline void __mxs_setl(u32 mask, void __iomem *reg)
|
|
||||||
{
|
|
||||||
__raw_writel(mask, reg + MXS_SET_ADDR);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void __mxs_clrl(u32 mask, void __iomem *reg)
|
|
||||||
{
|
|
||||||
__raw_writel(mask, reg + MXS_CLR_ADDR);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void __mxs_togl(u32 mask, void __iomem *reg)
|
|
||||||
{
|
|
||||||
__raw_writel(mask, reg + MXS_TOG_ADDR);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* MXS CPU types
|
|
||||||
*/
|
|
||||||
#define MXS_CHIPID (MXS_IO_ADDRESS(MXS_DIGCTL_BASE_ADDR) + HW_DIGCTL_CHIPID)
|
|
||||||
|
|
||||||
static inline int cpu_is_mx23(void)
|
|
||||||
{
|
|
||||||
return ((__raw_readl(MXS_CHIPID) >> 16) == 0x3780);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int cpu_is_mx28(void)
|
|
||||||
{
|
|
||||||
return ((__raw_readl(MXS_CHIPID) >> 16) == 0x2800);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __MACH_MXS_H__ */
|
|
|
@ -11,22 +11,53 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/clk.h>
|
#include <linux/clk.h>
|
||||||
|
#include <linux/clk/mxs.h>
|
||||||
#include <linux/clkdev.h>
|
#include <linux/clkdev.h>
|
||||||
|
#include <linux/clocksource.h>
|
||||||
#include <linux/can/platform/flexcan.h>
|
#include <linux/can/platform/flexcan.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/err.h>
|
#include <linux/err.h>
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
#include <linux/irqchip.h>
|
||||||
|
#include <linux/irqchip/mxs.h>
|
||||||
#include <linux/micrel_phy.h>
|
#include <linux/micrel_phy.h>
|
||||||
#include <linux/mxsfb.h>
|
#include <linux/mxsfb.h>
|
||||||
|
#include <linux/of_address.h>
|
||||||
#include <linux/of_platform.h>
|
#include <linux/of_platform.h>
|
||||||
#include <linux/phy.h>
|
#include <linux/phy.h>
|
||||||
#include <linux/pinctrl/consumer.h>
|
#include <linux/pinctrl/consumer.h>
|
||||||
#include <asm/mach/arch.h>
|
#include <asm/mach/arch.h>
|
||||||
|
#include <asm/mach/map.h>
|
||||||
#include <asm/mach/time.h>
|
#include <asm/mach/time.h>
|
||||||
#include <mach/common.h>
|
#include <asm/system_misc.h>
|
||||||
#include <mach/digctl.h>
|
|
||||||
#include <mach/mxs.h>
|
/* MXS DIGCTL SAIF CLKMUX */
|
||||||
|
#define MXS_DIGCTL_SAIF_CLKMUX_DIRECT 0x0
|
||||||
|
#define MXS_DIGCTL_SAIF_CLKMUX_CROSSINPUT 0x1
|
||||||
|
#define MXS_DIGCTL_SAIF_CLKMUX_EXTMSTR0 0x2
|
||||||
|
#define MXS_DIGCTL_SAIF_CLKMUX_EXTMSTR1 0x3
|
||||||
|
|
||||||
|
#define MXS_GPIO_NR(bank, nr) ((bank) * 32 + (nr))
|
||||||
|
|
||||||
|
#define MXS_SET_ADDR 0x4
|
||||||
|
#define MXS_CLR_ADDR 0x8
|
||||||
|
#define MXS_TOG_ADDR 0xc
|
||||||
|
|
||||||
|
static inline void __mxs_setl(u32 mask, void __iomem *reg)
|
||||||
|
{
|
||||||
|
__raw_writel(mask, reg + MXS_SET_ADDR);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void __mxs_clrl(u32 mask, void __iomem *reg)
|
||||||
|
{
|
||||||
|
__raw_writel(mask, reg + MXS_CLR_ADDR);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void __mxs_togl(u32 mask, void __iomem *reg)
|
||||||
|
{
|
||||||
|
__raw_writel(mask, reg + MXS_TOG_ADDR);
|
||||||
|
}
|
||||||
|
|
||||||
static struct fb_videomode mx23evk_video_modes[] = {
|
static struct fb_videomode mx23evk_video_modes[] = {
|
||||||
{
|
{
|
||||||
|
@ -41,8 +72,6 @@ static struct fb_videomode mx23evk_video_modes[] = {
|
||||||
.lower_margin = 4,
|
.lower_margin = 4,
|
||||||
.hsync_len = 1,
|
.hsync_len = 1,
|
||||||
.vsync_len = 1,
|
.vsync_len = 1,
|
||||||
.sync = FB_SYNC_DATA_ENABLE_HIGH_ACT |
|
|
||||||
FB_SYNC_DOTCLK_FAILING_ACT,
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -59,8 +88,6 @@ static struct fb_videomode mx28evk_video_modes[] = {
|
||||||
.lower_margin = 10,
|
.lower_margin = 10,
|
||||||
.hsync_len = 10,
|
.hsync_len = 10,
|
||||||
.vsync_len = 10,
|
.vsync_len = 10,
|
||||||
.sync = FB_SYNC_DATA_ENABLE_HIGH_ACT |
|
|
||||||
FB_SYNC_DOTCLK_FAILING_ACT,
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -77,7 +104,6 @@ static struct fb_videomode m28evk_video_modes[] = {
|
||||||
.lower_margin = 45,
|
.lower_margin = 45,
|
||||||
.hsync_len = 1,
|
.hsync_len = 1,
|
||||||
.vsync_len = 1,
|
.vsync_len = 1,
|
||||||
.sync = FB_SYNC_DATA_ENABLE_HIGH_ACT,
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -94,9 +120,7 @@ static struct fb_videomode apx4devkit_video_modes[] = {
|
||||||
.lower_margin = 13,
|
.lower_margin = 13,
|
||||||
.hsync_len = 48,
|
.hsync_len = 48,
|
||||||
.vsync_len = 3,
|
.vsync_len = 3,
|
||||||
.sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT |
|
.sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
|
||||||
FB_SYNC_DATA_ENABLE_HIGH_ACT |
|
|
||||||
FB_SYNC_DOTCLK_FAILING_ACT,
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -113,9 +137,7 @@ static struct fb_videomode apf28dev_video_modes[] = {
|
||||||
.lower_margin = 0x15,
|
.lower_margin = 0x15,
|
||||||
.hsync_len = 64,
|
.hsync_len = 64,
|
||||||
.vsync_len = 4,
|
.vsync_len = 4,
|
||||||
.sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT |
|
.sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
|
||||||
FB_SYNC_DATA_ENABLE_HIGH_ACT |
|
|
||||||
FB_SYNC_DOTCLK_FAILING_ACT,
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -132,7 +154,6 @@ static struct fb_videomode cfa10049_video_modes[] = {
|
||||||
.lower_margin = 2,
|
.lower_margin = 2,
|
||||||
.hsync_len = 15,
|
.hsync_len = 15,
|
||||||
.vsync_len = 15,
|
.vsync_len = 15,
|
||||||
.sync = FB_SYNC_DATA_ENABLE_HIGH_ACT
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -175,14 +196,80 @@ static struct of_dev_auxdata mxs_auxdata_lookup[] __initdata = {
|
||||||
{ /* sentinel */ }
|
{ /* sentinel */ }
|
||||||
};
|
};
|
||||||
|
|
||||||
static void __init imx23_timer_init(void)
|
#define OCOTP_WORD_OFFSET 0x20
|
||||||
{
|
#define OCOTP_WORD_COUNT 0x20
|
||||||
mx23_clocks_init();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void __init imx28_timer_init(void)
|
#define BM_OCOTP_CTRL_BUSY (1 << 8)
|
||||||
|
#define BM_OCOTP_CTRL_ERROR (1 << 9)
|
||||||
|
#define BM_OCOTP_CTRL_RD_BANK_OPEN (1 << 12)
|
||||||
|
|
||||||
|
static DEFINE_MUTEX(ocotp_mutex);
|
||||||
|
static u32 ocotp_words[OCOTP_WORD_COUNT];
|
||||||
|
|
||||||
|
static const u32 *mxs_get_ocotp(void)
|
||||||
{
|
{
|
||||||
mx28_clocks_init();
|
struct device_node *np;
|
||||||
|
void __iomem *ocotp_base;
|
||||||
|
int timeout = 0x400;
|
||||||
|
size_t i;
|
||||||
|
static int once;
|
||||||
|
|
||||||
|
if (once)
|
||||||
|
return ocotp_words;
|
||||||
|
|
||||||
|
np = of_find_compatible_node(NULL, NULL, "fsl,ocotp");
|
||||||
|
ocotp_base = of_iomap(np, 0);
|
||||||
|
WARN_ON(!ocotp_base);
|
||||||
|
|
||||||
|
mutex_lock(&ocotp_mutex);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* clk_enable(hbus_clk) for ocotp can be skipped
|
||||||
|
* as it must be on when system is running.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* try to clear ERROR bit */
|
||||||
|
__mxs_clrl(BM_OCOTP_CTRL_ERROR, ocotp_base);
|
||||||
|
|
||||||
|
/* check both BUSY and ERROR cleared */
|
||||||
|
while ((__raw_readl(ocotp_base) &
|
||||||
|
(BM_OCOTP_CTRL_BUSY | BM_OCOTP_CTRL_ERROR)) && --timeout)
|
||||||
|
cpu_relax();
|
||||||
|
|
||||||
|
if (unlikely(!timeout))
|
||||||
|
goto error_unlock;
|
||||||
|
|
||||||
|
/* open OCOTP banks for read */
|
||||||
|
__mxs_setl(BM_OCOTP_CTRL_RD_BANK_OPEN, ocotp_base);
|
||||||
|
|
||||||
|
/* approximately wait 32 hclk cycles */
|
||||||
|
udelay(1);
|
||||||
|
|
||||||
|
/* poll BUSY bit becoming cleared */
|
||||||
|
timeout = 0x400;
|
||||||
|
while ((__raw_readl(ocotp_base) & BM_OCOTP_CTRL_BUSY) && --timeout)
|
||||||
|
cpu_relax();
|
||||||
|
|
||||||
|
if (unlikely(!timeout))
|
||||||
|
goto error_unlock;
|
||||||
|
|
||||||
|
for (i = 0; i < OCOTP_WORD_COUNT; i++)
|
||||||
|
ocotp_words[i] = __raw_readl(ocotp_base + OCOTP_WORD_OFFSET +
|
||||||
|
i * 0x10);
|
||||||
|
|
||||||
|
/* close banks for power saving */
|
||||||
|
__mxs_clrl(BM_OCOTP_CTRL_RD_BANK_OPEN, ocotp_base);
|
||||||
|
|
||||||
|
once = 1;
|
||||||
|
|
||||||
|
mutex_unlock(&ocotp_mutex);
|
||||||
|
|
||||||
|
return ocotp_words;
|
||||||
|
|
||||||
|
error_unlock:
|
||||||
|
mutex_unlock(&ocotp_mutex);
|
||||||
|
pr_err("%s: timeout in reading OCOTP\n", __func__);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
enum mac_oui {
|
enum mac_oui {
|
||||||
|
@ -259,6 +346,8 @@ static void __init imx23_evk_init(void)
|
||||||
mxsfb_pdata.mode_count = ARRAY_SIZE(mx23evk_video_modes);
|
mxsfb_pdata.mode_count = ARRAY_SIZE(mx23evk_video_modes);
|
||||||
mxsfb_pdata.default_bpp = 32;
|
mxsfb_pdata.default_bpp = 32;
|
||||||
mxsfb_pdata.ld_intf_width = STMLCDIF_24BIT;
|
mxsfb_pdata.ld_intf_width = STMLCDIF_24BIT;
|
||||||
|
mxsfb_pdata.sync = MXSFB_SYNC_DATA_ENABLE_HIGH_ACT |
|
||||||
|
MXSFB_SYNC_DOTCLK_FAILING_ACT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void enable_clk_enet_out(void)
|
static inline void enable_clk_enet_out(void)
|
||||||
|
@ -278,6 +367,8 @@ static void __init imx28_evk_init(void)
|
||||||
mxsfb_pdata.mode_count = ARRAY_SIZE(mx28evk_video_modes);
|
mxsfb_pdata.mode_count = ARRAY_SIZE(mx28evk_video_modes);
|
||||||
mxsfb_pdata.default_bpp = 32;
|
mxsfb_pdata.default_bpp = 32;
|
||||||
mxsfb_pdata.ld_intf_width = STMLCDIF_24BIT;
|
mxsfb_pdata.ld_intf_width = STMLCDIF_24BIT;
|
||||||
|
mxsfb_pdata.sync = MXSFB_SYNC_DATA_ENABLE_HIGH_ACT |
|
||||||
|
MXSFB_SYNC_DOTCLK_FAILING_ACT;
|
||||||
|
|
||||||
mxs_saif_clkmux_select(MXS_DIGCTL_SAIF_CLKMUX_EXTMSTR0);
|
mxs_saif_clkmux_select(MXS_DIGCTL_SAIF_CLKMUX_EXTMSTR0);
|
||||||
}
|
}
|
||||||
|
@ -297,6 +388,7 @@ static void __init m28evk_init(void)
|
||||||
mxsfb_pdata.mode_count = ARRAY_SIZE(m28evk_video_modes);
|
mxsfb_pdata.mode_count = ARRAY_SIZE(m28evk_video_modes);
|
||||||
mxsfb_pdata.default_bpp = 16;
|
mxsfb_pdata.default_bpp = 16;
|
||||||
mxsfb_pdata.ld_intf_width = STMLCDIF_18BIT;
|
mxsfb_pdata.ld_intf_width = STMLCDIF_18BIT;
|
||||||
|
mxsfb_pdata.sync = MXSFB_SYNC_DATA_ENABLE_HIGH_ACT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init sc_sps1_init(void)
|
static void __init sc_sps1_init(void)
|
||||||
|
@ -322,6 +414,8 @@ static void __init apx4devkit_init(void)
|
||||||
mxsfb_pdata.mode_count = ARRAY_SIZE(apx4devkit_video_modes);
|
mxsfb_pdata.mode_count = ARRAY_SIZE(apx4devkit_video_modes);
|
||||||
mxsfb_pdata.default_bpp = 32;
|
mxsfb_pdata.default_bpp = 32;
|
||||||
mxsfb_pdata.ld_intf_width = STMLCDIF_24BIT;
|
mxsfb_pdata.ld_intf_width = STMLCDIF_24BIT;
|
||||||
|
mxsfb_pdata.sync = MXSFB_SYNC_DATA_ENABLE_HIGH_ACT |
|
||||||
|
MXSFB_SYNC_DOTCLK_FAILING_ACT;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define ENET0_MDC__GPIO_4_0 MXS_GPIO_NR(4, 0)
|
#define ENET0_MDC__GPIO_4_0 MXS_GPIO_NR(4, 0)
|
||||||
|
@ -407,6 +501,7 @@ static void __init cfa10049_init(void)
|
||||||
mxsfb_pdata.mode_count = ARRAY_SIZE(cfa10049_video_modes);
|
mxsfb_pdata.mode_count = ARRAY_SIZE(cfa10049_video_modes);
|
||||||
mxsfb_pdata.default_bpp = 32;
|
mxsfb_pdata.default_bpp = 32;
|
||||||
mxsfb_pdata.ld_intf_width = STMLCDIF_18BIT;
|
mxsfb_pdata.ld_intf_width = STMLCDIF_18BIT;
|
||||||
|
mxsfb_pdata.sync = MXSFB_SYNC_DATA_ENABLE_HIGH_ACT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init cfa10037_init(void)
|
static void __init cfa10037_init(void)
|
||||||
|
@ -423,6 +518,8 @@ static void __init apf28_init(void)
|
||||||
mxsfb_pdata.mode_count = ARRAY_SIZE(apf28dev_video_modes);
|
mxsfb_pdata.mode_count = ARRAY_SIZE(apf28dev_video_modes);
|
||||||
mxsfb_pdata.default_bpp = 16;
|
mxsfb_pdata.default_bpp = 16;
|
||||||
mxsfb_pdata.ld_intf_width = STMLCDIF_16BIT;
|
mxsfb_pdata.ld_intf_width = STMLCDIF_16BIT;
|
||||||
|
mxsfb_pdata.sync = MXSFB_SYNC_DATA_ENABLE_HIGH_ACT |
|
||||||
|
MXSFB_SYNC_DOTCLK_FAILING_ACT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init mxs_machine_init(void)
|
static void __init mxs_machine_init(void)
|
||||||
|
@ -454,32 +551,62 @@ static void __init mxs_machine_init(void)
|
||||||
imx28_evk_post_init();
|
imx28_evk_post_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *imx23_dt_compat[] __initdata = {
|
#define MX23_CLKCTRL_RESET_OFFSET 0x120
|
||||||
|
#define MX28_CLKCTRL_RESET_OFFSET 0x1e0
|
||||||
|
#define MXS_CLKCTRL_RESET_CHIP (1 << 1)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Reset the system. It is called by machine_restart().
|
||||||
|
*/
|
||||||
|
static void mxs_restart(char mode, const char *cmd)
|
||||||
|
{
|
||||||
|
struct device_node *np;
|
||||||
|
void __iomem *reset_addr;
|
||||||
|
|
||||||
|
np = of_find_compatible_node(NULL, NULL, "fsl,clkctrl");
|
||||||
|
reset_addr = of_iomap(np, 0);
|
||||||
|
if (!reset_addr)
|
||||||
|
goto soft;
|
||||||
|
|
||||||
|
if (of_device_is_compatible(np, "fsl,imx23-clkctrl"))
|
||||||
|
reset_addr += MX23_CLKCTRL_RESET_OFFSET;
|
||||||
|
else
|
||||||
|
reset_addr += MX28_CLKCTRL_RESET_OFFSET;
|
||||||
|
|
||||||
|
/* reset the chip */
|
||||||
|
__mxs_setl(MXS_CLKCTRL_RESET_CHIP, reset_addr);
|
||||||
|
|
||||||
|
pr_err("Failed to assert the chip reset\n");
|
||||||
|
|
||||||
|
/* Delay to allow the serial port to show the message */
|
||||||
|
mdelay(50);
|
||||||
|
|
||||||
|
soft:
|
||||||
|
/* We'll take a jump through zero as a poor second */
|
||||||
|
soft_restart(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __init mxs_timer_init(void)
|
||||||
|
{
|
||||||
|
if (of_machine_is_compatible("fsl,imx23"))
|
||||||
|
mx23_clocks_init();
|
||||||
|
else
|
||||||
|
mx28_clocks_init();
|
||||||
|
clocksource_of_init();
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char *mxs_dt_compat[] __initdata = {
|
||||||
|
"fsl,imx28",
|
||||||
"fsl,imx23",
|
"fsl,imx23",
|
||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char *imx28_dt_compat[] __initdata = {
|
DT_MACHINE_START(MXS, "Freescale MXS (Device Tree)")
|
||||||
"fsl,imx28",
|
.map_io = debug_ll_io_init,
|
||||||
NULL,
|
.init_irq = irqchip_init,
|
||||||
};
|
|
||||||
|
|
||||||
DT_MACHINE_START(IMX23, "Freescale i.MX23 (Device Tree)")
|
|
||||||
.map_io = mx23_map_io,
|
|
||||||
.init_irq = icoll_init_irq,
|
|
||||||
.handle_irq = icoll_handle_irq,
|
.handle_irq = icoll_handle_irq,
|
||||||
.init_time = imx23_timer_init,
|
.init_time = mxs_timer_init,
|
||||||
.init_machine = mxs_machine_init,
|
.init_machine = mxs_machine_init,
|
||||||
.dt_compat = imx23_dt_compat,
|
.dt_compat = mxs_dt_compat,
|
||||||
.restart = mxs_restart,
|
|
||||||
MACHINE_END
|
|
||||||
|
|
||||||
DT_MACHINE_START(IMX28, "Freescale i.MX28 (Device Tree)")
|
|
||||||
.map_io = mx28_map_io,
|
|
||||||
.init_irq = icoll_init_irq,
|
|
||||||
.handle_irq = icoll_handle_irq,
|
|
||||||
.init_time = imx28_timer_init,
|
|
||||||
.init_machine = mxs_machine_init,
|
|
||||||
.dt_compat = imx28_dt_compat,
|
|
||||||
.restart = mxs_restart,
|
.restart = mxs_restart,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -1,52 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2008-2010 Freescale Semiconductor, Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* The code contained herein is licensed under the GNU General Public
|
|
||||||
* License. You may obtain a copy of the GNU General Public License
|
|
||||||
* Version 2 or later at the following locations:
|
|
||||||
*
|
|
||||||
* http://www.opensource.org/licenses/gpl-license.html
|
|
||||||
* http://www.gnu.org/copyleft/gpl.html
|
|
||||||
*
|
|
||||||
* Create static mapping between physical to virtual memory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/mm.h>
|
|
||||||
#include <linux/init.h>
|
|
||||||
|
|
||||||
#include <asm/mach/map.h>
|
|
||||||
|
|
||||||
#include <mach/mx23.h>
|
|
||||||
#include <mach/mx28.h>
|
|
||||||
#include <mach/common.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Define the MX23 memory map.
|
|
||||||
*/
|
|
||||||
static struct map_desc mx23_io_desc[] __initdata = {
|
|
||||||
mxs_map_entry(MX23, OCRAM, MT_DEVICE),
|
|
||||||
mxs_map_entry(MX23, IO, MT_DEVICE),
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Define the MX28 memory map.
|
|
||||||
*/
|
|
||||||
static struct map_desc mx28_io_desc[] __initdata = {
|
|
||||||
mxs_map_entry(MX28, OCRAM, MT_DEVICE),
|
|
||||||
mxs_map_entry(MX28, IO, MT_DEVICE),
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This function initializes the memory map. It is called during the
|
|
||||||
* system startup to create static physical to virtual memory mappings
|
|
||||||
* for the IO modules.
|
|
||||||
*/
|
|
||||||
void __init mx23_map_io(void)
|
|
||||||
{
|
|
||||||
iotable_init(mx23_io_desc, ARRAY_SIZE(mx23_io_desc));
|
|
||||||
}
|
|
||||||
|
|
||||||
void __init mx28_map_io(void)
|
|
||||||
{
|
|
||||||
iotable_init(mx28_io_desc, ARRAY_SIZE(mx28_io_desc));
|
|
||||||
}
|
|
|
@ -1,93 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2010 Freescale Semiconductor, Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/delay.h>
|
|
||||||
#include <linux/err.h>
|
|
||||||
#include <linux/mutex.h>
|
|
||||||
|
|
||||||
#include <asm/processor.h> /* for cpu_relax() */
|
|
||||||
|
|
||||||
#include <mach/mxs.h>
|
|
||||||
#include <mach/common.h>
|
|
||||||
|
|
||||||
#define OCOTP_WORD_OFFSET 0x20
|
|
||||||
#define OCOTP_WORD_COUNT 0x20
|
|
||||||
|
|
||||||
#define BM_OCOTP_CTRL_BUSY (1 << 8)
|
|
||||||
#define BM_OCOTP_CTRL_ERROR (1 << 9)
|
|
||||||
#define BM_OCOTP_CTRL_RD_BANK_OPEN (1 << 12)
|
|
||||||
|
|
||||||
static DEFINE_MUTEX(ocotp_mutex);
|
|
||||||
static u32 ocotp_words[OCOTP_WORD_COUNT];
|
|
||||||
|
|
||||||
const u32 *mxs_get_ocotp(void)
|
|
||||||
{
|
|
||||||
void __iomem *ocotp_base = MXS_IO_ADDRESS(MXS_OCOTP_BASE_ADDR);
|
|
||||||
int timeout = 0x400;
|
|
||||||
size_t i;
|
|
||||||
static int once = 0;
|
|
||||||
|
|
||||||
if (once)
|
|
||||||
return ocotp_words;
|
|
||||||
|
|
||||||
mutex_lock(&ocotp_mutex);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* clk_enable(hbus_clk) for ocotp can be skipped
|
|
||||||
* as it must be on when system is running.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* try to clear ERROR bit */
|
|
||||||
__mxs_clrl(BM_OCOTP_CTRL_ERROR, ocotp_base);
|
|
||||||
|
|
||||||
/* check both BUSY and ERROR cleared */
|
|
||||||
while ((__raw_readl(ocotp_base) &
|
|
||||||
(BM_OCOTP_CTRL_BUSY | BM_OCOTP_CTRL_ERROR)) && --timeout)
|
|
||||||
cpu_relax();
|
|
||||||
|
|
||||||
if (unlikely(!timeout))
|
|
||||||
goto error_unlock;
|
|
||||||
|
|
||||||
/* open OCOTP banks for read */
|
|
||||||
__mxs_setl(BM_OCOTP_CTRL_RD_BANK_OPEN, ocotp_base);
|
|
||||||
|
|
||||||
/* approximately wait 32 hclk cycles */
|
|
||||||
udelay(1);
|
|
||||||
|
|
||||||
/* poll BUSY bit becoming cleared */
|
|
||||||
timeout = 0x400;
|
|
||||||
while ((__raw_readl(ocotp_base) & BM_OCOTP_CTRL_BUSY) && --timeout)
|
|
||||||
cpu_relax();
|
|
||||||
|
|
||||||
if (unlikely(!timeout))
|
|
||||||
goto error_unlock;
|
|
||||||
|
|
||||||
for (i = 0; i < OCOTP_WORD_COUNT; i++)
|
|
||||||
ocotp_words[i] = __raw_readl(ocotp_base + OCOTP_WORD_OFFSET +
|
|
||||||
i * 0x10);
|
|
||||||
|
|
||||||
/* close banks for power saving */
|
|
||||||
__mxs_clrl(BM_OCOTP_CTRL_RD_BANK_OPEN, ocotp_base);
|
|
||||||
|
|
||||||
once = 1;
|
|
||||||
|
|
||||||
mutex_unlock(&ocotp_mutex);
|
|
||||||
|
|
||||||
return ocotp_words;
|
|
||||||
|
|
||||||
error_unlock:
|
|
||||||
mutex_unlock(&ocotp_mutex);
|
|
||||||
pr_err("%s: timeout in reading OCOTP\n", __func__);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
|
@ -1,139 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 1999 ARM Limited
|
|
||||||
* Copyright (C) 2000 Deep Blue Solutions Ltd
|
|
||||||
* Copyright 2006-2007,2010 Freescale Semiconductor, Inc. All Rights Reserved.
|
|
||||||
* Copyright 2008 Juergen Beisert, kernel@pengutronix.de
|
|
||||||
* Copyright 2009 Ilya Yanok, Emcraft Systems Ltd, 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.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
|
||||||
#include <linux/clk.h>
|
|
||||||
#include <linux/io.h>
|
|
||||||
#include <linux/err.h>
|
|
||||||
#include <linux/delay.h>
|
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/module.h>
|
|
||||||
|
|
||||||
#include <asm/proc-fns.h>
|
|
||||||
#include <asm/system_misc.h>
|
|
||||||
|
|
||||||
#include <mach/mxs.h>
|
|
||||||
#include <mach/common.h>
|
|
||||||
|
|
||||||
#define MX23_CLKCTRL_RESET_OFFSET 0x120
|
|
||||||
#define MX28_CLKCTRL_RESET_OFFSET 0x1e0
|
|
||||||
#define MXS_CLKCTRL_RESET_CHIP (1 << 1)
|
|
||||||
|
|
||||||
#define MXS_MODULE_CLKGATE (1 << 30)
|
|
||||||
#define MXS_MODULE_SFTRST (1 << 31)
|
|
||||||
|
|
||||||
static void __iomem *mxs_clkctrl_reset_addr;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Reset the system. It is called by machine_restart().
|
|
||||||
*/
|
|
||||||
void mxs_restart(char mode, const char *cmd)
|
|
||||||
{
|
|
||||||
/* reset the chip */
|
|
||||||
__mxs_setl(MXS_CLKCTRL_RESET_CHIP, mxs_clkctrl_reset_addr);
|
|
||||||
|
|
||||||
pr_err("Failed to assert the chip reset\n");
|
|
||||||
|
|
||||||
/* Delay to allow the serial port to show the message */
|
|
||||||
mdelay(50);
|
|
||||||
|
|
||||||
/* We'll take a jump through zero as a poor second */
|
|
||||||
soft_restart(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int __init mxs_arch_reset_init(void)
|
|
||||||
{
|
|
||||||
struct clk *clk;
|
|
||||||
|
|
||||||
mxs_clkctrl_reset_addr = MXS_IO_ADDRESS(MXS_CLKCTRL_BASE_ADDR) +
|
|
||||||
(cpu_is_mx23() ? MX23_CLKCTRL_RESET_OFFSET :
|
|
||||||
MX28_CLKCTRL_RESET_OFFSET);
|
|
||||||
|
|
||||||
clk = clk_get_sys("rtc", NULL);
|
|
||||||
if (!IS_ERR(clk))
|
|
||||||
clk_prepare_enable(clk);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
core_initcall(mxs_arch_reset_init);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Clear the bit and poll it cleared. This is usually called with
|
|
||||||
* a reset address and mask being either SFTRST(bit 31) or CLKGATE
|
|
||||||
* (bit 30).
|
|
||||||
*/
|
|
||||||
static int clear_poll_bit(void __iomem *addr, u32 mask)
|
|
||||||
{
|
|
||||||
int timeout = 0x400;
|
|
||||||
|
|
||||||
/* clear the bit */
|
|
||||||
__mxs_clrl(mask, addr);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SFTRST needs 3 GPMI clocks to settle, the reference manual
|
|
||||||
* recommends to wait 1us.
|
|
||||||
*/
|
|
||||||
udelay(1);
|
|
||||||
|
|
||||||
/* poll the bit becoming clear */
|
|
||||||
while ((__raw_readl(addr) & mask) && --timeout)
|
|
||||||
/* nothing */;
|
|
||||||
|
|
||||||
return !timeout;
|
|
||||||
}
|
|
||||||
|
|
||||||
int mxs_reset_block(void __iomem *reset_addr)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
int timeout = 0x400;
|
|
||||||
|
|
||||||
/* clear and poll SFTRST */
|
|
||||||
ret = clear_poll_bit(reset_addr, MXS_MODULE_SFTRST);
|
|
||||||
if (unlikely(ret))
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
/* clear CLKGATE */
|
|
||||||
__mxs_clrl(MXS_MODULE_CLKGATE, reset_addr);
|
|
||||||
|
|
||||||
/* set SFTRST to reset the block */
|
|
||||||
__mxs_setl(MXS_MODULE_SFTRST, reset_addr);
|
|
||||||
udelay(1);
|
|
||||||
|
|
||||||
/* poll CLKGATE becoming set */
|
|
||||||
while ((!(__raw_readl(reset_addr) & MXS_MODULE_CLKGATE)) && --timeout)
|
|
||||||
/* nothing */;
|
|
||||||
if (unlikely(!timeout))
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
/* clear and poll SFTRST */
|
|
||||||
ret = clear_poll_bit(reset_addr, MXS_MODULE_SFTRST);
|
|
||||||
if (unlikely(ret))
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
/* clear and poll CLKGATE */
|
|
||||||
ret = clear_poll_bit(reset_addr, MXS_MODULE_CLKGATE);
|
|
||||||
if (unlikely(ret))
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
error:
|
|
||||||
pr_err("%s(%p): module reset timeout\n", __func__, reset_addr);
|
|
||||||
return -ETIMEDOUT;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(mxs_reset_block);
|
|
|
@ -214,11 +214,6 @@ static struct clk clk_pcmcdclk2 = {
|
||||||
.name = "pcmcdclk",
|
.name = "pcmcdclk",
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct clk dummy_apb_pclk = {
|
|
||||||
.name = "apb_pclk",
|
|
||||||
.id = -1,
|
|
||||||
};
|
|
||||||
|
|
||||||
static struct clk *clkset_vpllsrc_list[] = {
|
static struct clk *clkset_vpllsrc_list[] = {
|
||||||
[0] = &clk_fin_vpll,
|
[0] = &clk_fin_vpll,
|
||||||
[1] = &clk_sclk_hdmi27m,
|
[1] = &clk_sclk_hdmi27m,
|
||||||
|
@ -305,18 +300,6 @@ static struct clk_ops clk_fout_apll_ops = {
|
||||||
|
|
||||||
static struct clk init_clocks_off[] = {
|
static struct clk init_clocks_off[] = {
|
||||||
{
|
{
|
||||||
.name = "dma",
|
|
||||||
.devname = "dma-pl330.0",
|
|
||||||
.parent = &clk_hclk_psys.clk,
|
|
||||||
.enable = s5pv210_clk_ip0_ctrl,
|
|
||||||
.ctrlbit = (1 << 3),
|
|
||||||
}, {
|
|
||||||
.name = "dma",
|
|
||||||
.devname = "dma-pl330.1",
|
|
||||||
.parent = &clk_hclk_psys.clk,
|
|
||||||
.enable = s5pv210_clk_ip0_ctrl,
|
|
||||||
.ctrlbit = (1 << 4),
|
|
||||||
}, {
|
|
||||||
.name = "rot",
|
.name = "rot",
|
||||||
.parent = &clk_hclk_dsys.clk,
|
.parent = &clk_hclk_dsys.clk,
|
||||||
.enable = s5pv210_clk_ip0_ctrl,
|
.enable = s5pv210_clk_ip0_ctrl,
|
||||||
|
@ -573,6 +556,20 @@ static struct clk clk_hsmmc3 = {
|
||||||
.ctrlbit = (1<<19),
|
.ctrlbit = (1<<19),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct clk clk_pdma0 = {
|
||||||
|
.name = "pdma0",
|
||||||
|
.parent = &clk_hclk_psys.clk,
|
||||||
|
.enable = s5pv210_clk_ip0_ctrl,
|
||||||
|
.ctrlbit = (1 << 3),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct clk clk_pdma1 = {
|
||||||
|
.name = "pdma1",
|
||||||
|
.parent = &clk_hclk_psys.clk,
|
||||||
|
.enable = s5pv210_clk_ip0_ctrl,
|
||||||
|
.ctrlbit = (1 << 4),
|
||||||
|
};
|
||||||
|
|
||||||
static struct clk *clkset_uart_list[] = {
|
static struct clk *clkset_uart_list[] = {
|
||||||
[6] = &clk_mout_mpll.clk,
|
[6] = &clk_mout_mpll.clk,
|
||||||
[7] = &clk_mout_epll.clk,
|
[7] = &clk_mout_epll.clk,
|
||||||
|
@ -1075,6 +1072,8 @@ static struct clk *clk_cdev[] = {
|
||||||
&clk_hsmmc1,
|
&clk_hsmmc1,
|
||||||
&clk_hsmmc2,
|
&clk_hsmmc2,
|
||||||
&clk_hsmmc3,
|
&clk_hsmmc3,
|
||||||
|
&clk_pdma0,
|
||||||
|
&clk_pdma1,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Clock initialisation code */
|
/* Clock initialisation code */
|
||||||
|
@ -1333,6 +1332,8 @@ static struct clk_lookup s5pv210_clk_lookup[] = {
|
||||||
CLKDEV_INIT(NULL, "spi_busclk0", &clk_p),
|
CLKDEV_INIT(NULL, "spi_busclk0", &clk_p),
|
||||||
CLKDEV_INIT("s5pv210-spi.0", "spi_busclk1", &clk_sclk_spi0.clk),
|
CLKDEV_INIT("s5pv210-spi.0", "spi_busclk1", &clk_sclk_spi0.clk),
|
||||||
CLKDEV_INIT("s5pv210-spi.1", "spi_busclk1", &clk_sclk_spi1.clk),
|
CLKDEV_INIT("s5pv210-spi.1", "spi_busclk1", &clk_sclk_spi1.clk),
|
||||||
|
CLKDEV_INIT("dma-pl330.0", "apb_pclk", &clk_pdma0),
|
||||||
|
CLKDEV_INIT("dma-pl330.1", "apb_pclk", &clk_pdma1),
|
||||||
};
|
};
|
||||||
|
|
||||||
void __init s5pv210_register_clocks(void)
|
void __init s5pv210_register_clocks(void)
|
||||||
|
@ -1361,6 +1362,5 @@ void __init s5pv210_register_clocks(void)
|
||||||
for (ptr = 0; ptr < ARRAY_SIZE(clk_cdev); ptr++)
|
for (ptr = 0; ptr < ARRAY_SIZE(clk_cdev); ptr++)
|
||||||
s3c_disable_clocks(clk_cdev[ptr], 1);
|
s3c_disable_clocks(clk_cdev[ptr], 1);
|
||||||
|
|
||||||
s3c24xx_register_clock(&dummy_apb_pclk);
|
|
||||||
s3c_pwmclk_init();
|
s3c_pwmclk_init();
|
||||||
}
|
}
|
||||||
|
|
|
@ -845,7 +845,7 @@ static struct fimc_source_info goni_camera_sensors[] = {
|
||||||
.mux_id = 0,
|
.mux_id = 0,
|
||||||
.flags = V4L2_MBUS_PCLK_SAMPLE_FALLING |
|
.flags = V4L2_MBUS_PCLK_SAMPLE_FALLING |
|
||||||
V4L2_MBUS_VSYNC_ACTIVE_LOW,
|
V4L2_MBUS_VSYNC_ACTIVE_LOW,
|
||||||
.bus_type = FIMC_BUS_TYPE_ITU_601,
|
.fimc_bus_type = FIMC_BUS_TYPE_ITU_601,
|
||||||
.board_info = &noon010pc30_board_info,
|
.board_info = &noon010pc30_board_info,
|
||||||
.i2c_bus_num = 0,
|
.i2c_bus_num = 0,
|
||||||
.clk_frequency = 16000000UL,
|
.clk_frequency = 16000000UL,
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include <linux/smsc911x.h>
|
#include <linux/smsc911x.h>
|
||||||
#include <linux/spi/spi.h>
|
#include <linux/spi/spi.h>
|
||||||
#include <linux/spi/sh_hspi.h>
|
#include <linux/spi/sh_hspi.h>
|
||||||
|
#include <linux/mmc/host.h>
|
||||||
#include <linux/mmc/sh_mobile_sdhi.h>
|
#include <linux/mmc/sh_mobile_sdhi.h>
|
||||||
#include <linux/mfd/tmio.h>
|
#include <linux/mfd/tmio.h>
|
||||||
#include <linux/usb/otg.h>
|
#include <linux/usb/otg.h>
|
||||||
|
|
|
@ -576,7 +576,7 @@ load_ind:
|
||||||
/* x = ((*(frame + k)) & 0xf) << 2; */
|
/* x = ((*(frame + k)) & 0xf) << 2; */
|
||||||
ctx->seen |= SEEN_X | SEEN_DATA | SEEN_CALL;
|
ctx->seen |= SEEN_X | SEEN_DATA | SEEN_CALL;
|
||||||
/* the interpreter should deal with the negative K */
|
/* the interpreter should deal with the negative K */
|
||||||
if (k < 0)
|
if ((int)k < 0)
|
||||||
return -1;
|
return -1;
|
||||||
/* offset in r1: we might have to take the slow path */
|
/* offset in r1: we might have to take the slow path */
|
||||||
emit_mov_i(r_off, k, ctx);
|
emit_mov_i(r_off, k, ctx);
|
||||||
|
|
|
@ -9,7 +9,6 @@ config ARM64
|
||||||
select CLONE_BACKWARDS
|
select CLONE_BACKWARDS
|
||||||
select COMMON_CLK
|
select COMMON_CLK
|
||||||
select GENERIC_CLOCKEVENTS
|
select GENERIC_CLOCKEVENTS
|
||||||
select GENERIC_HARDIRQS_NO_DEPRECATED
|
|
||||||
select GENERIC_IOMAP
|
select GENERIC_IOMAP
|
||||||
select GENERIC_IRQ_PROBE
|
select GENERIC_IRQ_PROBE
|
||||||
select GENERIC_IRQ_SHOW
|
select GENERIC_IRQ_SHOW
|
||||||
|
|
|
@ -6,17 +6,6 @@ config FRAME_POINTER
|
||||||
bool
|
bool
|
||||||
default y
|
default y
|
||||||
|
|
||||||
config DEBUG_ERRORS
|
|
||||||
bool "Verbose kernel error messages"
|
|
||||||
depends on DEBUG_KERNEL
|
|
||||||
help
|
|
||||||
This option controls verbose debugging information which can be
|
|
||||||
printed when the kernel detects an internal error. This debugging
|
|
||||||
information is useful to kernel hackers when tracking down problems,
|
|
||||||
but mostly meaningless to other people. It's safe to say Y unless
|
|
||||||
you are concerned with the code size or don't want to see these
|
|
||||||
messages.
|
|
||||||
|
|
||||||
config DEBUG_STACK_USAGE
|
config DEBUG_STACK_USAGE
|
||||||
bool "Enable stack utilization instrumentation"
|
bool "Enable stack utilization instrumentation"
|
||||||
depends on DEBUG_KERNEL
|
depends on DEBUG_KERNEL
|
||||||
|
|
|
@ -82,4 +82,3 @@ CONFIG_DEBUG_KERNEL=y
|
||||||
CONFIG_DEBUG_INFO=y
|
CONFIG_DEBUG_INFO=y
|
||||||
# CONFIG_FTRACE is not set
|
# CONFIG_FTRACE is not set
|
||||||
CONFIG_ATOMIC64_SELFTEST=y
|
CONFIG_ATOMIC64_SELFTEST=y
|
||||||
CONFIG_DEBUG_ERRORS=y
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ struct ucontext {
|
||||||
stack_t uc_stack;
|
stack_t uc_stack;
|
||||||
sigset_t uc_sigmask;
|
sigset_t uc_sigmask;
|
||||||
/* glibc uses a 1024-bit sigset_t */
|
/* glibc uses a 1024-bit sigset_t */
|
||||||
__u8 __unused[(1024 - sizeof(sigset_t)) / 8];
|
__u8 __unused[1024 / 8 - sizeof(sigset_t)];
|
||||||
/* last for future expansion */
|
/* last for future expansion */
|
||||||
struct sigcontext uc_mcontext;
|
struct sigcontext uc_mcontext;
|
||||||
};
|
};
|
||||||
|
|
|
@ -40,7 +40,9 @@ EXPORT_SYMBOL(__copy_to_user);
|
||||||
EXPORT_SYMBOL(__clear_user);
|
EXPORT_SYMBOL(__clear_user);
|
||||||
|
|
||||||
/* bitops */
|
/* bitops */
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
EXPORT_SYMBOL(__atomic_hash);
|
EXPORT_SYMBOL(__atomic_hash);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* physical memory */
|
/* physical memory */
|
||||||
EXPORT_SYMBOL(memstart_addr);
|
EXPORT_SYMBOL(memstart_addr);
|
||||||
|
|
|
@ -549,7 +549,6 @@ int compat_setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info,
|
||||||
sigset_t *set, struct pt_regs *regs)
|
sigset_t *set, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
struct compat_rt_sigframe __user *frame;
|
struct compat_rt_sigframe __user *frame;
|
||||||
compat_stack_t stack;
|
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
frame = compat_get_sigframe(ka, regs, sizeof(*frame));
|
frame = compat_get_sigframe(ka, regs, sizeof(*frame));
|
||||||
|
|
|
@ -261,7 +261,7 @@ static void __init create_mapping(phys_addr_t phys, unsigned long virt,
|
||||||
void __iomem * __init early_io_map(phys_addr_t phys, unsigned long virt)
|
void __iomem * __init early_io_map(phys_addr_t phys, unsigned long virt)
|
||||||
{
|
{
|
||||||
unsigned long size, mask;
|
unsigned long size, mask;
|
||||||
bool page64k = IS_ENABLED(ARM64_64K_PAGES);
|
bool page64k = IS_ENABLED(CONFIG_ARM64_64K_PAGES);
|
||||||
pgd_t *pgd;
|
pgd_t *pgd;
|
||||||
pud_t *pud;
|
pud_t *pud;
|
||||||
pmd_t *pmd;
|
pmd_t *pmd;
|
||||||
|
|
|
@ -291,7 +291,6 @@ cpu_idle (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!need_resched()) {
|
if (!need_resched()) {
|
||||||
void (*idle)(void);
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
min_xtp();
|
min_xtp();
|
||||||
#endif
|
#endif
|
||||||
|
@ -299,9 +298,7 @@ cpu_idle (void)
|
||||||
if (mark_idle)
|
if (mark_idle)
|
||||||
(*mark_idle)(1);
|
(*mark_idle)(1);
|
||||||
|
|
||||||
if (!idle)
|
default_idle();
|
||||||
idle = default_idle;
|
|
||||||
(*idle)();
|
|
||||||
if (mark_idle)
|
if (mark_idle)
|
||||||
(*mark_idle)(0);
|
(*mark_idle)(0);
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
|
|
|
@ -90,6 +90,7 @@ config GENERIC_GPIO
|
||||||
config PPC
|
config PPC
|
||||||
bool
|
bool
|
||||||
default y
|
default y
|
||||||
|
select BINFMT_ELF
|
||||||
select OF
|
select OF
|
||||||
select OF_EARLY_FLATTREE
|
select OF_EARLY_FLATTREE
|
||||||
select HAVE_FTRACE_MCOUNT_RECORD
|
select HAVE_FTRACE_MCOUNT_RECORD
|
||||||
|
|
|
@ -343,17 +343,16 @@ extern void slb_set_size(u16 size);
|
||||||
/*
|
/*
|
||||||
* VSID allocation (256MB segment)
|
* VSID allocation (256MB segment)
|
||||||
*
|
*
|
||||||
* We first generate a 38-bit "proto-VSID". For kernel addresses this
|
* We first generate a 37-bit "proto-VSID". Proto-VSIDs are generated
|
||||||
* is equal to the ESID | 1 << 37, for user addresses it is:
|
* from mmu context id and effective segment id of the address.
|
||||||
* (context << USER_ESID_BITS) | (esid & ((1U << USER_ESID_BITS) - 1)
|
|
||||||
*
|
*
|
||||||
* This splits the proto-VSID into the below range
|
* For user processes max context id is limited to ((1ul << 19) - 5)
|
||||||
* 0 - (2^(CONTEXT_BITS + USER_ESID_BITS) - 1) : User proto-VSID range
|
* for kernel space, we use the top 4 context ids to map address as below
|
||||||
* 2^(CONTEXT_BITS + USER_ESID_BITS) - 2^(VSID_BITS) : Kernel proto-VSID range
|
* NOTE: each context only support 64TB now.
|
||||||
*
|
* 0x7fffc - [ 0xc000000000000000 - 0xc0003fffffffffff ]
|
||||||
* We also have CONTEXT_BITS + USER_ESID_BITS = VSID_BITS - 1
|
* 0x7fffd - [ 0xd000000000000000 - 0xd0003fffffffffff ]
|
||||||
* That is, we assign half of the space to user processes and half
|
* 0x7fffe - [ 0xe000000000000000 - 0xe0003fffffffffff ]
|
||||||
* to the kernel.
|
* 0x7ffff - [ 0xf000000000000000 - 0xf0003fffffffffff ]
|
||||||
*
|
*
|
||||||
* The proto-VSIDs are then scrambled into real VSIDs with the
|
* The proto-VSIDs are then scrambled into real VSIDs with the
|
||||||
* multiplicative hash:
|
* multiplicative hash:
|
||||||
|
@ -363,41 +362,49 @@ extern void slb_set_size(u16 size);
|
||||||
* VSID_MULTIPLIER is prime, so in particular it is
|
* VSID_MULTIPLIER is prime, so in particular it is
|
||||||
* co-prime to VSID_MODULUS, making this a 1:1 scrambling function.
|
* co-prime to VSID_MODULUS, making this a 1:1 scrambling function.
|
||||||
* Because the modulus is 2^n-1 we can compute it efficiently without
|
* Because the modulus is 2^n-1 we can compute it efficiently without
|
||||||
* a divide or extra multiply (see below).
|
* a divide or extra multiply (see below). The scramble function gives
|
||||||
|
* robust scattering in the hash table (at least based on some initial
|
||||||
|
* results).
|
||||||
*
|
*
|
||||||
* This scheme has several advantages over older methods:
|
* We also consider VSID 0 special. We use VSID 0 for slb entries mapping
|
||||||
|
* bad address. This enables us to consolidate bad address handling in
|
||||||
|
* hash_page.
|
||||||
*
|
*
|
||||||
* - We have VSIDs allocated for every kernel address
|
* We also need to avoid the last segment of the last context, because that
|
||||||
* (i.e. everything above 0xC000000000000000), except the very top
|
* would give a protovsid of 0x1fffffffff. That will result in a VSID 0
|
||||||
* segment, which simplifies several things.
|
* because of the modulo operation in vsid scramble. But the vmemmap
|
||||||
*
|
* (which is what uses region 0xf) will never be close to 64TB in size
|
||||||
* - We allow for USER_ESID_BITS significant bits of ESID and
|
* (it's 56 bytes per page of system memory).
|
||||||
* CONTEXT_BITS bits of context for user addresses.
|
|
||||||
* i.e. 64T (46 bits) of address space for up to half a million contexts.
|
|
||||||
*
|
|
||||||
* - The scramble function gives robust scattering in the hash
|
|
||||||
* table (at least based on some initial results). The previous
|
|
||||||
* method was more susceptible to pathological cases giving excessive
|
|
||||||
* hash collisions.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define CONTEXT_BITS 19
|
||||||
|
#define ESID_BITS 18
|
||||||
|
#define ESID_BITS_1T 6
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 256MB segment
|
||||||
|
* The proto-VSID space has 2^(CONTEX_BITS + ESID_BITS) - 1 segments
|
||||||
|
* available for user + kernel mapping. The top 4 contexts are used for
|
||||||
|
* kernel mapping. Each segment contains 2^28 bytes. Each
|
||||||
|
* context maps 2^46 bytes (64TB) so we can support 2^19-1 contexts
|
||||||
|
* (19 == 37 + 28 - 46).
|
||||||
|
*/
|
||||||
|
#define MAX_USER_CONTEXT ((ASM_CONST(1) << CONTEXT_BITS) - 5)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This should be computed such that protovosid * vsid_mulitplier
|
* This should be computed such that protovosid * vsid_mulitplier
|
||||||
* doesn't overflow 64 bits. It should also be co-prime to vsid_modulus
|
* doesn't overflow 64 bits. It should also be co-prime to vsid_modulus
|
||||||
*/
|
*/
|
||||||
#define VSID_MULTIPLIER_256M ASM_CONST(12538073) /* 24-bit prime */
|
#define VSID_MULTIPLIER_256M ASM_CONST(12538073) /* 24-bit prime */
|
||||||
#define VSID_BITS_256M 38
|
#define VSID_BITS_256M (CONTEXT_BITS + ESID_BITS)
|
||||||
#define VSID_MODULUS_256M ((1UL<<VSID_BITS_256M)-1)
|
#define VSID_MODULUS_256M ((1UL<<VSID_BITS_256M)-1)
|
||||||
|
|
||||||
#define VSID_MULTIPLIER_1T ASM_CONST(12538073) /* 24-bit prime */
|
#define VSID_MULTIPLIER_1T ASM_CONST(12538073) /* 24-bit prime */
|
||||||
#define VSID_BITS_1T 26
|
#define VSID_BITS_1T (CONTEXT_BITS + ESID_BITS_1T)
|
||||||
#define VSID_MODULUS_1T ((1UL<<VSID_BITS_1T)-1)
|
#define VSID_MODULUS_1T ((1UL<<VSID_BITS_1T)-1)
|
||||||
|
|
||||||
#define CONTEXT_BITS 19
|
|
||||||
#define USER_ESID_BITS 18
|
|
||||||
#define USER_ESID_BITS_1T 6
|
|
||||||
|
|
||||||
#define USER_VSID_RANGE (1UL << (USER_ESID_BITS + SID_SHIFT))
|
#define USER_VSID_RANGE (1UL << (ESID_BITS + SID_SHIFT))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This macro generates asm code to compute the VSID scramble
|
* This macro generates asm code to compute the VSID scramble
|
||||||
|
@ -421,7 +428,8 @@ extern void slb_set_size(u16 size);
|
||||||
srdi rx,rt,VSID_BITS_##size; \
|
srdi rx,rt,VSID_BITS_##size; \
|
||||||
clrldi rt,rt,(64-VSID_BITS_##size); \
|
clrldi rt,rt,(64-VSID_BITS_##size); \
|
||||||
add rt,rt,rx; /* add high and low bits */ \
|
add rt,rt,rx; /* add high and low bits */ \
|
||||||
/* Now, r3 == VSID (mod 2^36-1), and lies between 0 and \
|
/* NOTE: explanation based on VSID_BITS_##size = 36 \
|
||||||
|
* Now, r3 == VSID (mod 2^36-1), and lies between 0 and \
|
||||||
* 2^36-1+2^28-1. That in particular means that if r3 >= \
|
* 2^36-1+2^28-1. That in particular means that if r3 >= \
|
||||||
* 2^36-1, then r3+1 has the 2^36 bit set. So, if r3+1 has \
|
* 2^36-1, then r3+1 has the 2^36 bit set. So, if r3+1 has \
|
||||||
* the bit clear, r3 already has the answer we want, if it \
|
* the bit clear, r3 already has the answer we want, if it \
|
||||||
|
@ -513,34 +521,6 @@ typedef struct {
|
||||||
})
|
})
|
||||||
#endif /* 1 */
|
#endif /* 1 */
|
||||||
|
|
||||||
/*
|
|
||||||
* This is only valid for addresses >= PAGE_OFFSET
|
|
||||||
* The proto-VSID space is divided into two class
|
|
||||||
* User: 0 to 2^(CONTEXT_BITS + USER_ESID_BITS) -1
|
|
||||||
* kernel: 2^(CONTEXT_BITS + USER_ESID_BITS) to 2^(VSID_BITS) - 1
|
|
||||||
*
|
|
||||||
* With KERNEL_START at 0xc000000000000000, the proto vsid for
|
|
||||||
* the kernel ends up with 0xc00000000 (36 bits). With 64TB
|
|
||||||
* support we need to have kernel proto-VSID in the
|
|
||||||
* [2^37 to 2^38 - 1] range due to the increased USER_ESID_BITS.
|
|
||||||
*/
|
|
||||||
static inline unsigned long get_kernel_vsid(unsigned long ea, int ssize)
|
|
||||||
{
|
|
||||||
unsigned long proto_vsid;
|
|
||||||
/*
|
|
||||||
* We need to make sure proto_vsid for the kernel is
|
|
||||||
* >= 2^(CONTEXT_BITS + USER_ESID_BITS[_1T])
|
|
||||||
*/
|
|
||||||
if (ssize == MMU_SEGSIZE_256M) {
|
|
||||||
proto_vsid = ea >> SID_SHIFT;
|
|
||||||
proto_vsid |= (1UL << (CONTEXT_BITS + USER_ESID_BITS));
|
|
||||||
return vsid_scramble(proto_vsid, 256M);
|
|
||||||
}
|
|
||||||
proto_vsid = ea >> SID_SHIFT_1T;
|
|
||||||
proto_vsid |= (1UL << (CONTEXT_BITS + USER_ESID_BITS_1T));
|
|
||||||
return vsid_scramble(proto_vsid, 1T);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Returns the segment size indicator for a user address */
|
/* Returns the segment size indicator for a user address */
|
||||||
static inline int user_segment_size(unsigned long addr)
|
static inline int user_segment_size(unsigned long addr)
|
||||||
{
|
{
|
||||||
|
@ -550,17 +530,41 @@ static inline int user_segment_size(unsigned long addr)
|
||||||
return MMU_SEGSIZE_256M;
|
return MMU_SEGSIZE_256M;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This is only valid for user addresses (which are below 2^44) */
|
|
||||||
static inline unsigned long get_vsid(unsigned long context, unsigned long ea,
|
static inline unsigned long get_vsid(unsigned long context, unsigned long ea,
|
||||||
int ssize)
|
int ssize)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
* Bad address. We return VSID 0 for that
|
||||||
|
*/
|
||||||
|
if ((ea & ~REGION_MASK) >= PGTABLE_RANGE)
|
||||||
|
return 0;
|
||||||
|
|
||||||
if (ssize == MMU_SEGSIZE_256M)
|
if (ssize == MMU_SEGSIZE_256M)
|
||||||
return vsid_scramble((context << USER_ESID_BITS)
|
return vsid_scramble((context << ESID_BITS)
|
||||||
| (ea >> SID_SHIFT), 256M);
|
| (ea >> SID_SHIFT), 256M);
|
||||||
return vsid_scramble((context << USER_ESID_BITS_1T)
|
return vsid_scramble((context << ESID_BITS_1T)
|
||||||
| (ea >> SID_SHIFT_1T), 1T);
|
| (ea >> SID_SHIFT_1T), 1T);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is only valid for addresses >= PAGE_OFFSET
|
||||||
|
*
|
||||||
|
* For kernel space, we use the top 4 context ids to map address as below
|
||||||
|
* 0x7fffc - [ 0xc000000000000000 - 0xc0003fffffffffff ]
|
||||||
|
* 0x7fffd - [ 0xd000000000000000 - 0xd0003fffffffffff ]
|
||||||
|
* 0x7fffe - [ 0xe000000000000000 - 0xe0003fffffffffff ]
|
||||||
|
* 0x7ffff - [ 0xf000000000000000 - 0xf0003fffffffffff ]
|
||||||
|
*/
|
||||||
|
static inline unsigned long get_kernel_vsid(unsigned long ea, int ssize)
|
||||||
|
{
|
||||||
|
unsigned long context;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* kernel take the top 4 context from the available range
|
||||||
|
*/
|
||||||
|
context = (MAX_USER_CONTEXT) + ((ea >> 60) - 0xc) + 1;
|
||||||
|
return get_vsid(context, ea, ssize);
|
||||||
|
}
|
||||||
#endif /* __ASSEMBLY__ */
|
#endif /* __ASSEMBLY__ */
|
||||||
|
|
||||||
#endif /* _ASM_POWERPC_MMU_HASH64_H_ */
|
#endif /* _ASM_POWERPC_MMU_HASH64_H_ */
|
||||||
|
|
|
@ -275,7 +275,7 @@ static struct cpu_spec __initdata cpu_specs[] = {
|
||||||
.cpu_features = CPU_FTRS_PPC970,
|
.cpu_features = CPU_FTRS_PPC970,
|
||||||
.cpu_user_features = COMMON_USER_POWER4 |
|
.cpu_user_features = COMMON_USER_POWER4 |
|
||||||
PPC_FEATURE_HAS_ALTIVEC_COMP,
|
PPC_FEATURE_HAS_ALTIVEC_COMP,
|
||||||
.mmu_features = MMU_FTR_HPTE_TABLE,
|
.mmu_features = MMU_FTRS_PPC970,
|
||||||
.icache_bsize = 128,
|
.icache_bsize = 128,
|
||||||
.dcache_bsize = 128,
|
.dcache_bsize = 128,
|
||||||
.num_pmcs = 8,
|
.num_pmcs = 8,
|
||||||
|
|
|
@ -23,8 +23,10 @@
|
||||||
#include <asm/code-patching.h>
|
#include <asm/code-patching.h>
|
||||||
#include <asm/machdep.h>
|
#include <asm/machdep.h>
|
||||||
|
|
||||||
|
#if !defined(CONFIG_64BIT) || defined(CONFIG_PPC_BOOK3E_64)
|
||||||
extern void epapr_ev_idle(void);
|
extern void epapr_ev_idle(void);
|
||||||
extern u32 epapr_ev_idle_start[];
|
extern u32 epapr_ev_idle_start[];
|
||||||
|
#endif
|
||||||
|
|
||||||
bool epapr_paravirt_enabled;
|
bool epapr_paravirt_enabled;
|
||||||
|
|
||||||
|
@ -47,11 +49,15 @@ static int __init epapr_paravirt_init(void)
|
||||||
|
|
||||||
for (i = 0; i < (len / 4); i++) {
|
for (i = 0; i < (len / 4); i++) {
|
||||||
patch_instruction(epapr_hypercall_start + i, insts[i]);
|
patch_instruction(epapr_hypercall_start + i, insts[i]);
|
||||||
|
#if !defined(CONFIG_64BIT) || defined(CONFIG_PPC_BOOK3E_64)
|
||||||
patch_instruction(epapr_ev_idle_start + i, insts[i]);
|
patch_instruction(epapr_ev_idle_start + i, insts[i]);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if !defined(CONFIG_64BIT) || defined(CONFIG_PPC_BOOK3E_64)
|
||||||
if (of_get_property(hyper_node, "has-idle", NULL))
|
if (of_get_property(hyper_node, "has-idle", NULL))
|
||||||
ppc_md.power_save = epapr_ev_idle;
|
ppc_md.power_save = epapr_ev_idle;
|
||||||
|
#endif
|
||||||
|
|
||||||
epapr_paravirt_enabled = true;
|
epapr_paravirt_enabled = true;
|
||||||
|
|
||||||
|
|
|
@ -1066,78 +1066,6 @@ unrecov_user_slb:
|
||||||
#endif /* __DISABLED__ */
|
#endif /* __DISABLED__ */
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* r13 points to the PACA, r9 contains the saved CR,
|
|
||||||
* r12 contain the saved SRR1, SRR0 is still ready for return
|
|
||||||
* r3 has the faulting address
|
|
||||||
* r9 - r13 are saved in paca->exslb.
|
|
||||||
* r3 is saved in paca->slb_r3
|
|
||||||
* We assume we aren't going to take any exceptions during this procedure.
|
|
||||||
*/
|
|
||||||
_GLOBAL(slb_miss_realmode)
|
|
||||||
mflr r10
|
|
||||||
#ifdef CONFIG_RELOCATABLE
|
|
||||||
mtctr r11
|
|
||||||
#endif
|
|
||||||
|
|
||||||
stw r9,PACA_EXSLB+EX_CCR(r13) /* save CR in exc. frame */
|
|
||||||
std r10,PACA_EXSLB+EX_LR(r13) /* save LR */
|
|
||||||
|
|
||||||
bl .slb_allocate_realmode
|
|
||||||
|
|
||||||
/* All done -- return from exception. */
|
|
||||||
|
|
||||||
ld r10,PACA_EXSLB+EX_LR(r13)
|
|
||||||
ld r3,PACA_EXSLB+EX_R3(r13)
|
|
||||||
lwz r9,PACA_EXSLB+EX_CCR(r13) /* get saved CR */
|
|
||||||
|
|
||||||
mtlr r10
|
|
||||||
|
|
||||||
andi. r10,r12,MSR_RI /* check for unrecoverable exception */
|
|
||||||
beq- 2f
|
|
||||||
|
|
||||||
.machine push
|
|
||||||
.machine "power4"
|
|
||||||
mtcrf 0x80,r9
|
|
||||||
mtcrf 0x01,r9 /* slb_allocate uses cr0 and cr7 */
|
|
||||||
.machine pop
|
|
||||||
|
|
||||||
RESTORE_PPR_PACA(PACA_EXSLB, r9)
|
|
||||||
ld r9,PACA_EXSLB+EX_R9(r13)
|
|
||||||
ld r10,PACA_EXSLB+EX_R10(r13)
|
|
||||||
ld r11,PACA_EXSLB+EX_R11(r13)
|
|
||||||
ld r12,PACA_EXSLB+EX_R12(r13)
|
|
||||||
ld r13,PACA_EXSLB+EX_R13(r13)
|
|
||||||
rfid
|
|
||||||
b . /* prevent speculative execution */
|
|
||||||
|
|
||||||
2: mfspr r11,SPRN_SRR0
|
|
||||||
ld r10,PACAKBASE(r13)
|
|
||||||
LOAD_HANDLER(r10,unrecov_slb)
|
|
||||||
mtspr SPRN_SRR0,r10
|
|
||||||
ld r10,PACAKMSR(r13)
|
|
||||||
mtspr SPRN_SRR1,r10
|
|
||||||
rfid
|
|
||||||
b .
|
|
||||||
|
|
||||||
unrecov_slb:
|
|
||||||
EXCEPTION_PROLOG_COMMON(0x4100, PACA_EXSLB)
|
|
||||||
DISABLE_INTS
|
|
||||||
bl .save_nvgprs
|
|
||||||
1: addi r3,r1,STACK_FRAME_OVERHEAD
|
|
||||||
bl .unrecoverable_exception
|
|
||||||
b 1b
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef CONFIG_PPC_970_NAP
|
|
||||||
power4_fixup_nap:
|
|
||||||
andc r9,r9,r10
|
|
||||||
std r9,TI_LOCAL_FLAGS(r11)
|
|
||||||
ld r10,_LINK(r1) /* make idle task do the */
|
|
||||||
std r10,_NIP(r1) /* equivalent of a blr */
|
|
||||||
blr
|
|
||||||
#endif
|
|
||||||
|
|
||||||
.align 7
|
.align 7
|
||||||
.globl alignment_common
|
.globl alignment_common
|
||||||
alignment_common:
|
alignment_common:
|
||||||
|
@ -1335,6 +1263,78 @@ _GLOBAL(opal_mc_secondary_handler)
|
||||||
#endif /* CONFIG_PPC_POWERNV */
|
#endif /* CONFIG_PPC_POWERNV */
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* r13 points to the PACA, r9 contains the saved CR,
|
||||||
|
* r12 contain the saved SRR1, SRR0 is still ready for return
|
||||||
|
* r3 has the faulting address
|
||||||
|
* r9 - r13 are saved in paca->exslb.
|
||||||
|
* r3 is saved in paca->slb_r3
|
||||||
|
* We assume we aren't going to take any exceptions during this procedure.
|
||||||
|
*/
|
||||||
|
_GLOBAL(slb_miss_realmode)
|
||||||
|
mflr r10
|
||||||
|
#ifdef CONFIG_RELOCATABLE
|
||||||
|
mtctr r11
|
||||||
|
#endif
|
||||||
|
|
||||||
|
stw r9,PACA_EXSLB+EX_CCR(r13) /* save CR in exc. frame */
|
||||||
|
std r10,PACA_EXSLB+EX_LR(r13) /* save LR */
|
||||||
|
|
||||||
|
bl .slb_allocate_realmode
|
||||||
|
|
||||||
|
/* All done -- return from exception. */
|
||||||
|
|
||||||
|
ld r10,PACA_EXSLB+EX_LR(r13)
|
||||||
|
ld r3,PACA_EXSLB+EX_R3(r13)
|
||||||
|
lwz r9,PACA_EXSLB+EX_CCR(r13) /* get saved CR */
|
||||||
|
|
||||||
|
mtlr r10
|
||||||
|
|
||||||
|
andi. r10,r12,MSR_RI /* check for unrecoverable exception */
|
||||||
|
beq- 2f
|
||||||
|
|
||||||
|
.machine push
|
||||||
|
.machine "power4"
|
||||||
|
mtcrf 0x80,r9
|
||||||
|
mtcrf 0x01,r9 /* slb_allocate uses cr0 and cr7 */
|
||||||
|
.machine pop
|
||||||
|
|
||||||
|
RESTORE_PPR_PACA(PACA_EXSLB, r9)
|
||||||
|
ld r9,PACA_EXSLB+EX_R9(r13)
|
||||||
|
ld r10,PACA_EXSLB+EX_R10(r13)
|
||||||
|
ld r11,PACA_EXSLB+EX_R11(r13)
|
||||||
|
ld r12,PACA_EXSLB+EX_R12(r13)
|
||||||
|
ld r13,PACA_EXSLB+EX_R13(r13)
|
||||||
|
rfid
|
||||||
|
b . /* prevent speculative execution */
|
||||||
|
|
||||||
|
2: mfspr r11,SPRN_SRR0
|
||||||
|
ld r10,PACAKBASE(r13)
|
||||||
|
LOAD_HANDLER(r10,unrecov_slb)
|
||||||
|
mtspr SPRN_SRR0,r10
|
||||||
|
ld r10,PACAKMSR(r13)
|
||||||
|
mtspr SPRN_SRR1,r10
|
||||||
|
rfid
|
||||||
|
b .
|
||||||
|
|
||||||
|
unrecov_slb:
|
||||||
|
EXCEPTION_PROLOG_COMMON(0x4100, PACA_EXSLB)
|
||||||
|
DISABLE_INTS
|
||||||
|
bl .save_nvgprs
|
||||||
|
1: addi r3,r1,STACK_FRAME_OVERHEAD
|
||||||
|
bl .unrecoverable_exception
|
||||||
|
b 1b
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef CONFIG_PPC_970_NAP
|
||||||
|
power4_fixup_nap:
|
||||||
|
andc r9,r9,r10
|
||||||
|
std r9,TI_LOCAL_FLAGS(r11)
|
||||||
|
ld r10,_LINK(r1) /* make idle task do the */
|
||||||
|
std r10,_NIP(r1) /* equivalent of a blr */
|
||||||
|
blr
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Hash table stuff
|
* Hash table stuff
|
||||||
*/
|
*/
|
||||||
|
@ -1452,20 +1452,36 @@ do_ste_alloc:
|
||||||
_GLOBAL(do_stab_bolted)
|
_GLOBAL(do_stab_bolted)
|
||||||
stw r9,PACA_EXSLB+EX_CCR(r13) /* save CR in exc. frame */
|
stw r9,PACA_EXSLB+EX_CCR(r13) /* save CR in exc. frame */
|
||||||
std r11,PACA_EXSLB+EX_SRR0(r13) /* save SRR0 in exc. frame */
|
std r11,PACA_EXSLB+EX_SRR0(r13) /* save SRR0 in exc. frame */
|
||||||
|
mfspr r11,SPRN_DAR /* ea */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* check for bad kernel/user address
|
||||||
|
* (ea & ~REGION_MASK) >= PGTABLE_RANGE
|
||||||
|
*/
|
||||||
|
rldicr. r9,r11,4,(63 - 46 - 4)
|
||||||
|
li r9,0 /* VSID = 0 for bad address */
|
||||||
|
bne- 0f
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Calculate VSID:
|
||||||
|
* This is the kernel vsid, we take the top for context from
|
||||||
|
* the range. context = (MAX_USER_CONTEXT) + ((ea >> 60) - 0xc) + 1
|
||||||
|
* Here we know that (ea >> 60) == 0xc
|
||||||
|
*/
|
||||||
|
lis r9,(MAX_USER_CONTEXT + 1)@ha
|
||||||
|
addi r9,r9,(MAX_USER_CONTEXT + 1)@l
|
||||||
|
|
||||||
|
srdi r10,r11,SID_SHIFT
|
||||||
|
rldimi r10,r9,ESID_BITS,0 /* proto vsid */
|
||||||
|
ASM_VSID_SCRAMBLE(r10, r9, 256M)
|
||||||
|
rldic r9,r10,12,16 /* r9 = vsid << 12 */
|
||||||
|
|
||||||
|
0:
|
||||||
/* Hash to the primary group */
|
/* Hash to the primary group */
|
||||||
ld r10,PACASTABVIRT(r13)
|
ld r10,PACASTABVIRT(r13)
|
||||||
mfspr r11,SPRN_DAR
|
srdi r11,r11,SID_SHIFT
|
||||||
srdi r11,r11,28
|
|
||||||
rldimi r10,r11,7,52 /* r10 = first ste of the group */
|
rldimi r10,r11,7,52 /* r10 = first ste of the group */
|
||||||
|
|
||||||
/* Calculate VSID */
|
|
||||||
/* This is a kernel address, so protovsid = ESID | 1 << 37 */
|
|
||||||
li r9,0x1
|
|
||||||
rldimi r11,r9,(CONTEXT_BITS + USER_ESID_BITS),0
|
|
||||||
ASM_VSID_SCRAMBLE(r11, r9, 256M)
|
|
||||||
rldic r9,r11,12,16 /* r9 = vsid << 12 */
|
|
||||||
|
|
||||||
/* Search the primary group for a free entry */
|
/* Search the primary group for a free entry */
|
||||||
1: ld r11,0(r10) /* Test valid bit of the current ste */
|
1: ld r11,0(r10) /* Test valid bit of the current ste */
|
||||||
andi. r11,r11,0x80
|
andi. r11,r11,0x80
|
||||||
|
|
|
@ -2832,11 +2832,13 @@ static void unreloc_toc(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
static void __reloc_toc(void *tocstart, unsigned long offset,
|
static void __reloc_toc(unsigned long offset, unsigned long nr_entries)
|
||||||
unsigned long nr_entries)
|
|
||||||
{
|
{
|
||||||
unsigned long i;
|
unsigned long i;
|
||||||
unsigned long *toc_entry = (unsigned long *)tocstart;
|
unsigned long *toc_entry;
|
||||||
|
|
||||||
|
/* Get the start of the TOC by using r2 directly. */
|
||||||
|
asm volatile("addi %0,2,-0x8000" : "=b" (toc_entry));
|
||||||
|
|
||||||
for (i = 0; i < nr_entries; i++) {
|
for (i = 0; i < nr_entries; i++) {
|
||||||
*toc_entry = *toc_entry + offset;
|
*toc_entry = *toc_entry + offset;
|
||||||
|
@ -2850,8 +2852,7 @@ static void reloc_toc(void)
|
||||||
unsigned long nr_entries =
|
unsigned long nr_entries =
|
||||||
(__prom_init_toc_end - __prom_init_toc_start) / sizeof(long);
|
(__prom_init_toc_end - __prom_init_toc_start) / sizeof(long);
|
||||||
|
|
||||||
/* Need to add offset to get at __prom_init_toc_start */
|
__reloc_toc(offset, nr_entries);
|
||||||
__reloc_toc(__prom_init_toc_start + offset, offset, nr_entries);
|
|
||||||
|
|
||||||
mb();
|
mb();
|
||||||
}
|
}
|
||||||
|
@ -2864,8 +2865,7 @@ static void unreloc_toc(void)
|
||||||
|
|
||||||
mb();
|
mb();
|
||||||
|
|
||||||
/* __prom_init_toc_start has been relocated, no need to add offset */
|
__reloc_toc(-offset, nr_entries);
|
||||||
__reloc_toc(__prom_init_toc_start, -offset, nr_entries);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1428,6 +1428,7 @@ static long ppc_set_hwdebug(struct task_struct *child,
|
||||||
|
|
||||||
brk.address = bp_info->addr & ~7UL;
|
brk.address = bp_info->addr & ~7UL;
|
||||||
brk.type = HW_BRK_TYPE_TRANSLATE;
|
brk.type = HW_BRK_TYPE_TRANSLATE;
|
||||||
|
brk.len = 8;
|
||||||
if (bp_info->trigger_type & PPC_BREAKPOINT_TRIGGER_READ)
|
if (bp_info->trigger_type & PPC_BREAKPOINT_TRIGGER_READ)
|
||||||
brk.type |= HW_BRK_TYPE_READ;
|
brk.type |= HW_BRK_TYPE_READ;
|
||||||
if (bp_info->trigger_type & PPC_BREAKPOINT_TRIGGER_WRITE)
|
if (bp_info->trigger_type & PPC_BREAKPOINT_TRIGGER_WRITE)
|
||||||
|
|
|
@ -326,8 +326,8 @@ int kvmppc_mmu_init(struct kvm_vcpu *vcpu)
|
||||||
vcpu3s->context_id[0] = err;
|
vcpu3s->context_id[0] = err;
|
||||||
|
|
||||||
vcpu3s->proto_vsid_max = ((vcpu3s->context_id[0] + 1)
|
vcpu3s->proto_vsid_max = ((vcpu3s->context_id[0] + 1)
|
||||||
<< USER_ESID_BITS) - 1;
|
<< ESID_BITS) - 1;
|
||||||
vcpu3s->proto_vsid_first = vcpu3s->context_id[0] << USER_ESID_BITS;
|
vcpu3s->proto_vsid_first = vcpu3s->context_id[0] << ESID_BITS;
|
||||||
vcpu3s->proto_vsid_next = vcpu3s->proto_vsid_first;
|
vcpu3s->proto_vsid_next = vcpu3s->proto_vsid_first;
|
||||||
|
|
||||||
kvmppc_mmu_hpte_init(vcpu);
|
kvmppc_mmu_hpte_init(vcpu);
|
||||||
|
|
|
@ -195,6 +195,11 @@ int htab_bolt_mapping(unsigned long vstart, unsigned long vend,
|
||||||
unsigned long vpn = hpt_vpn(vaddr, vsid, ssize);
|
unsigned long vpn = hpt_vpn(vaddr, vsid, ssize);
|
||||||
unsigned long tprot = prot;
|
unsigned long tprot = prot;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If we hit a bad address return error.
|
||||||
|
*/
|
||||||
|
if (!vsid)
|
||||||
|
return -1;
|
||||||
/* Make kernel text executable */
|
/* Make kernel text executable */
|
||||||
if (overlaps_kernel_text(vaddr, vaddr + step))
|
if (overlaps_kernel_text(vaddr, vaddr + step))
|
||||||
tprot &= ~HPTE_R_N;
|
tprot &= ~HPTE_R_N;
|
||||||
|
@ -759,6 +764,8 @@ void __init early_init_mmu(void)
|
||||||
/* Initialize stab / SLB management */
|
/* Initialize stab / SLB management */
|
||||||
if (mmu_has_feature(MMU_FTR_SLB))
|
if (mmu_has_feature(MMU_FTR_SLB))
|
||||||
slb_initialize();
|
slb_initialize();
|
||||||
|
else
|
||||||
|
stab_initialize(get_paca()->stab_real);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
|
@ -922,11 +929,6 @@ int hash_page(unsigned long ea, unsigned long access, unsigned long trap)
|
||||||
DBG_LOW("hash_page(ea=%016lx, access=%lx, trap=%lx\n",
|
DBG_LOW("hash_page(ea=%016lx, access=%lx, trap=%lx\n",
|
||||||
ea, access, trap);
|
ea, access, trap);
|
||||||
|
|
||||||
if ((ea & ~REGION_MASK) >= PGTABLE_RANGE) {
|
|
||||||
DBG_LOW(" out of pgtable range !\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Get region & vsid */
|
/* Get region & vsid */
|
||||||
switch (REGION_ID(ea)) {
|
switch (REGION_ID(ea)) {
|
||||||
case USER_REGION_ID:
|
case USER_REGION_ID:
|
||||||
|
@ -957,6 +959,11 @@ int hash_page(unsigned long ea, unsigned long access, unsigned long trap)
|
||||||
}
|
}
|
||||||
DBG_LOW(" mm=%p, mm->pgdir=%p, vsid=%016lx\n", mm, mm->pgd, vsid);
|
DBG_LOW(" mm=%p, mm->pgdir=%p, vsid=%016lx\n", mm, mm->pgd, vsid);
|
||||||
|
|
||||||
|
/* Bad address. */
|
||||||
|
if (!vsid) {
|
||||||
|
DBG_LOW("Bad address!\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
/* Get pgdir */
|
/* Get pgdir */
|
||||||
pgdir = mm->pgd;
|
pgdir = mm->pgd;
|
||||||
if (pgdir == NULL)
|
if (pgdir == NULL)
|
||||||
|
@ -1126,6 +1133,8 @@ void hash_preload(struct mm_struct *mm, unsigned long ea,
|
||||||
/* Get VSID */
|
/* Get VSID */
|
||||||
ssize = user_segment_size(ea);
|
ssize = user_segment_size(ea);
|
||||||
vsid = get_vsid(mm->context.id, ea, ssize);
|
vsid = get_vsid(mm->context.id, ea, ssize);
|
||||||
|
if (!vsid)
|
||||||
|
return;
|
||||||
|
|
||||||
/* Hash doesn't like irqs */
|
/* Hash doesn't like irqs */
|
||||||
local_irq_save(flags);
|
local_irq_save(flags);
|
||||||
|
@ -1233,6 +1242,9 @@ static void kernel_map_linear_page(unsigned long vaddr, unsigned long lmi)
|
||||||
hash = hpt_hash(vpn, PAGE_SHIFT, mmu_kernel_ssize);
|
hash = hpt_hash(vpn, PAGE_SHIFT, mmu_kernel_ssize);
|
||||||
hpteg = ((hash & htab_hash_mask) * HPTES_PER_GROUP);
|
hpteg = ((hash & htab_hash_mask) * HPTES_PER_GROUP);
|
||||||
|
|
||||||
|
/* Don't create HPTE entries for bad address */
|
||||||
|
if (!vsid)
|
||||||
|
return;
|
||||||
ret = ppc_md.hpte_insert(hpteg, vpn, __pa(vaddr),
|
ret = ppc_md.hpte_insert(hpteg, vpn, __pa(vaddr),
|
||||||
mode, HPTE_V_BOLTED,
|
mode, HPTE_V_BOLTED,
|
||||||
mmu_linear_psize, mmu_kernel_ssize);
|
mmu_linear_psize, mmu_kernel_ssize);
|
||||||
|
|
|
@ -29,15 +29,6 @@
|
||||||
static DEFINE_SPINLOCK(mmu_context_lock);
|
static DEFINE_SPINLOCK(mmu_context_lock);
|
||||||
static DEFINE_IDA(mmu_context_ida);
|
static DEFINE_IDA(mmu_context_ida);
|
||||||
|
|
||||||
/*
|
|
||||||
* 256MB segment
|
|
||||||
* The proto-VSID space has 2^(CONTEX_BITS + USER_ESID_BITS) - 1 segments
|
|
||||||
* available for user mappings. Each segment contains 2^28 bytes. Each
|
|
||||||
* context maps 2^46 bytes (64TB) so we can support 2^19-1 contexts
|
|
||||||
* (19 == 37 + 28 - 46).
|
|
||||||
*/
|
|
||||||
#define MAX_CONTEXT ((1UL << CONTEXT_BITS) - 1)
|
|
||||||
|
|
||||||
int __init_new_context(void)
|
int __init_new_context(void)
|
||||||
{
|
{
|
||||||
int index;
|
int index;
|
||||||
|
@ -56,7 +47,7 @@ again:
|
||||||
else if (err)
|
else if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
if (index > MAX_CONTEXT) {
|
if (index > MAX_USER_CONTEXT) {
|
||||||
spin_lock(&mmu_context_lock);
|
spin_lock(&mmu_context_lock);
|
||||||
ida_remove(&mmu_context_ida, index);
|
ida_remove(&mmu_context_ida, index);
|
||||||
spin_unlock(&mmu_context_lock);
|
spin_unlock(&mmu_context_lock);
|
||||||
|
|
|
@ -61,7 +61,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_PPC_STD_MMU_64
|
#ifdef CONFIG_PPC_STD_MMU_64
|
||||||
#if TASK_SIZE_USER64 > (1UL << (USER_ESID_BITS + SID_SHIFT))
|
#if TASK_SIZE_USER64 > (1UL << (ESID_BITS + SID_SHIFT))
|
||||||
#error TASK_SIZE_USER64 exceeds user VSID range
|
#error TASK_SIZE_USER64 exceeds user VSID range
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -31,10 +31,15 @@
|
||||||
* No other registers are examined or changed.
|
* No other registers are examined or changed.
|
||||||
*/
|
*/
|
||||||
_GLOBAL(slb_allocate_realmode)
|
_GLOBAL(slb_allocate_realmode)
|
||||||
/* r3 = faulting address */
|
/*
|
||||||
|
* check for bad kernel/user address
|
||||||
|
* (ea & ~REGION_MASK) >= PGTABLE_RANGE
|
||||||
|
*/
|
||||||
|
rldicr. r9,r3,4,(63 - 46 - 4)
|
||||||
|
bne- 8f
|
||||||
|
|
||||||
srdi r9,r3,60 /* get region */
|
srdi r9,r3,60 /* get region */
|
||||||
srdi r10,r3,28 /* get esid */
|
srdi r10,r3,SID_SHIFT /* get esid */
|
||||||
cmpldi cr7,r9,0xc /* cmp PAGE_OFFSET for later use */
|
cmpldi cr7,r9,0xc /* cmp PAGE_OFFSET for later use */
|
||||||
|
|
||||||
/* r3 = address, r10 = esid, cr7 = <> PAGE_OFFSET */
|
/* r3 = address, r10 = esid, cr7 = <> PAGE_OFFSET */
|
||||||
|
@ -56,12 +61,14 @@ _GLOBAL(slb_allocate_realmode)
|
||||||
*/
|
*/
|
||||||
_GLOBAL(slb_miss_kernel_load_linear)
|
_GLOBAL(slb_miss_kernel_load_linear)
|
||||||
li r11,0
|
li r11,0
|
||||||
li r9,0x1
|
|
||||||
/*
|
/*
|
||||||
* for 1T we shift 12 bits more. slb_finish_load_1T will do
|
* context = (MAX_USER_CONTEXT) + ((ea >> 60) - 0xc) + 1
|
||||||
* the necessary adjustment
|
* r9 = region id.
|
||||||
*/
|
*/
|
||||||
rldimi r10,r9,(CONTEXT_BITS + USER_ESID_BITS),0
|
addis r9,r9,(MAX_USER_CONTEXT - 0xc + 1)@ha
|
||||||
|
addi r9,r9,(MAX_USER_CONTEXT - 0xc + 1)@l
|
||||||
|
|
||||||
|
|
||||||
BEGIN_FTR_SECTION
|
BEGIN_FTR_SECTION
|
||||||
b slb_finish_load
|
b slb_finish_load
|
||||||
END_MMU_FTR_SECTION_IFCLR(MMU_FTR_1T_SEGMENT)
|
END_MMU_FTR_SECTION_IFCLR(MMU_FTR_1T_SEGMENT)
|
||||||
|
@ -91,24 +98,19 @@ _GLOBAL(slb_miss_kernel_load_vmemmap)
|
||||||
_GLOBAL(slb_miss_kernel_load_io)
|
_GLOBAL(slb_miss_kernel_load_io)
|
||||||
li r11,0
|
li r11,0
|
||||||
6:
|
6:
|
||||||
li r9,0x1
|
|
||||||
/*
|
/*
|
||||||
* for 1T we shift 12 bits more. slb_finish_load_1T will do
|
* context = (MAX_USER_CONTEXT) + ((ea >> 60) - 0xc) + 1
|
||||||
* the necessary adjustment
|
* r9 = region id.
|
||||||
*/
|
*/
|
||||||
rldimi r10,r9,(CONTEXT_BITS + USER_ESID_BITS),0
|
addis r9,r9,(MAX_USER_CONTEXT - 0xc + 1)@ha
|
||||||
|
addi r9,r9,(MAX_USER_CONTEXT - 0xc + 1)@l
|
||||||
|
|
||||||
BEGIN_FTR_SECTION
|
BEGIN_FTR_SECTION
|
||||||
b slb_finish_load
|
b slb_finish_load
|
||||||
END_MMU_FTR_SECTION_IFCLR(MMU_FTR_1T_SEGMENT)
|
END_MMU_FTR_SECTION_IFCLR(MMU_FTR_1T_SEGMENT)
|
||||||
b slb_finish_load_1T
|
b slb_finish_load_1T
|
||||||
|
|
||||||
0: /* user address: proto-VSID = context << 15 | ESID. First check
|
0:
|
||||||
* if the address is within the boundaries of the user region
|
|
||||||
*/
|
|
||||||
srdi. r9,r10,USER_ESID_BITS
|
|
||||||
bne- 8f /* invalid ea bits set */
|
|
||||||
|
|
||||||
|
|
||||||
/* when using slices, we extract the psize off the slice bitmaps
|
/* when using slices, we extract the psize off the slice bitmaps
|
||||||
* and then we need to get the sllp encoding off the mmu_psize_defs
|
* and then we need to get the sllp encoding off the mmu_psize_defs
|
||||||
* array.
|
* array.
|
||||||
|
@ -164,15 +166,13 @@ END_MMU_FTR_SECTION_IFCLR(MMU_FTR_1T_SEGMENT)
|
||||||
ld r9,PACACONTEXTID(r13)
|
ld r9,PACACONTEXTID(r13)
|
||||||
BEGIN_FTR_SECTION
|
BEGIN_FTR_SECTION
|
||||||
cmpldi r10,0x1000
|
cmpldi r10,0x1000
|
||||||
END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT)
|
|
||||||
rldimi r10,r9,USER_ESID_BITS,0
|
|
||||||
BEGIN_FTR_SECTION
|
|
||||||
bge slb_finish_load_1T
|
bge slb_finish_load_1T
|
||||||
END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT)
|
END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT)
|
||||||
b slb_finish_load
|
b slb_finish_load
|
||||||
|
|
||||||
8: /* invalid EA */
|
8: /* invalid EA */
|
||||||
li r10,0 /* BAD_VSID */
|
li r10,0 /* BAD_VSID */
|
||||||
|
li r9,0 /* BAD_VSID */
|
||||||
li r11,SLB_VSID_USER /* flags don't much matter */
|
li r11,SLB_VSID_USER /* flags don't much matter */
|
||||||
b slb_finish_load
|
b slb_finish_load
|
||||||
|
|
||||||
|
@ -221,8 +221,6 @@ _GLOBAL(slb_allocate_user)
|
||||||
|
|
||||||
/* get context to calculate proto-VSID */
|
/* get context to calculate proto-VSID */
|
||||||
ld r9,PACACONTEXTID(r13)
|
ld r9,PACACONTEXTID(r13)
|
||||||
rldimi r10,r9,USER_ESID_BITS,0
|
|
||||||
|
|
||||||
/* fall through slb_finish_load */
|
/* fall through slb_finish_load */
|
||||||
|
|
||||||
#endif /* __DISABLED__ */
|
#endif /* __DISABLED__ */
|
||||||
|
@ -231,9 +229,10 @@ _GLOBAL(slb_allocate_user)
|
||||||
/*
|
/*
|
||||||
* Finish loading of an SLB entry and return
|
* Finish loading of an SLB entry and return
|
||||||
*
|
*
|
||||||
* r3 = EA, r10 = proto-VSID, r11 = flags, clobbers r9, cr7 = <> PAGE_OFFSET
|
* r3 = EA, r9 = context, r10 = ESID, r11 = flags, clobbers r9, cr7 = <> PAGE_OFFSET
|
||||||
*/
|
*/
|
||||||
slb_finish_load:
|
slb_finish_load:
|
||||||
|
rldimi r10,r9,ESID_BITS,0
|
||||||
ASM_VSID_SCRAMBLE(r10,r9,256M)
|
ASM_VSID_SCRAMBLE(r10,r9,256M)
|
||||||
/*
|
/*
|
||||||
* bits above VSID_BITS_256M need to be ignored from r10
|
* bits above VSID_BITS_256M need to be ignored from r10
|
||||||
|
@ -298,10 +297,11 @@ _GLOBAL(slb_compare_rr_to_size)
|
||||||
/*
|
/*
|
||||||
* Finish loading of a 1T SLB entry (for the kernel linear mapping) and return.
|
* Finish loading of a 1T SLB entry (for the kernel linear mapping) and return.
|
||||||
*
|
*
|
||||||
* r3 = EA, r10 = proto-VSID, r11 = flags, clobbers r9
|
* r3 = EA, r9 = context, r10 = ESID(256MB), r11 = flags, clobbers r9
|
||||||
*/
|
*/
|
||||||
slb_finish_load_1T:
|
slb_finish_load_1T:
|
||||||
srdi r10,r10,40-28 /* get 1T ESID */
|
srdi r10,r10,(SID_SHIFT_1T - SID_SHIFT) /* get 1T ESID */
|
||||||
|
rldimi r10,r9,ESID_BITS_1T,0
|
||||||
ASM_VSID_SCRAMBLE(r10,r9,1T)
|
ASM_VSID_SCRAMBLE(r10,r9,1T)
|
||||||
/*
|
/*
|
||||||
* bits above VSID_BITS_1T need to be ignored from r10
|
* bits above VSID_BITS_1T need to be ignored from r10
|
||||||
|
|
|
@ -82,11 +82,11 @@ void hpte_need_flush(struct mm_struct *mm, unsigned long addr,
|
||||||
if (!is_kernel_addr(addr)) {
|
if (!is_kernel_addr(addr)) {
|
||||||
ssize = user_segment_size(addr);
|
ssize = user_segment_size(addr);
|
||||||
vsid = get_vsid(mm->context.id, addr, ssize);
|
vsid = get_vsid(mm->context.id, addr, ssize);
|
||||||
WARN_ON(vsid == 0);
|
|
||||||
} else {
|
} else {
|
||||||
vsid = get_kernel_vsid(addr, mmu_kernel_ssize);
|
vsid = get_kernel_vsid(addr, mmu_kernel_ssize);
|
||||||
ssize = mmu_kernel_ssize;
|
ssize = mmu_kernel_ssize;
|
||||||
}
|
}
|
||||||
|
WARN_ON(vsid == 0);
|
||||||
vpn = hpt_vpn(addr, vsid, ssize);
|
vpn = hpt_vpn(addr, vsid, ssize);
|
||||||
rpte = __real_pte(__pte(pte), ptep);
|
rpte = __real_pte(__pte(pte), ptep);
|
||||||
|
|
||||||
|
|
|
@ -420,7 +420,20 @@ static struct attribute_group power7_pmu_events_group = {
|
||||||
.attrs = power7_events_attr,
|
.attrs = power7_events_attr,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
PMU_FORMAT_ATTR(event, "config:0-19");
|
||||||
|
|
||||||
|
static struct attribute *power7_pmu_format_attr[] = {
|
||||||
|
&format_attr_event.attr,
|
||||||
|
NULL,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct attribute_group power7_pmu_format_group = {
|
||||||
|
.name = "format",
|
||||||
|
.attrs = power7_pmu_format_attr,
|
||||||
|
};
|
||||||
|
|
||||||
static const struct attribute_group *power7_pmu_attr_groups[] = {
|
static const struct attribute_group *power7_pmu_attr_groups[] = {
|
||||||
|
&power7_pmu_format_group,
|
||||||
&power7_pmu_events_group,
|
&power7_pmu_events_group,
|
||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
|
|
|
@ -69,7 +69,7 @@ static irqreturn_t gpio_halt_irq(int irq, void *__data)
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __devinit gpio_halt_probe(struct platform_device *pdev)
|
static int gpio_halt_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
enum of_gpio_flags flags;
|
enum of_gpio_flags flags;
|
||||||
struct device_node *node = pdev->dev.of_node;
|
struct device_node *node = pdev->dev.of_node;
|
||||||
|
@ -128,7 +128,7 @@ static int __devinit gpio_halt_probe(struct platform_device *pdev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __devexit gpio_halt_remove(struct platform_device *pdev)
|
static int gpio_halt_remove(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
if (halt_node) {
|
if (halt_node) {
|
||||||
int gpio = of_get_gpio(halt_node, 0);
|
int gpio = of_get_gpio(halt_node, 0);
|
||||||
|
@ -165,7 +165,7 @@ static struct platform_driver gpio_halt_driver = {
|
||||||
.of_match_table = gpio_halt_match,
|
.of_match_table = gpio_halt_match,
|
||||||
},
|
},
|
||||||
.probe = gpio_halt_probe,
|
.probe = gpio_halt_probe,
|
||||||
.remove = __devexit_p(gpio_halt_remove),
|
.remove = gpio_halt_remove,
|
||||||
};
|
};
|
||||||
|
|
||||||
module_platform_driver(gpio_halt_driver);
|
module_platform_driver(gpio_halt_driver);
|
||||||
|
|
|
@ -124,9 +124,8 @@ config 6xx
|
||||||
select PPC_HAVE_PMU_SUPPORT
|
select PPC_HAVE_PMU_SUPPORT
|
||||||
|
|
||||||
config POWER3
|
config POWER3
|
||||||
bool
|
|
||||||
depends on PPC64 && PPC_BOOK3S
|
depends on PPC64 && PPC_BOOK3S
|
||||||
default y if !POWER4_ONLY
|
def_bool y
|
||||||
|
|
||||||
config POWER4
|
config POWER4
|
||||||
depends on PPC64 && PPC_BOOK3S
|
depends on PPC64 && PPC_BOOK3S
|
||||||
|
@ -145,8 +144,7 @@ config TUNE_CELL
|
||||||
but somewhat slower on other machines. This option only changes
|
but somewhat slower on other machines. This option only changes
|
||||||
the scheduling of instructions, not the selection of instructions
|
the scheduling of instructions, not the selection of instructions
|
||||||
itself, so the resulting kernel will keep running on all other
|
itself, so the resulting kernel will keep running on all other
|
||||||
machines. When building a kernel that is supposed to run only
|
machines.
|
||||||
on Cell, you should also select the POWER4_ONLY option.
|
|
||||||
|
|
||||||
# this is temp to handle compat with arch=ppc
|
# this is temp to handle compat with arch=ppc
|
||||||
config 8xx
|
config 8xx
|
||||||
|
|
|
@ -34,6 +34,8 @@ struct arsb {
|
||||||
u32 reserved[4];
|
u32 reserved[4];
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
|
#define EQC_WR_PROHIBIT 22
|
||||||
|
|
||||||
struct msb {
|
struct msb {
|
||||||
u8 fmt:4;
|
u8 fmt:4;
|
||||||
u8 oc:4;
|
u8 oc:4;
|
||||||
|
@ -96,11 +98,13 @@ struct scm_device {
|
||||||
#define OP_STATE_TEMP_ERR 2
|
#define OP_STATE_TEMP_ERR 2
|
||||||
#define OP_STATE_PERM_ERR 3
|
#define OP_STATE_PERM_ERR 3
|
||||||
|
|
||||||
|
enum scm_event {SCM_CHANGE, SCM_AVAIL};
|
||||||
|
|
||||||
struct scm_driver {
|
struct scm_driver {
|
||||||
struct device_driver drv;
|
struct device_driver drv;
|
||||||
int (*probe) (struct scm_device *scmdev);
|
int (*probe) (struct scm_device *scmdev);
|
||||||
int (*remove) (struct scm_device *scmdev);
|
int (*remove) (struct scm_device *scmdev);
|
||||||
void (*notify) (struct scm_device *scmdev);
|
void (*notify) (struct scm_device *scmdev, enum scm_event event);
|
||||||
void (*handler) (struct scm_device *scmdev, void *data, int error);
|
void (*handler) (struct scm_device *scmdev, void *data, int error);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -74,8 +74,6 @@ static inline void __tlb_flush_idte(unsigned long asce)
|
||||||
|
|
||||||
static inline void __tlb_flush_mm(struct mm_struct * mm)
|
static inline void __tlb_flush_mm(struct mm_struct * mm)
|
||||||
{
|
{
|
||||||
if (unlikely(cpumask_empty(mm_cpumask(mm))))
|
|
||||||
return;
|
|
||||||
/*
|
/*
|
||||||
* If the machine has IDTE we prefer to do a per mm flush
|
* If the machine has IDTE we prefer to do a per mm flush
|
||||||
* on all cpus instead of doing a local flush if the mm
|
* on all cpus instead of doing a local flush if the mm
|
||||||
|
|
|
@ -636,7 +636,8 @@ ENTRY(mcck_int_handler)
|
||||||
UPDATE_VTIME %r14,%r15,__LC_MCCK_ENTER_TIMER
|
UPDATE_VTIME %r14,%r15,__LC_MCCK_ENTER_TIMER
|
||||||
mcck_skip:
|
mcck_skip:
|
||||||
SWITCH_ASYNC __LC_GPREGS_SAVE_AREA+32,__LC_PANIC_STACK,PAGE_SHIFT
|
SWITCH_ASYNC __LC_GPREGS_SAVE_AREA+32,__LC_PANIC_STACK,PAGE_SHIFT
|
||||||
mvc __PT_R0(64,%r11),__LC_GPREGS_SAVE_AREA
|
stm %r0,%r7,__PT_R0(%r11)
|
||||||
|
mvc __PT_R8(32,%r11),__LC_GPREGS_SAVE_AREA+32
|
||||||
stm %r8,%r9,__PT_PSW(%r11)
|
stm %r8,%r9,__PT_PSW(%r11)
|
||||||
xc __SF_BACKCHAIN(4,%r15),__SF_BACKCHAIN(%r15)
|
xc __SF_BACKCHAIN(4,%r15),__SF_BACKCHAIN(%r15)
|
||||||
l %r1,BASED(.Ldo_machine_check)
|
l %r1,BASED(.Ldo_machine_check)
|
||||||
|
|
|
@ -678,8 +678,9 @@ ENTRY(mcck_int_handler)
|
||||||
UPDATE_VTIME %r14,__LC_MCCK_ENTER_TIMER
|
UPDATE_VTIME %r14,__LC_MCCK_ENTER_TIMER
|
||||||
LAST_BREAK %r14
|
LAST_BREAK %r14
|
||||||
mcck_skip:
|
mcck_skip:
|
||||||
lghi %r14,__LC_GPREGS_SAVE_AREA
|
lghi %r14,__LC_GPREGS_SAVE_AREA+64
|
||||||
mvc __PT_R0(128,%r11),0(%r14)
|
stmg %r0,%r7,__PT_R0(%r11)
|
||||||
|
mvc __PT_R8(64,%r11),0(%r14)
|
||||||
stmg %r8,%r9,__PT_PSW(%r11)
|
stmg %r8,%r9,__PT_PSW(%r11)
|
||||||
xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15)
|
xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15)
|
||||||
lgr %r2,%r11 # pass pointer to pt_regs
|
lgr %r2,%r11 # pass pointer to pt_regs
|
||||||
|
|
|
@ -571,6 +571,8 @@ static void __init setup_memory_end(void)
|
||||||
|
|
||||||
/* Split remaining virtual space between 1:1 mapping & vmemmap array */
|
/* Split remaining virtual space between 1:1 mapping & vmemmap array */
|
||||||
tmp = VMALLOC_START / (PAGE_SIZE + sizeof(struct page));
|
tmp = VMALLOC_START / (PAGE_SIZE + sizeof(struct page));
|
||||||
|
/* vmemmap contains a multiple of PAGES_PER_SECTION struct pages */
|
||||||
|
tmp = SECTION_ALIGN_UP(tmp);
|
||||||
tmp = VMALLOC_START - tmp * sizeof(struct page);
|
tmp = VMALLOC_START - tmp * sizeof(struct page);
|
||||||
tmp &= ~((vmax >> 11) - 1); /* align to page table level */
|
tmp &= ~((vmax >> 11) - 1); /* align to page table level */
|
||||||
tmp = min(tmp, 1UL << MAX_PHYSMEM_BITS);
|
tmp = min(tmp, 1UL << MAX_PHYSMEM_BITS);
|
||||||
|
|
|
@ -84,12 +84,6 @@ config ARCH_DEFCONFIG
|
||||||
default "arch/sparc/configs/sparc32_defconfig" if SPARC32
|
default "arch/sparc/configs/sparc32_defconfig" if SPARC32
|
||||||
default "arch/sparc/configs/sparc64_defconfig" if SPARC64
|
default "arch/sparc/configs/sparc64_defconfig" if SPARC64
|
||||||
|
|
||||||
# CONFIG_BITS can be used at source level to get 32/64 bits
|
|
||||||
config BITS
|
|
||||||
int
|
|
||||||
default 32 if SPARC32
|
|
||||||
default 64 if SPARC64
|
|
||||||
|
|
||||||
config IOMMU_HELPER
|
config IOMMU_HELPER
|
||||||
bool
|
bool
|
||||||
default y if SPARC64
|
default y if SPARC64
|
||||||
|
@ -197,7 +191,7 @@ config RWSEM_XCHGADD_ALGORITHM
|
||||||
|
|
||||||
config GENERIC_HWEIGHT
|
config GENERIC_HWEIGHT
|
||||||
bool
|
bool
|
||||||
default y if !ULTRA_HAS_POPULATION_COUNT
|
default y
|
||||||
|
|
||||||
config GENERIC_CALIBRATE_DELAY
|
config GENERIC_CALIBRATE_DELAY
|
||||||
bool
|
bool
|
||||||
|
|
|
@ -45,6 +45,7 @@
|
||||||
#define SUN4V_CHIP_NIAGARA3 0x03
|
#define SUN4V_CHIP_NIAGARA3 0x03
|
||||||
#define SUN4V_CHIP_NIAGARA4 0x04
|
#define SUN4V_CHIP_NIAGARA4 0x04
|
||||||
#define SUN4V_CHIP_NIAGARA5 0x05
|
#define SUN4V_CHIP_NIAGARA5 0x05
|
||||||
|
#define SUN4V_CHIP_SPARC64X 0x8a
|
||||||
#define SUN4V_CHIP_UNKNOWN 0xff
|
#define SUN4V_CHIP_UNKNOWN 0xff
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
|
@ -493,6 +493,12 @@ static void __init sun4v_cpu_probe(void)
|
||||||
sparc_pmu_type = "niagara5";
|
sparc_pmu_type = "niagara5";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case SUN4V_CHIP_SPARC64X:
|
||||||
|
sparc_cpu_type = "SPARC64-X";
|
||||||
|
sparc_fpu_type = "SPARC64-X integrated FPU";
|
||||||
|
sparc_pmu_type = "sparc64-x";
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
printk(KERN_WARNING "CPU: Unknown sun4v cpu type [%s]\n",
|
printk(KERN_WARNING "CPU: Unknown sun4v cpu type [%s]\n",
|
||||||
prom_cpu_compatible);
|
prom_cpu_compatible);
|
||||||
|
|
|
@ -134,6 +134,8 @@ prom_niagara_prefix:
|
||||||
.asciz "SUNW,UltraSPARC-T"
|
.asciz "SUNW,UltraSPARC-T"
|
||||||
prom_sparc_prefix:
|
prom_sparc_prefix:
|
||||||
.asciz "SPARC-"
|
.asciz "SPARC-"
|
||||||
|
prom_sparc64x_prefix:
|
||||||
|
.asciz "SPARC64-X"
|
||||||
.align 4
|
.align 4
|
||||||
prom_root_compatible:
|
prom_root_compatible:
|
||||||
.skip 64
|
.skip 64
|
||||||
|
@ -412,7 +414,7 @@ sun4v_chip_type:
|
||||||
cmp %g2, 'T'
|
cmp %g2, 'T'
|
||||||
be,pt %xcc, 70f
|
be,pt %xcc, 70f
|
||||||
cmp %g2, 'M'
|
cmp %g2, 'M'
|
||||||
bne,pn %xcc, 4f
|
bne,pn %xcc, 49f
|
||||||
nop
|
nop
|
||||||
|
|
||||||
70: ldub [%g1 + 7], %g2
|
70: ldub [%g1 + 7], %g2
|
||||||
|
@ -425,7 +427,7 @@ sun4v_chip_type:
|
||||||
cmp %g2, '5'
|
cmp %g2, '5'
|
||||||
be,pt %xcc, 5f
|
be,pt %xcc, 5f
|
||||||
mov SUN4V_CHIP_NIAGARA5, %g4
|
mov SUN4V_CHIP_NIAGARA5, %g4
|
||||||
ba,pt %xcc, 4f
|
ba,pt %xcc, 49f
|
||||||
nop
|
nop
|
||||||
|
|
||||||
91: sethi %hi(prom_cpu_compatible), %g1
|
91: sethi %hi(prom_cpu_compatible), %g1
|
||||||
|
@ -439,6 +441,25 @@ sun4v_chip_type:
|
||||||
mov SUN4V_CHIP_NIAGARA2, %g4
|
mov SUN4V_CHIP_NIAGARA2, %g4
|
||||||
|
|
||||||
4:
|
4:
|
||||||
|
/* Athena */
|
||||||
|
sethi %hi(prom_cpu_compatible), %g1
|
||||||
|
or %g1, %lo(prom_cpu_compatible), %g1
|
||||||
|
sethi %hi(prom_sparc64x_prefix), %g7
|
||||||
|
or %g7, %lo(prom_sparc64x_prefix), %g7
|
||||||
|
mov 9, %g3
|
||||||
|
41: ldub [%g7], %g2
|
||||||
|
ldub [%g1], %g4
|
||||||
|
cmp %g2, %g4
|
||||||
|
bne,pn %icc, 49f
|
||||||
|
add %g7, 1, %g7
|
||||||
|
subcc %g3, 1, %g3
|
||||||
|
bne,pt %xcc, 41b
|
||||||
|
add %g1, 1, %g1
|
||||||
|
mov SUN4V_CHIP_SPARC64X, %g4
|
||||||
|
ba,pt %xcc, 5f
|
||||||
|
nop
|
||||||
|
|
||||||
|
49:
|
||||||
mov SUN4V_CHIP_UNKNOWN, %g4
|
mov SUN4V_CHIP_UNKNOWN, %g4
|
||||||
5: sethi %hi(sun4v_chip_type), %g2
|
5: sethi %hi(sun4v_chip_type), %g2
|
||||||
or %g2, %lo(sun4v_chip_type), %g2
|
or %g2, %lo(sun4v_chip_type), %g2
|
||||||
|
|
|
@ -186,6 +186,8 @@ struct grpci2_cap_first {
|
||||||
#define CAP9_IOMAP_OFS 0x20
|
#define CAP9_IOMAP_OFS 0x20
|
||||||
#define CAP9_BARSIZE_OFS 0x24
|
#define CAP9_BARSIZE_OFS 0x24
|
||||||
|
|
||||||
|
#define TGT 256
|
||||||
|
|
||||||
struct grpci2_priv {
|
struct grpci2_priv {
|
||||||
struct leon_pci_info info; /* must be on top of this structure */
|
struct leon_pci_info info; /* must be on top of this structure */
|
||||||
struct grpci2_regs *regs;
|
struct grpci2_regs *regs;
|
||||||
|
@ -237,8 +239,12 @@ static int grpci2_cfg_r32(struct grpci2_priv *priv, unsigned int bus,
|
||||||
if (where & 0x3)
|
if (where & 0x3)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (bus == 0 && PCI_SLOT(devfn) != 0)
|
if (bus == 0) {
|
||||||
devfn += (0x8 * 6);
|
devfn += (0x8 * 6); /* start at AD16=Device0 */
|
||||||
|
} else if (bus == TGT) {
|
||||||
|
bus = 0;
|
||||||
|
devfn = 0; /* special case: bridge controller itself */
|
||||||
|
}
|
||||||
|
|
||||||
/* Select bus */
|
/* Select bus */
|
||||||
spin_lock_irqsave(&grpci2_dev_lock, flags);
|
spin_lock_irqsave(&grpci2_dev_lock, flags);
|
||||||
|
@ -303,8 +309,12 @@ static int grpci2_cfg_w32(struct grpci2_priv *priv, unsigned int bus,
|
||||||
if (where & 0x3)
|
if (where & 0x3)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (bus == 0 && PCI_SLOT(devfn) != 0)
|
if (bus == 0) {
|
||||||
devfn += (0x8 * 6);
|
devfn += (0x8 * 6); /* start at AD16=Device0 */
|
||||||
|
} else if (bus == TGT) {
|
||||||
|
bus = 0;
|
||||||
|
devfn = 0; /* special case: bridge controller itself */
|
||||||
|
}
|
||||||
|
|
||||||
/* Select bus */
|
/* Select bus */
|
||||||
spin_lock_irqsave(&grpci2_dev_lock, flags);
|
spin_lock_irqsave(&grpci2_dev_lock, flags);
|
||||||
|
@ -368,7 +378,7 @@ static int grpci2_read_config(struct pci_bus *bus, unsigned int devfn,
|
||||||
unsigned int busno = bus->number;
|
unsigned int busno = bus->number;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (PCI_SLOT(devfn) > 15 || (PCI_SLOT(devfn) == 0 && busno == 0)) {
|
if (PCI_SLOT(devfn) > 15 || busno > 255) {
|
||||||
*val = ~0;
|
*val = ~0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -406,7 +416,7 @@ static int grpci2_write_config(struct pci_bus *bus, unsigned int devfn,
|
||||||
struct grpci2_priv *priv = grpci2priv;
|
struct grpci2_priv *priv = grpci2priv;
|
||||||
unsigned int busno = bus->number;
|
unsigned int busno = bus->number;
|
||||||
|
|
||||||
if (PCI_SLOT(devfn) > 15 || (PCI_SLOT(devfn) == 0 && busno == 0))
|
if (PCI_SLOT(devfn) > 15 || busno > 255)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
#ifdef GRPCI2_DEBUG_CFGACCESS
|
#ifdef GRPCI2_DEBUG_CFGACCESS
|
||||||
|
@ -578,15 +588,15 @@ void grpci2_hw_init(struct grpci2_priv *priv)
|
||||||
REGSTORE(regs->ahbmst_map[i], priv->pci_area);
|
REGSTORE(regs->ahbmst_map[i], priv->pci_area);
|
||||||
|
|
||||||
/* Get the GRPCI2 Host PCI ID */
|
/* Get the GRPCI2 Host PCI ID */
|
||||||
grpci2_cfg_r32(priv, 0, 0, PCI_VENDOR_ID, &priv->pciid);
|
grpci2_cfg_r32(priv, TGT, 0, PCI_VENDOR_ID, &priv->pciid);
|
||||||
|
|
||||||
/* Get address to first (always defined) capability structure */
|
/* Get address to first (always defined) capability structure */
|
||||||
grpci2_cfg_r8(priv, 0, 0, PCI_CAPABILITY_LIST, &capptr);
|
grpci2_cfg_r8(priv, TGT, 0, PCI_CAPABILITY_LIST, &capptr);
|
||||||
|
|
||||||
/* Enable/Disable Byte twisting */
|
/* Enable/Disable Byte twisting */
|
||||||
grpci2_cfg_r32(priv, 0, 0, capptr+CAP9_IOMAP_OFS, &io_map);
|
grpci2_cfg_r32(priv, TGT, 0, capptr+CAP9_IOMAP_OFS, &io_map);
|
||||||
io_map = (io_map & ~0x1) | (priv->bt_enabled ? 1 : 0);
|
io_map = (io_map & ~0x1) | (priv->bt_enabled ? 1 : 0);
|
||||||
grpci2_cfg_w32(priv, 0, 0, capptr+CAP9_IOMAP_OFS, io_map);
|
grpci2_cfg_w32(priv, TGT, 0, capptr+CAP9_IOMAP_OFS, io_map);
|
||||||
|
|
||||||
/* Setup the Host's PCI Target BARs for other peripherals to access,
|
/* Setup the Host's PCI Target BARs for other peripherals to access,
|
||||||
* and do DMA to the host's memory. The target BARs can be sized and
|
* and do DMA to the host's memory. The target BARs can be sized and
|
||||||
|
@ -617,17 +627,18 @@ void grpci2_hw_init(struct grpci2_priv *priv)
|
||||||
pciadr = 0;
|
pciadr = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
grpci2_cfg_w32(priv, 0, 0, capptr+CAP9_BARSIZE_OFS+i*4, bar_sz);
|
grpci2_cfg_w32(priv, TGT, 0, capptr+CAP9_BARSIZE_OFS+i*4,
|
||||||
grpci2_cfg_w32(priv, 0, 0, PCI_BASE_ADDRESS_0+i*4, pciadr);
|
bar_sz);
|
||||||
grpci2_cfg_w32(priv, 0, 0, capptr+CAP9_BAR_OFS+i*4, ahbadr);
|
grpci2_cfg_w32(priv, TGT, 0, PCI_BASE_ADDRESS_0+i*4, pciadr);
|
||||||
|
grpci2_cfg_w32(priv, TGT, 0, capptr+CAP9_BAR_OFS+i*4, ahbadr);
|
||||||
printk(KERN_INFO " TGT BAR[%d]: 0x%08x (PCI)-> 0x%08x\n",
|
printk(KERN_INFO " TGT BAR[%d]: 0x%08x (PCI)-> 0x%08x\n",
|
||||||
i, pciadr, ahbadr);
|
i, pciadr, ahbadr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* set as bus master and enable pci memory responses */
|
/* set as bus master and enable pci memory responses */
|
||||||
grpci2_cfg_r32(priv, 0, 0, PCI_COMMAND, &data);
|
grpci2_cfg_r32(priv, TGT, 0, PCI_COMMAND, &data);
|
||||||
data |= (PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER);
|
data |= (PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER);
|
||||||
grpci2_cfg_w32(priv, 0, 0, PCI_COMMAND, data);
|
grpci2_cfg_w32(priv, TGT, 0, PCI_COMMAND, data);
|
||||||
|
|
||||||
/* Enable Error respone (CPU-TRAP) on illegal memory access. */
|
/* Enable Error respone (CPU-TRAP) on illegal memory access. */
|
||||||
REGSTORE(regs->ctrl, CTRL_ER | CTRL_PE);
|
REGSTORE(regs->ctrl, CTRL_ER | CTRL_PE);
|
||||||
|
|
|
@ -330,7 +330,6 @@ CONFIG_MD_RAID0=m
|
||||||
CONFIG_MD_RAID1=m
|
CONFIG_MD_RAID1=m
|
||||||
CONFIG_MD_RAID10=m
|
CONFIG_MD_RAID10=m
|
||||||
CONFIG_MD_RAID456=m
|
CONFIG_MD_RAID456=m
|
||||||
CONFIG_MULTICORE_RAID456=y
|
|
||||||
CONFIG_MD_FAULTY=m
|
CONFIG_MD_FAULTY=m
|
||||||
CONFIG_BLK_DEV_DM=m
|
CONFIG_BLK_DEV_DM=m
|
||||||
CONFIG_DM_DEBUG=y
|
CONFIG_DM_DEBUG=y
|
||||||
|
|
|
@ -324,7 +324,6 @@ CONFIG_MD_RAID0=m
|
||||||
CONFIG_MD_RAID1=m
|
CONFIG_MD_RAID1=m
|
||||||
CONFIG_MD_RAID10=m
|
CONFIG_MD_RAID10=m
|
||||||
CONFIG_MD_RAID456=m
|
CONFIG_MD_RAID456=m
|
||||||
CONFIG_MULTICORE_RAID456=y
|
|
||||||
CONFIG_MD_FAULTY=m
|
CONFIG_MD_FAULTY=m
|
||||||
CONFIG_BLK_DEV_DM=m
|
CONFIG_BLK_DEV_DM=m
|
||||||
CONFIG_DM_DEBUG=y
|
CONFIG_DM_DEBUG=y
|
||||||
|
|
|
@ -77,6 +77,7 @@ struct arch_specific_insn {
|
||||||
* a post_handler or break_handler).
|
* a post_handler or break_handler).
|
||||||
*/
|
*/
|
||||||
int boostable;
|
int boostable;
|
||||||
|
bool if_modifier;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct arch_optimized_insn {
|
struct arch_optimized_insn {
|
||||||
|
|
|
@ -414,8 +414,8 @@ struct kvm_vcpu_arch {
|
||||||
gpa_t time;
|
gpa_t time;
|
||||||
struct pvclock_vcpu_time_info hv_clock;
|
struct pvclock_vcpu_time_info hv_clock;
|
||||||
unsigned int hw_tsc_khz;
|
unsigned int hw_tsc_khz;
|
||||||
unsigned int time_offset;
|
struct gfn_to_hva_cache pv_time;
|
||||||
struct page *time_page;
|
bool pv_time_enabled;
|
||||||
/* set guest stopped flag in pvclock flags field */
|
/* set guest stopped flag in pvclock flags field */
|
||||||
bool pvclock_set_guest_stopped_request;
|
bool pvclock_set_guest_stopped_request;
|
||||||
|
|
||||||
|
|
|
@ -382,14 +382,14 @@ HYPERVISOR_console_io(int cmd, int count, char *str)
|
||||||
return _hypercall3(int, console_io, cmd, count, str);
|
return _hypercall3(int, console_io, cmd, count, str);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int __must_check HYPERVISOR_physdev_op_compat(int, void *);
|
extern int __must_check xen_physdev_op_compat(int, void *);
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
HYPERVISOR_physdev_op(int cmd, void *arg)
|
HYPERVISOR_physdev_op(int cmd, void *arg)
|
||||||
{
|
{
|
||||||
int rc = _hypercall2(int, physdev_op, cmd, arg);
|
int rc = _hypercall2(int, physdev_op, cmd, arg);
|
||||||
if (unlikely(rc == -ENOSYS))
|
if (unlikely(rc == -ENOSYS))
|
||||||
rc = HYPERVISOR_physdev_op_compat(cmd, arg);
|
rc = xen_physdev_op_compat(cmd, arg);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -44,6 +44,7 @@
|
||||||
#define SNB_C1_AUTO_UNDEMOTE (1UL << 27)
|
#define SNB_C1_AUTO_UNDEMOTE (1UL << 27)
|
||||||
#define SNB_C3_AUTO_UNDEMOTE (1UL << 28)
|
#define SNB_C3_AUTO_UNDEMOTE (1UL << 28)
|
||||||
|
|
||||||
|
#define MSR_PLATFORM_INFO 0x000000ce
|
||||||
#define MSR_MTRRcap 0x000000fe
|
#define MSR_MTRRcap 0x000000fe
|
||||||
#define MSR_IA32_BBL_CR_CTL 0x00000119
|
#define MSR_IA32_BBL_CR_CTL 0x00000119
|
||||||
#define MSR_IA32_BBL_CR_CTL3 0x0000011e
|
#define MSR_IA32_BBL_CR_CTL3 0x0000011e
|
||||||
|
|
|
@ -101,6 +101,10 @@ static struct event_constraint intel_snb_event_constraints[] __read_mostly =
|
||||||
FIXED_EVENT_CONSTRAINT(0x00c0, 0), /* INST_RETIRED.ANY */
|
FIXED_EVENT_CONSTRAINT(0x00c0, 0), /* INST_RETIRED.ANY */
|
||||||
FIXED_EVENT_CONSTRAINT(0x003c, 1), /* CPU_CLK_UNHALTED.CORE */
|
FIXED_EVENT_CONSTRAINT(0x003c, 1), /* CPU_CLK_UNHALTED.CORE */
|
||||||
FIXED_EVENT_CONSTRAINT(0x0300, 2), /* CPU_CLK_UNHALTED.REF */
|
FIXED_EVENT_CONSTRAINT(0x0300, 2), /* CPU_CLK_UNHALTED.REF */
|
||||||
|
INTEL_UEVENT_CONSTRAINT(0x04a3, 0xf), /* CYCLE_ACTIVITY.CYCLES_NO_DISPATCH */
|
||||||
|
INTEL_UEVENT_CONSTRAINT(0x05a3, 0xf), /* CYCLE_ACTIVITY.STALLS_L2_PENDING */
|
||||||
|
INTEL_UEVENT_CONSTRAINT(0x02a3, 0x4), /* CYCLE_ACTIVITY.CYCLES_L1D_PENDING */
|
||||||
|
INTEL_UEVENT_CONSTRAINT(0x06a3, 0x4), /* CYCLE_ACTIVITY.STALLS_L1D_PENDING */
|
||||||
INTEL_EVENT_CONSTRAINT(0x48, 0x4), /* L1D_PEND_MISS.PENDING */
|
INTEL_EVENT_CONSTRAINT(0x48, 0x4), /* L1D_PEND_MISS.PENDING */
|
||||||
INTEL_UEVENT_CONSTRAINT(0x01c0, 0x2), /* INST_RETIRED.PREC_DIST */
|
INTEL_UEVENT_CONSTRAINT(0x01c0, 0x2), /* INST_RETIRED.PREC_DIST */
|
||||||
INTEL_EVENT_CONSTRAINT(0xcd, 0x8), /* MEM_TRANS_RETIRED.LOAD_LATENCY */
|
INTEL_EVENT_CONSTRAINT(0xcd, 0x8), /* MEM_TRANS_RETIRED.LOAD_LATENCY */
|
||||||
|
|
|
@ -375,6 +375,9 @@ static void __kprobes arch_copy_kprobe(struct kprobe *p)
|
||||||
else
|
else
|
||||||
p->ainsn.boostable = -1;
|
p->ainsn.boostable = -1;
|
||||||
|
|
||||||
|
/* Check whether the instruction modifies Interrupt Flag or not */
|
||||||
|
p->ainsn.if_modifier = is_IF_modifier(p->ainsn.insn);
|
||||||
|
|
||||||
/* Also, displacement change doesn't affect the first byte */
|
/* Also, displacement change doesn't affect the first byte */
|
||||||
p->opcode = p->ainsn.insn[0];
|
p->opcode = p->ainsn.insn[0];
|
||||||
}
|
}
|
||||||
|
@ -434,7 +437,7 @@ static void __kprobes set_current_kprobe(struct kprobe *p, struct pt_regs *regs,
|
||||||
__this_cpu_write(current_kprobe, p);
|
__this_cpu_write(current_kprobe, p);
|
||||||
kcb->kprobe_saved_flags = kcb->kprobe_old_flags
|
kcb->kprobe_saved_flags = kcb->kprobe_old_flags
|
||||||
= (regs->flags & (X86_EFLAGS_TF | X86_EFLAGS_IF));
|
= (regs->flags & (X86_EFLAGS_TF | X86_EFLAGS_IF));
|
||||||
if (is_IF_modifier(p->ainsn.insn))
|
if (p->ainsn.if_modifier)
|
||||||
kcb->kprobe_saved_flags &= ~X86_EFLAGS_IF;
|
kcb->kprobe_saved_flags &= ~X86_EFLAGS_IF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -90,13 +90,13 @@ microcode_phys(struct microcode_intel **mc_saved_tmp,
|
||||||
struct microcode_intel ***mc_saved;
|
struct microcode_intel ***mc_saved;
|
||||||
|
|
||||||
mc_saved = (struct microcode_intel ***)
|
mc_saved = (struct microcode_intel ***)
|
||||||
__pa_symbol(&mc_saved_data->mc_saved);
|
__pa_nodebug(&mc_saved_data->mc_saved);
|
||||||
for (i = 0; i < mc_saved_data->mc_saved_count; i++) {
|
for (i = 0; i < mc_saved_data->mc_saved_count; i++) {
|
||||||
struct microcode_intel *p;
|
struct microcode_intel *p;
|
||||||
|
|
||||||
p = *(struct microcode_intel **)
|
p = *(struct microcode_intel **)
|
||||||
__pa(mc_saved_data->mc_saved + i);
|
__pa_nodebug(mc_saved_data->mc_saved + i);
|
||||||
mc_saved_tmp[i] = (struct microcode_intel *)__pa(p);
|
mc_saved_tmp[i] = (struct microcode_intel *)__pa_nodebug(p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -562,7 +562,7 @@ scan_microcode(unsigned long start, unsigned long end,
|
||||||
struct cpio_data cd;
|
struct cpio_data cd;
|
||||||
long offset = 0;
|
long offset = 0;
|
||||||
#ifdef CONFIG_X86_32
|
#ifdef CONFIG_X86_32
|
||||||
char *p = (char *)__pa_symbol(ucode_name);
|
char *p = (char *)__pa_nodebug(ucode_name);
|
||||||
#else
|
#else
|
||||||
char *p = ucode_name;
|
char *p = ucode_name;
|
||||||
#endif
|
#endif
|
||||||
|
@ -630,8 +630,8 @@ static void __cpuinit print_ucode(struct ucode_cpu_info *uci)
|
||||||
if (mc_intel == NULL)
|
if (mc_intel == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
delay_ucode_info_p = (int *)__pa_symbol(&delay_ucode_info);
|
delay_ucode_info_p = (int *)__pa_nodebug(&delay_ucode_info);
|
||||||
current_mc_date_p = (int *)__pa_symbol(¤t_mc_date);
|
current_mc_date_p = (int *)__pa_nodebug(¤t_mc_date);
|
||||||
|
|
||||||
*delay_ucode_info_p = 1;
|
*delay_ucode_info_p = 1;
|
||||||
*current_mc_date_p = mc_intel->hdr.date;
|
*current_mc_date_p = mc_intel->hdr.date;
|
||||||
|
@ -659,8 +659,8 @@ static inline void __cpuinit print_ucode(struct ucode_cpu_info *uci)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int apply_microcode_early(struct mc_saved_data *mc_saved_data,
|
static int __cpuinit apply_microcode_early(struct mc_saved_data *mc_saved_data,
|
||||||
struct ucode_cpu_info *uci)
|
struct ucode_cpu_info *uci)
|
||||||
{
|
{
|
||||||
struct microcode_intel *mc_intel;
|
struct microcode_intel *mc_intel;
|
||||||
unsigned int val[2];
|
unsigned int val[2];
|
||||||
|
@ -741,15 +741,15 @@ load_ucode_intel_bsp(void)
|
||||||
#ifdef CONFIG_X86_32
|
#ifdef CONFIG_X86_32
|
||||||
struct boot_params *boot_params_p;
|
struct boot_params *boot_params_p;
|
||||||
|
|
||||||
boot_params_p = (struct boot_params *)__pa_symbol(&boot_params);
|
boot_params_p = (struct boot_params *)__pa_nodebug(&boot_params);
|
||||||
ramdisk_image = boot_params_p->hdr.ramdisk_image;
|
ramdisk_image = boot_params_p->hdr.ramdisk_image;
|
||||||
ramdisk_size = boot_params_p->hdr.ramdisk_size;
|
ramdisk_size = boot_params_p->hdr.ramdisk_size;
|
||||||
initrd_start_early = ramdisk_image;
|
initrd_start_early = ramdisk_image;
|
||||||
initrd_end_early = initrd_start_early + ramdisk_size;
|
initrd_end_early = initrd_start_early + ramdisk_size;
|
||||||
|
|
||||||
_load_ucode_intel_bsp(
|
_load_ucode_intel_bsp(
|
||||||
(struct mc_saved_data *)__pa_symbol(&mc_saved_data),
|
(struct mc_saved_data *)__pa_nodebug(&mc_saved_data),
|
||||||
(unsigned long *)__pa_symbol(&mc_saved_in_initrd),
|
(unsigned long *)__pa_nodebug(&mc_saved_in_initrd),
|
||||||
initrd_start_early, initrd_end_early, &uci);
|
initrd_start_early, initrd_end_early, &uci);
|
||||||
#else
|
#else
|
||||||
ramdisk_image = boot_params.hdr.ramdisk_image;
|
ramdisk_image = boot_params.hdr.ramdisk_image;
|
||||||
|
@ -772,10 +772,10 @@ void __cpuinit load_ucode_intel_ap(void)
|
||||||
unsigned long *initrd_start_p;
|
unsigned long *initrd_start_p;
|
||||||
|
|
||||||
mc_saved_in_initrd_p =
|
mc_saved_in_initrd_p =
|
||||||
(unsigned long *)__pa_symbol(mc_saved_in_initrd);
|
(unsigned long *)__pa_nodebug(mc_saved_in_initrd);
|
||||||
mc_saved_data_p = (struct mc_saved_data *)__pa_symbol(&mc_saved_data);
|
mc_saved_data_p = (struct mc_saved_data *)__pa_nodebug(&mc_saved_data);
|
||||||
initrd_start_p = (unsigned long *)__pa_symbol(&initrd_start);
|
initrd_start_p = (unsigned long *)__pa_nodebug(&initrd_start);
|
||||||
initrd_start_addr = (unsigned long)__pa_symbol(*initrd_start_p);
|
initrd_start_addr = (unsigned long)__pa_nodebug(*initrd_start_p);
|
||||||
#else
|
#else
|
||||||
mc_saved_data_p = &mc_saved_data;
|
mc_saved_data_p = &mc_saved_data;
|
||||||
mc_saved_in_initrd_p = mc_saved_in_initrd;
|
mc_saved_in_initrd_p = mc_saved_in_initrd;
|
||||||
|
|
|
@ -1406,25 +1406,15 @@ static int kvm_guest_time_update(struct kvm_vcpu *v)
|
||||||
unsigned long flags, this_tsc_khz;
|
unsigned long flags, this_tsc_khz;
|
||||||
struct kvm_vcpu_arch *vcpu = &v->arch;
|
struct kvm_vcpu_arch *vcpu = &v->arch;
|
||||||
struct kvm_arch *ka = &v->kvm->arch;
|
struct kvm_arch *ka = &v->kvm->arch;
|
||||||
void *shared_kaddr;
|
|
||||||
s64 kernel_ns, max_kernel_ns;
|
s64 kernel_ns, max_kernel_ns;
|
||||||
u64 tsc_timestamp, host_tsc;
|
u64 tsc_timestamp, host_tsc;
|
||||||
struct pvclock_vcpu_time_info *guest_hv_clock;
|
struct pvclock_vcpu_time_info guest_hv_clock;
|
||||||
u8 pvclock_flags;
|
u8 pvclock_flags;
|
||||||
bool use_master_clock;
|
bool use_master_clock;
|
||||||
|
|
||||||
kernel_ns = 0;
|
kernel_ns = 0;
|
||||||
host_tsc = 0;
|
host_tsc = 0;
|
||||||
|
|
||||||
/* Keep irq disabled to prevent changes to the clock */
|
|
||||||
local_irq_save(flags);
|
|
||||||
this_tsc_khz = __get_cpu_var(cpu_tsc_khz);
|
|
||||||
if (unlikely(this_tsc_khz == 0)) {
|
|
||||||
local_irq_restore(flags);
|
|
||||||
kvm_make_request(KVM_REQ_CLOCK_UPDATE, v);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the host uses TSC clock, then passthrough TSC as stable
|
* If the host uses TSC clock, then passthrough TSC as stable
|
||||||
* to the guest.
|
* to the guest.
|
||||||
|
@ -1436,6 +1426,15 @@ static int kvm_guest_time_update(struct kvm_vcpu *v)
|
||||||
kernel_ns = ka->master_kernel_ns;
|
kernel_ns = ka->master_kernel_ns;
|
||||||
}
|
}
|
||||||
spin_unlock(&ka->pvclock_gtod_sync_lock);
|
spin_unlock(&ka->pvclock_gtod_sync_lock);
|
||||||
|
|
||||||
|
/* Keep irq disabled to prevent changes to the clock */
|
||||||
|
local_irq_save(flags);
|
||||||
|
this_tsc_khz = __get_cpu_var(cpu_tsc_khz);
|
||||||
|
if (unlikely(this_tsc_khz == 0)) {
|
||||||
|
local_irq_restore(flags);
|
||||||
|
kvm_make_request(KVM_REQ_CLOCK_UPDATE, v);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
if (!use_master_clock) {
|
if (!use_master_clock) {
|
||||||
host_tsc = native_read_tsc();
|
host_tsc = native_read_tsc();
|
||||||
kernel_ns = get_kernel_ns();
|
kernel_ns = get_kernel_ns();
|
||||||
|
@ -1463,7 +1462,7 @@ static int kvm_guest_time_update(struct kvm_vcpu *v)
|
||||||
|
|
||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
|
|
||||||
if (!vcpu->time_page)
|
if (!vcpu->pv_time_enabled)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1525,12 +1524,12 @@ static int kvm_guest_time_update(struct kvm_vcpu *v)
|
||||||
*/
|
*/
|
||||||
vcpu->hv_clock.version += 2;
|
vcpu->hv_clock.version += 2;
|
||||||
|
|
||||||
shared_kaddr = kmap_atomic(vcpu->time_page);
|
if (unlikely(kvm_read_guest_cached(v->kvm, &vcpu->pv_time,
|
||||||
|
&guest_hv_clock, sizeof(guest_hv_clock))))
|
||||||
guest_hv_clock = shared_kaddr + vcpu->time_offset;
|
return 0;
|
||||||
|
|
||||||
/* retain PVCLOCK_GUEST_STOPPED if set in guest copy */
|
/* retain PVCLOCK_GUEST_STOPPED if set in guest copy */
|
||||||
pvclock_flags = (guest_hv_clock->flags & PVCLOCK_GUEST_STOPPED);
|
pvclock_flags = (guest_hv_clock.flags & PVCLOCK_GUEST_STOPPED);
|
||||||
|
|
||||||
if (vcpu->pvclock_set_guest_stopped_request) {
|
if (vcpu->pvclock_set_guest_stopped_request) {
|
||||||
pvclock_flags |= PVCLOCK_GUEST_STOPPED;
|
pvclock_flags |= PVCLOCK_GUEST_STOPPED;
|
||||||
|
@ -1543,12 +1542,9 @@ static int kvm_guest_time_update(struct kvm_vcpu *v)
|
||||||
|
|
||||||
vcpu->hv_clock.flags = pvclock_flags;
|
vcpu->hv_clock.flags = pvclock_flags;
|
||||||
|
|
||||||
memcpy(shared_kaddr + vcpu->time_offset, &vcpu->hv_clock,
|
kvm_write_guest_cached(v->kvm, &vcpu->pv_time,
|
||||||
sizeof(vcpu->hv_clock));
|
&vcpu->hv_clock,
|
||||||
|
sizeof(vcpu->hv_clock));
|
||||||
kunmap_atomic(shared_kaddr);
|
|
||||||
|
|
||||||
mark_page_dirty(v->kvm, vcpu->time >> PAGE_SHIFT);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1837,10 +1833,7 @@ static int kvm_pv_enable_async_pf(struct kvm_vcpu *vcpu, u64 data)
|
||||||
|
|
||||||
static void kvmclock_reset(struct kvm_vcpu *vcpu)
|
static void kvmclock_reset(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
if (vcpu->arch.time_page) {
|
vcpu->arch.pv_time_enabled = false;
|
||||||
kvm_release_page_dirty(vcpu->arch.time_page);
|
|
||||||
vcpu->arch.time_page = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void accumulate_steal_time(struct kvm_vcpu *vcpu)
|
static void accumulate_steal_time(struct kvm_vcpu *vcpu)
|
||||||
|
@ -1947,6 +1940,7 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
|
||||||
break;
|
break;
|
||||||
case MSR_KVM_SYSTEM_TIME_NEW:
|
case MSR_KVM_SYSTEM_TIME_NEW:
|
||||||
case MSR_KVM_SYSTEM_TIME: {
|
case MSR_KVM_SYSTEM_TIME: {
|
||||||
|
u64 gpa_offset;
|
||||||
kvmclock_reset(vcpu);
|
kvmclock_reset(vcpu);
|
||||||
|
|
||||||
vcpu->arch.time = data;
|
vcpu->arch.time = data;
|
||||||
|
@ -1956,14 +1950,17 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
|
||||||
if (!(data & 1))
|
if (!(data & 1))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* ...but clean it before doing the actual write */
|
gpa_offset = data & ~(PAGE_MASK | 1);
|
||||||
vcpu->arch.time_offset = data & ~(PAGE_MASK | 1);
|
|
||||||
|
|
||||||
vcpu->arch.time_page =
|
/* Check that the address is 32-byte aligned. */
|
||||||
gfn_to_page(vcpu->kvm, data >> PAGE_SHIFT);
|
if (gpa_offset & (sizeof(struct pvclock_vcpu_time_info) - 1))
|
||||||
|
break;
|
||||||
|
|
||||||
if (is_error_page(vcpu->arch.time_page))
|
if (kvm_gfn_to_hva_cache_init(vcpu->kvm,
|
||||||
vcpu->arch.time_page = NULL;
|
&vcpu->arch.pv_time, data & ~1ULL))
|
||||||
|
vcpu->arch.pv_time_enabled = false;
|
||||||
|
else
|
||||||
|
vcpu->arch.pv_time_enabled = true;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -2967,7 +2964,7 @@ static int kvm_vcpu_ioctl_x86_set_xcrs(struct kvm_vcpu *vcpu,
|
||||||
*/
|
*/
|
||||||
static int kvm_set_guest_paused(struct kvm_vcpu *vcpu)
|
static int kvm_set_guest_paused(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
if (!vcpu->arch.time_page)
|
if (!vcpu->arch.pv_time_enabled)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
vcpu->arch.pvclock_set_guest_stopped_request = true;
|
vcpu->arch.pvclock_set_guest_stopped_request = true;
|
||||||
kvm_make_request(KVM_REQ_CLOCK_UPDATE, vcpu);
|
kvm_make_request(KVM_REQ_CLOCK_UPDATE, vcpu);
|
||||||
|
@ -6718,6 +6715,7 @@ int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu)
|
||||||
goto fail_free_wbinvd_dirty_mask;
|
goto fail_free_wbinvd_dirty_mask;
|
||||||
|
|
||||||
vcpu->arch.ia32_tsc_adjust_msr = 0x0;
|
vcpu->arch.ia32_tsc_adjust_msr = 0x0;
|
||||||
|
vcpu->arch.pv_time_enabled = false;
|
||||||
kvm_async_pf_hash_reset(vcpu);
|
kvm_async_pf_hash_reset(vcpu);
|
||||||
kvm_pmu_init(vcpu);
|
kvm_pmu_init(vcpu);
|
||||||
|
|
||||||
|
|
|
@ -74,10 +74,10 @@ copy_user_handle_tail(char *to, char *from, unsigned len, unsigned zerorest)
|
||||||
char c;
|
char c;
|
||||||
unsigned zero_len;
|
unsigned zero_len;
|
||||||
|
|
||||||
for (; len; --len) {
|
for (; len; --len, to++) {
|
||||||
if (__get_user_nocheck(c, from++, sizeof(char)))
|
if (__get_user_nocheck(c, from++, sizeof(char)))
|
||||||
break;
|
break;
|
||||||
if (__put_user_nocheck(c, to++, sizeof(char)))
|
if (__put_user_nocheck(c, to, sizeof(char)))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1467,8 +1467,6 @@ static void __init xen_write_cr3_init(unsigned long cr3)
|
||||||
__xen_write_cr3(true, cr3);
|
__xen_write_cr3(true, cr3);
|
||||||
|
|
||||||
xen_mc_issue(PARAVIRT_LAZY_CPU); /* interrupts restored */
|
xen_mc_issue(PARAVIRT_LAZY_CPU); /* interrupts restored */
|
||||||
|
|
||||||
pv_mmu_ops.write_cr3 = &xen_write_cr3;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -2122,6 +2120,7 @@ static void __init xen_post_allocator_init(void)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_X86_64
|
#ifdef CONFIG_X86_64
|
||||||
|
pv_mmu_ops.write_cr3 = &xen_write_cr3;
|
||||||
SetPagePinned(virt_to_page(level3_user_vsyscall));
|
SetPagePinned(virt_to_page(level3_user_vsyscall));
|
||||||
#endif
|
#endif
|
||||||
xen_mark_init_mm_pinned();
|
xen_mark_init_mm_pinned();
|
||||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче