Compare commits
99 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
19f949f525 | ||
|
|
e9cf59aeee | ||
|
|
7c45512df9 | ||
|
|
f741656d64 | ||
|
|
ac89758697 | ||
|
|
11e7651432 | ||
|
|
5c0857a9af | ||
|
|
db1b2d323f | ||
|
|
7ea76ebba9 | ||
|
|
f0a34ac98b | ||
|
|
e9daff24a2 | ||
|
|
5eb65be2d9 | ||
|
|
f4d9605434 | ||
|
|
91e83ffd6d | ||
|
|
eb91e79b9f | ||
|
|
1de63d60cd | ||
|
|
4f8c85272c | ||
|
|
13d2b4d11d | ||
|
|
89a77915e0 | ||
|
|
b9156ebb7b | ||
|
|
323a72d83c | ||
|
|
42976ad0b2 | ||
|
|
14d77c4ddf | ||
|
|
249bfb83cf | ||
|
|
3bdb1a443a | ||
|
|
e9c0dfbaa2 | ||
|
|
816cd5b83e | ||
|
|
8770e91aa6 | ||
|
|
ac574804d4 | ||
|
|
0ee364eb31 | ||
|
|
ecf223fc0d | ||
|
|
a0e5056e3b | ||
|
|
f2ea97cbae | ||
|
|
9c10f4115c | ||
|
|
73c0d7522c | ||
|
|
983ca83634 | ||
|
|
41a7973447 | ||
|
|
6e6668845f | ||
|
|
4ba902b574 | ||
|
|
9977f0f164 | ||
|
|
3399cfb5df | ||
|
|
37d51101ec | ||
|
|
96be80abaf | ||
|
|
77c1090f94 | ||
|
|
1bf014e5c2 | ||
|
|
211b0cdc7d | ||
|
|
318d86dbe5 | ||
|
|
de0babd60d | ||
|
|
d786f67e5c | ||
|
|
3b6990838c | ||
|
|
547b4e7181 | ||
|
|
cb214ede76 | ||
|
|
3d9646d0ab | ||
|
|
cfa82e020b | ||
|
|
044453b3ef | ||
|
|
839c8cc32b | ||
|
|
0aba93e2b9 | ||
|
|
bd69ba798e | ||
|
|
1594712f9e | ||
|
|
3955b22b97 | ||
|
|
de53d55798 | ||
|
|
b185af0009 | ||
|
|
e28f639eea | ||
|
|
893db07f50 | ||
|
|
5f97ab913c | ||
|
|
4521e1a942 | ||
|
|
eef63cc1c6 | ||
|
|
4f4ffc3a53 | ||
|
|
570fd50153 | ||
|
|
f456da5e13 | ||
|
|
7c63e1ee0a | ||
|
|
686966d881 | ||
|
|
d601cd8d95 | ||
|
|
e575a86fdc | ||
|
|
edb27228db | ||
|
|
d4c38fa87d | ||
|
|
f5271fff56 | ||
|
|
bb9b1a834f | ||
|
|
9887dbf5b2 | ||
|
|
e95c3f7a09 | ||
|
|
4b47bc9a9e | ||
|
|
4cfe7629be | ||
|
|
7f04f08168 | ||
|
|
a05d3f9fa3 | ||
|
|
84e4e46020 | ||
|
|
99a844b731 | ||
|
|
e69ddd335e | ||
|
|
63fc1370c1 | ||
|
|
c7d5b93e98 | ||
|
|
eed8812387 | ||
|
|
d911e03d09 | ||
|
|
526810adb9 | ||
|
|
1e98380cbd | ||
|
|
b425df4cdd | ||
|
|
9937c02682 | ||
|
|
04cef49e84 | ||
|
|
b666263b71 | ||
|
|
f51bde6f0d | ||
|
|
bec7a4bbec |
@@ -390,6 +390,7 @@ Protocol: 2.00+
|
||||
F Special (0xFF = undefined)
|
||||
10 Reserved
|
||||
11 Minimal Linux Bootloader <http://sebastian-plotz.blogspot.de>
|
||||
12 OVMF UEFI virtualization stack
|
||||
|
||||
Please contact <hpa@zytor.com> if you need a bootloader ID
|
||||
value assigned.
|
||||
|
||||
16
MAINTAINERS
16
MAINTAINERS
@@ -1303,7 +1303,7 @@ F: include/linux/dmaengine.h
|
||||
F: include/linux/async_tx.h
|
||||
|
||||
AT24 EEPROM DRIVER
|
||||
M: Wolfram Sang <w.sang@pengutronix.de>
|
||||
M: Wolfram Sang <wsa@the-dreams.de>
|
||||
L: linux-i2c@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/misc/eeprom/at24.c
|
||||
@@ -3757,12 +3757,11 @@ S: Maintained
|
||||
F: drivers/i2c/i2c-stub.c
|
||||
|
||||
I2C SUBSYSTEM
|
||||
M: Wolfram Sang <w.sang@pengutronix.de>
|
||||
M: Wolfram Sang <wsa@the-dreams.de>
|
||||
M: "Ben Dooks (embedded platforms)" <ben-linux@fluff.org>
|
||||
L: linux-i2c@vger.kernel.org
|
||||
W: http://i2c.wiki.kernel.org/
|
||||
T: quilt kernel.org/pub/linux/kernel/people/jdelvare/linux-2.6/jdelvare-i2c/
|
||||
T: git git://git.pengutronix.de/git/wsa/linux.git
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux.git
|
||||
S: Maintained
|
||||
F: Documentation/i2c/
|
||||
F: drivers/i2c/
|
||||
@@ -5778,15 +5777,6 @@ L: linux-i2c@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/i2c/muxes/i2c-mux-pca9541.c
|
||||
|
||||
PCA9564/PCA9665 I2C BUS DRIVER
|
||||
M: Wolfram Sang <w.sang@pengutronix.de>
|
||||
L: linux-i2c@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/i2c/algos/i2c-algo-pca.c
|
||||
F: drivers/i2c/busses/i2c-pca-*
|
||||
F: include/linux/i2c-algo-pca.h
|
||||
F: include/linux/i2c-pca-platform.h
|
||||
|
||||
PCDP - PRIMARY CONSOLE AND DEBUG PORT
|
||||
M: Khalid Aziz <khalid@gonehiking.org>
|
||||
S: Maintained
|
||||
|
||||
2
Makefile
2
Makefile
@@ -1,7 +1,7 @@
|
||||
VERSION = 3
|
||||
PATCHLEVEL = 8
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc7
|
||||
EXTRAVERSION =
|
||||
NAME = Unicycling Gorilla
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
||||
@@ -7,8 +7,14 @@
|
||||
|
||||
#ifndef __ASSEMBLER__
|
||||
unsigned int scu_get_core_count(void __iomem *);
|
||||
void scu_enable(void __iomem *);
|
||||
int scu_power_mode(void __iomem *, unsigned int);
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
void scu_enable(void __iomem *scu_base);
|
||||
#else
|
||||
static inline void scu_enable(void __iomem *scu_base) {}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@@ -75,7 +75,7 @@ void scu_enable(void __iomem *scu_base)
|
||||
int scu_power_mode(void __iomem *scu_base, unsigned int mode)
|
||||
{
|
||||
unsigned int val;
|
||||
int cpu = cpu_logical_map(smp_processor_id());
|
||||
int cpu = MPIDR_AFFINITY_LEVEL(cpu_logical_map(smp_processor_id()), 0);
|
||||
|
||||
if (mode > 3 || mode == 1 || cpu > 3)
|
||||
return -EINVAL;
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
|
||||
#include <asm/arch_timer.h>
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/cputype.h>
|
||||
#include <asm/smp_plat.h>
|
||||
#include <asm/smp_twd.h>
|
||||
#include <asm/hardware/arm_timer.h>
|
||||
@@ -59,7 +60,7 @@ static void __init highbank_scu_map_io(void)
|
||||
|
||||
void highbank_set_cpu_jump(int cpu, void *jump_addr)
|
||||
{
|
||||
cpu = cpu_logical_map(cpu);
|
||||
cpu = MPIDR_AFFINITY_LEVEL(cpu_logical_map(cpu), 0);
|
||||
writel(virt_to_phys(jump_addr), HB_JUMP_TABLE_VIRT(cpu));
|
||||
__cpuc_flush_dcache_area(HB_JUMP_TABLE_VIRT(cpu), 16);
|
||||
outer_clean_range(HB_JUMP_TABLE_PHYS(cpu),
|
||||
|
||||
@@ -37,7 +37,7 @@ extern void __iomem *sregs_base;
|
||||
|
||||
static inline void highbank_set_core_pwr(void)
|
||||
{
|
||||
int cpu = cpu_logical_map(smp_processor_id());
|
||||
int cpu = MPIDR_AFFINITY_LEVEL(cpu_logical_map(smp_processor_id()), 0);
|
||||
if (scu_base_addr)
|
||||
scu_power_mode(scu_base_addr, SCU_PM_POWEROFF);
|
||||
else
|
||||
@@ -46,7 +46,7 @@ static inline void highbank_set_core_pwr(void)
|
||||
|
||||
static inline void highbank_clear_core_pwr(void)
|
||||
{
|
||||
int cpu = cpu_logical_map(smp_processor_id());
|
||||
int cpu = MPIDR_AFFINITY_LEVEL(cpu_logical_map(smp_processor_id()), 0);
|
||||
if (scu_base_addr)
|
||||
scu_power_mode(scu_base_addr, SCU_PM_NORMAL);
|
||||
else
|
||||
|
||||
@@ -130,7 +130,6 @@ extern int handle_kernel_fault(struct pt_regs *regs);
|
||||
#define start_thread(_regs, _pc, _usp) \
|
||||
do { \
|
||||
(_regs)->pc = (_pc); \
|
||||
((struct switch_stack *)(_regs))[-1].a6 = 0; \
|
||||
setframeformat(_regs); \
|
||||
if (current->mm) \
|
||||
(_regs)->d5 = current->mm->start_data; \
|
||||
|
||||
@@ -120,6 +120,9 @@ static int s390_next_ktime(ktime_t expires,
|
||||
nsecs = ktime_to_ns(ktime_add(timespec_to_ktime(ts), expires));
|
||||
do_div(nsecs, 125);
|
||||
S390_lowcore.clock_comparator = sched_clock_base_cc + (nsecs << 9);
|
||||
/* Program the maximum value if we have an overflow (== year 2042) */
|
||||
if (unlikely(S390_lowcore.clock_comparator < sched_clock_base_cc))
|
||||
S390_lowcore.clock_comparator = -1ULL;
|
||||
set_clock_comparator(S390_lowcore.clock_comparator);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -61,6 +61,7 @@ config SPARC64
|
||||
select HAVE_MEMBLOCK
|
||||
select HAVE_MEMBLOCK_NODE_MAP
|
||||
select HAVE_SYSCALL_WRAPPERS
|
||||
select HAVE_ARCH_TRANSPARENT_HUGEPAGE
|
||||
select HAVE_DYNAMIC_FTRACE
|
||||
select HAVE_FTRACE_MCOUNT_RECORD
|
||||
select HAVE_SYSCALL_TRACEPOINTS
|
||||
|
||||
@@ -71,7 +71,6 @@
|
||||
#define PMD_PADDR _AC(0xfffffffe,UL)
|
||||
#define PMD_PADDR_SHIFT _AC(11,UL)
|
||||
|
||||
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
||||
#define PMD_ISHUGE _AC(0x00000001,UL)
|
||||
|
||||
/* This is the PMD layout when PMD_ISHUGE is set. With 4MB huge
|
||||
@@ -86,7 +85,6 @@
|
||||
#define PMD_HUGE_ACCESSED _AC(0x00000080,UL)
|
||||
#define PMD_HUGE_EXEC _AC(0x00000040,UL)
|
||||
#define PMD_HUGE_SPLITTING _AC(0x00000020,UL)
|
||||
#endif
|
||||
|
||||
/* PGDs point to PMD tables which are 8K aligned. */
|
||||
#define PGD_PADDR _AC(0xfffffffc,UL)
|
||||
@@ -628,6 +626,12 @@ static inline unsigned long pte_special(pte_t pte)
|
||||
return pte_val(pte) & _PAGE_SPECIAL;
|
||||
}
|
||||
|
||||
static inline int pmd_large(pmd_t pmd)
|
||||
{
|
||||
return (pmd_val(pmd) & (PMD_ISHUGE | PMD_HUGE_PRESENT)) ==
|
||||
(PMD_ISHUGE | PMD_HUGE_PRESENT);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
|
||||
static inline int pmd_young(pmd_t pmd)
|
||||
{
|
||||
@@ -646,12 +650,6 @@ static inline unsigned long pmd_pfn(pmd_t pmd)
|
||||
return val >> (PAGE_SHIFT - PMD_PADDR_SHIFT);
|
||||
}
|
||||
|
||||
static inline int pmd_large(pmd_t pmd)
|
||||
{
|
||||
return (pmd_val(pmd) & (PMD_ISHUGE | PMD_HUGE_PRESENT)) ==
|
||||
(PMD_ISHUGE | PMD_HUGE_PRESENT);
|
||||
}
|
||||
|
||||
static inline int pmd_trans_splitting(pmd_t pmd)
|
||||
{
|
||||
return (pmd_val(pmd) & (PMD_ISHUGE|PMD_HUGE_SPLITTING)) ==
|
||||
|
||||
@@ -554,10 +554,8 @@ static void __init sbus_iommu_init(struct platform_device *op)
|
||||
regs = pr->phys_addr;
|
||||
|
||||
iommu = kzalloc(sizeof(*iommu), GFP_ATOMIC);
|
||||
if (!iommu)
|
||||
goto fatal_memory_error;
|
||||
strbuf = kzalloc(sizeof(*strbuf), GFP_ATOMIC);
|
||||
if (!strbuf)
|
||||
if (!iommu || !strbuf)
|
||||
goto fatal_memory_error;
|
||||
|
||||
op->dev.archdata.iommu = iommu;
|
||||
@@ -656,6 +654,8 @@ static void __init sbus_iommu_init(struct platform_device *op)
|
||||
return;
|
||||
|
||||
fatal_memory_error:
|
||||
kfree(iommu);
|
||||
kfree(strbuf);
|
||||
prom_printf("sbus_iommu_init: Fatal memory allocation error.\n");
|
||||
}
|
||||
|
||||
|
||||
@@ -66,6 +66,56 @@ static noinline int gup_pte_range(pmd_t pmd, unsigned long addr,
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int gup_huge_pmd(pmd_t *pmdp, pmd_t pmd, unsigned long addr,
|
||||
unsigned long end, int write, struct page **pages,
|
||||
int *nr)
|
||||
{
|
||||
struct page *head, *page, *tail;
|
||||
u32 mask;
|
||||
int refs;
|
||||
|
||||
mask = PMD_HUGE_PRESENT;
|
||||
if (write)
|
||||
mask |= PMD_HUGE_WRITE;
|
||||
if ((pmd_val(pmd) & mask) != mask)
|
||||
return 0;
|
||||
|
||||
refs = 0;
|
||||
head = pmd_page(pmd);
|
||||
page = head + ((addr & ~PMD_MASK) >> PAGE_SHIFT);
|
||||
tail = page;
|
||||
do {
|
||||
VM_BUG_ON(compound_head(page) != head);
|
||||
pages[*nr] = page;
|
||||
(*nr)++;
|
||||
page++;
|
||||
refs++;
|
||||
} while (addr += PAGE_SIZE, addr != end);
|
||||
|
||||
if (!page_cache_add_speculative(head, refs)) {
|
||||
*nr -= refs;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (unlikely(pmd_val(pmd) != pmd_val(*pmdp))) {
|
||||
*nr -= refs;
|
||||
while (refs--)
|
||||
put_page(head);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Any tail page need their mapcount reference taken before we
|
||||
* return.
|
||||
*/
|
||||
while (refs--) {
|
||||
if (PageTail(tail))
|
||||
get_huge_page_tail(tail);
|
||||
tail++;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int gup_pmd_range(pud_t pud, unsigned long addr, unsigned long end,
|
||||
int write, struct page **pages, int *nr)
|
||||
{
|
||||
@@ -77,9 +127,14 @@ static int gup_pmd_range(pud_t pud, unsigned long addr, unsigned long end,
|
||||
pmd_t pmd = *pmdp;
|
||||
|
||||
next = pmd_addr_end(addr, end);
|
||||
if (pmd_none(pmd))
|
||||
if (pmd_none(pmd) || pmd_trans_splitting(pmd))
|
||||
return 0;
|
||||
if (!gup_pte_range(pmd, addr, next, write, pages, nr))
|
||||
if (unlikely(pmd_large(pmd))) {
|
||||
if (!gup_huge_pmd(pmdp, pmd, addr, next,
|
||||
write, pages, nr))
|
||||
return 0;
|
||||
} else if (!gup_pte_range(pmd, addr, next, write,
|
||||
pages, nr))
|
||||
return 0;
|
||||
} while (pmdp++, addr = next, addr != end);
|
||||
|
||||
|
||||
@@ -140,6 +140,8 @@ config ARCH_DEFCONFIG
|
||||
|
||||
source "init/Kconfig"
|
||||
|
||||
source "kernel/Kconfig.freezer"
|
||||
|
||||
menu "Tilera-specific configuration"
|
||||
|
||||
config NR_CPUS
|
||||
|
||||
@@ -250,7 +250,9 @@ static inline void writeq(u64 val, unsigned long addr)
|
||||
#define iowrite32 writel
|
||||
#define iowrite64 writeq
|
||||
|
||||
static inline void memset_io(void *dst, int val, size_t len)
|
||||
#if CHIP_HAS_MMIO() || defined(CONFIG_PCI)
|
||||
|
||||
static inline void memset_io(volatile void *dst, int val, size_t len)
|
||||
{
|
||||
int x;
|
||||
BUG_ON((unsigned long)dst & 0x3);
|
||||
@@ -277,6 +279,8 @@ static inline void memcpy_toio(volatile void __iomem *dst, const void *src,
|
||||
writel(*(u32 *)(src + x), dst + x);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* The Tile architecture does not support IOPORT, even with PCI.
|
||||
* Unfortunately we can't yet simply not declare these methods,
|
||||
|
||||
@@ -18,32 +18,20 @@
|
||||
#include <arch/interrupts.h>
|
||||
#include <arch/chip.h>
|
||||
|
||||
#if !defined(__tilegx__) && defined(__ASSEMBLY__)
|
||||
|
||||
/*
|
||||
* The set of interrupts we want to allow when interrupts are nominally
|
||||
* disabled. The remainder are effectively "NMI" interrupts from
|
||||
* the point of view of the generic Linux code. Note that synchronous
|
||||
* interrupts (aka "non-queued") are not blocked by the mask in any case.
|
||||
*/
|
||||
#if CHIP_HAS_AUX_PERF_COUNTERS()
|
||||
#define LINUX_MASKABLE_INTERRUPTS_HI \
|
||||
(~(INT_MASK_HI(INT_PERF_COUNT) | INT_MASK_HI(INT_AUX_PERF_COUNT)))
|
||||
#else
|
||||
#define LINUX_MASKABLE_INTERRUPTS_HI \
|
||||
(~(INT_MASK_HI(INT_PERF_COUNT)))
|
||||
#endif
|
||||
|
||||
#else
|
||||
|
||||
#if CHIP_HAS_AUX_PERF_COUNTERS()
|
||||
#define LINUX_MASKABLE_INTERRUPTS \
|
||||
(~(INT_MASK(INT_PERF_COUNT) | INT_MASK(INT_AUX_PERF_COUNT)))
|
||||
#else
|
||||
#define LINUX_MASKABLE_INTERRUPTS \
|
||||
(~(INT_MASK(INT_PERF_COUNT)))
|
||||
#endif
|
||||
(~((_AC(1,ULL) << INT_PERF_COUNT) | (_AC(1,ULL) << INT_AUX_PERF_COUNT)))
|
||||
|
||||
#if CHIP_HAS_SPLIT_INTR_MASK()
|
||||
/* The same macro, but for the two 32-bit SPRs separately. */
|
||||
#define LINUX_MASKABLE_INTERRUPTS_LO (-1)
|
||||
#define LINUX_MASKABLE_INTERRUPTS_HI \
|
||||
(~((1 << (INT_PERF_COUNT - 32)) | (1 << (INT_AUX_PERF_COUNT - 32))))
|
||||
#endif
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
@@ -126,7 +114,7 @@
|
||||
* to know our current state.
|
||||
*/
|
||||
DECLARE_PER_CPU(unsigned long long, interrupts_enabled_mask);
|
||||
#define INITIAL_INTERRUPTS_ENABLED INT_MASK(INT_MEM_ERROR)
|
||||
#define INITIAL_INTERRUPTS_ENABLED (1ULL << INT_MEM_ERROR)
|
||||
|
||||
/* Disable interrupts. */
|
||||
#define arch_local_irq_disable() \
|
||||
@@ -165,7 +153,7 @@ DECLARE_PER_CPU(unsigned long long, interrupts_enabled_mask);
|
||||
|
||||
/* Prevent the given interrupt from being enabled next time we enable irqs. */
|
||||
#define arch_local_irq_mask(interrupt) \
|
||||
(__get_cpu_var(interrupts_enabled_mask) &= ~INT_MASK(interrupt))
|
||||
(__get_cpu_var(interrupts_enabled_mask) &= ~(1ULL << (interrupt)))
|
||||
|
||||
/* Prevent the given interrupt from being enabled immediately. */
|
||||
#define arch_local_irq_mask_now(interrupt) do { \
|
||||
@@ -175,7 +163,7 @@ DECLARE_PER_CPU(unsigned long long, interrupts_enabled_mask);
|
||||
|
||||
/* Allow the given interrupt to be enabled next time we enable irqs. */
|
||||
#define arch_local_irq_unmask(interrupt) \
|
||||
(__get_cpu_var(interrupts_enabled_mask) |= INT_MASK(interrupt))
|
||||
(__get_cpu_var(interrupts_enabled_mask) |= (1ULL << (interrupt)))
|
||||
|
||||
/* Allow the given interrupt to be enabled immediately, if !irqs_disabled. */
|
||||
#define arch_local_irq_unmask_now(interrupt) do { \
|
||||
@@ -250,7 +238,7 @@ DECLARE_PER_CPU(unsigned long long, interrupts_enabled_mask);
|
||||
/* Disable interrupts. */
|
||||
#define IRQ_DISABLE(tmp0, tmp1) \
|
||||
{ \
|
||||
movei tmp0, -1; \
|
||||
movei tmp0, LINUX_MASKABLE_INTERRUPTS_LO; \
|
||||
moveli tmp1, lo16(LINUX_MASKABLE_INTERRUPTS_HI) \
|
||||
}; \
|
||||
{ \
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#ifndef __ARCH_INTERRUPTS_H__
|
||||
#define __ARCH_INTERRUPTS_H__
|
||||
|
||||
#ifndef __KERNEL__
|
||||
/** Mask for an interrupt. */
|
||||
/* Note: must handle breaking interrupts into high and low words manually. */
|
||||
#define INT_MASK_LO(intno) (1 << (intno))
|
||||
@@ -23,6 +24,7 @@
|
||||
#ifndef __ASSEMBLER__
|
||||
#define INT_MASK(intno) (1ULL << (intno))
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
/** Where a given interrupt executes */
|
||||
@@ -92,216 +94,216 @@
|
||||
|
||||
#ifndef __ASSEMBLER__
|
||||
#define QUEUED_INTERRUPTS ( \
|
||||
INT_MASK(INT_MEM_ERROR) | \
|
||||
INT_MASK(INT_DMATLB_MISS) | \
|
||||
INT_MASK(INT_DMATLB_ACCESS) | \
|
||||
INT_MASK(INT_SNITLB_MISS) | \
|
||||
INT_MASK(INT_SN_NOTIFY) | \
|
||||
INT_MASK(INT_SN_FIREWALL) | \
|
||||
INT_MASK(INT_IDN_FIREWALL) | \
|
||||
INT_MASK(INT_UDN_FIREWALL) | \
|
||||
INT_MASK(INT_TILE_TIMER) | \
|
||||
INT_MASK(INT_IDN_TIMER) | \
|
||||
INT_MASK(INT_UDN_TIMER) | \
|
||||
INT_MASK(INT_DMA_NOTIFY) | \
|
||||
INT_MASK(INT_IDN_CA) | \
|
||||
INT_MASK(INT_UDN_CA) | \
|
||||
INT_MASK(INT_IDN_AVAIL) | \
|
||||
INT_MASK(INT_UDN_AVAIL) | \
|
||||
INT_MASK(INT_PERF_COUNT) | \
|
||||
INT_MASK(INT_INTCTRL_3) | \
|
||||
INT_MASK(INT_INTCTRL_2) | \
|
||||
INT_MASK(INT_INTCTRL_1) | \
|
||||
INT_MASK(INT_INTCTRL_0) | \
|
||||
INT_MASK(INT_BOOT_ACCESS) | \
|
||||
INT_MASK(INT_WORLD_ACCESS) | \
|
||||
INT_MASK(INT_I_ASID) | \
|
||||
INT_MASK(INT_D_ASID) | \
|
||||
INT_MASK(INT_DMA_ASID) | \
|
||||
INT_MASK(INT_SNI_ASID) | \
|
||||
INT_MASK(INT_DMA_CPL) | \
|
||||
INT_MASK(INT_SN_CPL) | \
|
||||
INT_MASK(INT_DOUBLE_FAULT) | \
|
||||
INT_MASK(INT_AUX_PERF_COUNT) | \
|
||||
(1ULL << INT_MEM_ERROR) | \
|
||||
(1ULL << INT_DMATLB_MISS) | \
|
||||
(1ULL << INT_DMATLB_ACCESS) | \
|
||||
(1ULL << INT_SNITLB_MISS) | \
|
||||
(1ULL << INT_SN_NOTIFY) | \
|
||||
(1ULL << INT_SN_FIREWALL) | \
|
||||
(1ULL << INT_IDN_FIREWALL) | \
|
||||
(1ULL << INT_UDN_FIREWALL) | \
|
||||
(1ULL << INT_TILE_TIMER) | \
|
||||
(1ULL << INT_IDN_TIMER) | \
|
||||
(1ULL << INT_UDN_TIMER) | \
|
||||
(1ULL << INT_DMA_NOTIFY) | \
|
||||
(1ULL << INT_IDN_CA) | \
|
||||
(1ULL << INT_UDN_CA) | \
|
||||
(1ULL << INT_IDN_AVAIL) | \
|
||||
(1ULL << INT_UDN_AVAIL) | \
|
||||
(1ULL << INT_PERF_COUNT) | \
|
||||
(1ULL << INT_INTCTRL_3) | \
|
||||
(1ULL << INT_INTCTRL_2) | \
|
||||
(1ULL << INT_INTCTRL_1) | \
|
||||
(1ULL << INT_INTCTRL_0) | \
|
||||
(1ULL << INT_BOOT_ACCESS) | \
|
||||
(1ULL << INT_WORLD_ACCESS) | \
|
||||
(1ULL << INT_I_ASID) | \
|
||||
(1ULL << INT_D_ASID) | \
|
||||
(1ULL << INT_DMA_ASID) | \
|
||||
(1ULL << INT_SNI_ASID) | \
|
||||
(1ULL << INT_DMA_CPL) | \
|
||||
(1ULL << INT_SN_CPL) | \
|
||||
(1ULL << INT_DOUBLE_FAULT) | \
|
||||
(1ULL << INT_AUX_PERF_COUNT) | \
|
||||
0)
|
||||
#define NONQUEUED_INTERRUPTS ( \
|
||||
INT_MASK(INT_ITLB_MISS) | \
|
||||
INT_MASK(INT_ILL) | \
|
||||
INT_MASK(INT_GPV) | \
|
||||
INT_MASK(INT_SN_ACCESS) | \
|
||||
INT_MASK(INT_IDN_ACCESS) | \
|
||||
INT_MASK(INT_UDN_ACCESS) | \
|
||||
INT_MASK(INT_IDN_REFILL) | \
|
||||
INT_MASK(INT_UDN_REFILL) | \
|
||||
INT_MASK(INT_IDN_COMPLETE) | \
|
||||
INT_MASK(INT_UDN_COMPLETE) | \
|
||||
INT_MASK(INT_SWINT_3) | \
|
||||
INT_MASK(INT_SWINT_2) | \
|
||||
INT_MASK(INT_SWINT_1) | \
|
||||
INT_MASK(INT_SWINT_0) | \
|
||||
INT_MASK(INT_UNALIGN_DATA) | \
|
||||
INT_MASK(INT_DTLB_MISS) | \
|
||||
INT_MASK(INT_DTLB_ACCESS) | \
|
||||
INT_MASK(INT_SN_STATIC_ACCESS) | \
|
||||
(1ULL << INT_ITLB_MISS) | \
|
||||
(1ULL << INT_ILL) | \
|
||||
(1ULL << INT_GPV) | \
|
||||
(1ULL << INT_SN_ACCESS) | \
|
||||
(1ULL << INT_IDN_ACCESS) | \
|
||||
(1ULL << INT_UDN_ACCESS) | \
|
||||
(1ULL << INT_IDN_REFILL) | \
|
||||
(1ULL << INT_UDN_REFILL) | \
|
||||
(1ULL << INT_IDN_COMPLETE) | \
|
||||
(1ULL << INT_UDN_COMPLETE) | \
|
||||
(1ULL << INT_SWINT_3) | \
|
||||
(1ULL << INT_SWINT_2) | \
|
||||
(1ULL << INT_SWINT_1) | \
|
||||
(1ULL << INT_SWINT_0) | \
|
||||
(1ULL << INT_UNALIGN_DATA) | \
|
||||
(1ULL << INT_DTLB_MISS) | \
|
||||
(1ULL << INT_DTLB_ACCESS) | \
|
||||
(1ULL << INT_SN_STATIC_ACCESS) | \
|
||||
0)
|
||||
#define CRITICAL_MASKED_INTERRUPTS ( \
|
||||
INT_MASK(INT_MEM_ERROR) | \
|
||||
INT_MASK(INT_DMATLB_MISS) | \
|
||||
INT_MASK(INT_DMATLB_ACCESS) | \
|
||||
INT_MASK(INT_SNITLB_MISS) | \
|
||||
INT_MASK(INT_SN_NOTIFY) | \
|
||||
INT_MASK(INT_SN_FIREWALL) | \
|
||||
INT_MASK(INT_IDN_FIREWALL) | \
|
||||
INT_MASK(INT_UDN_FIREWALL) | \
|
||||
INT_MASK(INT_TILE_TIMER) | \
|
||||
INT_MASK(INT_IDN_TIMER) | \
|
||||
INT_MASK(INT_UDN_TIMER) | \
|
||||
INT_MASK(INT_DMA_NOTIFY) | \
|
||||
INT_MASK(INT_IDN_CA) | \
|
||||
INT_MASK(INT_UDN_CA) | \
|
||||
INT_MASK(INT_IDN_AVAIL) | \
|
||||
INT_MASK(INT_UDN_AVAIL) | \
|
||||
INT_MASK(INT_PERF_COUNT) | \
|
||||
INT_MASK(INT_INTCTRL_3) | \
|
||||
INT_MASK(INT_INTCTRL_2) | \
|
||||
INT_MASK(INT_INTCTRL_1) | \
|
||||
INT_MASK(INT_INTCTRL_0) | \
|
||||
INT_MASK(INT_AUX_PERF_COUNT) | \
|
||||
(1ULL << INT_MEM_ERROR) | \
|
||||
(1ULL << INT_DMATLB_MISS) | \
|
||||
(1ULL << INT_DMATLB_ACCESS) | \
|
||||
(1ULL << INT_SNITLB_MISS) | \
|
||||
(1ULL << INT_SN_NOTIFY) | \
|
||||
(1ULL << INT_SN_FIREWALL) | \
|
||||
(1ULL << INT_IDN_FIREWALL) | \
|
||||
(1ULL << INT_UDN_FIREWALL) | \
|
||||
(1ULL << INT_TILE_TIMER) | \
|
||||
(1ULL << INT_IDN_TIMER) | \
|
||||
(1ULL << INT_UDN_TIMER) | \
|
||||
(1ULL << INT_DMA_NOTIFY) | \
|
||||
(1ULL << INT_IDN_CA) | \
|
||||
(1ULL << INT_UDN_CA) | \
|
||||
(1ULL << INT_IDN_AVAIL) | \
|
||||
(1ULL << INT_UDN_AVAIL) | \
|
||||
(1ULL << INT_PERF_COUNT) | \
|
||||
(1ULL << INT_INTCTRL_3) | \
|
||||
(1ULL << INT_INTCTRL_2) | \
|
||||
(1ULL << INT_INTCTRL_1) | \
|
||||
(1ULL << INT_INTCTRL_0) | \
|
||||
(1ULL << INT_AUX_PERF_COUNT) | \
|
||||
0)
|
||||
#define CRITICAL_UNMASKED_INTERRUPTS ( \
|
||||
INT_MASK(INT_ITLB_MISS) | \
|
||||
INT_MASK(INT_ILL) | \
|
||||
INT_MASK(INT_GPV) | \
|
||||
INT_MASK(INT_SN_ACCESS) | \
|
||||
INT_MASK(INT_IDN_ACCESS) | \
|
||||
INT_MASK(INT_UDN_ACCESS) | \
|
||||
INT_MASK(INT_IDN_REFILL) | \
|
||||
INT_MASK(INT_UDN_REFILL) | \
|
||||
INT_MASK(INT_IDN_COMPLETE) | \
|
||||
INT_MASK(INT_UDN_COMPLETE) | \
|
||||
INT_MASK(INT_SWINT_3) | \
|
||||
INT_MASK(INT_SWINT_2) | \
|
||||
INT_MASK(INT_SWINT_1) | \
|
||||
INT_MASK(INT_SWINT_0) | \
|
||||
INT_MASK(INT_UNALIGN_DATA) | \
|
||||
INT_MASK(INT_DTLB_MISS) | \
|
||||
INT_MASK(INT_DTLB_ACCESS) | \
|
||||
INT_MASK(INT_BOOT_ACCESS) | \
|
||||
INT_MASK(INT_WORLD_ACCESS) | \
|
||||
INT_MASK(INT_I_ASID) | \
|
||||
INT_MASK(INT_D_ASID) | \
|
||||
INT_MASK(INT_DMA_ASID) | \
|
||||
INT_MASK(INT_SNI_ASID) | \
|
||||
INT_MASK(INT_DMA_CPL) | \
|
||||
INT_MASK(INT_SN_CPL) | \
|
||||
INT_MASK(INT_DOUBLE_FAULT) | \
|
||||
INT_MASK(INT_SN_STATIC_ACCESS) | \
|
||||
(1ULL << INT_ITLB_MISS) | \
|
||||
(1ULL << INT_ILL) | \
|
||||
(1ULL << INT_GPV) | \
|
||||
(1ULL << INT_SN_ACCESS) | \
|
||||
(1ULL << INT_IDN_ACCESS) | \
|
||||
(1ULL << INT_UDN_ACCESS) | \
|
||||
(1ULL << INT_IDN_REFILL) | \
|
||||
(1ULL << INT_UDN_REFILL) | \
|
||||
(1ULL << INT_IDN_COMPLETE) | \
|
||||
(1ULL << INT_UDN_COMPLETE) | \
|
||||
(1ULL << INT_SWINT_3) | \
|
||||
(1ULL << INT_SWINT_2) | \
|
||||
(1ULL << INT_SWINT_1) | \
|
||||
(1ULL << INT_SWINT_0) | \
|
||||
(1ULL << INT_UNALIGN_DATA) | \
|
||||
(1ULL << INT_DTLB_MISS) | \
|
||||
(1ULL << INT_DTLB_ACCESS) | \
|
||||
(1ULL << INT_BOOT_ACCESS) | \
|
||||
(1ULL << INT_WORLD_ACCESS) | \
|
||||
(1ULL << INT_I_ASID) | \
|
||||
(1ULL << INT_D_ASID) | \
|
||||
(1ULL << INT_DMA_ASID) | \
|
||||
(1ULL << INT_SNI_ASID) | \
|
||||
(1ULL << INT_DMA_CPL) | \
|
||||
(1ULL << INT_SN_CPL) | \
|
||||
(1ULL << INT_DOUBLE_FAULT) | \
|
||||
(1ULL << INT_SN_STATIC_ACCESS) | \
|
||||
0)
|
||||
#define MASKABLE_INTERRUPTS ( \
|
||||
INT_MASK(INT_MEM_ERROR) | \
|
||||
INT_MASK(INT_IDN_REFILL) | \
|
||||
INT_MASK(INT_UDN_REFILL) | \
|
||||
INT_MASK(INT_IDN_COMPLETE) | \
|
||||
INT_MASK(INT_UDN_COMPLETE) | \
|
||||
INT_MASK(INT_DMATLB_MISS) | \
|
||||
INT_MASK(INT_DMATLB_ACCESS) | \
|
||||
INT_MASK(INT_SNITLB_MISS) | \
|
||||
INT_MASK(INT_SN_NOTIFY) | \
|
||||
INT_MASK(INT_SN_FIREWALL) | \
|
||||
INT_MASK(INT_IDN_FIREWALL) | \
|
||||
INT_MASK(INT_UDN_FIREWALL) | \
|
||||
INT_MASK(INT_TILE_TIMER) | \
|
||||
INT_MASK(INT_IDN_TIMER) | \
|
||||
INT_MASK(INT_UDN_TIMER) | \
|
||||
INT_MASK(INT_DMA_NOTIFY) | \
|
||||
INT_MASK(INT_IDN_CA) | \
|
||||
INT_MASK(INT_UDN_CA) | \
|
||||
INT_MASK(INT_IDN_AVAIL) | \
|
||||
INT_MASK(INT_UDN_AVAIL) | \
|
||||
INT_MASK(INT_PERF_COUNT) | \
|
||||
INT_MASK(INT_INTCTRL_3) | \
|
||||
INT_MASK(INT_INTCTRL_2) | \
|
||||
INT_MASK(INT_INTCTRL_1) | \
|
||||
INT_MASK(INT_INTCTRL_0) | \
|
||||
INT_MASK(INT_AUX_PERF_COUNT) | \
|
||||
(1ULL << INT_MEM_ERROR) | \
|
||||
(1ULL << INT_IDN_REFILL) | \
|
||||
(1ULL << INT_UDN_REFILL) | \
|
||||
(1ULL << INT_IDN_COMPLETE) | \
|
||||
(1ULL << INT_UDN_COMPLETE) | \
|
||||
(1ULL << INT_DMATLB_MISS) | \
|
||||
(1ULL << INT_DMATLB_ACCESS) | \
|
||||
(1ULL << INT_SNITLB_MISS) | \
|
||||
(1ULL << INT_SN_NOTIFY) | \
|
||||
(1ULL << INT_SN_FIREWALL) | \
|
||||
(1ULL << INT_IDN_FIREWALL) | \
|
||||
(1ULL << INT_UDN_FIREWALL) | \
|
||||
(1ULL << INT_TILE_TIMER) | \
|
||||
(1ULL << INT_IDN_TIMER) | \
|
||||
(1ULL << INT_UDN_TIMER) | \
|
||||
(1ULL << INT_DMA_NOTIFY) | \
|
||||
(1ULL << INT_IDN_CA) | \
|
||||
(1ULL << INT_UDN_CA) | \
|
||||
(1ULL << INT_IDN_AVAIL) | \
|
||||
(1ULL << INT_UDN_AVAIL) | \
|
||||
(1ULL << INT_PERF_COUNT) | \
|
||||
(1ULL << INT_INTCTRL_3) | \
|
||||
(1ULL << INT_INTCTRL_2) | \
|
||||
(1ULL << INT_INTCTRL_1) | \
|
||||
(1ULL << INT_INTCTRL_0) | \
|
||||
(1ULL << INT_AUX_PERF_COUNT) | \
|
||||
0)
|
||||
#define UNMASKABLE_INTERRUPTS ( \
|
||||
INT_MASK(INT_ITLB_MISS) | \
|
||||
INT_MASK(INT_ILL) | \
|
||||
INT_MASK(INT_GPV) | \
|
||||
INT_MASK(INT_SN_ACCESS) | \
|
||||
INT_MASK(INT_IDN_ACCESS) | \
|
||||
INT_MASK(INT_UDN_ACCESS) | \
|
||||
INT_MASK(INT_SWINT_3) | \
|
||||
INT_MASK(INT_SWINT_2) | \
|
||||
INT_MASK(INT_SWINT_1) | \
|
||||
INT_MASK(INT_SWINT_0) | \
|
||||
INT_MASK(INT_UNALIGN_DATA) | \
|
||||
INT_MASK(INT_DTLB_MISS) | \
|
||||
INT_MASK(INT_DTLB_ACCESS) | \
|
||||
INT_MASK(INT_BOOT_ACCESS) | \
|
||||
INT_MASK(INT_WORLD_ACCESS) | \
|
||||
INT_MASK(INT_I_ASID) | \
|
||||
INT_MASK(INT_D_ASID) | \
|
||||
INT_MASK(INT_DMA_ASID) | \
|
||||
INT_MASK(INT_SNI_ASID) | \
|
||||
INT_MASK(INT_DMA_CPL) | \
|
||||
INT_MASK(INT_SN_CPL) | \
|
||||
INT_MASK(INT_DOUBLE_FAULT) | \
|
||||
INT_MASK(INT_SN_STATIC_ACCESS) | \
|
||||
(1ULL << INT_ITLB_MISS) | \
|
||||
(1ULL << INT_ILL) | \
|
||||
(1ULL << INT_GPV) | \
|
||||
(1ULL << INT_SN_ACCESS) | \
|
||||
(1ULL << INT_IDN_ACCESS) | \
|
||||
(1ULL << INT_UDN_ACCESS) | \
|
||||
(1ULL << INT_SWINT_3) | \
|
||||
(1ULL << INT_SWINT_2) | \
|
||||
(1ULL << INT_SWINT_1) | \
|
||||
(1ULL << INT_SWINT_0) | \
|
||||
(1ULL << INT_UNALIGN_DATA) | \
|
||||
(1ULL << INT_DTLB_MISS) | \
|
||||
(1ULL << INT_DTLB_ACCESS) | \
|
||||
(1ULL << INT_BOOT_ACCESS) | \
|
||||
(1ULL << INT_WORLD_ACCESS) | \
|
||||
(1ULL << INT_I_ASID) | \
|
||||
(1ULL << INT_D_ASID) | \
|
||||
(1ULL << INT_DMA_ASID) | \
|
||||
(1ULL << INT_SNI_ASID) | \
|
||||
(1ULL << INT_DMA_CPL) | \
|
||||
(1ULL << INT_SN_CPL) | \
|
||||
(1ULL << INT_DOUBLE_FAULT) | \
|
||||
(1ULL << INT_SN_STATIC_ACCESS) | \
|
||||
0)
|
||||
#define SYNC_INTERRUPTS ( \
|
||||
INT_MASK(INT_ITLB_MISS) | \
|
||||
INT_MASK(INT_ILL) | \
|
||||
INT_MASK(INT_GPV) | \
|
||||
INT_MASK(INT_SN_ACCESS) | \
|
||||
INT_MASK(INT_IDN_ACCESS) | \
|
||||
INT_MASK(INT_UDN_ACCESS) | \
|
||||
INT_MASK(INT_IDN_REFILL) | \
|
||||
INT_MASK(INT_UDN_REFILL) | \
|
||||
INT_MASK(INT_IDN_COMPLETE) | \
|
||||
INT_MASK(INT_UDN_COMPLETE) | \
|
||||
INT_MASK(INT_SWINT_3) | \
|
||||
INT_MASK(INT_SWINT_2) | \
|
||||
INT_MASK(INT_SWINT_1) | \
|
||||
INT_MASK(INT_SWINT_0) | \
|
||||
INT_MASK(INT_UNALIGN_DATA) | \
|
||||
INT_MASK(INT_DTLB_MISS) | \
|
||||
INT_MASK(INT_DTLB_ACCESS) | \
|
||||
INT_MASK(INT_SN_STATIC_ACCESS) | \
|
||||
(1ULL << INT_ITLB_MISS) | \
|
||||
(1ULL << INT_ILL) | \
|
||||
(1ULL << INT_GPV) | \
|
||||
(1ULL << INT_SN_ACCESS) | \
|
||||
(1ULL << INT_IDN_ACCESS) | \
|
||||
(1ULL << INT_UDN_ACCESS) | \
|
||||
(1ULL << INT_IDN_REFILL) | \
|
||||
(1ULL << INT_UDN_REFILL) | \
|
||||
(1ULL << INT_IDN_COMPLETE) | \
|
||||
(1ULL << INT_UDN_COMPLETE) | \
|
||||
(1ULL << INT_SWINT_3) | \
|
||||
(1ULL << INT_SWINT_2) | \
|
||||
(1ULL << INT_SWINT_1) | \
|
||||
(1ULL << INT_SWINT_0) | \
|
||||
(1ULL << INT_UNALIGN_DATA) | \
|
||||
(1ULL << INT_DTLB_MISS) | \
|
||||
(1ULL << INT_DTLB_ACCESS) | \
|
||||
(1ULL << INT_SN_STATIC_ACCESS) | \
|
||||
0)
|
||||
#define NON_SYNC_INTERRUPTS ( \
|
||||
INT_MASK(INT_MEM_ERROR) | \
|
||||
INT_MASK(INT_DMATLB_MISS) | \
|
||||
INT_MASK(INT_DMATLB_ACCESS) | \
|
||||
INT_MASK(INT_SNITLB_MISS) | \
|
||||
INT_MASK(INT_SN_NOTIFY) | \
|
||||
INT_MASK(INT_SN_FIREWALL) | \
|
||||
INT_MASK(INT_IDN_FIREWALL) | \
|
||||
INT_MASK(INT_UDN_FIREWALL) | \
|
||||
INT_MASK(INT_TILE_TIMER) | \
|
||||
INT_MASK(INT_IDN_TIMER) | \
|
||||
INT_MASK(INT_UDN_TIMER) | \
|
||||
INT_MASK(INT_DMA_NOTIFY) | \
|
||||
INT_MASK(INT_IDN_CA) | \
|
||||
INT_MASK(INT_UDN_CA) | \
|
||||
INT_MASK(INT_IDN_AVAIL) | \
|
||||
INT_MASK(INT_UDN_AVAIL) | \
|
||||
INT_MASK(INT_PERF_COUNT) | \
|
||||
INT_MASK(INT_INTCTRL_3) | \
|
||||
INT_MASK(INT_INTCTRL_2) | \
|
||||
INT_MASK(INT_INTCTRL_1) | \
|
||||
INT_MASK(INT_INTCTRL_0) | \
|
||||
INT_MASK(INT_BOOT_ACCESS) | \
|
||||
INT_MASK(INT_WORLD_ACCESS) | \
|
||||
INT_MASK(INT_I_ASID) | \
|
||||
INT_MASK(INT_D_ASID) | \
|
||||
INT_MASK(INT_DMA_ASID) | \
|
||||
INT_MASK(INT_SNI_ASID) | \
|
||||
INT_MASK(INT_DMA_CPL) | \
|
||||
INT_MASK(INT_SN_CPL) | \
|
||||
INT_MASK(INT_DOUBLE_FAULT) | \
|
||||
INT_MASK(INT_AUX_PERF_COUNT) | \
|
||||
(1ULL << INT_MEM_ERROR) | \
|
||||
(1ULL << INT_DMATLB_MISS) | \
|
||||
(1ULL << INT_DMATLB_ACCESS) | \
|
||||
(1ULL << INT_SNITLB_MISS) | \
|
||||
(1ULL << INT_SN_NOTIFY) | \
|
||||
(1ULL << INT_SN_FIREWALL) | \
|
||||
(1ULL << INT_IDN_FIREWALL) | \
|
||||
(1ULL << INT_UDN_FIREWALL) | \
|
||||
(1ULL << INT_TILE_TIMER) | \
|
||||
(1ULL << INT_IDN_TIMER) | \
|
||||
(1ULL << INT_UDN_TIMER) | \
|
||||
(1ULL << INT_DMA_NOTIFY) | \
|
||||
(1ULL << INT_IDN_CA) | \
|
||||
(1ULL << INT_UDN_CA) | \
|
||||
(1ULL << INT_IDN_AVAIL) | \
|
||||
(1ULL << INT_UDN_AVAIL) | \
|
||||
(1ULL << INT_PERF_COUNT) | \
|
||||
(1ULL << INT_INTCTRL_3) | \
|
||||
(1ULL << INT_INTCTRL_2) | \
|
||||
(1ULL << INT_INTCTRL_1) | \
|
||||
(1ULL << INT_INTCTRL_0) | \
|
||||
(1ULL << INT_BOOT_ACCESS) | \
|
||||
(1ULL << INT_WORLD_ACCESS) | \
|
||||
(1ULL << INT_I_ASID) | \
|
||||
(1ULL << INT_D_ASID) | \
|
||||
(1ULL << INT_DMA_ASID) | \
|
||||
(1ULL << INT_SNI_ASID) | \
|
||||
(1ULL << INT_DMA_CPL) | \
|
||||
(1ULL << INT_SN_CPL) | \
|
||||
(1ULL << INT_DOUBLE_FAULT) | \
|
||||
(1ULL << INT_AUX_PERF_COUNT) | \
|
||||
0)
|
||||
#endif /* !__ASSEMBLER__ */
|
||||
#endif /* !__ARCH_INTERRUPTS_H__ */
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#ifndef __ARCH_INTERRUPTS_H__
|
||||
#define __ARCH_INTERRUPTS_H__
|
||||
|
||||
#ifndef __KERNEL__
|
||||
/** Mask for an interrupt. */
|
||||
#ifdef __ASSEMBLER__
|
||||
/* Note: must handle breaking interrupts into high and low words manually. */
|
||||
@@ -22,6 +23,7 @@
|
||||
#else
|
||||
#define INT_MASK(intno) (1ULL << (intno))
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
/** Where a given interrupt executes */
|
||||
@@ -85,192 +87,192 @@
|
||||
|
||||
#ifndef __ASSEMBLER__
|
||||
#define QUEUED_INTERRUPTS ( \
|
||||
INT_MASK(INT_MEM_ERROR) | \
|
||||
INT_MASK(INT_IDN_COMPLETE) | \
|
||||
INT_MASK(INT_UDN_COMPLETE) | \
|
||||
INT_MASK(INT_IDN_FIREWALL) | \
|
||||
INT_MASK(INT_UDN_FIREWALL) | \
|
||||
INT_MASK(INT_TILE_TIMER) | \
|
||||
INT_MASK(INT_AUX_TILE_TIMER) | \
|
||||
INT_MASK(INT_IDN_TIMER) | \
|
||||
INT_MASK(INT_UDN_TIMER) | \
|
||||
INT_MASK(INT_IDN_AVAIL) | \
|
||||
INT_MASK(INT_UDN_AVAIL) | \
|
||||
INT_MASK(INT_IPI_3) | \
|
||||
INT_MASK(INT_IPI_2) | \
|
||||
INT_MASK(INT_IPI_1) | \
|
||||
INT_MASK(INT_IPI_0) | \
|
||||
INT_MASK(INT_PERF_COUNT) | \
|
||||
INT_MASK(INT_AUX_PERF_COUNT) | \
|
||||
INT_MASK(INT_INTCTRL_3) | \
|
||||
INT_MASK(INT_INTCTRL_2) | \
|
||||
INT_MASK(INT_INTCTRL_1) | \
|
||||
INT_MASK(INT_INTCTRL_0) | \
|
||||
INT_MASK(INT_BOOT_ACCESS) | \
|
||||
INT_MASK(INT_WORLD_ACCESS) | \
|
||||
INT_MASK(INT_I_ASID) | \
|
||||
INT_MASK(INT_D_ASID) | \
|
||||
INT_MASK(INT_DOUBLE_FAULT) | \
|
||||
(1ULL << INT_MEM_ERROR) | \
|
||||
(1ULL << INT_IDN_COMPLETE) | \
|
||||
(1ULL << INT_UDN_COMPLETE) | \
|
||||
(1ULL << INT_IDN_FIREWALL) | \
|
||||
(1ULL << INT_UDN_FIREWALL) | \
|
||||
(1ULL << INT_TILE_TIMER) | \
|
||||
(1ULL << INT_AUX_TILE_TIMER) | \
|
||||
(1ULL << INT_IDN_TIMER) | \
|
||||
(1ULL << INT_UDN_TIMER) | \
|
||||
(1ULL << INT_IDN_AVAIL) | \
|
||||
(1ULL << INT_UDN_AVAIL) | \
|
||||
(1ULL << INT_IPI_3) | \
|
||||
(1ULL << INT_IPI_2) | \
|
||||
(1ULL << INT_IPI_1) | \
|
||||
(1ULL << INT_IPI_0) | \
|
||||
(1ULL << INT_PERF_COUNT) | \
|
||||
(1ULL << INT_AUX_PERF_COUNT) | \
|
||||
(1ULL << INT_INTCTRL_3) | \
|
||||
(1ULL << INT_INTCTRL_2) | \
|
||||
(1ULL << INT_INTCTRL_1) | \
|
||||
(1ULL << INT_INTCTRL_0) | \
|
||||
(1ULL << INT_BOOT_ACCESS) | \
|
||||
(1ULL << INT_WORLD_ACCESS) | \
|
||||
(1ULL << INT_I_ASID) | \
|
||||
(1ULL << INT_D_ASID) | \
|
||||
(1ULL << INT_DOUBLE_FAULT) | \
|
||||
0)
|
||||
#define NONQUEUED_INTERRUPTS ( \
|
||||
INT_MASK(INT_SINGLE_STEP_3) | \
|
||||
INT_MASK(INT_SINGLE_STEP_2) | \
|
||||
INT_MASK(INT_SINGLE_STEP_1) | \
|
||||
INT_MASK(INT_SINGLE_STEP_0) | \
|
||||
INT_MASK(INT_ITLB_MISS) | \
|
||||
INT_MASK(INT_ILL) | \
|
||||
INT_MASK(INT_GPV) | \
|
||||
INT_MASK(INT_IDN_ACCESS) | \
|
||||
INT_MASK(INT_UDN_ACCESS) | \
|
||||
INT_MASK(INT_SWINT_3) | \
|
||||
INT_MASK(INT_SWINT_2) | \
|
||||
INT_MASK(INT_SWINT_1) | \
|
||||
INT_MASK(INT_SWINT_0) | \
|
||||
INT_MASK(INT_ILL_TRANS) | \
|
||||
INT_MASK(INT_UNALIGN_DATA) | \
|
||||
INT_MASK(INT_DTLB_MISS) | \
|
||||
INT_MASK(INT_DTLB_ACCESS) | \
|
||||
(1ULL << INT_SINGLE_STEP_3) | \
|
||||
(1ULL << INT_SINGLE_STEP_2) | \
|
||||
(1ULL << INT_SINGLE_STEP_1) | \
|
||||
(1ULL << INT_SINGLE_STEP_0) | \
|
||||
(1ULL << INT_ITLB_MISS) | \
|
||||
(1ULL << INT_ILL) | \
|
||||
(1ULL << INT_GPV) | \
|
||||
(1ULL << INT_IDN_ACCESS) | \
|
||||
(1ULL << INT_UDN_ACCESS) | \
|
||||
(1ULL << INT_SWINT_3) | \
|
||||
(1ULL << INT_SWINT_2) | \
|
||||
(1ULL << INT_SWINT_1) | \
|
||||
(1ULL << INT_SWINT_0) | \
|
||||
(1ULL << INT_ILL_TRANS) | \
|
||||
(1ULL << INT_UNALIGN_DATA) | \
|
||||
(1ULL << INT_DTLB_MISS) | \
|
||||
(1ULL << INT_DTLB_ACCESS) | \
|
||||
0)
|
||||
#define CRITICAL_MASKED_INTERRUPTS ( \
|
||||
INT_MASK(INT_MEM_ERROR) | \
|
||||
INT_MASK(INT_SINGLE_STEP_3) | \
|
||||
INT_MASK(INT_SINGLE_STEP_2) | \
|
||||
INT_MASK(INT_SINGLE_STEP_1) | \
|
||||
INT_MASK(INT_SINGLE_STEP_0) | \
|
||||
INT_MASK(INT_IDN_COMPLETE) | \
|
||||
INT_MASK(INT_UDN_COMPLETE) | \
|
||||
INT_MASK(INT_IDN_FIREWALL) | \
|
||||
INT_MASK(INT_UDN_FIREWALL) | \
|
||||
INT_MASK(INT_TILE_TIMER) | \
|
||||
INT_MASK(INT_AUX_TILE_TIMER) | \
|
||||
INT_MASK(INT_IDN_TIMER) | \
|
||||
INT_MASK(INT_UDN_TIMER) | \
|
||||
INT_MASK(INT_IDN_AVAIL) | \
|
||||
INT_MASK(INT_UDN_AVAIL) | \
|
||||
INT_MASK(INT_IPI_3) | \
|
||||
INT_MASK(INT_IPI_2) | \
|
||||
INT_MASK(INT_IPI_1) | \
|
||||
INT_MASK(INT_IPI_0) | \
|
||||
INT_MASK(INT_PERF_COUNT) | \
|
||||
INT_MASK(INT_AUX_PERF_COUNT) | \
|
||||
INT_MASK(INT_INTCTRL_3) | \
|
||||
INT_MASK(INT_INTCTRL_2) | \
|
||||
INT_MASK(INT_INTCTRL_1) | \
|
||||
INT_MASK(INT_INTCTRL_0) | \
|
||||
(1ULL << INT_MEM_ERROR) | \
|
||||
(1ULL << INT_SINGLE_STEP_3) | \
|
||||
(1ULL << INT_SINGLE_STEP_2) | \
|
||||
(1ULL << INT_SINGLE_STEP_1) | \
|
||||
(1ULL << INT_SINGLE_STEP_0) | \
|
||||
(1ULL << INT_IDN_COMPLETE) | \
|
||||
(1ULL << INT_UDN_COMPLETE) | \
|
||||
(1ULL << INT_IDN_FIREWALL) | \
|
||||
(1ULL << INT_UDN_FIREWALL) | \
|
||||
(1ULL << INT_TILE_TIMER) | \
|
||||
(1ULL << INT_AUX_TILE_TIMER) | \
|
||||
(1ULL << INT_IDN_TIMER) | \
|
||||
(1ULL << INT_UDN_TIMER) | \
|
||||
(1ULL << INT_IDN_AVAIL) | \
|
||||
(1ULL << INT_UDN_AVAIL) | \
|
||||
(1ULL << INT_IPI_3) | \
|
||||
(1ULL << INT_IPI_2) | \
|
||||
(1ULL << INT_IPI_1) | \
|
||||
(1ULL << INT_IPI_0) | \
|
||||
(1ULL << INT_PERF_COUNT) | \
|
||||
(1ULL << INT_AUX_PERF_COUNT) | \
|
||||
(1ULL << INT_INTCTRL_3) | \
|
||||
(1ULL << INT_INTCTRL_2) | \
|
||||
(1ULL << INT_INTCTRL_1) | \
|
||||
(1ULL << INT_INTCTRL_0) | \
|
||||
0)
|
||||
#define CRITICAL_UNMASKED_INTERRUPTS ( \
|
||||
INT_MASK(INT_ITLB_MISS) | \
|
||||
INT_MASK(INT_ILL) | \
|
||||
INT_MASK(INT_GPV) | \
|
||||
INT_MASK(INT_IDN_ACCESS) | \
|
||||
INT_MASK(INT_UDN_ACCESS) | \
|
||||
INT_MASK(INT_SWINT_3) | \
|
||||
INT_MASK(INT_SWINT_2) | \
|
||||
INT_MASK(INT_SWINT_1) | \
|
||||
INT_MASK(INT_SWINT_0) | \
|
||||
INT_MASK(INT_ILL_TRANS) | \
|
||||
INT_MASK(INT_UNALIGN_DATA) | \
|
||||
INT_MASK(INT_DTLB_MISS) | \
|
||||
INT_MASK(INT_DTLB_ACCESS) | \
|
||||
INT_MASK(INT_BOOT_ACCESS) | \
|
||||
INT_MASK(INT_WORLD_ACCESS) | \
|
||||
INT_MASK(INT_I_ASID) | \
|
||||
INT_MASK(INT_D_ASID) | \
|
||||
INT_MASK(INT_DOUBLE_FAULT) | \
|
||||
(1ULL << INT_ITLB_MISS) | \
|
||||
(1ULL << INT_ILL) | \
|
||||
(1ULL << INT_GPV) | \
|
||||
(1ULL << INT_IDN_ACCESS) | \
|
||||
(1ULL << INT_UDN_ACCESS) | \
|
||||
(1ULL << INT_SWINT_3) | \
|
||||
(1ULL << INT_SWINT_2) | \
|
||||
(1ULL << INT_SWINT_1) | \
|
||||
(1ULL << INT_SWINT_0) | \
|
||||
(1ULL << INT_ILL_TRANS) | \
|
||||
(1ULL << INT_UNALIGN_DATA) | \
|
||||
(1ULL << INT_DTLB_MISS) | \
|
||||
(1ULL << INT_DTLB_ACCESS) | \
|
||||
(1ULL << INT_BOOT_ACCESS) | \
|
||||
(1ULL << INT_WORLD_ACCESS) | \
|
||||
(1ULL << INT_I_ASID) | \
|
||||
(1ULL << INT_D_ASID) | \
|
||||
(1ULL << INT_DOUBLE_FAULT) | \
|
||||
0)
|
||||
#define MASKABLE_INTERRUPTS ( \
|
||||
INT_MASK(INT_MEM_ERROR) | \
|
||||
INT_MASK(INT_SINGLE_STEP_3) | \
|
||||
INT_MASK(INT_SINGLE_STEP_2) | \
|
||||
INT_MASK(INT_SINGLE_STEP_1) | \
|
||||
INT_MASK(INT_SINGLE_STEP_0) | \
|
||||
INT_MASK(INT_IDN_COMPLETE) | \
|
||||
INT_MASK(INT_UDN_COMPLETE) | \
|
||||
INT_MASK(INT_IDN_FIREWALL) | \
|
||||
INT_MASK(INT_UDN_FIREWALL) | \
|
||||
INT_MASK(INT_TILE_TIMER) | \
|
||||
INT_MASK(INT_AUX_TILE_TIMER) | \
|
||||
INT_MASK(INT_IDN_TIMER) | \
|
||||
INT_MASK(INT_UDN_TIMER) | \
|
||||
INT_MASK(INT_IDN_AVAIL) | \
|
||||
INT_MASK(INT_UDN_AVAIL) | \
|
||||
INT_MASK(INT_IPI_3) | \
|
||||
INT_MASK(INT_IPI_2) | \
|
||||
INT_MASK(INT_IPI_1) | \
|
||||
INT_MASK(INT_IPI_0) | \
|
||||
INT_MASK(INT_PERF_COUNT) | \
|
||||
INT_MASK(INT_AUX_PERF_COUNT) | \
|
||||
INT_MASK(INT_INTCTRL_3) | \
|
||||
INT_MASK(INT_INTCTRL_2) | \
|
||||
INT_MASK(INT_INTCTRL_1) | \
|
||||
INT_MASK(INT_INTCTRL_0) | \
|
||||
(1ULL << INT_MEM_ERROR) | \
|
||||
(1ULL << INT_SINGLE_STEP_3) | \
|
||||
(1ULL << INT_SINGLE_STEP_2) | \
|
||||
(1ULL << INT_SINGLE_STEP_1) | \
|
||||
(1ULL << INT_SINGLE_STEP_0) | \
|
||||
(1ULL << INT_IDN_COMPLETE) | \
|
||||
(1ULL << INT_UDN_COMPLETE) | \
|
||||
(1ULL << INT_IDN_FIREWALL) | \
|
||||
(1ULL << INT_UDN_FIREWALL) | \
|
||||
(1ULL << INT_TILE_TIMER) | \
|
||||
(1ULL << INT_AUX_TILE_TIMER) | \
|
||||
(1ULL << INT_IDN_TIMER) | \
|
||||
(1ULL << INT_UDN_TIMER) | \
|
||||
(1ULL << INT_IDN_AVAIL) | \
|
||||
(1ULL << INT_UDN_AVAIL) | \
|
||||
(1ULL << INT_IPI_3) | \
|
||||
(1ULL << INT_IPI_2) | \
|
||||
(1ULL << INT_IPI_1) | \
|
||||
(1ULL << INT_IPI_0) | \
|
||||
(1ULL << INT_PERF_COUNT) | \
|
||||
(1ULL << INT_AUX_PERF_COUNT) | \
|
||||
(1ULL << INT_INTCTRL_3) | \
|
||||
(1ULL << INT_INTCTRL_2) | \
|
||||
(1ULL << INT_INTCTRL_1) | \
|
||||
(1ULL << INT_INTCTRL_0) | \
|
||||
0)
|
||||
#define UNMASKABLE_INTERRUPTS ( \
|
||||
INT_MASK(INT_ITLB_MISS) | \
|
||||
INT_MASK(INT_ILL) | \
|
||||
INT_MASK(INT_GPV) | \
|
||||
INT_MASK(INT_IDN_ACCESS) | \
|
||||
INT_MASK(INT_UDN_ACCESS) | \
|
||||
INT_MASK(INT_SWINT_3) | \
|
||||
INT_MASK(INT_SWINT_2) | \
|
||||
INT_MASK(INT_SWINT_1) | \
|
||||
INT_MASK(INT_SWINT_0) | \
|
||||
INT_MASK(INT_ILL_TRANS) | \
|
||||
INT_MASK(INT_UNALIGN_DATA) | \
|
||||
INT_MASK(INT_DTLB_MISS) | \
|
||||
INT_MASK(INT_DTLB_ACCESS) | \
|
||||
INT_MASK(INT_BOOT_ACCESS) | \
|
||||
INT_MASK(INT_WORLD_ACCESS) | \
|
||||
INT_MASK(INT_I_ASID) | \
|
||||
INT_MASK(INT_D_ASID) | \
|
||||
INT_MASK(INT_DOUBLE_FAULT) | \
|
||||
(1ULL << INT_ITLB_MISS) | \
|
||||
(1ULL << INT_ILL) | \
|
||||
(1ULL << INT_GPV) | \
|
||||
(1ULL << INT_IDN_ACCESS) | \
|
||||
(1ULL << INT_UDN_ACCESS) | \
|
||||
(1ULL << INT_SWINT_3) | \
|
||||
(1ULL << INT_SWINT_2) | \
|
||||
(1ULL << INT_SWINT_1) | \
|
||||
(1ULL << INT_SWINT_0) | \
|
||||
(1ULL << INT_ILL_TRANS) | \
|
||||
(1ULL << INT_UNALIGN_DATA) | \
|
||||
(1ULL << INT_DTLB_MISS) | \
|
||||
(1ULL << INT_DTLB_ACCESS) | \
|
||||
(1ULL << INT_BOOT_ACCESS) | \
|
||||
(1ULL << INT_WORLD_ACCESS) | \
|
||||
(1ULL << INT_I_ASID) | \
|
||||
(1ULL << INT_D_ASID) | \
|
||||
(1ULL << INT_DOUBLE_FAULT) | \
|
||||
0)
|
||||
#define SYNC_INTERRUPTS ( \
|
||||
INT_MASK(INT_SINGLE_STEP_3) | \
|
||||
INT_MASK(INT_SINGLE_STEP_2) | \
|
||||
INT_MASK(INT_SINGLE_STEP_1) | \
|
||||
INT_MASK(INT_SINGLE_STEP_0) | \
|
||||
INT_MASK(INT_IDN_COMPLETE) | \
|
||||
INT_MASK(INT_UDN_COMPLETE) | \
|
||||
INT_MASK(INT_ITLB_MISS) | \
|
||||
INT_MASK(INT_ILL) | \
|
||||
INT_MASK(INT_GPV) | \
|
||||
INT_MASK(INT_IDN_ACCESS) | \
|
||||
INT_MASK(INT_UDN_ACCESS) | \
|
||||
INT_MASK(INT_SWINT_3) | \
|
||||
INT_MASK(INT_SWINT_2) | \
|
||||
INT_MASK(INT_SWINT_1) | \
|
||||
INT_MASK(INT_SWINT_0) | \
|
||||
INT_MASK(INT_ILL_TRANS) | \
|
||||
INT_MASK(INT_UNALIGN_DATA) | \
|
||||
INT_MASK(INT_DTLB_MISS) | \
|
||||
INT_MASK(INT_DTLB_ACCESS) | \
|
||||
(1ULL << INT_SINGLE_STEP_3) | \
|
||||
(1ULL << INT_SINGLE_STEP_2) | \
|
||||
(1ULL << INT_SINGLE_STEP_1) | \
|
||||
(1ULL << INT_SINGLE_STEP_0) | \
|
||||
(1ULL << INT_IDN_COMPLETE) | \
|
||||
(1ULL << INT_UDN_COMPLETE) | \
|
||||
(1ULL << INT_ITLB_MISS) | \
|
||||
(1ULL << INT_ILL) | \
|
||||
(1ULL << INT_GPV) | \
|
||||
(1ULL << INT_IDN_ACCESS) | \
|
||||
(1ULL << INT_UDN_ACCESS) | \
|
||||
(1ULL << INT_SWINT_3) | \
|
||||
(1ULL << INT_SWINT_2) | \
|
||||
(1ULL << INT_SWINT_1) | \
|
||||
(1ULL << INT_SWINT_0) | \
|
||||
(1ULL << INT_ILL_TRANS) | \
|
||||
(1ULL << INT_UNALIGN_DATA) | \
|
||||
(1ULL << INT_DTLB_MISS) | \
|
||||
(1ULL << INT_DTLB_ACCESS) | \
|
||||
0)
|
||||
#define NON_SYNC_INTERRUPTS ( \
|
||||
INT_MASK(INT_MEM_ERROR) | \
|
||||
INT_MASK(INT_IDN_FIREWALL) | \
|
||||
INT_MASK(INT_UDN_FIREWALL) | \
|
||||
INT_MASK(INT_TILE_TIMER) | \
|
||||
INT_MASK(INT_AUX_TILE_TIMER) | \
|
||||
INT_MASK(INT_IDN_TIMER) | \
|
||||
INT_MASK(INT_UDN_TIMER) | \
|
||||
INT_MASK(INT_IDN_AVAIL) | \
|
||||
INT_MASK(INT_UDN_AVAIL) | \
|
||||
INT_MASK(INT_IPI_3) | \
|
||||
INT_MASK(INT_IPI_2) | \
|
||||
INT_MASK(INT_IPI_1) | \
|
||||
INT_MASK(INT_IPI_0) | \
|
||||
INT_MASK(INT_PERF_COUNT) | \
|
||||
INT_MASK(INT_AUX_PERF_COUNT) | \
|
||||
INT_MASK(INT_INTCTRL_3) | \
|
||||
INT_MASK(INT_INTCTRL_2) | \
|
||||
INT_MASK(INT_INTCTRL_1) | \
|
||||
INT_MASK(INT_INTCTRL_0) | \
|
||||
INT_MASK(INT_BOOT_ACCESS) | \
|
||||
INT_MASK(INT_WORLD_ACCESS) | \
|
||||
INT_MASK(INT_I_ASID) | \
|
||||
INT_MASK(INT_D_ASID) | \
|
||||
INT_MASK(INT_DOUBLE_FAULT) | \
|
||||
(1ULL << INT_MEM_ERROR) | \
|
||||
(1ULL << INT_IDN_FIREWALL) | \
|
||||
(1ULL << INT_UDN_FIREWALL) | \
|
||||
(1ULL << INT_TILE_TIMER) | \
|
||||
(1ULL << INT_AUX_TILE_TIMER) | \
|
||||
(1ULL << INT_IDN_TIMER) | \
|
||||
(1ULL << INT_UDN_TIMER) | \
|
||||
(1ULL << INT_IDN_AVAIL) | \
|
||||
(1ULL << INT_UDN_AVAIL) | \
|
||||
(1ULL << INT_IPI_3) | \
|
||||
(1ULL << INT_IPI_2) | \
|
||||
(1ULL << INT_IPI_1) | \
|
||||
(1ULL << INT_IPI_0) | \
|
||||
(1ULL << INT_PERF_COUNT) | \
|
||||
(1ULL << INT_AUX_PERF_COUNT) | \
|
||||
(1ULL << INT_INTCTRL_3) | \
|
||||
(1ULL << INT_INTCTRL_2) | \
|
||||
(1ULL << INT_INTCTRL_1) | \
|
||||
(1ULL << INT_INTCTRL_0) | \
|
||||
(1ULL << INT_BOOT_ACCESS) | \
|
||||
(1ULL << INT_WORLD_ACCESS) | \
|
||||
(1ULL << INT_I_ASID) | \
|
||||
(1ULL << INT_D_ASID) | \
|
||||
(1ULL << INT_DOUBLE_FAULT) | \
|
||||
0)
|
||||
#endif /* !__ASSEMBLER__ */
|
||||
#endif /* !__ARCH_INTERRUPTS_H__ */
|
||||
|
||||
@@ -1035,7 +1035,9 @@ handle_syscall:
|
||||
/* Ensure that the syscall number is within the legal range. */
|
||||
{
|
||||
moveli r20, hw2(sys_call_table)
|
||||
#ifdef CONFIG_COMPAT
|
||||
blbs r30, .Lcompat_syscall
|
||||
#endif
|
||||
}
|
||||
{
|
||||
cmpltu r21, TREG_SYSCALL_NR_NAME, r21
|
||||
@@ -1093,6 +1095,7 @@ handle_syscall:
|
||||
j .Lresume_userspace /* jump into middle of interrupt_return */
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
.Lcompat_syscall:
|
||||
/*
|
||||
* Load the base of the compat syscall table in r20, and
|
||||
@@ -1117,6 +1120,7 @@ handle_syscall:
|
||||
{ move r15, r4; addxi r4, r4, 0 }
|
||||
{ move r16, r5; addxi r5, r5, 0 }
|
||||
j .Lload_syscall_pointer
|
||||
#endif
|
||||
|
||||
.Linvalid_syscall:
|
||||
/* Report an invalid syscall back to the user program */
|
||||
|
||||
@@ -159,7 +159,7 @@ static void save_arch_state(struct thread_struct *t);
|
||||
int copy_thread(unsigned long clone_flags, unsigned long sp,
|
||||
unsigned long arg, struct task_struct *p)
|
||||
{
|
||||
struct pt_regs *childregs = task_pt_regs(p), *regs = current_pt_regs();
|
||||
struct pt_regs *childregs = task_pt_regs(p);
|
||||
unsigned long ksp;
|
||||
unsigned long *callee_regs;
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
#include <linux/reboot.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/export.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/setup.h>
|
||||
#include <hv/hypervisor.h>
|
||||
@@ -49,3 +50,4 @@ void machine_restart(char *cmd)
|
||||
|
||||
/* No interesting distinction to be made here. */
|
||||
void (*pm_power_off)(void) = NULL;
|
||||
EXPORT_SYMBOL(pm_power_off);
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
#include <linux/timex.h>
|
||||
#include <linux/hugetlb.h>
|
||||
#include <linux/start_kernel.h>
|
||||
#include <linux/screen_info.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/sections.h>
|
||||
#include <asm/cacheflush.h>
|
||||
@@ -49,6 +50,10 @@ static inline int ABS(int x) { return x >= 0 ? x : -x; }
|
||||
/* Chip information */
|
||||
char chip_model[64] __write_once;
|
||||
|
||||
#ifdef CONFIG_VT
|
||||
struct screen_info screen_info;
|
||||
#endif
|
||||
|
||||
struct pglist_data node_data[MAX_NUMNODES] __read_mostly;
|
||||
EXPORT_SYMBOL(node_data);
|
||||
|
||||
|
||||
@@ -112,7 +112,7 @@ static struct pt_regs *valid_fault_handler(struct KBacktraceIterator* kbt)
|
||||
p->pc, p->sp, p->ex1);
|
||||
p = NULL;
|
||||
}
|
||||
if (!kbt->profile || (INT_MASK(p->faultnum) & QUEUED_INTERRUPTS) == 0)
|
||||
if (!kbt->profile || ((1ULL << p->faultnum) & QUEUED_INTERRUPTS) == 0)
|
||||
return p;
|
||||
return NULL;
|
||||
}
|
||||
@@ -484,6 +484,7 @@ void save_stack_trace(struct stack_trace *trace)
|
||||
{
|
||||
save_stack_trace_tsk(NULL, trace);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(save_stack_trace);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
* more details.
|
||||
*/
|
||||
|
||||
#include <linux/export.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/cacheflush.h>
|
||||
#include <arch/icache.h>
|
||||
@@ -165,3 +166,4 @@ void finv_buffer_remote(void *buffer, size_t size, int hfh)
|
||||
__insn_mtspr(SPR_DSTREAM_PF, old_dstream_pf);
|
||||
#endif
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(finv_buffer_remote);
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
#include <linux/ctype.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/export.h>
|
||||
|
||||
/*
|
||||
* Allow cropping out bits beyond the end of the array.
|
||||
@@ -50,3 +51,4 @@ int bitmap_parselist_crop(const char *bp, unsigned long *maskp, int nmaskbits)
|
||||
} while (*bp != '\0' && *bp != '\n');
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(bitmap_parselist_crop);
|
||||
|
||||
@@ -55,6 +55,8 @@ EXPORT_SYMBOL(hv_dev_poll_cancel);
|
||||
EXPORT_SYMBOL(hv_dev_close);
|
||||
EXPORT_SYMBOL(hv_sysconf);
|
||||
EXPORT_SYMBOL(hv_confstr);
|
||||
EXPORT_SYMBOL(hv_get_rtc);
|
||||
EXPORT_SYMBOL(hv_set_rtc);
|
||||
|
||||
/* libgcc.a */
|
||||
uint32_t __udivsi3(uint32_t dividend, uint32_t divisor);
|
||||
|
||||
@@ -408,6 +408,7 @@ void homecache_change_page_home(struct page *page, int order, int home)
|
||||
__set_pte(ptep, pte_set_home(pteval, home));
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(homecache_change_page_home);
|
||||
|
||||
struct page *homecache_alloc_pages(gfp_t gfp_mask,
|
||||
unsigned int order, int home)
|
||||
|
||||
@@ -3,6 +3,90 @@
|
||||
|
||||
#include <uapi/asm/mce.h>
|
||||
|
||||
/*
|
||||
* Machine Check support for x86
|
||||
*/
|
||||
|
||||
/* MCG_CAP register defines */
|
||||
#define MCG_BANKCNT_MASK 0xff /* Number of Banks */
|
||||
#define MCG_CTL_P (1ULL<<8) /* MCG_CTL register available */
|
||||
#define MCG_EXT_P (1ULL<<9) /* Extended registers available */
|
||||
#define MCG_CMCI_P (1ULL<<10) /* CMCI supported */
|
||||
#define MCG_EXT_CNT_MASK 0xff0000 /* Number of Extended registers */
|
||||
#define MCG_EXT_CNT_SHIFT 16
|
||||
#define MCG_EXT_CNT(c) (((c) & MCG_EXT_CNT_MASK) >> MCG_EXT_CNT_SHIFT)
|
||||
#define MCG_SER_P (1ULL<<24) /* MCA recovery/new status bits */
|
||||
|
||||
/* MCG_STATUS register defines */
|
||||
#define MCG_STATUS_RIPV (1ULL<<0) /* restart ip valid */
|
||||
#define MCG_STATUS_EIPV (1ULL<<1) /* ip points to correct instruction */
|
||||
#define MCG_STATUS_MCIP (1ULL<<2) /* machine check in progress */
|
||||
|
||||
/* MCi_STATUS register defines */
|
||||
#define MCI_STATUS_VAL (1ULL<<63) /* valid error */
|
||||
#define MCI_STATUS_OVER (1ULL<<62) /* previous errors lost */
|
||||
#define MCI_STATUS_UC (1ULL<<61) /* uncorrected error */
|
||||
#define MCI_STATUS_EN (1ULL<<60) /* error enabled */
|
||||
#define MCI_STATUS_MISCV (1ULL<<59) /* misc error reg. valid */
|
||||
#define MCI_STATUS_ADDRV (1ULL<<58) /* addr reg. valid */
|
||||
#define MCI_STATUS_PCC (1ULL<<57) /* processor context corrupt */
|
||||
#define MCI_STATUS_S (1ULL<<56) /* Signaled machine check */
|
||||
#define MCI_STATUS_AR (1ULL<<55) /* Action required */
|
||||
#define MCACOD 0xffff /* MCA Error Code */
|
||||
|
||||
/* Architecturally defined codes from SDM Vol. 3B Chapter 15 */
|
||||
#define MCACOD_SCRUB 0x00C0 /* 0xC0-0xCF Memory Scrubbing */
|
||||
#define MCACOD_SCRUBMSK 0xfff0
|
||||
#define MCACOD_L3WB 0x017A /* L3 Explicit Writeback */
|
||||
#define MCACOD_DATA 0x0134 /* Data Load */
|
||||
#define MCACOD_INSTR 0x0150 /* Instruction Fetch */
|
||||
|
||||
/* MCi_MISC register defines */
|
||||
#define MCI_MISC_ADDR_LSB(m) ((m) & 0x3f)
|
||||
#define MCI_MISC_ADDR_MODE(m) (((m) >> 6) & 7)
|
||||
#define MCI_MISC_ADDR_SEGOFF 0 /* segment offset */
|
||||
#define MCI_MISC_ADDR_LINEAR 1 /* linear address */
|
||||
#define MCI_MISC_ADDR_PHYS 2 /* physical address */
|
||||
#define MCI_MISC_ADDR_MEM 3 /* memory address */
|
||||
#define MCI_MISC_ADDR_GENERIC 7 /* generic */
|
||||
|
||||
/* CTL2 register defines */
|
||||
#define MCI_CTL2_CMCI_EN (1ULL << 30)
|
||||
#define MCI_CTL2_CMCI_THRESHOLD_MASK 0x7fffULL
|
||||
|
||||
#define MCJ_CTX_MASK 3
|
||||
#define MCJ_CTX(flags) ((flags) & MCJ_CTX_MASK)
|
||||
#define MCJ_CTX_RANDOM 0 /* inject context: random */
|
||||
#define MCJ_CTX_PROCESS 0x1 /* inject context: process */
|
||||
#define MCJ_CTX_IRQ 0x2 /* inject context: IRQ */
|
||||
#define MCJ_NMI_BROADCAST 0x4 /* do NMI broadcasting */
|
||||
#define MCJ_EXCEPTION 0x8 /* raise as exception */
|
||||
#define MCJ_IRQ_BRAODCAST 0x10 /* do IRQ broadcasting */
|
||||
|
||||
#define MCE_OVERFLOW 0 /* bit 0 in flags means overflow */
|
||||
|
||||
/* Software defined banks */
|
||||
#define MCE_EXTENDED_BANK 128
|
||||
#define MCE_THERMAL_BANK (MCE_EXTENDED_BANK + 0)
|
||||
#define K8_MCE_THRESHOLD_BASE (MCE_EXTENDED_BANK + 1)
|
||||
|
||||
#define MCE_LOG_LEN 32
|
||||
#define MCE_LOG_SIGNATURE "MACHINECHECK"
|
||||
|
||||
/*
|
||||
* This structure contains all data related to the MCE log. Also
|
||||
* carries a signature to make it easier to find from external
|
||||
* debugging tools. Each entry is only valid when its finished flag
|
||||
* is set.
|
||||
*/
|
||||
struct mce_log {
|
||||
char signature[12]; /* "MACHINECHECK" */
|
||||
unsigned len; /* = MCE_LOG_LEN */
|
||||
unsigned next;
|
||||
unsigned flags;
|
||||
unsigned recordlen; /* length of struct mce */
|
||||
struct mce entry[MCE_LOG_LEN];
|
||||
};
|
||||
|
||||
struct mca_config {
|
||||
bool dont_log_ce;
|
||||
|
||||
@@ -142,6 +142,11 @@ static inline unsigned long pmd_pfn(pmd_t pmd)
|
||||
return (pmd_val(pmd) & PTE_PFN_MASK) >> PAGE_SHIFT;
|
||||
}
|
||||
|
||||
static inline unsigned long pud_pfn(pud_t pud)
|
||||
{
|
||||
return (pud_val(pud) & PTE_PFN_MASK) >> PAGE_SHIFT;
|
||||
}
|
||||
|
||||
#define pte_page(pte) pfn_to_page(pte_pfn(pte))
|
||||
|
||||
static inline int pmd_large(pmd_t pte)
|
||||
|
||||
@@ -4,66 +4,6 @@
|
||||
#include <linux/types.h>
|
||||
#include <asm/ioctls.h>
|
||||
|
||||
/*
|
||||
* Machine Check support for x86
|
||||
*/
|
||||
|
||||
/* MCG_CAP register defines */
|
||||
#define MCG_BANKCNT_MASK 0xff /* Number of Banks */
|
||||
#define MCG_CTL_P (1ULL<<8) /* MCG_CTL register available */
|
||||
#define MCG_EXT_P (1ULL<<9) /* Extended registers available */
|
||||
#define MCG_CMCI_P (1ULL<<10) /* CMCI supported */
|
||||
#define MCG_EXT_CNT_MASK 0xff0000 /* Number of Extended registers */
|
||||
#define MCG_EXT_CNT_SHIFT 16
|
||||
#define MCG_EXT_CNT(c) (((c) & MCG_EXT_CNT_MASK) >> MCG_EXT_CNT_SHIFT)
|
||||
#define MCG_SER_P (1ULL<<24) /* MCA recovery/new status bits */
|
||||
|
||||
/* MCG_STATUS register defines */
|
||||
#define MCG_STATUS_RIPV (1ULL<<0) /* restart ip valid */
|
||||
#define MCG_STATUS_EIPV (1ULL<<1) /* ip points to correct instruction */
|
||||
#define MCG_STATUS_MCIP (1ULL<<2) /* machine check in progress */
|
||||
|
||||
/* MCi_STATUS register defines */
|
||||
#define MCI_STATUS_VAL (1ULL<<63) /* valid error */
|
||||
#define MCI_STATUS_OVER (1ULL<<62) /* previous errors lost */
|
||||
#define MCI_STATUS_UC (1ULL<<61) /* uncorrected error */
|
||||
#define MCI_STATUS_EN (1ULL<<60) /* error enabled */
|
||||
#define MCI_STATUS_MISCV (1ULL<<59) /* misc error reg. valid */
|
||||
#define MCI_STATUS_ADDRV (1ULL<<58) /* addr reg. valid */
|
||||
#define MCI_STATUS_PCC (1ULL<<57) /* processor context corrupt */
|
||||
#define MCI_STATUS_S (1ULL<<56) /* Signaled machine check */
|
||||
#define MCI_STATUS_AR (1ULL<<55) /* Action required */
|
||||
#define MCACOD 0xffff /* MCA Error Code */
|
||||
|
||||
/* Architecturally defined codes from SDM Vol. 3B Chapter 15 */
|
||||
#define MCACOD_SCRUB 0x00C0 /* 0xC0-0xCF Memory Scrubbing */
|
||||
#define MCACOD_SCRUBMSK 0xfff0
|
||||
#define MCACOD_L3WB 0x017A /* L3 Explicit Writeback */
|
||||
#define MCACOD_DATA 0x0134 /* Data Load */
|
||||
#define MCACOD_INSTR 0x0150 /* Instruction Fetch */
|
||||
|
||||
/* MCi_MISC register defines */
|
||||
#define MCI_MISC_ADDR_LSB(m) ((m) & 0x3f)
|
||||
#define MCI_MISC_ADDR_MODE(m) (((m) >> 6) & 7)
|
||||
#define MCI_MISC_ADDR_SEGOFF 0 /* segment offset */
|
||||
#define MCI_MISC_ADDR_LINEAR 1 /* linear address */
|
||||
#define MCI_MISC_ADDR_PHYS 2 /* physical address */
|
||||
#define MCI_MISC_ADDR_MEM 3 /* memory address */
|
||||
#define MCI_MISC_ADDR_GENERIC 7 /* generic */
|
||||
|
||||
/* CTL2 register defines */
|
||||
#define MCI_CTL2_CMCI_EN (1ULL << 30)
|
||||
#define MCI_CTL2_CMCI_THRESHOLD_MASK 0x7fffULL
|
||||
|
||||
#define MCJ_CTX_MASK 3
|
||||
#define MCJ_CTX(flags) ((flags) & MCJ_CTX_MASK)
|
||||
#define MCJ_CTX_RANDOM 0 /* inject context: random */
|
||||
#define MCJ_CTX_PROCESS 0x1 /* inject context: process */
|
||||
#define MCJ_CTX_IRQ 0x2 /* inject context: IRQ */
|
||||
#define MCJ_NMI_BROADCAST 0x4 /* do NMI broadcasting */
|
||||
#define MCJ_EXCEPTION 0x8 /* raise as exception */
|
||||
#define MCJ_IRQ_BRAODCAST 0x10 /* do IRQ broadcasting */
|
||||
|
||||
/* Fields are zero when not available */
|
||||
struct mce {
|
||||
__u64 status;
|
||||
@@ -87,35 +27,8 @@ struct mce {
|
||||
__u64 mcgcap; /* MCGCAP MSR: machine check capabilities of CPU */
|
||||
};
|
||||
|
||||
/*
|
||||
* This structure contains all data related to the MCE log. Also
|
||||
* carries a signature to make it easier to find from external
|
||||
* debugging tools. Each entry is only valid when its finished flag
|
||||
* is set.
|
||||
*/
|
||||
|
||||
#define MCE_LOG_LEN 32
|
||||
|
||||
struct mce_log {
|
||||
char signature[12]; /* "MACHINECHECK" */
|
||||
unsigned len; /* = MCE_LOG_LEN */
|
||||
unsigned next;
|
||||
unsigned flags;
|
||||
unsigned recordlen; /* length of struct mce */
|
||||
struct mce entry[MCE_LOG_LEN];
|
||||
};
|
||||
|
||||
#define MCE_OVERFLOW 0 /* bit 0 in flags means overflow */
|
||||
|
||||
#define MCE_LOG_SIGNATURE "MACHINECHECK"
|
||||
|
||||
#define MCE_GET_RECORD_LEN _IOR('M', 1, int)
|
||||
#define MCE_GET_LOG_LEN _IOR('M', 2, int)
|
||||
#define MCE_GETCLEAR_FLAGS _IOR('M', 3, int)
|
||||
|
||||
/* Software defined banks */
|
||||
#define MCE_EXTENDED_BANK 128
|
||||
#define MCE_THERMAL_BANK MCE_EXTENDED_BANK + 0
|
||||
#define K8_MCE_THRESHOLD_BASE (MCE_EXTENDED_BANK + 1)
|
||||
|
||||
#endif /* _UAPI_ASM_X86_MCE_H */
|
||||
|
||||
@@ -20,18 +20,19 @@ static int set_x2apic_phys_mode(char *arg)
|
||||
}
|
||||
early_param("x2apic_phys", set_x2apic_phys_mode);
|
||||
|
||||
static bool x2apic_fadt_phys(void)
|
||||
{
|
||||
if ((acpi_gbl_FADT.header.revision >= FADT2_REVISION_ID) &&
|
||||
(acpi_gbl_FADT.flags & ACPI_FADT_APIC_PHYSICAL)) {
|
||||
printk(KERN_DEBUG "System requires x2apic physical mode\n");
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static int x2apic_acpi_madt_oem_check(char *oem_id, char *oem_table_id)
|
||||
{
|
||||
if (x2apic_phys)
|
||||
return x2apic_enabled();
|
||||
else if ((acpi_gbl_FADT.header.revision >= FADT2_REVISION_ID) &&
|
||||
(acpi_gbl_FADT.flags & ACPI_FADT_APIC_PHYSICAL) &&
|
||||
x2apic_enabled()) {
|
||||
printk(KERN_DEBUG "System requires x2apic physical mode\n");
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
return 0;
|
||||
return x2apic_enabled() && (x2apic_phys || x2apic_fadt_phys());
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -82,7 +83,7 @@ static void init_x2apic_ldr(void)
|
||||
|
||||
static int x2apic_phys_probe(void)
|
||||
{
|
||||
if (x2apic_mode && x2apic_phys)
|
||||
if (x2apic_mode && (x2apic_phys || x2apic_fadt_phys()))
|
||||
return 1;
|
||||
|
||||
return apic == &apic_x2apic_phys;
|
||||
|
||||
@@ -748,13 +748,15 @@ __bad_area_nosemaphore(struct pt_regs *regs, unsigned long error_code,
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
/* Kernel addresses are always protection faults: */
|
||||
if (address >= TASK_SIZE)
|
||||
error_code |= PF_PROT;
|
||||
|
||||
if (unlikely(show_unhandled_signals))
|
||||
if (likely(show_unhandled_signals))
|
||||
show_signal_msg(regs, error_code, address, tsk);
|
||||
|
||||
/* Kernel addresses are always protection faults: */
|
||||
tsk->thread.cr2 = address;
|
||||
tsk->thread.error_code = error_code | (address >= TASK_SIZE);
|
||||
tsk->thread.error_code = error_code;
|
||||
tsk->thread.trap_nr = X86_TRAP_PF;
|
||||
|
||||
force_sig_info_fault(SIGSEGV, si_code, address, tsk, 0);
|
||||
|
||||
@@ -831,6 +831,9 @@ int kern_addr_valid(unsigned long addr)
|
||||
if (pud_none(*pud))
|
||||
return 0;
|
||||
|
||||
if (pud_large(*pud))
|
||||
return pfn_valid(pud_pfn(*pud));
|
||||
|
||||
pmd = pmd_offset(pud, addr);
|
||||
if (pmd_none(*pmd))
|
||||
return 0;
|
||||
|
||||
@@ -87,7 +87,7 @@ EXPORT_SYMBOL(efi_enabled);
|
||||
|
||||
static int __init setup_noefi(char *arg)
|
||||
{
|
||||
clear_bit(EFI_BOOT, &x86_efi_facility);
|
||||
clear_bit(EFI_RUNTIME_SERVICES, &x86_efi_facility);
|
||||
return 0;
|
||||
}
|
||||
early_param("noefi", setup_noefi);
|
||||
|
||||
@@ -1517,72 +1517,51 @@ asmlinkage void __init xen_start_kernel(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef CONFIG_XEN_PVHVM
|
||||
#define HVM_SHARED_INFO_ADDR 0xFE700000UL
|
||||
static struct shared_info *xen_hvm_shared_info;
|
||||
static unsigned long xen_hvm_sip_phys;
|
||||
static int xen_major, xen_minor;
|
||||
|
||||
static void xen_hvm_connect_shared_info(unsigned long pfn)
|
||||
void __ref xen_hvm_init_shared_info(void)
|
||||
{
|
||||
int cpu;
|
||||
struct xen_add_to_physmap xatp;
|
||||
static struct shared_info *shared_info_page = 0;
|
||||
|
||||
if (!shared_info_page)
|
||||
shared_info_page = (struct shared_info *)
|
||||
extend_brk(PAGE_SIZE, PAGE_SIZE);
|
||||
xatp.domid = DOMID_SELF;
|
||||
xatp.idx = 0;
|
||||
xatp.space = XENMAPSPACE_shared_info;
|
||||
xatp.gpfn = pfn;
|
||||
xatp.gpfn = __pa(shared_info_page) >> PAGE_SHIFT;
|
||||
if (HYPERVISOR_memory_op(XENMEM_add_to_physmap, &xatp))
|
||||
BUG();
|
||||
|
||||
}
|
||||
static void __init xen_hvm_set_shared_info(struct shared_info *sip)
|
||||
{
|
||||
int cpu;
|
||||
|
||||
HYPERVISOR_shared_info = sip;
|
||||
HYPERVISOR_shared_info = (struct shared_info *)shared_info_page;
|
||||
|
||||
/* xen_vcpu is a pointer to the vcpu_info struct in the shared_info
|
||||
* page, we use it in the event channel upcall and in some pvclock
|
||||
* related functions. We don't need the vcpu_info placement
|
||||
* optimizations because we don't use any pv_mmu or pv_irq op on
|
||||
* HVM. */
|
||||
for_each_online_cpu(cpu)
|
||||
* HVM.
|
||||
* When xen_hvm_init_shared_info is run at boot time only vcpu 0 is
|
||||
* online but xen_hvm_init_shared_info is run at resume time too and
|
||||
* in that case multiple vcpus might be online. */
|
||||
for_each_online_cpu(cpu) {
|
||||
per_cpu(xen_vcpu, cpu) = &HYPERVISOR_shared_info->vcpu_info[cpu];
|
||||
}
|
||||
|
||||
/* Reconnect the shared_info pfn to a (new) mfn */
|
||||
void xen_hvm_resume_shared_info(void)
|
||||
{
|
||||
xen_hvm_connect_shared_info(xen_hvm_sip_phys >> PAGE_SHIFT);
|
||||
}
|
||||
|
||||
/* Xen tools prior to Xen 4 do not provide a E820_Reserved area for guest usage.
|
||||
* On these old tools the shared info page will be placed in E820_Ram.
|
||||
* Xen 4 provides a E820_Reserved area at 0xFC000000, and this code expects
|
||||
* that nothing is mapped up to HVM_SHARED_INFO_ADDR.
|
||||
* Xen 4.3+ provides an explicit 1MB area at HVM_SHARED_INFO_ADDR which is used
|
||||
* here for the shared info page. */
|
||||
static void __init xen_hvm_init_shared_info(void)
|
||||
{
|
||||
if (xen_major < 4) {
|
||||
xen_hvm_shared_info = extend_brk(PAGE_SIZE, PAGE_SIZE);
|
||||
xen_hvm_sip_phys = __pa(xen_hvm_shared_info);
|
||||
} else {
|
||||
xen_hvm_sip_phys = HVM_SHARED_INFO_ADDR;
|
||||
set_fixmap(FIX_PARAVIRT_BOOTMAP, xen_hvm_sip_phys);
|
||||
xen_hvm_shared_info =
|
||||
(struct shared_info *)fix_to_virt(FIX_PARAVIRT_BOOTMAP);
|
||||
}
|
||||
xen_hvm_connect_shared_info(xen_hvm_sip_phys >> PAGE_SHIFT);
|
||||
xen_hvm_set_shared_info(xen_hvm_shared_info);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_XEN_PVHVM
|
||||
static void __init init_hvm_pv_info(void)
|
||||
{
|
||||
uint32_t ecx, edx, pages, msr, base;
|
||||
int major, minor;
|
||||
uint32_t eax, ebx, ecx, edx, pages, msr, base;
|
||||
u64 pfn;
|
||||
|
||||
base = xen_cpuid_base();
|
||||
cpuid(base + 1, &eax, &ebx, &ecx, &edx);
|
||||
|
||||
major = eax >> 16;
|
||||
minor = eax & 0xffff;
|
||||
printk(KERN_INFO "Xen version %d.%d.\n", major, minor);
|
||||
|
||||
cpuid(base + 2, &pages, &msr, &ecx, &edx);
|
||||
|
||||
pfn = __pa(hypercall_page);
|
||||
@@ -1633,22 +1612,12 @@ static void __init xen_hvm_guest_init(void)
|
||||
|
||||
static bool __init xen_hvm_platform(void)
|
||||
{
|
||||
uint32_t eax, ebx, ecx, edx, base;
|
||||
|
||||
if (xen_pv_domain())
|
||||
return false;
|
||||
|
||||
base = xen_cpuid_base();
|
||||
if (!base)
|
||||
if (!xen_cpuid_base())
|
||||
return false;
|
||||
|
||||
cpuid(base + 1, &eax, &ebx, &ecx, &edx);
|
||||
|
||||
xen_major = eax >> 16;
|
||||
xen_minor = eax & 0xffff;
|
||||
|
||||
printk(KERN_INFO "Xen version %d.%d.\n", xen_major, xen_minor);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@ void xen_arch_hvm_post_suspend(int suspend_cancelled)
|
||||
{
|
||||
#ifdef CONFIG_XEN_PVHVM
|
||||
int cpu;
|
||||
xen_hvm_resume_shared_info();
|
||||
xen_hvm_init_shared_info();
|
||||
xen_callback_vector();
|
||||
xen_unplug_emulated_devices();
|
||||
if (xen_feature(XENFEAT_hvm_safe_pvclock)) {
|
||||
|
||||
@@ -89,11 +89,11 @@ ENTRY(xen_iret)
|
||||
*/
|
||||
#ifdef CONFIG_SMP
|
||||
GET_THREAD_INFO(%eax)
|
||||
movl TI_cpu(%eax), %eax
|
||||
movl __per_cpu_offset(,%eax,4), %eax
|
||||
mov xen_vcpu(%eax), %eax
|
||||
movl %ss:TI_cpu(%eax), %eax
|
||||
movl %ss:__per_cpu_offset(,%eax,4), %eax
|
||||
mov %ss:xen_vcpu(%eax), %eax
|
||||
#else
|
||||
movl xen_vcpu, %eax
|
||||
movl %ss:xen_vcpu, %eax
|
||||
#endif
|
||||
|
||||
/* check IF state we're restoring */
|
||||
@@ -106,11 +106,11 @@ ENTRY(xen_iret)
|
||||
* resuming the code, so we don't have to be worried about
|
||||
* being preempted to another CPU.
|
||||
*/
|
||||
setz XEN_vcpu_info_mask(%eax)
|
||||
setz %ss:XEN_vcpu_info_mask(%eax)
|
||||
xen_iret_start_crit:
|
||||
|
||||
/* check for unmasked and pending */
|
||||
cmpw $0x0001, XEN_vcpu_info_pending(%eax)
|
||||
cmpw $0x0001, %ss:XEN_vcpu_info_pending(%eax)
|
||||
|
||||
/*
|
||||
* If there's something pending, mask events again so we can
|
||||
@@ -118,7 +118,7 @@ xen_iret_start_crit:
|
||||
* touch XEN_vcpu_info_mask.
|
||||
*/
|
||||
jne 1f
|
||||
movb $1, XEN_vcpu_info_mask(%eax)
|
||||
movb $1, %ss:XEN_vcpu_info_mask(%eax)
|
||||
|
||||
1: popl %eax
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ void xen_enable_syscall(void);
|
||||
void xen_vcpu_restore(void);
|
||||
|
||||
void xen_callback_vector(void);
|
||||
void xen_hvm_resume_shared_info(void);
|
||||
void xen_hvm_init_shared_info(void);
|
||||
void xen_unplug_emulated_devices(void);
|
||||
|
||||
void __init xen_build_dynamic_phys_to_machine(void);
|
||||
|
||||
@@ -461,7 +461,7 @@ static int generic_request(struct vdc_port *port, u8 op, void *buf, int len)
|
||||
int op_len, err;
|
||||
void *req_buf;
|
||||
|
||||
if (!(((u64)1 << ((u64)op - 1)) & port->operations))
|
||||
if (!(((u64)1 << (u64)op) & port->operations))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
switch (op) {
|
||||
|
||||
@@ -73,8 +73,11 @@ _nouveau_falcon_init(struct nouveau_object *object)
|
||||
nv_debug(falcon, "data limit: %d\n", falcon->data.limit);
|
||||
|
||||
/* wait for 'uc halted' to be signalled before continuing */
|
||||
if (falcon->secret) {
|
||||
nv_wait(falcon, 0x008, 0x00000010, 0x00000010);
|
||||
if (falcon->secret && falcon->version < 4) {
|
||||
if (!falcon->version)
|
||||
nv_wait(falcon, 0x008, 0x00000010, 0x00000010);
|
||||
else
|
||||
nv_wait(falcon, 0x180, 0x80000000, 0);
|
||||
nv_wo32(falcon, 0x004, 0x00000010);
|
||||
}
|
||||
|
||||
|
||||
@@ -99,7 +99,7 @@ nouveau_subdev_create_(struct nouveau_object *parent,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
mutex_init(&subdev->mutex);
|
||||
__mutex_init(&subdev->mutex, subname, &oclass->lock_class_key);
|
||||
subdev->name = subname;
|
||||
|
||||
if (parent) {
|
||||
|
||||
@@ -50,10 +50,13 @@ int nouveau_object_fini(struct nouveau_object *, bool suspend);
|
||||
|
||||
extern struct nouveau_ofuncs nouveau_object_ofuncs;
|
||||
|
||||
/* Don't allocate dynamically, because lockdep needs lock_class_keys to be in
|
||||
* ".data". */
|
||||
struct nouveau_oclass {
|
||||
u32 handle;
|
||||
struct nouveau_ofuncs *ofuncs;
|
||||
struct nouveau_omthds *omthds;
|
||||
struct nouveau_ofuncs * const ofuncs;
|
||||
struct nouveau_omthds * const omthds;
|
||||
struct lock_class_key lock_class_key;
|
||||
};
|
||||
|
||||
#define nv_oclass(o) nv_object(o)->oclass
|
||||
|
||||
@@ -86,8 +86,8 @@ nouveau_fb_preinit(struct nouveau_fb *pfb)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (!nouveau_mm_initialised(&pfb->tags) && tags) {
|
||||
ret = nouveau_mm_init(&pfb->tags, 0, ++tags, 1);
|
||||
if (!nouveau_mm_initialised(&pfb->tags)) {
|
||||
ret = nouveau_mm_init(&pfb->tags, 0, tags ? ++tags : 0, 1);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -99,7 +99,7 @@ nv50_fb_vram_init(struct nouveau_fb *pfb)
|
||||
struct nouveau_bios *bios = nouveau_bios(device);
|
||||
const u32 rsvd_head = ( 256 * 1024) >> 12; /* vga memory */
|
||||
const u32 rsvd_tail = (1024 * 1024) >> 12; /* vbios etc */
|
||||
u32 size;
|
||||
u32 size, tags = 0;
|
||||
int ret;
|
||||
|
||||
pfb->ram.size = nv_rd32(pfb, 0x10020c);
|
||||
@@ -140,10 +140,11 @@ nv50_fb_vram_init(struct nouveau_fb *pfb)
|
||||
return ret;
|
||||
|
||||
pfb->ram.ranks = (nv_rd32(pfb, 0x100200) & 0x4) ? 2 : 1;
|
||||
tags = nv_rd32(pfb, 0x100320);
|
||||
break;
|
||||
}
|
||||
|
||||
return nv_rd32(pfb, 0x100320);
|
||||
return tags;
|
||||
}
|
||||
|
||||
static int
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
*/
|
||||
|
||||
#include <core/engine.h>
|
||||
#include <linux/swiotlb.h>
|
||||
|
||||
#include <subdev/fb.h>
|
||||
#include <subdev/vm.h>
|
||||
|
||||
@@ -245,6 +245,8 @@ static int nouveau_drm_probe(struct pci_dev *pdev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct lock_class_key drm_client_lock_class_key;
|
||||
|
||||
static int
|
||||
nouveau_drm_load(struct drm_device *dev, unsigned long flags)
|
||||
{
|
||||
@@ -256,6 +258,7 @@ nouveau_drm_load(struct drm_device *dev, unsigned long flags)
|
||||
ret = nouveau_cli_create(pdev, "DRM", sizeof(*drm), (void**)&drm);
|
||||
if (ret)
|
||||
return ret;
|
||||
lockdep_set_class(&drm->client.mutex, &drm_client_lock_class_key);
|
||||
|
||||
dev->dev_private = drm;
|
||||
drm->dev = dev;
|
||||
|
||||
@@ -2909,14 +2909,14 @@ int evergreen_dma_cs_parse(struct radeon_cs_parser *p)
|
||||
return -EINVAL;
|
||||
}
|
||||
if (tiled) {
|
||||
dst_offset = ib[idx+1];
|
||||
dst_offset = radeon_get_ib_value(p, idx+1);
|
||||
dst_offset <<= 8;
|
||||
|
||||
ib[idx+1] += (u32)(dst_reloc->lobj.gpu_offset >> 8);
|
||||
p->idx += count + 7;
|
||||
} else {
|
||||
dst_offset = ib[idx+1];
|
||||
dst_offset |= ((u64)(ib[idx+2] & 0xff)) << 32;
|
||||
dst_offset = radeon_get_ib_value(p, idx+1);
|
||||
dst_offset |= ((u64)(radeon_get_ib_value(p, idx+2) & 0xff)) << 32;
|
||||
|
||||
ib[idx+1] += (u32)(dst_reloc->lobj.gpu_offset & 0xfffffffc);
|
||||
ib[idx+2] += upper_32_bits(dst_reloc->lobj.gpu_offset) & 0xff;
|
||||
@@ -2954,12 +2954,12 @@ int evergreen_dma_cs_parse(struct radeon_cs_parser *p)
|
||||
DRM_ERROR("bad L2T, frame to fields DMA_PACKET_COPY\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
dst_offset = ib[idx+1];
|
||||
dst_offset = radeon_get_ib_value(p, idx+1);
|
||||
dst_offset <<= 8;
|
||||
dst2_offset = ib[idx+2];
|
||||
dst2_offset = radeon_get_ib_value(p, idx+2);
|
||||
dst2_offset <<= 8;
|
||||
src_offset = ib[idx+8];
|
||||
src_offset |= ((u64)(ib[idx+9] & 0xff)) << 32;
|
||||
src_offset = radeon_get_ib_value(p, idx+8);
|
||||
src_offset |= ((u64)(radeon_get_ib_value(p, idx+9) & 0xff)) << 32;
|
||||
if ((src_offset + (count * 4)) > radeon_bo_size(src_reloc->robj)) {
|
||||
dev_warn(p->dev, "DMA L2T, frame to fields src buffer too small (%llu %lu)\n",
|
||||
src_offset + (count * 4), radeon_bo_size(src_reloc->robj));
|
||||
@@ -3014,12 +3014,12 @@ int evergreen_dma_cs_parse(struct radeon_cs_parser *p)
|
||||
DRM_ERROR("bad L2T, broadcast DMA_PACKET_COPY\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
dst_offset = ib[idx+1];
|
||||
dst_offset = radeon_get_ib_value(p, idx+1);
|
||||
dst_offset <<= 8;
|
||||
dst2_offset = ib[idx+2];
|
||||
dst2_offset = radeon_get_ib_value(p, idx+2);
|
||||
dst2_offset <<= 8;
|
||||
src_offset = ib[idx+8];
|
||||
src_offset |= ((u64)(ib[idx+9] & 0xff)) << 32;
|
||||
src_offset = radeon_get_ib_value(p, idx+8);
|
||||
src_offset |= ((u64)(radeon_get_ib_value(p, idx+9) & 0xff)) << 32;
|
||||
if ((src_offset + (count * 4)) > radeon_bo_size(src_reloc->robj)) {
|
||||
dev_warn(p->dev, "DMA L2T, broadcast src buffer too small (%llu %lu)\n",
|
||||
src_offset + (count * 4), radeon_bo_size(src_reloc->robj));
|
||||
@@ -3046,22 +3046,22 @@ int evergreen_dma_cs_parse(struct radeon_cs_parser *p)
|
||||
/* detile bit */
|
||||
if (idx_value & (1 << 31)) {
|
||||
/* tiled src, linear dst */
|
||||
src_offset = ib[idx+1];
|
||||
src_offset = radeon_get_ib_value(p, idx+1);
|
||||
src_offset <<= 8;
|
||||
ib[idx+1] += (u32)(src_reloc->lobj.gpu_offset >> 8);
|
||||
|
||||
dst_offset = ib[idx+7];
|
||||
dst_offset |= ((u64)(ib[idx+8] & 0xff)) << 32;
|
||||
dst_offset = radeon_get_ib_value(p, idx+7);
|
||||
dst_offset |= ((u64)(radeon_get_ib_value(p, idx+8) & 0xff)) << 32;
|
||||
ib[idx+7] += (u32)(dst_reloc->lobj.gpu_offset & 0xfffffffc);
|
||||
ib[idx+8] += upper_32_bits(dst_reloc->lobj.gpu_offset) & 0xff;
|
||||
} else {
|
||||
/* linear src, tiled dst */
|
||||
src_offset = ib[idx+7];
|
||||
src_offset |= ((u64)(ib[idx+8] & 0xff)) << 32;
|
||||
src_offset = radeon_get_ib_value(p, idx+7);
|
||||
src_offset |= ((u64)(radeon_get_ib_value(p, idx+8) & 0xff)) << 32;
|
||||
ib[idx+7] += (u32)(src_reloc->lobj.gpu_offset & 0xfffffffc);
|
||||
ib[idx+8] += upper_32_bits(src_reloc->lobj.gpu_offset) & 0xff;
|
||||
|
||||
dst_offset = ib[idx+1];
|
||||
dst_offset = radeon_get_ib_value(p, idx+1);
|
||||
dst_offset <<= 8;
|
||||
ib[idx+1] += (u32)(dst_reloc->lobj.gpu_offset >> 8);
|
||||
}
|
||||
@@ -3098,12 +3098,12 @@ int evergreen_dma_cs_parse(struct radeon_cs_parser *p)
|
||||
DRM_ERROR("bad L2T, broadcast DMA_PACKET_COPY\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
dst_offset = ib[idx+1];
|
||||
dst_offset = radeon_get_ib_value(p, idx+1);
|
||||
dst_offset <<= 8;
|
||||
dst2_offset = ib[idx+2];
|
||||
dst2_offset = radeon_get_ib_value(p, idx+2);
|
||||
dst2_offset <<= 8;
|
||||
src_offset = ib[idx+8];
|
||||
src_offset |= ((u64)(ib[idx+9] & 0xff)) << 32;
|
||||
src_offset = radeon_get_ib_value(p, idx+8);
|
||||
src_offset |= ((u64)(radeon_get_ib_value(p, idx+9) & 0xff)) << 32;
|
||||
if ((src_offset + (count * 4)) > radeon_bo_size(src_reloc->robj)) {
|
||||
dev_warn(p->dev, "DMA L2T, broadcast src buffer too small (%llu %lu)\n",
|
||||
src_offset + (count * 4), radeon_bo_size(src_reloc->robj));
|
||||
@@ -3135,22 +3135,22 @@ int evergreen_dma_cs_parse(struct radeon_cs_parser *p)
|
||||
/* detile bit */
|
||||
if (idx_value & (1 << 31)) {
|
||||
/* tiled src, linear dst */
|
||||
src_offset = ib[idx+1];
|
||||
src_offset = radeon_get_ib_value(p, idx+1);
|
||||
src_offset <<= 8;
|
||||
ib[idx+1] += (u32)(src_reloc->lobj.gpu_offset >> 8);
|
||||
|
||||
dst_offset = ib[idx+7];
|
||||
dst_offset |= ((u64)(ib[idx+8] & 0xff)) << 32;
|
||||
dst_offset = radeon_get_ib_value(p, idx+7);
|
||||
dst_offset |= ((u64)(radeon_get_ib_value(p, idx+8) & 0xff)) << 32;
|
||||
ib[idx+7] += (u32)(dst_reloc->lobj.gpu_offset & 0xfffffffc);
|
||||
ib[idx+8] += upper_32_bits(dst_reloc->lobj.gpu_offset) & 0xff;
|
||||
} else {
|
||||
/* linear src, tiled dst */
|
||||
src_offset = ib[idx+7];
|
||||
src_offset |= ((u64)(ib[idx+8] & 0xff)) << 32;
|
||||
src_offset = radeon_get_ib_value(p, idx+7);
|
||||
src_offset |= ((u64)(radeon_get_ib_value(p, idx+8) & 0xff)) << 32;
|
||||
ib[idx+7] += (u32)(src_reloc->lobj.gpu_offset & 0xfffffffc);
|
||||
ib[idx+8] += upper_32_bits(src_reloc->lobj.gpu_offset) & 0xff;
|
||||
|
||||
dst_offset = ib[idx+1];
|
||||
dst_offset = radeon_get_ib_value(p, idx+1);
|
||||
dst_offset <<= 8;
|
||||
ib[idx+1] += (u32)(dst_reloc->lobj.gpu_offset >> 8);
|
||||
}
|
||||
@@ -3176,10 +3176,10 @@ int evergreen_dma_cs_parse(struct radeon_cs_parser *p)
|
||||
switch (misc) {
|
||||
case 0:
|
||||
/* L2L, byte */
|
||||
src_offset = ib[idx+2];
|
||||
src_offset |= ((u64)(ib[idx+4] & 0xff)) << 32;
|
||||
dst_offset = ib[idx+1];
|
||||
dst_offset |= ((u64)(ib[idx+3] & 0xff)) << 32;
|
||||
src_offset = radeon_get_ib_value(p, idx+2);
|
||||
src_offset |= ((u64)(radeon_get_ib_value(p, idx+4) & 0xff)) << 32;
|
||||
dst_offset = radeon_get_ib_value(p, idx+1);
|
||||
dst_offset |= ((u64)(radeon_get_ib_value(p, idx+3) & 0xff)) << 32;
|
||||
if ((src_offset + count) > radeon_bo_size(src_reloc->robj)) {
|
||||
dev_warn(p->dev, "DMA L2L, byte src buffer too small (%llu %lu)\n",
|
||||
src_offset + count, radeon_bo_size(src_reloc->robj));
|
||||
@@ -3216,12 +3216,12 @@ int evergreen_dma_cs_parse(struct radeon_cs_parser *p)
|
||||
DRM_ERROR("bad L2L, dw, broadcast DMA_PACKET_COPY\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
dst_offset = ib[idx+1];
|
||||
dst_offset |= ((u64)(ib[idx+4] & 0xff)) << 32;
|
||||
dst2_offset = ib[idx+2];
|
||||
dst2_offset |= ((u64)(ib[idx+5] & 0xff)) << 32;
|
||||
src_offset = ib[idx+3];
|
||||
src_offset |= ((u64)(ib[idx+6] & 0xff)) << 32;
|
||||
dst_offset = radeon_get_ib_value(p, idx+1);
|
||||
dst_offset |= ((u64)(radeon_get_ib_value(p, idx+4) & 0xff)) << 32;
|
||||
dst2_offset = radeon_get_ib_value(p, idx+2);
|
||||
dst2_offset |= ((u64)(radeon_get_ib_value(p, idx+5) & 0xff)) << 32;
|
||||
src_offset = radeon_get_ib_value(p, idx+3);
|
||||
src_offset |= ((u64)(radeon_get_ib_value(p, idx+6) & 0xff)) << 32;
|
||||
if ((src_offset + (count * 4)) > radeon_bo_size(src_reloc->robj)) {
|
||||
dev_warn(p->dev, "DMA L2L, dw, broadcast src buffer too small (%llu %lu)\n",
|
||||
src_offset + (count * 4), radeon_bo_size(src_reloc->robj));
|
||||
@@ -3251,10 +3251,10 @@ int evergreen_dma_cs_parse(struct radeon_cs_parser *p)
|
||||
}
|
||||
} else {
|
||||
/* L2L, dw */
|
||||
src_offset = ib[idx+2];
|
||||
src_offset |= ((u64)(ib[idx+4] & 0xff)) << 32;
|
||||
dst_offset = ib[idx+1];
|
||||
dst_offset |= ((u64)(ib[idx+3] & 0xff)) << 32;
|
||||
src_offset = radeon_get_ib_value(p, idx+2);
|
||||
src_offset |= ((u64)(radeon_get_ib_value(p, idx+4) & 0xff)) << 32;
|
||||
dst_offset = radeon_get_ib_value(p, idx+1);
|
||||
dst_offset |= ((u64)(radeon_get_ib_value(p, idx+3) & 0xff)) << 32;
|
||||
if ((src_offset + (count * 4)) > radeon_bo_size(src_reloc->robj)) {
|
||||
dev_warn(p->dev, "DMA L2L, dw src buffer too small (%llu %lu)\n",
|
||||
src_offset + (count * 4), radeon_bo_size(src_reloc->robj));
|
||||
@@ -3279,8 +3279,8 @@ int evergreen_dma_cs_parse(struct radeon_cs_parser *p)
|
||||
DRM_ERROR("bad DMA_PACKET_CONSTANT_FILL\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
dst_offset = ib[idx+1];
|
||||
dst_offset |= ((u64)(ib[idx+3] & 0x00ff0000)) << 16;
|
||||
dst_offset = radeon_get_ib_value(p, idx+1);
|
||||
dst_offset |= ((u64)(radeon_get_ib_value(p, idx+3) & 0x00ff0000)) << 16;
|
||||
if ((dst_offset + (count * 4)) > radeon_bo_size(dst_reloc->robj)) {
|
||||
dev_warn(p->dev, "DMA constant fill buffer too small (%llu %lu)\n",
|
||||
dst_offset, radeon_bo_size(dst_reloc->robj));
|
||||
|
||||
@@ -2623,14 +2623,14 @@ int r600_dma_cs_parse(struct radeon_cs_parser *p)
|
||||
return -EINVAL;
|
||||
}
|
||||
if (tiled) {
|
||||
dst_offset = ib[idx+1];
|
||||
dst_offset = radeon_get_ib_value(p, idx+1);
|
||||
dst_offset <<= 8;
|
||||
|
||||
ib[idx+1] += (u32)(dst_reloc->lobj.gpu_offset >> 8);
|
||||
p->idx += count + 5;
|
||||
} else {
|
||||
dst_offset = ib[idx+1];
|
||||
dst_offset |= ((u64)(ib[idx+2] & 0xff)) << 32;
|
||||
dst_offset = radeon_get_ib_value(p, idx+1);
|
||||
dst_offset |= ((u64)(radeon_get_ib_value(p, idx+2) & 0xff)) << 32;
|
||||
|
||||
ib[idx+1] += (u32)(dst_reloc->lobj.gpu_offset & 0xfffffffc);
|
||||
ib[idx+2] += upper_32_bits(dst_reloc->lobj.gpu_offset) & 0xff;
|
||||
@@ -2658,32 +2658,32 @@ int r600_dma_cs_parse(struct radeon_cs_parser *p)
|
||||
/* detile bit */
|
||||
if (idx_value & (1 << 31)) {
|
||||
/* tiled src, linear dst */
|
||||
src_offset = ib[idx+1];
|
||||
src_offset = radeon_get_ib_value(p, idx+1);
|
||||
src_offset <<= 8;
|
||||
ib[idx+1] += (u32)(src_reloc->lobj.gpu_offset >> 8);
|
||||
|
||||
dst_offset = ib[idx+5];
|
||||
dst_offset |= ((u64)(ib[idx+6] & 0xff)) << 32;
|
||||
dst_offset = radeon_get_ib_value(p, idx+5);
|
||||
dst_offset |= ((u64)(radeon_get_ib_value(p, idx+6) & 0xff)) << 32;
|
||||
ib[idx+5] += (u32)(dst_reloc->lobj.gpu_offset & 0xfffffffc);
|
||||
ib[idx+6] += upper_32_bits(dst_reloc->lobj.gpu_offset) & 0xff;
|
||||
} else {
|
||||
/* linear src, tiled dst */
|
||||
src_offset = ib[idx+5];
|
||||
src_offset |= ((u64)(ib[idx+6] & 0xff)) << 32;
|
||||
src_offset = radeon_get_ib_value(p, idx+5);
|
||||
src_offset |= ((u64)(radeon_get_ib_value(p, idx+6) & 0xff)) << 32;
|
||||
ib[idx+5] += (u32)(src_reloc->lobj.gpu_offset & 0xfffffffc);
|
||||
ib[idx+6] += upper_32_bits(src_reloc->lobj.gpu_offset) & 0xff;
|
||||
|
||||
dst_offset = ib[idx+1];
|
||||
dst_offset = radeon_get_ib_value(p, idx+1);
|
||||
dst_offset <<= 8;
|
||||
ib[idx+1] += (u32)(dst_reloc->lobj.gpu_offset >> 8);
|
||||
}
|
||||
p->idx += 7;
|
||||
} else {
|
||||
if (p->family >= CHIP_RV770) {
|
||||
src_offset = ib[idx+2];
|
||||
src_offset |= ((u64)(ib[idx+4] & 0xff)) << 32;
|
||||
dst_offset = ib[idx+1];
|
||||
dst_offset |= ((u64)(ib[idx+3] & 0xff)) << 32;
|
||||
src_offset = radeon_get_ib_value(p, idx+2);
|
||||
src_offset |= ((u64)(radeon_get_ib_value(p, idx+4) & 0xff)) << 32;
|
||||
dst_offset = radeon_get_ib_value(p, idx+1);
|
||||
dst_offset |= ((u64)(radeon_get_ib_value(p, idx+3) & 0xff)) << 32;
|
||||
|
||||
ib[idx+1] += (u32)(dst_reloc->lobj.gpu_offset & 0xfffffffc);
|
||||
ib[idx+2] += (u32)(src_reloc->lobj.gpu_offset & 0xfffffffc);
|
||||
@@ -2691,10 +2691,10 @@ int r600_dma_cs_parse(struct radeon_cs_parser *p)
|
||||
ib[idx+4] += upper_32_bits(src_reloc->lobj.gpu_offset) & 0xff;
|
||||
p->idx += 5;
|
||||
} else {
|
||||
src_offset = ib[idx+2];
|
||||
src_offset |= ((u64)(ib[idx+3] & 0xff)) << 32;
|
||||
dst_offset = ib[idx+1];
|
||||
dst_offset |= ((u64)(ib[idx+3] & 0xff0000)) << 16;
|
||||
src_offset = radeon_get_ib_value(p, idx+2);
|
||||
src_offset |= ((u64)(radeon_get_ib_value(p, idx+3) & 0xff)) << 32;
|
||||
dst_offset = radeon_get_ib_value(p, idx+1);
|
||||
dst_offset |= ((u64)(radeon_get_ib_value(p, idx+3) & 0xff0000)) << 16;
|
||||
|
||||
ib[idx+1] += (u32)(dst_reloc->lobj.gpu_offset & 0xfffffffc);
|
||||
ib[idx+2] += (u32)(src_reloc->lobj.gpu_offset & 0xfffffffc);
|
||||
@@ -2724,8 +2724,8 @@ int r600_dma_cs_parse(struct radeon_cs_parser *p)
|
||||
DRM_ERROR("bad DMA_PACKET_WRITE\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
dst_offset = ib[idx+1];
|
||||
dst_offset |= ((u64)(ib[idx+3] & 0x00ff0000)) << 16;
|
||||
dst_offset = radeon_get_ib_value(p, idx+1);
|
||||
dst_offset |= ((u64)(radeon_get_ib_value(p, idx+3) & 0x00ff0000)) << 16;
|
||||
if ((dst_offset + (count * 4)) > radeon_bo_size(dst_reloc->robj)) {
|
||||
dev_warn(p->dev, "DMA constant fill buffer too small (%llu %lu)\n",
|
||||
dst_offset + (count * 4), radeon_bo_size(dst_reloc->robj));
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
#include <drm/radeon_drm.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/swiotlb.h>
|
||||
#include "radeon_reg.h"
|
||||
#include "radeon.h"
|
||||
|
||||
|
||||
@@ -1785,12 +1785,13 @@ static void devm_input_device_release(struct device *dev, void *res)
|
||||
* its driver (or binding fails). Once managed input device is allocated,
|
||||
* it is ready to be set up and registered in the same fashion as regular
|
||||
* input device. There are no special devm_input_device_[un]register()
|
||||
* variants, regular ones work with both managed and unmanaged devices.
|
||||
* variants, regular ones work with both managed and unmanaged devices,
|
||||
* should you need them. In most cases however, managed input device need
|
||||
* not be explicitly unregistered or freed.
|
||||
*
|
||||
* NOTE: the owner device is set up as parent of input device and users
|
||||
* should not override it.
|
||||
*/
|
||||
|
||||
struct input_dev *devm_input_allocate_device(struct device *dev)
|
||||
{
|
||||
struct input_dev *input;
|
||||
@@ -2004,6 +2005,17 @@ static void devm_input_device_unregister(struct device *dev, void *res)
|
||||
* Once device has been successfully registered it can be unregistered
|
||||
* with input_unregister_device(); input_free_device() should not be
|
||||
* called in this case.
|
||||
*
|
||||
* Note that this function is also used to register managed input devices
|
||||
* (ones allocated with devm_input_allocate_device()). Such managed input
|
||||
* devices need not be explicitly unregistered or freed, their tear down
|
||||
* is controlled by the devres infrastructure. It is also worth noting
|
||||
* that tear down of managed input devices is internally a 2-step process:
|
||||
* registered managed input device is first unregistered, but stays in
|
||||
* memory and can still handle input_event() calls (although events will
|
||||
* not be delivered anywhere). The freeing of managed input device will
|
||||
* happen later, when devres stack is unwound to the point where device
|
||||
* allocation was made.
|
||||
*/
|
||||
int input_register_device(struct input_dev *dev)
|
||||
{
|
||||
|
||||
@@ -162,7 +162,7 @@ static unsigned int get_time_pit(void)
|
||||
#define GET_TIME(x) do { x = get_cycles(); } while (0)
|
||||
#define DELTA(x,y) ((y)-(x))
|
||||
#define TIME_NAME "PCC"
|
||||
#elif defined(CONFIG_MN10300)
|
||||
#elif defined(CONFIG_MN10300) || defined(CONFIG_TILE)
|
||||
#define GET_TIME(x) do { x = get_cycles(); } while (0)
|
||||
#define DELTA(x, y) ((x) - (y))
|
||||
#define TIME_NAME "TSC"
|
||||
|
||||
@@ -398,7 +398,7 @@ static irqreturn_t lm8323_irq(int irq, void *_lm)
|
||||
lm8323_configure(lm);
|
||||
}
|
||||
for (i = 0; i < LM8323_NUM_PWMS; i++) {
|
||||
if (ints & (1 << (INT_PWM1 + i))) {
|
||||
if (ints & (INT_PWM1 << i)) {
|
||||
dev_vdbg(&lm->client->dev,
|
||||
"pwm%d engine completed\n", i);
|
||||
pwm_done(&lm->pwm[i]);
|
||||
|
||||
@@ -553,10 +553,10 @@ static int wacom_set_device_mode(struct usb_interface *intf, int report_id, int
|
||||
if (!rep_data)
|
||||
return error;
|
||||
|
||||
rep_data[0] = report_id;
|
||||
rep_data[1] = mode;
|
||||
|
||||
do {
|
||||
rep_data[0] = report_id;
|
||||
rep_data[1] = mode;
|
||||
|
||||
error = wacom_set_report(intf, WAC_HID_FEATURE_REPORT,
|
||||
report_id, rep_data, length, 1);
|
||||
if (error >= 0)
|
||||
|
||||
@@ -1820,7 +1820,7 @@ static int dvb_frontend_ioctl(struct file *file,
|
||||
struct dvb_frontend *fe = dvbdev->priv;
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
struct dvb_frontend_private *fepriv = fe->frontend_priv;
|
||||
int err = -ENOTTY;
|
||||
int err = -EOPNOTSUPP;
|
||||
|
||||
dev_dbg(fe->dvb->device, "%s: (%d)\n", __func__, _IOC_NR(cmd));
|
||||
if (fepriv->exit != DVB_FE_NO_EXIT)
|
||||
@@ -1938,7 +1938,7 @@ static int dvb_frontend_ioctl_properties(struct file *file,
|
||||
}
|
||||
|
||||
} else
|
||||
err = -ENOTTY;
|
||||
err = -EOPNOTSUPP;
|
||||
|
||||
out:
|
||||
kfree(tvp);
|
||||
@@ -2071,7 +2071,7 @@ static int dvb_frontend_ioctl_legacy(struct file *file,
|
||||
struct dvb_frontend *fe = dvbdev->priv;
|
||||
struct dvb_frontend_private *fepriv = fe->frontend_priv;
|
||||
struct dtv_frontend_properties *c = &fe->dtv_property_cache;
|
||||
int err = -ENOTTY;
|
||||
int err = -EOPNOTSUPP;
|
||||
|
||||
switch (cmd) {
|
||||
case FE_GET_INFO: {
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
|
||||
#include "atl1c.h"
|
||||
|
||||
#define ATL1C_DRV_VERSION "1.0.1.0-NAPI"
|
||||
#define ATL1C_DRV_VERSION "1.0.1.1-NAPI"
|
||||
char atl1c_driver_name[] = "atl1c";
|
||||
char atl1c_driver_version[] = ATL1C_DRV_VERSION;
|
||||
|
||||
@@ -1652,6 +1652,7 @@ static int atl1c_alloc_rx_buffer(struct atl1c_adapter *adapter)
|
||||
u16 num_alloc = 0;
|
||||
u16 rfd_next_to_use, next_next;
|
||||
struct atl1c_rx_free_desc *rfd_desc;
|
||||
dma_addr_t mapping;
|
||||
|
||||
next_next = rfd_next_to_use = rfd_ring->next_to_use;
|
||||
if (++next_next == rfd_ring->count)
|
||||
@@ -1678,9 +1679,18 @@ static int atl1c_alloc_rx_buffer(struct atl1c_adapter *adapter)
|
||||
ATL1C_SET_BUFFER_STATE(buffer_info, ATL1C_BUFFER_BUSY);
|
||||
buffer_info->skb = skb;
|
||||
buffer_info->length = adapter->rx_buffer_len;
|
||||
buffer_info->dma = pci_map_single(pdev, vir_addr,
|
||||
mapping = pci_map_single(pdev, vir_addr,
|
||||
buffer_info->length,
|
||||
PCI_DMA_FROMDEVICE);
|
||||
if (unlikely(pci_dma_mapping_error(pdev, mapping))) {
|
||||
dev_kfree_skb(skb);
|
||||
buffer_info->skb = NULL;
|
||||
buffer_info->length = 0;
|
||||
ATL1C_SET_BUFFER_STATE(buffer_info, ATL1C_BUFFER_FREE);
|
||||
netif_warn(adapter, rx_err, adapter->netdev, "RX pci_map_single failed");
|
||||
break;
|
||||
}
|
||||
buffer_info->dma = mapping;
|
||||
ATL1C_SET_PCIMAP_TYPE(buffer_info, ATL1C_PCIMAP_SINGLE,
|
||||
ATL1C_PCIMAP_FROMDEVICE);
|
||||
rfd_desc->buffer_addr = cpu_to_le64(buffer_info->dma);
|
||||
@@ -2015,7 +2025,29 @@ check_sum:
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void atl1c_tx_map(struct atl1c_adapter *adapter,
|
||||
static void atl1c_tx_rollback(struct atl1c_adapter *adpt,
|
||||
struct atl1c_tpd_desc *first_tpd,
|
||||
enum atl1c_trans_queue type)
|
||||
{
|
||||
struct atl1c_tpd_ring *tpd_ring = &adpt->tpd_ring[type];
|
||||
struct atl1c_buffer *buffer_info;
|
||||
struct atl1c_tpd_desc *tpd;
|
||||
u16 first_index, index;
|
||||
|
||||
first_index = first_tpd - (struct atl1c_tpd_desc *)tpd_ring->desc;
|
||||
index = first_index;
|
||||
while (index != tpd_ring->next_to_use) {
|
||||
tpd = ATL1C_TPD_DESC(tpd_ring, index);
|
||||
buffer_info = &tpd_ring->buffer_info[index];
|
||||
atl1c_clean_buffer(adpt->pdev, buffer_info, 0);
|
||||
memset(tpd, 0, sizeof(struct atl1c_tpd_desc));
|
||||
if (++index == tpd_ring->count)
|
||||
index = 0;
|
||||
}
|
||||
tpd_ring->next_to_use = first_index;
|
||||
}
|
||||
|
||||
static int atl1c_tx_map(struct atl1c_adapter *adapter,
|
||||
struct sk_buff *skb, struct atl1c_tpd_desc *tpd,
|
||||
enum atl1c_trans_queue type)
|
||||
{
|
||||
@@ -2040,7 +2072,10 @@ static void atl1c_tx_map(struct atl1c_adapter *adapter,
|
||||
buffer_info->length = map_len;
|
||||
buffer_info->dma = pci_map_single(adapter->pdev,
|
||||
skb->data, hdr_len, PCI_DMA_TODEVICE);
|
||||
ATL1C_SET_BUFFER_STATE(buffer_info, ATL1C_BUFFER_BUSY);
|
||||
if (unlikely(pci_dma_mapping_error(adapter->pdev,
|
||||
buffer_info->dma)))
|
||||
goto err_dma;
|
||||
|
||||
ATL1C_SET_PCIMAP_TYPE(buffer_info, ATL1C_PCIMAP_SINGLE,
|
||||
ATL1C_PCIMAP_TODEVICE);
|
||||
mapped_len += map_len;
|
||||
@@ -2062,6 +2097,10 @@ static void atl1c_tx_map(struct atl1c_adapter *adapter,
|
||||
buffer_info->dma =
|
||||
pci_map_single(adapter->pdev, skb->data + mapped_len,
|
||||
buffer_info->length, PCI_DMA_TODEVICE);
|
||||
if (unlikely(pci_dma_mapping_error(adapter->pdev,
|
||||
buffer_info->dma)))
|
||||
goto err_dma;
|
||||
|
||||
ATL1C_SET_BUFFER_STATE(buffer_info, ATL1C_BUFFER_BUSY);
|
||||
ATL1C_SET_PCIMAP_TYPE(buffer_info, ATL1C_PCIMAP_SINGLE,
|
||||
ATL1C_PCIMAP_TODEVICE);
|
||||
@@ -2083,6 +2122,9 @@ static void atl1c_tx_map(struct atl1c_adapter *adapter,
|
||||
frag, 0,
|
||||
buffer_info->length,
|
||||
DMA_TO_DEVICE);
|
||||
if (dma_mapping_error(&adapter->pdev->dev, buffer_info->dma))
|
||||
goto err_dma;
|
||||
|
||||
ATL1C_SET_BUFFER_STATE(buffer_info, ATL1C_BUFFER_BUSY);
|
||||
ATL1C_SET_PCIMAP_TYPE(buffer_info, ATL1C_PCIMAP_PAGE,
|
||||
ATL1C_PCIMAP_TODEVICE);
|
||||
@@ -2095,6 +2137,13 @@ static void atl1c_tx_map(struct atl1c_adapter *adapter,
|
||||
/* The last buffer info contain the skb address,
|
||||
so it will be free after unmap */
|
||||
buffer_info->skb = skb;
|
||||
|
||||
return 0;
|
||||
|
||||
err_dma:
|
||||
buffer_info->dma = 0;
|
||||
buffer_info->length = 0;
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void atl1c_tx_queue(struct atl1c_adapter *adapter, struct sk_buff *skb,
|
||||
@@ -2157,10 +2206,18 @@ static netdev_tx_t atl1c_xmit_frame(struct sk_buff *skb,
|
||||
if (skb_network_offset(skb) != ETH_HLEN)
|
||||
tpd->word1 |= 1 << TPD_ETH_TYPE_SHIFT; /* Ethernet frame */
|
||||
|
||||
atl1c_tx_map(adapter, skb, tpd, type);
|
||||
atl1c_tx_queue(adapter, skb, tpd, type);
|
||||
if (atl1c_tx_map(adapter, skb, tpd, type) < 0) {
|
||||
netif_info(adapter, tx_done, adapter->netdev,
|
||||
"tx-skb droppted due to dma error\n");
|
||||
/* roll back tpd/buffer */
|
||||
atl1c_tx_rollback(adapter, tpd, type);
|
||||
spin_unlock_irqrestore(&adapter->tx_lock, flags);
|
||||
dev_kfree_skb(skb);
|
||||
} else {
|
||||
atl1c_tx_queue(adapter, skb, tpd, type);
|
||||
spin_unlock_irqrestore(&adapter->tx_lock, flags);
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&adapter->tx_lock, flags);
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
|
||||
@@ -504,13 +504,11 @@ static int bnx2x_fill_frag_skb(struct bnx2x *bp, struct bnx2x_fastpath *fp,
|
||||
skb_shinfo(skb)->gso_size = bnx2x_set_lro_mss(bp,
|
||||
tpa_info->parsing_flags, len_on_bd);
|
||||
|
||||
/* set for GRO */
|
||||
if (fp->mode == TPA_MODE_GRO)
|
||||
skb_shinfo(skb)->gso_type =
|
||||
(GET_FLAG(tpa_info->parsing_flags,
|
||||
PARSING_FLAGS_OVER_ETHERNET_PROTOCOL) ==
|
||||
PRS_FLAG_OVERETH_IPV6) ?
|
||||
SKB_GSO_TCPV6 : SKB_GSO_TCPV4;
|
||||
skb_shinfo(skb)->gso_type =
|
||||
(GET_FLAG(tpa_info->parsing_flags,
|
||||
PARSING_FLAGS_OVER_ETHERNET_PROTOCOL) ==
|
||||
PRS_FLAG_OVERETH_IPV6) ?
|
||||
SKB_GSO_TCPV6 : SKB_GSO_TCPV4;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -693,6 +693,11 @@ static int macb_poll(struct napi_struct *napi, int budget)
|
||||
* get notified when new packets arrive.
|
||||
*/
|
||||
macb_writel(bp, IER, MACB_RX_INT_FLAGS);
|
||||
|
||||
/* Packets received while interrupts were disabled */
|
||||
status = macb_readl(bp, RSR);
|
||||
if (unlikely(status))
|
||||
napi_reschedule(napi);
|
||||
}
|
||||
|
||||
/* TODO: Handle errors */
|
||||
|
||||
@@ -1401,6 +1401,7 @@ static void ixgbe_set_rsc_gso_size(struct ixgbe_ring *ring,
|
||||
/* set gso_size to avoid messing up TCP MSS */
|
||||
skb_shinfo(skb)->gso_size = DIV_ROUND_UP((skb->len - hdr_len),
|
||||
IXGBE_CB(skb)->append_cnt);
|
||||
skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4;
|
||||
}
|
||||
|
||||
static void ixgbe_update_rsc_stats(struct ixgbe_ring *rx_ring,
|
||||
|
||||
@@ -986,8 +986,13 @@ qlcnic_process_lro(struct qlcnic_adapter *adapter,
|
||||
th->seq = htonl(seq_number);
|
||||
length = skb->len;
|
||||
|
||||
if (adapter->flags & QLCNIC_FW_LRO_MSS_CAP)
|
||||
if (adapter->flags & QLCNIC_FW_LRO_MSS_CAP) {
|
||||
skb_shinfo(skb)->gso_size = qlcnic_get_lro_sts_mss(sts_data1);
|
||||
if (skb->protocol == htons(ETH_P_IPV6))
|
||||
skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6;
|
||||
else
|
||||
skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4;
|
||||
}
|
||||
|
||||
if (vid != 0xffff)
|
||||
__vlan_hwaccel_put_tag(skb, vid);
|
||||
|
||||
@@ -450,7 +450,6 @@ enum rtl8168_registers {
|
||||
#define PWM_EN (1 << 22)
|
||||
#define RXDV_GATED_EN (1 << 19)
|
||||
#define EARLY_TALLY_EN (1 << 16)
|
||||
#define FORCE_CLK (1 << 15) /* force clock request */
|
||||
};
|
||||
|
||||
enum rtl_register_content {
|
||||
@@ -514,7 +513,6 @@ enum rtl_register_content {
|
||||
PMEnable = (1 << 0), /* Power Management Enable */
|
||||
|
||||
/* Config2 register p. 25 */
|
||||
ClkReqEn = (1 << 7), /* Clock Request Enable */
|
||||
MSIEnable = (1 << 5), /* 8169 only. Reserved in the 8168. */
|
||||
PCI_Clock_66MHz = 0x01,
|
||||
PCI_Clock_33MHz = 0x00,
|
||||
@@ -535,7 +533,6 @@ enum rtl_register_content {
|
||||
Spi_en = (1 << 3),
|
||||
LanWake = (1 << 1), /* LanWake enable/disable */
|
||||
PMEStatus = (1 << 0), /* PME status can be reset by PCI RST# */
|
||||
ASPM_en = (1 << 0), /* ASPM enable */
|
||||
|
||||
/* TBICSR p.28 */
|
||||
TBIReset = 0x80000000,
|
||||
@@ -684,7 +681,6 @@ enum features {
|
||||
RTL_FEATURE_WOL = (1 << 0),
|
||||
RTL_FEATURE_MSI = (1 << 1),
|
||||
RTL_FEATURE_GMII = (1 << 2),
|
||||
RTL_FEATURE_FW_LOADED = (1 << 3),
|
||||
};
|
||||
|
||||
struct rtl8169_counters {
|
||||
@@ -2389,10 +2385,8 @@ static void rtl_apply_firmware(struct rtl8169_private *tp)
|
||||
struct rtl_fw *rtl_fw = tp->rtl_fw;
|
||||
|
||||
/* TODO: release firmware once rtl_phy_write_fw signals failures. */
|
||||
if (!IS_ERR_OR_NULL(rtl_fw)) {
|
||||
if (!IS_ERR_OR_NULL(rtl_fw))
|
||||
rtl_phy_write_fw(tp, rtl_fw);
|
||||
tp->features |= RTL_FEATURE_FW_LOADED;
|
||||
}
|
||||
}
|
||||
|
||||
static void rtl_apply_firmware_cond(struct rtl8169_private *tp, u8 reg, u16 val)
|
||||
@@ -2403,31 +2397,6 @@ static void rtl_apply_firmware_cond(struct rtl8169_private *tp, u8 reg, u16 val)
|
||||
rtl_apply_firmware(tp);
|
||||
}
|
||||
|
||||
static void r810x_aldps_disable(struct rtl8169_private *tp)
|
||||
{
|
||||
rtl_writephy(tp, 0x1f, 0x0000);
|
||||
rtl_writephy(tp, 0x18, 0x0310);
|
||||
msleep(100);
|
||||
}
|
||||
|
||||
static void r810x_aldps_enable(struct rtl8169_private *tp)
|
||||
{
|
||||
if (!(tp->features & RTL_FEATURE_FW_LOADED))
|
||||
return;
|
||||
|
||||
rtl_writephy(tp, 0x1f, 0x0000);
|
||||
rtl_writephy(tp, 0x18, 0x8310);
|
||||
}
|
||||
|
||||
static void r8168_aldps_enable_1(struct rtl8169_private *tp)
|
||||
{
|
||||
if (!(tp->features & RTL_FEATURE_FW_LOADED))
|
||||
return;
|
||||
|
||||
rtl_writephy(tp, 0x1f, 0x0000);
|
||||
rtl_w1w0_phy(tp, 0x15, 0x1000, 0x0000);
|
||||
}
|
||||
|
||||
static void rtl8169s_hw_phy_config(struct rtl8169_private *tp)
|
||||
{
|
||||
static const struct phy_reg phy_reg_init[] = {
|
||||
@@ -3218,8 +3187,6 @@ static void rtl8168e_2_hw_phy_config(struct rtl8169_private *tp)
|
||||
rtl_w1w0_phy(tp, 0x10, 0x0000, 0x0400);
|
||||
rtl_writephy(tp, 0x1f, 0x0000);
|
||||
|
||||
r8168_aldps_enable_1(tp);
|
||||
|
||||
/* Broken BIOS workaround: feed GigaMAC registers with MAC address. */
|
||||
rtl_rar_exgmac_set(tp, tp->dev->dev_addr);
|
||||
}
|
||||
@@ -3294,8 +3261,6 @@ static void rtl8168f_1_hw_phy_config(struct rtl8169_private *tp)
|
||||
rtl_writephy(tp, 0x05, 0x8b85);
|
||||
rtl_w1w0_phy(tp, 0x06, 0x4000, 0x0000);
|
||||
rtl_writephy(tp, 0x1f, 0x0000);
|
||||
|
||||
r8168_aldps_enable_1(tp);
|
||||
}
|
||||
|
||||
static void rtl8168f_2_hw_phy_config(struct rtl8169_private *tp)
|
||||
@@ -3303,8 +3268,6 @@ static void rtl8168f_2_hw_phy_config(struct rtl8169_private *tp)
|
||||
rtl_apply_firmware(tp);
|
||||
|
||||
rtl8168f_hw_phy_config(tp);
|
||||
|
||||
r8168_aldps_enable_1(tp);
|
||||
}
|
||||
|
||||
static void rtl8411_hw_phy_config(struct rtl8169_private *tp)
|
||||
@@ -3402,8 +3365,6 @@ static void rtl8411_hw_phy_config(struct rtl8169_private *tp)
|
||||
rtl_w1w0_phy(tp, 0x19, 0x0000, 0x0001);
|
||||
rtl_w1w0_phy(tp, 0x10, 0x0000, 0x0400);
|
||||
rtl_writephy(tp, 0x1f, 0x0000);
|
||||
|
||||
r8168_aldps_enable_1(tp);
|
||||
}
|
||||
|
||||
static void rtl8168g_1_hw_phy_config(struct rtl8169_private *tp)
|
||||
@@ -3489,19 +3450,21 @@ static void rtl8105e_hw_phy_config(struct rtl8169_private *tp)
|
||||
};
|
||||
|
||||
/* Disable ALDPS before ram code */
|
||||
r810x_aldps_disable(tp);
|
||||
rtl_writephy(tp, 0x1f, 0x0000);
|
||||
rtl_writephy(tp, 0x18, 0x0310);
|
||||
msleep(100);
|
||||
|
||||
rtl_apply_firmware(tp);
|
||||
|
||||
rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
|
||||
|
||||
r810x_aldps_enable(tp);
|
||||
}
|
||||
|
||||
static void rtl8402_hw_phy_config(struct rtl8169_private *tp)
|
||||
{
|
||||
/* Disable ALDPS before setting firmware */
|
||||
r810x_aldps_disable(tp);
|
||||
rtl_writephy(tp, 0x1f, 0x0000);
|
||||
rtl_writephy(tp, 0x18, 0x0310);
|
||||
msleep(20);
|
||||
|
||||
rtl_apply_firmware(tp);
|
||||
|
||||
@@ -3511,8 +3474,6 @@ static void rtl8402_hw_phy_config(struct rtl8169_private *tp)
|
||||
rtl_writephy(tp, 0x10, 0x401f);
|
||||
rtl_writephy(tp, 0x19, 0x7030);
|
||||
rtl_writephy(tp, 0x1f, 0x0000);
|
||||
|
||||
r810x_aldps_enable(tp);
|
||||
}
|
||||
|
||||
static void rtl8106e_hw_phy_config(struct rtl8169_private *tp)
|
||||
@@ -3525,7 +3486,9 @@ static void rtl8106e_hw_phy_config(struct rtl8169_private *tp)
|
||||
};
|
||||
|
||||
/* Disable ALDPS before ram code */
|
||||
r810x_aldps_disable(tp);
|
||||
rtl_writephy(tp, 0x1f, 0x0000);
|
||||
rtl_writephy(tp, 0x18, 0x0310);
|
||||
msleep(100);
|
||||
|
||||
rtl_apply_firmware(tp);
|
||||
|
||||
@@ -3533,8 +3496,6 @@ static void rtl8106e_hw_phy_config(struct rtl8169_private *tp)
|
||||
rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
|
||||
|
||||
rtl_eri_write(tp, 0x1d0, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC);
|
||||
|
||||
r810x_aldps_enable(tp);
|
||||
}
|
||||
|
||||
static void rtl_hw_phy_config(struct net_device *dev)
|
||||
@@ -5051,6 +5012,8 @@ static void rtl_hw_start_8168e_2(struct rtl8169_private *tp)
|
||||
|
||||
RTL_W8(MaxTxPacketSize, EarlySize);
|
||||
|
||||
rtl_disable_clock_request(pdev);
|
||||
|
||||
RTL_W32(TxConfig, RTL_R32(TxConfig) | TXCFG_AUTO_FIFO);
|
||||
RTL_W8(MCU, RTL_R8(MCU) & ~NOW_IS_OOB);
|
||||
|
||||
@@ -5059,8 +5022,7 @@ static void rtl_hw_start_8168e_2(struct rtl8169_private *tp)
|
||||
|
||||
RTL_W8(DLLPR, RTL_R8(DLLPR) | PFM_EN);
|
||||
RTL_W32(MISC, RTL_R32(MISC) | PWM_EN);
|
||||
RTL_W8(Config5, (RTL_R8(Config5) & ~Spi_en) | ASPM_en);
|
||||
RTL_W8(Config2, RTL_R8(Config2) | ClkReqEn);
|
||||
RTL_W8(Config5, RTL_R8(Config5) & ~Spi_en);
|
||||
}
|
||||
|
||||
static void rtl_hw_start_8168f(struct rtl8169_private *tp)
|
||||
@@ -5085,12 +5047,13 @@ static void rtl_hw_start_8168f(struct rtl8169_private *tp)
|
||||
|
||||
RTL_W8(MaxTxPacketSize, EarlySize);
|
||||
|
||||
rtl_disable_clock_request(pdev);
|
||||
|
||||
RTL_W32(TxConfig, RTL_R32(TxConfig) | TXCFG_AUTO_FIFO);
|
||||
RTL_W8(MCU, RTL_R8(MCU) & ~NOW_IS_OOB);
|
||||
RTL_W8(DLLPR, RTL_R8(DLLPR) | PFM_EN);
|
||||
RTL_W32(MISC, RTL_R32(MISC) | PWM_EN | FORCE_CLK);
|
||||
RTL_W8(Config5, (RTL_R8(Config5) & ~Spi_en) | ASPM_en);
|
||||
RTL_W8(Config2, RTL_R8(Config2) | ClkReqEn);
|
||||
RTL_W32(MISC, RTL_R32(MISC) | PWM_EN);
|
||||
RTL_W8(Config5, RTL_R8(Config5) & ~Spi_en);
|
||||
}
|
||||
|
||||
static void rtl_hw_start_8168f_1(struct rtl8169_private *tp)
|
||||
@@ -5147,10 +5110,8 @@ static void rtl_hw_start_8168g_1(struct rtl8169_private *tp)
|
||||
rtl_w1w0_eri(tp, 0xdc, ERIAR_MASK_0001, 0x01, 0x00, ERIAR_EXGMAC);
|
||||
|
||||
RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
|
||||
RTL_W32(MISC, (RTL_R32(MISC) | FORCE_CLK) & ~RXDV_GATED_EN);
|
||||
RTL_W32(MISC, RTL_R32(MISC) & ~RXDV_GATED_EN);
|
||||
RTL_W8(MaxTxPacketSize, EarlySize);
|
||||
RTL_W8(Config5, RTL_R8(Config5) | ASPM_en);
|
||||
RTL_W8(Config2, RTL_R8(Config2) | ClkReqEn);
|
||||
|
||||
rtl_eri_write(tp, 0xc0, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC);
|
||||
rtl_eri_write(tp, 0xb8, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC);
|
||||
@@ -5366,9 +5327,6 @@ static void rtl_hw_start_8105e_1(struct rtl8169_private *tp)
|
||||
|
||||
RTL_W8(MCU, RTL_R8(MCU) | EN_NDP | EN_OOB_RESET);
|
||||
RTL_W8(DLLPR, RTL_R8(DLLPR) | PFM_EN);
|
||||
RTL_W8(Config5, RTL_R8(Config5) | ASPM_en);
|
||||
RTL_W8(Config2, RTL_R8(Config2) | ClkReqEn);
|
||||
RTL_W32(MISC, RTL_R32(MISC) | FORCE_CLK);
|
||||
|
||||
rtl_ephy_init(tp, e_info_8105e_1, ARRAY_SIZE(e_info_8105e_1));
|
||||
}
|
||||
@@ -5394,9 +5352,6 @@ static void rtl_hw_start_8402(struct rtl8169_private *tp)
|
||||
|
||||
RTL_W32(TxConfig, RTL_R32(TxConfig) | TXCFG_AUTO_FIFO);
|
||||
RTL_W8(MCU, RTL_R8(MCU) & ~NOW_IS_OOB);
|
||||
RTL_W8(Config5, RTL_R8(Config5) | ASPM_en);
|
||||
RTL_W8(Config2, RTL_R8(Config2) | ClkReqEn);
|
||||
RTL_W32(MISC, RTL_R32(MISC) | FORCE_CLK);
|
||||
|
||||
rtl_ephy_init(tp, e_info_8402, ARRAY_SIZE(e_info_8402));
|
||||
|
||||
@@ -5418,10 +5373,7 @@ static void rtl_hw_start_8106(struct rtl8169_private *tp)
|
||||
/* Force LAN exit from ASPM if Rx/Tx are not idle */
|
||||
RTL_W32(FuncEvent, RTL_R32(FuncEvent) | 0x002800);
|
||||
|
||||
RTL_W32(MISC,
|
||||
(RTL_R32(MISC) | DISABLE_LAN_EN | FORCE_CLK) & ~EARLY_TALLY_EN);
|
||||
RTL_W8(Config5, RTL_R8(Config5) | ASPM_en);
|
||||
RTL_W8(Config2, RTL_R8(Config2) | ClkReqEn);
|
||||
RTL_W32(MISC, (RTL_R32(MISC) | DISABLE_LAN_EN) & ~EARLY_TALLY_EN);
|
||||
RTL_W8(MCU, RTL_R8(MCU) | EN_NDP | EN_OOB_RESET);
|
||||
RTL_W8(DLLPR, RTL_R8(DLLPR) & ~PFM_EN);
|
||||
}
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
|
||||
#undef STMMAC_XMIT_DEBUG
|
||||
/*#define STMMAC_XMIT_DEBUG*/
|
||||
#ifdef STMMAC_TX_DEBUG
|
||||
#ifdef STMMAC_XMIT_DEBUG
|
||||
#define TX_DBG(fmt, args...) printk(fmt, ## args)
|
||||
#else
|
||||
#define TX_DBG(fmt, args...) do { } while (0)
|
||||
|
||||
@@ -188,8 +188,6 @@ int stmmac_mdio_register(struct net_device *ndev)
|
||||
goto bus_register_fail;
|
||||
}
|
||||
|
||||
priv->mii = new_bus;
|
||||
|
||||
found = 0;
|
||||
for (addr = 0; addr < PHY_MAX_ADDR; addr++) {
|
||||
struct phy_device *phydev = new_bus->phy_map[addr];
|
||||
@@ -237,8 +235,14 @@ int stmmac_mdio_register(struct net_device *ndev)
|
||||
}
|
||||
}
|
||||
|
||||
if (!found)
|
||||
if (!found) {
|
||||
pr_warning("%s: No PHY found\n", ndev->name);
|
||||
mdiobus_unregister(new_bus);
|
||||
mdiobus_free(new_bus);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
priv->mii = new_bus;
|
||||
|
||||
return 0;
|
||||
|
||||
|
||||
@@ -411,6 +411,7 @@ static const struct usb_device_id products[] = {
|
||||
},
|
||||
|
||||
/* 3. Combined interface devices matching on interface number */
|
||||
{QMI_FIXED_INTF(0x0408, 0xea42, 4)}, /* Yota / Megafon M100-1 */
|
||||
{QMI_FIXED_INTF(0x12d1, 0x140c, 1)}, /* Huawei E173 */
|
||||
{QMI_FIXED_INTF(0x19d2, 0x0002, 1)},
|
||||
{QMI_FIXED_INTF(0x19d2, 0x0012, 1)},
|
||||
|
||||
@@ -318,20 +318,20 @@ struct mwl8k_sta {
|
||||
#define MWL8K_STA(_sta) ((struct mwl8k_sta *)&((_sta)->drv_priv))
|
||||
|
||||
static const struct ieee80211_channel mwl8k_channels_24[] = {
|
||||
{ .center_freq = 2412, .hw_value = 1, },
|
||||
{ .center_freq = 2417, .hw_value = 2, },
|
||||
{ .center_freq = 2422, .hw_value = 3, },
|
||||
{ .center_freq = 2427, .hw_value = 4, },
|
||||
{ .center_freq = 2432, .hw_value = 5, },
|
||||
{ .center_freq = 2437, .hw_value = 6, },
|
||||
{ .center_freq = 2442, .hw_value = 7, },
|
||||
{ .center_freq = 2447, .hw_value = 8, },
|
||||
{ .center_freq = 2452, .hw_value = 9, },
|
||||
{ .center_freq = 2457, .hw_value = 10, },
|
||||
{ .center_freq = 2462, .hw_value = 11, },
|
||||
{ .center_freq = 2467, .hw_value = 12, },
|
||||
{ .center_freq = 2472, .hw_value = 13, },
|
||||
{ .center_freq = 2484, .hw_value = 14, },
|
||||
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2412, .hw_value = 1, },
|
||||
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2417, .hw_value = 2, },
|
||||
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2422, .hw_value = 3, },
|
||||
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2427, .hw_value = 4, },
|
||||
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2432, .hw_value = 5, },
|
||||
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2437, .hw_value = 6, },
|
||||
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2442, .hw_value = 7, },
|
||||
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2447, .hw_value = 8, },
|
||||
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2452, .hw_value = 9, },
|
||||
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2457, .hw_value = 10, },
|
||||
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2462, .hw_value = 11, },
|
||||
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2467, .hw_value = 12, },
|
||||
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2472, .hw_value = 13, },
|
||||
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2484, .hw_value = 14, },
|
||||
};
|
||||
|
||||
static const struct ieee80211_rate mwl8k_rates_24[] = {
|
||||
@@ -352,10 +352,10 @@ static const struct ieee80211_rate mwl8k_rates_24[] = {
|
||||
};
|
||||
|
||||
static const struct ieee80211_channel mwl8k_channels_50[] = {
|
||||
{ .center_freq = 5180, .hw_value = 36, },
|
||||
{ .center_freq = 5200, .hw_value = 40, },
|
||||
{ .center_freq = 5220, .hw_value = 44, },
|
||||
{ .center_freq = 5240, .hw_value = 48, },
|
||||
{ .band = IEEE80211_BAND_5GHZ, .center_freq = 5180, .hw_value = 36, },
|
||||
{ .band = IEEE80211_BAND_5GHZ, .center_freq = 5200, .hw_value = 40, },
|
||||
{ .band = IEEE80211_BAND_5GHZ, .center_freq = 5220, .hw_value = 44, },
|
||||
{ .band = IEEE80211_BAND_5GHZ, .center_freq = 5240, .hw_value = 48, },
|
||||
};
|
||||
|
||||
static const struct ieee80211_rate mwl8k_rates_50[] = {
|
||||
|
||||
@@ -19,6 +19,8 @@ static void pci_free_resources(struct pci_dev *dev)
|
||||
|
||||
static void pci_stop_dev(struct pci_dev *dev)
|
||||
{
|
||||
pci_pme_active(dev, false);
|
||||
|
||||
if (dev->is_added) {
|
||||
pci_proc_detach_device(dev);
|
||||
pci_remove_sysfs_dev_files(dev);
|
||||
|
||||
@@ -350,7 +350,9 @@ static int pl031_probe(struct amba_device *adev, const struct amba_id *id)
|
||||
/* Enable the clockwatch on ST Variants */
|
||||
if (vendor->clockwatch)
|
||||
data |= RTC_CR_CWEN;
|
||||
writel(data | RTC_CR_EN, ldata->base + RTC_CR);
|
||||
else
|
||||
data |= RTC_CR_EN;
|
||||
writel(data, ldata->base + RTC_CR);
|
||||
|
||||
/*
|
||||
* On ST PL031 variants, the RTC reset value does not provide correct
|
||||
|
||||
@@ -3,8 +3,8 @@ config DRM_OMAP
|
||||
tristate "OMAP DRM"
|
||||
depends on DRM && !CONFIG_FB_OMAP2
|
||||
depends on ARCH_OMAP2PLUS || ARCH_MULTIPLATFORM
|
||||
depends on OMAP2_DSS
|
||||
select DRM_KMS_HELPER
|
||||
select OMAP2_DSS
|
||||
select FB_SYS_FILLRECT
|
||||
select FB_SYS_COPYAREA
|
||||
select FB_SYS_IMAGEBLIT
|
||||
|
||||
@@ -538,6 +538,7 @@ static const enum dss_feat_id omap3630_dss_feat_list[] = {
|
||||
FEAT_ALPHA_FIXED_ZORDER,
|
||||
FEAT_FIFO_MERGE,
|
||||
FEAT_OMAP3_DSI_FIFO_BUG,
|
||||
FEAT_DPI_USES_VDDS_DSI,
|
||||
};
|
||||
|
||||
static const enum dss_feat_id omap4430_es1_0_dss_feat_list[] = {
|
||||
|
||||
@@ -278,8 +278,7 @@ static int sync_pcpu(uint32_t cpu, uint32_t *max_cpu)
|
||||
* Only those at cpu present map has its sys interface.
|
||||
*/
|
||||
if (info->flags & XEN_PCPU_FLAGS_INVALID) {
|
||||
if (pcpu)
|
||||
unregister_and_remove_pcpu(pcpu);
|
||||
unregister_and_remove_pcpu(pcpu);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -28,25 +28,16 @@
|
||||
#define AUTOFS_MIN_PROTO_VERSION AUTOFS_PROTO_VERSION
|
||||
|
||||
/*
|
||||
* Architectures where both 32- and 64-bit binaries can be executed
|
||||
* on 64-bit kernels need this. This keeps the structure format
|
||||
* uniform, and makes sure the wait_queue_token isn't too big to be
|
||||
* passed back down to the kernel.
|
||||
*
|
||||
* This assumes that on these architectures:
|
||||
* mode 32 bit 64 bit
|
||||
* -------------------------
|
||||
* int 32 bit 32 bit
|
||||
* long 32 bit 64 bit
|
||||
*
|
||||
* If so, 32-bit user-space code should be backwards compatible.
|
||||
* The wait_queue_token (autofs_wqt_t) is part of a structure which is passed
|
||||
* back to the kernel via ioctl from userspace. On architectures where 32- and
|
||||
* 64-bit userspace binaries can be executed it's important that the size of
|
||||
* autofs_wqt_t stays constant between 32- and 64-bit Linux kernels so that we
|
||||
* do not break the binary ABI interface by changing the structure size.
|
||||
*/
|
||||
|
||||
#if defined(__sparc__) || defined(__mips__) || defined(__x86_64__) \
|
||||
|| defined(__powerpc__) || defined(__s390__)
|
||||
typedef unsigned int autofs_wqt_t;
|
||||
#else
|
||||
#if defined(__ia64__) || defined(__alpha__) /* pure 64bit architectures */
|
||||
typedef unsigned long autofs_wqt_t;
|
||||
#else
|
||||
typedef unsigned int autofs_wqt_t;
|
||||
#endif
|
||||
|
||||
/* Packet types */
|
||||
|
||||
@@ -331,7 +331,7 @@ out:
|
||||
return pid;
|
||||
|
||||
out_unlock:
|
||||
spin_unlock(&pidmap_lock);
|
||||
spin_unlock_irq(&pidmap_lock);
|
||||
out_free:
|
||||
while (++i <= ns->level)
|
||||
free_pidmap(pid->numbers + i);
|
||||
|
||||
@@ -3030,7 +3030,9 @@ int memcg_register_cache(struct mem_cgroup *memcg, struct kmem_cache *s,
|
||||
if (memcg) {
|
||||
s->memcg_params->memcg = memcg;
|
||||
s->memcg_params->root_cache = root_cache;
|
||||
}
|
||||
} else
|
||||
s->memcg_params->is_root_cache = true;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -517,11 +517,11 @@ SYSCALL_DEFINE2(munlock, unsigned long, start, size_t, len)
|
||||
static int do_mlockall(int flags)
|
||||
{
|
||||
struct vm_area_struct * vma, * prev = NULL;
|
||||
unsigned int def_flags = 0;
|
||||
|
||||
if (flags & MCL_FUTURE)
|
||||
def_flags = VM_LOCKED;
|
||||
current->mm->def_flags = def_flags;
|
||||
current->mm->def_flags |= VM_LOCKED;
|
||||
else
|
||||
current->mm->def_flags &= ~VM_LOCKED;
|
||||
if (flags == MCL_FUTURE)
|
||||
goto out;
|
||||
|
||||
|
||||
@@ -773,6 +773,10 @@ void __init init_cma_reserved_pageblock(struct page *page)
|
||||
set_pageblock_migratetype(page, MIGRATE_CMA);
|
||||
__free_pages(page, pageblock_order);
|
||||
totalram_pages += pageblock_nr_pages;
|
||||
#ifdef CONFIG_HIGHMEM
|
||||
if (PageHighMem(page))
|
||||
totalhigh_pages += pageblock_nr_pages;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -4416,10 +4420,11 @@ static void __meminit calculate_node_totalpages(struct pglist_data *pgdat,
|
||||
* round what is now in bits to nearest long in bits, then return it in
|
||||
* bytes.
|
||||
*/
|
||||
static unsigned long __init usemap_size(unsigned long zonesize)
|
||||
static unsigned long __init usemap_size(unsigned long zone_start_pfn, unsigned long zonesize)
|
||||
{
|
||||
unsigned long usemapsize;
|
||||
|
||||
zonesize += zone_start_pfn & (pageblock_nr_pages-1);
|
||||
usemapsize = roundup(zonesize, pageblock_nr_pages);
|
||||
usemapsize = usemapsize >> pageblock_order;
|
||||
usemapsize *= NR_PAGEBLOCK_BITS;
|
||||
@@ -4429,17 +4434,19 @@ static unsigned long __init usemap_size(unsigned long zonesize)
|
||||
}
|
||||
|
||||
static void __init setup_usemap(struct pglist_data *pgdat,
|
||||
struct zone *zone, unsigned long zonesize)
|
||||
struct zone *zone,
|
||||
unsigned long zone_start_pfn,
|
||||
unsigned long zonesize)
|
||||
{
|
||||
unsigned long usemapsize = usemap_size(zonesize);
|
||||
unsigned long usemapsize = usemap_size(zone_start_pfn, zonesize);
|
||||
zone->pageblock_flags = NULL;
|
||||
if (usemapsize)
|
||||
zone->pageblock_flags = alloc_bootmem_node_nopanic(pgdat,
|
||||
usemapsize);
|
||||
}
|
||||
#else
|
||||
static inline void setup_usemap(struct pglist_data *pgdat,
|
||||
struct zone *zone, unsigned long zonesize) {}
|
||||
static inline void setup_usemap(struct pglist_data *pgdat, struct zone *zone,
|
||||
unsigned long zone_start_pfn, unsigned long zonesize) {}
|
||||
#endif /* CONFIG_SPARSEMEM */
|
||||
|
||||
#ifdef CONFIG_HUGETLB_PAGE_SIZE_VARIABLE
|
||||
@@ -4590,7 +4597,7 @@ static void __paginginit free_area_init_core(struct pglist_data *pgdat,
|
||||
continue;
|
||||
|
||||
set_pageblock_order();
|
||||
setup_usemap(pgdat, zone, size);
|
||||
setup_usemap(pgdat, zone, zone_start_pfn, size);
|
||||
ret = init_currently_empty_zone(zone, zone_start_pfn,
|
||||
size, MEMMAP_EARLY);
|
||||
BUG_ON(ret);
|
||||
|
||||
@@ -440,7 +440,7 @@ static bool batadv_is_orig_node_eligible(struct batadv_dat_candidate *res,
|
||||
/* this is an hash collision with the temporary selected node. Choose
|
||||
* the one with the lowest address
|
||||
*/
|
||||
if ((tmp_max == max) &&
|
||||
if ((tmp_max == max) && max_orig_node &&
|
||||
(batadv_compare_eth(candidate->orig, max_orig_node->orig) > 0))
|
||||
goto out;
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/llc.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/pkt_sched.h>
|
||||
#include <net/net_namespace.h>
|
||||
#include <net/llc.h>
|
||||
#include <net/llc_pdu.h>
|
||||
@@ -40,6 +41,7 @@ static void br_send_bpdu(struct net_bridge_port *p,
|
||||
|
||||
skb->dev = p->dev;
|
||||
skb->protocol = htons(ETH_P_802_2);
|
||||
skb->priority = TC_PRIO_CONTROL;
|
||||
|
||||
skb_reserve(skb, LLC_RESERVE);
|
||||
memcpy(__skb_put(skb, length), data, length);
|
||||
|
||||
@@ -187,7 +187,7 @@ struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned int flags,
|
||||
skb_queue_walk(queue, skb) {
|
||||
*peeked = skb->peeked;
|
||||
if (flags & MSG_PEEK) {
|
||||
if (*off >= skb->len) {
|
||||
if (*off >= skb->len && skb->len) {
|
||||
*off -= skb->len;
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -928,24 +928,25 @@ static void parp_redo(struct sk_buff *skb)
|
||||
static int arp_rcv(struct sk_buff *skb, struct net_device *dev,
|
||||
struct packet_type *pt, struct net_device *orig_dev)
|
||||
{
|
||||
struct arphdr *arp;
|
||||
const struct arphdr *arp;
|
||||
|
||||
if (dev->flags & IFF_NOARP ||
|
||||
skb->pkt_type == PACKET_OTHERHOST ||
|
||||
skb->pkt_type == PACKET_LOOPBACK)
|
||||
goto freeskb;
|
||||
|
||||
skb = skb_share_check(skb, GFP_ATOMIC);
|
||||
if (!skb)
|
||||
goto out_of_mem;
|
||||
|
||||
/* ARP header, plus 2 device addresses, plus 2 IP addresses. */
|
||||
if (!pskb_may_pull(skb, arp_hdr_len(dev)))
|
||||
goto freeskb;
|
||||
|
||||
arp = arp_hdr(skb);
|
||||
if (arp->ar_hln != dev->addr_len ||
|
||||
dev->flags & IFF_NOARP ||
|
||||
skb->pkt_type == PACKET_OTHERHOST ||
|
||||
skb->pkt_type == PACKET_LOOPBACK ||
|
||||
arp->ar_pln != 4)
|
||||
if (arp->ar_hln != dev->addr_len || arp->ar_pln != 4)
|
||||
goto freeskb;
|
||||
|
||||
skb = skb_share_check(skb, GFP_ATOMIC);
|
||||
if (skb == NULL)
|
||||
goto out_of_mem;
|
||||
|
||||
memset(NEIGH_CB(skb), 0, sizeof(struct neighbour_cb));
|
||||
|
||||
return NF_HOOK(NFPROTO_ARP, NF_ARP_IN, skb, dev, NULL, arp_process);
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/ipv6.h>
|
||||
#include <net/ipv6.h>
|
||||
#include <linux/netfilter.h>
|
||||
#include <linux/netfilter_ipv6.h>
|
||||
#include <linux/netfilter_ipv6/ip6t_NPT.h>
|
||||
@@ -18,11 +19,20 @@ static int ip6t_npt_checkentry(const struct xt_tgchk_param *par)
|
||||
{
|
||||
struct ip6t_npt_tginfo *npt = par->targinfo;
|
||||
__wsum src_sum = 0, dst_sum = 0;
|
||||
struct in6_addr pfx;
|
||||
unsigned int i;
|
||||
|
||||
if (npt->src_pfx_len > 64 || npt->dst_pfx_len > 64)
|
||||
return -EINVAL;
|
||||
|
||||
/* Ensure that LSB of prefix is zero */
|
||||
ipv6_addr_prefix(&pfx, &npt->src_pfx.in6, npt->src_pfx_len);
|
||||
if (!ipv6_addr_equal(&pfx, &npt->src_pfx.in6))
|
||||
return -EINVAL;
|
||||
ipv6_addr_prefix(&pfx, &npt->dst_pfx.in6, npt->dst_pfx_len);
|
||||
if (!ipv6_addr_equal(&pfx, &npt->dst_pfx.in6))
|
||||
return -EINVAL;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(npt->src_pfx.in6.s6_addr16); i++) {
|
||||
src_sum = csum_add(src_sum,
|
||||
(__force __wsum)npt->src_pfx.in6.s6_addr16[i]);
|
||||
@@ -30,7 +40,7 @@ static int ip6t_npt_checkentry(const struct xt_tgchk_param *par)
|
||||
(__force __wsum)npt->dst_pfx.in6.s6_addr16[i]);
|
||||
}
|
||||
|
||||
npt->adjustment = (__force __sum16) csum_sub(src_sum, dst_sum);
|
||||
npt->adjustment = ~csum_fold(csum_sub(src_sum, dst_sum));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -51,7 +61,7 @@ static bool ip6t_npt_map_pfx(const struct ip6t_npt_tginfo *npt,
|
||||
|
||||
idx = i / 32;
|
||||
addr->s6_addr32[idx] &= mask;
|
||||
addr->s6_addr32[idx] |= npt->dst_pfx.in6.s6_addr32[idx];
|
||||
addr->s6_addr32[idx] |= ~mask & npt->dst_pfx.in6.s6_addr32[idx];
|
||||
}
|
||||
|
||||
if (pfx_len <= 48)
|
||||
@@ -66,8 +76,8 @@ static bool ip6t_npt_map_pfx(const struct ip6t_npt_tginfo *npt,
|
||||
return false;
|
||||
}
|
||||
|
||||
sum = (__force __sum16) csum_add((__force __wsum)addr->s6_addr16[idx],
|
||||
npt->adjustment);
|
||||
sum = ~csum_fold(csum_add(csum_unfold((__force __sum16)addr->s6_addr16[idx]),
|
||||
csum_unfold(npt->adjustment)));
|
||||
if (sum == CSUM_MANGLED_0)
|
||||
sum = 0;
|
||||
*(__force __sum16 *)&addr->s6_addr16[idx] = sum;
|
||||
|
||||
@@ -2004,7 +2004,8 @@ static int ieee80211_set_mcast_rate(struct wiphy *wiphy, struct net_device *dev,
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
||||
|
||||
memcpy(sdata->vif.bss_conf.mcast_rate, rate, sizeof(rate));
|
||||
memcpy(sdata->vif.bss_conf.mcast_rate, rate,
|
||||
sizeof(int) * IEEE80211_NUM_BANDS);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -3400,6 +3400,7 @@ ieee80211_determine_chantype(struct ieee80211_sub_if_data *sdata,
|
||||
|
||||
ret = 0;
|
||||
|
||||
out:
|
||||
while (!cfg80211_chandef_usable(sdata->local->hw.wiphy, chandef,
|
||||
IEEE80211_CHAN_DISABLED)) {
|
||||
if (WARN_ON(chandef->width == NL80211_CHAN_WIDTH_20_NOHT)) {
|
||||
@@ -3408,14 +3409,13 @@ ieee80211_determine_chantype(struct ieee80211_sub_if_data *sdata,
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = chandef_downgrade(chandef);
|
||||
ret |= chandef_downgrade(chandef);
|
||||
}
|
||||
|
||||
if (chandef->width != vht_chandef.width)
|
||||
sdata_info(sdata,
|
||||
"local regulatory prevented using AP HT/VHT configuration, downgraded\n");
|
||||
"capabilities/regulatory prevented using AP HT/VHT configuration, downgraded\n");
|
||||
|
||||
out:
|
||||
WARN_ON_ONCE(!cfg80211_chandef_valid(chandef));
|
||||
return ret;
|
||||
}
|
||||
@@ -3529,8 +3529,11 @@ static int ieee80211_prep_channel(struct ieee80211_sub_if_data *sdata,
|
||||
*/
|
||||
ret = ieee80211_vif_use_channel(sdata, &chandef,
|
||||
IEEE80211_CHANCTX_SHARED);
|
||||
while (ret && chandef.width != NL80211_CHAN_WIDTH_20_NOHT)
|
||||
while (ret && chandef.width != NL80211_CHAN_WIDTH_20_NOHT) {
|
||||
ifmgd->flags |= chandef_downgrade(&chandef);
|
||||
ret = ieee80211_vif_use_channel(sdata, &chandef,
|
||||
IEEE80211_CHANCTX_SHARED);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -61,14 +61,27 @@ sctp_conn_schedule(int af, struct sk_buff *skb, struct ip_vs_proto_data *pd,
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void sctp_nat_csum(struct sk_buff *skb, sctp_sctphdr_t *sctph,
|
||||
unsigned int sctphoff)
|
||||
{
|
||||
__u32 crc32;
|
||||
struct sk_buff *iter;
|
||||
|
||||
crc32 = sctp_start_cksum((__u8 *)sctph, skb_headlen(skb) - sctphoff);
|
||||
skb_walk_frags(skb, iter)
|
||||
crc32 = sctp_update_cksum((u8 *) iter->data,
|
||||
skb_headlen(iter), crc32);
|
||||
sctph->checksum = sctp_end_cksum(crc32);
|
||||
|
||||
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
||||
}
|
||||
|
||||
static int
|
||||
sctp_snat_handler(struct sk_buff *skb, struct ip_vs_protocol *pp,
|
||||
struct ip_vs_conn *cp, struct ip_vs_iphdr *iph)
|
||||
{
|
||||
sctp_sctphdr_t *sctph;
|
||||
unsigned int sctphoff = iph->len;
|
||||
struct sk_buff *iter;
|
||||
__be32 crc32;
|
||||
|
||||
#ifdef CONFIG_IP_VS_IPV6
|
||||
if (cp->af == AF_INET6 && iph->fragoffs)
|
||||
@@ -92,13 +105,7 @@ sctp_snat_handler(struct sk_buff *skb, struct ip_vs_protocol *pp,
|
||||
sctph = (void *) skb_network_header(skb) + sctphoff;
|
||||
sctph->source = cp->vport;
|
||||
|
||||
/* Calculate the checksum */
|
||||
crc32 = sctp_start_cksum((u8 *) sctph, skb_headlen(skb) - sctphoff);
|
||||
skb_walk_frags(skb, iter)
|
||||
crc32 = sctp_update_cksum((u8 *) iter->data, skb_headlen(iter),
|
||||
crc32);
|
||||
crc32 = sctp_end_cksum(crc32);
|
||||
sctph->checksum = crc32;
|
||||
sctp_nat_csum(skb, sctph, sctphoff);
|
||||
|
||||
return 1;
|
||||
}
|
||||
@@ -109,8 +116,6 @@ sctp_dnat_handler(struct sk_buff *skb, struct ip_vs_protocol *pp,
|
||||
{
|
||||
sctp_sctphdr_t *sctph;
|
||||
unsigned int sctphoff = iph->len;
|
||||
struct sk_buff *iter;
|
||||
__be32 crc32;
|
||||
|
||||
#ifdef CONFIG_IP_VS_IPV6
|
||||
if (cp->af == AF_INET6 && iph->fragoffs)
|
||||
@@ -134,13 +139,7 @@ sctp_dnat_handler(struct sk_buff *skb, struct ip_vs_protocol *pp,
|
||||
sctph = (void *) skb_network_header(skb) + sctphoff;
|
||||
sctph->dest = cp->dport;
|
||||
|
||||
/* Calculate the checksum */
|
||||
crc32 = sctp_start_cksum((u8 *) sctph, skb_headlen(skb) - sctphoff);
|
||||
skb_walk_frags(skb, iter)
|
||||
crc32 = sctp_update_cksum((u8 *) iter->data, skb_headlen(iter),
|
||||
crc32);
|
||||
crc32 = sctp_end_cksum(crc32);
|
||||
sctph->checksum = crc32;
|
||||
sctp_nat_csum(skb, sctph, sctphoff);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -1795,6 +1795,8 @@ int start_sync_thread(struct net *net, int state, char *mcast_ifn, __u8 syncid)
|
||||
GFP_KERNEL);
|
||||
if (!tinfo->buf)
|
||||
goto outtinfo;
|
||||
} else {
|
||||
tinfo->buf = NULL;
|
||||
}
|
||||
tinfo->id = id;
|
||||
|
||||
|
||||
@@ -1135,9 +1135,9 @@ static int htb_dump_class(struct Qdisc *sch, unsigned long arg,
|
||||
memset(&opt, 0, sizeof(opt));
|
||||
|
||||
opt.rate.rate = cl->rate.rate_bps >> 3;
|
||||
opt.buffer = cl->buffer;
|
||||
opt.buffer = PSCHED_NS2TICKS(cl->buffer);
|
||||
opt.ceil.rate = cl->ceil.rate_bps >> 3;
|
||||
opt.cbuffer = cl->cbuffer;
|
||||
opt.cbuffer = PSCHED_NS2TICKS(cl->cbuffer);
|
||||
opt.quantum = cl->quantum;
|
||||
opt.prio = cl->prio;
|
||||
opt.level = cl->level;
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
#
|
||||
|
||||
menuconfig IP_SCTP
|
||||
tristate "The SCTP Protocol (EXPERIMENTAL)"
|
||||
depends on INET && EXPERIMENTAL
|
||||
tristate "The SCTP Protocol"
|
||||
depends on INET
|
||||
depends on IPV6 || IPV6=n
|
||||
select CRYPTO
|
||||
select CRYPTO_HMAC
|
||||
|
||||
@@ -326,9 +326,10 @@ static void sctp_v6_get_dst(struct sctp_transport *t, union sctp_addr *saddr,
|
||||
*/
|
||||
rcu_read_lock();
|
||||
list_for_each_entry_rcu(laddr, &bp->address_list, list) {
|
||||
if (!laddr->valid && laddr->state != SCTP_ADDR_SRC)
|
||||
if (!laddr->valid)
|
||||
continue;
|
||||
if ((laddr->a.sa.sa_family == AF_INET6) &&
|
||||
if ((laddr->state == SCTP_ADDR_SRC) &&
|
||||
(laddr->a.sa.sa_family == AF_INET6) &&
|
||||
(scope <= sctp_scope(&laddr->a))) {
|
||||
bmatchlen = sctp_v6_addr_match_len(daddr, &laddr->a);
|
||||
if (!baddr || (matchlen < bmatchlen)) {
|
||||
|
||||
Reference in New Issue
Block a user