Merge remote-tracking branch 'linux-2.6.32.y/master' into develop
Merge Linux 2.6.32.41 Conflicts: Makefile drivers/mmc/core/core.c drivers/net/wireless/ath/ath9k/ath9k.h drivers/net/wireless/ath/ath9k/hw.c drivers/net/wireless/ath/ath9k/main.c drivers/net/wireless/ath/regd_common.h drivers/net/wireless/b43/dma.c drivers/net/wireless/b43/dma.h drivers/net/wireless/b43/sdio.c drivers/net/wireless/hostap/hostap_cs.c drivers/net/wireless/iwlwifi/iwl-5000.c drivers/net/wireless/iwlwifi/iwl-agn.c drivers/net/wireless/iwlwifi/iwl-helpers.h drivers/net/wireless/iwlwifi/iwl-tx.c drivers/net/wireless/libertas/cmd.c drivers/net/wireless/p54/p54pci.c drivers/net/wireless/p54/p54usb.c drivers/net/wireless/p54/txrx.c drivers/net/wireless/rt2x00/rt2400pci.c drivers/net/wireless/rt2x00/rt2500pci.c drivers/net/wireless/rt2x00/rt2500usb.c drivers/net/wireless/rt2x00/rt2800usb.c drivers/net/wireless/rt2x00/rt2x00.h drivers/net/wireless/rt2x00/rt2x00dev.c drivers/net/wireless/rt2x00/rt2x00queue.c drivers/net/wireless/rt2x00/rt61pci.c drivers/net/wireless/rt2x00/rt73usb.c drivers/usb/serial/option.c mm/shmem.c
This commit is contained in:
commit
7cd3739f32
475 changed files with 5101 additions and 2723 deletions
|
|
@ -100,7 +100,7 @@ static int __devinit usb_hcd_pnx4008_probe(struct platform_device *pdev)
|
|||
(...)
|
||||
i2c_adap = i2c_get_adapter(2);
|
||||
memset(&i2c_info, 0, sizeof(struct i2c_board_info));
|
||||
strlcpy(i2c_info.name, "isp1301_pnx", I2C_NAME_SIZE);
|
||||
strlcpy(i2c_info.type, "isp1301_pnx", I2C_NAME_SIZE);
|
||||
isp1301_i2c_client = i2c_new_probed_device(i2c_adap, &i2c_info,
|
||||
normal_i2c);
|
||||
i2c_put_adapter(i2c_adap);
|
||||
|
|
|
|||
|
|
@ -878,6 +878,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
i8042.panicblink=
|
||||
[HW] Frequency with which keyboard LEDs should blink
|
||||
when kernel panics (default is 0.5 sec)
|
||||
i8042.notimeout [HW] Ignore timeout condition signalled by conroller
|
||||
i8042.reset [HW] Reset the controller during init and cleanup
|
||||
i8042.unlock [HW] Unlock (ignore) the keylock
|
||||
|
||||
|
|
@ -2577,6 +2578,10 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
disables clocksource verification at runtime.
|
||||
Used to enable high-resolution timer mode on older
|
||||
hardware, and in virtualized environment.
|
||||
[x86] noirqtime: Do not use TSC to do irq accounting.
|
||||
Used to run time disable IRQ_TIME_ACCOUNTING on any
|
||||
platforms where RDTSC is slow and this accounting
|
||||
can add overhead.
|
||||
|
||||
turbografx.map[2|3]= [HW,JOY]
|
||||
TurboGraFX parallel port interface
|
||||
|
|
|
|||
|
|
@ -401,4 +401,5 @@ STAC9872
|
|||
Cirrus Logic CS4206/4207
|
||||
========================
|
||||
mbp55 MacBook Pro 5,5
|
||||
imac27 IMac 27 Inch
|
||||
auto BIOS setup (default)
|
||||
|
|
|
|||
|
|
@ -1,12 +1,17 @@
|
|||
/proc/bus/usb filesystem output
|
||||
===============================
|
||||
(version 2003.05.30)
|
||||
(version 2010.09.13)
|
||||
|
||||
|
||||
The usbfs filesystem for USB devices is traditionally mounted at
|
||||
/proc/bus/usb. It provides the /proc/bus/usb/devices file, as well as
|
||||
the /proc/bus/usb/BBB/DDD files.
|
||||
|
||||
In many modern systems the usbfs filsystem isn't used at all. Instead
|
||||
USB device nodes are created under /dev/usb/ or someplace similar. The
|
||||
"devices" file is available in debugfs, typically as
|
||||
/sys/kernel/debug/usb/devices.
|
||||
|
||||
|
||||
**NOTE**: If /proc/bus/usb appears empty, and a host controller
|
||||
driver has been linked, then you need to mount the
|
||||
|
|
@ -106,8 +111,8 @@ Legend:
|
|||
|
||||
Topology info:
|
||||
|
||||
T: Bus=dd Lev=dd Prnt=dd Port=dd Cnt=dd Dev#=ddd Spd=ddd MxCh=dd
|
||||
| | | | | | | | |__MaxChildren
|
||||
T: Bus=dd Lev=dd Prnt=dd Port=dd Cnt=dd Dev#=ddd Spd=dddd MxCh=dd
|
||||
| | | | | | | | |__MaxChildren
|
||||
| | | | | | | |__Device Speed in Mbps
|
||||
| | | | | | |__DeviceNumber
|
||||
| | | | | |__Count of devices at this level
|
||||
|
|
@ -120,8 +125,13 @@ T: Bus=dd Lev=dd Prnt=dd Port=dd Cnt=dd Dev#=ddd Spd=ddd MxCh=dd
|
|||
Speed may be:
|
||||
1.5 Mbit/s for low speed USB
|
||||
12 Mbit/s for full speed USB
|
||||
480 Mbit/s for high speed USB (added for USB 2.0)
|
||||
480 Mbit/s for high speed USB (added for USB 2.0);
|
||||
also used for Wireless USB, which has no fixed speed
|
||||
5000 Mbit/s for SuperSpeed USB (added for USB 3.0)
|
||||
|
||||
For reasons lost in the mists of time, the Port number is always
|
||||
too low by 1. For example, a device plugged into port 4 will
|
||||
show up with "Port=03".
|
||||
|
||||
Bandwidth info:
|
||||
B: Alloc=ddd/ddd us (xx%), #Int=ddd, #Iso=ddd
|
||||
|
|
@ -291,7 +301,7 @@ Here's an example, from a system which has a UHCI root hub,
|
|||
an external hub connected to the root hub, and a mouse and
|
||||
a serial converter connected to the external hub.
|
||||
|
||||
T: Bus=00 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2
|
||||
T: Bus=00 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2
|
||||
B: Alloc= 28/900 us ( 3%), #Int= 2, #Iso= 0
|
||||
D: Ver= 1.00 Cls=09(hub ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
|
||||
P: Vendor=0000 ProdID=0000 Rev= 0.00
|
||||
|
|
@ -301,21 +311,21 @@ C:* #Ifs= 1 Cfg#= 1 Atr=40 MxPwr= 0mA
|
|||
I: If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub
|
||||
E: Ad=81(I) Atr=03(Int.) MxPS= 8 Ivl=255ms
|
||||
|
||||
T: Bus=00 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=12 MxCh= 4
|
||||
T: Bus=00 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=12 MxCh= 4
|
||||
D: Ver= 1.00 Cls=09(hub ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
|
||||
P: Vendor=0451 ProdID=1446 Rev= 1.00
|
||||
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=100mA
|
||||
I: If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub
|
||||
E: Ad=81(I) Atr=03(Int.) MxPS= 1 Ivl=255ms
|
||||
|
||||
T: Bus=00 Lev=02 Prnt=02 Port=00 Cnt=01 Dev#= 3 Spd=1.5 MxCh= 0
|
||||
T: Bus=00 Lev=02 Prnt=02 Port=00 Cnt=01 Dev#= 3 Spd=1.5 MxCh= 0
|
||||
D: Ver= 1.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
|
||||
P: Vendor=04b4 ProdID=0001 Rev= 0.00
|
||||
C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=100mA
|
||||
I: If#= 0 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=01 Prot=02 Driver=mouse
|
||||
E: Ad=81(I) Atr=03(Int.) MxPS= 3 Ivl= 10ms
|
||||
|
||||
T: Bus=00 Lev=02 Prnt=02 Port=02 Cnt=02 Dev#= 4 Spd=12 MxCh= 0
|
||||
T: Bus=00 Lev=02 Prnt=02 Port=02 Cnt=02 Dev#= 4 Spd=12 MxCh= 0
|
||||
D: Ver= 1.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
|
||||
P: Vendor=0565 ProdID=0001 Rev= 1.08
|
||||
S: Manufacturer=Peracom Networks, Inc.
|
||||
|
|
@ -330,12 +340,12 @@ E: Ad=82(I) Atr=03(Int.) MxPS= 8 Ivl= 8ms
|
|||
Selecting only the "T:" and "I:" lines from this (for example, by using
|
||||
"procusb ti"), we have:
|
||||
|
||||
T: Bus=00 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2
|
||||
T: Bus=00 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=12 MxCh= 4
|
||||
T: Bus=00 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2
|
||||
T: Bus=00 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=12 MxCh= 4
|
||||
I: If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hub
|
||||
T: Bus=00 Lev=02 Prnt=02 Port=00 Cnt=01 Dev#= 3 Spd=1.5 MxCh= 0
|
||||
T: Bus=00 Lev=02 Prnt=02 Port=00 Cnt=01 Dev#= 3 Spd=1.5 MxCh= 0
|
||||
I: If#= 0 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=01 Prot=02 Driver=mouse
|
||||
T: Bus=00 Lev=02 Prnt=02 Port=02 Cnt=02 Dev#= 4 Spd=12 MxCh= 0
|
||||
T: Bus=00 Lev=02 Prnt=02 Port=02 Cnt=02 Dev#= 4 Spd=12 MxCh= 0
|
||||
I: If#= 0 Alt= 0 #EPs= 3 Cls=00(>ifc ) Sub=00 Prot=00 Driver=serial
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -5010,7 +5010,6 @@ F: arch/alpha/kernel/srm_env.c
|
|||
|
||||
STABLE BRANCH
|
||||
M: Greg Kroah-Hartman <greg@kroah.com>
|
||||
M: Chris Wright <chrisw@sous-sol.org>
|
||||
L: stable@kernel.org
|
||||
S: Maintained
|
||||
|
||||
|
|
|
|||
|
|
@ -389,7 +389,9 @@ setup_return(struct pt_regs *regs, struct k_sigaction *ka,
|
|||
unsigned long handler = (unsigned long)ka->sa.sa_handler;
|
||||
unsigned long retcode;
|
||||
int thumb = 0;
|
||||
unsigned long cpsr = regs->ARM_cpsr & ~PSR_f;
|
||||
unsigned long cpsr = regs->ARM_cpsr & ~(PSR_f | PSR_E_BIT);
|
||||
|
||||
cpsr |= PSR_ENDSTATE;
|
||||
|
||||
/*
|
||||
* Maybe we need to deliver a 32-bit signal to a 26-bit task.
|
||||
|
|
|
|||
|
|
@ -311,7 +311,7 @@ asmlinkage long sys_oabi_semtimedop(int semid,
|
|||
long err;
|
||||
int i;
|
||||
|
||||
if (nsops < 1)
|
||||
if (nsops < 1 || nsops > SEMOPM)
|
||||
return -EINVAL;
|
||||
sops = kmalloc(sizeof(*sops) * nsops, GFP_KERNEL);
|
||||
if (!sops)
|
||||
|
|
|
|||
|
|
@ -281,10 +281,6 @@ void cpu_idle_wait(void);
|
|||
|
||||
void default_idle(void);
|
||||
|
||||
#ifdef CONFIG_VIRT_CPU_ACCOUNTING
|
||||
extern void account_system_vtime(struct task_struct *);
|
||||
#endif
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
|
|
|||
|
|
@ -1850,7 +1850,8 @@ ia64_mca_cpu_init(void *cpu_data)
|
|||
data = mca_bootmem();
|
||||
first_time = 0;
|
||||
} else
|
||||
data = __get_free_pages(GFP_KERNEL, get_order(sz));
|
||||
data = (void *)__get_free_pages(GFP_KERNEL,
|
||||
get_order(sz));
|
||||
if (!data)
|
||||
panic("Could not allocate MCA memory for cpu %d\n",
|
||||
cpu);
|
||||
|
|
|
|||
|
|
@ -517,7 +517,7 @@ tioca_dma_unmap(struct pci_dev *pdev, dma_addr_t bus_addr, int dir)
|
|||
* use the GART mapped mode.
|
||||
*/
|
||||
static u64
|
||||
tioca_dma_map(struct pci_dev *pdev, u64 paddr, size_t byte_count, int dma_flags)
|
||||
tioca_dma_map(struct pci_dev *pdev, unsigned long paddr, size_t byte_count, int dma_flags)
|
||||
{
|
||||
u64 mapaddr;
|
||||
|
||||
|
|
|
|||
|
|
@ -299,6 +299,8 @@ void __init paging_init(void)
|
|||
zones_size[ZONE_DMA] = m68k_memory[i].size >> PAGE_SHIFT;
|
||||
free_area_init_node(i, zones_size,
|
||||
m68k_memory[i].addr >> PAGE_SHIFT, NULL);
|
||||
if (node_present_pages(i))
|
||||
node_set_state(i, N_NORMAL_MEMORY);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -28,6 +28,8 @@
|
|||
#include <linux/mtd/physmap.h>
|
||||
#include <mtd/mtd-abi.h>
|
||||
|
||||
#include <asm/mach-au1x00/au1xxx_eth.h>
|
||||
|
||||
static struct gpio_keys_button mtx1_gpio_button[] = {
|
||||
{
|
||||
.gpio = 207,
|
||||
|
|
@ -140,10 +142,17 @@ static struct __initdata platform_device * mtx1_devs[] = {
|
|||
&mtx1_mtd,
|
||||
};
|
||||
|
||||
static struct au1000_eth_platform_data mtx1_au1000_eth0_pdata = {
|
||||
.phy_search_highest_addr = 1,
|
||||
.phy1_search_mac0 = 1,
|
||||
};
|
||||
|
||||
static int __init mtx1_register_devices(void)
|
||||
{
|
||||
int rc;
|
||||
|
||||
au1xxx_override_eth_cfg(0, &mtx1_au1000_eth0_pdata);
|
||||
|
||||
rc = gpio_request(mtx1_gpio_button[0].gpio,
|
||||
mtx1_gpio_button[0].desc);
|
||||
if (rc < 0) {
|
||||
|
|
|
|||
|
|
@ -43,27 +43,39 @@ static inline int cpu_is_noncoherent_r10000(struct device *dev)
|
|||
|
||||
static gfp_t massage_gfp_flags(const struct device *dev, gfp_t gfp)
|
||||
{
|
||||
gfp_t dma_flag;
|
||||
|
||||
/* ignore region specifiers */
|
||||
gfp &= ~(__GFP_DMA | __GFP_DMA32 | __GFP_HIGHMEM);
|
||||
|
||||
#ifdef CONFIG_ZONE_DMA
|
||||
#ifdef CONFIG_ISA
|
||||
if (dev == NULL)
|
||||
gfp |= __GFP_DMA;
|
||||
else if (dev->coherent_dma_mask < DMA_BIT_MASK(24))
|
||||
gfp |= __GFP_DMA;
|
||||
dma_flag = __GFP_DMA;
|
||||
else
|
||||
#endif
|
||||
#ifdef CONFIG_ZONE_DMA32
|
||||
#if defined(CONFIG_ZONE_DMA32) && defined(CONFIG_ZONE_DMA)
|
||||
if (dev->coherent_dma_mask < DMA_BIT_MASK(32))
|
||||
gfp |= __GFP_DMA32;
|
||||
dma_flag = __GFP_DMA;
|
||||
else if (dev->coherent_dma_mask < DMA_BIT_MASK(64))
|
||||
dma_flag = __GFP_DMA32;
|
||||
else
|
||||
#endif
|
||||
;
|
||||
#if defined(CONFIG_ZONE_DMA32) && !defined(CONFIG_ZONE_DMA)
|
||||
if (dev->coherent_dma_mask < DMA_BIT_MASK(64))
|
||||
dma_flag = __GFP_DMA32;
|
||||
else
|
||||
#endif
|
||||
#if defined(CONFIG_ZONE_DMA) && !defined(CONFIG_ZONE_DMA32)
|
||||
if (dev->coherent_dma_mask < DMA_BIT_MASK(64))
|
||||
dma_flag = __GFP_DMA;
|
||||
else
|
||||
#endif
|
||||
dma_flag = 0;
|
||||
|
||||
/* Don't invoke OOM killer */
|
||||
gfp |= __GFP_NORETRY;
|
||||
|
||||
return gfp;
|
||||
return gfp | dma_flag;
|
||||
}
|
||||
|
||||
void *dma_alloc_noncoherent(struct device *dev, size_t size,
|
||||
|
|
|
|||
|
|
@ -1126,15 +1126,13 @@ int pdc_iodc_print(const unsigned char *str, unsigned count)
|
|||
unsigned int i;
|
||||
unsigned long flags;
|
||||
|
||||
for (i = 0; i < count && i < 79;) {
|
||||
for (i = 0; i < count;) {
|
||||
switch(str[i]) {
|
||||
case '\n':
|
||||
iodc_dbuf[i+0] = '\r';
|
||||
iodc_dbuf[i+1] = '\n';
|
||||
i += 2;
|
||||
goto print;
|
||||
case '\b': /* BS */
|
||||
i--; /* overwrite last */
|
||||
default:
|
||||
iodc_dbuf[i] = str[i];
|
||||
i++;
|
||||
|
|
@ -1142,15 +1140,6 @@ int pdc_iodc_print(const unsigned char *str, unsigned count)
|
|||
}
|
||||
}
|
||||
|
||||
/* if we're at the end of line, and not already inserting a newline,
|
||||
* insert one anyway. iodc console doesn't claim to support >79 char
|
||||
* lines. don't account for this in the return value.
|
||||
*/
|
||||
if (i == 79 && iodc_dbuf[i-1] != '\n') {
|
||||
iodc_dbuf[i+0] = '\r';
|
||||
iodc_dbuf[i+1] = '\n';
|
||||
}
|
||||
|
||||
print:
|
||||
spin_lock_irqsave(&pdc_lock, flags);
|
||||
real32_call(PAGE0->mem_cons.iodc_io,
|
||||
|
|
|
|||
|
|
@ -117,7 +117,7 @@ int cpu_check_affinity(unsigned int irq, const struct cpumask *dest)
|
|||
int cpu_dest;
|
||||
|
||||
/* timer and ipi have to always be received on all CPUs */
|
||||
if (CHECK_IRQ_PER_CPU(irq)) {
|
||||
if (CHECK_IRQ_PER_CPU(irq_to_desc(irq)->status)) {
|
||||
/* Bad linux design decision. The mask has already
|
||||
* been set; we must reset it */
|
||||
cpumask_setall(irq_desc[irq].affinity);
|
||||
|
|
|
|||
|
|
@ -265,8 +265,10 @@ static void __init setup_bootmem(void)
|
|||
}
|
||||
memset(pfnnid_map, 0xff, sizeof(pfnnid_map));
|
||||
|
||||
for (i = 0; i < npmem_ranges; i++)
|
||||
for (i = 0; i < npmem_ranges; i++) {
|
||||
node_set_state(i, N_NORMAL_MEMORY);
|
||||
node_set_online(i);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -364,7 +364,7 @@ INSTALL := install
|
|||
extra-installed := $(patsubst $(obj)/%, $(DESTDIR)$(WRAPPER_OBJDIR)/%, $(extra-y))
|
||||
hostprogs-installed := $(patsubst %, $(DESTDIR)$(WRAPPER_BINDIR)/%, $(hostprogs-y))
|
||||
wrapper-installed := $(DESTDIR)$(WRAPPER_BINDIR)/wrapper
|
||||
dts-installed := $(patsubst $(obj)/dts/%, $(DESTDIR)$(WRAPPER_DTSDIR)/%, $(wildcard $(obj)/dts/*.dts))
|
||||
dts-installed := $(patsubst $(dtstree)/%, $(DESTDIR)$(WRAPPER_DTSDIR)/%, $(wildcard $(dtstree)/*.dts))
|
||||
|
||||
all-installed := $(extra-installed) $(hostprogs-installed) $(wrapper-installed) $(dts-installed)
|
||||
|
||||
|
|
|
|||
|
|
@ -268,6 +268,7 @@ long plpar_hcall_raw(unsigned long opcode, unsigned long *retbuf, ...);
|
|||
*/
|
||||
#define PLPAR_HCALL9_BUFSIZE 9
|
||||
long plpar_hcall9(unsigned long opcode, unsigned long *retbuf, ...);
|
||||
long plpar_hcall9_raw(unsigned long opcode, unsigned long *retbuf, ...);
|
||||
|
||||
/* For hcall instrumentation. One structure per-hcall, per-CPU */
|
||||
struct hcall_stats {
|
||||
|
|
|
|||
|
|
@ -31,6 +31,10 @@
|
|||
#define KEXEC_ARCH KEXEC_ARCH_PPC
|
||||
#endif
|
||||
|
||||
#define KEXEC_STATE_NONE 0
|
||||
#define KEXEC_STATE_IRQS_OFF 1
|
||||
#define KEXEC_STATE_REAL_MODE 2
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#include <linux/cpumask.h>
|
||||
#include <asm/reg.h>
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ struct paca_struct {
|
|||
struct lppaca *lppaca_ptr; /* Pointer to LpPaca for PLIC */
|
||||
#endif /* CONFIG_PPC_BOOK3S */
|
||||
/*
|
||||
* MAGIC: the spinlock functions in arch/powerpc/lib/locks.c
|
||||
* MAGIC: the spinlock functions in arch/powerpc/lib/locks.c
|
||||
* load lock_token and paca_index with a single lwz
|
||||
* instruction. They must travel together and be properly
|
||||
* aligned.
|
||||
|
|
@ -76,6 +76,7 @@ struct paca_struct {
|
|||
s16 hw_cpu_id; /* Physical processor number */
|
||||
u8 cpu_start; /* At startup, processor spins until */
|
||||
/* this becomes non-zero. */
|
||||
u8 kexec_state; /* set when kexec down has irqs off */
|
||||
#ifdef CONFIG_PPC_STD_MMU_64
|
||||
struct slb_shadow *slb_shadow_ptr;
|
||||
|
||||
|
|
|
|||
|
|
@ -858,6 +858,7 @@
|
|||
#define PV_970 0x0039
|
||||
#define PV_POWER5 0x003A
|
||||
#define PV_POWER5p 0x003B
|
||||
#define PV_POWER7 0x003F
|
||||
#define PV_970FX 0x003C
|
||||
#define PV_630 0x0040
|
||||
#define PV_630p 0x0041
|
||||
|
|
|
|||
|
|
@ -540,10 +540,6 @@ extern void reloc_got2(unsigned long);
|
|||
|
||||
#define PTRRELOC(x) ((typeof(x)) add_reloc_offset((unsigned long)(x)))
|
||||
|
||||
#ifdef CONFIG_VIRT_CPU_ACCOUNTING
|
||||
extern void account_system_vtime(struct task_struct *);
|
||||
#endif
|
||||
|
||||
extern struct dentry *powerpc_debugfs_root;
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
|
|
|||
|
|
@ -183,6 +183,7 @@ int main(void)
|
|||
#endif /* CONFIG_PPC_STD_MMU_64 */
|
||||
DEFINE(PACAEMERGSP, offsetof(struct paca_struct, emergency_sp));
|
||||
DEFINE(PACAHWCPUID, offsetof(struct paca_struct, hw_cpu_id));
|
||||
DEFINE(PACAKEXECSTATE, offsetof(struct paca_struct, kexec_state));
|
||||
DEFINE(PACA_STARTPURR, offsetof(struct paca_struct, startpurr));
|
||||
DEFINE(PACA_STARTSPURR, offsetof(struct paca_struct, startspurr));
|
||||
DEFINE(PACA_USER_TIME, offsetof(struct paca_struct, user_time));
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@
|
|||
#include <asm/mmu.h>
|
||||
|
||||
_GLOBAL(__setup_cpu_603)
|
||||
mflr r4
|
||||
mflr r5
|
||||
BEGIN_MMU_FTR_SECTION
|
||||
li r10,0
|
||||
mtspr SPRN_SPRG_603_LRU,r10 /* init SW LRU tracking */
|
||||
|
|
@ -27,60 +27,60 @@ BEGIN_FTR_SECTION
|
|||
bl __init_fpu_registers
|
||||
END_FTR_SECTION_IFCLR(CPU_FTR_FPU_UNAVAILABLE)
|
||||
bl setup_common_caches
|
||||
mtlr r4
|
||||
mtlr r5
|
||||
blr
|
||||
_GLOBAL(__setup_cpu_604)
|
||||
mflr r4
|
||||
mflr r5
|
||||
bl setup_common_caches
|
||||
bl setup_604_hid0
|
||||
mtlr r4
|
||||
mtlr r5
|
||||
blr
|
||||
_GLOBAL(__setup_cpu_750)
|
||||
mflr r4
|
||||
mflr r5
|
||||
bl __init_fpu_registers
|
||||
bl setup_common_caches
|
||||
bl setup_750_7400_hid0
|
||||
mtlr r4
|
||||
mtlr r5
|
||||
blr
|
||||
_GLOBAL(__setup_cpu_750cx)
|
||||
mflr r4
|
||||
mflr r5
|
||||
bl __init_fpu_registers
|
||||
bl setup_common_caches
|
||||
bl setup_750_7400_hid0
|
||||
bl setup_750cx
|
||||
mtlr r4
|
||||
mtlr r5
|
||||
blr
|
||||
_GLOBAL(__setup_cpu_750fx)
|
||||
mflr r4
|
||||
mflr r5
|
||||
bl __init_fpu_registers
|
||||
bl setup_common_caches
|
||||
bl setup_750_7400_hid0
|
||||
bl setup_750fx
|
||||
mtlr r4
|
||||
mtlr r5
|
||||
blr
|
||||
_GLOBAL(__setup_cpu_7400)
|
||||
mflr r4
|
||||
mflr r5
|
||||
bl __init_fpu_registers
|
||||
bl setup_7400_workarounds
|
||||
bl setup_common_caches
|
||||
bl setup_750_7400_hid0
|
||||
mtlr r4
|
||||
mtlr r5
|
||||
blr
|
||||
_GLOBAL(__setup_cpu_7410)
|
||||
mflr r4
|
||||
mflr r5
|
||||
bl __init_fpu_registers
|
||||
bl setup_7410_workarounds
|
||||
bl setup_common_caches
|
||||
bl setup_750_7400_hid0
|
||||
li r3,0
|
||||
mtspr SPRN_L2CR2,r3
|
||||
mtlr r4
|
||||
mtlr r5
|
||||
blr
|
||||
_GLOBAL(__setup_cpu_745x)
|
||||
mflr r4
|
||||
mflr r5
|
||||
bl setup_common_caches
|
||||
bl setup_745x_specifics
|
||||
mtlr r4
|
||||
mtlr r5
|
||||
blr
|
||||
|
||||
/* Enable caches for 603's, 604, 750 & 7400 */
|
||||
|
|
@ -194,10 +194,10 @@ setup_750cx:
|
|||
cror 4*cr0+eq,4*cr0+eq,4*cr1+eq
|
||||
cror 4*cr0+eq,4*cr0+eq,4*cr2+eq
|
||||
bnelr
|
||||
lwz r6,CPU_SPEC_FEATURES(r5)
|
||||
lwz r6,CPU_SPEC_FEATURES(r4)
|
||||
li r7,CPU_FTR_CAN_NAP
|
||||
andc r6,r6,r7
|
||||
stw r6,CPU_SPEC_FEATURES(r5)
|
||||
stw r6,CPU_SPEC_FEATURES(r4)
|
||||
blr
|
||||
|
||||
/* 750fx specific
|
||||
|
|
@ -225,12 +225,12 @@ BEGIN_FTR_SECTION
|
|||
andis. r11,r11,L3CR_L3E@h
|
||||
beq 1f
|
||||
END_FTR_SECTION_IFSET(CPU_FTR_L3CR)
|
||||
lwz r6,CPU_SPEC_FEATURES(r5)
|
||||
lwz r6,CPU_SPEC_FEATURES(r4)
|
||||
andi. r0,r6,CPU_FTR_L3_DISABLE_NAP
|
||||
beq 1f
|
||||
li r7,CPU_FTR_CAN_NAP
|
||||
andc r6,r6,r7
|
||||
stw r6,CPU_SPEC_FEATURES(r5)
|
||||
stw r6,CPU_SPEC_FEATURES(r4)
|
||||
1:
|
||||
mfspr r11,SPRN_HID0
|
||||
|
||||
|
|
|
|||
|
|
@ -162,6 +162,34 @@ static void crash_kexec_prepare_cpus(int cpu)
|
|||
/* Leave the IPI callback set */
|
||||
}
|
||||
|
||||
/* wait for all the CPUs to hit real mode but timeout if they don't come in */
|
||||
#ifdef CONFIG_PPC_STD_MMU_64
|
||||
static void crash_kexec_wait_realmode(int cpu)
|
||||
{
|
||||
unsigned int msecs;
|
||||
int i;
|
||||
|
||||
msecs = 10000;
|
||||
for (i=0; i < NR_CPUS && msecs > 0; i++) {
|
||||
if (i == cpu)
|
||||
continue;
|
||||
|
||||
while (paca[i].kexec_state < KEXEC_STATE_REAL_MODE) {
|
||||
barrier();
|
||||
if (!cpu_possible(i)) {
|
||||
break;
|
||||
}
|
||||
if (!cpu_online(i)) {
|
||||
break;
|
||||
}
|
||||
msecs--;
|
||||
mdelay(1);
|
||||
}
|
||||
}
|
||||
mb();
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* This function will be called by secondary cpus or by kexec cpu
|
||||
* if soft-reset is activated to stop some CPUs.
|
||||
|
|
@ -347,10 +375,12 @@ int crash_shutdown_unregister(crash_shutdown_t handler)
|
|||
EXPORT_SYMBOL(crash_shutdown_unregister);
|
||||
|
||||
static unsigned long crash_shutdown_buf[JMP_BUF_LEN];
|
||||
static int crash_shutdown_cpu = -1;
|
||||
|
||||
static int handle_fault(struct pt_regs *regs)
|
||||
{
|
||||
longjmp(crash_shutdown_buf, 1);
|
||||
if (crash_shutdown_cpu == smp_processor_id())
|
||||
longjmp(crash_shutdown_buf, 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -375,11 +405,14 @@ void default_machine_crash_shutdown(struct pt_regs *regs)
|
|||
for_each_irq(i) {
|
||||
struct irq_desc *desc = irq_desc + i;
|
||||
|
||||
if (!desc || !desc->chip || !desc->chip->eoi)
|
||||
continue;
|
||||
|
||||
if (desc->status & IRQ_INPROGRESS)
|
||||
desc->chip->eoi(i);
|
||||
|
||||
if (!(desc->status & IRQ_DISABLED))
|
||||
desc->chip->disable(i);
|
||||
desc->chip->shutdown(i);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -388,6 +421,7 @@ void default_machine_crash_shutdown(struct pt_regs *regs)
|
|||
*/
|
||||
old_handler = __debugger_fault_handler;
|
||||
__debugger_fault_handler = handle_fault;
|
||||
crash_shutdown_cpu = smp_processor_id();
|
||||
for (i = 0; crash_shutdown_handles[i]; i++) {
|
||||
if (setjmp(crash_shutdown_buf) == 0) {
|
||||
/*
|
||||
|
|
@ -401,6 +435,7 @@ void default_machine_crash_shutdown(struct pt_regs *regs)
|
|||
asm volatile("sync; isync");
|
||||
}
|
||||
}
|
||||
crash_shutdown_cpu = -1;
|
||||
__debugger_fault_handler = old_handler;
|
||||
|
||||
/*
|
||||
|
|
@ -412,6 +447,9 @@ void default_machine_crash_shutdown(struct pt_regs *regs)
|
|||
crash_kexec_prepare_cpus(crashing_cpu);
|
||||
cpu_set(crashing_cpu, cpus_in_crash);
|
||||
crash_kexec_stop_spus();
|
||||
#if defined(CONFIG_PPC_STD_MMU_64) && defined(CONFIG_SMP)
|
||||
crash_kexec_wait_realmode(crashing_cpu);
|
||||
#endif
|
||||
if (ppc_md.kexec_cpu_down)
|
||||
ppc_md.kexec_cpu_down(1, 0);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@
|
|||
#include <linux/thread_info.h>
|
||||
#include <linux/init_task.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/cpu.h>
|
||||
|
||||
#include <asm/page.h>
|
||||
#include <asm/current.h>
|
||||
|
|
@ -155,33 +156,62 @@ void kexec_copy_flush(struct kimage *image)
|
|||
|
||||
#ifdef CONFIG_SMP
|
||||
|
||||
/* FIXME: we should schedule this function to be called on all cpus based
|
||||
* on calling the interrupts, but we would like to call it off irq level
|
||||
* so that the interrupt controller is clean.
|
||||
*/
|
||||
static int kexec_all_irq_disabled;
|
||||
|
||||
static void kexec_smp_down(void *arg)
|
||||
{
|
||||
local_irq_disable();
|
||||
mb(); /* make sure our irqs are disabled before we say they are */
|
||||
get_paca()->kexec_state = KEXEC_STATE_IRQS_OFF;
|
||||
while (kexec_all_irq_disabled == 0)
|
||||
cpu_relax();
|
||||
mb(); /* make sure all irqs are disabled before this */
|
||||
/*
|
||||
* Now every CPU has IRQs off, we can clear out any pending
|
||||
* IPIs and be sure that no more will come in after this.
|
||||
*/
|
||||
if (ppc_md.kexec_cpu_down)
|
||||
ppc_md.kexec_cpu_down(0, 1);
|
||||
|
||||
local_irq_disable();
|
||||
kexec_smp_wait();
|
||||
/* NOTREACHED */
|
||||
}
|
||||
|
||||
static void kexec_prepare_cpus(void)
|
||||
/*
|
||||
* We need to make sure each present CPU is online. The next kernel will scan
|
||||
* the device tree and assume primary threads are online and query secondary
|
||||
* threads via RTAS to online them if required. If we don't online primary
|
||||
* threads, they will be stuck. However, we also online secondary threads as we
|
||||
* may be using 'cede offline'. In this case RTAS doesn't see the secondary
|
||||
* threads as offline -- and again, these CPUs will be stuck.
|
||||
*
|
||||
* So, we online all CPUs that should be running, including secondary threads.
|
||||
*/
|
||||
static void wake_offline_cpus(void)
|
||||
{
|
||||
int cpu = 0;
|
||||
|
||||
for_each_present_cpu(cpu) {
|
||||
if (!cpu_online(cpu)) {
|
||||
printk(KERN_INFO "kexec: Waking offline cpu %d.\n",
|
||||
cpu);
|
||||
cpu_up(cpu);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void kexec_prepare_cpus_wait(int wait_state)
|
||||
{
|
||||
int my_cpu, i, notified=-1;
|
||||
|
||||
smp_call_function(kexec_smp_down, NULL, /* wait */0);
|
||||
wake_offline_cpus();
|
||||
my_cpu = get_cpu();
|
||||
|
||||
/* check the others cpus are now down (via paca hw cpu id == -1) */
|
||||
/* Make sure each CPU has atleast made it to the state we need */
|
||||
for (i=0; i < NR_CPUS; i++) {
|
||||
if (i == my_cpu)
|
||||
continue;
|
||||
|
||||
while (paca[i].hw_cpu_id != -1) {
|
||||
while (paca[i].kexec_state < wait_state) {
|
||||
barrier();
|
||||
if (!cpu_possible(i)) {
|
||||
printk("kexec: cpu %d hw_cpu_id %d is not"
|
||||
|
|
@ -201,20 +231,35 @@ static void kexec_prepare_cpus(void)
|
|||
}
|
||||
if (i != notified) {
|
||||
printk( "kexec: waiting for cpu %d (physical"
|
||||
" %d) to go down\n",
|
||||
i, paca[i].hw_cpu_id);
|
||||
" %d) to enter %i state\n",
|
||||
i, paca[i].hw_cpu_id, wait_state);
|
||||
notified = i;
|
||||
}
|
||||
}
|
||||
}
|
||||
mb();
|
||||
}
|
||||
|
||||
static void kexec_prepare_cpus(void)
|
||||
{
|
||||
|
||||
smp_call_function(kexec_smp_down, NULL, /* wait */0);
|
||||
local_irq_disable();
|
||||
mb(); /* make sure IRQs are disabled before we say they are */
|
||||
get_paca()->kexec_state = KEXEC_STATE_IRQS_OFF;
|
||||
|
||||
kexec_prepare_cpus_wait(KEXEC_STATE_IRQS_OFF);
|
||||
/* we are sure every CPU has IRQs off at this point */
|
||||
kexec_all_irq_disabled = 1;
|
||||
|
||||
/* after we tell the others to go down */
|
||||
if (ppc_md.kexec_cpu_down)
|
||||
ppc_md.kexec_cpu_down(0, 0);
|
||||
|
||||
put_cpu();
|
||||
/* Before removing MMU mapings make sure all CPUs have entered real mode */
|
||||
kexec_prepare_cpus_wait(KEXEC_STATE_REAL_MODE);
|
||||
|
||||
local_irq_disable();
|
||||
put_cpu();
|
||||
}
|
||||
|
||||
#else /* ! SMP */
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@
|
|||
#include <asm/asm-offsets.h>
|
||||
#include <asm/cputable.h>
|
||||
#include <asm/thread_info.h>
|
||||
#include <asm/kexec.h>
|
||||
|
||||
.text
|
||||
|
||||
|
|
@ -471,6 +472,10 @@ _GLOBAL(kexec_wait)
|
|||
1: mflr r5
|
||||
addi r5,r5,kexec_flag-1b
|
||||
|
||||
li r4,KEXEC_STATE_REAL_MODE
|
||||
stb r4,PACAKEXECSTATE(r13)
|
||||
SYNC
|
||||
|
||||
99: HMT_LOW
|
||||
#ifdef CONFIG_KEXEC /* use no memory without kexec */
|
||||
lwz r4,0(r5)
|
||||
|
|
@ -494,14 +499,11 @@ kexec_flag:
|
|||
* note: this is a terminal routine, it does not save lr
|
||||
*
|
||||
* get phys id from paca
|
||||
* set paca id to -1 to say we got here
|
||||
* switch to real mode
|
||||
* join other cpus in kexec_wait(phys_id)
|
||||
*/
|
||||
_GLOBAL(kexec_smp_wait)
|
||||
lhz r3,PACAHWCPUID(r13)
|
||||
li r4,-1
|
||||
sth r4,PACAHWCPUID(r13) /* let others know we left */
|
||||
bl real_mode
|
||||
b .kexec_wait
|
||||
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@
|
|||
#include <asm/paca.h>
|
||||
#include <asm/sections.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/kexec.h>
|
||||
|
||||
/* This symbol is provided by the linker - let it fill in the paca
|
||||
* field correctly */
|
||||
|
|
@ -97,6 +98,7 @@ void __init initialise_pacas(void)
|
|||
new_paca->kernelbase = (unsigned long) _stext;
|
||||
new_paca->kernel_msr = MSR_KERNEL;
|
||||
new_paca->hw_cpu_id = 0xffff;
|
||||
new_paca->kexec_state = KEXEC_STATE_NONE;
|
||||
new_paca->__current = &init_task;
|
||||
#ifdef CONFIG_PPC_STD_MMU_64
|
||||
new_paca->slb_shadow_ptr = &slb_shadow[cpu];
|
||||
|
|
|
|||
|
|
@ -1220,6 +1220,28 @@ unsigned long perf_instruction_pointer(struct pt_regs *regs)
|
|||
return ip;
|
||||
}
|
||||
|
||||
static bool pmc_overflow(unsigned long val)
|
||||
{
|
||||
if ((int)val < 0)
|
||||
return true;
|
||||
|
||||
/*
|
||||
* Events on POWER7 can roll back if a speculative event doesn't
|
||||
* eventually complete. Unfortunately in some rare cases they will
|
||||
* raise a performance monitor exception. We need to catch this to
|
||||
* ensure we reset the PMC. In all cases the PMC will be 256 or less
|
||||
* cycles from overflow.
|
||||
*
|
||||
* We only do this if the first pass fails to find any overflowing
|
||||
* PMCs because a user might set a period of less than 256 and we
|
||||
* don't want to mistakenly reset them.
|
||||
*/
|
||||
if (__is_processor(PV_POWER7) && ((0x80000000 - val) <= 256))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Performance monitor interrupt stuff
|
||||
*/
|
||||
|
|
@ -1267,7 +1289,7 @@ static void perf_event_interrupt(struct pt_regs *regs)
|
|||
if (is_limited_pmc(i + 1))
|
||||
continue;
|
||||
val = read_pmc(i + 1);
|
||||
if ((int)val < 0)
|
||||
if (pmc_overflow(val))
|
||||
write_pmc(i + 1, 0);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -93,12 +93,8 @@ struct flash_block_list {
|
|||
struct flash_block_list *next;
|
||||
struct flash_block blocks[FLASH_BLOCKS_PER_NODE];
|
||||
};
|
||||
struct flash_block_list_header { /* just the header of flash_block_list */
|
||||
unsigned long num_blocks;
|
||||
struct flash_block_list *next;
|
||||
};
|
||||
|
||||
static struct flash_block_list_header rtas_firmware_flash_list = {0, NULL};
|
||||
static struct flash_block_list *rtas_firmware_flash_list;
|
||||
|
||||
/* Use slab cache to guarantee 4k alignment */
|
||||
static struct kmem_cache *flash_block_cache = NULL;
|
||||
|
|
@ -107,13 +103,14 @@ static struct kmem_cache *flash_block_cache = NULL;
|
|||
|
||||
/* Local copy of the flash block list.
|
||||
* We only allow one open of the flash proc file and create this
|
||||
* list as we go. This list will be put in the
|
||||
* rtas_firmware_flash_list var once it is fully read.
|
||||
* list as we go. The rtas_firmware_flash_list varable will be
|
||||
* set once the data is fully read.
|
||||
*
|
||||
* For convenience as we build the list we use virtual addrs,
|
||||
* we do not fill in the version number, and the length field
|
||||
* is treated as the number of entries currently in the block
|
||||
* (i.e. not a byte count). This is all fixed on release.
|
||||
* (i.e. not a byte count). This is all fixed when calling
|
||||
* the flash routine.
|
||||
*/
|
||||
|
||||
/* Status int must be first member of struct */
|
||||
|
|
@ -200,16 +197,16 @@ static int rtas_flash_release(struct inode *inode, struct file *file)
|
|||
if (uf->flist) {
|
||||
/* File was opened in write mode for a new flash attempt */
|
||||
/* Clear saved list */
|
||||
if (rtas_firmware_flash_list.next) {
|
||||
free_flash_list(rtas_firmware_flash_list.next);
|
||||
rtas_firmware_flash_list.next = NULL;
|
||||
if (rtas_firmware_flash_list) {
|
||||
free_flash_list(rtas_firmware_flash_list);
|
||||
rtas_firmware_flash_list = NULL;
|
||||
}
|
||||
|
||||
if (uf->status != FLASH_AUTH)
|
||||
uf->status = flash_list_valid(uf->flist);
|
||||
|
||||
if (uf->status == FLASH_IMG_READY)
|
||||
rtas_firmware_flash_list.next = uf->flist;
|
||||
rtas_firmware_flash_list = uf->flist;
|
||||
else
|
||||
free_flash_list(uf->flist);
|
||||
|
||||
|
|
@ -592,7 +589,7 @@ static void rtas_flash_firmware(int reboot_type)
|
|||
unsigned long rtas_block_list;
|
||||
int i, status, update_token;
|
||||
|
||||
if (rtas_firmware_flash_list.next == NULL)
|
||||
if (rtas_firmware_flash_list == NULL)
|
||||
return; /* nothing to do */
|
||||
|
||||
if (reboot_type != SYS_RESTART) {
|
||||
|
|
@ -609,20 +606,25 @@ static void rtas_flash_firmware(int reboot_type)
|
|||
return;
|
||||
}
|
||||
|
||||
/* NOTE: the "first" block list is a global var with no data
|
||||
* blocks in the kernel data segment. We do this because
|
||||
* we want to ensure this block_list addr is under 4GB.
|
||||
/*
|
||||
* NOTE: the "first" block must be under 4GB, so we create
|
||||
* an entry with no data blocks in the reserved buffer in
|
||||
* the kernel data segment.
|
||||
*/
|
||||
rtas_firmware_flash_list.num_blocks = 0;
|
||||
flist = (struct flash_block_list *)&rtas_firmware_flash_list;
|
||||
spin_lock(&rtas_data_buf_lock);
|
||||
flist = (struct flash_block_list *)&rtas_data_buf[0];
|
||||
flist->num_blocks = 0;
|
||||
flist->next = rtas_firmware_flash_list;
|
||||
rtas_block_list = virt_to_abs(flist);
|
||||
if (rtas_block_list >= 4UL*1024*1024*1024) {
|
||||
printk(KERN_ALERT "FLASH: kernel bug...flash list header addr above 4GB\n");
|
||||
spin_unlock(&rtas_data_buf_lock);
|
||||
return;
|
||||
}
|
||||
|
||||
printk(KERN_ALERT "FLASH: preparing saved firmware image for flash\n");
|
||||
/* Update the block_list in place. */
|
||||
rtas_firmware_flash_list = NULL; /* too hard to backout on error */
|
||||
image_size = 0;
|
||||
for (f = flist; f; f = next) {
|
||||
/* Translate data addrs to absolute */
|
||||
|
|
@ -663,6 +665,7 @@ static void rtas_flash_firmware(int reboot_type)
|
|||
printk(KERN_ALERT "FLASH: unknown flash return code %d\n", status);
|
||||
break;
|
||||
}
|
||||
spin_unlock(&rtas_data_buf_lock);
|
||||
}
|
||||
|
||||
static void remove_flash_pde(struct proc_dir_entry *dp)
|
||||
|
|
|
|||
|
|
@ -432,9 +432,18 @@ void __init setup_system(void)
|
|||
DBG(" <- setup_system()\n");
|
||||
}
|
||||
|
||||
static u64 slb0_limit(void)
|
||||
{
|
||||
if (cpu_has_feature(CPU_FTR_1T_SEGMENT)) {
|
||||
return 1UL << SID_SHIFT_1T;
|
||||
}
|
||||
return 1UL << SID_SHIFT;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_IRQSTACKS
|
||||
static void __init irqstack_early_init(void)
|
||||
{
|
||||
u64 limit = slb0_limit();
|
||||
unsigned int i;
|
||||
|
||||
/*
|
||||
|
|
@ -444,10 +453,10 @@ static void __init irqstack_early_init(void)
|
|||
for_each_possible_cpu(i) {
|
||||
softirq_ctx[i] = (struct thread_info *)
|
||||
__va(lmb_alloc_base(THREAD_SIZE,
|
||||
THREAD_SIZE, 0x10000000));
|
||||
THREAD_SIZE, limit));
|
||||
hardirq_ctx[i] = (struct thread_info *)
|
||||
__va(lmb_alloc_base(THREAD_SIZE,
|
||||
THREAD_SIZE, 0x10000000));
|
||||
THREAD_SIZE, limit));
|
||||
}
|
||||
}
|
||||
#else
|
||||
|
|
@ -478,7 +487,7 @@ static void __init exc_lvl_early_init(void)
|
|||
*/
|
||||
static void __init emergency_stack_init(void)
|
||||
{
|
||||
unsigned long limit;
|
||||
u64 limit;
|
||||
unsigned int i;
|
||||
|
||||
/*
|
||||
|
|
@ -490,7 +499,7 @@ static void __init emergency_stack_init(void)
|
|||
* bringup, we need to get at them in real mode. This means they
|
||||
* must also be within the RMO region.
|
||||
*/
|
||||
limit = min(0x10000000ULL, lmb.rmo_size);
|
||||
limit = min(slb0_limit(), lmb.rmo_size);
|
||||
|
||||
for_each_possible_cpu(i) {
|
||||
unsigned long sp;
|
||||
|
|
|
|||
|
|
@ -202,3 +202,41 @@ _GLOBAL(plpar_hcall9)
|
|||
mtcrf 0xff,r0
|
||||
|
||||
blr /* return r3 = status */
|
||||
|
||||
/* See plpar_hcall_raw to see why this is needed */
|
||||
_GLOBAL(plpar_hcall9_raw)
|
||||
HMT_MEDIUM
|
||||
|
||||
mfcr r0
|
||||
stw r0,8(r1)
|
||||
|
||||
std r4,STK_PARM(r4)(r1) /* Save ret buffer */
|
||||
|
||||
mr r4,r5
|
||||
mr r5,r6
|
||||
mr r6,r7
|
||||
mr r7,r8
|
||||
mr r8,r9
|
||||
mr r9,r10
|
||||
ld r10,STK_PARM(r11)(r1) /* put arg7 in R10 */
|
||||
ld r11,STK_PARM(r12)(r1) /* put arg8 in R11 */
|
||||
ld r12,STK_PARM(r13)(r1) /* put arg9 in R12 */
|
||||
|
||||
HVSC /* invoke the hypervisor */
|
||||
|
||||
mr r0,r12
|
||||
ld r12,STK_PARM(r4)(r1)
|
||||
std r4, 0(r12)
|
||||
std r5, 8(r12)
|
||||
std r6, 16(r12)
|
||||
std r7, 24(r12)
|
||||
std r8, 32(r12)
|
||||
std r9, 40(r12)
|
||||
std r10,48(r12)
|
||||
std r11,56(r12)
|
||||
std r0, 64(r12)
|
||||
|
||||
lwz r0,8(r1)
|
||||
mtcrf 0xff,r0
|
||||
|
||||
blr /* return r3 = status */
|
||||
|
|
|
|||
|
|
@ -366,21 +366,28 @@ static void pSeries_lpar_hptab_clear(void)
|
|||
{
|
||||
unsigned long size_bytes = 1UL << ppc64_pft_size;
|
||||
unsigned long hpte_count = size_bytes >> 4;
|
||||
unsigned long dummy1, dummy2, dword0;
|
||||
struct {
|
||||
unsigned long pteh;
|
||||
unsigned long ptel;
|
||||
} ptes[4];
|
||||
long lpar_rc;
|
||||
int i;
|
||||
int i, j;
|
||||
|
||||
/* TODO: Use bulk call */
|
||||
for (i = 0; i < hpte_count; i++) {
|
||||
/* dont remove HPTEs with VRMA mappings */
|
||||
lpar_rc = plpar_pte_remove_raw(H_ANDCOND, i, HPTE_V_1TB_SEG,
|
||||
&dummy1, &dummy2);
|
||||
if (lpar_rc == H_NOT_FOUND) {
|
||||
lpar_rc = plpar_pte_read_raw(0, i, &dword0, &dummy1);
|
||||
if (!lpar_rc && ((dword0 & HPTE_V_VRMA_MASK)
|
||||
!= HPTE_V_VRMA_MASK))
|
||||
/* Can be hpte for 1TB Seg. So remove it */
|
||||
plpar_pte_remove_raw(0, i, 0, &dummy1, &dummy2);
|
||||
/* Read in batches of 4,
|
||||
* invalidate only valid entries not in the VRMA
|
||||
* hpte_count will be a multiple of 4
|
||||
*/
|
||||
for (i = 0; i < hpte_count; i += 4) {
|
||||
lpar_rc = plpar_pte_read_4_raw(0, i, (void *)ptes);
|
||||
if (lpar_rc != H_SUCCESS)
|
||||
continue;
|
||||
for (j = 0; j < 4; j++){
|
||||
if ((ptes[j].pteh & HPTE_V_VRMA_MASK) ==
|
||||
HPTE_V_VRMA_MASK)
|
||||
continue;
|
||||
if (ptes[j].pteh & HPTE_V_VALID)
|
||||
plpar_pte_remove_raw(0, i + j, 0,
|
||||
&(ptes[j].pteh), &(ptes[j].ptel));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -169,6 +169,24 @@ static inline long plpar_pte_read_raw(unsigned long flags, unsigned long ptex,
|
|||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
* plpar_pte_read_4_raw can be called in real mode.
|
||||
* ptes must be 8*sizeof(unsigned long)
|
||||
*/
|
||||
static inline long plpar_pte_read_4_raw(unsigned long flags, unsigned long ptex,
|
||||
unsigned long *ptes)
|
||||
|
||||
{
|
||||
long rc;
|
||||
unsigned long retbuf[PLPAR_HCALL9_BUFSIZE];
|
||||
|
||||
rc = plpar_hcall9_raw(H_READ, retbuf, flags | H_READ_4, ptex);
|
||||
|
||||
memcpy(ptes, retbuf, 8*sizeof(unsigned long));
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static inline long plpar_pte_protect(unsigned long flags, unsigned long ptex,
|
||||
unsigned long avpn)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -832,7 +832,6 @@ fsl_rio_dbell_handler(int irq, void *dev_instance)
|
|||
if (dsr & DOORBELL_DSR_QFI) {
|
||||
pr_info("RIO: doorbell queue full\n");
|
||||
out_be32(&priv->msg_regs->dsr, DOORBELL_DSR_QFI);
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* XXX Need to check/dispatch until queue empty */
|
||||
|
|
|
|||
|
|
@ -150,11 +150,6 @@ extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
|
|||
*/
|
||||
extern unsigned long thread_saved_pc(struct task_struct *t);
|
||||
|
||||
/*
|
||||
* Print register of task into buffer. Used in fs/proc/array.c.
|
||||
*/
|
||||
extern void task_show_regs(struct seq_file *m, struct task_struct *task);
|
||||
|
||||
extern void show_code(struct pt_regs *regs);
|
||||
|
||||
unsigned long get_wchan(struct task_struct *p);
|
||||
|
|
|
|||
|
|
@ -97,7 +97,6 @@ static inline void restore_access_regs(unsigned int *acrs)
|
|||
|
||||
extern void account_vtime(struct task_struct *, struct task_struct *);
|
||||
extern void account_tick_vtime(struct task_struct *);
|
||||
extern void account_system_vtime(struct task_struct *);
|
||||
|
||||
#ifdef CONFIG_PFAULT
|
||||
extern void pfault_irq_init(void);
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
#define VDSO32_LBASE 0
|
||||
#define VDSO64_LBASE 0
|
||||
|
||||
#define VDSO_VERSION_STRING LINUX_2.6.26
|
||||
#define VDSO_VERSION_STRING LINUX_2.6.29
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
|
|
|
|||
|
|
@ -243,43 +243,6 @@ void show_regs(struct pt_regs *regs)
|
|||
show_last_breaking_event(regs);
|
||||
}
|
||||
|
||||
/* This is called from fs/proc/array.c */
|
||||
void task_show_regs(struct seq_file *m, struct task_struct *task)
|
||||
{
|
||||
struct pt_regs *regs;
|
||||
|
||||
regs = task_pt_regs(task);
|
||||
seq_printf(m, "task: %p, ksp: %p\n",
|
||||
task, (void *)task->thread.ksp);
|
||||
seq_printf(m, "User PSW : %p %p\n",
|
||||
(void *) regs->psw.mask, (void *)regs->psw.addr);
|
||||
|
||||
seq_printf(m, "User GPRS: " FOURLONG,
|
||||
regs->gprs[0], regs->gprs[1],
|
||||
regs->gprs[2], regs->gprs[3]);
|
||||
seq_printf(m, " " FOURLONG,
|
||||
regs->gprs[4], regs->gprs[5],
|
||||
regs->gprs[6], regs->gprs[7]);
|
||||
seq_printf(m, " " FOURLONG,
|
||||
regs->gprs[8], regs->gprs[9],
|
||||
regs->gprs[10], regs->gprs[11]);
|
||||
seq_printf(m, " " FOURLONG,
|
||||
regs->gprs[12], regs->gprs[13],
|
||||
regs->gprs[14], regs->gprs[15]);
|
||||
seq_printf(m, "User ACRS: %08x %08x %08x %08x\n",
|
||||
task->thread.acrs[0], task->thread.acrs[1],
|
||||
task->thread.acrs[2], task->thread.acrs[3]);
|
||||
seq_printf(m, " %08x %08x %08x %08x\n",
|
||||
task->thread.acrs[4], task->thread.acrs[5],
|
||||
task->thread.acrs[6], task->thread.acrs[7]);
|
||||
seq_printf(m, " %08x %08x %08x %08x\n",
|
||||
task->thread.acrs[8], task->thread.acrs[9],
|
||||
task->thread.acrs[10], task->thread.acrs[11]);
|
||||
seq_printf(m, " %08x %08x %08x %08x\n",
|
||||
task->thread.acrs[12], task->thread.acrs[13],
|
||||
task->thread.acrs[14], task->thread.acrs[15]);
|
||||
}
|
||||
|
||||
static DEFINE_SPINLOCK(die_lock);
|
||||
|
||||
void die(const char * str, struct pt_regs * regs, long err)
|
||||
|
|
|
|||
|
|
@ -753,6 +753,17 @@ config SCHED_MC
|
|||
making when dealing with multi-core CPU chips at a cost of slightly
|
||||
increased overhead in some places. If unsure say N here.
|
||||
|
||||
config IRQ_TIME_ACCOUNTING
|
||||
bool "Fine granularity task level IRQ time accounting"
|
||||
default n
|
||||
---help---
|
||||
Select this option to enable fine granularity task irq time
|
||||
accounting. This is done by reading a timestamp on each
|
||||
transitions between softirq and hardirq state, so there can be a
|
||||
small performance impact.
|
||||
|
||||
If in doubt, say N here.
|
||||
|
||||
source "kernel/Kconfig.preempt"
|
||||
|
||||
config X86_UP_APIC
|
||||
|
|
|
|||
|
|
@ -89,6 +89,7 @@ extern int acpi_ht;
|
|||
extern int acpi_pci_disabled;
|
||||
extern int acpi_skip_timer_override;
|
||||
extern int acpi_use_timer_override;
|
||||
extern int acpi_fix_pin2_polarity;
|
||||
|
||||
extern u8 acpi_sci_flags;
|
||||
extern int acpi_sci_override_gsi;
|
||||
|
|
|
|||
|
|
@ -72,6 +72,7 @@
|
|||
#define APIC_DEST_LOGICAL 0x00800
|
||||
#define APIC_DEST_PHYSICAL 0x00000
|
||||
#define APIC_DM_FIXED 0x00000
|
||||
#define APIC_DM_FIXED_MASK 0x00700
|
||||
#define APIC_DM_LOWEST 0x00100
|
||||
#define APIC_DM_SMI 0x00200
|
||||
#define APIC_DM_REMRD 0x00300
|
||||
|
|
|
|||
|
|
@ -357,6 +357,9 @@ struct kvm_vcpu_arch {
|
|||
struct page *time_page;
|
||||
|
||||
bool singlestep; /* guest is single stepped by KVM */
|
||||
u64 last_guest_tsc;
|
||||
u64 last_kernel_ns;
|
||||
|
||||
bool nmi_pending;
|
||||
bool nmi_injected;
|
||||
|
||||
|
|
|
|||
|
|
@ -36,8 +36,6 @@ static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,
|
|||
unsigned cpu = smp_processor_id();
|
||||
|
||||
if (likely(prev != next)) {
|
||||
/* stop flush ipis for the previous mm */
|
||||
cpumask_clear_cpu(cpu, mm_cpumask(prev));
|
||||
#ifdef CONFIG_SMP
|
||||
percpu_write(cpu_tlbstate.state, TLBSTATE_OK);
|
||||
percpu_write(cpu_tlbstate.active_mm, next);
|
||||
|
|
@ -47,6 +45,9 @@ static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,
|
|||
/* Re-load page tables */
|
||||
load_cr3(next->pgd);
|
||||
|
||||
/* stop flush ipis for the previous mm */
|
||||
cpumask_clear_cpu(cpu, mm_cpumask(prev));
|
||||
|
||||
/*
|
||||
* load the LDT, if the LDT is different:
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -81,11 +81,15 @@
|
|||
#define MSR_IA32_MC0_ADDR 0x00000402
|
||||
#define MSR_IA32_MC0_MISC 0x00000403
|
||||
|
||||
#define MSR_AMD64_MC0_MASK 0xc0010044
|
||||
|
||||
#define MSR_IA32_MCx_CTL(x) (MSR_IA32_MC0_CTL + 4*(x))
|
||||
#define MSR_IA32_MCx_STATUS(x) (MSR_IA32_MC0_STATUS + 4*(x))
|
||||
#define MSR_IA32_MCx_ADDR(x) (MSR_IA32_MC0_ADDR + 4*(x))
|
||||
#define MSR_IA32_MCx_MISC(x) (MSR_IA32_MC0_MISC + 4*(x))
|
||||
|
||||
#define MSR_AMD64_MCx_MASK(x) (MSR_AMD64_MC0_MASK + (x))
|
||||
|
||||
/* These are consecutive and not in the normal 4er MCE bank block */
|
||||
#define MSR_IA32_MC0_CTL2 0x00000280
|
||||
#define MSR_IA32_MCx_CTL2(x) (MSR_IA32_MC0_CTL2 + (x))
|
||||
|
|
|
|||
|
|
@ -69,8 +69,6 @@ static inline void native_pmd_clear(pmd_t *pmd)
|
|||
|
||||
static inline void pud_clear(pud_t *pudp)
|
||||
{
|
||||
unsigned long pgd;
|
||||
|
||||
set_pud(pudp, __pud(0));
|
||||
|
||||
/*
|
||||
|
|
@ -79,13 +77,10 @@ static inline void pud_clear(pud_t *pudp)
|
|||
* section 8.1: in PAE mode we explicitly have to flush the
|
||||
* TLB via cr3 if the top-level pgd is changed...
|
||||
*
|
||||
* Make sure the pud entry we're updating is within the
|
||||
* current pgd to avoid unnecessary TLB flushes.
|
||||
* Currently all places where pud_clear() is called either have
|
||||
* flush_tlb_mm() followed or don't need TLB flush (x86_64 code or
|
||||
* pud_clear_bad()), so we don't need TLB flush here.
|
||||
*/
|
||||
pgd = read_cr3();
|
||||
if (__pa(pudp) >= pgd && __pa(pudp) <
|
||||
(pgd + sizeof(pgd_t)*PTRS_PER_PGD))
|
||||
write_cr3(pgd);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
|
|
|
|||
|
|
@ -1029,4 +1029,23 @@ unsigned long calc_aperfmperf_ratio(struct aperfmperf *old,
|
|||
return ratio;
|
||||
}
|
||||
|
||||
/*
|
||||
* AMD errata checking
|
||||
*/
|
||||
#ifdef CONFIG_CPU_SUP_AMD
|
||||
extern const int amd_erratum_400[];
|
||||
extern bool cpu_has_amd_erratum(const int *);
|
||||
|
||||
#define AMD_LEGACY_ERRATUM(...) { -1, __VA_ARGS__, 0 }
|
||||
#define AMD_OSVW_ERRATUM(osvw_id, ...) { osvw_id, __VA_ARGS__, 0 }
|
||||
#define AMD_MODEL_RANGE(f, m_start, s_start, m_end, s_end) \
|
||||
((f << 24) | (m_start << 16) | (s_start << 12) | (m_end << 4) | (s_end))
|
||||
#define AMD_MODEL_RANGE_FAMILY(range) (((range) >> 24) & 0xff)
|
||||
#define AMD_MODEL_RANGE_START(range) (((range) >> 12) & 0xfff)
|
||||
#define AMD_MODEL_RANGE_END(range) ((range) & 0xfff)
|
||||
|
||||
#else
|
||||
#define cpu_has_amd_erratum(x) (false)
|
||||
#endif /* CONFIG_CPU_SUP_AMD */
|
||||
|
||||
#endif /* _ASM_X86_PROCESSOR_H */
|
||||
|
|
|
|||
|
|
@ -10,5 +10,44 @@ unsigned long pvclock_tsc_khz(struct pvclock_vcpu_time_info *src);
|
|||
void pvclock_read_wallclock(struct pvclock_wall_clock *wall,
|
||||
struct pvclock_vcpu_time_info *vcpu,
|
||||
struct timespec *ts);
|
||||
void pvclock_resume(void);
|
||||
|
||||
/*
|
||||
* Scale a 64-bit delta by scaling and multiplying by a 32-bit fraction,
|
||||
* yielding a 64-bit result.
|
||||
*/
|
||||
static inline u64 pvclock_scale_delta(u64 delta, u32 mul_frac, int shift)
|
||||
{
|
||||
u64 product;
|
||||
#ifdef __i386__
|
||||
u32 tmp1, tmp2;
|
||||
#endif
|
||||
|
||||
if (shift < 0)
|
||||
delta >>= -shift;
|
||||
else
|
||||
delta <<= shift;
|
||||
|
||||
#ifdef __i386__
|
||||
__asm__ (
|
||||
"mul %5 ; "
|
||||
"mov %4,%%eax ; "
|
||||
"mov %%edx,%4 ; "
|
||||
"mul %5 ; "
|
||||
"xor %5,%5 ; "
|
||||
"add %4,%%eax ; "
|
||||
"adc %5,%%edx ; "
|
||||
: "=A" (product), "=r" (tmp1), "=r" (tmp2)
|
||||
: "a" ((u32)delta), "1" ((u32)(delta >> 32)), "2" (mul_frac) );
|
||||
#elif defined(__x86_64__)
|
||||
__asm__ (
|
||||
"mul %%rdx ; shrd $32,%%rdx,%%rax"
|
||||
: "=a" (product) : "0" (delta), "d" ((u64)mul_frac) );
|
||||
#else
|
||||
#error implement me!
|
||||
#endif
|
||||
|
||||
return product;
|
||||
}
|
||||
|
||||
#endif /* _ASM_X86_PVCLOCK_H */
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ static inline void smpboot_restore_warm_reset_vector(void)
|
|||
*/
|
||||
CMOS_WRITE(0, 0xf);
|
||||
|
||||
*((volatile long *)phys_to_virt(apic->trampoline_phys_low)) = 0;
|
||||
*((volatile u32 *)phys_to_virt(apic->trampoline_phys_low)) = 0;
|
||||
}
|
||||
|
||||
static inline void __init smpboot_setup_io_apic(void)
|
||||
|
|
|
|||
|
|
@ -70,6 +70,7 @@ u8 acpi_sci_flags __initdata;
|
|||
int acpi_sci_override_gsi __initdata;
|
||||
int acpi_skip_timer_override __initdata;
|
||||
int acpi_use_timer_override __initdata;
|
||||
int acpi_fix_pin2_polarity __initdata;
|
||||
|
||||
#ifdef CONFIG_X86_LOCAL_APIC
|
||||
static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE;
|
||||
|
|
@ -360,10 +361,15 @@ acpi_parse_int_src_ovr(struct acpi_subtable_header * header,
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (acpi_skip_timer_override &&
|
||||
intsrc->source_irq == 0 && intsrc->global_irq == 2) {
|
||||
printk(PREFIX "BIOS IRQ0 pin2 override ignored.\n");
|
||||
return 0;
|
||||
if (intsrc->source_irq == 0 && intsrc->global_irq == 2) {
|
||||
if (acpi_skip_timer_override) {
|
||||
printk(PREFIX "BIOS IRQ0 pin2 override ignored.\n");
|
||||
return 0;
|
||||
}
|
||||
if (acpi_fix_pin2_polarity && (intsrc->inti_flags & ACPI_MADT_POLARITY_MASK)) {
|
||||
intsrc->inti_flags &= ~ACPI_MADT_POLARITY_MASK;
|
||||
printk(PREFIX "BIOS IRQ0 pin2 override: forcing polarity to high active.\n");
|
||||
}
|
||||
}
|
||||
|
||||
mp_override_legacy_irq(intsrc->source_irq,
|
||||
|
|
|
|||
|
|
@ -566,6 +566,29 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c)
|
|||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* As a rule processors have APIC timer running in deep C states */
|
||||
if (c->x86 > 0xf && !cpu_has_amd_erratum(amd_erratum_400))
|
||||
set_cpu_cap(c, X86_FEATURE_ARAT);
|
||||
|
||||
/*
|
||||
* Disable GART TLB Walk Errors on Fam10h. We do this here
|
||||
* because this is always needed when GART is enabled, even in a
|
||||
* kernel which has no MCE support built in.
|
||||
*/
|
||||
if (c->x86 == 0x10) {
|
||||
/*
|
||||
* BIOS should disable GartTlbWlk Errors themself. If
|
||||
* it doesn't do it here as suggested by the BKDG.
|
||||
*
|
||||
* Fixes: https://bugzilla.kernel.org/show_bug.cgi?id=33012
|
||||
*/
|
||||
u64 mask;
|
||||
|
||||
rdmsrl(MSR_AMD64_MCx_MASK(4), mask);
|
||||
mask |= (1 << 10);
|
||||
wrmsrl(MSR_AMD64_MCx_MASK(4), mask);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
|
|
@ -610,3 +633,68 @@ static const struct cpu_dev __cpuinitconst amd_cpu_dev = {
|
|||
};
|
||||
|
||||
cpu_dev_register(amd_cpu_dev);
|
||||
|
||||
/*
|
||||
* AMD errata checking
|
||||
*
|
||||
* Errata are defined as arrays of ints using the AMD_LEGACY_ERRATUM() or
|
||||
* AMD_OSVW_ERRATUM() macros. The latter is intended for newer errata that
|
||||
* have an OSVW id assigned, which it takes as first argument. Both take a
|
||||
* variable number of family-specific model-stepping ranges created by
|
||||
* AMD_MODEL_RANGE(). Each erratum also has to be declared as extern const
|
||||
* int[] in arch/x86/include/asm/processor.h.
|
||||
*
|
||||
* Example:
|
||||
*
|
||||
* const int amd_erratum_319[] =
|
||||
* AMD_LEGACY_ERRATUM(AMD_MODEL_RANGE(0x10, 0x2, 0x1, 0x4, 0x2),
|
||||
* AMD_MODEL_RANGE(0x10, 0x8, 0x0, 0x8, 0x0),
|
||||
* AMD_MODEL_RANGE(0x10, 0x9, 0x0, 0x9, 0x0));
|
||||
*/
|
||||
|
||||
const int amd_erratum_400[] =
|
||||
AMD_OSVW_ERRATUM(1, AMD_MODEL_RANGE(0xf, 0x41, 0x2, 0xff, 0xf),
|
||||
AMD_MODEL_RANGE(0x10, 0x2, 0x1, 0xff, 0xf));
|
||||
|
||||
|
||||
bool cpu_has_amd_erratum(const int *erratum)
|
||||
{
|
||||
struct cpuinfo_x86 *cpu = ¤t_cpu_data;
|
||||
int osvw_id = *erratum++;
|
||||
u32 range;
|
||||
u32 ms;
|
||||
|
||||
/*
|
||||
* If called early enough that current_cpu_data hasn't been initialized
|
||||
* yet, fall back to boot_cpu_data.
|
||||
*/
|
||||
if (cpu->x86 == 0)
|
||||
cpu = &boot_cpu_data;
|
||||
|
||||
if (cpu->x86_vendor != X86_VENDOR_AMD)
|
||||
return false;
|
||||
|
||||
if (osvw_id >= 0 && osvw_id < 65536 &&
|
||||
cpu_has(cpu, X86_FEATURE_OSVW)) {
|
||||
u64 osvw_len;
|
||||
|
||||
rdmsrl(MSR_AMD64_OSVW_ID_LENGTH, osvw_len);
|
||||
if (osvw_id < osvw_len) {
|
||||
u64 osvw_bits;
|
||||
|
||||
rdmsrl(MSR_AMD64_OSVW_STATUS + (osvw_id >> 6),
|
||||
osvw_bits);
|
||||
return osvw_bits & (1ULL << (osvw_id & 0x3f));
|
||||
}
|
||||
}
|
||||
|
||||
/* OSVW unavailable or ID unknown, match family-model-stepping range */
|
||||
ms = (cpu->x86_model << 4) | cpu->x86_mask;
|
||||
while ((range = *erratum++))
|
||||
if ((cpu->x86 == AMD_MODEL_RANGE_FAMILY(range)) &&
|
||||
(ms >= AMD_MODEL_RANGE_START(range)) &&
|
||||
(ms <= AMD_MODEL_RANGE_END(range)))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -468,6 +468,7 @@ recurse:
|
|||
out_free:
|
||||
if (b) {
|
||||
kobject_put(&b->kobj);
|
||||
list_del(&b->miscj);
|
||||
kfree(b);
|
||||
}
|
||||
return err;
|
||||
|
|
|
|||
|
|
@ -286,18 +286,20 @@ void intel_init_thermal(struct cpuinfo_x86 *c)
|
|||
*/
|
||||
rdmsr(MSR_IA32_MISC_ENABLE, l, h);
|
||||
|
||||
h = lvtthmr_init;
|
||||
/*
|
||||
* The initial value of thermal LVT entries on all APs always reads
|
||||
* 0x10000 because APs are woken up by BSP issuing INIT-SIPI-SIPI
|
||||
* sequence to them and LVT registers are reset to 0s except for
|
||||
* the mask bits which are set to 1s when APs receive INIT IPI.
|
||||
* Always restore the value that BIOS has programmed on AP based on
|
||||
* BSP's info we saved since BIOS is always setting the same value
|
||||
* for all threads/cores
|
||||
* If BIOS takes over the thermal interrupt and sets its interrupt
|
||||
* delivery mode to SMI (not fixed), it restores the value that the
|
||||
* BIOS has programmed on AP based on BSP's info we saved since BIOS
|
||||
* is always setting the same value for all threads/cores.
|
||||
*/
|
||||
apic_write(APIC_LVTTHMR, lvtthmr_init);
|
||||
if ((h & APIC_DM_FIXED_MASK) != APIC_DM_FIXED)
|
||||
apic_write(APIC_LVTTHMR, lvtthmr_init);
|
||||
|
||||
h = lvtthmr_init;
|
||||
|
||||
if ((l & MSR_IA32_MISC_ENABLE_TM1) && (h & APIC_DM_SMI)) {
|
||||
printk(KERN_DEBUG
|
||||
|
|
|
|||
|
|
@ -262,14 +262,24 @@ set_mtrr(unsigned int reg, unsigned long base, unsigned long size, mtrr_type typ
|
|||
|
||||
/*
|
||||
* HACK!
|
||||
* We use this same function to initialize the mtrrs on boot.
|
||||
* The state of the boot cpu's mtrrs has been saved, and we want
|
||||
* to replicate across all the APs.
|
||||
* If we're doing that @reg is set to something special...
|
||||
*
|
||||
* We use this same function to initialize the mtrrs during boot,
|
||||
* resume, runtime cpu online and on an explicit request to set a
|
||||
* specific MTRR.
|
||||
*
|
||||
* During boot or suspend, the state of the boot cpu's mtrrs has been
|
||||
* saved, and we want to replicate that across all the cpus that come
|
||||
* online (either at the end of boot or resume or during a runtime cpu
|
||||
* online). If we're doing that, @reg is set to something special and on
|
||||
* this cpu we still do mtrr_if->set_all(). During boot/resume, this
|
||||
* is unnecessary if at this point we are still on the cpu that started
|
||||
* the boot/resume sequence. But there is no guarantee that we are still
|
||||
* on the same cpu. So we do mtrr_if->set_all() on this cpu aswell to be
|
||||
* sure that we are in sync with everyone else.
|
||||
*/
|
||||
if (reg != ~0U)
|
||||
mtrr_if->set(reg, base, size, type);
|
||||
else if (!mtrr_aps_delayed_init)
|
||||
else
|
||||
mtrr_if->set_all();
|
||||
|
||||
/* Wait for the others */
|
||||
|
|
@ -762,13 +772,21 @@ void set_mtrr_aps_delayed_init(void)
|
|||
}
|
||||
|
||||
/*
|
||||
* MTRR initialization for all AP's
|
||||
* Delayed MTRR initialization for all AP's
|
||||
*/
|
||||
void mtrr_aps_init(void)
|
||||
{
|
||||
if (!use_intel())
|
||||
return;
|
||||
|
||||
/*
|
||||
* Check if someone has requested the delay of AP MTRR initialization,
|
||||
* by doing set_mtrr_aps_delayed_init(), prior to this point. If not,
|
||||
* then we are done.
|
||||
*/
|
||||
if (!mtrr_aps_delayed_init)
|
||||
return;
|
||||
|
||||
set_mtrr(~0U, 0, 0, 0);
|
||||
mtrr_aps_delayed_init = false;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1236,15 +1236,21 @@ static int __init parse_memopt(char *p)
|
|||
if (!p)
|
||||
return -EINVAL;
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
if (!strcmp(p, "nopentium")) {
|
||||
#ifdef CONFIG_X86_32
|
||||
setup_clear_cpu_cap(X86_FEATURE_PSE);
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
printk(KERN_WARNING "mem=nopentium ignored! (only supported on x86_32)\n");
|
||||
return -EINVAL;
|
||||
#endif
|
||||
}
|
||||
|
||||
userdef = 1;
|
||||
mem_size = memparse(p, &p);
|
||||
/* don't remove all of memory when handling "mem={invalid}" param */
|
||||
if (mem_size == 0)
|
||||
return -EINVAL;
|
||||
e820_remove_range(mem_size, ULLONG_MAX - mem_size, E820_RAM, 1);
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -145,15 +145,10 @@ static void __init ati_bugs(int num, int slot, int func)
|
|||
|
||||
static u32 __init ati_sbx00_rev(int num, int slot, int func)
|
||||
{
|
||||
u32 old, d;
|
||||
u32 d;
|
||||
|
||||
d = read_pci_config(num, slot, func, 0x70);
|
||||
old = d;
|
||||
d &= ~(1<<8);
|
||||
write_pci_config(num, slot, func, 0x70, d);
|
||||
d = read_pci_config(num, slot, func, 0x8);
|
||||
d &= 0xff;
|
||||
write_pci_config(num, slot, func, 0x70, old);
|
||||
|
||||
return d;
|
||||
}
|
||||
|
|
@ -162,11 +157,19 @@ static void __init ati_bugs_contd(int num, int slot, int func)
|
|||
{
|
||||
u32 d, rev;
|
||||
|
||||
if (acpi_use_timer_override)
|
||||
rev = ati_sbx00_rev(num, slot, func);
|
||||
if (rev >= 0x40)
|
||||
acpi_fix_pin2_polarity = 1;
|
||||
|
||||
/*
|
||||
* SB600: revisions 0x11, 0x12, 0x13, 0x14, ...
|
||||
* SB700: revisions 0x39, 0x3a, ...
|
||||
* SB800: revisions 0x40, 0x41, ...
|
||||
*/
|
||||
if (rev >= 0x39)
|
||||
return;
|
||||
|
||||
rev = ati_sbx00_rev(num, slot, func);
|
||||
if (rev > 0x13)
|
||||
if (acpi_use_timer_override)
|
||||
return;
|
||||
|
||||
/* check for IRQ0 interrupt swap */
|
||||
|
|
|
|||
|
|
@ -1303,7 +1303,7 @@ ENTRY(xen_do_hypervisor_callback) # do_hypervisor_callback(struct *pt_regs)
|
|||
decl PER_CPU_VAR(irq_count)
|
||||
jmp error_exit
|
||||
CFI_ENDPROC
|
||||
END(do_hypervisor_callback)
|
||||
END(xen_do_hypervisor_callback)
|
||||
|
||||
/*
|
||||
* Hypervisor uses this for application faults while it executes.
|
||||
|
|
|
|||
|
|
@ -606,6 +606,8 @@ static void hpet_msi_capability_lookup(unsigned int start_timer)
|
|||
if (hpet_msi_disable)
|
||||
return;
|
||||
|
||||
if (boot_cpu_has(X86_FEATURE_ARAT))
|
||||
return;
|
||||
id = hpet_readl(HPET_ID);
|
||||
|
||||
num_timers = ((id & HPET_ID_NUMBER) >> HPET_ID_NUMBER_SHIFT);
|
||||
|
|
@ -894,10 +896,8 @@ int __init hpet_enable(void)
|
|||
|
||||
if (id & HPET_ID_LEGSUP) {
|
||||
hpet_legacy_clockevent_register();
|
||||
hpet_msi_capability_lookup(2);
|
||||
return 1;
|
||||
}
|
||||
hpet_msi_capability_lookup(0);
|
||||
return 0;
|
||||
|
||||
out_nohpet:
|
||||
|
|
@ -930,12 +930,20 @@ static __init int hpet_late_init(void)
|
|||
if (!hpet_virt_address)
|
||||
return -ENODEV;
|
||||
|
||||
if (hpet_readl(HPET_ID) & HPET_ID_LEGSUP)
|
||||
hpet_msi_capability_lookup(2);
|
||||
else
|
||||
hpet_msi_capability_lookup(0);
|
||||
|
||||
hpet_reserve_platform_timers(hpet_readl(HPET_ID));
|
||||
hpet_print_config();
|
||||
|
||||
if (hpet_msi_disable)
|
||||
return 0;
|
||||
|
||||
if (boot_cpu_has(X86_FEATURE_ARAT))
|
||||
return 0;
|
||||
|
||||
for_each_online_cpu(cpu) {
|
||||
hpet_cpuhp_notify(NULL, CPU_ONLINE, (void *)(long)cpu);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -63,7 +63,6 @@ struct microcode_amd {
|
|||
unsigned int mpb[0];
|
||||
};
|
||||
|
||||
#define UCODE_MAX_SIZE 2048
|
||||
#define UCODE_CONTAINER_SECTION_HDR 8
|
||||
#define UCODE_CONTAINER_HEADER_SIZE 12
|
||||
|
||||
|
|
@ -109,12 +108,8 @@ static int get_matching_microcode(int cpu, void *mc, int rev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (mc_header->processor_rev_id != equiv_cpu_id) {
|
||||
printk(KERN_ERR "microcode: CPU%d: patch mismatch "
|
||||
"(processor_rev_id: %x, equiv_cpu_id: %x)\n",
|
||||
cpu, mc_header->processor_rev_id, equiv_cpu_id);
|
||||
if (mc_header->processor_rev_id != equiv_cpu_id)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* ucode might be chipset specific -- currently we don't support this */
|
||||
if (mc_header->nb_dev_id || mc_header->sb_dev_id) {
|
||||
|
|
@ -129,6 +124,37 @@ static int get_matching_microcode(int cpu, void *mc, int rev)
|
|||
return 1;
|
||||
}
|
||||
|
||||
static unsigned int verify_ucode_size(int cpu, const u8 *buf, unsigned int size)
|
||||
{
|
||||
struct cpuinfo_x86 *c = &cpu_data(cpu);
|
||||
unsigned int max_size, actual_size;
|
||||
|
||||
#define F1XH_MPB_MAX_SIZE 2048
|
||||
#define F14H_MPB_MAX_SIZE 1824
|
||||
#define F15H_MPB_MAX_SIZE 4096
|
||||
|
||||
switch (c->x86) {
|
||||
case 0x14:
|
||||
max_size = F14H_MPB_MAX_SIZE;
|
||||
break;
|
||||
case 0x15:
|
||||
max_size = F15H_MPB_MAX_SIZE;
|
||||
break;
|
||||
default:
|
||||
max_size = F1XH_MPB_MAX_SIZE;
|
||||
break;
|
||||
}
|
||||
|
||||
actual_size = buf[4] + (buf[5] << 8);
|
||||
|
||||
if (actual_size > size || actual_size > max_size) {
|
||||
pr_err("section size mismatch\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
return actual_size;
|
||||
}
|
||||
|
||||
static int apply_microcode_amd(int cpu)
|
||||
{
|
||||
u32 rev, dummy;
|
||||
|
|
@ -168,11 +194,11 @@ static int get_ucode_data(void *to, const u8 *from, size_t n)
|
|||
}
|
||||
|
||||
static void *
|
||||
get_next_ucode(const u8 *buf, unsigned int size, unsigned int *mc_size)
|
||||
get_next_ucode(int cpu, const u8 *buf, unsigned int size, unsigned int *mc_size)
|
||||
{
|
||||
unsigned int total_size;
|
||||
unsigned int actual_size = 0;
|
||||
u8 section_hdr[UCODE_CONTAINER_SECTION_HDR];
|
||||
void *mc;
|
||||
void *mc = NULL;
|
||||
|
||||
if (get_ucode_data(section_hdr, buf, UCODE_CONTAINER_SECTION_HDR))
|
||||
return NULL;
|
||||
|
|
@ -183,26 +209,18 @@ get_next_ucode(const u8 *buf, unsigned int size, unsigned int *mc_size)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
total_size = (unsigned long) (section_hdr[4] + (section_hdr[5] << 8));
|
||||
|
||||
printk(KERN_DEBUG "microcode: size %u, total_size %u\n",
|
||||
size, total_size);
|
||||
|
||||
if (total_size > size || total_size > UCODE_MAX_SIZE) {
|
||||
printk(KERN_ERR "microcode: error: size mismatch\n");
|
||||
actual_size = verify_ucode_size(cpu, buf, size);
|
||||
if (!actual_size)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
mc = vmalloc(UCODE_MAX_SIZE);
|
||||
if (mc) {
|
||||
memset(mc, 0, UCODE_MAX_SIZE);
|
||||
if (get_ucode_data(mc, buf + UCODE_CONTAINER_SECTION_HDR,
|
||||
total_size)) {
|
||||
vfree(mc);
|
||||
mc = NULL;
|
||||
} else
|
||||
*mc_size = total_size + UCODE_CONTAINER_SECTION_HDR;
|
||||
}
|
||||
mc = vmalloc(actual_size);
|
||||
if (!mc)
|
||||
return NULL;
|
||||
|
||||
memset(mc, 0, actual_size);
|
||||
get_ucode_data(mc, buf + UCODE_CONTAINER_SECTION_HDR, actual_size);
|
||||
*mc_size = actual_size + UCODE_CONTAINER_SECTION_HDR;
|
||||
|
||||
return mc;
|
||||
}
|
||||
|
||||
|
|
@ -271,7 +289,7 @@ generic_load_microcode(int cpu, const u8 *data, size_t size)
|
|||
unsigned int uninitialized_var(mc_size);
|
||||
struct microcode_header_amd *mc_header;
|
||||
|
||||
mc = get_next_ucode(ucode_ptr, leftover, &mc_size);
|
||||
mc = get_next_ucode(cpu, ucode_ptr, leftover, &mc_size);
|
||||
if (!mc)
|
||||
break;
|
||||
|
||||
|
|
|
|||
|
|
@ -438,42 +438,6 @@ static int __cpuinit mwait_usable(const struct cpuinfo_x86 *c)
|
|||
return (edx & MWAIT_EDX_C1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Check for AMD CPUs, where APIC timer interrupt does not wake up CPU from C1e.
|
||||
* For more information see
|
||||
* - Erratum #400 for NPT family 0xf and family 0x10 CPUs
|
||||
* - Erratum #365 for family 0x11 (not affected because C1e not in use)
|
||||
*/
|
||||
static int __cpuinit check_c1e_idle(const struct cpuinfo_x86 *c)
|
||||
{
|
||||
u64 val;
|
||||
if (c->x86_vendor != X86_VENDOR_AMD)
|
||||
goto no_c1e_idle;
|
||||
|
||||
/* Family 0x0f models < rev F do not have C1E */
|
||||
if (c->x86 == 0x0F && c->x86_model >= 0x40)
|
||||
return 1;
|
||||
|
||||
if (c->x86 == 0x10) {
|
||||
/*
|
||||
* check OSVW bit for CPUs that are not affected
|
||||
* by erratum #400
|
||||
*/
|
||||
if (cpu_has(c, X86_FEATURE_OSVW)) {
|
||||
rdmsrl(MSR_AMD64_OSVW_ID_LENGTH, val);
|
||||
if (val >= 2) {
|
||||
rdmsrl(MSR_AMD64_OSVW_STATUS, val);
|
||||
if (!(val & BIT(1)))
|
||||
goto no_c1e_idle;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
no_c1e_idle:
|
||||
return 0;
|
||||
}
|
||||
|
||||
static cpumask_var_t c1e_mask;
|
||||
static int c1e_detected;
|
||||
|
||||
|
|
@ -551,7 +515,8 @@ void __cpuinit select_idle_routine(const struct cpuinfo_x86 *c)
|
|||
*/
|
||||
printk(KERN_INFO "using mwait in idle threads.\n");
|
||||
pm_idle = mwait_idle;
|
||||
} else if (check_c1e_idle(c)) {
|
||||
} else if (cpu_has_amd_erratum(amd_erratum_400)) {
|
||||
/* E400: APIC timer interrupt does not wake up CPU from C1e */
|
||||
printk(KERN_INFO "using C1E aware idle routine\n");
|
||||
pm_idle = c1e_idle;
|
||||
} else
|
||||
|
|
|
|||
|
|
@ -74,7 +74,8 @@ static inline u64 scale_delta(u64 delta, u32 mul_frac, int shift)
|
|||
static u64 pvclock_get_nsec_offset(struct pvclock_shadow_time *shadow)
|
||||
{
|
||||
u64 delta = native_read_tsc() - shadow->tsc_timestamp;
|
||||
return scale_delta(delta, shadow->tsc_to_nsec_mul, shadow->tsc_shift);
|
||||
return pvclock_scale_delta(delta, shadow->tsc_to_nsec_mul,
|
||||
shadow->tsc_shift);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -111,6 +112,11 @@ unsigned long pvclock_tsc_khz(struct pvclock_vcpu_time_info *src)
|
|||
|
||||
static atomic64_t last_value = ATOMIC64_INIT(0);
|
||||
|
||||
void pvclock_resume(void)
|
||||
{
|
||||
atomic64_set(&last_value, 0);
|
||||
}
|
||||
|
||||
cycle_t pvclock_clocksource_read(struct pvclock_vcpu_time_info *src)
|
||||
{
|
||||
struct pvclock_shadow_time shadow;
|
||||
|
|
|
|||
|
|
@ -104,10 +104,14 @@ int __init notsc_setup(char *str)
|
|||
|
||||
__setup("notsc", notsc_setup);
|
||||
|
||||
static int no_sched_irq_time;
|
||||
|
||||
static int __init tsc_setup(char *str)
|
||||
{
|
||||
if (!strcmp(str, "reliable"))
|
||||
tsc_clocksource_reliable = 1;
|
||||
if (!strncmp(str, "noirqtime", 9))
|
||||
no_sched_irq_time = 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
@ -802,6 +806,7 @@ void mark_tsc_unstable(char *reason)
|
|||
if (!tsc_unstable) {
|
||||
tsc_unstable = 1;
|
||||
sched_clock_stable = 0;
|
||||
disable_sched_clock_irqtime();
|
||||
printk(KERN_INFO "Marking TSC unstable due to %s\n", reason);
|
||||
/* Change only the rating, when not registered */
|
||||
if (clocksource_tsc.mult)
|
||||
|
|
@ -990,6 +995,9 @@ void __init tsc_init(void)
|
|||
/* now allow native_sched_clock() to use rdtsc */
|
||||
tsc_disabled = 0;
|
||||
|
||||
if (!no_sched_irq_time)
|
||||
enable_sched_clock_irqtime();
|
||||
|
||||
lpj = ((u64)tsc_khz * 1000);
|
||||
do_div(lpj, HZ);
|
||||
lpj_fine = lpj;
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@
|
|||
#include <asm/desc.h>
|
||||
#include <asm/mtrr.h>
|
||||
#include <asm/mce.h>
|
||||
#include <asm/pvclock.h>
|
||||
|
||||
#define MAX_IO_MSRS 256
|
||||
#define CR0_RESERVED_BITS \
|
||||
|
|
@ -633,6 +634,8 @@ static void kvm_write_guest_time(struct kvm_vcpu *v)
|
|||
struct kvm_vcpu_arch *vcpu = &v->arch;
|
||||
void *shared_kaddr;
|
||||
unsigned long this_tsc_khz;
|
||||
s64 kernel_ns, max_kernel_ns;
|
||||
u64 tsc_timestamp;
|
||||
|
||||
if ((!vcpu->time_page))
|
||||
return;
|
||||
|
|
@ -646,15 +649,52 @@ static void kvm_write_guest_time(struct kvm_vcpu *v)
|
|||
|
||||
/* Keep irq disabled to prevent changes to the clock */
|
||||
local_irq_save(flags);
|
||||
kvm_get_msr(v, MSR_IA32_TSC, &vcpu->hv_clock.tsc_timestamp);
|
||||
kvm_get_msr(v, MSR_IA32_TSC, &tsc_timestamp);
|
||||
ktime_get_ts(&ts);
|
||||
monotonic_to_bootbased(&ts);
|
||||
kernel_ns = timespec_to_ns(&ts);
|
||||
local_irq_restore(flags);
|
||||
|
||||
/*
|
||||
* Time as measured by the TSC may go backwards when resetting the base
|
||||
* tsc_timestamp. The reason for this is that the TSC resolution is
|
||||
* higher than the resolution of the other clock scales. Thus, many
|
||||
* possible measurments of the TSC correspond to one measurement of any
|
||||
* other clock, and so a spread of values is possible. This is not a
|
||||
* problem for the computation of the nanosecond clock; with TSC rates
|
||||
* around 1GHZ, there can only be a few cycles which correspond to one
|
||||
* nanosecond value, and any path through this code will inevitably
|
||||
* take longer than that. However, with the kernel_ns value itself,
|
||||
* the precision may be much lower, down to HZ granularity. If the
|
||||
* first sampling of TSC against kernel_ns ends in the low part of the
|
||||
* range, and the second in the high end of the range, we can get:
|
||||
*
|
||||
* (TSC - offset_low) * S + kns_old > (TSC - offset_high) * S + kns_new
|
||||
*
|
||||
* As the sampling errors potentially range in the thousands of cycles,
|
||||
* it is possible such a time value has already been observed by the
|
||||
* guest. To protect against this, we must compute the system time as
|
||||
* observed by the guest and ensure the new system time is greater.
|
||||
*/
|
||||
max_kernel_ns = 0;
|
||||
if (vcpu->hv_clock.tsc_timestamp && vcpu->last_guest_tsc) {
|
||||
max_kernel_ns = vcpu->last_guest_tsc -
|
||||
vcpu->hv_clock.tsc_timestamp;
|
||||
max_kernel_ns = pvclock_scale_delta(max_kernel_ns,
|
||||
vcpu->hv_clock.tsc_to_system_mul,
|
||||
vcpu->hv_clock.tsc_shift);
|
||||
max_kernel_ns += vcpu->last_kernel_ns;
|
||||
}
|
||||
|
||||
if (max_kernel_ns > kernel_ns)
|
||||
kernel_ns = max_kernel_ns;
|
||||
|
||||
/* With all the info we got, fill in the values */
|
||||
|
||||
vcpu->hv_clock.system_time = ts.tv_nsec +
|
||||
(NSEC_PER_SEC * (u64)ts.tv_sec) + v->kvm->arch.kvmclock_offset;
|
||||
vcpu->hv_clock.tsc_timestamp = tsc_timestamp;
|
||||
vcpu->hv_clock.system_time = kernel_ns + v->kvm->arch.kvmclock_offset;
|
||||
vcpu->last_kernel_ns = kernel_ns;
|
||||
vcpu->last_guest_tsc = tsc_timestamp;
|
||||
|
||||
/*
|
||||
* The interface expects us to write an even number signaling that the
|
||||
|
|
@ -3695,6 +3735,8 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
|
|||
kvm_x86_ops->prepare_guest_switch(vcpu);
|
||||
kvm_load_guest_fpu(vcpu);
|
||||
|
||||
kvm_get_msr(vcpu, MSR_IA32_TSC, &vcpu->arch.last_guest_tsc);
|
||||
|
||||
local_irq_disable();
|
||||
|
||||
clear_bit(KVM_REQ_KICK, &vcpu->requests);
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@
|
|||
*/
|
||||
#ifdef CONFIG_SMP
|
||||
ENTRY(__write_lock_failed)
|
||||
CFI_STARTPROC simple
|
||||
CFI_STARTPROC
|
||||
FRAME
|
||||
2: LOCK_PREFIX
|
||||
addl $ RW_LOCK_BIAS,(%eax)
|
||||
|
|
|
|||
|
|
@ -830,6 +830,13 @@ mm_fault_error(struct pt_regs *regs, unsigned long error_code,
|
|||
unsigned long address, unsigned int fault)
|
||||
{
|
||||
if (fault & VM_FAULT_OOM) {
|
||||
/* Kernel mode? Handle exceptions or die: */
|
||||
if (!(error_code & PF_USER)) {
|
||||
up_read(¤t->mm->mmap_sem);
|
||||
no_context(regs, error_code, address);
|
||||
return;
|
||||
}
|
||||
|
||||
out_of_memory(regs, error_code, address);
|
||||
} else {
|
||||
if (fault & (VM_FAULT_SIGBUS|VM_FAULT_HWPOISON))
|
||||
|
|
|
|||
|
|
@ -159,8 +159,7 @@ void pud_populate(struct mm_struct *mm, pud_t *pudp, pmd_t *pmd)
|
|||
* section 8.1: in PAE mode we explicitly have to flush the
|
||||
* TLB via cr3 if the top-level pgd is changed...
|
||||
*/
|
||||
if (mm == current->active_mm)
|
||||
write_cr3(read_cr3());
|
||||
flush_tlb_mm(mm);
|
||||
}
|
||||
#else /* !CONFIG_X86_PAE */
|
||||
|
||||
|
|
|
|||
|
|
@ -1658,9 +1658,6 @@ static __init void xen_map_identity_early(pmd_t *pmd, unsigned long max_pfn)
|
|||
for (pteidx = 0; pteidx < PTRS_PER_PTE; pteidx++, pfn++) {
|
||||
pte_t pte;
|
||||
|
||||
if (pfn > max_pfn_mapped)
|
||||
max_pfn_mapped = pfn;
|
||||
|
||||
if (!pte_none(pte_page[pteidx]))
|
||||
continue;
|
||||
|
||||
|
|
@ -1704,6 +1701,12 @@ __init pgd_t *xen_setup_kernel_pagetable(pgd_t *pgd,
|
|||
pud_t *l3;
|
||||
pmd_t *l2;
|
||||
|
||||
/* max_pfn_mapped is the last pfn mapped in the initial memory
|
||||
* mappings. Considering that on Xen after the kernel mappings we
|
||||
* have the mappings of some pages that don't exist in pfn space, we
|
||||
* set max_pfn_mapped to the last real pfn mapped. */
|
||||
max_pfn_mapped = PFN_DOWN(__pa(xen_start_info->mfn_list));
|
||||
|
||||
/* Zap identity mapping */
|
||||
init_level4_pgt[0] = __pgd(0);
|
||||
|
||||
|
|
@ -1767,9 +1770,7 @@ __init pgd_t *xen_setup_kernel_pagetable(pgd_t *pgd,
|
|||
{
|
||||
pmd_t *kernel_pmd;
|
||||
|
||||
max_pfn_mapped = PFN_DOWN(__pa(xen_start_info->pt_base) +
|
||||
xen_start_info->nr_pt_frames * PAGE_SIZE +
|
||||
512*1024);
|
||||
max_pfn_mapped = PFN_DOWN(__pa(xen_start_info->mfn_list));
|
||||
|
||||
kernel_pmd = m2v(pgd[KERNEL_PGD_BOUNDARY].pgd);
|
||||
memcpy(level2_kernel_pgt, kernel_pmd, sizeof(pmd_t) * PTRS_PER_PMD);
|
||||
|
|
|
|||
|
|
@ -424,6 +424,8 @@ void xen_timer_resume(void)
|
|||
{
|
||||
int cpu;
|
||||
|
||||
pvclock_resume();
|
||||
|
||||
if (xen_clockevent != &xen_vcpuop_clockevent)
|
||||
return;
|
||||
|
||||
|
|
|
|||
|
|
@ -440,8 +440,10 @@ int blk_register_queue(struct gendisk *disk)
|
|||
return ret;
|
||||
|
||||
ret = kobject_add(&q->kobj, kobject_get(&dev->kobj), "%s", "queue");
|
||||
if (ret < 0)
|
||||
if (ret < 0) {
|
||||
blk_trace_remove_sysfs(dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
kobject_uevent(&q->kobj, KOBJ_ADD);
|
||||
|
||||
|
|
|
|||
|
|
@ -576,6 +576,11 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
|||
{ PCI_VDEVICE(INTEL, 0x1c05), board_ahci }, /* CPT RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x1c06), board_ahci }, /* CPT RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x1c07), board_ahci }, /* CPT RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x1d02), board_ahci }, /* PBG AHCI */
|
||||
{ PCI_VDEVICE(INTEL, 0x1d04), board_ahci }, /* PBG RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x1d06), board_ahci }, /* PBG RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x2826), board_ahci }, /* PBG RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x2323), board_ahci }, /* DH89xxCC AHCI */
|
||||
|
||||
/* JMicron 360/1/3/5/6, match class to avoid IDE function */
|
||||
{ PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
|
||||
|
|
|
|||
|
|
@ -5016,9 +5016,6 @@ static void ata_verify_xfer(struct ata_queued_cmd *qc)
|
|||
{
|
||||
struct ata_device *dev = qc->dev;
|
||||
|
||||
if (ata_tag_internal(qc->tag))
|
||||
return;
|
||||
|
||||
if (ata_is_nodata(qc->tf.protocol))
|
||||
return;
|
||||
|
||||
|
|
@ -5062,14 +5059,23 @@ void ata_qc_complete(struct ata_queued_cmd *qc)
|
|||
if (unlikely(qc->err_mask))
|
||||
qc->flags |= ATA_QCFLAG_FAILED;
|
||||
|
||||
if (unlikely(qc->flags & ATA_QCFLAG_FAILED)) {
|
||||
/* always fill result TF for failed qc */
|
||||
/*
|
||||
* Finish internal commands without any further processing
|
||||
* and always with the result TF filled.
|
||||
*/
|
||||
if (unlikely(ata_tag_internal(qc->tag))) {
|
||||
fill_result_tf(qc);
|
||||
__ata_qc_complete(qc);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!ata_tag_internal(qc->tag))
|
||||
ata_qc_schedule_eh(qc);
|
||||
else
|
||||
__ata_qc_complete(qc);
|
||||
/*
|
||||
* Non-internal qc has failed. Fill the result TF and
|
||||
* summon EH.
|
||||
*/
|
||||
if (unlikely(qc->flags & ATA_QCFLAG_FAILED)) {
|
||||
fill_result_tf(qc);
|
||||
ata_qc_schedule_eh(qc);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1099,13 +1099,13 @@ static int ata_scsi_dev_config(struct scsi_device *sdev,
|
|||
/* configure max sectors */
|
||||
blk_queue_max_sectors(sdev->request_queue, dev->max_sectors);
|
||||
|
||||
sdev->sector_size = ATA_SECT_SIZE;
|
||||
|
||||
if (dev->class == ATA_DEV_ATAPI) {
|
||||
struct request_queue *q = sdev->request_queue;
|
||||
void *buf;
|
||||
|
||||
/* set the min alignment and padding */
|
||||
blk_queue_update_dma_alignment(sdev->request_queue,
|
||||
ATA_DMA_PAD_SZ - 1);
|
||||
/* set DMA padding */
|
||||
blk_queue_update_dma_pad(sdev->request_queue,
|
||||
ATA_DMA_PAD_SZ - 1);
|
||||
|
||||
|
|
@ -1119,12 +1119,24 @@ static int ata_scsi_dev_config(struct scsi_device *sdev,
|
|||
|
||||
blk_queue_dma_drain(q, atapi_drain_needed, buf, ATAPI_MAX_DRAIN);
|
||||
} else {
|
||||
/* ATA devices must be sector aligned */
|
||||
blk_queue_update_dma_alignment(sdev->request_queue,
|
||||
ATA_SECT_SIZE - 1);
|
||||
sdev->manage_start_stop = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* ata_pio_sectors() expects buffer for each sector to not cross
|
||||
* page boundary. Enforce it by requiring buffers to be sector
|
||||
* aligned, which works iff sector_size is not larger than
|
||||
* PAGE_SIZE. ATAPI devices also need the alignment as
|
||||
* IDENTIFY_PACKET is executed as ATA_PROT_PIO.
|
||||
*/
|
||||
if (sdev->sector_size > PAGE_SIZE)
|
||||
ata_dev_printk(dev, KERN_WARNING,
|
||||
"sector_size=%u > PAGE_SIZE, PIO may malfunction\n",
|
||||
sdev->sector_size);
|
||||
|
||||
blk_queue_update_dma_alignment(sdev->request_queue,
|
||||
sdev->sector_size - 1);
|
||||
|
||||
if (dev->flags & ATA_DFLAG_AN)
|
||||
set_bit(SDEV_EVT_MEDIA_CHANGE, sdev->supported_events);
|
||||
|
||||
|
|
|
|||
|
|
@ -610,7 +610,7 @@ static struct scsi_host_template mpc52xx_ata_sht = {
|
|||
};
|
||||
|
||||
static struct ata_port_operations mpc52xx_ata_port_ops = {
|
||||
.inherits = &ata_sff_port_ops,
|
||||
.inherits = &ata_bmdma_port_ops,
|
||||
.sff_dev_select = mpc52xx_ata_dev_select,
|
||||
.set_piomode = mpc52xx_ata_set_piomode,
|
||||
.set_dmamode = mpc52xx_ata_set_dmamode,
|
||||
|
|
|
|||
|
|
@ -40,6 +40,8 @@
|
|||
#include <linux/blkdev.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/device.h>
|
||||
#include <scsi/scsi.h>
|
||||
#include <scsi/scsi_cmnd.h>
|
||||
#include <scsi/scsi_host.h>
|
||||
#include <linux/libata.h>
|
||||
|
||||
|
|
@ -80,6 +82,7 @@ static int vt8251_scr_write(struct ata_link *link, unsigned int scr, u32 val);
|
|||
static void svia_tf_load(struct ata_port *ap, const struct ata_taskfile *tf);
|
||||
static void svia_noop_freeze(struct ata_port *ap);
|
||||
static int vt6420_prereset(struct ata_link *link, unsigned long deadline);
|
||||
static void vt6420_bmdma_start(struct ata_queued_cmd *qc);
|
||||
static int vt6421_pata_cable_detect(struct ata_port *ap);
|
||||
static void vt6421_set_pio_mode(struct ata_port *ap, struct ata_device *adev);
|
||||
static void vt6421_set_dma_mode(struct ata_port *ap, struct ata_device *adev);
|
||||
|
|
@ -121,6 +124,7 @@ static struct ata_port_operations vt6420_sata_ops = {
|
|||
.inherits = &svia_base_ops,
|
||||
.freeze = svia_noop_freeze,
|
||||
.prereset = vt6420_prereset,
|
||||
.bmdma_start = vt6420_bmdma_start,
|
||||
};
|
||||
|
||||
static struct ata_port_operations vt6421_pata_ops = {
|
||||
|
|
@ -377,6 +381,17 @@ static int vt6420_prereset(struct ata_link *link, unsigned long deadline)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void vt6420_bmdma_start(struct ata_queued_cmd *qc)
|
||||
{
|
||||
struct ata_port *ap = qc->ap;
|
||||
if ((qc->tf.command == ATA_CMD_PACKET) &&
|
||||
(qc->scsicmd->sc_data_direction == DMA_TO_DEVICE)) {
|
||||
/* Prevents corruption on some ATAPI burners */
|
||||
ata_sff_pause(ap);
|
||||
}
|
||||
ata_bmdma_start(qc);
|
||||
}
|
||||
|
||||
static int vt6421_pata_cable_detect(struct ata_port *ap)
|
||||
{
|
||||
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
|
||||
|
|
|
|||
|
|
@ -688,7 +688,7 @@ void solos_bh(unsigned long card_arg)
|
|||
size);
|
||||
}
|
||||
if (atmdebug) {
|
||||
dev_info(&card->dev->dev, "Received: device %d\n", port);
|
||||
dev_info(&card->dev->dev, "Received: port %d\n", port);
|
||||
dev_info(&card->dev->dev, "size: %d VPI: %d VCI: %d\n",
|
||||
size, le16_to_cpu(header->vpi),
|
||||
le16_to_cpu(header->vci));
|
||||
|
|
@ -1008,8 +1008,15 @@ static uint32_t fpga_tx(struct solos_card *card)
|
|||
|
||||
/* Clean up and free oldskb now it's gone */
|
||||
if (atmdebug) {
|
||||
struct pkt_hdr *header = (void *)oldskb->data;
|
||||
int size = le16_to_cpu(header->size);
|
||||
|
||||
skb_pull(oldskb, sizeof(*header));
|
||||
dev_info(&card->dev->dev, "Transmitted: port %d\n",
|
||||
port);
|
||||
dev_info(&card->dev->dev, "size: %d VPI: %d VCI: %d\n",
|
||||
size, le16_to_cpu(header->vpi),
|
||||
le16_to_cpu(header->vci));
|
||||
print_buffer(oldskb);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -165,6 +165,7 @@ static void SA5_submit_command( ctlr_info_t *h, CommandList_struct *c)
|
|||
printk("Sending %x - down to controller\n", c->busaddr );
|
||||
#endif /* CCISS_DEBUG */
|
||||
writel(c->busaddr, h->vaddr + SA5_REQUEST_PORT_OFFSET);
|
||||
readl(h->vaddr + SA5_REQUEST_PORT_OFFSET);
|
||||
h->commands_outstanding++;
|
||||
if ( h->commands_outstanding > h->max_outstanding)
|
||||
h->max_outstanding = h->commands_outstanding;
|
||||
|
|
|
|||
|
|
@ -2408,7 +2408,7 @@ static void pkt_release_dev(struct pktcdvd_device *pd, int flush)
|
|||
pkt_shrink_pktlist(pd);
|
||||
}
|
||||
|
||||
static struct pktcdvd_device *pkt_find_dev_from_minor(int dev_minor)
|
||||
static struct pktcdvd_device *pkt_find_dev_from_minor(unsigned int dev_minor)
|
||||
{
|
||||
if (dev_minor >= MAX_WRITERS)
|
||||
return NULL;
|
||||
|
|
|
|||
|
|
@ -59,9 +59,21 @@ static struct usb_device_id btusb_table[] = {
|
|||
/* Generic Bluetooth USB device */
|
||||
{ USB_DEVICE_INFO(0xe0, 0x01, 0x01) },
|
||||
|
||||
/* Apple MacBookPro 7,1 */
|
||||
{ USB_DEVICE(0x05ac, 0x8213) },
|
||||
|
||||
/* Apple iMac11,1 */
|
||||
{ USB_DEVICE(0x05ac, 0x8215) },
|
||||
|
||||
/* Apple MacBookPro6,2 */
|
||||
{ USB_DEVICE(0x05ac, 0x8218) },
|
||||
|
||||
/* Apple MacBookAir3,1, MacBookAir3,2 */
|
||||
{ USB_DEVICE(0x05ac, 0x821b) },
|
||||
|
||||
/* Apple MacBookPro8,2 */
|
||||
{ USB_DEVICE(0x05ac, 0x821a) },
|
||||
|
||||
/* AVM BlueFRITZ! USB v2.0 */
|
||||
{ USB_DEVICE(0x057c, 0x3800) },
|
||||
|
||||
|
|
|
|||
|
|
@ -123,6 +123,9 @@ static struct agp_memory *agp_create_user_memory(unsigned long num_agp_pages)
|
|||
struct agp_memory *new;
|
||||
unsigned long alloc_size = num_agp_pages*sizeof(struct page *);
|
||||
|
||||
if (INT_MAX/sizeof(struct page *) < num_agp_pages)
|
||||
return NULL;
|
||||
|
||||
new = kzalloc(sizeof(struct agp_memory), GFP_KERNEL);
|
||||
if (new == NULL)
|
||||
return NULL;
|
||||
|
|
@ -242,11 +245,14 @@ struct agp_memory *agp_allocate_memory(struct agp_bridge_data *bridge,
|
|||
int scratch_pages;
|
||||
struct agp_memory *new;
|
||||
size_t i;
|
||||
int cur_memory;
|
||||
|
||||
if (!bridge)
|
||||
return NULL;
|
||||
|
||||
if ((atomic_read(&bridge->current_memory_agp) + page_count) > bridge->max_memory_agp)
|
||||
cur_memory = atomic_read(&bridge->current_memory_agp);
|
||||
if ((cur_memory + page_count > bridge->max_memory_agp) ||
|
||||
(cur_memory + page_count < page_count))
|
||||
return NULL;
|
||||
|
||||
if (type >= AGP_USER_TYPES) {
|
||||
|
|
@ -1123,8 +1129,8 @@ int agp_generic_insert_memory(struct agp_memory * mem, off_t pg_start, int type)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* AK: could wrap */
|
||||
if ((pg_start + mem->page_count) > num_entries)
|
||||
if (((pg_start + mem->page_count) > num_entries) ||
|
||||
((pg_start + mem->page_count) < pg_start))
|
||||
return -EINVAL;
|
||||
|
||||
j = pg_start;
|
||||
|
|
@ -1158,7 +1164,7 @@ int agp_generic_remove_memory(struct agp_memory *mem, off_t pg_start, int type)
|
|||
{
|
||||
size_t i;
|
||||
struct agp_bridge_data *bridge;
|
||||
int mask_type;
|
||||
int mask_type, num_entries;
|
||||
|
||||
bridge = mem->bridge;
|
||||
if (!bridge)
|
||||
|
|
@ -1170,6 +1176,11 @@ int agp_generic_remove_memory(struct agp_memory *mem, off_t pg_start, int type)
|
|||
if (type != mem->type)
|
||||
return -EINVAL;
|
||||
|
||||
num_entries = agp_num_entries();
|
||||
if (((pg_start + mem->page_count) > num_entries) ||
|
||||
((pg_start + mem->page_count) < pg_start))
|
||||
return -EINVAL;
|
||||
|
||||
mask_type = bridge->driver->agp_type_to_mask_type(bridge, type);
|
||||
if (mask_type != 0) {
|
||||
/* The generic routines know nothing of memory types */
|
||||
|
|
|
|||
|
|
@ -139,6 +139,8 @@ struct hvc_iucv_private *hvc_iucv_get_private(uint32_t num)
|
|||
*
|
||||
* This function allocates a new struct iucv_tty_buffer element and, optionally,
|
||||
* allocates an internal data buffer with the specified size @size.
|
||||
* The internal data buffer is always allocated with GFP_DMA which is
|
||||
* required for receiving and sending data with IUCV.
|
||||
* Note: The total message size arises from the internal buffer size and the
|
||||
* members of the iucv_tty_msg structure.
|
||||
* The function returns NULL if memory allocation has failed.
|
||||
|
|
@ -154,7 +156,7 @@ static struct iucv_tty_buffer *alloc_tty_buffer(size_t size, gfp_t flags)
|
|||
|
||||
if (size > 0) {
|
||||
bufp->msg.length = MSG_SIZE(size);
|
||||
bufp->mbuf = kmalloc(bufp->msg.length, flags);
|
||||
bufp->mbuf = kmalloc(bufp->msg.length, flags | GFP_DMA);
|
||||
if (!bufp->mbuf) {
|
||||
mempool_free(bufp, hvc_iucv_mempool);
|
||||
return NULL;
|
||||
|
|
@ -237,7 +239,7 @@ static int hvc_iucv_write(struct hvc_iucv_private *priv,
|
|||
if (!rb->mbuf) { /* message not yet received ... */
|
||||
/* allocate mem to store msg data; if no memory is available
|
||||
* then leave the buffer on the list and re-try later */
|
||||
rb->mbuf = kmalloc(rb->msg.length, GFP_ATOMIC);
|
||||
rb->mbuf = kmalloc(rb->msg.length, GFP_ATOMIC | GFP_DMA);
|
||||
if (!rb->mbuf)
|
||||
return -ENOMEM;
|
||||
|
||||
|
|
|
|||
|
|
@ -119,7 +119,7 @@ static int i8k_smm(struct smm_regs *regs)
|
|||
int eax = regs->eax;
|
||||
|
||||
#if defined(CONFIG_X86_64)
|
||||
asm("pushq %%rax\n\t"
|
||||
asm volatile("pushq %%rax\n\t"
|
||||
"movl 0(%%rax),%%edx\n\t"
|
||||
"pushq %%rdx\n\t"
|
||||
"movl 4(%%rax),%%ebx\n\t"
|
||||
|
|
@ -145,7 +145,7 @@ static int i8k_smm(struct smm_regs *regs)
|
|||
: "a"(regs)
|
||||
: "%ebx", "%ecx", "%edx", "%esi", "%edi", "memory");
|
||||
#else
|
||||
asm("pushl %%eax\n\t"
|
||||
asm volatile("pushl %%eax\n\t"
|
||||
"movl 0(%%eax),%%edx\n\t"
|
||||
"push %%edx\n\t"
|
||||
"movl 4(%%eax),%%ebx\n\t"
|
||||
|
|
@ -166,7 +166,8 @@ static int i8k_smm(struct smm_regs *regs)
|
|||
"movl %%edx,0(%%eax)\n\t"
|
||||
"lahf\n\t"
|
||||
"shrl $8,%%eax\n\t"
|
||||
"andl $1,%%eax\n":"=a"(rc)
|
||||
"andl $1,%%eax\n"
|
||||
:"=a"(rc)
|
||||
: "a"(regs)
|
||||
: "%ebx", "%ecx", "%edx", "%esi", "%edi", "memory");
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -353,12 +353,14 @@ unsigned long tpm_calc_ordinal_duration(struct tpm_chip *chip,
|
|||
tpm_protected_ordinal_duration[ordinal &
|
||||
TPM_PROTECTED_ORDINAL_MASK];
|
||||
|
||||
if (duration_idx != TPM_UNDEFINED)
|
||||
if (duration_idx != TPM_UNDEFINED) {
|
||||
duration = chip->vendor.duration[duration_idx];
|
||||
if (duration <= 0)
|
||||
/* if duration is 0, it's because chip->vendor.duration wasn't */
|
||||
/* filled yet, so we set the lowest timeout just to give enough */
|
||||
/* time for tpm_get_timeouts() to succeed */
|
||||
return (duration <= 0 ? HZ : duration);
|
||||
} else
|
||||
return 2 * 60 * HZ;
|
||||
else
|
||||
return duration;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(tpm_calc_ordinal_duration);
|
||||
|
||||
|
|
@ -564,9 +566,11 @@ duration:
|
|||
if (rc)
|
||||
return;
|
||||
|
||||
if (be32_to_cpu(tpm_cmd.header.out.return_code)
|
||||
!= 3 * sizeof(u32))
|
||||
if (be32_to_cpu(tpm_cmd.header.out.return_code) != 0 ||
|
||||
be32_to_cpu(tpm_cmd.header.out.length)
|
||||
!= sizeof(tpm_cmd.header.out) + sizeof(u32) + 3 * sizeof(u32))
|
||||
return;
|
||||
|
||||
duration_cap = &tpm_cmd.params.getcap_out.cap.duration;
|
||||
chip->vendor.duration[TPM_SHORT] =
|
||||
usecs_to_jiffies(be32_to_cpu(duration_cap->tpm_short));
|
||||
|
|
@ -910,6 +914,18 @@ ssize_t tpm_show_caps_1_2(struct device * dev,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(tpm_show_caps_1_2);
|
||||
|
||||
ssize_t tpm_show_timeouts(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct tpm_chip *chip = dev_get_drvdata(dev);
|
||||
|
||||
return sprintf(buf, "%d %d %d\n",
|
||||
jiffies_to_usecs(chip->vendor.duration[TPM_SHORT]),
|
||||
jiffies_to_usecs(chip->vendor.duration[TPM_MEDIUM]),
|
||||
jiffies_to_usecs(chip->vendor.duration[TPM_LONG]));
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(tpm_show_timeouts);
|
||||
|
||||
ssize_t tpm_store_cancel(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
|
|
@ -953,7 +969,7 @@ int tpm_open(struct inode *inode, struct file *file)
|
|||
return -EBUSY;
|
||||
}
|
||||
|
||||
chip->data_buffer = kmalloc(TPM_BUFSIZE * sizeof(u8), GFP_KERNEL);
|
||||
chip->data_buffer = kzalloc(TPM_BUFSIZE, GFP_KERNEL);
|
||||
if (chip->data_buffer == NULL) {
|
||||
clear_bit(0, &chip->is_open);
|
||||
put_device(chip->dev);
|
||||
|
|
|
|||
|
|
@ -56,6 +56,8 @@ extern ssize_t tpm_show_owned(struct device *, struct device_attribute *attr,
|
|||
char *);
|
||||
extern ssize_t tpm_show_temp_deactivated(struct device *,
|
||||
struct device_attribute *attr, char *);
|
||||
extern ssize_t tpm_show_timeouts(struct device *,
|
||||
struct device_attribute *attr, char *);
|
||||
|
||||
struct tpm_chip;
|
||||
|
||||
|
|
|
|||
|
|
@ -354,6 +354,7 @@ static DEVICE_ATTR(temp_deactivated, S_IRUGO, tpm_show_temp_deactivated,
|
|||
NULL);
|
||||
static DEVICE_ATTR(caps, S_IRUGO, tpm_show_caps_1_2, NULL);
|
||||
static DEVICE_ATTR(cancel, S_IWUSR | S_IWGRP, NULL, tpm_store_cancel);
|
||||
static DEVICE_ATTR(timeouts, S_IRUGO, tpm_show_timeouts, NULL);
|
||||
|
||||
static struct attribute *tis_attrs[] = {
|
||||
&dev_attr_pubek.attr,
|
||||
|
|
@ -363,7 +364,8 @@ static struct attribute *tis_attrs[] = {
|
|||
&dev_attr_owned.attr,
|
||||
&dev_attr_temp_deactivated.attr,
|
||||
&dev_attr_caps.attr,
|
||||
&dev_attr_cancel.attr, NULL,
|
||||
&dev_attr_cancel.attr,
|
||||
&dev_attr_timeouts.attr, NULL,
|
||||
};
|
||||
|
||||
static struct attribute_group tis_attr_grp = {
|
||||
|
|
|
|||
|
|
@ -267,8 +267,10 @@ int dcdbas_smi_request(struct smi_cmd *smi_cmd)
|
|||
}
|
||||
|
||||
/* generate SMI */
|
||||
/* inb to force posted write through and make SMI happen now */
|
||||
asm volatile (
|
||||
"outb %b0,%w1"
|
||||
"outb %b0,%w1\n"
|
||||
"inb %w1"
|
||||
: /* no output args */
|
||||
: "a" (smi_cmd->command_code),
|
||||
"d" (smi_cmd->command_address),
|
||||
|
|
|
|||
|
|
@ -92,7 +92,10 @@ config DRM_I830
|
|||
config DRM_I915
|
||||
tristate "i915 driver"
|
||||
depends on AGP_INTEL
|
||||
# we need shmfs for the swappable backing store, and in particular
|
||||
# the shmem_readpage() which depends upon tmpfs
|
||||
select SHMEM
|
||||
select TMPFS
|
||||
select DRM_KMS_HELPER
|
||||
select FB_CFB_FILLRECT
|
||||
select FB_CFB_COPYAREA
|
||||
|
|
|
|||
|
|
@ -540,7 +540,8 @@ int drm_modeset_ctl(struct drm_device *dev, void *data,
|
|||
struct drm_file *file_priv)
|
||||
{
|
||||
struct drm_modeset_ctl *modeset = data;
|
||||
int crtc, ret = 0;
|
||||
int ret = 0;
|
||||
unsigned int crtc;
|
||||
|
||||
/* If drm_vblank_init() hasn't been called yet, just no-op */
|
||||
if (!dev->num_crtcs)
|
||||
|
|
|
|||
|
|
@ -882,6 +882,14 @@ static const struct dmi_system_id intel_no_lvds[] = {
|
|||
DMI_MATCH(DMI_BOARD_NAME, "i915GMx-F"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = intel_no_lvds_dmi_callback,
|
||||
.ident = "AOpen i915GMm-HFS",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "AOpen"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "i915GMm-HFS"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = intel_no_lvds_dmi_callback,
|
||||
.ident = "Aopen i945GTt-VFA",
|
||||
|
|
|
|||
|
|
@ -126,7 +126,7 @@ static uint32_t atom_iio_execute(struct atom_context *ctx, int base,
|
|||
case ATOM_IIO_MOVE_INDEX:
|
||||
temp &=
|
||||
~((0xFFFFFFFF >> (32 - CU8(base + 1))) <<
|
||||
CU8(base + 2));
|
||||
CU8(base + 3));
|
||||
temp |=
|
||||
((index >> CU8(base + 2)) &
|
||||
(0xFFFFFFFF >> (32 - CU8(base + 1)))) << CU8(base +
|
||||
|
|
@ -136,7 +136,7 @@ static uint32_t atom_iio_execute(struct atom_context *ctx, int base,
|
|||
case ATOM_IIO_MOVE_DATA:
|
||||
temp &=
|
||||
~((0xFFFFFFFF >> (32 - CU8(base + 1))) <<
|
||||
CU8(base + 2));
|
||||
CU8(base + 3));
|
||||
temp |=
|
||||
((data >> CU8(base + 2)) &
|
||||
(0xFFFFFFFF >> (32 - CU8(base + 1)))) << CU8(base +
|
||||
|
|
@ -146,7 +146,7 @@ static uint32_t atom_iio_execute(struct atom_context *ctx, int base,
|
|||
case ATOM_IIO_MOVE_ATTR:
|
||||
temp &=
|
||||
~((0xFFFFFFFF >> (32 - CU8(base + 1))) <<
|
||||
CU8(base + 2));
|
||||
CU8(base + 3));
|
||||
temp |=
|
||||
((ctx->
|
||||
io_attr >> CU8(base + 2)) & (0xFFFFFFFF >> (32 -
|
||||
|
|
|
|||
|
|
@ -152,6 +152,13 @@ static bool radeon_atom_apply_quirks(struct drm_device *dev,
|
|||
return false;
|
||||
}
|
||||
|
||||
/* mac rv630, rv730, others */
|
||||
if ((supported_device == ATOM_DEVICE_TV1_SUPPORT) &&
|
||||
(*connector_type == DRM_MODE_CONNECTOR_DVII)) {
|
||||
*connector_type = DRM_MODE_CONNECTOR_9PinDIN;
|
||||
*line_mux = CONNECTOR_7PIN_DIN_ENUM_ID1;
|
||||
}
|
||||
|
||||
/* ASUS HD 3600 XT board lists the DVI port as HDMI */
|
||||
if ((dev->pdev->device == 0x9598) &&
|
||||
(dev->pdev->subsystem_vendor == 0x1043) &&
|
||||
|
|
@ -1210,7 +1217,7 @@ void radeon_atom_initialize_bios_scratch_regs(struct drm_device *dev)
|
|||
bios_2_scratch &= ~ATOM_S2_VRI_BRIGHT_ENABLE;
|
||||
|
||||
/* tell the bios not to handle mode switching */
|
||||
bios_6_scratch |= (ATOM_S6_ACC_BLOCK_DISPLAY_SWITCH | ATOM_S6_ACC_MODE);
|
||||
bios_6_scratch |= ATOM_S6_ACC_BLOCK_DISPLAY_SWITCH;
|
||||
|
||||
if (rdev->family >= CHIP_R600) {
|
||||
WREG32(R600_BIOS_2_SCRATCH, bios_2_scratch);
|
||||
|
|
@ -1261,10 +1268,13 @@ void radeon_atom_output_lock(struct drm_encoder *encoder, bool lock)
|
|||
else
|
||||
bios_6_scratch = RREG32(RADEON_BIOS_6_SCRATCH);
|
||||
|
||||
if (lock)
|
||||
if (lock) {
|
||||
bios_6_scratch |= ATOM_S6_CRITICAL_STATE;
|
||||
else
|
||||
bios_6_scratch &= ~ATOM_S6_ACC_MODE;
|
||||
} else {
|
||||
bios_6_scratch &= ~ATOM_S6_CRITICAL_STATE;
|
||||
bios_6_scratch |= ATOM_S6_ACC_MODE;
|
||||
}
|
||||
|
||||
if (rdev->family >= CHIP_R600)
|
||||
WREG32(R600_BIOS_6_SCRATCH, bios_6_scratch);
|
||||
|
|
|
|||
|
|
@ -540,6 +540,10 @@ void radeon_compute_pll(struct radeon_pll *pll,
|
|||
*frac_fb_div_p = best_frac_feedback_div;
|
||||
*ref_div_p = best_ref_div;
|
||||
*post_div_p = best_post_div;
|
||||
DRM_DEBUG_KMS("%d %d, pll dividers - fb: %d.%d ref: %d, post %d\n",
|
||||
freq, best_freq / 1000, best_feedback_div, best_frac_feedback_div,
|
||||
best_ref_div, best_post_div);
|
||||
|
||||
}
|
||||
|
||||
static void radeon_user_framebuffer_destroy(struct drm_framebuffer *fb)
|
||||
|
|
|
|||
|
|
@ -53,6 +53,27 @@ struct apple_key_translation {
|
|||
u8 flags;
|
||||
};
|
||||
|
||||
static const struct apple_key_translation macbookair_fn_keys[] = {
|
||||
{ KEY_BACKSPACE, KEY_DELETE },
|
||||
{ KEY_ENTER, KEY_INSERT },
|
||||
{ KEY_F1, KEY_BRIGHTNESSDOWN, APPLE_FLAG_FKEY },
|
||||
{ KEY_F2, KEY_BRIGHTNESSUP, APPLE_FLAG_FKEY },
|
||||
{ KEY_F3, KEY_SCALE, APPLE_FLAG_FKEY },
|
||||
{ KEY_F4, KEY_DASHBOARD, APPLE_FLAG_FKEY },
|
||||
{ KEY_F6, KEY_PREVIOUSSONG, APPLE_FLAG_FKEY },
|
||||
{ KEY_F7, KEY_PLAYPAUSE, APPLE_FLAG_FKEY },
|
||||
{ KEY_F8, KEY_NEXTSONG, APPLE_FLAG_FKEY },
|
||||
{ KEY_F9, KEY_MUTE, APPLE_FLAG_FKEY },
|
||||
{ KEY_F10, KEY_VOLUMEDOWN, APPLE_FLAG_FKEY },
|
||||
{ KEY_F11, KEY_VOLUMEUP, APPLE_FLAG_FKEY },
|
||||
{ KEY_F12, KEY_EJECTCD, APPLE_FLAG_FKEY },
|
||||
{ KEY_UP, KEY_PAGEUP },
|
||||
{ KEY_DOWN, KEY_PAGEDOWN },
|
||||
{ KEY_LEFT, KEY_HOME },
|
||||
{ KEY_RIGHT, KEY_END },
|
||||
{ }
|
||||
};
|
||||
|
||||
static const struct apple_key_translation apple_fn_keys[] = {
|
||||
{ KEY_BACKSPACE, KEY_DELETE },
|
||||
{ KEY_ENTER, KEY_INSERT },
|
||||
|
|
@ -151,10 +172,15 @@ static int hidinput_apple_event(struct hid_device *hid, struct input_dev *input,
|
|||
if (fnmode) {
|
||||
int do_translate;
|
||||
|
||||
trans = apple_find_translation((hid->product < 0x21d ||
|
||||
hid->product >= 0x300) ?
|
||||
powerbook_fn_keys : apple_fn_keys,
|
||||
usage->code);
|
||||
if(hid->product >= USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI &&
|
||||
hid->product <= USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS) {
|
||||
trans = apple_find_translation(macbookair_fn_keys, usage->code);
|
||||
} else if (hid->product < 0x21d || hid->product >= 0x300) {
|
||||
trans = apple_find_translation(powerbook_fn_keys, usage->code);
|
||||
} else {
|
||||
trans = apple_find_translation(apple_fn_keys, usage->code);
|
||||
}
|
||||
|
||||
if (trans) {
|
||||
if (test_bit(usage->code, asc->pressed_fn))
|
||||
do_translate = 1;
|
||||
|
|
@ -431,6 +457,18 @@ static const struct hid_device_id apple_devices[] = {
|
|||
.driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_JIS),
|
||||
.driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI),
|
||||
.driver_data = APPLE_HAS_FN },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_ISO),
|
||||
.driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_JIS),
|
||||
.driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI),
|
||||
.driver_data = APPLE_HAS_FN },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO),
|
||||
.driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS),
|
||||
.driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS },
|
||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI),
|
||||
.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
|
||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO),
|
||||
|
|
|
|||
|
|
@ -1287,6 +1287,12 @@ static const struct hid_device_id hid_blacklist[] = {
|
|||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ISO) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_JIS) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_ISO) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_JIS) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS) },
|
||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI) },
|
||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO) },
|
||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS) },
|
||||
|
|
@ -1297,6 +1303,7 @@ static const struct hid_device_id hid_blacklist[] = {
|
|||
{ HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_TACTICAL_PAD) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_1) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_2) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_3) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_MOUSE) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, 0x0006) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_EZKEY, USB_DEVICE_ID_BTC_8193) },
|
||||
|
|
@ -1704,6 +1711,12 @@ static const struct hid_device_id hid_mouse_ignore_list[] = {
|
|||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ISO) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_JIS) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_ISO) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4_JIS) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) },
|
||||
{ }
|
||||
|
|
|
|||
|
|
@ -126,6 +126,8 @@ static const struct hid_device_id cp_devices[] = {
|
|||
.driver_data = CP_RDESC_SWAPPED_MIN_MAX },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_2),
|
||||
.driver_data = CP_RDESC_SWAPPED_MIN_MAX },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_3),
|
||||
.driver_data = CP_RDESC_SWAPPED_MIN_MAX },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_MOUSE),
|
||||
.driver_data = CP_2WHEEL_MOUSE_HACK },
|
||||
{ }
|
||||
|
|
|
|||
|
|
@ -88,6 +88,12 @@
|
|||
#define USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI 0x0236
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING3_ISO 0x0237
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING3_JIS 0x0238
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI 0x023f
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING4_ISO 0x0240
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING4_JIS 0x0241
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI 0x0242
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO 0x0243
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS 0x0244
|
||||
#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI 0x0239
|
||||
#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO 0x023a
|
||||
#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS 0x023b
|
||||
|
|
@ -148,6 +154,7 @@
|
|||
#define USB_DEVICE_ID_CYPRESS_ULTRAMOUSE 0x7417
|
||||
#define USB_DEVICE_ID_CYPRESS_BARCODE_1 0xde61
|
||||
#define USB_DEVICE_ID_CYPRESS_BARCODE_2 0xde64
|
||||
#define USB_DEVICE_ID_CYPRESS_BARCODE_3 0xbca1
|
||||
|
||||
#define USB_VENDOR_ID_DEALEXTREAME 0x10c5
|
||||
#define USB_DEVICE_ID_DEALEXTREAME_RADIO_SI4701 0x819a
|
||||
|
|
|
|||
|
|
@ -142,6 +142,30 @@ static const char *temperature_sensors_sets[][41] = {
|
|||
"TM1S", "TM2P", "TM2S", "TM3S", "TM8P", "TM8S", "TM9P", "TM9S",
|
||||
"TN0C", "TN0D", "TN0H", "TS0C", "Tp0C", "Tp1C", "Tv0S", "Tv1S",
|
||||
NULL },
|
||||
/* Set 17: iMac 9,1 */
|
||||
{ "TA0P", "TC0D", "TC0H", "TC0P", "TG0D", "TG0H", "TH0P", "TL0P",
|
||||
"TN0D", "TN0H", "TN0P", "TO0P", "Tm0P", "Tp0P", NULL },
|
||||
/* Set 18: MacBook Pro 2,2 */
|
||||
{ "TB0T", "TC0D", "TC0P", "TG0H", "TG0P", "TG0T", "TM0P", "TTF0",
|
||||
"Th0H", "Th1H", "Tm0P", "Ts0P", NULL },
|
||||
/* Set 19: Macbook Pro 5,3 */
|
||||
{ "TB0T", "TB1T", "TB2T", "TB3T", "TC0D", "TC0F", "TC0P", "TG0D",
|
||||
"TG0F", "TG0H", "TG0P", "TG0T", "TN0D", "TN0P", "TTF0", "Th2H",
|
||||
"Tm0P", "Ts0P", "Ts0S", NULL },
|
||||
/* Set 20: MacBook Pro 5,4 */
|
||||
{ "TB0T", "TB1T", "TB2T", "TB3T", "TC0D", "TC0F", "TC0P", "TN0D",
|
||||
"TN0P", "TTF0", "Th2H", "Ts0P", "Ts0S", NULL },
|
||||
/* Set 21: MacBook Pro 6,2 */
|
||||
{ "TB0T", "TB1T", "TB2T", "TC0C", "TC0D", "TC0P", "TC1C", "TG0D",
|
||||
"TG0P", "TG0T", "TMCD", "TP0P", "TPCD", "Th1H", "Th2H", "Tm0P",
|
||||
"Ts0P", "Ts0S", NULL },
|
||||
/* Set 22: MacBook Pro 7,1 */
|
||||
{ "TB0T", "TB1T", "TB2T", "TC0D", "TC0P", "TN0D", "TN0P", "TN0S",
|
||||
"TN1D", "TN1F", "TN1G", "TN1S", "Th1H", "Ts0P", "Ts0S", NULL },
|
||||
/* Set 23: MacBook Air 3,1 */
|
||||
{ "TB0T", "TB1T", "TB2T", "TC0D", "TC0E", "TC0P", "TC1E", "TCZ3",
|
||||
"TCZ4", "TCZ5", "TG0E", "TG1E", "TG2E", "TGZ3", "TGZ4", "TGZ5",
|
||||
"TH0F", "TH0O", "TM0P" },
|
||||
};
|
||||
|
||||
/* List of keys used to read/write fan speeds */
|
||||
|
|
@ -1350,11 +1374,29 @@ static __initdata struct dmi_match_data applesmc_dmi_data[] = {
|
|||
{ .accelerometer = 1, .light = 1, .temperature_set = 15 },
|
||||
/* MacPro3,1: temperature set 16 */
|
||||
{ .accelerometer = 0, .light = 0, .temperature_set = 16 },
|
||||
/* iMac 9,1: light sensor only, temperature set 17 */
|
||||
{ .accelerometer = 0, .light = 0, .temperature_set = 17 },
|
||||
/* MacBook Pro 2,2: accelerometer, backlight and temperature set 18 */
|
||||
{ .accelerometer = 1, .light = 1, .temperature_set = 18 },
|
||||
/* MacBook Pro 5,3: accelerometer, backlight and temperature set 19 */
|
||||
{ .accelerometer = 1, .light = 1, .temperature_set = 19 },
|
||||
/* MacBook Pro 5,4: accelerometer, backlight and temperature set 20 */
|
||||
{ .accelerometer = 1, .light = 1, .temperature_set = 20 },
|
||||
/* MacBook Pro 6,2: accelerometer, backlight and temperature set 21 */
|
||||
{ .accelerometer = 1, .light = 1, .temperature_set = 21 },
|
||||
/* MacBook Pro 7,1: accelerometer, backlight and temperature set 22 */
|
||||
{ .accelerometer = 1, .light = 1, .temperature_set = 22 },
|
||||
/* MacBook Air 3,1: accelerometer, backlight and temperature set 23 */
|
||||
{ .accelerometer = 0, .light = 0, .temperature_set = 23 },
|
||||
};
|
||||
|
||||
/* Note that DMI_MATCH(...,"MacBook") will match "MacBookPro1,1".
|
||||
* So we need to put "Apple MacBook Pro" before "Apple MacBook". */
|
||||
static __initdata struct dmi_system_id applesmc_whitelist[] = {
|
||||
{ applesmc_dmi_match, "Apple MacBook Air 3", {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "MacBookAir3") },
|
||||
&applesmc_dmi_data[23]},
|
||||
{ applesmc_dmi_match, "Apple MacBook Air 2", {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "MacBookAir2") },
|
||||
|
|
@ -1363,6 +1405,22 @@ static __initdata struct dmi_system_id applesmc_whitelist[] = {
|
|||
DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "MacBookAir") },
|
||||
&applesmc_dmi_data[7]},
|
||||
{ applesmc_dmi_match, "Apple MacBook Pro 7", {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro7") },
|
||||
&applesmc_dmi_data[22]},
|
||||
{ applesmc_dmi_match, "Apple MacBook Pro 5,4", {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5,4") },
|
||||
&applesmc_dmi_data[20]},
|
||||
{ applesmc_dmi_match, "Apple MacBook Pro 5,3", {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5,3") },
|
||||
&applesmc_dmi_data[19]},
|
||||
{ applesmc_dmi_match, "Apple MacBook Pro 6", {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro6") },
|
||||
&applesmc_dmi_data[21]},
|
||||
{ applesmc_dmi_match, "Apple MacBook Pro 5", {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5") },
|
||||
|
|
@ -1375,6 +1433,10 @@ static __initdata struct dmi_system_id applesmc_whitelist[] = {
|
|||
DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro3") },
|
||||
&applesmc_dmi_data[9]},
|
||||
{ applesmc_dmi_match, "Apple MacBook Pro 2,2", {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Apple Computer, Inc."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro2,2") },
|
||||
&applesmc_dmi_data[18]},
|
||||
{ applesmc_dmi_match, "Apple MacBook Pro", {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME,"MacBookPro") },
|
||||
|
|
@ -1415,6 +1477,10 @@ static __initdata struct dmi_system_id applesmc_whitelist[] = {
|
|||
DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "MacPro") },
|
||||
&applesmc_dmi_data[4]},
|
||||
{ applesmc_dmi_match, "Apple iMac 9,1", {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Apple Inc."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "iMac9,1") },
|
||||
&applesmc_dmi_data[17]},
|
||||
{ applesmc_dmi_match, "Apple iMac 8", {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "iMac8") },
|
||||
|
|
|
|||
|
|
@ -1957,7 +1957,6 @@ static int f71882fg_remove(struct platform_device *pdev)
|
|||
int i;
|
||||
struct f71882fg_data *data = platform_get_drvdata(pdev);
|
||||
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
if (data->hwmon_dev)
|
||||
hwmon_device_unregister(data->hwmon_dev);
|
||||
|
||||
|
|
@ -1982,6 +1981,7 @@ static int f71882fg_remove(struct platform_device *pdev)
|
|||
for (i = 0; i < ARRAY_SIZE(f8000_fan_attr); i++)
|
||||
device_remove_file(&pdev->dev, &f8000_fan_attr[i].dev_attr);
|
||||
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
kfree(data);
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -332,11 +332,11 @@ static inline int sht15_calc_humid(struct sht15_data *data)
|
|||
|
||||
const int c1 = -4;
|
||||
const int c2 = 40500; /* x 10 ^ -6 */
|
||||
const int c3 = -2800; /* x10 ^ -9 */
|
||||
const int c3 = -28; /* x 10 ^ -7 */
|
||||
|
||||
RHlinear = c1*1000
|
||||
+ c2 * data->val_humid/1000
|
||||
+ (data->val_humid * data->val_humid * c3)/1000000;
|
||||
+ (data->val_humid * data->val_humid * c3) / 10000;
|
||||
return (temp - 25000) * (10000 + 80 * data->val_humid)
|
||||
/ 1000000 + RHlinear;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -687,6 +687,13 @@ static int __devexit via686a_remove(struct platform_device *pdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void via686a_update_fan_div(struct via686a_data *data)
|
||||
{
|
||||
int reg = via686a_read_value(data, VIA686A_REG_FANDIV);
|
||||
data->fan_div[0] = (reg >> 4) & 0x03;
|
||||
data->fan_div[1] = reg >> 6;
|
||||
}
|
||||
|
||||
static void __devinit via686a_init_device(struct via686a_data *data)
|
||||
{
|
||||
u8 reg;
|
||||
|
|
@ -700,6 +707,9 @@ static void __devinit via686a_init_device(struct via686a_data *data)
|
|||
via686a_write_value(data, VIA686A_REG_TEMP_MODE,
|
||||
(reg & ~VIA686A_TEMP_MODE_MASK)
|
||||
| VIA686A_TEMP_MODE_CONTINUOUS);
|
||||
|
||||
/* Pre-read fan clock divisor values */
|
||||
via686a_update_fan_div(data);
|
||||
}
|
||||
|
||||
static struct via686a_data *via686a_update_device(struct device *dev)
|
||||
|
|
@ -751,9 +761,7 @@ static struct via686a_data *via686a_update_device(struct device *dev)
|
|||
(via686a_read_value(data, VIA686A_REG_TEMP_LOW23) &
|
||||
0xc0) >> 6;
|
||||
|
||||
i = via686a_read_value(data, VIA686A_REG_FANDIV);
|
||||
data->fan_div[0] = (i >> 4) & 0x03;
|
||||
data->fan_div[1] = i >> 6;
|
||||
via686a_update_fan_div(data);
|
||||
data->alarms =
|
||||
via686a_read_value(data,
|
||||
VIA686A_REG_ALARM1) |
|
||||
|
|
|
|||
|
|
@ -770,6 +770,14 @@ static int i2c_do_del_adapter(struct device_driver *d, void *data)
|
|||
}
|
||||
|
||||
static int __unregister_client(struct device *dev, void *dummy)
|
||||
{
|
||||
struct i2c_client *client = i2c_verify_client(dev);
|
||||
if (client && strcmp(client->name, "dummy"))
|
||||
i2c_unregister_device(client);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __unregister_dummy(struct device *dev, void *dummy)
|
||||
{
|
||||
struct i2c_client *client = i2c_verify_client(dev);
|
||||
if (client)
|
||||
|
|
@ -820,8 +828,12 @@ int i2c_del_adapter(struct i2c_adapter *adap)
|
|||
}
|
||||
|
||||
/* Detach any active clients. This can't fail, thus we do not
|
||||
checking the returned value. */
|
||||
* check the returned value. This is a two-pass process, because
|
||||
* we can't remove the dummy devices during the first pass: they
|
||||
* could have been instantiated by real devices wishing to clean
|
||||
* them up properly, so we give them a chance to do that first. */
|
||||
res = device_for_each_child(&adap->dev, NULL, __unregister_client);
|
||||
res = device_for_each_child(&adap->dev, NULL, __unregister_dummy);
|
||||
|
||||
#ifdef CONFIG_I2C_COMPAT
|
||||
class_compat_remove_link(i2c_adapter_compat_class, &adap->dev,
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue