Linux 3.8-rc6
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.13 (GNU/Linux) iQEcBAABAgAGBQJRCxWdAAoJEHm+PkMAQRiG3bAH/28D2NbRLIDo6QIzk3seCCh3 A6vqDWbX671JRa0RO38DrWhqv6L/EisvjNZMVxBNaN635+3+yC7wsKziXYxA4+AL Ef9JISiwXykRWwrC8Q34YBWfWgeFTmaau71IRv45x2OTwiijd6cvjXhLDrOhHEGL rdAGJxIdBOfuASw1zpn9PxzfAtg1j/FGP03B4yy+JFhYzuDp3pvnDIysAnXefLml UheuBELdNf8Jx7NtW80PTa+TQtruWPC8otoiJevV4TrAWmAOctJiM1izL+VOZqqD I/v5aGf9mCN+cxLq06imwgEHWmP1I7yDdjjTHrr4wwIMws1vg8PNsJqG3AsPcwM= =dR8S -----END PGP SIGNATURE----- Merge tag 'v3.8-rc6' into next/dt Linux 3.8-rc6
This commit is contained in:
Коммит
604d11d991
|
@ -141,3 +141,4 @@ Version History
|
||||||
1.2.0 Handle creation of arrays that contain failed devices.
|
1.2.0 Handle creation of arrays that contain failed devices.
|
||||||
1.3.0 Added support for RAID 10
|
1.3.0 Added support for RAID 10
|
||||||
1.3.1 Allow device replacement/rebuild for RAID 10
|
1.3.1 Allow device replacement/rebuild for RAID 10
|
||||||
|
1.3.2 Fix/improve redundancy checking for RAID10
|
||||||
|
|
|
@ -57,6 +57,10 @@ Protocol 2.10: (Kernel 2.6.31) Added a protocol for relaxed alignment
|
||||||
Protocol 2.11: (Kernel 3.6) Added a field for offset of EFI handover
|
Protocol 2.11: (Kernel 3.6) Added a field for offset of EFI handover
|
||||||
protocol entry point.
|
protocol entry point.
|
||||||
|
|
||||||
|
Protocol 2.12: (Kernel 3.9) Added the xloadflags field and extension fields
|
||||||
|
to struct boot_params for for loading bzImage and ramdisk
|
||||||
|
above 4G in 64bit.
|
||||||
|
|
||||||
**** MEMORY LAYOUT
|
**** MEMORY LAYOUT
|
||||||
|
|
||||||
The traditional memory map for the kernel loader, used for Image or
|
The traditional memory map for the kernel loader, used for Image or
|
||||||
|
@ -182,7 +186,7 @@ Offset Proto Name Meaning
|
||||||
0230/4 2.05+ kernel_alignment Physical addr alignment required for kernel
|
0230/4 2.05+ kernel_alignment Physical addr alignment required for kernel
|
||||||
0234/1 2.05+ relocatable_kernel Whether kernel is relocatable or not
|
0234/1 2.05+ relocatable_kernel Whether kernel is relocatable or not
|
||||||
0235/1 2.10+ min_alignment Minimum alignment, as a power of two
|
0235/1 2.10+ min_alignment Minimum alignment, as a power of two
|
||||||
0236/2 N/A pad3 Unused
|
0236/2 2.12+ xloadflags Boot protocol option flags
|
||||||
0238/4 2.06+ cmdline_size Maximum size of the kernel command line
|
0238/4 2.06+ cmdline_size Maximum size of the kernel command line
|
||||||
023C/4 2.07+ hardware_subarch Hardware subarchitecture
|
023C/4 2.07+ hardware_subarch Hardware subarchitecture
|
||||||
0240/8 2.07+ hardware_subarch_data Subarchitecture-specific data
|
0240/8 2.07+ hardware_subarch_data Subarchitecture-specific data
|
||||||
|
@ -582,6 +586,27 @@ Protocol: 2.10+
|
||||||
misaligned kernel. Therefore, a loader should typically try each
|
misaligned kernel. Therefore, a loader should typically try each
|
||||||
power-of-two alignment from kernel_alignment down to this alignment.
|
power-of-two alignment from kernel_alignment down to this alignment.
|
||||||
|
|
||||||
|
Field name: xloadflags
|
||||||
|
Type: read
|
||||||
|
Offset/size: 0x236/2
|
||||||
|
Protocol: 2.12+
|
||||||
|
|
||||||
|
This field is a bitmask.
|
||||||
|
|
||||||
|
Bit 0 (read): XLF_KERNEL_64
|
||||||
|
- If 1, this kernel has the legacy 64-bit entry point at 0x200.
|
||||||
|
|
||||||
|
Bit 1 (read): XLF_CAN_BE_LOADED_ABOVE_4G
|
||||||
|
- If 1, kernel/boot_params/cmdline/ramdisk can be above 4G.
|
||||||
|
|
||||||
|
Bit 2 (read): XLF_EFI_HANDOVER_32
|
||||||
|
- If 1, the kernel supports the 32-bit EFI handoff entry point
|
||||||
|
given at handover_offset.
|
||||||
|
|
||||||
|
Bit 3 (read): XLF_EFI_HANDOVER_64
|
||||||
|
- If 1, the kernel supports the 64-bit EFI handoff entry point
|
||||||
|
given at handover_offset + 0x200.
|
||||||
|
|
||||||
Field name: cmdline_size
|
Field name: cmdline_size
|
||||||
Type: read
|
Type: read
|
||||||
Offset/size: 0x238/4
|
Offset/size: 0x238/4
|
||||||
|
|
|
@ -19,6 +19,9 @@ Offset Proto Name Meaning
|
||||||
090/010 ALL hd1_info hd1 disk parameter, OBSOLETE!!
|
090/010 ALL hd1_info hd1 disk parameter, OBSOLETE!!
|
||||||
0A0/010 ALL sys_desc_table System description table (struct sys_desc_table)
|
0A0/010 ALL sys_desc_table System description table (struct sys_desc_table)
|
||||||
0B0/010 ALL olpc_ofw_header OLPC's OpenFirmware CIF and friends
|
0B0/010 ALL olpc_ofw_header OLPC's OpenFirmware CIF and friends
|
||||||
|
0C0/004 ALL ext_ramdisk_image ramdisk_image high 32bits
|
||||||
|
0C4/004 ALL ext_ramdisk_size ramdisk_size high 32bits
|
||||||
|
0C8/004 ALL ext_cmd_line_ptr cmd_line_ptr high 32bits
|
||||||
140/080 ALL edid_info Video mode setup (struct edid_info)
|
140/080 ALL edid_info Video mode setup (struct edid_info)
|
||||||
1C0/020 ALL efi_info EFI 32 information (struct efi_info)
|
1C0/020 ALL efi_info EFI 32 information (struct efi_info)
|
||||||
1E0/004 ALL alk_mem_k Alternative mem check, in KB
|
1E0/004 ALL alk_mem_k Alternative mem check, in KB
|
||||||
|
@ -27,6 +30,7 @@ Offset Proto Name Meaning
|
||||||
1E9/001 ALL eddbuf_entries Number of entries in eddbuf (below)
|
1E9/001 ALL eddbuf_entries Number of entries in eddbuf (below)
|
||||||
1EA/001 ALL edd_mbr_sig_buf_entries Number of entries in edd_mbr_sig_buffer
|
1EA/001 ALL edd_mbr_sig_buf_entries Number of entries in edd_mbr_sig_buffer
|
||||||
(below)
|
(below)
|
||||||
|
1EF/001 ALL sentinel Used to detect broken bootloaders
|
||||||
290/040 ALL edd_mbr_sig_buffer EDD MBR signatures
|
290/040 ALL edd_mbr_sig_buffer EDD MBR signatures
|
||||||
2D0/A00 ALL e820_map E820 memory map table
|
2D0/A00 ALL e820_map E820 memory map table
|
||||||
(array of struct e820entry)
|
(array of struct e820entry)
|
||||||
|
|
|
@ -2966,7 +2966,7 @@ S: Maintained
|
||||||
F: drivers/net/ethernet/i825xx/eexpress.*
|
F: drivers/net/ethernet/i825xx/eexpress.*
|
||||||
|
|
||||||
ETHERNET BRIDGE
|
ETHERNET BRIDGE
|
||||||
M: Stephen Hemminger <shemminger@vyatta.com>
|
M: Stephen Hemminger <stephen@networkplumber.org>
|
||||||
L: bridge@lists.linux-foundation.org
|
L: bridge@lists.linux-foundation.org
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
W: http://www.linuxfoundation.org/en/Net:Bridge
|
W: http://www.linuxfoundation.org/en/Net:Bridge
|
||||||
|
@ -4906,7 +4906,7 @@ S: Maintained
|
||||||
|
|
||||||
MARVELL GIGABIT ETHERNET DRIVERS (skge/sky2)
|
MARVELL GIGABIT ETHERNET DRIVERS (skge/sky2)
|
||||||
M: Mirko Lindner <mlindner@marvell.com>
|
M: Mirko Lindner <mlindner@marvell.com>
|
||||||
M: Stephen Hemminger <shemminger@vyatta.com>
|
M: Stephen Hemminger <stephen@networkplumber.org>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/net/ethernet/marvell/sk*
|
F: drivers/net/ethernet/marvell/sk*
|
||||||
|
@ -5181,7 +5181,7 @@ S: Supported
|
||||||
F: drivers/infiniband/hw/nes/
|
F: drivers/infiniband/hw/nes/
|
||||||
|
|
||||||
NETEM NETWORK EMULATOR
|
NETEM NETWORK EMULATOR
|
||||||
M: Stephen Hemminger <shemminger@vyatta.com>
|
M: Stephen Hemminger <stephen@networkplumber.org>
|
||||||
L: netem@lists.linux-foundation.org
|
L: netem@lists.linux-foundation.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: net/sched/sch_netem.c
|
F: net/sched/sch_netem.c
|
||||||
|
@ -7089,7 +7089,7 @@ F: include/uapi/sound/
|
||||||
F: sound/
|
F: sound/
|
||||||
|
|
||||||
SOUND - SOC LAYER / DYNAMIC AUDIO POWER MANAGEMENT (ASoC)
|
SOUND - SOC LAYER / DYNAMIC AUDIO POWER MANAGEMENT (ASoC)
|
||||||
M: Liam Girdwood <lrg@ti.com>
|
M: Liam Girdwood <lgirdwood@gmail.com>
|
||||||
M: Mark Brown <broonie@opensource.wolfsonmicro.com>
|
M: Mark Brown <broonie@opensource.wolfsonmicro.com>
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
|
||||||
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||||
|
|
4
Makefile
4
Makefile
|
@ -1,8 +1,8 @@
|
||||||
VERSION = 3
|
VERSION = 3
|
||||||
PATCHLEVEL = 8
|
PATCHLEVEL = 8
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION = -rc5
|
EXTRAVERSION = -rc6
|
||||||
NAME = Terrified Chipmunk
|
NAME = Unicycling Gorilla
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
# To see a list of typical targets execute "make help"
|
# To see a list of typical targets execute "make help"
|
||||||
|
|
|
@ -8,8 +8,10 @@ config BCM47XX_SSB
|
||||||
select SSB_DRIVER_EXTIF
|
select SSB_DRIVER_EXTIF
|
||||||
select SSB_EMBEDDED
|
select SSB_EMBEDDED
|
||||||
select SSB_B43_PCI_BRIDGE if PCI
|
select SSB_B43_PCI_BRIDGE if PCI
|
||||||
|
select SSB_DRIVER_PCICORE if PCI
|
||||||
select SSB_PCICORE_HOSTMODE if PCI
|
select SSB_PCICORE_HOSTMODE if PCI
|
||||||
select SSB_DRIVER_GPIO
|
select SSB_DRIVER_GPIO
|
||||||
|
select GPIOLIB
|
||||||
default y
|
default y
|
||||||
help
|
help
|
||||||
Add support for old Broadcom BCM47xx boards with Sonics Silicon Backplane support.
|
Add support for old Broadcom BCM47xx boards with Sonics Silicon Backplane support.
|
||||||
|
@ -25,6 +27,7 @@ config BCM47XX_BCMA
|
||||||
select BCMA_HOST_PCI if PCI
|
select BCMA_HOST_PCI if PCI
|
||||||
select BCMA_DRIVER_PCI_HOSTMODE if PCI
|
select BCMA_DRIVER_PCI_HOSTMODE if PCI
|
||||||
select BCMA_DRIVER_GPIO
|
select BCMA_DRIVER_GPIO
|
||||||
|
select GPIOLIB
|
||||||
default y
|
default y
|
||||||
help
|
help
|
||||||
Add support for new Broadcom BCM47xx boards with Broadcom specific Advanced Microcontroller Bus.
|
Add support for new Broadcom BCM47xx boards with Broadcom specific Advanced Microcontroller Bus.
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
* measurement, and debugging facilities.
|
* measurement, and debugging facilities.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <linux/compiler.h>
|
||||||
#include <linux/irqflags.h>
|
#include <linux/irqflags.h>
|
||||||
#include <asm/octeon/cvmx.h>
|
#include <asm/octeon/cvmx.h>
|
||||||
#include <asm/octeon/cvmx-l2c.h>
|
#include <asm/octeon/cvmx-l2c.h>
|
||||||
|
@ -285,22 +286,22 @@ uint64_t cvmx_l2c_read_perf(uint32_t counter)
|
||||||
*/
|
*/
|
||||||
static void fault_in(uint64_t addr, int len)
|
static void fault_in(uint64_t addr, int len)
|
||||||
{
|
{
|
||||||
volatile char *ptr;
|
char *ptr;
|
||||||
volatile char dummy;
|
|
||||||
/*
|
/*
|
||||||
* Adjust addr and length so we get all cache lines even for
|
* Adjust addr and length so we get all cache lines even for
|
||||||
* small ranges spanning two cache lines.
|
* small ranges spanning two cache lines.
|
||||||
*/
|
*/
|
||||||
len += addr & CVMX_CACHE_LINE_MASK;
|
len += addr & CVMX_CACHE_LINE_MASK;
|
||||||
addr &= ~CVMX_CACHE_LINE_MASK;
|
addr &= ~CVMX_CACHE_LINE_MASK;
|
||||||
ptr = (volatile char *)cvmx_phys_to_ptr(addr);
|
ptr = cvmx_phys_to_ptr(addr);
|
||||||
/*
|
/*
|
||||||
* Invalidate L1 cache to make sure all loads result in data
|
* Invalidate L1 cache to make sure all loads result in data
|
||||||
* being in L2.
|
* being in L2.
|
||||||
*/
|
*/
|
||||||
CVMX_DCACHE_INVALIDATE;
|
CVMX_DCACHE_INVALIDATE;
|
||||||
while (len > 0) {
|
while (len > 0) {
|
||||||
dummy += *ptr;
|
ACCESS_ONCE(*ptr);
|
||||||
len -= CVMX_CACHE_LINE_SIZE;
|
len -= CVMX_CACHE_LINE_SIZE;
|
||||||
ptr += CVMX_CACHE_LINE_SIZE;
|
ptr += CVMX_CACHE_LINE_SIZE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
#include <asm/mipsregs.h>
|
#include <asm/mipsregs.h>
|
||||||
|
|
||||||
#define DSP_DEFAULT 0x00000000
|
#define DSP_DEFAULT 0x00000000
|
||||||
#define DSP_MASK 0x3ff
|
#define DSP_MASK 0x3f
|
||||||
|
|
||||||
#define __enable_dsp_hazard() \
|
#define __enable_dsp_hazard() \
|
||||||
do { \
|
do { \
|
||||||
|
|
|
@ -353,6 +353,7 @@ union mips_instruction {
|
||||||
struct u_format u_format;
|
struct u_format u_format;
|
||||||
struct c_format c_format;
|
struct c_format c_format;
|
||||||
struct r_format r_format;
|
struct r_format r_format;
|
||||||
|
struct p_format p_format;
|
||||||
struct f_format f_format;
|
struct f_format f_format;
|
||||||
struct ma_format ma_format;
|
struct ma_format ma_format;
|
||||||
struct b_format b_format;
|
struct b_format b_format;
|
||||||
|
|
|
@ -21,4 +21,4 @@
|
||||||
#define R10000_LLSC_WAR 0
|
#define R10000_LLSC_WAR 0
|
||||||
#define MIPS34K_MISSED_ITLB_WAR 0
|
#define MIPS34K_MISSED_ITLB_WAR 0
|
||||||
|
|
||||||
#endif /* __ASM_MIPS_MACH_PNX8550_WAR_H */
|
#endif /* __ASM_MIPS_MACH_PNX833X_WAR_H */
|
||||||
|
|
|
@ -230,6 +230,7 @@ static inline void pud_clear(pud_t *pudp)
|
||||||
#else
|
#else
|
||||||
#define pte_pfn(x) ((unsigned long)((x).pte >> _PFN_SHIFT))
|
#define pte_pfn(x) ((unsigned long)((x).pte >> _PFN_SHIFT))
|
||||||
#define pfn_pte(pfn, prot) __pte(((pfn) << _PFN_SHIFT) | pgprot_val(prot))
|
#define pfn_pte(pfn, prot) __pte(((pfn) << _PFN_SHIFT) | pgprot_val(prot))
|
||||||
|
#define pfn_pmd(pfn, prot) __pmd(((pfn) << _PFN_SHIFT) | pgprot_val(prot))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define __pgd_offset(address) pgd_index(address)
|
#define __pgd_offset(address) pgd_index(address)
|
||||||
|
|
|
@ -3,6 +3,7 @@ include include/uapi/asm-generic/Kbuild.asm
|
||||||
|
|
||||||
header-y += auxvec.h
|
header-y += auxvec.h
|
||||||
header-y += bitsperlong.h
|
header-y += bitsperlong.h
|
||||||
|
header-y += break.h
|
||||||
header-y += byteorder.h
|
header-y += byteorder.h
|
||||||
header-y += cachectl.h
|
header-y += cachectl.h
|
||||||
header-y += errno.h
|
header-y += errno.h
|
||||||
|
|
|
@ -25,6 +25,12 @@
|
||||||
#define MCOUNT_OFFSET_INSNS 4
|
#define MCOUNT_OFFSET_INSNS 4
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Arch override because MIPS doesn't need to run this from stop_machine() */
|
||||||
|
void arch_ftrace_update_code(int command)
|
||||||
|
{
|
||||||
|
ftrace_modify_all_code(command);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check if the address is in kernel space
|
* Check if the address is in kernel space
|
||||||
*
|
*
|
||||||
|
@ -89,6 +95,24 @@ static int ftrace_modify_code(unsigned long ip, unsigned int new_code)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef CONFIG_64BIT
|
||||||
|
static int ftrace_modify_code_2(unsigned long ip, unsigned int new_code1,
|
||||||
|
unsigned int new_code2)
|
||||||
|
{
|
||||||
|
int faulted;
|
||||||
|
|
||||||
|
safe_store_code(new_code1, ip, faulted);
|
||||||
|
if (unlikely(faulted))
|
||||||
|
return -EFAULT;
|
||||||
|
ip += 4;
|
||||||
|
safe_store_code(new_code2, ip, faulted);
|
||||||
|
if (unlikely(faulted))
|
||||||
|
return -EFAULT;
|
||||||
|
flush_icache_range(ip, ip + 8); /* original ip + 12 */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The details about the calling site of mcount on MIPS
|
* The details about the calling site of mcount on MIPS
|
||||||
*
|
*
|
||||||
|
@ -131,8 +155,18 @@ int ftrace_make_nop(struct module *mod,
|
||||||
* needed.
|
* needed.
|
||||||
*/
|
*/
|
||||||
new = in_kernel_space(ip) ? INSN_NOP : INSN_B_1F;
|
new = in_kernel_space(ip) ? INSN_NOP : INSN_B_1F;
|
||||||
|
#ifdef CONFIG_64BIT
|
||||||
return ftrace_modify_code(ip, new);
|
return ftrace_modify_code(ip, new);
|
||||||
|
#else
|
||||||
|
/*
|
||||||
|
* On 32 bit MIPS platforms, gcc adds a stack adjust
|
||||||
|
* instruction in the delay slot after the branch to
|
||||||
|
* mcount and expects mcount to restore the sp on return.
|
||||||
|
* This is based on a legacy API and does nothing but
|
||||||
|
* waste instructions so it's being removed at runtime.
|
||||||
|
*/
|
||||||
|
return ftrace_modify_code_2(ip, new, INSN_NOP);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr)
|
int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr)
|
||||||
|
|
|
@ -46,9 +46,8 @@
|
||||||
PTR_L a5, PT_R9(sp)
|
PTR_L a5, PT_R9(sp)
|
||||||
PTR_L a6, PT_R10(sp)
|
PTR_L a6, PT_R10(sp)
|
||||||
PTR_L a7, PT_R11(sp)
|
PTR_L a7, PT_R11(sp)
|
||||||
PTR_ADDIU sp, PT_SIZE
|
|
||||||
#else
|
#else
|
||||||
PTR_ADDIU sp, (PT_SIZE + 8)
|
PTR_ADDIU sp, PT_SIZE
|
||||||
#endif
|
#endif
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
@ -69,7 +68,9 @@ NESTED(ftrace_caller, PT_SIZE, ra)
|
||||||
.globl _mcount
|
.globl _mcount
|
||||||
_mcount:
|
_mcount:
|
||||||
b ftrace_stub
|
b ftrace_stub
|
||||||
nop
|
addiu sp,sp,8
|
||||||
|
|
||||||
|
/* When tracing is activated, it calls ftrace_caller+8 (aka here) */
|
||||||
lw t1, function_trace_stop
|
lw t1, function_trace_stop
|
||||||
bnez t1, ftrace_stub
|
bnez t1, ftrace_stub
|
||||||
nop
|
nop
|
||||||
|
|
|
@ -705,7 +705,7 @@ static int vpe_run(struct vpe * v)
|
||||||
|
|
||||||
printk(KERN_WARNING
|
printk(KERN_WARNING
|
||||||
"VPE loader: TC %d is already in use.\n",
|
"VPE loader: TC %d is already in use.\n",
|
||||||
t->index);
|
v->tc->index);
|
||||||
return -ENOEXEC;
|
return -ENOEXEC;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -408,7 +408,7 @@ int __init icu_of_init(struct device_node *node, struct device_node *parent)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* tell oprofile which irq to use */
|
/* tell oprofile which irq to use */
|
||||||
cp0_perfcount_irq = LTQ_PERF_IRQ;
|
cp0_perfcount_irq = irq_create_mapping(ltq_domain, LTQ_PERF_IRQ);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* if the timer irq is not one of the mips irqs we need to
|
* if the timer irq is not one of the mips irqs we need to
|
||||||
|
|
|
@ -21,7 +21,7 @@ void __delay(unsigned long loops)
|
||||||
" .set noreorder \n"
|
" .set noreorder \n"
|
||||||
" .align 3 \n"
|
" .align 3 \n"
|
||||||
"1: bnez %0, 1b \n"
|
"1: bnez %0, 1b \n"
|
||||||
#if __SIZEOF_LONG__ == 4
|
#if BITS_PER_LONG == 32
|
||||||
" subu %0, 1 \n"
|
" subu %0, 1 \n"
|
||||||
#else
|
#else
|
||||||
" dsubu %0, 1 \n"
|
" dsubu %0, 1 \n"
|
||||||
|
|
|
@ -190,9 +190,3 @@ void __iounmap(const volatile void __iomem *addr)
|
||||||
|
|
||||||
EXPORT_SYMBOL(__ioremap);
|
EXPORT_SYMBOL(__ioremap);
|
||||||
EXPORT_SYMBOL(__iounmap);
|
EXPORT_SYMBOL(__iounmap);
|
||||||
|
|
||||||
int __virt_addr_valid(const volatile void *kaddr)
|
|
||||||
{
|
|
||||||
return pfn_valid(PFN_DOWN(virt_to_phys(kaddr)));
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(__virt_addr_valid);
|
|
||||||
|
|
|
@ -192,3 +192,9 @@ unsigned long arch_randomize_brk(struct mm_struct *mm)
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int __virt_addr_valid(const volatile void *kaddr)
|
||||||
|
{
|
||||||
|
return pfn_valid(PFN_DOWN(virt_to_phys(kaddr)));
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(__virt_addr_valid);
|
||||||
|
|
|
@ -193,8 +193,11 @@ static void nlm_init_node(void)
|
||||||
|
|
||||||
void __init prom_init(void)
|
void __init prom_init(void)
|
||||||
{
|
{
|
||||||
int i, *argv, *envp; /* passed as 32 bit ptrs */
|
int *argv, *envp; /* passed as 32 bit ptrs */
|
||||||
struct psb_info *prom_infop;
|
struct psb_info *prom_infop;
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
int i;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* truncate to 32 bit and sign extend all args */
|
/* truncate to 32 bit and sign extend all args */
|
||||||
argv = (int *)(long)(int)fw_arg1;
|
argv = (int *)(long)(int)fw_arg1;
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
#include <asm/mach-ath79/pci.h>
|
#include <asm/mach-ath79/pci.h>
|
||||||
|
|
||||||
#define AR71XX_PCI_MEM_BASE 0x10000000
|
#define AR71XX_PCI_MEM_BASE 0x10000000
|
||||||
#define AR71XX_PCI_MEM_SIZE 0x08000000
|
#define AR71XX_PCI_MEM_SIZE 0x07000000
|
||||||
|
|
||||||
#define AR71XX_PCI_WIN0_OFFS 0x10000000
|
#define AR71XX_PCI_WIN0_OFFS 0x10000000
|
||||||
#define AR71XX_PCI_WIN1_OFFS 0x11000000
|
#define AR71XX_PCI_WIN1_OFFS 0x11000000
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
#define AR724X_PCI_CTRL_SIZE 0x100
|
#define AR724X_PCI_CTRL_SIZE 0x100
|
||||||
|
|
||||||
#define AR724X_PCI_MEM_BASE 0x10000000
|
#define AR724X_PCI_MEM_BASE 0x10000000
|
||||||
#define AR724X_PCI_MEM_SIZE 0x08000000
|
#define AR724X_PCI_MEM_SIZE 0x04000000
|
||||||
|
|
||||||
#define AR724X_PCI_REG_RESET 0x18
|
#define AR724X_PCI_REG_RESET 0x18
|
||||||
#define AR724X_PCI_REG_INT_STATUS 0x4c
|
#define AR724X_PCI_REG_INT_STATUS 0x4c
|
||||||
|
|
|
@ -439,6 +439,8 @@ ret_from_fork:
|
||||||
ret_from_kernel_thread:
|
ret_from_kernel_thread:
|
||||||
REST_NVGPRS(r1)
|
REST_NVGPRS(r1)
|
||||||
bl schedule_tail
|
bl schedule_tail
|
||||||
|
li r3,0
|
||||||
|
stw r3,0(r1)
|
||||||
mtlr r14
|
mtlr r14
|
||||||
mr r3,r15
|
mr r3,r15
|
||||||
PPC440EP_ERR42
|
PPC440EP_ERR42
|
||||||
|
|
|
@ -664,6 +664,19 @@ resume_kernel:
|
||||||
ld r4,TI_FLAGS(r9)
|
ld r4,TI_FLAGS(r9)
|
||||||
andi. r0,r4,_TIF_NEED_RESCHED
|
andi. r0,r4,_TIF_NEED_RESCHED
|
||||||
bne 1b
|
bne 1b
|
||||||
|
|
||||||
|
/*
|
||||||
|
* arch_local_irq_restore() from preempt_schedule_irq above may
|
||||||
|
* enable hard interrupt but we really should disable interrupts
|
||||||
|
* when we return from the interrupt, and so that we don't get
|
||||||
|
* interrupted after loading SRR0/1.
|
||||||
|
*/
|
||||||
|
#ifdef CONFIG_PPC_BOOK3E
|
||||||
|
wrteei 0
|
||||||
|
#else
|
||||||
|
ld r10,PACAKMSR(r13) /* Get kernel MSR without EE */
|
||||||
|
mtmsrd r10,1 /* Update machine state */
|
||||||
|
#endif /* CONFIG_PPC_BOOK3E */
|
||||||
#endif /* CONFIG_PREEMPT */
|
#endif /* CONFIG_PREEMPT */
|
||||||
|
|
||||||
.globl fast_exc_return_irq
|
.globl fast_exc_return_irq
|
||||||
|
|
|
@ -154,12 +154,12 @@ static int kgdb_handle_breakpoint(struct pt_regs *regs)
|
||||||
static int kgdb_singlestep(struct pt_regs *regs)
|
static int kgdb_singlestep(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
struct thread_info *thread_info, *exception_thread_info;
|
struct thread_info *thread_info, *exception_thread_info;
|
||||||
struct thread_info *backup_current_thread_info = \
|
struct thread_info *backup_current_thread_info;
|
||||||
(struct thread_info *)kmalloc(sizeof(struct thread_info), GFP_KERNEL);
|
|
||||||
|
|
||||||
if (user_mode(regs))
|
if (user_mode(regs))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
backup_current_thread_info = (struct thread_info *)kmalloc(sizeof(struct thread_info), GFP_KERNEL);
|
||||||
/*
|
/*
|
||||||
* On Book E and perhaps other processors, singlestep is handled on
|
* On Book E and perhaps other processors, singlestep is handled on
|
||||||
* the critical exception stack. This causes current_thread_info()
|
* the critical exception stack. This causes current_thread_info()
|
||||||
|
@ -185,6 +185,7 @@ static int kgdb_singlestep(struct pt_regs *regs)
|
||||||
/* Restore current_thread_info lastly. */
|
/* Restore current_thread_info lastly. */
|
||||||
memcpy(exception_thread_info, backup_current_thread_info, sizeof *thread_info);
|
memcpy(exception_thread_info, backup_current_thread_info, sizeof *thread_info);
|
||||||
|
|
||||||
|
kfree(backup_current_thread_info);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -494,10 +494,15 @@ void timer_interrupt(struct pt_regs * regs)
|
||||||
set_dec(DECREMENTER_MAX);
|
set_dec(DECREMENTER_MAX);
|
||||||
|
|
||||||
/* Some implementations of hotplug will get timer interrupts while
|
/* Some implementations of hotplug will get timer interrupts while
|
||||||
* offline, just ignore these
|
* offline, just ignore these and we also need to set
|
||||||
|
* decrementers_next_tb as MAX to make sure __check_irq_replay
|
||||||
|
* don't replay timer interrupt when return, otherwise we'll trap
|
||||||
|
* here infinitely :(
|
||||||
*/
|
*/
|
||||||
if (!cpu_online(smp_processor_id()))
|
if (!cpu_online(smp_processor_id())) {
|
||||||
|
*next_tb = ~(u64)0;
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* Conditionally hard-enable interrupts now that the DEC has been
|
/* Conditionally hard-enable interrupts now that the DEC has been
|
||||||
* bumped to its maximum value
|
* bumped to its maximum value
|
||||||
|
|
|
@ -52,7 +52,7 @@ static int power7_marked_instr_event(u64 mmcr1)
|
||||||
for (pmc = 0; pmc < 4; pmc++) {
|
for (pmc = 0; pmc < 4; pmc++) {
|
||||||
psel = mmcr1 & (OPROFILE_PM_PMCSEL_MSK
|
psel = mmcr1 & (OPROFILE_PM_PMCSEL_MSK
|
||||||
<< (OPROFILE_MAX_PMC_NUM - pmc)
|
<< (OPROFILE_MAX_PMC_NUM - pmc)
|
||||||
* OPROFILE_MAX_PMC_NUM);
|
* OPROFILE_PMSEL_FIELD_WIDTH);
|
||||||
psel = (psel >> ((OPROFILE_MAX_PMC_NUM - pmc)
|
psel = (psel >> ((OPROFILE_MAX_PMC_NUM - pmc)
|
||||||
* OPROFILE_PMSEL_FIELD_WIDTH)) & ~1ULL;
|
* OPROFILE_PMSEL_FIELD_WIDTH)) & ~1ULL;
|
||||||
unit = mmcr1 & (OPROFILE_PM_UNIT_MSK
|
unit = mmcr1 & (OPROFILE_PM_UNIT_MSK
|
||||||
|
|
|
@ -236,6 +236,13 @@ out:
|
||||||
|
|
||||||
static int pas_cpufreq_cpu_exit(struct cpufreq_policy *policy)
|
static int pas_cpufreq_cpu_exit(struct cpufreq_policy *policy)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
* We don't support CPU hotplug. Don't unmap after the system
|
||||||
|
* has already made it to a running state.
|
||||||
|
*/
|
||||||
|
if (system_state != SYSTEM_BOOTING)
|
||||||
|
return 0;
|
||||||
|
|
||||||
if (sdcasr_mapbase)
|
if (sdcasr_mapbase)
|
||||||
iounmap(sdcasr_mapbase);
|
iounmap(sdcasr_mapbase);
|
||||||
if (sdcpwr_mapbase)
|
if (sdcpwr_mapbase)
|
||||||
|
|
|
@ -1365,6 +1365,18 @@ static inline void pmdp_invalidate(struct vm_area_struct *vma,
|
||||||
__pmd_idte(address, pmdp);
|
__pmd_idte(address, pmdp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define __HAVE_ARCH_PMDP_SET_WRPROTECT
|
||||||
|
static inline void pmdp_set_wrprotect(struct mm_struct *mm,
|
||||||
|
unsigned long address, pmd_t *pmdp)
|
||||||
|
{
|
||||||
|
pmd_t pmd = *pmdp;
|
||||||
|
|
||||||
|
if (pmd_write(pmd)) {
|
||||||
|
__pmd_idte(address, pmdp);
|
||||||
|
set_pmd_at(mm, address, pmdp, pmd_wrprotect(pmd));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static inline pmd_t mk_pmd_phys(unsigned long physpage, pgprot_t pgprot)
|
static inline pmd_t mk_pmd_phys(unsigned long physpage, pgprot_t pgprot)
|
||||||
{
|
{
|
||||||
pmd_t __pmd;
|
pmd_t __pmd;
|
||||||
|
|
|
@ -2138,6 +2138,7 @@ config OLPC_XO1_RTC
|
||||||
config OLPC_XO1_SCI
|
config OLPC_XO1_SCI
|
||||||
bool "OLPC XO-1 SCI extras"
|
bool "OLPC XO-1 SCI extras"
|
||||||
depends on OLPC && OLPC_XO1_PM
|
depends on OLPC && OLPC_XO1_PM
|
||||||
|
depends on INPUT=y
|
||||||
select POWER_SUPPLY
|
select POWER_SUPPLY
|
||||||
select GPIO_CS5535
|
select GPIO_CS5535
|
||||||
select MFD_CORE
|
select MFD_CORE
|
||||||
|
|
|
@ -71,7 +71,7 @@ GCOV_PROFILE := n
|
||||||
$(obj)/bzImage: asflags-y := $(SVGA_MODE)
|
$(obj)/bzImage: asflags-y := $(SVGA_MODE)
|
||||||
|
|
||||||
quiet_cmd_image = BUILD $@
|
quiet_cmd_image = BUILD $@
|
||||||
cmd_image = $(obj)/tools/build $(obj)/setup.bin $(obj)/vmlinux.bin > $@
|
cmd_image = $(obj)/tools/build $(obj)/setup.bin $(obj)/vmlinux.bin $(obj)/zoffset.h > $@
|
||||||
|
|
||||||
$(obj)/bzImage: $(obj)/setup.bin $(obj)/vmlinux.bin $(obj)/tools/build FORCE
|
$(obj)/bzImage: $(obj)/setup.bin $(obj)/vmlinux.bin $(obj)/tools/build FORCE
|
||||||
$(call if_changed,image)
|
$(call if_changed,image)
|
||||||
|
@ -92,7 +92,7 @@ targets += voffset.h
|
||||||
$(obj)/voffset.h: vmlinux FORCE
|
$(obj)/voffset.h: vmlinux FORCE
|
||||||
$(call if_changed,voffset)
|
$(call if_changed,voffset)
|
||||||
|
|
||||||
sed-zoffset := -e 's/^\([0-9a-fA-F]*\) . \(startup_32\|input_data\|_end\|z_.*\)$$/\#define ZO_\2 0x\1/p'
|
sed-zoffset := -e 's/^\([0-9a-fA-F]*\) . \(startup_32\|startup_64\|efi_pe_entry\|efi_stub_entry\|input_data\|_end\|z_.*\)$$/\#define ZO_\2 0x\1/p'
|
||||||
|
|
||||||
quiet_cmd_zoffset = ZOFFSET $@
|
quiet_cmd_zoffset = ZOFFSET $@
|
||||||
cmd_zoffset = $(NM) $< | sed -n $(sed-zoffset) > $@
|
cmd_zoffset = $(NM) $< | sed -n $(sed-zoffset) > $@
|
||||||
|
|
|
@ -256,10 +256,10 @@ static efi_status_t setup_efi_pci(struct boot_params *params)
|
||||||
int i;
|
int i;
|
||||||
struct setup_data *data;
|
struct setup_data *data;
|
||||||
|
|
||||||
data = (struct setup_data *)params->hdr.setup_data;
|
data = (struct setup_data *)(unsigned long)params->hdr.setup_data;
|
||||||
|
|
||||||
while (data && data->next)
|
while (data && data->next)
|
||||||
data = (struct setup_data *)data->next;
|
data = (struct setup_data *)(unsigned long)data->next;
|
||||||
|
|
||||||
status = efi_call_phys5(sys_table->boottime->locate_handle,
|
status = efi_call_phys5(sys_table->boottime->locate_handle,
|
||||||
EFI_LOCATE_BY_PROTOCOL, &pci_proto,
|
EFI_LOCATE_BY_PROTOCOL, &pci_proto,
|
||||||
|
@ -295,16 +295,18 @@ static efi_status_t setup_efi_pci(struct boot_params *params)
|
||||||
if (!pci)
|
if (!pci)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
#ifdef CONFIG_X86_64
|
||||||
status = efi_call_phys4(pci->attributes, pci,
|
status = efi_call_phys4(pci->attributes, pci,
|
||||||
EfiPciIoAttributeOperationGet, 0,
|
EfiPciIoAttributeOperationGet, 0,
|
||||||
&attributes);
|
&attributes);
|
||||||
|
#else
|
||||||
|
status = efi_call_phys5(pci->attributes, pci,
|
||||||
|
EfiPciIoAttributeOperationGet, 0, 0,
|
||||||
|
&attributes);
|
||||||
|
#endif
|
||||||
if (status != EFI_SUCCESS)
|
if (status != EFI_SUCCESS)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!(attributes & EFI_PCI_IO_ATTRIBUTE_EMBEDDED_ROM))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (!pci->romimage || !pci->romsize)
|
if (!pci->romimage || !pci->romsize)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -345,9 +347,9 @@ static efi_status_t setup_efi_pci(struct boot_params *params)
|
||||||
memcpy(rom->romdata, pci->romimage, pci->romsize);
|
memcpy(rom->romdata, pci->romimage, pci->romsize);
|
||||||
|
|
||||||
if (data)
|
if (data)
|
||||||
data->next = (uint64_t)rom;
|
data->next = (unsigned long)rom;
|
||||||
else
|
else
|
||||||
params->hdr.setup_data = (uint64_t)rom;
|
params->hdr.setup_data = (unsigned long)rom;
|
||||||
|
|
||||||
data = (struct setup_data *)rom;
|
data = (struct setup_data *)rom;
|
||||||
|
|
||||||
|
@ -432,10 +434,9 @@ static efi_status_t setup_gop(struct screen_info *si, efi_guid_t *proto,
|
||||||
* Once we've found a GOP supporting ConOut,
|
* Once we've found a GOP supporting ConOut,
|
||||||
* don't bother looking any further.
|
* don't bother looking any further.
|
||||||
*/
|
*/
|
||||||
|
first_gop = gop;
|
||||||
if (conout_found)
|
if (conout_found)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
first_gop = gop;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -35,11 +35,11 @@ ENTRY(startup_32)
|
||||||
#ifdef CONFIG_EFI_STUB
|
#ifdef CONFIG_EFI_STUB
|
||||||
jmp preferred_addr
|
jmp preferred_addr
|
||||||
|
|
||||||
.balign 0x10
|
|
||||||
/*
|
/*
|
||||||
* We don't need the return address, so set up the stack so
|
* We don't need the return address, so set up the stack so
|
||||||
* efi_main() can find its arugments.
|
* efi_main() can find its arguments.
|
||||||
*/
|
*/
|
||||||
|
ENTRY(efi_pe_entry)
|
||||||
add $0x4, %esp
|
add $0x4, %esp
|
||||||
|
|
||||||
call make_boot_params
|
call make_boot_params
|
||||||
|
@ -50,8 +50,10 @@ ENTRY(startup_32)
|
||||||
pushl %eax
|
pushl %eax
|
||||||
pushl %esi
|
pushl %esi
|
||||||
pushl %ecx
|
pushl %ecx
|
||||||
|
sub $0x4, %esp
|
||||||
|
|
||||||
.org 0x30,0x90
|
ENTRY(efi_stub_entry)
|
||||||
|
add $0x4, %esp
|
||||||
call efi_main
|
call efi_main
|
||||||
cmpl $0, %eax
|
cmpl $0, %eax
|
||||||
movl %eax, %esi
|
movl %eax, %esi
|
||||||
|
|
|
@ -201,12 +201,12 @@ ENTRY(startup_64)
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_EFI_STUB
|
#ifdef CONFIG_EFI_STUB
|
||||||
/*
|
/*
|
||||||
* The entry point for the PE/COFF executable is 0x210, so only
|
* The entry point for the PE/COFF executable is efi_pe_entry, so
|
||||||
* legacy boot loaders will execute this jmp.
|
* only legacy boot loaders will execute this jmp.
|
||||||
*/
|
*/
|
||||||
jmp preferred_addr
|
jmp preferred_addr
|
||||||
|
|
||||||
.org 0x210
|
ENTRY(efi_pe_entry)
|
||||||
mov %rcx, %rdi
|
mov %rcx, %rdi
|
||||||
mov %rdx, %rsi
|
mov %rdx, %rsi
|
||||||
pushq %rdi
|
pushq %rdi
|
||||||
|
@ -218,7 +218,7 @@ ENTRY(startup_64)
|
||||||
popq %rsi
|
popq %rsi
|
||||||
popq %rdi
|
popq %rdi
|
||||||
|
|
||||||
.org 0x230,0x90
|
ENTRY(efi_stub_entry)
|
||||||
call efi_main
|
call efi_main
|
||||||
movq %rax,%rsi
|
movq %rax,%rsi
|
||||||
cmpq $0,%rax
|
cmpq $0,%rax
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
#include <asm/e820.h>
|
#include <asm/e820.h>
|
||||||
#include <asm/page_types.h>
|
#include <asm/page_types.h>
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
|
#include <asm/bootparam.h>
|
||||||
#include "boot.h"
|
#include "boot.h"
|
||||||
#include "voffset.h"
|
#include "voffset.h"
|
||||||
#include "zoffset.h"
|
#include "zoffset.h"
|
||||||
|
@ -255,6 +256,9 @@ section_table:
|
||||||
# header, from the old boot sector.
|
# header, from the old boot sector.
|
||||||
|
|
||||||
.section ".header", "a"
|
.section ".header", "a"
|
||||||
|
.globl sentinel
|
||||||
|
sentinel: .byte 0xff, 0xff /* Used to detect broken loaders */
|
||||||
|
|
||||||
.globl hdr
|
.globl hdr
|
||||||
hdr:
|
hdr:
|
||||||
setup_sects: .byte 0 /* Filled in by build.c */
|
setup_sects: .byte 0 /* Filled in by build.c */
|
||||||
|
@ -279,7 +283,7 @@ _start:
|
||||||
# Part 2 of the header, from the old setup.S
|
# Part 2 of the header, from the old setup.S
|
||||||
|
|
||||||
.ascii "HdrS" # header signature
|
.ascii "HdrS" # header signature
|
||||||
.word 0x020b # header version number (>= 0x0105)
|
.word 0x020c # header version number (>= 0x0105)
|
||||||
# or else old loadlin-1.5 will fail)
|
# or else old loadlin-1.5 will fail)
|
||||||
.globl realmode_swtch
|
.globl realmode_swtch
|
||||||
realmode_swtch: .word 0, 0 # default_switch, SETUPSEG
|
realmode_swtch: .word 0, 0 # default_switch, SETUPSEG
|
||||||
|
@ -297,13 +301,7 @@ type_of_loader: .byte 0 # 0 means ancient bootloader, newer
|
||||||
|
|
||||||
# flags, unused bits must be zero (RFU) bit within loadflags
|
# flags, unused bits must be zero (RFU) bit within loadflags
|
||||||
loadflags:
|
loadflags:
|
||||||
LOADED_HIGH = 1 # If set, the kernel is loaded high
|
.byte LOADED_HIGH # The kernel is to be loaded high
|
||||||
CAN_USE_HEAP = 0x80 # If set, the loader also has set
|
|
||||||
# heap_end_ptr to tell how much
|
|
||||||
# space behind setup.S can be used for
|
|
||||||
# heap purposes.
|
|
||||||
# Only the loader knows what is free
|
|
||||||
.byte LOADED_HIGH
|
|
||||||
|
|
||||||
setup_move_size: .word 0x8000 # size to move, when setup is not
|
setup_move_size: .word 0x8000 # size to move, when setup is not
|
||||||
# loaded at 0x90000. We will move setup
|
# loaded at 0x90000. We will move setup
|
||||||
|
@ -369,7 +367,23 @@ relocatable_kernel: .byte 1
|
||||||
relocatable_kernel: .byte 0
|
relocatable_kernel: .byte 0
|
||||||
#endif
|
#endif
|
||||||
min_alignment: .byte MIN_KERNEL_ALIGN_LG2 # minimum alignment
|
min_alignment: .byte MIN_KERNEL_ALIGN_LG2 # minimum alignment
|
||||||
pad3: .word 0
|
|
||||||
|
xloadflags:
|
||||||
|
#ifdef CONFIG_X86_64
|
||||||
|
# define XLF0 XLF_KERNEL_64 /* 64-bit kernel */
|
||||||
|
#else
|
||||||
|
# define XLF0 0
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_EFI_STUB
|
||||||
|
# ifdef CONFIG_X86_64
|
||||||
|
# define XLF23 XLF_EFI_HANDOVER_64 /* 64-bit EFI handover ok */
|
||||||
|
# else
|
||||||
|
# define XLF23 XLF_EFI_HANDOVER_32 /* 32-bit EFI handover ok */
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# define XLF23 0
|
||||||
|
#endif
|
||||||
|
.word XLF0 | XLF23
|
||||||
|
|
||||||
cmdline_size: .long COMMAND_LINE_SIZE-1 #length of the command line,
|
cmdline_size: .long COMMAND_LINE_SIZE-1 #length of the command line,
|
||||||
#added with boot protocol
|
#added with boot protocol
|
||||||
|
@ -397,8 +411,13 @@ pref_address: .quad LOAD_PHYSICAL_ADDR # preferred load addr
|
||||||
#define INIT_SIZE VO_INIT_SIZE
|
#define INIT_SIZE VO_INIT_SIZE
|
||||||
#endif
|
#endif
|
||||||
init_size: .long INIT_SIZE # kernel initialization size
|
init_size: .long INIT_SIZE # kernel initialization size
|
||||||
handover_offset: .long 0x30 # offset to the handover
|
handover_offset:
|
||||||
|
#ifdef CONFIG_EFI_STUB
|
||||||
|
.long 0x30 # offset to the handover
|
||||||
# protocol entry point
|
# protocol entry point
|
||||||
|
#else
|
||||||
|
.long 0
|
||||||
|
#endif
|
||||||
|
|
||||||
# End of setup header #####################################################
|
# End of setup header #####################################################
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@ SECTIONS
|
||||||
.bstext : { *(.bstext) }
|
.bstext : { *(.bstext) }
|
||||||
.bsdata : { *(.bsdata) }
|
.bsdata : { *(.bsdata) }
|
||||||
|
|
||||||
. = 497;
|
. = 495;
|
||||||
.header : { *(.header) }
|
.header : { *(.header) }
|
||||||
.entrytext : { *(.entrytext) }
|
.entrytext : { *(.entrytext) }
|
||||||
.inittext : { *(.inittext) }
|
.inittext : { *(.inittext) }
|
||||||
|
|
|
@ -52,6 +52,10 @@ int is_big_kernel;
|
||||||
|
|
||||||
#define PECOFF_RELOC_RESERVE 0x20
|
#define PECOFF_RELOC_RESERVE 0x20
|
||||||
|
|
||||||
|
unsigned long efi_stub_entry;
|
||||||
|
unsigned long efi_pe_entry;
|
||||||
|
unsigned long startup_64;
|
||||||
|
|
||||||
/*----------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------*/
|
||||||
|
|
||||||
static const u32 crctab32[] = {
|
static const u32 crctab32[] = {
|
||||||
|
@ -132,7 +136,7 @@ static void die(const char * str, ...)
|
||||||
|
|
||||||
static void usage(void)
|
static void usage(void)
|
||||||
{
|
{
|
||||||
die("Usage: build setup system [> image]");
|
die("Usage: build setup system [zoffset.h] [> image]");
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_EFI_STUB
|
#ifdef CONFIG_EFI_STUB
|
||||||
|
@ -206,30 +210,54 @@ static void update_pecoff_text(unsigned int text_start, unsigned int file_sz)
|
||||||
*/
|
*/
|
||||||
put_unaligned_le32(file_sz - 512, &buf[pe_header + 0x1c]);
|
put_unaligned_le32(file_sz - 512, &buf[pe_header + 0x1c]);
|
||||||
|
|
||||||
#ifdef CONFIG_X86_32
|
|
||||||
/*
|
/*
|
||||||
* Address of entry point.
|
* Address of entry point for PE/COFF executable
|
||||||
*
|
|
||||||
* The EFI stub entry point is +16 bytes from the start of
|
|
||||||
* the .text section.
|
|
||||||
*/
|
*/
|
||||||
put_unaligned_le32(text_start + 16, &buf[pe_header + 0x28]);
|
put_unaligned_le32(text_start + efi_pe_entry, &buf[pe_header + 0x28]);
|
||||||
#else
|
|
||||||
/*
|
|
||||||
* Address of entry point. startup_32 is at the beginning and
|
|
||||||
* the 64-bit entry point (startup_64) is always 512 bytes
|
|
||||||
* after. The EFI stub entry point is 16 bytes after that, as
|
|
||||||
* the first instruction allows legacy loaders to jump over
|
|
||||||
* the EFI stub initialisation
|
|
||||||
*/
|
|
||||||
put_unaligned_le32(text_start + 528, &buf[pe_header + 0x28]);
|
|
||||||
#endif /* CONFIG_X86_32 */
|
|
||||||
|
|
||||||
update_pecoff_section_header(".text", text_start, text_sz);
|
update_pecoff_section_header(".text", text_start, text_sz);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* CONFIG_EFI_STUB */
|
#endif /* CONFIG_EFI_STUB */
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Parse zoffset.h and find the entry points. We could just #include zoffset.h
|
||||||
|
* but that would mean tools/build would have to be rebuilt every time. It's
|
||||||
|
* not as if parsing it is hard...
|
||||||
|
*/
|
||||||
|
#define PARSE_ZOFS(p, sym) do { \
|
||||||
|
if (!strncmp(p, "#define ZO_" #sym " ", 11+sizeof(#sym))) \
|
||||||
|
sym = strtoul(p + 11 + sizeof(#sym), NULL, 16); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
static void parse_zoffset(char *fname)
|
||||||
|
{
|
||||||
|
FILE *file;
|
||||||
|
char *p;
|
||||||
|
int c;
|
||||||
|
|
||||||
|
file = fopen(fname, "r");
|
||||||
|
if (!file)
|
||||||
|
die("Unable to open `%s': %m", fname);
|
||||||
|
c = fread(buf, 1, sizeof(buf) - 1, file);
|
||||||
|
if (ferror(file))
|
||||||
|
die("read-error on `zoffset.h'");
|
||||||
|
buf[c] = 0;
|
||||||
|
|
||||||
|
p = (char *)buf;
|
||||||
|
|
||||||
|
while (p && *p) {
|
||||||
|
PARSE_ZOFS(p, efi_stub_entry);
|
||||||
|
PARSE_ZOFS(p, efi_pe_entry);
|
||||||
|
PARSE_ZOFS(p, startup_64);
|
||||||
|
|
||||||
|
p = strchr(p, '\n');
|
||||||
|
while (p && (*p == '\r' || *p == '\n'))
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char ** argv)
|
int main(int argc, char ** argv)
|
||||||
{
|
{
|
||||||
unsigned int i, sz, setup_sectors;
|
unsigned int i, sz, setup_sectors;
|
||||||
|
@ -241,7 +269,19 @@ int main(int argc, char ** argv)
|
||||||
void *kernel;
|
void *kernel;
|
||||||
u32 crc = 0xffffffffUL;
|
u32 crc = 0xffffffffUL;
|
||||||
|
|
||||||
if (argc != 3)
|
/* Defaults for old kernel */
|
||||||
|
#ifdef CONFIG_X86_32
|
||||||
|
efi_pe_entry = 0x10;
|
||||||
|
efi_stub_entry = 0x30;
|
||||||
|
#else
|
||||||
|
efi_pe_entry = 0x210;
|
||||||
|
efi_stub_entry = 0x230;
|
||||||
|
startup_64 = 0x200;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (argc == 4)
|
||||||
|
parse_zoffset(argv[3]);
|
||||||
|
else if (argc != 3)
|
||||||
usage();
|
usage();
|
||||||
|
|
||||||
/* Copy the setup code */
|
/* Copy the setup code */
|
||||||
|
@ -299,6 +339,11 @@ int main(int argc, char ** argv)
|
||||||
|
|
||||||
#ifdef CONFIG_EFI_STUB
|
#ifdef CONFIG_EFI_STUB
|
||||||
update_pecoff_text(setup_sectors * 512, sz + i + ((sys_size * 16) - sz));
|
update_pecoff_text(setup_sectors * 512, sz + i + ((sys_size * 16) - sz));
|
||||||
|
|
||||||
|
#ifdef CONFIG_X86_64 /* Yes, this is really how we defined it :( */
|
||||||
|
efi_stub_entry -= 0x200;
|
||||||
|
#endif
|
||||||
|
put_unaligned_le32(efi_stub_entry, &buf[0x264]);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
crc = partial_crc32(buf, i, crc);
|
crc = partial_crc32(buf, i, crc);
|
||||||
|
|
|
@ -94,6 +94,7 @@ extern void __iomem *efi_ioremap(unsigned long addr, unsigned long size,
|
||||||
#endif /* CONFIG_X86_32 */
|
#endif /* CONFIG_X86_32 */
|
||||||
|
|
||||||
extern int add_efi_memmap;
|
extern int add_efi_memmap;
|
||||||
|
extern unsigned long x86_efi_facility;
|
||||||
extern void efi_set_executable(efi_memory_desc_t *md, bool executable);
|
extern void efi_set_executable(efi_memory_desc_t *md, bool executable);
|
||||||
extern int efi_memblock_x86_reserve_range(void);
|
extern int efi_memblock_x86_reserve_range(void);
|
||||||
extern void efi_call_phys_prelog(void);
|
extern void efi_call_phys_prelog(void);
|
||||||
|
|
|
@ -16,7 +16,7 @@ extern void uv_system_init(void);
|
||||||
extern const struct cpumask *uv_flush_tlb_others(const struct cpumask *cpumask,
|
extern const struct cpumask *uv_flush_tlb_others(const struct cpumask *cpumask,
|
||||||
struct mm_struct *mm,
|
struct mm_struct *mm,
|
||||||
unsigned long start,
|
unsigned long start,
|
||||||
unsigned end,
|
unsigned long end,
|
||||||
unsigned int cpu);
|
unsigned int cpu);
|
||||||
|
|
||||||
#else /* X86_UV */
|
#else /* X86_UV */
|
||||||
|
|
|
@ -1,6 +1,31 @@
|
||||||
#ifndef _ASM_X86_BOOTPARAM_H
|
#ifndef _ASM_X86_BOOTPARAM_H
|
||||||
#define _ASM_X86_BOOTPARAM_H
|
#define _ASM_X86_BOOTPARAM_H
|
||||||
|
|
||||||
|
/* setup_data types */
|
||||||
|
#define SETUP_NONE 0
|
||||||
|
#define SETUP_E820_EXT 1
|
||||||
|
#define SETUP_DTB 2
|
||||||
|
#define SETUP_PCI 3
|
||||||
|
|
||||||
|
/* ram_size flags */
|
||||||
|
#define RAMDISK_IMAGE_START_MASK 0x07FF
|
||||||
|
#define RAMDISK_PROMPT_FLAG 0x8000
|
||||||
|
#define RAMDISK_LOAD_FLAG 0x4000
|
||||||
|
|
||||||
|
/* loadflags */
|
||||||
|
#define LOADED_HIGH (1<<0)
|
||||||
|
#define QUIET_FLAG (1<<5)
|
||||||
|
#define KEEP_SEGMENTS (1<<6)
|
||||||
|
#define CAN_USE_HEAP (1<<7)
|
||||||
|
|
||||||
|
/* xloadflags */
|
||||||
|
#define XLF_KERNEL_64 (1<<0)
|
||||||
|
#define XLF_CAN_BE_LOADED_ABOVE_4G (1<<1)
|
||||||
|
#define XLF_EFI_HANDOVER_32 (1<<2)
|
||||||
|
#define XLF_EFI_HANDOVER_64 (1<<3)
|
||||||
|
|
||||||
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/screen_info.h>
|
#include <linux/screen_info.h>
|
||||||
#include <linux/apm_bios.h>
|
#include <linux/apm_bios.h>
|
||||||
|
@ -9,12 +34,6 @@
|
||||||
#include <asm/ist.h>
|
#include <asm/ist.h>
|
||||||
#include <video/edid.h>
|
#include <video/edid.h>
|
||||||
|
|
||||||
/* setup data types */
|
|
||||||
#define SETUP_NONE 0
|
|
||||||
#define SETUP_E820_EXT 1
|
|
||||||
#define SETUP_DTB 2
|
|
||||||
#define SETUP_PCI 3
|
|
||||||
|
|
||||||
/* extensible setup data list node */
|
/* extensible setup data list node */
|
||||||
struct setup_data {
|
struct setup_data {
|
||||||
__u64 next;
|
__u64 next;
|
||||||
|
@ -28,9 +47,6 @@ struct setup_header {
|
||||||
__u16 root_flags;
|
__u16 root_flags;
|
||||||
__u32 syssize;
|
__u32 syssize;
|
||||||
__u16 ram_size;
|
__u16 ram_size;
|
||||||
#define RAMDISK_IMAGE_START_MASK 0x07FF
|
|
||||||
#define RAMDISK_PROMPT_FLAG 0x8000
|
|
||||||
#define RAMDISK_LOAD_FLAG 0x4000
|
|
||||||
__u16 vid_mode;
|
__u16 vid_mode;
|
||||||
__u16 root_dev;
|
__u16 root_dev;
|
||||||
__u16 boot_flag;
|
__u16 boot_flag;
|
||||||
|
@ -42,10 +58,6 @@ struct setup_header {
|
||||||
__u16 kernel_version;
|
__u16 kernel_version;
|
||||||
__u8 type_of_loader;
|
__u8 type_of_loader;
|
||||||
__u8 loadflags;
|
__u8 loadflags;
|
||||||
#define LOADED_HIGH (1<<0)
|
|
||||||
#define QUIET_FLAG (1<<5)
|
|
||||||
#define KEEP_SEGMENTS (1<<6)
|
|
||||||
#define CAN_USE_HEAP (1<<7)
|
|
||||||
__u16 setup_move_size;
|
__u16 setup_move_size;
|
||||||
__u32 code32_start;
|
__u32 code32_start;
|
||||||
__u32 ramdisk_image;
|
__u32 ramdisk_image;
|
||||||
|
@ -58,7 +70,8 @@ struct setup_header {
|
||||||
__u32 initrd_addr_max;
|
__u32 initrd_addr_max;
|
||||||
__u32 kernel_alignment;
|
__u32 kernel_alignment;
|
||||||
__u8 relocatable_kernel;
|
__u8 relocatable_kernel;
|
||||||
__u8 _pad2[3];
|
__u8 min_alignment;
|
||||||
|
__u16 xloadflags;
|
||||||
__u32 cmdline_size;
|
__u32 cmdline_size;
|
||||||
__u32 hardware_subarch;
|
__u32 hardware_subarch;
|
||||||
__u64 hardware_subarch_data;
|
__u64 hardware_subarch_data;
|
||||||
|
@ -106,7 +119,10 @@ struct boot_params {
|
||||||
__u8 hd1_info[16]; /* obsolete! */ /* 0x090 */
|
__u8 hd1_info[16]; /* obsolete! */ /* 0x090 */
|
||||||
struct sys_desc_table sys_desc_table; /* 0x0a0 */
|
struct sys_desc_table sys_desc_table; /* 0x0a0 */
|
||||||
struct olpc_ofw_header olpc_ofw_header; /* 0x0b0 */
|
struct olpc_ofw_header olpc_ofw_header; /* 0x0b0 */
|
||||||
__u8 _pad4[128]; /* 0x0c0 */
|
__u32 ext_ramdisk_image; /* 0x0c0 */
|
||||||
|
__u32 ext_ramdisk_size; /* 0x0c4 */
|
||||||
|
__u32 ext_cmd_line_ptr; /* 0x0c8 */
|
||||||
|
__u8 _pad4[116]; /* 0x0cc */
|
||||||
struct edid_info edid_info; /* 0x140 */
|
struct edid_info edid_info; /* 0x140 */
|
||||||
struct efi_info efi_info; /* 0x1c0 */
|
struct efi_info efi_info; /* 0x1c0 */
|
||||||
__u32 alt_mem_k; /* 0x1e0 */
|
__u32 alt_mem_k; /* 0x1e0 */
|
||||||
|
@ -115,7 +131,20 @@ struct boot_params {
|
||||||
__u8 eddbuf_entries; /* 0x1e9 */
|
__u8 eddbuf_entries; /* 0x1e9 */
|
||||||
__u8 edd_mbr_sig_buf_entries; /* 0x1ea */
|
__u8 edd_mbr_sig_buf_entries; /* 0x1ea */
|
||||||
__u8 kbd_status; /* 0x1eb */
|
__u8 kbd_status; /* 0x1eb */
|
||||||
__u8 _pad6[5]; /* 0x1ec */
|
__u8 _pad5[3]; /* 0x1ec */
|
||||||
|
/*
|
||||||
|
* The sentinel is set to a nonzero value (0xff) in header.S.
|
||||||
|
*
|
||||||
|
* A bootloader is supposed to only take setup_header and put
|
||||||
|
* it into a clean boot_params buffer. If it turns out that
|
||||||
|
* it is clumsy or too generous with the buffer, it most
|
||||||
|
* probably will pick up the sentinel variable too. The fact
|
||||||
|
* that this variable then is still 0xff will let kernel
|
||||||
|
* know that some variables in boot_params are invalid and
|
||||||
|
* kernel should zero out certain portions of boot_params.
|
||||||
|
*/
|
||||||
|
__u8 sentinel; /* 0x1ef */
|
||||||
|
__u8 _pad6[1]; /* 0x1f0 */
|
||||||
struct setup_header hdr; /* setup header */ /* 0x1f1 */
|
struct setup_header hdr; /* setup header */ /* 0x1f1 */
|
||||||
__u8 _pad7[0x290-0x1f1-sizeof(struct setup_header)];
|
__u8 _pad7[0x290-0x1f1-sizeof(struct setup_header)];
|
||||||
__u32 edd_mbr_sig_buffer[EDD_MBR_SIG_MAX]; /* 0x290 */
|
__u32 edd_mbr_sig_buffer[EDD_MBR_SIG_MAX]; /* 0x290 */
|
||||||
|
@ -134,6 +163,6 @@ enum {
|
||||||
X86_NR_SUBARCHS,
|
X86_NR_SUBARCHS,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#endif /* __ASSEMBLY__ */
|
||||||
|
|
||||||
#endif /* _ASM_X86_BOOTPARAM_H */
|
#endif /* _ASM_X86_BOOTPARAM_H */
|
||||||
|
|
|
@ -1781,6 +1781,7 @@ first_nmi:
|
||||||
* Leave room for the "copied" frame
|
* Leave room for the "copied" frame
|
||||||
*/
|
*/
|
||||||
subq $(5*8), %rsp
|
subq $(5*8), %rsp
|
||||||
|
CFI_ADJUST_CFA_OFFSET 5*8
|
||||||
|
|
||||||
/* Copy the stack frame to the Saved frame */
|
/* Copy the stack frame to the Saved frame */
|
||||||
.rept 5
|
.rept 5
|
||||||
|
@ -1863,10 +1864,8 @@ end_repeat_nmi:
|
||||||
nmi_swapgs:
|
nmi_swapgs:
|
||||||
SWAPGS_UNSAFE_STACK
|
SWAPGS_UNSAFE_STACK
|
||||||
nmi_restore:
|
nmi_restore:
|
||||||
RESTORE_ALL 8
|
/* Pop the extra iret frame at once */
|
||||||
|
RESTORE_ALL 6*8
|
||||||
/* Pop the extra iret frame */
|
|
||||||
addq $(5*8), %rsp
|
|
||||||
|
|
||||||
/* Clear the NMI executing stack variable */
|
/* Clear the NMI executing stack variable */
|
||||||
movq $0, 5*8(%rsp)
|
movq $0, 5*8(%rsp)
|
||||||
|
|
|
@ -300,6 +300,12 @@ ENTRY(startup_32_smp)
|
||||||
leal -__PAGE_OFFSET(%ecx),%esp
|
leal -__PAGE_OFFSET(%ecx),%esp
|
||||||
|
|
||||||
default_entry:
|
default_entry:
|
||||||
|
#define CR0_STATE (X86_CR0_PE | X86_CR0_MP | X86_CR0_ET | \
|
||||||
|
X86_CR0_NE | X86_CR0_WP | X86_CR0_AM | \
|
||||||
|
X86_CR0_PG)
|
||||||
|
movl $(CR0_STATE & ~X86_CR0_PG),%eax
|
||||||
|
movl %eax,%cr0
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* New page tables may be in 4Mbyte page mode and may
|
* New page tables may be in 4Mbyte page mode and may
|
||||||
* be using the global pages.
|
* be using the global pages.
|
||||||
|
@ -364,8 +370,7 @@ default_entry:
|
||||||
*/
|
*/
|
||||||
movl $pa(initial_page_table), %eax
|
movl $pa(initial_page_table), %eax
|
||||||
movl %eax,%cr3 /* set the page table pointer.. */
|
movl %eax,%cr3 /* set the page table pointer.. */
|
||||||
movl %cr0,%eax
|
movl $CR0_STATE,%eax
|
||||||
orl $X86_CR0_PG,%eax
|
|
||||||
movl %eax,%cr0 /* ..and set paging (PG) bit */
|
movl %eax,%cr0 /* ..and set paging (PG) bit */
|
||||||
ljmp $__BOOT_CS,$1f /* Clear prefetch and normalize %eip */
|
ljmp $__BOOT_CS,$1f /* Clear prefetch and normalize %eip */
|
||||||
1:
|
1:
|
||||||
|
|
|
@ -174,6 +174,9 @@ static int msr_open(struct inode *inode, struct file *file)
|
||||||
unsigned int cpu;
|
unsigned int cpu;
|
||||||
struct cpuinfo_x86 *c;
|
struct cpuinfo_x86 *c;
|
||||||
|
|
||||||
|
if (!capable(CAP_SYS_RAWIO))
|
||||||
|
return -EPERM;
|
||||||
|
|
||||||
cpu = iminor(file->f_path.dentry->d_inode);
|
cpu = iminor(file->f_path.dentry->d_inode);
|
||||||
if (cpu >= nr_cpu_ids || !cpu_online(cpu))
|
if (cpu >= nr_cpu_ids || !cpu_online(cpu))
|
||||||
return -ENXIO; /* No such CPU */
|
return -ENXIO; /* No such CPU */
|
||||||
|
|
|
@ -56,7 +56,7 @@ struct device x86_dma_fallback_dev = {
|
||||||
EXPORT_SYMBOL(x86_dma_fallback_dev);
|
EXPORT_SYMBOL(x86_dma_fallback_dev);
|
||||||
|
|
||||||
/* Number of entries preallocated for DMA-API debugging */
|
/* Number of entries preallocated for DMA-API debugging */
|
||||||
#define PREALLOC_DMA_DEBUG_ENTRIES 32768
|
#define PREALLOC_DMA_DEBUG_ENTRIES 65536
|
||||||
|
|
||||||
int dma_set_mask(struct device *dev, u64 mask)
|
int dma_set_mask(struct device *dev, u64 mask)
|
||||||
{
|
{
|
||||||
|
|
|
@ -584,7 +584,7 @@ static void native_machine_emergency_restart(void)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BOOT_EFI:
|
case BOOT_EFI:
|
||||||
if (efi_enabled)
|
if (efi_enabled(EFI_RUNTIME_SERVICES))
|
||||||
efi.reset_system(reboot_mode ?
|
efi.reset_system(reboot_mode ?
|
||||||
EFI_RESET_WARM :
|
EFI_RESET_WARM :
|
||||||
EFI_RESET_COLD,
|
EFI_RESET_COLD,
|
||||||
|
|
|
@ -807,15 +807,15 @@ void __init setup_arch(char **cmdline_p)
|
||||||
#ifdef CONFIG_EFI
|
#ifdef CONFIG_EFI
|
||||||
if (!strncmp((char *)&boot_params.efi_info.efi_loader_signature,
|
if (!strncmp((char *)&boot_params.efi_info.efi_loader_signature,
|
||||||
"EL32", 4)) {
|
"EL32", 4)) {
|
||||||
efi_enabled = 1;
|
set_bit(EFI_BOOT, &x86_efi_facility);
|
||||||
efi_64bit = false;
|
|
||||||
} else if (!strncmp((char *)&boot_params.efi_info.efi_loader_signature,
|
} else if (!strncmp((char *)&boot_params.efi_info.efi_loader_signature,
|
||||||
"EL64", 4)) {
|
"EL64", 4)) {
|
||||||
efi_enabled = 1;
|
set_bit(EFI_BOOT, &x86_efi_facility);
|
||||||
efi_64bit = true;
|
set_bit(EFI_64BIT, &x86_efi_facility);
|
||||||
}
|
}
|
||||||
if (efi_enabled && efi_memblock_x86_reserve_range())
|
|
||||||
efi_enabled = 0;
|
if (efi_enabled(EFI_BOOT))
|
||||||
|
efi_memblock_x86_reserve_range();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
x86_init.oem.arch_setup();
|
x86_init.oem.arch_setup();
|
||||||
|
@ -888,7 +888,7 @@ void __init setup_arch(char **cmdline_p)
|
||||||
|
|
||||||
finish_e820_parsing();
|
finish_e820_parsing();
|
||||||
|
|
||||||
if (efi_enabled)
|
if (efi_enabled(EFI_BOOT))
|
||||||
efi_init();
|
efi_init();
|
||||||
|
|
||||||
dmi_scan_machine();
|
dmi_scan_machine();
|
||||||
|
@ -971,7 +971,7 @@ void __init setup_arch(char **cmdline_p)
|
||||||
* The EFI specification says that boot service code won't be called
|
* The EFI specification says that boot service code won't be called
|
||||||
* after ExitBootServices(). This is, in fact, a lie.
|
* after ExitBootServices(). This is, in fact, a lie.
|
||||||
*/
|
*/
|
||||||
if (efi_enabled)
|
if (efi_enabled(EFI_MEMMAP))
|
||||||
efi_reserve_boot_services();
|
efi_reserve_boot_services();
|
||||||
|
|
||||||
/* preallocate 4k for mptable mpc */
|
/* preallocate 4k for mptable mpc */
|
||||||
|
@ -1114,7 +1114,7 @@ void __init setup_arch(char **cmdline_p)
|
||||||
|
|
||||||
#ifdef CONFIG_VT
|
#ifdef CONFIG_VT
|
||||||
#if defined(CONFIG_VGA_CONSOLE)
|
#if defined(CONFIG_VGA_CONSOLE)
|
||||||
if (!efi_enabled || (efi_mem_type(0xa0000) != EFI_CONVENTIONAL_MEMORY))
|
if (!efi_enabled(EFI_BOOT) || (efi_mem_type(0xa0000) != EFI_CONVENTIONAL_MEMORY))
|
||||||
conswitchp = &vga_con;
|
conswitchp = &vga_con;
|
||||||
#elif defined(CONFIG_DUMMY_CONSOLE)
|
#elif defined(CONFIG_DUMMY_CONSOLE)
|
||||||
conswitchp = &dummy_con;
|
conswitchp = &dummy_con;
|
||||||
|
@ -1131,14 +1131,14 @@ void __init setup_arch(char **cmdline_p)
|
||||||
register_refined_jiffies(CLOCK_TICK_RATE);
|
register_refined_jiffies(CLOCK_TICK_RATE);
|
||||||
|
|
||||||
#ifdef CONFIG_EFI
|
#ifdef CONFIG_EFI
|
||||||
/* Once setup is done above, disable efi_enabled on mismatched
|
/* Once setup is done above, unmap the EFI memory map on
|
||||||
* firmware/kernel archtectures since there is no support for
|
* mismatched firmware/kernel archtectures since there is no
|
||||||
* runtime services.
|
* support for runtime services.
|
||||||
*/
|
*/
|
||||||
if (efi_enabled && IS_ENABLED(CONFIG_X86_64) != efi_64bit) {
|
if (efi_enabled(EFI_BOOT) &&
|
||||||
|
IS_ENABLED(CONFIG_X86_64) != efi_enabled(EFI_64BIT)) {
|
||||||
pr_info("efi: Setup done, disabling due to 32/64-bit mismatch\n");
|
pr_info("efi: Setup done, disabling due to 32/64-bit mismatch\n");
|
||||||
efi_unmap_memmap();
|
efi_unmap_memmap();
|
||||||
efi_enabled = 0;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,9 +51,6 @@
|
||||||
|
|
||||||
#define EFI_DEBUG 1
|
#define EFI_DEBUG 1
|
||||||
|
|
||||||
int efi_enabled;
|
|
||||||
EXPORT_SYMBOL(efi_enabled);
|
|
||||||
|
|
||||||
struct efi __read_mostly efi = {
|
struct efi __read_mostly efi = {
|
||||||
.mps = EFI_INVALID_TABLE_ADDR,
|
.mps = EFI_INVALID_TABLE_ADDR,
|
||||||
.acpi = EFI_INVALID_TABLE_ADDR,
|
.acpi = EFI_INVALID_TABLE_ADDR,
|
||||||
|
@ -69,19 +66,28 @@ EXPORT_SYMBOL(efi);
|
||||||
|
|
||||||
struct efi_memory_map memmap;
|
struct efi_memory_map memmap;
|
||||||
|
|
||||||
bool efi_64bit;
|
|
||||||
|
|
||||||
static struct efi efi_phys __initdata;
|
static struct efi efi_phys __initdata;
|
||||||
static efi_system_table_t efi_systab __initdata;
|
static efi_system_table_t efi_systab __initdata;
|
||||||
|
|
||||||
static inline bool efi_is_native(void)
|
static inline bool efi_is_native(void)
|
||||||
{
|
{
|
||||||
return IS_ENABLED(CONFIG_X86_64) == efi_64bit;
|
return IS_ENABLED(CONFIG_X86_64) == efi_enabled(EFI_64BIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned long x86_efi_facility;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns 1 if 'facility' is enabled, 0 otherwise.
|
||||||
|
*/
|
||||||
|
int efi_enabled(int facility)
|
||||||
|
{
|
||||||
|
return test_bit(facility, &x86_efi_facility) != 0;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(efi_enabled);
|
||||||
|
|
||||||
static int __init setup_noefi(char *arg)
|
static int __init setup_noefi(char *arg)
|
||||||
{
|
{
|
||||||
efi_enabled = 0;
|
clear_bit(EFI_BOOT, &x86_efi_facility);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
early_param("noefi", setup_noefi);
|
early_param("noefi", setup_noefi);
|
||||||
|
@ -426,6 +432,7 @@ void __init efi_reserve_boot_services(void)
|
||||||
|
|
||||||
void __init efi_unmap_memmap(void)
|
void __init efi_unmap_memmap(void)
|
||||||
{
|
{
|
||||||
|
clear_bit(EFI_MEMMAP, &x86_efi_facility);
|
||||||
if (memmap.map) {
|
if (memmap.map) {
|
||||||
early_iounmap(memmap.map, memmap.nr_map * memmap.desc_size);
|
early_iounmap(memmap.map, memmap.nr_map * memmap.desc_size);
|
||||||
memmap.map = NULL;
|
memmap.map = NULL;
|
||||||
|
@ -460,7 +467,7 @@ void __init efi_free_boot_services(void)
|
||||||
|
|
||||||
static int __init efi_systab_init(void *phys)
|
static int __init efi_systab_init(void *phys)
|
||||||
{
|
{
|
||||||
if (efi_64bit) {
|
if (efi_enabled(EFI_64BIT)) {
|
||||||
efi_system_table_64_t *systab64;
|
efi_system_table_64_t *systab64;
|
||||||
u64 tmp = 0;
|
u64 tmp = 0;
|
||||||
|
|
||||||
|
@ -552,7 +559,7 @@ static int __init efi_config_init(u64 tables, int nr_tables)
|
||||||
void *config_tables, *tablep;
|
void *config_tables, *tablep;
|
||||||
int i, sz;
|
int i, sz;
|
||||||
|
|
||||||
if (efi_64bit)
|
if (efi_enabled(EFI_64BIT))
|
||||||
sz = sizeof(efi_config_table_64_t);
|
sz = sizeof(efi_config_table_64_t);
|
||||||
else
|
else
|
||||||
sz = sizeof(efi_config_table_32_t);
|
sz = sizeof(efi_config_table_32_t);
|
||||||
|
@ -572,7 +579,7 @@ static int __init efi_config_init(u64 tables, int nr_tables)
|
||||||
efi_guid_t guid;
|
efi_guid_t guid;
|
||||||
unsigned long table;
|
unsigned long table;
|
||||||
|
|
||||||
if (efi_64bit) {
|
if (efi_enabled(EFI_64BIT)) {
|
||||||
u64 table64;
|
u64 table64;
|
||||||
guid = ((efi_config_table_64_t *)tablep)->guid;
|
guid = ((efi_config_table_64_t *)tablep)->guid;
|
||||||
table64 = ((efi_config_table_64_t *)tablep)->table;
|
table64 = ((efi_config_table_64_t *)tablep)->table;
|
||||||
|
@ -684,7 +691,6 @@ void __init efi_init(void)
|
||||||
if (boot_params.efi_info.efi_systab_hi ||
|
if (boot_params.efi_info.efi_systab_hi ||
|
||||||
boot_params.efi_info.efi_memmap_hi) {
|
boot_params.efi_info.efi_memmap_hi) {
|
||||||
pr_info("Table located above 4GB, disabling EFI.\n");
|
pr_info("Table located above 4GB, disabling EFI.\n");
|
||||||
efi_enabled = 0;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
efi_phys.systab = (efi_system_table_t *)boot_params.efi_info.efi_systab;
|
efi_phys.systab = (efi_system_table_t *)boot_params.efi_info.efi_systab;
|
||||||
|
@ -694,10 +700,10 @@ void __init efi_init(void)
|
||||||
((__u64)boot_params.efi_info.efi_systab_hi<<32));
|
((__u64)boot_params.efi_info.efi_systab_hi<<32));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (efi_systab_init(efi_phys.systab)) {
|
if (efi_systab_init(efi_phys.systab))
|
||||||
efi_enabled = 0;
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
set_bit(EFI_SYSTEM_TABLES, &x86_efi_facility);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Show what we know for posterity
|
* Show what we know for posterity
|
||||||
|
@ -715,10 +721,10 @@ void __init efi_init(void)
|
||||||
efi.systab->hdr.revision >> 16,
|
efi.systab->hdr.revision >> 16,
|
||||||
efi.systab->hdr.revision & 0xffff, vendor);
|
efi.systab->hdr.revision & 0xffff, vendor);
|
||||||
|
|
||||||
if (efi_config_init(efi.systab->tables, efi.systab->nr_tables)) {
|
if (efi_config_init(efi.systab->tables, efi.systab->nr_tables))
|
||||||
efi_enabled = 0;
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
set_bit(EFI_CONFIG_TABLES, &x86_efi_facility);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Note: We currently don't support runtime services on an EFI
|
* Note: We currently don't support runtime services on an EFI
|
||||||
|
@ -727,15 +733,17 @@ void __init efi_init(void)
|
||||||
|
|
||||||
if (!efi_is_native())
|
if (!efi_is_native())
|
||||||
pr_info("No EFI runtime due to 32/64-bit mismatch with kernel\n");
|
pr_info("No EFI runtime due to 32/64-bit mismatch with kernel\n");
|
||||||
else if (efi_runtime_init()) {
|
else {
|
||||||
efi_enabled = 0;
|
if (efi_runtime_init())
|
||||||
return;
|
return;
|
||||||
|
set_bit(EFI_RUNTIME_SERVICES, &x86_efi_facility);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (efi_memmap_init()) {
|
if (efi_memmap_init())
|
||||||
efi_enabled = 0;
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
set_bit(EFI_MEMMAP, &x86_efi_facility);
|
||||||
|
|
||||||
#ifdef CONFIG_X86_32
|
#ifdef CONFIG_X86_32
|
||||||
if (efi_is_native()) {
|
if (efi_is_native()) {
|
||||||
x86_platform.get_wallclock = efi_get_time;
|
x86_platform.get_wallclock = efi_get_time;
|
||||||
|
@ -941,7 +949,7 @@ void __init efi_enter_virtual_mode(void)
|
||||||
*
|
*
|
||||||
* Call EFI services through wrapper functions.
|
* Call EFI services through wrapper functions.
|
||||||
*/
|
*/
|
||||||
efi.runtime_version = efi_systab.fw_revision;
|
efi.runtime_version = efi_systab.hdr.revision;
|
||||||
efi.get_time = virt_efi_get_time;
|
efi.get_time = virt_efi_get_time;
|
||||||
efi.set_time = virt_efi_set_time;
|
efi.set_time = virt_efi_set_time;
|
||||||
efi.get_wakeup_time = virt_efi_get_wakeup_time;
|
efi.get_wakeup_time = virt_efi_get_wakeup_time;
|
||||||
|
@ -969,6 +977,9 @@ u32 efi_mem_type(unsigned long phys_addr)
|
||||||
efi_memory_desc_t *md;
|
efi_memory_desc_t *md;
|
||||||
void *p;
|
void *p;
|
||||||
|
|
||||||
|
if (!efi_enabled(EFI_MEMMAP))
|
||||||
|
return 0;
|
||||||
|
|
||||||
for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) {
|
for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) {
|
||||||
md = p;
|
md = p;
|
||||||
if ((md->phys_addr <= phys_addr) &&
|
if ((md->phys_addr <= phys_addr) &&
|
||||||
|
|
|
@ -38,7 +38,7 @@
|
||||||
#include <asm/cacheflush.h>
|
#include <asm/cacheflush.h>
|
||||||
#include <asm/fixmap.h>
|
#include <asm/fixmap.h>
|
||||||
|
|
||||||
static pgd_t save_pgd __initdata;
|
static pgd_t *save_pgd __initdata;
|
||||||
static unsigned long efi_flags __initdata;
|
static unsigned long efi_flags __initdata;
|
||||||
|
|
||||||
static void __init early_code_mapping_set_exec(int executable)
|
static void __init early_code_mapping_set_exec(int executable)
|
||||||
|
@ -61,12 +61,20 @@ static void __init early_code_mapping_set_exec(int executable)
|
||||||
void __init efi_call_phys_prelog(void)
|
void __init efi_call_phys_prelog(void)
|
||||||
{
|
{
|
||||||
unsigned long vaddress;
|
unsigned long vaddress;
|
||||||
|
int pgd;
|
||||||
|
int n_pgds;
|
||||||
|
|
||||||
early_code_mapping_set_exec(1);
|
early_code_mapping_set_exec(1);
|
||||||
local_irq_save(efi_flags);
|
local_irq_save(efi_flags);
|
||||||
vaddress = (unsigned long)__va(0x0UL);
|
|
||||||
save_pgd = *pgd_offset_k(0x0UL);
|
n_pgds = DIV_ROUND_UP((max_pfn << PAGE_SHIFT), PGDIR_SIZE);
|
||||||
set_pgd(pgd_offset_k(0x0UL), *pgd_offset_k(vaddress));
|
save_pgd = kmalloc(n_pgds * sizeof(pgd_t), GFP_KERNEL);
|
||||||
|
|
||||||
|
for (pgd = 0; pgd < n_pgds; pgd++) {
|
||||||
|
save_pgd[pgd] = *pgd_offset_k(pgd * PGDIR_SIZE);
|
||||||
|
vaddress = (unsigned long)__va(pgd * PGDIR_SIZE);
|
||||||
|
set_pgd(pgd_offset_k(pgd * PGDIR_SIZE), *pgd_offset_k(vaddress));
|
||||||
|
}
|
||||||
__flush_tlb_all();
|
__flush_tlb_all();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -75,7 +83,11 @@ void __init efi_call_phys_epilog(void)
|
||||||
/*
|
/*
|
||||||
* After the lock is released, the original page table is restored.
|
* After the lock is released, the original page table is restored.
|
||||||
*/
|
*/
|
||||||
set_pgd(pgd_offset_k(0x0UL), save_pgd);
|
int pgd;
|
||||||
|
int n_pgds = DIV_ROUND_UP((max_pfn << PAGE_SHIFT) , PGDIR_SIZE);
|
||||||
|
for (pgd = 0; pgd < n_pgds; pgd++)
|
||||||
|
set_pgd(pgd_offset_k(pgd * PGDIR_SIZE), save_pgd[pgd]);
|
||||||
|
kfree(save_pgd);
|
||||||
__flush_tlb_all();
|
__flush_tlb_all();
|
||||||
local_irq_restore(efi_flags);
|
local_irq_restore(efi_flags);
|
||||||
early_code_mapping_set_exec(0);
|
early_code_mapping_set_exec(0);
|
||||||
|
|
|
@ -1034,7 +1034,8 @@ static int set_distrib_bits(struct cpumask *flush_mask, struct bau_control *bcp,
|
||||||
* globally purge translation cache of a virtual address or all TLB's
|
* globally purge translation cache of a virtual address or all TLB's
|
||||||
* @cpumask: mask of all cpu's in which the address is to be removed
|
* @cpumask: mask of all cpu's in which the address is to be removed
|
||||||
* @mm: mm_struct containing virtual address range
|
* @mm: mm_struct containing virtual address range
|
||||||
* @va: virtual address to be removed (or TLB_FLUSH_ALL for all TLB's on cpu)
|
* @start: start virtual address to be removed from TLB
|
||||||
|
* @end: end virtual address to be remove from TLB
|
||||||
* @cpu: the current cpu
|
* @cpu: the current cpu
|
||||||
*
|
*
|
||||||
* This is the entry point for initiating any UV global TLB shootdown.
|
* This is the entry point for initiating any UV global TLB shootdown.
|
||||||
|
@ -1056,7 +1057,7 @@ static int set_distrib_bits(struct cpumask *flush_mask, struct bau_control *bcp,
|
||||||
*/
|
*/
|
||||||
const struct cpumask *uv_flush_tlb_others(const struct cpumask *cpumask,
|
const struct cpumask *uv_flush_tlb_others(const struct cpumask *cpumask,
|
||||||
struct mm_struct *mm, unsigned long start,
|
struct mm_struct *mm, unsigned long start,
|
||||||
unsigned end, unsigned int cpu)
|
unsigned long end, unsigned int cpu)
|
||||||
{
|
{
|
||||||
int locals = 0;
|
int locals = 0;
|
||||||
int remotes = 0;
|
int remotes = 0;
|
||||||
|
@ -1113,7 +1114,10 @@ const struct cpumask *uv_flush_tlb_others(const struct cpumask *cpumask,
|
||||||
|
|
||||||
record_send_statistics(stat, locals, hubs, remotes, bau_desc);
|
record_send_statistics(stat, locals, hubs, remotes, bau_desc);
|
||||||
|
|
||||||
bau_desc->payload.address = start;
|
if (!end || (end - start) <= PAGE_SIZE)
|
||||||
|
bau_desc->payload.address = start;
|
||||||
|
else
|
||||||
|
bau_desc->payload.address = TLB_FLUSH_ALL;
|
||||||
bau_desc->payload.sending_cpu = cpu;
|
bau_desc->payload.sending_cpu = cpu;
|
||||||
/*
|
/*
|
||||||
* uv_flush_send_and_wait returns 0 if all cpu's were messaged,
|
* uv_flush_send_and_wait returns 0 if all cpu's were messaged,
|
||||||
|
|
|
@ -814,12 +814,14 @@ int main(int argc, char **argv)
|
||||||
read_relocs(fp);
|
read_relocs(fp);
|
||||||
if (show_absolute_syms) {
|
if (show_absolute_syms) {
|
||||||
print_absolute_symbols();
|
print_absolute_symbols();
|
||||||
return 0;
|
goto out;
|
||||||
}
|
}
|
||||||
if (show_absolute_relocs) {
|
if (show_absolute_relocs) {
|
||||||
print_absolute_relocs();
|
print_absolute_relocs();
|
||||||
return 0;
|
goto out;
|
||||||
}
|
}
|
||||||
emit_relocs(as_text, use_real_mode);
|
emit_relocs(as_text, use_real_mode);
|
||||||
|
out:
|
||||||
|
fclose(fp);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -250,7 +250,7 @@ acpi_physical_address __init acpi_os_get_root_pointer(void)
|
||||||
return acpi_rsdp;
|
return acpi_rsdp;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (efi_enabled) {
|
if (efi_enabled(EFI_CONFIG_TABLES)) {
|
||||||
if (efi.acpi20 != EFI_INVALID_TABLE_ADDR)
|
if (efi.acpi20 != EFI_INVALID_TABLE_ADDR)
|
||||||
return efi.acpi20;
|
return efi.acpi20;
|
||||||
else if (efi.acpi != EFI_INVALID_TABLE_ADDR)
|
else if (efi.acpi != EFI_INVALID_TABLE_ADDR)
|
||||||
|
|
|
@ -77,10 +77,15 @@ static struct usb_device_id ath3k_table[] = {
|
||||||
{ USB_DEVICE(0x0CF3, 0x311D) },
|
{ USB_DEVICE(0x0CF3, 0x311D) },
|
||||||
{ USB_DEVICE(0x13d3, 0x3375) },
|
{ USB_DEVICE(0x13d3, 0x3375) },
|
||||||
{ USB_DEVICE(0x04CA, 0x3005) },
|
{ USB_DEVICE(0x04CA, 0x3005) },
|
||||||
|
{ USB_DEVICE(0x04CA, 0x3006) },
|
||||||
|
{ USB_DEVICE(0x04CA, 0x3008) },
|
||||||
{ USB_DEVICE(0x13d3, 0x3362) },
|
{ USB_DEVICE(0x13d3, 0x3362) },
|
||||||
{ USB_DEVICE(0x0CF3, 0xE004) },
|
{ USB_DEVICE(0x0CF3, 0xE004) },
|
||||||
{ USB_DEVICE(0x0930, 0x0219) },
|
{ USB_DEVICE(0x0930, 0x0219) },
|
||||||
{ USB_DEVICE(0x0489, 0xe057) },
|
{ USB_DEVICE(0x0489, 0xe057) },
|
||||||
|
{ USB_DEVICE(0x13d3, 0x3393) },
|
||||||
|
{ USB_DEVICE(0x0489, 0xe04e) },
|
||||||
|
{ USB_DEVICE(0x0489, 0xe056) },
|
||||||
|
|
||||||
/* Atheros AR5BBU12 with sflash firmware */
|
/* Atheros AR5BBU12 with sflash firmware */
|
||||||
{ USB_DEVICE(0x0489, 0xE02C) },
|
{ USB_DEVICE(0x0489, 0xE02C) },
|
||||||
|
@ -104,10 +109,15 @@ static struct usb_device_id ath3k_blist_tbl[] = {
|
||||||
{ USB_DEVICE(0x0cf3, 0x311D), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x0cf3, 0x311D), .driver_info = BTUSB_ATH3012 },
|
||||||
{ USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
|
||||||
{ USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
|
||||||
|
{ USB_DEVICE(0x04ca, 0x3006), .driver_info = BTUSB_ATH3012 },
|
||||||
|
{ USB_DEVICE(0x04ca, 0x3008), .driver_info = BTUSB_ATH3012 },
|
||||||
{ USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
|
||||||
{ USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 },
|
||||||
{ USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 },
|
||||||
{ USB_DEVICE(0x0489, 0xe057), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x0489, 0xe057), .driver_info = BTUSB_ATH3012 },
|
||||||
|
{ USB_DEVICE(0x13d3, 0x3393), .driver_info = BTUSB_ATH3012 },
|
||||||
|
{ USB_DEVICE(0x0489, 0xe04e), .driver_info = BTUSB_ATH3012 },
|
||||||
|
{ USB_DEVICE(0x0489, 0xe056), .driver_info = BTUSB_ATH3012 },
|
||||||
|
|
||||||
/* Atheros AR5BBU22 with sflash firmware */
|
/* Atheros AR5BBU22 with sflash firmware */
|
||||||
{ USB_DEVICE(0x0489, 0xE03C), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x0489, 0xE03C), .driver_info = BTUSB_ATH3012 },
|
||||||
|
|
|
@ -135,10 +135,15 @@ static struct usb_device_id blacklist_table[] = {
|
||||||
{ USB_DEVICE(0x0cf3, 0x311d), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x0cf3, 0x311d), .driver_info = BTUSB_ATH3012 },
|
||||||
{ USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
|
||||||
{ USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
|
||||||
|
{ USB_DEVICE(0x04ca, 0x3006), .driver_info = BTUSB_ATH3012 },
|
||||||
|
{ USB_DEVICE(0x04ca, 0x3008), .driver_info = BTUSB_ATH3012 },
|
||||||
{ USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
|
||||||
{ USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 },
|
||||||
{ USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 },
|
||||||
{ USB_DEVICE(0x0489, 0xe057), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x0489, 0xe057), .driver_info = BTUSB_ATH3012 },
|
||||||
|
{ USB_DEVICE(0x13d3, 0x3393), .driver_info = BTUSB_ATH3012 },
|
||||||
|
{ USB_DEVICE(0x0489, 0xe04e), .driver_info = BTUSB_ATH3012 },
|
||||||
|
{ USB_DEVICE(0x0489, 0xe056), .driver_info = BTUSB_ATH3012 },
|
||||||
|
|
||||||
/* Atheros AR5BBU12 with sflash firmware */
|
/* Atheros AR5BBU12 with sflash firmware */
|
||||||
{ USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE },
|
{ USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE },
|
||||||
|
|
|
@ -340,7 +340,7 @@ struct mem_ctl_info *edac_mc_alloc(unsigned mc_num,
|
||||||
/*
|
/*
|
||||||
* Alocate and fill the csrow/channels structs
|
* Alocate and fill the csrow/channels structs
|
||||||
*/
|
*/
|
||||||
mci->csrows = kcalloc(sizeof(*mci->csrows), tot_csrows, GFP_KERNEL);
|
mci->csrows = kcalloc(tot_csrows, sizeof(*mci->csrows), GFP_KERNEL);
|
||||||
if (!mci->csrows)
|
if (!mci->csrows)
|
||||||
goto error;
|
goto error;
|
||||||
for (row = 0; row < tot_csrows; row++) {
|
for (row = 0; row < tot_csrows; row++) {
|
||||||
|
@ -351,7 +351,7 @@ struct mem_ctl_info *edac_mc_alloc(unsigned mc_num,
|
||||||
csr->csrow_idx = row;
|
csr->csrow_idx = row;
|
||||||
csr->mci = mci;
|
csr->mci = mci;
|
||||||
csr->nr_channels = tot_channels;
|
csr->nr_channels = tot_channels;
|
||||||
csr->channels = kcalloc(sizeof(*csr->channels), tot_channels,
|
csr->channels = kcalloc(tot_channels, sizeof(*csr->channels),
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
if (!csr->channels)
|
if (!csr->channels)
|
||||||
goto error;
|
goto error;
|
||||||
|
@ -369,7 +369,7 @@ struct mem_ctl_info *edac_mc_alloc(unsigned mc_num,
|
||||||
/*
|
/*
|
||||||
* Allocate and fill the dimm structs
|
* Allocate and fill the dimm structs
|
||||||
*/
|
*/
|
||||||
mci->dimms = kcalloc(sizeof(*mci->dimms), tot_dimms, GFP_KERNEL);
|
mci->dimms = kcalloc(tot_dimms, sizeof(*mci->dimms), GFP_KERNEL);
|
||||||
if (!mci->dimms)
|
if (!mci->dimms)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
|
|
|
@ -256,7 +256,7 @@ static ssize_t edac_pci_dev_store(struct kobject *kobj,
|
||||||
struct edac_pci_dev_attribute *edac_pci_dev;
|
struct edac_pci_dev_attribute *edac_pci_dev;
|
||||||
edac_pci_dev = (struct edac_pci_dev_attribute *)attr;
|
edac_pci_dev = (struct edac_pci_dev_attribute *)attr;
|
||||||
|
|
||||||
if (edac_pci_dev->show)
|
if (edac_pci_dev->store)
|
||||||
return edac_pci_dev->store(edac_pci_dev->value, buffer, count);
|
return edac_pci_dev->store(edac_pci_dev->value, buffer, count);
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
|
@ -471,7 +471,7 @@ void __init dmi_scan_machine(void)
|
||||||
char __iomem *p, *q;
|
char __iomem *p, *q;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
if (efi_enabled) {
|
if (efi_enabled(EFI_CONFIG_TABLES)) {
|
||||||
if (efi.smbios == EFI_INVALID_TABLE_ADDR)
|
if (efi.smbios == EFI_INVALID_TABLE_ADDR)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
|
|
|
@ -674,7 +674,7 @@ static int efi_status_to_err(efi_status_t status)
|
||||||
err = -EACCES;
|
err = -EACCES;
|
||||||
break;
|
break;
|
||||||
case EFI_NOT_FOUND:
|
case EFI_NOT_FOUND:
|
||||||
err = -ENOENT;
|
err = -EIO;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
err = -EINVAL;
|
err = -EINVAL;
|
||||||
|
@ -793,6 +793,7 @@ static ssize_t efivarfs_file_write(struct file *file,
|
||||||
spin_unlock(&efivars->lock);
|
spin_unlock(&efivars->lock);
|
||||||
efivar_unregister(var);
|
efivar_unregister(var);
|
||||||
drop_nlink(inode);
|
drop_nlink(inode);
|
||||||
|
d_delete(file->f_dentry);
|
||||||
dput(file->f_dentry);
|
dput(file->f_dentry);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
@ -994,7 +995,7 @@ static int efivarfs_unlink(struct inode *dir, struct dentry *dentry)
|
||||||
list_del(&var->list);
|
list_del(&var->list);
|
||||||
spin_unlock(&efivars->lock);
|
spin_unlock(&efivars->lock);
|
||||||
efivar_unregister(var);
|
efivar_unregister(var);
|
||||||
drop_nlink(dir);
|
drop_nlink(dentry->d_inode);
|
||||||
dput(dentry);
|
dput(dentry);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1782,7 +1783,7 @@ efivars_init(void)
|
||||||
printk(KERN_INFO "EFI Variables Facility v%s %s\n", EFIVARS_VERSION,
|
printk(KERN_INFO "EFI Variables Facility v%s %s\n", EFIVARS_VERSION,
|
||||||
EFIVARS_DATE);
|
EFIVARS_DATE);
|
||||||
|
|
||||||
if (!efi_enabled)
|
if (!efi_enabled(EFI_RUNTIME_SERVICES))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* For now we'll register the efi directory at /sys/firmware/efi */
|
/* For now we'll register the efi directory at /sys/firmware/efi */
|
||||||
|
@ -1822,7 +1823,7 @@ err_put:
|
||||||
static void __exit
|
static void __exit
|
||||||
efivars_exit(void)
|
efivars_exit(void)
|
||||||
{
|
{
|
||||||
if (efi_enabled) {
|
if (efi_enabled(EFI_RUNTIME_SERVICES)) {
|
||||||
unregister_efivars(&__efivars);
|
unregister_efivars(&__efivars);
|
||||||
kobject_put(efi_kobj);
|
kobject_put(efi_kobj);
|
||||||
}
|
}
|
||||||
|
|
|
@ -99,7 +99,7 @@ unsigned long __init find_ibft_region(unsigned long *sizep)
|
||||||
/* iBFT 1.03 section 1.4.3.1 mandates that UEFI machines will
|
/* iBFT 1.03 section 1.4.3.1 mandates that UEFI machines will
|
||||||
* only use ACPI for this */
|
* only use ACPI for this */
|
||||||
|
|
||||||
if (!efi_enabled)
|
if (!efi_enabled(EFI_BOOT))
|
||||||
find_ibft_in_mem();
|
find_ibft_in_mem();
|
||||||
|
|
||||||
if (ibft_addr) {
|
if (ibft_addr) {
|
||||||
|
|
|
@ -24,7 +24,7 @@ config DRM_EXYNOS_DMABUF
|
||||||
|
|
||||||
config DRM_EXYNOS_FIMD
|
config DRM_EXYNOS_FIMD
|
||||||
bool "Exynos DRM FIMD"
|
bool "Exynos DRM FIMD"
|
||||||
depends on DRM_EXYNOS && !FB_S3C
|
depends on DRM_EXYNOS && !FB_S3C && !ARCH_MULTIPLATFORM
|
||||||
help
|
help
|
||||||
Choose this option if you want to use Exynos FIMD for DRM.
|
Choose this option if you want to use Exynos FIMD for DRM.
|
||||||
|
|
||||||
|
@ -48,7 +48,7 @@ config DRM_EXYNOS_G2D
|
||||||
|
|
||||||
config DRM_EXYNOS_IPP
|
config DRM_EXYNOS_IPP
|
||||||
bool "Exynos DRM IPP"
|
bool "Exynos DRM IPP"
|
||||||
depends on DRM_EXYNOS
|
depends on DRM_EXYNOS && !ARCH_MULTIPLATFORM
|
||||||
help
|
help
|
||||||
Choose this option if you want to use IPP feature for DRM.
|
Choose this option if you want to use IPP feature for DRM.
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,6 @@
|
||||||
#include "exynos_drm_drv.h"
|
#include "exynos_drm_drv.h"
|
||||||
#include "exynos_drm_encoder.h"
|
#include "exynos_drm_encoder.h"
|
||||||
|
|
||||||
#define MAX_EDID 256
|
|
||||||
#define to_exynos_connector(x) container_of(x, struct exynos_drm_connector,\
|
#define to_exynos_connector(x) container_of(x, struct exynos_drm_connector,\
|
||||||
drm_connector)
|
drm_connector)
|
||||||
|
|
||||||
|
@ -96,7 +95,9 @@ static int exynos_drm_connector_get_modes(struct drm_connector *connector)
|
||||||
to_exynos_connector(connector);
|
to_exynos_connector(connector);
|
||||||
struct exynos_drm_manager *manager = exynos_connector->manager;
|
struct exynos_drm_manager *manager = exynos_connector->manager;
|
||||||
struct exynos_drm_display_ops *display_ops = manager->display_ops;
|
struct exynos_drm_display_ops *display_ops = manager->display_ops;
|
||||||
unsigned int count;
|
struct edid *edid = NULL;
|
||||||
|
unsigned int count = 0;
|
||||||
|
int ret;
|
||||||
|
|
||||||
DRM_DEBUG_KMS("%s\n", __FILE__);
|
DRM_DEBUG_KMS("%s\n", __FILE__);
|
||||||
|
|
||||||
|
@ -114,27 +115,21 @@ static int exynos_drm_connector_get_modes(struct drm_connector *connector)
|
||||||
* because lcd panel has only one mode.
|
* because lcd panel has only one mode.
|
||||||
*/
|
*/
|
||||||
if (display_ops->get_edid) {
|
if (display_ops->get_edid) {
|
||||||
int ret;
|
edid = display_ops->get_edid(manager->dev, connector);
|
||||||
void *edid;
|
if (IS_ERR_OR_NULL(edid)) {
|
||||||
|
ret = PTR_ERR(edid);
|
||||||
edid = kzalloc(MAX_EDID, GFP_KERNEL);
|
edid = NULL;
|
||||||
if (!edid) {
|
DRM_ERROR("Panel operation get_edid failed %d\n", ret);
|
||||||
DRM_ERROR("failed to allocate edid\n");
|
goto out;
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = display_ops->get_edid(manager->dev, connector,
|
count = drm_add_edid_modes(connector, edid);
|
||||||
edid, MAX_EDID);
|
if (count < 0) {
|
||||||
if (ret < 0) {
|
DRM_ERROR("Add edid modes failed %d\n", count);
|
||||||
DRM_ERROR("failed to get edid data.\n");
|
goto out;
|
||||||
kfree(edid);
|
|
||||||
edid = NULL;
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
drm_mode_connector_update_edid_property(connector, edid);
|
drm_mode_connector_update_edid_property(connector, edid);
|
||||||
count = drm_add_edid_modes(connector, edid);
|
|
||||||
kfree(edid);
|
|
||||||
} else {
|
} else {
|
||||||
struct exynos_drm_panel_info *panel;
|
struct exynos_drm_panel_info *panel;
|
||||||
struct drm_display_mode *mode = drm_mode_create(connector->dev);
|
struct drm_display_mode *mode = drm_mode_create(connector->dev);
|
||||||
|
@ -161,6 +156,8 @@ static int exynos_drm_connector_get_modes(struct drm_connector *connector)
|
||||||
count = 1;
|
count = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
|
kfree(edid);
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
struct exynos_drm_dmabuf_attachment {
|
struct exynos_drm_dmabuf_attachment {
|
||||||
struct sg_table sgt;
|
struct sg_table sgt;
|
||||||
enum dma_data_direction dir;
|
enum dma_data_direction dir;
|
||||||
|
bool is_mapped;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int exynos_gem_attach_dma_buf(struct dma_buf *dmabuf,
|
static int exynos_gem_attach_dma_buf(struct dma_buf *dmabuf,
|
||||||
|
@ -72,17 +73,10 @@ static struct sg_table *
|
||||||
|
|
||||||
DRM_DEBUG_PRIME("%s\n", __FILE__);
|
DRM_DEBUG_PRIME("%s\n", __FILE__);
|
||||||
|
|
||||||
if (WARN_ON(dir == DMA_NONE))
|
|
||||||
return ERR_PTR(-EINVAL);
|
|
||||||
|
|
||||||
/* just return current sgt if already requested. */
|
/* just return current sgt if already requested. */
|
||||||
if (exynos_attach->dir == dir)
|
if (exynos_attach->dir == dir && exynos_attach->is_mapped)
|
||||||
return &exynos_attach->sgt;
|
return &exynos_attach->sgt;
|
||||||
|
|
||||||
/* reattaching is not allowed. */
|
|
||||||
if (WARN_ON(exynos_attach->dir != DMA_NONE))
|
|
||||||
return ERR_PTR(-EBUSY);
|
|
||||||
|
|
||||||
buf = gem_obj->buffer;
|
buf = gem_obj->buffer;
|
||||||
if (!buf) {
|
if (!buf) {
|
||||||
DRM_ERROR("buffer is null.\n");
|
DRM_ERROR("buffer is null.\n");
|
||||||
|
@ -107,13 +101,17 @@ static struct sg_table *
|
||||||
wr = sg_next(wr);
|
wr = sg_next(wr);
|
||||||
}
|
}
|
||||||
|
|
||||||
nents = dma_map_sg(attach->dev, sgt->sgl, sgt->orig_nents, dir);
|
if (dir != DMA_NONE) {
|
||||||
if (!nents) {
|
nents = dma_map_sg(attach->dev, sgt->sgl, sgt->orig_nents, dir);
|
||||||
DRM_ERROR("failed to map sgl with iommu.\n");
|
if (!nents) {
|
||||||
sgt = ERR_PTR(-EIO);
|
DRM_ERROR("failed to map sgl with iommu.\n");
|
||||||
goto err_unlock;
|
sg_free_table(sgt);
|
||||||
|
sgt = ERR_PTR(-EIO);
|
||||||
|
goto err_unlock;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
exynos_attach->is_mapped = true;
|
||||||
exynos_attach->dir = dir;
|
exynos_attach->dir = dir;
|
||||||
attach->priv = exynos_attach;
|
attach->priv = exynos_attach;
|
||||||
|
|
||||||
|
|
|
@ -148,8 +148,8 @@ struct exynos_drm_overlay {
|
||||||
struct exynos_drm_display_ops {
|
struct exynos_drm_display_ops {
|
||||||
enum exynos_drm_output_type type;
|
enum exynos_drm_output_type type;
|
||||||
bool (*is_connected)(struct device *dev);
|
bool (*is_connected)(struct device *dev);
|
||||||
int (*get_edid)(struct device *dev, struct drm_connector *connector,
|
struct edid *(*get_edid)(struct device *dev,
|
||||||
u8 *edid, int len);
|
struct drm_connector *connector);
|
||||||
void *(*get_panel)(struct device *dev);
|
void *(*get_panel)(struct device *dev);
|
||||||
int (*check_timing)(struct device *dev, void *timing);
|
int (*check_timing)(struct device *dev, void *timing);
|
||||||
int (*power_on)(struct device *dev, int mode);
|
int (*power_on)(struct device *dev, int mode);
|
||||||
|
|
|
@ -324,7 +324,7 @@ out:
|
||||||
g2d_userptr = NULL;
|
g2d_userptr = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
dma_addr_t *g2d_userptr_get_dma_addr(struct drm_device *drm_dev,
|
static dma_addr_t *g2d_userptr_get_dma_addr(struct drm_device *drm_dev,
|
||||||
unsigned long userptr,
|
unsigned long userptr,
|
||||||
unsigned long size,
|
unsigned long size,
|
||||||
struct drm_file *filp,
|
struct drm_file *filp,
|
||||||
|
|
|
@ -108,18 +108,17 @@ static bool drm_hdmi_is_connected(struct device *dev)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int drm_hdmi_get_edid(struct device *dev,
|
static struct edid *drm_hdmi_get_edid(struct device *dev,
|
||||||
struct drm_connector *connector, u8 *edid, int len)
|
struct drm_connector *connector)
|
||||||
{
|
{
|
||||||
struct drm_hdmi_context *ctx = to_context(dev);
|
struct drm_hdmi_context *ctx = to_context(dev);
|
||||||
|
|
||||||
DRM_DEBUG_KMS("%s\n", __FILE__);
|
DRM_DEBUG_KMS("%s\n", __FILE__);
|
||||||
|
|
||||||
if (hdmi_ops && hdmi_ops->get_edid)
|
if (hdmi_ops && hdmi_ops->get_edid)
|
||||||
return hdmi_ops->get_edid(ctx->hdmi_ctx->ctx, connector, edid,
|
return hdmi_ops->get_edid(ctx->hdmi_ctx->ctx, connector);
|
||||||
len);
|
|
||||||
|
|
||||||
return 0;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int drm_hdmi_check_timing(struct device *dev, void *timing)
|
static int drm_hdmi_check_timing(struct device *dev, void *timing)
|
||||||
|
|
|
@ -30,8 +30,8 @@ struct exynos_drm_hdmi_context {
|
||||||
struct exynos_hdmi_ops {
|
struct exynos_hdmi_ops {
|
||||||
/* display */
|
/* display */
|
||||||
bool (*is_connected)(void *ctx);
|
bool (*is_connected)(void *ctx);
|
||||||
int (*get_edid)(void *ctx, struct drm_connector *connector,
|
struct edid *(*get_edid)(void *ctx,
|
||||||
u8 *edid, int len);
|
struct drm_connector *connector);
|
||||||
int (*check_timing)(void *ctx, void *timing);
|
int (*check_timing)(void *ctx, void *timing);
|
||||||
int (*power_on)(void *ctx, int mode);
|
int (*power_on)(void *ctx, int mode);
|
||||||
|
|
||||||
|
|
|
@ -869,7 +869,7 @@ static void ipp_put_event(struct drm_exynos_ipp_cmd_node *c_node,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ipp_handle_cmd_work(struct device *dev,
|
static void ipp_handle_cmd_work(struct device *dev,
|
||||||
struct exynos_drm_ippdrv *ippdrv,
|
struct exynos_drm_ippdrv *ippdrv,
|
||||||
struct drm_exynos_ipp_cmd_work *cmd_work,
|
struct drm_exynos_ipp_cmd_work *cmd_work,
|
||||||
struct drm_exynos_ipp_cmd_node *c_node)
|
struct drm_exynos_ipp_cmd_node *c_node)
|
||||||
|
|
|
@ -734,7 +734,7 @@ static int rotator_remove(struct platform_device *pdev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct rot_limit_table rot_limit_tbl = {
|
static struct rot_limit_table rot_limit_tbl = {
|
||||||
.ycbcr420_2p = {
|
.ycbcr420_2p = {
|
||||||
.min_w = 32,
|
.min_w = 32,
|
||||||
.min_h = 32,
|
.min_h = 32,
|
||||||
|
@ -751,7 +751,7 @@ struct rot_limit_table rot_limit_tbl = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
struct platform_device_id rotator_driver_ids[] = {
|
static struct platform_device_id rotator_driver_ids[] = {
|
||||||
{
|
{
|
||||||
.name = "exynos-rot",
|
.name = "exynos-rot",
|
||||||
.driver_data = (unsigned long)&rot_limit_tbl,
|
.driver_data = (unsigned long)&rot_limit_tbl,
|
||||||
|
|
|
@ -98,10 +98,12 @@ static bool vidi_display_is_connected(struct device *dev)
|
||||||
return ctx->connected ? true : false;
|
return ctx->connected ? true : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int vidi_get_edid(struct device *dev, struct drm_connector *connector,
|
static struct edid *vidi_get_edid(struct device *dev,
|
||||||
u8 *edid, int len)
|
struct drm_connector *connector)
|
||||||
{
|
{
|
||||||
struct vidi_context *ctx = get_vidi_context(dev);
|
struct vidi_context *ctx = get_vidi_context(dev);
|
||||||
|
struct edid *edid;
|
||||||
|
int edid_len;
|
||||||
|
|
||||||
DRM_DEBUG_KMS("%s\n", __FILE__);
|
DRM_DEBUG_KMS("%s\n", __FILE__);
|
||||||
|
|
||||||
|
@ -111,13 +113,18 @@ static int vidi_get_edid(struct device *dev, struct drm_connector *connector,
|
||||||
*/
|
*/
|
||||||
if (!ctx->raw_edid) {
|
if (!ctx->raw_edid) {
|
||||||
DRM_DEBUG_KMS("raw_edid is null.\n");
|
DRM_DEBUG_KMS("raw_edid is null.\n");
|
||||||
return -EFAULT;
|
return ERR_PTR(-EFAULT);
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(edid, ctx->raw_edid, min((1 + ctx->raw_edid->extensions)
|
edid_len = (1 + ctx->raw_edid->extensions) * EDID_LENGTH;
|
||||||
* EDID_LENGTH, len));
|
edid = kzalloc(edid_len, GFP_KERNEL);
|
||||||
|
if (!edid) {
|
||||||
|
DRM_DEBUG_KMS("failed to allocate edid\n");
|
||||||
|
return ERR_PTR(-ENOMEM);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
memcpy(edid, ctx->raw_edid, edid_len);
|
||||||
|
return edid;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *vidi_get_panel(struct device *dev)
|
static void *vidi_get_panel(struct device *dev)
|
||||||
|
@ -514,7 +521,6 @@ int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,
|
||||||
struct exynos_drm_manager *manager;
|
struct exynos_drm_manager *manager;
|
||||||
struct exynos_drm_display_ops *display_ops;
|
struct exynos_drm_display_ops *display_ops;
|
||||||
struct drm_exynos_vidi_connection *vidi = data;
|
struct drm_exynos_vidi_connection *vidi = data;
|
||||||
struct edid *raw_edid;
|
|
||||||
int edid_len;
|
int edid_len;
|
||||||
|
|
||||||
DRM_DEBUG_KMS("%s\n", __FILE__);
|
DRM_DEBUG_KMS("%s\n", __FILE__);
|
||||||
|
@ -551,11 +557,11 @@ int vidi_connection_ioctl(struct drm_device *drm_dev, void *data,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vidi->connection) {
|
if (vidi->connection) {
|
||||||
if (!vidi->edid) {
|
struct edid *raw_edid = (struct edid *)(uint32_t)vidi->edid;
|
||||||
DRM_DEBUG_KMS("edid data is null.\n");
|
if (!drm_edid_is_valid(raw_edid)) {
|
||||||
|
DRM_DEBUG_KMS("edid data is invalid.\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
raw_edid = (struct edid *)(uint32_t)vidi->edid;
|
|
||||||
edid_len = (1 + raw_edid->extensions) * EDID_LENGTH;
|
edid_len = (1 + raw_edid->extensions) * EDID_LENGTH;
|
||||||
ctx->raw_edid = kzalloc(edid_len, GFP_KERNEL);
|
ctx->raw_edid = kzalloc(edid_len, GFP_KERNEL);
|
||||||
if (!ctx->raw_edid) {
|
if (!ctx->raw_edid) {
|
||||||
|
|
|
@ -34,7 +34,6 @@
|
||||||
#include <linux/regulator/consumer.h>
|
#include <linux/regulator/consumer.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
#include <linux/of_gpio.h>
|
#include <linux/of_gpio.h>
|
||||||
#include <plat/gpio-cfg.h>
|
|
||||||
|
|
||||||
#include <drm/exynos_drm.h>
|
#include <drm/exynos_drm.h>
|
||||||
|
|
||||||
|
@ -98,8 +97,7 @@ struct hdmi_context {
|
||||||
|
|
||||||
void __iomem *regs;
|
void __iomem *regs;
|
||||||
void *parent_ctx;
|
void *parent_ctx;
|
||||||
int external_irq;
|
int irq;
|
||||||
int internal_irq;
|
|
||||||
|
|
||||||
struct i2c_client *ddc_port;
|
struct i2c_client *ddc_port;
|
||||||
struct i2c_client *hdmiphy_port;
|
struct i2c_client *hdmiphy_port;
|
||||||
|
@ -1391,8 +1389,7 @@ static bool hdmi_is_connected(void *ctx)
|
||||||
return hdata->hpd;
|
return hdata->hpd;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int hdmi_get_edid(void *ctx, struct drm_connector *connector,
|
static struct edid *hdmi_get_edid(void *ctx, struct drm_connector *connector)
|
||||||
u8 *edid, int len)
|
|
||||||
{
|
{
|
||||||
struct edid *raw_edid;
|
struct edid *raw_edid;
|
||||||
struct hdmi_context *hdata = ctx;
|
struct hdmi_context *hdata = ctx;
|
||||||
|
@ -1400,22 +1397,18 @@ static int hdmi_get_edid(void *ctx, struct drm_connector *connector,
|
||||||
DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
|
DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
|
||||||
|
|
||||||
if (!hdata->ddc_port)
|
if (!hdata->ddc_port)
|
||||||
return -ENODEV;
|
return ERR_PTR(-ENODEV);
|
||||||
|
|
||||||
raw_edid = drm_get_edid(connector, hdata->ddc_port->adapter);
|
raw_edid = drm_get_edid(connector, hdata->ddc_port->adapter);
|
||||||
if (raw_edid) {
|
if (!raw_edid)
|
||||||
hdata->dvi_mode = !drm_detect_hdmi_monitor(raw_edid);
|
return ERR_PTR(-ENODEV);
|
||||||
memcpy(edid, raw_edid, min((1 + raw_edid->extensions)
|
|
||||||
* EDID_LENGTH, len));
|
|
||||||
DRM_DEBUG_KMS("%s : width[%d] x height[%d]\n",
|
|
||||||
(hdata->dvi_mode ? "dvi monitor" : "hdmi monitor"),
|
|
||||||
raw_edid->width_cm, raw_edid->height_cm);
|
|
||||||
kfree(raw_edid);
|
|
||||||
} else {
|
|
||||||
return -ENODEV;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
hdata->dvi_mode = !drm_detect_hdmi_monitor(raw_edid);
|
||||||
|
DRM_DEBUG_KMS("%s : width[%d] x height[%d]\n",
|
||||||
|
(hdata->dvi_mode ? "dvi monitor" : "hdmi monitor"),
|
||||||
|
raw_edid->width_cm, raw_edid->height_cm);
|
||||||
|
|
||||||
|
return raw_edid;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int hdmi_v13_check_timing(struct fb_videomode *check_timing)
|
static int hdmi_v13_check_timing(struct fb_videomode *check_timing)
|
||||||
|
@ -1652,16 +1645,16 @@ static void hdmi_conf_reset(struct hdmi_context *hdata)
|
||||||
|
|
||||||
/* resetting HDMI core */
|
/* resetting HDMI core */
|
||||||
hdmi_reg_writemask(hdata, reg, 0, HDMI_CORE_SW_RSTOUT);
|
hdmi_reg_writemask(hdata, reg, 0, HDMI_CORE_SW_RSTOUT);
|
||||||
mdelay(10);
|
usleep_range(10000, 12000);
|
||||||
hdmi_reg_writemask(hdata, reg, ~0, HDMI_CORE_SW_RSTOUT);
|
hdmi_reg_writemask(hdata, reg, ~0, HDMI_CORE_SW_RSTOUT);
|
||||||
mdelay(10);
|
usleep_range(10000, 12000);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void hdmi_conf_init(struct hdmi_context *hdata)
|
static void hdmi_conf_init(struct hdmi_context *hdata)
|
||||||
{
|
{
|
||||||
struct hdmi_infoframe infoframe;
|
struct hdmi_infoframe infoframe;
|
||||||
|
|
||||||
/* disable HPD interrupts */
|
/* disable HPD interrupts from HDMI IP block, use GPIO instead */
|
||||||
hdmi_reg_writemask(hdata, HDMI_INTC_CON, 0, HDMI_INTC_EN_GLOBAL |
|
hdmi_reg_writemask(hdata, HDMI_INTC_CON, 0, HDMI_INTC_EN_GLOBAL |
|
||||||
HDMI_INTC_EN_HPD_PLUG | HDMI_INTC_EN_HPD_UNPLUG);
|
HDMI_INTC_EN_HPD_PLUG | HDMI_INTC_EN_HPD_UNPLUG);
|
||||||
|
|
||||||
|
@ -1779,7 +1772,7 @@ static void hdmi_v13_timing_apply(struct hdmi_context *hdata)
|
||||||
u32 val = hdmi_reg_read(hdata, HDMI_V13_PHY_STATUS);
|
u32 val = hdmi_reg_read(hdata, HDMI_V13_PHY_STATUS);
|
||||||
if (val & HDMI_PHY_STATUS_READY)
|
if (val & HDMI_PHY_STATUS_READY)
|
||||||
break;
|
break;
|
||||||
mdelay(1);
|
usleep_range(1000, 2000);
|
||||||
}
|
}
|
||||||
/* steady state not achieved */
|
/* steady state not achieved */
|
||||||
if (tries == 0) {
|
if (tries == 0) {
|
||||||
|
@ -1946,7 +1939,7 @@ static void hdmi_v14_timing_apply(struct hdmi_context *hdata)
|
||||||
u32 val = hdmi_reg_read(hdata, HDMI_PHY_STATUS_0);
|
u32 val = hdmi_reg_read(hdata, HDMI_PHY_STATUS_0);
|
||||||
if (val & HDMI_PHY_STATUS_READY)
|
if (val & HDMI_PHY_STATUS_READY)
|
||||||
break;
|
break;
|
||||||
mdelay(1);
|
usleep_range(1000, 2000);
|
||||||
}
|
}
|
||||||
/* steady state not achieved */
|
/* steady state not achieved */
|
||||||
if (tries == 0) {
|
if (tries == 0) {
|
||||||
|
@ -1998,9 +1991,9 @@ static void hdmiphy_conf_reset(struct hdmi_context *hdata)
|
||||||
|
|
||||||
/* reset hdmiphy */
|
/* reset hdmiphy */
|
||||||
hdmi_reg_writemask(hdata, reg, ~0, HDMI_PHY_SW_RSTOUT);
|
hdmi_reg_writemask(hdata, reg, ~0, HDMI_PHY_SW_RSTOUT);
|
||||||
mdelay(10);
|
usleep_range(10000, 12000);
|
||||||
hdmi_reg_writemask(hdata, reg, 0, HDMI_PHY_SW_RSTOUT);
|
hdmi_reg_writemask(hdata, reg, 0, HDMI_PHY_SW_RSTOUT);
|
||||||
mdelay(10);
|
usleep_range(10000, 12000);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void hdmiphy_poweron(struct hdmi_context *hdata)
|
static void hdmiphy_poweron(struct hdmi_context *hdata)
|
||||||
|
@ -2048,7 +2041,7 @@ static void hdmiphy_conf_apply(struct hdmi_context *hdata)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
mdelay(10);
|
usleep_range(10000, 12000);
|
||||||
|
|
||||||
/* operation mode */
|
/* operation mode */
|
||||||
operation[0] = 0x1f;
|
operation[0] = 0x1f;
|
||||||
|
@ -2170,6 +2163,13 @@ static void hdmi_commit(void *ctx)
|
||||||
|
|
||||||
DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
|
DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
|
||||||
|
|
||||||
|
mutex_lock(&hdata->hdmi_mutex);
|
||||||
|
if (!hdata->powered) {
|
||||||
|
mutex_unlock(&hdata->hdmi_mutex);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mutex_unlock(&hdata->hdmi_mutex);
|
||||||
|
|
||||||
hdmi_conf_apply(hdata);
|
hdmi_conf_apply(hdata);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2265,7 +2265,7 @@ static struct exynos_hdmi_ops hdmi_ops = {
|
||||||
.dpms = hdmi_dpms,
|
.dpms = hdmi_dpms,
|
||||||
};
|
};
|
||||||
|
|
||||||
static irqreturn_t hdmi_external_irq_thread(int irq, void *arg)
|
static irqreturn_t hdmi_irq_thread(int irq, void *arg)
|
||||||
{
|
{
|
||||||
struct exynos_drm_hdmi_context *ctx = arg;
|
struct exynos_drm_hdmi_context *ctx = arg;
|
||||||
struct hdmi_context *hdata = ctx->ctx;
|
struct hdmi_context *hdata = ctx->ctx;
|
||||||
|
@ -2280,31 +2280,6 @@ static irqreturn_t hdmi_external_irq_thread(int irq, void *arg)
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
static irqreturn_t hdmi_internal_irq_thread(int irq, void *arg)
|
|
||||||
{
|
|
||||||
struct exynos_drm_hdmi_context *ctx = arg;
|
|
||||||
struct hdmi_context *hdata = ctx->ctx;
|
|
||||||
u32 intc_flag;
|
|
||||||
|
|
||||||
intc_flag = hdmi_reg_read(hdata, HDMI_INTC_FLAG);
|
|
||||||
/* clearing flags for HPD plug/unplug */
|
|
||||||
if (intc_flag & HDMI_INTC_FLAG_HPD_UNPLUG) {
|
|
||||||
DRM_DEBUG_KMS("unplugged\n");
|
|
||||||
hdmi_reg_writemask(hdata, HDMI_INTC_FLAG, ~0,
|
|
||||||
HDMI_INTC_FLAG_HPD_UNPLUG);
|
|
||||||
}
|
|
||||||
if (intc_flag & HDMI_INTC_FLAG_HPD_PLUG) {
|
|
||||||
DRM_DEBUG_KMS("plugged\n");
|
|
||||||
hdmi_reg_writemask(hdata, HDMI_INTC_FLAG, ~0,
|
|
||||||
HDMI_INTC_FLAG_HPD_PLUG);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ctx->drm_dev)
|
|
||||||
drm_helper_hpd_irq_event(ctx->drm_dev);
|
|
||||||
|
|
||||||
return IRQ_HANDLED;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int hdmi_resources_init(struct hdmi_context *hdata)
|
static int hdmi_resources_init(struct hdmi_context *hdata)
|
||||||
{
|
{
|
||||||
struct device *dev = hdata->dev;
|
struct device *dev = hdata->dev;
|
||||||
|
@ -2555,39 +2530,24 @@ static int hdmi_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
hdata->hdmiphy_port = hdmi_hdmiphy;
|
hdata->hdmiphy_port = hdmi_hdmiphy;
|
||||||
|
|
||||||
hdata->external_irq = gpio_to_irq(hdata->hpd_gpio);
|
hdata->irq = gpio_to_irq(hdata->hpd_gpio);
|
||||||
if (hdata->external_irq < 0) {
|
if (hdata->irq < 0) {
|
||||||
DRM_ERROR("failed to get GPIO external irq\n");
|
DRM_ERROR("failed to get GPIO irq\n");
|
||||||
ret = hdata->external_irq;
|
ret = hdata->irq;
|
||||||
goto err_hdmiphy;
|
|
||||||
}
|
|
||||||
|
|
||||||
hdata->internal_irq = platform_get_irq(pdev, 0);
|
|
||||||
if (hdata->internal_irq < 0) {
|
|
||||||
DRM_ERROR("failed to get platform internal irq\n");
|
|
||||||
ret = hdata->internal_irq;
|
|
||||||
goto err_hdmiphy;
|
goto err_hdmiphy;
|
||||||
}
|
}
|
||||||
|
|
||||||
hdata->hpd = gpio_get_value(hdata->hpd_gpio);
|
hdata->hpd = gpio_get_value(hdata->hpd_gpio);
|
||||||
|
|
||||||
ret = request_threaded_irq(hdata->external_irq, NULL,
|
ret = request_threaded_irq(hdata->irq, NULL,
|
||||||
hdmi_external_irq_thread, IRQF_TRIGGER_RISING |
|
hdmi_irq_thread, IRQF_TRIGGER_RISING |
|
||||||
IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
|
IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
|
||||||
"hdmi_external", drm_hdmi_ctx);
|
"hdmi", drm_hdmi_ctx);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
DRM_ERROR("failed to register hdmi external interrupt\n");
|
DRM_ERROR("failed to register hdmi interrupt\n");
|
||||||
goto err_hdmiphy;
|
goto err_hdmiphy;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = request_threaded_irq(hdata->internal_irq, NULL,
|
|
||||||
hdmi_internal_irq_thread, IRQF_ONESHOT,
|
|
||||||
"hdmi_internal", drm_hdmi_ctx);
|
|
||||||
if (ret) {
|
|
||||||
DRM_ERROR("failed to register hdmi internal interrupt\n");
|
|
||||||
goto err_free_irq;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Attach HDMI Driver to common hdmi. */
|
/* Attach HDMI Driver to common hdmi. */
|
||||||
exynos_hdmi_drv_attach(drm_hdmi_ctx);
|
exynos_hdmi_drv_attach(drm_hdmi_ctx);
|
||||||
|
|
||||||
|
@ -2598,8 +2558,6 @@ static int hdmi_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_free_irq:
|
|
||||||
free_irq(hdata->external_irq, drm_hdmi_ctx);
|
|
||||||
err_hdmiphy:
|
err_hdmiphy:
|
||||||
i2c_del_driver(&hdmiphy_driver);
|
i2c_del_driver(&hdmiphy_driver);
|
||||||
err_ddc:
|
err_ddc:
|
||||||
|
@ -2617,8 +2575,7 @@ static int hdmi_remove(struct platform_device *pdev)
|
||||||
|
|
||||||
pm_runtime_disable(dev);
|
pm_runtime_disable(dev);
|
||||||
|
|
||||||
free_irq(hdata->internal_irq, hdata);
|
free_irq(hdata->irq, hdata);
|
||||||
free_irq(hdata->external_irq, hdata);
|
|
||||||
|
|
||||||
|
|
||||||
/* hdmiphy i2c driver */
|
/* hdmiphy i2c driver */
|
||||||
|
@ -2637,8 +2594,7 @@ static int hdmi_suspend(struct device *dev)
|
||||||
|
|
||||||
DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
|
DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);
|
||||||
|
|
||||||
disable_irq(hdata->internal_irq);
|
disable_irq(hdata->irq);
|
||||||
disable_irq(hdata->external_irq);
|
|
||||||
|
|
||||||
hdata->hpd = false;
|
hdata->hpd = false;
|
||||||
if (ctx->drm_dev)
|
if (ctx->drm_dev)
|
||||||
|
@ -2663,8 +2619,7 @@ static int hdmi_resume(struct device *dev)
|
||||||
|
|
||||||
hdata->hpd = gpio_get_value(hdata->hpd_gpio);
|
hdata->hpd = gpio_get_value(hdata->hpd_gpio);
|
||||||
|
|
||||||
enable_irq(hdata->external_irq);
|
enable_irq(hdata->irq);
|
||||||
enable_irq(hdata->internal_irq);
|
|
||||||
|
|
||||||
if (!pm_runtime_suspended(dev)) {
|
if (!pm_runtime_suspended(dev)) {
|
||||||
DRM_DEBUG_KMS("%s : Already resumed\n", __func__);
|
DRM_DEBUG_KMS("%s : Already resumed\n", __func__);
|
||||||
|
|
|
@ -600,7 +600,7 @@ static void vp_win_reset(struct mixer_context *ctx)
|
||||||
/* waiting until VP_SRESET_PROCESSING is 0 */
|
/* waiting until VP_SRESET_PROCESSING is 0 */
|
||||||
if (~vp_reg_read(res, VP_SRESET) & VP_SRESET_PROCESSING)
|
if (~vp_reg_read(res, VP_SRESET) & VP_SRESET_PROCESSING)
|
||||||
break;
|
break;
|
||||||
mdelay(10);
|
usleep_range(10000, 12000);
|
||||||
}
|
}
|
||||||
WARN(tries == 0, "failed to reset Video Processor\n");
|
WARN(tries == 0, "failed to reset Video Processor\n");
|
||||||
}
|
}
|
||||||
|
@ -776,6 +776,13 @@ static void mixer_win_commit(void *ctx, int win)
|
||||||
|
|
||||||
DRM_DEBUG_KMS("[%d] %s, win: %d\n", __LINE__, __func__, win);
|
DRM_DEBUG_KMS("[%d] %s, win: %d\n", __LINE__, __func__, win);
|
||||||
|
|
||||||
|
mutex_lock(&mixer_ctx->mixer_mutex);
|
||||||
|
if (!mixer_ctx->powered) {
|
||||||
|
mutex_unlock(&mixer_ctx->mixer_mutex);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mutex_unlock(&mixer_ctx->mixer_mutex);
|
||||||
|
|
||||||
if (win > 1 && mixer_ctx->vp_enabled)
|
if (win > 1 && mixer_ctx->vp_enabled)
|
||||||
vp_video_buffer(mixer_ctx, win);
|
vp_video_buffer(mixer_ctx, win);
|
||||||
else
|
else
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#include <linux/debugfs.h>
|
#include <linux/debugfs.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/export.h>
|
#include <linux/export.h>
|
||||||
|
#include <generated/utsrelease.h>
|
||||||
#include <drm/drmP.h>
|
#include <drm/drmP.h>
|
||||||
#include "intel_drv.h"
|
#include "intel_drv.h"
|
||||||
#include "intel_ringbuffer.h"
|
#include "intel_ringbuffer.h"
|
||||||
|
@ -690,6 +691,7 @@ static int i915_error_state(struct seq_file *m, void *unused)
|
||||||
|
|
||||||
seq_printf(m, "Time: %ld s %ld us\n", error->time.tv_sec,
|
seq_printf(m, "Time: %ld s %ld us\n", error->time.tv_sec,
|
||||||
error->time.tv_usec);
|
error->time.tv_usec);
|
||||||
|
seq_printf(m, "Kernel: " UTS_RELEASE);
|
||||||
seq_printf(m, "PCI ID: 0x%04x\n", dev->pci_device);
|
seq_printf(m, "PCI ID: 0x%04x\n", dev->pci_device);
|
||||||
seq_printf(m, "EIR: 0x%08x\n", error->eir);
|
seq_printf(m, "EIR: 0x%08x\n", error->eir);
|
||||||
seq_printf(m, "IER: 0x%08x\n", error->ier);
|
seq_printf(m, "IER: 0x%08x\n", error->ier);
|
||||||
|
|
|
@ -533,6 +533,7 @@
|
||||||
#define MI_MODE 0x0209c
|
#define MI_MODE 0x0209c
|
||||||
# define VS_TIMER_DISPATCH (1 << 6)
|
# define VS_TIMER_DISPATCH (1 << 6)
|
||||||
# define MI_FLUSH_ENABLE (1 << 12)
|
# define MI_FLUSH_ENABLE (1 << 12)
|
||||||
|
# define ASYNC_FLIP_PERF_DISABLE (1 << 14)
|
||||||
|
|
||||||
#define GEN6_GT_MODE 0x20d0
|
#define GEN6_GT_MODE 0x20d0
|
||||||
#define GEN6_GT_MODE_HI (1 << 9)
|
#define GEN6_GT_MODE_HI (1 << 9)
|
||||||
|
|
|
@ -505,13 +505,25 @@ static int init_render_ring(struct intel_ring_buffer *ring)
|
||||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||||
int ret = init_ring_common(ring);
|
int ret = init_ring_common(ring);
|
||||||
|
|
||||||
if (INTEL_INFO(dev)->gen > 3) {
|
if (INTEL_INFO(dev)->gen > 3)
|
||||||
I915_WRITE(MI_MODE, _MASKED_BIT_ENABLE(VS_TIMER_DISPATCH));
|
I915_WRITE(MI_MODE, _MASKED_BIT_ENABLE(VS_TIMER_DISPATCH));
|
||||||
if (IS_GEN7(dev))
|
|
||||||
I915_WRITE(GFX_MODE_GEN7,
|
/* We need to disable the AsyncFlip performance optimisations in order
|
||||||
_MASKED_BIT_DISABLE(GFX_TLB_INVALIDATE_ALWAYS) |
|
* to use MI_WAIT_FOR_EVENT within the CS. It should already be
|
||||||
_MASKED_BIT_ENABLE(GFX_REPLAY_MODE));
|
* programmed to '1' on all products.
|
||||||
}
|
*/
|
||||||
|
if (INTEL_INFO(dev)->gen >= 6)
|
||||||
|
I915_WRITE(MI_MODE, _MASKED_BIT_ENABLE(ASYNC_FLIP_PERF_DISABLE));
|
||||||
|
|
||||||
|
/* Required for the hardware to program scanline values for waiting */
|
||||||
|
if (INTEL_INFO(dev)->gen == 6)
|
||||||
|
I915_WRITE(GFX_MODE,
|
||||||
|
_MASKED_BIT_ENABLE(GFX_TLB_INVALIDATE_ALWAYS));
|
||||||
|
|
||||||
|
if (IS_GEN7(dev))
|
||||||
|
I915_WRITE(GFX_MODE_GEN7,
|
||||||
|
_MASKED_BIT_DISABLE(GFX_TLB_INVALIDATE_ALWAYS) |
|
||||||
|
_MASKED_BIT_ENABLE(GFX_REPLAY_MODE));
|
||||||
|
|
||||||
if (INTEL_INFO(dev)->gen >= 5) {
|
if (INTEL_INFO(dev)->gen >= 5) {
|
||||||
ret = init_pipe_control(ring);
|
ret = init_pipe_control(ring);
|
||||||
|
|
|
@ -1216,7 +1216,7 @@ void cayman_dma_stop(struct radeon_device *rdev)
|
||||||
int cayman_dma_resume(struct radeon_device *rdev)
|
int cayman_dma_resume(struct radeon_device *rdev)
|
||||||
{
|
{
|
||||||
struct radeon_ring *ring;
|
struct radeon_ring *ring;
|
||||||
u32 rb_cntl, dma_cntl;
|
u32 rb_cntl, dma_cntl, ib_cntl;
|
||||||
u32 rb_bufsz;
|
u32 rb_bufsz;
|
||||||
u32 reg_offset, wb_offset;
|
u32 reg_offset, wb_offset;
|
||||||
int i, r;
|
int i, r;
|
||||||
|
@ -1265,7 +1265,11 @@ int cayman_dma_resume(struct radeon_device *rdev)
|
||||||
WREG32(DMA_RB_BASE + reg_offset, ring->gpu_addr >> 8);
|
WREG32(DMA_RB_BASE + reg_offset, ring->gpu_addr >> 8);
|
||||||
|
|
||||||
/* enable DMA IBs */
|
/* enable DMA IBs */
|
||||||
WREG32(DMA_IB_CNTL + reg_offset, DMA_IB_ENABLE | CMD_VMID_FORCE);
|
ib_cntl = DMA_IB_ENABLE | CMD_VMID_FORCE;
|
||||||
|
#ifdef __BIG_ENDIAN
|
||||||
|
ib_cntl |= DMA_IB_SWAP_ENABLE;
|
||||||
|
#endif
|
||||||
|
WREG32(DMA_IB_CNTL + reg_offset, ib_cntl);
|
||||||
|
|
||||||
dma_cntl = RREG32(DMA_CNTL + reg_offset);
|
dma_cntl = RREG32(DMA_CNTL + reg_offset);
|
||||||
dma_cntl &= ~CTXEMPTY_INT_ENABLE;
|
dma_cntl &= ~CTXEMPTY_INT_ENABLE;
|
||||||
|
|
|
@ -2313,7 +2313,7 @@ void r600_dma_stop(struct radeon_device *rdev)
|
||||||
int r600_dma_resume(struct radeon_device *rdev)
|
int r600_dma_resume(struct radeon_device *rdev)
|
||||||
{
|
{
|
||||||
struct radeon_ring *ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
|
struct radeon_ring *ring = &rdev->ring[R600_RING_TYPE_DMA_INDEX];
|
||||||
u32 rb_cntl, dma_cntl;
|
u32 rb_cntl, dma_cntl, ib_cntl;
|
||||||
u32 rb_bufsz;
|
u32 rb_bufsz;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
|
@ -2353,7 +2353,11 @@ int r600_dma_resume(struct radeon_device *rdev)
|
||||||
WREG32(DMA_RB_BASE, ring->gpu_addr >> 8);
|
WREG32(DMA_RB_BASE, ring->gpu_addr >> 8);
|
||||||
|
|
||||||
/* enable DMA IBs */
|
/* enable DMA IBs */
|
||||||
WREG32(DMA_IB_CNTL, DMA_IB_ENABLE);
|
ib_cntl = DMA_IB_ENABLE;
|
||||||
|
#ifdef __BIG_ENDIAN
|
||||||
|
ib_cntl |= DMA_IB_SWAP_ENABLE;
|
||||||
|
#endif
|
||||||
|
WREG32(DMA_IB_CNTL, ib_cntl);
|
||||||
|
|
||||||
dma_cntl = RREG32(DMA_CNTL);
|
dma_cntl = RREG32(DMA_CNTL);
|
||||||
dma_cntl &= ~CTXEMPTY_INT_ENABLE;
|
dma_cntl &= ~CTXEMPTY_INT_ENABLE;
|
||||||
|
|
|
@ -286,6 +286,8 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data)
|
||||||
p->chunks[p->chunk_ib_idx].kpage[1] == NULL) {
|
p->chunks[p->chunk_ib_idx].kpage[1] == NULL) {
|
||||||
kfree(p->chunks[p->chunk_ib_idx].kpage[0]);
|
kfree(p->chunks[p->chunk_ib_idx].kpage[0]);
|
||||||
kfree(p->chunks[p->chunk_ib_idx].kpage[1]);
|
kfree(p->chunks[p->chunk_ib_idx].kpage[1]);
|
||||||
|
p->chunks[p->chunk_ib_idx].kpage[0] = NULL;
|
||||||
|
p->chunks[p->chunk_ib_idx].kpage[1] = NULL;
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -241,7 +241,8 @@ int radeon_crtc_cursor_move(struct drm_crtc *crtc,
|
||||||
y = 0;
|
y = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ASIC_IS_AVIVO(rdev)) {
|
/* fixed on DCE6 and newer */
|
||||||
|
if (ASIC_IS_AVIVO(rdev) && !ASIC_IS_DCE6(rdev)) {
|
||||||
int i = 0;
|
int i = 0;
|
||||||
struct drm_crtc *crtc_p;
|
struct drm_crtc *crtc_p;
|
||||||
|
|
||||||
|
|
|
@ -429,7 +429,8 @@ bool radeon_card_posted(struct radeon_device *rdev)
|
||||||
{
|
{
|
||||||
uint32_t reg;
|
uint32_t reg;
|
||||||
|
|
||||||
if (efi_enabled && rdev->pdev->subsystem_vendor == PCI_VENDOR_ID_APPLE)
|
if (efi_enabled(EFI_BOOT) &&
|
||||||
|
rdev->pdev->subsystem_vendor == PCI_VENDOR_ID_APPLE)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
/* first check CRTCs */
|
/* first check CRTCs */
|
||||||
|
|
|
@ -1122,7 +1122,7 @@ radeon_user_framebuffer_create(struct drm_device *dev,
|
||||||
if (ret) {
|
if (ret) {
|
||||||
kfree(radeon_fb);
|
kfree(radeon_fb);
|
||||||
drm_gem_object_unreference_unlocked(obj);
|
drm_gem_object_unreference_unlocked(obj);
|
||||||
return NULL;
|
return ERR_PTR(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
return &radeon_fb->base;
|
return &radeon_fb->base;
|
||||||
|
|
|
@ -306,6 +306,9 @@
|
||||||
#define USB_VENDOR_ID_EZKEY 0x0518
|
#define USB_VENDOR_ID_EZKEY 0x0518
|
||||||
#define USB_DEVICE_ID_BTC_8193 0x0002
|
#define USB_DEVICE_ID_BTC_8193 0x0002
|
||||||
|
|
||||||
|
#define USB_VENDOR_ID_FORMOSA 0x147a
|
||||||
|
#define USB_DEVICE_ID_FORMOSA_IR_RECEIVER 0xe03e
|
||||||
|
|
||||||
#define USB_VENDOR_ID_FREESCALE 0x15A2
|
#define USB_VENDOR_ID_FREESCALE 0x15A2
|
||||||
#define USB_DEVICE_ID_FREESCALE_MX28 0x004F
|
#define USB_DEVICE_ID_FREESCALE_MX28 0x004F
|
||||||
|
|
||||||
|
|
|
@ -540,13 +540,24 @@ static int i2c_hid_output_raw_report(struct hid_device *hid, __u8 *buf,
|
||||||
{
|
{
|
||||||
struct i2c_client *client = hid->driver_data;
|
struct i2c_client *client = hid->driver_data;
|
||||||
int report_id = buf[0];
|
int report_id = buf[0];
|
||||||
|
int ret;
|
||||||
|
|
||||||
if (report_type == HID_INPUT_REPORT)
|
if (report_type == HID_INPUT_REPORT)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
return i2c_hid_set_report(client,
|
if (report_id) {
|
||||||
|
buf++;
|
||||||
|
count--;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = i2c_hid_set_report(client,
|
||||||
report_type == HID_FEATURE_REPORT ? 0x03 : 0x02,
|
report_type == HID_FEATURE_REPORT ? 0x03 : 0x02,
|
||||||
report_id, buf, count);
|
report_id, buf, count);
|
||||||
|
|
||||||
|
if (report_id && ret >= 0)
|
||||||
|
ret++; /* add report_id to the number of transfered bytes */
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int i2c_hid_parse(struct hid_device *hid)
|
static int i2c_hid_parse(struct hid_device *hid)
|
||||||
|
|
|
@ -70,6 +70,7 @@ static const struct hid_blacklist {
|
||||||
{ USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_AXIS_295, HID_QUIRK_NOGET },
|
{ USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_AXIS_295, HID_QUIRK_NOGET },
|
||||||
{ USB_VENDOR_ID_DMI, USB_DEVICE_ID_DMI_ENC, HID_QUIRK_NOGET },
|
{ USB_VENDOR_ID_DMI, USB_DEVICE_ID_DMI_ENC, HID_QUIRK_NOGET },
|
||||||
{ USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_TS2700, HID_QUIRK_NOGET },
|
{ USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_TS2700, HID_QUIRK_NOGET },
|
||||||
|
{ USB_VENDOR_ID_FORMOSA, USB_DEVICE_ID_FORMOSA_IR_RECEIVER, HID_QUIRK_NO_INIT_REPORTS },
|
||||||
{ USB_VENDOR_ID_FREESCALE, USB_DEVICE_ID_FREESCALE_MX28, HID_QUIRK_NOGET },
|
{ USB_VENDOR_ID_FREESCALE, USB_DEVICE_ID_FREESCALE_MX28, HID_QUIRK_NOGET },
|
||||||
{ USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS, HID_QUIRK_NOGET },
|
{ USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS, HID_QUIRK_NOGET },
|
||||||
{ USB_VENDOR_ID_NOVATEK, USB_DEVICE_ID_NOVATEK_MOUSE, HID_QUIRK_NO_INIT_REPORTS },
|
{ USB_VENDOR_ID_NOVATEK, USB_DEVICE_ID_NOVATEK_MOUSE, HID_QUIRK_NO_INIT_REPORTS },
|
||||||
|
|
|
@ -974,6 +974,38 @@ static void __init free_iommu_all(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Family15h Model 10h-1fh erratum 746 (IOMMU Logging May Stall Translations)
|
||||||
|
* Workaround:
|
||||||
|
* BIOS should disable L2B micellaneous clock gating by setting
|
||||||
|
* L2_L2B_CK_GATE_CONTROL[CKGateL2BMiscDisable](D0F2xF4_x90[2]) = 1b
|
||||||
|
*/
|
||||||
|
static void __init amd_iommu_erratum_746_workaround(struct amd_iommu *iommu)
|
||||||
|
{
|
||||||
|
u32 value;
|
||||||
|
|
||||||
|
if ((boot_cpu_data.x86 != 0x15) ||
|
||||||
|
(boot_cpu_data.x86_model < 0x10) ||
|
||||||
|
(boot_cpu_data.x86_model > 0x1f))
|
||||||
|
return;
|
||||||
|
|
||||||
|
pci_write_config_dword(iommu->dev, 0xf0, 0x90);
|
||||||
|
pci_read_config_dword(iommu->dev, 0xf4, &value);
|
||||||
|
|
||||||
|
if (value & BIT(2))
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Select NB indirect register 0x90 and enable writing */
|
||||||
|
pci_write_config_dword(iommu->dev, 0xf0, 0x90 | (1 << 8));
|
||||||
|
|
||||||
|
pci_write_config_dword(iommu->dev, 0xf4, value | 0x4);
|
||||||
|
pr_info("AMD-Vi: Applying erratum 746 workaround for IOMMU at %s\n",
|
||||||
|
dev_name(&iommu->dev->dev));
|
||||||
|
|
||||||
|
/* Clear the enable writing bit */
|
||||||
|
pci_write_config_dword(iommu->dev, 0xf0, 0x90);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This function clues the initialization function for one IOMMU
|
* This function clues the initialization function for one IOMMU
|
||||||
* together and also allocates the command buffer and programs the
|
* together and also allocates the command buffer and programs the
|
||||||
|
@ -1172,6 +1204,8 @@ static int iommu_init_pci(struct amd_iommu *iommu)
|
||||||
iommu->stored_l2[i] = iommu_read_l2(iommu, i);
|
iommu->stored_l2[i] = iommu_read_l2(iommu, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
amd_iommu_erratum_746_workaround(iommu);
|
||||||
|
|
||||||
return pci_enable_device(iommu->dev);
|
return pci_enable_device(iommu->dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4234,6 +4234,21 @@ static struct iommu_ops intel_iommu_ops = {
|
||||||
.pgsize_bitmap = INTEL_IOMMU_PGSIZES,
|
.pgsize_bitmap = INTEL_IOMMU_PGSIZES,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void quirk_iommu_g4x_gfx(struct pci_dev *dev)
|
||||||
|
{
|
||||||
|
/* G4x/GM45 integrated gfx dmar support is totally busted. */
|
||||||
|
printk(KERN_INFO "DMAR: Disabling IOMMU for graphics on this chipset\n");
|
||||||
|
dmar_map_gfx = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2a40, quirk_iommu_g4x_gfx);
|
||||||
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2e00, quirk_iommu_g4x_gfx);
|
||||||
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2e10, quirk_iommu_g4x_gfx);
|
||||||
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2e20, quirk_iommu_g4x_gfx);
|
||||||
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2e30, quirk_iommu_g4x_gfx);
|
||||||
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2e40, quirk_iommu_g4x_gfx);
|
||||||
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2e90, quirk_iommu_g4x_gfx);
|
||||||
|
|
||||||
static void quirk_iommu_rwbf(struct pci_dev *dev)
|
static void quirk_iommu_rwbf(struct pci_dev *dev)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
@ -4242,12 +4257,6 @@ static void quirk_iommu_rwbf(struct pci_dev *dev)
|
||||||
*/
|
*/
|
||||||
printk(KERN_INFO "DMAR: Forcing write-buffer flush capability\n");
|
printk(KERN_INFO "DMAR: Forcing write-buffer flush capability\n");
|
||||||
rwbf_quirk = 1;
|
rwbf_quirk = 1;
|
||||||
|
|
||||||
/* https://bugzilla.redhat.com/show_bug.cgi?id=538163 */
|
|
||||||
if (dev->revision == 0x07) {
|
|
||||||
printk(KERN_INFO "DMAR: Disabling IOMMU for graphics on this chipset\n");
|
|
||||||
dmar_map_gfx = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2a40, quirk_iommu_rwbf);
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2a40, quirk_iommu_rwbf);
|
||||||
|
|
|
@ -248,6 +248,8 @@ static inline void dump_rawmsg(enum debuglevel level, const char *tag,
|
||||||
CAPIMSG_APPID(data), CAPIMSG_MSGID(data), l,
|
CAPIMSG_APPID(data), CAPIMSG_MSGID(data), l,
|
||||||
CAPIMSG_CONTROL(data));
|
CAPIMSG_CONTROL(data));
|
||||||
l -= 12;
|
l -= 12;
|
||||||
|
if (l <= 0)
|
||||||
|
return;
|
||||||
dbgline = kmalloc(3 * l, GFP_ATOMIC);
|
dbgline = kmalloc(3 * l, GFP_ATOMIC);
|
||||||
if (!dbgline)
|
if (!dbgline)
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -340,24 +340,22 @@ static int validate_region_size(struct raid_set *rs, unsigned long region_size)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* validate_rebuild_devices
|
* validate_raid_redundancy
|
||||||
* @rs
|
* @rs
|
||||||
*
|
*
|
||||||
* Determine if the devices specified for rebuild can result in a valid
|
* Determine if there are enough devices in the array that haven't
|
||||||
* usable array that is capable of rebuilding the given devices.
|
* failed (or are being rebuilt) to form a usable array.
|
||||||
*
|
*
|
||||||
* Returns: 0 on success, -EINVAL on failure.
|
* Returns: 0 on success, -EINVAL on failure.
|
||||||
*/
|
*/
|
||||||
static int validate_rebuild_devices(struct raid_set *rs)
|
static int validate_raid_redundancy(struct raid_set *rs)
|
||||||
{
|
{
|
||||||
unsigned i, rebuild_cnt = 0;
|
unsigned i, rebuild_cnt = 0;
|
||||||
unsigned rebuilds_per_group, copies, d;
|
unsigned rebuilds_per_group, copies, d;
|
||||||
|
|
||||||
if (!(rs->print_flags & DMPF_REBUILD))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
for (i = 0; i < rs->md.raid_disks; i++)
|
for (i = 0; i < rs->md.raid_disks; i++)
|
||||||
if (!test_bit(In_sync, &rs->dev[i].rdev.flags))
|
if (!test_bit(In_sync, &rs->dev[i].rdev.flags) ||
|
||||||
|
!rs->dev[i].rdev.sb_page)
|
||||||
rebuild_cnt++;
|
rebuild_cnt++;
|
||||||
|
|
||||||
switch (rs->raid_type->level) {
|
switch (rs->raid_type->level) {
|
||||||
|
@ -393,27 +391,24 @@ static int validate_rebuild_devices(struct raid_set *rs)
|
||||||
* A A B B C
|
* A A B B C
|
||||||
* C D D E E
|
* C D D E E
|
||||||
*/
|
*/
|
||||||
rebuilds_per_group = 0;
|
|
||||||
for (i = 0; i < rs->md.raid_disks * copies; i++) {
|
for (i = 0; i < rs->md.raid_disks * copies; i++) {
|
||||||
|
if (!(i % copies))
|
||||||
|
rebuilds_per_group = 0;
|
||||||
d = i % rs->md.raid_disks;
|
d = i % rs->md.raid_disks;
|
||||||
if (!test_bit(In_sync, &rs->dev[d].rdev.flags) &&
|
if ((!rs->dev[d].rdev.sb_page ||
|
||||||
|
!test_bit(In_sync, &rs->dev[d].rdev.flags)) &&
|
||||||
(++rebuilds_per_group >= copies))
|
(++rebuilds_per_group >= copies))
|
||||||
goto too_many;
|
goto too_many;
|
||||||
if (!((i + 1) % copies))
|
|
||||||
rebuilds_per_group = 0;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
DMERR("The rebuild parameter is not supported for %s",
|
if (rebuild_cnt)
|
||||||
rs->raid_type->name);
|
return -EINVAL;
|
||||||
rs->ti->error = "Rebuild not supported for this RAID type";
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
too_many:
|
too_many:
|
||||||
rs->ti->error = "Too many rebuild devices specified";
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -664,9 +659,6 @@ static int parse_raid_params(struct raid_set *rs, char **argv,
|
||||||
}
|
}
|
||||||
rs->md.dev_sectors = sectors_per_dev;
|
rs->md.dev_sectors = sectors_per_dev;
|
||||||
|
|
||||||
if (validate_rebuild_devices(rs))
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
/* Assume there are no metadata devices until the drives are parsed */
|
/* Assume there are no metadata devices until the drives are parsed */
|
||||||
rs->md.persistent = 0;
|
rs->md.persistent = 0;
|
||||||
rs->md.external = 1;
|
rs->md.external = 1;
|
||||||
|
@ -995,28 +987,10 @@ static int super_validate(struct mddev *mddev, struct md_rdev *rdev)
|
||||||
static int analyse_superblocks(struct dm_target *ti, struct raid_set *rs)
|
static int analyse_superblocks(struct dm_target *ti, struct raid_set *rs)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
unsigned redundancy = 0;
|
|
||||||
struct raid_dev *dev;
|
struct raid_dev *dev;
|
||||||
struct md_rdev *rdev, *tmp, *freshest;
|
struct md_rdev *rdev, *tmp, *freshest;
|
||||||
struct mddev *mddev = &rs->md;
|
struct mddev *mddev = &rs->md;
|
||||||
|
|
||||||
switch (rs->raid_type->level) {
|
|
||||||
case 1:
|
|
||||||
redundancy = rs->md.raid_disks - 1;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
case 5:
|
|
||||||
case 6:
|
|
||||||
redundancy = rs->raid_type->parity_devs;
|
|
||||||
break;
|
|
||||||
case 10:
|
|
||||||
redundancy = raid10_md_layout_to_copies(mddev->layout) - 1;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ti->error = "Unknown RAID type";
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
freshest = NULL;
|
freshest = NULL;
|
||||||
rdev_for_each_safe(rdev, tmp, mddev) {
|
rdev_for_each_safe(rdev, tmp, mddev) {
|
||||||
/*
|
/*
|
||||||
|
@ -1045,44 +1019,43 @@ static int analyse_superblocks(struct dm_target *ti, struct raid_set *rs)
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
dev = container_of(rdev, struct raid_dev, rdev);
|
dev = container_of(rdev, struct raid_dev, rdev);
|
||||||
if (redundancy--) {
|
if (dev->meta_dev)
|
||||||
if (dev->meta_dev)
|
dm_put_device(ti, dev->meta_dev);
|
||||||
dm_put_device(ti, dev->meta_dev);
|
|
||||||
|
|
||||||
dev->meta_dev = NULL;
|
dev->meta_dev = NULL;
|
||||||
rdev->meta_bdev = NULL;
|
rdev->meta_bdev = NULL;
|
||||||
|
|
||||||
if (rdev->sb_page)
|
if (rdev->sb_page)
|
||||||
put_page(rdev->sb_page);
|
put_page(rdev->sb_page);
|
||||||
|
|
||||||
rdev->sb_page = NULL;
|
rdev->sb_page = NULL;
|
||||||
|
|
||||||
rdev->sb_loaded = 0;
|
rdev->sb_loaded = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We might be able to salvage the data device
|
* We might be able to salvage the data device
|
||||||
* even though the meta device has failed. For
|
* even though the meta device has failed. For
|
||||||
* now, we behave as though '- -' had been
|
* now, we behave as though '- -' had been
|
||||||
* set for this device in the table.
|
* set for this device in the table.
|
||||||
*/
|
*/
|
||||||
if (dev->data_dev)
|
if (dev->data_dev)
|
||||||
dm_put_device(ti, dev->data_dev);
|
dm_put_device(ti, dev->data_dev);
|
||||||
|
|
||||||
dev->data_dev = NULL;
|
dev->data_dev = NULL;
|
||||||
rdev->bdev = NULL;
|
rdev->bdev = NULL;
|
||||||
|
|
||||||
list_del(&rdev->same_set);
|
list_del(&rdev->same_set);
|
||||||
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
ti->error = "Failed to load superblock";
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!freshest)
|
if (!freshest)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if (validate_raid_redundancy(rs)) {
|
||||||
|
rs->ti->error = "Insufficient redundancy to activate array";
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Validation of the freshest device provides the source of
|
* Validation of the freshest device provides the source of
|
||||||
* validation for the remaining devices.
|
* validation for the remaining devices.
|
||||||
|
@ -1432,7 +1405,7 @@ static void raid_resume(struct dm_target *ti)
|
||||||
|
|
||||||
static struct target_type raid_target = {
|
static struct target_type raid_target = {
|
||||||
.name = "raid",
|
.name = "raid",
|
||||||
.version = {1, 4, 0},
|
.version = {1, 4, 1},
|
||||||
.module = THIS_MODULE,
|
.module = THIS_MODULE,
|
||||||
.ctr = raid_ctr,
|
.ctr = raid_ctr,
|
||||||
.dtr = raid_dtr,
|
.dtr = raid_dtr,
|
||||||
|
|
|
@ -2746,19 +2746,9 @@ static int thin_iterate_devices(struct dm_target *ti,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* A thin device always inherits its queue limits from its pool.
|
|
||||||
*/
|
|
||||||
static void thin_io_hints(struct dm_target *ti, struct queue_limits *limits)
|
|
||||||
{
|
|
||||||
struct thin_c *tc = ti->private;
|
|
||||||
|
|
||||||
*limits = bdev_get_queue(tc->pool_dev->bdev)->limits;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct target_type thin_target = {
|
static struct target_type thin_target = {
|
||||||
.name = "thin",
|
.name = "thin",
|
||||||
.version = {1, 6, 0},
|
.version = {1, 7, 0},
|
||||||
.module = THIS_MODULE,
|
.module = THIS_MODULE,
|
||||||
.ctr = thin_ctr,
|
.ctr = thin_ctr,
|
||||||
.dtr = thin_dtr,
|
.dtr = thin_dtr,
|
||||||
|
@ -2767,7 +2757,6 @@ static struct target_type thin_target = {
|
||||||
.postsuspend = thin_postsuspend,
|
.postsuspend = thin_postsuspend,
|
||||||
.status = thin_status,
|
.status = thin_status,
|
||||||
.iterate_devices = thin_iterate_devices,
|
.iterate_devices = thin_iterate_devices,
|
||||||
.io_hints = thin_io_hints,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/*----------------------------------------------------------------*/
|
/*----------------------------------------------------------------*/
|
||||||
|
|
|
@ -1188,6 +1188,7 @@ static int __clone_and_map_changing_extent_only(struct clone_info *ci,
|
||||||
{
|
{
|
||||||
struct dm_target *ti;
|
struct dm_target *ti;
|
||||||
sector_t len;
|
sector_t len;
|
||||||
|
unsigned num_requests;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
ti = dm_table_find_target(ci->map, ci->sector);
|
ti = dm_table_find_target(ci->map, ci->sector);
|
||||||
|
@ -1200,7 +1201,8 @@ static int __clone_and_map_changing_extent_only(struct clone_info *ci,
|
||||||
* reconfiguration might also have changed that since the
|
* reconfiguration might also have changed that since the
|
||||||
* check was performed.
|
* check was performed.
|
||||||
*/
|
*/
|
||||||
if (!get_num_requests || !get_num_requests(ti))
|
num_requests = get_num_requests ? get_num_requests(ti) : 0;
|
||||||
|
if (!num_requests)
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
if (is_split_required && !is_split_required(ti))
|
if (is_split_required && !is_split_required(ti))
|
||||||
|
@ -1208,7 +1210,7 @@ static int __clone_and_map_changing_extent_only(struct clone_info *ci,
|
||||||
else
|
else
|
||||||
len = min(ci->sector_count, max_io_len(ci->sector, ti));
|
len = min(ci->sector_count, max_io_len(ci->sector, ti));
|
||||||
|
|
||||||
__issue_target_requests(ci, ti, ti->num_discard_requests, len);
|
__issue_target_requests(ci, ti, num_requests, len);
|
||||||
|
|
||||||
ci->sector += len;
|
ci->sector += len;
|
||||||
} while (ci->sector_count -= len);
|
} while (ci->sector_count -= len);
|
||||||
|
|
|
@ -237,6 +237,7 @@ config MFD_TPS65910
|
||||||
depends on I2C=y && GPIOLIB
|
depends on I2C=y && GPIOLIB
|
||||||
select MFD_CORE
|
select MFD_CORE
|
||||||
select REGMAP_I2C
|
select REGMAP_I2C
|
||||||
|
select REGMAP_IRQ
|
||||||
select IRQ_DOMAIN
|
select IRQ_DOMAIN
|
||||||
help
|
help
|
||||||
if you say yes here you get support for the TPS65910 series of
|
if you say yes here you get support for the TPS65910 series of
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include <linux/mfd/core.h>
|
#include <linux/mfd/core.h>
|
||||||
#include <linux/mfd/abx500.h>
|
#include <linux/mfd/abx500.h>
|
||||||
#include <linux/mfd/abx500/ab8500.h>
|
#include <linux/mfd/abx500/ab8500.h>
|
||||||
|
#include <linux/mfd/abx500/ab8500-bm.h>
|
||||||
#include <linux/mfd/dbx500-prcmu.h>
|
#include <linux/mfd/dbx500-prcmu.h>
|
||||||
#include <linux/regulator/ab8500.h>
|
#include <linux/regulator/ab8500.h>
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
|
|
|
@ -239,7 +239,12 @@ static int arizona_runtime_resume(struct device *dev)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
regcache_sync(arizona->regmap);
|
ret = regcache_sync(arizona->regmap);
|
||||||
|
if (ret != 0) {
|
||||||
|
dev_err(arizona->dev, "Failed to restore register cache\n");
|
||||||
|
regulator_disable(arizona->dcvdd);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -176,14 +176,7 @@ int arizona_irq_init(struct arizona *arizona)
|
||||||
aod = &wm5102_aod;
|
aod = &wm5102_aod;
|
||||||
irq = &wm5102_irq;
|
irq = &wm5102_irq;
|
||||||
|
|
||||||
switch (arizona->rev) {
|
ctrlif_error = false;
|
||||||
case 0:
|
|
||||||
case 1:
|
|
||||||
ctrlif_error = false;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_MFD_WM5110
|
#ifdef CONFIG_MFD_WM5110
|
||||||
|
@ -191,14 +184,7 @@ int arizona_irq_init(struct arizona *arizona)
|
||||||
aod = &wm5110_aod;
|
aod = &wm5110_aod;
|
||||||
irq = &wm5110_irq;
|
irq = &wm5110_irq;
|
||||||
|
|
||||||
switch (arizona->rev) {
|
ctrlif_error = false;
|
||||||
case 0:
|
|
||||||
case 1:
|
|
||||||
ctrlif_error = false;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -27,6 +27,66 @@
|
||||||
#include <linux/of_device.h>
|
#include <linux/of_device.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* I2C safe register check */
|
||||||
|
static inline bool i2c_safe_reg(unsigned char reg)
|
||||||
|
{
|
||||||
|
switch (reg) {
|
||||||
|
case DA9052_STATUS_A_REG:
|
||||||
|
case DA9052_STATUS_B_REG:
|
||||||
|
case DA9052_STATUS_C_REG:
|
||||||
|
case DA9052_STATUS_D_REG:
|
||||||
|
case DA9052_ADC_RES_L_REG:
|
||||||
|
case DA9052_ADC_RES_H_REG:
|
||||||
|
case DA9052_VDD_RES_REG:
|
||||||
|
case DA9052_ICHG_AV_REG:
|
||||||
|
case DA9052_TBAT_RES_REG:
|
||||||
|
case DA9052_ADCIN4_RES_REG:
|
||||||
|
case DA9052_ADCIN5_RES_REG:
|
||||||
|
case DA9052_ADCIN6_RES_REG:
|
||||||
|
case DA9052_TJUNC_RES_REG:
|
||||||
|
case DA9052_TSI_X_MSB_REG:
|
||||||
|
case DA9052_TSI_Y_MSB_REG:
|
||||||
|
case DA9052_TSI_LSB_REG:
|
||||||
|
case DA9052_TSI_Z_MSB_REG:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* There is an issue with DA9052 and DA9053_AA/BA/BB PMIC where the PMIC
|
||||||
|
* gets lockup up or fails to respond following a system reset.
|
||||||
|
* This fix is to follow any read or write with a dummy read to a safe
|
||||||
|
* register.
|
||||||
|
*/
|
||||||
|
int da9052_i2c_fix(struct da9052 *da9052, unsigned char reg)
|
||||||
|
{
|
||||||
|
int val;
|
||||||
|
|
||||||
|
switch (da9052->chip_id) {
|
||||||
|
case DA9052:
|
||||||
|
case DA9053_AA:
|
||||||
|
case DA9053_BA:
|
||||||
|
case DA9053_BB:
|
||||||
|
/* A dummy read to a safe register address. */
|
||||||
|
if (!i2c_safe_reg(reg))
|
||||||
|
return regmap_read(da9052->regmap,
|
||||||
|
DA9052_PARK_REGISTER,
|
||||||
|
&val);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/*
|
||||||
|
* For other chips parking of I2C register
|
||||||
|
* to a safe place is not required.
|
||||||
|
*/
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(da9052_i2c_fix);
|
||||||
|
|
||||||
static int da9052_i2c_enable_multiwrite(struct da9052 *da9052)
|
static int da9052_i2c_enable_multiwrite(struct da9052 *da9052)
|
||||||
{
|
{
|
||||||
int reg_val, ret;
|
int reg_val, ret;
|
||||||
|
@ -83,6 +143,7 @@ static int da9052_i2c_probe(struct i2c_client *client,
|
||||||
|
|
||||||
da9052->dev = &client->dev;
|
da9052->dev = &client->dev;
|
||||||
da9052->chip_irq = client->irq;
|
da9052->chip_irq = client->irq;
|
||||||
|
da9052->fix_io = da9052_i2c_fix;
|
||||||
|
|
||||||
i2c_set_clientdata(client, da9052);
|
i2c_set_clientdata(client, da9052);
|
||||||
|
|
||||||
|
|
|
@ -2524,7 +2524,7 @@ static bool read_mailbox_0(void)
|
||||||
|
|
||||||
for (n = 0; n < NUM_PRCMU_WAKEUPS; n++) {
|
for (n = 0; n < NUM_PRCMU_WAKEUPS; n++) {
|
||||||
if (ev & prcmu_irq_bit[n])
|
if (ev & prcmu_irq_bit[n])
|
||||||
generic_handle_irq(IRQ_PRCMU_BASE + n);
|
generic_handle_irq(irq_find_mapping(db8500_irq_domain, n));
|
||||||
}
|
}
|
||||||
r = true;
|
r = true;
|
||||||
break;
|
break;
|
||||||
|
@ -2737,13 +2737,14 @@ static int db8500_irq_map(struct irq_domain *d, unsigned int virq,
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct irq_domain_ops db8500_irq_ops = {
|
static struct irq_domain_ops db8500_irq_ops = {
|
||||||
.map = db8500_irq_map,
|
.map = db8500_irq_map,
|
||||||
.xlate = irq_domain_xlate_twocell,
|
.xlate = irq_domain_xlate_twocell,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int db8500_irq_init(struct device_node *np)
|
static int db8500_irq_init(struct device_node *np)
|
||||||
{
|
{
|
||||||
int irq_base = -1;
|
int irq_base = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
/* In the device tree case, just take some IRQs */
|
/* In the device tree case, just take some IRQs */
|
||||||
if (!np)
|
if (!np)
|
||||||
|
@ -2758,6 +2759,10 @@ static int db8500_irq_init(struct device_node *np)
|
||||||
return -ENOSYS;
|
return -ENOSYS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* All wakeups will be used, so create mappings for all */
|
||||||
|
for (i = 0; i < NUM_PRCMU_WAKEUPS; i++)
|
||||||
|
irq_create_mapping(db8500_irq_domain, i);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -93,15 +93,6 @@ static int max77686_i2c_probe(struct i2c_client *i2c,
|
||||||
if (max77686 == NULL)
|
if (max77686 == NULL)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
max77686->regmap = regmap_init_i2c(i2c, &max77686_regmap_config);
|
|
||||||
if (IS_ERR(max77686->regmap)) {
|
|
||||||
ret = PTR_ERR(max77686->regmap);
|
|
||||||
dev_err(max77686->dev, "Failed to allocate register map: %d\n",
|
|
||||||
ret);
|
|
||||||
kfree(max77686);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
i2c_set_clientdata(i2c, max77686);
|
i2c_set_clientdata(i2c, max77686);
|
||||||
max77686->dev = &i2c->dev;
|
max77686->dev = &i2c->dev;
|
||||||
max77686->i2c = i2c;
|
max77686->i2c = i2c;
|
||||||
|
@ -111,6 +102,15 @@ static int max77686_i2c_probe(struct i2c_client *i2c,
|
||||||
max77686->irq_gpio = pdata->irq_gpio;
|
max77686->irq_gpio = pdata->irq_gpio;
|
||||||
max77686->irq = i2c->irq;
|
max77686->irq = i2c->irq;
|
||||||
|
|
||||||
|
max77686->regmap = regmap_init_i2c(i2c, &max77686_regmap_config);
|
||||||
|
if (IS_ERR(max77686->regmap)) {
|
||||||
|
ret = PTR_ERR(max77686->regmap);
|
||||||
|
dev_err(max77686->dev, "Failed to allocate register map: %d\n",
|
||||||
|
ret);
|
||||||
|
kfree(max77686);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
if (regmap_read(max77686->regmap,
|
if (regmap_read(max77686->regmap,
|
||||||
MAX77686_REG_DEVICE_ID, &data) < 0) {
|
MAX77686_REG_DEVICE_ID, &data) < 0) {
|
||||||
dev_err(max77686->dev,
|
dev_err(max77686->dev,
|
||||||
|
|
|
@ -114,35 +114,37 @@ static int max77693_i2c_probe(struct i2c_client *i2c,
|
||||||
u8 reg_data;
|
u8 reg_data;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
|
if (!pdata) {
|
||||||
|
dev_err(&i2c->dev, "No platform data found.\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
max77693 = devm_kzalloc(&i2c->dev,
|
max77693 = devm_kzalloc(&i2c->dev,
|
||||||
sizeof(struct max77693_dev), GFP_KERNEL);
|
sizeof(struct max77693_dev), GFP_KERNEL);
|
||||||
if (max77693 == NULL)
|
if (max77693 == NULL)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
max77693->regmap = devm_regmap_init_i2c(i2c, &max77693_regmap_config);
|
|
||||||
if (IS_ERR(max77693->regmap)) {
|
|
||||||
ret = PTR_ERR(max77693->regmap);
|
|
||||||
dev_err(max77693->dev,"failed to allocate register map: %d\n",
|
|
||||||
ret);
|
|
||||||
goto err_regmap;
|
|
||||||
}
|
|
||||||
|
|
||||||
i2c_set_clientdata(i2c, max77693);
|
i2c_set_clientdata(i2c, max77693);
|
||||||
max77693->dev = &i2c->dev;
|
max77693->dev = &i2c->dev;
|
||||||
max77693->i2c = i2c;
|
max77693->i2c = i2c;
|
||||||
max77693->irq = i2c->irq;
|
max77693->irq = i2c->irq;
|
||||||
max77693->type = id->driver_data;
|
max77693->type = id->driver_data;
|
||||||
|
|
||||||
if (!pdata)
|
max77693->regmap = devm_regmap_init_i2c(i2c, &max77693_regmap_config);
|
||||||
goto err_regmap;
|
if (IS_ERR(max77693->regmap)) {
|
||||||
|
ret = PTR_ERR(max77693->regmap);
|
||||||
|
dev_err(max77693->dev, "failed to allocate register map: %d\n",
|
||||||
|
ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
max77693->wakeup = pdata->wakeup;
|
max77693->wakeup = pdata->wakeup;
|
||||||
|
|
||||||
if (max77693_read_reg(max77693->regmap,
|
ret = max77693_read_reg(max77693->regmap, MAX77693_PMIC_REG_PMIC_ID2,
|
||||||
MAX77693_PMIC_REG_PMIC_ID2, ®_data) < 0) {
|
®_data);
|
||||||
|
if (ret < 0) {
|
||||||
dev_err(max77693->dev, "device not found on this channel\n");
|
dev_err(max77693->dev, "device not found on this channel\n");
|
||||||
ret = -ENODEV;
|
return ret;
|
||||||
goto err_regmap;
|
|
||||||
} else
|
} else
|
||||||
dev_info(max77693->dev, "device ID: 0x%x\n", reg_data);
|
dev_info(max77693->dev, "device ID: 0x%x\n", reg_data);
|
||||||
|
|
||||||
|
@ -163,7 +165,7 @@ static int max77693_i2c_probe(struct i2c_client *i2c,
|
||||||
ret = PTR_ERR(max77693->regmap_muic);
|
ret = PTR_ERR(max77693->regmap_muic);
|
||||||
dev_err(max77693->dev,
|
dev_err(max77693->dev,
|
||||||
"failed to allocate register map: %d\n", ret);
|
"failed to allocate register map: %d\n", ret);
|
||||||
goto err_regmap;
|
goto err_regmap_muic;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = max77693_irq_init(max77693);
|
ret = max77693_irq_init(max77693);
|
||||||
|
@ -184,9 +186,9 @@ static int max77693_i2c_probe(struct i2c_client *i2c,
|
||||||
err_mfd:
|
err_mfd:
|
||||||
max77693_irq_exit(max77693);
|
max77693_irq_exit(max77693);
|
||||||
err_irq:
|
err_irq:
|
||||||
|
err_regmap_muic:
|
||||||
i2c_unregister_device(max77693->muic);
|
i2c_unregister_device(max77693->muic);
|
||||||
i2c_unregister_device(max77693->haptic);
|
i2c_unregister_device(max77693->haptic);
|
||||||
err_regmap:
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -208,6 +208,8 @@ static int pcf50633_probe(struct i2c_client *client,
|
||||||
if (!pcf)
|
if (!pcf)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
i2c_set_clientdata(client, pcf);
|
||||||
|
pcf->dev = &client->dev;
|
||||||
pcf->pdata = pdata;
|
pcf->pdata = pdata;
|
||||||
|
|
||||||
mutex_init(&pcf->lock);
|
mutex_init(&pcf->lock);
|
||||||
|
@ -219,9 +221,6 @@ static int pcf50633_probe(struct i2c_client *client,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
i2c_set_clientdata(client, pcf);
|
|
||||||
pcf->dev = &client->dev;
|
|
||||||
|
|
||||||
version = pcf50633_reg_read(pcf, 0);
|
version = pcf50633_reg_read(pcf, 0);
|
||||||
variant = pcf50633_reg_read(pcf, 1);
|
variant = pcf50633_reg_read(pcf, 1);
|
||||||
if (version < 0 || variant < 0) {
|
if (version < 0 || variant < 0) {
|
||||||
|
|
|
@ -112,6 +112,21 @@ static int rtl8411_card_power_off(struct rtsx_pcr *pcr, int card)
|
||||||
BPP_LDO_POWB, BPP_LDO_SUSPEND);
|
BPP_LDO_POWB, BPP_LDO_SUSPEND);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int rtl8411_switch_output_voltage(struct rtsx_pcr *pcr, u8 voltage)
|
||||||
|
{
|
||||||
|
u8 mask, val;
|
||||||
|
|
||||||
|
mask = (BPP_REG_TUNED18 << BPP_TUNED18_SHIFT_8411) | BPP_PAD_MASK;
|
||||||
|
if (voltage == OUTPUT_3V3)
|
||||||
|
val = (BPP_ASIC_3V3 << BPP_TUNED18_SHIFT_8411) | BPP_PAD_3V3;
|
||||||
|
else if (voltage == OUTPUT_1V8)
|
||||||
|
val = (BPP_ASIC_1V8 << BPP_TUNED18_SHIFT_8411) | BPP_PAD_1V8;
|
||||||
|
else
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
return rtsx_pci_write_register(pcr, LDO_CTL, mask, val);
|
||||||
|
}
|
||||||
|
|
||||||
static unsigned int rtl8411_cd_deglitch(struct rtsx_pcr *pcr)
|
static unsigned int rtl8411_cd_deglitch(struct rtsx_pcr *pcr)
|
||||||
{
|
{
|
||||||
unsigned int card_exist;
|
unsigned int card_exist;
|
||||||
|
@ -163,6 +178,18 @@ static unsigned int rtl8411_cd_deglitch(struct rtsx_pcr *pcr)
|
||||||
return card_exist;
|
return card_exist;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int rtl8411_conv_clk_and_div_n(int input, int dir)
|
||||||
|
{
|
||||||
|
int output;
|
||||||
|
|
||||||
|
if (dir == CLK_TO_DIV_N)
|
||||||
|
output = input * 4 / 5 - 2;
|
||||||
|
else
|
||||||
|
output = (input + 2) * 5 / 4;
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
static const struct pcr_ops rtl8411_pcr_ops = {
|
static const struct pcr_ops rtl8411_pcr_ops = {
|
||||||
.extra_init_hw = rtl8411_extra_init_hw,
|
.extra_init_hw = rtl8411_extra_init_hw,
|
||||||
.optimize_phy = NULL,
|
.optimize_phy = NULL,
|
||||||
|
@ -172,7 +199,9 @@ static const struct pcr_ops rtl8411_pcr_ops = {
|
||||||
.disable_auto_blink = rtl8411_disable_auto_blink,
|
.disable_auto_blink = rtl8411_disable_auto_blink,
|
||||||
.card_power_on = rtl8411_card_power_on,
|
.card_power_on = rtl8411_card_power_on,
|
||||||
.card_power_off = rtl8411_card_power_off,
|
.card_power_off = rtl8411_card_power_off,
|
||||||
|
.switch_output_voltage = rtl8411_switch_output_voltage,
|
||||||
.cd_deglitch = rtl8411_cd_deglitch,
|
.cd_deglitch = rtl8411_cd_deglitch,
|
||||||
|
.conv_clk_and_div_n = rtl8411_conv_clk_and_div_n,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* SD Pull Control Enable:
|
/* SD Pull Control Enable:
|
||||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче