ASoC: Fixes for v3.17
A few small driver specific fixes and a couple of error handling fixes in the core. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJUJ/BeAAoJECTWi3JdVIfQogIH/1H69hPq96R/0s74I4w1JDcZ hnzQ5OPqi3vhPByJUAS6hNGe8TSwLD37maCqydOeqy50dI/NpoNVSVVK8+8VKhdl mlkpDFJ1r1IWOYSaGKAH4Ggo6sI5+PEmr4x5MyZPBqxi74Kc/173do6q0yQuLQxs wlaADJnQthBz11nViczzF6RA88cQ2JzjkL+aW1iBmw1yok494I2juc0GQ0NmxsQZ 1Qc2kkAVcGCvXCdI8wQfVHkeIJwT0vSjnofVcXi4/egsQKqU0VaH2yFpC+Pw1vqe G49B6SIWEaSO+mtH1V4H57wLPdyajbRLNQ5RJvcDiXOcIEd/AfrcIS7DfMB9wp8= =KoXl -----END PGP SIGNATURE----- Merge tag 'asoc-v3.17-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-linus ASoC: Fixes for v3.17 A few small driver specific fixes and a couple of error handling fixes in the core.
This commit is contained in:
commit
5498380e4f
|
@ -11,10 +11,6 @@ Required properties:
|
||||||
|
|
||||||
Optional properties for main touchpad device:
|
Optional properties for main touchpad device:
|
||||||
|
|
||||||
- linux,gpio-keymap: An array of up to 4 entries indicating the Linux
|
|
||||||
keycode generated by each GPIO. Linux keycodes are defined in
|
|
||||||
<dt-bindings/input/input.h>.
|
|
||||||
|
|
||||||
- linux,gpio-keymap: When enabled, the SPT_GPIOPWN_T19 object sends messages
|
- linux,gpio-keymap: When enabled, the SPT_GPIOPWN_T19 object sends messages
|
||||||
on GPIO bit changes. An array of up to 8 entries can be provided
|
on GPIO bit changes. An array of up to 8 entries can be provided
|
||||||
indicating the Linux keycode mapped to each bit of the status byte,
|
indicating the Linux keycode mapped to each bit of the status byte,
|
||||||
|
|
|
@ -16,11 +16,15 @@ Required Properties:
|
||||||
- clocks: Must contain an entry for each entry in clock-names.
|
- clocks: Must contain an entry for each entry in clock-names.
|
||||||
- clock-names: Shall be "spiclk" for the transfer-clock, and "apb_pclk" for
|
- clock-names: Shall be "spiclk" for the transfer-clock, and "apb_pclk" for
|
||||||
the peripheral clock.
|
the peripheral clock.
|
||||||
|
- #address-cells: should be 1.
|
||||||
|
- #size-cells: should be 0.
|
||||||
|
|
||||||
|
Optional Properties:
|
||||||
|
|
||||||
- dmas: DMA specifiers for tx and rx dma. See the DMA client binding,
|
- dmas: DMA specifiers for tx and rx dma. See the DMA client binding,
|
||||||
Documentation/devicetree/bindings/dma/dma.txt
|
Documentation/devicetree/bindings/dma/dma.txt
|
||||||
- dma-names: DMA request names should include "tx" and "rx" if present.
|
- dma-names: DMA request names should include "tx" and "rx" if present.
|
||||||
- #address-cells: should be 1.
|
|
||||||
- #size-cells: should be 0.
|
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
|
|
|
@ -1665,6 +1665,12 @@ M: Nicolas Ferre <nicolas.ferre@atmel.com>
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/tty/serial/atmel_serial.c
|
F: drivers/tty/serial/atmel_serial.c
|
||||||
|
|
||||||
|
ATMEL Audio ALSA driver
|
||||||
|
M: Bo Shen <voice.shen@atmel.com>
|
||||||
|
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||||
|
S: Supported
|
||||||
|
F: sound/soc/atmel
|
||||||
|
|
||||||
ATMEL DMA DRIVER
|
ATMEL DMA DRIVER
|
||||||
M: Nicolas Ferre <nicolas.ferre@atmel.com>
|
M: Nicolas Ferre <nicolas.ferre@atmel.com>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
|
@ -6876,7 +6882,7 @@ F: arch/x86/kernel/quirks.c
|
||||||
|
|
||||||
PCI DRIVER FOR IMX6
|
PCI DRIVER FOR IMX6
|
||||||
M: Richard Zhu <r65037@freescale.com>
|
M: Richard Zhu <r65037@freescale.com>
|
||||||
M: Shawn Guo <shawn.guo@freescale.com>
|
M: Lucas Stach <l.stach@pengutronix.de>
|
||||||
L: linux-pci@vger.kernel.org
|
L: linux-pci@vger.kernel.org
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
||||||
VERSION = 3
|
VERSION = 3
|
||||||
PATCHLEVEL = 17
|
PATCHLEVEL = 17
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION = -rc5
|
EXTRAVERSION = -rc6
|
||||||
NAME = Shuffling Zombie Juror
|
NAME = Shuffling Zombie Juror
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
#ifndef __ASMARM_TLS_H
|
#ifndef __ASMARM_TLS_H
|
||||||
#define __ASMARM_TLS_H
|
#define __ASMARM_TLS_H
|
||||||
|
|
||||||
|
#include <linux/compiler.h>
|
||||||
|
#include <asm/thread_info.h>
|
||||||
|
|
||||||
#ifdef __ASSEMBLY__
|
#ifdef __ASSEMBLY__
|
||||||
#include <asm/asm-offsets.h>
|
#include <asm/asm-offsets.h>
|
||||||
.macro switch_tls_none, base, tp, tpuser, tmp1, tmp2
|
.macro switch_tls_none, base, tp, tpuser, tmp1, tmp2
|
||||||
|
@ -50,6 +53,47 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
|
static inline void set_tls(unsigned long val)
|
||||||
|
{
|
||||||
|
struct thread_info *thread;
|
||||||
|
|
||||||
|
thread = current_thread_info();
|
||||||
|
|
||||||
|
thread->tp_value[0] = val;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This code runs with preemption enabled and therefore must
|
||||||
|
* be reentrant with respect to switch_tls.
|
||||||
|
*
|
||||||
|
* We need to ensure ordering between the shadow state and the
|
||||||
|
* hardware state, so that we don't corrupt the hardware state
|
||||||
|
* with a stale shadow state during context switch.
|
||||||
|
*
|
||||||
|
* If we're preempted here, switch_tls will load TPIDRURO from
|
||||||
|
* thread_info upon resuming execution and the following mcr
|
||||||
|
* is merely redundant.
|
||||||
|
*/
|
||||||
|
barrier();
|
||||||
|
|
||||||
|
if (!tls_emu) {
|
||||||
|
if (has_tls_reg) {
|
||||||
|
asm("mcr p15, 0, %0, c13, c0, 3"
|
||||||
|
: : "r" (val));
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* User space must never try to access this
|
||||||
|
* directly. Expect your app to break
|
||||||
|
* eventually if you do so. The user helper
|
||||||
|
* at 0xffff0fe0 must be used instead. (see
|
||||||
|
* entry-armv.S for details)
|
||||||
|
*/
|
||||||
|
*((unsigned int *)0xffff0ff0) = val;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static inline unsigned long get_tpuser(void)
|
static inline unsigned long get_tpuser(void)
|
||||||
{
|
{
|
||||||
unsigned long reg = 0;
|
unsigned long reg = 0;
|
||||||
|
@ -59,5 +103,23 @@ static inline unsigned long get_tpuser(void)
|
||||||
|
|
||||||
return reg;
|
return reg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void set_tpuser(unsigned long val)
|
||||||
|
{
|
||||||
|
/* Since TPIDRURW is fully context-switched (unlike TPIDRURO),
|
||||||
|
* we need not update thread_info.
|
||||||
|
*/
|
||||||
|
if (has_tls_reg && !tls_emu) {
|
||||||
|
asm("mcr p15, 0, %0, c13, c0, 2"
|
||||||
|
: : "r" (val));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void flush_tls(void)
|
||||||
|
{
|
||||||
|
set_tls(0);
|
||||||
|
set_tpuser(0);
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#endif /* __ASMARM_TLS_H */
|
#endif /* __ASMARM_TLS_H */
|
||||||
|
|
|
@ -107,8 +107,11 @@ static inline void set_fs(mm_segment_t fs)
|
||||||
extern int __get_user_1(void *);
|
extern int __get_user_1(void *);
|
||||||
extern int __get_user_2(void *);
|
extern int __get_user_2(void *);
|
||||||
extern int __get_user_4(void *);
|
extern int __get_user_4(void *);
|
||||||
extern int __get_user_lo8(void *);
|
extern int __get_user_32t_8(void *);
|
||||||
extern int __get_user_8(void *);
|
extern int __get_user_8(void *);
|
||||||
|
extern int __get_user_64t_1(void *);
|
||||||
|
extern int __get_user_64t_2(void *);
|
||||||
|
extern int __get_user_64t_4(void *);
|
||||||
|
|
||||||
#define __GUP_CLOBBER_1 "lr", "cc"
|
#define __GUP_CLOBBER_1 "lr", "cc"
|
||||||
#ifdef CONFIG_CPU_USE_DOMAINS
|
#ifdef CONFIG_CPU_USE_DOMAINS
|
||||||
|
@ -117,7 +120,7 @@ extern int __get_user_8(void *);
|
||||||
#define __GUP_CLOBBER_2 "lr", "cc"
|
#define __GUP_CLOBBER_2 "lr", "cc"
|
||||||
#endif
|
#endif
|
||||||
#define __GUP_CLOBBER_4 "lr", "cc"
|
#define __GUP_CLOBBER_4 "lr", "cc"
|
||||||
#define __GUP_CLOBBER_lo8 "lr", "cc"
|
#define __GUP_CLOBBER_32t_8 "lr", "cc"
|
||||||
#define __GUP_CLOBBER_8 "lr", "cc"
|
#define __GUP_CLOBBER_8 "lr", "cc"
|
||||||
|
|
||||||
#define __get_user_x(__r2,__p,__e,__l,__s) \
|
#define __get_user_x(__r2,__p,__e,__l,__s) \
|
||||||
|
@ -131,12 +134,30 @@ extern int __get_user_8(void *);
|
||||||
|
|
||||||
/* narrowing a double-word get into a single 32bit word register: */
|
/* narrowing a double-word get into a single 32bit word register: */
|
||||||
#ifdef __ARMEB__
|
#ifdef __ARMEB__
|
||||||
#define __get_user_xb(__r2, __p, __e, __l, __s) \
|
#define __get_user_x_32t(__r2, __p, __e, __l, __s) \
|
||||||
__get_user_x(__r2, __p, __e, __l, lo8)
|
__get_user_x(__r2, __p, __e, __l, 32t_8)
|
||||||
#else
|
#else
|
||||||
#define __get_user_xb __get_user_x
|
#define __get_user_x_32t __get_user_x
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* storing result into proper least significant word of 64bit target var,
|
||||||
|
* different only for big endian case where 64 bit __r2 lsw is r3:
|
||||||
|
*/
|
||||||
|
#ifdef __ARMEB__
|
||||||
|
#define __get_user_x_64t(__r2, __p, __e, __l, __s) \
|
||||||
|
__asm__ __volatile__ ( \
|
||||||
|
__asmeq("%0", "r0") __asmeq("%1", "r2") \
|
||||||
|
__asmeq("%3", "r1") \
|
||||||
|
"bl __get_user_64t_" #__s \
|
||||||
|
: "=&r" (__e), "=r" (__r2) \
|
||||||
|
: "0" (__p), "r" (__l) \
|
||||||
|
: __GUP_CLOBBER_##__s)
|
||||||
|
#else
|
||||||
|
#define __get_user_x_64t __get_user_x
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#define __get_user_check(x,p) \
|
#define __get_user_check(x,p) \
|
||||||
({ \
|
({ \
|
||||||
unsigned long __limit = current_thread_info()->addr_limit - 1; \
|
unsigned long __limit = current_thread_info()->addr_limit - 1; \
|
||||||
|
@ -146,17 +167,26 @@ extern int __get_user_8(void *);
|
||||||
register int __e asm("r0"); \
|
register int __e asm("r0"); \
|
||||||
switch (sizeof(*(__p))) { \
|
switch (sizeof(*(__p))) { \
|
||||||
case 1: \
|
case 1: \
|
||||||
__get_user_x(__r2, __p, __e, __l, 1); \
|
if (sizeof((x)) >= 8) \
|
||||||
|
__get_user_x_64t(__r2, __p, __e, __l, 1); \
|
||||||
|
else \
|
||||||
|
__get_user_x(__r2, __p, __e, __l, 1); \
|
||||||
break; \
|
break; \
|
||||||
case 2: \
|
case 2: \
|
||||||
__get_user_x(__r2, __p, __e, __l, 2); \
|
if (sizeof((x)) >= 8) \
|
||||||
|
__get_user_x_64t(__r2, __p, __e, __l, 2); \
|
||||||
|
else \
|
||||||
|
__get_user_x(__r2, __p, __e, __l, 2); \
|
||||||
break; \
|
break; \
|
||||||
case 4: \
|
case 4: \
|
||||||
__get_user_x(__r2, __p, __e, __l, 4); \
|
if (sizeof((x)) >= 8) \
|
||||||
|
__get_user_x_64t(__r2, __p, __e, __l, 4); \
|
||||||
|
else \
|
||||||
|
__get_user_x(__r2, __p, __e, __l, 4); \
|
||||||
break; \
|
break; \
|
||||||
case 8: \
|
case 8: \
|
||||||
if (sizeof((x)) < 8) \
|
if (sizeof((x)) < 8) \
|
||||||
__get_user_xb(__r2, __p, __e, __l, 4); \
|
__get_user_x_32t(__r2, __p, __e, __l, 4); \
|
||||||
else \
|
else \
|
||||||
__get_user_x(__r2, __p, __e, __l, 8); \
|
__get_user_x(__r2, __p, __e, __l, 8); \
|
||||||
break; \
|
break; \
|
||||||
|
|
|
@ -98,6 +98,14 @@ EXPORT_SYMBOL(__clear_user);
|
||||||
EXPORT_SYMBOL(__get_user_1);
|
EXPORT_SYMBOL(__get_user_1);
|
||||||
EXPORT_SYMBOL(__get_user_2);
|
EXPORT_SYMBOL(__get_user_2);
|
||||||
EXPORT_SYMBOL(__get_user_4);
|
EXPORT_SYMBOL(__get_user_4);
|
||||||
|
EXPORT_SYMBOL(__get_user_8);
|
||||||
|
|
||||||
|
#ifdef __ARMEB__
|
||||||
|
EXPORT_SYMBOL(__get_user_64t_1);
|
||||||
|
EXPORT_SYMBOL(__get_user_64t_2);
|
||||||
|
EXPORT_SYMBOL(__get_user_64t_4);
|
||||||
|
EXPORT_SYMBOL(__get_user_32t_8);
|
||||||
|
#endif
|
||||||
|
|
||||||
EXPORT_SYMBOL(__put_user_1);
|
EXPORT_SYMBOL(__put_user_1);
|
||||||
EXPORT_SYMBOL(__put_user_2);
|
EXPORT_SYMBOL(__put_user_2);
|
||||||
|
|
|
@ -175,7 +175,7 @@ static bool migrate_one_irq(struct irq_desc *desc)
|
||||||
c = irq_data_get_irq_chip(d);
|
c = irq_data_get_irq_chip(d);
|
||||||
if (!c->irq_set_affinity)
|
if (!c->irq_set_affinity)
|
||||||
pr_debug("IRQ%u: unable to set affinity\n", d->irq);
|
pr_debug("IRQ%u: unable to set affinity\n", d->irq);
|
||||||
else if (c->irq_set_affinity(d, affinity, true) == IRQ_SET_MASK_OK && ret)
|
else if (c->irq_set_affinity(d, affinity, false) == IRQ_SET_MASK_OK && ret)
|
||||||
cpumask_copy(d->affinity, affinity);
|
cpumask_copy(d->affinity, affinity);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -76,21 +76,15 @@ static struct pmu_hw_events *cpu_pmu_get_cpu_events(void)
|
||||||
|
|
||||||
static void cpu_pmu_enable_percpu_irq(void *data)
|
static void cpu_pmu_enable_percpu_irq(void *data)
|
||||||
{
|
{
|
||||||
struct arm_pmu *cpu_pmu = data;
|
int irq = *(int *)data;
|
||||||
struct platform_device *pmu_device = cpu_pmu->plat_device;
|
|
||||||
int irq = platform_get_irq(pmu_device, 0);
|
|
||||||
|
|
||||||
enable_percpu_irq(irq, IRQ_TYPE_NONE);
|
enable_percpu_irq(irq, IRQ_TYPE_NONE);
|
||||||
cpumask_set_cpu(smp_processor_id(), &cpu_pmu->active_irqs);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cpu_pmu_disable_percpu_irq(void *data)
|
static void cpu_pmu_disable_percpu_irq(void *data)
|
||||||
{
|
{
|
||||||
struct arm_pmu *cpu_pmu = data;
|
int irq = *(int *)data;
|
||||||
struct platform_device *pmu_device = cpu_pmu->plat_device;
|
|
||||||
int irq = platform_get_irq(pmu_device, 0);
|
|
||||||
|
|
||||||
cpumask_clear_cpu(smp_processor_id(), &cpu_pmu->active_irqs);
|
|
||||||
disable_percpu_irq(irq);
|
disable_percpu_irq(irq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -103,7 +97,7 @@ static void cpu_pmu_free_irq(struct arm_pmu *cpu_pmu)
|
||||||
|
|
||||||
irq = platform_get_irq(pmu_device, 0);
|
irq = platform_get_irq(pmu_device, 0);
|
||||||
if (irq >= 0 && irq_is_percpu(irq)) {
|
if (irq >= 0 && irq_is_percpu(irq)) {
|
||||||
on_each_cpu(cpu_pmu_disable_percpu_irq, cpu_pmu, 1);
|
on_each_cpu(cpu_pmu_disable_percpu_irq, &irq, 1);
|
||||||
free_percpu_irq(irq, &percpu_pmu);
|
free_percpu_irq(irq, &percpu_pmu);
|
||||||
} else {
|
} else {
|
||||||
for (i = 0; i < irqs; ++i) {
|
for (i = 0; i < irqs; ++i) {
|
||||||
|
@ -138,7 +132,7 @@ static int cpu_pmu_request_irq(struct arm_pmu *cpu_pmu, irq_handler_t handler)
|
||||||
irq);
|
irq);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
on_each_cpu(cpu_pmu_enable_percpu_irq, cpu_pmu, 1);
|
on_each_cpu(cpu_pmu_enable_percpu_irq, &irq, 1);
|
||||||
} else {
|
} else {
|
||||||
for (i = 0; i < irqs; ++i) {
|
for (i = 0; i < irqs; ++i) {
|
||||||
err = 0;
|
err = 0;
|
||||||
|
|
|
@ -334,6 +334,8 @@ void flush_thread(void)
|
||||||
memset(&tsk->thread.debug, 0, sizeof(struct debug_info));
|
memset(&tsk->thread.debug, 0, sizeof(struct debug_info));
|
||||||
memset(&thread->fpstate, 0, sizeof(union fp_state));
|
memset(&thread->fpstate, 0, sizeof(union fp_state));
|
||||||
|
|
||||||
|
flush_tls();
|
||||||
|
|
||||||
thread_notify(THREAD_NOTIFY_FLUSH, thread);
|
thread_notify(THREAD_NOTIFY_FLUSH, thread);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -142,14 +142,6 @@ static int emulate_swpX(unsigned int address, unsigned int *data,
|
||||||
while (1) {
|
while (1) {
|
||||||
unsigned long temp;
|
unsigned long temp;
|
||||||
|
|
||||||
/*
|
|
||||||
* Barrier required between accessing protected resource and
|
|
||||||
* releasing a lock for it. Legacy code might not have done
|
|
||||||
* this, and we cannot determine that this is not the case
|
|
||||||
* being emulated, so insert always.
|
|
||||||
*/
|
|
||||||
smp_mb();
|
|
||||||
|
|
||||||
if (type == TYPE_SWPB)
|
if (type == TYPE_SWPB)
|
||||||
__user_swpb_asm(*data, address, res, temp);
|
__user_swpb_asm(*data, address, res, temp);
|
||||||
else
|
else
|
||||||
|
@ -162,13 +154,6 @@ static int emulate_swpX(unsigned int address, unsigned int *data,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (res == 0) {
|
if (res == 0) {
|
||||||
/*
|
|
||||||
* Barrier also required between acquiring a lock for a
|
|
||||||
* protected resource and accessing the resource. Inserted for
|
|
||||||
* same reason as above.
|
|
||||||
*/
|
|
||||||
smp_mb();
|
|
||||||
|
|
||||||
if (type == TYPE_SWPB)
|
if (type == TYPE_SWPB)
|
||||||
swpbcounter++;
|
swpbcounter++;
|
||||||
else
|
else
|
||||||
|
|
|
@ -45,7 +45,7 @@ static int thumbee_notifier(struct notifier_block *self, unsigned long cmd, void
|
||||||
|
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case THREAD_NOTIFY_FLUSH:
|
case THREAD_NOTIFY_FLUSH:
|
||||||
thread->thumbee_state = 0;
|
teehbr_write(0);
|
||||||
break;
|
break;
|
||||||
case THREAD_NOTIFY_SWITCH:
|
case THREAD_NOTIFY_SWITCH:
|
||||||
current_thread_info()->thumbee_state = teehbr_read();
|
current_thread_info()->thumbee_state = teehbr_read();
|
||||||
|
|
|
@ -581,7 +581,6 @@ do_cache_op(unsigned long start, unsigned long end, int flags)
|
||||||
#define NR(x) ((__ARM_NR_##x) - __ARM_NR_BASE)
|
#define NR(x) ((__ARM_NR_##x) - __ARM_NR_BASE)
|
||||||
asmlinkage int arm_syscall(int no, struct pt_regs *regs)
|
asmlinkage int arm_syscall(int no, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
struct thread_info *thread = current_thread_info();
|
|
||||||
siginfo_t info;
|
siginfo_t info;
|
||||||
|
|
||||||
if ((no >> 16) != (__ARM_NR_BASE>> 16))
|
if ((no >> 16) != (__ARM_NR_BASE>> 16))
|
||||||
|
@ -632,21 +631,7 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs)
|
||||||
return regs->ARM_r0;
|
return regs->ARM_r0;
|
||||||
|
|
||||||
case NR(set_tls):
|
case NR(set_tls):
|
||||||
thread->tp_value[0] = regs->ARM_r0;
|
set_tls(regs->ARM_r0);
|
||||||
if (tls_emu)
|
|
||||||
return 0;
|
|
||||||
if (has_tls_reg) {
|
|
||||||
asm ("mcr p15, 0, %0, c13, c0, 3"
|
|
||||||
: : "r" (regs->ARM_r0));
|
|
||||||
} else {
|
|
||||||
/*
|
|
||||||
* User space must never try to access this directly.
|
|
||||||
* Expect your app to break eventually if you do so.
|
|
||||||
* The user helper at 0xffff0fe0 must be used instead.
|
|
||||||
* (see entry-armv.S for details)
|
|
||||||
*/
|
|
||||||
*((unsigned int *)0xffff0ff0) = regs->ARM_r0;
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
#ifdef CONFIG_NEEDS_SYSCALL_FOR_CMPXCHG
|
#ifdef CONFIG_NEEDS_SYSCALL_FOR_CMPXCHG
|
||||||
|
|
|
@ -80,7 +80,7 @@ ENTRY(__get_user_8)
|
||||||
ENDPROC(__get_user_8)
|
ENDPROC(__get_user_8)
|
||||||
|
|
||||||
#ifdef __ARMEB__
|
#ifdef __ARMEB__
|
||||||
ENTRY(__get_user_lo8)
|
ENTRY(__get_user_32t_8)
|
||||||
check_uaccess r0, 8, r1, r2, __get_user_bad
|
check_uaccess r0, 8, r1, r2, __get_user_bad
|
||||||
#ifdef CONFIG_CPU_USE_DOMAINS
|
#ifdef CONFIG_CPU_USE_DOMAINS
|
||||||
add r0, r0, #4
|
add r0, r0, #4
|
||||||
|
@ -90,7 +90,37 @@ ENTRY(__get_user_lo8)
|
||||||
#endif
|
#endif
|
||||||
mov r0, #0
|
mov r0, #0
|
||||||
ret lr
|
ret lr
|
||||||
ENDPROC(__get_user_lo8)
|
ENDPROC(__get_user_32t_8)
|
||||||
|
|
||||||
|
ENTRY(__get_user_64t_1)
|
||||||
|
check_uaccess r0, 1, r1, r2, __get_user_bad8
|
||||||
|
8: TUSER(ldrb) r3, [r0]
|
||||||
|
mov r0, #0
|
||||||
|
ret lr
|
||||||
|
ENDPROC(__get_user_64t_1)
|
||||||
|
|
||||||
|
ENTRY(__get_user_64t_2)
|
||||||
|
check_uaccess r0, 2, r1, r2, __get_user_bad8
|
||||||
|
#ifdef CONFIG_CPU_USE_DOMAINS
|
||||||
|
rb .req ip
|
||||||
|
9: ldrbt r3, [r0], #1
|
||||||
|
10: ldrbt rb, [r0], #0
|
||||||
|
#else
|
||||||
|
rb .req r0
|
||||||
|
9: ldrb r3, [r0]
|
||||||
|
10: ldrb rb, [r0, #1]
|
||||||
|
#endif
|
||||||
|
orr r3, rb, r3, lsl #8
|
||||||
|
mov r0, #0
|
||||||
|
ret lr
|
||||||
|
ENDPROC(__get_user_64t_2)
|
||||||
|
|
||||||
|
ENTRY(__get_user_64t_4)
|
||||||
|
check_uaccess r0, 4, r1, r2, __get_user_bad8
|
||||||
|
11: TUSER(ldr) r3, [r0]
|
||||||
|
mov r0, #0
|
||||||
|
ret lr
|
||||||
|
ENDPROC(__get_user_64t_4)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
__get_user_bad8:
|
__get_user_bad8:
|
||||||
|
@ -111,5 +141,9 @@ ENDPROC(__get_user_bad8)
|
||||||
.long 6b, __get_user_bad8
|
.long 6b, __get_user_bad8
|
||||||
#ifdef __ARMEB__
|
#ifdef __ARMEB__
|
||||||
.long 7b, __get_user_bad
|
.long 7b, __get_user_bad
|
||||||
|
.long 8b, __get_user_bad8
|
||||||
|
.long 9b, __get_user_bad8
|
||||||
|
.long 10b, __get_user_bad8
|
||||||
|
.long 11b, __get_user_bad8
|
||||||
#endif
|
#endif
|
||||||
.popsection
|
.popsection
|
||||||
|
|
|
@ -146,7 +146,6 @@ ENDPROC(cpu_v7_set_pte_ext)
|
||||||
mov \tmp, \ttbr1, lsr #(32 - ARCH_PGD_SHIFT) @ upper bits
|
mov \tmp, \ttbr1, lsr #(32 - ARCH_PGD_SHIFT) @ upper bits
|
||||||
mov \ttbr1, \ttbr1, lsl #ARCH_PGD_SHIFT @ lower bits
|
mov \ttbr1, \ttbr1, lsl #ARCH_PGD_SHIFT @ lower bits
|
||||||
addls \ttbr1, \ttbr1, #TTBR1_OFFSET
|
addls \ttbr1, \ttbr1, #TTBR1_OFFSET
|
||||||
adcls \tmp, \tmp, #0
|
|
||||||
mcrr p15, 1, \ttbr1, \tmp, c2 @ load TTBR1
|
mcrr p15, 1, \ttbr1, \tmp, c2 @ load TTBR1
|
||||||
mov \tmp, \ttbr0, lsr #(32 - ARCH_PGD_SHIFT) @ upper bits
|
mov \tmp, \ttbr0, lsr #(32 - ARCH_PGD_SHIFT) @ upper bits
|
||||||
mov \ttbr0, \ttbr0, lsl #ARCH_PGD_SHIFT @ lower bits
|
mov \ttbr0, \ttbr0, lsl #ARCH_PGD_SHIFT @ lower bits
|
||||||
|
|
|
@ -149,8 +149,7 @@ void __init arm64_memblock_init(void)
|
||||||
memblock_reserve(__virt_to_phys(initrd_start), initrd_end - initrd_start);
|
memblock_reserve(__virt_to_phys(initrd_start), initrd_end - initrd_start);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!efi_enabled(EFI_MEMMAP))
|
early_init_fdt_scan_reserved_mem();
|
||||||
early_init_fdt_scan_reserved_mem();
|
|
||||||
|
|
||||||
/* 4GB maximum for 32-bit only capable devices */
|
/* 4GB maximum for 32-bit only capable devices */
|
||||||
if (IS_ENABLED(CONFIG_ZONE_DMA))
|
if (IS_ENABLED(CONFIG_ZONE_DMA))
|
||||||
|
|
|
@ -329,6 +329,6 @@
|
||||||
#define __NR_sched_getattr 1337
|
#define __NR_sched_getattr 1337
|
||||||
#define __NR_renameat2 1338
|
#define __NR_renameat2 1338
|
||||||
#define __NR_getrandom 1339
|
#define __NR_getrandom 1339
|
||||||
#define __NR_memfd_create 1339
|
#define __NR_memfd_create 1340
|
||||||
|
|
||||||
#endif /* _UAPI_ASM_IA64_UNISTD_H */
|
#endif /* _UAPI_ASM_IA64_UNISTD_H */
|
||||||
|
|
|
@ -38,27 +38,6 @@ static void pci_fixup_video(struct pci_dev *pdev)
|
||||||
return;
|
return;
|
||||||
/* Maybe, this machine supports legacy memory map. */
|
/* Maybe, this machine supports legacy memory map. */
|
||||||
|
|
||||||
if (!vga_default_device()) {
|
|
||||||
resource_size_t start, end;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
/* Does firmware framebuffer belong to us? */
|
|
||||||
for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
|
|
||||||
if (!(pci_resource_flags(pdev, i) & IORESOURCE_MEM))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
start = pci_resource_start(pdev, i);
|
|
||||||
end = pci_resource_end(pdev, i);
|
|
||||||
|
|
||||||
if (!start || !end)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (screen_info.lfb_base >= start &&
|
|
||||||
(screen_info.lfb_base + screen_info.lfb_size) < end)
|
|
||||||
vga_set_default_device(pdev);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Is VGA routed to us? */
|
/* Is VGA routed to us? */
|
||||||
bus = pdev->bus;
|
bus = pdev->bus;
|
||||||
while (bus) {
|
while (bus) {
|
||||||
|
@ -83,8 +62,7 @@ static void pci_fixup_video(struct pci_dev *pdev)
|
||||||
pci_read_config_word(pdev, PCI_COMMAND, &config);
|
pci_read_config_word(pdev, PCI_COMMAND, &config);
|
||||||
if (config & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) {
|
if (config & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) {
|
||||||
pdev->resource[PCI_ROM_RESOURCE].flags |= IORESOURCE_ROM_SHADOW;
|
pdev->resource[PCI_ROM_RESOURCE].flags |= IORESOURCE_ROM_SHADOW;
|
||||||
dev_printk(KERN_DEBUG, &pdev->dev, "Boot video device\n");
|
dev_printk(KERN_DEBUG, &pdev->dev, "Video device with shadowed ROM\n");
|
||||||
vga_set_default_device(pdev);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -546,6 +546,7 @@ config SGI_IP28
|
||||||
# select SYS_HAS_EARLY_PRINTK
|
# select SYS_HAS_EARLY_PRINTK
|
||||||
select SYS_SUPPORTS_64BIT_KERNEL
|
select SYS_SUPPORTS_64BIT_KERNEL
|
||||||
select SYS_SUPPORTS_BIG_ENDIAN
|
select SYS_SUPPORTS_BIG_ENDIAN
|
||||||
|
select MIPS_L1_CACHE_SHIFT_7
|
||||||
help
|
help
|
||||||
This is the SGI Indigo2 with R10000 processor. To compile a Linux
|
This is the SGI Indigo2 with R10000 processor. To compile a Linux
|
||||||
kernel that runs on these, say Y here.
|
kernel that runs on these, say Y here.
|
||||||
|
@ -2029,7 +2030,9 @@ config MIPS_CMP
|
||||||
bool "MIPS CMP framework support (DEPRECATED)"
|
bool "MIPS CMP framework support (DEPRECATED)"
|
||||||
depends on SYS_SUPPORTS_MIPS_CMP
|
depends on SYS_SUPPORTS_MIPS_CMP
|
||||||
select MIPS_GIC_IPI
|
select MIPS_GIC_IPI
|
||||||
|
select SMP
|
||||||
select SYNC_R4K
|
select SYNC_R4K
|
||||||
|
select SYS_SUPPORTS_SMP
|
||||||
select WEAK_ORDERING
|
select WEAK_ORDERING
|
||||||
default n
|
default n
|
||||||
help
|
help
|
||||||
|
|
|
@ -113,7 +113,16 @@ predef-le += -DMIPSEL -D_MIPSEL -D__MIPSEL -D__MIPSEL__
|
||||||
cflags-$(CONFIG_CPU_BIG_ENDIAN) += $(shell $(CC) -dumpmachine |grep -q 'mips.*el-.*' && echo -EB $(undef-all) $(predef-be))
|
cflags-$(CONFIG_CPU_BIG_ENDIAN) += $(shell $(CC) -dumpmachine |grep -q 'mips.*el-.*' && echo -EB $(undef-all) $(predef-be))
|
||||||
cflags-$(CONFIG_CPU_LITTLE_ENDIAN) += $(shell $(CC) -dumpmachine |grep -q 'mips.*el-.*' || echo -EL $(undef-all) $(predef-le))
|
cflags-$(CONFIG_CPU_LITTLE_ENDIAN) += $(shell $(CC) -dumpmachine |grep -q 'mips.*el-.*' || echo -EL $(undef-all) $(predef-le))
|
||||||
|
|
||||||
cflags-$(CONFIG_CPU_HAS_SMARTMIPS) += $(call cc-option,-msmartmips)
|
# For smartmips configurations, there are hundreds of warnings due to ISA overrides
|
||||||
|
# in assembly and header files. smartmips is only supported for MIPS32r1 onwards
|
||||||
|
# and there is no support for 64-bit. Various '.set mips2' or '.set mips3' or
|
||||||
|
# similar directives in the kernel will spam the build logs with the following warnings:
|
||||||
|
# Warning: the `smartmips' extension requires MIPS32 revision 1 or greater
|
||||||
|
# or
|
||||||
|
# Warning: the 64-bit MIPS architecture does not support the `smartmips' extension
|
||||||
|
# Pass -Wa,--no-warn to disable all assembler warnings until the kernel code has
|
||||||
|
# been fixed properly.
|
||||||
|
cflags-$(CONFIG_CPU_HAS_SMARTMIPS) += $(call cc-option,-msmartmips) -Wa,--no-warn
|
||||||
cflags-$(CONFIG_CPU_MICROMIPS) += $(call cc-option,-mmicromips)
|
cflags-$(CONFIG_CPU_MICROMIPS) += $(call cc-option,-mmicromips)
|
||||||
|
|
||||||
cflags-$(CONFIG_SB1XXX_CORELIS) += $(call cc-option,-mno-sched-prolog) \
|
cflags-$(CONFIG_SB1XXX_CORELIS) += $(call cc-option,-mno-sched-prolog) \
|
||||||
|
|
|
@ -434,7 +434,7 @@ static void bcm63xx_init_irq(void)
|
||||||
irq_stat_addr[0] += PERF_IRQSTAT_3368_REG;
|
irq_stat_addr[0] += PERF_IRQSTAT_3368_REG;
|
||||||
irq_mask_addr[0] += PERF_IRQMASK_3368_REG;
|
irq_mask_addr[0] += PERF_IRQMASK_3368_REG;
|
||||||
irq_stat_addr[1] = 0;
|
irq_stat_addr[1] = 0;
|
||||||
irq_stat_addr[1] = 0;
|
irq_mask_addr[1] = 0;
|
||||||
irq_bits = 32;
|
irq_bits = 32;
|
||||||
ext_irq_count = 4;
|
ext_irq_count = 4;
|
||||||
ext_irq_cfg_reg1 = PERF_EXTIRQ_CFG_REG_3368;
|
ext_irq_cfg_reg1 = PERF_EXTIRQ_CFG_REG_3368;
|
||||||
|
@ -443,7 +443,7 @@ static void bcm63xx_init_irq(void)
|
||||||
irq_stat_addr[0] += PERF_IRQSTAT_6328_REG(0);
|
irq_stat_addr[0] += PERF_IRQSTAT_6328_REG(0);
|
||||||
irq_mask_addr[0] += PERF_IRQMASK_6328_REG(0);
|
irq_mask_addr[0] += PERF_IRQMASK_6328_REG(0);
|
||||||
irq_stat_addr[1] += PERF_IRQSTAT_6328_REG(1);
|
irq_stat_addr[1] += PERF_IRQSTAT_6328_REG(1);
|
||||||
irq_stat_addr[1] += PERF_IRQMASK_6328_REG(1);
|
irq_mask_addr[1] += PERF_IRQMASK_6328_REG(1);
|
||||||
irq_bits = 64;
|
irq_bits = 64;
|
||||||
ext_irq_count = 4;
|
ext_irq_count = 4;
|
||||||
is_ext_irq_cascaded = 1;
|
is_ext_irq_cascaded = 1;
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
|
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/string.h>
|
||||||
|
|
||||||
#include <asm/addrspace.h>
|
#include <asm/addrspace.h>
|
||||||
|
|
||||||
|
|
|
@ -16,8 +16,8 @@
|
||||||
extern void octeon_cop2_save(struct octeon_cop2_state *);
|
extern void octeon_cop2_save(struct octeon_cop2_state *);
|
||||||
extern void octeon_cop2_restore(struct octeon_cop2_state *);
|
extern void octeon_cop2_restore(struct octeon_cop2_state *);
|
||||||
|
|
||||||
#define cop2_save(r) octeon_cop2_save(r)
|
#define cop2_save(r) octeon_cop2_save(&(r)->thread.cp2)
|
||||||
#define cop2_restore(r) octeon_cop2_restore(r)
|
#define cop2_restore(r) octeon_cop2_restore(&(r)->thread.cp2)
|
||||||
|
|
||||||
#define cop2_present 1
|
#define cop2_present 1
|
||||||
#define cop2_lazy_restore 1
|
#define cop2_lazy_restore 1
|
||||||
|
@ -26,26 +26,26 @@ extern void octeon_cop2_restore(struct octeon_cop2_state *);
|
||||||
|
|
||||||
extern void nlm_cop2_save(struct nlm_cop2_state *);
|
extern void nlm_cop2_save(struct nlm_cop2_state *);
|
||||||
extern void nlm_cop2_restore(struct nlm_cop2_state *);
|
extern void nlm_cop2_restore(struct nlm_cop2_state *);
|
||||||
#define cop2_save(r) nlm_cop2_save(r)
|
|
||||||
#define cop2_restore(r) nlm_cop2_restore(r)
|
#define cop2_save(r) nlm_cop2_save(&(r)->thread.cp2)
|
||||||
|
#define cop2_restore(r) nlm_cop2_restore(&(r)->thread.cp2)
|
||||||
|
|
||||||
#define cop2_present 1
|
#define cop2_present 1
|
||||||
#define cop2_lazy_restore 0
|
#define cop2_lazy_restore 0
|
||||||
|
|
||||||
#elif defined(CONFIG_CPU_LOONGSON3)
|
#elif defined(CONFIG_CPU_LOONGSON3)
|
||||||
|
|
||||||
#define cop2_save(r)
|
|
||||||
#define cop2_restore(r)
|
|
||||||
|
|
||||||
#define cop2_present 1
|
#define cop2_present 1
|
||||||
#define cop2_lazy_restore 1
|
#define cop2_lazy_restore 1
|
||||||
|
#define cop2_save(r) do { (r); } while (0)
|
||||||
|
#define cop2_restore(r) do { (r); } while (0)
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#define cop2_present 0
|
#define cop2_present 0
|
||||||
#define cop2_lazy_restore 0
|
#define cop2_lazy_restore 0
|
||||||
#define cop2_save(r)
|
#define cop2_save(r) do { (r); } while (0)
|
||||||
#define cop2_restore(r)
|
#define cop2_restore(r) do { (r); } while (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
enum cu2_ops {
|
enum cu2_ops {
|
||||||
|
|
|
@ -11,15 +11,8 @@
|
||||||
#ifndef _ASM_MACH_IP28_SPACES_H
|
#ifndef _ASM_MACH_IP28_SPACES_H
|
||||||
#define _ASM_MACH_IP28_SPACES_H
|
#define _ASM_MACH_IP28_SPACES_H
|
||||||
|
|
||||||
#define CAC_BASE _AC(0xa800000000000000, UL)
|
|
||||||
|
|
||||||
#define HIGHMEM_START (~0UL)
|
|
||||||
|
|
||||||
#define PHYS_OFFSET _AC(0x20000000, UL)
|
#define PHYS_OFFSET _AC(0x20000000, UL)
|
||||||
|
|
||||||
#define UNCAC_BASE _AC(0xc0000000, UL) /* 0xa0000000 + PHYS_OFFSET */
|
|
||||||
#define IO_BASE UNCAC_BASE
|
|
||||||
|
|
||||||
#include <asm/mach-generic/spaces.h>
|
#include <asm/mach-generic/spaces.h>
|
||||||
|
|
||||||
#endif /* _ASM_MACH_IP28_SPACES_H */
|
#endif /* _ASM_MACH_IP28_SPACES_H */
|
||||||
|
|
|
@ -37,7 +37,7 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is used for calculating the real page sizes
|
* This is used for calculating the real page sizes
|
||||||
* for FTLB or VTLB + FTLB confugrations.
|
* for FTLB or VTLB + FTLB configurations.
|
||||||
*/
|
*/
|
||||||
static inline unsigned int page_size_ftlb(unsigned int mmuextdef)
|
static inline unsigned int page_size_ftlb(unsigned int mmuextdef)
|
||||||
{
|
{
|
||||||
|
@ -223,7 +223,8 @@ static inline int pfn_valid(unsigned long pfn)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define virt_to_page(kaddr) pfn_to_page(PFN_DOWN(virt_to_phys(kaddr)))
|
#define virt_to_page(kaddr) pfn_to_page(PFN_DOWN(virt_to_phys((void *) \
|
||||||
|
(kaddr))))
|
||||||
|
|
||||||
extern int __virt_addr_valid(const volatile void *kaddr);
|
extern int __virt_addr_valid(const volatile void *kaddr);
|
||||||
#define virt_addr_valid(kaddr) \
|
#define virt_addr_valid(kaddr) \
|
||||||
|
|
|
@ -37,11 +37,6 @@ extern int __cpu_logical_map[NR_CPUS];
|
||||||
|
|
||||||
#define NO_PROC_ID (-1)
|
#define NO_PROC_ID (-1)
|
||||||
|
|
||||||
#define topology_physical_package_id(cpu) (cpu_data[cpu].package)
|
|
||||||
#define topology_core_id(cpu) (cpu_data[cpu].core)
|
|
||||||
#define topology_core_cpumask(cpu) (&cpu_core_map[cpu])
|
|
||||||
#define topology_thread_cpumask(cpu) (&cpu_sibling_map[cpu])
|
|
||||||
|
|
||||||
#define SMP_RESCHEDULE_YOURSELF 0x1 /* XXX braindead */
|
#define SMP_RESCHEDULE_YOURSELF 0x1 /* XXX braindead */
|
||||||
#define SMP_CALL_FUNCTION 0x2
|
#define SMP_CALL_FUNCTION 0x2
|
||||||
/* Octeon - Tell another core to flush its icache */
|
/* Octeon - Tell another core to flush its icache */
|
||||||
|
|
|
@ -92,7 +92,7 @@ do { \
|
||||||
KSTK_STATUS(prev) &= ~ST0_CU2; \
|
KSTK_STATUS(prev) &= ~ST0_CU2; \
|
||||||
__c0_stat = read_c0_status(); \
|
__c0_stat = read_c0_status(); \
|
||||||
write_c0_status(__c0_stat | ST0_CU2); \
|
write_c0_status(__c0_stat | ST0_CU2); \
|
||||||
cop2_save(&prev->thread.cp2); \
|
cop2_save(prev); \
|
||||||
write_c0_status(__c0_stat & ~ST0_CU2); \
|
write_c0_status(__c0_stat & ~ST0_CU2); \
|
||||||
} \
|
} \
|
||||||
__clear_software_ll_bit(); \
|
__clear_software_ll_bit(); \
|
||||||
|
@ -111,7 +111,7 @@ do { \
|
||||||
(KSTK_STATUS(current) & ST0_CU2)) { \
|
(KSTK_STATUS(current) & ST0_CU2)) { \
|
||||||
__c0_stat = read_c0_status(); \
|
__c0_stat = read_c0_status(); \
|
||||||
write_c0_status(__c0_stat | ST0_CU2); \
|
write_c0_status(__c0_stat | ST0_CU2); \
|
||||||
cop2_restore(¤t->thread.cp2); \
|
cop2_restore(current); \
|
||||||
write_c0_status(__c0_stat & ~ST0_CU2); \
|
write_c0_status(__c0_stat & ~ST0_CU2); \
|
||||||
} \
|
} \
|
||||||
if (cpu_has_dsp) \
|
if (cpu_has_dsp) \
|
||||||
|
|
|
@ -9,5 +9,13 @@
|
||||||
#define __ASM_TOPOLOGY_H
|
#define __ASM_TOPOLOGY_H
|
||||||
|
|
||||||
#include <topology.h>
|
#include <topology.h>
|
||||||
|
#include <linux/smp.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
#define topology_physical_package_id(cpu) (cpu_data[cpu].package)
|
||||||
|
#define topology_core_id(cpu) (cpu_data[cpu].core)
|
||||||
|
#define topology_core_cpumask(cpu) (&cpu_core_map[cpu])
|
||||||
|
#define topology_thread_cpumask(cpu) (&cpu_sibling_map[cpu])
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* __ASM_TOPOLOGY_H */
|
#endif /* __ASM_TOPOLOGY_H */
|
||||||
|
|
|
@ -373,16 +373,18 @@
|
||||||
#define __NR_sched_getattr (__NR_Linux + 350)
|
#define __NR_sched_getattr (__NR_Linux + 350)
|
||||||
#define __NR_renameat2 (__NR_Linux + 351)
|
#define __NR_renameat2 (__NR_Linux + 351)
|
||||||
#define __NR_seccomp (__NR_Linux + 352)
|
#define __NR_seccomp (__NR_Linux + 352)
|
||||||
|
#define __NR_getrandom (__NR_Linux + 353)
|
||||||
|
#define __NR_memfd_create (__NR_Linux + 354)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Offset of the last Linux o32 flavoured syscall
|
* Offset of the last Linux o32 flavoured syscall
|
||||||
*/
|
*/
|
||||||
#define __NR_Linux_syscalls 352
|
#define __NR_Linux_syscalls 354
|
||||||
|
|
||||||
#endif /* _MIPS_SIM == _MIPS_SIM_ABI32 */
|
#endif /* _MIPS_SIM == _MIPS_SIM_ABI32 */
|
||||||
|
|
||||||
#define __NR_O32_Linux 4000
|
#define __NR_O32_Linux 4000
|
||||||
#define __NR_O32_Linux_syscalls 352
|
#define __NR_O32_Linux_syscalls 354
|
||||||
|
|
||||||
#if _MIPS_SIM == _MIPS_SIM_ABI64
|
#if _MIPS_SIM == _MIPS_SIM_ABI64
|
||||||
|
|
||||||
|
@ -703,16 +705,18 @@
|
||||||
#define __NR_sched_getattr (__NR_Linux + 310)
|
#define __NR_sched_getattr (__NR_Linux + 310)
|
||||||
#define __NR_renameat2 (__NR_Linux + 311)
|
#define __NR_renameat2 (__NR_Linux + 311)
|
||||||
#define __NR_seccomp (__NR_Linux + 312)
|
#define __NR_seccomp (__NR_Linux + 312)
|
||||||
|
#define __NR_getrandom (__NR_Linux + 313)
|
||||||
|
#define __NR_memfd_create (__NR_Linux + 314)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Offset of the last Linux 64-bit flavoured syscall
|
* Offset of the last Linux 64-bit flavoured syscall
|
||||||
*/
|
*/
|
||||||
#define __NR_Linux_syscalls 312
|
#define __NR_Linux_syscalls 314
|
||||||
|
|
||||||
#endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */
|
#endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */
|
||||||
|
|
||||||
#define __NR_64_Linux 5000
|
#define __NR_64_Linux 5000
|
||||||
#define __NR_64_Linux_syscalls 312
|
#define __NR_64_Linux_syscalls 314
|
||||||
|
|
||||||
#if _MIPS_SIM == _MIPS_SIM_NABI32
|
#if _MIPS_SIM == _MIPS_SIM_NABI32
|
||||||
|
|
||||||
|
@ -1037,15 +1041,17 @@
|
||||||
#define __NR_sched_getattr (__NR_Linux + 314)
|
#define __NR_sched_getattr (__NR_Linux + 314)
|
||||||
#define __NR_renameat2 (__NR_Linux + 315)
|
#define __NR_renameat2 (__NR_Linux + 315)
|
||||||
#define __NR_seccomp (__NR_Linux + 316)
|
#define __NR_seccomp (__NR_Linux + 316)
|
||||||
|
#define __NR_getrandom (__NR_Linux + 317)
|
||||||
|
#define __NR_memfd_create (__NR_Linux + 318)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Offset of the last N32 flavoured syscall
|
* Offset of the last N32 flavoured syscall
|
||||||
*/
|
*/
|
||||||
#define __NR_Linux_syscalls 316
|
#define __NR_Linux_syscalls 318
|
||||||
|
|
||||||
#endif /* _MIPS_SIM == _MIPS_SIM_NABI32 */
|
#endif /* _MIPS_SIM == _MIPS_SIM_NABI32 */
|
||||||
|
|
||||||
#define __NR_N32_Linux 6000
|
#define __NR_N32_Linux 6000
|
||||||
#define __NR_N32_Linux_syscalls 316
|
#define __NR_N32_Linux_syscalls 318
|
||||||
|
|
||||||
#endif /* _UAPI_ASM_UNISTD_H */
|
#endif /* _UAPI_ASM_UNISTD_H */
|
||||||
|
|
|
@ -71,8 +71,12 @@ machine_kexec(struct kimage *image)
|
||||||
kexec_start_address =
|
kexec_start_address =
|
||||||
(unsigned long) phys_to_virt(image->start);
|
(unsigned long) phys_to_virt(image->start);
|
||||||
|
|
||||||
kexec_indirection_page =
|
if (image->type == KEXEC_TYPE_DEFAULT) {
|
||||||
(unsigned long) phys_to_virt(image->head & PAGE_MASK);
|
kexec_indirection_page =
|
||||||
|
(unsigned long) phys_to_virt(image->head & PAGE_MASK);
|
||||||
|
} else {
|
||||||
|
kexec_indirection_page = (unsigned long)&image->head;
|
||||||
|
}
|
||||||
|
|
||||||
memcpy((void*)reboot_code_buffer, relocate_new_kernel,
|
memcpy((void*)reboot_code_buffer, relocate_new_kernel,
|
||||||
relocate_new_kernel_size);
|
relocate_new_kernel_size);
|
||||||
|
|
|
@ -577,3 +577,5 @@ EXPORT(sys_call_table)
|
||||||
PTR sys_sched_getattr /* 4350 */
|
PTR sys_sched_getattr /* 4350 */
|
||||||
PTR sys_renameat2
|
PTR sys_renameat2
|
||||||
PTR sys_seccomp
|
PTR sys_seccomp
|
||||||
|
PTR sys_getrandom
|
||||||
|
PTR sys_memfd_create
|
||||||
|
|
|
@ -432,4 +432,6 @@ EXPORT(sys_call_table)
|
||||||
PTR sys_sched_getattr /* 5310 */
|
PTR sys_sched_getattr /* 5310 */
|
||||||
PTR sys_renameat2
|
PTR sys_renameat2
|
||||||
PTR sys_seccomp
|
PTR sys_seccomp
|
||||||
|
PTR sys_getrandom
|
||||||
|
PTR sys_memfd_create
|
||||||
.size sys_call_table,.-sys_call_table
|
.size sys_call_table,.-sys_call_table
|
||||||
|
|
|
@ -425,4 +425,6 @@ EXPORT(sysn32_call_table)
|
||||||
PTR sys_sched_getattr
|
PTR sys_sched_getattr
|
||||||
PTR sys_renameat2 /* 6315 */
|
PTR sys_renameat2 /* 6315 */
|
||||||
PTR sys_seccomp
|
PTR sys_seccomp
|
||||||
|
PTR sys_getrandom
|
||||||
|
PTR sys_memfd_create
|
||||||
.size sysn32_call_table,.-sysn32_call_table
|
.size sysn32_call_table,.-sysn32_call_table
|
||||||
|
|
|
@ -562,4 +562,6 @@ EXPORT(sys32_call_table)
|
||||||
PTR sys_sched_getattr /* 4350 */
|
PTR sys_sched_getattr /* 4350 */
|
||||||
PTR sys_renameat2
|
PTR sys_renameat2
|
||||||
PTR sys_seccomp
|
PTR sys_seccomp
|
||||||
|
PTR sys_getrandom
|
||||||
|
PTR sys_memfd_create
|
||||||
.size sys32_call_table,.-sys32_call_table
|
.size sys32_call_table,.-sys32_call_table
|
||||||
|
|
|
@ -793,6 +793,7 @@ static int build_body(struct jit_ctx *ctx)
|
||||||
const struct sock_filter *inst;
|
const struct sock_filter *inst;
|
||||||
unsigned int i, off, load_order, condt;
|
unsigned int i, off, load_order, condt;
|
||||||
u32 k, b_off __maybe_unused;
|
u32 k, b_off __maybe_unused;
|
||||||
|
int tmp;
|
||||||
|
|
||||||
for (i = 0; i < prog->len; i++) {
|
for (i = 0; i < prog->len; i++) {
|
||||||
u16 code;
|
u16 code;
|
||||||
|
@ -1332,9 +1333,9 @@ jmp_cmp:
|
||||||
case BPF_ANC | SKF_AD_PKTTYPE:
|
case BPF_ANC | SKF_AD_PKTTYPE:
|
||||||
ctx->flags |= SEEN_SKB;
|
ctx->flags |= SEEN_SKB;
|
||||||
|
|
||||||
off = pkt_type_offset();
|
tmp = off = pkt_type_offset();
|
||||||
|
|
||||||
if (off < 0)
|
if (tmp < 0)
|
||||||
return -1;
|
return -1;
|
||||||
emit_load_byte(r_tmp, r_skb, off, ctx);
|
emit_load_byte(r_tmp, r_skb, off, ctx);
|
||||||
/* Keep only the last 3 bits */
|
/* Keep only the last 3 bits */
|
||||||
|
|
|
@ -1032,7 +1032,6 @@ struct boot_params *make_boot_params(struct efi_config *c)
|
||||||
int i;
|
int i;
|
||||||
unsigned long ramdisk_addr;
|
unsigned long ramdisk_addr;
|
||||||
unsigned long ramdisk_size;
|
unsigned long ramdisk_size;
|
||||||
unsigned long initrd_addr_max;
|
|
||||||
|
|
||||||
efi_early = c;
|
efi_early = c;
|
||||||
sys_table = (efi_system_table_t *)(unsigned long)efi_early->table;
|
sys_table = (efi_system_table_t *)(unsigned long)efi_early->table;
|
||||||
|
@ -1095,15 +1094,20 @@ struct boot_params *make_boot_params(struct efi_config *c)
|
||||||
|
|
||||||
memset(sdt, 0, sizeof(*sdt));
|
memset(sdt, 0, sizeof(*sdt));
|
||||||
|
|
||||||
if (hdr->xloadflags & XLF_CAN_BE_LOADED_ABOVE_4G)
|
|
||||||
initrd_addr_max = -1UL;
|
|
||||||
else
|
|
||||||
initrd_addr_max = hdr->initrd_addr_max;
|
|
||||||
|
|
||||||
status = handle_cmdline_files(sys_table, image,
|
status = handle_cmdline_files(sys_table, image,
|
||||||
(char *)(unsigned long)hdr->cmd_line_ptr,
|
(char *)(unsigned long)hdr->cmd_line_ptr,
|
||||||
"initrd=", initrd_addr_max,
|
"initrd=", hdr->initrd_addr_max,
|
||||||
&ramdisk_addr, &ramdisk_size);
|
&ramdisk_addr, &ramdisk_size);
|
||||||
|
|
||||||
|
if (status != EFI_SUCCESS &&
|
||||||
|
hdr->xloadflags & XLF_CAN_BE_LOADED_ABOVE_4G) {
|
||||||
|
efi_printk(sys_table, "Trying to load files to higher address\n");
|
||||||
|
status = handle_cmdline_files(sys_table, image,
|
||||||
|
(char *)(unsigned long)hdr->cmd_line_ptr,
|
||||||
|
"initrd=", -1UL,
|
||||||
|
&ramdisk_addr, &ramdisk_size);
|
||||||
|
}
|
||||||
|
|
||||||
if (status != EFI_SUCCESS)
|
if (status != EFI_SUCCESS)
|
||||||
goto fail2;
|
goto fail2;
|
||||||
hdr->ramdisk_image = ramdisk_addr & 0xffffffff;
|
hdr->ramdisk_image = ramdisk_addr & 0xffffffff;
|
||||||
|
|
|
@ -30,6 +30,33 @@
|
||||||
#include <asm/boot.h>
|
#include <asm/boot.h>
|
||||||
#include <asm/asm-offsets.h>
|
#include <asm/asm-offsets.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Adjust our own GOT
|
||||||
|
*
|
||||||
|
* The relocation base must be in %ebx
|
||||||
|
*
|
||||||
|
* It is safe to call this macro more than once, because in some of the
|
||||||
|
* code paths multiple invocations are inevitable, e.g. via the efi*
|
||||||
|
* entry points.
|
||||||
|
*
|
||||||
|
* Relocation is only performed the first time.
|
||||||
|
*/
|
||||||
|
.macro FIXUP_GOT
|
||||||
|
cmpb $1, got_fixed(%ebx)
|
||||||
|
je 2f
|
||||||
|
|
||||||
|
leal _got(%ebx), %edx
|
||||||
|
leal _egot(%ebx), %ecx
|
||||||
|
1:
|
||||||
|
cmpl %ecx, %edx
|
||||||
|
jae 2f
|
||||||
|
addl %ebx, (%edx)
|
||||||
|
addl $4, %edx
|
||||||
|
jmp 1b
|
||||||
|
2:
|
||||||
|
movb $1, got_fixed(%ebx)
|
||||||
|
.endm
|
||||||
|
|
||||||
__HEAD
|
__HEAD
|
||||||
ENTRY(startup_32)
|
ENTRY(startup_32)
|
||||||
#ifdef CONFIG_EFI_STUB
|
#ifdef CONFIG_EFI_STUB
|
||||||
|
@ -56,6 +83,9 @@ ENTRY(efi_pe_entry)
|
||||||
add %esi, 88(%eax)
|
add %esi, 88(%eax)
|
||||||
pushl %eax
|
pushl %eax
|
||||||
|
|
||||||
|
movl %esi, %ebx
|
||||||
|
FIXUP_GOT
|
||||||
|
|
||||||
call make_boot_params
|
call make_boot_params
|
||||||
cmpl $0, %eax
|
cmpl $0, %eax
|
||||||
je fail
|
je fail
|
||||||
|
@ -81,6 +111,10 @@ ENTRY(efi32_stub_entry)
|
||||||
leal efi32_config(%esi), %eax
|
leal efi32_config(%esi), %eax
|
||||||
add %esi, 88(%eax)
|
add %esi, 88(%eax)
|
||||||
pushl %eax
|
pushl %eax
|
||||||
|
|
||||||
|
movl %esi, %ebx
|
||||||
|
FIXUP_GOT
|
||||||
|
|
||||||
2:
|
2:
|
||||||
call efi_main
|
call efi_main
|
||||||
cmpl $0, %eax
|
cmpl $0, %eax
|
||||||
|
@ -190,19 +224,7 @@ relocated:
|
||||||
shrl $2, %ecx
|
shrl $2, %ecx
|
||||||
rep stosl
|
rep stosl
|
||||||
|
|
||||||
/*
|
FIXUP_GOT
|
||||||
* Adjust our own GOT
|
|
||||||
*/
|
|
||||||
leal _got(%ebx), %edx
|
|
||||||
leal _egot(%ebx), %ecx
|
|
||||||
1:
|
|
||||||
cmpl %ecx, %edx
|
|
||||||
jae 2f
|
|
||||||
addl %ebx, (%edx)
|
|
||||||
addl $4, %edx
|
|
||||||
jmp 1b
|
|
||||||
2:
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Do the decompression, and jump to the new kernel..
|
* Do the decompression, and jump to the new kernel..
|
||||||
*/
|
*/
|
||||||
|
@ -225,8 +247,12 @@ relocated:
|
||||||
xorl %ebx, %ebx
|
xorl %ebx, %ebx
|
||||||
jmp *%eax
|
jmp *%eax
|
||||||
|
|
||||||
#ifdef CONFIG_EFI_STUB
|
|
||||||
.data
|
.data
|
||||||
|
/* Have we relocated the GOT? */
|
||||||
|
got_fixed:
|
||||||
|
.byte 0
|
||||||
|
|
||||||
|
#ifdef CONFIG_EFI_STUB
|
||||||
efi32_config:
|
efi32_config:
|
||||||
.fill 11,8,0
|
.fill 11,8,0
|
||||||
.long efi_call_phys
|
.long efi_call_phys
|
||||||
|
|
|
@ -32,6 +32,33 @@
|
||||||
#include <asm/processor-flags.h>
|
#include <asm/processor-flags.h>
|
||||||
#include <asm/asm-offsets.h>
|
#include <asm/asm-offsets.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Adjust our own GOT
|
||||||
|
*
|
||||||
|
* The relocation base must be in %rbx
|
||||||
|
*
|
||||||
|
* It is safe to call this macro more than once, because in some of the
|
||||||
|
* code paths multiple invocations are inevitable, e.g. via the efi*
|
||||||
|
* entry points.
|
||||||
|
*
|
||||||
|
* Relocation is only performed the first time.
|
||||||
|
*/
|
||||||
|
.macro FIXUP_GOT
|
||||||
|
cmpb $1, got_fixed(%rip)
|
||||||
|
je 2f
|
||||||
|
|
||||||
|
leaq _got(%rip), %rdx
|
||||||
|
leaq _egot(%rip), %rcx
|
||||||
|
1:
|
||||||
|
cmpq %rcx, %rdx
|
||||||
|
jae 2f
|
||||||
|
addq %rbx, (%rdx)
|
||||||
|
addq $8, %rdx
|
||||||
|
jmp 1b
|
||||||
|
2:
|
||||||
|
movb $1, got_fixed(%rip)
|
||||||
|
.endm
|
||||||
|
|
||||||
__HEAD
|
__HEAD
|
||||||
.code32
|
.code32
|
||||||
ENTRY(startup_32)
|
ENTRY(startup_32)
|
||||||
|
@ -252,10 +279,13 @@ ENTRY(efi_pe_entry)
|
||||||
subq $1b, %rbp
|
subq $1b, %rbp
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Relocate efi_config->call().
|
* Relocate efi_config->call() and the GOT entries.
|
||||||
*/
|
*/
|
||||||
addq %rbp, efi64_config+88(%rip)
|
addq %rbp, efi64_config+88(%rip)
|
||||||
|
|
||||||
|
movq %rbp, %rbx
|
||||||
|
FIXUP_GOT
|
||||||
|
|
||||||
movq %rax, %rdi
|
movq %rax, %rdi
|
||||||
call make_boot_params
|
call make_boot_params
|
||||||
cmpq $0,%rax
|
cmpq $0,%rax
|
||||||
|
@ -271,10 +301,13 @@ handover_entry:
|
||||||
subq $1b, %rbp
|
subq $1b, %rbp
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Relocate efi_config->call().
|
* Relocate efi_config->call() and the GOT entries.
|
||||||
*/
|
*/
|
||||||
movq efi_config(%rip), %rax
|
movq efi_config(%rip), %rax
|
||||||
addq %rbp, 88(%rax)
|
addq %rbp, 88(%rax)
|
||||||
|
|
||||||
|
movq %rbp, %rbx
|
||||||
|
FIXUP_GOT
|
||||||
2:
|
2:
|
||||||
movq efi_config(%rip), %rdi
|
movq efi_config(%rip), %rdi
|
||||||
call efi_main
|
call efi_main
|
||||||
|
@ -385,19 +418,8 @@ relocated:
|
||||||
shrq $3, %rcx
|
shrq $3, %rcx
|
||||||
rep stosq
|
rep stosq
|
||||||
|
|
||||||
/*
|
FIXUP_GOT
|
||||||
* Adjust our own GOT
|
|
||||||
*/
|
|
||||||
leaq _got(%rip), %rdx
|
|
||||||
leaq _egot(%rip), %rcx
|
|
||||||
1:
|
|
||||||
cmpq %rcx, %rdx
|
|
||||||
jae 2f
|
|
||||||
addq %rbx, (%rdx)
|
|
||||||
addq $8, %rdx
|
|
||||||
jmp 1b
|
|
||||||
2:
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Do the decompression, and jump to the new kernel..
|
* Do the decompression, and jump to the new kernel..
|
||||||
*/
|
*/
|
||||||
|
@ -437,6 +459,10 @@ gdt:
|
||||||
.quad 0x0000000000000000 /* TS continued */
|
.quad 0x0000000000000000 /* TS continued */
|
||||||
gdt_end:
|
gdt_end:
|
||||||
|
|
||||||
|
/* Have we relocated the GOT? */
|
||||||
|
got_fixed:
|
||||||
|
.byte 0
|
||||||
|
|
||||||
#ifdef CONFIG_EFI_STUB
|
#ifdef CONFIG_EFI_STUB
|
||||||
efi_config:
|
efi_config:
|
||||||
.quad 0
|
.quad 0
|
||||||
|
|
|
@ -239,6 +239,7 @@ static inline int mp_find_ioapic(u32 gsi) { return 0; }
|
||||||
static inline u32 mp_pin_to_gsi(int ioapic, int pin) { return UINT_MAX; }
|
static inline u32 mp_pin_to_gsi(int ioapic, int pin) { return UINT_MAX; }
|
||||||
static inline int mp_map_gsi_to_irq(u32 gsi, unsigned int flags) { return gsi; }
|
static inline int mp_map_gsi_to_irq(u32 gsi, unsigned int flags) { return gsi; }
|
||||||
static inline void mp_unmap_irq(int irq) { }
|
static inline void mp_unmap_irq(int irq) { }
|
||||||
|
static inline bool mp_should_keep_irq(struct device *dev) { return 1; }
|
||||||
|
|
||||||
static inline int save_ioapic_entries(void)
|
static inline int save_ioapic_entries(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -338,8 +338,10 @@ int arch_prepare_optimized_kprobe(struct optimized_kprobe *op)
|
||||||
* a relative jump.
|
* a relative jump.
|
||||||
*/
|
*/
|
||||||
rel = (long)op->optinsn.insn - (long)op->kp.addr + RELATIVEJUMP_SIZE;
|
rel = (long)op->optinsn.insn - (long)op->kp.addr + RELATIVEJUMP_SIZE;
|
||||||
if (abs(rel) > 0x7fffffff)
|
if (abs(rel) > 0x7fffffff) {
|
||||||
|
__arch_remove_optimized_kprobe(op, 0);
|
||||||
return -ERANGE;
|
return -ERANGE;
|
||||||
|
}
|
||||||
|
|
||||||
buf = (u8 *)op->optinsn.insn;
|
buf = (u8 *)op->optinsn.insn;
|
||||||
|
|
||||||
|
|
|
@ -48,7 +48,9 @@ enum address_markers_idx {
|
||||||
LOW_KERNEL_NR,
|
LOW_KERNEL_NR,
|
||||||
VMALLOC_START_NR,
|
VMALLOC_START_NR,
|
||||||
VMEMMAP_START_NR,
|
VMEMMAP_START_NR,
|
||||||
|
# ifdef CONFIG_X86_ESPFIX64
|
||||||
ESPFIX_START_NR,
|
ESPFIX_START_NR,
|
||||||
|
# endif
|
||||||
HIGH_KERNEL_NR,
|
HIGH_KERNEL_NR,
|
||||||
MODULES_VADDR_NR,
|
MODULES_VADDR_NR,
|
||||||
MODULES_END_NR,
|
MODULES_END_NR,
|
||||||
|
@ -71,7 +73,9 @@ static struct addr_marker address_markers[] = {
|
||||||
{ PAGE_OFFSET, "Low Kernel Mapping" },
|
{ PAGE_OFFSET, "Low Kernel Mapping" },
|
||||||
{ VMALLOC_START, "vmalloc() Area" },
|
{ VMALLOC_START, "vmalloc() Area" },
|
||||||
{ VMEMMAP_START, "Vmemmap" },
|
{ VMEMMAP_START, "Vmemmap" },
|
||||||
|
# ifdef CONFIG_X86_ESPFIX64
|
||||||
{ ESPFIX_BASE_ADDR, "ESPfix Area", 16 },
|
{ ESPFIX_BASE_ADDR, "ESPfix Area", 16 },
|
||||||
|
# endif
|
||||||
{ __START_KERNEL_map, "High Kernel Mapping" },
|
{ __START_KERNEL_map, "High Kernel Mapping" },
|
||||||
{ MODULES_VADDR, "Modules" },
|
{ MODULES_VADDR, "Modules" },
|
||||||
{ MODULES_END, "End Modules" },
|
{ MODULES_END, "End Modules" },
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <asm/elf.h>
|
#include <asm/elf.h>
|
||||||
|
|
||||||
struct __read_mostly va_alignment va_align = {
|
struct va_alignment __read_mostly va_align = {
|
||||||
.flags = -1,
|
.flags = -1,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -326,27 +326,6 @@ static void pci_fixup_video(struct pci_dev *pdev)
|
||||||
struct pci_bus *bus;
|
struct pci_bus *bus;
|
||||||
u16 config;
|
u16 config;
|
||||||
|
|
||||||
if (!vga_default_device()) {
|
|
||||||
resource_size_t start, end;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
/* Does firmware framebuffer belong to us? */
|
|
||||||
for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
|
|
||||||
if (!(pci_resource_flags(pdev, i) & IORESOURCE_MEM))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
start = pci_resource_start(pdev, i);
|
|
||||||
end = pci_resource_end(pdev, i);
|
|
||||||
|
|
||||||
if (!start || !end)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (screen_info.lfb_base >= start &&
|
|
||||||
(screen_info.lfb_base + screen_info.lfb_size) < end)
|
|
||||||
vga_set_default_device(pdev);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Is VGA routed to us? */
|
/* Is VGA routed to us? */
|
||||||
bus = pdev->bus;
|
bus = pdev->bus;
|
||||||
while (bus) {
|
while (bus) {
|
||||||
|
@ -371,8 +350,7 @@ static void pci_fixup_video(struct pci_dev *pdev)
|
||||||
pci_read_config_word(pdev, PCI_COMMAND, &config);
|
pci_read_config_word(pdev, PCI_COMMAND, &config);
|
||||||
if (config & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) {
|
if (config & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) {
|
||||||
pdev->resource[PCI_ROM_RESOURCE].flags |= IORESOURCE_ROM_SHADOW;
|
pdev->resource[PCI_ROM_RESOURCE].flags |= IORESOURCE_ROM_SHADOW;
|
||||||
dev_printk(KERN_DEBUG, &pdev->dev, "Boot video device\n");
|
dev_printk(KERN_DEBUG, &pdev->dev, "Video device with shadowed ROM\n");
|
||||||
vga_set_default_device(pdev);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1922,9 +1922,6 @@ static inline int __init drbg_healthcheck_sanity(void)
|
||||||
/* overflow max addtllen with personalization string */
|
/* overflow max addtllen with personalization string */
|
||||||
ret = drbg_instantiate(drbg, &addtl, coreref, pr);
|
ret = drbg_instantiate(drbg, &addtl, coreref, pr);
|
||||||
BUG_ON(0 == ret);
|
BUG_ON(0 == ret);
|
||||||
/* test uninstantated DRBG */
|
|
||||||
len = drbg_generate(drbg, buf, (max_request_bytes + 1), NULL);
|
|
||||||
BUG_ON(0 < len);
|
|
||||||
/* all tests passed */
|
/* all tests passed */
|
||||||
rc = 0;
|
rc = 0;
|
||||||
|
|
||||||
|
|
|
@ -177,16 +177,6 @@ void acpi_bus_detach_private_data(acpi_handle handle)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(acpi_bus_detach_private_data);
|
EXPORT_SYMBOL_GPL(acpi_bus_detach_private_data);
|
||||||
|
|
||||||
void acpi_bus_no_hotplug(acpi_handle handle)
|
|
||||||
{
|
|
||||||
struct acpi_device *adev = NULL;
|
|
||||||
|
|
||||||
acpi_bus_get_device(handle, &adev);
|
|
||||||
if (adev)
|
|
||||||
adev->flags.no_hotplug = true;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(acpi_bus_no_hotplug);
|
|
||||||
|
|
||||||
static void acpi_print_osc_error(acpi_handle handle,
|
static void acpi_print_osc_error(acpi_handle handle,
|
||||||
struct acpi_osc_context *context, char *error)
|
struct acpi_osc_context *context, char *error)
|
||||||
{
|
{
|
||||||
|
|
|
@ -512,7 +512,14 @@ void regmap_debugfs_init(struct regmap *map, const char *name)
|
||||||
map, ®map_reg_ranges_fops);
|
map, ®map_reg_ranges_fops);
|
||||||
|
|
||||||
if (map->max_register || regmap_readable(map, 0)) {
|
if (map->max_register || regmap_readable(map, 0)) {
|
||||||
debugfs_create_file("registers", 0400, map->debugfs,
|
umode_t registers_mode;
|
||||||
|
|
||||||
|
if (IS_ENABLED(REGMAP_ALLOW_WRITE_DEBUGFS))
|
||||||
|
registers_mode = 0600;
|
||||||
|
else
|
||||||
|
registers_mode = 0400;
|
||||||
|
|
||||||
|
debugfs_create_file("registers", registers_mode, map->debugfs,
|
||||||
map, ®map_map_fops);
|
map, ®map_map_fops);
|
||||||
debugfs_create_file("access", 0400, map->debugfs,
|
debugfs_create_file("access", 0400, map->debugfs,
|
||||||
map, ®map_access_fops);
|
map, ®map_access_fops);
|
||||||
|
|
|
@ -36,6 +36,7 @@ struct virtrng_info {
|
||||||
int index;
|
int index;
|
||||||
bool busy;
|
bool busy;
|
||||||
bool hwrng_register_done;
|
bool hwrng_register_done;
|
||||||
|
bool hwrng_removed;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -68,6 +69,9 @@ static int virtio_read(struct hwrng *rng, void *buf, size_t size, bool wait)
|
||||||
int ret;
|
int ret;
|
||||||
struct virtrng_info *vi = (struct virtrng_info *)rng->priv;
|
struct virtrng_info *vi = (struct virtrng_info *)rng->priv;
|
||||||
|
|
||||||
|
if (vi->hwrng_removed)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
if (!vi->busy) {
|
if (!vi->busy) {
|
||||||
vi->busy = true;
|
vi->busy = true;
|
||||||
init_completion(&vi->have_data);
|
init_completion(&vi->have_data);
|
||||||
|
@ -137,6 +141,9 @@ static void remove_common(struct virtio_device *vdev)
|
||||||
{
|
{
|
||||||
struct virtrng_info *vi = vdev->priv;
|
struct virtrng_info *vi = vdev->priv;
|
||||||
|
|
||||||
|
vi->hwrng_removed = true;
|
||||||
|
vi->data_avail = 0;
|
||||||
|
complete(&vi->have_data);
|
||||||
vdev->config->reset(vdev);
|
vdev->config->reset(vdev);
|
||||||
vi->busy = false;
|
vi->busy = false;
|
||||||
if (vi->hwrng_register_done)
|
if (vi->hwrng_register_done)
|
||||||
|
|
|
@ -22,7 +22,7 @@ efi_status_t update_fdt(efi_system_table_t *sys_table, void *orig_fdt,
|
||||||
unsigned long map_size, unsigned long desc_size,
|
unsigned long map_size, unsigned long desc_size,
|
||||||
u32 desc_ver)
|
u32 desc_ver)
|
||||||
{
|
{
|
||||||
int node, prev;
|
int node, prev, num_rsv;
|
||||||
int status;
|
int status;
|
||||||
u32 fdt_val32;
|
u32 fdt_val32;
|
||||||
u64 fdt_val64;
|
u64 fdt_val64;
|
||||||
|
@ -73,6 +73,14 @@ efi_status_t update_fdt(efi_system_table_t *sys_table, void *orig_fdt,
|
||||||
prev = node;
|
prev = node;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Delete all memory reserve map entries. When booting via UEFI,
|
||||||
|
* kernel will use the UEFI memory map to find reserved regions.
|
||||||
|
*/
|
||||||
|
num_rsv = fdt_num_mem_rsv(fdt);
|
||||||
|
while (num_rsv-- > 0)
|
||||||
|
fdt_del_mem_rsv(fdt, num_rsv);
|
||||||
|
|
||||||
node = fdt_subnode_offset(fdt, 0, "chosen");
|
node = fdt_subnode_offset(fdt, 0, "chosen");
|
||||||
if (node < 0) {
|
if (node < 0) {
|
||||||
node = fdt_add_subnode(fdt, 0, "chosen");
|
node = fdt_add_subnode(fdt, 0, "chosen");
|
||||||
|
|
|
@ -250,6 +250,7 @@ static void bochs_connector_init(struct drm_device *dev)
|
||||||
DRM_MODE_CONNECTOR_VIRTUAL);
|
DRM_MODE_CONNECTOR_VIRTUAL);
|
||||||
drm_connector_helper_add(connector,
|
drm_connector_helper_add(connector,
|
||||||
&bochs_connector_connector_helper_funcs);
|
&bochs_connector_connector_helper_funcs);
|
||||||
|
drm_connector_register(connector);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -555,6 +555,7 @@ static struct drm_connector *cirrus_vga_init(struct drm_device *dev)
|
||||||
|
|
||||||
drm_connector_helper_add(connector, &cirrus_vga_connector_helper_funcs);
|
drm_connector_helper_add(connector, &cirrus_vga_connector_helper_funcs);
|
||||||
|
|
||||||
|
drm_connector_register(connector);
|
||||||
return connector;
|
return connector;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1631,6 +1631,10 @@ static void intel_dp_get_config(struct intel_encoder *encoder,
|
||||||
|
|
||||||
pipe_config->adjusted_mode.flags |= flags;
|
pipe_config->adjusted_mode.flags |= flags;
|
||||||
|
|
||||||
|
if (!HAS_PCH_SPLIT(dev) && !IS_VALLEYVIEW(dev) &&
|
||||||
|
tmp & DP_COLOR_RANGE_16_235)
|
||||||
|
pipe_config->limited_color_range = true;
|
||||||
|
|
||||||
pipe_config->has_dp_encoder = true;
|
pipe_config->has_dp_encoder = true;
|
||||||
|
|
||||||
intel_dp_get_m_n(crtc, pipe_config);
|
intel_dp_get_m_n(crtc, pipe_config);
|
||||||
|
|
|
@ -712,7 +712,8 @@ static void intel_hdmi_get_config(struct intel_encoder *encoder,
|
||||||
struct intel_crtc_config *pipe_config)
|
struct intel_crtc_config *pipe_config)
|
||||||
{
|
{
|
||||||
struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
|
struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
|
||||||
struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
|
struct drm_device *dev = encoder->base.dev;
|
||||||
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||||
u32 tmp, flags = 0;
|
u32 tmp, flags = 0;
|
||||||
int dotclock;
|
int dotclock;
|
||||||
|
|
||||||
|
@ -734,6 +735,10 @@ static void intel_hdmi_get_config(struct intel_encoder *encoder,
|
||||||
if (tmp & HDMI_MODE_SELECT_HDMI)
|
if (tmp & HDMI_MODE_SELECT_HDMI)
|
||||||
pipe_config->has_audio = true;
|
pipe_config->has_audio = true;
|
||||||
|
|
||||||
|
if (!HAS_PCH_SPLIT(dev) &&
|
||||||
|
tmp & HDMI_COLOR_RANGE_16_235)
|
||||||
|
pipe_config->limited_color_range = true;
|
||||||
|
|
||||||
pipe_config->adjusted_mode.flags |= flags;
|
pipe_config->adjusted_mode.flags |= flags;
|
||||||
|
|
||||||
if ((tmp & SDVO_COLOR_FORMAT_MASK) == HDMI_COLOR_FORMAT_12bpc)
|
if ((tmp & SDVO_COLOR_FORMAT_MASK) == HDMI_COLOR_FORMAT_12bpc)
|
||||||
|
|
|
@ -1400,7 +1400,7 @@ i830_dispatch_execbuffer(struct intel_engine_cs *ring,
|
||||||
*/
|
*/
|
||||||
intel_ring_emit(ring, SRC_COPY_BLT_CMD | BLT_WRITE_RGBA);
|
intel_ring_emit(ring, SRC_COPY_BLT_CMD | BLT_WRITE_RGBA);
|
||||||
intel_ring_emit(ring, BLT_DEPTH_32 | BLT_ROP_SRC_COPY | 4096);
|
intel_ring_emit(ring, BLT_DEPTH_32 | BLT_ROP_SRC_COPY | 4096);
|
||||||
intel_ring_emit(ring, DIV_ROUND_UP(len, 4096) << 16 | 1024);
|
intel_ring_emit(ring, DIV_ROUND_UP(len, 4096) << 16 | 4096);
|
||||||
intel_ring_emit(ring, cs_offset);
|
intel_ring_emit(ring, cs_offset);
|
||||||
intel_ring_emit(ring, 4096);
|
intel_ring_emit(ring, 4096);
|
||||||
intel_ring_emit(ring, offset);
|
intel_ring_emit(ring, offset);
|
||||||
|
|
|
@ -200,7 +200,6 @@ nvc0_bar_init(struct nouveau_object *object)
|
||||||
|
|
||||||
nv_mask(priv, 0x000200, 0x00000100, 0x00000000);
|
nv_mask(priv, 0x000200, 0x00000100, 0x00000000);
|
||||||
nv_mask(priv, 0x000200, 0x00000100, 0x00000100);
|
nv_mask(priv, 0x000200, 0x00000100, 0x00000100);
|
||||||
nv_mask(priv, 0x100c80, 0x00000001, 0x00000000);
|
|
||||||
|
|
||||||
nv_wr32(priv, 0x001704, 0x80000000 | priv->bar[1].mem->addr >> 12);
|
nv_wr32(priv, 0x001704, 0x80000000 | priv->bar[1].mem->addr >> 12);
|
||||||
if (priv->bar[0].mem)
|
if (priv->bar[0].mem)
|
||||||
|
|
|
@ -60,6 +60,7 @@ nvc0_fb_init(struct nouveau_object *object)
|
||||||
|
|
||||||
if (priv->r100c10_page)
|
if (priv->r100c10_page)
|
||||||
nv_wr32(priv, 0x100c10, priv->r100c10 >> 8);
|
nv_wr32(priv, 0x100c10, priv->r100c10 >> 8);
|
||||||
|
nv_mask(priv, 0x100c80, 0x00000001, 0x00000000); /* 128KiB lpg */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -98,6 +98,7 @@ static int
|
||||||
gf100_ltc_init(struct nouveau_object *object)
|
gf100_ltc_init(struct nouveau_object *object)
|
||||||
{
|
{
|
||||||
struct nvkm_ltc_priv *priv = (void *)object;
|
struct nvkm_ltc_priv *priv = (void *)object;
|
||||||
|
u32 lpg128 = !(nv_rd32(priv, 0x100c80) & 0x00000001);
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = nvkm_ltc_init(priv);
|
ret = nvkm_ltc_init(priv);
|
||||||
|
@ -107,6 +108,7 @@ gf100_ltc_init(struct nouveau_object *object)
|
||||||
nv_mask(priv, 0x17e820, 0x00100000, 0x00000000); /* INTR_EN &= ~0x10 */
|
nv_mask(priv, 0x17e820, 0x00100000, 0x00000000); /* INTR_EN &= ~0x10 */
|
||||||
nv_wr32(priv, 0x17e8d8, priv->ltc_nr);
|
nv_wr32(priv, 0x17e8d8, priv->ltc_nr);
|
||||||
nv_wr32(priv, 0x17e8d4, priv->tag_base);
|
nv_wr32(priv, 0x17e8d4, priv->tag_base);
|
||||||
|
nv_mask(priv, 0x17e8c0, 0x00000002, lpg128 ? 0x00000002 : 0x00000000);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,7 @@ static int
|
||||||
gk104_ltc_init(struct nouveau_object *object)
|
gk104_ltc_init(struct nouveau_object *object)
|
||||||
{
|
{
|
||||||
struct nvkm_ltc_priv *priv = (void *)object;
|
struct nvkm_ltc_priv *priv = (void *)object;
|
||||||
|
u32 lpg128 = !(nv_rd32(priv, 0x100c80) & 0x00000001);
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = nvkm_ltc_init(priv);
|
ret = nvkm_ltc_init(priv);
|
||||||
|
@ -37,6 +38,7 @@ gk104_ltc_init(struct nouveau_object *object)
|
||||||
nv_wr32(priv, 0x17e8d8, priv->ltc_nr);
|
nv_wr32(priv, 0x17e8d8, priv->ltc_nr);
|
||||||
nv_wr32(priv, 0x17e000, priv->ltc_nr);
|
nv_wr32(priv, 0x17e000, priv->ltc_nr);
|
||||||
nv_wr32(priv, 0x17e8d4, priv->tag_base);
|
nv_wr32(priv, 0x17e8d4, priv->tag_base);
|
||||||
|
nv_mask(priv, 0x17e8c0, 0x00000002, lpg128 ? 0x00000002 : 0x00000000);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -98,6 +98,7 @@ static int
|
||||||
gm107_ltc_init(struct nouveau_object *object)
|
gm107_ltc_init(struct nouveau_object *object)
|
||||||
{
|
{
|
||||||
struct nvkm_ltc_priv *priv = (void *)object;
|
struct nvkm_ltc_priv *priv = (void *)object;
|
||||||
|
u32 lpg128 = !(nv_rd32(priv, 0x100c80) & 0x00000001);
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = nvkm_ltc_init(priv);
|
ret = nvkm_ltc_init(priv);
|
||||||
|
@ -106,6 +107,7 @@ gm107_ltc_init(struct nouveau_object *object)
|
||||||
|
|
||||||
nv_wr32(priv, 0x17e27c, priv->ltc_nr);
|
nv_wr32(priv, 0x17e27c, priv->ltc_nr);
|
||||||
nv_wr32(priv, 0x17e278, priv->tag_base);
|
nv_wr32(priv, 0x17e278, priv->tag_base);
|
||||||
|
nv_mask(priv, 0x17e264, 0x00000002, lpg128 ? 0x00000002 : 0x00000000);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -46,7 +46,6 @@ static struct nouveau_dsm_priv {
|
||||||
bool dsm_detected;
|
bool dsm_detected;
|
||||||
bool optimus_detected;
|
bool optimus_detected;
|
||||||
acpi_handle dhandle;
|
acpi_handle dhandle;
|
||||||
acpi_handle other_handle;
|
|
||||||
acpi_handle rom_handle;
|
acpi_handle rom_handle;
|
||||||
} nouveau_dsm_priv;
|
} nouveau_dsm_priv;
|
||||||
|
|
||||||
|
@ -222,10 +221,9 @@ static int nouveau_dsm_pci_probe(struct pci_dev *pdev)
|
||||||
if (!dhandle)
|
if (!dhandle)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!acpi_has_method(dhandle, "_DSM")) {
|
if (!acpi_has_method(dhandle, "_DSM"))
|
||||||
nouveau_dsm_priv.other_handle = dhandle;
|
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
if (acpi_check_dsm(dhandle, nouveau_dsm_muid, 0x00000102,
|
if (acpi_check_dsm(dhandle, nouveau_dsm_muid, 0x00000102,
|
||||||
1 << NOUVEAU_DSM_POWER))
|
1 << NOUVEAU_DSM_POWER))
|
||||||
retval |= NOUVEAU_DSM_HAS_MUX;
|
retval |= NOUVEAU_DSM_HAS_MUX;
|
||||||
|
@ -301,16 +299,6 @@ static bool nouveau_dsm_detect(void)
|
||||||
printk(KERN_INFO "VGA switcheroo: detected DSM switching method %s handle\n",
|
printk(KERN_INFO "VGA switcheroo: detected DSM switching method %s handle\n",
|
||||||
acpi_method_name);
|
acpi_method_name);
|
||||||
nouveau_dsm_priv.dsm_detected = true;
|
nouveau_dsm_priv.dsm_detected = true;
|
||||||
/*
|
|
||||||
* On some systems hotplug events are generated for the device
|
|
||||||
* being switched off when _DSM is executed. They cause ACPI
|
|
||||||
* hotplug to trigger and attempt to remove the device from
|
|
||||||
* the system, which causes it to break down. Prevent that from
|
|
||||||
* happening by setting the no_hotplug flag for the involved
|
|
||||||
* ACPI device objects.
|
|
||||||
*/
|
|
||||||
acpi_bus_no_hotplug(nouveau_dsm_priv.dhandle);
|
|
||||||
acpi_bus_no_hotplug(nouveau_dsm_priv.other_handle);
|
|
||||||
ret = true;
|
ret = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -627,6 +627,7 @@ int nouveau_pmops_suspend(struct device *dev)
|
||||||
|
|
||||||
pci_save_state(pdev);
|
pci_save_state(pdev);
|
||||||
pci_disable_device(pdev);
|
pci_disable_device(pdev);
|
||||||
|
pci_ignore_hotplug(pdev);
|
||||||
pci_set_power_state(pdev, PCI_D3hot);
|
pci_set_power_state(pdev, PCI_D3hot);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -108,7 +108,16 @@ void
|
||||||
nouveau_vga_fini(struct nouveau_drm *drm)
|
nouveau_vga_fini(struct nouveau_drm *drm)
|
||||||
{
|
{
|
||||||
struct drm_device *dev = drm->dev;
|
struct drm_device *dev = drm->dev;
|
||||||
|
bool runtime = false;
|
||||||
|
|
||||||
|
if (nouveau_runtime_pm == 1)
|
||||||
|
runtime = true;
|
||||||
|
if ((nouveau_runtime_pm == -1) && (nouveau_is_optimus() || nouveau_is_v1_dsm()))
|
||||||
|
runtime = true;
|
||||||
|
|
||||||
vga_switcheroo_unregister_client(dev->pdev);
|
vga_switcheroo_unregister_client(dev->pdev);
|
||||||
|
if (runtime && nouveau_is_v1_dsm() && !nouveau_is_optimus())
|
||||||
|
vga_switcheroo_fini_domain_pm_ops(drm->dev->dev);
|
||||||
vga_client_register(dev->pdev, NULL, NULL, NULL);
|
vga_client_register(dev->pdev, NULL, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -489,13 +489,6 @@ int cik_sdma_resume(struct radeon_device *rdev)
|
||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
/* Reset dma */
|
|
||||||
WREG32(SRBM_SOFT_RESET, SOFT_RESET_SDMA | SOFT_RESET_SDMA1);
|
|
||||||
RREG32(SRBM_SOFT_RESET);
|
|
||||||
udelay(50);
|
|
||||||
WREG32(SRBM_SOFT_RESET, 0);
|
|
||||||
RREG32(SRBM_SOFT_RESET);
|
|
||||||
|
|
||||||
r = cik_sdma_load_microcode(rdev);
|
r = cik_sdma_load_microcode(rdev);
|
||||||
if (r)
|
if (r)
|
||||||
return r;
|
return r;
|
||||||
|
|
|
@ -33,6 +33,8 @@
|
||||||
#define KV_MINIMUM_ENGINE_CLOCK 800
|
#define KV_MINIMUM_ENGINE_CLOCK 800
|
||||||
#define SMC_RAM_END 0x40000
|
#define SMC_RAM_END 0x40000
|
||||||
|
|
||||||
|
static int kv_enable_nb_dpm(struct radeon_device *rdev,
|
||||||
|
bool enable);
|
||||||
static void kv_init_graphics_levels(struct radeon_device *rdev);
|
static void kv_init_graphics_levels(struct radeon_device *rdev);
|
||||||
static int kv_calculate_ds_divider(struct radeon_device *rdev);
|
static int kv_calculate_ds_divider(struct radeon_device *rdev);
|
||||||
static int kv_calculate_nbps_level_settings(struct radeon_device *rdev);
|
static int kv_calculate_nbps_level_settings(struct radeon_device *rdev);
|
||||||
|
@ -1295,6 +1297,9 @@ void kv_dpm_disable(struct radeon_device *rdev)
|
||||||
{
|
{
|
||||||
kv_smc_bapm_enable(rdev, false);
|
kv_smc_bapm_enable(rdev, false);
|
||||||
|
|
||||||
|
if (rdev->family == CHIP_MULLINS)
|
||||||
|
kv_enable_nb_dpm(rdev, false);
|
||||||
|
|
||||||
/* powerup blocks */
|
/* powerup blocks */
|
||||||
kv_dpm_powergate_acp(rdev, false);
|
kv_dpm_powergate_acp(rdev, false);
|
||||||
kv_dpm_powergate_samu(rdev, false);
|
kv_dpm_powergate_samu(rdev, false);
|
||||||
|
@ -1769,15 +1774,24 @@ static int kv_update_dfs_bypass_settings(struct radeon_device *rdev,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int kv_enable_nb_dpm(struct radeon_device *rdev)
|
static int kv_enable_nb_dpm(struct radeon_device *rdev,
|
||||||
|
bool enable)
|
||||||
{
|
{
|
||||||
struct kv_power_info *pi = kv_get_pi(rdev);
|
struct kv_power_info *pi = kv_get_pi(rdev);
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
if (pi->enable_nb_dpm && !pi->nb_dpm_enabled) {
|
if (enable) {
|
||||||
ret = kv_notify_message_to_smu(rdev, PPSMC_MSG_NBDPM_Enable);
|
if (pi->enable_nb_dpm && !pi->nb_dpm_enabled) {
|
||||||
if (ret == 0)
|
ret = kv_notify_message_to_smu(rdev, PPSMC_MSG_NBDPM_Enable);
|
||||||
pi->nb_dpm_enabled = true;
|
if (ret == 0)
|
||||||
|
pi->nb_dpm_enabled = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (pi->enable_nb_dpm && pi->nb_dpm_enabled) {
|
||||||
|
ret = kv_notify_message_to_smu(rdev, PPSMC_MSG_NBDPM_Disable);
|
||||||
|
if (ret == 0)
|
||||||
|
pi->nb_dpm_enabled = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -1864,7 +1878,7 @@ int kv_dpm_set_power_state(struct radeon_device *rdev)
|
||||||
}
|
}
|
||||||
kv_update_sclk_t(rdev);
|
kv_update_sclk_t(rdev);
|
||||||
if (rdev->family == CHIP_MULLINS)
|
if (rdev->family == CHIP_MULLINS)
|
||||||
kv_enable_nb_dpm(rdev);
|
kv_enable_nb_dpm(rdev, true);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (pi->enable_dpm) {
|
if (pi->enable_dpm) {
|
||||||
|
@ -1889,7 +1903,7 @@ int kv_dpm_set_power_state(struct radeon_device *rdev)
|
||||||
}
|
}
|
||||||
kv_update_acp_boot_level(rdev);
|
kv_update_acp_boot_level(rdev);
|
||||||
kv_update_sclk_t(rdev);
|
kv_update_sclk_t(rdev);
|
||||||
kv_enable_nb_dpm(rdev);
|
kv_enable_nb_dpm(rdev, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -191,12 +191,6 @@ int cayman_dma_resume(struct radeon_device *rdev)
|
||||||
u32 reg_offset, wb_offset;
|
u32 reg_offset, wb_offset;
|
||||||
int i, r;
|
int i, r;
|
||||||
|
|
||||||
/* Reset dma */
|
|
||||||
WREG32(SRBM_SOFT_RESET, SOFT_RESET_DMA | SOFT_RESET_DMA1);
|
|
||||||
RREG32(SRBM_SOFT_RESET);
|
|
||||||
udelay(50);
|
|
||||||
WREG32(SRBM_SOFT_RESET, 0);
|
|
||||||
|
|
||||||
for (i = 0; i < 2; i++) {
|
for (i = 0; i < 2; i++) {
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
|
ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
|
||||||
|
|
|
@ -821,6 +821,20 @@ u32 r100_get_vblank_counter(struct radeon_device *rdev, int crtc)
|
||||||
return RREG32(RADEON_CRTC2_CRNT_FRAME);
|
return RREG32(RADEON_CRTC2_CRNT_FRAME);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* r100_ring_hdp_flush - flush Host Data Path via the ring buffer
|
||||||
|
* rdev: radeon device structure
|
||||||
|
* ring: ring buffer struct for emitting packets
|
||||||
|
*/
|
||||||
|
static void r100_ring_hdp_flush(struct radeon_device *rdev, struct radeon_ring *ring)
|
||||||
|
{
|
||||||
|
radeon_ring_write(ring, PACKET0(RADEON_HOST_PATH_CNTL, 0));
|
||||||
|
radeon_ring_write(ring, rdev->config.r100.hdp_cntl |
|
||||||
|
RADEON_HDP_READ_BUFFER_INVALIDATE);
|
||||||
|
radeon_ring_write(ring, PACKET0(RADEON_HOST_PATH_CNTL, 0));
|
||||||
|
radeon_ring_write(ring, rdev->config.r100.hdp_cntl);
|
||||||
|
}
|
||||||
|
|
||||||
/* Who ever call radeon_fence_emit should call ring_lock and ask
|
/* Who ever call radeon_fence_emit should call ring_lock and ask
|
||||||
* for enough space (today caller are ib schedule and buffer move) */
|
* for enough space (today caller are ib schedule and buffer move) */
|
||||||
void r100_fence_ring_emit(struct radeon_device *rdev,
|
void r100_fence_ring_emit(struct radeon_device *rdev,
|
||||||
|
@ -1056,20 +1070,6 @@ void r100_gfx_set_wptr(struct radeon_device *rdev,
|
||||||
(void)RREG32(RADEON_CP_RB_WPTR);
|
(void)RREG32(RADEON_CP_RB_WPTR);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* r100_ring_hdp_flush - flush Host Data Path via the ring buffer
|
|
||||||
* rdev: radeon device structure
|
|
||||||
* ring: ring buffer struct for emitting packets
|
|
||||||
*/
|
|
||||||
void r100_ring_hdp_flush(struct radeon_device *rdev, struct radeon_ring *ring)
|
|
||||||
{
|
|
||||||
radeon_ring_write(ring, PACKET0(RADEON_HOST_PATH_CNTL, 0));
|
|
||||||
radeon_ring_write(ring, rdev->config.r100.hdp_cntl |
|
|
||||||
RADEON_HDP_READ_BUFFER_INVALIDATE);
|
|
||||||
radeon_ring_write(ring, PACKET0(RADEON_HOST_PATH_CNTL, 0));
|
|
||||||
radeon_ring_write(ring, rdev->config.r100.hdp_cntl);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void r100_cp_load_microcode(struct radeon_device *rdev)
|
static void r100_cp_load_microcode(struct radeon_device *rdev)
|
||||||
{
|
{
|
||||||
const __be32 *fw_data;
|
const __be32 *fw_data;
|
||||||
|
|
|
@ -124,15 +124,6 @@ int r600_dma_resume(struct radeon_device *rdev)
|
||||||
u32 rb_bufsz;
|
u32 rb_bufsz;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
/* Reset dma */
|
|
||||||
if (rdev->family >= CHIP_RV770)
|
|
||||||
WREG32(SRBM_SOFT_RESET, RV770_SOFT_RESET_DMA);
|
|
||||||
else
|
|
||||||
WREG32(SRBM_SOFT_RESET, SOFT_RESET_DMA);
|
|
||||||
RREG32(SRBM_SOFT_RESET);
|
|
||||||
udelay(50);
|
|
||||||
WREG32(SRBM_SOFT_RESET, 0);
|
|
||||||
|
|
||||||
WREG32(DMA_SEM_INCOMPLETE_TIMER_CNTL, 0);
|
WREG32(DMA_SEM_INCOMPLETE_TIMER_CNTL, 0);
|
||||||
WREG32(DMA_SEM_WAIT_FAIL_TIMER_CNTL, 0);
|
WREG32(DMA_SEM_WAIT_FAIL_TIMER_CNTL, 0);
|
||||||
|
|
||||||
|
|
|
@ -44,13 +44,6 @@
|
||||||
#define R6XX_MAX_PIPES 8
|
#define R6XX_MAX_PIPES 8
|
||||||
#define R6XX_MAX_PIPES_MASK 0xff
|
#define R6XX_MAX_PIPES_MASK 0xff
|
||||||
|
|
||||||
/* PTE flags */
|
|
||||||
#define PTE_VALID (1 << 0)
|
|
||||||
#define PTE_SYSTEM (1 << 1)
|
|
||||||
#define PTE_SNOOPED (1 << 2)
|
|
||||||
#define PTE_READABLE (1 << 5)
|
|
||||||
#define PTE_WRITEABLE (1 << 6)
|
|
||||||
|
|
||||||
/* tiling bits */
|
/* tiling bits */
|
||||||
#define ARRAY_LINEAR_GENERAL 0x00000000
|
#define ARRAY_LINEAR_GENERAL 0x00000000
|
||||||
#define ARRAY_LINEAR_ALIGNED 0x00000001
|
#define ARRAY_LINEAR_ALIGNED 0x00000001
|
||||||
|
|
|
@ -185,7 +185,6 @@ static struct radeon_asic_ring r100_gfx_ring = {
|
||||||
.get_rptr = &r100_gfx_get_rptr,
|
.get_rptr = &r100_gfx_get_rptr,
|
||||||
.get_wptr = &r100_gfx_get_wptr,
|
.get_wptr = &r100_gfx_get_wptr,
|
||||||
.set_wptr = &r100_gfx_set_wptr,
|
.set_wptr = &r100_gfx_set_wptr,
|
||||||
.hdp_flush = &r100_ring_hdp_flush,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct radeon_asic r100_asic = {
|
static struct radeon_asic r100_asic = {
|
||||||
|
@ -332,7 +331,6 @@ static struct radeon_asic_ring r300_gfx_ring = {
|
||||||
.get_rptr = &r100_gfx_get_rptr,
|
.get_rptr = &r100_gfx_get_rptr,
|
||||||
.get_wptr = &r100_gfx_get_wptr,
|
.get_wptr = &r100_gfx_get_wptr,
|
||||||
.set_wptr = &r100_gfx_set_wptr,
|
.set_wptr = &r100_gfx_set_wptr,
|
||||||
.hdp_flush = &r100_ring_hdp_flush,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct radeon_asic r300_asic = {
|
static struct radeon_asic r300_asic = {
|
||||||
|
|
|
@ -148,8 +148,7 @@ u32 r100_gfx_get_wptr(struct radeon_device *rdev,
|
||||||
struct radeon_ring *ring);
|
struct radeon_ring *ring);
|
||||||
void r100_gfx_set_wptr(struct radeon_device *rdev,
|
void r100_gfx_set_wptr(struct radeon_device *rdev,
|
||||||
struct radeon_ring *ring);
|
struct radeon_ring *ring);
|
||||||
void r100_ring_hdp_flush(struct radeon_device *rdev,
|
|
||||||
struct radeon_ring *ring);
|
|
||||||
/*
|
/*
|
||||||
* r200,rv250,rs300,rv280
|
* r200,rv250,rs300,rv280
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -33,7 +33,6 @@ static struct radeon_atpx_priv {
|
||||||
bool atpx_detected;
|
bool atpx_detected;
|
||||||
/* handle for device - and atpx */
|
/* handle for device - and atpx */
|
||||||
acpi_handle dhandle;
|
acpi_handle dhandle;
|
||||||
acpi_handle other_handle;
|
|
||||||
struct radeon_atpx atpx;
|
struct radeon_atpx atpx;
|
||||||
} radeon_atpx_priv;
|
} radeon_atpx_priv;
|
||||||
|
|
||||||
|
@ -453,10 +452,9 @@ static bool radeon_atpx_pci_probe_handle(struct pci_dev *pdev)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
status = acpi_get_handle(dhandle, "ATPX", &atpx_handle);
|
status = acpi_get_handle(dhandle, "ATPX", &atpx_handle);
|
||||||
if (ACPI_FAILURE(status)) {
|
if (ACPI_FAILURE(status))
|
||||||
radeon_atpx_priv.other_handle = dhandle;
|
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
radeon_atpx_priv.dhandle = dhandle;
|
radeon_atpx_priv.dhandle = dhandle;
|
||||||
radeon_atpx_priv.atpx.handle = atpx_handle;
|
radeon_atpx_priv.atpx.handle = atpx_handle;
|
||||||
return true;
|
return true;
|
||||||
|
@ -540,16 +538,6 @@ static bool radeon_atpx_detect(void)
|
||||||
printk(KERN_INFO "VGA switcheroo: detected switching method %s handle\n",
|
printk(KERN_INFO "VGA switcheroo: detected switching method %s handle\n",
|
||||||
acpi_method_name);
|
acpi_method_name);
|
||||||
radeon_atpx_priv.atpx_detected = true;
|
radeon_atpx_priv.atpx_detected = true;
|
||||||
/*
|
|
||||||
* On some systems hotplug events are generated for the device
|
|
||||||
* being switched off when ATPX is executed. They cause ACPI
|
|
||||||
* hotplug to trigger and attempt to remove the device from
|
|
||||||
* the system, which causes it to break down. Prevent that from
|
|
||||||
* happening by setting the no_hotplug flag for the involved
|
|
||||||
* ACPI device objects.
|
|
||||||
*/
|
|
||||||
acpi_bus_no_hotplug(radeon_atpx_priv.dhandle);
|
|
||||||
acpi_bus_no_hotplug(radeon_atpx_priv.other_handle);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -1393,7 +1393,7 @@ int radeon_device_init(struct radeon_device *rdev,
|
||||||
|
|
||||||
r = radeon_init(rdev);
|
r = radeon_init(rdev);
|
||||||
if (r)
|
if (r)
|
||||||
return r;
|
goto failed;
|
||||||
|
|
||||||
r = radeon_ib_ring_tests(rdev);
|
r = radeon_ib_ring_tests(rdev);
|
||||||
if (r)
|
if (r)
|
||||||
|
@ -1413,7 +1413,7 @@ int radeon_device_init(struct radeon_device *rdev,
|
||||||
radeon_agp_disable(rdev);
|
radeon_agp_disable(rdev);
|
||||||
r = radeon_init(rdev);
|
r = radeon_init(rdev);
|
||||||
if (r)
|
if (r)
|
||||||
return r;
|
goto failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((radeon_testing & 1)) {
|
if ((radeon_testing & 1)) {
|
||||||
|
@ -1435,6 +1435,11 @@ int radeon_device_init(struct radeon_device *rdev,
|
||||||
DRM_INFO("radeon: acceleration disabled, skipping benchmarks\n");
|
DRM_INFO("radeon: acceleration disabled, skipping benchmarks\n");
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
failed:
|
||||||
|
if (runtime)
|
||||||
|
vga_switcheroo_fini_domain_pm_ops(rdev->dev);
|
||||||
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void radeon_debugfs_remove_files(struct radeon_device *rdev);
|
static void radeon_debugfs_remove_files(struct radeon_device *rdev);
|
||||||
|
@ -1455,6 +1460,8 @@ void radeon_device_fini(struct radeon_device *rdev)
|
||||||
radeon_bo_evict_vram(rdev);
|
radeon_bo_evict_vram(rdev);
|
||||||
radeon_fini(rdev);
|
radeon_fini(rdev);
|
||||||
vga_switcheroo_unregister_client(rdev->pdev);
|
vga_switcheroo_unregister_client(rdev->pdev);
|
||||||
|
if (rdev->flags & RADEON_IS_PX)
|
||||||
|
vga_switcheroo_fini_domain_pm_ops(rdev->dev);
|
||||||
vga_client_register(rdev->pdev, NULL, NULL, NULL);
|
vga_client_register(rdev->pdev, NULL, NULL, NULL);
|
||||||
if (rdev->rio_mem)
|
if (rdev->rio_mem)
|
||||||
pci_iounmap(rdev->pdev, rdev->rio_mem);
|
pci_iounmap(rdev->pdev, rdev->rio_mem);
|
||||||
|
|
|
@ -83,7 +83,7 @@
|
||||||
* CIK: 1D and linear tiling modes contain valid PIPE_CONFIG
|
* CIK: 1D and linear tiling modes contain valid PIPE_CONFIG
|
||||||
* 2.39.0 - Add INFO query for number of active CUs
|
* 2.39.0 - Add INFO query for number of active CUs
|
||||||
* 2.40.0 - Add RADEON_GEM_GTT_WC/UC, flush HDP cache before submitting
|
* 2.40.0 - Add RADEON_GEM_GTT_WC/UC, flush HDP cache before submitting
|
||||||
* CS to GPU
|
* CS to GPU on >= r600
|
||||||
*/
|
*/
|
||||||
#define KMS_DRIVER_MAJOR 2
|
#define KMS_DRIVER_MAJOR 2
|
||||||
#define KMS_DRIVER_MINOR 40
|
#define KMS_DRIVER_MINOR 40
|
||||||
|
@ -440,6 +440,7 @@ static int radeon_pmops_runtime_suspend(struct device *dev)
|
||||||
ret = radeon_suspend_kms(drm_dev, false, false);
|
ret = radeon_suspend_kms(drm_dev, false, false);
|
||||||
pci_save_state(pdev);
|
pci_save_state(pdev);
|
||||||
pci_disable_device(pdev);
|
pci_disable_device(pdev);
|
||||||
|
pci_ignore_hotplug(pdev);
|
||||||
pci_set_power_state(pdev, PCI_D3cold);
|
pci_set_power_state(pdev, PCI_D3cold);
|
||||||
drm_dev->switch_power_state = DRM_SWITCH_POWER_DYNAMIC_OFF;
|
drm_dev->switch_power_state = DRM_SWITCH_POWER_DYNAMIC_OFF;
|
||||||
|
|
||||||
|
|
|
@ -221,9 +221,9 @@ void rs400_gart_set_page(struct radeon_device *rdev, unsigned i,
|
||||||
entry = (lower_32_bits(addr) & PAGE_MASK) |
|
entry = (lower_32_bits(addr) & PAGE_MASK) |
|
||||||
((upper_32_bits(addr) & 0xff) << 4);
|
((upper_32_bits(addr) & 0xff) << 4);
|
||||||
if (flags & RADEON_GART_PAGE_READ)
|
if (flags & RADEON_GART_PAGE_READ)
|
||||||
addr |= RS400_PTE_READABLE;
|
entry |= RS400_PTE_READABLE;
|
||||||
if (flags & RADEON_GART_PAGE_WRITE)
|
if (flags & RADEON_GART_PAGE_WRITE)
|
||||||
addr |= RS400_PTE_WRITEABLE;
|
entry |= RS400_PTE_WRITEABLE;
|
||||||
if (!(flags & RADEON_GART_PAGE_SNOOP))
|
if (!(flags & RADEON_GART_PAGE_SNOOP))
|
||||||
entry |= RS400_PTE_UNSNOOPED;
|
entry |= RS400_PTE_UNSNOOPED;
|
||||||
entry = cpu_to_le32(entry);
|
entry = cpu_to_le32(entry);
|
||||||
|
|
|
@ -298,7 +298,6 @@ static int hdmi_avi_infoframe_config(struct sti_hdmi *hdmi)
|
||||||
hdmi_write(hdmi, val, HDMI_SW_DI_N_PKT_WORD2(HDMI_IFRAME_SLOT_AVI));
|
hdmi_write(hdmi, val, HDMI_SW_DI_N_PKT_WORD2(HDMI_IFRAME_SLOT_AVI));
|
||||||
|
|
||||||
val = frame[0xC];
|
val = frame[0xC];
|
||||||
val |= frame[0xD] << 8;
|
|
||||||
hdmi_write(hdmi, val, HDMI_SW_DI_N_PKT_WORD3(HDMI_IFRAME_SLOT_AVI));
|
hdmi_write(hdmi, val, HDMI_SW_DI_N_PKT_WORD3(HDMI_IFRAME_SLOT_AVI));
|
||||||
|
|
||||||
/* Enable transmission slot for AVI infoframe
|
/* Enable transmission slot for AVI infoframe
|
||||||
|
|
|
@ -660,6 +660,12 @@ int vga_switcheroo_init_domain_pm_ops(struct device *dev, struct dev_pm_domain *
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(vga_switcheroo_init_domain_pm_ops);
|
EXPORT_SYMBOL(vga_switcheroo_init_domain_pm_ops);
|
||||||
|
|
||||||
|
void vga_switcheroo_fini_domain_pm_ops(struct device *dev)
|
||||||
|
{
|
||||||
|
dev->pm_domain = NULL;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(vga_switcheroo_fini_domain_pm_ops);
|
||||||
|
|
||||||
static int vga_switcheroo_runtime_resume_hdmi_audio(struct device *dev)
|
static int vga_switcheroo_runtime_resume_hdmi_audio(struct device *dev)
|
||||||
{
|
{
|
||||||
struct pci_dev *pdev = to_pci_dev(dev);
|
struct pci_dev *pdev = to_pci_dev(dev);
|
||||||
|
|
|
@ -41,6 +41,7 @@
|
||||||
#include <linux/poll.h>
|
#include <linux/poll.h>
|
||||||
#include <linux/miscdevice.h>
|
#include <linux/miscdevice.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
|
#include <linux/screen_info.h>
|
||||||
|
|
||||||
#include <linux/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
|
|
||||||
|
@ -112,10 +113,8 @@ both:
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef __ARCH_HAS_VGA_DEFAULT_DEVICE
|
|
||||||
/* this is only used a cookie - it should not be dereferenced */
|
/* this is only used a cookie - it should not be dereferenced */
|
||||||
static struct pci_dev *vga_default;
|
static struct pci_dev *vga_default;
|
||||||
#endif
|
|
||||||
|
|
||||||
static void vga_arb_device_card_gone(struct pci_dev *pdev);
|
static void vga_arb_device_card_gone(struct pci_dev *pdev);
|
||||||
|
|
||||||
|
@ -131,7 +130,6 @@ static struct vga_device *vgadev_find(struct pci_dev *pdev)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Returns the default VGA device (vgacon's babe) */
|
/* Returns the default VGA device (vgacon's babe) */
|
||||||
#ifndef __ARCH_HAS_VGA_DEFAULT_DEVICE
|
|
||||||
struct pci_dev *vga_default_device(void)
|
struct pci_dev *vga_default_device(void)
|
||||||
{
|
{
|
||||||
return vga_default;
|
return vga_default;
|
||||||
|
@ -147,7 +145,6 @@ void vga_set_default_device(struct pci_dev *pdev)
|
||||||
pci_dev_put(vga_default);
|
pci_dev_put(vga_default);
|
||||||
vga_default = pci_dev_get(pdev);
|
vga_default = pci_dev_get(pdev);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
static inline void vga_irq_set_state(struct vga_device *vgadev, bool state)
|
static inline void vga_irq_set_state(struct vga_device *vgadev, bool state)
|
||||||
{
|
{
|
||||||
|
@ -583,11 +580,12 @@ static bool vga_arbiter_add_pci_device(struct pci_dev *pdev)
|
||||||
/* Deal with VGA default device. Use first enabled one
|
/* Deal with VGA default device. Use first enabled one
|
||||||
* by default if arch doesn't have it's own hook
|
* by default if arch doesn't have it's own hook
|
||||||
*/
|
*/
|
||||||
#ifndef __ARCH_HAS_VGA_DEFAULT_DEVICE
|
|
||||||
if (vga_default == NULL &&
|
if (vga_default == NULL &&
|
||||||
((vgadev->owns & VGA_RSRC_LEGACY_MASK) == VGA_RSRC_LEGACY_MASK))
|
((vgadev->owns & VGA_RSRC_LEGACY_MASK) == VGA_RSRC_LEGACY_MASK)) {
|
||||||
|
pr_info("vgaarb: setting as boot device: PCI:%s\n",
|
||||||
|
pci_name(pdev));
|
||||||
vga_set_default_device(pdev);
|
vga_set_default_device(pdev);
|
||||||
#endif
|
}
|
||||||
|
|
||||||
vga_arbiter_check_bridge_sharing(vgadev);
|
vga_arbiter_check_bridge_sharing(vgadev);
|
||||||
|
|
||||||
|
@ -621,10 +619,8 @@ static bool vga_arbiter_del_pci_device(struct pci_dev *pdev)
|
||||||
goto bail;
|
goto bail;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef __ARCH_HAS_VGA_DEFAULT_DEVICE
|
|
||||||
if (vga_default == pdev)
|
if (vga_default == pdev)
|
||||||
vga_set_default_device(NULL);
|
vga_set_default_device(NULL);
|
||||||
#endif
|
|
||||||
|
|
||||||
if (vgadev->decodes & (VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM))
|
if (vgadev->decodes & (VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM))
|
||||||
vga_decode_count--;
|
vga_decode_count--;
|
||||||
|
@ -1320,6 +1316,38 @@ static int __init vga_arb_device_init(void)
|
||||||
pr_info("vgaarb: loaded\n");
|
pr_info("vgaarb: loaded\n");
|
||||||
|
|
||||||
list_for_each_entry(vgadev, &vga_list, list) {
|
list_for_each_entry(vgadev, &vga_list, list) {
|
||||||
|
#if defined(CONFIG_X86) || defined(CONFIG_IA64)
|
||||||
|
/* Override I/O based detection done by vga_arbiter_add_pci_device()
|
||||||
|
* as it may take the wrong device (e.g. on Apple system under EFI).
|
||||||
|
*
|
||||||
|
* Select the device owning the boot framebuffer if there is one.
|
||||||
|
*/
|
||||||
|
resource_size_t start, end;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* Does firmware framebuffer belong to us? */
|
||||||
|
for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
|
||||||
|
if (!(pci_resource_flags(vgadev->pdev, i) & IORESOURCE_MEM))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
start = pci_resource_start(vgadev->pdev, i);
|
||||||
|
end = pci_resource_end(vgadev->pdev, i);
|
||||||
|
|
||||||
|
if (!start || !end)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (screen_info.lfb_base < start ||
|
||||||
|
(screen_info.lfb_base + screen_info.lfb_size) >= end)
|
||||||
|
continue;
|
||||||
|
if (!vga_default_device())
|
||||||
|
pr_info("vgaarb: setting as boot device: PCI:%s\n",
|
||||||
|
pci_name(vgadev->pdev));
|
||||||
|
else if (vgadev->pdev != vga_default_device())
|
||||||
|
pr_info("vgaarb: overriding boot device: PCI:%s\n",
|
||||||
|
pci_name(vgadev->pdev));
|
||||||
|
vga_set_default_device(vgadev->pdev);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
if (vgadev->bridge_has_one_vga)
|
if (vgadev->bridge_has_one_vga)
|
||||||
pr_info("vgaarb: bridge control possible %s\n", pci_name(vgadev->pdev));
|
pr_info("vgaarb: bridge control possible %s\n", pci_name(vgadev->pdev));
|
||||||
else
|
else
|
||||||
|
|
|
@ -571,7 +571,7 @@ static int bma180_probe(struct i2c_client *client,
|
||||||
trig->ops = &bma180_trigger_ops;
|
trig->ops = &bma180_trigger_ops;
|
||||||
iio_trigger_set_drvdata(trig, indio_dev);
|
iio_trigger_set_drvdata(trig, indio_dev);
|
||||||
data->trig = trig;
|
data->trig = trig;
|
||||||
indio_dev->trig = trig;
|
indio_dev->trig = iio_trigger_get(trig);
|
||||||
|
|
||||||
ret = iio_trigger_register(trig);
|
ret = iio_trigger_register(trig);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
|
|
@ -472,7 +472,7 @@ static int ad_sd_probe_trigger(struct iio_dev *indio_dev)
|
||||||
goto error_free_irq;
|
goto error_free_irq;
|
||||||
|
|
||||||
/* select default trigger */
|
/* select default trigger */
|
||||||
indio_dev->trig = sigma_delta->trig;
|
indio_dev->trig = iio_trigger_get(sigma_delta->trig);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
|
@ -196,6 +196,7 @@ struct at91_adc_state {
|
||||||
bool done;
|
bool done;
|
||||||
int irq;
|
int irq;
|
||||||
u16 last_value;
|
u16 last_value;
|
||||||
|
int chnb;
|
||||||
struct mutex lock;
|
struct mutex lock;
|
||||||
u8 num_channels;
|
u8 num_channels;
|
||||||
void __iomem *reg_base;
|
void __iomem *reg_base;
|
||||||
|
@ -274,7 +275,7 @@ void handle_adc_eoc_trigger(int irq, struct iio_dev *idev)
|
||||||
disable_irq_nosync(irq);
|
disable_irq_nosync(irq);
|
||||||
iio_trigger_poll(idev->trig);
|
iio_trigger_poll(idev->trig);
|
||||||
} else {
|
} else {
|
||||||
st->last_value = at91_adc_readl(st, AT91_ADC_LCDR);
|
st->last_value = at91_adc_readl(st, AT91_ADC_CHAN(st, st->chnb));
|
||||||
st->done = true;
|
st->done = true;
|
||||||
wake_up_interruptible(&st->wq_data_avail);
|
wake_up_interruptible(&st->wq_data_avail);
|
||||||
}
|
}
|
||||||
|
@ -351,7 +352,7 @@ static irqreturn_t at91_adc_rl_interrupt(int irq, void *private)
|
||||||
unsigned int reg;
|
unsigned int reg;
|
||||||
|
|
||||||
status &= at91_adc_readl(st, AT91_ADC_IMR);
|
status &= at91_adc_readl(st, AT91_ADC_IMR);
|
||||||
if (status & st->registers->drdy_mask)
|
if (status & GENMASK(st->num_channels - 1, 0))
|
||||||
handle_adc_eoc_trigger(irq, idev);
|
handle_adc_eoc_trigger(irq, idev);
|
||||||
|
|
||||||
if (status & AT91RL_ADC_IER_PEN) {
|
if (status & AT91RL_ADC_IER_PEN) {
|
||||||
|
@ -418,7 +419,7 @@ static irqreturn_t at91_adc_9x5_interrupt(int irq, void *private)
|
||||||
AT91_ADC_IER_YRDY |
|
AT91_ADC_IER_YRDY |
|
||||||
AT91_ADC_IER_PRDY;
|
AT91_ADC_IER_PRDY;
|
||||||
|
|
||||||
if (status & st->registers->drdy_mask)
|
if (status & GENMASK(st->num_channels - 1, 0))
|
||||||
handle_adc_eoc_trigger(irq, idev);
|
handle_adc_eoc_trigger(irq, idev);
|
||||||
|
|
||||||
if (status & AT91_ADC_IER_PEN) {
|
if (status & AT91_ADC_IER_PEN) {
|
||||||
|
@ -689,9 +690,10 @@ static int at91_adc_read_raw(struct iio_dev *idev,
|
||||||
case IIO_CHAN_INFO_RAW:
|
case IIO_CHAN_INFO_RAW:
|
||||||
mutex_lock(&st->lock);
|
mutex_lock(&st->lock);
|
||||||
|
|
||||||
|
st->chnb = chan->channel;
|
||||||
at91_adc_writel(st, AT91_ADC_CHER,
|
at91_adc_writel(st, AT91_ADC_CHER,
|
||||||
AT91_ADC_CH(chan->channel));
|
AT91_ADC_CH(chan->channel));
|
||||||
at91_adc_writel(st, AT91_ADC_IER, st->registers->drdy_mask);
|
at91_adc_writel(st, AT91_ADC_IER, BIT(chan->channel));
|
||||||
at91_adc_writel(st, AT91_ADC_CR, AT91_ADC_START);
|
at91_adc_writel(st, AT91_ADC_CR, AT91_ADC_START);
|
||||||
|
|
||||||
ret = wait_event_interruptible_timeout(st->wq_data_avail,
|
ret = wait_event_interruptible_timeout(st->wq_data_avail,
|
||||||
|
@ -708,7 +710,7 @@ static int at91_adc_read_raw(struct iio_dev *idev,
|
||||||
|
|
||||||
at91_adc_writel(st, AT91_ADC_CHDR,
|
at91_adc_writel(st, AT91_ADC_CHDR,
|
||||||
AT91_ADC_CH(chan->channel));
|
AT91_ADC_CH(chan->channel));
|
||||||
at91_adc_writel(st, AT91_ADC_IDR, st->registers->drdy_mask);
|
at91_adc_writel(st, AT91_ADC_IDR, BIT(chan->channel));
|
||||||
|
|
||||||
st->last_value = 0;
|
st->last_value = 0;
|
||||||
st->done = false;
|
st->done = false;
|
||||||
|
|
|
@ -1126,7 +1126,7 @@ static int xadc_parse_dt(struct iio_dev *indio_dev, struct device_node *np,
|
||||||
chan->address = XADC_REG_VPVN;
|
chan->address = XADC_REG_VPVN;
|
||||||
} else {
|
} else {
|
||||||
chan->scan_index = 15 + reg;
|
chan->scan_index = 15 + reg;
|
||||||
chan->scan_index = XADC_REG_VAUX(reg - 1);
|
chan->address = XADC_REG_VAUX(reg - 1);
|
||||||
}
|
}
|
||||||
num_channels++;
|
num_channels++;
|
||||||
chan++;
|
chan++;
|
||||||
|
|
|
@ -122,7 +122,8 @@ int hid_sensor_setup_trigger(struct iio_dev *indio_dev, const char *name,
|
||||||
dev_err(&indio_dev->dev, "Trigger Register Failed\n");
|
dev_err(&indio_dev->dev, "Trigger Register Failed\n");
|
||||||
goto error_free_trig;
|
goto error_free_trig;
|
||||||
}
|
}
|
||||||
indio_dev->trig = attrb->trigger = trig;
|
attrb->trigger = trig;
|
||||||
|
indio_dev->trig = iio_trigger_get(trig);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
|
|
@ -49,7 +49,7 @@ int st_sensors_allocate_trigger(struct iio_dev *indio_dev,
|
||||||
dev_err(&indio_dev->dev, "failed to register iio trigger.\n");
|
dev_err(&indio_dev->dev, "failed to register iio trigger.\n");
|
||||||
goto iio_trigger_register_error;
|
goto iio_trigger_register_error;
|
||||||
}
|
}
|
||||||
indio_dev->trig = sdata->trig;
|
indio_dev->trig = iio_trigger_get(sdata->trig);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
|
@ -132,7 +132,7 @@ int itg3200_probe_trigger(struct iio_dev *indio_dev)
|
||||||
goto error_free_irq;
|
goto error_free_irq;
|
||||||
|
|
||||||
/* select default trigger */
|
/* select default trigger */
|
||||||
indio_dev->trig = st->trig;
|
indio_dev->trig = iio_trigger_get(st->trig);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
|
@ -135,7 +135,7 @@ int inv_mpu6050_probe_trigger(struct iio_dev *indio_dev)
|
||||||
ret = iio_trigger_register(st->trig);
|
ret = iio_trigger_register(st->trig);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto error_free_irq;
|
goto error_free_irq;
|
||||||
indio_dev->trig = st->trig;
|
indio_dev->trig = iio_trigger_get(st->trig);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
|
@ -178,7 +178,7 @@ static struct iio_channel *of_iio_channel_get_by_name(struct device_node *np,
|
||||||
index = of_property_match_string(np, "io-channel-names",
|
index = of_property_match_string(np, "io-channel-names",
|
||||||
name);
|
name);
|
||||||
chan = of_iio_channel_get(np, index);
|
chan = of_iio_channel_get(np, index);
|
||||||
if (!IS_ERR(chan))
|
if (!IS_ERR(chan) || PTR_ERR(chan) == -EPROBE_DEFER)
|
||||||
break;
|
break;
|
||||||
else if (name && index >= 0) {
|
else if (name && index >= 0) {
|
||||||
pr_err("ERROR: could not get IIO channel %s:%s(%i)\n",
|
pr_err("ERROR: could not get IIO channel %s:%s(%i)\n",
|
||||||
|
|
|
@ -42,7 +42,8 @@
|
||||||
#define ST_MAGN_FS_AVL_5600MG 5600
|
#define ST_MAGN_FS_AVL_5600MG 5600
|
||||||
#define ST_MAGN_FS_AVL_8000MG 8000
|
#define ST_MAGN_FS_AVL_8000MG 8000
|
||||||
#define ST_MAGN_FS_AVL_8100MG 8100
|
#define ST_MAGN_FS_AVL_8100MG 8100
|
||||||
#define ST_MAGN_FS_AVL_10000MG 10000
|
#define ST_MAGN_FS_AVL_12000MG 12000
|
||||||
|
#define ST_MAGN_FS_AVL_16000MG 16000
|
||||||
|
|
||||||
/* CUSTOM VALUES FOR SENSOR 1 */
|
/* CUSTOM VALUES FOR SENSOR 1 */
|
||||||
#define ST_MAGN_1_WAI_EXP 0x3c
|
#define ST_MAGN_1_WAI_EXP 0x3c
|
||||||
|
@ -69,20 +70,20 @@
|
||||||
#define ST_MAGN_1_FS_AVL_4700_VAL 0x05
|
#define ST_MAGN_1_FS_AVL_4700_VAL 0x05
|
||||||
#define ST_MAGN_1_FS_AVL_5600_VAL 0x06
|
#define ST_MAGN_1_FS_AVL_5600_VAL 0x06
|
||||||
#define ST_MAGN_1_FS_AVL_8100_VAL 0x07
|
#define ST_MAGN_1_FS_AVL_8100_VAL 0x07
|
||||||
#define ST_MAGN_1_FS_AVL_1300_GAIN_XY 1100
|
#define ST_MAGN_1_FS_AVL_1300_GAIN_XY 909
|
||||||
#define ST_MAGN_1_FS_AVL_1900_GAIN_XY 855
|
#define ST_MAGN_1_FS_AVL_1900_GAIN_XY 1169
|
||||||
#define ST_MAGN_1_FS_AVL_2500_GAIN_XY 670
|
#define ST_MAGN_1_FS_AVL_2500_GAIN_XY 1492
|
||||||
#define ST_MAGN_1_FS_AVL_4000_GAIN_XY 450
|
#define ST_MAGN_1_FS_AVL_4000_GAIN_XY 2222
|
||||||
#define ST_MAGN_1_FS_AVL_4700_GAIN_XY 400
|
#define ST_MAGN_1_FS_AVL_4700_GAIN_XY 2500
|
||||||
#define ST_MAGN_1_FS_AVL_5600_GAIN_XY 330
|
#define ST_MAGN_1_FS_AVL_5600_GAIN_XY 3030
|
||||||
#define ST_MAGN_1_FS_AVL_8100_GAIN_XY 230
|
#define ST_MAGN_1_FS_AVL_8100_GAIN_XY 4347
|
||||||
#define ST_MAGN_1_FS_AVL_1300_GAIN_Z 980
|
#define ST_MAGN_1_FS_AVL_1300_GAIN_Z 1020
|
||||||
#define ST_MAGN_1_FS_AVL_1900_GAIN_Z 760
|
#define ST_MAGN_1_FS_AVL_1900_GAIN_Z 1315
|
||||||
#define ST_MAGN_1_FS_AVL_2500_GAIN_Z 600
|
#define ST_MAGN_1_FS_AVL_2500_GAIN_Z 1666
|
||||||
#define ST_MAGN_1_FS_AVL_4000_GAIN_Z 400
|
#define ST_MAGN_1_FS_AVL_4000_GAIN_Z 2500
|
||||||
#define ST_MAGN_1_FS_AVL_4700_GAIN_Z 355
|
#define ST_MAGN_1_FS_AVL_4700_GAIN_Z 2816
|
||||||
#define ST_MAGN_1_FS_AVL_5600_GAIN_Z 295
|
#define ST_MAGN_1_FS_AVL_5600_GAIN_Z 3389
|
||||||
#define ST_MAGN_1_FS_AVL_8100_GAIN_Z 205
|
#define ST_MAGN_1_FS_AVL_8100_GAIN_Z 4878
|
||||||
#define ST_MAGN_1_MULTIREAD_BIT false
|
#define ST_MAGN_1_MULTIREAD_BIT false
|
||||||
|
|
||||||
/* CUSTOM VALUES FOR SENSOR 2 */
|
/* CUSTOM VALUES FOR SENSOR 2 */
|
||||||
|
@ -105,10 +106,12 @@
|
||||||
#define ST_MAGN_2_FS_MASK 0x60
|
#define ST_MAGN_2_FS_MASK 0x60
|
||||||
#define ST_MAGN_2_FS_AVL_4000_VAL 0x00
|
#define ST_MAGN_2_FS_AVL_4000_VAL 0x00
|
||||||
#define ST_MAGN_2_FS_AVL_8000_VAL 0x01
|
#define ST_MAGN_2_FS_AVL_8000_VAL 0x01
|
||||||
#define ST_MAGN_2_FS_AVL_10000_VAL 0x02
|
#define ST_MAGN_2_FS_AVL_12000_VAL 0x02
|
||||||
#define ST_MAGN_2_FS_AVL_4000_GAIN 430
|
#define ST_MAGN_2_FS_AVL_16000_VAL 0x03
|
||||||
#define ST_MAGN_2_FS_AVL_8000_GAIN 230
|
#define ST_MAGN_2_FS_AVL_4000_GAIN 146
|
||||||
#define ST_MAGN_2_FS_AVL_10000_GAIN 230
|
#define ST_MAGN_2_FS_AVL_8000_GAIN 292
|
||||||
|
#define ST_MAGN_2_FS_AVL_12000_GAIN 438
|
||||||
|
#define ST_MAGN_2_FS_AVL_16000_GAIN 584
|
||||||
#define ST_MAGN_2_MULTIREAD_BIT false
|
#define ST_MAGN_2_MULTIREAD_BIT false
|
||||||
#define ST_MAGN_2_OUT_X_L_ADDR 0x28
|
#define ST_MAGN_2_OUT_X_L_ADDR 0x28
|
||||||
#define ST_MAGN_2_OUT_Y_L_ADDR 0x2a
|
#define ST_MAGN_2_OUT_Y_L_ADDR 0x2a
|
||||||
|
@ -266,9 +269,14 @@ static const struct st_sensors st_magn_sensors[] = {
|
||||||
.gain = ST_MAGN_2_FS_AVL_8000_GAIN,
|
.gain = ST_MAGN_2_FS_AVL_8000_GAIN,
|
||||||
},
|
},
|
||||||
[2] = {
|
[2] = {
|
||||||
.num = ST_MAGN_FS_AVL_10000MG,
|
.num = ST_MAGN_FS_AVL_12000MG,
|
||||||
.value = ST_MAGN_2_FS_AVL_10000_VAL,
|
.value = ST_MAGN_2_FS_AVL_12000_VAL,
|
||||||
.gain = ST_MAGN_2_FS_AVL_10000_GAIN,
|
.gain = ST_MAGN_2_FS_AVL_12000_GAIN,
|
||||||
|
},
|
||||||
|
[3] = {
|
||||||
|
.num = ST_MAGN_FS_AVL_16000MG,
|
||||||
|
.value = ST_MAGN_2_FS_AVL_16000_VAL,
|
||||||
|
.gain = ST_MAGN_2_FS_AVL_16000_GAIN,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
@ -586,17 +586,12 @@ isert_connect_request(struct rdma_cm_id *cma_id, struct rdma_cm_event *event)
|
||||||
init_completion(&isert_conn->conn_wait);
|
init_completion(&isert_conn->conn_wait);
|
||||||
init_completion(&isert_conn->conn_wait_comp_err);
|
init_completion(&isert_conn->conn_wait_comp_err);
|
||||||
kref_init(&isert_conn->conn_kref);
|
kref_init(&isert_conn->conn_kref);
|
||||||
kref_get(&isert_conn->conn_kref);
|
|
||||||
mutex_init(&isert_conn->conn_mutex);
|
mutex_init(&isert_conn->conn_mutex);
|
||||||
spin_lock_init(&isert_conn->conn_lock);
|
spin_lock_init(&isert_conn->conn_lock);
|
||||||
INIT_LIST_HEAD(&isert_conn->conn_fr_pool);
|
INIT_LIST_HEAD(&isert_conn->conn_fr_pool);
|
||||||
|
|
||||||
cma_id->context = isert_conn;
|
cma_id->context = isert_conn;
|
||||||
isert_conn->conn_cm_id = cma_id;
|
isert_conn->conn_cm_id = cma_id;
|
||||||
isert_conn->responder_resources = event->param.conn.responder_resources;
|
|
||||||
isert_conn->initiator_depth = event->param.conn.initiator_depth;
|
|
||||||
pr_debug("Using responder_resources: %u initiator_depth: %u\n",
|
|
||||||
isert_conn->responder_resources, isert_conn->initiator_depth);
|
|
||||||
|
|
||||||
isert_conn->login_buf = kzalloc(ISCSI_DEF_MAX_RECV_SEG_LEN +
|
isert_conn->login_buf = kzalloc(ISCSI_DEF_MAX_RECV_SEG_LEN +
|
||||||
ISER_RX_LOGIN_SIZE, GFP_KERNEL);
|
ISER_RX_LOGIN_SIZE, GFP_KERNEL);
|
||||||
|
@ -643,6 +638,12 @@ isert_connect_request(struct rdma_cm_id *cma_id, struct rdma_cm_event *event)
|
||||||
goto out_rsp_dma_map;
|
goto out_rsp_dma_map;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Set max inflight RDMA READ requests */
|
||||||
|
isert_conn->initiator_depth = min_t(u8,
|
||||||
|
event->param.conn.initiator_depth,
|
||||||
|
device->dev_attr.max_qp_init_rd_atom);
|
||||||
|
pr_debug("Using initiator_depth: %u\n", isert_conn->initiator_depth);
|
||||||
|
|
||||||
isert_conn->conn_device = device;
|
isert_conn->conn_device = device;
|
||||||
isert_conn->conn_pd = ib_alloc_pd(isert_conn->conn_device->ib_device);
|
isert_conn->conn_pd = ib_alloc_pd(isert_conn->conn_device->ib_device);
|
||||||
if (IS_ERR(isert_conn->conn_pd)) {
|
if (IS_ERR(isert_conn->conn_pd)) {
|
||||||
|
@ -746,7 +747,9 @@ isert_connect_release(struct isert_conn *isert_conn)
|
||||||
static void
|
static void
|
||||||
isert_connected_handler(struct rdma_cm_id *cma_id)
|
isert_connected_handler(struct rdma_cm_id *cma_id)
|
||||||
{
|
{
|
||||||
return;
|
struct isert_conn *isert_conn = cma_id->context;
|
||||||
|
|
||||||
|
kref_get(&isert_conn->conn_kref);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -798,7 +801,6 @@ isert_disconnect_work(struct work_struct *work)
|
||||||
|
|
||||||
wake_up:
|
wake_up:
|
||||||
complete(&isert_conn->conn_wait);
|
complete(&isert_conn->conn_wait);
|
||||||
isert_put_conn(isert_conn);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -3067,7 +3069,6 @@ isert_rdma_accept(struct isert_conn *isert_conn)
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
memset(&cp, 0, sizeof(struct rdma_conn_param));
|
memset(&cp, 0, sizeof(struct rdma_conn_param));
|
||||||
cp.responder_resources = isert_conn->responder_resources;
|
|
||||||
cp.initiator_depth = isert_conn->initiator_depth;
|
cp.initiator_depth = isert_conn->initiator_depth;
|
||||||
cp.retry_count = 7;
|
cp.retry_count = 7;
|
||||||
cp.rnr_retry_count = 7;
|
cp.rnr_retry_count = 7;
|
||||||
|
@ -3215,7 +3216,7 @@ static void isert_wait_conn(struct iscsi_conn *conn)
|
||||||
pr_debug("isert_wait_conn: Starting \n");
|
pr_debug("isert_wait_conn: Starting \n");
|
||||||
|
|
||||||
mutex_lock(&isert_conn->conn_mutex);
|
mutex_lock(&isert_conn->conn_mutex);
|
||||||
if (isert_conn->conn_cm_id) {
|
if (isert_conn->conn_cm_id && !isert_conn->disconnect) {
|
||||||
pr_debug("Calling rdma_disconnect from isert_wait_conn\n");
|
pr_debug("Calling rdma_disconnect from isert_wait_conn\n");
|
||||||
rdma_disconnect(isert_conn->conn_cm_id);
|
rdma_disconnect(isert_conn->conn_cm_id);
|
||||||
}
|
}
|
||||||
|
@ -3234,6 +3235,7 @@ static void isert_wait_conn(struct iscsi_conn *conn)
|
||||||
wait_for_completion(&isert_conn->conn_wait_comp_err);
|
wait_for_completion(&isert_conn->conn_wait_comp_err);
|
||||||
|
|
||||||
wait_for_completion(&isert_conn->conn_wait);
|
wait_for_completion(&isert_conn->conn_wait);
|
||||||
|
isert_put_conn(isert_conn);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void isert_free_conn(struct iscsi_conn *conn)
|
static void isert_free_conn(struct iscsi_conn *conn)
|
||||||
|
|
|
@ -1791,14 +1791,6 @@ static const struct dmi_system_id atkbd_dmi_quirk_table[] __initconst = {
|
||||||
{
|
{
|
||||||
.matches = {
|
.matches = {
|
||||||
DMI_MATCH(DMI_SYS_VENDOR, "LG Electronics"),
|
DMI_MATCH(DMI_SYS_VENDOR, "LG Electronics"),
|
||||||
DMI_MATCH(DMI_PRODUCT_NAME, "LW25-B7HV"),
|
|
||||||
},
|
|
||||||
.callback = atkbd_deactivate_fixup,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
.matches = {
|
|
||||||
DMI_MATCH(DMI_SYS_VENDOR, "LG Electronics"),
|
|
||||||
DMI_MATCH(DMI_PRODUCT_NAME, "P1-J273B"),
|
|
||||||
},
|
},
|
||||||
.callback = atkbd_deactivate_fixup,
|
.callback = atkbd_deactivate_fixup,
|
||||||
},
|
},
|
||||||
|
|
|
@ -465,6 +465,13 @@ static const struct dmi_system_id __initconst i8042_dmi_nomux_table[] = {
|
||||||
DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv4 Notebook PC"),
|
DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv4 Notebook PC"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
/* Avatar AVIU-145A6 */
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_SYS_VENDOR, "Intel"),
|
||||||
|
DMI_MATCH(DMI_PRODUCT_NAME, "IC4I"),
|
||||||
|
},
|
||||||
|
},
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -608,6 +615,14 @@ static const struct dmi_system_id __initconst i8042_dmi_notimeout_table[] = {
|
||||||
DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv4 Notebook PC"),
|
DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv4 Notebook PC"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
/* Fujitsu U574 laptop */
|
||||||
|
/* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
|
||||||
|
DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK U574"),
|
||||||
|
},
|
||||||
|
},
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1254,6 +1254,8 @@ static int __init i8042_create_aux_port(int idx)
|
||||||
} else {
|
} else {
|
||||||
snprintf(serio->name, sizeof(serio->name), "i8042 AUX%d port", idx);
|
snprintf(serio->name, sizeof(serio->name), "i8042 AUX%d port", idx);
|
||||||
snprintf(serio->phys, sizeof(serio->phys), I8042_MUX_PHYS_DESC, idx + 1);
|
snprintf(serio->phys, sizeof(serio->phys), I8042_MUX_PHYS_DESC, idx + 1);
|
||||||
|
strlcpy(serio->firmware_id, i8042_aux_firmware_id,
|
||||||
|
sizeof(serio->firmware_id));
|
||||||
}
|
}
|
||||||
|
|
||||||
port->serio = serio;
|
port->serio = serio;
|
||||||
|
|
|
@ -182,7 +182,6 @@ config MEDIA_SUBDRV_AUTOSELECT
|
||||||
depends on HAS_IOMEM
|
depends on HAS_IOMEM
|
||||||
select I2C
|
select I2C
|
||||||
select I2C_MUX
|
select I2C_MUX
|
||||||
select SPI
|
|
||||||
default y
|
default y
|
||||||
help
|
help
|
||||||
By default, a media driver auto-selects all possible ancillary
|
By default, a media driver auto-selects all possible ancillary
|
||||||
|
|
|
@ -280,6 +280,8 @@
|
||||||
#define USB_PID_PCTV_400E 0x020f
|
#define USB_PID_PCTV_400E 0x020f
|
||||||
#define USB_PID_PCTV_450E 0x0222
|
#define USB_PID_PCTV_450E 0x0222
|
||||||
#define USB_PID_PCTV_452E 0x021f
|
#define USB_PID_PCTV_452E 0x021f
|
||||||
|
#define USB_PID_PCTV_78E 0x025a
|
||||||
|
#define USB_PID_PCTV_79E 0x0262
|
||||||
#define USB_PID_REALTEK_RTL2831U 0x2831
|
#define USB_PID_REALTEK_RTL2831U 0x2831
|
||||||
#define USB_PID_REALTEK_RTL2832U 0x2832
|
#define USB_PID_REALTEK_RTL2832U 0x2832
|
||||||
#define USB_PID_TECHNOTREND_CONNECT_S2_3600 0x3007
|
#define USB_PID_TECHNOTREND_CONNECT_S2_3600 0x3007
|
||||||
|
|
|
@ -314,6 +314,19 @@ static int af9033_init(struct dvb_frontend *fe)
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* feed clock to RF tuner */
|
||||||
|
switch (state->cfg.tuner) {
|
||||||
|
case AF9033_TUNER_IT9135_38:
|
||||||
|
case AF9033_TUNER_IT9135_51:
|
||||||
|
case AF9033_TUNER_IT9135_52:
|
||||||
|
case AF9033_TUNER_IT9135_60:
|
||||||
|
case AF9033_TUNER_IT9135_61:
|
||||||
|
case AF9033_TUNER_IT9135_62:
|
||||||
|
ret = af9033_wr_reg(state, 0x80fba8, 0x00);
|
||||||
|
if (ret < 0)
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
/* settings for TS interface */
|
/* settings for TS interface */
|
||||||
if (state->cfg.ts_mode == AF9033_TS_MODE_USB) {
|
if (state->cfg.ts_mode == AF9033_TS_MODE_USB) {
|
||||||
ret = af9033_wr_reg_mask(state, 0x80f9a5, 0x00, 0x01);
|
ret = af9033_wr_reg_mask(state, 0x80f9a5, 0x00, 0x01);
|
||||||
|
|
|
@ -1418,7 +1418,7 @@ static const struct reg_val tuner_init_it9135_60[] = {
|
||||||
{ 0x800068, 0x0a },
|
{ 0x800068, 0x0a },
|
||||||
{ 0x80006a, 0x03 },
|
{ 0x80006a, 0x03 },
|
||||||
{ 0x800070, 0x0a },
|
{ 0x800070, 0x0a },
|
||||||
{ 0x800071, 0x05 },
|
{ 0x800071, 0x0a },
|
||||||
{ 0x800072, 0x02 },
|
{ 0x800072, 0x02 },
|
||||||
{ 0x800075, 0x8c },
|
{ 0x800075, 0x8c },
|
||||||
{ 0x800076, 0x8c },
|
{ 0x800076, 0x8c },
|
||||||
|
@ -1484,7 +1484,6 @@ static const struct reg_val tuner_init_it9135_60[] = {
|
||||||
{ 0x800104, 0x02 },
|
{ 0x800104, 0x02 },
|
||||||
{ 0x800105, 0xbe },
|
{ 0x800105, 0xbe },
|
||||||
{ 0x800106, 0x00 },
|
{ 0x800106, 0x00 },
|
||||||
{ 0x800109, 0x02 },
|
|
||||||
{ 0x800115, 0x0a },
|
{ 0x800115, 0x0a },
|
||||||
{ 0x800116, 0x03 },
|
{ 0x800116, 0x03 },
|
||||||
{ 0x80011a, 0xbe },
|
{ 0x80011a, 0xbe },
|
||||||
|
@ -1510,7 +1509,6 @@ static const struct reg_val tuner_init_it9135_60[] = {
|
||||||
{ 0x80014b, 0x8c },
|
{ 0x80014b, 0x8c },
|
||||||
{ 0x80014d, 0xac },
|
{ 0x80014d, 0xac },
|
||||||
{ 0x80014e, 0xc6 },
|
{ 0x80014e, 0xc6 },
|
||||||
{ 0x80014f, 0x03 },
|
|
||||||
{ 0x800151, 0x1e },
|
{ 0x800151, 0x1e },
|
||||||
{ 0x800153, 0xbc },
|
{ 0x800153, 0xbc },
|
||||||
{ 0x800178, 0x09 },
|
{ 0x800178, 0x09 },
|
||||||
|
@ -1522,9 +1520,10 @@ static const struct reg_val tuner_init_it9135_60[] = {
|
||||||
{ 0x80018d, 0x5f },
|
{ 0x80018d, 0x5f },
|
||||||
{ 0x80018f, 0xa0 },
|
{ 0x80018f, 0xa0 },
|
||||||
{ 0x800190, 0x5a },
|
{ 0x800190, 0x5a },
|
||||||
{ 0x80ed02, 0xff },
|
{ 0x800191, 0x00 },
|
||||||
{ 0x80ee42, 0xff },
|
{ 0x80ed02, 0x40 },
|
||||||
{ 0x80ee82, 0xff },
|
{ 0x80ee42, 0x40 },
|
||||||
|
{ 0x80ee82, 0x40 },
|
||||||
{ 0x80f000, 0x0f },
|
{ 0x80f000, 0x0f },
|
||||||
{ 0x80f01f, 0x8c },
|
{ 0x80f01f, 0x8c },
|
||||||
{ 0x80f020, 0x00 },
|
{ 0x80f020, 0x00 },
|
||||||
|
@ -1699,7 +1698,6 @@ static const struct reg_val tuner_init_it9135_61[] = {
|
||||||
{ 0x800104, 0x02 },
|
{ 0x800104, 0x02 },
|
||||||
{ 0x800105, 0xc8 },
|
{ 0x800105, 0xc8 },
|
||||||
{ 0x800106, 0x00 },
|
{ 0x800106, 0x00 },
|
||||||
{ 0x800109, 0x02 },
|
|
||||||
{ 0x800115, 0x0a },
|
{ 0x800115, 0x0a },
|
||||||
{ 0x800116, 0x03 },
|
{ 0x800116, 0x03 },
|
||||||
{ 0x80011a, 0xc6 },
|
{ 0x80011a, 0xc6 },
|
||||||
|
@ -1725,7 +1723,6 @@ static const struct reg_val tuner_init_it9135_61[] = {
|
||||||
{ 0x80014b, 0x8c },
|
{ 0x80014b, 0x8c },
|
||||||
{ 0x80014d, 0xa8 },
|
{ 0x80014d, 0xa8 },
|
||||||
{ 0x80014e, 0xc6 },
|
{ 0x80014e, 0xc6 },
|
||||||
{ 0x80014f, 0x03 },
|
|
||||||
{ 0x800151, 0x28 },
|
{ 0x800151, 0x28 },
|
||||||
{ 0x800153, 0xcc },
|
{ 0x800153, 0xcc },
|
||||||
{ 0x800178, 0x09 },
|
{ 0x800178, 0x09 },
|
||||||
|
@ -1737,9 +1734,10 @@ static const struct reg_val tuner_init_it9135_61[] = {
|
||||||
{ 0x80018d, 0x5f },
|
{ 0x80018d, 0x5f },
|
||||||
{ 0x80018f, 0xfb },
|
{ 0x80018f, 0xfb },
|
||||||
{ 0x800190, 0x5c },
|
{ 0x800190, 0x5c },
|
||||||
{ 0x80ed02, 0xff },
|
{ 0x800191, 0x00 },
|
||||||
{ 0x80ee42, 0xff },
|
{ 0x80ed02, 0x40 },
|
||||||
{ 0x80ee82, 0xff },
|
{ 0x80ee42, 0x40 },
|
||||||
|
{ 0x80ee82, 0x40 },
|
||||||
{ 0x80f000, 0x0f },
|
{ 0x80f000, 0x0f },
|
||||||
{ 0x80f01f, 0x8c },
|
{ 0x80f01f, 0x8c },
|
||||||
{ 0x80f020, 0x00 },
|
{ 0x80f020, 0x00 },
|
||||||
|
|
|
@ -1282,19 +1282,12 @@ static int smiapp_set_power(struct v4l2_subdev *subdev, int on)
|
||||||
|
|
||||||
mutex_lock(&sensor->power_mutex);
|
mutex_lock(&sensor->power_mutex);
|
||||||
|
|
||||||
/*
|
if (on && !sensor->power_count) {
|
||||||
* If the power count is modified from 0 to != 0 or from != 0
|
|
||||||
* to 0, update the power state.
|
|
||||||
*/
|
|
||||||
if (!sensor->power_count == !on)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
if (on) {
|
|
||||||
/* Power on and perform initialisation. */
|
/* Power on and perform initialisation. */
|
||||||
ret = smiapp_power_on(sensor);
|
ret = smiapp_power_on(sensor);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto out;
|
goto out;
|
||||||
} else {
|
} else if (!on && sensor->power_count == 1) {
|
||||||
smiapp_power_off(sensor);
|
smiapp_power_off(sensor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2572,7 +2565,7 @@ static int smiapp_registered(struct v4l2_subdev *subdev)
|
||||||
|
|
||||||
this->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
|
this->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
|
||||||
this->sd.internal_ops = &smiapp_internal_ops;
|
this->sd.internal_ops = &smiapp_internal_ops;
|
||||||
this->sd.owner = NULL;
|
this->sd.owner = THIS_MODULE;
|
||||||
v4l2_set_subdevdata(&this->sd, client);
|
v4l2_set_subdevdata(&this->sd, client);
|
||||||
|
|
||||||
rval = media_entity_init(&this->sd.entity,
|
rval = media_entity_init(&this->sd.entity,
|
||||||
|
|
|
@ -1091,6 +1091,7 @@ static int cx18_probe(struct pci_dev *pci_dev,
|
||||||
setup.addr = ADDR_UNSET;
|
setup.addr = ADDR_UNSET;
|
||||||
setup.type = cx->options.tuner;
|
setup.type = cx->options.tuner;
|
||||||
setup.mode_mask = T_ANALOG_TV; /* matches TV tuners */
|
setup.mode_mask = T_ANALOG_TV; /* matches TV tuners */
|
||||||
|
setup.config = NULL;
|
||||||
if (cx->options.radio > 0)
|
if (cx->options.radio > 0)
|
||||||
setup.mode_mask |= T_RADIO;
|
setup.mode_mask |= T_RADIO;
|
||||||
setup.tuner_callback = (setup.type == TUNER_XC2028) ?
|
setup.tuner_callback = (setup.type == TUNER_XC2028) ?
|
||||||
|
|
|
@ -396,6 +396,7 @@ struct dvb_frontend *it913x_attach(struct dvb_frontend *fe,
|
||||||
struct i2c_adapter *i2c_adap, u8 i2c_addr, u8 config)
|
struct i2c_adapter *i2c_adap, u8 i2c_addr, u8 config)
|
||||||
{
|
{
|
||||||
struct it913x_state *state = NULL;
|
struct it913x_state *state = NULL;
|
||||||
|
int ret;
|
||||||
|
|
||||||
/* allocate memory for the internal state */
|
/* allocate memory for the internal state */
|
||||||
state = kzalloc(sizeof(struct it913x_state), GFP_KERNEL);
|
state = kzalloc(sizeof(struct it913x_state), GFP_KERNEL);
|
||||||
|
@ -425,6 +426,11 @@ struct dvb_frontend *it913x_attach(struct dvb_frontend *fe,
|
||||||
state->tuner_type = config;
|
state->tuner_type = config;
|
||||||
state->firmware_ver = 1;
|
state->firmware_ver = 1;
|
||||||
|
|
||||||
|
/* tuner RF initial */
|
||||||
|
ret = it913x_wr_reg(state, PRO_DMOD, 0xec4c, 0x68);
|
||||||
|
if (ret < 0)
|
||||||
|
goto error;
|
||||||
|
|
||||||
fe->tuner_priv = state;
|
fe->tuner_priv = state;
|
||||||
memcpy(&fe->ops.tuner_ops, &it913x_tuner_ops,
|
memcpy(&fe->ops.tuner_ops, &it913x_tuner_ops,
|
||||||
sizeof(struct dvb_tuner_ops));
|
sizeof(struct dvb_tuner_ops));
|
||||||
|
|
|
@ -1575,6 +1575,10 @@ static const struct usb_device_id af9035_id_table[] = {
|
||||||
&af9035_props, "Leadtek WinFast DTV Dongle Dual", NULL) },
|
&af9035_props, "Leadtek WinFast DTV Dongle Dual", NULL) },
|
||||||
{ DVB_USB_DEVICE(USB_VID_HAUPPAUGE, 0xf900,
|
{ DVB_USB_DEVICE(USB_VID_HAUPPAUGE, 0xf900,
|
||||||
&af9035_props, "Hauppauge WinTV-MiniStick 2", NULL) },
|
&af9035_props, "Hauppauge WinTV-MiniStick 2", NULL) },
|
||||||
|
{ DVB_USB_DEVICE(USB_VID_PCTV, USB_PID_PCTV_78E,
|
||||||
|
&af9035_props, "PCTV 78e", RC_MAP_IT913X_V1) },
|
||||||
|
{ DVB_USB_DEVICE(USB_VID_PCTV, USB_PID_PCTV_79E,
|
||||||
|
&af9035_props, "PCTV 79e", RC_MAP_IT913X_V2) },
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(usb, af9035_id_table);
|
MODULE_DEVICE_TABLE(usb, af9035_id_table);
|
||||||
|
|
|
@ -49,6 +49,9 @@ struct imx6_pcie {
|
||||||
|
|
||||||
/* PCIe Port Logic registers (memory-mapped) */
|
/* PCIe Port Logic registers (memory-mapped) */
|
||||||
#define PL_OFFSET 0x700
|
#define PL_OFFSET 0x700
|
||||||
|
#define PCIE_PL_PFLR (PL_OFFSET + 0x08)
|
||||||
|
#define PCIE_PL_PFLR_LINK_STATE_MASK (0x3f << 16)
|
||||||
|
#define PCIE_PL_PFLR_FORCE_LINK (1 << 15)
|
||||||
#define PCIE_PHY_DEBUG_R0 (PL_OFFSET + 0x28)
|
#define PCIE_PHY_DEBUG_R0 (PL_OFFSET + 0x28)
|
||||||
#define PCIE_PHY_DEBUG_R1 (PL_OFFSET + 0x2c)
|
#define PCIE_PHY_DEBUG_R1 (PL_OFFSET + 0x2c)
|
||||||
#define PCIE_PHY_DEBUG_R1_XMLH_LINK_IN_TRAINING (1 << 29)
|
#define PCIE_PHY_DEBUG_R1_XMLH_LINK_IN_TRAINING (1 << 29)
|
||||||
|
@ -214,6 +217,32 @@ static int imx6q_pcie_abort_handler(unsigned long addr,
|
||||||
static int imx6_pcie_assert_core_reset(struct pcie_port *pp)
|
static int imx6_pcie_assert_core_reset(struct pcie_port *pp)
|
||||||
{
|
{
|
||||||
struct imx6_pcie *imx6_pcie = to_imx6_pcie(pp);
|
struct imx6_pcie *imx6_pcie = to_imx6_pcie(pp);
|
||||||
|
u32 val, gpr1, gpr12;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If the bootloader already enabled the link we need some special
|
||||||
|
* handling to get the core back into a state where it is safe to
|
||||||
|
* touch it for configuration. As there is no dedicated reset signal
|
||||||
|
* wired up for MX6QDL, we need to manually force LTSSM into "detect"
|
||||||
|
* state before completely disabling LTSSM, which is a prerequisite
|
||||||
|
* for core configuration.
|
||||||
|
*
|
||||||
|
* If both LTSSM_ENABLE and REF_SSP_ENABLE are active we have a strong
|
||||||
|
* indication that the bootloader activated the link.
|
||||||
|
*/
|
||||||
|
regmap_read(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1, &gpr1);
|
||||||
|
regmap_read(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12, &gpr12);
|
||||||
|
|
||||||
|
if ((gpr1 & IMX6Q_GPR1_PCIE_REF_CLK_EN) &&
|
||||||
|
(gpr12 & IMX6Q_GPR12_PCIE_CTL_2)) {
|
||||||
|
val = readl(pp->dbi_base + PCIE_PL_PFLR);
|
||||||
|
val &= ~PCIE_PL_PFLR_LINK_STATE_MASK;
|
||||||
|
val |= PCIE_PL_PFLR_FORCE_LINK;
|
||||||
|
writel(val, pp->dbi_base + PCIE_PL_PFLR);
|
||||||
|
|
||||||
|
regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR12,
|
||||||
|
IMX6Q_GPR12_PCIE_CTL_2, 0 << 10);
|
||||||
|
}
|
||||||
|
|
||||||
regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1,
|
regmap_update_bits(imx6_pcie->iomuxc_gpr, IOMUXC_GPR1,
|
||||||
IMX6Q_GPR1_PCIE_TEST_PD, 1 << 18);
|
IMX6Q_GPR1_PCIE_TEST_PD, 1 << 18);
|
||||||
|
@ -589,6 +618,14 @@ static int __init imx6_pcie_probe(struct platform_device *pdev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void imx6_pcie_shutdown(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
struct imx6_pcie *imx6_pcie = platform_get_drvdata(pdev);
|
||||||
|
|
||||||
|
/* bring down link, so bootloader gets clean state in case of reboot */
|
||||||
|
imx6_pcie_assert_core_reset(&imx6_pcie->pp);
|
||||||
|
}
|
||||||
|
|
||||||
static const struct of_device_id imx6_pcie_of_match[] = {
|
static const struct of_device_id imx6_pcie_of_match[] = {
|
||||||
{ .compatible = "fsl,imx6q-pcie", },
|
{ .compatible = "fsl,imx6q-pcie", },
|
||||||
{},
|
{},
|
||||||
|
@ -601,6 +638,7 @@ static struct platform_driver imx6_pcie_driver = {
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
.of_match_table = imx6_pcie_of_match,
|
.of_match_table = imx6_pcie_of_match,
|
||||||
},
|
},
|
||||||
|
.shutdown = imx6_pcie_shutdown,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Freescale PCIe driver does not allow module unload */
|
/* Freescale PCIe driver does not allow module unload */
|
||||||
|
|
|
@ -560,19 +560,15 @@ static void disable_slot(struct acpiphp_slot *slot)
|
||||||
slot->flags &= (~SLOT_ENABLED);
|
slot->flags &= (~SLOT_ENABLED);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool acpiphp_no_hotplug(struct acpi_device *adev)
|
|
||||||
{
|
|
||||||
return adev && adev->flags.no_hotplug;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool slot_no_hotplug(struct acpiphp_slot *slot)
|
static bool slot_no_hotplug(struct acpiphp_slot *slot)
|
||||||
{
|
{
|
||||||
struct acpiphp_func *func;
|
struct pci_bus *bus = slot->bus;
|
||||||
|
struct pci_dev *dev;
|
||||||
|
|
||||||
list_for_each_entry(func, &slot->funcs, sibling)
|
list_for_each_entry(dev, &bus->devices, bus_list) {
|
||||||
if (acpiphp_no_hotplug(func_to_acpi_device(func)))
|
if (PCI_SLOT(dev->devfn) == slot->device && dev->ignore_hotplug)
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -645,7 +641,7 @@ static void trim_stale_devices(struct pci_dev *dev)
|
||||||
|
|
||||||
status = acpi_evaluate_integer(adev->handle, "_STA", NULL, &sta);
|
status = acpi_evaluate_integer(adev->handle, "_STA", NULL, &sta);
|
||||||
alive = (ACPI_SUCCESS(status) && device_status_valid(sta))
|
alive = (ACPI_SUCCESS(status) && device_status_valid(sta))
|
||||||
|| acpiphp_no_hotplug(adev);
|
|| dev->ignore_hotplug;
|
||||||
}
|
}
|
||||||
if (!alive)
|
if (!alive)
|
||||||
alive = pci_device_is_present(dev);
|
alive = pci_device_is_present(dev);
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue