Merge branch 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'x86-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: x86, fs: Fix x86 procfs stack information for threads on 64-bit x86: Add reboot quirk for 3 series Mac mini x86: Fix printk message typo in mtrr cleanup code dma-debug: Fix compile warning with PAE enabled x86/amd-iommu: Un__init function required on shutdown x86/amd-iommu: Workaround for erratum 63
This commit is contained in:
commit
411094acb7
@ -31,6 +31,7 @@ extern irqreturn_t amd_iommu_int_handler(int irq, void *data);
|
|||||||
extern void amd_iommu_flush_all_domains(void);
|
extern void amd_iommu_flush_all_domains(void);
|
||||||
extern void amd_iommu_flush_all_devices(void);
|
extern void amd_iommu_flush_all_devices(void);
|
||||||
extern void amd_iommu_shutdown(void);
|
extern void amd_iommu_shutdown(void);
|
||||||
|
extern void amd_iommu_apply_erratum_63(u16 devid);
|
||||||
#else
|
#else
|
||||||
static inline int amd_iommu_init(void) { return -ENODEV; }
|
static inline int amd_iommu_init(void) { return -ENODEV; }
|
||||||
static inline void amd_iommu_detect(void) { }
|
static inline void amd_iommu_detect(void) { }
|
||||||
|
@ -1000,7 +1000,7 @@ extern unsigned long thread_saved_pc(struct task_struct *tsk);
|
|||||||
#define thread_saved_pc(t) (*(unsigned long *)((t)->thread.sp - 8))
|
#define thread_saved_pc(t) (*(unsigned long *)((t)->thread.sp - 8))
|
||||||
|
|
||||||
#define task_pt_regs(tsk) ((struct pt_regs *)(tsk)->thread.sp0 - 1)
|
#define task_pt_regs(tsk) ((struct pt_regs *)(tsk)->thread.sp0 - 1)
|
||||||
#define KSTK_ESP(tsk) -1 /* sorry. doesn't work for syscall. */
|
extern unsigned long KSTK_ESP(struct task_struct *task);
|
||||||
#endif /* CONFIG_X86_64 */
|
#endif /* CONFIG_X86_64 */
|
||||||
|
|
||||||
extern void start_thread(struct pt_regs *regs, unsigned long new_ip,
|
extern void start_thread(struct pt_regs *regs, unsigned long new_ip,
|
||||||
|
@ -1220,6 +1220,8 @@ static void __detach_device(struct protection_domain *domain, u16 devid)
|
|||||||
amd_iommu_dev_table[devid].data[1] = 0;
|
amd_iommu_dev_table[devid].data[1] = 0;
|
||||||
amd_iommu_dev_table[devid].data[2] = 0;
|
amd_iommu_dev_table[devid].data[2] = 0;
|
||||||
|
|
||||||
|
amd_iommu_apply_erratum_63(devid);
|
||||||
|
|
||||||
/* decrease reference counter */
|
/* decrease reference counter */
|
||||||
domain->dev_cnt -= 1;
|
domain->dev_cnt -= 1;
|
||||||
|
|
||||||
|
@ -240,7 +240,7 @@ static void iommu_feature_enable(struct amd_iommu *iommu, u8 bit)
|
|||||||
writel(ctrl, iommu->mmio_base + MMIO_CONTROL_OFFSET);
|
writel(ctrl, iommu->mmio_base + MMIO_CONTROL_OFFSET);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init iommu_feature_disable(struct amd_iommu *iommu, u8 bit)
|
static void iommu_feature_disable(struct amd_iommu *iommu, u8 bit)
|
||||||
{
|
{
|
||||||
u32 ctrl;
|
u32 ctrl;
|
||||||
|
|
||||||
@ -519,6 +519,26 @@ static void set_dev_entry_bit(u16 devid, u8 bit)
|
|||||||
amd_iommu_dev_table[devid].data[i] |= (1 << _bit);
|
amd_iommu_dev_table[devid].data[i] |= (1 << _bit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int get_dev_entry_bit(u16 devid, u8 bit)
|
||||||
|
{
|
||||||
|
int i = (bit >> 5) & 0x07;
|
||||||
|
int _bit = bit & 0x1f;
|
||||||
|
|
||||||
|
return (amd_iommu_dev_table[devid].data[i] & (1 << _bit)) >> _bit;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void amd_iommu_apply_erratum_63(u16 devid)
|
||||||
|
{
|
||||||
|
int sysmgt;
|
||||||
|
|
||||||
|
sysmgt = get_dev_entry_bit(devid, DEV_ENTRY_SYSMGT1) |
|
||||||
|
(get_dev_entry_bit(devid, DEV_ENTRY_SYSMGT2) << 1);
|
||||||
|
|
||||||
|
if (sysmgt == 0x01)
|
||||||
|
set_dev_entry_bit(devid, DEV_ENTRY_IW);
|
||||||
|
}
|
||||||
|
|
||||||
/* Writes the specific IOMMU for a device into the rlookup table */
|
/* Writes the specific IOMMU for a device into the rlookup table */
|
||||||
static void __init set_iommu_for_device(struct amd_iommu *iommu, u16 devid)
|
static void __init set_iommu_for_device(struct amd_iommu *iommu, u16 devid)
|
||||||
{
|
{
|
||||||
@ -547,6 +567,8 @@ static void __init set_dev_entry_from_acpi(struct amd_iommu *iommu,
|
|||||||
if (flags & ACPI_DEVFLAG_LINT1)
|
if (flags & ACPI_DEVFLAG_LINT1)
|
||||||
set_dev_entry_bit(devid, DEV_ENTRY_LINT1_PASS);
|
set_dev_entry_bit(devid, DEV_ENTRY_LINT1_PASS);
|
||||||
|
|
||||||
|
amd_iommu_apply_erratum_63(devid);
|
||||||
|
|
||||||
set_iommu_for_device(iommu, devid);
|
set_iommu_for_device(iommu, devid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -846,7 +846,7 @@ int __init mtrr_cleanup(unsigned address_bits)
|
|||||||
sort(range, nr_range, sizeof(struct res_range), cmp_range, NULL);
|
sort(range, nr_range, sizeof(struct res_range), cmp_range, NULL);
|
||||||
|
|
||||||
range_sums = sum_ranges(range, nr_range);
|
range_sums = sum_ranges(range, nr_range);
|
||||||
printk(KERN_INFO "total RAM coverred: %ldM\n",
|
printk(KERN_INFO "total RAM covered: %ldM\n",
|
||||||
range_sums >> (20 - PAGE_SHIFT));
|
range_sums >> (20 - PAGE_SHIFT));
|
||||||
|
|
||||||
if (mtrr_chunk_size && mtrr_gran_size) {
|
if (mtrr_chunk_size && mtrr_gran_size) {
|
||||||
|
@ -664,3 +664,8 @@ long sys_arch_prctl(int code, unsigned long addr)
|
|||||||
return do_arch_prctl(current, code, addr);
|
return do_arch_prctl(current, code, addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned long KSTK_ESP(struct task_struct *task)
|
||||||
|
{
|
||||||
|
return (test_tsk_thread_flag(task, TIF_IA32)) ?
|
||||||
|
(task_pt_regs(task)->sp) : ((task)->thread.usersp);
|
||||||
|
}
|
||||||
|
@ -436,6 +436,14 @@ static struct dmi_system_id __initdata pci_reboot_dmi_table[] = {
|
|||||||
DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5"),
|
DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{ /* Handle problems with rebooting on Apple Macmini3,1 */
|
||||||
|
.callback = set_pci_reboot,
|
||||||
|
.ident = "Apple Macmini3,1",
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
|
||||||
|
DMI_MATCH(DMI_PRODUCT_NAME, "Macmini3,1"),
|
||||||
|
},
|
||||||
|
},
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1532,6 +1532,8 @@ int compat_do_execve(char * filename,
|
|||||||
if (retval < 0)
|
if (retval < 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
current->stack_start = current->mm->start_stack;
|
||||||
|
|
||||||
/* execve succeeded */
|
/* execve succeeded */
|
||||||
current->fs->in_exec = 0;
|
current->fs->in_exec = 0;
|
||||||
current->in_execve = 0;
|
current->in_execve = 0;
|
||||||
|
@ -819,9 +819,11 @@ static void check_unmap(struct dma_debug_entry *ref)
|
|||||||
err_printk(ref->dev, entry, "DMA-API: device driver frees "
|
err_printk(ref->dev, entry, "DMA-API: device driver frees "
|
||||||
"DMA memory with different CPU address "
|
"DMA memory with different CPU address "
|
||||||
"[device address=0x%016llx] [size=%llu bytes] "
|
"[device address=0x%016llx] [size=%llu bytes] "
|
||||||
"[cpu alloc address=%p] [cpu free address=%p]",
|
"[cpu alloc address=0x%016llx] "
|
||||||
|
"[cpu free address=0x%016llx]",
|
||||||
ref->dev_addr, ref->size,
|
ref->dev_addr, ref->size,
|
||||||
(void *)entry->paddr, (void *)ref->paddr);
|
(unsigned long long)entry->paddr,
|
||||||
|
(unsigned long long)ref->paddr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ref->sg_call_ents && ref->type == dma_debug_sg &&
|
if (ref->sg_call_ents && ref->type == dma_debug_sg &&
|
||||||
|
Loading…
Reference in New Issue
Block a user