mirror of
https://github.com/armbian/linux.git
synced 2026-01-06 10:13:00 -08:00
Merge branch 'linux-2.6' into powerpc-next
This commit is contained in:
@@ -310,8 +310,8 @@ and then start a subshell 'sh' in that cgroup:
|
||||
cd /dev/cgroup
|
||||
mkdir Charlie
|
||||
cd Charlie
|
||||
/bin/echo 2-3 > cpus
|
||||
/bin/echo 1 > mems
|
||||
/bin/echo 2-3 > cpuset.cpus
|
||||
/bin/echo 1 > cpuset.mems
|
||||
/bin/echo $$ > tasks
|
||||
sh
|
||||
# The subshell 'sh' is now running in cgroup Charlie
|
||||
|
||||
@@ -289,6 +289,14 @@ Who: Glauber Costa <gcosta@redhat.com>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: old style serial driver for ColdFire (CONFIG_SERIAL_COLDFIRE)
|
||||
When: 2.6.28
|
||||
Why: This driver still uses the old interface and has been replaced
|
||||
by CONFIG_SERIAL_MCF.
|
||||
Who: Sebastian Siewior <sebastian@breakpoint.cc>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: /sys/o2cb symlink
|
||||
When: January 2010
|
||||
Why: /sys/fs/o2cb is the proper location for this information - /sys/o2cb
|
||||
|
||||
@@ -69,7 +69,8 @@ point2: Set the pwm speed at a higher temperature bound.
|
||||
|
||||
The ADT7473 will scale the pwm between the lower and higher pwm speed when
|
||||
the temperature is between the two temperature boundaries. PWM values range
|
||||
from 0 (off) to 255 (full speed).
|
||||
from 0 (off) to 255 (full speed). Fan speed will be set to maximum when the
|
||||
temperature sensor associated with the PWM control exceeds temp#_max.
|
||||
|
||||
Notes
|
||||
-----
|
||||
|
||||
@@ -398,9 +398,6 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
cio_ignore= [S390]
|
||||
See Documentation/s390/CommonIO for details.
|
||||
|
||||
cio_msg= [S390]
|
||||
See Documentation/s390/CommonIO for details.
|
||||
|
||||
clock= [BUGS=X86-32, HW] gettimeofday clocksource override.
|
||||
[Deprecated]
|
||||
Forces specified clocksource (if available) to be used
|
||||
@@ -689,6 +686,12 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
floppy= [HW]
|
||||
See Documentation/floppy.txt.
|
||||
|
||||
force_pal_cache_flush
|
||||
[IA-64] Avoid check_sal_cache_flush which may hang on
|
||||
buggy SAL_CACHE_FLUSH implementations. Using this
|
||||
parameter will force ia64_sal_cache_flush to call
|
||||
ia64_pal_cache_flush instead of SAL_CACHE_FLUSH.
|
||||
|
||||
gamecon.map[2|3]=
|
||||
[HW,JOY] Multisystem joystick and NES/SNES/PSX pad
|
||||
support via parallel port (up to 5 devices per port)
|
||||
|
||||
@@ -994,7 +994,17 @@ The Linux kernel has eight basic CPU memory barriers:
|
||||
DATA DEPENDENCY read_barrier_depends() smp_read_barrier_depends()
|
||||
|
||||
|
||||
All CPU memory barriers unconditionally imply compiler barriers.
|
||||
All memory barriers except the data dependency barriers imply a compiler
|
||||
barrier. Data dependencies do not impose any additional compiler ordering.
|
||||
|
||||
Aside: In the case of data dependencies, the compiler would be expected to
|
||||
issue the loads in the correct order (eg. `a[b]` would have to load the value
|
||||
of b before loading a[b]), however there is no guarantee in the C specification
|
||||
that the compiler may not speculate the value of b (eg. is equal to 1) and load
|
||||
a before b (eg. tmp = a[1]; if (b != 1) tmp = a[b]; ). There is also the
|
||||
problem of a compiler reloading b after having loaded a[b], thus having a newer
|
||||
copy of b than a[b]. A consensus has not yet been reached about these problems,
|
||||
however the ACCESS_ONCE macro is a good place to start looking.
|
||||
|
||||
SMP memory barriers are reduced to compiler barriers on uniprocessor compiled
|
||||
systems because it is assumed that a CPU will appear to be self-consistent,
|
||||
|
||||
@@ -5,6 +5,6 @@
|
||||
4 -> DViCO FusionHDTV5 Express [18ac:d500]
|
||||
5 -> Hauppauge WinTV-HVR1500Q [0070:7790,0070:7797]
|
||||
6 -> Hauppauge WinTV-HVR1500 [0070:7710,0070:7717]
|
||||
7 -> Hauppauge WinTV-HVR1200 [0070:71d1]
|
||||
7 -> Hauppauge WinTV-HVR1200 [0070:71d1,0070:71d3]
|
||||
8 -> Hauppauge WinTV-HVR1700 [0070:8101]
|
||||
9 -> Hauppauge WinTV-HVR1400 [0070:8010]
|
||||
|
||||
@@ -14,4 +14,4 @@
|
||||
13 -> Terratec Prodigy XS (em2880) [0ccd:0047]
|
||||
14 -> Pixelview Prolink PlayTV USB 2.0 (em2820/em2840)
|
||||
15 -> V-Gear PocketTV (em2800)
|
||||
16 -> Hauppauge WinTV HVR 950 (em2880) [2040:6513]
|
||||
16 -> Hauppauge WinTV HVR 950 (em2880) [2040:6513,2040:6517,2040:651b,2040:651f]
|
||||
|
||||
13
MAINTAINERS
13
MAINTAINERS
@@ -367,12 +367,12 @@ S: Maintained for 2.4; PCI support for 2.6.
|
||||
AMD GEODE CS5536 USB DEVICE CONTROLLER DRIVER
|
||||
P: Thomas Dahlmann
|
||||
M: thomas.dahlmann@amd.com
|
||||
L: info-linux@geode.amd.com (subscribers-only)
|
||||
L: linux-geode@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Supported
|
||||
|
||||
AMD GEODE PROCESSOR/CHIPSET SUPPORT
|
||||
P: Jordan Crouse
|
||||
L: info-linux@geode.amd.com (subscribers-only)
|
||||
L: linux-geode@lists.infradead.org (moderated for non-subscribers)
|
||||
W: http://www.amd.com/us-en/ConnectivitySolutions/TechnicalResources/0,,50_2334_2452_11363,00.html
|
||||
S: Supported
|
||||
|
||||
@@ -1230,6 +1230,15 @@ P: Jaya Kumar
|
||||
M: jayakumar.alsa@gmail.com
|
||||
S: Maintained
|
||||
|
||||
CX18 VIDEO4LINUX DRIVER
|
||||
P: Hans Verkuil, Andy Walls
|
||||
M: hverkuil@xs4all.nl, awalls@radix.net
|
||||
L: ivtv-devel@ivtvdriver.org
|
||||
L: ivtv-users@ivtvdriver.org
|
||||
L: video4linux-list@redhat.com
|
||||
W: http://linuxtv.org
|
||||
S: Maintained
|
||||
|
||||
CYBERPRO FB DRIVER
|
||||
P: Russell King
|
||||
M: rmk@arm.linux.org.uk
|
||||
|
||||
@@ -544,10 +544,10 @@ void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data)
|
||||
struct resource *fb_res = &lcdc_resources[2];
|
||||
size_t fb_len = fb_res->end - fb_res->start + 1;
|
||||
|
||||
fb = ioremap_writecombine(fb_res->start, fb_len);
|
||||
fb = ioremap(fb_res->start, fb_len);
|
||||
if (fb) {
|
||||
memset(fb, 0, fb_len);
|
||||
iounmap(fb, fb_len);
|
||||
iounmap(fb);
|
||||
}
|
||||
}
|
||||
lcdc_data = *data;
|
||||
|
||||
@@ -332,13 +332,6 @@ static struct resource lcdc_resources[] = {
|
||||
.end = AT91SAM9RL_ID_LCDC,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
#if defined(CONFIG_FB_INTSRAM)
|
||||
[2] = {
|
||||
.start = AT91SAM9RL_SRAM_BASE,
|
||||
.end = AT91SAM9RL_SRAM_BASE + AT91SAM9RL_SRAM_SIZE - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
#endif
|
||||
};
|
||||
|
||||
static struct platform_device at91_lcdc_device = {
|
||||
@@ -381,20 +374,6 @@ void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data)
|
||||
at91_set_B_periph(AT91_PIN_PC24, 0); /* LCDD22 */
|
||||
at91_set_B_periph(AT91_PIN_PC25, 0); /* LCDD23 */
|
||||
|
||||
#ifdef CONFIG_FB_INTSRAM
|
||||
{
|
||||
void __iomem *fb;
|
||||
struct resource *fb_res = &lcdc_resources[2];
|
||||
size_t fb_len = fb_res->end - fb_res->start + 1;
|
||||
|
||||
fb = ioremap_writecombine(fb_res->start, fb_len);
|
||||
if (fb) {
|
||||
memset(fb, 0, fb_len);
|
||||
iounmap(fb, fb_len);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
lcdc_data = *data;
|
||||
platform_device_register(&at91_lcdc_device);
|
||||
}
|
||||
|
||||
@@ -135,6 +135,7 @@ config IA64_GENERIC
|
||||
HP-zx1/sx1000 For HP systems
|
||||
HP-zx1/sx1000+swiotlb For HP systems with (broken) DMA-constrained devices.
|
||||
SGI-SN2 For SGI Altix systems
|
||||
SGI-UV For SGI UV systems
|
||||
Ski-simulator For the HP simulator <http://www.hpl.hp.com/research/linux/ski/>
|
||||
|
||||
If you don't know what to do, choose "generic".
|
||||
@@ -170,6 +171,18 @@ config IA64_SGI_SN2
|
||||
to select this option. If in doubt, select ia64 generic support
|
||||
instead.
|
||||
|
||||
config IA64_SGI_UV`
|
||||
bool "SGI-UV`"
|
||||
select NUMA
|
||||
select ACPI_NUMA
|
||||
select SWIOTLB
|
||||
help
|
||||
Selecting this option will optimize the kernel for use on UV based
|
||||
systems, but the resulting kernel binary will not run on other
|
||||
types of ia64 systems. If you have an SGI UV system, it's safe
|
||||
to select this option. If in doubt, select ia64 generic support
|
||||
instead.
|
||||
|
||||
config IA64_HP_SIM
|
||||
bool "Ski-simulator"
|
||||
select SWIOTLB
|
||||
|
||||
@@ -63,7 +63,7 @@ drivers-$(CONFIG_PCI) += arch/ia64/pci/
|
||||
drivers-$(CONFIG_IA64_HP_SIM) += arch/ia64/hp/sim/
|
||||
drivers-$(CONFIG_IA64_HP_ZX1) += arch/ia64/hp/common/ arch/ia64/hp/zx1/
|
||||
drivers-$(CONFIG_IA64_HP_ZX1_SWIOTLB) += arch/ia64/hp/common/ arch/ia64/hp/zx1/
|
||||
drivers-$(CONFIG_IA64_GENERIC) += arch/ia64/hp/common/ arch/ia64/hp/zx1/ arch/ia64/hp/sim/ arch/ia64/sn/
|
||||
drivers-$(CONFIG_IA64_GENERIC) += arch/ia64/hp/common/ arch/ia64/hp/zx1/ arch/ia64/hp/sim/ arch/ia64/sn/ arch/ia64/uv/
|
||||
drivers-$(CONFIG_OPROFILE) += arch/ia64/oprofile/
|
||||
|
||||
boot := arch/ia64/hp/sim/boot
|
||||
|
||||
@@ -15,7 +15,6 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/personality.h>
|
||||
#include <linux/sched.h>
|
||||
|
||||
#include <asm/intrinsics.h>
|
||||
@@ -29,7 +28,6 @@
|
||||
|
||||
extern int die_if_kernel (char *str, struct pt_regs *regs, long err);
|
||||
|
||||
struct exec_domain ia32_exec_domain;
|
||||
struct page *ia32_shared_page[NR_CPUS];
|
||||
unsigned long *ia32_boot_gdt;
|
||||
unsigned long *cpu_gdt_table[NR_CPUS];
|
||||
@@ -240,14 +238,6 @@ ia32_cpu_init (void)
|
||||
static int __init
|
||||
ia32_init (void)
|
||||
{
|
||||
ia32_exec_domain.name = "Linux/x86";
|
||||
ia32_exec_domain.handler = NULL;
|
||||
ia32_exec_domain.pers_low = PER_LINUX32;
|
||||
ia32_exec_domain.pers_high = PER_LINUX32;
|
||||
ia32_exec_domain.signal_map = default_exec_domain.signal_map;
|
||||
ia32_exec_domain.signal_invmap = default_exec_domain.signal_invmap;
|
||||
register_exec_domain(&ia32_exec_domain);
|
||||
|
||||
#if PAGE_SHIFT > IA32_PAGE_SHIFT
|
||||
{
|
||||
extern struct kmem_cache *ia64_partial_page_cachep;
|
||||
|
||||
@@ -117,7 +117,10 @@ acpi_get_sysname(void)
|
||||
if (!strcmp(hdr->oem_id, "HP")) {
|
||||
return "hpzx1";
|
||||
} else if (!strcmp(hdr->oem_id, "SGI")) {
|
||||
return "sn2";
|
||||
if (!strcmp(hdr->oem_table_id + 4, "UV"))
|
||||
return "uv";
|
||||
else
|
||||
return "sn2";
|
||||
}
|
||||
|
||||
return "dig";
|
||||
@@ -130,6 +133,8 @@ acpi_get_sysname(void)
|
||||
return "hpzx1_swiotlb";
|
||||
# elif defined (CONFIG_IA64_SGI_SN2)
|
||||
return "sn2";
|
||||
# elif defined (CONFIG_IA64_SGI_UV)
|
||||
return "uv";
|
||||
# elif defined (CONFIG_IA64_DIG)
|
||||
return "dig";
|
||||
# else
|
||||
@@ -622,6 +627,9 @@ void acpi_unregister_gsi(u32 gsi)
|
||||
if (acpi_irq_model == ACPI_IRQ_MODEL_PLATFORM)
|
||||
return;
|
||||
|
||||
if (has_8259 && gsi < 16)
|
||||
return;
|
||||
|
||||
iosapic_unregister_intr(gsi);
|
||||
}
|
||||
|
||||
|
||||
@@ -1156,6 +1156,9 @@ skip_rbs_switch:
|
||||
* r31 = current->thread_info->flags
|
||||
* On exit:
|
||||
* p6 = TRUE if work-pending-check needs to be redone
|
||||
*
|
||||
* Interrupts are disabled on entry, reenabled depend on work, and
|
||||
* disabled on exit.
|
||||
*/
|
||||
.work_pending_syscall:
|
||||
add r2=-8,r2
|
||||
@@ -1164,16 +1167,16 @@ skip_rbs_switch:
|
||||
st8 [r2]=r8
|
||||
st8 [r3]=r10
|
||||
.work_pending:
|
||||
tbit.z p6,p0=r31,TIF_NEED_RESCHED // current_thread_info()->need_resched==0?
|
||||
tbit.z p6,p0=r31,TIF_NEED_RESCHED // is resched not needed?
|
||||
(p6) br.cond.sptk.few .notify
|
||||
#ifdef CONFIG_PREEMPT
|
||||
(pKStk) dep r21=-1,r0,PREEMPT_ACTIVE_BIT,1
|
||||
;;
|
||||
(pKStk) st4 [r20]=r21
|
||||
ssm psr.i // enable interrupts
|
||||
#endif
|
||||
ssm psr.i // enable interrupts
|
||||
br.call.spnt.many rp=schedule
|
||||
.ret9: cmp.eq p6,p0=r0,r0 // p6 <- 1
|
||||
.ret9: cmp.eq p6,p0=r0,r0 // p6 <- 1 (re-check)
|
||||
rsm psr.i // disable interrupts
|
||||
;;
|
||||
#ifdef CONFIG_PREEMPT
|
||||
@@ -1182,13 +1185,13 @@ skip_rbs_switch:
|
||||
(pKStk) st4 [r20]=r0 // preempt_count() <- 0
|
||||
#endif
|
||||
(pLvSys)br.cond.sptk.few .work_pending_syscall_end
|
||||
br.cond.sptk.many .work_processed_kernel // re-check
|
||||
br.cond.sptk.many .work_processed_kernel
|
||||
|
||||
.notify:
|
||||
(pUStk) br.call.spnt.many rp=notify_resume_user
|
||||
.ret10: cmp.ne p6,p0=r0,r0 // p6 <- 0
|
||||
.ret10: cmp.ne p6,p0=r0,r0 // p6 <- 0 (don't re-check)
|
||||
(pLvSys)br.cond.sptk.few .work_pending_syscall_end
|
||||
br.cond.sptk.many .work_processed_kernel // don't re-check
|
||||
br.cond.sptk.many .work_processed_kernel
|
||||
|
||||
.work_pending_syscall_end:
|
||||
adds r2=PT(R8)+16,r12
|
||||
@@ -1196,7 +1199,7 @@ skip_rbs_switch:
|
||||
;;
|
||||
ld8 r8=[r2]
|
||||
ld8 r10=[r3]
|
||||
br.cond.sptk.many .work_processed_syscall // re-check
|
||||
br.cond.sptk.many .work_processed_syscall
|
||||
|
||||
END(ia64_leave_kernel)
|
||||
|
||||
@@ -1234,9 +1237,12 @@ GLOBAL_ENTRY(ia64_invoke_schedule_tail)
|
||||
END(ia64_invoke_schedule_tail)
|
||||
|
||||
/*
|
||||
* Setup stack and call do_notify_resume_user(). Note that pSys and pNonSys need to
|
||||
* be set up by the caller. We declare 8 input registers so the system call
|
||||
* args get preserved, in case we need to restart a system call.
|
||||
* Setup stack and call do_notify_resume_user(), keeping interrupts
|
||||
* disabled.
|
||||
*
|
||||
* Note that pSys and pNonSys need to be set up by the caller.
|
||||
* We declare 8 input registers so the system call args get preserved,
|
||||
* in case we need to restart a system call.
|
||||
*/
|
||||
ENTRY(notify_resume_user)
|
||||
.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8)
|
||||
|
||||
@@ -900,12 +900,6 @@ static void
|
||||
palinfo_smp_call(void *info)
|
||||
{
|
||||
palinfo_smp_data_t *data = (palinfo_smp_data_t *)info;
|
||||
if (data == NULL) {
|
||||
printk(KERN_ERR "palinfo: data pointer is NULL\n");
|
||||
data->ret = 0; /* no output */
|
||||
return;
|
||||
}
|
||||
/* does this actual call */
|
||||
data->ret = (*data->func)(data->page);
|
||||
}
|
||||
|
||||
|
||||
@@ -5013,12 +5013,13 @@ pfm_context_force_terminate(pfm_context_t *ctx, struct pt_regs *regs)
|
||||
}
|
||||
|
||||
static int pfm_ovfl_notify_user(pfm_context_t *ctx, unsigned long ovfl_pmds);
|
||||
|
||||
/*
|
||||
* pfm_handle_work() can be called with interrupts enabled
|
||||
* (TIF_NEED_RESCHED) or disabled. The down_interruptible
|
||||
* call may sleep, therefore we must re-enable interrupts
|
||||
* to avoid deadlocks. It is safe to do so because this function
|
||||
* is called ONLY when returning to user level (PUStk=1), in which case
|
||||
* is called ONLY when returning to user level (pUStk=1), in which case
|
||||
* there is no risk of kernel stack overflow due to deep
|
||||
* interrupt nesting.
|
||||
*/
|
||||
@@ -5034,7 +5035,8 @@ pfm_handle_work(void)
|
||||
|
||||
ctx = PFM_GET_CTX(current);
|
||||
if (ctx == NULL) {
|
||||
printk(KERN_ERR "perfmon: [%d] has no PFM context\n", task_pid_nr(current));
|
||||
printk(KERN_ERR "perfmon: [%d] has no PFM context\n",
|
||||
task_pid_nr(current));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -5058,11 +5060,12 @@ pfm_handle_work(void)
|
||||
/*
|
||||
* must be done before we check for simple-reset mode
|
||||
*/
|
||||
if (ctx->ctx_fl_going_zombie || ctx->ctx_state == PFM_CTX_ZOMBIE) goto do_zombie;
|
||||
|
||||
if (ctx->ctx_fl_going_zombie || ctx->ctx_state == PFM_CTX_ZOMBIE)
|
||||
goto do_zombie;
|
||||
|
||||
//if (CTX_OVFL_NOBLOCK(ctx)) goto skip_blocking;
|
||||
if (reason == PFM_TRAP_REASON_RESET) goto skip_blocking;
|
||||
if (reason == PFM_TRAP_REASON_RESET)
|
||||
goto skip_blocking;
|
||||
|
||||
/*
|
||||
* restore interrupt mask to what it was on entry.
|
||||
@@ -5110,7 +5113,8 @@ do_zombie:
|
||||
/*
|
||||
* in case of interruption of down() we don't restart anything
|
||||
*/
|
||||
if (ret < 0) goto nothing_to_do;
|
||||
if (ret < 0)
|
||||
goto nothing_to_do;
|
||||
|
||||
skip_blocking:
|
||||
pfm_resume_after_ovfl(ctx, ovfl_regs, regs);
|
||||
|
||||
@@ -167,11 +167,18 @@ void tsk_clear_notify_resume(struct task_struct *tsk)
|
||||
clear_ti_thread_flag(task_thread_info(tsk), TIF_NOTIFY_RESUME);
|
||||
}
|
||||
|
||||
/*
|
||||
* do_notify_resume_user():
|
||||
* Called from notify_resume_user at entry.S, with interrupts disabled.
|
||||
*/
|
||||
void
|
||||
do_notify_resume_user (sigset_t *unused, struct sigscratch *scr, long in_syscall)
|
||||
do_notify_resume_user(sigset_t *unused, struct sigscratch *scr, long in_syscall)
|
||||
{
|
||||
if (fsys_mode(current, &scr->pt)) {
|
||||
/* defer signal-handling etc. until we return to privilege-level 0. */
|
||||
/*
|
||||
* defer signal-handling etc. until we return to
|
||||
* privilege-level 0.
|
||||
*/
|
||||
if (!ia64_psr(&scr->pt)->lp)
|
||||
ia64_psr(&scr->pt)->lp = 1;
|
||||
return;
|
||||
@@ -179,16 +186,26 @@ do_notify_resume_user (sigset_t *unused, struct sigscratch *scr, long in_syscall
|
||||
|
||||
#ifdef CONFIG_PERFMON
|
||||
if (current->thread.pfm_needs_checking)
|
||||
/*
|
||||
* Note: pfm_handle_work() allow us to call it with interrupts
|
||||
* disabled, and may enable interrupts within the function.
|
||||
*/
|
||||
pfm_handle_work();
|
||||
#endif
|
||||
|
||||
/* deal with pending signal delivery */
|
||||
if (test_thread_flag(TIF_SIGPENDING))
|
||||
if (test_thread_flag(TIF_SIGPENDING)) {
|
||||
local_irq_enable(); /* force interrupt enable */
|
||||
ia64_do_signal(scr, in_syscall);
|
||||
}
|
||||
|
||||
/* copy user rbs to kernel rbs */
|
||||
if (unlikely(test_thread_flag(TIF_RESTORE_RSE)))
|
||||
if (unlikely(test_thread_flag(TIF_RESTORE_RSE))) {
|
||||
local_irq_enable(); /* force interrupt enable */
|
||||
ia64_sync_krbs();
|
||||
}
|
||||
|
||||
local_irq_disable(); /* force interrupt disable */
|
||||
}
|
||||
|
||||
static int pal_halt = 1;
|
||||
|
||||
@@ -229,6 +229,14 @@ static void __init sal_desc_ap_wakeup(void *p) { }
|
||||
*/
|
||||
static int sal_cache_flush_drops_interrupts;
|
||||
|
||||
static int __init
|
||||
force_pal_cache_flush(char *str)
|
||||
{
|
||||
sal_cache_flush_drops_interrupts = 1;
|
||||
return 0;
|
||||
}
|
||||
early_param("force_pal_cache_flush", force_pal_cache_flush);
|
||||
|
||||
void __init
|
||||
check_sal_cache_flush (void)
|
||||
{
|
||||
@@ -237,6 +245,9 @@ check_sal_cache_flush (void)
|
||||
u64 vector, cache_type = 3;
|
||||
struct ia64_sal_retval isrv;
|
||||
|
||||
if (sal_cache_flush_drops_interrupts)
|
||||
return;
|
||||
|
||||
cpu = get_cpu();
|
||||
local_irq_save(flags);
|
||||
|
||||
|
||||
@@ -239,6 +239,25 @@ __initcall(register_memory);
|
||||
|
||||
|
||||
#ifdef CONFIG_KEXEC
|
||||
|
||||
/*
|
||||
* This function checks if the reserved crashkernel is allowed on the specific
|
||||
* IA64 machine flavour. Machines without an IO TLB use swiotlb and require
|
||||
* some memory below 4 GB (i.e. in 32 bit area), see the implementation of
|
||||
* lib/swiotlb.c. The hpzx1 architecture has an IO TLB but cannot use that
|
||||
* in kdump case. See the comment in sba_init() in sba_iommu.c.
|
||||
*
|
||||
* So, the only machvec that really supports loading the kdump kernel
|
||||
* over 4 GB is "sn2".
|
||||
*/
|
||||
static int __init check_crashkernel_memory(unsigned long pbase, size_t size)
|
||||
{
|
||||
if (ia64_platform_is("sn2") || ia64_platform_is("uv"))
|
||||
return 1;
|
||||
else
|
||||
return pbase < (1UL << 32);
|
||||
}
|
||||
|
||||
static void __init setup_crashkernel(unsigned long total, int *n)
|
||||
{
|
||||
unsigned long long base = 0, size = 0;
|
||||
@@ -252,6 +271,16 @@ static void __init setup_crashkernel(unsigned long total, int *n)
|
||||
base = kdump_find_rsvd_region(size,
|
||||
rsvd_region, *n);
|
||||
}
|
||||
|
||||
if (!check_crashkernel_memory(base, size)) {
|
||||
pr_warning("crashkernel: There would be kdump memory "
|
||||
"at %ld GB but this is unusable because it "
|
||||
"must\nbe below 4 GB. Change the memory "
|
||||
"configuration of the machine.\n",
|
||||
(unsigned long)(base >> 30));
|
||||
return;
|
||||
}
|
||||
|
||||
if (base != ~0UL) {
|
||||
printk(KERN_INFO "Reserving %ldMB of memory at %ldMB "
|
||||
"for crashkernel (System RAM: %ldMB)\n",
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user