Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
This commit is contained in:
commit
028940342a
232 changed files with 1485 additions and 1057 deletions
|
@ -3,6 +3,8 @@
|
|||
Required properties:
|
||||
- compatible : "fsl,sgtl5000".
|
||||
|
||||
- reg : the I2C address of the device
|
||||
|
||||
Example:
|
||||
|
||||
codec: sgtl5000@0a {
|
||||
|
|
|
@ -539,3 +539,13 @@ When: 3.6
|
|||
Why: setitimer is not returning -EFAULT if user pointer is NULL. This
|
||||
violates the spec.
|
||||
Who: Sasikantha Babu <sasikanth.v19@gmail.com>
|
||||
|
||||
----------------------------
|
||||
|
||||
What: V4L2_CID_HCENTER, V4L2_CID_VCENTER V4L2 controls
|
||||
When: 3.7
|
||||
Why: The V4L2_CID_VCENTER, V4L2_CID_HCENTER controls have been deprecated
|
||||
for about 4 years and they are not used by any mainline driver.
|
||||
There are newer controls (V4L2_CID_PAN*, V4L2_CID_TILT*) that provide
|
||||
similar functionality.
|
||||
Who: Sylwester Nawrocki <sylvester.nawrocki@gmail.com>
|
||||
|
|
|
@ -1969,10 +1969,9 @@ S: Maintained
|
|||
F: drivers/net/ethernet/ti/cpmac.c
|
||||
|
||||
CPU FREQUENCY DRIVERS
|
||||
M: Dave Jones <davej@redhat.com>
|
||||
M: Rafael J. Wysocki <rjw@sisk.pl>
|
||||
L: cpufreq@vger.kernel.org
|
||||
W: http://www.codemonkey.org.uk/projects/cpufreq/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/davej/cpufreq.git
|
||||
L: linux-pm@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/cpufreq/
|
||||
F: include/linux/cpufreq.h
|
||||
|
@ -4032,6 +4031,7 @@ F: Documentation/scsi/53c700.txt
|
|||
F: drivers/scsi/53c700*
|
||||
|
||||
LED SUBSYSTEM
|
||||
M: Bryan Wu <bryan.wu@canonical.com>
|
||||
M: Richard Purdie <rpurdie@rpsys.net>
|
||||
S: Maintained
|
||||
F: drivers/leds/
|
||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
|||
VERSION = 3
|
||||
PATCHLEVEL = 4
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc5
|
||||
EXTRAVERSION = -rc7
|
||||
NAME = Saber-toothed Squirrel
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
@ -477,7 +477,7 @@ config ALPHA_BROKEN_IRQ_MASK
|
|||
|
||||
config VGA_HOSE
|
||||
bool
|
||||
depends on ALPHA_GENERIC || ALPHA_TITAN || ALPHA_MARVEL || ALPHA_TSUNAMI
|
||||
depends on VGA_CONSOLE && (ALPHA_GENERIC || ALPHA_TITAN || ALPHA_MARVEL || ALPHA_TSUNAMI)
|
||||
default y
|
||||
help
|
||||
Support VGA on an arbitrary hose; needed for several platforms
|
||||
|
|
|
@ -1,14 +1,10 @@
|
|||
#ifndef _ALPHA_RTC_H
|
||||
#define _ALPHA_RTC_H
|
||||
|
||||
#if defined(CONFIG_ALPHA_GENERIC)
|
||||
#if defined(CONFIG_ALPHA_MARVEL) && defined(CONFIG_SMP) \
|
||||
|| defined(CONFIG_ALPHA_GENERIC)
|
||||
# define get_rtc_time alpha_mv.rtc_get_time
|
||||
# define set_rtc_time alpha_mv.rtc_set_time
|
||||
#else
|
||||
# if defined(CONFIG_ALPHA_MARVEL) && defined(CONFIG_SMP)
|
||||
# define get_rtc_time marvel_get_rtc_time
|
||||
# define set_rtc_time marvel_set_rtc_time
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#include <asm-generic/rtc.h>
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#include <asm/core_tsunami.h>
|
||||
#undef __EXTERN_INLINE
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/sched.h>
|
||||
|
|
|
@ -317,7 +317,7 @@ marvel_init_irq(void)
|
|||
}
|
||||
|
||||
static int
|
||||
marvel_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
||||
marvel_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
|
||||
{
|
||||
struct pci_controller *hose = dev->sysdata;
|
||||
struct io7_port *io7_port = hose->sysdata;
|
||||
|
|
|
@ -906,27 +906,14 @@ long arch_ptrace(struct task_struct *child, long request,
|
|||
return ret;
|
||||
}
|
||||
|
||||
#ifdef __ARMEB__
|
||||
#define AUDIT_ARCH_NR AUDIT_ARCH_ARMEB
|
||||
#else
|
||||
#define AUDIT_ARCH_NR AUDIT_ARCH_ARM
|
||||
#endif
|
||||
|
||||
asmlinkage int syscall_trace(int why, struct pt_regs *regs, int scno)
|
||||
{
|
||||
unsigned long ip;
|
||||
|
||||
/*
|
||||
* Save IP. IP is used to denote syscall entry/exit:
|
||||
* IP = 0 -> entry, = 1 -> exit
|
||||
*/
|
||||
ip = regs->ARM_ip;
|
||||
regs->ARM_ip = why;
|
||||
|
||||
if (!ip)
|
||||
if (why)
|
||||
audit_syscall_exit(regs);
|
||||
else
|
||||
audit_syscall_entry(AUDIT_ARCH_NR, scno, regs->ARM_r0,
|
||||
audit_syscall_entry(AUDIT_ARCH_ARM, scno, regs->ARM_r0,
|
||||
regs->ARM_r1, regs->ARM_r2, regs->ARM_r3);
|
||||
|
||||
if (!test_thread_flag(TIF_SYSCALL_TRACE))
|
||||
|
@ -936,6 +923,13 @@ asmlinkage int syscall_trace(int why, struct pt_regs *regs, int scno)
|
|||
|
||||
current_thread_info()->syscall = scno;
|
||||
|
||||
/*
|
||||
* IP is used to denote syscall entry/exit:
|
||||
* IP = 0 -> entry, =1 -> exit
|
||||
*/
|
||||
ip = regs->ARM_ip;
|
||||
regs->ARM_ip = why;
|
||||
|
||||
/* the 0x80 provides a way for the tracing parent to distinguish
|
||||
between a syscall stop and SIGTRAP delivery */
|
||||
ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD)
|
||||
|
|
|
@ -251,8 +251,6 @@ asmlinkage void __cpuinit secondary_start_kernel(void)
|
|||
struct mm_struct *mm = &init_mm;
|
||||
unsigned int cpu = smp_processor_id();
|
||||
|
||||
printk("CPU%u: Booted secondary processor\n", cpu);
|
||||
|
||||
/*
|
||||
* All kernel threads share the same mm context; grab a
|
||||
* reference and switch to it.
|
||||
|
@ -264,6 +262,8 @@ asmlinkage void __cpuinit secondary_start_kernel(void)
|
|||
enter_lazy_tlb(mm, current);
|
||||
local_flush_tlb_all();
|
||||
|
||||
printk("CPU%u: Booted secondary processor\n", cpu);
|
||||
|
||||
cpu_init();
|
||||
preempt_disable();
|
||||
trace_hardirqs_off();
|
||||
|
|
|
@ -115,7 +115,7 @@ int kernel_execve(const char *filename,
|
|||
"Ir" (THREAD_START_SP - sizeof(regs)),
|
||||
"r" (®s),
|
||||
"Ir" (sizeof(regs))
|
||||
: "r0", "r1", "r2", "r3", "ip", "lr", "memory");
|
||||
: "r0", "r1", "r2", "r3", "r8", "r9", "ip", "lr", "memory");
|
||||
|
||||
out:
|
||||
return ret;
|
||||
|
|
|
@ -232,6 +232,9 @@ config MACH_ARMLEX4210
|
|||
config MACH_UNIVERSAL_C210
|
||||
bool "Mobile UNIVERSAL_C210 Board"
|
||||
select CPU_EXYNOS4210
|
||||
select S5P_HRT
|
||||
select CLKSRC_MMIO
|
||||
select HAVE_SCHED_CLOCK
|
||||
select S5P_GPIO_INT
|
||||
select S5P_DEV_FIMC0
|
||||
select S5P_DEV_FIMC1
|
||||
|
|
|
@ -678,7 +678,7 @@ static struct clk exynos5_clk_pdma1 = {
|
|||
.name = "dma",
|
||||
.devname = "dma-pl330.1",
|
||||
.enable = exynos5_clk_ip_fsys_ctrl,
|
||||
.ctrlbit = (1 << 1),
|
||||
.ctrlbit = (1 << 2),
|
||||
};
|
||||
|
||||
static struct clk exynos5_clk_mdma1 = {
|
||||
|
|
|
@ -40,6 +40,7 @@
|
|||
#include <plat/pd.h>
|
||||
#include <plat/regs-fb-v4.h>
|
||||
#include <plat/fimc-core.h>
|
||||
#include <plat/s5p-time.h>
|
||||
#include <plat/camport.h>
|
||||
#include <plat/mipi_csis.h>
|
||||
|
||||
|
@ -1063,6 +1064,7 @@ static void __init universal_map_io(void)
|
|||
exynos_init_io(NULL, 0);
|
||||
s3c24xx_init_clocks(24000000);
|
||||
s3c24xx_init_uarts(universal_uartcfgs, ARRAY_SIZE(universal_uartcfgs));
|
||||
s5p_set_timer_source(S5P_PWM2, S5P_PWM4);
|
||||
}
|
||||
|
||||
static void s5p_tv_setup(void)
|
||||
|
@ -1113,7 +1115,7 @@ MACHINE_START(UNIVERSAL_C210, "UNIVERSAL_C210")
|
|||
.map_io = universal_map_io,
|
||||
.handle_irq = gic_handle_irq,
|
||||
.init_machine = universal_machine_init,
|
||||
.timer = &exynos4_timer,
|
||||
.timer = &s5p_timer,
|
||||
.reserve = &universal_reserve,
|
||||
.restart = exynos4_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/kexec.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include <mach/bridge-regs.h>
|
||||
|
|
|
@ -48,7 +48,7 @@ static irqreturn_t deferred_fiq(int irq, void *dev_id)
|
|||
struct irq_chip *irq_chip = NULL;
|
||||
int gpio, irq_num, fiq_count;
|
||||
|
||||
irq_desc = irq_to_desc(IH_GPIO_BASE);
|
||||
irq_desc = irq_to_desc(gpio_to_irq(AMS_DELTA_GPIO_PIN_KEYBRD_CLK));
|
||||
if (irq_desc)
|
||||
irq_chip = irq_desc->irq_data.chip;
|
||||
|
||||
|
|
|
@ -641,7 +641,7 @@ static struct regulator_consumer_supply dummy_supplies[] = {
|
|||
|
||||
static void __init igep_init(void)
|
||||
{
|
||||
regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies));
|
||||
regulator_register_fixed(1, dummy_supplies, ARRAY_SIZE(dummy_supplies));
|
||||
omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
|
||||
|
||||
/* Get IGEP2 hardware revision */
|
||||
|
|
|
@ -941,10 +941,10 @@
|
|||
#define OMAP4_DSI2_LANEENABLE_MASK (0x7 << 29)
|
||||
#define OMAP4_DSI1_LANEENABLE_SHIFT 24
|
||||
#define OMAP4_DSI1_LANEENABLE_MASK (0x1f << 24)
|
||||
#define OMAP4_DSI2_PIPD_SHIFT 19
|
||||
#define OMAP4_DSI2_PIPD_MASK (0x1f << 19)
|
||||
#define OMAP4_DSI1_PIPD_SHIFT 14
|
||||
#define OMAP4_DSI1_PIPD_MASK (0x1f << 14)
|
||||
#define OMAP4_DSI1_PIPD_SHIFT 19
|
||||
#define OMAP4_DSI1_PIPD_MASK (0x1f << 19)
|
||||
#define OMAP4_DSI2_PIPD_SHIFT 14
|
||||
#define OMAP4_DSI2_PIPD_MASK (0x1f << 14)
|
||||
|
||||
/* CONTROL_MCBSPLP */
|
||||
#define OMAP4_ALBCTRLRX_FSX_SHIFT 31
|
||||
|
|
|
@ -65,8 +65,8 @@
|
|||
#define MPP8_GIGE MPP(8, 0x1, 0, 0, 1, 1, 1)
|
||||
|
||||
#define MPP9_UNUSED MPP(9, 0x0, 0, 0, 1, 1, 1)
|
||||
#define MPP9_GPIO MPP(9, 0x0, 0, 0, 1, 1, 1)
|
||||
#define MPP9_GIGE MPP(9, 0x1, 1, 1, 1, 1, 1)
|
||||
#define MPP9_GPIO MPP(9, 0x0, 1, 1, 1, 1, 1)
|
||||
#define MPP9_GIGE MPP(9, 0x1, 0, 0, 1, 1, 1)
|
||||
|
||||
#define MPP10_UNUSED MPP(10, 0x0, 0, 0, 1, 1, 1)
|
||||
#define MPP10_GPIO MPP(10, 0x0, 1, 1, 1, 1, 1)
|
||||
|
|
|
@ -365,23 +365,13 @@ static struct platform_device mipidsi0_device = {
|
|||
};
|
||||
|
||||
/* SDHI0 */
|
||||
static irqreturn_t ag5evm_sdhi0_gpio_cd(int irq, void *arg)
|
||||
{
|
||||
struct device *dev = arg;
|
||||
struct sh_mobile_sdhi_info *info = dev->platform_data;
|
||||
struct tmio_mmc_data *pdata = info->pdata;
|
||||
|
||||
tmio_mmc_cd_wakeup(pdata);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static struct sh_mobile_sdhi_info sdhi0_info = {
|
||||
.dma_slave_tx = SHDMA_SLAVE_SDHI0_TX,
|
||||
.dma_slave_rx = SHDMA_SLAVE_SDHI0_RX,
|
||||
.tmio_flags = TMIO_MMC_HAS_IDLE_WAIT,
|
||||
.tmio_flags = TMIO_MMC_HAS_IDLE_WAIT | TMIO_MMC_USE_GPIO_CD,
|
||||
.tmio_caps = MMC_CAP_SD_HIGHSPEED,
|
||||
.tmio_ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29,
|
||||
.cd_gpio = GPIO_PORT251,
|
||||
};
|
||||
|
||||
static struct resource sdhi0_resources[] = {
|
||||
|
@ -557,7 +547,6 @@ static void __init ag5evm_init(void)
|
|||
lcd_backlight_reset();
|
||||
|
||||
/* enable SDHI0 on CN15 [SD I/F] */
|
||||
gpio_request(GPIO_FN_SDHICD0, NULL);
|
||||
gpio_request(GPIO_FN_SDHIWP0, NULL);
|
||||
gpio_request(GPIO_FN_SDHICMD0, NULL);
|
||||
gpio_request(GPIO_FN_SDHICLK0, NULL);
|
||||
|
@ -566,13 +555,6 @@ static void __init ag5evm_init(void)
|
|||
gpio_request(GPIO_FN_SDHID0_1, NULL);
|
||||
gpio_request(GPIO_FN_SDHID0_0, NULL);
|
||||
|
||||
if (!request_irq(intcs_evt2irq(0x3c0), ag5evm_sdhi0_gpio_cd,
|
||||
IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,
|
||||
"sdhi0 cd", &sdhi0_device.dev))
|
||||
sdhi0_info.tmio_flags |= TMIO_MMC_HAS_COLD_CD;
|
||||
else
|
||||
pr_warn("Unable to setup SDHI0 GPIO IRQ\n");
|
||||
|
||||
/* enable SDHI1 on CN4 [WLAN I/F] */
|
||||
gpio_request(GPIO_FN_SDHICLK1, NULL);
|
||||
gpio_request(GPIO_FN_SDHICMD1_PU, NULL);
|
||||
|
|
|
@ -1011,21 +1011,12 @@ static int slot_cn7_get_cd(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
/* SDHI0 */
|
||||
static irqreturn_t mackerel_sdhi0_gpio_cd(int irq, void *arg)
|
||||
{
|
||||
struct device *dev = arg;
|
||||
struct sh_mobile_sdhi_info *info = dev->platform_data;
|
||||
struct tmio_mmc_data *pdata = info->pdata;
|
||||
|
||||
tmio_mmc_cd_wakeup(pdata);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static struct sh_mobile_sdhi_info sdhi0_info = {
|
||||
.dma_slave_tx = SHDMA_SLAVE_SDHI0_TX,
|
||||
.dma_slave_rx = SHDMA_SLAVE_SDHI0_RX,
|
||||
.tmio_flags = TMIO_MMC_USE_GPIO_CD,
|
||||
.tmio_caps = MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ,
|
||||
.cd_gpio = GPIO_PORT172,
|
||||
};
|
||||
|
||||
static struct resource sdhi0_resources[] = {
|
||||
|
@ -1384,7 +1375,6 @@ static void __init mackerel_init(void)
|
|||
{
|
||||
u32 srcr4;
|
||||
struct clk *clk;
|
||||
int ret;
|
||||
|
||||
/* External clock source */
|
||||
clk_set_rate(&sh7372_dv_clki_clk, 27000000);
|
||||
|
@ -1481,7 +1471,6 @@ static void __init mackerel_init(void)
|
|||
irq_set_irq_type(IRQ21, IRQ_TYPE_LEVEL_HIGH);
|
||||
|
||||
/* enable SDHI0 */
|
||||
gpio_request(GPIO_FN_SDHICD0, NULL);
|
||||
gpio_request(GPIO_FN_SDHIWP0, NULL);
|
||||
gpio_request(GPIO_FN_SDHICMD0, NULL);
|
||||
gpio_request(GPIO_FN_SDHICLK0, NULL);
|
||||
|
@ -1490,13 +1479,6 @@ static void __init mackerel_init(void)
|
|||
gpio_request(GPIO_FN_SDHID0_1, NULL);
|
||||
gpio_request(GPIO_FN_SDHID0_0, NULL);
|
||||
|
||||
ret = request_irq(evt2irq(0x3340), mackerel_sdhi0_gpio_cd,
|
||||
IRQF_TRIGGER_FALLING, "sdhi0 cd", &sdhi0_device.dev);
|
||||
if (!ret)
|
||||
sdhi0_info.tmio_flags |= TMIO_MMC_HAS_COLD_CD;
|
||||
else
|
||||
pr_err("Cannot get IRQ #%d: %d\n", evt2irq(0x3340), ret);
|
||||
|
||||
#if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE)
|
||||
/* enable SDHI1 */
|
||||
gpio_request(GPIO_FN_SDHICMD1, NULL);
|
||||
|
|
|
@ -16,6 +16,59 @@
|
|||
|
||||
__CPUINIT
|
||||
|
||||
/* Cache invalidation nicked from arch/arm/mach-imx/head-v7.S, thanks!
|
||||
*
|
||||
* The secondary kernel init calls v7_flush_dcache_all before it enables
|
||||
* the L1; however, the L1 comes out of reset in an undefined state, so
|
||||
* the clean + invalidate performed by v7_flush_dcache_all causes a bunch
|
||||
* of cache lines with uninitialized data and uninitialized tags to get
|
||||
* written out to memory, which does really unpleasant things to the main
|
||||
* processor. We fix this by performing an invalidate, rather than a
|
||||
* clean + invalidate, before jumping into the kernel.
|
||||
*
|
||||
* This funciton is cloned from arch/arm/mach-tegra/headsmp.S, and needs
|
||||
* to be called for both secondary cores startup and primary core resume
|
||||
* procedures. Ideally, it should be moved into arch/arm/mm/cache-v7.S.
|
||||
*/
|
||||
ENTRY(v7_invalidate_l1)
|
||||
mov r0, #0
|
||||
mcr p15, 0, r0, c7, c5, 0 @ invalidate I cache
|
||||
mcr p15, 2, r0, c0, c0, 0
|
||||
mrc p15, 1, r0, c0, c0, 0
|
||||
|
||||
ldr r1, =0x7fff
|
||||
and r2, r1, r0, lsr #13
|
||||
|
||||
ldr r1, =0x3ff
|
||||
|
||||
and r3, r1, r0, lsr #3 @ NumWays - 1
|
||||
add r2, r2, #1 @ NumSets
|
||||
|
||||
and r0, r0, #0x7
|
||||
add r0, r0, #4 @ SetShift
|
||||
|
||||
clz r1, r3 @ WayShift
|
||||
add r4, r3, #1 @ NumWays
|
||||
1: sub r2, r2, #1 @ NumSets--
|
||||
mov r3, r4 @ Temp = NumWays
|
||||
2: subs r3, r3, #1 @ Temp--
|
||||
mov r5, r3, lsl r1
|
||||
mov r6, r2, lsl r0
|
||||
orr r5, r5, r6 @ Reg = (Temp<<WayShift)|(NumSets<<SetShift)
|
||||
mcr p15, 0, r5, c7, c6, 2
|
||||
bgt 2b
|
||||
cmp r2, #0
|
||||
bgt 1b
|
||||
dsb
|
||||
isb
|
||||
mov pc, lr
|
||||
ENDPROC(v7_invalidate_l1)
|
||||
|
||||
ENTRY(shmobile_invalidate_start)
|
||||
bl v7_invalidate_l1
|
||||
b secondary_startup
|
||||
ENDPROC(shmobile_invalidate_start)
|
||||
|
||||
/*
|
||||
* Reset vector for secondary CPUs.
|
||||
* This will be mapped at address 0 by SBAR register.
|
||||
|
@ -24,4 +77,5 @@
|
|||
.align 12
|
||||
ENTRY(shmobile_secondary_vector)
|
||||
ldr pc, 1f
|
||||
1: .long secondary_startup - PAGE_OFFSET + PLAT_PHYS_OFFSET
|
||||
1: .long shmobile_invalidate_start - PAGE_OFFSET + PLAT_PHYS_OFFSET
|
||||
ENDPROC(shmobile_secondary_vector)
|
||||
|
|
|
@ -4,7 +4,6 @@
|
|||
extern void shmobile_earlytimer_init(void);
|
||||
extern struct sys_timer shmobile_timer;
|
||||
struct twd_local_timer;
|
||||
void shmobile_twd_init(struct twd_local_timer *twd_local_timer);
|
||||
extern void shmobile_setup_console(void);
|
||||
extern void shmobile_secondary_vector(void);
|
||||
extern int shmobile_platform_cpu_kill(unsigned int cpu);
|
||||
|
@ -82,5 +81,6 @@ extern int r8a7779_platform_cpu_kill(unsigned int cpu);
|
|||
extern void r8a7779_secondary_init(unsigned int cpu);
|
||||
extern int r8a7779_boot_secondary(unsigned int cpu);
|
||||
extern void r8a7779_smp_prepare_cpus(void);
|
||||
extern void r8a7779_register_twd(void);
|
||||
|
||||
#endif /* __ARCH_MACH_COMMON_H */
|
||||
|
|
|
@ -262,10 +262,14 @@ void __init r8a7779_add_standard_devices(void)
|
|||
ARRAY_SIZE(r8a7779_late_devices));
|
||||
}
|
||||
|
||||
/* do nothing for !CONFIG_SMP or !CONFIG_HAVE_TWD */
|
||||
void __init __weak r8a7779_register_twd(void) { }
|
||||
|
||||
static void __init r8a7779_earlytimer_init(void)
|
||||
{
|
||||
r8a7779_clock_init();
|
||||
shmobile_earlytimer_init();
|
||||
r8a7779_register_twd();
|
||||
}
|
||||
|
||||
void __init r8a7779_add_early_devices(void)
|
||||
|
|
|
@ -688,10 +688,14 @@ void __init sh73a0_add_standard_devices(void)
|
|||
ARRAY_SIZE(sh73a0_late_devices));
|
||||
}
|
||||
|
||||
/* do nothing for !CONFIG_SMP or !CONFIG_HAVE_TWD */
|
||||
void __init __weak sh73a0_register_twd(void) { }
|
||||
|
||||
static void __init sh73a0_earlytimer_init(void)
|
||||
{
|
||||
sh73a0_clock_init();
|
||||
shmobile_earlytimer_init();
|
||||
sh73a0_register_twd();
|
||||
}
|
||||
|
||||
void __init sh73a0_add_early_devices(void)
|
||||
|
|
|
@ -64,8 +64,15 @@ static void __iomem *scu_base_addr(void)
|
|||
static DEFINE_SPINLOCK(scu_lock);
|
||||
static unsigned long tmp;
|
||||
|
||||
#ifdef CONFIG_HAVE_ARM_TWD
|
||||
static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, 0xf0000600, 29);
|
||||
|
||||
void __init r8a7779_register_twd(void)
|
||||
{
|
||||
twd_local_timer_register(&twd_local_timer);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void modify_scu_cpu_psr(unsigned long set, unsigned long clr)
|
||||
{
|
||||
void __iomem *scu_base = scu_base_addr();
|
||||
|
@ -84,7 +91,6 @@ unsigned int __init r8a7779_get_core_count(void)
|
|||
{
|
||||
void __iomem *scu_base = scu_base_addr();
|
||||
|
||||
shmobile_twd_init(&twd_local_timer);
|
||||
return scu_get_core_count(scu_base);
|
||||
}
|
||||
|
||||
|
|
|
@ -42,7 +42,13 @@ static void __iomem *scu_base_addr(void)
|
|||
static DEFINE_SPINLOCK(scu_lock);
|
||||
static unsigned long tmp;
|
||||
|
||||
#ifdef CONFIG_HAVE_ARM_TWD
|
||||
static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, 0xf0000600, 29);
|
||||
void __init sh73a0_register_twd(void)
|
||||
{
|
||||
twd_local_timer_register(&twd_local_timer);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void modify_scu_cpu_psr(unsigned long set, unsigned long clr)
|
||||
{
|
||||
|
@ -62,7 +68,6 @@ unsigned int __init sh73a0_get_core_count(void)
|
|||
{
|
||||
void __iomem *scu_base = scu_base_addr();
|
||||
|
||||
shmobile_twd_init(&twd_local_timer);
|
||||
return scu_get_core_count(scu_base);
|
||||
}
|
||||
|
||||
|
|
|
@ -46,15 +46,6 @@ static void __init shmobile_timer_init(void)
|
|||
{
|
||||
}
|
||||
|
||||
void __init shmobile_twd_init(struct twd_local_timer *twd_local_timer)
|
||||
{
|
||||
#ifdef CONFIG_HAVE_ARM_TWD
|
||||
int err = twd_local_timer_register(twd_local_timer);
|
||||
if (err)
|
||||
pr_err("twd_local_timer_register failed %d\n", err);
|
||||
#endif
|
||||
}
|
||||
|
||||
struct sys_timer shmobile_timer = {
|
||||
.init = shmobile_timer_init,
|
||||
};
|
||||
|
|
|
@ -1174,7 +1174,7 @@ out:
|
|||
|
||||
bool kvm_vcpu_compatible(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
return irqchip_in_kernel(vcpu->kcm) == (vcpu->arch.apic != NULL);
|
||||
return irqchip_in_kernel(vcpu->kvm) == (vcpu->arch.apic != NULL);
|
||||
}
|
||||
|
||||
int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu)
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
|
||||
/***************************************************************************/
|
||||
|
||||
#ifdef CONFIG_SPI_COLDFIRE_QSPI
|
||||
#if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)
|
||||
|
||||
static void __init m520x_qspi_init(void)
|
||||
{
|
||||
|
@ -35,7 +35,7 @@ static void __init m520x_qspi_init(void)
|
|||
writew(par, MCF_GPIO_PAR_UART);
|
||||
}
|
||||
|
||||
#endif /* CONFIG_SPI_COLDFIRE_QSPI */
|
||||
#endif /* IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) */
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
|
@ -79,7 +79,7 @@ void __init config_BSP(char *commandp, int size)
|
|||
mach_sched_init = hw_timer_init;
|
||||
m520x_uarts_init();
|
||||
m520x_fec_init();
|
||||
#ifdef CONFIG_SPI_COLDFIRE_QSPI
|
||||
#if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)
|
||||
m520x_qspi_init();
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
|
||||
/***************************************************************************/
|
||||
|
||||
#ifdef CONFIG_SPI_COLDFIRE_QSPI
|
||||
#if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)
|
||||
|
||||
static void __init m523x_qspi_init(void)
|
||||
{
|
||||
|
@ -36,7 +36,7 @@ static void __init m523x_qspi_init(void)
|
|||
writew(par, MCFGPIO_PAR_TIMER);
|
||||
}
|
||||
|
||||
#endif /* CONFIG_SPI_COLDFIRE_QSPI */
|
||||
#endif /* IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) */
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
|
@ -58,7 +58,7 @@ void __init config_BSP(char *commandp, int size)
|
|||
{
|
||||
mach_sched_init = hw_timer_init;
|
||||
m523x_fec_init();
|
||||
#ifdef CONFIG_SPI_COLDFIRE_QSPI
|
||||
#if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)
|
||||
m523x_qspi_init();
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -51,7 +51,7 @@ static struct platform_device *m5249_devices[] __initdata = {
|
|||
|
||||
/***************************************************************************/
|
||||
|
||||
#ifdef CONFIG_SPI_COLDFIRE_QSPI
|
||||
#if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)
|
||||
|
||||
static void __init m5249_qspi_init(void)
|
||||
{
|
||||
|
@ -61,7 +61,7 @@ static void __init m5249_qspi_init(void)
|
|||
mcf_mapirq2imr(MCF_IRQ_QSPI, MCFINTC_QSPI);
|
||||
}
|
||||
|
||||
#endif /* CONFIG_SPI_COLDFIRE_QSPI */
|
||||
#endif /* IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) */
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
|
@ -90,7 +90,7 @@ void __init config_BSP(char *commandp, int size)
|
|||
#ifdef CONFIG_M5249C3
|
||||
m5249_smc91x_init();
|
||||
#endif
|
||||
#ifdef CONFIG_SPI_COLDFIRE_QSPI
|
||||
#if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)
|
||||
m5249_qspi_init();
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
|
||||
/***************************************************************************/
|
||||
|
||||
#ifdef CONFIG_SPI_COLDFIRE_QSPI
|
||||
#if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)
|
||||
|
||||
static void __init m527x_qspi_init(void)
|
||||
{
|
||||
|
@ -42,7 +42,7 @@ static void __init m527x_qspi_init(void)
|
|||
#endif
|
||||
}
|
||||
|
||||
#endif /* CONFIG_SPI_COLDFIRE_QSPI */
|
||||
#endif /* IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) */
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
|
@ -90,7 +90,7 @@ void __init config_BSP(char *commandp, int size)
|
|||
mach_sched_init = hw_timer_init;
|
||||
m527x_uarts_init();
|
||||
m527x_fec_init();
|
||||
#ifdef CONFIG_SPI_COLDFIRE_QSPI
|
||||
#if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)
|
||||
m527x_qspi_init();
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
|
||||
/***************************************************************************/
|
||||
|
||||
#ifdef CONFIG_SPI_COLDFIRE_QSPI
|
||||
#if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)
|
||||
|
||||
static void __init m528x_qspi_init(void)
|
||||
{
|
||||
|
@ -32,7 +32,7 @@ static void __init m528x_qspi_init(void)
|
|||
__raw_writeb(0x07, MCFGPIO_PQSPAR);
|
||||
}
|
||||
|
||||
#endif /* CONFIG_SPI_COLDFIRE_QSPI */
|
||||
#endif /* IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) */
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
|
@ -98,7 +98,7 @@ void __init config_BSP(char *commandp, int size)
|
|||
mach_sched_init = hw_timer_init;
|
||||
m528x_uarts_init();
|
||||
m528x_fec_init();
|
||||
#ifdef CONFIG_SPI_COLDFIRE_QSPI
|
||||
#if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)
|
||||
m528x_qspi_init();
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
|
||||
/***************************************************************************/
|
||||
|
||||
#ifdef CONFIG_SPI_COLDFIRE_QSPI
|
||||
#if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)
|
||||
|
||||
static void __init m532x_qspi_init(void)
|
||||
{
|
||||
|
@ -38,7 +38,7 @@ static void __init m532x_qspi_init(void)
|
|||
writew(0x01f0, MCF_GPIO_PAR_QSPI);
|
||||
}
|
||||
|
||||
#endif /* CONFIG_SPI_COLDFIRE_QSPI */
|
||||
#endif /* IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) */
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
|
@ -77,7 +77,7 @@ void __init config_BSP(char *commandp, int size)
|
|||
mach_sched_init = hw_timer_init;
|
||||
m532x_uarts_init();
|
||||
m532x_fec_init();
|
||||
#ifdef CONFIG_SPI_COLDFIRE_QSPI
|
||||
#if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)
|
||||
m532x_qspi_init();
|
||||
#endif
|
||||
|
||||
|
|
|
@ -121,7 +121,7 @@ static struct platform_device mcf_fec1 = {
|
|||
#endif /* MCFFEC_BASE1 */
|
||||
#endif /* CONFIG_FEC */
|
||||
|
||||
#ifdef CONFIG_SPI_COLDFIRE_QSPI
|
||||
#if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)
|
||||
/*
|
||||
* The ColdFire QSPI module is an SPI protocol hardware block used
|
||||
* on a number of different ColdFire CPUs.
|
||||
|
@ -274,7 +274,7 @@ static struct platform_device mcf_qspi = {
|
|||
.resource = mcf_qspi_resources,
|
||||
.dev.platform_data = &mcf_qspi_data,
|
||||
};
|
||||
#endif /* CONFIG_SPI_COLDFIRE_QSPI */
|
||||
#endif /* IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) */
|
||||
|
||||
static struct platform_device *mcf_devices[] __initdata = {
|
||||
&mcf_uart,
|
||||
|
@ -284,7 +284,7 @@ static struct platform_device *mcf_devices[] __initdata = {
|
|||
&mcf_fec1,
|
||||
#endif
|
||||
#endif
|
||||
#ifdef CONFIG_SPI_COLDFIRE_QSPI
|
||||
#if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)
|
||||
&mcf_qspi,
|
||||
#endif
|
||||
};
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include <linux/sched.h>
|
||||
#include <linux/profile.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/cpu.h>
|
||||
#include <asm/tlbflush.h>
|
||||
#include <asm/bitops.h>
|
||||
#include <asm/processor.h>
|
||||
|
@ -38,7 +39,6 @@
|
|||
#include "internal.h"
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
#include <linux/cpu.h>
|
||||
#include <asm/cacheflush.h>
|
||||
|
||||
static unsigned long sleep_mode[NR_CPUS];
|
||||
|
@ -874,10 +874,13 @@ static void __init smp_online(void)
|
|||
|
||||
cpu = smp_processor_id();
|
||||
|
||||
local_irq_enable();
|
||||
notify_cpu_starting(cpu);
|
||||
|
||||
ipi_call_lock();
|
||||
set_cpu_online(cpu, true);
|
||||
smp_wmb();
|
||||
ipi_call_unlock();
|
||||
|
||||
local_irq_enable();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
#define _PARISC_HARDWARE_H
|
||||
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <asm/pdc.h>
|
||||
|
||||
#define HWTYPE_ANY_ID PA_HWTYPE_ANY_ID
|
||||
#define HVERSION_ANY_ID PA_HVERSION_ANY_ID
|
||||
|
@ -95,12 +94,14 @@ struct bc_module {
|
|||
#define HPHW_MC 15
|
||||
#define HPHW_FAULTY 31
|
||||
|
||||
struct parisc_device_id;
|
||||
|
||||
/* hardware.c: */
|
||||
extern const char *parisc_hardware_description(struct parisc_device_id *id);
|
||||
extern enum cpu_type parisc_get_cpu_type(unsigned long hversion);
|
||||
|
||||
struct pci_dev;
|
||||
struct hardware_path;
|
||||
|
||||
/* drivers.c: */
|
||||
extern struct parisc_device *alloc_pa_dev(unsigned long hpa,
|
||||
|
|
|
@ -160,5 +160,11 @@ extern int npmem_ranges;
|
|||
|
||||
#include <asm-generic/memory_model.h>
|
||||
#include <asm-generic/getorder.h>
|
||||
#include <asm/pdc.h>
|
||||
|
||||
#define PAGE0 ((struct zeropage *)__PAGE_OFFSET)
|
||||
|
||||
/* DEFINITION OF THE ZERO-PAGE (PAG0) */
|
||||
/* based on work by Jason Eckhardt (jason@equator.com) */
|
||||
|
||||
#endif /* _PARISC_PAGE_H */
|
||||
|
|
|
@ -343,8 +343,6 @@
|
|||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#include <asm/page.h> /* for __PAGE_OFFSET */
|
||||
|
||||
extern int pdc_type;
|
||||
|
||||
/* Values for pdc_type */
|
||||
|
@ -677,11 +675,6 @@ static inline char * os_id_to_string(u16 os_id) {
|
|||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#define PAGE0 ((struct zeropage *)__PAGE_OFFSET)
|
||||
|
||||
/* DEFINITION OF THE ZERO-PAGE (PAG0) */
|
||||
/* based on work by Jason Eckhardt (jason@equator.com) */
|
||||
|
||||
/* flags of the device_path */
|
||||
#define PF_AUTOBOOT 0x80
|
||||
#define PF_AUTOSEARCH 0x40
|
||||
|
|
|
@ -44,6 +44,8 @@ struct vm_area_struct;
|
|||
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
|
||||
#include <asm/page.h>
|
||||
|
||||
#define pte_ERROR(e) \
|
||||
printk("%s:%d: bad pte %08lx.\n", __FILE__, __LINE__, pte_val(e))
|
||||
#define pmd_ERROR(e) \
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
#ifndef __ASM_SPINLOCK_H
|
||||
#define __ASM_SPINLOCK_H
|
||||
|
||||
#include <asm/barrier.h>
|
||||
#include <asm/ldcw.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/spinlock_types.h>
|
||||
|
||||
|
|
|
@ -50,6 +50,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/major.h>
|
||||
#include <linux/tty.h>
|
||||
#include <asm/page.h> /* for PAGE0 */
|
||||
#include <asm/pdc.h> /* for iodc_call() proto and friends */
|
||||
|
||||
static DEFINE_SPINLOCK(pdc_console_lock);
|
||||
|
@ -104,7 +105,7 @@ static int pdc_console_tty_open(struct tty_struct *tty, struct file *filp)
|
|||
|
||||
static void pdc_console_tty_close(struct tty_struct *tty, struct file *filp)
|
||||
{
|
||||
if (!tty->count) {
|
||||
if (tty->count == 1) {
|
||||
del_timer_sync(&pdc_console_timer);
|
||||
tty_port_tty_set(&tty_port, NULL);
|
||||
}
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
#include <linux/delay.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/ftrace.h>
|
||||
#include <linux/cpu.h>
|
||||
|
||||
#include <linux/atomic.h>
|
||||
#include <asm/current.h>
|
||||
|
@ -295,8 +296,13 @@ smp_cpu_init(int cpunum)
|
|||
|
||||
printk(KERN_CRIT "CPU#%d already initialized!\n", cpunum);
|
||||
machine_halt();
|
||||
}
|
||||
}
|
||||
|
||||
notify_cpu_starting(cpunum);
|
||||
|
||||
ipi_call_lock();
|
||||
set_cpu_online(cpunum, true);
|
||||
ipi_call_unlock();
|
||||
|
||||
/* Initialise the idle task for this CPU */
|
||||
atomic_inc(&init_mm.mm_count);
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#include <asm/uaccess.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/param.h>
|
||||
#include <asm/pdc.h>
|
||||
#include <asm/led.h>
|
||||
|
|
|
@ -288,13 +288,6 @@ label##_hv: \
|
|||
/* Exception addition: Hard disable interrupts */
|
||||
#define DISABLE_INTS SOFT_DISABLE_INTS(r10,r11)
|
||||
|
||||
/* Exception addition: Keep interrupt state */
|
||||
#define ENABLE_INTS \
|
||||
ld r11,PACAKMSR(r13); \
|
||||
ld r12,_MSR(r1); \
|
||||
rlwimi r11,r12,0,MSR_EE; \
|
||||
mtmsrd r11,1
|
||||
|
||||
#define ADD_NVGPRS \
|
||||
bl .save_nvgprs
|
||||
|
||||
|
|
|
@ -81,12 +81,13 @@ struct kvmppc_vcpu_book3s {
|
|||
u64 sdr1;
|
||||
u64 hior;
|
||||
u64 msr_mask;
|
||||
u64 vsid_next;
|
||||
#ifdef CONFIG_PPC_BOOK3S_32
|
||||
u32 vsid_pool[VSID_POOL_SIZE];
|
||||
u32 vsid_next;
|
||||
#else
|
||||
u64 vsid_first;
|
||||
u64 vsid_max;
|
||||
u64 proto_vsid_first;
|
||||
u64 proto_vsid_max;
|
||||
u64 proto_vsid_next;
|
||||
#endif
|
||||
int context_id[SID_CONTEXTS];
|
||||
|
||||
|
|
|
@ -588,23 +588,19 @@ _GLOBAL(ret_from_except_lite)
|
|||
fast_exc_return_irq:
|
||||
restore:
|
||||
/*
|
||||
* This is the main kernel exit path, we first check if we
|
||||
* have to change our interrupt state.
|
||||
* This is the main kernel exit path. First we check if we
|
||||
* are about to re-enable interrupts
|
||||
*/
|
||||
ld r5,SOFTE(r1)
|
||||
lbz r6,PACASOFTIRQEN(r13)
|
||||
cmpwi cr1,r5,0
|
||||
cmpw cr0,r5,r6
|
||||
beq cr0,4f
|
||||
cmpwi cr0,r5,0
|
||||
beq restore_irq_off
|
||||
|
||||
/* We do, handle disable first, which is easy */
|
||||
bne cr1,3f;
|
||||
li r0,0
|
||||
stb r0,PACASOFTIRQEN(r13);
|
||||
TRACE_DISABLE_INTS
|
||||
b 4f
|
||||
/* We are enabling, were we already enabled ? Yes, just return */
|
||||
cmpwi cr0,r6,1
|
||||
beq cr0,do_restore
|
||||
|
||||
3: /*
|
||||
/*
|
||||
* We are about to soft-enable interrupts (we are hard disabled
|
||||
* at this point). We check if there's anything that needs to
|
||||
* be replayed first.
|
||||
|
@ -626,7 +622,7 @@ restore_no_replay:
|
|||
/*
|
||||
* Final return path. BookE is handled in a different file
|
||||
*/
|
||||
4:
|
||||
do_restore:
|
||||
#ifdef CONFIG_PPC_BOOK3E
|
||||
b .exception_return_book3e
|
||||
#else
|
||||
|
@ -699,6 +695,25 @@ fast_exception_return:
|
|||
|
||||
#endif /* CONFIG_PPC_BOOK3E */
|
||||
|
||||
/*
|
||||
* We are returning to a context with interrupts soft disabled.
|
||||
*
|
||||
* However, we may also about to hard enable, so we need to
|
||||
* make sure that in this case, we also clear PACA_IRQ_HARD_DIS
|
||||
* or that bit can get out of sync and bad things will happen
|
||||
*/
|
||||
restore_irq_off:
|
||||
ld r3,_MSR(r1)
|
||||
lbz r7,PACAIRQHAPPENED(r13)
|
||||
andi. r0,r3,MSR_EE
|
||||
beq 1f
|
||||
rlwinm r7,r7,0,~PACA_IRQ_HARD_DIS
|
||||
stb r7,PACAIRQHAPPENED(r13)
|
||||
1: li r0,0
|
||||
stb r0,PACASOFTIRQEN(r13);
|
||||
TRACE_DISABLE_INTS
|
||||
b do_restore
|
||||
|
||||
/*
|
||||
* Something did happen, check if a re-emit is needed
|
||||
* (this also clears paca->irq_happened)
|
||||
|
@ -748,6 +763,9 @@ restore_check_irq_replay:
|
|||
#endif /* CONFIG_PPC_BOOK3E */
|
||||
1: b .ret_from_except /* What else to do here ? */
|
||||
|
||||
|
||||
|
||||
3:
|
||||
do_work:
|
||||
#ifdef CONFIG_PREEMPT
|
||||
andi. r0,r3,MSR_PR /* Returning to user mode? */
|
||||
|
@ -767,16 +785,6 @@ do_work:
|
|||
SOFT_DISABLE_INTS(r3,r4)
|
||||
1: bl .preempt_schedule_irq
|
||||
|
||||
/* Hard-disable interrupts again (and update PACA) */
|
||||
#ifdef CONFIG_PPC_BOOK3E
|
||||
wrteei 0
|
||||
#else
|
||||
ld r10,PACAKMSR(r13) /* Get kernel MSR without EE */
|
||||
mtmsrd r10,1
|
||||
#endif /* CONFIG_PPC_BOOK3E */
|
||||
li r0,PACA_IRQ_HARD_DIS
|
||||
stb r0,PACAIRQHAPPENED(r13)
|
||||
|
||||
/* Re-test flags and eventually loop */
|
||||
clrrdi r9,r1,THREAD_SHIFT
|
||||
ld r4,TI_FLAGS(r9)
|
||||
|
@ -787,14 +795,6 @@ do_work:
|
|||
user_work:
|
||||
#endif /* CONFIG_PREEMPT */
|
||||
|
||||
/* Enable interrupts */
|
||||
#ifdef CONFIG_PPC_BOOK3E
|
||||
wrteei 1
|
||||
#else
|
||||
ori r10,r10,MSR_EE
|
||||
mtmsrd r10,1
|
||||
#endif /* CONFIG_PPC_BOOK3E */
|
||||
|
||||
andi. r0,r4,_TIF_NEED_RESCHED
|
||||
beq 1f
|
||||
bl .restore_interrupts
|
||||
|
|
|
@ -768,8 +768,8 @@ alignment_common:
|
|||
std r3,_DAR(r1)
|
||||
std r4,_DSISR(r1)
|
||||
bl .save_nvgprs
|
||||
DISABLE_INTS
|
||||
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||
ENABLE_INTS
|
||||
bl .alignment_exception
|
||||
b .ret_from_except
|
||||
|
||||
|
|
|
@ -229,6 +229,19 @@ notrace void arch_local_irq_restore(unsigned long en)
|
|||
*/
|
||||
if (unlikely(irq_happened != PACA_IRQ_HARD_DIS))
|
||||
__hard_irq_disable();
|
||||
#ifdef CONFIG_TRACE_IRQFLAG
|
||||
else {
|
||||
/*
|
||||
* We should already be hard disabled here. We had bugs
|
||||
* where that wasn't the case so let's dbl check it and
|
||||
* warn if we are wrong. Only do that when IRQ tracing
|
||||
* is enabled as mfmsr() can be costly.
|
||||
*/
|
||||
if (WARN_ON(mfmsr() & MSR_EE))
|
||||
__hard_irq_disable();
|
||||
}
|
||||
#endif /* CONFIG_TRACE_IRQFLAG */
|
||||
|
||||
set_soft_enabled(0);
|
||||
|
||||
/*
|
||||
|
@ -260,11 +273,17 @@ EXPORT_SYMBOL(arch_local_irq_restore);
|
|||
* if they are currently disabled. This is typically called before
|
||||
* schedule() or do_signal() when returning to userspace. We do it
|
||||
* in C to avoid the burden of dealing with lockdep etc...
|
||||
*
|
||||
* NOTE: This is called with interrupts hard disabled but not marked
|
||||
* as such in paca->irq_happened, so we need to resync this.
|
||||
*/
|
||||
void restore_interrupts(void)
|
||||
{
|
||||
if (irqs_disabled())
|
||||
if (irqs_disabled()) {
|
||||
local_paca->irq_happened |= PACA_IRQ_HARD_DIS;
|
||||
local_irq_enable();
|
||||
} else
|
||||
__hard_irq_enable();
|
||||
}
|
||||
|
||||
#endif /* CONFIG_PPC64 */
|
||||
|
|
|
@ -248,7 +248,7 @@ void _exception(int signr, struct pt_regs *regs, int code, unsigned long addr)
|
|||
addr, regs->nip, regs->link, code);
|
||||
}
|
||||
|
||||
if (!arch_irq_disabled_regs(regs))
|
||||
if (arch_irqs_disabled() && !arch_irq_disabled_regs(regs))
|
||||
local_irq_enable();
|
||||
|
||||
memset(&info, 0, sizeof(info));
|
||||
|
@ -1019,7 +1019,9 @@ void __kprobes program_check_exception(struct pt_regs *regs)
|
|||
return;
|
||||
}
|
||||
|
||||
local_irq_enable();
|
||||
/* We restore the interrupt state now */
|
||||
if (!arch_irq_disabled_regs(regs))
|
||||
local_irq_enable();
|
||||
|
||||
#ifdef CONFIG_MATH_EMULATION
|
||||
/* (reason & REASON_ILLEGAL) would be the obvious thing here,
|
||||
|
@ -1069,6 +1071,10 @@ void alignment_exception(struct pt_regs *regs)
|
|||
{
|
||||
int sig, code, fixed = 0;
|
||||
|
||||
/* We restore the interrupt state now */
|
||||
if (!arch_irq_disabled_regs(regs))
|
||||
local_irq_enable();
|
||||
|
||||
/* we don't implement logging of alignment exceptions */
|
||||
if (!(current->thread.align_ctl & PR_UNALIGN_SIGBUS))
|
||||
fixed = fix_alignment(regs);
|
||||
|
|
|
@ -194,14 +194,14 @@ static struct kvmppc_sid_map *create_sid_map(struct kvm_vcpu *vcpu, u64 gvsid)
|
|||
backwards_map = !backwards_map;
|
||||
|
||||
/* Uh-oh ... out of mappings. Let's flush! */
|
||||
if (vcpu_book3s->vsid_next == vcpu_book3s->vsid_max) {
|
||||
vcpu_book3s->vsid_next = vcpu_book3s->vsid_first;
|
||||
if (vcpu_book3s->proto_vsid_next == vcpu_book3s->proto_vsid_max) {
|
||||
vcpu_book3s->proto_vsid_next = vcpu_book3s->proto_vsid_first;
|
||||
memset(vcpu_book3s->sid_map, 0,
|
||||
sizeof(struct kvmppc_sid_map) * SID_MAP_NUM);
|
||||
kvmppc_mmu_pte_flush(vcpu, 0, 0);
|
||||
kvmppc_mmu_flush_segments(vcpu);
|
||||
}
|
||||
map->host_vsid = vcpu_book3s->vsid_next++;
|
||||
map->host_vsid = vsid_scramble(vcpu_book3s->proto_vsid_next++, 256M);
|
||||
|
||||
map->guest_vsid = gvsid;
|
||||
map->valid = true;
|
||||
|
@ -319,9 +319,10 @@ int kvmppc_mmu_init(struct kvm_vcpu *vcpu)
|
|||
return -1;
|
||||
vcpu3s->context_id[0] = err;
|
||||
|
||||
vcpu3s->vsid_max = ((vcpu3s->context_id[0] + 1) << USER_ESID_BITS) - 1;
|
||||
vcpu3s->vsid_first = vcpu3s->context_id[0] << USER_ESID_BITS;
|
||||
vcpu3s->vsid_next = vcpu3s->vsid_first;
|
||||
vcpu3s->proto_vsid_max = ((vcpu3s->context_id[0] + 1)
|
||||
<< USER_ESID_BITS) - 1;
|
||||
vcpu3s->proto_vsid_first = vcpu3s->context_id[0] << USER_ESID_BITS;
|
||||
vcpu3s->proto_vsid_next = vcpu3s->proto_vsid_first;
|
||||
|
||||
kvmppc_mmu_hpte_init(vcpu);
|
||||
|
||||
|
|
|
@ -258,6 +258,8 @@ static long kvmppc_get_guest_page(struct kvm *kvm, unsigned long gfn,
|
|||
!(memslot->userspace_addr & (s - 1))) {
|
||||
start &= ~(s - 1);
|
||||
pgsize = s;
|
||||
get_page(hpage);
|
||||
put_page(page);
|
||||
page = hpage;
|
||||
}
|
||||
}
|
||||
|
@ -281,11 +283,8 @@ static long kvmppc_get_guest_page(struct kvm *kvm, unsigned long gfn,
|
|||
err = 0;
|
||||
|
||||
out:
|
||||
if (got) {
|
||||
if (PageHuge(page))
|
||||
page = compound_head(page);
|
||||
if (got)
|
||||
put_page(page);
|
||||
}
|
||||
return err;
|
||||
|
||||
up_err:
|
||||
|
@ -678,8 +677,15 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu,
|
|||
SetPageDirty(page);
|
||||
|
||||
out_put:
|
||||
if (page)
|
||||
put_page(page);
|
||||
if (page) {
|
||||
/*
|
||||
* We drop pages[0] here, not page because page might
|
||||
* have been set to the head page of a compound, but
|
||||
* we have to drop the reference on the correct tail
|
||||
* page to match the get inside gup()
|
||||
*/
|
||||
put_page(pages[0]);
|
||||
}
|
||||
return ret;
|
||||
|
||||
out_unlock:
|
||||
|
@ -979,6 +985,7 @@ void *kvmppc_pin_guest_page(struct kvm *kvm, unsigned long gpa,
|
|||
pa = *physp;
|
||||
}
|
||||
page = pfn_to_page(pa >> PAGE_SHIFT);
|
||||
get_page(page);
|
||||
} else {
|
||||
hva = gfn_to_hva_memslot(memslot, gfn);
|
||||
npages = get_user_pages_fast(hva, 1, 1, pages);
|
||||
|
@ -991,8 +998,6 @@ void *kvmppc_pin_guest_page(struct kvm *kvm, unsigned long gpa,
|
|||
page = compound_head(page);
|
||||
psize <<= compound_order(page);
|
||||
}
|
||||
if (!kvm->arch.using_mmu_notifiers)
|
||||
get_page(page);
|
||||
offset = gpa & (psize - 1);
|
||||
if (nb_ret)
|
||||
*nb_ret = psize - offset;
|
||||
|
@ -1003,7 +1008,6 @@ void kvmppc_unpin_guest_page(struct kvm *kvm, void *va)
|
|||
{
|
||||
struct page *page = virt_to_page(va);
|
||||
|
||||
page = compound_head(page);
|
||||
put_page(page);
|
||||
}
|
||||
|
||||
|
|
|
@ -1192,8 +1192,6 @@ static void unpin_slot(struct kvm *kvm, int slot_id)
|
|||
continue;
|
||||
pfn = physp[j] >> PAGE_SHIFT;
|
||||
page = pfn_to_page(pfn);
|
||||
if (PageHuge(page))
|
||||
page = compound_head(page);
|
||||
SetPageDirty(page);
|
||||
put_page(page);
|
||||
}
|
||||
|
|
|
@ -463,6 +463,7 @@ long kvmppc_h_bulk_remove(struct kvm_vcpu *vcpu)
|
|||
/* insert R and C bits from PTE */
|
||||
rcbits = rev->guest_rpte & (HPTE_R_R|HPTE_R_C);
|
||||
args[j] |= rcbits << (56 - 5);
|
||||
hp[0] = 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
|
@ -197,7 +197,8 @@ kvmppc_interrupt:
|
|||
/* Save guest PC and MSR */
|
||||
#ifdef CONFIG_PPC64
|
||||
BEGIN_FTR_SECTION
|
||||
andi. r0,r12,0x2
|
||||
andi. r0, r12, 0x2
|
||||
cmpwi cr1, r0, 0
|
||||
beq 1f
|
||||
mfspr r3,SPRN_HSRR0
|
||||
mfspr r4,SPRN_HSRR1
|
||||
|
@ -250,6 +251,12 @@ END_FTR_SECTION_IFSET(CPU_FTR_HVMODE)
|
|||
beq ld_last_prev_inst
|
||||
cmpwi r12, BOOK3S_INTERRUPT_ALIGNMENT
|
||||
beq- ld_last_inst
|
||||
#ifdef CONFIG_PPC64
|
||||
BEGIN_FTR_SECTION
|
||||
cmpwi r12, BOOK3S_INTERRUPT_H_EMUL_ASSIST
|
||||
beq- ld_last_inst
|
||||
END_FTR_SECTION_IFSET(CPU_FTR_HVMODE)
|
||||
#endif
|
||||
|
||||
b no_ld_last_inst
|
||||
|
||||
|
@ -316,23 +323,17 @@ no_dcbz32_off:
|
|||
* Having set up SRR0/1 with the address where we want
|
||||
* to continue with relocation on (potentially in module
|
||||
* space), we either just go straight there with rfi[d],
|
||||
* or we jump to an interrupt handler with bctr if there
|
||||
* is an interrupt to be handled first. In the latter
|
||||
* case, the rfi[d] at the end of the interrupt handler
|
||||
* will get us back to where we want to continue.
|
||||
* or we jump to an interrupt handler if there is an
|
||||
* interrupt to be handled first. In the latter case,
|
||||
* the rfi[d] at the end of the interrupt handler will
|
||||
* get us back to where we want to continue.
|
||||
*/
|
||||
|
||||
cmpwi r12, BOOK3S_INTERRUPT_EXTERNAL
|
||||
beq 1f
|
||||
cmpwi r12, BOOK3S_INTERRUPT_DECREMENTER
|
||||
beq 1f
|
||||
cmpwi r12, BOOK3S_INTERRUPT_PERFMON
|
||||
1: mtctr r12
|
||||
|
||||
/* Register usage at this point:
|
||||
*
|
||||
* R1 = host R1
|
||||
* R2 = host R2
|
||||
* R10 = raw exit handler id
|
||||
* R12 = exit handler id
|
||||
* R13 = shadow vcpu (32-bit) or PACA (64-bit)
|
||||
* SVCPU.* = guest *
|
||||
|
@ -342,12 +343,25 @@ no_dcbz32_off:
|
|||
PPC_LL r6, HSTATE_HOST_MSR(r13)
|
||||
PPC_LL r8, HSTATE_VMHANDLER(r13)
|
||||
|
||||
/* Restore host msr -> SRR1 */
|
||||
#ifdef CONFIG_PPC64
|
||||
BEGIN_FTR_SECTION
|
||||
beq cr1, 1f
|
||||
mtspr SPRN_HSRR1, r6
|
||||
mtspr SPRN_HSRR0, r8
|
||||
END_FTR_SECTION_IFSET(CPU_FTR_HVMODE)
|
||||
#endif
|
||||
1: /* Restore host msr -> SRR1 */
|
||||
mtsrr1 r6
|
||||
/* Load highmem handler address */
|
||||
mtsrr0 r8
|
||||
|
||||
/* RFI into the highmem handler, or jump to interrupt handler */
|
||||
beqctr
|
||||
cmpwi r12, BOOK3S_INTERRUPT_EXTERNAL
|
||||
beqa BOOK3S_INTERRUPT_EXTERNAL
|
||||
cmpwi r12, BOOK3S_INTERRUPT_DECREMENTER
|
||||
beqa BOOK3S_INTERRUPT_DECREMENTER
|
||||
cmpwi r12, BOOK3S_INTERRUPT_PERFMON
|
||||
beqa BOOK3S_INTERRUPT_PERFMON
|
||||
|
||||
RFI
|
||||
kvmppc_handler_trampoline_exit_end:
|
||||
|
|
|
@ -269,4 +269,4 @@ static int __init sunfire_init(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
subsys_initcall(sunfire_init);
|
||||
fs_initcall(sunfire_init);
|
||||
|
|
|
@ -495,11 +495,11 @@ xcall_fetch_glob_regs:
|
|||
stx %o7, [%g1 + GR_SNAP_O7]
|
||||
stx %i7, [%g1 + GR_SNAP_I7]
|
||||
/* Don't try this at home kids... */
|
||||
rdpr %cwp, %g2
|
||||
sub %g2, 1, %g7
|
||||
rdpr %cwp, %g3
|
||||
sub %g3, 1, %g7
|
||||
wrpr %g7, %cwp
|
||||
mov %i7, %g7
|
||||
wrpr %g2, %cwp
|
||||
wrpr %g3, %cwp
|
||||
stx %g7, [%g1 + GR_SNAP_RPC]
|
||||
sethi %hi(trap_block), %g7
|
||||
or %g7, %lo(trap_block), %g7
|
||||
|
|
|
@ -100,9 +100,14 @@ extern void cpu_idle_on_new_stack(struct thread_info *old_ti,
|
|||
|
||||
#else /* __ASSEMBLY__ */
|
||||
|
||||
/* how to get the thread information struct from ASM */
|
||||
/*
|
||||
* How to get the thread information struct from assembly.
|
||||
* Note that we use different macros since different architectures
|
||||
* have different semantics in their "mm" instruction and we would
|
||||
* like to guarantee that the macro expands to exactly one instruction.
|
||||
*/
|
||||
#ifdef __tilegx__
|
||||
#define GET_THREAD_INFO(reg) move reg, sp; mm reg, zero, LOG2_THREAD_SIZE, 63
|
||||
#define EXTRACT_THREAD_INFO(reg) mm reg, zero, LOG2_THREAD_SIZE, 63
|
||||
#else
|
||||
#define GET_THREAD_INFO(reg) mm reg, sp, zero, LOG2_THREAD_SIZE, 31
|
||||
#endif
|
||||
|
|
|
@ -403,19 +403,17 @@ int compat_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
|
|||
* Set up registers for signal handler.
|
||||
* Registers that we don't modify keep the value they had from
|
||||
* user-space at the time we took the signal.
|
||||
* We always pass siginfo and mcontext, regardless of SA_SIGINFO,
|
||||
* since some things rely on this (e.g. glibc's debug/segfault.c).
|
||||
*/
|
||||
regs->pc = ptr_to_compat_reg(ka->sa.sa_handler);
|
||||
regs->ex1 = PL_ICS_EX1(USER_PL, 1); /* set crit sec in handler */
|
||||
regs->sp = ptr_to_compat_reg(frame);
|
||||
regs->lr = restorer;
|
||||
regs->regs[0] = (unsigned long) usig;
|
||||
|
||||
if (ka->sa.sa_flags & SA_SIGINFO) {
|
||||
/* Need extra arguments, so mark to restore caller-saves. */
|
||||
regs->regs[1] = ptr_to_compat_reg(&frame->info);
|
||||
regs->regs[2] = ptr_to_compat_reg(&frame->uc);
|
||||
regs->flags |= PT_FLAGS_CALLER_SAVES;
|
||||
}
|
||||
regs->regs[1] = ptr_to_compat_reg(&frame->info);
|
||||
regs->regs[2] = ptr_to_compat_reg(&frame->uc);
|
||||
regs->flags |= PT_FLAGS_CALLER_SAVES;
|
||||
|
||||
/*
|
||||
* Notify any tracer that was single-stepping it.
|
||||
|
|
|
@ -838,6 +838,18 @@ STD_ENTRY(interrupt_return)
|
|||
.Lresume_userspace:
|
||||
FEEDBACK_REENTER(interrupt_return)
|
||||
|
||||
/*
|
||||
* Use r33 to hold whether we have already loaded the callee-saves
|
||||
* into ptregs. We don't want to do it twice in this loop, since
|
||||
* then we'd clobber whatever changes are made by ptrace, etc.
|
||||
* Get base of stack in r32.
|
||||
*/
|
||||
{
|
||||
GET_THREAD_INFO(r32)
|
||||
movei r33, 0
|
||||
}
|
||||
|
||||
.Lretry_work_pending:
|
||||
/*
|
||||
* Disable interrupts so as to make sure we don't
|
||||
* miss an interrupt that sets any of the thread flags (like
|
||||
|
@ -848,9 +860,6 @@ STD_ENTRY(interrupt_return)
|
|||
IRQ_DISABLE(r20, r21)
|
||||
TRACE_IRQS_OFF /* Note: clobbers registers r0-r29 */
|
||||
|
||||
/* Get base of stack in r32; note r30/31 are used as arguments here. */
|
||||
GET_THREAD_INFO(r32)
|
||||
|
||||
|
||||
/* Check to see if there is any work to do before returning to user. */
|
||||
{
|
||||
|
@ -866,16 +875,18 @@ STD_ENTRY(interrupt_return)
|
|||
|
||||
/*
|
||||
* Make sure we have all the registers saved for signal
|
||||
* handling or single-step. Call out to C code to figure out
|
||||
* exactly what we need to do for each flag bit, then if
|
||||
* necessary, reload the flags and recheck.
|
||||
* handling, notify-resume, or single-step. Call out to C
|
||||
* code to figure out exactly what we need to do for each flag bit,
|
||||
* then if necessary, reload the flags and recheck.
|
||||
*/
|
||||
push_extra_callee_saves r0
|
||||
{
|
||||
PTREGS_PTR(r0, PTREGS_OFFSET_BASE)
|
||||
jal do_work_pending
|
||||
bnz r33, 1f
|
||||
}
|
||||
bnz r0, .Lresume_userspace
|
||||
push_extra_callee_saves r0
|
||||
movei r33, 1
|
||||
1: jal do_work_pending
|
||||
bnz r0, .Lretry_work_pending
|
||||
|
||||
/*
|
||||
* In the NMI case we
|
||||
|
@ -1180,10 +1191,12 @@ handle_syscall:
|
|||
add r20, r20, tp
|
||||
lw r21, r20
|
||||
addi r21, r21, 1
|
||||
sw r20, r21
|
||||
{
|
||||
sw r20, r21
|
||||
GET_THREAD_INFO(r31)
|
||||
}
|
||||
|
||||
/* Trace syscalls, if requested. */
|
||||
GET_THREAD_INFO(r31)
|
||||
addi r31, r31, THREAD_INFO_FLAGS_OFFSET
|
||||
lw r30, r31
|
||||
andi r30, r30, _TIF_SYSCALL_TRACE
|
||||
|
@ -1362,7 +1375,10 @@ handle_ill:
|
|||
3:
|
||||
/* set PC and continue */
|
||||
lw r26, r24
|
||||
sw r28, r26
|
||||
{
|
||||
sw r28, r26
|
||||
GET_THREAD_INFO(r0)
|
||||
}
|
||||
|
||||
/*
|
||||
* Clear TIF_SINGLESTEP to prevent recursion if we execute an ill.
|
||||
|
@ -1370,7 +1386,6 @@ handle_ill:
|
|||
* need to clear it here and can't really impose on all other arches.
|
||||
* So what's another write between friends?
|
||||
*/
|
||||
GET_THREAD_INFO(r0)
|
||||
|
||||
addi r1, r0, THREAD_INFO_FLAGS_OFFSET
|
||||
{
|
||||
|
|
|
@ -646,6 +646,20 @@ STD_ENTRY(interrupt_return)
|
|||
.Lresume_userspace:
|
||||
FEEDBACK_REENTER(interrupt_return)
|
||||
|
||||
/*
|
||||
* Use r33 to hold whether we have already loaded the callee-saves
|
||||
* into ptregs. We don't want to do it twice in this loop, since
|
||||
* then we'd clobber whatever changes are made by ptrace, etc.
|
||||
*/
|
||||
{
|
||||
movei r33, 0
|
||||
move r32, sp
|
||||
}
|
||||
|
||||
/* Get base of stack in r32. */
|
||||
EXTRACT_THREAD_INFO(r32)
|
||||
|
||||
.Lretry_work_pending:
|
||||
/*
|
||||
* Disable interrupts so as to make sure we don't
|
||||
* miss an interrupt that sets any of the thread flags (like
|
||||
|
@ -656,9 +670,6 @@ STD_ENTRY(interrupt_return)
|
|||
IRQ_DISABLE(r20, r21)
|
||||
TRACE_IRQS_OFF /* Note: clobbers registers r0-r29 */
|
||||
|
||||
/* Get base of stack in r32; note r30/31 are used as arguments here. */
|
||||
GET_THREAD_INFO(r32)
|
||||
|
||||
|
||||
/* Check to see if there is any work to do before returning to user. */
|
||||
{
|
||||
|
@ -674,16 +685,18 @@ STD_ENTRY(interrupt_return)
|
|||
|
||||
/*
|
||||
* Make sure we have all the registers saved for signal
|
||||
* handling or single-step. Call out to C code to figure out
|
||||
* handling or notify-resume. Call out to C code to figure out
|
||||
* exactly what we need to do for each flag bit, then if
|
||||
* necessary, reload the flags and recheck.
|
||||
*/
|
||||
push_extra_callee_saves r0
|
||||
{
|
||||
PTREGS_PTR(r0, PTREGS_OFFSET_BASE)
|
||||
jal do_work_pending
|
||||
bnez r33, 1f
|
||||
}
|
||||
bnez r0, .Lresume_userspace
|
||||
push_extra_callee_saves r0
|
||||
movei r33, 1
|
||||
1: jal do_work_pending
|
||||
bnez r0, .Lretry_work_pending
|
||||
|
||||
/*
|
||||
* In the NMI case we
|
||||
|
@ -968,11 +981,16 @@ handle_syscall:
|
|||
shl16insli r20, r20, hw0(irq_stat + IRQ_CPUSTAT_SYSCALL_COUNT_OFFSET)
|
||||
add r20, r20, tp
|
||||
ld4s r21, r20
|
||||
addi r21, r21, 1
|
||||
st4 r20, r21
|
||||
{
|
||||
addi r21, r21, 1
|
||||
move r31, sp
|
||||
}
|
||||
{
|
||||
st4 r20, r21
|
||||
EXTRACT_THREAD_INFO(r31)
|
||||
}
|
||||
|
||||
/* Trace syscalls, if requested. */
|
||||
GET_THREAD_INFO(r31)
|
||||
addi r31, r31, THREAD_INFO_FLAGS_OFFSET
|
||||
ld r30, r31
|
||||
andi r30, r30, _TIF_SYSCALL_TRACE
|
||||
|
|
|
@ -567,6 +567,10 @@ struct task_struct *__sched _switch_to(struct task_struct *prev,
|
|||
*/
|
||||
int do_work_pending(struct pt_regs *regs, u32 thread_info_flags)
|
||||
{
|
||||
/* If we enter in kernel mode, do nothing and exit the caller loop. */
|
||||
if (!user_mode(regs))
|
||||
return 0;
|
||||
|
||||
if (thread_info_flags & _TIF_NEED_RESCHED) {
|
||||
schedule();
|
||||
return 1;
|
||||
|
@ -589,8 +593,7 @@ int do_work_pending(struct pt_regs *regs, u32 thread_info_flags)
|
|||
return 1;
|
||||
}
|
||||
if (thread_info_flags & _TIF_SINGLESTEP) {
|
||||
if ((regs->ex1 & SPR_EX_CONTEXT_1_1__PL_MASK) == 0)
|
||||
single_step_once(regs);
|
||||
single_step_once(regs);
|
||||
return 0;
|
||||
}
|
||||
panic("work_pending: bad flags %#x\n", thread_info_flags);
|
||||
|
|
|
@ -81,7 +81,7 @@ config X86
|
|||
select CLKEVT_I8253
|
||||
select ARCH_HAVE_NMI_SAFE_CMPXCHG
|
||||
select GENERIC_IOMAP
|
||||
select DCACHE_WORD_ACCESS if !DEBUG_PAGEALLOC
|
||||
select DCACHE_WORD_ACCESS
|
||||
|
||||
config INSTRUCTION_DECODER
|
||||
def_bool (KPROBES || PERF_EVENTS)
|
||||
|
|
|
@ -403,13 +403,11 @@ static void print_absolute_symbols(void)
|
|||
for (i = 0; i < ehdr.e_shnum; i++) {
|
||||
struct section *sec = &secs[i];
|
||||
char *sym_strtab;
|
||||
Elf32_Sym *sh_symtab;
|
||||
int j;
|
||||
|
||||
if (sec->shdr.sh_type != SHT_SYMTAB) {
|
||||
continue;
|
||||
}
|
||||
sh_symtab = sec->symtab;
|
||||
sym_strtab = sec->link->strtab;
|
||||
for (j = 0; j < sec->shdr.sh_size/sizeof(Elf32_Sym); j++) {
|
||||
Elf32_Sym *sym;
|
||||
|
|
|
@ -294,8 +294,7 @@ static int load_aout_binary(struct linux_binprm *bprm, struct pt_regs *regs)
|
|||
|
||||
/* OK, This is the point of no return */
|
||||
set_personality(PER_LINUX);
|
||||
set_thread_flag(TIF_IA32);
|
||||
current->mm->context.ia32_compat = 1;
|
||||
set_personality_ia32(false);
|
||||
|
||||
setup_new_exec(bprm);
|
||||
|
||||
|
|
|
@ -43,4 +43,37 @@ static inline unsigned long has_zero(unsigned long a)
|
|||
return ((a - REPEAT_BYTE(0x01)) & ~a) & REPEAT_BYTE(0x80);
|
||||
}
|
||||
|
||||
/*
|
||||
* Load an unaligned word from kernel space.
|
||||
*
|
||||
* In the (very unlikely) case of the word being a page-crosser
|
||||
* and the next page not being mapped, take the exception and
|
||||
* return zeroes in the non-existing part.
|
||||
*/
|
||||
static inline unsigned long load_unaligned_zeropad(const void *addr)
|
||||
{
|
||||
unsigned long ret, dummy;
|
||||
|
||||
asm(
|
||||
"1:\tmov %2,%0\n"
|
||||
"2:\n"
|
||||
".section .fixup,\"ax\"\n"
|
||||
"3:\t"
|
||||
"lea %2,%1\n\t"
|
||||
"and %3,%1\n\t"
|
||||
"mov (%1),%0\n\t"
|
||||
"leal %2,%%ecx\n\t"
|
||||
"andl %4,%%ecx\n\t"
|
||||
"shll $3,%%ecx\n\t"
|
||||
"shr %%cl,%0\n\t"
|
||||
"jmp 2b\n"
|
||||
".previous\n"
|
||||
_ASM_EXTABLE(1b, 3b)
|
||||
:"=&r" (ret),"=&c" (dummy)
|
||||
:"m" (*(unsigned long *)addr),
|
||||
"i" (-sizeof(unsigned long)),
|
||||
"i" (sizeof(unsigned long)-1));
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif /* _ASM_WORD_AT_A_TIME_H */
|
||||
|
|
|
@ -580,6 +580,24 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c)
|
|||
}
|
||||
}
|
||||
|
||||
/* re-enable TopologyExtensions if switched off by BIOS */
|
||||
if ((c->x86 == 0x15) &&
|
||||
(c->x86_model >= 0x10) && (c->x86_model <= 0x1f) &&
|
||||
!cpu_has(c, X86_FEATURE_TOPOEXT)) {
|
||||
u64 val;
|
||||
|
||||
if (!rdmsrl_amd_safe(0xc0011005, &val)) {
|
||||
val |= 1ULL << 54;
|
||||
wrmsrl_amd_safe(0xc0011005, val);
|
||||
rdmsrl(0xc0011005, val);
|
||||
if (val & (1ULL << 54)) {
|
||||
set_cpu_cap(c, X86_FEATURE_TOPOEXT);
|
||||
printk(KERN_INFO FW_INFO "CPU: Re-enabling "
|
||||
"disabled Topology Extensions Support\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
cpu_detect_cache_sizes(c);
|
||||
|
||||
/* Multi core CPU? */
|
||||
|
|
|
@ -79,7 +79,6 @@ struct kvm_task_sleep_node {
|
|||
u32 token;
|
||||
int cpu;
|
||||
bool halted;
|
||||
struct mm_struct *mm;
|
||||
};
|
||||
|
||||
static struct kvm_task_sleep_head {
|
||||
|
@ -126,9 +125,7 @@ void kvm_async_pf_task_wait(u32 token)
|
|||
|
||||
n.token = token;
|
||||
n.cpu = smp_processor_id();
|
||||
n.mm = current->active_mm;
|
||||
n.halted = idle || preempt_count() > 1;
|
||||
atomic_inc(&n.mm->mm_count);
|
||||
init_waitqueue_head(&n.wq);
|
||||
hlist_add_head(&n.link, &b->list);
|
||||
spin_unlock(&b->lock);
|
||||
|
@ -161,9 +158,6 @@ EXPORT_SYMBOL_GPL(kvm_async_pf_task_wait);
|
|||
static void apf_task_wake_one(struct kvm_task_sleep_node *n)
|
||||
{
|
||||
hlist_del_init(&n->link);
|
||||
if (!n->mm)
|
||||
return;
|
||||
mmdrop(n->mm);
|
||||
if (n->halted)
|
||||
smp_send_reschedule(n->cpu);
|
||||
else if (waitqueue_active(&n->wq))
|
||||
|
@ -207,7 +201,7 @@ again:
|
|||
* async PF was not yet handled.
|
||||
* Add dummy entry for the token.
|
||||
*/
|
||||
n = kmalloc(sizeof(*n), GFP_ATOMIC);
|
||||
n = kzalloc(sizeof(*n), GFP_ATOMIC);
|
||||
if (!n) {
|
||||
/*
|
||||
* Allocation failed! Busy wait while other cpu
|
||||
|
@ -219,7 +213,6 @@ again:
|
|||
}
|
||||
n->token = token;
|
||||
n->cpu = smp_processor_id();
|
||||
n->mm = NULL;
|
||||
init_waitqueue_head(&n->wq);
|
||||
hlist_add_head(&n->link, &b->list);
|
||||
} else
|
||||
|
|
|
@ -423,6 +423,7 @@ void set_personality_ia32(bool x32)
|
|||
current_thread_info()->status |= TS_COMPAT;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(set_personality_ia32);
|
||||
|
||||
unsigned long get_wchan(struct task_struct *p)
|
||||
{
|
||||
|
|
|
@ -185,10 +185,22 @@ void __init setup_per_cpu_areas(void)
|
|||
#endif
|
||||
rc = -EINVAL;
|
||||
if (pcpu_chosen_fc != PCPU_FC_PAGE) {
|
||||
const size_t atom_size = cpu_has_pse ? PMD_SIZE : PAGE_SIZE;
|
||||
const size_t dyn_size = PERCPU_MODULE_RESERVE +
|
||||
PERCPU_DYNAMIC_RESERVE - PERCPU_FIRST_CHUNK_RESERVE;
|
||||
size_t atom_size;
|
||||
|
||||
/*
|
||||
* On 64bit, use PMD_SIZE for atom_size so that embedded
|
||||
* percpu areas are aligned to PMD. This, in the future,
|
||||
* can also allow using PMD mappings in vmalloc area. Use
|
||||
* PAGE_SIZE on 32bit as vmalloc space is highly contended
|
||||
* and large vmalloc area allocs can easily fail.
|
||||
*/
|
||||
#ifdef CONFIG_X86_64
|
||||
atom_size = PMD_SIZE;
|
||||
#else
|
||||
atom_size = PAGE_SIZE;
|
||||
#endif
|
||||
rc = pcpu_embed_first_chunk(PERCPU_FIRST_CHUNK_RESERVE,
|
||||
dyn_size, atom_size,
|
||||
pcpu_cpu_distance,
|
||||
|
|
|
@ -6581,6 +6581,7 @@ void kvm_arch_async_page_present(struct kvm_vcpu *vcpu,
|
|||
kvm_inject_page_fault(vcpu, &fault);
|
||||
}
|
||||
vcpu->arch.apf.halted = false;
|
||||
vcpu->arch.mp_state = KVM_MP_STATE_RUNNABLE;
|
||||
}
|
||||
|
||||
bool kvm_arch_can_inject_async_page_present(struct kvm_vcpu *vcpu)
|
||||
|
|
|
@ -63,7 +63,7 @@ static struct gpio_led net5501_leds[] = {
|
|||
.name = "net5501:1",
|
||||
.gpio = 6,
|
||||
.default_trigger = "default-on",
|
||||
.active_low = 1,
|
||||
.active_low = 0,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -63,6 +63,7 @@
|
|||
#include <asm/stackprotector.h>
|
||||
#include <asm/hypervisor.h>
|
||||
#include <asm/mwait.h>
|
||||
#include <asm/pci_x86.h>
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
#include <linux/acpi.h>
|
||||
|
@ -809,9 +810,40 @@ static void xen_io_delay(void)
|
|||
}
|
||||
|
||||
#ifdef CONFIG_X86_LOCAL_APIC
|
||||
static unsigned long xen_set_apic_id(unsigned int x)
|
||||
{
|
||||
WARN_ON(1);
|
||||
return x;
|
||||
}
|
||||
static unsigned int xen_get_apic_id(unsigned long x)
|
||||
{
|
||||
return ((x)>>24) & 0xFFu;
|
||||
}
|
||||
static u32 xen_apic_read(u32 reg)
|
||||
{
|
||||
return 0;
|
||||
struct xen_platform_op op = {
|
||||
.cmd = XENPF_get_cpuinfo,
|
||||
.interface_version = XENPF_INTERFACE_VERSION,
|
||||
.u.pcpu_info.xen_cpuid = 0,
|
||||
};
|
||||
int ret = 0;
|
||||
|
||||
/* Shouldn't need this as APIC is turned off for PV, and we only
|
||||
* get called on the bootup processor. But just in case. */
|
||||
if (!xen_initial_domain() || smp_processor_id())
|
||||
return 0;
|
||||
|
||||
if (reg == APIC_LVR)
|
||||
return 0x10;
|
||||
|
||||
if (reg != APIC_ID)
|
||||
return 0;
|
||||
|
||||
ret = HYPERVISOR_dom0_op(&op);
|
||||
if (ret)
|
||||
return 0;
|
||||
|
||||
return op.u.pcpu_info.apic_id << 24;
|
||||
}
|
||||
|
||||
static void xen_apic_write(u32 reg, u32 val)
|
||||
|
@ -849,6 +881,8 @@ static void set_xen_basic_apic_ops(void)
|
|||
apic->icr_write = xen_apic_icr_write;
|
||||
apic->wait_icr_idle = xen_apic_wait_icr_idle;
|
||||
apic->safe_wait_icr_idle = xen_safe_apic_wait_icr_idle;
|
||||
apic->set_apic_id = xen_set_apic_id;
|
||||
apic->get_apic_id = xen_get_apic_id;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -1365,8 +1399,10 @@ asmlinkage void __init xen_start_kernel(void)
|
|||
/* Make sure ACS will be enabled */
|
||||
pci_request_acs();
|
||||
}
|
||||
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
/* PCI BIOS service won't work from a PV guest. */
|
||||
pci_probe &= ~PCI_PROBE_BIOS;
|
||||
#endif
|
||||
xen_raw_console_write("about to get started...\n");
|
||||
|
||||
xen_setup_runstate_info(0);
|
||||
|
|
|
@ -353,8 +353,13 @@ static pteval_t pte_mfn_to_pfn(pteval_t val)
|
|||
{
|
||||
if (val & _PAGE_PRESENT) {
|
||||
unsigned long mfn = (val & PTE_PFN_MASK) >> PAGE_SHIFT;
|
||||
unsigned long pfn = mfn_to_pfn(mfn);
|
||||
|
||||
pteval_t flags = val & PTE_FLAGS_MASK;
|
||||
val = ((pteval_t)mfn_to_pfn(mfn) << PAGE_SHIFT) | flags;
|
||||
if (unlikely(pfn == ~0))
|
||||
val = flags & ~_PAGE_PRESENT;
|
||||
else
|
||||
val = ((pteval_t)pfn << PAGE_SHIFT) | flags;
|
||||
}
|
||||
|
||||
return val;
|
||||
|
|
|
@ -631,7 +631,7 @@ int acpi_power_get_inferred_state(struct acpi_device *device, int *state)
|
|||
* We know a device's inferred power state when all the resources
|
||||
* required for a given D-state are 'on'.
|
||||
*/
|
||||
for (i = ACPI_STATE_D0; i < ACPI_STATE_D3; i++) {
|
||||
for (i = ACPI_STATE_D0; i < ACPI_STATE_D3_HOT; i++) {
|
||||
list = &device->power.states[i].resources;
|
||||
if (list->count < 1)
|
||||
continue;
|
||||
|
|
|
@ -869,7 +869,7 @@ static int acpi_bus_get_power_flags(struct acpi_device *device)
|
|||
/*
|
||||
* Enumerate supported power management states
|
||||
*/
|
||||
for (i = ACPI_STATE_D0; i <= ACPI_STATE_D3; i++) {
|
||||
for (i = ACPI_STATE_D0; i <= ACPI_STATE_D3_HOT; i++) {
|
||||
struct acpi_device_power_state *ps = &device->power.states[i];
|
||||
char object_name[5] = { '_', 'P', 'R', '0' + i, '\0' };
|
||||
|
||||
|
@ -884,21 +884,18 @@ static int acpi_bus_get_power_flags(struct acpi_device *device)
|
|||
acpi_bus_add_power_resource(ps->resources.handles[j]);
|
||||
}
|
||||
|
||||
/* The exist of _PR3 indicates D3Cold support */
|
||||
if (i == ACPI_STATE_D3) {
|
||||
status = acpi_get_handle(device->handle, object_name, &handle);
|
||||
if (ACPI_SUCCESS(status))
|
||||
device->power.states[ACPI_STATE_D3_COLD].flags.valid = 1;
|
||||
}
|
||||
|
||||
/* Evaluate "_PSx" to see if we can do explicit sets */
|
||||
object_name[2] = 'S';
|
||||
status = acpi_get_handle(device->handle, object_name, &handle);
|
||||
if (ACPI_SUCCESS(status))
|
||||
ps->flags.explicit_set = 1;
|
||||
|
||||
/* State is valid if we have some power control */
|
||||
if (ps->resources.count || ps->flags.explicit_set)
|
||||
/*
|
||||
* State is valid if there are means to put the device into it.
|
||||
* D3hot is only valid if _PR3 present.
|
||||
*/
|
||||
if (ps->resources.count ||
|
||||
(ps->flags.explicit_set && i < ACPI_STATE_D3_HOT))
|
||||
ps->flags.valid = 1;
|
||||
|
||||
ps->power = -1; /* Unknown - driver assigned */
|
||||
|
|
|
@ -775,9 +775,11 @@ int regmap_bulk_read(struct regmap *map, unsigned int reg, void *val,
|
|||
map->format.parse_val(val + i);
|
||||
} else {
|
||||
for (i = 0; i < val_count; i++) {
|
||||
ret = regmap_read(map, reg + i, val + (i * val_bytes));
|
||||
unsigned int ival;
|
||||
ret = regmap_read(map, reg + i, &ival);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
memcpy(val + (i * val_bytes), &ival, val_bytes);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -2297,7 +2297,7 @@ static void drbd_connector_callback(struct cn_msg *req, struct netlink_skb_parms
|
|||
return;
|
||||
}
|
||||
|
||||
if (!cap_raised(current_cap(), CAP_SYS_ADMIN)) {
|
||||
if (!capable(CAP_SYS_ADMIN)) {
|
||||
retcode = ERR_PERM;
|
||||
goto fail;
|
||||
}
|
||||
|
|
|
@ -965,18 +965,15 @@ static void omap_gpio_mod_init(struct gpio_bank *bank)
|
|||
}
|
||||
|
||||
_gpio_rmw(base, bank->regs->irqenable, l, bank->regs->irqenable_inv);
|
||||
_gpio_rmw(base, bank->regs->irqstatus, l,
|
||||
bank->regs->irqenable_inv == false);
|
||||
_gpio_rmw(base, bank->regs->irqenable, l, bank->regs->debounce_en != 0);
|
||||
_gpio_rmw(base, bank->regs->irqenable, l, bank->regs->ctrl != 0);
|
||||
_gpio_rmw(base, bank->regs->irqstatus, l, !bank->regs->irqenable_inv);
|
||||
if (bank->regs->debounce_en)
|
||||
_gpio_rmw(base, bank->regs->debounce_en, 0, 1);
|
||||
__raw_writel(0, base + bank->regs->debounce_en);
|
||||
|
||||
/* Save OE default value (0xffffffff) in the context */
|
||||
bank->context.oe = __raw_readl(bank->base + bank->regs->direction);
|
||||
/* Initialize interface clk ungated, module enabled */
|
||||
if (bank->regs->ctrl)
|
||||
_gpio_rmw(base, bank->regs->ctrl, 0, 1);
|
||||
__raw_writel(0, base + bank->regs->ctrl);
|
||||
}
|
||||
|
||||
static __devinit void
|
||||
|
|
|
@ -230,16 +230,12 @@ static void pch_gpio_setup(struct pch_gpio *chip)
|
|||
|
||||
static int pch_irq_type(struct irq_data *d, unsigned int type)
|
||||
{
|
||||
u32 im;
|
||||
u32 __iomem *im_reg;
|
||||
u32 ien;
|
||||
u32 im_pos;
|
||||
int ch;
|
||||
unsigned long flags;
|
||||
u32 val;
|
||||
int irq = d->irq;
|
||||
struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
|
||||
struct pch_gpio *chip = gc->private;
|
||||
u32 im, im_pos, val;
|
||||
u32 __iomem *im_reg;
|
||||
unsigned long flags;
|
||||
int ch, irq = d->irq;
|
||||
|
||||
ch = irq - chip->irq_base;
|
||||
if (irq <= chip->irq_base + 7) {
|
||||
|
@ -270,30 +266,22 @@ static int pch_irq_type(struct irq_data *d, unsigned int type)
|
|||
case IRQ_TYPE_LEVEL_LOW:
|
||||
val = PCH_LEVEL_L;
|
||||
break;
|
||||
case IRQ_TYPE_PROBE:
|
||||
goto end;
|
||||
default:
|
||||
dev_warn(chip->dev, "%s: unknown type(%dd)",
|
||||
__func__, type);
|
||||
goto end;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
/* Set interrupt mode */
|
||||
im = ioread32(im_reg) & ~(PCH_IM_MASK << (im_pos * 4));
|
||||
iowrite32(im | (val << (im_pos * 4)), im_reg);
|
||||
|
||||
/* iclr */
|
||||
iowrite32(BIT(ch), &chip->reg->iclr);
|
||||
/* And the handler */
|
||||
if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH))
|
||||
__irq_set_handler_locked(d->irq, handle_level_irq);
|
||||
else if (type & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING))
|
||||
__irq_set_handler_locked(d->irq, handle_edge_irq);
|
||||
|
||||
/* IMASKCLR */
|
||||
iowrite32(BIT(ch), &chip->reg->imaskclr);
|
||||
|
||||
/* Enable interrupt */
|
||||
ien = ioread32(&chip->reg->ien);
|
||||
iowrite32(ien | BIT(ch), &chip->reg->ien);
|
||||
end:
|
||||
unlock:
|
||||
spin_unlock_irqrestore(&chip->spinlock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -313,18 +301,24 @@ static void pch_irq_mask(struct irq_data *d)
|
|||
iowrite32(1 << (d->irq - chip->irq_base), &chip->reg->imask);
|
||||
}
|
||||
|
||||
static void pch_irq_ack(struct irq_data *d)
|
||||
{
|
||||
struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
|
||||
struct pch_gpio *chip = gc->private;
|
||||
|
||||
iowrite32(1 << (d->irq - chip->irq_base), &chip->reg->iclr);
|
||||
}
|
||||
|
||||
static irqreturn_t pch_gpio_handler(int irq, void *dev_id)
|
||||
{
|
||||
struct pch_gpio *chip = dev_id;
|
||||
u32 reg_val = ioread32(&chip->reg->istatus);
|
||||
int i;
|
||||
int ret = IRQ_NONE;
|
||||
int i, ret = IRQ_NONE;
|
||||
|
||||
for (i = 0; i < gpio_pins[chip->ioh]; i++) {
|
||||
if (reg_val & BIT(i)) {
|
||||
dev_dbg(chip->dev, "%s:[%d]:irq=%d status=0x%x\n",
|
||||
__func__, i, irq, reg_val);
|
||||
iowrite32(BIT(i), &chip->reg->iclr);
|
||||
generic_handle_irq(chip->irq_base + i);
|
||||
ret = IRQ_HANDLED;
|
||||
}
|
||||
|
@ -343,6 +337,7 @@ static __devinit void pch_gpio_alloc_generic_chip(struct pch_gpio *chip,
|
|||
gc->private = chip;
|
||||
ct = gc->chip_types;
|
||||
|
||||
ct->chip.irq_ack = pch_irq_ack;
|
||||
ct->chip.irq_mask = pch_irq_mask;
|
||||
ct->chip.irq_unmask = pch_irq_unmask;
|
||||
ct->chip.irq_set_type = pch_irq_type;
|
||||
|
@ -357,6 +352,7 @@ static int __devinit pch_gpio_probe(struct pci_dev *pdev,
|
|||
s32 ret;
|
||||
struct pch_gpio *chip;
|
||||
int irq_base;
|
||||
u32 msk;
|
||||
|
||||
chip = kzalloc(sizeof(*chip), GFP_KERNEL);
|
||||
if (chip == NULL)
|
||||
|
@ -408,8 +404,13 @@ static int __devinit pch_gpio_probe(struct pci_dev *pdev,
|
|||
}
|
||||
chip->irq_base = irq_base;
|
||||
|
||||
/* Mask all interrupts, but enable them */
|
||||
msk = (1 << gpio_pins[chip->ioh]) - 1;
|
||||
iowrite32(msk, &chip->reg->imask);
|
||||
iowrite32(msk, &chip->reg->ien);
|
||||
|
||||
ret = request_irq(pdev->irq, pch_gpio_handler,
|
||||
IRQF_SHARED, KBUILD_MODNAME, chip);
|
||||
IRQF_SHARED, KBUILD_MODNAME, chip);
|
||||
if (ret != 0) {
|
||||
dev_err(&pdev->dev,
|
||||
"%s request_irq failed\n", __func__);
|
||||
|
@ -418,8 +419,6 @@ static int __devinit pch_gpio_probe(struct pci_dev *pdev,
|
|||
|
||||
pch_gpio_alloc_generic_chip(chip, irq_base, gpio_pins[chip->ioh]);
|
||||
|
||||
/* Initialize interrupt ien register */
|
||||
iowrite32(0, &chip->reg->ien);
|
||||
end:
|
||||
return 0;
|
||||
|
||||
|
|
|
@ -452,12 +452,14 @@ static struct samsung_gpio_cfg s3c24xx_gpiocfg_banka = {
|
|||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_ARCH_EXYNOS4) || defined(CONFIG_ARCH_EXYNOS5)
|
||||
static struct samsung_gpio_cfg exynos_gpio_cfg = {
|
||||
.set_pull = exynos_gpio_setpull,
|
||||
.get_pull = exynos_gpio_getpull,
|
||||
.set_config = samsung_gpio_setcfg_4bit,
|
||||
.get_config = samsung_gpio_getcfg_4bit,
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_CPU_S5P6440) || defined(CONFIG_CPU_S5P6450)
|
||||
static struct samsung_gpio_cfg s5p64x0_gpio_cfg_rbank = {
|
||||
|
@ -2123,8 +2125,8 @@ static struct samsung_gpio_chip s5pv210_gpios_4bit[] = {
|
|||
* uses the above macro and depends on the banks being listed in order here.
|
||||
*/
|
||||
|
||||
static struct samsung_gpio_chip exynos4_gpios_1[] = {
|
||||
#ifdef CONFIG_ARCH_EXYNOS4
|
||||
static struct samsung_gpio_chip exynos4_gpios_1[] = {
|
||||
{
|
||||
.chip = {
|
||||
.base = EXYNOS4_GPA0(0),
|
||||
|
@ -2222,11 +2224,11 @@ static struct samsung_gpio_chip exynos4_gpios_1[] = {
|
|||
.label = "GPF3",
|
||||
},
|
||||
},
|
||||
#endif
|
||||
};
|
||||
#endif
|
||||
|
||||
static struct samsung_gpio_chip exynos4_gpios_2[] = {
|
||||
#ifdef CONFIG_ARCH_EXYNOS4
|
||||
static struct samsung_gpio_chip exynos4_gpios_2[] = {
|
||||
{
|
||||
.chip = {
|
||||
.base = EXYNOS4_GPJ0(0),
|
||||
|
@ -2367,11 +2369,11 @@ static struct samsung_gpio_chip exynos4_gpios_2[] = {
|
|||
.to_irq = samsung_gpiolib_to_irq,
|
||||
},
|
||||
},
|
||||
#endif
|
||||
};
|
||||
#endif
|
||||
|
||||
static struct samsung_gpio_chip exynos4_gpios_3[] = {
|
||||
#ifdef CONFIG_ARCH_EXYNOS4
|
||||
static struct samsung_gpio_chip exynos4_gpios_3[] = {
|
||||
{
|
||||
.chip = {
|
||||
.base = EXYNOS4_GPZ(0),
|
||||
|
@ -2379,8 +2381,8 @@ static struct samsung_gpio_chip exynos4_gpios_3[] = {
|
|||
.label = "GPZ",
|
||||
},
|
||||
},
|
||||
#endif
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ARCH_EXYNOS5
|
||||
static struct samsung_gpio_chip exynos5_gpios_1[] = {
|
||||
|
@ -2719,7 +2721,9 @@ static __init int samsung_gpiolib_init(void)
|
|||
{
|
||||
struct samsung_gpio_chip *chip;
|
||||
int i, nr_chips;
|
||||
#if defined(CONFIG_CPU_EXYNOS4210) || defined(CONFIG_SOC_EXYNOS5250)
|
||||
void __iomem *gpio_base1, *gpio_base2, *gpio_base3, *gpio_base4;
|
||||
#endif
|
||||
int group = 0;
|
||||
|
||||
samsung_gpiolib_set_cfg(samsung_gpio_cfgs, ARRAY_SIZE(samsung_gpio_cfgs));
|
||||
|
@ -2971,6 +2975,7 @@ static __init int samsung_gpiolib_init(void)
|
|||
|
||||
return 0;
|
||||
|
||||
#if defined(CONFIG_CPU_EXYNOS4210) || defined(CONFIG_SOC_EXYNOS5250)
|
||||
err_ioremap4:
|
||||
iounmap(gpio_base3);
|
||||
err_ioremap3:
|
||||
|
@ -2979,6 +2984,7 @@ err_ioremap2:
|
|||
iounmap(gpio_base1);
|
||||
err_ioremap1:
|
||||
return -ENOMEM;
|
||||
#endif
|
||||
}
|
||||
core_initcall(samsung_gpiolib_init);
|
||||
|
||||
|
|
|
@ -1224,6 +1224,9 @@ static int i915_emon_status(struct seq_file *m, void *unused)
|
|||
unsigned long temp, chipset, gfx;
|
||||
int ret;
|
||||
|
||||
if (!IS_GEN5(dev))
|
||||
return -ENODEV;
|
||||
|
||||
ret = mutex_lock_interruptible(&dev->struct_mutex);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
|
|
@ -1701,6 +1701,9 @@ void i915_update_gfx_val(struct drm_i915_private *dev_priv)
|
|||
unsigned long diffms;
|
||||
u32 count;
|
||||
|
||||
if (dev_priv->info->gen != 5)
|
||||
return;
|
||||
|
||||
getrawmonotonic(&now);
|
||||
diff1 = timespec_sub(now, dev_priv->last_time2);
|
||||
|
||||
|
@ -2121,12 +2124,14 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
|
|||
setup_timer(&dev_priv->hangcheck_timer, i915_hangcheck_elapsed,
|
||||
(unsigned long) dev);
|
||||
|
||||
spin_lock(&mchdev_lock);
|
||||
i915_mch_dev = dev_priv;
|
||||
dev_priv->mchdev_lock = &mchdev_lock;
|
||||
spin_unlock(&mchdev_lock);
|
||||
if (IS_GEN5(dev)) {
|
||||
spin_lock(&mchdev_lock);
|
||||
i915_mch_dev = dev_priv;
|
||||
dev_priv->mchdev_lock = &mchdev_lock;
|
||||
spin_unlock(&mchdev_lock);
|
||||
|
||||
ips_ping_for_i915_load();
|
||||
ips_ping_for_i915_load();
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
|
|
|
@ -7072,9 +7072,6 @@ static void intel_decrease_pllclock(struct drm_crtc *crtc)
|
|||
struct drm_device *dev = crtc->dev;
|
||||
drm_i915_private_t *dev_priv = dev->dev_private;
|
||||
struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
|
||||
int pipe = intel_crtc->pipe;
|
||||
int dpll_reg = DPLL(pipe);
|
||||
int dpll = I915_READ(dpll_reg);
|
||||
|
||||
if (HAS_PCH_SPLIT(dev))
|
||||
return;
|
||||
|
@ -7087,10 +7084,15 @@ static void intel_decrease_pllclock(struct drm_crtc *crtc)
|
|||
* the manual case.
|
||||
*/
|
||||
if (!HAS_PIPE_CXSR(dev) && intel_crtc->lowfreq_avail) {
|
||||
int pipe = intel_crtc->pipe;
|
||||
int dpll_reg = DPLL(pipe);
|
||||
u32 dpll;
|
||||
|
||||
DRM_DEBUG_DRIVER("downclocking LVDS\n");
|
||||
|
||||
assert_panel_unlocked(dev_priv, pipe);
|
||||
|
||||
dpll = I915_READ(dpll_reg);
|
||||
dpll |= DISPLAY_RATE_SELECT_FPA1;
|
||||
I915_WRITE(dpll_reg, dpll);
|
||||
intel_wait_for_vblank(dev, pipe);
|
||||
|
@ -7098,7 +7100,6 @@ static void intel_decrease_pllclock(struct drm_crtc *crtc)
|
|||
if (!(dpll & DISPLAY_RATE_SELECT_FPA1))
|
||||
DRM_DEBUG_DRIVER("failed to downclock LVDS!\n");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -136,7 +136,7 @@ static void i9xx_write_infoframe(struct drm_encoder *encoder,
|
|||
|
||||
val &= ~VIDEO_DIP_SELECT_MASK;
|
||||
|
||||
I915_WRITE(VIDEO_DIP_CTL, val | port | flags);
|
||||
I915_WRITE(VIDEO_DIP_CTL, VIDEO_DIP_ENABLE | val | port | flags);
|
||||
|
||||
for (i = 0; i < len; i += 4) {
|
||||
I915_WRITE(VIDEO_DIP_DATA, *data);
|
||||
|
|
|
@ -750,7 +750,7 @@ static const struct dmi_system_id intel_no_lvds[] = {
|
|||
.ident = "Hewlett-Packard t5745",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "hp t5745"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "hp t5745"),
|
||||
},
|
||||
},
|
||||
{
|
||||
|
@ -758,7 +758,7 @@ static const struct dmi_system_id intel_no_lvds[] = {
|
|||
.ident = "Hewlett-Packard st5747",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "hp st5747"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "hp st5747"),
|
||||
},
|
||||
},
|
||||
{
|
||||
|
|
|
@ -398,10 +398,8 @@ static int init_render_ring(struct intel_ring_buffer *ring)
|
|||
return ret;
|
||||
}
|
||||
|
||||
if (INTEL_INFO(dev)->gen >= 6) {
|
||||
I915_WRITE(INSTPM,
|
||||
INSTPM_FORCE_ORDERING << 16 | INSTPM_FORCE_ORDERING);
|
||||
|
||||
if (IS_GEN6(dev)) {
|
||||
/* From the Sandybridge PRM, volume 1 part 3, page 24:
|
||||
* "If this bit is set, STCunit will have LRA as replacement
|
||||
* policy. [...] This bit must be reset. LRA replacement
|
||||
|
@ -411,6 +409,11 @@ static int init_render_ring(struct intel_ring_buffer *ring)
|
|||
CM0_STC_EVICT_DISABLE_LRA_SNB << CM0_MASK_SHIFT);
|
||||
}
|
||||
|
||||
if (INTEL_INFO(dev)->gen >= 6) {
|
||||
I915_WRITE(INSTPM,
|
||||
INSTPM_FORCE_ORDERING << 16 | INSTPM_FORCE_ORDERING);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -1220,8 +1220,14 @@ static bool intel_sdvo_get_capabilities(struct intel_sdvo *intel_sdvo, struct in
|
|||
|
||||
static int intel_sdvo_supports_hotplug(struct intel_sdvo *intel_sdvo)
|
||||
{
|
||||
struct drm_device *dev = intel_sdvo->base.base.dev;
|
||||
u8 response[2];
|
||||
|
||||
/* HW Erratum: SDVO Hotplug is broken on all i945G chips, there's noise
|
||||
* on the line. */
|
||||
if (IS_I945G(dev) || IS_I945GM(dev))
|
||||
return false;
|
||||
|
||||
return intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_HOT_PLUG_SUPPORT,
|
||||
&response, 2) && response[0];
|
||||
}
|
||||
|
|
|
@ -29,10 +29,6 @@
|
|||
#include "nouveau_i2c.h"
|
||||
#include "nouveau_hw.h"
|
||||
|
||||
#define T_TIMEOUT 2200000
|
||||
#define T_RISEFALL 1000
|
||||
#define T_HOLD 5000
|
||||
|
||||
static void
|
||||
i2c_drive_scl(void *data, int state)
|
||||
{
|
||||
|
@ -113,175 +109,6 @@ i2c_sense_sda(void *data)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
i2c_delay(struct nouveau_i2c_chan *port, u32 nsec)
|
||||
{
|
||||
udelay((nsec + 500) / 1000);
|
||||
}
|
||||
|
||||
static bool
|
||||
i2c_raise_scl(struct nouveau_i2c_chan *port)
|
||||
{
|
||||
u32 timeout = T_TIMEOUT / T_RISEFALL;
|
||||
|
||||
i2c_drive_scl(port, 1);
|
||||
do {
|
||||
i2c_delay(port, T_RISEFALL);
|
||||
} while (!i2c_sense_scl(port) && --timeout);
|
||||
|
||||
return timeout != 0;
|
||||
}
|
||||
|
||||
static int
|
||||
i2c_start(struct nouveau_i2c_chan *port)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
port->state = i2c_sense_scl(port);
|
||||
port->state |= i2c_sense_sda(port) << 1;
|
||||
if (port->state != 3) {
|
||||
i2c_drive_scl(port, 0);
|
||||
i2c_drive_sda(port, 1);
|
||||
if (!i2c_raise_scl(port))
|
||||
ret = -EBUSY;
|
||||
}
|
||||
|
||||
i2c_drive_sda(port, 0);
|
||||
i2c_delay(port, T_HOLD);
|
||||
i2c_drive_scl(port, 0);
|
||||
i2c_delay(port, T_HOLD);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
i2c_stop(struct nouveau_i2c_chan *port)
|
||||
{
|
||||
i2c_drive_scl(port, 0);
|
||||
i2c_drive_sda(port, 0);
|
||||
i2c_delay(port, T_RISEFALL);
|
||||
|
||||
i2c_drive_scl(port, 1);
|
||||
i2c_delay(port, T_HOLD);
|
||||
i2c_drive_sda(port, 1);
|
||||
i2c_delay(port, T_HOLD);
|
||||
}
|
||||
|
||||
static int
|
||||
i2c_bitw(struct nouveau_i2c_chan *port, int sda)
|
||||
{
|
||||
i2c_drive_sda(port, sda);
|
||||
i2c_delay(port, T_RISEFALL);
|
||||
|
||||
if (!i2c_raise_scl(port))
|
||||
return -ETIMEDOUT;
|
||||
i2c_delay(port, T_HOLD);
|
||||
|
||||
i2c_drive_scl(port, 0);
|
||||
i2c_delay(port, T_HOLD);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
i2c_bitr(struct nouveau_i2c_chan *port)
|
||||
{
|
||||
int sda;
|
||||
|
||||
i2c_drive_sda(port, 1);
|
||||
i2c_delay(port, T_RISEFALL);
|
||||
|
||||
if (!i2c_raise_scl(port))
|
||||
return -ETIMEDOUT;
|
||||
i2c_delay(port, T_HOLD);
|
||||
|
||||
sda = i2c_sense_sda(port);
|
||||
|
||||
i2c_drive_scl(port, 0);
|
||||
i2c_delay(port, T_HOLD);
|
||||
return sda;
|
||||
}
|
||||
|
||||
static int
|
||||
i2c_get_byte(struct nouveau_i2c_chan *port, u8 *byte, bool last)
|
||||
{
|
||||
int i, bit;
|
||||
|
||||
*byte = 0;
|
||||
for (i = 7; i >= 0; i--) {
|
||||
bit = i2c_bitr(port);
|
||||
if (bit < 0)
|
||||
return bit;
|
||||
*byte |= bit << i;
|
||||
}
|
||||
|
||||
return i2c_bitw(port, last ? 1 : 0);
|
||||
}
|
||||
|
||||
static int
|
||||
i2c_put_byte(struct nouveau_i2c_chan *port, u8 byte)
|
||||
{
|
||||
int i, ret;
|
||||
for (i = 7; i >= 0; i--) {
|
||||
ret = i2c_bitw(port, !!(byte & (1 << i)));
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = i2c_bitr(port);
|
||||
if (ret == 1) /* nack */
|
||||
ret = -EIO;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
i2c_addr(struct nouveau_i2c_chan *port, struct i2c_msg *msg)
|
||||
{
|
||||
u32 addr = msg->addr << 1;
|
||||
if (msg->flags & I2C_M_RD)
|
||||
addr |= 1;
|
||||
return i2c_put_byte(port, addr);
|
||||
}
|
||||
|
||||
static int
|
||||
i2c_bit_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
|
||||
{
|
||||
struct nouveau_i2c_chan *port = (struct nouveau_i2c_chan *)adap;
|
||||
struct i2c_msg *msg = msgs;
|
||||
int ret = 0, mcnt = num;
|
||||
|
||||
while (!ret && mcnt--) {
|
||||
u8 remaining = msg->len;
|
||||
u8 *ptr = msg->buf;
|
||||
|
||||
ret = i2c_start(port);
|
||||
if (ret == 0)
|
||||
ret = i2c_addr(port, msg);
|
||||
|
||||
if (msg->flags & I2C_M_RD) {
|
||||
while (!ret && remaining--)
|
||||
ret = i2c_get_byte(port, ptr++, !remaining);
|
||||
} else {
|
||||
while (!ret && remaining--)
|
||||
ret = i2c_put_byte(port, *ptr++);
|
||||
}
|
||||
|
||||
msg++;
|
||||
}
|
||||
|
||||
i2c_stop(port);
|
||||
return (ret < 0) ? ret : num;
|
||||
}
|
||||
|
||||
static u32
|
||||
i2c_bit_func(struct i2c_adapter *adap)
|
||||
{
|
||||
return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
|
||||
}
|
||||
|
||||
const struct i2c_algorithm nouveau_i2c_bit_algo = {
|
||||
.master_xfer = i2c_bit_xfer,
|
||||
.functionality = i2c_bit_func
|
||||
};
|
||||
|
||||
static const uint32_t nv50_i2c_port[] = {
|
||||
0x00e138, 0x00e150, 0x00e168, 0x00e180,
|
||||
0x00e254, 0x00e274, 0x00e764, 0x00e780,
|
||||
|
@ -384,12 +211,10 @@ nouveau_i2c_init(struct drm_device *dev)
|
|||
case 0: /* NV04:NV50 */
|
||||
port->drive = entry[0];
|
||||
port->sense = entry[1];
|
||||
port->adapter.algo = &nouveau_i2c_bit_algo;
|
||||
break;
|
||||
case 4: /* NV4E */
|
||||
port->drive = 0x600800 + entry[1];
|
||||
port->sense = port->drive;
|
||||
port->adapter.algo = &nouveau_i2c_bit_algo;
|
||||
break;
|
||||
case 5: /* NV50- */
|
||||
port->drive = entry[0] & 0x0f;
|
||||
|
@ -402,7 +227,6 @@ nouveau_i2c_init(struct drm_device *dev)
|
|||
port->drive = 0x00d014 + (port->drive * 0x20);
|
||||
port->sense = port->drive;
|
||||
}
|
||||
port->adapter.algo = &nouveau_i2c_bit_algo;
|
||||
break;
|
||||
case 6: /* NV50- DP AUX */
|
||||
port->drive = entry[0];
|
||||
|
@ -413,7 +237,7 @@ nouveau_i2c_init(struct drm_device *dev)
|
|||
break;
|
||||
}
|
||||
|
||||
if (!port->adapter.algo) {
|
||||
if (!port->adapter.algo && !port->drive) {
|
||||
NV_ERROR(dev, "I2C%d: type %d index %x/%x unknown\n",
|
||||
i, port->type, port->drive, port->sense);
|
||||
kfree(port);
|
||||
|
@ -429,7 +253,26 @@ nouveau_i2c_init(struct drm_device *dev)
|
|||
port->dcb = ROM32(entry[0]);
|
||||
i2c_set_adapdata(&port->adapter, i2c);
|
||||
|
||||
ret = i2c_add_adapter(&port->adapter);
|
||||
if (port->adapter.algo != &nouveau_dp_i2c_algo) {
|
||||
port->adapter.algo_data = &port->bit;
|
||||
port->bit.udelay = 10;
|
||||
port->bit.timeout = usecs_to_jiffies(2200);
|
||||
port->bit.data = port;
|
||||
port->bit.setsda = i2c_drive_sda;
|
||||
port->bit.setscl = i2c_drive_scl;
|
||||
port->bit.getsda = i2c_sense_sda;
|
||||
port->bit.getscl = i2c_sense_scl;
|
||||
|
||||
i2c_drive_scl(port, 0);
|
||||
i2c_drive_sda(port, 1);
|
||||
i2c_drive_scl(port, 1);
|
||||
|
||||
ret = i2c_bit_add_bus(&port->adapter);
|
||||
} else {
|
||||
port->adapter.algo = &nouveau_dp_i2c_algo;
|
||||
ret = i2c_add_adapter(&port->adapter);
|
||||
}
|
||||
|
||||
if (ret) {
|
||||
NV_ERROR(dev, "I2C%d: failed register: %d\n", i, ret);
|
||||
kfree(port);
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
struct nouveau_i2c_chan {
|
||||
struct i2c_adapter adapter;
|
||||
struct drm_device *dev;
|
||||
struct i2c_algo_bit_data bit;
|
||||
struct list_head head;
|
||||
u8 index;
|
||||
u8 type;
|
||||
|
|
|
@ -241,8 +241,8 @@ int radeon_wb_init(struct radeon_device *rdev)
|
|||
rdev->wb.use_event = true;
|
||||
}
|
||||
}
|
||||
/* always use writeback/events on NI */
|
||||
if (ASIC_IS_DCE5(rdev)) {
|
||||
/* always use writeback/events on NI, APUs */
|
||||
if (rdev->family >= CHIP_PALM) {
|
||||
rdev->wb.enabled = true;
|
||||
rdev->wb.use_event = true;
|
||||
}
|
||||
|
|
|
@ -112,7 +112,7 @@ err_free_addr:
|
|||
return err;
|
||||
}
|
||||
|
||||
static void __devexit gpio_ext_free(struct netxbig_gpio_ext *gpio_ext)
|
||||
static void gpio_ext_free(struct netxbig_gpio_ext *gpio_ext)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
@ -294,7 +294,7 @@ static ssize_t netxbig_led_sata_show(struct device *dev,
|
|||
|
||||
static DEVICE_ATTR(sata, 0644, netxbig_led_sata_show, netxbig_led_sata_store);
|
||||
|
||||
static void __devexit delete_netxbig_led(struct netxbig_led_data *led_dat)
|
||||
static void delete_netxbig_led(struct netxbig_led_data *led_dat)
|
||||
{
|
||||
if (led_dat->mode_val[NETXBIG_LED_SATA] != NETXBIG_LED_INVALID_MODE)
|
||||
device_remove_file(led_dat->cdev.dev, &dev_attr_sata);
|
||||
|
|
|
@ -255,7 +255,7 @@ err_free_cmd:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static void __devexit delete_ns2_led(struct ns2_led_data *led_dat)
|
||||
static void delete_ns2_led(struct ns2_led_data *led_dat)
|
||||
{
|
||||
device_remove_file(led_dat->cdev.dev, &dev_attr_sata);
|
||||
led_classdev_unregister(&led_dat->cdev);
|
||||
|
|
|
@ -1727,8 +1727,7 @@ int bitmap_create(struct mddev *mddev)
|
|||
bitmap->chunkshift = (ffz(~mddev->bitmap_info.chunksize)
|
||||
- BITMAP_BLOCK_SHIFT);
|
||||
|
||||
/* now that chunksize and chunkshift are set, we can use these macros */
|
||||
chunks = (blocks + bitmap->chunkshift - 1) >>
|
||||
chunks = (blocks + (1 << bitmap->chunkshift) - 1) >>
|
||||
bitmap->chunkshift;
|
||||
pages = (chunks + PAGE_COUNTER_RATIO - 1) / PAGE_COUNTER_RATIO;
|
||||
|
||||
|
|
|
@ -101,9 +101,6 @@ typedef __u16 bitmap_counter_t;
|
|||
|
||||
#define BITMAP_BLOCK_SHIFT 9
|
||||
|
||||
/* how many blocks per chunk? (this is variable) */
|
||||
#define CHUNK_BLOCK_RATIO(bitmap) ((bitmap)->mddev->bitmap_info.chunksize >> BITMAP_BLOCK_SHIFT)
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
|
@ -134,7 +134,7 @@ static void cn_ulog_callback(struct cn_msg *msg, struct netlink_skb_parms *nsp)
|
|||
{
|
||||
struct dm_ulog_request *tfr = (struct dm_ulog_request *)(msg + 1);
|
||||
|
||||
if (!cap_raised(current_cap(), CAP_SYS_ADMIN))
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
return;
|
||||
|
||||
spin_lock(&receiving_list_lock);
|
||||
|
|
|
@ -718,8 +718,8 @@ static int parse_hw_handler(struct dm_arg_set *as, struct multipath *m)
|
|||
return 0;
|
||||
|
||||
m->hw_handler_name = kstrdup(dm_shift_arg(as), GFP_KERNEL);
|
||||
request_module("scsi_dh_%s", m->hw_handler_name);
|
||||
if (scsi_dh_handler_exist(m->hw_handler_name) == 0) {
|
||||
if (!try_then_request_module(scsi_dh_handler_exist(m->hw_handler_name),
|
||||
"scsi_dh_%s", m->hw_handler_name)) {
|
||||
ti->error = "unknown hardware handler type";
|
||||
ret = -EINVAL;
|
||||
goto fail;
|
||||
|
|
|
@ -279,8 +279,10 @@ static void __cell_release(struct cell *cell, struct bio_list *inmates)
|
|||
|
||||
hlist_del(&cell->list);
|
||||
|
||||
bio_list_add(inmates, cell->holder);
|
||||
bio_list_merge(inmates, &cell->bios);
|
||||
if (inmates) {
|
||||
bio_list_add(inmates, cell->holder);
|
||||
bio_list_merge(inmates, &cell->bios);
|
||||
}
|
||||
|
||||
mempool_free(cell, prison->cell_pool);
|
||||
}
|
||||
|
@ -303,9 +305,10 @@ static void cell_release(struct cell *cell, struct bio_list *bios)
|
|||
*/
|
||||
static void __cell_release_singleton(struct cell *cell, struct bio *bio)
|
||||
{
|
||||
hlist_del(&cell->list);
|
||||
BUG_ON(cell->holder != bio);
|
||||
BUG_ON(!bio_list_empty(&cell->bios));
|
||||
|
||||
__cell_release(cell, NULL);
|
||||
}
|
||||
|
||||
static void cell_release_singleton(struct cell *cell, struct bio *bio)
|
||||
|
@ -1177,6 +1180,7 @@ static void no_space(struct cell *cell)
|
|||
static void process_discard(struct thin_c *tc, struct bio *bio)
|
||||
{
|
||||
int r;
|
||||
unsigned long flags;
|
||||
struct pool *pool = tc->pool;
|
||||
struct cell *cell, *cell2;
|
||||
struct cell_key key, key2;
|
||||
|
@ -1218,7 +1222,9 @@ static void process_discard(struct thin_c *tc, struct bio *bio)
|
|||
m->bio = bio;
|
||||
|
||||
if (!ds_add_work(&pool->all_io_ds, &m->list)) {
|
||||
spin_lock_irqsave(&pool->lock, flags);
|
||||
list_add(&m->list, &pool->prepared_discards);
|
||||
spin_unlock_irqrestore(&pool->lock, flags);
|
||||
wake_worker(pool);
|
||||
}
|
||||
} else {
|
||||
|
@ -2626,8 +2632,10 @@ static int thin_endio(struct dm_target *ti,
|
|||
if (h->all_io_entry) {
|
||||
INIT_LIST_HEAD(&work);
|
||||
ds_dec(h->all_io_entry, &work);
|
||||
spin_lock_irqsave(&pool->lock, flags);
|
||||
list_for_each_entry_safe(m, tmp, &work, list)
|
||||
list_add(&m->list, &pool->prepared_discards);
|
||||
spin_unlock_irqrestore(&pool->lock, flags);
|
||||
}
|
||||
|
||||
mempool_free(h, pool->endio_hook_pool);
|
||||
|
@ -2759,6 +2767,6 @@ static void dm_thin_exit(void)
|
|||
module_init(dm_thin_init);
|
||||
module_exit(dm_thin_exit);
|
||||
|
||||
MODULE_DESCRIPTION(DM_NAME "device-mapper thin provisioning target");
|
||||
MODULE_DESCRIPTION(DM_NAME " thin provisioning target");
|
||||
MODULE_AUTHOR("Joe Thornber <dm-devel@redhat.com>");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
|
@ -1921,6 +1921,10 @@ static int dtv_set_frontend(struct dvb_frontend *fe)
|
|||
} else {
|
||||
/* default values */
|
||||
switch (c->delivery_system) {
|
||||
case SYS_DVBS:
|
||||
case SYS_DVBS2:
|
||||
case SYS_ISDBS:
|
||||
case SYS_TURBO:
|
||||
case SYS_DVBC_ANNEX_A:
|
||||
case SYS_DVBC_ANNEX_C:
|
||||
fepriv->min_delay = HZ / 20;
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue