Merge 3.9-rc4 into usb-next
This picks up the fixes we had for USB in 3.9-rc4 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Коммит
2849a3a945
8
CREDITS
8
CREDITS
|
@ -1510,6 +1510,14 @@ D: Natsemi ethernet
|
|||
D: Cobalt Networks (x86) support
|
||||
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
|
||||
E: hohndel@suse.de
|
||||
D: The XFree86[tm] Project
|
||||
|
|
|
@ -13,9 +13,6 @@ Required parent device properties:
|
|||
4 = active high level-sensitive
|
||||
8 = active low level-sensitive
|
||||
|
||||
Optional parent device properties:
|
||||
- reg : contains the PRCMU mailbox address for the AB8500 i2c port
|
||||
|
||||
The AB8500 consists of a large and varied group of sub-devices:
|
||||
|
||||
Device IRQ Names Supply Names Description
|
||||
|
@ -86,9 +83,8 @@ Non-standard child device properties:
|
|||
- stericsson,amic2-bias-vamic1 : Analoge Mic wishes to use a non-standard Vamic
|
||||
- stericsson,earpeice-cmv : Earpeice voltage (only: 950 | 1100 | 1270 | 1580)
|
||||
|
||||
ab8500@5 {
|
||||
ab8500 {
|
||||
compatible = "stericsson,ab8500";
|
||||
reg = <5>; /* mailbox 5 is i2c */
|
||||
interrupts = <0 40 0x4>;
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <2>;
|
||||
|
|
|
@ -23,7 +23,7 @@ Supported chips:
|
|||
Datasheet: Publicly available at the Maxim website
|
||||
http://www.maxim-ic.com/
|
||||
* Microchip (TelCom) TCN75
|
||||
Prefix: 'lm75'
|
||||
Prefix: 'tcn75'
|
||||
Addresses scanned: none
|
||||
Datasheet: Publicly available at the Microchip website
|
||||
http://www.microchip.com/
|
||||
|
|
|
@ -5,7 +5,7 @@ Supported adapters:
|
|||
Documentation:
|
||||
http://www.diolan.com/i2c/u2c12.html
|
||||
|
||||
Author: Guenter Roeck <guenter.roeck@ericsson.com>
|
||||
Author: Guenter Roeck <linux@roeck-us.net>
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
|
|
@ -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
|
||||
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
|
||||
"codec-patch". It's sometimes good for testing and debugging.
|
||||
|
||||
|
|
|
@ -285,7 +285,7 @@ sample data.
|
|||
<H4>
|
||||
7.2.4 Close Callback</H4>
|
||||
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
|
||||
done here, too. This callback must not be NULL.
|
||||
<H4>
|
||||
|
|
58
MAINTAINERS
58
MAINTAINERS
|
@ -1338,12 +1338,6 @@ S: Maintained
|
|||
F: drivers/platform/x86/asus*.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
|
||||
M: Dan Williams <djbw@fb.com>
|
||||
W: http://sourceforge.net/projects/xscaleiop
|
||||
|
@ -1467,6 +1461,12 @@ F: drivers/dma/at_hdmac.c
|
|||
F: drivers/dma/at_hdmac_regs.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
|
||||
M: Josh Wu <josh.wu@atmel.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
|
@ -2629,7 +2629,7 @@ F: include/uapi/drm/
|
|||
|
||||
INTEL DRM DRIVERS (excluding Poulsbo, Moorestown and derivative chipsets)
|
||||
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
|
||||
T: git git://people.freedesktop.org/~danvet/drm-intel
|
||||
S: Supported
|
||||
|
@ -3851,7 +3851,7 @@ F: drivers/i2c/busses/i2c-ismt.c
|
|||
F: Documentation/i2c/busses/i2c-ismt
|
||||
|
||||
I2C/SMBUS STUB DRIVER
|
||||
M: "Mark M. Hoffman" <mhoffman@lightlink.com>
|
||||
M: Jean Delvare <khali@linux-fr.org>
|
||||
L: linux-i2c@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/i2c/i2c-stub.c
|
||||
|
@ -4005,6 +4005,22 @@ M: Stanislaw Gruszka <stf_xl@wp.pl>
|
|||
S: Maintained
|
||||
F: drivers/usb/atm/ueagle-atm.c
|
||||
|
||||
INA209 HARDWARE MONITOR DRIVER
|
||||
M: Guenter Roeck <linux@roeck-us.net>
|
||||
L: lm-sensors@lm-sensors.org
|
||||
S: Maintained
|
||||
F: Documentation/hwmon/ina209
|
||||
F: Documentation/devicetree/bindings/i2c/ina209.txt
|
||||
F: drivers/hwmon/ina209.c
|
||||
|
||||
INA2XX HARDWARE MONITOR DRIVER
|
||||
M: Guenter Roeck <linux@roeck-us.net>
|
||||
L: lm-sensors@lm-sensors.org
|
||||
S: Maintained
|
||||
F: Documentation/hwmon/ina2xx
|
||||
F: drivers/hwmon/ina2xx.c
|
||||
F: include/linux/platform_data/ina2xx.h
|
||||
|
||||
INDUSTRY PACK SUBSYSTEM (IPACK)
|
||||
M: Samuel Iglesias Gonsalvez <siglesias@igalia.com>
|
||||
M: Jens Taprogge <jens.taprogge@taprogge.org>
|
||||
|
@ -5098,6 +5114,15 @@ S: Maintained
|
|||
F: Documentation/hwmon/max6650
|
||||
F: drivers/hwmon/max6650.c
|
||||
|
||||
MAX6697 HARDWARE MONITOR DRIVER
|
||||
M: Guenter Roeck <linux@roeck-us.net>
|
||||
L: lm-sensors@lm-sensors.org
|
||||
S: Maintained
|
||||
F: Documentation/hwmon/max6697
|
||||
F: Documentation/devicetree/bindings/i2c/max6697.txt
|
||||
F: drivers/hwmon/max6697.c
|
||||
F: include/linux/platform_data/max6697.h
|
||||
|
||||
MAXIRADIO FM RADIO RECEIVER DRIVER
|
||||
M: Hans Verkuil <hverkuil@xs4all.nl>
|
||||
L: linux-media@vger.kernel.org
|
||||
|
@ -5622,6 +5647,14 @@ S: Maintained
|
|||
F: drivers/video/riva/
|
||||
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
|
||||
M: Tony Lindgren <tony@atomide.com>
|
||||
L: linux-omap@vger.kernel.org
|
||||
|
@ -7173,13 +7206,6 @@ L: netdev@vger.kernel.org
|
|||
S: Maintained
|
||||
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
|
||||
M: Thomas Winischhofer <thomas@winischhofer.net>
|
||||
W: http://www.winischhofer.net/linuxsisvga.shtml
|
||||
|
@ -7257,7 +7283,7 @@ F: Documentation/hwmon/sch5627
|
|||
F: drivers/hwmon/sch5627.c
|
||||
|
||||
SMSC47B397 HARDWARE MONITOR DRIVER
|
||||
M: "Mark M. Hoffman" <mhoffman@lightlink.com>
|
||||
M: Jean Delvare <khali@linux-fr.org>
|
||||
L: lm-sensors@lm-sensors.org
|
||||
S: Maintained
|
||||
F: Documentation/hwmon/smsc47b397
|
||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
|||
VERSION = 3
|
||||
PATCHLEVEL = 9
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc2
|
||||
EXTRAVERSION = -rc4
|
||||
NAME = Unicycling Gorilla
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
@ -49,7 +49,6 @@ config ARM
|
|||
select HAVE_REGS_AND_STACK_ACCESS_API
|
||||
select HAVE_SYSCALL_TRACEPOINTS
|
||||
select HAVE_UID16
|
||||
select VIRT_TO_BUS
|
||||
select KTIME_SCALAR
|
||||
select PERF_USE_VMALLOC
|
||||
select RTC_LIB
|
||||
|
@ -743,6 +742,7 @@ config ARCH_RPC
|
|||
select NEED_MACH_IO_H
|
||||
select NEED_MACH_MEMORY_H
|
||||
select NO_IOPORT
|
||||
select VIRT_TO_BUS
|
||||
help
|
||||
On the Acorn Risc-PC, Linux can support the internal IDE disk and
|
||||
CD-ROM interface, serial and parallel port, and the floppy drive.
|
||||
|
@ -878,6 +878,7 @@ config ARCH_SHARK
|
|||
select ISA_DMA
|
||||
select NEED_MACH_MEMORY_H
|
||||
select PCI
|
||||
select VIRT_TO_BUS
|
||||
select ZONE_DMA
|
||||
help
|
||||
Support for the StrongARM based Digital DNARD machine, also known
|
||||
|
@ -1005,12 +1006,12 @@ config ARCH_MULTI_V4_V5
|
|||
bool
|
||||
|
||||
config ARCH_MULTI_V6
|
||||
bool "ARMv6 based platforms (ARM11, Scorpion, ...)"
|
||||
bool "ARMv6 based platforms (ARM11)"
|
||||
select ARCH_MULTI_V6_V7
|
||||
select CPU_V6
|
||||
|
||||
config ARCH_MULTI_V7
|
||||
bool "ARMv7 based platforms (Cortex-A, PJ4, Krait)"
|
||||
bool "ARMv7 based platforms (Cortex-A, PJ4, Scorpion, Krait)"
|
||||
default y
|
||||
select ARCH_MULTI_V6_V7
|
||||
select ARCH_VEXPRESS
|
||||
|
@ -1461,10 +1462,6 @@ config ISA_DMA
|
|||
bool
|
||||
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
|
||||
config ISA_DMA_API
|
||||
bool
|
||||
|
|
|
@ -238,8 +238,32 @@
|
|||
nand {
|
||||
pinctrl_nand: nand-0 {
|
||||
atmel,pins =
|
||||
<3 4 0x0 0x1 /* PD5 gpio RDY pin pull_up */
|
||||
3 5 0x0 0x1>; /* PD4 gpio enable pin pull_up */
|
||||
<3 0 0x1 0x0 /* PD0 periph A Read Enable */
|
||||
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 */
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -319,9 +319,8 @@
|
|||
};
|
||||
};
|
||||
|
||||
ab8500@5 {
|
||||
ab8500 {
|
||||
compatible = "stericsson,ab8500";
|
||||
reg = <5>; /* mailbox 5 is i2c */
|
||||
interrupt-parent = <&intc>;
|
||||
interrupts = <0 40 0x4>;
|
||||
interrupt-controller;
|
||||
|
|
|
@ -275,18 +275,27 @@
|
|||
compatible = "arm,pl330", "arm,primecell";
|
||||
reg = <0x12680000 0x1000>;
|
||||
interrupts = <0 35 0>;
|
||||
#dma-cells = <1>;
|
||||
#dma-channels = <8>;
|
||||
#dma-requests = <32>;
|
||||
};
|
||||
|
||||
pdma1: pdma@12690000 {
|
||||
compatible = "arm,pl330", "arm,primecell";
|
||||
reg = <0x12690000 0x1000>;
|
||||
interrupts = <0 36 0>;
|
||||
#dma-cells = <1>;
|
||||
#dma-channels = <8>;
|
||||
#dma-requests = <32>;
|
||||
};
|
||||
|
||||
mdma1: mdma@12850000 {
|
||||
compatible = "arm,pl330", "arm,primecell";
|
||||
reg = <0x12850000 0x1000>;
|
||||
interrupts = <0 34 0>;
|
||||
#dma-cells = <1>;
|
||||
#dma-channels = <8>;
|
||||
#dma-requests = <1>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
|
@ -142,12 +142,18 @@
|
|||
compatible = "arm,pl330", "arm,primecell";
|
||||
reg = <0x120000 0x1000>;
|
||||
interrupts = <0 34 0>;
|
||||
#dma-cells = <1>;
|
||||
#dma-channels = <8>;
|
||||
#dma-requests = <32>;
|
||||
};
|
||||
|
||||
pdma1: pdma@121B0000 {
|
||||
compatible = "arm,pl330", "arm,primecell";
|
||||
reg = <0x121000 0x1000>;
|
||||
interrupts = <0 35 0>;
|
||||
#dma-cells = <1>;
|
||||
#dma-channels = <8>;
|
||||
#dma-requests = <32>;
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -221,7 +221,7 @@
|
|||
};
|
||||
};
|
||||
|
||||
ab8500@5 {
|
||||
ab8500 {
|
||||
ab8500-regulators {
|
||||
ab8500_ldo_aux1_reg: ab8500_ldo_aux1 {
|
||||
regulator-name = "V-DISPLAY";
|
||||
|
|
|
@ -158,7 +158,7 @@
|
|||
};
|
||||
};
|
||||
|
||||
ab8500@5 {
|
||||
ab8500 {
|
||||
ab8500-regulators {
|
||||
ab8500_ldo_aux1_reg: ab8500_ldo_aux1 {
|
||||
regulator-name = "V-DISPLAY";
|
||||
|
|
|
@ -298,7 +298,7 @@
|
|||
};
|
||||
};
|
||||
|
||||
ab8500@5 {
|
||||
ab8500 {
|
||||
ab8500-regulators {
|
||||
ab8500_ldo_aux1_reg: ab8500_ldo_aux1 {
|
||||
regulator-name = "V-DISPLAY";
|
||||
|
|
|
@ -480,7 +480,7 @@ static void __cpuinit broadcast_timer_setup(struct clock_event_device *evt)
|
|||
evt->features = CLOCK_EVT_FEAT_ONESHOT |
|
||||
CLOCK_EVT_FEAT_PERIODIC |
|
||||
CLOCK_EVT_FEAT_DUMMY;
|
||||
evt->rating = 400;
|
||||
evt->rating = 100;
|
||||
evt->mult = 1;
|
||||
evt->set_mode = broadcast_timer_set_mode;
|
||||
|
||||
|
|
|
@ -14,31 +14,15 @@
|
|||
|
||||
.text
|
||||
.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)
|
||||
/*
|
||||
* Preserve the contents of r0 for the return value.
|
||||
*/
|
||||
mov ip, r0
|
||||
ands r3, ip, #3 @ 1 unaligned?
|
||||
bne 1b @ 1
|
||||
ands r3, r0, #3 @ 1 unaligned?
|
||||
mov ip, r0 @ preserve r0 as return value
|
||||
bne 6f @ 1
|
||||
/*
|
||||
* 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
|
||||
mov r3, r1
|
||||
cmp r2, #16
|
||||
|
@ -127,4 +111,13 @@ ENTRY(memset)
|
|||
tst r2, #1
|
||||
strneb r1, [ip], #1
|
||||
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)
|
||||
|
|
|
@ -176,6 +176,7 @@ static struct w1_gpio_platform_data w1_gpio_pdata = {
|
|||
/* If you choose to use a pin other than PB16 it needs to be 3.3V */
|
||||
.pin = AT91_PIN_PB16,
|
||||
.is_open_drain = 1,
|
||||
.ext_pullup_enable_pin = -EINVAL,
|
||||
};
|
||||
|
||||
static struct platform_device w1_device = {
|
||||
|
|
|
@ -188,6 +188,7 @@ static struct spi_board_info portuxg20_spi_devices[] = {
|
|||
static struct w1_gpio_platform_data w1_gpio_pdata = {
|
||||
.pin = AT91_PIN_PA29,
|
||||
.is_open_drain = 1,
|
||||
.ext_pullup_enable_pin = -EINVAL,
|
||||
};
|
||||
|
||||
static struct platform_device w1_device = {
|
||||
|
|
|
@ -209,6 +209,14 @@ extern int at91_get_gpio_value(unsigned pin);
|
|||
extern void at91_gpio_suspend(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
|
||||
|
|
|
@ -92,23 +92,21 @@ static int at91_aic_set_wake(struct irq_data *d, unsigned value)
|
|||
|
||||
void at91_irq_suspend(void)
|
||||
{
|
||||
int i = 0, bit;
|
||||
int bit = -1;
|
||||
|
||||
if (has_aic5()) {
|
||||
/* 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,
|
||||
bit & AT91_AIC5_INTSEL_MSK);
|
||||
at91_aic_write(AT91_AIC5_IDCR, 1);
|
||||
i = bit;
|
||||
}
|
||||
/* enable wakeup irqs */
|
||||
i = 0;
|
||||
while ((bit = find_next_bit(wakeups, n_irqs, i)) < n_irqs) {
|
||||
bit = -1;
|
||||
while ((bit = find_next_bit(wakeups, n_irqs, bit + 1)) < n_irqs) {
|
||||
at91_aic_write(AT91_AIC5_SSR,
|
||||
bit & AT91_AIC5_INTSEL_MSK);
|
||||
at91_aic_write(AT91_AIC5_IECR, 1);
|
||||
i = bit;
|
||||
}
|
||||
} else {
|
||||
at91_aic_write(AT91_AIC_IDCR, *backups);
|
||||
|
@ -118,23 +116,21 @@ void at91_irq_suspend(void)
|
|||
|
||||
void at91_irq_resume(void)
|
||||
{
|
||||
int i = 0, bit;
|
||||
int bit = -1;
|
||||
|
||||
if (has_aic5()) {
|
||||
/* 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,
|
||||
bit & AT91_AIC5_INTSEL_MSK);
|
||||
at91_aic_write(AT91_AIC5_IDCR, 1);
|
||||
i = bit;
|
||||
}
|
||||
/* enable irqs disabled for suspend */
|
||||
i = 0;
|
||||
while ((bit = find_next_bit(backups, n_irqs, i)) < n_irqs) {
|
||||
bit = -1;
|
||||
while ((bit = find_next_bit(backups, n_irqs, bit + 1)) < n_irqs) {
|
||||
at91_aic_write(AT91_AIC5_SSR,
|
||||
bit & AT91_AIC5_INTSEL_MSK);
|
||||
at91_aic_write(AT91_AIC5_IECR, 1);
|
||||
i = bit;
|
||||
}
|
||||
} else {
|
||||
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)
|
||||
{
|
||||
at91_gpio_suspend();
|
||||
if (of_have_populated_dt())
|
||||
at91_pinctrl_gpio_suspend();
|
||||
else
|
||||
at91_gpio_suspend();
|
||||
at91_irq_suspend();
|
||||
|
||||
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:
|
||||
target_state = PM_SUSPEND_ON;
|
||||
at91_irq_resume();
|
||||
at91_gpio_resume();
|
||||
if (of_have_populated_dt())
|
||||
at91_pinctrl_gpio_resume();
|
||||
else
|
||||
at91_gpio_resume();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -743,6 +743,9 @@ EXPORT_SYMBOL(edma_free_channel);
|
|||
*/
|
||||
int edma_alloc_slot(unsigned ctlr, int slot)
|
||||
{
|
||||
if (!edma_cc[ctlr])
|
||||
return -EINVAL;
|
||||
|
||||
if (slot >= 0)
|
||||
slot = EDMA_CHAN_SLOT(slot);
|
||||
|
||||
|
|
|
@ -67,6 +67,7 @@ config ARCH_NETWINDER
|
|||
select ISA
|
||||
select ISA_DMA
|
||||
select PCI
|
||||
select VIRT_TO_BUS
|
||||
help
|
||||
Say Y here if you intend to run this kernel on the Rebel.COM
|
||||
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[iim_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
|
||||
|
|
|
@ -27,6 +27,11 @@ static const char * const imx25_dt_board_compat[] __initconst = {
|
|||
NULL
|
||||
};
|
||||
|
||||
static void __init imx25_timer_init(void)
|
||||
{
|
||||
mx25_clocks_init_dt();
|
||||
}
|
||||
|
||||
DT_MACHINE_START(IMX25_DT, "Freescale i.MX25 (Device Tree Support)")
|
||||
.map_io = mx25_map_io,
|
||||
.init_early = imx25_init_early,
|
||||
|
|
|
@ -163,6 +163,7 @@ static struct platform_device vulcan_max6369 = {
|
|||
|
||||
static struct w1_gpio_platform_data vulcan_w1_gpio_pdata = {
|
||||
.pin = 14,
|
||||
.ext_pullup_enable_pin = -EINVAL,
|
||||
};
|
||||
|
||||
static struct platform_device vulcan_w1_gpio = {
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/gpio.h>
|
||||
|
||||
#include <asm/mach/arch.h>
|
||||
|
|
|
@ -505,6 +505,7 @@ static struct w1_gpio_platform_data w1_gpio_platform_data = {
|
|||
.pin = GPIO_ONE_WIRE,
|
||||
.is_open_drain = 0,
|
||||
.enable_external_pullup = w1_enable_external_pullup,
|
||||
.ext_pullup_enable_pin = -EINVAL,
|
||||
};
|
||||
|
||||
struct platform_device raumfeld_w1_gpio_device = {
|
||||
|
|
|
@ -214,11 +214,6 @@ static struct clk clk_pcmcdclk2 = {
|
|||
.name = "pcmcdclk",
|
||||
};
|
||||
|
||||
static struct clk dummy_apb_pclk = {
|
||||
.name = "apb_pclk",
|
||||
.id = -1,
|
||||
};
|
||||
|
||||
static struct clk *clkset_vpllsrc_list[] = {
|
||||
[0] = &clk_fin_vpll,
|
||||
[1] = &clk_sclk_hdmi27m,
|
||||
|
@ -305,18 +300,6 @@ static struct clk_ops clk_fout_apll_ops = {
|
|||
|
||||
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",
|
||||
.parent = &clk_hclk_dsys.clk,
|
||||
.enable = s5pv210_clk_ip0_ctrl,
|
||||
|
@ -573,6 +556,20 @@ static struct clk clk_hsmmc3 = {
|
|||
.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[] = {
|
||||
[6] = &clk_mout_mpll.clk,
|
||||
[7] = &clk_mout_epll.clk,
|
||||
|
@ -1075,6 +1072,8 @@ static struct clk *clk_cdev[] = {
|
|||
&clk_hsmmc1,
|
||||
&clk_hsmmc2,
|
||||
&clk_hsmmc3,
|
||||
&clk_pdma0,
|
||||
&clk_pdma1,
|
||||
};
|
||||
|
||||
/* Clock initialisation code */
|
||||
|
@ -1333,6 +1332,8 @@ static struct clk_lookup s5pv210_clk_lookup[] = {
|
|||
CLKDEV_INIT(NULL, "spi_busclk0", &clk_p),
|
||||
CLKDEV_INIT("s5pv210-spi.0", "spi_busclk1", &clk_sclk_spi0.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)
|
||||
|
@ -1361,6 +1362,5 @@ void __init s5pv210_register_clocks(void)
|
|||
for (ptr = 0; ptr < ARRAY_SIZE(clk_cdev); ptr++)
|
||||
s3c_disable_clocks(clk_cdev[ptr], 1);
|
||||
|
||||
s3c24xx_register_clock(&dummy_apb_pclk);
|
||||
s3c_pwmclk_init();
|
||||
}
|
||||
|
|
|
@ -845,7 +845,7 @@ static struct fimc_source_info goni_camera_sensors[] = {
|
|||
.mux_id = 0,
|
||||
.flags = V4L2_MBUS_PCLK_SAMPLE_FALLING |
|
||||
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,
|
||||
.i2c_bus_num = 0,
|
||||
.clk_frequency = 16000000UL,
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
#include <linux/smsc911x.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/sh_hspi.h>
|
||||
#include <linux/mmc/host.h>
|
||||
#include <linux/mmc/sh_mobile_sdhi.h>
|
||||
#include <linux/mfd/tmio.h>
|
||||
#include <linux/usb/otg.h>
|
||||
|
|
|
@ -342,6 +342,7 @@ static int __init atomic_pool_init(void)
|
|||
{
|
||||
struct dma_pool *pool = &atomic_pool;
|
||||
pgprot_t prot = pgprot_dmacoherent(pgprot_kernel);
|
||||
gfp_t gfp = GFP_KERNEL | GFP_DMA;
|
||||
unsigned long nr_pages = pool->size >> PAGE_SHIFT;
|
||||
unsigned long *bitmap;
|
||||
struct page *page;
|
||||
|
@ -361,8 +362,8 @@ static int __init atomic_pool_init(void)
|
|||
ptr = __alloc_from_contiguous(NULL, pool->size, prot, &page,
|
||||
atomic_pool_init);
|
||||
else
|
||||
ptr = __alloc_remap_buffer(NULL, pool->size, GFP_KERNEL, prot,
|
||||
&page, atomic_pool_init);
|
||||
ptr = __alloc_remap_buffer(NULL, pool->size, gfp, prot, &page,
|
||||
atomic_pool_init);
|
||||
if (ptr) {
|
||||
int i;
|
||||
|
||||
|
|
|
@ -576,7 +576,7 @@ load_ind:
|
|||
/* x = ((*(frame + k)) & 0xf) << 2; */
|
||||
ctx->seen |= SEEN_X | SEEN_DATA | SEEN_CALL;
|
||||
/* the interpreter should deal with the negative K */
|
||||
if (k < 0)
|
||||
if ((int)k < 0)
|
||||
return -1;
|
||||
/* offset in r1: we might have to take the slow path */
|
||||
emit_mov_i(r_off, k, ctx);
|
||||
|
|
|
@ -9,7 +9,6 @@ config ARM64
|
|||
select CLONE_BACKWARDS
|
||||
select COMMON_CLK
|
||||
select GENERIC_CLOCKEVENTS
|
||||
select GENERIC_HARDIRQS_NO_DEPRECATED
|
||||
select GENERIC_IOMAP
|
||||
select GENERIC_IRQ_PROBE
|
||||
select GENERIC_IRQ_SHOW
|
||||
|
|
|
@ -6,17 +6,6 @@ config FRAME_POINTER
|
|||
bool
|
||||
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
|
||||
bool "Enable stack utilization instrumentation"
|
||||
depends on DEBUG_KERNEL
|
||||
|
|
|
@ -82,4 +82,3 @@ CONFIG_DEBUG_KERNEL=y
|
|||
CONFIG_DEBUG_INFO=y
|
||||
# CONFIG_FTRACE is not set
|
||||
CONFIG_ATOMIC64_SELFTEST=y
|
||||
CONFIG_DEBUG_ERRORS=y
|
||||
|
|
|
@ -22,7 +22,7 @@ struct ucontext {
|
|||
stack_t uc_stack;
|
||||
sigset_t uc_sigmask;
|
||||
/* 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 */
|
||||
struct sigcontext uc_mcontext;
|
||||
};
|
||||
|
|
|
@ -40,7 +40,9 @@ EXPORT_SYMBOL(__copy_to_user);
|
|||
EXPORT_SYMBOL(__clear_user);
|
||||
|
||||
/* bitops */
|
||||
#ifdef CONFIG_SMP
|
||||
EXPORT_SYMBOL(__atomic_hash);
|
||||
#endif
|
||||
|
||||
/* physical memory */
|
||||
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)
|
||||
{
|
||||
struct compat_rt_sigframe __user *frame;
|
||||
compat_stack_t stack;
|
||||
int err = 0;
|
||||
|
||||
frame = compat_get_sigframe(ka, regs, sizeof(*frame));
|
||||
|
|
|
@ -9,10 +9,9 @@ config OPENRISC
|
|||
select OF_EARLY_FLATTREE
|
||||
select IRQ_DOMAIN
|
||||
select HAVE_MEMBLOCK
|
||||
select ARCH_WANT_OPTIONAL_GPIOLIB
|
||||
select ARCH_REQUIRE_GPIOLIB
|
||||
select HAVE_ARCH_TRACEHOOK
|
||||
select HAVE_GENERIC_HARDIRQS
|
||||
select VIRT_TO_BUS
|
||||
select GENERIC_IRQ_CHIP
|
||||
select GENERIC_IRQ_PROBE
|
||||
select GENERIC_IRQ_SHOW
|
||||
|
|
|
@ -90,6 +90,7 @@ config GENERIC_GPIO
|
|||
config PPC
|
||||
bool
|
||||
default y
|
||||
select BINFMT_ELF
|
||||
select OF
|
||||
select OF_EARLY_FLATTREE
|
||||
select HAVE_FTRACE_MCOUNT_RECORD
|
||||
|
|
|
@ -343,17 +343,16 @@ extern void slb_set_size(u16 size);
|
|||
/*
|
||||
* VSID allocation (256MB segment)
|
||||
*
|
||||
* We first generate a 38-bit "proto-VSID". For kernel addresses this
|
||||
* is equal to the ESID | 1 << 37, for user addresses it is:
|
||||
* (context << USER_ESID_BITS) | (esid & ((1U << USER_ESID_BITS) - 1)
|
||||
* We first generate a 37-bit "proto-VSID". Proto-VSIDs are generated
|
||||
* from mmu context id and effective segment id of the address.
|
||||
*
|
||||
* This splits the proto-VSID into the below range
|
||||
* 0 - (2^(CONTEXT_BITS + USER_ESID_BITS) - 1) : User proto-VSID range
|
||||
* 2^(CONTEXT_BITS + USER_ESID_BITS) - 2^(VSID_BITS) : Kernel proto-VSID range
|
||||
*
|
||||
* We also have CONTEXT_BITS + USER_ESID_BITS = VSID_BITS - 1
|
||||
* That is, we assign half of the space to user processes and half
|
||||
* to the kernel.
|
||||
* For user processes max context id is limited to ((1ul << 19) - 5)
|
||||
* for kernel space, we use the top 4 context ids to map address as below
|
||||
* NOTE: each context only support 64TB now.
|
||||
* 0x7fffc - [ 0xc000000000000000 - 0xc0003fffffffffff ]
|
||||
* 0x7fffd - [ 0xd000000000000000 - 0xd0003fffffffffff ]
|
||||
* 0x7fffe - [ 0xe000000000000000 - 0xe0003fffffffffff ]
|
||||
* 0x7ffff - [ 0xf000000000000000 - 0xf0003fffffffffff ]
|
||||
*
|
||||
* The proto-VSIDs are then scrambled into real VSIDs with the
|
||||
* multiplicative hash:
|
||||
|
@ -363,41 +362,49 @@ extern void slb_set_size(u16 size);
|
|||
* VSID_MULTIPLIER is prime, so in particular it is
|
||||
* 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
|
||||
* 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
|
||||
* (i.e. everything above 0xC000000000000000), except the very top
|
||||
* segment, which simplifies several things.
|
||||
*
|
||||
* - We allow for USER_ESID_BITS significant bits of ESID and
|
||||
* 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.
|
||||
* We also need to avoid the last segment of the last context, because that
|
||||
* would give a protovsid of 0x1fffffffff. That will result in a VSID 0
|
||||
* 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
|
||||
* (it's 56 bytes per page of system memory).
|
||||
*/
|
||||
|
||||
#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
|
||||
* 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_BITS_256M 38
|
||||
#define VSID_BITS_256M (CONTEXT_BITS + ESID_BITS)
|
||||
#define VSID_MODULUS_256M ((1UL<<VSID_BITS_256M)-1)
|
||||
|
||||
#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 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
|
||||
|
@ -421,7 +428,8 @@ extern void slb_set_size(u16 size);
|
|||
srdi rx,rt,VSID_BITS_##size; \
|
||||
clrldi rt,rt,(64-VSID_BITS_##size); \
|
||||
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, 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 \
|
||||
|
@ -513,34 +521,6 @@ typedef struct {
|
|||
})
|
||||
#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 */
|
||||
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;
|
||||
}
|
||||
|
||||
/* This is only valid for user addresses (which are below 2^44) */
|
||||
static inline unsigned long get_vsid(unsigned long context, unsigned long ea,
|
||||
int ssize)
|
||||
{
|
||||
/*
|
||||
* Bad address. We return VSID 0 for that
|
||||
*/
|
||||
if ((ea & ~REGION_MASK) >= PGTABLE_RANGE)
|
||||
return 0;
|
||||
|
||||
if (ssize == MMU_SEGSIZE_256M)
|
||||
return vsid_scramble((context << USER_ESID_BITS)
|
||||
return vsid_scramble((context << ESID_BITS)
|
||||
| (ea >> SID_SHIFT), 256M);
|
||||
return vsid_scramble((context << USER_ESID_BITS_1T)
|
||||
return vsid_scramble((context << ESID_BITS_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 /* _ASM_POWERPC_MMU_HASH64_H_ */
|
||||
|
|
|
@ -275,7 +275,7 @@ static struct cpu_spec __initdata cpu_specs[] = {
|
|||
.cpu_features = CPU_FTRS_PPC970,
|
||||
.cpu_user_features = COMMON_USER_POWER4 |
|
||||
PPC_FEATURE_HAS_ALTIVEC_COMP,
|
||||
.mmu_features = MMU_FTR_HPTE_TABLE,
|
||||
.mmu_features = MMU_FTRS_PPC970,
|
||||
.icache_bsize = 128,
|
||||
.dcache_bsize = 128,
|
||||
.num_pmcs = 8,
|
||||
|
|
|
@ -1452,20 +1452,36 @@ do_ste_alloc:
|
|||
_GLOBAL(do_stab_bolted)
|
||||
stw r9,PACA_EXSLB+EX_CCR(r13) /* save CR 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 */
|
||||
ld r10,PACASTABVIRT(r13)
|
||||
mfspr r11,SPRN_DAR
|
||||
srdi r11,r11,28
|
||||
srdi r11,r11,SID_SHIFT
|
||||
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 */
|
||||
1: ld r11,0(r10) /* Test valid bit of the current ste */
|
||||
andi. r11,r11,0x80
|
||||
|
|
|
@ -2832,11 +2832,13 @@ static void unreloc_toc(void)
|
|||
{
|
||||
}
|
||||
#else
|
||||
static void __reloc_toc(void *tocstart, unsigned long offset,
|
||||
unsigned long nr_entries)
|
||||
static void __reloc_toc(unsigned long offset, unsigned long nr_entries)
|
||||
{
|
||||
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++) {
|
||||
*toc_entry = *toc_entry + offset;
|
||||
|
@ -2850,8 +2852,7 @@ static void reloc_toc(void)
|
|||
unsigned long nr_entries =
|
||||
(__prom_init_toc_end - __prom_init_toc_start) / sizeof(long);
|
||||
|
||||
/* Need to add offset to get at __prom_init_toc_start */
|
||||
__reloc_toc(__prom_init_toc_start + offset, offset, nr_entries);
|
||||
__reloc_toc(offset, nr_entries);
|
||||
|
||||
mb();
|
||||
}
|
||||
|
@ -2864,8 +2865,7 @@ static void unreloc_toc(void)
|
|||
|
||||
mb();
|
||||
|
||||
/* __prom_init_toc_start has been relocated, no need to add offset */
|
||||
__reloc_toc(__prom_init_toc_start, -offset, nr_entries);
|
||||
__reloc_toc(-offset, nr_entries);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
@ -1428,6 +1428,7 @@ static long ppc_set_hwdebug(struct task_struct *child,
|
|||
|
||||
brk.address = bp_info->addr & ~7UL;
|
||||
brk.type = HW_BRK_TYPE_TRANSLATE;
|
||||
brk.len = 8;
|
||||
if (bp_info->trigger_type & PPC_BREAKPOINT_TRIGGER_READ)
|
||||
brk.type |= HW_BRK_TYPE_READ;
|
||||
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->proto_vsid_max = ((vcpu3s->context_id[0] + 1)
|
||||
<< USER_ESID_BITS) - 1;
|
||||
vcpu3s->proto_vsid_first = vcpu3s->context_id[0] << USER_ESID_BITS;
|
||||
<< ESID_BITS) - 1;
|
||||
vcpu3s->proto_vsid_first = vcpu3s->context_id[0] << ESID_BITS;
|
||||
vcpu3s->proto_vsid_next = vcpu3s->proto_vsid_first;
|
||||
|
||||
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 tprot = prot;
|
||||
|
||||
/*
|
||||
* If we hit a bad address return error.
|
||||
*/
|
||||
if (!vsid)
|
||||
return -1;
|
||||
/* Make kernel text executable */
|
||||
if (overlaps_kernel_text(vaddr, vaddr + step))
|
||||
tprot &= ~HPTE_R_N;
|
||||
|
@ -759,6 +764,8 @@ void __init early_init_mmu(void)
|
|||
/* Initialize stab / SLB management */
|
||||
if (mmu_has_feature(MMU_FTR_SLB))
|
||||
slb_initialize();
|
||||
else
|
||||
stab_initialize(get_paca()->stab_real);
|
||||
}
|
||||
|
||||
#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",
|
||||
ea, access, trap);
|
||||
|
||||
if ((ea & ~REGION_MASK) >= PGTABLE_RANGE) {
|
||||
DBG_LOW(" out of pgtable range !\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Get region & vsid */
|
||||
switch (REGION_ID(ea)) {
|
||||
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);
|
||||
|
||||
/* Bad address. */
|
||||
if (!vsid) {
|
||||
DBG_LOW("Bad address!\n");
|
||||
return 1;
|
||||
}
|
||||
/* Get pgdir */
|
||||
pgdir = mm->pgd;
|
||||
if (pgdir == NULL)
|
||||
|
@ -1126,6 +1133,8 @@ void hash_preload(struct mm_struct *mm, unsigned long ea,
|
|||
/* Get VSID */
|
||||
ssize = user_segment_size(ea);
|
||||
vsid = get_vsid(mm->context.id, ea, ssize);
|
||||
if (!vsid)
|
||||
return;
|
||||
|
||||
/* Hash doesn't like irqs */
|
||||
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);
|
||||
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),
|
||||
mode, HPTE_V_BOLTED,
|
||||
mmu_linear_psize, mmu_kernel_ssize);
|
||||
|
|
|
@ -29,15 +29,6 @@
|
|||
static DEFINE_SPINLOCK(mmu_context_lock);
|
||||
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 index;
|
||||
|
@ -56,7 +47,7 @@ again:
|
|||
else if (err)
|
||||
return err;
|
||||
|
||||
if (index > MAX_CONTEXT) {
|
||||
if (index > MAX_USER_CONTEXT) {
|
||||
spin_lock(&mmu_context_lock);
|
||||
ida_remove(&mmu_context_ida, index);
|
||||
spin_unlock(&mmu_context_lock);
|
||||
|
|
|
@ -61,7 +61,7 @@
|
|||
#endif
|
||||
|
||||
#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
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
@ -31,10 +31,15 @@
|
|||
* No other registers are examined or changed.
|
||||
*/
|
||||
_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 r10,r3,28 /* get esid */
|
||||
srdi r10,r3,SID_SHIFT /* get esid */
|
||||
cmpldi cr7,r9,0xc /* cmp PAGE_OFFSET for later use */
|
||||
|
||||
/* r3 = address, r10 = esid, cr7 = <> PAGE_OFFSET */
|
||||
|
@ -56,12 +61,14 @@ _GLOBAL(slb_allocate_realmode)
|
|||
*/
|
||||
_GLOBAL(slb_miss_kernel_load_linear)
|
||||
li r11,0
|
||||
li r9,0x1
|
||||
/*
|
||||
* for 1T we shift 12 bits more. slb_finish_load_1T will do
|
||||
* the necessary adjustment
|
||||
* context = (MAX_USER_CONTEXT) + ((ea >> 60) - 0xc) + 1
|
||||
* 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
|
||||
b slb_finish_load
|
||||
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)
|
||||
li r11,0
|
||||
6:
|
||||
li r9,0x1
|
||||
/*
|
||||
* for 1T we shift 12 bits more. slb_finish_load_1T will do
|
||||
* the necessary adjustment
|
||||
* context = (MAX_USER_CONTEXT) + ((ea >> 60) - 0xc) + 1
|
||||
* 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
|
||||
b slb_finish_load
|
||||
END_MMU_FTR_SECTION_IFCLR(MMU_FTR_1T_SEGMENT)
|
||||
b slb_finish_load_1T
|
||||
|
||||
0: /* user address: proto-VSID = context << 15 | ESID. First check
|
||||
* if the address is within the boundaries of the user region
|
||||
*/
|
||||
srdi. r9,r10,USER_ESID_BITS
|
||||
bne- 8f /* invalid ea bits set */
|
||||
|
||||
|
||||
0:
|
||||
/* 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
|
||||
* array.
|
||||
|
@ -164,15 +166,13 @@ END_MMU_FTR_SECTION_IFCLR(MMU_FTR_1T_SEGMENT)
|
|||
ld r9,PACACONTEXTID(r13)
|
||||
BEGIN_FTR_SECTION
|
||||
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
|
||||
END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT)
|
||||
b slb_finish_load
|
||||
|
||||
8: /* invalid EA */
|
||||
li r10,0 /* BAD_VSID */
|
||||
li r9,0 /* BAD_VSID */
|
||||
li r11,SLB_VSID_USER /* flags don't much matter */
|
||||
b slb_finish_load
|
||||
|
||||
|
@ -221,8 +221,6 @@ _GLOBAL(slb_allocate_user)
|
|||
|
||||
/* get context to calculate proto-VSID */
|
||||
ld r9,PACACONTEXTID(r13)
|
||||
rldimi r10,r9,USER_ESID_BITS,0
|
||||
|
||||
/* fall through slb_finish_load */
|
||||
|
||||
#endif /* __DISABLED__ */
|
||||
|
@ -231,9 +229,10 @@ _GLOBAL(slb_allocate_user)
|
|||
/*
|
||||
* 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:
|
||||
rldimi r10,r9,ESID_BITS,0
|
||||
ASM_VSID_SCRAMBLE(r10,r9,256M)
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
* r3 = EA, r10 = proto-VSID, r11 = flags, clobbers r9
|
||||
* r3 = EA, r9 = context, r10 = ESID(256MB), r11 = flags, clobbers r9
|
||||
*/
|
||||
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)
|
||||
/*
|
||||
* 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)) {
|
||||
ssize = user_segment_size(addr);
|
||||
vsid = get_vsid(mm->context.id, addr, ssize);
|
||||
WARN_ON(vsid == 0);
|
||||
} else {
|
||||
vsid = get_kernel_vsid(addr, mmu_kernel_ssize);
|
||||
ssize = mmu_kernel_ssize;
|
||||
}
|
||||
WARN_ON(vsid == 0);
|
||||
vpn = hpt_vpn(addr, vsid, ssize);
|
||||
rpte = __real_pte(__pte(pte), ptep);
|
||||
|
||||
|
|
|
@ -420,7 +420,20 @@ static struct attribute_group power7_pmu_events_group = {
|
|||
.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[] = {
|
||||
&power7_pmu_format_group,
|
||||
&power7_pmu_events_group,
|
||||
NULL,
|
||||
};
|
||||
|
|
|
@ -69,7 +69,7 @@ static irqreturn_t gpio_halt_irq(int irq, void *__data)
|
|||
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;
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
|
@ -128,7 +128,7 @@ static int __devinit gpio_halt_probe(struct platform_device *pdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int __devexit gpio_halt_remove(struct platform_device *pdev)
|
||||
static int gpio_halt_remove(struct platform_device *pdev)
|
||||
{
|
||||
if (halt_node) {
|
||||
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,
|
||||
},
|
||||
.probe = gpio_halt_probe,
|
||||
.remove = __devexit_p(gpio_halt_remove),
|
||||
.remove = gpio_halt_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(gpio_halt_driver);
|
||||
|
|
|
@ -124,9 +124,8 @@ config 6xx
|
|||
select PPC_HAVE_PMU_SUPPORT
|
||||
|
||||
config POWER3
|
||||
bool
|
||||
depends on PPC64 && PPC_BOOK3S
|
||||
default y if !POWER4_ONLY
|
||||
def_bool y
|
||||
|
||||
config POWER4
|
||||
depends on PPC64 && PPC_BOOK3S
|
||||
|
@ -145,8 +144,7 @@ config TUNE_CELL
|
|||
but somewhat slower on other machines. This option only changes
|
||||
the scheduling of instructions, not the selection of instructions
|
||||
itself, so the resulting kernel will keep running on all other
|
||||
machines. When building a kernel that is supposed to run only
|
||||
on Cell, you should also select the POWER4_ONLY option.
|
||||
machines.
|
||||
|
||||
# this is temp to handle compat with arch=ppc
|
||||
config 8xx
|
||||
|
|
|
@ -34,6 +34,8 @@ struct arsb {
|
|||
u32 reserved[4];
|
||||
} __packed;
|
||||
|
||||
#define EQC_WR_PROHIBIT 22
|
||||
|
||||
struct msb {
|
||||
u8 fmt:4;
|
||||
u8 oc:4;
|
||||
|
@ -96,11 +98,13 @@ struct scm_device {
|
|||
#define OP_STATE_TEMP_ERR 2
|
||||
#define OP_STATE_PERM_ERR 3
|
||||
|
||||
enum scm_event {SCM_CHANGE, SCM_AVAIL};
|
||||
|
||||
struct scm_driver {
|
||||
struct device_driver drv;
|
||||
int (*probe) (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);
|
||||
};
|
||||
|
||||
|
|
|
@ -74,8 +74,6 @@ static inline void __tlb_flush_idte(unsigned long asce)
|
|||
|
||||
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
|
||||
* 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
|
||||
mcck_skip:
|
||||
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)
|
||||
xc __SF_BACKCHAIN(4,%r15),__SF_BACKCHAIN(%r15)
|
||||
l %r1,BASED(.Ldo_machine_check)
|
||||
|
|
|
@ -678,8 +678,9 @@ ENTRY(mcck_int_handler)
|
|||
UPDATE_VTIME %r14,__LC_MCCK_ENTER_TIMER
|
||||
LAST_BREAK %r14
|
||||
mcck_skip:
|
||||
lghi %r14,__LC_GPREGS_SAVE_AREA
|
||||
mvc __PT_R0(128,%r11),0(%r14)
|
||||
lghi %r14,__LC_GPREGS_SAVE_AREA+64
|
||||
stmg %r0,%r7,__PT_R0(%r11)
|
||||
mvc __PT_R8(64,%r11),0(%r14)
|
||||
stmg %r8,%r9,__PT_PSW(%r11)
|
||||
xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15)
|
||||
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 */
|
||||
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 &= ~((vmax >> 11) - 1); /* align to page table level */
|
||||
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/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
|
||||
bool
|
||||
default y if SPARC64
|
||||
|
@ -197,7 +191,7 @@ config RWSEM_XCHGADD_ALGORITHM
|
|||
|
||||
config GENERIC_HWEIGHT
|
||||
bool
|
||||
default y if !ULTRA_HAS_POPULATION_COUNT
|
||||
default y
|
||||
|
||||
config GENERIC_CALIBRATE_DELAY
|
||||
bool
|
||||
|
|
|
@ -45,6 +45,7 @@
|
|||
#define SUN4V_CHIP_NIAGARA3 0x03
|
||||
#define SUN4V_CHIP_NIAGARA4 0x04
|
||||
#define SUN4V_CHIP_NIAGARA5 0x05
|
||||
#define SUN4V_CHIP_SPARC64X 0x8a
|
||||
#define SUN4V_CHIP_UNKNOWN 0xff
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
|
|
@ -493,6 +493,12 @@ static void __init sun4v_cpu_probe(void)
|
|||
sparc_pmu_type = "niagara5";
|
||||
break;
|
||||
|
||||
case SUN4V_CHIP_SPARC64X:
|
||||
sparc_cpu_type = "SPARC64-X";
|
||||
sparc_fpu_type = "SPARC64-X integrated FPU";
|
||||
sparc_pmu_type = "sparc64-x";
|
||||
break;
|
||||
|
||||
default:
|
||||
printk(KERN_WARNING "CPU: Unknown sun4v cpu type [%s]\n",
|
||||
prom_cpu_compatible);
|
||||
|
|
|
@ -134,6 +134,8 @@ prom_niagara_prefix:
|
|||
.asciz "SUNW,UltraSPARC-T"
|
||||
prom_sparc_prefix:
|
||||
.asciz "SPARC-"
|
||||
prom_sparc64x_prefix:
|
||||
.asciz "SPARC64-X"
|
||||
.align 4
|
||||
prom_root_compatible:
|
||||
.skip 64
|
||||
|
@ -412,7 +414,7 @@ sun4v_chip_type:
|
|||
cmp %g2, 'T'
|
||||
be,pt %xcc, 70f
|
||||
cmp %g2, 'M'
|
||||
bne,pn %xcc, 4f
|
||||
bne,pn %xcc, 49f
|
||||
nop
|
||||
|
||||
70: ldub [%g1 + 7], %g2
|
||||
|
@ -425,7 +427,7 @@ sun4v_chip_type:
|
|||
cmp %g2, '5'
|
||||
be,pt %xcc, 5f
|
||||
mov SUN4V_CHIP_NIAGARA5, %g4
|
||||
ba,pt %xcc, 4f
|
||||
ba,pt %xcc, 49f
|
||||
nop
|
||||
|
||||
91: sethi %hi(prom_cpu_compatible), %g1
|
||||
|
@ -439,6 +441,25 @@ sun4v_chip_type:
|
|||
mov SUN4V_CHIP_NIAGARA2, %g4
|
||||
|
||||
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
|
||||
5: sethi %hi(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_BARSIZE_OFS 0x24
|
||||
|
||||
#define TGT 256
|
||||
|
||||
struct grpci2_priv {
|
||||
struct leon_pci_info info; /* must be on top of this structure */
|
||||
struct grpci2_regs *regs;
|
||||
|
@ -237,8 +239,12 @@ static int grpci2_cfg_r32(struct grpci2_priv *priv, unsigned int bus,
|
|||
if (where & 0x3)
|
||||
return -EINVAL;
|
||||
|
||||
if (bus == 0 && PCI_SLOT(devfn) != 0)
|
||||
devfn += (0x8 * 6);
|
||||
if (bus == 0) {
|
||||
devfn += (0x8 * 6); /* start at AD16=Device0 */
|
||||
} else if (bus == TGT) {
|
||||
bus = 0;
|
||||
devfn = 0; /* special case: bridge controller itself */
|
||||
}
|
||||
|
||||
/* Select bus */
|
||||
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)
|
||||
return -EINVAL;
|
||||
|
||||
if (bus == 0 && PCI_SLOT(devfn) != 0)
|
||||
devfn += (0x8 * 6);
|
||||
if (bus == 0) {
|
||||
devfn += (0x8 * 6); /* start at AD16=Device0 */
|
||||
} else if (bus == TGT) {
|
||||
bus = 0;
|
||||
devfn = 0; /* special case: bridge controller itself */
|
||||
}
|
||||
|
||||
/* Select bus */
|
||||
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;
|
||||
int ret;
|
||||
|
||||
if (PCI_SLOT(devfn) > 15 || (PCI_SLOT(devfn) == 0 && busno == 0)) {
|
||||
if (PCI_SLOT(devfn) > 15 || busno > 255) {
|
||||
*val = ~0;
|
||||
return 0;
|
||||
}
|
||||
|
@ -406,7 +416,7 @@ static int grpci2_write_config(struct pci_bus *bus, unsigned int devfn,
|
|||
struct grpci2_priv *priv = grpci2priv;
|
||||
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;
|
||||
|
||||
#ifdef GRPCI2_DEBUG_CFGACCESS
|
||||
|
@ -578,15 +588,15 @@ void grpci2_hw_init(struct grpci2_priv *priv)
|
|||
REGSTORE(regs->ahbmst_map[i], priv->pci_area);
|
||||
|
||||
/* 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 */
|
||||
grpci2_cfg_r8(priv, 0, 0, PCI_CAPABILITY_LIST, &capptr);
|
||||
grpci2_cfg_r8(priv, TGT, 0, PCI_CAPABILITY_LIST, &capptr);
|
||||
|
||||
/* 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);
|
||||
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,
|
||||
* 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;
|
||||
}
|
||||
}
|
||||
grpci2_cfg_w32(priv, 0, 0, capptr+CAP9_BARSIZE_OFS+i*4, bar_sz);
|
||||
grpci2_cfg_w32(priv, 0, 0, PCI_BASE_ADDRESS_0+i*4, pciadr);
|
||||
grpci2_cfg_w32(priv, 0, 0, capptr+CAP9_BAR_OFS+i*4, ahbadr);
|
||||
grpci2_cfg_w32(priv, TGT, 0, capptr+CAP9_BARSIZE_OFS+i*4,
|
||||
bar_sz);
|
||||
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",
|
||||
i, pciadr, ahbadr);
|
||||
}
|
||||
|
||||
/* 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);
|
||||
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. */
|
||||
REGSTORE(regs->ctrl, CTRL_ER | CTRL_PE);
|
||||
|
|
|
@ -330,7 +330,6 @@ CONFIG_MD_RAID0=m
|
|||
CONFIG_MD_RAID1=m
|
||||
CONFIG_MD_RAID10=m
|
||||
CONFIG_MD_RAID456=m
|
||||
CONFIG_MULTICORE_RAID456=y
|
||||
CONFIG_MD_FAULTY=m
|
||||
CONFIG_BLK_DEV_DM=m
|
||||
CONFIG_DM_DEBUG=y
|
||||
|
|
|
@ -324,7 +324,6 @@ CONFIG_MD_RAID0=m
|
|||
CONFIG_MD_RAID1=m
|
||||
CONFIG_MD_RAID10=m
|
||||
CONFIG_MD_RAID456=m
|
||||
CONFIG_MULTICORE_RAID456=y
|
||||
CONFIG_MD_FAULTY=m
|
||||
CONFIG_BLK_DEV_DM=m
|
||||
CONFIG_DM_DEBUG=y
|
||||
|
|
|
@ -77,6 +77,7 @@ struct arch_specific_insn {
|
|||
* a post_handler or break_handler).
|
||||
*/
|
||||
int boostable;
|
||||
bool if_modifier;
|
||||
};
|
||||
|
||||
struct arch_optimized_insn {
|
||||
|
|
|
@ -414,8 +414,8 @@ struct kvm_vcpu_arch {
|
|||
gpa_t time;
|
||||
struct pvclock_vcpu_time_info hv_clock;
|
||||
unsigned int hw_tsc_khz;
|
||||
unsigned int time_offset;
|
||||
struct page *time_page;
|
||||
struct gfn_to_hva_cache pv_time;
|
||||
bool pv_time_enabled;
|
||||
/* set guest stopped flag in pvclock flags field */
|
||||
bool pvclock_set_guest_stopped_request;
|
||||
|
||||
|
|
|
@ -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(0x003c, 1), /* CPU_CLK_UNHALTED.CORE */
|
||||
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_UEVENT_CONSTRAINT(0x01c0, 0x2), /* INST_RETIRED.PREC_DIST */
|
||||
INTEL_EVENT_CONSTRAINT(0xcd, 0x8), /* MEM_TRANS_RETIRED.LOAD_LATENCY */
|
||||
|
|
|
@ -732,8 +732,10 @@ void intel_ds_init(void)
|
|||
|
||||
void perf_restore_debug_store(void)
|
||||
{
|
||||
struct debug_store *ds = __this_cpu_read(cpu_hw_events.ds);
|
||||
|
||||
if (!x86_pmu.bts && !x86_pmu.pebs)
|
||||
return;
|
||||
|
||||
init_debug_store_on_cpu(smp_processor_id());
|
||||
wrmsrl(MSR_IA32_DS_AREA, (unsigned long)ds);
|
||||
}
|
||||
|
|
|
@ -375,6 +375,9 @@ static void __kprobes arch_copy_kprobe(struct kprobe *p)
|
|||
else
|
||||
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 */
|
||||
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);
|
||||
kcb->kprobe_saved_flags = kcb->kprobe_old_flags
|
||||
= (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;
|
||||
}
|
||||
|
||||
|
|
|
@ -1406,25 +1406,15 @@ static int kvm_guest_time_update(struct kvm_vcpu *v)
|
|||
unsigned long flags, this_tsc_khz;
|
||||
struct kvm_vcpu_arch *vcpu = &v->arch;
|
||||
struct kvm_arch *ka = &v->kvm->arch;
|
||||
void *shared_kaddr;
|
||||
s64 kernel_ns, max_kernel_ns;
|
||||
u64 tsc_timestamp, host_tsc;
|
||||
struct pvclock_vcpu_time_info *guest_hv_clock;
|
||||
struct pvclock_vcpu_time_info guest_hv_clock;
|
||||
u8 pvclock_flags;
|
||||
bool use_master_clock;
|
||||
|
||||
kernel_ns = 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
|
||||
* to the guest.
|
||||
|
@ -1436,6 +1426,15 @@ static int kvm_guest_time_update(struct kvm_vcpu *v)
|
|||
kernel_ns = ka->master_kernel_ns;
|
||||
}
|
||||
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) {
|
||||
host_tsc = native_read_tsc();
|
||||
kernel_ns = get_kernel_ns();
|
||||
|
@ -1463,7 +1462,7 @@ static int kvm_guest_time_update(struct kvm_vcpu *v)
|
|||
|
||||
local_irq_restore(flags);
|
||||
|
||||
if (!vcpu->time_page)
|
||||
if (!vcpu->pv_time_enabled)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
|
@ -1525,12 +1524,12 @@ static int kvm_guest_time_update(struct kvm_vcpu *v)
|
|||
*/
|
||||
vcpu->hv_clock.version += 2;
|
||||
|
||||
shared_kaddr = kmap_atomic(vcpu->time_page);
|
||||
|
||||
guest_hv_clock = shared_kaddr + vcpu->time_offset;
|
||||
if (unlikely(kvm_read_guest_cached(v->kvm, &vcpu->pv_time,
|
||||
&guest_hv_clock, sizeof(guest_hv_clock))))
|
||||
return 0;
|
||||
|
||||
/* 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) {
|
||||
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;
|
||||
|
||||
memcpy(shared_kaddr + vcpu->time_offset, &vcpu->hv_clock,
|
||||
sizeof(vcpu->hv_clock));
|
||||
|
||||
kunmap_atomic(shared_kaddr);
|
||||
|
||||
mark_page_dirty(v->kvm, vcpu->time >> PAGE_SHIFT);
|
||||
kvm_write_guest_cached(v->kvm, &vcpu->pv_time,
|
||||
&vcpu->hv_clock,
|
||||
sizeof(vcpu->hv_clock));
|
||||
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)
|
||||
{
|
||||
if (vcpu->arch.time_page) {
|
||||
kvm_release_page_dirty(vcpu->arch.time_page);
|
||||
vcpu->arch.time_page = NULL;
|
||||
}
|
||||
vcpu->arch.pv_time_enabled = false;
|
||||
}
|
||||
|
||||
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;
|
||||
case MSR_KVM_SYSTEM_TIME_NEW:
|
||||
case MSR_KVM_SYSTEM_TIME: {
|
||||
u64 gpa_offset;
|
||||
kvmclock_reset(vcpu);
|
||||
|
||||
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))
|
||||
break;
|
||||
|
||||
/* ...but clean it before doing the actual write */
|
||||
vcpu->arch.time_offset = data & ~(PAGE_MASK | 1);
|
||||
gpa_offset = data & ~(PAGE_MASK | 1);
|
||||
|
||||
vcpu->arch.time_page =
|
||||
gfn_to_page(vcpu->kvm, data >> PAGE_SHIFT);
|
||||
/* Check that the address is 32-byte aligned. */
|
||||
if (gpa_offset & (sizeof(struct pvclock_vcpu_time_info) - 1))
|
||||
break;
|
||||
|
||||
if (is_error_page(vcpu->arch.time_page))
|
||||
vcpu->arch.time_page = NULL;
|
||||
if (kvm_gfn_to_hva_cache_init(vcpu->kvm,
|
||||
&vcpu->arch.pv_time, data & ~1ULL))
|
||||
vcpu->arch.pv_time_enabled = false;
|
||||
else
|
||||
vcpu->arch.pv_time_enabled = true;
|
||||
|
||||
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)
|
||||
{
|
||||
if (!vcpu->arch.time_page)
|
||||
if (!vcpu->arch.pv_time_enabled)
|
||||
return -EINVAL;
|
||||
vcpu->arch.pvclock_set_guest_stopped_request = true;
|
||||
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;
|
||||
|
||||
vcpu->arch.ia32_tsc_adjust_msr = 0x0;
|
||||
vcpu->arch.pv_time_enabled = false;
|
||||
kvm_async_pf_hash_reset(vcpu);
|
||||
kvm_pmu_init(vcpu);
|
||||
|
||||
|
|
|
@ -158,7 +158,7 @@ int tegra_ahb_enable_smmu(struct device_node *dn)
|
|||
EXPORT_SYMBOL(tegra_ahb_enable_smmu);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
#ifdef CONFIG_PM
|
||||
static int tegra_ahb_suspend(struct device *dev)
|
||||
{
|
||||
int i;
|
||||
|
|
|
@ -59,15 +59,16 @@ config ATA_ACPI
|
|||
option libata.noacpi=1
|
||||
|
||||
config SATA_ZPODD
|
||||
bool "SATA Zero Power ODD Support"
|
||||
bool "SATA Zero Power Optical Disc Drive (ZPODD) support"
|
||||
depends on ATA_ACPI
|
||||
default n
|
||||
help
|
||||
This option adds support for SATA ZPODD. It requires both
|
||||
ODD and the platform support, and if enabled, will automatically
|
||||
power on/off the ODD when certain condition is satisfied. This
|
||||
does not impact user's experience of the ODD, only power is saved
|
||||
when ODD is not in use(i.e. no disc inside).
|
||||
This option adds support for SATA Zero Power Optical Disc
|
||||
Drive (ZPODD). It requires both the ODD and the platform
|
||||
support, and if enabled, will automatically power on/off the
|
||||
ODD when certain condition is satisfied. This does not impact
|
||||
end user's experience of the ODD, only power is saved when
|
||||
the ODD is not in use (i.e. no disc inside).
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
|
|
|
@ -281,6 +281,8 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
|||
{ PCI_VDEVICE(INTEL, 0x1f37), board_ahci }, /* Avoton RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x1f3e), board_ahci }, /* Avoton RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x1f3f), board_ahci }, /* Avoton RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x2823), board_ahci }, /* Wellsburg RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x2827), board_ahci }, /* Wellsburg RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x8d02), board_ahci }, /* Wellsburg AHCI */
|
||||
{ PCI_VDEVICE(INTEL, 0x8d04), board_ahci }, /* Wellsburg RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x8d06), board_ahci }, /* Wellsburg RAID */
|
||||
|
|
|
@ -1547,6 +1547,10 @@ static bool piix_broken_system_poweroff(struct pci_dev *pdev)
|
|||
|
||||
static int prefer_ms_hyperv = 1;
|
||||
module_param(prefer_ms_hyperv, int, 0);
|
||||
MODULE_PARM_DESC(prefer_ms_hyperv,
|
||||
"Prefer Hyper-V paravirtualization drivers instead of ATA, "
|
||||
"0 - Use ATA drivers, "
|
||||
"1 (Default) - Use the paravirtualization drivers.");
|
||||
|
||||
static void piix_ignore_devices_quirk(struct ata_host *host)
|
||||
{
|
||||
|
|
|
@ -1027,7 +1027,7 @@ static void ata_acpi_register_power_resource(struct ata_device *dev)
|
|||
|
||||
handle = ata_dev_acpi_handle(dev);
|
||||
if (handle)
|
||||
acpi_dev_pm_remove_dependent(handle, &sdev->sdev_gendev);
|
||||
acpi_dev_pm_add_dependent(handle, &sdev->sdev_gendev);
|
||||
}
|
||||
|
||||
static void ata_acpi_unregister_power_resource(struct ata_device *dev)
|
||||
|
|
|
@ -661,18 +661,7 @@ static struct platform_driver pata_s3c_driver = {
|
|||
},
|
||||
};
|
||||
|
||||
static int __init pata_s3c_init(void)
|
||||
{
|
||||
return platform_driver_probe(&pata_s3c_driver, pata_s3c_probe);
|
||||
}
|
||||
|
||||
static void __exit pata_s3c_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&pata_s3c_driver);
|
||||
}
|
||||
|
||||
module_init(pata_s3c_init);
|
||||
module_exit(pata_s3c_exit);
|
||||
module_platform_driver_probe(pata_s3c_driver, pata_s3c_probe);
|
||||
|
||||
MODULE_AUTHOR("Abhilash Kesavan, <a.kesavan@samsung.com>");
|
||||
MODULE_DESCRIPTION("low-level driver for Samsung PATA controller");
|
||||
|
|
|
@ -1511,8 +1511,7 @@ error_exit_with_cleanup:
|
|||
|
||||
if (hcr_base)
|
||||
iounmap(hcr_base);
|
||||
if (host_priv)
|
||||
kfree(host_priv);
|
||||
kfree(host_priv);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
|
|
@ -135,6 +135,7 @@ static inline void _nvme_check_size(void)
|
|||
BUILD_BUG_ON(sizeof(struct nvme_id_ctrl) != 4096);
|
||||
BUILD_BUG_ON(sizeof(struct nvme_id_ns) != 4096);
|
||||
BUILD_BUG_ON(sizeof(struct nvme_lba_range_type) != 64);
|
||||
BUILD_BUG_ON(sizeof(struct nvme_smart_log) != 512);
|
||||
}
|
||||
|
||||
typedef void (*nvme_completion_fn)(struct nvme_dev *, void *,
|
||||
|
@ -237,7 +238,8 @@ static void *free_cmdid(struct nvme_queue *nvmeq, int cmdid,
|
|||
*fn = special_completion;
|
||||
return CMD_CTX_INVALID;
|
||||
}
|
||||
*fn = info[cmdid].fn;
|
||||
if (fn)
|
||||
*fn = info[cmdid].fn;
|
||||
ctx = info[cmdid].ctx;
|
||||
info[cmdid].fn = special_completion;
|
||||
info[cmdid].ctx = CMD_CTX_COMPLETED;
|
||||
|
@ -335,6 +337,7 @@ nvme_alloc_iod(unsigned nseg, unsigned nbytes, gfp_t gfp)
|
|||
iod->offset = offsetof(struct nvme_iod, sg[nseg]);
|
||||
iod->npages = -1;
|
||||
iod->length = nbytes;
|
||||
iod->nents = 0;
|
||||
}
|
||||
|
||||
return iod;
|
||||
|
@ -375,7 +378,8 @@ static void bio_completion(struct nvme_dev *dev, void *ctx,
|
|||
struct bio *bio = iod->private;
|
||||
u16 status = le16_to_cpup(&cqe->status) >> 1;
|
||||
|
||||
dma_unmap_sg(&dev->pci_dev->dev, iod->sg, iod->nents,
|
||||
if (iod->nents)
|
||||
dma_unmap_sg(&dev->pci_dev->dev, iod->sg, iod->nents,
|
||||
bio_data_dir(bio) ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
|
||||
nvme_free_iod(dev, iod);
|
||||
if (status) {
|
||||
|
@ -589,7 +593,7 @@ static int nvme_submit_bio_queue(struct nvme_queue *nvmeq, struct nvme_ns *ns,
|
|||
|
||||
result = nvme_map_bio(nvmeq->q_dmadev, iod, bio, dma_dir, psegs);
|
||||
if (result < 0)
|
||||
goto free_iod;
|
||||
goto free_cmdid;
|
||||
length = result;
|
||||
|
||||
cmnd->rw.command_id = cmdid;
|
||||
|
@ -609,6 +613,8 @@ static int nvme_submit_bio_queue(struct nvme_queue *nvmeq, struct nvme_ns *ns,
|
|||
|
||||
return 0;
|
||||
|
||||
free_cmdid:
|
||||
free_cmdid(nvmeq, cmdid, NULL);
|
||||
free_iod:
|
||||
nvme_free_iod(nvmeq->dev, iod);
|
||||
nomem:
|
||||
|
@ -835,8 +841,8 @@ static int nvme_identify(struct nvme_dev *dev, unsigned nsid, unsigned cns,
|
|||
return nvme_submit_admin_cmd(dev, &c, NULL);
|
||||
}
|
||||
|
||||
static int nvme_get_features(struct nvme_dev *dev, unsigned fid,
|
||||
unsigned nsid, dma_addr_t dma_addr)
|
||||
static int nvme_get_features(struct nvme_dev *dev, unsigned fid, unsigned nsid,
|
||||
dma_addr_t dma_addr, u32 *result)
|
||||
{
|
||||
struct nvme_command c;
|
||||
|
||||
|
@ -846,7 +852,7 @@ static int nvme_get_features(struct nvme_dev *dev, unsigned fid,
|
|||
c.features.prp1 = cpu_to_le64(dma_addr);
|
||||
c.features.fid = cpu_to_le32(fid);
|
||||
|
||||
return nvme_submit_admin_cmd(dev, &c, NULL);
|
||||
return nvme_submit_admin_cmd(dev, &c, result);
|
||||
}
|
||||
|
||||
static int nvme_set_features(struct nvme_dev *dev, unsigned fid,
|
||||
|
@ -906,6 +912,10 @@ static void nvme_free_queue(struct nvme_dev *dev, int qid)
|
|||
|
||||
spin_lock_irq(&nvmeq->q_lock);
|
||||
nvme_cancel_ios(nvmeq, false);
|
||||
while (bio_list_peek(&nvmeq->sq_cong)) {
|
||||
struct bio *bio = bio_list_pop(&nvmeq->sq_cong);
|
||||
bio_endio(bio, -EIO);
|
||||
}
|
||||
spin_unlock_irq(&nvmeq->q_lock);
|
||||
|
||||
irq_set_affinity_hint(vector, NULL);
|
||||
|
@ -1230,12 +1240,17 @@ static int nvme_user_admin_cmd(struct nvme_dev *dev,
|
|||
if (length != cmd.data_len)
|
||||
status = -ENOMEM;
|
||||
else
|
||||
status = nvme_submit_admin_cmd(dev, &c, NULL);
|
||||
status = nvme_submit_admin_cmd(dev, &c, &cmd.result);
|
||||
|
||||
if (cmd.data_len) {
|
||||
nvme_unmap_user_pages(dev, cmd.opcode & 1, iod);
|
||||
nvme_free_iod(dev, iod);
|
||||
}
|
||||
|
||||
if (!status && copy_to_user(&ucmd->result, &cmd.result,
|
||||
sizeof(cmd.result)))
|
||||
status = -EFAULT;
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
@ -1523,9 +1538,9 @@ static int nvme_dev_add(struct nvme_dev *dev)
|
|||
continue;
|
||||
|
||||
res = nvme_get_features(dev, NVME_FEAT_LBA_RANGE, i,
|
||||
dma_addr + 4096);
|
||||
dma_addr + 4096, NULL);
|
||||
if (res)
|
||||
continue;
|
||||
memset(mem + 4096, 0, 4096);
|
||||
|
||||
ns = nvme_alloc_ns(dev, i, mem, mem + 4096);
|
||||
if (ns)
|
||||
|
|
|
@ -74,8 +74,10 @@ static struct usb_device_id ath3k_table[] = {
|
|||
|
||||
/* Atheros AR3012 with sflash firmware*/
|
||||
{ USB_DEVICE(0x0CF3, 0x3004) },
|
||||
{ USB_DEVICE(0x0CF3, 0x3008) },
|
||||
{ USB_DEVICE(0x0CF3, 0x311D) },
|
||||
{ USB_DEVICE(0x13d3, 0x3375) },
|
||||
{ USB_DEVICE(0x04CA, 0x3004) },
|
||||
{ USB_DEVICE(0x04CA, 0x3005) },
|
||||
{ USB_DEVICE(0x04CA, 0x3006) },
|
||||
{ USB_DEVICE(0x04CA, 0x3008) },
|
||||
|
@ -106,8 +108,10 @@ static struct usb_device_id ath3k_blist_tbl[] = {
|
|||
|
||||
/* Atheros AR3012 with sflash firmware*/
|
||||
{ USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x0cf3, 0x3008), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x0cf3, 0x311D), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x04ca, 0x3006), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x04ca, 0x3008), .driver_info = BTUSB_ATH3012 },
|
||||
|
|
|
@ -132,8 +132,10 @@ static struct usb_device_id blacklist_table[] = {
|
|||
|
||||
/* Atheros 3012 with sflash firmware */
|
||||
{ USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x0cf3, 0x3008), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x0cf3, 0x311d), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x04ca, 0x3006), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x04ca, 0x3008), .driver_info = BTUSB_ATH3012 },
|
||||
|
|
|
@ -157,7 +157,7 @@ static int vt8500_dclk_set_rate(struct clk_hw *hw, unsigned long rate,
|
|||
divisor = parent_rate / rate;
|
||||
|
||||
/* If prate / rate would be decimal, incr the divisor */
|
||||
if (rate * divisor < *prate)
|
||||
if (rate * divisor < parent_rate)
|
||||
divisor++;
|
||||
|
||||
if (divisor == cdev->div_mask + 1)
|
||||
|
|
|
@ -2048,12 +2048,18 @@ static int init_csrows(struct mem_ctl_info *mci)
|
|||
edac_dbg(1, "MC node: %d, csrow: %d\n",
|
||||
pvt->mc_node_id, i);
|
||||
|
||||
if (row_dct0)
|
||||
if (row_dct0) {
|
||||
nr_pages = amd64_csrow_nr_pages(pvt, 0, i);
|
||||
csrow->channels[0]->dimm->nr_pages = nr_pages;
|
||||
}
|
||||
|
||||
/* K8 has only one DCT */
|
||||
if (boot_cpu_data.x86 != 0xf && row_dct1)
|
||||
nr_pages += amd64_csrow_nr_pages(pvt, 1, i);
|
||||
if (boot_cpu_data.x86 != 0xf && row_dct1) {
|
||||
int row_dct1_pages = amd64_csrow_nr_pages(pvt, 1, i);
|
||||
|
||||
csrow->channels[1]->dimm->nr_pages = row_dct1_pages;
|
||||
nr_pages += row_dct1_pages;
|
||||
}
|
||||
|
||||
mtype = amd64_determine_memory_type(pvt, i);
|
||||
|
||||
|
@ -2072,9 +2078,7 @@ static int init_csrows(struct mem_ctl_info *mci)
|
|||
dimm = csrow->channels[j]->dimm;
|
||||
dimm->mtype = mtype;
|
||||
dimm->edac_mode = edac_mode;
|
||||
dimm->nr_pages = nr_pages;
|
||||
}
|
||||
csrow->nr_pages = nr_pages;
|
||||
}
|
||||
|
||||
return empty;
|
||||
|
@ -2419,7 +2423,6 @@ static int amd64_init_one_instance(struct pci_dev *F2)
|
|||
|
||||
mci->pvt_info = pvt;
|
||||
mci->pdev = &pvt->F2->dev;
|
||||
mci->csbased = 1;
|
||||
|
||||
setup_mci_misc_attrs(mci, fam_type);
|
||||
|
||||
|
|
|
@ -86,7 +86,7 @@ static void edac_mc_dump_dimm(struct dimm_info *dimm, int number)
|
|||
edac_dimm_info_location(dimm, location, sizeof(location));
|
||||
|
||||
edac_dbg(4, "%s%i: %smapped as virtual row %d, chan %d\n",
|
||||
dimm->mci->mem_is_per_rank ? "rank" : "dimm",
|
||||
dimm->mci->csbased ? "rank" : "dimm",
|
||||
number, location, dimm->csrow, dimm->cschannel);
|
||||
edac_dbg(4, " dimm = %p\n", dimm);
|
||||
edac_dbg(4, " dimm->label = '%s'\n", dimm->label);
|
||||
|
@ -341,7 +341,7 @@ struct mem_ctl_info *edac_mc_alloc(unsigned mc_num,
|
|||
memcpy(mci->layers, layers, sizeof(*layer) * n_layers);
|
||||
mci->nr_csrows = tot_csrows;
|
||||
mci->num_cschannel = tot_channels;
|
||||
mci->mem_is_per_rank = per_rank;
|
||||
mci->csbased = per_rank;
|
||||
|
||||
/*
|
||||
* Alocate and fill the csrow/channels structs
|
||||
|
@ -1235,7 +1235,7 @@ void edac_mc_handle_error(const enum hw_event_mc_err_type type,
|
|||
* incrementing the compat API counters
|
||||
*/
|
||||
edac_dbg(4, "%s csrows map: (%d,%d)\n",
|
||||
mci->mem_is_per_rank ? "rank" : "dimm",
|
||||
mci->csbased ? "rank" : "dimm",
|
||||
dimm->csrow, dimm->cschannel);
|
||||
if (row == -1)
|
||||
row = dimm->csrow;
|
||||
|
|
|
@ -143,7 +143,7 @@ static const char *edac_caps[] = {
|
|||
* and the per-dimm/per-rank one
|
||||
*/
|
||||
#define DEVICE_ATTR_LEGACY(_name, _mode, _show, _store) \
|
||||
struct device_attribute dev_attr_legacy_##_name = __ATTR(_name, _mode, _show, _store)
|
||||
static struct device_attribute dev_attr_legacy_##_name = __ATTR(_name, _mode, _show, _store)
|
||||
|
||||
struct dev_ch_attribute {
|
||||
struct device_attribute attr;
|
||||
|
@ -180,9 +180,6 @@ static ssize_t csrow_size_show(struct device *dev,
|
|||
int i;
|
||||
u32 nr_pages = 0;
|
||||
|
||||
if (csrow->mci->csbased)
|
||||
return sprintf(data, "%u\n", PAGES_TO_MiB(csrow->nr_pages));
|
||||
|
||||
for (i = 0; i < csrow->nr_channels; i++)
|
||||
nr_pages += csrow->channels[i]->dimm->nr_pages;
|
||||
return sprintf(data, "%u\n", PAGES_TO_MiB(nr_pages));
|
||||
|
@ -612,7 +609,7 @@ static int edac_create_dimm_object(struct mem_ctl_info *mci,
|
|||
device_initialize(&dimm->dev);
|
||||
|
||||
dimm->dev.parent = &mci->dev;
|
||||
if (mci->mem_is_per_rank)
|
||||
if (mci->csbased)
|
||||
dev_set_name(&dimm->dev, "rank%d", index);
|
||||
else
|
||||
dev_set_name(&dimm->dev, "dimm%d", index);
|
||||
|
@ -778,14 +775,10 @@ static ssize_t mci_size_mb_show(struct device *dev,
|
|||
for (csrow_idx = 0; csrow_idx < mci->nr_csrows; csrow_idx++) {
|
||||
struct csrow_info *csrow = mci->csrows[csrow_idx];
|
||||
|
||||
if (csrow->mci->csbased) {
|
||||
total_pages += csrow->nr_pages;
|
||||
} else {
|
||||
for (j = 0; j < csrow->nr_channels; j++) {
|
||||
struct dimm_info *dimm = csrow->channels[j]->dimm;
|
||||
for (j = 0; j < csrow->nr_channels; j++) {
|
||||
struct dimm_info *dimm = csrow->channels[j]->dimm;
|
||||
|
||||
total_pages += dimm->nr_pages;
|
||||
}
|
||||
total_pages += dimm->nr_pages;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1634,7 +1634,7 @@ static struct drm_display_mode *drm_mode_detailed(struct drm_device *dev,
|
|||
unsigned vblank = (pt->vactive_vblank_hi & 0xf) << 8 | pt->vblank_lo;
|
||||
unsigned hsync_offset = (pt->hsync_vsync_offset_pulse_width_hi & 0xc0) << 2 | pt->hsync_offset_lo;
|
||||
unsigned hsync_pulse_width = (pt->hsync_vsync_offset_pulse_width_hi & 0x30) << 4 | pt->hsync_pulse_width_lo;
|
||||
unsigned vsync_offset = (pt->hsync_vsync_offset_pulse_width_hi & 0xc) >> 2 | pt->vsync_offset_pulse_width_lo >> 4;
|
||||
unsigned vsync_offset = (pt->hsync_vsync_offset_pulse_width_hi & 0xc) << 2 | pt->vsync_offset_pulse_width_lo >> 4;
|
||||
unsigned vsync_pulse_width = (pt->hsync_vsync_offset_pulse_width_hi & 0x3) << 4 | (pt->vsync_offset_pulse_width_lo & 0xf);
|
||||
|
||||
/* ignore tiny modes */
|
||||
|
@ -1715,6 +1715,7 @@ set_size:
|
|||
}
|
||||
|
||||
mode->type = DRM_MODE_TYPE_DRIVER;
|
||||
mode->vrefresh = drm_mode_vrefresh(mode);
|
||||
drm_mode_set_name(mode);
|
||||
|
||||
return mode;
|
||||
|
|
|
@ -103,7 +103,7 @@ static const char *cache_level_str(int type)
|
|||
static void
|
||||
describe_obj(struct seq_file *m, struct drm_i915_gem_object *obj)
|
||||
{
|
||||
seq_printf(m, "%p: %s%s %8zdKiB %02x %02x %d %d %d%s%s%s",
|
||||
seq_printf(m, "%pK: %s%s %8zdKiB %02x %02x %d %d %d%s%s%s",
|
||||
&obj->base,
|
||||
get_pin_flag(obj),
|
||||
get_tiling_flag(obj),
|
||||
|
|
|
@ -732,6 +732,8 @@ validate_exec_list(struct drm_i915_gem_exec_object2 *exec,
|
|||
int count)
|
||||
{
|
||||
int i;
|
||||
int relocs_total = 0;
|
||||
int relocs_max = INT_MAX / sizeof(struct drm_i915_gem_relocation_entry);
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
char __user *ptr = (char __user *)(uintptr_t)exec[i].relocs_ptr;
|
||||
|
@ -740,10 +742,13 @@ validate_exec_list(struct drm_i915_gem_exec_object2 *exec,
|
|||
if (exec[i].flags & __EXEC_OBJECT_UNKNOWN_FLAGS)
|
||||
return -EINVAL;
|
||||
|
||||
/* First check for malicious input causing overflow */
|
||||
if (exec[i].relocation_count >
|
||||
INT_MAX / sizeof(struct drm_i915_gem_relocation_entry))
|
||||
/* First check for malicious input causing overflow in
|
||||
* the worst case where we need to allocate the entire
|
||||
* relocation tree as a single array.
|
||||
*/
|
||||
if (exec[i].relocation_count > relocs_max - relocs_total)
|
||||
return -EINVAL;
|
||||
relocs_total += exec[i].relocation_count;
|
||||
|
||||
length = exec[i].relocation_count *
|
||||
sizeof(struct drm_i915_gem_relocation_entry);
|
||||
|
|
|
@ -820,6 +820,7 @@ intel_dp_set_m_n(struct drm_crtc *crtc, struct drm_display_mode *mode,
|
|||
struct intel_link_m_n m_n;
|
||||
int pipe = intel_crtc->pipe;
|
||||
enum transcoder cpu_transcoder = intel_crtc->cpu_transcoder;
|
||||
int target_clock;
|
||||
|
||||
/*
|
||||
* Find the lane count in the intel_encoder private
|
||||
|
@ -835,13 +836,22 @@ intel_dp_set_m_n(struct drm_crtc *crtc, struct drm_display_mode *mode,
|
|||
}
|
||||
}
|
||||
|
||||
target_clock = mode->clock;
|
||||
for_each_encoder_on_crtc(dev, crtc, intel_encoder) {
|
||||
if (intel_encoder->type == INTEL_OUTPUT_EDP) {
|
||||
target_clock = intel_edp_target_clock(intel_encoder,
|
||||
mode);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Compute the GMCH and Link ratios. The '3' here is
|
||||
* the number of bytes_per_pixel post-LUT, which we always
|
||||
* set up for 8-bits of R/G/B, or 3 bytes total.
|
||||
*/
|
||||
intel_link_compute_m_n(intel_crtc->bpp, lane_count,
|
||||
mode->clock, adjusted_mode->clock, &m_n);
|
||||
target_clock, adjusted_mode->clock, &m_n);
|
||||
|
||||
if (IS_HASWELL(dev)) {
|
||||
I915_WRITE(PIPE_DATA_M1(cpu_transcoder),
|
||||
|
@ -1930,7 +1940,7 @@ intel_dp_start_link_train(struct intel_dp *intel_dp)
|
|||
for (i = 0; i < intel_dp->lane_count; i++)
|
||||
if ((intel_dp->train_set[i] & DP_TRAIN_MAX_SWING_REACHED) == 0)
|
||||
break;
|
||||
if (i == intel_dp->lane_count && voltage_tries == 5) {
|
||||
if (i == intel_dp->lane_count) {
|
||||
++loop_tries;
|
||||
if (loop_tries == 5) {
|
||||
DRM_DEBUG_KMS("too many full retries, give up\n");
|
||||
|
|
|
@ -203,7 +203,13 @@ intel_gpio_setup(struct intel_gmbus *bus, u32 pin)
|
|||
algo->data = bus;
|
||||
}
|
||||
|
||||
#define HAS_GMBUS_IRQ(dev) (INTEL_INFO(dev)->gen >= 4)
|
||||
/*
|
||||
* gmbus on gen4 seems to be able to generate legacy interrupts even when in MSI
|
||||
* mode. This results in spurious interrupt warnings if the legacy irq no. is
|
||||
* shared with another device. The kernel then disables that interrupt source
|
||||
* and so prevents the other device from working properly.
|
||||
*/
|
||||
#define HAS_GMBUS_IRQ(dev) (INTEL_INFO(dev)->gen >= 5)
|
||||
static int
|
||||
gmbus_wait_hw_status(struct drm_i915_private *dev_priv,
|
||||
u32 gmbus2_status,
|
||||
|
@ -214,6 +220,9 @@ gmbus_wait_hw_status(struct drm_i915_private *dev_priv,
|
|||
u32 gmbus2 = 0;
|
||||
DEFINE_WAIT(wait);
|
||||
|
||||
if (!HAS_GMBUS_IRQ(dev_priv->dev))
|
||||
gmbus4_irq_en = 0;
|
||||
|
||||
/* Important: The hw handles only the first bit, so set only one! Since
|
||||
* we also need to check for NAKs besides the hw ready/idle signal, we
|
||||
* need to wake up periodically and check that ourselves. */
|
||||
|
|
|
@ -382,19 +382,19 @@ static int mga_g200eh_set_plls(struct mga_device *mdev, long clock)
|
|||
m = n = p = 0;
|
||||
vcomax = 800000;
|
||||
vcomin = 400000;
|
||||
pllreffreq = 3333;
|
||||
pllreffreq = 33333;
|
||||
|
||||
delta = 0xffffffff;
|
||||
permitteddelta = clock * 5 / 1000;
|
||||
|
||||
for (testp = 16; testp > 0; testp--) {
|
||||
for (testp = 16; testp > 0; testp >>= 1) {
|
||||
if (clock * testp > vcomax)
|
||||
continue;
|
||||
if (clock * testp < vcomin)
|
||||
continue;
|
||||
|
||||
for (testm = 1; testm < 33; testm++) {
|
||||
for (testn = 1; testn < 257; testn++) {
|
||||
for (testn = 17; testn < 257; testn++) {
|
||||
computed = (pllreffreq * testn) /
|
||||
(testm * testp);
|
||||
if (computed > clock)
|
||||
|
@ -404,11 +404,11 @@ static int mga_g200eh_set_plls(struct mga_device *mdev, long clock)
|
|||
if (tmpdelta < delta) {
|
||||
delta = tmpdelta;
|
||||
n = testn - 1;
|
||||
m = (testm - 1) | ((n >> 1) & 0x80);
|
||||
m = (testm - 1);
|
||||
p = testp - 1;
|
||||
}
|
||||
if ((clock * testp) >= 600000)
|
||||
p |= 80;
|
||||
p |= 0x80;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -278,7 +278,6 @@ nouveau_object_del(struct nouveau_object *client, u32 _parent, u32 _handle)
|
|||
struct nouveau_object *parent = NULL;
|
||||
struct nouveau_object *namedb = NULL;
|
||||
struct nouveau_handle *handle = NULL;
|
||||
int ret = -EINVAL;
|
||||
|
||||
parent = nouveau_handle_ref(client, _parent);
|
||||
if (!parent)
|
||||
|
@ -295,7 +294,7 @@ nouveau_object_del(struct nouveau_object *client, u32 _parent, u32 _handle)
|
|||
}
|
||||
|
||||
nouveau_object_ref(NULL, &parent);
|
||||
return ret;
|
||||
return handle ? 0 : -EINVAL;
|
||||
}
|
||||
|
||||
int
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
#include <core/device.h>
|
||||
#include <core/subdev.h>
|
||||
|
||||
enum nouveau_therm_mode {
|
||||
enum nouveau_therm_fan_mode {
|
||||
NOUVEAU_THERM_CTRL_NONE = 0,
|
||||
NOUVEAU_THERM_CTRL_MANUAL = 1,
|
||||
NOUVEAU_THERM_CTRL_AUTO = 2,
|
||||
|
|
|
@ -134,7 +134,7 @@ nouveau_therm_alarm(struct nouveau_alarm *alarm)
|
|||
}
|
||||
|
||||
int
|
||||
nouveau_therm_mode(struct nouveau_therm *therm, int mode)
|
||||
nouveau_therm_fan_mode(struct nouveau_therm *therm, int mode)
|
||||
{
|
||||
struct nouveau_therm_priv *priv = (void *)therm;
|
||||
struct nouveau_device *device = nv_device(therm);
|
||||
|
@ -149,10 +149,15 @@ nouveau_therm_mode(struct nouveau_therm *therm, int mode)
|
|||
(mode != NOUVEAU_THERM_CTRL_NONE && device->card_type >= NV_C0))
|
||||
return -EINVAL;
|
||||
|
||||
/* do not allow automatic fan management if the thermal sensor is
|
||||
* not available */
|
||||
if (priv->mode == 2 && therm->temp_get(therm) < 0)
|
||||
return -EINVAL;
|
||||
|
||||
if (priv->mode == mode)
|
||||
return 0;
|
||||
|
||||
nv_info(therm, "Thermal management: %s\n", name[mode]);
|
||||
nv_info(therm, "fan management: %s\n", name[mode]);
|
||||
nouveau_therm_update(therm, mode);
|
||||
return 0;
|
||||
}
|
||||
|
@ -213,7 +218,7 @@ nouveau_therm_attr_set(struct nouveau_therm *therm,
|
|||
priv->fan->bios.max_duty = value;
|
||||
return 0;
|
||||
case NOUVEAU_THERM_ATTR_FAN_MODE:
|
||||
return nouveau_therm_mode(therm, value);
|
||||
return nouveau_therm_fan_mode(therm, value);
|
||||
case NOUVEAU_THERM_ATTR_THRS_FAN_BOOST:
|
||||
priv->bios_sensor.thrs_fan_boost.temp = value;
|
||||
priv->sensor.program_alarms(therm);
|
||||
|
@ -263,7 +268,7 @@ _nouveau_therm_init(struct nouveau_object *object)
|
|||
return ret;
|
||||
|
||||
if (priv->suspend >= 0)
|
||||
nouveau_therm_mode(therm, priv->mode);
|
||||
nouveau_therm_fan_mode(therm, priv->mode);
|
||||
priv->sensor.program_alarms(therm);
|
||||
return 0;
|
||||
}
|
||||
|
@ -313,11 +318,12 @@ nouveau_therm_create_(struct nouveau_object *parent,
|
|||
int
|
||||
nouveau_therm_preinit(struct nouveau_therm *therm)
|
||||
{
|
||||
nouveau_therm_ic_ctor(therm);
|
||||
nouveau_therm_sensor_ctor(therm);
|
||||
nouveau_therm_ic_ctor(therm);
|
||||
nouveau_therm_fan_ctor(therm);
|
||||
|
||||
nouveau_therm_mode(therm, NOUVEAU_THERM_CTRL_NONE);
|
||||
nouveau_therm_fan_mode(therm, NOUVEAU_THERM_CTRL_NONE);
|
||||
nouveau_therm_sensor_preinit(therm);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -32,6 +32,7 @@ probe_monitoring_device(struct nouveau_i2c_port *i2c,
|
|||
struct i2c_board_info *info)
|
||||
{
|
||||
struct nouveau_therm_priv *priv = (void *)nouveau_therm(i2c);
|
||||
struct nvbios_therm_sensor *sensor = &priv->bios_sensor;
|
||||
struct i2c_client *client;
|
||||
|
||||
request_module("%s%s", I2C_MODULE_PREFIX, info->type);
|
||||
|
@ -46,8 +47,9 @@ probe_monitoring_device(struct nouveau_i2c_port *i2c,
|
|||
}
|
||||
|
||||
nv_info(priv,
|
||||
"Found an %s at address 0x%x (controlled by lm_sensors)\n",
|
||||
info->type, info->addr);
|
||||
"Found an %s at address 0x%x (controlled by lm_sensors, "
|
||||
"temp offset %+i C)\n",
|
||||
info->type, info->addr, sensor->offset_constant);
|
||||
priv->ic = client;
|
||||
|
||||
return true;
|
||||
|
|
|
@ -29,54 +29,83 @@ struct nv40_therm_priv {
|
|||
struct nouveau_therm_priv base;
|
||||
};
|
||||
|
||||
static int
|
||||
nv40_sensor_setup(struct nouveau_therm *therm)
|
||||
enum nv40_sensor_style { INVALID_STYLE = -1, OLD_STYLE = 0, NEW_STYLE = 1 };
|
||||
|
||||
static enum nv40_sensor_style
|
||||
nv40_sensor_style(struct nouveau_therm *therm)
|
||||
{
|
||||
struct nouveau_device *device = nv_device(therm);
|
||||
|
||||
switch (device->chipset) {
|
||||
case 0x43:
|
||||
case 0x44:
|
||||
case 0x4a:
|
||||
case 0x47:
|
||||
return OLD_STYLE;
|
||||
|
||||
case 0x46:
|
||||
case 0x49:
|
||||
case 0x4b:
|
||||
case 0x4e:
|
||||
case 0x4c:
|
||||
case 0x67:
|
||||
case 0x68:
|
||||
case 0x63:
|
||||
return NEW_STYLE;
|
||||
default:
|
||||
return INVALID_STYLE;
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
nv40_sensor_setup(struct nouveau_therm *therm)
|
||||
{
|
||||
enum nv40_sensor_style style = nv40_sensor_style(therm);
|
||||
|
||||
/* enable ADC readout and disable the ALARM threshold */
|
||||
if (device->chipset >= 0x46) {
|
||||
if (style == NEW_STYLE) {
|
||||
nv_mask(therm, 0x15b8, 0x80000000, 0);
|
||||
nv_wr32(therm, 0x15b0, 0x80003fff);
|
||||
mdelay(10); /* wait for the temperature to stabilize */
|
||||
mdelay(20); /* wait for the temperature to stabilize */
|
||||
return nv_rd32(therm, 0x15b4) & 0x3fff;
|
||||
} else {
|
||||
} else if (style == OLD_STYLE) {
|
||||
nv_wr32(therm, 0x15b0, 0xff);
|
||||
mdelay(20); /* wait for the temperature to stabilize */
|
||||
return nv_rd32(therm, 0x15b4) & 0xff;
|
||||
}
|
||||
} else
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static int
|
||||
nv40_temp_get(struct nouveau_therm *therm)
|
||||
{
|
||||
struct nouveau_therm_priv *priv = (void *)therm;
|
||||
struct nouveau_device *device = nv_device(therm);
|
||||
struct nvbios_therm_sensor *sensor = &priv->bios_sensor;
|
||||
enum nv40_sensor_style style = nv40_sensor_style(therm);
|
||||
int core_temp;
|
||||
|
||||
if (device->chipset >= 0x46) {
|
||||
if (style == NEW_STYLE) {
|
||||
nv_wr32(therm, 0x15b0, 0x80003fff);
|
||||
core_temp = nv_rd32(therm, 0x15b4) & 0x3fff;
|
||||
} else {
|
||||
} else if (style == OLD_STYLE) {
|
||||
nv_wr32(therm, 0x15b0, 0xff);
|
||||
core_temp = nv_rd32(therm, 0x15b4) & 0xff;
|
||||
}
|
||||
} else
|
||||
return -ENODEV;
|
||||
|
||||
/* Setup the sensor if the temperature is 0 */
|
||||
if (core_temp == 0)
|
||||
core_temp = nv40_sensor_setup(therm);
|
||||
|
||||
if (sensor->slope_div == 0)
|
||||
sensor->slope_div = 1;
|
||||
if (sensor->offset_den == 0)
|
||||
sensor->offset_den = 1;
|
||||
if (sensor->slope_mult < 1)
|
||||
sensor->slope_mult = 1;
|
||||
/* if the slope or the offset is unset, do no use the sensor */
|
||||
if (!sensor->slope_div || !sensor->slope_mult ||
|
||||
!sensor->offset_num || !sensor->offset_den)
|
||||
return -ENODEV;
|
||||
|
||||
core_temp = core_temp * sensor->slope_mult / sensor->slope_div;
|
||||
core_temp = core_temp + sensor->offset_num / sensor->offset_den;
|
||||
core_temp = core_temp + sensor->offset_constant - 8;
|
||||
|
||||
/* reserve negative temperatures for errors */
|
||||
if (core_temp < 0)
|
||||
core_temp = 0;
|
||||
|
||||
return core_temp;
|
||||
}
|
||||
|
||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче