mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-15 04:46:45 +07:00
Merge branch 'x86/urgent' into x86/platform, to queue up dependent patch
Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
commit
fb86780bf7
@ -30,7 +30,7 @@ that they are defined using standard clock bindings with following
|
||||
clock-output-names:
|
||||
- "xin24m" - crystal input - required,
|
||||
- "ext_i2s" - external I2S clock - optional,
|
||||
- "ext_gmac" - external GMAC clock - optional
|
||||
- "rmii_clkin" - external EMAC clock - optional
|
||||
|
||||
Example: Clock controller node:
|
||||
|
||||
|
@ -24,9 +24,8 @@ Main node required properties:
|
||||
1 = edge triggered
|
||||
4 = level triggered
|
||||
|
||||
Cells 4 and beyond are reserved for future use. When the 1st cell
|
||||
has a value of 0 or 1, cells 4 and beyond act as padding, and may be
|
||||
ignored. It is recommended that padding cells have a value of 0.
|
||||
Cells 4 and beyond are reserved for future use and must have a value
|
||||
of 0 if present.
|
||||
|
||||
- reg : Specifies base physical address(s) and size of the GIC
|
||||
registers, in the following order:
|
||||
|
@ -14,6 +14,10 @@ Required properties:
|
||||
interrupt number is the rtc alarm interrupt and second interrupt number
|
||||
is the rtc tick interrupt. The number of cells representing a interrupt
|
||||
depends on the parent interrupt controller.
|
||||
- clocks: Must contain a list of phandle and clock specifier for the rtc
|
||||
and source clocks.
|
||||
- clock-names: Must contain "rtc" and "rtc_src" entries sorted in the
|
||||
same order as the clocks property.
|
||||
|
||||
Example:
|
||||
|
||||
@ -21,4 +25,6 @@ Example:
|
||||
compatible = "samsung,s3c6410-rtc";
|
||||
reg = <0x10070000 0x100>;
|
||||
interrupts = <44 0 45 0>;
|
||||
clocks = <&clock CLK_RTC>, <&s2mps11_osc S2MPS11_CLK_AP>;
|
||||
clock-names = "rtc", "rtc_src";
|
||||
};
|
||||
|
@ -9,7 +9,7 @@ Optional properties:
|
||||
- fsl,uart-has-rtscts : Indicate the uart has rts and cts
|
||||
- fsl,irda-mode : Indicate the uart supports irda mode
|
||||
- fsl,dte-mode : Indicate the uart works in DTE mode. The uart works
|
||||
is DCE mode by default.
|
||||
in DCE mode by default.
|
||||
|
||||
Note: Each uart controller should have an alias correctly numbered
|
||||
in "aliases" node.
|
||||
|
@ -14,3 +14,10 @@ filesystem.
|
||||
efivarfs is typically mounted like this,
|
||||
|
||||
mount -t efivarfs none /sys/firmware/efi/efivars
|
||||
|
||||
Due to the presence of numerous firmware bugs where removing non-standard
|
||||
UEFI variables causes the system firmware to fail to POST, efivarfs
|
||||
files that are not well-known standardized variables are created
|
||||
as immutable files. This doesn't prevent removal - "chattr -i" will work -
|
||||
but it does prevent this kind of failure from being accomplished
|
||||
accidentally.
|
||||
|
@ -1,9 +1,7 @@
|
||||
High Precision Event Timer Driver for Linux
|
||||
|
||||
The High Precision Event Timer (HPET) hardware follows a specification
|
||||
by Intel and Microsoft which can be found at
|
||||
|
||||
http://www.intel.com/hardwaredesign/hpetspec_1.pdf
|
||||
by Intel and Microsoft, revision 1.
|
||||
|
||||
Each HPET has one fixed-rate counter (at 10+ MHz, hence "High Precision")
|
||||
and up to 32 comparators. Normally three or more comparators are provided,
|
||||
|
@ -6128,7 +6128,7 @@ F: include/uapi/linux/sunrpc/
|
||||
|
||||
KERNEL SELFTEST FRAMEWORK
|
||||
M: Shuah Khan <shuahkh@osg.samsung.com>
|
||||
L: linux-api@vger.kernel.org
|
||||
L: linux-kselftest@vger.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/shuah/linux-kselftest
|
||||
S: Maintained
|
||||
F: tools/testing/selftests
|
||||
|
2
Makefile
2
Makefile
@ -1,7 +1,7 @@
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 5
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc4
|
||||
EXTRAVERSION = -rc5
|
||||
NAME = Blurry Fish Butt
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
@ -364,7 +364,7 @@ static struct crypto_alg aes_algs[] = { {
|
||||
.cra_blkcipher = {
|
||||
.min_keysize = AES_MIN_KEY_SIZE,
|
||||
.max_keysize = AES_MAX_KEY_SIZE,
|
||||
.ivsize = AES_BLOCK_SIZE,
|
||||
.ivsize = 0,
|
||||
.setkey = ce_aes_setkey,
|
||||
.encrypt = ecb_encrypt,
|
||||
.decrypt = ecb_decrypt,
|
||||
@ -441,7 +441,7 @@ static struct crypto_alg aes_algs[] = { {
|
||||
.cra_ablkcipher = {
|
||||
.min_keysize = AES_MIN_KEY_SIZE,
|
||||
.max_keysize = AES_MAX_KEY_SIZE,
|
||||
.ivsize = AES_BLOCK_SIZE,
|
||||
.ivsize = 0,
|
||||
.setkey = ablk_set_key,
|
||||
.encrypt = ablk_encrypt,
|
||||
.decrypt = ablk_decrypt,
|
||||
|
@ -88,7 +88,7 @@ Image: vmlinux
|
||||
Image.%: vmlinux
|
||||
$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
|
||||
|
||||
zinstall install: vmlinux
|
||||
zinstall install:
|
||||
$(Q)$(MAKE) $(build)=$(boot) $@
|
||||
|
||||
%.dtb: scripts
|
||||
|
@ -34,10 +34,10 @@ $(obj)/Image.lzma: $(obj)/Image FORCE
|
||||
$(obj)/Image.lzo: $(obj)/Image FORCE
|
||||
$(call if_changed,lzo)
|
||||
|
||||
install: $(obj)/Image
|
||||
install:
|
||||
$(CONFIG_SHELL) $(srctree)/$(src)/install.sh $(KERNELRELEASE) \
|
||||
$(obj)/Image System.map "$(INSTALL_PATH)"
|
||||
|
||||
zinstall: $(obj)/Image.gz
|
||||
zinstall:
|
||||
$(CONFIG_SHELL) $(srctree)/$(src)/install.sh $(KERNELRELEASE) \
|
||||
$(obj)/Image.gz System.map "$(INSTALL_PATH)"
|
||||
|
@ -20,6 +20,20 @@
|
||||
# $4 - default install path (blank if root directory)
|
||||
#
|
||||
|
||||
verify () {
|
||||
if [ ! -f "$1" ]; then
|
||||
echo "" 1>&2
|
||||
echo " *** Missing file: $1" 1>&2
|
||||
echo ' *** You need to run "make" before "make install".' 1>&2
|
||||
echo "" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Make sure the files actually exist
|
||||
verify "$2"
|
||||
verify "$3"
|
||||
|
||||
# User may have a custom install script
|
||||
if [ -x ~/bin/${INSTALLKERNEL} ]; then exec ~/bin/${INSTALLKERNEL} "$@"; fi
|
||||
if [ -x /sbin/${INSTALLKERNEL} ]; then exec /sbin/${INSTALLKERNEL} "$@"; fi
|
||||
|
@ -294,7 +294,7 @@ static struct crypto_alg aes_algs[] = { {
|
||||
.cra_blkcipher = {
|
||||
.min_keysize = AES_MIN_KEY_SIZE,
|
||||
.max_keysize = AES_MAX_KEY_SIZE,
|
||||
.ivsize = AES_BLOCK_SIZE,
|
||||
.ivsize = 0,
|
||||
.setkey = aes_setkey,
|
||||
.encrypt = ecb_encrypt,
|
||||
.decrypt = ecb_decrypt,
|
||||
@ -371,7 +371,7 @@ static struct crypto_alg aes_algs[] = { {
|
||||
.cra_ablkcipher = {
|
||||
.min_keysize = AES_MIN_KEY_SIZE,
|
||||
.max_keysize = AES_MAX_KEY_SIZE,
|
||||
.ivsize = AES_BLOCK_SIZE,
|
||||
.ivsize = 0,
|
||||
.setkey = ablk_set_key,
|
||||
.encrypt = ablk_encrypt,
|
||||
.decrypt = ablk_decrypt,
|
||||
|
@ -107,8 +107,6 @@
|
||||
#define TCR_EL2_MASK (TCR_EL2_TG0 | TCR_EL2_SH0 | \
|
||||
TCR_EL2_ORGN0 | TCR_EL2_IRGN0 | TCR_EL2_T0SZ)
|
||||
|
||||
#define TCR_EL2_FLAGS (TCR_EL2_RES1 | TCR_EL2_PS_40B)
|
||||
|
||||
/* VTCR_EL2 Registers bits */
|
||||
#define VTCR_EL2_RES1 (1 << 31)
|
||||
#define VTCR_EL2_PS_MASK (7 << 16)
|
||||
|
@ -226,11 +226,28 @@ static int call_step_hook(struct pt_regs *regs, unsigned int esr)
|
||||
return retval;
|
||||
}
|
||||
|
||||
static void send_user_sigtrap(int si_code)
|
||||
{
|
||||
struct pt_regs *regs = current_pt_regs();
|
||||
siginfo_t info = {
|
||||
.si_signo = SIGTRAP,
|
||||
.si_errno = 0,
|
||||
.si_code = si_code,
|
||||
.si_addr = (void __user *)instruction_pointer(regs),
|
||||
};
|
||||
|
||||
if (WARN_ON(!user_mode(regs)))
|
||||
return;
|
||||
|
||||
if (interrupts_enabled(regs))
|
||||
local_irq_enable();
|
||||
|
||||
force_sig_info(SIGTRAP, &info, current);
|
||||
}
|
||||
|
||||
static int single_step_handler(unsigned long addr, unsigned int esr,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
siginfo_t info;
|
||||
|
||||
/*
|
||||
* If we are stepping a pending breakpoint, call the hw_breakpoint
|
||||
* handler first.
|
||||
@ -239,11 +256,7 @@ static int single_step_handler(unsigned long addr, unsigned int esr,
|
||||
return 0;
|
||||
|
||||
if (user_mode(regs)) {
|
||||
info.si_signo = SIGTRAP;
|
||||
info.si_errno = 0;
|
||||
info.si_code = TRAP_HWBKPT;
|
||||
info.si_addr = (void __user *)instruction_pointer(regs);
|
||||
force_sig_info(SIGTRAP, &info, current);
|
||||
send_user_sigtrap(TRAP_HWBKPT);
|
||||
|
||||
/*
|
||||
* ptrace will disable single step unless explicitly
|
||||
@ -307,17 +320,8 @@ static int call_break_hook(struct pt_regs *regs, unsigned int esr)
|
||||
static int brk_handler(unsigned long addr, unsigned int esr,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
siginfo_t info;
|
||||
|
||||
if (user_mode(regs)) {
|
||||
info = (siginfo_t) {
|
||||
.si_signo = SIGTRAP,
|
||||
.si_errno = 0,
|
||||
.si_code = TRAP_BRKPT,
|
||||
.si_addr = (void __user *)instruction_pointer(regs),
|
||||
};
|
||||
|
||||
force_sig_info(SIGTRAP, &info, current);
|
||||
send_user_sigtrap(TRAP_BRKPT);
|
||||
} else if (call_break_hook(regs, esr) != DBG_HOOK_HANDLED) {
|
||||
pr_warning("Unexpected kernel BRK exception at EL1\n");
|
||||
return -EFAULT;
|
||||
@ -328,7 +332,6 @@ static int brk_handler(unsigned long addr, unsigned int esr,
|
||||
|
||||
int aarch32_break_handler(struct pt_regs *regs)
|
||||
{
|
||||
siginfo_t info;
|
||||
u32 arm_instr;
|
||||
u16 thumb_instr;
|
||||
bool bp = false;
|
||||
@ -359,14 +362,7 @@ int aarch32_break_handler(struct pt_regs *regs)
|
||||
if (!bp)
|
||||
return -EFAULT;
|
||||
|
||||
info = (siginfo_t) {
|
||||
.si_signo = SIGTRAP,
|
||||
.si_errno = 0,
|
||||
.si_code = TRAP_BRKPT,
|
||||
.si_addr = pc,
|
||||
};
|
||||
|
||||
force_sig_info(SIGTRAP, &info, current);
|
||||
send_user_sigtrap(TRAP_BRKPT);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -89,6 +89,7 @@ __efistub_memcpy = KALLSYMS_HIDE(__pi_memcpy);
|
||||
__efistub_memmove = KALLSYMS_HIDE(__pi_memmove);
|
||||
__efistub_memset = KALLSYMS_HIDE(__pi_memset);
|
||||
__efistub_strlen = KALLSYMS_HIDE(__pi_strlen);
|
||||
__efistub_strnlen = KALLSYMS_HIDE(__pi_strnlen);
|
||||
__efistub_strcmp = KALLSYMS_HIDE(__pi_strcmp);
|
||||
__efistub_strncmp = KALLSYMS_HIDE(__pi_strncmp);
|
||||
__efistub___flush_dcache_area = KALLSYMS_HIDE(__pi___flush_dcache_area);
|
||||
|
@ -44,14 +44,13 @@ int notrace unwind_frame(struct task_struct *tsk, struct stackframe *frame)
|
||||
unsigned long irq_stack_ptr;
|
||||
|
||||
/*
|
||||
* Use raw_smp_processor_id() to avoid false-positives from
|
||||
* CONFIG_DEBUG_PREEMPT. get_wchan() calls unwind_frame() on sleeping
|
||||
* task stacks, we can be pre-empted in this case, so
|
||||
* {raw_,}smp_processor_id() may give us the wrong value. Sleeping
|
||||
* tasks can't ever be on an interrupt stack, so regardless of cpu,
|
||||
* the checks will always fail.
|
||||
* Switching between stacks is valid when tracing current and in
|
||||
* non-preemptible context.
|
||||
*/
|
||||
irq_stack_ptr = IRQ_STACK_PTR(raw_smp_processor_id());
|
||||
if (tsk == current && !preemptible())
|
||||
irq_stack_ptr = IRQ_STACK_PTR(smp_processor_id());
|
||||
else
|
||||
irq_stack_ptr = 0;
|
||||
|
||||
low = frame->sp;
|
||||
/* irq stacks are not THREAD_SIZE aligned */
|
||||
@ -64,8 +63,8 @@ int notrace unwind_frame(struct task_struct *tsk, struct stackframe *frame)
|
||||
return -EINVAL;
|
||||
|
||||
frame->sp = fp + 0x10;
|
||||
frame->fp = *(unsigned long *)(fp);
|
||||
frame->pc = *(unsigned long *)(fp + 8);
|
||||
frame->fp = READ_ONCE_NOCHECK(*(unsigned long *)(fp));
|
||||
frame->pc = READ_ONCE_NOCHECK(*(unsigned long *)(fp + 8));
|
||||
|
||||
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
||||
if (tsk && tsk->ret_stack &&
|
||||
|
@ -146,9 +146,18 @@ static void dump_instr(const char *lvl, struct pt_regs *regs)
|
||||
static void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk)
|
||||
{
|
||||
struct stackframe frame;
|
||||
unsigned long irq_stack_ptr = IRQ_STACK_PTR(smp_processor_id());
|
||||
unsigned long irq_stack_ptr;
|
||||
int skip;
|
||||
|
||||
/*
|
||||
* Switching between stacks is valid when tracing current and in
|
||||
* non-preemptible context.
|
||||
*/
|
||||
if (tsk == current && !preemptible())
|
||||
irq_stack_ptr = IRQ_STACK_PTR(smp_processor_id());
|
||||
else
|
||||
irq_stack_ptr = 0;
|
||||
|
||||
pr_debug("%s(regs = %p tsk = %p)\n", __func__, regs, tsk);
|
||||
|
||||
if (!tsk)
|
||||
|
@ -64,7 +64,7 @@ __do_hyp_init:
|
||||
mrs x4, tcr_el1
|
||||
ldr x5, =TCR_EL2_MASK
|
||||
and x4, x4, x5
|
||||
ldr x5, =TCR_EL2_FLAGS
|
||||
mov x5, #TCR_EL2_RES1
|
||||
orr x4, x4, x5
|
||||
|
||||
#ifndef CONFIG_ARM64_VA_BITS_48
|
||||
@ -85,14 +85,16 @@ __do_hyp_init:
|
||||
ldr_l x5, idmap_t0sz
|
||||
bfi x4, x5, TCR_T0SZ_OFFSET, TCR_TxSZ_WIDTH
|
||||
#endif
|
||||
/*
|
||||
* Read the PARange bits from ID_AA64MMFR0_EL1 and set the PS bits in
|
||||
* TCR_EL2 and VTCR_EL2.
|
||||
*/
|
||||
mrs x5, ID_AA64MMFR0_EL1
|
||||
bfi x4, x5, #16, #3
|
||||
|
||||
msr tcr_el2, x4
|
||||
|
||||
ldr x4, =VTCR_EL2_FLAGS
|
||||
/*
|
||||
* Read the PARange bits from ID_AA64MMFR0_EL1 and set the PS bits in
|
||||
* VTCR_EL2.
|
||||
*/
|
||||
mrs x5, ID_AA64MMFR0_EL1
|
||||
bfi x4, x5, #16, #3
|
||||
/*
|
||||
* Read the VMIDBits bits from ID_AA64MMFR1_EL1 and set the VS bit in
|
||||
|
@ -168,4 +168,4 @@ CPU_LE( lsr tmp2, tmp2, tmp4 ) /* Shift (tmp1 & 63). */
|
||||
.Lhit_limit:
|
||||
mov len, limit
|
||||
ret
|
||||
ENDPROC(strnlen)
|
||||
ENDPIPROC(strnlen)
|
||||
|
@ -933,6 +933,10 @@ static int __init __iommu_dma_init(void)
|
||||
ret = register_iommu_dma_ops_notifier(&platform_bus_type);
|
||||
if (!ret)
|
||||
ret = register_iommu_dma_ops_notifier(&amba_bustype);
|
||||
|
||||
/* handle devices queued before this arch_initcall */
|
||||
if (!ret)
|
||||
__iommu_attach_notifier(NULL, BUS_NOTIFY_ADD_DEVICE, NULL);
|
||||
return ret;
|
||||
}
|
||||
arch_initcall(__iommu_dma_init);
|
||||
|
@ -371,6 +371,13 @@ static int __kprobes do_translation_fault(unsigned long addr,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int do_alignment_fault(unsigned long addr, unsigned int esr,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
do_bad_area(addr, esr, regs);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* This abort handler always returns "fault".
|
||||
*/
|
||||
@ -418,7 +425,7 @@ static struct fault_info {
|
||||
{ do_bad, SIGBUS, 0, "synchronous parity error (translation table walk)" },
|
||||
{ do_bad, SIGBUS, 0, "synchronous parity error (translation table walk)" },
|
||||
{ do_bad, SIGBUS, 0, "unknown 32" },
|
||||
{ do_bad, SIGBUS, BUS_ADRALN, "alignment fault" },
|
||||
{ do_alignment_fault, SIGBUS, BUS_ADRALN, "alignment fault" },
|
||||
{ do_bad, SIGBUS, 0, "unknown 34" },
|
||||
{ do_bad, SIGBUS, 0, "unknown 35" },
|
||||
{ do_bad, SIGBUS, 0, "unknown 36" },
|
||||
|
@ -108,6 +108,8 @@ CONFIG_NFT_NAT=m
|
||||
CONFIG_NFT_QUEUE=m
|
||||
CONFIG_NFT_REJECT=m
|
||||
CONFIG_NFT_COMPAT=m
|
||||
CONFIG_NFT_DUP_NETDEV=m
|
||||
CONFIG_NFT_FWD_NETDEV=m
|
||||
CONFIG_NETFILTER_XT_SET=m
|
||||
CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m
|
||||
CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
|
||||
@ -266,6 +268,12 @@ CONFIG_L2TP=m
|
||||
CONFIG_BRIDGE=m
|
||||
CONFIG_ATALK=m
|
||||
CONFIG_6LOWPAN=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_HOP=m
|
||||
CONFIG_6LOWPAN_GHC_UDP=m
|
||||
CONFIG_6LOWPAN_GHC_ICMPV6=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_DEST=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_FRAG=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_ROUTE=m
|
||||
CONFIG_DNS_RESOLVER=y
|
||||
CONFIG_BATMAN_ADV=m
|
||||
CONFIG_BATMAN_ADV_DAT=y
|
||||
@ -366,6 +374,7 @@ CONFIG_ARIADNE=y
|
||||
# CONFIG_NET_VENDOR_INTEL is not set
|
||||
# CONFIG_NET_VENDOR_MARVELL is not set
|
||||
# CONFIG_NET_VENDOR_MICREL is not set
|
||||
# CONFIG_NET_VENDOR_NETRONOME is not set
|
||||
CONFIG_HYDRA=y
|
||||
CONFIG_APNE=y
|
||||
CONFIG_ZORRO8390=y
|
||||
|
@ -106,6 +106,8 @@ CONFIG_NFT_NAT=m
|
||||
CONFIG_NFT_QUEUE=m
|
||||
CONFIG_NFT_REJECT=m
|
||||
CONFIG_NFT_COMPAT=m
|
||||
CONFIG_NFT_DUP_NETDEV=m
|
||||
CONFIG_NFT_FWD_NETDEV=m
|
||||
CONFIG_NETFILTER_XT_SET=m
|
||||
CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m
|
||||
CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
|
||||
@ -264,6 +266,12 @@ CONFIG_L2TP=m
|
||||
CONFIG_BRIDGE=m
|
||||
CONFIG_ATALK=m
|
||||
CONFIG_6LOWPAN=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_HOP=m
|
||||
CONFIG_6LOWPAN_GHC_UDP=m
|
||||
CONFIG_6LOWPAN_GHC_ICMPV6=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_DEST=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_FRAG=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_ROUTE=m
|
||||
CONFIG_DNS_RESOLVER=y
|
||||
CONFIG_BATMAN_ADV=m
|
||||
CONFIG_BATMAN_ADV_DAT=y
|
||||
@ -344,6 +352,7 @@ CONFIG_VETH=m
|
||||
# CONFIG_NET_VENDOR_MARVELL is not set
|
||||
# CONFIG_NET_VENDOR_MICREL is not set
|
||||
# CONFIG_NET_VENDOR_NATSEMI is not set
|
||||
# CONFIG_NET_VENDOR_NETRONOME is not set
|
||||
# CONFIG_NET_VENDOR_QUALCOMM is not set
|
||||
# CONFIG_NET_VENDOR_RENESAS is not set
|
||||
# CONFIG_NET_VENDOR_ROCKER is not set
|
||||
|
@ -106,6 +106,8 @@ CONFIG_NFT_NAT=m
|
||||
CONFIG_NFT_QUEUE=m
|
||||
CONFIG_NFT_REJECT=m
|
||||
CONFIG_NFT_COMPAT=m
|
||||
CONFIG_NFT_DUP_NETDEV=m
|
||||
CONFIG_NFT_FWD_NETDEV=m
|
||||
CONFIG_NETFILTER_XT_SET=m
|
||||
CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m
|
||||
CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
|
||||
@ -264,6 +266,12 @@ CONFIG_L2TP=m
|
||||
CONFIG_BRIDGE=m
|
||||
CONFIG_ATALK=m
|
||||
CONFIG_6LOWPAN=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_HOP=m
|
||||
CONFIG_6LOWPAN_GHC_UDP=m
|
||||
CONFIG_6LOWPAN_GHC_ICMPV6=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_DEST=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_FRAG=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_ROUTE=m
|
||||
CONFIG_DNS_RESOLVER=y
|
||||
CONFIG_BATMAN_ADV=m
|
||||
CONFIG_BATMAN_ADV_DAT=y
|
||||
@ -353,6 +361,7 @@ CONFIG_ATARILANCE=y
|
||||
# CONFIG_NET_VENDOR_INTEL is not set
|
||||
# CONFIG_NET_VENDOR_MARVELL is not set
|
||||
# CONFIG_NET_VENDOR_MICREL is not set
|
||||
# CONFIG_NET_VENDOR_NETRONOME is not set
|
||||
CONFIG_NE2000=y
|
||||
# CONFIG_NET_VENDOR_QUALCOMM is not set
|
||||
# CONFIG_NET_VENDOR_RENESAS is not set
|
||||
|
@ -104,6 +104,8 @@ CONFIG_NFT_NAT=m
|
||||
CONFIG_NFT_QUEUE=m
|
||||
CONFIG_NFT_REJECT=m
|
||||
CONFIG_NFT_COMPAT=m
|
||||
CONFIG_NFT_DUP_NETDEV=m
|
||||
CONFIG_NFT_FWD_NETDEV=m
|
||||
CONFIG_NETFILTER_XT_SET=m
|
||||
CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m
|
||||
CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
|
||||
@ -262,6 +264,12 @@ CONFIG_L2TP=m
|
||||
CONFIG_BRIDGE=m
|
||||
CONFIG_ATALK=m
|
||||
CONFIG_6LOWPAN=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_HOP=m
|
||||
CONFIG_6LOWPAN_GHC_UDP=m
|
||||
CONFIG_6LOWPAN_GHC_ICMPV6=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_DEST=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_FRAG=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_ROUTE=m
|
||||
CONFIG_DNS_RESOLVER=y
|
||||
CONFIG_BATMAN_ADV=m
|
||||
CONFIG_BATMAN_ADV_DAT=y
|
||||
@ -343,6 +351,7 @@ CONFIG_BVME6000_NET=y
|
||||
# CONFIG_NET_VENDOR_MARVELL is not set
|
||||
# CONFIG_NET_VENDOR_MICREL is not set
|
||||
# CONFIG_NET_VENDOR_NATSEMI is not set
|
||||
# CONFIG_NET_VENDOR_NETRONOME is not set
|
||||
# CONFIG_NET_VENDOR_QUALCOMM is not set
|
||||
# CONFIG_NET_VENDOR_RENESAS is not set
|
||||
# CONFIG_NET_VENDOR_ROCKER is not set
|
||||
|
@ -106,6 +106,8 @@ CONFIG_NFT_NAT=m
|
||||
CONFIG_NFT_QUEUE=m
|
||||
CONFIG_NFT_REJECT=m
|
||||
CONFIG_NFT_COMPAT=m
|
||||
CONFIG_NFT_DUP_NETDEV=m
|
||||
CONFIG_NFT_FWD_NETDEV=m
|
||||
CONFIG_NETFILTER_XT_SET=m
|
||||
CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m
|
||||
CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
|
||||
@ -264,6 +266,12 @@ CONFIG_L2TP=m
|
||||
CONFIG_BRIDGE=m
|
||||
CONFIG_ATALK=m
|
||||
CONFIG_6LOWPAN=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_HOP=m
|
||||
CONFIG_6LOWPAN_GHC_UDP=m
|
||||
CONFIG_6LOWPAN_GHC_ICMPV6=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_DEST=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_FRAG=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_ROUTE=m
|
||||
CONFIG_DNS_RESOLVER=y
|
||||
CONFIG_BATMAN_ADV=m
|
||||
CONFIG_BATMAN_ADV_DAT=y
|
||||
@ -345,6 +353,7 @@ CONFIG_HPLANCE=y
|
||||
# CONFIG_NET_VENDOR_MARVELL is not set
|
||||
# CONFIG_NET_VENDOR_MICREL is not set
|
||||
# CONFIG_NET_VENDOR_NATSEMI is not set
|
||||
# CONFIG_NET_VENDOR_NETRONOME is not set
|
||||
# CONFIG_NET_VENDOR_QUALCOMM is not set
|
||||
# CONFIG_NET_VENDOR_RENESAS is not set
|
||||
# CONFIG_NET_VENDOR_ROCKER is not set
|
||||
|
@ -105,6 +105,8 @@ CONFIG_NFT_NAT=m
|
||||
CONFIG_NFT_QUEUE=m
|
||||
CONFIG_NFT_REJECT=m
|
||||
CONFIG_NFT_COMPAT=m
|
||||
CONFIG_NFT_DUP_NETDEV=m
|
||||
CONFIG_NFT_FWD_NETDEV=m
|
||||
CONFIG_NETFILTER_XT_SET=m
|
||||
CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m
|
||||
CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
|
||||
@ -266,6 +268,12 @@ CONFIG_DEV_APPLETALK=m
|
||||
CONFIG_IPDDP=m
|
||||
CONFIG_IPDDP_ENCAP=y
|
||||
CONFIG_6LOWPAN=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_HOP=m
|
||||
CONFIG_6LOWPAN_GHC_UDP=m
|
||||
CONFIG_6LOWPAN_GHC_ICMPV6=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_DEST=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_FRAG=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_ROUTE=m
|
||||
CONFIG_DNS_RESOLVER=y
|
||||
CONFIG_BATMAN_ADV=m
|
||||
CONFIG_BATMAN_ADV_DAT=y
|
||||
@ -362,6 +370,7 @@ CONFIG_MAC89x0=y
|
||||
# CONFIG_NET_VENDOR_MARVELL is not set
|
||||
# CONFIG_NET_VENDOR_MICREL is not set
|
||||
CONFIG_MACSONIC=y
|
||||
# CONFIG_NET_VENDOR_NETRONOME is not set
|
||||
CONFIG_MAC8390=y
|
||||
# CONFIG_NET_VENDOR_QUALCOMM is not set
|
||||
# CONFIG_NET_VENDOR_RENESAS is not set
|
||||
|
@ -115,6 +115,8 @@ CONFIG_NFT_NAT=m
|
||||
CONFIG_NFT_QUEUE=m
|
||||
CONFIG_NFT_REJECT=m
|
||||
CONFIG_NFT_COMPAT=m
|
||||
CONFIG_NFT_DUP_NETDEV=m
|
||||
CONFIG_NFT_FWD_NETDEV=m
|
||||
CONFIG_NETFILTER_XT_SET=m
|
||||
CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m
|
||||
CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
|
||||
@ -276,6 +278,12 @@ CONFIG_DEV_APPLETALK=m
|
||||
CONFIG_IPDDP=m
|
||||
CONFIG_IPDDP_ENCAP=y
|
||||
CONFIG_6LOWPAN=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_HOP=m
|
||||
CONFIG_6LOWPAN_GHC_UDP=m
|
||||
CONFIG_6LOWPAN_GHC_ICMPV6=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_DEST=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_FRAG=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_ROUTE=m
|
||||
CONFIG_DNS_RESOLVER=y
|
||||
CONFIG_BATMAN_ADV=m
|
||||
CONFIG_BATMAN_ADV_DAT=y
|
||||
@ -404,6 +412,7 @@ CONFIG_MVME16x_NET=y
|
||||
# CONFIG_NET_VENDOR_MARVELL is not set
|
||||
# CONFIG_NET_VENDOR_MICREL is not set
|
||||
CONFIG_MACSONIC=y
|
||||
# CONFIG_NET_VENDOR_NETRONOME is not set
|
||||
CONFIG_HYDRA=y
|
||||
CONFIG_MAC8390=y
|
||||
CONFIG_NE2000=y
|
||||
|
@ -103,6 +103,8 @@ CONFIG_NFT_NAT=m
|
||||
CONFIG_NFT_QUEUE=m
|
||||
CONFIG_NFT_REJECT=m
|
||||
CONFIG_NFT_COMPAT=m
|
||||
CONFIG_NFT_DUP_NETDEV=m
|
||||
CONFIG_NFT_FWD_NETDEV=m
|
||||
CONFIG_NETFILTER_XT_SET=m
|
||||
CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m
|
||||
CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
|
||||
@ -261,6 +263,12 @@ CONFIG_L2TP=m
|
||||
CONFIG_BRIDGE=m
|
||||
CONFIG_ATALK=m
|
||||
CONFIG_6LOWPAN=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_HOP=m
|
||||
CONFIG_6LOWPAN_GHC_UDP=m
|
||||
CONFIG_6LOWPAN_GHC_ICMPV6=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_DEST=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_FRAG=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_ROUTE=m
|
||||
CONFIG_DNS_RESOLVER=y
|
||||
CONFIG_BATMAN_ADV=m
|
||||
CONFIG_BATMAN_ADV_DAT=y
|
||||
@ -343,6 +351,7 @@ CONFIG_MVME147_NET=y
|
||||
# CONFIG_NET_VENDOR_MARVELL is not set
|
||||
# CONFIG_NET_VENDOR_MICREL is not set
|
||||
# CONFIG_NET_VENDOR_NATSEMI is not set
|
||||
# CONFIG_NET_VENDOR_NETRONOME is not set
|
||||
# CONFIG_NET_VENDOR_QUALCOMM is not set
|
||||
# CONFIG_NET_VENDOR_RENESAS is not set
|
||||
# CONFIG_NET_VENDOR_ROCKER is not set
|
||||
|
@ -104,6 +104,8 @@ CONFIG_NFT_NAT=m
|
||||
CONFIG_NFT_QUEUE=m
|
||||
CONFIG_NFT_REJECT=m
|
||||
CONFIG_NFT_COMPAT=m
|
||||
CONFIG_NFT_DUP_NETDEV=m
|
||||
CONFIG_NFT_FWD_NETDEV=m
|
||||
CONFIG_NETFILTER_XT_SET=m
|
||||
CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m
|
||||
CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
|
||||
@ -262,6 +264,12 @@ CONFIG_L2TP=m
|
||||
CONFIG_BRIDGE=m
|
||||
CONFIG_ATALK=m
|
||||
CONFIG_6LOWPAN=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_HOP=m
|
||||
CONFIG_6LOWPAN_GHC_UDP=m
|
||||
CONFIG_6LOWPAN_GHC_ICMPV6=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_DEST=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_FRAG=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_ROUTE=m
|
||||
CONFIG_DNS_RESOLVER=y
|
||||
CONFIG_BATMAN_ADV=m
|
||||
CONFIG_BATMAN_ADV_DAT=y
|
||||
@ -343,6 +351,7 @@ CONFIG_MVME16x_NET=y
|
||||
# CONFIG_NET_VENDOR_MARVELL is not set
|
||||
# CONFIG_NET_VENDOR_MICREL is not set
|
||||
# CONFIG_NET_VENDOR_NATSEMI is not set
|
||||
# CONFIG_NET_VENDOR_NETRONOME is not set
|
||||
# CONFIG_NET_VENDOR_QUALCOMM is not set
|
||||
# CONFIG_NET_VENDOR_RENESAS is not set
|
||||
# CONFIG_NET_VENDOR_ROCKER is not set
|
||||
|
@ -104,6 +104,8 @@ CONFIG_NFT_NAT=m
|
||||
CONFIG_NFT_QUEUE=m
|
||||
CONFIG_NFT_REJECT=m
|
||||
CONFIG_NFT_COMPAT=m
|
||||
CONFIG_NFT_DUP_NETDEV=m
|
||||
CONFIG_NFT_FWD_NETDEV=m
|
||||
CONFIG_NETFILTER_XT_SET=m
|
||||
CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m
|
||||
CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
|
||||
@ -262,6 +264,12 @@ CONFIG_L2TP=m
|
||||
CONFIG_BRIDGE=m
|
||||
CONFIG_ATALK=m
|
||||
CONFIG_6LOWPAN=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_HOP=m
|
||||
CONFIG_6LOWPAN_GHC_UDP=m
|
||||
CONFIG_6LOWPAN_GHC_ICMPV6=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_DEST=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_FRAG=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_ROUTE=m
|
||||
CONFIG_DNS_RESOLVER=y
|
||||
CONFIG_BATMAN_ADV=m
|
||||
CONFIG_BATMAN_ADV_DAT=y
|
||||
@ -352,6 +360,7 @@ CONFIG_VETH=m
|
||||
# CONFIG_NET_VENDOR_INTEL is not set
|
||||
# CONFIG_NET_VENDOR_MARVELL is not set
|
||||
# CONFIG_NET_VENDOR_MICREL is not set
|
||||
# CONFIG_NET_VENDOR_NETRONOME is not set
|
||||
CONFIG_NE2000=y
|
||||
# CONFIG_NET_VENDOR_QUALCOMM is not set
|
||||
# CONFIG_NET_VENDOR_RENESAS is not set
|
||||
|
@ -101,6 +101,8 @@ CONFIG_NFT_NAT=m
|
||||
CONFIG_NFT_QUEUE=m
|
||||
CONFIG_NFT_REJECT=m
|
||||
CONFIG_NFT_COMPAT=m
|
||||
CONFIG_NFT_DUP_NETDEV=m
|
||||
CONFIG_NFT_FWD_NETDEV=m
|
||||
CONFIG_NETFILTER_XT_SET=m
|
||||
CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m
|
||||
CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
|
||||
@ -259,6 +261,12 @@ CONFIG_L2TP=m
|
||||
CONFIG_BRIDGE=m
|
||||
CONFIG_ATALK=m
|
||||
CONFIG_6LOWPAN=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_HOP=m
|
||||
CONFIG_6LOWPAN_GHC_UDP=m
|
||||
CONFIG_6LOWPAN_GHC_ICMPV6=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_DEST=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_FRAG=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_ROUTE=m
|
||||
CONFIG_DNS_RESOLVER=y
|
||||
CONFIG_BATMAN_ADV=m
|
||||
CONFIG_BATMAN_ADV_DAT=y
|
||||
@ -340,6 +348,7 @@ CONFIG_SUN3_82586=y
|
||||
# CONFIG_NET_VENDOR_MARVELL is not set
|
||||
# CONFIG_NET_VENDOR_MICREL is not set
|
||||
# CONFIG_NET_VENDOR_NATSEMI is not set
|
||||
# CONFIG_NET_VENDOR_NETRONOME is not set
|
||||
# CONFIG_NET_VENDOR_QUALCOMM is not set
|
||||
# CONFIG_NET_VENDOR_RENESAS is not set
|
||||
# CONFIG_NET_VENDOR_ROCKER is not set
|
||||
|
@ -101,6 +101,8 @@ CONFIG_NFT_NAT=m
|
||||
CONFIG_NFT_QUEUE=m
|
||||
CONFIG_NFT_REJECT=m
|
||||
CONFIG_NFT_COMPAT=m
|
||||
CONFIG_NFT_DUP_NETDEV=m
|
||||
CONFIG_NFT_FWD_NETDEV=m
|
||||
CONFIG_NETFILTER_XT_SET=m
|
||||
CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m
|
||||
CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
|
||||
@ -259,6 +261,12 @@ CONFIG_L2TP=m
|
||||
CONFIG_BRIDGE=m
|
||||
CONFIG_ATALK=m
|
||||
CONFIG_6LOWPAN=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_HOP=m
|
||||
CONFIG_6LOWPAN_GHC_UDP=m
|
||||
CONFIG_6LOWPAN_GHC_ICMPV6=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_DEST=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_FRAG=m
|
||||
CONFIG_6LOWPAN_GHC_EXT_HDR_ROUTE=m
|
||||
CONFIG_DNS_RESOLVER=y
|
||||
CONFIG_BATMAN_ADV=m
|
||||
CONFIG_BATMAN_ADV_DAT=y
|
||||
@ -341,6 +349,7 @@ CONFIG_SUN3LANCE=y
|
||||
# CONFIG_NET_VENDOR_MARVELL is not set
|
||||
# CONFIG_NET_VENDOR_MICREL is not set
|
||||
# CONFIG_NET_VENDOR_NATSEMI is not set
|
||||
# CONFIG_NET_VENDOR_NETRONOME is not set
|
||||
# CONFIG_NET_VENDOR_QUALCOMM is not set
|
||||
# CONFIG_NET_VENDOR_RENESAS is not set
|
||||
# CONFIG_NET_VENDOR_ROCKER is not set
|
||||
|
@ -4,7 +4,7 @@
|
||||
#include <uapi/asm/unistd.h>
|
||||
|
||||
|
||||
#define NR_syscalls 376
|
||||
#define NR_syscalls 377
|
||||
|
||||
#define __ARCH_WANT_OLD_READDIR
|
||||
#define __ARCH_WANT_OLD_STAT
|
||||
|
@ -381,5 +381,6 @@
|
||||
#define __NR_userfaultfd 373
|
||||
#define __NR_membarrier 374
|
||||
#define __NR_mlock2 375
|
||||
#define __NR_copy_file_range 376
|
||||
|
||||
#endif /* _UAPI_ASM_M68K_UNISTD_H_ */
|
||||
|
@ -396,3 +396,4 @@ ENTRY(sys_call_table)
|
||||
.long sys_userfaultfd
|
||||
.long sys_membarrier
|
||||
.long sys_mlock2 /* 375 */
|
||||
.long sys_copy_file_range
|
||||
|
@ -557,7 +557,7 @@ choice
|
||||
|
||||
config PPC_4K_PAGES
|
||||
bool "4k page size"
|
||||
select HAVE_ARCH_SOFT_DIRTY if CHECKPOINT_RESTORE && PPC_BOOK3S
|
||||
select HAVE_ARCH_SOFT_DIRTY if PPC_BOOK3S_64
|
||||
|
||||
config PPC_16K_PAGES
|
||||
bool "16k page size"
|
||||
@ -566,7 +566,7 @@ config PPC_16K_PAGES
|
||||
config PPC_64K_PAGES
|
||||
bool "64k page size"
|
||||
depends on !PPC_FSL_BOOK3E && (44x || PPC_STD_MMU_64 || PPC_BOOK3E_64)
|
||||
select HAVE_ARCH_SOFT_DIRTY if CHECKPOINT_RESTORE && PPC_BOOK3S
|
||||
select HAVE_ARCH_SOFT_DIRTY if PPC_BOOK3S_64
|
||||
|
||||
config PPC_256K_PAGES
|
||||
bool "256k page size"
|
||||
|
@ -281,6 +281,10 @@ extern pgtable_t pgtable_trans_huge_withdraw(struct mm_struct *mm, pmd_t *pmdp);
|
||||
extern void pmdp_invalidate(struct vm_area_struct *vma, unsigned long address,
|
||||
pmd_t *pmdp);
|
||||
|
||||
#define __HAVE_ARCH_PMDP_HUGE_SPLIT_PREPARE
|
||||
extern void pmdp_huge_split_prepare(struct vm_area_struct *vma,
|
||||
unsigned long address, pmd_t *pmdp);
|
||||
|
||||
#define pmd_move_must_withdraw pmd_move_must_withdraw
|
||||
struct spinlock;
|
||||
static inline int pmd_move_must_withdraw(struct spinlock *new_pmd_ptl,
|
||||
|
@ -81,6 +81,7 @@ struct pci_dn;
|
||||
#define EEH_PE_KEEP (1 << 8) /* Keep PE on hotplug */
|
||||
#define EEH_PE_CFG_RESTRICTED (1 << 9) /* Block config on error */
|
||||
#define EEH_PE_REMOVED (1 << 10) /* Removed permanently */
|
||||
#define EEH_PE_PRI_BUS (1 << 11) /* Cached primary bus */
|
||||
|
||||
struct eeh_pe {
|
||||
int type; /* PE type: PHB/Bus/Device */
|
||||
|
@ -57,12 +57,14 @@ DEFINE_EVENT(ppc64_interrupt_class, timer_interrupt_exit,
|
||||
extern void hcall_tracepoint_regfunc(void);
|
||||
extern void hcall_tracepoint_unregfunc(void);
|
||||
|
||||
TRACE_EVENT_FN(hcall_entry,
|
||||
TRACE_EVENT_FN_COND(hcall_entry,
|
||||
|
||||
TP_PROTO(unsigned long opcode, unsigned long *args),
|
||||
|
||||
TP_ARGS(opcode, args),
|
||||
|
||||
TP_CONDITION(cpu_online(raw_smp_processor_id())),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(unsigned long, opcode)
|
||||
),
|
||||
@ -76,13 +78,15 @@ TRACE_EVENT_FN(hcall_entry,
|
||||
hcall_tracepoint_regfunc, hcall_tracepoint_unregfunc
|
||||
);
|
||||
|
||||
TRACE_EVENT_FN(hcall_exit,
|
||||
TRACE_EVENT_FN_COND(hcall_exit,
|
||||
|
||||
TP_PROTO(unsigned long opcode, unsigned long retval,
|
||||
unsigned long *retbuf),
|
||||
|
||||
TP_ARGS(opcode, retval, retbuf),
|
||||
|
||||
TP_CONDITION(cpu_online(raw_smp_processor_id())),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(unsigned long, opcode)
|
||||
__field(unsigned long, retval)
|
||||
|
@ -564,6 +564,7 @@ static int eeh_reset_device(struct eeh_pe *pe, struct pci_bus *bus)
|
||||
*/
|
||||
eeh_pe_state_mark(pe, EEH_PE_KEEP);
|
||||
if (bus) {
|
||||
eeh_pe_state_clear(pe, EEH_PE_PRI_BUS);
|
||||
pci_lock_rescan_remove();
|
||||
pcibios_remove_pci_devices(bus);
|
||||
pci_unlock_rescan_remove();
|
||||
@ -803,6 +804,7 @@ static void eeh_handle_normal_event(struct eeh_pe *pe)
|
||||
* the their PCI config any more.
|
||||
*/
|
||||
if (frozen_bus) {
|
||||
eeh_pe_state_clear(pe, EEH_PE_PRI_BUS);
|
||||
eeh_pe_dev_mode_mark(pe, EEH_DEV_REMOVED);
|
||||
|
||||
pci_lock_rescan_remove();
|
||||
@ -886,6 +888,7 @@ static void eeh_handle_special_event(void)
|
||||
continue;
|
||||
|
||||
/* Notify all devices to be down */
|
||||
eeh_pe_state_clear(pe, EEH_PE_PRI_BUS);
|
||||
bus = eeh_pe_bus_get(phb_pe);
|
||||
eeh_pe_dev_traverse(pe,
|
||||
eeh_report_failure, NULL);
|
||||
|
@ -928,7 +928,7 @@ struct pci_bus *eeh_pe_bus_get(struct eeh_pe *pe)
|
||||
bus = pe->phb->bus;
|
||||
} else if (pe->type & EEH_PE_BUS ||
|
||||
pe->type & EEH_PE_DEVICE) {
|
||||
if (pe->bus) {
|
||||
if (pe->state & EEH_PE_PRI_BUS) {
|
||||
bus = pe->bus;
|
||||
goto out;
|
||||
}
|
||||
|
@ -340,7 +340,7 @@ static void dedotify(Elf64_Sym *syms, unsigned int numsyms, char *strtab)
|
||||
if (name[0] == '.') {
|
||||
if (strcmp(name+1, "TOC.") == 0)
|
||||
syms[i].st_shndx = SHN_ABS;
|
||||
memmove(name, name+1, strlen(name));
|
||||
syms[i].st_name++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -646,6 +646,28 @@ pgtable_t pgtable_trans_huge_withdraw(struct mm_struct *mm, pmd_t *pmdp)
|
||||
return pgtable;
|
||||
}
|
||||
|
||||
void pmdp_huge_split_prepare(struct vm_area_struct *vma,
|
||||
unsigned long address, pmd_t *pmdp)
|
||||
{
|
||||
VM_BUG_ON(address & ~HPAGE_PMD_MASK);
|
||||
VM_BUG_ON(REGION_ID(address) != USER_REGION_ID);
|
||||
|
||||
/*
|
||||
* We can't mark the pmd none here, because that will cause a race
|
||||
* against exit_mmap. We need to continue mark pmd TRANS HUGE, while
|
||||
* we spilt, but at the same time we wan't rest of the ppc64 code
|
||||
* not to insert hash pte on this, because we will be modifying
|
||||
* the deposited pgtable in the caller of this function. Hence
|
||||
* clear the _PAGE_USER so that we move the fault handling to
|
||||
* higher level function and that will serialize against ptl.
|
||||
* We need to flush existing hash pte entries here even though,
|
||||
* the translation is still valid, because we will withdraw
|
||||
* pgtable_t after this.
|
||||
*/
|
||||
pmd_hugepage_update(vma->vm_mm, address, pmdp, _PAGE_USER, 0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* set a new huge pmd. We should not be called for updating
|
||||
* an existing pmd entry. That should go via pmd_hugepage_update.
|
||||
@ -663,10 +685,20 @@ void set_pmd_at(struct mm_struct *mm, unsigned long addr,
|
||||
return set_pte_at(mm, addr, pmdp_ptep(pmdp), pmd_pte(pmd));
|
||||
}
|
||||
|
||||
/*
|
||||
* We use this to invalidate a pmdp entry before switching from a
|
||||
* hugepte to regular pmd entry.
|
||||
*/
|
||||
void pmdp_invalidate(struct vm_area_struct *vma, unsigned long address,
|
||||
pmd_t *pmdp)
|
||||
{
|
||||
pmd_hugepage_update(vma->vm_mm, address, pmdp, _PAGE_PRESENT, 0);
|
||||
|
||||
/*
|
||||
* This ensures that generic code that rely on IRQ disabling
|
||||
* to prevent a parallel THP split work as expected.
|
||||
*/
|
||||
kick_all_cpus_sync();
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -444,9 +444,12 @@ static void *pnv_eeh_probe(struct pci_dn *pdn, void *data)
|
||||
* PCI devices of the PE are expected to be removed prior
|
||||
* to PE reset.
|
||||
*/
|
||||
if (!edev->pe->bus)
|
||||
if (!(edev->pe->state & EEH_PE_PRI_BUS)) {
|
||||
edev->pe->bus = pci_find_bus(hose->global_number,
|
||||
pdn->busno);
|
||||
if (edev->pe->bus)
|
||||
edev->pe->state |= EEH_PE_PRI_BUS;
|
||||
}
|
||||
|
||||
/*
|
||||
* Enable EEH explicitly so that we will do EEH check
|
||||
|
@ -3180,6 +3180,7 @@ static void pnv_pci_ioda_shutdown(struct pci_controller *hose)
|
||||
|
||||
static const struct pci_controller_ops pnv_pci_ioda_controller_ops = {
|
||||
.dma_dev_setup = pnv_pci_dma_dev_setup,
|
||||
.dma_bus_setup = pnv_pci_dma_bus_setup,
|
||||
#ifdef CONFIG_PCI_MSI
|
||||
.setup_msi_irqs = pnv_setup_msi_irqs,
|
||||
.teardown_msi_irqs = pnv_teardown_msi_irqs,
|
||||
|
@ -599,6 +599,9 @@ int pnv_tce_build(struct iommu_table *tbl, long index, long npages,
|
||||
u64 rpn = __pa(uaddr) >> tbl->it_page_shift;
|
||||
long i;
|
||||
|
||||
if (proto_tce & TCE_PCI_WRITE)
|
||||
proto_tce |= TCE_PCI_READ;
|
||||
|
||||
for (i = 0; i < npages; i++) {
|
||||
unsigned long newtce = proto_tce |
|
||||
((rpn + i) << tbl->it_page_shift);
|
||||
@ -620,6 +623,9 @@ int pnv_tce_xchg(struct iommu_table *tbl, long index,
|
||||
|
||||
BUG_ON(*hpa & ~IOMMU_PAGE_MASK(tbl));
|
||||
|
||||
if (newtce & TCE_PCI_WRITE)
|
||||
newtce |= TCE_PCI_READ;
|
||||
|
||||
oldtce = xchg(pnv_tce(tbl, idx), cpu_to_be64(newtce));
|
||||
*hpa = be64_to_cpu(oldtce) & ~(TCE_PCI_READ | TCE_PCI_WRITE);
|
||||
*direction = iommu_tce_direction(oldtce);
|
||||
@ -760,6 +766,26 @@ void pnv_pci_dma_dev_setup(struct pci_dev *pdev)
|
||||
phb->dma_dev_setup(phb, pdev);
|
||||
}
|
||||
|
||||
void pnv_pci_dma_bus_setup(struct pci_bus *bus)
|
||||
{
|
||||
struct pci_controller *hose = bus->sysdata;
|
||||
struct pnv_phb *phb = hose->private_data;
|
||||
struct pnv_ioda_pe *pe;
|
||||
|
||||
list_for_each_entry(pe, &phb->ioda.pe_list, list) {
|
||||
if (!(pe->flags & (PNV_IODA_PE_BUS | PNV_IODA_PE_BUS_ALL)))
|
||||
continue;
|
||||
|
||||
if (!pe->pbus)
|
||||
continue;
|
||||
|
||||
if (bus->number == ((pe->rid >> 8) & 0xFF)) {
|
||||
pe->pbus = bus;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void pnv_pci_shutdown(void)
|
||||
{
|
||||
struct pci_controller *hose;
|
||||
|
@ -242,6 +242,7 @@ extern void pnv_pci_reset_secondary_bus(struct pci_dev *dev);
|
||||
extern int pnv_eeh_phb_reset(struct pci_controller *hose, int option);
|
||||
|
||||
extern void pnv_pci_dma_dev_setup(struct pci_dev *pdev);
|
||||
extern void pnv_pci_dma_bus_setup(struct pci_bus *bus);
|
||||
extern int pnv_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type);
|
||||
extern void pnv_teardown_msi_irqs(struct pci_dev *pdev);
|
||||
|
||||
|
@ -37,7 +37,7 @@ static inline void klp_arch_set_pc(struct pt_regs *regs, unsigned long ip)
|
||||
regs->psw.addr = ip;
|
||||
}
|
||||
#else
|
||||
#error Live patching support is disabled; check CONFIG_LIVEPATCH
|
||||
#error Include linux/livepatch.h, not asm/livepatch.h
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@ -260,12 +260,13 @@ static unsigned long __store_trace(struct perf_callchain_entry *entry,
|
||||
void perf_callchain_kernel(struct perf_callchain_entry *entry,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
unsigned long head;
|
||||
unsigned long head, frame_size;
|
||||
struct stack_frame *head_sf;
|
||||
|
||||
if (user_mode(regs))
|
||||
return;
|
||||
|
||||
frame_size = STACK_FRAME_OVERHEAD + sizeof(struct pt_regs);
|
||||
head = regs->gprs[15];
|
||||
head_sf = (struct stack_frame *) head;
|
||||
|
||||
@ -273,8 +274,9 @@ void perf_callchain_kernel(struct perf_callchain_entry *entry,
|
||||
return;
|
||||
|
||||
head = head_sf->back_chain;
|
||||
head = __store_trace(entry, head, S390_lowcore.async_stack - ASYNC_SIZE,
|
||||
S390_lowcore.async_stack);
|
||||
head = __store_trace(entry, head,
|
||||
S390_lowcore.async_stack + frame_size - ASYNC_SIZE,
|
||||
S390_lowcore.async_stack + frame_size);
|
||||
|
||||
__store_trace(entry, head, S390_lowcore.thread_info,
|
||||
S390_lowcore.thread_info + THREAD_SIZE);
|
||||
|
@ -59,26 +59,32 @@ static unsigned long save_context_stack(struct stack_trace *trace,
|
||||
}
|
||||
}
|
||||
|
||||
void save_stack_trace(struct stack_trace *trace)
|
||||
static void __save_stack_trace(struct stack_trace *trace, unsigned long sp)
|
||||
{
|
||||
register unsigned long sp asm ("15");
|
||||
unsigned long orig_sp, new_sp;
|
||||
unsigned long new_sp, frame_size;
|
||||
|
||||
orig_sp = sp;
|
||||
new_sp = save_context_stack(trace, orig_sp,
|
||||
S390_lowcore.panic_stack - PAGE_SIZE,
|
||||
S390_lowcore.panic_stack, 1);
|
||||
if (new_sp != orig_sp)
|
||||
return;
|
||||
frame_size = STACK_FRAME_OVERHEAD + sizeof(struct pt_regs);
|
||||
new_sp = save_context_stack(trace, sp,
|
||||
S390_lowcore.panic_stack + frame_size - PAGE_SIZE,
|
||||
S390_lowcore.panic_stack + frame_size, 1);
|
||||
new_sp = save_context_stack(trace, new_sp,
|
||||
S390_lowcore.async_stack - ASYNC_SIZE,
|
||||
S390_lowcore.async_stack, 1);
|
||||
if (new_sp != orig_sp)
|
||||
return;
|
||||
S390_lowcore.async_stack + frame_size - ASYNC_SIZE,
|
||||
S390_lowcore.async_stack + frame_size, 1);
|
||||
save_context_stack(trace, new_sp,
|
||||
S390_lowcore.thread_info,
|
||||
S390_lowcore.thread_info + THREAD_SIZE, 1);
|
||||
}
|
||||
|
||||
void save_stack_trace(struct stack_trace *trace)
|
||||
{
|
||||
register unsigned long r15 asm ("15");
|
||||
unsigned long sp;
|
||||
|
||||
sp = r15;
|
||||
__save_stack_trace(trace, sp);
|
||||
if (trace->nr_entries < trace->max_entries)
|
||||
trace->entries[trace->nr_entries++] = ULONG_MAX;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(save_stack_trace);
|
||||
|
||||
void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
|
||||
@ -86,6 +92,10 @@ void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
|
||||
unsigned long sp, low, high;
|
||||
|
||||
sp = tsk->thread.ksp;
|
||||
if (tsk == current) {
|
||||
/* Get current stack pointer. */
|
||||
asm volatile("la %0,0(15)" : "=a" (sp));
|
||||
}
|
||||
low = (unsigned long) task_stack_page(tsk);
|
||||
high = (unsigned long) task_pt_regs(tsk);
|
||||
save_context_stack(trace, sp, low, high, 0);
|
||||
@ -93,3 +103,14 @@ void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
|
||||
trace->entries[trace->nr_entries++] = ULONG_MAX;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(save_stack_trace_tsk);
|
||||
|
||||
void save_stack_trace_regs(struct pt_regs *regs, struct stack_trace *trace)
|
||||
{
|
||||
unsigned long sp;
|
||||
|
||||
sp = kernel_stack_pointer(regs);
|
||||
__save_stack_trace(trace, sp);
|
||||
if (trace->nr_entries < trace->max_entries)
|
||||
trace->entries[trace->nr_entries++] = ULONG_MAX;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(save_stack_trace_regs);
|
||||
|
@ -18,6 +18,9 @@ void trace_s390_diagnose_norecursion(int diag_nr)
|
||||
unsigned long flags;
|
||||
unsigned int *depth;
|
||||
|
||||
/* Avoid lockdep recursion. */
|
||||
if (IS_ENABLED(CONFIG_LOCKDEP))
|
||||
return;
|
||||
local_irq_save(flags);
|
||||
depth = this_cpu_ptr(&diagnose_trace_depth);
|
||||
if (*depth == 0) {
|
||||
|
@ -93,15 +93,19 @@ static int __memcpy_real(void *dest, void *src, size_t count)
|
||||
*/
|
||||
int memcpy_real(void *dest, void *src, size_t count)
|
||||
{
|
||||
int irqs_disabled, rc;
|
||||
unsigned long flags;
|
||||
int rc;
|
||||
|
||||
if (!count)
|
||||
return 0;
|
||||
local_irq_save(flags);
|
||||
__arch_local_irq_stnsm(0xfbUL);
|
||||
flags = __arch_local_irq_stnsm(0xf8UL);
|
||||
irqs_disabled = arch_irqs_disabled_flags(flags);
|
||||
if (!irqs_disabled)
|
||||
trace_hardirqs_off();
|
||||
rc = __memcpy_real(dest, src, count);
|
||||
local_irq_restore(flags);
|
||||
if (!irqs_disabled)
|
||||
trace_hardirqs_on();
|
||||
__arch_local_irq_ssm(flags);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -54,12 +54,13 @@ __show_trace(unsigned int *depth, unsigned long sp,
|
||||
|
||||
void s390_backtrace(struct pt_regs * const regs, unsigned int depth)
|
||||
{
|
||||
unsigned long head;
|
||||
unsigned long head, frame_size;
|
||||
struct stack_frame* head_sf;
|
||||
|
||||
if (user_mode(regs))
|
||||
return;
|
||||
|
||||
frame_size = STACK_FRAME_OVERHEAD + sizeof(struct pt_regs);
|
||||
head = regs->gprs[15];
|
||||
head_sf = (struct stack_frame*)head;
|
||||
|
||||
@ -68,8 +69,9 @@ void s390_backtrace(struct pt_regs * const regs, unsigned int depth)
|
||||
|
||||
head = head_sf->back_chain;
|
||||
|
||||
head = __show_trace(&depth, head, S390_lowcore.async_stack - ASYNC_SIZE,
|
||||
S390_lowcore.async_stack);
|
||||
head = __show_trace(&depth, head,
|
||||
S390_lowcore.async_stack + frame_size - ASYNC_SIZE,
|
||||
S390_lowcore.async_stack + frame_size);
|
||||
|
||||
__show_trace(&depth, head, S390_lowcore.thread_info,
|
||||
S390_lowcore.thread_info + THREAD_SIZE);
|
||||
|
@ -778,8 +778,8 @@ config HPET_TIMER
|
||||
HPET is the next generation timer replacing legacy 8254s.
|
||||
The HPET provides a stable time base on SMP
|
||||
systems, unlike the TSC, but it is more expensive to access,
|
||||
as it is off-chip. You can find the HPET spec at
|
||||
<http://www.intel.com/hardwaredesign/hpetspec_1.pdf>.
|
||||
as it is off-chip. The interface used is documented
|
||||
in the HPET spec, revision 1.
|
||||
|
||||
You can safely choose Y here. However, HPET will only be
|
||||
activated if the platform and the BIOS support this feature.
|
||||
|
@ -41,7 +41,7 @@ static inline void klp_arch_set_pc(struct pt_regs *regs, unsigned long ip)
|
||||
regs->ip = ip;
|
||||
}
|
||||
#else
|
||||
#error Live patching support is disabled; check CONFIG_LIVEPATCH
|
||||
#error Include linux/livepatch.h, not asm/livepatch.h
|
||||
#endif
|
||||
|
||||
#endif /* _ASM_X86_LIVEPATCH_H */
|
||||
|
@ -323,6 +323,8 @@ static int amd_uncore_cpu_up_prepare(unsigned int cpu)
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
if (amd_uncore_nb)
|
||||
*per_cpu_ptr(amd_uncore_nb, cpu) = NULL;
|
||||
kfree(uncore_nb);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
@ -232,17 +232,31 @@ ENDPROC(copy_user_enhanced_fast_string)
|
||||
|
||||
/*
|
||||
* copy_user_nocache - Uncached memory copy with exception handling
|
||||
* This will force destination/source out of cache for more performance.
|
||||
* This will force destination out of cache for more performance.
|
||||
*
|
||||
* Note: Cached memory copy is used when destination or size is not
|
||||
* naturally aligned. That is:
|
||||
* - Require 8-byte alignment when size is 8 bytes or larger.
|
||||
* - Require 4-byte alignment when size is 4 bytes.
|
||||
*/
|
||||
ENTRY(__copy_user_nocache)
|
||||
ASM_STAC
|
||||
|
||||
/* If size is less than 8 bytes, go to 4-byte copy */
|
||||
cmpl $8,%edx
|
||||
jb 20f /* less then 8 bytes, go to byte copy loop */
|
||||
jb .L_4b_nocache_copy_entry
|
||||
|
||||
/* If destination is not 8-byte aligned, "cache" copy to align it */
|
||||
ALIGN_DESTINATION
|
||||
|
||||
/* Set 4x8-byte copy count and remainder */
|
||||
movl %edx,%ecx
|
||||
andl $63,%edx
|
||||
shrl $6,%ecx
|
||||
jz 17f
|
||||
jz .L_8b_nocache_copy_entry /* jump if count is 0 */
|
||||
|
||||
/* Perform 4x8-byte nocache loop-copy */
|
||||
.L_4x8b_nocache_copy_loop:
|
||||
1: movq (%rsi),%r8
|
||||
2: movq 1*8(%rsi),%r9
|
||||
3: movq 2*8(%rsi),%r10
|
||||
@ -262,60 +276,106 @@ ENTRY(__copy_user_nocache)
|
||||
leaq 64(%rsi),%rsi
|
||||
leaq 64(%rdi),%rdi
|
||||
decl %ecx
|
||||
jnz 1b
|
||||
17: movl %edx,%ecx
|
||||
jnz .L_4x8b_nocache_copy_loop
|
||||
|
||||
/* Set 8-byte copy count and remainder */
|
||||
.L_8b_nocache_copy_entry:
|
||||
movl %edx,%ecx
|
||||
andl $7,%edx
|
||||
shrl $3,%ecx
|
||||
jz 20f
|
||||
18: movq (%rsi),%r8
|
||||
19: movnti %r8,(%rdi)
|
||||
jz .L_4b_nocache_copy_entry /* jump if count is 0 */
|
||||
|
||||
/* Perform 8-byte nocache loop-copy */
|
||||
.L_8b_nocache_copy_loop:
|
||||
20: movq (%rsi),%r8
|
||||
21: movnti %r8,(%rdi)
|
||||
leaq 8(%rsi),%rsi
|
||||
leaq 8(%rdi),%rdi
|
||||
decl %ecx
|
||||
jnz 18b
|
||||
20: andl %edx,%edx
|
||||
jz 23f
|
||||
jnz .L_8b_nocache_copy_loop
|
||||
|
||||
/* If no byte left, we're done */
|
||||
.L_4b_nocache_copy_entry:
|
||||
andl %edx,%edx
|
||||
jz .L_finish_copy
|
||||
|
||||
/* If destination is not 4-byte aligned, go to byte copy: */
|
||||
movl %edi,%ecx
|
||||
andl $3,%ecx
|
||||
jnz .L_1b_cache_copy_entry
|
||||
|
||||
/* Set 4-byte copy count (1 or 0) and remainder */
|
||||
movl %edx,%ecx
|
||||
21: movb (%rsi),%al
|
||||
22: movb %al,(%rdi)
|
||||
andl $3,%edx
|
||||
shrl $2,%ecx
|
||||
jz .L_1b_cache_copy_entry /* jump if count is 0 */
|
||||
|
||||
/* Perform 4-byte nocache copy: */
|
||||
30: movl (%rsi),%r8d
|
||||
31: movnti %r8d,(%rdi)
|
||||
leaq 4(%rsi),%rsi
|
||||
leaq 4(%rdi),%rdi
|
||||
|
||||
/* If no bytes left, we're done: */
|
||||
andl %edx,%edx
|
||||
jz .L_finish_copy
|
||||
|
||||
/* Perform byte "cache" loop-copy for the remainder */
|
||||
.L_1b_cache_copy_entry:
|
||||
movl %edx,%ecx
|
||||
.L_1b_cache_copy_loop:
|
||||
40: movb (%rsi),%al
|
||||
41: movb %al,(%rdi)
|
||||
incq %rsi
|
||||
incq %rdi
|
||||
decl %ecx
|
||||
jnz 21b
|
||||
23: xorl %eax,%eax
|
||||
jnz .L_1b_cache_copy_loop
|
||||
|
||||
/* Finished copying; fence the prior stores */
|
||||
.L_finish_copy:
|
||||
xorl %eax,%eax
|
||||
ASM_CLAC
|
||||
sfence
|
||||
ret
|
||||
|
||||
.section .fixup,"ax"
|
||||
30: shll $6,%ecx
|
||||
.L_fixup_4x8b_copy:
|
||||
shll $6,%ecx
|
||||
addl %ecx,%edx
|
||||
jmp 60f
|
||||
40: lea (%rdx,%rcx,8),%rdx
|
||||
jmp 60f
|
||||
50: movl %ecx,%edx
|
||||
60: sfence
|
||||
jmp .L_fixup_handle_tail
|
||||
.L_fixup_8b_copy:
|
||||
lea (%rdx,%rcx,8),%rdx
|
||||
jmp .L_fixup_handle_tail
|
||||
.L_fixup_4b_copy:
|
||||
lea (%rdx,%rcx,4),%rdx
|
||||
jmp .L_fixup_handle_tail
|
||||
.L_fixup_1b_copy:
|
||||
movl %ecx,%edx
|
||||
.L_fixup_handle_tail:
|
||||
sfence
|
||||
jmp copy_user_handle_tail
|
||||
.previous
|
||||
|
||||
_ASM_EXTABLE(1b,30b)
|
||||
_ASM_EXTABLE(2b,30b)
|
||||
_ASM_EXTABLE(3b,30b)
|
||||
_ASM_EXTABLE(4b,30b)
|
||||
_ASM_EXTABLE(5b,30b)
|
||||
_ASM_EXTABLE(6b,30b)
|
||||
_ASM_EXTABLE(7b,30b)
|
||||
_ASM_EXTABLE(8b,30b)
|
||||
_ASM_EXTABLE(9b,30b)
|
||||
_ASM_EXTABLE(10b,30b)
|
||||
_ASM_EXTABLE(11b,30b)
|
||||
_ASM_EXTABLE(12b,30b)
|
||||
_ASM_EXTABLE(13b,30b)
|
||||
_ASM_EXTABLE(14b,30b)
|
||||
_ASM_EXTABLE(15b,30b)
|
||||
_ASM_EXTABLE(16b,30b)
|
||||
_ASM_EXTABLE(18b,40b)
|
||||
_ASM_EXTABLE(19b,40b)
|
||||
_ASM_EXTABLE(21b,50b)
|
||||
_ASM_EXTABLE(22b,50b)
|
||||
_ASM_EXTABLE(1b,.L_fixup_4x8b_copy)
|
||||
_ASM_EXTABLE(2b,.L_fixup_4x8b_copy)
|
||||
_ASM_EXTABLE(3b,.L_fixup_4x8b_copy)
|
||||
_ASM_EXTABLE(4b,.L_fixup_4x8b_copy)
|
||||
_ASM_EXTABLE(5b,.L_fixup_4x8b_copy)
|
||||
_ASM_EXTABLE(6b,.L_fixup_4x8b_copy)
|
||||
_ASM_EXTABLE(7b,.L_fixup_4x8b_copy)
|
||||
_ASM_EXTABLE(8b,.L_fixup_4x8b_copy)
|
||||
_ASM_EXTABLE(9b,.L_fixup_4x8b_copy)
|
||||
_ASM_EXTABLE(10b,.L_fixup_4x8b_copy)
|
||||
_ASM_EXTABLE(11b,.L_fixup_4x8b_copy)
|
||||
_ASM_EXTABLE(12b,.L_fixup_4x8b_copy)
|
||||
_ASM_EXTABLE(13b,.L_fixup_4x8b_copy)
|
||||
_ASM_EXTABLE(14b,.L_fixup_4x8b_copy)
|
||||
_ASM_EXTABLE(15b,.L_fixup_4x8b_copy)
|
||||
_ASM_EXTABLE(16b,.L_fixup_4x8b_copy)
|
||||
_ASM_EXTABLE(20b,.L_fixup_8b_copy)
|
||||
_ASM_EXTABLE(21b,.L_fixup_8b_copy)
|
||||
_ASM_EXTABLE(30b,.L_fixup_4b_copy)
|
||||
_ASM_EXTABLE(31b,.L_fixup_4b_copy)
|
||||
_ASM_EXTABLE(40b,.L_fixup_1b_copy)
|
||||
_ASM_EXTABLE(41b,.L_fixup_1b_copy)
|
||||
ENDPROC(__copy_user_nocache)
|
||||
|
@ -287,6 +287,9 @@ static noinline int vmalloc_fault(unsigned long address)
|
||||
if (!pmd_k)
|
||||
return -1;
|
||||
|
||||
if (pmd_huge(*pmd_k))
|
||||
return 0;
|
||||
|
||||
pte_k = pte_offset_kernel(pmd_k, address);
|
||||
if (!pte_present(*pte_k))
|
||||
return -1;
|
||||
@ -360,8 +363,6 @@ void vmalloc_sync_all(void)
|
||||
* 64-bit:
|
||||
*
|
||||
* Handle a fault on the vmalloc area
|
||||
*
|
||||
* This assumes no large pages in there.
|
||||
*/
|
||||
static noinline int vmalloc_fault(unsigned long address)
|
||||
{
|
||||
@ -403,17 +404,23 @@ static noinline int vmalloc_fault(unsigned long address)
|
||||
if (pud_none(*pud_ref))
|
||||
return -1;
|
||||
|
||||
if (pud_none(*pud) || pud_page_vaddr(*pud) != pud_page_vaddr(*pud_ref))
|
||||
if (pud_none(*pud) || pud_pfn(*pud) != pud_pfn(*pud_ref))
|
||||
BUG();
|
||||
|
||||
if (pud_huge(*pud))
|
||||
return 0;
|
||||
|
||||
pmd = pmd_offset(pud, address);
|
||||
pmd_ref = pmd_offset(pud_ref, address);
|
||||
if (pmd_none(*pmd_ref))
|
||||
return -1;
|
||||
|
||||
if (pmd_none(*pmd) || pmd_page(*pmd) != pmd_page(*pmd_ref))
|
||||
if (pmd_none(*pmd) || pmd_pfn(*pmd) != pmd_pfn(*pmd_ref))
|
||||
BUG();
|
||||
|
||||
if (pmd_huge(*pmd))
|
||||
return 0;
|
||||
|
||||
pte_ref = pte_offset_kernel(pmd_ref, address);
|
||||
if (!pte_present(*pte_ref))
|
||||
return -1;
|
||||
|
@ -102,7 +102,6 @@ static noinline int gup_pte_range(pmd_t pmd, unsigned long addr,
|
||||
return 0;
|
||||
}
|
||||
|
||||
page = pte_page(pte);
|
||||
if (pte_devmap(pte)) {
|
||||
pgmap = get_dev_pagemap(pte_pfn(pte), pgmap);
|
||||
if (unlikely(!pgmap)) {
|
||||
@ -115,6 +114,7 @@ static noinline int gup_pte_range(pmd_t pmd, unsigned long addr,
|
||||
return 0;
|
||||
}
|
||||
VM_BUG_ON(!pfn_valid(pte_pfn(pte)));
|
||||
page = pte_page(pte);
|
||||
get_page(page);
|
||||
put_dev_pagemap(pgmap);
|
||||
SetPageReferenced(page);
|
||||
|
@ -580,14 +580,14 @@ static void __init imr_fixup_memmap(struct imr_device *idev)
|
||||
end = (unsigned long)__end_rodata - 1;
|
||||
|
||||
/*
|
||||
* Setup a locked IMR around the physical extent of the kernel
|
||||
* Setup an unlocked IMR around the physical extent of the kernel
|
||||
* from the beginning of the .text secton to the end of the
|
||||
* .rodata section as one physically contiguous block.
|
||||
*
|
||||
* We don't round up @size since it is already PAGE_SIZE aligned.
|
||||
* See vmlinux.lds.S for details.
|
||||
*/
|
||||
ret = imr_add_range(base, size, IMR_CPU, IMR_CPU, true);
|
||||
ret = imr_add_range(base, size, IMR_CPU, IMR_CPU, false);
|
||||
if (ret < 0) {
|
||||
pr_err("unable to setup IMR for kernel: %zu KiB (%lx - %lx)\n",
|
||||
size / 1024, start, end);
|
||||
|
@ -874,7 +874,7 @@ int submit_bio_wait(int rw, struct bio *bio)
|
||||
bio->bi_private = &ret;
|
||||
bio->bi_end_io = submit_bio_wait_endio;
|
||||
submit_bio(rw, bio);
|
||||
wait_for_completion(&ret.event);
|
||||
wait_for_completion_io(&ret.event);
|
||||
|
||||
return ret.error;
|
||||
}
|
||||
@ -1090,9 +1090,12 @@ int bio_uncopy_user(struct bio *bio)
|
||||
if (!bio_flagged(bio, BIO_NULL_MAPPED)) {
|
||||
/*
|
||||
* if we're in a workqueue, the request is orphaned, so
|
||||
* don't copy into a random user address space, just free.
|
||||
* don't copy into a random user address space, just free
|
||||
* and return -EINTR so user space doesn't expect any data.
|
||||
*/
|
||||
if (current->mm && bio_data_dir(bio) == READ)
|
||||
if (!current->mm)
|
||||
ret = -EINTR;
|
||||
else if (bio_data_dir(bio) == READ)
|
||||
ret = bio_copy_to_iter(bio, bmd->iter);
|
||||
if (bmd->is_our_pages)
|
||||
bio_free_pages(bio);
|
||||
|
@ -788,6 +788,7 @@ int blkg_conf_prep(struct blkcg *blkcg, const struct blkcg_policy *pol,
|
||||
{
|
||||
struct gendisk *disk;
|
||||
struct blkcg_gq *blkg;
|
||||
struct module *owner;
|
||||
unsigned int major, minor;
|
||||
int key_len, part, ret;
|
||||
char *body;
|
||||
@ -804,7 +805,9 @@ int blkg_conf_prep(struct blkcg *blkcg, const struct blkcg_policy *pol,
|
||||
if (!disk)
|
||||
return -ENODEV;
|
||||
if (part) {
|
||||
owner = disk->fops->owner;
|
||||
put_disk(disk);
|
||||
module_put(owner);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
@ -820,7 +823,9 @@ int blkg_conf_prep(struct blkcg *blkcg, const struct blkcg_policy *pol,
|
||||
ret = PTR_ERR(blkg);
|
||||
rcu_read_unlock();
|
||||
spin_unlock_irq(disk->queue->queue_lock);
|
||||
owner = disk->fops->owner;
|
||||
put_disk(disk);
|
||||
module_put(owner);
|
||||
/*
|
||||
* If queue was bypassing, we should retry. Do so after a
|
||||
* short msleep(). It isn't strictly necessary but queue
|
||||
@ -851,9 +856,13 @@ EXPORT_SYMBOL_GPL(blkg_conf_prep);
|
||||
void blkg_conf_finish(struct blkg_conf_ctx *ctx)
|
||||
__releases(ctx->disk->queue->queue_lock) __releases(rcu)
|
||||
{
|
||||
struct module *owner;
|
||||
|
||||
spin_unlock_irq(ctx->disk->queue->queue_lock);
|
||||
rcu_read_unlock();
|
||||
owner = ctx->disk->fops->owner;
|
||||
put_disk(ctx->disk);
|
||||
module_put(owner);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(blkg_conf_finish);
|
||||
|
||||
|
@ -599,8 +599,10 @@ static void blk_mq_check_expired(struct blk_mq_hw_ctx *hctx,
|
||||
* If a request wasn't started before the queue was
|
||||
* marked dying, kill it here or it'll go unnoticed.
|
||||
*/
|
||||
if (unlikely(blk_queue_dying(rq->q)))
|
||||
blk_mq_complete_request(rq, -EIO);
|
||||
if (unlikely(blk_queue_dying(rq->q))) {
|
||||
rq->errors = -EIO;
|
||||
blk_mq_end_request(rq, rq->errors);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -91,8 +91,8 @@ void blk_set_default_limits(struct queue_limits *lim)
|
||||
lim->seg_boundary_mask = BLK_SEG_BOUNDARY_MASK;
|
||||
lim->virt_boundary_mask = 0;
|
||||
lim->max_segment_size = BLK_MAX_SEGMENT_SIZE;
|
||||
lim->max_sectors = lim->max_dev_sectors = lim->max_hw_sectors =
|
||||
BLK_SAFE_MAX_SECTORS;
|
||||
lim->max_sectors = lim->max_hw_sectors = BLK_SAFE_MAX_SECTORS;
|
||||
lim->max_dev_sectors = 0;
|
||||
lim->chunk_sectors = 0;
|
||||
lim->max_write_same_sectors = 0;
|
||||
lim->max_discard_sectors = 0;
|
||||
|
@ -147,10 +147,9 @@ static ssize_t queue_discard_granularity_show(struct request_queue *q, char *pag
|
||||
|
||||
static ssize_t queue_discard_max_hw_show(struct request_queue *q, char *page)
|
||||
{
|
||||
unsigned long long val;
|
||||
|
||||
val = q->limits.max_hw_discard_sectors << 9;
|
||||
return sprintf(page, "%llu\n", val);
|
||||
return sprintf(page, "%llu\n",
|
||||
(unsigned long long)q->limits.max_hw_discard_sectors << 9);
|
||||
}
|
||||
|
||||
static ssize_t queue_discard_max_show(struct request_queue *q, char *page)
|
||||
|
@ -39,7 +39,6 @@ struct deadline_data {
|
||||
*/
|
||||
struct request *next_rq[2];
|
||||
unsigned int batching; /* number of sequential requests made */
|
||||
sector_t last_sector; /* head position */
|
||||
unsigned int starved; /* times reads have starved writes */
|
||||
|
||||
/*
|
||||
@ -210,8 +209,6 @@ deadline_move_request(struct deadline_data *dd, struct request *rq)
|
||||
dd->next_rq[WRITE] = NULL;
|
||||
dd->next_rq[data_dir] = deadline_latter_request(rq);
|
||||
|
||||
dd->last_sector = rq_end_sector(rq);
|
||||
|
||||
/*
|
||||
* take it off the sort and fifo list, move
|
||||
* to dispatch queue
|
||||
|
@ -866,7 +866,7 @@ static void set_fdc(int drive)
|
||||
}
|
||||
|
||||
/* locks the driver */
|
||||
static int lock_fdc(int drive, bool interruptible)
|
||||
static int lock_fdc(int drive)
|
||||
{
|
||||
if (WARN(atomic_read(&usage_count) == 0,
|
||||
"Trying to lock fdc while usage count=0\n"))
|
||||
@ -2173,7 +2173,7 @@ static int do_format(int drive, struct format_descr *tmp_format_req)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (lock_fdc(drive, true))
|
||||
if (lock_fdc(drive))
|
||||
return -EINTR;
|
||||
|
||||
set_floppy(drive);
|
||||
@ -2960,7 +2960,7 @@ static int user_reset_fdc(int drive, int arg, bool interruptible)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (lock_fdc(drive, interruptible))
|
||||
if (lock_fdc(drive))
|
||||
return -EINTR;
|
||||
|
||||
if (arg == FD_RESET_ALWAYS)
|
||||
@ -3243,7 +3243,7 @@ static int set_geometry(unsigned int cmd, struct floppy_struct *g,
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
return -EPERM;
|
||||
mutex_lock(&open_lock);
|
||||
if (lock_fdc(drive, true)) {
|
||||
if (lock_fdc(drive)) {
|
||||
mutex_unlock(&open_lock);
|
||||
return -EINTR;
|
||||
}
|
||||
@ -3263,7 +3263,7 @@ static int set_geometry(unsigned int cmd, struct floppy_struct *g,
|
||||
} else {
|
||||
int oldStretch;
|
||||
|
||||
if (lock_fdc(drive, true))
|
||||
if (lock_fdc(drive))
|
||||
return -EINTR;
|
||||
if (cmd != FDDEFPRM) {
|
||||
/* notice a disk change immediately, else
|
||||
@ -3349,7 +3349,7 @@ static int get_floppy_geometry(int drive, int type, struct floppy_struct **g)
|
||||
if (type)
|
||||
*g = &floppy_type[type];
|
||||
else {
|
||||
if (lock_fdc(drive, false))
|
||||
if (lock_fdc(drive))
|
||||
return -EINTR;
|
||||
if (poll_drive(false, 0) == -EINTR)
|
||||
return -EINTR;
|
||||
@ -3433,7 +3433,7 @@ static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode, unsigned int
|
||||
if (UDRS->fd_ref != 1)
|
||||
/* somebody else has this drive open */
|
||||
return -EBUSY;
|
||||
if (lock_fdc(drive, true))
|
||||
if (lock_fdc(drive))
|
||||
return -EINTR;
|
||||
|
||||
/* do the actual eject. Fails on
|
||||
@ -3445,7 +3445,7 @@ static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode, unsigned int
|
||||
process_fd_request();
|
||||
return ret;
|
||||
case FDCLRPRM:
|
||||
if (lock_fdc(drive, true))
|
||||
if (lock_fdc(drive))
|
||||
return -EINTR;
|
||||
current_type[drive] = NULL;
|
||||
floppy_sizes[drive] = MAX_DISK_SIZE << 1;
|
||||
@ -3467,7 +3467,7 @@ static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode, unsigned int
|
||||
UDP->flags &= ~FTD_MSG;
|
||||
return 0;
|
||||
case FDFMTBEG:
|
||||
if (lock_fdc(drive, true))
|
||||
if (lock_fdc(drive))
|
||||
return -EINTR;
|
||||
if (poll_drive(true, FD_RAW_NEED_DISK) == -EINTR)
|
||||
return -EINTR;
|
||||
@ -3484,7 +3484,7 @@ static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode, unsigned int
|
||||
return do_format(drive, &inparam.f);
|
||||
case FDFMTEND:
|
||||
case FDFLUSH:
|
||||
if (lock_fdc(drive, true))
|
||||
if (lock_fdc(drive))
|
||||
return -EINTR;
|
||||
return invalidate_drive(bdev);
|
||||
case FDSETEMSGTRESH:
|
||||
@ -3507,7 +3507,7 @@ static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode, unsigned int
|
||||
outparam = UDP;
|
||||
break;
|
||||
case FDPOLLDRVSTAT:
|
||||
if (lock_fdc(drive, true))
|
||||
if (lock_fdc(drive))
|
||||
return -EINTR;
|
||||
if (poll_drive(true, FD_RAW_NEED_DISK) == -EINTR)
|
||||
return -EINTR;
|
||||
@ -3530,7 +3530,7 @@ static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode, unsigned int
|
||||
case FDRAWCMD:
|
||||
if (type)
|
||||
return -EINVAL;
|
||||
if (lock_fdc(drive, true))
|
||||
if (lock_fdc(drive))
|
||||
return -EINTR;
|
||||
set_floppy(drive);
|
||||
i = raw_cmd_ioctl(cmd, (void __user *)param);
|
||||
@ -3539,7 +3539,7 @@ static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode, unsigned int
|
||||
process_fd_request();
|
||||
return i;
|
||||
case FDTWADDLE:
|
||||
if (lock_fdc(drive, true))
|
||||
if (lock_fdc(drive))
|
||||
return -EINTR;
|
||||
twaddle();
|
||||
process_fd_request();
|
||||
@ -3663,6 +3663,11 @@ static int floppy_open(struct block_device *bdev, fmode_t mode)
|
||||
|
||||
opened_bdev[drive] = bdev;
|
||||
|
||||
if (!(mode & (FMODE_READ|FMODE_WRITE))) {
|
||||
res = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
res = -ENXIO;
|
||||
|
||||
if (!floppy_track_buffer) {
|
||||
@ -3706,21 +3711,20 @@ static int floppy_open(struct block_device *bdev, fmode_t mode)
|
||||
if (UFDCS->rawcmd == 1)
|
||||
UFDCS->rawcmd = 2;
|
||||
|
||||
if (!(mode & FMODE_NDELAY)) {
|
||||
if (mode & (FMODE_READ|FMODE_WRITE)) {
|
||||
UDRS->last_checked = 0;
|
||||
clear_bit(FD_OPEN_SHOULD_FAIL_BIT, &UDRS->flags);
|
||||
check_disk_change(bdev);
|
||||
if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags))
|
||||
goto out;
|
||||
if (test_bit(FD_OPEN_SHOULD_FAIL_BIT, &UDRS->flags))
|
||||
goto out;
|
||||
}
|
||||
res = -EROFS;
|
||||
if ((mode & FMODE_WRITE) &&
|
||||
!test_bit(FD_DISK_WRITABLE_BIT, &UDRS->flags))
|
||||
goto out;
|
||||
}
|
||||
UDRS->last_checked = 0;
|
||||
clear_bit(FD_OPEN_SHOULD_FAIL_BIT, &UDRS->flags);
|
||||
check_disk_change(bdev);
|
||||
if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags))
|
||||
goto out;
|
||||
if (test_bit(FD_OPEN_SHOULD_FAIL_BIT, &UDRS->flags))
|
||||
goto out;
|
||||
|
||||
res = -EROFS;
|
||||
|
||||
if ((mode & FMODE_WRITE) &&
|
||||
!test_bit(FD_DISK_WRITABLE_BIT, &UDRS->flags))
|
||||
goto out;
|
||||
|
||||
mutex_unlock(&open_lock);
|
||||
mutex_unlock(&floppy_mutex);
|
||||
return 0;
|
||||
@ -3748,7 +3752,8 @@ static unsigned int floppy_check_events(struct gendisk *disk,
|
||||
return DISK_EVENT_MEDIA_CHANGE;
|
||||
|
||||
if (time_after(jiffies, UDRS->last_checked + UDP->checkfreq)) {
|
||||
lock_fdc(drive, false);
|
||||
if (lock_fdc(drive))
|
||||
return -EINTR;
|
||||
poll_drive(false, 0);
|
||||
process_fd_request();
|
||||
}
|
||||
@ -3847,7 +3852,9 @@ static int floppy_revalidate(struct gendisk *disk)
|
||||
"VFS: revalidate called on non-open device.\n"))
|
||||
return -EFAULT;
|
||||
|
||||
lock_fdc(drive, false);
|
||||
res = lock_fdc(drive);
|
||||
if (res)
|
||||
return res;
|
||||
cf = (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags) ||
|
||||
test_bit(FD_VERIFY_BIT, &UDRS->flags));
|
||||
if (!(cf || test_bit(drive, &fake_change) || drive_no_geom(drive))) {
|
||||
|
@ -478,7 +478,7 @@ static int null_lnvm_id(struct nvm_dev *dev, struct nvm_id *id)
|
||||
id->ver_id = 0x1;
|
||||
id->vmnt = 0;
|
||||
id->cgrps = 1;
|
||||
id->cap = 0x3;
|
||||
id->cap = 0x2;
|
||||
id->dom = 0x1;
|
||||
|
||||
id->ppaf.blk_offset = 0;
|
||||
@ -707,9 +707,7 @@ static int null_add_dev(void)
|
||||
queue_flag_set_unlocked(QUEUE_FLAG_NONROT, nullb->q);
|
||||
queue_flag_clear_unlocked(QUEUE_FLAG_ADD_RANDOM, nullb->q);
|
||||
|
||||
|
||||
mutex_lock(&lock);
|
||||
list_add_tail(&nullb->list, &nullb_list);
|
||||
nullb->index = nullb_indexes++;
|
||||
mutex_unlock(&lock);
|
||||
|
||||
@ -743,6 +741,10 @@ static int null_add_dev(void)
|
||||
strncpy(disk->disk_name, nullb->disk_name, DISK_NAME_LEN);
|
||||
|
||||
add_disk(disk);
|
||||
|
||||
mutex_lock(&lock);
|
||||
list_add_tail(&nullb->list, &nullb_list);
|
||||
mutex_unlock(&lock);
|
||||
done:
|
||||
return 0;
|
||||
|
||||
|
@ -1873,6 +1873,43 @@ static int talk_to_blkback(struct xenbus_device *dev,
|
||||
return err;
|
||||
}
|
||||
|
||||
static int negotiate_mq(struct blkfront_info *info)
|
||||
{
|
||||
unsigned int backend_max_queues = 0;
|
||||
int err;
|
||||
unsigned int i;
|
||||
|
||||
BUG_ON(info->nr_rings);
|
||||
|
||||
/* Check if backend supports multiple queues. */
|
||||
err = xenbus_scanf(XBT_NIL, info->xbdev->otherend,
|
||||
"multi-queue-max-queues", "%u", &backend_max_queues);
|
||||
if (err < 0)
|
||||
backend_max_queues = 1;
|
||||
|
||||
info->nr_rings = min(backend_max_queues, xen_blkif_max_queues);
|
||||
/* We need at least one ring. */
|
||||
if (!info->nr_rings)
|
||||
info->nr_rings = 1;
|
||||
|
||||
info->rinfo = kzalloc(sizeof(struct blkfront_ring_info) * info->nr_rings, GFP_KERNEL);
|
||||
if (!info->rinfo) {
|
||||
xenbus_dev_fatal(info->xbdev, -ENOMEM, "allocating ring_info structure");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
for (i = 0; i < info->nr_rings; i++) {
|
||||
struct blkfront_ring_info *rinfo;
|
||||
|
||||
rinfo = &info->rinfo[i];
|
||||
INIT_LIST_HEAD(&rinfo->indirect_pages);
|
||||
INIT_LIST_HEAD(&rinfo->grants);
|
||||
rinfo->dev_info = info;
|
||||
INIT_WORK(&rinfo->work, blkif_restart_queue);
|
||||
spin_lock_init(&rinfo->ring_lock);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
/**
|
||||
* Entry point to this code when a new device is created. Allocate the basic
|
||||
* structures and the ring buffer for communication with the backend, and
|
||||
@ -1883,9 +1920,7 @@ static int blkfront_probe(struct xenbus_device *dev,
|
||||
const struct xenbus_device_id *id)
|
||||
{
|
||||
int err, vdevice;
|
||||
unsigned int r_index;
|
||||
struct blkfront_info *info;
|
||||
unsigned int backend_max_queues = 0;
|
||||
|
||||
/* FIXME: Use dynamic device id if this is not set. */
|
||||
err = xenbus_scanf(XBT_NIL, dev->nodename,
|
||||
@ -1936,33 +1971,10 @@ static int blkfront_probe(struct xenbus_device *dev,
|
||||
}
|
||||
|
||||
info->xbdev = dev;
|
||||
/* Check if backend supports multiple queues. */
|
||||
err = xenbus_scanf(XBT_NIL, info->xbdev->otherend,
|
||||
"multi-queue-max-queues", "%u", &backend_max_queues);
|
||||
if (err < 0)
|
||||
backend_max_queues = 1;
|
||||
|
||||
info->nr_rings = min(backend_max_queues, xen_blkif_max_queues);
|
||||
/* We need at least one ring. */
|
||||
if (!info->nr_rings)
|
||||
info->nr_rings = 1;
|
||||
|
||||
info->rinfo = kzalloc(sizeof(struct blkfront_ring_info) * info->nr_rings, GFP_KERNEL);
|
||||
if (!info->rinfo) {
|
||||
xenbus_dev_fatal(dev, -ENOMEM, "allocating ring_info structure");
|
||||
err = negotiate_mq(info);
|
||||
if (err) {
|
||||
kfree(info);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
for (r_index = 0; r_index < info->nr_rings; r_index++) {
|
||||
struct blkfront_ring_info *rinfo;
|
||||
|
||||
rinfo = &info->rinfo[r_index];
|
||||
INIT_LIST_HEAD(&rinfo->indirect_pages);
|
||||
INIT_LIST_HEAD(&rinfo->grants);
|
||||
rinfo->dev_info = info;
|
||||
INIT_WORK(&rinfo->work, blkif_restart_queue);
|
||||
spin_lock_init(&rinfo->ring_lock);
|
||||
return err;
|
||||
}
|
||||
|
||||
mutex_init(&info->mutex);
|
||||
@ -2123,12 +2135,16 @@ static int blkif_recover(struct blkfront_info *info)
|
||||
static int blkfront_resume(struct xenbus_device *dev)
|
||||
{
|
||||
struct blkfront_info *info = dev_get_drvdata(&dev->dev);
|
||||
int err;
|
||||
int err = 0;
|
||||
|
||||
dev_dbg(&dev->dev, "blkfront_resume: %s\n", dev->nodename);
|
||||
|
||||
blkif_free(info, info->connected == BLKIF_STATE_CONNECTED);
|
||||
|
||||
err = negotiate_mq(info);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = talk_to_blkback(dev, info);
|
||||
|
||||
/*
|
||||
|
@ -42,7 +42,7 @@
|
||||
/*
|
||||
* The High Precision Event Timer driver.
|
||||
* This driver is closely modelled after the rtc.c driver.
|
||||
* http://www.intel.com/hardwaredesign/hpetspec_1.pdf
|
||||
* See HPET spec revision 1.
|
||||
*/
|
||||
#define HPET_USER_FREQ (64)
|
||||
#define HPET_DRIFT (500)
|
||||
|
@ -43,7 +43,7 @@ obj-$(CONFIG_COMMON_CLK_SI514) += clk-si514.o
|
||||
obj-$(CONFIG_COMMON_CLK_SI570) += clk-si570.o
|
||||
obj-$(CONFIG_COMMON_CLK_CDCE925) += clk-cdce925.o
|
||||
obj-$(CONFIG_ARCH_STM32) += clk-stm32f4.o
|
||||
obj-$(CONFIG_ARCH_TANGOX) += clk-tango4.o
|
||||
obj-$(CONFIG_ARCH_TANGO) += clk-tango4.o
|
||||
obj-$(CONFIG_CLK_TWL6040) += clk-twl6040.o
|
||||
obj-$(CONFIG_ARCH_U300) += clk-u300.o
|
||||
obj-$(CONFIG_ARCH_VT8500) += clk-vt8500.o
|
||||
|
@ -289,7 +289,7 @@ static void __init of_gpio_clk_setup(struct device_node *node,
|
||||
|
||||
num_parents = of_clk_get_parent_count(node);
|
||||
if (num_parents < 0)
|
||||
return;
|
||||
num_parents = 0;
|
||||
|
||||
data = kzalloc(sizeof(*data), GFP_KERNEL);
|
||||
if (!data)
|
||||
|
@ -299,7 +299,7 @@ static int scpi_clocks_probe(struct platform_device *pdev)
|
||||
/* Add the virtual cpufreq device */
|
||||
cpufreq_dev = platform_device_register_simple("scpi-cpufreq",
|
||||
-1, NULL, 0);
|
||||
if (!cpufreq_dev)
|
||||
if (IS_ERR(cpufreq_dev))
|
||||
pr_warn("unable to register cpufreq device");
|
||||
|
||||
return 0;
|
||||
|
@ -247,7 +247,7 @@ static struct clk_onecell_data dove_divider_data = {
|
||||
|
||||
void __init dove_divider_clk_init(struct device_node *np)
|
||||
{
|
||||
void *base;
|
||||
void __iomem *base;
|
||||
|
||||
base = of_iomap(np, 0);
|
||||
if (WARN_ON(!base))
|
||||
|
@ -3587,7 +3587,6 @@ static const struct regmap_config gcc_apq8084_regmap_config = {
|
||||
.val_bits = 32,
|
||||
.max_register = 0x1fc0,
|
||||
.fast_io = true,
|
||||
.val_format_endian = REGMAP_ENDIAN_LITTLE,
|
||||
};
|
||||
|
||||
static const struct qcom_cc_desc gcc_apq8084_desc = {
|
||||
|
@ -3005,7 +3005,6 @@ static const struct regmap_config gcc_ipq806x_regmap_config = {
|
||||
.val_bits = 32,
|
||||
.max_register = 0x3e40,
|
||||
.fast_io = true,
|
||||
.val_format_endian = REGMAP_ENDIAN_LITTLE,
|
||||
};
|
||||
|
||||
static const struct qcom_cc_desc gcc_ipq806x_desc = {
|
||||
|
@ -2702,7 +2702,6 @@ static const struct regmap_config gcc_msm8660_regmap_config = {
|
||||
.val_bits = 32,
|
||||
.max_register = 0x363c,
|
||||
.fast_io = true,
|
||||
.val_format_endian = REGMAP_ENDIAN_LITTLE,
|
||||
};
|
||||
|
||||
static const struct qcom_cc_desc gcc_msm8660_desc = {
|
||||
|
@ -3336,7 +3336,6 @@ static const struct regmap_config gcc_msm8916_regmap_config = {
|
||||
.val_bits = 32,
|
||||
.max_register = 0x80000,
|
||||
.fast_io = true,
|
||||
.val_format_endian = REGMAP_ENDIAN_LITTLE,
|
||||
};
|
||||
|
||||
static const struct qcom_cc_desc gcc_msm8916_desc = {
|
||||
|
@ -3468,7 +3468,6 @@ static const struct regmap_config gcc_msm8960_regmap_config = {
|
||||
.val_bits = 32,
|
||||
.max_register = 0x3660,
|
||||
.fast_io = true,
|
||||
.val_format_endian = REGMAP_ENDIAN_LITTLE,
|
||||
};
|
||||
|
||||
static const struct regmap_config gcc_apq8064_regmap_config = {
|
||||
@ -3477,7 +3476,6 @@ static const struct regmap_config gcc_apq8064_regmap_config = {
|
||||
.val_bits = 32,
|
||||
.max_register = 0x3880,
|
||||
.fast_io = true,
|
||||
.val_format_endian = REGMAP_ENDIAN_LITTLE,
|
||||
};
|
||||
|
||||
static const struct qcom_cc_desc gcc_msm8960_desc = {
|
||||
|
@ -2680,7 +2680,6 @@ static const struct regmap_config gcc_msm8974_regmap_config = {
|
||||
.val_bits = 32,
|
||||
.max_register = 0x1fc0,
|
||||
.fast_io = true,
|
||||
.val_format_endian = REGMAP_ENDIAN_LITTLE,
|
||||
};
|
||||
|
||||
static const struct qcom_cc_desc gcc_msm8974_desc = {
|
||||
|
@ -419,7 +419,6 @@ static const struct regmap_config lcc_ipq806x_regmap_config = {
|
||||
.val_bits = 32,
|
||||
.max_register = 0xfc,
|
||||
.fast_io = true,
|
||||
.val_format_endian = REGMAP_ENDIAN_LITTLE,
|
||||
};
|
||||
|
||||
static const struct qcom_cc_desc lcc_ipq806x_desc = {
|
||||
|
@ -524,7 +524,6 @@ static const struct regmap_config lcc_msm8960_regmap_config = {
|
||||
.val_bits = 32,
|
||||
.max_register = 0xfc,
|
||||
.fast_io = true,
|
||||
.val_format_endian = REGMAP_ENDIAN_LITTLE,
|
||||
};
|
||||
|
||||
static const struct qcom_cc_desc lcc_msm8960_desc = {
|
||||
|
@ -3368,7 +3368,6 @@ static const struct regmap_config mmcc_apq8084_regmap_config = {
|
||||
.val_bits = 32,
|
||||
.max_register = 0x5104,
|
||||
.fast_io = true,
|
||||
.val_format_endian = REGMAP_ENDIAN_LITTLE,
|
||||
};
|
||||
|
||||
static const struct qcom_cc_desc mmcc_apq8084_desc = {
|
||||
|
@ -3029,7 +3029,6 @@ static const struct regmap_config mmcc_msm8960_regmap_config = {
|
||||
.val_bits = 32,
|
||||
.max_register = 0x334,
|
||||
.fast_io = true,
|
||||
.val_format_endian = REGMAP_ENDIAN_LITTLE,
|
||||
};
|
||||
|
||||
static const struct regmap_config mmcc_apq8064_regmap_config = {
|
||||
@ -3038,7 +3037,6 @@ static const struct regmap_config mmcc_apq8064_regmap_config = {
|
||||
.val_bits = 32,
|
||||
.max_register = 0x350,
|
||||
.fast_io = true,
|
||||
.val_format_endian = REGMAP_ENDIAN_LITTLE,
|
||||
};
|
||||
|
||||
static const struct qcom_cc_desc mmcc_msm8960_desc = {
|
||||
|
@ -2594,7 +2594,6 @@ static const struct regmap_config mmcc_msm8974_regmap_config = {
|
||||
.val_bits = 32,
|
||||
.max_register = 0x5104,
|
||||
.fast_io = true,
|
||||
.val_format_endian = REGMAP_ENDIAN_LITTLE,
|
||||
};
|
||||
|
||||
static const struct qcom_cc_desc mmcc_msm8974_desc = {
|
||||
|
@ -133,7 +133,7 @@ PNAME(mux_spdif_p) = { "spdif_src", "spdif_frac", "xin12m" };
|
||||
PNAME(mux_uart0_p) = { "uart0_src", "uart0_frac", "xin24m" };
|
||||
PNAME(mux_uart1_p) = { "uart1_src", "uart1_frac", "xin24m" };
|
||||
PNAME(mux_uart2_p) = { "uart2_src", "uart2_frac", "xin24m" };
|
||||
PNAME(mux_mac_p) = { "mac_pll_src", "ext_gmac" };
|
||||
PNAME(mux_mac_p) = { "mac_pll_src", "rmii_clkin" };
|
||||
PNAME(mux_dclk_p) = { "dclk_lcdc", "dclk_cru" };
|
||||
|
||||
static struct rockchip_pll_clock rk3036_pll_clks[] __initdata = {
|
||||
@ -224,16 +224,16 @@ static struct rockchip_clk_branch rk3036_clk_branches[] __initdata = {
|
||||
RK2928_CLKGATE_CON(2), 2, GFLAGS),
|
||||
|
||||
COMPOSITE_NODIV(SCLK_TIMER0, "sclk_timer0", mux_timer_p, CLK_IGNORE_UNUSED,
|
||||
RK2928_CLKSEL_CON(2), 4, 1, DFLAGS,
|
||||
RK2928_CLKSEL_CON(2), 4, 1, MFLAGS,
|
||||
RK2928_CLKGATE_CON(1), 0, GFLAGS),
|
||||
COMPOSITE_NODIV(SCLK_TIMER1, "sclk_timer1", mux_timer_p, CLK_IGNORE_UNUSED,
|
||||
RK2928_CLKSEL_CON(2), 5, 1, DFLAGS,
|
||||
RK2928_CLKSEL_CON(2), 5, 1, MFLAGS,
|
||||
RK2928_CLKGATE_CON(1), 1, GFLAGS),
|
||||
COMPOSITE_NODIV(SCLK_TIMER2, "sclk_timer2", mux_timer_p, CLK_IGNORE_UNUSED,
|
||||
RK2928_CLKSEL_CON(2), 6, 1, DFLAGS,
|
||||
RK2928_CLKSEL_CON(2), 6, 1, MFLAGS,
|
||||
RK2928_CLKGATE_CON(2), 4, GFLAGS),
|
||||
COMPOSITE_NODIV(SCLK_TIMER3, "sclk_timer3", mux_timer_p, CLK_IGNORE_UNUSED,
|
||||
RK2928_CLKSEL_CON(2), 7, 1, DFLAGS,
|
||||
RK2928_CLKSEL_CON(2), 7, 1, MFLAGS,
|
||||
RK2928_CLKGATE_CON(2), 5, GFLAGS),
|
||||
|
||||
MUX(0, "uart_pll_clk", mux_pll_src_apll_dpll_gpll_usb480m_p, 0,
|
||||
@ -242,11 +242,11 @@ static struct rockchip_clk_branch rk3036_clk_branches[] __initdata = {
|
||||
RK2928_CLKSEL_CON(13), 0, 7, DFLAGS,
|
||||
RK2928_CLKGATE_CON(1), 8, GFLAGS),
|
||||
COMPOSITE_NOMUX(0, "uart1_src", "uart_pll_clk", 0,
|
||||
RK2928_CLKSEL_CON(13), 0, 7, DFLAGS,
|
||||
RK2928_CLKGATE_CON(1), 8, GFLAGS),
|
||||
RK2928_CLKSEL_CON(14), 0, 7, DFLAGS,
|
||||
RK2928_CLKGATE_CON(1), 10, GFLAGS),
|
||||
COMPOSITE_NOMUX(0, "uart2_src", "uart_pll_clk", 0,
|
||||
RK2928_CLKSEL_CON(13), 0, 7, DFLAGS,
|
||||
RK2928_CLKGATE_CON(1), 8, GFLAGS),
|
||||
RK2928_CLKSEL_CON(15), 0, 7, DFLAGS,
|
||||
RK2928_CLKGATE_CON(1), 12, GFLAGS),
|
||||
COMPOSITE_FRACMUX(0, "uart0_frac", "uart0_src", CLK_SET_RATE_PARENT,
|
||||
RK2928_CLKSEL_CON(17), 0,
|
||||
RK2928_CLKGATE_CON(1), 9, GFLAGS,
|
||||
@ -279,13 +279,13 @@ static struct rockchip_clk_branch rk3036_clk_branches[] __initdata = {
|
||||
RK2928_CLKGATE_CON(3), 2, GFLAGS),
|
||||
|
||||
COMPOSITE_NODIV(0, "sclk_sdmmc_src", mux_mmc_src_p, 0,
|
||||
RK2928_CLKSEL_CON(12), 8, 2, DFLAGS,
|
||||
RK2928_CLKSEL_CON(12), 8, 2, MFLAGS,
|
||||
RK2928_CLKGATE_CON(2), 11, GFLAGS),
|
||||
DIV(SCLK_SDMMC, "sclk_sdmmc", "sclk_sdmmc_src", 0,
|
||||
RK2928_CLKSEL_CON(11), 0, 7, DFLAGS),
|
||||
|
||||
COMPOSITE_NODIV(0, "sclk_sdio_src", mux_mmc_src_p, 0,
|
||||
RK2928_CLKSEL_CON(12), 10, 2, DFLAGS,
|
||||
RK2928_CLKSEL_CON(12), 10, 2, MFLAGS,
|
||||
RK2928_CLKGATE_CON(2), 13, GFLAGS),
|
||||
DIV(SCLK_SDIO, "sclk_sdio", "sclk_sdio_src", 0,
|
||||
RK2928_CLKSEL_CON(11), 8, 7, DFLAGS),
|
||||
@ -344,12 +344,12 @@ static struct rockchip_clk_branch rk3036_clk_branches[] __initdata = {
|
||||
RK2928_CLKGATE_CON(10), 5, GFLAGS),
|
||||
|
||||
COMPOSITE_NOGATE(0, "mac_pll_src", mux_pll_src_3plls_p, 0,
|
||||
RK2928_CLKSEL_CON(21), 0, 2, MFLAGS, 4, 5, DFLAGS),
|
||||
RK2928_CLKSEL_CON(21), 0, 2, MFLAGS, 9, 5, DFLAGS),
|
||||
MUX(SCLK_MACREF, "mac_clk_ref", mux_mac_p, CLK_SET_RATE_PARENT,
|
||||
RK2928_CLKSEL_CON(21), 3, 1, MFLAGS),
|
||||
|
||||
COMPOSITE_NOMUX(SCLK_MAC, "mac_clk", "mac_clk_ref", 0,
|
||||
RK2928_CLKSEL_CON(21), 9, 5, DFLAGS,
|
||||
RK2928_CLKSEL_CON(21), 4, 5, DFLAGS,
|
||||
RK2928_CLKGATE_CON(2), 6, GFLAGS),
|
||||
|
||||
MUX(SCLK_HDMI, "dclk_hdmi", mux_dclk_p, 0,
|
||||
|
@ -780,13 +780,13 @@ static struct rockchip_clk_branch rk3368_clk_branches[] __initdata = {
|
||||
GATE(PCLK_TSADC, "pclk_tsadc", "pclk_peri", 0, RK3368_CLKGATE_CON(20), 0, GFLAGS),
|
||||
|
||||
/* pclk_pd_alive gates */
|
||||
GATE(PCLK_TIMER1, "pclk_timer1", "pclk_pd_alive", 0, RK3368_CLKGATE_CON(14), 8, GFLAGS),
|
||||
GATE(PCLK_TIMER0, "pclk_timer0", "pclk_pd_alive", 0, RK3368_CLKGATE_CON(14), 7, GFLAGS),
|
||||
GATE(0, "pclk_alive_niu", "pclk_pd_alive", CLK_IGNORE_UNUSED, RK3368_CLKGATE_CON(14), 12, GFLAGS),
|
||||
GATE(PCLK_GRF, "pclk_grf", "pclk_pd_alive", CLK_IGNORE_UNUSED, RK3368_CLKGATE_CON(14), 11, GFLAGS),
|
||||
GATE(PCLK_GPIO3, "pclk_gpio3", "pclk_pd_alive", 0, RK3368_CLKGATE_CON(14), 3, GFLAGS),
|
||||
GATE(PCLK_GPIO2, "pclk_gpio2", "pclk_pd_alive", 0, RK3368_CLKGATE_CON(14), 2, GFLAGS),
|
||||
GATE(PCLK_GPIO1, "pclk_gpio1", "pclk_pd_alive", 0, RK3368_CLKGATE_CON(14), 1, GFLAGS),
|
||||
GATE(PCLK_TIMER1, "pclk_timer1", "pclk_pd_alive", 0, RK3368_CLKGATE_CON(22), 13, GFLAGS),
|
||||
GATE(PCLK_TIMER0, "pclk_timer0", "pclk_pd_alive", 0, RK3368_CLKGATE_CON(22), 12, GFLAGS),
|
||||
GATE(0, "pclk_alive_niu", "pclk_pd_alive", CLK_IGNORE_UNUSED, RK3368_CLKGATE_CON(22), 9, GFLAGS),
|
||||
GATE(PCLK_GRF, "pclk_grf", "pclk_pd_alive", CLK_IGNORE_UNUSED, RK3368_CLKGATE_CON(22), 8, GFLAGS),
|
||||
GATE(PCLK_GPIO3, "pclk_gpio3", "pclk_pd_alive", 0, RK3368_CLKGATE_CON(22), 3, GFLAGS),
|
||||
GATE(PCLK_GPIO2, "pclk_gpio2", "pclk_pd_alive", 0, RK3368_CLKGATE_CON(22), 2, GFLAGS),
|
||||
GATE(PCLK_GPIO1, "pclk_gpio1", "pclk_pd_alive", 0, RK3368_CLKGATE_CON(22), 1, GFLAGS),
|
||||
|
||||
/*
|
||||
* pclk_vio gates
|
||||
@ -796,12 +796,12 @@ static struct rockchip_clk_branch rk3368_clk_branches[] __initdata = {
|
||||
GATE(0, "pclk_dphytx", "hclk_vio", CLK_IGNORE_UNUSED, RK3368_CLKGATE_CON(14), 8, GFLAGS),
|
||||
|
||||
/* pclk_pd_pmu gates */
|
||||
GATE(PCLK_PMUGRF, "pclk_pmugrf", "pclk_pd_pmu", CLK_IGNORE_UNUSED, RK3368_CLKGATE_CON(17), 0, GFLAGS),
|
||||
GATE(PCLK_GPIO0, "pclk_gpio0", "pclk_pd_pmu", 0, RK3368_CLKGATE_CON(17), 4, GFLAGS),
|
||||
GATE(PCLK_SGRF, "pclk_sgrf", "pclk_pd_pmu", CLK_IGNORE_UNUSED, RK3368_CLKGATE_CON(17), 3, GFLAGS),
|
||||
GATE(0, "pclk_pmu_noc", "pclk_pd_pmu", CLK_IGNORE_UNUSED, RK3368_CLKGATE_CON(17), 2, GFLAGS),
|
||||
GATE(0, "pclk_intmem1", "pclk_pd_pmu", CLK_IGNORE_UNUSED, RK3368_CLKGATE_CON(17), 1, GFLAGS),
|
||||
GATE(PCLK_PMU, "pclk_pmu", "pclk_pd_pmu", CLK_IGNORE_UNUSED, RK3368_CLKGATE_CON(17), 2, GFLAGS),
|
||||
GATE(PCLK_PMUGRF, "pclk_pmugrf", "pclk_pd_pmu", CLK_IGNORE_UNUSED, RK3368_CLKGATE_CON(23), 5, GFLAGS),
|
||||
GATE(PCLK_GPIO0, "pclk_gpio0", "pclk_pd_pmu", 0, RK3368_CLKGATE_CON(23), 4, GFLAGS),
|
||||
GATE(PCLK_SGRF, "pclk_sgrf", "pclk_pd_pmu", CLK_IGNORE_UNUSED, RK3368_CLKGATE_CON(23), 3, GFLAGS),
|
||||
GATE(0, "pclk_pmu_noc", "pclk_pd_pmu", CLK_IGNORE_UNUSED, RK3368_CLKGATE_CON(23), 2, GFLAGS),
|
||||
GATE(0, "pclk_intmem1", "pclk_pd_pmu", CLK_IGNORE_UNUSED, RK3368_CLKGATE_CON(23), 1, GFLAGS),
|
||||
GATE(PCLK_PMU, "pclk_pmu", "pclk_pd_pmu", CLK_IGNORE_UNUSED, RK3368_CLKGATE_CON(23), 0, GFLAGS),
|
||||
|
||||
/* timer gates */
|
||||
GATE(0, "sclk_timer15", "xin24m", CLK_IGNORE_UNUSED, RK3368_CLKGATE_CON(24), 11, GFLAGS),
|
||||
|
@ -450,8 +450,10 @@ static int load_timings_from_dt(struct tegra_clk_emc *tegra,
|
||||
struct emc_timing *timing = tegra->timings + (i++);
|
||||
|
||||
err = load_one_timing_from_dt(tegra, timing, child);
|
||||
if (err)
|
||||
if (err) {
|
||||
of_node_put(child);
|
||||
return err;
|
||||
}
|
||||
|
||||
timing->ram_code = ram_code;
|
||||
}
|
||||
@ -499,9 +501,9 @@ struct clk *tegra_clk_register_emc(void __iomem *base, struct device_node *np,
|
||||
* fuses until the apbmisc driver is loaded.
|
||||
*/
|
||||
err = load_timings_from_dt(tegra, node, node_ram_code);
|
||||
of_node_put(node);
|
||||
if (err)
|
||||
return ERR_PTR(err);
|
||||
of_node_put(node);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -11,6 +11,7 @@ enum clk_id {
|
||||
tegra_clk_afi,
|
||||
tegra_clk_amx,
|
||||
tegra_clk_amx1,
|
||||
tegra_clk_apb2ape,
|
||||
tegra_clk_apbdma,
|
||||
tegra_clk_apbif,
|
||||
tegra_clk_ape,
|
||||
|
@ -86,15 +86,21 @@
|
||||
#define PLLE_SS_DISABLE (PLLE_SS_CNTL_BYPASS_SS | PLLE_SS_CNTL_INTERP_RESET |\
|
||||
PLLE_SS_CNTL_SSC_BYP)
|
||||
#define PLLE_SS_MAX_MASK 0x1ff
|
||||
#define PLLE_SS_MAX_VAL 0x25
|
||||
#define PLLE_SS_MAX_VAL_TEGRA114 0x25
|
||||
#define PLLE_SS_MAX_VAL_TEGRA210 0x21
|
||||
#define PLLE_SS_INC_MASK (0xff << 16)
|
||||
#define PLLE_SS_INC_VAL (0x1 << 16)
|
||||
#define PLLE_SS_INCINTRV_MASK (0x3f << 24)
|
||||
#define PLLE_SS_INCINTRV_VAL (0x20 << 24)
|
||||
#define PLLE_SS_INCINTRV_VAL_TEGRA114 (0x20 << 24)
|
||||
#define PLLE_SS_INCINTRV_VAL_TEGRA210 (0x23 << 24)
|
||||
#define PLLE_SS_COEFFICIENTS_MASK \
|
||||
(PLLE_SS_MAX_MASK | PLLE_SS_INC_MASK | PLLE_SS_INCINTRV_MASK)
|
||||
#define PLLE_SS_COEFFICIENTS_VAL \
|
||||
(PLLE_SS_MAX_VAL | PLLE_SS_INC_VAL | PLLE_SS_INCINTRV_VAL)
|
||||
#define PLLE_SS_COEFFICIENTS_VAL_TEGRA114 \
|
||||
(PLLE_SS_MAX_VAL_TEGRA114 | PLLE_SS_INC_VAL |\
|
||||
PLLE_SS_INCINTRV_VAL_TEGRA114)
|
||||
#define PLLE_SS_COEFFICIENTS_VAL_TEGRA210 \
|
||||
(PLLE_SS_MAX_VAL_TEGRA210 | PLLE_SS_INC_VAL |\
|
||||
PLLE_SS_INCINTRV_VAL_TEGRA210)
|
||||
|
||||
#define PLLE_AUX_PLLP_SEL BIT(2)
|
||||
#define PLLE_AUX_USE_LOCKDET BIT(3)
|
||||
@ -880,7 +886,7 @@ static int clk_plle_training(struct tegra_clk_pll *pll)
|
||||
static int clk_plle_enable(struct clk_hw *hw)
|
||||
{
|
||||
struct tegra_clk_pll *pll = to_clk_pll(hw);
|
||||
unsigned long input_rate = clk_get_rate(clk_get_parent(hw->clk));
|
||||
unsigned long input_rate = clk_hw_get_rate(clk_hw_get_parent(hw));
|
||||
struct tegra_clk_pll_freq_table sel;
|
||||
u32 val;
|
||||
int err;
|
||||
@ -1378,7 +1384,7 @@ static int clk_plle_tegra114_enable(struct clk_hw *hw)
|
||||
u32 val;
|
||||
int ret;
|
||||
unsigned long flags = 0;
|
||||
unsigned long input_rate = clk_get_rate(clk_get_parent(hw->clk));
|
||||
unsigned long input_rate = clk_hw_get_rate(clk_hw_get_parent(hw));
|
||||
|
||||
if (_get_table_rate(hw, &sel, pll->params->fixed_rate, input_rate))
|
||||
return -EINVAL;
|
||||
@ -1401,7 +1407,7 @@ static int clk_plle_tegra114_enable(struct clk_hw *hw)
|
||||
val |= PLLE_MISC_IDDQ_SW_CTRL;
|
||||
val &= ~PLLE_MISC_IDDQ_SW_VALUE;
|
||||
val |= PLLE_MISC_PLLE_PTS;
|
||||
val |= PLLE_MISC_VREG_BG_CTRL_MASK | PLLE_MISC_VREG_CTRL_MASK;
|
||||
val &= ~(PLLE_MISC_VREG_BG_CTRL_MASK | PLLE_MISC_VREG_CTRL_MASK);
|
||||
pll_writel_misc(val, pll);
|
||||
udelay(5);
|
||||
|
||||
@ -1428,7 +1434,7 @@ static int clk_plle_tegra114_enable(struct clk_hw *hw)
|
||||
val = pll_readl(PLLE_SS_CTRL, pll);
|
||||
val &= ~(PLLE_SS_CNTL_CENTER | PLLE_SS_CNTL_INVERT);
|
||||
val &= ~PLLE_SS_COEFFICIENTS_MASK;
|
||||
val |= PLLE_SS_COEFFICIENTS_VAL;
|
||||
val |= PLLE_SS_COEFFICIENTS_VAL_TEGRA114;
|
||||
pll_writel(val, PLLE_SS_CTRL, pll);
|
||||
val &= ~(PLLE_SS_CNTL_SSC_BYP | PLLE_SS_CNTL_BYPASS_SS);
|
||||
pll_writel(val, PLLE_SS_CTRL, pll);
|
||||
@ -2012,9 +2018,9 @@ static int clk_plle_tegra210_enable(struct clk_hw *hw)
|
||||
struct tegra_clk_pll *pll = to_clk_pll(hw);
|
||||
struct tegra_clk_pll_freq_table sel;
|
||||
u32 val;
|
||||
int ret;
|
||||
int ret = 0;
|
||||
unsigned long flags = 0;
|
||||
unsigned long input_rate = clk_get_rate(clk_get_parent(hw->clk));
|
||||
unsigned long input_rate = clk_hw_get_rate(clk_hw_get_parent(hw));
|
||||
|
||||
if (_get_table_rate(hw, &sel, pll->params->fixed_rate, input_rate))
|
||||
return -EINVAL;
|
||||
@ -2022,22 +2028,20 @@ static int clk_plle_tegra210_enable(struct clk_hw *hw)
|
||||
if (pll->lock)
|
||||
spin_lock_irqsave(pll->lock, flags);
|
||||
|
||||
val = pll_readl(pll->params->aux_reg, pll);
|
||||
if (val & PLLE_AUX_SEQ_ENABLE)
|
||||
goto out;
|
||||
|
||||
val = pll_readl_base(pll);
|
||||
val &= ~BIT(30); /* Disable lock override */
|
||||
pll_writel_base(val, pll);
|
||||
|
||||
val = pll_readl(pll->params->aux_reg, pll);
|
||||
val |= PLLE_AUX_ENABLE_SWCTL;
|
||||
val &= ~PLLE_AUX_SEQ_ENABLE;
|
||||
pll_writel(val, pll->params->aux_reg, pll);
|
||||
udelay(1);
|
||||
|
||||
val = pll_readl_misc(pll);
|
||||
val |= PLLE_MISC_LOCK_ENABLE;
|
||||
val |= PLLE_MISC_IDDQ_SW_CTRL;
|
||||
val &= ~PLLE_MISC_IDDQ_SW_VALUE;
|
||||
val |= PLLE_MISC_PLLE_PTS;
|
||||
val |= PLLE_MISC_VREG_BG_CTRL_MASK | PLLE_MISC_VREG_CTRL_MASK;
|
||||
val &= ~(PLLE_MISC_VREG_BG_CTRL_MASK | PLLE_MISC_VREG_CTRL_MASK);
|
||||
pll_writel_misc(val, pll);
|
||||
udelay(5);
|
||||
|
||||
@ -2067,7 +2071,7 @@ static int clk_plle_tegra210_enable(struct clk_hw *hw)
|
||||
val = pll_readl(PLLE_SS_CTRL, pll);
|
||||
val &= ~(PLLE_SS_CNTL_CENTER | PLLE_SS_CNTL_INVERT);
|
||||
val &= ~PLLE_SS_COEFFICIENTS_MASK;
|
||||
val |= PLLE_SS_COEFFICIENTS_VAL;
|
||||
val |= PLLE_SS_COEFFICIENTS_VAL_TEGRA210;
|
||||
pll_writel(val, PLLE_SS_CTRL, pll);
|
||||
val &= ~(PLLE_SS_CNTL_SSC_BYP | PLLE_SS_CNTL_BYPASS_SS);
|
||||
pll_writel(val, PLLE_SS_CTRL, pll);
|
||||
@ -2104,15 +2108,25 @@ static void clk_plle_tegra210_disable(struct clk_hw *hw)
|
||||
if (pll->lock)
|
||||
spin_lock_irqsave(pll->lock, flags);
|
||||
|
||||
/* If PLLE HW sequencer is enabled, SW should not disable PLLE */
|
||||
val = pll_readl(pll->params->aux_reg, pll);
|
||||
if (val & PLLE_AUX_SEQ_ENABLE)
|
||||
goto out;
|
||||
|
||||
val = pll_readl_base(pll);
|
||||
val &= ~PLLE_BASE_ENABLE;
|
||||
pll_writel_base(val, pll);
|
||||
|
||||
val = pll_readl(pll->params->aux_reg, pll);
|
||||
val |= PLLE_AUX_ENABLE_SWCTL | PLLE_AUX_SS_SWCTL;
|
||||
pll_writel(val, pll->params->aux_reg, pll);
|
||||
|
||||
val = pll_readl_misc(pll);
|
||||
val |= PLLE_MISC_IDDQ_SW_CTRL | PLLE_MISC_IDDQ_SW_VALUE;
|
||||
pll_writel_misc(val, pll);
|
||||
udelay(1);
|
||||
|
||||
out:
|
||||
if (pll->lock)
|
||||
spin_unlock_irqrestore(pll->lock, flags);
|
||||
}
|
||||
|
@ -773,7 +773,7 @@ static struct tegra_periph_init_data periph_clks[] = {
|
||||
XUSB("xusb_dev_src", mux_clkm_pllp_pllc_pllre, CLK_SOURCE_XUSB_DEV_SRC, 95, TEGRA_PERIPH_ON_APB | TEGRA_PERIPH_NO_RESET, tegra_clk_xusb_dev_src),
|
||||
XUSB("xusb_dev_src", mux_clkm_pllp_pllre, CLK_SOURCE_XUSB_DEV_SRC, 95, TEGRA_PERIPH_ON_APB | TEGRA_PERIPH_NO_RESET, tegra_clk_xusb_dev_src_8),
|
||||
MUX8("dbgapb", mux_pllp_clkm_2, CLK_SOURCE_DBGAPB, 185, TEGRA_PERIPH_NO_RESET, tegra_clk_dbgapb),
|
||||
MUX8("msenc", mux_pllc2_c_c3_pllp_plla1_clkm, CLK_SOURCE_NVENC, 219, 0, tegra_clk_nvenc),
|
||||
MUX8("nvenc", mux_pllc2_c_c3_pllp_plla1_clkm, CLK_SOURCE_NVENC, 219, 0, tegra_clk_nvenc),
|
||||
MUX8("nvdec", mux_pllc2_c_c3_pllp_plla1_clkm, CLK_SOURCE_NVDEC, 194, 0, tegra_clk_nvdec),
|
||||
MUX8("nvjpg", mux_pllc2_c_c3_pllp_plla1_clkm, CLK_SOURCE_NVJPG, 195, 0, tegra_clk_nvjpg),
|
||||
MUX8("ape", mux_plla_pllc4_out0_pllc_pllc4_out1_pllp_pllc4_out2_clkm, CLK_SOURCE_APE, 198, TEGRA_PERIPH_ON_APB, tegra_clk_ape),
|
||||
@ -782,7 +782,7 @@ static struct tegra_periph_init_data periph_clks[] = {
|
||||
NODIV("sor1", mux_clkm_sor1_brick_sor1_src, CLK_SOURCE_SOR1, 15, MASK(1), 183, 0, tegra_clk_sor1, &sor1_lock),
|
||||
MUX8("sdmmc_legacy", mux_pllp_out3_clkm_pllp_pllc4, CLK_SOURCE_SDMMC_LEGACY, 193, TEGRA_PERIPH_ON_APB | TEGRA_PERIPH_NO_RESET, tegra_clk_sdmmc_legacy),
|
||||
MUX8("qspi", mux_pllp_pllc_pllc_out1_pllc4_out2_pllc4_out1_clkm_pllc4_out0, CLK_SOURCE_QSPI, 211, TEGRA_PERIPH_ON_APB, tegra_clk_qspi),
|
||||
MUX("vii2c", mux_pllp_pllc_clkm, CLK_SOURCE_VI_I2C, 208, TEGRA_PERIPH_ON_APB, tegra_clk_vi_i2c),
|
||||
I2C("vii2c", mux_pllp_pllc_clkm, CLK_SOURCE_VI_I2C, 208, tegra_clk_vi_i2c),
|
||||
MUX("mipibif", mux_pllp_clkm, CLK_SOURCE_MIPIBIF, 173, TEGRA_PERIPH_ON_APB, tegra_clk_mipibif),
|
||||
MUX("uartape", mux_pllp_pllc_clkm, CLK_SOURCE_UARTAPE, 212, TEGRA_PERIPH_ON_APB | TEGRA_PERIPH_NO_RESET, tegra_clk_uartape),
|
||||
MUX8("tsecb", mux_pllp_pllc2_c_c3_clkm, CLK_SOURCE_TSECB, 206, 0, tegra_clk_tsecb),
|
||||
@ -829,6 +829,7 @@ static struct tegra_periph_init_data gate_clks[] = {
|
||||
GATE("xusb_gate", "osc", 143, 0, tegra_clk_xusb_gate, 0),
|
||||
GATE("pll_p_out_cpu", "pll_p", 223, 0, tegra_clk_pll_p_out_cpu, 0),
|
||||
GATE("pll_p_out_adsp", "pll_p", 187, 0, tegra_clk_pll_p_out_adsp, 0),
|
||||
GATE("apb2ape", "clk_m", 107, 0, tegra_clk_apb2ape, 0),
|
||||
};
|
||||
|
||||
static struct tegra_periph_init_data div_clks[] = {
|
||||
|
@ -67,7 +67,7 @@ static const char *cclk_lp_parents[] = { "clk_m", "pll_c", "clk_32k", "pll_m",
|
||||
"pll_p", "pll_p_out4", "unused",
|
||||
"unused", "pll_x", "pll_x_out0" };
|
||||
|
||||
const struct tegra_super_gen_info tegra_super_gen_info_gen4 = {
|
||||
static const struct tegra_super_gen_info tegra_super_gen_info_gen4 = {
|
||||
.gen = gen4,
|
||||
.sclk_parents = sclk_parents,
|
||||
.cclk_g_parents = cclk_g_parents,
|
||||
@ -93,7 +93,7 @@ static const char *cclk_lp_parents_gen5[] = { "clk_m", "unused", "clk_32k", "unu
|
||||
"unused", "unused", "unused", "unused",
|
||||
"dfllCPU_out" };
|
||||
|
||||
const struct tegra_super_gen_info tegra_super_gen_info_gen5 = {
|
||||
static const struct tegra_super_gen_info tegra_super_gen_info_gen5 = {
|
||||
.gen = gen5,
|
||||
.sclk_parents = sclk_parents_gen5,
|
||||
.cclk_g_parents = cclk_g_parents_gen5,
|
||||
@ -171,7 +171,7 @@ static void __init tegra_sclk_init(void __iomem *clk_base,
|
||||
*dt_clk = clk;
|
||||
}
|
||||
|
||||
void __init tegra_super_clk_init(void __iomem *clk_base,
|
||||
static void __init tegra_super_clk_init(void __iomem *clk_base,
|
||||
void __iomem *pmc_base,
|
||||
struct tegra_clk *tegra_clks,
|
||||
struct tegra_clk_pll_params *params,
|
||||
|
@ -59,8 +59,8 @@
|
||||
#define PLLC3_MISC3 0x50c
|
||||
|
||||
#define PLLM_BASE 0x90
|
||||
#define PLLM_MISC0 0x9c
|
||||
#define PLLM_MISC1 0x98
|
||||
#define PLLM_MISC2 0x9c
|
||||
#define PLLP_BASE 0xa0
|
||||
#define PLLP_MISC0 0xac
|
||||
#define PLLP_MISC1 0x680
|
||||
@ -99,7 +99,7 @@
|
||||
#define PLLC4_MISC0 0x5a8
|
||||
#define PLLC4_OUT 0x5e4
|
||||
#define PLLMB_BASE 0x5e8
|
||||
#define PLLMB_MISC0 0x5ec
|
||||
#define PLLMB_MISC1 0x5ec
|
||||
#define PLLA1_BASE 0x6a4
|
||||
#define PLLA1_MISC0 0x6a8
|
||||
#define PLLA1_MISC1 0x6ac
|
||||
@ -243,7 +243,8 @@ static unsigned long tegra210_input_freq[] = {
|
||||
};
|
||||
|
||||
static const char *mux_pllmcp_clkm[] = {
|
||||
"pll_m", "pll_c", "pll_p", "clk_m", "pll_m_ud", "pll_c2", "pll_c3",
|
||||
"pll_m", "pll_c", "pll_p", "clk_m", "pll_m_ud", "pll_mb", "pll_mb",
|
||||
"pll_p",
|
||||
};
|
||||
#define mux_pllmcp_clkm_idx NULL
|
||||
|
||||
@ -367,12 +368,12 @@ static const char *mux_pllmcp_clkm[] = {
|
||||
/* PLLMB */
|
||||
#define PLLMB_BASE_LOCK (1 << 27)
|
||||
|
||||
#define PLLMB_MISC0_LOCK_OVERRIDE (1 << 18)
|
||||
#define PLLMB_MISC0_IDDQ (1 << 17)
|
||||
#define PLLMB_MISC0_LOCK_ENABLE (1 << 16)
|
||||
#define PLLMB_MISC1_LOCK_OVERRIDE (1 << 18)
|
||||
#define PLLMB_MISC1_IDDQ (1 << 17)
|
||||
#define PLLMB_MISC1_LOCK_ENABLE (1 << 16)
|
||||
|
||||
#define PLLMB_MISC0_DEFAULT_VALUE 0x00030000
|
||||
#define PLLMB_MISC0_WRITE_MASK 0x0007ffff
|
||||
#define PLLMB_MISC1_DEFAULT_VALUE 0x00030000
|
||||
#define PLLMB_MISC1_WRITE_MASK 0x0007ffff
|
||||
|
||||
/* PLLP */
|
||||
#define PLLP_BASE_OVERRIDE (1 << 28)
|
||||
@ -457,7 +458,8 @@ static void pllcx_check_defaults(struct tegra_clk_pll_params *params)
|
||||
PLLCX_MISC3_WRITE_MASK);
|
||||
}
|
||||
|
||||
void tegra210_pllcx_set_defaults(const char *name, struct tegra_clk_pll *pllcx)
|
||||
static void tegra210_pllcx_set_defaults(const char *name,
|
||||
struct tegra_clk_pll *pllcx)
|
||||
{
|
||||
pllcx->params->defaults_set = true;
|
||||
|
||||
@ -482,22 +484,22 @@ void tegra210_pllcx_set_defaults(const char *name, struct tegra_clk_pll *pllcx)
|
||||
udelay(1);
|
||||
}
|
||||
|
||||
void _pllc_set_defaults(struct tegra_clk_pll *pllcx)
|
||||
static void _pllc_set_defaults(struct tegra_clk_pll *pllcx)
|
||||
{
|
||||
tegra210_pllcx_set_defaults("PLL_C", pllcx);
|
||||
}
|
||||
|
||||
void _pllc2_set_defaults(struct tegra_clk_pll *pllcx)
|
||||
static void _pllc2_set_defaults(struct tegra_clk_pll *pllcx)
|
||||
{
|
||||
tegra210_pllcx_set_defaults("PLL_C2", pllcx);
|
||||
}
|
||||
|
||||
void _pllc3_set_defaults(struct tegra_clk_pll *pllcx)
|
||||
static void _pllc3_set_defaults(struct tegra_clk_pll *pllcx)
|
||||
{
|
||||
tegra210_pllcx_set_defaults("PLL_C3", pllcx);
|
||||
}
|
||||
|
||||
void _plla1_set_defaults(struct tegra_clk_pll *pllcx)
|
||||
static void _plla1_set_defaults(struct tegra_clk_pll *pllcx)
|
||||
{
|
||||
tegra210_pllcx_set_defaults("PLL_A1", pllcx);
|
||||
}
|
||||
@ -507,7 +509,7 @@ void _plla1_set_defaults(struct tegra_clk_pll *pllcx)
|
||||
* PLL with dynamic ramp and fractional SDM. Dynamic ramp is not used.
|
||||
* Fractional SDM is allowed to provide exact audio rates.
|
||||
*/
|
||||
void tegra210_plla_set_defaults(struct tegra_clk_pll *plla)
|
||||
static void tegra210_plla_set_defaults(struct tegra_clk_pll *plla)
|
||||
{
|
||||
u32 mask;
|
||||
u32 val = readl_relaxed(clk_base + plla->params->base_reg);
|
||||
@ -559,7 +561,7 @@ void tegra210_plla_set_defaults(struct tegra_clk_pll *plla)
|
||||
* PLLD
|
||||
* PLL with fractional SDM.
|
||||
*/
|
||||
void tegra210_plld_set_defaults(struct tegra_clk_pll *plld)
|
||||
static void tegra210_plld_set_defaults(struct tegra_clk_pll *plld)
|
||||
{
|
||||
u32 val;
|
||||
u32 mask = 0xffff;
|
||||
@ -698,7 +700,7 @@ static void plldss_defaults(const char *pll_name, struct tegra_clk_pll *plldss,
|
||||
udelay(1);
|
||||
}
|
||||
|
||||
void tegra210_plld2_set_defaults(struct tegra_clk_pll *plld2)
|
||||
static void tegra210_plld2_set_defaults(struct tegra_clk_pll *plld2)
|
||||
{
|
||||
plldss_defaults("PLL_D2", plld2, PLLD2_MISC0_DEFAULT_VALUE,
|
||||
PLLD2_MISC1_CFG_DEFAULT_VALUE,
|
||||
@ -706,7 +708,7 @@ void tegra210_plld2_set_defaults(struct tegra_clk_pll *plld2)
|
||||
PLLD2_MISC3_CTRL2_DEFAULT_VALUE);
|
||||
}
|
||||
|
||||
void tegra210_plldp_set_defaults(struct tegra_clk_pll *plldp)
|
||||
static void tegra210_plldp_set_defaults(struct tegra_clk_pll *plldp)
|
||||
{
|
||||
plldss_defaults("PLL_DP", plldp, PLLDP_MISC0_DEFAULT_VALUE,
|
||||
PLLDP_MISC1_CFG_DEFAULT_VALUE,
|
||||
@ -719,7 +721,7 @@ void tegra210_plldp_set_defaults(struct tegra_clk_pll *plldp)
|
||||
* Base and misc0 layout is the same as PLLD2/PLLDP, but no SDM/SSC support.
|
||||
* VCO is exposed to the clock tree via fixed 1/3 and 1/5 dividers.
|
||||
*/
|
||||
void tegra210_pllc4_set_defaults(struct tegra_clk_pll *pllc4)
|
||||
static void tegra210_pllc4_set_defaults(struct tegra_clk_pll *pllc4)
|
||||
{
|
||||
plldss_defaults("PLL_C4", pllc4, PLLC4_MISC0_DEFAULT_VALUE, 0, 0, 0);
|
||||
}
|
||||
@ -728,7 +730,7 @@ void tegra210_pllc4_set_defaults(struct tegra_clk_pll *pllc4)
|
||||
* PLLRE
|
||||
* VCO is exposed to the clock tree directly along with post-divider output
|
||||
*/
|
||||
void tegra210_pllre_set_defaults(struct tegra_clk_pll *pllre)
|
||||
static void tegra210_pllre_set_defaults(struct tegra_clk_pll *pllre)
|
||||
{
|
||||
u32 mask;
|
||||
u32 val = readl_relaxed(clk_base + pllre->params->base_reg);
|
||||
@ -780,13 +782,13 @@ static void pllx_get_dyn_steps(struct clk_hw *hw, u32 *step_a, u32 *step_b)
|
||||
{
|
||||
unsigned long input_rate;
|
||||
|
||||
if (!IS_ERR_OR_NULL(hw->clk)) {
|
||||
/* cf rate */
|
||||
if (!IS_ERR_OR_NULL(hw->clk))
|
||||
input_rate = clk_hw_get_rate(clk_hw_get_parent(hw));
|
||||
/* cf rate */
|
||||
input_rate /= tegra_pll_get_fixed_mdiv(hw, input_rate);
|
||||
} else {
|
||||
else
|
||||
input_rate = 38400000;
|
||||
}
|
||||
|
||||
input_rate /= tegra_pll_get_fixed_mdiv(hw, input_rate);
|
||||
|
||||
switch (input_rate) {
|
||||
case 12000000:
|
||||
@ -841,7 +843,7 @@ static void pllx_check_defaults(struct tegra_clk_pll *pll)
|
||||
PLLX_MISC5_WRITE_MASK);
|
||||
}
|
||||
|
||||
void tegra210_pllx_set_defaults(struct tegra_clk_pll *pllx)
|
||||
static void tegra210_pllx_set_defaults(struct tegra_clk_pll *pllx)
|
||||
{
|
||||
u32 val;
|
||||
u32 step_a, step_b;
|
||||
@ -901,7 +903,7 @@ void tegra210_pllx_set_defaults(struct tegra_clk_pll *pllx)
|
||||
}
|
||||
|
||||
/* PLLMB */
|
||||
void tegra210_pllmb_set_defaults(struct tegra_clk_pll *pllmb)
|
||||
static void tegra210_pllmb_set_defaults(struct tegra_clk_pll *pllmb)
|
||||
{
|
||||
u32 mask, val = readl_relaxed(clk_base + pllmb->params->base_reg);
|
||||
|
||||
@ -914,15 +916,15 @@ void tegra210_pllmb_set_defaults(struct tegra_clk_pll *pllmb)
|
||||
* PLL is ON: check if defaults already set, then set those
|
||||
* that can be updated in flight.
|
||||
*/
|
||||
val = PLLMB_MISC0_DEFAULT_VALUE & (~PLLMB_MISC0_IDDQ);
|
||||
mask = PLLMB_MISC0_LOCK_ENABLE | PLLMB_MISC0_LOCK_OVERRIDE;
|
||||
val = PLLMB_MISC1_DEFAULT_VALUE & (~PLLMB_MISC1_IDDQ);
|
||||
mask = PLLMB_MISC1_LOCK_ENABLE | PLLMB_MISC1_LOCK_OVERRIDE;
|
||||
_pll_misc_chk_default(clk_base, pllmb->params, 0, val,
|
||||
~mask & PLLMB_MISC0_WRITE_MASK);
|
||||
~mask & PLLMB_MISC1_WRITE_MASK);
|
||||
|
||||
/* Enable lock detect */
|
||||
val = readl_relaxed(clk_base + pllmb->params->ext_misc_reg[0]);
|
||||
val &= ~mask;
|
||||
val |= PLLMB_MISC0_DEFAULT_VALUE & mask;
|
||||
val |= PLLMB_MISC1_DEFAULT_VALUE & mask;
|
||||
writel_relaxed(val, clk_base + pllmb->params->ext_misc_reg[0]);
|
||||
udelay(1);
|
||||
|
||||
@ -930,7 +932,7 @@ void tegra210_pllmb_set_defaults(struct tegra_clk_pll *pllmb)
|
||||
}
|
||||
|
||||
/* set IDDQ, enable lock detect */
|
||||
writel_relaxed(PLLMB_MISC0_DEFAULT_VALUE,
|
||||
writel_relaxed(PLLMB_MISC1_DEFAULT_VALUE,
|
||||
clk_base + pllmb->params->ext_misc_reg[0]);
|
||||
udelay(1);
|
||||
}
|
||||
@ -960,7 +962,7 @@ static void pllp_check_defaults(struct tegra_clk_pll *pll, bool enabled)
|
||||
~mask & PLLP_MISC1_WRITE_MASK);
|
||||
}
|
||||
|
||||
void tegra210_pllp_set_defaults(struct tegra_clk_pll *pllp)
|
||||
static void tegra210_pllp_set_defaults(struct tegra_clk_pll *pllp)
|
||||
{
|
||||
u32 mask;
|
||||
u32 val = readl_relaxed(clk_base + pllp->params->base_reg);
|
||||
@ -1022,7 +1024,7 @@ static void pllu_check_defaults(struct tegra_clk_pll *pll, bool hw_control)
|
||||
~mask & PLLU_MISC1_WRITE_MASK);
|
||||
}
|
||||
|
||||
void tegra210_pllu_set_defaults(struct tegra_clk_pll *pllu)
|
||||
static void tegra210_pllu_set_defaults(struct tegra_clk_pll *pllu)
|
||||
{
|
||||
u32 val = readl_relaxed(clk_base + pllu->params->base_reg);
|
||||
|
||||
@ -1212,8 +1214,9 @@ static void tegra210_clk_pll_set_gain(struct tegra_clk_pll_freq_table *cfg)
|
||||
cfg->m *= PLL_SDM_COEFF;
|
||||
}
|
||||
|
||||
unsigned long tegra210_clk_adjust_vco_min(struct tegra_clk_pll_params *params,
|
||||
unsigned long parent_rate)
|
||||
static unsigned long
|
||||
tegra210_clk_adjust_vco_min(struct tegra_clk_pll_params *params,
|
||||
unsigned long parent_rate)
|
||||
{
|
||||
unsigned long vco_min = params->vco_min;
|
||||
|
||||
@ -1386,7 +1389,7 @@ static struct tegra_clk_pll_params pll_c_params = {
|
||||
.mdiv_default = 3,
|
||||
.div_nmp = &pllc_nmp,
|
||||
.freq_table = pll_cx_freq_table,
|
||||
.flags = TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE,
|
||||
.flags = TEGRA_PLL_USE_LOCK,
|
||||
.set_defaults = _pllc_set_defaults,
|
||||
.calc_rate = tegra210_pll_fixed_mdiv_cfg,
|
||||
};
|
||||
@ -1425,7 +1428,7 @@ static struct tegra_clk_pll_params pll_c2_params = {
|
||||
.ext_misc_reg[2] = PLLC2_MISC2,
|
||||
.ext_misc_reg[3] = PLLC2_MISC3,
|
||||
.freq_table = pll_cx_freq_table,
|
||||
.flags = TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE,
|
||||
.flags = TEGRA_PLL_USE_LOCK,
|
||||
.set_defaults = _pllc2_set_defaults,
|
||||
.calc_rate = tegra210_pll_fixed_mdiv_cfg,
|
||||
};
|
||||
@ -1455,7 +1458,7 @@ static struct tegra_clk_pll_params pll_c3_params = {
|
||||
.ext_misc_reg[2] = PLLC3_MISC2,
|
||||
.ext_misc_reg[3] = PLLC3_MISC3,
|
||||
.freq_table = pll_cx_freq_table,
|
||||
.flags = TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE,
|
||||
.flags = TEGRA_PLL_USE_LOCK,
|
||||
.set_defaults = _pllc3_set_defaults,
|
||||
.calc_rate = tegra210_pll_fixed_mdiv_cfg,
|
||||
};
|
||||
@ -1505,7 +1508,6 @@ static struct tegra_clk_pll_params pll_c4_vco_params = {
|
||||
.base_reg = PLLC4_BASE,
|
||||
.misc_reg = PLLC4_MISC0,
|
||||
.lock_mask = PLL_BASE_LOCK,
|
||||
.lock_enable_bit_idx = PLLSS_MISC_LOCK_ENABLE,
|
||||
.lock_delay = 300,
|
||||
.max_p = PLL_QLIN_PDIV_MAX,
|
||||
.ext_misc_reg[0] = PLLC4_MISC0,
|
||||
@ -1517,8 +1519,7 @@ static struct tegra_clk_pll_params pll_c4_vco_params = {
|
||||
.div_nmp = &pllss_nmp,
|
||||
.freq_table = pll_c4_vco_freq_table,
|
||||
.set_defaults = tegra210_pllc4_set_defaults,
|
||||
.flags = TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE |
|
||||
TEGRA_PLL_VCO_OUT,
|
||||
.flags = TEGRA_PLL_USE_LOCK | TEGRA_PLL_VCO_OUT,
|
||||
.calc_rate = tegra210_pll_fixed_mdiv_cfg,
|
||||
};
|
||||
|
||||
@ -1559,15 +1560,15 @@ static struct tegra_clk_pll_params pll_m_params = {
|
||||
.vco_min = 800000000,
|
||||
.vco_max = 1866000000,
|
||||
.base_reg = PLLM_BASE,
|
||||
.misc_reg = PLLM_MISC1,
|
||||
.misc_reg = PLLM_MISC2,
|
||||
.lock_mask = PLL_BASE_LOCK,
|
||||
.lock_enable_bit_idx = PLLM_MISC_LOCK_ENABLE,
|
||||
.lock_delay = 300,
|
||||
.iddq_reg = PLLM_MISC0,
|
||||
.iddq_reg = PLLM_MISC2,
|
||||
.iddq_bit_idx = PLLM_IDDQ_BIT,
|
||||
.max_p = PLL_QLIN_PDIV_MAX,
|
||||
.ext_misc_reg[0] = PLLM_MISC0,
|
||||
.ext_misc_reg[0] = PLLM_MISC1,
|
||||
.ext_misc_reg[0] = PLLM_MISC2,
|
||||
.ext_misc_reg[1] = PLLM_MISC1,
|
||||
.round_p_to_pdiv = pll_qlin_p_to_pdiv,
|
||||
.pdiv_tohw = pll_qlin_pdiv_to_hw,
|
||||
.div_nmp = &pllm_nmp,
|
||||
@ -1586,19 +1587,18 @@ static struct tegra_clk_pll_params pll_mb_params = {
|
||||
.vco_min = 800000000,
|
||||
.vco_max = 1866000000,
|
||||
.base_reg = PLLMB_BASE,
|
||||
.misc_reg = PLLMB_MISC0,
|
||||
.misc_reg = PLLMB_MISC1,
|
||||
.lock_mask = PLL_BASE_LOCK,
|
||||
.lock_enable_bit_idx = PLLMB_MISC_LOCK_ENABLE,
|
||||
.lock_delay = 300,
|
||||
.iddq_reg = PLLMB_MISC0,
|
||||
.iddq_reg = PLLMB_MISC1,
|
||||
.iddq_bit_idx = PLLMB_IDDQ_BIT,
|
||||
.max_p = PLL_QLIN_PDIV_MAX,
|
||||
.ext_misc_reg[0] = PLLMB_MISC0,
|
||||
.ext_misc_reg[0] = PLLMB_MISC1,
|
||||
.round_p_to_pdiv = pll_qlin_p_to_pdiv,
|
||||
.pdiv_tohw = pll_qlin_pdiv_to_hw,
|
||||
.div_nmp = &pllm_nmp,
|
||||
.freq_table = pll_m_freq_table,
|
||||
.flags = TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE,
|
||||
.flags = TEGRA_PLL_USE_LOCK,
|
||||
.set_defaults = tegra210_pllmb_set_defaults,
|
||||
.calc_rate = tegra210_pll_fixed_mdiv_cfg,
|
||||
};
|
||||
@ -1671,7 +1671,6 @@ static struct tegra_clk_pll_params pll_re_vco_params = {
|
||||
.base_reg = PLLRE_BASE,
|
||||
.misc_reg = PLLRE_MISC0,
|
||||
.lock_mask = PLLRE_MISC_LOCK,
|
||||
.lock_enable_bit_idx = PLLRE_MISC_LOCK_ENABLE,
|
||||
.lock_delay = 300,
|
||||
.max_p = PLL_QLIN_PDIV_MAX,
|
||||
.ext_misc_reg[0] = PLLRE_MISC0,
|
||||
@ -1681,8 +1680,7 @@ static struct tegra_clk_pll_params pll_re_vco_params = {
|
||||
.pdiv_tohw = pll_qlin_pdiv_to_hw,
|
||||
.div_nmp = &pllre_nmp,
|
||||
.freq_table = pll_re_vco_freq_table,
|
||||
.flags = TEGRA_PLL_USE_LOCK | TEGRA_PLL_LOCK_MISC |
|
||||
TEGRA_PLL_HAS_LOCK_ENABLE | TEGRA_PLL_VCO_OUT,
|
||||
.flags = TEGRA_PLL_USE_LOCK | TEGRA_PLL_LOCK_MISC | TEGRA_PLL_VCO_OUT,
|
||||
.set_defaults = tegra210_pllre_set_defaults,
|
||||
.calc_rate = tegra210_pll_fixed_mdiv_cfg,
|
||||
};
|
||||
@ -1712,7 +1710,6 @@ static struct tegra_clk_pll_params pll_p_params = {
|
||||
.base_reg = PLLP_BASE,
|
||||
.misc_reg = PLLP_MISC0,
|
||||
.lock_mask = PLL_BASE_LOCK,
|
||||
.lock_enable_bit_idx = PLLP_MISC_LOCK_ENABLE,
|
||||
.lock_delay = 300,
|
||||
.iddq_reg = PLLP_MISC0,
|
||||
.iddq_bit_idx = PLLXP_IDDQ_BIT,
|
||||
@ -1721,8 +1718,7 @@ static struct tegra_clk_pll_params pll_p_params = {
|
||||
.div_nmp = &pllp_nmp,
|
||||
.freq_table = pll_p_freq_table,
|
||||
.fixed_rate = 408000000,
|
||||
.flags = TEGRA_PLL_FIXED | TEGRA_PLL_USE_LOCK |
|
||||
TEGRA_PLL_HAS_LOCK_ENABLE | TEGRA_PLL_VCO_OUT,
|
||||
.flags = TEGRA_PLL_FIXED | TEGRA_PLL_USE_LOCK | TEGRA_PLL_VCO_OUT,
|
||||
.set_defaults = tegra210_pllp_set_defaults,
|
||||
.calc_rate = tegra210_pll_fixed_mdiv_cfg,
|
||||
};
|
||||
@ -1750,7 +1746,7 @@ static struct tegra_clk_pll_params pll_a1_params = {
|
||||
.ext_misc_reg[2] = PLLA1_MISC2,
|
||||
.ext_misc_reg[3] = PLLA1_MISC3,
|
||||
.freq_table = pll_cx_freq_table,
|
||||
.flags = TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE,
|
||||
.flags = TEGRA_PLL_USE_LOCK,
|
||||
.set_defaults = _plla1_set_defaults,
|
||||
.calc_rate = tegra210_pll_fixed_mdiv_cfg,
|
||||
};
|
||||
@ -1787,7 +1783,6 @@ static struct tegra_clk_pll_params pll_a_params = {
|
||||
.base_reg = PLLA_BASE,
|
||||
.misc_reg = PLLA_MISC0,
|
||||
.lock_mask = PLL_BASE_LOCK,
|
||||
.lock_enable_bit_idx = PLLA_MISC_LOCK_ENABLE,
|
||||
.lock_delay = 300,
|
||||
.round_p_to_pdiv = pll_qlin_p_to_pdiv,
|
||||
.pdiv_tohw = pll_qlin_pdiv_to_hw,
|
||||
@ -1802,8 +1797,7 @@ static struct tegra_clk_pll_params pll_a_params = {
|
||||
.ext_misc_reg[1] = PLLA_MISC1,
|
||||
.ext_misc_reg[2] = PLLA_MISC2,
|
||||
.freq_table = pll_a_freq_table,
|
||||
.flags = TEGRA_PLL_USE_LOCK | TEGRA_MDIV_NEW |
|
||||
TEGRA_PLL_HAS_LOCK_ENABLE,
|
||||
.flags = TEGRA_PLL_USE_LOCK | TEGRA_MDIV_NEW,
|
||||
.set_defaults = tegra210_plla_set_defaults,
|
||||
.calc_rate = tegra210_pll_fixed_mdiv_cfg,
|
||||
.set_gain = tegra210_clk_pll_set_gain,
|
||||
@ -1836,7 +1830,6 @@ static struct tegra_clk_pll_params pll_d_params = {
|
||||
.base_reg = PLLD_BASE,
|
||||
.misc_reg = PLLD_MISC0,
|
||||
.lock_mask = PLL_BASE_LOCK,
|
||||
.lock_enable_bit_idx = PLLD_MISC_LOCK_ENABLE,
|
||||
.lock_delay = 1000,
|
||||
.iddq_reg = PLLD_MISC0,
|
||||
.iddq_bit_idx = PLLD_IDDQ_BIT,
|
||||
@ -1850,7 +1843,7 @@ static struct tegra_clk_pll_params pll_d_params = {
|
||||
.ext_misc_reg[0] = PLLD_MISC0,
|
||||
.ext_misc_reg[1] = PLLD_MISC1,
|
||||
.freq_table = pll_d_freq_table,
|
||||
.flags = TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE,
|
||||
.flags = TEGRA_PLL_USE_LOCK,
|
||||
.mdiv_default = 1,
|
||||
.set_defaults = tegra210_plld_set_defaults,
|
||||
.calc_rate = tegra210_pll_fixed_mdiv_cfg,
|
||||
@ -1876,7 +1869,6 @@ static struct tegra_clk_pll_params pll_d2_params = {
|
||||
.base_reg = PLLD2_BASE,
|
||||
.misc_reg = PLLD2_MISC0,
|
||||
.lock_mask = PLL_BASE_LOCK,
|
||||
.lock_enable_bit_idx = PLLSS_MISC_LOCK_ENABLE,
|
||||
.lock_delay = 300,
|
||||
.iddq_reg = PLLD2_BASE,
|
||||
.iddq_bit_idx = PLLSS_IDDQ_BIT,
|
||||
@ -1897,7 +1889,7 @@ static struct tegra_clk_pll_params pll_d2_params = {
|
||||
.mdiv_default = 1,
|
||||
.freq_table = tegra210_pll_d2_freq_table,
|
||||
.set_defaults = tegra210_plld2_set_defaults,
|
||||
.flags = TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE,
|
||||
.flags = TEGRA_PLL_USE_LOCK,
|
||||
.calc_rate = tegra210_pll_fixed_mdiv_cfg,
|
||||
.set_gain = tegra210_clk_pll_set_gain,
|
||||
.adjust_vco = tegra210_clk_adjust_vco_min,
|
||||
@ -1920,7 +1912,6 @@ static struct tegra_clk_pll_params pll_dp_params = {
|
||||
.base_reg = PLLDP_BASE,
|
||||
.misc_reg = PLLDP_MISC,
|
||||
.lock_mask = PLL_BASE_LOCK,
|
||||
.lock_enable_bit_idx = PLLSS_MISC_LOCK_ENABLE,
|
||||
.lock_delay = 300,
|
||||
.iddq_reg = PLLDP_BASE,
|
||||
.iddq_bit_idx = PLLSS_IDDQ_BIT,
|
||||
@ -1941,7 +1932,7 @@ static struct tegra_clk_pll_params pll_dp_params = {
|
||||
.mdiv_default = 1,
|
||||
.freq_table = pll_dp_freq_table,
|
||||
.set_defaults = tegra210_plldp_set_defaults,
|
||||
.flags = TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE,
|
||||
.flags = TEGRA_PLL_USE_LOCK,
|
||||
.calc_rate = tegra210_pll_fixed_mdiv_cfg,
|
||||
.set_gain = tegra210_clk_pll_set_gain,
|
||||
.adjust_vco = tegra210_clk_adjust_vco_min,
|
||||
@ -1973,7 +1964,6 @@ static struct tegra_clk_pll_params pll_u_vco_params = {
|
||||
.base_reg = PLLU_BASE,
|
||||
.misc_reg = PLLU_MISC0,
|
||||
.lock_mask = PLL_BASE_LOCK,
|
||||
.lock_enable_bit_idx = PLLU_MISC_LOCK_ENABLE,
|
||||
.lock_delay = 1000,
|
||||
.iddq_reg = PLLU_MISC0,
|
||||
.iddq_bit_idx = PLLU_IDDQ_BIT,
|
||||
@ -1983,8 +1973,7 @@ static struct tegra_clk_pll_params pll_u_vco_params = {
|
||||
.pdiv_tohw = pll_qlin_pdiv_to_hw,
|
||||
.div_nmp = &pllu_nmp,
|
||||
.freq_table = pll_u_freq_table,
|
||||
.flags = TEGRA_PLLU | TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE |
|
||||
TEGRA_PLL_VCO_OUT,
|
||||
.flags = TEGRA_PLLU | TEGRA_PLL_USE_LOCK | TEGRA_PLL_VCO_OUT,
|
||||
.set_defaults = tegra210_pllu_set_defaults,
|
||||
.calc_rate = tegra210_pll_fixed_mdiv_cfg,
|
||||
};
|
||||
@ -2218,6 +2207,7 @@ static struct tegra_clk tegra210_clks[tegra_clk_max] __initdata = {
|
||||
[tegra_clk_pll_c4_out1] = { .dt_id = TEGRA210_CLK_PLL_C4_OUT1, .present = true },
|
||||
[tegra_clk_pll_c4_out2] = { .dt_id = TEGRA210_CLK_PLL_C4_OUT2, .present = true },
|
||||
[tegra_clk_pll_c4_out3] = { .dt_id = TEGRA210_CLK_PLL_C4_OUT3, .present = true },
|
||||
[tegra_clk_apb2ape] = { .dt_id = TEGRA210_CLK_APB2APE, .present = true },
|
||||
};
|
||||
|
||||
static struct tegra_devclk devclks[] __initdata = {
|
||||
@ -2519,7 +2509,7 @@ static void __init tegra210_pll_init(void __iomem *clk_base,
|
||||
|
||||
/* PLLU_VCO */
|
||||
val = readl(clk_base + pll_u_vco_params.base_reg);
|
||||
val &= ~BIT(24); /* disable PLLU_OVERRIDE */
|
||||
val &= ~PLLU_BASE_OVERRIDE; /* disable PLLU_OVERRIDE */
|
||||
writel(val, clk_base + pll_u_vco_params.base_reg);
|
||||
|
||||
clk = tegra_clk_register_pllre("pll_u_vco", "pll_ref", clk_base, pmc,
|
||||
@ -2738,8 +2728,6 @@ static struct tegra_clk_init_table init_table[] __initdata = {
|
||||
{ TEGRA210_CLK_DFLL_REF, TEGRA210_CLK_PLL_P, 51000000, 1 },
|
||||
{ TEGRA210_CLK_SBC4, TEGRA210_CLK_PLL_P, 12000000, 1 },
|
||||
{ TEGRA210_CLK_PLL_RE_VCO, TEGRA210_CLK_CLK_MAX, 672000000, 1 },
|
||||
{ TEGRA210_CLK_PLL_U_OUT1, TEGRA210_CLK_CLK_MAX, 48000000, 1 },
|
||||
{ TEGRA210_CLK_PLL_U_OUT2, TEGRA210_CLK_CLK_MAX, 60000000, 1 },
|
||||
{ TEGRA210_CLK_XUSB_GATE, TEGRA210_CLK_CLK_MAX, 0, 1 },
|
||||
{ TEGRA210_CLK_XUSB_SS_SRC, TEGRA210_CLK_PLL_U_480M, 120000000, 0 },
|
||||
{ TEGRA210_CLK_XUSB_FS_SRC, TEGRA210_CLK_PLL_U_48M, 48000000, 0 },
|
||||
|
@ -78,6 +78,9 @@ static int vco_set(struct clk_icst *icst, struct icst_vco vco)
|
||||
ret = regmap_read(icst->map, icst->vcoreg_off, &val);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Mask the 18 bits used by the VCO */
|
||||
val &= ~0x7ffff;
|
||||
val |= vco.v | (vco.r << 9) | (vco.s << 16);
|
||||
|
||||
/* This magic unlocks the VCO so it can be controlled */
|
||||
|
@ -156,7 +156,6 @@ static void dwc_initialize(struct dw_dma_chan *dwc)
|
||||
|
||||
/* Enable interrupts */
|
||||
channel_set_bit(dw, MASK.XFER, dwc->mask);
|
||||
channel_set_bit(dw, MASK.BLOCK, dwc->mask);
|
||||
channel_set_bit(dw, MASK.ERROR, dwc->mask);
|
||||
|
||||
dwc->initialized = true;
|
||||
@ -588,6 +587,9 @@ static void dwc_handle_cyclic(struct dw_dma *dw, struct dw_dma_chan *dwc,
|
||||
|
||||
spin_unlock_irqrestore(&dwc->lock, flags);
|
||||
}
|
||||
|
||||
/* Re-enable interrupts */
|
||||
channel_set_bit(dw, MASK.BLOCK, dwc->mask);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
@ -618,11 +620,8 @@ static void dw_dma_tasklet(unsigned long data)
|
||||
dwc_scan_descriptors(dw, dwc);
|
||||
}
|
||||
|
||||
/*
|
||||
* Re-enable interrupts.
|
||||
*/
|
||||
/* Re-enable interrupts */
|
||||
channel_set_bit(dw, MASK.XFER, dw->all_chan_mask);
|
||||
channel_set_bit(dw, MASK.BLOCK, dw->all_chan_mask);
|
||||
channel_set_bit(dw, MASK.ERROR, dw->all_chan_mask);
|
||||
}
|
||||
|
||||
@ -1261,6 +1260,7 @@ static void dwc_free_chan_resources(struct dma_chan *chan)
|
||||
int dw_dma_cyclic_start(struct dma_chan *chan)
|
||||
{
|
||||
struct dw_dma_chan *dwc = to_dw_dma_chan(chan);
|
||||
struct dw_dma *dw = to_dw_dma(chan->device);
|
||||
unsigned long flags;
|
||||
|
||||
if (!test_bit(DW_DMA_IS_CYCLIC, &dwc->flags)) {
|
||||
@ -1269,7 +1269,12 @@ int dw_dma_cyclic_start(struct dma_chan *chan)
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&dwc->lock, flags);
|
||||
|
||||
/* Enable interrupts to perform cyclic transfer */
|
||||
channel_set_bit(dw, MASK.BLOCK, dwc->mask);
|
||||
|
||||
dwc_dostart(dwc, dwc->cdesc->desc[0]);
|
||||
|
||||
spin_unlock_irqrestore(&dwc->lock, flags);
|
||||
|
||||
return 0;
|
||||
|
@ -108,6 +108,10 @@ static const struct pci_device_id dw_pci_id_table[] = {
|
||||
|
||||
/* Haswell */
|
||||
{ PCI_VDEVICE(INTEL, 0x9c60) },
|
||||
|
||||
/* Broadwell */
|
||||
{ PCI_VDEVICE(INTEL, 0x9ce0) },
|
||||
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, dw_pci_id_table);
|
||||
|
@ -113,6 +113,9 @@
|
||||
#define GET_NUM_REGN(x) ((x & 0x300000) >> 20) /* bits 20-21 */
|
||||
#define CHMAP_EXIST BIT(24)
|
||||
|
||||
/* CCSTAT register */
|
||||
#define EDMA_CCSTAT_ACTV BIT(4)
|
||||
|
||||
/*
|
||||
* Max of 20 segments per channel to conserve PaRAM slots
|
||||
* Also note that MAX_NR_SG should be atleast the no.of periods
|
||||
@ -1680,9 +1683,20 @@ static void edma_issue_pending(struct dma_chan *chan)
|
||||
spin_unlock_irqrestore(&echan->vchan.lock, flags);
|
||||
}
|
||||
|
||||
/*
|
||||
* This limit exists to avoid a possible infinite loop when waiting for proof
|
||||
* that a particular transfer is completed. This limit can be hit if there
|
||||
* are large bursts to/from slow devices or the CPU is never able to catch
|
||||
* the DMA hardware idle. On an AM335x transfering 48 bytes from the UART
|
||||
* RX-FIFO, as many as 55 loops have been seen.
|
||||
*/
|
||||
#define EDMA_MAX_TR_WAIT_LOOPS 1000
|
||||
|
||||
static u32 edma_residue(struct edma_desc *edesc)
|
||||
{
|
||||
bool dst = edesc->direction == DMA_DEV_TO_MEM;
|
||||
int loop_count = EDMA_MAX_TR_WAIT_LOOPS;
|
||||
struct edma_chan *echan = edesc->echan;
|
||||
struct edma_pset *pset = edesc->pset;
|
||||
dma_addr_t done, pos;
|
||||
int i;
|
||||
@ -1691,7 +1705,32 @@ static u32 edma_residue(struct edma_desc *edesc)
|
||||
* We always read the dst/src position from the first RamPar
|
||||
* pset. That's the one which is active now.
|
||||
*/
|
||||
pos = edma_get_position(edesc->echan->ecc, edesc->echan->slot[0], dst);
|
||||
pos = edma_get_position(echan->ecc, echan->slot[0], dst);
|
||||
|
||||
/*
|
||||
* "pos" may represent a transfer request that is still being
|
||||
* processed by the EDMACC or EDMATC. We will busy wait until
|
||||
* any one of the situations occurs:
|
||||
* 1. the DMA hardware is idle
|
||||
* 2. a new transfer request is setup
|
||||
* 3. we hit the loop limit
|
||||
*/
|
||||
while (edma_read(echan->ecc, EDMA_CCSTAT) & EDMA_CCSTAT_ACTV) {
|
||||
/* check if a new transfer request is setup */
|
||||
if (edma_get_position(echan->ecc,
|
||||
echan->slot[0], dst) != pos) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (!--loop_count) {
|
||||
dev_dbg_ratelimited(echan->vchan.chan.device->dev,
|
||||
"%s: timeout waiting for PaRAM update\n",
|
||||
__func__);
|
||||
break;
|
||||
}
|
||||
|
||||
cpu_relax();
|
||||
}
|
||||
|
||||
/*
|
||||
* Cyclic is simple. Just subtract pset[0].addr from pos.
|
||||
|
@ -861,32 +861,42 @@ void ioat_timer_event(unsigned long data)
|
||||
return;
|
||||
}
|
||||
|
||||
spin_lock_bh(&ioat_chan->cleanup_lock);
|
||||
|
||||
/* handle the no-actives case */
|
||||
if (!ioat_ring_active(ioat_chan)) {
|
||||
spin_lock_bh(&ioat_chan->prep_lock);
|
||||
check_active(ioat_chan);
|
||||
spin_unlock_bh(&ioat_chan->prep_lock);
|
||||
spin_unlock_bh(&ioat_chan->cleanup_lock);
|
||||
return;
|
||||
}
|
||||
|
||||
/* if we haven't made progress and we have already
|
||||
* acknowledged a pending completion once, then be more
|
||||
* forceful with a restart
|
||||
*/
|
||||
spin_lock_bh(&ioat_chan->cleanup_lock);
|
||||
if (ioat_cleanup_preamble(ioat_chan, &phys_complete))
|
||||
__cleanup(ioat_chan, phys_complete);
|
||||
else if (test_bit(IOAT_COMPLETION_ACK, &ioat_chan->state)) {
|
||||
u32 chanerr;
|
||||
|
||||
chanerr = readl(ioat_chan->reg_base + IOAT_CHANERR_OFFSET);
|
||||
dev_warn(to_dev(ioat_chan), "Restarting channel...\n");
|
||||
dev_warn(to_dev(ioat_chan), "CHANSTS: %#Lx CHANERR: %#x\n",
|
||||
status, chanerr);
|
||||
dev_warn(to_dev(ioat_chan), "Active descriptors: %d\n",
|
||||
ioat_ring_active(ioat_chan));
|
||||
|
||||
spin_lock_bh(&ioat_chan->prep_lock);
|
||||
ioat_restart_channel(ioat_chan);
|
||||
spin_unlock_bh(&ioat_chan->prep_lock);
|
||||
spin_unlock_bh(&ioat_chan->cleanup_lock);
|
||||
return;
|
||||
} else {
|
||||
} else
|
||||
set_bit(IOAT_COMPLETION_ACK, &ioat_chan->state);
|
||||
mod_timer(&ioat_chan->timer, jiffies + COMPLETION_TIMEOUT);
|
||||
}
|
||||
|
||||
|
||||
if (ioat_ring_active(ioat_chan))
|
||||
mod_timer(&ioat_chan->timer, jiffies + COMPLETION_TIMEOUT);
|
||||
else {
|
||||
spin_lock_bh(&ioat_chan->prep_lock);
|
||||
check_active(ioat_chan);
|
||||
spin_unlock_bh(&ioat_chan->prep_lock);
|
||||
}
|
||||
mod_timer(&ioat_chan->timer, jiffies + COMPLETION_TIMEOUT);
|
||||
spin_unlock_bh(&ioat_chan->cleanup_lock);
|
||||
}
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user